[
  {
    "path": ".chglog/CHANGELOG.gobot.md",
    "content": "# {{ .Info.Title }}\n\nPlease adjust manually before add content to CHANGELOG.md.\n\n{{ if .Versions -}}\n## [Unreleased]({{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD)\n\n{{ if .Unreleased.CommitGroups -}}\n{{ range .Unreleased.CommitGroups -}}\n### {{ .Title }}\n{{ range .Commits -}}\n* {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}\n{{ end }}\n{{ end -}}\n{{ end -}}\n{{ end -}}\n\n{{ range .Versions }}## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime \"2006-01-02\" .Tag.Date }})\n\n{{ range .CommitGroups -}}\n### {{ .Title }}\n\n{{ range .Commits -}}\n* {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}\n{{ end }}\n{{ end -}}\n\n{{- if .NoteGroups -}}\n{{ range .NoteGroups -}}\n### {{ .Title }}\n\n{{ range .Notes }}\n{{ .Body }}\n{{ end }}\n{{ end -}}\n{{ end -}}\n{{ end -}}"
  },
  {
    "path": ".chglog/README.md",
    "content": "# Creating a changelog automatically\n\n## Install and configure tool\n\nWe using <https://github.com/git-chglog/git-chglog>, so refer to this side for installation instructions.\n\nIt is possible to test the tool by `git-chglog --init` without overriding anything.\n\n## Usage\n\nExample for a new release \"v2.6.0\":\n\n```sh\n# optional update tool by: go install github.com/git-chglog/git-chglog/cmd/git-chglog@latest\ngit checkout release\ngit pull\ngit fetch --tags\ngit checkout dev\ngit pull upstream dev\ngit checkout -b rel/prepare_for_release_v260\ngit-chglog --config .chglog/config_gobot.yml --no-case --next-tag v2.6.0 v2.5.0.. > .chglog/chglog_tmp.md\n```\n\n## Compare\n\nIf unsure about any result of running git-chglog, just use:\n`git log  --since=2025-02-16 --pretty=\"- %s\"`\n\n## Manual adjustment\n\nMost likely some manual work is needed to bring the items in the correct position. We use the style from\n[\"keep a changelog\"](https://keepachangelog.com/en/1.1.0/), together with the [standard template](https://github.com/git-chglog/example-type-scope-subject/blob/master/CHANGELOG.standard.md).\nThe changelog will be generated based on the commit messages, so please follow the\n[Convention for Pull Request Descriptions](../CONTRIBUTING.md).\n\nAn example for the following commits:\n\n* type(scope): description\n* i2c(PCF8583): added\n* gpio(HD44780): fix wrong constants\n* raspi(PWM): refactor usage\n* docs(core): usage of Kernel driver\n* or alternative: core(docs): usage of Kernel driver\n* build(style): adjust rule for golangci-lint\n\n```md\n### Build\n\n* **style**: adjust rule for golangci-lint\n\n### Docs\n\n* **core**: usage of Kernel driver\n\n### I2c\n\n* **PCF8583**: added\n\n\n### Gpio\n\n* **HD44780**: fix wrong constants\n\n### Raspi\n\n* **PWM**: refactor usage\n\n### Type\n\n* **scope:** description\n```\n\nIf in doubt, please refer to the current CHANGELOG.md to find the correct way.\n\n## Finalization\n\nAfter all work is done in the temporary changelog file, the content can be moved to the real one and the \"chglog_tmp.md\"\nfile can be removed.\n"
  },
  {
    "path": ".chglog/config_gobot.yml",
    "content": "style: github\ntemplate: CHANGELOG.gobot.md\ninfo:\n  title: Auto-Generated Changelog\n  repository_url: https://github.com/hybridgroup/gobot\noptions:\n  header:\n    pattern: \"^(\\\\w*|1-wire)(?:\\\\(([\\\\w\\\\$\\\\.\\\\,\\\\-\\\\*\\\\s]*)\\\\))?\\\\:?\\\\s(.*)$\"\n    pattern_maps:\n      - Type\n      - Scope\n      - Subject\n  notes:\n    keywords:\n      - BREAKING CHANGE\n"
  },
  {
    "path": ".circleci/config.yml",
    "content": "# Since switch to cimg, the GOPATH has been changed from /go to $HOME/go. \n# The latter will expand to the full path of /home/circleci/go. \n# On first run, this change may affect caching and some other commands if\n# you don’t correct the page in your config.\n#\n# Specify service dependencies here if necessary\n# CircleCI maintains a library of pre-built images\n# documented at https://circleci.com/docs/circleci-images\n# - image: cimg/postgres:14.5.0\n#\n# For more information, please read https://github.com/CircleCI-Public/cimg-go/blob/main/README.md\n\nversion: 2\njobs:\n  \"test_core_and_drivers_with_coverage\":\n    docker:\n      - image: cimg/go:1.24\n    steps:\n      - checkout\n      - run:\n          name: Debug version\n          command: go version\n      - run:\n          name: Core and drivers tests\n          command:  |\n            go test -race -v -coverprofile=coverage.txt -covermode=atomic . ./drivers/...\n      - run:\n          name: Code coverage\n          command: |\n            bash <(curl -s https://codecov.io/bash)\n\n  \"test_platforms\":\n    docker:\n      - image: cimg/go:1.24\n    steps:\n      - checkout\n      - run:\n          name: Debug version\n          command: go version\n      - run:\n          # digispark needs libusb, opencv needs opencv\n          name: Platform tests (except digispark and opencv)\n          command: |\n            go test -race -v $(go list ./platforms/... | grep -v platforms/digispark | grep -v platforms/opencv)\n  \n  \"check_examples\":\n    docker:\n      - image: cimg/go:1.24\n    steps:\n      - checkout\n      - run:\n          name: Debug version\n          command: go version\n      - run:\n          # digispark needs libusb, opencv needs opencv\n          name: Check examples (except digispark, opencv)\n          command: |\n            ALL=$(grep -l -r --include \"*.go\" 'build example' ./)\n            SOME=$(grep -L 'digispark' $(grep -L 'gocv' ${ALL}))\n            for e in ${SOME} ; do go vet \"${e}\" ; done\n\n  \"fmt_check_examples\":\n    docker:\n      - image: golangci/golangci-lint:v2.4.0\n    steps:\n      - checkout\n      - run:\n          name: Debug linter version\n          command: golangci-lint --version\n      - run:\n          # digispark needs libusb, opencv needs opencv\n          name: Check examples for linter issues (except digispark, opencv)\n          command: |\n            ALL=$(grep -l -r --include \"*.go\" 'build example' ./)\n            SOME=$(grep -L 'digispark' $(grep -L 'gocv' ${ALL}))\n            for e in ${SOME} ; do golangci-lint run \"${e}\" --build-tags example --disable forcetypeassert --disable noctx ; done\n\nworkflows:\n  version: 2\n  build:\n      jobs:\n        - \"test_core_and_drivers_with_coverage\"\n        - \"test_platforms\"\n        - \"check_examples\"\n        - \"fmt_check_examples\"\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\n# github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: deadprogram\n# open_collective: # Replace with a single Open Collective username\n# ko_fi: # Replace with a single Ko-fi username\n# tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\n# custom: # Replace with a single custom sponsorship URL\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# package-ecosystem, directory and schedule is mandatory\n\nversion: 2\nupdates:\n  - package-ecosystem: \"gomod\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n    # Raise pull requests for version updates\n    # for go modules against the `dev` branch\n    target-branch: \"dev\""
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Solved issues and/or description of the change\n\n...\n\n## Manual test\n\n- OS and Version (Win/Mac/Linux):\n- Adaptor(s) and/or driver(s):\n...\n\n## Checklist\n\n- [ ] The PR's target branch is 'hybridgroup:dev'\n- [ ] I have added tests that prove my fix is effective or that my feature works\n- [ ] New and existing unit tests pass locally with my changes (e.g. by run `make test_race`)\n- [ ] No linter errors exist locally (e.g. by run `make fmt_check`)\n- [ ] I have performed a self-review of my own code\n\nIf this is a new driver or adaptor:\n\n- [ ] I have added the name to the corresponding README.md\n- [ ] I have added an example to see how to setup and use it\n- [ ] I have checked or build at least my new example (e.g. by run `make examples_check`)\n\nIf this is a Go version or module update:\n\n- [ ] go.mod to new version updated\n- [ ] modules updated (go get -u -t ./...)\n- [ ] CI files updated\n- [ ] linter setting and linter version (if a newer one exist) updated\n- [ ] linter issues fixed or suppressed by config\n\nIf this is a PR for release:\n\n- [ ] The PR's target branch is 'hybridgroup:release'\n- [ ] I have adjusted the CHANGELOG.md (or already prepared and will be merged as soon as possible)\n"
  },
  {
    "path": ".github/workflows/golangci-lint.yml",
    "content": "name: golangci-lint\non:\n  push:\n    tags:\n      - v*\n    branches:\n      - dev\n  pull_request:\npermissions:\n  contents: read\n  # Optional: allow read access to pull request. Use with `only-new-issues` option.\n  # pull-requests: read\njobs:\n  golangci:\n    name: lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v5\n      - uses: actions/setup-go@v5\n        with:\n          go-version: '1.24'\n          cache: false\n      - name: golangci-lint\n        uses: golangci/golangci-lint-action@v7\n        with:\n          # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version\n          version: v2.4.0\n\n          # Optional: working directory, useful for monorepos\n          # working-directory: v2\n\n          # Optional: golangci-lint command line arguments.\n          # Note: exclude arguments, e.g. --exclude-files=\"my_file\", will not affect the \"typecheck\" linter,\n          # at least since v1.61.0 - use build tags instead.\n          #args: --exclude-files=\"platforms/digispark/digispark_adaptor.go\"\n\n          # Optional: show only new issues if it's a pull request. The default value is `false`.\n          # only-new-issues: true\n\n          # Optional: if set to true then the all caching functionality will be complete disabled,\n          #           takes precedence over all other caching options.\n          # skip-cache: true\n"
  },
  {
    "path": ".gitignore",
    "content": ".sass-cache\n*.test\n*.swp\n*.snap\nprofile.cov\ncount.out\n/parts\n/prime\n/stage\nvendor/\noutput/\n.idea/\ncoverage.txt\n.chglog/chglog_tmp*.md\n.chglog/CHANGELOG.tpl*.md\n.chglog/config.yml\n"
  },
  {
    "path": ".golangci.yml",
    "content": "# note: GolangCI-Lint also searches for config files in all directories from the directory of the first analyzed path up to the root.\nversion: \"2\"\nrun:\n  build-tags:\n    - utils\n\n  # Timeout for analysis, e.g. 30s, 5m.\n  # gobot is very expensive, on a machine with heavy load it takes some minutes\n  # for first run or after empty the cache by 'golangci-lint cache clean'\n  # Default: 1m\n  timeout: 5m\n\n  # If set we pass it to \"go list -mod={option}\". From \"go help modules\":\n  # If invoked with -mod=readonly, the go command is disallowed from the implicit\n  # automatic updating of go.mod described above. Instead, it fails when any changes\n  # to go.mod are needed. This setting is most useful to check that go.mod does\n  # not need updates, such as in a continuous integration and testing system.\n  # If invoked with -mod=vendor, the go command assumes that the vendor\n  # directory holds the correct copies of dependencies and ignores\n  # the dependency descriptions in go.mod.\n  #\n  # Allowed values: readonly|vendor|mod\n  # By default, it isn't set.\n  modules-download-mode: readonly\n\n  # https://golangci-lint.run/usage/linters/#enabled-by-default\n  # note: typecheck can not be disabled, it is used to check code compilation\nlinters:\n  default: all\n  disable:\n    # deprecated: none\n    # not used for this go version: none\n    # not used for any reason\n    - err113 # not used (we allow error creation at return statement)\n    - exhaustive # not used (we allow incomplete usage of enum switch, e.g. with default case)\n    - forbidigo # not used (we allow print statements)\n    - ginkgolinter # not needed (enforces standards of using ginkgo and gomega)\n    - gochecknoglobals # not used (we allow definition of unexposed variables at top level)\n    - godot # not used (seems to be counting peas)\n    - godox # not used (we have many TODOs, so not useful)\n    - gosmopolitan # not needed (report i18n/l10n anti-patterns)\n    - importas # not needed (there is no alias rule at the moment)\n    - ireturn # not used (we allow return interfaces)\n    - loggercheck # not needed (relates to kitlog, klog, logr, zap)\n    - noinlineerr # this violates best practices in other style guides\n    - paralleltest # not used\n    - promlinter # not needed (prometheus metrics naming)\n    - rowserrcheck # not needed (sql related)\n    - sqlclosecheck # not needed (sql related)\n    - testpackage # not needed, we use the same name for test package to have access to unexposed items\n    - wrapcheck # not needed (we allow errors from interface methods)\n    - zerologlint # not needed (related to zerolog package)\n    # useful for the future\n    - cyclop # useful with some tweeks (better understandable code), see also gocyclo\n    - dupl # useful with some tweeks (reduce bugs and lines of code)\n    - errname # useful for common style\n    - exhaustruct # useful with some exclusions for existing code (e.g. mavlink/common/common.go)\n    - funcorder # common style, but too many findings\n    - funlen # useful with some tweeks (reduce bugs, simplify code, better understandable code)\n    - gocognit # useful with some tweeks (better understandable code)\n    - goconst # useful (reduce bugs)\n    - gocyclo # useful with some tweeks (better understandable code)\n    - goheader # useful, if we introduce a common header (e.g. for copyright)\n    - interfacebloat # useful with some exclusions at usage of external packages\n    - intrange # introduced with go 1.22, will simplify the range syntax\n    - maintidx # useful with some tweeks (better understandable code), maybe use instead \"gocyclo\", \"gocognit\" , \"cyclop\"\n    - mnd # useful with some exclusions for existing code (e.g. mavlink.go)\n    - nestif # useful (reduce bugs, simplify code, better understandable code)\n    - nlreturn # more common style, but could become annoying\n    - tagliatelle # maybe useful with some tweaking or excluding\n    - varnamelen # maybe useful with some tweaking, but many findings\n    - whitespace # more common style, but could become annoying\n    - wsl # more common style, but could become annoying\n    - wsl_v5 # same as above\n\n  exclusions:\n    generated: lax\n    presets:\n      - comments\n      - common-false-positives\n      - legacy\n      - std-error-handling\n\n  settings:\n    depguard:\n      # Rules to apply.\n      #\n      # Variables:\n      # - File Variables\n      #   you can still use and exclamation mark ! in front of a variable to say not to use it.\n      #   Example !$test will match any file that is not a go test file.\n      #\n      #   `$all` - matches all go files\n      #   `$test` - matches all go test files\n      #\n      # - Package Variables\n      #\n      #  `$gostd` - matches all of go's standard library (Pulled from `GOROOT`)\n      #\n      # Default: Only allow $gostd in all files.\n      rules:\n        main:\n          # Packages that are not allowed where the value is a suggestion.\n          deny:\n            - pkg: github.com/pkg/errors\n              desc: Should be replaced by standard lib errors package\n\n    dupword:\n      # Keywords for detecting duplicate words.\n      # If this list is not empty, only the words defined in this list will be detected.\n      # Default: []\n      keywords:\n        - the\n        - and\n        - a\n\n    errorlint:\n      # Default: true\n      # %v should be used by default over %w, see https://github.com/uber-go/guide/blob/master/style.md#error-wrapping\n      errorf: false\n      # Permit more than 1 %w verb, valid per Go 1.20 (Requires errorf:true)\n      # Default: true\n      errorf-multi: false\n\n    gocritic:\n      disabled-checks:\n        - assignOp # very opinionated\n        - appendAssign # mostly used by intention\n\n    nolintlint:\n      # Enable to require an explanation of nonzero length after each nolint directive.\n      # Default: false\n      require-explanation: true\n      # Enable to require nolint directives to mention the specific linter being suppressed.\n      # Default: false\n      require-specific: true\n\n    perfsprint:\n      # Optimizes `fmt.Errorf`.\n      # Default: true\n      errorf: false\n      # Optimizes `fmt.Sprintf` with only one argument\n      # Default: true\n      sprintf1: false\n\n    revive:\n      rules:\n        # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unexported-return\n        # disable this rule, because sometimes it has its justification\n        - name: unexported-return\n          severity: warning\n          disabled: true\n\n\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n\n  exclusions:\n    generated: lax\n\n  settings:\n    gci:\n      # Section configuration to compare against.\n      # Section names are case-insensitive and may contain parameters in ().\n      # The default order of sections is `standard > default > custom > blank > dot`,\n      # If `custom-order` is `true`, it follows the order of `sections` option.\n      # Default: [\"standard\", \"default\"]\n      sections:\n        - standard # Standard section: captures all standard packages.\n        - default # Default section: contains all imports that could not be matched to another section type.\n        - prefix(gobot.io/x/gobot/) # Custom section: groups all imports with the specified Prefix.\n        #- blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled.\n        #- dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled.\n      # Enable custom order of sections.\n      # If `true`, make the section order the same as the order of `sections`.\n      # Default: false\n      custom-order: true\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# CHANGELOG\n\n## [Unreleased](https://github.com/hybridgroup/gobot/compare/v2.6.0...HEAD)\n\n## [v2.6.0](https://github.com/hybridgroup/gobot/compare/v2.5.0...v2.6.0) (2025-10-18)\n\n### Adaptors\n\n* **all:** add debug option ([#1181](https://github.com/hybridgroup/gobot/issues/1181))\n\n### Ble\n\n* fix some issues in connect and disconnect ([#1161](https://github.com/hybridgroup/gobot/issues/1161))\n\n### Build\n\n* **deps:** update modules ([#1186](https://github.com/hybridgroup/gobot/issues/1186))\n* **go, deps:** switch to Go 1.24 linter 2.4.0 and update modules ([#1162](https://github.com/hybridgroup/gobot/issues/1162))\n\n### Common\n\n* improve robot level errors ([#1180](https://github.com/hybridgroup/gobot/issues/1180))\n\n### Doc\n\n* **core:** prepare for release v2.6.0\n\n### Drivers\n\n* fix nil connector check ([#1178](https://github.com/hybridgroup/gobot/issues/1178))\n\n### I2c\n\n* **adafruit1109:** rework debug messages ([#1182](https://github.com/hybridgroup/gobot/issues/1182))\n* **all:** ensure halt is idempotent ([#1171](https://github.com/hybridgroup/gobot/issues/1171))\n* **bme280:** fix default name ([#1177](https://github.com/hybridgroup/gobot/issues/1177))\n* **mcp23017:** fix missing code for halt is idempotent ([#1175](https://github.com/hybridgroup/gobot/issues/1175))\n\n### Onewire\n\n* **all:** ensure halt is idempotent ([#1174](https://github.com/hybridgroup/gobot/issues/1174))\n\n### Platforms\n\n* **bleclient:** improve errors and add sleep option ([#1179](https://github.com/hybridgroup/gobot/issues/1179))\n\n### Spi\n\n* **all:** ensure halt is idempotent ([#1173](https://github.com/hybridgroup/gobot/issues/1173))\n\n### Wiichuck\n\n* fix go routine leaking and concurrency problem ([#1172](https://github.com/hybridgroup/gobot/issues/1172))\n\n## [v2.5.0](https://github.com/hybridgroup/gobot/compare/v2.4.0...v2.5.0) (2025-02-16)\n\n### Build\n\n* **deps:** update modules ([#1131](https://github.com/hybridgroup/gobot/issues/1131))\n* **linter:** update linter to v1.64.5 and fix issues ([#1130](https://github.com/hybridgroup/gobot/issues/1130))\n\n### Core\n\n* **system:** split system accesser features ([#1121](https://github.com/hybridgroup/gobot/issues/1121))\n\n### Doc\n\n* **core:** prepare for release v2.5.0\n\n### Drivers\n\n* fix some function names in comment ([#1103](https://github.com/hybridgroup/gobot/issues/1103))\n\n### Examples\n\n* correct all usage of ps3 joystick reads, which are now int instead of int16 ([#1085](https://github.com/hybridgroup/gobot/issues/1085))\n\n### Gpio\n\n* rename gpiod to gpiocdev ([#1116](https://github.com/hybridgroup/gobot/issues/1116))\n* **adaptors:** fix so now gpiodev is used as default ([#1112](https://github.com/hybridgroup/gobot/issues/1112))\n* **core:** fix sporadic hang on finish for discrete edge polling ([#1107](https://github.com/hybridgroup/gobot/issues/1107))\n\n### Nanopct6\n\n* introduce adaptor for FriendlyELEC NanoPC-T6 ([#1126](https://github.com/hybridgroup/gobot/issues/1126))\n\n### Onewire\n\n* **ds18b20:** introduce 1-wire device access by sysfs and temp driver ([#1091](https://github.com/hybridgroup/gobot/issues/1091))\n\n### Orangepi5pro\n\n* introduce adaptor for OrangePi 5 Pro ([#1129](https://github.com/hybridgroup/gobot/issues/1129))\n\n### Platforms\n\n* file name and folder unification ([#1127](https://github.com/hybridgroup/gobot/issues/1127))\n\n### Pocketbeagle\n\n* introduce and use cdev by default ([#1118](https://github.com/hybridgroup/gobot/issues/1118))\n\n### Rock64\n\n* introduce adaptor for PINE64-ROCK64 ([#1122](https://github.com/hybridgroup/gobot/issues/1122))\n\n### Sphero\n\n* fix panic by removing unnecessary go routine ([#1117](https://github.com/hybridgroup/gobot/issues/1117))\n\n### Tests\n\n* fix for arm64 environment and stabilize ([#1115](https://github.com/hybridgroup/gobot/issues/1115))\n\n### Tinkerboard2\n\n* introduce adapter for Asus Tinker Board 2 ([#1108](https://github.com/hybridgroup/gobot/issues/1108))\n\n### Zero\n\n* introduce adaptor for Radxa Zero ([#1128](https://github.com/hybridgroup/gobot/issues/1128))\n\n## [v2.4.0](https://github.com/hybridgroup/gobot/compare/v2.3.0...v2.4.0) (2024-11-05)\n\n### Bebop\n\n* fix concurrent map writes ([#1063](https://github.com/hybridgroup/gobot/issues/1063))\n\n### Ble\n\n* add support for functional options, add tests ([#1059](https://github.com/hybridgroup/gobot/issues/1059))\n* introduce in drivers folder ([#1057](https://github.com/hybridgroup/gobot/issues/1057))\n* **client:** add scan timout ([#1051](https://github.com/hybridgroup/gobot/issues/1051))\n* **module:** update tinygo.org/x/bluetooth to v0.10 and adapt code ([#1084](https://github.com/hybridgroup/gobot/issues/1084))\n\n### Build\n\n* **go, deps:** switch to Go 1.22 and update modules, linter v1.61.0 and adapt code ([#1093](https://github.com/hybridgroup/gobot/issues/1093),[#1092](https://github.com/hybridgroup/gobot/issues/1092))\n* **go, deps:** switch to Go 1.20 and update modules ([#1067](https://github.com/hybridgroup/gobot/issues/1067))\n* **linter:** update linter to v1.56.1 and fix issues ([#1068](https://github.com/hybridgroup/gobot/issues/1068))\n\n### Doc\n\n* update links to release or tagged branch ([#1069](https://github.com/hybridgroup/gobot/issues/1069))\n* **core:** prepare for release v2.4.0\n\n### Examples\n\n* fix missing checks of return values ([#1060](https://github.com/hybridgroup/gobot/issues/1060))\n\n### Gobot\n\n* rename Master to Manager ([#1070](https://github.com/hybridgroup/gobot/issues/1070))\n\n### Megapi\n\n* use serialport adaptor and move driver to drivers/serial ([#1062](https://github.com/hybridgroup/gobot/issues/1062))\n\n### Neurosky\n\n* use serialport adaptor and move driver to drivers/serial ([#1061](https://github.com/hybridgroup/gobot/issues/1061))\n\n### Test\n\n* try to stabilize eventer tests ([#1066](https://github.com/hybridgroup/gobot/issues/1066))\n* try to stabilize firmata tests ([#1097](https://github.com/hybridgroup/gobot/issues/1097))\n\n## [v2.3.0](https://github.com/hybridgroup/gobot/compare/v2.2.0...v2.3.0) (2024-01-06)\n\n### Adaptors\n\n* **pwm:** introduce scale option for servo ([#1046](https://github.com/hybridgroup/gobot/issues/1046))\n* **analogpins:** add a generic analog pin adaptor ([#1041](https://github.com/hybridgroup/gobot/issues/1041))\n\n### Aio\n\n* fix data race in AnalogSensorDriver ([#1024](https://github.com/hybridgroup/gobot/issues/1024))\n* **all:** introduce functional options ([#1039](https://github.com/hybridgroup/gobot/issues/1039))\n* **analog sensor:** fix deadlock in cyclic reading ([#1042](https://github.com/hybridgroup/gobot/issues/1042))\n* **thermalzone:** add driver for read a thermalzone from system ([#1040](https://github.com/hybridgroup/gobot/issues/1040))\n\n### Build\n\n* **go, deps:** update modules ([#1047](https://github.com/hybridgroup/gobot/issues/1047), [#1052](https://github.com/hybridgroup/gobot/issues/1052))\n\n### Doc\n\n* **test:** use -race for tests by default ([#1035](https://github.com/hybridgroup/gobot/issues/1035))\n\n### Gpio\n\n* fix data race in StepperDriver ([#1029](https://github.com/hybridgroup/gobot/issues/1029))\n* fix data race in PIRMotionDriver ([#1028](https://github.com/hybridgroup/gobot/issues/1028))\n* fix data race in ButtonDriver ([#1027](https://github.com/hybridgroup/gobot/issues/1027))\n* fix data race in EasyDriver ([#1025](https://github.com/hybridgroup/gobot/issues/1025))\n* **all:** introduce functional options ([#1045](https://github.com/hybridgroup/gobot/issues/1045))\n\n### I2c\n\n* **core:** fix problems with usage of uintptr ([#1033](https://github.com/hybridgroup/gobot/issues/1033))\n\n### Lint\n\n* **all:** fix issues of errorlint etc ([#1037](https://github.com/hybridgroup/gobot/issues/1037))\n* **all:** switch to 1.55.2 and adjust linter issues ([#1036](https://github.com/hybridgroup/gobot/issues/1036))\n\n### Ollie\n\n* **test:** fix data race in test ([#1034](https://github.com/hybridgroup/gobot/issues/1034))\n\n### Raspi\n\n* **pwm:** add support for sysfs and fix pi-blaster ([#1048](https://github.com/hybridgroup/gobot/issues/1048))\n\n## [v2.2.0](https://github.com/hybridgroup/gobot/compare/v2.1.1...v2.2.0) (2023-10-29)\n\n### Adaptors\n\n* **PWM:** fix wrong duty cycle after kill program ([#994](https://github.com/hybridgroup/gobot/issues/994))\n\n### Beaglebone\n\n* **doc:** fix preceding typo ([#985](https://github.com/hybridgroup/gobot/issues/985))\n\n### Build\n\n* **deps:** module update ([#992](https://github.com/hybridgroup/gobot/issues/992))\n* **go, deps:** switch to Go 1.19 and update modules ([#1008](https://github.com/hybridgroup/gobot/issues/1008))\n* **style:** switch to gofumpt and add linters ([#1009](https://github.com/hybridgroup/gobot/issues/1009))\n\n### Doc\n\n* **roadmap:** remove file ROADMAP.md after creating issues ([#1005](https://github.com/hybridgroup/gobot/issues/1005))\n\n### Dragonboard\n\n* fix example and documentation ([#977](https://github.com/hybridgroup/gobot/issues/977))\n\n### Gpio\n\n* **hcsr04:** add driver for ultrasonic ranging module ([#1012](https://github.com/hybridgroup/gobot/issues/1012))\n\n### I2c\n\n* **PCA9685, adafruit, adafruit2327, adafruit2348:** clean up architecture and fix init ([#1021](https://github.com/hybridgroup/gobot/issues/1021))\n\n### Jetson\n\n* **PWM:** fix set period ([#1019](https://github.com/hybridgroup/gobot/issues/1019))\n\n### Joystick\n\n* **core:** replace sdl with 0xcafed00d/joystick  package ([#988](https://github.com/hybridgroup/gobot/issues/988))\n\n### Sphero\n\n* Add support for calibration\n\n### System\n\n* **gpio:** add edge polling function ([#1015](https://github.com/hybridgroup/gobot/issues/1015))\n\n### Test\n\n* **all:** substitude assert.Nil by assert.NoError if useful ([#1016](https://github.com/hybridgroup/gobot/issues/1016))\n* **all:** substitude assert.Error by assert.ErrorContains ([#1014](https://github.com/hybridgroup/gobot/issues/1014), [#1011](https://github.com/hybridgroup/gobot/issues/1011))\n* **all:** switch to test package stretchr testify ([#1006](https://github.com/hybridgroup/gobot/issues/1006))\n* **gpio, aio:** cleanup helper_test ([#1018](https://github.com/hybridgroup/gobot/issues/1018))\n\n## [v2.1.1](https://github.com/hybridgroup/gobot/compare/v2.1.0...v2.1.1) (2023-07-07)\n\n### All\n\n* upgrade modules\n* substitute deprecated ioutil methods ([#923](https://github.com/hybridgroup/gobot/issues/923))\n* **linter:** activate linters \"errcheck\", \"ineffassign\", \"unused\" and fix issues ([#950](https://github.com/hybridgroup/gobot/issues/950))\n* **linter, format:** format code and list of linter todo's ([#962](https://github.com/hybridgroup/gobot/issues/962))\n* **linter:** activate linter \"makezero\" and fix issue ([#965](https://github.com/hybridgroup/gobot/issues/965))\n\n### Ble\n\n* simplify and substitute errors.Wrap() ([#958](https://github.com/hybridgroup/gobot/issues/958))\n\n### Build\n\n* **go:** switch to Go 1.18 ([#940](https://github.com/hybridgroup/gobot/issues/940))\n\n### Core\n\n* CLI removed ([#946](https://github.com/hybridgroup/gobot/issues/946))\n\n### Doc\n\n* fix and improve documentation regarding to installation ([#946](https://github.com/hybridgroup/gobot/issues/946), [#970](https://github.com/hybridgroup/gobot/issues/970))\n\n### Mavlink\n\n* fix linter issues of errcheck ([#959](https://github.com/hybridgroup/gobot/issues/959))\n\n### System\n\n* **syscall:** switch to x/sys ([#963](https://github.com/hybridgroup/gobot/issues/963))\n\n### Tello\n\n* fix wifiMessage and lightMessage ([#957](https://github.com/hybridgroup/gobot/issues/957))\n* fix partially [#793](https://github.com/hybridgroup/gobot/issues/793) by initialize doneCh in NewDriverWithIP ([#931](https://github.com/hybridgroup/gobot/issues/931))\n\n## [v2.1.0](https://github.com/hybridgroup/gobot/compare/v2.0.3...v2.1.0) (2023-05-29)\n\n### Build\n\n* **v2:** revert of [#927](https://github.com/hybridgroup/gobot/pull/927), no usage of a v2 subfolder anymore (issue [#920](https://github.com/hybridgroup/gobot/issues/920))\n\n## [v2.0.3](https://github.com/hybridgroup/gobot/compare/v2.0.2...v2.0.3) (2023-05-24)\n\n* accidentally created release without any changes\n\n## [v2.0.2](https://github.com/hybridgroup/gobot/compare/v2.0.1...v2.0.2) (2023-05-22)\n\n### Build\n\n* **v2:** fix usage by moving code to a v2 subfolder ([#927](https://github.com/hybridgroup/gobot/pull/927))\n\n## [v2.0.1](https://github.com/hybridgroup/gobot/compare/v2.0.0...v2.0.1) (2023-05-21)\n\n### Build\n\n* **style:** add golangci-lint workflow configuration ([#916](https://github.com/hybridgroup/gobot/issues/916))\n* **style:** fix linter findings of \"gosimple\", \"govet\" and \"staticcheck\" ([#917](https://github.com/hybridgroup/gobot/issues/917))\n\n### Bump\n\n* periph.io/x/conn/v3 from 3.6.10 to 3.7.0 ([#913](https://github.com/hybridgroup/gobot/issues/913))\n* github.com/gofrs/uuid from 4.3.0+incompatible to 4.4.0+incompatible ([#914](https://github.com/hybridgroup/gobot/issues/914))\n* golang.org/x/net from 0.1.0 to 0.10.0 ([#915](https://github.com/hybridgroup/gobot/issues/915))\n* github.com/nats-io/nats-server/v2 from 2.1.0 to 2.7.4 ([#906](https://github.com/hybridgroup/gobot/issues/906))\n\n### Core\n\n* fix Semantic Import Versioning for v2 ([#921](https://github.com/hybridgroup/gobot/issues/921))\n\n### Docs\n\n* **core:** adjust changelog generation ([#924](https://github.com/hybridgroup/gobot/issues/924))\n\n## [v2.0.0](https://github.com/hybridgroup/gobot/compare/v1.16.0...v2.0.0) (2023-05-15)\n\n### ble\n\n* update to TinyGo Bluetooth package v0.6.0 release\n\n### build\n\n* update appveyor for go 1.19\n* switch to new cimg with golang 1.17\n* new home path for cimg\n* check examples in CI ([#884](https://github.com/hybridgroup/gobot/issues/884))\n* add tests of more platforms to CI\n* add configuration file for dependabot ([#907](https://github.com/hybridgroup/gobot/issues/907))\n* add PR template\n\n### core\n\n* use base driver for all I2C devices\n* rename package \"sysfs\" to \"system\"\n* go.mod to 1.17 and all modules incl. code upgrades\n\n## digispark\n\n* add example for generic i2c.Driver\n* fix i2c.ReadBlockData(), Read_Data() and some small other fixes\n\n### dji tello\n\n* Halt does not terminate all the related goroutines and may wait forever when it is called multiple times\n\n### docs\n\n* README for gpio, pwm, i2c and add example\n* document fields for flight data\n\n### aio\n\n* analog sensor driver to prevent ReadValue() to get float64\n\n### gopigo3\n\n* fix examples and driver\n\n### gpio\n\n* add advanced digital pin options (pull, bias, drive, debounce, event)\n* add support for new character device Kernel ABI for GPIO\n* add read firmware version and DHT sensors for grovepi\n\n### i2c\n\n* add generic i2c driver\n* fix I2C connection-bus caching and multiple device usage\n* introduce I2cBusAdaptor for composition in platforms\n* **Adafruit1109:** fix driver shows bad characters after Halt()\n* **ads1x15:** fix driver not working stable when reading multiple inputs\n* **ADXL345:** use ReadBlockData()\n* **bmxy8z:** use ReadBlockData\n* **BMP180, BMP280 BMP388 BME280:** use ReadBlockData()\n* **CCS811:** use ReadBlockData()\n* **HMC5883L:** fix I2C driver typo: change from HMC8553L\n* **HMC5883L:** fix driver returns wrong values\n* **L3GD20H:** fix full scale range usage\n* **MPL115A2:** use ReadBlockData(), WriteByteData()\n* **MPU6050:** fix wrong initialize and reduced temperature resolution\n* **PCA9501:** add driver\n* **PCA953x:** add driver\n* **PCF8583:** add driver\n* **TH02:** fix wrong register usage for read heater\n\n### jetson nano\n\n* add Jetson Nano adpator\n* fix pwm feature\n\n### joystick\n\n* add Xbox-One controller\n* add configuration for Nintendo Switch controllers ([#903](https://github.com/hybridgroup/gobot/issues/903))\n* add Dualsense joystick (PlayStation 5) ([#880](https://github.com/hybridgroup/gobot/issues/880))\n\n### nanopi neo\n\n* add platform\n\n### piblaster\n\n* add unused but missing interface implementation\n\n### radxa rock pi 4(c+)\n\n* add platform ([#902](https://github.com/hybridgroup/gobot/issues/902))\n\n### raspi\n\n* fix  pwm cache\n* fix Stopping and Starting Robot and LED Driver/LED does not toggle on restart\n\n### spi\n\n* fix spi.SpiConnection is not gobot.Connection: missing method Connect\n* using GPIO's is now possible\n* **MFRC522:** add driver\n\n### test\n\n* increase some timings to make tests a little less fragile\n* skip test TestNatsAdaptorFailedConnect when flaky\n* stabilize \"every\"-test\n* stabilize flaky utils_test\n* stabilize firmata tests\n* fix tests with sysfs mocks, ReadBlockData, WriteBlockData\n* fix keyboard tests and exclude opencv\n* fix PWM related read/write tests\n* add check for examples in Makefile\n\n### tinkerboard\n\n* fix new pwm behaviour\n\n### BREAKING CANGES\n\n* some interfaces moved, see folder system and adaptor.go\n\n## [v1.16.0](https://github.com/hybridgroup/gobot/compare/v1.15.0...v1.16.0) (2022-05-02)\n\n### bugfix\n\n* failing leftovers after usage of PR #569\n* Fix servo and DC motors presence\n* FIX the bug #568 without further impact, heavy improvements of tests\n* fixed PinMode, SetPullUp and SetPolarity, unit tests activated\n* ReadGPIO fixed with #576, failing leftovers for PinMode, SetPullUp and SetPolarity\n* helper_test ReadByteData, ReadWordData to use reg\n\n### core\n\n* update uuid package and directly access it; remove archived uuid package\n\n### digispark\n\n* fix ReadByte & WriteByte, rework and add i2c tests\n* remove useless code in i2c test\n\n### drivers\n\n* add AnalogActuatorDriver, analog temperature sensor, driver for PCF8591 (with 400kbit stabilization), driver for YL-40\n* Adding support for hmc5883l compass\n* bmp388 fix missing address write byte in test of Measurements\n* drv2605l fix missing address write byte in test of Halt()\n* introduce adafruit1109 2x16 LCD with 5 keys\n* mcp23017: add mutex for write, hd44780: fix mutexes\n* MCP3004: correct number of channels\n\n### raspi\n\n* fix raspi PWMPin.SetDutyCycle (#800)\n\n### tello\n\n* Guards Dji Tello Halt against nil dereference\n\n### test\n\n* don't panic on 'With*' allow simpler wrapping of drivers\n\n### tinkerboard\n\n* fix tinkerboard i2c0 to i2c4, improve comments in pin map, improve README\n\n## [v1.15.0](https://github.com/hybridgroup/gobot/compare/v1.14.0...v1.15.0) (2020-11-30)\n\n### build\n\n* Switch to CircleCI\n\n### ble\n\n* replace go-ble with tinygo bluetooth package, restore macOS functionality\n\n### gpio\n\n* Update RelayDriver to invert value written on Inverted\n* Add tests for DigitalWrite value\n* Add support for HD44780 LCD controller\n* Add delay for Run function of StepperDriver\n\n### spi\n\n* fixes #700 * Avoid to close the connection.\n\n### i2c\n\n* add SHT2x device\n* add BMP388 Barometric Pressure/Temperature/Altitude Sensor\n\n### pwm\n\n* Resolve issue with PWM for PWMWrite\n\n### mqtt\n\n* Add method to publish MQTT messages with retain flag\n\n### tello\n\n* Add graceful halt for Tello driver\n* Add Tello EDU driver\n\n### keyboard\n\n* add symbol keys for platform/keyboard\n\n### examples\n\n* Update ffmpeg command to decrease latency in tello example\n\n## [v1.14.0](https://github.com/hybridgroup/gobot/compare/v1.13.0...v1.14.0) (2019-10-15)\n\n### core\n\n* migrating from dep to go modules\n* update codegangsta to urfave (#690)\n\n### docs\n\n* Fix a link in package docs' example code.\n\n### examples\n\n* fixed broken imports due to changed path causing go get to fail\n\n### gpio\n\n* Added ability to make a relay driver inverted (#674)\n\n### opencv\n\n* Update to GoCV 0.21.0\n\n### spi\n\n* Apa102 use default brightness (#671)\n\n### tello\n\n* Updated videoPort for DJI Tello to 11111\n\n## [v1.13.0](https://github.com/hybridgroup/gobot/compare/v1.12.0...v1.13.0) (2019-05-22)\n\n### api\n\n* Initial stab at Robot-based work\n\n### build\n\n* correct package version as suggested by @dlisin thanks\n* only build last 2 versions of Go plus tip for CI\n* Update dep script for AppVeyor\n* update deps to latest versions of dependencies for GoCV and others\n* Update Gopkg and add test dep to Travis YML\n* update OpenCV build script for OpenCV 4.1.0\n\n### docs\n\n* update to remove Gitter and replace with Slack, and update copyright dates\n\n### example\n\n* add missing nobuild header\n\n### gpio\n\n* Add SparkFun’s EasyDriver (and BigEasyDriver)\n* Add unit tests for TH02 & Minor improvement\n* Added rudiementary support for TH02  Grove Sensor\n* pwm_pin * Fix DutyCycle() parse error, need to trim off trailing '\\n' before calling strconv.Atoi(), as other functions in this package do\n* Simplify code as suggested in #617\n\n### grovepi\n\n* add mutex to control transactionality of the device communication\n\n### i2c\n\n* add 128x32 and 96x16 sizes to the i2c ssd1306 driver\n* build out the ccs811 driver\n* update PCA9685 driver to use same protocol as Adafruit Python lib\n\n### leapmotion\n\n* Parser error in Pointable.Bases: Write test and fix\n* Update gobot leap platform to support Leap Motion API v6\n\n### mavlink\n\n* fix mavlink README to use correct example code\n\n### mqtt\n\n* Add some new MQTT adaptor functions with QOS\n* Allow setting QoS on MTT adaptor\n* make tests run correctly even when a local MQTT server is in fact running\n* Do not skip verification of root CA certificates by default InsecureSkipVerify\n\n### nats\n\n* Update Go NATS client library import\n\n### opencv\n\n* minor updates to opencv README\n* update to OpenCV 4.1.0\n\n### sphero\n\n* Added methods to read Sphero Power States\n* Added some new features to the sphero ollie, bb-8 and sprkplus\n\n### spi\n\n* correct param used for APA102 Draw() method\n* Stop using Red parameter for brightness value\n\n### tello\n\n* add direct vector access\n* add example with keyboard\n* Change fps to 60\n* Check for error immediately and skip publish if error occurred\n* update FlightData struct\n\n### up2\n\n* add support for built-in LEDs\n* correct i2c default bus information to match correct values\n* finalize docs for UP2 config steps\n* update README to include more complete setup information\n* useful constant values to access the built-in LEDs\n\n## [v1.12.0](https://github.com/hybridgroup/gobot/compare/1.11.1...v1.12.0) (2018-08-27)\n\n### api\n\n* further improvement of the modular API changes\n* modify Start() for more modular initialization, and add StartRaw() for completely custom API implementations\n* settled on StartWithoutDefaults() as the method to start API without default routes\n\n### core\n\n* add Rescale utility function for straight linear rescaling\n\n### digispark\n\n* add examples using digispark with i2c devices blinkm and mlp115a2\n* Added i2c to digispark, but not working yet\n* Added some tests for digispark i2c connector\n* Digispark i2c fixes, added Test for checking available addresses\n* remove test method that should not be in adaptor\n* remove test that is expected to ofail, but passes when digispark board is actually connected\n\n### docs\n\n* add GrovePi to README\n* adjust order of badges in README\n* Fixing broken link\n\n### examples\n\n* add example that uses both the API and also a custom handler with MJPEG streaming from an attached camera\n* small improvements to Tello examples\n* update Tello examples for main thread friendly macOS/Windows, add Tello face tracker\n\n### i2c\n\n* add commands to JHD1313MDriver\n* add commands to PCA9685Driver\n* add missing methods so the GrovePi fully implements the Adaptor interface\n* add ShowImage() function to ssd1306 driver based on @mikegleasonjr suggestion\n* GrovePi digitalwrite implemented\n* implemented DigitalRead, DigitalWrite, and AnalogRead for GrovePi\n* improve godocs for PCA9685\n* mention that GrovePi requires running firmware 1.3.0\n* update GrovePi to v1.3.0 firmware\n* work in progress on GrovePi plus driver\n\n### joystick\n\n* add config file for Magicsee R1 contributed by @carl-ranson\n* add some additional test coverage for file-based config\n* added error handling for config loading in joystick driver\n* mention need to be running a Linux kernel v4.14+ for controller mappings to work as expected\n* provide constant values for existing joystick configurations\n\n### raspi\n\n* export PiBlasterPeriod in Adaptor\n\n### spi\n\n* add ShowImage() function to ssd1306 driver based on @mikegleasonjr suggestion\n\n### tello\n\n* specify end of msgType position\n* add handleResponse testing\n* Add motion cessation commands to Tello\n* handleResponse only needs an io.Reader\n* handleResponse should not send commands\n* rename reqConn to cmdConn\n* reqConn is only an io.WriteCloser\n* send Land() command to drone on Halt() to avoid floating mid-air\n\n## [1.11.1](https://github.com/hybridgroup/gobot/compare/1.11.0...1.11.1) (2018-07-10)\n\n### build\n\n* exclude vendor and other previously excluded subpackages\n* update Travis build to use OpenCV 3.4.2 release\n* update deps for GoCV to v0.14.0 release\n* Bump periph.io/x/periph to v3.0.0\n* update to Go 1.10.3 and 1.9.7 for Travis builds\n\n### docs\n\n* Fix Leap Motion package link\n\n### i2c\n\n* fix write/read gpio on mcp23017, and cleaned up some comments\n* correct pca9685 SetPWMFreq function scaling\n\n### gopigo3\n\n* update with default spi values, cleanup\n\n## [1.11.0](https://github.com/hybridgroup/gobot/compare/1.10.2...1.11.0) (2018-05-31)\n\n### build\n\n* correct profile file location for codecov upload\n* Make Go Lint happier by adding some explicit type conversions and ignoring unused error returns\n* single quotes needed to upload any .cov file to codecov for reporting\n* update deps to latest versions for Paho MQTT, go-sdl, and gocv\n* upload any .cov file to codecov for reporting\n* use go 1.10.2 and 1.9.6 for Travis builds\n* add step to call dep ensure before contributing #524\n\n### examples\n\n* correct events used by XBox360 joystick example\n\n### firmata\n\n* Update the Firmata homepage in platform README\n\n### gpio\n\n* Improve Stepper Driver\n* Initial support for MAX7219 (gpio) led driver\n\n### joystick\n\n* full corrected ds3 and ds4 mappings plus examples to match for latest sdl 2.0.8\n* add instructions to README on how to install SDL on Linux from source\n* add missing type conversion\n* add new contributions to README\n* Add T-Flight Hotas X flight controoller\n* add xbox360 rock band drums controller\n* Correct Dualshock4 controller mappings and add ps/left/right buttons\n* correct test issue\n* exclude scanner from test builds\n* Fix joystick_driver to detect dpad input for xbox controllers\n* Update dualshock4.json to match joystick_dualshock4.go\n* update scanner to match go-sdl 0.3 API changes\n* Update the joystick driver test to read DPAD properly\n\n### leapmotion\n\n* change timestamp to uint64 to fix #516\n\n### tello\n\n* slow/fast mode switch function\n* StopLanding feature\n* Add Bounce() and PalmLand() funcs and their associated events.\n* bug fix\n* Change several fields in FlightData struct from int16 to bool\n* Export the FlightData fields (see Issue #531)\n\n## [1.10.2](https://github.com/hybridgroup/gobot/compare/1.10.1...1.10.2) (2018-04-24)\n\n### opencv\n\n* update GoCV to latest version\n\n## [1.10.1](https://github.com/hybridgroup/gobot/compare/1.10.0...1.10.1) (2018-04-24)\n\n### tello\n\n* improve support for DJI Tello drone, especially video\n\n## [1.10.0](https://github.com/hybridgroup/gobot/compare/v1.9.0...1.10.0) (2018-04-20)\n\n### docs\n\n* add gitter badge to readme\n\n### gpio\n\n* AIP1640 led driver, used in Wemos D1 mini's matrix LED shield\n\n### spi\n\n* switch to using periph.io for SPI interfaces\n* add support for ssd1306\n* add optional params such as bus/chip to all current drivers\n* complete refactoring to spi.Connection\n* remove unneeded code as suggested by @maruel\n* remove unneeded type and cleanup GoDocs\n\n### ble\n\n* correct spelling error in function name\n\n### build\n\n* update to latest version of Go 1.10 for Travis build\n\n### cli\n\n* remove extra newline\n\n### docs\n\n* add recently contributed GPIO devices to README\n\n### joystick\n\n* able to configure joysticks without external json file\n* correct error in scanning script\n* correct events used by gamepad-style up/down/left/right buttons\n* correct scanner error from ID\n* removed double release event\n\n### tello\n\n* add support for DJI Tello drone\n\n## [v1.9.0](https://github.com/hybridgroup/gobot/compare/v1.8.0...v1.9.0) (2018-02-14)\n\n### beaglebone\n\n* update pin naming, docs, and examples for the latest Debian OS releases\n\n### opencv\n\n* update build settings needed to build OpenCV/GoCV as part of test suite\n* deps for latest GoCV v0.9.0\n\n### build\n\n* update Travis build to use very latest Go versions\n\n### docs\n\n* add references to new drivers for ADXL345, BH1750, and TM1638.\n* improve docs for installation and use of OpenCV/GoCV from Gobot\n* update copyright date to 2018\n\n### gpio\n\n* Initial support for TM1638 modules\n\n### i2c\n\n* Added basic driver for BH1750 (light sensor), board GY-302\n* support for accel ADXL345\n\n### bb8/ollie/sprkplus\n\n* add Boost command\n* add Set Back LED Output command\n* add Set Raw Motor Values command\n* add Set Rotation Rate command\n* add Set Stabilization command\n\n### test\n\n* Refactor TestAdaptorDigitalPinConcurrency test\n\n## [v1.8.0](https://github.com/hybridgroup/gobot/compare/v1.7.1...v1.8.0) (2017-12-21)\n\n### sysfs\n\n* pause briefly to allow udev rules to apply when exporting PWMPin\n\n### beaglebone\n\n* correct uboot installation instructions\n* add SPI support\n* no more slots, add docs on configuring u-boot overlays\n* handle gpio pinmux without relying on specific pre-existing setup\n\n### pocketbeagle\n\n* add support for PocketBeagle\n* use universal io cape manager to initialize board setup\n* improve docs for latest Debian OS\n\n### build\n\n* Add dep, change how tests run in CI\n* update dependencies to latest GoCV version\n\n### spi\n\n* Add MCP3002, MCP3202, MCP3204, MCP3208, MCP3304, MCP3004, and MCP3008 A/D converter drivers\n* adding initial support for APA102 LEDs, thanks to code sample from @rakyll\n* extract shared SPI init code into spi package\n\n### up2\n\n* initial work on support for UP2 board\n\n### gopigo3\n\n* fixed set/get bug with motor dps\n\n### gpio\n\n* Adding stepper motor module\n\n### firmata\n\n* handle cases where out of sync data is read from serial port on first connecting\n\n### i2c\n\n* Change init payload sequence within jhd1313m1 driver Start() func.\n\n## [v1.7.1](https://github.com/hybridgroup/gobot/compare/v1.7.0...v1.7.1) (2017-11-05)\n\n### sprkplus\n\n* add new platform for Sphero SPRK+\n\n### firmata\n\n* correct problem where last analog pin(s) were being ignored from capabilities query\n\n### ble\n\n* use go-ble/ble fork for BLE interactions\n\n### build\n\n* update to use latest OpenCV version\n* update to use latest Golang versions\n\n## [v1.7.0](https://github.com/hybridgroup/gobot/compare/v1.6.1...v1.7.0) (2017-10-23)\n\n### curie\n\n* Add Linux specific step to Intel Curie docs\n\n### mqtt\n\n* Added SetCleanSession\n\n### build\n\n* add go1.9 to versions tested in Travis CI\n* add missing OpenCV lib dependency\n* Update build to use latest Golang versions\n* Travis build will now require sudo to install due to OpenCV\n\n### docs\n\n* some helpful edits for the initial spi implementation\n\n### gopigo3\n\n* integration of recent GoPiGo3 contributions\n* Added grove support, and more gopigo3 examples\n\n### gpio\n\n* Add ButtonDriver.DefaultState to allow for 'reverse' buttons (ones that go from HIGH to LOW)\n\n### holystone\n\n* Add initial support for HS-200\n\n### i2c\n\n* SSD1306.WithDisplayHeight() and SSD1306.WithDisplayWidth() for SSD1306 that use different display ratios\n\n### joystick\n\n* add CLI utilty to scan display events to make it easier to add new joyticks\n* update README to address #441\n\n### opencv\n\n* Switchover to use GoCV and OpenCV 3.3\n* Switch to use custom domain for GoCV package\n* all examples using new GoCV based code\n* correct formatting in face detect example\n* OpenCV face detector that is much more concurrent\n* update interface and examples to indicate multipurpose\n\n## [v1.6.1](https://github.com/hybridgroup/gobot/compare/v1.6.0...v1.6.1) (2017-07-15)\n\n### core\n\n* log failure errors on Robot Start()\n\n### build\n\n* run test coverage with covermode=set\n* update build to use Golang 1.7.6 and 1.8.3\n\n### docs\n\n* work on ROADMAP doc\n\n### sysfs\n\n* increase test coverage\n\n### bb8\n\n* use updated ble adaptor interface for tests\n\n### ble\n\n* allow for characteristic writes both with and without a response\n* allow override of specific HCI device to use\n* eliminate race conditions from response handling\n\n### curie\n\n* Implement Accelerometer, Gyroscope, and Temperature sensors implemented\n* motion detect implemented\n* shock detect implemented\n* step count implemented\n* tap detect implemented\n\n### digispark\n\n* update blink example to display error message on Start()\n* update README with latest development info\n\n### edison\n\n* auto-discovery of Edison board option\n* removed commented lines\n\n### firmata\n\n* expose WriteSysex to external callers\n* adjust client test timeout values\n* cleanup error handling for connection code\n* client tests don't need so many goroutines\n* expose WriteSysex to external callers\n* improve connection code to use a proper timeout\n* increase test coverage\n* make it possible to test external devices that use firmata adaptor\n* refactoring firmata client\n* remove circular import in test\n* remove unused code, increase test coverage\n* return connect errors to client\n* switch to using go-serial package\n* Sysex response events now being handled as expected\n\n### bme280\n\n* fix signed/unsigned bug\n* Fixed incorrect error condition check when reading the 'ctrl_hum' register.\n* Expanded the BME280 unit test for TestBME280DriverStart() to support reading from the 'ctrl_hum' register.\n* Enables humidity readings in the BME280 driver by enforcing the write to the 'ctrl_meas' register, as per Section 5.4.3 of the BME280 data sheet\n\n### chip\n\n* Fixed PWM duty cycle calculation for C.H.I.P ServoWrite\n* Fixed PWM init bug for C.H.I.P\n* C.H.I.P PWM init robust for already enabled state\n\n### i2c\n\n* remove unused test code\n* write config register in little endian\n\n### joystick\n\n* add needed constants for all PS3 buttons\n\n### littlewire\n\n* littlewire.cc links changed to littlewire.github.io\n\n### mavlink\n\n* switch to using go-serial package\n\n### megapi\n\n* switch to using go-serial package\n\n### microbit\n\n* use updated ble adaptor interface for tests\n\n### minidrone\n\n* add example for Parrot Mambo\n* add support for Mambo external accessories\n* increase test coverage\n* never expect responses for characteristic writes\n* remove unneeded code, increase test coverage\n* separate flight status processing and add test coverage\n\n### neurosky\n\n* switch to using go-serial package\n\n### ollie\n\n* use updated ble adaptor interface for tests\n\n### sphero\n\n* switch to using go-serial package\n\n### tinkerboard\n\n* Updated Tinkerboard and sysfs tests to updated PWM polarity contract\n\n## [v1.6.0](https://github.com/hybridgroup/gobot/compare/v1.5.0...v1.6.0) (2017-06-15)\n\n### Bb8\n\n* use updated ble adaptor interface for tests\n\n### Ble\n\n* eliminate race conditions from response handling\n* allow for characteristic writes both with and without a response\n* allow override of specific HCI device to use\n\n### Build\n\n* update build to use Golang 1.8.3\n* update build to use Golang 1.7.6 and 1.8.2\n* run test coverage with covermode=set\n\n### Core\n\n* log failure errors on Robot Start()\n\n### Curie\n\n* update docs formatting\n* add Curie to main README platform list\n* more improvements for README setup instructions\n* improve README info\n* improve tests and examples\n* increase test coverage\n* increase test coverage\n* motion detect implemented\n* tap detect implemented\n* step count implemented\n* shock detect implemented\n* Accelerometer, Gyroscope, and Temperature sensors implemented\n* WIP on adding support for Intel Curie IMU\n\n### Digispark\n\n* update blink example to display error message on Start()\n* update README with latest development info\n\n### Docs\n\n* add more wishlist to ROADMAP\n* add helpful information to examples themselves\n* correct installation instructions to match latest versions\n* more wishlish items for roadmap\n* update BLE connect info to latest\n* more work on ROADMAP doc\n* add first attempt at roadmap document\n\n### Edison\n\n* refactor auto-discovery of Edison board option\n* removed commented lines\n\n### Firmata\n\n* remove circular import in test\n* make it possible to test external devices that use firmata adaptor\n* Sysex response events now being handled as expected\n* expose WriteSysex to external callers\n* expose WriteSysex to external callers\n* cleanup error handling for connection code\n* improve connection code to use a proper timeout\n* remove unused code, increase test coverage\n* increase test coverage\n* switch to using go-serial package\n* return connect errors to client\n* client tests don't need so many goroutines\n* adjust client test timeout values\n* refactoring firmata client\n\n### Fix\n\n* signed/unsigned bug\n\n### Fixed\n\n* incorrect error condition check when reading the 'ctrl_hum' register. Expanded the BME280 unit test for TestBME280DriverStart() to support reading from the 'ctrl_hum' register.\n* PWM duty cycle calculation for C.H.I.P ServoWrite\n* PWM init bug for C.H.I.P\n\n### I2c\n\n* remove unused test code\n\n### Improved\n\n* BME280 humidity initialisation so that it does not override existing oversampling rates that have been set up for the ctrl_meas register.\n\n### Issue\n\n* [#424](https://github.com/hybridgroup/gobot/issues/424): Enables humidity readings in the BME280 driver by enforcing the write to the 'ctrl_meas' register, as per Section 5.4.3 of the BME280 data sheet\n\n### Joystick\n\n* add needed constants for all PS3 buttons\n\n### Made\n\n* C.H.I.P PWM init robust for already enabled state\n\n### Mavlink\n\n* switch to using go-serial package\n\n### Megapi\n\n* switch to using go-serial package\n\n### Microbit\n\n* use updated ble adaptor interface for tests\n\n### Minidrone\n\n* never expect responses for characteristic writes\n* add example for Parrot Mambo\n* separate flight status processing and add test coverage\n* add support for Mambo external accessories\n* remove unneeded code, increase test coverage\n* increase test coverage\n\n### Neurosky\n\n* switch to using go-serial package\n\n### Ollie\n\n* use updated ble adaptor interface for tests\n\n### Prepare\n\n* for v1.6.0 release\n\n### Release\n\n* correct changelog incorrect section titles\n\n### Sphero\n\n* switch to using go-serial package\n\n### Sysfs\n\n* increase test coverage\n\n### Updated\n\n* Tinkerboard and sysfs tests to updated PWM polarity contract\n\n### Write\n\n* config register in little endian\n\n## [v1.5.0](https://github.com/hybridgroup/gobot/compare/v1.4.0...v1.5.0) (2017-05-10)\n\n### core\n\n* Add Running() methods for Manager and Robot and increase test coverage accordingly\n\n### sysfs\n\n* define DigitalPinnerProvider and PWMPinnerProvider interfaces\n* add Chip to be able to change pwmchip, and some related refactoring\n* add file read/write testing for failure conditions\n* proper handling of busy state vs. other errors\n* return sensible result when no valid data read\n\n### test\n\n* increase coverage on test helpers\n\n### build\n\n* switching to Travis builds using Ubuntu 14.04 Trusty\n\n### aio\n\n* only need to support AnalogReader interface\n* avoid test race conditions\n* ensure that AnalogSensor event Data is always int\n\n### gpio\n\n* only need to support DigitalReader/DigitalWriter interface\n\n### i2c\n\n* Added support for the ADS1015 and ADS1115 ADCs\n* Add INA3221 Voltage Monitor\n* Ensure lock of i2c bus for each individual operation\n* Small refactoring and increase test coverage for BMP180\n\n### beaglebone\n\n* implement DigitalPinner and PWMPinner interfaces\n* protect against pin map races\n* increase test coverage\n\n### chip\n\n* add preliminary support for C.H.I.P. Pro\n* add back ServoWrite implementation\n* implement DigitalPinnerProvider and PWMPinnerProvider interfaces\n* protect against pin map races\n\n### dragonboard\n\n* export DigitalPin and PWMPin adaptor methods\n* protect against pin map races\n* increase test coverage\n\n### edison\n\n* auto-detect arduino breakout board, if no specific board is expected\n* ensure that we initialize tristate if arduino breakout board\n* export DigitalPin and PWMPin adaptor methods\n* implement DigitalPinnerProvider and PWMPinnerProvider interfaces\n* protect against pin map races\n* refactoring to reduce code duplication\n\n### firmata\n\n* remove processing that might have been eating test events, increase test coverage\n\n### joule\n\n* implement DigitalPinnerProvider and PWMPinnerProvider interfaces\n* protect against pin map races\n* remove incorrect pin assignment and improve test coverage\n* add examples using Joule with ADS1015 ADC\n* naming system changes\n* correct pin mappings and add PWM example\n\n### mavlink\n\n* add a Mavlink-over-UDP adaptor.\n\n### microbit\n\n* Add DigitalWriter, DigitalReader, and AnalogReader support using IOPinDriver\n* Handle start error and increase test coverage\n\n### mqtt\n\n* Add a (topic, payload) event type\n* change the On handler to take mqtt.Message\n* increase test coverage\n* update examples that use mqtt for updated notification signature\n\n### nats\n\n* change the On() handler to take the subject as an argument\n* increase test coverage\n\n### raspi\n\n* implement DigitalPinnerProvider and PWMPinnerProvider interfaces\n* add implementation for PWMPinner interface that wraps pi blaster\n* fix adaptor race conditions\n* increase test coverage\n\n### tinkerboard\n\n* Add support for ASUS Tinker Board\n\n## [v1.4.0](https://github.com/hybridgroup/gobot/compare/v1.3.0...v1.4.0) (2017-04-12)\n\n### core\n\n* Use 10-buffered chans for events, see #374\n\n### i2c\n\n* Many refactors and increases in test coverage\n* Eliminate race conditions introduced by tests\n* Adds Altitude() function to BMP280/BME280\n* bme280 driver Humidity compensation formula\n* ssd1306 driver implementation\n\n### aio\n\n* Eliminate race conditions introduced by tests\n\n### gpio\n\n* Fix motor mode change when speed is set\n* Eliminate race conditions introduced by tests\n* Reduce test side effects\n\n### ardrone\n\n* Increase test coverage\n\n### audio\n\n* Increase test coverage\n\n### bb8\n\n* Refactoring to use BLEConnector interface and provide tests\n\n### bebop\n\n* Increase test coverage\n\n### beaglebone\n\n* Increase test coverage\n\n### ble\n\n* Increase test coverage for battery, device information, and generic access drivers\n* Refactoring drivers to use BLEConnector interface and provide tests\n\n### chip\n\n* Added PWM0 support\n* Increase test coverage\n\n### digispark\n\n* Increase test coverage\n\n### dragonboard\n\n* Increase test coverage\n\n### edison\n\n* Remove pointless error checking code\n* Refactor digital pin creation process method\n* Increase test coverage\n\n### firmata\n\n* Eliminate race conditions introduced by tests\n* Increase test coverage for i2c commands\n\n### joule\n\n* Increase test coverage\n\n### joystick\n\n* Increase test coverage\n\n### keyboard\n\n* Increase test coverage\n\n### mavlink\n\n* Eliminate race conditions introduced by tests\n* Increase test coverage\n\n### mavlink\n\n* Increase test coverage\n\n### microbit\n\n* Refactoring to use BLEConnector interface and provide tests\n* Address #404 by adding info about required magnetometer calibration step to README\n* Increase test coverage\n\n### minidrone\n\n* Refactoring to use BLEConnector interface and provide tests\n\n### mqtt\n\n* Increase test coverage\n\n### nats\n\n* Increase test coverage\n\n### neurosky\n\n* Update neurosky README & example\n* Eliminate race conditions introduced by tests\n* Increase test coverage\n\n### ollie\n\n* Refactoring to use BLEConnector interface and provide tests\n* Correct race condition error on seq\n* Increase test coverage\n\n### opencv\n\n* Increase test coverage\n\n### particle\n\n* Increase test coverage\n\n### raspi\n\n* Address #391 by providing more details about normal development workflow\n* Increase test coverage\n\n### sphero\n\n* Eliminate race conditions\n* Increase test coverage\n\n### sysfs\n\n* Address race condition from udev rules when exporting GPIO pins\n* Increase test coverage\n\n### docs\n\n* Improve explanations for scp/ssh workflow on SoC boards\n* Include entire Apache 2.0 license in the license text\n\n### test\n\n* Add crude travis check for gofmt; format all sources\n* Significantly speed up travis and make runs\n* Remove test code no longer being called\n* Update Travis to run tests using Golang 1.8.1\n* Increase gobottest test coverage\n\n## [v1.3.0](https://github.com/hybridgroup/gobot/compare/v1.2.1...v1.3.0) (2017-03-22)\n\n### microbit\n\n* Add new platform support\n\n### dragonboard\n\n* Add new platform support\n\n### gpio\n\n* Increase test coverage\n\n### i2c\n\n* Update list of supported i2c devices\n* Minor adjustments and test coverage improvements\n* Added more capabilities checks for I2C\n* Removed smbus block operations\n\n### core\n\n* Increase test coverage\n\n### test\n\n* Improvements to run tests much faster thanks @maruel\n* Use codecov.io for code coverage reporting\n\n### docs\n\n* Update CoC based on Contributor Covenant\n\n## [v1.2.1](https://github.com/hybridgroup/gobot/compare/v1.2.0...v1.2.1) (2017-02-16)\n\n### Allow\n\n* NATS options to pass in the NATS adaptor for TLS support.\n\n### Chip\n\n* correct docs to describe valid pin mappings\n\n### Update\n\n* version to 1.2.1 for point release\n\n## [v1.2.0](https://github.com/hybridgroup/gobot/compare/v1.1.0...v1.2.0) (2017-02-16)\n\n### core\n\n* Use new improved default namer to avoid API conflicts\n\n### gpio\n\n* Removed scaling function from servo driver\n* Correct servo driver to pass along angle to adaptor to sort out implementation\n\n### i2c\n\n* Refactored platforms and drivers to new I2C interfaces\n* Change to make I2C support more than one bus\n* Refactor drivers to support new optional params\n\n### bb8\n\n* Added collision detection support and example\n\n### beaglebone\n\n* Correct i2c buses to match actual mapping\n\n### ble\n\n* Switch to using [ble](https://github.com/currantlabs/ble) package for Bluetooth LE\n* Basic serial over BLE working with Arduino101 with StandardFirmataBLE\n* WIP on multiple simultaneous ble devices\n\n### chip\n\n* Fixed chip XIO base address lookup\n\n### digispark\n\n* Fix #288 by using pkg-config to locate libusb-compat includes\n\n### firmata\n\n* Remove race conditions identified in Firmata client\n* Correct error in I2C reads not listening to board events\n\n### mqtt\n\n* Add driver for syntactical sugar around virtual devices\n* Add SSL/TLS client options support\n* Fix #277 by adding SetAutoReconnect method to set Paho MQTT client\n* Change both 'On' and 'Publish' method function signatures to match Eventer interface\n\n### nats\n\n* Add driver to make it easier to create virtual devices\n\n### ollie\n\n* Added collision detection support and example\n\n### parrot\n\n* Add ValidatePitch helper function for Parrot Minidrone, Parrot Bebop & ARDrone 2.0 to package\n\n### docs\n\n* Fix #363 by using atomic.Value to protect current values used by multiple goroutines in drone examples\n\n### test\n\n* Remove Golang 1.5 from TravisCI tests in prep for Golang 1.8 release\n\n## [v1.1.0](https://github.com/hybridgroup/gobot/compare/v1.0.0...v1.1.0) (2017-01-09)\n\n### core\n\n* use canonical import path for sysfs package\n\n### i2c\n\n* Add a driver for the SHT3X chip\n* Add a driver for BMP180\n* Add support for L3GD20H gyroscope\n\n### firmata\n\n* Add support for TCPFirmata connections, allowing ESP8266 and other WiFi-connected controllers\n* Add mention to README to use 'tty.' serial port on OSX\n* Add mention of A4 and A5 normally unavailable on Firmata\n\n### raspi\n\n* Correct README build instructions with missing 'go build' command\n\n### snapcraft\n\n* Add the packaging metadata to build the gobot snap for Ubuntu Snappy\n\n### particle\n\n* Update examples to take key params via command line\n* Address #160 by adding support for tinker-servo sketch if installed on Particle device\n\n### esp8266 add experimental ESP8266 support to list of supported platforms\n\n### sysfs\n\n* Should fix #272 by using first byte of data as command register for I2C reads\n* Some additional cleanup suggested by golint\n\n### ble\n\n* Add generic access service driver\n* Update docs to include reference to included drivers\n* Move various test code to test file\n\n### ollie\n\n* Refactoring so no need to expose internal implementation details\n\n### bebop\n\n* Add support/example of RTP video\n* Enable video on firmware 3.3+\n* Update ps3 and video example to enable the video stream\n* Update README for brief explanation of how to get drone video\n* Corrected import paths for client examples\n\n### bb8\n\n* Correct NewDriver params and set name\n* Add missing constructor to wrap Ollie implementation\n\n### minidrone\n\n* Update README with example and which specific models are currently supported\n* Add all piloting flying state events\n* Adds Emergency() and TakePicture() commands\n\n### test\n\n* Add Golang 1.8beta2 to Travis builds\n* Correct aio references for AnalogRead tests\n\n## [v1.0.0](https://github.com/hybridgroup/gobot/compare/v0.13.0...v1.0.0) (2016-12-21)\n\n### core\n\n* Refactoring to allow 'Metal' development using Gobot packages\n* Able to run robots without being part of a Manager.\n* Now running all work in separate goroutines\n* Rename internal name of Manager type\n* Refactor events to use channels all the way down.\n* Eliminate potential race conditions from Events and Every functions\n* Add Unsubscribe() to Eventer, now Once() works as expected\n* DeleteEvent function added to Eventer interface\n* Ranges over event channels instead of using select\n* No longer return non-standard slices of errors, instead use hashicorp/go-multierror\n* Ensure that all drivers have default names\n* Now both Robot and Manager operate using AutoRun as expected\n* Use canonical import domain of gobot.io for all code\n* Use time.Sleep unless waiting for a timeout in a select\n* Uses time.NewTimer() instead of time.After() to be more efficient\n\n### test\n\n* Add deps tasks to Makefile\n* Add golang 1.7 to Travis CI tests\n* Add golang 1.8beta1 to build matrix for Travis\n* Reduce Travis builds to golang 1.4+ since it is late 2016 already\n* Complete move of test interfaces into the test files where they belong\n* Adds Parrot Minidrone and Sphero Ollie to Travis tests\n\n### Add missing godocs for everything\n\n### i2c\n\n* Move I2C drivers into appropriately named 'drivers/i2c' directory\n* Add support for Adafruit Servo/PWM HAT\n\n### gpio\n\n* Move GPIO drivers into appropriately named 'drivers/gpio' directory\n* Add support for PIR motion detector\n\n### beaglebone\n\n* auto-detect Linux kernel version\n* map usr LEDs to match all kernels\n\n### ble\n\n* Rename drivers to make them more obvious\n* Add test placeholders\n\n### chip\n\n* Auto-detect OS version to adjust pin mappings\n* Correct base for new 4.4 GPIO\n\n### edison\n\n* Support for other breakout boards besides Arduino\n\n### firmata\n\n* Use io.ReadFull in platforms/firmata/client\n* Update tarm/goserial to tarm/serial\n\n### joule\n\n* Add support for Intel Joule\n\n### megapi\n\n* Adding support for MakeBlock megapi\n\n### nats\n\n* Add support for NATS server\n\n### particle\n\n* Complete renaming Spark platform to Particle\n\n\n### parrot\n* Move Parrot Minidrone into own platform\n* Move both ARDrone and Bebop under Parrot package\n\n### raspi\n\n* Add missing godocs and small refactors for platform\n\n### sphero\n\n* Add initial support for Sphero BB-8 platform\n* Move Sphero Ollie into own platform\n\n## [v0.13.0](https://github.com/hybridgroup/gobot/compare/v0.12.1...v0.13.0) (2016-10-10)\n\n### Add\n\n* PinMode test case\n* PinMode func for MCP23017\n* example for Edison blink demo without gobot initialization.\n* ServoConfig to the FirmataAdaptor\n* unit tests for ServoConfig\n\n### Adding\n\n* support for MakeBlock megapi\n* tests for the Adafruit driver, and corresponding minor driver changes.\n* support for MakeBlock megapi\n* a Servo example program for the Adafruit Servo Hat driver code.\n* support for the Adafruit Servo/PWM HAT.  This required a slight refactor to the existing Motor HAT code to support multiple I2C addresses.\n* two API funcs for the Adafruit driver with respect to the DC Motor, fleshing out the raspi_adafruit example with a runner function.\n* the initial NATS platform support\n\n### Another\n\n* attempt at correct Travis syntax for gnatsd -[#5](https://github.com/hybridgroup/gobot/issues/5)\n* attempt at correct Travis syntax for gnatsd -[#4](https://github.com/hybridgroup/gobot/issues/4)\n* attempt at correct Travis syntax for gnatsd -[#3](https://github.com/hybridgroup/gobot/issues/3)\n* attempt at correct Travis syntax for gnatsd -[#2](https://github.com/hybridgroup/gobot/issues/2)\n* attempt at correct Travis syntax for gnatsd\n\n### Ble\n\n* fix unused var\n* populate descriptors after descovering characterisitcs\n\n### Bug\n\n* fix in the Adafruit stepper code, specifically with respect to the AdafruitDouble step-style.\n\n### Code\n\n* cleanups suggested by gosimple\n\n### Core\n\n* update README with an example of 'Metal' Gobot\n* should correct occasional test errors due to event overlap with test\n* correct behavior in Mavlink driver, correct tests to match\n* Add Unsubscribe() to eventer, now Once() works as expected\n* Add further tests for Eventer\n* cleanup comments on Eventer interface\n* function DeleteEvent added to Eventer interface\n* Refactor tests to allow 'metal' development using Gobot adaptors/drivers.\n* Refactor tests to allow 'metal' development using Gobot adaptors/drivers.\n* Refactor tests to allow 'metal' development using Gobot adaptors/drivers.\n* Refactor examples to allow 'metal' development using Gobot adaptors/drivers.\n* Refactoring to allow 'metal' development using Gobot adaptors/drivers.\n* Continue refactoring to allow 'metal' development using Gobot libs.\n* Refactor events to use channels all the way down. Allows 'metal' development using Gobot libs.\n* update README with an example of 'Metal' Gobot\n* should correct occasional test errors due to event overlap with test\n* correct behavior in Mavlink driver, correct tests to match\n* Add Unsubscribe() to eventer, now Once() works as expected\n* Add further tests for Eventer\n* cleanup comments on Eventer interface\n* function DeleteEvent added to Eventer interface\n* Refactor tests to allow 'metal' development using Gobot adaptors/drivers.\n* Refactor tests to allow 'metal' development using Gobot adaptors/drivers.\n* Refactor tests to allow 'metal' development using Gobot adaptors/drivers.\n* Refactor examples to allow 'metal' development using Gobot adaptors/drivers.\n* Refactoring to allow 'metal' development using Gobot adaptors/drivers.\n* Continue refactoring to allow 'metal' development using Gobot libs.\n* Refactor events to use channels all the way down. Allows 'metal' development using Gobot libs.\n\n### Docs\n\n* go fmt files that needed it from recent changes\n* go fmt files that needed it from recent changes\n\n### File\n\n* rename, adding a test file for the Adafruit driver, and slight func naming changes.\n* rename, adding a test file for the Adafruit driver, and slight func naming changes.\n\n### Fix\n\n* a typo and update the doc comment for FirmataAdaptor.ServoConfig\n* the ServoConfig byte order\n* issues flagged by 'go vet'\n* misspellings\n\n### Fixing\n\n* some code and finally have Travis building\n* tests, adding a few more, adding nats server to Travis CI for testing\n\n### Initial\n\n* significant changes to the Adafruit Motor HAT driver to support Stepper Motors.\n* commit of driver code, with accompanying example, for the Adafruit_MotorHat.\n\n### Joule\n\n* add i2c example and notes to README about pullup resistors\n* adds pin mappings from the second header\n* add pin mapping info to README\n* go fmt the multi-LED example\n\n### Merge\n\n* branch 'dev' of github.com:jfinken/gobot into dev\n* branch 'dev' of github.com:jfinken/gobot into dev\n\n### Misc\n\n* update all LICENSE files for current year\n\n### More\n\n* explicit initialization in Start, slight refactor, and separate DC Motor and Stepper Motor examples.\n\n### Move\n\n* interface assertions to test files.\n\n### Release\n\n* update to version 0.13.0\n\n### Remove\n\n* debug message from i2c_device.go\n\n### Removing\n\n* the raspi_adafruit program as it has been split into three separate programs, removing my Makefile for the raspi adafruit programs, and fixing up a few comments.\n* my fork from the Adafruit tests.\n\n### Starting\n\n* support for Intel Joule with the built-in LEDs and more\n\n### Test\n\n* add golang 1.7 to Travis CI tests\n* add golang 1.7 to Travis CI tests\n\n### Tests\n\n* complete move of test interfaces into the test files where they belong\n* refactor test interfaces out of implementations and into the tests where they belong\n\n### Update\n\n* READMEs with up to date info for Edison/Joule\n\n### Updating\n\n* platform support info\n\n\n## [v0.12.1](https://github.com/hybridgroup/gobot/compare/v0.12.0...v0.12.1) (2016-07-13)\n\n### A\n\n* little more WIP, can open a connection to a specific peripheral\n\n### Add\n\n* MQTT authentication support\n* MQTT authentication support\n* Go Reportcard badge for fun\n* Go Reportcard badge for fun\n\n### Added\n\n* example of how to use temp36 temperature sensor with firmata\n* example of how to use temp36 temperature sensor with firmata\n\n### Adds\n\n* support for Dualshock4 wireless gamepad\n* support for Dualshock4 wireless gamepad\n\n### Allow\n\n* failures in Travis builds for Golang 1.3 due to SDL changes\n\n### Almost\n\n* reading battery info\n\n### BLE\n\n* seems to require Golang 1.4+\n\n### Can\n\n* see BLE devices, and connect to a specific one\n\n### Change\n\n* default value for PCMD flag to match the Bebop 2.0.57+ expectations\n* default value for PCMD flag to match the Bebop 2.0.57+ expectations\n* test delay to 50ms\n* test delay to 50ms\n\n### Code\n\n* cleanup, improve go report card\n* cleanup, improve go report card\n\n### Fix\n\n* specs\n* specs\n* for analog (quick changes lag)\n* for analog (quick changes lag)\n* [#201](https://github.com/hybridgroup/gobot/issues/201) by add 'make examples' command to Makefile\n* mavlink link typo\n\n### Fixes\n\n* failing test\n* failing test\n\n### Go\n\n* fmt the code\n\n### Increase\n\n* hover time and remove cruft from simple Bebop drone example\n* hover time and remove cruft from simple Bebop drone example\n\n### Introduce\n\n* `gobottest` package with test helpers\n* `gobottest` package with test helpers\n\n### Make\n\n* dev branch target more explicit\n\n### Making\n\n* sure tests pass\n\n### Merge\n\n* branch 'feature/audio' into dev\n* branch 'bugfix/gpio-button-tests' into dev\n* branch 'feature/ble' into feature/ble-wip\n\n### More\n\n* WIP on reading characteristics\n\n### Pin\n\n* 229 value left out of test fixture on edison\n\n### Refactor\n\n* to use `gobottest` test helpers\n* to use `gobottest` test helpers\n\n### Remove\n\n* fmt no longer used here\n* commented lines\n* test code\n\n### Resolve\n\n* merge conflicts\n* merge conflict in Travis CI file\n\n### Simple\n\n* implementation that can read data\n\n### Support\n\n* gpio pin turn on and off\n* gpio pin turn on and off\n\n### Switching\n\n* to currantlabs fork of gatt, and some related refactoring\n\n### Test\n\n* generated error messages as well\n* generated error messages as well\n\n### Tests\n\n* also need to be pointed to [@veandco](https://github.com/veandco) go-sdl2 fork\n\n### Update\n\n* to 0.12.1\n* missing changelog entries\n* missing changelog entries\n* ARDrone face tracking example to use main go-opencv fork\n\n### Use\n\n* main go-sdl fork from [@veandco](https://github.com/veandco) to pickup any upstream changes\n* OpenCV 2.4, as well as switch to main fork of go-opencv\n* Seek to speed up read/write in sysfs\n\n### WIP\n\n* on BLE\n\n## [v0.12.0](https://github.com/hybridgroup/gobot/compare/v.0.11.1...v0.12.0) (2016-07-13)\n\n### Refactor Gobot test helpers into separate package\n\n### Improve Gobot.Every method to return channel, allowing it to be halted\n\n### Refactor of sysfs adds substantial speed improvements\n\n### ble\n\n* Experimental support for Bluetooth LE.\n* Initial support for Battery & Device Information services\n* Initial support for Sphero BLE robots such as Ollie\n* Initial support for Parrot Minidrone\n\n### audio\n\n* Add new platform for Audio playback\n\n### gpio\n\n* Support added for new GPIO device:\n* RGB LED\n* Bugfixes:\n* Correct analog to better handle quick changes\n* Correct handling of errors and buffering for Wiichuk\n\n### mqtt\n\n* Add support for MQTT authentication\n\n### opencv\n\n* Switching to use main fork of OpenCV\n* Some minor bugfixes related to face tracking\n\n## [v.0.11.1](https://github.com/hybridgroup/gobot/compare/v0.11.0...v.0.11.1) (2016-02-17)\n\n### Add\n\n* support for 'hand' and 'gesture' Leap Motion events\n* MMA7660 accelerometer example for C.H.I.P.\n* C.H.I.P. to supported platforms\n* support for the CHIP platform\n* MCP23017 write and read functionality to GPIO\n\n### Adds\n\n* MCP23017 i2c device to README\n* additional examples for C.H.I.P.\n\n### Better\n\n* I2C device descriptions in README\n\n### Correct\n\n* the release command sent to pi-blaster.\n* Intel Edison docs location thanks to [@seanmarcia](https://github.com/seanmarcia)\n\n### Default\n\n* the new MQTT 'AutoReconnect' to false\n\n### Failure\n\n* is no longer an option for Go 1.6\n\n### Fix\n\n* [#236](https://github.com/hybridgroup/gobot/issues/236) & fix [#239](https://github.com/hybridgroup/gobot/issues/239) by correcting initialization and temperature conversion for MPU-6050\n\n### Fixed\n\n* event race condition\n\n### Get\n\n* I2C functionality before doing SMBus block I/O\n\n### Golang\n\n* 1.3.3 still works, adding back to build\n\n### Increase\n\n* button delay hack for test suite\n* test delay hack for button tests\n\n### Name\n\n* C.H.I.P. pins according to printed names\n\n### Need\n\n* to explicitly set content type to text/html for Robeaux main page\n\n### No\n\n* coveralls repo token for provate repos?\n\n### Remove\n\n* coveralls badge\n\n### Run\n\n* builds against the latest major releases\n\n### The\n\n* take-off-before-event-handling bug again\n\n### Trying\n\n* to remove coveralls based code coverage\n* conditional build before_install\n* conditional build\n\n### Update\n\n* version to v.0.11.1\n* version to 0.11\n* MQTT README for latest info\n* targeted golang versions to include 1.6, and to begin deprecating 1.3.3 and earlier\n* coveralls badge in README\n* API example\n\n### Use\n\n* newer naming system for C.H.I.P. pins\n\n### What\n\n* about -v\n\n### Why\n\n* do this twice?\n\n## [v0.11.0](https://github.com/hybridgroup/gobot/compare/0.10.0...v0.11.0) (2016-02-17)\n\n### Support for Golang 1.6\n\n### Determine I2C adaptor capabilities dynamically to avoid use of block I/O when unavailable\n\n### chip\n\n* Add support for GPIO & I2C interfaces on C.H.I.P. $9 computer\n\n### leap motion\n\n* Add support additional \"hand\" and \"gesture\" events\n\n### mqtt\n\n* Support latest update to Eclipse Paho MQTT client library\n\n### raspberry pi\n\n* Proper release of Pi Blaster for PWM pins\n\n### bebop\n\n* Prevent event race conditions on takeoff/landing\n\n### i2c\n\n* Support added for new i2c device:\n* MCP23017 Port Expander\n* Bugfixes:\n* Correct init and data parsing for MPU-6050\n* Correct handling of errors and buffering for Wiichuk\n\n## [0.10.0](https://github.com/hybridgroup/gobot/compare/0.8.2...0.10.0) (2015-10-27)\n\n### Refactor core to cleanup robot initialization and shutdown\n\n### Remove unnecessary goroutines spawned by NewEvent\n\n### api\n\n* Update Robeaux to v0.5.0\n\n### bebop\n\n* Add support for the Parrot Bebop drone\n\n### keyboard\n\n* Add support for keyboard control\n\n### gpio\n\n* Support added for 10 new Grove GPIO devices:\n* Grove Touch Sensor\n* Grove Sound Sensor\n* Grove Button\n* Grove Buzzer\n* Grove Led\n* Grove Light Sensor\n* Grove Vibration Sensor\n* Grove Rotary\n* Grove Relay\n* Grove Temperature Sensor\n\n### i2c\n\n* Support added for 2 new Grove i2c devices:\n* Grove Accelerometer\n* Grove LCD with RGB backlit display\n\n### docs\n\n* Many useful fixes and updates for docs, mostly contributed by our wonderful community.\n\n## [0.8.2](https://github.com/hybridgroup/gobot/compare/0.8.1...0.8.2) (2015-06-30)\n\n### firmata\n\n* Refactor firmata adaptor and split firmata protocol implementation into sub `client` package\n\n### gpio\n\n* Add support for LIDAR-Lite\n\n### raspi\n\n* Add PWM support via pi-blaster\n\n### sphero\n\n* Add `ConfigureLocator`, `ReadLocator` and `SetRotationRate`\n\n## [0.8.1](https://github.com/hybridgroup/gobot/compare/0.8...0.8.1) (2014-12-28)\n\n### spark\n\n* Add support for spark Events, Functions and Variables\n\n### sphero\n\n* Add `SetDataStreaming` and `ConfigureCollisionDetection` methods\n\n## [0.8](https://github.com/hybridgroup/gobot/compare/0.7.1...0.8) (2014-12-24)\n\n### Refactor core, gpio, and i2c interfaces\n\n### Correctly pass errors throughout packages and remove all panics\n\n### Numerous bug fixes and performance improvements\n\n### api\n\n* Update robeaux to v0.3.0\n\n### firmata\n\n* Add optional io.ReadWriteCloser parameter to FirmataAdaptor\n* Fix `thread exhaustion` error\n\n### cli\n\n* generator\n\n*  Update generator for new adaptor and driver interfaces\n\n*  Add driver, adaptor and project generators\n\n*  Add optional package name parameter\n\n## [0.7.1](https://github.com/hybridgroup/gobot/compare/0.7...0.7.1) (2014-11-17)\n\n### opencv\n\n* Fix pthread_create issue on Mac OS\n\n## [0.7](https://github.com/hybridgroup/gobot/compare/0.6.3...0.7) (2014-11-10)\n\n### Dramatically increased test coverage and documentation\n\n### api\n\n* Conform to the [cppp.io](https://gobot.io/x/cppp-io) spec\n* Add support for basic middleware\n* Add support for custom routes\n* Add SSE support\n\n### ardrone\n\n* Add optional parameter to specify the drones network address\n\n### core\n\n* Add `Once(e *Event, f func(s interface{})` Event function\n* Rename `Expect` to `Assert` and add `Refute` test helper function\n\n### i2c\n\n* Add support for MPL115A2\n* Add support for MPU6050\n\n### mavlink\n\n* Add support for `common` mavlink messages\n\n### mqtt\n\n* Add support for mqtt\n\n### raspi\n\n* Add support for the Raspberry Pi\n\n### sphero\n\n* Enable stop on sphero disconnect\n* Add `Collision` data struct\n\n### sysfs\n\n* Add generic linux filesystem gpio implementation\n\n## [0.6.3](https://github.com/hybridgroup/gobot/compare/0.6.2...0.6.3) (2014-09-24)\n\n### Add support for the Intel Edison\n\n## [0.6.2](https://github.com/hybridgroup/gobot/compare/0.6.1...0.6.2) (2014-07-28)\n\n### cli\n\n* Fix typo in generator\n\n### leap\n\n* Fix incorrect Port reference\n* Fix incorrect Event name\n\n### neurosky\n\n* Fix incorrect Event names\n\n### sphero\n\n* Correctly format output of GetRGB\n\n## [0.6.1](https://github.com/hybridgroup/gobot/compare/0.6...0.6.1) (2014-07-12)\n\n### cli\n\n* Fix template error in generator\n\n## [0.6](https://github.com/hybridgroup/gobot/compare/0.5.2...0.6) (2014-07-11)\n\n### api\n\n* Add robeaux support\n\n### core\n\n* Refactor `Connection` and `Device`\n* Connections are now a collection of Adaptors\n* Devices are now a collection of Drivers\n* Add `Event(string)` function instead of `Events[string]` for retrieving Driver event\n* Add `AddEvent(string)` function to register an event on a Driver\n\n### firmata\n\n* Fix slice bounds out of range error\n\n### sphero\n\n* Fix issue where the driver would not halt correctly on OSX\n\n## [0.5.2](https://github.com/hybridgroup/gobot/compare/0.5.1...0.5.2) (2014-06-30)\n\n### beaglebone\n\n* Add `DirectPinDriver`\n* Ensure slots are properly loaded\n\n## [0.5.1](https://github.com/hybridgroup/gobot/compare/0.5...0.5.1) (2014-06-28)\n\n### core\n\n* Add `Version()` function for Gobot version retrieval\n\n### firmata\n\n* Fix issue with reading analog inputs\n* Add `data` event for `AnalogSensorDriver`\n\n## [0.5](https://github.com/hybridgroup/gobot/compare/0.4...0.5) (2014-06-17)\n\n### Idomatic clean up\n\n* Removed reflections throughout packages\n* All officially supported platforms are now in ./platforms\n* API is now a new package ./api\n* All platforms examples are in ./examples\n* Replaced martini with net/http\n* Replaced ginkgo/gomega with system testing package\n* Refactor gobot/robot/device commands\n* Added Event type\n* Replaced Manager type with Gobot type\n* Every` and `After` now accept `time.Duration`\n* Removed reflection helper methods\n\n## [0.4](https://github.com/hybridgroup/gobot/compare/0.3...0.4) (2014-06-12)\n\n### API\n\n* commands now return an array of results\n\n### Add\n\n* cors support\n* basic auth support to api\n* Joystick & Neurosky platforms to README\n* utils tests\n* coveralls\n\n### Allow\n\n* user to set Host and Port when starting up Api\n\n### Change\n\n* README image source to gobot-site repo\n* startApi to private function\n\n### Display\n\n* warning when using API without SSL\n\n### Fixed\n\n* the logo link\n\n### Format\n\n* device and connection type\n\n### Green\n\n* tests\n\n### More\n\n* api test coverage\n* tests\n\n### Refactor\n\n* tests\n\n### Remove\n\n* Travis build from IRC\n* ConnectToSerial\n* ConnectToTcp util\n* Reconnect and Disconnect from AdaptorInterface\n\n### Robot\n\n* is now a pointer\n\n### SSL\n\n* support in Api\n\n### Update\n\n* README.md\n* README for new API security features\n* api robeaux api compatibility\n* .travis.yml\n* generated driver\n* examples\n* coveralls badge\n* platforms and drivers\n\n### Use\n\n* go-martini/martini\n\n### WIP\n\n* for API host/port params\n* api tests\n\n\n## [0.3](https://github.com/hybridgroup/gobot/compare/0.2...0.3) (2014-04-07)\n\n### Add\n\n* Godeps file\n* IRC notifications to Travis builds\n* tests for generated projects\n* Init function to DriverInterface\n* Halt function to DriverInterface\n* more GPIO devices to README\n* scale functions\n\n### All\n\n* updates for new gonuts/commander api\n\n### Fix\n\n* typo in generator\n\n### Merge\n\n* branch 'master' of github.com:hybridgroup/gobot\n\n### Update\n\n* generator\n\n## [0.2](https://github.com/hybridgroup/gobot/compare/0.1...0.2) (2014-02-04)\n\n### Add\n\n* robeaux submodule\n* Finalize on SIGINT\n* Publish function for driver events\n* device test coverage\n* manager and robot test coverage\n\n### Clean\n\n* up tests\n\n### Do\n\n* not run tests on gobot.io branch\n\n### JSON\n\n* compatibility with cylon and artoo\n\n### More\n\n* test coverage\n\n### Refactor\n\n* robot and manager\n\n### Remove\n\n* robeaux submodule\n\n### Update\n\n* README.md\n* examples\n\n### Use\n\n* golang log\n\n### WIP\n\n* robeaux support\n\n## 0.1 (2013-12-30)\n\n### Accept\n\n* POST and GET for commands\n\n### Adaptor\n\n* and driver generator\n\n### Add\n\n* support for additional parameters\n* serialport support\n* Travis banner to README\n* api commands\n* POST command\n* manager example\n* robot manager\n* Sphero example\n* Digispark to list of supported platforms\n* helper functions\n* Driver channel for events\n* port to adaptor\n\n### Alter\n\n* structure\n\n### Beaglebone\n\n* Black GPIO\n\n### Clean\n\n* up files\n* up variables\n* up some comments\n\n### Correctly\n\n* start drivers\n\n### DRY\n\n* up On function\n\n### Dots\n\n* for ignoring imports\n\n### Drop\n\n* unnecessary api parameters\n\n### Expose\n\n* robot functions via api\n\n### Fix\n\n* example\n\n### Go\n\n* fmt examples\n\n### Initial\n\n* GETs for api\n* commit\n\n### Install\n\n* ginkgo and gomega dependencies\n\n### Merge\n\n* branch 'examples'\n* branch 'master' into ginkgo\n* branch 'master' into ginkgo\n\n### More\n\n* WIP of base structs\n\n### Now\n\n* using Connection.Connect()\n\n### Pending\n\n* tests for Robot\n\n### Proper\n\n* formatting for README example\n\n### Properly\n\n* set default interval\n\n### Refactor\n\n* robot name assignment func, and tests to prove it\n\n### Reformat\n\n* examples using gofmt\n* source using gofmt\n\n### Remove\n\n* Params from driver struct\n* extra nesting\n\n### Rename\n\n* Gobot struct to Manager\n\n### Set\n\n* GOMAXPROCS property in GobotManager\n\n### Skeleton\n\n* for ginkgo/gomega testing\n\n### Small\n\n* refactor\n* robot refactor\n\n### StartDriver\n\n* is now optional\n\n### Switch\n\n* to adaptor, driver, connection and device interfaces\n\n### Travis\n\n* lang build\n\n### Tweak\n\n* json output\n\n### Update\n\n* examples\n* README.md\n* timers and fix issues\n\n### WIP\n\n* multiple robot support\n* connections and devices\n\n### Work\n\n* is optional\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of experience,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\nadvances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at gobot@hybridgroup.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Gobot\n\n## Target Branch\n\n**Please open all non-hotfix PRs against the `dev` branch!**\n\nGobot follows a [\"git flow\"](http://nvie.com/posts/a-successful-git-branching-model/)-style model for managing development.\n\n## Issue Contributions\n\nWhen opening new issues or commenting on existing issues on this repository\nplease make sure discussions are related to concrete technical issues with the\nGobot software.\n\n## Code Contributions\n\nThe Gobot project welcomes new contributors.\n\nThis document will guide you through the contribution process.\n\nWhat do you want to contribute?\n\n* I want to otherwise correct or improve the docs or examples\n* I want to report a bug\n* I want to add some feature or functionality to an existing hardware platform\n* I want to add support for a new hardware platform\n\nDescriptions for each of these will eventually be provided below.\n\n## General Guidelines\n\n* All active development is in the `dev` branch. New or updated features must be added to the `dev` branch.\n* All patches must be provided under the Apache 2.0 License\n* Please use the -S option in git to \"sign off\" that the commit is your work and you are providing it under the\n  Apache 2.0 License\n* Submit a Github Pull Request to the appropriate branch and describe the changes sufficient.\n* Please follow our naming conventions for Pull Requests.\n* We will look at the patch, test it out, and give you feedback.\n* Avoid doing minor whitespace changes, renamings, etc. along with merged content. These will be done by the maintainers\n  from time to time but they can complicate merges and should be done separately.\n* Take care to maintain the existing coding style.\n* `golangci-lint` your code, see [instruction for local installation](https://golangci-lint.run/usage/install/#local-installation)\n* `gofumpt` your code (the go version will be automatically obtained from go.mod), see [instructions](https://github.com/mvdan/gofumpt/blob/master/README.md)\n* Add unit tests for any new or changed functionality and run tests with `-race` flag activated.\n* All pull requests should be \"fast forward\"\n  * If there are commits after yours use “git rebase -i <new_head_branch>”\n  * If you have local changes you may need to use “git stash”\n  * For git help see [progit](http://git-scm.com/book) which is an awesome (and free) book on git\n* Use one of the latest existing platforms/drivers etc. as a blueprint for creating a new one\n\n## Creating Pull Requests\n\nBecause Gobot makes use of self-referencing import paths, you will want\nto implement the local copy of your fork as a remote on your copy of the\noriginal Gobot repo. Katrina Owen has [an excellent post on this workflow](https://splice.com/blog/contributing-open-source-git-repositories-go/).\n\nThe basics are as follows:\n\n1. Fork the project via the GitHub UI\n\n2. `git clone` the upstream repo and set it up as the `upstream` remote and your own repo as the `origin` remote:\n\n    `git clone https://github.com/hybridgroup/gobot.git`\n    `cd $GOPATH/src/gobot.io/x/gobot`\n    `git remote rename origin upstream`\n    `git remote add origin git@github.com/YOUR_GITHUB_NAME/gobot`\n\n    All import paths should now work fine assuming that you've got the\n    proper branch checked out.\n\n3. Get all dependencies:\n\n   * `cd $GOPATH/src/gobot.io/x/gobot`\n   * `go mod tidy` will fetch  all the dependencies at their needed version.\n\n## Landing Pull Requests\n\n(This is for committers only. If you are unsure whether you are a committer, you are not.)\n\n1. Set the contributor's fork as an upstream on your checkout\n\n   `git remote add contrib1 https://github.com/contrib1/gobot`\n\n2. Fetch the contributor's repo\n\n   `git fetch contrib1`\n\n3. Checkout a copy of the PR branch\n\n   `git checkout pr-1234 --track contrib1/branch-for-pr-1234`\n\n4. Review the PR as normal\n\n5. Land when you're ready via the GitHub UI\n\n## Convention for Pull Request Descriptions\n\nMaking unified descriptions helps a lot to generate the [CHANGELOG](./CHANGELOG.md) for the next release.\nWe support the style from <https://www.conventionalcommits.org>, so you can use something like this:\n\n* type(scope): description\n* i2c(PCF8583): added\n* gpio(HD44780): fix wrong constants\n* raspi(PWM): refactor usage\n* docs(core): usage of Kernel driver\n* or alternative: core(docs): usage of Kernel driver\n* build(style): adjust rule for golangci-lint\n\nWe try to keep it as simple as possible:\n\n* Do not use \"fix\" or \"bugfix\" for `type`\n* Please assign \"fix\", \"style\", \"refactor\", \"perf\", \"test\" etc. to the related `type` (driver-type/platform-name etc.),\n  and start the description with e.g. \"fix...\", \"test...\" etc.\n* For `type` use the name of the deepest folder (e.g. i2c/raspi/system). Feel free to order \"examples\" to the\n  related driver.\n* Further values for `type` are: \"docs\", \"build\", \"core\"\n* Please use \"build\" instead of \"CI\"\n* For the `scope` use the name of the driver or feature (e.g. grove/PWM).\n* If unsure don't panic, follow your feeling. Possibly the reviewer will correct it or suggest a better description.\n\n## Developer's Certificate of Origin 1.0\n\nBy making a contribution to this project, I certify that:\n\n* (a) The contribution was created in whole or in part by me and I\n  have the right to submit it under the open source license indicated\n  in the file; or\n* (b) The contribution is based upon previous work that, to the best\n  of my knowledge, is covered under an appropriate open source license\n  and I have the right under that license to submit that work with\n  modifications, whether created in whole or in part by me, under the\n  same open source license (unless I am permitted to submit under a\n  different license), as indicated in the file; or\n* (c) The contribution was provided directly to me by some other\n  person who certified (a), (b) or (c) and I have not modified it.\n\n## Code of Conduct\n\nGobot is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.\n[You can read about it here](CODE_OF_CONDUCT.md).\n\n## Origins\n\nThis document is based on the original [io.js contribution guidelines](https://github.com/nodejs/io.js/blob/main/CONTRIBUTING.md)\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2013-2020 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "MIGRATION.md",
    "content": "# Migration guide\n\nFrom time to time a breaking change of API can happen. Following to [SemVer](https://semver.org/), the gobot main version\nshould be increased. In such case all users needs to adjust there projects for the next update, although they not using\na driver or platform with changed API.\n\nTo prevent this scenario for most users, the main version will not always increased, but affected drivers and platforms\nare listed here and a migration strategy is provided.\n\n## Switch from version 2.4.0 (applications using the gpiod options and some import paths affected)\n\n### RockPi adaptor was moved to radxa folder\n\nFor cleanup purposes and future preparation the folders and files were moved. Please search and replace to change the\nimport path as follows.\n\n```go\n// old\n...\n  \"gobot.io/x/gobot/v2/platforms/rockpi\"\n...\n\n// new\n...\n  \"gobot.io/x/gobot/v2/platforms/radxa/rockpi\"\n...\n```\n\n### Tinkerboard adaptors were moved to asus folder\n\nFor cleanup purposes and future preparation the folders and files were moved. Please search and replace to change the\nimport path as follows.\n\n```go\n// old\n...\n  \"gobot.io/x/gobot/v2/platforms/tinkerboard/tinkerboard2\"\n...\n\n// new\n...\n  \"gobot.io/x/gobot/v2/platforms/asus/tinkerboard2\"\n...\n\n```\n\n```go\n// old\n...\n  \"gobot.io/x/gobot/v2/platforms/tinkerboard\"\n...\n\n// new\n...\n  \"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n...\n```\n\n### NanoPi NEO adaptor was moved to friendlyelec folder\n\nWith introduce of FriendlyELEC NanoPC-T6 a second adaptor from FriendlyELEC (formerly friendlarm) now exists. Please\nsearch and replace to change the import path of nanopi as follows.\n\n```go\n// old\n...\n  \"gobot.io/x/gobot/v2/platforms/nanopi\"\n...\n\n// new\n...\n  \"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopi\"\n...\n```\n\n### The term gpiod was renamed to cdev\n\nUsing the term \"cdev\" (short for character device Kernel ABI for GPIO access) is more suitable than using \"gpiod\" (the\nname of the user space driver in Linux). Also it relates better to the term \"sysfs\" (the legacy sysfs Kernel ABI for\nGPIO access). The former name was chosen so there would be no difference to the used go module \"gpiod\". Since also this\nmodule is now renamed to \"go-gpiocdev\", we choose the better name \"cdev\" from now on.\n\nThis change affects all applications, which using the With... options of \"gpiod\" or \"sysfs\". A search and replace is\nsuitable:\n\n```go\n// old\n...\n  a := NewAdaptor(adaptors.WithGpiodAccess())\n...\n\n// new\n...\n  a := NewAdaptor(adaptors.WithGpioCdevAccess())\n...\n```\n\n```go\n// old\n...\n  a := NewAdaptor(adaptors.WithSysfsAccess())\n...\n\n// new\n...\n  a := NewAdaptor(adaptors.WithGpioSysfsAccess())\n...\n```\n\nAlso those findings needs to be replaced, which usually affects developers, but not users:\n\n* `system.WithDigitalPinGpiodAccess()` --> `system.WithDigitalPinCdevAccess()`\n* `IsGpiodDigitalPinAccess()` --> `HasDigitalPinCdevAccess()`\n\n### PocketBeagle adaptor goes cdev\n\nThe beagle board \"PocketBeagle\" supports with latest images the Linux Kernel character device API, so the adaptor was\nchanged to use this as the default.\n\nBy \"adaptors.WithSysfsAccess()\" the old behavior can be forced. This is most likely needed if an old image with old\nKernel is used which does not support this new API.\n\nA small renaming is also done, please search and replace:\n\n```go\n// old\n...\n\"gobot.io/x/gobot/v2/platforms/beaglebone\"\n...\nbeaglebone.NewPocketBeagleAdaptor(...)\n...\n\n// new\n...\n\"gobot.io/x/gobot/v2/platforms/beagleboard/pocketbeagle\"\n...\npocketbeagle.NewAdaptor(...)\n...\n```\n\n## Switch from version 2.3.0 (ble and sphero adaptors affected)\n\n### BLE drivers and client adaptor\n\nAll BLE drivers now can be found in the folder \"drivers/ble\". Formerly the drivers are located below \"platforms/ble\".\nIn addition the location of the BLE client adaptor was changed to \"platforms/bleclient\". Therefore a change for the\nimport paths is needed. The constructor function was also renamed, see below.\n\n```go\n// old\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/platforms/ble\"\n  ...\n)\n\n...\n  bleAdaptor := ble.NewClientAdaptor(os.Args[1])\n...\n\n// new\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/drivers/ble\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n  ...\n)\n...\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n...\n```\n\n### BLE client adaptor changed signature for Subscribe()\n\nSince introducing the usage of \"github.com/muka/go-bluetooth\" in 2020, the callback do not support the given error\nparameter anymore. The switch to usage of \"tinygo.org/x/bluetooth\" has not changed this. Therefore it is removed now\nfrom the function.\n\n### BLE generic drivers changed signature for Get*() functions\n\nAll those functions log an error only or panic, so the caller gets no nice programmatic feedback. The error is now\nreturned instead and the log output needs to be done at caller side.\n\n```go\n// old\n...\n  devName := access.GetDeviceName()\n  appearance := access.GetAppearance()\n  modelNo := info.GetModelNumber()\n  fwRev := info.GetFirmwareRevision()\n  hwRev := info.GetHardwareRevision()\n  manuName := info.GetManufacturerName()\n  pid := info.GetPnPId()\n  level := battery.GetBatteryLevel()\n...\n\n// new\n...\n  devName, err := access.GetDeviceName()\n  if err != nil {\n    fmt.Println(err)\n  }\n  appearance, err := access.GetAppearance()\n  if err != nil {\n    fmt.Println(err)\n  }\n  ...\n...\n```\n\n### Sphero adaptor split off\n\nThe Serial Based Sphero adaptor was split off into a generic serial adaptor and the driver part. With this, the imports\nneeds to be adjusted. In addition all events now have a suffix \"Event\", see below.\n\n```go\n// old\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/platforms/sphero\"\n  ...\n)\n\n...\n  adaptor := sphero.NewAdaptor(\"/dev/rfcomm0\")\n  spheroDriver := sphero.NewSpheroDriver(adaptor)\n...\n  _ = spheroDriver.On(sphero.Collision, func(data interface{}) {\n...\n\n// new\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n  \"gobot.io/x/gobot/v2/drivers/serial\"\n  \"gobot.io/x/gobot/v2/platforms/serialport\"\n  ...\n)\n...\n  adaptor := serialport.NewAdaptor(\"/dev/rfcomm0\")\n  spheroDriver := sphero.NewSpheroDriver(adaptor)\n...\n  _ = spheroDriver.On(sphero.CollisionEvent, func(data interface{}) {\n...\n```\n\n### Neurosky adaptor split off\n\nThe Neurosky adaptor now use the generic serial adaptor. The driver part was moved. With this, the imports needs to be\nadjusted. In addition all events now have a suffix \"Event\", see below.\n\n```go\n// old\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/platforms/neurosky\"\n  ...\n)\n\n...\n  adaptor := neurosky.NewAdaptor(\"/dev/rfcomm0\")\n  neuro := neurosky.NewDriver(adaptor)\n...\n  _ = neuro.On(neurosky.Extended, func(data interface{}) {\n...\n\n// new\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/drivers/serial/neurosky\"\n  \"gobot.io/x/gobot/v2/platforms/serialport\"\n  ...\n)\n...\n  adaptor := serialport.NewAdaptor(\"/dev/rfcomm0\", serialport.WithName(\"Neurosky\"), serialport.WithBaudRate(57600))\n  neuro := neurosky.NewMindWaveDriver(adaptor)\n...\n  _ = neuro.On(neurosky.ExtendedEvent, func(data interface{}) {\n...\n```\n\n### MegaPi adaptor split off\n\nThe MegaPi adaptor now use the generic serial adaptor. The driver part was moved. With this, the imports needs to be\nadjusted.\n\n```go\n// old\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/platforms/megapi\"\n  ...\n)\n\n...\n  megaPiAdaptor := megapi.NewAdaptor(\"/dev/ttyS0\")\n  motor := megapi.NewMotorDriver(megaPiAdaptor, 1)\n...\n\n// new\nimport(\n  ...\n  \"gobot.io/x/gobot/v2/drivers/serial/megapi\"\n  \"gobot.io/x/gobot/v2/platforms/serialport\"\n  ...\n)\n...\n  adaptor := serialport.NewAdaptor(\"/dev/ttyS0\", serialport.WithName(\"MegaPi\"))\n  motor := megapi.NewMotorDriver(adaptor, 1)\n...\n```\n\n## Switch from version 2.2.0 (gpio drivers affected)\n\n### gpio.ButtonDriver, gpio.PIRMotionDriver: substitute parameter \"v time.duration\"\n\nA backward compatible case is still included, but it is recommended to use \"WithButtonPollInterval\" instead, see example\nbelow.\n\n```go\n// old\nd := gpio.NewButtonDriver(adaptor, \"1\", 50*time.Millisecond)\n\n// new\nd := gpio.NewButtonDriver(adaptor, \"1\", gpio.WithButtonPollInterval(50*time.Millisecond))\n```\n\n### gpio.EasyDriver: optional pins\n\nThere is no need to use the direction, enable or sleep feature of the driver. Therefore the parameters are removed from\nconstructor. Please migrate according to the examples below. The order of the optional functions does not matter.\n\n```go\n// old\nd0 := gpio.NewEasyDriver(adaptor, 0.80, \"1\", \"\", \"\", \"\")\nd1 := gpio.NewEasyDriver(adaptor, 0.81, \"11\", \"12\", \"\", \"\")\nd2 := gpio.NewEasyDriver(adaptor, 0.82, \"21\", \"22\", \"23\", \"\")\nd3 := gpio.NewEasyDriver(adaptor, 0.83, \"31\", \"32\", \"33\", \"34\")\n\n// new\nd0 := gpio.NewEasyDriver(adaptor, 0.80, \"1\")\nd1 := gpio.NewEasyDriver(adaptor, 0.81, \"11\", gpio.WithEasyDirectionPin(\"12\"))\nd2 := gpio.NewEasyDriver(adaptor, 0.82, \"21\", gpio.WithEasyDirectionPin(\"22\"), gpio.WithEasyEnablePin(\"23\"))\nd3 := gpio.NewEasyDriver(adaptor, 0.83, \"31\", gpio.WithEasyDirectionPin(\"32\"), gpio.WithEasyEnablePin(\"33\"),\n  gpio.WithEasySleepPin(\"34\"))\n```\n\n### gpio.BuzzerDriver: unexport 'BPM' attribute\n\n```go\nd := gpio.NewBuzzerDriver(adaptor, \"1\")\n// old\nd.BPM = 120.0\nfmt.Println(\"BPM:\", d.BPM)\n\n// new\nd.SetBPM(120.0)\nfmt.Println(\"BPM:\", d.BPM())\n```\n\n### gpio.RelayDriver: unexport 'Inverted' attribute\n\nUsually the relay is inverted or not, except be rewired. From now on the inverted behavior can only be changed on\ninitialization. If there is really a different use case, please file a new issue.\n\n```go\n// old\nd := gpio.NewRelayDriver(adaptor, \"1\")\nd.Inverted = true\nfmt.Println(\"is inverted:\", d.Inverted)\n\n// new\nd := gpio.NewRelayDriver(adaptor, \"1\", gpio.WithRelayInverted())\nfmt.Println(\"is inverted:\", d.IsInverted())\n```\n\n### gpio.HD44780Driver: make 'SetRWPin()' an option\n\n```go\n// old\nd := gpio.NewHD44780Driver(adaptor, ...)\nd.SetRWPin(\"10\")\n\n// new\nd := gpio.NewHD44780Driver(adaptor, ..., gpio.WithHD44780RWPin(\"10\"))\n```\n\n### gpio.ServoDriver: unexport 'CurrentAngle' and rename functions 'Min()', 'Max()', 'Center()'\n\n```go\nd := gpio.NewServoDriver(adaptor, \"1\")\n// old\nd.Min()\nfmt.Println(\"current position:\", d.CurrentAngle)\nd.Center()\nd.Max()\n\n// new\nd.ToMin()\nfmt.Println(\"current position:\", d.Angle())\nd.ToCenter()\nd.ToMax()\n```\n\n### gpio.MotorDriver: unexport pin and state attributes, rename functions\n\nThe motor driver was heavily revised - sorry for the inconveniences.\n\naffected pins:\n\n* SpeedPin\n* SwitchPin (removed, was unused)\n* DirectionPin\n* ForwardPin\n* BackwardPin\n\nUsually the pins will not change without a hardware rewiring. All pins, except the speed pin are optionally, so options\nare designed for that.\n\n```go\n// old\nd := gpio.NewMotorDriver(adaptor, \"1\")\nd.DirectionPin = \"10\"\n\n// new\nd := gpio.NewMotorDriver(adaptor, \"1\", gpio.WithMotorDirectionPin(\"10\"))\n```\n\n```go\n// old\nd := gpio.NewMotorDriver(adaptor, \"1\")\nd.ForwardPin = \"10\"\nd.BackWardPin = \"11\"\n\n// new\nd := gpio.NewMotorDriver(adaptor, \"1\", gpio.WithMotorForwardPin(\"10\"), gpio.WithMotorBackwardPin(\"11\"))\n```\n\naffected functions:\n\n* Speed() --> SetSpeed()\n* Direction() --> SetDirection()\n* Max() --> RunMax()\n* Min() --> RunMin()\n\naffected states:\n\n* CurrentState\n* CurrentSpeed\n* CurrentMode\n* CurrentDirection\n\nMost of the attributes were used only for reading. If there is something missing, please file a new issue.\n\n```go\nd := gpio.NewMotorDriver(adaptor, \"1\")\n// old\nd.On()\nfmt.Println(\"is on:\", d.CurrentState==1)\nfmt.Println(\"speed:\", d.CurrentSpeed)\nd.Off()\nfmt.Println(\"is off:\", d.CurrentState==0)\nfmt.Println(\"mode is digital:\", d.CurrentMode==\"digital\")\nfmt.Println(\"direction:\", d.CurrentDirection)\n\n// new\nd.On()\nfmt.Println(\"is on:\", d.IsOn())\nd.Off()\nfmt.Println(\"is on:\", d.IsOff())\nfmt.Println(\"speed:\", d.Speed())\nfmt.Println(\"mode is digital:\", d.IsDigital())\nfmt.Println(\"direction:\", d.Direction())\n```\n\n```go\nd := gpio.NewMotorDriver(adaptor, \"1\")\n// old\nd.Speed(123)\nfmt.Println(\"is mode now analog?\", d.CurrentMode!=\"digital\")\n\n// new\nd.SetSpeed(123)\nfmt.Println(\"is mode now analog?\", d.IsAnalog())\n```\n\nAlthough, it is working like above, it will be more clear, if the mode is defined at the beginning, like so.\n\n```go\n// old\nd := gpio.NewMotorDriver(adaptor, \"1\")\nd.CurrentMode==\"analog\"\nd.Max()\n\n// new\nd := gpio.NewMotorDriver(adaptor, \"1\", gpio.WithMotorAnalog())\nd.RunMax()\n```\n"
  },
  {
    "path": "Makefile",
    "content": "# include also examples in other than ./examples folder\nALL_EXAMPLES := $(shell grep -l -r --include \"*.go\" 'build example' ./)\n# prevent examples with gocv (opencv) dependencies\nEXAMPLES_NO_GOCV := $(shell grep -L 'gocv' $(ALL_EXAMPLES))\n# used examples\nEXAMPLES := $(EXAMPLES_NO_GOCV)\n\n.PHONY: test test_race test_cover robeaux version_check fmt_check fmt_fix examples examples_check examples_fmt_fix $(EXAMPLES)\n\n# opencv platform currently skipped to prevent install of preconditions\nincluding_except := $(shell go list ./... | grep -v platforms/opencv)\n\n# Run tests on nearly all directories without test cache, with race detection\ntest_race:\n\tgo test -failfast -count=1 -race $(including_except) -tags libusb\n\n# Run tests on nearly all directories without test cache\ntest:\n\tgo test -failfast -count=1 $(including_except)\n\n# Test, generate and show coverage in browser\ntest_cover:\n\tgo test -v $(including_except) -coverprofile=coverage.txt ; \\\n\tgo tool cover -html=coverage.txt ; \\\n\nrobeaux:\nifeq (,$(shell which go-bindata))\n\t$(error robeaux not built! https://github.com/jteeuwen/go-bindata is required to build robeaux assets )\nendif\n\tcd api ; \\\n\tnpm install robeaux ; \\\n\tcp -r node_modules/robeaux robeaux-tmp ; \\\n\tcd robeaux-tmp ; \\\n\trm Makefile package.json README.markdown ; \\\n\ttouch css/fonts.css ; \\\n\techo \"Updating robeaux...\" ; \\\n\tgo-bindata -pkg=\"robeaux\" -o robeaux.go -ignore=\\\\.git ./... ; \\\n\tmv robeaux.go ../robeaux ; \\\n\tcd .. ; \\\n\trm -rf robeaux-tmp/ ; \\\n\trm -rf node_modules/ ; \\\n\tgo fmt ./robeaux/robeaux.go ; \\\n\n# Check for installed and module version match. Will exit with code 50 if not match.\n# There is nothing bad in general, if you program with a higher version.\n# At least the recipe \"fmt_fix\" will not work in that case.\nversion_check:\n\t@gv=$$(echo $$(go version) | sed \"s/^.* go\\([0-9].[0-9]*\\).*/\\1/\") ; \\\n\tmv=$$(grep -m 1 'go 1.' ./go.mod | sed \"s/^go \\([0-9].[0-9]*\\).*/\\1/\") ; \\\n\techo \"go: $${gv}.*, go.mod: $${mv}\" ; \\\n\tif [ \"$${gv}\" != \"$${mv}\" ]; then exit 50; fi ; \\\n\n# Check for bad code style and other issues (gofumpt and gofmt check is activated for the linter)\nfmt_check:\n\tgolangci-lint run -v\n\n# Fix bad code style (the go version will be automatically obtained from go.mod)\nfmt_fix: \n\t$(MAKE) version_check || true\n\tgofumpt -l -w .\n\tgolangci-lint run -v --fix\n\nexamples: $(EXAMPLES)\n\nexamples_check: \n\t$(MAKE) CHECK=ON examples\n\nexamples_fmt_fix: \n\t$(MAKE) CHECK=FMT examples\n\n$(EXAMPLES):\nifeq ($(CHECK),ON)\n\tgo vet -tags libusb ./$@\nelse ifeq ($(CHECK),FMT)\n\tgofumpt -l -w ./$@\n\tgolangci-lint run ./$@ --fix --build-tags example,libusb --disable forcetypeassert --disable noctx\nelse\n\tgo build -tags libusb -o /tmp/gobot_examples/$@ ./$@\nendif\n"
  },
  {
    "path": "README.md",
    "content": "[![Gobot](https://raw.githubusercontent.com/hybridgroup/gobot-site/master/source/images/elements/gobot-logo-small.png)](http://gobot.io/)\n\n[![GoDoc](https://godoc.org/gobot.io/x/gobot/v2?status.svg)](https://godoc.org/gobot.io/x/gobot/v2)\n[![CircleCI Build status](https://circleci.com/gh/hybridgroup/gobot/tree/dev.svg?style=svg)](https://circleci.com/gh/hybridgroup/gobot/tree/dev)\n[![Appveyor Build status](https://ci.appveyor.com/api/projects/status/ix29evnbdrhkr7ud/branch/dev?svg=true)](https://ci.appveyor.com/project/deadprogram/gobot/branch/dev)\n[![codecov](https://codecov.io/gh/hybridgroup/gobot/branch/dev/graph/badge.svg)](https://codecov.io/gh/hybridgroup/gobot)\n[![Go Report Card](https://goreportcard.com/badge/hybridgroup/gobot)](https://goreportcard.com/report/hybridgroup/gobot)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/hybridgroup/gobot/blob/release/LICENSE.txt)\n\nGobot (<https://gobot.io/>) is a framework using the Go programming language (<https://golang.org/>) for robotics, physical\ncomputing, and the Internet of Things.\n\nIt provides a simple, yet powerful way to create solutions that incorporate multiple, different hardware devices at the\nsame time.\n\nWant to run Go directly on microcontrollers? Check out our sister project TinyGo (<https://tinygo.org/>)\n\n## Getting Started\n\n### Get in touch\n\nGet the Gobot source code by running this commands:\n\n```sh\ngit clone https://github.com/hybridgroup/gobot.git\ngit checkout release\n```\n\nAfterwards have a look at the [examples directory](./examples). You need to find an example matching your platform for your\nfirst test (e.g. \"raspi_blink.go\"). Than build the binary (cross compile), transfer it to your target and run it.\n\n`env GOOS=linux GOARCH=arm GOARM=5 go build -o ./output/my_raspi_bink examples/raspi_blink.go`\n\n> Building the code on your local machine with the example code above will create a binary for ARMv5. This is probably not\n> what you need for your specific target platform. Please read also the platform specific documentation in the platform\n> subfolders.\n\n### Create your first project\n\nCreate a new folder and a new Go module project.\n\n```sh\nmkdir ~/my_gobot_example\ncd ~/my_gobot_example\ngo mod init my.gobot.example.com\n```\n\nCopy your example file besides the go.mod file, import the requirements and build.\n\n```sh\ncp /<path to gobot folder>/examples/raspi_blink.go ~/my_gobot_example/\ngo mod tidy\nenv GOOS=linux GOARCH=arm GOARM=5 go build -o ./output/my_raspi_bink raspi_blink.go\n```\n\nNow you are ready to modify the example and test your changes. Start by removing the build directives at the beginning\nof the file.\n\n## Examples\n\n### Gobot with Arduino\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n  firmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n  led := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n        fmt.Println(err)\n      }\n    })\n  }\n\n  robot := gobot.NewRobot(\"bot\",\n    []gobot.Connection{firmataAdaptor},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n    panic(err)\n  }\n}\n```\n\n### Gobot with Sphero\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/serial\"\n  \"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n  adaptor := serialport.NewAdaptor(\"/dev/rfcomm0\")\n  driver := sphero.NewSpheroDriver(adaptor)\n\n  work := func() {\n    gobot.Every(3*time.Second, func() {\n      driver.Roll(30, uint16(gobot.Rand(360)))\n    })\n  }\n\n  robot := gobot.NewRobot(\"sphero\",\n    []gobot.Connection{adaptor},\n    []gobot.Device{driver},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n### \"Metal\" Gobot\n\nYou can use the entire Gobot framework as shown in the examples above (\"Classic\" Gobot), or you can pick and choose from\nthe various Gobot packages to control hardware with nothing but pure idiomatic Golang code (\"Metal\" Gobot). For example:\n\n```go\npackage main\n\nimport (\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n  \"time\"\n)\n\nfunc main() {\n  e := edison.NewAdaptor()\n  if err := e.Connect(); err != nil {\n    fmt.Println(err)\n  }\n\n  led := gpio.NewLedDriver(e, \"13\")\n  if err := led.Start(); err != nil {\n    fmt.Println(err)\n  }\n\n  for {\n    if err := led.Toggle(); err != nil {\n      fmt.Println(err)\n    }\n    time.Sleep(1000 * time.Millisecond)\n  }\n}\n```\n\n### \"Manager\" Gobot\n\nYou can also use the full capabilities of the framework aka \"Manager Gobot\" to control swarms of robots or other features\nsuch as the built-in API server. For example:\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/api\"\n  \"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n  \"gobot.io/x/gobot/v2/drivers/serial\"\n  \"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc NewSwarmBot(port string) *gobot.Robot {\n  spheroAdaptor := serialport.NewAdaptor(port)\n  spheroDriver := sphero.NewSpheroDriver(spheroAdaptor, serial.WithName(\"Sphero\" + port))\n\n  work := func() {\n    spheroDriver.Stop()\n\n    _ = spheroDriver.On(sphero.CollisionEvent, func(data interface{}) {\n      fmt.Println(\"Collision Detected!\")\n    })\n\n    gobot.Every(1*time.Second, func() {\n      spheroDriver.Roll(100, uint16(gobot.Rand(360)))\n    })\n    gobot.Every(3*time.Second, func() {\n      spheroDriver.SetRGB(uint8(gobot.Rand(255)),\n        uint8(gobot.Rand(255)),\n        uint8(gobot.Rand(255)),\n      )\n    })\n  }\n\n  robot := gobot.NewRobot(\"sphero\",\n    []gobot.Connection{spheroAdaptor},\n    []gobot.Device{spheroDriver},\n    work,\n  )\n\n  return robot\n}\n\nfunc main() {\n  manager := gobot.NewManager()\n  api.NewAPI(manager).Start()\n\n  spheros := []string{\n    \"/dev/rfcomm0\",\n    \"/dev/rfcomm1\",\n    \"/dev/rfcomm2\",\n    \"/dev/rfcomm3\",\n  }\n\n  for _, port := range spheros {\n    manager.AddRobot(NewSwarmBot(port))\n  }\n\n  if err := manager.Start(); err != nil {\n    panic(err)\n  }\n}\n```\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices. The following robotics and physical computing\nplatforms are currently supported:\n\n- [Arduino](http://www.arduino.cc/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/firmata)\n- [ASUS Tinker Board](https://www.asus.com/us/Single-Board-Computer/Tinker-Board/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/asus/tinkerboard)\n- [ASUS Tinker Board 2](https://tinker-board.asus.com/series/tinker-board-2.html/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/asus/tinkerboard2)\n- Audio <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/audio)\n- [BeagleBoard BeagleBone Black](http://beagleboard.org/boards) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/beagleboard/beaglebone)\n- [BeagleBoard PocketBeagle](http://beagleboard.org/pocket/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/beagleboard/pocketbeagle)\n- [Bluetooth LE](https://www.bluetooth.com/what-is-bluetooth-technology/bluetooth-technology-basics/low-energy) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/bleclient)\n- [C.H.I.P](http://www.nextthing.co/pages/chip) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/chip)\n- [C.H.I.P Pro](https://docs.getchip.com/chip_pro.html) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/chip)\n- [Digispark](http://digistump.com/products/1) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/digispark)\n- [DJI Tello](https://www.ryzerobotics.com/tello) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/dji/tello)\n- [DragonBoard](https://developer.qualcomm.com/hardware/dragonboard-410c) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/dragonboard)\n- [ESP8266](http://esp8266.net/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/firmata)\n- [FriendlyELEC NanoPi NEO](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/friendlyelec/nanopi)\n- [FriendlyELEC NanoPC-T6](https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/friendlyelec/nanopct6)\n- [GoPiGo 3](https://www.dexterindustries.com/gopigo3/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/dexter/gopigo3)\n- [Intel Curie](https://www.intel.com/content/www/us/en/products/boards-kits/curie.html) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/intel-iot/curie)\n- [Intel Edison](http://www.intel.com/content/www/us/en/do-it-yourself/edison.html) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/intel-iot/edison)\n- [Intel Joule](http://intel.com/joule/getstarted) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/intel-iot/joule)\n- [Jetson Nano](https://developer.nvidia.com/embedded/jetson-nano/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/jetson)\n- [Joystick](http://en.wikipedia.org/wiki/Joystick) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/joystick)\n- [Keyboard](https://en.wikipedia.org/wiki/Computer_keyboard) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/keyboard)\n- [Leap Motion](https://www.leapmotion.com/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/leap)\n- [MavLink](http://qgroundcontrol.org/mavlink/start) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/mavlink)\n- [MegaPi](http://www.makeblock.com/megapi) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/megapi)\n- [Microbit](http://microbit.org/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/microbit)\n- [MQTT](http://mqtt.org/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/mqtt)\n- [NATS](http://nats.io/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/nats)\n- [Neurosky](http://neurosky.com/products-markets/eeg-biosensors/hardware/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/neurosky)\n- [OpenCV](http://opencv.org/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/opencv)\n- [OrangePi 5 Pro](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5-Pro.html) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/orangepi/orangepi5pro)\n- [Particle](https://www.particle.io/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/particle)\n- [Parrot ARDrone 2.0](http://ardrone2.parrot.com/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/parrot/ardrone)\n- [Parrot Bebop](http://www.parrot.com/usa/products/bebop-drone/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/parrot/bebop)\n- [Parrot Minidrone](https://www.parrot.com/us/minidrones) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/parrot/minidrone)\n- [Pebble](https://www.getpebble.com/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/pebble)\n- [PINE64 ROCK64](https://pine64.org/documentation/ROCK64/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/pine64/rock64)\n- [Radxa Rock Pi 4](https://wiki.radxa.com/Rock4/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/radxa/rockpi)\n- [Raspberry Pi](http://www.raspberrypi.org/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/raspi)\n- [Serial Port](https://en.wikipedia.org/wiki/Serial_port) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/serialport)\n- [Sphero](http://www.sphero.com/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/sphero/sphero)\n- [Sphero BB-8](http://www.sphero.com/bb8) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/sphero/bb8)\n- [Sphero Ollie](http://www.sphero.com/ollie) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/sphero/ollie)\n- [Sphero SPRK+](http://www.sphero.com/sprk-plus) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/sphero/sprkplus)\n- [UP2](http://www.up-board.org/upsquared/) <=> [Package](https://github.com/hybridgroup/gobot/blob/release/platforms/upboard/up2)\n\nSupport for many devices that use Analog Input/Output (AIO) have a shared set of drivers provided using\nthe `gobot/drivers/aio` package:\n\n- [AIO](https://en.wikipedia.org/wiki/Analog-to-digital_converter) <=> [Drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/aio)\n  - Analog Actuator\n  - Analog Sensor\n  - Grove Light Sensor\n  - Grove Piezo Vibration Sensor\n  - Grove Rotary Dial\n  - Grove Sound Sensor\n  - Grove Temperature Sensor\n  - Temperature Sensor (supports linear and NTC thermistor in normal and inverse mode)\n  - Thermal Zone Temperature Sensor\n\nSupport for many devices that use Bluetooth LE (BLE) have a shared set of drivers provided using\nthe `gobot/drivers/ble` package:\n\n- [BLE](http://en.wikipedia.org/wiki/Bluetooth_low_energy) <=> [Drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/ble)\n  - Battery Service\n  - Device Information Service\n  - Generic Access Service\n  - Microbit: AccelerometerDriver\n  - Microbit: ButtonDriver\n  - Microbit: IOPinDriver\n  - Microbit: LEDDriver\n  - Microbit: MagnetometerDriver\n  - Microbit: TemperatureDriver\n  - Sphero: BB8\n  - Sphero: Ollie\n  - Sphero: SPRK+\n\nSupport for many devices that use General Purpose Input/Output (GPIO) have a shared set of drivers provided using\nthe `gobot/drivers/gpio` package:\n\n- [GPIO](https://en.wikipedia.org/wiki/General_Purpose_Input/Output) <=> [Drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/gpio)\n  - AIP1640 LED Dot Matrix/7 Segment Controller\n  - Button\n  - Buzzer\n  - Direct Pin\n  - EasyDriver\n  - Grove Button (by using driver for Button)\n  - Grove Buzzer (by using driver for Buzzer)\n  - Grove LED (by using driver for LED)\n  - Grove Magnetic Switch (by using driver for Button)\n  - Grove Relay (by using driver for Relay)\n  - Grove Touch Sensor (by using driver for Button)\n  - HC-SR04 Ultrasonic Ranging Module\n  - HD44780 LCD controller\n  - LED\n  - Makey Button (by using driver for Button)\n  - MAX7219 LED Dot Matrix\n  - Motor\n  - Proximity Infra Red (PIR) Motion Sensor\n  - Relay\n  - RGB LED\n  - Servo\n  - Stepper Motor\n  - TM1638 LED Controller\n\nSupport for devices that use Inter-Integrated Circuit (I2C) have a shared set of drivers provided using\nthe `gobot/drivers/i2c` package:\n\n- [I2C](https://en.wikipedia.org/wiki/I%C2%B2C) <=> [Drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/i2c)\n  - Adafruit 1109 2x16 RGB-LCD with 5 keys\n  - Adafruit 2327 16-Channel PWM/Servo HAT Hat\n  - Adafruit 2348 DC and Stepper Motor Hat\n  - ADS1015 Analog to Digital Converter\n  - ADS1115 Analog to Digital Converter\n  - ADXL345 Digital Accelerometer\n  - BH1750 Digital Luminosity/Lux/Light Sensor\n  - BlinkM LED\n  - BME280 Barometric Pressure/Temperature/Altitude/Humidity Sensor\n  - BMP180 Barometric Pressure/Temperature/Altitude Sensor\n  - BMP280 Barometric Pressure/Temperature/Altitude Sensor\n  - BMP388 Barometric Pressure/Temperature/Altitude Sensor\n  - DRV2605L Haptic Controller\n  - Generic driver for read and write values to/from register address\n  - Grove Digital Accelerometer\n  - GrovePi Expansion Board\n  - Grove RGB LCD\n  - HMC6352 Compass\n  - HMC5883L 3-Axis Digital Compass\n  - INA3221 Voltage Monitor\n  - JHD1313M1 LCD Display w/RGB Backlight\n  - L3GD20H 3-Axis Gyroscope\n  - LIDAR-Lite\n  - MCP23017 Port Expander\n  - MMA7660 3-Axis Accelerometer\n  - MPL115A2 Barometric Pressure/Temperature\n  - MPU6050 Accelerometer/Gyroscope\n  - PCA9501 8-bit I/O port with interrupt, 2-kbit EEPROM\n  - PCA953x LED Dimmer for PCA9530 (2-bit), PCA9533 (4-bit), PCA9531 (8-bit), PCA9532 (16-bit)\n  - PCA9685 16-channel 12-bit PWM/Servo Driver\n  - PCF8583 clock and calendar or event counter, 240 x 8-bit RAM\n  - PCF8591 8-bit 4xA/D & 1xD/A converter\n  - SHT2x Temperature/Humidity\n  - SHT3x-D Temperature/Humidity\n  - SSD1306 OLED Display Controller\n  - TSL2561 Digital Luminosity/Lux/Light Sensor\n  - Wii Nunchuck Controller\n  - YL-40 Brightness/Temperature sensor, Potentiometer, analog input, analog output Driver\n\nSupport for many devices that use Serial communication (UART) have a shared set of drivers provided using\nthe `gobot/drivers/serial` package:\n\n- [UART](https://en.wikipedia.org/wiki/Serial_port) <=> [Drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/serial)\n  - Sphero: Sphero\n  - Neurosky: MindWave\n  - MegaPi: MotorDriver\n\nSupport for devices that use Serial Peripheral Interface (SPI) have\na shared set of drivers provided using the `gobot/drivers/spi` package:\n\n- [SPI](https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus) <=> [Drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/spi)\n  - APA102 Programmable LEDs\n  - MCP3002 Analog/Digital Converter\n  - MCP3004 Analog/Digital Converter\n  - MCP3008 Analog/Digital Converter\n  - MCP3202 Analog/Digital Converter\n  - MCP3204 Analog/Digital Converter\n  - MCP3208 Analog/Digital Converter\n  - MCP3304 Analog/Digital Converter\n  - MFRC522 RFID Card Reader\n  - SSD1306 OLED Display Controller\n\nSupport for devices that use 1-wire bus with Linux Kernel support (w1-gpio) have\na shared set of drivers provided using the `gobot/drivers/onewire` package:\n\n- [1-wire](https://en.wikipedia.org/wiki/1-Wire) <=> [Drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/onewire)\n  - DS18B20 Temperature Sensor\n\n## API\n\nGobot includes a RESTful API to query the status of any robot running within a group, including the connection and\ndevice status, and execute device commands.\n\nTo activate the API, import the `gobot.io/x/gobot/v2/api` package and instantiate the `API` like this:\n\n```go\n  manager := gobot.NewManager()\n  api.NewAPI(manager).Start()\n```\n\nYou can also specify the api host and port, and turn on authentication:\n\n```go\n  manager := gobot.NewManager()\n  server := api.NewAPI(manager)\n  server.Port = \"4000\"\n  server.AddHandler(api.BasicAuth(\"gort\", \"klatuu\"))\n  server.Start()\n```\n\nYou may access the [robeaux](https://github.com/hybridgroup/robeaux) React.js interface with Gobot by navigating to `http://localhost:3000/index.html`.\n\n## CLI\n\nGobot uses the Gort [http://gort.io](http://gort.io) Command Line Interface (CLI) so you can access important features\nright from the command line. We call it \"RobotOps\", aka \"DevOps For Robotics\". You can scan, connect, update device\nfirmware, and more!\n\n## Documentation\n\nWe're always adding documentation to our web site at <https://gobot.io/> please check there as we continue to work on Gobot\n\nThank you!\n\n## Need help?\n\n- Issues: <https://github.com/hybridgroup/gobot/issues>\n- Twitter: [@gobotio](https://twitter.com/gobotio)\n- Slack: [https://gophers.slack.com/messages/C0N5HDB08](https://gophers.slack.com/messages/C0N5HDB08)\n- Mailing list: <https://groups.google.com/forum/#!forum/gobotio>\n\n## Contributing\n\nFor our contribution guidelines, please go to [https://github.com/hybridgroup/gobot/blob/release/CONTRIBUTING.md\n](https://github.com/hybridgroup/gobot/blob/release/CONTRIBUTING.md\n).\n\nGobot is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.\n[You can read about it here](https://github.com/hybridgroup/gobot/blob/release/CODE_OF_CONDUCT.md).\n\n## License\n\nCopyright (c) 2013-2020 The Hybrid Group. Licensed under the Apache 2.0 license.\n\nThe Contributor Covenant is released under the Creative Commons Attribution 4.0 International Public License, which\nrequires that attribution be included.\n"
  },
  {
    "path": "adaptor.go",
    "content": "package gobot\n\nimport (\n\t\"io\"\n\t\"time\"\n)\n\n// DigitalPinOptioner is the interface to provide the possibility to change pin behavior for the next usage\ntype DigitalPinOptioner interface {\n\t// SetLabel change the pins label\n\tSetLabel(label string) (changed bool)\n\t// SetDirectionOutput sets the pins direction to output with the given initial value\n\tSetDirectionOutput(initialState int) (changed bool)\n\t// SetDirectionInput sets the pins direction to input\n\tSetDirectionInput() (changed bool)\n\t// SetActiveLow initializes the pin with inverse reaction (applies on input and output).\n\tSetActiveLow() (changed bool)\n\t// SetBias initializes the pin with the given bias (applies on input and output).\n\tSetBias(bias int) (changed bool)\n\t// SetDrive initializes the output pin with the given drive option.\n\tSetDrive(drive int) (changed bool)\n\t// SetDebounce initializes the input pin with the given debounce period.\n\tSetDebounce(period time.Duration) (changed bool)\n\t// SetEventHandlerForEdge initializes the input pin for edge detection to call the event handler on specified edge.\n\t// lineOffset is within the GPIO chip (needs to transformed to the pin id), timestamp is the detection time,\n\t// detectedEdge contains the direction of the pin changes, seqno is the sequence number for this event in the sequence\n\t// of events for all the lines in this line request, lseqno is the same but for this line\n\tSetEventHandlerForEdge(handler func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32,\n\t\tlseqno uint32), edge int) (changed bool)\n\t// SetPollForEdgeDetection use a discrete input polling method to detect edges. A poll interval of zero or smaller\n\t// will deactivate this function. Please note: Using this feature is CPU consuming and less accurate than using cdev\n\t// event handler (go-gpiocdev package) and should be done only if the former is not implemented or not working for\n\t// the adaptor. E.g. sysfs driver in gobot has not implemented edge detection yet. The function is only useful\n\t// together with SetEventHandlerForEdge() and its corresponding With*() functions.\n\tSetPollForEdgeDetection(pollInterval time.Duration, pollQuitChan chan struct{}) (changed bool)\n}\n\n// DigitalPinOptionApplier is the interface to apply options to change pin behavior immediately\ntype DigitalPinOptionApplier interface {\n\t// ApplyOptions apply all given options to the pin immediately\n\tApplyOptions(options ...func(DigitalPinOptioner) bool) error\n}\n\n// DigitalPinner is the interface for system gpio interactions\ntype DigitalPinner interface {\n\t// Export exports the pin for use by the adaptor\n\tExport() error\n\t// Unexport releases the pin from the adaptor, so it is free for the operating system\n\tUnexport() error\n\t// Read reads the current value of the pin\n\tRead() (int, error)\n\t// Write writes to the pin\n\tWrite(val int) error\n\t// DigitalPinOptionApplier is the interface to change pin behavior immediately\n\tDigitalPinOptionApplier\n}\n\n// DigitalPinValuer is the interface to get pin behavior for the next usage. The interface is and should be rarely used.\ntype DigitalPinValuer interface {\n\t// DirectionBehavior gets the direction behavior when the pin is used the next time.\n\t// This means its possibly not in this direction type at the moment.\n\tDirectionBehavior() string\n}\n\n// DigitalPinnerProvider is the interface that an Adaptor should implement to allow clients to obtain\n// access to any DigitalPin's available on that board. If the pin is initially acquired, it is an input.\n// Pin direction and other options can be changed afterwards by pin.ApplyOptions() at any time.\ntype DigitalPinnerProvider interface {\n\tDigitalPin(id string) (DigitalPinner, error)\n}\n\n// PWMPinner is the interface for system PWM interactions\ntype PWMPinner interface {\n\t// Export exports the PWM pin for use by the operating system\n\tExport() error\n\t// Unexport releases the PWM pin from the operating system\n\tUnexport() error\n\t// Enabled returns the enabled state of the PWM pin\n\tEnabled() (bool, error)\n\t// SetEnabled enables/disables the PWM pin\n\tSetEnabled(val bool) error\n\t// Polarity returns true if the polarity of the PWM pin is normal, otherwise false\n\tPolarity() (bool, error)\n\t// SetPolarity sets the polarity of the PWM pin to normal if called with true and to inverted if called with false\n\tSetPolarity(normal bool) error\n\t// Period returns the current PWM period in nanoseconds for pin\n\tPeriod() (uint32, error)\n\t// SetPeriod sets the current PWM period in nanoseconds for pin\n\tSetPeriod(period uint32) error\n\t// DutyCycle returns the duty cycle in nanoseconds for the PWM pin\n\tDutyCycle() (uint32, error)\n\t// SetDutyCycle writes the duty cycle in nanoseconds to the PWM pin\n\tSetDutyCycle(dutyCyle uint32) error\n}\n\n// PWMPinnerProvider is the interface that an Adaptor should implement to allow\n// clients to obtain access to any PWMPin's available on that board.\ntype PWMPinnerProvider interface {\n\tPWMPin(id string) (PWMPinner, error)\n}\n\n// AnalogPinner is the interface for system analog io interactions\ntype AnalogPinner interface {\n\t// Read reads the current value of the pin\n\tRead() (int, error)\n\t// Write writes to the pin\n\tWrite(val int) error\n}\n\n// I2cSystemDevicer is the interface to a i2c bus at system level, according to I2C/SMBus specification.\n// Some functions are not in the interface yet:\n// * Process Call (WriteWordDataReadWordData)\n// * Block Write - Block Read (WriteBlockDataReadBlockData)\n// * Host Notify - WriteWordData() can be used instead\n//\n// see: https://docs.kernel.org/i2c/smbus-protocol.html#key-to-symbols\n//\n// S: Start condition; Sr: Repeated start condition, used to switch from write to read mode.\n// P: Stop condition; Rd/Wr (1 bit): Read/Write bit. Rd equals 1, Wr equals 0.\n// A, NA (1 bit): Acknowledge (ACK) and Not Acknowledge (NACK) bit\n// Addr (7 bits): I2C 7 bit address. (10 bit I2C address not yet supported by gobot).\n// Comm (8 bits): Command byte, a data byte which often selects a register on the device.\n// Data (8 bits): A plain data byte. DataLow and DataHigh represent the low and high byte of a 16 bit word.\n// Count (8 bits): A data byte containing the length of a block operation.\n// [..]: Data sent by I2C device, as opposed to data sent by the host adapter.\ntype I2cSystemDevicer interface {\n\t// ReadByte must be implemented as the sequence:\n\t// \"S Addr Rd [A] [Data] NA P\"\n\tReadByte(address int) (byte, error)\n\n\t// ReadByteData must be implemented as the sequence:\n\t// \"S Addr Wr [A] Comm [A] Sr Addr Rd [A] [Data] NA P\"\n\tReadByteData(address int, reg uint8) (uint8, error)\n\n\t// ReadWordData must be implemented as the sequence:\n\t// \"S Addr Wr [A] Comm [A] Sr Addr Rd [A] [DataLow] A [DataHigh] NA P\"\n\tReadWordData(address int, reg uint8) (uint16, error)\n\n\t// ReadBlockData must be implemented as the sequence:\n\t// \"S Addr Wr [A] Comm [A] Sr Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P\"\n\tReadBlockData(address int, reg uint8, data []byte) error\n\n\t// WriteByte must be implemented as the sequence:\n\t// \"S Addr Wr [A] Data [A] P\"\n\tWriteByte(address int, val byte) error\n\n\t// WriteByteData must be implemented as the sequence:\n\t// \"S Addr Wr [A] Comm [A] Data [A] P\"\n\tWriteByteData(address int, reg uint8, val uint8) error\n\n\t// WriteBlockData must be implemented as the sequence:\n\t// \"S Addr Wr [A] Comm [A] Count [A] Data [A] Data [A] ... [A] Data [A] P\"\n\tWriteBlockData(address int, reg uint8, data []byte) error\n\n\t// WriteWordData must be implemented as the sequence:\n\t// \"S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A] P\"\n\tWriteWordData(address int, reg uint8, val uint16) error\n\n\t// WriteBytes writes the given data starting from the current register of bus device.\n\tWriteBytes(address int, data []byte) error\n\n\t// Read implements direct read operations.\n\tRead(address int, b []byte) (int, error)\n\n\t// Write implements direct write operations.\n\tWrite(address int, b []byte) (n int, err error)\n\n\t// Close closes the character device file.\n\tClose() error\n}\n\n// SpiSystemDevicer is the interface to a SPI bus at system level.\ntype SpiSystemDevicer interface {\n\tTxRx(tx []byte, rx []byte) error\n\t// Close the SPI connection.\n\tClose() error\n}\n\n// OneWireSystemDevicer is the interface to a 1-wire device at system level.\n//\n//nolint:iface // ok for now\ntype OneWireSystemDevicer interface {\n\t// ID returns the device id in the form \"family code\"-\"serial number\".\n\tID() string\n\t// ReadData reads byte data from the device\n\tReadData(command string, data []byte) error\n\t// WriteData writes byte data to the device\n\tWriteData(command string, data []byte) error\n\t// ReadInteger reads an integer value from the device\n\tReadInteger(command string) (int, error)\n\t// WriteInteger writes an integer value to the device\n\tWriteInteger(command string, val int) error\n\t// Close the 1-wire connection.\n\tClose() error\n}\n\n// BusOperations are functions provided by a bus device, e.g. SPI, i2c.\ntype BusOperations interface {\n\t// ReadByteData reads a byte from the given register of bus device.\n\tReadByteData(reg uint8) (uint8, error)\n\t// ReadBlockData fills the given buffer with reads starting from the given register of bus device.\n\tReadBlockData(reg uint8, data []byte) error\n\t// WriteByteData writes the given byte value to the given register of bus device.\n\tWriteByteData(reg uint8, val uint8) error\n\t// WriteBlockData writes the given data starting from the given register of bus device.\n\tWriteBlockData(reg uint8, data []byte) error\n\t// WriteByte writes the given byte value to the current register of bus device.\n\tWriteByte(val byte) error\n\t// WriteBytes writes the given data starting from the current register of bus device.\n\tWriteBytes(data []byte) error\n}\n\n// I2cOperations represents the i2c methods according to I2C/SMBus specification.\ntype I2cOperations interface {\n\tio.ReadWriteCloser\n\tBusOperations\n\t// ReadByte reads a byte from the current register of an i2c device.\n\tReadByte() (byte, error)\n\t// ReadWordData reads a 16 bit value starting from the given register of an i2c device.\n\tReadWordData(reg uint8) (uint16, error)\n\t// WriteWordData writes the given 16 bit value starting from the given register of an i2c device.\n\tWriteWordData(reg uint8, val uint16) error\n}\n\n// SpiOperations are the wrappers around the actual functions used by the SPI device interface\ntype SpiOperations interface {\n\tBusOperations\n\t// ReadCommandData uses the SPI device TX to send/receive data.\n\tReadCommandData(command []byte, data []byte) error\n\t// Close the connection.\n\tClose() error\n}\n\n// OneWireOperations are the wrappers around the actual functions used by the 1-wire device interface\n//\n//nolint:iface // ok for now\ntype OneWireOperations interface {\n\t// ID returns the device id in the form \"family code\"-\"serial number\".\n\tID() string\n\t// ReadData reads from the device\n\tReadData(command string, data []byte) error\n\t// WriteData writes to the device\n\tWriteData(command string, data []byte) error\n\t// ReadInteger reads an integer value from the device\n\tReadInteger(command string) (int, error)\n\t// WriteInteger writes an integer value to the device\n\tWriteInteger(command string, val int) error\n\t// Close the connection.\n\tClose() error\n}\n\n// Adaptor is the interface that describes an adaptor in gobot\ntype Adaptor interface {\n\t// Name returns the label for the Adaptor\n\tName() string\n\t// SetName sets the label for the Adaptor\n\tSetName(name string)\n\t// Connect initiates the Adaptor\n\tConnect() error\n\t// Finalize terminates the Adaptor\n\tFinalize() error\n}\n\n// BLEConnector is the interface that a BLE ClientAdaptor must implement\ntype BLEConnector interface {\n\tAdaptor\n\n\tReconnect() error\n\tDisconnect() error\n\tAddress() string\n\n\tReadCharacteristic(cUUID string) ([]byte, error)\n\tWriteCharacteristic(cUUID string, data []byte) error\n\tSubscribe(cUUID string, f func(data []byte)) error\n\tWithoutResponses(use bool)\n}\n\n// Porter is the interface that describes an adaptor's port\ntype Porter interface {\n\tPort() string\n}\n"
  },
  {
    "path": "api/api.go",
    "content": "package api\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/bmizerany/pat\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api/robeaux\"\n)\n\n// API represents an API server\ntype API struct {\n\tmanager  *gobot.Manager\n\trouter   *pat.PatternServeMux\n\tHost     string\n\tPort     string\n\tCert     string\n\tKey      string\n\thandlers []func(http.ResponseWriter, *http.Request)\n\tstart    func(*API)\n}\n\n// NewAPI returns a new api instance\nfunc NewAPI(m *gobot.Manager) *API {\n\treturn &API{\n\t\tmanager: m,\n\t\trouter:  pat.New(),\n\t\tPort:    \"3000\",\n\t\tstart: func(a *API) {\n\t\t\tlog.Println(\"Initializing API on \" + a.Host + \":\" + a.Port + \"...\")\n\t\t\thttp.Handle(\"/\", a)\n\t\t\tserver := &http.Server{\n\t\t\t\tAddr:              a.Host + \":\" + a.Port,\n\t\t\t\tReadHeaderTimeout: 30 * time.Second,\n\t\t\t}\n\n\t\t\tgo func() {\n\t\t\t\tif a.Cert != \"\" && a.Key != \"\" {\n\t\t\t\t\tif err := server.ListenAndServeTLS(a.Cert, a.Key); err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlog.Println(\"WARNING: API using insecure connection. \" +\n\t\t\t\t\t\t\"We recommend using an SSL certificate with Gobot.\")\n\t\t\t\t\tif err := server.ListenAndServe(); err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}()\n\t\t},\n\t}\n}\n\n// ServeHTTP calls api handlers and then serves request using api router\nfunc (a *API) ServeHTTP(res http.ResponseWriter, req *http.Request) {\n\tfor _, handler := range a.handlers {\n\t\trec := httptest.NewRecorder()\n\t\thandler(rec, req)\n\t\tfor k, v := range rec.Header() {\n\t\t\tres.Header()[k] = v\n\t\t}\n\t\tif rec.Code == http.StatusUnauthorized {\n\t\t\thttp.Error(res, \"Not Authorized\", http.StatusUnauthorized)\n\t\t\treturn\n\t\t}\n\t}\n\ta.router.ServeHTTP(res, req)\n}\n\n// Post wraps api router Post call\nfunc (a *API) Post(path string, f func(http.ResponseWriter, *http.Request)) {\n\ta.router.Post(path, http.HandlerFunc(f))\n}\n\n// Put wraps api router Put call\nfunc (a *API) Put(path string, f func(http.ResponseWriter, *http.Request)) {\n\ta.router.Put(path, http.HandlerFunc(f))\n}\n\n// Delete wraps api router Delete call\nfunc (a *API) Delete(path string, f func(http.ResponseWriter, *http.Request)) {\n\ta.router.Del(path, http.HandlerFunc(f))\n}\n\n// Options wraps api router Options call\nfunc (a *API) Options(path string, f func(http.ResponseWriter, *http.Request)) {\n\ta.router.Options(path, http.HandlerFunc(f))\n}\n\n// Get wraps api router Get call\nfunc (a *API) Get(path string, f func(http.ResponseWriter, *http.Request)) {\n\ta.router.Get(path, http.HandlerFunc(f))\n}\n\n// Head wraps api router Head call\nfunc (a *API) Head(path string, f func(http.ResponseWriter, *http.Request)) {\n\ta.router.Head(path, http.HandlerFunc(f))\n}\n\n// AddHandler appends handler to api handlers\nfunc (a *API) AddHandler(f func(http.ResponseWriter, *http.Request)) {\n\ta.handlers = append(a.handlers, f)\n}\n\n// Start initializes the api by setting up Robeaux web interface.\nfunc (a *API) Start() {\n\ta.AddRobeauxRoutes()\n\n\ta.start(a)\n}\n\n// StartWithoutDefaults initializes the api without setting up the default routes.\n// Good for custom web interfaces.\nfunc (a *API) StartWithoutDefaults() {\n\ta.start(a)\n}\n\n// AddC3PIORoutes adds all of the standard C3PIO routes to the API.\n// For more information, please see:\n// http://cppp.io/\nfunc (a *API) AddC3PIORoutes() {\n\tmcpCommandRoute := \"/api/commands/:command\"\n\trobotDeviceCommandRoute := \"/api/robots/:robot/devices/:device/commands/:command\"\n\trobotCommandRoute := \"/api/robots/:robot/commands/:command\"\n\n\ta.Get(\"/api/commands\", a.mcpCommands)\n\ta.Get(mcpCommandRoute, a.executeMcpCommand)\n\ta.Post(mcpCommandRoute, a.executeMcpCommand)\n\ta.Get(\"/api/robots\", a.robots)\n\ta.Get(\"/api/robots/:robot\", a.robot)\n\ta.Get(\"/api/robots/:robot/commands\", a.robotCommands)\n\ta.Get(robotCommandRoute, a.executeRobotCommand)\n\ta.Post(robotCommandRoute, a.executeRobotCommand)\n\ta.Get(\"/api/robots/:robot/devices\", a.robotDevices)\n\ta.Get(\"/api/robots/:robot/devices/:device\", a.robotDevice)\n\ta.Get(\"/api/robots/:robot/devices/:device/events/:event\", a.robotDeviceEvent)\n\ta.Get(\"/api/robots/:robot/devices/:device/commands\", a.robotDeviceCommands)\n\ta.Get(robotDeviceCommandRoute, a.executeRobotDeviceCommand)\n\ta.Post(robotDeviceCommandRoute, a.executeRobotDeviceCommand)\n\ta.Get(\"/api/robots/:robot/connections\", a.robotConnections)\n\ta.Get(\"/api/robots/:robot/connections/:connection\", a.robotConnection)\n\ta.Get(\"/api/\", a.mcp)\n}\n\n// AddRobeauxRoutes adds all of the robeaux web interface routes to the API.\n// The Robeaux web interface requires the C3PIO API, so it is also\n// activated when you call this method.\nfunc (a *API) AddRobeauxRoutes() {\n\ta.AddC3PIORoutes()\n\n\ta.Get(\"/\", func(res http.ResponseWriter, req *http.Request) {\n\t\thttp.Redirect(res, req, \"/index.html\", http.StatusMovedPermanently)\n\t})\n\ta.Get(\"/index.html\", a.robeaux)\n\ta.Get(\"/images/:a\", a.robeaux)\n\ta.Get(\"/js/:a\", a.robeaux)\n\ta.Get(\"/js/:a/\", a.robeaux)\n\ta.Get(\"/js/:a/:b\", a.robeaux)\n\ta.Get(\"/css/:a\", a.robeaux)\n\ta.Get(\"/css/:a/\", a.robeaux)\n\ta.Get(\"/css/:a/:b\", a.robeaux)\n\ta.Get(\"/partials/:a\", a.robeaux)\n}\n\n// robeaux returns handler for robeaux routes.\n// Writes asset in response and sets correct header\nfunc (a *API) robeaux(res http.ResponseWriter, req *http.Request) {\n\tpath := req.URL.Path\n\tbuf, err := robeaux.Asset(path[1:])\n\tif err != nil {\n\t\thttp.Error(res, err.Error(), http.StatusNotFound)\n\t\treturn\n\t}\n\tsplit := strings.Split(path, \".\")\n\text := split[len(split)-1]\n\tswitch ext {\n\tcase \"js\":\n\t\tres.Header().Set(\"Content-Type\", \"text/javascript; charset=utf-8\")\n\tcase \"css\":\n\t\tres.Header().Set(\"Content-Type\", \"text/css; charset=utf-8\")\n\tcase \"html\":\n\t\tres.Header().Set(\"Content-Type\", \"text/html; charset=utf-8\")\n\t}\n\tif _, err := res.Write(buf); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// mcp returns MCP route handler.\n// Writes JSON with gobot representation\nfunc (a *API) mcp(res http.ResponseWriter, req *http.Request) {\n\ta.writeJSON(map[string]interface{}{\"MCP\": gobot.NewJSONManager(a.manager)}, res)\n}\n\n// mcpCommands returns commands route handler.\n// Writes JSON with global commands representation\nfunc (a *API) mcpCommands(res http.ResponseWriter, req *http.Request) {\n\ta.writeJSON(map[string]interface{}{\"commands\": gobot.NewJSONManager(a.manager).Commands}, res)\n}\n\n// robots returns route handler.\n// Writes JSON with robots representation\nfunc (a *API) robots(res http.ResponseWriter, req *http.Request) {\n\tjsonRobots := []*gobot.JSONRobot{}\n\ta.manager.Robots().Each(func(r *gobot.Robot) {\n\t\tjsonRobots = append(jsonRobots, gobot.NewJSONRobot(r))\n\t})\n\ta.writeJSON(map[string]interface{}{\"robots\": jsonRobots}, res)\n}\n\n// robot returns route handler.\n// Writes JSON with robot representation\nfunc (a *API) robot(res http.ResponseWriter, req *http.Request) {\n\tif robot, err := a.jsonRobotFor(req.URL.Query().Get(\":robot\")); err != nil {\n\t\ta.writeJSON(map[string]interface{}{\"error\": err.Error()}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"robot\": robot}, res)\n\t}\n}\n\n// robotCommands returns commands route handler\n// Writes JSON with robot commands representation\nfunc (a *API) robotCommands(res http.ResponseWriter, req *http.Request) {\n\tif robot, err := a.jsonRobotFor(req.URL.Query().Get(\":robot\")); err != nil {\n\t\ta.writeJSON(map[string]interface{}{\"error\": err.Error()}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"commands\": robot.Commands}, res)\n\t}\n}\n\n// robotDevices returns devices route handler.\n// Writes JSON with robot devices representation\nfunc (a *API) robotDevices(res http.ResponseWriter, req *http.Request) {\n\tif robot := a.manager.Robot(req.URL.Query().Get(\":robot\")); robot != nil {\n\t\tjsonDevices := []*gobot.JSONDevice{}\n\t\trobot.Devices().Each(func(d gobot.Device) {\n\t\t\tjsonDevices = append(jsonDevices, gobot.NewJSONDevice(d))\n\t\t})\n\t\ta.writeJSON(map[string]interface{}{\"devices\": jsonDevices}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"error\": \"No Robot found with the name \" + req.URL.Query().Get(\":robot\")}, res)\n\t}\n}\n\n// robotDevice returns device route handler.\n// Writes JSON with robot device representation\nfunc (a *API) robotDevice(res http.ResponseWriter, req *http.Request) {\n\tif device, err := a.jsonDeviceFor(req.URL.Query().Get(\":robot\"), req.URL.Query().Get(\":device\")); err != nil {\n\t\ta.writeJSON(map[string]interface{}{\"error\": err.Error()}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"device\": device}, res)\n\t}\n}\n\nfunc (a *API) robotDeviceEvent(res http.ResponseWriter, req *http.Request) {\n\tf, _ := res.(http.Flusher)\n\n\tdataChan := make(chan string)\n\n\tres.Header().Set(\"Content-Type\", \"text/event-stream\")\n\tres.Header().Set(\"Cache-Control\", \"no-cache\")\n\tres.Header().Set(\"Connection\", \"keep-alive\")\n\n\tdevice := a.manager.Robot(req.URL.Query().Get(\":robot\")).\n\t\tDevice(req.URL.Query().Get(\":device\"))\n\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\tif event := a.manager.Robot(req.URL.Query().Get(\":robot\")).\n\t\tDevice(req.URL.Query().Get(\":device\")).(gobot.Eventer).\n\t\tEvent(req.URL.Query().Get(\":event\")); len(event) > 0 {\n\t\t//nolint:forcetypeassert // no error return value, so there is no better way\n\t\tif err := device.(gobot.Eventer).On(event, func(data interface{}) {\n\t\t\td, _ := json.Marshal(data)\n\t\t\tdataChan <- string(d)\n\t\t}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase data := <-dataChan:\n\t\t\t\tfmt.Fprintf(res, \"data: %v\\n\\n\", data)\n\t\t\t\tf.Flush()\n\t\t\tcase <-req.Context().Done():\n\t\t\t\tlog.Println(\"Closing connection\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\n\t\t\t\"error\": \"No Event found with the name \" + req.URL.Query().Get(\":event\"),\n\t\t}, res)\n\t}\n}\n\n// robotDeviceCommands returns device commands route handler\n// writes JSON with robot device commands representation\nfunc (a *API) robotDeviceCommands(res http.ResponseWriter, req *http.Request) {\n\tif device, err := a.jsonDeviceFor(req.URL.Query().Get(\":robot\"), req.URL.Query().Get(\":device\")); err != nil {\n\t\ta.writeJSON(map[string]interface{}{\"error\": err.Error()}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"commands\": device.Commands}, res)\n\t}\n}\n\n// robotConnections returns connections route handler\n// writes JSON with robot connections representation\nfunc (a *API) robotConnections(res http.ResponseWriter, req *http.Request) {\n\tjsonConnections := []*gobot.JSONConnection{}\n\tif robot := a.manager.Robot(req.URL.Query().Get(\":robot\")); robot != nil {\n\t\trobot.Connections().Each(func(c gobot.Connection) {\n\t\t\tjsonConnections = append(jsonConnections, gobot.NewJSONConnection(c))\n\t\t})\n\t\ta.writeJSON(map[string]interface{}{\"connections\": jsonConnections}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"error\": \"No Robot found with the name \" + req.URL.Query().Get(\":robot\")}, res)\n\t}\n}\n\n// robotConnection returns connection route handler\n// writes JSON with robot connection representation\nfunc (a *API) robotConnection(res http.ResponseWriter, req *http.Request) {\n\tif conn, err := a.jsonConnectionFor(req.URL.Query().Get(\":robot\"), req.URL.Query().Get(\":connection\")); err != nil {\n\t\ta.writeJSON(map[string]interface{}{\"error\": err.Error()}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"connection\": conn}, res)\n\t}\n}\n\n// executeMcpCommand calls a global command associated to requested route\nfunc (a *API) executeMcpCommand(res http.ResponseWriter, req *http.Request) {\n\ta.executeCommand(a.manager.Command(req.URL.Query().Get(\":command\")),\n\t\tres,\n\t\treq,\n\t)\n}\n\n// executeRobotDeviceCommand calls a device command associated to requested route\nfunc (a *API) executeRobotDeviceCommand(res http.ResponseWriter, req *http.Request) {\n\tif _, err := a.jsonDeviceFor(req.URL.Query().Get(\":robot\"),\n\t\treq.URL.Query().Get(\":device\")); err != nil {\n\t\ta.writeJSON(map[string]interface{}{\"error\": err.Error()}, res)\n\t} else {\n\t\ta.executeCommand(\n\t\t\t//nolint:forcetypeassert // no error return value, so there is no better way\n\t\t\ta.manager.Robot(req.URL.Query().Get(\":robot\")).\n\t\t\t\tDevice(req.URL.Query().Get(\":device\")).(gobot.Commander).\n\t\t\t\tCommand(req.URL.Query().Get(\":command\")),\n\t\t\tres,\n\t\t\treq,\n\t\t)\n\t}\n}\n\n// executeRobotCommand calls a robot command associated to requested route\nfunc (a *API) executeRobotCommand(res http.ResponseWriter, req *http.Request) {\n\tif _, err := a.jsonRobotFor(req.URL.Query().Get(\":robot\")); err != nil {\n\t\ta.writeJSON(map[string]interface{}{\"error\": err.Error()}, res)\n\t} else {\n\t\ta.executeCommand(\n\t\t\ta.manager.Robot(req.URL.Query().Get(\":robot\")).\n\t\t\t\tCommand(req.URL.Query().Get(\":command\")),\n\t\t\tres,\n\t\t\treq,\n\t\t)\n\t}\n}\n\n// executeCommand writes JSON response with `f` returned value.\nfunc (a *API) executeCommand(f func(map[string]interface{}) interface{},\n\tres http.ResponseWriter,\n\treq *http.Request,\n) {\n\tbody := make(map[string]interface{})\n\tif err := json.NewDecoder(req.Body).Decode(&body); err != nil {\n\t\tpanic(err)\n\t}\n\n\tif f != nil {\n\t\ta.writeJSON(map[string]interface{}{\"result\": f(body)}, res)\n\t} else {\n\t\ta.writeJSON(map[string]interface{}{\"error\": \"Unknown Command\"}, res)\n\t}\n}\n\n// writeJSON writes `j` as JSON in response\nfunc (a *API) writeJSON(j interface{}, res http.ResponseWriter) {\n\tdata, err := json.Marshal(j)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tres.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\n\tif _, err := res.Write(data); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Debug add handler to api that prints each request\nfunc (a *API) Debug() {\n\ta.AddHandler(func(res http.ResponseWriter, req *http.Request) {\n\t\tlog.Println(req)\n\t})\n}\n\nfunc (a *API) jsonRobotFor(name string) (*gobot.JSONRobot, error) {\n\tif robot := a.manager.Robot(name); robot != nil {\n\t\treturn gobot.NewJSONRobot(robot), nil\n\t}\n\treturn nil, fmt.Errorf(\"no Robot found with the name %s\", name)\n}\n\nfunc (a *API) jsonDeviceFor(robot string, name string) (*gobot.JSONDevice, error) {\n\tif device := a.manager.Robot(robot).Device(name); device != nil {\n\t\treturn gobot.NewJSONDevice(device), nil\n\t}\n\n\treturn nil, fmt.Errorf(\"no Device found with the name %s\", name)\n}\n\nfunc (a *API) jsonConnectionFor(robot string, name string) (*gobot.JSONConnection, error) {\n\tif connection := a.manager.Robot(robot).Connection(name); connection != nil {\n\t\treturn gobot.NewJSONConnection(connection), nil\n\t}\n\n\treturn nil, fmt.Errorf(\"no Connection found with the name %s\", name)\n}\n"
  },
  {
    "path": "api/api_test.go",
    "content": "//nolint:forcetypeassert,usestdlibvars,bodyclose,noctx // ok here\npackage api\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nfunc initTestAPI() *API {\n\tlog.SetOutput(NullReadWriteCloser{})\n\tg := gobot.NewManager()\n\ta := NewAPI(g)\n\ta.start = func(m *API) {}\n\ta.Start()\n\ta.Debug()\n\n\tg.AddRobot(newTestRobot(\"Robot1\"))\n\tg.AddRobot(newTestRobot(\"Robot2\"))\n\tg.AddRobot(newTestRobot(\"Robot3\"))\n\tg.AddCommand(\"TestFunction\", func(params map[string]interface{}) interface{} {\n\t\tmessage := params[\"message\"].(string)\n\t\treturn fmt.Sprintf(\"hey %v\", message)\n\t})\n\n\treturn a\n}\n\nfunc TestStartWithoutDefaults(t *testing.T) {\n\tlog.SetOutput(NullReadWriteCloser{})\n\tg := gobot.NewManager()\n\ta := NewAPI(g)\n\ta.start = func(m *API) {}\n\n\ta.Get(\"/\", func(res http.ResponseWriter, req *http.Request) {})\n\ta.StartWithoutDefaults()\n\n\trequest, _ := http.NewRequest(\"GET\", \"/\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n}\n\nfunc TestRobeaux(t *testing.T) {\n\ta := initTestAPI()\n\t// html assets\n\trequest, _ := http.NewRequest(\"GET\", \"/index.html\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\t// js assets\n\trequest, _ = http.NewRequest(\"GET\", \"/js/script.js\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\t// css assets\n\trequest, _ = http.NewRequest(\"GET\", \"/css/application.css\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\t// unknown asset\n\trequest, _ = http.NewRequest(\"GET\", \"/js/fake/file.js\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 404, response.Code)\n}\n\nfunc TestIndex(t *testing.T) {\n\ta := initTestAPI()\n\trequest, _ := http.NewRequest(\"GET\", \"/\", nil)\n\tresponse := httptest.NewRecorder()\n\n\ta.ServeHTTP(response, request)\n\n\tassert.Equal(t, http.StatusMovedPermanently, response.Code)\n\tassert.Equal(t, \"/index.html\", response.Header()[\"Location\"][0])\n}\n\nfunc TestMcp(t *testing.T) {\n\ta := initTestAPI()\n\trequest, _ := http.NewRequest(\"GET\", \"/api/\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.NotNil(t, body[\"MCP\"].(map[string]interface{})[\"robots\"])\n\tassert.NotNil(t, body[\"MCP\"].(map[string]interface{})[\"commands\"])\n}\n\nfunc TestMcpCommands(t *testing.T) {\n\ta := initTestAPI()\n\trequest, _ := http.NewRequest(\"GET\", \"/api/commands\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, []interface{}{\"TestFunction\"}, body[\"commands\"])\n}\n\nfunc TestExecuteMcpCommand(t *testing.T) {\n\tvar body interface{}\n\ta := initTestAPI()\n\n\t// known command\n\trequest, _ := http.NewRequest(\"GET\",\n\t\t\"/api/commands/TestFunction\",\n\t\tbytes.NewBufferString(`{\"message\":\"Beep Boop\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"hey Beep Boop\", body.(map[string]interface{})[\"result\"])\n\n\t// unknown command\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/commands/TestFuntion1\",\n\t\tbytes.NewBufferString(`{\"message\":\"Beep Boop\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"Unknown Command\", body.(map[string]interface{})[\"error\"])\n}\n\nfunc TestRobots(t *testing.T) {\n\ta := initTestAPI()\n\trequest, _ := http.NewRequest(\"GET\", \"/api/robots\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Len(t, body[\"robots\"].([]interface{}), 3)\n}\n\nfunc TestRobot(t *testing.T) {\n\ta := initTestAPI()\n\n\t// known robot\n\trequest, _ := http.NewRequest(\"GET\", \"/api/robots/Robot1\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"Robot1\", body[\"robot\"].(map[string]interface{})[\"name\"].(string))\n\n\t// unknown robot\n\trequest, _ = http.NewRequest(\"GET\", \"/api/robots/UnknownRobot1\", nil)\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"no Robot found with the name UnknownRobot1\", body[\"error\"])\n}\n\nfunc TestRobotDevices(t *testing.T) {\n\ta := initTestAPI()\n\n\t// known robot\n\trequest, _ := http.NewRequest(\"GET\", \"/api/robots/Robot1/devices\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Len(t, body[\"devices\"].([]interface{}), 3)\n\n\t// unknown robot\n\trequest, _ = http.NewRequest(\"GET\", \"/api/robots/UnknownRobot1/devices\", nil)\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"No Robot found with the name UnknownRobot1\", body[\"error\"])\n}\n\nfunc TestRobotCommands(t *testing.T) {\n\ta := initTestAPI()\n\n\t// known robot\n\trequest, _ := http.NewRequest(\"GET\", \"/api/robots/Robot1/commands\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, []interface{}{\"robotTestFunction\"}, body[\"commands\"])\n\n\t// unknown robot\n\trequest, _ = http.NewRequest(\"GET\", \"/api/robots/UnknownRobot1/commands\", nil)\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"no Robot found with the name UnknownRobot1\", body[\"error\"])\n}\n\nfunc TestExecuteRobotCommand(t *testing.T) {\n\tvar body interface{}\n\ta := initTestAPI()\n\t// known command\n\trequest, _ := http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/commands/robotTestFunction\",\n\t\tbytes.NewBufferString(`{\"message\":\"Beep Boop\", \"robot\":\"Robot1\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"hey Robot1, Beep Boop\", body.(map[string]interface{})[\"result\"])\n\n\t// unknown command\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/commands/robotTestFuntion1\",\n\t\tbytes.NewBufferString(`{\"message\":\"Beep Boop\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"Unknown Command\", body.(map[string]interface{})[\"error\"])\n\n\t// uknown robot\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/robots/UnknownRobot1/commands/robotTestFuntion1\",\n\t\tbytes.NewBufferString(`{\"message\":\"Beep Boop\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"no Robot found with the name UnknownRobot1\", body.(map[string]interface{})[\"error\"])\n}\n\nfunc TestRobotDevice(t *testing.T) {\n\ta := initTestAPI()\n\n\t// known device\n\trequest, _ := http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/devices/Device1\",\n\t\tnil,\n\t)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"Device1\", body[\"device\"].(map[string]interface{})[\"name\"].(string))\n\n\t// unknown device\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/devices/UnknownDevice1\", nil)\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"no Device found with the name UnknownDevice1\", body[\"error\"])\n}\n\nfunc TestRobotDeviceCommands(t *testing.T) {\n\ta := initTestAPI()\n\n\t// known device\n\trequest, _ := http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/devices/Device1/commands\",\n\t\tnil,\n\t)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Len(t, body[\"commands\"].([]interface{}), 2)\n\n\t// unknown device\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/devices/UnknownDevice1/commands\",\n\t\tnil,\n\t)\n\ta.ServeHTTP(response, request)\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"no Device found with the name UnknownDevice1\", body[\"error\"])\n}\n\nfunc TestExecuteRobotDeviceCommand(t *testing.T) {\n\tvar body interface{}\n\ta := initTestAPI()\n\n\t// known command\n\trequest, _ := http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/devices/Device1/commands/TestDriverCommand\",\n\t\tbytes.NewBufferString(`{\"name\":\"human\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"hello human\", body.(map[string]interface{})[\"result\"].(string))\n\n\t// unknown command\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/devices/Device1/commands/DriverCommand1\",\n\t\tbytes.NewBufferString(`{\"name\":\"human\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"Unknown Command\", body.(map[string]interface{})[\"error\"])\n\n\t// unknown device\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/devices/UnknownDevice1/commands/DriverCommand1\",\n\t\tbytes.NewBufferString(`{\"name\":\"human\"}`),\n\t)\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"no Device found with the name UnknownDevice1\", body.(map[string]interface{})[\"error\"])\n}\n\nfunc TestRobotConnections(t *testing.T) {\n\ta := initTestAPI()\n\n\t// known robot\n\trequest, _ := http.NewRequest(\"GET\", \"/api/robots/Robot1/connections\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Len(t, body[\"connections\"].([]interface{}), 3)\n\n\t// unknown robot\n\trequest, _ = http.NewRequest(\"GET\", \"/api/robots/UnknownRobot1/connections\", nil)\n\ta.ServeHTTP(response, request)\n\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"No Robot found with the name UnknownRobot1\", body[\"error\"])\n}\n\nfunc TestRobotConnection(t *testing.T) {\n\ta := initTestAPI()\n\n\t// known connection\n\trequest, _ := http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/connections/Connection1\",\n\t\tnil,\n\t)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"Connection1\", body[\"connection\"].(map[string]interface{})[\"name\"].(string))\n\n\t// unknown connection\n\trequest, _ = http.NewRequest(\"GET\",\n\t\t\"/api/robots/Robot1/connections/UnknownConnection1\",\n\t\tnil,\n\t)\n\ta.ServeHTTP(response, request)\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"no Connection found with the name UnknownConnection1\", body[\"error\"])\n}\n\nfunc TestRobotDeviceEvent(t *testing.T) {\n\ta := initTestAPI()\n\tserver := httptest.NewServer(a)\n\tdefer server.Close()\n\n\teventsURL := \"/api/robots/Robot1/devices/Device1/events/\"\n\n\t// known event\n\trespc := make(chan *http.Response, 1)\n\tgo func() {\n\t\tresp, _ := http.Get(server.URL + eventsURL + \"TestEvent\")\n\t\trespc <- resp\n\t}()\n\n\tevent := a.manager.Robot(\"Robot1\").\n\t\tDevice(\"Device1\").(gobot.Eventer).\n\t\tEvent(\"TestEvent\")\n\n\tgo func() {\n\t\ttime.Sleep(time.Millisecond * 10) // wait some time, so select below is ready\n\t\ta.manager.Robot(\"Robot1\").\n\t\t\tDevice(\"Device1\").(gobot.Eventer).Publish(event, \"event-data\")\n\t}()\n\n\tselect {\n\tcase resp := <-respc:\n\t\treader := bufio.NewReader(resp.Body)\n\t\tdata, _ := reader.ReadString('\\n')\n\t\tassert.Equal(t, \"data: \\\"event-data\\\"\\n\", data)\n\tcase <-time.After(50 * time.Millisecond):\n\t\tt.Error(\"Not receiving data\")\n\t}\n\n\tserver.CloseClientConnections()\n\n\t// unknown event\n\tresponse, _ := http.Get(server.URL + eventsURL + \"UnknownEvent\")\n\n\tvar body map[string]interface{}\n\t_ = json.NewDecoder(response.Body).Decode(&body)\n\tassert.Equal(t, \"No Event found with the name UnknownEvent\", body[\"error\"])\n}\n\nfunc TestAPIRouter(t *testing.T) {\n\ta := initTestAPI()\n\n\ta.Head(\"/test\", func(res http.ResponseWriter, req *http.Request) {})\n\trequest, _ := http.NewRequest(\"HEAD\", \"/test\", nil)\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\n\ta.Get(\"/test\", func(res http.ResponseWriter, req *http.Request) {})\n\trequest, _ = http.NewRequest(\"GET\", \"/test\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\n\ta.Post(\"/test\", func(res http.ResponseWriter, req *http.Request) {})\n\trequest, _ = http.NewRequest(\"POST\", \"/test\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\n\ta.Put(\"/test\", func(res http.ResponseWriter, req *http.Request) {})\n\trequest, _ = http.NewRequest(\"PUT\", \"/test\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\n\ta.Delete(\"/test\", func(res http.ResponseWriter, req *http.Request) {})\n\trequest, _ = http.NewRequest(\"DELETE\", \"/test\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\n\ta.Options(\"/test\", func(res http.ResponseWriter, req *http.Request) {})\n\trequest, _ = http.NewRequest(\"OPTIONS\", \"/test\", nil)\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n}\n"
  },
  {
    "path": "api/basic_auth.go",
    "content": "package api\n\nimport (\n\t\"crypto/subtle\"\n\t\"encoding/base64\"\n\t\"net/http\"\n)\n\n// BasicAuth returns basic auth handler.\nfunc BasicAuth(username, password string) http.HandlerFunc {\n\t// Inspired by https://github.com/codegangsta/martini-contrib/tree/v0.1/auth\n\treturn func(res http.ResponseWriter, req *http.Request) {\n\t\tif !secureCompare(req.Header.Get(\"Authorization\"),\n\t\t\t\"Basic \"+base64.StdEncoding.EncodeToString([]byte(username+\":\"+password)),\n\t\t) {\n\t\t\tres.Header().Set(\"WWW-Authenticate\",\n\t\t\t\t\"Basic realm=\\\"Authorization Required\\\"\",\n\t\t\t)\n\t\t\thttp.Error(res, \"Not Authorized\", http.StatusUnauthorized)\n\t\t}\n\t}\n}\n\nfunc secureCompare(given string, actual string) bool {\n\t//nolint:gosec // TODO: fix later\n\tif subtle.ConstantTimeEq(int32(len(given)), int32(len(actual))) == 1 {\n\t\treturn subtle.ConstantTimeCompare([]byte(given), []byte(actual)) == 1\n\t}\n\t// Securely compare actual to itself to keep constant time,\n\t// but always return false\n\treturn subtle.ConstantTimeCompare([]byte(actual), []byte(actual)) == 1 && false\n}\n"
  },
  {
    "path": "api/basic_auth_test.go",
    "content": "//nolint:usestdlibvars,noctx // ok here\npackage api\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestBasicAuth(t *testing.T) {\n\ta := initTestAPI()\n\n\ta.AddHandler(BasicAuth(\"admin\", \"password\"))\n\n\trequest, _ := http.NewRequest(\"GET\", \"/api/\", nil)\n\trequest.SetBasicAuth(\"admin\", \"password\")\n\tresponse := httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 200, response.Code)\n\n\trequest, _ = http.NewRequest(\"GET\", \"/api/\", nil)\n\trequest.SetBasicAuth(\"admin\", \"wrongPassword\")\n\tresponse = httptest.NewRecorder()\n\ta.ServeHTTP(response, request)\n\tassert.Equal(t, 401, response.Code)\n}\n"
  },
  {
    "path": "api/cors.go",
    "content": "package api\n\nimport (\n\t\"net/http\"\n\t\"regexp\"\n\t\"strings\"\n)\n\n// CORS represents CORS configuration\ntype CORS struct {\n\tAllowOrigins        []string\n\tAllowHeaders        []string\n\tAllowMethods        []string\n\tContentType         string\n\tallowOriginPatterns []string\n}\n\n// AllowRequestsFrom returns handler to verify that requests come from allowedOrigins\nfunc AllowRequestsFrom(allowedOrigins ...string) http.HandlerFunc {\n\tc := &CORS{\n\t\tAllowOrigins: allowedOrigins,\n\t\tAllowMethods: []string{\"GET\", \"POST\"},\n\t\tAllowHeaders: []string{\"Origin\", \"Content-Type\"},\n\t\tContentType:  \"application/json; charset=utf-8\",\n\t}\n\n\tc.generatePatterns()\n\n\treturn func(w http.ResponseWriter, req *http.Request) {\n\t\torigin := req.Header.Get(\"Origin\")\n\t\tif c.isOriginAllowed(origin) {\n\t\t\tw.Header().Set(\"Access-Control-Allow-Origin\", origin)\n\t\t\tw.Header().Set(\"Access-Control-Allow-Headers\", c.AllowedHeaders())\n\t\t\tw.Header().Set(\"Access-Control-Allow-Methods\", c.AllowedMethods())\n\t\t\tw.Header().Set(\"Content-Type\", c.ContentType)\n\t\t}\n\t}\n}\n\n// isOriginAllowed returns true if origin matches an allowed origin pattern.\nfunc (c *CORS) isOriginAllowed(origin string) bool {\n\tfor _, allowedOriginPattern := range c.allowOriginPatterns {\n\t\tif allowed, _ := regexp.MatchString(allowedOriginPattern, origin); allowed {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// generatePatterns generates regex expression for AllowOrigins\nfunc (c *CORS) generatePatterns() {\n\tif c.AllowOrigins != nil {\n\t\tfor _, origin := range c.AllowOrigins {\n\t\t\tpattern := regexp.QuoteMeta(origin)\n\t\t\tpattern = strings.ReplaceAll(pattern, \"\\\\*\", \".*\")\n\t\t\tpattern = strings.ReplaceAll(pattern, \"\\\\?\", \".\")\n\t\t\tc.allowOriginPatterns = append(c.allowOriginPatterns, \"^\"+pattern+\"$\")\n\t\t}\n\t}\n}\n\n// AllowedHeaders returns allowed headers in a string\nfunc (c *CORS) AllowedHeaders() string {\n\treturn strings.Join(c.AllowHeaders, \",\")\n}\n\n// AllowedMethods returns allowed http methods in a string\nfunc (c *CORS) AllowedMethods() string {\n\treturn strings.Join(c.AllowMethods, \",\")\n}\n"
  },
  {
    "path": "api/cors_test.go",
    "content": "//nolint:usestdlibvars,noctx // ok here\npackage api\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestCORSIsOriginAllowed(t *testing.T) {\n\tcors := &CORS{AllowOrigins: []string{\"*\"}}\n\tcors.generatePatterns()\n\n\t// When all the origins are accepted\n\tassert.True(t, cors.isOriginAllowed(\"http://localhost:8000\"))\n\tassert.True(t, cors.isOriginAllowed(\"http://localhost:3001\"))\n\tassert.True(t, cors.isOriginAllowed(\"http://server.com\"))\n\n\t// When one origin is accepted\n\tcors = &CORS{AllowOrigins: []string{\"http://localhost:8000\"}}\n\tcors.generatePatterns()\n\n\tassert.True(t, cors.isOriginAllowed(\"http://localhost:8000\"))\n\tassert.False(t, cors.isOriginAllowed(\"http://localhost:3001\"))\n\tassert.False(t, cors.isOriginAllowed(\"http://server.com\"))\n\n\t// When several origins are accepted\n\tcors = &CORS{AllowOrigins: []string{\"http://localhost:*\", \"http://server.com\"}}\n\tcors.generatePatterns()\n\n\tassert.True(t, cors.isOriginAllowed(\"http://localhost:8000\"))\n\tassert.True(t, cors.isOriginAllowed(\"http://localhost:3001\"))\n\tassert.True(t, cors.isOriginAllowed(\"http://server.com\"))\n\n\t// When several origins are accepted within the same domain\n\tcors = &CORS{AllowOrigins: []string{\"http://*.server.com\"}}\n\tcors.generatePatterns()\n\n\tassert.False(t, cors.isOriginAllowed(\"http://localhost:8000\"))\n\tassert.False(t, cors.isOriginAllowed(\"http://localhost:3001\"))\n\tassert.True(t, cors.isOriginAllowed(\"http://foo.server.com\"))\n\tassert.True(t, cors.isOriginAllowed(\"http://api.server.com\"))\n}\n\nfunc TestCORSAllowedHeaders(t *testing.T) {\n\tcors := &CORS{AllowOrigins: []string{\"*\"}, AllowHeaders: []string{\"Header1\", \"Header2\"}}\n\n\tassert.Equal(t, \"Header1,Header2\", cors.AllowedHeaders())\n}\n\nfunc TestCORSAllowedMethods(t *testing.T) {\n\tcors := &CORS{AllowOrigins: []string{\"*\"}, AllowMethods: []string{\"GET\", \"POST\"}}\n\n\tassert.Equal(t, \"GET,POST\", cors.AllowedMethods())\n\n\tcors.AllowMethods = []string{\"GET\", \"POST\", \"PUT\"}\n\n\tassert.Equal(t, \"GET,POST,PUT\", cors.AllowedMethods())\n}\n\nfunc TestCORS(t *testing.T) {\n\tapi := initTestAPI()\n\n\t// Accepted origin\n\tallowedOrigin := []string{\"http://server.com\"}\n\tapi.AddHandler(AllowRequestsFrom(allowedOrigin[0]))\n\n\trequest, _ := http.NewRequest(\"GET\", \"/api/\", nil)\n\trequest.Header.Set(\"Origin\", allowedOrigin[0])\n\tresponse := httptest.NewRecorder()\n\tapi.ServeHTTP(response, request)\n\tassert.Equal(t, allowedOrigin, response.Header()[\"Access-Control-Allow-Origin\"])\n\n\t// Not accepted Origin\n\tdisallowedOrigin := []string{\"http://disallowed.com\"}\n\trequest, _ = http.NewRequest(\"GET\", \"/api/\", nil)\n\trequest.Header.Set(\"Origin\", disallowedOrigin[0])\n\tresponse = httptest.NewRecorder()\n\tapi.ServeHTTP(response, request)\n\tassert.NotEqual(t, disallowedOrigin, response.Header()[\"Access-Control-Allow-Origin\"])\n\tassert.NotEqual(t, allowedOrigin, response.Header()[\"Access-Control-Allow-Origin\"])\n}\n"
  },
  {
    "path": "api/doc.go",
    "content": "/*\nPackage api provides a webserver to interact with your Gobot program over the network.\n\nExample:\n\n\tpackage main\n\n\timport (\n\t  \"fmt\"\n\n\t  \"gobot.io/x/gobot/v2\"\n\t  \"gobot.io/x/gobot/v2/api\"\n\t)\n\n\tfunc main() {\n\t  gbot := gobot.NewManager()\n\n\t  // Starts the API server on default port 3000\n\t  api.NewAPI(gbot).Start()\n\n\t  // Accessible via http://localhost:3000/api/commands/say_hello\n\t  gbot.AddCommand(\"say_hello\", func(params map[string]interface{}) interface{} {\n\t    return \"Manager says hello!\"\n\t  })\n\n\t  hello := gbot.AddRobot(gobot.NewRobot(\"Eve\"))\n\n\t  // Accessible via http://localhost:3000/api/robots/Eve/commands/say_hello\n\t  hello.AddCommand(\"say_hello\", func(params map[string]interface{}) interface{} {\n\t    return fmt.Sprintf(\"%v says hello!\", hello.Name)\n\t  })\n\n\t  gbot.Start()\n\t}\n\nIt follows Common Protocol for Programming Physical Input and Output (CPPP-IO) spec:\nhttps://gobot.io/x/cppp-io\n*/\npackage api\n"
  },
  {
    "path": "api/helpers_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage api\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype NullReadWriteCloser struct{}\n\nfunc (NullReadWriteCloser) Write(p []byte) (int, error) {\n\treturn len(p), nil\n}\n\nfunc (NullReadWriteCloser) Read(b []byte) (int, error) {\n\treturn len(b), nil\n}\n\nfunc (NullReadWriteCloser) Close() error {\n\treturn nil\n}\n\ntype testDriver struct {\n\tgobot.Commander\n\tgobot.Eventer\n\n\tname       string\n\tpin        string\n\tconnection gobot.Connection\n}\n\nfunc (t *testDriver) Start() error                 { return nil }\nfunc (t *testDriver) Halt() error                  { return nil }\nfunc (t *testDriver) Name() string                 { return t.name }\nfunc (t *testDriver) SetName(n string)             { t.name = n }\nfunc (t *testDriver) Pin() string                  { return t.pin }\nfunc (t *testDriver) Connection() gobot.Connection { return t.connection }\n\nfunc newTestDriver(adaptor *testAdaptor, name string, pin string) *testDriver {\n\tt := &testDriver{\n\t\tname:       name,\n\t\tconnection: adaptor,\n\t\tpin:        pin,\n\t\tEventer:    gobot.NewEventer(),\n\t\tCommander:  gobot.NewCommander(),\n\t}\n\n\tt.AddEvent(\"TestEvent\")\n\n\tt.AddCommand(\"TestDriverCommand\", func(params map[string]interface{}) interface{} {\n\t\tname := params[\"name\"].(string)\n\t\treturn fmt.Sprintf(\"hello %v\", name)\n\t})\n\n\tt.AddCommand(\"DriverCommand\", func(params map[string]interface{}) interface{} {\n\t\tname := params[\"name\"].(string)\n\t\treturn fmt.Sprintf(\"hello %v\", name)\n\t})\n\n\treturn t\n}\n\ntype testAdaptor struct {\n\tname string\n\tport string\n}\n\nvar (\n\ttestAdaptorConnect  = func() error { return nil }\n\ttestAdaptorFinalize = func() error { return nil }\n)\n\nfunc (t *testAdaptor) Finalize() error  { return testAdaptorFinalize() }\nfunc (t *testAdaptor) Connect() error   { return testAdaptorConnect() }\nfunc (t *testAdaptor) Name() string     { return t.name }\nfunc (t *testAdaptor) SetName(n string) { t.name = n }\nfunc (t *testAdaptor) Port() string     { return t.port }\n\nfunc newTestAdaptor(name string, port string) *testAdaptor {\n\treturn &testAdaptor{\n\t\tname: name,\n\t\tport: port,\n\t}\n}\n\nfunc newTestRobot(name string) *gobot.Robot {\n\tadaptor1 := newTestAdaptor(\"Connection1\", \"/dev/null\")\n\tadaptor2 := newTestAdaptor(\"Connection2\", \"/dev/null\")\n\tadaptor3 := newTestAdaptor(\"\", \"/dev/null\")\n\tdriver1 := newTestDriver(adaptor1, \"Device1\", \"0\")\n\tdriver2 := newTestDriver(adaptor2, \"Device2\", \"2\")\n\tdriver3 := newTestDriver(adaptor3, \"\", \"1\")\n\twork := func() {}\n\tr := gobot.NewRobot(name,\n\t\t[]gobot.Connection{adaptor1, adaptor2, adaptor3},\n\t\t[]gobot.Device{driver1, driver2, driver3},\n\t\twork,\n\t)\n\tr.AddCommand(\"robotTestFunction\", func(params map[string]interface{}) interface{} {\n\t\tmessage := params[\"message\"].(string)\n\t\trobot := params[\"robot\"].(string)\n\t\treturn fmt.Sprintf(\"hey %v, %v\", robot, message)\n\t})\n\treturn r\n}\n"
  },
  {
    "path": "api/robeaux/robeaux.go",
    "content": "// Code generated by go-bindata.\n// sources:\n// css/.keep\n// css/application.css\n// css/application.css.map\n// css/fonts.css\n// fonts/inconsolata-bold-webfont.eot\n// fonts/inconsolata-bold-webfont.svg\n// fonts/inconsolata-bold-webfont.ttf\n// fonts/inconsolata-bold-webfont.woff\n// fonts/inconsolata-regular-webfont.eot\n// fonts/inconsolata-regular-webfont.svg\n// fonts/inconsolata-regular-webfont.ttf\n// fonts/inconsolata-regular-webfont.woff\n// fonts/roboto-bold-webfont.eot\n// fonts/roboto-bold-webfont.svg\n// fonts/roboto-bold-webfont.ttf\n// fonts/roboto-bold-webfont.woff\n// fonts/roboto-regular-webfont.eot\n// fonts/roboto-regular-webfont.svg\n// fonts/roboto-regular-webfont.ttf\n// fonts/roboto-regular-webfont.woff\n// fonts/robotoslab-bold-webfont.eot\n// fonts/robotoslab-bold-webfont.svg\n// fonts/robotoslab-bold-webfont.ttf\n// fonts/robotoslab-bold-webfont.woff\n// images/bullet-connections-2.png\n// images/bullet-connections.png\n// images/bullet-devices-2.png\n// images/bullet-devices.png\n// images/delete.png\n// images/devices-image-2.png\n// images/devices-image.png\n// images/logo-robeaux.png\n// images/robots-icon_03.png\n// index.html\n// js/.keep\n// js/script.js\n// DO NOT EDIT!\n\npackage robeaux\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n\tgz, err := gzip.NewReader(bytes.NewBuffer(data))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read %q: %v\", name, err)\n\t}\n\n\tvar buf bytes.Buffer\n\t_, err = io.Copy(&buf, gz)\n\tclErr := gz.Close()\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read %q: %v\", name, err)\n\t}\n\tif clErr != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\ntype asset struct {\n\tbytes []byte\n\tinfo  os.FileInfo\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\n\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\n\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\n\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\n\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\n\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\nvar _cssKeep = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x01\\x00\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\")\n\nfunc cssKeepBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_cssKeep,\n\t\t\"css/.keep\",\n\t)\n}\n\nfunc cssKeep() (*asset, error) {\n\tbytes, err := cssKeepBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"css/.keep\", size: 0, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _cssApplicationCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\x1c\\x59\\x8f\\xe3\\xb6\\xf9\\x3d\\xbf\\x42\\xf5\\x60\\xb0\\x3b\\x0b\\x49\\x2b\\xdf\\xb3\\x32\\xd2\\x26\\xd9\\x6c\\xd0\\x00\\x49\\x1f\\xd2\\xf6\\x69\\x31\\x28\\x28\\x89\\xb6\\xd9\\x91\\x48\\x81\\xa4\\x3c\\x9e\\x75\\xfc\\xdf\\x0b\\xea\\x32\\x45\\x51\\x12\\xe5\\x99\\x04\\x4d\\xd1\\x0c\\x82\\xb5\\xc9\\xef\\xbe\\xf4\\xf1\\x90\\xdf\\xbf\\xfb\\x93\\x85\\x09\\x4d\\x40\\x8c\\xbe\\x40\\x37\\x64\\xcc\\x3a\\xcc\\x5d\\xcf\\x9d\\x59\\xbf\\x5a\\x3f\\xff\\xf8\\x0f\\xeb\\x27\\x14\\x42\\xcc\\xa0\\xf5\\xab\\xb5\\x43\\xdc\\x45\\xe4\\x7d\\x0d\\x6b\\xbd\\x7b\\xbf\\xe7\\x49\\x7c\\xda\\x12\\xcc\\x9d\\x2d\\x48\\x50\\xfc\\xec\\x33\\x80\\x99\\xc3\\x20\\x45\\xdb\\x8d\\x93\\x30\\x87\\xc3\\x23\\x77\\x18\\xfa\\x02\\x1d\\x10\\xfd\\x3b\\x63\\xdc\\x9f\\x7a\\xde\\xed\\xc6\\x79\\x82\\xc1\\x23\\xe2\\xfa\\xd9\\x73\\x40\\xa2\\xe7\\x53\\x02\\xe8\\x0e\\x61\\xdf\\x3b\\x03\\xca\\x51\\x18\\x43\\x1b\\x30\\x14\\x41\\x3b\\x82\\x1c\\xa0\\x98\\xd9\\x5b\\xb4\\x0b\\x41\\xca\\x11\\xc1\\xe2\\x63\\x46\\xa1\\xbd\\x25\\x84\\x43\\x6a\\xef\\x21\\x88\\xc4\\x3f\\x3b\\x4a\\xb2\\xd4\\x4e\\x00\\xc2\\x76\\x02\\x71\\x66\\x63\\x70\\xb0\\x19\\x0c\\x73\\x0c\\x96\\x25\\x09\\xa0\\xcf\\xa7\\x08\\xb1\\x34\\x06\\xcf\\x7e\\x10\\x93\\xf0\\xf1\\x0c\\xb2\\x08\\x11\\x3b\\x04\\xf8\\x00\\x98\\x9d\\x52\\xb2\\xa3\\x90\\x31\\xfb\\x80\\x22\\x48\\x6a\\x48\\x84\\x63\\x84\\xa1\\x93\\x23\\x6c\\x0e\\x50\\x88\\x06\\x62\\x07\\xc4\\x68\\x87\\xfd\\x00\\x30\\x28\\x66\\x0b\\x42\\x3e\\x26\\xfc\\xed\\xe7\\x90\\x60\\x4e\\x49\\xcc\\x1e\\xee\\x6a\\x12\\x98\\x60\\xb8\\xd9\\x43\\xb4\\xdb\\x73\\xdf\\x3b\\x7f\\xde\\xa3\\x28\\x82\\xf8\\xc1\\xe6\\x30\\x49\\x63\\xc0\\x61\\x03\\xee\\x0c\\x4e\\x01\\x08\\x1f\\x85\\x2e\\x38\\x72\\x42\\x12\\x13\\xea\\x73\\x0a\\x30\\x4b\\x01\\x85\\x98\\x9f\\x81\\x0f\\x42\\x8e\\x0e\\xd0\\x06\\xfe\\x9e\\x1c\\x20\\x3d\\x91\\x8c\\x0b\\x11\\x84\\xd9\\x82\\x80\\x7e\\xe6\\x88\\xc7\\xf0\\xe1\\x14\\x10\\x1a\\x41\\xea\\x04\\x84\\x73\\x92\\xf8\\xd3\\xf4\\x68\\x45\\x84\\x73\\x18\\x9d\\x03\\x9b\\x71\\x4a\\xf0\\xae\\xf0\\xe0\\x53\\x21\\x54\\x40\\xe2\\xe8\\x1c\\x6d\\x71\\x31\\xc8\\xf8\\x73\\x0c\\x7d\\xc4\\x41\\x8c\\xc2\\xf3\\x7e\\x5a\\x0e\\xa2\\x2f\\xd0\\x9f\\xc1\\x64\\x53\\x79\\xc9\\x5d\\xad\\x61\\x62\\x79\\xe7\\x04\\xd0\\x47\\x49\\x64\\xff\\x66\\xbb\\xf5\\x36\\x85\\xdc\\x37\\x9e\\xe7\\x9d\\x59\\x02\\xe2\\x58\\xa2\\x71\\xef\\xdd\\x9e\\x59\\x16\\xd8\\x2c\\x4b\\xa5\\xd1\\xf5\\xf2\\x76\\x93\\xdb\\xb9\\x32\\xd3\\x26\\x25\\x0c\\x09\\xd7\\xf9\\x14\\xc6\\x40\\x68\\xdc\\x69\\x7c\\x41\\x89\\x93\\xd4\\x77\\x3c\\x77\\x09\\x13\\x41\\xfc\\x54\\xea\\xed\\x78\\xee\\x4c\\x0c\\xa1\\x64\\x57\\x5a\\xc4\\xf7\\xce\\xec\\xb0\\xcb\\x3d\\xe5\\x53\\x42\\xf8\\xdd\\x49\\x18\\x71\\x1b\\x93\\x27\\xbf\\x70\\xcb\\xb9\\x88\\xad\\x2a\\x18\\xa7\\x30\\xb1\\x16\\x5e\\x7a\\x3c\\xef\\xe9\\xc9\\x49\\xc8\\x17\\x27\\x20\\x47\\x21\\x31\\xc2\\x3b\\x5f\\x78\\x1a\\x62\\x2e\\x86\\x36\\x1d\\xc3\\xb5\\xd3\\x53\\x0a\\x2f\\x9c\\x40\\xc6\\xc9\\x39\\x24\\x11\\xb4\\x1f\\x83\\xc8\\x4e\\x29\\xb4\\x19\\x48\\xd2\\x46\\x4e\\x25\\x04\\x13\\x96\\x82\\x10\\xda\\x56\\xfd\\x71\\x73\\x31\\xd7\\x14\\x26\\xe7\\x20\\xe3\\x9c\\x60\\x1b\\xe1\\x34\\xe3\\x36\\x49\\x79\\x11\\xfe\\x0c\\xc6\\x30\\xe4\\xb6\\x48\\x33\\x40\\x21\\x38\\x15\\x9e\\x40\\x78\\x0f\\x29\\xe2\\x39\\x85\\xfa\\x4b\\x9d\\x6f\\x05\\xa5\\x8b\\x7c\\x07\\xc4\\x50\\x10\\xc3\\x8a\\x43\\x41\\xf2\\x94\\x67\\x6e\\x1e\\x8a\\x5b\\x42\\x93\\x22\\x58\\x4b\\x08\\x51\\x12\\xac\\x5c\\x90\\xcf\\xfc\\x39\\x85\\x5f\\x4f\\x8a\\xf1\\xc9\\x83\\x2d\\x0f\\x52\\xc8\\x20\\x57\\xc6\\x58\\x16\\x24\\x88\\x4f\\x1e\\x4e\\x55\\x7d\\x00\\x69\\x0a\\x01\\x05\\x38\\x84\\x7e\\x41\\x64\\x13\\x66\\x94\\x11\\xea\\xa7\\x04\\x61\\x0e\\x69\\xc9\\xf2\\x73\\x84\\x18\\x08\\x62\\x18\\x3d\\xc8\\xcc\\xeb\\xc1\\x53\\x89\\x14\\xc1\\x2d\\xc8\\x62\\x5e\\x22\\xf9\\x7e\\xee\\xc2\\x2d\\x09\\x33\\xe6\\x20\\x8c\\x21\\x2d\\x64\\x69\\x8f\\xd7\\xd1\\xb2\\x49\\x41\\x14\\x09\\xaf\\x7a\\xe7\\x1c\\xf4\\x24\\x07\\x69\\x51\\x15\\xcf\\xb2\\x3e\\xe1\\x1e\\x86\\x8f\\x01\\x39\\xaa\\xaa\\x83\\x08\\x91\\x89\\x48\\xcb\\x3a\\x4c\\xea\\x0c\\x3d\\xaa\\x3c\\x4a\\x1c\\x9c\\x25\\x01\\xa4\\x93\\x07\\xdf\\xaf\\x6c\\x93\\x8b\\xe6\\xb0\\x14\\x61\\x47\\x76\\x7e\\x27\\x3c\\xc9\\x78\\x13\\xfe\\x54\\x0a\\x9e\\x07\\x60\\xc3\\x0d\\x10\\xd0\\x70\\xaf\\x77\\x83\\xf0\\xfb\\x16\\xc1\\x38\\xda\\xf4\\x25\\x40\\x85\\x38\\x2a\\x3f\\xb4\\x32\\x5c\\xe4\\x2f\\x46\\x9c\\x50\\x88\\x11\\xeb\\x54\\xee\\x44\\x89\\x60\\x48\\x28\\x10\\xe5\\x43\\xa7\\x51\\x1e\\xba\\xb9\\x4a\\x0c\\xf2\\xca\\xd5\\xa2\\x46\\x32\\x12\\xa3\\xc8\\xba\\x09\\x3d\\xf1\\x57\\xe7\\x87\\x35\\x4b\\x25\\x1f\\xb9\\xf3\\xa5\\xa8\\x7b\\xee\\x6a\\x56\\xfc\\xbb\\x16\\x05\\x26\\x86\\x3b\\x88\\x23\\x5d\\xd4\\xd4\\x89\\xd8\\xcc\\xfe\\x2a\\x5f\\xdb\\x65\\x98\\x8b\\x08\\xae\\xea\\x77\\x48\\xe2\\x18\\xa4\\x0c\\xfa\\xd5\\x87\\x4d\\x39\\x21\\x0a\\x42\\xc9\\x20\\xb2\\xf9\\xfe\\x74\\x61\\xf8\\x4d\\x59\\x46\\x42\\xd8\\x28\\x28\\x6f\\x7e\\xc4\\x21\\xc1\\x8c\\xc4\\x80\\x83\\x37\\x1b\\x46\\x43\\x3f\\xa3\\xf1\\xdb\\xc9\\x7b\\x01\\xc3\\xde\\xa3\\xcb\\xa4\\x23\\xa4\\x10\\x46\\x13\\x33\\x2e\\x24\\x7c\\x72\\x37\\x0a\\xfc\\x2f\\x37\\x08\\x6e\\xd1\\x71\\x72\\x67\\x89\\x32\\x01\\xf8\\xdb\\x09\\x4c\\x02\\x18\\x45\\x30\\x72\\x48\\x0a\\xb1\\x70\\xdc\\xe4\\xce\\x36\\xa2\\xf6\\x44\\xb6\\x5b\\x89\\x4e\\xf1\\xd5\\x0c\\x95\\x73\\x19\\x93\\xd3\\x0c\\x8e\\x61\\xcc\\x0e\\xbb\\x1b\\x69\\x52\\xcc\\x49\\xd4\\xd8\\x61\\x37\\xb9\\xdb\\xc8\\x8e\\x5b\\x7b\\xde\\x46\\x7a\\x74\\x96\\x75\\xe1\\xc5\\x9e\\xa0\\x70\\x97\\xc5\\x80\\x8e\\x70\\x86\\x06\\xe3\\x65\\xfe\\x50\\x09\\x8e\\x73\\x89\\x8a\\x3d\\xda\\x2b\\x2a\\x01\\xc5\\x31\\xe5\\x74\\xaf\\x6f\\x16\\xa3\\x7c\\xf3\\x0b\\x09\\x08\\x27\\xd6\\xdf\\x63\\x10\\xb4\\x7d\\x43\\xf3\\x49\\x16\\x83\\xc0\\x24\\x49\\x7a\\xa0\\xc7\\xfb\\xa4\\x8b\\xd8\\xb0\\x3f\\xba\\x30\\x8d\\x7c\\xd1\\x85\\x2c\\xfc\\x50\\xcc\\xfd\\x4b\\x4c\\xbe\\x72\\x82\\x14\\x4e\\xe8\\xb2\\xbf\\xb9\\xed\\x5f\\xcd\\xee\\xd7\\xd9\\xfc\\x6a\\x7b\\x77\\xd9\\xfa\\xf7\\x35\\xb3\\x59\\xf5\\xe9\\x06\\xbe\\xda\\xd8\\xe3\\x6b\\x4e\\x07\\xe2\\x18\\x93\\xeb\\x2a\\x4d\\x31\\x75\\x7d\\x91\\xc9\\x57\\xca\\xda\\x96\\xef\\xfc\\xce\\x7e\\xe7\\x07\\x70\\x4b\\x28\\xb4\\xdf\\xf9\\x60\\xcb\\xf3\\x96\\xb3\\x06\\x2c\\x3b\\xf4\\xa2\\x3d\\x6a\\xb5\\xf4\\xd5\\xb3\\x7e\\x95\\x1e\\xad\\xa9\\xe8\\x4d\\x5a\\x0b\\xc6\\x9b\\xed\\x76\\x2b\\x8f\\xa2\\x04\\xec\\x8a\\xb6\\x67\\xa3\\xe9\\x76\\xc2\\xb0\\xea\\x2a\\x44\\x9b\\x9a\\x31\\x7f\\x91\\x96\\x0d\\xdb\\x1e\\x44\\xe4\\xc9\\x47\\x98\\x41\\x6e\\x79\\x96\\xc0\\x11\\xff\\xd3\\x5d\\x00\\xde\\x7a\\x76\\xfe\\xe7\\x7a\\xeb\\xe5\\xdd\\x26\\x5f\\x15\\x14\\xab\\xb5\\x4b\\xe3\\x42\\xa8\\x05\\x01\\x83\\x0e\\xc2\\xa2\\x11\\xb5\\xdc\\xe9\\x92\\xd9\\x17\\xaa\\xad\\xb9\\xb3\\x1b\\x70\\x6c\\xbb\\xf0\\x20\\x7a\\x43\\x4e\\x48\\x6c\\x95\\x9f\\x63\\xc4\\x38\\xc4\\x90\\x5a\\x65\\x03\\xe8\\x86\\x24\\x49\\x00\\x8e\\xfa\\x80\\x6a\\x1b\\x4d\\x3d\\x21\\xf4\\x32\\x3d\\xca\\x8b\\x27\\xf1\\x55\\xee\\xe3\\x67\\x5e\\xae\\xb0\\x6c\\x02\\x01\\xa2\\xdd\\x01\\xa8\\x5b\\xbc\\x7c\\x39\\x74\\xe9\\x33\\x8b\\xa6\\x52\\xe8\\x50\\xac\\xcb\\x0d\\x34\\xa9\\x00\\x0d\\xf4\\x29\\xd7\\xfa\\xca\\x52\\x48\\x70\\x73\\x02\\xb4\\xbb\\x68\\xbb\\x4c\\x8f\\xd6\\xdc\\xeb\\xd7\\x36\\x1f\\x68\\x69\\x5b\\x10\\xcb\\x23\\xfe\\xd5\\x9c\\xa0\\x0f\\xc6\\x72\\x74\\xfa\\xf1\\xbb\\xef\\xbe\\xbf\\xdf\\xc8\\xf1\\x52\\x80\\x2a\\xeb\\xcc\\x2c\\x4d\\x21\\x0d\\x01\\x83\\x92\\x84\\xbf\\x9d\\x89\\x6d\\x89\\x49\\xbe\\x1e\\x34\\x61\\x52\\x02\\x9a\\x30\\x29\\x41\\x2f\\x4c\\xca\\xdd\\x1c\\x03\\x2e\\x15\\xa4\\x09\\x9b\\x0a\\xb6\\xe6\\xe3\\x1a\\xf3\\x71\\x47\\xf0\\x29\\x61\\x07\\x1c\\xbd\\xfa\\xb0\\x00\\x81\\xe2\\x68\\xe8\\x89\\xbf\\xf3\\xff\\x9a\\x21\\xb4\\x35\\x57\\xd2\\xd2\\xad\\x76\\x28\\x4c\\xf8\\x5f\\x60\\x4d\\x24\\xb8\\x40\\xb7\\xb9\\x19\\xe7\\x4b\\x0b\\x63\\x0c\\xe7\\x56\\x06\\x5d\\x66\\x4c\\x53\\xa9\\x85\\x31\\x8a\\xbf\\x9a\\x5c\\x97\\x19\\x73\\xa7\\xb7\\x50\\x46\\x49\\xd0\\x0e\\xb7\\x6a\\x6a\\x44\\xdc\\xb5\\x50\\xc6\\x88\\xe0\\xb6\\x44\\x90\\xb6\\xca\\x86\\x99\\xcb\\xc0\\x06\\x6c\\x65\\x70\\x0d\\x43\\xe3\\xb8\\x6b\\xa3\\x8c\\x62\\xde\\x8a\\x3c\\x69\\xca\\x34\\xf4\\xda\\x28\\xe3\\x44\\x50\\x83\\x4f\\x9a\\x32\\x76\\xbd\\x06\\x67\\x9c\\x10\\x3d\\xce\\x37\\x0f\\x40\\x0d\\xce\\x28\\x29\\x2a\\xac\\x6a\\x87\\xed\\x32\\x63\\x49\\x4d\\x86\\x6e\\xd6\\xa0\\xef\\xe8\\x01\\xd1\\x50\\x2c\\xb1\\x74\\xbc\\x0c\\x54\\x1a\\xd0\\x7b\\x1c\\x3f\\xb5\\x79\\xb9\\x4a\\x7f\\x83\\x84\\xea\\x94\\xaa\\x87\\xef\\x88\\xf6\\xe8\\x3a\\x8b\\xf4\\xf0\\x56\\xfb\\xad\\xeb\\xec\\x32\\x9c\\xe5\\xdd\\xb2\\x75\\xf3\\x1d\\xd1\\xd1\\x5d\\x69\\x97\\x6e\\xde\\xad\\xce\\xe8\\x3a\\xc3\\x18\\x64\\x7d\\xb7\\x74\\x3d\\x9c\\xc7\\x34\\x5f\\x57\\xda\\xc6\\xa4\\x8c\\xf4\\xd5\\x1a\\xf3\\x0e\\xef\\x1a\\xe3\\xf4\\x71\\x36\\xef\\x18\\xaf\\x35\\x8e\\xa6\\xe1\\x1c\\x58\\x57\\x95\\x5d\\x68\\x86\\xcb\\xa7\\x03\\x64\\x90\\xf7\\x37\\xee\\x1f\\xe7\\xab\\xe9\\xe2\\x8a\\x15\\x5a\\xd6\\x5c\\x4b\\x65\\xcd\\x55\\x4f\\xa6\\x34\\xe5\\x19\\x6e\\xb6\\x2c\\x42\\xae\\x06\\x7e\\x3e\\x20\\x53\\xc8\\x07\\x5a\\x38\\x46\\x6b\\x11\\x30\\x5f\\x84\\xf3\\x65\\xdf\\x5a\\xc4\\x48\\xbc\\x4e\\xe6\\x7d\\xfd\\x7f\\xd6\\xea\\xd1\\xb3\\x8e\\xde\\x39\\xeb\\xe8\\x69\\xb3\\xae\\x4e\\x33\\xeb\\xea\\xff\\xb2\\x76\\x87\\x96\\x75\\xf5\\x4d\\x59\\x57\\x37\\x93\\x75\\x76\\x18\\xd9\\x98\\xa7\\x7e\\xd6\\xf3\\x5c\\xcc\\x06\\x9f\\x10\\xd9\\x60\\xad\\xcc\\x86\\x2b\\x86\\xce\\x99\\xaa\\x53\\x1a\\x63\\xad\\x40\\xd4\\x3b\\xa6\\x39\\xd3\\xcd\\xa2\\xcd\\xbd\\xe5\\x9e\\xe6\\x60\\x8b\\x7f\\x87\\x8b\\x94\\xa9\\x1e\\x36\\x83\\x6e\\x12\\xe0\\xfd\\xb3\\x43\\xae\\x92\\x12\\xb6\\x1f\\xc6\\x44\\x94\\xee\\x42\\xd7\\x55\\x9e\\x8a\\x74\\x8b\\xe0\\x01\\x85\\xa5\\x09\\x18\\x18\\xaa\\x0b\\x8b\\xfb\\x8f\\xdf\\x7e\\xfb\\x71\\x74\\xa9\\x2b\\x98\\xc8\\x4e\\x2a\\x47\\x24\\xdf\\x94\\x23\\xb2\\x4b\\x8a\\xa1\\x46\\x30\\x08\\x11\\x65\\x3a\\xf9\\x77\\x89\\x4a\\xfe\\x5d\\x45\\x30\\x2a\\x79\\xf3\\x19\\x88\\x3e\\x4c\\x7b\\x4a\\xde\\x08\\x01\\xbb\\x04\\xe8\\x29\\x7b\\x25\\xa9\\x66\\x92\\x29\\x83\\x6d\\x03\\x6a\\xd3\\x4c\\x9d\\xd2\\x48\\xac\\x4d\\xb4\\x62\\x4e\\xcd\\x34\\x75\\xb4\\x2d\\x84\\x3e\\xd7\\x5a\\x73\\x7d\\xac\\x86\\xb2\\xad\\x8c\\xd2\\xfe\\xe9\\x81\\x7c\\x6b\\x84\\xdc\\x00\\x90\\x91\\x38\\x2d\\xbf\\x2b\\xde\\x6b\\x0c\\xa9\\x41\\xab\\xf5\\x5c\\x73\\xa2\\x93\\x7c\\x8b\\xb1\\xea\\xb3\\xe6\\x98\\xca\\x5a\\xef\\x2f\\x65\\xa6\\x9b\\xc5\\x90\\xaf\\x04\\x74\\xef\\xe4\\x80\\x9f\\xa4\\x94\\xee\\x05\\x31\\x10\\xa3\\xbb\\x28\\x76\\x15\\xb2\\x22\\x19\\x43\\x82\\x31\\x0c\\x07\\xda\\xbe\\xef\\x3f\\x7d\\x5c\\xaf\\xe6\\xa3\\x6b\\x61\\x49\\x5b\\x76\\x4a\\x35\\x24\\x79\\xa3\\x1a\\x92\\xdd\\x50\\x8e\\x19\\x55\\xb3\\x68\\x19\\xdc\\xcf\\x3f\\xf4\\x54\\x33\\x03\\x06\\x3d\\xd5\\xaa\\x82\\x6c\\x06\\xbc\\x3a\\xaa\\xd1\\x51\\x1b\\xf6\\xad\\x39\\x9d\\x50\\xda\\xe0\\x2f\\x27\\xd5\\xf8\\x6f\\x0d\\x6b\\x24\\xd1\\x67\\x41\\x7b\\xb2\\x97\\xdd\\x50\\x2e\\x94\\x08\\x43\\xf3\\x03\\x19\\xd1\\x8c\\x8f\\x21\\x28\\x33\\x91\\xba\\x53\\xa3\\x2b\\xae\\x8b\\xcb\\xc7\\xf2\\x0d\\xd6\\x4f\\x3f\\x7c\\xfa\\xf4\\xc3\\x62\\x23\\x1f\\x96\\x4f\\x8a\\xc3\\xf2\\x89\\x6d\\x4d\\xfe\\x0a\\xe3\\x03\\xe4\\x28\\x04\\xd6\\xdf\\x60\\x06\\x27\\xb6\\x55\\x0f\\xd8\\xd6\\xb7\\x14\\x81\\xd8\\xb6\\xa4\\x1b\\xd1\\x55\\x5e\\x2e\\x16\\xe7\\x9b\\x98\\x80\\x08\\xe1\\xdd\\x29\\x01\\x47\\xe7\\x09\\x45\\x7c\\xef\\x7f\\x58\\xad\\xd2\\x63\\x79\\xd1\\xcc\\x89\\xe1\\xb6\\xb8\\x9a\\x57\\x0d\\xd0\\xfa\\xb2\\x5e\\x91\\x7b\\xc5\\xbd\\xd7\\x10\\xe6\\x87\\x7f\\x15\\x35\\xbf\\x3c\\x3e\\x0e\\x63\\x08\\xa8\\x1f\\x10\\xbe\\xdf\\x94\\x37\\xec\\xfc\\xc9\\xa4\\x3e\\xc3\\xcc\\x6f\\x95\\x9d\\x6f\\x30\\xe1\\xce\\x56\\x28\\xf9\\x4a\\x32\\xd4\\xf4\\xc6\\x48\\xe1\\x52\\xf2\\xa4\\xdc\\x18\\xde\\x6e\\xe4\\x23\\xcc\\x8a\\x37\\x27\\x69\\x7e\\x80\\x7b\\x76\\x05\\x2d\\x80\\x30\\xa4\\x57\\xc8\\x2d\\x61\\x8f\\x91\\x52\\x7f\\xf6\\xae\\x3d\\x13\\x6e\\x9c\\xae\\xba\\x8b\\xd9\\xfd\\x72\\x5d\\xdd\\xfc\\x5d\\x68\\x0e\\x63\\x2f\\x21\\x51\\x6b\\x7d\\x5f\\x1f\\xe5\\x8f\\x39\\x76\\x57\\xef\\x63\\x4a\\x57\\x4a\\x35\\xd7\\x31\\xa5\\x59\\xfd\\x9d\\x84\\xe2\\x2e\\x6c\\x91\\x8c\\x85\\xde\\xe5\\x97\\x4a\\xfb\\xe2\\xeb\\xa9\\x99\\x41\\xe5\\x7e\\xc3\\xe5\\x1a\\x7a\\x75\\x9b\\xb8\\x1c\\x90\\xee\\x09\\x77\\xdd\\xbf\\x6d\\xde\\x0f\\x1e\\x80\\xaa\\xae\\x16\\x0f\\x80\\x55\\x17\\x8b\\x07\\xc0\\xb6\\x28\\x86\\x93\\x87\\x3f\\x9b\\x31\\xd0\\xea\\x94\\xcf\\x1b\\x6a\\x66\\x02\\x5b\\xb3\\x37\\x01\\xae\\xb5\\x34\\x01\\xee\\xd3\\xb5\\x03\\xbf\\xa9\\x71\\x9e\\x18\\x16\\xdf\\x6b\\xde\\x2e\\x90\\xee\\x92\\xc8\\xd9\\x30\\x5f\\xa4\\xc7\\x0a\\x2d\\x6a\\xdc\\x3e\\x92\\x2e\\x41\\xda\\x97\\x1b\\xee\\x55\\x3e\\xcc\\x45\\xd2\\x17\\xdd\\xa8\\x53\\x6e\\x90\\x29\\x7b\\xac\\x57\\x15\\x02\\x85\\x62\\x59\\x0e\\x9a\\x84\\x47\\x55\\x32\\x85\\x60\\x73\\xe7\\xcf\\x6e\\x4f\\x5f\\x36\\x1a\\xd5\\x8d\\xbf\\x26\\xa2\\x6e\\x53\\x30\\xd7\\x7a\\x1b\\x13\\xc0\\x7d\\xa1\\xe4\\xa6\\xf1\\x2a\\x4b\\x53\\xdb\\x99\\x3b\\x5f\\xae\\x57\\xcb\\xdb\\x4d\\x61\\xa0\\xc5\\xbd\\x7b\\x3f\\x9b\\x4e\\xd7\\xb7\\x03\\x02\\xfb\\x31\\x60\\xdc\\x09\\xf7\\x28\\x8e\\x7a\\x65\\x6f\\xc0\\x75\\xab\\xd1\\x03\\xa6\\xa5\\x75\\x6a\\xe8\\xe0\\x9d\\xbf\\x49\\x60\\x84\\x80\\xc5\\x42\\x0a\\x21\\xb6\\x00\\x8e\\xac\\xb7\\x17\\xa7\\x5b\\xeb\\xd5\\x7d\\x7a\\xbc\\x3b\\xfd\\x41\\x5c\\x90\\xbf\\xe5\\xf4\\x87\\xb2\\xbe\\x46\\x5a\\xd1\\xf6\\xab\\xb4\\xc4\\xd8\\xa9\\xdd\\x19\\xb4\\x91\\xeb\\xdd\\xe7\\x26\\x7e\\x39\\x7c\\x65\\x60\\x7b\\xee\\xec\\xc3\\x74\\xbe\\xbe\\xdd\\x14\\xe8\\xf9\\x0d\\x37\\xdd\\x23\\xba\\x5b\\x9e\\x1e\\x33\\xb5\\x21\\x54\\x1b\\xb5\\xa9\\x56\\x3b\\xf7\\xcc\\xa9\\x9b\\x0e\\x95\\xac\\x06\\xe4\\x85\\x69\\xdd\\x84\\xf2\\xf4\\x17\\xd7\\x4a\\x98\\xb2\\x66\\xcf\\x3d\\x4d\\x85\\xd5\\xca\\xd6\\x63\\xa0\\x7e\\xe8\\xab\\x8c\\x25\\x0d\\x1a\\x70\\x93\\x06\\x4f\\xbd\\x79\\x96\\x47\\xbc\\xfe\\x94\\x6e\\x00\\x93\\xc2\\x84\\xb4\\x8f\\x69\\x8a\\xd1\\x1a\\xf3\\xb6\\xd1\\xb1\\xce\\xd2\\xe3\\x6f\\x5e\\xbb\\xfe\\x9b\\xaa\\x50\\xab\\x72\\x60\\x70\\x68\\xf4\\xf7\\x9e\\xe7\\x55\\xfd\\xf0\\xda\\xbb\\x3c\\xaa\\xcb\\x50\\x9c\\x89\\x50\\xc4\\xe0\\x60\\xb9\\x31\\xd9\\x75\\xbc\\x77\\x59\\xbd\\x8d\\xb7\\x2c\\x6f\\x73\\x5a\\x9e\\xe5\\x95\\x38\\x08\\x3f\\xb2\\xd2\\x1a\\xb9\\x00\\x0d\\x57\\x2c\\x6b\\xd2\\x02\\xcc\\x02\\x27\\x75\\x3b\\x43\\xb9\\xc0\\xa9\\x4f\\x9d\\x97\\x5e\\x26\\x9d\\x29\\x52\\x54\\xb7\\x39\\x1b\\x0d\\xb4\\xf6\\x3e\\xa9\\x84\\xd5\\x5e\\xd8\\x56\\xa8\\x1a\\xa8\\x26\\x87\\x7c\\xff\\x27\\x3f\\x2e\\x75\\x10\\xde\\x92\\xab\\x5a\\xa7\\x0b\\xfa\\x98\\x06\\xc9\\x2c\\x0d\\x24\\xd1\\xda\\x4f\\x12\\x99\\xb5\\xe5\\x56\\x2f\\x03\\x37\\x06\\x43\\x92\\xa4\\x04\\x8b\\x5c\\x16\\x9f\\xf3\\x6d\\x00\\x44\\xb0\\xe5\\x62\\x90\\x14\\x99\\xab\\x9d\\x95\\x29\\x08\\xc8\\x46\\x10\\xc9\\x1e\\x5d\\xcc\\x8d\\x13\\xfa\\xf7\\x15\\xf5\\x8a\\xec\\x57\\x72\\xcf\\xc9\\x33\\x44\\x27\\x76\\xa3\\x0e\\x98\\x6a\\xa0\\x3e\\x2b\\x8c\\x94\\xe9\\xed\\x41\\x34\\x92\\x59\\x6e\\x90\\xc5\\x31\\xe4\\xce\\x85\\xe8\\x08\\x23\\xeb\\xb1\\x4d\\x65\\x1d\\xe6\\xad\\x0a\\x59\\x94\\xd0\\x6b\\x04\\xac\\x31\\x47\\x0b\\x57\\x62\\x2a\\x05\\x46\\xce\\xf2\\xa5\\xf7\\x92\\x90\\xfe\\xbf\\x07\\x4c\\x3d\\x20\\xdb\\x3c\\x7f\\xce\\xe9\\x23\\xba\\x78\\x25\\x7f\\x84\\x84\\x15\\x82\\xb1\\x60\\xe5\\x4b\\xff\\xd2\\xd6\\x53\\xb3\\x52\\x78\\x6a\\x19\\xc8\\xcb\\x8c\\x2a\\xbe\\xfa\\x2e\\xb6\\x2a\\xb0\\xbc\\xaa\\x36\\xdd\\x0a\\x6c\\x13\\xa8\\x5e\\x1f\\x68\\x56\\x36\\xf5\\x45\\xd9\\xd6\\x73\\x5e\\x4f\\xeb\\xca\\x3d\\x8b\\x5e\\x62\\xa3\\x77\\x32\\xc2\\x34\\x4d\\x1d\\x44\\x9c\\xd2\\xdf\\xd7\\x6c\\xbe\\xb6\\xb4\\x55\\x68\\x8e\\xb2\\xba\\x82\\x6b\\x71\\x7a\\x6a\\x3e\\x17\\x44\\xa7\\x53\\xa9\\x50\\x2f\\x19\\x34\\x5c\\x2d\\xf7\\x11\\x3e\\xb7\\xde\\x61\\x96\\x77\\x8a\\x8b\\xc7\\x69\\x45\\xaa\\x50\\x28\\xa7\\xfe\\xb4\\x47\\x1c\\xe6\\xef\\x31\\x43\\x1f\\x93\\x27\\x0a\\x52\\x0d\\xf5\\x03\\x88\\x33\\x68\\x45\\xe8\\xa0\\x6f\\x0b\\xeb\\x77\\xaa\\x59\\x48\\x49\\x1c\\x6f\\x9a\\x3e\\x9e\\x5d\\x7c\\x1c\\x45\\x91\\x86\\x61\\xb5\\x13\\x7b\\x7f\\x7f\\x7f\\x96\\x52\\xe9\\xca\\x3d\\xe6\\x0a\\x7d\\x9c\\x27\\xa4\\x04\\xae\\xae\\x2c\\xe8\\x93\\x5a\\x79\\x36\\x36\\x36\\xcc\\x2d\\xd3\\xcd\\x92\\x11\\xec\\x34\\x6b\\xfa\\x36\\x76\\xbe\\x48\\xb6\\xb5\\x13\\x2f\\xbb\\xcb\\xab\\x23\\x29\\x5d\\xca\\x6d\\x71\\x7b\\xf9\\x6d\\x5e\\x53\\x8e\\x72\\x99\\x6d\\x29\\x2f\\x4f\\xbe\\xa2\\x01\\x24\\xb2\\x43\\x22\\xbd\\xb2\\x21\\x5a\\x9c\\x4f\\x8d\\x00\\xbe\\xfc\\x46\\x82\\xc8\\x02\\x6b\\x5a\\x3c\\xe2\\x74\\x0e\\xea\\x6f\\x70\\xf3\\xa7\\x4d\\xf3\\xe1\\xd2\\xbb\\x8b\\x71\\x79\\x22\\xb5\\x7e\\x3f\\xe1\\xda\\x44\\x30\\x12\\x51\\x66\\xdf\\xad\\x6b\\xdd\\xf9\\xeb\\x23\\xd5\\xb4\\xeb\\x37\\x93\\x4b\\xcb\\xac\\x25\\xb8\\x99\\x31\\x1b\\x0d\\xa3\\x4e\\xb7\\x4e\\x36\\xec\\x75\\xb7\\xb0\\xb4\\xbc\\x0d\\x56\\x17\\xac\\x6f\\xff\\xa9\\xd7\\x40\\x72\\x1c\\x95\\xaf\\xef\\xca\\xe9\\xb9\\x9f\\x29\\x59\\xb3\\x9f\\xe9\\x2a\\xa4\\x9c\\xd0\\x29\\xa0\\x20\\x61\\x96\\x9b\\x9f\\xb7\\x58\\xfe\\x16\\xd1\\xae\\x7d\\xb4\\x6e\\xc8\\x66\\xc0\\xf5\\xd0\\xef\\x25\\x29\\x3d\\x8a\\xb4\\x24\\x4a\\x0a\\x9a\\x99\\xf2\\xf8\\x53\\x4f\\xbc\\x8f\\x71\\xf9\\x9b\\x41\\x57\\x05\\xc5\\x6c\\xed\\x2e\\x3e\\xac\\x56\\xab\\x5b\\xa5\\x04\\x6c\\x24\\x6a\\xd5\\x86\\x90\\x97\\x1e\\xad\\x99\\xeb\\xdd\\xcf\\xf3\\xff\\x6e\\xbb\\xd5\\x6b\\x04\\x4f\\xa7\\xa6\\x3d\\x9b\\x9d\\x9d\\xc4\\x7a\\xf4\\xef\\x8b\\xc6\\xee\\xda\\xdf\\x5f\\x9f\\x5f\\x7c\\x04\\xd4\\xcd\\x78\\xf0\\xc8\\x40\\x03\\x38\\x42\\x2f\\x5d\\x9c\\x5d\\xf3\\x80\\xd2\\xc6\\x9d\\xfe\\x0d\\xe4\\xdf\\xce\\x56\\x03\\x51\\xa5\\x7f\\x21\\xc2\\xd4\\xbe\\x83\\x51\\x36\\x44\\xbe\\xcf\\x2b\\xd2\\xf9\\xef\\x1b\\x51\\xc2\\xde\\xa8\\xaf\\xfa\\xb5\\x01\\xae\\xb3\\xe3\\x7c\\xea\\xae\\x57\\xd3\\xa5\\x62\\xc7\\x36\\xf5\\x6e\\x3d\\x7b\\x61\\x7b\\x23\\xaf\\x22\\xc3\\x38\\xe0\\xad\\xdd\\xfb\\xc6\\xe4\\x4b\\x76\\xd2\\x3b\\x39\\x1a\\x9c\\xd1\\xa9\\x70\\xfd\\xea\\xc4\\x84\\xb5\\xd5\\x10\\x83\\xd7\\x89\\xbf\\x72\\xa7\\xeb\\xd9\\x54\\xf9\\xcd\\x3d\\xb1\\xf0\\x6d\\x1d\\x64\\xb4\\xc5\\xe8\\xd3\\x4d\\x99\\x1f\\xd6\\x49\\xff\\x5a\\x99\\x34\\x55\\xef\\x61\\x7b\\x9e\\xba\\xfb\\xf0\\xd5\\xfb\\x77\\x37\\x16\\x23\\x19\\x0d\\xe1\\xcf\\x20\\x4d\\x11\\xde\\xfd\\xf3\\x97\\x9f\\xbe\\x06\\x69\\x1a\\xa3\\x30\\xdf\\x43\\x77\\x43\\xc6\\xdc\\x04\\xa4\\xd6\\xbb\\xf7\\x5f\\xfd\\x27\\x00\\x00\\xff\\xff\\x7c\\x22\\x8a\\xed\\xf2\\x52\\x00\\x00\")\n\nfunc cssApplicationCssBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_cssApplicationCss,\n\t\t\"css/application.css\",\n\t)\n}\n\nfunc cssApplicationCss() (*asset, error) {\n\tbytes, err := cssApplicationCssBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"css/application.css\", size: 21234, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _cssApplicationCssMap = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xcc\\x59\\x5b\\x77\\xda\\x3e\\x12\\x7f\\xef\\xa7\\xe8\\xe1\\x35\\xea\\x9f\\x24\\x24\\x24\\xe9\\xdb\\xcc\\xd8\\x38\\x6e\\x9a\\x82\\x4b\\x68\\x2e\\x7b\\xf6\\xf4\\x70\\x0b\\x18\\x8c\\x4d\\x6c\\x73\\xdd\\xb3\\xdf\\x7d\\x8f\\x6c\\xc9\\x12\\xc8\\xa5\\xf9\\x6f\\x9a\\x3d\\xfb\\x06\\xd2\\x48\\x33\\xf3\\x9b\\xbb\\xfc\\xaf\\x0f\\x95\\xe5\\x30\\x4e\\xfc\\x28\\xac\\x7c\\xfe\\x58\\x63\\x1f\\x2a\\xb3\\xee\\x7c\\xee\\x87\\xa3\\xa4\\xf2\\xf9\\x63\\x05\\x00\\x80\\x9d\\x59\\x00\\x67\\x16\\x03\\xf0\\xce\\x2d\\xe6\\x02\\xdc\\x30\\x02\\xba\\x66\\xf7\\x00\\xf7\\x8c\\x00\\x6c\\xd6\\x01\\xe8\\xf0\\xb5\\x25\\xb2\\x08\\x01\\x22\\xcc\\x97\\x5d\\x00\\x97\\x2f\\x9f\\x20\\x5b\\x21\\xc0\\x6a\\x77\\xb9\\x39\\x26\\xed\\xb2\\x5b\\x80\\xdb\\x7c\\x9b\\x00\\x88\\x11\\x74\\x1f\\xd8\\x71\\x03\\x1e\\x3d\\xbe\\xfd\\x8d\\x35\\x01\\x9a\\xf9\\xf6\\x4d\\x7e\\xc4\\x1b\\x23\\x3b\\x45\\x70\\xf8\\x21\\xfa\\xa2\\xed\\x3f\\x02\\x3c\\xf2\\xb5\\x18\\x59\\x1f\\xa0\\x9f\\x2f\\x7a\\x00\\xfc\\x22\\xef\\x04\\xd9\\x0b\\x02\\x24\\x5c\\x12\\x9a\\xa3\\x76\\x4c\\xca\\xda\\x33\\x25\\xf1\\x1e\\x98\\x8f\\x40\\x6d\\xbe\\xdd\\x32\\x8f\\x74\\x9e\\x25\\x35\\x01\\x1b\\x21\\xc0\\x48\\xe8\\x29\\xf0\\x69\\x56\\x91\\x2f\\x93\\xa1\\x89\\xb8\\xbe\\xf3\\xc4\\x29\\x33\\x99\\x7f\\xb0\\x2e\\x40\\x77\\x07\\xd3\\x66\\x0d\\x99\\x07\\xc4\\x8f\\xd0\\x57\\x0d\\x72\\x09\\x62\\x88\\xcc\\x11\\xa2\\x37\\xe4\\x19\\xb0\\xa5\\x12\\xde\\x1c\\x99\\x0d\\xe0\\xf0\\x6d\\x8b\\xb5\\x01\\xda\\xf9\\xb6\\x23\\xd6\\x06\\x9a\\xb6\\x02\\xa3\\x66\\x80\\x9a\\x59\\xd4\\x8d\\x12\\xa0\\x31\\x4a\\x13\\x68\\x52\\xf4\\xf8\\x9a\\x30\\x85\\xc1\\xa5\\x39\\xe6\\x40\\x93\\x90\\xb1\\x4c\\x08\\xa5\\x96\\xc0\\x84\\x06\\x52\\x1c\\x25\\x18\\x05\\x25\\x16\\x75\\x4e\\x74\\xfd\\xc5\\x8d\\x4a\\x7f\\xa7\\xa7\\xed\\x2a\\x55\\x85\\x0d\\x3a\\x13\\x2c\\xdd\\x16\\x42\\x34\\x1f\\x38\\xbf\\x61\\xee\\x15\\x4a\\x1c\\x41\\xd7\\x09\\x90\\xff\\x14\\x86\\x29\\x85\\x51\\x21\\x3f\\xcc\\xef\\x51\\x4e\\x41\\xe7\\xa8\\x61\\x2b\\x17\\x97\\x58\\x2a\\x85\\x92\\x51\\x49\\x51\\x04\\x11\\x72\\xe7\\x74\\x8c\\x90\\x2c\\xe2\\x90\\x26\\x64\\x62\\x3e\\xc5\\x31\\xb2\\x17\\x02\\x57\\x38\\xb5\\xb2\\xa8\\x80\\x86\\x06\\x92\\x83\\xb6\\x56\\x12\\x1b\\xcd\\x07\\x0d\\x04\\x25\\x9d\\x04\\x38\\x44\\xd6\\x2d\\x9c\\x57\\x19\\x4f\\x5c\\x7d\\x9f\\x22\\xdb\\xd8\\xe0\\xbc\\x64\\x72\\x86\\xc8\\xa6\\x08\\x30\\xc5\\x1d\\x98\\x79\\xf2\\x30\\x0c\\xd7\\x9c\\x64\\xd2\\x53\\x71\\xb0\\x94\\x62\\x64\\x01\\x65\\x39\\x87\\xd2\\x12\\x5c\\xe9\\xce\\x0c\\x45\\xef\\x49\\xf3\\x63\\x85\\xa5\\x38\\x7b\\x1f\\x23\\x3b\\x26\\xa0\\x1c\\xd6\\x40\\x37\\xa0\\x4c\\x80\\x29\\x9a\\x97\\xb6\\x9f\\xd8\\x51\\x03\\x68\\x64\\x71\\x82\\x2b\\xd2\\x24\\x11\\x30\\xb4\\x07\\x99\\xb5\\x4a\\x51\\x10\\x96\\xa3\\x0b\\x2c\\xf7\\x21\\x9d\\x56\\x2e\\x57\\x4b\\x5c\\xab\\xbd\\x45\\x36\\x75\\x34\\x29\\xf4\\x83\\xd2\\x97\\x4e\\x78\\xaa\\x01\\xe1\\x12\\x4a\\x4c\\x1f\\x01\\xfc\\x4c\\xb8\\xad\\x8e\\xa3\\xf0\\x19\\xea\\x69\\x2a\\xbf\\x48\\x3d\\xbc\\x31\\x95\\x46\\xc7\\x01\\xf0\\x9b\\x4f\\x1a\\x77\\xc3\\xd1\\x79\\xbe\\x57\\xdb\\x46\\x1e\\xe4\\x9e\\xa6\\x4c\\xa7\\xa0\\x92\\xb9\\x63\\xab\\xe7\\x0e\\xc1\\xd0\\xc9\\xce\\x90\\x08\\xd1\\x7d\\x79\\x68\\xdb\\x7d\\x62\\x1d\\xe8\\x70\\xca\\x3b\\x47\\xe3\\x28\\x52\\x34\\xe5\\x99\\x47\\xe4\\x9b\\x63\\x02\\x38\\xce\\x34\\xab\\x92\\xb6\\x7c\\xe4\\x81\\xb3\\xca\\x4a\\xc3\\x85\\xad\\x5d\\x21\\x33\\xdf\\x18\\xcd\\x94\\xed\\xa6\\xf8\\x7a\\xb6\\x75\\x02\\xa8\\x67\\x6c\\x03\\x4b\\x5b\\xbe\\xfc\\x0e\\xce\\x65\\xc6\\x36\\x6c\\xbc\\x07\\xdb\\x0d\\x01\\x6c\\x48\\x78\\x92\\x5a\\x3e\\xf5\\xc0\\x59\\x64\\x6c\\xcf\\xdf\\xaa\\xad\\xb4\\x5b\\xac\\xb3\\x7d\\x21\\x80\\x97\\x8c\\xed\\x89\\xce\\x36\\x69\\x81\\x73\\x99\\xf9\\x75\\xf8\\x2e\\x6c\\x57\\x04\\xb0\\xca\\xd8\\x5e\\xe8\\x6c\\x5f\\x3c\\x70\\xa2\\x4c\\xdb\\xed\\x2b\\xd9\\x52\\x6c\\xcd\\xcb\\x8b\\xab\\xf8\\xc5\\xc5\\x9a\\x22\\xd8\\xa2\\x55\\x50\\xfb\\xb9\\x73\\x52\\x1d\\xb7\\x79\\x03\\x93\\x99\\xe4\\x41\\xf3\\x59\\x29\\xf8\\x04\\x77\\x5a\\x10\\x59\\xb4\\xd3\\x5f\\x2e\\xab\\xd0\\x14\\xf1\\xc1\\x17\\x55\\x17\\x22\\xb5\\xd9\\xc9\\x76\\x3e\\x01\\x8c\\x32\\x40\\xce\\x49\\x5b\\xde\\x58\\x00\\x1b\\x8b\\x11\\x55\\x69\\x69\\xb3\\x33\\x3b\\xd3\\xd3\\x9a\\xd2\\xb5\\x26\\x67\\x5b\\x5a\\xf0\\x4a\\x56\\x25\\x0a\\x78\\x92\\xce\\x25\\xb2\\x66\\x14\\x93\\xc0\\x92\\x42\\x3a\\x2b\\xd6\\x23\\xaa\\x91\\x90\\x8a\\xe6\\x34\\x22\\x85\\xb2\\x55\\xde\\xfa\\x95\\x65\\x1c\\x95\\x15\\x84\\xfe\\x76\\x8c\\xec\\xb2\\x21\\x90\\xfb\\x66\\x16\\x11\\x37\\x94\\x39\\xc7\\x5a\\x60\\xeb\\xb0\\x16\\x4b\\x54\\x5a\\xac\\x50\\x69\\xb1\\x46\\xa5\\xc5\\x06\\x95\\x16\\x5b\\x54\\x5a\\x38\\x81\\xc5\\xa6\\x8d\\x8c\\xde\\x1a\\xdc\\x89\\xc4\\x6a\\x6f\\x68\\x26\\x4f\\x36\\xd6\\x3c\\xd7\\x4b\\x0b\\xda\\x89\\xe5\\x71\\x61\\x3c\\x46\\x8d\\xd8\\x1a\\x93\\xd0\\xdb\\x5e\\xd0\\xa3\\xe4\\xb4\\xc5\\x73\\x3d\\xe1\\xe5\\x32\\x5a\\x4f\\x5b\\x64\\x9b\\x27\\x70\\x76\\x8a\\xbe\\xed\\x93\\x5f\\xf0\\x19\\xf3\\x38\\xd7\\x3d\\xa5\\x29\\xda\\x76\\x4a\\x25\\x1b\\xb1\\x9a\\x15\\x41\\x67\\x4d\\xec\\xe8\\xb6\\x68\\x8d\\x4b\\x5c\\xec\\x36\\x45\\x76\\x1c\\x34\\x8a\\x46\\xa3\\xd0\\xa1\\x8e\\xae\\xd4\\xe1\\x1c\\xd7\\x28\\x75\\xe8\\xbb\\x52\\x85\\x14\\xaf\\x90\\xcd\\x44\\x3d\\xb1\\x42\\x0c\\x65\\xdf\\x69\\x9f\\x6a\\xc0\\x9c\\xec\\x00\\x73\\x4a\\x9e\\xb0\\x52\\xe3\\x84\\x97\\x41\\x71\\xe9\\x46\\x01\\x93\\x96\\x02\\x33\\xe1\\x71\\x35\\x73\\xf7\\x91\\x99\\x69\\xc8\\x04\\x7f\\x1f\\x99\\x99\\xfd\\x3b\\x64\\x66\\xc7\\x68\\x22\\x33\\xcd\\x91\\xe1\\x4a\\x4c\\x70\\x59\\x28\\x31\\xc2\\x02\\x9a\\x90\\x43\\xc3\\xd3\\xc0\\x82\\x43\\xb3\\xc6\\xb8\\x80\\xa6\\xae\\x41\\x73\\xbe\\x03\\x4d\\x5d\\x41\\x73\\xae\\x41\\x73\\xaa\\xa0\\x09\\x4b\\xa1\\x49\\x39\\x34\\xa7\\x06\\x34\\x2f\\x1a\\x34\\xf3\\xbf\\x0f\\xcd\\xe2\\xb7\\xd0\\xf8\\xa7\\x25\\xd0\\x44\\x0a\\x9a\\x50\\x83\\x66\\xaa\\xa0\\x19\\x73\\x68\\x1e\\xb3\\x10\\xb3\\x2e\\xf0\\x41\\x8a\\x7b\\xa4\\xe1\\x72\\xb5\\x83\\xcb\\x91\\xc2\\xe5\\x4a\\xc3\\xa5\\xae\\x70\\x19\\x97\\xe2\\x52\\xe3\\xb8\\xd4\\xed\\x7d\\x5c\\x16\\x1a\\x2e\\xe9\\x7f\\x81\\x0b\\xfd\\x0e\\x97\\xcb\\xbe\\x09\\x4b\\xa2\\x60\\x89\\x35\\x58\\xa2\\x02\\x16\\x1a\\x5b\\x57\\x66\\xe1\\xb1\\x16\\xf8\\x28\\x62\\x90\\xb2\\x68\\x53\\x45\\x6c\\x65\\x01\\xac\\xb2\\x92\\x1a\\xcb\\x46\\xcf\\x4a\\x30\\x57\\x8d\\x93\\x87\\x38\\x26\\x91\\x1a\\xe9\\x18\\x5b\\x02\\x94\\xc6\\x16\\xbb\\x45\\x90\\x72\\x7c\\xee\\x8b\\x11\\x42\\x56\\x9c\\x1f\\x5c\\xb8\\x9d\\xe1\\xd1\\xaa\\x61\\xcf\\xa8\\x94\\xf6\\x7d\\x90\\x35\\xbc\\xc6\\x78\\x22\\xef\\xd1\\x6b\\x9f\\x2d\\xa6\\xef\\x07\\xe3\\x95\\xa0\\xf1\\x90\\xd7\\x2d\\x9e\\x88\\x5f\\xf0\\xee\\x4d\\x62\\xa6\\x65\\x62\\xde\\x06\\xd9\\xf8\\xf5\\x66\\x39\\xbf\\x05\\x58\\x1c\\x69\\x94\\x0f\\xdd\\x65\\x4f\\x15\\x06\\xa1\\xa3\\xf4\\xed\\xbc\\x49\\x5d\\x1a\\x63\\xef\\x8f\\x68\\xe6\\x06\\x79\\xaa\\x2a\\x06\\xb1\\xd2\\x72\\x9d\\x7b\\x9e\\x05\\xf7\\x7c\\x9b\\x4b\\xcf\\xa7\\x56\\x63\\x50\\xa2\\x27\\x19\\x7d\\xd7\\x5d\\x29\\xa7\\x7b\\x22\\x93\\x9f\\xf5\\x4d\\xf9\\x67\\xf3\\x0a\\xcd\\xe6\\xc8\\x9e\\x94\\x36\\x31\\xf6\\x39\\x69\\xad\\x81\\x9c\\xe4\\x6a\\xbb\\xb3\\x95\\x5c\\xbe\\x32\\xa7\\xbe\\xeb\\x7e\\x8a\\x3c\\x70\\x65\\x1b\\x21\\xa2\\xcf\\xe9\\xc8\\xfa\\xd6\\xb8\\x32\\xa7\\x42\\xa7\\x37\\xd0\\xe6\\x23\\xc3\\xb6\\xce\\x33\\x4b\\x6e\\xc1\\x3d\\xcb\\x42\\xf0\\xc4\\x2a\\x25\\x88\\x9a\\xe0\\x4e\\x33\\xd8\\xc7\\xb6\\x49\\xe0\\x66\\x4f\\x16\\x62\\xb6\\x51\\xfd\\x9c\\x6c\\xf2\\x2e\\xd0\\x9c\\xa1\\x9c\\xbc\\xdd\\x11\\x67\\x84\\x49\\xe6\\xd4\\x2e\\x9e\\xcc\\xe8\\x85\\x37\\xde\\x8a\\x55\\xde\\xbe\\x38\\xb1\\x3d\\x46\\x76\\x89\\x39\\x9c\\x8d\\x11\\xc7\\xe8\\xad\\x9e\\x77\\x46\\x6f\\xf6\\x3c\\x9e\\xa3\\x90\\xf9\\xd7\\x00\\xc7\\x5c\\xf4\\x4b\\x6b\\xbd\\xf7\\x70\\x95\\x3d\\x02\\x3a\\x35\\x34\\xdf\\x16\\x87\\x03\\x2e\\x95\\x7c\\xc5\\xf4\\x00\\x8e\\x32\\xe7\\x8d\\x2d\\xed\\x82\\x36\\xc0\\x22\\xf3\\x9e\\x2b\\x62\\xf5\\x2f\\x45\\x47\\xae\\x9d\\x13\\x63\\xa4\\x55\\x43\\x16\\x51\\x5e\\xab\\x1b\\x61\\x63\\xfb\\x8e\\x32\\xb9\\xaf\\x93\\xc9\\xb6\\xce\\xed\\x8b\\xec\\x29\\x43\\xce\\xcb\\xc6\\x7c\\xe4\\xcc\\xb3\\xe7\\x93\\x2c\\xbf\\x4f\\xad\\xd6\\x3b\\x00\\x67\\x85\\xf6\\xd8\\xfa\\x8d\\x71\\xf3\\x48\\xa2\\xc8\\x0e\\x91\\x25\\xf6\\xaf\\x31\\xb6\\x02\\xae\\xcf\\xca\\xce\\x7b\\x45\\x3a\\xa3\\xf0\\x3d\\x4c\\x6d\\x5f\\xe0\\x15\\x99\\xcc\\xaf\\xab\\xdc\\xb3\\x4b\\xb3\\x9a\\x0a\\x3b\\xe1\\xda\\x75\\x6b\\x92\\x4f\\x1c\\xbf\\xd4\\xe4\\x82\\xbb\\xcb\\x65\\x43\\xbc\\xe4\\xdc\\x99\\x00\\xb9\\xcf\\xec\\x52\\xe5\\x1a\\x63\\xdb\\xe9\\x95\\x6f\\xcb\\x79\\xe9\\x87\\x51\\x33\\x6c\\xdf\\x1a\\x6b\\x1e\\x5a\\xa3\\x25\\xb2\\x53\\x0b\\xe0\\x94\\x43\\x99\\x60\\xed\\xdd\\x3c\\xd4\\xff\\x35\\x0e\\xb6\\xb3\\x6c\\x54\\xcd\\x87\\xed\\xef\\xb2\\xeb\\xf4\\x18\\x79\\x73\\x0a\\xcb\\x4b\\xc4\\x3e\\xea\\xc0\\xdd\\xa7\\x5d\\xf8\\xfa\\x6f\\xc6\\x45\\x71\\xda\\x59\\x66\\x89\\x5e\\xe4\\x67\\xa5\\x80\\x7c\\xf4\\x7a\\x2a\\x2f\\xd2\\x8f\\x20\\x3f\\x04\\xe4\\x84\\xdf\\x13\\x9c\\xca\\xca\\xee\\xc5\\x1c\\x4c\\x63\\x08\\xe5\\xec\\xf7\\x65\\xfa\\x31\\xdd\\xf5\\x29\\x73\\xde\\xec\\x04\\x6a\\xae\\xfc\\x31\\xc3\\xad\\x9c\\x37\\x3b\\x21\\x9f\\x2b\\xc5\\x7a\\x84\\x55\\x39\\x6f\\x76\\xe6\\x18\\x15\\xf3\\x26\\x8f\\x3c\\x5e\\xdc\\x76\\xbc\\xe4\\x7b\\x44\\x5d\\x51\\xb1\\xbc\\x90\\x77\\xae\\x86\\xa4\\xee\\x16\\xf5\\x63\\xc2\\x26\\x97\\x28\\x0b\\x9d\\x77\\xc1\\x3b\\xe5\\x95\\x71\\xb1\\x37\\x92\\x92\\xb6\\xe7\\xbc\\xae\\xe7\\x5f\\x3b\\x5a\\x23\\xfa\\xf1\\xe6\\x3a\\x31\\x7d\\x7b\\x87\\xe2\\x8c\\xec\\x41\\xe1\\xfe\\x4e\\xda\\xa8\\xa1\\xfc\\x1c\\xe3\\x7e\\xdf\\x4f\\x8c\\x76\\x96\\x18\\x57\\x4e\\x09\\x53\\xe5\\x18\\xfb\\x75\\xf5\\xba\\xce\\x1b\\x8f\\x82\\x43\\xd5\\xde\\x16\\x57\\x7c\\x39\\xfe\\xb3\\xb9\\x55\\x84\\x97\\xbb\\xe4\\xf1\\xa5\\xe2\\x20\\x27\\xf8\\xb2\\xb1\\xe7\\xc8\\x36\\xee\\xaf\\xa3\\xce\\x5d\\xda\\x35\\x64\\xf5\\x3b\\xe9\\x6d\\x21\\x89\\xa3\\x77\\x0b\\x1a\\x0a\\x23\\xb7\\x53\\x3e\\x3e\\x19\\x3a\\x66\\x39\\x5a\\xa1\\x68\\x2f\\xb5\\x7b\\x6e\\x26\\xb4\\x7f\\xc0\\x06\\x37\\x46\\x56\\xbf\\xde\\x8b\\xb0\\x3b\\xab\\x2b\\xc2\\xbb\\x6d\\x9f\\xa0\\x36\\x23\\x49\\x0f\\x4c\\xf3\\x76\\xdb\\x78\\xa1\\x97\\x26\\x9f\\x98\\x9f\\x02\\xbe\\x0d\\x26\\xc8\\xce\\xde\\xee\\x27\\xb7\\x3e\\x0e\\xb2\\x7b\\x8c\\x9e\\x4d\\x9a\\x7e\\x50\\x2e\\x90\\x91\\x28\\x5c\\xd1\\x2e\\xfd\\xed\\xe6\\x4c\\x3b\\x94\\xef\\xdf\\xcd\\xf1\\xa6\\xe8\\xce\\xda\\x2f\\x98\\x9a\\xdd\\x59\\xfe\\xe6\\x38\\x12\\x4f\\xf8\\xdf\\x47\\xf4\\xfc\\x96\\xa0\\xf3\\x26\\x25\\x53\\x47\\xcb\\xe7\\x9d\\xd6\\xe2\\xed\\x10\\x37\\x03\\x7e\\xd1\\xac\\x0c\\x1a\\x79\\x51\\xa8\\x8f\\xe2\\xf2\\xf9\\x2c\\xce\\x47\\x0c\\xe3\\x1b\\x58\\xa9\\x11\\xa4\\xb5\\x26\\x66\\x7d\\xce\\xae\\x37\\x3e\\xfb\\xf0\\xeb\\x4f\\xb1\\xa8\\xc8\\xa5\\xf5\\xc3\\xf8\\x3a\\xc8\\x8b\\xc1\\x6f\\x0c\\x2b\\x29\\xf7\\x9b\\x15\\x9e\\xdb\\x62\\x7c\\x16\\x59\\xe8\\xee\\xff\\x24\\x4d\\x7a\\x59\\x3b\\x7d\\x4a\\x79\\x8f\\xf5\\x25\\xe2\\x9d\\x8c\\xd1\\xbe\\xb8\\x81\\xb5\\x53\\xb7\\x72\\x15\\xbf\\xfa\\x8d\\xe7\\x22\\x37\\xdc\\x64\\x2d\\xb0\\xbc\\x07\\x6e\\x26\\x25\\xaf\\xf3\\x36\\x9f\\x19\\xb9\\xcb\\x8a\\xea\\x5f\\x16\\x6a\\x2a\\xcc\\x33\\x44\\x6d\\x70\\x97\\xc8\\x16\\x56\\x91\\x1b\\x8c\\xc7\\x5c\\x7a\\x3e\\x34\\x7a\\xee\\xb9\\xcb\\xfe\\xe2\\xd7\\xa9\\x9e\\xdf\\x6e\\xb2\\xfc\\x26\\x99\\x35\\x8d\\x4f\\x2c\\x36\\xb8\\x73\\x64\\x8b\\x9b\\x02\\xf4\\xd7\\x33\\xce\\x15\\x7c\\x38\\x46\\x99\\x6f\\xef\\x53\\x1c\\x53\\xf6\\x9d\\x87\\x73\\xfe\\x76\\xa4\\x1e\\xfb\\xfe\\x07\\xbd\\x6d\\xe3\\x08\\x97\\xc8\\x66\\x07\\x5a\\xef\\xdb\\xb1\\x75\\x81\\xac\\x2e\\xbf\\x10\\xda\\xcf\\x86\\x83\\xd3\\x9a\\x2b\\x7b\\x84\\x45\\x67\\x64\\x7e\\x8c\\x09\\x30\\x6b\\x06\\x67\\x68\\xa0\\x2f\\xbf\\xd4\\x8d\\x73\\xb8\\x8d\\x76\\x4c\\x75\\xbd\\x75\\x27\\x13\\xb2\\x35\\xb3\\x7a\\xef\\x80\\x4f\\x73\\xce\\x2b\\xea\\xbe\\x63\\x73\\x9f\\x2a\\x8b\\x27\\xe5\\x7b\\xf2\\x89\\xae\\x15\\xd9\\x6b\\x64\\x9b\\x03\\x73\\x62\\x73\\xc2\\x67\\x98\\x8d\\x95\\x35\\x5d\\xad\\x53\\x7a\\x0f\\x2d\\xb2\\xb6\\xfb\\xe8\\x80\\x35\\x9b\\x57\\x7c\\xfc\\xa8\\xe7\\x2d\\x42\\x6b\\xf5\\x7e\\x42\\x6c\\xbe\\x1e\\x10\\x22\\xe6\\x2e\\x75\\x64\\xe5\\x0e\\xd1\\x3a\\xc2\\xc9\\xbb\\x0d\\xee\\x2f\\x07\\x46\\xb1\\xe6\\x84\\x8b\\xb1\\x90\\x06\\xc1\\x3f\\x8a\\xc5\\xce\\xa4\\x7e\\xc8\\x20\\x17\\xbc\\x66\\x2c\\x28\\xe3\\xd1\\x5a\\xe0\\xd7\\x3f\\x29\\x84\\x27\\x7c\\x7b\\x4d\\x63\\xeb\\x75\\xad\\x4b\\x6b\\x43\\x03\\x56\\xb7\\x0e\\xc8\\xbb\\xa6\\x1a\\xb2\\x99\\xf5\\xeb\\x01\\x75\\x27\\x3c\\xb8\\xd8\\x15\\xf6\\xa1\\x92\\x44\\x8b\\xb8\\x3f\\x4c\\x2a\\x9f\\x3f\\xfe\\xa3\\xf2\\xd7\\x5f\\xd5\\x24\\xee\\x57\\x93\\x74\\x13\\x0c\\x93\\xf1\\x70\\x98\\x26\\xd5\\xe5\\x30\\x1c\\x44\\x71\\x35\\x8c\\xe2\\x59\\x37\\xf0\\xb7\\xc3\\xbf\\x92\\x7e\\x92\\x54\\xd8\\x01\\xd2\\xe7\\x28\\x4c\\x93\\x03\\x64\\xe1\\xb0\\x9b\\x56\\x47\\xb1\\x3f\\xa8\\xfe\\xec\\x45\\xeb\\x4f\\x89\\xbf\\xf5\\xc3\\xd1\\x01\\xfa\\x64\\x31\\x9f\\x47\\x71\\x5a\\xfd\\x39\\xf3\\xd7\\x7e\\x78\\xe8\\xe6\\x82\\xb2\\xb7\\x48\\xd3\\xe8\\x20\\x69\\x77\\x3e\\x0f\\xfc\\x7e\\x37\\xf5\\xa3\\xf0\\x90\\x46\\xfe\\x70\\x95\\x54\\x7b\\xd1\\x60\\xf3\\x3a\\x7d\\xa2\\x45\\x3a\\x8c\\x3f\\xf5\\xa3\\x30\\xed\\xfa\\xe1\\x30\\x3e\\x70\\xa8\\x17\\x2d\\xe2\\x5e\\x14\\x56\\xbb\\x83\\x41\\x14\\x26\\xd5\\x9f\\xfd\\x60\\xd8\\x8d\\x9f\\xfd\\xf5\\x81\\x23\\x51\\x6f\\x32\\xec\\xa7\\x49\\xf5\\xe7\\x60\\xb8\\xf4\\xfb\\x87\\x0c\\xa1\\x49\\x94\\xcc\\xbb\\xe1\\xa7\\x7e\\x14\\x2c\\x66\\x07\\xe1\\xd0\\x4e\\xcc\\x86\\x03\\xbf\\xfb\\x4a\\x75\\x67\\xc3\\xd1\\x21\\xd2\\x42\\xe2\\xb0\\xbb\\x7c\\x0d\\x59\\x1c\\xf5\\xa2\\x83\\xae\\x53\\x50\\xf6\\xe7\\xf3\\xf9\\x27\\x3f\\xfa\\x34\\x18\\xa6\\x5d\\x3f\\x78\\xdd\\x91\\x68\\x36\\x8f\\xc2\\xe1\\x61\\xdf\\x2c\\xa8\\xd3\\x28\\x0a\\x72\\xba\\x7f\\xb2\\x0f\\x95\\xb0\\x3b\\xcb\\x23\\x84\\xff\\x79\\xf6\\x83\\x61\\xe5\\xf3\\xc7\\x8a\\xee\\x42\\x9c\\xf0\\xc3\\xbf\\x3f\\xfc\\x27\\x00\\x00\\xff\\xff\\x32\\xe0\\x02\\xf9\\xcf\\x29\\x00\\x00\")\n\nfunc cssApplicationCssMapBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_cssApplicationCssMap,\n\t\t\"css/application.css.map\",\n\t)\n}\n\nfunc cssApplicationCssMap() (*asset, error) {\n\tbytes, err := cssApplicationCssMapBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"css/application.css.map\", size: 10703, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _cssFontsCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x01\\x00\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\")\n\nfunc cssFontsCssBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_cssFontsCss,\n\t\t\"css/fonts.css\",\n\t)\n}\n\nfunc cssFontsCss() (*asset, error) {\n\tbytes, err := cssFontsCssBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"css/fonts.css\", size: 0, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataBoldWebfontEot = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x74\\x8f\\x73\\x70\\xdd\\x0f\\xf4\\xa6\\x3f\\x49\\x6e\\x6c\\xdb\\xb6\\x8d\\xde\\xd8\\xb6\\x6d\\xa3\\xb1\\x6d\\x3b\\x8d\\x6d\\xa3\\xb1\\xd9\\xd8\\x6c\\xdc\\xb0\\x8d\\x1a\\x27\\xdd\\x99\\xef\\xfc\\x66\\x67\\x67\\x77\\xf6\\xfd\\xe7\\x3c\\xef\\xcc\\x99\\x33\\xcf\\xd9\\x34\\x02\\x80\\x62\\x43\\x00\\x80\\x04\\x20\\x01\\x10\\x00\\x00\\x90\\x88\\x30\\xf0\\x50\\x00\\x14\\x00\\x00\\x10\\x40\\x2f\\x24\\x00\\x80\\x00\\x05\\x15\\x56\\x00\\x08\\xb6\\x87\\x00\\xfe\\x77\\x30\\xff\\x67\\x46\\x87\\x65\\xba\\x00\\xff\\x4f\\x70\\x00\\x59\\xc0\\x09\\x30\\x07\\x9c\\x01\\x27\\xc0\\x1d\\x70\\x06\\x1c\\x00\\x53\\xc0\\x03\\x30\\x05\\x00\\x00\\x0e\\x10\\xfb\\xaf\\x5b\\x00\\x00\\x10\\x0a\\x68\\x01\\x96\\x80\\x1b\\xe0\\x0e\\xd8\\xfe\\xb7\\x49\\x06\\xb0\\x03\\x2c\\x00\\x1b\\xc0\\x0e\\x70\\x01\\x82\\x00\\x19\\xe0\\x01\\x78\\x00\\x56\\x80\\x29\\xf0\\x15\\xf0\\x00\\x9c\\x01\\x1b\\xc0\\x16\\x70\\x02\\x3c\\x00\\x32\\x80\\x0e\\xf0\\x04\\xd8\\x00\\x16\\x80\\x1f\\xe0\\x00\\xe8\\x01\\x32\\x80\\x19\\x70\\x00\\xc8\\x00\\xbe\\xff\\xc8\\x0d\\x20\\x03\\xb8\\x01\\xb6\\xff\\x58\\x1a\\x20\\x03\\x38\\x00\\xb6\\xff\\x69\\xde\\xff\\xdd\\xe7\\xfa\\x8f\\xbd\\x00\\x32\\x80\\x02\\x90\\x06\\x28\\x00\\x00\\x20\\xfb\\xff\\xb8\\x92\\xfd\\x1f\\xa6\\x00\\x20\\xa6\\x2e\\xad\\xf2\\x7f\\x7f\\x09\\x05\\x04\\x7f\\x03\\xf8\\x4d\\x01\\x7e\\x6b\\x80\\x43\\x09\\x63\\xf6\\x3c\\x76\\xd2\\x64\\x43\\x7b\\xca\\x46\\xde\\x55\\x2e\\xc8\\x9b\\x42\\x53\\xc0\\x8d\\x89\\x35\\x93\\xcb\\x20\\x6f\\x07\\x1b\\x05\\xc9\\xc1\\x76\\x69\\x7b\\xf9\\x36\\x7a\\x3a\\x17\\x15\\x26\\x5f\\x72\\x42\\x41\\x4a\\xb1\\x8d\\x78\\x7c\\x05\\x5a\\xa7\\xb8\\x50\\xd5\\xc0\\x44\\x63\\xc0\\x81\\xc4\\x42\\xeb\\x38\\xd3\\x18\\x73\\x2e\\x8c\\x7e\\x92\\x93\\x59\\x59\\x24\\x54\\x7c\\xc0\\x99\\x67\\x28\\xab\\xcc\\xf2\\xab\\x1a\\x51\\x2e\\xa8\\xc9\\xdc\\x36\\x3d\\xcc\\x23\\xe7\\x62\\xf6\\xbb\\xd5\\x2b\\x17\\x49\\x34\\xdb\\x9a\\x4b\\x21\\xca\\x48\\xc3\\xa4\\x69\\x12\\x9c\\xe4\\x7e\\x9f\\x52\\x4d\\x18\\x6c\\xf1\\x40\\x2c\\x19\\x1a\\xa3\\x38\\xab\\x2e\\xcb\\x41\\x02\\xc3\\x50\\xa5\\xc6\\xe1\\xe6\\x14\\xc1\\x2a\\x46\\x9d\\xe6\\x88\\x7b\\x3d\\x31\\xa6\\x5e\\xcb\\x65\\xa8\\x00\\xab\\x0c\\x7f\\xf1\\xcc\\xb8\\x54\\x38\\x14\\xde\\x5f\\xdf\\x62\\x64\\xdb\\x6f\\xa6\\xcc\\x92\\x06\\xf4\\x39\\x75\\xc4\\xd3\\x85\\xf6\\x54\\xea\\xee\\x64\\x9b\\xbc\\x38\\x6e\\x8b\\x8f\\x41\\xfb\\x47\\xfc\\x78\\x9c\\x02\\xb7\\xae\\x66\\x50\\xdf\\xf6\\xad\\x79\\xbf\\xe9\\xa0\\x31\\x9d\\x40\\x3b\\xe3\\x73\\xe0\\x1e\\x43\\xc5\\x0a\\x71\\xbb\\x54\\x9a\\x40\\xf0\\x4c\\xa4\\x4d\\xa6\\x36\\x42\\xec\\x49\\x09\\xab\\x78\\x73\\x2c\\x40\\x23\\xf8\\x24\\x9d\\x87\\x71\\x5b\\xdc\\x6e\\xe4\\xa4\\x9d\\xef\\x85\\xac\\xfd\\xd0\\x15\\x6e\\x01\\x1b\\xfd\\xcd\\x0b\\x49\\x4b\\xab\\x39\\x94\\xda\\x43\\x41\\xf3\\x28\\xf7\\xf4\\x2c\\x72\\xf1\\xf9\\x05\\x46\\x1d\\xfd\\x89\\x9b\\xcc\\xe1\\x26\\x8a\\xe1\\x63\\x0d\\x3b\\xf0\\x8a\\x35\\xa3\\x6e\\x2b\\x71\\x3e\\x22\\xd6\\xaa\\xf6\\x8f\\xd4\\x49\\xfe\\xe1\\x65\\x99\\x53\\x31\\x9f\\xd3\\x42\\x8a\\xe2\\x6b\\xcc\\x12\\xde\\x9c\\xd7\\xbf\\xb2\\xaf\\x7b\\xde\\x8b\\x25\\x52\\x54\\x4c\\xdc\\x2d\\xe4\\x94\\xb0\\x26\\xb9\\x91\\x1b\\x54\\x14\\x52\\xb5\\x6f\\x84\\x0b\\xb4\\x68\\xbe\\xd2\\xb1\\xdd\\x8f\\x49\\xfb\\x22\\x04\\x4f\\x43\\x17\\x6c\\x53\\xad\\xb3\\xb5\\x0e\\x50\\x58\\xf5\\x04\\x13\\xe9\\x72\\x06\\xb8\\x6e\\x36\\x05\\x0f\\x5b\\x90\\x3b\\x29\\x89\\xaa\\x7c\\x7d\\x3b\\x79\\xe3\\xfb\\x36\\x93\\x69\\x96\\x52\\xaa\\xc1\\x51\\x5f\\xee\\xba\\xb8\\x87\\x7c\\x3e\\x2b\\xf7\\x12\\x45\\xf5\\xd6\\x6e\\xb4\\x76\\xd8\\xbc\\x03\\xe1\\xb3\\x9a\\x33\\x30\\xaf\\xdf\\xa4\\x70\\x10\\x07\\x5a\\x45\\x63\\x09\\x44\\x2b\\x2a\\x8a\\x70\\xf6\\x75\\xdf\\xee\\xd1\\x47\\xd7\\xae\\x55\\xa0\\xf7\\x8d\\x5b\\xd0\\x90\\xd8\\xa8\\x4c\\x3f\\x6f\\x7a\\x61\\xab\\x60\\x22\\xdb\\x74\\x5c\\xb3\\x20\\xde\\x30\\xa6\\x8e\\x41\\xa4\\x57\\xaf\\x02\\xdf\\xa2\\x7f\\xc4\\x43\\x4c\\x5b\\xfd\\x43\\x0c\\x65\\xda\\x2e\\xf6\\xfa\\x82\\xb8\\x84\\x29\\x7a\\xcd\\x72\\xd4\\x05\\xb2\\xd3\\xd8\\x5c\\xf9\\x0c\\xe2\\x11\\x53\\x15\\xd2\\x5f\\x84\\x7d\\x10\\x23\\x2b\\xf2\\x1b\\xdc\\xfc\\x1c\\xec\\xdb\\x87\\x53\\x47\\x7d\\xa7\\x9c\\xdc\\x4b\\xf6\\x10\\x60\\x16\\x4d\\x02\\x99\\xa7\\x27\\x8e\\x5f\\x83\\x81\\xda\\x8d\\xe4\\x05\\xe9\\x7f\\x24\\xf0\\xbe\\xa9\\x14\\xd4\\x36\\xfa\\x28\\xef\\xa8\\xe1\\x81\\xde\\x5e\\x0e\\x96\\x14\\x32\\x09\\xa4\\x28\\x5e\\xe6\\xf0\\x38\\x02\\xb0\\xc1\\x29\\x68\\xc1\\x62\\xf8\\xd2\\xba\\xdf\\xbe\\x03\\xa6\\x98\\xf8\\xc9\\xa2\\x8c\\x0c\\xcd\\x4d\\xc3\\x8b\\xcd\\xcf\\xd3\\x08\\x01\\x29\\xf0\\x51\\x3f\\x42\\x40\\x2c\\x1c\\xc5\\xfc\\x30\\x6c\\x48\\x5f\\x26\\x92\\xa2\\x54\\x2f\\x6f\\xea\\x53\\x49\\xb8\\x0c\\xc9\\x7d\\xb5\\xd9\\x75\\xe6\\x7a\\x2d\\x02\\xb8\\xec\\x8b\\x43\\xa7\\xe5\\xa6\\x21\\x71\\xca\\x3f\\x55\\x26\\xde\\x07\\x3b\\x34\\x43\\x96\\xd7\\xde\\xf6\\x42\\x7e\\x76\\xac\\x3c\\x11\\x80\\x96\\x5b\\xf2\\xb0\\x84\\x07\\x7e\\x69\\x05\\x87\\x79\\x7c\\xa0\\x40\\x5d\\xdf\\x51\\x7d\\xc0\\xb8\\x37\\xf1\\xd9\\x8f\\xb8\\x44\\x36\\x2e\\xcb\\x49\\xee\\xec\\x3f\\xc8\\x00\\x67\\xe6\\x51\\xf7\\xfe\\x97\\x08\\xcc\\x91\\xb6\\x36\\xf0\\xfc\\x04\\x28\\xfe\\x1e\\xc1\\xfd\\x9f\\x08\\x77\\x01\\x1f\\x21\\x9a\\x1e\\x90\\xaa\\x77\\x88\\xe5\\x94\\x1c\\x50\\xf2\\xba\\x72\\x2b\\xd3\\x62\\xf0\\x88\\x5f\\x95\\xb4\\x44\\x44\\x33\\x7e\\x14\\x30\\xb2\\xf3\\xa5\\xd7\\xfd\\x10\\x43\\x73\\xb5\\x40\\x2f\\x5b\\x08\\x8b\\x2e\\x81\\x46\\x70\\x9a\\xbd\\xaa\\x16\\xbe\\xb3\\xe5\\x90\\xcd\\x97\\x28\\xf5\\xc7\\xeb\\x60\\xa7\\x08\\xe7\\x87\\x73\\x83\\x92\\x7f\\x65\\xb1\\xdd\\x23\\xa1\\xd4\\x68\\x99\\x29\\x62\\x53\\x73\\xbc\\xfa\\xe7\\xd5\\xdc\\x22\\xe1\\x45\\xec\\x42\\xf8\\x99\\x69\\x93\\xdb\\xbd\\x62\\x5c\\x5a\\x82\\x4b\\x11\\xc9\\x1d\\xa8\\xbe\\x76\\xef\\x98\\x8f\\xef\\xd6\\xcd\\xf8\\x77\\x09\\xf7\\xbb\\x9a\\x45\\x58\\xbf\\x90\\x57\\x7d\\x5b\\xa0\\x9b\\x58\\x11\\x92\\xdc\\xd2\\x11\\x59\\xb0\\xd9\\x43\\xac\\xef\\x90\\x0c\\x9a\\x21\\xb6\\xec\\xf7\\x45\\xee\\x35\\x62\\xe4\\x12\\x03\\xf3\\x54\\xb6\\x1c\\x08\\x79\\x0b\\x0f\\x24\\x95\\xba\\x62\\x94\\x0c\\xb5\\x26\\x41\\x64\\x97\\x84\\xc8\\x11\\x52\\x2c\\x61\\x8b\\xd4\\x1d\\x8c\\x24\\x8e\\xd6\\x64\\x60\\xd3\\xb0\\xba\\x63\\xc4\\x29\\xab\\xe1\\xc1\\x95\\x45\\x96\\x77\\xd7\\x48\\x7d\\xc9\\x73\\x31\\x2e\\x38\\xa5\\x56\\x2a\\x25\\x4a\\x97\\xfc\\x87\\xe3\\x42\\xf3\\x20\\x92\\x75\\xbe\\x3e\\x5a\\x44\\x9f\\x8c\\x34\\xd2\\x31\\x89\\xc3\\x96\\xf3\\x07\\x57\\xf2\\xaf\\xfe\\xfb\\xa4\\xe5\\xea\\xaa\\xde\\x7b\\xbb\\xfa\\x44\\x95\\x12\\x53\\x83\\x26\\x06\\x8a\\x95\\x68\\xbd\\x2a\\x51\\xa8\\x4d\\x93\\x23\\x51\\xf8\\xe0\\x0b\\x21\\x1b\\x33\\x2b\\x53\\x80\\x37\\x52\\xfd\\x53\\x6e\\x7e\\xf3\\x7a\\x16\\xe7\\x12\\x33\\xcb\\xe9\\x00\\x8d\\xe1\\xdd\\x1a\\x8a\\x50\\xe2\\x16\\x35\\x2d\\x71\\x46\\xe1\\x03\\x85\\x0e\\x33\\xf6\\x60\\xdd\\xea\\x1f\\x21\\x2c\\x9e\\xd1\\xd5\\xbd\\xdb\\xaa\\x92\\x1b\\x13\\xa6\\x7b\\x9f\\x2d\\x08\\x69\\xc2\\x19\\x02\\xe1\\x0b\\xf2\\x39\\x6a\\x0b\\x34\\x98\\x4e\\x0c\\xee\\x11\\x4f\\xc2\\x34\\x4c\\x4a\\xd2\\xc9\\x00\\x92\\xea\\x5f\\x30\\xb3\\xaf\\x80\\x63\\x92\\x5d\\x11\\xc1\\x7c\\xd7\\xbd\\x53\\xd4\\xd8\\xcd\\x00\\x08\\x71\\x14\\xb7\\x70\\xb6\\x20\\x41\\x77\\x8b\\x23\\x98\\x8a\\xc5\\x55\\xa3\\x70\\x93\\x30\\x32\\x49\\x97\\x2a\\x2c\\x6c\\x29\\x58\\x6c\\x5a\\x7a\\x71\\x2e\\x66\\xd3\\x64\\x96\\xe6\\x7b\\x08\\x43\\x40\\x6b\\xb5\\x54\\x2f\\x7c\\xb3\\x1c\\x2a\\x28\\xe5\\xfc\\x19\\x52\\x3e\\xb6\\xd9\\x32\\x2d\\x39\\x37\\x04\\x8a\\x81\\x51\\x6a\\xc9\\x17\\x3e\\xde\\x84\\x28\\x80\\x6a\\x5c\\x5d\\xea\\x77\\x05\\xd9\\x12\\x22\\xe7\\x68\\x2c\\x5c\\x3b\\x34\\x70\\x7e\\x66\\x33\\x95\\x9e\\x4e\\x91\\xa4\\x5c\\x70\\x9f\\xcd\\x44\\x19\\x02\\xd7\\xf1\\x0b\\x6a\\x3b\\x37\\x21\\xed\\x06\\xff\\x55\\x90\\xad\\xac\\x62\\xc0\\x3c\\x6f\\x2f\\x0a\\x52\\x81\\xa1\\x8b\\x1f\\x18\\xe3\\x8d\\x5d\\x16\\xf1\\x56\\xf6\\x48\\x2e\\x70\\x99\\x05\\xd1\\xeb\\xba\\xa8\\x09\\xf7\\xfd\\x1d\\xaa\\x82\\x9c\\x96\\x2d\\x35\\xfb\\x46\\x25\\xc3\\x80\\xeb\\x52\\xdc\\xc8\\xcd\\xb8\\x55\\xd6\\x93\\xb4\\x01\\xda\\x81\\x4e\\x6f\\x8a\\xa4\\x4b\\x21\\x4c\\x0f\\xca\\x15\\x19\\x0c\\x89\\xb8\\xd7\\x66\\x90\\x1a\\x10\\x28\\x61\\xa3\\xad\\xbf\\x84\\xf6\\x40\\xbe\\xc7\\x8d\\xdd\\x35\\xbb\\x4f\\x8d\\x69\\x39\\xc5\\x99\\x40\\x30\\xbf\\x65\\x17\\xc8\\x2e\\x8e\\xcc\\xfe\\x32\\xe8\\x19\\x42\\x0f\\x87\\x15\\x17\\x35\\x64\\x0f\\x60\\xc0\\x81\\x86\\x46\\xfe\\xe8\\xe4\\xe1\\xed\\xac\\xd3\\xb5\\xfc\\x21\\x11\\x85\\x6c\\x29\\x05\\xce\\x94\\x0f\\xeb\\x46\\x89\\x51\\xa9\\x81\\xd5\\xbc\\x26\\xad\\x8c\\x67\\xbd\\xaf\\x67\\x3b\\xe9\\x89\\x15\\xd8\\x57\\xcb\\x10\\x6e\\x95\\x0b\\x3b\\xa1\\xc6\\x44\\xed\\x08\\x4e\\x69\\x96\\x63\\x09\\xf1\\x1b\\x1e\\x6b\\xb2\\x25\\xe5\\x17\\x6c\\xa6\\xd8\\xf8\\x63\\xdd\\x20\\xfb\\xf8\\xab\\x7f\\x67\\x89\\xf3\\xb6\\x79\\x19\\x44\\xc5\\x45\\x49\\xcd\\x8e\\xe4\\x54\\xb7\\xd1\\xf6\\x55\\xd1\\x10\\x4f\\x63\\x83\\xf0\\x4d\\xb4\\x0d\\xf9\\x38\\x64\\x55\\x4f\\xdf\\x31\\xa3\\xfd\\x99\\xab\\x88\\x2f\\x88\\x39\\x0b\\x3a\\x1e\\xf8\\xa4\\xac\\x24\\xe6\\x53\\xb3\\x11\\x1e\\x44\\x19\\x32\\xa0\\x53\\x46\\xe9\\xd2\\xb3\\x65\\xc9\\xe9\\xce\\x30\\x6c\\x0c\\x12\\xe2\\xf6\\x3e\\xb7\\x46\\x34\\x64\\x6f\\xef\\x66\\xbc\\x88\\x6f\\x2a\\x34\\xdb\\xf8\\x58\\x93\\x7c\\x3d\\x83\\x6f\\x0c\\xff\\x48\\x55\\x7e\\xbc\\x34\\xbc\\x76\\x3f\\x93\\xba\\xef\\x15\\x6c\\x3e\\xc0\\xf6\\x79\\xc2\\xac\\x8d\\x06\\x75\\x84\\x2a\\x84\\x71\\xd7\\x3a\\x69\\x97\\x10\\x04\\x47\\xca\\x8a\\xf9\\x51\\x65\\x4f\\x87\\xaa\\x32\\xa5\\x51\\xe5\\x9e\\xc1\\xb4\\xa6\\xaa\\x66\\xeb\\xa4\\x50\\x3e\\xda\\x45\\x20\\x27\\x1d\\xdb\\x7a\\x59\\xf3\\x0e\\x1d\\xf5\\xe9\\x32\\xb7\\xd2\\xd6\\x9e\\xf8\\x84\\x97\\x06\\xd2\\x70\\xc1\\x7a\\x7c\\x88\\x98\\xff\\x4c\\xa3\\xa9\\x27\\xdb\\x2d\\x86\\x8c\\x5a\\x7a\\x3c\\x15\\x9d\\x70\\x86\\x76\\x97\\x04\\x7d\\x0f\\xf3\\xcb\\x12\\x49\\x3f\\xb9\\x24\\x51\\xa7\\x5d\\xf0\\x5c\\x77\\x4f\\x81\\x5a\\x06\\x9b\\x93\\x8b\\xd7\\x95\\xc2\\x2e\\x37\\x76\\xff\\x84\\x36\\x0c\\xce\\x45\\x1b\\x1d\\x69\\xae\\x31\\xfc\\x47\\xf4\\x97\\x6b\\xba\\xd8\\x0b\\x88\\x51\\x28\\x83\\x2b\\x41\\x36\\xe5\\x1b\\x89\\x8a\\x21\\xe7\\xb2\\xf0\\xc6\\xb0\\x61\\xee\\x4c\\xd1\\xc5\\xf7\\x2b\\x30\\x6f\\xbe\\x92\\x36\\x1b\\xde\\xb3\\x9a\\xeb\\x68\\x0c\\xb3\\x7b\\x7f\\x22\\x0c\\x13\\xe7\\xd7\\xd8\\x4b\\xe1\\xd2\\xa3\\xdb\\xa0\\x34\\x02\\xa7\\x58\\x5e\\x99\\x53\\x34\\x3f\\xf5\\xe0\\xa9\\x62\\x37\\x72\\xf7\\x3f\\x54\\x67\\x9f\\x5b\\x8d\\x34\\xb8\\x9f\\x27\\x84\\xc9\\x4d\\x43\\x6e\\x6f\\x71\\x18\\x20\\xf7\\xae\\x1e\\xf9\\xec\\xae\\x11\\x25\\x30\\xab\\x85\\x76\\x4a\\xe8\\xd4\\xb8\\xfc\\x66\\x31\\x38\\x3c\\xc7\\x7f\\x77\\xb3\\x6b\\xe8\\xc4\\x9c\\xaa\\x51\\x6a\\x03\\xae\\xf1\\xeb\\x46\\x47\\x97\\x53\\x0e\\x06\\xc7\\x33\\xc5\\x1e\\x68\\xb8\\xf3\\x85\\x96\\xe4\\xc5\\x43\\x7e\\x03\\x9b\\x05\\xe2\\x3b\\xc1\\x2a\\xa7\\x7a\\xd5\\x60\\xbc\\x3f\\x50\\xa2\\x12\\x37\\x36\\x23\\xc4\\x1e\\xd0\\x2c\\xb0\\x3a\\x7c\\xc5\\xfe\\xa7\\xfa\\xb5\\xe9\\x71\\xa2\\xf9\\xd6\\xd0\\x7f\\xe4\\x68\\x38\\x83\\xc4\\x63\\x1c\\xe6\\x54\\xd8\\xf2\\x8f\\x53\\x28\\xc0\\xa6\\xf6\\xf8\\x5e\\x58\\x85\\xf6\\x82\\x41\\xc2\\x21\\xd1\\x1d\\xfa\\xd3\\x09\\x17\\xca\\x89\\xb0\\xf3\\xbf\\xc5\\x03\\x7f\\xe2\\x46\\x7f\\xc7\\x19\\x74\\x2c\\xdc\\xa1\\x19\\x95\\xfa\\xde\\x07\\x5c\\xb8\\x8e\\xc6\\x42\\x9c\\xed\\x36\\xef\\xb5\\x39\\x49\\xd4\\x0b\\xc4\\xfd\\xd8\\xe0\\xca\\x56\\x7d\\x5a\\xa3\\x40\\x18\\xc1\\x6b\\xde\\x82\\x57\\xc8\\x3c\\x0c\\x58\\x93\\xda\\x3c\\xd3\\x04\\x1f\\x78\\xc2\\x82\\x1f\\x25\\xe4\\x82\\xa1\\xd9\\x7c\\xd0\\xad\\x9c\\x96\\xa9\\x75\\x8d\\x11\\x12\\x5b\\x55\\x6a\\x0f\\x94\\x0b\\x2f\\xf2\\x68\\xf7\\x76\\x18\\x46\\x0b\\x2d\\xa5\\x42\\x32\\x36\\x30\\x54\\xba\\xca\\x27\\x29\\xfe\\xc2\\x15\\xb1\\x89\\x1d\\x24\\xe0\\xf2\\x6a\\xde\\xa8\\x0c\\x4a\\xb1\\x83\\xe2\\xb5\\xa9\\x05\\x50\\x70\\x6d\\xb0\\x06\\xde\\x9d\\xc1\\x95\\x31\\x04\\x51\\xa8\\x55\\x05\\xfb\\x3f\\xea\\x6c\\x0c\\x08\\xe8\\x61\\xeb\\x11\\x36\\x34\\xea\\x3f\\xae\\x1c\\x72\\x3b\\xab\\x23\\xe8\\xf7\\x37\\x1f\\xc3\\x29\\xc5\\x2c\\x97\\x43\\x92\\x67\\xb1\\x60\\x41\\x68\\xd2\\x76\\x91\\x64\\x60\\x9a\\x2e\\x4d\\xd3\\x75\\x54\\xe0\\x91\\x4a\\x89\\x76\\xa5\\xf7\\x22\\x9f\\xdb\\xec\\x9d\\xf6\\xe7\\x28\\xb5\\x98\\x91\\x3b\\xfc\\xa9\\xb4\\x35\\x15\\xbd\\x91\\x11\\x2f\\x0a\\x52\\x4c\\xec\\xec\\x58\\x05\\xf3\\x40\\x63\\x64\\xd1\\x4a\\x36\\x25\\x9c\\x8d\\x2b\\x7d\\x0e\\x8c\\xf9\\x58\\x18\\xab\\x41\\x11\\x22\\xc8\\xfa\\xa3\\x81\\x9f\\xcb\\x38\\x75\\x5b\\x2c\\xe3\\xb0\\x0a\\xe7\\xde\\xfd\\x4c\\xea\\x02\\x06\\x43\\xa9\\x31\\x06\\xfb\\x39\\x77\\x6a\\x39\\x44\\x1a\\xf2\\x2f\\x86\\x54\\xc8\\x60\\x0d\\x2d\\x5e\\x7a\\x22\\x07\\xe1\\x6b\\x7c\\xc1\\x5a\\x6d\\x74\\x73\\xbf\\x03\\xfe\\x16\\x57\\x63\\x35\\x6c\\xc5\\x8f\\x90\\x52\\xd3\\xfc\\xf8\\x26\\xb3\\xf6\\x03\\xd1\\xdd\\xa2\\x8a\\x6f\\xbb\\x4c\\x19\\xd1\\x48\\xc9\\xd9\\x25\\x6b\\x7f\\x3d\\x67\\xcd\\xb9\\x8a\\x24\\xe4\\x0e\\x8f\\x22\\x59\\x53\\x6e\\x3c\\xfc\\x2b\\x6c\\x3d\\x83\\xe7\\x84\\x26\\xae\\xbb\\xac\\x24\\x9b\\x56\\xa4\\x53\\x2b\\xda\\xf3\\x4e\\x14\\x7e\\x71\\xf1\\x52\\x4c\\x1a\\xda\\x09\\xac\\x36\\xc0\\x74\\xc4\\xcd\\xe8\\x4b\\x45\\x23\\x50\\xac\\x4a\\x3d\\xe9\\xd9\\x78\\xf5\\xac\\x22\\xee\\x74\\x6c\\xeb\\x91\\x4d\\x4c\\x07\\xfe\\x94\\xfc\\x08\\x0c\\x8d\\xf8\\x43\\x0e\\x0b\\x7f\\xcc\\xf3\\x18\\x4b\\x30\\x09\\xd9\\x54\\x1a\\xc7\\xce\\x74\\xcd\\x5f\\xac\\xb4\\x93\\x86\\x93\\xab\\x07\\x51\\x26\\xc3\\x8a\\x3c\\x0c\\x7e\\x17\\x2f\\xee\\xd5\\xab\\x17\\xa6\\xaf\\xbd\\xd7\\x7e\\xe1\\xae\\x3e\\xa8\\x8e\\xb6\\xe6\\x99\\x70\\xcc\\x3a\\x19\\x4a\\x6c\\xf1\\x26\\x49\\xb2\\xc9\\xd9\\x93\\xcd\\x7e\\xc7\\x0a\\x88\\xe0\\xeb\\x71\\xad\\x5e\\x13\\xe4\\x7a\\x74\\xb8\\xc6\\x6e\\x85\\x75\\x50\\xc7\\xa1\\x28\\xb8\\x0c\\xae\\xf9\\x84\\x22\\x33\\x6a\\xb4\\x97\\xdc\\x67\\xb6\\x4c\\x97\\xef\\x78\\x10\\x39\\x75\\xaa\\x0d\\x6b\\xc3\\x58\\xb0\\x15\\x6c\\xd0\\x6e\\x41\\x4b\\x87\\x29\\x0d\\xd0\\x2b\\x38\\xce\\x83\\x23\\x85\\x2a\\xc6\\x93\\xa2\\x11\\xab\\x6e\\x96\\x85\\x8a\\x7d\\x2f\\x5f\\xd6\\x03\\xe0\\x71\\xee\\xc6\\xe2\\x90\\xb7\\xb6\\x89\\x1b\\xd6\\x22\\x66\\x64\\x5c\\xd8\\x4b\\x67\\x05\\xe4\\xe1\\x20\\x34\\x97\\xf4\\x83\\x2e\\xc7\\xb7\\x35\\x92\\x86\\xa9\\xe0\\x70\\xc9\\xd3\\xa0\\x3b\\xff\\x98\\x4f\\x94\\xb1\\x75\\xeb\\x44\\xb9\\xd6\\xa0\\xdf\\x27\\x67\\x4e\\x2c\\x61\\xa2\\x6d\\xe8\\x29\\x2f\\x4d\\xa4\\x54\\x86\\xf7\\x6e\\xec\\xd3\\x29\\x65\\x18\\x6e\\x77\\xd4\\x5b\\xd0\\xed\\x8f\\xc1\\x5e\\xf8\\xf2\\x55\\x43\\x91\\xc6\\x12\\xf6\\x82\\x2d\\xc8\\x5d\\x44\\x90\\x2e\\xa1\\xc1\\x4b\\xc9\\x56\\x58\\x4e\\x14\\xb7\\x8c\\x87\\xfe\\x35\\xfe\\x2e\\xbb\\x66\\x7e\\x61\\x2c\\xa1\\xfc\\x79\\x34\\xf9\\x97\\xc9\\xa5\\x56\\x5d\\x94\\x56\\xc6\\x65\\x8b\\x57\\x25\\x46\\x31\\x88\\x49\\x1a\\x37\\x58\\xbf\\x5b\\x6c\\xe3\\x3f\\x6b\\xa2\\xef\\x39\\x50\\xe0\\x9e\\x87\\xce\\x95\\x5a\\xf8\\x5e\\x31\\x72\\x13\\x7e\\xff\\x6b\\x2d\\xe0\\x8b\\x1d\\xec\\xd2\\x7e\\xa2\\x2e\\x8b\\x75\\xcd\\x16\\xac\\xff\\x95\\x29\\x1e\\xee\\x3c\\x61\\xea\\x31\\x3a\\x85\\x66\\x0b\\xff\\xc7\\x26\\x1a\\xaa\\x61\\xcf\\xfa\\x61\\x27\\xf3\\x5f\\x3d\\x1e\\x9d\\x18\\x0a\\x29\\x36\\xf4\\xda\\xf7\\xc6\\x1c\\x61\\x37\\xfa\\xb2\\x21\\x6b\\x1e\\x05\\x18\\xb2\\xc2\\xa5\\xb6\\x9a\\x10\\xf5\\x42\\x90\\xaf\\x7e\\x13\\x32\\xf7\\x35\\x8b\\x71\\x9e\\x09\\x11\\x89\\x89\\xb9\\x0d\\x3b\\xae\\xec\\x33\\xbb\\x82\\x4a\\x33\\x9d\\x6d\\x8a\\x3e\\x70\\x40\\x61\\x20\\x3c\\x38\\xd2\\x7d\\x8f\\x44\\x4b\\x74\\x4b\\xbe\\x20\\x73\\xec\\xe2\\xa6\\xe8\\x88\\x1a\\xb0\\x8b\\x8c\\xdb\\x78\\x0e\\x40\\x7e\\x21\\x20\\xd7\\x35\\x91\\x5a\\x25\\xd4\\x1d\\xbc\\x11\\x49\\x2a\\x3f\\x6f\\x0d\\x82\\xb8\\xcf\\xae\\x21\\x59\\x5f\\x82\\xe6\\x81\\xf0\\xc5\\xc0\\x24\\x61\\x55\\xae\\x0c\\x65\\x7b\\xe5\\xa2\\x89\\xb6\\xba\\x90\\xa9\\x86\\x98\\xa6\\x99\\x6f\\x73\\x89\\x27\\x7b\\xb5\\xe7\\x0d\\x24\\x30\\x2e\\x73\\x3a\\xbd\\xc9\\x82\\xda\\xbf\\xcb\\x01\\xfb\\xa8\\xc7\\xa9\\x04\\x83\\x3f\\x10\\x54\\xad\\xe1\\xd1\\xc5\\x9d\\x91\\xeb\\x20\\x4c\\xf1\\xd5\\x76\\x7c\\x30\\xff\\x32\\x0a\\x40\\x6a\\x48\\xca\\xa7\\xfa\\x50\\x95\\x11\\x45\\x9f\\xc2\\xe8\\x94\\xc4\\x60\\x25\\xee\\x47\\xe2\\x9a\\x39\\x95\\x9f\\x1e\\x87\\x0d\\x9a\\x66\\x13\\xf4\\x0e\\xe0\\xf0\\xe9\\xd5\\x55\\x78\\xc3\\xa1\\x2d\\x4b\\xd9\\xdd\\xe3\\x49\\x23\\x94\\x12\\x67\\xd8\\xfa\\x68\\xe7\\xce\\x94\\x5c\\x95\\xb6\\xb0\\x80\\x4c\\xc2\\x39\\x2e\\xd0\\x0d\\xe6\\x72\\x22\\xe0\\x7e\\x9f\\xf8\\x23\\xd7\\xfb\\x46\\x6b\\x8d\\x15\\x21\\x3a\\x8c\\x1b\\x88\\x4f\\xa3\\x04\\x18\\xed\\x08\\xa6\\xce\\x9b\\xee\\xcf\\x91\\x7f\\xe1\\xbf\\x4e\\x66\\xc3\\x6f\\xe2\\xc0\\xe9\\x25\\xd0\\xad\\xe4\\x5e\\xc6\\xf7\\x60\\xa3\\x5c\\x4a\\x57\\xc5\\x5f\\x5e\\xde\\xaa\\xcf\\x43\\xc5\\x76\\x18\\xbc\\x91\\x0d\\x40\\x23\\x77\\x42\\x33\\x1d\\xb2\\x3b\\x40\\xfd\\x3b\\x6d\\x69\\xe2\\x71\\x57\\x6c\\x1f\\xe0\\x12\\xfa\\xc3\\x11\\x05\\xc7\\xda\\x2d\\x6e\\x49\\x77\\x63\\x91\\xcd\\xaa\\x0f\\xce\\xf4\\xb0\\xe5\\x4b\\xc5\\xfe\\x48\\x7b\\xba\\xbc\\x59\\x26\\xb5\\xd5\\x54\\x79\\x89\\xe8\\xf8\\x26\\x86\\xdb\\xbd\\x55\\xb6\\x48\\x13\\x2f\\x01\\x11\\xb1\\xd4\\x4f\\x09\\x07\\x07\\x2b\\x00\\x2a\\x1f\\x49\\xb7\\xf9\\x56\\x7e\\x3d\\xa4\\xea\\x36\\xfb\\x76\\x45\\x6e\\xcc\\x58\\x98\\x10\\x04\\x1f\\x0b\\x61\\xbd\\x5d\\xfb\\x4f\\xb1\\x7b\\x70\\x09\\x1f\\x43\\xb7\\xf1\\x64\\x12\\x5f\\x81\\xea\\x41\\x8f\\xee\\x0c\\x75\\xb8\\x93\\x59\\xf6\\xb7\\xcf\\x49\\xa3\\x19\\x72\\xee\\xdf\\x6d\\x21\\xd7\\xc4\\x69\\x6e\\x14\\xf0\\xdf\\x95\\xb7\\x34\\x83\\xa2\\xf8\\x75\\x1c\\x9c\\x03\\xce\\xf5\\x15\\x5e\\xe9\\x16\\xdd\\x29\\x09\\x01\\xde\\xc8\\x7e\\x06\\x65\\x5b\\x06\\xce\\x14\\x05\\xd7\\x0c\\x05\\xe5\\xb0\\x7e\\xa5\\xfd\\x75\\x8f\\x83\\xe5\\x5b\\xab\\xf8\\x87\\xc8\\xa9\\xbd\\x5e\\x72\\x36\\x55\\x52\\x8e\\xc8\\xe1\\x57\\x73\\xbe\\x63\\x16\\xcf\\xa4\\xa2\\xc2\\x7d\\x0c\\x38\\xfa\\x2b\\xa8\\x0b\\x64\\x9e\\x07\\xfa\\xa2\\x0a\\x6e\\xbc\\xf0\\x47\\x15\\x36\\xce\\xfc\\xba\\xa6\\x83\\x83\\x0f\\x9f\\x60\\x87\\xd2\\xdf\\xaf\\xdf\\x78\\x16\\xbe\\x2c\\x5e\\x96\\x28\\x2a\\xc7\\x88\\x07\\x8d\\x61\\xed\\x55\\xb9\\x44\\x5c\\xac\\xa3\\xa9\\xcb\\x10\\xd5\\x32\\x76\\xff\\xb8\\x1d\\xd1\\x7f\\x7f\\x44\\x41\\x47\\x08\\xed\\x59\\x24\\x23\\x3d\\x51\\xf5\\xcc\\x5d\\x5a\\xef\\x5c\\x96\\x66\\x27\\xea\\xf9\\x3e\\x7d\\xa0\\xaf\\x0d\\xa7\\x6a\\x46\\xa4\\x8d\\x37\\x5e\\xd6\\x6b\\x73\\x87\\xb4\\x77\\x7b\\x68\\x9c\\x4a\\xb4\\x53\\x7a\\x59\\x59\\xba\\x93\\x81\\xce\\x80\\x0b\\x45\\x82\\x76\\xfe\\xfc\\xfe\\x2f\\x38\\x2b\\xa7\\x4a\\xe0\\xd3\\xf3\\x40\\x68\\x22\\x6e\\xac\\xfd\\x59\\xd5\\x3d\\x79\\xf3\\x15\\x6d\\x0c\\xff\\xe7\\xdf\\x3d\\xdf\\x25\\xb6\\x5a\\x93\\x36\\x50\\x16\\x69\\xb8\\xa7\\x8e\\xb6\\x46\\xbc\\x2a\\x66\\x73\\x36\\xc9\\x9f\\xfb\\x37\\x33\\x50\\x85\\xc5\\x8f\\x8d\\x61\\x5b\\x09\\x4a\\xd6\\x33\\x0d\\xb0\\x9b\\x7b\\x25\\x7e\\x65\\xaa\\xac\\x1b\\x7a\\x0f\\xd6\\x55\\x40\\xc7\\x8b\\xa7\\x3c\\x72\\xbe\\x99\\x98\\x71\\x60\\x34\\x3a\\xab\\x9e\\x23\\xa4\\x35\\xad\\x2f\\x0e\\x92\\x8e\\x86\\x4d\\xe5\\x66\\x2b\\x83\\x4d\\x2c\\x30\\x87\\x0d\\x2f\\x14\\x0c\\x28\\x42\\x2c\\xee\\x72\\x94\\x4e\\x38\\xc0\\x54\\x5e\\x8b\\xb2\\x6d\\x91\\x95\\x6f\\x05\\xd1\\x71\\x5e\\xf4\\xf4\\x7c\\x59\\xad\\x40\\xd8\\x11\\xb6\\x4d\\x51\\x57\\xef\\x2c\\xda\\x47\\x3f\\x63\\x08\\xef\\xcb\\x39\\x63\\x39\\xa8\\xe5\\x31\\x98\\x66\\x5f\\x34\\x72\\x3a\\x7d\\x6c\\x15\\x2b\\x8d\\x78\\x68\\x4d\\xaa\\x9b\\x13\\xaf\\xba\\x36\\x89\\x5b\\x92\\xec\\x8f\\xdf\\xc8\\x2e\\x92\\xe0\\x6a\\x63\\x55\\x6a\\xb7\\xb1\\xc1\\x6a\\xb3\\x97\\x8c\\xef\\x5c\\xb3\\x14\\x18\\x6e\\x5c\\x34\\x70\\x85\\xac\\xf1\\xf7\\xcf\\xdd\\xfc\\x02\\x40\\xa4\\x07\\x6b\\xc9\\xe1\\xeb\\xcd\\x31\\x45\\xc2\\x85\\x94\\x3b\\xac\\x5a\\xea\\x19\\x40\\xa2\\x09\\xb4\\x20\\xb7\\x7e\\xf9\\x93\\x48\\x67\\x8b\\x19\\x4e\\x5a\\x81\\x04\\x86\\x3b\\x4c\\x6f\\x56\\x33\\x7d\\xb1\\x27\\x39\\x0c\\xd3\\x49\\xec\\x69\\xe6\\x0a\\xa1\\xb2\\xda\\xc0\\xe0\\xd6\\x61\\x99\\x74\\x41\\xa4\\x9a\\x78\\xb4\\x56\\xfd\\x88\\x95\\x0e\\xff\\x89\\x03\\xff\\x4b\\x46\\x6b\\x7d\\x2b\\xb8\\x3d\\x34\\x85\\x69\\x16\\xa2\\xea\\x1e\\x96\\xf6\\xdb\\xc4\\xd7\\x78\\xbb\\xf0\\xb8\\xc9\\x2a\\xe9\\xd4\\x91\\x16\\x4e\\xc7\\x19\\xfa\\xaf\\x0d\\x83\\x85\\x90\\x45\\x4e\\xef\\x63\\xf6\\xdf\\x07\\x0f\\x5d\\xbb\\x0c\\x6b\\x49\\x1e\\xeb\\x8b\\xe4\\x8d\\x3d\\x4a\\x0f\\xa3\\xb3\\xc3\\xff\\x5a\\x3b\\x74\\x89\\x14\\x2c\\x24\\x5c\\x76\\x92\\x3f\\x3c\\x97\\x17\\x9a\\x6c\\x24\\x0b\\x5c\\xb5\\xe9\\x59\\x51\\x26\\x25\\x0b\\xb3\\x3e\\xed\\xf0\\xcb\\xc6\\x2c\\x92\\x1c\\x13\\x7a\\xdc\\x00\\x50\\xa6\\x11\\xae\\x93\\x77\\xb4\\x5b\\xd7\\x7a\\xee\\xc3\\x48\\x12\\x32\\x7c\\x6e\\xf4\\x63\\x9c\\x19\\xdb\\xda\\x8e\\x4a\\xa1\\xc0\\xa7\\xc5\\x32\\x96\\xef\\x72\\x7b\\x2d\\x49\\xdf\\x71\\xc1\\x82\\x43\\xbe\\xf6\\x77\\x5b\\xb0\\x44\\xfa\\x80\\x5b\\x92\\x4a\\xbc\\xc0\\xde\\xbe\\x19\\x7e\\x1c\\x04\\x1d\\x93\\xce\\xf7\\xdb\\xc9\\xf9\\x98\\x87\\xb4\\x0b\\xf4\\x0f\\x95\\xca\\xfc\\x10\\x05\\x86\\x25\\x88\\xe6\\xfe\\x7d\\x67\\xe8\\x5b\\x88\\xda\\x26\\x29\\xd2\\xce\\x1f\\x5e\\xa0\\xdc\\x66\\x1b\\x69\\xd4\\x0b\\x3b\\xb5\\x0a\\xb2\\x08\\x8d\\x22\\x0e\\xe9\\xf1\\xe9\\xc2\\x4e\\xde\\x3d\\x13\\xf3\\xcc\\x3f\\xc5\\xa7\\x5f\\x12\\xad\\x1f\\x0a\\xe2\\x16\\x20\\xab\\xeb\\xbe\\x5c\\x93\\x3e\\x59\\x3e\\x4e\\x35\\xac\\x3f\\x42\\xa2\\x1b\\xed\\x31\\xdc\\xe2\\xa9\\x28\\x43\\xa3\\xac\\x5c\\x5f\\x91\\x6c\\x68\\xfa\\x67\\x32\\x84\\x07\\x6e\\x90\\x29\\x93\\x6a\\x89\\xf4\\x8b\\x71\\xcc\\xcc\\x2d\\x18\\xa6\\xdf\\x94\\xa3\\xae\\xc4\\x36\\x94\\x42\\x05\\xc6\\xe5\\x90\\x95\\x22\\x55\\x26\\x13\\x72\\xd2\\xd4\\xc0\\xd8\\x51\\x12\\x08\\x87\\xe3\\xf5\\xa9\\xa2\\xdb\\x6d\\x9b\\x2c\\x3f\\x79\\x54\\xa8\\x6c\\xd6\\x05\\xab\\x65\\xec\\x29\\xdc\\xe7\\xba\\x21\\x50\\x19\\xf6\\x8b\\x59\\x4e\\xb9\\xde\\xdb\\xab\\xff\\xdd\\x4b\\x35\\x21\\xa2\\xdd\\x09\\xa2\\x86\\xd8\\xd2\\x52\\xb6\\x4d\\x69\\xa5\\x09\\x14\\x44\\xea\\x41\\xfb\\x40\\x25\\xbe\\xd1\\x40\\x2f\\x21\\xae\\xc6\\x1e\\x63\\x13\\x66\\x5a\\x60\\x3f\\xe1\\x46\\x6b\\xa0\\x46\\xfb\\xab\\xc7\\xbd\\x18\\xa4\\xa7\\x8b\\xaa\\x5f\\xc3\\xc9\\x9c\\xb1\\xc2\\x52\\x67\\x1d\\x76\\x4d\\x72\\x77\\x85\\x0d\\x8b\\x70\\xe3\\x32\\x66\\x85\\x40\\x2d\\x42\\x5e\\xee\\x0b\\xd3\\x76\\x26\\xba\\x3f\\xcc\\x9d\\xd4\\xc0\\x93\\xd1\\x37\\x41\\xee\\x3c\\x27\\x54\\x6f\\x79\\xc7\\x9b\\x55\\xcd\\x4b\\x2f\\xc7\\x0a\\x9b\\x01\\xb5\\x43\\x71\\x74\\x85\\xa6\\xbe\\x11\\x44\\xb3\\xf0\\xea\\xfd\\x6e\\xe4\\x96\\xeb\\x3a\\x3a\\x67\\x69\\x1a\\xcb\\x0b\\x52\\x09\\xa2\\x2c\\xab\\x27\\x3d\\x36\\xc9\\x74\\xcb\\x57\\xa1\\x64\\xf7\\x1f\\xa1\\xac\\x1a\\x6a\\xe1\\xa9\\xf9\\x23\\x77\\x31\\xec\\x12\\xc2\\x93\\x3d\\x58\\x47\\xcd\\xdc\\x4f\\x5c\\xaa\\xb7\\xd1\\xf4\\x4f\\x39\\xb3\\x9e\\x4c\\xb2\\x4e\\x65\\xc2\\x01\\x3a\\xfd\\x34\\xa9\\x06\\x16\\x99\\xef\\x51\\x0b\\x33\\x25\\xbe\\x42\\x08\\x22\\xdc\\xbb\\x54\\x05\\x50\\x42\\x38\\xe5\\x0f\\x72\\x21\\x5b\\xe3\\x8d\\xac\\x8a\\x2a\\x36\\xa1\\x3b\\xaa\\xc5\\xb7\\xe4\\x25\\x22\\x61\\xcf\\x32\\x9c\\x90\\x5c\\x30\\x0e\\xba\\x55\\x41\\xd5\\x0a\\x99\\x2d\\x42\\x76\\x1a\\x33\\x98\\x81\\x15\\x17\\xfb\\xb2\\x78\\xe9\\x5d\\x15\\xdd\\x6e\\xf8\\xc6\\x00\\x66\\x22\\xee\\x70\\x70\\xce\\x9b\\xd6\\x83\\x69\\x43\\x70\\xdf\\xda\\xc7\\x24\\x4c\\x54\\x50\\x11\\x29\\xfc\\xa9\\x1b\\x8b\\xb7\\xd9\\x09\\x0f\\x37\\x05\\xff\\x53\\xaa\\x37\\x2d\\x24\\x06\\x08\\xbd\\x84\\x83\\x99\\xd1\\xe9\\xc6\\x8b\\xf1\\x53\\xc5\\xa4\\x6b\\x0e\\x26\\x99\\x93\\x6a\\x41\\xc6\\x6d\\xa2\\xf9\\x21\\xed\\x37\\x3c\\xd7\\x1b\\x6a\\x6e\\xd3\\x28\\x05\\xcf\\xbb\\x47\\xe9\\x1d\\xed\\x1c\\xa7\\x26\\x6f\\x96\\xb9\\xe2\\xb1\\x0f\\x27\\xe1\\x02\\xb1\\x10\\x24\\xd6\\xc4\\x78\\x66\\xfb\\xb8\\x34\\xd5\\x9f\\xc7\\x0a\\xfe\\x03\\x1f\\x18\\x8f\\xee\\x73\\xaf\\xa5\\x64\\xa6\\x92\\x5a\\x3e\\x2d\\x82\\x0b\\x07\\xab\\xcc\\xb7\\xc9\\x29\\xda\\x99\\x79\\x9d\\xad\\x41\\x1c\\x5c\\x68\\xa6\\xe6\\x3b\\x76\\xa4\\x70\\x3e\\x1f\\x6e\\x4e\\xe1\\x6b\\x52\\xd9\\x85\\xda\\x0c\\x51\\x6e\\xca\\x6c\\x84\\xd4\\xfa\\x27\\xa9\\x6e\\x07\\xca\\x4e\\x6e\\x24\\xbb\\x3f\\x63\\x9b\\xd1\\x47\\x04\\xe9\\x0a\\x3a\\x20\\xbf\\x69\\x7f\\x21\\xcd\\x24\\x30\\xaf\\xad\\xdd\\x84\\x4e\\x6f\\x6a\\xf9\\x62\\x43\\xc6\\x71\\x67\\x44\\xfd\\xbb\\x87\\x64\\x4a\\x04\\x08\\xe3\\x28\\x25\\x52\\x80\\xae\\x2d\\x26\\xae\\xa4\\xe1\\xbc\\x7f\\x7f\\x69\\x5c\\x46\\x46\\x56\\x88\\xeb\\x69\\x7f\\x5a\\xce\\x84\\x21\\x18\\x41\\x83\\xdd\\x09\\xfe\\x34\\xd4\\x49\\x22\\xfe\\xc9\\x10\\x82\\x3e\\x90\\x94\\x75\\x9c\\x5f\\x3d\\x9f\\x35\\x0d\\xdd\\x99\\x5a\\xa7\\x70\\x5c\\x32\\xbd\\x16\\x5c\\xea\\xd0\\xb9\\x40\\x9b\\x1a\\x5e\\xe1\\xb0\\x06\\xd6\\x8e\\xe7\\xfb\\x1b\\x56\\x98\\x4c\\xea\\x2f\\xac\\xf1\\xe2\\xb4\\xef\\x41\\x35\\xc9\\xdf\\x9b\\x7d\\x37\\xaa\\x56\\x6f\\xaf\\xa9\\x76\\x8a\\x03\\x3b\\xc0\\xb8\\xdf\\x78\\x64\\x5e\\x32\\xab\\x74\\xa9\\x66\\x40\\xff\\x33\\xf6\\x09\\x4c\\xb5\\xfc\\xf8\\xc7\\xce\\x34\\x64\\x53\\x0f\\x62\\xd6\\x43\\xf4\\x46\\x5f\\xce\\x2e\\x4e\\xce\\xe0\\xd0\\x17\\xf4\\x2d\\xcd\\x88\\x84\\xa4\\x8c\\x82\\x2c\\xf1\\x1d\\x48\\xa2\\x80\\xa7\\x7b\\x7c\\xf9\\xa1\\x86\\xd5\\x3c\\xa7\\x87\\x96\\x6c\\xc3\\xcf\\x68\\x92\\x9c\\x70\\xc4\\xb7\\x6f\\x23\\xaf\\xcf\\xeb\\xfe\\x7c\\xcf\\x78\\x46\\x25\\x5b\\x87\\x91\\xde\\x24\\x0d\\xd0\\x9b\\xb8\\xf3\\xc1\\x08\\x2e\\xd1\\x8f\\x9c\\x79\\x09\\x62\\x4a\\x98\\xf8\\xb3\\x0b\\x98\\x2d\\x3e\\x7f\\xaa\\xc2\\x38\\x37\\x59\\x5b\\xe2\\x7a\\x56\\xaf\\x8c\\x96\\x25\\x58\\x20\\xfe\\x18\\x5e\\x87\\xff\\x99\\x60\\xd0\\xe6\\xaf\\x65\\x6d\\x2b\\xe4\\x3f\\x6c\\x0b\\x87\\x8e\\xc4\\x2d\\x86\\x23\\x38\\xc3\\xb1\\x80\\x4a\\xf8\\x45\\x9e\\x15\\x56\\xa9\\x65\\xe1\\x2e\\x9a\\x20\\x7f\\x7e\\xb8\\x84\\x6e\\xdf\\xea\\x29\\xb9\\xa6\\x34\\x58\\xb3\\xdb\\x0e\\xfe\\x41\\x77\\x3c\\x52\\xd5\\x38\\xc7\\x56\\xdf\\xf2\\x24\\xce\\xc6\\xea\\x14\\xcc\\xc0\\xba\\x08\\x15\\x13\\x1b\\x24\\x39\\xcc\\x17\\x89\\x00\\x5d\\xc2\\x83\\x10\\x3e\\xc2\\xf5\\x71\\xbd\\xb4\\x8e\\x4e\\xc2\\xcb\\xae\\x77\\x58\\x06\\x0a\\xb3\\xc0\\xd4\\x8b\\xec\\x07\\x89\\xf3\\xde\\x88\\x85\\xa6\\x0f\\x09\\x2a\\x40\\x0d\\x6c\\xf2\\x7e\\xaf\\x10\\xeb\\x3b\\xc7\\xdc\\x1f\\x5d\\xa2\\xb6\\x29\\xbf\\xd1\\xa5\\xe8\\x09\\xf7\\x0b\\x77\\xd9\\xa7\\x4b\\x22\\xe0\\xa3\\x7c\\x57\\x1e\\x64\\xf2\\xed\\x34\\x04\\x71\\xc1\\x49\\x6d\\xe8\\x16\\xa0\\x34\\xc3\\x8b\\xe6\\x91\\x5b\\x50\\x60\\x3c\\x87\\xa6\\xd8\\xfc\\x82\\x0a\\xde\\x4f\\xf9\\x1a\\x6d\\xbe\\x56\\x34\\xc5\\xb1\\x7a\\x50\\xfa\\xbc\\x27\\x5f\\xac\\xa0\\xba\\x2b\\x43\\x16\\xa3\\x2e\\x38\\x79\\x38\\x70\\x5f\\x44\\xc4\\x7b\\x41\\x0e\\xf6\\x59\\x0e\\xc7\\x1b\\x42\\x7e\\x25\\xf9\\x17\\xa1\\x27\\xea\\x33\\x10\\x90\\xab\\x3d\\xf9\\x9e\\xaf\\x70\\x50\\x9e\\x49\\xa0\\xe2\\x23\\x85\\xcb\\x42\\x64\\xfa\\x50\\x86\\xb1\\xf0\\x3b\\x15\\x8e\\x1a\\x8b\\x5d\\xb5\\x01\\xd7\\x2a\\xbd\\x71\\x82\\x46\\xc6\\x58\\x23\\xad\\xc1\\x96\\x52\\xc5\\xa5\\x90\\x00\\xf3\\xf9\\x93\\xae\\xe8\\x77\\x5e\\x9a\\xca\\x15\\x8e\\xae\\x9e\\x7c\\x97\\x27\\x4c\\x41\\xbe\\xbe\\x1a\\x53\\x61\\x75\\x40\\xcb\\x34\\xa2\\xc8\\xc0\\x36\\x9f\\x56\\x5c\\x05\\x4c\\x22\\xf4\\xbd\\xc0\\xe2\\x40\\x33\\xfa\\xbb\\x6c\\xfd\\x21\\xa6\\x27\\x0a\\x73\\x91\\xc3\\x9b\\x3a\\x3a\\xf2\\x19\\xba\\x4b\\xc5\\xb7\\x64\\x80\\x82\\x28\\x62\\x00\\x92\\x46\\x65\\x17\\x76\\x55\\x62\\xc2\\x58\\xa3\\x80\\x2a\\xdd\\x25\\x38\\x87\\x52\\x2f\\x10\\x56\\x9d\\x49\\x9d\\x6b\\x84\\xbf\\x9a\\x6b\\xc5\\x85\\xf9\\x78\\x65\\x61\\x14\\x1f\\x0e\\xb2\\x10\\x83\\x50\\xb8\\x86\\x8f\\x83\\xed\\x37\\x46\\x0a\\xb4\\xfb\\xc2\\x14\\x50\\x3c\\xf0\\x09\\x07\\x01\\x1d\\x9d\\x02\\x21\\x63\\x9f\\x8c\\xd0\\x45\\xc6\\x90\\xf7\\x6e\\x1b\\x89\\x70\\xd9\\xc0\\xd7\\x3e\\x1d\\xf5\\x4c\\xe8\\x75\\x1b\\xa2\\xfe\\x57\\x48\\x6c\\x1d\\x35\\x6a\\x2a\\xc2\\x27\\xa6\\xdc\\x2b\\x01\\x55\\x25\\x0a\\x67\\xf4\\xbd\\x30\\xcc\\xa5\\x53\\x1b\\x8f\\xae\\x03\\xac\\x10\\xfc\\xac\\xdc\\xeb\\x9f\\x35\\x1a\\xc1\\xd3\\x67\\x9e\\x6a\\x62\\xc1\\xc7\\x16\\xb6\\x36\\x5c\\x22\\xa7\\xa0\\x24\\x57\\xa4\\xcd\\xa5\\x2e\\x5c\\xc8\\x39\\x24\\xd5\\x9d\\x2a\\x95\\xee\\x7c\\x7e\\xd1\\x55\\xe8\\x81\\x02\\xab\\x31\\x61\\xeb\\x44\\x0d\\xe3\\xc2\\xa1\\x6e\\x27\\x38\\x50\\xd0\\xfc\\xf2\\x5b\\x43\\x4e\\xbd\\x43\\xff\\x86\\x3a\\x69\\xab\\x68\\x7c\\xf0\\xc7\\x78\\xbc\\x84\\x66\\x88\\x84\\x57\\xad\\xc6\\x3a\\x8e\\x9e\\x1d\\xca\\x77\\xbf\\x4c\\x77\\x68\\x09\\x95\\xe9\\x4f\\x52\\xd6\\xec\\x54\\xa7\\x24\\x57\\x82\\x8a\\x50\\xe5\\x01\\xac\\xaf\\x46\\x5d\\x9d\\x32\\x39\\x89\\x31\\xa2\\xd9\\x14\\x0c\\x7c\\xb9\\x7e\\xf9\\x1c\\x07\\xa2\\x6f\\x85\\xdd\\xdb\\x31\\x11\\xdf\\xe9\\x25\\xe9\\x37\\x6d\\x66\\x91\\x31\\xf1\\x1b\\x96\\xc4\\x99\\xf1\\x2c\\xef\\xba\\xb9\\x5d\\x48\\xad\\x50\\xd1\\x6b\\x40\\x4f\\xd0\\x8a\\x85\\x91\\x88\\x4f\\xe5\\xcf\\x07\\x3a\\x35\\x39\\x16\\xa9\\x8a\\x3b\\x5f\\x3d\\x57\\xff\\xb4\\xc5\\xca\\xe4\\x7e\\xbc\\xbe\\x9f\\x8d\\xee\\x15\\x1a\\x4c\\xbe\\xbb\\xba\\x97\\x42\\x63\\x28\\x74\\x8b\\x53\\xf2\\x82\\xf5\\x31\\x0d\\x6b\\x84\\xd8\\x09\\x17\\xb7\\xe3\\xad\\x56\\x99\\xdd\\x29\\x9a\\x9c\\xbd\\x0b\\x30\\xc5\\x9e\\x5f\\xd0\\x84\\xa1\\x90\\x9b\\x54\\x7e\\xe2\\xed\\x22\\xfb\\xe6\\x2a\\xbe\\x84\\xb1\\x1f\\xe7\\x58\\x7e\\x84\\x61\\xb8\\x1d\\x8a\\xe7\\xba\\xe2\\x33\\x49\\x52\\xe2\\xcb\\x8d\\x31\\x10\\xc5\\xd6\\x7e\\xf1\\xbd\\xaa\\xbf\\x3c\\x7c\\x6d\\x0d\\x05\\x67\\x9b\\x98\\x67\\x80\\xb6\\x0e\\xf8\\x79\\xdd\\x19\\xda\\x0a\\xa2\\x3d\\x49\\xd8\\xe4\\xe2\\x25\\x54\\x2c\\x19\\x8f\\x64\\xd9\\xc9\\x13\\x53\\x28\\x99\\x20\\xa0\\x4f\\x3b\\xaa\\xc6\\xbf\\xcd\\xa0\\xb5\\x98\\x75\\xdf\\x79\\x1f\\x74\\x62\\x0f\\x41\\xc2\\x89\\xcd\\xfd\\x21\\x9c\\x81\\xaf\\xd8\\xbd\\x37\\x4f\\x6f\\x41\\x13\\xc7\\xab\\xda\\x1d\\xdc\\x4e\\x9e\\x5d\\xe5\\x4a\\x1d\\xea\\x89\\xe2\\x40\\xf1\\x22\\x95\\x1a\\x9b\\x5a\\x7a\\x3d\\xb4\\x8e\\xe8\\x78\\x23\\xff\\x21\\xd1\\x29\\xec\\xf1\\x56\\x75\\x50\\xe3\\x77\\x7b\\xff\\x3e\\x42\\x9b\\xf5\\x9e\\xaf\\x84\\x78\\xfd\\x2d\\x8f\\x09\\x87\\xac\\x2a\\x6c\\x5a\\x61\\xbc\\x05\\x1d\\x61\\x15\\x26\\x59\\x57\\x95\\x62\\xcb\\x50\\x19\\x43\\xdc\\xa6\\x14\\xdb\\x65\\x14\\x9d\\x72\\xc6\\x5f\\x26\\xa9\\x58\\x03\\x72\\x2d\\x83\\xc1\\xe4\\xeb\\x6d\\x66\\xa6\\x8b\\xb6\\x06\\x8a\\xe8\\x0e\\x64\\x12\\xa5\\x30\\x66\\xb8\\x83\\x33\\x89\\xb8\\x77\\x4c\\x8a\\x2f\\xe4\\x6f\\x2b\\x3e\\xd8\\x51\\x9e\\x10\\x1e\\xbe\\x22\\xfe\\x5e\\xaa\\xde\\x39\\xb2\\x3c\\x12\\x33\\xc6\\x1d\\xab\\x41\\xfb\\xd0\\xab\\xaf\\x25\\x8d\\xe6\\x04\\x55\\x42\\x9e\\x2d\\x93\\x92\\xbb\\x7c\\xba\\x5b\\xef\\x8d\\xf6\\x3c\\xf2\\xfe\\x97\\xab\\xa4\\x6c\\xb2\\x3f\\x0c\\x3e\\xad\\x9c\\xa3\\x76\\x8e\\x0f\\x6e\\xd7\\xf8\\x8a\\xb6\\xfd\\xe7\\xb5\\x8b\\x16\\x0b\\x06\\xfb\\x22\\xb1\\x71\\x99\\xbe\\x9d\\x14\\xc8\\xe4\\xf5\\xbb\\x70\\x8f\\x3b\\x97\\x9b\\x03\\x7c\\x8c\\x2b\\x4f\\x9f\\x53\\xa2\\xbf\\x9c\\x44\\x4f\\xf3\\x7d\\x00\\x1c\\xad\\xce\\x05\\x35\\x0e\\xec\\x3f\\x84\\x5a\\x04\\xe2\\x0b\\xc5\\xe7\\xff\\x1e\\x07\\x1d\\xd5\\x67\\x37\\x74\\xce\\x32\\x8b\\x0f\\xf5\\xb7\\x58\\xa6\\x5e\\xa6\\x43\\x56\\x68\\x18\\x88\\x99\\x1d\\x19\\x15\\x50\\x7c\\xdd\\x23\\x83\\xfa\\x81\\x2d\\x5f\\x0f\\xe2\\x44\\xb3\\x0e\\x29\\xd1\\xa1\\x2f\\x8b\\xd7\\xcb\\x9a\\x23\\x05\\x2c\\xec\\xa1\\x92\\x1d\\x57\\xc5\\x10\\x7f\\xaf\\x33\\x33\\xeb\\x87\\x01\\x57\\x90\\xc1\\xe5\\x47\\xe9\\xa7\\x20\\x75\\x48\\xf4\\x83\\xd4\\x84\\x20\\x3c\\x13\\x3e\\x96\\x04\\xb4\\xc5\\x59\\xac\\xa7\\xaf\\xd8\\xfe\\xaf\\x9a\\x5b\\x95\\x98\\xbf\\xf2\\x9c\\x06\\x3e\\xd7\\x1b\\xe7\\x1e\\x59\\x13\\x4f\\x90\\x70\\xe1\\x63\\xc6\\x94\\x5f\\xc8\\x90\\xc9\\xb9\\x73\\x60\\xb9\\xfc\\xd2\\x9b\\x1a\\x8d\\xe0\\x85\\xcb\\xe2\\x4e\\x52\\x0d\\xb4\\xf7\\xb2\\xad\\x94\\xeb\\xbd\\xfa\\x95\\x4d\\x1e\\x1c\\x95\\x4b\\xb3\\xf8\\x22\\xf6\\x21\\xf6\\xf8\\xce\\xd9\\x2f\\xa0\\x8a\\xc9\\x6a\\x33\\x94\\x06\\xf3\\xaa\\xab\\xaf\\x02\\xae\\xb8\\x60\\x34\\xd3\\x3c\\x22\\xea\\x26\\x94\\x8f\\x52\\xcb\\x96\\x3f\\xf1\\x9d\\x49\\x90\\x88\\x45\\x6a\\x27\\xf8\\x0d\\x50\\x05\\xfb\\x10\\x85\\xae\\x56\\x75\\x1d\\x82\\xb2\\x22\\x1d\\x69\\xa8\\x12\\x8f\\x1e\\x5d\\x8c\\x08\\xc9\\xab\\x8f\\xca\\x87\\xe6\\xa6\\x67\\x09\\xe5\\x11\\x8b\\xe5\\x45\\x45\\xe4\\x64\\x8d\\x82\\x3f\\x64\\xb4\\xe3\\x98\\xae\\x15\\x10\\x30\\xc3\\xbb\\x62\\x38\\xaa\\x51\\x08\\xe7\\xd3\\x14\\xfd\\x84\\xd1\\x6e\\x5b\\x74\\xb2\\xcb\\x8d\\x17\\xe3\\xb1\\x7d\\x63\\x4a\\xaa\\x9e\\xed\\x4a\\x55\\x7d\\xad\\xbc\\x29\\xbf\\x03\\xca\\xb2\\x13\\xf3\\x2c\\x99\\x8b\\x94\\xa5\\x38\\x58\\xec\\x95\\xd0\\x0d\\x64\\x9c\\x6f\\x8f\\x83\\xef\\x28\\xc9\\x11\\xea\\xab\\x6a\\x8d\\x0f\\xd9\\x44\\x01\\x28\\xe8\\x31\\x2e\\x12\\xa8\\xc5\\x64\\xa8\\x94\\xa9\\x60\\x18\\x89\\x41\\x36\\x31\\xca\\x5a\\x13\\x08\\xcf\\x8b\\x5c\\xf9\\x84\\x1d\\x4c\\x1d\\x27\\xe1\\x3f\\x3a\\xd3\\x5a\\x27\\x78\\x55\\xdb\\xa4\\x32\\x6a\\x51\\x32\\x2e\\x6a\\xed\\x73\\x12\\x32\\xfb\\x73\\x4c\\x42\\xcd\\x67\\x44\\x82\\xba\\xdb\\xf8\\x83\\xc9\\x45\\x8e\\x69\\xf8\\x4a\\x19\\xc5\\xfe\\x3d\\x84\\x12\\x88\\x32\\xe2\\xeb\\xf5\\xcb\\x53\\x7a\\x34\\x51\\x3c\\x5e\\xda\\x60\\xca\\x75\\xce\\x3f\\x1c\\xa7\\x94\\x97\\x20\\xbf\\xe6\\xc8\\x89\\xc8\\xd1\\xbf\\x99\\x03\\xda\\xde\\x65\\xcb\\xed\\x15\\xbc\\x5c\\xd3\\x64\\xa8\\x13\\xca\\x76\\x6a\\x69\\xaa\\xae\\x16\\x45\\xba\\x96\\xae\\xb8\\x80\\xb1\\x38\\x6f\\x31\\x29\\xc5\\x35\\x01\\x44\\x2c\\xa3\\x97\\xc4\\x01\\x84\\x3f\\x58\\x95\\xad\\x57\\x23\\xb6\\x6e\\xd9\\x41\\xf3\\x82\\x21\\x3b\\x17\\xa4\\x0e\\x53\\xaf\\x0f\\x9d\\xab\\x97\\xb8\\xb4\\xef\\xea\\xcc\\x0a\\xd5\\x26\\x00\\xc2\\x93\\x75\\x9b\\x29\\x37\\x10\\x2f\\x08\\xb1\\x28\\x39\\xff\\x76\\x82\\x1f\\x65\\xe0\\x99\\x9e\\x4e\\x26\\x11\\xc7\\xe1\\xa0\\xdd\\x83\\xc9\\x67\\xbd\\xf2\\xcc\\x89\\xcd\\x1f\\xbd\\x14\\x57\\xd3\\xfa\\xfc\\xef\\x24\\xd7\\x0f\\x5e\\xed\\xee\\x6b\\xb1\\xb6\\x99\\x35\\x07\\xdd\\x12\\x68\\x62\\x16\\x8e\\x6a\\x7e\\x6c\\x7d\\x6c\\x51\\x28\\x66\\x9d\\x9f\\xfe\\x8c\\x9f\\x07\\xff\\xdb\\xe2\\xe3\\xf7\\x28\\xe8\\xde\\x1e\\x62\\x02\\xfc\\x20\\x2c\\x5b\\xc3\\xf1\\xa4\\x4c\\xda\\x76\\x95\\x5d\\x3f\\x1c\\x28\\x8d\\xd1\\x54\\xdd\\xb7\\xf5\\xe1\\x84\\xce\\xe8\\x68\\xef\\x3b\\xf4\\x07\\xd0\\x29\\xbc\\x0a\\x5c\\x68\\x46\\xd6\\x23\\x63\\x78\\x0a\\x6f\\x74\\xd0\\x12\\x56\\x82\\x0c\\x7d\\x8e\\xa3\\x18\\x4d\\x3b\\x5f\\x99\\xc2\\x81\\x9f\\x2c\\x66\\x4c\\x3a\\x9b\\x87\\x35\\x63\\x11\\xc1\\xa0\\x0a\\x5f\\x57\\xb3\\x85\\x8c\\x4a\\x08\\x88\\x4c\\x6a\\xc4\\x8d\\xdc\\xed\\x6f\\xb9\\x92\\x46\\xac\\x62\\x95\\x3f\\xa5\\x4e\\x2a\\xb1\\xc6\\x02\\xb2\\xac\\xcd\\x77\\x39\\x3a\\x53\\xd9\\xfb\\x92\\xb3\\x28\\xfd\\xfa\\x16\\x64\\x9e\\xf6\\x15\\xc9\\x22\\x13\\xb8\\xe9\\xea\\xf0\\x84\\x0d\\x48\\x11\\x53\\x69\\xd6\\xfe\\x80\\xd0\\x62\\x3d\\xe6\\x0c\\xb8\\x71\\xb3\\xa8\\x5c\\x68\\xa7\\x31\\xd8\\x08\\xa8\\xc7\\x49\\x3a\\x49\\x2a\\x2d\\xbe\\x4e\\x2f\\xb4\\x75\\xf9\\xf7\\x84\\xd2\\x12\\xb0\\x56\\x73\\x43\\x8d\\xa2\\x73\\x29\\x3c\\x8d\\xd2\\x68\\xf9\\xa1\\xea\\x1f\\x7b\\xbc\\x54\\xe4\\xf4\\xa4\\x20\\x63\\xdb\\xd4\\x39\\x98\\x45\\x0e\\xf0\\xc3\\x3f\\x27\\xd6\\x50\\xde\\xcd\\xc2\\x04\\x39\\x68\\x5e\\xdb\\x5d\\x65\\xc4\\x4b\\x67\\x57\\x72\\x6e\\x49\\x5c\\xa6\\xf3\\x9f\\xef\\xb7\\x1a\\x5f\\x70\\xb9\\x73\\xc1\\x2d\\x13\\x5d\\x92\\x48\\x4d\\x21\\x3f\\xf8\\xdb\\x1b\\x90\\x4e\\xc2\\xa6\\x4e\\x2e\\x2c\\x8e\\xd4\\x3b\\xc8\\xb0\\xff\\x41\\x0f\\x44\\x25\\x9b\\x21\\x8a\\xc1\\x4f\\x81\\xce\\xd9\\xc9\\x19\\x41\\x6c\\x71\\x76\\x3c\\x49\\x67\\xa7\\x23\\x92\\x61\\x28\\x4d\\xf3\\x82\\xae\\x50\\xdc\\xfa\\x70\\x81\\x68\\xb4\\x6b\\x14\\xa2\\x1f\\x84\\xa9\\x4e\\xb1\\xa6\\x2e\\x36\\x3e\\x6d\\x02\\xc7\\xb3\\xb6\\xbc\\x7c\\x24\\xe5\\xfd\\x96\\x94\\x29\\x3d\\x2d\\xd6\\x73\\x8f\\x0a\\xe0\\x32\\x8c\\x9c\\x51\\xf9\\x97\\x73\\x50\\xc6\\x1b\\x1d\\xf4\\x7c\\x14\\xcc\\xbb\\xb1\\xf2\\x5a\\x59\\xbf\\x03\\x47\\xd2\\x7d\\x8a\\x28\\xee\\xcd\\x41\\x0f\\xf0\\x1b\\x03\\xcc\\x07\\x5f\\x2a\\x0b\\xdf\\xa5\\xc9\\x2f\\x57\\x4b\\xa0\\xbc\\xc5\\xd4\\xc6\\xee\\x82\\x4a\\x25\\x96\\xf0\\x9c\\xd9\\xc9\\x79\\xeb\\x2e\\x9d\\x7b\\xfe\\x13\\x36\\x1c\\xd2\\xec\\x2b\\xc5\\xa2\\x10\\xf7\\x84\\xe8\\x3c\\xd8\\x62\\xc6\\x69\\x85\\x09\\x4a\\x65\\x59\\x84\\x7c\\x70\\x66\\x17\\x0b\\xbb\\x44\\x67\\xbc\\xed\\x2f\\x0a\\x5d\\xd1\\xe1\\x91\\x53\\x17\\x44\\xbb\\x99\\xf3\\xa0\\xb9\\x9b\\xc9\\xb4\\x86\\x62\\x74\\x16\\xc4\\x8f\\x01\\xe1\\x48\\x82\\x3b\\x62\\xa4\\x5e\\xb1\\x8f\\x32\\x7b\\x55\\x8a\\x40\\x18\\x8f\\x06\\x7d\\x24\\x96\\x04\\x7b\\xe4\\x88\\x04\\x0e\\x0f\\x02\\xda\\x00\\x09\\x4f\\xbb\\x99\\x89\\x04\\x4e\\x1f\\x3b\\xa8\\x3b\\x39\\x6e\\x28\\x12\\x02\\x49\\x48\\x39\\x45\\x44\\x50\\x3c\\x05\\xdb\\x92\\x38\\x7c\\x3a\\xdc\\x8b\\x1e\\xb1\\x45\\x60\\x1a\\x3d\\x83\\x0e\\x99\\x59\\x64\\xc6\\x8c\\xb8\\x26\\xfb\\x04\\x63\\xdb\\x07\\x36\\x24\\x9a\\xa3\\xe1\\x16\\xb3\\x82\\x80\\x7b\\xb4\\x0a\\x3a\\x2b\\x9f\\x00\\xd3\\x95\\x5e\\x70\\xeb\\x6e\\x02\\xab\\x62\\x32\\x4c\\xad\\xa2\\x24\\xd3\\xf6\\x8a\\x6b\\x00\\x55\\xf0\\xe1\\xdd\\xbb\\xa0\\xc4\\xdc\\x17\\x21\\x1a\\x3b\\x37\\xad\\xeb\\xdf\\xd4\\xf2\\xbd\\x65\\x21\\xcc\\x28\\x4a\\xc2\\x4b\\x62\\xab\\x47\\x8e\\x6c\\x0b\\x7a\\xd3\\x72\\xec\\xa1\\x64\\x8b\\xfc\\x7d\\xf4\\xfe\\xe7\\xb3\\xdc\\xec\\xcb\\x91\\x07\\x70\\xc7\\x24\\xe9\\x1a\\xe4\\xff\\x6a\\x6c\\xdc\\x02\\xfd\\x50\\x04\\xfb\\x67\\x75\\x2d\\xcd\\xe8\\x82\\x44\\x39\\x7e\\x49\\xee\\xff\\xa5\\x85\\x8b\\x0c\\x97\\x49\\x1c\\x5e\\x0b\\x2d\\xa7\\xdf\\x55\\x38\\x27\\xec\\x9b\\x9f\\x4e\\x28\\xae\\x68\\xd5\\x0d\\xba\\x0e\\x6a\\xe6\\xc7\\x60\\x89\\x36\\x7d\\xf9\\x23\\x40\\x84\\x9e\\x6d\\xe4\\x67\\xc5\\x12\\x51\\x1c\\x7f\\xef\\x22\\x92\\x21\\x9a\\xd9\\x55\\x89\\xcf\\xa3\\x68\\x04\\x8a\\xf6\\x56\\xff\\xe7\\x7f\\x62\\xf7\\x3e\\x5d\\x5a\\x46\\x5a\\x6c\\x01\\x17\\x77\\x2e\\xaf\\x30\\xaf\\x3c\\x36\\x61\\x44\\x84\\x56\\x43\\x35\\x83\\xfe\\xf9\\x2f\\x9a\\x36\\x60\\x3b\\x1c\\xd4\\x3c\\x5d\\x2e\\x8a\\xef\\xed\\x05\\x92\\xfb\\xf5\\x17\\xda\\x4d\\x80\\xdf\\x6e\\xa4\\x58\\x1d\\x5f\\xad\\x58\\x52\\x77\\xef\\xdc\\x88\\xa2\\xca\\xc4\\x30\\x93\\xe5\\xc7\\xdd\\xb1\\x90\\x87\\x92\\x24\\x1d\\xc4\\x83\\x26\\x3d\\x76\\x9d\\x5b\\x43\\x30\\x24\\x36\\x34\\x22\\xc7\\xb0\\xe5\\xca\\x6f\\x06\\x4c\\x6f\\xac\\x1b\\xc6\\x4e\\x12\\x46\\x8e\\x76\\xf8\\xda\\x51\\x6c\\xee\\xa3\\x30\\x9a\\x83\\xb1\\x7c\\xf5\\xad\\xa6\\xc3\\x17\\x2d\\x5e\\x9b\\x81\\xf2\\x0a\\xa5\\x01\\xce\\xe9\\x53\\x41\\xae\\x3a\\x93\\xf0\\x0c\\x84\\x15\\x3d\\x36\\x03\\xeb\\x3c\\x1a\\xac\\xb1\\x2f\\x78\\x9a\\xf5\\x39\\x7f\\xf5\\xc6\\x39\\xb0\\x80\\x58\\x2b\\xc7\\x60\\x74\\x0e\\xca\\x76\\x32\\x2c\\x98\\xcd\\x5f\\x57\\xf9\\x3f\\xc5\\x6d\\x93\\xa9\\xc2\\x6d\\xf9\\x5f\\x5e\\xab\\x61\\xfe\\x3e\\x08\\xcf\\x58\\xe3\\x8c\\xcc\\x17\\xdf\\x62\\x84\\x1d\\xfd\\xb4\\xb3\\x63\\xce\\x71\\xff\\x5d\\x59\\xc7\\xac\\x12\\xb0\\xc6\\x20\\x93\\x8f\\xa1\\xe8\\x80\\x68\\x91\\xfd\\xc8\\xcd\\x87\\x5a\\xcc\\xb9\\x08\\x01\\xc9\\xc4\\x8b\\xc3\\x23\\x7e\\x14\\xfa\\xf2\\xaf\\x26\\xf5\\x72\\x58\\x44\\xc6\\x3d\\xc1\\x1d\\x9f\\xe1\\xc7\\x20\\x76\\x53\\x13\\x28\\xa5\\x30\\x3d\\x13\\xcd\\xf6\\x17\\x9d\\xc2\\xd7\\xa1\\x56\\xb6\\x6e\\x38\\xb9\\xe9\\xe4\\x37\\x0f\\x83\\x40\\xc0\\x3f\\x8a\\xcd\\x84\\x32\\x30\\xd6\\x92\\x86\\xfb\\x37\\xf9\\x08\\x9b\\x61\\x00\\xcb\\x89\\xd0\\xa2\\xb9\\xe8\\xdb\\x20\\x3c\\x57\\xc3\\x3d\\xf1\\xaa\\x69\\xe3\\x3f\\x7f\\x8f\\x6f\\x17\\xf9\\x79\\xea\\x8e\\x89\\x5a\\xd2\\x2f\\x59\\x68\\x5a\\xb4\\xaa\\xc9\\x9f\\xb6\\xf1\\x2f\\x7d\\x16\\x3f\\x07\\x1f\\xd2\\xa3\\x7e\\x76\\x34\\x34\\x81\\x14\\x84\\xfe\\xc5\\xbe\\x53\\x99\\x8f\\x9a\\x77\\xb2\\x07\\x88\\x49\\xc1\\x08\\x62\\xe8\\xab\\x11\\xb6\\xf0\\x37\\x3b\\x02\\xf6\\x98\\x9a\\x3f\\xfe\\x68\\xd9\\xfe\\x21\\x47\\xf3\\x88\\xbb\\xee\\x84\\xca\\x32\\xec\\x16\\x1b\\x0b\\xe0\\x00\\x7b\\xc2\\xd8\\x8c\\xf1\\x2c\\x8f\\xb5\\x60\\xd6\\x97\\x0d\\x66\\x01\\x81\\x6a\\x9f\\x28\\x2d\\x09\\x02\\x16\\xf7\\xb3\\x13\\xe2\\x29\\xac\\xc3\\x08\\xaf\\xc1\\xed\\x0f\\xc7\\xf2\\x99\\xf3\\x56\\xbf\\x75\\x4c\\xa5\\xe0\\x99\\x7a\\x69\\xff\\xe1\\x0e\\x98\\x31\\xcf\\x43\\xf2\\xf7\\x04\\x6a\\x9c\\x85\\x7e\\x0e\\x0d\\x85\\x3b\\x49\\xe9\\xfd\\x91\\x1a\\x8c\\x2d\\x82\\xd9\\x78\\xd8\\x99\\x38\\xfd\\xe9\\xab\\xc5\\x69\\xe9\\x44\\xfe\\xc0\\x17\\x08\\x52\\xa4\\x58\\x97\\x38\\x4c\\x42\\x4e\\x7b\\xa8\\xd6\\x94\\x4b\\x7b\\x4e\\xaf\\x78\\xa6\\x51\\xb7\\xe0\\xb0\\xa4\\xb7\\x46\\x04\\x6b\\x08\\x7d\\x1d\\x42\\xe8\\x79\\xbc\\x57\\x41\\x99\\xd7\\x39\\x4a\\x46\\xd2\\xf6\\x82\\x81\\x42\\x4b\\x30\\x0a\\x7a\\x45\\x6b\\x94\\xf5\\xbe\\x51\\x83\\x1e\\x96\\x28\\x11\\xef\\xbc\\x75\\xd2\\x91\\x8e\\x17\\xdd\\x51\\xa8\\x5b\\xd8\\x8f\\x79\\x12\\x61\\xd4\\x82\\x2f\\x42\\xa5\\x9a\\xff\\xc5\\x13\\xfa\\x7e\\x6f\\xf6\\x2e\\x45\\xc4\\x8d\\x54\\x07\\x20\\x3a\\xb4\\x0a\\xd0\\xba\\x70\\x82\\x88\\xc2\\xf5\\xba\\x77\\xaa\\x7e\\x5a\\xa6\\xea\\x07\\x6b\\xd8\\x27\\xa5\\xcc\\xf8\\x0d\\x93\\x27\\xf4\\x21\\xbe\\x96\\xc3\\xc2\\x18\\x1c\\x1c\\x48\\x0c\\xac\\x5d\\x9f\\x0b\\x14\\xa0\\x89\\x1f\\x59\\x12\\x2b\\xb9\\x78\\x58\\x0e\\xa0\\xed\\x7b\\xe7\\x90\\x8c\\xcb\\x46\\xb8\\x33\\x0e\\xbd\\xcd\\x7b\\x51\\x71\\xb0\\x70\\x18\\x15\\x49\\x5f\\xa2\\xa4\\xb9\\x56\\x63\\x2b\\x22\\xf2\\xb2\\x60\\x22\\x3a\\xe2\\x4e\\x21\\xa8\\x3c\\xb3\\x5a\\xe7\\xf1\\x24\\x88\\x5b\\x99\\xfb\\x49\\x60\\xca\\x65\\x41\\xa4\\x42\\x3b\\xcd\\xe2\\xf8\\xf2\\x99\\x31\\xec\\x3d\\xb4\\xb0\\x0d\\x4a\\x73\\xa2\\x68\\xf8\\xf7\\x09\\x85\\xc6\\x99\\xc5\\x39\\x7f\\xb2\\x54\\xd2\\x98\\x04\\x05\\x06\\x7c\\x55\\x79\\xd9\\x44\\xd5\\x35\\x0d\\x23\\x2d\\x0b\\xf6\\x8b\\x2e\\x24\\xab\\x81\\xc2\\x1a\\x20\\x9e\\x19\\x57\\xda\\xa7\\xb2\\x9c\\x49\\xdd\\x9f\\x91\\x2d\\x62\\x4b\\xe9\\x64\\x19\\x97\\x95\\x0f\\x38\\x6c\\xb5\\x81\\x29\\xcb\\x4e\\x23\\xf6\\x69\\xe2\\x2b\\x60\\xb9\\x2e\\x52\\x28\\x40\\x56\\xc5\\x0d\\xac\\x2a\\xe7\\xb2\\x71\\x8a\\x69\\x9f\\xfb\\x53\\xa5\\x56\\x92\\x78\\x5e\\xa0\\x0d\\x1f\\xab\\xf4\\x2f\\x8e\\x95\\x0d\\x4e\\x04\\x76\\xc9\\xea\\x8d\\x03\\x6f\\xc9\\x93\\xc1\\x0f\\x99\\x78\\xed\\x20\\xbc\\xb8\\x4f\\xf4\\xea\\x9f\\xa6\\xb7\\x31\\xea\\x42\\x46\\xcc\\xb7\\xb7\\x5a\\x21\\xed\\xe4\\x1f\\x75\\x85\\xc3\\x75\\x1d\\x8b\\x99\\xcb\\x88\\x8a\\xfb\\xd2\\x97\\xad\\xe9\\x7b\\xbb\\xb4\\x75\\x53\\xa7\\xdc\\xaa\\x0c\\x81\\x19\\xb3\\x0f\\x8d\\xe5\\x7c\\x84\\xd8\\xf8\\x4c\\x9d\\xd9\\xd2\\x26\\x3f\\x8b\\x94\\xfb\\xc3\\x24\\x8a\\xfa\\xcd\\x48\\x39\\x08\\xe8\\xbe\\x4b\\xf3\\x7a\\x3a\\xae\\x5a\\xb8\\xbd\\x62\\x31\\x42\\xcc\\xc2\\x1c\\x9c\\xf8\\x2e\\xaa\\x96\\xca\\xc5\\x8f\\xbc\\x4d\\x0c\\xef\\x2f\\x95\\x8c\\x8d\\xdf\\xa8\\xa8\\x8c\\x28\\x9e\\xca\\x32\\x2d\\xaf\\x91\\x05\\x33\\xd0\\xc5\\x6e\\xb1\\x37\\x96\\xf0\\x7f\\x69\\x74\\x09\\x49\\x7c\\x4b\\x7f\\x79\\x5a\\xa2\\xb9\\xf1\\x15\\xd5\\x17\\x4e\\xa3\\xe0\\xb0\\x2e\\x26\\x85\\xd4\\x64\\x8d\\xd8\\xf1\\xd4\\xa4\\x65\\xd5\\xd2\\x3e\\x73\\x09\\x96\\x9b\\x89\\xd3\\xe3\\x73\\xb8\\xac\\x94\\x23\\x2d\\xa3\\x6e\\xd1\\x61\\xec\\xfd\\x47\\x4d\\x6e\\x3f\\x8e\\x02\\xf1\\xf3\\xb7\\x17\\x19\\x04\\xd3\\x55\\x0f\\xd8\\xd2\\xf8\\x40\\x86\\x66\\x7f\\x17\\x9a\\xbb\\x3a\\x68\\xcb\\xe0\\x08\\xbb\\xc3\\xe2\\x58\\xce\\xbf\\x15\\x69\\x77\\xf1\\x46\\x28\\x61\\xed\\x54\\x98\\xf9\\x02\\x20\\xf8\\x21\\xba\\xe8\\x9f\\x8e\\x14\\xc1\\x78\\xe8\\x18\\x0f\\x1f\\x86\\x43\\xf9\\x56\\x22\\x76\\x53\\xb8\\xab\\xe1\\xa8\\xb6\\x45\\x98\\x5b\\x80\\xc2\\x23\\xec\\xaf\\xc6\\xcf\\x13\\x47\\xda\\x4e\\x5e\\x04\\xa7\\x56\\xe4\\x53\\x2d\\xef\\x89\\x1e\\xc5\\x5f\\xf3\\x3b\\x8d\\x0f\\x41\\x81\\x44\\xb6\\x44\\x2f\\x16\\xc3\\x33\\x34\\x3c\\x3c\\x01\\x79\\x09\\x35\\x78\\x6d\\x22\\x12\\x59\\x7c\\xb9\\x42\\x0c\\x9e\\xe3\\x05\\x81\\x0f\\xa2\\x9d\\x68\\x07\\x0b\\x9f\\xe0\\x55\\x2a\\x58\\xcf\\x6c\\x9f\\x86\\x5a\\x4d\\xfd\\x33\\x62\\x89\\x5e\\x7b\\x97\\x5a\\x24\\xd3\\xd5\\xcd\\x40\\x9d\\x12\\x8f\\x6c\\x8c\\x6a\\x69\\x29\\xc5\\x72\\xa2\\x9e\\x50\\x20\\xcc\\x4a\\x22\\xf6\\x76\\xe5\\x8b\\xc3\\xb5\\x07\\x19\\x82\\xca\\xc0\\x77\\x9a\\xe2\\x54\\x6a\\x38\\xdb\\xef\\xaf\\xdf\\x47\\x99\\xf0\\x28\\xc9\\x9e\\x15\\xa5\\x2c\\xec\\x24\\x52\\x23\\x0e\\xbf\\xc9\\xcd\\x1a\\xe4\\xc2\\x88\\x70\\x89\\x0a\\x66\\xe1\\x82\\x49\\xf2\\x48\\x8f\\x8b\\x1b\\x0f\\xef\\x45\\x35\\xef\\xec\\x83\\xe0\\xcf\\x21\\xfe\\x99\\xc7\\xa9\\x98\\xc5\\x29\\xe0\\xb2\\x96\\x91\\x4c\\xe8\\xdc\\xc5\\xf3\\x23\\xbb\\x12\\x83\\x63\\x2e\\x97\\x2d\\x17\\x08\\x92\\x51\\xf9\\x54\\x9e\\xcf\\x0f\\xa4\\x4d\\x6f\\x9c\\x4f\\x01\\x02\\x06\\xc2\\x13\\x84\\x31\\x1c\\x4b\\x27\\xb2\\x89\\x6f\\xca\\x52\\x49\\x43\\x51\\xef\\xfb\\x21\\x27\\xbd\\x4d\\x6e\\x57\\x19\\xb5\\xf1\\x0e\\x47\\x32\\xbb\\x0a\\xa1\\x59\\x3d\\x0b\\x18\\xc2\\xfe\\x69\\x59\\x86\\x45\\xf7\\xa7\\x7d\\x8f\\x1b\\x4e\\xf1\\x1c\\xe2\\xc2\\xd7\\xe8\\xa8\\x78\\x34\\x1f\\x8e\\xdb\\xfb\\x81\\xb6\\xdb\\x83\\xad\\xc3\\xfd\\x1e\\x47\\x42\\x29\\xee\\xd9\\x20\\x94\\xa2\\xbf\\xdb\\x79\\xc4\\x0a\\xe6\\x1e\\x55\\x29\\x78\\xdb\\x4d\\x91\\x74\\x12\\xfd\\x13\\x48\\x4b\\x67\\xb1\\x96\\x0a\\x80\\x29\\x8f\\x4a\\xda\\x3d\\xb3\\x44\\xe8\\xce\\x3e\\xe6\\xac\\x44\\x39\\x4e\\x27\\xb7\\xb1\\xbc\\xc6\\x33\\x0b\\xb3\\xd4\\xae\\x7c\\x87\\x00\\x82\\xe7\\x50\\x71\\xa1\\x52\\xdd\\x37\\x05\\x81\\x32\\x2c\\x93\\xaf\\x57\\xf3\\x2e\\x10\\x12\\x12\\x5f\\xbe\\x6a\\xae\\x25\\xa4\\x69\\xea\\x14\\x00\\x8d\\x9c\\xe3\\xc6\\xe8\\x9e\\x11\\x72\\xdd\\xba\\xfb\\x86\\x1d\\x62\\x91\\x46\\x2e\\x8f\\x65\\xd3\\x5b\\x52\\x50\\x18\\xb3\\xbd\\xdc\\x56\\x58\\xd3\\x52\\xd9\\x78\\x68\\x93\\x15\\xfd\\x3d\\xe2\\xf4\\x9d\\x45\\x0d\\x86\\xf4\\xdd\\xb4\\x39\\x7c\\xd4\\xb2\\x5a\\xf0\\xd8\\x02\\xd1\\xe7\\xbf\\x12\\x74\\x20\\x8b\\x50\\x17\\x2a\\x24\\x61\\xb3\\x71\\x7d\\x2d\\x16\\x1a\\xb7\\x42\\xdb\\xd9\\x9e\\xb7\\xf8\\xc4\\xbe\\xc4\\xe2\\x9b\\x49\\x88\\xc4\\xfd\\xee\\xa3\\xa9\\x2b\\xa2\\x0e\\xc8\\x35\\x75\\xf7\\x06\\x73\\x05\\x1f\\x49\\x9a\\xc3\\xf1\\xa3\\x0e\\x15\\x9b\\xb0\\x98\\x38\\x5e\\xa5\\xf7\\x6c\\xa5\\xe2\\x21\\xd3\\x6f\\x06\\xb7\\x68\\xd4\\x57\\x58\\xca\\xe7\\x14\\xf7\\x23\\x42\\xa0\\x6e\\x83\\xc8\\xc8\\x36\\xb6\\x5d\\xf5\\x42\\xfa\\xb3\\x16\\xbe\\x71\\x67\\x73\\x67\\x24\\xd1\\xaf\\x7d\\x4f\\xcf\\xe1\\x0f\\x0e\\x8f\\x98\\xe2\\xf7\\x89\\xef\\x1c\\x4e\\x39\\xca\\x91\\x9b\\x0e\\x64\\xed\\x57\\x0e\\x76\\x45\\xe4\\xa1\\x8d\\xf6\\x22\\x23\\x17\\x8c\\x54\\x56\\x1c\\xbb\\x2f\\x94\\xf8\\xec\\xe5\\x73\\xcf\\x05\\x63\\xd3\\x8b\\x93\\xf3\\x34\\x4c\\x56\\x46\\x91\\xc9\\xb4\\xb5\\x1f\\x31\\x77\\x9b\\x7f\\x9d\\xe2\\x89\\xcd\\x8d\\x01\\x56\\xeb\\x95\\xaf\\x5f\\x53\\x29\\x32\\x35\\x89\\xbd\\xa9\\xe4\\x94\\xca\\xee\\xa3\\xf5\\xb6\\x04\\x4e\\x3e\\x80\\x23\\x41\\x63\\xe5\\x24\\xe8\\xe8\\x8a\\x34\\x62\\x5b\\x9e\\x15\\x18\\x75\\x0c\\x72\\xb7\\x65\\x8d\\x85\\x55\\xd0\\xb8\\x71\\x3c\\xe8\\xd5\\xc7\\xc3\\xac\\xf8\\x42\\x1e\\xc1\\x8d\\x25\\x0b\\xde\\x05\\x88\\x3e\\xfd\\x91\\x54\\x94\\x22\\xe1\\x97\\xbe\\x88\\xa6\\xcb\\xd6\\x17\\x33\\xb3\\x4d\\xef\\x5f\\x73\\x3a\\x41\\x9f\\x31\\x2d\\x0d\\x7c\\x1f\\x4b\\x74\\xde\\xa4\\x4a\\xe3\\xbd\\xd8\\x54\\x3d\\xe6\\x22\\x7e\\x54\\xe0\\x75\\xa9\\x52\\x53\\xdc\\x43\\x12\\x1c\\x15\\x39\\xe5\\x16\\x3a\\x39\\x70\\xd8\\xd7\\x02\\x33\\x09\\x3a\\x53\\x86\\x68\\xfa\\x42\\x5a\\x56\\xe2\\xd5\\x33\\x1d\\x55\\x1b\\x47\\x78\\x9d\\x60\\x89\\x05\\xca\\x50\\x62\\x8e\\xdd\\x30\\x24\\xb6\\x86\\xa5\\xeb\\xb9\\xaa\\x53\\xb7\\x85\\x4f\\xb7\\x22\\x40\\xa5\\x3e\\x33\\x38\\x11\\xf9\\x8c\\xd7\\x4b\\xa6\\x58\\x75\\x7d\\x34\\x6a\\x29\\x7e\\x2d\\x61\\xa2\\xf3\\x1a\\xec\\x05\\x6f\\x82\\x7d\\x8d\\xc2\\x86\\x73\\x04\\x0b\\x9b\\x81\\xcc\\xa6\\x7d\\x2e\\x65\\x75\\x16\\xb5\\x62\\x94\\xd0\\x16\\x06\\x44\\xcd\\x58\\xea\\x5f\\x54\\x85\\x9c\\x89\\x2a\\x0a\\x27\\x00\\xa8\\x18\\xd7\\x46\\x76\\x45\\x2d\\xe5\\xa6\\x06\\x5e\\xca\\x60\\xa5\\x8a\\xfc\\x08\\x49\\x70\\x45\\x50\\xd4\\xd6\\xa2\\xa7\\x6f\\x5f\\xb8\\x71\\x39\\xc2\\x5a\\x8e\\x4a\\x26\\x58\\xa2\\x41\\xe7\\xe1\\xd3\\x9a\\x2d\\x44\\x06\\xff\\x60\\xcb\\x7f\\x97\\x2c\\xc7\\x09\\x47\\xfb\\x68\\x2a\\xdb\\xcf\\xd9\\x7f\\x64\\x01\\xac\\x71\\xbe\\xb0\\x3b\\x23\\xba\\xb3\\x42\\x26\\xeb\\x52\\xdd\\xd4\\x84\\x96\\xad\\x9a\\x77\\x25\\x9e\\x71\\xd5\\x4e\\xe9\\x56\\x5f\\x1b\\x52\\x7e\\xb1\\x93\\x35\\x5f\\x09\\x31\\xcd\\x67\\xc6\\xf5\\xcc\\xb3\\xd3\\x44\\x7b\\xa7\\x7a\\x3c\\xe8\\x2a\\x38\\xe4\\x4e\\xe5\\xf9\\x86\\x44\\xe1\\xa7\\x15\\x7e\\xf1\\x0c\\x1d\\x85\\xa4\\xb3\\x31\\xa5\\x8f\\xa0\\x86\\x53\\x4e\\x8b\\x46\\x89\\xf5\\xa5\\x4f\\xd9\\x21\\x1c\\x1b\\x72\\x7c\\xf4\\x63\\x25\\x6a\\x11\\x27\\x61\\x01\\xdf\\x15\\xdf\\x53\\x75\\xae\\x08\\xbb\\x6d\\x04\\x06\\x0d\\xb1\\x9f\\x7a\\x93\\x72\\xea\\x65\\x2a\\x9b\\x41\\x06\\xbd\\xbb\\x9e\\x5b\\x9f\\x5e\\x80\\x0d\\x46\\xae\\xbe\\x39\\xda\\x89\\xc5\\x82\\x82\\xd8\\xa5\\x1d\\x3d\\x3a\\xa5\\xec\\x88\\x47\\x6e\\x81\\x0b\\xcc\\x65\\xd7\\xda\\xf9\\xca\\x22\\xeb\\x2b\\x38\\x8d\\x23\\x49\\x67\\xf0\\x02\\x23\\xeb\\xc0\\x84\\xf1\\x33\\xd7\\x2d\\xe9\\x75\\xe8\\x9c\\xc8\\x58\\x39\\xda\\xff\\xe3\\x2d\\x98\\x76\\xa9\\x01\\x91\\x45\\x52\\x84\\x0c\\x91\\x5d\\xe8\\xb3\\xd2\\x5e\\xec\\x99\\x14\\xbb\\x17\\xb6\\xcc\\xb8\\x04\\x52\\x0d\\x6e\\xd5\\x5a\\xb5\\x54\\xc0\\xa6\\xf4\\x6d\\xb5\\xd4\\xf8\\x6b\\x1e\\xa3\\xd5\\x6a\\x70\\x25\\x80\\x86\\x60\\xe1\\xca\\x0a\\x8e\\x7a\\x70\\x01\\x27\\xc5\\xb2\\x27\\x29\\xaa\\x8e\\x74\\x5a\\x0d\\x39\\xe6\\xa3\\x49\\xd7\\xc6\\x5f\\x72\\x8f\\xaa\\x8a\\x88\\x96\\x65\\xf6\\x19\\xf2\\x20\\x30\\x58\\xe0\\xc0\\x94\\x7f\\x15\\xd3\\x4d\\x31\\x9c\\x8c\\xa4\\x26\\x8f\\x96\\xc0\\x99\\x78\\x28\\xe9\\x38\\x76\\xc5\\xe2\\x36\\xa3\\x0d\\xa7\\x19\\x8a\\x72\\x64\\x77\\x4b\\x1d\\xf4\\x43\\x34\\x99\\x0d\\xbc\\x53\\xcc\\x57\\xce\\x0b\\x37\\xd7\\x31\\x61\\x7a\\xf7\\x5e\\x97\\x91\\xb7\\xb3\\x43\\xee\\x06\\x58\\x43\\xc2\\xdf\\x44\\xa1\\xea\\x89\\x1d\\xa2\\xe9\\x81\\xd9\\xf1\\xe2\\x3c\\x83\\xe9\\x2c\\xa3\\x85\\x9b\\x8d\\x7a\\xa1\\x6f\\x7e\\xfc\\xce\\x39\\x52\\x9d\\x93\\x30\\xb9\\xd1\\x99\\x49\\xa6\\xe8\\x63\\x7d\\x10\\xa7\\x27\\xcc\\x8a\\x79\\x26\\x29\\x9a\\x23\\xbc\\xde\\x35\\x59\\xf1\\x01\\x26\\x3e\\xae\\x71\\xec\\x36\\x6f\\x41\\xc2\\xa1\\x04\\x1c\\x17\\x76\\x47\\xf5\\xbe\\x37\\x55\\xd4\\xeb\\xe9\\xa3\\x1d\\x37\\xbd\\x18\\x77\\x9b\\x70\\x25\\x49\\x3c\\xc3\\xc4\\x01\\xd9\\x99\\x15\\x7c\\xb5\\xc0\\x97\\x64\\xcb\\x49\\xfe\\x29\\x92\\xa8\\xc9\\x70\\xdc\\x8e\\x0b\\x79\\xf4\\xf2\\xe4\\x97\\xec\\xe3\\xd6\\x65\\x45\\xf4\\x23\\x9d\\x67\\x9b\\xdd\\x30\\xd7\\x4a\\xe2\\x53\\x39\\xe4\\xf8\\x37\\x83\\x74\\x34\\x82\\x22\\x68\\x30\\xe7\\xcc\\x7c\\x35\\x13\\x89\\x56\\x92\\x1b\\xd2\\x88\\xb0\\x66\\x06\\x7a\\xcd\\x89\\xc2\\xf7\\x03\\xab\\x36\\x64\\x38\\xf9\\x69\\x2e\\xb0\\x94\\xe7\\x2f\\xe4\\xb5\\x7f\\xc5\\x7c\\x11\\x41\\xe2\\xbf\\xd0\\x8c\\xa5\\x16\\xa1\\xfb\\x8f\\xd0\\x2d\\x4e\\x1e\\x9d\\xc4\\x50\\xef\\xa0\\x82\\xbf\\xa6\\xda\\x56\\xc8\\x2a\\xd4\\x6c\\x3f\\x50\\x65\\xb2\\xc1\\x55\\x67\\xfd\\x9c\\x21\\x17\\xa0\\xe0\\xbe\\x4f\\xfd\\x05\\x9b\\x6e\\x80\\x90\\x74\\xd8\\x82\\xac\\x8b\\x50\\x74\\xd2\\xbf\\x98\\x9e\\x22\\xc9\\xb9\\x98\\x44\\x15\\x01\\x07\\x7f\\x2b\\x4c\\x5e\\xac\\xcb\\x91\\xff\\x13\\x7c\\xe7\\x0e\\x61\\x6f\\x96\\x1a\\x41\\x1c\\xf9\\x12\\x92\\x72\\xbf\\xc5\\xec\\xfc\\x8f\\x6d\\x3c\\xe6\\xcb\\xf7\\x2b\\x24\\xe5\\x30\\xa2\\xa6\\x12\\x46\\x12\\x9d\\x2e\\x72\\x3a\\x33\\x37\\xfa\\x61\\xf7\\x84\\x4c\\x4b\\xe8\\x07\\x1b\\xf0\\x11\\x0c\\xa7\\x1f\\xe8\\x6a\\xaf\\x98\\xcb\\x4a\\xa9\\x0e\\xfe\\xe2\\x71\\x36\\x19\\x13\\xca\\x01\\x18\\x0e\\x11\\xef\\xff\\x01\\xd7\\x4b\\x4a\\xe2\\xa6\\x31\\xb7\\xc1\\x83\\x78\\x1f\\xbc\\x35\\x1e\\xaa\\x9b\\x4d\\x70\\x01\\xa3\\x86\\x95\\xf1\\xfb\\x10\\x8d\\xef\\x9f\\xeb\\xfb\\x7a\\x59\\xf8\\x1b\\xd2\\x58\\x5b\\xae\\x71\\xe9\\xde\\x77\\xba\\x44\\xfb\\xe5\\xf6\\x05\\x09\\xee\\x77\\xc2\\x22\\xf4\\x1f\\x68\\x7b\\xa4\\xd1\\x3e\\x49\\xb0\\x70\\x68\\xba\\x25\\x01\\x93\\xd1\\xae\\xbe\\xb4\\x8e\\xfe\\x80\\xd4\\x03\\x9d\\x11\\xb0\\x9c\\xf8\\x79\\x5c\\x63\\x52\\xd4\\xa5\\x99\\x19\\x0a\\x17\\xf1\\xce\\x08\\x82\\x49\\x98\\x1c\\x4c\\x81\\x43\\x81\\x83\\x97\\x86\\xd7\\x15\\x62\\x91\\x7f\\x85\\x4a\\xae\\x40\\x4c\\x84\\xca\\x52\\xbb\\x37\\xb1\\x40\\x8b\\xb9\\x22\\x38\\x9f\\xc7\\x98\\x1c\\x14\\x42\\x33\\x36\\xb5\\xac\\x73\\x32\\x69\\xf3\\x52\\x37\\xde\\x80\\x1c\\x3a\\x86\\x09\\x7b\\x83\\xfa\\x8c\\x67\\x83\\xc9\\x16\\x8b\\x19\\x0b\\x49\\x83\\x83\\xa1\\x6f\\xa5\\x97\\x94\\xcb\\x05\\xdc\\x8c\\x0d\\x51\\xb8\\x1c\\x08\\xb0\\xd2\\x51\\x6f\\xda\\xf8\\xb4\\xc4\\xc4\\x45\\x8a\\xa1\\x5a\\x21\\x95\\xaa\\xdf\\x57\\x1f\\xda\\xcb\\x24\\x96\\xb2\\x86\\xaf\\x17\\x55\\xe0\\xc9\\x48\\xb1\\x63\\x5c\\xbc\\x43\\x71\\x4e\\x4f\\x79\\x5d\\x45\\xf6\\x7e\\xb9\\xde\\xd1\\x94\\x15\\xfd\\xe2\\xd8\\x5d\\x20\\x13\\x2c\\x72\\x44\\xb4\\x28\\x2b\\xfa\\x0a\\x59\\x84\\x54\\x86\\x46\\xa8\\x30\\x74\\xa0\\x23\\xc8\\x3c\\x7d\\x91\\xf4\\xb8\\x65\\x6e\\x62\\x75\\x00\\x3f\\xfd\\x07\\xbb\\x1c\\x25\\x99\\x52\\x54\\x36\\xdf\\x2d\\x05\\x7d\\xf6\\xe5\\x74\\x85\\x6e\\x5d\\x70\\x84\\x60\\x68\\xff\\xad\\x7b\\xa8\\xd7\\x91\\xde\\x84\\x4d\\x42\\x4c\\x29\\xa5\\xed\\xfc\\xed\\x13\\x1a\\x39\\xc7\\x46\\x60\\xf4\\x1d\\x48\\x38\\x21\\x01\\xf3\\x8e\\xb6\\x7e\\x8a\\x83\\x74\\x48\\x97\\x28\\x0f\\x18\\x20\\xce\\x9d\\xe7\\xa3\\x56\\x44\\x46\\xa6\\xc2\\x2b\\x4a\\xa2\\x52\\x16\\x86\\x1a\\xd1\\xc6\\x79\\x52\\xa3\\x54\\xa4\\x96\\xd7\\x4b\\x89\\x08\\x3a\\x5f\\xd0\\x39\\xf4\\xeb\\x5d\\x4c\\x61\\x28\\x52\\x77\\x2a\\xd2\\x69\\x6d\\x49\\x8c\\xad\\xb6\\x3c\\x06\\x64\\x7e\\xdb\\x60\\x0d\\x6e\\x2a\\xe1\\xb7\\x10\\xc8\\xf9\\xbf\\x2d\\xe2\\xc0\\xfe\\xd0\\xa7\\xf4\\xc4\\x29\\x41\\x88\\xe6\\x46\\x82\\x8d\\x5d\\x54\\xce\\xfe\\x93\\xcb\\xab\\x88\\x11\\xac\\xc8\\x72\\x85\\xbe\\xcd\\x2d\\x26\\x85\\x72\\xbc\\x75\\x9d\\x6c\\xed\\x7d\\xfb\\x89\\xe3\\x12\\x5f\\x86\\xc2\\xfc\\xaa\\x80\\x6a\\xd8\\xa4\\xd1\\x80\\x14\\xbb\\x43\\xd6\\x2c\\x0c\\xb0\\xd5\\xc0\\xcf\\x6a\\x85\\xbf\\xd5\\xda\\x5d\\x42\\x0e\\xf0\\xcb\\x0c\\x74\\x13\\x0f\\x7e\\xc4\\xca\\x53\\x31\\x5e\\x30\\xa8\\x71\\x9e\\x20\\xd4\\x8c\\x5b\\x3d\\x70\\xdd\\x9e\\x0f\\x85\\x9b\\x35\\xbe\\xab\\x9c\\xe1\\x79\\x60\\x54\\x66\\x39\\x17\\x97\\xec\\x21\\xab\\x2b\\x4d\\xee\\x4b\\x98\\x3f\\x43\\x58\\x2a\\x4c\\x9e\\x4d\\x9f\\x4e\\x87\\x34\\x0e\\xc6\\xf1\\xfb\\x6b\\x9f\\x48\\x9d\\x0c\\xaa\\x15\\x0f\\xa7\\xdd\\xdb\\xf3\\xa3\\x7f\\x3d\\x17\\xc4\\x0e\\x66\\x53\\x57\\x0b\\x7e\\xd5\\x2b\\x5d\\xef\\xf9\\x79\\x7c\\x86\\xc6\\x6a\\xd8\\x57\\x08\\x06\\x85\\xf8\\x8f\\x50\\x40\\xfd\\xe5\\xc9\\x49\\x52\\x0b\\xf3\\x9d\\x3d\\x94\\x79\\x6f\\xb8\\xbc\\xca\\x39\\xd6\\xb5\\x19\\xac\\x02\\x86\\xae\\xa6\\xcb\\xe9\\x86\\x50\\x23\\x21\\x5d\\x5a\\xb0\\x13\\x63\\x9d\\x31\\x50\\xae\\x96\\xba\\xcb\\xd5\\xb1\\x88\\x55\\x22\\x59\\xb2\\x63\\x48\\x73\\xb1\\xe8\\xbb\\xa7\\x7d\\x76\\x91\\xa4\\x4c\\xac\\x97\\x2d\\xe0\\x04\\x62\\x49\\x71\\xb1\\xd1\\x4c\\x3b\\x8c\\x52\\x23\\xf4\\x01\\xf9\\x4a\\xd1\\xb6\\xde\\x20\\x89\\xf7\\x72\\x1c\\x86\\x0d\\x00\\xa6\\x72\\xa3\\x8c\\x4d\\xf4\\xf0\\x30\\x96\\x47\\xf5\\x2c\\xa0\\x89\\x6d\\xca\\x89\\x1d\\x36\\x1d\\x5d\\xe5\\x39\\x38\\x5f\\x28\\x58\\x30\\x33\\x0f\\x9c\\x19\\xeb\\xb3\\x91\\x05\\x1a\\x46\\xc8\\xa3\\xec\\x30\\x4e\\x23\\x8a\\xc6\\x27\\x22\\xee\\x39\\xb6\\x78\\x37\\x0d\\xa9\\x67\\x88\\xbe\\x2e\\x60\\xc0\\x8b\\x24\\x1f\\x9f\\x0c\\x1e\\xff\\x23\\xa8\\xd0\\x4a\\x9a\\xbc\\x62\\x4f\\x97\\x4e\\x24\\x21\\x79\\x6d\\x98\\x06\\xbf\\x8f\\x8e\\xfe\\x04\\x47\\x74\\x48\\x82\\x40\\xa5\\xce\\xd5\\xeb\\x36\\xb2\\x6f\\x7c\\x6e\\x26\\x73\\x60\\x21\\x01\\x8a\\x21\\x33\\x3f\\xb9\\x4a\\x02\\x64\\x92\\x0a\\x9b\\x5b\\xba\\x15\\x19\\xc1\\xaa\\xbe\\x9a\\x4a\\xb0\\x60\\xd2\\x13\\x9a\\x33\\x4e\\x5d\\x82\\xdf\\x0d\\xe4\\x12\\x42\\x33\\xd6\\xa5\\x88\\x67\\x73\\x26\\x9d\\xec\\x3d\\x12\\xb6\\xe5\\xf0\\x34\\xd6\\x46\\x90\\x98\\x6f\\x26\\x86\\xfb\\x57\\xe3\\x1e\\x5f\\x12\\x92\\xad\\x17\\x36\\x29\\x3e\\x98\\x97\\xa6\\xfd\\xa0\\x6f\\xc3\\x3f\\xe2\\xd9\\x8c\\xa1\\x76\\x19\\x7e\\x9f\\x0d\\x36\\x81\\x49\\xa8\\x85\\x36\\x1d\\x48\\x7b\\x6b\\x37\\xe4\\x2c\\xea\\x3e\\x93\\x8c\\x6a\\x79\\x3c\\x0c\\xc0\\xc3\\x41\\xd7\\xc7\\x2d\\xfe\\xde\\x57\\xa7\\xa8\\x9b\\x5e\\xed\\xd8\\xb0\\xe4\\xeb\\x91\\x6a\\xec\\x8d\\x95\\x1d\\x99\\xf6\\x74\\x22\\xb1\\x7f\\x2e\\xa6\\xdb\\xa4\\x97\\x0d\\xbe\\x82\\x74\\x64\\x15\\x11\\x72\\x88\\x64\\x67\\x57\\x92\\x1d\\x64\\x95\\x84\\x22\\x97\\xc2\\x51\\x6b\\xb5\\xc5\\x0f\\x33\\x01\\x63\\x80\\x7b\\xd1\\xc5\\x4c\\x98\\xfb\\x1b\\xc4\\xdf\\x9c\\x25\\x18\\xae\\x75\\xf7\\x2f\\xc1\\x76\\xf3\\x28\\xf0\\xb9\\x76\\xae\\x3c\\xe7\\xf3\\xe1\\x98\\x1e\\x42\\x97\\xe0\\xde\\x1b\\x03\\xcc\\xcb\\x8d\\x48\\x79\\x4c\\xde\\x06\\xef\\x19\\xae\\x79\\x4e\\xf4\\xbd\\x50\\x8e\\x16\\x43\\x58\\x59\\x10\\x16\\xa6\\x39\\xe1\\x1c\\x4b\\xeb\\xf4\\xc3\\x65\\xa8\\x35\\x9d\\x27\\x7a\\xaf\\x6d\\x3d\\xc4\\xf7\\xf0\\x71\\xe1\\xa1\\x06\\xda\\x1a\\xdf\\x57\\x6f\\x74\\xa8\\xac\\xe4\\x1c\\x16\\x3e\\xfd\\x1b\\x09\\xa6\\x4c\\x09\\xdf\\x0a\\x7d\\xbd\\x8e\\x63\\x28\\xed\\x5f\\x4a\\x3e\\x43\\x5a\\x7c\\xae\\xe5\\xba\\x07\\x8a\\xa7\\x5b\\x0e\\xa6\\x5d\\x4c\\x79\\x9b\\xc7\\xa8\\x20\\xbf\\x67\\x62\\x57\\x51\\xa1\\x3a\\x2a\\x79\\x5a\\x61\\xe1\\x1a\\x30\\xab\\x21\\x28\\x8b\\xf0\\xc7\\x62\\x61\\x6f\\x60\\x8f\\xfc\\x33\\x59\\xaf\\x96\\xd1\\x76\\x74\\x5e\\x26\\xa4\\x54\\x77\\xc7\\xdf\\x30\\x77\\x37\\x66\\xa8\\x4e\\x3a\\x09\\xd6\\x00\\x87\\xf8\\xc7\\x54\\xfd\\xe7\\xbd\\x1d\\x5c\\x7c\\xdd\\x90\\xce\\xb2\\x64\\x8f\\x6b\\x56\\x30\\xdb\\x5c\\x2a\\x58\\x86\\xad\\xe2\\xaf\\xf8\\xa1\\xa8\\xdc\\x4c\\x49\\xb0\\xe8\\xa3\\x09\\xb3\\x3d\\x1d\\x68\\x9c\\x0e\\x97\\x7d\\x94\\xb8\\xad\\xf4\\x3a\\x66\\x2b\\x74\\xa7\\x3f\\x5f\\x15\\x81\\x38\\xeb\\x75\\xae\\x0e\\x4e\\x45\\xf2\\x9e\\x0c\\x46\\xb4\\x0c\\xeb\\xca\\x74\\xee\\x82\\x82\\xbc\\x1f\\x12\\x01\\x38\\x4a\\xb0\\x93\\xd3\\x30\\xff\\x25\\x9b\\x22\\x3b\\x32\\x1c\\xdd\\xee\\xf1\\xaa\\x57\\x16\\xba\\x5d\\xa0\\xad\\xc6\\x55\\xa2\\x0e\\x86\\x3f\\x8a\\x8d\\x12\\x6f\\x85\\x0f\\x30\\x73\\x7f\\x31\\x30\\xd7\\xaf\\x9b\\x07\\x17\\x7b\\x13\\x85\\x37\\x62\\x8a\\x69\\x15\\xb8\\x00\\xef\\x0a\\xac\\x36\\x83\\x83\\xa2\\x25\\x4a\\xca\\x2d\\x2e\\xbf\\x33\\xd9\\x19\\xb5\\xce\\x4a\\x7e\\xe8\\x81\\x6b\\xb2\\xff\\x6d\\xa9\\xe2\\x56\\xd3\\x8e\\xbf\\x99\\x3e\\xb8\\xf1\\x26\\x77\\xe2\\x25\\xbb\\x6a\\x43\\x38\\xa7\\x05\\x52\\x74\\x96\\x48\\x71\\xd1\\x5e\\x4e\\x76\\x2e\\xa6\\x90\\x2e\\x27\\x8a\\x37\\xf3\\x10\\x5e\\xc9\\xdc\\xa3\\x55\\x62\\x66\\x5e\\xff\\x20\\x83\\x78\\xa0\\x37\\x14\\xef\\x79\\x14\\x62\\x57\\x0f\\x5d\\x3f\\x05\\x8b\\xca\\x3c\\x7b\\x72\\x50\\x98\\xd7\\xbe\\x2f\\x72\\xfc\\x9e\\xa7\\xc0\\x24\\x43\\x7e\\x10\\x21\\xa6\\xb6\\xeb\\xcc\\x8a\\x51\\x2c\\xfb\\x13\\xac\\x58\\xbb\\x90\\x3b\\x25\\x83\\x81\\x79\\xd2\\x30\\xb9\\xad\\x3f\\x90\\x4e\\xad\\x9d\\x74\\xa3\\xd3\\x99\\x4c\\xef\\x03\\xa8\\xa9\\xac\\xcf\\x0d\\xc3\\x0e\\x7a\\x74\\x31\\x9a\\xa3\\x94\\xda\\xfe\\xc2\\x1f\\x8b\\xe3\\x3e\\x8b\\x0a\\x28\\xd4\\x0d\\x63\\xc0\\x31\\x73\\xc1\\x5a\\xff\\x93\\x93\\x2c\\xd6\\x0b\\xf5\\xbd\\x92\\xf6\\x88\\x03\\xe9\\x29\\xb6\\x45\\x6e\\x32\\x77\\x16\\xe3\\x43\\xad\\xf8\\x5b\\x9f\\x72\\x48\\xb2\\xaf\\xf8\\x03\\x61\\xa3\\x50\\x50\\x11\\xf6\\x09\\x3c\\x02\\x39\\x7b\\xec\\x08\\x37\\x6d\\xa6\\xb8\\xe2\\x66\\x2a\\x8d\\x68\\x7e\\x75\\x53\\xe8\\x32\\x24\\x99\\xc8\\x2d\\x47\\x05\\xcb\\x08\\x24\\xd9\\x3f\\xa4\\x97\\x8a\\x2c\\x8e\\x41\\x41\\x8c\\x65\\x88\\x3d\\x22\\xba\\xa6\\x86\\xcc\\x7f\\x21\\x28\\xc3\\x7c\\x20\\x63\\xa7\\x03\\x9b\\x70\\x87\\x18\\x1a\\x82\\xa7\\xf6\\x9b\\x6a\\x09\\xd8\\x0b\\x4f\\xf0\\x6f\\xed\\x23\\x3d\\x72\\xf3\\xae\\x43\\x5f\\x4e\\x94\\xf3\\x4c\\x17\\x6d\\x2a\\x6e\\xe1\\xd4\\x7d\\x0b\\xe9\\x2d\\x65\\xed\\xeb\\x79\\x54\\x2b\\x3b\\x6b\\x40\\xb7\\xa9\\xb8\\x11\\x50\\x31\\x81\\x3e\\xbe\\xc1\\xa0\\x71\\xfd\\xce\\xcb\\xc4\\x54\\x4d\\x4b\\xf6\\x3d\\xc3\\x3a\\xc5\\x12\\x6d\\x91\\xde\\x90\\xe7\\xf4\\xab\\xa2\\xb4\\x92\\x7b\\x95\\x81\\xc2\\x2b\\xe6\\x1c\\x8f\\xb1\\x1a\\x3f\\xf1\\x6a\\x28\\x85\\x0b\\xc2\\xcb\\x23\\x0d\\x9c\\xbb\\x3f\\x22\\x2c\\x52\\xef\\x54\\xd6\\x94\\xad\\xc9\\x5e\\x1b\\xa3\\x28\\xa7\\x5b\\x34\\xfb\\x6b\\xcf\\x1b\\x88\\xfa\\xd7\\xe0\\x7d\\xdd\\xbb\\xe9\\xd4\\xb7\\x3a\\x33\\x0f\\xd8\\xcf\\x37\\xa7\\xf6\\x53\\x72\\xa6\\x10\\xb6\\xee\\xc6\\x7d\\x87\\x84\\x8e\\x27\\xc3\\x83\\x0c\\x57\\xb3\\xc1\\x94\\xe3\\xfc\\x6f\\xbf\\x11\\x30\\xb5\\x52\\xb4\\x84\\x6a\\xf1\\x30\\xb5\\xe3\\x05\\x96\\xfe\\x9a\\x28\\xf7\\x16\\xe9\\x94\\xaa\\xe0\\x0b\\xbe\\xce\\x0a\\x5d\\xd7\\xf0\\x70\\x35\\x43\\xd5\\xf5\\xd7\\x24\\x0f\\x19\\x73\\x55\\x07\\x51\\x23\\x2c\\xa4\\x4a\\x9d\\x36\\xad\\xca\\x90\\x45\\xa0\\x17\\xd0\\xac\\x59\\x73\\x40\\x4b\\x69\\x84\\x51\\x22\\x2a\\xa7\\x5c\\xbe\\x5c\\xcf\\x93\\x3b\\x06\\xff\\xfd\\x45\\x22\\xf3\\xd1\\x9a\\x1b\\xe7\\x19\\x11\\xbc\\x30\\x87\\x46\\x19\\x40\\x56\\xae\\x74\\x14\\x11\\x7a\\x48\\x9e\\xfc\\xac\\x7e\\xd7\\x11\\xe4\\x80\\x05\\xe9\\xcb\\x8e\\x7f\\x9e\\xa3\\xef\\xea\\xb5\\xcf\\x64\\x61\\x4e\\x0c\\xaf\\xdc\\x34\\xad\\x38\\x63\\x63\\xb8\\x41\\x23\\x9b\\x4b\\xd5\\xe1\\x8e\\x1e\\x3d\\x69\\xb9\\xb2\\x2b\\xda\\x20\\xc0\\xf9\\xb5\\x3b\\x05\\x8f\\x15\\x79\\xdd\\x4a\\x72\\x8a\\xe8\\x93\\x36\\x46\\xf7\\x74\\xbe\\x28\\x09\\x13\\x42\\xfd\\xa8\\xac\\xde\\x9f\\x27\\x64\\xc8\\xc6\\x42\\x73\\x1e\\xc8\\x6f\\x59\\xa2\\x80\\x65\\xa3\\xb6\\x9e\\xd0\\xa1\\xbd\\x21\\x9c\\x6e\\x02\\x14\\x60\\xa2\\x0c\\xd2\\xc9\\x24\\x22\\x91\\x19\\xc1\\xc3\\xc7\\x9c\\xca\\xd2\\x53\\xd1\\xdc\\x36\\xf6\\x11\\x74\\x19\\xf7\\xaf\\xdf\\xa4\\xd1\\x71\\xc4\\x7e\\x57\\xaf\\x55\\xc9\\xa7\\x44\\x40\\x05\\x1b\\xe6\\xea\\xe0\\x28\\x41\\x5f\\xbf\\x89\\xfd\\x0c\\xe3\\x99\\xdb\\xc0\\x39\\x79\\x3a\\xac\\xbf\\x52\\xbe\\x69\\xc5\\x37\\xfe\\x5e\\xad\\x20\\x69\\xaf\\x41\\xd5\\x22\\xd0\\x63\\x5c\\xc0\\x72\\x4e\\x7c\\x64\\x06\\x0a\\x71\\xc8\\x25\\x16\\x2b\\x90\\xf0\\x4a\\x37\\xdc\\x2a\\x47\\x54\\x2d\\x39\\xef\\xc5\\x88\\x79\\x5d\\xec\\x5a\\xd9\\xdc\\x48\\x0f\\x27\\x4a\\x89\\x55\\xaf\\x4a\\x21\\x25\\x61\\x45\\x52\\xb9\\xb7\\x7c\\xe6\\xec\\x35\\xae\\x85\\xa7\\x3c\\xc8\\xa5\\xaa\\xd2\\x25\\x72\\xe1\\x82\\x92\\x4d\\xcb\\xe8\\x81\\xaf\\xfc\\x57\\x4e\\x15\\xf2\\x61\\x7e\\x63\\xba\\xf2\\xf4\\x22\\xc3\\x50\\x41\\x67\\xf2\\xce\\x75\\x2c\\xe7\\xf6\\x84\\x37\\x8c\\x79\\x86\\x62\\x8f\\x4a\\xc3\\x6f\\xe5\\xd6\\x5e\\xab\\x0b\\xe5\\x8d\\x19\\xa8\\xfb\\xe8\\xc7\\x77\\x66\\xde\\x4b\\x52\\xbb\\xb4\\xec\\x49\\xde\\x2c\\x3c\\x67\\x8f\\x6e\\xef\\xd8\\x2f\\x6d\\x39\\xa3\\xcb\\x28\\x9a\\x03\\x59\\x76\\x7a\\x5f\\xbd\\x98\\xd7\\xe1\\xa4\\xe5\\x76\\x26\\x4e\\x87\\x82\\xf5\\x18\\x61\\x7f\\xef\\x1e\\x26\\x76\\xbe\\xef\\x41\\xb3\\x65\\xf6\\x44\\xb8\\x7a\\xc4\\x76\\x5b\\xd1\\x5e\\x61\\xfb\\xcb\\x2a\\x23\\xfe\\x22\\xae\\x52\\x36\\xfe\\xf6\\x22\\x41\\x49\\x49\\xb1\\xc4\\xeb\\x40\\x74\\xea\\xb6\\x3c\\x72\\x4c\\x3d\\xa6\\x4a\\x43\\xcc\\x00\\x3f\\x25\\xd7\\xc8\\x04\\xe7\\x5c\\xcb\\x0d\\xdc\\x7c\\x08\\xc1\\xe6\\x3e\\xc2\\x6e\\x2b\\x2a\\xa7\\x76\\x34\\x0d\\x07\\xd9\\x3f\\x3d\\x83\\xaa\\x54\\xc5\\x08\\x23\\x80\\x65\\x65\\xc5\\xa0\\xba\\x3b\\xed\\x98\\xc2\\xe8\\xf3\\x41\\xed\\xc8\\x31\\x5c\\xb6\\x28\\x93\\xd9\\xfc\\x7a\\x93\\x92\\xbb\\x5a\\xbd\\x0f\\x55\\x72\\x14\\x7c\\x96\\xce\\x89\\x85\\xc0\\x87\\x87\\x83\\x9d\\x40\\x43\\x76\\x32\\xf1\\xa5\\xe2\\xad\\x96\\x08\\xe5\\xfb\\x64\\xac\\x58\\xc8\\x82\\x51\\xd6\\xb7\\x02\\xce\\x50\\x65\\x27\\x90\\xaa\\xdb\\x03\\xcb\\xdf\\x7a\\x14\\x4f\\xd1\\x33\\x31\\x29\\xad\\x99\\x08\\xc7\\xdd\\x58\\x63\\x43\\xac\\xc3\\x3a\\xca\\xce\\x21\\x38\\x09\\x45\\xc6\\x11\\x50\\xb1\\xf5\\x16\\x4e\\x5e\\x68\\x54\\x08\\x7f\\xd7\\xd7\\x3f\\x7d\\xc6\\xd6\\xa6\\x86\\xab\\x8a\\x04\\x4d\\x68\\x0d\\xb5\\xf4\\xce\\x17\\xc3\\xeb\\x11\\xf6\\xbe\\x3a\\x76\\xa9\\x59\\x93\\x11\\xd1\\xaa\\x8c\\x9f\\x23\\x47\\x2e\\x5d\\x36\\x0a\\xbd\\xf0\\x0a\\xb5\\xd3\\x7d\\x65\\x21\\xec\\x50\\x98\\x2f\\x9f\\xea\\xac\\x36\\xc1\\x20\\xda\\xad\\x02\\xce\\x96\\x78\\x07\\x0c\\x55\\x8b\\x45\\x2c\\x90\\xca\\x11\\x5a\\xd8\\x9a\\x4f\\x21\\x32\\xa5\\xf5\\xde\\x6e\\x8c\\x41\\xd6\\x5c\\x5d\\x63\\xb7\\xc5\\x2c\\x89\\xef\\x66\\x3a\\xe4\\x2f\\x92\\x55\\xaa\\x79\\x9d\\x39\\x2e\\xf9\\xb5\\x47\\x07\\x05\\x71\\xca\\xd0\\x4b\\x0e\\x42\\x8c\\xd3\\x97\\x1a\\x51\\x63\\x33\\xa9\\xa5\\x24\\x1f\\x76\\x68\\xb3\\xca\\xa6\\x5f\\x60\\x63\\x19\\x5a\\xcb\\x74\\xc9\\x51\\x3d\\x87\\xf5\\xf9\\xe1\\x08\\x3a\\xc8\\x40\\x0d\\x04\\x07\\xb8\\x41\\x87\\xd0\\x2f\\x92\\x72\\xf1\\x18\\x26\\x97\\xb7\\xc6\\x11\\x8d\\xd5\\x4d\\x52\\xe8\\xf3\\xdb\\x14\\x1d\\xbb\\x4c\\xcb\\x67\\xea\\xf7\\xc1\\x7f\\x5c\\x41\\x97\\x20\\xc5\\x7c\\x08\\x65\\x48\\x35\\x1e\\x7a\\x3a\\x51\\x5b\\x37\\xb4\\xdb\\xdb\\xf1\\x55\\x59\\x8e\\x1a\\x27\\xc0\\x65\\x60\\x55\\xd6\\xc4\\x24\\xd3\\xa3\\xbe\\x43\\x52\\x92\\x92\\x56\\xf4\\x18\\xf6\\x0f\\x21\\xc2\\x95\\x2f\\x4c\\x99\\x5f\\x7d\\xd5\\x32\\x47\\x1d\\xb8\\xd7\\x2e\\xc7\\xa4\\x0e\\x5b\\x42\\xe0\\x28\\x56\\x37\\xbb\\xc8\\x29\\x49\\xca\\x05\\x5d\\x09\\x21\\xa3\\xa0\\x2e\\x13\\xd1\\x2d\\x88\\x0d\\xc2\\x4e\\x8b\\xd3\\x7f\\x3a\\x7f\\x1c\\x17\\x1f\\xae\\x5d\\xab\\xa3\\x0f\\xea\\x13\\xbf\\xc9\\x00\\x02\\x56\\xcc\\xda\\xd0\\xd6\\x6b\\x3b\\x2b\\xa7\\x1b\\x0e\\x3f\\x92\\x73\\x8b\\xa0\\x3b\\x9d\\x99\\x02\\x02\\x37\\x2e\\x37\\x1f\\x16\\x26\\x6d\\x94\\xcf\\xde\\x0d\\xee\\xa0\\xd9\\x3a\\x51\\x6e\\x8d\\x2e\\xec\\x85\\xb1\\x95\\xe1\\xad\\xec\\xb2\\x68\\x75\\x34\\xdf\\xf4\\x0b\\x09\\xa7\\xc6\\x83\\x17\\x2d\\x84\\x09\\xa4\\x88\\x95\\x8c\\xb7\\x81\\x24\\xb4\\x7c\\xd3\\x73\\x74\\xbf\\x45\\x62\\xae\\xb3\\xc8\\xb8\\xe8\\x14\\x95\\x83\\xfd\\xa4\\xea\\xa0\\x05\\xa6\\xbc\\x82\\xdf\\x9c\\x3a\\x53\\x5d\\x0a\\xb1\\x7f\\xaa\\x1e\\x20\\x32\\xe2\\x8f\\x52\\x02\\x35\\x91\\x95\\x88\\x37\\x19\\x96\\x9c\\x2c\\x65\\x80\\x16\\x20\\xaa\\x23\\x9d\\x1a\\x89\\x21\\x48\\x7f\\x5e\\xf2\\x12\\x75\\x4a\\xee\\xfb\\xd2\\xd5\\xce\\xa0\\x33\\x99\\x47\\x03\\xe2\\x2a\\xa5\\x35\\xf5\\x72\\x4e\\x10\\x2b\\xa6\\x7f\\xfc\\x92\\x2e\\x0c\\xc5\\x0b\\x5f\\x2c\\x7c\\x84\\xe3\\x48\\xb6\\x33\\x51\\x9d\\xa4\\x50\\xba\\xf9\\x1b\\x3f\\xdb\\x62\\x7e\\xf1\\x61\\xb0\\x37\\x33\\x19\\x20\\x6b\\x21\\x49\\x64\\x3a\\x4f\\x25\\x8f\\xc4\\x2d\\x16\\x2b\\x8e\\xca\\x36\\xd1\\x41\\xa2\\x3b\\xdf\\xb7\\x3a\\xd8\\x67\\x15\\x95\\x2c\\x0f\\x50\\x74\\x28\\xbe\\xad\\xf4\\x39\\x3f\\x45\\x3c\\x6d\\x1e\\x85\\xf8\\x55\\x65\\xcf\\x68\\x55\\x50\\x30\\x4c\\x87\\x2a\\xfa\\x04\\x20\\xf2\\x04\\x66\\x2a\\x96\\xcb\\x53\\xa7\\xd8\\x47\\x4c\\x0f\\xaa\\x33\\xfd\\xf4\\x11\\x0d\\xb2\\xc0\\xab\\x61\\xdd\\x22\\x1f\\x28\\x44\\xee\\x3e\\x92\\x54\\x60\\x15\\xd7\\x4b\\x49\\x92\\x50\\x32\\xcc\\x3f\\xf4\\x37\\xc5\\xe3\\xb8\\x58\\x70\\x8d\\x1f\\x55\\xef\\x76\\x4c\\x5f\\xaf\\x38\\x74\\x73\\xf8\\xfe\\x8f\\x3e\\x0a\\x1e\\xaa\\x7c\\x06\\x55\\x52\\xa0\\x86\\x20\\xd5\\x88\\x72\\x5b\\x52\\xa5\\xc3\\xdb\\xc1\\xcf\\x7a\\x4e\\xe3\\x00\\xf2\\x6c\\x3f\\x19\\xfa\\x88\\xd9\\x09\\x71\\x93\\x61\\x9f\\x7b\\x4d\\x28\\xa2\\xfb\\xe0\\x9b\\x77\\x38\\x33\\x2a\\xe2\\x5d\\xbb\\xd4\\x04\\xff\\x0b\\x7c\\xb6\\x38\\x3f\\xe4\\x9f\\xbc\\xb4\\xea\\x19\\x98\\xd7\\xb8\\x82\\x18\\x24\\x72\\xee\\xca\\xf4\\x31\\x14\\xf9\\x51\\x98\\x75\\x99\\x06\\xb5\\x17\\xb1\\x62\\x88\\xbe\\x3a\\x97\\x21\\xf1\\xa5\\x89\\x30\\x46\\x04\\x74\\x6a\\x09\\xca\\xec\\xbc\\x05\\x8d\\x37\\xb0\\xc8\\x2e\\xed\\x03\\x4b\\x06\\x34\\x8d\\xdb\\xf1\\x0a\\x8f\\x9b\\x3d\\xbf\\xb4\\x4f\\x37\\xc8\\x24\\x39\\x65\\x3d\\x69\\xc3\\xed\\x30\\x85\\xb4\\xdc\\xd6\\x3c\\x44\\x88\\xfd\\xf8\\x3b\\xff\\x78\\x67\\x31\\x48\\x12\\x67\\xb8\\x2d\\x6c\\x3f\\x32\\x3e\\x3a\\x8e\\x4e\\xd9\\xbf\\x0c\\xf1\\xc2\\x14\\xc2\\xe7\\x0e\\xde\\x42\\x9c\\xe0\\x12\\xc2\\xf0\\x3a\\x91\\xe5\\x0a\\x06\\x3f\\xe1\\x03\\x8b\\x83\\x64\\xe9\\x4b\\xee\\x9c\\x02\\x00\\xe1\\xe5\\xca\\xd0\\xb2\\x50\\xe7\\xf7\\xef\\x60\\xe9\\xfc\\x3b\\x96\\x44\\x46\\x04\\x22\\x8c\\xd3\\x85\\xa2\\xf8\\xf1\\xea\\xbf\\x44\\x76\\x2d\\x3f\\x29\\xc6\\x58\\xcd\\x9f\\x45\\xc3\\x04\\x64\\xd6\\x7e\\xaf\\x0c\\xf3\\x53\\xfe\\xe3\\x28\\xbf\\x73\\xb7\\x45\\x51\\xc3\\x7e\\x8e\\x6c\\x41\\xae\\x95\\x85\\x4a\\x63\\x1d\\xf7\\x12\\xfb\\xa5\\x61\\xc5\\xdd\\xff\\x24\\xf7\\xed\\xd9\\x31\\xd7\\x2b\\x9d\\x1d\\xce\\xd3\\x23\\x42\\xa1\\xb4\\x55\\xc8\\xd0\\x2c\\xcc\\x5e\\x70\\x54\\xac\\x0c\\x12\\xfe\\xb9\\x79\\x58\\xa3\\xdc\\x2d\\x1f\\x7d\\x05\\xf0\\x3f\\xe3\\xdc\\x82\\xa0\\x1a\\x95\\x46\\xe9\\xa2\\xa5\\x48\\xcd\\x9f\\x86\\xac\\x17\\x3c\\x8b\\x13\\x29\\xa9\\x69\\xa5\\x21\\xc3\\x59\\xc9\\x96\\x28\\x8e\\x65\\xb3\\xec\\x86\\x55\\x5e\\xdd\\x37\\x01\\x2b\\x42\\x4b\\xfe\\xae\\x92\\x87\\x0d\\x1a\\xc7\\xe9\\x52\\xbd\\x2a\\xe4\\x01\\x66\\xe8\\x51\\xa5\\x52\\xb3\\xb9\\xb6\\x5a\\x9b\\xd7\\x13\\x1d\\x3e\\x76\\x18\\xd1\\xce\\x09\\xcd\\x74\\x0f\\xac\\x98\\xcc\\x86\\x7a\\x94\\x8b\\x17\\xbf\\x03\\x63\\x96\\x04\\xd1\\x3f\\x96\\xf2\\x55\\xa0\\xbb\\x6f\\x53\\x1b\\x0c\\x71\\x46\\x9d\\x60\\x1a\\x45\\x97\\x4b\\xd7\\x9f\\x88\\x06\\x4e\\x70\\xa1\\x7e\\x5c\\x67\\xd7\\x62\\xb0\\xbc\\x92\\x21\\xce\\xcb\\x63\\xcc\\xed\\x34\\x09\\xce\\xc1\\xf9\\xb8\\xbe\\x3e\\x36\\x6a\\x33\\x44\\x98\\x89\\x7c\\x5e\\xe2\\x03\\xe0\\x6a\\x39\\x70\\x71\\x35\\x2f\\x7d\\x4c\\x9e\\xc7\\x15\\x46\\x96\\x1b\\x3e\\xce\\x5e\\x88\\x3b\\xbc\\x21\\x3e\\xed\\x0f\\xaf\\x97\\xa5\\xb2\\xf2\\x68\\xc4\\xbf\\xeb\\xca\\x3b\\xe1\\x0c\\x59\\x3b\\x0f\\xd7\\x8e\\xa8\\x73\\x6b\\xe4\\x71\\xe1\\xed\\x38\\xe3\\xef\\xd4\\xfd\\x6f\\xb9\\x62\\x84\\x15\\xbe\\x74\\x9b\\x76\\x06\\x84\\x89\\x7b\\xf5\\x55\\xc1\\xe7\\xe6\\x05\\x66\\xa7\\x96\\xb9\\x31\\xd4\\xb0\\x14\\xc5\\xd9\\x02\\x91\\x2f\\x25\\x7b\\x3a\\x9b\\x53\\x31\\xcc\\xbd\\x08\\x5c\\x63\\x9a\\xfa\\xd4\\x71\\xaf\\x16\\x78\\x71\\xca\\xe4\\xea\\x13\\x1e\\x32\\xe3\\xc3\\xef\\xdd\\x67\\x3a\\x35\\x01\\x5b\\x45\\xe2\\x3b\\x54\\x04\\x86\\x91\\xe1\\xb9\\xcf\\x3e\\x94\\xf8\\x68\\xd3\\x61\\xa9\\x32\\x7d\\x06\\xf4\\x32\\x50\\xbf\\x5a\\x67\\x65\\x7c\\xa2\\xd6\\xd9\\x12\\x66\\x2d\\x0e\\xea\\xe8\\x98\\x78\\xbc\\xcb\\x5a\\x17\\x0c\\x92\\x91\\xd5\\xf1\\xcd\\x86\\x3e\\x27\\xfb\\x0f\\xf6\\xfe\\xc6\\x44\\x3a\\x85\\xb2\\xa4\\x01\\x02\\x0b\\x62\\x3f\\x4e\\xd0\\x6a\\xad\\x12\\x50\\x79\\xe8\\xc6\\x32\\x30\\x95\\x6c\\xbc\\x30\\x1a\\x70\\xcc\\x14\\x7f\\x37\\x90\\x26\\xf4\\xe5\\xda\\x62\\xdb\\x52\\xc5\\x0d\\x7b\\x92\\x7c\\x3b\\x8d\\x2a\\xdf\\x7e\\x80\\xd1\\x25\\xb8\\x07\\x37\\x59\\xbd\\xec\\xaf\\xea\\x35\\x1e\\x6a\\x9e\\x09\\x99\\xb9\\x77\\xe1\\xd6\\xaa\\xdf\\x62\\xdf\\x20\\x05\\x68\\xc6\\xbb\\xeb\\x13\\x63\\x07\\xda\\xc7\\xed\\x0d\\xc7\\x43\\x2a\\x6e\\xb7\\x91\\x31\\xb7\\xd7\\x6b\\xd8\\xd7\\x10\\xc1\\xe1\\x64\\xb1\\xba\\x89\\x9b\\x89\\x20\\x26\\x4a\\x40\\x77\\x59\\x75\\x90\\xc2\\xee\\x21\\x0f\\x44\\x1f\\x58\\xba\\x02\\xa3\\x08\\x5f\\x45\\xc7\\x94\\xdc\\x50\\x4c\\xc1\\x6b\\x57\\xe2\\x20\\x93\\x0a\\xc2\\x97\\x60\\xa8\\x20\\x0a\\xed\\xf2\\xe8\\x32\\xb2\\xb3\\x4f\\xa9\\x2d\\x34\\xee\\x07\\x1b\\xc0\\x27\\x7b\\xb2\\x11\\x37\\x7a\\x51\\xf9\\xec\\xa7\\x1f\\x18\\x14\\xa9\\x37\\x90\\x11\\x68\\xda\\x15\\x07\\x56\\x90\\x09\\x0b\\x19\\x92\\xf3\\xb5\\xc3\\x48\\xc9\\x8c\\x32\\x02\\x0d\\x07\\x46\\x57\\xbd\\xe2\\xd7\\xb6\\x33\\x30\\x0e\\x6d\\x3c\\x3a\\x57\\xa2\\xf5\\x10\\x1a\\x3e\\x67\\xaf\\xe4\\xa6\\x0f\\xb9\\x31\\x0a\\x30\\xfb\\x2a\\xac\\x85\\x05\\x4c\\x5d\\xc3\\xbf\\x73\\x03\\x21\\x39\\x3c\\x17\\x06\\x29\\xf0\\xe9\\x69\\xb2\\x5f\\xeb\\x68\\xe9\\x71\\x65\\x31\\x88\\x7d\\x16\\xf0\\x12\\xa1\\xfb\\xf3\\xdf\\xd5\\x95\\x1c\\xcf\\xf6\\xb0\\x4f\\xf4\\x1d\\xf3\\xf5\\xf3\\xb6\\x3f\\x0c\\x33\\xac\\xd6\\x64\\xc3\\x3b\\x7e\\xfa\\x72\\x9a\\x6e\\xd3\\x24\\x40\\x36\\x4f\\xfd\\xee\\x63\\xdf\\x50\\xa3\\xc7\\x80\\xf2\\x86\\x26\\xb5\\x1c\\x68\\xaa\\xbd\\xb0\\xce\\xfd\\xa0\\x90\\x3e\\xef\\xdd\\x74\\x41\\x24\\x9a\\xbc\\x0b\\xcb\\xa6\\x35\\x44\\x79\\xee\\x37\\x8b\\x6b\\xc8\\xd4\\x82\\xe9\\xc4\\xca\\x54\\x64\\xc0\\xd4\\x8d\\xe3\\x4c\\xd7\\xaa\\xc1\\xfc\\x32\\x4f\\x11\\xab\\x14\\x13\\x44\\x45\\xc9\\xaf\\x2b\\xaa\\x73\\x6a\\x30\\x21\\xc5\\x24\\x65\\x2b\\x70\\xbb\\x1e\\x79\\x22\\xf4\\xdd\\xf8\\xc6\\x4a\\x46\\x97\\x7d\\xaa\\xe2\\x6b\\x51\\xc7\\xca\\x1a\\x17\\x5e\\x60\\xe8\\x0f\\x73\\xb2\\xd0\\x51\\xf7\\x7d\\x8a\\x70\\x46\\x5e\\x1c\\x56\\xfd\\xb4\\xab\\x7f\\xae\\x66\\x07\\x4a\\x07\\x69\\xa6\\x55\\x6b\\xc5\\x6a\\xab\\x1a\\x3b\\x64\\xd8\\x68\\xab\\x16\\xb8\\xbd\\xf3\\xa7\\x50\\xdc\\xce\\x38\\xaa\\xb8\\x2a\\x9c\\x72\\x39\\x23\\x5f\\x48\\xa8\\xad\\x8c\\xf3\\xf8\\x6a\\xd4\\xed\\x42\\x14\\xb6\\xa7\\xb1\\xb0\\x61\\x69\\x22\\x78\\x6c\\x35\\x57\\x1b\\xbe\\x05\\xf3\\x66\\xdc\\x5a\\xee\\xac\\x9d\\x22\\x89\\x19\\x6d\\xd4\\x04\\x35\\xdd\\x3c\\xb5\\xf5\\x30\\xa8\\xf2\\x73\\xc1\\x2d\\x4b\\xc4\\x61\\x40\\xea\\x8e\\xf3\\x12\\x87\\x41\\x28\\x1a\\x92\\xc5\\xe2\\x39\\x75\\x13\\x58\\xbb\\x20\\x2f\\x60\\x07\\xb7\\xa3\\x33\\xd8\\x94\\xd5\\xf3\\x0c\\x0b\\x90\\xa3\\x5b\\xe0\\xf4\\xcd\\x40\\xa8\\x37\\x43\\xf7\\x9f\\x80\\xc3\\xcb\\x02\\x6b\\xf7\\x1a\\x4c\\x0b\\xaf\\x7f\\x1c\\x98\\x3f\\x8c\\xc9\\x1a\\x70\\x58\\x74\\x99\\x2f\\x07\\x38\\xbf\\x09\\x96\\x7c\\xe3\\x5e\\xba\\xbd\\x78\\xc9\\xb2\\xe9\\x45\\xa5\\x2f\\x75\\x8d\\x91\\x48\\xde\\x44\\xf8\\x24\\x0e\\x4d\\x39\\xac\\x9b\\x31\\xee\\x13\\x3a\\x60\\xc9\\x80\\x0c\\xed\\xe0\\xbf\\xd2\\x71\\x1f\\x74\\x46\\xf4\\x18\\xc5\\xc7\\xd7\\x55\\x88\\x5c\\x98\\xa2\\xee\\xc5\\x48\\x30\\x5c\\x4b\\x57\\x6e\\x9a\\x95\\x7a\\x9f\\x04\\xcf\\x18\\xab\\x95\\xc9\\x4a\\x8c\\x6c\\xb6\\x99\\x14\\x1d\\x16\\x34\\x53\\x43\\x97\\xdf\\xd0\\x8b\\x31\\x11\\x2b\\x5f\\xa7\\x73\\x9c\\x9a\\x2b\\x9d\\x4c\\x14\\x82\\xf0\\x72\\x38\\x9f\\xab\\x29\\xd5\\xab\\x3f\\x4b\\x71\\x18\\xd4\\x8e\\x92\\x2c\\x2f\\xd4\\xae\\xad\\x4a\\x98\\x05\\xf6\\x88\\xd5\\x58\\xd5\\xcd\\x82\\x22\\xe5\\xa7\\x78\\x0b\\x15\\xd4\\x36\\x90\\x2c\\x4a\\xc8\\x24\\x19\\x6c\\x07\\x93\\x87\\x96\\xd8\\x75\\x08\\x6d\\xd2\\x50\\x81\\x95\\xb3\\xd8\\xa9\\xd6\\x4a\\x7b\\x72\\xce\\x19\\xc3\\x0d\\x55\\x98\\x51\\x44\\x91\\x61\\x93\\xa5\\xf7\\xa1\\xf8\\x5c\\x65\\xb1\\x88\\x7e\\x93\\x9e\\x62\\x81\\x54\\xdc\\xed\\xb9\\xe0\\xa1\\x84\\x8b\\x96\\x39\\xe7\\x00\\x51\\x36\\x8f\\x7b\\x15\\xd3\\xeb\\xe8\\x22\\xe8\\x3f\\x18\\x06\\x66\\xee\\x29\\x16\\x7b\\x61\\x18\\x12\\x9c\\x2b\\xf1\\xda\\xd5\\x38\\xbf\\x90\\x70\\x8e\\x1f\\x5a\\x59\\x7f\\xff\\xcd\\xce\\xa3\\x28\\x9d\\xa5\\x49\\x64\\x5b\\xfb\\x13\\xfc\\xb9\\x6c\\x79\\x08\\x5e\\x4d\\x31\\xa4\\x39\\xa8\\x97\\x60\\x94\\x6d\\x52\\x90\\xcd\\x6f\\x79\\xab\\x03\\x6d\\x8c\\x8b\\xf2\\xfc\\x0b\\x9d\\x49\\x23\\xf7\\xd3\\x43\\x10\\x5d\\xfe\\xfb\\xf4\\x04\\x21\\x7f\\xf3\\x5b\\x93\\x1b\\x5b\\x8f\\xb7\\x9c\\x05\\xd1\\xf6\\x47\\x27\\x52\\xf7\\x8f\\x07\\xca\\xee\\x2a\\x37\\x11\\x1d\\x85\\x2e\\x75\\x9d\\xb9\\xd9\\xb0\\x78\\xb7\\x53\\xe6\\xc8\\x62\\x99\\xab\\x08\\x7d\\xa1\\x57\\xaf\\xf1\\x09\\x11\\x02\\xb8\\x5c\\x99\\xf6\\x88\\xa0\\xba\\x10\\x89\\x17\\x28\\x9e\\x00\\xa4\\x51\\x4e\\x1f\\xfd\\x0b\\x5c\\x4f\\x7e\\xbb\\x3b\\x7d\\x0e\\xe2\\xba\\xa6\\x56\\x04\\x49\\x95\\x63\\xa6\\x01\\x50\\x10\\x02\\x8c\\xcc\\xfe\\xa4\\x32\\xfb\\x66\\x29\\xda\\x04\\xdd\\x09\\x80\\xf0\\x57\\xe8\\x46\\xb3\\xd5\\xb2\\x78\\xcc\\xed\\xc2\\x6c\\xe5\\xad\\x3e\\xe7\\x80\\x16\\xc7\\x3d\\x2e\\x55\\x04\\xfd\\x46\\x13\\xa1\\xd6\\x72\\x76\\x4e\\xe8\\xc2\\x3f\\xb0\\x1d\\x3b\\x71\\xc5\\xd6\\x83\\xee\\x6b\\xfa\\x5e\\x29\\x87\\xa7\\x1a\\x44\\x71\\xf5\\x27\\xbd\\x2d\\x3a\\xf3\\xc1\\xa0\\xca\\x98\\xf4\\x5a\\x6e\\xb4\\x40\\xcb\\x1a\\xbf\\xbf\\x90\\xde\\x70\\x26\\x11\\x3f\\x6b\\x6d\\x12\\x34\\xe3\\x61\\x73\\x93\\xbd\\xe6\\xd3\\xb0\\xbb\\xd4\\x24\\xe8\\x0b\\x79\\xb8\\xdc\\x4b\\xef\\x57\\xe3\\x5f\\xa1\\x38\\xc2\\x90\\x9b\\x5d\\x7b\\x7c\\x67\\x6c\\x1d\\x26\\x72\\x33\\x17\\xe3\\x3a\\x7d\\x5c\\x77\\x4b\\xc3\\x06\\x18\\x0d\\xba\\x3f\\xae\\x72\\xa2\\x99\\x86\\xb0\\xbb\\x42\\xfb\\x1e\\xf9\\xe8\\x42\\xcf\\x44\\xb6\\xd2\\xcb\\x03\\x7c\\x44\\x69\\x21\\xa8\\x3c\\x39\\xf1\\xe7\\x43\\x66\\xc3\\x9f\\x2c\\xd1\\xbe\\xa0\\x05\\xa3\\x77\\x5e\\x7c\\x35\\x0d\\xab\\xaf\\x2d\\x37\\x11\\x83\\x45\\x99\\x4b\\x39\\xaf\\x48\\xe9\\x65\\x86\\x6e\\x97\\x31\\x9e\\x9f\\xe1\\xd7\\x8b\\x52\\xac\\x49\\x9e\\xcf\\xf9\\xd9\\x7f\\x19\\xa7\\x90\\x48\\x51\\xdd\\xcb\\xed\\x4a\\x91\\x0a\\x93\\xbc\\xfb\\x7a\\xdc\\xf7\\xfe\\xb0\\x6b\\xde\\x1e\\x9e\\xa9\\xb6\\x29\\x6b\\x1e\\xdb\\x9b\\xa1\\x69\\x2f\\x5a\\xeb\\xd6\\xf3\\xf5\\xeb\\xe3\\xcb\\x45\\x82\\x44\\x6c\\x7c\\xed\\xeb\\x0a\\x61\\xcb\\x81\\xd7\\xf1\\x53\\x08\\x41\\x38\\xdd\\x8e\\xdb\\xc9\\xd1\\x6b\\xf6\\xab\\xd2\\x73\\xc0\\x51\\x8c\\xec\\x2e\\xd7\\x46\\x60\\x0e\\xb5\\x17\\x84\\x5b\\x09\\x9b\\xf1\\x65\\x65\\x91\\x66\\x3b\\x67\\x04\\xb1\\xc7\\xc4\\xd2\\x94\\x5c\\x39\\x6f\\x3a\\x26\\x73\\xfc\\x05\\x8f\\x60\\x4f\\x00\\x8c\\xe6\\x92\\x1d\\xd3\\xab\\xfb\\x65\\xa1\\xc5\\x02\\xf7\\x84\\xa4\\xd1\\x57\\x82\\xa0\\x97\\xd3\\xa8\\xb1\\x13\\x48\\x68\\x16\\x79\\x1c\\x52\\xbb\\x1f\\x98\\xdc\\x78\\xa3\\x2d\\xba\\x9a\\xe9\\xd7\\xc3\\x3d\\x6d\\x18\\x75\\x1f\\x44\\x93\\x29\\x54\\xbd\\x9d\\x96\\x56\\x59\\xaf\\x94\\xb1\\xc3\\x4a\\xe3\\xc2\\x93\\x2b\\x2e\\xfc\\x62\\x5b\\x88\\x93\\x68\\xe4\\x32\\x83\\x8a\\x84\\x75\\xc8\\x4d\\xa3\\x9e\\x61\\x35\\x48\\xb0\\x33\\x85\\x32\\x3e\\xd7\\x7f\\xa5\\x2f\\x48\\xde\\xdc\\x31\\x33\\x58\\xe1\\x9d\\xe6\\xac\\x90\\x88\\xf4\\x37\\xdf\\xd0\\x1e\\x65\\x56\\xc7\\x6a\\xc4\\xca\\x7e\\x06\\xe8\\x51\\x4b\\xf2\\x6f\\xe1\\x73\\x24\\x9f\\xdc\\x69\\xd0\\xf1\\x7d\\xd8\\x84\\xa5\\x23\\x14\\x63\\xa5\\xbb\\xbd\\xbf\\xe2\\x4c\\x9c\\x48\\xf9\\x4b\\x57\\x4a\\x10\\xd9\\x28\\x5b\\x96\\x2b\\x68\\x69\\x82\\xc2\\x49\\x28\\x28\\x8b\\x4b\\xfa\\x16\\x4a\\x10\\xad\\x9c\\x6e\\x99\\xc2\\x59\\xb4\\xf8\\x64\\x77\\x0f\\x81\\x47\\x59\\x22\\x09\\xbd\\xc0\\x75\\xc4\\xe8\\x53\\x17\\xe3\\x5f\\x67\\xe1\\x74\\x39\\x55\\xa3\\x32\\x96\\xb6\\xbf\\x7f\\x72\\xdf\\x68\\x2d\\x97\\x1b\\x04\\xd4\\x55\\x8e\\x47\\x63\\xef\\xdc\\xf8\\xa5\\x95\\x8e\\x66\\x55\\xb9\\x57\\xbf\\xcb\\x1a\\x63\\x19\\xb4\\x9d\\xca\\x53\\x21\\x9d\\xdf\\xe2\\x93\\x6f\\x35\\xbd\\xd6\\xde\\xca\\x72\\x2d\\xac\\xc5\\xf0\\xb0\\x4f\\xd4\\x46\\x7c\\x36\\xe1\\x32\\x6d\\x58\\xad\\x8e\\x4f\\x3d\\xb0\\x2d\\xfb\\x85\\xa6\\xc1\\x0f\\xb6\\x8a\\x56\\x05\\xfc\\x71\\xe5\\xb2\\x9e\\x9f\\xb8\\x19\\x84\\x09\\xcb\\x59\\xfb\\xc0\\x99\\x45\\xce\\xcb\\xd8\\x61\\x2e\\x37\\x21\\xe2\\x2d\\x32\\xf7\\x7e\\x5f\\xd9\\x19\\xff\\x52\\xd7\\x1d\\xba\\x42\\x9c\\xb8\\x7b\\xe9\\x48\\xb2\\x70\\xf2\\x69\\x0d\\xf6\\xd4\\xfc\\xec\\x36\\x4f\\x7b\\xee\\x8c\\x3f\\x75\\x9d\\xfb\\x1c\\xf4\\xd5\\x10\\xea\\xa8\\x2b\\x0b\\xb6\\x0f\\x8f\\x95\\x07\\x03\\x00\\x04\\x14\\x84\\x09\\x40\\x45\\x58\\xcf\\xf9\\x3b\\x0f\\x27\\x5e\\x34\\x62\\x77\\x76\\xcd\\x85\\xef\\x47\\x68\\xb1\\x82\\x0d\\x5c\\xdd\\x07\\x3a\\x31\\xbe\\x04\\x7a\\x4d\\xb4\\x2b\\x19\\xa1\\xc4\\x15\\x24\\x0e\\x72\\x0a\\x3f\\x54\\x8b\\xca\\x47\\xff\\x24\\x9b\\x26\\x6b\\x7e\\x2d\\xcd\\x75\\x11\\xf2\\xba\\x26\\xa0\\xb9\\x96\\x1a\\xe7\\x49\\xdc\\x07\\x55\\xc8\\x16\\xc8\\xe9\\xcf\\x18\\x46\\x31\\x29\\xb2\\x74\\x4b\\x51\\x46\\x84\\x32\\xb9\\xed\\xad\\x33\\xcd\\x41\\xc1\\x28\\xdc\\x37\\xb1\\xfb\\xd3\\x0c\\x7c\\xa8\\x6a\\xcc\\x3d\\x5a\\xa5\\xde\\x54\\xe0\\xdd\\x14\\x59\\x98\\x84\\x35\\xe9\\x5d\\x67\\x6b\\xa8\\x14\\xed\\xf9\\xd3\\x93\\x38\\xf7\\x9c\\x61\\x33\\xbc\\x24\\xf1\\x7b\\x6d\\xe3\\x60\\x0f\\x17\\x3d\\x2b\\x01\\xaf\\xec\\x12\\xb5\\xdc\\x87\\xab\\x8c\\x8e\\xb0\\xc2\\xbb\\x12\\x97\\xf4\\x7b\\x34\\xd2\\x22\\xc0\\xdf\\xa0\\xbe\\x2b\\x26\\x81\\x0e\\xd0\\xb8\\x3a\\x53\\x3c\\x25\\x57\\x4a\\xf2\\xd1\\x0d\\x3d\\x3c\\x90\\x39\\x0e\\x8d\\xa4\\x7d\\x46\\x52\\x8b\\x9c\\x23\\x82\\x02\\xf2\\x41\\xf7\\x4f\\x43\\xca\\x6c\\xa9\\xc2\\x1b\\x0c\\xab\\x14\\x45\\xac\\xc0\\x5b\\xd4\\xe0\\xf7\\x6f\\xa5\\xfe\\x7c\\xb8\\xa6\\xcf\\x5d\\x96\\xfa\\xe6\\x0d\\x78\\x0b\\x3a\\x7e\\x71\\x0e\\x18\\xd3\\x61\\xc4\\x8a\\x0a\\x36\\x8d\\xed\\x6c\\xd6\\x4d\\xfe\\x86\\x33\\x84\\xb0\\xcd\\xeb\\xd1\\xb5\\x2d\\xae\\x27\\x5b\\x20\\x96\\xec\\x7f\\xf2\\xb3\\x33\\xa5\\x77\\xdb\\x64\\xa3\\xc7\\x25\\x3a\\x65\\xab\\xb4\\x54\\x4c\\xa0\\xcc\\x63\\xb6\\x27\\x18\\x9c\\x37\\x80\\x9a\\x0b\\xca\\xed\\x4f\\x48\\x6b\\xd6\\xb5\\x4b\\x6f\\x8c\\x62\\x34\\xfb\\xf1\\x39\\x71\\x0f\\xa4\\x3d\\xd8\\xf3\\x53\\x49\\x2b\\x14\\x77\\x5f\\x09\\x79\\x68\\x30\\xc5\\x10\\x62\\xf2\\x8c\\x0f\\x6e\\x19\\x3b\\x07\\x56\\x67\\xd1\\xdc\\xe4\\x43\\x1c\\x9b\\x4e\\x25\\x13\\x59\\xa3\\xc9\\xc8\\xcb\\x41\\x93\\x4a\\xda\\xd2\\x64\\xc0\\x11\\x31\\x3b\\xe2\\x8d\\x13\\x06\\x04\\x74\\xb0\\xb2\\xa3\\xfd\\x35\\x03\\x5e\\x3f\\x37\\xa0\\x6b\\xe2\\x31\\xc8\\xa9\\x8f\\x37\\x08\\x54\\x4d\\x15\\x95\\x5c\\xaa\\xf6\\x30\\x1d\\xb4\\x7a\\x19\\x18\\xea\\x7d\\x87\\x89\\x1f\\xd5\\x47\\xc2\\x18\\x24\\xab\\x09\\xcd\\x4c\\x8f\\xa5\\xe0\\xad\\x4a\\x11\\xa9\\x9a\\x93\\xe4\\x64\\x8d\\xb4\\xcd\\x4a\\x63\\x0e\\x44\\xa5\\x1a\\x55\\xeb\\x05\\x09\\x38\\x51\\x00\\x11\\x1a\\x94\\x11\\x83\\x10\\x5a\\x84\\x98\\xe4\\x19\\xac\\x89\\x29\\x66\\x6d\\x3a\\x55\\xc6\\x1d\\xa3\\xbb\\xea\\x63\\x6e\\xec\\xbe\\x11\\xdf\\xd7\\x08\\x7b\\x09\\x4a\\x06\\xf0\\x74\\x2b\\x9e\\x99\\x42\\xc8\\x69\\x74\\x88\\xdf\\xd3\\xd6\\x36\\xae\\xcd\\xa5\\xf8\\xa6\\xff\\xa8\\xe2\\x47\\x29\\x37\\x99\\xdb\\xd9\\x8d\\x95\\x7d\\xdc\\x01\\x87\\x1f\\x93\\xa0\\x77\\x9a\\xa9\\x79\\x0b\\xf8\\x02\\x8e\\x89\\x4d\\x37\\x42\\xc1\\x26\\xd9\\xa2\\x6a\\xb3\\xa8\\xc0\\x74\\x53\\x92\\x99\\x92\\x14\\x09\\xc9\\xe6\\x78\\xc3\\x83\\xb5\\x62\\x54\\xa4\\x49\\xeb\\xe7\\xca\\x7d\\x98\\x69\\x07\\x43\\x32\\x3e\\xd9\\xac\\x8b\\x07\\x52\\x57\\xb4\\xa3\\x19\\x65\\xbd\\x06\\x25\\xe8\\xe2\\xaf\\xa3\\x50\\x12\\xe6\\xe1\\x9c\\xb0\\x19\\x95\\xd8\\xd8\\x07\\xc3\\x28\\x52\\xcf\\x6d\\x37\\x47\\x84\\xef\\x68\\xdd\\x0e\\xfc\\x3e\\x77\\x02\\xc6\\x62\\x43\\xc5\\x45\\x4c\\x05\\x0c\\x84\\x93\\x8e\\xce\\x16\\xb9\\x48\\x83\\xca\\x73\\x81\\x3a\\x67\\xb3\\xf4\\x15\\x53\\xa8\\xff\\xb9\\x5a\\x81\\x21\\xb2\\x6c\\xfe\\x06\\x4e\\x8a\\x52\\x97\\xe8\\x20\\xdc\\x76\\x07\\x49\\xef\\x5f\\x8c\\x5e\\xa6\\x6c\\xa7\\xdc\\xcb\\x32\\xb8\\xae\\x7d\\x93\\x03\\x96\\x0d\\x96\\xf0\\x86\\xb9\\xd1\\x64\\x3e\\x67\\x21\\xc8\\xdf\\x66\\x11\\xd3\\xd6\\x35\\x04\\xf8\\x27\\x61\\xa2\\xcd\\x99\\xbf\\xff\\xf4\\x1b\\x09\\x0b\\xd5\\xa0\\xc5\\x18\\x9d\\xfe\\xad\\xc3\\xc3\\xc2\\x9c\\xa3\\x3e\\x54\\x0a\\xee\\xc7\\xe0\\xe2\\xc7\\x31\\xd8\\x6e\\xff\\x46\\x34\\xae\\x2d\\x00\\xc9\\x25\\x89\\x4d\\x2c\\x3d\\x41\\x10\\xec\\xea\\x5e\\x41\\xd2\\x27\\x6d\\x17\\x3b\\x17\\x46\\x47\\x96\\xf5\\x23\\xad\\xa6\\x80\\x29\\x37\\x60\\x92\\xd1\\x0a\\x11\\x02\\xbc\\x3d\\x31\\x09\\x19\\xd0\\xe7\\xa4\\x4d\\xaa\\x9e\\x4b\\xba\\xce\\x56\\x11\\xa6\\xb8\\x96\\x5b\\x44\\x30\\xe1\\x28\\xa7\\x12\\x3d\\xca\\x2b\\x57\\x4f\\x3d\\x0d\\x41\\xa2\\x3c\\x0f\\x83\\x70\\x01\\xa0\\xe8\\xa9\\x25\\xbe\\x22\\x52\\x07\\xe7\\xb9\\x06\\x99\\x4c\\x49\\x0b\\x32\\x61\\x20\\xde\\x4c\\xd5\\x21\\x50\\xce\\x8b\\x3c\\x81\\x4a\\xe4\\x8c\\xa3\\x45\\x86\\xf3\\x72\\x30\\x0c\\xa7\\xa6\\xe4\\xe6\\x7e\\x6c\\x93\\x4c\\x4c\\xf2\\x25\\xe7\\x20\\x04\\xd2\\xb4\\xc7\\x3c\\xa5\\xa0\\xbd\\xfb\\x91\\x39\\x0e\\x6e\\xf0\\xfd\\xd3\\x96\\x50\\xeb\\xf1\\xd5\\xc8\\xf1\\xbc\\x2c\\x4d\\xf6\\xc0\\x43\\xb8\\x40\\xd8\\x23\\xb1\\x06\\x23\\xdc\\x32\\x7f\\x3b\\xc1\\x31\\xa5\\x34\\x9f\\x7d\\x4e\\x64\\xe2\\xec\\xa4\\x76\\x80\\xef\\x5a\\x3d\\xa4\\x27\\xf7\\xbc\\xfa\\x45\\x03\\xc7\\x56\\x3a\\x65\\xd9\\xdc\\x83\\x66\\x81\\x01\\x29\\x56\\xfc\\x92\\xb8\\xc0\\xf9\\x60\\x21\\x3f\\xa9\\x4f\\xd4\\xa5\\xa5\\x0e\\xcc\\xfc\\xe4\\xea\\x86\\x52\\x37\\x46\\x42\\x5e\\xe7\\xb3\\x3b\\x92\\x13\\xbb\\xfb\\x37\\x9d\\xa9\\x1a\\x30\\x9f\\xef\\xb5\\x18\\xe1\\x16\\xf9\\x8d\\x62\\x56\\x3b\\x84\\x52\\x53\\x90\\x58\\x65\\x44\\xe0\\x97\\x5e\\x7d\\x09\\x81\\x4b\\x69\\x6b\\xdc\\x7b\\x59\\x00\\xf2\\xd5\\x5d\\x53\\xf8\\x8a\\xa0\\xf5\\x1d\\x13\\x28\\x12\\x32\\xac\\x1b\\x1a\\xef\\x21\\x47\\x33\\x9e\\x75\\x9d\\xce\\xa6\\x1e\\xb4\\x12\\xd1\\x96\\x4c\\x78\\x20\\xe7\\x73\\xf8\\xf5\\x4e\\x2c\\x55\\x8b\\x26\\xa4\\x9e\\x20\\x18\\x5d\\x9c\\xe8\\x78\\xe8\\xef\\x37\\xad\\x35\\x76\\x5d\\x20\\xb6\\x21\\x2b\\xf5\\xac\\xbd\\x2b\\xd3\\xa8\\xd2\\x21\\x37\\x5e\\xe5\\x95\\x18\\x17\\x7a\\xca\\x0a\\xcd\\xf8\\x06\\x6e\\x0e\\xce\\x84\\xda\\x7d\\x72\\x25\\x15\\x46\\x99\\x84\\x9b\\x76\\xe5\\xce\\x7c\\xa5\\x45\\x7b\\xde\\x16\\x73\\x1d\\x09\\x29\\x95\\xab\\xef\\x16\\xb1\\xa8\\xa7\\x59\\xd3\\xbd\\x52\\x65\\xe8\\xa0\\x16\\xa2\\x10\\x0f\\x03\\x6b\\x1d\\xd4\\xb7\\x2f\\xa3\\x17\\x16\\xa1\\xb4\\x5b\\x4c\\x35\\xd1\\xe6\\x68\\xd0\\xaa\\x51\\xff\\xae\\xd4\\xaa\\x2a\\xf2\\x10\\xb0\\x28\\x33\\xe1\\x28\\x6d\\xe4\\x27\\x3b\\x82\\x83\\x8d\\x0d\\x3f\\x45\\x20\\xc2\\x2e\\xae\\xb2\\xcd\\x94\\xf1\\x3c\\x31\\x90\\x26\\xe6\\xa6\\x20\\x81\\x25\\x25\\x77\\x01\\x6d\\x65\\x26\\x17\\xa2\\x07\\x58\\x06\\xcb\\xb7\\xed\\x26\\xaf\\x94\\x04\\xca\\x7d\\x53\\x09\\x3e\\x4d\\xdd\\xd3\\xa3\\x14\\x3e\\x16\\xea\\xc5\\x31\\x2a\\xd5\\x1a\\x3e\\xba\\x2c\\x4e\\x37\\xd9\\x22\\xe8\\x58\\x0e\\x07\\x49\\x81\\x66\\xad\\xea\\xc6\\xf2\\xc6\\x57\\xec\\x99\\x31\\xbb\\x15\\x56\\x13\\x6b\\x48\\xac\\xa9\\xdc\\x2b\\xa5\\x06\\x33\\xf3\\xb9\\x51\\xc0\\x15\\xc6\\x4a\\x52\\xa0\\x75\\xbd\\x49\\xb1\\x06\\xb8\\xa3\\x9b\\x12\\x1a\\x66\\x07\\x2a\\x4d\\xa4\\xdc\\xf0\\x10\\x37\\xd9\\x78\\x2f\\x5d\\x69\\x6d\\x58\\x77\\x36\\xe2\\x1f\\xa6\\xee\\x98\\xb1\\x96\\x6e\\x7d\\x70\\x4f\\x0b\\x7f\\xa4\\x64\\xc5\\xdd\\xce\\x42\\x87\\x38\\x63\\x48\\x10\\xda\\x14\\xbc\\x91\\x7a\\x40\\xf5\\xa1\\x05\\x4f\\xc2\\x7c\\xeb\\xc6\\x2d\\xa5\\xde\\x92\\x68\\xdc\\x44\\x38\\x2c\\xe1\\xf7\\x2d\\xc2\\xe7\\x83\\x71\\x91\\x18\\xa7\\xf4\\xe5\\x6f\\x0f\\x22\\x02\\x94\\x0e\\xa1\\x84\\xd0\\x5d\\x98\\x68\\xd8\\x38\\xe0\\x44\\x8d\\xf5\\xc5\\xd1\\xa3\\x2b\\x85\\x66\\x1a\\x03\\xb6\\x75\\x62\\xda\\x34\\x16\\x1a\\x0c\\x4a\\xd4\\x9b\\xe7\\x11\\xd6\\x0a\\xf7\\xc2\\x0a\\xe1\\x35\\x27\\x33\\x6e\\x2e\\x3d\\x56\\x5a\\x5a\\x23\\xfb\\x65\\x73\\x7b\\x62\\xf6\\xfc\\x69\\xe6\\x2a\\xbe\\x32\\x53\\x49\\x3f\\x9d\\xd7\\xa8\\x2e\\x64\\xed\\x55\\xc6\\xba\\x84\\x77\\xed\\xbb\\x37\\xfc\\x38\\x0c\\xb4\\xd1\\xad\\x78\\xfa\\xd3\\xbb\\x9e\\xee\\x02\\x62\\x18\\xad\\xb2\\x55\\xca\\x31\\xc3\\xa6\\x48\\xe3\\xdc\\x61\\x4f\\x54\\x97\\xba\\x34\\x09\\xc6\\x78\\x4b\\x45\\xf1\\x2f\\x8e\\x59\\xcd\\xc1\\xcb\\x8f\\xbb\\x6c\\xe9\\x86\\x16\\xb1\\xba\\xf4\\x68\\x60\\x3f\\x9d\\x0d\\x3e\\x61\\x85\\xab\\xa1\\xf9\\x4f\\xef\\xff\\x05\\x6e\\x1e\\x91\\xe1\\x76\\xb6\\xbd\\x35\\x33\\x76\\x29\\x8c\\x0e\\x14\\x5a\\x42\\xc1\\x38\\x49\\xf3\\x32\\x00\\x55\\x5f\\x32\\xbc\\x75\\x59\\xbe\\xe6\\x26\\xe4\\x47\\xd6\\xfa\\xc6\\x13\\xde\\x62\\x1e\\xee\\x28\\xa5\\x92\\xcf\\x20\\xb2\\x3d\\xa7\\x7e\\x2c\\x37\\xab\\x0a\\x1c\\x4b\\xfa\\xe4\\xb8\\x71\\xc4\\x6e\\x51\\x90\\xa0\\x0d\\x73\\x9c\\xce\\x42\\x21\\xc1\\xe5\\x93\\x1c\\x46\\x6e\\x60\\x1c\\xd8\\x59\\xe7\\xf0\\x88\\x4e\\x6b\\x8c\\xb9\\x9c\\xfc\\x52\\x3d\\xcf\\x15\\x3a\\x88\\x2e\\x09\\xee\\x55\\x26\\x7c\\x47\\xb4\\xc1\\x3c\\xdd\\xa2\\xc7\\x55\\x26\\x45\\x42\\xa8\\xd9\\x41\\x71\\x4d\\x4e\\xbe\\xe4\\xd8\\x24\\x88\\x03\\x3a\\x3d\\xbf\\x90\\x35\\x30\\x89\\x2c\\x13\\x44\\x9a\\xf8\\x5b\\x7b\\x88\\xb4\\x10\\x32\\x04\\xb7\\xc8\\x06\\x99\\xc7\\xe9\\xa8\\x3c\\x24\\x3e\\xbf\\xb4\\xe2\\xb8\\x0f\\x0f\\x52\\x6e\\xf6\\xb4\\x1d\\xf6\\x3c\\xd5\\xeb\\xd6\\xf8\\xbf\\x37\\x81\\xa4\\xfc\\x98\\xe3\\x36\\xa3\\xf9\\xfa\\x3c\\x38\\xe2\\xe7\\x49\\x49\\x18\\x3c\\xab\\xdc\\x3f\\xc6\\x7b\\x82\\xf3\\x01\\x54\\x7e\\xa0\\x39\\xbd\\x22\\xa0\\xab\\xc8\\x21\\x21\\x3d\\x0e\\x64\\x13\\x0d\\xca\\xcc\\xae\\xf0\\x4d\\x4d\\x21\\x82\\x15\\xe7\\x01\\x8c\\xb4\\x79\\x85\\x78\\x88\\xf3\\xde\\xae\\xbd\\x14\\x15\\x8e\\x3a\\x99\\x03\\x31\\x6e\\x51\\x0a\\xce\\xde\\x29\\x05\\xeb\\x4b\\xee\\xa2\\x05\\xc5\\x17\\xa9\\x42\\x60\\x1c\\x0c\\xfb\\x29\\x0e\\x10\\xd2\\xc6\\xb1\\x69\\x5d\\x64\\x63\\x7a\\x43\\x90\\x4b\\x50\\xb1\\xd9\\xa2\\xd1\\xe7\\x8e\\x3d\\x94\\x78\\xd5\\xb7\\xf3\\x4b\\x6f\\xba\\x8c\\x6e\\x8f\\xef\\xd7\\xd2\\x91\\x18\\x4a\\xd2\\xae\\x06\\x69\\x89\\x73\\x20\\x92\\x7f\\x10\\x87\\x44\\x45\\x4e\\x45\\x0a\\x52\\xa0\\xf0\\xbb\\x5a\\xe1\\x4a\\x96\\x4d\\x90\\x22\\xa8\\x2e\\xf7\\xa0\\xd9\\xde\\x15\\x18\\xce\\xc7\\x15\\x21\\x04\\x6d\\x17\\xdf\\x88\\x65\\x83\\x8d\\x64\\xaa\\x02\\xc9\\xf7\\xa1\\xea\\xbc\\x2f\\x4c\\x0c\\x23\\xdd\\xf6\\xcf\\x30\\x64\\x7b\\x21\\x6c\\x09\\x4d\\x93\\x24\\x3d\\x2a\\xac\\x70\\x23\\xb5\\x1a\\x21\\x40\\x38\\x2e\\xec\\x00\\xe9\\x6a\\x63\\x72\\x3b\\xe8\\x4d\\x7e\\xfb\\x74\\xfe\\xc1\\x8c\\xd8\\x40\\xaa\\xbc\\x5b\\x11\\x42\\x72\\x01\\x48\\xd6\\x41\\x9f\\x4c\\x69\\xfb\\xbd\\x13\\x50\\x40\\x35\\xbd\\x06\\x10\\xb0\\xea\\x61\\xef\\xdf\\x80\\x0a\\x82\\xbc\\x75\\x45\\x99\\x4e\\x94\\x5c\\xe1\\xb7\\x2b\\xbe\\x51\\xb8\\x90\\x3b\\x3e\\xcc\\x00\\xc6\\xd8\\x2c\\xc6\\x44\\xa8\\xf7\\x9e\\xf8\\xe8\\x1b\\x89\\x69\\xe0\\x4e\\x14\\xee\\x27\\xd0\\x86\\x13\\x69\\xb3\\x40\\x08\\x5d\\xb4\\xc4\\x03\\x79\\x4c\\x55\\x40\\x33\\x16\\xce\\x4f\\xa0\\xe4\\x03\\xae\\x26\\xda\\x5e\\x1f\\xc5\\xaa\\x3d\\xe7\\xea\\x64\\x3c\\xb0\\xfe\\x9f\\x82\\xa2\\xd1\\x4c\\x60\\x9d\\xdb\\x20\\x87\\x9e\\xa6\\xe8\\xe5\\xcb\\x0c\\xe2\\x58\\x60\\xbe\\x48\\x20\\x02\\x58\\x6b\\x43\\x5d\\x7e\\xaa\\x19\\xf5\\xc3\\x22\\x36\\x40\\x6a\\xc5\\x03\\xe1\\x70\\x4c\\xd4\\x60\\x23\\x11\\x4a\\x91\\x4e\\xec\\x06\\xb5\\xa6\\xf0\\x63\\x1d\\xa2\\xf4\\xa3\\x2a\\x15\\xe1\\x66\\xaf\\xfa\\x86\\xc6\\xa1\\xec\\xcf\\xf4\\xb5\\xc0\\xb3\\x38\\xd9\\x6a\\xcc\\x3b\\xa3\\xba\\xe2\\xe9\\x22\\xa4\\xce\\xe7\\xd6\\x95\\x4c\\x0c\\x6c\\x43\\x7e\\x4d\\x0b\\x5e\\x09\\x2d\\xc6\\xc6\\x00\\x00\\x36\\x76\\xf8\\x05\\xb4\\x11\\x61\\x4a\\x50\\x10\\x65\\x50\\x5c\\xa0\\x21\\x02\\x0c\\x29\\x09\\x88\\x23\\x7b\\xa8\\xab\\x0a\\xf4\\x22\\x3f\\x1d\\x93\\x10\\xf4\\xc0\\xc3\\x52\\x0c\\xc7\\x3c\\xd5\\x92\\x31\\xad\\x87\\x80\\x19\\x06\\x13\\x68\\x60\\x8b\\x52\\xac\\x72\\x12\\x23\\x00\\x23\\xe8\\x28\\x56\\x24\\xd2\\x29\\x70\\x94\\xee\\x7d\\x40\\x48\\x3c\\x9d\\xea\\x43\\x9a\\xe9\\x18\\x4c\\x0a\\xf2\\x4d\\xcb\\x49\\x95\\xb0\\xf7\\x90\\x4b\\x45\\x2a\\x7b\\x3f\\x6f\\x45\\x53\\xd0\\xef\\x34\\x37\\x14\\x78\\x1e\\xd9\\x47\\x56\\x16\\x79\\xb0\\xb6\\x32\\x2e\\x9b\\x47\\x30\\xde\\xe3\\xfa\\x75\\xc4\\x10\\x10\\x89\\xf4\\x7f\\x1f\\x38\\x8e\\xe6\\xf7\\x04\\x8e\\xdb\\x26\\x20\\x65\\xba\\x49\\xcb\\x33\\x4c\\x29\\xd8\\xe7\\xdf\\x64\\x8e\\x05\\x93\\x83\\xb0\\xcf\\x4a\\xc2\\xc1\\x17\\x96\\x23\\x63\\x7e\\x6c\\xb5\\x11\\xb5\\x8a\\xbe\\x65\\x4c\\x03\\x4e\\xc5\\xcb\\x61\\xc4\\x8b\\x26\\xcd\\x6b\\x36\\xdf\\xcc\\xc3\\x7a\\x24\\x1c\\x64\\xb1\\x83\\x64\\x4b\\x6d\\xeb\\xc7\\x53\\x5c\\x86\\xc2\\x13\\xc7\\x48\\x4b\\x2b\\x3a\\x64\\xc5\\x38\\x92\\x10\\xe9\\xcc\\x13\\x2c\\xc2\\x16\\xfa\\xa1\\xc1\\xa4\\x4d\\xaf\\x91\\xae\\xf9\\x1a\\x81\\x8d\\x08\\xac\\x2b\\xcb\\x01\\x1c\\x42\\x21\\x4a\\x12\\x8a\\xc5\\xd9\\x7d\\x28\\x44\\x05\\x98\\xf5\\xdd\\xf3\\xe0\\x1a\\xf5\\xdc\\x3f\\xe7\\xb0\\xf3\\x2a\\x8a\\x3d\\x73\\xc5\\xdc\\x88\\x44\\xaa\\xe3\\x88\\x58\\x93\\x43\\xf3\\xc1\\x5e\\xa9\\x7c\\xf0\\x2c\\xd8\\x2f\\x58\\x23\\x14\\x57\\x86\\x2c\\xe5\\x4f\\xe8\\xf4\\x37\\xcb\\x71\\x04\\x58\\x49\\x71\\x46\\x5c\\x32\\x29\\x24\\x51\\x15\\xc0\\x0c\\x6d\\x8c\\xe8\\x48\\x73\\xd3\\xfc\\xc8\\x71\\x89\\xf0\\x5b\\xb0\\x62\\xab\\x89\\x52\\x11\\x12\\xb2\\xb2\\xaa\\x7b\\xa6\\xbf\\x8f\\x61\\x8d\\x2d\\x64\\x79\\x53\\x4d\\x48\\x4f\\xaf\\x03\\x64\\x11\\xf1\\x75\\x90\\x09\\x48\\x95\\x0e\\xc5\\xd2\\xc9\\x97\\x1c\\xc4\\xc1\\x9f\\x8f\\x12\\x32\\x40\\x80\\x14\\x89\\x78\\xc7\\xb4\\xf3\\x7a\\x06\\xf0\\x3a\\x82\\x46\\x7a\\x48\\x45\\xa6\\x54\\x82\\xc3\\x4a\\x3a\\x03\\x48\\x88\\x3e\\xb9\\xe2\\xfa\\x20\\x14\\xa4\\x07\\xa1\\xf4\\x24\\xc9\\xa0\\x30\\x5c\\x13\\x73\\x5d\\xab\\x9c\\xd0\\x1a\\x75\\xee\\xa1\\x02\\x76\\xfb\\x6f\\xa1\\xc0\\x17\\x1f\\x08\\xb3\\x1a\\x5f\\x02\\x30\\xe2\\x43\\x29\\x5e\\x66\\x4e\\x77\\x54\\x91\\x99\\x3c\\x79\\xcf\\xb0\\x94\\x36\\x28\\xe7\\x04\\x58\\x5b\\x5c\\xc8\\x5a\\xcc\\x62\\x70\\xc9\\xb2\\x94\\x06\\x31\\x41\\x96\\x3a\\x03\\xab\\x42\\x21\\x44\\xe1\\x40\\x5c\\x87\\x88\\xb1\\xf8\\xe8\\x73\\x40\\x24\\xd8\\x3b\\x70\\x4c\\x15\\xa3\\x56\\x14\\x13\\xd8\\x2f\\xb5\\x80\\x73\\x15\\x74\\x7c\\x36\\xb7\\x9f\\x82\\xdf\\x87\\x04\\x41\\x85\\x00\\x60\\x7f\\x70\\x68\\x18\\xc3\\x0c\\xb8\\x84\\xe9\\xe3\\x43\\x25\\x34\\x40\\x0b\\x71\\x97\\x3f\\x11\\xc1\\x98\\x76\\x11\\x4f\\x57\\xf0\\xf1\\x22\\x4a\\x3b\\xbe\\xc5\\x00\\x1c\\xdf\\x23\\x01\\x22\\xc3\\x00\\x5e\\x91\\x54\\x3a\\x93\\x6b\\x00\\xb1\\x9c\\xe4\\xf4\\x1e\\xd9\\x27\\x4a\\x7b\\xab\\x28\\x09\\x08\\xc3\\x91\\xa8\\xc1\\x42\\x70\\x0a\\x88\\x85\\xb1\\x87\\x42\\x57\\xd7\\x0d\\xd2\\xe7\\x3a\\x3e\\xe1\\xec\\xc7\\xc8\\x64\\xfe\\x2d\\xb9\\x76\\xeb\\x78\\x7d\\x18\\xfa\\x04\\x31\\xbe\\x10\\xa1\\xee\\x4f\\x13\\x58\\x24\\x17\\x5c\\x01\\x85\\x64\\xe8\\xc3\\x33\\x03\\x24\\xab\\x42\\x4f\\x34\\x2d\\xa9\\x0f\\xae\\xcc\\xc3\\xeb\\xe0\\x27\\x27\\xb0\\xc6\\x63\\x00\\x2a\\x40\\x97\\xaf\\xaa\\xdb\\x5f\\xdb\\xd9\\x60\\x40\\xd8\\xa6\\xde\\x6a\\x8a\\xbc\\x10\\x22\\x4a\\xba\\xcb\\x61\\xc0\\x4d\\x1c\\xc2\\xa3\\x09\\xe2\\x9b\\x00\\x62\\xad\\x40\\xec\\x81\\xc7\\xb2\\x3a\\xc7\\xd3\\x69\\x65\\x99\\x60\\x43\\x21\\x15\\xea\\xbc\\xdc\\x49\\x68\\x61\\x19\\x04\\x04\\xc8\\x1c\\xaf\\xc2\\xe6\\x39\\x6b\\xf8\\xc9\\x2a\\xb0\\x69\\xc2\\x18\\xa9\\xc7\\x71\\xaf\\x1a\\xd3\\xe8\\xe5\\xeb\\x49\\xcc\\x7f\\x27\\x31\\x35\\xf0\\x42\\x4b\\x24\\x4c\\x97\\x1b\\x73\\x29\\x93\\x10\\x8a\\xdd\\x1b\\xb5\\x7a\\x41\\xde\\x15\\x4f\\xca\\x20\\x46\\xa5\\xcd\\x17\\x41\\x3c\\xa2\\xa4\\xe9\\x30\\xa3\\xa6\\x22\\xd2\\x00\\x36\\xe8\\xb9\\x80\\x6e\\x61\\x30\\x73\\x18\\xd4\\x87\\x53\\xd0\\x31\\x1b\\x0b\\x00\\x58\\x50\\x60\\xbb\\xe9\\xb5\\xac\\x2e\\x70\\x17\\xde\\x4f\\xcc\\x05\\x86\\xbc\\x55\\x84\\x99\\x56\\xab\\x20\\x45\\x65\\x49\\x32\\x2c\\x4d\\x80\\x29\\x0e\\x39\\xa2\\xce\\x42\\x82\\x70\\xaf\\xb8\\x8c\\xc6\\xca\\xa4\\x45\\x4c\\x53\\x7d\\x52\\x59\\x55\\x6c\\x34\\xd2\\x30\\xf9\\xc7\\xa1\\x27\\x08\\x13\\x02\\x91\\xb2\\x0c\\x9f\\xe8\\x03\\x7c\\xc9\\xa5\\x8f\\x76\\xa5\\x88\\x3c\\xae\\xc8\\xa9\\x62\\x0c\\xb2\\x29\\xcb\\x09\\xf9\\x3b\\x31\\xdc\\x33\\x2f\\xdb\\x90\\xd4\\x95\\x10\\xd1\\x1f\\xc7\\x23\\x94\\x28\\x7c\\xa6\\xa1\\x08\\x96\\x52\\x03\\xc5\\x56\\x65\\xc4\\x3b\\x31\\x1e\\x41\\x5d\\xc5\\xbd\\xa5\\x57\\xca\\x6a\\xd5\\x05\\x19\\x72\\x6b\\x19\\x2c\\x01\\x21\\x85\\xa3\\x8d\\x6c\\xd3\\x71\\x65\\x61\\x80\\x71\\xdd\\xc8\\xf9\\x10\\xe3\\x60\\xd8\\x23\\xe7\\x33\\x6b\\x2d\\x0c\\x75\\x30\\x1a\\x39\\x3e\\xd2\\x91\\xea\\x3e\\x92\\xc8\\x5e\\x1c\\x94\\xb0\\x3c\\x08\\xaf\\x5b\\x9c\\x11\\x24\\x5a\\xaf\\xe0\\x2a\\xd5\\xb7\\x2a\\xad\\xf8\\xcb\\x82\\x96\\xaa\\x6d\\x24\\x29\\xdb\\x24\\x0a\\x75\\x13\\x47\\xfc\\x34\\xb8\\x07\\x8c\\x5b\\xe0\\x68\\xaf\\x02\\x81\\x3f\\xd4\\xc3\\xac\\x60\\x42\\x36\\x65\\xb8\\x64\\xae\\xb5\\x3f\\x19\\xa6\\x1a\\x81\\x5e\\x46\\xc4\\xd4\\xca\\xb8\\x02\\x66\\x33\\xc7\\x86\\x65\\xd9\\x88\\x03\\x46\\xb5\\xb5\\x97\\x86\\x36\\xe8\\x58\\x1a\\x27\\x09\\xe0\\xdc\\x46\\x45\\x68\\xac\\x60\\xb8\\x70\\x87\\xe5\\xfd\\x09\\x1b\\x00\\x3e\\x0e\\xf6\\x38\\xed\\x44\\x50\\x18\\x5c\\x38\\x31\\x58\\x54\\x80\\xd9\\x39\\xd6\\x1a\\x3c\\x76\\x6c\\xdf\\x94\\x29\\x94\\xa6\\x23\\xe6\\xdf\\xe8\\xf1\\xe4\\x1c\\x8d\\xda\\xf1\\x56\\x0f\\x59\\xc4\\x75\\xcf\\xa0\\xfe\\x32\\xa0\\x35\\x89\\xcf\\x25\\x31\\x1f\\x9f\\x46\\x54\\x51\\x9d\\x52\\x1b\\x9d\\xe6\\x80\\xb5\\x9d\\x28\\x21\\x4f\\x29\\x00\\x90\\x6c\\xc3\\xa3\\x6b\\x30\\x6d\\xd4\\x75\\x82\\x6a\\x2d\\xa0\\xed\\x92\\xf4\\xa4\\xae\\x44\\x04\\x80\\x90\\x09\\x22\\xfe\\xc8\\x21\\xfd\\xa8\\x49\\x30\\xf1\\x44\\xb8\\x24\\x80\\x94\\x0e\\x04\\x36\\x68\\xf1\\xb6\\xd2\\x01\\x74\\x08\\x4c\\xa2\\x3c\\x10\\x01\\xfe\\x2a\\x58\\x83\\x88\\x4c\\xcd\\x18\\x31\\x6b\\xca\\x62\\x10\\x42\\x9b\\xd6\\xd4\\x01\\x2d\\x96\\x42\\xa7\\x72\\x12\\x8a\\xfa\\x2b\\x84\\x37\\x14\\x58\\xa5\\x8a\\x21\\x24\\x3c\\x97\\xe5\\x8a\\x40\\xb1\\x58\\xa6\\x58\\xa0\\xe2\\x31\\x20\\x05\\x42\\xd0\\x2c\\x54\\x41\\x4c\\xec\\x7a\\x2c\\x13\\x99\\x41\\x50\\x12\\x21\\x1b\\x1e\\x27\\x5d\\x79\\xf3\\xc8\\x06\\x3c\\xaf\\x43\\x00\\x29\\xf8\\x22\\xd4\\x0b\\x74\\xd9\\xf9\\x85\\xd7\\xe1\\x5c\\x66\\xf6\\x7e\\x8a\\x15\\xdf\\xcc\\x30\\xfe\\xca\\x0b\\x89\\x64\\x4a\\xd6\\x79\\x68\\x27\\x16\\xc9\\x31\\xbc\\x61\\x06\\x27\\x0b\\x12\\x8b\\x1d\\x60\\xef\\x28\\x81\\x15\\x85\\x26\\x98\\xef\\x3e\\x79\\x42\\xdd\\x37\\x30\\x7d\\x11\\x0d\\x13\\xc8\\x60\\x33\\xeb\\x92\\xd3\\xe4\\x32\\xf3\\x19\\x49\\xbf\\x88\\x2a\\xf3\\x60\\xfa\\xe6\\x25\\x26\\x20\\x8c\\xbf\\x1f\\xdb\\xa0\\x3d\\xef\\x46\\x72\\x53\\xf8\\xf8\\x9c\\x95\\x06\\x68\\x1a\\xc0\\x77\\x2d\\x8c\\x32\\xe1\\xc1\\xb8\\x72\\x0f\\x6b\\x24\\x81\\x57\\x0d\\x70\\x46\\xf2\\xff\\x17\\x90\\xe5\\x1d\\x5c\\xbc\\x9d\\xbd\\x00\\x7a\\xd2\\x07\\xb0\\xc2\\x97\\x51\\x40\\x3f\\xa1\\x89\\x40\\xae\\x48\\x51\\xa5\\xba\\xbd\\x93\\x98\\x30\\xdc\\x0f\\x61\\x4d\\xf2\\x65\\x95\\x71\\x0b\\x5c\\x1b\\x23\\xc7\\x48\\xeb\\xff\\xf0\\x30\\x07\\x1a\\xcc\\x09\\x90\\xb7\\x8c\\x1c\\xb5\\x92\\xf9\\x74\\x15\\x51\\x29\\x72\\x34\\xdc\\x1d\\xb6\\x9a\\xce\\x68\\x94\\x15\\x45\\xd9\\x32\\x17\\x94\\x2f\\x63\\x76\\xe6\\xe3\\xac\\x9b\\x82\\x6a\\x6b\\x64\\x5a\\x20\\xa8\\x99\\xf3\\xaa\\xfc\\x20\\xaf\\xdf\\x0a\\x8b\\x0b\\x0d\\xaa\\x23\\x3c\\xcd\\x89\\x1d\\xcc\\x17\\xba\\x29\\x60\\x22\\x72\\x01\\x94\\x43\\xe4\\x54\\x58\\xab\\xe2\\xb2\\x40\\x05\\xd3\\x43\\x5c\\x03\\x8b\\x75\\x12\\xd0\\x64\\x84\\x61\\x42\\x2c\\x1a\\xe2\\x6f\\x72\\x46\\xc1\\x4d\\x51\\x98\\x85\\x98\\x87\\x32\\x2f\\x1a\\x31\\xb6\\xe6\\x61\\x4b\\xb0\\x89\\x55\\x84\\x6d\\x61\\x4b\\x60\\x1d\\x4c\\x0c\\xc2\\x58\\x1a\\x2c\\xc2\\x48\\xc7\\x89\\x3d\\x96\\x55\\xf5\\x34\\x2f\\xa1\\xcc\\x3c\\xc4\\xd8\\x07\\xa8\\xe5\\x9d\\x49\\xf5\\x18\\xf4\\x6d\\xa3\\xe5\\x3d\\x5f\\xb7\\x87\\xf1\\x99\\xfd\\xe1\\x21\\xdf\\x34\\x41\\x23\\x41\\x13\\xe6\\x87\\xea\\x2b\\x42\\xbe\\x75\\x78\\xe6\\xe0\\x28\\xa7\\xe0\\xb5\\x8b\\x21\\x6e\\xfb\\xd9\\xd1\\x0d\\xc9\\xb9\\xc2\\x5c\\xb4\\xda\\x0d\\xd0\\xdd\\x99\\x59\\xd0\\x5b\\xa1\\xf2\\x16\\x76\\xd4\\x10\\x43\\xa7\\x56\\x3e\\x32\\x1e\\x68\\x59\\xc5\\x29\\xa0\\x65\\x86\\xd1\\x82\\x0e\\x00\\xed\\x88\\xbf\\x52\\x3f\\xb5\\xc9\\x65\\x6a\\xe2\\x15\\x01\\xf2\\xb2\\x25\\xb3\\x02\\x94\\xc7\\xd7\\x8c\\x75\\xbd\\x76\\x6f\\xc0\\x4d\\x60\\xb6\\x3a\\xd9\\xc8\\x33\\xae\\xc9\\x8d\\x88\\x68\\x41\\x1a\\x8b\\x6b\\x8d\\xd5\\x82\\xcd\\xf4\\x58\\x2d\\x01\\x4e\\x61\\x8c\\x19\\xcc\\x1b\\x3b\\x1b\\x2d\\x46\\x2d\\x39\\xa3\\xd5\\xb9\\x53\\xc3\\x03\\x46\\xcd\\x8d\\x91\\x6a\\xc8\\xc0\\xa0\\xee\\x05\\x47\\x4f\\x5c\\xd9\\xaa\\x9c\\xbd\\x1f\\x96\\xee\\x9f\\x14\\x47\\xec\\xfb\\x20\\xb1\\x1e\\x4f\\xd9\\xc6\\xd8\\xe2\\xb3\\x42\\xe9\\x42\\xe7\\xa9\\x0a\\xf6\\xda\\x6f\\x07\\x9a\\x9a\\x3c\\xd5\\xb7\\x86\\x52\\xd0\\xe3\\xa6\\x37\\x2d\\xbf\\x30\\x24\\x43\\xca\\x16\\x89\\x60\\xf1\\x82\\x8c\\x02\\xb6\\x62\\xa2\\x1c\\x21\\xa6\\x21\\x52\\x8c\\xcd\\x0e\\x51\\xcc\\x96\\x81\\xa5\\x67\\x9f\\x8d\\x3d\\x2e\\x69\\x37\\xb0\\x01\\x79\\xba\\x19\\x82\\x01\\x33\\xbe\\x09\\x17\\x81\\xa5\\x99\\xe8\\x71\\x44\\x91\\xa9\\x80\\x11\\x7b\\x23\\x1e\\xcd\\x80\\x41\\xe3\\x07\\x5d\\x91\\x9e\\xe9\\x7c\\x12\\x4c\\x2e\\xb5\\x51\\xd1\\xc1\\xc4\\xc2\\xe4\\x38\\x9f\\x11\\x26\\x1a\\x6c\\xbb\\x40\\xdf\\x29\\xb4\\x86\\x58\\x78\\x8f\\x6e\\x44\\x12\\x7e\\x48\\xae\\x82\\x54\\x8d\\xa1\\x79\\x7e\\x59\\x41\\xc8\\x53\\x1e\\x25\\xa6\\xcf\\x96\\x4d\\x04\\xa4\\x7c\\xad\\x02\\x30\\x6b\\x97\\x5d\\xba\\x85\\x20\\x49\\x49\\x2b\\x02\\x70\\xec\\x9d\\x74\\x8c\\x9b\\x12\\xb7\\xab\\xee\\x2a\\x82\\xd1\\x07\\xc8\\xbd\\x45\\xa3\\x71\\xa3\\xd3\\xe6\\x88\\x03\\xc4\\x19\\x78\\x82\\xf2\\xa9\\xc8\\x61\\xe6\\xc7\\x96\\xd1\\x00\\xd1\\x9b\\x98\\xaa\\x37\\xb0\\xfe\\xee\\x93\\x0c\\x53\\x0b\\xa6\\xc2\\x17\\x0e\\xad\\x51\\xa4\\x98\\x54\\x30\\xa4\\xab\\x19\\xb2\\xa6\\xd6\\x0e\\x20\\x56\\xda\\x49\\x61\\xd0\\x60\\x5e\\x32\\x50\\xd0\\xa7\\x7f\\xef\\x5f\\xa4\\xea\\x85\\xc0\\xf5\\x41\\x97\\x60\\x15\\x7f\\xf1\\xd3\\x57\\x1b\\xda\\x99\\xa3\\x68\\x15\\x0d\\x26\\xf9\\x5b\\x41\\x52\\xcc\\x50\\x68\\xc2\\xec\\x18\\x3f\\x9b\\x4d\\x28\\x0e\\x8b\\x24\\x0b\\xc4\\x18\\x0d\\x24\\x08\\xe8\\x31\\xe5\\x0c\\x1c\\x7e\\xf1\\x41\\x66\\x69\\x20\\x51\\x7c\\x7e\\x76\\x5b\\xf8\\x90\\x61\\x56\\x9f\\x1c\\x33\\xa4\\x83\\x76\\xa0\\x81\\x8b\\xfe\\x25\\x87\\xec\\x9d\\x37\\x6c\\x01\\xbd\\xa9\\x0e\\xb5\\xd4\\x48\\x37\\x87\\x14\\x79\\x8e\\x6a\\xf3\\xe0\\x56\\x49\\xd1\\xca\\xb8\\xe1\\xc7\\x87\\x37\\xfa\\xb6\\x5d\\x63\\x10\\x85\\x86\\xb5\\x88\\x75\\x8c\\xb8\\x4e\\x89\\x55\\x91\\xfb\\x10\\x70\\x0f\\x89\\xb9\\x2c\\xbe\\x09\\x18\\xbd\\x49\\x79\\xa0\\x6d\\x31\\x5d\\xd6\\xbb\\x63\\x0e\\xf8\\xdb\\x80\\xce\\x60\\xed\\x15\\x7f\\x5f\\xad\\x41\\x76\\x58\\x60\\xf0\\x1d\\xff\\xd2\\x0c\\x73\\x2e\\x18\\x93\\x75\\x9d\\x8c\\xe2\\x27\\xee\\xe5\\x27\\x5e\\xd8\\x3d\\xde\\x34\\x12\\x4e\\xef\\x94\\xa6\\xf1\\x53\\x2d\\x92\\x22\\x10\\xb1\\x9d\\x31\\x3a\\x6e\\xcc\\x24\\x5a\\xc5\\x28\\x5b\\xa7\\xeb\\xe3\\x90\\xf8\\x93\\x9b\\x4a\\xf4\\x93\\xa3\\x63\\x85\\x08\\xed\\xb7\\xa3\\x76\\x92\\x9c\\xc0\\xef\\x96\\x4c\\x01\\xf0\\xcd\\xaa\\x92\\xca\\xca\\xb1\\x05\\x5d\\x64\\x0d\\x71\\xff\\x94\\xec\\x43\\x73\\xe2\\x10\\x00\\x02\\x48\\xfc\\x6b\\x56\\xad\\xad\\x1b\\xc3\\x84\\x00\\x65\\x41\\xd3\\x12\\x37\\x6e\\x98\\x8d\\x96\\x73\\x86\\x75\\x14\\x4f\\x52\\x7f\\x44\\xd6\\xaa\\x91\\x69\\x36\\x0e\\xe6\\x3a\\x7c\\x8a\\x7e\\x41\\x85\\xf3\\xf0\\x71\\x29\\x73\\x73\\x9c\\xb9\\xd6\\x5d\\x52\\x4c\\xaa\\xcc\\x89\\x87\\x80\\x04\\x0b\\x26\\x8b\\x59\\x95\\x0d\\x9f\\xfd\\x23\\xe0\\x82\\x06\\x97\\x18\\x05\\x74\\xc6\\xa3\\x64\\x38\\xe0\\x4d\\xc6\\x0a\\x9e\\xdd\\x7d\\xa9\\x3e\\x08\\xc2\\x1a\\x40\\x69\\xe9\\x1b\\x5e\\x41\\xc9\\x2e\\x5a\\x7e\\x9d\\xad\\x05\\x57\\x62\\x7d\\x8f\\xa2\\x1b\\xd6\\x5a\\x2d\\x8f\\xb3\\xa3\\x4c\\xa6\\xb5\\x82\\x50\\xeb\\x0e\\x46\\x18\\x4a\\x75\\xe2\\xae\\xfd\\xb1\\xe2\\x85\\xf4\\x5a\\xd2\\xa0\\x08\\x79\\x2a\\x7d\\x40\\xd5\\x3a\\xa0\\xec\\xf2\\xc1\\x15\\x73\\x6f\\x09\\x61\\x4d\\xcf\\xc1\\xed\\x6c\\x6e\\x66\\x7e\\x44\\x22\\x0a\\x55\\x0d\\x6b\\x50\\x07\\x1f\\xaf\\x5b\\xae\\x5e\\x84\\xcf\\x33\\x48\\x93\\x4f\\x0a\\x89\\xa9\\xe8\\x5a\\x79\\x9d\\x36\\x4a\\xda\\x54\\x7d\\x35\\xf5\\x12\\x92\\x1a\\x4d\\xfd\\x30\\xa1\\xbc\\x71\\x29\\x9d\\xf8\\x40\\xe1\\x46\\xb1\\x14\\x5a\\xc4\\xb8\\x7d\\x1c\\x06\\xa7\\x4d\\x9c\\xd6\\xe0\\x0b\\x62\\x7e\\xf7\\x6c\\x86\\x0b\\x56\\x13\\x32\\xc8\\xdb\\x25\\xed\\x69\\x40\\x01\\xbe\\xb0\\xfd\\x5b\\x0c\\x43\\x8c\\x18\\x00\\xe1\\xbb\\xb3\\xd4\\x11\\x66\\xc4\\x82\\x12\\x3a\\x86\\xa9\\xd6\\x39\\x83\\x50\\xa9\\x9e\\x9f\\x98\\xd6\\x1f\\x48\\x2c\\x07\\x58\\xee\\x3a\\x99\\xce\\xc6\\xea\\xd8\\x84\\xc0\\x86\\x37\\x3f\\xdc\\xa3\\x0f\\x55\\x46\\x89\\x93\\x68\\x13\\xcc\\x0e\\x89\\x17\\x75\\x65\\x9a\\x9d\\xc9\\x19\\xb9\\xef\\x19\\x67\\x26\\x28\\xa4\\x89\\x33\\xeb\\xa1\\x03\\x5d\\x0a\\x3d\\x4a\\x2a\\xbb\\x74\\xcf\\x0b\\x2b\\x3a\\x8d\\x9f\\x6b\\x52\\x45\\xf4\\xee\\xd8\\x02\\x59\\x43\\x11\\x5c\\x24\\xd0\\x1e\\x3e\\x3e\\x8b\\x70\\x56\\x6c\\x4a\\x33\\x43\\x72\\xb5\\x70\\x22\\x18\\xa9\\xa1\\xbb\\x56\\x9b\\x94\\x4c\\xc7\\xa4\\xc7\\x82\\x64\\x0f\\xe0\\x4c\\xdf\\x06\\x6a\\x66\\x1a\\x26\\x50\\x9e\\x97\\x50\\x28\\x8c\\x78\\xd9\\x90\\x3d\\x61\\x89\\xfc\\x95\\x44\\x1a\\xc6\\x13\\x41\\x2c\\x98\\x04\\x8c\\x61\\x72\\xc5\\x54\\x60\\x4c\\x2c\\xab\\xb4\\x80\\x9f\\x73\\xec\\x55\\x94\\xda\\x44\\x7c\\x0f\\x65\\x7c\\x22\\xe0\\x00\\x4c\\x2b\\x92\\xc2\\xcb\\x34\\x4c\\x00\\xee\\xb3\\xfd\\xfe\\x66\\xbc\\x63\\xb4\\xeb\\xbf\\x18\\x83\\x6b\\xcb\\x66\\xf0\\x1f\\x65\\x38\\xe7\\x46\\x50\\x1c\\x3f\\x03\\x64\\x3a\\x4e\\x20\\x33\\xb9\\xf8\\x55\\x93\\x8c\\x2a\\x72\\xcd\\xc1\\x94\\x20\\xcc\\x08\\x16\\x34\\xde\\x65\\x17\\xf6\\x9b\\xd0\\x2b\\x4e\\xff\\x4d\\x5e\\x96\\x4d\\x76\\xf0\\x68\\xf1\\x6a\\xa1\\xb4\\x33\\x66\\x4d\\x8f\\xc2\\x54\\xbe\\xf8\\x22\\xce\\xec\\x7d\\xb3\\xfe\\x58\\xb6\\x0e\\x78\\x06\\x14\\xa1\\xfc\\xf8\\x87\\x0f\\xb2\\xcf\\xe6\\xce\\xe8\\x83\\x11\\xd7\\x03\\x29\\x24\\xcb\\x8e\\xeb\\x7c\\xa0\\x6b\\x7f\\x0a\\xa0\\xc1\\xbc\\x35\\xd8\\xbd\\x04\\x0a\\xd6\\xc3\\xd0\\xa0\\xe1\\xfa\\x98\\xaf\\x98\\x3e\\x46\\x31\\x76\\x70\\x33\\x45\\x1c\\x35\\x93\\xf5\\xfb\\x60\\x06\\x64\\x6c\\x0e\\xb4\\x4c\\xac\\x0a\\x21\\x87\\xb1\\x60\\x8b\\xb2\\x4e\\x28\\x28\\x09\\x82\\xbd\\x74\\x80\\x00\\xfd\\x52\\xc0\\x2e\\x25\\x2b\\x2f\\x58\\x2b\\x29\\x40\\x74\\x05\\x43\\xe1\\xda\\xaf\\x64\\x38\\x92\\x5c\\x27\\x68\\x20\\x31\\x02\\x84\\xb6\\x6a\\x18\\xb1\\x2c\\x54\\x46\\x1e\\x0f\\x10\\x5b\\x9d\\xe5\\x5a\\xad\\x9a\\x3f\\xc5\\xdd\\x7a\\x9e\\xe5\\x10\\x06\\xce\\x3e\\x1e\\xb4\\xd5\\x4e\\xed\\xb4\\x8b\\xf3\\x35\\x74\\x2a\\x63\\xd0\\x72\\xc0\\x32\\xc6\\x54\\x0d\\x5a\\x86\\x41\\x68\\xa4\\xe1\\xc3\\x5f\\x23\\x21\\x69\\x83\\x70\\x4d\\xb3\\x9a\\x99\\xe4\\x3d\\x6d\\xe1\\xca\\x63\\x09\\x2f\\xe6\\xd6\\x0e\\x86\\x46\\x02\\x24\\x55\\x38\\x44\\x66\\xfd\\x4b\\x2d\\xf0\\x6c\\x47\\xe7\\x70\\x9e\\xc4\\x92\\xed\\x41\\x2f\\x10\\x6d\\xe1\\x89\\xa3\\xd3\\x8f\\x8c\\xc0\\x28\\x44\\xf1\\x92\\x2d\\x2d\\xcc\\x1c\\xf4\\xac\\x01\\xad\\x44\\x11\\x79\\x04\\xbb\\xaf\\xcf\\x20\\x95\\x72\\xe1\\x36\\x47\\xfe\\x01\\x49\\x17\\x06\\x27\\xa5\\x02\\x4d\\x6c\\x32\\xac\\x92\\x0b\\x86\\x60\\x62\\x34\\xdc\\x94\\x14\\xbf\\x9e\\xa1\\xd0\\xbc\\x70\\xcc\\x39\\xe9\\x2b\\x10\\x2c\\x01\\x0b\\x9a\\x8d\\xcc\\x84\\xde\\x4f\\xf6\\xa9\\xd6\\xb6\\x86\\x91\\xed\\x69\\xc1\\x37\\x24\\x1e\\x51\\x1a\\xda\\x10\\x5b\\x3b\\xb6\\x2b\\xed\\x89\\xc3\\xd1\\x28\\x18\\xdf\\x68\\xdc\\x83\\xba\\xa5\\x61\\xc8\\x7a\\x38\\x68\\x34\\x10\\x14\\x30\\x34\\xa3\\x05\\x23\\x84\\x83\\xb5\\x2b\\x46\\x15\\xca\\xa9\\x06\\x17\\xdf\\x55\\xb5\\xa0\\x5b\\x82\\x07\\x8e\\xb1\\xd6\\xc0\\xdb\\x2d\\xd6\\x92\\x06\\xa0\\x75\\xf7\\x01\\x05\\xa6\\x07\\x89\\xc7\\x4b\\x84\\xd4\\xcd\\xd3\\x76\\x7e\\x23\\x19\\xfe\\xb2\\x6b\\x3e\\x05\\xd5\\x06\\x45\\x00\\x6a\\xbd\\x80\\x04\\x99\\xc4\\x46\\xc0\\x1d\\xbb\\xb5\\x0f\\x01\\x9b\\xcd\\x80\\x12\\xa3\\x15\\x86\\x61\\xb7\\xf8\\xe1\\xe3\\x01\\x98\\x51\\x97\\xac\\x5f\\x41\\xe7\\xba\\x64\\x8a\\x1b\\x0e\\x25\\xa4\\x97\\x19\\x69\\x1f\\x89\\xb1\\x10\\xcc\\x9a\\x27\\x6a\\xbb\\x69\\xdc\\x76\\x65\\x98\\x5a\\x6d\\xb8\\x69\\x14\\x58\\x42\\x9d\\xe3\\x5f\\x51\\x24\\x53\\x21\\x46\\x23\\x48\\xcc\\x1e\\x39\\xab\\x5a\\x84\\x26\\x44\\x8b\\xa3\\x6c\\x1a\\x12\\x20\\x40\\xad\\x4d\\x7d\\xc7\\x17\\xcb\\xd5\\xc0\\x01\\xc8\\x33\\xdb\\x9f\\x20\\x03\\xb5\\x94\\xc6\\xe4\\xb1\\xa7\\x0b\\x7c\\xcd\\x5f\\x99\\x14\\xa0\\x04\\xd8\\x79\\x49\\x69\\xa5\\x15\\xb0\\x46\\x30\\x29\\xc5\\xe0\\xa7\\x93\\x69\\x04\\xfa\\x11\\xc8\\xc1\\x30\\x5d\\x5a\\x98\\x8c\\x1d\\x00\\xa3\\x53\\xcb\\x78\\x2b\\x21\\x81\\x7c\\x4a\\x41\\x2a\\x33\\x39\\xf2\\x19\\x67\\x0b\\xe9\\xd5\\x95\\x16\\x69\\x88\\x25\\x6e\\x33\\xde\\xa6\\x2f\\x02\\x58\\x70\\xdd\\x61\\x66\\x78\\x9f\\xc2\\x9b\\x88\\xe3\\x63\\xf9\\x62\\x40\\xe3\\xed\\x6b\\xb5\\xda\\x42\\x22\\xf1\\x3b\\x0a\\x1e\\x1c\\x58\\x80\\x63\\x31\\x36\\x2c\\x6d\\x52\\xd9\\xfd\\x52\\x76\\x33\\xbc\\x9b\\x3f\\x8c\\x73\\x92\\x3a\\x42\\xde\\x8f\\x22\\xc6\\x60\\x83\\x87\\x53\\x9d\\x72\\x46\\xee\\x67\\x6f\\x06\\xc6\\xbb\\x5f\\x7e\\x49\\x26\\x0d\\x88\\x1e\\x4a\\x7e\\x20\\xdb\\x21\\x2b\\x23\\x3c\\x5f\\x4a\\x30\\x32\\xce\\x20\\xa8\\x3f\\xca\\x52\\x28\\xce\\xf3\\xec\\x23\\xcb\\x30\\x70\\xdc\\x9d\\xe2\\x8b\\xd5\\xe0\\x44\\x40\\x38\\x9b\\x20\\x0a\\x3c\\x45\\x85\\x1f\\xac\\x7b\\x9f\\x98\\xf2\\x79\\x06\\x79\\x42\\x82\\xb1\\x51\\xb8\\xb7\\x81\\x23\\xa4\\x89\\xc1\\x52\\xe4\\x72\\xb0\\x41\\xc7\\xce\\x52\\x5f\\x92\\x44\\x62\\x47\\xdf\\x52\\xd2\\x02\\x86\\xcc\\xd1\\x10\\x5b\\x18\\xa1\\xef\\xb4\\x5e\\x46\\xd5\\x97\\x23\\x28\\x52\\xec\\x75\\xe6\\x9d\\xa0\\xd9\\xdb\\x51\\x21\\xa6\\x18\\x54\\x43\\x08\\xf1\\xd2\\x00\\x71\\x30\\xfd\\x26\\x8e\\x38\\xb2\\xd3\\xe3\\x0e\\x04\\xa8\\xea\\x0e\\x96\\xd9\\xc4\\xf5\\x38\\xce\\x51\\x1d\\x1a\\x45\\xc4\\x10\\xb6\\x66\\x90\\xce\\x8b\\x34\\x6f\\x86\\xa0\\x7b\\x80\\xf2\\xdd\\x52\\x49\\x89\\x65\\x9a\\x3e\\xf1\\xbc\\x44\\x1c\\xa0\\xc6\\x8c\\x00\\x84\\xf9\\x92\\x6a\\xdc\\x54\\xa3\\xd8\\x85\\x15\\xf2\\x1e\\xf8\\xa0\\x8d\\xbf\\x60\\xb2\\x4e\\x05\\x0b\\x04\\x4f\\x1a\\xdb\\xaa\\x29\\x6d\\x93\\x62\\x0c\\xb7\\xa9\\xbb\\xf9\\x5f\\x08\\x59\\x25\\x03\\x7a\\x9c\\x7e\\x08\\x03\\x5c\\xf3\\x17\\xd6\\x87\\x7c\\x90\\x72\\x68\\x47\\x8a\\xdc\\x19\\x53\\x74\\x54\\x40\\x13\\xc3\\xaa\\x20\\xb6\\x53\\x9e\\x2b\\x83\\x8b\\x70\\xea\\x07\\x70\\x1f\\xb8\\x8b\\x0d\\x89\\x5d\\x1d\\x2d\\x10\\x09\\xdd\\x22\\x3b\\xa3\\x31\\x08\\x1b\\x39\\x08\\xdd\\xa1\\x82\\x18\\xeb\\x66\\xef\\x90\\x24\\x26\\xe2\\x7d\\x7e\\x39\\x0e\\x80\\xb0\\x94\\x27\\x40\\xf2\\x3e\\x41\\x0e\\x00\\x3f\\x21\\x9f\\xaa\\xc9\\x9f\\x95\\xcb\\x0e\\x93\\x51\\x76\\xb7\\x1c\\x2c\\x22\\xc4\\x06\\xad\\xc4\\xb3\\xac\\x28\\xbf\\x12\\x0f\\xec\\x52\\x65\\xb7\\x03\\x35\\xb6\\x44\\x2d\\xb9\\x32\\x85\\xae\\x52\\x91\\xa4\\x1d\\x58\\x39\\x24\\x3d\\xfc\\xc8\\xe8\\x50\\x05\\x45\\x25\\x31\\x52\\x02\\x15\\xb0\\xcd\\xb1\\x86\\xb8\\x23\\x91\\x37\\xcb\\x50\\xbf\\xc9\\x28\\x3d\\x2c\\xbe\\x81\\x25\\x14\\x81\\xf8\\x95\\x31\\x12\\x07\\x1b\\xca\\x85\\x90\\x04\\xe1\\x72\\x15\\xaf\\x8e\\xc4\\x99\\x62\\x24\\x0c\\x95\\xab\\x5e\\xa0\\x70\\x05\\x42\\x36\\xe2\\x89\\x80\\x64\\x90\\x41\\xf5\\xc8\\x43\\x22\\xc3\\xf2\\x78\\xfd\\x90\\x70\\x68\\x7b\\xe0\\xe0\\x95\\xd3\\x8b\\x2c\\x1e\\x12\\x32\\xea\\xfa\\xdd\\x5a\\xe8\\x53\\x24\\x00\\xb3\\x21\\x81\\x32\\x2c\\x71\\xce\\x11\\x39\\xbf\\xab\\x3f\\xd1\\xe6\\xf4\\xd9\\x94\\x37\\x4f\\x6e\\x5c\\x09\\x81\\xb9\\x66\\xe9\\x20\\x5b\\xb9\\x74\\x0f\\xf2\\x2c\\x17\\x63\\xe4\\x68\\x2b\\x15\\x00\\xa4\\xbb\\x50\\xaf\\x48\\x04\\xd7\\x7a\\x58\\x58\\x21\\x6d\\x35\\xa3\\xc2\\x35\\x34\\x88\\xd1\\x4e\\x1e\\x0c\\xfe\\xc0\\x32\\x20\\x54\\x33\\xc4\\xd8\\x21\\x6b\\xf9\\xe6\\x11\\x5b\\x09\\x77\\x88\\x0f\\x63\\x48\\xab\\x40\\x99\\x42\\x89\\xad\\xb1\\xe1\\x1c\\xf2\\x6d\\x56\\x68\\x57\\x8e\\x64\\x83\\xb0\\x28\\xb6\\x70\\xb0\\x01\\xad\\x42\\x6b\\x33\\xd5\\x0b\\x20\\xe4\\xf0\\x7c\\xde\\x3a\\xd0\\xf3\\x97\\x4b\\x31\\x9a\\x1a\\x08\\x18\\x82\\x38\\xec\\x78\\x3f\\x82\\x3f\\x01\\x64\\x78\\xaf\\xd4\\xb0\\x2b\\x3c\\xf0\\x5a\\xa4\\x3b\\xfa\\xf4\\x3b\\xc4\\xbd\\xd1\\x04\\x53\\x21\\x39\\xd5\\xa4\\x0d\\xb1\\x03\\xf5\\xeb\\x6d\\xd4\\xa2\\x5e\\x21\\x5b\\x01\\x80\\x07\\x8a\\x0c\\x56\\xa5\\x7c\\xb1\\x61\\xfc\\x2f\\xae\\x2c\\x78\\xd4\\x12\\x56\\x08\\x4e\\x1c\\x4e\\x3e\\x65\\xc6\\x09\\x07\\x2f\\xcb\\x88\\x02\\xa3\\x50\\xcb\\x36\\xa0\\x8b\\xaa\\xed\\x49\\x7f\\x6b\\x89\\x73\\x19\\x21\\x19\\x31\\x95\\xc2\\x97\\x54\\x10\\xe6\\x56\\xda\\x2b\\x48\\x35\\x5a\\x8d\\x86\\x81\\xcc\\x92\\x91\\xc2\\x8a\\xf7\\x0e\\xb1\\x47\\x18\\xa5\\x09\\xac\\x52\\x37\\x4d\\xf0\\xde\\x72\\x00\\x71\\x50\\xc9\\xf0\\x35\\x8f\\xae\\x3e\\x07\\x7a\\x95\\xdd\\x53\\x04\\x0e\\x5d\\xa7\\x38\\xa9\\xa5\\xb5\\x32\\x72\\x93\\xa2\\x4b\\x04\\xf1\\x05\\x4b\\x84\\x5b\\xb9\\xf5\\x9b\\x36\\x0b\\xcc\\x48\\x6c\\x89\\x5e\\xff\\x90\\x80\\x7c\\x64\\x00\\xc8\\x77\\x51\\xbf\\x81\\xc6\\x12\\x99\\x6e\\xdf\\xff\\x3c\\xf6\\xc6\\x25\\x61\\xda\\xd4\\x8a\\xf9\\x66\\x94\\x4d\\xcb\\x6d\\xa4\\x55\\x62\\xe8\\x8c\\x73\\x55\\x22\\xd6\\x71\\x62\\x6c\\x2f\\xab\\x77\\x0f\\x89\\x42\\xb8\\x4f\\xd9\\xa0\\xe6\\x05\\x77\\x6a\\x42\\x0d\\x4d\\x59\\x43\\x0a\\x90\\x13\\x02\\x94\\x4e\\x30\\x7f\\x3c\\x62\\x24\\x4f\\xbd\\xf8\\x63\\x45\\xd3\\xc6\\xc9\\x5d\\x60\\x7b\\x8f\\xcf\\x33\\x37\\x9a\\x22\\x40\\x17\\x72\\xf8\\x3f\\x24\\x00\\x51\\xd3\\x36\\x2f\\x90\\x03\\xe1\\xd1\\xe3\\xea\\x57\\xa1\\xb9\\x65\\x21\\x7d\\x1a\\x78\\xcd\\x8a\\x00\\x56\\x21\\x8a\\x81\\x41\\x19\\x87\\xa0\\xb0\\x50\\xc3\\x1b\\x3b\\x3c\\xd8\\x5b\\x2f\\x61\\xb0\\xab\\x97\\x1e\\x32\\x13\\xad\\x49\\xd4\\x45\\xd6\\x33\\x1e\\x25\\xc0\\x45\\xb6\\x23\\x01\\x39\\x8a\\xd9\\x06\\x26\\x63\\xa7\\xc1\\x9c\\x4c\\x60\\x4e\\xf8\\x9e\\x0b\\xb7\\x59\\x99\\xd6\\xab\\xbd\\xaa\\xa5\\x0c\\xb1\\xe5\\x88\\x4c\\x97\\x03\\xa3\\x07\\x74\\x4f\\xf3\\x30\\x2e\\x89\\x9f\\x8c\\xdf\\x5f\\x46\\xcc\\xc3\\xfc\\x8c\\xb0\\xdd\\x9f\\x08\\x43\\xc4\\xa8\\x8e\\x32\\xda\\x6e\\x49\\x96\\x25\\x35\\x81\\x6a\\x08\\x4a\\x6b\\xff\\xd0\\x8b\\x79\\x35\\xaa\\x09\\x03\\xfc\\x66\\x2e\\x2c\\x46\\xab\\x07\\x6f\\x79\\x43\\x64\\xf5\\xd0\\xd9\\xe9\\x9c\\xe4\\x98\\x23\\x77\\x48\\x3a\\x79\\x22\\xe4\\xc5\\xbd\\x20\\x41\\x1a\\x8a\\x06\\xbf\\x4d\\x38\\x56\\x8f\\x88\\x96\\x29\\xa6\\x8a\\xc9\\x4b\\x97\\xdc\\xa3\\x79\\x06\\xfe\\x99\\xcd\\xcd\\x41\\x05\\x4a\\x2b\\x51\\x7d\\x7b\\x61\\x4f\\x56\\x2b\\x8a\\xe1\\xbd\\x1b\\x23\\x35\\xa0\\x8e\\x95\\xb7\\x95\\xda\\x43\\x64\\x53\\x52\\xbe\\x22\\xd3\\xb6\\x15\\x2e\\xd2\\x82\\x8e\\x4a\\xf9\\x93\\x5a\\x0c\\xc9\\x7f\\xe8\\xeb\\x7b\\x13\\xb1\\x50\\x01\\x90\\x5b\\xa1\\xf7\\x88\\x8e\\xe5\\x14\\x89\\xb7\\x5d\\x3e\\x4e\\x4a\\x25\\xb1\\xfe\\xec\\x0b\\xb5\\x1d\\xce\\x27\\x39\\xc4\\xb3\\x2f\\x8f\\x0e\\xfc\\xac\\xec\\x62\\xa6\\x3b\\x30\\xe3\\xcc\\x33\\x0d\\xa7\\xc1\\x08\\xaf\\x37\\xac\\x74\\x45\\x49\\x3a\\x27\\x1c\\x73\\x72\\x3f\\x04\\x07\\xef\\x10\\x67\\x76\\x5a\\xf6\\x78\\x49\\x94\\x3e\\xd3\\xc4\\x69\\x03\\xbc\\xf5\\x46\\x90\\xf2\\x34\\x83\\xd9\\x19\\x35\\xa6\\x8c\\xf6\\x84\\x48\\x68\\xdf\\x65\\x1d\\x13\\x74\\x77\\x7a\\x75\\x86\\x8f\\x0f\\x08\\xb4\\x04\\x18\\x71\\x86\\xd1\\xbe\\x09\\x58\\x2a\\xb4\\xb5\\x71\\xd0\\x5d\\x38\\x72\\xe2\\x48\\x0e\\x6b\\xda\\x0e\\xf0\\x16\\x2b\\x4b\\x1a\\xe7\\xc0\\x3d\\xe2\\x35\\x64\\xb5\\x49\\x73\\xb0\\x09\\x8f\\xe0\\x62\\xb8\\xe5\\x13\\xe8\\x82\\x08\\x5f\\x62\\x98\\x25\\x4c\\x4e\\x0f\\xe0\\x66\\xd7\\x44\\x4a\\xd5\\xe6\\xf5\\x49\\xd8\\x04\\x14\\xc9\\x1b\\x68\\xf8\\x4d\\x2d\\x5e\\x5a\\x89\\x21\\x58\\x72\\x6d\\xf3\\xe1\\xcc\\x29\\x09\\x49\\x9e\\x11\\x50\\x72\\x8c\\x44\\xf7\\xdc\\x4d\\x6a\\x1a\\x39\\x88\\xd7\\xe8\\xb6\\x60\\x7f\\x78\\x44\\x4a\\x72\\x64\\x04\\xc4\\xce\\xdc\\xce\\x78\\x2c\\xb4\\x1b\\xd8\\x1c\\x45\\x56\\xc6\\xad\\xd9\\x83\\x7b\\x93\\x85\\xfd\\xd9\\xe6\\x69\\x8c\\xeb\\x93\\xfc\\xef\\xac\\x85\\xd4\\x80\\xf1\\x7c\\xac\\x91\\x66\\x40\\xc5\\xf2\\x14\\xb8\\xbf\\x26\\x16\\xd1\\x3a\\x7c\\x81\\xb1\\x4f\\x5e\\x58\\x6a\\xce\\x33\\x72\\x13\\xb8\\x58\\xa7\\xbb\\x8b\\xeb\\xec\\x2d\\xf2\\xa6\\x48\\x7a\\x58\\xb4\\x07\\x7a\\x2c\\xb8\\x90\\x3c\\x25\\x1a\\x5a\\xb4\\x77\\x4d\\x33\\x5e\\xdf\\x4d\\x1c\\x3b\\x5d\\x45\\x66\\x41\\x31\\xab\\x1a\\x54\\xc7\\x84\\xdd\\x0e\\x9a\\x89\\xc1\\xb1\\x01\\xe9\\x8c\\x90\\x2e\\xfa\\x85\\x14\\x8f\\x4f\\xa0\\xb4\\x28\\xcd\\xa1\\x77\\x68\\x82\\x46\\xc2\\x82\\xf1\\xfa\\x19\\xc4\\xab\\x5c\\x81\\x85\\xd5\\xca\\x5b\\x08\\xb7\\x1e\\x8e\\x20\\x6d\\xc9\\xf0\\x12\\xcd\\x88\\x4c\\x6e\\x01\\x40\\xdc\\xe7\\xcb\\x55\\xf8\\x0d\\x43\\x67\\x5f\\x2b\\x8b\\x34\\xc2\\x89\\xa0\\x61\\xec\\xe7\\x53\\xfe\\x85\\x9c\\x16\\x27\\x22\\x51\\xdf\\x79\\x01\\xc1\\x4a\\xdc\\x40\\x90\\xe8\\x28\\x46\\x7f\\xe7\\x42\\x5f\\x34\\x39\\x34\\x41\\x58\\x6f\\x46\\xe3\\x58\\x40\\xa8\\x4c\\x29\\x4e\\x23\\xf6\\xb8\\xd2\\x4a\\x71\\x29\\x06\\xd1\\x8b\\x06\\xef\\xcb\\x75\\x14\\x87\\xf8\\x3e\\x8d\\xbd\\xa7\\xe5\\x3d\\xeb\\x32\\xbd\\xb8\\x0d\\x49\\x6e\\x0a\\x69\\x1a\\xbc\\x2d\\xcc\\xf0\\x13\\x31\\xb2\\x76\\x50\\x83\\xa6\\x6e\\xa9\\x11\\x42\\x12\\x10\\x34\\xc8\\xa5\\xa3\\x10\\xac\\x18\\x32\\x33\\xd6\\x0e\\x00\\xdc\\x4b\\x98\\x6a\\x15\\xac\\x6d\\xa1\\x1b\\xb8\\x2a\\xc3\\xad\\xfb\\x8b\\x33\\x49\\x0a\\xe8\\x73\\xc1\\x11\\x13\\x0e\\x65\\xf8\\x28\\xf6\\x9c\\x84\\x4e\\x5e\\x97\\xbe\\x70\\x6e\\x84\\x5b\\x5e\\xec\\xcc\\x89\\xb6\\x0c\\x58\\x03\\x75\\x23\\xc5\\x7d\\xd8\\x43\\x44\\xc9\\x1e\\x82\\xc2\\x4f\\x52\\x78\\x82\\x6e\\x0f\\xa1\\xef\\x9b\\xfc\\x79\\x90\\x85\\x74\\x46\\x04\\xe4\\xeb\\xed\\xf9\\x35\\xd6\\xf8\\x9c\\xf5\\x1a\\x2e\\xa0\\x6b\\xe8\\xf9\\xa1\\xad\\x69\\xd1\\x5f\\x56\\x11\\xd0\\x74\\x84\\x38\\xf0\\xc3\\xdf\\x09\\xce\\xdc\\x68\\x43\\xe2\\x8c\\xd2\\x66\\xc9\\x03\\xcf\\x03\\x54\\x7d\\xbb\\x94\\x0d\\x63\\x45\\x1b\\x04\\x75\\x0a\\x26\\xce\\xcc\\xc3\\x8c\\xa3\\x1b\\xbc\\x0e\\xe8\\x89\\x42\\x25\\xdc\\xc7\\x5d\\x0c\\x5a\\xf7\\x31\\x96\\x8b\\xd4\\x04\\xfe\\xcd\\x44\\x46\\x57\\x3c\\x8e\\x83\\x10\\x7a\\xe5\\x68\\x48\\xeb\\xc0\\x93\\x4b\\xb3\\xd9\\xa4\\x88\\x9d\\xe4\\x02\\x3d\\x63\\x8b\\x33\\x60\\xe0\\xfe\\xba\\x3d\\x2e\\xbd\\xa2\\x5b\\x78\\x3a\\xa0\\xac\\xf6\\xd2\\x69\\x5d\\xe0\\x08\\x56\\x7d\\xec\\x85\\x6b\\xce\\xea\\x6f\\x10\\x12\\x91\\xff\\xa3\\x50\\x19\\x01\\x53\\xa5\\xc0\\xf9\\x3c\\x25\\x02\\x6c\\x95\\x87\\xc8\\x88\\xab\\x95\\xd3\\x2a\\x64\\xc9\\x9b\\xac\\x68\\x04\\xf0\\xe2\\xa5\\x1e\\x9f\\x67\\x87\\x05\\x12\\x7f\\x39\\xcc\\x97\\x75\\x0d\\x59\\x2d\\xbe\\x52\\x01\\xfd\\x82\\xf3\\x11\\xad\\xdd\\x85\\x14\\x91\\xcd\\x0e\\x52\\xf7\\xfc\\xa5\\x38\\x35\\x7b\\x52\\x25\\x8d\\xc9\\x3c\\xa1\\xe0\\xfc\\x08\\x4b\\x1f\\xa7\\xb0\\x2e\\xcf\\x66\\xbc\\x04\\x08\\x1e\\xce\\x9b\\x67\\xe8\\x05\\x2a\\x3f\\xbc\\x73\\x47\\x5e\\x62\\x24\\x45\\xf6\\x38\\xed\\xee\\x8a\\x28\\x49\\xa0\\x91\\x11\\x15\\x9d\\x8c\\x57\\x7a\\x23\\x00\\x7a\\x84\\x17\\xca\\xb0\\xf8\\xf5\\x0b\\xd6\\x2c\\xec\\xcb\\xe8\\x14\\xca\\x1e\\xe3\\x03\\x7e\\x27\\xbc\\x89\\x3c\\x42\\xca\\xd0\\x4e\\xff\\x8b\\x3e\\x91\\x13\\xc9\\x52\\xba\\x90\\x05\\x2f\\xf1\\x7c\\x28\\x87\\xb8\\x0d\\x6d\\x7a\\xf1\\xf9\\x89\\xa6\\x5b\\xf1\\xa5\\x8e\\xfa\\xff\\x6b\\x68\\xba\\x88\\x30\\x65\\xe7\\x6f\\x61\\x8a\\x49\\xf0\\xc0\\xf1\\x99\\x6c\\x73\\x9c\\x87\\x6f\\x85\\x88\\xda\\xbf\\x66\\x5e\\xc0\\x49\\x3c\\x46\\x65\\xb2\\xc7\\xe4\\xbb\\x4a\\x84\\x92\\x76\\x94\\x46\\x09\\xea\\xbf\\xb7\\x51\\xb8\\x2a\\x85\\x20\\x70\\x16\\x72\\x82\\xb4\\x1a\\x73\\x02\\x13\\x5b\\x27\\x15\\x7b\\x44\\x7a\\x5d\\x8e\\x75\\x77\\x70\\xe5\\x09\\x98\\xf1\\x98\\x7d\\x1f\\xc2\\xee\\xa8\\x57\\x3d\\xd5\\xdc\\x7a\\x15\\xb3\\x48\\x7a\\x24\\xe6\\x16\\x86\\xad\\xf3\\x5f\\xe7\\xb5\\x76\\xeb\\x5a\\x87\\x6a\\xf2\\xeb\\x57\\x68\\xc7\\xbb\\xe2\\x11\\x01\\x6d\\x00\\x96\\x79\\x3a\\xc7\\xea\\x40\\xba\\x19\\x0b\\x11\\xb3\\x53\\x3d\\xa6\\x64\\xe8\\x8e\\x34\\x20\\xf1\\x6a\\x8c\\x2d\\x98\\xcc\\x0a\\x63\\xe3\\x44\\x5b\\x30\\xf1\\x44\\x01\\xb6\\xf8\\x1c\\x82\\x07\\x33\\xe4\\xa4\\x3f\\x71\\xa5\\xda\\x24\\xde\\xd1\\x56\\x29\\x22\\x51\\x3d\\xd9\\x47\\xb2\\xe1\\x0c\\x17\\x64\\x6c\\x92\\x22\\x97\\x63\\x64\\xc1\\x1b\\xb0\\x23\\x6c\\x25\\xeb\\xf7\\x62\\xb1\\x84\\x48\\xe2\\xf7\\x62\\x21\\xd0\\x50\\xe6\\x28\\xd2\\x35\\x4f\\xad\\x76\\x2d\\x50\\xe3\\xf7\\x3d\\x7f\\xbd\\x7b\\x70\\x10\\x52\\x65\\xa8\\xbd\\x81\\x5c\\xb8\\xa0\\x56\\x95\\x03\\x00\\x5b\\xea\\x5a\\x70\\xd3\\x6a\\x2d\\x0f\\x83\\x8f\\xfb\\x07\\x08\\x37\\x30\\xd6\\xae\\xb2\\x86\\xaa\\x34\\x07\\x52\\x07\\x6e\\x12\\xed\\xbe\\xea\\x04\\xd8\\x91\\x26\\x96\\xb2\\x08\\x44\\x24\\x67\\xe2\\x33\\xac\\xa3\\xbc\\x01\\x36\\x2b\\x50\\xc4\\x6a\\x1f\\x4e\\xf4\\x25\\xe7\\x72\\xa1\\x5d\\x0d\\xca\\x33\\x84\\x26\\x2f\\x02\\x05\\x72\\x67\\xb9\\x19\\x80\\x28\\x78\\x7a\\x13\\xbd\\x4c\\xcf\\xe5\\x26\\xf8\\x01\\x83\\xe2\\xfd\\x2a\\x82\\x1a\\x22\\x0a\\x7c\\xfb\\xf1\\x39\\xa7\\xce\\x4e\\x89\\x00\\x33\\xf8\\xa2\\x47\\xc1\\x3d\\x3f\\x91\\x87\\x06\\xfd\\xe4\\xb5\\x41\\x33\\xe8\\x97\\x06\\xaa\\x6e\\x4b\\xc1\\x7a\\x20\\x1a\\x38\\xb0\\x76\\xf8\\x27\\xde\\x10\\x21\\xde\\x7c\\xa7\\x78\\x43\\xf0\\x2f\\x91\\xd3\\x8c\\x77\\xc7\\x8c\\x9a\\x1c\\xa8\\x13\\x20\\xe2\\x61\\xbf\\xe3\\x07\\xde\\x0a\\x28\\xde\\x08\\x1e\\x8d\\x24\\x90\\x86\\x48\\x92\\x42\\x08\\x3b\\x32\\x9c\\x97\\x42\\xe3\\x95\\x55\\x03\\xcb\\x85\\x11\\x68\\xf6\\x25\\xb3\\x60\\xc9\\x96\\x12\\xc1\\x59\\x11\\x22\\xc2\\x9e\\xd7\\x1f\\x43\\x97\\x81\\xe1\\x0a\\xc2\\xe9\\x33\\x88\\x32\\x80\\x6a\\xb0\\x85\\xc3\\xa5\\x93\\x21\\xa1\\xa3\\xf0\\x32\\xcf\\xd3\\x8b\\x81\\x3b\\x61\\x3a\\x8f\\xba\\x89\\x33\\xd3\\x45\\x63\\xe6\\x1c\\xb3\\x53\\xb2\\x0d\\x4c\\x88\\x1d\\x1c\\x1b\\xed\\x04\\x2d\\xa9\\x91\\x8b\\xaf\\x67\\xbd\\x12\\x44\\x52\\xa0\\xe4\\xf7\\xb2\\x10\\x5e\\xe7\\xbe\\xaa\\x98\\x0a\\xa4\\x5b\\x36\\x5d\\xc9\\x32\\x77\\x6b\\x00\\x5c\\x9c\\x39\\xc2\\x71\\x24\\x98\\x78\\xf4\\x4b\\xe1\\x16\\xa8\\x8a\\x55\\xd9\\xe5\\x1d\\x59\\xea\\x7b\\x4f\\xcb\\x01\\xed\\xb4\\x15\\x61\\x03\\x52\\xf2\\xfe\\x32\\x78\\x11\\x45\\x0c\\x60\\x50\\x4b\\x77\\x08\\xb0\\x11\\xa0\\xce\\x62\\x25\\xe9\\xd0\\x13\\xa1\\xb4\\x13\\x66\\x95\\xba\\xc5\\xbb\\x4a\\xea\\xff\\xf5\\x63\\x81\\x96\\x1b\\x61\\x56\\x36\\x9f\\x34\\x1e\\xc1\\x2e\\x84\\x35\\xe1\\xbd\\x40\\x69\\xbc\\x38\\x05\\x61\\xf6\\x55\\x33\\x19\\x8e\\xa2\\xca\\x52\\x27\\xe1\\xe9\\x8f\\x7a\\x05\\x0d\\xb4\\x5b\\xc7\\x0a\\xc5\\x21\\xfa\\x22\\xd9\\xe5\\x57\\x43\\x00\\x12\\x4c\\xe2\\x8f\\x8b\\x84\\x60\\xc4\\x83\\x06\\x03\\x60\\x95\\x9c\\x2f\\xf2\\x0f\\xc0\\x6c\\x04\\x50\\xcd\\xe8\\x5a\\x71\\x55\\xea\\x31\\x6f\\x06\\xb0\\x2a\\x28\\xa3\\x9b\\x12\\x92\\x6c\\xf2\\x87\\x20\\xf3\\x9d\\x0d\\x70\\xca\\x26\\x62\\xe3\\xe0\\x7e\\xde\\x45\\x53\\xde\\x71\\x93\\x7b\\x2c\\xd4\\x44\\xac\\x30\\x11\\x10\\xaa\\xc6\\xb5\\x76\\xe7\\x39\\xde\\x3a\\x10\\x9a\\x9a\\xf5\\x43\\x59\\xae\\x4e\\x16\\x33\\x13\\x2e\\x30\\xcd\\x69\\x61\\x18\\x48\\x6a\\x81\\xad\\x28\\x29\\x29\\xca\\x1a\\x48\\x43\\x2f\\xac\\xe0\\x78\\x38\\x99\\x24\\x39\\xe2\\x81\\xfa\\x12\\x4b\\xf9\\xf0\\x8a\\x43\\x5d\\x35\\x43\\x82\\xb3\\x84\\x89\\x15\\x54\\x7f\\xcd\\xb5\\x03\\xce\\x59\\x64\\x95\\x80\\x05\\x87\\x2f\\x43\\x84\\x4f\\xd8\\x03\\x72\\xfe\\x08\\x9e\\x77\\xf7\\xa5\\xee\\x05\\x2c\\x2c\\x9e\\x72\\x8c\\x51\\xb6\\x14\\xa7\\xaf\\x08\\x13\\x01\\x50\\xe9\\x34\\x2e\\x4c\\x14\\xee\\x51\\x68\\xdb\\x2d\\x60\\xcc\\xbc\\x8b\\xad\\x63\\xf9\\x96\\x74\\x2f\\x5e\\xef\\x1a\\x64\\x65\\xa7\\xaa\\x54\\x7c\\xe7\\xc8\\x88\\x6b\\x67\\x21\\x82\\x71\\x3a\\x66\\x91\\x1a\\x19\\xa6\\x3b\\x90\\x7c\\x4a\\x80\\xfc\\x69\\x3b\\xb0\\x06\\xe3\\x68\\x0f\\xde\\x20\\x3f\\x96\\x30\\xc1\\xcc\\x5e\\x4e\\xb6\\x68\\x1c\\x48\\x28\\x74\\x17\\x05\\xe1\\x03\\x8a\\xd9\\x30\\x0f\\x0c\\x9c\\x2f\\x33\\xba\\x39\\xa7\\x84\\x4e\\x1d\\x78\\x02\\x7e\\x8c\\x2c\\x2f\\x03\\xa4\\xb3\\x1e\\x88\\x36\\x19\\x11\\x99\\x08\\x77\\x9e\\x42\\x74\\x88\\x66\\x8c\\xaf\\x67\\x6a\\xb6\\x09\\xb8\\xbe\\xc8\\x6f\\x65\\x38\\x17\\xb5\\x3b\\xad\\x85\\xf9\\x00\\x73\\x60\\xd1\\x56\\x99\\xa1\\x19\\xb9\\x75\\xe7\\xbb\\xbc\\xec\\x0b\\x64\\xc9\\x00\\x18\\x58\\x4f\\x7b\\xb7\\x59\\xcb\\x60\\x05\\xe8\\x3c\\x4c\\x0d\\xe8\\xc5\\x26\\x01\\x57\\xa4\\x4c\\x71\\x05\\xf8\\xde\\x93\\xa2\\xfc\\x28\\xdd\\x02\\xd6\\xcc\\xa1\\x9a\\xd9\\xa6\\x8d\\x77\\xdc\\xbf\\xe5\\xbe\\x6b\\x1d\\xbf\\x4f\\xd3\\xe5\\x1e\\x9c\\xd2\\xa7\\xcb\\xe6\\x28\\xc4\\xb2\\xe5\\xd0\\xea\\xa6\\x6f\\x84\\xb2\\xcd\\xf3\\x39\\x25\\xf6\\x51\\x83\\x38\\x7b\\x30\\xf4\\x26\\xc9\\xb0\\xf8\\xb0\\xa1\\x67\\x93\\x8a\\xa4\\xbc\\x0f\\x0d\\x49\\x1e\\x24\\x00\\x9d\\xd0\\x9d\\xba\\x06\\xb7\\x71\\xaf\\x8e\\x66\\xaa\\x3f\\x9c\\xde\\xeb\\xc9\\x21\\x53\\xe8\\xc6\\xbe\\xcf\\xaf\\xac\\xf3\\x56\\x50\\xa1\\xee\\xf4\\x34\\x06\\x6f\\x93\\x3f\\x27\\x32\\xcc\\x3e\\xc1\\x80\\xea\\x4b\\x29\\x3f\\x09\\xce\\x92\\x1f\\x1c\\xd6\\x3a\\x51\\x88\\x2d\\xa7\\xdf\\x9c\\xb4\\x74\\xc6\\x97\\x26\\x68\\x7b\\x9e\\x37\\x1e\\xb2\\xc9\\x48\\x75\\xb7\\x17\\xb4\\x99\\x9a\\xc9\\x99\\xe1\\x95\\x29\\x62\\x42\\xd9\\x28\\x24\\x84\\xc8\\x99\\xa5\\xdc\\xa5\\x54\\xda\\x61\\xdb\\xad\\x7f\\x17\\x1e\\xc3\\xd3\\x70\\x3b\\x3c\\xdc\\x4c\\xa6\\xc9\\x2f\\x7b\\x0c\\xb9\\x40\\xc4\\x1e\\xe4\\x7f\\xaa\\xcf\\x98\\xa9\\xb2\\x1b\\x3d\\x62\\xfb\\x14\\x0b\\xca\\x81\\x88\\x6b\\x0a\\xa5\\xa2\\x41\\xb5\\x19\\x05\\x07\\x89\\x1e\\x1c\\x23\\x0c\\x8d\\x79\\x9c\\x50\\x28\\xa8\\x46\\x35\\x8a\\xbf\\x98\\x80\\x0b\\x26\\xd8\\x43\\xb0\\xec\\x1c\\xa5\\x42\\x25\\x73\\x5d\\x27\\xcf\\x42\\x18\\x47\\xdd\\x6c\\x5b\\x32\\x66\\xf4\\x26\\x5e\\x3b\\xd1\\xb3\\x7c\\xb8\\x92\\xf8\\x9f\\x11\\x97\\x26\\xa0\\x8c\\x0f\\x58\\x74\\x7e\\x80\\x00\\xc7\\x97\\xc2\\x71\\x7a\\x1a\\x11\\x40\\x1e\\x24\\xc7\\x29\\xc6\\xe7\\xe0\\x87\\xe8\\xbb\\x3f\\x67\\x30\\xa4\\x0c\\xc1\\xfa\\x7a\\xd9\\x97\\x8f\\x04\\x28\\x81\\x42\\x4f\\xf0\\x6b\\x3f\\x4a\\x8e\\x2a\\x98\\x36\\x41\\x0e\\xa2\\x25\\xc1\\x70\\x9e\\xb8\\x8b\\xdf\\x48\\x21\\x26\\x71\\xe1\\x0a\\xd6\\x8f\\x99\\xce\\xbc\\x23\\x61\\x89\\x10\\xa1\\x48\\x0c\\xbe\\x27\\x73\\x3a\\x6f\\x8e\\xce\\x1a\\x62\\xae\\xaf\\xe0\\x5a\\xf1\\x82\\x65\\xe2\\x64\\x56\\xc9\\x2b\\xf9\\xca\\x3d\\x91\\x02\\xdd\\x13\\xc7\\xd7\\xe6\\xd0\\x5a\\x46\\x35\\x86\\x09\\x5e\\xd1\\x1a\\xe3\\x22\\x13\\xdd\\x2c\\x2b\\xb2\\x1d\\xe9\\x2c\\x07\\x00\\x4d\\xbc\\x43\\x1a\\xfe\\x80\\x51\\x44\\x38\\x15\\x53\\x34\\xc8\\xf8\\x51\\xb0\\x5f\\x2e\\x0c\\xb5\\xcd\\x70\\xda\\xe0\\xeb\\x1a\\x35\\xc1\\x26\\x01\\x6a\\xb3\\xa6\\x7b\\xde\\xbf\\xc2\\xa8\\x17\\xce\\x09\\x5e\\x5f\\x95\\xa5\\x6b\\x58\\x72\\x78\\x19\\x8b\\x76\\xf2\\x0a\\x7d\\x73\\x4c\\x44\\xf5\\x1f\\x32\\x16\\xb0\\xf8\\x0b\\xb0\\x4f\\xd6\\x92\\xb3\\xe9\\xd1\\xa7\\xb4\\x43\\x8d\\xb6\\x1b\\x93\\xde\\x04\\x57\\xc9\\xe9\\xc8\\xbd\\x52\\x52\\x75\\x88\\x6e\\x43\\xc4\\x26\\x9a\\xaa\\xe3\\x1b\\x46\\xb4\\xb6\\xa3\\x27\\x72\\x37\\xc6\\x67\\x43\\xcb\\x89\\x84\\xca\\x63\\x87\\x1f\\x7c\\x51\\x6d\\xce\\x31\\xfe\\xa5\\xf9\\x47\\x06\\x50\\x9f\\xf7\\x14\\x3e\\x6a\\x20\\x0f\\x00\\x9f\\x24\\x9d\\xbc\\x1d\\x36\\x33\\xf1\\x4b\\x6d\\x18\\xfa\\xfd\\xbc\\x1c\\x0f\\x20\\xcb\\xac\\x77\\xa6\\x17\\xe3\\x83\\x85\\xa9\\xe1\\x61\\x9a\\x79\\x5a\\x30\\x33\\x17\\xa3\\xc9\\xd1\\x0c\\x1f\\x4e\\xb7\\x79\\x6e\\x49\\xc2\\x41\\x10\\x4b\\xb4\\xac\\x3f\\xfc\\x30\\x1e\\x5c\\x11\\xe0\\x61\\xf5\\x2e\\xa3\\xba\\x92\\x07\\xd4\\x67\\xb9\\x35\\x7e\\x34\\x1a\\x20\\x71\\x71\\xf6\\xd0\\x61\\xe7\\x11\\x7a\\x04\\xef\\xe5\\xed\\x95\\xb7\\x72\\x3f\\x22\\xc8\\x88\\x7f\\xca\\xc6\\xe2\\x27\\x52\\x98\\x25\\xb3\\xd6\\x20\\x16\\xf1\\x71\\xe4\\x4b\\x87\\x52\\x43\\x03\\x08\\xff\\x87\\x56\\x18\\x26\\xc0\\x1f\\x58\\x5c\\xa7\\xdc\\xf8\\x84\\x8b\\x0b\\xca\\xe3\\xce\\x4f\\xbd\\xab\\x43\\x17\\xf6\\x95\\x6e\\x5f\\xc6\\x8b\\xdb\\x73\\xba\\xa2\\xa5\\x49\\xd9\\xf8\\xad\\x1c\\x40\\x4e\\x7e\\x45\\x2b\\xd6\\xf4\\x00\\xe0\\x93\\x86\\x32\\xee\\x31\\x97\\x41\\xd3\\x11\\xf4\\x40\\x70\\x49\\xe0\\xba\\x68\\x26\\x0e\\x32\\x4e\\x29\\x26\\x08\\x13\\x3a\\x5f\\xa4\\x00\\xce\\xa3\\x40\\x2c\\x60\\x45\\x91\\xbc\\x2e\\x2d\\x9a\\x3b\\x10\\xd2\\x51\\xeb\\x72\\x48\\x08\\xb0\\x72\\x55\\xe2\\xab\\x41\\x4d\\x9b\\x8d\\xd0\\x0c\\x4c\\xe3\\x4b\\xac\\xd2\\x92\\x99\\x05\\x7b\\xc1\\xa5\\x4c\\xee\\xad\\x9b\\x19\\xd6\\x6a\\x4f\\xc4\\x4c\\x8f\\x88\\x68\\x77\\x13\\xcb\\x93\\x92\\xb6\\x91\\xa3\\x85\\x11\\xc3\\x05\\x07\\x23\\x86\\x08\\xff\\x70\\x70\\x7c\\x43\\xc1\\xdb\\x63\\x9a\\x20\\xec\\xd3\\x79\\xef\\x60\\x50\\x6f\\xa3\\x44\\xfe\\x25\\x26\\x92\\x4c\\xa0\\x47\\xe4\\x33\\x44\\x67\\xa3\\x60\\x6b\\x63\\xd2\\xc0\\x2b\\x26\\xdb\\x80\\x06\\x14\\x8c\\x28\\x21\\x66\\x44\\x70\\xde\\x29\\x1d\\x6a\\x76\\xcc\\xa0\\x11\\xd0\\x9c\\x86\\xd7\\x70\\xa4\\xc0\\x62\\x22\\x03\\x73\\x23\\x80\\xd6\\x31\\x06\\xc5\\x53\\xac\\x92\\x95\\x6e\\x7d\\x0d\\x36\\xd7\\xd1\\xa0\\x80\\x4a\\xa7\\x1d\\xbf\\x2e\\x75\\x67\\xea\\xbf\\xe6\\x9c\\x86\\x36\\xec\\xd5\\xde\\x84\\x34\\x46\\xab\\x95\\x18\\xf4\\x8b\\x60\\x91\\x70\\xe2\\xbe\\x22\\xd2\\xa1\\x00\\x6c\\xfb\\x41\\x0a\\xf5\\x34\\x95\\x8d\\x8d\\x66\\xcf\\x3e\\x04\\xee\\xef\\x25\\xc4\\x91\\xbc\\x7c\\x61\\x3b\\xab\\xb5\\x96\\x0d\\x0b\\x40\\x50\\x57\\xfe\\xd0\\xec\\x17\\x5c\\x03\\x33\\xac\\xb0\\x84\\xe3\\xc5\\xb6\\xd5\\xac\\xeb\\x42\\xf7\\x9d\\x96\\xee\\x06\\x55\\x11\\x77\\xa9\\xd4\\x72\\x8e\\xe7\\xf9\\xb5\\x0b\\xe0\\x95\\x13\\x15\\x4a\\x8c\\xe1\\xd0\\x2f\\x08\\x01\\x00\\x00\\xff\\xff\\xc4\\x64\\x53\\xf9\\xd9\\x5e\\x00\\x00\")\n\nfunc fontsInconsolataBoldWebfontEotBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataBoldWebfontEot,\n\t\t\"fonts/inconsolata-bold-webfont.eot\",\n\t)\n}\n\nfunc fontsInconsolataBoldWebfontEot() (*asset, error) {\n\tbytes, err := fontsInconsolataBoldWebfontEotBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-bold-webfont.eot\", size: 24281, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataBoldWebfontSvg = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xfd\\x6b\\x9f\\x25\\xc7\\x71\\x26\\x86\\xbf\\xd7\\xa7\\xc8\\x1d\\xfe\\xff\\xf2\\x35\\x1b\\x19\\x11\\x79\\x5d\\x10\\x94\\xbd\\xa2\\x2c\\xaf\\xbd\\xbd\\x2b\\x5b\\x5a\\xad\\xd7\\xf7\\x21\\x66\\xc0\\x03\\xbb\\x04\\xa8\\x88\\x54\\x89\\xdb\\xbe\\x7c\\x76\\xff\\xe2\\x89\\xc8\\x3a\\x3d\\x33\\x7d\\x9a\\xc0\\xcc\\x90\\x00\\x28\\xbc\\x20\\xa7\\xd0\\xa7\\x4e\\x9d\\xac\\xbc\\xc4\\xf5\\x89\\x27\\x7e\\xfe\\x67\\xbf\\xfd\\xbb\\x2d\\x1c\\xaf\\x7f\\xf3\\xcd\\x97\\x5f\\x7f\\xf5\\xd9\\x0b\\xba\\x4b\\x2f\\xc2\\x37\\xf3\\xe5\\x57\\xaf\\x5e\\x6e\\x5f\\x7f\\xf5\\xfa\\xb3\\x17\\x5f\\x7d\\xfd\\xe2\\xcf\\x7e\\xf1\\x27\\x3f\\xff\\x67\\xbf\\xfc\\x37\\x7f\\xfe\\x37\\xff\\xfe\\xaf\\xfe\\x22\\x7c\\x73\\xfc\\x3a\\xfc\\xd5\\xbf\\xfd\\x17\\xff\\xea\\x5f\\xfe\\x79\\x78\\x11\\x3f\\xf9\\xe4\\xdf\\xc9\\x9f\\x7f\\xf2\\xc9\\x2f\\xff\\xe6\\x97\\xe1\\xaf\\xff\\xf6\\x2f\\x03\\xdd\\xd1\\x27\\x9f\\xfc\\xc5\\xbf\\x7e\\x11\\x5e\\x5c\\xe6\\xfc\\xfb\\x7f\\xfe\\xc9\\x27\\xff\\xf8\\x8f\\xff\\x78\\xf7\\x8f\\x72\\xf7\\xf5\\x6f\\x7e\\xfd\\xc9\\x5f\\xfe\\xe6\\xe5\\xdf\\x5f\\xbe\\xfc\\xfc\\x9b\\x4f\\xfe\\xfa\\x6f\\xff\\xf2\\x13\\xbd\\xf1\\x97\\x7f\\xf3\\xcb\\x4f\\xbe\\x39\\x7e\\x4d\\x74\\xf7\\x6a\\xbe\\x7a\\x11\\x7e\\xf1\\x27\\x3f\\xd7\\x47\\xff\\xf6\\xef\\xb6\\xaf\\xbe\\xf9\\xec\\x89\\xef\\x73\\x4a\\x49\\xef\\x7f\\xf1\\x8b\\x3f\\xf9\\xf9\\xdf\\xbd\\x9e\\x2f\\x5f\\xbd\\x9c\\x2f\\x7f\\xf1\\xf3\\x4f\\xce\\xcb\\x3f\\xf9\\xf9\\xab\\xd7\\x5f\\x7c\\xf3\\x8b\\x3f\\xf9\\xf9\\x17\\x5f\\x7f\\x35\\xc3\\x97\\xaf\\x3e\\x7b\\xf1\\xe5\\x57\\x9f\\x7f\\xfd\\xd5\\x37\\x5f\\x6f\\x2f\\xe7\\xcb\\x5f\\x7d\\xbd\\xbd\\x7a\\x11\\x2e\\x5f\\xff\\xe6\\xcb\\x87\\xf8\\xf2\\xd5\\x11\\x7f\\xfb\\xd9\\x0b\\x4a\\x9c\\xf1\\xab\\x7a\\x7f\\xfc\\xe2\\xe5\\xe7\\xaf\\xc3\\x3f\\x7c\\xf5\\xe5\\xfc\\x26\\xfe\\xfd\\xeb\\xdf\\xc4\\xd7\\x7f\\xf7\\xd9\\x0b\\x4e\\xb9\\xbf\\x08\\x2f\\xbf\\xf9\\xfc\\xf5\\x57\\xf3\\xb3\\x17\\x54\\xa5\\xbf\\x08\\xaf\\x5e\\xfb\\x7f\\xc6\\x4c\\xe9\\x45\\xf8\\x44\\xc7\\xf2\\xe5\\x37\\xdf\\x7c\\xf9\\xd5\\xaf\\xe3\\xaf\\xb7\\xff\\xf0\\xf7\\x97\\x37\\x7f\\xa2\\x24\\xbf\\xc7\\x3e\\x7b\\xea\\xea\\x1f\\xbe\\xfa\\xf2\\xf3\\xaf\\x5f\\xbd\\xfe\\xec\\xc5\\x9f\\xfe\\xec\\xb7\\xaf\\x3e\\x7d\\xf1\\xd4\\x27\\xe1\\xc9\\xbf\\xfe\\xb3\\x17\\xe1\\xd5\\x67\\x2f\\xee\\x45\\x38\\x10\\xb7\\x3d\\x05\\x49\\x81\\xf8\\xae\\x84\\xd2\\xa6\\xe4\\x90\\xdb\\x5d\\x99\\x25\\x05\\xe1\\xbb\\x32\\x6b\\xba\\x2b\\x81\\x78\\x97\\x12\\x52\\xa8\\xf9\\xae\\x84\\x48\\x32\\x0b\\xe9\\x85\\x64\\xbd\\x3d\\xe2\\x7e\\xe2\\x10\\x4b\\xbe\\x2b\\x7b\\x0a\\x51\\x92\\xde\\x14\\x62\\xa9\\x77\\x65\\x46\\x29\\x7a\\x6f\\x6e\\x33\\x16\\x0e\\x51\\x78\\xc6\\x8a\\x6f\\x13\\xe9\\xa7\\xf6\\x7c\\x5c\\xea\\x4f\\xe2\\x42\\xc7\\x80\\xaf\\xfa\\xa0\\xee\\xca\\xc3\\xbd\\x94\\x14\\x88\\x46\\xdf\\x53\\xe8\\x25\\x48\\xd3\\x6f\\x49\\xd2\\x1f\\x4e\\xf5\\xae\\x84\\x5c\\xee\\xca\\x5e\\x6b\\x48\\x81\\x12\\x06\\x99\\xeb\\x94\\x8e\\x9f\\x29\\x49\\xc7\\xc4\\xfa\\x3f\\x1d\\x46\\x98\\x11\\x37\\x14\\x1d\\x10\\x2e\\xc6\\x8c\\x39\\xc4\\xc2\\x5b\\x94\\x16\\x62\\x29\\xed\\x12\\xa9\\x97\\x2d\\x72\\x0f\\xa5\\xb4\\x3d\\x72\\x60\\xfd\\x3c\\x94\\xa2\\x63\\x6a\\xa1\\xe6\\x19\\xf5\\x37\\xab\\xcc\\x88\\x01\\xf2\\x5d\\x79\\x78\\x72\\xa2\\xff\\xf4\\x67\\xbf\\x65\\xfe\\xd4\\x66\\x9b\\x3a\\x87\\xde\\x78\\x2b\\x39\\x50\\xad\\x7b\\x0f\\xac\\x6f\\x60\\x2f\\x5a\\x42\\xa6\\xbb\\xb2\\x45\\xca\\xfa\\x8e\\xba\\x20\\x2d\\x90\\x4e\\x8c\\x4e\\xf8\\xe4\\x8e\\xd7\\x9b\\x99\\x02\\xb7\\x99\\xc7\\x5d\\x09\\x63\\x67\\x5d\\x8f\\x8c\\x37\\x1c\\x33\\x73\\x88\\xdc\\xf5\\xd6\\x81\\x77\\x1f\\x93\\x28\\xc4\\x3a\\x7c\\x39\\x72\\x88\\xd4\\x42\\x1c\\x98\\xd3\\x3c\\x74\\x4e\\x44\\x7f\\xae\\x34\\xbd\\xec\\x0f\\xf7\\x45\\x86\\x8d\\x4d\\x1e\\x8d\\x8d\\x6d\\x6c\\x79\\x8d\\x8d\\x9f\\x1e\\x9b\\x4f\\xfe\\x39\\xba\\x73\\x6c\\x23\\xc4\\x11\\x1e\\x0f\\xed\\x9d\\x81\\xe9\\x9f\\xa8\\x87\\x38\\x32\\x16\\x3f\\x52\\xa9\\x7b\\xc4\\x92\\x05\\x5b\\xfa\\x28\\x75\\xe2\\xbf\\xb2\\xe8\\xbf\\x77\\xeb\\x2a\\xeb\\x27\\x4f\\x4f\\xf9\\xcf\\x7c\\x6f\\x8f\\x20\\xa5\\x6f\\x3a\\xe8\\x9a\\x2e\\xd4\\xc7\\x26\\x29\\x70\\x1b\\x97\\xc8\\x89\\x37\\x4a\\x81\\x2a\\x5d\\x98\\x68\\x93\\x16\\x84\\xf3\\xc6\\x44\\x41\\x37\\xc0\\xd0\\x1d\\x4a\\x17\\xa2\\x84\\x4f\\xa8\\x9c\\x9f\\xb4\\x10\\x85\\xe4\\x42\\x8d\\x37\\x6c\\x26\\xaa\\xf9\\x12\\xf1\\x5f\\x42\\x21\\x72\\x6b\\x17\\xea\\x8c\\x69\\x8a\\x54\\x86\\x6e\\xa1\\xbe\\xc5\\x4c\\x3a\\xfd\\x69\\x8b\\xfa\\x94\\x48\\xb2\\x65\\x09\\x92\\xeb\\x25\\x12\\x15\\xff\\x54\\x74\\xa7\\xa5\\x12\\x22\\xe3\\x17\\xa5\\xe8\\x53\\xfb\\xc3\\x7d\\xce\\x39\\x14\\xe6\\x0b\\x91\\x6c\\x22\\x41\\x7f\\x40\\xbf\\xf5\\xf4\\x5b\\xff\\xff\\x7c\\x8f\\xa5\\x14\\x68\\x8c\\x8d\\x74\\xfd\\x5a\\xdd\\x75\\xd5\\x4b\\xe0\\x6a\\xe7\\x60\\x12\\x36\\x3e\\xd3\\xec\\x8f\\xff\\xa5\\xb2\\xeb\\x0e\\x91\\x16\\x1a\\xe6\\xbc\\xca\\x1c\\x09\\x93\\xdf\\x0e\\xa9\\x75\\x8f\\x4d\\x7f\\x5d\\x47\\x8f\\x55\\x4f\\x33\\x8e\\x16\\x9a\\x9c\\x87\\x77\\xa4\\x19\\x99\\x02\\xa5\\x8e\\x55\\x2d\\x35\\xe0\\xbf\\xda\\xac\\x29\\x0c\\x9e\\x43\\x7f\\xb4\\xe1\\xa4\\xb2\\xe8\\x66\\x91\\xbb\\x72\\x10\\x8d\\x0b\\xa7\\xb2\\xf7\\x10\\x25\\x50\\x0a\\x11\\x3b\\xc4\\x64\\x02\\xb6\\x2c\\x0e\\xab\\x89\\x05\\xdd\\xbd\\x3a\\x95\\x21\\xd2\\x98\\xf8\\x73\\xb9\\x2b\\x47\\x14\\x0e\\x7b\\x2f\\xd8\\xd9\\xa4\\x22\\x22\\xc4\\xaa\\xdb\\x90\\xc4\\x85\\xcb\\xb0\\x4d\\x4b\\xd8\\xed\\xbb\\xee\\x22\\xdd\\x71\\xfa\\x86\\xcd\\x05\\x0b\\xb5\\xa9\\xbf\\x1b\\x18\\x3f\\x33\\xfc\\x6a\\xd7\\xd5\\x65\\x95\\x5e\\x18\\xad\\x9e\\x78\\x7d\\xa2\\xd0\\x11\\x25\\xd1\\xde\\x75\\xb1\\x6b\\xa0\\xac\\x77\\xf4\\x49\\x49\\xef\\x8a\\x2d\\xcf\\x8a\\xc9\\x1b\\x38\\x14\\xe4\\x03\\xd0\\x57\\xa9\\xfa\\x2e\\x3a\\x6a\\x4e\\x98\\x32\\xdc\\x0f\\x21\\x35\\x23\\x25\\x4c\\x74\\xa7\\x19\\x09\\x92\\x74\\x1c\\x91\\x28\\xe9\\x26\\x2d\\x07\\xa5\\xbc\\xc7\\xa1\\xd2\\x42\\x27\\x80\\x20\\x6e\\xa8\\xe8\\xc1\\xe4\\x87\\x70\\x2f\\x85\\xc3\\x20\\xc1\\x64\\xb1\\xce\\x78\\xac\\x75\\x36\\x1d\\x14\\x1f\\xcc\\x63\\x8f\\x19\\x13\\x18\\x62\\xd5\\x39\\xd6\\x89\\xab\\x21\\x36\\x7e\\xb8\\xaf\\x42\\x81\\xa9\\xec\\x2a\\x87\\xf4\\xd4\\xab\\x00\\xcb\\x53\\x74\\x58\\x43\\x1f\\x97\\xbb\\x1e\\xcc\\xbb\\x12\\x7a\\x9e\\x71\\xe8\\xab\\x97\\x7e\\x44\\xee\\xe3\\xe9\\x9d\\xf7\\xff\\xb7\\x9d\\xc7\\x2a\\x14\\x58\\x25\\x6d\\xe9\\x81\\x21\\xd3\\xd3\\x98\\xa5\\x84\\xae\\x2b\\xdb\\xf5\\x0f\\x65\\xcc\\xd1\\x6d\\xb2\\x87\\x6d\\x40\\x9e\\x3a\\x9b\\x65\\xa8\\x04\\xc4\\xd6\\xec\\x63\\xe2\\x68\\xa5\\x35\\x77\\xfa\\x0e\\xc3\\xd6\\x53\\xa6\\xad\\x48\\xec\\x7d\\x46\\x3c\\x30\\xea\\xb2\\x9f\\x93\\xa8\\x3f\\xba\\xab\\x8a\\x49\\x21\\xe2\\x77\\xfc\\xae\\xd2\\xa1\\x5b\\x4a\\xe8\\x3a\\x09\\xa6\\x6d\\x54\\x60\\xdf\\xe7\\x12\\xd2\\xd6\\x20\\xe9\\x5a\\xbd\\x70\\x1a\\x5b\\x6c\\x7a\\x94\\xf1\\x9f\\x91\\x93\\x3c\\xdc\\xd3\\xd0\\xd7\\xa2\\x0e\\x61\\xd5\\x42\\x0d\\xb1\\x60\\x23\\xe3\\x40\\x65\\x0a\\x93\\xf5\\x87\\x75\\x14\\xbe\\xeb\\xd2\\x54\\x9d\\x9a\\x26\\xab\\xac\\xc2\\x07\\xb8\\x37\\xd3\\xac\\xa1\\xd8\\xfa\\x87\\xa2\\xab\\x6d\\x7f\\xd5\\x3f\\xd8\\xad\\x7d\\x46\\x7c\\x13\\xea\\xcf\\x9f\\x65\\x9f\\xaa\\xf8\\xf4\\x2f\\x44\\xfb\\x86\\x0e\\x83\\x1e\\xee\\xf3\\xc8\\x81\\xeb\\x53\\x53\\x3e\\xd6\\x84\\x63\\xaa\\xd7\\x94\\xdb\\x84\\x63\\xae\\x6a\\x3a\\x27\\x5c\\xb7\\xeb\\xbb\\x53\\x7e\\x4e\\x78\\x88\\x1d\\x93\\xbc\\x26\\x3c\\x7c\\x87\\xf9\\xc6\\xc5\\x9a\\xf1\\x87\\xfb\\x5a\\x73\\xe0\\x72\\x6b\\x2e\\x9f\\x9a\\x4a\\xc2\\x3b\\x3d\\x9e\\xcc\\xf6\\xc4\\x54\\xb6\\x77\\x26\\xd2\\xbe\\xf7\\xed\\xa7\\xf2\\xa6\\xee\\xae\\xae\\xbb\\x2b\\x05\\x49\\x10\\x6e\\x23\\x60\\x3f\\x12\\xf5\\x89\\xdd\\x48\\x90\\x51\\x78\\xf1\\xd1\\xa6\\x4d\\x4d\\x53\\x5b\\x24\\x36\\x0a\\xad\\xeb\\x6f\\xab\\x7c\\x32\\x43\\x48\\xc5\\x46\\xc5\\x34\\xd7\\xa4\\x36\\x05\\x36\\xe2\\xac\\x25\\x0c\\x9a\\x03\\x16\\x05\\x66\\x84\\xf4\\x4c\\x32\\xef\\xb5\\xa9\\x39\\xc3\\x78\\x05\\x56\\x79\\x31\\xb0\\xff\\xa1\\x77\\x21\\x79\\x71\\x3c\\x27\\xfb\\x3b\\x16\\x5b\\x40\\x3d\\xbf\\x26\\xe8\\x47\\x9b\\x50\\x31\\x90\\x49\\xb1\\xe6\\x10\\x3b\\xa4\\x76\\xb7\\xc7\\xc8\\x46\\x2d\\x87\\xc8\\x25\\xed\\x34\\x54\\xe3\\x0b\\x9b\\x2c\\xc0\\x03\\x4b\\x0d\\x3b\\xa9\\x11\\x40\\x81\\xcb\\xd4\\xbf\\x70\\x99\\x35\\xb0\\x4c\\xe8\\x61\\x4e\\x1b\\x41\\xfa\\xaa\\xa8\\x51\\xad\\x59\\x55\\xbc\\x98\\xa2\\x61\\xd8\\x49\\xd5\\xce\\xad\\x5a\\x67\\x3b\\x41\\xdd\\x04\\x91\\x10\\x73\\x9e\\x52\\xd5\\x3c\\xd3\\x95\\x36\\x8d\\x8e\\x4b\\x36\\xe5\\xbe\\xa9\\x4a\\xc5\\x19\\xdc\\x22\\xb4\\x59\\xe9\\x3b\\x14\\xac\\xb8\\x28\\x2b\\x7d\\x46\\x9d\\x57\\xb5\\x27\\x75\\x00\\x66\\x31\\xf6\\xee\\xba\\x43\\xff\\xa6\\xdb\\x19\\x56\\x12\\xab\\xf5\\x90\\x7a\\x68\\x34\\xa1\\x1c\\xa0\\x95\\x54\\x18\\x93\\xe4\\x87\\x7b\\x56\\x3b\\x92\\xbb\\x5b\\x48\\x10\\x95\\x18\\x89\\x8a\\xa4\\x1e\\x66\\x6e\\xbe\\x31\\x8b\\xbd\\x88\\x4e\\x6f\\xc1\\x8a\\x24\\x1d\\xab\\xe4\\xd9\\xf4\\x8e\\x2e\\xaa\\xbe\\x7b\\xe0\\xa1\\x13\\x21\\x78\\x4f\\x18\\xbe\\xba\\x12\\x58\\xf5\\xb6\\x8c\\x4c\\xb6\\xb3\\xe7\\xd6\\x23\\x34\\xc1\\xc3\\xbd\\x74\\x55\\x96\\xc9\\x86\\x31\\x20\\xc8\\x7b\\x9f\\x15\\x27\\x90\\xd4\\x92\\x22\\x53\\x99\\x41\\xda\\x84\\x02\\x36\\x6b\\xbb\\xc3\\xea\\xd4\\xa3\\x20\\xba\\x8b\\xf3\\x98\\x6a\\x49\\x65\\xdb\\xe8\\xc3\\x4e\\x8b\\x3e\\x8f\\xd2\\xae\\x3b\\x22\\xa9\\xec\\x57\\x63\\x03\\x9f\\xeb\\x4e\\xc8\\xb7\\x6c\\xd6\\xff\\xc8\\x0d\\xa8\\xda\\xde\\x35\\x09\\x3f\\xd4\\x5c\\x1d\\x6f\\x19\\xab\\xef\\x58\\x84\\xd5\\x77\\x12\\x97\\x74\\x35\\x4f\\x9f\\x1c\\xe6\\x7f\\xec\\x7a\\x27\\xa7\\x50\\x38\\xef\\x29\\x50\\xee\\x41\\x27\\xb0\\xf5\\x49\\x6a\\xb2\\x49\\x9f\\xba\\xbf\\x69\\xf0\\x64\\xd5\\x4e\\x39\\x6d\\x03\\xa6\\x44\\x87\\x86\\x8f\\xaa\\x16\\x55\\x02\\xee\\x6a\\xb2\\xc1\\x34\\x08\\xaa\\x60\\x47\\x90\\x4b\\xac\\x53\\x3f\\xe6\\x3d\\xf6\\x04\\x97\\x21\\x52\\x36\\xb5\\x6d\\x16\\x09\\x25\\xac\\x29\\xe9\\x1e\\xac\\x76\\xd9\\xd5\\x17\\x10\\x33\\xab\\xcc\\x0e\\x52\\x63\\x4d\\x1d\\xab\\xc8\\x6a\\x74\\xcc\\x5e\\x4c\\x68\\x12\\x6c\\x14\\xf3\\xa3\\xd4\\xde\\x9a\\x04\\x29\\x21\\x55\\x27\\x74\\xc0\\x08\\xce\\x3a\\xa4\\x1e\\xaa\\xde\\x2f\\x38\\x02\\xf8\\x51\\x35\\xc3\\x52\\x87\\x00\\xc6\\xe6\\xce\\xb6\\xc6\\xb0\\x60\\x5a\\x7b\\x7a\\x96\\xfe\\x13\\xb7\\x0b\\x75\\x63\\xd2\\x18\\x3b\\xa5\\xac\\x0a\\x9e\\x30\\x1a\\x62\\x9e\\x64\\x9e\\x14\\x4c\\x27\\xfb\\xe3\\x68\\xcb\\x8f\\x60\\x28\\x3e\\x16\\x18\\x12\\x29\\x64\\xfd\\x59\\x15\\xa9\\x35\\x70\\xe7\\xbb\\x02\\x4f\\xa6\\xf5\\x9d\\xf4\\x3c\\x97\\x16\\x38\\xeb\\xf4\\xe6\\x3e\\xa9\\xab\\x58\\x49\\x79\\x92\\x89\\x5a\\xd6\\xc9\\x9b\\xd9\\xb4\\x46\\x5d\\xb3\\xa3\\x42\\x03\\x5b\\xa1\\xe9\\xb4\\x9b\\x96\\x67\\x13\\xec\\xa4\\xc7\\x99\\xed\\xe7\\x38\\x2f\\x2f\\xee\\xe9\\x37\\xfc\\x4f\\xed\\x0d\\x5b\\x0a\\x8d\\x68\\x6b\\x14\\xa8\\xd7\\x8d\\x87\\xbe\\xaf\\x34\\xf8\\x70\\x42\\xe5\\xc2\\x99\\xb6\\xa8\\x26\\x1b\\x2c\\xfa\\xae\\xef\\x3e\\xb6\\xa6\\x86\\x55\\xab\\x5b\\x14\\xdd\\x0f\\x63\\x6c\\xac\\x36\\x18\\xf7\\xb4\\xa9\\x71\\xbf\\x84\\xd0\\x18\\x41\\x12\\xb9\\x8d\\x2e\\x49\\x25\\x54\\x25\\x7c\\x9f\\x6d\\xbb\\x3d\\x3d\\xae\\xff\\xcc\\xc6\\xd5\\x73\\x28\\x3d\\x1d\\xd4\\xf2\\x45\\x72\\x3a\\x84\\xc7\\x85\\xc6\\x50\\xeb\\x75\\x5c\\x84\\xdb\\x11\\xf5\\x93\\x88\\x2b\\x81\\xd7\\x30\\xc6\\x81\\x0b\\xc9\\x37\\x5e\\xf8\\x3f\\xf7\\xf3\\x09\\x97\\x21\\xf3\\xce\\x5d\\xad\\xf3\\x02\\xd9\\x8d\\x63\\x77\\x5e\\xa9\\xff\\x6a\\x1e\\x72\\x10\\x3b\\x5f\\x7a\\xd4\\x46\\x30\\x43\\x94\\x29\\x98\\x0a\\xe7\\x1a\\xd8\\x3c\\x63\\x73\\xba\\x99\\x60\\x39\\x78\\x58\\x80\\x42\\xa9\\x2a\\x13\\xed\\x48\\x77\\x58\\xc2\\xb3\\x8a\\x3b\\xed\\xbb\\xe8\\xd9\\x31\\xd3\\x97\\xf2\\x2c\\x19\\xb6\\xe6\\x12\\x79\\xfa\\xdb\\xd9\\xd4\\x82\\x2e\\xb9\\x1a\\x7b\\x35\\xc1\\x98\\xb5\\x55\\xd6\\xd5\\x57\\x65\\xf1\\xf4\\x8b\\xc6\\xb5\\x77\\x75\\x08\\x72\\x50\\x6f\\x97\\x56\\xfb\\x11\\xf5\\x22\\xb6\\x7a\\x63\\xde\\xef\\x7c\\x7a\\xb2\\xba\\xab\\xa4\\xfb\\x77\\xa8\\x16\\x53\\x73\\x67\\x8a\\xa8\\x3d\\x6f\\x2f\\xa1\\x73\\xa0\\x07\\x2b\\x10\\xed\\x92\\x02\\x8c\\x28\\xb8\\x05\\xea\\xc2\\x46\\x11\\xb3\\x88\\x23\\x5e\\xdb\\x7c\\x51\\x8f\\x23\\xe0\\x36\\xf5\\x0e\\x66\\x74\\x7d\\x06\\x97\\x5a\\xd2\\x8c\\x05\\x52\\x7b\\x8f\\x98\\x14\\x7d\\x55\\xa2\\x09\\x2d\\x10\\xd8\\x8e\\x0e\\x43\\x94\\x4f\\xa8\\xaa\\x50\\xf2\\xd3\\x6f\\xf0\\xc9\\xf2\\xe5\\x74\\x7b\\xa6\\xad\\x8a\\x0a\\xde\\x56\\x37\\x6a\\x2a\\x3e\\x79\\x8b\\x55\\x6c\\x77\\xdf\\xd8\\x20\\xe9\\x3c\\x11\\x95\\x07\\x04\\xe3\\x08\\x52\\x83\\x9e\\x33\\x18\\x19\\x4c\\x32\\x09\\xa7\\x91\\x54\\x78\\x4c\\xaa\\x23\\xa8\\x94\\xde\\x0b\\x85\\x14\\x20\\x23\\x4f\\x9b\\x26\\xaa\\xa4\\x9a\\x2d\\x79\\x2c\\xc7\\xe2\\x3f\\x4d\\x8f\\xb0\\xba\\x35\\x5d\\x7d\\x37\\x9d\\x13\\x92\\xa9\\xfe\\x31\\x0f\\xc2\\xd1\\xae\\x0d\\xee\\x64\\xe4\\x81\\x9d\\xe6\\xd6\\x7e\\xd2\\x17\\xcf\\xb6\\x55\\xcc\\xe5\\x22\\x55\\xe8\\x39\\xed\\x71\\x10\\x94\\x36\\x1c\\x2d\\xd3\\x9a\\x6b\\x80\\xd8\\x91\\x43\\x07\\x4d\\x53\\xe5\\x35\\xab\\x0b\\xc3\\x7d\\x84\\x5a\\x4c\\x8c\\xf4\\x40\\xfa\\x8c\\x69\\xf6\\x83\\x8e\\x6f\\xea\\xaa\\xe8\\x34\\x63\\x01\\xa5\\x6c\\xd2\\x24\\xe4\\xae\\x3b\\x5d\\x6d\\x62\\x28\\x98\\x21\\x33\\x0e\\x0e\\x92\\xf7\\x98\\x61\\x30\\x98\\x78\\x46\\xc4\\xcb\\xfc\\x3d\\xb3\\xad\\x62\\x36\\xe5\\x9f\\x7d\\xc7\\xba\\xac\\xb7\\x80\\x54\\x0d\\x3c\\x44\\x35\\x9b\\x2e\\xbc\\x6a\\xad\\x21\\x73\\xa8\\x96\\xcd\\x3b\\x1e\\x8a\\x67\\xe2\\x91\\x78\\xe2\\x20\\x53\\x86\\x94\\x69\\xe2\\x49\\x78\\x90\\x2e\\x90\\x6e\\xa9\\xa5\\xbb\\xdd\\xe7\\x34\\x4f\\x79\\x46\\x09\\x72\\xf3\\x80\\x90\\x6f\\x14\\x95\\xc3\\x69\\xa4\\x4d\\x72\\x55\\xe9\\x77\\xa1\\x22\\xc7\\xf2\\x62\\x58\\xfd\\x48\\xaa\\x5b\\x64\\xc2\\x9b\\x3f\\xfd\\x24\\xf6\\x27\\x91\\xda\\x22\\xb9\\xed\\xa5\\x07\\x52\\x27\\x57\\x05\\x9d\\xea\\x4f\\xa9\\x41\\x6d\\x00\\x58\\x3f\\x15\\x01\\xbe\\xa9\\x9f\\x47\\x1c\\xe4\\x2e\\xee\\xed\\x4e\\xc4\\xfd\\xb2\\x2a\\x63\\x98\\x68\\x6c\\xd3\\x05\\x17\\x1a\\xe2\\xd4\\x62\\x7a\\xc9\\xb6\\x00\\x99\\x07\\x4c\\xf9\\x91\\x5a\\xb5\\x2f\\x10\\xec\\xc7\\xee\\xc6\\x64\\xbb\\xe4\\x4c\\xbb\\x8e\\x4c\\xfd\\xd5\\x8a\\x0d\\x6b\\x01\\x43\\x32\\xab\\x63\\xb2\\x84\\x7c\\x57\\x8e\\xc8\\x2c\\x97\\xd8\\x06\\x1f\\xc4\\x4d\\xc5\\x62\\x1d\\xa1\\x5a\\x9c\\x90\\x27\\x6c\\x5e\\xe2\\x34\\x87\\x1a\\x70\\xaa\\xe2\\x7a\\x0f\\x43\\x17\\x48\\x45\\x98\\xe4\\x80\\x25\\x6a\\x3c\\x5b\\x0e\\x9d\\x26\\x02\\x0a\\x83\\xf4\\xd1\\x94\\xd8\\x2c\\x1c\\x0b\\x1a\\x34\\xf3\\x2b\\xd4\\xcf\\x99\\x08\\x78\\x06\\x75\\xae\\x9b\\x1e\\x33\\x15\\xa6\\x6e\\x6b\\xd9\\xae\\xc1\\x6e\\xf2\\x50\\x29\\x5d\\xdd\\x91\\x8c\\xbf\\x9b\\xc6\\xcb\\x6a\\xa2\\x66\\xb7\\x34\\xdd\\x35\\x51\\xe3\\xed\\xe9\\x75\\x12\\x5b\\xa7\\x51\\x03\\x89\\x6c\\x54\\x59\\xd5\\xf5\\xae\\x0b\\xab\\xb6\\x59\\x24\\x9e\\xcd\\x8c\\xff\\x69\\x0f\\x4a\\x93\\xd2\\x7a\\xe2\\xae\\x52\\x4b\\x8d\\x70\\x35\\xa6\\xf5\\x8c\\x41\\x1d\\xa6\\x59\\x08\\x37\\xaa\\xab\\xa7\\x77\\x65\\x95\\x5d\\x0d\\xdb\\x33\\xdb\\x79\\xc7\\xde\\xcf\\x19\\x73\\xa9\\x73\\x3f\\x74\\x3e\\x32\\x82\\x12\\x6a\\xff\\xb2\\xbf\\x62\\x25\\x18\\xe6\\xd2\\xf5\\xc0\\x07\\x92\\x3d\\x9a\\x25\\x8e\\x57\\x4e\\x8f\\x8e\\x0f\\xe4\\xa0\\xfe\\xa3\\xbf\\x4c\\x77\\xe5\\xa0\\x5e\\xf6\\xa1\\x3f\\x8b\\xe8\\x46\\x9e\\x94\\x20\\x07\\x92\\xfa\\xb2\\xaa\\x69\\xcc\\x47\\x54\\x8b\\x35\\xe8\\x4a\\x58\\x5c\\xa3\\xa6\\x25\\x51\\xc7\\x39\\xcb\\x66\\xde\\xc2\\xf1\\xd0\\xb9\\xdf\\x55\\x30\\xc3\\xb7\\x65\\x9b\\x04\\xdd\\x6e\\xe6\\x37\\xd5\\x2d\\xaa\\x5e\\xa1\\xdc\\xf7\\xda\\xc3\\x20\\x73\\xd1\\x02\\x82\\x47\\x93\\xe0\\x67\\xe9\\x79\\xdc\\xe1\\x4d\\xd8\\x67\\x11\\xdb\\xd7\\x62\\x58\\x11\\xe1\\xaf\\x8e\\x30\\x0f\\xc3\\x8e\\xa5\\x8c\\x50\\x0c\\xa2\\x98\\x26\\x09\\xa2\\x89\\xba\\x06\\x2b\\x4d\\xc5\\x0e\\xf4\\xa1\\xf9\\x21\\x2a\\xf4\\x04\\xdf\\x0a\\xad\\x21\\xa6\\xa9\\x92\\xb0\\xd1\\x54\\xe7\\x6d\\x14\\x33\\xf0\\xa3\\x99\\x4f\\xd0\\x9c\\xdd\\x83\\xa5\\xf6\\xd6\\xe6\\x78\\xe5\\x19\\xc9\\x42\\xdc\\x3d\\xe9\\xe4\\x9a\\x05\\xa5\\xb2\\x59\\xbd\\x2e\\xbc\\xb8\\xda\\x2e\\x63\\x49\\x5a\\x92\\x9b\\x71\\xea\\xec\\xc6\\x0a\\x8c\\xa5\\x83\\x72\\xde\\x4a\\x91\\xd0\\xa9\\x5d\\xa8\\x96\\x23\\xb6\\x96\\x2e\\xd4\\xd2\\x11\\x69\\xc8\\x25\\xe2\\x4a\\x48\\x2e\\x91\\x85\\x0e\\xb5\\xae\\x62\\xee\\xed\\xe1\\x5e\\x54\\xbc\\xa6\\x74\\xe1\\xd2\\x0f\\xe9\\x37\\xbc\\xea\\xb2\\x94\\x9b\\x9a\\x21\\xb2\\xa9\\x0d\\x40\\x82\\x2d\\xac\\xb3\\x6f\\xa7\\x66\\x9a\\x49\\x5d\\x27\\x84\\xad\\xfd\\xff\\xae\\x8e\\x51\\xae\\xa1\\xe2\\x85\\xdb\\x98\\xee\\x17\\x8b\\xec\\x59\\x54\\xd6\\x42\\x5d\\x14\\x73\\xa7\\x73\\x9b\\xb0\\xd7\\x5b\\x77\\x69\\x91\\x86\\xf9\\xdc\\x76\\xd4\\xe0\\x05\\x42\\xbf\\x34\\x5b\\x12\\x86\\xff\\xd4\\x55\\xb8\\xe9\\xec\\x55\\xb6\\x5d\\xe3\\x5a\\x5d\\x45\\xfa\\x50\\xb3\\x2f\\xb7\\x50\\x65\\xd3\\xff\\x6f\\xe9\\x52\\x7b\\xd5\\xf9\\xc0\\xcb\\xab\\x2b\\xa4\\xea\\x2e\\xb7\\x5d\\x7d\\x7c\\x82\\x90\\xc0\\xc3\\x4c\\xf2\\x43\\xcc\\x40\\xc7\\x51\\x2d\\x8f\\xa4\\x67\\x9b\\xdd\\x2c\\x61\\x33\\xd6\\xd4\\xb2\\x71\\xe3\\x18\\x5a\\x75\\x9c\\x9e\\x05\\x16\\xdc\\xc5\\x86\\xda\\xa8\\xc3\\x2e\\x5b\\xf1\\x29\\x50\\xe7\\x5e\\xbf\\xa6\\xe2\\x0a\\xd6\\x34\\x85\\xcc\\x16\\xa7\\x2d\\xf6\\x62\\xc4\\x4f\\xaf\\x47\\x5d\\xeb\\xa1\\x76\\xaa\\x9a\\xfb\\x54\\x6b\\x80\\x7b\\xc2\\x63\\xcc\\x61\\x91\\x88\\x32\\xa9\\x24\\xd3\\x5c\\xd7\\xe3\\xa1\\x16\\x43\\xef\\x78\\xa7\\x01\\xab\\x8f\\x0a\\x4e\\x26\\x6d\\x91\\x54\\x98\\xa8\\xd7\\xa8\\x07\\x15\\x97\\x2a\\x4d\\xa1\\xc9\\x03\\x21\\x85\\x42\\xea\\xaf\\x26\\x3c\\xfc\\x71\\xc4\\x35\\x43\\x7c\\xa8\\x11\\xaf\\x77\\x41\\xc4\\x4c\\x9c\\x35\\x73\\xa0\\x2d\\xe8\\x01\\x35\\x81\\x68\\x8a\\xfe\\xc6\\x5d\\xd9\\xf5\\xdb\\x29\\x64\\xcb\\x0a\\x4d\\x58\\xc2\\x66\\xde\\xc1\\xda\\xc1\\x55\\x0b\\x3a\\xb3\\x3d\\xe1\\x34\\x5b\\xc8\\x74\\x12\\x5b\\xc4\\x36\\xcd\\x6e\\x1a\\x49\\xba\\x69\\xb0\\x56\\xcf\\xc0\\x51\\xd3\\x7d\\x51\\x4c\\x8d\\x99\\xe5\\xc6\\xcd\\x4f\\x68\\xa4\\x52\\xd5\\xbc\\xd0\\xd3\\x66\\xe6\\x4b\\x4f\\x2b\\x6d\\x05\\xdb\\x91\\x74\\xf3\\x98\\xde\\x19\\x7d\\xf9\\xe5\\x85\\x1f\\xee\\x45\\x7a\\xc8\\xbd\\xc1\\xdf\\xa5\\x60\\xd2\\x9f\\xa8\\xbb\\x87\\x84\\x18\\xd2\\xac\\x1c\\x62\\x4b\\xd8\\x1f\\x2a\\x77\\x76\\xc9\\x2b\\xfd\\xa6\\xe7\\x02\\x0b\\x80\\x60\\x45\\x45\\xb4\\x69\\x92\\xea\\xa9\\xbc\\x36\\xb9\\x85\\x3a\\xf2\\x8c\\xba\\xb3\\x10\\xd5\\x77\\x55\\x05\\x91\\xb4\\x72\\x6e\\x79\\x8f\\xc5\\x44\\xb4\\xb9\\xb3\\x26\\x3d\\x4d\\xed\\xaa\\x30\\x39\\xa2\\xdc\\xf0\\x2a\\xdb\\xb2\\xcc\\x71\\x96\\xca\\xc1\\x89\\xdc\\x34\\xa7\\xa6\\x6b\\x3e\\x54\\xd8\\xc2\\xb8\\xcf\\x6a\\x38\\xaa\\xa0\\x1a\\x5d\\x97\\xb0\\x5c\\xd4\\x9f\\xd3\\xa3\\xa0\\x9f\\xab\\x9b\\x57\\xb2\\x4c\\x4e\\x35\\x14\\xe1\\x4b\\xcc\\xe3\\xc6\\x2e\\xed\\x2e\\x9f\\x6a\\x10\\x51\\xed\\x53\\x28\\x40\\xf9\\x27\\x33\\xe6\\x47\\x9e\\x2d\\x5b\\xc4\\x7a\\xa8\\x88\\xd8\\xa3\\x20\\x5e\\x11\\x71\\x0e\\x2d\\x4a\\x5c\\x6a\\xa8\\x66\\x84\\xb7\\x60\\x32\\x19\\xe2\\x46\\x97\\x7e\\x4f\\xa1\\x99\\xb3\\x23\\x32\\xbb\\x05\\x0f\\xe1\\xbb\\x20\\x60\\xd3\\xf2\\xd4\\x93\\xcf\\xd7\\x0d\\x84\\x08\\x39\\x94\\x81\\x4a\\x69\\xb5\\x19\\xba\\x87\\xba\\xa6\\x9b\\x3c\\xec\\xe7\\x18\\x31\\x78\\x0b\\xb4\\x62\\x72\\xb3\\xdb\\x06\\x33\\x5a\\x50\\xa9\\xc1\\x2a\\xd0\\xa9\\x52\\x57\\x64\\x2f\\xe6\\x5f\\xa8\\xc0\\x81\\x43\\x6e\\xf9\\x18\\xec\\x4e\\x0f\\x47\\x0d\\x58\\x3d\\x91\\x12\\xb4\\x8d\\xee\\x0e\\xf8\\x02\\x2a\\xbe\\xc6\\x4a\\x3a\\xe8\\x9b\\xd5\\xf5\\x3b\\x30\\xb1\\x79\\x9c\\x26\\x76\\x1d\\x81\\xf5\\xec\\x89\\x0a\\xbf\\x89\\x75\\x0e\\x08\\x38\\x4e\\x18\\xbf\\x81\\xd4\\xe1\\x51\\x59\\xde\\x83\\xe4\\x8a\\xa0\\x54\\x0d\\x54\\x42\\xac\\xfd\\xf4\\xe1\\xcd\\x15\\x48\\x6e\\x46\\x34\\x77\\xfe\\xd4\\x76\\xd0\\xe9\\x69\\xb6\\xf7\\x71\\xea\\xf4\\x24\\x62\\x9b\\x5a\\x96\\x01\\x1b\\x55\\x4d\\x05\\x9b\\x1e\\xd8\\x54\\x30\\xba\\x74\\xa2\\x6a\\x39\\xd5\\x63\\xb9\\x1a\\x80\\x99\\xc3\\x8e\\x38\\x8d\\x4e\\xb5\\x3a\\xe5\\xd9\\x8d\\x2a\\x95\\x16\\xc8\\x14\\x47\\xe4\\x45\\xd8\\x62\\x48\\x0f\\xf7\\xd2\\x5a\\x18\\xad\\x78\\x5e\\xc4\\x54\\x0a\\xb4\\xa6\\x60\\x63\\x17\\xb1\\xd3\\x13\\xf3\\xf2\\x66\\x04\\x33\\xcf\\x41\\x4a\\xc0\\x2f\\xf6\\x3a\\xc5\\xb5\\x84\\x7a\\x8f\\xcd\\x4d\\x98\\xc2\\x2e\\x14\\xe0\\xf0\\xb5\\x00\\x7f\\xaf\\xc3\\xc3\\x43\\x9c\\x0a\\x8a\\x39\\x5b\\x82\\x6d\\xe0\\xac\\x2f\\x3b\\xcf\\xe6\\xec\\x86\\x3e\\x1c\\xe7\\xce\\xee\\xf0\\x2f\\x47\\x0d\\x16\\xbe\\x6e\\xc3\\xe3\\x31\\x90\\x3b\\xb0\\x9d\\x83\\x59\\x06\\x05\\x6e\\x45\\xd9\\x4d\\xec\\x90\\x85\\xa8\\x26\\xf4\\x82\\x8a\\x1c\\x8b\\xee\\x9a\\xc8\\xb1\\xed\\xc8\\xc5\\xb3\\x6a\\xe6\\x98\\xf9\\x18\\x4d\\x1e\\x37\\xb8\\xe0\\x2a\\xcc\\xd2\\xd5\\xcd\\xb1\\x38\\x73\\x1e\\x7b\\x84\\x80\\xc7\\xae\\x71\\x3b\\xa2\\xb0\\x45\\xad\\x37\\xf2\\xc0\\x20\\x11\\x52\\x78\\x98\\x5c\\xe4\\x1b\\x90\\x69\\x6c\\x48\\xd6\\xb9\\xf1\\xc9\\x26\\xa3\\x23\\x4b\\x40\\x80\\xa0\\xcf\\x86\\xac\\x5c\\x98\\xad\\x06\\xec\\xbd\\x26\\x96\\x36\\x50\\x97\\x39\\x75\\xf5\\x25\\xa1\\x3d\\xd8\\xf3\\xf6\\x19\\xc9\\x48\\xac\\xbb\\x65\\x85\\x93\\x9d\\xe8\\x95\\x86\\xb0\\x25\\x68\\x08\\xff\\x26\\x0c\\x18\\xe8\\x05\\xdd\\x16\\xec\\x09\\x4a\\x1c\\x22\\x95\\xf0\\x51\\xcf\\x79\\xab\\x0f\\xf7\\x42\\xe2\\x73\\x0e\\x29\\x5c\\x3c\\x88\\x3e\\xc5\\x4e\\x26\\x9f\\x49\\xa9\\x7c\\xc2\\x20\\x22\\xe5\\xbd\\x18\\xc6\\xa0\\x5b\\x08\\xd8\\x76\\xcc\\x38\\x44\\xf7\\x4a\\xa5\\x65\\x60\\x50\\xb7\\xd3\\x8e\\x6d\\x44\\xb0\\x30\\x5a\\x82\\x22\\xc6\\x3a\\x62\\x47\\xa7\\xe0\\xb6\\x20\\x55\\x4b\\xb4\\xe4\\x95\\x24\\x88\\xaa\\x80\\xdc\\x18\\x4a\\x72\\xcb\\x66\\xfb\\xe7\\x1e\\xe8\\x50\\x3f\\xed\\x1a\\xe8\\x58\\xe7\\x6c\\x85\\x3a\\x5c\\x13\\x36\\x0b\\x74\\xb0\\x2e\\x67\\x29\\x67\\x4e\\xc4\\xbc\\x5b\\x04\\x27\\x3c\\x16\\x7f\\x9e\\x51\\x4c\\xef\\xef\\x0a\\x78\\x40\\xdb\\x90\\x4b\\x33\\x04\\x3b\\xda\\x13\\xc1\\x0e\\x0e\\x25\\x3f\\x60\\xa0\\xad\\xa8\\xf4\\xe6\\xee\\x03\\x15\\x1f\\x68\\xbe\\xf3\\xa1\\x3e\\x3d\\xd0\\x35\\xcc\\xfe\\x68\\x98\\xe1\\xed\\x51\\x8e\\x05\\x19\\x80\\x58\\x90\\xf3\\x65\\x7c\\xac\\xcb\\x08\\x47\\x78\\x06\\x7b\\xc4\\x7f\\x6a\\xc6\\x35\\x49\\x71\\x0d\\xc5\\x61\\x27\\x37\\xc2\\x33\\x9e\\x12\\xe2\\x3e\\x3c\\xfe\\x36\\x10\\x7f\\xcb\\x1e\\x7d\\x93\\x6f\\x15\\x7b\\xe3\\xb7\\x62\\x6f\\x75\\x29\\x74\\x4b\\x12\\xdc\\x8c\\xbf\\x35\\x8f\\xbf\\xd1\\x19\\x7f\\x53\\xe3\\xd7\\x73\\xca\\xd9\\x37\\xac\\x8c\\x29\\xfd\\xdb\\xc4\\xdf\\x68\\xc5\\xdf\\xbe\\xd3\\xe2\\x84\\xdf\\xbd\\x3a\\xdf\\xdb\\xe2\\xfc\\xe9\\xcf\\x7e\\x2b\\x9f\\xaf\\xa4\\x5d\\x0d\\x35\\xe5\\x83\\x68\\x6c\\xbd\\xf7\\x90\\xeb\\x38\\xa2\\xfa\\x1c\\xb1\\x1a\\xca\\xa3\\x6d\\x55\\xbd\\x58\\xa9\\x72\\x44\\xa6\\x1b\\xe9\\xed\\xcf\\xce\\x30\\xae\\xe4\\x8e\\x30\\x6e\\xaf\\xd5\\xa3\\xb6\\xbd\\xd6\\x07\\xfd\\xa4\\xd5\\xfa\\xc4\\x27\\x37\\xc7\\xf7\\xda\\xc7\\xd7\\x6a\\xe8\\xe9\\x60\\x1a\\x5b\\xcd\\x12\\xa4\\xea\\xc8\\x32\\x05\\xe1\\x76\\xe8\\x30\\xfb\\x80\\x4c\\x00\\x22\\xe0\\xc6\\xe0\\xfe\\x6c\\x85\\x6d\\x24\\x10\\x65\\x52\\xe7\\xa3\\xe4\\x00\\x0b\\x06\\x51\\xfc\\x31\\x60\\xbd\\x90\\xa8\\x47\\x64\\x9e\\x2b\\x3c\\x1c\\x33\\xdb\\x75\\xc6\\xd9\\xed\\x9c\\x80\\xdc\\xed\\x34\\x87\\x42\\x6d\\x51\\xc7\\x8c\\x64\\x86\\x57\\xdb\\xdd\\xa8\\x34\\x79\\x34\\x11\\x49\\xef\\x96\\x55\\x54\\x71\\xa5\\xca\\xda\\x22\\x83\\xb2\\xab\\x94\\x87\\xb2\\x36\\x7d\\xab\\x12\\x17\\x22\\xdc\\xd2\\x74\\x2b\\xe4\\xa1\\xf2\\x84\\xd5\\xc4\\x24\\xf8\\x91\\x49\\x0e\\x02\\x96\\x41\\x27\\x22\\xb4\\x6e\\x1e\\x3f\\x42\\x2d\\x99\\xcc\\x06\\x6b\\x1d\\x09\\xe5\\xb0\\x57\\x0e\\x95\\x4d\\x55\\x5b\\xfe\\x94\\x4d\\x5b\\xa7\\xab\\x4d\\xc1\\xcb\\xd4\\x13\\x24\\x32\\xdd\\x60\\xd0\\xa1\\x58\\xe0\\x3a\\xc3\\x40\\x4c\\x26\\xe5\\x3d\\x60\\x82\\xe4\\x5f\\x88\\x16\\x85\\x33\\x80\\x5a\\x35\\x53\\x03\\x2f\\xae\\x93\\xfa\\x70\\x2f\\x5d\\x7f\\xa9\\xae\\x63\\x62\\xc0\\x09\\x3f\\x9a\\x03\\x07\\x33\\xd9\\xb1\\xe4\\xa6\\x27\\xc4\\x73\\x46\\x66\\xa4\\xaa\\xc0\\xf4\\xf3\\x71\\x15\\xb1\\x9e\\x0c\\x37\\x01\\xcb\\x6e\\x83\\x99\\x88\\xed\\x1e\\x53\\xf6\\x98\\x58\\x78\\x3b\\xac\\x3c\\x60\\x82\\xe0\\x58\\x98\\x8c\\xbd\\x61\\x3b\\xff\\x17\\xb6\\x49\\x0a\\x85\\x9a\\x11\\x0e\\xae\\x2d\\xe4\\x1c\\x78\\xd0\\x24\\x4f\\xe5\\xd6\\x89\\x50\\x12\\xf2\\x54\\x84\\x95\\xc4\\x34\\x50\\x4b\\x1e\\xb8\\x22\\xf5\\x8b\\x46\\xb3\\x50\\x5f\\xad\\x88\\x78\\xb0\\x1a\\x4e\\x47\\xcc\\x99\\x2f\\xea\\xb8\\x1e\\x55\\x20\\xce\\x10\\xdc\\xb1\\x08\\x6a\\xb9\\xc6\\x7e\\x65\\xd7\\x03\\xbe\\x70\\x06\\x8e\\xb8\\x51\\xf3\\xdf\\x8d\\xe1\\xd0\\x2d\\xd9\\x43\\x6b\\x55\\xd5\\x26\\xaf\\x96\\x73\\x84\\x1b\\xdd\\x2d\\xed\\x3a\\xd5\\x70\\x45\\x96\\x91\\x46\\x0d\\x8c\\x90\\x5b\\x31\\xc8\\x0a\\x87\\xde\\x27\\xe2\\xf5\\x16\\x24\\xf0\\x15\\x35\\xa1\\xd1\\xd5\\x44\\xd9\\x75\\x23\\x43\\x63\\xc9\\xd5\\x8a\\x18\\x90\\x5e\\x83\\xe1\\x76\\x46\\x82\\xf2\\xc4\\x92\\x30\\x32\\x9b\\xf0\\xa9\\xc5\\xec\\x18\\x1a\\xb3\\xab\\x41\\x5f\\x31\\x25\\x16\\xbf\\x1b\\x26\\x64\\x2d\\xea\\x5b\\xe0\\x1e\\xc0\\x9b\\x82\\x59\\x83\\x18\\x67\\xd0\\x61\\x6c\\xf8\\x62\\x21\\x80\\xa9\\xd4\\x17\\xf1\\x0c\\xb5\\x87\\x87\\xc8\\x36\\x9f\\xc1\\x8f\\xc8\\xf3\\x91\\xc4\\x88\\x00\\x9b\\x97\\x4f\\x40\\x2e\\x90\\x4d\\x9e\\x1a\\xcc\\xba\\x82\\xe5\\xe1\\xbe\\x88\\xda\\x1d\\xd5\\xad\\x18\\x0b\\x19\\x8c\\x1e\\x2c\\x37\\x1d\\xa5\\x59\\x3c\\x0f\\x13\\x82\\x21\\xe5\\x95\\xe3\\xe7\\x30\\x78\\x56\\x8b\\x78\\x21\\x7e\\x10\\xe1\\x3f\\xa4\\xeb\\x81\\xb0\\x6c\\xbe\\x94\\xab\\x61\\xeb\\xd9\\xb9\\xbc\\xb2\\x3b\\x4f\\x6f\\xb8\\xff\\xd2\\x36\\x5c\\x0a\\x69\\xcb\\x6a\\x9c\\xf0\\xe8\\x17\\x12\\xd9\\x72\\xc5\\x46\\x1f\\x5d\\x9d\\xc0\\xb4\\x45\\x22\\x75\\xe7\\xd2\\x25\\x8a\\x64\\x4b\\xf6\\x47\\xfc\\x27\\x8b\\x5a\\x67\\x8d\\x42\\xee\\xe3\\xc2\\xa5\\x6f\\xea\\x4f\\x87\\xcc\\x37\\x44\\xfe\\xbf\\x70\\x09\\xcd\\x21\\x1d\\x08\\x7a\\x4b\\x6f\\xbb\\x3e\\x3b\\x05\\x46\\x18\\x45\\xb5\\xd1\\x08\\x48\\xd4\\x5a\\xc8\\x0e\\xd8\\x2b\\xdd\\xaa\\x24\\x88\\x55\\x4b\\x0f\\x6e\\xa5\\x9b\\xe7\\xef\\xd6\\x1f\\x94\\x13\\xb2\\xf5\\x66\\x06\\xaa\\x4e\\xce\\x06\\x64\\xb0\\x80\\x41\\x39\\x13\\x22\\x3e\\xaf\\xb1\\x37\\x43\\x47\\x44\\xc4\\x48\\x23\\xf2\\xa0\\x8e\\x1e\\x80\\xdc\\x34\\x1f\\xcd\\x12\\x1c\\x26\\x57\\xf4\\x17\\x99\\x91\\x06\\xbd\\x44\\xe9\\x2a\\x63\\x88\\x02\\x8d\\x72\\xa1\\xd6\\xf7\\xa2\\x5e\\x3f\\x82\\x30\\xc3\\x3c\\x5c\\x21\\xb3\\x01\\xa0\\x1f\\x3d\\x2e\\x6a\\x09\\xd5\\xec\\xeb\\x16\\xdc\\xd3\\xac\\xa1\\x36\\xec\\xfb\\xa5\\x35\\x2d\\x76\\x70\\x89\\x94\\xeb\\x11\\x65\\x34\\xfb\\xa5\\xd6\\xfa\\x85\\x72\\xda\\x2b\\x02\\x9d\\xc9\\x42\\xa7\\xb3\\x71\\x10\\x31\\x4b\\x38\\x9b\\x86\\x08\\x95\\x96\\x49\\x12\\x49\\xdc\\xa7\\x96\\x11\\x72\\xf7\\x73\\x26\\x32\\x01\\x34\\x81\\xf5\\x70\\x89\\x54\\xd3\\x11\\x25\\xdd\\x08\\x20\\xfc\\xb9\\xcb\\xa4\\x11\\xaa\\xa8\\xe9\\x4a\\x6c\\x32\\x21\\x30\\x70\\x2e\\x65\\x04\\xd2\\xd7\\x9d\\x40\\xa7\\xe9\\xd6\\x37\\x90\\x6f\\x37\\xa7\\x1b\\xc7\\x7a\\x4c\\x02\\xf2\\xef\\xae\\xec\\x0d\\xb1\\x63\\x5d\\x45\\xa6\\x15\\x17\\x34\\xec\\x13\\x12\\x66\\x16\\x83\\xb3\\x79\\xdf\\x22\\x5b\\x5a\\x4d\\xf6\\x38\\x10\\x9a\\xe2\\x30\\x2c\\xdb\\xe2\\xf9\\x08\\x84\\x6b\\x0c\\x1a\\xa4\\x52\\x8b\\x2d\\xb3\\x03\\xf9\\xe3\\xd6\\xac\\xc5\\x99\\x76\\x3d\\x6f\\xe9\\x3c\\x32\\x62\\x62\\xc6\\x71\\x37\\x16\\x70\\xd1\\x65\\xe7\\x69\\x68\\xaa\\xd1\\x82\\x05\\xf6\\x2c\\x22\\x15\\xcc\\xc9\\x32\\x93\\xca\\x77\\x87\\x1a\\x94\\x64\\xf8\\x00\\x03\\xb8\\xea\\xab\\x65\\xbc\\x5a\\x32\\x1d\\xa3\\x1e\\x1f\\x16\\xd2\\x90\\x3b\\xaa\\x32\\xa3\\xa1\\x65\\x80\\xf0\\x85\\x97\\x0c\\x80\\x0b\\xbc\\x62\\x95\\x24\\x02\\x49\\x92\\x86\\x67\\x97\\x4c\\xce\\xc0\\x12\\x40\\x2c\\x3c\\xb0\\xc7\\xd2\\x20\\x57\\xc6\\xcd\\x4c\\xd3\\x2f\\x3d\\xef\\x90\\xce\\x33\\x26\\x69\\xc5\\xc6\\x21\\x23\\x55\\x95\\xf8\\x24\\x40\\x4b\\x43\\x6b\\xce\\xe6\\x87\\x4a\\x77\\x97\\x4a\\x7b\\x60\\xd0\\x52\\x31\\xc3\\x32\\x72\\x15\\x77\\x4b\\xb3\\xa7\\xde\\xf4\\x6f\\x9e\\x09\\x02\\x5e\\x41\\x45\\x9e\\xa5\\x21\\x1d\\x53\\xc4\\x88\\x00\\xe4\\x4b\\x94\\x54\\xcc\\x83\\xa3\\x9e\\x2e\\xad\\xef\\x6a\\xcb\\xaa\\x73\\x65\\x66\\x23\\x86\\x81\\x4d\\xc9\\x76\\x38\\x28\\x75\\x4f\\x57\\xd8\\xb4\\xab\\xc6\\x41\\xa4\\x63\\x9a\\x45\\x13\\x2c\\xd9\\xa7\\xde\\xad\\xca\\xc3\\x4b\\x1c\\xe3\\x88\\x23\\xdd\\x98\\x8d\\xbf\\x58\\x66\\x57\\x59\\xd3\\xd1\\x85\\x0e\\x5d\\xe3\\x4b\\xac\\xa9\\x1f\\x51\\xa8\\x5c\\x4a\\xca\\x6a\\x6e\\xd2\\x25\\xe2\\x4a\\x6a\\xbd\\xa8\\x35\\x6a\\x77\\x75\\xbe\\x71\\x30\\xfe\\xab\\x15\\x59\\x1b\\xeb\\xd1\\x6d\\x88\\xc7\\x99\\x0b\\x0c\\xd5\\x31\\x2e\\xb9\\xe0\\x39\\x7c\\x89\\xb8\\x2a\\x03\\x42\\xf3\\x46\\x36\\xf8\\x2f\\x17\\xd6\\x3f\\x54\\x81\\xfa\\x97\\x1c\\x0c\\x29\\x27\\x75\\xda\\x7c\\xa9\\xa0\\xb7\\xd4\\x30\\xa9\\xb0\\x24\\x0e\\x6d\\xb8\\xee\\xca\\x3c\\x29\\x65\\xcb\\xa6\\x98\\x88\\x60\\x0b\\x57\\x02\\x64\\x63\\x81\\x8d\\x39\\x32\\x22\\xf2\\xaa\\xd9\\x28\\xf1\\x16\\x81\\x8d\\xa5\\x5c\\x77\\xb5\\x03\\x2d\\x73\\x61\\x29\\x3d\\x3f\\xb0\\x86\\xb5\\x55\\xb7\\xd7\\x7e\\x1e\\x08\\x1c\\x75\\x33\\x65\\xa1\\xe9\\xa7\\x7b\\x44\\xe2\\xbe\\x3d\\x7c\\x4d\\x38\\x86\\xb1\\xd8\\xa9\\x4b\\xe4\\x98\\x38\\x0b\\x61\\x79\\xb4\\x0b\\x6a\\xcc\\x83\\x9c\\xec\\x60\\xe7\\xbc\\xd0\\x38\\xc0\\x25\\x47\\x4e\\x7d\\xc2\\xd7\\xc0\\x0e\\xb5\\x2f\\x0f\\x53\\xd6\\x66\\x15\\xe4\\x3d\\x57\\xcb\\x83\\x13\\x4d\\xf5\\x1b\\xf8\\xe0\\xac\\x33\\x4c\\xed\\xa0\\x91\\x2f\\x59\\x74\\xce\\xa5\\xee\\x48\\x0c\\x34\\xd5\\x69\\xdd\\x21\\xaa\\x06\\x43\\x84\\x10\\xc5\\x59\\xd8\\x21\\x2d\\x0c\\x02\\xe4\\x79\\x2a\\xaa\\x12\\x48\\xc6\\x42\\x51\\x32\\x02\\x65\\x16\\x93\\xe1\\x76\\x43\\xc3\\xfd\\xd7\\x67\\x76\\xc6\\xf7\\x04\\x97\\xb4\\xeb\\x41\\x08\\xfa\\xba\\x88\\x60\\xa8\\xa2\\x81\\x02\\xc2\\x84\\xdd\\x5d\\xab\\x2b\\x54\\x2e\\x00\\x42\\xcd\\x6e\\xab\\x49\\xab\\x47\\xa1\\xfc\\xde\\xcf\\x20\\x4e\\x19\\x3a\\xfa\\x28\\x8d\\x2e\\x51\\x1f\\x17\\x71\\xc5\\xb7\\x10\\xf9\\xff\\x72\\xa5\\xa9\\x21\\x3d\\x46\\xba\\x70\\x6e\\x47\\x47\\x2c\\x58\\xca\\x41\\x83\\x2e\\x8d\\x58\\x37\\xb4\\x3e\\x24\\xb7\\x23\\xf6\\xd1\\x90\\x44\\x8a\\xd4\\xfb\\x25\\x36\\xb9\\x71\\x0c\\xff\\x9b\\xd3\\xb0\\xa5\\x2c\\x1b\\xe5\\x6a\\x90\\x77\\xa0\\xc7\\xe9\\x1a\\xe3\\xf0\\x2c\\x8a\\x63\\xde\\x65\\xda\\xb6\\xd5\\x23\\x80\\x8c\\x28\\x99\\x19\\xe9\\xe6\\xe0\\x0a\\x98\\xad\\x98\\x65\\x24\\xab\\x85\\x81\\x3b\\xa0\\xf2\\x18\\x67\\x80\\x2c\\x14\\x3f\\x05\\xb8\\x84\\xbb\\x72\\xd4\\xdc\\xf4\\x6d\\x1a\\xde\\xa6\\x96\\xe1\\x6f\\x43\\x83\\x8f\\x58\\x9b\\xd8\\xfe\\x6b\\xe6\\x08\\x1b\\x04\\x2c\\xb6\\x81\\xcc\\xcf\\xc4\\xc6\\x34\\xef\\x2b\\x52\\x06\\xb8\\x7c\\x87\\xfc\\x4b\\x6b\\x63\\x65\\x93\\x4c\\x88\\x5f\\xc9\\xd3\\x53\\xf1\\xdf\\x7e\\xb4\\x1d\\x42\\x75\\xcb\\x92\\x43\\x49\\x19\\x45\\x01\\x86\\x42\\x23\\x06\\xb2\\x27\\x5f\\x08\\x30\\xaa\\x06\\x47\\x5e\\xb6\\xac\\x1e\\x6a\\x13\\xda\\x22\\x03\\xc3\\x86\\x2a\\x89\\x11\\xca\\xe0\\x2d\\x16\\x84\\x5d\\x8f\\x58\\x98\\x9f\\xd9\\x1a\\xff\\xca\\xb7\\x06\\x97\\xdb\\x03\\xef\\x88\\xec\\x19\\x0e\\xdc\\x91\\x33\\x08\\xc9\\x1d\\x2a\\x04\\xe8\\x52\\xfa\\xca\\x4b\\xf6\\x5b\\xc5\\x11\\xf7\\x27\\x88\\x77\\xfd\\x48\\xe6\\x8d\\x11\\xd4\\x4e\\x69\\x63\\x92\\x50\\x13\\x5f\\x38\\x67\\xa0\\x26\\xd4\\x3c\\x4d\\xed\\x18\\x5c\\xb7\\x08\\x6c\\x5e\\xee\\xea\\xe1\\x14\\x36\\x68\\x6a\\xee\\x7c\\xc4\\xc1\\x40\\x88\\xdf\\xf8\\xbd\\x7f\\x7d\\xc6\\x1f\\xd6\\xef\\xf5\\xb4\\x65\\xb5\\x3b\\x06\\xe5\\x63\\xe8\\xe1\\x63\\xfa\\xf6\\x6f\\x69\\x07\\xae\\xc8\\x16\\xb3\\x48\\x18\\xb5\\x1c\\x71\\x54\\x3d\\x3d\\xe9\\xc6\\xac\\xfe\\x1b\\x17\\xf9\\xea\\x29\\xd1\\x42\\x46\\x0a\\x24\\x0c\\x4d\\x75\\x9b\\x88\\x26\\x21\\x61\\x4e\\xd2\\xa6\\x1a\\xc9\\x79\\xec\\x03\\x71\\x4d\\x75\\x53\\x32\\x79\\xba\\x0f\\x39\\xe6\\x95\\x3c\\x4f\\x16\\x54\\xe2\\x51\\x97\\x57\\x04\\xc3\\x86\\x99\\xac\\xae\\x8b\\x9a\\x18\\x30\\x97\\x10\\x09\\x52\\x27\\xc4\\xa1\\xe3\\x44\\xa4\\xae\\xc3\\xb4\\x23\\x40\\xf5\\x91\\x5d\\xc2\\x8e\\xe4\\x3e\\xd3\\x8b\\x6a\\x43\\x06\\xa6\\x95\\x8d\\xe0\\x06\\xb7\\x9b\\x1b\\x87\\x5a\\xce\\x63\\x44\\x30\\x23\\x9a\\x1f\\x4b\\x2a\\x34\\x55\\x0a\\x0f\\xf6\\xb2\\x02\\xa1\\x60\\x22\\x1c\\x96\\x08\\x8b\\x59\\xce\\xad\\x5b\\xd1\\x9a\\xa9\\x7d\\x73\\xa4\\xd8\\x74\\x03\\x31\\x4c\\xc7\\xc0\\x88\\xc4\\xe6\\xe0\\x99\\x56\\xff\\x1a\\x74\\x0c\\x06\\x93\\x17\\xa0\\xc0\\xe2\\xe3\\xac\\x3e\\xa3\\xa5\\xa3\\xb3\\x9b\\x7b\\xe2\\x90\\x77\\x7d\\x5c\\xbd\\x65\\x4c\\xfd\\xd5\\x4a\\xb9\\x9e\\x1e\\x4b\\x16\\xd9\\xd5\\xe6\\x4b\\x6a\\xf8\\xbb\\x24\\xb2\\x1c\\x62\\xec\\x82\\x97\\x23\\xe6\\xe9\\x9a\\xd7\\x60\\x9f\\xb0\\xf8\\x2c\\x62\\xd8\\xca\\xa3\\xc4\\xcf\\xb5\\x9e\\xc4\\x6b\\x78\\x50\\x4c\\x32\\x8e\\x58\\xd4\\xf6\\x67\\xc9\\x0f\\xf7\\x22\\x35\\x34\\xa2\\x0b\\x0d\\xde\\x8b\\x2e\\xc4\\x20\\xcb\\xd7\\x00\\xc6\\x27\\x6d\\x4a\\xb5\\x18\\x26\\x76\\x61\\xd3\\xed\\x99\\xb1\\xe4\\x41\\xdf\\x13\\x61\\x1d\\x24\\x63\\x19\\xc8\\x97\\x6e\\x50\\x11\\x15\\x76\\x30\\x73\\x6e\\x44\\x21\\xfe\\xbb\\x3f\\xc0\\x9e\\x2c\\xcd\\x4a\\x0f\\x81\\x28\\x75\\xbb\\x71\\x54\\xec\\x3b\\xfb\\x66\\x03\\xae\\x2c\\xc4\\x5a\\x77\\x01\\xfa\\x17\\xd8\\xad\\xb6\\x63\\x23\\x1b\\x02\\x90\\xd3\\xa5\\x6d\\xba\\x31\\xfb\\xa6\\xa2\\x91\\x53\\x53\\x5f\\x26\\xef\\x80\\xdf\\xea\\xb3\\x8b\\xc7\\x1f\\x62\\x6f\\x26\\xfc\\x77\\x5c\\x89\\x5b\\x14\\xc1\\x63\\xab\\xb4\\x76\\x1a\\xb2\\xd9\\xea\\x91\\x9b\\x41\\xc2\\x32\\xbe\\xfb\\x7e\\xfe\\x41\\x6f\\xe7\\xff\\xfe\\xc4\\x24\\xad\\xdd\\x9c\\xf2\\x4e\\x34\\xe0\\x7f\\xdb\\x93\\x61\\x5e\\x19\\x54\\x05\\xf1\\x0e\\xe8\\x3e\\x4e\\x28\\xf9\\x20\\x0b\\x82\\x99\\x08\\x59\\x39\\x18\\xb8\\xde\\x96\\xa1\\xd2\\xa9\\xe8\\x7c\\x56\\x9d\\xa0\\x70\\x91\\xd5\\xb1\\x2b\\x45\\x65\\x60\\xe9\\x1b\\xbc\\x82\\xc2\\x5d\\x5d\\x5b\\xdd\\xe8\\x7a\\xe5\\x1b\\x3d\\x85\\xc6\\x72\\xa1\\x9e\\x0d\\xdb\\x68\\x7b\\x15\\xe9\\x1c\\xc0\\x85\\x3c\\x60\\x6d\\x89\\xc9\\x73\\xb3\\x0f\\xc3\\x7c\\x93\\x64\\x4b\\x8b\\xa9\\xbf\\x41\\x5d\\x37\\xf7\\x2d\\x0c\\xf2\\x5f\\xbb\\x25\\x82\\x4a\\x8f\\x4d\\x97\\x94\\x75\\x0e\\x18\\x96\\x88\\x97\\x68\\x9a\\x48\\x07\\xba\\xc9\\xcc\\x67\\x94\\x85\\x01\\xd6\\xc2\\xd5\\x0b\\x39\\x0b\\x79\\x15\\x59\\xce\\xd8\\x02\\x10\\x04\\x80\\x32\\xeb\\x3e\\x1b\\x10\\x10\\x70\\xff\\x61\\x18\\x5b\\xfd\\x89\\x58\\x8c\\xdd\\x42\\xec\\x9e\\x39\\x45\\xe2\\x49\\x5d\\x4f\\x84\\x70\\xe0\\x83\\x32\\xe1\\xb3\\x3d\\x8e\\x1a\\x80\\x3c\\xaa\\x19\\xd0\\x2d\\xb3\\xe2\\x07\\xaf\\xd0\\x68\\xca\\x58\\x70\\xa2\\xb6\\xa7\\xd0\\x4a\\x00\\x48\\x2a\\x4d\\x0f\\xb7\\xe6\\x49\\xc2\\xa1\\xb5\\x49\\x88\\x28\\x71\\x0f\\x2b\\xd2\\xa2\\x7b\\x58\\x7d\\x72\\x38\\x01\\x19\\x75\\x90\\x03\\x08\\x77\\x54\\xde\\x91\\xc5\\xb6\\x02\\xea\\x31\\x00\\x51\\x29\\x2b\\x20\\x15\\x3b\\xa6\\x68\\x8f\\x6a\\x75\\x50\\x88\\xa3\\x84\\x0e\\x53\\x28\\x03\\x9d\\x29\\xf5\\x51\\xa2\\x6c\\x55\\x09\\x47\\xa1\\x13\\x4b\\x87\\xc3\\x66\\xfb\\x62\\xb7\\x74\\x38\\x5d\\x83\\xb7\\x19\\x99\\x75\\x84\\x2d\\x4b\\xbb\\x0a\\xd5\\xca\\xfb\\x68\\x28\\xb7\\x20\\x8b\\xf4\\xe2\\xd0\\xc2\\xe9\\x1c\\x09\\xa6\\x0e\\x25\\xf2\\x48\\x0e\\x2d\\x07\\x02\\x80\\x06\\x17\\xc1\\x1c\\xdc\\x80\\x33\\x17\\xc4\\xc0\\xaa\\x71\\x15\\x3c\\x0d\\x78\\x11\\x2a\\x8c\\x21\\x31\\xa4\\x2d\\xdb\\x7f\\x78\\x3a\\xf7\\xe9\\x5d\\xf4\\x37\\xb6\\x8b\\x32\\x8a\\x27\\xd5\\x94\\x1c\\x97\\x91\\x61\\xdc\\x8c\\x4b\\x14\\x35\\xa6\\xf4\\xef\\xd8\\xdb\\x87\\x5d\\x49\\xbe\\x61\\x01\\xfc\\xdb\\x33\\xc3\\x90\\x0b\\x1d\\x9d\\xcb\\x85\\xb3\\xa8\\xc5\\x01\\xa4\\x64\\x88\\x65\\xda\\x61\\x7a\\xd6\\x30\\x34\\xf3\\xd7\\xab\\xa5\\xd5\\x38\\x6c\\x06\\xb9\\xad\\x15\\x15\\x9b\\x0e\\xf9\\xcc\\x3a\\x67\\x80\\x06\\xa3\\xa4\\x7a\\x40\\x94\\xee\\x88\\x8d\\x18\\x8e\\x0f\\x19\\xaf\\xea\\x75\\x61\\x70\\x74\\x86\\x3a\\x95\\x81\\x98\\x8f\\xce\\x74\\x61\\x7d\\x74\\x5f\\xc1\\x56\\xd3\\xdf\\x26\\x6f\\xbc\\xac\\xa7\\x98\\x44\\x55\\x49\\xdf\\xc7\\x4a\\x5b\\x8d\\x1d\\x95\\x55\\x38\\x4b\\x1d\\xc1\\x27\\x92\\x1a\\x86\\x3a\\x7e\\x96\\xea\\x2d\\x34\\x21\\x78\\x02\\xa7\\x1b\\xa9\\xf7\\xbf\\xf5\\x44\\x5e\\x0a\\x57\\xa3\\xb0\\x76\\x7d\\x9d\\xb2\\x71\\xc9\\x61\\xa4\\x72\\x61\\xa9\\x5b\\xcc\\x78\\x5d\\xe0\\x69\\xa9\\xdd\\x98\\xf1\\x7f\\xb7\\x2c\\x59\\x7f\\x18\\xe7\\xad\\x21\\x49\\xc2\\x9b\\xca\\x90\\x26\\xed\\x42\\xb9\\xe1\\x1a\\x26\\x73\\x91\\xd0\\xa5\\x5e\\x98\\x64\\x8b\\x06\\x9c\\xb2\\xe7\\x5b\\xf1\\x41\\x0f\\xad\\xc1\\xfc\\xd4\\xbb\\xed\\xef\\x37\\x7c\\xc3\\xff\\xc1\\x37\\x8d\\x84\\xb4\\x49\\xce\\xa1\\x16\\xda\\xa2\\xe4\\x14\\xaa\\x2e\\x7a\\x49\\x1b\\x03\\x38\\x47\\x1d\\x06\\x6f\\xa6\\x7e\\x61\\xe9\\x5b\\x14\\xc0\\x29\\x58\\x36\\x01\\x20\\xba\\xc8\\x12\\xa5\\x92\\x43\\xd6\\x1b\\x98\\x81\\x4b\\x54\\x51\\x7a\\x4b\\xea\\xfd\\xfb\\x55\\xd7\\xee\\xaf\\x5c\\xea\\xc6\\x55\\x4f\\x1a\\xd5\\x8d\\x45\\x82\\x5a\\x1c\\x9c\\xf5\\xc7\\x2a\\x04\\xbf\\xba\\xcd\\x49\\xbd\\x81\\x4c\\x47\\x49\\x37\\xde\\xe7\\x7f\\x3c\\xf3\\x6d\\xe9\\x20\\x19\\x5b\\x69\\x3d\\x0c\\x1d\\x46\\x29\\x15\\x47\\xa2\\x8b\\x3a\\x86\\x32\\xb6\\x58\\xaa\\x6a\\xc9\\x9c\\x2e\\x79\\xd0\\xce\\x1c\\x0c\\x2a\\x1d\\xfa\\xe4\\x8c\\xaa\\x41\\x0a\\x80\\x40\\x20\\x0e\\x64\\xf0\\xe0\\x76\\x89\\x7d\\xdc\\xd8\\x0d\\xff\\xd3\\xaa\\x27\\xd2\\xb5\\xe8\\xf9\\xa0\\x52\\xf2\\xa5\\x8a\\x1a\\xe0\\x23\\x5d\\x62\\x66\\x3d\\x7f\\xd4\\xd3\\xc5\\xae\\x7a\\xbe\\xc4\\x7a\\xcb\\x33\\xfd\\x9f\\xaf\\xa0\\x3a\\x52\\xdb\\x9f\\xda\\x08\\x23\\x6f\\xc8\\x3b\\x92\\xf4\\xac\\x2b\\x3b\\x42\\xec\\x37\\xf6\\xd2\\xff\\xe2\\x5f\\xcf\\x2d\\xa4\\x4b\\xa6\\x7e\\xe0\\x77\\x63\\xa6\\x02\\xf7\\xb9\\x8a\\x0e\\x40\\x87\\x17\\xab\\xc8\\x71\\x73\\x6b\\xfc\\xaf\\xcb\\xef\\xee\\xa1\\xd5\\xb4\\x89\\x50\\x28\\x6a\\xde\\x64\\x2b\\x8f\\x29\\xec\\x5b\\x2d\\x62\\xcf\\xb5\\x14\\xa4\\xe8\\xc8\\x80\\x60\\xbf\\x95\\x5f\\xfd\\xdf\\xce\\xc0\\x6d\\xa4\\x7a\\x19\\xa9\\xba\\xa7\\xab\\x57\\x74\\x6b\\x6a\\xff\\xf7\\x35\\xb5\\x59\\x3d\\x58\\xd9\\xa8\\xa7\\xd0\\xf3\\x06\\xcf\\xb2\\x56\\x5d\\x3a\\x55\\xff\\x06\\x70\\xea\\xbc\\x34\\x9b\\x41\\xa2\\xbc\\xf4\\xcf\\x40\\xd4\\x10\\x21\\x5e\\x45\\x67\\x38\\x57\\xcf\\x2d\\x8b\\x85\\xe7\\x01\\xee\\x88\\x2a\\x0c\\x10\\xd2\\xef\\xf6\\x2f\\xd4\\x1e\\x03\\x20\\x99\\x47\\x30\\x9b\\xc8\\xc2\\xb5\\x50\\xb6\\x26\\xb5\\x9b\\x85\\xc7\\x6f\\x14\\x95\\xbc\\x3c\\x73\\x0c\\x5c\\xb2\\x2a\\xc6\\xec\\x28\\x1d\\x64\\x47\\x06\\x04\\x4e\\xaa\\x6e\\xa2\\x56\\xab\\xa9\\x05\\xf8\\xb0\\x5c\\x88\\x69\\x8f\\x1c\\x80\\x26\\xd5\\x09\\x28\\x5d\\x45\\x15\\xab\\x79\\x0b\\xe3\\x0f\\x1a\\xa2\\xaf\\x62\\x23\\xaa\\x2a\\xb9\\x76\\xb5\\x8e\\xa9\\xd4\\x20\\x95\\xf5\\xdf\\x85\\x1d\\x15\\x0b\\x60\\xb0\\x67\\xd8\\xdc\\x33\\x90\\x89\\x0c\\xa2\\x5a\\x56\\x47\\x2c\\xea\\xac\\x32\\x8d\\xa3\\xd7\\x1d\\x46\\x1c\\x40\\xd6\\x16\\xd6\\x80\\x5b\\x60\\x69\\x27\\x49\\x7b\\xec\\x86\\x19\\x45\\xc6\\x8c\\x1d\\xaa\\x44\\xab\\x08\\xd5\\x20\\x1d\\x7d\\x04\\x07\\xaa\\x53\\x6a\\x0f\\xf7\\x92\\x46\\xe0\\x6a\\x49\\x4b\\xab\\x98\\xcc\\x06\\xfa\\x47\\x8e\\xce\\xc1\\x4f\\x0b\\x36\\x83\\x74\\x89\\xbe\\x5f\\xcf\\x0b\\x0c\\x0b\\x35\\x0e\\x20\\x51\\x6e\\x21\\x77\\x54\\x0a\\xca\\xae\\xaf\\x0a\\xb6\\x09\\x20\\x0d\\x82\\xae\\xc4\\xa6\\x83\\x83\\xa8\\xd8\\x63\\x73\\x68\\xab\\xb9\\xca\\x96\\x8b\\xe6\\x80\\x54\\x8a\\xad\\x62\\x2e\\x6e\\x3b\\x2d\\x8c\\xc1\\x4d\\x53\\xf5\\x57\\x6f\\x78\\x5e\\xd2\\xf9\\xe2\\xf5\\xc8\\xfa\\x40\\xe7\\x17\\x70\\x00\\xdf\\x8a\\x52\\x3e\\x8a\\x92\\xd4\\x23\\xe6\\x3c\\xf6\\x5c\\x42\\x51\\xdd\\x26\\xa1\\x2d\\x0c\\x20\\x10\\x9a\\x88\\x40\\x13\\x00\\x4e\\x69\\xfa\\x8c\\x8f\\x34\\xa1\\xc2\\xb0\\x39\\x65\\x39\\x2d\\xab\\x00\\x8e\\x83\\x73\\xa3\\xb0\\x55\\x07\\x98\\x1d\\x6e\\xb5\\x78\\xf6\\xf1\\x18\\x8e\\xcc\\x12\\x8b\\xf4\\xe3\\x6b\\xdd\\x59\\x52\\xd4\\x63\\x1c\\xa8\\xc3\\xd4\\x43\\x32\\x18\\x49\\x17\\xb3\\x7a\\x73\\x87\\x3a\\xed\\xc3\\xca\\x02\\x70\\x7a\\x50\\xa1\\x43\\x89\\xad\\xea\\xc9\\xec\\xa1\\xe6\\xc5\\x8b\\x06\\x2f\\x55\\x4f\\xa5\\xce\\xda\\xd5\\x62\\xc4\\x4e\\x1e\\x79\\xf9\\x16\\x94\\xcd\\x0a\\x42\\x02\\x0b\\x7f\\xf0\\xb4\\x3a\\xec\\xc2\\x64\\x47\\xac\\xa3\\xb6\\x00\\x1b\\xc7\\x3d\\xd3\\xe1\\xa0\\xec\\x3d\\x02\\x36\\x85\\x45\\x33\\x93\\xc9\\xf6\\x48\\xad\\x2b\\xdb\\x6a\\xdc\\x24\\xed\\xb4\\xb8\\x9e\\x5e\\xc0\\xcf\\xdd\\xae\\x01\\x9a\\x03\\x71\\xfd\\x16\\xa4\\x04\\x1a\\x9e\\xed\\xa1\\xaa\\x66\\x9b\\x19\\xb2\\x7d\\xa2\\x94\\xd1\\xe0\\x37\\x15\\x99\\x59\\x30\\x29\\xa8\\xf1\\x61\\xb8\\xe9\\xe2\\x3c\\x17\\x36\\x15\\x64\\x41\\x64\\xc3\\x79\\x9b\\xe5\\x3a\\x02\\x43\\xb8\\x34\\xdb\\x02\\xb6\\x2b\\x64\\x01\\xcd\\x61\\x18\\x51\\xf3\\x57\\xcf\\xdd\\xa2\\x78\\x01\\x60\\x7c\\x2c\\xbf\\xf0\\xa3\\xfa\\xf8\\x68\\x47\\xac\\x27\\x03\\x2c\\xea\\x3e\\x19\\x75\\xb9\\x57\\xc4\\x70\\x06\\x6b\\x77\\x77\\xc1\\xd2\\x1d\\x30\\x0b\\x80\\x06\\xc6\\xb7\\x5a\\x58\\x6c\\x13\\x9c\\x1d\\x82\\xa3\\x37\\xd7\\xe5\\xce\\x20\\xa9\\x5e\\xc9\\x0e\\x58\\x19\\xc8\\xad\\x6f\\x56\\xf9\\x59\\xf2\\x0e\\xf4\\x0f\\x96\\xcf\\xea\\x4d\\x0d\\x87\\x84\\x9a\\xc6\\x61\\x25\\x03\\x86\\x05\\x86\\x30\\x93\\x7e\\xc6\\x64\\xd2\\x4a\\xe2\\x93\\x3a\\xfd\\x62\\x80\\x81\\x1b\\x16\\xc1\\xab\\x33\\xd0\\x96\\xab\\xc0\\x13\\x45\\xcd\\xb7\\x19\\x73\\xdd\\xad\\xed\\x49\\x3c\\x1c\\x17\\x47\\x56\\x3f\\x53\\xd6\\xdb\\x84\\xd8\\x56\\xb5\\x35\\xde\\xa1\\xba\\x0b\\x64\\xaa\\x41\\xc6\\x51\\x12\\x9d\\x47\\x96\\xec\\xc8\\xf6\\x75\\x64\\x65\\x1d\\x58\\x5e\\x07\\xb6\\x78\\xf8\\xcc\\x28\\x07\\x4a\\x28\\xc6\\x50\\x04\\xd7\\x4b\\x85\\x1c\\x62\\xfa\\x6a\\xa7\\x07\\xb8\\x2a\\x81\\x11\\x07\\x15\\x3e\\x60\\x5d\\xd6\\x70\\x82\\x38\\x4d\\xba\\x14\\x4f\\xa9\\xaf\\x84\\x30\\xcb\\xba\\xea\\xe1\\x94\\xa6\\x65\\xe1\\x95\\xec\\x2d\\xd5\\xb1\\xea\\x2a\\xe0\\xf2\\x8a\\x68\\x11\\xd8\\x8c\\x54\\x03\\xe7\\x0a\\x08\\x78\\xaf\\xc1\\x29\\x2e\\x20\\x00\\x2d\\x08\\x80\\x93\\x67\\xa5\\xc5\\xe5\\x4c\\x60\\x56\\x2b\\x75\\xc0\\xa1\\x25\\x64\\x31\\xb0\\x73\\x05\\xd8\\x08\\x83\\x94\\x90\\x43\\x3d\\x2b\\x42\\x8a\\x5e\\x63\\xc5\\x3d\\xd8\\x56\\x43\\x80\\xc2\\xce\\x1c\\x76\\x3e\\xbf\\x5b\\xb2\\x54\\x4e\\xd9\\x8f\\x14\\xcc\\x0e\\x14\\xbe\\x6e\\x1d\\xfd\\x97\\x6f\\x45\\x77\\x5e\\x5f\\xfd\\x8d\\x6a\\x58\\xb7\\x11\\x24\\x07\\xa6\\x6c\\xf4\\x2f\\x38\\x97\\x59\\x82\\xa7\\x37\\x71\\x4e\\x74\\x2b\\xad\\x1c\\xe2\\x70\\xa1\\x39\\x4e\\x37\\xaa\\x7b\\x85\\x75\\x9d\\x2a\\x07\\x39\\xb1\\x23\\xc9\\x8a\\xb1\\x38\\x19\\x65\\x53\\x6e\\x97\\x58\\xb9\\xed\\x1d\\x85\\xe3\\x56\\x18\\xd4\\x51\\xd7\\x89\\x98\\x81\\xa1\\x99\\x72\\x9f\\x96\\x96\\x85\\x20\\xf2\\x24\\xd6\\x09\\x53\\x34\\xb4\\x86\\xba\\xb7\\x1b\\x19\\x10\\x47\\x77\\x44\\xb6\\xea\\x6c\\x55\\x6c\\xbc\\xbc\\x58\\x0f\\xc9\\x63\\xe2\\x2c\\x34\\x40\\x01\\x71\\x9d\\xf1\\x48\\x1e\\x4a\\x0d\\x10\\xf0\\x96\\x5c\\x57\\x65\\x2c\\x08\\x4e\\xe1\\x81\\xc0\\x9b\\x63\\x82\\xc5\\x39\\x09\\x92\\x57\\x3b\\x9a\\xa0\\xec\\x20\\x6d\\x49\\x16\\x24\\x31\\x5c\\xa8\\xfe\\x7c\\x76\\xc0\\x55\\x4b\\x33\\x7a\\xc9\\xc2\\x8d\\x65\\xf8\\xe2\\x8a\\xcb\\x6f\\xac\\x96\\x21\\x5f\\x38\\xb5\\xa3\\xa2\\xae\\x23\\x2d\\x64\\x71\\xaf\\x8e\\x2c\\x16\\x43\\x16\\x17\\x13\\x5a\\x96\\x62\\x80\\x2a\\x23\\xd8\\x1b\\xf0\\x11\\xa8\\xd4\\x2d\\x5a\\xdd\\x7c\\xc6\\xa1\\x48\\xee\\xca\\x53\\xf2\\x30\\xb5\\xaa\\x26\\x75\\x7b\\xba\\x1d\\x56\\xc8\\x8e\\x2c\\x41\\xcf\\x49\\x29\\xc1\\x82\\xc1\\x56\\xb8\\x60\\xc1\\x32\\xab\\x4c\\xe2\\x6e\\xd8\\x0a\\x98\\xdb\\x63\\x1c\\x31\\x8f\\x0b\\x23\\xd5\\x09\\x03\\x46\\xaf\\x1a\\xab\\x57\\xc2\\x72\\xd8\\xc5\\x2d\\x2c\\xc1\\xaf\\xcf\\x68\\x7b\\xb4\\x3a\\x1f\\x2e\\x61\\xc0\\x60\\x34\\xe2\\x10\\x5c\\x19\\x94\\xa1\\x81\\xd5\\x6c\\xec\\x2b\\xf4\\x97\\x17\\x00\\x89\\x24\\x38\\x03\\x01\\xc2\\x92\\x61\\xb4\\xd9\\x55\\xb9\\x82\\x7a\\x82\\x10\\x6c\\xd2\\x6f\\xc7\\x4c\\xe0\\x3f\\x62\\x03\\x57\\x0c\\x8b\\x17\\x35\\x36\\x80\\x10\\x49\\x79\\xa3\\x7a\\xc0\\x30\\x6c\\x32\\xc9\\x84\\x26\\x26\\x16\\xe9\\x40\\x86\\x00\\x6a\\x6a\\x49\\x48\\x0a\\xa3\\x79\\x72\\x9f\\x32\\xf4\\xca\\xa5\\xd6\\x0d\\x28\\x8b\\xa1\\x52\\x19\\x20\\x05\\x83\\xcf\\x1b\\xd8\\xcb\\xe3\\x88\\xa8\\xf2\\x09\\x14\\xf6\\x08\\x99\\x60\\x9e\\x72\\xdb\\x01\\x1c\\xe0\\x60\\x45\\x6a\\x30\\x24\\x70\\xa4\\x1c\\x70\\x0f\\x02\\x8d\\x55\\xa2\\xd0\\xe7\\xda\\x67\\xc9\\x8c\\x09\\x84\\xe7\\xe8\\x8c\\x66\\xb0\\x01\\xb0\\x81\\xdd\\x0b\\x8c\\x35\\x1d\\xbb\\xa1\\x81\\x87\\x57\\xda\\x42\\x18\\x2e\\x3a\\x15\\xc7\\x0a\\xab\\xcc\\x04\\x56\\xbb\\xb9\\x0d\\x08\\xa8\\x73\\x93\\x20\\x53\\xcf\\xe8\\x42\\xad\\xbb\\x48\\x1b\\x86\\x75\\x00\\xfe\\x01\\x15\\xc5\\xb4\\x2c\\x8e\\x68\\xf5\\x2c\\xc0\\x85\\xb2\\xdb\\x05\\x72\\x06\\x2f\\x91\\xb2\\x0d\\x1e\\x15\\xa8\\x06\\xa8\\x19\\xd9\\xd3\\x7a\\xd1\\x62\\x52\\x28\\x7f\\xbb\\x16\\x44\\x14\\xcb\\x4f\\xb4\\x0e\\x26\\x18\\x15\\x4b\\x0f\\xf7\\x0c\\xe9\\x96\\x1c\\xa3\\x6a\\xba\\x17\\x27\\xd2\\xa4\\xb0\\xa0\\x1c\\x14\\xc9\\xc3\\x61\\x7e\\x04\\x02\\xa6\\x23\\xc1\\xb3\\x6c\\x14\\x38\\xab\\x25\\x2b\\x6d\\xd2\\xc0\\x49\\xde\\xa3\\x04\\xc1\\x41\\x08\\x55\\x25\\xff\\x08\\x8f\\x2c\\x58\\x69\\x01\\x3c\\x4f\\x14\\xea\\x6e\\xe5\\xd1\\x4e\\x99\\x17\\xa2\\x87\\x38\\x4c\\xde\\x9f\\x05\\x18\\x86\\xd7\\x5b\\xbc\\x40\\x60\\xed\\x59\\xfc\\x6e\\x61\\x02\\xba\\x2a\\xa6\\xf1\\xa1\\xf3\\x9c\\xa1\\x4f\\xcc\\x4c\\x31\\xa4\\xb0\\x2c\\x2a\\x87\\x3c\\x26\\x25\\xec\\x5d\\xfd\\x87\\xa6\\xc1\\x92\\xca\\x42\\x6c\\x0b\\x88\\xa9\\x50\\xb4\\x29\\x74\\xe2\\x6f\\x01\\xed\\xce\\x86\\x02\\x7b\\x54\\xbe\\x5a\\xd6\\xc9\\xc7\\xb6\\x7a\\xfa\\x50\\x5e\\x56\\x38\\x44\\x4e\\x4b\\x1b\\x4c\\x45\\x8f\\x2d\\xed\\xb1\\x74\\x35\\xa5\\xb7\\xcd\\xec\\x8a\\x5a\\x98\\x92\\x61\\xb2\\x19\\xea\\x47\\x32\\x4a\\xa9\\x77\\x84\\xe1\\x61\\x1c\\xb3\\x5a\\x72\\xc9\\xea\\x3e\\xa6\\x43\\xa0\\xd5\\x19\\x32\\x4c\\x67\\x67\\x73\\x87\\x92\\xca\\x90\\x7a\\x94\\xa6\\x42\\xb0\\x60\\x5f\\x85\\x61\\x4a\\xd1\\x0c\\x6d\\xc8\\x2a\\xb3\\x65\\x03\\xf1\\x79\\x9e\\xd2\\x0a\\x7f\\x55\\xd3\\x21\\x31\\x3b\\xd1\\x97\\x65\\xf1\\xad\\x08\\xec\\x88\\xa5\\x58\\x1d\\xe4\\xd3\\xd3\\xf0\\xa5\\x4f\\xc3\\x68\\x3a\\x0d\\xad\\x5f\\x58\\xe8\\xa8\\x09\\x63\\x22\\xfc\\x21\\xe7\\x7e\\xc4\\xa6\\x9f\\x10\\x1d\\x6a\\x9b\\x5d\\x62\\xad\\xe3\\xe1\\x3e\\x03\\xea\\x83\\x1c\\x01\\xe7\\x30\\x8c\\xf5\\x85\\x5b\\xc8\\x3c\\x21\\x36\\xf4\\xb4\\x18\\xd2\\x74\\x84\\xf5\\x5e\\xba\\xec\\xe6\\x4f\\x74\\xb0\\xd8\\x58\\xb5\\x1e\\x9d\\xde\\xd1\\x79\\x85\\x0f\\x79\\x79\\x4e\\x2a\\x09\\xec\\x01\\x6e\\x21\\xe8\\x45\\xae\\x4e\\xa5\\x84\\x42\\x42\\xab\\x80\\xb9\\xf1\\x92\\xff\\xc7\\x35\\x26\\x80\\x92\\xce\\xac\\xca\\xa0\\x21\\x11\\x9f\\xbd\\x00\\x67\\x4c\\xa0\\xed\\xa6\\x17\\x0d\\x3b\\xfc\\xd5\\x72\\xf0\\xf0\\x41\\x21\\x8e\\x79\\x38\\xe9\\x02\\xf7\\x99\\xa1\\x67\\xdc\\xa7\\xec\\x3b\\x76\\x65\\x19\\x56\\xf7\\x6d\\x04\\x0e\\x27\\x6b\\x50\\xcd\\x93\\x38\\x8c\\x72\\x34\\xa1\\x4b\\x14\\xe1\\x83\\x7a\\xbd\\x00\\x2d\\x33\\x92\\x85\\x15\\xd3\\x52\\x4e\\x91\\x4c\\x01\\x03\\xc8\\x8a\\x7c\\xd0\\xaa\\xe7\\x35\\xf4\\x0f\\x38\\x5c\\xf6\\x38\\x2c\\xb2\\xd8\\x4e\\x28\\xac\\x13\\xc0\\xc0\\xbc\\x78\\xb8\\x2f\\x49\\xb7\\x4a\\x01\\xa4\\x8b\\x51\\xd9\\x68\\x11\\x5e\\x23\\x43\\xcc\\xb6\\x0a\\x6f\\xc0\\xf4\\x7d\\x95\\xee\\xce\\x75\\x32\\xbc\\xe7\\x80\\x75\\xe3\\x15\\x3e\\x2a\\x06\\xdf\\xc0\\x03\\xdb\\x99\\x63\\xe3\\x3c\\x5c\\xdf\\xb8\\x42\\x92\\x51\\x78\\x51\\x16\\x4e\\xbe\\x5e\\x0b\\x2f\\xc8\\xb9\\x03\\x7c\\xd5\\x6e\\x9d\\xd1\\xff\\xf3\\xdb\\x9e\\xd1\\x75\\x42\\xdd\\xaa\\x56\\xcd\\x4c\\x9b\\xd4\\x16\\xa4\\xca\\x8e\\x80\\x7f\\x0b\\x96\\xdb\\x6d\\x17\\xca\\x63\\x8b\\x02\\xe7\\xbc\\xb5\\xbd\\x90\\x15\\xd7\\xa4\\xe6\\x14\\x37\\x93\\xcc\\x47\\x87\\xb1\\x01\\x9e\\x1e\\xf3\\x33\\xbc\\xe6\\x3b\\x02\\x8e\\xba\\x45\\x46\\x5d\\x6c\\xda\\x40\\x36\\x93\\x73\\xda\\x90\\x59\\x6e\\xc8\\xc1\\xf4\\x67\\xce\\xdb\\xb6\\x0c\\xa0\\xf3\\xbc\\x55\\x3e\\x28\\x21\\x5b\\x9f\\x87\\x1d\\xb8\\x36\\x3c\\xa7\\xae\\x9f\\xd9\\x89\\x6b\\xb7\\xc2\\x5d\\x7f\\xf7\\x28\\x93\\x3f\\x6a\\xbb\\xd0\\xa8\\x47\\xac\\x49\\x35\\x77\\xee\\x61\\x58\\xb4\\xc7\\xac\\x29\\xa6\\x1d\\x39\\x2f\\x2f\\x91\\xf3\\xe4\\x03\\x0d\\xaf\\x27\\x42\\xa0\\x48\\x54\\xd5\\x65\\x15\\xd4\\xa5\\x86\\xde\\x43\\x07\\x7b\\x69\\xe0\\xb1\\xa3\\x10\\x73\\xd8\\x14\\xf4\\xc5\\x4c\\x12\\xcb\\x22\\x43\\x1b\\xe4\\x30\\x16\\x86\\xd0\\x69\\xa9\\xa9\\xef\\x22\\x47\\x85\\x69\\x67\\x45\\xc4\\x27\\xf2\\xcd\\x45\\x3a\\x6c\\xfb\\x66\\xb6\\x3d\\xa2\\x61\\xfd\\x88\\x95\\x87\\x7e\\x91\\x8e\\x5a\\x9a\\x95\\x51\\x22\\xe2\\xdf\\x4d\\x0c\\xe7\\xc5\\xbd\\x31\\x02\\x4b\\x70\\x34\\x76\\x85\\x11\\x92\\x56\\xdd\\x98\\xa5\\x38\\xd6\\xee\\x45\\xd9\\xb3\\xe5\\x9c\\x54\\x91\\x8e\\x23\\x56\\x79\\x0e\\x99\\xf0\\xd5\\xe3\\x2d\\x37\\x4a\\x85\\x3c\\x8c\\xa3\\xdf\\x96\\xf6\\x06\\xed\\xa4\\x25\\xed\\xa1\\x75\\x86\\xa7\\x1b\\x7e\\x68\\xd2\\xfe\\xeb\\x53\\x10\\xae\\xe8\\xc4\\x80\\x98\\x0a\\x9c\\x78\\x9a\\x97\\x00\\x3f\\xc8\\x62\\x26\\xd5\\xb8\\x9f\\x60\\x31\\xdf\\x95\\x7d\\x40\\xaf\\xa9\\xb9\\x21\\x79\\xa2\\x10\\x2f\\xc0\\xef\\x9e\\x03\\xc7\\xe5\\x4c\\x9e\\x80\\x6c\\x05\\x75\\x8f\\xb8\\xf0\\x98\\x91\\xfa\\xe6\\xeb\\x4b\\x66\\xf1\\xe8\\x9a\\x5b\\x7c\\x8c\\xe0\\x5d\\xc0\\x54\\xcb\\xd5\\x32\\x7c\\xa3\\xbf\\xe1\\xce\\xb3\\x3a\\xa4\\x6a\\xe1\\xc2\\x21\\x6d\\x79\\xc1\\xa7\\x60\\x3f\\x98\\x08\\x36\\xcf\\xcd\\x00\\x9d\\xd5\\x43\\x9e\\x91\\x25\\xec\\xaa\\x82\\xe1\\xc2\\x21\\xf7\\x6d\\xee\\x3b\\x03\\x57\\x8d\\x5d\\x57\\x57\\xd9\\x9d\\xbf\\x35\\x79\\x4a\\xbc\\x8a\\x99\\x47\\x74\\xa5\\x69\\x70\\x02\\x03\\x33\\x04\\xc6\\x2a\\xbf\\xb0\\x9f\\xf7\\x97\\x82\\x16\\xb9\\xc9\\x62\\xf0\\xf7\\x57\\x16\\x13\\xec\\x2d\\xb6\\xbd\\xc5\\xa2\\xae\\x61\\x21\\xcb\\xf3\\xaa\\x83\\xde\\xac\\x9c\\x8f\\x7d\\xb8\\x88\\xde\\x21\\xb9\\xea\\x2e\\x3e\\x5b\\x94\\xc2\\x81\\x81\\xee\\x8a\\x82\\x89\\x02\\x76\\x87\\x24\\x8f\\xe0\\xb1\\xd7\\xdf\\xb2\\x55\\x7f\\x76\\x67\\xaa\\x32\\x63\\xce\\x23\\x80\\x0e\\x2c\\xcd\\xa6\\x80\\xf6\\x58\\xad\\x40\\x91\\x53\\x60\\xc7\\x9f\\x12\\xe0\\xf9\\x47\\xcc\\x49\\x8f\\x0e\\x8f\\x07\\x90\\x17\\x79\\x81\\xf8\\xe3\\x10\\xde\\x73\\x11\\xbc\\xe0\\x76\\x36\\x23\\x84\\xd7\\x2c\\xed\\x5b\\xd2\\x13\\x21\\x3c\\x2a\\x6e\\x64\\x06\\x06\\xfc\\xcc\\x56\\xee\\x2c\\x06\\x1f\\xe9\\x0c\\xd1\\x21\\x40\\xe7\\x59\\xb4\\x38\\xea\\xef\\x0e\\xcf\\xed\\xd7\\x03\\xd0\\x70\\x00\\x48\\x82\\x50\\xe0\\x54\\x66\\x57\\x17\\xb9\\x79\\x5c\\xd4\\x82\\x5a\\xe4\\x49\\xf8\\xa5\\x1e\\x2d\\x15\\xdb\\xdc\\x94\\xe3\\xe4\\xaf\\x29\\xe4\\x56\\x4d\\x4e\\x47\\x6b\\xb6\\xaa\\x5e\\x45\\xc0\\xe3\\xc8\\xc9\\xe9\\xdc\\xd8\\x2b\\x28\\x57\\xa9\\x11\\x82\\x47\\x57\\x86\\x69\\x07\\x56\\xd5\\x64\\x38\\xbe\\x33\\x5c\\x03\\x51\\xd9\\x7c\\xc1\\x2c\\x92\\xe9\\x95\\xc7\\x54\\x51\\x8f\\x13\\xd4\\xf1\\xbc\\xe7\\x41\\x6b\\x45\\x9a\\x18\\x23\\xab\\xc8\\x04\\xe1\\x19\\xb0\\x28\\x16\\xda\\x06\\x05\\xab\\xed\\x62\\x39\\xcb\\xac\\xa4\\x85\\x36\\x66\\x56\\x57\\x40\\xb5\\x2b\\x0a\\x41\\x64\\xa1\\x9d\\x64\\x78\\x68\\x06\\x2f\\x5f\\xf4\\xb7\\xc9\\x63\\x8a\\x28\\xa6\\x8e\\xcd\\x69\\xe3\\xce\\x74\\x85\\xd3\\x88\\x58\\x58\\x6a\\x11\\x11\\xb8\\x47\\x77\\x6b\\x5d\\x7e\\x73\\x65\\xa0\\x5e\\x62\\xb7\\x1e\\x70\\xb0\\x58\\x02\\xd7\\x50\\x40\\x80\\x51\\x39\\xe4\\x34\\xeb\\x70\\x67\\xd5\\x70\\x26\\xe3\\x51\\x64\\x7b\\xd9\\x6c\\xd3\\x61\\x46\\x1e\\x2e\\x4d\\x70\\x65\\x64\\x8f\\x25\\x05\\x3d\\xb7\\xa3\\x5a\\xd1\\xeb\\x60\\x8b\\x80\\x8a\\x45\\x40\\xef\\xca\\x1b\\x31\\x50\\xf2\\x18\\x68\\x5a\\x4c\\x38\\xa8\\xa9\\x3d\\x62\\x81\\x75\\x2c\\x37\\x22\\x1c\\xdf\\x5c\\x09\\x70\\x78\\x6c\\xa4\\x9a\\x8a\\x9c\\xd9\\xc6\\x68\\x94\\xb0\\xdd\\x17\\xfc\\x16\\x31\\xbc\\x0a\\xae\\x1a\\x18\\x19\\xb5\\x79\\xdd\\xa1\\x57\\xc7\\xf0\\x3a\\x3e\\xbc\\x77\\xb6\\xb8\\x10\\x5c\\x67\\x35\\xb1\\x9b\\x1d\\x72\\x4b\\x3b\\xc0\\x08\\x96\\x2b\\xc5\\x8c\\x31\\x4b\\x0c\\xdd\\x29\\xc1\\x18\\x57\\x18\\x48\\x67\\x33\\xc7\\xea\\xb2\\xcb\\x06\\xe2\\xde\\x60\\x03\\x4e\\xc9\\x4c\\x78\\x4b\\x34\\xf9\\x1a\\x22\\x40\\xb0\\x54\\x0c\\x38\\x3d\\xfc\\x78\\x38\\xa5\\xc0\\xb8\\x16\\x1a\\xd5\\x1a\\x56\\x84\\xc6\\xac\\x66\\xc3\\xd7\\x58\\x39\\xf4\\x98\\xcb\\x9f\\xb6\\x24\\x52\\x72\\xf6\\x0d\\xab\\x76\\x02\\xa5\\xd4\\x9d\\xd1\\x6e\\x90\\x47\\xad\\xf3\\x74\\xbe\\x15\\x60\\xb4\\x51\\x82\\x6a\\xec\\x10\\x1e\\xfc\\x13\\xa7\\xf0\\x54\\x0f\\xd7\\xaa\\xe4\\xc6\\xe9\\x1a\\xaa\\xf7\\x7f\\xf7\\x88\\x1a\\xcb\\x00\\xcc\\x3a\\xd3\\x2b\\x03\\x03\\xa0\\x39\\x58\\x92\\xad\\xd4\\xf3\\x4a\\xff\\x27\\x0c\\xa6\\x1b\\x20\\x82\\x50\\x7b\\xde\\x77\\x6a\\x84\\x48\\x0c\\x17\\x5a\\x2e\\xdc\\x52\\xc7\\x8c\\x9a\\x09\\xf0\\x20\\x0e\\xfb\\x24\\xe2\\xf8\\x24\\x7e\\x24\\x61\\x9b\\x57\\x36\\xf4\\x15\\xb4\\x20\\x26\\xc3\\x5c\\x8b\\xeb\\xd6\\xe9\\x51\\x6d\\xd8\\xfa\\x4f\\xef\\xab\\x79\\x85\\xf4\\xb7\\x96\\xe0\\x40\\x30\\x8d\\x4d\\x1d\\x13\\xce\\x40\\x03\\x18\\xbf\\x0f\\x68\\x5b\\x1e\\x91\\x90\\x8f\\x0d\\x7c\\x9f\\xd4\\xcb\\x85\\xd5\\xfc\\xd1\\x2f\\x46\\x1e\\x6d\\x8f\\x02\\x45\\x1a\\x57\\xf5\\xcf\\xc2\\x53\\x18\\xda\\xa9\\xf5\\x60\\x7a\\x5b\\x75\\xbd\\xd9\\x77\\x22\\x6e\\xf1\\x5b\\x59\\x3b\\x9d\\xa4\\x1f\\x23\\x79\\xa4\\x92\\x1b\\x6a\\x7b\\x36\\x54\\x7c\\xf4\\x01\\x19\\x66\\xf5\\xbc\\x16\\x85\\x76\\x52\\x18\\x0b\\xde\\xc2\\x7a\\x5a\\xd5\\xf0\\xd2\\xce\\x14\\xdf\\x28\\xa8\\x44\\x07\\x8d\\x34\\x59\\x08\\xc5\\x40\\xf8\\x28\\x60\\x1f\\x21\\x07\\x32\\xae\\xee\\x12\\x38\\xa3\\x14\\xe2\\x66\\xe0\\xed\\x1f\\xae\\x59\\x6e\\x29\\xfd\\x28\\xa3\\x5f\\xd4\\xf6\\x8a\\x65\\x78\\x80\\x3e\\x05\\xc7\\x50\\x23\\xa3\\x68\\x85\\x76\\x7a\\x0e\\x1f\\x33\\xf6\\x34\\x67\\xec\\x31\\x42\\xaa\\x75\\x1e\\xf4\\x38\\xa8\\xc1\\x55\\x9a\\x98\\x89\\xd8\\x3d\\xbe\\x54\\x43\\x71\\xc3\\x78\\x31\\x3b\\xa8\\x1a\\x60\\x44\\x20\\x87\\x81\\xb9\\x57\\x10\\x5f\\x68\\xc7\\xda\\x20\\x27\\x45\\x56\\x8d\\x58\\x9d\\x67\\xcb\\x4e\\x8b\\x6e\\x58\\xb3\\x68\\xc6\\x1e\\x9b\\xa5\\x3f\\x44\\x57\\x1c\\x68\\x33\\xcc\\x53\\x65\\xaf\\x8a\\xf0\\xa0\\x67\\xbf\\x01\\xc0\\x3e\\x4e\\x2c\\x3a\\xc4\\xab\\x19\\x52\\xea\\xdd\\xf0\\x69\\xd2\\xc7\\xf3\\xb0\\x9c\\x17\\xf6\\x61\\xbb\\x2b\\x1b\\xab\\x21\\x5d\\x89\\xb7\\x21\\x81\\x5b\\x02\\x8d\\x50\\x2a\\xa1\\xb6\\xc0\\x8b\\x93\\x90\\x54\\x95\\xeb\\xae\\xdc\\x0d\\xfc\\x99\\xc4\\x73\\x6d\\x56\\xe3\\xb0\\x68\\x7d\\xb1\\xed\\x75\\x57\\x62\\x3f\\x75\\xf0\\xd0\\x3f\\x3d\\xe6\\x7f\\xf4\\xf5\\xab\\x36\\x66\\x24\\xb6\\x31\\x66\\x59\\xc3\\x3a\\x35\\xfe\\xf5\\x32\\xad\\x14\\xd8\\x4a\\xaf\\xa4\\x2b\\x71\\xfb\\xd6\\x51\\x75\\xde\\x21\\x97\\x4b\\x2d\\x80\\x8b\\x93\\x20\\x25\\x2b\\x3b\\x78\\x98\\xbc\\xf6\\xc4\\xd8\\x29\\x48\\xd7\\x3f\\x4f\\x70\\xb3\\xce\\x55\\xb4\\x7c\\x54\\xb9\\xac\\xb4\\x8c\\x89\\x32\\x2b\\x36\\xb5\\xdc\\x1b\\x92\\x5f\\xcd\\x88\\x54\\xd8\\x92\\x8c\\x19\\x59\\x71\\xc0\\x5c\\x65\\x03\\x82\\xa8\\x08\\xab\\x14\\xd4\\xc1\\x08\\x03\\xfe\\xfa\\xf4\\x04\\xfc\\xf6\\x5c\\xb4\\xb4\\x59\\xd6\\x54\\x05\\xf9\\x50\\x69\\x8f\\xb0\\x5b\\x0d\\xb9\\x21\\xdf\\xb4\\x39\\x2c\\x77\\x6c\\xd4\\x6b\\x90\\x34\\x1c\\xd7\\x92\\x90\\x25\\xc9\\xbb\\x65\\x0e\\x3a\\x07\\x26\\x58\\x1d\\xc8\\xff\\x06\\x0f\\x65\\x57\\xf4\\x0b\\x18\\xe8\\x32\\x80\\x3a\\xb0\\x28\\x9c\\x2f\\xb7\\x73\\x29\\xff\\xc1\\xd1\\x12\\xfa\\x5a\\x25\\x6f\\x08\\x0b\\x8f\\x06\\x1d\\x57\\x03\\xbc\\x6c\\x99\\xb0\\xac\\x11\\x4d\\x41\\x5c\\x2f\\x32\\x23\\xf2\\xcb\\xe6\\xf6\\x21\\x2e\\xbb\\xa4\\xe9\\xce\\xaa\\xd9\\x32\\x07\\xf7\\x44\\x85\\xac\\x2f\\x46\\xe9\\x53\\xd4\\x85\\xdd\\xa2\\x94\\x11\\x46\\xce\\x17\\xee\\x74\\xee\\xda\\x67\\xf6\\xec\\xb9\\x63\\xb1\\xff\\xf2\\x36\\x38\\x70\\x61\\x75\\x7e\\x0b\\x99\\xbb\\x03\\x16\\x0d\\x76\\xa2\\x2d\\x23\\x86\\x37\\x52\\x7c\\x95\\x50\\xbe\\x83\\x8b\\xef\\xe0\\x0a\\x52\\x3a\\xb9\\x33\\xe0\\x16\\x28\\x83\\xb0\\x7d\\xd5\\xd4\\xad\\x7a\\xb0\\x55\\xe2\\xc2\\x1b\\x48\\x56\\x98\\x0e\\xa9\\xda\\xd3\\xa2\\x65\\x32\\x8c\\xed\\xc8\\x4b\\x15\\xed\\x28\\xa2\\x40\\xa6\\x48\\x02\\xa5\\x1b\\x5b\\xff\\xe1\\x71\\xbd\\x04\\x2a\\x19\\x6a\\x50\\xf9\\x15\\x73\\x69\\x07\\x8d\\x72\\x69\\x35\\x1f\\x51\\x3f\\x89\\x79\\xa0\\xe6\\x3a\\x5d\\xb2\\xc0\\xa0\\xa0\\xa0\\xbe\\xe4\\xb4\\x62\\x7a\\x6c\\x7e\\x76\\x72\\x2b\\xdd\\x2f\\x4e\\x42\\xd8\\xf3\\x8d\\x1f\\xfe\\xbf\\xdc\\x7e\\xe1\\x90\\xb9\\x23\\x41\\xd3\\xf3\\x5e\\xc5\\xea\\x8d\\xa0\\xab\\x04\\x71\\x3f\\x07\\xf2\\x82\\x38\\xcf\\x95\\x31\\x59\\x18\\xd7\\xfe\\xc5\\xe1\\xc4\\x67\\x09\\x04\\x92\\x12\\x46\\x0f\\xdc\\xea\\xe4\\x21\\x61\\xc8\\x85\\x40\\x45\\xd0\\x21\\xbe\\x69\\x8f\\xd5\\xb2\\xef\\x8b\\xd1\\x7a\\xb1\\x5b\\x59\\xd6\\x99\\x72\\x30\\xdd\\x0c\\x8f\\xf4\\x6e\\x31\\x72\\x2f\\x78\\xa5\\x7d\\x86\\xad\\x31\\x9c\\x3a\\x50\\x77\\x1f\\x84\\xa4\\xa9\\x2a\\x32\\x98\\x0e\\xa7\\xe0\\xbc\\xd7\\xe3\\x74\\x1b\\x6b\\xf3\\x90\\x75\\xe7\\xe0\\x74\\x30\\xe3\\x2c\\xc8\\xb2\\xb7\\x8b\\xae\\xa2\\x21\\xd7\\xeb\\xba\\x60\\x7b\\xbd\\xc8\\x27\\x23\\x5a\\x09\\x30\\xb7\\xa1\\x23\\x91\\xa0\\xd3\\x51\\x5e\\x28\\x23\\x67\\x44\\xe8\\x8d\\x01\\x81\\x9f\\xcc\\x73\\x0c\\x66\\x6a\\x0e\\x44\\x33\\xe1\\x25\\x33\\x81\\x53\\x4c\\x8c\\xe3\\x4d\\x90\\xb1\\x1f\\xd9\\x92\\x81\\x88\\x74\\x82\\x17\\x03\\x15\\xf2\\x81\\xcc\\x18\\x72\\x40\\x2d\\x07\\x75\\x5d\\x42\\xee\\x1e\\x33\\xe9\\xe8\\x8d\\xc0\\xe2\\xb5\\x6a\\xa6\\x5e\\x2d\\xaa\\x00\\x04\\xc0\\xe5\\x26\\xb4\\xeb\\xff\\x76\\xb8\\x5e\\x02\\xf7\\xe2\\x38\\xa8\\xea\\xc1\\x03\\xa2\\x4c\\xaf\\x22\\xf3\\x8d\\xd4\\xfa\\xff\\xe3\\xc2\\xba\\x81\\x7f\\x47\\x2d\\x94\\x72\\x01\\xfd\\xce\\x40\\x46\\x69\\x88\\xb1\\x8f\\xc2\\xb6\\xaa\\x5e\\x50\\xe2\\x05\\x00\\x3e\\xa5\\xb6\\x67\\xec\\x72\\xf8\\xec\\x8a\\x73\\xc6\\xf7\\x16\\xac\\xf3\\x01\\x32\\x46\\xd9\\xd6\\xe4\\xd2\\xb3\\xa7\\xe3\\x7a\\x45\\x21\\x6c\\x32\\x45\\xda\\xa7\\x65\\x2f\\xac\\x0e\\x41\\x8c\\xc9\\x01\\x84\\xd9\\x3d\\x7b\\xa7\\x1d\\x58\\x74\\xaa\\x16\\x4a\\xc3\\xff\\xc3\\x69\\xb0\\x5c\\xba\\x2d\\x26\\x9b\\x5e\\x76\\x26\\x92\\x91\\x17\\x67\\x96\\xe1\\xf7\\xc5\\xd2\\xcd\\x10\\x26\\x2b\\xc4\\x81\\xfe\\x02\\xc3\\xa2\\xd4\\xe6\\x08\\x59\\x9d\\x31\\x95\\x43\\x97\\x9f\\xf2\\x99\\x5a\\xca\\x0e\\x3f\\x01\\xda\\xca\\x56\\x34\\xdb\\x64\\xf0\\x39\\x05\\xc0\\x44\\x83\\x1c\\xc2\\x8f\\x91\\xf7\\x2e\\x49\\x96\\x6a\\xb1\\x2e\\x1e\\x23\\x74\\xb6\\x7d\\x5c\\xdb\\x2c\\x86\\xe2\\xdd\\x63\\xed\\xb6\\x11\\x93\\x41\\xa2\\x17\\x05\\x37\\x55\\x46\\xc8\\x07\\x67\\x49\\x08\\xc7\\x27\\xdb\\x29\\xc2\\x68\\x92\\xc7\\xac\\xdd\\x05\\xb4\\x54\\xac\\x5a\\xb4\\x38\\x95\\x99\\x70\\x52\\x9f\\x5e\\xfb\\xff\\xd7\\xf5\\x94\\xda\\xa6\\x55\\x8f\\x5a\\x49\\xc6\\x30\\x38\\xc8\\x12\\x8e\\xb0\\xd8\\x7a\\xb6\\x3c\\x62\\xeb\\x81\\xaa\\x07\\xcc\\x8d\\x67\\xde\\x39\\x8d\\x21\\xd1\\xcf\\xc0\\x33\\x50\\x45\\x7d\\xf7\\x5a\\x01\\xe7\\x65\\xc2\\x6d\\x6d\\xc7\\x29\\xc2\\x5b\\xf5\\x29\\x35\\xf0\\xca\\x9f\\x8a\\x51\\xc1\\xd4\\xec\\xfc\\x4f\\x90\\x20\\x48\\x09\\x66\\x47\\x5c\\x87\\xd8\\x9d\\xed\\xd5\\xcc\\x72\\xd4\\x6e\\xf4\\x93\\xcc\\x15\\x4b\\x0c\\x96\\x04\\x03\\x20\\xa8\\x3c\\x87\\xc3\\x99\\x13\\xce\\x2e\\x5a\\xfd\\xa4\\x00\\x78\\x77\\x83\\x67\\x15\\xd6\\xf1\\x4a\\xa7\\xd7\\xdb\\x97\\x27\\x62\\xf8\\x08\\xa1\\x55\\xb7\\x40\\xb7\\x70\\x29\\x7f\\xfa\\xb3\\xdf\\xbe\\x4c\\x4f\\x37\\xc8\\xd2\\x8f\\xe8\\xd3\\xc7\\xfd\\xb0\\xac\\x21\\x16\\x85\\xb3\\xf7\\xd4\\x5c\\xed\\xa8\\x56\\x7f\\xaa\\x6b\\xcb\\xaa\\x47\\x8d\\xac\\xbc\\xb7\\xd5\\xd9\\xec\\x6a\\xf5\\xbf\\xba\\xf2\\xdf\\x38\\xfa\\x04\\x46\\x0c\\xcc\\x60\\x30\\xcb\\x67\\x93\\xa0\\x7a\\x71\\x65\\xf8\\xb0\\x2a\\x7c\\x34\\xc4\\xb2\\x60\\x9f\\xce\\xa1\\x0f\\xc8\\x5b\\x61\\xc1\\x91\\x60\\x0e\\x67\\xc9\\xac\\x77\\xa4\\x42\\x7b\\x2a\\xa3\\x50\\xdb\\xac\\x81\\xd5\\x85\\x7a\\xd9\\xbc\\xb3\\xd5\\x4e\\x38\\x5e\\x68\\x77\\x35\\xbd\\xfb\\x55\\x98\\xf9\\x0c\\x27\\x39\\x17\\x91\\x1d\\xd2\\x7c\\x4a\\x7b\\xa4\\xfc\\x56\\x5f\\xad\\x5d\\xf5\\x71\\x5a\\x27\\xc0\\x14\\xf0\\xb5\\x1f\\xd7\\xed\\x15\\x58\\x8d\\xb0\\x7a\\x0a\\x25\\x03\\x4c\\x36\\x30\\xcf\\xbd\\x4e\\x87\\xc8\\x10\\xd8\\x33\\xd3\\xa4\\x56\\x42\\xc9\\x1b\\x8f\\xc0\\x3c\\x0c\\xc1\\xcc\\x66\\x9b\\x34\\x0b\\x58\\x7b\\x1e\\xc4\\x2b\\x76\\x0b\\x2c\\x06\\xd4\\x72\\xa6\\x1d\\xf6\\xa6\\x6e\\x5a\\xeb\\xfc\\x53\\x36\\x70\\xdd\\xa9\\xa4\\x79\\x17\\xcf\\x25\\x8e\\xe6\\xaa\\x8f\\xb1\\x5c\\xf0\\x7c\\x5c\\xf8\\xe4\\xe5\\xe6\\x4a\\xdd\\x20\\x92\\x4a\\x6f\\x7b\\x56\\x57\\x1f\\xf1\\x0c\\x69\\x56\\x36\\xdd\\xeb\\x23\\x9c\\x55\\xc3\\x21\\x00\\x8e\\x0f\\x12\\x15\\xd4\\xac\\x58\\xe7\\xcd\\x78\\x45\\x12\\x58\\x08\\x28\\x70\\xd9\\xb8\\x05\\x4e\\x03\\x13\\x0a\\x3e\\x0a\\xae\\xc1\\x28\\x01\\x21\\x14\\x2c\\x46\\x6c\\x89\\x59\\x2b\\x7f\\x37\\x64\\xbb\\xe3\\x4b\\x04\\xdd\\xc9\\x8c\\xd7\\x89\\xad\\x32\\x6c\\x22\\xe6\\x4a\\xb4\\xd5\\x16\\x4a\\x6e\\xd6\\x99\\x83\\xfc\\x34\\x9e\\x91\\x31\\x07\\x07\\x98\\xd7\\xde\\x8d\\x3d\\x06\\x01\\x9a\\xdb\\x6b\\x27\\x9f\\x5e\\x4b\\x5c\\x72\\xdb\\x65\\xe8\\x51\\x05\\x99\\x00\\x9b\\x54\\xb1\\x68\\xa6\\xae\\x98\\x18\\x2d\\x05\\x83\\x99\\x3e\\x57\\xe3\\x9c\\x74\\xe0\\x8f\\xc1\\x40\\xdc\\xba\\xd1\\x21\\x3b\\x10\\x57\\x10\\x60\\x29\\x90\\x95\\x86\\xe7\\xd2\\x6d\\x75\\x89\\x24\\x86\\x62\\x19\\xbc\\x47\\x83\\x6c\\x5c\\xb7\\x1c\\x2d\\x8e\\x5e\\x34\\x84\\xe3\\x2b\\x08\\xc7\\x1c\\x4b\\x00\\x65\\xcd\\xcb\\x9c\\x94\\x47\\xe0\\xb1\\x50\\xb4\\x19\\xd0\\x3f\\x70\\x82\\x50\\x02\\x11\\x30\\x52\\x57\\x09\\xca\\x87\\x3c\\x1f\\x87\\x83\\xa7\\x16\\x1d\\x07\\xe0\\x2e\\xc4\\x97\\xe2\\x04\\x34\\xae\\x60\\xc8\\xdd\\x09\\x39\\x73\\xcc\\x40\\xb7\\x13\\x5e\\xc5\\x81\\x25\\xd1\\xb0\\x98\\xd4\\x02\\xb9\\x69\\x6e\\x44\\x84\\x74\\xe1\\x54\\x5c\\xc1\\xaa\\xf2\\xe8\\xa0\\x8b\\xb4\\x24\\x6d\\xef\\x46\\x5e\\xde\\xfa\\x62\\x60\\xf3\\xd0\\x1f\\x32\\x72\\xb0\\xbd\\xfa\\xfa\\x83\\x00\\xd7\\xbc\\xeb\\xde\\x86\\x51\\xca\\x17\\x1e\\x06\\x9c\\x4e\\xb6\\x42\\xe6\\xa3\\x35\\xf2\\xf0\\x5b\\x6d\\x7e\\xe1\\xf4\\x44\\xc9\\x02\\x65\\xc9\\xdb\\xbf\\x38\\xf9\\x61\\x01\\x62\\xf4\\x8c\\x05\\x5a\\x4a\\xa9\\x6d\\xdd\\x5a\\x26\\xec\\xd1\\xf6\\x7b\\x52\\xd7\\xcc\\x60\\x8a\\x03\\x15\\x3c\\x2b\\x97\\x62\\x50\\x8d\\x51\\x3d\\x25\\x09\\xa2\\x6d\\xbb\\x54\\xf5\\x24\\x5e\\xef\\x93\\x82\\x5b\\xee\\x4e\\x48\\x61\\x38\\xbf\\xfa\\xec\\x4e\\xcc\\x9f\\x5e\\xe9\\xf1\\xb3\\xa4\\xcd\\xc8\\xaf\\xd4\\xf4\\x63\\x83\\x5e\\xc8\\xc2\\x60\\x92\\xc5\\xb5\\x41\\x2a\\x45\\x29\\x74\\x99\\x52\\x02\\x5a\\xb4\\xe1\\x2b\\xb2\\xa9\\xb3\\x4f\\x4c\\x9b\\x05\\xcc\\x88\\x76\\x69\\x81\\x46\\xb0\\x74\\x49\\x32\\xd4\\x18\\xd1\\x62\\x87\\x4d\\x1e\\x2c\\x44\\xdc\\x11\\xc9\\x9d\\xcd\\x38\\x17\\x99\\xec\\x91\\xea\\xad\\xee\\x7a\\x8c\\xb3\\xfb\\x41\\xb1\\x8b\\xdb\\xbc\\xdd\\x2a\\x6d\\x8c\\xc8\\x09\\xca\\xd0\\x88\\xfe\\x54\\x7b\\x6f\\xfe\\x5d\\x7d\\xca\\xf5\\x79\\xa9\\x07\\x9b\\x53\\xa3\\x36\\x72\\x0d\\x87\\xb8\\xeb\\xf2\\xf4\\x11\\x77\\x44\\x65\\xa0\\xda\\x6f\\x36\\xb9\\x23\\x58\\x02\\xd5\\x08\\x2f\\x88\\x1e\\xee\\xa5\\xaa\\xb1\\x00\\x39\\x21\\x65\\xd5\\x46\\x59\\x22\\x03\\x6a\\xc3\\xb9\\xa9\\x8a\\x53\\x7a\\x92\\x80\\xc3\\x4a\\x3c\\xc9\\x5e\\x2c\\xe7\\xe1\\xd9\\x5a\\xd5\\x30\\x20\\x81\\xf1\\x1e\\x01\\x5e\\x09\\xa9\\x37\\x18\\xe9\\x8c\\x25\\xe6\\x11\\x66\\x57\\xe1\\xea\\x0f\\x8c\\xfe\\x1b\\xd5\\xb2\\xd9\\xe5\\xda\\x02\\x01\\xc0\\xb0\\xdb\\x6b\\x5d\\x3e\\x3d\\xab\\x46\\xbd\\xc4\\x24\\xa3\\xe9\\x46\\xcc\\x5d\\x36\\x70\\x2a\\x74\\xb9\\xb0\\x0c\\xf5\\x61\\x81\\x6e\\xca\\x17\\x2e\\xbc\\x30\\x64\\x7a\\x55\\x79\\xfd\\x25\\xf9\\x5f\\xa8\\x76\\x43\\x95\\xd9\\x45\\xcd\\x87\\x7e\\xa6\\xff\\x56\\x5e\\xff\\x0d\\x5c\\xf8\\xed\\x61\\xad\\xae\\x50\\xa7\\x15\\xdf\\x4a\\x31\\x23\\xbe\\xa1\\x26\\x91\\xd3\\x03\\x3e\\x2b\\xa5\\x1d\\x80\\x76\\xe0\\x23\\x14\\x96\\xdf\\x32\\xef\\xf5\\xb1\\xed\\xd3\\x2b\\x37\\xb6\\x6a\\x94\\x4c\\x46\\xb0\\x09\\x03\\xdf\\x02\\xee\\xde\\x89\\x82\\xeb\\x5e\\xad\\xc4\\xd3\\x5c\\xb4\\x5c\\x51\\x32\\x58\\xad\\xf8\\x01\\x34\\x4b\\xb2\\xa3\\x72\\xae\\xa2\\x14\\xc6\\xc0\\x01\\xd5\\x68\\x09\\xa5\\x23\\x97\\xec\\xd9\\x20\\xb6\\x8d\\x04\\xb9\\x6b\\xf0\\xbd\\xe1\\x9c\\x63\\x26\\x99\\xc7\\x0a\\x7a\\xef\\xa7\\x9a\\x91\\x0e\\xb3\\x79\\x88\\x31\\xc2\\xc7\\x02\\xbe\\x10\\x84\\xb0\\xd3\\xaa\\x45\\x24\\x67\\x84\\x17\\x23\\x0e\\xb2\\xdd\\x54\\xf2\\xac\\x6c\\xa6\\xb6\\xca\\x34\\x42\\xf3\\xad\\x90\\x53\\x70\\x02\\x9a\\x72\\x6d\\xe3\\x55\\xba\\x4a\\x3a\\xa7\\x41\\xac\\x14\\x40\\x72\\xd9\\x67\\x43\\xc3\\x09\\x50\\x94\\xd4\\x01\\x44\\x29\\xd7\\xd5\\x94\\xc9\\xfd\\xd2\\x39\\xae\\x44\\x96\\x20\\x3c\\x1c\\xb3\\x3a\\xa1\\xf1\\x06\\x22\\x53\\x15\\x33\\xc8\\x69\\x67\\xab\\x62\\xc8\\xfa\\x4b\\x99\\x96\\x82\\x81\\x60\\xf5\\xd6\\x3a\\xe2\\xac\\xa7\\xf9\\x74\\xef\\x96\\xd7\\x8f\\xb8\\x84\\x37\\xdb\\x32\\xd0\\xc5\\x95\\x38\\xc2\\xde\\xc0\\x09\\x4b\\x1d\\x2a\\xb7\\x10\\x66\\xf0\\x96\\x3c\\x16\\x9e\\x25\\x78\\x42\\x55\\xc6\\x84\\x4b\\x94\\xd3\\x0e\\xd0\\x80\\x5a\\x14\\x86\\xcb\\xf6\\x74\\x52\\x5d\\xc9\\xb0\\xee\\xfd\\x0e\\xd4\\xd6\\x75\\x6c\\x18\\xc0\\x19\\x96\\x2b\\xb5\\x4c\\x9d\\x71\\x33\\x59\\x32\\xd8\\x12\\xfa\\xb0\\x4d\\x75\\x14\\x60\\x71\\xe0\\x60\\xf2\\x63\\x94\\xb3\\x61\\x28\\xa0\\x75\\x08\\x4c\\x93\\xe3\\x4f\\x84\\x9d\\x80\\x3b\\xa1\\x80\\xba\\x3e\\x8a\\xb4\\x3b\\xdf\\x63\\x79\\xcc\\x55\\x96\\x1c\\x71\\x89\\x19\\x86\\xd7\\xf5\\x70\\x2f\\x4d\\x42\\xed\\xd5\\x7b\\x92\\x65\\x80\\x14\\xad\\x78\\xa5\\xd6\\xe0\\x3c\\x1d\\xae\\xd2\\x67\\x71\\xda\\xea\\x9d\\x54\\x24\\x1b\\x17\\x94\\x34\\x10\\xc1\\x17\\xf2\\xa6\\x84\\xe6\\x90\\x58\\xb0\\x00\\x9a\\xae\\x62\\x4d\\x2b\\x6c\\x8d\\x08\\x06\\x79\\x07\\x23\\xd2\\xa2\\x89\\xf4\\x84\\x93\\xc9\\xed\\xe6\\x01\\xd7\\xdb\\xed\\x15\\xf4\\x14\\xf6\\xb3\\x5d\\x6b\\x3e\\x01\\x58\\x0d\\x34\\x9c\\xe4\\xfd\\xb7\\x78\\xe1\\xac\\x18\\xdd\\xf6\\xb0\\x1d\\x8c\\xef\\xcf\\x72\\x72\\x57\\x18\\x56\\x5b\\x6d\\xcd\\x78\\xb5\\x90\\x59\\x5b\\x61\\xb1\\x0a\\x3b\\xa5\\xda\\x89\\xd6\\x3a\\x21\\x59\\x2b\\x01\\x6b\\x01\\xd7\\xb2\\xfa\\xd9\\xd9\\xef\\x1a\\x67\\x53\\x3a\\x5b\\x08\\xea\\xe8\\x12\\x80\\x49\\xf5\\x8a\\x1a\\xeb\\x18\\x34\\xaf\\x41\\xcf\\xec\\x5f\\x2c\\x79\\xed\\x61\\x6c\\x61\\x8b\\x13\\x3e\\x1e\\x74\\x78\\x7e\\xd4\\xe7\\x98\\x1f\\x99\\x94\\x37\\x46\\x9d\\x17\\x98\\xcc\\xfb\\xf2\\xf9\\x48\\x30\\xde\\xdb\\x5d\\xf7\\x5e\\x8e\\x53\\x10\\x86\\x52\\x86\\xd3\\x37\\x65\\x94\\x93\\x4f\\x3b\\xe7\\x54\\xeb\\x24\\x10\\x21\\xf2\\x24\\x1c\\xf8\\x4c\\x3b\\xca\\x7a\\xc2\\x22\\x2f\\xa6\\x49\\x9e\\xf8\\x45\\xc5\\x87\\x6d\\xf3\\x5a\\x57\\x1b\\x2a\\x23\\xd0\\x66\\xeb\\xd6\\x8a\\x0a\\xa6\\x6a\\x5c\\x5a\\xd8\\xf4\\x40\\x97\\xa8\\x5b\\x00\\xde\\x72\\x75\\x4e\\xd5\\x1b\\x02\\xa4\\x34\\x5f\\x67\\xdd\\x49\\x4a\\x1d\\xc3\\x58\\x7c\\x5c\\xde\\x91\\x2b\\xf1\\xc3\\x3d\\x95\\xea\\x6f\\x80\\x7a\\x26\\xc0\\xa9\\xdb\\x5c\\x5d\\xf2\\xba\\x73\\x2c\\x99\\x3d\\x00\\xee\\x17\\x44\\x05\\x16\\xe9\\xd7\\x58\\xdd\\x63\\xd4\\x3d\\xec\\x1d\\x8e\\x3d\\x0f\\x4f\\x11\\x1a\\xe8\\x86\\x51\\x26\\x86\\x22\\x79\\x72\\x97\\xc8\\xee\\x45\\x14\\x54\\x1c\\xd6\\x43\\xd6\\x75\\x79\\xfd\\x5a\\x9b\\x67\\xa3\\xbe\\xe1\\x0f\\x89\\xee\\x54\\xb0\\x05\\xee\\x55\\xe6\\x82\\xd3\\xc0\\xea\\x9b\\x2b\\x07\\x2b\\xb0\\x01\\xde\\xa9\\xce\\xd5\\x7f\\x6c\\x47\\xd7\\x01\\xeb\\xe0\\xd2\\x1c\\x26\\x01\\xc9\\xe9\\x99\\x7c\\x46\\xa7\\xbf\\x25\\x79\\x81\\x2a\\xdd\\x63\\x87\\x0f\\x86\\x30\\xd9\\x8c\\x26\\x7e\\x19\\x9d\\x58\\x21\\x5a\\x7b\\xb0\\x9e\\x01\\xec\\xc7\\xbd\\xb0\\x83\\xc7\\x39\\xad\\xe0\\x9e\\x09\\xb6\\x76\\x7a\\x9d\\x91\\x4f\\xc9\\xe7\\xec\\xfb\\xa6\\x2b\\x69\\x25\\xda\\x0c\\x6e\\x8e\\x3a\\xfa\\x92\\xac\\x24\\xad\\xd5\\xc0\\x75\\xe6\\x11\\x5a\\xdb\\x28\\xa3\\xa1\\xc2\\x1e\\xf5\\xdf\\x76\\xb6\\xdd\\xb0\\x74\\xa3\\xef\\xa1\\x6c\\x71\\x1f\\xab\\xd4\\x59\\xba\\xd4\\x6c\\x57\\xc7\\xf1\\x3b\\x3b\\x1c\\x83\\xa0\\xed\\xf6\\xd6\\x7e\\xb9\\xb6\\x76\\xa6\\xc0\\x43\\x8d\\x90\\x74\\x69\\xb9\\xab\\x59\\x92\\x2e\\xb1\\xe5\\xfe\\x80\\x2c\\x7d\\xcb\\xc6\\x5a\\x46\\xa1\\x3a\\x6c\\x08\\x28\\x8e\\xe6\\x0c\\x0e\\xaa\\xf2\\x8a\\xb9\\xa0\\x88\\xf8\\xe8\\x90\\x4c\\xf5\\xa2\\x44\\xb0\\xa1\\xec\\xa4\\xf5\\x80\\x36\\xb0\\x46\\xf1\\xc0\\x6b\\xa6\\x9c\\x2e\\xab\\xb9\\x19\\x2c\\xb2\\xd7\\x11\\xd0\\xbe\\xe6\\x2c\\xcf\\xa8\\x56\\xdd\\xb8\\x13\\x20\\x08\\x6c\\xae\\x06\\x50\\x57\\x6d\\x75\\x72\\x02\\x5e\\xa5\\x82\\x04\\x87\\x8f\\x42\\xbb\\xb5\\x6c\\x46\\xcc\\x6e\\x39\\xe7\\xd9\\x4b\\x64\\x10\\x53\\x72\\x5c\\x9a\\xca\\xe8\\x3d\\x16\\x43\\x57\\xda\\x89\\x69\\x53\\xcf\\x46\\x36\\x0c\\x2a\\x60\\x98\\xa8\\x9b\\x91\\x87\\x7b\\x19\\x14\\x5a\\xb6\\x5c\\xa2\\x58\\xde\\x8f\\x2b\\xe8\\xef\\x59\\xac\\x5d\\xc6\\x49\\x2d\\x0f\\x4c\\x07\\xb0\\xf5\\x85\\x42\\x33\\x6f\\x85\\xab\\xb3\\x3b\\xd0\\xa4\\x1c\\x3a\\x9f\\x2b\\xe8\\xdc\\xab\\x73\\xb1\\xbf\\xd6\\x53\\x7b\\x8f\\x93\\x79\\xe7\\x99\\x25\\xfc\\xd5\\x5a\\x42\\xa6\\x90\\x6b\\x39\\x6a\\xdb\\x44\\x2a\\xd2\\x3b\\x00\\xaa\\x59\\xdb\\x39\\x03\\x28\\xcb\\x86\\xa6\\x78\\x5c\\xcb\\x72\\x33\\xa5\\x3c\\xdc\\xe7\\x2a\\xd7\\x6f\\x66\\xff\\xe6\\xd9\\xb0\\x0e\\xa9\\xf4\\xb7\\xbe\\x59\\xec\\x9b\\x37\\xc7\\xb4\\x28\\x8f\\xa9\\xaa\\xc0\\x29\\x96\\xc2\\x48\\x7c\\xc4\\x0c\\x38\\x1e\\x15\\xa3\\x30\\xcb\\xfd\\x46\\x2a\\x57\\x9f\\xf1\\xea\\xd3\\xdf\\xd5\\x6f\\x6d\\x7d\\x74\\xfb\\x19\\xaf\\x7f\\x92\\xdc\\xdf\\x93\\xe4\\x96\\xa4\\x3a\\x96\\x8e\\xd2\\xca\\x85\\x06\\xed\\x08\\xd1\\x9d\\xc4\\x37\\xa7\\x21\\x29\\xc0\\xb6\\x78\\x19\\x9c\\xca\\x3b\\x5e\\x5d\\x8b\\x1c\\xe5\\x65\\xa9\\xde\\xb6\\x7c\\xb3\\xcd\\x9a\\x79\\x08\\x9a\\xba\\x20\\x34\\xbf\\xa1\\xee\\x94\\x85\\x2f\\xb1\\x54\\x4f\\x77\\x51\\xa6\\x87\\x70\\x9f\\x73\\x0d\\x95\\xfa\\xa5\\x54\\x2b\\x93\\xf0\\x26\\x38\\xd6\\x4e\\x16\\x5d\\xc1\\xd8\\x30\\x83\\x68\\x98\\x65\\xa4\\x41\\x05\\x55\\xf5\\xcf\\xec\\xa8\\x2f\\x16\\xdd\\xba\\x4a\\x56\\x92\\x02\\x6f\\xad\\xb4\\xec\\x2e\\x5d\\xb9\\xc5\\x99\\xf7\\xa7\\x3f\\xfb\\xed\\xaf\\xd2\\xf9\\x5d\\x15\\x6d\\xa0\\x61\\x53\\x57\\x22\\x9f\\x48\\xd9\\xea\\xa8\\x9b\\x51\\x83\\x73\\xfa\\xe6\\xd5\\x92\\x06\\x39\\x39\\xe4\\x90\\x11\\x9b\\x30\\xa7\\x02\\x31\\x1d\\xdd\\x61\\x43\\x2c\\x01\\xa8\\x2e\\xf6\\xea\\xfb\\x89\\x4b\\xff\\x30\\x3e\\xba\\x3f\\x5e\\x9f\\x82\\xcb\\x85\\xc3\\x50\\x5d\\x0a\\xed\\x66\\x63\\xb0\\xa7\\x10\\xe5\\x87\\xfb\\x4c\\x1d\\x7d\\x55\\xb0\\x34\\x15\\x15\\x35\\x63\\x95\\x7b\\x4b\\x59\\x62\\xd8\\x7c\\xf3\\xe4\\x30\\x21\\xb3\\xf8\\x62\\x37\\x7b\\xce\\x43\\x85\\x06\\x5d\\x77\\x72\\x41\\x70\\x06\\x3f\\x6a\\x07\\xdb\\x3c\\xe3\\x87\\xe8\\xf4\\xb8\\x09\\xaa\\xd4\\x89\\x5c\\x01\\xf2\\xd6\\x43\\xad\\x15\\x24\\x04\\x22\\xf9\\x10\\xce\\x17\\x26\\x39\\x90\\xd0\\x16\\xe0\\xf2\\x46\\xba\\x44\\x5c\\x09\\x90\\xb2\\x24\\x07\\x2e\\x44\\xf2\\xc3\\x7d\\x4f\\x41\\xe4\\xa0\\xc1\\x97\\x0e\\xb1\\x32\\x90\\x59\\xba\\xed\\x67\\xff\\x6a\\x05\\x8c\\x69\\x20\\x5e\\x93\\x54\\xed\\x8d\\x8e\\x04\\x8f\\xe1\\xc7\\x39\\x19\\xa8\\xf3\\x6c\\xca\\xe0\\x49\\x8e\\x61\\x6c\\xda\\xe8\\x78\\x0c\\x87\\x29\\x9f\\x2d\\x53\\x32\\x9d\\x5c\\xbf\\x62\\x79\\xac\\x9a\\x8d\\xfa\\xd9\\xab\\x88\\xcc\\xe4\\xed\\x48\\x12\\x22\\xa6\\xdc\\x1c\\xe3\\x59\\x9c\\xc9\\x55\\xee\\x4e\\x24\\xaa\\xd1\\x70\\x31\\x70\\x19\\x15\\xd4\\x83\\x06\\xde\\x0b\\x75\\x92\\xe5\\x84\\x8d\\xa1\\xd7\\x7b\\xd4\\x1d\\x11\\x54\\x6e\\x95\\xe9\\x20\\x1e\\xea\\x8c\\xa9\\x3f\\xab\\x8b\\x2d\\x75\\xa2\\xe4\\x9f\\xeb\\x56\\x72\\xc8\\x14\\x76\\x64\\x41\\xbc\\xc0\\xd7\\x6a\\x26\\x9d\\xa8\\xc8\\x92\\x13\\x56\\x04\\x66\\xf9\\x04\\x04\\x25\\xad\\x6e\\xc1\\x96\\xb6\\x3f\\xc2\\xda\\x99\\x24\\xad\\x46\\x58\\x6b\\xb1\\xe0\\xe1\\xdd\\x6b\\xf0\\x1f\\x7c\\xb3\\x58\\x5e\\x57\\x60\\x85\\x7d\\xa9\\xd5\\x50\\x47\\x06\\x7d\\x09\\xb5\\x64\\xc4\\x89\\xe8\\x1f\\xef\\x64\\x65\\x0b\\x71\\xe7\\x18\\x1c\\xf6\\xc4\\x8c\\xb1\\x71\\xc1\\x0c\\xa4\\xe1\\x02\\xbc\\x59\\x31\\xf6\\x68\\x38\\x89\\x53\\xda\\xd9\\xed\\x60\\xa5\\xc5\\x8c\\xca\\xa1\\x2f\\x1a\\xed\\x8b\\x03\\x50\\xcc\\x2c\\x5b\\x1d\\x8e\\xa3\\x39\\x1e\\x7a\\xb4\\x0e\\x6a\\x1d\\x6d\\x18\\x05\\x5e\\x66\\xf6\\x15\\xe7\\xb3\\xd0\\x84\\x2e\\x30\\x9a\\x06\\xc8\\x08\\xd4\\xe4\\xe0\\x62\\x78\\x2e\\xf5\\xc7\\xdb\\x02\\xe2\\x0e\\x3f\\x9a\\xea\\xa7\\x57\\xcf\\x3c\\x05\\x03\\x8b\\x8a\\x97\\x83\\x40\\x27\\x19\\xb7\\x11\\x09\\xed\\x68\\x21\\x57\\x4a\\x90\\xa4\\x4e\\x6f\\x71\\xd6\\x1b\\x6f\\xe8\\x34\\xbc\\x5d\\x37\\xfc\\x62\\xcb\\x8d\\xb5\\x3a\\x57\\x01\\xa7\\x7b\\x54\\x6c\\x11\\xed\\xd5\\x2a\\xe6\\x6c\\xd5\\x7f\\x77\\xf6\\x63\\xb2\\xbd\\xb7\\xc3\\xe7\\x27\\x64\\x1e\\xb9\\xbb\\xd1\\x23\\x8e\\x3a\\x30\\x2f\\xdf\\xe0\\x55\\x79\\x91\\x69\\xb9\\x3c\\x3f\\xfb\\x67\\x39\\xc3\\x64\\xaa\\x2b\\x0d\\x05\\xae\\x1d\\x35\\xab\\xc9\\x5a\\x66\\xa3\\x91\\x48\\xb9\\x01\\x95\\xd1\\xcd\\x90\\xcf\\xb0\\x97\\xba\\x96\\x5c\\x37\\xaa\\x12\\x44\\xf4\\xdf\\x0a\\x58\\xf0\\x16\\x41\\xaa\\xc8\\xfd\\x99\\x87\\xac\\x90\\x1e\\x10\\x36\\x04\\x2b\\x77\\x04\\xf2\\x3c\\x9b\\x9e\\x15\\xf0\\x6d\\xc2\\x6f\\x94\\xd9\\xd0\\xd4\\x4a\\x42\\xa9\\xe1\\x4a\\xf7\\x5f\\x1d\\x58\\x52\\x1c\\x31\\x19\\xea\\x38\\x0a\\xf5\\x0b\\xd3\\x38\\x62\\xb1\\x92\\xb9\\xda\\x3d\\xd2\\xa9\\x42\\x59\\xbc\\x6a\\x00\\x70\\x5d\\x69\\x56\\x56\\x9f\\xd5\\xfb\\x55\\xe3\\x30\\x70\\x9a\\xc0\\x3e\\x7a\\x31\\x51\\x5b\\xfd\\x5e\\x01\\x46\\x2a\\x45\\x2e\\x6a\\x3e\\xc5\\x6a\\x55\\x82\\x83\\xd1\\x11\\x68\\xf0\\x8e\\xc0\\x07\\x57\\x57\\x71\\x28\\x9a\\x17\\x34\\xcb\\x4e\\xbc\\x51\\xc2\\x06\\xc8\\x3b\\x0a\\xff\\x91\\x69\\x00\\x41\\x96\\x5e\\x81\\x95\\x23\\x59\\xf1\\xbf\\x6f\\x38\\x40\\x17\\xab\\x1d\\xe0\\xe2\\x4d\\xa3\\x52\\x36\\xc9\\x64\\xca\\x83\\xcf\\x36\\xa5\\xdd\\x53\\x83\\x16\\xa4\\x2e\\x47\\x14\\xc0\\x06\\xe8\\xb6\\x3b\\xfd\\xab\\xfa\\xe9\\x23\\x3a\\x1a\\xeb\\x34\\xde\\x00\\xfb\\x05\\x2e\\x70\\xf6\\xaa\\xc2\\x75\\x82\\x26\\xa6\\x4d\\xce\\x8c\\x30\\xc1\\x45\\x48\\x75\\x6c\\x01\\x26\\x3d\\xc9\\x41\\x02\\x5c\\x8b\\xaa\\x6b\\xb1\\x72\\xdc\\x72\\xb4\\x91\\xc0\\x67\\x8f\\x2a\\x1e\\x59\\x74\\xbd\\x94\\x9a\\x65\\x5d\\x2c\\xe9\\xe4\\xdd\\xda\\x0c\\xf6\\xf5\\xbc\\xb4\\x69\\x67\\x1e\\x36\\x85\\xda\\xd9\\x1b\\xa0\\x88\\x75\\x70\\x10\\xc4\\x28\\x8b\\x67\\xd7\\xbd\\x73\\xef\\x99\\xe7\\x48\\xa7\\x9d\\x63\\x79\\x58\\x6b\\x8d\\x16\\x73\\x5d\\x9d\\x16\\x8c\\xe8\\x3d\\x85\\x47\\x1c\\x21\\xae\\x19\\xd1\\x8f\\x62\\x35\\xe9\\x74\\x69\\xea\\xbd\\xe4\\xd1\\x5c\\x25\\x7a\\x15\\x97\\xa5\\x63\\xbd\\x17\\x89\\x47\\x4c\\x89\\xb1\\x73\\x6f\\xbf\\xd2\\x8a\\x26\\xf1\\x80\\x7f\\x51\\xb6\\x06\\xe4\\xf2\\x2e\\xce\\x48\\x50\\x3d\\x82\\x82\\x26\\x9c\\xd5\\x5b\\xa9\\x90\\xac\\xfa\\xd3\\x05\\x8d\\xcf\\x29\\x80\\x63\\x3b\\xb0\\x01\\x4f\\x99\\x01\\x81\\x23\\xba\\x44\\x4a\\x69\\x63\\xf5\\x9c\\xf9\\x42\\x35\\x6f\\xc8\\x0f\\xc9\\xde\\xba\\xd5\\xff\\x0f\\xe4\\xa2\\x55\\xe9\\x8d\\x71\\xc6\\x0b\\xab\\xd9\\x76\\x2b\\x2e\\x5f\\xfa\\x44\\x22\\x62\\x05\\x73\\x8c\\x26\\xa3\\xee\\xb1\\x3a\\x24\\x32\\x9d\\x1d\\x1b\\xac\\x70\\xbe\\x3d\\x6b\\x2c\\x9c\\xd1\\x9b\\x01\\xc6\\x8d\\xb6\\xf1\\xa0\\x40\\x95\\x2f\\x20\\x9e\\x6f\\x20\\xab\\x26\\x3d\\x59\\x6a\\x53\\xa2\\xbe\\xfd\\x99\\xbd\\x7b\\xfa\\xcb\\xd2\\x82\\xa4\\x76\\x50\\xab\\x97\\x86\\x30\\x7e\\xab\\x97\\xd8\\x8a\\x9a\\xea\\x2d\\x87\\x01\\x49\\xd2\\x3b\\xc2\\xb4\\xc1\\xf0\\xa6\\x2d\\x7b\\xf8\\xc2\\x4b\\xfc\\x93\\x63\\x68\\x81\\xd7\\x86\\x2b\\x68\\x6f\\xa3\\x9a\\xdd\\x79\\x35\\x9a\\x18\\xfc\\x3d\\x12\\x0d\\x2b\\x1e\\x8f\\x06\\xeb\\x00\\xd5\\x33\\x3f\\xaa\\x03\\x71\\xa1\\xba\\xfa\\x18\\x1b\\x10\\x0a\\x6d\\x9b\\xbc\\x36\\xea\\x9a\\x25\\xe7\\xee\\xe6\\x97\\x9e\\xbf\\x56\\xad\\x57\\xac\\xa1\\x2b\\xed\\x50\\x78\\xb4\\xb4\\x53\\x18\\x68\\x64\\x0f\\xf2\\xc1\\x64\\x2d\\xe3\\x02\\xb8\\x7d\\x2a\\x4d\\x59\\x65\\xd5\\xd9\\x10\\x80\\xb9\\x2d\\x2a\\x43\\xb5\\x14\\xda\\xc4\\xe0\\xaa\\x77\\x1c\\xea\\xe2\\x21\\x53\\xbd\\x46\\x05\\xc7\\xca\\xd4\\x18\\xd6\\x62\\x55\\xe3\\xc8\\xe3\\x40\\xf6\\x5d\\x59\\xc6\\x8d\\x57\\xac\\x99\\x8b\\xd1\\x4e\\x33\\xd6\\xbb\\x24\\xdf\\x5e\\xac\\xc7\\x9e\\xb1\\xba\\x0c\\xea\\xc1\\xc2\\x81\\x65\\xa0\\x6a\\x05\\x5e\\xae\\x3a\\xb9\\xea\\xf5\\xaa\\xd1\\x78\\xc4\\xda\\xb6\\x28\\xe8\\x9e\\x81\\xa2\\xd7\\xfa\\xce\\x17\\xd9\\xbf\\x48\\xfe\\xc5\\xfa\\xd4\\x17\\x6f\\x8e\\x68\\xf9\\xc5\\xe8\\x30\\xd0\\x36\\xc6\\x39\\x1a\\x17\\x62\\x95\\xe8\\x02\\x70\\x6c\\x39\\x72\\x49\\xd6\\x62\\x22\\xaa\\x73\\x6e\\xd9\\xb8\\x37\\xda\\x6e\\xf7\\xb7\\xdb\\x6e\\xdf\\xe7\\xd2\\x42\\x3f\\x06\\x6f\\xa2\\x96\\x04\\xe5\\x0b\\xf1\\x38\\xa2\\xb4\\x71\\x19\\x0d\\x24\\xc2\\x97\\x88\\x8b\\x42\\xa0\\x8c\\x3b\\x70\\xc1\\xad\\x3f\\xdc\\x57\\x69\\x6a\\x3a\\x5c\\x28\\x81\\x2d\\xf3\\xf6\\xd0\\x5f\\x7d\\xf7\\xa1\\x8f\\xf4\\xbb\\x47\\x5e\\x92\\x5a\\xe1\\x75\\x2f\\x29\\xb4\\x81\\xaa\\x4d\\x6f\\xfb\\x52\\x4d\\x7e\\xef\\x30\\x21\\x01\\xb4\\x6a\\xce\\x3b\\x92\\x2b\\xda\\xd2\\x56\\x2b\\x58\\xbb\\x73\\x12\\x4f\\x48\\x13\\x30\\x44\\x47\\x50\\x22\\x8c\\x85\\x03\\xb3\\x1a\\x2a\\x64\\x88\\x78\\x05\\x8e\\x0c\\x89\\x0d\\x94\\x0b\\x9d\\xc5\\xe4\\xcd\\xae\\x2e\\xcc\\x79\\x27\\x09\\x12\\xd8\\xca\\x85\\x01\\x81\\x54\\x99\\xe3\\xc9\\xba\\x92\\xfa\\x41\\x09\\x9d\\x89\\xf3\\x40\\xc3\\x71\\xeb\\xe0\\x81\\xc1\\xab\\x76\\xd9\\x41\\xb6\\x6a\\xf9\\x6b\\x6b\\x43\\xc5\\x96\\x6c\\xe6\\xac\\xba\\xc2\\xbc\\x71\\xd5\\x26\\xde\\xc4\\xd7\\x59\\x32\\xeb\\x62\\x27\\x5c\\xb9\\x68\\x2f\\xab\\x1d\\xab\\x0d\\x4f\\x11\\xc0\\xf8\\xd1\\x5e\\x19\\xf8\\x33\\xd4\\x99\\x3c\\xe3\\x70\\xbe\\x3e\\xd7\\xac\\xf7\\xb2\\xd9\\xe4\\x8e\\x1d\\xa1\\x31\\xf1\\x14\\x1e\\x9f\\xf6\\x85\\xb5\\xea\\x85\\x3d\\x8e\\x08\\xea\\x58\\x8e\\xca\\xf0\\xf8\\x3b\\x5c\\x54\\x3b\\x8b\\xd5\\x5a\\x2b\\x22\\xb7\\x32\\x79\\x04\\x58\\x39\\x16\\x62\\x3a\\xb3\\x55\\xd6\\x26\\x06\\xb0\\x89\\x33\\x8e\\xb5\\x1a\\xfd\\x47\\x9e\\xab\\x1f\\xd3\\x5d\\x39\\xc0\\x30\\x36\\x74\\xe9\\xe4\\xec\\x50\\x64\\xfa\\xc6\\xbb\\xc5\\x24\\x23\\x38\\x22\\xbb\\x61\\xb7\\xe6\\xac\\x18\\xbf\\x33\\xf2\\x97\\xb7\\x66\\xce\\x8b\\x2f\\x52\\x58\\x41\\xb5\\xda\\xc1\\x1a\\x42\\x89\\xf7\\x42\\xa1\\x32\\x38\\xd3\\xd1\\x7a\\x41\\x8f\\x32\\xa2\\x8b\\x80\\x81\\x8d\\x13\\x4a\\xbe\\xd8\\x5a\\x78\\xb1\\xad\\xb3\\xf9\\x3c\\x78\\xaf\\xdd\\xdb\\x2a\\x7b\\xbf\\xdb\\x55\\xf2\\x24\\x57\\xc7\\xd9\\x93\\x0f\\x96\\xce\\x62\\xcb\\xa3\\x31\\x07\\x75\\xec\\x8c\\x35\\x6e\\x78\\xdf\\xfa\\x84\\x36\\xc2\\xb0\\xbc\\x7b\\x5e\\x54\\x37\\xd5\\xcb\\xbe\\xae\\x3d\\x1b\\xbd\\x4a\\xf9\\x5a\\x17\\xd0\\xbc\\xa1\\x20\\x85\\xd1\\x2c\\x12\\xf6\\xf8\\xac\\x85\\x1b\\x62\\x62\\xbc\\xb7\\x98\\x18\\xdf\\x4e\\x4c\\xac\\xf8\\x08\\x4a\\xed\\x50\\x60\\x56\\x01\\x62\\x40\\x3f\\xd9\\x11\\x46\\xb2\\x62\\x40\\x8b\\xde\\xa2\\x1d\\x96\\x4e\\x02\\x4b\\xd0\\xc5\\xad\\x96\\x65\\xe3\\x14\\x32\\xcd\\xbe\\x90\\x8a\\x96\\xcd\\x3f\\x88\\xe8\\xa2\\x96\\x5f\\xb4\\xee\\x82\\xc0\\xd9\\x8b\\x4d\\xe2\\xf2\\xc5\\x2c\\x21\\xe8\\x01\\x79\\x71\\x74\\x07\\x6c\\x54\\x34\\x51\\xc6\\xff\\x1c\\xf9\\x67\\xce\\xf2\\x5d\\xb9\\x66\\x2e\\x5b\\x58\\x4d\\x3b\\xbd\\xea\\xbf\\xd4\\x2b\\xf1\\x46\\xb7\\x02\\xdf\\xbc\\x4b\\xf3\\xaa\\xc6\\x3c\\x6b\\x43\\x7d\\x1a\\x32\\xcb\\xa8\\xb9\\x3b\\xf9\\x96\\x1d\\x8c\\x08\\x04\\x5d\\x05\\x59\\x0b\\x80\\x87\\xd6\\x75\\x77\\x0c\\x63\\x34\\x76\\xcf\\x3e\\x5f\\x8b\\xfe\\xad\\xdb\\x73\\x37\\x35\\x6d\\x85\\xab\\x1e\\x89\\x1b\\xcb\\x60\\xf0\\x53\\x45\\xd7\\xb2\\x67\\xb0\\x29\\x3f\\xdc\\x0b\\xb0\\x23\\x28\\x74\\xf2\\x56\\x60\\xbc\\xf8\\x08\\x16\\x4c\\x52\\xd2\\x32\\x53\\xad\\xe1\\x04\\x4d\\x6f\\x9b\\x28\\xd7\\xaa\\x28\\xb7\\x46\\xf9\\xdd\\x3e\\x79\\xa7\\x9d\\xf9\\x56\\xa7\\xbc\\xb0\\x5a\\xe5\\x41\\xaa\\x22\\x92\\x8e\\xfe\\xff\\x86\\x40\\x0a\\x56\\x64\\x6a\\x65\\x7d\\xe8\\x52\\x9f\\xcc\\x4a\\xbd\\x8d\\x3b\\xf8\\x3c\\x7d\\xfa\\x31\\x1a\\x36\\xa5\\x90\\x1e\\xee\\xb9\\xf5\\x40\\xb9\\xf6\\xcd\\x7a\\xcb\\xc8\\x26\\x88\\x31\\x08\\x6d\\xd6\\xf3\\x2a\\xd1\\x77\\xe9\\xec\\xa4\\x83\\xa3\\x8f\\x37\\x38\\x51\\xbf\\x35\\xe7\\xb4\\x89\\x4a\\x63\\xa1\\x0d\\xf4\\x03\\xa8\\x1a\\x11\\xe0\\x02\\x50\\x7a\\xfb\\x9d\\x46\\xc7\\x1f\\x6f\\x74\\x34\\x5a\\xa0\\x4c\\x6d\\x63\\x75\\xce\\x98\\x2e\\x55\\x36\\x06\\x23\\x39\\x35\\xa3\\x3f\\x50\\xe1\\xa2\\x0e\\x36\\x09\\x2c\\x23\\x7a\\xaf\\x11\\xcb\\x47\\x1c\\x71\\xad\\xba\\xd8\\x19\\xac\\x46\\x9c\\x4a\\xd0\\xe1\\x72\\xf2\\xf2\\x2e\\x4f\\x15\\xd1\\x5c\\xdd\\xb3\\x76\\x73\\x49\\x9a\\x97\\x16\\x79\\xd1\\x27\\x64\\x33\\x42\\xf9\\x1e\\x51\\x5d\\x80\\x17\\x00\\xf7\\xd9\\x13\\x39\\xdc\\x4e\\x1b\\x37\\xe7\\x8d\\x88\\x9d\\xa8\\x0b\\xfd\\x48\\xd9\\x11\\xb3\\xc6\\x5b\\xee\\x9a\\xfb\\xee\\x2c\\x50\\x54\\x75\\x61\\x7f\\x85\\x4e\\x3c\\x5b\\xff\\x81\\xec\\x10\\xbd\\xdf\\x81\\x0c\\xed\\xae\\xe1\\x54\\xcf\\x33\\x7e\\xd4\\x98\\x92\\xd4\\xd5\\x92\\xf4\\xa8\\xfc\\xf1\\x8c\\xcc\\xe8\\xe2\\x0c\\xef\\x39\\xfc\\x5d\\x96\\x20\\x7f\\xcc\\x25\\xc8\\x81\\x0a\\x6a\\x40\\x1e\\x81\\x14\\x16\\x44\\xe1\\x31\\x40\\xc1\\xf0\\xe0\\xd7\\x72\\x2e\\xd0\\x07\\x25\\x04\\xe8\\x70\\xb7\\xc5\\x44\\x2d\\x7a\\xf2\\x08\\x9d\\x40\\x6f\\x60\\x13\\xea\\x22\\x8b\\xb9\\x7b\\x0a\\x99\\xe0\\x39\\xfe\\x47\\x98\\x84\\x5b\\xa7\\x3d\\xdc\\x97\\x4c\\xe7\\xc0\\xaf\\x40\\x85\\x37\\x60\\x0a\\x6b\\xe0\\xec\\xd4\\x80\\x36\\xec\\xb7\\x5b\\xb5\\x64\\x41\\x01\\x94\\xa5\\x09\\x4f\\x80\\x02\\x39\\x2c\\x92\\xce\\x44\\x64\\x7f\\x07\\x4e\\xf1\\x08\\xd6\\xf3\\xc6\\xa0\\x6f\\x94\\x65\\xe9\\xca\\x95\\xc7\\x2b\\x47\\xba\\x72\\xb5\\x1a\\x6a\\x14\\xf5\\x85\\x68\\x53\\x04\\xf0\\x68\\xce\\xbe\\x7b\\x8a\\x39\\x4e\\x60\\x43\\xcc\\xac\\xbb\\x1f\\xfa\\xd3\\xba\\x14\\x5a\\x0a\\xc2\\x6e\\xef\\xba\\x1d\\xf7\\xac\\xd6\\x94\\x35\\x59\\x9c\\x66\\x53\\x65\\x30\\x4c\\x99\\xbf\\xee\\xc6\\xb7\\x5b\\x31\\xb2\\xf2\\xe8\\xd1\\x7a\\x66\\xd9\\x7c\\x98\\xe2\\xc8\\xde\\xa7\\xd7\\x68\\x07\\xb6\\x8c\\x0e\\xd5\\x5c\\xdf\\xb3\\xf3\\x1e\\xa5\\x87\\x70\\x8f\\x9d\\x9a\\xeb\\x42\\x1d\\x81\\x14\\xcd\\xc6\\xc6\\x6c\\xf0\\x97\\x5c\\xf5\\xb0\\xd0\\x08\\x05\\x0d\\xdf\\xf1\\xee\\xd9\\xbb\\xa8\\xe1\\xc8\\x65\\x4b\\xdd\\x46\\x23\\x54\\xbb\\x3d\\xcd\\x2b\\x60\\x15\\x73\\x48\\x9b\\x0c\\x31\\xf0\\x5f\\xe5\\xe6\\x8d\\xb0\\x84\\xf9\\x88\\x42\\xed\\xc2\\x8d\\xbc\\xc7\\x16\\xae\\xa4\\xd6\\x8b\\x50\\xf7\\x1e\\x5b\\x45\\xe8\\x10\\x06\\x67\\x77\\xde\\x40\\x6b\\x80\\xff\\x62\\xd6\\x5d\\x59\\x7a\\x28\\xb0\\xc7\\xd4\\x87\\xba\\x9d\\x7e\\xfa\\x7c\\x85\\xa4\\x7e\\xea\\x54\\xf7\\xe1\\x9d\\xea\\x40\\xa5\\x88\\xc8\\xa8\\x53\\x8a\\xd4\\x93\\x9c\\x04\\x78\\x04\\x50\\x9f\\xfc\\xfe\\x23\\x57\\xcf\\x87\\xe0\\xc2\\x7b\\xc7\\xe0\\x08\\xcc\\xcd\\x60\\x3f\\x40\\xa9\\x4b\\x75\\x3b\\xd5\\x48\\xea\\x48\\x65\\xc3\\x48\\x4e\\x55\\xbb\\xba\\xdb\\x3c\\x63\\x95\\x9d\\x38\\xb4\\x0f\\xeb\\x32\\x67\\xdf\\xff\\x56\\x96\\xd9\\xcd\\xa1\\x8c\\x8f\\x3b\\x14\\xd1\\x59\\xfb\\x1d\\x76\\xd8\\xcd\\xb1\\xbc\\xfc\\xc8\\xd3\\x42\\xf9\\xbd\\xac\\xae\\x9b\\xe3\\xfb\\xd5\\xc7\\x1d\\x1f\\xe9\\x66\\xfd\\x41\\x2b\\xf8\\x52\\x04\\x23\\x0c\\x3f\\x2e\\x55\\x7e\\x22\\x66\\x3e\\xa0\\x2b\\x9d\\x7d\\xf9\\xc3\\xce\\xd6\\xab\\x8f\\x38\\x8e\\x0f\\x3a\\x58\\xaf\\x3f\\xe2\\x40\\xac\\xd1\\xc9\\x47\\x3c\\x55\\x5f\\x7c\\xcc\\xc1\\xb5\\xf4\\x43\\x3f\\x52\\xb9\\xbd\\x6d\\x1c\\x87\\x1f\\xfe\\x91\\x7a\\x95\\x1e\\x81\\xbf\\x7a\\x3a\\x74\\xe2\\x7b\\x3a\\x4a\\xea\\x3f\\x84\\x6e\\xb1\\x07\\xb8\\xe1\\x7a\\xfa\\x3d\\x76\\x8d\\x0d\\xd6\\x36\\x56\\x0d\\x53\\x32\\x26\\xe3\\x7e\\x89\\xb8\\xca\\xcf\\x14\\xa6\\xbe\\x5a\\x11\\x8e\\x3f\\x44\\xbb\\x40\\xfc\\x88\\x6b\\x95\\xef\\xd3\\x73\\x0f\\xef\\xe3\\xba\\xff\\x1e\\x3c\\xf7\\x9b\\x8b\\xc2\\xd7\\xca\\x23\\xdd\\x32\\xff\\xd4\\x3a\\x29\\x86\\x1f\\x5c\\xeb\\xb9\\x0f\\x51\\xb2\\xaf\\xe4\\xa7\\xd5\\xfc\\x81\\xad\\xe6\\x87\\x98\\x2a\\xaf\\xf2\\x1f\\xeb\\x72\\xd2\\xf8\\x9d\\x66\\x53\\x78\\x32\\x06\\xfc\\x47\\xd5\\x50\\x52\\x97\\xb8\\xfc\\x91\\x2e\\xf1\\xb7\\xd3\\xbc\\xe1\\x07\\x16\\x34\\xff\\x7d\\xc4\\xcc\\x9f\\xde\\xb2\\xe1\\x47\\xbc\\x67\\xeb\\x1f\\xf3\\x9e\\xfd\\x36\\x0e\\x53\\xf8\\xde\\x3c\\xa6\\xef\\x57\\xfe\\x85\\x0f\\x50\\x84\\x2b\\x7c\\xf2\\xa3\\x8a\\x9e\\xbc\\x6a\\x8f\\xca\\xd8\\x72\\xe6\\x8d\\xa5\\x07\\xce\\x75\\x43\\x2b\\x3b\\x2e\\xd6\\xf3\\x92\\x72\\x41\\x1f\\xc8\\xc8\\xb8\\xc8\\x81\\xb3\\x78\\xa6\\x1e\\xbc\\x99\\xd9\\x19\\xee\\xc0\\xf5\\xc6\\xe8\\xaf\\x0e\\x70\\x5b\\x1e\\xd7\\xe7\\xa8\\x7b\\xaf\\x0f\\x78\\x66\\x2c\\xfd\\xd3\\xf7\\x69\\x2d\\x6d\\x45\\xe3\\x94\\x4e\\xf8\\x89\\x9f\\x34\\x9d\\xd7\\x0d\\xa6\\x66\\xdf\\xa8\\xab\\xb4\\x42\\xa5\\x1c\\x7a\\x10\\xf5\\x3d\\x0f\\x20\\x0b\\x9c\\x35\\x76\\xac\\xb9\\x3f\\xbb\\xc8\\xbd\\xff\\xb1\\x9c\\x1e\\x9e\\xb7\\xd8\\xfe\\x58\\xb4\\xe0\\x68\\x84\\x17\\xa9\\xe8\\x20\\x7a\\x0a\\x23\\x83\\x2d\\x82\\x49\\xc2\\xae\\xde\\xe8\\x30\\x86\\x68\\x7d\\x43\\x5d\\x3b\\xae\\xf9\\x8d\\xb3\\x50\\x4b\\xa8\\xd6\\x69\\x99\\x8c\\x6f\\x0f\\xc8\\xbb\\xca\\x63\\x47\\xe1\\x7d\\x31\\x06\\x8f\\x5c\\xbe\\xfb\\xb6\\xcd\\x30\\xc2\\xc7\\xee\\x6f\\x8c\\xd2\\xa0\\x8e\\x86\\x5d\\xe3\\xbb\\x9d\\x2d\\x54\\x70\\x81\\x71\\xcb\\xda\\x77\\xf5\\x67\\x56\\x7a\\xc5\\xa1\\x1b\\x9c\\xd8\\x9f\\x9a\\xdb\\x7a\\x73\\x5b\\x74\\xb1\\x79\\x5f\\xd7\\xe8\\xe5\\x4f\\x73\\xfa\\xe4\\x9c\\x7e\\x90\\x83\\xf2\\xab\\x9f\\x26\\xf5\\xe9\\x8d\\xfa\\x2d\\x1c\\x9c\\xef\\x12\\x17\\x7e\\xf5\\xf9\\x4f\\x13\\xfd\\xe4\\x44\\xa3\\x62\\xee\\x87\\x1d\\xe3\\x7e\\x14\\x85\\x7f\\x3f\\xbb\\x27\\x7c\\x1f\\x86\\xcf\\x99\\xae\\xe9\\x88\\xa3\\xbe\\x6f\\xeb\\xeb\\x0f\\x13\\x2f\\xd7\\x2a\\x6b\\x3e\\x43\\xc6\\x25\\xbd\\x15\\x21\\xbe\\xb9\\xcf\\x7d\\x97\\xdb\\x1e\\xa7\\xdc\\x2e\\x60\\x17\\x26\\xa4\\xef\\xc7\\xb2\\x29\\xbd\\x51\\x7e\\x17\\xef\\x31\\xcc\\x73\\xb5\\xbe\\xb7\\xc2\\x05\\x80\\x33\\xad\\x65\\x6b\\x59\\x67\\xc3\\xf3\\xed\\xd6\\x66\\x78\\x38\\xf9\\x28\\xe8\\x97\\x8f\\xc8\\xc3\\x1a\\xd7\\x3f\\xdc\\x8b\\xd4\\x90\\x07\\x5f\\x68\\xf0\\x8e\\xd6\\x00\\x83\\x0c\\xf5\\x0d\\x4c\\xa7\\xa0\\x58\\xd0\\xf8\\x42\\x8d\\xd9\\x72\\x4f\\x01\\xe5\\x83\\x6c\\x54\\x08\\x8e\\x63\\x36\\x02\\x7d\\x38\\xa2\\x77\\xab\\xf3\\x86\\x61\\x9f\\xe9\\x56\\x73\\x44\\x9d\\xb9\\x2f\\xae\\x85\\xac\\xe9\\xe8\\x28\\x0a\\x22\\xae\\x56\\xc6\\xc5\\x9c\\x8d\\xe1\\xcb\\x1a\\xf0\\x5a\\x5f\\x44\\x4a\\x32\\xa9\\x8e\\xb3\\x5d\\x25\\xca\\x46\\x9c\\x67\\x09\\x54\\x36\\xfd\\x51\\x13\\x0e\\xce\\xd3\\x6b\\x44\\x16\\xd1\\x69\\x76\\x9e\\xdb\\x66\\x27\\xc0\\xba\\x36\\x7b\\x4b\\x13\\x74\\x40\\x30\\x80\\xa7\\x3e\\x1a\\xf0\\x03\\x0a\\x60\\xa9\\x28\\xce\\xd7\\xd6\\xad\\xa5\\x17\\x4c\\xb7\\x69\\xcd\\x6b\\xe9\\xac\\x46\\x01\\x82\\xe2\\xda\\x52\\x60\\xd5\\x84\\x3b\\xb6\\xb5\\x1b\\x04\\xa4\\xb1\\xd1\\x31\\x3c\\x62\\x5d\\x68\\xd6\\x8b\\x19\\xa5\\x80\\xba\\x9a\\x1b\\xa9\\xbc\\xed\\x69\\x2f\\x68\\xac\\x89\\x46\\x91\\x7a\\xe0\\x8d\\x3f\\xaa\\x2e\\x9b\\xb4\\x48\\xc8\\x64\\x8c\\x0a\\xd5\\x2a\\x2b\\x03\\x4a\\xe2\\x70\\x32\\x2b\\x2a\\xf2\\xac\\xf1\\x50\\xcf\\x6e\\x3e\\x7a\\x99\\xa1\\xca\\xbe\\x81\\x95\\x49\\x0c\\x6e\\x2d\\xf0\\x05\\xcb\\xaa\\xda\\xf2\\x8e\\x5e\\x41\\xaa\\xf5\\x3a\\xb2\\x87\\x53\\x18\\xb4\\x56\\x3e\\xdd\\x19\\x67\\xbd\\x7d\\x9c\\x74\\xd6\\xc0\\x22\\xd3\\x74\\xa9\\x56\\x61\\x9c\\x2a\\x0f\\x3e\\xfb\\x0a\\x9f\\xb7\\x47\\x2b\\xfe\\xf1\\x0e\\x56\\x82\\x16\\xd9\\x1d\\x2d\\xa4\\xf8\\xb6\\x51\\xf4\\x7a\\x65\\xb2\\x3a\\xeb\\x29\\xff\\xa9\\xeb\\xf7\\x1f\\xb4\\xeb\\xf7\\x1e\\x47\\x02\\x47\\x8c\\x15\\x30\\xc1\\x1d\\x7a\\xbb\\xd7\\xb7\\x77\\xd8\\xbd\\x5b\\xdd\\xbe\\xef\\xa5\\xd4\\x40\\xa2\\x3e\\x9b\\xaa\\x6b\\xca\\x9b\\xd1\\x3c\\x4a\\xdd\\x8c\\x5c\\xb5\\xde\\x86\\xd0\\xbf\\xa6\\x9f\\x56\\xfb\\x47\\xb6\\xda\\x1f\\x52\\x81\\xfc\\x9a\\x7f\\x5a\\xee\\x47\\xcb\\xcd\\x28\\x95\\x96\\xb4\\xb1\\xa8\\x5d\\xd8\\x2e\\x55\\x2d\\x18\\x90\\xf8\\x0c\\x1d\\xfc\\x08\\xb1\\xf7\\x2d\\xea\\xc8\\xa9\\xa3\\x62\\x13\\x6c\\x4f\\xe3\\x47\\xb1\\x51\\x6e\\xee\\x01\\xf9\\x69\\x0f\\x3c\\xda\\x03\\x04\\x16\\x7c\\x6a\\x9e\\x94\\xc8\\x9e\\x94\\xc8\\x06\\x47\\xf6\\x86\\x56\\xe6\\xf4\\xdc\\x39\\xa7\\xe0\\xde\\x90\\x97\\x30\\xa7\\xa9\\xaf\\xbc\\xc4\\x30\\xae\\x97\\xe7\\xf3\\x12\\xd6\\xc7\\x54\\xac\\x9f\\x29\\xca\\x65\\x9c\\x01\\xf5\\xcc\\x4d\\xd0\\x99\\x9b\\x38\\xb3\\x10\\x25\\xa3\\xba\\x65\\x65\\x11\\xf8\\xcc\\x4b\\x8c\\xe0\\x66\\x95\\x5b\\x35\\xf5\\xa4\\x05\\xf6\\xfc\\x04\\x79\\x76\\x02\\xbf\\x1d\\xbe\\x0b\\xa8\\xff\\x47\\xbc\\xbf\\xf3\\x4f\\xfb\\xfb\\xb1\\x8c\\x4b\\xe3\\xc7\\x47\\xe5\\xf8\\x5d\\xb7\\x5f\\xf8\\x3e\\x14\\x71\\xe9\\xf5\\xc3\\xf9\\x26\\x3f\\x84\\x6e\\x32\\x7c\\x04\\xbe\\xc9\\xd7\\xe5\\xa7\\xd3\\xf2\\xf8\\xb4\\x8c\\xf3\\xb4\\x3c\\x5d\\xb1\\xd2\\xac\\x5e\\x05\\xfb\\xec\\x46\\xc5\\x8a\\xf5\\x9d\\xb0\\x9a\\x95\\xb3\\x64\\x54\\xaf\\xc6\\x6a\\x64\\x5c\\x17\\xef\\x09\\xea\\x54\\xec\\x01\\x67\\x37\\x56\\x72\\x52\\x7e\\xfb\\x29\\x5b\\x6e\\x2b\\x16\\x08\\xbf\\x07\\xcb\\x23\\xfc\\x7e\\x6c\\xd4\\x8c\\xa3\\x51\\x1e\\xd7\\xcb\\x88\\xf3\\x37\\xa0\\x24\\x21\\x37\\x2b\\x4d\\xa0\\xe1\\xec\\xd9\\xab\\x64\\xa6\\xa1\\xc2\\xe0\\x5b\\x16\\xcb\\xbc\\x3e\\xc9\\xa8\\x03\\xd7\\xec\\xd4\\x2e\\x43\\x7d\\xa1\\xd9\\x05\\x9d\\x98\\x2c\\x2a\\xd3\\x92\\xf7\\x08\\xe4\\x61\\x9d\\x17\\xbc\\x03\\x89\\x2a\\x56\\xd4\\xae\\x94\\x6b\\x96\\xbf\\x2e\\x22\\x63\\x74\\xc7\\x6f\\xa0\\xef\\x24\\x0e\\x94\\xf3\\x5e\\x38\\xa8\\xc1\\x68\\x8d\\x08\\xac\\x8b\\x27\\x0e\\x34\\xda\\xcd\\x19\\x15\\x8b\\xd8\\xe9\\x36\\x0e\\x50\\x3c\\xa7\\x78\\x4f\\x2a\\xef\\x89\\x9c\\xbd\\x35\\x23\\x67\\xeb\\x0f\\x87\\xa4\\x50\\xf6\\x5a\\x64\\x6f\\x71\\x68\\x5d\\xf0\\x74\\xed\\x50\\x7f\\x4d\\x58\\xdd\\x34\\x91\\xef\\x32\\x8e\\x17\\xf4\\x81\\x0d\\xd3\\xa0\\x11\\x86\\x7c\\x4c\\x69\\x8b\\xc0\\x4d\\x52\\x3b\\x22\\xe8\\xde\\xd4\\x66\\xd0\\xfd\\x81\\x90\\xad\\x30\\x02\\x03\\x85\\xbc\\x6b\\x54\\x45\\xe4\\xc2\\xbb\\x5b\\x82\\xfd\\x72\\x71\\xb1\\xcb\\xb0\\x63\\x55\\x17\\xc5\\xc7\\xd9\\x80\\xd6\\xc3\\x8f\\xd6\\x5b\\xd9\\xaa\\x6a\\x1e\\xb5\\x85\\xb4\\x1c\\x22\\xe8\\xd8\\xc0\\xe5\\x84\\xce\\x28\\x62\\xd1\\x48\\x9f\\x84\\x15\\xb7\\xf2\\x19\\xb6\\xb6\\xa1\\xe3\\xca\\x2e\\x6a\\x79\\x64\\xe7\\x4e\\xb0\\x5a\\x97\\x32\\x16\\x43\\x1c\\xa1\\xa3\\xd5\\x3d\\x27\\xd1\\xc5\\x0e\\xc6\\x83\\xa8\\x56\\x0e\\xc4\\x22\\xb3\\x9f\\x00\\x10\\x03\\x54\\x00\\x06\\x28\\xed\\xe8\\xfd\\x84\\xcc\\x1e\\xde\\xda\\x18\\x52\\xf4\\xbe\\x63\\x74\\x2b\\xca\\x11\\xe7\\x1b\\x42\\xff\\xe3\\xee\\x44\\xed\\xed\\xee\\x8d\\xb6\\xf1\\x95\\x1f\\xee\\x6b\\xaa\\xa1\\xa6\\x8e\\x86\\x1c\\xf5\\x40\\x55\\x78\\xb6\\x7e\\xaa\\xde\\xc5\\x92\\x53\\x40\\x47\\x02\\xf1\\xb6\\x8b\\xd9\\x7a\\x4d\\x9e\\xcd\\x83\\x2c\\xdb\\xea\\xec\\xf7\\xeb\\xec\\x1b\\x23\\x96\\xbd\\xaa\\x17\\xb8\\xdd\\xde\\xed\\xed\\x1a\\xc0\\x5b\\x3d\\x96\\x5b\\x90\\xe2\\x65\\x35\\x2a\\xb9\\x2a\\x4d\\x72\\x9a\\xee\\xee\\x94\\xa9\\x3a\\xe9\\x46\\x3a\\x66\\x05\\x42\\x3c\\x8d\\xf3\\x31\\x8a\\x73\\xda\\x7a\\x2b\\x5d\\x3a\\x5b\\x9a\\x66\\xdb\\x55\\xef\\x76\\x0c\\xb1\\x7e\\x4f\\x1e\\x6c\\x7c\\xdc\\x35\\x44\\x45\\x48\\xf7\\xe6\\x07\\xe8\\x3e\\x00\\x69\\x8c\\xfe\\xa7\\x6c\\xfd\\x4f\\xdf\\xe8\\x7e\\x2a\\xde\\xfd\\xb4\\xae\\xbc\\xaa\\xf7\\xe2\\xd2\\xc3\\x65\\x4c\\x2c\\x76\\x72\\x50\\x32\\x85\\xee\\x3e\\xe8\\x77\\x13\\x16\\x53\\x0d\\xe7\\x1d\\x35\\x75\\x46\\x10\\xb7\\x8e\\x1b\\x5b\\x4f\\x1a\\x93\\x6d\\xc5\\xf8\\xd3\\x1f\\x75\\x26\\x41\\xf3\\xdb\\xb1\\xea\\xa2\\x2c\\x34\\xa6\\x7b\\xda\\x20\\xd8\\xac\\x6f\\x9e\\xc1\\x99\\xf9\\x3d\\xd7\\x60\\x3d\\x51\\x82\\x15\\xbe\\x7d\\x0d\\x96\\xec\\x71\\x88\\xa5\\x6c\\x5a\\x5a\\xac\\xe4\\x2a\\x81\\x53\\xf3\\xa6\\x71\\xa8\\x75\\x13\\xeb\\x3f\\xf4\\x1c\\x7b\\xd3\\xeb\\xfe\\x4e\\x7a\\x09\\xdc\\xc8\\x3a\\x31\\x92\\x03\\x53\\x9e\\xc3\\x94\\x0a\\xcd\\x47\\xf4\\xb9\\x3d\\x9d\\xe1\\x62\\xc3\\xbc\\x5b\\xd5\\x3f\\x79\\x23\\xb4\\x7e\\x6d\\x29\\x9d\\xab\\x9d\\xd5\\xb4\\xea\\xff\\x0b\\x5a\\xef\\xe5\\x81\\xf8\\x7c\\x6e\\x97\\x58\\xb9\\xed\\x1d\\xab\\x86\\xb9\\xf7\\xde\\xf0\\x21\\x76\\x5e\\x7c\\x19\\xdd\\xfa\\x54\\x18\\x7b\\x3a\\xe6\\xdc\\xa6\\xd9\\x7a\\x86\\x1a\\xf5\\x51\\xd5\\x6d\\x00\\xfb\\x41\\x7d\\x2c\\x00\\xe8\\x11\\x19\\x16\\x94\\xe4\\xe9\\x3e\\xa7\\x64\\x14\\x77\\x38\\x0e\\x92\\x67\\xa4\\x42\\x61\\xf4\\x30\\xe3\\xb8\\x36\\x56\\x41\\x5b\\x9d\\xe4\\xdd\\x67\\x28\\xa8\\x15\\x22\\x00\\x24\\x65\\xa7\\x0e\\x0a\\xdd\\x9a\\x01\\xf5\\xc5\\x8a\\x6c\\xf4\\xf3\\xf0\\x20\\xa9\\xef\\x11\\xec\\x22\\xce\\x2e\\xea\\x40\\xb2\\x98\\xbd\\x5c\\xb5\\xa5\\x25\\x0a\\x06\\x7f\\x58\\x3c\\xef\\x5d\\x98\\xc0\\x4f\\xab\\xf6\\x87\\x59\\xb5\\x0f\\x8a\\xcb\\xbd\\x8b\\x44\\xf8\\x69\\xd9\\x6c\\xd9\\xb8\\xe4\\xf7\\x8d\\xd1\\xfd\\x7e\\x17\\xfc\\xe6\\x5a\\xbe\\x0b\\x80\\xf8\\x69\\x2d\\x6d\\x2d\\xe9\\x91\\xc7\\xfc\\xe3\\x89\\x45\\x7c\\xfb\\x6d\\x14\\xde\\x4b\\x70\\x94\\x2a\\xdf\\x6f\\x1c\\xe1\\x63\\x84\\x11\\xce\\x92\\x52\\xb4\\xd9\\xa7\\x9e\\x2f\\x2c\\xe9\\x28\\xbd\\x9b\\xaf\\xae\\x7f\\xc8\\xb9\\x1f\\xb1\\x35\\xbe\\x20\\x29\\xae\\x7f\\x89\\xb5\\x3a\\xe7\\x7f\\xd2\\x83\\x5e\\xde\\x5b\\xeb\\xbd\\xfa\\xe0\\x5f\\x07\\xd3\\xc2\\xfb\\x4a\\xef\\xd7\\x1f\\xfe\\xf2\\xf4\\x9e\\x52\\xee\\xe6\\x98\\xce\\xaa\\xd1\\x3a\\x8c\\x2c\\xe5\\x47\\x18\\x06\\x7c\\x8f\\xf9\\x2c\\x16\\x79\\x90\\xf0\\x63\\x3e\\x4d\\x5f\\xa4\\xab\\x0a\\xc9\\x68\\x73\\x48\\x89\\x83\\x19\\xed\\x23\\x83\\xb4\\xb6\\xf2\\x04\\xa1\\x24\\xd1\\x44\\xcf\\xfa\\x90\\x69\\xe7\\x6c\\x3d\\x20\\x62\\x31\\xc8\\x42\\xa4\\x45\\x29\\x06\\x02\\xf6\\x6c\\x0d\\x23\\x79\\x57\\x9f\\x0b\\xb1\\x88\\x76\\x96\\x71\\xb6\\xb3\\xe5\\xe2\\x16\\x55\\xe3\\xc6\\x46\\x5b\\xac\\xa0\\x2e\\xdd\\xd4\\x93\\xc8\\x02\\x89\\x26\\x08\\x27\\x04\\xeb\\x7f\\xdc\\x42\\x95\\x8d\\x73\\x0d\\x05\\x15\\x1c\\xea\\x05\\x76\\x59\\xee\\x64\\x33\\x66\\x16\\xec\\xe7\\x4a\\x1b\\x80\\x12\\x45\\x7c\\xe3\\x66\\xd9\\x07\\xf4\\x4a\\x0f\\x94\\x87\\x7e\\x73\\xf9\\x7b\\x82\\x31\\x19\\x3c\\xec\\x64\\x1d\\x65\\xf7\\x1d\\xc5\\xa3\\x1d\\x0e\\x10\\x23\\x02\\x6b\\x87\\xad\\x54\\x02\\xf9\\x44\\xf2\\x28\\xa1\\x65\\x58\\x22\\x81\\x9d\\x8d\\x92\\x78\\x1f\\x5d\\x2a\\x8b\\x57\\x0c\\x0d\\x11\\x54\\xb6\\x97\\x90\\x8d\\x6b\\xbe\\x76\\xa3\\xae\\x50\\x0f\\xcc\\x7b\\xde\\x25\\x74\\x13\\x03\\x20\\xc6\\x59\\xc5\\xe5\\xda\\xbf\\xdf\\xe8\\x47\\x6a\\x36\\xac\\x5b\\xe6\\x30\\x3a\\x7a\\xba\\x83\\x15\\xad\\x93\\xf5\\x3c\\xb4\\x61\\x60\\x6f\\x58\\x14\\x03\\x21\\x0f\\xa3\\x8a\\x6c\\x86\\x45\\x41\\xeb\\x95\\x14\\xa2\\x37\\xda\\x33\\x98\\x8f\\xb5\\x2e\\xf4\\x5e\\x56\\xea\\x2a\\x67\\x67\\x5d\\xe7\\xdb\\xe1\\x81\\x2f\\xe8\\x64\\x20\\x95\\x90\\x0e\\xb4\\xb5\\x17\\x3a\\xe2\\xe8\\x7b\\x49\\x01\\x56\\x54\\x75\\x6a\\x16\\x31\\xbe\\xc8\\xc5\\xc8\\x82\\xe6\\x88\\x13\\xae\\xb6\\x73\\xd2\\x41\\xba\\xb0\\x38\\x61\\x37\\x75\\xb6\\xc0\\x6b\\xba\\x44\\xe6\\x7a\\x14\\x74\\x66\\xb4\\x5d\\x1e\\x86\\xb5\\x62\\x30\\x12\\xc1\\x2c\\x3e\\xf3\\x2a\\xa7\\xf8\\x0c\\x69\\x9a\\xc7\\xdd\\x26\\x62\\x4a\\xb9\\x3b\\x4f\\x50\\xb4\\xb8\\x89\\xbe\\xd7\\x40\\x4f\\x95\\x02\\xda\\x7c\\xa1\\x07\\x7b\\x85\\x25\\xb4\\x7e\\x77\\x6e\\x2e\\xfc\\xf8\\x93\\x73\\x1f\\x5e\\xb6\\xfb\\x05\\x5f\\xe9\\x7a\\xd2\\x83\\xfe\\xff\\x0a\\x12\\x0d\\x23\\x3b\\xe4\\xc4\\x73\\x8c\\xd3\\xf2\\xac\\xeb\\xc4\\x4f\\x6a\\x0b\\x71\\xbf\\x0f\\x74\\x7e\\x68\\x60\\xa3\\x99\\x76\\x7c\\x8c\\x49\\x70\\x60\\xf2\\x4e\\x58\\x67\\x64\\xb2\\xde\\xbc\\x76\\xb1\\x98\\x2c\\xc7\\x3a\\x73\\x2b\\x64\\xd8\\xfa\\x0a\\x15\\x1b\\xd7\\x8d\\x34\\xbd\\xa3\\x06\\x4a\\x19\\x05\\x01\\xf8\\x8a\\x94\\xd5\\x79\\x84\\x87\\x9e\\x47\\xf4\\x6b\\x6c\\xd9\\xfa\\x70\\x46\\xa0\\xf1\\x3c\\xb0\\x6d\\xb6\\xb2\\xd5\\xca\\x57\\x4f\\x4b\\x44\\x96\\xb0\\x53\\x4a\\x66\\x34\\x83\\x14\\x71\\x1a\\x9f\\xa1\\x20\\x24\\xec\\xbd\\x72\\x02\\x49\\x5f\\xd4\\xbf\\xc9\\x64\\x1e\\x85\\x2a\\xd3\\x4a\\x08\\xee\\xce\\x32\\x00\\x6b\\x11\\x64\\x31\\x1b\\xb4\\xde\\xe7\\x2b\\x6a\\xcd\\x5f\\xaa\\x7a\\x00\\xf6\\x83\\x3c\\xf5\\x2f\\xe4\\xa7\\xe5\\xfa\\x43\\x2f\\xd7\\x87\\xb8\\xe8\\x5f\\xe4\\x3f\\x82\\xf5\\x7a\\x5f\\x5f\\x3a\\xbc\\xef\\x52\\x7f\\x4f\\x2b\\x7d\\x73\\x11\\xcb\\x8f\\x7f\\x11\\x51\\x91\\xf8\\xdd\\x00\\x2b\\xe1\\x8f\\x5e\\x29\\xde\\xde\\x9f\\xe1\\xc7\\xb5\\x41\\xeb\\x1f\\xc1\\x06\\xfd\\x80\\xe6\\xa1\\xe1\\x7b\\xf3\\x35\\xbf\\x3f\\x01\\x17\\xde\\x4b\\x97\\x7d\\x94\\x6e\\xa7\\xdf\\xb7\\x9f\\x7b\\x96\\xd2\\x72\\x0b\\xa5\\x8c\\x83\\x93\\x5c\\x5a\\xe3\\x23\\xea\\x85\\xba\\xf7\\x0f\\xf7\\xd2\\x75\\xe7\\xb7\\xb5\\x99\\x56\\x87\\x24\\x49\\x96\\x66\\xcd\\x9e\\x32\\xcf\\x23\\x0c\\xaf\\x96\\xf1\\x26\\x71\\x48\\xdd\\x59\\x8d\\x30\\x1c\\xc4\\x69\\xe5\\xcf\\xc3\\xdf\\x70\\x81\\xeb\\xe1\\x8f\\x70\\xb7\\xde\\xf5\\xf9\\x9a\\xb7\\x07\\xac\\x64\\x5c\\x7b\\x44\\x94\\x64\\x5d\\xc6\\xfd\\x07\\xef\\x16\\xdf\\xba\\x7e\\x8d\\x28\\xe4\\x6e\\x3d\\x1b\\x47\\xae\\xd6\\xeb\\x0d\\x7f\\x03\\x5d\\x7d\\x9a\\x78\\x2c\\x37\\x4b\\xed\\x51\\x5a\\xa5\\xe2\\xc5\\xbb\\xb6\\x58\\x5b\\x00\\x6b\\x66\\xa4\\xe3\\x1d\\x3a\\xd9\\x0e\\xf0\\x58\\x83\\xac\\x6b\\x90\\x77\\x27\\xe9\\xb8\\xf5\\xb1\\x02\\xfa\\x25\\x79\\x03\\x7e\\x2c\\x01\\x9d\\x3d\\x3a\\x79\\x89\\x04\\xef\\x0b\\x9a\\xeb\\xed\\xa5\\xe8\\x57\\xc1\\xf3\\x1e\\x22\\x47\\x0a\\x7a\\xde\\x59\\xe8\\x01\\x4c\\xbe\\xe5\\xae\\x6c\\x55\\xcd\\x8d\\xe2\\xec\\xf0\\x75\\x8b\\x2d\\x99\\xde\\xa8\\x02\\x78\\xc1\\x18\\x4b\\xe0\\x58\\x42\\x9c\\xc9\\x0a\\xfc\\xd1\\x59\\xeb\\x5b\\x4b\\xa5\\x3d\\xf6\\x64\\x24\\xe6\\x35\\xf0\\xd8\\xd0\\xce\\x0c\\x15\\x74\\xaa\\x28\\x07\\x6f\\x9d\\x8d\\x9b\\xb2\\x96\\x80\\x81\\x25\\x83\\x7e\\x8c\\x33\\x11\\x0f\\x9a\\xad\\x37\\x4d\\x9c\\xec\\xb5\\x73\\x9d\\xa6\\x49\\x82\\xc6\\x1b\\x97\\x14\\x72\\x65\\x34\\x46\\x6b\\x40\\x1d\\xb5\\xf7\\x33\\x42\\x55\\x22\\x55\\x46\\x67\\x84\\x12\\xbc\\x3f\\xd3\\xa2\\x4f\\x8f\\x68\\x3d\\x7a\\x53\\xa4\\x0c\\x31\\xd4\\x4f\\xbd\\xcd\\xb0\\xfc\\xc5\\x78\\xd4\\xf1\\x48\\x7d\\xe8\\x94\\x83\\x94\\x7e\\x94\\xd1\\x2f\\xea\\xbc\\xc7\\x32\\xac\\x5e\\x9b\\x92\\x21\\x50\\xac\\xcd\\xab\\xad\\x30\\x76\\xd1\\x8a\\x70\\x78\\x7a\\x7f\\xd6\\x62\\x39\\x12\\x38\\xed\\xf0\\xd9\\xa9\\x06\\x78\\xec\\xa5\\x89\\xc5\\x18\\xba\\xef\\xd7\\x6a\\x9d\\x4a\\xcb\\xea\\x3d\\x56\\x11\\x31\\xe0\\x1d\\xfc\\xad\\xd6\\x1d\\x0d\\xe5\\x57\\xc2\\x87\\x90\\xf5\\xc5\\x10\\x32\\x04\\x57\\x29\\x1e\\x1e\\xa0\\x69\\x06\\x42\\xe4\\xea\\x5d\\x94\\xe2\\xb8\\x76\\x22\\xb0\\xb4\\xb7\\xce\\x50\\x4b\\x13\\x13\\x1d\\x88\\xf3\\xc4\\xe4\\x07\\xea\\xf2\\x10\\x3e\\xc8\\x29\\x7b\\xf9\\x4f\\x7d\\xf2\\x3e\\xc8\\x45\\xfa\\xd5\\x3f\\xf5\\xd9\\x7b\\x6f\\x07\\xeb\\xe6\\x94\\x7e\\xfe\\x4f\\x7d\\x4a\\x7f\\x6a\\x45\\xff\\xbd\\x59\\x67\\x2b\\xab\\x66\\xc1\\x58\\x76\\xc6\\x12\\x42\\xef\\xcb\\x86\\x36\\x98\\xd5\\xd8\\x99\\x64\\x76\\xc3\\xc0\\xc2\\xa9\\x24\\xf4\\x76\\xdc\\x41\\xc3\\x50\\x82\\x38\\xfe\\xd1\\x48\\x30\\x22\\xf1\\xce\\x6a\\xa5\\x65\\x0e\\xc3\\xfa\\xfb\\x08\\x4d\\xeb\\x76\\xde\\xa7\\xf4\\x30\\xd2\\x16\\xa5\\x8c\\x30\\x72\\xbe\\x70\\xa7\\xdd\\x6b\\x48\\xd9\\x89\\x9f\\x62\\x59\\xfd\\xb4\\xcf\\x0b\\x36\\x7a\\xa8\\x8d\\xd5\\x2b\\x2d\\x23\\x6f\\x83\\x03\\x17\\xde\\x69\\x84\\x42\\x66\\xc1\\x50\\x72\\xf5\\x4a\\xa9\\xa9\\x37\\x0b\\xa8\\xe2\\x64\\x42\\x50\\xfe\\xc2\\x34\\x76\\xab\\x28\\x4d\\x62\\x6d\\x5b\\x18\\xfb\\x7d\\xa2\\x8f\\x0a\\xb8\\x3a\\xb6\\x08\\x9e\\x96\\xaa\\x9b\\x5f\\xcd\\x34\\x28\\x79\\x0c\\xad\\x4f\\x75\\x17\\x62\\x4f\\x0e\\xaf\\x32\\x74\\xa5\\x75\\x47\\xc7\\x00\\x77\\x74\\x32\\x46\\x9a\\x5e\\x0c\\xc1\\xf8\\x41\\x22\\xf6\\x71\\xf9\\x73\\x94\\xcc\\x07\\x35\\xce\\x97\\x93\\x83\\x05\\xa5\\xcf\\x34\\x66\\x74\\x1c\\x1d\\xc6\\x72\\xf7\\x46\\xfd\\x73\\x3d\\x62\\xce\\x63\\xcf\\x25\\x14\\x74\\x6e\\x0f\\xcd\\xe8\\xda\\x3b\\x8c\\x46\\x47\\x84\\x1a\\x77\\xfe\\x74\\x58\\xf5\\x48\\x13\\xd5\\xf9\\x66\\x79\\x2f\\x52\\x26\\x67\\x24\\x45\\xe7\\x52\\xc3\\xe5\\x59\\x6f\\xab\\xee\\x4d\\xab\\x8d\\x2b\\x94\\xe1\\xa2\\x4f\\x6f\\x57\\x2d\\xa7\\x39\\x5d\\x43\\x75\\x08\\xb6\\xce\\x61\\x69\\xde\\x7e\\x06\\xe1\\x0a\\xb5\\x82\\x8f\\x98\\xd1\\x7e\\x51\\xd4\\x07\\x90\\x14\\x72\\x1f\\xc8\\x0b\\xf5\\x81\\xc6\\xa5\\xc6\\x14\\x80\\xae\\xe2\\x89\\xad\\xd5\\xcc\\xca\\x3c\\x59\\x90\\x63\\x47\\x73\\x26\\x23\\xed\\xaa\\x5d\\x0f\\x20\\x2c\\xe4\\x91\\x17\\x09\\x0b\\xe0\\xac\\x3b\\x4a\\xb0\\x1d\\x00\\x6e\\x70\\x85\\xe2\\x3b\\xc6\\x81\\x8d\\x90\\x68\\x63\\xb5\\x07\\xf2\\xfc\\x3e\\x3e\\x44\\xdf\\x5d\\x80\\xa1\\x39\\x9f\\xc7\\xcc\\x3a\\x85\\xe1\\x88\\x1a\\xbe\\xd1\\xd9\\x05\\xf2\\x73\\x4e\\xff\\x17\\x3f\\x1d\\xb4\\xdf\\xc7\\x41\\xfb\\x81\\xab\\x8e\\xf0\\x7b\\xd4\\x1d\\xdf\\xb3\\xea\\xa0\\xb2\\x92\\x51\\x35\\x54\\xb1\\x7e\\x6d\\x76\\xf6\\x42\\x1e\\x69\\x72\\xb5\\x6e\\xf8\\xc5\\x70\\xbc\\x15\\x05\\x1c\\xe8\\x13\\x25\\xe5\\x10\\xba\\x14\\x5e\\xa4\\xf1\\xe8\\x68\\x81\\x6e\\x17\\x75\\xe8\\x9f\\xc6\\x25\\xe2\\x4a\\x6a\\xf7\\x26\\xad\\xe8\\x76\\x41\\xe3\\x80\\x68\\x69\\xde\\x55\\xd8\\x1a\\x9a\\x5e\\x1b\\x44\\x43\\x12\\xee\\xb1\\x1b\\x68\\xdd\\xe0\\xf6\\xe8\\x13\\xc7\\x81\\x54\\x5a\\x36\\x0e\\x6c\\x7d\\x23\\x2c\\xf2\\x38\\x8c\\x92\\x92\\x17\\xab\\x56\\x64\\xb6\\x78\\x83\\x8a\\x30\\x40\\xa4\\x3c\\x72\\xaa\\x82\\x63\\x47\\xe5\\x40\\xe5\\x60\\xd4\\x21\\x5d\\x8e\\xda\\x39\\xec\\x98\\x22\\x34\\xdd\\x0d\\x23\\x79\\xd4\\x07\\xcd\\x22\\x56\\x14\\xb3\\x2d\\x50\\xb4\\x4d\\x7d\\x2b\\xd7\\x25\\x71\\x92\\x35\\x1c\\x48\\x7e\\x2e\\x5e\\x48\\x45\\xce\\x89\\xb6\\x44\\x36\\x89\\xef\\x2e\\x96\\x34\\xbd\\x2d\\x9e\\x35\\x02\\xed\\x9e\\xfd\\x65\\xb5\\xdb\\x1e\\x6f\\x77\\xd4\\x26\\x0c\\xe7\\x53\\xce\\xde\\x50\\x6e\\x0a\\x5e\\x76\\xa7\\x1a\\xa8\\x06\\xeb\\x00\\x77\\xb5\\x7a\\xac\\x75\\x30\\xa0\\xe6\\xed\\xae\\xec\\x0d\\x0e\\xab\\x1e\\x58\\xae\\x88\\x32\\x42\\xa7\\x58\\x7b\\x39\\x70\\x32\\x4c\\xef\\xa6\\x51\\xd1\\xf1\\xad\\x5e\\x62\\x96\\xb4\\x93\\x35\\xec\\x30\\xbf\\x97\\x87\\x51\\x20\\x00\\x4f\\x6d\\x1d\\x3e\\x63\\x16\\xaf\\xa4\\xc0\\xf2\\x59\\x9f\\x95\\x11\\x9a\\x07\\x7d\\x90\\xf8\\xcd\\x56\\x80\\x80\\x2e\\xc6\\x65\\xb5\\xec\\xa7\\x3c\\xf6\\xa8\\x4a\\x15\\x55\\x0e\\x16\\x5c\\x00\\x02\\x9a\\x56\\x21\\xc2\\x42\\xe5\\x57\\x0a\\x6d\\x19\\x9e\\xfd\\x94\\xfe\\x16\\x3d\\xc9\\x02\\x08\\x3b\\xe6\\xc1\\x49\\x25\\xbc\\x9f\\xde\\x6a\\x91\\x67\\x7d\\xc7\\x8b\\xf5\\x50\\xa3\\x86\\xda\\x05\\xb4\\x67\\x44\\x63\\xb6\\xb3\\x2b\\xa1\\x49\\xcf\\x11\\x38\\xe7\\x87\\x7b\\x95\\x9e\\xd9\\x99\\x0c\\x75\\xcf\\x00\\xcf\\xde\\x26\\xfa\\xd0\\x74\\x34\\xa7\\x03\\xf3\\x03\\xf1\\x24\\xb1\\x7a\\x15\\x09\\xd6\\xee\\xc4\\x8e\\xe9\\x9d\\xb1\\xb6\\xd8\\xfe\\xaa\\x2e\\xfb\\x02\\x79\\x6f\\x5e\\xdc\\x67\\x9a\\xb9\\x97\\x60\\x15\\x08\\x69\\x5a\\x20\\x61\\x57\\xab\\x9d\\x31\\xdf\\x87\\xb5\\x15\\xc4\\x5c\\x51\\x10\\x03\\xe9\\x51\\x3d\\xfb\\xa1\\x8e\\x55\\xa9\\x90\\xc9\\x7b\\x78\\x7b\\x87\\x9d\\x3e\\xce\\x60\\x92\\xa1\\xdb\\x1f\\xee\\x4b\\xcf\\xa1\\xa6\\x0a\\x9e\\x6e\\x94\\x81\\x09\\x7a\\x0d\\x53\\xae\\x33\\xf6\\x06\\xe4\\x08\\xba\\x1d\\xda\\x6c\\xbc\\xf1\\x34\\xe0\\x23\\x6e\\xef\\xed\\xd6\\x3f\\x12\\xe1\\x0c\\xe9\\x36\\xfb\\x61\\x33\\x02\\xe9\\x0d\\x3f\\x3a\\xd6\\x7b\\x3e\\xbb\\x15\\x7d\\x74\\xc7\\x97\\x4f\\x7a\\xab\\xf7\\xc8\\x77\\xfd\\x71\\xa4\\xbb\\xc2\\x7b\\x80\\x40\\x38\\xa5\\xf4\\xe9\\x8b\\x70\\xf9\\xfa\\x37\\x5f\\x3e\\xc4\\x97\\xaf\\x8e\\xf8\\xdb\\xcf\\x5e\\x74\\x29\\xcf\\xdc\\x4e\\x6f\\xdf\\x4e\\xb5\\xd1\\x33\\xf7\\xf3\\x77\\x7b\\xbc\\x7c\\xc7\\xc7\\xe7\\xb7\\xef\\x2f\\xa5\\x3d\\x73\\x7b\\x79\\xfb\\xf6\\x4c\\xcf\\xdd\\x5e\\xdf\\xbe\\x9d\\x5b\\x7f\\xe6\\xf6\\xf6\\xdd\\x6e\\xef\\xef\\xdc\\x9e\\x9e\\xbb\\x7d\\xbc\\x7d\\xbb\\x48\\x7e\\xe6\\xf6\\x97\\x6f\\xdf\\x3e\\xf8\\xf6\\xdd\\x74\\xf6\\xa3\\x10\\x0a\\xa5\\xca\\x41\\xbd\\x5d\\x5a\\x45\\x4b\\x90\\x76\\x89\\xad\\xde\\xc6\\x91\\x71\\x22\\xfa\\x90\\x2f\\xf3\\x87\\x7c\\xf9\\xdd\\xed\\xc2\\x3d\\xbd\\xfb\\x3c\\x4a\\x9c\\xfd\\x81\\x7a\\xf9\\xdc\\x13\\xdf\\xd9\\x50\\x2c\\x29\\xbf\\xfb\\x44\\x4e\\x79\\x0d\\x51\\x2f\\x9f\\x7b\\xe2\\xc9\\xb9\\x2a\\x35\\x0c\\x4e\\x06\\xf7\\xab\\x49\\x05\\x1b\\x80\\xfc\\x1c\\x98\\xcd\\x14\\x41\\xfa\\xc6\\x2a\\x00\\x21\\x8a\\xcb\\xe2\\xb7\\x02\\x05\\xb5\\x5d\\xa9\\x7f\\xec\\x05\\xb4\\xe9\\x9a\\x9e\\x22\\x0a\\xc3\\xc5\\x1a\\x70\\x90\\x6e\\xea\\xab\\x75\\x6b\\x25\\xc4\\xd6\\xac\\xd6\\x92\\x07\\xc9\\x7b\\xe2\\xb9\\x0b\\x57\\xaa\\x6b\\xa3\\x72\\x3a\\xd4\\xa6\\x20\\xcc\\xce\\x89\\x44\\x7b\\x84\\x12\\x71\\xbb\\xc7\\x78\\x4e\\xd5\\x1e\\x46\\x04\\xb1\\x78\\xb1\\x27\\xe2\\x02\\xcf\\xcd\\xc3\\x4a\\x34\\x48\\x92\\xd0\\xa5\\xaa\\x2d\\xcf\\xcd\\x4c\\x4a\\xbc\\x5a\\xb6\\xab\\xc9\\x3d\\x94\\xa4\\x4a\\xc9\\x5f\\x0e\\x35\\xa9\\x46\\x15\\x08\\x01\\x98\\x3c\\xc9\\xc6\\x80\\xa4\\x86\\xdc\\xf0\\x67\\x34\\xdb\\xb3\\xee\\x82\\xa5\\x4e\\x21\\xaf\\x94\\x45\\xc6\\x09\\xd2\\xde\\x6c\\x1d\\x53\\x87\\xa8\\x48\\xc8\\x66\\x8f\\x46\\x19\\xd3\\x0b\\x38\\x61\\xa9\\xe7\\x6b\\x17\\x65\\x75\\x33\\xdd\\x28\\xed\\x66\\x60\\x5b\\xf1\\x1e\\xd6\\xeb\\xb9\\x57\\x7d\\x79\\xbe\\xaa\\x11\\xf2\\xde\\x7a\\xd7\\x3b\\x7f\\x5b\\xeb\\x44\\xff\\x2d\\xdf\\xb7\\xfa\\x07\\xc5\\x6e\\xbf\\xf1\\xce\\xb4\\xde\\x78\\x99\\x00\\xbe\\x98\\x79\\xc2\\xc9\\x78\\xf7\\x9d\\xab\\xbf\\x33\\xb9\\x07\\x6d\\x26\\x29\\x99\\xab\\xfd\\x3b\\xde\\xf7\\xf3\\x47\\x67\\xf8\\x5b\\x6e\\xf1\\xee\\x5b\\xdc\\x14\\x62\\x39\\x53\\xa5\\xbf\\x73\\x9b\\x9f\\xfa\\xdb\\xb4\\xf3\\x1b\\x5b\\xbd\\xad\\x8d\\x4e\\xb7\\xb6\\xf9\\x35\\x12\\xb0\\x7a\\x04\\xbf\\xd7\\x36\\x07\\x15\\xf5\\x60\\x34\\xf2\\xfa\\x7e\\x5e\\xf5\\x87\\x72\\xaa\\xcf\\x52\\x8a\\x94\\xfe\\x00\\xa7\\xfa\\xac\\x80\\x7f\\x74\\xae\\x1f\\x9d\\xea\\xe7\\x77\\xf8\\xa3\\x53\\x6d\\x3b\\x9c\\xdf\\xda\\xe1\\xf7\\x85\\xf9\\xdb\\xbf\\x44\\xf8\\x7d\\xc9\\xa6\\x0f\\x7c\\x8b\\x67\\x16\\xeb\\xf5\\xa3\\xc5\\xfa\\x03\\xca\\xa5\\x37\\x57\\x8d\\x6c\\xcd\\x3e\\x9a\\x5c\\xc2\\xaa\\x7d\\xbb\\xb7\\x09\\x3f\\x6a\\x31\\xcb\\x67\\xa3\\x25\\x92\\x50\\x01\\x7e\\xc8\\xc9\\xdc\\x16\\x04\\x83\\xe0\\xdb\\x55\\x36\\xca\\x8e\\xcc\\xd3\\x92\\x78\\x28\\x47\\x20\\x27\\x6e\\xaf\\xe8\\xda\\x3f\\x73\\xd6\\x63\\x0f\\x96\\x4c\\x0b\\x23\\xd9\\x95\\x15\\x0f\\x58\\x9f\\x30\\xbf\\x33\\x9e\\x5f\\x8d\\xd7\\xc7\\xc5\\xf5\\x0b\\x86\\x59\\xf0\\xc6\\x62\\x36\\x8e\\xe7\\xc6\\x5f\\xaf\\x4d\\xcf\\xac\\x4f\\x3e\\x5c\\xa9\\xc5\\x7e\\xa9\\x4e\\x64\\x5e\\x61\\x56\\xab\\x40\\xd4\\x33\\x41\\xa7\\xfb\\x0a\\xef\\x9a\\x1d\\xcd\\x13\\x73\\x9e\\x90\\x73\\x79\\x45\\xbe\\xbc\\x0d\\x7c\\x3a\\x9b\\xc0\\x9b\\x2f\\x1e\\xed\\xcb\\x4b\\xda\\xe1\\xa9\\x1e\\x43\\xd3\\x4f\\xf1\\xab\\x67\\x90\\xa2\\x58\\x99\\x47\\xf9\\xc8\\x03\\x0c\\x1f\\x7b\\x84\\xb5\\xf7\\xa7\\x46\\x08\\x84\\xd1\\x9b\\x63\\xb4\\x76\\x6d\\xf3\\x1c\\x20\\x14\\x89\\x0d\\xf1\\xae\\x3c\\x33\\x8b\\x77\\xd7\\x66\\xfa\\xd5\\x74\\xc7\\x1a\\xe7\\x8c\\xeb\\xa1\\xd7\\x31\\xfa\\x0f\\xbf\\x39\\xca\\x67\\x76\\xc2\\x17\\xdf\\xc9\\x97\\x91\\x71\\x86\\x0d\\x52\\xc8\\xa5\\x1d\\x75\\x6c\\x6a\\x4d\\x0b\\xd7\\x8d\\xa4\\xac\\x1e\\x09\\xc0\\x00\\x71\\xde\\x58\\x77\\x31\\x57\\xde\\xf4\\xef\\xf8\\xf0\\x99\\xa1\\xc8\\xcb\\xf3\\xd9\\x7a\\xf6\\x1b\\xbe\\x8d\\x2f\\xa3\\x0b\\x03\\x67\\xfc\\x82\\xfe\\x80\\xfe\\x62\\x14\\xae\\x47\\xac\\x63\\x8b\\x92\\x51\\xda\\xfa\\xdc\\xa3\\xcb\\x3b\\x6f\\xf9\\xac\\xb7\\xf9\\x72\\x59\\x51\\x32\\x42\\xa6\\xb4\\x65\\x09\\xd4\\xf3\\x56\\x4b\\xc8\\x47\\x76\\x89\\xe5\\x0d\\x64\\x10\\xcf\\x64\\x75\\x66\\x86\\xdd\\x56\\x2f\\xa3\\xee\\x40\\x91\\x09\\x92\\xf4\\x01\\x75\\x4e\\xe8\\x38\\x6c\\x54\\xb7\\x94\\x29\\x34\\x99\\x64\\xf1\\x4a\\xd9\\x69\\xa4\\x90\\x82\\x90\\x45\\xd5\\x36\\xb0\\xd7\\xd0\\x18\\xa0\\x62\\xe1\\x1c\\xdc\\x08\\x20\\x5f\\xfd\\x92\\xbc\\xc6\\x48\\xfa\\x44\\x1f\\xe4\\x40\\x65\\x8f\\xdd\\x02\\x99\\x2a\\xc6\\xdc\\x5c\\x48\\xec\\xcd\\x7c\\x2f\\xb9\\xb3\\xe3\\xb7\\x7a\\xbd\\xc4\\x9c\\x79\\xb7\\x7c\\x90\\x13\\x2d\\x8b\\xcc\\x68\\x95\\x66\\x88\\xd7\\x5f\\x32\\xd5\\xe0\\x50\\xac\\x9e\\x2f\\x51\\x38\\xef\\x3c\\xac\\xa8\\x6b\\xe8\\xbf\\xbd\\x4d\\x6a\\x40\\x81\\xed\\x15\\x45\\x48\\x94\\x03\\x0f\\x0b\\x52\\xd3\\x36\\xd4\\xd4\\xaa\\x7d\\x8f\\xb8\\x05\\xd9\\x3e\\x43\\x0e\\xb4\\x19\\xa9\\x99\\x91\\x9f\\xc1\\x74\\x91\\xbc\\x24\\x0c\\x9b\\x96\\x32\\x87\\xae\\xb7\\x24\\x2c\\xb0\\x87\\x5b\\xa8\\x97\\x4b\\x24\\xbe\\x0d\\xfa\\x61\\xba\\x0a\\xe2\\x16\\x88\\x1a\\x1d\\x24\\x7c\\xc9\\x85\\x8f\\xa8\\x17\\x91\\x0a\\x1d\\xb1\\x50\\xbd\\x44\\xca\\xfd\\xb0\\x8b\\x22\\x0f\\xf7\\x85\\x6a\\xa8\\xa5\\x1c\\x35\\xf7\\x0b\\xd1\\xd8\\xd0\\xcd\\x82\\x6b\\xd9\\x10\\xa9\\xaa\\xe5\\x42\\xc4\\x47\\xd4\\x4f\\x23\\xe5\\x72\\x48\\x91\\xcd\\x22\\xd2\\x99\\x2f\\xb1\\xd2\\x06\\xc9\\x20\\xe5\\x88\\x92\\xf1\\xec\\xdb\\xf9\\x14\\x2e\\x00\\x82\\xbc\\xe9\\xfe\\x97\\x72\\x36\\x64\\x3f\\x46\\x29\\x97\\x51\\xca\\x11\\xf5\\x42\\xff\\xcf\\x1f\\xf5\\xc9\\x17\\x5f\\x7f\\x35\\xf5\\xdf\\x57\\xaf\\xbf\\xf8\\xe6\\x17\\x3f\\xff\\xe4\\x9b\\xe3\\xd7\\xbf\\x08\\xff\\x5f\\x00\\x00\\x00\\xff\\xff\\x68\\xff\\x0b\\x82\\xb9\\x18\\x01\\x00\")\n\nfunc fontsInconsolataBoldWebfontSvgBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataBoldWebfontSvg,\n\t\t\"fonts/inconsolata-bold-webfont.svg\",\n\t)\n}\n\nfunc fontsInconsolataBoldWebfontSvg() (*asset, error) {\n\tbytes, err := fontsInconsolataBoldWebfontSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-bold-webfont.svg\", size: 71865, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataBoldWebfontTtf = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x8c\\xbc\\x09\\x7c\\x5c\\xc5\\x95\\x2f\\x7c\\xea\\x2e\\xbd\\x6f\\xb7\\xf7\\x7d\\x95\\xd4\\x92\\xae\\x5a\\xdd\\xea\\x56\\xab\\x75\\xb5\\x4b\\xd6\\x62\\x59\\xb2\\x2d\\xc9\\xb2\\x2d\\x2f\\x18\\xef\\x36\\xde\\x8d\\x01\\xdb\\x61\\x0c\\x61\\x35\\x36\\x21\\x24\\x6c\\x21\\x0c\\x43\\x08\\x43\\x1c\\x86\\x21\\xa4\\x6e\\xab\\x31\\x4b\\x3c\\x40\\x58\\x1e\\xc3\\x23\\x4c\\x3e\\x1e\\x83\\x19\\x86\\x30\\x26\\x93\\xc7\\x84\\x9b\\x21\\x19\\x5e\\x5e\\x26\\x61\\x91\\x5a\\xdf\\xaf\\xea\\xb6\\xe4\\x25\\xc9\\xbc\\xb1\\x7f\\xdd\\x5d\\xf7\\xf6\\x55\\x57\\xd5\\x59\\xff\\xe7\\xd4\\xa9\\x02\\x04\\x00\\x02\\x02\\xe0\\xc0\\x36\\x38\\x38\\xb9\\x74\\xfb\\xcb\\x57\\xce\\x02\\xa0\\x20\\x00\\x04\\x87\\xfa\\x07\\x06\\x91\\x03\\x38\\x00\\xd4\\x0a\\x00\\xd1\\xe5\\x2b\\xd2\\xd9\\x7d\\xab\\x3d\\x4b\\x00\\xd0\\x14\\x00\\x6c\\xdc\\xb2\\x77\\xd3\\x01\\x4e\\xe8\\x05\\x00\\xf4\\x0c\\x00\\xfa\\xe7\\x2d\\xd7\\x5c\\x15\\x15\\x5e\\x31\\xfe\\x6f\\x00\\xf6\\x1e\\x00\\xc8\\x6e\\x3f\\xb0\\x63\\xef\\x8a\\x52\\xfa\\xfb\\x00\\xec\\xdf\\x03\\x30\\xdb\\x76\\x6c\\x3a\\x74\\x00\\x00\\x6c\\x00\\x9a\\x0c\\x00\\xe8\\x76\\xec\\x39\\xba\\xfd\\xe1\\x1f\\xbc\\xfe\\x9f\\x00\\x9a\\x56\\x80\\x53\\xff\\xb4\\x73\\xdb\\xa6\\xad\\x9a\\xe2\\x4d\\xdf\\x04\\xf8\\x81\\x0d\\x00\\x5a\\x76\\xee\\xdc\\xb6\\xc9\\xba\\x49\\x17\\x00\\xf8\\xc1\\x62\\x00\\xa8\\xda\\xb9\\xf7\\xaa\\x23\\xc7\\xbf\\xb3\\x76\\x15\\xc0\\x0f\\xf6\\x00\\xb0\\xf7\\xef\\xd9\\xbf\\x65\\xd3\\x3f\\xbf\\x52\\x7c\\x09\\x40\\x26\\x63\\xfc\\x87\\xbd\\x9b\\x8e\\x1c\\x60\\x58\\xf4\\x32\\x40\\xf1\\x1f\\xc9\\x78\\xf7\\x6d\\xda\\xbb\\xed\\x9c\\xf3\\xdf\\x5b\\x01\\x8a\\xbf\\x03\\xd0\\x3d\\x74\\x60\\xff\\xa1\\xab\\x1e\\x6b\\x1e\\xff\\x3d\\xc0\\x8f\\xee\\x01\\x60\\xfe\\xee\\xc0\\x95\\xdb\\x0e\\x7c\\x26\\xd7\\xe9\\x01\\x9e\\x9f\\x04\\x80\\x5f\\x1c\\xde\\xb6\\x79\\xfb\\x27\\x4b\\x56\\xac\\x01\\x78\\x81\\xcc\\x57\\x43\\x26\\x06\\x00\\xf0\\x93\\xce\\x47\\x7e\\x4a\\x3e\\xdf\\xd0\\xe4\\xb6\\x92\\xcf\\x9f\\x5e\\xff\\xe0\\xeb\\xf4\\x1b\\x0b\\x00\\x78\\xc9\\x1d\\x60\\x00\\x01\\x82\\x8f\\x00\\x11\\x6a\\x01\\x03\\x00\\x2c\\xfb\\x1b\\xe6\\x0c\\xf0\\xc0\\xf1\\x39\\xfe\\x01\\x00\\x14\\x51\\x3f\\xd9\\x77\\x61\\x2b\\x63\\x03\\x60\\x8c\\x1a\\x3d\\x0b\\x2c\\x00\\x7c\\x15\\x20\\x0d\\x80\\x76\\x43\\xe5\\xdf\\xd8\\xf6\\x81\\xad\\x10\\x05\\x73\\xf5\\x8c\\x66\\x7b\\x79\\x3b\\x80\\xe6\\x1c\\xfa\\x01\\x00\\x38\\xc8\\x77\\xec\\x19\\x6e\\x86\\xcc\\x8c\\xf6\\xce\\x56\\x5e\\x41\\x75\\x94\\xf0\\x8f\\xc0\\xd2\\x56\\x10\\x38\\x78\\x06\\x00\\xea\\x21\\x0a\\x1c\\x18\\x00\\xc0\\x0c\\xd7\\xc1\\x1c\\x5a\\x81\\x8e\\x30\\xff\\x83\\xf9\\x59\\xd4\\x10\\x75\\x46\\xfd\\xd1\\x70\\x34\\x1e\\xad\\x89\\xa6\\xa3\\x6d\\xd1\\xcb\\xa3\\x4f\\xc4\\xe2\\xd5\\x33\\x73\\x73\\xf4\\x57\\xcc\\x10\\x85\\x87\\xd1\\x44\\xe5\\x59\\x88\\xda\\xa2\\xde\\x68\\xb0\\xf2\\xac\\x74\\xc1\\xb3\\x68\\xee\\x3f\\xe7\\x7e\\x31\\xf7\\xd2\\xdc\\x81\\xb9\\xd1\\xd9\\xb9\\xd9\\x5f\\x7d\\xf8\\xda\\x87\\x2f\\x7d\\xf8\\xc2\\x87\\xcf\\x7f\\xf8\\xa3\\x0f\\x9f\\xf9\\x10\\x7f\\xf8\\xfd\\x0f\\x6f\\xfa\\xb0\\x70\\xee\\xa5\\x7f\\x56\\x2a\\x63\\xfb\\x6f\\xfe\\x43\\x1a\\x58\\xf8\\x03\\xc4\\x54\\x28\\x79\\xd1\\x03\\x00\\x2c\\xc7\\x6b\\xb4\\x3a\\xbd\\xc1\\x68\\x32\\x5b\\xac\\x36\\xc1\\xee\\x70\\xba\\xdc\\x1e\\xaf\\xcf\\x1f\\x08\\x86\\xc2\\x91\\x68\\x2c\\x9e\\xa8\\xaa\\xae\\x49\\xd6\\xd6\\xd5\\x8b\\x0d\\xa9\\xc6\\x74\\xa6\\x29\\x9b\\x6b\\xce\\xb7\\x14\\x5a\\xa5\\xb6\\xf6\\x8e\\xce\\xae\\xee\\x9e\\xde\\xbe\\x45\\xfd\\x03\\x83\\x43\\x8b\\x87\\x97\\x8c\\x8c\\x2e\\x5d\\xb6\\x7c\\x6c\\x7c\\x62\\xc5\\xe4\\xca\\x55\\xab\\xa7\\xd6\\xac\\x5d\\xb7\\xfe\\xb2\\x0d\\x97\\x6f\\xdc\\x04\\xb7\\x1e\\x3f\\x71\\xfb\\xdd\\xf7\\x3f\\xf4\\xd7\\x8f\\x3c\\x7a\\xea\\x7b\\xdf\\xff\\x9b\\xbf\\x7d\\xfc\\x89\\x1f\\xfc\\xf0\\x49\\x2c\\x4f\\x3f\\x55\\x3a\\xfd\\xcc\\xd3\\x67\\x7e\\xf4\\x77\\xcf\\xc3\\x95\\x5b\\xb7\\x5d\\xf1\\xc1\\x91\\xef\\x1e\\xd8\\xfd\\xbf\\xaf\\xd9\\x05\\xb7\\x3d\\x00\\x87\\x00\\x76\\x1c\\xa6\\xa3\\xdb\\xf3\\x17\\xf0\\xd8\\x73\\x37\\x6c\\xd9\\x47\\xda\\x7b\\x8f\\xfd\\xcb\\xe6\\x1b\\x6f\\xf9\\xd6\\x4b\\x2f\\xbf\\x73\\xf6\\x9f\\xdf\\x7f\\xf7\\x9f\\x9e\\x85\\x1f\\xbf\\x02\\xbf\\xf8\\xf0\\xe7\\x00\\x70\\xf4\\xbd\\x9f\\xc1\\xcd\\x5f\\xbb\\xe9\\x8e\\x93\\x77\\x7e\\xe3\\x9b\\x5f\\xbf\\xf7\\x3e\\xb8\\xe7\\xc1\\xbf\\xfa\\x4b\\x78\\xf5\\x7f\\x1c\\x04\\x80\\xaf\\x54\\xa6\\xc9\\x3e\\xc6\\xcd\\xc0\\xcb\\xf0\\x1c\\x14\\xe1\\x34\\x3c\\x06\\x2f\\xc0\\x6b\\xf0\\x06\\xfc\\x1b\\xfc\\x03\\x9c\\x83\\x7f\\x83\\x4f\\xe0\\x2d\\xf8\\x27\\xb8\\x1b\\xde\\x86\\xd7\\xe1\\x19\\xf8\\x19\\xf4\\xf3\\x02\\x00\\x86\\x06\\x0c\\x8e\\x11\\x3c\\x3a\\x36\\x85\\x97\\x5c\\xb3\\x06\\x43\\xa2\\xdb\\x8b\\x35\\xe2\\x54\\xe7\\x1a\\x7a\\xef\\xd8\\x9a\\xe8\\x3f\\x62\\xe4\\x68\\xf4\\xa6\\x30\\x6a\\x88\\xfe\\x33\\x36\\x89\\x29\\xcc\\x34\\x8c\\x4c\\x4c\\x0d\\x24\\xd6\\xc4\\x52\\x98\\x6d\\xb8\\xc2\\x1b\\xc5\\x3d\\x63\\x53\\x31\\xdc\\xb3\\x26\\x85\\xb9\\x06\\xf2\\xa7\\xb1\\x44\\xec\\x2b\\x53\\x1f\\x04\\xde\\x5c\\x13\\x18\\x99\\x98\\x9a\\x9a\\x0d\\xfc\\x7a\\x4d\\x20\\x11\\xc3\\xbc\\x38\\x85\\x07\\xaf\\x59\\x43\\xbf\\x58\\xb3\\xc6\\x9b\\xc2\\x7c\\x83\\x79\\xfd\\xda\\x14\\xd6\\x34\\xc8\\x71\\x74\\xdb\\xd8\\x14\\x8e\\xde\\xb6\\x7e\\x7d\\x00\\xc3\\x9a\\x14\\xd6\\x36\\xc8\\x55\\xf4\\x56\\xcf\\xc2\\x2d\\x5d\\x83\\x5d\\x88\\x4a\\xe9\\x14\\xd6\\x37\\x44\\x8f\\x91\\x4e\\x5e\\x09\\xbc\\xb9\\x26\\x8a\\xd9\\xea\\xe1\\x44\\x14\\x73\\x35\\x4b\\x30\\x8c\\x4d\\x9d\\xdc\\x76\\x72\\x53\\x94\\x34\\x5a\\x03\\xb1\\xd8\\x9a\\xc0\\x49\\x7a\\x35\\xa1\\x5e\\x91\\x0e\\x0d\\xea\\xe8\\x6c\\x01\\x5b\\x6c\\x4d\\x0a\\x1b\\x1b\\xa2\\xff\\x8b\\x4e\\xc7\\xd4\\x10\\x4d\\x63\\xad\\xb8\\x7e\\x2a\\x1a\\x1d\\x4a\\x0c\\x6e\\xda\\x15\\x9d\\x8a\\x6e\\xdd\\xac\\xfe\\x04\\x79\\xce\\x4c\\x7a\\x8e\\x4a\\xe9\\xe8\\xc9\\xe8\\xd0\\xc9\\xc1\\x4d\\x89\\x93\\xd1\\x93\\x09\\xda\\x5d\\x82\\xfc\\x38\\xee\\x69\\x0d\\xc4\\xd6\\x04\\x12\\xe4\\x06\\xee\\xd9\\x46\\x2e\\xd6\\xa4\\xb0\\x85\\xf6\\xd4\\x79\\xd6\\x1b\\x8b\\x05\\xa2\\x67\\x4f\\x8e\\x4c\\x4c\\x45\\x4f\\x26\\x86\\xa3\\x18\\x56\\x56\\xc6\\x16\\xa3\\x8f\\x59\\x1b\\x12\\xd1\\xb3\\x95\\xce\\x13\\xd1\\xa9\\x91\\x15\\x81\\x18\\x46\\x6b\\xa6\\x4e\\x62\\xae\\x66\\x38\\x71\\x32\\x11\\x3d\\x39\\x7c\\x32\\xb1\\x89\\xfc\\x81\\xfa\\x27\\xe4\\x23\\x85\\x6d\\x84\\x0d\\x76\\x31\\x85\\x05\\x32\\x01\\xd2\\xb0\\x5f\\x32\\x81\\x93\\xe4\\x23\\xb1\\x69\\xd7\\xc6\\x0b\\x67\\x42\\xfe\\xd4\\xd1\\x10\\x3d\\x19\\x3d\\x79\\x9c\\x90\\x6d\\xc9\\xd6\\xc4\\x49\\x2d\\x8e\\x8e\\x4d\\x75\\x04\\x5e\\x5c\\x93\\xc2\\xce\\x86\\x69\\xe8\\x41\\x3d\\x7d\\x7d\\x68\\xe4\\x19\\x1b\\x6c\\x01\\xfa\\x4e\\x1e\\x5e\\x39\\x45\\xde\\x27\\xa6\\x12\\x9b\\xa3\\x18\\x12\\x7d\\x81\\xcd\\x51\\x8c\\x12\\x7d\\x6b\\xa2\\xb8\\x67\\x62\\xaa\\x08\\x51\\x58\\xb4\\xa5\\xaf\\x88\\xa2\\x68\\xd1\\x96\\x3e\\x1c\\xdd\\x82\\x7d\\xdb\\x82\\xf3\\x7d\\xb9\\x1a\\x30\\x5a\\xb4\\x25\\x81\\x61\\xd1\\x96\\x44\\x4a\\xd5\\x40\\x34\\x37\\x07\\x56\\x60\\xa0\\x1f\\x80\\xd9\\xca\\xaf\\x04\\x16\\xb4\\xd0\\x28\\x23\\x48\\x77\\x14\\xb5\\x9c\\xe7\\xd7\\x59\\x59\\xc3\\xff\\xac\\xa3\\xc8\\x32\\x9e\\x5f\\x67\\x41\\x66\\xc9\\x6d\\x9e\\xdc\\x2e\\x6a\\x35\\xde\\x99\\x8e\\x22\\x22\\xf7\\x73\\x42\\x4c\\xa8\\x8e\\x09\\xb1\\x7e\\x26\\x5a\\xae\\x42\\xf7\\x97\\x77\\xf2\\x2b\\xbf\\xf8\\xdb\\x7e\\xee\\x4d\\xa2\\xf1\\x68\\x74\\xee\\x13\\xe6\\x76\\x7e\\x03\\x38\\xa0\\x06\\xa6\\xa0\\x68\\x05\\x10\\x4b\\xbc\\x01\\x2c\\x9c\\x88\\x70\\x32\\x8d\\xe1\\x6c\\xc9\\x60\\x05\\x33\\x27\\x62\\x7f\\x16\\x1b\\x6c\\x25\\xa7\\x15\\xdc\\x9c\\x88\\x9d\\x69\\x72\\x01\\xea\\x37\\x90\\x9e\\x8e\\x19\\x9c\\x3a\\xb1\\x14\\x35\\x41\\x94\\x13\\xe5\\x5a\\x24\\xca\\xd1\\x98\\x60\\x2f\\x5a\\x3d\\xbc\\x24\\x49\\x90\\x69\\xaa\\x6e\\xee\\x62\\x72\\xd9\\x30\\xe3\\x72\\x5a\\x98\\x44\\xbc\\x91\\x71\\x34\\xb7\\xe4\\xb2\\x6e\\x72\\xa5\\x65\\x13\\x6c\\x23\\x8b\\x46\\x7d\\xa2\\x14\\x4d\\xb4\\x37\\x78\\xfd\\xa9\\xf6\\x68\\x54\\x12\\x7d\\xf6\\x91\\x81\\xbe\\xa5\\x1c\\xaf\\x41\\xd5\\xcf\\x06\\x19\\x8d\\x8e\\xbf\\x3e\\xdc\\x52\\xe7\\xf5\\xd7\\xe7\\x83\\xe1\\x7c\\x9d\\xc7\\x53\\x9b\\xe7\\x96\\xad\\x5c\\xb7\\x7e\\xa7\\xb3\\xa5\\xa3\\xcd\\x33\\xfb\\x36\\x93\\xf2\\x76\\xf7\\x76\\xaa\\x9e\\xe1\\x34\\xdb\\xce\\x4e\\xf1\\xfb\\xc1\\x01\\x22\\x0c\\x02\\x76\\xa4\\xb1\\x98\\x2b\\x19\\x0c\\xa0\\xe3\\x44\\x1c\\xce\\x22\\xdc\\x90\\xc6\\xdc\\x59\\xd9\\x6a\\x55\\xb0\\xd5\\x26\\x7b\\x91\\x28\\x27\\xac\\x8a\\x9c\\x42\\xa2\\x6c\\xe5\\x04\\xbb\\x6c\\x70\\x48\\x12\\xf6\\x0a\\xd8\\x29\\xe1\\x84\\x5d\\x0e\\x8b\\x74\\xf4\\x8e\\x42\\x17\\xca\\x27\\x17\\xa6\\xa0\\xb1\\xa2\\x6e\\x74\\xf1\\x1d\\xad\\x85\\xd5\\x9e\\x6e\\xd1\\x19\\x2c\\xae\\x44\\xda\\xef\\x4b\\x57\\xbb\\xe3\\x51\\xe9\\x91\\xbc\\x4e\\x67\\x72\\x55\\x35\\xfa\\x7d\\x99\\x2a\\x77\\x55\\x94\\xb7\\x5a\\x6d\\x1a\\x76\\xe7\\x29\\x9f\\xe8\\x3c\\x5c\\x5d\\xa8\\xb2\\xdb\\x93\\xed\\xb5\\xf1\\x63\\xeb\\x1e\\x4a\\x5d\\x74\\x27\\x74\\xe3\\x3a\\x6b\\x7d\\x43\\xbd\\x55\\x9d\\x4b\\x12\\x2c\\xec\\x39\\x9e\\x83\\x00\\x44\\xd0\\x04\\x14\\x75\\x0c\\x88\\x45\\xad\\xd1\\x94\\xcb\\xe5\\x8a\\x3c\\x02\\x71\\x5a\\xa3\\x37\\x98\\xab\\x3c\\x39\\x99\\xd3\\x2a\\xd3\\xac\\x2d\\x1c\\xa9\\xf2\\x64\\x09\\x33\\x9c\\x1e\\x6f\\x80\\xdc\\x46\\x5a\\x65\\x9a\\x11\\x82\\xa1\\x2a\\x4f\\xb6\\x08\\xc8\\x20\\x4e\\xf7\\x80\\x5f\\x2f\\x22\\x4c\\x04\\xff\\xac\\xac\\x33\\x29\\xd3\\x3e\\x9d\\x56\\x27\\xca\\x7e\\x93\\x82\\xfd\\x69\\xd9\\x67\\x52\\xb0\\xce\\x26\\x1b\\x91\\x28\\x9b\\x4c\\x8a\\x1c\\x43\\x22\\x6e\\xf1\\x3f\\xd7\\xfd\\xc8\\xe7\\xb5\\xe0\\x12\\x0d\\x1c\\xf6\\xdb\\x64\\x9f\\xe1\\xf3\\xe7\\xba\\xbf\\xf1\\xd9\\x09\\x72\\xc3\\x82\\x8d\\x36\\xec\\x7e\\x11\\x9b\\x6c\\xd8\\xf5\\x22\\x8f\\xfd\\xb6\\x69\\xc6\\xaf\\x75\\x88\\xd3\\x2c\\x7d\\xd7\\x90\\x77\\xec\\xb3\\x4d\\xeb\\x7d\\x3a\\x87\\x88\\xdd\\xb6\\x69\\x83\\xdb\\xe8\\x10\\xb1\\xcb\\x36\\x6d\\x76\\x99\\x1c\\xe2\\xb4\\x8d\\xbe\\x0b\\xf4\\xdd\\x49\\xde\\xc9\\x33\\x1e\\xfa\\x8c\\xcf\\x36\\xed\\xa5\\x7f\\xe5\\xb7\\x4d\\x07\\xe6\\x7f\\x27\\x38\\xff\\x3b\\x21\\xf2\\xcc\\x74\\x78\\xfe\\xc9\\x08\\xb9\\xcf\\x42\\xd1\\xe5\\xf6\\x35\\x36\\x36\\xa2\\x1e\\x3b\\xc3\\x12\\xb2\\xd8\\x04\\xea\\xa8\\xa8\\x9b\\x6a\\xfc\\xa3\\x7f\\xb8\\xc7\\x4f\\xf9\\x9a\\x73\\x24\\x0a\\x39\\x47\\x81\\xa5\\x2f\\x6d\\x82\\xbe\\xb4\\x0e\\xf2\\x22\\x5f\\x25\\x4d\\x7f\\x17\\xfe\\x9f\\x86\\xb7\\xab\\xdf\\x4e\\xee\\xab\\x7e\\xbb\\xfa\\x09\\xe7\\x13\\x91\\xd3\\xa6\\x33\\x75\\x6f\\x8b\\x87\\xea\\xde\\xac\\xfe\\xc5\\xc1\\xd8\\x21\\xb4\\xfd\\x61\\xe4\\xf9\\x2e\\xea\\x67\\xca\\x2f\\xa0\\x76\\xa6\\xfc\\xda\\xa3\\xe5\\x7f\\xff\\x4e\\xf9\\x09\\x33\\x5a\\x5b\\x96\\x19\\xb4\\xfc\\x51\\xe4\\x22\\x88\\x61\\xeb\\xdc\\x29\\xf6\\xc7\\x7c\\x1e\\xda\\xa1\\x0f\\x86\\xe1\\x2e\\xc0\\x52\\x5a\\xd6\\xeb\\x14\\x2c\\xa6\\x71\\x4f\\x4e\\x8e\\xb0\\x4a\\x31\\x22\\x12\\xd6\\x44\\xdc\\x84\\x35\\x4b\\xd2\\xd8\\x7a\\x56\\xee\\x30\\x2b\\xb8\\xc3\\x26\\xeb\\x91\\x58\\x74\\xb6\\x76\\x67\\xb3\\xd9\\xd2\\x22\\xaa\\x59\\x58\\xcc\\xca\\x05\\x93\\x22\\xfb\\xc2\\xd9\\x2c\\x5e\\x64\\x93\\x07\\x91\\x28\\x37\\x99\\x14\\x79\\x04\\x89\\xf2\\x22\\xab\\x60\\xc7\\x48\\xc2\\x83\\x02\\x76\\x4b\\xb8\\xc9\\x2e\\x27\\xe3\\x92\\x04\\xb2\\x5e\\x12\\xec\\x32\\xb4\\x48\\x12\\x16\\x85\\xa7\\x91\\x35\\xd1\\xd4\\xd1\\xbd\\x68\\xb8\\xca\\x23\\xe1\\x88\\x5d\\x76\\xc6\\x25\\x29\\xd3\\xd4\\x8d\\xc2\\xac\\x27\\x8c\\x3c\\x42\\x23\\x9b\\x6f\\xee\\x62\\x0a\\xf9\\x5c\\x18\\x11\\xcd\\x0c\\xa1\\x30\\xf2\\x68\\xe3\\x8d\\x4c\\xb2\\x11\\x25\\x85\\x30\\x4b\\xb5\\xd5\\x95\\xc8\\x37\\x22\\x87\\xd3\\xed\\xc9\\x5b\\x10\\xd1\\x81\\xe6\\x9a\\xe4\\xd6\\x63\\x82\\xc3\\xa0\\xe5\\xe3\\x4b\\x9b\\x87\\x0f\\x2d\\xaf\\xaf\\x5f\\xb6\\xbf\\xff\\x4d\\x1d\\xc7\\x71\\xdc\\xca\\x6f\\xb6\\x1f\\xb5\\x5a\\x0d\\x5a\\x8d\\x73\\x51\\xcd\\xf8\\x5f\\xac\\xa8\\x6f\\x58\\x71\\xcd\\xc8\\x9b\\x1b\\x9e\\x7c\\xa6\\xbe\\xb9\\xbe\\x19\\x79\\x5a\\x16\\xb5\\x77\\xbd\\x86\\x79\\xa7\\xdb\\xc9\\x57\\x37\\x1b\\xd1\\xbe\\x40\\xdf\\xf8\\x96\\xf6\\xd6\\xed\\x13\\xed\\x96\\xc3\\xac\\x51\\xc3\\x0a\\x0e\\x87\\x26\\x2a\\x6c\\x1a\\xfa\\xb6\\xc5\\xe9\\x31\\x78\\x1a\\xf4\\xe5\\xb7\\xfd\\x3d\\x93\\x57\\x2c\\xea\\x3e\\xb4\\xa1\\xdf\\xba\\x6f\\xa7\\x6d\\x03\\xeb\\x8a\\xf6\\xdb\\x3f\\x32\\xb6\\xce\\xfa\\x1d\\x83\\x6d\\x99\\xc5\\x6e\\xa2\\x2f\\x3c\\x04\\xe6\\x3e\\x61\\x15\\xde\\x0e\\x0e\\xf0\\x80\\x08\\xdd\\xb0\\x02\\xa6\\xa1\\xe8\\x04\\x10\\x8b\\xed\\xc4\\xac\\x0d\\x68\\x21\\xc0\\x89\\x45\\x17\\x51\\x23\\x9e\\x01\\xb1\\x94\\xa4\\x37\\x4a\\xcb\\x9b\\xda\\x79\\xb3\\x58\\x5a\\xae\\x5e\\x85\\xac\\xf4\\x2a\\x44\\xaf\\x10\\x9e\\xa4\\x36\\xd0\\x6b\\x02\\x0f\\x27\\x62\\xaf\\x4d\\x6e\\x40\\x62\\xa9\\x87\\x5e\\x4d\\x1b\\x7a\\x1a\\x74\\x62\\x29\\xae\\xb2\\x26\\x9e\\x2e\\x19\\xd4\\x56\\x8f\\x4d\\x5e\\x82\\xc4\\x52\\x0b\\x7d\\x48\\x5e\\x89\\x44\\x39\\xee\\x5d\\x30\\x86\\xf2\\x92\\x1e\\xc1\\x5e\\x74\\xb5\\x37\\x11\\xc3\\x28\\x2f\\x77\\x0a\\x76\\xb9\\xa1\\x45\\x92\\xe4\\x64\\x88\\x58\\x1f\\x20\\x0c\\x71\\x5c\\x6a\\x2c\\x51\\x0e\\xb1\\xce\\x30\\x93\\xcb\\x76\\x31\\xf9\\xe6\\x46\\x26\\x11\\xb7\\x30\\xe8\\x92\\x67\\x0a\\x97\\x7c\\x1f\\xa8\\x1b\\x58\\xdf\\xdc\\x7c\\xd9\\x40\\x6d\\xb2\\xff\\xb2\\x96\\xe6\\xf5\\x03\\x75\\x76\\xe6\\x9d\\xb7\\x66\\xab\\x73\\x26\\x57\\x48\\x10\\xc2\\x2e\\x93\\xc9\\x15\\x16\\x84\\x90\\xcb\\x84\\xea\\xe8\\x83\\xeb\\x07\\x6a\\x6b\\x2a\\x0f\\x3e\\x4e\\x1f\\x09\\xb9\\x4d\\x26\\x77\\x88\\x3e\\xc2\\xce\\xb4\\x6d\\x1f\\x11\\x1b\\x46\\x76\\xb4\\x75\\x6d\\x5f\\x52\\x57\\x3f\\xb2\\x63\\xa6\\x97\\x9b\\xf9\\x92\\x63\\xbf\\x08\\xa4\\x13\\x4e\\x67\\x22\\x1d\\x08\\x64\\x12\\x2e\\x57\\x22\\x33\\xf3\\x1f\\x6d\\xdb\\x47\\xc5\\x86\\x51\\xf2\\xdc\\x70\\x5d\\xfd\\xc8\\xf6\\xf6\\x4b\\x1e\\xa0\\x50\\x0b\\x3a\\xe7\\xde\\x61\\x7f\\xc3\\xdb\\xa0\\x19\\xfa\\x60\\x02\\x8e\\x40\\x31\\x03\\x20\\xca\\x6d\\xbc\\x52\\x34\\x33\\x20\\xca\\x63\\x5a\\x05\\xe1\\x15\\x84\\xe6\\x72\\xde\\xac\\xe0\\xbc\\x0d\\x2f\\x8a\\x9e\\x15\\x88\\xb1\\xc2\\xba\\xb4\\xbc\\xc8\\x44\\x6e\\x51\\x79\\xb7\\x9b\\x14\\x79\\x92\\xc8\\x7d\\x5e\\xb0\\x63\\x5e\\xc2\\x23\\x42\\xc9\\x9c\\x69\\xeb\\xf2\\x10\\xd9\\xb6\\xdb\\x8b\\x5e\\xb1\\x93\\x52\\xb8\\x2d\\x23\\xd8\\xe5\\x3a\\x51\\x92\\xf0\\x98\\xf0\\x14\\xe8\\xec\\x35\\x5d\\x83\\x55\\x9e\\x0a\\x91\\x0b\\x8d\\x28\\x7f\\x01\\x1d\\xb5\\x9e\\x2e\\x54\\x68\\x69\\xee\\x42\\x05\\x8f\\x05\\x69\\xc3\\xac\\x47\\x9b\\xb4\\xb0\\xe7\\x89\\xdb\\x52\\x60\\x2d\\x2c\\x11\\xfd\\x2e\\x56\\xa5\\xb2\\xa6\\x93\\x10\\x77\\x68\\x71\\x66\\x62\\x7f\\xd7\\xa2\\xbd\\xcb\\xc4\\x50\\x7e\\xa4\\xf1\\x49\\x47\\x40\\x87\\x58\\xbd\\xf1\\xd9\\xe4\\x48\\xd4\\x5a\\x55\\x95\\xb0\\x3e\\xb1\\x35\\xb2\\x64\\x62\\xaa\\x61\\xe5\\x0d\\xab\\x1b\\x3e\\x74\\xd7\\x16\\xa2\\xd2\\xba\\xe8\\xff\\x17\\x4b\\x07\\xcd\\x1b\\xeb\\x33\\xbe\\x6a\\xaf\\xc9\\xe4\\x8d\\xbb\\x33\\x19\\xd4\\xd4\\x7e\\xcd\\x15\\x6b\\x22\\xcb\\xfe\\xaa\\xbf\\xe3\\x8a\\xa5\\x0d\\x4d\\x63\\x3b\\x5a\\x32\\x9b\\xd7\\x8d\\xfa\\xbe\\xf0\\xb5\\x05\\x4c\\x7e\\xaf\\x5b\\x7f\\x43\\xdf\\xe1\\xb4\\xab\\x31\\xdd\\xe8\\xbc\\xfe\\xa1\\x48\\x4b\\xad\\xa7\\x79\\xed\\x5f\\x5c\\x1e\\xef\\xcd\\x45\\xfa\\x9b\\x90\\xe8\\x2a\\x74\\xf7\\x32\\x27\\x92\\x9b\\xbb\\xac\\x0d\\xb9\\x16\\xbf\\xbf\\x31\\xe1\\x5c\\x44\\x71\\x03\\xda\\xcf\\xb6\\x33\\x4f\\xf0\\xfb\\xc1\\x0e\\x49\\xc0\\xf6\\x74\\xc5\\x05\\x22\\xe2\\x10\\x55\\xff\\x27\\x3b\\x17\\x9c\\x9e\\x9d\\xba\\x39\\x74\\xb1\\x9b\\xb3\\x22\\xb4\\x3f\\x3f\\xef\\xd2\\x32\\x55\\xee\\x3e\\xe9\\x12\\xef\\x35\\xf0\\xd4\\x43\\x80\\xe0\\xd3\\xf2\\x37\\xd9\\xab\\xf9\\xf5\\x10\\x02\\x07\\x20\\x1c\\xa6\\x9c\\x73\\x98\\x14\\x39\\x82\\x44\\x62\\x62\\x9b\\xed\\x84\\x9e\\x9a\\x44\\xbc\\x26\\x51\\x8f\\xb4\\x16\\xd6\\xe5\\x0c\\x33\\x1e\\x6d\\x23\\xc3\\x7c\\xba\\xec\\x1b\\x3f\\x39\\xb6\\xc1\\x69\\x35\\x39\\xf5\\xac\\x86\\x1f\\xbb\\x7e\\x2a\\xdd\\xb1\\xff\\xa1\\x2d\\x6b\\xbf\\xfa\\x93\\xaf\\x2f\\x65\\x4c\\xf7\\x20\\xee\\x9f\\x1e\\x6b\\x3d\\xa3\\xd3\\x30\\xe9\\x1b\\xbe\\xf7\\xfa\\x35\\x87\\xde\\x3d\\xf3\\x57\\x6d\\x0f\\xf4\\xfe\\xe8\\x23\\x64\\xa0\\x98\\xe8\\x96\\xf2\\xed\\xac\\x8d\\x62\\x16\\xd2\\xa7\\x33\\x8d\\xf9\\xb3\\xb2\\xc5\\xa4\\xc8\\x2e\\xda\\x27\\x65\\x10\\x93\\x2c\\x84\\x19\\xbb\\xcb\\xc9\\x58\\x90\\xf6\\x96\\x9d\\x7f\\x7d\\xa0\\xfd\\x67\\xff\\xd0\\x72\\xdb\\x3f\\xdd\\x3f\\x3e\\xf9\\x97\\x1f\\x9c\\x7c\\x2d\\x73\\xcf\\xd3\\xff\\x78\\xe0\\x63\\xb4\\xe5\\x8a\\xa2\\x74\\xfa\\x5f\\xcb\\x5f\\x9e\\xbc\\xbd\\xfc\\x3b\\xe5\\x39\\x49\\xc5\\x5b\\x83\\xf0\\x26\\xfb\\x2a\\x97\\x23\\xd1\\xa6\\xa3\\xc0\\xb3\\x39\\xb6\\xda\\xc3\\x3b\\xb4\\x46\\x94\\x74\\x0c\\x0e\\xa1\\xea\\xe0\\xff\\x11\\x51\\x68\\xb4\\xfc\\xe2\\xaf\\x1e\\x7d\\xed\\xcd\\xef\\xfe\\x07\\xf3\\xda\\x73\\x27\\x50\\x7b\\xf9\\xd5\\x1b\\xf0\\x96\\xf2\\xc7\\xd7\\xa3\\x54\\xf9\\xad\\x1b\\x90\\x1b\\x10\\x4c\\xc2\\x07\\xec\\x69\\xae\\x1d\\x8c\\x30\\x01\\x18\\xd2\\x58\\x9b\\x93\\x11\\xaf\\x60\\x7e\\xc1\\x0d\\x1b\\xf4\\x62\\x11\\x01\\x69\\x22\\x96\\x98\\x7d\\x53\\x1a\\x1b\\xce\\x62\\x26\\x2b\\xeb\\x4d\\x0a\\xe6\\xb2\\x45\\xbd\\x81\\x7c\\xa7\\xd7\\xea\\xc5\\xa2\\x41\\x4f\\x9a\\x06\\xd0\\x8b\\xb2\\x59\\x25\\x69\\x3e\\x26\\xe4\\x84\\x98\\x2b\\x26\\x24\\x84\\x49\\x34\\xf9\\x1a\\x1a\\x2a\\x3f\\xfb\\x1a\\xd3\\xff\\x24\\x1a\\x2e\\x3f\\xfd\\x64\\xf9\\xdb\\x68\\x87\\xca\\xff\\xa6\\xf2\\x29\\xe6\\x3e\\xf8\\x02\\xbc\\x50\\x0b\\xd8\\x9b\\x2e\\xd9\\x0c\\xa0\\x25\\xfc\\xf7\\x51\\x6a\\xb9\\xcc\\x4a\\x91\\x77\\x19\\xc4\\x69\\xe0\\x8d\\x7a\\x51\\xf6\\xd3\\x5f\\xe6\\x09\\xe1\\x6a\\x92\\x17\\x6a\\x85\\x46\\x8b\\x9a\\x82\\x4d\\x55\\x4e\\xbb\\xc9\\x5f\\xef\\xae\\x95\\x12\\xd1\\xce\\x74\\xf0\\xc8\\x57\\x7e\\x1b\\x90\\x5a\\xd2\\x36\\xa3\\xc3\\xe8\\x6e\\x4a\\x84\\x9b\\x93\\x9e\\x60\\x76\\xa0\\x7e\\xfc\\xf5\\x63\\x94\\x7e\\x37\\x31\\x39\\xf6\\x26\\xe6\\x37\\xc0\\x82\\x87\\xcc\\x5d\\x46\\x9c\\x42\\x5e\\x08\\x73\\x69\\x99\\x9f\\x9f\\x80\\xeb\\x26\\x16\\x98\\xdc\\x8f\\x7e\\x04\\x08\\xad\\x9a\\xfb\\x88\\x39\\x0e\\x33\\xe0\\x80\\xfc\\x79\\xf4\\x69\\xe5\\xc4\\x0b\\xdb\\x94\\xc7\\x2a\\x12\\x75\\x71\\x62\\xe5\\xa3\\xc2\\xed\\x4b\\xa1\\x25\\x5a\\xe5\\xad\\x2f\\x44\\xc2\\xad\\xf5\\x3e\\x6f\\x7d\\x6b\\x24\\xda\\x5a\\xe7\\xd9\\x1f\\xca\\x25\\xdd\\xbe\\xba\\xac\\x2f\\x98\\xad\\x71\\xbb\\xab\\xb3\\x2a\\x9f\\x77\\xcd\\x3d\\xcc\\xde\\xcf\\xaf\\x22\\x31\\xbd\\x07\\x79\\xd0\\x2e\\xe6\\xda\\xe9\\xd9\\xe3\\x06\\x7e\\xe3\\xfa\\x2f\\x4e\\x51\\x3b\\x35\\x38\\xf7\\x1e\\xfb\\x3c\\xef\\x01\\x37\\x54\\x41\\x16\\x96\\x40\\xd1\\x4e\\xec\\x54\\xad\\x41\\xa1\\xae\\x43\\x8e\\xea\\x15\\x84\\x73\\x54\\xda\\x3d\\x66\\x05\\x7b\\x6c\\x14\\x43\\x9a\\xcd\\x8a\\xdc\\x8c\\x44\\x39\\xe5\\x11\\xec\\xd3\\x76\\x3e\\x54\\x5d\\xe5\\x91\\x40\\x8e\\xd6\\x0a\\xf6\\x69\\x33\\x04\\xb3\\x0b\\x96\\x87\\x0c\\xd8\\xe3\\xb6\\x5f\\x68\\xbd\\x3d\\xa8\\x11\\x11\\xcb\\xed\\x08\\xa3\\x79\\x43\\x9e\\x1c\\x5c\\x7c\\xf4\\xe1\\x35\\xb9\\x55\\x23\\xbd\\xd1\\xee\\x25\\x4b\\xae\\x7d\\x64\\xf5\\xba\\xef\\x1e\\x19\\x7c\\x9f\\x61\\x59\\x06\\x5d\\xed\\x9b\\xc8\\xa5\\xc6\\xbb\\xaa\\x17\\x55\\x3e\\x19\\x96\\x43\\xcc\\xd5\\xf7\\x7e\\x56\\xdc\\xe2\\x69\\x5c\\x94\\x5a\\x51\\x9e\\xf9\\xee\\xf7\\xff\\xf0\\xd7\\x63\\x9b\\xf0\\xef\\x7f\\x68\\x6f\\x48\\xd5\\x5b\\xd0\\x47\\xed\\xfd\\xbd\\xd7\\x7c\\xaf\\xdc\\xd4\\xde\\xdf\\x7b\\xf5\\xf7\\xb6\\xd9\\x53\\xa9\\x3a\\x2b\\x20\\x78\\x00\\x80\\xb9\\x83\\x9b\\x01\\x0d\\xe4\\xa0\\xc8\\x11\\x3f\\x89\\x18\\x02\\x2b\\x39\\xa4\\x13\\x11\\xd6\\x52\\x4b\\xc1\\x9a\\x15\\x59\\x87\\x44\\x99\\xe5\\x28\\xbe\\x00\\x19\\x69\\xa8\\xc1\\xcd\\x34\\x39\\xaa\\x73\\x42\\x42\\xd0\\x3e\\x80\\xd6\\x7e\\xfb\\xe7\\xef\\x73\\x7d\\xcf\\x7d\\xc9\\xb1\\x9f\\xf5\\x51\\xda\\xee\\x07\\x60\\xef\\xe0\\x7d\\xd0\\x08\\x6b\\xa1\\xe8\\x21\\x74\\xb3\\xea\\x14\\xb5\\xe1\\x32\\x28\\x45\\x96\\x10\\x30\\xc9\\x2a\\x08\\xa7\\xd3\\x38\\x7e\\x56\\xd6\\x59\\x15\\xec\\xca\\x16\\xe3\\x3a\\x22\\xe9\\x71\\x8f\\x5e\\x94\\x33\\x48\\x94\\x75\\x71\\xc1\\x8e\\x1d\\x12\\xc8\\x56\\x8f\\x60\\xc7\\x5e\\x49\\x4e\\xba\\x04\\x7b\\x09\\x4c\\xba\\x48\\xa3\\x4a\\xc7\\x2e\\x54\\xe1\\x3b\\xa7\\x8d\\x75\\xb1\\x39\\x57\\x2c\\xdf\\xc5\\x16\\xe6\\x8d\\xb3\\x85\\xd3\\xee\\x6f\\xfb\\x87\\x5b\\x56\\xdf\\xb5\\xab\\x43\\x5a\\x77\\xe5\\x95\\x3b\\x12\\xe8\\x59\\xa3\\xcd\\x66\\xb7\\xcc\\x7c\\x1c\\x5c\\x3e\\xb5\\xbe\\x3e\\xba\\x7c\\xa0\\xd1\\x97\\xea\\xa9\\xc9\\x74\\xd7\\x7a\\x6c\\x66\\x03\\xe7\\xb9\\xee\\xe6\\x8e\\x1d\\xb7\\x8d\\x2e\\xbb\\xf5\\xf0\\xbe\\x83\\xd7\\xf4\\x23\\xa3\\x49\\x7f\\xee\\xfa\\x81\\xeb\\xae\\xdc\\x96\\x8a\\x8f\\xae\\xda\\xd8\\x52\\xbd\\xa8\\x29\\xe4\\xab\\x49\\xa7\\xaa\\xf5\\xaa\\xec\\x6c\\x9c\\x7b\\x8f\\x3d\\xc1\\xfb\\xa0\\x0f\\xf6\\x42\\xb1\\x87\\x4c\\xcb\\xa8\\x57\\x8a\\x0d\\x64\\x5a\\xd5\\xac\\x52\\x0a\\xb8\\x7a\\x1a\\xcc\\xa2\\x1c\\xd0\\x28\\xd3\\xb5\\x04\\x22\\x20\\xbc\\x28\\x8d\\x6d\\x67\\xe5\\x76\\xa3\\x82\\xdb\\x6d\\xb8\\x89\\x38\\xb4\\xa8\\x51\\xc1\\xd1\\xb4\\xdc\\x64\\x54\\xe4\\x7e\\x82\\xe2\\x6c\\x82\\x1d\\xb7\\x48\\x20\\xbb\\x8c\\x82\\x5d\\x46\\xed\\x92\\x24\\xd7\\xf6\\x08\\x76\\x39\\xda\\x24\\x49\\x72\\x43\\xb5\\x60\\xc7\\x75\\x0b\\x50\\x8d\\xbd\\xd0\\xd1\\x6b\\xf3\\x0b\\x17\\x1a\\x6d\\x72\\x81\\x24\\x8c\\x56\\x05\\x6c\\x89\\x78\\xcd\\xc6\\x47\\xf4\\x3a\\x8d\\x56\\x6b\\xaa\\xc9\\xb4\\xf8\\xeb\\x87\\x5b\\xa3\\xd5\\x7d\\x6b\\xf3\\xbc\\xd9\\x5b\\x1b\\x59\\x7f\\xdd\\xd2\\x98\\xbb\\xbe\\x33\\xd9\\xb4\\x5b\\xba\\xa9\\x5f\\xbe\\x62\\xe5\\x9d\\x3b\\xdb\\xa2\\xf9\\xde\\x58\\x72\\xb4\\xa3\\xaa\\xed\\xc0\\xf7\\x76\\xef\\x7a\\xee\\x96\\x57\\x35\\x26\\xc1\\x63\\x73\\x25\\x7c\\xd6\\x60\\x61\\xac\\xb9\\x71\\x71\\xd6\\x8f\\x10\\x42\\xcf\\x06\\x9b\\x47\\xd2\\x51\\xa9\\xde\\xd7\\x32\\x70\\xcf\\xba\\xf1\\xfc\\x86\\x1b\\x97\\x65\\x57\\x0d\\x64\\xad\\x96\\xb6\\xc9\\xdd\\xdd\\x53\\xdf\\xdc\\x21\\x2d\\xa7\\xb1\\xcb\\x14\\x00\\xfb\\xff\\x71\\x33\\x60\\x00\\x33\\x6c\\x84\\xa2\\x9e\\x48\\x17\\x43\\x40\\x17\\x18\\xf5\\x8c\\x59\\xc4\\x5c\\x4e\\x06\\x4e\\xc1\\x9a\\x2c\\xc2\\x96\\x34\\x36\\x9d\\xc5\\xfa\\xac\\xcc\\x99\\x15\\xac\\xcd\\x16\\x39\\x13\\x11\\x04\\x4e\\xa3\\x17\\x8b\\x26\\x8e\\x34\\x4d\\xc4\\xfa\\x59\\x91\\x28\\x73\\x26\\xc1\\x8e\\x19\\x09\\x64\\x23\\xa8\\x68\\x97\\x11\\xb0\\x99\\xc8\\x42\\x1e\\xe5\\x84\\x9c\\x2b\\x21\\x24\\x84\\x64\\x4c\\x98\\x62\\xea\\xbe\\xf7\\xf8\\xe3\\xbf\\xfc\\x02\\x31\\xa8\\xfd\\x1b\\x6c\\xd3\\x4c\\xf9\\xc7\\xe5\\xd7\\x50\\xfb\\xb3\\xe8\\x18\\xe1\\xdd\\xde\\xb9\\xf7\\x58\\xcc\\xcd\\x40\\x0a\\x96\\x41\\xb1\\x8e\\xf0\\x4e\\x6f\\x50\\x8a\\x5e\\xc2\\xbb\\x00\\xab\\x94\\x22\\x8e\\x3a\\xaf\\x59\\x94\\x23\\x3a\\x05\\xe1\\xc6\\x34\\xb6\\x9c\\x95\\xab\\x8c\\x8a\\x9c\\x46\\xa2\\x5c\\x65\\x11\\xec\\xb2\\xcf\\x4f\\x40\\x85\\x43\\x4f\\x24\\x11\\xb9\\x3d\\x55\\x14\\x49\\x0b\\x38\\x78\\x1e\\x47\\xe7\\x2e\\xe4\\x87\\x23\\xe6\\x8a\\x69\\xcf\\x33\\x85\\xe8\\xfa\\xde\\xd3\\x7a\\xbd\\x86\\x63\\x5d\\x97\\x2f\\x11\\x47\\x0a\\xd1\\x50\\xf3\\xe2\\x86\\xae\\x0d\\xa9\\xbb\\xd3\\xcc\\x93\\xe5\\x80\\x50\\x35\\x50\\xbd\\xee\\x9e\\x9d\\xad\\xed\\xfb\\xff\\x6a\\x53\\xcf\\x35\\x3b\\xd7\\xbe\\x71\\x82\\xb7\\xd8\\xed\\xfa\\xc6\\xbe\\x48\\xf7\\x86\\xae\\x8e\\x0d\\xbd\\xb1\\x8e\\xee\\x6e\\xe6\\xa1\\x97\\xff\\x60\\x34\\x76\\x5c\\xf9\\xbd\\x2b\\xb6\\x9e\\x3a\\xdc\\xe7\\x6f\\x5b\\x4f\\x68\\xbd\\x73\\xee\\x3d\\xf6\\x11\\xde\\x03\\x75\\xd0\\x01\\xfb\\xa1\\x58\\x4d\\x66\\x95\\x9e\\xb7\\x54\\x02\\x91\\x48\\xa9\\x9a\\x27\\x12\\x69\\x50\\x10\\xee\\xa4\\x46\\xab\\xde\\xaa\\x60\\x77\\x16\\xd7\\xdb\\xa8\\xbd\\x8a\\x1a\\x15\\xb9\\x0b\\x89\\x72\\x73\\xbd\\x60\\x9f\\x16\\xf8\\x00\\xb1\\x5b\\x38\\x2a\\xc8\\x66\\x1d\\x99\\xae\\x94\\x26\\x31\\x44\\x54\\x92\\x70\\x80\\x06\\x17\\x82\\x1d\\xeb\\x25\\xcc\\x0b\\x58\\x27\\x55\\x3c\\x7c\\x2e\\xeb\\xf6\\x68\\x1b\\xd9\\xa4\\x6a\\xc2\\xb4\\x5d\\xec\\x9f\\xc7\\xa6\\x1a\\xed\\xce\\x81\\xeb\\x7e\\xb8\\x6b\\xea\\x91\\xa1\\x6f\\x1b\\x8d\\x5a\\xad\\xd6\\xd9\\x5f\\x5d\\xbd\\x6c\\xa0\\xd9\\xe0\\xcc\\x16\\xda\\x82\\x63\\x5f\\xbb\\xa2\\xa3\\x7b\\xcf\\x5d\\x2b\\xb6\\x3d\\xb4\\xb7\\xed\\x57\\x84\\x36\\xf1\\xce\\x46\\x7f\\x24\\xd3\\x19\\x2e\\x5c\\x11\\x67\\x46\\x4f\\x21\\xc3\\x33\\x5b\\x96\\x2d\\x3e\\xc5\\x9a\\x05\\x97\\xc9\\x13\\xae\\x9a\\x38\\xbe\\xc5\\x99\\xf0\\x5b\\x7b\\xae\\x7a\\x78\\xe3\\xc6\\x53\\x47\\x07\\x2f\\xfb\\xfe\\xbf\\x55\\x75\\x5e\\xb9\\x3a\\x1f\\xed\\x5c\\xdb\\xde\\x31\\x25\\x05\\x17\\xb5\\x12\\x7e\\x1f\\x07\\x60\\x8f\\x53\\x39\\xac\\x83\\xa2\\x76\\xde\\xc6\\xc9\\x40\\xec\\xb7\\x91\\x06\\xc2\\x1a\\xab\\x22\\x9b\\x90\\x08\\x32\\x22\\x42\\xc5\\x4a\\xaa\\x87\\x32\\x20\\x36\\xe1\\x47\\x8e\\xe3\\x2c\\x1c\\xfe\\x5f\\x97\\x7d\\xb6\\xee\\xa5\\xbd\\x5c\\xee\\xf5\\xab\\xcb\\x9f\\xce\\x3e\\x53\\x7e\\x0b\\xd9\\x98\\x30\\xe2\\x81\\x85\\x55\\x73\\xef\\xb1\\x4f\\xf0\\x21\\x48\\x42\\x3b\\x2c\\x85\\xab\\xa0\\x98\\x20\\x94\\x4f\\x19\\x94\\xa2\\x95\\xf4\\x31\\x4c\\xfa\\x58\\x46\\xc9\\x5d\\x6b\\x55\\x70\\xad\\x0d\\x77\\x10\\xd5\\x37\\x18\\x15\\x6c\\x48\\xcb\\x1d\\x46\\x72\\x4b\\xce\\x22\\x51\\x0e\\x5b\\x15\\xdc\\x4f\\xbe\\x72\\x1a\\x15\\x79\\x39\\x12\\xe5\\x0e\\x83\\x0a\\x6a\\xfb\\x85\\xe9\\x44\\xaa\\x60\\x25\\xdc\\x70\\xda\\xb1\\x4f\\x02\\x79\\x38\\x25\\xd8\\x9f\\x02\\x83\\x33\\x5c\\xe8\\xbd\\x00\\xc7\\xb2\\x17\\xe1\\xd8\\x79\\xd5\\xbf\\x98\\xf4\\x49\\x82\\x5e\\xc3\\x8c\\x87\\x44\\x6d\\xaa\\xed\\x58\\x15\\xef\\x5e\\x95\\xaf\\xe9\\x4d\\x07\\x3a\\x76\\x9c\\x5c\\x36\\x76\\xdb\\x56\\x29\\x94\\xeb\\xaf\\xc9\\x4e\\x76\\xc6\\xfb\\xae\\x7a\\x70\\xed\\xba\\x07\\xaf\\xec\\xfd\\x6d\\x38\\x37\\x50\\x53\\xbb\\x28\\x13\\x08\\xb7\\x2c\\xcd\\x24\\xda\\x1a\\xbc\\x4d\\x81\\xc6\\xce\\x78\\xf3\\x80\\xa7\\xb6\\x25\\x12\\x69\\xae\\x76\\xa1\\xd1\\xdc\\xe6\\xb5\\xcb\\x42\\xbe\\xde\\x25\\xe3\\xf5\\x83\\xd7\\x5d\\x56\\xc8\\xaf\\x3b\\xba\\xa8\\x7e\\xc5\\xe8\\x22\\x5f\\x70\\x64\\xed\\xd6\\xfc\\xd8\\xc9\\x6d\\x6d\\x6d\\x5b\\x8f\\xaf\\xaf\\xea\\xcd\\x84\\x02\\x8d\\xdd\\x55\\xd5\\x83\\x9d\\x59\\xc1\\xde\\xd4\\xbe\\x88\\x19\\x8f\\x4a\\x4d\\x75\\xf6\\xc4\\xf6\\xd6\\x40\\xb6\\xc6\\xed\\xaa\\xce\\x10\\x19\\x26\\xb4\\xbc\\xf3\\xbc\\x0c\\x13\\xef\\x2f\\x07\\xf4\\x15\\x19\\x6e\\x35\\x28\\xa5\\xea\\xb4\\x95\\xc8\\x70\\xf5\\x05\\x32\\x6c\\x54\\x88\\x00\\x67\\x91\\x88\\xa3\\x59\\x42\\x56\\x2a\\xc3\\xf5\\x20\\xd8\\x65\\xbb\\x47\\x92\\x70\\x56\\x98\\xb6\\x06\\xaa\\x79\\xea\\x83\\x03\\x24\\x3c\\xb6\\x4b\\xb8\\x5a\\xc0\\x0e\\x09\\xa7\\xed\\x38\\x2a\\xe1\\x56\\xe1\\x8f\\x22\\x2e\\xc6\\x82\\x12\\xf1\\x9a\\x64\\x61\\x41\\x95\\x0b\\x17\\x87\\x00\\x0b\\xa4\\xeb\\xde\\xf3\\xcd\\x15\\xdb\\x1e\\xda\\x27\\x0d\\x1c\\xbb\\x54\\x96\\xfb\\x9b\\x8d\\x0b\\xb2\\xfc\\x0b\\x22\\xbb\\xad\\x57\\xc4\\x89\\x28\\x27\\x3a\\x53\\x01\\x76\\x82\\x08\\xea\\x86\\x53\\xbf\\xbc\\xed\\xfb\\xe5\\x3f\\x3c\\xbb\\x79\\xf9\\xf0\\xbc\\x2c\\x27\\x26\\x6e\\x5d\\x90\\xe5\\xce\\x29\\x29\\xd8\\x5f\\xa8\\xee\\x3c\\x44\\x44\\x79\\x1d\\x00\\x83\\x06\\xe7\\x3e\\x62\\x0e\\xb3\\xd7\\x82\\x03\\x92\\x20\\x5d\\x84\\x92\\x70\\x22\\x5d\\xf2\\x55\\x30\\x52\\x2d\\x21\\x0a\\x76\\x66\\x2b\\xf8\\x08\\x87\\xe7\\x5b\\x72\\xdd\\x9f\\x44\\x4a\\xc2\\xa5\\xc8\\x69\\xd0\\x57\\x57\\x08\\x07\\x0b\\x0d\\x01\\x6f\\x7d\\x6b\\x34\\x5a\\xa8\\xf5\\xce\\x5f\\xfb\\xea\\x5b\\x23\\xe1\\x42\\x9d\\x8f\\x22\\x29\\x57\\x4d\\x2e\\x52\\x41\\x52\\xcc\\x43\\xc1\\x5c\\x8d\\xdb\\x59\\x9d\\x8b\\x84\\xb2\\x49\\xb7\\x3b\\x99\\x05\\x06\\xc5\\xca\\xa7\\x98\\xe3\\xec\\xb5\\xe0\\x85\\x06\\x58\\x0c\\xb8\\x36\\x5d\\x0a\\x57\\xc6\\x97\\x4a\\x63\\xdf\\x59\\x6c\\xcc\\x96\\x12\\xea\\xf8\\x12\\x36\\xec\\x22\\x42\\xcf\\x9b\\x15\\xcc\\xa7\\x09\\x24\\x95\\x1b\\x91\\x28\\xf3\\x3e\\xea\\xee\\x71\\x42\\x28\\xda\\xc2\\xb5\\x6a\\xfe\\xf0\\x4f\\x22\\x53\\xf6\\xd2\\xf1\\xc7\\x42\\xd9\\x2a\\xa7\\xdd\\xec\\xaf\\x73\\xd7\\x16\\xe2\\xb1\\xce\\x4c\\xf0\\xc8\\xd1\\xb1\\x4b\\xa7\\xf0\\x67\\xa0\\x2b\\xb7\\xe4\\xd2\\x99\\x10\\xdb\\xd1\\x07\\x63\\xec\\x8f\\xb9\\xc7\\x40\\x03\\xe0\\xc8\\x23\\x97\\x1e\\xb9\\xfa\\xd8\\x23\\xb3\\x37\\x30\\xb7\\x32\\xeb\\x0f\\xa3\\x77\\xde\\x28\\x3f\\x5b\\xbe\\xf7\\x7d\\x22\\xbb\\x93\\x68\\x3d\\x7b\\x9a\\x7d\\x82\\xe6\\x66\\x83\\x40\\x73\\x73\\x32\\xc7\\x2b\\x14\\xfe\\xf2\\x0a\\x22\\x91\\xab\\x7e\\x01\\xfa\\xa2\\x7c\\xcc\\x35\\xc9\\x6e\\x9e\\x79\\x88\\xdd\\x8c\\xd6\\x3f\\xf9\\x24\\x7a\\xe4\\xc9\\x27\\x49\\x5f\\xa3\\x30\\xc6\\xbe\\xa1\\xf6\\x55\\xc8\\xeb\\x51\\x1e\\xb9\\x46\\x99\\x9b\\x66\\xaf\\x67\\x8f\\x8d\\xbd\\x8f\\x76\\xa3\\xa1\\x37\\xca\\xe2\\x61\\xea\\x57\\x0f\\xce\\xfd\\x9c\\xbd\\x93\\xdf\\x08\\x75\\xd0\\x09\\x3b\\xa0\\x28\\x11\\x59\\x48\\xab\\xb2\\x50\\x95\\x96\\x79\\x8d\\x82\\x70\\x57\\x1a\\xbb\\xcf\\xca\\x2e\\x93\\x32\\xed\\x72\\xd7\\x5b\\xc4\\x52\\xb3\\x4a\\x6f\\x97\\x8d\\x04\\x65\\x54\\x4f\\xba\\x91\\x28\\xbb\\xdc\\x82\\xbd\\xc4\\x87\\xaa\\xd2\\x52\\xc5\\x89\\xd9\\x24\\xd9\\xd0\\x2c\\xd8\\xb1\\x55\\x02\\xb9\\x2a\\x2d\\xd8\\xa7\\xc1\\xe0\\xaa\\xab\\x40\\xad\\x05\\x83\\xae\\xb5\\xb0\\x21\\x94\\xa0\\x89\\xa2\\xf3\\x86\\x44\\x7b\\x69\\xca\\xe2\\x60\\xd5\\xba\\xdd\\x87\\x7b\\xa6\\xbe\\xbe\\x39\\x1f\\x29\\x2c\\x6d\\xf4\\x04\\xcc\\xdc\\x1b\\x9a\\x40\\x6b\\xb6\\xab\\xc9\\x2b\\xb6\\xc7\\x6b\\x06\\x7a\\xda\\xfd\\x87\\x89\\x8c\\x05\\xf2\\x0d\\x01\\x6f\\x5d\\x21\\x12\\x6d\\xad\\xf7\\x72\\x57\\xb7\\xac\\xee\\x8c\\xb5\\x6f\\xbf\\x75\\xa4\\x6d\\xdd\\xb2\\xc5\\xd5\\xf6\\x5a\\xb1\\x29\\x78\\xf0\\xa0\\x38\\x38\\xb4\\x34\\xdb\\xb5\\x2d\\x5b\\xdd\\x9b\\x09\\x86\\x9a\\x87\\x53\\x33\\xc7\\x83\\xcd\\x49\\x8f\\xbb\\xa6\\x39\\x4c\\x4c\\x87\\xbb\\x26\\x4b\\x69\\x92\\x9b\\xfb\\x05\\xfb\\x3a\\x1f\\x82\\x66\\xe8\\x85\\x5b\\x2a\\x19\\x85\\x3a\\x6d\\xc5\\x76\\x44\\xb4\\x4a\\xc9\\xd6\\x9a\\x21\\xb6\\xc3\\xa6\\x55\\x4a\\xfe\\x4e\\xda\\xf4\\x6b\\x15\\x84\\xfb\\xa8\\x19\\xa9\\x32\\x29\\xb8\\xca\\x46\\xc2\\x09\\x39\\xaf\\xe6\\x17\\x4c\\x48\\xc4\\x9d\\x59\\xd9\\x68\\x52\\xe4\\x45\\x48\\x94\\x4d\\x79\\xc1\\xfe\\x14\\x6f\\xf3\\x47\\xea\\x32\\x84\\x54\\x46\\x41\\x6e\\x48\\x11\\xbf\\x68\\xab\\x13\\xec\\xb8\\x81\\xda\\x11\\xa3\\x59\\x92\\x70\\xa7\\xbd\\xe8\\xaa\\x02\\xe9\\x22\\x8b\\x22\\x24\\xf2\\xc4\\xa4\\x34\\x32\\x79\\xd5\\x50\\x13\\x72\\xb9\\x2a\\xc6\\xc4\\xa3\\x7e\\x53\\xed\\x74\\x53\\x1b\\x6d\\x61\\x73\\x53\\x77\\x3e\\xb5\\x61\\xc3\\xfd\\x7b\\xda\\x7e\\xe4\\x5f\\x97\\x6f\\xdf\\x36\\x22\\x66\\x77\\x3d\\x7a\\x25\\x1f\\x97\\x46\\x53\\x6d\\xfb\\xa7\\x5a\\x3a\\x77\\xdc\\xb6\\x24\\x7b\\x48\\x9a\\x18\\xfe\\xf6\\xda\\x03\\x7f\\xff\\xad\\x29\\x74\\xae\\x3d\\x53\\x9f\\x8f\\x9a\\x7a\\x2e\\xeb\\x08\\x31\\x27\\xbe\\xff\\xd9\\xa3\\xe3\\xdd\\x37\\xbd\\x7e\\xb2\\x3c\\xd8\\x1d\\x6d\\x14\\x47\\x77\\x74\\x8e\\x1e\\x9d\\x4c\\x31\\x99\\x31\\x29\\xda\\x79\\xed\\x73\\xd7\\x5d\\xfb\\xe2\\x4d\\xfd\\x89\\xa6\\x6f\\xb5\\x8a\\xab\\x1e\\x2f\\x1f\\xef\\x5c\\x92\\x18\\xde\\x3f\\x8a\\x02\\x0d\\x52\\x65\\xc5\\x8f\\x63\\x78\\x3b\\x68\\xc1\\x40\\xa2\\x00\\x00\\x10\\x31\\x9b\\xa3\\x4e\\xb2\\xa4\\xd1\\x01\\x32\\x8b\\xb2\\x46\\xab\\xfa\\x4a\\x38\\x2b\\x6b\\x17\\x7c\\xa5\\x4e\\xb0\\x63\\x83\\x94\\x69\\x6a\\x42\\x39\\x94\\x60\\x63\\xac\\x23\\xc6\\xa2\\xc7\\x6f\\x41\\x6f\\x7f\\x7a\\x55\\xb9\\xb8\\xf5\\x38\\x62\\x6e\\xe1\\xed\\x5f\\xfc\\x06\\x2d\\x29\\x9f\\x46\\x0a\\x7a\\x0c\\x58\\x98\\x00\\x60\\x5f\\xe5\\x66\\xc0\\x0d\\x09\\xc8\\xc0\\x16\\x28\\xba\\x09\\x97\\x3c\\xac\\x42\\x51\\xa1\\x9c\\xd1\\x29\\xa5\\xaa\\x84\\x9b\\x31\\x8b\\x72\\x15\\x89\\x16\\x9b\\xd4\\xd0\\xca\\xa8\\xe0\\xaa\\x2c\\x89\\xae\\x42\\x48\\x94\\x05\\xab\\x82\\xeb\\x89\\xc5\\xd0\\x1a\\x15\\xea\\x37\\xb5\\x21\\xc1\\x8e\\x4d\\x12\\xc8\\x09\\x12\\x22\\x08\\x12\\xae\\x12\\xb0\\x49\\xc2\\x19\\x3b\\xd6\\x4a\\x99\\xa6\\x9c\\x10\\xbb\\xc4\\x23\\x26\\xe7\\x7d\\xa1\\x88\\xf2\\xe7\\x9b\\x13\\xe8\\xa6\\xab\\x1e\\xdb\\xd7\\xec\\xaa\\x93\\xaa\\x52\\x23\\x2d\\x91\\xf6\\x6b\\xcf\\x7c\\xf5\\xc1\\x62\\xcb\\xea\\xae\\x58\\xa8\\x7b\\xc7\\xf0\\x5d\\x5f\\xeb\\x5d\\x53\\xf0\\xfa\\x9b\\xc7\\x5b\\x1e\\xe6\\x66\\x32\\xab\\xbf\\x32\\x5c\\x33\\x3a\\xd0\\xee\\x74\\xf5\\x4f\\xac\\x6f\\x9c\\xbc\\x7d\\x73\\xcb\\xcb\\xf6\\x86\\xa1\\x7c\\x6a\\xa9\\x14\\x7d\\xce\\x5b\\x2f\\xc5\\x88\\x81\\x21\\xba\\xdc\\x3e\\xf7\\x3e\\xfb\\x11\\x1f\\x82\\x7a\\x42\\xd1\\x1a\\x32\\xcf\\x08\\xab\\x14\\xb5\\x64\\x9e\\x2e\\x32\\x39\\x91\\x4e\\xce\\x6f\\x55\\xe4\\x06\\x42\\x4b\\x57\\x44\\xb0\\x97\\x4c\\x60\\x8e\\x27\\xe6\\x5d\\x3a\\x47\\x03\\xc4\\xf3\\x88\\xea\\x12\\x89\\x69\\x17\\x47\\xb6\\x1e\\x3c\\x22\\x2d\\xbe\\x79\\xff\\xea\\xe0\\x3f\\xe8\\x35\\x88\\xe1\\x43\\x9b\\x47\\x3b\\xb7\\x0c\\xd6\\xd4\\x2d\\xd9\\xd9\\xb5\\xe4\\x40\\xea\\xc9\\xc5\\xff\\x70\\xf4\\xe0\\x8b\\x77\\x2c\\x67\\x0e\\x1f\\x7b\\xed\\xbe\\x5d\\x8b\\x22\\xf5\\x4b\\x77\\xf7\\xee\\x60\\x4d\\x82\\xdb\\xd4\\x37\\x32\\x70\\x5d\\x71\\xcf\\x15\\xf2\\x8d\\xc3\\xeb\\x96\\x1f\\xfc\\x8b\\xeb\\xc6\\x4f\\x7d\\x49\\x64\\x60\\x2d\\x00\\xfb\\x53\\x6e\\x06\\xac\\xe0\\x87\\xd6\\x8a\\xef\\xb5\\xf1\\x15\\xce\\xf8\\x09\\x14\\x0e\\xd0\\x11\\xdb\\xcc\\x0a\\xb6\\xd9\\x68\\xe2\\x88\\x58\\x91\\x20\\x19\\xbc\\xdf\\x56\\x11\\x04\\x95\\xdc\\x1e\\x35\\x79\\x4c\\x48\\xdd\\xa2\\x92\\x77\\x2d\\x5a\\xb2\\xf2\\xc6\\xad\\x4b\\xa3\\xbd\\x7d\\xbd\\x77\\xfc\\xec\\x81\\x89\\x65\\x4f\\xfd\\xa0\\x7a\\xfc\\xba\\x35\\x5b\\xb8\\x19\\x6f\\xaa\\x4f\\x9c\\xfa\\xf7\\xbb\\xbe\\xa9\\xfc\\xf5\\x54\\xe9\\xa3\\xb3\\x7b\\xfe\\xf6\\x48\\x37\\xa1\\xdd\\x21\\x00\\xb6\\xc8\\xcd\\x80\\x11\\x86\\x54\\x69\\x94\\xf5\\xac\\xa2\\x62\\x36\\x8e\\x55\\x4a\\xbc\\x2a\\x92\\x3c\\x81\\x56\\x26\\x3a\\x28\\xbd\\x59\\x4d\\x99\\xd0\\x74\\x8a\\xde\\xa8\\x17\\x31\\x93\\x55\\x73\\x27\\x95\\x84\\x89\\x9a\\x2c\\x51\\x5f\\x87\\xd8\\xee\\xd9\\x87\\xd1\\x67\\x65\\x1d\\xb3\\x9e\\x9b\\x79\\xb5\\xfc\\xea\\xeb\\xe5\\xbb\\x5e\\x55\\x63\\xba\\xdb\\x01\\xd8\\x47\\xb9\\x19\\xd0\\x43\\x8f\\xda\\xef\\x1f\\xf7\\x49\\x08\\x61\\x50\\xfb\\x34\\x5e\\xd8\\x27\\xab\\xaf\\x24\\x6b\\x64\\xe3\\x25\\x1d\\xde\\xce\\xfa\\x66\\xdf\\x44\\xff\\xa3\\xdc\\xc6\\xcd\\xbc\\x5c\\x7e\\xe7\\xc5\\xd9\\xa2\\xda\\x57\\x6c\\xee\\x7d\\xf6\\x0c\\x1f\\x82\\x0c\\x1c\\x86\\x62\\x03\\x99\\x63\\x6c\\x5e\\x3e\\x3c\\xac\\x52\\xaa\\x49\\x36\\x68\\xcd\\xa2\\x5c\\xc3\\x2e\\xe8\\x41\\xd0\\xaa\\xe0\\xa0\\x4d\\xae\\x42\\xa2\\x5c\\x67\\x56\\xb0\\x29\\x5b\\xac\\xaa\\x23\\x5d\\x57\\xd5\\xe8\\x45\\xaa\\x09\\x55\\x41\\xc1\\x5e\\xd4\\x7a\\x1a\\x24\\x49\\xc2\\x75\\x82\\x2c\\x98\\x89\\x7d\\x8a\\x35\\xd0\\xb8\\x51\\x4e\\xd6\\x08\\x76\\x0c\\x12\\xf6\\x08\\x45\\x93\\x39\\x38\\x6f\\x9f\\x2e\\x90\\xb1\\x8b\\xac\\x52\\x3e\\x91\\x8f\\x09\\xaa\\x9c\\xc5\\x72\\x93\\x7b\\x0f\\x5d\\x99\\xee\\x3d\\xbc\\x73\\x32\\x72\\xa7\\xdd\\x6d\\xd2\\x72\\xa6\\xba\\xe6\\xae\\x78\\x6e\\xeb\\xf2\\xa6\\xfa\\xd1\\x1d\\x5d\\x8d\\x1b\\x6b\\xdf\\x43\\xc5\\xf5\\x2f\\x1f\\x38\\xf6\\xd2\\xcd\\x03\\xcc\\xf5\\xb7\\xfe\\xe4\\xde\\x2d\\xed\\xbe\\xaa\\xbe\\xf5\\xad\\x77\\xe9\\xac\\x36\\x9b\\x3e\\xd8\\x54\\xe3\\x6e\\xda\\xf7\\xc3\\xeb\\xaf\\x7a\\xe6\\xfa\\x7e\\x77\\xe4\\xd3\\x97\\x66\\x3f\\x5e\\x3a\\xb0\\x65\\xfa\\x33\\x40\\x34\\x36\\x7c\\x8e\\x9b\\x01\\x1f\\x5c\\x5e\\xb1\\x38\\x2e\\xd5\\xe2\\x60\\x53\\xae\\x64\\xf0\\x52\\x6a\\x1b\\x08\\xb5\\xfd\\x74\\xf6\\x3e\\xab\\x42\\xa3\\x43\\xab\\x82\\x7d\\x74\\x7d\\x0a\\xbb\\xb3\\xb2\\xd3\\xaa\\xd0\\x2c\\x66\\x80\\x84\\x85\\x3e\\x1a\\x16\\xca\\x56\\xa7\\x60\\xc7\\x66\\x09\\x64\\x64\\xa0\\xf6\\x80\\xb0\\x22\\xa7\\x2e\\x33\\x0a\\xb1\\x85\\x56\\x42\\x88\\x09\\x53\\x5f\\x70\\xbc\\x46\\x83\\xd0\\x11\\xf5\\xf3\\x93\\xf2\\x6d\\xdc\\x0c\\xa7\\xe1\\xf4\\x16\\xa7\\xb5\\x3c\\xc8\\x30\\x95\\xe6\\x97\\xa3\\x4c\\xfb\\x6c\\x45\\x3e\\xee\\x03\\x60\\xaf\\xa6\\x72\\xd9\\x0f\\x45\\x23\\x95\\x4b\\x4e\\xc1\\x28\\xab\\x3a\\x19\\x4e\\x47\\x22\\x57\\x2a\\x92\\x0c\\x15\\x8f\\xa2\\x9e\\x99\\x4f\\xe1\\x61\\x43\\xb6\\xc8\\xd0\\x2c\\x1e\\xc3\\x9d\\x17\\xca\\x7c\\x4e\\x48\\xe4\\x63\\xae\\x84\\x10\\x73\\xdd\\xf7\\x87\\x7f\\x67\\xfe\\xfe\\x0f\\x88\\x79\\x9e\\xbd\\xfe\\x85\\x17\\x66\\xae\\x3f\\x43\\xfb\\xcb\\xcd\\x7d\\xc0\\x9e\\xe6\\x66\\x20\\x08\\xa3\\x50\\xf4\\xd3\\x1c\\x03\\xab\\x14\\x05\\xd2\\x99\\x4d\\xa7\\x60\\x47\\x16\\xe1\\x10\\x8d\\x4f\\x5d\\x46\\xa5\\xe8\\xb2\\x90\\x9f\\x77\\x39\\xf4\\x62\\xd1\\xe2\\x22\\x4d\\x8b\\x4d\\x2f\\xca\\x61\\xa2\\x9f\\x46\\xbf\\xca\\x7c\\x9b\\x80\\xd1\\x85\\x29\\x84\\x96\\x7c\\xa5\\x7f\\x35\\x4b\\x90\\xbb\\xcb\\x60\\xd4\\xe9\\xb5\\x26\\x5f\\x54\\x0c\\x8d\\x0c\\xfe\\x9a\\xb9\\xfb\\xc5\\xb6\\xad\\x37\\x8f\\xec\\xf8\\xc1\\x9d\\x98\\xb5\\xba\\x7c\\x66\\x5b\\xc8\\x6d\\xbe\\xe1\\x6e\\xe6\\xf8\\x0b\\x2f\\xcc\\x5e\\x7e\\xf5\\xdf\\xec\\x6d\\x5e\\x4b\\xc7\\x38\\x35\\xf7\\x7b\\xce\\xc4\\x9b\\xc0\\x05\\x5d\\x15\\x3e\\x0a\\x2a\\x1f\\x65\\xa3\\x25\\x97\\x43\\xd8\\x4d\\xd9\\xe7\\x5a\\x60\\x9f\\xec\\x21\\xcc\\x72\\x55\\x62\\x78\\x12\\x6e\\xd1\\x05\\xd7\\x0b\\xd9\\x84\\xc2\\xa8\\x1d\\xe9\\x11\\x8f\\xb4\\x0b\\x3c\\x2a\\xc6\\xbb\\x3c\\x77\\x94\\xab\\xd1\\xaf\\xcb\\xbf\\x2a\\xdf\\x52\\x38\\xcf\\xa7\\x8d\\xe8\\x33\\x9d\\x6e\\xf6\\xe7\\xb3\\xd5\\x26\\x66\\xac\\x63\\xf6\\xf7\\x80\\xe0\\x18\\x00\\xfb\\x04\\x8d\\xf5\\xda\\x2b\\xb6\\x43\\x57\\xb1\\x1d\\xf3\\xfe\\x4b\\x67\\x55\\x8a\\x3a\\xaa\\xb5\\x3a\\x83\\x5e\\xc4\\x60\\xa3\\xc3\\x32\\x91\\x61\\xe9\\xd4\\x61\\xcd\\x0f\\x46\\xa3\\x15\\x62\\xae\\x63\\x5f\\x70\\x56\\x8e\\xe9\\x27\\x7d\\xea\\x3c\\x91\\x19\\xf3\\x8f\\x55\\x59\\xe8\\xa4\\xf6\\xb2\\x0c\\xa6\\x79\\x1b\\x85\\x35\\xb9\\x22\\x47\\xe4\\x17\\xa9\\x9f\\x08\\x9b\\x69\\x77\\x26\\x93\\x82\\x4d\\x36\\x59\\x8b\\x44\\x59\\x63\\x52\\x64\\x0b\\xf1\\x59\\x26\\xc1\\x2e\\x33\\x1c\\xd1\\x4f\\x8e\\x10\\x80\\xd5\\x55\\x08\\x10\\x40\\x39\\x21\\x21\\xb0\\x09\\x56\\xe8\\xfc\\xed\\xbb\\xef\\xfc\\xee\\xa7\\xc5\\xfb\\x9f\\xe0\\x66\\x66\\x1f\\x63\\xd6\\x7e\\xc9\\xb0\\x0f\\x95\\xc3\\xe8\\x5f\\x67\\x36\\xab\\x98\\x14\\xd8\\xb7\\xb8\\x19\\xb0\\xc0\\xb2\\x4a\\xdf\\xc6\\x8a\\xee\\x70\\x39\\x84\\xad\\xb4\\x5b\\x8b\\x49\\xc1\\x16\\x9b\\xcc\\x22\\x91\\x62\\x18\\xad\\x59\\x91\\x6d\\x48\\x94\\x59\\x0b\\xe9\\xda\\x24\\x49\\xb2\\xd6\\x48\\xe3\\xcb\\x0a\\x0f\\x58\\xb3\\x3a\\x84\\x18\\x9a\\x9f\\x79\\x02\\x09\\x7d\\xc8\\x8b\\xee\\xfb\\x80\\xb3\\x72\\xb3\\xe5\\xe5\\xdc\\xcc\\xcc\\x3e\\xf6\\x2e\\x4a\\x83\\x2f\\x47\\xd9\\x57\\x67\\xda\\x81\\x81\\xc4\\xdc\\xfb\\xec\\x07\\x7c\\x08\\x5c\\x50\\x47\\x34\\x42\\xa0\\xf1\\xda\\x7c\\xce\\x81\\x06\\x69\\xf5\\x74\\x2c\\x6e\\xab\\x82\\xdd\\x36\\x39\\x4a\\x7c\\x86\\x55\\x91\\x45\\x24\\xca\\x51\\xb7\\x60\\x97\\x79\\x81\\x90\\xa0\\x3a\\x20\\xd8\\x65\\x30\\x5c\\xb2\\xec\\xc5\\xfd\\xa9\\x25\\xad\\xc4\\xa2\\x63\\xc5\\xfd\\x1b\\x9f\\xb8\\x61\\xb4\\xa6\\x6f\\xed\\xae\\xab\\xda\\x0f\\x16\\xaf\\xed\\xfd\\x75\\x55\\xef\\x9a\\x96\\xc6\\x95\\x3d\\xc9\\xfa\\xbe\\x15\\x75\\x4d\\x6b\\xfa\\x6b\\x99\\x1b\\xee\\xf9\\x3d\\xde\\x3c\\x71\\x6a\\xe6\\xf1\\x6b\\x5f\\xb9\\x6f\\x77\\x7f\\x74\\xdb\\x53\\x9f\\x7f\\xe7\\xea\\xd2\\x57\\xba\\x1a\\xf7\\x3d\\x75\\xeb\\x57\\xf1\\xde\\x4c\\xc3\\xce\\x1f\\x10\\x7f\\xb7\\xbd\\x82\\x45\\x2c\\x10\\x80\\xbe\\x8a\\xb5\\xa7\\xbe\\x2e\\x60\\x50\\x4a\\x66\\x2b\\x10\\x14\\x62\\x26\\xd6\\x37\\xa8\\x92\\xd3\\xaa\\x60\\x6b\\x96\\x50\\x94\\x60\\x44\\x02\\x81\\x42\\x44\\xb3\\x68\\x48\\x79\\x31\\xd0\\x10\\x91\\x0f\\x9d\\x07\\x16\\xdb\\x91\\x7c\\xe5\\x23\\x57\\x34\\x65\\xb6\\x7f\\x67\\xff\\x5b\\x2f\\xe6\\x47\\x9b\\x3c\\xde\\xa6\\x91\\xdc\\x4b\\xdc\\x4c\\xe7\\x15\\xb7\\x2f\\x5b\\x76\\x62\\x7b\\xc7\\xec\\x0c\\xf3\\x5a\\x20\\xdd\\x53\\x53\\xdb\\x9f\\x0d\\x52\\x1c\\x9b\\x28\\xbf\\x43\\x69\\x1a\\x81\\x1c\\x8c\\x83\\x4a\\xca\\xb4\\x41\\xc1\\xde\\xb4\\xec\\x20\\x0e\\xaf\\x99\\x0e\\x27\\x6a\\x55\\x70\\xd4\\x26\\xd7\\x57\\x28\\x9a\\x27\\x31\\x6f\\x94\\x60\\x79\\x87\\x3f\\x40\\x53\\x05\\x06\\x41\\x76\\x7b\\x08\\x75\\xd3\\x0e\\x8a\\xe2\\x69\\x3a\\xe7\\xe2\\x75\\x45\\xad\\xdb\\xe3\\xce\\x65\\x73\\x05\\x2d\\x89\\x76\\x1b\\xd9\\x3f\\x4b\\xeb\\x8e\\x6d\\xb7\\x0e\\xb3\\x6e\\x47\\x92\\xe5\\xfe\\xa7\\xe6\\xd1\\x1f\\x3c\\xca\\xaf\\x3e\\x71\\x59\\xd3\\x7f\\x41\\xf5\\xbf\\xfa\\xf8\\xe1\\x0d\\x8e\\x84\\xdb\\xa9\\xfb\\xe9\\x0d\\x77\\x7b\\xae\\x7e\\xf2\\x5f\\xbe\\x76\\x29\\xf1\\x19\\xd8\\x08\\xc0\\x2a\\xdc\\x0c\\x08\\x10\\x84\\x75\\x15\\x09\\x36\\xe7\\x54\\xf2\\x07\\x0d\\x4a\\xc9\\x66\\xa7\\xe4\\xb7\\x11\\xf2\\x87\\xe8\\x7c\\x09\\xec\\xb3\\x67\\xb1\\xa0\\x96\\x6b\\x10\\xf2\\x87\\x91\\x28\\x7b\\x05\\xc1\\x2e\\x5b\\x4d\\x92\\x84\\xb5\\x02\\xb6\\x48\\x20\\xdb\\x6d\\x14\\x0c\\xe2\\xa0\\x70\\x29\\xfa\\x43\\x31\\x94\\x98\\xe7\\x4b\\x8d\\x88\\x36\\xa2\\x7b\\x0e\\xff\\xcd\\x9e\\x6c\\xa2\\x7b\\x5d\\x01\\x89\\xe5\\x72\\xf9\\xb3\\x7b\\x9f\\xc9\\x8d\\x64\\x3c\\x1b\\x76\\x3c\\xc3\\xcd\\x14\\xb6\\x7e\\x6d\\x55\\xf3\\xae\\xcb\\x86\\xec\\xb3\\xef\\x30\\xb6\\xd9\\x4f\\x99\\xb7\\x7d\\xa9\\x9e\\x9a\\xb5\\x53\\x80\\x40\\x9a\\x7b\\x9f\\x7d\\x92\\x0f\\x41\\x37\\x1c\\x82\\x62\\xe7\\xbc\\x3d\\x0e\\x91\\x61\\xd7\\xe9\\x94\\xe9\\x58\\x67\\x48\\x27\\x62\\x6f\\x0e\\xe1\\x9e\\x34\\xf6\\x9e\\x95\\x1b\\xad\\x0a\\x6e\\xb4\\x51\\x8d\\x6f\\x35\\x2a\\x72\\x2f\\x12\\xe5\\x46\\x2f\\x11\\x7b\\x24\\x49\\xd8\\x22\\x3c\\x65\\x74\\x86\\xea\\x9a\\x3b\\x09\\xb7\\x5a\\xed\\x72\\xb4\\x9a\\x70\\xcb\\xd8\\xa9\\x5a\\xea\\x98\\x30\\x8d\\x9c\\xb9\\x56\\xf2\\x5d\\x9d\\x5d\\x8e\\x36\\x4a\\x17\\x9b\\xed\\xe6\\x46\\x26\\x39\\x9f\\xf0\\x71\\x5f\\x82\\x11\\x3d\\x0b\\x59\\x5f\\xe9\\x6a\\x93\\xd9\\x60\\xd0\\xb9\\x0a\\x83\\x93\\xb9\\x0d\\xbb\\xbd\\xd2\\xc6\\xe1\\x8d\\xb7\\xad\\xae\\xed\\xda\\xff\\xed\\xf5\\x57\\xfd\\x64\\xe8\\x06\\xab\\x59\\xcb\\x69\\xe2\\x5f\\x59\\x51\\xd5\\x5e\\xe7\\xf6\\x74\\x5e\\x31\\xbe\\xe9\\x86\\xa5\\x91\\xa6\\xbd\\x4f\\x5c\\x7b\\xe3\\xd9\\x07\\x7f\\xc2\\x9a\\x6c\\x4e\\x93\\x3f\\x5b\\xe3\\x59\\x7d\\x59\\x28\\x9f\\xcb\\x87\\x92\\xab\\x36\\xef\\xeb\\x1a\\xb9\\x71\\x73\\xeb\\xe6\\xcb\\x9e\\x40\\x06\\x9b\\x43\\x9f\\xeb\\xf7\\x24\\x73\\xc1\\x58\\xbb\\xd4\\x16\\x4b\\xae\\xbc\\x7c\\x77\\xe7\\xe2\\xaf\\xed\\xed\\xdf\\x42\\xed\\x62\\x1d\\x00\\xfb\\x0e\\x37\\x03\\x5a\\x68\\x83\\xa2\\xe6\\xc2\\x5c\\x1b\\x66\\xb3\\x24\\x0c\\xc6\\x9a\\xb3\\x32\\x6f\\x55\\x8a\\xbc\\x86\\x98\\x60\\x9e\\xd5\\x8b\\x45\\x0d\\x4f\\x9a\\x1a\\xd0\\x8b\\x17\\xc4\\xc8\\x31\\x21\\x21\\xd4\\xb1\\x4f\\x94\\xef\\xff\\x15\\x97\\x7f\\xed\\xb5\\x2f\\xdf\\xe0\\xf2\\xf4\\xf7\\x47\\xe7\\x7e\\xc1\\x96\\xb8\\x19\\x88\\xc1\\x00\\x14\\x43\\xa0\\xba\\xc2\\x0a\\x4e\\x73\\x13\\x87\\x13\\xa7\\x02\\x63\\x34\\x2a\\xa4\\x17\\x6c\\x54\\x15\\xd6\\x6b\\x56\\xe4\\x04\\x12\\x65\\xde\\x48\\x2d\\x3c\\x76\\x09\\xb2\\x2d\\xa4\\x16\\xf6\\x08\\x95\\x5a\\x07\\xad\\x30\\xaf\\x00\\x42\\x4e\\xa8\\xc4\\xb0\\xa3\\xff\\x97\\x43\\xbc\\x46\\x8b\\x9c\\x99\\xb1\\xf6\\xce\\xf1\\x26\\xe7\\xcf\\xbb\\xae\\x7c\\x64\\xeb\\xee\\x47\\xf6\\x15\\xd0\\xcb\\xac\\xc4\\x72\\x2c\\x75\\x42\\xb3\\xe6\\xbe\\xdd\\x4b\\x6a\\xeb\\x46\\xf7\\xf4\\xb3\\xf9\\x99\\x37\\x8f\\x3d\\x7d\\xa4\\xad\\xef\\x2f\\x8a\\x74\\xac\\x4e\\x00\\x76\\x86\\xae\\xad\\x74\\x56\\x68\\x01\\x0c\\x0d\\xad\\xe8\\xc2\\x0a\\x9c\\x95\\x91\\x55\\xc1\\x48\\x35\\xd2\\xc4\\x07\\xd1\\x35\\x16\\x44\\x24\\x44\\x43\\x84\\x01\\x34\\x74\\xb0\\x99\\x26\\x47\\x0e\\x39\\x72\\x28\\xe1\\xfc\\x2d\\x32\\x95\\x3f\\x29\\x6f\\xc7\\xdc\\xcc\\xcc\\x61\\xf6\\xc4\\x97\\x1c\\xe9\\xc3\\x04\\xc0\\x96\\xb9\\x19\\x30\\x11\\x99\\x34\\x11\\x4d\\xd2\\xe5\\xd4\\x6e\\x34\\xb9\\x79\\x17\\x84\\xcc\\xf3\\xdd\\x94\\x38\\x13\\x58\\x38\\x11\\x73\\x36\\x59\\x43\\x1d\\x91\\x32\\xad\\xd3\\x6a\\x74\\x62\\x49\\xaf\\xd6\\x2d\\xe8\\xd3\\x25\\x9d\\x5a\\xc0\\x65\\xa9\\x8c\\x05\\x1b\\x25\\xcc\\x09\\xd8\\x20\\xc9\\x3a\\x7d\\xc5\\x61\\x00\\x75\\x5f\\xaa\\xc1\\x26\\x2e\\x2b\\x80\\x72\\x6c\\xc2\\x88\\x12\\xa6\\x0f\\x87\\xef\\xbb\\xfb\\xbe\\xfc\\x3b\\xf7\\x97\\x1e\\x7b\\xfc\\x19\\x6e\\x66\\xe6\\x34\\xf3\\xf3\\xd9\\x6a\\xb6\\xff\\x4b\\x8e\\xd5\\xcd\\x7c\\x46\\xc6\\x2a\\x02\\xb0\\xbf\\xa3\\xf8\\xa9\\xa6\\xa2\\xf5\\x3a\\x55\\xeb\\x31\\x9f\\x23\\xb8\\x89\\xe2\\x22\\x99\\x21\\xfe\\x88\\xa3\\x3f\\x9f\\xd3\\xd3\\x5f\\xd7\\xa3\\x98\\x11\\x89\\x68\\xaa\\xfc\\xc4\\x17\\x1f\\xbc\\xfb\\x9b\\xf2\\x4b\\x68\\x47\\xb9\\xfc\\xab\\x5f\\x30\\xb7\\x33\\x07\\xcb\\x1b\\xd0\\x23\\xb3\\xdf\\x9c\\x3d\\x84\\x4e\\x97\\x97\\xa8\\x7e\\xd9\\x0e\\xc0\\x7e\\xc1\\xcd\\x80\\x0e\\x32\\x95\\x5c\\xef\\x02\\xcd\\xf5\\x0b\\xa9\\x5e\\x03\\x71\\xc6\\xda\\x0a\\x06\\x01\\xed\\x3c\\x99\\x63\\x84\\xcc\\x42\\x42\\xb0\\x23\\x40\\x5a\\xe5\\xb3\\xf2\\xdd\\xff\\x87\\x9b\\x99\\x9d\\x61\\xb8\\x99\\x2f\\xca\\x06\\xf4\\x99\\xfa\\xfb\\x93\\x95\\x38\\xc9\\x42\\xe4\\x9b\\xe2\\x0b\\x2d\\xab\\xd0\\x46\\xc9\\x6c\\x80\\x46\\x4e\\xa4\\xce\\x5f\\x66\\x89\\xad\\xb6\\xa6\\x89\\xcf\\x05\\x59\\xab\\xae\\x54\\xc8\\x1c\\x2b\\xd8\\xb1\\x86\\xcc\\x2b\\x8f\\x62\\xf9\\x98\\x0b\\xd1\\x35\\xab\\x49\\xa6\\x6f\\xf6\\x1f\\xd9\\xc1\\xd9\\xd7\\xd1\\xbf\\xbb\\x03\\x2e\\x97\\xed\\x76\\xf6\\xf1\\xd7\\x6e\\x9f\\x99\\x64\\x0d\\x06\\xed\\x2f\\xd4\\x3e\\x7f\\x3b\\xb7\\x98\\xdd\\xcb\\xaf\\x05\\x2d\\x34\\x41\\x91\\x27\\x7d\\x02\\xa7\\x60\\x2e\\x2d\\x23\\x1d\\xcd\\x2c\\x11\\x1e\\xf3\\x66\\xa5\\xc8\\xc3\\xbc\\x4a\\x61\\x4d\\xb6\\xa2\\x4a\\x9e\\x4a\\x20\\xf2\\x5b\\xe6\\xda\\xf2\\x7a\\xf4\\xe8\\x33\\x1a\\xfb\\xf3\\x5f\\x6e\\x7d\\x46\\xfd\\xdd\\x9d\\x73\\x0f\\xb3\\x0f\\xf0\\x1b\\x80\\x05\\x70\\x14\\x90\\x76\\xe7\\x34\\x73\\xfd\\x34\\x0f\\x1b\\xbe\\xb8\\x7f\\x95\\xfa\\xfd\\xdd\\x73\\x8b\\x59\\xd3\\x7c\\xbf\\xea\\x5c\\x39\\x05\\xb3\\x69\\x02\\x75\\x69\\xbf\\xe8\\xac\\xac\\x31\\x2b\\x45\\xa4\\x99\\x5f\\xc6\\xc6\\x30\\xdf\\x6f\\x2e\\x26\\xc4\\xf2\\x31\\x21\\x76\\x37\\x7a\\xa4\\xbc\\x89\\xb9\\x66\\xf6\\x38\\xf7\\xe0\\xf3\\x9f\\xff\\x46\\xfd\\xdd\\x87\\x98\\xc7\\xd8\\x29\\x1e\\x40\\x03\\x09\\xa8\\x64\\x19\\xe8\\xca\\x34\\xe6\\xb2\\x44\\x33\\x88\\x1e\\x5c\\xb8\\xc6\\x88\\x72\\x48\\x6b\\x44\\x0f\\xa1\\x91\\x25\\xa8\\xfa\\xb1\\xc7\\x5f\\x64\\x3e\\x63\\x74\\xb3\\x9f\\x8d\\xa1\\xcd\\xe5\\x87\\x68\\x9c\\xdd\\xc4\\xbe\\x3a\\xf7\\x29\\xb0\\xe0\\xaf\\x8c\\x91\\xd5\\xa9\\xfc\\xb8\\x60\\xb9\\xd9\\x13\\x73\\xc5\\xda\\xd9\\x93\\x33\\xd7\\xd8\\x5e\\x20\\xfd\\xff\\x8e\\xdd\\xcb\\xdc\\xc7\\x9f\\x00\\x3b\\x44\\x01\\x9b\\xd3\\x25\\x74\\xbe\\x2e\\x02\\xce\\x96\\x74\\x56\\x30\\x70\\x22\\x89\\x70\\x69\\x7d\\x98\\x27\\x8c\\x48\\x40\\xab\\xe6\\x80\\x93\\xbf\\x2b\\xf5\\xba\\x73\\xc1\\x48\\x1d\\xf2\\x56\\xd5\\xda\\xbd\\xd9\\xb6\\x45\\x75\\x7c\\x7e\\xf2\\x54\\x73\\x67\\x30\\x52\\xa8\\x0b\\xd5\\xf9\\x8c\\x26\\xe9\\xc8\\x1e\\xea\\xc7\\x27\\xe6\\x7e\\xc9\\x9e\\x60\\xdf\\x82\\x10\\xe4\\x60\\x3f\\x14\\x5d\\x44\\x12\\x7d\\x64\\x78\\x09\\x5e\\x29\\x5a\\x10\\x89\\x1d\\x78\\xa5\\xc4\\x37\\xfa\\x2c\\x24\\xac\\xd4\\x2e\\x78\\xf6\\xb0\\x51\\xc1\\x61\\xd5\\x68\\x69\\xc4\\x6c\\x56\\x76\\x9a\\x55\\xf7\\x1e\\x26\\x5a\\x61\\x24\\xbe\\xce\\x25\\x94\\xf4\\x16\\x5f\\xa2\\x91\\xe6\\xb4\\x69\\xa6\\xd4\\x2d\\x61\\xbd\\x40\\x14\\xd5\\x42\\xbc\\x5f\\xa6\\xa9\\xd0\\xdc\\xc5\\xb4\\xd3\\xb5\\x64\\x6d\\xb2\\xe5\\xe2\\x14\\xd4\\xbc\\x97\\xa7\\x75\\x1e\\xf1\\x44\\x5c\\x6b\\x61\\x26\\xba\\xbf\\x32\\x7d\\xf5\\x51\\x66\\x72\\xed\\xd5\\x47\\xaf\\xba\\xe7\\xec\\xba\\x6f\\x6c\\x6d\\x79\\xbf\\xe5\\xde\\x91\\xc9\\x6b\\xc7\\x92\\xbf\\x70\\xd7\\xe4\\x42\\xe9\\x91\\xd6\\x1a\\xbd\\x4e\\x37\\x69\\x32\\x2d\\xc9\\xb6\\xf5\\xf9\\xca\\x4b\\xae\\x5d\\x93\\xdd\\xbb\\xf9\\xfa\\x6f\\x3d\\xd8\\xb8\\xe9\\xde\\x1d\\xb3\\xcf\\xad\\xca\\x75\\xa4\\x46\\xb7\\xf7\\x7b\\xeb\\x23\\x8e\\x58\\x63\\xd6\\x6e\\x6d\\x4f\\x31\\x06\\x53\\x4a\\xa2\\x34\\xd8\\x3e\\xf7\\x73\\xf6\\x0c\\xbf\\x1d\\x7c\\xd0\\x08\\xdb\\x2a\\x18\\xcb\\x45\\x53\\x21\\x3a\\xa5\\x68\\x24\\x34\\xa8\\xe7\\xd4\\x15\\x60\\x74\\x56\\xd6\\x19\\x15\\xec\\xcf\\xca\\x8c\\x95\\x56\\x20\\x92\\x30\\xd7\\x66\\x54\\xd4\\x55\\x60\\xa4\\x2e\\xfe\\x56\\x31\\x82\\x7d\\xda\\xe8\\x8a\\xd4\\xd3\\x99\\x47\\x40\\xcd\\x11\\xd7\\x0b\\xd8\\x26\\x61\\xa3\\x9d\\xae\\x44\\xe5\\x84\\x18\\x35\\xe5\\x17\\xae\\xb7\\xd5\\x24\\xb5\\x8e\\x05\\x6c\\x53\\x53\\xf1\\x94\\xdb\\x11\\xa3\\xd3\\x1b\\x50\\xea\\xaa\\x8e\\xf1\\xbb\\xf6\\xf7\\x0e\\x5d\\x75\\xcf\\xe8\\xe2\\x9b\\x33\\x91\\x7e\\x7f\\x66\\x40\\x8c\\x2f\\xe9\\x4a\\x26\\xab\\x83\\xdd\\x99\\xd6\\xc1\\xa4\\x95\\xdf\\x6e\\xb2\\x18\\x4d\\x86\\x72\\x77\\x36\\xdf\\x71\\x64\\xfa\\xc8\\xcd\\xaf\\xdd\\xdc\\xd7\\xdd\\xb1\\x1e\\x29\\x6b\\x8e\\x2d\\xaf\\x8a\\x2e\\xbe\\x7a\\xd5\\xba\\x9b\\x6a\\x23\\x91\\xa6\\xc9\\xbd\\x54\\xae\\x97\\xcd\\x9d\\x63\\x8b\\xec\\x5b\\x50\\x4f\\xec\\x3d\\xcd\\xf9\\x84\\x58\\x45\\x4d\\x05\\x3b\\x74\\x0b\\x39\\x1f\\xaf\\xb1\\x92\\xf3\\x09\\x91\\x98\\x3c\\x21\\x61\\x87\\x50\\x04\\x63\\x9c\\x84\\xed\\xbc\\x9a\\x46\\x59\\x28\\x0f\\xb8\\x34\\xfb\\xd3\\xc5\\xcc\\xa7\\x7f\\x96\\x0d\\x7e\\x75\\x7a\\x4f\\xc7\\x81\\x2d\\x13\\xe1\\xbb\\xf5\\x3a\\x8e\\x65\\x83\\x57\\x8c\\x36\\xaf\\xef\\xaf\\xad\\x5e\\x74\\x99\\x14\\xec\\xec\\xea\\x08\\xdd\\x32\\xfe\\xd2\\x9e\\x2b\\x7e\\x78\\xdd\\x10\\x7a\\x67\\xf7\\xb3\\x27\\x96\\x7b\\x1b\\x07\\x52\\x4f\\x30\\x46\\x8b\\xa0\\xcf\\xf4\\xa4\\xc6\\x0f\\x2c\\xea\\x3f\\xb4\\x2a\\x63\\x0e\\x37\\x25\\x1e\\x58\\xb7\\x7c\\xf4\\xd6\\x67\\x28\\xaf\\x3a\\xe7\\x7e\\xce\\x16\\xf9\\xed\\x90\\x80\\x02\\xf1\\x24\\x6e\\xc2\\xab\\x08\\xa8\\xc8\\x46\\x9d\\x42\\x8e\\x53\\x8a\\x7c\\x8e\\x5a\\x18\\xa3\\x5e\\x44\\xb8\\x55\\xcd\\x9c\\x1a\\x69\\xe6\\x94\\x58\\x54\\x5f\\x63\\x36\\x2b\\x0b\\x46\\x45\\x36\\xd1\\xc5\\x7c\\x59\\x22\\xe8\\xb4\\x4a\\xb0\\x4f\\xf3\\x91\\xba\\x1c\\x81\\x32\\x82\\x80\\xdd\\x12\\xc8\\x75\\x6e\\xc1\\x8e\\xfd\\x12\\xce\\x09\\x04\\xea\\x5c\\x3a\\xe7\\x0a\\x07\\x9d\\x6e\\x4f\\xa2\\x11\\x75\\xa2\\x0b\\xd7\\x5e\\xce\\xaf\\x1f\\x6a\\x3a\\xfb\\x0e\\xdc\\x3d\\x1e\\xec\\x68\\xcf\\xbb\\x54\\x46\\x1a\\x74\\xef\\x99\\x75\\xb6\\x7c\\xd7\\xa2\\xc8\\xe4\\x3d\\xfb\\x7b\\x3f\\x4e\\x76\\x0d\\x27\\xc4\\x81\\xa6\\x80\\xad\\x76\\xa8\\x90\\xe9\\x0e\\x8e\\xa2\\x9f\\x1e\\x7d\\xe1\\xe6\\x41\\x8b\\xaf\\xca\\x85\\xfe\\xd3\\x68\\x31\\x99\\xf5\\x5f\\x2e\\xf6\\xb5\\x47\\xf4\\x55\\x96\\x50\\xa8\\x21\\x6c\\xeb\\xbc\\xf6\\xd9\\x1b\\x56\\x5d\\xbd\\x38\\x5a\\xb5\\xfc\\xd8\\x9a\\x8e\\xbd\\x93\\x4d\\x91\\xc8\\x38\\xa5\\xc9\\xe8\\xdc\\x39\\xf6\\x31\\xaa\\xc3\\xb5\\xb0\\x0b\\x54\\xf5\\x75\\x68\\x2a\\xe4\\xa8\\xd2\\x2a\\xa5\\xb0\\xc5\\xc7\\x9b\\x45\\x39\\x4c\\xd4\\xb7\\x4e\\x8d\\x13\\x88\\xfa\\xd2\\x38\\x61\\x3e\\xcf\\x4e\\x30\\x7a\\xc4\\x22\\xd8\\x8b\\xbc\\xc3\\x47\\x78\\x6c\\x10\\x8a\\x66\\x02\\xcd\\x25\\x90\\x1d\\x44\\x79\\x3d\\x04\\x0b\\x12\\x15\\x0e\\xff\\x71\\x14\\xa4\\xd1\\xc6\\x28\\xe0\\xa3\\xd5\\x53\\x8d\\x4c\\x21\\x56\\xc1\\xe6\\xa3\\xfd\\x47\\xbf\\xb7\\x79\\xe5\\x3d\\xfb\\x7b\\x38\\x66\\xf6\\x0e\\x5d\\xa6\\x7f\\x85\\xd8\\x7b\\x2c\\x75\\xfd\\x37\\xdf\\xdb\\xf1\\xc3\\xeb\\x17\\xff\\x3b\\xfa\\x5a\\xa0\\x69\\xa8\\xa1\\x7e\\x28\\x1f\\x43\\x6f\\x1d\\x7e\\xfe\\xe6\\xa1\\x8e\\xab\\x7f\\x78\\xc8\\x97\\xf1\\x0c\\x6c\\xe9\\x8d\\xb4\\x4b\\xd7\\x3f\\xd1\\xff\\xd5\\x67\\x7f\\x95\\x1a\\xef\\xac\\x8a\\xb6\\x4d\\x54\\xd6\\x46\\xb9\\x08\\x7f\\x18\\x42\\x04\\x89\\x07\\x89\\x4f\\x86\\x34\\xf6\\xe5\\x64\\xa4\\x51\\xb0\\x27\\x8b\\x1d\\x69\\x59\\xa7\\x51\\x8a\\x0e\\x5a\\x97\\xe1\\xa0\\x7c\\x0f\\xa7\\x71\\x90\\x16\\x2a\\x05\\xcc\\x0a\\x76\\x67\\x8b\\x81\\x20\\xf9\\x2e\\xe0\\xd3\\x8b\\xc5\\x60\\x80\\x34\\x83\\x04\\xc8\\x45\\x88\\x84\\xeb\\x1c\\x95\\xc4\\xa0\\x23\\x9f\\x53\\xd1\\xaa\\x47\\x4b\\x83\\x8d\\x44\\x5c\\x13\\x42\\x2a\\xc6\\x3b\\xfe\\xd3\\xee\\x3d\\x77\\x8e\\xbf\\x70\\xfd\\x06\\x9b\\x51\\x63\\xaa\\x6e\\xea\\x8c\\xaf\\x9a\\x44\\xd5\\xe5\\xf7\\xcf\\x31\\x6f\\x9f\\xee\\xdf\\xf5\\xf0\\xee\\xfc\\x83\\xcf\\x38\\x3d\\xf6\\xda\\xb8\\xe7\\xab\\xc7\\x9b\\x4e\\xcf\\xa6\\x98\\xb7\\x81\\x85\\xbe\\xf2\\x43\\xec\\x2f\\xd9\\xf7\\x60\\x00\\xa6\\x60\\x0f\\x3c\\x0f\\x45\\x17\\x61\\xc8\\x4e\\x5e\\x29\\x06\\x48\\x23\\xc8\\x2a\\x38\\x96\\xc5\\xbd\\x69\\x79\\x44\\xab\\xe0\\x95\\x69\\xb9\\x59\\xa3\\x60\\x31\\x2d\\x6f\\xe0\\x15\\x84\\xf7\\xa6\\xb1\\xee\\x2c\\xb6\\x65\\xe5\\x26\\x93\\x82\\xd7\\x64\\x71\\x93\\x0d\\x0f\\x46\\xcf\\x0a\\x32\\x98\\xe8\\x5a\\xcd\\xa0\\x49\\xc1\\x4d\\x36\\x79\\x0b\\x12\\xe5\\x1a\\x93\\x22\\xef\\x43\\xa2\\x3c\\xa8\\x23\\x88\\xcc\\x28\\x49\\xf2\\x96\\x26\\xc1\\xde\\xa3\\x17\\x5d\\x85\\xde\\x91\\x15\\xab\\x36\\xec\\x24\\x22\\x5d\\x23\\x94\\x3c\\x89\\xe5\\x63\\xe3\\xd4\\x24\\xad\\x1c\\x11\\xec\\xc5\\x0e\\x18\\x24\\x6c\\x6e\\x16\\x30\\x2f\\x61\\xd1\\x2e\\xeb\\x9a\\x24\\x09\\x6f\\x10\\x64\\x63\\xa3\\x24\\xe1\\xa0\\xbd\\x64\\x4b\\xd4\\xac\\xd9\\x42\\xfe\\x34\\x20\\x60\\x12\\x92\\x79\\xe6\\xab\\x10\\x5b\\x16\\xd6\\x70\\x3d\\x5d\\xa8\\x1d\\x79\\x08\\x95\\xb4\\x95\\x54\\x6a\\xbc\\x26\\x69\\x41\\x2e\\xa7\\x3b\\x97\\x6d\\xf9\\x53\\xcb\\xea\\x85\\x46\\xa4\\x3e\\xe2\\xb8\\x24\\x88\\xeb\\xb3\\xc7\\x1a\\x03\\x09\\x7f\\x5f\\x2e\\x92\\x89\\xdb\\x3b\\xb7\\xdf\\x34\\x78\\x6c\\x2a\\xb5\\xb3\\xab\\x2f\\xec\\xa8\\x0e\\x39\\x91\\x98\\xb2\\x38\\xa4\\xcd\\x37\\x8d\\x38\\xeb\\xdd\\xc1\\x58\\x5b\\x63\\x62\\x34\\xb2\\xed\\x8e\\xd5\\xc9\\xc2\\xbe\\x53\\xfb\\xaf\\x3a\\xb5\\x2b\\xfb\\xbf\\xaa\\x7b\\x26\\xd3\\x4d\\x13\\x1d\\x71\\x86\\x6d\\xe9\\x5a\\x72\\x5d\\x7f\\x75\\xa2\\xd9\\x55\\xd3\\x12\\x4f\\xb4\\x26\\x9d\\xce\\x64\\x6b\\x22\\x92\\xaf\\xf5\\xec\\xf5\\xe5\\xb3\\x0d\\x82\\x6f\\x20\\x91\\xd9\\x5c\\xef\\x68\\xed\\x19\\x4c\\x2c\\xbe\\xee\\xb2\\xfc\\xa2\\x70\\xe4\\x65\\x96\\xe3\\x18\\x21\\xba\\x28\\xde\\x7f\\x64\\x6d\\x33\\xa7\\x75\\x54\\x79\\x82\\x0e\\x4d\\xcd\\xc0\\x06\\xa9\\x7d\\xef\\xaa\\x5c\\x72\\xd1\\x9a\\xe5\\xa1\\xa4\\xcf\\x28\\x44\\xc4\\x40\\x4d\\x86\\xe1\\xdd\\xed\\xcc\\x0b\\xd1\\xd6\\x7a\\x9f\\xaf\\xbe\\x35\\x1a\\x6d\\x6b\\xf0\\xbb\\xeb\\xda\\x89\\x5c\\x5e\\x0b\\xc0\\x3e\\xc0\\x6f\\x87\\x30\\x2c\\x3e\\x9f\\x57\\xa2\\x3e\\xc3\\x4b\\x4c\\x69\\x64\\xc1\\x59\\x6a\\x55\\x9f\\x11\\xb6\\xc9\\x76\\x24\\xca\\x82\\x59\\xa1\\x79\\x06\\x3b\\x43\\xdc\\xa5\\x97\\xc6\\x54\\x5e\\xe1\\x4f\\x3a\\x07\\x21\\x21\\x54\\xa8\\xe4\\x12\\xae\\x45\\x9c\\xce\\x60\\x40\\xd9\\x9b\\xfb\\x87\\xaf\\x99\\x48\\xfd\\xab\\xb3\\x2a\\x1b\\x11\\x47\\x0a\\xd1\\x79\\xeb\\x9f\\x6e\\xe9\\x6d\\xb8\\xfc\\x5b\\xbb\\x67\\xcf\\x30\\x7d\\x85\\xb1\\x9c\\x37\\xde\\xb5\\xba\\x79\\xf6\\x5d\\xb5\\x3e\\xff\\x55\\x00\\x76\\x33\\xbf\\x13\\xf4\\x10\\x82\\xcd\\x15\\x04\\x82\\x78\\x5a\\xc3\\xb2\\xb0\\x06\\xe8\\x4b\\x97\\xac\\x06\\xf0\\x72\\xaa\\xf2\\x30\\x67\\x65\\xad\\x51\\x29\\x6a\\x69\\x72\\x50\\xab\\xd7\\x8b\\x45\\x46\\x4b\\x33\\x83\\xa0\\x17\\x31\\x63\\x9b\\x76\\x33\\x06\\x8b\\x58\\xd9\\x64\\x41\\xad\\x88\\x96\\xcc\\xc5\\xea\\xa3\\xe1\\x4a\\x25\\x67\\x28\\xe4\\x5c\\x97\\x96\\xff\\xbe\\xfa\\xcb\\x0f\\xd0\\x8b\\x6f\\x97\\xd3\\xf6\\xaa\\x96\\xaa\\x50\\x73\\xd2\\xe3\\x49\\x36\\x87\\x42\\xf9\\xa4\\xa7\\xc8\\x4c\\x15\\x67\\x7e\\x5f\\xe4\\x3e\\xf2\\xa6\\xab\\x3d\\xae\\x44\\x26\\x10\\xc8\\x54\\x39\\x9d\\x55\\x19\\x60\\xa0\\xbd\\x7c\\x1f\\x1b\\xe2\\x0f\\x42\\x10\\x32\\xb0\\x1a\\x8a\\x88\\xd8\\x7c\\x07\\x19\\xb4\\x9d\\xa3\\xbb\\x01\\x8c\\xac\\x82\\x1b\\xd2\\xa5\\xb8\\x01\\x3c\\x64\\xec\\x4d\\xb4\\x82\\xc9\\x65\\x54\\x8a\\x36\\x9a\\x60\\xb4\\xd9\\xf5\\x22\\xb6\\xd9\\xa6\\xdd\\xb6\\x90\\x45\\x2c\\x25\\xd5\\x01\\x67\\x91\\x28\\xbb\\x6c\\x82\\x5d\\x8e\\x37\\xd0\\x01\\x7b\\x0a\\xe7\\xeb\\x95\\x28\\x22\\x54\\xc5\\xf9\\xd2\\xd1\\xb7\\x7f\\xdd\\xa0\\xe5\\xb5\\x06\\x43\\xb8\\x5a\\xf4\\x44\\x5a\\xeb\\xbc\\xe5\\x12\\x93\\xeb\\xbc\\xe2\\xeb\\xe3\\x9b\\xfe\\x12\\x1d\\x73\\xd4\\xe4\\x13\\xa1\\x7c\\xad\\xd7\\x5b\\x9b\\x0f\\x85\\xf2\\xb5\\x9e\\x37\\x7e\\xc4\\x19\\x6c\\x2e\\xab\\x25\\xec\\xb7\\x79\\xb2\\xcb\\x5a\\x99\\xf7\\x9f\\x9b\\x39\\xb4\\xe7\\x2f\\xb7\\xa4\\xc7\\x35\\x8c\\xaf\\x29\\xe9\\x71\\x55\\x67\\x83\\x81\\xa6\\x6a\\xb7\\xbb\\xba\\x89\\xc8\\xd1\\xdc\\x67\\x1c\\xc7\\x6f\\x07\\xf7\\x3c\\x86\\xc5\\xf6\\x5c\\x51\\x8f\\x08\\x3c\\xf4\\xa8\\xc9\\xa9\\x05\\x19\\x92\\xbd\\xc4\\x66\\xe9\\x09\\xd0\\xd2\\x39\\xa5\\x0b\\x04\\x06\\xb9\\xdb\\x11\\x09\\xbe\\x79\\xa4\\x9d\\x97\\x14\\xb4\\x7f\\xb8\\xe1\\xde\\xf2\\xd1\\xdc\\x81\\x83\\x7b\\xd3\\xe5\\x8f\\xcb\\xaf\\x2c\\x23\\xa2\\x62\\x30\\xe9\\x67\\xd3\\x68\\xb7\\x50\\x3e\\xde\\xf9\\xad\\x07\\xee\\x6e\\x33\\xa0\\x67\\x96\\x94\\x1f\\x00\\x04\\x27\\x00\\xd8\\x6b\\xf9\\xed\\xa0\\x87\\x8e\\x8b\\x24\\x84\\x02\\x54\\x5e\\x5d\\x51\\xf8\\xaf\\xa4\\x62\\x7e\\x4d\\x21\\x1f\\xa3\\xbc\\x8f\\xb9\\x4e\\x20\\xcd\\xe7\\xe8\\x1c\\xd2\\x14\\x39\\xa6\\xf8\\xe5\\x68\\x71\\x3e\\x27\\xf8\\x36\\xfb\\x11\\xd4\\xc1\\x8e\\x4a\\x1f\\xce\\x60\\x2e\\x57\\x44\\x08\\xc4\\x69\\x1b\\xd2\\x58\\x44\\x6c\\xc9\\x11\\xec\\x89\\x7d\\xd9\\xf9\\xb4\\x5c\\x9d\\x49\\xc1\\x4c\\x16\\xd7\\xa9\\x2b\\x6b\\x41\\x13\\x5d\\x5f\\x20\\xc0\\xd3\\x69\\x52\\x93\\x74\\xc1\\x90\\x60\\x97\\x35\\xc4\\xf2\\x39\\x5d\\x82\\x9d\\x66\\x58\\x50\\x42\\xb0\\xcb\\xac\\xb1\\x92\\xaf\\x74\\xa9\\xaa\\xe4\\xb9\\x40\\xa3\\x6a\\x12\\xf1\\x8b\\x34\\xab\\xef\\x95\\xd4\\xba\\x5a\\x87\\x58\\x57\\x63\\x4d\\xec\\xca\\x17\\x86\\x1b\\x1c\\xef\\x04\\xe2\\xcb\\xde\\x36\\x0a\\x2e\\xa3\\x23\\xe2\\x36\\xb1\\xaf\\x75\\x64\\xea\\x8d\\x81\\x86\\x68\\x6b\\x5b\\xf5\\xf0\\xde\\xa1\\xd9\\x4e\\xe6\\xc1\\xb1\\x81\\x33\\xb3\\xb7\\x33\\xdf\\xcc\\x75\\xc7\\x4d\\x42\\xdd\\x60\\xcb\\xec\\x2d\\x6a\\xcc\\x40\\xed\\x01\\xfb\\x16\\xf8\\x16\\xf2\\xad\\x26\\x75\\x76\\x45\\xcd\\x02\\xbe\\xaa\\x2c\\x15\\x18\\xe9\\xb4\\x7c\\x36\\x12\\x4e\\xca\\x26\\xb3\\xba\\x3e\\x60\\xf6\\xd1\\xd8\\x0b\\x64\\xe4\\xa8\\x54\\xf8\\x9c\\x1f\\xff\\xc5\\xa6\\xe0\\x97\\xd9\\x9b\\xfb\\x17\\x5f\\xb3\\xe2\\xbc\\x15\\x60\\xcf\\x6c\\xfe\\xf3\\xfa\\xdf\\x3e\\x77\\x8e\\x7d\\x95\\x7d\\x0b\\x1c\\x50\\x0d\\xfd\\x95\\x75\\x33\\x1f\\x57\\xc1\\x08\\x31\\x02\\x6f\\x6b\\xe8\\xa8\\x9c\\x56\\x05\\x3b\\x6d\\x72\\xb0\\x82\\x0a\\x92\\x84\\xbc\\x4e\\xe2\\x58\\xac\\x74\\x99\\xc6\\xf7\\xa7\\x72\\xa0\\x17\\xd8\\xf8\\x96\\x79\\x8b\\xde\\x3e\\x7c\\xdd\\xf7\\x2f\\xbf\\xec\\x91\\xa3\\x03\\xfd\\x87\\x1f\\xdd\\xb8\\xf1\\xfb\\xc7\\x86\\x3e\\x89\\xb4\\xad\\xc8\\x6d\\x3d\\x1c\\xeb\\x98\\xc8\\x34\\x8d\\x4b\\x51\\xf4\\xce\\xde\\xe7\\x6e\\x5b\\xda\\x7f\\xc3\\x99\\xc3\\x87\\xcf\\xdc\\x38\\xb0\\xe4\\xd6\\x67\\xae\\x59\\x72\\x78\\xb2\\xf1\\x91\\x6f\\x2f\\x3b\\xb2\\x42\\x14\\x27\\xae\\xa6\\x63\\xde\\x5f\\x7e\\x9c\\x7d\\x8d\\x7d\\x0b\\xdc\\x50\\x4b\\xbc\\x3e\\xcd\\xdb\\x06\\x49\\xd4\\x44\\xc8\\xa9\\xa5\\xe0\\x46\\xa7\\x60\\x77\\x9a\\x82\\x1a\\x37\\x55\\x79\\x19\\x79\\xb2\\x59\\xec\\xb2\\xc9\\x31\\x42\\xd3\\x0a\\xac\\x89\\xb9\\x04\\xbb\\x2c\\x68\\xc9\\x04\\x82\\x82\\x60\\xc7\\xce\\xf9\\xd5\\x57\\x98\\xcf\\x5b\\xb8\\x2e\\x2c\\x03\\xab\\x49\\x0a\\x89\\x0b\\x90\\x38\\x99\\xcd\\xfe\\x0f\\x3c\\xad\\x1d\\x9d\\xa1\\xc9\\xbb\\xf7\\xf7\\xf4\\xed\\xbf\\x6b\\xbc\\xe3\\x48\\xdd\\x47\\x1f\\x11\\x0c\\x9e\\x58\\xd2\\x99\\xdc\\xbf\\xb3\\x30\\x58\\x6b\\x65\\xcf\\x6c\\x8e\\xa6\\x42\\xe6\\xde\\x1b\\x5f\\xbd\\xf9\\xc8\\x53\\x5f\\xe9\\xcc\\x89\\xe5\\xdd\\x6c\\xe7\\x3c\\xfa\\xfe\\xcb\\xc7\\x9a\\x56\\xec\\xad\\xf0\\xa1\\xfc\\x38\\x7b\\x37\\xfb\\x16\\x78\\xa1\\x9e\\xcc\\xc9\\x49\\xe6\\x14\\x66\\xd5\\x30\\x43\\x65\\x46\\x0d\\xa7\\x60\\x4b\\x7a\\x1e\\x85\\x13\\x29\\xf1\\xa9\\xc9\\x39\\x43\\x2c\\x9b\\x95\\xcd\\x2a\\x2a\\x97\\x2d\\x84\\x13\\xbc\\x93\\xcc\\x29\\xec\\xa4\\x95\\x10\\xb8\\x86\\xe2\\x54\\xe3\\x25\\x38\\x95\\x18\\x62\\xe1\\xa2\\xca\\xa0\\x05\\x16\\x75\\xed\\xb9\\x77\\x75\\xa8\\xb7\\xab\\x60\\xff\\xe0\\x23\\x67\\xbe\\xbd\\x2b\\x34\\x79\\xf7\\xde\\x9e\\x8f\\xa3\\xad\\x23\\xf5\\x53\\x9b\\x03\\xb9\\xc5\\xa9\\xda\\xa1\\x96\\x08\\x3a\\x77\\xf0\\x99\\x1b\\x87\\x2c\\xfe\\x2a\\xf7\\xd2\\x2f\\x7e\\x83\\xee\\xf7\\x54\\xfb\\xcd\\x23\\xb7\\x9d\\x39\\x3a\\x7c\\x64\\x65\\xfa\\xa1\\xef\\x4e\\x5c\\x33\\x92\\xa8\\x5b\\x76\\x90\\xca\\xfd\\x69\\x00\\xf6\\xc7\\xec\\x5b\\xe0\\x02\\x69\\x7e\\x4d\\x92\\xcc\\x48\\x47\\x66\\x64\\x65\\x95\\x85\\x05\\x16\\x2a\\xf4\\xb2\\x87\\x58\\x30\\x2b\\xa8\\x59\\x50\\x24\\x5c\\xa8\\xa9\\xac\\x9a\\x2a\\x54\\xa3\\x09\\xe1\\xf4\\x27\\x9e\\xb6\\xbe\\xe1\\x9a\\xf1\\xbb\\xa5\\xdd\\xd9\\xf5\\x8d\\xf9\\x75\\x03\\x49\\xf6\\xcc\\x4e\\x7f\\x63\\xdc\\x91\\x6b\\x39\\x37\\xd0\\x93\\x5a\\xba\\x43\\x2a\\x9b\\x2a\\x75\\xae\\xe7\\xd8\\xfb\\xd9\\xb7\\xa0\\x07\\xfe\\x19\\x8a\\x5d\\x74\\xcd\\x4b\\xa7\\x14\\xc3\\xa4\\xfb\\x06\\x5e\\x29\\x36\\x84\\x89\\x91\\x6a\\x88\\x13\\x60\\xd8\\x9b\\xc6\\xbe\\xb3\\x14\\x57\\x35\\xd1\\xfa\\x09\\x59\\x32\\x2a\\x72\\x9f\\xba\\x85\\xec\\xd7\\x91\\x97\\xde\\x53\\x77\\x8c\\x39\\x6c\\x58\\x78\\x51\\x6e\\x16\\x3e\\xc7\\x85\\x17\\xb1\\xc3\\x36\\x6d\\x77\\x08\\x0e\\x11\\x37\\xdb\\xa6\\xf3\\xcd\\x05\\x87\\x38\\xdd\\x42\\xde\\x8b\\xf9\\xe6\\x42\\xf4\\x64\\xf4\\x64\\x42\\x63\\x11\\xec\\x12\\x6e\\x91\\x8a\\x76\\x87\\x20\\xd8\\x25\\x78\\x4a\\x68\\xb1\\x3b\\x9a\\xf3\\xea\\x0e\\x2e\\x74\\xd1\\x15\\xee\\xf1\\x23\\xb9\\x89\\x70\\x0f\\xf1\\x92\\x84\\x4d\\xc2\\xb4\\x3e\\xdc\\xd0\\x45\\x80\\x96\\x64\\x97\\x63\\x35\\x74\\x23\\x54\\x97\\x9a\\x5d\\x6d\\x10\\x8a\\x88\\x60\\x71\\x82\\xb9\\x71\\x4c\\x4d\\xad\\xa2\\x0b\\x53\\xab\\xe8\\xc2\\xec\\x2a\\xdd\\xfe\\xc4\\x9e\\x4f\\xaf\\xce\\x23\\xb2\\x8d\\x87\\x4d\\x26\\xbd\\xad\\x63\\xc9\\x78\\xf5\\xc4\\x5a\\xa7\\x38\\x98\\x0b\\x16\\x82\\xad\\x53\\x9d\\x51\\x69\\xeb\\xed\\x2b\\xf6\\xfe\\x68\\xd9\\x3e\\x9d\\x9e\\xe7\\x58\\x7b\\x4b\\xef\\x70\\x55\\xa4\\x55\\xf4\\x05\\x5a\\x26\\x5a\\xff\\xf6\\xbb\\x6d\\xbb\\xbe\\x75\\xd9\\xd1\\x37\\x6f\\x78\\x97\\xf1\\xb9\\xfd\\x4d\\xb5\\xde\\x74\\xda\\x5b\\x15\\x09\\x58\\x75\\x36\\xa3\\x2b\\xdf\\xb7\\x22\\x97\\xdb\\x3e\\x9e\\x5b\\x36\\x75\\x4a\\x6f\\xb6\\x6a\\xdc\\x75\\x61\\xbb\\xde\\x19\\xf5\\xf8\\x13\\x21\\xbf\\x35\\x73\\xdf\\xa6\\xde\\xab\\xd6\\x34\\x2f\\xa5\\xfc\\x38\\x34\\x77\\x8e\\x7d\\x94\\x7b\\x0d\\xe2\\x70\\x59\\x65\\x4d\\xd0\\xa1\\x57\\xa8\\x4c\\x60\\x9d\\x5a\\x4e\\x6b\\xc8\\x22\\x9c\\x48\\xe3\\xc8\\x59\\xd9\\x66\\x55\\x8a\\xb6\\x08\\x75\\xd5\\x06\\xbd\\x58\\x8c\\xd8\\xe8\\x26\\x33\\xe2\\x50\\x68\\x78\\x1d\\x11\\xec\\x45\\x86\\x8d\\xab\\xa1\\x88\\x5f\\x0d\\x45\\x40\\x90\\xdd\\x11\\x49\\x45\\xec\\xdd\\xc8\\xa9\\xb1\\x12\\x94\\x4e\\xa0\\xe7\\x45\\xc5\\x07\\x04\\xac\\x1e\\x7a\\xdf\\x52\\xb6\\x69\\x5c\\x28\\x56\\x7e\\x97\\x35\\x6b\\x3d\\x62\\x22\\x7e\\x60\\x68\\xf1\\xe4\\x77\\x97\\x8f\\x1d\\x1a\\x49\\xe8\\x8c\\x2c\\xf3\\xdc\\x87\\xa2\\x3f\\xee\\x7e\\xf6\\xb9\\x25\\x0f\\x2d\\x5d\\x76\\x60\\x30\\xd6\\xde\\xf2\\x77\\x1d\\xbd\\xa9\\xcb\\xef\\xd9\\x31\\xf0\\xc6\\xd7\\xd4\\xdc\\xd3\\xbb\\xec\\x03\\xec\\x19\\x88\\xc0\\x52\\xb5\\xae\\xbe\\x18\\x20\\x93\\xd1\\x70\\x95\\xc9\\x98\\x72\\x74\\x93\\x22\\xd0\\xea\\x73\\xcc\\xaa\\x6b\\xbe\\xae\\x2c\\x09\\xb0\\xa8\\x0d\\x32\\xb2\\x82\\x1d\\x07\\x68\\xec\\x64\\x97\\x40\\xd6\\xd8\\x69\\x1e\\x84\\xe6\\x73\\x85\\x4a\\x31\\x0d\\x6d\\x5d\\x18\\x45\\xee\\xfc\\xd7\\x91\\x2e\\x62\\xd0\\x7f\\x69\\xd4\\xfd\\x8b\\x49\\xe7\\xea\\x18\\x1c\\x8e\\x8f\\x5c\\x33\\x21\\xa2\\xed\\xcc\\xaa\\xd9\\xc7\\xf7\\x6d\\x4b\\x74\\xad\\x6e\\x66\\x3a\\x67\\x9e\\xf6\\xb7\\x91\\xc8\\x30\\x42\\x20\\x73\\xc3\\xc6\\xfb\\x01\\x41\\x0e\\x80\\x7d\\x9e\\x3d\\x03\\x02\\xd4\\xaa\\xd6\\x92\\x5a\\x4a\\x6c\\xcc\\x21\\x6c\\x4f\\x63\\xe3\\x59\\xea\\x64\\x1c\\x44\\xf5\\x40\\xa8\\xac\\x07\\x39\\x08\\x72\\x70\\x05\\x50\\x17\\x2a\\xe4\\x2c\\x48\\xcb\\x26\\x72\\xc8\\xc5\\xf3\\xfc\\x7b\\x97\\x55\\x75\\xd9\\xdf\\xf7\\x0e\\x65\\xde\\x39\\xc3\\x9e\\x31\\x5a\\x2d\\x56\\xc3\\xec\\x83\\xc8\\x72\\xc5\\xbb\\xab\\x77\\x9c\\x3b\\x30\\xfb\\x05\\xa1\\x8b\\x0d\\x80\\xfd\\x25\\x7b\\x06\\x42\\xf0\\xae\\x9a\\xdf\\xc6\\xfe\\x9c\\xda\\x9d\\x23\\x47\\xe1\\xa3\\xf1\\x6c\\xc9\\xa4\\x26\\x71\\x4d\\x36\\xd2\\x29\\xcd\\x10\\x45\\x54\\x2d\\xfb\\xf1\\x2b\\xff\\xc7\\x49\\xb4\\x0c\\xfb\\x1b\\x2d\\x38\\xf0\\xa2\\x6c\\xb6\\x7f\\xce\\x61\\xd3\\x8b\\xcf\\x75\\xaf\\xfb\\xfd\\x6f\\xc8\\x7d\\xd9\\x64\\xd6\\x61\\xb3\\xcd\\x82\\xad\\x2f\\xca\\x5e\\xed\\xe7\\xd8\\xf5\\x22\\x36\\xdb\\xa6\\x2d\\x66\\xab\\x43\\xc4\\x5e\\xdb\\xb4\\xdb\\xeb\\x72\\x88\\xd3\\x1e\\xf2\\x5e\\xb4\\x98\\xad\\xe7\\x35\\xb0\\xe8\\xf1\\xba\\x88\\x22\\xba\\x25\\xe8\\xd1\\x9b\\xcc\\x01\\x8b\\xd5\\xe5\\xf6\\x78\\x17\\xb6\\x52\\xa2\\x1e\\xbd\\xd9\\x7f\\xe9\\x4d\\xaa\\x8f\\x4e\\xe2\\x6c\\x7d\\x12\\xc8\\x40\\xf7\\xb6\\x19\\xd5\\x9c\\x31\\x21\\x4d\\x10\\x79\\x02\\x28\\xe7\\xe8\\x62\\x3b\\x51\\xce\\xc2\\x6a\\x13\\x46\\x94\\xb0\\x95\\xb5\\x3a\\x2d\\x33\\x75\\xf8\\x8e\\xe3\\x36\\x87\\x91\\x7d\\xcf\\x1c\\xad\\xa9\\x77\\xbf\\x71\\xec\\x9a\\xb7\\xd8\\x33\\x46\\xb3\\xc1\\x68\\xe0\\x8d\\x9a\\xd9\\xc7\\x99\\xfc\\xec\\x9b\\x3b\\xff\\xee\\x3b\\x47\\xab\\xbb\\xf7\\xfd\\xe7\\xe7\\xbf\\xdb\\xc3\\x38\\x67\\x3f\\x51\\xf1\\x01\\xe1\\xd1\\x3b\\xec\\x19\\xb0\\x2c\\xe4\\x96\\x8d\\xb9\\x22\\x8b\\x2a\\x79\\xf0\\xf9\\x4c\\x2c\\x4b\\xc0\\x1d\\xaf\\xae\\x75\\x22\\x48\\xc6\\x02\\x28\\x87\\xdc\\x76\\x4f\\xcc\\x88\\x72\\x68\\x49\\xf9\\x5f\\xaa\\x10\\xf3\\xf2\\x73\\x9f\\x95\\x7f\\x7a\\x7d\\x31\\x59\\xfe\\xe2\\xad\\x57\\xd1\\x47\\xe8\\xd1\\x5c\\xf9\\x0d\\x94\\x2f\\x67\\x4e\\xcf\\x41\\x0b\\xea\\x2f\\xab\\xeb\\xf2\\x9e\\xf2\\x7d\\xec\\x1b\\xec\\x19\\x48\\x82\\x08\\x45\\x2b\\xe9\\x23\\x98\\xc3\\x35\\x69\\x59\\x4f\\xdc\\x7d\\x6d\\x9a\\xd6\\x5a\\xca\\xfa\\x4a\\xc5\\x85\\x55\\x90\\x91\\x9b\\x74\\xe8\\xb9\\xa0\\xa2\\x14\\x51\\xf1\\x70\\x14\\xba\\x58\\x55\\x3c\\x88\\x7c\\x7a\\xae\\x34\\x19\\x34\\x1a\\xad\\xa5\\x2e\\xe2\\xae\\x4d\\xd6\\x38\\xca\\xdf\\x46\\x3e\\x4e\\xc3\\xbd\\xb3\\xde\\x91\\x08\\x7b\\xf5\\xef\\xfb\\x96\\xa4\\x7e\\xed\\xef\\x1f\\x5b\\xd7\\x74\\x47\\xf9\\x55\\x8d\\xc5\\xee\\x34\\xf9\\xbc\\xf6\\x86\\xc5\\x2d\\x2c\\x56\\xa5\\xe8\\xc9\\x99\\xdc\\x9e\\x5d\\x5b\\xc4\\x1d\\x1f\\x5c\\x39\\x7b\\xd7\\xc0\\xe6\\xae\\x90\\xba\\x36\\x0f\\xc0\\x3e\\xc6\\x3e\\x06\\x16\\x28\\x5c\\x92\\xab\\x96\\xcd\\x06\\xa5\\xc8\\x11\\x23\\xce\\xb2\\xff\\xed\\x44\\xf5\\x14\\xfa\\xb4\\x5c\\x60\\x66\\xca\\x6e\\x34\\x6d\\xf3\\x7a\\xdc\\xd6\\x3b\\x99\\x55\\x2f\\xdf\\x39\\xfb\\x18\\x32\\x18\\x75\\xe7\\x68\\x7f\\xeb\\xcb\\xcf\\xb1\\xab\\x78\\x1f\\x74\\xc2\\x4e\\x50\\xb7\\xf2\\xd9\\x38\\x1a\\x79\\xd7\\x6a\\xd4\\x42\\xc8\\x4a\\x65\\x62\\xeb\\x59\\x99\\xcf\\x65\\xb3\\xb4\\xe4\\xdc\\x51\\x9d\\xcd\\x16\\xa3\\xad\\xc4\\x32\\x45\\x2d\\x7a\\x11\\xd7\\x65\\x69\\x65\\x62\\xb4\\x95\\xaa\\x37\\xc8\\xb5\\xa2\\x60\\xc7\\x29\\x6a\\x98\\xa2\\x39\\x49\\xc2\\x88\\x6a\\xbd\\x4d\\x90\\x0d\\xde\\x8a\\x99\\x52\\x8d\\x76\\xbe\\xb9\\xa5\\x1d\\xb9\\x12\\x71\\x0d\\x31\\x55\\x2e\\xa7\\xa6\\x52\\xef\\xe5\\x72\\xba\\xe9\\x6d\\x6a\\xd5\\x89\\x49\\xa7\\x4e\\x7a\\xfd\\x64\\x77\\x17\\x62\\xd0\\x2b\\x2f\\x9f\\x7a\\xbd\\xaf\\x1b\\x31\\x68\\x69\\x7f\\x24\\x57\\xe3\\x42\\x0c\\x9a\\xda\\x76\\xe7\\x21\\xd7\\x8a\\xcb\\xd7\\x87\\xbb\\xbb\\x18\\x86\\xb1\\x85\\x53\\x41\\xf4\\xc4\\xe9\\xa5\\xab\\x4d\\xe9\\x5c\\x83\\xee\\xe9\\xe7\\x9e\\x9d\\x98\\xb0\\xa4\\x32\\xf5\\x86\\x75\\x5f\\x6f\\x70\\xb6\\x8f\\xac\\xc9\\x1a\\x0b\\x52\\x9a\\xbb\\xe2\\xb2\\xa7\\x78\\x6b\\xc0\\x93\\xf9\\xce\\x76\\x5b\\xbe\\xad\\xd5\\x99\\xeb\\x4b\\xda\\x00\\x10\\xba\\xbb\\xfc\\x06\\xb3\\x9f\\x2f\\xd0\\x3d\\x50\\x08\\x73\\xf3\\x96\\x8c\\xbe\\xd4\\xa4\\x34\\x12\\x72\\x02\\xba\\xfb\\x67\\xe5\\x37\\x34\\x7b\\x3e\\xbf\\x87\\xd2\\xef\\x89\\xf2\\x73\\xec\\x29\\x4a\\xbf\\x5d\\x50\\x59\\x36\\xe3\\x14\\x9c\\x48\\xcb\\x55\\x1a\\x05\\xdb\\xd2\\xb2\\xb9\\x42\\xbf\\xd4\\x59\\xb9\\x36\\x9f\\xcd\\xd2\\x50\\x8c\\x37\\xf8\\xb3\\xd9\\x6c\\x31\\x45\\x23\\xb2\\x14\\xd2\\x8b\\x38\\xa1\\x52\\xd0\\x95\\x12\\xec\\x38\\x2b\\x81\\x5c\\x95\\x10\\x68\\xa9\\xb3\\x4d\\x90\\xfd\\x29\\x49\\xc2\\x66\\x72\\x9b\\xd0\\x93\\xcf\\xcf\\x53\\xd0\\x7d\\x21\\xa9\\x54\\x3f\\xa7\\xee\\x68\\xa7\\x45\\x72\\x15\\xfa\\x2e\\x6c\\x96\\x24\\xd8\\xed\\x89\\x53\\x2f\\xbf\\x82\\x18\\xd4\\xd5\\x3d\\xb9\\x2a\\xd4\\x10\\xb6\\x31\\x0c\\xd3\\xd5\\x1d\\x5e\\x7f\\xf9\\x0a\\xd7\\xa1\\x3b\\xb7\\x4d\\x21\\x06\\xb9\\xaa\\x9b\\x23\\xfd\\x4b\\x11\\x83\\xba\\xfb\\xb8\\x8d\\xcf\\x3e\\xf7\\xb4\\xae\\x21\\x97\\x36\\xad\\x5e\\x7a\\xda\\x96\\xec\\xcb\\x39\\x5b\\xdb\\xf2\\xb6\\xed\\xdf\\xc9\\x78\\x02\\x56\\xfe\\xa9\\xcb\\xae\\xe0\\xd2\\x52\\xc1\\x98\\x5d\\x33\\xd2\\xee\\x6c\\xf8\\xfa\\x3a\\x43\\x7d\\x26\\x65\\x99\\x98\\x50\\x75\\xba\\xc0\\x9c\\x60\\x3f\\x60\\x7f\\x09\\x09\\xc8\\x02\\x8e\\xa6\\x65\\xde\\xa0\\x60\\x7b\\x76\\xda\\xcc\\x47\\x75\\xa2\\xec\\x35\\x28\\x08\\x57\\xa5\\xe5\\x6a\\x22\\xb8\\x51\\x2f\\xc1\\xcf\\x09\\x49\\x92\\x79\\x33\\xdd\\x32\\xb4\\x50\\xb0\\x3a\\xaf\\x71\\x1e\\xa2\\x62\\x95\\xd4\\x93\\xb6\\x10\\x59\\x3e\\x39\\x59\\x15\\xc9\\xa5\\x1b\\x03\\xc1\\x66\\x8f\\x2b\\x51\\x5d\\x1f\\xf8\\x76\\x70\\x60\\xf9\\xca\\x86\\xec\\x78\\xc8\\x55\\x53\\x95\\xf4\\x44\\x86\\xeb\\x59\\x5d\\x76\\xa2\\x3d\\x6a\\xf6\\xc6\\x5d\\xae\\xb8\\x2d\\x9e\\xaf\\xb9\\x36\\x35\\xd6\\x99\\xa8\\x72\\x5b\\xa3\\x3e\\x5b\\xd7\\x00\\xfc\\xd1\\xb9\\x09\\x1b\\xa1\\x58\\x45\\x3c\\x83\\x9f\\x98\\x03\\x6b\\xfa\\x4f\\x9f\\x9f\\x10\\xfb\\xaf\\xce\\x4f\\xf0\\xd3\\xf3\\x13\\x02\\xe7\\xcf\\x4f\\x08\\xf8\\x05\\x7b\\xd1\\xca\\x57\\xa9\\xf5\\xcf\\xe8\\x82\\xac\\xa0\\x46\\x3d\\x40\\xa1\\x8b\\x29\\x38\\x72\\x0e\\x22\\xe8\\x1a\\x12\\x52\\xd3\\x03\\x14\\xa2\\xed\\x29\\xbf\\xd7\\x93\\xee\\xa7\\x07\\x28\\xf0\\x3a\\x0d\\x13\\x7c\\xb6\\x1a\\x69\\x78\\x6e\\x69\\xdf\\xc0\\x08\\xf7\\x46\\x24\\x5f\\xeb\\xf1\\xd4\\xe5\\xc3\\xa1\\x9c\\x2f\\xe5\\xad\\x6f\\xf9\\xf2\\x3f\\xdc\\x9d\\xbd\\xdd\\x5e\\x26\\x35\\xfb\\xb6\\xa7\\xad\\xa3\\xe0\\xd8\\xb9\\x7e\\x1d\\xc1\\xd2\\x63\\x73\\x1b\\x58\\xcc\\x95\\xa1\\x1a\\x1a\\xe1\\x63\\x28\\x6a\\x18\\x10\\x71\\x24\\x4d\\x13\\xf5\\x70\\x56\\xae\\x31\\x2a\\xb8\\x46\\xad\\xe6\\xc8\\x50\\xb7\\x83\\x6b\\xfc\\x48\\x8e\\x44\\x1b\\x5f\\x07\\x39\\x1a\\x69\\x7c\\x9d\\x9e\\x18\\xb0\\xe3\\x0f\\x8b\\x89\\xc3\\xe1\\x71\\xd4\\x86\\x35\\x2f\\x5a\\x70\\xc4\\x86\\x0d\\x2f\\xe2\\xa8\\x6d\\x9a\\x8f\\x6a\\x1c\\x22\\x8e\\xd8\\xa6\\x8d\\x11\\x83\\x43\\x9c\\x76\\xd3\\x77\\x0f\\x7d\\x0f\\x93\\x77\\xf2\\x4c\\x8c\\x3c\\x33\\x5d\\x47\\xdf\\xeb\\xc9\\x7b\\x31\\x16\\xd5\\x5c\\x80\\x07\\xeb\\x24\\x5c\\x2f\\x61\\x5e\\x2a\\x86\\x23\\x06\\x72\\xed\\x21\\x9e\\x09\\x1b\\x89\\x73\\xe2\\x0d\\x46\\xb7\\x27\\x1c\\xab\\xab\\xbf\\xc0\\x39\\x19\\x78\\xcd\\x1f\\xdd\\xa5\\xee\\x09\\x64\\x4d\\x44\\xb0\\xcb\\x16\\xff\\x7c\\xdc\\xd5\\x8d\\x3c\\x04\\xf2\\xcc\\x2f\\xa9\\x27\\x59\\x75\\x23\\xb0\\x15\\x25\\x0b\\x8d\\x6c\\xc1\\xe9\\xf6\\x38\\x2c\\xec\\x58\\xd7\\x95\\x0f\\x6d\\x0c\\x7d\\x60\\xd4\\xb9\\x8f\\xaf\\x3a\\x4e\\x73\\xef\\x56\\x31\\x38\\x9a\\xd9\\xd6\\x78\\xcb\\x48\\x69\\x4b\\xe0\\xf5\\xc0\\xc0\\x95\\xe3\\x29\\x25\\x9b\\x5f\\x94\\xec\\x6e\\xf0\\x32\\xb1\\x2d\\x4f\\xde\\xba\\xca\\xf8\\x91\\x4b\\xf0\\x79\\x1e\\xae\\x3a\\xfc\\x14\\x63\\xb4\\x0a\\x7a\\x6f\\xbd\\x75\\xf6\\x29\\x5d\\x9b\\xf4\\xc0\\xca\\x31\\xfe\\x4d\\xdf\\x5b\\xfe\\x75\\x5f\\xb9\\x77\\xd3\\xf8\\xcd\\x29\\x26\\x61\\x29\\x8c\\x5c\\x46\\xe5\\x5e\\x9a\\xfb\\x80\\x7d\\x97\\xd7\\xc1\\x28\\xea\\x84\\x62\\x3f\\x31\\xd7\\x03\\xa3\\xb9\\x9c\\xdc\\xa1\\x57\\x70\\x7b\\x16\\x77\\xd8\\x70\\x21\\x7a\\x56\\xc0\\xad\\x39\\x79\\x58\\xa3\\xe0\\xc5\\x59\\x75\\xe7\\x52\\x8c\\x53\\x4a\\x56\\x4b\\xbf\\xd7\\x2c\\x62\\x31\\x27\\x5b\\x35\\x0a\\xae\\xcb\\x4e\\x07\\xfb\\xbd\\x3a\\x11\\xe1\\xa5\\x69\\xec\\xa0\\x49\\xcf\\x1a\\xb3\\x22\\xd7\\x35\\x67\\xb3\\x45\\x47\\x0d\\x4d\\xe8\\x12\\x8b\\x5b\\x63\\xc3\\x69\\xba\\xbf\\xda\\x4c\\xf7\\x57\\xa7\\xcd\\x4a\\x31\\x4d\\xd3\\xbd\\x69\\x51\\x2f\\xca\\xcb\\x54\\x64\\xf1\\x9b\\xbf\\x7f\\x69\\x3d\\x45\\x16\\x8b\\x1b\\x71\\x7b\\x23\\x5e\\x6c\\x93\\x5b\\x9d\\x9f\\xe3\\x76\\x9b\\x3c\\xe0\\xfc\\xfc\\xb9\\x4f\\xb6\\xbc\\x4c\\x60\\x87\\x11\\xb7\\xda\\xa6\\xa5\\xd6\\x76\\x87\\x38\\xdd\\x46\\xde\\xf1\\x62\\xdb\\xf4\\xe0\\xe2\\x01\\x87\\x38\\x3d\\x44\\xde\\x8b\\x52\\x6b\\xfb\\x05\\x4c\\x6c\\x93\\x8a\\x43\\x8b\\x07\\x48\\x6b\\x50\\x82\\x69\\xa9\\x6d\\x70\\x88\\x72\\xeb\\xe9\\x56\\xa9\\xad\\x7d\\x60\\x70\\x68\\xf1\\x45\\x38\\x82\\x26\\x92\\xcd\\x34\\x14\\x1b\\x96\\x70\\xda\\x2e\\x37\\x14\\x08\\x6a\\x2d\\x0c\\x13\\xb5\\xef\\xa3\\xe5\\x14\\x45\\x5d\\xba\\x57\\x92\\x24\\x39\\x68\\x15\\xec\\xb2\\xa3\\x86\\xb0\\x94\\xb8\\x57\\xb5\\x42\\x3d\\x99\\xc8\\xe7\\xe6\\x77\\x0e\\x50\\xee\\xaa\\x66\\xce\\xed\\xc9\\xb9\\x12\\x95\\xe5\\xff\\x96\\x2c\\xd1\\x2e\\xd5\\x56\\x50\\xfd\\x22\\x86\\x42\\x4a\\x16\\xaa\\x5d\\x9a\\x60\\x88\\xe1\\xb4\\xfc\\x2d\\xeb\\x79\\xb6\\x7d\\xfb\\xc9\\xb1\\x75\\x77\\xf5\\x9d\\x08\\x07\\x7c\\x75\\x62\\x44\\x6a\\xf0\\xb3\\xfc\\x9b\\x8f\\xe8\\xb4\\xbc\\xd9\\x6b\\xd7\\x87\\xac\\x91\\xa1\\xa1\\x6e\\xb7\\x2d\\x56\\x25\\xfa\\x57\\xdd\\x72\\x38\\x7e\\xd9\\x96\\xf5\\xd1\\xf8\\xd1\\xd5\\x77\\x5b\\x03\\x5e\\xb7\\xb1\\x71\\x7f\\x87\\x35\\x99\\x4a\\xbb\\x4f\\xfb\\xea\\x9c\\x2b\\xef\\xdc\\xd1\\x36\\x38\\xf4\\xb8\\xa9\\xbe\\x3e\\xe2\\xcb\\x8d\\xe6\\x84\\xda\\xc8\\xe9\\xfa\\xf5\\xd1\\x60\\x57\\x57\\xab\\x8b\\x71\\x79\\x5d\\x06\\x57\\xd4\\x85\\xf7\\x06\\xa2\\x81\\x74\\x0a\\x18\\xd8\\x85\\xf2\\xec\\x7d\\xdc\\x24\\x5d\\x97\\xb9\\x0a\\x70\\x24\\x2d\\xd7\\x69\\x15\\x9c\\x4b\\xcb\\x66\\xad\\x42\\xd7\\x60\\xb8\\x85\\xea\\xf5\\x46\\x24\\xca\\x6e\\x93\\x42\\xd7\\x5d\\xaa\\x38\\xc1\\xfe\\x14\\xd2\\xea\\x0d\\xb4\\xa0\\x18\\x37\\x0a\\x72\\xc4\\x2c\\x49\\xd8\\x6d\\x7f\\xca\\x26\\x38\\x7c\\x81\\x20\\xcd\\x57\\xd7\\x45\\x04\\x7b\\xc9\\xe7\\x87\\x60\\x9c\\x3c\\x93\\x13\\x8a\\x48\\xeb\\x96\\xa8\\x87\\x28\\xe9\\x0c\\x36\\xbb\\x43\\x2d\\x19\\xaa\\x24\\xa7\\x93\\x05\\x8f\\xba\\xc9\\xab\\xe0\\xa1\\x59\\x69\\x8d\\xd6\\xa3\\x4d\\xaa\\x5b\\x65\\xb4\\x97\\xa6\\x9d\\x77\\x1d\\x74\\x7b\\x9c\\xbe\\x83\\xb7\\xee\\xab\\x5e\\x59\\x5f\\x3f\\x5e\\xbd\\xef\\xd6\\x83\\x7e\\x97\\xdb\\x77\\xf0\\xd6\\x3d\\x35\\xe3\\x62\\xe3\\x44\\xcd\\x9e\\x23\\x9e\\xba\\xd6\\x68\\xb4\\xb5\\xce\\x33\\xff\\x89\\x9e\\x3c\\x54\\x33\\x59\\x2f\\x8e\\xd5\\x1f\\x3c\\xba\\xdf\\xe1\\x76\\x3a\\xf6\\x1e\\xdd\\x57\\x37\\x29\\xa6\\x56\\xd4\\xee\\x3f\\xba\\xd7\\x2d\\x38\\xdc\\xfb\\xd1\\xd7\\x13\\x1d\\x29\\xbf\\x3f\\xd5\\x91\\x88\\x77\\x36\\xfa\\xfd\\x8d\\x9d\\x44\\x4f\\x12\\x00\\xec\\x07\\xb4\\x9e\\xfc\\x08\\x14\\x2d\\x17\\xac\\xf5\\x97\\x6c\\x82\\x05\\xcc\\x22\\xd6\\xe7\\x64\\x1b\\xaf\\x60\\x63\\xb6\\xe4\\x74\\xd1\\x1b\\x7c\\x4e\\x76\\x6a\\xd4\\x32\\x4d\\x0f\\xad\\x9c\\xb4\\xbb\\x49\\xec\\x4f\\x7c\\xb2\\x2e\\x9b\\x2d\\x9a\\x69\\x0d\\xa5\\xb9\\x52\\xb0\\x69\\x31\\xd3\\x32\\x4a\\xa7\\x5e\\x24\\xaa\\xe3\\x45\\xa2\\x6c\\xb6\\xcc\\xd7\\x0c\\xb8\\x16\\x4a\\x33\\x08\\x84\\xcc\\xb9\\x12\\x2e\\xf2\\x4a\\xe4\\x63\\xea\\xff\\x44\\xf9\\x3f\\xfe\\xe5\\x3f\\xca\\x8f\\xcc\\xcc\\xcc\\xcc\\x9c\\x2b\\x7f\\x86\\x74\\xe5\\xcf\\x10\\xc3\\xcd\\x94\\x43\\xe8\\x17\\xb3\\x93\\xa7\\xbb\\x4a\\x8f\\x3d\\x56\\xea\\x3a\\xad\\xfa\\x90\\xf3\\x38\\x41\\x0b\\x21\\xa8\\xac\\xe6\\x63\\x2e\\x4b\\xc3\\x1e\\x4d\\x96\\x16\\xee\\xe9\\x17\\xf0\\x02\\xab\\x62\\x86\\x9f\\xfd\\xac\\xfc\\x06\\xf3\\x7f\\x67\\xcd\\xec\\x66\\xd6\\x30\\xf3\\x7b\\x9a\\xff\\xd8\\x3b\\x77\\x3b\\xbb\\x8b\\xdf\\x05\\x2b\\x60\\x1b\\xdc\\x08\\x78\\x3c\\x2d\\xeb\\xf5\\x4a\\x51\\x3f\\x4e\\x2b\\x50\\x09\\x2c\\xc8\\xa7\\xe5\\x24\\xc1\\xa7\\xdb\\x69\\x6d\\xd2\\xa4\\x51\\xc1\\x93\\x36\\xdc\\x46\\x14\\x3f\\x6e\\x54\\x70\\x3c\\x2d\\xb7\\xd1\\x5b\\xb2\\x05\\x89\\xf8\\xb2\\xac\\x3c\\x6a\\x54\\xf0\\x60\\x56\\xee\\xb7\\x2a\\xb8\\x21\\x2b\\xef\\x40\\xa2\\x6c\\xf1\\x0a\\xf6\\xd3\\x28\\x94\\xcc\\x77\\x8f\\x6f\\x22\\xf2\\x32\\x2a\\x4c\\xa7\\x9a\\x7a\\x86\\xa9\\x24\\xe5\\xf5\\x82\\xfd\\x34\\xc4\\x1b\\x52\\xa3\\x6b\\x37\\x51\\xa9\\xe9\\x46\\x59\\xf7\\x05\\xdb\\x54\\x2b\\xf1\\xf4\\x05\\xbb\\xd4\\x3c\\x5a\\x1a\\x65\\x5f\\x52\\xb5\\x74\\x7e\\xbd\\xc3\\xe1\\x74\\x7b\\xc2\\x88\\xee\\x54\\xab\\x49\\x23\\x0b\\xbb\\xf7\\x0e\\xab\\x51\\xab\\xa9\\x69\\xe9\\x8b\\x57\\xb5\\x56\\x3b\\x84\\x86\\xe1\\xc2\\xf8\\x95\\x8b\\xa3\\x9e\\xba\\xd6\\x78\\xb0\\x31\\x66\\x6f\\xde\\x70\\xe3\\x32\\x69\\xc7\\xd4\\x92\\xe0\\xdf\\x38\\x0c\\x1c\\x1f\\x48\\xe6\\x82\\xfe\\x86\\x98\\xdd\\x5f\\x58\\xd5\\x5e\\x3f\\x35\\xd4\\xe8\\x4c\\x64\\x82\\x2d\\xed\\x2d\\x9b\\x8f\\x4f\\x1c\\x78\\xe9\\xc5\\xb1\\x09\\x43\\x38\\x61\\xb1\\x2e\\x5d\\xd9\\xab\\xb7\\x1a\\xf8\\x55\\xa7\\x2c\\x0e\\x57\\xa6\\xd6\\xef\\x8c\\x89\\x1e\\x5f\\x7d\\x55\\x4c\\xf0\\x75\\x0d\\xaf\\xcc\\x84\\x7a\\xda\\x9b\\x2c\\xb6\\x4c\\xa1\\x33\\xd4\\x79\\xe5\\xaa\\xe6\\xa8\\x34\\xde\\x74\\x37\\xe7\\x8c\\xf8\\x52\\x71\\x97\\x23\\x2a\\x7a\\x42\\x8d\\xb5\\x35\\x2e\\x6b\\xd3\\xd0\\xda\\x42\\xb4\\xb3\\x45\\x34\\xd7\\xef\\xee\\x18\\xfa\\xca\\xda\\xdc\\x0e\\xe6\\x4c\\x66\\xcc\\xcf\\x6a\\x4d\\xa6\\xac\\x3f\\x33\\x1e\\x72\\xf3\\x4e\\x5f\\x08\\x18\\x78\\x86\\xdb\\xcc\\x8e\\xf2\\xbb\\xe8\\xbe\\xad\\x76\\xc0\\xd6\\x34\\x4e\\xe4\\x08\\x38\\xf0\\x72\\x22\\xf6\\x65\\x2b\\xad\\xca\\xc6\\x2d\\x02\\x13\\x08\\x32\\x30\\xd0\\xfa\\xfa\\x52\\x58\\xcd\\xa8\\xd7\\x55\\x4e\\x51\\xb8\\x38\\x2d\\x78\\xe9\\x4e\\xae\\x67\\xdc\\xc9\\xe6\\x50\\x20\\x57\\xeb\\xa3\\x79\\xff\\xe6\\xa4\\x1b\\x1d\\x75\\x27\\x73\\x21\\x7f\\xae\\xd6\\x47\\xbe\\x09\\xe5\\x92\\x6e\\xee\\xa3\\x40\\xa6\\xda\\xe5\\x48\\x34\\x85\\x03\\xe9\\x2a\\x97\\xab\\x2a\\x1d\\x08\\x66\\xaa\\x16\\xae\\x9d\\x55\\x19\\x00\\x16\\x0c\\x50\\xcd\\x7e\\xc1\\x49\\x74\\xbc\\xcb\\xe0\\x2b\\x50\\x4c\\x20\\x10\\x4b\\xbc\\x16\\x6c\\x1c\\xc5\\x35\\x3e\\xb5\\xb5\\x24\\x2d\\x2f\\xd2\\x2a\\xb8\\x3d\\x2d\\xa7\\x88\\x1d\\x5a\\x4e\\x87\\xef\\x54\\xe3\\x52\\xa7\\x8d\\xc0\\x97\\x52\\xcf\\xc2\\x51\\x28\\x61\\x24\\x96\\x0c\\xf4\\x3b\\x79\\x0c\\x89\\x72\\xb8\\x47\\xb0\\x3f\\x6d\\xe5\\x7d\\x89\\x54\\x76\\x68\\x09\\x15\\x9f\\xf6\\x45\\x82\\xbd\\x47\\x6f\\x70\\x42\\x6d\\x36\\x9c\\x1b\\x1c\\xba\\xa4\\x54\\x51\\x7b\\x71\\xe9\\xc2\\xbc\\x91\\xf1\\xfc\\xa9\\x55\\x72\\xf7\\x05\\x59\\x0a\\xc3\\xd8\\x89\\xa7\\x77\\x6e\\x7f\\xfa\\xe4\\xf8\\x7d\\x8b\\x9f\\xd9\\xb5\\xf3\\xa9\\x5b\\x97\\xde\\xd5\\xba\\xe9\\xe6\\x91\\x25\\x37\\x6d\\x91\\x5a\\x37\\xdf\\x3c\\x32\\x72\\xf3\\xa6\\xd6\\xee\\xc6\\x65\\x3b\\xda\\x7a\\xb6\\x8e\\x64\\x4c\\x0f\\xeb\\x78\\x16\\xb1\\xc6\\x42\\xb5\\xab\\x2e\\xee\\xea\\xe8\\x4e\\xb7\\x39\\xbf\\xd1\\xf0\\xcd\\xa9\\xfe\\xfd\\xcb\\xea\\x99\\xf4\\x9e\\xe7\\xbf\\x3e\\x31\\xf1\\xf5\\xe7\\xf7\\xfc\\xe3\\x03\\xa3\\x63\\x2b\\xbe\\xfe\\xfc\\xee\\xc9\\xbb\\xf6\\x75\\xf7\\xee\\xbf\\x7b\\x62\\xe2\\x9e\\xfd\\xbd\\x3d\\xfb\\xee\\x5d\\xbe\\xe8\\xd0\\x64\\x26\\xde\\xb9\\x22\\x23\\x31\\x26\\x9b\\x5d\\x1f\\xad\\xb5\\x26\\xda\\xea\\x97\\x6d\\x6d\\xce\\xad\\x5f\\xb6\\x36\\xbf\\xe6\\x1a\\x60\\xe1\\x0e\\x54\\xcd\\x1e\\xe5\\x66\\x80\\xa5\\x48\\xf6\\x20\\x14\\x9d\\xc4\\x61\\x9b\\xb5\\x6a\\x50\\xa4\\x55\\x88\\x55\\xaf\\xd7\\x2a\\x38\\x9d\\x2e\\xe9\\x2b\\x47\\xce\\xe4\\xa8\\x61\\xaf\\x36\\x29\\xb8\\xda\\x26\\xfb\\x90\\x28\\x1b\\xd2\\xd9\\xac\\xec\\x35\\xa9\\x67\\x0b\\x54\\x73\\x82\\x5d\\xb6\\x09\\x92\\x84\\x7d\\xc2\\xb4\\xd9\\x59\\xa9\\x88\\xa8\\x27\\x60\\xc6\\xeb\\x97\\x24\\x9c\\x16\\x30\\x27\\xc9\\x66\\xbd\\x60\\xc7\\xb6\\xca\\x5e\\x56\\xd4\\xdc\\x52\\xe8\\x42\\xb9\\xe6\\x9a\\x85\\x4d\\xe2\\x6e\\x5a\\x15\\x42\\x13\\x23\\x2d\\xf3\\xe5\\x05\\xf9\\xb8\\x05\\xdd\\xc1\\x7c\\x32\\xdb\\x79\\xfb\\x57\\xa5\\x15\\xd1\\x96\\x5c\\xd3\\xea\\xc6\\x83\\x03\\xf7\\xac\\xfd\\xda\\x5f\\xfd\\x4f\\x6b\\x7d\\x26\\xeb\\x96\\x36\\x0d\\x25\\xdf\\x32\\x7a\\x62\\x2e\\x5f\\xb3\\x18\\xec\\x5f\\xd7\\x82\\xaa\\x1f\\x7e\\x18\\xbd\\xb2\\xed\\xa8\\x9d\\x47\\xdd\\x6d\\xd9\\xe6\\x5b\\x06\\xbb\\x6f\\xbf\\xad\\xdc\\x98\\xb3\\x05\\x1c\\x86\\x78\\xd7\\xe4\\x98\\xdf\\xec\\x77\\x9a\\x2d\\x35\\x3d\\x59\\x83\\x9b\\xda\\xa8\\xa3\\xb0\\x91\\x7d\\x82\\x9d\\x02\\x0d\\x98\\xe9\\x6e\\x3a\\x8f\\xd6\\xa1\\x15\\xd4\\x8f\\xa3\\x68\\xec\\xa6\\x8f\\x7f\\x77\\x02\\x2d\\xbb\\xe5\\x57\\xbf\\x3b\\x8e\\xde\\x5a\\x84\\xfa\\x4f\\x9c\\x2b\\xff\\xe1\\x38\\x3a\\x38\\xdf\\x22\\xf6\\xfe\\x14\\x6a\\x67\\xb7\\x32\\xbf\\x01\\x1e\\x32\\xea\\xb9\\x12\\x24\\x9a\\x55\\x4f\\xd3\\xe0\\xf4\\x22\\xc2\\x9a\\xf9\\xd3\\x0a\\x8a\\x1c\\x4b\\xb7\\x8f\\x83\\x5e\\x94\\xb5\\x0b\\x27\\x66\\x24\\xf2\\xa7\\x98\\xe7\\xdf\\x65\\xc4\\x97\\xcb\\x4b\\x3f\\xa5\\xe3\\x39\\x7f\\x4e\\x05\\x07\\x91\\x8b\\x4f\\xaa\\xe0\\xd3\\xb2\\x66\\x61\\x3f\\x30\\x57\\xa1\\x61\\xec\\x26\\x16\\x66\\xd5\\x43\\x2b\\x00\\xe8\\x49\\x8f\\xe7\\x75\\xa5\\x00\\x3d\\x80\\xff\\x9c\\xb6\\xb4\\xa4\\x4b\\xad\\xb4\\x55\\x6c\\xa1\\x91\\x6e\\x4b\\xad\\x5e\\xc4\\x3d\\xe9\\x52\\x3d\\xbd\\x49\\x33\\xa7\\x7f\\xa4\\x3e\\x05\\xf5\\xaa\\x35\\x8b\\x0b\\x36\\xb9\\x03\\x89\\xa5\\xb4\\x7a\\xfe\\x50\\xfa\\x22\\x7d\\xea\\x43\\xa2\\xdc\\x51\\x10\\xec\\x25\\x2b\\x9f\\xc8\\xfb\\x88\\x59\\x4e\\x0b\\x72\\xb6\\x59\\x4d\\x6d\\xe6\\x24\\x90\\x5b\\x7c\\x82\\x5d\\xce\\x91\\x1b\\xad\\x42\\xc9\\xe0\\x84\\x6c\\x98\\x3c\\xd4\\x63\\xc7\\xe9\\xff\\x8e\\x8e\\x39\\x84\\xf9\\x90\\xc3\\xa3\\x4d\\x26\\x5c\\x02\\x0d\\x06\\x6b\\x44\\xf4\\xff\\x56\\xad\\x7b\\x5f\\x18\\xd8\\xd4\\x15\\x2c\\x64\\x0f\\xdf\\x77\\x65\\x6b\\x6b\\x93\\xd8\\xd8\\x9c\\xfd\\x7f\\x2a\\x52\\xf9\\x5e\\xa6\\xdb\\x97\\xea\\xa9\\xcd\\xae\\xf0\\xfc\\xd2\\xf3\\xf1\\x39\\x34\\x1e\\x0d\\xfa\\x82\\x84\\xef\\x1f\\x70\\xfb\\xd9\\x00\\x9f\\x00\\x16\\xe2\\x50\\xd9\\x50\\xa9\\x6e\\xaa\\xe4\\xd2\\x32\\x20\\xb1\\xc4\\x5a\\x41\\xc7\\x89\\x17\\x1c\\x2d\\xf2\\x01\\xd3\\xc5\\xed\\x2f\\x95\\x08\\x8f\\xcf\\xb1\\x16\\x56\\xe2\\x27\\xc1\\x01\\x31\\xe8\\x83\\xa2\\x87\\xe6\\xcd\\x55\\x95\\xa3\\x55\\x57\\x6a\\xb9\\xa8\\xd3\\x44\\x57\\x67\\xfc\\x44\\xd1\\x4c\\x6a\\xa9\\xa8\\xdf\\x29\\xd8\\x65\\x2b\\x4f\\x60\\x66\\xc4\\xf3\\x67\\x0f\\x66\\x2a\\x50\\x8b\\x53\\x29\\x4b\\x39\\xd7\\xb4\\x62\\x6f\\x47\\xf7\\xbe\\xf1\\x74\\x7a\\x7c\\x5f\\x37\\xf9\\x7c\\xb9\\x2d\\x93\\xe9\\xb4\\x85\\x6a\\xbd\\x99\\x36\\xae\\xa9\\x73\\xf7\\xb2\\x54\\x7a\\x6c\\x57\\x5b\\xdb\\xae\\xb1\\x74\\x6a\\xf9\\xae\\xee\\xd6\\xa1\\xa1\\xd6\\x60\\x3a\\xee\\x1c\\xa6\\xb2\\xb8\\x0c\\x62\\x6c\\x89\\x7b\\x10\\x8c\\x60\\x85\\xcb\\x81\\x16\\x43\\xea\\x94\\xf9\\x83\\x63\\x74\\xff\\xd5\\xc1\\x31\\xb6\\x3f\\x7d\\x70\\x8c\\x95\\x56\\x01\\xce\\x9f\\x1d\\x63\\x52\\x6b\\xf3\\x84\\x3f\\x3a\\x3e\\x06\\xe5\\x63\\xae\\x65\\x68\\xd9\\x3b\\xa8\\xb7\\xfc\\xc2\\x3b\\xe5\\x12\\xbb\\x95\\x79\\xe0\\x79\\xd4\\x5f\\x3e\\xf3\\x7c\\xf9\\x3b\\x68\\xd3\\xec\\xf1\\x17\\x5f\\x04\\x04\\x3f\\x66\\x02\\xec\\x12\\x5e\\x02\\x11\\x96\\x01\\xf6\\xa7\\x65\\x3b\\xaf\\x90\\xf0\\x1b\\x57\\xa7\\x65\\x96\\xd0\\xb0\\x41\\x3d\\xc2\\xc3\\xa4\\xcc\\x9f\\xdf\\xe1\\xd7\\x8b\\xf4\\x2c\\x14\\x7a\\x7e\\x87\\x4b\\x02\\xd9\\xee\\xa7\\xe9\\x1c\\xb9\\xda\\x2b\\xd8\\x4b\\x60\\xd3\\x85\\xc5\\x4b\\xce\\xef\\x60\\xb4\\x16\\x76\\xe1\\x08\\x0f\\xf5\\x6c\\x3d\\xd5\\x54\\x59\\x90\\xf6\\xc7\\x12\\x3e\\xd8\\xba\\x73\\x2c\\xe3\\xca\\xaf\\xe9\\x77\\xbb\\x6d\\x36\\x1b\\x32\\x18\\xac\\x56\\xbb\\x65\\xf6\\xee\\x96\\xaf\\x4e\\xb6\\xd4\\x56\\x37\\x25\\x33\\xe3\\x4e\\x8d\\xc6\\xc8\\xed\\xda\\xbc\\xb7\\x7a\\xd1\\x86\\xd6\\xba\\x9e\\x9e\\xe1\\xac\\x60\\x33\\x5a\\x05\\x64\\xd0\\xeb\\x7e\\x72\\xc3\\xf0\\x75\\xdd\\x75\\x91\\x4e\\x6f\\x24\\x9d\\x4a\\x59\\x7c\\x16\\x40\\x80\\x19\\x0f\\xdb\\xc7\\x4b\\xd0\\x01\\x9b\\x81\\xb8\\x30\\x3d\\xaf\\x60\\x6b\\x5a\\xf6\\x6b\\x15\\xec\\xca\\x12\\x28\\x94\\xe4\\xd5\\x0d\\xe6\\xa6\\xb3\\x72\\x8b\\x49\\xc1\\x21\\x82\\x92\\x1a\\x4c\\xea\\xde\\xf2\\x06\\x93\\x60\\xc7\\x4d\\x12\\xc8\\xfa\\xf6\\xf3\\x09\\xbe\\x16\\x49\\xc2\\x7e\\xbb\\xec\\x6d\\x92\\x24\\x1c\\x17\\xe4\\xaa\\x06\\x49\\xc2\\x49\\x3b\\xae\\xa6\\xf8\\xf9\\xfc\\xda\\x42\\x4d\\xa2\\x1e\\x59\\x90\\x36\\x1f\\x66\\xb2\\x0b\\x52\\x33\\x5f\\xa2\\x77\\xe1\\xae\\x7d\\x7c\\x9f\\xc9\\xa2\\xd3\\x07\\x62\\x49\\x57\\xc7\\x92\\xee\\x56\\x8d\\xd1\\x5d\\x15\\xf6\\x85\\xed\\x7a\\xae\\x3d\\x6b\\xf1\\xc6\\x9d\\x2b\\xd6\\xdd\\x70\\x53\\xb1\\x73\\xf7\\x58\\xca\\xec\\x09\\xdb\\x3d\\xf5\\x31\\x47\\x61\\xfd\\x91\\xde\\x67\\x99\\xd3\\x8f\\x5b\\x62\\x76\\x5b\\xd8\\x6b\\x69\\x4a\\x44\\x13\\x88\\x41\\x45\\x96\\x65\\xe2\\x7e\\xb3\\xcf\\x69\\x3e\\x70\\xd3\\x5f\\xd6\\xf4\\xae\\x6e\\x72\\xd7\\x55\\x87\\x0d\\xc6\\x78\\xaa\\x39\\xd8\\xbc\\x7e\\xa0\\x16\\x10\\xba\\x9f\\x4b\\x30\\x3f\\xe7\\x4f\\x03\\x0b\\x51\\xc0\\x2c\\xad\\x83\\x34\\x72\\x62\\x25\\x5b\\x55\\x62\\x68\\x66\\x62\\x3e\\x59\\xe5\\xf0\\xb0\\xe8\\xfe\\xbf\\x3e\\xf5\\x2e\\xb7\\x1d\\x8d\\x5d\\x59\\x56\\xf3\\x7d\\xce\\xf2\\xab\\xec\\x27\\xec\\x63\\x90\\x82\\xdd\\xea\\xb9\\x07\\xb8\\x2e\\x27\\x07\\x35\\x0a\\xb6\\x67\\x8b\\x09\\x5a\\x15\\x94\\x00\\xbd\\x48\\x97\\xe0\\x68\\x59\\x7c\\x23\\x91\\x54\\x82\\xb6\\x31\\x10\\x8a\\xa6\\x4c\\x0a\\x36\\xdb\\xe8\\x86\\x20\\xbf\\x59\\x3d\\x60\\xc3\\x63\\xa6\\xdb\\xd5\\xb0\\x5f\\xc0\\x35\\x12\\xc8\\xc1\\x84\\x60\\x2f\\xc6\\x6a\\xe8\\x96\\x36\\xa3\\x20\\x6b\\xa3\\xf3\\x2a\\x58\\xe8\\x62\\x69\\x7a\\x3f\\xcc\\x78\\x2a\\xad\\x5c\\xb6\\xa5\\x1b\\xd1\\x43\\xa6\\x2a\\x41\\x89\\xe0\\x64\\x78\\x0d\\xc7\\x6a\\x35\\xdc\\xfb\\x9e\\x9a\\x6c\\xc0\\x9f\\xad\\xf5\\xbd\\x1b\\x30\\x85\\x74\\xf9\\x2b\\x36\\x1f\\x69\\x59\\xe9\\x4f\\x5d\\xd3\\x9e\\x5a\\x5d\\x55\\x7e\\xd5\\xb1\\x74\\xf3\\x9e\\x6c\\xeb\\xc1\\x6d\\x93\\x01\\x46\\x33\\xfb\\x7e\\xff\\xaa\\x66\\x37\\xcb\\x87\\x5b\\xc6\\x25\\xa6\\x6e\\x76\\x6a\\x7d\\x54\\xd8\\xfe\\xd2\\xed\\xa9\\xba\\xfa\\x06\\xaf\\xa7\\xfc\\xd8\\x7c\\xcd\\xec\\x21\\xf6\\x11\\x7e\\x12\\x04\\x62\\xef\\x0d\\x74\\xb7\\x75\\xd1\\xc0\\x2f\\xe8\\x18\\x89\\x2c\\xec\\x54\\x70\\x8c\\x26\\x05\\x1b\\x69\\x7e\\x47\\x47\\xf3\\x3b\\xd8\\x68\\xa3\\x05\\xde\\x5a\\x93\\xba\\x56\\x50\\xb1\\x25\\x44\\x07\\xc9\\xff\\x46\\x76\\x67\\xf3\\x91\\x57\\xbe\\x81\\xda\\xde\\x18\\x7b\\x73\\xf8\\x2f\\xd6\\xe6\\xd8\\x4f\\x87\\x6f\\xd8\\x24\\x7d\\x11\\xe1\\xc5\\x2f\\xde\\x61\\xdd\\xc6\\xde\\x8d\\x47\\xd5\\x33\\x9d\\x96\\x30\\x3e\\xe6\\x04\\xdb\\x0e\\x0e\\x68\\x84\\x4a\\x9e\\xc9\\xca\\xfd\\x89\\x43\\x92\\xcc\\xea\\x21\\x49\\xe6\\x85\\x43\\x92\\x2e\\xad\\xb8\\x40\\x4b\\xfc\\x0d\\x52\\x38\\xd2\\x9e\\x0a\\xf8\\x1a\\xda\\xe3\\x31\\x49\\xf4\\x32\\x8f\\x87\\xf3\\x49\\x8f\\xaf\\xb6\\x39\\x48\\x3e\\xdd\\xc9\\x3c\\xe9\\x2f\\x59\\xbe\\x96\\x4d\\x03\\x80\\x1f\\x46\\xd4\\x18\\x4b\\x36\\x6b\\x14\\xec\\x4d\\x97\\x34\\x15\\xa4\\x12\\x20\\x71\\x54\\xc9\\xa6\\x9e\\x74\\x17\\x44\\xa2\\x6c\\xb3\\x08\\xf6\\xa2\\x46\\xef\\xa5\\xeb\\x4a\\x1a\\xaf\\xaa\\x24\\x66\\x7a\\xe6\\x82\\xc5\\x2e\\x23\\x1b\\xe1\\x21\\x2a\\xcc\\x6b\\x84\\x88\\x0a\\xb9\\xf3\\xa8\\x1f\\x25\\x47\\xc3\\xcd\\xd9\\x26\\x7f\\xc8\\x1d\\xf4\\x6f\\xf5\\x3d\\xaa\\x5f\\x36\\x11\\xed\\xdd\\xbc\\xa8\\xf7\\xa6\\xf2\\x7b\\x37\\xf8\\x62\\x0e\\xad\\xd7\\x68\\x74\\x9f\\xee\\xd6\\x2d\\xeb\\x88\\xf6\\xe6\\xa2\\x22\\xe5\\xc7\\xf3\\x4c\\x80\\x39\\xc4\\x37\\x81\\x06\\x02\\xf0\\xe7\\xce\\x2b\\x5a\\x38\\xa7\\xe8\\x79\\x94\\xb8\\xeb\\xdd\\x47\\xb8\\x3b\\x1f\\x99\\xf9\\x15\\x93\\xac\\xa3\\x67\\x3c\\x9d\\x40\\x39\\xf6\\x28\\x1f\\xa2\\x79\\x5a\\x11\\x86\\xa1\\xa8\\x27\\xd8\\x6c\\x3e\\x61\\xcd\\x2b\\xd8\\x91\\x96\\xc3\\x9c\\x32\\x7f\\x68\\xa8\\xcf\\x44\\x97\\x8d\\x89\\x83\\xb0\\x98\\xd4\\x43\\x43\\x13\\xc4\\xc3\\xea\\x1d\\x64\\xb6\\xb5\\x61\\xc1\\x2e\\x73\\x16\\x69\\x01\\x73\\x5d\\x4c\\xf2\\xf3\\x30\\x4b\\x75\\xaf\\xe8\\x04\\xf3\\xe9\\x6c\\xbe\\x70\\xd9\\x57\\xfa\\xfa\\x0f\\x4f\\xe5\\x0a\\xeb\\x8f\\xf6\\x0d\\x1c\\x5e\\x93\\xfb\\xa9\\x33\\xde\\xe0\\xf3\\xa5\\x12\\x4e\\x67\\x3c\\xe5\\xf5\\xa7\\xe2\\x28\\x87\\x31\\xb3\\x71\\xea\\x9b\\x3b\\xa5\\xec\\xc6\\xaf\\xaf\\x5b\\x7f\\xe7\\xd6\\xe6\\x96\\xcd\\x27\\xbe\\x96\\x49\\x0f\\x37\\xf9\\x7d\\x4d\\x8b\\xd3\\x99\\xd1\\x7c\\x20\\xd0\\xfc\\xc7\\xf8\\xaa\\xe0\\x48\\x16\\x90\\x0b\\x55\\x3e\\x8e\\xfe\\xee\\x57\\xb7\\xa0\\x65\\xe5\\xc7\\xdf\\xfc\\xdd\\xc7\\x37\\xa1\\xb1\\xf2\\xe3\\xbf\\x44\\xfa\\x73\\x27\\xca\\x67\\x16\\x95\\xef\\x3c\\xbe\\xd0\\xa2\\x98\\x06\\xe6\\x0e\\xb2\\x9f\\xf2\\xbb\\x40\\x03\\x06\\x70\\x81\\x17\\x6e\\x05\\xec\\x4a\\x63\\x21\\x57\\x72\\x57\\x40\\x4d\\xb6\\xe8\\x72\\xd3\\x9d\\x86\\x4e\\xbd\\x58\\x74\\xd3\\xb4\\xb3\\xdb\\xac\\x57\\x4f\\x15\\xe3\\xce\\x96\\x58\\x15\\xf5\\xb3\\x34\\x84\\xc1\\x9e\\x6c\\xc9\\xa1\\xc2\\x16\\x4b\\xb6\\xe8\\x70\\xd2\\x9c\\x93\\xa0\\x17\\x8b\\x4e\\x07\\x69\\x3a\\x2b\\xe7\\x8e\\x51\\x46\\xc9\\xc8\\x20\\x49\\xd8\\x49\\x4b\\x21\\x1d\\x76\\x59\\x47\\xb7\\xaf\\xba\\x5d\\x82\\x5a\\xd2\\x2c\\x14\\x28\\x03\\x1d\\xc8\\x83\\x0a\\x95\\x83\\x7e\\x5c\\x89\\x7c\\x32\\x97\\xff\\xf4\\xd8\\xb3\\xb7\\xf4\\x31\\xd7\\x16\\x67\\x8f\\x3f\\x8a\\x06\\x6e\\xd8\\xb4\\x09\\x6f\\xde\\xca\\x29\\x37\\xcc\\xde\\x88\\x5e\\x4a\\x7c\\xb9\\x9b\\x1e\\xe5\\xb5\\x73\\x3d\\x7a\\xa8\\x7c\\xcb\\xf5\\xdf\\xfa\\xd6\\xb5\\xd7\\x03\\x0b\\x30\\xb7\\x8b\\x2d\\x57\\xe6\\x97\\x83\\x5b\\x81\\x2e\\x3b\\x96\\x62\\xea\\xb1\\x90\\x81\\x18\\x2d\\x65\\x8c\\xe8\\x45\\xba\\x75\\x00\\xa7\\xd2\\x25\\x4b\\x45\\xcc\\x9b\\x2f\\x99\\x5d\\x3d\\x12\\xc9\\xd4\\xa2\\x9c\\x58\\xac\\xa7\\x93\\xa9\\x8f\\xe9\\x45\\x5a\\xa9\\x7d\\x7e\\x32\\xf5\\x42\\x49\\x67\\xb4\\x78\\x03\\x04\\x71\\x39\\xec\\x58\\x2f\\x81\\x1c\\x88\\x11\\x28\\x11\\x97\\x24\\x9c\\x12\\xa6\\x8d\\x8e\\x64\\x8e\\xfa\\xc1\\x0b\\x66\\x77\\x91\\x4b\\x44\\xda\\x5c\\x17\\x52\\x5d\\x22\\x3d\\xd5\\x6a\\xde\\x23\\x92\\x49\\x8b\\x74\\xd2\\xff\\x96\\xbd\\x75\\x73\\x66\\xa2\\x33\\x61\\xab\\x1f\\x6e\\x75\\xd5\\x0a\\x1f\\x9a\\xdd\\xce\\x32\\x57\\x7f\\x55\\xbb\\x35\\x11\\x72\\xe4\\x13\\x71\\xd1\\xc8\\x6a\\xf4\\x97\\xd0\\x03\\xe1\\xe5\\xab\\xe3\\x6d\\x23\\xb5\\xf1\\xe6\\x7c\\x7b\\xad\\x35\\x66\\x65\\x5d\\x8f\\x5d\\xd1\\xb4\\x3f\\x6f\\x09\\x85\\xa3\\xb6\\x44\\x5d\\x4d\\x5c\\xef\\x35\\x55\\xe4\\xe0\\xb7\\xfc\\x0d\\x20\\x41\\x27\\x2c\\x86\\x11\\x78\\x0b\\xf0\\xe2\\x34\\xee\\xcf\\x95\\x86\\x55\\x39\\xe8\\xcb\\x16\\x17\\x0f\\x93\\x79\\x2f\\x1e\\xd2\\x8b\\xc5\\xe1\\xc5\\xa4\\x39\\xdc\\xa3\\x17\\x71\\x61\\x3e\\x88\\x21\\xb1\\xae\\x33\\x57\\xf2\\xaa\\x17\\xe1\\x74\\xa9\\xba\\x42\\xca\\x51\\x62\\x1f\\x4b\\x59\\x55\\x2e\\x02\\xd1\\xb3\\x42\\xa9\\x5e\\x6d\\x67\\x6d\\xf2\\x10\\x12\\xf1\\x92\\x6c\\x69\\x50\\xbd\\xd1\\x9b\\x2d\\x0e\\x0e\\x91\\x5f\\x1e\\xec\\xd7\\x8b\\xc5\\xa1\\x41\\xd2\\x1c\\xea\\xd2\\x8b\\xf2\\x52\\x24\\xca\\xf5\\xc4\\x11\\xa7\\x25\\x79\\x28\\x2b\\xd8\\xf1\\xb0\\x84\\x07\\x05\\xb9\\xbd\\x67\\x3e\\x2b\\x88\\x47\\x68\\x4d\\x3c\\x71\\xcf\\x76\\x19\\x65\\xd5\\x13\\x7d\\xd3\\x04\\x15\\x17\\x5d\\xb1\\x7a\\xba\\xff\\x59\\xf8\\x53\\x8e\\x19\\x55\\x2e\\x2f\\x3d\\x49\\x6b\\x21\\x2d\\xf1\\x47\\x02\\x78\\xb5\\xd5\\xa8\\xe5\\x9c\\xc1\\x6a\\x57\\x6d\\x5b\\x2a\\xcf\\xeb\\xac\\x01\\x8f\\x23\\xe4\\xaf\\xaf\\xaa\\x4b\\xc4\\x07\\x6a\\x36\\xe4\\xae\\x59\\x9c\\x5d\\xdd\\x53\\xfd\\xff\\x33\\xf7\\x26\\xe0\\x6d\\x5c\\xd7\\xbd\\xf8\\xb9\\xc0\\x60\\x21\\x40\\x2c\\x33\\xd8\\x88\\x8d\\x00\\xb8\\x00\\x04\\x07\\xc4\\x32\\x00\\x09\\x82\\x14\\x25\\x52\\x12\\x49\\x51\\xa2\\x28\\x89\\x92\\x1d\\xd9\\xf1\\x22\\x59\\xbb\\x23\\x8b\\xb2\\x68\\x59\\xf2\\xa2\\xc8\\x89\\xe2\\x2a\\xb6\\x23\\x27\\x8e\\x52\\xbb\\x76\\xd2\\xd6\\xb5\\x5d\\xfd\\x1d\\xf5\\x9f\\xbc\\x19\\x00\\x76\\xf5\\x5c\\xd7\\x4d\\xec\\x38\\xb1\\xe3\\x36\\x49\\x5f\\x1b\\xb9\\xad\\x93\\x97\\x26\\xed\\x73\\x0a\\xc7\\x49\\xf3\\x5c\\x37\\xed\\x73\\x25\\xea\\x7d\\x77\\x01\\x08\\x82\\x84\\xc0\\xb4\\xee\\xfb\\x2a\\x7e\\xd0\\xec\\x33\\xe7\\xfc\\xce\\xb9\\xf7\\x9e\\xbb\\xfd\\xae\\xd1\\xee\\xb5\\x76\\x0f\\xc4\\x36\\xec\\xec\\xdb\\x70\\xef\\x3a\\x62\\xb7\\x2f\\x94\\x9d\\x55\\x7d\\xf4\\x13\\x26\\xbf\\xb9\\xc9\\xc1\\x37\\xb7\\xb6\\x05\\x03\\x48\\xad\\x7a\\x4c\\xaf\\x0d\\x08\\xae\\x68\\x57\\x72\\xef\\xca\\x55\\x81\\xde\\xf1\\x2e\\x6b\\x5b\\xc0\\xa3\\x73\\x4e\\x74\\xc7\\x27\\xb3\\xad\\xc3\\x97\\x5e\\x5e\\xe4\\xd2\\x0b\\xf8\\x40\\x56\\xc2\\x71\\xc6\\xfd\\xe4\\xd1\\xd2\\xb1\\x2f\\x72\\x2e\\xc1\\xb8\\x41\\x90\\xbc\\xaa\\x32\\x54\\xc4\\x41\\x47\\x6c\\x9b\\x48\\x09\\x5c\\x70\\x98\\x32\\x66\\xb1\\xd8\\x4d\\x29\\x42\\xba\\x13\\x8c\\x2c\\x44\\x19\\x66\\x4c\\x3a\\xb2\\x26\\xa7\\x18\\x1c\\xa4\\x47\\x50\\x36\\xf1\\x45\\x9b\\xa7\\x93\\xf0\\x85\\xd0\\x79\\xc5\\x79\\x08\\x04\\x73\\x55\\xc5\\xf2\\x10\\x4a\\x33\\xdf\\xad\\x1a\\xb2\\xae\\x2e\\xf7\\x57\\x54\\x0f\\x06\\x8a\\xa3\\xdb\\xc3\\x2b\\x36\\x74\\x2c\\x60\\x06\\x19\\x68\\xef\\x1c\\x1b\\x1e\\xf4\\x3c\\xde\\x71\\xc3\\xad\\xc7\\x86\\xaf\\x3b\\x73\\x4b\\xef\\x0f\\x5b\\xa2\\xd9\\x40\\x80\\x0e\\x0f\\x0d\\x78\\xfb\\x5c\\xae\\x16\\xb4\\x6d\\xcd\\xde\\xa9\\x21\\x9f\\x10\\x8e\\xa5\\xfc\\x33\\x33\\xe2\\xf8\\xd8\\x46\\x69\\xe5\\xde\\x54\\xe7\\x48\\xd2\\xe7\\xcb\\x4c\\xf4\\x3c\\x92\\x25\\x0c\\x22\\xa7\\xd5\\xdf\\xf1\\xa5\\xc2\\x4e\\x67\\x38\\xe5\\xf3\\xa7\\xc3\\x2e\\x87\\xdd\\x93\\x24\\xeb\\x04\\x00\\xa7\\xd2\\x9e\\x06\\x1d\\xe8\\xa1\\x19\\x2c\\xd0\\x3f\\xcf\\x75\\xa1\\x2f\\xcf\\x54\\x2b\\x6a\\x4d\\xf3\\x84\\x17\\xd6\\x0a\\xe1\\x05\\x4f\\x2a\\x83\\x26\\x32\\x20\\x68\\x9e\\xf0\\xa2\\x1d\\x65\\x35\\x3a\\x54\\xcd\\x7a\\xf1\\x2e\\x72\\x1e\\x42\\x03\\xfd\\x73\\x3f\\xaf\\x62\\xbf\\xd0\\xbc\\xf8\\xc6\\x4f\\xf7\\x5c\\xfa\\x2a\\x7a\\x16\\xfe\\x73\\x64\\xe8\\x74\\x69\\x6c\\x0b\\x65\\xc8\\xa0\\xdc\\xcc\\xdc\\x67\\xf5\\xd5\\x32\\x3c\\xf9\\xd3\\x37\\x3e\\xb1\\x50\\x86\\xbd\\x44\\x06\\x0b\\x08\\x65\\xb6\\x83\\x1a\\x19\\xac\\xf3\\x32\\xd8\\x2a\\x32\\xd8\\x71\\x04\\x03\\x3c\\xcd\\xcc\\x90\\x95\\x10\\x2a\\x55\\xc9\\x62\\xeb\\x4c\\x6b\\x74\\x11\\xdd\\x42\\x71\\x5e\\x45\\xfc\\x2a\\xa4\\x9a\\x7a\\xf3\\xa7\\xfb\\xab\\x05\\x7a\\xe0\\x87\\x7f\\x7d\\xc3\\xe9\\x4f\\x5c\\xca\\x63\\x91\\x2a\\x32\\xdd\\x4f\\x64\\x8a\\x42\\x0c\\x6e\\x5a\\x52\\xa6\\xee\\xb2\\x4c\\x72\\x38\\xa1\\x18\\x35\\xa5\\x82\\xcd\\x18\\xd6\\x8b\\x4a\\x2b\\xe9\\xed\\x20\\xf4\\x42\\x4c\\xce\\xf8\\x02\\x39\\xbb\\x09\\x49\\x8b\\x62\\xc3\\xc5\\x73\\x93\\x3b\\xb7\\x40\\xe2\\xbe\\x74\\xa5\\xa5\\x72\\x61\\x27\\xe1\\x42\\x25\\xce\\x9d\\xb8\\x5f\\x1c\\xf7\\xeb\\x05\\x87\\xab\\xd9\\xe2\\xf3\\x7a\\xcd\\x87\\x43\\x59\\x29\\xe5\\x0b\\xaf\\xf6\\x37\\xb9\\xbc\\xad\\x96\\x40\\xb2\\x6d\\xb8\\x5a\\xb9\\x0b\\x7f\\xd6\\xed\\xd3\\xdb\\x84\\x66\\x7b\\xb0\\xdb\\x75\\xb2\\x7b\\x58\\x74\\x05\\xdd\\x7a\\x8f\\x47\\x58\\xb3\\xfa\\xd2\\x63\\x44\\x5f\\x0d\\xd3\\xf7\\x24\\xd1\\xd7\\x47\\x66\\xfb\\x3e\\xb0\\xa4\\xc6\\xfe\\x8a\\xc6\\x2d\\x09\\x39\\x91\\x2e\\x9a\\x69\\xd3\\x61\\xa7\\x44\\x8a\\xa4\\xa6\\x8b\\x45\\x1b\\x69\\x25\\x2c\\xe8\\x6c\\x4d\\x7a\\x51\\x01\\x0b\\x89\\x5b\\x74\\x96\\x92\\x6c\\x23\\x5d\\x74\\x38\\x55\\x3b\\x39\\x5a\\x30\\xd9\\x74\\xbc\\x50\\x44\\x5a\\x73\\x8b\\x9f\\x52\\xbb\\xc9\\x81\\x9c\\xdc\\x2d\\x14\\x54\\x9c\\xa6\\x95\\x24\\x67\\xe4\\xe7\\x05\\x39\\xb0\\x00\\x9c\\x5a\\x1a\\xe2\\x90\\xba\\xf6\\x54\\x15\\x44\\xcf\\x38\\xc3\\x19\\x7f\\xa0\\x37\\xe2\\x70\\x45\\x7a\\xfd\\xfe\\x4c\\xd8\\xf9\\x5d\\xa4\\xba\\xbf\\x07\\x9f\\x0c\\x66\\x3a\\xed\\x78\\x8b\\x4f\\x56\\x30\\xfa\\xc0\\x9b\\xec\\x74\\xb8\\x3a\\x93\\xee\\x32\\x79\\xb0\\x01\\x3d\\xab\\x3a\\xe0\\x4b\\x76\\x38\\x5c\\xe1\\x64\\x0b\\x3e\\x69\\x27\\x84\\xc1\\x6a\\x86\\xd5\\x09\\xf0\\x80\\x1f\\xa2\\x70\\x94\\xe1\\xe4\\x4c\\xcb\\xee\\x84\\xe2\\xd5\\x95\\xe4\\x48\\xa2\\x68\\x64\\x2d\\x29\\xdd\\x65\\x5a\\x15\\xd9\\x43\\xa6\\x38\\x16\\x5b\\x69\\x33\\x4a\\x2b\\x99\\x52\\x54\\x0e\\x53\\x45\\x84\\x7d\\x86\\x17\\xf2\\xc8\\xed\\xc5\\x75\\x8b\\x0e\\x5e\\xf1\\x1b\\x73\\x39\\xd9\\x2a\\xe4\\x1d\\x2d\\x3e\\x12\\xb8\\x46\\xbc\\xbc\\xf0\\x9c\\xd6\\xea\\x40\\xfe\\x10\\x29\\xa2\\x53\\xa8\\x86\\x61\\x8d\\x31\\xde\\x18\\x11\\x6b\\x01\\xc0\\x65\\x06\\x7a\\xb2\\x55\\xea\\xb4\\xb7\\xe5\\x26\\xc5\\xd8\\xd4\\x60\\xbb\\xa3\\x43\\xf2\\xa3\\xd7\\x2b\\x64\\x38\\x63\\x61\\x9f\\x37\\x1c\\xf6\\xfa\\xc2\\xdc\\x7b\\xc6\\xb0\\xb4\\x22\\xd4\\x3d\\xd1\\x1f\\x0c\\xf6\\x4f\\x74\\x07\\x07\\xa5\\xb0\\xf1\\xdf\\x9a\\x19\\x4f\\xce\\x13\\xaa\\x54\\x30\\x16\\x0b\\x06\\xe3\\x71\\xd2\\x3f\\x70\\xe5\\x12\\x80\\xfa\\x5f\\x09\\x2f\\x8b\\x00\\x47\\xd8\\x0c\\x4f\\x48\\x2f\\x24\\x44\\x31\\x5b\\x9b\\xb1\\x93\\x98\\xb9\\x52\\x51\\xa3\\x6f\\xae\\x70\\xa3\\xd0\\x54\\x6b\\x31\\x11\\x9a\\x7b\\x1e\\x89\\x72\\xb3\\x44\\x48\\x94\\x39\\x29\\xaf\\xe7\\x09\\xff\\x81\\xaa\\x09\\xff\\xaf\\x6b\\x22\\xb3\\xdd\\x14\\xde\\xc2\\xd3\\xf8\\x1c\\x14\\x4e\\xc3\\x52\\x76\\x3b\\x9a\\x27\\x4e\\x09\\xf1\\xed\\x6a\\x5b\\x9a\\xe7\\xd0\\x03\\xaa\\xd9\\xb9\\x97\\x90\\x65\\xee\\x7f\\xa3\\x95\\x97\\x7f\\xfe\\xd5\\xeb\\xcf\\x9c\\xe0\\x2e\\xbd\\x32\\xf7\\xca\\xeb\\x73\\x9f\\x7f\\x15\\x8d\\xcd\\xbd\\xa0\\x52\\x21\\xc6\\x97\\x31\\x38\\x77\\x0f\\xe1\\xc0\\x59\\x0b\\x37\\x42\\x85\\xfa\\x46\\x4e\\x90\\xc6\\x30\\x1c\\x13\\xac\\x4c\\x14\\x03\\x06\\x5c\\x45\\x41\\xf2\\x68\\x85\\x0e\\x67\\x0c\\x57\\x07\\x81\\x8d\\x5d\\xe8\\x4f\\x90\\x1d\\x79\\x25\\x2f\\x77\\xe7\\xe4\\x80\\x50\\x08\\x47\\xd2\\xc3\\xd8\\x7b\\x1d\\xfc\\xb2\\xd9\\x72\\x2c\\x68\\x7e\\x12\\x45\\x75\\xb5\\x23\\xae\\x6e\\xc8\\xa1\\xb3\\xf2\\xf7\\x77\\x72\\xe5\\x2a\\xc8\\xca\\xaa\\x9a\\x89\\x63\\xc7\\xef\\xcd\\x8e\\x34\\x60\\xd6\\x39\\x70\\x9c\\x6f\\x2b\\xd7\\x54\\xd2\\x95\\xda\\xcb\\x63\\x96\\x9b\\x7f\\xff\\x1d\\xec\\xd3\\x84\\xe3\\x46\\x7b\\x1a\\x8c\\xd0\\x0c\\x56\\xd8\\x56\\xc5\\x73\\xd3\\xbc\\x24\\xf1\\x0c\\x36\\x28\\xdf\\x88\\xec\\x46\\x40\\x22\\x19\\xbf\\x2e\\x9b\\x72\\x35\\xa4\\x37\\x21\\x5b\\x56\\xa3\\xab\\x62\\xbe\\xb9\\xf4\\xea\\xd3\\xb8\\x9c\\xaa\\x10\\xe0\\x90\\x32\\x6a\\xb1\\x5c\\x93\\x1f\\x9a\\x5c\\x8b\\xe4\\xe9\\x74\\x69\\x16\\xc8\\xf3\\x63\\x52\\x66\\xcd\\x0b\\x84\\x0b\\xac\\x8a\\x3c\\x7b\\x89\\x3c\\x36\\xb8\\x76\\x59\\xf2\\xd8\\x1b\\xc9\\xe3\\x60\\x38\\x29\\x26\\x5b\\x6e\\x31\\x52\\xb4\\x0c\\x5b\\x20\\xdc\\xae\\x72\\x11\\x36\\x2f\\x1f\\x2d\\xbf\\x48\\xd9\\x45\\x65\\x3c\\x49\\x64\\x0c\\x42\\x06\\xee\\x5b\\x86\\x94\\xb2\\x2f\\x21\\x27\\xd3\\x45\\x81\\x66\\xe7\\x61\\x09\\xc9\\xbd\\x75\\xa5\\x96\\xc1\\x2a\\x9b\\x70\\x9c\\xec\\xa2\\xfd\\x43\\x4d\\x64\\x18\\x76\\x51\\xa4\\x47\\x5a\\x49\\xe9\\xc3\\xfa\\x98\\x78\\x41\\x11\\x7c\\x4b\\xe8\\xd3\\xa0\\xe7\\x68\\x81\\xa2\\x43\\xb5\\x79\\x38\\xba\\xab\\x36\\x03\\x9f\\x87\\xa0\\x36\\x07\\xf7\\x2e\\xca\\xbc\\xd5\\x94\\x33\\xa7\\xe2\\x4f\\x13\\x0b\\x79\\x73\\x08\\x38\\x0b\\xc8\\x73\\xf8\\xc6\\xe4\\x39\\xc2\\x22\\xf2\\x1c\\xe2\\xdc\\x65\\x06\\x9d\\xcb\\xa1\\xfb\\xb0\\x67\\x97\\x89\\x74\\xa8\\x63\\xff\\xbf\\x92\\xa3\\xd3\\xa5\\x99\\x97\\xe3\\x25\\xe2\\xd1\\x15\\x41\\x88\\x43\\xc3\\x3c\\x26\\x65\\x9f\\xbe\\xa6\\x91\\x2c\\xf6\\xc6\\xb2\\x10\\x87\\x56\\xf1\\x42\\xde\\x6c\\x11\\x72\\xd5\\x13\\x85\\xca\\x72\\x11\\x97\\x9e\\x17\\xad\\xa7\\xec\\xcf\\x15\\xe9\\x2a\\xee\\x0c\\x1c\\x93\\x6f\\xde\\x9f\\x1f\\xb9\\xba\\x84\\x4b\\xba\\x72\\x03\\x89\\x0b\\xae\\x26\\x95\\x5e\\x2c\\x9a\\xa8\\x0b\\x9b\\x12\\xcc\\xb5\\x0b\\x21\\x72\\x9a\\x7a\\x36\\x71\\x6b\\x55\\xd9\\xad\\x15\\xb1\\x89\\x17\\x94\\x70\\x72\\x09\\xed\\x1a\\x38\\xf8\\xbc\\xda\\xf6\\xc6\\xde\\x5d\\x01\\xa4\\xa1\\x73\\xab\\xc0\\xc0\\xb8\\x00\\x6c\\xd0\\x06\\xfb\\xd8\\x3c\\x0a\\xbb\\xa6\\x44\\x19\\x00\\x5a\\xf5\\xa5\\x22\\x02\\x9e\\x33\\x89\\x72\\x28\\xad\\x20\\xae\\x24\\x07\\xe8\\xc0\\x6c\\x81\\x34\\xd6\\xdb\\x4d\\x25\\xb9\\x55\\xca\\xdb\\x05\\xd2\\x10\\x12\\x6a\\x12\\xf3\\x02\\x69\\x1e\\x11\\xa0\\x89\\x74\\x01\\xb5\\xb0\\x79\\x16\\x1d\\xe5\\x5e\\x28\\xa5\\xb9\\x3c\\xe0\\x71\\x01\\xc9\\x5a\\x88\\xb7\\x55\\x68\\xd6\\x70\\xa5\\xd4\\xb0\\x79\\x01\\xd7\\xda\\xdc\\x77\\x7f\\x54\\x66\\x5b\\xfb\\xfa\\xd7\\x55\\x6b\\x5f\\x44\\xd5\\x94\\x6b\\xaa\\xb5\\x73\\x87\\x29\\xeb\\xda\\xdc\\x2b\\x2f\\x82\\x9a\\xf2\\x0a\\x69\\xef\\x07\\x33\\x58\\x20\\x09\\x9f\\x99\\x1f\\x47\\x6b\\x29\\x67\\x62\\x32\\x97\\x96\\x7b\\x48\\x07\\x40\\xc1\\x23\\xf4\\xe8\\x45\\xa5\\x53\\x5b\\x92\\x93\\x52\\x99\\xa3\\x6c\\x09\\xd2\\x21\\x09\\x89\\x8a\\x19\\x48\\x47\\xa4\\xac\\xe6\\x9f\\x53\\x35\\x0b\\x9e\\x4e\\x4a\\xa1\\x28\\x28\\xb8\\xe6\\x28\\xeb\\xf8\\x85\\x2c\\x44\\x4a\\x4f\\x27\\xbd\\xdb\\xc3\\xcb\\xc1\\x9c\\x2c\\xd0\\x90\\xb4\\x86\\x99\\xe8\\x2a\\x61\\x7b\\x35\\x69\\xd1\\x77\\x0e\\x35\\x8a\\xda\\x17\\xd1\\x1a\\xd5\\x0f\\xdd\\x69\\xda\\x20\\x9c\\x47\\xda\\xd3\\x00\\xe0\\x84\\x6e\\x88\\xc3\\x26\\xc6\\x0a\\xef\\x33\\xd0\\x91\\xb5\\x64\\xb4\\x9c\\x12\\x36\\x54\\xe6\\xb5\\xbb\\x2c\\x84\\x1a\\x9e\\x8c\\x59\\xb7\\xd0\\x09\\xed\\x21\\x17\\x2f\\x14\\xb4\\x82\\xd8\\x43\\xc2\\xee\\xb0\\x8f\\x17\\x0a\\x4e\\x64\\xec\\x26\\xb1\\x4c\\x9a\\x6f\\xc0\\x81\\x84\\xf3\\xba\\xe5\\xf0\\x20\\x69\\x71\\x2e\\xb8\\x0c\\x32\\x24\\xd5\\x57\\x48\\xc9\\xbf\\x94\\x6e\\xd7\\xfe\\x3b\\x75\\x2b\\x6a\\x05\\x31\\x16\\xa7\\x3c\\x99\\x72\\xcf\\xbf\\x43\\xc5\\x4e\\x97\\x66\\x39\\x2a\\xae\\x25\\x19\\xec\\x72\\x74\\x7c\\x84\\xe5\\xbd\\x65\\x1d\\xf7\\x12\\x1d\\xfd\\x90\\x82\\x1b\\x98\\x8e\\xed\\x0b\\x74\\xec\\xc1\\x3a\\x4a\\x44\\xc7\\x56\\x3a\\xb9\\xb4\\x8b\\xe9\\x98\\xc6\\x55\\x07\\x44\\x27\\x4b\\x74\\xf1\\x45\\x6d\\x8b\\xdb\\x2b\\x50\\x77\\x96\\x3d\\x39\\x50\\x7a\\xda\\x89\\xa6\\x29\\xe3\\xd2\\x9a\\xb2\\x8c\\xb8\\x76\\x29\\x97\\x25\\x94\\xbd\\x50\\xce\\xa1\\xf9\\x65\\x10\\x5c\\xa9\\xbf\\x48\\x72\\xef\\xcb\\xd7\\xd6\\x72\\x2d\\x95\\xf5\\xbd\\x9f\\xe8\\x9b\\x85\\x0d\\x70\\x2f\\xd3\\x77\\x68\\x81\\xbe\\xe3\\x86\\x92\\x9c\\x49\\x28\\x6e\\x4d\\xa9\\x10\\x72\\x67\\xf4\\xa2\\x12\\xd3\\x96\\xe4\\xac\\x44\\xda\\xea\\xd0\\x45\\xa5\\xdf\\x52\\x92\\xfb\\xad\\xa4\\xb3\\x19\\x63\\xb0\\x11\\x89\\x4a\\x3f\\xc3\\x60\\x35\\x5f\\xd4\\xba\\x43\\x31\\x86\\x81\\x12\\x8e\\xe0\\xea\\xc3\\xf8\\x10\\x41\\x61\\x03\\x46\\x81\\x50\\x10\\x2a\\xae\\x48\\x6e\\x49\\x3c\\xea\\x26\\xe3\\x65\\x40\\x74\\xa6\\x51\\xe2\\xee\\x59\\x0e\\x74\\xdf\\xae\\x97\\xde\\x2f\\x0f\\x2e\\xa2\\x0d\\x03\\x0d\\xc3\\xf3\\x24\\x4b\\x23\\x2b\\x61\\x1a\\xce\\x30\\x44\\x93\\x0b\\x10\\x1d\\x30\\x94\\xe4\\x70\\x42\\x9e\\x4a\\x17\\x7d\\xb4\\x5c\\x5c\\x2b\\x91\\x45\\x6d\\xd0\\x45\\x45\\xb4\\x94\\x0a\\x2e\\x11\\xe9\\xc5\\x62\\x88\\x16\\x7f\\xa2\\x95\\xd4\\xcf\\x8d\\x96\\x52\\x61\\xc2\\xd8\\xab\\x17\\x8b\\xab\\xe8\\xf9\\x55\\x89\\xe2\\x04\\x2d\\x09\\xb7\\x21\\x51\\x59\\x15\\x22\\xb9\\x46\\x72\\x80\\xe4\\x1a\\x03\\x49\\x9a\\xa4\\x56\\x62\\x88\\x7d\\x61\\x5e\\x50\\xba\\xa7\\x97\\x86\\xb8\\xb6\\x0e\\xdf\\x60\\x19\\xa1\\xa5\\x80\\xae\\x2d\\x36\\x77\\xd4\\x02\\x8b\\xdc\\xb5\\xe5\\xe8\\x12\\x50\\x73\\xcd\\xb5\\x35\\xfe\\xaf\\xd6\\xa6\\xd3\\x9f\\x2d\\xae\\xfe\\x03\\x82\\x33\\x28\\xa4\\xfe\\x2c\\x37\\x04\\x46\\x00\\x5b\\x36\\x92\\x75\\x65\\x5d\\x3a\\x97\\x2e\\xa2\\x3b\\xf3\\x8b\\x5f\\x3c\\x5a\\x7a\\xe7\\xf1\\x7f\\xfa\\xf9\\xd9\\x5f\\xfc\\x0c\\xbd\\xf0\\xab\\x4b\\x8f\\xfc\\xf3\\x3f\\x3d\\x34\\x77\\xe9\\x37\\x2f\\xbd\\x87\\x63\\xac\\xf6\\x2b\\xb3\\xea\\xbf\\xd3\\x1c\\x25\\xdc\\x0d\\x19\\xb8\\x93\\x32\\xb0\\x28\\xb1\\x32\\x3b\\x5d\\x87\\xa1\\x94\\x37\\x10\\x96\\x3e\\x12\\x76\\xcb\\x1e\\xa9\\x9c\\xd0\\x53\\xb8\\xc0\\xb2\\x94\\x64\\x03\\x0d\\xab\\x09\\xef\\x8a\\xdb\\x9b\\xcb\\xc9\\x29\\xfe\\x39\\xbd\\xa6\\xc5\\xd1\\x16\\xc5\\xae\\x6e\\x16\\x94\\x26\\x23\\x76\\xf5\\x98\\x83\\x17\\x94\\x16\\x2f\\x69\\x44\\x28\\x1a\\xc1\\x1c\\xca\\xe0\\xcb\\x1a\\x81\\x11\\xe3\\xd3\\x01\\xa7\\x6c\\xc8\\x24\\x36\\x48\\x38\\xa2\\x8b\\x64\\xe3\\x28\\x6b\\x77\\xba\\x50\\x78\\xc1\\x62\\x1f\\xe1\\x08\\x81\\x3e\\xf7\\xb1\\xd4\\xd4\\x8b\\x87\\x53\\x39\\x0a\\xff\\xe0\\xbe\\xc4\\xb6\\xe2\\xed\\x83\\x2b\\x7e\\xde\\xdc\\x84\\xa6\\xd2\\x03\\x18\\xeb\\x07\\x5d\\x7d\\x7e\\x8c\\xbd\\x4e\\x4b\\x31\\x0e\\xf8\\xbf\\xb0\\xf3\\x7b\\xd3\\x3f\\x79\\x84\\xe2\\xec\\x6f\\xf9\\xed\\x9b\\xbe\\x7f\\xfd\\x7b\\x5f\\x1c\\x39\\x94\\x54\\x1d\\xed\\x89\\xed\\xff\\xca\\xe5\\x97\\x6d\\x02\\x86\\x58\\xda\\x1e\\xc6\\xb8\\x10\\xfe\\x2c\\x92\\xc7\\xb7\\x41\\x18\\xd7\\x3b\\x5b\\x31\\x2e\\x3c\\xe3\\xcc\\xa1\\x1c\\x6c\\x1a\\x57\\x3a\\x4d\\x46\\xae\\xa3\\x8b\\x24\\x06\\xd1\\x5a\\x08\\x85\\xa1\\x13\\x89\\x8a\\xdb\\x54\\x22\\x59\\x61\\x33\\xa2\\xdc\\x25\\x5a\\x5e\\x56\\xe7\\x64\\xa7\\x50\\xe4\\x5b\\x3b\\x3a\\xc3\\xd8\\x33\\x93\\xa9\\xb4\\x1b\\x5d\\x85\\x53\\x0b\\x97\\x5f\\x75\\x79\\xb5\\x5e\\xc3\\x85\\x56\\x43\\x72\\x2d\\xee\\x00\\x8d\\xe9\\x3f\\x24\\x5d\\xb4\\xcd\\x64\\x46\\xb0\\xec\\xe4\\x8b\\x7c\\x6b\\x7b\\x07\\xd6\\x42\\x76\\x0b\\x72\\x67\\x63\\x5d\\x50\\xa7\\x4b\\x53\\x9f\\x23\\x4c\\x4f\\x8a\\xa7\\xc6\\xda\\x6c\\xa4\\x85\\x53\\x59\\x9f\\xbd\\x44\\x9f\\x28\\xdc\\x74\\x15\\x7d\\xba\\xeb\\xe9\\x23\\x32\\xdb\\x28\\xed\\xd1\\x5c\\x8d\\x75\\xba\\x88\\x5e\\x3c\\xcd\\xa2\\x1b\\x5a\\x89\\x16\\x54\\x75\\x95\\xfb\\x6c\\xb9\\x78\\x6a\\xac\\x5e\\x1f\\xab\\x59\\x70\\x4c\\xbf\\x93\\x44\\xbf\\x3e\\x58\\x0f\\x0f\\xd4\\xd5\\x10\\x97\\xbd\\x63\\xe9\\x62\\x17\\xcd\\x3a\\x57\\x48\\x48\\xde\\xb0\\x40\\xe3\\x76\\x5c\\x1b\\xee\\xa1\\xb9\\xe4\\xbc\\xf6\\xb2\\xdb\\x2a\\x8f\\xe0\\x2b\\x59\\x7a\\x25\\x9b\\x28\\x8e\\xd0\\xfc\\x73\\x72\\xde\\xcc\\x4a\\xb6\\x87\\x17\\x94\\x56\\x42\\x3d\\xd9\\x25\\xf1\\x82\\xbc\\x3e\\xd7\\x10\\x8c\\x06\\x15\\x8c\\xba\\x28\\x1d\\x6d\\x5c\\xdf\\x68\\x8c\\xdf\\xff\\xd7\\xb0\\x96\\x8d\\x7d\\x87\\xf0\\x9e\\x91\\xb4\\xd0\\x04\\x26\\xc8\\x02\\x6d\\x43\\x86\\xaa\\xc0\\x9d\\x2c\\xb2\\xa2\\xa7\\xcd\\xe3\\x16\\x24\\x2a\\x3a\\x3d\\x9b\\xca\\xcf\\x98\\xbc\\xd5\\x2c\\xcc\\xa6\\x1c\\x68\\xea\\x4e\\x97\\x66\\x9e\\x07\\x6d\\x1d\\x6b\\x9c\\x99\\x67\\x43\\x53\\x3f\\x8b\\xbd\\x76\\x9e\\x47\\xd3\\x05\\x1d\\xf0\\x91\\x2a\\xd6\\xe4\\xa2\\x93\\x72\\xf8\\x3a\\xd5\\xa5\\xa2\\xa1\\x83\\xd2\\xf9\\xe2\\xa0\\xaa\\x93\\x92\\x7a\\x5b\\x4a\\x4a\\x53\\x8b\\x44\\x09\\x7d\\x5d\\x64\\x44\\x9b\\x62\\xb5\\x94\\x94\\x30\\x12\\x15\\xce\\xc5\\x06\\x59\\x77\\xb4\\xb0\\xf1\\x8b\\x15\\x6a\\x58\\x47\\x7a\\x69\\x92\\x4d\\xca\\x12\\xfb\\xea\\x62\\xa6\\xcd\\xaf\\x55\\xa8\\x62\\xcf\\x96\\x19\\x37\\xe7\\xde\\x44\\xef\\x7a\\x13\\xc3\\xe1\\x8e\\x35\\x99\\x00\\xe1\\x6c\\xfa\\xb1\\xfa\\x79\\xcd\\x5e\\x18\\x82\\xdb\\x99\\xf4\\x64\\x52\\x6d\\x50\\x4d\\x26\\xae\\x91\\x30\\x28\\xa1\\x68\\x39\\x3a\\xf1\\x0a\\x2e\\x2a\\x43\\xa6\\x92\\x3c\\x64\\x55\\x3a\\x91\\xa8\\x38\\x4c\\x25\\xd9\\x61\\x95\\x8d\\xc1\\x8b\\xbc\\x22\\x99\\x4a\\xb2\\x94\\x50\\x8c\\x26\\x4a\\xac\\x2f\\x0d\\xf1\\x42\\xd1\\xa3\\x0d\\x8a\\xa4\\xa9\\xbd\\x93\\x97\\xad\\xb8\\xa8\\xf0\\xf0\\x82\\x62\\x6d\\xcd\\xe5\\xe4\\x2c\\x2f\\x1b\\x6b\\xca\\xea\\xaa\\xd5\\x7a\\x22\\x59\\xe7\\x12\\x24\\xe5\\x74\\xde\\xf6\\x54\\xef\\xde\\xdf\\xbc\\x79\\xfb\\xe7\\x76\\x67\\x9d\\xe1\\xb4\\x2f\\xbd\\x6d\\x20\\x28\\xed\\xfa\\xc2\\x2d\\xb9\\xdd\\xfd\\xb3\\x99\\xbe\\x8e\\xa1\\x1e\\x4f\\x70\\xd5\\x4d\\xab\\xf6\\xce\\x86\\xb2\\x51\\xa7\\xa3\\x7b\\x58\\xec\\x59\\x2d\\xda\\xd5\\xd7\\x7e\\xfc\\x1b\\xa7\\xc7\\x57\\xdf\\xf6\\xd0\\x44\\xd7\\xe4\\x9a\\xac\\xe0\\x18\\xbd\\xe1\\xc8\\xf0\\x0d\\x8f\\x1d\\x1c\\x0c\\x05\\x8a\\x29\\x7f\\xef\\xba\\xd8\\xc0\\x2d\\x63\\x91\\xe7\\x5d\\xa9\\xc9\\xde\\x8e\\xb5\\x99\\xa0\\x74\\xfd\\x89\\x0d\\x97\\xce\\x91\\x38\\x99\\xf0\\x97\\x69\\x9e\\x07\\x80\\x56\\x48\\x41\\x2f\\x1c\\x67\\x9c\\x50\\x04\\x9d\\x0e\\x0d\\x4b\\xb0\\x16\\x04\\xa2\\x62\\xd0\\x94\\x8a\\xda\\x1e\\x8f\\xa5\\xdc\\x5b\\xd4\\x47\\x92\\x6a\\xc0\\x58\\x92\\x03\\x34\\x69\\xea\\x62\\x92\\x44\\xd6\\x76\\xc8\\x22\\x51\\x09\\xe0\\xdc\\xa9\\x99\\x4c\\x46\\xe0\\x9f\\x37\\x58\\x3c\\x1d\\x52\\xa6\\x97\\x44\\x34\\x5a\\x0c\\x8f\\x2b\\x45\\x28\\x92\\xe4\\xe6\\x9c\\x6c\\x11\\xc8\\xba\\x3e\\x84\\x38\\x68\\x39\\x6c\\x66\\x61\\x5c\\x37\\xb2\\xe9\\x96\\x49\\x67\\x76\\xfd\\x1d\\xab\\xdd\\x89\\x73\\xcf\\xcc\\x2e\\x83\\xcf\\x4c\\xe5\\x8e\\xe5\\xb8\\xd6\\x23\\x73\\xf2\\x9a\\x25\\x70\\x39\\xf1\\x9f\\x81\\xcb\\x73\\x04\\x17\\xc2\\x99\\xe5\\x10\\xe4\\xcc\\x87\\x03\\x8e\\x17\\xb9\\xd4\\xbf\\x06\\x38\\xbb\\x9e\\x3e\\xf7\\xe6\\x32\\xc1\\x51\\x0f\\x97\\xc7\\x84\\x95\\xf1\\x39\\x4b\\xf0\\xe9\\x84\\x7e\\xb8\\xaf\\x1a\\x1f\\x71\\x31\\x3e\\x99\\x79\\x7c\\x72\\x04\\x1f\\x36\\xbd\\x8c\\xe0\\x93\\x66\\xf8\\x0c\\x20\\x51\\x09\\x23\\x5e\\xc8\\x37\\x9b\\x02\\xb9\\x8a\\xe7\\x04\\x43\\xed\\x22\\x83\\xa8\\xad\\x0c\\x51\\xab\\xeb\\xd7\\x81\\xc8\\x8b\\xd2\\xb6\\xaa\\xea\\x58\\x19\\xa9\\xfa\\x28\\xbd\\xf0\\xb3\\xd5\\xef\\x1e\\xfb\\xd2\\x33\\xb9\\x5a\\xb0\\x96\\x06\\x4a\\xfd\\x0c\\x8a\\xce\\x7d\\x7f\\xfb\\x73\\x85\\x4b\\xff\\x5a\\x0b\\x59\\x15\\x56\\x67\\x08\\x56\\xab\\x60\\x1a\\xfe\\xa0\\x1a\\xab\\xd1\\x32\\x56\\x51\\x5c\\x28\\x66\\xb4\\x25\\x79\\x95\\x54\\x58\\x11\\xc5\\x95\\xb3\\x90\\xa6\\x94\\x4f\\xa8\\x16\\xc0\\x38\\x35\\x0f\\x23\\xad\\x64\\x0c\\x1b\\x4b\\xf2\\x30\\x83\\x71\\x23\\x85\\x51\\x4e\\x48\\xa4\\x22\\x31\\xbc\\x08\\xc9\\x50\\x34\\x33\\xca\\x90\\x8c\\xe7\\x40\\x99\\x72\\xf2\\x42\\xa1\\x15\\xb9\\xa6\\x71\\xdd\\xc2\\xa0\\xa5\\x6c\\x12\\x16\\x5e\\x36\\xe5\\x94\\x68\\x86\\xf5\\x11\\x5e\\x0d\\xd6\\xc6\\xb5\\xba\\xc6\\x48\\x1f\\x3e\\x71\\x7f\\x6c\\xdc\\xaf\\xb3\\xd9\\x59\\xe5\\xee\\xf6\\x50\\x56\\x92\\xbc\\x91\\x11\\x7f\\x53\\x0b\\xad\\xdc\\x79\\x96\\x69\\x83\\x7f\\xfb\\xd3\\xa8\\x4f\\x6f\\x17\\x9a\\xed\\xa1\\x6e\\xe7\\xc9\\xe8\\x70\\xcc\\x15\\x6a\\x61\\x5d\\xb1\\xf2\\x62\\xa3\\x68\\x98\\x4d\\x6e\\x25\\x36\\x91\\x60\\x14\\xae\\x83\\xe7\\xab\\xad\\xd2\\xbf\\xd8\\x83\\x47\\xca\\xd0\\xcb\\xf1\\x84\\x7c\\x4d\\xba\\xd8\\x41\\x83\\x96\\x0d\\x12\\x92\\xaf\\x4f\\xc8\\x81\\x8b\\xc5\\x28\\x6d\\xda\\x4c\\x47\\x03\\x7a\\x51\\x41\\xc6\\x92\\x8c\\x12\\x4a\\xda\\x58\\x92\\xa3\\xcc\\x3c\\xc3\\xcc\\x3c\\x0e\\xab\\xbc\\x19\\x47\\x2f\\x63\\x34\\x7a\\x19\\x4b\\x14\\x37\\xd3\\xe8\\xe5\\xa3\\x48\\x24\\x73\\xb5\\xf2\\xcd\\x9e\\x7e\\x6c\\xb4\\x31\\x5e\\x31\\x10\\xda\\x98\\x11\\x66\\xa8\\xd1\\x45\\x86\\x6a\\x60\\xa0\\x3a\\x75\\xc2\\xb2\\x59\\x6a\\xeb\\x84\\xf5\\xcd\\x74\\xb2\\x76\\xda\\xc9\\xee\\x5a\\xb3\\x20\\x47\\xed\\x3c\\x94\\xa5\\x0d\\xc5\\x05\\x6a\\x66\\xa7\\x5c\\x1a\\x5e\\x94\\xcf\\xfc\\x49\\xed\\x84\\x95\\xb2\\xbd\\xe4\\x8a\\xbd\\xb6\\xc0\\x4b\\xbf\\x86\\xbd\\x8a\\x13\\xb4\\x27\\x72\\x53\\xa2\\xd8\\xc1\\x7a\\x90\\xa7\\x49\\xf2\\x49\\x1b\\x4b\\x85\\x40\\x1a\\xd7\\xd1\\xc7\\x68\\x07\\x72\\x7a\\xa1\\xb1\\x0a\\x51\\x87\\x53\\x2f\\x16\\x27\\xe9\\xc5\\xc9\\x44\\x31\\x4a\\xc7\\xe3\\x6f\\x45\\xa2\\x32\\x16\\xa0\\xfc\\x86\\x93\\x7c\\xd1\\x62\\x88\\xf7\\x77\\x90\\xd2\\xad\\xbe\\xa9\\x94\\x4d\\x13\\xbc\\x50\\x08\\x44\\xb7\\xd0\\xb5\\x21\\xff\\x23\\x76\\xb3\\x55\\xf5\\x45\\xd7\\xb7\\xd9\\x5f\\xb7\\xe5\\x36\\x8a\\xb1\\xa9\\xc1\\xb6\\xb6\\xc1\\xa9\\x98\\xb8\\x31\\xd7\\x66\\xa8\\xb5\\xd9\\x03\\x61\\x9f\\x2f\\x8c\\x7f\\xf5\\x4c\\x55\\xee\\xbb\\xee\\x5e\\x8f\\xb7\\xeb\\x2f\\x6d\\x5a\\x64\\xaa\\xaf\\x07\\x45\\x91\\xf6\\x62\\xab\\x81\\xbb\\xf2\\x53\\x0e\\xd4\\xdf\\x85\\x7e\\x18\\x83\\x69\\xf8\\x43\\xba\\xde\\x85\\x9c\\x49\\x2b\\x61\\x5d\\x49\\x5e\\x29\\x51\\x0a\\x05\\x77\\x5a\\xd1\\xeb\\x4a\\xf2\\x94\\x54\\xd4\\xac\\x8e\\x59\\x4c\\xa2\\x1c\\x4c\\x2b\\x1a\\x5d\\x49\\x1e\\x97\\x64\\x8d\\x55\\x09\\xcc\\xaf\\x09\\x9c\\x6b\\x2e\\xc9\\x39\\xab\\x32\\x82\\x44\\x59\\x23\\x15\\x43\\x74\\x44\\xde\\xb8\\x24\\x87\\xac\\xca\\x3a\\xda\\xe1\\x1f\\x64\\x2d\\x26\\xb9\\x0a\\x67\\xea\\x08\\x9f\\xd7\\x5b\\x32\\x38\\xed\\x84\\x04\\xc5\\x9e\\xc8\\xe5\\xe4\\x75\\x7c\\xde\\x4d\\x07\\x16\\xb7\\x0a\\x72\\x57\\x0e\\x94\\xd5\\x61\\x5e\\x50\\xa0\\x2b\\x97\\x53\\x02\\x31\\x32\\xb0\\x4c\\xd6\\x13\\x4e\\x55\\x8b\\xa0\\x34\\xdb\\x2b\\x03\\x9c\\x16\\x0c\\x0d\\x73\\xd1\\x29\\xe6\\x7e\\xa4\\xa1\\xdd\\xcd\\x74\\xe2\\x51\\x78\\xe1\\x92\\xc1\\x43\\xc8\\xac\\x46\\x95\\x45\\xc3\\xb8\\x81\\x83\\x8f\\xdf\\xbc\\xaa\\x3f\\x3c\\x19\\x3e\\x9c\\x39\\xb3\\x25\\x30\\x3c\\x28\\xf1\\x56\\x51\\xca\\xfa\\x37\\x1c\\x1a\\x6b\\x9b\\xbb\\xd5\\xd9\\xbd\\x22\\xbc\\x65\\xe5\\xed\\x7d\\xa7\\x37\\x8e\\xdf\\xd5\\x2d\\x48\\x83\\x23\\xa1\\xb5\\xb7\\x4d\\x76\\x7f\\xcb\\xea\\xeb\\xb0\\xaf\\xce\\xae\\xdc\\x96\\x71\\xa1\\xb3\\x3f\\x34\\x79\\x23\\x6e\\xbf\\xd8\\x6a\\x41\\xfa\\x89\\xbb\\xb7\\x67\\xd4\\xbb\\x0e\\xa5\\x57\\x7e\\x6e\\xed\\x88\\x2d\\x28\\xba\\x5a\\xc4\\x80\\x6d\\xc5\\xa1\\x2f\\xde\\xbc\\x9b\\x9f\\x90\\xb6\\x0c\\x06\\x0f\\x3c\\x34\\x32\\xba\\x66\\xc0\\x17\\x0f\\x09\\xc9\\x2d\\xfb\\xfb\\x1d\\xd1\\xa0\\xfd\\xa3\\x1f\\xbd\\x45\\xed\\x8b\\x0d\\xa0\\xac\\xd6\\xd8\\x35\\x9a\\xf2\\x85\\xb2\\x8c\\x33\\x79\\x6a\\xee\\x1e\\xc2\\x5b\\xba\\x16\\x76\\x42\\x85\\xae\\x74\\x61\\x3f\\xbd\\xdf\\x00\\xcd\\xf3\\xfd\\xf4\\x2d\\x46\\xda\\x4f\\xdf\\xb2\\x74\\x3f\\xbd\\x5f\\x28\\xb4\\xb3\\x7e\\xfa\\x5f\\x97\\xdb\\xb4\\x7e\\x67\\x7d\\x43\\xc6\\xd3\\x15\\x67\\xa6\\x96\\xee\\xac\\xbf\\xf1\\x89\\x43\\x43\\x0d\\x78\\x50\\x47\\x37\\x9a\\xbb\\x16\\x77\\xd6\\x3f\\x6e\\xd8\\x7a\\xea\\x2b\\xa4\\xde\\xfa\\x23\\xf5\\xb3\\x2c\\xe6\\x8b\\x42\\x0f\\xdc\\xc3\\x98\\x77\\xec\\xda\\x72\\x8b\\x1f\\xc6\\xac\\x53\\x57\\x2a\\x06\\x2c\\x1e\\xad\\x49\\xa4\\xde\\x1a\\x27\\x19\\x89\\x05\\x87\\x7b\\x92\\x6c\\xa1\\x13\\xe6\\x8d\\x6c\\x21\\xc9\\xa0\\x85\\x17\\x9e\\xd7\\xda\\x3d\\xd1\\xee\\x58\\x0f\\x6d\\x27\\xcf\\x9b\\x5d\\x74\\xc4\\xb4\\xdd\\x43\\x79\\x6d\\x2d\\x3c\\x0d\\x66\\x02\\x82\\x82\\x8c\\x39\\x52\\x89\\x88\\x2e\\xac\\x33\\xd4\\x63\\x07\\xc5\\x51\\xf0\\x32\\x19\\x42\\x23\\xe7\\x9e\\x99\\x6d\\xc4\\x12\\xaa\\x7a\\x83\\x84\\xbe\\x4b\\xe0\\x70\\xef\\x87\\x88\\x83\\xc8\\x70\\x28\\x98\\x5d\\x2d\\x31\\x92\\x63\\xfe\\xc7\\x81\\xc0\\x11\\xef\\x32\\x81\\xf8\\xe8\\xd3\\xe7\\xde\\x6c\\x04\\x04\\xfa\\x79\\x39\\xcc\\xad\\x60\\x51\\x8e\\x73\\x93\\xf0\\xc9\\x25\\xb1\\x88\\xe9\\x4a\\xc5\\x30\\xc5\\x22\\xac\\xa3\\x4b\\xf9\\x30\\x2c\\xc2\\x04\\x8b\\x08\\xc3\\x42\\x42\\xa2\\x62\\x41\\x24\\xb4\\x92\\x23\\x3c\\x46\\x24\\x18\\x6a\\x67\\xdd\\x64\\x18\\x91\\xb6\\x25\\x11\\x09\\x33\\x44\\x62\\xbc\\x9c\\xbc\\x2a\\x22\\xe5\\x38\\x77\\x39\\xfc\\xb1\\x79\\x1a\\xe2\\x46\\x1b\\xd3\\xc8\\xaa\\xcd\\x2c\\xbc\\x9d\\xcb\\x94\\x09\\x65\\x35\\x0c\\x97\\x72\\xfc\\x34\\x04\\x5b\\xe0\\xdc\\x92\\xc8\\xe4\\x74\\xa5\\x62\\x9a\\x22\\x93\\xa6\\xa1\\xd3\\xc6\\x4a\\xe8\\xb4\\x46\\x2a\\x17\\xc3\\x18\\xa9\\xb4\\x24\\x07\\x70\\x58\\x44\\xc3\\x28\\x8c\\xda\\x4a\\x24\\x16\\xd7\\xd1\\xa3\\x75\\xac\\xfe\\x9d\\x31\\x92\\x0e\\x0c\\x8c\\xe5\\x56\\x16\\x2d\\xc9\\x43\\x38\\x3f\\x2a\\xd8\\x3d\\x5a\\xb2\\xba\\xdd\\x3a\\x41\\xc6\\x18\\x5a\\xec\\xe5\\x5a\\x42\\x9a\\xa7\\xe8\\xe5\\xf0\\x9d\\x57\\x43\\x6f\\xf1\\x28\\xb8\\x72\\x42\\xab\\x6d\\x07\\xba\\x0a\\xac\\x87\\x6a\\x03\\xa5\\x13\\xf3\\x00\\xff\\xaa\\x36\\x42\\xaa\\x8b\\xf8\\x03\\x35\\x31\\xd2\\xe5\\x7b\\xcb\\x89\\xf4\\xe0\\x12\\x73\\x79\\x9f\\x07\\x50\\x4f\\x6b\\x9e\\x87\\x26\\x30\\x80\\x19\\x36\\x95\\xb9\\x27\\x39\\xc2\\x4e\\x6a\\x80\\x32\\x31\\x1e\\xc7\\x11\\x0a\\xa0\\xab\\x53\\x50\\x5a\\x19\\x11\\x69\\xbe\\xd9\\x64\\xce\\xd5\\x50\\x91\\x86\\x70\\x8e\\xf3\\xfc\\xdb\\x6f\\xa1\\xaf\\xfd\\xf9\\xe5\\xdd\\x13\\xe7\\x9e\\x99\\xbd\\xa0\\x9a\\xbc\\x70\\xe9\\xd2\\x05\\xcd\\x5a\\x9a\\x73\\x2c\\x96\\x65\\xe3\\x87\\x22\\x8b\\xd2\\x6c\\xae\\x95\\x04\\x27\\xf9\\xb2\\x24\\x7f\\xf1\\xf4\\xb9\\x37\\x99\\x24\\xe5\\x59\\x4b\\x65\\x39\\xce\\x12\\x39\\x78\\xd8\\x7c\\x55\\x39\\x84\\x06\\x72\\xd8\\x98\\x1c\\x85\\x66\\x93\\xc5\\xca\\xda\\xbe\\xab\\x45\\x21\\x89\\xae\\x2c\\x4d\\x90\\xa6\\xab\\xb2\\x40\\xb7\\xb2\\xb4\\x83\\xf3\\x92\\x2f\\x13\\x99\\x70\\x9a\\xb1\\x93\\x54\\xf3\\x18\\xeb\\xad\\x70\\x72\\x25\\xd9\\x27\\xb1\\x56\\x29\\x44\\x89\\x25\\x65\\x6b\\x42\\x8e\\xa7\\x8b\\x5a\\x9a\\x52\\x3a\\x24\\x32\\x55\\xd8\\x75\\x51\\xf1\\x19\\x4b\\x79\\x9f\\x8b\\xd0\\x2f\\xb7\\x36\\x89\\x79\\x17\\x99\\x7e\\xe5\\x72\\x37\\x89\\x05\\xa3\\xcf\\xa5\\x17\\x8b\\x88\\xa6\\x17\\x94\\x28\\x1a\\x69\\x75\\x24\\x40\\x4e\\xd3\\x44\\x45\\x26\\x15\\xbb\\x70\\xb5\\x50\\x6b\\x75\\xe4\\x72\\x39\\x25\\xea\\xe3\\x05\\xa5\\x23\\x4e\\x66\\xf0\\x58\\x79\\x41\\xb1\\x4b\\xb5\\x7d\\x4b\\x34\\x25\\xd4\\x65\\xa3\\xfd\\x72\\xad\\xbb\\x9b\\x08\\x0c\\x73\\xdf\\x6b\\x38\\x29\\xfd\\xdf\\xfa\\xca\\x10\\xfd\\xaf\\x45\\x2e\\xcd\\x38\\xb9\\x5f\\xd1\\xdc\\x05\\x61\\x18\\x80\\x9f\\x42\\xbe\\x8d\\xf4\\xea\\x94\\x59\\xd6\\xfb\\xf4\\x25\\xd9\\x9c\\x90\\x5b\\x12\\x48\\x1e\\x4c\\xc8\\x96\\x8b\\x05\\xb3\\x05\\xcc\\xa2\\x12\\xb1\\x94\\x14\\x37\\x12\\x0b\\x66\\xb7\\xdf\\x2c\\x2a\\x29\\x4b\\x49\\x4e\\x25\\x14\\xbf\\xa5\\xa4\\xac\\x98\\xe7\\xaf\\x31\\x5b\\xe2\\xaf\\x83\\x62\\x31\\xc7\\x5f\\x47\\x4a\\x8b\\x1b\\xef\\xbb\\x5b\\x28\\x97\\x0d\\x7f\\xfa\\xe5\\x59\\xc2\\x6e\\x62\\xb6\\x16\\x4c\\x66\\xb7\\x0d\\x67\\x41\\x05\\xab\\xa5\\xc5\\x26\\x16\\x5c\\xf8\\x7f\\x7c\\xde\\x83\\xcf\\xe7\\xad\\x96\\x96\\x2a\\x82\\x13\\x57\\x2e\\x6f\\x32\\xbb\\xf1\\x9e\\x27\\x07\\x05\\x93\\xd5\\xe5\\x21\\x04\\x27\\x95\\x3d\\x42\\x6c\\x12\\x01\\x42\\x57\\x24\\xa7\\xf8\\x82\\xc6\\x60\\xa7\\xd9\\x7c\\x5f\\x8c\\x17\\x14\\x3f\\xe4\\xc8\\xfa\\xca\\x0b\\x62\\xa6\\x38\\xa2\\xbd\\x47\\x91\\x6c\\x2b\\x72\\x65\\x5d\\xba\\x85\\xcb\\xc7\\x57\\xb7\\x14\\x4e\\x0e\\xcd\\x7c\\xf1\\xc6\\x96\\xbe\\x4c\\xca\\x66\\xcf\\x4a\\x73\\x43\\xe7\\xbb\\x77\\x0c\\xfe\\x4a\\xdc\\xdc\\xf9\\xb3\\x81\\x67\\x76\\xee\\xcf\\xce\\xfc\\xfe\\xa1\\x1d\\x4f\\x1f\\x5f\\xf3\\x8f\\xad\\xd9\\x4d\\x29\\x71\\x7d\\x5f\\x6b\\x5b\\x6e\\x7d\\x57\\x6c\\x63\\x7f\\x10\\xbd\\xbe\\xf7\\xc2\\x67\\xa6\\x8d\\x36\\x9f\\xd0\\xbd\\x2b\\x37\\xfe\\x94\\x18\\x58\\x19\\xcc\\xfa\\x06\\x83\\x43\\x8f\\x8b\\xf7\\xcd\\xbd\\xfa\\xd2\\xdd\\xaf\\x7f\\x6e\\xf3\\x86\\x53\\x85\\x7b\\xd6\\xde\\xb1\\x2d\\x11\\x99\\xba\\x73\\xf3\\x96\\xdb\\xd7\\x85\\x22\\x93\\x87\\x41\\xcd\\xb8\\x9a\\xcf\\x80\\x1b\\x3c\\x30\\x08\\xf7\\xcf\\xf3\\xb3\\xe2\\x7c\\x3f\\xdf\\x49\\xd6\\x76\\xd4\\x96\\xe4\\x41\\xa9\\xd0\\xdf\\x99\\xd4\\x8b\\x8a\\x5f\\x53\\xca\\x8b\\xaa\\x32\\x95\\xe5\\x3c\\x7f\\xeb\\x8a\\x3a\\xfc\\xad\\x43\\x48\\x54\\xdc\\x38\\x96\\xf7\\x0e\\xe6\\xc8\\x14\\x04\\xad\\xbf\\x33\\x49\\x16\\xc7\\x69\\x16\\x94\\x6e\\x91\\x78\\x29\\x65\\x75\\x55\\x3a\\x93\\x64\\xa2\\x69\\x5d\\x76\\xd7\\xab\\x0c\\x1c\\x59\\x4c\\xfc\\xfa\\xd3\\x78\\xa3\\x46\\x88\\x3a\\xd4\\xb0\\xdc\\xd7\\xeb\\x35\\x3a\\x90\\xd8\\x81\\x70\\xc6\\x92\\x38\\xca\\x0e\\x61\\xe8\\xc6\\xb9\\x90\\x95\\xcc\\xd9\\xe0\\xaa\\x4b\\xc8\\x36\\xb6\\x4c\\x24\\xa2\\xcb\\xa7\\x39\\x28\\x4d\\xaf\\x91\\xf1\\x94\\xfa\\x1d\\xbc\\x50\\xd4\\x5a\\x23\\x51\\x3a\\xf7\\xbf\\xcd\\xc3\\x0b\\x05\\x3b\\x32\\x86\\x17\\x8d\\x3b\\x58\\x8a\\x44\\x16\\xe7\\xd7\\x8d\\x88\\x64\\x87\\x70\\x68\\x78\\x75\\x32\\x59\\xb5\\xbf\\x9c\\xbf\\xff\\x17\\xd0\\x09\\xe7\\xfc\\x8d\\x74\\xba\\x1d\\x47\\x79\\x57\\xd7\\x49\\xb5\\x6a\\xbe\\x2d\\x93\\xea\\x74\\x96\\xe8\\xe4\\x85\\x1e\\xb8\\x81\\xe9\\x14\\x5a\\xa0\\x53\\x94\\xab\\x04\\xb9\\x55\\x6b\\x34\\x96\\x23\\x5c\\x1f\\x22\\x53\\xa0\\xe5\\x0e\\xbe\\xa8\\x75\\xba\\xdc\\x56\\x36\\x56\\xa4\\x25\\x07\\x4a\\x34\\x44\\xf5\\xeb\\x59\\x5a\\xbf\\x05\\x8d\\x93\\xf5\\xf9\\x7f\\x5f\\x61\\x4d\\x92\\x0d\\x68\\x80\\xd5\\x6a\\x56\\xe0\\x5c\\x7e\\xa3\\x86\\x10\\xb8\\xac\\xe7\\x19\\xa2\\x67\\x2f\\x8c\\xc3\\x27\\x98\\x9e\\x83\\x65\\x3d\\x03\\x38\\x09\\x77\\x6b\\x4b\\x72\\xaf\\x54\\x90\\x02\\xdd\\x7a\\x51\\x71\\x69\\x4a\\x24\\x61\\x53\\x08\\xd6\\x60\\x08\\xd6\\x11\\x08\\xfa\\x2c\\x25\\xb9\\x8f\\x84\\x68\\x04\\x82\\x09\\x24\\x2a\\x7d\\x0c\\x82\\x95\\x7c\\x51\\xeb\\x0a\\x74\\x33\\x08\\x94\\x0e\\xb2\\xe2\\xd5\\x9a\\x41\\x02\\xc2\\x38\\x19\\x2a\\x12\\xe8\\x26\\x77\\x2e\\x55\\xd2\\x34\\x68\\x52\\xac\\x8f\\xcf\\xd1\\x46\\x69\\xd8\\xd9\\x08\\xb9\\xeb\\xeb\\x25\\xe6\\xcb\\xa7\\x6a\\xb9\\x95\\x35\\x0c\\x4b\\x5a\\x96\\x77\\xc1\\x00\\x4c\\xc1\\x19\\x86\\x66\\x7c\\x81\\xd7\\xf4\\x71\\x25\\xb9\\x23\\x21\\xaf\\x4f\\x17\\x3d\\xb4\\x28\\x1f\\x96\\x08\\x8d\\x0a\\xba\\xa8\\x44\\x2d\\xa5\\x82\\x23\\x8a\\xf4\\x62\\x31\\x40\\x0b\\xed\\x28\\x1d\\x95\\x60\\x34\\x96\\x0a\\xa3\\xc6\\x94\\x5e\\x2c\\x0e\\xd2\\xf3\\x83\\x89\\xe2\\x28\\x2d\\xbf\\x37\\x23\\x51\\x19\\x0c\\xf0\\x42\\x41\\x6b\\x8d\\xf7\\xd1\\x42\\x24\\x4e\\x9d\\x6b\\x00\\xe3\\xea\\xe9\\xe0\\x05\\xa5\\x6b\\x6a\\xe9\\x32\\x7c\\xc9\\x36\\xa5\\xbe\\x7a\\xc3\\x43\\x16\\xe1\\x7b\\xa2\\xb6\\xa4\\x9f\\xa9\\xc1\\xd3\\xb0\\x28\\xba\\x5d\\x84\\xf0\\xc7\\x6b\\xc3\\x5a\\xdb\\xc2\\x34\\xf9\\x52\\x6d\\x24\\xa0\\x86\\x93\\xf0\\x2b\\xf5\\x29\\x2e\\xc1\\xe6\\xed\\x66\\x41\\xb6\\x25\\x8a\\x4d\\x06\\xf0\\x90\\xb9\\xd6\\x0a\\x32\\x90\\x59\\x21\\x7e\\x03\\xb8\\x39\\x91\\xcd\\xdd\\x95\\x5b\\xa4\\xa2\\xd9\\x02\\x01\\x4e\\x94\\xdb\\x24\\xa5\\xa7\\x42\\x16\\xa1\\x69\\x00\\xc8\\x49\\x35\\x37\\xa7\\x72\\x75\\x26\\xdd\\xc1\\x54\\x88\\x77\\xb4\\x27\\xbd\\x9e\\x64\\xa7\\x53\\xe5\\xec\\x48\\x78\\x02\\xc9\\x36\\x81\\x30\\xea\\x27\\x3a\\x1c\\xaa\\xc4\\x1b\\x6f\\x7c\\xcd\\xdb\\x13\\x14\\x5a\\x3a\\x45\\xc1\\x13\\x0b\\xda\\x6c\\xc1\\x98\\xea\\x46\\x77\\xbc\\xcd\\xee\\xee\\x8c\\xd9\\x5a\\x62\\x21\\xbb\\x3d\\x14\\x03\\x35\\x0c\\x5e\\x39\\xaa\\x7e\\x95\\x4b\\x80\\x87\\xb0\\xeb\\x7d\\x0c\\xf2\\x36\\xa0\\x79\\x48\\x85\\x31\\x3c\\x6f\\x20\\xec\\xf4\\x94\\x6c\\xcf\\x6b\\x29\\xc9\\x5e\\x2b\\x65\\xa6\\x66\\xcb\\xe1\\x78\\x81\\x2e\\xf9\\x13\\xe3\\x9f\\x6b\\xd2\\x38\\x6c\\x81\\x30\\x1b\\x8f\\x62\\x20\\x5d\\xb9\\x51\\x1b\\xad\\x23\\x86\\xf8\\x02\\x98\\x5b\\xe3\\x6c\\x30\\x8a\\x71\\x89\\xc1\\x28\\xaa\\xf6\\xb6\\xf9\\xb1\\x28\\xb6\\xf9\\xb1\\x28\\x7d\\xbd\\x99\\x08\\xb1\\x72\\xfb\\x58\\x70\\x38\\x3f\\xb6\\x6a\\x02\\x5b\\x7a\\xf3\\xe4\\xb8\\x3c\\x3d\\x32\\xf1\\x6e\\x93\\xf1\\x03\\xa7\\x1f\\x9b\\xf5\\x49\\x4b\\x80\\xdf\\x7d\\xac\\x85\\xda\\xd2\\x68\\x98\\xdd\\x71\\x72\\xe4\\xc5\\xbb\\xb1\\x3d\\xfd\\xa7\\x6f\\x78\\x6c\\xcd\\x7f\\xbf\\x4b\\x9c\\x6c\\x43\\xdf\\xd1\\x89\\xd3\\x47\\xe7\\xee\\xd1\\xa8\\x9f\\x7a\\xfc\\xc6\\x71\\x50\\x53\\xce\\x5f\\x52\\x46\\x04\\xa1\\x03\\xae\\xa3\\xba\\x93\\x45\\x47\\x14\\x5d\\x39\\x71\\xa8\\x10\\x59\\x0c\\x90\\x74\\x14\\xa3\\x8b\\x0a\\x67\\x2a\\xc9\\x1c\\x5d\\x8d\\xdb\\x29\\xe1\\xea\\x20\\xe9\\x22\\x6e\\xe6\\x78\\xa1\\xe0\\x0b\\xb5\\x75\\x60\\xf5\\x2c\\xbc\\x62\\x6b\\xc7\\xaa\\xeb\\x6c\\x64\\x48\\x1a\\xed\\xcd\\xaf\\x4b\\x02\\x8c\\xcb\\xbe\\x3a\\x44\\xc0\\x97\\x70\\x91\\x77\\x55\\x32\\x60\\x6e\\x82\\x96\\x78\\xff\\x45\\x74\\x41\\x36\\x97\\xba\\x1e\\xa9\\x71\\x12\\x97\\x75\\x57\\x55\\x46\\xfd\\xb1\\x4a\\x7b\\x46\\x59\\x9f\\xb3\\x44\\x9f\\x08\\xec\\xb8\\xba\\x3e\\x5d\\x75\\xf4\\x89\\x22\\x51\\xe1\\x70\\x6e\\x1f\\xca\\xc9\\xcd\\x7c\\xd1\\xd7\\xd6\\xde\\x19\\x21\\x6a\\x09\\x8a\\xad\\x63\\xf9\\x6a\\xb1\\x92\\xaf\\x8e\\x66\\x8f\\xd2\\x02\\xaf\\x81\\x6e\\x33\\x55\\xf5\\x2b\\xaa\\xdb\\xad\\x44\\xb7\\x0c\\xac\\x83\\xb3\\x57\\xd3\\x4e\\x4e\\x92\\x69\\xce\\x61\\x9a\\x2b\\x0f\\x48\\x48\\x9e\\xa8\\x68\\x1b\\x0a\\x5e\\xe4\\xcb\\xd3\\x2e\\x16\\x68\\x2e\\x5b\\xac\\xf2\\x2a\\x7c\\xb1\\x97\\x5e\\xec\\x4d\\xb0\\x31\\x7c\\xca\\x7a\\x24\\x2a\\x62\\x88\\x17\\x14\\x9d\\x2f\\x97\\x53\\x56\\xf5\\x92\\x70\\xbf\\x02\\x84\\x12\\xc6\\xf1\\xea\\xba\\x86\\x3e\\xdb\\x60\\x00\\x4a\\x1d\\xa4\\x36\\x37\\xe6\\x04\\x6b\\x80\\xe2\\x3b\\x0d\\x19\\xc3\\xb0\\xef\\x10\\x3e\\x64\\x92\\x16\\xba\\x20\\x06\\x22\\xe4\\xad\\x18\\x4a\\x7f\\x5a\\x8e\\x24\\x14\\x03\\x0e\\x0d\\x7a\\x12\\x4a\\x1c\\x89\\xa0\\x18\\x22\\x84\\x90\\x41\\xb6\\xf2\\x8a\\xca\\x45\\x4a\\x23\\x47\\x03\\x52\\x64\\xec\\xe1\\xcb\\x25\\x46\\x46\\xfc\\xd3\\xe7\\xde\\x5c\\x16\\x3b\\xb2\\xe6\\x7b\\xcc\\xf3\\x55\\xb0\\x77\\xee\\x3c\\x59\\xa3\\xcc\\x0b\\x49\\xd8\\xcb\\xea\\xdd\\xa1\\xf2\\xf2\\x64\\x31\\x8e\\x50\\xf0\\xa0\\x44\\xb9\\xe5\\x4e\\x6f\\x2c\\x29\\x1e\\x9f\\x54\\x59\\xa6\\x2c\\xcc\\x96\\x29\\x93\\x90\\xa8\\x84\\xe9\\xf2\\x64\\x21\\xda\\x7a\\x19\\x72\\xd0\\x4e\\xa0\\xd8\\xfc\\xf2\\x64\\x32\\xe2\\x09\\xa9\\xb2\\x6d\\x89\\x45\\xca\\xe2\\xaa\\x08\\xaf\\x6e\\xb0\\x4a\\xd9\\x9a\\xc3\\x9f\\x9b\\xf2\\xac\\x18\\xcc\\x3a\\xb8\\x45\\xcb\\x94\\xcd\\x9d\\xd7\\xbe\\xb8\\x68\\xa1\\xb2\\xe6\\x96\\x76\\xd7\\xdc\\xc7\\xd4\\xab\\x96\\x58\\xab\\x8c\\x63\\x36\\xbb\\x95\\xd8\\x6c\\x05\\x6c\\x86\\xa3\\xb5\\x56\\x93\\xfb\\x13\\xf2\\x64\\xba\\x18\\xa7\\xe9\\x60\\xb5\\x84\\xe4\\x2d\\x09\\x39\\x7a\\xb1\\x98\\xa6\\x1e\\x9e\\xb6\\xe2\\x6a\\x59\\x71\\x9c\\x7a\\xf9\\x34\\x12\\x95\\x74\\x94\\x17\\x8a\\x06\\xde\\x19\\x21\\x0b\\xd0\\x0e\\xf1\\xb2\\x2b\\x27\\x8f\\x0b\\xb2\\x3f\\xb7\\xc8\\xee\\x4a\\xbc\\x9f\\x17\\xe4\\xcd\\xcb\\xb1\\x7f\\x23\\xcf\\x5f\\xae\\x6f\\xa4\\x1a\\x27\\x85\\x65\\x79\\x8e\\x76\\x53\\xc3\\x14\\xa1\\x02\\xed\\x95\\xf7\\xd4\\xef\\x69\\xcc\\xe0\\x81\\x28\\x3c\\xc8\\x46\\x07\\x5b\\xd4\\x25\\xd2\\x2d\\x49\\x16\\xa5\\x20\\x73\\x21\\x0d\\xea\\x52\\x5e\\x4d\\x56\\x4a\\xd6\\x97\\x8a\\x46\\xb3\\x53\\x6d\\x12\\x15\\x63\\x53\\x65\\xd1\\x64\\xaf\\x89\\x94\\xfc\\x21\\x24\\x92\\x29\\x9c\\x06\\x29\\x6f\\x21\\xec\\x14\\x16\\x53\\x13\\x9d\\xc0\\x1a\\xf2\\xf2\\x82\\xa2\\x76\\xe6\\x70\\xa9\\x51\\xd0\\x69\\x09\\x5d\\x27\\x28\\x16\\x81\\xe4\\x30\\x8a\\xd1\\xcc\\x0b\\x0a\\x78\\x73\\x39\\x45\\x67\\x60\\x64\\xde\\x36\\xab\\x80\\xcb\\xff\\xde\\xaa\\xb9\\x61\\x95\\xa1\\x22\\x84\\x37\\x8f\\xa7\\x5e\\xa7\\xfd\\xe3\\xaf\\xfa\\x56\\x7b\\x54\\x4d\\x73\\x2f\\x23\\xd3\\xdc\\x3f\\xa1\\x81\\xcb\\xff\\xc7\\x3b\\xea\\xdf\\x72\\xea\\xc6\\xf4\\x5b\\x1b\\xb7\\x86\\x93\\x5a\\x63\\xa6\\x27\\x90\\x89\\x38\\x55\\x27\\xd1\\x28\\x5a\\xdf\\xe2\\x0a\\xbc\\x3a\\xf7\\xca\\xb7\\xe6\\x3e\\xf7\\x6a\\xc8\\xe9\\x9e\\x7a\\xf2\\x5f\\xce\\xff\\xe0\\x1f\\x57\\xf4\\xaa\\xce\\xf7\\x4d\\xf4\\xdc\\x5a\\x20\\x79\\x83\\xf6\\xca\\x8f\\x39\\xbd\\xfa\\xcf\\x20\\x09\\xeb\\x69\\x5b\\x70\\x07\\x80\\x28\\xc7\\xd2\\x8a\\x57\\x5f\\x92\\x33\\x74\\x91\\x24\\xd9\\x92\\x56\\xc6\\xf4\\x25\\x79\\x93\\x54\\xdc\\xe0\\xec\\xd0\\x98\\x44\\x65\\x83\\xb6\\x44\\x9a\\x80\\xa1\\xb2\\x9e\\xc4\\x10\\x12\\x95\\x0d\\xcd\\x25\\xd9\\x29\\xc9\\x1b\\xac\\x64\\x3c\\x9f\\xbd\\x99\\xb6\\xf5\\x0e\\xa5\\x78\\xa1\\xa0\\x89\\x65\\xc6\\xb0\\xdb\\x6d\\xe0\\x8b\\x86\\x68\\x76\\x64\\x0d\\x21\\xa8\\x14\\xf2\\xde\\x0e\\x4b\\x8e\\xb2\\x8a\\x04\\x73\\xa0\\x78\\x71\\x18\\x1c\\x8a\\x92\\x61\\x0f\\x4a\\x10\\x5f\\xd8\\x20\\xe4\\x21\\x35\\x44\\xfb\\xd4\\xe5\\xe1\\xc5\\x9d\\x54\\xe5\\x0e\\xbe\\x50\\xa5\\xe6\\x41\\xf0\\x8a\\x54\\xc3\\x46\\x93\\x6b\\x6f\\xa6\\x2f\\xdb\\x97\\x61\\xcb\\x9a\\x74\\xa6\\x31\\x92\\x5a\\x6d\\xee\\xa6\\xbb\\x47\\xbc\\xe9\\x44\\x97\\xc5\\xda\\x9d\\xea\\xf5\\x8e\\x1d\\x9e\\x8a\\xce\\x4d\\x23\\x57\\x57\\xb6\\xcd\\x1b\\x8b\\x76\\xb7\\x1c\\x5b\\x7d\\x66\\x9b\\x7f\\x78\\x28\\xc3\\xb7\\xef\\xec\\x1b\\xbc\\xe3\\xc6\\x81\\xef\\x8e\\x8d\\xb8\\x3c\\x6a\\xb5\\x51\\xd7\\xa4\\x51\\x39\\xdd\\x9e\\x78\\x87\\x03\\xcd\\xfe\\x50\\xd5\\x3f\\x28\\xa5\\xd1\\x5b\\xa7\\x5f\\x3a\\xd6\\x67\\x69\\x09\\xf2\\xd6\\xa0\\xdb\\x92\\xd9\\xf3\\xf9\\x9b\\xbe\\x34\\xb5\\x77\\xc8\\x6d\\xf6\\x46\\x3c\\xbf\\xb9\\x76\\xca\\xec\\x6a\\xe5\\xdb\\x13\\xc9\\xd9\\x97\\x9f\\x7d\\xea\\x7c\\x0b\\xaf\\xe6\\x6d\\x23\\xa7\\xfa\\xae\\x39\\xe4\\x69\\xd2\\xa9\\x6c\\xc1\\xd0\\xd8\\x6d\\x6d\\xfb\\xae\\xdd\\x47\\xeb\\xe8\\x74\\x8c\\xe0\\x49\\x32\\x46\\xd0\\x0f\\x29\\x78\\x60\\x89\\x51\\x82\\xb2\\x3b\\x21\\xf7\\xa4\\xd9\\x7a\\x55\\x72\\xbb\\x44\\xa6\\x41\\xd0\\x51\\x83\\x05\\xbb\\x4e\\xaf\\x17\\x2b\\x24\\x95\\x09\\x46\\x64\\x5d\\x68\\x25\\xa7\\xbb\\x68\\x4e\\x90\\x46\\xa2\\xa2\\x37\\xf0\\x42\\x5e\\x65\\x71\\xe7\\x72\\x39\\xba\\x88\\x8a\\x3a\\xa7\\x74\\xe9\\x78\\x21\\xcf\\xb5\\xf7\\xe4\\xaa\\xc6\\x1b\\x2a\\x16\\x37\\xe1\\xd2\\x5a\\x30\\xee\\xb0\\x41\\x82\\x9f\\x1f\\x93\\xf8\\xce\\x72\\xa6\\x2a\\xce\\x0f\\x58\\xe4\\x54\\xcb\\x18\\x47\\x89\\x60\\x8e\\xb3\\xaa\\x5d\\x9a\\xb3\\xa0\\x05\\x11\\x64\\x2e\\x21\\x6b\\xd3\\x45\\x15\\xa3\\xc5\\x22\\x6b\\xf6\\x96\\xc9\\xe6\\xc8\\x1a\\xa5\\x2a\\x8e\\xad\\x51\\xca\\x22\\x96\\x39\\x1a\\x9a\\xcc\\x37\\xee\\x22\\x90\\xb9\\xed\\xea\\x59\\xcd\\x19\\x08\\x42\\x16\\xc8\\x88\\x73\\xc5\\xa1\\x2d\\xc9\\x41\\xa9\\xe0\\x37\\x38\\xf4\\xa2\\xa2\\xd2\\x94\\xf2\\x56\\x32\\x0e\\x3d\\x94\\x50\\xda\\xc8\\xaa\\x90\\x0e\\xc2\\x98\\xa4\\xa8\\x0c\\x8c\\xe8\\xa1\\x7e\\xd5\\x57\\x6e\\x54\\xb5\\xbd\\x6a\\x3b\\x14\\xaa\\xe2\\x3f\\x04\\x5c\\x11\\x3a\\xa5\\xae\\x70\\x1b\\xfe\\x87\\xae\\x71\\xd5\\xd7\\xb8\\x85\\xd7\\xf4\\xd5\\xd7\\xf4\\xf3\\xd7\\xd0\\x66\\xd5\\x5b\\xaa\\xa2\\x26\\x01\\x2d\\xd0\\x05\\xb2\\x3d\\x51\\x54\\x93\\x15\\x61\\x09\\xab\\x10\\x9d\\x15\\x4b\\xa7\\xc4\\x42\\x93\\x85\\x72\\x06\\x11\\x46\\xab\\x3e\\x8c\\x87\\x83\\x30\\xc5\\x56\\xf8\\x08\\x36\\x1f\\xbf\\xfb\\x88\\x3f\\xd9\\x61\\x17\\x4c\\x9e\\xa8\\xb3\\x2b\\xd7\\x16\\x1c\\x4a\\xf8\\xd4\\xbf\\xb5\\xe5\\xf5\\x13\\xfb\\xbd\\xb9\\xbe\\x84\\xd5\\x68\\x33\\x3a\\x53\\x1d\\xad\\x99\\x88\\xd3\\x27\\x8d\\x02\\x42\\x09\\xd5\\x5b\\xaa\\xb3\\xe5\\xef\\xb6\\x24\\x8a\\xd6\\xf9\\xef\\x6a\\x2e\\x2a\\x0e\\x53\\x29\\xaf\\x71\\xe0\\xef\\x6a\\x8c\\xf3\\xdf\\x25\\x54\\x3c\\x91\\x32\\x9f\\x34\\xed\\x31\\x42\\x09\\x5f\\xaa\\xc3\\x2e\\x34\\x7b\\xba\\x9d\\x5d\\xb9\\xf6\\xe0\\x8a\\x84\\xef\\xd8\\xdd\\xea\\xb5\\xde\\x5c\\x2f\\xfd\\xa4\\xd4\\xce\\x3e\\x19\\x9d\\x7e\\xfd\\x04\\xd6\\x37\\x35\\x77\\x4e\\xf5\\x28\\x7c\\xf0\\xeb\\x7c\\x57\\xb3\\xe4\\x77\\x53\\x0b\\xbe\\x3b\\x94\\xf0\\x1d\\xbf\\xfb\\xbd\\x79\\x4d\\xf1\\x67\\x5d\\x3e\\x69\\xb4\\x7b\\x0b\\xfe\\x2c\\xe1\\xbc\\x7c\\x4b\\x7d\\x86\\xe8\\x9b\\x82\\x29\\x8c\\x34\\x4e\\xed\\x14\\x6c\\xd9\\x47\\x53\\xfb\\x22\\xbc\\xe5\\x26\\xca\\x41\\xda\\x66\\x2a\\xe5\\xdb\\xdc\\xf8\\x6c\\x5b\\x57\\x13\\x4d\\xea\\xee\\x26\\x5c\\x08\\x71\\x74\\x29\\xed\\xa5\\xec\\xd1\\xb9\\xd4\\xc9\\x53\\xc7\\xef\\x3e\\x82\\xc5\\xb6\\x61\\xb1\\xa3\\xd4\\x46\\xe8\\xdc\\xfc\\xc9\\x86\\x86\\xeb\\xae\\x63\\x4f\\x15\\xec\\x56\\xbd\\xa5\\x9e\\x99\\xd7\\xaf\\x25\\x21\\xa7\\xd2\\x0c\\x5c\\x42\\x11\\x22\\x2d\\x81\\xaf\\xec\\xa0\\x23\\x90\\xe3\\xa6\\x52\\xbe\\x35\\x8e\\xcf\\xb6\\x76\\x30\\xfd\\x5a\\x1d\\xbc\\xa0\\xb8\\x53\\x54\\xbf\\xa5\\xf0\\xef\\x5c\\xea\\xe4\\xee\\x8a\\x4d\\xa2\\xfd\\xcc\\x26\\x28\\xbd\\xd8\\x4e\\xf5\\xfc\\xe3\\x40\\x3d\\xb7\\xc1\\xfa\\xcd\\x9d\\x53\\xcf\\x10\\xbf\\xf9\\xd0\\xf5\\x73\\x7d\\xd8\\xfa\\xd5\\xf1\\xc3\\xfd\\x75\\xdd\\x13\\x10\\xca\\xa1\\x73\\xaa\\x37\\xd5\\x62\\x35\\xbf\\x9d\\x91\\xf2\\xdb\\x19\\x17\\xf0\\xdb\\x19\\x28\\xbf\\x9d\\xa1\\x3e\\xbf\\x5d\\x2e\\xd4\\xbf\\x41\\x14\\x27\\xfb\\x83\\xc1\\xfe\\x49\\x51\\xdc\\xd0\\x1f\\x52\\xed\\xef\\x1a\\xef\\x0d\\x04\\x7a\\xc7\\xbb\\xba\\xc6\\xf0\\x76\\x8c\\xf0\\x1d\\x5f\\xf9\\x3b\\xf5\\x9f\\xc3\\x07\\x8c\\x9f\\xf9\\x5a\\xb6\\x82\\x5b\\x7b\\x36\\x5d\\x66\\x69\\x56\\xdc\\x3d\\x92\\xc4\\xfa\\x26\\x96\\x24\\x68\\x66\\xb3\\x03\\x8b\\x12\\x2d\\x00\\x87\\x70\\x26\\xae\\xb1\\xe0\\x58\\xd8\\xde\\xda\\x45\\xc7\\x74\\x65\\x1b\\x14\\x6a\\xb5\\xc7\\x06\\x47\\x24\\x13\\x0c\\xf4\\x85\\x9d\\xce\\x70\\x5f\\x20\\x98\\x89\\x38\\xd0\\xb6\\x45\\x67\\xa6\\x1d\\xe1\\xde\\x40\\xa0\\x2f\\xe2\\x74\\x46\\xfa\\x02\\x81\\xde\\xb0\\x63\\xc6\\x9f\\xee\\x74\\x3a\\x3b\\xd3\\x7e\\x7f\\x1a\\xdf\\x86\\xb7\\x57\\x3d\\xa6\\x79\\xf2\\x07\\xb0\\x5d\\xf5\\x96\\x7a\\x1b\\x68\\xc1\\x09\\xe5\\x22\\x4e\\x63\\x81\\x26\\x56\\xc4\\x25\\x53\\x8c\\xa7\\xf7\\x03\\xb4\\xf9\\xf4\\x3b\\xef\\x3f\\x84\\x5e\\x1f\\x45\\x63\\x0f\\xfd\\xed\\xdc\\x07\\x0f\\x01\\x42\\x00\\xdb\\x55\\x3f\\x26\\xcf\\xb6\\x2e\\xf1\\xac\\xa2\\xa1\\xdc\\xb9\\x90\\x4c\\x75\\x52\\x12\\x3a\\x04\\xef\\xbf\\x73\\x1a\\x6d\\x9e\\x3b\\xff\\x77\\x48\\xfb\\xb7\\x0f\\xcd\\xbd\\x30\\x4a\\x38\\xe7\\x10\\x44\\xae\\xfc\\x58\\xfd\\x7d\\x8d\\x01\\x24\\xb8\\x19\\xf2\\x3d\\x18\\xff\\xb0\\xbe\\x94\\x37\\xe3\\xc2\\xd2\\xa9\\x2d\\x15\\x01\\xf5\\x98\\xe9\\x78\\x30\\xe0\\x4a\\x72\\x9b\\x54\\xd4\\xeb\\xc8\\x09\\x6f\\x5a\\xd1\\x73\\x25\\xd9\\x2d\\x15\\xf8\\x1e\\xb3\\x9e\\x92\\x26\\xab\\x2e\\x2a\\x41\\x13\\x25\\x49\\x0e\\xaa\\x78\\x41\\x69\\x92\\xc8\\x4a\\xfa\\x61\\x42\\x2b\\x99\\x4c\\xd9\\x56\\x91\\x40\\xad\\x3d\\x9b\\xc6\\x91\\x1d\\x5d\\x08\\x40\\xab\\x0b\\xe9\\x42\\x66\\xe4\\x47\\x21\\x5d\\x88\\xb4\\x7f\\x55\\xa2\\xbc\\x88\\x38\\x82\\x54\\xb7\\x89\\x3b\\xdc\\xbb\\x3e\\xf1\\xf8\\xe6\\x97\\x4e\\x4c\\x0a\\x91\\xbe\\x4d\\x03\\xd7\\x3d\\x1c\\x40\\x3f\\x19\\x9b\\x1b\\x53\\x21\\xf4\\xe4\\xf8\\xdc\\x8b\\xfe\\xcf\\xec\\x5b\\xb9\\xbf\\xff\\xa6\\x89\\x2f\\xee\\xb8\\xf1\\x77\\x4f\\x5c\\x63\\x43\\x4f\\x5c\\xe0\\x7a\\x8c\\xf6\\xe6\\x17\\x6e\\xff\\xdd\\xdd\\xf1\\x07\\xbe\\xd5\\xd2\\x17\\x6f\\x3d\\x76\\xf4\\x05\\x3e\\xd8\\x1c\\xb8\\x70\\xf7\\x27\\x07\\x32\\xcf\\xae\\x5a\\xbb\\xe2\\xc8\\x33\\xfb\\x40\\x05\\x9d\\xaa\\xcf\\xaa\\x7f\\xa8\\x71\\x81\\x0e\\xec\\x70\\x1f\\x5b\\xed\\xa5\\xa9\\x39\\x9d\\x2e\\x02\\x1d\\x73\\xa5\\xae\\xf0\\xbd\\x6a\\x9b\\x44\\x45\\x6f\\xc6\\x3e\\xe8\\x48\\xc8\\xda\\x8b\\x45\\x0d\\xe1\\xb0\\xc9\\x6b\\xb4\\xe5\\xc5\\xde\\xf3\\x5a\\xc2\\x3f\\xa9\\x85\\x26\\x51\\xd6\\x10\\x92\\xc9\\x2a\\x2a\\x61\\x0b\\x12\\x8b\\x66\\x3a\\x36\\xd1\\x89\\x83\\x66\\x3d\\x59\\x91\\x57\\xb6\\xcc\\xaf\\x17\\xce\\x9a\\x41\\xdb\\xf9\\x76\\x1e\\xf1\\x69\\x2f\\x22\\x54\\x74\\xed\\x11\\xbe\\x13\\x7d\\xe3\\xb1\\x2f\\xa0\\xb1\\x63\\x47\\x4f\\x1c\\x7e\\x64\\xed\\xd0\\x00\\x77\\xf6\\x53\\x9f\\xc2\\xd1\\xd4\\xe5\\x4b\\xaa\\x4f\\xcf\\xfd\\x0b\\x6a\\xba\\x7c\\x1c\\xed\\x7c\\xf8\\xf4\\xdc\\x39\\x40\\xa4\\x11\\xe0\\x8f\\xd4\\x7f\\x04\\x6a\\x88\\x54\\xad\\x51\\x57\\xe6\\x11\\x55\\x5b\\x70\\xe6\\xc4\\x36\\x8c\\x4e\\x34\\xc5\\x87\\x78\\xfc\\xc8\\xa5\\x51\\x20\\xcf\\x23\\x80\\xc3\\x8f\\x9e\\xfa\\xf4\\xcd\\x96\\x15\\xff\\x0c\\x01\\x3d\\x7e\\x21\\x7c\\xf7\\xe4\\x97\\x5e\\x2f\\x6f\\xaf\\x5c\\x9a\\xbb\\x47\\x7f\\x4a\\x7b\\x1a\\x10\\xe8\\x41\\x05\\xf4\\x1f\\x02\\xd0\\xfe\\x68\\x6e\\x2b\\x0e\\x66\\xaf\\x5c\\xba\\xf2\\x63\\xfd\\x29\\x2a\\x49\\xd5\\xbf\\xb7\\x55\\xef\\xc2\\x5a\\x8e\\xd1\\x4b\\xd1\\x1f\\x9a\\xe4\\x00\\x9e\\xe7\\x00\\x22\\x1c\\xc0\\x6e\\x0e\\xc0\\xcb\\x01\\x0c\\x71\\x80\\x66\\x38\\x80\\x5f\\x72\\x00\\xf7\\x73\\x00\\x63\\x1c\\xc0\\x36\\x0e\\x50\\x8a\\x03\\x38\\xc5\\x01\\xba\\x96\\x03\\xb8\\x95\\x9d\\x7f\\x82\\x03\\xc0\\xf7\\xee\\xe0\\x00\\xb6\\x73\\x00\\xb7\\x71\\x00\\xfb\\x39\\x80\\xd3\\x1c\\xc0\\xb5\\xf4\\x87\\xc6\\x38\\x40\\x21\\x0e\\x60\\x35\\x7d\\x0f\\xe0\\x6f\\xde\\xce\\x01\\xa4\\x99\\x1c\\xd3\\x1c\\xc0\\x20\\x07\\x70\\x3d\\x07\\x30\\xcb\\x01\\x3c\\xc4\\x01\\x84\\xd8\\xfb\\x1e\\x65\\xf7\\xe1\\xfd\\x13\\x54\\x36\\xf2\\x9e\\x76\\x0e\\x60\\x2f\\xdb\\xe2\\x6f\\xe7\\x38\\x80\\x28\\x7b\\xb7\\x9d\\x03\\x68\\xe6\\x00\\x44\\x0e\\x40\\x60\\xdf\\x7c\\x8f\\xc9\\x75\\x96\\x03\\xf8\\x1d\\xf6\\xbd\\xf7\\xd9\\xb7\\xf1\\x7b\\xa6\\xd8\\xbb\\x27\\x99\\xec\\xf8\\x1b\\xf7\\x70\\x00\\xaf\\xb2\\x7b\\xf1\\xfe\\x03\\x55\\xe7\\x07\\x99\\xde\\x83\\x0c\\xbf\\x1d\\x4c\\xf6\\xfd\\x4c\\x5e\\x2b\\xdb\\xba\\x98\\xec\\x37\\x70\\x80\\xf0\\xb7\\xff\\x7f\\x0e\\x20\\x5b\\x85\\xfd\\x66\\x26\\xfb\\xad\\x54\\x17\\x72\\x0f\\xc6\\xf0\\x02\\x07\\x60\\xe0\\x00\\xce\\x70\\x00\\x77\\x71\\x00\\xe7\\x28\\xf6\\xe4\\xdc\\x0f\\x39\\x80\\x1f\\x31\\x99\\xbf\\xce\\x01\\xc8\\x1c\\xa0\\xdf\\x62\\x7a\\xef\\xe7\\x00\\xad\\xe7\\x00\\x61\\x7b\\xbe\\xc4\\x64\\xbe\\x6b\\xa1\\xcd\\x09\\xf6\\xb0\\xf4\\xef\\xca\\x25\\xa6\\xd3\\x6c\\xcd\\xef\\xd1\\x9a\\x9f\\xa1\\xca\\x0e\\xb5\\xbf\\x33\\x6c\\x3b\\x59\\xf3\\x13\\xaa\\xb0\\x9e\\xae\\xf3\\xe3\\xd8\\xf5\\xda\\x67\\x9f\\xaf\\xfa\\x7d\\x99\\x9d\\x2b\\xdb\\xa1\\xf6\\x77\\x92\\x6d\\xf7\\xd7\\xfc\\x5c\\xec\\xfb\\x78\\xab\\x65\\x3f\\x2c\\xd3\\x1c\\xc6\\x50\\xbd\\x06\\x40\\x7b\\x1a\\xa0\\xbc\\x55\\xf5\\x00\\xa0\\xdf\\x03\\x40\\x4e\\xfa\\x83\\xef\\x01\\xa0\\x29\\x00\\xb8\\x81\\x60\\x75\\xaa\\xfc\\xd3\\x00\\x9c\\x6a\\xa2\\xe9\\x62\\x33\\x07\\x28\\x31\\x9f\\x4e\\x48\\x7a\\xda\\xcd\\x01\\xc2\\xf6\\x35\\xe0\\x67\\x39\\x80\\x0f\\x38\\x40\\xe4\\xbd\\x2c\\xcd\\x75\\xaa\\x49\\xc0\\x0f\\x31\\xf6\\xf7\\x05\\xf8\\x00\\xfd\\x40\\xf5\\x79\\xf5\\x6e\\xae\\x85\\x9b\\xe4\\x7e\\x83\\x2b\\x72\\x17\\x35\\x2d\\x9a\\x6d\\x9a\\x83\\x9a\\x67\\x35\\x17\\xb4\\xdd\\xda\\x6b\\xb5\\xdf\\xd4\\x6d\\xd7\\x3d\\xa3\\x37\\xeb\\xbf\\xa4\\xff\\x76\\xd3\\xe1\\xa6\\x39\\xc3\\x36\\xc3\\x0b\\x86\\xef\\x18\\x7e\\x69\\xe4\\x8c\\x0f\\x37\\xc7\\x9a\\x77\\x34\\x5f\\x34\\xc5\\x4d\\x77\\x98\\x64\\xd3\\xdb\\xe6\\xbd\\xe6\\xaf\\x99\\xff\\xd5\\xb2\\xde\\xf2\\x79\\xcb\\x37\\xad\\x9c\\x75\\x9d\\xf5\\x9c\\xf5\\x3d\\x7e\\x37\\xff\\x35\\x61\\x5a\\xf8\\xa4\\xf0\\x57\\x36\\x83\\x6d\\x87\\xed\\xf3\\xb6\\x97\\x6d\\x97\\xec\\x5d\\xf6\\x7e\\xfb\\x6e\\xfb\\x83\\xf6\\x67\\xec\\x17\\x1d\\xdb\\x1d\\xdf\\x73\\xc6\\x9d\\x17\\x5c\\xdd\\xae\\x4f\\xb5\\xdc\\xd9\\xf2\\x6d\\x77\\x97\\xfb\\x09\\xf7\\x0f\\x3c\\x66\\xcf\\xc7\\x3d\\xdf\\xf6\\x76\\x78\\x1f\\xf6\\x7e\\xe0\\x1b\\xf0\\xab\\xfc\\x7b\\xfd\\x2f\\xfa\\xdf\\x6b\\x7d\\xb8\\xf5\\x1b\\x81\\x96\\xc0\\xe6\\xc0\\xc5\\xc0\\x2f\\x83\\xc7\\x83\\xaf\\x05\\x5f\\x0b\\x65\\x42\\xef\\xb7\\x7d\\xd0\\xfe\\xe9\\xf6\\x77\\x3a\\xcc\\x1d\\x7f\\xd3\\x29\\x75\\xfe\\x20\\xbc\\x23\\x7c\\x5f\\xf8\\xd9\\xf0\\x6b\\x91\\x7b\\x23\\x4f\\x44\\x7e\\xd1\\xb5\\xa2\\xeb\\x99\\x68\\x57\\x74\\x5d\\xf4\\xe5\\x6e\\x55\\xf7\\x40\\xf7\\x83\\xdd\\xe7\\x45\\xab\\x28\\x89\\x4f\\xc5\\xfa\\x7a\\x9a\\x7b\\x9e\\xec\\xf9\\x49\\xbc\\x23\\x7e\\x28\\xfe\\x76\\xe2\\xde\\xc4\\x07\\xc9\\xed\\xc9\\xb7\\x53\\x52\\xea\\xee\\xd4\\x9f\\x4a\\xd7\\x4b\\xbf\\x23\\xfd\\x7d\\x3a\\x93\\x7e\\x2d\\x93\\xcc\\xbc\\xdc\\x9b\\xec\\x7d\\xaa\\xcf\\xd3\\xf7\\x72\\xf6\\xde\\xec\\xa3\\xfd\\x6d\\xfd\\x9f\\xee\\xff\\x65\\x6e\\xc7\\x80\\x79\\x60\\xfd\\xc0\\xf9\\xc1\\xbe\\xc1\\x97\\x57\\x4c\\xaf\\xf8\\x87\\xa1\\xfc\\xca\\x07\\x57\\xdd\\x30\\x1c\\x1b\\x7e\\x71\\x64\\x78\\xe4\\x9b\\xab\\xa7\\xd7\\xb4\\xac\\xb9\\x69\\xcd\\x53\\x6b\\xde\\x5d\\xfb\\xc9\\xd1\\xc9\\xd1\\xbf\\x1f\\x9b\\x1a\\xbb\\x30\\x1e\\x1b\\xff\\x1f\\xeb\\x7e\\x63\\xdd\\x4f\\x26\\x76\\x4c\\x7c\\x73\\x7d\\x7c\\xfd\\x97\\x36\\x4c\\x6e\\x38\\x3f\\x19\\x9e\\xfc\\xcb\\x8d\\xd7\\x4f\\x05\\xa7\\xf2\\x53\\x7f\\xb3\\xa9\\xab\\xce\\x5f\\xdf\\xa6\\xb5\\x9b\\xa6\\x37\\xed\\xd8\\x74\\x68\\xd3\\xf9\\x4d\\x6f\\x6f\\x6e\\xdb\\xfc\\xf9\\x2d\\xaa\\x2d\\x47\\xb6\\x9c\\x9f\\xee\\x9e\\xee\\x9e\\x5e\\x37\\x7d\\x70\\xfa\\xe0\\xf4\\xdb\\x5b\\x27\\xb7\\x1e\\xa4\\x79\\x31\\xbc\\x0d\\xb7\\x51\\x5e\\x3b\\x50\\x01\\x02\\x15\\x60\\x3f\\x02\\x34\\xcd\\xf2\\x62\\x33\\x7c\\x15\\xd4\\x80\\xb8\\x26\\x00\\x78\\x9f\\xb4\\x0c\\xe1\\x7d\\x04\\x4e\\x78\\x9f\\xed\\xab\\x40\\x8f\\x0c\\x6c\\x5f\\x0d\\xc7\\x91\\xc0\\xf6\\x39\\x08\\xa2\\x07\\xd9\\xbe\\x06\\x3e\\x89\\xce\\xb3\\x7d\\x2d\\x04\\x55\\x31\\xb6\\xaf\\x87\\x29\\xd5\\x24\\xdb\\x6f\\x82\\x29\\xd5\\x13\\x6c\\xdf\\xc4\\x4d\\xa9\\xfe\\x81\\xed\\x9b\\xe1\\x26\\x5d\\x1f\\xdb\\x17\\xc0\\xa9\\xfb\\x02\\xdb\\x7f\\x0d\\x9c\\xba\\xf2\\x3b\\x5f\\x87\\xa4\\xee\\x6b\\xb0\\x06\\x8e\\xc0\\x1e\\xd8\\x09\\x77\\xc0\\x1e\\xd8\\x0d\\x41\\xb8\\x05\\xee\\x82\\x20\\x4c\\xc3\\x4e\\x38\\x0c\\xfb\\x21\\x08\\x93\\xb0\\x07\\xee\\x84\\x03\\xb0\\x07\\x0e\\x41\\x10\\x8e\\xc2\\x2c\\x1c\\x80\\x43\\xb0\\x0f\\x82\\xb0\\x1f\\x0e\\xc0\\x2c\\x04\\x61\\x06\\x8e\\x91\\x6b\\x77\\xc0\\x0c\\xcc\\xc0\\x41\\x72\\x6e\\x27\\x1c\\x22\\x6f\\x1b\\x83\\x19\\x38\\x04\\x77\\x90\\xed\\x11\\xd8\\x07\\x7b\\x20\\x0e\\x41\\x58\\x03\\x33\\x70\\x18\\xee\\x82\\x23\\x70\\x00\\xf6\\xc1\\x7e\\xb8\\x03\\x82\\x20\\x41\\x12\\x92\\xd0\\x57\\xf7\\xdb\\x71\\x72\\x65\\x0f\\x1c\\x24\\xd2\\xce\\x32\\x69\\x8f\\x92\\xef\\xec\\x81\\x23\\xe4\\xfb\\xfb\\x61\\x0f\\x04\\x61\\x04\\x0e\\xc3\\x4e\\xd8\\xc5\\x8e\\x24\\x08\\xc2\\x41\\x38\\x00\\xbb\\xc8\\x5b\\x66\\x89\\x04\\x13\\x70\\x08\\x76\\x11\\xc9\\x66\\x89\\xc4\\x58\\xfb\\x9d\\xb0\\x9a\\xec\\xef\\xae\\x7c\\xbf\\xfa\\xeb\\x31\\xd8\\x00\\x07\\x88\\xbc\\x07\\xe1\\x20\\x6c\\x83\\x8f\\x55\\xbe\\x70\\x27\\x74\\xc1\\x2e\\xa2\\x0b\\x96\\xeb\\x20\\xc4\\x99\\xa6\\x51\\x18\\x80\\x60\\x9d\\x2f\\x05\\x2b\\xdf\\x1a\\x60\\x9a\\xa7\\x20\\xd5\\xf0\\xde\\x6b\\x89\\x9e\\x18\\xff\\x19\\x82\\x77\\x0a\\xe2\\xe4\\xc9\\x0c\\x0c\\x12\\xed\\xef\\x80\\xbd\\xb0\\x13\\x8e\\x12\\x3b\\xec\\x27\\x56\\xc2\\xb8\\x76\\xc1\\x9d\\x90\\x84\\x38\\xe4\\x40\\x82\\x28\\x04\\xa1\\x07\\x0e\\x42\\x10\\xfa\\xc9\\x1e\\x46\\xad\\x17\\x92\\x64\\x7f\\xbc\\x62\\x03\\x7c\\x74\\x9c\\xbc\\x3f\\x43\\xf6\\x8f\\x41\\x10\\xda\\x60\\x1c\\xda\\xea\\x48\\xd8\\xb3\\x08\\xb9\\x60\\x0d\\x76\\xc1\\x05\\xe8\\x05\\x97\\x89\\xdf\\x87\\xfb\\xb6\\x7a\\x3e\\x87\\x91\\xaf\\xe7\\x73\\x26\\x30\\xc1\\xe4\\x02\\xdf\\x59\\x9e\\xcf\\x2d\\x7c\\x06\\x4b\\x5c\\x6b\\x3b\\x89\\xd8\\x0e\\x5b\\xa7\\xfc\\x86\\xb6\\x9a\\xa7\\xda\\x20\\x0a\\x83\\x60\\x82\\xbb\\x60\\x06\\x8e\\x42\\x10\\x6e\\x83\\x9d\\x24\\x65\\x1e\\x82\\x19\\x22\\xfb\\x51\\x72\\x17\\x95\\x80\\xa6\\xc3\\xbd\\x04\\x11\\x7c\\x6e\\x0f\\x1c\\x27\\x6f\\x3a\\x4c\\xee\\x3c\\x40\\xbe\\x88\\xed\\x76\\x1b\\x1c\\x26\\x69\\x61\\x27\\xb1\\x23\\xbe\\xf3\\x18\\x1c\\x20\\x6f\\x98\\xd7\\x64\\xb2\\x26\\xad\\x98\\xe0\\xba\\x1a\\x09\\x66\\xe0\\x16\\x62\\x77\\xfa\\xde\\x9d\\xec\\xdd\\x87\\xd9\\xb5\\xbd\\x75\\xdf\\x15\\x24\\xfe\\x82\\x31\\x0d\\xb2\\xbf\\xfd\\xc4\\x6b\\x0f\\xc3\\x00\\x24\\x20\\x01\\xc7\\xc8\\x5f\\x9c\\x58\\xa2\\x8c\\x65\\xd9\\x7e\\x89\\x9a\\x34\\x3c\\x0b\\x09\\x98\\x84\\x09\\x58\\x03\\xa3\\x30\\x05\\x5b\\x61\\x14\\x7a\\x18\\xa6\\xf8\\xfd\\xd7\\xc0\\x21\\x82\\xc4\\x2c\\xc1\\x05\\xfb\\xc2\\xed\\x70\\x94\\xf8\\x4c\\x75\\x1e\\x87\\xbf\\x73\\x98\\xbd\\x77\\x27\\xdc\\xc2\\xb0\\xc3\\x5e\\x7d\\x8c\\x68\\x72\\x84\\xdc\\xb3\\x8f\\x3c\\x45\\x9f\\xc3\\x29\\xab\\x8c\\xe7\\x31\\xe2\\x49\\x77\\xb0\\xdc\\x10\\xdb\\x78\\x96\\x68\\x7f\\x07\\x1c\\x83\\x9d\\xe4\\x19\\x13\\xec\\x26\\x96\\xb9\\x83\\xdc\\x79\\x0b\\x49\\x99\\xf5\\x3d\\xa8\\x16\\x2b\\x6a\\xd3\\x7a\\x6f\\x98\\x61\\xd8\\x1f\\x22\\x9e\\x33\\x02\\x5b\\x49\\x5e\\xb3\\x15\\xda\\x48\\x7e\\x81\\x8f\\xf1\\x51\\x0c\\x4c\\xf0\\x11\\x98\\x80\\x6d\\xb0\\x0e\\x36\\xc1\\x35\\xb0\\x0d\\x82\\xf0\\x11\\x18\\x81\\x69\\x98\\x86\\x11\\x98\\x82\\x6d\\x30\\x01\\xa3\\xe4\\xd9\\x4d\\x30\\x4d\\xf2\\xe5\\x4d\\x30\\x05\\x6b\\xc9\\x13\\x13\\x64\\x9f\\x5e\\x1b\\x23\\x1e\\x3e\\x05\\xd7\\x91\\xb4\\x37\\x41\\xee\\x89\\x11\\x3f\\x3b\\xc0\\xe4\\x3f\\xc2\\xbc\\xee\\x30\\xd1\\x7c\\x96\\x95\\x0b\\x47\\x88\\x1e\\x65\\xaf\\xc3\\x92\\x63\\x7f\\xda\\x4a\\xf0\\xac\\xaf\\xf9\\x5e\\xf6\\x64\\xf9\\xfa\\x2c\\x1c\\x86\\x3d\\xb0\\x0b\\x0e\\x10\\x0f\\xdf\\xc5\\x6c\\x84\\x51\\x3f\\x4a\\xec\\x83\\xef\\xd9\\x07\\x33\\x70\\x27\\x91\\xe3\\x50\\xa5\\x7c\\x3a\\x4c\\x8e\\x6f\\x23\\x08\\x96\\x53\\xde\\x7c\\xd9\\x64\\x22\\x32\\xdd\\x46\\x34\\xd8\\x49\\xec\\x58\\xbe\\xde\\xd8\\x3a\\xf1\\xff\\x14\\xcf\\xa5\\x6f\\xbd\\x0d\\x0e\\xd6\\xc9\\x67\\x3f\\x02\\x7b\\xe0\\x16\\x82\\x0e\\xcd\\xd9\\x69\\xfe\\x3f\\x46\\x7c\\x83\\xe6\\x40\\x47\\x48\\xce\\xd2\\x0b\\x41\\x92\\xaf\\x0d\\x40\\x12\\x24\\xf2\\x7f\\xaa\\x92\\xd7\\x51\\xee\\x7c\\xf2\\x6f\\xee\\x71\\xd8\\x0b\\x4b\\xfd\\x7b\\x1b\\x00\\xa9\\x90\\x9a\\xac\\x14\\xa4\\x01\\x2d\\x61\\xed\\x6d\\x02\\x03\\x61\\xc8\\x33\\x11\\xbe\\x34\\x2b\\xf0\\x20\\x80\\x0d\\xec\\xe0\\x00\\x27\\xb8\\xa0\\x85\\x8c\\x86\\xf5\\x82\\x0f\\xfc\\xd0\\x0a\\x01\\x08\\x42\\x08\\xda\\xa0\\x1d\\x3a\\xa0\\x13\\xc2\\x10\\x81\\x2e\\x88\\x42\\x37\\x88\\x10\\x83\\x1e\\x88\\x43\\x82\\x48\\x22\\x41\\x1a\\x32\\xd0\\x0b\\x7d\\x90\\x85\\x7e\\xc8\\xc1\\x00\\x0c\\xc2\\x0a\\x18\\x82\\x95\\xb0\\x0a\\x86\\x61\\x04\\x56\\xc3\\x1a\\x58\\x0b\\xa3\\x30\\x06\\xe3\\xb0\\x0e\\x26\\x60\\x3d\\x6c\\x80\\x49\\xd8\\x08\\x53\\xb0\\x09\\x36\\xc3\\x16\\x98\\x86\\xad\\xb0\\x0d\\xae\\x81\\x6b\\xe1\\x23\\xb0\\x1d\\xae\\x83\\xeb\\xe1\\xa3\\x70\\x03\\xdc\\x08\\x37\\xc1\\xcd\\xb0\\x03\\x76\\x22\\x0e\\x9e\\x86\\x4f\\xc1\\xfd\\xf0\\xc7\\xf0\\x28\\xfc\\x03\\xfc\\x06\\x3c\\x0c\\x0f\\xc1\\x6f\\xc3\\x97\\xe1\\x19\\xa4\\x81\\x07\\xe1\\x6f\\xe0\\x14\\x9c\\x45\\x5a\\xa4\\x83\\x33\\x48\\x0f\\x9f\\x86\\x57\\xe0\\x7f\\xa2\\x26\\xf8\\x1d\\x38\\x0f\\xff\\x0c\\xef\\xc3\\xaf\\xe0\\x29\\xf8\\x0a\\xbc\\x0e\\xdf\\x82\\xaf\\xc2\\x2d\\xb0\\x0b\\x3e\\x07\\xbb\\xe1\\x0d\\xd8\\x03\\xaf\\xc1\\xb7\\xe1\\xbb\\xf0\\xa7\\xf0\\x67\\xf0\\x1d\\x28\\xc1\\x5e\\xf8\\x0b\\xf8\\x1e\\xfc\\x39\\xfc\\x37\\xd8\\x07\\xbf\\x84\\x47\\xe0\\x22\\xfc\\x25\\x7c\\x1f\\xf6\\xc3\\xcf\\xe0\\xe7\\xf0\\x00\\xdc\\x0a\\x07\\xe0\\x63\\xc4\\x9a\\x87\\xe0\\x49\\x98\\x81\\xdb\\x89\\x7d\\x66\\x49\\x1a\\xbe\\x13\\x8e\\xc1\\x3b\\x70\\x1c\\xee\\x86\\xbb\\xe0\\x1e\\x38\\x01\\xf7\\xc2\\x05\\xf8\\x3d\\x38\\x09\\x1f\\x87\\xfb\\xe0\\x13\\xf0\\x2e\\xfc\\x02\\x5e\\x00\\x19\\x14\\xf8\\x23\\xf8\\x2b\\xf8\\x6b\\x64\\x40\\x46\\xd4\\x8c\\x4c\\xc8\\x8c\\x2c\\xc8\\x8a\\x78\\x24\\x20\\x1b\\xb2\\x23\\x07\\x72\\x22\\x17\\xe4\\xa1\\x00\\xcf\\xc3\\x1f\\xc2\\x37\\xa0\\x08\\xcf\\xc1\\xab\\x70\\x1a\\xfe\\x00\\xb5\\xc0\\x4b\\xf0\\x27\\xc8\\x8d\\x3c\\xf0\\x19\\xe4\\xd5\\xee\\x3b\\x78\\xd7\\xe1\\xfd\\x29\\xdd\\xd1\\x43\\x07\\x92\\xc9\\xe4\\x5a\\xba\\x1d\\x49\\xb2\\x2d\\x3b\\x5e\\x2d\\xb1\\x6d\\x9a\\x6d\\x7b\\xd9\\x36\\x87\\xb7\\x52\\x32\\x99\\x64\\xdb\\x14\\xdb\\x4a\\x6c\\x9b\\x66\\xdb\\x0c\\xdb\\xf6\\xb2\\x6d\\x1f\\xdb\\x66\\xd9\\xb6\\x9f\\x6d\\xcb\\xef\\x1b\\xa1\\xdb\\x14\\x7b\\x6f\\x2a\\x65\\xd8\\x7b\\x60\\xdf\\xd1\\x23\\x7b\\x76\\xef\\x9c\\xdd\\x4f\\x4f\\x49\\x63\\x74\\xdb\\x3b\\xc6\\x8d\\x1e\\x3d\\x32\\x43\\x0e\\x7a\\xc7\\xd6\\x00\\xc0\\x05\\x74\\xe5\\x7e\\x19\\x9d\\x81\\x0d\\xb2\\x7e\\xf3\\x76\\x05\\xa1\\x87\\xaf\\x53\\xc6\\xb4\\xe2\\xf6\\x90\\x6c\\xbd\\x6e\\x83\\x6c\\x9f\\xde\\x1e\\x92\\xef\\xbb\\xce\\x2f\\x6b\\xc5\\x1b\\xb6\\x83\\xac\\x0e\\x8e\\xca\\x6a\\x71\\xad\\xac\\x0f\\x8e\\xbe\\x00\\x6a\\xd4\\x0c\\x2a\\x91\\x1c\\xeb\\x82\\xa3\\x79\\x7d\\x92\\x1d\\x68\\x83\\xa3\\x79\\xdd\\x26\\x76\\xa0\\xc1\\x77\\x6a\\x91\\xbd\\x7c\\x27\\x17\\x1c\\xcd\\x6b\\x56\\xb3\\x83\\x26\\xfa\\x1a\\x67\\xf9\\xa2\\x21\\x38\\x9a\\x6f\\xfa\\x2d\\x7a\\x80\\x64\\x23\\xfb\\x98\\x29\\x38\\x9a\\x37\\x9e\\x55\\x89\\x8a\\x7a\\xec\\x4e\\x71\\xad\\xdc\\x1c\\x1c\\xcd\\x9b\\x52\\x95\\x43\\x33\\x7e\\x87\\xf1\\xe4\\x15\\xa8\\x9c\\xb1\\x04\\x47\\xf3\\xe6\\x3f\\x29\\x1f\\x5e\\x27\\xdb\\x45\\x00\\xb4\\xf5\\xba\\x77\\x27\\x00\\xfe\\x6f\\x00\\x00\\x00\\xff\\xff\\xd8\\xb6\\x1f\\xe1\\x40\\xbf\\x00\\x00\")\n\nfunc fontsInconsolataBoldWebfontTtfBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataBoldWebfontTtf,\n\t\t\"fonts/inconsolata-bold-webfont.ttf\",\n\t)\n}\n\nfunc fontsInconsolataBoldWebfontTtf() (*asset, error) {\n\tbytes, err := fontsInconsolataBoldWebfontTtfBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-bold-webfont.ttf\", size: 48960, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataBoldWebfontWoff = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x64\\x93\\x63\\x8c\\x2e\\x4c\\xb0\\xad\\xdf\\xb1\\x6d\\x63\\x8f\\xad\\x3d\\xc6\\x1e\\xdb\\xb6\\x6d\\xdb\\xb6\\x6d\\xdb\\xb6\\x6d\\xdb\\xb6\\xad\\x9b\\xef\\x9c\\xf3\\xef\\x76\\xf2\\x64\\xa5\\xd3\\xe9\\x5a\\x95\\x55\\x29\\x57\\x59\\x11\\x11\\x00\\x10\\x00\\x00\\x00\\x58\\x2e\\x01\\x90\\xfe\\xd3\\xde\\x7f\\xff\\x7b\\xff\\xff\\x8f\\x88\\x88\\x92\\x34\\x00\\x00\\xe4\\x07\\x00\\x00\\x70\\xff\\xc3\\x64\\xd0\\xe1\\x5b\\x54\\x48\\x58\\x04\\x00\\x00\\xca\\x02\\x00\\x00\\xf8\\x00\\x00\\x80\\x10\\x08\\x05\\x00\\x2a\\xab\\x48\\xcf\\x04\\x00\\x00\\x75\\x01\\x00\\x00\\x75\\x00\\x00\\xa0\\x67\\xa3\\x8a\\x21\\x61\\x68\\xad\\x6f\\x07\\x00\\x00\\x63\\x02\\x00\\x40\\xbe\\x00\\x00\\xd0\\x06\\x28\\x12\\x3f\\xc0\\xd0\\xc5\\x89\\x10\\x00\\x00\\x49\\x03\\x00\\x00\\x4c\\xff\\x81\\x34\\x04\\x73\\x64\\x62\\x67\\x6a\\x0d\\x00\\x80\\x4c\\x01\\x00\\x40\\xf5\\x00\\x00\\xb0\\xb1\\x62\\x13\\x7d\\xa9\\xa9\\xbe\\xa3\\x1d\\x00\\x00\\xf6\\x9f\\x2f\\xe4\\xff\\x81\\x68\\x6a\\xe5\\x6e\\x02\\x00\\x80\\x85\\x01\\x00\\x5a\\x5b\\x00\\x40\\xc9\\x5a\\x5e\\xf5\\xf8\\xb3\\x99\\xb1\\xbe\\x11\\x00\\x60\\x60\\x04\\x00\\x00\\x18\\x01\\x00\\x00\\x2b\\x78\\x43\\x60\\xbc\\x99\\x99\\xb1\\x3e\\x00\\x60\\xf0\\x9f\\x07\\x21\\x00\\x00\\x20\\x41\\xd0\\x87\\xc4\\x31\\xb3\\x76\\x72\\x03\\x00\\x0c\\xda\\x00\\x00\\x20\\x8f\\xff\\xfc\\x43\\x73\\x35\\x54\\xac\\x6c\\x0d\\xf5\\x01\\x00\\x23\\x16\\x00\\x00\\x68\\x08\\x00\\x00\\x9a\\xd9\\x18\\x6a\\x18\\xb0\\xd6\\x77\\xb3\\x03\\x00\\x8c\\xdf\\xfe\\xef\\x2f\\x21\\x30\\x08\\xd0\\xa0\\x8d\\xbe\\xb5\\x31\\x00\\x60\\x82\\x09\\x00\\x80\\xd0\\x01\\x00\\x90\\x39\\xbb\\xa8\\x97\\xec\\x76\\xb6\\x8e\\x4e\\x00\\x80\\xb9\\x18\\x00\\x00\\xb4\\x0f\\x00\\x00\\x77\\x97\\xb1\\xc8\\xbf\\xd8\\x39\\x18\\xdb\\x01\\x00\\x96\\x34\\x00\\x00\\x20\\x17\\x00\\x00\\x1c\\xbe\\xd5\\x53\\x42\\xb9\\x1a\\x1b\\x98\\x00\\x00\\x96\\x53\\x00\\x00\\x00\\xfc\\x3f\\xae\\x24\\x14\\xff\\xcb\\xe7\\x7f\\xd2\\x9e\\xe2\\x29\\x98\\xfd\\x4f\\x27\\xc1\\x99\\xff\\xeb\\x1f\\x30\\xeb\\x9b\\x35\\xee\\xb6\\x61\\xa8\\x67\\xa4\\xa7\\xb7\\x07\\x62\\x00\\x05\\x8e\\xa8\\x67\\xa0\\x07\\x3a\\x50\\xfa\\x6f\\x0a\\xf8\\x84\\x11\\x00\\x80\\x27\\x02\\xc2\\x04\\x00\\xfe\\x7b\\x37\\xf1\\x19\\x6d\\x0a\\xf5\\x4f\\xf6\\x0f\\x5e\\x4e\\x73\\x46\\x07\\x01\\x29\\xe4\\x0e\\x32\\xe9\\x99\\x89\\x1b\\x20\\xe9\\xeb\\xeb\\x1b\\x9a\\x1e\\x19\\x9f\\xea\\x9b\\xea\\xeb\\x9b\\xeb\\xeb\\xcb\\x43\\x48\\x9a\\x35\\xf1\\x0b\\xf0\\x63\\x59\\x45\\x05\\x07\\x03\\xd7\\x59\\xe6\\xb3\\x32\\xff\\x5d\\xc0\\xc4\\x5c\\xbb\\x61\\xae\\x01\\x83\\x86\\x09\\x3c\\x4a\\x7b\\xad\\xfb\\x02\\x52\\x80\\x86\\x8d\\x02\\x04\\x24\\xc2\\x63\\x03\\xfe\\xb7\\xb6\\x9e\\x9e\\x89\\x9f\\x1e\\x16\\xb8\\x08\\x38\\x62\\x1b\\xf0\\x11\\x63\\xc0\\x3b\\x0d\\x2c\\x97\\x5f\\x13\\x7a\\x20\\x70\\xdc\\x30\\x98\\xd1\\x3d\\xd3\\x12\\xe3\\x97\\x29\\xac\\x49\\x95\\x1e\\xe7\\x88\\x93\\xa8\\xbf\\x24\\xbf\\x10\\xbf\\x04\\xbf\\x0c\\xbf\\x38\\xbf\\x34\\xbf\\x6e\\xbf\\x04\\x91\\x8e\\x7e\\x74\\x41\\xc2\\x45\\xee\\xef\\x6f\\x7f\\xc9\\x1d\\xb0\\x33\\xad\\x1e\\x6c\\x40\\x85\\xb1\\x1c\\xa2\\x5c\\x9c\\x5c\\x9c\\x7f\\x45\\xb3\\x90\\xc2\\xe4\\xdb\\xef\\xe5\\xef\\xe8\\x2f\\xc2\\x37\\xfd\\xdb\\xed\\xe3\\xeb\\xef\\xae\\x2a\\x42\\x0c\\x1f\\xfb\\x93\\xde\\x6f\\xa0\\x37\\x82\\x0b\\xdf\\xda\\xbd\\xde\\x60\\xe0\\x31\\x42\\x06\\x41\\xda\\x2e\\x9f\\xd3\\x25\\xe9\\x92\\xb5\\x10\\xb0\\x08\\x2b\\x78\\x1b\\xb8\\x08\\x19\\x61\\x7f\\x50\\x0d\\xe0\\xcc\\x18\\x5d\\x85\\xd5\\x05\\x5e\\x86\\xce\\x06\\x5f\\x87\\xd7\\x07\\x88\\x9f\\x48\\x1f\\x49\\x9e\\xd1\\x1e\\x4a\\x9c\\xd2\\x1c\\x4b\\x9d\\xc3\\x1d\\x4c\\x98\\xd4\\x18\\x4d\\xf9\\xaf\\x33\\x9c\\x34\\xad\\x35\\x9e\\x36\\x8f\\x37\\x88\\xe0\\x1f\\x43\\x14\\x45\\x66\\x47\\x18\\x49\\x6a\\x4b\\x1c\\x4d\\x2e\\x4f\\x08\\x51\\x72\\x53\\x0c\\x55\\x36\\x57\\x04\\x59\\x7a\\x5b\\x02\\x5d\\xbe\\x5f\\xbf\\xbe\\xbc\\xbd\\xb8\\xb9\\xba\\xbb\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\x20\\xa1\\x90\\x96\\x97\\x99\\x9b\\x71\\xe6\\x13\\x5a\\x9d\\x26\\xa3\\xf5\\x85\\x63\\x6a\\xd5\\x5a\\x8d\\x46\\x97\\xef\\x0e\\x38\\x1c\\x36\\xdb\\xed\\x06\\xeb\\xd1\\x17\\x9e\\xce\\xd7\\x1b\\x43\\x0a\\x09\\xf1\\xe9\\x2e\\xcd\\xfa\\x3a\\xc2\\x4f\\x71\\x75\\x74\\xc1\\x51\\x9a\\x10\\x03\\xf0\\x90\\x27\\x87\\xba\\x4b\\x07\\x0b\\x4c\\x95\\x2b\\x0b\\xa9\\x19\\x90\\x7a\\x47\\xcb\\x5b\\xd2\\xbf\\xcd\\x32\\x7c\\x4e\\x6f\\x17\\xcd\\x9a\\xad\\xb5\\xbb\\x6b\\xe3\\x76\\x77\\x90\\x83\\x87\\x10\\x08\\xfe\\x4c\\xc9\\x6c\\xb7\\x0c\\x4d\\x4f\\x2c\\xaf\\x2e\\xcf\\xb2\\x69\\x6b\\x6c\\xce\\xd8\\x83\\x49\\x1c\\x8e\\xa6\\xcc\\xb8\\x3c\\x2a\\x90\\x49\\x15\\xc0\\x06\\x80\\x42\\xe7\\xe0\\x5b\\x00\\x00\\x00\\x52\\x06\\xfa\\x05\\x18\\x04\\x74\\x00\\x1a\\x00\\x2d\\x80\\x32\\x40\\x2f\\x60\\x14\\x30\\x09\\x38\\x01\\xcc\\x00\\x76\\x01\\x27\\x80\\x2b\\xc0\\x3c\\x60\\x0d\\x90\\x08\\x58\\x04\\x8c\\x03\\xda\\x00\\x5b\\x00\\x21\\x30\\xa4\\xff\\x66\\xa6\\x2d\\xdf\\x29\\xa3\\xc9\\x8f\\xb8\\x0d\\x87\\x00\\xe2\\x3f\\xb4\\x46\\xc8\\xb1\\x81\\xda\\x98\\x1e\\x37\\xe2\\x99\\x0f\\x06\\x35\\xb4\\x1c\\x6d\\x60\\xc4\\x15\\x7c\\x0c\\x69\\xce\\xe6\\x10\\x1f\\x69\\x0f\\x44\\xf0\\xcf\\x5f\\x08\\x6e\\xa3\\x16\\x2b\\x2f\\xbf\\x48\\x2c\\x13\\x9c\\x08\\x43\\xcc\\x4b\\x80\\x97\\x08\\x99\\xd9\\x32\\xac\\x80\\x85\\x8b\\xab\\xd1\\x71\\x26\\x9d\\x59\\x72\\x22\\xbe\\xc2\\xf5\\xdc\\x72\\x56\\xf1\\x94\\x24\\x6e\\x60\\x1b\\x7c\\x9a\\xf5\\x5b\\x46\\xac\\xb9\\x11\\xf0\\x5a\\x74\\x79\\x19\\x1d\\xd5\\x14\\x08\\xa1\\x61\\x65\\xf2\\x34\\xe1\\xfc\\xf9\\x03\\x03\\x9e\\x39\\x9f\\xc4\\x65\\x01\\x38\\xe6\\xb1\\xa5\\x44\\xc0\\x92\\xe6\\xf2\\xd7\\x68\\x2a\\xfd\\x99\\xff\\x82\\x0e\\xf9\\xfc\\x22\\x78\\xe4\\xc2\\x6c\\x62\\x59\\x7c\\x5a\\xe2\\x84\\x3a\\x27\\x02\\x3d\\xc9\\xb4\\x97\\x0c\\xbc\\xc5\\x9a\\xee\\x98\\x44\\xf8\\x08\\x58\\xde\\x37\\x60\\x60\\x28\\x4a\\x2b\\x39\\xa0\\xe3\\x2b\\x51\\xf8\\x69\\x65\\x39\\xb5\\x98\\xac\\x6b\\x8e\\x9f\\xef\\x0a\\x64\\x46\\x7a\\x1f\\x67\\xf9\\xa7\\x68\\x69\\x0d\\x9a\\xf1\\xb3\\x44\\xb4\\xfc\\x68\\x8f\\x2a\\x19\\x37\\x59\\x52\\xcf\\x9a\\x96\\xd6\\xf0\\x43\\x82\\xd2\\x1f\\x3c\\xee\\xa4\\xac\\xd8\\x3c\\xf5\\xb6\\xd1\\xaf\\xdd\\xd0\\x78\\xa6\\x17\\x48\\x35\\xed\\x0f\\xb1\\x36\\xa8\\xe2\\x0e\\x8b\\x0f\\x8f\\x40\\x86\\xba\\xd0\\x4a\\x32\\x41\\x03\\x87\\xf4\\x62\\x50\\x39\\x04\\x89\\x94\\x88\\x0b\\xcd\\x71\\xbc\\x35\\xfe\\x53\\xf4\\xef\\x5d\\x0c\\x79\\xa4\\x4b\\x5c\\x82\\xeb\\x30\\xa4\\x19\\x7c\\x24\\x7e\\xb5\\x2f\\x8f\\x55\\xb6\\xf1\\x97\\x3b\\x53\\xda\\xda\\x16\\x6f\\xe0\\x4d\\x1d\\xb7\\xdf\\xb5\\x17\\x4b\\x92\\xf3\\x6d\\x2c\\x64\\x03\\x13\\xc9\\x80\\xcb\\x80\\xd2\\x0f\\x4a\\x48\\x40\\x44\\xf9\\x3d\\x04\\x7b\\xb6\\x9b\\x06\\xfc\\x48\\xe1\\x73\\xf6\\x5f\\x92\\xdf\\xf1\\x7d\\xac\\x6f\\x36\\x64\\xd3\\xcd\\x9a\\x10\\x77\\x6a\\xb3\\x33\\x3c\\xa3\\x0a\\xa4\\x87\\xcf\\xe6\\xd6\\xc3\\x64\\x44\\xa7\\x4a\\xfb\\x4c\\xa4\\x80\\xab\\x6d\\x85\\x45\\xd9\\x02\\xe5\\xf4\\xa7\\xce\\x4c\\xcf\\x28\\x48\\x0e\\x3e\\xcc\\x20\\xbf\\x61\\x7f\\xe6\\xec\\xe7\\x8f\\x84\\xff\\x07\\x37\\x4d\\x0d\\x8b\\x19\\x3c\\xa8\\xa0\\x07\\x9b\\xc7\\x6f\\x41\\xf3\\x45\\x58\\x65\\x17\\x06\\x6f\\x03\\xf9\\x62\\x6f\\xbd\\x06\\xe0\\x7f\\xb6\\x1f\\xe8\\xf7\\x17\\x80\\xe0\\xb6\\xd1\\xd5\\x0d\\x95\\x85\\xb3\\x9c\\x4c\\xaf\\xd5\\x2a\\xf1\\xa9\\xb3\\xf1\\xea\\x6d\\x2e\\x5e\\xbd\\xb2\\x63\\xd1\\xec\\xe1\\x4a\\x6f\\xe3\\xda\\x79\\xdd\\x82\\xb3\\xe9\\x36\\x88\\xb3\\x83\\x11\\x05\\x74\\x88\\x78\\x98\\x36\\x6d\\x0f\\x49\\xa4\\xf7\\x42\\x12\\x84\\x78\\xc0\\x00\\x4b\\xa4\\x6c\\xa1\\x9f\\xc2\\xf0\\x8f\\xd0\\x0b\\x56\\x50\\x2c\\x64\\x54\\x4f\\x87\\x77\\x80\\x21\\xfd\\xcb\\x6d\\x0e\\x4a\\x3f\\x4d\\x8a\\x4c\\xff\\x3c\\xa5\\xd7\\xd1\\x56\\xbc\\x7b\\x3d\\x26\\xfd\\xf5\\xc4\\x9b\\x84\\x36\\x59\\xa2\\xe1\\xa6\\xdb\\xf4\\x3b\\xd7\\x71\\x96\\xa7\\xc0\\xac\\x22\\xb5\\xe0\\x8c\\xf6\\x20\\x92\\x22\\x24\\x41\\x41\\x9a\\xbb\\x20\\xc1\\xda\\xb8\\x7c\\xec\\x21\\x14\\x96\\x1e\\xe9\\xb7\\xa3\\x7a\\x6a\\xce\\x4e\\xfc\\x1e\\xb6\\x87\\x76\\xa4\\x75\\x52\\x21\\xdc\\xb9\\xa1\\x3a\\xea\\xee\\x9b\\xe6\\xd2\\x50\\x90\\x77\\x65\\x55\\xd2\\xb3\\x92\\xdf\\x49\\xd6\\xb9\\xf3\\xad\\x60\\xf6\\xa7\\x45\\xf5\\x09\\x1b\\x4c\\x37\\x3c\\x64\\xd6\\x4b\\x6c\\x97\\x46\\x47\\x16\\xab\\x8c\\xa1\\x39\\x82\\xca\\x92\\x92\\x4a\\x07\\x89\\x9a\\x22\\x9a\\x22\\xa6\\x4d\\x2c\\xa1\\x50\\x46\\x15\\x55\\x43\\x82\\x36\\xc2\\xf1\\x05\\xb6\\x74\\x4e\\x39\\x4a\\x63\\x02\\x96\\x3e\\x4a\\xfc\\x2b\\x00\\x79\\x27\\x3f\\xe1\\x90\\x37\\x58\\x1e\\xbd\\xd6\\x4d\\x39\\x49\\x15\\xf5\\x14\\x47\\x2e\\xeb\\xf5\\x43\\xcd\\x5b\\xdd\\x12\\x09\\x23\\x52\\x98\\x2a\\x19\\xfe\\x98\\xf3\\xcc\\x6a\\x44\\x3a\\x33\\x0a\\x9b\\x73\\xcf\\xb6\\x00\\xae\\xfd\\xc4\\x6a\\x24\\x4a\\x57\\x3c\\x1d\\xb0\\x38\\x94\\xa7\\xaf\\xd9\\x75\\x06\\x97\\x84\\x5d\\xfd\\x22\\x34\\x7e\\x49\\x3b\\x62\\xfd\\x91\\xdf\\x93\\x33\\x4c\\x5c\\x0f\\x1a\\x9c\\xe3\\xb0\\x80\\x9c\\xfe\\x16\\xd6\\xc9\\x61\\xd1\\x3c\\xfa\\x20\\xe3\\xca\\x6b\\x51\\xcf\\x72\\x24\\xfc\\x07\\xa3\\x5a\\xbd\\x73\\x7b\\x6d\\x6b\\xc5\\x22\\xdd\\x23\\x50\\x46\\x8d\\xab\\x73\\x93\\xb2\\x0b\\xff\\x02\\x55\\xd1\\x40\\x25\\xfc\\xb5\\xdf\\xe3\\x40\\x89\\x6f\\x18\\x2b\\x41\\x8b\\x5b\\x53\\x9e\\x82\\x02\\x4b\\x6a\\x29\\x9b\\x5f\\xcb\\x30\\x01\\x25\\xfb\\xa4\\x79\\x03\\x4a\\xa6\\xf2\\xb0\\x9a\\x61\\xd1\\xcf\\x25\\x40\\xb6\\xaf\\x51\\x65\\xe8\\xc2\\x3d\\x38\\x5f\\xed\\xa8\\x8a\\xc6\\x94\\xc6\\x01\\x88\\xe7\\x36\\x26\\x71\\x1d\\x07\\x1a\\x8f\\x82\\x20\\x5d\\x27\\x40\\x28\\x92\\x73\\x7e\\x8b\\x4b\\x01\\xee\\x0f\\xcf\\x32\\x8d\\xa2\\x99\\x94\\x7f\\xd1\\x76\\x0a\\x6c\\xfa\\xf7\\xce\\x41\\xa0\\x7b\\xba\\x94\\x31\\x34\\xeb\\xba\\x75\\x79\\x1e\\xc7\\x19\\x9a\\x65\\x33\\x27\\x54\\xe3\\x77\\x11\\xad\\x0d\\x37\\x26\\x15\\xe8\\xf3\\x87\\x58\\x79\\xbf\\xaf\\xdb\\xf4\\x77\\x38\\x87\\xab\\xd6\\x6a\\xf5\\xfc\\x08\\xb6\\xa1\\x86\\x3e\\x2d\\x92\\xc4\\x60\\x17\\x35\\xba\\x3c\\xfc\\x44\\x60\\x8a\\xbc\\x31\\x96\\xf4\\xf0\\xa4\\x42\\x31\\x55\\xe6\\x74\\xca\\x70\\x58\\x44\\xac\\xe4\\x11\\xb4\\xf3\\x5c\\xc2\\xb1\\xf0\\x42\\xb8\\xbd\\xc8\\xe9\\x0b\\x28\\x2d\\xd6\\x14\\x6c\\xe1\\xf0\\x45\\x5f\\x2b\\xd2\\x56\\x89\\x7a\\x29\\x8c\\x4d\\x2a\\x65\\x51\\x58\\xac\\xab\\xbc\\x0b\\x47\\xdd\\x72\\xe6\\x51\\x51\\xa9\\x7b\\xba\\x85\\xc1\\x16\\x59\\xe2\\xc4\\x41\\x97\\xf6\\xdf\\xfe\\xf5\\xc4\\x2e\\xb8\\x1c\\x23\\x4e\\x1d\\xa8\\x26\\xb9\\x72\\x32\\x37\\x82\\x08\\xc7\\xe9\\x97\\x52\\x2e\\x82\\xaf\\x26\\x7f\\xa6\\x61\\x34\\xe2\\x99\\x9a\\x43\\xeb\\x08\\xd9\\xdc\\x9b\\xaf\\x13\\xf2\\xd1\\x7b\\x38\\xb8\\xd2\\x25\\xfb\\x93\\x53\\x8e\\xe4\\x18\\x66\\x1e\\xfa\\x10\\xd7\\x51\\xf3\\xce\\x25\\x44\\x02\\xd3\\xb1\\x42\\x50\\x3e\\x07\\xd6\\xed\\xb6\\x2d\\xb2\\x40\\x98\\x46\\x1b\\x2d\\x7d\\x95\\x81\\x60\\x71\\xb6\\x1a\\xd6\\xf2\\x3d\\x10\\xce\\x87\\xb1\\x04\\xd1\\x3f\\x3e\\x43\\xb9\\xf5\\x71\\xb3\\x7d\\xbd\\x0d\\x09\\xbe\\x60\\xbb\\xe7\\x65\\xbe\\xb1\\x8d\\x3f\\x3c\\x74\\x5f\\xe9\\xf6\\xae\\xdf\\x89\\xf8\\x5e\\xb9\\xf9\\x13\\x64\\x8d\\xd5\\xe5\\xe5\\x50\\xce\\xe7\\xe6\\xe0\\x89\\xc2\\xa3\\xd8\\xd2\\x26\\x79\\x81\\x8b\\xc7\\x2f\\x2c\\xd9\\xcf\\x04\\xab\\xc6\\xe4\\x5e\\xd3\\xd8\\xc0\\x77\\xaa\\x7a\\x63\\xb9\\x2c\\xff\\x7e\\x8a\\xc0\\xbf\\x42\\x77\\x23\\xca\\x7e\\x66\\xbe\\x11\\x22\\xd8\\x04\\x6c\\x85\\x5e\\x42\\x76\\x20\\x79\\x2c\\xbc\\x96\\x1c\\x25\\x9e\\xa5\\x9e\\xa2\\xdf\\xfc\\xcf\\x2c\\xf3\\x77\\x6f\\x5e\\xf1\\xfe\\x69\\x12\\xfc\\x4b\\xb9\\xcd\\xd7\\xe9\\xf8\\xc0\\xa5\\x9a\\x5f\\x4e\\x25\\xa8\\xf8\\xf9\\xe9\\x5c\\x16\\x5d\\x36\\x73\\x4e\\x2e\\x9d\\x4f\\x08\\x8d\\x0b\\x07\\xb6\\xde\\x76\\x38\\x21\\x79\\x54\\xb4\\xcf\\xa1\\x92\\xe7\\x59\\x22\\x74\\xe6\\x1a\\x46\\x4b\\xec\\xd2\\x62\\xed\\x1f\\x4e\\xd4\\x52\\x4d\\x79\\x65\\x40\\x31\\x96\\xc5\\x6d\\x1c\\x31\\x1c\\xa9\\x52\\x4f\\x3a\\x6a\\x2a\\x7d\\x67\\x7d\\x06\\x5d\\x2d\\x39\\x3c\\xa6\\xd0\\x61\\x6d\\x71\\x32\\x61\\x4a\\x9f\\x00\\x2e\\x50\\xd7\\xe2\\x1e\\xc4\\xf0\\xfb\\xcb\\xea\\x4a\\x36\\x48\\x3b\\x77\\xff\\xdd\\x57\\xc1\\xd2\\x85\\x1f\\x70\\x0a\\xa6\\xa1\\x32\\x9b\\x4f\\xbc\\x3a\\xeb\\x70\\x42\\x9c\\xba\\xf2\\x88\\xc4\\x07\\x49\\x4f\\x4f\\x1f\\xa0\\xa4\\x38\\x4d\\xb8\\x6c\\xff\\x02\\x55\\x04\\x57\\xb4\\xc9\\x89\\x01\\x0b\\x4e\\x2b\\x3c\\x53\\x78\\x1a\\x7d\\x17\\xae\\xd4\\x81\\xd2\\x8e\\x15\\x89\\xa3\\xbe\\x46\\x46\\x86\\x80\\xac\\x3d\\x66\\xba\\x0d\\x69\\x59\\x02\\xd3\\x2f\\x4d\\x49\\x61\\x59\\x04\\x25\\xac\\xc6\\x26\\xd8\\xb4\\x8c\\x3a\\xc6\\x46\\x14\\x38\\x6f\\x35\\x6e\\x89\\xb8\\xe2\\xaf\\xc5\\xde\\x70\\xcc\\x60\\x29\\x27\\x36\\xfc\\x33\\xdc\\xde\\x0f\\x22\\x69\\x50\\x1f\\xef\\xdd\\x5d\\x3b\\x2e\\x74\\xb7\\x2b\\xdc\\x9a\\x0c\\x6f\\xde\\x0c\\x5d\\x3e\\xd4\\x46\\xc8\\xfd\\x71\\x7c\\x5c\\x3f\\x72\\xac\\x0a\\xd7\\xdd\\xf2\\x53\\x4f\\x6e\\xd8\\xae\\x06\\xaf\\x9e\\x81\\x91\\xc4\\xa9\\x73\\x32\\x24\\xd2\\x28\\x8f\\x3b\\x41\\x39\\xaf\\x23\\x3a\\x7b\\x76\\xa2\\x30\\xb9\\x62\\x4c\\x3a\\xcd\\x2f\\x42\\xa9\\xaf\\x16\\xc8\\x7f\\x60\\xcc\\x06\\xbf\\x55\\xc9\\xa8\\x81\\x9a\\x22\\xe2\\xfe\\x0c\\xe7\\xb9\\xba\\x16\\x03\\x96\\x0d\\xb1\\xf2\\x6a\\xf1\\x6a\\xb3\\x5a\\x6d\\x2a\\xb5\\xa3\\xf3\\xed\\x39\\x91\\x42\\xd9\\x99\\xdf\\xfb\\xb7\\x79\\x2e\\xea\\x59\\x58\\x8a\\x63\\xc6\\x6b\\x4c\\x2a\\xec\\x39\\xef\\x13\\x7d\\xee\\x47\\xc6\\x82\\xe3\\xaf\\x4c\\x72\\xb4\\xde\\xfc\\x04\\xa9\\xd5\\xca\\x47\\x51\\x92\\x20\\x2a\\x7d\\x66\\x1d\\x76\\xf8\\x7e\\x3e\\x32\\x11\\x1b\\x95\\xe4\\x02\\x69\\x3d\\x76\\x4e\\x90\\x2a\\x1d\\xad\\xfb\\x31\\x71\\x2d\\x22\\x9b\\x88\\x55\\x9e\\xb2\\xb0\\xba\\xdf\\x8f\\x0a\\xde\\x6e\\xd8\\x41\\x32\\xdd\\x83\\x85\\xd6\\xfc\\x32\\xa4\\xc8\\x2c\\x7d\\xdd\\x48\\x6e\\x15\\x45\\x50\\x25\\x1d\\x5e\\x2f\\x24\\xef\\x92\\x14\\xef\\x90\\x2e\\x68\\xd7\\xbd\\x66\\x69\\x34\\x51\\x6f\\x19\\x4c\\x8d\\x74\\x31\\x0b\\x6b\\xd4\\x17\\xf2\\x1f\\xbb\\x52\\xa4\\xb6\\x41\\x51\\xad\\xb5\\x0f\\xb9\\x34\\xa2\\x90\\xf7\\x11\\x64\\x63\\x24\\x43\\xa7\\xc1\\x6e\\x78\\xce\\x5c\\xcb\\x00\\x4f\\x6c\\xec\\xe9\\x4f\\x29\\xfd\\x9d\\xcf\\x18\\xb3\\xdd\\x0d\\x2d\\x1b\\x6d\\x5d\\xc1\\x22\\x57\\x6d\\x47\\x1b\\x6b\\x5d\\x25\\xd9\\xde\\xf7\\x0f\\x25\\x8a\\x4a\\xa6\\x76\\xb5\\x15\\x6b\\x85\\x72\\x29\\x9b\\x14\\xe7\\x74\\x25\\x0a\\x09\\xde\\xb6\\x96\\x5a\\x22\\xad\\xcf\\xbd\\x3f\\x47\\x7f\\xe8\\x1a\\x25\\x8c\\x5d\\xe2\\x63\\x19\\x12\\xab\\x35\\x43\\x0f\\xa2\\x05\\x37\\x35\\xb8\\x5a\\xe8\\x22\\x46\\x42\\x5a\\xa4\\x5d\\x22\\xc9\\xf8\\x30\\x18\\x73\\x39\\x12\\x80\\x0a\\x19\\xe3\\x9c\\xd8\\x15\\x80\\x12\\x29\\xe3\\x32\\xbe\\x5a\\x57\\xaa\\x07\\xef\\x47\\xf4\\xbf\\xda\\xf9\\xdf\\xb6\\x56\\x16\\xba\\x10\\xf4\\xf0\\x19\\x95\\x3e\\xd3\\xd9\\xd2\\x63\\x87\\x38\\xa9\\x20\\x3e\\xea\\xa2\\x3a\\x32\\xa8\\x06\\xbf\\xd9\\x77\\xa9\\x72\\x28\\x2a\\xfd\\x49\\xbf\\x14\\xce\\x41\\x0f\\x52\\x0c\\x33\\x1e\\xdd\\xe7\\x02\\xba\\x62\\x34\\xf7\\x78\\xa6\\x0d\\x0c\\x87\\xc7\\x13\\xbe\\x80\\xd1\\x7a\\x84\\x8f\\xb4\\x11\\x1c\\xf8\\x42\\x8e\\x79\\x11\\x1c\\xe8\\xe9\\x1c\\x04\\xad\\x84\\xb3\\x2d\\xae\\xeb\\xf4\\xd6\\x57\\x2e\\x27\\x57\\xdc\\xb8\\xf2\\xed\\x2c\\xa1\\xcf\\xb0\\xc1\\xb8\\x66\\x68\\x8d\\x09\\x4a\\x8d\\x3e\\xec\\x44\\xf9\\xbc\\x04\\x08\\x1d\\xf2\\xa1\\x8e\\x4d\\xe7\\xe5\\x2d\\xce\\xff\\x05\\x9f\\xe0\\x72\\xab\\xb1\\x88\\x41\\x4b\\x10\\x45\\x9b\\xa5\\x61\\x1d\\xb0\\x62\\x60\\xc2\\x05\\x0a\\xf7\\x06\\x22\\x95\\xd1\\x98\\x8f\\x0e\\xe1\\xa9\\xa5\\x69\\xb4\\xd4\\x1a\\xf6\\xe7\\xc4\\xb7\\x51\\xf3\\x2d\\x3d\\xa5\\xf5\\x13\\x09\\x46\\x69\\xbd\\x2b\\x19\\x8d\\x55\\xc2\\x81\\x83\\x6c\\x88\\xb6\\xba\\xa1\\xd3\\x6a\\x2e\\xbb\\xcd\\xcf\\x27\\x47\\xff\\x1a\\xd8\\x50\\xb8\\x45\\x5a\\x76\\xfd\\x9e\\x49\\x72\\x2e\\xe3\\x18\\x50\\x6a\\x8e\\x55\\x28\\xa8\\x7f\\x9f\\x28\\x41\\x17\\x4b\\xaa\\x5e\\xb7\\xad\\x31\\x3f\\x64\\xef\\xb4\\xe0\\x45\\xe2\\x2c\\x4a\\xb6\\xfe\\x2d\\x65\\xad\\xc6\\x6a\\xf1\\x36\\xb1\\x74\\x2e\\xbb\\x52\\x69\\xfc\\x32\\x9b\\xed\\x2f\\x2a\\xa7\\x5c\\x37\\xe2\\x76\\xe8\\x2d\\x6d\\xef\\x4f\\xd0\\xfc\\x3e\\x96\\xfc\\xda\\x56\\x97\\xb5\\xc5\\x1e\\x96\\x0e\\x9e\\xb1\\xf9\\x70\\x33\\x52\\x0c\\x6d\\x61\\xdc\\xb4\\x6a\\x65\\x03\\x8b\\x82\\x61\\xc8\\x46\\xda\\x18\\x4d\\x3a\\x13\\xed\\x47\\xb8\\xe8\\x8f\\xb4\\xfb\\x30\\x9a\\x06\\x23\\xbe\\x42\\x04\\xfb\\x1d\\xc5\\x29\\xcd\\xce\\xc9\\x69\\xe3\\x60\\x59\\x9d\\x36\\xdf\\xe7\\x7a\\x70\\x4e\\x05\\xa7\\xab\\x2a\\x65\\x9f\\xf5\\x7c\\xe6\\xf1\\xe1\\x0b\\x2e\\x8b\\xad\\x6c\\x65\\x54\\x8d\\x58\\x55\\xa0\\x9b\\xe3\\x1c\\x6a\\x87\\x3a\\x85\\xed\\xc3\\x41\\x88\\x30\\x44\\xc9\\x5c\\x34\\xf4\\x90\\x00\\xfe\\xb1\\x23\\x0c\\xe9\\x93\\xce\\xf0\\x4b\\x41\\x37\\x47\\x91\\xf6\\xe5\\x7e\\x98\\xce\\x25\\xd0\\xb1\\x5d\\xaa\\x88\\x72\\x10\\x21\\xd6\\xf1\\x30\\x52\\x6e\\xb0\\xde\\xfd\\xce\\x54\\xf5\\x3d\\x3e\\xdd\\x55\\x93\\xaa\\xbc\\xf9\\x57\\xf0\\xfb\\x6e\\x37\\xc9\\xcc\\x04\\x95\\xcd\\xfd\\x11\\xa8\\x5a\\xc3\\x79\\xb7\\xc2\\xbc\\x6b\\xde\\x5d\\xfb\\x49\\x7e\\x4b\\x04\\xa6\\x83\\xe3\\x6c\\xf8\\x6c\\x22\\x22\\xca\\x00\\x83\\x8f\\x52\\x17\\xf6\\xc6\\x52\\xeb\\xcf\\x28\\x6d\\x24\\x35\\x40\\xc8\\xa9\\x60\\xb7\\xe8\\x91\\x18\\x0f\\xae\\xb2\\xd3\\xf6\\xfd\\x99\\x9a\\xec\\xf3\\x1d\\x79\\x52\\xfb\\x33\\xeb\\x29\\x32\\xda\\xf3\\x3c\\xb3\\xaa\\x23\\xb3\\x7d\\x3f\\xc4\\xa7\\xfd\\x02\\xb4\\xd1\\x55\\xa8\\xc5\\xfd\\x5c\\xbb\\x3c\\xdb\\xeb\\xe2\\xf8\\x2c\\x8b\\x22\\x8b\\x01\\xb5\\x0d\\x60\\xee\\x1a\\xe9\\x22\\x99\\x50\\xc0\\x8e\\x60\\x42\\x1d\\x92\\x4a\\x81\\x52\\x1f\\x02\\x2f\\x47\\x16\\x86\\xfd\\x06\\xa1\\x38\\xfa\\x7a\\x65\\x77\\x80\\x53\\xcd\\xfd\\xdd\\x16\\xa4\\xef\\x7d\\xe9\\xf6\\x2d\\xd4\\xf5\\xf9\\x60\\xa7\\x52\\xd6\\xe5\\x9c\\xb0\\xae\\xf1\\xb1\\x03\\x25\\xad\\xa8\\x25\\x10\\x36\\x79\\x8b\\x61\\xbc\\xc0\\x3b\\x49\\x2a\\x13\\xa2\\xe4\\x1f\\xe8\\x27\\x72\\x54\\xb8\\x1b\\x3e\\x80\\x92\\xe1\\xbe\\x0e\\x41\\x7b\\x70\\xc3\\x92\\x7f\\x43\\x0e\\x02\\x4b\\x2b\\x00\\x66\\x77\\xce\\x28\\x64\\xee\\xc2\\x05\\xd5\\x4a\\xa2\\x9c\\x44\\x7b\\xe3\\x69\\x47\\xe5\\x2d\\x89\\x3b\\x94\\x04\\x23\\x8d\\x7d\\xb4\\xf0\\x2f\\x72\\x27\\x80\\x09\\x9b\\x39\\x32\\x04\\xb9\\xc2\\xc4\\xf6\\xc4\\x82\\x53\\xca\\xf5\\x48\\xbf\\xf1\\x86\\x85\\x53\\xc9\\x75\\xab\\xf2\\xa0\\xdf\\x20\\xbb\\xe3\\xd3\\xe6\\x11\\xdf\\x15\\xf6\\x16\\x51\\x2f\\x07\\x8f\\x68\\x24\\xa3\\xe6\\x04\\x23\\x1d\\xfe\\x6a\\x45\\xb2\\x48\\x5f\\x42\\x31\\xae\\x87\\xea\\x49\\x47\\xa6\\xde\\xcf\\xbc\\x3e\\xca\\x1c\\x4e\\xb3\\xdb\\x1f\\xb3\\xaa\\x8e\\x13\\x93\\xdf\\x48\\x87\\xc7\\x7e\\xa6\\xf2\\x9c\\xda\\x92\\x83\\x75\\xdb\\x4c\\x9c\\xa9\\xec\\x7d\\x12\\x15\\xad\\xe7\\x28\\x57\\xc4\\x4e\\x3a\\x71\\xea\\xcb\\x8e\\x54\\xcb\\x4a\\xef\\x59\\x3b\\xa3\\x0e\\x85\\xfa\\xae\\x29\\x6d\\x9c\\x7a\\x7e\\x12\\xcd\\x3b\\x47\\xef\\x72\\xc1\\x0f\\x27\\xbb\\x23\\x38\\x10\\x12\\xd7\\xd1\\xd2\\xf5\\x3b\\xf7\\x08\\x29\\x68\\xe4\\x7b\\x87\\x9a\\x72\\x1c\\x4e\\x7f\\x3d\\x33\\x5c\\x22\\xb1\\x63\\xe2\\x0b\\xe4\\x6d\\xd6\\x2b\\x31\\xd5\\x46\\xc1\\x87\\x11\\x5b\\x02\\x45\\xd7\\x70\\xab\\xb0\\xf7\\xe4\\x6d\\x12\\xa2\\xae\\xaa\\x0f\\x18\\xdd\\x46\\x6e\\x54\\x37\\xa4\\xc5\\xb7\\x95\\x5c\\x6a\\x98\\x4d\\x8e\\x4e\\xb3\\x9e\\x8f\\x9a\\x4e\\x87\\xca\\x9c\\xce\\x8f\\xea\\x3b\\xcd\\x36\\xc5\\xd7\\xbb\\x41\\xaa\\xf5\\x73\\x57\\x40\\x37\\xe2\\xe7\\x3a\\xb7\\x1c\\x29\\x8d\\xa1\\x1c\\xc2\\x59\\xf1\\x71\\x49\\x58\\x2b\\xff\\x61\\xee\\x35\\xc8\\x41\\xd3\\xa4\\x60\\x46\\x2b\\x62\\x5a\\x22\\xae\\xa8\\x1a\\x75\\xa9\\xe0\\x67\\xe4\\xd7\\x82\\xb8\\x4d\\x1e\\x4c\\x68\\x10\\xda\\xa0\\xd5\\x2b\\xa5\\xe1\\x0c\\x20\\x5a\\xbe\\x80\\xe2\\x85\\x98\\x85\\x82\\xa9\\x24\\x58\\x8d\\xd4\\x26\\xaa\\xfb\\x8b\\x7a\\x6b\\xed\\xa7\\x6a\\x31\\x91\\x9e\\xde\\xc2\\xed\\x36\\x80\\xde\\xe8\\xd3\\xf2\\xdc\\x92\\x47\\x16\\x44\\xdb\\xda\\x1f\\x7d\\x11\\xc2\\xbd\\xd0\\x7b\\x37\\x07\\x82\\x61\\xaa\\x0a\\xeb\\xec\\xc9\\x85\\x41\\xdb\\x71\\xd2\\x9f\\x6c\\xd9\\xe3\\xea\\xfc\\xbb\\xc9\\x32\\x38\\x77\\x26\\xb1\\xd9\\x60\\x65\\xd0\\xf4\\xa7\\x29\\xef\\x45\\x8a\\x99\\x58\\x48\\xd7\\xfd\\x94\\xfc\\x78\\x3a\\xa5\\x04\\x2c\\xfc\\x78\\x79\\xfc\\xf6\\xfb\\x8e\\x7e\\x57\\xb7\\x23\\xfe\\xf3\\x31\\xf6\\x39\\x3a\\x3c\\x0d\\xbc\\x5b\\xf5\\xe2\\xba\\xe7\\x02\\x62\\x99\\x85\\x5b\\xfb\\x3d\\x50\\xf2\\x39\\x5c\\x48\\x09\\x86\\xa5\\x0d\\xe1\\xdf\\x09\\x6d\\x81\\xb8\\x84\\x80\\x71\\x79\\x03\\xe4\\xa7\\xb8\\x90\\xa1\\x1a\\xa5\\x00\\x53\\x5e\\x7b\\x92\\x1a\\x34\\x78\\x0a\\x49\\x20\\x29\\x23\\x71\\x00\\x3d\\x05\\xbe\\x78\\x58\\x7f\\x70\\x70\\x50\\x03\\x61\\xc0\\xc2\\xe7\\xdc\\x85\\xa7\\xef\\x63\\x4b\\xd9\\xa9\\xf9\\x1d\\x54\\xee\\x13\\xe2\\xc6\\x0d\\x08\\xf0\\x0e\\x71\\x8b\\xbc\\xf4\\x92\\x45\\x85\\x55\\xbf\\xd3\\xe2\\x04\\x59\\x10\\x0c\\x0a\\x62\\x5c\\x3f\\x68\\x14\\xc3\\xbf\\x3e\\xa3\\x84\\x47\\x10\\x64\\x30\\x06\\x9b\\x89\\xa4\\x6f\\x26\\x9a\\x73\\x1f\\x98\\x31\\x43\\x68\\xf0\\xa4\\x77\\x7d\\x5c\\x10\\xd8\\x32\\x30\\x03\\x07\\x15\\xbb\\x78\\x32\\x15\\xdd\\x7c\\x25\\x26\\xd9\\xc4\\x7f\\xa3\\xf0\\x4a\\x87\\x9d\\x62\\x17\\x97\\x7a\\x0d\\x64\\xba\\x3d\\x81\\x94\\x4b\\xd1\\xcc\\x5b\\x5b\\xab\\x1f\\x91\\x38\\xaa\\x3b\\x3d\\x8d\\xd5\\x6d\\x27\\x0f\\x93\\xad\\x60\\x73\\x8a\\x12\\xd9\\x32\\xb5\\xe9\\x5f\\x7d\\xed\\x46\\xcb\\x1b\\x69\\xae\\xe2\\xba\\x89\\xb4\\xf3\\x68\\x32\\xce\\xac\\x6a\\x4e\\x16\\xc1\\x63\\x0e\\xd7\\x70\\xd6\\x9b\\x3d\\x9c\\xdc\\x0e\\x8b\\xfd\\xdd\\x9f\\xb5\\x17\\xc2\\x12\\xc9\\x5f\\xdb\\x7f\\xbc\\x57\\x75\\x7c\\xcc\\x07\\xf8\\xba\\x0c\\x04\\x1d\\xcd\\xf8\\x37\\x8c\\x61\\xc8\\x51\\x88\\xda\\x09\\xb9\\x70\\xfe\\xb1\\xc6\\x0c\\x7e\\x78\\x94\\xf1\\x28\\xb5\\xc3\\xd0\\x4b\\x52\\xe6\\x52\\xb0\\x1d\\x18\\x07\\xa7\\x85\\x47\\x0c\\x2e\\x2d\\x97\\xc5\\x3c\\xc2\\x8f\\x0f\\xb9\\x81\\x84\\x40\\x86\\x69\\xc6\\x1d\\x39\\x95\\xbe\\x27\\x38\\x04\\x50\\x9f\\xb7\\xb1\\xb8\\x98\\xe9\\xb4\\xbd\\x90\\xbd\\x37\\x39\\x04\\xdc\\x0e\\x53\\xc8\\x40\\x58\\x5a\\x85\\x0c\\x67\\x24\\xe9\\xc5\\xc9\\x43\\x21\\xf2\\x83\\x00\\xc0\\x76\\x60\\xd8\\xfd\\x6d\\x61\\xfb\\x33\\xe7\\xcd\\xcb\\x46\\xa6\\x5c\\x9e\\x16\\xbe\\x9e\\x60\\xc2\\x59\\x98\\xa4\\x91\\x35\\xa8\\x00\\xac\\x75\\x9d\\x38\\xf8\\x49\\x93\\x24\\x0a\\xe5\\x54\\x59\\x16\\x2d\\xa3\\xe0\\x9a\\x5d\\xf9\\x39\\xcb\\xee\\xf5\\x1b\\x1b\\x7b\\xea\\x9e\\xd7\\x06\\xb9\\x1c\\x2b\\xf8\\xe2\\xb7\\x54\\x3a\\xbb\\x93\\xb7\\x6d\\x67\\x2b\\xd7\\xd5\\x3b\\x5e\\xad\\xf4\\x4c\\x5b\\xe8\\x56\\xdd\\x57\\x10\\x9d\\x2e\\xbc\\xde\\x87\\x92\\xc8\\x68\\x96\\xf3\\xe9\\xc0\\xac\\xd5\\x8d\\x75\\x2c\\xab\\x4d\\x0c\\x86\\xa2\\x77\\xbb\\x8a\\x33\\x5b\\x72\\x0b\\x9a\\x51\\xeb\\x19\\x9f\\x37\\x6a\\xcc\\x19\\xba\\xbe\\xdb\\x62\\x26\\xc2\\xba\\x22\\x95\\xe6\\x78\\x9b\\xcb\\xed\\x17\\x2d\\xd6\\xc3\\xa4\\x24\\x2e\\xea\\x60\\x4c\\x77\\xb1\\x84\\x9a\\xd0\\x12\\xd2\\xd6\\x79\\x13\\x0e\\x34\\xda\\x2c\\xe0\\xda\\x49\\x0a\\x32\\x95\\x87\\x59\\x14\\x93\\x8a\\x05\\x50\\x32\\xc0\\x44\\xe9\\x64\\xe3\\xe5\\x32\\x8e\\x0f\\xb0\\xf4\\xc0\\xd2\\x09\\x26\\x13\\xc4\\x68\\xe8\\xa0\\xf1\\xa0\\x55\\xb9\\x12\\x41\\xf4\\xca\\x6b\\x1f\\xe6\\xfe\\x52\\xc4\\x68\\x72\\x01\\xe0\\x4c\\x94\\x94\\x40\\xd7\\x0b\\x34\\xa5\\x23\\x0d\\x71\\xa2\\xea\\xac\\x96\\xd0\\x7e\\xdc\\x22\\x5e\\x57\\x54\\x9c\\x1f\\x81\\xa2\\xf8\\xee\\xbf\\xcc\\x42\\x85\\x0b\\x6c\\xe9\\x4f\\x46\\xcf\\xa5\\xcb\\xa9\\xf2\\xe7\\x94\\x4e\\x98\\x8f\\x36\\x08\\x77\\x31\\x81\\xee\\xa4\\x65\\x48\\x15\\xb8\\xc3\\x5d\\x89\\x81\\x62\\x1a\\x8c\\xb7\\xb8\\x7d\\x5c\\xb1\\x44\\x16\\x60\\x3b\\xee\\x46\\x84\\xd9\\xd2\\xe2\\x32\\x8e\\x19\\x08\\xc0\\x91\\x09\\x0c\\x2e\\x72\\x20\\x5f\\x75\\xeb\\x8c\\x65\\x0c\\x63\\xf5\\x24\\xc4\\x8d\\xa4\\x62\\x71\\x2c\\x93\\x1c\\xa6\\x76\\x4e\\x2e\\xac\\x7c\\xb0\\x7a\\x25\\xc5\\xcc\\x52\\xfd\\x1d\\x3d\\xa7\\x49\\x5a\\x74\\x48\\x8c\\x25\\x92\\xe8\\xc3\\xa1\\xd0\\x3a\\xaa\\x36\\xfa\\x86\\xa3\\x1f\\x43\\xe1\\x24\\xdf\\x6a\\xcb\\xfd\\xe0\\x9f\\x02\\x96\\x37\\x6b\\x3b\\x0a\\x1b\\xaf\\xd9\\xd1\\xda\\xaa\\xd6\\xba\\xdf\\x17\\xf6\\xf5\\x22\\xb5\\xa9\\x6c\\xcf\\x6e\\x9c\\xab\\xae\\x4d\\xd5\\xb7\\x2f\\xcd\\xce\\x2e\\x0b\\xaf\\xbd\\x6f\\x18\\xc5\\x0d\\xd7\\x0f\\x04\\x57\\x6b\\x0e\\x0f\\x7a\\xb1\\xdd\\xce\\xb4\\x25\\xcf\\x2e\\x6a\\x8b\\x81\\x7a\\x95\\x05\\x4a\\x38\\x67\\x3a\\x1c\\x41\\xaa\\xc9\\x55\\x9a\\x54\\xe8\\x92\\x46\\x8c\\x24\\x23\\xc8\\xe5\\x7e\\xca\\xcd\\x28\\x85\\x68\\x20\\xd9\\xcc\\xa6\\x6d\\x69\\x31\\x6b\\xd4\\x71\\x22\\x3d\\x20\\x39\\x8e\\x8c\\x75\\x4a\\x55\\x6b\\xfe\\xd7\\xe8\\xa7\\xc6\\xee\\xcd\\xb0\\xf4\\xad\\x69\\x43\\x8c\\x41\\x18\\x0c\\x49\\x81\\xa0\\x18\\xff\\x3c\\xdc\\xe3\\x51\\x1a\\xb3\\xaa\\xd4\\x1e\\xef\\x10\\xa7\\x02\\x15\\x4d\\x89\\x03\\xa0\\x12\\x03\\x58\\x73\\x30\\x32\\x25\\x8a\\x36\\x3f\\x6b\\xbe\\xef\\x67\\x94\\x11\\xe0\\xb7\\x2a\\x95\\x24\\x8a\\x15\\x0c\\x6d\\x29\\x58\\x16\\x52\\x15\\x31\\x99\\x83\\x55\\x4e\\x17\\x6a\\x6f\\xcd\\x2e\\xb7\\xbc\\x3f\\x1f\\x24\\x6f\\x77\\x17\\x3f\\xb8\\xa4\\x70\\x7c\\x3d\\x13\\xb7\\x13\\x2d\\x5c\\x31\\x5c\\xde\\xce\\xf7\\x13\\xc5\\xee\\x8f\\x4e\\xe2\\x83\\xc9\\xb1\\xfe\\x06\\x45\\xa3\\xbb\\xda\\xad\\xd7\\x4f\\x8f\\xf8\\x69\\x6f\\x3a\\x0f\\x83\\xe0\\xb0\\x66\\x71\\x2f\\xf5\\xde\\x84\\xfe\\x52\\xaf\\xf9\\xbc\\x4f\\x74\\xb5\\x7a\\x3b\\x97\\x5b\\x2b\\xcf\\xb7\\xe7\\x81\\x3d\\x7e\\x62\\x8e\\xed\\x33\\x12\\x87\\xca\\x57\\xd0\\x54\\x6f\\xb2\\xe7\\x0c\\xbc\\x68\\x8a\\x03\\xeb\\x43\\xe9\\x11\\xa1\\xbd\\x21\\xe3\\xeb\\xe7\\x1b\\x44\\x04\\x84\\x2a\\x10\\x92\\xe9\\x89\\x86\\x18\\xc2\\x3a\\xdf\\xf9\\x56\\x7d\\x1a\\x4d\\xc3\\x78\\x0a\\xad\\xab\\xd6\\x54\\xf9\\x70\\x3f\\x1b\\x3d\\x3b\\x17\\x15\\x6e\\x8b\\xc1\\xf2\\x1a\\x80\\xcd\\x7d\\xcb\\xd7\\xc3\\x20\\xaa\\x84\\x6b\\x48\\x69\\xf3\\x27\\x83\\xa4\\x3d\\x40\\xe5\\x75\\xa1\\xc7\\x32\\x86\\x8d\\x62\\x12\\x1d\\xd9\\x00\\x1c\\xd8\\xce\\xda\\x58\\xab\\x3e\\xa0\\xe5\\xbc\\x85\\x13\\x6c\\x15\\x0f\\x34\\xbd\\xc0\\xc7\\x6e\\x42\\x5c\\x3d\\xef\\x35\\x45\\xf6\\x06\\x91\\xdb\\xe6\\x4b\\x10\\xff\\x59\\xd3\\x73\\xe1\\x8b\\xa1\\x36\\xa5\\xe1\\x88\\xf0\\x98\\x82\\xe8\\xc0\\x92\\xa9\\x7d\\x1f\\x26\\x0d\\x9c\\xd1\\x39\\xcd\\x0e\\xd4\\x4f\\xe1\\xe2\\x6a\\xaa\\x7e\\xb7\\x17\\xc5\\xea\\x3d\\x41\\xfb\\x80\\x8b\\x5a\\x07\\x5c\\xab\\xed\\xdf\\x6a\\xc5\\x23\\xb8\\x92\\xe3\\x59\\x6f\\xf6\\xb0\\x36\\x3c\\x55\\x6a\\x46\\xd4\\x58\\xd9\\xb2\\x33\\xaf\\xdc\\xdc\\xb6\\x1f\\x6c\\x56\\xae\\x7a\\x7d\\x3e\\xdc\\xf0\\x75\\x34\\x7a\\xef\\x87\\x80\\x51\\x86\\x76\\xba\\xdb\\x53\\xcd\\x6d\\x98\\x49\\x73\\x65\\x6c\\x7c\\xb7\\xf3\\x4a\\x0a\\x36\\x8e\\x26\\xc2\\xa4\\xcf\\xd9\\xb9\\x2c\\x5e\\x20\\xa5\\x56\\x7b\\xce\\x9b\\x55\\xfd\\x6e\\x38\\x07\\x7f\\x65\\x08\\xc2\\x18\\x4c\\x86\\x62\\xac\\x65\\x09\\x56\\xb6\\x1e\\xa5\\xfa\\x5c\\x2f\\xac\\xac\\xd0\\x8e\\xae\\x80\\x77\\x2a\\xd2\\x89\\x2a\\x9a\\x32\\x2c\\xed\\xe6\\xe8\\x3f\\x9f\\x2f\\x00\\x7b\\x2c\\x69\\x4a\\x89\\x3e\\xfb\\x57\\xd3\\xc2\\xdf\\x8d\\x95\\xc8\\x41\\x4f\\x32\\x94\\x1c\\x57\\x33\\x33\\x45\\x75\\xf3\\xdd\\xc6\\xad\\x1a\\xb5\\x09\\x33\\xca\\x43\\x91\\x36\\xab\\x85\\x08\\x36\\x1a\\x61\\x52\\x60\\xfe\\x41\\x3d\\xea\\xc2\\x92\\x52\\x21\\x1e\\x64\\xdc\\x23\\xae\\x6d\\xf5\\x6b\\x32\\x59\\xb3\\xaf\\xfe\\x43\\x42\\xc6\\xbb\\xe6\\x3f\\x68\\xe8\\x1d\\x0f\\x53\\xbf\\xa7\\xd8\\x56\\x94\\xf3\\x88\\xde\\x8e\\xfe\\x52\\x15\\x06\\xb3\\x47\\x9c\\x26\\xd5\\x17\\xe3\\xac\\x4c\\x37\\x05\\x07\\x54\\x22\\xbe\\xda\\xfe\\xc9\\x1a\\xb7\\xd0\\x3d\\xdc\\x33\\xf8\\x68\\xdc\\xce\\x56\\x9a\\x95\\x72\\xbc\\x6b\\xb0\\x6e\\xbd\\xbe\\x3f\\x5a\\x80\\x6b\\x26\\xcb\\x9e\\x66\\xac\\x26\\xb7\\x9a\\xeb\\xf5\\x5b\\xc9\\x57\\xf5\\x73\\x5c\\x2e\\x2d\\x09\\x7e\\xd9\\x80\\xab\\xe6\\xb2\\xd8\\x44\\xd3\\x1a\\x78\\xf5\\x82\\x2e\\x70\\x0d\\x51\\x47\\x51\\xdb\\xcf\\xd1\\xe1\\xd3\\x27\\x06\\x91\\x6e\\x09\\xf8\\x23\\x5c\\x76\\x80\\x9b\\x34\\x04\\x96\\x80\\xa6\\x09\\xf7\\xe7\\xaf\\x5e\\x81\\xdd\\x88\\x14\\x1c\\x81\\xfd\\xcd\\x07\\x1a\\x01\\x0f\\xb9\\x82\\xc1\\xe9\\x9f\\x52\\x1f\\xcd\\xa6\\x3d\\x17\\x74\\x6c\\x3c\\xbf\\xac\\xae\\x1d\\x81\\xc0\\xe6\\x9f\\x0d\\x70\\xb1\\x09\\xed\\xb0\\x0d\\xc8\\x04\\xa6\\xe0\\xc6\\x1c\\xec\\x84\\x82\\x5b\\x57\\x93\\x41\\x13\\x43\\x8a\\x4b\\x7b\\x63\\x62\\x13\\x47\\x12\\x10\\xc7\\x67\\xa0\\x1b\\x6e\\x70\\xc7\\x66\\x85\\xe8\\x25\\x01\\x68\\x32\\x65\\xfb\\xd5\\x93\\x54\\x31\\x87\\x96\\xc5\\x2c\\x26\\x45\\x28\\xc8\\x47\\x98\\x33\\x76\\x14\\x74\\x0f\\x46\\x35\\x6f\\x7b\\x64\\x41\\x85\\x1e\\xa8\\x37\\xf2\\x16\\x24\\xd7\\x59\\xb0\\xb5\\x86\\x99\\x6d\\xc2\\x23\\x84\\xd9\\x70\\xa9\\xf4\\xf7\\xc7\\xd7\\x76\\x26\\x3f\\xa5\\xe5\\x17\\x0a\\x50\\x0d\\x1f\\x5d\\xcf\\x09\\xf7\\xe7\\xfc\\xe2\\xc7\\x54\\x3b\\xfc\\x33\\x2a\\x0d\\x16\\x5f\\xd2\\x35\\x97\\x27\\x39\\xc9\\xf4\\xdc\\x08\\x7c\\x70\\x2f\\x21\\xff\\x50\\xc6\\xf1\\xf8\\xf2\\xd0\\x76\\x8f\\x0b\\x0a\\x6f\\x94\\xee\\x17\\x42\\x8f\\xc7\\xe5\\x0b\\xc5\\x65\\xae\\xdd\\x91\\x06\\xae\\x90\\x15\\xa6\\xd2\\x34\\x51\\x71\\x9b\\x15\\xf1\\xf8\\x2d\\x5c\\x7a\\xe0\\xbe\\xd8\\xfd\\x5a\\xcc\\x21\\x34\\x62\\xd5\\x77\\x96\\x27\\xe1\\x3b\\xb6\\x11\\xab\\x8c\\xae\\xdc\\xf5\\xa0\\x15\\xde\\x17\\x4c\\x8f\\xbb\\xfa\\xd1\\x3b\\xb5\\x41\\x86\\x95\\xca\\x01\\xb5\\xe0\\x2e\\xdc\\x7e\\xbb\\xc1\\xa7\\x67\\x45\\xd1\\xb4\\x41\\xc9\\x5d\\x91\\xce\\xb9\\xbe\\xca\\xe5\\x37\\xfe\\x03\\xd5\\xd7\\xdc\\x77\\xb8\\xb3\\x71\\xf0\\xb9\\x44\\x17\\x0b\\x1c\\x65\\x3a\\x03\\x75\\x31\\xe8\\x06\\x44\\xd0\\x20\\x5a\\xff\\x7d\\xce\\x84\\x2c\\x2c\\xc2\\x1e\\x0b\\x83\\x2d\\xa3\\x18\\xf3\\x83\\xe4\\xac\\x7f\\xb6\\x89\\xf0\\x10\\xc6\\x42\\xb2\\x9c\\xfb\\xeb\\x46\\xe0\\xe4\\x64\\x2e\\x60\\x89\\xc3\\x19\\x28\\x8b\\x68\\xee\\xc2\\xf0\\x66\\xb5\\x60\\xce\\x50\\x01\\xe3\\x04\\xa5\\xa8\\x25\\x66\\x70\\x16\\xd2\\x38\\x4e\\x90\\xfb\\x5a\\x14\\xff\\x90\\x85\\x99\\x43\\x84\\x38\\xf9\\x8c\\xeb\\xf9\\xda\\x4c\\x56\\xfb\\x6b\\x94\\x77\\xd7\\x92\\x5e\\x51\\xd1\\xd9\\xd4\\x71\\x2d\\xe6\\x2b\\x91\\x45\\x25\\x4b\\xfe\\x58\\x47\\xa7\\x7e\\xed\\xf7\\xd4\\x24\\x7c\\x13\\xa6\\x30\\x8a\\xe2\\x1b\\xd1\\x6a\\x00\\x92\\xf0\\x1b\\x23\\x6a\\xac\\x74\\xd6\\x6f\\xa8\\xad\\xbb\\xcd\\xcb\\x9c\\xa7\\xc7\\x06\\xe2\\x7a\\x88\\x72\\x5c\\x6e\\x76\\x09\\x6e\\x09\\xd4\\xb2\\xce\\xdb\\x58\\x50\\x2e\\x64\\x38\\xb4\\xdb\\xfb\\x87\\x8e\\x18\\xc9\\x19\\xa6\\x71\\x67\\xda\\xeb\\xcf\\x19\\x42\\x99\\x83\\xc8\\xd6\\x99\\x7b\\x8d\\x75\\x80\\xb8\\xb2\\x0a\\x3b\\xca\\x71\\x2c\\xb1\\x82\\xcb\\x9a\\x4c\\xb8\\xb8\\x17\\xc2\\x23\\x6a\\x48\\x83\\xad\\x43\\xe1\\xe9\\xae\\xaf\\x8f\\x16\\x62\\x1e\\x61\\x79\\x86\\xa2\\x40\\x89\\x4e\\xa0\\x2f\\xec\\xd8\\xfb\\x4f\\x83\\xbf\\x80\\xdd\\x40\\x6a\\x78\\x06\\xa9\\x89\\x8a\\xb4\\xfc\\x1a\\xf3\\xdd\\xeb\\xda\\x0d\\xb2\\xb7\\x51\\xa4\\xf5\\x15\\x28\\xd5\\x7b\\x18\\xfd\\xbf\\x0b\\xe8\\xa0\\x97\\x2c\\x48\\x5c\\x84\\xca\\xc1\\x3d\\x17\\x6b\\xe8\\x33\\x03\\xf4\\xe4\\x4c\\x34\\x51\\x59\\xe3\\x46\\xc9\\x8a\\xc3\\x67\\x60\\x42\\xb0\\x13\\x27\\x95\\x98\\xc9\\xd0\\xf7\\xb3\\xe3\\xe6\\xa5\\xac\\x9a\\x42\\xc6\\x6b\\x3a\\x9e\\xef\\x9f\\x2f\\x6f\\xd7\\xb7\\x3f\\x50\\x3e\\x33\\xbc\\xce\\x17\\xf2\\xdd\\x4c\\x4e\\x05\\x53\\x23\\xbf\\x87\\xf7\\x85\\x2e\\x7b\\x94\\xa7\\xaf\\x37\\x7b\\x3a\\x28\\x1c\\xf3\\xda\\xac\\xee\\x76\\x96\\x53\\xbf\\xbf\\xb7\\x2b\\xe7\\x3a\\x8b\\x95\\x68\\x6e\\x95\\x9d\\xab\\x2d\\x1d\\xe7\\x47\\x7d\\xdf\\xc6\\x05\\x0b\\xb3\\x57\\x7b\\x1f\\x9a\\x2d\\x7c\\x4b\\x5b\\x29\\x79\\xbb\\xaa\\xbd\\xdf\\xe6\\xd4\\x02\\x64\\x68\\x69\\x3d\\x36\\x6b\\xdd\\x3f\\x36\\x2c\\x73\\x7a\\x7b\\xd8\\xe2\\x7a\\x3a\\x49\\x7b\\x0e\\xe2\\x2f\\xea\\x5f\\x84\\xfd\\xfb\\xbd\\x07\\xc7\\xe6\\xd5\\x86\\x9a\\x02\\x7f\\x85\\x9a\\xd4\\x10\\x12\\x2a\\xfb\\xe4\\x01\\x5d\\x51\\x8e\\x52\\x29\\xec\\xe3\\x11\\x42\\x22\\x44\\x79\\xc9\\x42\\x54\\x6f\\x12\\x79\\xc9\\x4e\\x1b\\xaa\\x13\\x7a\\xd7\\xd0\\x6a\\xe6\\xd8\\xc6\\xf2\\x7e\\xf7\\x8c\\xe0\\x04\\x81\\xf8\\xed\\x48\\xdd\\xf7\\xf7\\x68\\xcb\\x0f\\x29\\x86\\x61\\x3d\\xf2\\x55\\xbf\\x57\\x7f\\x9a\\xca\\x3c\\xa0\\xa5\\xf3\\x42\\xf9\\x99\\x53\\xfc\\x09\\x7c\\xa0\\xbe\\xea\\xd2\\xa1\\xe5\\x28\\x2d\\x98\\x95\\x59\\x0d\\xe9\\xd4\\xd3\\xa0\\x02\\xa0\\xdf\\x93\\xac\\x0a\\x90\\x61\\xd3\\x80\\xb0\\x1e\\xf8\\x71\\x69\\x4b\\x82\\xe7\\xa0\\x69\\xbc\\x18\\x02\\x0b\\xa9\\x31\\xee\\xfc\\xc1\\xd8\\xb0\\x06\\xd1\\x05\\xa1\\x89\\xa3\\xbe\\x4b\\x96\\xc0\\x12\\xe5\\x80\\xc8\\x81\\xd9\\x85\\xf4\\x22\\xb5\\xe2\\x82\\x53\\xb5\\x24\\x66\\xc5\\xf5\\x4d\\x10\\x49\\x66\\x1f\\xc3\\xe2\\x3b\\xe8\\xa3\\x0a\\xbf\\xa6\\x8e\\x99\\x9c\\xbe\\xd1\\x10\\x6e\\xa7\\xd3\\x0b\\x86\\xf5\\x0c\\xca\\xd6\\x15\\x3b\\x4e\\xd2\\x6b\\xbd\\x3a\\xb7\\xba\\x1a\\x06\\x4f\\x2f\\xb6\\x58\\xdd\\x3e\\x57\\x3b\\xe9\\xe9\\xd4\\xae\\xdb\\xe7\\x4f\\x20\\x84\\x12\\xcb\\x93\\x75\\xb1\\x61\\x11\\x5e\\x93\\xa3\\x4a\\x76\\x8c\\x2d\\x33\\x47\\x6c\\x76\\x96\\xbe\\x0a\\x7a\\xec\\x09\\x73\\xd5\\xb4\\x9e\\x78\\xad\\xa3\\xd1\\xbc\\xd7\\xfa\\xf4\\xb4\\xe9\\xb2\\xdd\\x33\\xdd\\x11\\x8e\\x18\\x43\\x28\\xb1\\x47\\x2e\\x87\\xdc\\x75\\x28\\x75\\x4a\\xa1\\xe8\\xe9\\x64\\xd0\\x4d\\x21\\x34\\x58\\x0d\\x34\\x32\\xb8\\xf3\\xc2\\xa9\\x24\\xae\\x11\\x96\\xb4\\x3b\\xc2\\x40\\xc3\\x98\\xc3\\x2c\\x72\\x86\\x92\\x0e\\x04\\x35\\x5f\\x74\\xb5\\xb5\\xdc\\x06\\x7b\\x92\\x67\\x74\\xc7\\x48\\xc3\\xd0\\x3b\\x59\\xe1\\x5a\\x6d\\x6f\\x10\\x44\\x31\\xac\\x6f\\xd5\\x9c\\xd4\\x0f\\xea\\x83\\x7b\\xd9\\x9b\\x7e\\xdf\\x35\\x53\\xe6\\x20\\x10\\x7a\\xbd\\x56\\x67\\xc0\\x72\\xd6\\x0e\\xb4\\xb7\\x37\\x31\\xd1\\x2c\\x55\\x9e\\x61\\x9f\\xb5\\x35\\x77\\xba\\x03\\x7b\\x6d\\xec\\xa6\\x13\\xbe\\x75\\x7b\\x5c\\x9e\\x8e\\x4e\\xd5\\xc0\\x55\\x40\\x6c\\x7d\\xa0\\xba\\xe6\\x15\\x5c\\x2a\\x8a\\x4f\\x3c\\x9d\\x0f\\xb0\\x4d\\xaf\\x30\\xa1\\xb9\\xc6\\xa2\\x9c\\xf5\\xca\\x9d\\x39\\x13\\xd8\\x07\\x54\\x86\\xc2\\xc9\\x6d\\x57\\x97\\x41\\xf9\\x09\\x5b\\x85\\xc5\\xf0\\x0d\\x15\\xd8\\x60\\x8e\\xb4\\xa3\\xd1\\xb5\\x9d\\xb6\\x53\\x86\\x77\\x6e\\x72\\x6e\\x34\\x7d\\xbc\\x77\\x1b\\xe2\\x47\\x7d\\x51\\xb1\\xbb\\x5f\\x0e\\xa6\\x0b\\xc4\\x2d\\x0b\\xc8\\x7b\\x2e\\x5e\\x5b\\x77\\x59\\xef\\xbf\\x95\\x93\\x5f\\x65\\x6e\\x7f\\x36\\x2b\\xb9\\x18\\xaf\\xe1\\xfb\\xb4\\x26\\x18\\x30\\x48\\xff\\x12\\x8a\\xfd\\xa1\\x87\\xd8\\x40\\x9a\\x22\\x03\\x26\\xa1\\x46\\x17\\x52\\x88\\xca\\x4f\\x8e\\x90\\x92\\xa8\\x41\\x57\\x20\\x23\\xc9\\x26\\x56\\x9d\\x38\\xc4\\xcd\\x46\\x72\\x20\\x6f\\x0e\\x0a\\x8f\\xa3\\x41\\xfa\\x81\\x67\\xc8\\x56\\x44\\xc8\\x93\\xad\\x60\\xf2\\xa8\\x36\\x7b\\x28\\xbe\\x90\\xac\\x55\\xb2\\xf5\\x15\\x0f\\x3b\\xb7\\x09\\xb1\\x27\\x08\\xb0\\x3f\\x56\\x4a\\x65\\xb8\\x59\\x37\\x34\\x10\\xa0\\x08\\x62\\x4c\\x6e\\x1c\\x35\\x3a\\x6a\\x36\\x82\\xdb\\xe1\\x4a\\x67\\xde\\x9b\\x8e\\xb2\\xbe\\xf8\\xfb\\xf4\\xab\\xa4\\x29\\x9c\\x48\\xaf\\xb2\\xeb\\xe5\\x53\\x41\\x13\\x75\\x0c\\xf2\\xee\\x06\\x7e\\xf4\\x47\\x18\\xaf\\x68\\x22\\xda\\x2d\\xba\\xa7\\xc3\\xcb\\x4f\\x40\\x69\\x20\\x5e\\x84\\x32\\x0a\\xc3\\xa4\\xe4\\xb9\\x0f\\x2a\\xe1\\x76\\xe9\\x9e\\x9f\\xd0\\x0b\\x35\\xa5\\x72\\x22\\x29\\x50\\x9e\\xdb\\x89\\x01\\x36\\xd0\\x40\\x1a\\x92\\x53\\xdd\\x5b\\xdd\\xc2\\x1c\\xf4\\x70\\x50\\x58\\x3d\\x47\\xd9\\xf0\\xf3\\xc8\\x92\\xc4\\xfe\\x0f\\x01\\xd4\\x20\\xb3\\xf2\\x11\\x8d\\x95\\x7a\\xb1\\xcb\\xca\\xf5\\x22\\x0d\\x56\\xa6\\x61\\xf2\\x83\\x7f\\x57\\x2c\\xda\\xd1\\x54\\x2a\\xde\\xa6\\xe3\\xde\\x83\\xd1\\x6b\\xff\\xb5\\x61\\x8e\\xe6\\xb3\\x49\\xb2\\x52\\x51\\xc4\\x09\\xe7\\xd7\\x3a\\xad\\xe4\\x42\\xfd\\xbe\\x35\\x9e\\x34\\x0e\\xb6\\x4f\\xf0\\x84\\xa5\\x6e\\xd7\\xd5\\x1d\\x0c\\xdb\\xd3\\xbc\\xa8\\xcd\\xc7\\x7b\\x76\\xa6\\x64\\x8b\\xde\\xec\\x46\\xca\\xa6\\xb1\\x46\\xb6\\xcc\\x8d\\x54\\xe8\\xf4\\x79\\x37\\x1f\\xaf\\xc3\\x70\\xa2\\xa8\\xc7\\x74\\x4e\\xac\\x6e\\xda\\x87\\x9e\\xfd\\xee\\xc9\\xbd\\xac\\xde\\x37\\x3b\\xab\\x17\\xb6\\x99\\x75\\x21\\x5d\\xb9\\x3a\\x6e\\xa2\\x9e\\x3d\\xbb\\x72\\x4b\\x41\\x1d\\xb2\\x05\\x35\\x43\\xf3\\xb5\\xd1\\x33\\xab\\x1a\\x4f\\x0c\\xfc\\xfe\\xb8\\xc8\\x4b\\x29\\xa1\\xc3\\x7e\\x74\\x1e\\x0f\\x7b\\xe4\\x79\\x9f\\x7e\\x7e\\x74\\x50\\x70\\xd7\\x0a\\xe4\\xac\\x45\\x56\\xa1\\x1c\\xa2\\xa7\\x9f\\x7a\\x3c\\x5a\\x0b\\x96\\xfa\\xee\\x93\\x32\\xa0\\x46\\xd5\\x9b\\x0c\\x59\\x92\\x04\\x52\\x9b\\x96\\xdb\\x57\\xed\\xbb\\xc2\\x4c\\x81\\x04\\x69\\xfc\\xaf\\x88\\x75\\x73\\x6e\\x89\\x65\\x6a\\x2e\\xc2\\x62\\x71\\x79\\x86\\xd7\\x16\\x98\\x63\\x4f\\xc2\\x98\\x31\\xbd\\xb2\\x0a\\x72\\x7b\\xd0\\x1d\\x9a\\x31\\x28\\xf9\\x9f\\x84\\xfd\\xb1\\xe4\\x30\\x12\\xe9\\xa1\\x42\\x9a\\xd2\\x4b\\x4a\\x6e\\x99\\x78\\xca\\x45\\x92\\x48\\xd1\\x48\\x93\\x20\\xa6\\x5c\\xb0\\xd5\\xbd\\xc0\\xb8\\x65\\xd3\\x8e\\x4b\\xfa\\xde\\xd2\\xdf\\x1f\\xfa\\x30\\x9f\\x14\\x8e\\x87\\x2d\\xc7\\x44\\xd1\\x1c\\xa2\\x43\\xe3\\xd9\\x3d\\xdc\\x03\\x92\\xbd\\x70\\xfd\\x0a\\x2b\\x72\\x0e\\xf0\\x38\\x24\\x74\\x84\\x92\\xc0\\x7e\\x58\\x86\\xb4\\xc8\\xa1\\x52\\x32\\xcc\\xa9\\xa2\\x7e\\x5d\\x5b\\xa6\\x7f\\x43\\x55\\xfd\\xea\\xdd\\x74\\xd1\\xf0\\x22\\x0e\\x86\\xdf\\x4a\\x1b\\x60\\x27\\x97\\x6a\\x61\\xa9\\xa6\\xc5\\x88\\x19\\x8f\\xcd\\xf7\\xc1\\x34\\xfc\\x2f\\x2e\\xc1\\x0a\\x64\\xa9\\x15\\x56\\x3b\\x6d\\x96\\x65\\xbf\\x08\\x4f\\xe1\\xa7\\x9a\\xad\\x5b\\x0c\\x4d\\xd7\\xa2\\xad\\x0e\\x51\\x2b\\x46\\x8a\\x97\\x5a\\x26\\xcf\\xf3\\x28\\x4f\\xf5\\xa7\\x39\\x99\\x1d\\x47\\x13\\xbd\\xeb\\x89\\x9a\\xd2\\x27\\x6d\\x17\\x53\\xb9\\xc2\\x54\\xf5\\x11\\x4c\\xf2\\x78\\x7f\\x79\\x1b\\x80\\x09\\xdc\\x8b\\xc9\\x32\\x85\\xb3\\xd2\\xeb\\x66\\x59\\xa6\\x79\\x77\\x02\\xd2\\x8d\\x2b\\x86\\xef\\xd8\\xb7\\x88\\x71\\x6a\\x1a\\xd7\\x83\\xb6\\xca\\x82\\x8e\\xc4\\xa2\\x8a\\x16\\xb9\\xa9\\x3e\\xb9\\x68\\x5a\\x95\\x04\\xcf\\x10\\x96\\x77\\x95\\x6d\\x69\\xa6\\xee\\xcc\\x41\\x3e\\x84\\xc8\\x32\\x3f\\xa6\\x95\\xc4\\x84\\xe9\\xad\\x33\\x3f\\x98\\xa7\\x20\\x80\\xbd\\x4e\\xe4\\x91\\x2f\\x93\\x2d\\x5a\\x04\\x55\\x1a\\xf1\\x9c\\x7f\\x49\\x17\\x65\\x92\\x8c\\x85\\x2c\\x8d\\xa1\\xf7\\x60\\x8b\\xff\\x2c\\x2a\\xec\\x9b\\x8f\\x07\\x99\\x2f\\x93\\xff\\x01\\x8a\\x67\\xc4\\xfb\\x91\\x2a\\x42\\x9b\\xef\\x76\\x93\\x4a\\x1f\\x66\\x2e\\xff\\x29\\x27\\x84\\xb9\\x1e\\xd2\\x51\\xa1\\x54\\xde\\x16\\xb1\\x4f\\xb0\\x52\\x0f\\x3a\\xc6\\x80\\x9a\\x0d\\x53\\x4c\\xdc\\x57\\xf2\\x23\\x57\\xe2\\xd4\\x81\\xde\\xa5\\x07\\x62\\xc8\\xef\\xe7\\x95\\x04\\xab\\x2c\\x11\\x56\\xe3\\x13\\x4e\\x03\\x44\\x55\\x89\\x00\\x20\\x06\\xce\\x59\\xc8\\xfa\\xea\\xae\\x7d\\xbd\\x2e\\xa7\\xf9\\xbe\\x1b\\xbc\\x10\\x68\\x8c\\x2f\\xf4\\x3d\\x9e\\x4f\\x59\\x1c\\x7d\\x97\\xa3\\x7f\\x9c\\x1d\\x12\\xfd\\xc4\\x29\\x4f\\x9c\\xd5\\x0a\\xc1\\x4f\\xe9\\xc7\\xd6\\x26\\x32\\x6e\\xc2\\xfc\\x0e\\x34\\x98\\xaa\\xc0\\x43\\x96\\xcf\\xdc\\xc0\\x43\\x06\\x31\\x45\\xa0\\xc7\\x34\\x42\\x15\\xdd\\xd8\\x03\\xf9\\x2b\\x23\\x84\\xed\\xf2\\x48\\x7a\\xaa\\xee\\xfd\\xe4\\x61\\x14\\xef\\xf2\\x3f\\x26\\x40\\xc2\\xae\\xf9\\x55\\x9c\\x56\\xb9\\xea\\xbe\\xca\\x2f\\x90\\xe7\\x8f\\x8e\\x74\\x4e\\x5c\\x04\\x02\\x67\\x43\\xd3\\x53\\xc9\\x24\\xf7\\x98\\x81\\xf5\\x06\\x77\\x80\\x70\\x4c\\x80\\x49\\xa0\\xb1\\xfb\\x13\\xdc\\xaa\\x73\\x1c\\x09\\xf9\\x35\\xa2\\xa6\\x86\\xa3\\x50\\xe0\\x38\\x77\\x22\\xbd\\xc1\\xe3\\x38\\x63\\x1a\\xe1\\xfc\\xb8\\xdd\\x19\\x23\\xc5\\x11\\x1d\\xf6\\x96\\x02\\x0c\\x76\\x5a\\x52\\xcf\\xb4\\x34\\x35\\xfc\\xc1\\x42\\x27\\x3f\\x59\\xb9\\x3d\\x9c\\xd8\\xb7\\x1a\\x3d\\x4e\\xd1\\x8a\\xbf\\x8f\\x2d\\x3b\\x7e\\x11\\xaf\\x7a\\xda\\xda\\xcf\\x0b\\x6a\\xc4\\xaa\\x4c\\xdd\\x59\\xbc\\xed\\x6d\\x41\\xbc\\x9f\\x62\\xf8\\x1c\\x33\\x53\\xb2\\xb3\\xbc\\x8e\\x32\\x72\\xb7\\x9b\\x2b\\x57\\x3d\\xcf\\x0f\\x73\\x7d\\x5e\\x27\\x26\\x52\\x39\\x33\\x5e\\x78\\x7d\\x16\\x55\\xdb\\x78\\xca\\x47\\xae\\xf9\\x06\\x7e\\x6c\\x2c\\xe1\\x22\\xcd\\x28\\x20\\xe6\\x14\\xeb\\x5e\\x86\\x56\\xfb\\x81\\xa9\\x2c\\x68\\x83\\xe5\\xc3\\xb0\\x35\\x75\\x4b\\xff\\xc9\\x68\\xd1\\xc4\\xf5\\xa3\\x0e\\x63\\x22\\x09\\x12\\x62\\xac\\xd0\\x20\\x2b\\xcc\\x80\\x61\\xdb\\x1b\\x09\\x32\\xf7\\x19\\x50\\x1f\\xd0\\xfb\\xda\\x89\\x72\\x36\\x3f\\x77\\x7e\\xea\\xf8\\xf2\\xf2\\x65\\xb5\\xa8\\x2d\\x0a\\xae\\x63\\x08\\x25\\x5e\\x73\\xd9\\xe0\\x63\\x71\\xf4\\x34\\x5b\\x5b\\x24\\xf8\\xac\\xc7\\x5f\\x41\\xb3\\x3d\\x99\\x64\\x81\\x8e\\x82\\x57\\xd8\\x22\\x67\\x78\\x00\\xd8\\xa2\\x14\\x80\\x29\\x13\\x23\\xa0\\x66\\x32\\x8e\\xe0\\xd6\\xf6\\x8f\\xc7\\x9c\\xba\\x18\\xf0\\x6a\\x63\\x62\\x97\\x29\\x32\\x46\\x19\\x6b\\x31\\x0c\\xdd\\x03\\xb7\\xf9\\x15\\xc0\\xa0\\x53\\xd8\\x34\\x19\\x9c\\x13\\xc1\\x03\\x0e\\xc4\\x39\\x4d\\x6f\\x7a\\x0a\\x96\\xac\\x80\\xe6\\xd2\\x69\\xc5\\xec\\x9b\\x36\\x87\\xb2\\x52\\x57\\xac\\x53\\x77\\x58\\xc6\\xd2\\xe0\\x90\\x44\\x9e\\x10\\x12\\x42\\x7d\\x9e\\xe2\\xdc\\x8e\\xef\\x9d\\xcf\\x7b\\x05\\x9e\\x6f\\xbd\\xee\\xfa\\x3c\\x04\\xfb\\xac\\x92\\xbe\\x1f\\xce\\xa0\\x26\\x93\\x63\\xbf\\x1f\\x57\\x4f\\x51\\x72\\x4b\\x58\\x01\\xd7\\xe4\\x7e\\x2f\\x34\\x6a\\x2d\\x7f\\xff\\x42\\xa9\\x98\\x82\\x3d\\x70\\xf9\\x7f\\x71\\xf2\\x10\\xf5\\xc2\\x27\\xee\\x0a\\xaf\\x44\\xea\\xe7\\xf2\\x0e\\xd6\\x0b\\xb4\\x83\\x93\\xf1\\x61\\xb2\\xee\\x4c\\x04\\x1c\\x99\\xf1\\xa7\\x71\\x50\\x4e\\x9a\\xeb\\xd5\\x7b\\xe0\\x01\\x05\\x66\\x25\\x66\\xc7\\xfe\\xc4\\x21\\x80\\x5d\\x78\\x41\\x8d\\xce\\x83\\x3b\\x8d\\xf6\\xf7\\xae\\x67\\x43\\x39\\xd5\\x50\\xe6\\xb9\\x35\\x6b\\x7c\\x1f\\xcd\\x90\\x37\\x0a\\x52\\x4e\\x7e\\x58\\xcb\\x46\\x90\\xc1\\x68\\xf6\\xf4\\x10\\xb7\\x3a\\x6e\\xfb\\xf9\\x5c\\x48\\x6b\\xb0\\x3d\\x33\\x7e\\x83\\xcb\\x20\\xd7\\xea\\x80\\x79\\xa8\\x82\\xba\\xfb\\xc2\\xba\\x2d\\x42\\x41\\x16\\x6f\\xe9\\xb4\\x8e\\xd2\\x71\\x5f\\x97\\x59\\x19\\x6c\\xad\\xde\\x24\\x0c\\x73\\x50\\x97\\xe9\\xa9\\x26\\x34\\xe6\\x9c\\x64\\xea\\x2d\\x48\\x73\\x16\\xdc\\xd3\\x02\\x92\\x3b\\xf6\\xdb\\xc7\\x23\\x86\\xf1\\xfb\\xa3\\xfe\\x5e\\x1d\\x4a\\x14\\x52\\x67\\x58\\x8e\\x6e\\x59\\xcc\\x3f\\xee\\x20\\x9e\\xa4\\x34\\x68\\xd7\\x2d\\xf1\\xba\\xe0\\x62\\x35\\xd2\\xbe\\x75\\x53\\x74\\xad\\x2a\\x65\\x59\\xb6\\xd8\\x53\\x95\\xe6\\xdc\\x31\\xce\\x0e\\x86\\xa5\\x9c\\x57\\xd9\\xde\\x4b\\x24\\x6b\\xe4\\xc7\\xa5\\x43\\x7f\\x1b\\xae\\x3f\\x77\\x56\\x0d\\xc3\\x05\\xe2\\xf4\\x74\\x34\\xe4\\x1b\\xee\\x76\\x5b\\xd6\\xbe\\xbd\\xf7\\xc9\\x57\\x6b\\x50\\x25\\xbc\\xf5\\x36\\x71\\xab\\x45\\x64\\xd0\\x5e\\x73\\x89\\xb0\\xe1\\x6b\\x5f\\x89\\xdf\\xba\\x3f\\x65\\x5c\\xca\\xf8\\x7e\\x9e\\x46\\x49\\x98\\x2a\\xad\\x33\\xeb\\x4f\\x4e\\x38\\xd7\\x78\\xb1\\xde\\x46\\x54\\xad\\x35\\xb5\\x1a\\x9e\\x75\\x48\\xd3\\x66\\xae\\xf0\\x44\\xa0\\x72\\x06\\x72\\x6f\\x5a\\x86\\x1b\\x65\\xf7\\x28\\xd4\\x2f\\x63\\xb4\\x9f\\x25\\x68\\x5f\\xc3\\xf4\\xf6\\x94\\xba\\x32\\xd7\\x47\\xca\\xef\\x5d\\x67\\xf6\\x69\\x52\\x2e\\x4b\\x24\\x93\\x36\\x3a\\x5a\\xe3\\x26\\xf6\\xeb\\x33\\x90\\x73\\x4c\\x47\\xf6\\x83\\x46\\x92\\xae\\x81\\x46\\x02\\xb1\\x27\\x93\\x1a\\x78\\x51\\xf6\\x63\\xed\\xa4\\x63\\x62\\xdd\\x5a\\x0b\\xa7\\x8b\\x56\\xbe\\x7e\\xc9\\x24\\xf9\\xbe\\x1f\\xcf\\xea\\xa2\\x1d\\x8f\\xbf\\x22\\x08\\x66\\xa9\\xfa\\xdf\\xbe\\xca\\x7b\\x2b\\xad\\x0b\\x43\\xd5\\xd4\\x85\\x2c\\x4e\\xad\\xed\\xbf\\x85\\xf7\\x51\\xf8\\xef\\x31\\x40\\x97\\xa2\\xa2\\xae\\x40\\x9f\\xd0\\xfb\\xa1\\xc0\\x48\\x18\\xec\\x73\\xa0\\x4c\\x5e\\x6a\\x09\\xe8\\x23\\x68\\x56\\x3a\\xc7\\x35\\x38\\x83\\xe9\\x35\\x5a\\xd1\\x86\\xe0\\xfd\\x20\\x20\\x21\\x4b\\x16\\x8d\\xa5\\x69\\x68\\x58\\x10\\x48\\xe3\\xf8\\x2e\\xda\\xbf\\x07\\x6a\\xba\\xf0\\xb4\\xb5\\xfa\\xe9\\x18\\x45\\x44\\x85\\x11\\xc9\\x98\\x49\\x6c\\x37\\x5a\\xca\\x0b\\x3a\\xb9\\xb9\\xd2\\x27\\xe6\\x7a\\x5d\\xdf\\xa1\\xa8\\xb6\\xbe\\x78\\xb5\\x4b\\x9d\\x58\\x80\\x6a\\x48\\x25\\x74\\x27\\xbf\\x60\\xd3\\x52\\x64\\x04\\xa9\\x18\\x19\\x82\\x99\\x84\\xeb\\x85\\x88\\x31\\x2c\\xac\\x41\\xc4\\xf3\\xa0\\x07\\x91\\x0a\\x05\\x04\\xfb\\x27\\xc4\\x8d\\x0f\\xe0\\x36\\x42\\xfe\\x10\\x30\\xfc\\x20\\x95\\x57\\x10\\xa8\\xb4\\x3a\\xe8\\x45\\x22\\x30\\x8d\\xf2\\x61\\xec\\x33\\x2a\\x31\\x88\\xa0\\x8d\\xc8\\xe9\\xa7\\x2b\\xe9\\x4b\\x27\\x18\\x07\\xeb\\x93\\xac\\x77\\xc0\\x08\\x5c\\x7c\\x30\\xa0\\xc5\\x43\\xa7\\x3a\\xdb\\x13\\xe3\\xd1\\x13\\xc5\\x98\\x19\\x68\\x91\\x25\\x8f\\x1d\\xa0\\xb5\\xcb\\xb5\\x12\\xca\\xaa\\x18\\x09\\x00\\xa5\\x96\\xb0\\x62\\xc8\\xa8\\x1f\\x09\\xd1\\xe4\\x79\\xea\\x90\\xd5\\x72\\xc0\\x46\\xb4\\xd1\\xf7\\xeb\\x19\\xa6\\x82\\xfd\\x9a\\x02\\x4b\\xa0\\xca\\x7d\\x4f\\xee\\x69\\x93\\xdf\\x4c\\xf4\\xba\\xcb\\x1e\\xef\\x8b\\xfe\\x8b\\x25\\x93\\x9d\\xdf\\x4b\\x4b\\xdf\\x99\\x15\\x8e\\xb2\\x7a\\x40\\xe1\\x5e\\x65\\x9f\\x7a\\x96\\x05\\xe5\\x0b\\xb6\\xd4\\xa0\\x47\\x69\\xca\\x41\\x31\\x65\\xb4\\x21\\x6e\\x0b\\x2b\\xad\\xe7\\x43\\x8e\\xaf\\x9d\\x9d\\x18\\x6f\\x9d\\x8c\\x47\\x40\\x24\\xd0\\x50\\xf6\\x7e\\x6a\\x74\\xdd\\xf9\\x28\\xfb\\x00\\xde\\x50\\xa9\\xfe\\xb9\\x69\\x7d\\x9a\\x7e\\xfa\\xb9\\xf0\\x78\\xda\\x5b\\xb2\\x56\\x84\\x98\\x2b\\xbf\\x20\\xee\\xa7\\xbf\\xd4\\x8f\\x9a\\xd5\\x83\\xc5\\x22\\xb4\\x24\\x5a\\xe5\\x92\\x76\\x7c\\x77\\xaa\\x50\\xf5\\xcf\\xae\\x6f\\x0a\\xe1\\xa7\\x30\\xcf\\x9e\\xe2\\x95\\x32\\x41\\xe4\\xe2\\x29\\x88\\x73\\x3a\\x48\\xbc\\x08\\xf7\\x85\\xb8\\xe5\\x12\\x8f\\x24\\xe3\\xab\\xa4\\x9a\\x23\\x1f\\x78\\x8d\\x5d\\x3e\\x20\\x81\\x4b\\xb1\\x0d\\xa0\\x2f\\xd2\\x03\\xb9\\x13\\x16\\xae\\xce\\xcb\\x10\\xb2\\x3f\\xf8\\x72\\x07\\xdf\\xb4\\xb0\\x46\\xfe\\xd4\\x8a\\x48\\x85\\xe6\\x42\\x43\\x14\\xeb\\x6b\\x04\\xad\\xa5\\x8e\\xf5\\x62\\x87\\x13\\x7a\\xa9\\x1a\\x39\\xcb\\x29\\xf7\\x35\\xf8\\x28\\xd5\\xe1\\xef\\x65\\xe3\\x92\\x22\\xdb\\x9e\\x9e\\xfa\\x43\\xbf\\xcb\\xcd\\x31\\x42\\x81\\xba\\xb0\\x0b\\x6d\\xf8\\x73\\x3f\\x25\\x60\\x12\\xeb\\xf6\\xf7\\x4c\\x09\\x9b\\x1b\\x18\\x1f\\xc5\\x36\\x33\\x2c\\x01\\xd1\\x3f\\x71\\x0a\\xf9\\xa4\\x1e\\xf3\\xf6\\x44\\xc1\\x39\\xf9\\x80\\x24\\x3d\\x83\\x4a\\xdd\\xc2\\x7f\\x8c\\xe0\\xdc\\xb2\\xc2\\x72\\x5e\\x50\\x56\\xe2\\x69\\xd6\\xa7\\xe7\\x58\\x7c\\xdf\\xb3\\x35\\xd7\\xdd\\xaf\\x5d\\xb6\\x0b\\xff\\xd6\\x17\\x1b\\x5a\\xac\\xc3\\x3b\\x8b\\x97\\x89\\xae\\x64\\xc5\\xd7\\x65\\x16\\x7a\\xff\\x1b\\x85\\xa1\\xa6\\x82\\xb7\\xa6\\x4e\\x05\\x33\\x55\\xdc\\xa0\\x4c\\x72\\x44\\xf8\\x9f\\x0c\\x26\\x86\\xf8\\xc5\\xe6\\x1a\\xae\\x32\\x01\\x1b\\x4c\\xa0\\x00\\xe2\\x3e\\x97\\x3f\\x7e\\x95\\x4d\\x51\\x6d\\x06\\x27\\xd9\\xc7\\x4b\\x63\\xae\\x0f\\x89\\xd7\\xed\\xf7\\xd3\\xe0\\x14\\x95\\x5a\\x68\\x10\\xb4\\x5c\\x33\\x0d\\xc8\\x7a\\x7a\\x88\\x1b\\xb4\\x25\\xf8\\x4a\\xe0\\xba\\x67\\x14\\x45\\x64\\x91\\x84\\x13\\x1f\\xb6\\x46\\x90\\x00\\x02\\xdf\\x03\\xf7\\x37\\x14\\x6d\\xe6\\x87\\x11\\xe5\\x86\\x52\\x77\\xee\\xd0\\xba\\xf9\\x49\\x31\\x33\\xc1\\x20\\xf6\\x55\\x33\\x07\\x13\\x93\\x3f\\x41\\x63\\x4b\\x26\\xed\\xbf\\x40\\xe4\\xc7\\xe6\\xf1\\x4a\\xa7\\xd9\\xfd\\xfb\\xdf\\xa1\\xab\\xfc\\x5b\\x64\\x02\\x08\\xf5\\x7b\\x85\\x3c\\x62\\x34\\x16\\x45\\x0c\\xfe\\xec\\x9a\\xb1\\xa6\\x24\\x60\\xd4\\x3e\\x0a\\xb5\\x02\\xe0\\x9a\\x48\\x60\\x18\\xa2\\x23\\xbf\\x3f\\xbe\\x15\\x4e\\x99\\x8d\\x32\\xb2\\xa8\\xea\\x81\\x70\\x1e\\x96\\x25\\xce\\xfc\\x4a\\x59\\x04\\x5c\\xe9\\x96\\xae\\x1e\\xd0\\xf2\\xaa\\x4b\\x25\\x4a\\x68\\xb5\\x3b\\xd2\\x5f\\x6f\\x0d\\xcc\\xb7\\xcc\\xa3\\xe9\\xab\\x94\\x18\\x6f\\xf7\\xde\\x4a\\xeb\\x41\\xa4\\xf3\\x21\\xa5\\x18\\x7e\\x79\\x1a\\x81\\x8d\\x81\\x0e\\x8c\\x41\\xc9\\xd2\\xac\\x70\\xf0\\xd4\\xc5\\x8b\\x39\\xdb\\x70\\xfa\\xc5\\x9a\\x0c\\x1a\\x09\\x6e\\xe0\\x06\\xb8\\xcd\\x7b\\x3b\\xdb\\x6a\\xd4\\x49\\x6b\\xab\\xe9\\x6b\\x11\\x5a\\x86\\x30\\x2c\\xf1\\x59\\xac\\xe3\\x49\\x19\\x91\\x59\\x59\\xc3\\x11\\x15\\xfd\\x3b\\xf4\\xc9\\x74\\x7e\\x86\\x14\\xf1\\xdd\\x46\\xe6\\x45\\xee\\x36\\xd0\\x15\\x37\\xc7\\xe2\\xd9\\xa1\\x04\\xbc\\x79\\xf9\\xa9\\xce\\x3e\\xe6\\x5f\\x13\\x82\\x4f\\x6b\\x17\\xd4\\x08\\xda\\xf6\\xa3\\xe7\\x7f\\x77\\xb7\\x16\\xbe\\x5c\\x1e\\xb3\\x05\\x0d\\x57\\x69\\xa2\\xbf\\x56\\x70\\x67\\x3a\\x12\\x04\\x69\\xf5\\xdb\\xa5\\x58\\x4b\\x14\\x68\\x27\\x9a\\x5e\\xd6\\x2a\\x22\\x6b\\xda\\xd9\\x1b\\x4d\\x17\\xe3\\x3b\\x7b\\xb7\\x9b\\xee\\x67\\xac\\x15\\x65\\x6b\\xc7\\x5a\\x48\\x43\\x5a\\x5f\\x34\\x0c\\xf1\\x03\\x6b\\x29\\x0b\\x57\\x53\\x90\\x9b\\x04\\x92\\x29\\x90\\xb1\\xad\\x78\\x1e\\x71\\xc2\\xec\\x5b\\x15\\xdc\\x30\\xde\\x16\\xb0\\x47\\x98\\xe2\\x95\\x20\\xeb\\xc4\\xc2\\xcd\\x11\\x51\\xa0\\xb8\\xfa\\x08\\xc5\\x98\\xd4\\xda\\x78\\x06\\x17\\x35\\x14\\xfc\\xc3\\x06\\xb5\\xf0\\xd6\\xec\\x1a\\x60\\xa2\\x82\\xa6\\x77\\x09\\xe1\\xe4\\x44\\xcc\\x1f\\x86\\xc6\\x26\\x78\\x92\\xe2\\xfe\\xc4\\xec\\x57\\x91\\x96\\x2e\\x25\\x66\\x53\\xdc\\xbd\\x0d\\x25\\xcd\\xee\\xd8\\xc2\\x88\\x16\\x85\\x98\\x5b\\xa1\\xd4\\xb8\\x4f\\x54\\x87\\xa5\\x8c\\xa3\\x51\\xd8\\x0b\\x6f\\x9e\\x5d\\x7f\\x76\\x40\\xd4\\xb4\\x19\\xba\\xed\\xc3\\x51\\xca\\xd6\\xf2\\x2c\\x63\\xbc\\xd2\\x5f\\x84\\x09\\x09\\xcc\\xcc\\x28\\x49\\xfa\\x0a\\x51\\xef\\x54\\x2c\\x50\\x28\\x47\\x58\\x98\\x92\\xed\\xba\\x3c\\xbf\\x2d\\xb3\\x75\\x79\\x09\\xca\\x9a\\x6e\\x6a\\xb0\\xd8\\xdf\\xef\\x93\\xf2\\xdf\\x0e\\x50\\xab\\x56\\xb5\\xf7\\xf4\\x1f\\x8a\\xc7\\x5e\\x13\\x39\\xf0\\x38\\x9c\\x68\\x97\\xc0\\x72\\xc7\\xea\\x7b\\xca\\x3a\\xf0\\xd2\\xd5\\xc1\\x91\\xa0\\x59\\xc5\\x49\\x9f\\x7a\\x55\\x4d\\x68\\xcc\\x8c\\x06\\x1b\\x3e\\xfc\\x8b\\x67\\xae\\x33\\x96\\x38\\x1f\\xd5\\xef\\x54\\x13\\x2b\\x94\\x4a\\x85\\x98\\x9a\\xfd\\x01\\xec\\x5a\\x9c\\xe7\\xc6\\xff\\xd4\\x46\\xdd\\xda\\x74\\x5a\\x3d\\x32\\xbd\\x42\\xb5\\x4b\\x0d\\x31\\xcc\\xe0\\x0d\\xb6\\x37\\x77\\xc3\\xe5\\x83\\x5d\\x46\\xcc\\xbc\\xc4\\xb0\\xae\\x46\\x17\\xd2\\x5f\\xed\\xdc\\x1f\\x5a\\x42\\xcc\\x65\\x76\\xe6\\x70\\xf6\\x0c\\x6d\\x2c\\xa5\\xba\\x25\\xa9\\x58\\xa8\\xb9\\x57\\x50\\x33\\x7a\\xac\\x07\\xec\\x80\\x50\\x2b\\x58\\xb8\\x72\\xda\\xed\\x66\\x90\\x0e\\xb2\\xf1\\x88\\xbb\\x2d\\xc3\\x77\\x51\\x81\\xd4\\x02\\x2b\\x01\\x79\\x22\\x67\\xa5\\x53\\x7b\\x52\\x00\\xad\\x43\\x4a\\x8e\\x45\\xec\\x11\\x4b\\xd2\\x44\\x21\\x63\\x54\\x35\\x41\\xa6\\x2b\\x92\\x8e\\x67\\x19\\x44\\x5a\\x58\\x02\\xbb\\x1b\\xeb\\x3b\\x53\\x35\\xa4\\xcf\\x62\\x30\\x72\\xc2\\x01\\xcf\\x0e\\xe5\\x98\\xa1\\x0b\\x62\\xa1\\xdb\\xe2\\x29\\x78\\xa1\\xd6\\xf1\\x99\\xd2\\x3b\\xa8\\xa3\\x0b\\x66\\xbf\\x5b\\xd6\\xd8\\xcf\\x99\\xb5\\x80\\x66\\xc8\\x71\\x65\\x74\\xbf\\x32\\x35\\xfa\\x52\\x98\\xdf\\xb6\\x5f\\x0d\\x95\\x35\\x56\\x27\\xb1\\x41\\x45\\x29\\x8d\\xf9\\x14\\xa7\\x9c\\x3f\\xe0\\xc1\\x70\\x1b\\xba\\x5e\\x5d\\xfe\\x10\\x2e\\x30\\x62\\x86\\xbd\\x16\\xe3\\x75\\x84\\xf8\\x0b\\x54\\x2c\\x72\\x44\\xf9\\xb8\\x9f\\xb5\\xe3\\x7c\\xfc\\x6d\\xc9\\x83\\xfa\\x2e\\x55\\x28\\x54\\x98\\xe4\\xd3\\x35\\xa3\\x76\\x3f\\xe2\\x8f\\x9e\\x5c\\x3e\\x5b\\x69\\xd6\\x7d\\x5c\\x9a\\x47\\x53\\xa5\\x7b\\x02\\x4f\\xc5\\xed\\x69\\xb3\\x9e\\x55\\xdb\\x38\\xc4\\x22\\x65\\xc1\\x02\\xf7\\xe1\\x95\\x72\\x6a\\xf3\\xdf\\x10\\x87\\xba\\xb0\\x8c\\x5b\\x1a\\x43\\x4a\\x92\\x51\\xda\\xc2\\xc6\\x91\\x21\\xe9\\xac\\xff\\x10\\x09\\x66\\x07\\xaa\\xa4\\x0f\\x47\\xb9\\x70\\x77\\x89\\x9a\\xe7\\x41\\x74\\x4e\\x1e\\x06\\xc7\\x39\\xa9\\x0f\\xa0\\xad\\x64\\x64\\x19\\xf5\\x1c\\x53\\x73\\xa7\\xc5\\x84\\x31\\x40\\x73\\xc9\\xc5\\x03\\x13\\x2f\\xe2\\x05\\x7e\\x13\\x7b\\x46\\x95\\xeb\\x57\\x1d\\x3c\\x19\\xec\\x0e\\xf5\\xa9\\x3b\\x2f\\xe0\\x7a\\x71\\x0e\\x3f\\x2b\\xd7\\x34\\x2a\\xdf\\x39\\xbe\\xbf\\x19\\x0c\\xff\\xd3\\xfa\\x6d\\xb1\\x19\\x1b\\x4b\\xf3\\xc5\\xf3\\xd1\\xf1\\x87\\x67\\x0e\\x13\\x67\\xec\\x73\\xee\\x12\\x22\\xb7\\x5b\\x3f\\xef\\x7a\\x82\\x80\\xa0\\xae\\x98\\xc6\\x3b\\xb3\\x93\\xa7\\xf8\\x20\\x5e\\xd4\\xb3\\xf7\\x61\\xe9\\x16\\xb9\\xf0\\x9a\\xdf\\xf6\\xb2\\x61\\x63\\xa7\\x6c\\xec\\x0f\\x2f\\xa4\\x25\\x28\\xc9\\xcd\\x10\\x6f\\xba\\x84\\x43\\x0b\\x4d\\xda\\x2e\\xd4\\x4c\\x02\\x50\\xe2\\xd8\\xa4\\xde\\x30\\xb8\\x42\\xaa\\x3e\\xa1\\x97\\x2b\\x39\\x07\\x39\\xa5\\x92\\x43\\xd9\\xfd\\x8f\\xfd\\xfa\\xfe\\xd0\\x2d\\x87\\x15\\xe0\\x28\\x0b\\xde\\xeb\\x7c\\xe8\\x1f\\xfc\\xaa\\xcf\\x3d\\x93\\x20\\x2d\\xa3\\x19\\x00\\x55\\x5c\\xc5\\x38\\x3e\\x41\\x0f\\xc4\\xed\\x4c\\x00\\x78\\x84\\xeb\\x65\\x72\\x66\\xbb\\x35\\x86\\xd7\\xd5\\xa8\\x5b\\x86\\x52\\x3e\\x78\\xe1\\xfa\\x07\\xcd\\x90\\x42\\xc9\\xfb\\x53\\xfb\\x23\\x5a\\xb1\\x9b\\x8b\\x60\\x2d\\xf9\\xf7\\x25\\x51\\x24\\xb2\\xa7\\xdf\\xf6\\x7d\\xa2\\xfe\\xa9\\xbc\\x1c\\xf4\\x1b\\x5c\\xed\\x23\\xe7\\xe2\\x7b\\xea\\x73\\xaa\\x16\\x00\\x54\\x53\\xe0\\xa2\\x38\\x1b\\xe0\\x3c\\x0c\\xbb\\x0e\\x1f\\xb2\\xec\\x4f\\x9f\\x35\\x05\\x7a\\x3a\\x69\\xb7\\x2d\\xee\\x23\\xc6\\xd9\\xaf\\x9d\\x74\\xe4\\x88\\xac\\x65\\x39\\x59\\x3b\\xfa\\xc9\\xe0\\x99\\x90\\x75\\xc5\\x52\\x3a\\xb9\\x57\\xa0\\x7e\\x73\\x00\\x9b\\xba\\x62\\xff\\xcd\\x9e\\x2b\\x55\\x3e\\xa6\\x23\\xcd\\xc7\\x5d\\xec\\xfc\\x65\\xa2\\xa7\\x81\\x39\\x70\\xd2\\x7d\\xb7\\x45\\x3f\\x18\\x26\\x05\\x45\\xf4\\x78\\xc2\\x52\\x79\\x9b\\x30\\x2a\\x1d\\x7c\\x93\\x7f\\x4c\\xbd\\x62\\x3b\\x4a\\x8c\\x67\\x42\\x9d\\xd2\\x97\\x50\\x5c\\x38\\x44\\xa2\\xcd\\x02\\x6a\\x65\\x53\\xf8\\xc1\\x98\\xe9\\x48\\xb3\\xd3\\x15\\x7d\\xe9\\xae\\x8e\\xad\\x53\\x6d\\xea\\x4e\\xea\\xe7\\x36\\x53\\x5e\\x7b\\x06\\xbc\\x1f\\xc9\\x76\\xe8\\x7b\\xa1\\xc7\\x81\\x9b\\xa0\\x7e\\xa1\\x1c\\x36\\xbd\\xe8\\xd9\\x96\\x02\\xaf\\x24\\x80\\x2e\\x45\\x6a\\x4e\\x9b\\x0c\\x2d\\xb4\\xd8\\x87\\x36\\x64\\x39\\x7d\\xba\\xa1\\x42\\xcf\\x42\\xb4\\xff\\x27\\xc4\\x9d\\x5f\\x2b\\x76\\x67\\xf5\\x08\\x72\\xcd\\xb3\\x21\\x27\\x49\\x77\\xb7\\xe7\\xf9\\xe3\\x67\\xb0\\x12\\x79\\x93\\xcb\\x63\\x2b\\x24\\x0e\\xe6\\x4b\\x53\\xc0\\x90\\xc2\\xa6\\xc3\\x67\\x0c\\x93\\x99\\xcb\\xbb\\x5a\\xda\\x5f\\x7f\\xb6\\xb8\\xb5\\x2a\\x0a\\xf5\\x25\\x67\\xcb\\x75\\x78\\x3c\\x3b\\xfd\\x17\\xe9\\x02\\x5b\\xb2\\x24\\xb5\\xf9\\xdd\\xbc\\xa4\\xdd\\x70\\xbe\\xb9\\x3b\\xff\\xdf\\x0c\\xaa\\xcd\\x0b\\x84\\x06\\xb1\\x88\\x61\\x11\\xe9\\xde\\x38\\x9b\\xda\\xcb\\xda\\x43\\xba\\xc8\\xca\\x0a\\x86\\x98\\x75\\x04\\x96\\x46\\xc7\\x07\\x08\\x4c\\xad\\x76\\xaa\\xee\\xde\\x4b\\xd7\\x58\\x98\\x10\\xcb\\xa5\\xf6\\xde\\x6d\\xb7\\x87\\xb3\\x0c\\xc9\\x5f\\x50\\x5a\\x99\\x40\\x92\\xad\\xd6\\x1e\\xb5\\x8d\\x46\\x62\\x1c\\x75\\xbb\\x7b\\x64\\xd5\\xa1\\x12\\x23\\x1e\\x7b\\x51\\x76\\xe1\\xc8\\x69\\xd2\\x0f\\x0e\\x5b\\xc9\\x29\\x93\\x41\\x9c\\x98\\xea\\x68\\x17\\xc7\\xa6\\xa0\\xe3\\x07\\xec\\x3e\\xf5\\x57\\x7f\\x1e\\x07\\x45\\x18\\xd3\\x07\\x89\\x21\\x53\\xb5\\x7a\\xca\\x67\\x29\\x2e\\xc9\\xf2\\x3d\\xe6\\x3e\\xd3\\x8b\\xfb\\x1f\\x40\\x9b\\x64\\x96\\xe9\\xdc\\xe2\\x9a\\xb6\\x86\\xb8\\x14\\x18\\xe3\\x6a\\x7b\\x16\\xc8\\x98\\x4e\\xb4\\x04\\xd9\\x0b\\x36\\x49\\x02\\x25\\x2a\\x85\\xa3\\xe0\\xed\\x9e\\xf2\\x24\\xf2\\xaf\\x05\\xac\\x09\\x77\\x1b\\x4b\\xa1\\xcd\\x77\\xe2\\xf4\\x76\\x74\\xea\\x56\\xb7\\xe5\\x05\\x56\\x47\\x69\\x1d\\x8b\\xe5\\xb3\\x6b\\xd5\\x94\\x74\\x37\\xe9\\xd2\\x69\\x2f\\xe8\\xe3\\x16\\xc9\\x8e\\xcc\\x38\\x7f\\x20\\xeb\\x32\\x22\\x24\\xdd\\x53\\xa2\\x89\\xc9\\x0b\\xc0\\x7a\\x3c\\x42\\x85\\x5f\\x5d\\x38\\xe0\\x61\\xae\\xf4\\xfe\\x44\\x58\\x5d\\x22\\x21\\x50\\x81\\xa3\\x0c\\x8e\\x96\\x34\\x9d\\x1f\\xfa\\xb4\\xda\\xf9\\xd0\\x44\\x23\\x3f\\x7c\\x15\\x5e\\x1d\\x91\\x9a\\x78\\xd8\\x72\\x7e\\x43\\xac\\x4d\\x61\\x12\\xab\\x41\\x7d\\xf1\\xeb\\x61\\x37\\x75\\xc7\\x17\\x82\\xe7\\x57\\xe4\\x6f\\x39\\x02\\x2b\\x84\\x76\\x7b\\xd8\\x30\\xf2\\x78\\xbb\\xd6\\x7b\\x58\\xb1\\x54\\x2d\\x95\\xec\\x4f\\x3b\\x8d\\xc7\\x6c\\x06\\xac\\xba\\x94\\x7f\\xd2\\x60\\x3c\\x34\\x76\\x74\\x3f\\xea\\x54\\xb7\\x52\\x77\\xa4\\x7d\\xf8\\xab\\x20\\x6a\\x4e\\x81\\x0a\\x30\\xf2\\x20\\xeb\\xae\\x1f\\x79\\x35\\x46\\xfc\\x22\\x00\\x71\\xdb\\x21\\x7a\\x3c\\x42\\xd7\\xbf\\x32\\x4d\\x1c\\x5f\\x83\\xfc\\x08\\xdb\\x99\\xa4\\xbf\\x6c\\x71\\x30\\xc8\\x99\\x41\\x3f\\x1b\\x86\\x0c\\x17\\x89\\x2c\\x8a\\x79\\x9e\\x0c\\x72\\xd0\\xdd\\xf7\\x4f\\x7a\\x5d\\x31\\x83\\x62\\xad\\x10\\x62\\x3e\\xe1\\xcc\\xa3\\xa9\\xee\\x47\\x88\\x00\\x55\\x0a\\x15\\xea\\x8d\\xdc\\xd6\\x81\\x79\\xb8\\x46\\x25\\x1a\\xe7\\x66\\xcf\\x21\\x4e\\x21\\x4e\\x6f\\x30\\x3c\\xce\\xc0\\xbb\\x1f\\xf5\\xae\\x5e\\x33\\xeb\\x91\\xbe\\x30\\x5c\\x8a\\xaa\\x2f\\xb1\\xc2\\x99\\x94\\x46\\xf4\\x66\\x4d\\xa3\\x91\\x88\\xc6\\x59\\x6b\\x6e\\x0e\\x77\\xdd\\xa7\\x66\\x66\\x62\\x21\\xf2\\x46\\x4a\\x8c\\x9a\\x54\\x7e\\xd4\\x62\\x3c\\x7c\\xfa\\x74\\x3e\\x4b\\x4a\\x21\\x73\\x6e\\x98\\x10\\xa1\\xe8\\x09\\x67\\xc8\\xf1\\xd3\\x7a\\x03\\xae\\xbe\\x9b\\x19\\x52\\x82\\xe2\\x22\\x53\\x90\\x23\\x0c\\x2a\\xfd\\xe8\\x3f\\x49\\x13\\x9a\\x19\\x64\\x4c\\x23\\x3a\\x22\\x5c\\xaf\\xc3\\x28\\x23\\x69\\x85\\xb9\\x9e\\xfe\\x11\\xae\\xca\\xd0\\x86\\xd4\\xeb\\xdd\\xc4\\x2a\\x1f\\xb9\\xef\\x75\\x48\\x74\\xb4\\x60\\x09\\xde\\x64\\xa1\\xce\\xb5\\x8b\\xfa\\x97\\xce\\x5b\\xae\\xf9\\x8a\\x7f\\xb2\\x74\\x15\\x3b\\x10\\x8e\\xec\\xf0\\x4c\\x0e\\x70\\x53\\xfc\\x32\\xcd\\xd3\\xf1\\x88\\xc0\\x72\\xc3\\x03\\x31\\x03\\xba\\x89\\x11\\x1f\\x39\\xc0\\x72\\x08\\x8f\\x3b\\xa6\\x9c\\x31\\x24\\xb9\\x05\\xae\\xf1\\xa0\\x06\\xd1\\x0f\\xa7\\x83\\xc7\\x1e\\x32\\x77\\x70\\x27\\x3c\\x61\\xbd\\xad\\xcb\\x23\\x0c\\x9c\\x8d\\xeb\\x4c\\x03\\xa6\\x42\\x4e\\x62\\x05\\xe1\\x8e\\x19\\x34\\x23\\x39\\x59\\xb4\\x8a\\xb2\\x93\\xc2\\xfd\\x2b\\xf3\\x58\\x74\\x54\\x57\\x55\\x1c\\xca\\x46\\xbe\\x40\\x20\\xb2\\x85\\x12\\x62\\x0b\\x1c\\xf6\\xfc\\x1d\\xa0\\x9a\\xbc\\x7f\\x64\\xd6\\x0e\\x60\\x61\\xa0\\xf7\\x8c\\xf2\\x1b\\x52\\x6a\\x59\\xa0\\x2a\\x8c\\xd2\\x8b\\xe5\\xf7\\xfd\\x7c\\x63\\x4c\\x9e\\xbf\\x68\\xea\\x4b\\xfa\\x11\\x63\\x43\\x9a\\xfd\\xb3\\xdf\\x07\\xf4\\x0a\\xf7\\xa5\\x43\\x7d\\x8f\\xe0\\x48\\x2d\\x15\\xb0\\xb9\\x4d\\xd0\\x1e\\x1d\\x34\\xa9\\x4a\\x9c\\x58\\x3c\\x34\\x35\\x04\\x03\\x3d\\xc1\\x4b\\x36\\xce\\x6d\\xe9\\xaf\\x3d\\x4d\\x2e\\x4c\\x3e\\x5a\\xac\\x4a\\x75\\x87\\x45\\x3e\\x33\\x4b\\x6d\\x50\\x0d\\xc0\\x0d\\x10\\xfa\\x30\\x36\\x4b\\x1e\\xab\\xa9\\xf4\\x9d\\x8d\\xc7\\x59\\x7a\\x2a\\xac\\xd1\\x28\\xc6\\x1b\\xac\\x38\\x71\\x65\\x1e\\xa8\\x9a\\xeb\\xf8\\xf2\\x5a\\xe2\\xd7\\x60\\x54\\xf4\\xca\\x94\\xdf\\xa6\\xa6\\x7c\\x6b\\x28\\xdd\\x08\\xaa\\xfa\\x06\\x2a\\x53\\x66\\xd5\\x80\\x4e\\xd2\\xa5\\x4f\\x57\\x7f\\x91\\xf5\\x82\\x52\\xf5\\x74\\xc0\\xa9\\x82\\x1c\\xf3\\x8c\\x76\\xa7\\xc8\\x2a\\xf4\\x41\\x09\\x42\\x5a\\xf5\\x99\\xa8\\xff\\xac\\x51\\x14\\xc2\\xdf\\xa6\\x22\\x29\\x21\\xf6\\x1f\\x0d\\x27\\xff\\x1a\\xd0\\xae\\x97\\xd4\\x67\\x53\\x43\\x70\\x4e\\x8e\\xb0\\xad\\xd2\\x7a\\x98\\xdf\\x6d\\x10\\xe8\\x34\\xdc\\xf4\\x0b\\x7a\\x77\\x43\\x10\\x6c\\xd4\\xed\\x87\\x86\\x42\\xf0\\x3e\\x35\\xd1\\xcd\\xda\\x70\\x9c\\x59\\x6a\\xa6\\x48\\xc4\\xa2\\x77\\x9f\\x4d\\xf3\\xc8\\xfa\\x3a\\xdb\\xdf\\xce\\x9b\\xc2\\xe3\\x7b\\x9d\\x74\\xf4\\x08\\xb3\\xf1\\xb8\\x2f\\x17\\x04\\x1a\\x4a\\x23\\xec\\x70\\x39\\x3c\\x3f\\xb8\\x79\\xad\\x27\\x1b\\xcd\\x7c\\x56\\xc4\\x32\\xd0\\x0f\\x66\\x4d\\xfb\\x59\\xae\\x2c\\x3d\\xb4\\xc8\\xe0\\xfe\\xd5\\x77\\x90\\x80\\x6a\\x8b\\xf7\\xb7\\x94\\x45\\x96\\x33\\x24\\xa3\\x9a\\xfd\\x23\\x49\\x16\\x38\\x09\\xe1\\x95\\x56\\xf2\\x57\\xed\\x10\\xa4\\x7c\\x4f\\x9d\\x52\\xc7\\x2f\\x11\\xac\\x02\\xfb\\xb2\\xb3\\x56\\x89\\xc7\\x56\\x3f\\x43\\x1b\\x1c\\x3d\\xa6\\xce\\x5f\\x5d\\x0c\\xb7\\xd6\\x64\\x97\\x2b\\x25\\xa5\\xc5\\x65\\x75\\x2d\\xdc\\x5b\\x9b\\xe7\\xd3\\x86\\xc0\\xba\\x93\\xf3\\x63\\xc7\\x13\\x33\\x10\\x02\\xbd\\x59\\xf4\\xc5\\x9a\\xfe\\x89\\xcd\\xcc\\xff\\x6d\\x27\\x48\\x72\\xdb\\x7b\\x5b\\x92\\x4d\\xeb\\xfb\\x2d\\x75\\xa3\\xf1\\xfe\\x82\\xae\\xa4\\x3b\\xa6\\xa7\\xf7\\xd9\\xce\\xe3\\x3d\\x07\\x9b\\x40\\x4f\\x9a\\x5c\\x4f\\x5a\\xe5\\xdf\\xae\\x65\\x10\\x0a\\x41\\x57\\x26\\xd2\\x00\\xac\\x3f\\x96\\x3e\\x83\\x45\\x86\\x11\\x5e\\xb0\\x21\\x65\\x3d\\xd4\\x38\\x47\\x30\\x82\\x5d\\xa5\\xc6\\xbf\\xe3\\x2e\\x70\\x47\\x01\\xab\\x21\\x4b\\x07\\x1c\\x71\\x52\\xd0\\x37\\xb7\\x28\\xc5\\xe4\\x47\\x3b\\x2a\\xd6\\xa1\\xab\\xac\\x89\\x3c\\x73\\x74\\xe7\\xab\\x1e\\xc7\\xe2\\xca\\xce\\xc2\\x3c\\xdf\\x53\\x1e\\xc3\\x9e\\x25\\xa0\\xc9\\xcd\\xc5\\x67\\xff\\x56\\x63\\x8a\\x16\\x8b\\xc4\\x3f\\x9d\\x0c\\xf3\\x0c\\x73\\x57\\xfc\\xb7\\x37\\xbe\\x0f\\x1d\\x40\\xd1\\x3c\\x66\\x3a\\x5f\\xeb\\xa2\\x67\\xf8\\x92\\x63\\x35\\xf8\\x1f\\x17\\xcc\\xa1\\xe0\\xb5\\x3d\\x14\\xee\\xbf\\xaf\\x29\\xda\\x7f\\x51\\xc3\\x62\\xae\\xc8\\x1d\\x7c\\xa1\\x8f\\x7e\\x4a\\xeb\\xe8\\x50\\x6a\\x3e\\x90\\x5e\\x48\\xee\\x23\\x8c\\xdc\\x84\\x35\\xb2\\x08\\xab\\xad\\xeb\\x10\\xf3\\x47\\x33\\xa9\\x51\\x6b\\x8b\\x83\\x68\\x28\\x0c\\x4c\\x2d\\xa9\\xfe\\x14\\x41\\x07\\x9b\\x05\\xf0\\x3c\\xe7\\x17\\x37\\x9b\\x32\\x70\\x7b\\x14\\xb4\\x51\\x37\\xb6\\x50\\xf6\\x96\\xd0\\x0f\\x70\\x37\\x6e\\xef\\x1c\\xb1\\x19\\x65\\xee\\x5e\\x5f\\x4a\\xd0\\xec\\xa8\\x54\\x55\\x58\\x38\\xd7\\xdc\\x32\\xbd\\xf6\\xbd\\x69\\x2f\\xfd\\x4a\\x26\\x73\\x8d\\xe5\\x60\\x88\\x45\\xe0\\x20\\xec\\x42\\xfa\\x55\\xce\\x47\\x47\\x2b\\x15\\x12\\x80\\x0c\\xda\\x68\\x6d\\x09\\xda\\x29\\x67\\x2c\\xc9\\xde\\x09\\xe7\\x99\\xc7\\xda\\x05\\x5d\\x21\\xe4\\x60\\xf8\\x90\\x66\\x61\\x32\\x9f\\xb1\\xbf\\xb8\\xf3\\x8e\\xfa\\x4c\\xa0\\xe5\\x84\\x62\\x1c\\x7a\\x80\\x58\\x86\\x39\\x72\\x6c\\xbb\\xf1\\xaa\\x32\\x0c\\x8d\\x66\\xde\\x1b\\x62\\xd5\\x74\\xeb\\x3e\\xfa\\xd0\\x12\\x02\\xed\\x69\\x1d\\x65\\x44\\x1a\\xbf\\xa1\\x6a\\xc9\\xc7\\x36\\x4e\\x7b\\x08\\xd2\\xd1\\x67\\xed\\x09\\x38\\xea\\xd8\\x6b\\xbb\\x0c\\x95\\x32\\xbe\\xc6\\x61\\xc6\\xa5\\x44\\xe0\\xa5\\x76\\xe2\\x70\\x31\\xcc\\x51\\x5d\\xb8\\xeb\\xa6\\xe1\\x06\\x5d\\x20\\x36\\x54\\x46\\x5b\\x61\\xe9\\xd3\\xc4\\x30\\xb2\\x9d\\xa2\\x28\\x54\\x9a\\xb9\\x58\\xa0\\x4d\\xcf\\xd4\\x24\\x1c\\xca\\x4e\\x49\\x79\\x34\\xc7\\x8c\\xb1\\xe2\\x2a\\x95\\x1f\\x75\\xb4\\x08\\x17\\xe6\\x1b\\x57\\x46\\xdf\\xff\\x54\\x35\\xee\\x59\\xa9\\x2f\\xdf\\xd0\\xda\\xb4\\xbb\\xbf\\xe7\\xe4\\x46\\x5d\\x25\\x8f\\x0f\\x13\\x8b\\xec\\x6e\\xf1\\x60\\x3e\\x35\\x0d\\x59\\xc7\\x9c\\x18\\xd3\\xfa\\x7e\\x76\\xaf\\x64\\xbb\\xd6\\x72\\x3d\\x6d\\xcc\\xb7\\x9a\\x65\\xae\\xe7\\xd8\\xd4\\x91\\x25\\xae\\xe4\\x8d\\xe6\\x27\\x9f\\x27\\x95\\x78\\xcd\\x3e\\x58\\xb9\\x5c\\x9a\\xb9\\x18\\x2d\\x8b\\xb7\\x6b\\x50\\x33\\x8a\\x6e\\x7b\\xb4\\xcf\\x5b\\xd6\\x43\\x68\\xb9\\x58\\x5f\\xd4\\x44\\x6f\\xab\\x6a\\x65\\x69\\x4a\\xbd\\xd9\\x03\\xde\\xee\\xe3\\xce\\x8c\\x27\\x64\\xab\\x2b\\xaf\\xa1\\xb0\\x8f\\x50\\x84\\xc8\\xd8\\xd3\\xe5\\x64\\x2a\\x01\\x20\\x04\\x62\\x0e\\x39\\x8b\\x5d\\x32\\x30\\x35\\x1b\\x82\\x5a\\x7f\\x79\\xad\\xf7\\xe6\\xe3\\x05\\x4d\\xd6\\xf2\\xe3\\xee\\x36\\x40\\xcc\\x92\\x4d\\xbe\\x04\\x28\\x0c\\x30\\x04\\x90\\x22\\x8e\\xa7\\x73\\x0a\\xfc\\xd6\\xb8\\x90\\x78\\x4f\\x21\\x29\\xf0\\x04\\x67\\x39\\x86\\x21\\x30\\xab\\xf0\\xdd\\x34\\x15\\x97\\xc5\\xa5\\xc6\\x54\\xbd\\x23\\xe5\\x25\\x69\\xef\\xfd\\x7e\\x1b\\xfc\\x83\\x0d\\x77\\x35\\x1b\\x9e\\xfa\\xe4\\xfe\\x95\\x18\\x9d\\x95\\xfe\\x92\\xda\\xbc\\x66\\xe6\\x7a\\x78\\xcc\\x7f\\x47\\x8a\\xd2\\x5d\\xbe\\x26\\x67\\xfc\\xd6\\x54\\x73\\xd9\\x8f\\xe3\\x6d\\x7e\\xe8\\x7c\\x77\\xc4\\x79\\x7a\\xc0\\x5c\\xbd\\x33\\x27\\x85\\x6a\\xd0\\x2c\\x2d\\xa7\\xe2\\xb9\\x31\\x22\\xcb\\x5b\\x33\\x56\\xd0\\x70\\x14\\x89\\xc5\\x5f\\x38\\xc6\\x20\\xbd\\x78\\x11\\x95\\x05\\x01\\x22\\xd7\\x08\\x49\\x67\\x8a\\x39\\xc4\\xae\\x40\\x1d\\xfa\\x25\\x9f\\x48\\x10\\x04\\x1e\\xda\\xad\\xaa\\xd3\\x42\\xb4\\xa6\\x63\\x88\\x5b\\x7f\\x2f\\xe5\\x20\\x58\\xcf\\x6e\\xa9\\x8d\\x7f\\xab\\x12\\xd2\\x37\\x3e\\x20\\xbe\\x05\\x55\\x69\\x23\\x0b\\xab\\x9f\\x22\\xca\\x45\\x5f\\x74\\xb0\\x01\\x8d\\x32\\xad\\xb2\\xbc\\xfa\\xb6\\xc3\\xf1\\xf9\\x10\\x82\\x27\\x23\\x70\\xaf\\x7b\\xde\\x6a\\x73\\xfd\\xa6\\xfa\\x35\\x34\\x6b\\x92\\x06\\xb4\\xe1\\xc5\\x47\\x49\\x0c\\xc2\\xde\\x09\\x8a\\x39\\x64\\x32\\x23\\x7e\\xca\\xb1\\x06\\x96\\x9f\\xfc\\xe0\\x51\\xb8\\x52\\xf0\\x4b\\xfe\\xd0\\xea\\x70\\x09\\x4c\\xfe\\x34\\x4c\\xe1\\xc3\\x07\\xba\\xd5\\x30\\x2e\\x67\\xbb\\x2d\\xf0\\x45\\x3b\\x5e\\x21\\xee\\x22\\xe5\\xcb\\x66\\x68\\x8a\\xbb\\x22\\x19\\x78\\xb6\\xd5\\x5b\\x2f\\x37\\xc6\\x8a\\xb9\\xfa\\x1d\\x67\\x7a\\x55\\xaf\\xfa\\x34\\x18\\xcf\\x29\\x71\\xbb\\x27\\x57\\xea\\xfa\\xec\\x82\\x29\\x7d\\xa2\\xc7\\xe7\\x11\\x12\\x62\\x07\\x15\\x4e\\x6e\\x72\\x09\\x44\\x0f\\x90\\x1a\\x2f\\x8b\\xb9\\xdf\\x9d\\x48\\x96\\x58\\xa6\\xb6\\x0b\\x76\\x31\\xa7\\xee\\xcd\\x3f\\x8a\\x48\\xa5\\x1e\\x3f\\xe7\\x33\\x7f\\x7d\\x7f\\x20\\x77\\x43\\xc3\\x27\\xd8\\x9b\\x65\\x06\\xcd\\x73\\x4f\\xab\\x17\\x64\\x39\\x16\\x1f\\xef\\x2c\\xb4\\x0a\\x57\\xb0\\xef\\xda\\x5b\\xec\\x1b\\x97\\x41\\xb1\\xcd\\xfa\\x63\\x8d\\xdb\\x38\\x0a\\xfd\\x8d\\xdb\\x42\\xd1\\x90\\x0a\\x5e\\xe9\\xda\\x25\\xae\\xe7\\xcc\\xee\\xfb\\x27\\xce\\x0b\\x93\\xca\\x24\\x6b\\x5a\\x66\\x7b\\xc5\\x9f\\xe6\\xc3\\xb2\\x69\\x6b\\xd4\\x8b\\xc7\\xd6\\x59\\x8b\\xe3\\x98\\x47\\x8a\\xec\\x89\\x23\\x41\\x8c\\xe1\\xf0\\xa4\\xb8\\x26\\x2c\\x30\\x29\\x67\\x08\\x2e\\x2b\\x14\\xd2\\x93\\x74\\x9c\\xef\\x52\\x0c\\x39\\x03\\x13\\xde\\x93\\x37\\x70\\x62\\xd2\\x75\\x79\\xbc\\x96\\x2f\\xff\\x51\\x36\\x0b\\x94\\x23\\x52\\x93\\x2a\\xc6\\xce\\xbd\\x97\\xaf\\xb6\\xfc\\x6e\\xbb\\x22\\x04\\x73\\xbe\\xfe\\x9c\\x96\\xfa\\x6e\\x48\\xe3\\x94\\xf2\\xa2\\xde\\x01\\x9d\\xcc\\x67\\xfe\\x63\\x9b\\x76\\xb2\\x51\\x4f\\xa7\\x65\\x2e\\x4b\\x81\\xa8\\x35\\x35\\xc0\\x82\\xbd\\x19\\x1a\\xd0\\x21\\x2f\\x20\\xe6\\x4d\\x03\\x66\\xba\\xa4\\xe5\\x25\\xe5\\xa6\\xaf\\xf8\\x71\\x44\\x9c\\xa7\\xe7\\xfd\\x16\\x7f\\x4e\\x15\\x9d\\x88\\xbf\\x30\\xad\\xed\\x0d\\xda\\x11\\x44\\x30\\xae\\xac\\x2d\\xf0\\xfa\\xeb\\x7c\\x01\\xbb\\x1c\\xe5\\x51\\x39\\xd0\\xd3\\x05\\x66\\xf7\\x58\\xc9\\xa0\\x12\\x14\\x11\\x38\\x3a\\x6a\\xc8\\xde\\xb8\\x77\\x62\\xff\\x17\\x40\\xd7\\x4f\\xd2\\x9c\\xd2\\xd5\\xa5\\x62\\x9f\\x6f\\xec\\x6e\\x34\\x02\\xa2\\x61\\xa2\\x9c\\x44\\x4c\\x8c\\x1f\\x22\\x00\\xf1\\x27\\x0c\\x22\\x45\\x76\\xf2\\x98\\x2a\\x58\\x88\\x78\\x59\\x88\\xe7\\x24\\x44\\x6c\\x4d\\xae\\x1b\\x63\\x5d\\x08\\x79\\x3e\\xd3\\x12\\x0e\\xa8\\x55\\xf9\\xa7\\xc5\\x5a\\xfe\\x00\\xe1\\x65\\xa7\\xd8\\x72\\xa1\\x55\\x49\\x37\\xc1\\xec\\x49\\x24\\x79\\xba\\xc2\\x56\\x6b\\x6d\\xca\\x2e\\x00\\x95\\x87\\x35\\x7d\\xbb\\xdb\\xd1\\xd1\\x6b\\x93\\x2b\\x55\\x76\\x7b\\xa7\\xb5\\x7c\\x90\\xf4\\x6a\\x1a\\x44\\x1a\\xdf\\x04\\x1f\\x3c\\x03\\xf5\\xe4\\xb8\\xc2\\xbd\\xd9\\xa0\\x80\\x66\\x40\\x24\\x4b\\xbf\\xc7\\xae\\xc0\\x03\\xed\\xa3\\x4d\\x23\\x8f\\xbc\\xd2\\x84\\xa5\\xa6\\x51\\x63\\x6a\\x43\\xf3\\x1c\\x8d\\x7e\\x87\\xf3\\x99\\x41\\x81\\xc2\\xf8\\x36\\xe1\\x7e\\x45\\x25\\xd7\\x44\\x25\\xcc\\x5a\\x89\\xab\\x39\\x1b\\x39\\xe6\\xe1\\x5c\\x88\\xe4\\xc1\\x26\\x0e\\x32\\x38\\xae\\x79\\x62\\x28\\x65\\xb1\\x8b\\x1d\\x86\\x17\\x23\\x35\\x0b\\x47\\x20\\x5d\\x6a\\x7d\\x33\\x80\\x36\\x51\\x15\\xe4\\x5e\\x88\\x45\\x90\\x0a\\xa5\\x9b\\x56\\xa8\\x9b\\xb2\\x87\\x08\\x1e\\x03\\xca\\x20\\xad\\x4b\\xbd\\x6e\\x2d\\xcc\\xac\\x3b\\xe6\\x18\\x6d\\x25\\x23\\x1d\\x39\\x8a\\x35\\xad\\x08\\x99\\x09\\xec\\x0b\\xd9\\xaa\\xc2\\xee\\x44\\x68\\x0d\\x3c\\x30\\x2d\\x7d\\x8b\\x4c\\x05\\x2f\\xd3\\xe9\\xa0\\x68\\x35\\xc6\\xd9\\x85\\x10\\xfb\\xfb\\x6a\\x38\\xb1\\xf6\\xc9\\x69\\x60\\xf8\\x40\\x47\\x96\\xd5\\x2a\\x20\\x52\\x39\\x75\\xc7\\xa3\\xaf\\xe9\\x2b\\xa1\\xf9\\x66\\x06\\x3e\\xa3\\xc4\\xf9\\x26\\x08\\x85\\xc7\\xc3\\xe2\\x5e\\x42\\x99\\x69\\x93\\xc2\\xf3\\xe0\\xbc\\x34\\x85\\x76\\x91\\x44\\x81\\x71\\x38\\xc3\\x96\\x05\\x5b\\x52\\x10\\xc3\\x34\\x29\\xd8\\x40\\xa1\\xc9\\x70\\xfb\\xd0\\xa0\\x7a\\x30\\xe1\\xe3\\x46\\x45\\xbb\\xa7\\x79\\x38\\xed\\x3a\\xfc\\xec\\x6e\\xbd\\x12\\x65\\x59\\xf5\\xdc\\xfb\\x00\\x98\\x03\\x24\\x98\\x79\\xfe\\xaf\\xa4\\xc8\\x4f\\x50\\x11\\x0b\\xf0\\x67\\x90\\xcc\\x57\\xc7\\x47\\x85\\xd1\\x6b\\xa9\\x2b\\xe2\\x07\\x0f\\xf4\\x13\\x97\\xf8\\x59\\x6b\\x62\\x85\\x75\\x26\\xd0\\x37\\xb0\\x38\\x2f\\xe4\\xd3\\x22\\xa9\\xbb\\x73\\xb4\\x4f\\xf8\\xa2\\x97\\x20\\xfe\\x59\\xa8\\x20\\x63\\xfd\\x40\\x0e\\x10\\x34\\x99\\x98\\x50\\xca\\xbf\\x7f\\xfd\\x7e\\xff\\xf8\\x15\\x81\\x21\\x53\\xfb\\x9d\\xb3\\x00\\xeb\\xf6\\xe5\\xcc\\x73\\x53\\x39\\x00\\xe8\\x8a\\x7b\\x6b\\x29\\x59\\xfb\\x1e\\x19\\xfe\\x47\\x2b\\x05\\x28\\x1f\\x19\\xf6\\x79\\x99\\x88\\x23\\x8b\\xa7\\x6c\\x5e\\x9a\\xf0\\xfa\\xcd\\x42\\x72\\xdd\\x2f\\xac\\xb9\\xca\\x42\\x47\\x2b\\xb0\\x99\\x3c\\xa0\\x7a\\x4e\\xce\\x6d\\x4b\\x7a\\x75\\x1b\\x4e\\xbb\\xcb\\xe2\\xca\\x3d\\x38\\x45\\x8a\\xd3\\x73\\x6d\\x58\\x8c\\x6c\\x9e\\x02\\x38\\x59\\x9e\\xef\\xa0\\x2a\\xc6\\x4c\\xa5\\x6a\\x2d\\x2f\\x09\\x8c\\xf3\\x71\\x6c\\x4d\\x8d\\xc7\\x8e\\xea\\x5d\\x69\\x75\\x5c\\x8d\\xfb\\xc3\\x4b\\x97\\xb0\\x84\\xe1\\x00\\x26\\xc7\\x7b\\xb9\\xf1\\xb5\\xb7\\xe8\\xbf\\x11\\x6a\\x54\\xf9\\xea\\x2d\\x52\\x73\\xe7\\xc0\\xde\\x59\\xee\\xa1\\xee\\xb9\\xd0\\x72\\x58\\xd0\\xb9\\x49\\x48\\xd4\\x77\\x74\\x77\\x6d\\x1a\\x57\\xc9\\xc3\\xee\\xd4\\x35\\xf4\\x90\\x64\\xef\\x88\\xe8\\x5a\\xf4\\x3b\\xaa\\xc5\\xc0\\x88\\xe5\\x61\\xcb\\x47\\x63\\x73\\x4e\\xfd\\x16\\xda\\x87\\x34\\x6a\\xc3\\x16\\xe5\\xe4\\xe6\\xfd\\x8d\\x46\\x56\\x34\\x67\\xe3\\x64\\x99\\xb8\\x33\\xb8\\xa0\\xc3\\xf9\\x69\\x87\\x3a\\xa6\\xbb\\x09\\x91\\xd8\\xcc\\x85\\x74\\x8a\\xec\\x98\\xf5\\x6e\\xe0\\x86\\x51\\x34\\x8d\\x55\\x47\\xca\\x9a\\xdf\\x64\\x89\\xba\\xa7\\xb3\\xa1\\xb5\\xe2\\x34\\xd6\\x08\\xa0\\xd3\\x1a\\xb5\\xd2\\xab\\xf3\\xa2\\xd9\\xcb\\x6c\\xfa\\x20\\xca\\xf0\\x06\\xb3\\x7a\\xa3\\x27\\xff\\x32\\xb9\\x5d\\x7f\\x41\\x77\\x75\\x2f\\x73\\xf5\\xc8\\xbf\\x51\\x70\\x99\\xbf\\x51\\x70\\x5d\\xbc\\x8c\\xd4\\x70\\x51\\x2f\\x72\\xe7\\xab\\xaa\\xf2\\x84\\xcc\\xf2\\x00\\x93\\x4c\\x46\\x70\\x6a\\x73\\xf7\\xfb\\x12\\xf9\\xfe\\x01\\xad\\x49\\x75\\x9a\\xb4\\xe3\\x3a\\x0b\\xff\\xf8\\x69\\x12\\xe7\\x66\\x4a\\x05\\xc4\\x88\\xd1\\x69\\x6f\\xce\\x71\\x90\\xbb\\x23\\x1a\\x59\\x53\\xcc\\x76\\xae\\x27\\x36\\x90\\x57\\xd4\\x1e\\x4f\\x7f\\x4d\\x6c\\x6e\\x6f\\x9a\\x16\\xc2\\xcb\\xd9\\x68\\xaa\\xad\\xc1\\x06\\x5f\\x9a\\xdb\\x56\\xb2\\x34\\x3c\\x4c\\x78\\x06\\xc3\\x2b\\x10\\xe7\\x59\\xe4\\x09\\xe4\\x8c\\xa1\\x76\\xfe\\x3d\\x92\\x88\\x17\\xe0\\x17\\xb1\\xc3\\xca\\x31\\xd3\\x28\\x39\\x16\\x85\\x6d\\xee\\x0f\\xe8\\x9d\\xf3\\xec\\x94\\xa8\\xfa\\x21\\xe4\\x94\\xa8\\x8a\\x8d\\xfa\\x59\\xfb\\xaa\\x87\\xe1\\xc5\\xa4\\x3d\\x5e\\xb0\\x8f\\x3f\\x62\\xcf\\x14\\x1e\\xa2\\xce\\x0e\\x46\\xda\\xd7\\xab\\x02\\xcf\\x8c\\x14\\xe2\\xa8\\x7a\\xa0\\xee\\x59\\x4d\\x1d\\xcd\\x0b\\xe0\\x6f\\xbf\\x21\\xf9\\x8e\\x84\\xf2\\x31\\xe3\\x93\\xc6\\x32\\x7e\\xa9\\x85\\x70\\x35\\xde\\xe9\\x35\\x8d\\x0d\\x47\\x64\\xb5\\xa9\\x85\\xf8\\xfa\\xeb\\x6a\\xd6\\x99\\x1e\\x24\\xad\\x71\\x84\\xa3\\x49\\x34\\x0e\\x5f\\x47\\x8e\\x98\\x70\\x90\\x07\\xab\\x39\\xac\\x68\\x1f\\xe4\\x00\\x58\\x01\\xe0\\x07\\x7f\\x5f\\x3c\\xb6\\x96\\xc3\\x69\\x30\\x1f\\x96\\x5a\\x97\\xfe\\x44\\xd9\\x21\\xaa\\x45\\x12\\x83\\x69\\x11\\xea\\xb7\\x60\\xb2\\x4c\\x2d\\xc4\\x4c\\xde\\xee\\xee\\x79\\x88\\x52\\x32\\x13\\x68\\xda\\x47\\x1d\\xed\\x34\\xdb\\x9f\\xda\\x5d\\x2c\\x94\\xe0\\x84\\x52\\x65\\xe2\\xd5\\xb2\\x7f\\xd0\\x11\\x48\\x4b\\x19\\x3d\\xc0\\x10\\x67\\x47\\xab\\x6c\\xb4\\xbe\\xd7\\x67\\xaa\\x50\\xec\\x32\\xd7\\xb3\\x4e\\x82\\xf4\\x07\\xc6\\x2e\\x4a\\xd0\\x52\\xb7\\x8e\\x34\\x29\\xc6\\x4e\\x6a\\x44\\xbe\\x6a\\x37\\x29\\x7d\\x65\\x5c\\x3b\\x7f\\x66\\xd0\\x6f\\xb7\\xdb\\x3f\\x85\\x80\\xe2\\xcd\\xa1\\x86\\xac\\x20\\xb5\\xd3\\xe7\\xb8\\x87\\xba\\x4b\\xd2\\x14\\x86\\xc8\\x73\\x29\\xdf\\x0c\\x9f\\x74\\xd8\\xb2\\x67\\x1e\\x6f\\x1e\\xa1\\x68\\x51\\x0e\\x36\\x9f\\xb7\\x05\\xbc\\xb2\\x4c\\x36\\x1b\\xbd\\xf3\\xd7\\xc1\\xc0\\x30\\x0f\\x8c\\x93\\x86\\xfd\\xa5\\xd6\\x90\\xae\\x55\\xc6\\x3b\\x3d\\x50\\xd7\\x81\\xb9\\x15\\x62\\x3e\\x9c\\xd1\\xa1\\xe6\\xf5\\x6c\\x61\\x1f\\xc7\\x12\\x5b\\x60\\x86\\x5d\\x21\\xcf\\x00\\xf1\\xd4\\x87\\x4c\\x0c\\xa2\\x6b\\x69\\xd3\\xc7\\x4b\\x25\\x39\\xad\\x5c\\x3e\\xf2\\x72\\x56\\xe0\\x91\\x97\\x49\\x70\\xb2\\x65\\x82\\x17\\xb3\\x17\\xfa\\x87\\x4e\\xf0\\xfd\\x0d\\x63\\x09\\xd5\\xa0\\xb6\\x36\\x94\\x9c\\xd1\\x16\\xcc\\xd9\\x33\\xfc\\x46\\xa9\\xba\\x70\\xef\\x3d\\x22\\x9b\\xfb\\x63\\xf7\\x18\\x89\\xe9\\x42\\xd1\\x8e\\xbe\\xed\\x56\\x5f\\x0c\\xaa\\x65\\x39\\x1c\\x7b\\x57\\x7e\\xff\\x13\\xec\\x7d\\xe7\\x00\\xe0\\x4b\\xd9\\xaf\\x56\\x97\\xb2\\xa2\\x4d\\xd9\\x67\\xed\\xb9\\xa0\\x57\\x38\\x1c\\x5e\\xf9\\x01\\x1a\\xa8\\x26\\xd7\\x88\\xa8\\x2e\\xee\\xf9\\xf1\\x0f\\x76\\xb4\\x03\\x15\\x27\\xa9\\x14\\xa7\\x60\\x0d\\x8b\\xb5\\xb9\\x8b\\x06\\x8b\\xd2\\x80\\x09\\x54\\xbb\\xf6\\x14\\xe3\\x10\\x56\\x4f\\xb9\\x1a\\x09\\xbd\\xcc\\xd6\\x68\\x33\\x85\\x34\\x4c\\x31\\x78\\xa5\\x52\\x2a\\x13\\x05\\x7e\\xb7\\xfa\\x3e\\x02\\xec\\xd7\\xe8\\x9d\\x4c\\xa5\\x54\\x51\\xca\\x6d\\xfe\\xd8\\xce\\xe8\\x5d\\x23\\x5b\\x81\\xcd\\xd3\\x5b\\x51\\x44\\xc4\\x0b\\x8c\\x91\\xd8\\x77\\x98\\xc5\\x2b\\x79\\x1d\\x6a\\x30\\x2a\\x6e\\x7c\\x34\\x17\\x5b\\xda\\xdc\\x72\\xdc\\xb8\\xac\\x15\\xd8\\xcb\\xd6\\xcf\\xcf\\x84\\xe9\\x7a\\xca\\x91\\xa1\\x55\\x56\\x7b\\xb4\\x4b\\x5e\\x62\\x61\\x9e\\xb1\\x5c\\x7a\\xf5\\xb7\\x79\\x0f\\x47\\x43\\x7c\\x5f\\xb2\\xd6\\x3e\\x7f\\x20\\x54\\x73\\xe7\\x3b\\xab\\x4d\\x4f\\x94\\x78\\x5b\\x6f\\x88\\x11\\x9b\\xf3\\x1a\\x47\\x62\\xd3\\x77\\x38\\xe3\\x54\\xbd\\x20\\x29\\xd3\\x9c\\xd4\\x1b\\x87\\x36\\x5a\\x05\\x9e\\x2a\\x59\\x55\\xaf\\xae\\xcf\\xcf\\x1b\\x14\\x48\\xab\\x24\\x0e\\x1c\\xfd\\xb5\\xf7\\xc4\\xd5\\x11\\x65\\x02\\xea\\x68\\x43\\x39\\x4e\\xef\\x14\\x32\\x34\\xd2\\x3d\\x81\\x86\\x5e\\x42\\x54\\x6d\\x76\\x54\\xb7\\x03\\x77\\x5b\\xcc\\x0f\\xce\\x9a\\xad\\x52\\xae\\x3d\\x4c\\x44\\x31\\x59\\x06\\x5d\\x77\\x85\\x8a\\x50\\xfb\\x3e\\x14\\xa3\\x52\\x8d\\x0b\\x30\\xa8\\x09\\x3f\\xe6\\x69\\xe3\\xde\\xae\\xf2\\xd5\\x1a\\xc5\\xb6\\x82\\x27\\x1f\\x57\\x15\\xb5\\x9f\\xaf\\x9f\\x96\\xe1\\xf8\\x7e\\x63\\x56\\x0f\\x8b\\x28\\x3a\\x21\\xbe\\x47\\x44\\x4b\\x17\\x28\\x65\\x83\\x24\\x15\\x6c\\x3e\\x72\\x2a\\xd2\\x43\\x82\\x77\\x47\\xa3\\x21\\xa1\\xa6\\x8d\\x3f\\x18\\xbc\\x37\\xdb\\xf9\\xc9\\x40\\x04\\xba\\xdd\\xb2\\x6d\\xc1\\xb4\\xfe\\xb4\\xdd\\xc0\\xe9\\xa0\\x40\\xc7\\x81\\xbb\\xee\\x36\\xef\\xdd\\x36\\x0a\\x59\\xed\\x1c\\x2c\\xbc\\x2f\\x31\\xde\\xdf\\x56\\xd5\\x2c\\xa0\\xd5\\xf1\\xa2\\x6b\\xfd\\x89\\xc2\\xe7\\x42\\xc4\\x8f\\x1c\\x4e\\x1d\\x79\\x21\\xd8\\x30\\x65\\xc0\\x81\\xf3\\x84\\xbf\\x8e\\x8e\\x19\\x46\\x99\\xc4\\x79\\xc1\\xdb\\x30\\x34\\x81\\x3b\\xf1\\x3e\\xc3\\xf1\\x6f\\x09\\xda\\xce\\x31\\x83\\xd9\\x3b\\xd4\\x7b\\x29\\x71\\xa9\\x22\\x07\\xea\\x63\\xbb\\x8d\\xf3\\x78\\xa8\\x2c\\x6f\\x30\\x59\\xd1\\xf1\\x15\\x1e\\xb5\\xa0\\x90\\x03\\x75\\x47\\x5f\\x65\\x38\\x7c\\x24\\x13\\x41\\x69\\x27\\x9a\\x79\\x10\\x09\\x97\\x2b\\x31\\x27\\x4a\\x4e\\xf4\\x60\\x8e\\xf9\\xae\\x97\\x4d\\xf1\\x57\\x29\\x13\\x87\\x2b\\xee\\x50\\xa9\\x2b\\x97\\x4f\\x64\\x92\\xf8\\x33\\xe3\\x60\\x22\\xb6\\x1f\\xaf\\xa1\\x58\\x8b\\xc5\\x20\\x9d\\x6a\\xa2\\x07\\x09\\xa5\\x60\\x34\\xe0\\xeb\\xdf\\x25\\xfb\\xa6\\x9b\\xf7\\x61\\xfb\\xfb\\x65\\xbb\\x0c\\x41\\xbe\\xdf\\xeb\\x5a\\x99\\x4b\\x88\\xf5\\x35\\x5f\\x30\\x5e\\x01\\xf3\\xed\\x62\\x71\\xa5\\x24\\x7a\\xbc\\x1f\\x4a\\x8d\\x57\\x0a\\x4a\\xc0\\x14\\x88\\x52\\xe4\\xf7\\x6e\\xd9\\xf9\\x9e\\x45\\x21\\x38\\x80\\x2f\\x1e\\x82\\x7a\\x33\\x5e\\x7a\\x0f\\xfc\\x47\\x2f\\x44\\x17\\xc4\\x22\\xef\\xd7\\x50\\x62\\xda\\xca\\x00\\x35\\xd1\\x97\\xec\\x3d\\x96\\xc7\\xd4\\xc6\\xc4\\x25\\xc2\\x55\\x61\\xb2\\x5c\\xb2\\xfc\\x92\\xc2\\x06\\x75\\x8e\\x62\\x28\\xf8\\x41\\x5e\\xc1\\x3f\\x42\\x9f\\x9f\\x77\\x5c\\x94\\x81\\x77\\x5b\\xc2\\x22\\x71\\xa4\\x2f\\x2c\\xf6\\xbc\\x4d\\xa5\\xea\\xcd\\xa7\\xed\\x85\\xfc\\x5d\\xc5\\x01\\xc6\\x54\\xa8\\xcd\\x19\\xcb\\x07\\x53\\xe7\\xd9\\xf4\\x4d\\xe7\\x1a\\x74\\x35\\x6d\\xbf\\x75\\x7f\\x0a\\xf2\\x6d\\x4d\\x71\\x0c\\x6d\\xdc\\x35\\xc6\\x66\\xe8\\x81\\x69\\x2a\\x86\\x7c\\x41\\x3b\\x50\\x28\\xe1\\xc1\\xc1\\x2d\\xf6\\x81\\x8d\\x2c\\x44\\xd5\\x96\\x44\\x61\\x31\\xfc\\x9f\\x82\\x49\\x4c\\xf9\\xca\\xc1\\xb9\\x7a\\xe9\\x92\\x1d\\x95\\x81\\x8c\\x1a\\x2d\\x0b\\x46\\x7a\\x4c\\x8d\\x7d\\x2a\\x18\\xe4\\x84\\xb8\\x6f\\x3c\\xc9\\x90\\xad\\xa7\\xcd\\x3c\\x55\\x71\\x82\\x9d\\x63\\x2c\\xdf\\x1a\\x32\\x53\\x5d\\x74\\x60\\xf0\\xfc\\x24\\x86\\x07\\xbf\\xcf\\xd7\\x0c\\x59\\x2e\\x6f\\xeb\\x4f\\x47\\xfc\\x41\\x8b\\x72\\x64\\x96\\xaf\\xa1\\x5c\\xd8\\x50\\x8c\\xd8\\x8a\\xb9\\xed\\xd3\\xf9\\x75\\x30\\x5a\\xf1\\x5a\\x85\\x3f\\x99\\x21\\xe1\\xb1\\x15\\xdd\\x5f\\x5b\\xce\\x96\\xab\\x06\\x8c\\x1c\\xdd\\x0e\\xa9\\x7d\\x78\\xb3\\xa6\\x48\\xfa\\x8b\\x14\\x4b\\xb4\\x03\\x34\\xf2\\xbf\\xe0\\x8a\\x15\\xfd\\x36\\x4f\\xc3\\xb4\\x2d\\x6a\\x73\\xa3\\x1b\\x9c\\xe0\\xf4\\x12\\xed\\x1d\\x12\\xe6\\xd1\\x74\\xca\\x66\\xae\\xcd\\xba\\x3d\\xc4\\xa7\\xb4\\x31\\x25\\xb2\\x61\\x51\\xf8\\x9a\\x03\\xb6\\x4c\\x6e\\x87\\xe8\\xaa\\x8a\\x82\\x6b\\x45\\xd2\\x08\\x55\\x74\\x6e\\x9b\\x99\\x87\\x17\\x6b\\x35\\x2d\\xfe\\xf4\\xd5\\x33\\x36\\x85\\xb9\\xe2\\xb4\\xcd\\xcc\\x0a\\xc9\\x54\\x86\\xb2\\xd1\\x1d\\x53\\x06\\x85\\xd3\\x60\\x5e\\xee\\x0a\\x4d\\xe1\\x58\\xe0\\x3d\\x98\\x63\\x50\\xfc\\x5a\\x59\\x58\\x63\\x06\\x76\\x7a\\x60\\xa5\\xb6\\x93\\x4b\\x35\\x16\\x10\\xad\\x0c\\x52\\x7d\\x63\\xff\\xf8\\x2f\\x2e\\xa9\\x6d\\x88\\x0a\\xf1\\xab\\x9d\\xe5\\xd3\\x32\\xd1\\xb3\\x7c\\x13\\x2e\\xc5\\x1d\\x49\\x4e\\x1d\\x8c\\x70\\xac\\x48\\x6e\\x73\\x23\\xd3\\xe6\\x89\\x1c\\x49\\x2e\\x1b\\x06\\xf1\\xbe\\xe0\\x79\\x9b\\x49\\x3d\\x66\\xe3\\xa1\\xd3\\x61\\xfd\\x9b\\x36\\xe3\\x61\\x33\\xa4\\xfa\\x8b\\x06\\xd3\\xa1\\x65\\x7a\\x47\\x34\\x81\\x09\\x83\\xa1\\xa9\\x86\\xbc\\xc8\\xa8\\x12\\xde\\x63\\xe4\\x74\\x0b\\x26\\x80\\x82\\x64\\x33\\xc4\\x29\\xb3\\xc3\\xf6\\xb0\\x33\\xed\\x9a\\x29\\xc6\\xe9\\x01\\x5c\\x4a\\x12\\x0f\\x50\\x56\\xa1\\x29\\x71\\xe7\\x38\\xc1\\x6d\\x4b\\x65\\x83\\x77\\x60\\xae\\x62\\xe5\\xcd\\x02\\xf6\\x83\\xd4\\x60\\xee\\xb1\\xba\\x11\\x92\\x58\\x1d\\x6a\\xdf\\x28\\x1a\\xf5\\xb4\\x71\\x63\\xb0\\x34\\xc4\\x07\\x8a\\x1a\\x7e\\x6c\\x2b\\xa8\\x22\\x15\\x44\\x87\\x33\\x2f\\x08\\x53\\xd4\\xca\\x49\\x33\\xb4\\xda\\x65\\x38\\x58\\x93\\xed\\x2e\\xe3\\xd3\\x8d\\x0d\\xa8\\x11\\xc5\\xa3\\xb9\\x6b\\x3d\\xcf\\xe1\\xb5\\xd1\\x3b\\xcd\\x77\\xe3\\xd9\\x9b\\x04\\xbd\\xe6\\xf7\\xd7\\xb4\\x38\\xb6\\x98\\x1a\\x4e\\xdf\\x27\\x06\\x93\\x25\\x38\\x21\\x21\\x36\\x6b\\x6b\\x0b\\xeb\\x2c\\x0d\\xd5\\xcd\\x96\\x93\\x72\\x12\\xcf\\x7e\\x52\\x53\\x84\\x22\\x50\\x2b\\xbc\\x17\\x6c\\xcd\\xce\\x64\\x9a\\xd1\\xbb\\x56\\x5d\\xd6\\xca\\xb7\\x3d\\xf1\\x98\\xd9\\x5b\\xdf\\x57\\x6c\\x29\\xb4\\x9f\\x23\\x8d\\x9d\\xbf\\xe7\\x3d\\xfb\\xc5\\x93\\xbd\\xf7\\x57\\x35\\xf5\\x9b\\xaf\\x2e\\x2e\\xb7\\x5c\\xf5\\x56\\xeb\\x78\\x9f\\x1d\\x9d\\x2f\\x3b\\xed\\x46\\xfd\\xfe\\xf5\\x49\\xbd\\xde\\xee\\x15\\x62\\x95\\x4e\\x1e\\xed\\xad\\xfc\\x38\\x66\\xd1\\xd1\\x56\\xe3\\xc6\\xab\\x31\\x55\\x33\\xba\\x5e\\x68\\x73\\x4f\\xe8\\xa8\\x06\\xf0\\xfe\\xd9\\x06\\x90\\x09\\xdb\\xb2\\xc9\\xd1\\x6b\\xfa\\x81\\x40\\xe4\\xfc\\x48\\xdc\\xfe\\xca\\xb1\\xfd\\x8a\\x4c\\xea\\xf1\\xab\\x1a\\x33\\x46\\xe1\\xfa\\x08\\xfe\\xfa\\x08\\xe7\\x6e\\x38\\x32\\x0a\\x64\\xfd\\x72\\xea\\xca\\x02\\xb6\\xfe\\x88\\x36\\xeb\\xf9\\x86\\xfd\\x4a\\x9b\\x6b\\xf6\\xcd\\xf5\\x2a\\x48\\x48\\x83\\x7a\\x23\\xd0\\x7a\\x21\\x92\\x0d\\x59\\x65\\x63\\x95\\xf6\\xfd\\x29\\x35\\x2e\\x29\\x68\\xfe\\x50\\x10\\x9f\\xd1\\x8b\\x35\\xcd\\x82\\x07\\x26\\x0a\\x68\\x02\\xc8\\x7f\\xa6\\x9f\\x1f\\x02\\xba\\x74\\x03\\x6d\\xf2\\xf9\\xb2\\x2c\\x7a\\xdf\\xa9\\x87\\x8f\\x77\\x4e\\xac\\x3c\\x8c\\x17\\x7f\\x7a\\xb8\\x54\\x7c\\xbf\\xb9\\x7e\\xf3\\xa2\\x8b\\x99\\x4e\\x0e\\x46\\xfc\\xc7\\x2e\\x25\\x22\\x67\\x8d\\x26\\x87\\xb3\\xbb\\x2d\\x33\\xe4\\xcf\\xfc\\x21\\xe6\\x66\\xe9\\x78\\x8a\\x30\\x0a\\x67\\x56\\xa4\\x6e\\x46\\x7e\\x66\\x32\\x7b\\x35\\xac\\x27\\x2e\\x70\\xc1\\x83\\x7b\\x0d\\xad\\xca\\xb5\\xad\\xd9\\x2a\\xfe\\xee\\xd7\\x44\\x0d\\x48\\x59\\x2d\\x11\\x59\\x80\\x3c\\x52\\x34\\x46\\x24\\xc8\\x59\\x38\\x64\\xcc\\x10\\xff\\x15\\x53\\xdf\\x3f\\x47\\xd4\\xf0\\xf8\\x86\\xf0\\xe5\\x8c\\x11\\xb1\\xf9\\xda\\xce\\x8d\\xc9\\x5f\\xc5\\xc8\\xdb\\x39\\xbc\\x55\\xf9\\x75\\x80\\xbd\\xae\\xd5\\xd5\\xf7\\xf4\\x45\\x4e\\x4e\\xa3\\x7d\\x12\\x4d\\x4a\\x93\\x80\\xf2\\x26\\xb5\\x63\\xa1\\x76\\x5a\\x44\\xdc\\x07\\x2d\\x2a\\xda\\xa9\\xce\\xa3\\x31\\x18\\xbb\\xb7\\xcf\\xba\\x48\\x90\\x71\\x9d\\x82\\x3c\\x92\\x5d\\x98\\xed\\x11\\x1e\\xd5\\xad\\xa2\\xfb\\x49\\x9b\\x32\\x2d\\x91\\x0d\\x0e\\x7b\\x98\\xba\\x56\\x22\\x92\\x39\\x00\\x6e\\xdf\\x70\\xd7\\x93\\x8f\\x0e\\xe9\\xb9\\xc4\\xb2\\x90\\x30\\xd3\\xf0\\x8f\\x95\\x9a\\x9e\\x4f\\x06\\x5e\\x06\\xdb\\xb5\\xc3\\xb7\\x36\\x97\\x51\\xd1\\x18\\x53\\x6e\\x4f\\x17\\xea\\x98\\x86\\xd3\\x8b\\xeb\\x4c\\x48\\xc6\\x6c\\x17\\x67\\x2a\\x35\\x2d\\x97\\xe5\\x77\\x5b\\x4e\\xd8\\x87\\xe6\\xec\\x81\\xb3\\x21\\x09\\xfe\\x11\\x1c\\xe7\\xf8\\x58\\x0a\\x94\\x85\\xc6\\xe8\\x8b\\xb6\\x1c\\xf6\\xef\\x82\\xcb\\x3c\\x26\\x99\\x34\\x75\\x10\\xb0\\x60\\x86\\x11\\x98\\x8f\\x62\\x2e\\x50\\xf7\\x2a\\x0c\\xae\\xf6\\x0b\\x31\\xde\\x7a\\x13\\xd4\\xf6\\xa0\\x7b\\x17\\x76\\x9a\\xea\\x5b\\x11\\x84\\xb7\\x7b\\x01\\x42\\x91\\x0c\\xe8\\xb7\\xc3\\xd5\\x56\\x6b\\xbe\\xf1\\xaa\\xb1\\x35\\x0c\\x6d\\x8c\\xe3\\x70\\x5b\\x3d\\xa6\\xa5\\x3d\\x77\\x53\\xa4\\x73\\xe4\\x17\\xae\\xd8\\x11\\x77\\xdd\\x40\\xd6\\x86\\x4b\\x3f\\x4e\\x79\\xa5\\x25\\xe8\\x8a\\x14\\xe9\\x96\\xc9\\x44\\x79\\xfc\\xc6\\x9b\\xe7\\x1d\\x21\\x82\\x07\\xe4\\x7e\\x29\\x5d\\xff\\x2b\\xb6\\x2b\\x53\\x48\\x3a\\xa2\\xcc\\x03\\x2b\\x1c\\x7e\\xd6\\x6c\\xd4\\x88\\xec\\x12\\x74\\x0d\\x7b\\x51\\xa6\\x4a\\x1b\\xbd\\x65\\xc2\\x2e\\xa1\\xc0\\x07\\xc1\\x7f\\xb7\\xcb\\x6e\\x0d\\x3e\\x9a\\x06\\x4b\\xfe\\xa3\\xac\\x2a\\xd0\\x5e\\x26\\x2f\\xec\\x62\\x7a\\xa5\\x36\\xaf\\x24\\x50\\x5e\\x86\\x77\\x3b\\x63\\x36\\x8c\\x69\\xe2\\x41\\x73\\x6a\\x3d\\xa5\\x44\\x88\\x5e\\xaa\\x92\\xf2\\x60\\xe3\\xf1\\x9e\\xd3\\x32\\xd3\\x5d\\x38\\x7e\\x74\\xb6\\x23\\xf3\\xf5\\x65\\x60\\x49\\xb5\\x5c\\xe3\\xf8\\x57\\x4d\\xb1\\xba\\xc0\\xe9\\xb3\\x26\\x5e\\xc8\\xe1\\x7c\\x66\\x65\\x25\\x5b\\x32\\x31\\x9c\\x94\\x8b\\x4b\\x13\\x1c\\x5c\\x23\\x4b\\xbc\\xd7\\x3e\\x6e\\xec\\x00\\xf2\\xd8\\x90\\xaa\\xc0\\x56\\x51\\x02\\x12\\x92\\x3e\\x5f\\x8c\\xb1\\xc8\\xaa\\x60\\x87\\x5d\\xe4\\x65\\x15\\x7b\\xf4\\x6c\\x66\\x9b\\x5d\\x44\\xb2\\x02\\x70\\xd9\\x6d\\xa8\\x24\\x60\\x8d\\xef\\xa9\\xf2\\x89\\xe9\\x85\\xea\\x0c\\x1a\\xdd\\x15\\xde\\x51\\x39\\xdb\\xad\\x5e\\xed\\xe7\\xb3\\xfd\\x4a\\x23\\xe3\\xc4\\xa3\\xf9\\x4d\\xb7\\xc1\\xee\\x7c\\xf5\\x7e\\xea\\xff\\xc3\\x57\\x8c\\x37\\x45\\x6c\\x1f\\x1f\\x31\\x48\\x73\\xdf\\x53\\x87\\x7f\\x86\\xb0\\xcf\\x86\\x21\\xf1\\x00\\x5b\\xa2\\x5f\\x38\\x37\\x20\\xf8\\x57\\xfe\\x76\\x57\\x1f\\xa2\\x5b\\x72\\xe9\\xd3\\x35\\xcd\\x4e\\xbf\\x25\\xbb\\xc8\\xf1\\x2d\\x0e\\xcd\\x55\\x7a\\x6e\\x7c\\xeb\\xde\\xfd\\x9b\\xeb\\x2e\\x7f\\xe1\\x1c\\x1d\\x5f\\xc0\\x96\\xa7\\x5f\\xc9\\x3c\\xee\\xa9\\x54\\xd8\\xc6\\x77\\xf2\\xa5\\x98\\x52\\xf1\\xe7\\x40\\xa7\\x51\\xbd\\x74\\x91\\x28\\x58\\xa0\\x72\\xd9\\xb2\\x44\\x86\\xc5\\xd7\\xb8\\xaa\\x9d\\x28\\x29\\xa6\\x48\\x24\\x1a\\x39\\x5c\\xa1\\xc9\\x71\\x31\\x67\\x2e\\xe0\\x99\\x76\\xbe\\xa6\\xa6\\x1f\\xb6\\x32\\x50\\x0d\\x86\\xf2\\xa8\\x21\\x97\\x00\\xaf\\xab\\x85\\xf9\\xc2\\xbc\\xd5\\x23\\x21\\x3c\\x68\\xa4\\xc4\\xff\\xd9\\xae\\x29\\xf8\\xdc\\xff\\xb9\\x49\\x3e\\x93\\xe2\\x6a\\xe0\\xc8\\x0f\\xa9\\x59\\xdc\\x0b\\x3f\\x89\\xd9\\x98\\x01\\x35\\x22\\x2c\\x18\\xe4\\xa4\\x62\\xd1\\x8b\\x19\\x71\\x39\\x58\\x5e\\xa1\\x50\\x82\\x5d\\x73\\x27\\xec\\x53\\xb6\\xe8\\xde\\x46\\xc0\\x9c\\xac\\x3f\\x34\\xb3\\x72\\xbd\\xff\\xed\\x40\\x03\\x81\\x6f\\x12\\x02\\x67\\x9f\\xa3\\xe0\\x54\\x00\\x94\\x6f\\xf6\\x8a\\x76\\x0f\\x5c\\xac\\x2e\\xaf\\x2b\\x73\\x46\\x4a\\x52\\xba\\x5b\\xc8\\xf6\\xa5\\xdc\\xfb\\x86\\x2e\\x59\\x84\\xcc\\xf5\\x8d\\xb8\\xa4\\x45\\x38\\x9b\\x16\\xb9\\x98\\xe3\\xac\\xa5\\xfd\\xd9\\x41\\x9e\\xb2\\xb0\\xfe\\x23\\x7a\\x72\\x15\\xb7\\xbb\\x67\\xab\\xc7\\xd2\\x5c\\xc0\\xda\\xfe\\x92\\x96\\x31\\x37\\xbf\\xee\\xe5\\xe2\\xa6\\xf4\\x4c\\x31\\xd6\\xcc\\xcb\\x23\\x7b\\xb3\\x42\\x1c\\xa2\\x0b\\x48\\xa8\\x90\\x69\\x70\\xce\\xa7\\x73\\xc3\\x44\\x49\\xd7\\xe5\\xbb\\x75\\x60\\x9b\\x7a\\xf1\\xc4\\x6c\\xac\\x5a\\xee\\x03\\x85\\x83\\xdc\\xe6\\x45\\x98\\xc8\\x29\\x96\\xe2\\xdf\\xaf\\x88\\x17\\xf4\\xd3\\x84\\xa4\\x3d\\x6c\\x79\\xa0\\x52\\xc4\\x41\\xb3\\x95\\x72\\x30\\x59\\x7a\\xb8\\x47\\xc3\\x84\\x9e\\xfe\\x1c\\xcf\\x2e\\xdf\\x7b\\x8a\\x19\\xb5\\x86\\x87\\xbb\\xf2\\xd8\\x2b\\x56\\x25\\x3d\\x23\\x01\\x13\\x82\\x22\\x94\\x45\\xea\\xdc\\xab\\x5f\\xa4\\x89\\x7b\\x29\\x28\\xb9\\xf9\\x04\\x90\\x02\\x1a\\x2a\\x00\\x46\\xaa\\x65\\x4f\\x4c\\xdd\\x0b\\x25\\x45\\x29\\xaa\\x85\\x03\\x5a\\x91\\x05\\xa8\\x48\\xf9\\x72\\xcc\\x9f\\xb0\\x53\\xc3\\xac\\x4e\\x5f\\x3e\\xf1\\xd0\\x22\\x2b\\xfb\\x78\\xc0\\x4d\\x95\\xb1\\xef\\x62\\xb2\\x87\\x81\\x63\\xa1\\xc4\\xc8\\xbd\\xbc\\xb5\\x26\\xa0\\x6d\\x14\\x46\\xe6\\xf6\\xb0\\xdb\\x74\\x1f\\xfa\\x0c\\x6a\\xbe\\x53\\x88\\x22\\x90\\xc8\\x33\\x5a\\x44\\x83\\x06\\x89\\x51\\x21\\xfc\\xcc\\x5a\\x92\\xfd\\xb0\\xce\\x14\\xdb\\xca\\x96\\x43\\x89\\x4e\\xdd\\x67\\xb4\\xa4\\x32\\x93\\xbe\\x81\\xbc\\x86\\x8a\\x54\\x05\\xbc\\x92\\x1e\\x0b\\xdd\\x76\\x23\\xdb\\x7c\\xdd\\xf7\\x3c\\x2d\\x30\\x45\\xaa\\x7b\\xbb\\x93\\xd8\\xd4\\x64\\xe8\\xe6\\x64\\x9e\\x18\\x2f\\x5b\\xa3\\x79\\x65\\xd2\\xc6\\x7b\\xff\\x44\\x88\\x65\\xc5\\xac\\x59\\x89\\xa0\\x66\\x75\\x0a\\x5f\\x0f\\x1f\\xd4\\x73\\xc0\\xc0\\xb3\\x96\\xb0\\xb4\\x7a\\x12\\xfa\\xbe\\x29\\x66\\x7f\\x4c\\x40\\x16\\x54\\xb4\\x7c\\x60\\xf9\\x94\\xbd\\xf7\\xcf\\x9f\\x77\\x3c\\xad\\x08\\x3a\\x14\\x8b\\x9a\\x71\\x1d\\xfe\\xe9\\x14\\x3d\\xbc\\xa1\\x5f\\x4b\\x83\\x96\\xd3\\x9a\\x9f\\x75\\x36\\xf9\\xcb\\x4a\\x49\\x5d\\x9c\\xaf\\x87\\x0b\\x9a\\xc7\\xfb\\xbd\\xf9\\xe8\\xe1\\x59\\xee\\x83\\x37\\x53\\x5b\\x26\\x13\\xe3\\xd7\\x10\\x41\\x01\\xd9\\x52\\xe1\\xa6\\x68\\xde\\x99\\xa4\\xbe\\x9c\\xbf\\xf2\\xcd\\xdc\\x89\\x2a\\x4e\\x31\\x64\\xe2\\x16\\xf9\\xe2\\x09\\x1e\\x1d\\xe2\\x0b\\x5f\\x11\\x30\\x4d\\x63\\x3b\\x6a\\x4e\\x9e\\x12\\x50\\xa1\\xd5\\xf5\\x47\\xaf\\x68\\x87\\x2a\\x1f\\x48\\xae\\xbc\\x06\\xf5\\x7f\\x8f\\xb2\\xde\\xd6\\x71\\xc7\\x0f\\xef\\x89\\x97\\x2d\\xd3\\x48\\xa2\\xac\\x4a\\x43\\x82\\x30\\x61\\x4c\\x89\\xec\\x99\\x29\\xc5\\xe1\\xca\\xd9\\xed\\x70\\x95\\xe7\\xa1\\xb2\\x6f\\xee\\x5e\\x5a\\xe0\\x31\\x3a\\xc5\\x8f\\x54\\x1a\\x6a\\x49\\xea\\xa1\\x25\\x0a\\xc8\\x78\\x30\\x58\\x3c\\xf0\\xcf\\x19\\x10\\xe4\\xf3\\x6b\\x90\\xec\\x95\\xc6\\x66\\xf2\\x7c\\x50\\xb1\\x5c\\x4e\\x99\\xcc\\x3b\\x27\\xaf\\x9a\\x6c\\xeb\\x79\\x48\\x08\\xd4\\x4f\\xae\\x77\\xfe\\x1f\\x00\\x81\\x2b\\x7e\\xd4\\xb4\\xa0\\xfb\\xfa\\xea\\xaf\\x8e\\xda\\x7c\\x06\\xa9\\x55\\xa9\\x34\\x9f\\xea\\x94\\x8d\\xb4\\x79\\xbb\\xb3\\xde\\x38\\xe1\\xc7\\xb3\\xb4\\x83\\x3e\\x20\\x4e\\x03\\xa6\\x70\\x50\\xe7\\xeb\\x57\\x34\\xdd\\xa7\\xe8\\x59\\x14\\xb8\\xfd\\xad\\x07\\x45\\xb7\\x3e\\x38\\xf9\\x3b\\x3a\\x12\\x25\\x3d\\x9e\\x8e\\xa3\\x2c\\x73\\x48\\xec\\x22\\x79\\xda\\x38\\x35\\x48\\x95\\xe5\\x18\\x9b\\xd5\\x13\\xd6\\x60\\x18\\x0c\\x49\\xde\\x2d\\x9a\\xa8\\x37\\x0d\\xc5\\x0d\\x32\\x6d\\x3a\\xe2\\x20\\x70\\xb7\\x31\\x6c\\xe4\\x02\\xd8\\xc3\\xca\\x0d\\x78\\xb5\\x0d\\x6e\\x5c\\xba\\xae\\x29\\x4e\\x63\\xae\\xb9\\x24\\x9f\\x81\\x59\\x82\\x7b\\x45\\xc7\\xe9\\x8f\\xa7\\xf2\\x85\\x75\\x5f\\xea\\xe9\\x3d\\xb8\\x2a\\x5b\\x58\\x7b\\xa8\\xa7\\xef\\xe0\\xc5\\xd9\\x5f\\x1a\\xfd\\x8d\\x36\\x5b\\x22\\x60\\x34\\xfa\\x13\\x56\\x7b\\xc2\\x8f\\xb2\\x1c\\x47\\x6f\\x58\\x75\\xdb\\xf6\\x62\\x66\\xc3\\x37\\xd6\\xac\\xbd\\x75\\x4b\\xae\\x79\\xd3\\xf1\\xaf\\xa7\\x92\\x83\\x69\\xbb\\x2d\\xbd\\x30\\x99\\x1a\\xce\\x3b\\x1c\\xb9\\xb3\\xf1\\x55\\xc1\\x10\\x29\\x20\\x13\\xaa\\x3d\\x1d\\xfa\\xd3\\xef\\x6e\\x44\\x23\\xd5\\x47\\x5e\\xfb\\xd3\\x07\\xd7\\xa3\\xa5\\xd5\\x47\\xde\\x47\\xf2\\x77\\x8f\\x57\\x9f\\x59\\x50\\xbd\\xf5\\xd8\\xf4\\x15\\xc1\\x34\\xd4\\x99\\xfd\\xcc\\xc7\\x10\\xaf\\x48\\x00\\xdd\\x98\\x28\\x2b\\x75\\x13\\xc5\\x99\\x92\\x1c\\x9b\\xad\\x98\\x6b\\xa0\\x26\\x53\\x36\\x99\\xc9\\x49\\x43\\x88\\x8b\\xcb\\x66\\x92\\x76\\x36\\xab\\xe5\\x42\\x57\\x31\\xd1\\xe9\\x0a\\x23\\xa0\\x7e\\x86\\x84\\x30\\x9c\\x25\\x53\\x31\\x08\\xb0\\x45\\x93\\x29\\x1b\\x8c\\x24\\xe7\\xc4\\xc2\\xbf\\x33\\x1a\\xf0\\xa5\\xb1\\xd6\\x77\\x8c\\x30\\x8a\\x47\\x0a\\xd0\\x72\\x23\\x29\\x85\\x34\\xe8\\x79\\x19\\x39\\xbe\\x6a\\x36\\xb1\\x42\\x49\\x33\\x5b\\x20\\x0c\\x34\\x20\\x0b\\x2a\\xd4\\x1a\\xfd\\x40\\xb4\\x1d\\xc9\\xe6\\x3f\\x3e\\xfc\\xd4\\x8d\\x3d\\xf4\\x35\\xe5\\xa9\\x63\\x0f\\xa1\\xbe\\xa3\\x1b\\x37\\x72\\x9b\\xb6\\x88\\x26\\x8e\\x4e\\x5d\\x87\\x5e\\x08\\x7c\\xbe\\x8b\\xb4\\xf2\\xda\\xbe\\x16\\xdd\\x5f\\xbd\\xf1\\xc8\\xdd\\x77\\x5f\\x73\\x04\\x57\\xba\\x9f\\xd9\\xc9\\x54\\x6b\\xeb\\xcb\\xc2\\xea\\xc8\\xb6\\x63\\xc5\\x27\\xb4\\x85\\x74\\xf8\\x48\\x29\\xa3\\x07\\x66\\x88\\x8f\\x0e\\x70\\x89\\x64\\x45\\x53\\x13\\xf3\\xdc\\xbc\\xd5\\xc5\\x00\\x77\\x18\\xc8\\xab\\x72\\x8c\\x2c\\x26\\xe6\\x83\\xc5\\xe4\\xe7\\x2c\\x26\\xc6\\x56\\x64\\x4a\\x0d\\x6e\\xc4\\x8a\\x97\\xc4\\xc9\\x71\\x0f\\x12\\x1f\\x86\\x12\\x7e\\x78\\x33\\xc1\\x8e\\x2b\\x0d\\x91\\x2c\\xf1\\x83\\xb3\\x56\\x37\\xc7\\x25\\x22\\x69\\x16\\x5e\\x12\\x97\\x48\\xba\\x5a\\xd5\\x3d\\x22\\x5e\\x74\\x9c\\x2c\\xfa\\x7f\\x65\\x6e\\xda\\x94\\x5a\\xd6\\x1e\\xd0\\xc5\\x06\\x5b\\x4c\\x0d\\xec\\xbf\\xa8\\xcd\\xc6\\xaa\\x28\\x76\\x45\\x49\\x1b\\x70\\x19\\xf2\\x01\\x7f\\x5c\\xc9\\x48\\xe4\\xf3\\xe8\\x01\\xd1\\xda\\x4a\\x7f\\xeb\\x50\\x83\\x3f\\x97\\x2f\\x35\\x68\\x7d\\x5a\\xc6\\xf4\\xf0\\x8e\\xf4\\xbe\\xbc\\xc6\\xe5\\xf6\\xea\\x02\\xd1\\xb0\\x5f\\x6e\\x55\\xd5\\xe4\\xe0\\x8f\\xe2\\xa3\\x54\\x91\\x6a\\xa7\\x16\\x82\\xee\\xbf\\x4e\\x71\\x0b\\x93\\x5c\\x6f\\xb6\\x32\\x28\\xc8\\x41\\x4f\\xa6\\xbc\\x70\\x10\\xaf\\x7b\\xe1\\x00\\x50\\x6b\\x70\\x21\\xbe\\x1c\\xec\\x02\\x0b\\x58\\xa8\\x07\\x31\\x38\\xd6\\x35\\x66\\x2b\\x56\\xe1\\x85\\x3b\\x59\\x09\\xd5\\x48\\x39\\x8c\\xed\\x63\\x25\\x23\\xc8\\x85\\x03\\x3c\\x41\\x25\\x26\\x5c\\x67\\x74\\xfc\\x00\\x08\\xcd\\xa2\\x4c\\xa5\\x5f\\xb8\\xd1\\x9d\\x29\\xf7\\x0f\\xe0\\x6f\\xee\\xef\\x85\\x41\\x06\\xfa\\xf1\\xe5\\x40\\x07\\xd0\\x79\\x31\\x3e\\xf0\\x86\\x1d\\x71\\xb2\\xc8\\x0f\\x64\\xe0\\x79\\x10\\x77\\x3d\\xe5\\x4b\\x5d\\xf5\\xac\\x20\\x37\\x44\\x6a\\xe2\\xb1\\x7b\\x06\\x66\\x64\\x84\\x8e\\xbe\\x49\\x8c\\x8a\\xcb\\x26\\x5f\\x8c\\x9c\\x7f\\x66\\xcf\\xe5\\x98\\x51\\xed\\xe5\\xfc\\x4e\\x5a\\xd3\\x69\\x89\\xb3\\x04\\xf0\\x4a\\xad\\x52\\x2a\\x32\\x3a\\x43\\xa6\\x86\\xd6\\x44\\x5e\\x2c\\xd3\\x3a\\x2c\\x06\\x97\\x3d\\x16\\x8c\\x06\\xfc\\x7d\\xe1\\xf5\\xd9\\xab\\x16\\x66\\x56\\x76\\x85\\x94\\x46\\x87\\x2e\\xd6\\xda\\x38\\xb4\\xb1\\x79\\xe8\\xcb\\x0b\\x09\\xdf\\xee\\xa8\\x0b\\x2b\\x73\\xe5\\x51\\xb5\\x4b\\x23\\x37\\xb1\\x2a\\xb7\\xdf\\xeb\\x41\\x0c\\x7d\\xb7\\x4c\\xe2\\xd1\\x5b\\xa2\\x0d\\xa9\\xad\\x1d\\x9d\\x9e\\xfc\\x40\\x83\\xce\\xef\\xb1\\x4b\\xcd\\x83\\xb1\\xa6\\xe1\\x82\\xbb\\x6b\\xf2\\x85\\xb3\\x44\\x7a\\x4e\\x3f\\x90\\x0e\\x9c\\x09\\x23\\xbd\\x9f\\xec\\x12\\xa1\\xf6\\x85\\x2b\\x26\\x6b\\xbd\\x41\\x10\\xd7\\x39\\x5d\\x2a\\x62\\x12\\x2a\\xb6\\xd5\\xc4\\x03\\x8f\\x9b\\xd4\\x39\\x4d\\xbc\\x12\\x13\\x5a\\x84\\xc4\\x92\\xb5\\x66\\x21\\x7c\\x57\\xad\\x93\\x0e\\x27\\x2e\\xf2\\x0a\\x13\\xd9\\x11\\x04\\x3b\\x5e\\x31\\xd8\\x43\\xa4\\x5f\\x88\\x70\\xae\\xb8\\x4c\\x79\\xbc\\xc5\\x59\\x6e\\xb9\\x1d\\xe4\\x55\\x90\\xdd\\x59\\x25\\xeb\\x4c\\x7d\\xbf\\x62\\x76\\x31\\x50\\x13\\xda\\x1f\\x6e\\x1b\\x0a\\xce\\xe9\\x0c\\xd2\\x1a\\x08\\xf5\\x77\\x95\\xec\\xf7\\x06\\xd7\\xee\\x3c\\xd8\\x75\\xf1\\x2d\\x9b\\xf2\\xef\\xe0\\xde\\x20\\x1e\\xa1\\x3c\\xd4\\xe3\\x68\\xb6\\x58\\xac\\x68\\x6c\\xc1\\xd6\\x91\\x76\\xa7\\x3e\\xdc\\x98\\x76\\xed\\xdb\\x17\\x1f\\xe8\\x5f\\x9c\\xe9\\xd8\\x9a\\xc6\\xcd\\x41\\x9c\\xb9\\xc1\\xc4\\x6d\\x05\\xd2\\x41\\xe4\\x18\\xf3\\x0b\\x7c\\xf4\\xdc\\x1c\\x4e\\x3b\\x5d\\xd9\\xb0\\xc5\\x64\\xb4\\xa7\\xb0\\x4c\\xe3\\x3e\\x17\\x92\\x63\\x94\\x94\\x92\\x51\\x2a\\x70\\xcc\\x2d\\x33\\xbd\\x2e\\x64\\xf5\\x93\\x6a\\x15\\x89\\x7a\\xa6\\xe1\\x85\\x6e\\xba\\xe1\\x05\\x4b\\x82\\x41\\x35\\x29\\x08\\x9a\\x69\\x78\\x11\\x40\\x05\\xb1\\x14\\xcd\\xee\\x7a\\xf1\\x21\\x32\\xef\\x45\\xad\\x2d\\xd5\\x3f\\xcc\\xea\\x7e\\x21\\x7e\\xe6\\xd5\\xf7\\x2f\\x9d\\x7c\\x0c\\x3d\\x4c\\xfd\\xdf\\x99\\x03\\xee\\x4e\\x39\\x77\\x0e\\x39\\x54\\xdc\\x57\\xbd\\x55\\x36\\x7b\\x0e\\x0f\\xbc\\xff\\xea\\xd1\\xb9\\x73\\xd8\\x4a\\xe6\\xa0\\xa5\\xf4\\xf5\\x6e\\x07\\xf3\\xe6\\xa0\\x9b\\x99\\x83\\x61\\x7a\\x0e\\xb8\\xef\\x03\\xd9\\x25\\xc6\\xc6\\x0c\\xe9\\x48\\x43\\xa5\\x59\\x73\\x01\\x3f\\x2b\\x96\\x46\\xa4\\x73\\xa7\\xf3\\x12\\x62\\x3b\\x11\\x3d\\xf2\\xd6\\xfb\\xdb\\x67\\x4f\\xe8\\xf8\\x3b\\xbf\\x5a\\x7b\\xec\\xe8\\x64\\x19\\x4f\\x69\\x7a\\x4e\\x37\\x92\\x39\\x45\\xa9\\x46\\x6a\\xfd\\x39\\xe7\\x14\\xab\\xcf\\x09\\x6f\\xb7\\x2b\\xc5\\x13\\xe3\\x06\\x65\\x58\\x16\\xe7\\xdd\\x64\\xb7\\x83\\xb4\\x17\\xaa\\xcd\\xb3\\x69\\xce\\x3c\\x63\\xa4\\x49\\x0b\\x6f\\xc0\\xee\\x59\\x6e\\x2b\\xce\\x99\\x31\\xee\\x42\\x5e\\xcb\\x54\\xce\\xdd\\x24\\x9c\\xbb\\x88\\x93\\x87\\x6f\\x8c\\x0f\\xb8\\x64\\x7a\\x93\\x45\\xa5\\x75\\x3a\\x1c\\x9a\\xcb\\x7c\\x85\\x4c\\xda\\x19\\xee\\x71\\xc9\\x2d\\x0e\\xb7\\xd6\\x93\\xf2\\x77\\xcd\\x5e\\xdc\\x93\\xaf\\xc5\\x9c\\x32\\x83\\x5e\\x65\\xf4\\xc6\\x2c\\x47\\x62\\x5d\\x71\\x8b\\xd7\\x26\\xb3\\xdb\\xf5\\x0b\\x7a\\x26\\xef\\x26\\xeb\\x15\\xd7\\xd6\\x7b\\x84\\xac\\xd7\\x49\\x4e\\xfb\\x1e\\x3f\\xe7\\x8a\\x5d\\xd3\\x2b\\xb6\\x26\\xb9\\x64\\xb6\\xa2\\x11\\x52\\x87\\xa1\\x0c\\x71\\x49\\xf2\\xd3\\x15\\x03\\xc9\\x12\\x8e\\x4b\\x0d\\x72\\x20\\x04\\xa5\\x25\\xb8\\x05\\x28\\xc0\\x19\\xc8\\x16\\x1d\\xd6\\x6a\\x9c\\x44\\xc4\\x8e\\xc9\\x20\\x85\\xe0\\x0b\\x49\\x34\\x56\\x97\\xd0\\xda\\x8d\\xf3\\x80\\x8b\\xd2\\x8f\\xd3\\x22\\xb1\\x9b\\xa8\\x33\\xc2\\xad\\x54\\x3c\\x73\\x88\\x33\\xbf\\x0d\\xb1\\x8f\\x99\\x7f\\x6b\\x16\\x89\\x1e\\x32\\x87\\x73\\x2e\\x4f\\x3e\\x62\\xb2\\x44\\xf2\\x2e\\x57\\x2e\\x6c\\xfe\\x25\\x90\\x24\\x81\\x6f\\x7a\\x73\\x21\\x23\\x7e\\xc6\\x37\\xa7\\x69\\xf4\\x19\\xce\\x46\\x5a\\x42\\x29\\x5b\\xbd\\x79\\xb0\\x02\\x3d\\x4c\\xef\\xc0\\x29\\x49\\x4b\\x38\\x65\\xc5\\x37\\x8d\\xa4\\x61\\x30\\x53\\xa3\\xd5\\x61\\xc0\\xa0\\x2e\\x90\\x8d\\x2b\\x6b\\x74\\x32\\x67\\x01\\x72\\xf0\\x0e\\xa0\\x4c\\x24\\x59\\x51\\xd6\\x32\\x29\\xb1\\x7a\\x5b\\x15\\xdc\\xaa\\x5c\\x82\\x93\\xa8\\x42\\x1a\\xc5\\x4d\\x8e\\x14\\xd5\\x61\\x2a\\x2e\\x6e\\x75\\x4b\\xc0\\x78\\x21\\x9b\\x03\\xc7\\x16\\x41\\x96\\x77\\x29\\xe1\\x59\\x07\\xde\\xc1\\xea\\x24\\xc0\\x35\\xe2\\x60\\xf5\\x8f\\x4b\\x74\\x26\\xe4\\xf2\\x11\\x17\\x9d\\x46\\xf3\\x3a\\xac\\xd5\\x3a\\xde\\x28\\x51\\x2d\\x03\\x80\\x7d\\x06\\x7a\\xc0\\x9d\\x09\\x19\\xfd\\xc5\\xe1\\x78\\xe3\\x48\\x29\\x60\\x0a\\x66\\x5c\\xe8\\x95\\xe9\\x66\\x38\\xfd\\x61\\xa7\\x23\\x1c\\x76\\x38\\xc3\\xa2\\x3f\\x2a\\xc3\\x99\\x36\\x1f\\x6e\\xc4\\xe8\\x6d\\x19\\x8c\\x79\\x4b\\x99\\xb0\\xf2\\x73\\x55\\xad\\x4f\\xce\\x7d\\x74\\xda\\xdb\\xd8\\xe8\\xf5\\x36\\x35\\x91\\xfd\\x81\\x33\\x93\\x40\\x80\\x4f\\x48\\x5f\\x16\\x3d\\x75\\x79\\xed\\x84\\x27\\x95\\x9d\\xdb\\x10\\x45\\xa3\\x53\\x61\\x21\\xd1\\x88\\x70\\x9f\\x12\\xd5\\x74\\x6f\\x14\\x41\\x6b\\xb5\\x6a\\xd2\\xe6\\x1e\\x8c\\x07\\xa7\\xca\\x90\\x26\\xca\\xa2\\x4c\\x59\\xc6\\x92\\xfe\\x07\\x34\\xee\\x5a\\x22\\xc3\\x5d\\x4b\\x8c\\xa4\\xb7\\x0e\\x2b\\xe0\\x73\\x8a\\x17\\x89\\x6b\\x9a\\x1d\\x40\\x33\\x8d\\x53\\x20\\x54\\x61\\x0c\\x59\\x56\\x04\\xb0\\xf5\\x40\\xf5\\x59\\xa4\\xad\\xfe\\x3b\\xea\\x98\\xfa\\xc3\\x63\\xab\\x6f\\x39\\x8c\\x5b\\x9b\\xbc\\x88\\xfb\\xa8\\xa0\\xfe\\xea\\xd3\\x34\\x8d\\x6a\\xfd\\x32\\x4a\\x10\\x3b\\xe0\\x1e\\x38\\xbd\\xb8\\x56\\xad\\xde\\xfa\\x06\\x67\\x39\\x5b\\x04\\x4c\\xd0\\x91\\xac\\x78\\x14\\x38\\x44\\x41\\x5c\\xdf\\x74\\x3b\\x1c\\xdc\\xd0\\xdc\\x4e\\xd5\\x6a\\x17\\x5a\\x92\\xe4\\x82\\xeb\\x60\\xf1\\x8e\\xaf\\x47\\x3f\\x1e\\x8e\\x64\\xbb\\xb0\\xf4\\x9a\\xd8\\x2f\\xdc\\x2d\\x47\\x8b\\x66\\x0e\\x51\\xcc\\x0e\\x3b\\x9a\\x98\\x0b\\xf6\\xd0\\xe9\\xf8\\xc1\\x46\\x51\\x3d\\x04\\xe9\\x98\\x15\\x99\\x98\\x36\\x7c\\xef\\x40\\xf7\\x05\\x3a\\xeb\\xec\\xb8\\x9a\\xf5\\xd7\\x23\\x95\\xec\\x74\\xf4\\x72\\xb7\\xf6\\x92\\x1f\\xfc\\x0e\\xcb\\x34\\xe9\\x71\\x03\\x7e\\x40\\x09\\x5e\\x40\\x47\\x8d\\xcd\\xea\\x73\\xa3\\x3a\\x67\\xe3\\x19\\xcc\\x50\\xf6\\x42\\xcd\\x6e\\xf0\\x09\\x08\\x5c\\xbf\\x8e\\x1b\\xa0\\xcc\\x6d\\x7a\\xe3\\x33\\x80\\xa7\\x9a\\xd5\\xf9\\x66\\xf2\\xa5\\xef\\x63\\x3f\\x35\\xdd\\x00\\x87\\xf8\\xa8\\xb3\\xe7\\x35\\xfc\\xdf\\x36\\xaf\\xb3\\xe6\\x03\\x5e\\x6b\\xce\\x7c\\x7e\\x43\\x7c\\xd6\\xcc\\x84\\xb0\\xc3\\x9a\\x9e\\xcf\\x56\\x32\\x1f\\x03\\xb5\\xe2\\x0b\\xcd\\xc7\\x78\\xa1\\xf9\\x98\\x6a\\x74\\xe2\\xd5\\x86\\xe2\\xd9\\x94\\x12\\x7c\\xd8\\x9c\\xc9\\x6d\\xae\\xbb\\xb0\\x99\\xf9\\x09\\xfe\\x8b\\xf8\\x2e\\x61\\x8e\\x47\\xc8\\x1c\\xbd\\x54\\x8e\\xfa\\xca\\x17\\x98\\x25\\xee\\x2b\\x91\\xca\\x56\\xf4\\x82\\x39\\x0f\\x83\\x39\\xcf\\x9f\\x77\\xd6\\x1c\\xa5\\xe3\\xd4\\x18\\x27\\x5b\\x84\\xfd\\x21\\x39\\x29\\xc3\\xae\\xc4\\x85\\x57\\x92\\x0c\\xdf\\x8c\\xd7\\xa3\\xc6\\x3d\\x0f\\x9d\\xe7\\x58\\xcf\\x05\\x76\\x8e\\xe6\\x2c\\xb4\\x7d\\xbe\\x0d\\x47\\x87\\xe6\\x1b\\xf0\\x19\\x12\\xcc\\xb7\\xe0\\x8e\\xb3\\x8c\\x37\\x23\\xf4\\xcc\\x99\\x96\\xa7\\xc1\\xb9\\x7d\\x73\\x08\\x71\\xe6\\x34\\xcf\\x61\\x2f\\xdc\\x3c\\x47\\x7f\\x56\\xf3\\x1c\\x22\\xdc\\xf5\\x0e\\x3a\\x53\\xbe\\xaf\\x60\\xc9\\xae\\x37\\xd2\\x11\\x04\\xfb\\xff\\xaf\\x79\\x80\\x50\\xcf\\xcc\\xe3\\x59\\x22\\xd1\\xd3\\x13\\x21\\x02\\x4d\\xcd\\xd0\\xa4\\x2e\\xd3\\x17\\x5d\\x68\\x2e\\xc6\\x0b\\xcf\\x85\\x08\\x34\\x0d\\x0e\\x4d\\xa3\\xd5\\x17\\x67\\x1f\\x14\\xaa\\xcf\\x8b\\x88\\xf4\\xcc\\xd4\\x12\\x75\\x79\\x9e\\x9e\\xdd\\xb4\\x38\\x83\\x3c\\x0b\\xf3\\x9b\\x91\\xe7\\xdb\\xfe\\xfa\\x0c\\xcf\\x29\\xca\\x17\\x98\\xf1\\xb8\\x45\\x4e\\xcb\\xe2\\xb8\\xd1\\x0a\\x16\\x61\\x75\\xb2\\x26\\xda\\xe3\\x3e\\x72\\x5b\\x90\\x6c\\x22\\xd6\\x74\\x5d\\xac\\xf9\\xb8\\x1c\\xae\\xc2\\xa9\\x73\\xac\\xee\\x02\\x02\\x3e\\xb3\\x6c\\xe3\\x85\\xa5\\x7b\\x9a\\x20\\x17\\x14\\x6e\\x9a\\x52\\xd4\\x7a\\x01\\x18\\x28\\x3f\\x3e\\x75\\x43\\xce\\x51\\x18\\xc5\\x13\\x42\\x07\\x00\\xb7\\x6c\\xa2\\x82\\x28\\x56\\xa4\\x8e\\x73\\xbe\\x2c\\xde\\x54\\xe2\\x3c\\x42\\x61\\xb6\\x9e\\x24\\xeb\\x8d\\x6a\\x7c\\x50\\xb4\\x6c\\xd4\\x93\\x44\\x88\\x0f\\xc2\\x5b\\x3d\\x49\\x8f\\xe8\\xf1\\x29\\x30\\xa3\\xd0\\xe7\\x04\\x9f\\xb3\\x08\\xd6\\x77\\xa1\\x78\\x55\\xbd\\xe0\\x71\\x4e\\x93\\x35\\x1f\\x6b\\x98\\x6e\\xb3\\x86\\x83\\x52\\xc5\\xd2\\x39\\xbd\\xd6\\xaa\\xbf\\x7c\\xb7\\xde\\x6d\\xed\\xa7\\x3f\\xa5\\x7b\\x9f\\x41\\xb3\\x5b\\xae\\xd1\\xbd\\xd5\\xcb\\x84\\xae\\x6b\\xd5\\x17\\x9f\\xc1\\xe7\\x2a\\x71\\x5f\\x21\\xc0\\xe0\\x1a\\x40\\x1b\\x29\\xea\\xeb\\x33\\x75\\xb4\\xda\\xba\\x11\\xe3\\x44\\x59\\x00\\xd9\\x78\\x03\\x60\\xdc\\xae\\x4f\\x00\\xe0\\x0c\\x01\\xf2\\x4e\\x65\\xea\\x3d\\xca\\xce\\xd1\\x74\\x08\\x9f\\x07\\xd3\\x50\\x64\\x23\\x92\\x63\\xd8\\xc7\\x69\\x95\\xde\\x1e\\x12\\x5a\\x28\\xea\\x79\\x1c\\x39\\xe2\\xd6\\x2d\\x73\\xba\\x10\\xf1\\x89\\x90\\xf0\\x69\\x3b\\x8b\\xab\\x16\\xf5\\x02\\x24\\x9d\\xd7\\x99\\xe8\\xaf\\xc0\\xf6\\xd9\\x4d\\x8b\\x7e\\xb1\\xf7\\x42\\xa8\\xfd\\xac\\xb6\\x46\\xe7\\x87\\xee\\x82\\x6e\\x90\\x9e\\x47\\x60\\x47\\x28\\xca\\x4c\\xc5\\xa8\\x26\\x6a\\x49\\xad\\x2b\\xbc\\x53\\x21\\x54\\xd6\\x92\\x6a\\x39\\x3e\\xac\\x98\\x3e\\xd7\\x6e\\xd1\\x92\\xd6\\xf0\\xa4\\x66\\x5d\\x2b\\x1c\\x68\\xf7\\xe1\\xd6\\xf0\\x12\\x7d\\x3c\\x41\\x60\\x77\\xd8\\x09\\xaf\\xcc\\x48\\x19\\x23\\x58\\x26\\xcb\\x5e\\xa0\\x07\\x12\\xb6\\x75\\x5f\\xa4\\x0f\\x92\\x04\\x5b\\xc1\\x2f\\xd0\\x0c\\x89\\xfe\\x11\\xf1\\xfc\\xe7\\x5a\\xdb\\x8a\\xff\\xcd\\xb5\\x55\\x60\\x6d\\x8d\\x4d\\x42\\x9f\\x4c\\x2e\\xf1\\xbf\\xb1\\x44\\x30\\xa3\\x5f\\x64\\x89\\xbd\\xc4\\xc0\\x7e\\x91\\x35\\xde\\x56\\xb3\\xbd\\xf5\\x35\\x6e\\x25\\x6b\\x74\\x51\\x69\\x6a\\x6d\\x6d\\x8d\\x81\\x39\\x6b\\x4c\\xe0\\x35\\x66\\xc8\\x1a\\xdd\\xc2\\xe1\\xd2\\x86\\xda\\x1a\\xb3\\x38\\x74\\x40\\xc2\\x61\\x89\\x06\\xb6\\x22\\xb1\\xda\\x1c\\x7a\\x41\\x9c\\x39\\x3b\\xac\\x34\\x11\\x20\\x2b\\x4d\\x2b\\xcf\\xbd\\xd2\\x9a\\x21\\x66\\x2e\\xdc\\xd7\\xea\\xc9\\xba\\x85\\x66\\xbf\\x40\\x83\\x2b\\xe6\\x5b\\xc4\\x7a\\x4f\\xad\\x98\\xdf\\x6b\\xa9\\xbe\\xde\\x1b\\xc9\\x7a\\x0b\\xd4\\x10\\xf5\\xe5\\xda\\x7a\\xdb\\xe7\\xac\\x77\\x40\\x31\\x01\\xe1\\x24\\x6f\\x03\\xbd\\xf6\\xd9\\x72\\xa0\\xd7\\x8d\\xa0\\xd7\\x85\\x0c\\xc9\\xd5\\x01\\x0d\\x5a\\x80\\x06\\x2d\\x3a\\xb2\\xd9\\x8c\\x69\\x80\\xb3\\x6f\\x2d\\x35\\x1a\\xf4\\x00\\x0d\\x6c\\xbe\\xc6\\x1a\\x0d\\xf8\\x70\\x04\\x87\\x0f\\x03\\xed\\x84\\x0a\\x43\\x98\\x0a\\xa4\\x05\\x21\\x6f\\x89\\x14\\xcf\\x49\\x8f\\xf3\\xaa\\xf1\\x17\\x20\\xd1\\x2d\\x17\\x52\\xee\\xc4\\x17\\x21\\xdd\\x3f\\x9c\\x4f\\xdf\\xa7\\x4a\\x67\\xb5\\x0d\\x83\\xb8\\x5d\\xa0\\xe7\\x91\\x9a\\x8e\\x74\\x50\\xcb\\xa8\\x5b\\x6a\\x14\\x4d\\xcd\\xa1\\x68\\xab\\x02\\xe7\\x28\\xb8\\x91\\x6c\\xc5\\x29\\xf8\\xc5\\xde\\x0c\\xf9\\x51\\x1b\\xa0\\x66\\x5c\\x3b\\x31\\x6e\\x89\\x23\\xf0\\x73\\x3e\\xc1\\xfd\\xc5\\x75\\x24\\x3e\\x07\\xd2\\x8e\\x0f\\x2a\\xf3\\x70\\xbf\\x53\\xb8\\xdf\\x99\\xac\\x0c\\x0a\\x9e\\x10\\xff\\xca\\x4d\\xa7\\x8f\\x58\\x8d\\x54\\x2b\\xb1\\x1a\\xf8\\x47\\x6d\\xb0\\x4a\\xe1\\x13\\x4e\\xbc\\x33\\x0c\\x24\\x8e\\x2d\\x3b\\x37\\x89\\xe7\\xc7\\xf0\\x17\\xf8\\x19\\xa1\\x73\\x11\\x7a\\xbe\\xdb\\xdc\\x30\\x9f\\xb0\\xc8\\x36\\xdf\\x8f\\x9e\\x83\\xd4\\x22\\xd5\\xfc\\x88\\xff\\xb1\\xf9\\x7a\\xfa\\xfb\\xb3\\xc3\\x7f\\x88\\x23\\x6f\\x41\\x3e\\xe6\\x56\\x51\\x3b\\xe0\\x11\\xca\\x80\\xeb\\x10\\x0b\\x16\\x5c\\x8e\\x20\\xbd\\xe5\\xa3\\x8f\\xee\\x9a\\xf8\\xdd\\xbd\\xff\\xf1\\x87\\x13\\x1f\\xfd\\x1e\\x3d\\xfd\\xe7\\xc9\\xdb\\xfe\\xf3\\x3f\\x6e\\xae\\x4e\\xde\\x39\\xf9\\x47\\x8c\\xb1\\x02\\x67\\x0e\\x30\\xbf\\x15\\x5f\\x49\\x7a\\x37\\xe4\\xa8\\xab\\x84\\x0e\\x2c\\x7c\\x63\\xbd\\x3b\\x5d\\x10\\x2e\\x14\\xa4\\x4b\\x1f\\x81\\xdd\\xb8\\xf3\\x48\\x4d\\xd1\\xd3\\xd8\\x61\\x69\\xf1\\x31\\x2a\\x82\\x3f\\x48\\xdf\\x15\\x9c\\x25\\xe0\\xd2\\xec\\xe3\\x32\\xb1\\xd5\\xe4\\xc7\\xfd\\x90\\xf1\\x4e\\x96\\x5c\\x89\\x45\\xbd\\x11\\x9f\\x81\\xb4\\x3a\\x48\\x12\\xa1\\xa2\\xa4\\x34\\xbe\\x1c\\x7e\\x5b\\xac\\xaf\\x35\\xc6\\x17\\x0a\\x4e\\x6b\\x25\\x93\\x98\\x21\\xe1\\x88\\x34\\x52\\x68\\x42\\xb8\\x98\\x18\\x85\\xe7\\xfc\\xd8\\x47\\x38\\x42\\x48\\x5f\\xdc\\x95\\x1e\\x79\\xe6\\xb2\\x74\\x51\\x20\\x7f\\x69\\x5b\\x72\\xac\\xb2\\xbf\\xd4\\xf6\\x07\\x95\\x1c\\x8d\\x64\\x5b\\x31\\xad\\xbf\\x66\\x69\\x76\\x61\\xda\\x4b\\x25\\x02\\x8d\\x3d\\xae\\x3b\\x36\\xfe\\xe3\\xb2\\x7f\\xbd\\x4d\\xa0\\xb3\\xcb\\xfa\\x9d\\xf5\\x6f\\xae\\xfe\\xe3\\xb7\\xba\\xf7\\xa6\\xe8\\x2b\\x13\\x40\\xd3\\xa9\\x17\\x0c\\x7a\\x4c\\xe2\\xcc\\xaa\\x30\\xa6\\x0b\\xe9\\x9f\\x45\\x6c\\xbc\\x9f\\x0a\\xe3\\xb8\\xd3\\x8d\\xe9\\xc2\\xd6\\x7a\\xe6\\x08\\x3d\\xd8\\xc4\\x16\\xdc\\x48\\x2b\\x42\\x84\\x15\\x63\\x10\\x89\\x96\\xb4\\x30\\x34\\xe3\\x1e\\x1f\\xe0\\xd2\\xb1\\x29\\x54\\x21\\xa1\\x77\\x89\\x84\\xe5\\x18\\x5c\\x56\\x5a\\x61\\xdd\\xc1\\x50\\x18\\x4b\\x26\\x88\\xa0\\x0d\\xfd\\x95\\x9e\\x5a\\xd8\\x7f\\x9d\\xb7\\xaf\\xd6\\xdf\\x63\\xa7\\x75\\xc1\\xe6\\x5a\\xa2\\x1d\\x02\\xa6\\xff\\x6f\\x5a\\x8b\\x44\\x45\\x4e\\x04\\x73\\x66\\x16\\x56\\x11\\x08\\xe2\\x55\\x70\\x36\\xbc\\x79\\x7f\\xc1\\xb5\\xe0\\xd4\\xeb\\xf9\\x7b\\x84\\xc9\\x88\\x7b\\xba\\xf0\\x6a\\x16\\x0b\\xce\\xa9\\xbe\\x9e\\xad\\x64\\x3d\\x51\\x9c\\x01\\x3d\\xef\\x7a\\x62\\xe7\\x5b\\x4f\\xbc\\xc6\\x1b\\x3e\\x10\\x2d\\xce\\xe3\\x4e\\x03\\x59\\x17\\x2b\\x98\\xe8\\x0b\\x72\\x49\\x70\\x54\\xe7\\x5d\\xdc\\xad\\x75\\xf7\\x74\\xe1\\xe5\\x35\\xd7\\x22\\x0b\\x51\\x6d\\x7d\\x47\\xc8\\xfa\\x9a\\xa9\\x45\\x38\\xe3\\x79\\x9e\\x15\\x62\\xdf\\xdb\\x9f\\xad\\x34\\x08\\xa6\\xb3\\x0d\\x4c\\xe7\\xd0\\x9c\\x15\\x07\\x70\\x34\\x9c\\x10\\xac\\xe4\\xcc\\xea\\x39\\x9b\\x8e\\xeb\\xc6\\xef\\x14\\x84\\x77\\x0a\\xc9\\x4a\\xb7\\x60\\x3f\\x87\\x67\\xd8\\xcc\\x17\\x12\\x40\\x1e\\x37\\x69\\x3d\\xd9\\x80\\xb7\\x8e\\x16\\x15\\x2f\\x48\\x8c\\x0b\\x04\\x18\\xe7\\xa5\\xd2\\x95\\x17\\x8e\\x37\\x2e\\x4c\\xbf\\x1f\\x5e\\x30\\xca\\xc6\\xb2\\x43\\xfa\\x9e\\x11\\x5d\\x90\\x53\\x6a\\x7c\\xde\\x8b\\xe4\\x90\\xa9\\x59\\xc0\\x9d\\xfc\\xc8\\x8a\\x4c\\x48\\x8f\\xe3\\x1f\\x52\\x91\\xca\\x6a\\x47\\xf9\\x6b\\x9d\\xbc\\x99\\x1a\\xcc\\x16\\x7a\\xa0\\xe1\\xdf\\xbc\\x9a\\xe9\\x83\\xb6\\xb0\\x96\\x9c\\x99\\xe9\\x86\\xc6\\x3c\\x8c\\xa5\\x76\\xa6\\x8f\\xa6\\x85\\x0a\\xe2\\x1e\\x12\\xd3\\x03\\x56\\xcc\\x42\\x0f\\x5f\\x33\\x33\\x51\\x51\\x04\\x85\\x76\\xbe\\x18\\x54\\x85\\x84\\xa6\\xde\\x30\\x07\\xb9\\x35\\x23\\x34\\xf4\\xb5\\x90\\x8a\\x36\\x7c\\x5a\\x95\\x0f\\xe3\\x4e\\x78\\x96\\x5a\\x91\\x75\\xd0\\x5a\\xab\\x5f\\x9c\\x6e\\x0d\\x6b\\xca\\x9e\\xbb\\xc9\\xa6\\xd0\\x25\\xf6\\xa5\\xb3\\x3b\\x6d\\x3e\\x3f\\xdd\\x2a\\xf6\\x44\\xbd\\xe3\\x66\\xf5\\x2d\\xf4\\x21\\xee\\xb8\\x19\\x5c\\x90\\xf3\\x90\\x9e\\x4d\\xbf\\x61\\x4e\\x89\\xb7\\x52\\xed\\xb8\\x2e\\x93\\xcc\\x9e\\x1c\\xaa\\xf5\\x32\\xe4\\xe0\\x1a\\x81\\x41\\x49\\x7c\\x2a\\x95\\x1c\\xbc\\x82\\x99\\xb7\\x83\\x98\\xb5\\xeb\\xf0\\xa9\\x23\\xfc\\x6b\\x05\\x9c\\x49\\xc7\\x29\\x71\\x2d\\x4b\\x06\\xae\\x33\\x49\\x5e\\xa9\\x16\\x1a\\xeb\\x67\\x00\\x00\\x55\\xec\\x12\\x6f\\x9c\\xa4\\xda\\x43\\xb8\\x45\\x15\\xb8\\x0a\\x3b\\xae\\xda\\x74\\x83\\x5e\\x16\\x70\\xb7\\xae\\xb9\\xbe\\x7a\\xd6\\xaf\\xf5\\x44\\x0a\\xe6\\x73\\x34\\x29\\x17\\xce\\x6d\\x8f\\xe4\\xb7\\xde\\x79\\xc9\\xaa\\x6f\\x6e\\x29\\x98\\xc3\\x59\\x67\\x76\\xac\\xd5\\x9b\\xd9\\x7c\\xc7\\xa6\\xe2\\x96\\x96\\x03\\xb9\\xe6\\x60\\x7b\\xc2\\xee\\xed\\x5c\\xdf\\xb9\\xf5\\x80\\xaf\\x10\\x35\\x9b\\x00\\xca\\x40\\xa4\\x67\\x64\\x56\\x5c\\xfb\\xb3\\x63\\x03\\x3d\\x7b\\x6e\\x1e\\x6c\\x18\\x5e\\x50\\xd0\\x9b\\xfa\\xd6\\x5e\\xde\\xb5\\xf6\\xee\\xdd\\x25\\x9f\\xa7\\x92\\x76\\xe5\\x17\\x36\\xb6\\x6e\\xea\\x8f\\x9c\\xb2\\xa4\\x87\\xf3\\xc1\\xde\\x9c\\x37\\xb3\\xfa\\xf0\\xd0\\xe4\\x49\\x82\\x93\\x49\\xff\\x32\\x31\\x2e\\x52\\x77\\x03\\x4a\\xce\\xe3\\x7d\\x45\\xf3\\x34\\x75\\x82\\xe2\\x9a\\xc2\\xe2\\xc3\\x8f\\xbc\\x42\\x3c\\x51\\x91\\x24\\xec\\xda\\xfa\\x6e\\x51\\x33\\x51\\x55\\x8f\\x12\\x22\\x5e\\x41\\x35\\xa5\\x8d\\xf8\\xb0\\x1a\\x90\\xa6\\x80\\x7b\\x21\\x61\\xeb\\xa4\\x22\\x87\\x11\\xd8\\x53\\x0a\\xad\\x3d\\x98\\xc9\\xe5\\x09\\xa2\\x91\\x60\\xf2\\x58\\xd2\\xa4\\x45\\x12\\x3e\\xbe\\xae\\xd5\\x93\\xdf\\xf5\\x21\\x8d\\x83\\xbe\\x48\\x37\\xb3\\x30\\x8e\\x8d\\x0c\\xd2\\x2f\\xd8\\xce\\x6c\\xf5\\x15\\x3d\\xb6\\xe4\\xc9\\x87\\x0e\\x7c\\x81\\x7e\\x66\\xb4\\xad\\xb1\\x28\\x72\\x5f\\x5e\\xe5\\x16\\x9c\\x83\\x2e\\x87\\xff\\x6f\\xd0\\xe5\\x71\\x42\\x17\\xd2\\x33\\xcb\\xa4\\xe7\\x72\\xff\\x3d\\xc4\\x71\\x20\\x0b\\xf3\\x5f\\x20\\xce\\xe6\\xef\\x9f\\x7c\\xeb\\x0b\\x12\\x87\\xe9\\xaa\\xd7\\x84\\xd5\\xe9\\x73\\x82\\xd0\\x27\\x44\\xb5\\xe0\\x5c\\xe8\\x0c\\x7d\\xe2\\x67\\xd3\\x27\\x37\\x43\\x9f\\x22\\xa1\\x4f\\xed\\x78\\x19\\xa1\\x4f\\xb6\\x46\\x9f\\x56\\xdc\\x8e\\x09\\xe8\\x53\\x56\\xa9\\x3d\\xc5\\x69\\xc9\\xf1\\xfa\\x02\\xf1\\x1a\\x89\\xfc\\x75\\x12\\xb9\\x2d\\xff\\x15\\x12\\xe1\\x13\\xc8\\xb3\\xc2\\xb1\\x3a\\xa5\\xce\\x4f\\xa5\\xa7\\x7f\\xdf\\xf3\\xe1\\xc1\\x6f\\x3f\\x54\\x9c\\x4f\\xac\\x73\\x13\\x8a\\x79\\x08\\x45\\xab\\x6f\\xae\\x7a\\x7c\\x7c\\xf2\\x93\\xf9\\x24\\x9b\\x45\\xab\\x5b\\x08\\xad\\x3a\\x21\\x92\\xf8\\xdb\\xd9\\xb4\\xea\\xab\\xd3\\x2a\\x8a\\x9d\\x22\\x6e\\x61\\xd5\\x99\\x19\\x6f\\x8b\\xe2\\xe0\\xcc\\x07\\x6f\\x25\\xe9\\x39\\x64\\x1c\\x99\\x21\\xa3\\x10\\x64\\x74\\x01\\x19\\xbb\\x6a\\x64\\x5c\\x2c\\x90\\x91\\x4b\\x66\\x48\\x20\\xd1\\x75\\x16\\x25\\x7d\\xd1\\x5c\\x5f\\x8d\\x92\\x4d\\x40\\xc9\\x11\\x33\\xc4\\x16\\x6e\\x64\\x59\\x86\\x63\\x0b\\x85\\x44\\xe8\\x26\\xa1\\xc5\\x3f\\xb3\\xc5\\x47\\x73\\xb5\\x3d\\xc2\\xbf\\x46\\xd6\\x0b\\x47\\x75\\x17\\xa6\\xf4\\x65\\x87\\x6f\\x6c\\x1c\\x70\\x49\\x0d\\xc6\\x5a\\x70\\xb7\\x1f\\x82\\xbb\\x8c\\x23\\xd2\\xed\\x92\\x5b\\x85\\xe0\\xce\\xfe\\x05\\x79\\xf0\\xf9\\xcf\\xa3\\x4e\\x99\\x11\\xe2\\x3b\\x5f\\xcc\\x7c\\x24\\xda\\xd5\\x68\\xf1\\x59\\x6b\\x5b\\xb1\\xdc\\xd9\\x4c\\x11\\xd7\\x78\\xb2\\x93\\xf0\\x24\\x43\\xf5\\x51\\x17\\x53\\xa7\\x66\\x73\\xa5\\xe5\\x6c\\x09\\xee\\xae\\x93\\x1e\\xd7\\x37\\x5e\\x94\\xad\\x04\\x05\\xd0\\x32\\x04\\xa0\\x65\\x35\\x6e\\xc3\\x50\\x89\\x0a\\xa9\\xcd\\x6c\\xd4\\x03\\xbc\\x43\\xc0\\x17\\x94\\xe4\\xb3\\xf0\\x14\\xad\\xb1\\xa7\\xab\\xc6\\x1e\\xf0\\x25\\x4b\\x31\\x7a\\xe9\\x17\\xd0\\x4b\\x7f\\xb2\\xb2\\x54\\x40\\x2f\\x6b\\x70\\xcf\\x7f\\xdc\\xad\\x41\\x65\\x6f\\xc1\\x4c\\xeb\\x67\\x79\\x05\\x69\\x1b\\xd3\\x5d\\x63\\x54\\xdf\\x59\\x8c\\xba\\x00\\x83\\xce\\x13\\x13\\xd6\\xd9\\x32\\x3f\\x26\\x3c\\x3f\\x9b\\x8e\\xcc\\x3f\\x76\\xb2\\x65\\x3e\\x5b\\x90\\x69\\xfe\\x39\\x94\\x73\\x33\\x4a\\xe4\\x99\\x77\\x3a\\x65\\xb2\\xeb\\x2c\\x3b\\xf3\\xdc\\xfc\\x03\\x2b\\x75\\x7e\\x71\\xd3\\xfc\\x1a\\xc5\\xfd\\xe0\\xbe\\x30\\xbf\\x70\\x35\\x13\\xde\\x89\\x5c\\x92\\xac\\x04\\x6b\\x3b\\xc8\\xcb\\x88\\xfa\\x00\\x7f\\xc6\\x3d\\x59\\x1c\\xa3\\xf7\\x0b\\x1b\\xc8\\xd9\\xb9\\xcc\\x1a\\x8f\\x9a\\xcc\\xf0\\xe6\\xb0\\xf0\\xe6\\x70\\xb2\\x12\\x15\\xea\\xf1\\x97\\xe3\\x86\\x71\\x1e\\xa1\\xbf\\xe1\\x30\\x5b\\xd1\\x2a\\x9a\\x5a\\x82\\xc4\\xbb\\x9d\\x9f\\x55\\xfc\\x92\\x41\\x78\\xcb\\x13\\x1d\\x15\\x7e\\x1b\\xf2\\xff\\x84\\x6f\\x86\\x59\\x7b\\xd1\\xe7\\xe7\\xd9\\xaf\\xfc\\xc5\\xc5\\x78\\x83\\xda\\xef\\x2f\\x8d\\x34\\xc6\\x17\\x17\\xfd\\x8a\\xf9\\x3c\\x3b\\x1e\\x76\\x3a\\xc3\\xf8\\xef\\x7c\\xac\\xaa\\xef\\x5d\\xc7\\x16\\xe1\\xe7\\x45\\x93\\x4b\\xce\\x62\\xd5\\x4f\\xbd\\xf1\\xb8\\xb0\\x8b\\xcd\\x50\\xa2\\x33\\xef\\x8b\\x28\\xe6\\x97\\xe0\\x0d\\xfa\\xc1\\xca\\x3d\\x21\\xfc\\xde\\x05\\x97\\xcb\\xf2\\x61\\x60\\x42\\x47\\x46\\x68\\xa1\\x60\\xcb\\xf2\\x32\\x78\\x39\\x92\\xa9\\x88\\x7b\\x1a\\x81\\x43\\x9c\\x37\\x8b\\x2b\\xf4\\xb9\\x81\\x0c\\x27\\xd6\\xe1\\x5f\\xf0\\xa9\\xff\\x26\\x70\\x51\\x35\\xc1\\x15\\x75\\xb8\\x9d\\x36\\x27\\xce\\x54\\x7c\\x42\\x45\\x1e\\x7c\\xca\\xa7\\xe3\\x17\\x0a\\x1b\\xfe\\xde\\x5a\\xc6\\xa4\\x38\\xdd\\x33\\xb5\\x9b\\x2d\\xcb\\xb4\\x39\\xac\\x3b\\x3e\\x3d\\x6f\\x4c\\xc2\\xf3\\x42\\xb6\\x6c\\x13\\x0a\\x8b\\xdd\\x7a\\xae\\x01\\x18\\xd4\\x83\\x73\\x28\\x54\\x43\\xb1\\xc8\\x7b\\x1a\\x49\\x61\\x19\\x27\\x23\\x3d\\x55\\xb5\\xe0\\x95\\x8d\\xd3\\x05\\x4e\\x73\\x4a\\xc3\\x2c\\xc2\\x11\\x73\\x17\\x12\\x0b\\xdb\\xcd\\xc2\\xc1\\xa3\\xf0\\xdc\\x9f\\x0c\\xc6\\xcd\\x47\\xd0\\xf4\\x8f\\x86\\x89\\x5a\\x77\\xdf\\x7b\\x49\\x67\\x4b\\x78\\x38\\x7c\\x59\\xee\\x96\\x51\\x4f\\x57\\x29\\xc3\\xea\\xe2\\x99\\x82\\x6b\\x68\\x6f\\xbf\\xbf\\xba\\xd3\\x1c\\x6b\\x0b\\x8f\\x76\\xec\\x6f\\x3e\\xb6\\x78\\xe0\\x50\\x4c\\x9f\\x29\\x75\\xfb\\x7a\\xf7\\x0c\\xc7\\x5e\\xd6\\x39\\x83\\xc6\\x9e\\x42\\xc7\\x58\\xce\\x82\\x4e\\xbc\\xa3\\x76\\x44\\x6c\\xae\\xb8\\x5b\\x8b\\x64\\x83\\x5f\\x5a\\x95\\x63\\x36\\xef\\xcd\\x76\\x7c\\xb3\\xb7\\x1b\\x9f\\x4b\\xb3\\xc6\\x3d\\x86\\xb6\\xbd\\xdf\\xba\\x64\\x0b\\x3b\\x98\\x19\\x2d\\x79\\x77\\xdc\\xdc\\xdd\\xb7\\xa0\\x15\\x9f\\x8e\\x4b\\x8d\\x6e\\x6f\\x31\\x45\\xbd\\xc6\\x35\\x6b\\x36\\x31\\xce\\xc6\\x56\\x54\\x90\\x28\\x1b\\xfa\\xd2\\x4e\\x5f\\xa1\\xd6\\x33\\x79\\xa4\\x7a\\x0d\\xe9\\x5b\\xda\\x4b\\x6d\\xa4\\xa6\\xdb\\x95\\xce\\xdd\\xa7\\x77\\x29\\x28\\xd5\\xcc\\x3e\\x3d\\x6e\\x61\\x8a\\xf7\\xe9\\xad\\xe7\\xde\\xa7\\x77\\xe9\\xc7\\x03\\xb5\\x7d\\xfa\\xff\\x6a\\x6f\\xd3\\xf3\\x6f\\xd6\\x5f\\xb0\\xe3\\x69\\xdb\\x2d\\x23\\xe7\\xde\\xac\\x5f\\x77\\xdf\\xde\\xf6\\x0b\\xf4\\x41\\xed\\x5b\\xac\\x69\\x38\\x7b\\xb3\\xfe\\x5e\\xc5\\xf2\\xeb\\x7f\\x44\\xe2\\xd6\\x77\\x99\\x87\\x6b\\x98\\x2f\\x4a\\x25\\xa8\\x6b\\x6a\\x9d\\x77\\x8c\\x92\\x7a\\xc6\\x0f\\xd3\\x2c\\x24\\x9d\\xa8\\x78\\xb4\\x76\\x89\\x3a\\x2e\\x48\\x6b\\x13\\x31\\x24\\x5a\\x0c\\xf7\\x32\\xb8\\x02\\x03\\x1f\\x98\\x57\\xd6\\x7e\\x48\\xd2\\xab\\x65\\xf5\\xa7\\x24\\x46\\x7b\\x34\\xd6\\x98\\x10\\xf2\\xe4\\x65\\x8d\\x45\\xa8\\x98\\x36\\xda\\x85\\xbe\\xb6\\x5a\\x56\\x00\\x33\\x1e\\x3d\\xf8\\x8c\\x22\\x09\\x22\\xa2\\x73\\x63\\x86\\xf3\\x75\\x07\\xc5\\x28\\xf8\\x0b\\x76\\x08\\x8d\\x00\\x02\\xbe\\x50\\x97\\x50\\xfa\\x55\\x02\\x7d\\xcf\\x41\\x87\\x2f\\xff\\x37\\xd2\\x21\\x5e\\xa3\\xc3\\x38\\xd0\\xa1\\x91\\x58\\xcc\\xff\\x73\\x42\\x60\\xc4\\xfb\\x05\\x09\\xb1\\x06\\xd0\\xee\\x85\\x08\\x81\\xfe\\x50\\x87\\xb9\\xd3\\xb4\\xa8\\xe3\\xdc\\xd4\\xff\\xd7\\xdc\\xb9\\xc7\\xb6\\x59\\x5d\\x01\\xfc\\x7e\\xdf\\xe7\\xb7\\x13\\x3f\\xe2\\xf7\\x2b\\x7e\\x24\\xb6\\xe3\\xd8\\xb1\\x63\\x3b\\x71\\xea\\xa4\\x69\\x5a\\xda\\x24\\x4d\\x93\\xa6\\x69\\x28\\x08\\x26\\xca\\x8a\\xe8\\xda\\xae\\x0c\\x5a\\x28\\x5d\\x4b\\x59\\xd7\\x41\\x91\\x3a\\x56\\xca\\xd8\\xba\\xc1\\x18\\x93\\x40\\x8c\\x55\\xd0\\x3f\\x26\\xbf\\x36\\x75\\xc0\\x2a\\x06\\xab\\x50\\x85\\xb6\\x81\\xa6\\x75\\x7f\\x74\\x48\\x30\\xb4\\xa1\\x76\\x93\\x90\\x18\\x02\\xad\\x6b\\xdd\\xdd\\x73\\xee\\xf7\\xd9\\x89\\x1f\\x71\\xa6\\xf1\\x07\\x7f\\x40\\x92\\xcf\\x49\\xbf\\x7b\\xce\\xbd\\xe7\\xde\\x73\\xef\\x3d\\xe7\\x77\\xc8\\xc3\\x0d\\x75\\x11\\xa3\\xba\\x08\\x31\\x5d\\x84\\x94\\xac\\x94\\x8f\\xa8\\x8b\\x10\\xea\\x22\\x2c\\xea\\x02\\x6e\\xc9\\xf4\\x1c\\xba\\x56\\xb9\\xb0\\x11\\x34\\x42\\x9d\\x5b\\xf1\\x9a\\x0c\\x34\\x12\\x68\\xa8\\x91\\x90\\xa8\\x91\\x98\\x31\\xd7\\xbf\\xa4\\x46\\x24\\x3f\\x77\\x39\\xfc\\xd8\\x02\\x73\\x71\\x23\\xad\\x31\\xb2\\x82\\x4e\\x74\\x6f\\xcb\\x03\\x12\\x50\\x56\\x2e\\xea\\x45\\xf2\\x9f\\x46\\xe9\\x7a\\x7c\\xaa\\xa1\\x66\\xb2\\x54\\x33\\x69\\xa6\\x99\\x34\\x73\\x9d\\x36\\x56\\x5c\\xa7\\xb5\\x29\\x69\\x19\\x06\\x4d\\xa5\\x53\\x39\\x2f\\xb8\\x45\\xcc\\x8d\\x02\\xad\\xad\\xa2\\xd3\\xfc\\x7a\\xf6\\xd3\\x7a\\x71\\xff\\x3d\\xa0\\xc5\\x0b\\x0c\\xd0\\xe5\\x8d\\xa2\\xb7\\x94\\x1b\\x85\\xf9\\xa8\\x68\\x76\\x2a\\xb0\\xba\\xdd\\x7a\\xb8\\xae\\x20\\x58\\x1f\\x88\\x69\\x2f\\x6d\\x64\\xda\\xcb\\xc2\\x6f\\x2e\\xa5\\xbd\\xfa\\x28\\x38\\xc9\\xd0\\x6a\\xcf\\x81\\x96\\x50\\xeb\\x3d\\xb5\\x8e\\xd2\\xe1\\xaa\\x82\\x3f\\xad\\xf5\\x90\\x9a\\x6a\\xfc\\xd1\\x1a\\x1f\\xe9\\xda\\x37\\x24\\x23\\xfd\\x5a\\x83\\x5c\\x5e\\x60\\xc7\\xcd\\x53\\x7b\\x55\\x13\\x0d\\xd1\\xc1\\x4d\\x25\\x63\\x4f\\xca\\x90\\x4e\\xaa\\x21\\x12\\x18\\x4f\\x26\\x43\\x04\\xd0\\xd2\\x08\\x4a\\x83\\x08\\x22\\xa5\\x1b\\x07\\x5d\\xb6\\x06\\x45\\xea\\x87\\x19\\xe7\\x97\\x7f\\xbf\\xc8\\xbd\\xf6\\xce\\xb5\\xed\\x53\\x74\\x4a\\x39\\xc3\\xcf\\x9c\\xb9\\x7a\\xf5\\x8c\\x7c\\x1d\\x9b\\x39\\xea\\xdb\\xb2\\xf1\\x73\\x69\\x4b\\xbe\\x4d\\x57\\xdb\\x12\\x30\\x79\\xa9\\x25\\x7f\\xa4\\x36\\x2d\\xb6\\x44\\xca\\x5a\\x92\\xda\\x71\\x12\\xdb\\x61\\x24\\x73\\x4b\\xb6\\xa3\\xa3\\x45\\x3b\\x4c\\x62\\x3b\\x8a\\x6d\\xed\\x7a\\x83\\x78\\xf6\\xbd\\xb0\\x29\\x68\\x74\\x52\\x6b\\x7c\\xcc\\xae\\xa4\\x06\\xed\\x16\\x6d\\x07\\xe6\\x92\\x97\\xb0\\x4d\\x60\\x33\\x66\\xb4\\x9a\\xa7\\xc4\\xdb\\x0a\\x2b\\x6d\\x95\\x3b\\x25\\x9e\\x4a\\x71\\x0c\\x2c\\x09\\xf1\\xc0\\xf1\\x34\\x00\\xf3\\xc1\\x52\\xba\\x53\\x98\\x2a\\x6c\\xbb\\x90\\x77\\xd3\\x56\\xba\\x6d\\x88\\x5f\\xee\\xa4\\xad\\xb4\\x61\\xfa\\x95\\xcd\\xa1\\x8e\\x16\\xb5\\x6e\\x1b\\xf5\\x54\\x39\\x66\\x2f\\x5c\\xa2\\xa4\\x65\\xdb\\x11\\x2f\\x3e\\x66\\x46\\x85\\x49\\xc5\\x36\\xd8\\x16\\x2a\\x0c\\x16\\x80\\x68\\x44\\xdc\\x54\\xbb\\xdd\\x71\\xcc\\xe0\\x01\\x98\\xab\\x39\\x55\\x7b\\xb7\\xc4\\x2c\\xa1\\x29\\x8d\\xf6\\xa5\\xda\\xe1\\xde\\x8e\\x6a\\x28\\xbf\\xdd\\x32\\x29\\xfd\\x3f\\x19\\x49\\x45\\x7f\\xab\\x1b\\xd2\\x22\\x93\\xfb\\x0d\\xf9\\x03\\x24\\x44\\x86\\xc9\\x87\\xa4\\x10\\xc0\\x5b\\x1d\\x89\\xb2\\x9e\\x51\\x01\\xe2\\x31\\x67\\x4f\\x70\\xb9\\x91\\x44\\x4e\\x7f\\xa1\\xa8\\xd3\\x13\\x5d\\x34\\x1f\\xd6\\x5f\\x82\\x1c\\xea\\xa2\\xce\\xe1\\xa1\\x3f\\x25\\xf5\\x97\\xe8\\x3c\\x9c\\xf7\\xd0\\x87\\x2b\\xab\\xfc\\x1a\\x9d\\x1e\\xf8\\x35\\x7a\\x5d\\xfc\\x3c\\x97\\xb7\\x3b\\xe0\\x7b\\x87\\x9d\\xb1\\x6c\\x8c\\xc7\\x5e\\xdf\\x87\\x74\\x13\\x9d\\xa1\\xd8\\xae\\x73\\x98\\x60\\x0a\\x2a\\x1a\\xf4\\x76\\xe0\\xd6\\xc0\\xff\\xe1\\xb9\\x13\\x9e\\x17\\xe8\\xc3\\x05\\x80\\x13\\x5b\\xb6\\xd0\\x0e\\x34\\xc9\\x2c\\x5c\\x0c\\x17\\xdb\\x0d\\x36\\x27\\x02\\x4e\\x2a\\xdf\\x21\\xd8\\x24\\x4c\\x10\\x57\\x94\\x4b\\x1a\\x8b\\x72\\x8d\\x99\\x4d\\xf3\\x19\\xb8\\x30\\xf5\\x90\\x2c\\xd6\\x57\\x5e\\xe4\\x33\\xc5\\x39\\x76\\x7b\\x14\\x86\\xd4\\x85\\x21\\x9b\\x72\\x71\\xf9\\xf8\\x85\\x27\\x85\\x33\\xa3\\x7b\\x9e\\xd9\\x6a\\xcf\\x0c\\x24\\x4d\\xe6\\xa1\\x54\\x79\\xf4\\x74\\xef\\xb6\\x91\\x4f\\xa3\\x73\\xc1\\x7f\\x0c\\xbf\\x70\\xc7\\xae\\xa1\\x3d\\x3f\\xbb\\x67\\xdb\\x4f\\x0f\\xae\\xfd\\xa8\\x73\\x68\\x53\\x32\\xba\\x21\\xd3\\x19\\xc8\\x6e\\xe8\\x89\\x6d\\x5c\\xe1\\xe3\\xce\\xef\\x38\\xf3\\xd8\\xbc\\xd6\\xe4\\xee\\xe8\\xbd\\x33\\x3b\\xf9\\x7c\\xd4\\xbb\\xca\\x37\\xe4\\x1e\\xf1\\x8d\\x3e\\x1d\\xfd\\x56\\xf9\\xdc\\xd9\\x43\\xe7\\x9f\\x98\\x9b\\x3e\\x5a\\x7c\\x70\\xdd\\xfd\\x5b\\x12\\xe1\\xd9\\xaf\\xcf\\x6d\\xbe\\x77\\xbd\\x3f\\x3c\\xb3\\x97\\xda\\x14\\x63\\x35\\x9f\\x20\\x0e\\xe2\\x24\\x23\\x50\\x7d\\x53\\xe2\\xb3\\xc2\\xbc\\x5f\\x08\\x62\\x6d\\x47\\x05\\xb0\\x6b\\x8a\\x2b\\x82\\xfd\\x74\\x0f\\xec\\xa1\\x9b\\xb2\\x28\\x2f\\xa1\\x2c\\xab\\xfc\\xd6\\x95\\x4d\\xf8\\xad\\xa3\\x70\\xbc\\x0f\\xbe\\xbc\\x6b\\x24\\x8b\\x29\\x08\\x0a\\x4f\\xb0\\x1f\\x8b\\xe3\\xb4\\x75\\xe4\\x7b\\xa3\\x38\\x4a\\x19\\xd5\\x35\\x1f\\xec\\xc7\\x44\\xd3\\xa6\\x74\\xd7\\x25\\x02\\x47\\xea\\xc1\\xaf\\x1f\\xc6\\x5b\\x1d\\x42\\x34\\x41\\xc3\\xca\\x7e\\xd3\\xec\\xd0\\x01\\x7d\\x07\\x64\\xc6\\xa2\\x1f\\x65\\xa6\\xe3\\xb8\\x17\\x66\\x21\\x03\\xe6\\x6c\\xc8\\x16\\xae\\x90\\x01\\xb1\\x4c\\x24\\xc7\\xca\\xa7\\x59\\x18\\xa6\\x57\\x2b\\x72\\x4a\\x3d\\x16\\x88\\xb3\\x30\\x84\\x23\\x2c\\xf7\\x3f\\x40\\x5d\\x83\\xa2\\x99\\xd3\\x86\\xea\\xe2\\x0e\\x1a\\x41\\x64\\x61\\xbe\\x6e\\x05\\x92\\x1d\\x05\\xd7\\x70\\x69\\x98\\xac\\xe0\\x91\\xe6\\xf7\\x2f\\x80\\x4c\\x30\\xf3\\xb7\\x92\\xe9\\x5e\\xf0\\xf2\\x96\\x96\\x89\\x1f\\xab\\x9e\\x65\\x32\\x99\\x4e\\xa2\\x4c\\x2e\\xea\\xef\\xde\\x26\\xca\\xe4\\x5f\\x24\\x53\\x44\\x56\\x71\\x72\\x17\\xd4\\x68\\x94\\x3c\\x5c\\x37\\x87\\x29\\xd0\\x70\\x3b\\xac\\xb0\\xda\\x1c\\x06\\x31\\x56\\xc4\\x0e\\xf8\\x1d\\x3f\\x93\\xaf\\xaf\\xb1\\x7c\\x8b\\x0e\\x27\\x9b\\xf3\\x7f\\xdf\\x10\\x8f\\x24\\x5b\\x60\\x80\\x05\\x41\\x5c\\x70\\xae\\xbd\\x55\\x03\\x04\\x96\\xe4\\x3c\\x81\\x72\\x0e\\x92\\x49\\xf2\\x90\\x28\\xe7\\x88\\x24\\xa7\\x17\\x4c\\xb8\\x97\\x9a\\xf0\\x60\\xaa\\x98\\xf2\\xf6\\x52\\x13\\xb6\\x51\\x13\\x06\\xc3\\x66\\x2a\\x58\\x0b\\x2a\\x58\\x8f\\x2a\\xc8\\x50\\x15\\x64\\xd0\\x45\\x43\\x15\\x4c\\x71\\x10\\xc6\\xc7\\x54\\xb0\\x8a\\xaa\\xc0\\xe6\\xed\\x15\\x55\\x90\\xef\\xc6\\x8a\\x57\\x6b\\x47\\x50\\x09\\x93\\x18\\x2a\\xe2\\xed\\xc5\\xdf\\x6c\\xb4\\xd2\\xb4\\x38\\x52\\x6c\\xae\\x9f\\xfd\\xad\\x6c\\xd8\\xda\\x4a\\x73\\x5f\\x6a\\x66\\xcc\\xd7\\x8e\\xd6\\xb2\\x95\\xe5\\xa2\\x2e\\xd9\\x5a\\xde\\x43\\xd7\\xa8\\x59\\x88\\x0f\\x41\\x6d\\xc6\\x17\\x8d\\x9a\\x0c\\x5d\\xca\\xbb\\x13\\xb9\\x0d\\xe9\\x92\\x93\\x2d\\xe5\\xab\\x53\\x88\\x51\\xa1\\x2a\\x8c\\xe8\\x2f\\x15\\x2d\\x11\\x38\\x7b\\xf2\\xb2\\x45\\x3b\\xc2\\xa2\\x12\\xa8\\x3e\\x8b\\xe3\\xda\\x24\\x7d\\x3e\\xc2\\x9e\\x8f\\x24\\x4a\\xe3\\x6c\\xfd\\x06\\xac\\xca\\x88\\x17\\xe2\\x43\\x0c\\xf1\\x0c\\x5b\\x44\\xe2\\x6c\\x70\\x41\\xb4\\x48\\xde\\xd9\\x4d\\x27\\xcf\\x9e\\xd9\\xc6\\x6b\\x78\\xc3\\x33\\xa5\\x4c\\xb3\\xf0\\x90\\x3a\\xfd\\x1e\\xae\\x5d\\xe9\\xf7\\xd4\\xe8\\x53\\x53\\xe7\\xdd\\xd6\\x69\\xf8\\x9b\\xb5\\x6e\\xad\\x69\\xb1\\x4d\\x9e\\xad\\xf5\\x04\\x04\\x72\\x84\\x7c\\x2a\\x1c\\x95\\x25\\xc4\\xbc\\xdd\\x21\\x92\\x33\\x25\\x4a\\x6a\\x0d\\x71\\x62\\xae\\x75\\x9e\\xd3\\x60\\x56\\x88\\x47\\x43\\x1c\\x70\\x6a\\x81\\xb9\\xbb\\x39\\x7b\\xaa\\x44\\xfd\\x01\\x2f\\xfd\\x8d\\x40\\x0a\\x32\\x77\\x45\\x58\\x84\\xbc\\x85\\x42\\x8e\\x08\\xb2\\x32\\x0f\\xf7\\xaf\\xbe\\xa4\\xdf\\x08\\xf7\\xaf\\xce\\xfe\\xa0\\x95\\xb7\\x76\\x27\\x9c\\x40\\x88\\x45\\xa2\\x3e\\x6d\\x15\\x9f\\x78\\xeb\\xad\\xd7\\x5c\\x7d\\xbe\\x0e\\x7b\\x30\\xda\\xe1\\x8c\\xf9\\x4c\\x26\\x5f\\x8c\\xdf\\xea\\x88\\x07\\xcc\\x8e\\x60\\xcc\\x64\\x8f\\xf9\\xcd\\x66\\x7f\\x8c\\xb6\\x76\\xe4\\xfa\\x7e\\xe1\\x1c\\x6d\\xb7\\x13\\xe9\\x7a\\x77\\x91\\x82\\x89\\xb0\\x39\\xa4\\x42\\x0c\\x2f\\x68\\x90\\x4e\\xcf\\x60\\x7b\\x2e\\x6a\\x4e\\x2e\\x03\\x23\\x53\\x8b\\xe5\\x70\\x5c\\x84\\x95\\xfc\\x89\\x19\\x7f\\xa1\\x96\\x5b\\x4c\\xde\\x90\\x18\\x8f\\xa2\\xc1\\xab\\xdc\\x88\\x89\\xed\\x11\\xfd\\xc6\\x22\\xd1\\x75\\xc6\\xc5\\x60\\x14\\x6d\\x83\\x60\\x14\\x2a\\x5c\\x35\\x16\\xc5\\x54\\x8d\\x45\\xa1\\x5d\\x1f\\xc6\\x5e\\xee\\x9a\\xf0\\xad\\x2e\\x4c\\x8c\\x4d\\x41\\x4f\\xcf\\xcd\\x4c\\xe6\\xe6\\xd7\\x4c\\xfd\\x53\\xad\\xbd\\x62\\xf5\\x40\\xb7\\x3e\\xa7\\xf7\\x1a\\xb7\\x1f\\xb0\\xb3\\xbe\\xd4\\x6a\\xf6\\x6d\\x3b\\xb2\\xe6\\xd5\\x43\\xd0\\x9f\\x9e\\x63\\xb7\\x3d\\xb5\\xf6\\x57\\x0f\\x44\\x67\\x02\\xdc\\xef\\x95\\xb4\\xf3\\xca\\x0f\\xca\\x85\\xe7\\x9f\\xde\\x3a\\x49\\x65\\x47\\xe6\\x2f\\xae\\x11\\x3e\\xd2\\x4d\\x6e\\x65\\xb2\\x63\\xd1\\x11\\x28\\x2c\\x25\\x86\\x00\\x70\\x58\\x0c\\x10\\x2f\\x8a\\xa9\\x2d\\xc8\\x20\\x1c\\x9e\\x55\\xe3\\xb6\\xa6\\x60\\x3b\\x88\\x57\\xc4\\x6d\\x32\\x3a\\xb8\\xdd\\xfe\\x00\\x1c\\xad\\xc2\\x6e\\xd8\\xd4\\x05\\xa2\\x2b\\x4d\\x18\\x92\\xc6\\x6e\\xf3\\x9b\\x42\\x80\\x61\\xed\\x6b\\x02\\x02\\xbe\\x0a\\x4b\\xde\\x92\\x30\\x60\\xd9\\x14\\x5b\\xf1\\xbe\\x20\\xb2\\x00\\x95\\xa1\\x19\\xd4\\xb8\\x1f\\xd6\\xba\\x25\\x85\\x11\\xee\\xaa\\x9c\\x67\\x48\\xf2\\x9c\\x44\\x79\\xc2\\x40\\xb3\\x5c\\x4a\\x9e\\x9e\\x26\\xf2\\x44\\xe0\\xfa\\x1e\\x66\\x7b\\x3f\\x00\\xb8\\x4b\\xee\\x40\\x57\\x30\\x8c\\x62\\x75\\xe4\\x4d\\xdd\\xcb\\x17\\x4b\\x5c\\xf9\\x9a\\x48\\xf6\\x24\\x5b\\xf0\\x5a\\xc8\\xb6\\x67\\xc1\\xfe\\x8a\\xc9\\xb6\\x1b\\x65\\x1b\\x20\\xeb\\xc9\\xc9\\xa5\\xa4\\xcb\\xf5\\x63\\x9a\\x73\\x88\\xcd\\xca\\xc3\\x74\\x56\\x9e\\xaa\\x48\\xeb\\x87\\x73\\x08\\x31\\xed\\x62\\x91\\xe4\\x74\\x4b\\x90\\x1b\\x83\\x0f\\x07\\xd9\\x87\\x83\\x09\\x31\\x86\\x2f\\xbf\\x81\\xaa\\x24\\x0a\\x49\\xdf\\x4a\\x88\\x61\\x1f\\x1b\\x44\\x77\\xbf\\xa2\\x88\\x7c\\x08\\xfc\\xd5\\xf5\\x2d\\xc7\\x6c\\x8b\\x00\\x94\\x26\\x9a\\x9a\\x6b\\xcd\\x04\\x6b\\xa1\\xc5\\xcb\\x2d\\x89\\x61\\x30\\x76\\x90\\x87\\x8c\\xb6\\xd0\\x43\\x62\\xc0\\x44\\x36\\x80\\x2a\\x3d\\x69\\x3a\\x05\\xe7\\x35\\xe0\\x1a\\xf4\\x25\\x20\\x21\\x93\\xe4\\x35\\x61\\x04\\x32\\x00\\x8a\\x96\\xb7\\xe1\\x6a\\x64\\x69\\x01\\x45\\x86\\x11\\xbe\\x5c\\x30\\x32\\x67\\x84\\x2b\\xeb\\xe5\\xd0\\x91\\xe5\\x6f\\x8b\\x23\\x9f\\x27\\x3b\\xca\\xa7\\xb1\\x46\\x99\\x8b\\xf4\\x93\\x1d\\xe2\\xbe\\xdb\\x2f\\x95\\x27\\x8b\\xc9\\x10\\xc1\\xc3\\x25\\xa4\\x93\\x3b\\x15\\x1d\\xe4\\x4e\\x77\\xaa\\x52\\xa6\\x2c\\x24\\x96\\x29\\x83\\xf3\\xbb\\x10\\x2b\\x4f\\xe6\\x67\\xa7\\x97\\x50\\x1b\\x01\\x2e\\x81\\x62\\xd5\\xf2\\x64\\x39\\xce\\x88\\x50\\x65\\x53\\x83\\x22\\x65\\x71\\x3e\\x6c\\x14\\x5a\\x54\\x29\\x5b\\xbb\\xf7\\x89\\x59\\xe7\\xca\\x91\\x21\\x8b\\xac\\xae\\x4c\\x59\\xf9\\xb4\\xe2\\xd5\\xba\\x42\\x65\\x6d\\xf6\\x2e\\x5b\\xf9\\x2e\\x61\\xac\\x41\\xad\\x32\\x99\\xd8\\x67\\xbb\\xb1\\xcf\\x56\\x52\\x6f\\x7d\\x7f\\x6d\\xaf\\x01\\x5b\\x72\\x26\\x5d\\x8a\\x33\\x3b\\xb8\\x81\\xda\\xc1\\xe6\\x44\\x2e\\x72\\xa1\\x94\\x66\\x23\\x3c\\x6d\\x80\\x6d\\x59\\x69\\x92\\x8d\\xf2\\x79\\x2a\\x7f\\x3a\\x42\\xbd\\x77\\x8d\\xd1\\x1a\\xc6\\x02\\xb4\\xa3\\x50\\xdd\\x28\\x37\\xd9\\x91\\xf3\\x64\\xeb\\xfa\\x3d\\x1f\\x07\\xba\\xf3\\xdc\\x72\\xfa\\xbf\\xd5\\xc8\\x5f\\xee\\xd8\\x48\\xb6\\x36\\x85\\x65\\x8d\\x1c\\xc5\\xa6\\x96\\x16\\xc1\\x13\\xc5\\xf5\\x8f\\x85\\x8f\\xe5\\x3a\\xba\\xc6\\x47\\xc8\\x77\\xc4\\xe8\\x60\\xbd\\x70\\x09\\xaf\\x25\\xb1\\x28\\x05\\xe6\\x42\\x6a\\xe8\\x37\\x02\\x56\\x4a\\x56\\x5d\\x2a\\x69\\x75\\x56\\xa1\\x9d\\xba\\x78\\xea\\x4a\\xd1\\x64\\xa8\\xae\\xe5\\x62\\xb1\\xf5\\x90\\xc2\\xa9\\x49\\x15\\xf4\\x48\\xa7\\xd0\\xb7\\xab\\x59\\x02\\xab\\x1f\\xea\\x26\\x0b\\xd6\\x2c\\xac\\x1a\\x45\\xa5\\x02\\x71\\x9d\\x24\\xaf\\xef\\xc0\\x19\\x26\\xaf\\x85\\x42\\xcf\\xc4\\x05\\x85\\x9e\\x35\\x22\\xcc\\xdb\\x64\\xe8\\x80\\xf5\\x7f\\x70\\x41\\x6e\\x58\\x25\\x54\\x04\\xb9\\x79\\x46\\x36\\xea\\x14\\xbf\\xfe\\xb9\\xfb\\x06\\x27\\xaf\\x2e\\xbf\\xce\\xb5\\x97\\xff\\xc5\\x0d\\x5f\\xfb\\xb7\\x6b\\xdc\\xb3\\xf9\\xe8\\xd6\\xf4\\xc5\\x8d\\x37\\x86\\xfa\\x15\\xda\\x81\\x3e\\x2f\\x55\\x20\\x7f\\x84\\x1b\\xe7\\x36\\xd8\\x6d\\xde\\x73\\xe5\\x37\\xde\\x2c\\x3f\\x71\\xce\\x6f\\x75\\xcc\\x3e\\xf7\\xd9\\xe9\\xbf\\x7c\\xb4\\x72\\x90\\x3f\\x9d\\x99\\xea\\xdb\\x5d\\xc4\\xb9\\x41\\x71\\xfd\\x7d\\x99\\x4a\\xf8\\x1d\\xb5\\xae\\x0d\\xec\\x2c\\x18\\x28\\xc9\\xb9\\x58\\x3a\\xef\\x52\\x5d\\xca\\x0d\\xb0\\x22\\x49\\x39\\x7d\\x3a\\x3f\\x41\\x7f\\xdc\\x94\\x2a\\x4d\\x5b\\xbb\\xa1\\xa2\\xda\\x34\\x90\\xae\\xe7\\x51\\x0f\\x62\\x3d\\x09\\x38\\x03\\x98\\x6e\\x83\\x82\\x63\\xb9\\x69\\x03\\xc6\\xf3\\x41\\x95\\x1a\\x38\\xeb\\x1d\\x4d\\x42\\x89\\xb9\\xd8\\xc0\\x04\\x0c\\xbb\\x69\\x63\\x49\\x13\\x19\\x5a\\xb3\\x16\\x01\\x95\\x1d\\x05\\x57\\xb7\\x3e\\xcb\\xa8\\x22\\x3e\\x80\\x6f\\x80\\x1b\\xec\\x8f\\x60\\xd8\\x43\\x1e\\xa8\\x05\\xb9\\xe9\\x8e\\x02\\x49\\x8e\\xb2\\x3b\\xf5\\xdc\\xea\\xfa\\x4b\\x2a\\xe9\\x82\\xcf\\x5f\\xd9\\x79\\xa0\\xbe\\xc2\\x0b\\xd5\\xc6\\xcc\\x15\\x10\\xa9\\x99\\x01\\xb1\\xac\\x49\\x30\\x0d\\x9a\\x54\\x28\\xb2\\xb7\\x1f\\x5a\\xe3\\x4a\\x27\\x7a\\xf4\\x86\\xde\\xe4\\xa0\\x6b\\x62\\xef\\x6c\\xa4\\x3c\\xcf\\xd9\\x7a\\x86\\x02\\xae\\x58\\xa4\\xd7\\x7e\\xe0\\x86\\x13\\x5b\\x3c\\xab\\x47\\x07\\x8c\\x5d\\x77\\x64\\x46\\xee\\xdf\\x3a\\xfc\\x87\\x89\\x35\\x36\\xa7\\x20\\x68\\x95\\x6a\\x39\\x6f\\x75\\x38\\xe3\\xdd\\x16\\x6e\\xdf\\xbb\\xfc\\x8a\\x91\\x54\\x9a\\xbb\\x78\\xec\\xec\\x81\\x8c\\xde\\xee\\x33\\x1a\\x7c\\x0e\\xfd\\xc0\\x57\\xbe\\x7f\\xfb\\x4f\\x66\\x77\\x8c\\x3a\\x74\\xae\\xb0\\xf3\\x87\\xeb\\x66\\x75\\xb6\\x4e\\x63\\x57\\xa2\\x7f\\xdf\\xeb\\x2f\\x3e\\x7f\\xda\\x6e\\x14\\x8c\\xa6\\x35\\x47\\x33\\x37\\xdd\\xe3\\x54\\x2b\\x79\\x93\\xcf\\x3f\\x71\\x77\\x60\\xe7\\xcd\\x3b\\xd9\\x1e\\x9d\\xc5\\x08\\x1e\\xc1\\x18\\x41\\xc8\\x7d\\x78\\xb4\\x41\\x94\\x20\\x60\\x5c\\xfa\\xd2\\x62\\xbd\\xaa\\x5c\\x57\\x0a\\xd3\\x20\\x58\\xd4\\x60\\xd1\\xac\\x54\\xa9\\xa2\\x15\\x48\\x65\\x42\\x04\\x59\\x17\\x3b\\xf1\\x71\\x0f\\x9b\\x09\\x20\\x3f\\x42\\xa5\\x81\\xca\\x12\\x50\\xb1\\x2a\\xcb\\x8a\\xa8\\x08\\xd9\\x7c\\x8f\\x92\\x3e\\x93\\x75\\xf5\\x65\\x17\\xc4\\x1b\\xe6\\xf5\\x0e\\x64\\x69\\x2d\\x8a\\x3b\\x6c\\x61\\xf0\\xd5\\x98\\xc4\\xcb\\xcb\\x49\\x55\\xac\\x06\\x2c\\xca\\xf8\\x65\\xc4\\x51\\x72\\xa4\\x2c\\x33\\x08\\x36\\xea\\x07\\x29\\xe8\\x3a\\x06\\x20\\x2c\\x45\\xba\\xc4\\x8b\\x58\\x2c\\xac\\xd9\\x2b\\xc1\\xe6\\xb0\\x46\\x29\\x2f\\x13\\x6b\\x94\\x8a\\x1e\\x4b\\x99\\xb9\\x26\\xd5\\xc3\\x5d\\x8e\\xfe\\x1b\\xb7\\x08\\xfb\\xe8\\xde\\xda\\x07\\x31\\x99\\x1a\\xcc\\x81\\xa6\\xfb\\x68\\x5f\\xaa\\xe8\\xd1\\x58\\xe8\\x3e\\x9a\\xa7\\xfb\\x68\\x03\\xc6\\xa1\\xfb\\x13\\xf9\\x00\\x56\\x85\\xb4\\x20\\x31\\x29\\xcf\\x6b\\x44\\xd0\\x43\\xf3\\xad\\x6f\\xae\\xd5\\xd6\\x76\\xc9\\x73\\x28\\x6e\\x01\\xff\\x90\\xc0\\x46\\xe8\\xa8\\x50\\x61\\x1b\\xfe\\x5f\\x9f\\xc9\\x16\\x7e\\x26\\x5b\\xfc\\x99\\x6a\\xe1\\x67\\xaa\\xea\\x67\\xdc\\x1c\\x7f\\x91\\x2f\\xc9\\x13\\xc4\\x4e\\xd7\\xa3\\x9c\\x39\\x51\\x12\\xb0\\x22\\x2c\\x52\\x85\\x58\\x56\\x2c\\x4b\\x89\\x25\\xc0\\xb5\\x03\\x66\\x10\\x12\\xad\\x20\\xbf\\x5b\\xb0\\x20\\x29\\xb6\\xc2\\x23\\x98\\x3b\\x78\\xe8\\x3e\\x4f\\x7f\\xb7\\xb9\\xa3\\xdd\\x19\\xb1\\xf6\\x64\\x03\\xbe\\xd1\\x84\\x5b\\xf8\\xd1\\xe6\\xf3\\x87\\x77\\xb9\\xb2\\x99\\x84\\x41\\x6b\\xd2\\x5a\\x93\\xdd\\x9d\\x74\\x02\\x73\\xa7\\xc6\\xe9\\x7b\\x13\\xf4\\xbd\\x27\\xa5\\xf7\\xda\\x13\\x25\\x43\\xf5\\xbd\\xf2\\x0b\\x10\\xe9\\x51\\x90\\x03\\xe3\\x88\\xc8\\xb5\\xd5\\xf7\\x22\\x8a\\x27\\x2c\\xf1\\xa4\\xd9\\x8d\\x11\\x97\\x70\\x27\\xe9\\x4b\\xdb\\x9c\\xbd\\xf4\\xa5\\x5d\\xbe\\x95\\x09\\xf7\\x81\\x43\\xc2\\x3a\\x57\\x76\\x90\\xbd\\x32\\xd5\\x25\\xbe\\x32\\x32\\x7f\\xfe\\x30\\xc8\\x9b\\x2c\\x9f\\xe2\\x9f\\x24\\x57\\xfe\\x97\\xf7\\xca\\x1b\\xbe\\x37\\xb9\\xe8\\xbd\\x54\\xd8\\x83\\x87\\x3e\\xae\\x4a\\x0a\\xaf\\xb5\\xd1\\xd7\\xf6\\x6e\\x86\\xd7\\x22\\xf3\\xf2\\xa2\\x70\\x02\\xe5\\x4d\\x02\\xcd\\xcf\\x8c\\xd6\\xce\\x94\\x9d\\x73\\x33\\x6b\\xaf\\xd3\\x37\\x24\\x1c\\x03\\x83\\x34\\x40\\x9f\\x06\\x1c\\xf0\\x34\\xd0\\xa3\\x66\\xa6\\xee\\x80\\xa4\\x4c\\x41\\xc6\\x4a\\x69\\x37\\xea\\x8f\\x60\\xa3\\x87\\x47\\x69\\x1f\\x41\\xb3\\x4d\\xd0\\xec\\x08\\xeb\\x23\\xee\\x54\\xf5\\x61\\xcb\\x8e\\xeb\\x6d\\xd2\\x9f\\x3c\\xd9\\x4e\\xe5\\xdb\\x53\\x95\\xcf\\x9e\\xc8\\x25\\xd3\\xa2\\x72\\x11\\x11\\x92\\x6a\\xa0\\x5f\\x38\\x87\\x84\\x08\\xe4\\x38\\x7d\\xda\\x19\\x87\\xa7\\x9d\\xdd\\xa2\\x7c\\x9d\\x90\\xde\\xe1\\x48\\x32\\xf9\\x1a\\xe9\\x3f\\xd8\\xe8\\xe1\\xf6\\x4a\\x9f\\x44\\x56\\x88\\x7d\\xc2\\xa5\\xeb\\xfb\\xa9\\xd9\\xf8\\xf8\\x6a\\xb3\\x61\\x03\\xf2\\x95\\x4f\\x09\\x7b\\x70\\xdc\\x7c\\xee\\xf2\\xd9\\x3e\\x6f\\xf9\\x9a\\x8c\\xc3\\x5d\\x4d\\x87\\x27\\xb5\\x8b\\x2c\\x77\\x8a\\xff\\xb3\\x10\\x5d\\xc8\\xb7\\xd3\\x32\\xbe\\x9d\\x76\\x11\\xdf\\x4e\\xc3\\xf8\\x76\\x9a\\xe6\\x7c\\xbb\\xac\\x7f\\xc5\\x74\\x34\\x3a\\x03\\x01\\x4a\\x33\\xd1\\xe8\\xf4\\x0a\\x3f\\xbf\\xab\\x67\\x72\\xd0\\x0b\\x4c\\xa5\\x9e\\x09\\xf8\\x3a\\x81\\xbc\\xe3\\xeb\\x1f\\x08\\xef\\x50\\x7d\\x32\\x3e\\xf3\\xcd\\x62\\x05\\xb7\\xae\\xa1\\xb4\\x44\\x69\\xce\\x3b\\xfa\\x52\\x29\\xf1\\x6e\\xa2\\x21\\xa0\\x59\\xcc\\x0e\\x2c\\xa5\\xd8\\x02\\x38\\x0a\\x93\\xb8\\x5c\\x0f\\xbe\\xb0\\xb9\\xb3\\x87\\xc5\\x74\\x0d\\xb5\\x58\\xd4\\x6a\\x7f\\xd6\\x58\\xc2\\x03\\x3e\\x6f\\x06\\x00\\x46\\x19\\xaf\\x6f\\x20\\x6c\\xe1\\xb6\\xd4\\x3d\\x99\\xb7\\x84\\xa8\\x10\\x99\\xb0\\xd5\\x1a\\xce\\x50\\x61\\x42\\x96\\x3d\\x9e\\x34\\x14\\x3d\\x4c\\x53\\x67\\x16\\x7e\\x0d\\xbe\\x2e\\xf9\\x33\\x9b\\x93\\xaf\\x90\\x5b\\xa8\\xc5\\x6c\\xa1\\xeb\\x9d\\x95\\x48\\x4b\\x9c\\x5c\\x4f\\xd4\\xe2\\x12\\x07\\x47\\x64\\x08\\xe8\\xbd\\xc2\\xcd\\x1d\\xbb\\xfc\\xc9\\x71\\xee\\xfc\\x38\\x37\\x71\\xfc\\xbd\\xf2\\x95\\xe3\\xb4\\xaf\\x08\\xfd\\xdb\\xf7\\xf1\\x6f\\x3b\\x1b\\xfc\\x6d\\x5e\\xce\\xd8\\xb9\\xf4\\xdf\\x08\\x32\\x08\\x1d\\x47\\x3e\\xb9\\x7c\\x0c\\xe8\\x73\\x1f\\x70\\x8a\\xf7\\x8e\\x97\\x5f\\x1e\\x47\\xe6\\x1c\\x47\\xc2\\xd7\\xdf\\x17\\xfe\\x44\\xb5\\x9d\\x22\\x5f\\x26\\x85\\x3e\\xd0\\x7f\\x88\\xee\\xc0\\x74\\xb0\\x58\\x5a\\x15\\x97\\x4a\\x84\\xeb\\xd3\\xb1\\x78\\x30\\x28\\x87\\x12\\x48\\x95\\x54\\x4a\\x7c\\xe0\\x4a\\xe7\\x55\\x32\\x28\\x68\\x58\\x34\\xf6\\xe9\\x54\\x0c\\x9a\\xcc\\x5f\\xc8\\xfb\\xda\\x19\\x24\\xd9\\x07\\x37\\xc4\\xea\\x14\\xf8\\x1b\\x24\\x84\\x58\\x49\\x2a\\xcc\\x18\\x3a\\x6a\\xb4\\x7b\\xc1\\xb3\\x63\\x85\\x00\\x14\\x4a\\xbf\\xd2\\xaf\\xe3\\xa8\\x93\\xa7\\xf4\\xe3\\xf9\\x57\\xc5\\xcb\\x0b\\x47\\xd7\\x70\\xfc\\xdd\\xd1\\x6d\\x8e\\x3b\\x1f\\x7a\\x7a\\xee\\xec\\xe1\\x99\\x8e\\x70\\x66\\xd3\\xf0\\xad\\x8f\\x7b\\xb9\\xbf\\x4e\\x94\\x27\\x78\\x8e\\x7b\\x6e\\xb2\\xfc\\xaa\\xe7\\xb1\\x9d\\xab\\x76\\xad\\xb8\\x7d\\xea\\x99\\x6d\\x5b\\x9f\\x3d\\x7c\\x93\\x89\\xfb\\xf1\\x19\\x59\\x9f\\xd6\\xdc\\xf6\\xf2\\xbd\\xcf\\x6e\\x8f\\x3f\\xfa\\xa6\\x3d\\x13\\xef\\x3c\\xb0\\xff\\x65\\xa3\\xaf\\xcd\\x7b\\xe6\\xd0\\xc3\\xc3\\x03\\x2f\\x8e\\xad\\x5b\\x79\\xdf\\x0b\\x3b\\xa9\\x1d\\x07\\xf9\\xef\\x0a\\xef\\xca\\x6d\\x44\\x49\\xcc\\x10\\x23\\x8d\\x84\\x08\\x75\\x1b\\x1d\\x75\\x84\\xc5\\x5c\\x09\\x15\\xde\\xab\\x82\\x9a\\xaa\\x4a\\x07\\x63\\xd0\\x42\\xdd\\x11\\xaa\\x61\\x64\\xd8\\x14\\xe4\\x0a\\xa9\\xd8\\x7b\\x41\\x81\\xfc\\x49\\x05\\x64\\x8e\\xcb\\x11\\x32\\xb9\\x00\\x25\\xac\\xa7\\x3f\\xe9\\x58\\x6c\\x22\\xc4\\x2f\\x9a\\x55\\x58\\x91\\x17\\x22\\x0f\\xa5\\x7a\\xe1\\xe2\\x31\\x28\\x40\\x28\\x39\\x23\\xe0\\xec\\x01\\x45\\xd7\\x15\\x36\\x06\\xb9\\xdf\\x3e\\xf5\\x03\\x6e\\xe2\\xc0\\xfe\\xc3\\x7b\\xbf\\xb7\\x6e\\x74\\x58\\x76\\xf2\\x91\\x47\\xc0\\x9b\\xa2\\xff\\x7d\\xbb\\xfc\\x19\\xa7\\xbe\\x76\\x90\\xbb\\xe3\\xf1\\x63\\xe5\\x53\\xb4\\xff\\xc0\\xd1\\x7f\\x45\\x78\\x85\\x5a\\x53\\x78\\x41\\x8d\\x3a\\x89\\x23\\x4a\\x1d\\x26\\x3a\\x39\\x89\\x5f\\x44\\x9c\\x68\\xd2\\xe8\\x37\\xc2\\x9f\\x5c\\x1d\\x27\\xff\\x05\\xd1\\x23\\xd8\\x54\\x78\\xda\\x63\\x60\\x64\\x60\\x60\\x00\\xe2\\x82\\x69\\xcd\\x1d\\xf1\\xfc\\x36\\x5f\\x19\\xe4\\x39\\x18\\x40\\xe0\\x7c\\xfd\\x9c\\x93\\x30\\xfa\\xff\\x9f\\x7f\\xd5\\x1c\\xcd\\x6c\\xed\\x40\\x75\\x1c\\x0c\\x4c\\x20\\x51\\x00\\x6e\\x3e\\x0d\\xd7\\x00\\x00\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\x60\\xbb\\xff\\x2f\\x98\\x81\\x81\\x93\\xe1\\xff\\x9f\\xff\\x0f\\x39\\x9a\\x19\\x80\\x22\\x28\\xe0\\x19\\x00\\xa6\\x58\\x07\\x8e\\x78\\xda\\x75\\xd3\\xc1\\x2b\\x44\\x51\\x14\\xc7\\xf1\\xfb\\xcc\\x50\\x26\\x0b\\x4d\\x62\\x61\\x35\\x49\\x92\\x24\\x59\\x48\\x93\\x0d\\xb2\\xd0\\x34\\x69\\xd2\\x24\\xcd\\x62\\x16\\xd2\\x34\\x25\\x69\\x56\\x93\\x64\\x31\\x69\\x92\\xac\\xd4\\x24\\x0b\\x65\\xa3\\x94\\x85\\xd5\\xa4\\x94\\xb2\\xb0\\xf7\\x0f\\xc8\\x3f\\x60\\x21\\x59\\x49\\xf8\\x9e\\xf7\\x7e\\xd3\\x3c\\x2f\\x16\\x9f\\xce\\x9b\\x3b\\xf7\\xde\\x73\\xee\\xb9\\xdd\\x8e\\x17\\xb7\\x10\\x77\\xce\\xb5\\x79\\x19\\x62\\x13\\x23\\x58\\xc7\\x20\\x66\\x19\\xdf\\x22\\xbe\\x62\\x1f\\x8b\\x58\\x61\\x6c\\x92\\x58\\x23\\xe6\\x89\\x65\\x8d\\x9f\\xc2\\xe6\\x16\\xb1\\x8a\\x4d\\x94\\x50\\x47\\x3e\\xe0\\x31\\xcf\\x4b\\xf1\\x3d\\x17\\xec\\xe3\\x2c\\xe7\\x36\\xa6\\x54\\x47\\x0e\\x69\\xac\\xa1\\x82\\x43\\xa4\\xb4\\x5f\\x43\\xf3\\xec\\x7b\\x37\\xa8\\xcd\\xdf\\x67\\x08\\x1b\\x8a\\x96\\x7b\\x06\\xa3\\xda\\xbb\\x0f\\x3d\\x18\\x43\\x52\\x39\\xdf\\x54\\xd7\\x31\\xce\\x94\\xef\\x5d\\xb9\\x6d\\x9f\\xac\\xf6\\xce\\xa8\\x76\\xcb\\xb1\\x83\\x07\\xcd\\xb5\\xef\\x83\\xd0\\x78\\x5a\\xe7\\x4e\\xab\\x7f\\x45\\xd5\\x5e\\x52\\xbd\\xbd\\x8a\\x03\\xaa\\xbd\\x40\\x0f\\x2c\\xf7\\x15\\xa6\\x43\\xbd\\x5f\\x56\\xed\\xe5\\xe0\\x2c\\xfe\\x1c\\xeb\\xe1\\x0d\\x12\\x38\\x42\\x15\\x17\\x41\\xef\\xfd\\xb1\\x27\\x3c\\xab\\xe6\\x7b\\x5c\\xb3\\xee\\x44\\xe7\\x26\\xbf\\xb7\\x04\\xbb\\xcf\\x3b\\xd5\\x5c\\xfd\\x7d\\xe7\\x7e\\xef\\xdd\\xdf\\xbe\\x3f\\x75\\xa6\\x4a\\x44\\x23\\x22\\x11\\xba\\x87\\xa8\\x23\\xc5\\x4c\\x44\\x32\\xd4\\xeb\\xdc\\x3f\\xe2\\xfa\\x3f\\xba\\xb6\\x19\\x72\\xa9\\xb1\\xd6\\x3d\\x44\\xed\\x29\\x96\\x22\\x06\\x94\\xdf\\x62\\x97\\x58\\x4d\\x5f\\xd6\\xc3\\xd8\\x3c\\x03\\x75\\xe7\\x5a\\xb1\\x63\\xdc\\x39\\xef\\x1c\\xfd\\x01\\xf7\\x48\\xcc\\x12\\x0b\\x7e\\xaf\\x6a\\x2d\\x9d\\xe8\\x0e\\xde\\x05\\x77\\xe9\\x4d\\xb4\\xdf\\x89\\xff\\x9e\\xe0\\xd9\\xfd\\x26\\x6c\\x2d\\xf1\\x83\\xdf\\xfe\\xbe\\x7a\\x73\\xc3\\xb1\\x5b\\xe7\\x7e\\x00\\x27\\x4b\\x55\\x86\\x00\\x00\\x78\\xda\\x63\\x60\\x60\\xd0\\x81\\xc2\\x29\\x0c\\xbf\\x18\\xef\\x30\\x4d\\x62\\x4e\\x61\\x91\\x60\\xf1\\x61\\x69\\x63\\xd9\\xc2\\x72\\x8d\\x55\\x82\\x35\\x84\\x35\\x87\\x75\\x05\\xeb\\x0e\\x36\\x2d\\xb6\\x30\\xb6\\x63\\xec\\x11\\xec\\x4b\\x38\\xf8\\x38\\xe6\\x70\\x9c\\xe2\\x2c\\xe0\\xfc\\xc7\\x15\\xc2\\xb5\\x8b\\xeb\\x1c\\xd7\\x07\\x6e\\x16\\xee\\x3e\\x1e\\x1d\\x9e\\x04\\x9e\\x6b\\xbc\\x7a\\xbc\\x25\\xbc\\x1b\\x78\\x9f\\xf1\\xa5\\xf1\\x1d\\xe0\\xfb\\xc1\\xef\\xc5\\x3f\\x89\\xff\\x98\\x00\\x8b\\x80\\x87\\xc0\\x32\\x81\\x4f\\x82\\x29\\x82\\x07\\x84\\x82\\x84\\x9a\\x84\\x6e\\x08\\x73\\x09\\x27\\x08\\x4f\\x12\\x3e\\x24\\xfc\\x47\\x44\\x43\\xc4\\x42\\x24\\x45\\xa4\\x4b\\x64\\x89\\xc8\\x35\\xd1\\x08\\xd1\\x0b\\x62\\x7a\\x62\\x3b\\xc4\\xb5\\xc4\\x5b\\x24\\xca\\x24\\x4e\\x49\\x6a\\x48\\xce\\x92\\xbc\\x23\\xc5\\x27\\x55\\x27\\x75\\x4a\\x5a\\x45\\xba\\x4f\\xfa\\x97\\x8c\\x95\\x2c\\x93\\x6c\\x9a\\xec\\x1e\\xd9\\x4f\\x72\\x7d\\x72\\x47\\xe4\\x25\\xe4\\x03\\xe4\\xaf\\xc9\\x7f\\x50\\xa8\\x50\\x38\\xa1\\x70\\x42\\xd1\\x44\\xf1\\x8b\\xd2\\x2f\\xe5\\x0e\\xe5\\x57\\x2a\\x7c\\x2a\\xb7\\x54\\x8d\\x54\\xef\\xa8\\x25\\xa8\\x35\\xa8\\xad\\x50\\x3b\\xa1\\x5e\\xa3\\x3e\\x4b\\xfd\\x9d\\x86\\x8d\\xc6\\x12\\x4d\\x0d\\x4d\\x0f\\xcd\\x43\\x5a\\x4c\\x5a\\x56\\x5a\\x5d\\x5a\\xab\\xb4\\x05\\xb4\\x8d\\xb4\\x17\\xe9\\x98\\xe9\\xf2\\xe8\\x2e\\xd0\\x7d\\xa4\\xa7\\xa2\\x97\\xa7\\xf7\\x4c\\xbf\\x46\\xff\\x97\\x41\\x84\\xc1\\x33\\x43\\x23\\xc3\\x2a\\xc3\\x33\\x46\\x51\\x46\\xf3\\x8c\\x9e\\x18\\x9b\\x18\\x9f\\x30\\x31\\x30\\x39\\x64\\x6a\\x60\\xba\\xc8\\x4c\\xca\\xec\\x90\\x79\\x8d\\xf9\\x34\\x0b\\x25\\x8b\\x0e\\x8b\\x0f\\x96\\x09\\x56\\x7c\\x56\\x5e\\x56\\xab\\xac\\xcd\\xac\\x0f\\xd9\\x04\\xd9\\xbc\\xb0\\xdd\\x64\\xd7\\x65\\x1f\\xe3\\xa0\\xe3\\xb0\\xc7\\xd1\\xc1\\xf1\\x98\\x53\\x90\\xb3\\x84\\x73\\x9c\\xf3\\x22\\xe7\\x37\\x2e\\x4d\\xae\\x3e\\xae\\x4f\\xdc\\xfc\\xdc\\x76\\xb8\\xeb\\xb8\\x5f\\xf2\\x68\\xf3\\x78\\xe4\\x99\\xe0\\x79\\xcc\\x4b\\xcf\\x6b\\x8e\\xb7\\x8f\\xf7\\x2a\\x1f\\x35\\x9f\\x2b\\xbe\\x51\\x7e\\x0a\\x7e\\x9b\\xfc\\x6e\\xf9\\x6b\\xe0\\x80\\x66\\xfe\\x2e\\xfe\\x41\\xfe\\x09\\xfe\\x79\\xfe\\xab\\xfc\\x9f\\x05\\x28\\x05\\x4c\\x0a\\x64\\x0a\\x2c\\x0a\\x5c\\x15\\xa4\\x05\\x84\\x1e\\x41\\x39\\x40\\xf8\\x2c\\xd8\\x27\\x38\\x07\\x00\\x2b\\x8a\\x94\\x93\\x00\\x01\\x00\\x00\\x00\\xe6\\x00\\x6d\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x01\\x00\\x02\\x00\\x16\\x00\\x00\\x01\\x00\\x01\\x52\\x00\\x00\\x00\\x00\\x78\\xda\\xb5\\x55\\xcd\\x4e\\x13\\x51\\x14\\x3e\\x2d\\x28\\x60\\x52\\x16\\x2c\\x58\\x4f\\xba\\x82\\xa4\\x14\\x68\\x80\\x28\\xac\\x10\\x41\\x89\\x4d\\x49\\xa0\\x4a\\xdc\\x98\\x0c\\x65\\xfa\\x13\\xfb\\x33\\xce\\x4c\\x29\\x6c\\x5d\\xba\\x76\\xe5\\x23\\xb8\\xf0\\x19\\x5c\\xea\\x9b\\xf8\\x00\\x3e\\x80\\xdf\\xf9\\xee\\x99\\x22\\x95\\x09\\x2c\\x34\\x37\\xbd\\xfd\\xee\\x3d\\xff\\x3f\\xf7\\x8c\\x88\\xcc\\xcb\\x57\\x99\\x92\\xdc\\xf4\\x9c\\x88\\xfc\\xc2\\xcf\\xe1\\x9c\\x2c\\xe2\\xe4\\x70\\x5e\\x66\\x73\\x8f\\x0c\\x4f\\xc9\\x65\\x6e\\xc1\\xf0\\xb4\\x78\\xb9\\x8f\\x86\\x1f\\xc8\\x87\\xdc\\x17\\xc3\\x0f\\xc5\\xcb\\x97\\x0c\\xcf\\x4a\\x2d\\x5f\\x35\\x3c\\x07\\xfc\\xd9\\x70\\x61\\xba\\x96\\xff\\x69\\x78\\x5e\\xde\\xce\\x6c\\x19\\x5e\\x90\\xc5\\x99\\x4f\\x86\\xbf\\x03\\xa7\\x3a\\x7f\\xc8\\xda\\xcc\\x37\\xd9\\x93\\x48\\x02\\xf1\\x25\\xc1\\x7e\\x2e\\x9e\\x9c\\xc9\\x15\\xf6\\x63\\xdc\\x84\\xd2\\x06\\xaa\\xe2\\xfe\\x42\\x3a\\xd8\\xfb\\x38\\x0d\\x25\\x06\\xee\\x4b\\x0b\\xb8\\x0d\\x14\\xe3\\x7f\\x20\\x23\\xd2\\x12\\xa0\\x81\\x74\\x79\\xe7\\xe3\\x46\\xb5\\x1d\\xe0\\xa6\\x0f\\x8a\\xfe\\x47\\x90\\x0a\\xa4\\x8c\\xdb\\x3d\\x9c\\x42\\xd8\\x89\\xa0\\xa1\\x05\\x3d\\x09\\xee\\x2a\\xb2\\x86\\xb5\\x95\\x69\\xbb\\x4c\\x4a\\x00\\xfd\\xea\\x6d\\x6c\\xde\\x0e\\x69\\x27\\x80\\x26\\xb5\\xdf\\x06\\xf2\\x64\\x17\\xd2\\xbe\\x34\\xec\\x54\\xc1\\xaf\\x0b\\x1d\\x0d\\x6a\\x89\\xe9\\xc1\\x21\\x50\\x83\\x9e\\xc5\\xf4\\x58\\xa3\\xf7\\xe5\\x29\\xf1\\xf9\\xd8\\xfe\\x9f\\xd6\\x4b\\xf2\\x12\\x48\\xfd\\xed\\x62\\xd5\\xe5\\xdd\\xd8\\xc2\\x85\\x2c\\x01\\x5d\\x59\\x16\\xbb\\xd0\\xee\\x22\\x5d\\x96\\x6d\\x58\\xbe\\xdd\\x92\\x37\\xb6\\xb5\\x6d\\x91\\xaf\\x63\\xdd\\xc5\\xfb\\x9a\\x71\\x6a\\xfe\\x07\\xcc\\xf7\\x3a\\x6c\\xa9\\xe4\\x86\\xec\\x30\\xfa\\x44\\x9a\\xe0\\x1f\\xb2\\x0e\\x6d\\x56\\x49\\xf3\\xba\\x04\\x0f\\xd7\\xc0\\xf9\\x04\\x76\\x96\\x71\\x5e\\x81\\x2e\\x4f\\x1e\\x13\\x69\\xd6\\x36\\x41\\x55\\xfc\\x7c\\x5c\\x03\\x3d\\x5d\\x52\\xff\\x06\\xf1\\x08\\x7b\\x11\\xf4\\x62\\x86\\x87\\x2b\\x7f\\x65\\xce\\x9b\\xc8\\x9d\\x77\\x23\\x7b\\xde\\x3d\\xf3\\xf7\\x6f\\xb5\\x65\\xf5\\x9c\\x66\\x3e\\xab\\xe7\\x0a\\x58\\xd5\\x1b\\xbd\\x73\\xbf\\x9e\\xbb\\x29\\xa3\\x1e\\x4f\\xd6\\xae\\xc2\\xda\\x69\\x75\\x52\\x0d\\xc5\\x09\\xa9\\x22\\x7c\\xde\\x81\\xfd\\x2b\\x48\\x0c\\x41\\xef\\x41\\xbf\\xbe\\xcc\\x3e\\xce\\x89\\xbd\\xc4\\xc0\\x3c\\x70\\xef\\xb0\\xc9\\x8c\\xe8\\x5d\\x80\\xfa\\xa9\\xa6\\x90\\x9c\\x1d\\x5a\\xd4\\xba\\xf5\\x70\\xa3\\x6f\\xc1\\x67\\x1d\\x95\\x73\\x84\\x53\\xc2\\xb8\\x93\\x5b\\x7d\\x2f\\xc3\\x83\\x37\\x13\\x1e\\x0c\\x30\\x23\\xb4\\xee\\x4e\\xaf\\x6f\\xba\\x43\\xa3\\x35\\x33\\x75\\x79\\xec\\x17\\xcd\\xa9\\x67\\xab\\xcd\\xae\\x0d\\xf1\\x0a\\x56\\xb1\\x46\\x5c\\x65\\x56\\x22\\xcd\\x65\\x5a\\xbf\\xd5\\x89\\x37\\x1c\\xe3\\xa6\\x8a\\x7e\\xdc\\x93\\x7d\\xa9\\xc9\\x09\\xf6\\x15\\xcb\\xa9\\xea\\x7f\\x05\\xae\\x2e\\xb9\\x34\\x2f\\xda\\x0b\\xef\\x11\\x41\\x87\\xe8\\x7a\\xc6\\xa9\\x9d\\xd0\\xf4\\xfa\\xb8\\x73\\xb9\\xd3\\xae\\x1e\\x31\\x92\\x88\\x3c\\x2d\\x4a\\x39\\x39\\x7d\\x59\\x69\\x3e\\x47\\xec\\xa4\\xc4\\xa6\\xa1\\xd6\\x38\\x66\\xf4\\x09\\x28\\x3e\\x65\\x0a\\x90\\xd1\\xca\\x24\\xe4\\x3c\\xe3\\xcb\\xcc\\xee\\xa0\\xc9\\x5c\\xb9\\x9a\\x66\\x69\\x18\\x58\\xee\\xfb\\xec\\x9c\\x5d\\x64\\x40\\x67\\xcd\\x09\\xb0\\xce\\x0b\\x3d\\xeb\\xa9\\x04\\x1f\\x4e\\x81\\xea\\xf2\\x42\\x8e\\x90\\x95\\x3a\\xa8\\xa7\\xa0\\x1e\\x63\\xed\\x22\\x6f\\x75\\xd0\\xf6\\x29\\x7b\\x84\\x1b\\x9d\\xcb\\x47\\xb8\\x7d\\x46\\x89\\x43\\x62\\x47\\x3b\\x60\\x87\\xd7\\xd0\\x09\\xfa\\xf6\\x0e\\xc9\\x53\\x62\\x9f\\x75\\xcc\\xff\\xc8\\xba\\x2e\\x64\\xe4\\xb1\\x7d\\x17\\x22\\xc6\\x91\\x76\\x9d\\x7a\\xae\\xfd\\x74\\xc2\\x7c\\x66\\x47\\xde\\x34\\xc9\\x94\\x1e\\x43\\x3e\\x00\\x47\\x87\\x1d\\xde\\xb0\\x1a\\x69\\xd6\\x87\\xac\\x8f\\xf2\\xb4\\x20\\x73\\x41\\x3f\\xfa\\xe3\\xef\\x53\\xc8\\x73\\x8f\\x19\\x4c\\x5f\\xde\\xf5\\xb7\\xa9\\x40\\x9f\\x7a\\x8c\\xc0\\x67\\x1d\\x53\\xfa\\xdd\\xd5\\x29\\xff\\x97\\xce\\x75\\x5a\\x7b\\xe0\\xbf\\x7d\\xce\\x9e\\x42\\xfa\\x8c\\xd9\\x71\\x93\\xdd\\xcd\\xff\\x03\\xf6\\x86\\x9b\\x40\\x11\\x27\\xcb\\x26\\x76\\x9d\\x6b\\xdb\\xd8\\x2b\\xdc\\xd7\\xc7\\xb3\\x6e\\xe3\\x37\\xb2\\xb4\\x66\\xc0\\x00\\x00\\x78\\xda\\x6d\\xd0\\x47\\x4c\\x54\\x61\\x14\\x86\\xe1\\xf7\\xc0\\x30\\x03\\x43\\xef\\x55\\xc5\\xde\\xf5\\xde\\x3b\\x5c\\x8a\\x7d\\x28\\x63\\xc1\\xde\\xb0\\x2b\\x0a\\xcc\\x8c\\x22\\xe0\\xe0\\x88\\xd8\\x8d\\x05\\x7b\\x34\\x26\\x26\\x2e\\x34\\x16\\x36\\x6a\\xec\\x35\\x1a\\x75\\x21\\x04\\x7b\\x89\\x25\\xea\\xc2\\xa5\\xb1\\x41\\x5c\\xa8\\x4b\\x23\\x32\\xbf\\x3b\\xbf\\xcd\\x93\\xef\\x24\\xe7\\x2c\\x0e\\x41\\x74\\xe4\\xf7\\x61\\x2a\\xf8\\x5f\\x3e\\x82\\x04\\x49\\x30\\xc1\\x58\\x08\\xc1\\x8a\\x8d\\x50\\xc2\\xb0\\x13\\x4e\\x04\\x91\\x44\\x11\\x4d\\x0c\\xb1\\xc4\\x11\\x4f\\x02\\x89\\x24\\x91\\x4c\\x0a\\xa9\\xa4\\x91\\x4e\\x06\\x9d\\xe8\\x4c\\x17\\x32\\xe9\\x4a\\x37\\xba\\xd3\\x83\\x9e\\xf4\\xa2\\x37\\x7d\\xe8\\x4b\\x3f\\xfa\\x33\\x80\\x81\\x0c\\x62\\x30\\x1a\\x3a\\x06\\x0e\\xb2\\x30\\xc9\\x26\\x87\\x5c\\xf2\\x18\\xc2\\x50\\x86\\x31\\x9c\\x11\\x8c\\x64\\x14\\x4e\\xf2\\x29\\xa0\\x90\\x22\\x5c\\x8c\\x66\\x0c\\x63\\x19\\x47\\x31\\xe3\\x99\\xc0\\x44\\x26\\x31\\x99\\x29\\x4c\\x65\\x1a\\xd3\\x99\\xc1\\x4c\\x4a\\x98\\xc5\\x6c\\xe6\\x30\\x97\\x79\\xcc\\x67\\x01\\x0b\\x59\\x44\\xa9\\x58\\x38\\xc9\\x56\\xb6\\x71\\x9b\\x43\\x7c\\x62\\x3b\\xfb\\xd8\\xcd\\x11\\x4e\\xd1\\x28\\x21\\xec\\xe2\\x3d\\x5b\\x38\\x28\\x56\\xb1\\xb1\\x57\\x42\\xd9\\xc1\\x3d\\x3e\\x48\\x18\\x47\\x39\\xcd\\x4f\\x7e\\xf0\\x8b\\x13\\x9c\\xe5\\x01\\x2d\\x9c\\x63\\x31\\x4b\\xd8\\x4f\\x19\\x8f\\x28\\xe7\\x3e\\x0f\\x79\\xc6\\x63\\x9e\\xf0\\x94\\xcf\\xed\\xdf\\x7b\\xc9\\x73\\x5e\\x70\\x1e\\x37\\xdf\\x39\\xc0\\x1b\\x5e\\xf1\\x1a\\x0f\\x5f\\x69\\x65\\x27\\x4b\\xf1\\xb2\\x8c\\xe5\\x54\\x52\\xc5\\x31\\xaa\\x59\\x41\\x0d\\x3e\\x6a\\xf1\\xb3\\x92\\x55\\xd4\\xf1\\x85\\xd5\\xac\\xa1\\x9e\\xb5\\xac\\x67\\x1d\\x37\\x38\\xce\\x46\\x36\\xb0\\x89\\xcd\\x7c\\xa3\\x8d\\x9b\\x5c\\xe0\\x22\\xb7\\x78\\xcb\\x3b\\xb1\\x4b\\xb8\\x44\\x48\\xa4\\x44\\x49\\xb4\\xc4\\x48\\xac\\xc4\\x49\\xbc\\x24\\x48\\xa2\\x24\\x49\\x32\\x97\\xb8\\xcc\\x35\\xae\\xd3\\xc4\\x15\\xae\\xd2\\x4c\\x03\\x67\\x24\\x85\\x3b\\xdc\\x95\\x54\\x49\\x63\\x8f\\xa4\\x5b\\xdd\\x95\\xf5\\x35\\x1e\\xdd\\xe6\\xaf\\xf2\\x6a\\x9a\\x56\\x18\\xd0\\xa9\\x29\\x55\\xcf\\x37\\x94\\x0e\\xa5\\xa9\\xcc\\xfb\\xab\\xd1\\xbe\\xa8\\xd4\\x95\\x86\\xd2\\xa1\\xcc\\x52\\x9a\\xca\\x6c\\x65\\x8e\\x32\\x57\\xf9\\xef\\x9e\\x33\\xa0\\xae\\xee\\xea\\xba\\xbd\\xc2\\xeb\\xf6\\xfb\\xca\\xcb\\x4a\\x6b\\x3d\\x81\\x91\\xe1\\x0a\\x68\\xba\\x2c\\x45\\x7e\\x5f\\x75\\x47\\x31\\x5d\\x05\\x7f\\x00\\xeb\\xee\\x95\\xa0\\x00\\x00\\x00\\x78\\xda\\xdb\\xc1\\xf8\\xbf\\x75\\x03\\x63\\x2f\\x83\\xf7\\x06\\x8e\\x80\\x88\\x8d\\x8c\\x8c\\x7d\\x91\\x1b\\xdd\\xd8\\xb4\\x23\\x14\\x37\\x08\\x44\\x7a\\x6f\\x10\\x09\\x02\\x32\\x1a\\x22\\x65\\x37\\xb0\\x69\\xc7\\x44\\x30\\x6c\\x60\\x56\\x70\\xdd\\xc0\\xac\\xed\\xb2\\x81\\x43\\xc1\\x75\\x17\\x03\\x33\\x23\\x0f\\x03\\x93\\x36\\x98\\xcf\\xae\\xe0\\xba\\x89\\xc3\\x00\\xca\\x61\\x03\\x72\\xd8\\xfd\\xa1\\x1c\\x56\\x90\\x4a\\x36\\x46\\x11\\x98\\x4a\\x16\\xa0\\x24\\xab\\x13\\x94\\xc3\\x09\\x31\\x46\\x0c\\x26\\xc9\\x05\\x94\\xe4\\x9c\\x01\\xe1\\x30\\x6e\\xe0\\x86\\x5a\\xc6\\x0b\\x14\\xe5\\x9e\\xcc\\xa4\\xbd\\x91\\xd9\\xad\\x0c\\xc8\\xe5\\x01\\x72\\x79\\x0d\\xe1\\x5c\\x3e\\x90\\x19\\xdc\\xf5\\xff\\x19\\xe0\\x22\\xfc\\x40\\x05\\x7c\\xfb\\x61\\xdc\\xc8\\x0d\\x22\\xda\\x00\\x4c\\x6c\\x3e\\xaf\\x00\\x00\\x01\\x53\\x59\\xec\\x49\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\x95\\x31\\x48\\x34\\xd4\\x6b\\x00\\x00\")\n\nfunc fontsInconsolataBoldWebfontWoffBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataBoldWebfontWoff,\n\t\t\"fonts/inconsolata-bold-webfont.woff\",\n\t)\n}\n\nfunc fontsInconsolataBoldWebfontWoff() (*asset, error) {\n\tbytes, err := fontsInconsolataBoldWebfontWoffBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-bold-webfont.woff\", size: 27604, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataRegularWebfontEot = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x74\\xae\\x55\\x4c\\x1c\\x0c\\xc0\\xac\\xbd\\xcb\\x2e\\xee\\xee\\xbe\\xb8\\x2d\\xee\\xee\\x5a\\xdc\\xdd\\xdd\\xa1\\xd0\\x02\\x2f\\xee\\xee\\xee\\xee\\xee\\xa5\\xb8\\xbb\\xbb\\x7b\\xf1\\x02\\x05\\x0a\\xe5\\x4f\\xbe\\xfc\\x39\\x17\\xe7\\xcb\\x79\\x6e\\x26\\x99\\x4c\\x9e\\x0c\\x9d\\x0e\\x00\\xa0\\xa8\\x0d\\x00\\xc0\\x00\\x60\\x00\\x60\\x00\\x00\\x00\\x83\\x0c\\x87\\x08\\x02\\x80\\x00\\x00\\x00\\x10\\x90\\x08\\x04\\x00\\xc0\\x00\\x25\\x55\\x36\\x00\\x20\\xd0\\x01\\x08\\xf8\\x3f\\x60\\xff\\xff\\x19\\xb9\\x90\\x92\\x00\\xf8\\x5f\\xe0\\x01\\xe4\\x01\\xce\\x00\\x0b\\x80\\x0b\\xc0\\x19\\xe0\\x01\\x70\\x01\\x38\\x02\\xcc\\x00\\x9e\\x00\\x33\\x00\\x00\\x80\\x06\\x50\\x07\\x58\\x01\\x6c\\x00\\x5e\\xff\\xd3\\xb9\\x03\\x00\\x00\\x22\\x80\\x36\\xc0\\x0a\\xe0\\x0e\\xf0\\x00\\xd8\\xfd\\xcf\\x9e\\x02\\xc0\\x0e\\x60\\x05\\x40\\x01\\xec\\x00\\x4e\\x00\\x00\\x40\\xfb\\xff\\x30\\x51\\xfc\\x2f\\x0f\\x00\\x20\\xa1\\x21\\xab\\xfa\\x7f\\x3f\\x01\\x01\\xbc\\x63\\x01\\xdc\\xe4\\x00\\x6e\\x1a\\x00\\x8b\\x0c\\xd6\\xcc\\x45\\xf4\\xb8\\xe9\\xba\\xce\\x84\\xad\\xa2\\x9b\\xc2\\x7f\\x3e\\x54\\x5a\\x02\\xee\\xcc\\x6c\\xe9\\x5c\\x86\\x39\\xdb\\xb8\\x68\\x28\\x8e\\x76\\x8b\\x5b\\x4b\\xf7\\x91\\x93\\xd9\\xe8\\x70\\x79\\xd2\\x63\\x4a\\x32\\xca\\xad\\xa4\\xa3\\xcb\\xb0\\xba\\x45\\x05\\x6a\\x86\\xa6\\x9a\\x3f\\x1d\\x89\\x21\\xda\\xc7\\xe9\\x26\\xd8\\xab\\x21\\x0c\\xe3\\x9c\\x2c\\x5f\\x44\\x82\\x25\\x7f\\xb9\\xf0\\x0c\\x64\\x94\\x5a\\x79\\xe9\\xcb\\x73\\x35\\x22\\xf0\\x64\\xca\\x7f\\x95\\xaf\\xbc\\xdf\\x2a\\xdf\\x1d\\x0d\\x59\\x40\\x7f\\x5b\\xfb\\x5d\\xd4\\xd8\\x7d\\x15\\x18\\xeb\\x23\\x43\\x0a\\xbb\\x22\\x50\\x8d\\x42\\x16\\xfe\\x06\\x09\\x14\\x5b\\xf2\\xda\\x6d\\xec\\x1a\\x23\\xd2\\x0a\\xdf\\x81\\x36\\xa4\\x2f\\x7f\\xd7\\x56\\x64\\xff\\x3e\\x5a\\x65\\x7b\\x9e\\xbf\\x90\\xe5\\x08\\x1f\\x4c\\x8a\\x84\\xbd\\x81\\x38\\xc4\\xa3\\x12\\x74\\xf2\\x2c\\x6c\\xfc\\x3a\\xda\\xb6\\x6b\\xc2\\xd5\\x5e\\xbb\\xb2\\x86\\xb3\\xa3\\xa7\\xe7\\xd4\\x6d\\x0f\\xdc\\xe4\\x51\\xae\\xea\\x6a\\xf5\\x2f\\xe0\\xa3\\x0f\\x56\\x89\\x9b\\xed\\x36\\x5a\\x0f\\xce\\x7b\\xa6\\x51\\x3e\\xc3\\xff\\xe7\\x4e\\xd7\\xc9\\x6c\\x18\\x5b\\x90\\x8c\\xc6\\xd5\\xcc\\xb6\\x8e\\xf6\\x49\\x92\\x18\\xe7\\x90\\x24\\x6d\\x14\\x22\\xe0\\xa8\\x50\\x98\\xe4\\xb6\\x8f\\xc3\\x6e\\x05\\x4a\\x81\\xf1\\xde\\x22\\x2a\\xe6\\x68\\x3b\\xf0\\xf3\\xe9\\xc9\\x42\\x99\\x08\\x13\\x53\\x34\\x6e\\x40\\x48\\x91\\x7a\\xf0\\x7c\\xa7\\x49\\x54\\x1e\\x16\\x7a\\x4c\\x9c\\xde\\x43\\x21\\xf3\\x11\\xdb\\x1d\\xd4\\xfd\\x35\\x81\\xa3\\xd6\\x12\\x25\\xd6\\x15\\x72\\xf3\\xcf\\x93\\x6b\\x61\\xf4\\x73\\xfa\\xa8\\x92\\xbd\\xe2\\x5f\\x61\\x44\\x41\\xbe\\x1f\\xb0\\xe8\\x30\\x3f\\x9a\\x8c\\xfa\\xc0\\x2d\\xcc\\x1c\\x27\\xc3\\x9b\\xe2\\x9c\\xea\\x6b\\xba\\xa3\\x9d\\x59\\x3e\\x32\\xb7\\x5d\\x64\\x4b\\x48\\xa3\\xc2\\xe6\\x47\\xec\\x48\\xae\\x90\\x2f\\x21\\x23\\x53\\x80\\x99\\x7c\\xc9\\xd5\\x41\\xc8\\xc1\\x1d\\x69\\x88\\xeb\\xb0\\xaa\\xd9\\x91\\x53\\x8e\\x7a\\x73\\x98\\x99\\x5e\\x1b\\x4a\\xba\\x42\\x8b\\x6d\\x08\\x5e\\xaf\\x41\\x98\\x84\\xbe\\x34\\x46\\x30\\x4c\\x82\\xa0\\x91\\x61\\x64\\x50\\x6b\\x32\\x2c\\x31\\x9a\\x14\\xa6\\xce\\x64\\xbb\\xf0\\xc0\\xf9\\x35\\x88\\xc7\\x53\\x89\\x77\\xe0\\x6e\\x9e\\x3c\\xf8\\x15\\x6e\\xe3\\x3f\\x6f\\xe9\\x20\\x43\\x12\\xa1\\xb8\\x48\\x8a\\xf7\\x25\\x2a\\x6f\\x0c\\x07\\xf1\\x63\\xc9\\xeb\\xe5\\xd7\\x20\\xb8\\x81\\xba\\x4e\\x05\\x2a\\x2a\\xf8\\x8f\\x87\\xab\\xec\\x7a\\x2c\\x19\\xd7\\x7d\\xf9\\x82\\x27\\x58\\x77\\x8b\\x31\\x5e\\x78\\xa7\\x10\\xc6\\x46\\x33\\x8c\\x44\\xd2\\xf7\\x3b\\x68\\xbf\\x58\\x68\\xe2\\x56\\x09\\xe1\\x6c\\x9a\\xd0\\x53\\x18\\xc6\\x58\\x42\\xa3\\x02\\x9f\\x1d\\xc8\\x5c\\xcd\\x21\\xe3\\xa0\\x56\\x73\\xcd\\x56\\xe6\\x5e\\x8c\\x7c\\x0d\\x1f\\x9d\\x62\\x3e\\x58\\x06\\x17\\x3e\\xd1\\x4f\\x89\\x06\\x75\\xaf\\xab\\x68\\xdf\\x81\\x04\\x3c\\x5f\\x1b\\x73\\x2a\\x94\\x38\\x02\\x81\\xb8\\x06\\x6a\\x0c\\x4c\\xcb\\x81\\xb1\\xf2\\xff\\x86\\x9a\\x8a\\x4f\\xa9\\xea\\x33\\x8f\\xf0\\x7d\\x06\\x47\\x07\\xd5\\xfd\\x22\\x69\\x01\\x20\\xf7\\x1f\\x88\\xa5\\x92\\x61\\x38\\x12\\x83\\x23\\x07\\x21\\xfa\\x34\\x94\\xb2\\x49\\x73\\x24\\xa4\\x78\\x88\\x62\\x7f\\x29\\xc6\\xd9\\x4c\\x05\\xc9\\x13\\x6f\\xb0\\x19\\x13\\x28\\x7b\\x07\\xc5\\xef\\x49\\x4c\\x28\\x25\\xab\\x55\\xaf\\x62\\xb1\\x23\\xa0\\xd4\\x82\\x45\\xfb\\x31\\x30\\xb4\\xd1\\x11\\xe9\\x4c\\xf1\\xba\\xd1\\xa7\\xe3\\xbf\\xea\\x58\\x45\\x90\\x67\\x8a\\x43\\x59\\x02\\xbe\\xa5\\xc0\\x39\\xf0\\x22\\xee\\x3f\\x9d\\x7d\\x31\\x42\\x60\\x30\\x0c\\xfb\\x4a\\x3a\\xff\\x8b\\x66\\xa3\\xdd\\x07\\xb5\\xcb\\x9b\\xcf\\xaf\\x48\\xe0\\xde\\x49\\x95\\xab\\xb0\\x48\\x4b\\x35\\x70\\xd4\\xcb\\x6b\\xa0\\x63\\x79\\x58\\x2e\\xbc\\xe5\\x56\\xae\\x7d\\x39\\x06\\x4a\\xcd\\x5f\\xc8\\x23\\x42\\x32\\x1a\\xaf\\xc6\\xb4\\xfe\\xb4\\x71\\x92\\x89\\x20\\x0f\\x09\\xf9\\xe4\\x73\\x9a\\x46\\x15\\x04\\x83\\x0e\\xe1\\x34\\x83\\xd1\\xb1\\xe0\\x90\\x40\\xe3\\x99\\x49\\xc7\\xb5\\x2c\\x76\\x27\\x94\\xcc\\x61\\x1d\\x50\\xc6\\xbc\\x9a\\xa2\\xfe\\x67\\x58\\x0f\\x72\\x4a\\xa6\\xa2\\x50\\x5a\\x44\\x0c\\xd5\\xd8\\xab\\xa3\\xb9\\x11\\xd3\\xe0\\xc3\\x96\\x2d\\xcc\\xd4\\xf7\\xd8\\x55\\xee\\x04\\x89\\xe2\\xaf\\x65\\xa6\\xe6\\x92\\x04\\x4c\\x38\\x27\\xaa\\x6a\\x2f\\x5e\\xb8\\xeb\\x14\\x54\\x9c\\x0c\\x96\\xf3\\x04\\xee\\x7c\\xef\\x7f\\xf0\\xa7\\xcd\\xed\\x84\\x10\\xec\\xe1\\x0f\\xeb\\x92\\x39\\x5c\\xa4\\x7c\\x2d\\x4f\\xac\\x8f\\x2b\\x8d\\x13\\xc1\\x7f\\x8d\\x9d\\xf2\\x4a\\xd8\\xb6\\x5b\\xcc\\x97\\xe6\\x77\\x4e\\x70\\x28\\x51\\xdd\\x7a\\x3d\\x7e\\xa9\\xa9\\x3c\\xa0\\x5a\\x9a\\x2b\\xe4\\x1e\\x73\\x93\\x3a\\x4e\\xa7\\x1e\\x70\\x44\\x0a\\x85\\x3a\\x42\\x7c\\xec\\xac\\xc2\\x20\\x30\\x5f\\x29\\xab\\xa3\\x29\\xf7\\x51\\x39\\x64\\x99\\xa3\\x5d\\x8c\\x18\\x7c\\xab\\xb0\\xfa\\xb7\\xd3\\x12\\x98\\x85\\x70\\x1e\\x6f\\xd2\\x35\\x19\\x46\\xed\\x8d\\xbd\\x3d\\x30\\x1d\\x59\\x87\\x37\\x8c\\x5a\\x88\\xe3\\xf5\\xf9\\xf0\\xce\\x62\\x66\\x11\\xf1\\x05\\x8c\\x27\\xb9\\xb2\\xb1\\x44\\x2d\\x87\\x79\\x23\\x20\\x2c\\x71\\xed\\xb2\\xe0\\x4f\\xaa\\x73\\x78\\x29\\x4a\\xef\\xa8\\xf3\\xb1\\xb1\\xb1\\xfc\\xe3\\xa8\\x86\\x58\\x14\\x01\\xa7\\xd8\\x07\\x62\\xf1\\x50\\xc6\\xf9\\xf6\\xd1\\x0d\\x14\\x65\\xeb\\x35\\x25\\x18\\x20\\x71\\xa9\\x44\\x35\\x60\\xaa\\x6e\\x38\\x14\\x82\\x91\\x31\\x37\\x34\\x00\\x36\\xa1\\x41\\xfe\\x71\\x17\\xa4\\xf1\\x88\\xc5\\x2a\\xe0\\x7f\\x8d\\x77\\xde\\x46\\x5c\\x2b\\x76\\x4e\\x8c\\xc0\\x09\\xb3\\x8f\\x25\\xb2\\xb6\\x55\\x70\\x2a\\xf0\\x78\\x61\\xfe\\xfd\\xdb\\xeb\\xde\\xf5\\xc7\\x7f\\xf0\\x84\\x8d\\xb8\\xd8\\x9e\\x48\\x09\\xf2\\xb4\\x20\\x49\\x93\\x42\\xdb\\x61\\xa9\\x4a\\xd7\\xd1\\x02\\xe5\\x77\\xd9\\x80\\x65\\x93\\x01\\xbe\\xf1\\x4a\\x02\\x02\\x2c\\xf1\\xdf\\xd4\\xad\\xdc\\xc0\\xe4\\xad\\x73\\x42\\x61\\x52\\x5e\\xf8\\x9e\\x68\\x34\\xac\\xfc\\x91\\x68\\xaf\\xba\\xaf\\x91\\x65\\x06\\xd2\\x63\\x6b\\x87\\xbf\\x4a\\x64\\x36\\xfb\\xd7\\x16\\x89\\x38\\xab\\x3d\\xc8\\xec\\xcb\\x92\\x8d\\x11\\x8a\\x48\\x48\\xf7\\x59\\xa6\\x59\\xe3\\xdc\\x2d\\xa7\\x35\\xce\\x7c\\xee\\x74\\xaf\\xea\\x90\\x23\\xc2\\x8a\\xf6\\x57\\x62\\x27\\xdc\\xf7\\xf2\\xa6\\x7b\\x92\\x75\\x75\\x97\\x46\\xcf\\x58\\xe7\\xd8\\xed\\x69\\xa0\\xf3\\x28\\xfe\\x1a\\x4d\\x7c\\xfc\\xa7\\x1d\\x09\\x21\\x67\\xe3\\xeb\\x59\\xb6\\xc1\\xff\\xcd\\xa9\\xa4\\x73\\x23\\x37\\xb4\\x66\\x08\\xf2\\xc9\\xef\\xae\\xc0\\xc1\\x47\\x6b\\x68\\x90\\xcb\\x49\\xc0\\x75\\x93\\xe4\\x79\\x5e\\xe0\\xae\\x95\\xe3\\xf5\\xe0\\xe0\\x34\\x86\\x7c\\x8b\\x3f\\x3a\\x74\\x55\\x5f\\xd2\\x6c\\xe1\\x29\\xc1\\xf3\\x7e\\x7e\\xdd\\x9f\\xcb\\x2b\\x6d\\x42\\x1d\\x32\\xd8\\x2c\\x14\\x66\\x1a\\x95\\xd7\\xca\\x7c\\xc4\\x1c\\xd9\\xa0\\xf2\\x6f\\xa3\\x9d\\xb0\\x2e\\xd6\\x9e\\x10\\x8d\\xf3\\x1f\\xfb\\x0b\\x01\\xbb\\x51\\x47\\x71\\x9f\\x80\\xf3\\x15\\x25\\x69\\xfb\\x2d\\xf7\\xe5\\xfe\\xe5\\xf7\\x9f\\xe7\\xd5\\xf6\\xcd\\xca\\x48\\xbe\\x03\\x0d\\x71\\xa7\\x6b\\xd8\\x4a\\x2c\\xeb\\xa2\\xb0\\x71\\xdd\\xc9\\x17\\x41\\x17\\x25\\x48\\x1e\\x98\\x3f\\x45\\x1c\\x42\\x50\\x24\\x3a\\x7b\\x2c\\xe0\\xcc\\x51\\xb9\\xca\\x7a\\x70\\x5e\\xa5\\x97\\xbd\\xfd\\xf5\\xcd\\xd8\\xb9\\x8e\\xac\\xba\\xc2\\x24\\xf8\\x50\\xeb\\x48\\xa6\\xb9\\xa2\\xa3\\x2a\\x38\\x62\\x09\\xaa\\x1b\\x5a\\x7c\\xba\\xe5\\x4b\\x07\\xf5\\x45\\xa9\\xc3\\x28\\x7b\\x9a\\x8e\\xf6\\x8d\\xcf\\x99\\xe5\\x57\\x34\\x97\\xb0\\x7f\\xf8\\xa8\\xb1\\xfe\\xa0\\x49\\x44\\x39\\x47\\xf6\\xeb\\xda\\x29\\x8b\\x1a\\x8a\\xca\\xee\\x96\\x98\\x40\\x64\\x4a\\xa0\\x4a\\x15\\x90\\x20\\xb6\\x3d\\x3f\\xbe\\x24\\xa1\\xe5\\x65\\xa1\\x17\\x08\\xb7\\x59\\xab\\x49\\x65\\x77\\x92\\xa2\\x37\\x6a\\xb6\\x5e\\xc3\\xdc\\xd9\\xa6\\xd2\\x17\\x4e\\x25\\xff\\x92\\x56\\x0a\\x5a\\xfe\\xfd\\x50\\x60\\x31\\xb0\\x2e\\x59\\xaf\\x14\\x61\\xc7\\x3d\\xb7\\xbd\\x49\\x44\\xa5\\x15\\x33\\xef\\x79\\x7e\\xa6\\x67\\x43\\xfc\\x85\\x6e\\x24\\xb6\\x29\\x54\\xc8\\x06\\x05\\xd1\\x20\\xb0\\xdf\\x68\\x4a\\xd1\\x88\\x2c\\xe1\\xc7\\xd3\\x82\\xa7\\x35\\x44\\xf2\\xa4\\x55\\x87\\xb0\\x3c\\x66\\xb3\\x0f\\x37\\xc8\\xcb\\x3d\\x5a\\xda\\x07\\x24\\x95\\x7d\\xf0\\xb3\\x9f\\xfe\\xe2\\xbf\\x8b\\x13\\xb6\\xd3\\xa0\\x49\\x29\\x62\\xfe\\xc3\\x55\\xab\\xf8\\xd4\\x71\\x95\\xb7\\x96\\x9a\\xa4\\xdc\\x6d\\xf5\\x54\\xf4\\x66\\x2d\\xda\\xe8\\xa6\\x97\\xf4\\x7d\\x21\\x2b\\x20\\xda\\xe5\\xd7\\x55\\x74\\x09\\xdd\\xe7\\x6c\\xcb\\x0c\\x98\\x8b\\x03\\x1e\\x38\\x50\\x6c\\xff\\x93\\x37\\xbe\\x6e\\x0e\\x8a\\xe9\\x7b\\xa1\\xd9\\x50\\x02\\xdc\\x12\\x68\\x25\\xda\\xa5\\x54\\x7d\\x70\\x0e\\x0e\\x47\\x89\\x49\\xdb\\x69\\xb7\\x00\\x9f\\xb4\\x60\\x71\\xc9\\x16\\x65\\x18\\x51\\x35\\x9c\\xb8\\xc2\\x2b\\xe2\\x75\\xbb\\xe7\\xb4\\x0a\\x13\\xcb\\x74\\xce\\xfa\\x50\\x53\\xad\\x3d\\x65\\x4d\\x9a\\x26\\x79\\x60\\x50\\xcb\\xb7\\x2b\\x6f\\x86\\x7a\\x67\\x18\\xa6\\x4b\\x39\\x3c\\x4b\\xe2\\x3d\\x40\\xe9\\x40\\xb6\\x48\\xb5\\x14\\xaa\\x12\\x9f\\x5e\\x18\\xde\\x49\\xa8\\xe5\\xd8\\x48\\xf0\\xfc\\xe1\\x08\\x10\\x6d\\x09\\x3f\\x00\\x33\\x47\\x01\\x00\\x38\\x65\\x3a\\x2d\\x69\\x3a\\x2b\\xe0\\xf2\\x9f\\x88\\xf3\\xd9\\x96\\xa5\\x26\\xc3\\xb1\\x6d\\xc8\\xa1\\x14\\x70\\x6a\\x79\\x96\\xfd\\x78\\xbc\\x77\\x7f\\xf4\\x81\\x8e\\x92\\x3b\\xe0\\x81\\xe2\\x33\\x78\\x68\\xce\\x4f\\xe6\\xec\\x98\\x32\\x06\\x75\\xc2\\xf3\\x21\\x12\\x3b\\xdb\\xb3\\x0c\\x8b\\x74\\x78\\x7d\\xc2\\xca\\xa5\\x36\\x4d\\x00\\xbc\\x7a\\x76\\x94\\xe9\\x4b\\xbd\\x55\\x7e\\xe9\\x10\\x95\\x0a\\x6b\\x63\\xb4\\x68\\x35\\xfb\\x22\\xae\\x7f\\xe9\\x1f\\x76\\x7a\\x3a\\x2f\\x91\\x5c\\x39\\x43\\x27\\x3c\\xac\\x3c\\x3b\\xa7\\x2a\\xcd\\x96\\x10\\xc7\\x2d\\xa7\\x26\\xf1\\x06\\x82\\x05\\x58\\xfa\\x48\\x52\\x67\\xab\\x62\\xe9\\xe3\\xbc\\xbb\\xf8\\x32\\xdf\\xd7\\xb2\\x86\\x79\\x6f\\xaf\\x90\\xe1\\x82\\x42\\x8f\\x86\\xec\\xd2\\x2a\\xd6\\x54\\xf6\\xca\\x52\\xfd\\xaa\\xa5\\xbd\\x87\\x67\\x31\\x65\\xb2\\xf2\\xd7\\xb0\\x5a\\xf0\\xac\\x11\\x5d\\x43\\xbc\\x4c\\xc9\\x9e\\x3c\\x3d\\x99\\x7e\\x59\\xcb\\x02\\x75\\xe4\\x9d\\xcd\\xcb\\x74\\x41\\xf8\\xf9\\xab\\x0b\\x76\\xcf\\x97\\x3e\\x29\\x53\\xb5\\x2e\\x59\\x85\\xef\\xe3\\x51\\xeb\\x88\\xeb\\x22\\x25\\x9c\\xf8\\x89\\x98\\x81\\xe3\\x18\\x21\\xa8\\x1d\\x97\\xbe\\xbe\\x53\\xed\\x39\\x40\\x17\\x9a\\xb6\\xb4\\x12\\xee\\x64\\xd2\\x5b\\x02\\xef\\x74\\x9a\\x2c\\xd4\\xdf\\x36\\xe4\\x11\\x78\\x2c\\xbd\\x66\\xfe\\x36\\x27\\x36\\x47\\x55\\xcd\\x6f\\x30\\x2c\\xe7\\xd3\\x11\\x03\\xa9\\xf2\\xdf\\x3e\\xab\\xda\\xe1\\x2a\\x25\\x60\\x5d\\xcd\\xbe\\xd9\\x58\\x24\\x2a\\xf7\\xd4\\x1c\\xa6\\x83\\x63\\x28\\x7e\\x05\\x2a\\x81\\x9b\\x12\\x40\\x23\\x04\\x1b\\x0d\\x40\\x00\\xc2\\x36\\x56\\x72\\xba\\xf0\\x39\\x4c\\x6d\\x71\\x2d\\x8d\\x98\\xe5\\x6f\\xc7\\xf9\\x1e\\xad\\xda\\xee\\x70\\xc9\\xbc\\x02\\x89\\x25\\x5c\\xfb\\x2f\\x60\\xec\\x84\\x68\\x31\\x2a\\x5d\\xc7\\x28\\xc3\\x2e\\x16\\xb7\\x2e\\x9a\\xf2\\xbe\\x99\\xe3\\xfc\\xea\\x4f\\xe7\\x9b\\xa5\\xc2\\x3d\\x5f\\xf1\\x58\\xf5\\x5f\\x69\\x98\\x8d\\xe7\\x5e\\xf4\\x89\\x22\\xe5\\x97\\xd2\\x33\\x88\\xb3\\xc5\\x18\\xf1\\x10\\x71\\xde\\x1e\\x4a\\x27\\x9c\\x6f\\xa9\\x7b\\xbf\\xe8\\xeb\\x17\\x87\\xf2\\x68\\xe1\\x2e\\x6b\\xbd\\xd5\\xe6\\xcf\\x38\\xc4\\x3d\\x2c\\x1c\\xbc\\x04\\x23\\x8c\\x50\\x82\\xf8\\x3f\\x84\\xff\\x38\\x62\\x2b\\xc0\\x00\\x2e\\x52\\x82\\x4f\\x74\\x1f\\x46\\xc3\\x52\\xcb\\x9b\\x6b\\x93\\xac\\x6c\\x6a\\x49\\x18\\x91\\xd5\\x5a\\x19\\x06\\xb8\\xf1\\x6c\\x8d\\x28\\xd1\\x2c\\xcb\\x79\\xed\\x19\\x60\\x96\\x65\\xbc\\x87\\xd1\\x91\\xbe\\xfe\\xe2\\x6f\\x26\\xfc\\x44\\x22\\x41\\xb8\\x41\\xa2\\xf2\\x1a\\x27\\x1f\\xa6\\x9b\\x49\\xec\\x7f\\xf5\\x71\\xf7\\x5b\\x21\\x25\\x2e\\x99\\x89\\xea\\x27\\xef\\xaf\\xfc\\x87\\xf5\\x0f\\xc6\\x5c\\xbc\\x80\\x21\\x09\\xfb\\x25\\xcd\\x10\\x58\\xeb\\x60\\xa2\\x2a\\x66\\x63\\x2f\\x1e\\xe9\\x81\\xd1\\xa9\\x8b\\x99\\x3d\\x69\\x27\\x50\\x7e\\xd3\\x33\\x2d\\x41\\xbe\\xf7\\x87\\x49\\x7f\\x7a\\x3a\\x73\\x91\\x36\\x37\\x09\\x13\\x30\\x88\\x01\\x7f\\x94\\x8d\\xd6\\x86\\xb1\\xf6\\xc7\\xe1\\xe8\\x00\\x15\\xa4\\x52\\x27\\x73\\x29\\x26\\xe8\\x98\\x02\\xad\\xac\\xe4\\xed\\x5f\\x74\\xfb\\x38\\xd5\\x59\\xb1\\x42\\x1f\\xac\\x1a\\x01\\x22\\xf2\\x69\\xd6\\x84\\xa2\\x7c\\x1e\\xcc\\x04\\xc6\\xdc\\xe7\\x2b\\x33\\xa5\\xfe\\x89\\x99\\x61\\xa5\\x22\\x6a\\xb6\\x9c\\xcb\\xfd\\x6d\\x22\\x05\\xe1\\x44\\x56\\x8d\\xfe\\x68\\xac\\xce\\x35\\xf2\\xae\\x85\\x43\\x4a\\x60\\x51\\xce\\x5b\\x35\\xe8\\x23\\x45\\x1a\\x44\\x32\\xae\\xff\\xf6\\x64\\xb6\\x1f\\x42\\xd4\\x96\\x54\\x29\\x9e\\xdd\\xf1\\x4f\\x46\\xa3\\xe5\\x30\\x0c\\xe1\\x0d\\x36\\xe2\\x54\\x65\\x7e\\xc8\\xe4\\x4e\\xef\\xde\\x38\\x1b\\xe0\\x6d\\x6b\\xe4\\x3e\\xac\\x15\\x9d\\x3b\\xf3\\xcc\\x9c\\x9c\\x1f\\xcc\\x38\\x3c\\x1f\\xd8\\x4c\\x88\\x53\\x11\\x7d\\xfb\\xef\\xe8\\xfb\\xd3\\x0f\\xd9\\x53\\x27\\x62\\x92\\xbd\\xea\\x9d\\xea\\x60\\x05\\xed\\xf7\\xec\\x7f\\xaa\\x4d\\x03\\x1b\\x0c\\xb6\\xab\\x14\\xb1\\xd8\\x5b\\x08\\x8b\\x8f\\xcf\\xe8\\x79\\x5c\\xad\\x8f\\x16\\x40\\x3b\\x57\\xb4\\x8a\\xa2\\x45\\x5c\\xf0\\xe4\\x86\\x00\\x3c\\x4b\\x8c\\x70\\xdb\\xa4\\x80\\xf5\\x37\\x80\\xba\\x9e\\xde\\x31\\xeb\\xac\\xfe\\xc0\\xd4\\x3e\\x56\\xdc\\x13\\x22\\x3d\\xf6\\x10\\xe4\\x90\\x99\\xa6\\xe8\\xa7\\x45\\xf0\\xcf\\x4c\\x36\\xcd\\x7b\\x63\\x06\\x3c\\x6f\\xd3\\x31\\x2e\\x2d\\x11\\x2c\\x93\\x71\\xa1\\x77\\x6b\\x16\\x7d\\x9a\\xdc\\xa3\\x7a\\x80\\x1d\\x83\\x45\\xbf\\x7e\\x28\\x03\\x86\\xa1\\x73\\x8e\\x87\\x3e\\xd2\\xde\\xed\\xa4\\xf1\\xd2\\xe8\\xf8\\x1b\\xe1\\x62\\x66\\xa0\\x01\\x2f\\x89\\x99\\xc9\\xb7\\xd5\\x2b\\xc1\\x42\\x14\\x97\\x59\\x69\\x58\\x74\\x17\\x83\\x7f\\x98\\xe4\\x1d\\xaa\\x37\\x2d\\x5e\\x65\\xc7\\x74\\xde\\x53\\xc1\\x3c\\x0f\\xf7\\xa8\\xb3\\xb5\\x8e\\x39\\xb4\\x4d\\x5d\\xac\\x74\\x0f\\xe2\\x3f\\xc3\\xf3\\x78\\x84\\xa2\\x06\\x62\\x4f\\x9f\\x8b\\x2e\\x46\\xfe\\x63\\x92\\x13\\x93\\xde\\x95\\x0d\\xa5\\xe7\\x4a\\xe3\\x4c\\xe4\\xe2\\xa3\\x7f\\xee\\x8b\\x20\\x5e\\x1f\\x30\\x91\\x49\\x6b\\x46\\xd9\\xb3\\x0f\\xab\\x17\\x5b\\xb4\\xcb\\x39\\xc5\\xb0\\x8b\\x15\\x19\\x40\\x33\\x4b\\x8b\\x15\\x64\\x10\\x75\\x1c\\x52\\xcc\\x0d\\x82\\x4c\\x6a\\xb6\\x16\\x30\\xa2\\x0a\\x5e\\x3d\\x1b\\x73\\x65\\xf5\\xeb\\x19\\xe0\\xcf\\x1b\\x37\\xcf\\xc7\\x86\\x0e\\xe4\\x9f\\xd2\\xbf\\x10\\x6e\\x31\\x34\\x97\\xa6\\x12\\xa1\\xd4\\x4e\\xe2\\xf6\\x27\\x86\\x0f\\xa4\\x10\\x0c\\xa8\\x57\\xe3\\xd0\\xf5\\x3a\\xa3\\x9c\\x36\\x1c\\xdb\\x45\\x03\\xb3\\xc4\\x0a\\xfd\\x0e\\x0e\\xfd\\xfe\\x20\\x63\\x5d\\x10\\xd6\\x54\\x8f\\x84\\x37\\xe3\\xc0\\x18\\xb4\\xea\\x7a\\xbe\\xde\\xf7\\x77\\x39\\x3b\\xa0\\xc2\\xe1\\x52\\x4f\\xfc\\xc5\\x3c\\x2f\\x06\\xc0\\x64\\xf3\\x3a\\x27\\x6a\\x88\\xfd\\xa7\\x08\\xfb\\x5a\\xae\\x56\\x19\\x17\\x99\\x9e\\xb2\\x71\\x80\\x57\\xa6\\xd8\\x43\\x5a\\x44\\x91\\x6e\\x8f\\xc2\\xa3\\xef\\x80\\xc7\\xe6\\x4f\\x93\\x76\\xf6\\xc8\\x74\\xf1\\x1c\\xde\\xe2\\xef\\xf2\\x94\\x98\\xa4\\xee\\x1a\\x96\\x55\\xfc\\x11\\x4a\\x58\\x14\\x5b\\x8d\\x96\\x19\\x3b\\x3e\\x2d\\x55\\xa8\\x98\\x28\\xb3\\x24\\x3e\\x1a\\x26\\x37\\x6e\\xc1\\x25\\x79\\x76\\x44\\x8d\\x78\\x93\\x4c\\x08\\xb2\\x82\\x4b\\x29\\xb8\\x8b\\xd2\\x4b\\x94\\x1d\\x48\\xb3\\x3d\\xf6\\x00\\x02\\x7f\\x10\\x8c\\x54\\x17\\x6e\\x77\\xec\\x32\\x16\\x9f\\x82\\x27\\x15\\xc5\\x32\\xa3\\x6d\\x59\\xd0\\x12\\x5e\\x7a\\x03\\x85\\xfa\\xd2\\x82\\x65\\x73\\xcd\\x4a\\x4a\\xbe\\x4e\\x1f\\x50\\x36\\xcb\\xf6\\x23\\xed\\xd2\\xbb\\x5a\\x46\\xd3\\xdf\\x1f\\x5b\\x2f\\x45\\x5c\\x05\\x05\\x99\\x12\\x1e\\x14\\x1d\\x67\\x1f\\x45\\x78\\x0c\\xd0\\x93\\x75\\xdb\\x79\\x0e\\xab\\x73\\xd3\\x87\\x40\\xf9\\xe3\\xf3\\x4a\\x0c\\x9f\\x1a\\xa8\\xff\\xe9\\x9d\\xa2\\x8e\\xb9\\xf1\\x5a\\xb3\\xde\\x85\\x8b\\x3b\\x92\\x18\\x29\\xfa\\xea\\x75\\xae\\xa4\\xa5\\xb2\\xfc\\x79\\x84\\x6d\\xaa\\x34\\x53\\x8d\\xfc\\xd9\\x43\\x35\\xdc\\xd3\\xf9\\x3d\\x33\\x24\\xb4\\x82\\xe0\\x93\\x85\\x14\\x31\\x4e\\xab\\xf5\\xfc\\x97\\x5a\\xaa\\xc8\\x34\\x37\\x9e\\x95\\xc2\\xb3\\x29\\x4e\\xa0\\x34\\xb9\\xb7\\xbf\\x32\\x7f\\xc5\\xc3\\x00\\x2e\\xea\\xa9\\x2e\\x5a\\xc0\\x30\\x02\\xdc\\xb0\\x5e\\x49\\x03\\x0a\\xc5\\xdd\\x68\\xfc\\xda\\x37\\x0e\\x2e\\x3b\\x7c\\xeb\\xf8\\xe8\\x2a\\x09\\x2a\\x72\\x45\\x0d\\x08\\x44\\x4b\\xa1\\x7c\\x65\\x68\\x56\\x30\\x62\\x24\\xca\\x25\\xce\\x1e\\xf1\\x37\\xbd\\xf5\\xbf\\x5d\\x17\\x2e\\xcc\\xc6\\xb4\\xa3\\xf9\\xf2\\x2f\\x33\\xca\\x53\\x32\\xc1\\xb9\\xa9\\xa7\\x18\\xe5\\x69\\x13\\xff\\x46\\xf9\\xea\\xec\\xc1\\x32\\x7c\\x1b\\x63\\x55\\x2e\\x5a\\xbb\\x16\\x5d\\x70\\x77\\x64\\xc9\\x72\\xc7\\x22\\xf2\\x64\\xf0\\xa8\\xad\\x9c\\xf8\\x94\\x16\\x8e\\xd1\\x86\\xd8\\x90\\xa8\\xad\\xc6\\xfb\\x45\\xe5\\x16\\x6e\\xf7\\x1e\\x90\\xfb\\x8f\\x32\\x73\\x91\\xda\\xbc\\x63\\x84\\xdd\\x03\\x80\\x0c\\x89\\xe8\\xc8\\x92\\xdd\\xef\\xb1\\x43\\xcd\\x3a\\xae\\x2d\\xb1\\xb8\\xc0\\xf3\\xa0\\x62\\x1b\\x9c\\x95\\x5b\\x59\\xc7\\x06\\xc9\\x4f\\xcd\\xd5\\x8b\\x26\\x83\\x76\\x9d\\x52\\x3d\\x30\\xbb\\x74\\x9f\\x1b\\xb5\\x10\\xbe\\xdc\\x5b\\xd5\\x8c\\x8b\\xdd\\x79\\x77\\x1e\\x4e\\xc8\\xdf\\xc3\\xe9\\x05\\x4c\\x11\\x61\\xfa\\xfc\\xd2\\xc7\\x47\\xdd\\x17\\xf0\\xac\\xfa\\xf8\\x77\\xaf\\x32\\x4a\\x58\\xc6\\xa2\\x6a\\xe6\\xa1\\x1a\\x5c\\x05\\x72\\xda\\xb5\\x9f\\x6d\\xc3\\x46\\x92\\x4e\\x41\\x8b\\x1d\\x57\\xf6\\xfb\\x3d\\xea\\x6a\\xb5\\xf7\\x14\\x99\\x3c\\xd7\\xb5\\x25\\x65\\x42\\xfd\\xc9\\x32\\xc9\\xc1\\x0a\\xfd\\xbc\\x5c\\xdd\\x15\\x51\\xe2\\x13\\xa3\\xd7\\x8a\\xb8\\x09\\x54\\x0a\\xea\\xa9\\x7c\\x36\\x0e\\xae\\xa3\\x74\\x60\\x92\\xfb\\xa6\\x6f\\x29\\xbd\\xc1\\xaa\\xe8\\x66\\x81\\x30\\x57\\x30\\xf4\\xd1\\xb1\\x05\\x6a\\x02\\xe6\\x39\\xe9\\xc5\\x16\\x14\\xb0\\x4f\\xc9\\x16\\xd4\\x13\\xf4\\x0f\\xb7\\x2a\\xc9\\x2c\\xa7\\x43\\xb1\\xa6\\xe0\\xb4\\x88\\xf7\\x4f\\xa6\\xe8\\xcd\\x77\\x6d\\xf4\\x68\\x9e\\x75\\x72\\xac\\x8b\\x61\\x6f\\x62\\x15\\x98\\x5a\\x6b\\x1e\\xf6\\x92\\xdc\\xd8\\xcb\\xa8\\x99\\x54\\x50\\xdb\\xf4\\x19\\xc7\\x69\\x86\\x79\\xb2\\x81\\xe9\\xaa\\x9b\\x70\\xf3\\x99\\x51\\xe1\\xc9\\x39\\xb8\\x2d\\x38\\xf8\\x37\\xc1\\x60\\xcf\\xe8\\x7f\\x86\\xb5\\xa2\\x9c\\xb4\\xa4\\xa1\\x37\\xad\\xa0\\x90\\x7f\\xc5\\xb7\\x78\\xa7\\xc8\\x90\\x31\\x7b\\xb6\\x3f\\x89\\x51\\x9a\\xee\\xda\\x8d\\xe9\\x9c\\xa2\\xcf\\x51\\x9a\\x6e\\x61\\x1e\\x68\\x64\\x2f\\xe2\\x31\\xcc\\xa2\\xa5\\x8b\\x28\\x79\\x60\\x44\\xab\\x59\\xcb\\x96\\xcf\\x7f\\xa4\\x0e\\x98\\x4e\\x3f\\x6a\\x10\\x1e\\xea\\x91\\x7d\\x68\\x9f\\xc5\\xf1\\x77\\x9b\\xc3\\x05\\x7f\\xc9\\x26\\xcd\\x48\\x51\\x23\\xb7\\xe1\\x97\\x44\\x2b\\xc8\\x96\\x9e\\x7f\\x29\\x36\\x92\\x7f\\xb5\\x81\\x6b\\x11\\x74\\xde\\x71\\xe5\\xda\\xc4\\x68\\xb6\\x49\\xb6\\x74\\xc1\\xfc\\xd1\\x07\\xc3\\x32\\x47\\xee\\xa8\\x2c\\xb1\\xc2\\x37\\xe6\\xbb\\x97\\x9d\\xcd\\xba\\x69\\xf8\\xad\\x99\\xca\\x48\\xb3\\xa7\\x2b\\x20\\x8c\\xac\\xf0\\x14\\x51\\xd2\\x3b\\xc5\\x28\\xf5\\x7e\\x70\\x79\\xbb\\xb6\\x12\\x0c\\xc3\\xc8\\x06\\xc8\\xb2\\xda\\xf1\\xed\\x68\\xae\\xa7\\xbf\\xc1\\xfd\\xee\\x50\\x1d\\xd6\\xf2\\xcf\\xda\\x11\\x7e\\xaf\\xb0\\x8a\\x69\\xcb\\x9b\\xd0\\x73\\xf9\\xdd\\x24\\x2d\\x6b\\x2a\\x14\\x83\\x03\\x75\\xff\\xf8\\x47\\x59\\x1d\\x6c\\xd4\\xee\\x73\\x20\\x1e\\x02\\xc1\\x44\\x0d\\x7f\\xe2\\x1f\\x9a\\x0d\\x3f\\xda\\x66\\xc7\\xe1\\x9d\\x2e\\x96\\xbf\\xac\\xc7\\x84\\xf2\\x30\\xcc\\x54\\x7f\\xf0\\x29\\xe7\\xd8\\x33\\x28\\x1e\\xc6\\x9f\\x28\\xba\\x32\\x6f\\xae\\x2d\\x37\\xec\\xb5\\xfb\\x5e\\x43\\xa7\\x45\\xb1\\xa6\\x39\\xc1\\xf2\\x53\\x93\\xa8\\x5d\\x0e\\x8e\\xb2\\x5e\\xbb\\x5c\\x99\\x9d\\xb0\\xb0\\xea\\x7d\\x23\\x51\\x57\\x1b\\x4e\\x7d\\x21\\xb3\\x71\\x87\\x5d\\x8b\\x30\\x9c\\xd0\\x7c\\x11\\x62\\xb2\\x2b\\x96\\x9f\\x49\\xa9\\x18\\xc1\\xc4\\x5d\\x29\\x67\\x78\\x7b\\x6c\\xb9\\x3a\\xcb\\x1d\\x2c\\x80\\xae\\x1c\\xf0\\x65\\x82\\x6f\\x60\\x79\\x59\\xa1\\xb0\\xc8\\xe6\\x83\\x98\\xa3\\x71\\xaa\\xd1\\x17\\x01\\xb8\\xfd\\x50\\x0f\\x1e\\x55\\xe9\\xea\\xb2\\xa9\\xee\\x64\\x03\\xef\\x7e\\x03\\x79\\x2f\\x21\\x85\\xd8\\x99\\x18\\x2f\\xe1\\x1e\\x4a\\x77\\xa2\\xf8\\x62\\xde\\x55\\x84\\x51\\xdf\\x22\\xff\\xdf\\xb8\\x77\\xaa\\xd7\\x51\\xea\\x5f\\x5b\\x2e\\x2b\\x35\\xee\\x88\\x10\\x62\\x62\\xf4\\xd0\\x3d\\xc4\\x5e\\x1b\\x41\\x93\\x8c\\x79\\xac\\x34\\xc3\\x00\\xdf\\x12\\xb8\\x4b\\xd1\\x7d\\xbc\\x4a\\x7d\\x4e\\x63\\x73\\x9e\\x21\\x75\\x4c\\x6d\\xec\\x01\\xfd\\xa5\\xda\\xb3\\x0d\\xec\\xc4\\x88\\x6f\\xc7\\x3d\\xb9\\x1d\\x12\\x30\\x0d\\x40\\xef\\x91\\x14\\x02\\x92\\xe3\\x6c\\x4c\\x16\\xca\\xe8\\xde\\xf8\\xfc\\x8e\\xfa\\xfa\\x9f\\xcb\\x47\\x7f\\xfa\\x0a\\x64\\xe6\\x86\\x21\\xe6\\xcb\\x77\\xe2\\x16\\x0b\\x4d\\x8a\\x92\\xb0\\xd6\\x8e\\xf3\\x12\\xab\\x23\\x25\\x1e\\x6f\\xab\\x35\\x50\\xec\\x56\\xc6\\x2d\\x4b\\xca\\xe1\\x7f\\xdb\\x1e\\x2b\\x3e\\x68\\xd2\\x9d\\x1e\\x0d\\x91\\x8c\\x59\\xc4\\x2c\\xca\\xfe\\x6a\\xc1\\xdd\\x48\\x4c\\x63\\xe1\\xd3\\xb8\\xb6\\x7a\\xd1\\x87\\xa7\\x8c\\x9c\\xb9\\x9b\\x25\\x04\\xcf\\x31\\xfb\\xc5\\x12\\xe4\\xc6\\x70\\x83\\x95\\xd4\\xaa\\x41\\x50\\x3f\\x74\\x7f\\xd4\\x1f\\x2b\\x03\\x14\\xb1\\x0a\\x31\\x4e\\x06\\xc3\\xa0\\x34\\x76\\xee\\x68\\x19\\xcc\\x99\\x42\\xf9\\x1f\\x0b\\x18\\x2d\\xfb\\xba\\xf1\\xb8\\x8e\\x8c\\xbf\\x9c\\x70\\x75\\xe1\\x9c\\x7b\\xa1\\xec\\xb9\\xb6\\x7d\\x72\\x5b\\xf5\\x23\\xb8\\x10\\xb3\\xc1\\x4e\\x4c\\x7b\\xe3\\xc7\\x0d\\xd7\\x7c\\x51\\x19\\xa0\\x77\\xce\\x29\\x26\\x9a\\x98\\x48\\xea\\xa1\\x02\\x43\\xd8\\x59\\x43\\xe7\\x0f\\xfd\\xe3\\x5c\\x07\\xcd\\x92\\x98\\xb4\\x95\\xa2\\x84\\x1e\\x9f\\x3b\\xea\\xe1\\x2f\\xf3\\x2f\\xe5\\xdd\\x0e\\xf8\\x44\\x86\\x52\\x18\\x56\\x02\\x6d\\xda\\x52\\x84\\xba\\xab\\x1f\\xb8\\x94\\x49\\xa3\\x21\\xb7\\x30\\x38\\xbe\\xbb\\x88\\x83\\x32\\xe4\\xc3\\x98\\x84\\xe6\\x13\\x39\\x4e\\xa6\\x71\\x8b\\x59\\x8b\\x03\\xd5\\x90\\xc2\\x7d\\x46\\x18\\x61\\x87\\xa9\\xfa\\x3e\\xcb\\x7e\\xd9\\x45\\x44\\xce\\xca\\x08\\x06\\x16\\xff\\x32\\x5d\\x94\\xe5\\x04\\xbe\\x09\\x13\\xe1\\x2c\\x07\\x05\\xe6\\xb7\\x29\\x1c\\x13\\x51\\x4c\\x8b\\x34\\x61\\xcb\\x20\\xbd\\x7a\\x8c\\x45\\xfa\\x93\\xea\\x5a\\xcf\\x5e\\x42\\x12\\x2e\\x23\\x86\\x65\\xcc\\xbb\\x44\\x65\\x3a\\x29\\xee\\x1f\\xf6\\xde\\x4e\\x63\\x67\\x8e\\x05\\x5c\\x7d\\xd8\\x38\\x43\\x0e\\xe3\\xf6\\x19\\x50\\xc2\\x78\\x71\\xa4\\x4d\\x14\\xa0\\x8b\\xd9\\x36\\xcd\\x57\\x59\\x83\\x27\\x28\\xa7\\x67\\xa0\\xb6\\xd1\\x6f\\x39\\x85\\xd6\\x99\\xbd\\x62\\x2f\\x12\\x0e\\x84\\x8a\\xfe\\x6e\\x11\\x1e\\x2f\\x64\\x6f\\xf3\\xff\\x8a\\x7d\\x42\\x1e\\x22\\x5d\\xe0\\x1a\\xd4\\xef\\x54\\x02\\xcb\\x3b\\xd8\\xdc\\x0b\\x9a\\x72\\x77\\x7e\\x9b\\xa4\\xba\\x85\\x4b\\xce\\xe9\\xbd\\xd4\\xea\\x3e\\xd0\\x6d\\x58\\x48\\x62\\x5a\\xfa\\xf5\\x3a\\x6b\\xc8\\x35\\x95\\x4f\\x2d\\xd5\\xc6\\xd9\\x86\\x72\\xb0\\x3e\\xf7\\xc8\\xa8\\x7e\\x9f\\x88\\x30\\x2c\\xc5\\x0c\\x19\\xce\\xd5\\x20\\x42\\x1c\\x17\\xfb\\x85\\x8f\\xcb\\xb4\\xcb\\x39\\x6d\\xdc\\xfe\\x8e\\xd2\\xb7\\xa5\\x5f\\x2c\\xfd\\x19\\xf8\\x4b\\xa9\\x7f\\xa3\\xde\\x5e\\x2b\\xce\\x10\\x42\\x2c\\x14\\xda\\x4b\\xff\\xb9\\x53\\xa2\\xb1\\x81\\xd9\\x4c\\x00\\x94\\x8d\\x69\\x34\\x9e\\x6f\\x16\\x87\\x55\\x2c\\x61\\xce\\x66\\x80\\x61\\x8c\\x74\\x8d\\x5c\\x99\\x88\\x80\\xa1\\xe4\\xac\\x8c\\x7b\\x9c\\x62\\xab\\xb2\\x96\\xfb\\xcd\\xdd\\x71\\xc0\\xbc\\x24\\x18\\xe8\\xe7\\xd6\\xb1\\x9a\\xd1\\x18\\x72\\x2d\\x4a\\x91\\x89\\xf1\\x53\\x8e\\xcd\\x27\\xcb\\x5e\\xba\\xa7\\xc7\\x07\\x36\\xe3\\x7a\\x67\\x83\\xfa\\x3f\\xd1\\xb9\\x05\\x93\\x2f\\x04\\xb2\\x1f\\x79\\x74\\x8d\\xf6\\xa1\\x5f\\x29\\x3b\\x61\\xe9\\x57\\xf6\\x5f\\x6d\\x96\\x64\\xa2\\x49\\xcc\\xb5\\x49\\xa6\\x84\\x2e\\xe6\\xa4\\x4a\\x8b\\x96\\x4b\\xce\\xe9\\xc8\\x72\\xe7\\x9a\\x7b\\xda\\x5c\\xfd\\xd9\\x8d\\xc6\\xd2\\xf9\\xf7\\x3d\\xe9\\x83\\xf7\\xb1\\xae\\x65\\xa4\\x83\\x1d\\x8e\\x39\\x13\\x71\\x79\\x39\\xf0\\x93\\x08\\xa7\\x89\\x83\\x76\\xc1\\x32\\xed\\x75\\x94\\x7f\\x12\\x6a\\x87\\x4e\\xe5\\x24\\x2d\\x28\\x5e\\xb7\\x83\\xab\\x73\\x2d\\x20\\xf7\\x20\\x48\\x0a\\x21\\x7d\\x89\\x47\\xb9\\x59\\x8e\\x2f\\x37\\xb5\\x89\\x46\\x90\\x2b\\xbf\\xf8\\xc9\\x10\\x67\\x62\\xa3\\x99\\xa5\\x3a\\x6e\\x95\\x45\\x69\\xf3\\xc6\\x7a\\xfc\\xef\\x35\\x74\\xec\\xe9\\xd6\\xee\\x09\\x86\\x24\\x74\\x47\\xcf\\xd5\\xa9\\xb8\\xeb\\x7c\\x24\\x03\\x82\\xfa\\xa7\\x4a\\x7f\\xcb\\x6f\\xae\\xa6\\x57\\x4c\\xf9\\xb5\\x67\\x62\\x40\\x2e\\xa9\\x7b\\x56\\x7a\\xad\\xe1\\x7d\\x9a\\x54\\xcb\\x7d\\x4e\\xa1\\xa8\\x3b\\xb2\\xa8\\xa9\\xcf\\x31\\xe8\\x31\\x52\\x75\\x64\\x81\\x37\\xe6\\x83\\xa3\\xdd\\x41\\x74\\xf2\\xd0\\xa8\\x11\\x0c\\x60\\xf0\\x43\\x28\\x52\\xb8\\xd6\\xce\\x3f\\x36\\xe5\\x1c\\xee\\x1c\\x29\\xf6\\x8b\\xc8\\xd4\\x4a\\x93\\x64\\x0e\\x84\\x3f\\x47\\x7e\\x40\\x51\\x5e\\xda\\xae\\xb1\\xef\\x30\\xf4\\x70\\x61\\x69\\x7c\\x8b\\x7f\\x6b\\x2e\\xa4\\x71\\xa2\\x24\\xb4\\x80\\x17\\xe3\\x2c\\xf5\\x72\\x6c\\xf8\\x92\\xeb\\x07\\x36\\xfc\\x92\\x6f\\x5c\\x32\\x11\\x79\\x60\\x53\\x68\\x3f\\x82\\x1c\\xd6\\xc9\\xae\\x75\\xb8\\x80\\xda\\x98\\x4f\\xc8\\x14\\xec\\x20\\xfd\\x42\\xc4\\x14\\xc7\\x08\\x6e\\xf0\\xa6\\xe0\\x9a\\x05\\x5e\\xac\\x22\\x6a\\x10\\xe2\\x05\\xc3\\x58\\x85\\xda\\x3b\\xf9\\xdd\\x23\\x05\\x78\\x17\\x51\\x36\\xf4\\x0e\\x75\\x1d\\x2c\\x62\\x4c\\xcb\\x5c\\x38\\xcb\\x37\\xe9\\x0e\\x16\\x57\\x7d\\xbe\\x72\\x94\\x1b\\x82\\xfc\\x2a\\x4e\\xa9\\xe6\\xb8\\xd3\\x57\\x7d\\x0c\\x60\\xcf\\x0a\\x6e\\xe5\\xf0\\xea\\xf8\\xcf\\x76\\x5a\\x3d\\xff\\x5d\\xb3\\x78\\x41\\x18\\xe1\\xcb\\x61\\xa2\\xb7\\xbe\\xec\\x13\\x05\\xb1\\x70\\x3c\\x8b\\xc7\\x05\\xc4\\x10\\xe4\\xd1\\x6b\\xc1\\xde\\xae\\x4b\\xe5\\xdb\\x9d\\x1b\\xb8\\x0c\\x27\\xf1\\x81\\x28\\xa7\\xbb\\x79\\xc6\\x35\\x22\\x2a\\x26\\x4b\\x52\\x12\\x37\\xd3\\x15\\x24\\x97\\x24\\xa1\\x0e\\x32\\x84\\xc2\\x3c\\xe2\\x9c\\x2d\\x7a\\xf6\\xd9\\x5d\\x15\\xd5\\x0d\\xd2\\x2b\\x27\\x2e\\xd8\\x93\\x95\\xd6\\x45\\x9f\\x8e\\xa0\\x3e\\x65\\x0f\\x76\\x04\\x72\\xca\\x7e\\xe9\\x18\\xff\\x31\\x02\\xbb\\x90\\xab\\xfe\\x03\\xc5\\x59\\x02\\xd4\\x48\\xe3\\x07\\xb9\\x23\\x8f\\x90\\xeb\\x06\\x83\\x74\\x86\\xb1\\x4d\\xdd\\x2a\\x5c\\x68\\x51\\x42\\xc9\\x00\\x4f\\x3c\\x04\\xf7\\xdf\\xa3\\x24\\x46\\x5c\\x5d\\x93\\x93\\x02\\xb6\\x4c\\x5b\\xe4\\xae\\xa7\\x71\\xd8\\x7a\\x93\\x4a\\xc3\\xc3\\x35\\xc3\\xfa\\xcb\\x74\\x88\\xd0\\x7d\\xc0\\xf2\\xc1\\x8a\\x93\\xbf\\x3a\\x35\\xe0\\x85\\x62\\xa3\\x29\\x4c\\x3e\\xe1\\x9d\\x53\\x4c\\x7d\\xe1\\x0a\\xf2\\xb6\\x11\\xad\\x49\\x03\\x75\\x84\\x7f\\xe3\\x68\\x69\\x3e\\x53\\x52\\x16\\x44\\xa1\\x18\\xdb\\xf6\\x29\\x1d\\x51\\x54\\xa8\\x49\\x69\\x10\\xc3\\xdf\\x30\\x35\\x97\\xd6\\x1e\\x4f\\xb9\\xc2\\xf2\\xed\\xbf\\x5a\\x91\\x17\\x7a\\x66\\x86\\x23\\x18\\xa2\\x8d\\xce\\xae\\x0d\\x16\\x09\\x6b\\xf2\\xb2\\x50\\x4d\\xe7\\x38\\x50\\xc8\\xcd\\xc0\\x32\\x91\\x24\\x77\\x36\\x33\\xed\\xe6\\xac\\x26\\xc0\\x77\\x81\\xaa\\xf6\\x7b\\x59\\x2a\\x22\\x56\\xae\\x77\\xbe\\xc2\\x50\\x34\\xff\\x37\\x19\\x73\\xa0\\x66\\x53\\x53\\xe6\\xaf\\xfc\\x09\\xab\\x4b\\x21\\x1d\\x28\\x37\\x1c\\xe6\\xa5\\x1d\\x67\\xb9\\xdb\\x94\\x28\\xeb\\x2a\\xf7\\x3d\\x88\\x4a\\xc8\\xd2\\x46\\x27\\x14\\x03\\x66\\xf5\\x04\\xc6\\x50\\xea\\xd9\\x47\\x5a\\x2d\\xf6\\xf7\\x46\\x42\\x8b\\x19\\x44\\x81\\x82\\x82\\xb2\\x75\\x66\\xc6\\xe6\\xaf\\x72\\x7d\\x68\\x0b\\xc4\\x26\\x3e\\xb9\\x5f\\xab\\x6a\\x04\\x45\\x54\\x9a\\xb1\\x0c\\x30\\x87\\x17\\xe0\\xab\\x25\\x23\\xba\\x20\\xe7\\x71\\x13\\xfa\\x4e\\x83\\x00\\x7d\\xa8\\x15\\x5d\\x03\\x12\\x2f\\xbc\\xe6\\x15\\xd8\\xda\\xe1\\xfb\\xb6\\x4e\\x7e\\x88\\x5b\\x2e\\xd8\\xd2\\x3f\\xb1\\xfe\\xf9\\x89\\xdd\\xea\\x13\\xb9\\x3c\\xa4\\x73\\x57\\x02\\x62\\x63\\x69\\xe9\\x54\\xd5\\xe4\\x1d\\x5b\\x1d\\x3a\\x44\\x2e\\xae\\x26\\x55\\x08\\x5c\\x52\\x56\\xbb\\x43\\x66\\x98\\x3b\\x3c\\x8f\\x95\\xf5\\x69\\xd4\\xac\\xcc\\xcb\\x98\\x9c\\x61\\xf0\\x74\\x84\\x2c\\x5e\\xd9\\x11\\xae\\x65\\x6b\\x1b\\x0e\\xf7\\x6c\\xa4\\x37\\xa4\\xeb\\x20\\x42\\x12\\x65\\xca\\x69\\xee\\x92\\x30\\xe5\\xb2\\x89\\xbb\\x25\\x50\\x59\\xb2\\x44\\x11\\x20\\x2c\\xb9\\x02\\xe3\\x02\\xa9\\xd3\\x7e\\xcc\\x82\\xc7\\x89\\x7c\\xf9\\x7b\\xf6\\x7e\\x1c\\xd4\\xf9\\x7f\\xc2\\xef\\xa5\\xc7\\x94\\xaa\\x0b\\x65\\x8a\\x9d\\xb9\\x3f\\x61\\x8b\\x23\\x74\\x83\\x73\\x65\\x73\\x13\\xae\\x2e\\xcd\\x1c\\xc0\\xe7\\x2a\\x62\\xa3\\x03\\x4f\\x5a\\xba\\xb1\\xc7\\x7f\\x7d\\x25\\x4a\\xa8\\x8f\\x53\\xa8\\xaf\\xea\\xbc\\x08\\x33\\xad\\x1b\\x81\\x87\\xe4\\x0b\\x01\\xaa\\xc2\\x1f\\xdd\\xcf\\x19\\x2c\\xf8\\x2b\\xa2\\xa5\\xd7\\x47\\x35\\xea\\xd3\\x8b\\x83\\x93\\x12\\xb9\\xf0\\xaf\\x22\\xf2\\x11\\x49\\xa5\\x95\\x38\\x5e\\x7d\\x9d\\x1f\\x72\\x4b\\xee\\x56\\x58\\xec\\x70\\xf1\\xd1\\xd6\\xe6\\x5f\\xd9\\x01\\x7f\\x61\\xf1\\xa1\\x5e\\x88\\x87\\x1a\\xa7\\x3a\\xf4\\x56\\x31\\x26\\x1b\\x9d\\x72\\x01\\x87\\x3c\\xda\\x17\\x48\\x89\\x81\\x8f\\xc7\\x3f\\x58\\x44\\x89\\x11\\x1a\\x62\\x31\\x45\\xc5\\x91\\x4c\\x87\\x6e\\x9d\\xdd\\x10\\x3a\\x9d\\x12\\xe9\\xdd\\xe0\\x8f\\x0f\\x41\\x84\\x93\\xa3\\xff\\x12\\xe6\\x33\\x42\\x8d\\x70\\x08\\xd1\\xb9\\x36\\x66\\x3f\\x54\\x2c\\x4a\\xa9\\xea\\xd4\\x1b\\x2a\\xd4\\x07\\xa2\\xd2\\x12\\x1e\\x7a\\xab\\x91\\x2d\\xdc\\xf6\\x23\\x93\\xb9\\xf6\\x99\\xd5\\x70\\x7f\\xf2\\x52\\x92\\x36\\xa6\\xd3\\xf6\\xd4\\x54\\xf5\\xdf\\x21\\x41\\x24\\x51\\x0c\\x08\\x53\\x59\\x63\\xef\\xd8\\x3c\\x34\\x69\\xe0\\x16\\xf0\\x3a\\x1e\\x84\\x2e\\x90\\xbc\\xff\\x85\\x34\\xcd\\xc1\\xc6\\xe4\\x34\\x6b\\x6f\\x51\\x6f\\x63\\x8c\\x37\\x62\\x0e\\x7b\\x16\\x52\\xd6\\xd3\\x71\\xfe\\x37\\xb4\\x3a\\xf5\\x1c\\x59\\x06\\x53\\x47\\x33\\x75\\x66\\x43\\x5e\\x54\\x26\\xdd\\xa3\\xb5\\xab\\x5d\\xff\\x73\\x17\\x49\\xa9\\x8e\\x04\\xd4\\xc4\\xcb\\x31\\x2b\\xa0\\xae\\xf4\\x3b\\x5c\\x57\\xdb\\x18\\xb6\\x60\\xa9\\x72\\xfb\\xb6\\x5b\\x8b\\xfa\\xab\\xc1\\x0f\\x26\\x9e\\x24\\x9c\\x61\\xf4\\x56\\x54\\x29\\x7a\\x04\\x8f\\x21\\xda\\x61\\x46\\xf5\\x8c\\xd6\\xdd\\x3f\\xb9\\x85\\xea\\xa1\\x45\\xc8\\x99\\x86\\x0a\\xba\\x97\\x8b\\x9a\\xa2\\x9e\\xa0\\x29\\x53\\xdb\\xc1\\x5f\\x2e\\xb5\\xd8\\xf2\\x16\\x7b\\x41\\x51\\x94\\xe9\\xf1\\x6d\\xfc\\x74\\x42\\xca\\x78\\x15\\x04\\x58\\x9c\\x63\\xcb\\x49\\x03\\x53\\xe8\\x08\\xd8\\xa7\\x93\\x36\\x6b\\xed\\x25\\xce\\xdf\\x9e\\x85\\x15\\xbc\\x4c\\xf4\\xd7\\x8c\\x04\\x81\\x78\\x54\\x6f\\x83\\xe7\\x3c\\xc1\\x67\\x07\\x29\\x33\\x42\\x9b\\xa3\\x2f\\xca\\x9e\\x93\\x75\\xd7\\xf4\\x1d\\x5d\\x50\\x55\\x2b\\xae\\xca\\xad\\x11\\x0a\\x8e\\xff\\x64\\xbe\\xb4\\xca\\x02\\x41\\x28\\x1e\\xa9\\xfc\\x04\\xc7\\x2a\\xd7\\x43\\x44\\x39\\x16\\x9a\\x59\\xd7\\xd2\\x15\\x6c\\xd4\\xdb\\x4d\\x64\\xf4\\x57\\x02\\xd9\\xb6\\xd7\\xca\\xc8\\x57\\x8f\\xa2\\x83\\x82\\xdf\\xbb\\x66\\x1b\\x09\\xe0\\x01\\x84\\x47\\x98\\xd0\\xcd\\xef\\xc4\\x8a\\x3e\\xa3\\x4b\\x12\\xc5\\x44\\x10\\xc4\\xcf\\x85\\x66\\xa0\\xa2\\xc1\\x94\\x99\\x2e\\x7c\\xf2\\xd8\\x57\\x67\\x83\\x49\\x37\\xfd\\x38\\x36\\x03\\xa8\\x3a\\xc6\\x6f\\x25\\x8d\\xe2\\x45\\x66\\x2c\\x90\\xa9\\x36\\xc2\\x48\\x2d\\x68\\xf2\\x4a\\x96\\x36\\x9e\\x85\\x78\\x0c\\xad\\xab\\x0b\\x5d\\xc4\\xce\\x57\\x28\\x1f\\xd6\\xda\\xdb\\x54\\xc0\\x54\\x4b\\x25\\x0d\\x6e\\x81\\x6b\\xe0\\x7a\\xdc\\xac\\x4c\\xac\\x57\\xfa\\xf7\\x73\\xeb\\x3f\\xbd\\x41\\x0c\\x0b\\x0b\\x5a\\xc9\\xa0\\xc2\\x72\\xd5\\x98\\x05\\xdf\\x62\\x58\\x21\\xaa\\x4c\\xe1\\x49\\xfb\\x96\\xba\\x01\\x3a\\xea\\x87\\x71\\xa9\\x31\\xa9\\x22\\xc1\\xa0\\x22\\x9b\\x29\\xeb\\x3c\\xbd\\x75\\xe6\\x76\\x3e\\x84\\x9a\\x98\\x33\\x40\\x9c\\x04\\x0c\\xc7\\x97\\xa8\\xed\\x72\\xe5\\x14\\x15\\xa9\\xc9\\xaf\\xdc\\x80\\x17\\x77\\x12\\x34\\x07\\x67\\x22\\x91\\xab\\x44\\x5f\\xdf\\xa9\\xa9\\x8e\\xda\\x17\\x00\\x62\\x9c\\xe3\\xfb\\x54\\x77\\x92\\x0c\\xa9\\x8a\\x8e\\x63\\x88\\xaa\\x8f\\xe7\\x65\\xc8\\xe0\\xa1\\x6f\\xfe\\xd6\\xf6\\x15\\x06\\x48\\xc5\\xf7\\x4b\\xfc\\x8e\\x85\\x59\\x51\\x3a\\x29\\x80\\x2b\\x24\\x96\\x98\\xd3\\xda\\x55\\x9a\\x16\\xc4\\xae\\x9e\\x07\\x65\\x25\\x25\\xd8\\x5e\\x58\\xb0\\xab\\x8c\\xeb\\x13\\xdc\\xc6\\x22\\x9d\\x87\\x77\\x56\\x58\\xa2\\xfc\\xb7\\x23\\x23\\x2e\\xf9\\x1c\\xb2\\x1c\\x19\\x5f\\x36\\xb0\\xbc\\x30\\xa2\\x2e\\x6b\\x75\\xa9\\x87\\x8d\\xe4\\x29\\x65\\xad\\x0f\\x2d\\xfc\\x3b\\xf5\\x44\\x78\\xbd\\x8d\\x7a\\x73\\xec\\x48\\x14\\x2b\\x9b\\xde\\x8a\\x1a\\xad\\xb8\\xb0\\x29\\x32\\x36\\x8e\\x0c\\x92\\x6a\\x6a\\x40\\xee\\x2f\\x6c\\x3a\\xf4\\xfb\\xfa\\x25\\x9d\\x92\\x4a\\x8c\\x0b\\x6f\\x0c\\x2a\\xab\\xdf\\xe7\\x37\\x08\\xdb\\x5c\\x6a\\x5c\\xf8\\x6a\\x6a\\x5a\\xc3\\x46\\xfc\\x03\\x43\\xf9\\xee\\x5b\\x68\\xdf\\xec\\x31\\xa2\\x08\\x15\\xe1\\x87\\x33\\x3b\\xb4\\xfb\\x30\\x2a\\xd0\\x34\\x04\\x42\\xdc\\x46\\xe6\\x1e\\xe8\\x32\\x54\\xa8\\x21\\x8b\\x71\\x28\\xc2\\x33\\xef\\x9d\\x87\\x97\\x4f\\x38\\x62\\xa2\\xb1\\x02\\x43\\x68\\xd4\\x75\\x7b\\xd7\\x9c\\xf9\\xe5\\x49\\x3b\\x37\\x49\\xf2\\x43\\x5c\\x59\\x74\\x1c\\xdc\\x8c\\x60\\x9a\\xa4\\x94\\x4b\\x65\\x13\\x1b\\x28\\x87\\xaf\\x64\\xa6\\xd7\\xcf\\xb0\\xaa\\xc8\\xa6\\x46\\x83\\xc5\\x7a\\x0b\\x2e\\x9c\\xcc\\xc4\\xc9\\xa2\\xf6\\xf9\\xbc\\x67\\x05\\x88\\x86\\x7d\\xba\\x16\\x13\\x2d\\x8e\\x8f\\x5c\\x02\\x5c\\xee\\xf4\\x18\\x4e\\xcd\\xa4\\x52\\xd1\\xbc\\x64\\xcd\\xa7\\xf2\\x09\\x69\\x44\\xf0\\x7d\\xef\\xf2\\xcd\\x61\\xdc\\x68\\x6a\\x30\\x80\\x19\\x6f\\x98\\x65\\x21\\xe2\\xf1\\x31\\x0d\\xbb\\xb1\\x5f\\x77\\xda\\x43\\x04\\xb0\\xdb\\x7d\\xbd\\x7f\\x8c\\x17\\x09\\xa2\\x98\\xa4\\xdc\\xa0\\x16\\xe9\\x8d\\x7d\\x22\\xb7\\x28\\x09\\x83\\xec\\xf3\\xf4\\xe3\\xca\\xe1\\x34\\x94\\xdd\\xf8\\x8d\\x18\\x8e\\xcc\\x2e\\xd4\\xf2\\x80\\xea\\x36\\xa5\\x9c\\x7e\\x85\\x51\\x93\\xa0\\x6a\\x4d\\x16\\x6a\\x5c\\xa5\\x46\\x17\\xbe\\xdc\\xaf\\x27\\xfc\\xfb\\x0e\\x13\\x0c\\x75\\xa4\\x57\\xc4\\x99\\x95\\x58\\x50\\x4b\\x75\\x6a\\xea\\x4a\\xc1\\x55\\x64\\x70\\xba\\x1e\\x6e\\x2a\\xd9\\xfc\\x4f\\xb0\\x7e\\xd8\\xbe\\x17\\x19\\xd2\\xb8\\xba\\x4b\\x8b\\x86\\xed\\xa7\\xc3\\xf7\\xa4\\xc4\\x18\\x7f\\x67\\xfa\\x51\\xbc\\x19\\x8e\\x70\\x0d\\x77\\x00\\x66\\xa5\\x83\\xcc\\x35\\x99\\x18\\xc0\\x92\\xaa\\x22\\x7a\\xfb\\x51\\x7e\\x26\\x8e\\xae\\xbf\\x86\\xc8\\xf3\\x71\\xe7\\x63\\x03\\xc1\\xba\\xeb\\xbf\\xd0\\x3d\\x27\\x9d\\xaf\\x78\\x4f\\xdb\\x6a\\x22\\xe9\\xee\\xa5\\x5f\\xc5\\xba\\x6d\\xe1\\x4a\\x0f\\xbe\\x57\\xaa\\x31\\x0b\\xf0\\x40\\xe9\\x4c\\xc3\\x3b\\x2f\\xc4\\xc7\\x60\\x9e\\x9c\\xa6\\xcc\\x71\\xb5\\x68\\xcd\\xb8\\x55\\x8d\\x9a\\x53\\xee\\x75\\x58\\x03\\x89\\x13\\x49\\x6d\\x32\\x5c\\xb2\\xf6\\x6b\\x21\\x4e\\xb6\\xc8\\xef\\xa9\\x29\\xae\\x9b\\xee\\x6e\\x42\\xdc\\xd2\\x2b\\x49\\xf3\\x1c\\x9b\\xd2\\xce\\x01\\x92\\xdf\\xe5\\xef\\xc9\\xd2\\xa5\\x5a\\x62\\x70\\x2a\\xc5\\x24\\x62\\xdb\\xb2\\xfd\\x7d\\x66\\x32\\xf1\\x54\\x97\\x99\\xda\\x86\\x58\\x7e\\x12\\x78\\x75\\x29\\x16\\x8f\\x21\\x65\\xff\\xf7\\xbd\\xe5\\x82\\xd8\\x5d\\x2c\\x6f\\xd0\\x54\\x8e\\x9e\\x79\\x19\\x03\\x47\\xe6\\xcf\\xba\\xea\\xd8\\x5f\\xc9\\xcf\\x18\\xbc\\xe0\\x4f\\x0f\\x40\\xf8\\x8c\\x05\\x58\\xb9\\xb3\\x39\\x30\\x6c\\x1c\\x03\\xe1\\x02\\xdb\\xc5\\xf1\\xed\\xbc\\xf7\\x5c\\x0e\\x1a\\x94\\xc2\\xb5\\x9b\\x74\\x83\\xd0\\x46\\x69\\x91\\xac\\x30\\x71\\x04\\x56\\xc2\\x02\\xf9\\xf2\\x94\\x43\\x46\\x41\\x7d\\x2c\\x68\\x0c\\xe8\\x7f\\x6f\\x3a\\x80\\x64\\x94\\x24\\x0e\\x92\\x8c\\x19\\x04\\x42\\x1b\\xe0\\x85\\x04\\x37\\xc9\\x2c\\xa4\\x0d\\x6e\\x49\\x7c\\xc6\\xf7\\x90\\xc5\\x21\\x61\\xbd\\x6d\\xcc\\x71\\xc6\\xb9\\x72\\x8d\\x0a\\x2c\\x67\\x94\\x7f\\x3f\\x25\\xec\\x6f\\x13\\x31\\x1b\\x27\\x89\\x04\\x9e\\xdb\\x56\\x55\\xb2\\xf2\\xf7\\x46\\x5e\\xaf\\x06\\xec\\x65\\xb7\\x08\\x3f\\x3e\\x10\\xba\\x2d\\x0d\\x24\\xd2\\x25\\xa2\\xec\\xc1\\xd2\\x21\\xe6\\x08\\x91\\x21\\x94\\xd9\\x4a\\x4c\\xab\\xa5\\x31\\xa6\\x30\\x54\\xbe\\xda\\x57\\xd3\\x02\\xaf\\x3a\\xf4\\x0f\\xf8\\x42\\xc3\\x23\\xba\\x08\\xab\\x63\\xf8\\x42\\xef\\x39\\x30\\xfc\\x13\\xcb\\xc8\\x3e\\x95\\x6e\\xce\\x2e\\x0f\\x20\\xbe\\x3c\\xdc\\xc1\\xfb\\xea\\xc0\\x39\\x6c\\xca\\x8b\\xc4\\x5a\\x41\\xdc\\x73\\xd6\\xb3\\x37\\x7b\\x5e\\x4a\\x7a\\x06\\x24\\xd5\\x60\\xbe\\xb6\\x4c\\x2c\\x34\\x07\\xfa\\x69\\xd0\\xde\\x68\\x3b\\x4f\\x64\\x40\\xe0\\x17\\x4a\\x87\\x9c\\x34\\x30\\x2e\\x33\\x06\\x43\\xab\\xa6\\x6c\\x69\\xab\\x3e\\x1f\\x26\\xe0\\x2b\\x1d\\xe5\\x4b\\x22\\x3a\\x67\\x65\\x6d\\x77\\x7c\\x2d\\x0d\\x8b\\x23\\x62\\x17\\x20\\x40\\x71\\x63\\x1c\\xa0\\xc7\\x1e\\xbe\\xd2\\x74\\x8d\\x5d\\x6b\\xaf\\x69\\x18\\x2f\\xcf\\x9a\\xc4\\x60\\x36\\x85\\x60\\x2b\\xb3\\xf4\\x42\\x0e\\xa0\\x0e\\xbc\\x6f\\x13\\x01\\x88\\xc7\\x0c\\x87\\x90\\x01\\xbb\\x37\\x3c\\x72\\x0d\\xf5\\x30\\x4d\\xc0\\x7f\\xae\\xcb\\xcd\\x47\\x5e\\x07\\xc9\\x1e\\x4c\\xa9\\x26\\x5d\\x99\\x52\\x77\\xb0\\xa7\\x92\\x7d\\xc8\\x98\\xdf\\xa8\\x0c\\x8d\\xc5\\x41\\xfb\\x1f\\xd2\\x30\\x14\\xa3\\x99\\xb7\\x68\\x6c\\xe0\\xdc\\x88\\x63\\x85\\xd1\\x2d\\x32\\x23\\x12\\x32\\x71\\x94\\x5e\\x30\\xeb\\x3f\\xd3\\xe9\\xa6\\x58\\x04\\x3a\\xd0\\x1a\\xa2\\x3a\\xa8\\x09\\x85\\x28\\x32\\x5e\\x6c\\x33\\x85\\x9b\\xca\\x57\\x38\\x0a\\x67\\x25\\x4a\\xb7\\x13\\x4c\\xfc\\x0c\\xd0\\xb8\\x2c\\x99\\xdb\\xbe\\xb2\\x4f\\x1c\\x37\\x7b\\x3d\\xe1\\xa3\\xb2\\x18\\x7c\\xef\\x6c\\x79\\x2a\\x8d\\x2a\\x65\\x06\\x51\\xd2\\xa0\\x42\\xb8\\x53\\x60\\x29\\x17\\x8e\\xee\\x73\\x7c\\x20\\x0d\\x9e\\x8f\\x77\\x4c\\xb9\\x2d\\xa6\\x6e\\x4e\\x71\\x83\\x21\\x14\\x84\\x70\\x4e\\xdf\\x99\\xc9\\x4e\\xf8\\x2e\\x16\\x17\\x28\\xa8\\x43\\x61\\x30\\xeb\\x10\\x69\\x5b\\xdb\\xde\\x61\\xd8\\x4b\\x8e\\xa1\\x49\\x86\\x31\\xf2\\xc1\\x32\\xce\\x0f\\xd1\\x3b\\xf3\\x02\\x75\\xaa\\x88\\xef\\xc4\\x3c\\xf8\\xda\\x8d\\x5b\\x4b\\x59\\x44\\xc4\\x02\\xd5\\xeb\\x2d\\x55\\x1f\\x2c\\x96\\xfb\\x8d\\x11\\x5d\\x81\\x98\\x60\\x68\\x48\\x2f\\x0c\\xd0\\xa5\\xaf\\x3a\\xf8\\x55\\xe9\\x9f\\x7f\\x11\\xfb\\x63\\xad\\xf7\\x3b\\xd3\\x5d\\x75\\x3d\\xae\\x67\\x07\\x73\\x80\\x1d\\x94\\x98\\x68\\xb5\\xe9\\x27\\xe1\\xc7\\x9d\\x0f\\x43\\x02\\xbb\\x71\\x14\\xdd\\xf8\\xf3\\x09\\x70\\x3c\\x05\\xce\\x11\\x41\\x5d\\x14\\x01\\x9b\\x75\\xe1\\x59\\x1a\\x66\\x0a\\xde\\x9e\\x37\\x45\\x8c\\x93\\x44\\xb6\\x89\\x3b\\x0c\\x68\\xa9\\x3f\\x4b\\x11\\x67\\xe6\\x06\\xc7\\xf6\\x9f\\x45\\xc0\\x0c\\xe9\\xcd\\x8a\\xf8\\x90\\xd3\\x73\\x20\\xa1\\x1c\\x89\\xb5\\xec\\x29\\x45\\x1e\\xcd\\xf1\\xcb\\x75\\x89\\xf4\\x41\\xce\\x96\\x28\\x1a\\xfc\\x98\\xa8\\x86\\x18\\x53\\x11\\x71\\x8b\\x17\\x05\\x03\\x7c\\x10\\xc2\\x50\\x51\\xb7\\xa7\\xd1\\x5f\\xbe\\xad\\xf1\\x42\\x5c\\x66\\xb5\\x4a\\xdb\\x1e\\x8b\\xb5\\x6b\\xbf\\x5b\\x80\\xe3\\x38\\x95\\x57\\x24\\xcb\\xf0\\x5c\\xc0\\xbb\\x6e\\xa6\\x7b\\x95\\x5b\\xa3\\xbb\\x12\\x0b\\x0a\\x5c\\x62\\xf4\\xae\\x36\\x6e\\x10\\x05\\xe9\\xea\\xc5\\x77\\x20\\x95\\x4a\\x07\\x1c\\x86\\x2b\\xd0\\x7b\\x1f\\xf9\\x0d\\xee\\x83\\xe6\\x1c\\x83\\x18\\x30\\xb8\\x37\\x86\\x7d\\x09\\x1b\\x95\\x36\\x59\\xe6\\x2d\\x14\\x63\\xc3\\xf2\\x6a\\x20\\xba\\x98\\x9c\\xf0\\xfb\\xa1\\xe0\\x06\\x8c\\x15\\xfa\\xa0\\x1a\\x05\\xb2\\x52\\x50\\x56\\x25\\x53\\x12\\x09\\xb8\\x67\\xb8\\xbe\\xea\\x82\\x1b\\xea\\x36\\xe7\\xb3\\xf4\\xe4\\x4f\\x86\\xdb\\xd4\\x3e\\x77\\x42\\xf6\\xd7\\xcc\\xf4\\xb1\\x59\\xe3\\x4b\\xff\\x6a\\xa6\\x64\\x07\\x50\\x4a\\x67\\xce\\xda\\x9c\\x67\\x09\\x1c\\x93\\x97\\xad\\x4b\\x74\\x69\\xf5\\xad\\xab\\x95\\x1a\\xff\\x25\\xa0\\xd4\\xfa\\x27\\x0c\\x9b\\x8b\\x55\\xa9\\x84\\x79\\xd2\\x26\\xa5\\x30\\xff\\x3e\\xab\\x61\\x06\\xcd\\x5d\\x82\\x72\\x0b\\x77\\x24\\x04\\x8e\\xb0\\x96\\x54\\x60\\xd1\\xb9\\xba\\x76\\x06\\xc4\\xea\\x8b\\xaf\\x28\\xa7\\x62\\xc7\\x27\\xa9\\x60\\x11\\xa5\\xc4\\xce\\x46\\xa5\\xce\\xed\\x56\\xb0\\x51\\xa6\\xab\\xc7\\x9d\\x29\\x62\\x8e\\x26\\xd5\\xe9\\x5c\\x6d\\x87\\xbd\\x21\\xed\\x2c\\xb5\\x1a\\x04\\xc7\\x87\\xf5\\x65\\x78\\xca\\x85\\xe1\\xd2\\x22\\x8b\\x57\\x85\\x2b\\x73\\x53\\x75\\xab\\x66\\x69\\xe3\\xe7\\x76\\xd1\\x60\\x8c\\x77\\x04\\x2d\\xb0\\x50\\x08\\xaf\\xec\\xea\\x15\\xe3\\x4a\\x65\\x96\\x27\\xe0\\xaa\\xd3\\x2a\\x59\\x4f\\x57\\xd8\\x12\\xe7\\x44\\x5a\\x46\\x6c\\x26\\x7b\\xd4\\xee\\x5c\\x8c\\x10\\x9a\\x45\\x7e\\x0d\\x6f\\x68\\xce\\xc7\\xc6\\xf1\\x7a\\xce\\x70\\x4b\\x7b\\xe7\\x48\\x16\\xa4\\x85\\xc2\\x22\\x3b\\x1b\\x34\\xdc\\x3f\\x68\\x41\\xdc\\xb8\\xb3\\x7a\\xdb\\x4e\\x94\\x48\\x77\\x88\\x38\\x93\\xb1\\x82\\xd1\\xfc\\x5f\\xdf\\x38\\x9f\\x19\\x90\\x6e\\x43\\x98\\x46\\x84\\x16\\x6d\\x6e\\x38\\xf7\\xbf\\x53\\x30\\x13\\x0c\\x09\\xe8\\xe0\\xbf\\x2f\\xbf\\x2b\\x9f\\x0e\\xdd\\x74\\xd4\\x07\\x6c\\xc9\\x81\\x8c\\xc4\\xda\\x62\\x8e\\x3e\\xb6\\xc4\\x3a\\x80\\x4d\\xce\\xc0\\x70\\xa3\\x6f\\x70\\x17\\xfa\\x19\\x1b\\xa1\\x84\\xe0\\x22\\xd5\\x67\\x97\\x4a\\xaa\\x66\\xb2\\xb2\\xd9\\x95\\xad\\x17\\x57\\x8a\\x23\\xa4\\x2a\\x21\\x18\\xf5\\x42\\xec\\x30\\x8b\\x7f\\x13\\x57\\x35\\x19\\x62\\xc0\\x50\\x2a\\xb2\\x50\\x8a\\x76\\x19\\xc3\\x51\\x6b\\xa5\\x48\\x0e\\x84\\xc8\\x1e\\x25\\x6c\\x8c\\xe0\\xb2\\x8c\\x11\\xdb\\x50\\xfc\\x88\\xc4\\x60\\x53\\xb9\\x3b\\x0e\\x9b\\x98\\x6a\\x76\\x0c\\x1c\\x3a\\x00\\xac\\x73\\x56\\x67\\x46\\x38\\x25\\xb4\\x04\\x68\\x36\\x73\\x7c\\x60\\xd7\\x6a\\x8a\\xe1\\xd2\\xcc\\x5e\\xde\\x9c\\xca\\xde\\x3e\\x0a\\xc0\\xf4\\x22\\x29\\x80\\x18\\x64\\x7d\\xab\\x5e\\x53\\xff\\x45\\xec\\x38\\xed\\x63\\x19\\x5e\\x02\\x7b\\x0c\\x7e\\xe6\\x54\\x1a\\x95\\xa8\\x83\\x2c\\x7e\\xcb\\x36\\x26\\x05\\x15\\xf9\\xaf\\xb3\\xb6\\x8f\\x62\\xdc\\x88\\xb4\\x04\\x97\\x94\\xef\\xf5\\x0a\\x99\\x9b\\x13\\xcb\\xee\\x92\\xe7\\x49\\x41\\x06\\x8e\\x28\\x70\\x46\\xe1\\x6f\\x99\\xdf\\x4f\\x74\\x4d\\xcf\\x4b\\x61\\x36\\x85\\xf0\\xd7\\x35\\x75\\xca\\x96\\x25\\x23\\x87\\x27\\xc8\\x4a\\x4b\\x2c\\xf0\\x78\\xe6\\x85\\xd4\\x67\\x9a\\x84\\x12\\x69\\xa9\\xd2\\xb5\\xc5\\x34\\x97\\xf7\\x0e\\x45\\x66\\x63\\xe3\\xe5\\x2f\\x5f\\xc4\\x51\\x2a\\x26\\x87\\x03\\x66\\x01\\x9b\\x48\\xb0\\xb8\\x7c\\xcb\\x22\\x47\\x5f\\x07\\xa4\\x8a\\xf9\\x58\\x52\\xef\\x09\\x55\\x1a\\x79\\x98\\x05\\xe4\\x9b\\x3d\\x34\\xcc\\x05\\x1f\\x04\\x0e\\xd8\\x20\\x46\\x44\\xae\\x53\\xa8\\xae\\x2a\\x67\\xf7\\xf5\\x14\\x2f\\x0c\\x48\\x79\\x52\\x88\\xc4\\xb6\\x73\\xc8\\x27\\x2e\\x18\\xd3\\x78\\xbe\\xaa\\xee\\xfe\\x8a\\x0c\\xa1\\x68\\x1d\\x18\\x6e\\x42\\x41\\x0d\\x94\\x41\\xba\\xc4\\x2b\\x5d\\xe8\\x61\\x06\\x3a\\x97\\xad\\x76\\x42\\x76\\x12\\xe6\\xa3\\xa9\\xb1\\x32\\x07\\xe6\\xf6\\x11\\x2c\\x58\\x2d\\x39\\x98\\xd8\\xad\\x2e\\x98\\x11\\xd3\\x3c\\x12\\xed\\xeb\\x9f\\x81\\xb6\\x3c\\x60\\xc9\\x2b\\x39\\x61\\x1c\\xd5\\x79\\xa2\\x69\\xc2\\x14\\x95\\x22\\x88\\xbb\\x95\\x8c\\xd9\\xf6\\x0f\\x62\\x63\\xe8\\x9a\\x79\\xe0\\x3f\\xb4\\xe2\\xef\\x3f\\xb5\\x05\\x56\\xca\\xcc\\x30\\xff\\xba\\x6d\\x8c\\x3b\\x46\\xab\\x8f\\x5a\\x58\\x25\\x5c\\xc0\\xe4\\x2d\\x66\\xfa\\x32\\x98\\x29\\x66\\xce\\xfe\\x0e\\xc6\\x92\\x59\\x98\\x06\\x4a\\x50\\xa0\\x34\\x56\\x64\\x3c\\x15\\x28\\xf2\\x35\\x68\\xe5\\x4b\\x42\\xb0\\x51\\x51\\xfd\\x0e\\x02\\x29\\x51\\x2d\\x49\\x08\\x70\\x30\\x95\\x5e\\xd0\\x2e\\x8f\\x47\\x50\\xe5\\x0a\\x6c\\xae\\xf0\\xef\\x53\\xed\\xaa\\xc4\\x59\\x7c\\xf1\\x3c\\x0e\\xe9\\xe4\\xac\\xe8\\x89\\x4a\\x25\\x30\\xc4\\xc6\\x2b\\x80\\xac\\x6b\\xa6\\x52\\x32\\x74\\x12\\xc6\\x08\\xb7\\x01\\x81\\x32\\x02\\x42\\x6b\\x89\\xca\\x08\\xef\\xf1\\xb8\\x6d\\x29\\x13\\x31\\x1e\\xac\\x89\\x5b\\xc0\\xea\\x7c\\xca\\x0a\\x6b\\xea\\x1c\\x33\\xb9\\x55\\xaa\\x30\\xfa\\xd9\\x50\\xba\\x0f\\xa8\\xf1\\x42\\x50\\x0b\\xdb\\x74\\x12\\xed\\xc3\\x99\\xec\\x9d\\xe5\\x28\\x1a\\xc9\\xe2\\x59\\x9f\\x4b\\xa7\\xdb\\x58\\x19\\x98\\xc4\\x54\\xc2\\x5c\\x74\\x22\\x19\\xa6\\xc4\\xd9\\x4d\\x8c\\x8e\\x97\\x51\\x9a\\x78\\x79\\x39\\x03\\x0e\\x4b\\x28\\x6c\\x4d\\x16\\xe1\\xb5\\xf0\\x71\\x39\\x91\\x9f\\x5b\\xbc\\xb0\\x1f\\x2b\\x4f\\x81\\x54\\x92\\x72\\xfa\\x54\\xa9\\x49\\x9d\\x59\\x1e\\xe5\\x56\\x93\\x46\\x22\\x82\\x77\\x5a\\xcd\\x2c\\x57\\x27\\x20\\x68\\xed\\xd4\\x12\\xeb\\xb7\\x12\\xad\\x10\\x38\\x1c\\x2c\\xc2\\x07\\x2d\\x33\\x81\\x5a\\x7c\\x81\\xe2\\x67\\xd1\\x1e\\xa5\\x6a\\x5b\\x70\\xdf\\x16\\x40\\x5f\\xa3\\x92\\x22\\x5b\\x8e\\x5f\\xb7\\x94\\xc5\\x99\\x79\\xc4\\xfb\\x15\\xd7\\x42\\x0b\\x13\\xa3\\x93\\x68\\x6b\\x40\\x48\\x87\\x04\\xda\\x5a\\x82\\x3b\\x8e\\xdd\\x9a\\x9f\\x6a\\x88\\xdc\\x03\\x81\\x17\\xfa\\xb1\\x21\\x44\\x7c\\x83\\xb9\\x21\\x25\\x96\\xa9\\xbe\\x3a\\xf3\\x10\\x95\\x7d\\xd9\\x08\\x40\\x4b\\xf1\\x4f\\xe7\\xe5\\xc5\\xe0\\xf9\\xf8\\xa9\\x5f\\x81\\x1b\\x12\\xfe\\xda\\xad\\x6a\\x16\\x7d\\x2d\\x04\\x64\\xfd\\xb2\\xcc\\x03\\xde\\xc9\\xf7\\x0d\\xd3\\x54\\xc8\\xb3\\x62\\xa8\\xb3\\xe5\\x72\\x12\\x43\\xa6\\x76\\x82\\xe9\\xf7\\x5c\\xe9\\xdb\\xb6\\x23\\xe4\\x08\\xa7\\x0c\\x34\\x52\\x3f\\x43\\xec\\x7b\\x54\\x5d\\x23\\x95\\x7f\\x90\\x66\\xa3\\x08\\x0d\\xff\\xc8\\x9d\\xf1\\xc8\\x62\\x11\\xac\\xbd\\xfa\\x8c\\x87\\x11\\xde\\x6b\\x66\\xe1\\x60\\x46\\x5f\\x2e\\xc2\\xb0\\x91\\x49\\x94\\xa4\\xfb\\xcf\\xd4\\x8f\\x0d\\x12\\x8b\\x82\\xe0\\x6f\\xba\\xa2\\x6a\\xc8\\xf1\\x17\\x2d\\x9c\\x00\\x90\\x21\\x60\\x34\\xb9\\x31\\xa3\\x6e\\xe0\\xeb\\x7f\\x9e\\x99\\xa2\\x9b\\xa1\\x0a\\x3f\\xbc\\x1c\\x42\\x62\\x48\\xce\\x4a\\x28\\x79\\x1b\\x13\\xed\\xeb\\xc9\\xaf\\xe6\\xda\\x94\\x7c\\x46\\xdd\\x69\\x86\\x3d\\x91\\xef\\xce\\xe5\\x0d\\x11\\x16\\x58\\x3f\\xb5\\xe6\\x43\\x6c\\xaf\\x0d\\x22\\x8f\\x88\\xd5\\x3d\\x09\\xfc\\x1d\\x30\\x6e\\x4d\\x94\\x65\\x29\\xc1\\x9b\\x0b\\x67\\x70\\x21\\x91\\x1e\\xbc\\x98\\x24\\xe3\\xf6\\xe2\\xaa\\x3d\\xf0\\xaf\\xf5\\xe3\\x5d\\xec\\x9b\\xed\\x17\\xef\\x30\\xaf\\x1d\\x40\\x1e\\x1c\\x7e\\x3d\\x62\\x04\\xfb\\xf4\\x53\\xfa\\x2a\\x3c\\xbb\\x06\\xe9\\x20\\x72\\x68\\x58\\x39\\x8d\\x32\\x57\\x2a\\xb8\\xdf\\xbd\\x6c\\x8e\\xe4\\xed\\xf6\\x88\\x83\\x05\\x89\\x0f\\x59\\x2a\\xee\\x0b\\x96\\xde\\xf1\\x89\\x31\\xe5\\x3b\\x7d\\x3b\\x45\\xca\\xd9\\xc2\\xf1\\xb5\\xfe\\x7e\\xd7\\xdb\\x6c\\x54\\xa4\\xac\\x0e\\x1b\\x24\\x7b\\x72\\xbd\\xfc\\xc2\\x5c\\x62\\x14\\xda\\xa6\\xd6\\x06\\x54\\xbb\\x68\\x70\\xe7\\xf8\\x9b\\x66\\x76\\xf0\\xf8\\xd7\\x27\\xfd\\x63\\xc5\\x6e\\xbb\\xd2\\x6a\\x36\\xca\\x91\\x30\\xc6\\x98\\xc0\\xee\\x56\\x3d\\xbb\\x5b\\x2c\\xd8\\x59\\xea\\x1a\\xab\\x89\\x3c\\x50\\x3d\\x64\\x74\\xbe\\x5a\\xc1\\x5a\\xd4\\xe7\\x28\\xbd\\x98\\x4b\\xb9\\x7d\\x23\\x5d\\xea\\x89\\x48\\x65\\x4b\\xab\\x68\\x45\\xd9\\x96\\x99\\x4e\\x80\\xd1\\x91\\x99\\xda\\x75\\xf3\\x34\\x28\\xeb\\xd3\\xad\\x71\\x06\\x45\\xd6\\x43\\xa0\\x79\\x2e\\x68\\xbe\\xca\\x1e\\x26\\x83\\x4e\\x5a\\xf2\\x3f\\x46\\x42\\x29\\xbc\\xd1\\xb8\\x3c\\x79\\xaa\\x4f\\x73\\x54\\xcc\\xda\\xf3\\x44\\x3b\\xfe\\x8b\\x11\\x94\\x40\\xe6\\xb2\\x88\\x1e\\x68\\x0b\\x90\\x36\\x4a\\x66\\x30\\x17\\x11\\xab\\xe1\\x02\\x77\\x2e\\xdd\\xee\\x78\\x94\\xf7\\x23\\xc7\\x9b\\xbc\\x0c\\xd3\\x7b\\x58\\x51\\xc5\\xee\\xfa\\x82\\x1d\\x4c\\x3e\\xfa\\xf5\\xc7\\xfb\\xf5\\x6d\\xd9\\x37\\x1f\\xd8\\x12\\xf1\\x53\\x4d\\xb5\\x44\\x1a\\x16\\xf3\\xde\\x39\\xaf\\xbb\\xb0\\xdc\\x2c\\x78\\xd8\\xe3\\x65\\x78\\x37\\x65\\xe0\\x66\\xc7\\x6f\\xcc\\xc8\\x09\\x83\\xf9\\x6d\\x58\\x29\\x23\\x18\\x13\\x23\\x84\\xdd\\x14\\x82\\xa4\\xe6\\x3a\\xb9\\xd4\\x5e\\x80\\x19\\x16\\x3b\\xca\\x30\\x5e\\x4d\\xfc\\xa2\\x19\\xab\\xb9\\x86\\x3b\\x32\\xb5\\xcd\\xd3\\x07\\x66\\x5e\\x24\\x37\\x5f\\x9a\\x14\\x74\\x62\\xe3\\x2e\\xce\\xac\\x1f\\x09\\x9d\\x9f\\xbe\\x04\\x1a\\x23\\x30\\x9e\\x18\\x0d\\x32\\x62\\xf6\\x3a\\x21\\x12\\xc3\\xf3\\x08\\x8b\\xc4\\x7b\\xe5\\x77\\xf9\\x76\\x48\\x46\\x5d\\xf3\\x78\\x6e\\x76\\xad\\x12\\xdc\\x75\\x99\\xdc\\x72\\xa1\\x01\\x1d\\x49\\x16\\x87\\xdf\\xd0\\x9c\\xe6\\x6d\\x25\\xa9\\xfb\\xce\\x98\\x1f\\x5b\\x71\\xc4\\xa5\\x1b\\x56\\x82\\x21\\x53\\x6e\\xb3\\x4f\\xa8\\x90\\xc5\\xd5\\xb7\\x9f\\xbe\\x5f\\xd6\\xf9\\x48\\x88\\x87\\x7b\\xa1\\x69\\xce\\xf4\\xc8\\xe8\\xd5\\x8c\\x94\\x84\\xe9\\x55\\x33\\x98\\x55\\xf7\\x13\\x67\\x94\\x9b\\x92\\xf1\\xf9\\x2d\\x42\\xcb\\xe9\\x4b\\x79\\xb6\\xf5\\x25\\xe6\\xf8\\xc4\\xba\\xd2\\x9d\\xaa\\xd0\\xab\\xcc\\x44\\xea\\x49\\x00\\xd2\\x4f\\xaa\\x71\\x14\\x91\\xa7\\x4a\\x67\\xef\\xf1\\xf6\\x2a\\x6b\\xf4\\xa1\\xd3\\x0d\\xed\\x70\\xc4\\x5f\\x6f\\x28\\x01\\x58\\x14\\x6c\\x15\\xc0\\x3e\\x44\\xf3\\xb7\\xf9\\xdf\\x7d\\x5a\\xf1\\x15\\x14\\xd8\\xe2\\xff\\xe5\\x23\\x1b\\xac\\x94\\x5e\\x32\\x72\\x4d\\x34\\x11\\x49\\x64\\xc1\\x0b\\xd8\\x42\\x5b\\xe9\\xf1\\x6a\\x3c\\x7a\\xbe\\x9d\\x04\\x3f\\xb8\\x62\\x39\\xc7\\xdb\\x2d\\x39\\xa4\\x7c\\x06\\x07\\x07\\x8a\\x44\\x6a\\xf5\\xbe\\x2c\\x9b\\x15\\xba\\x4a\\xce\\xf4\\xae\\xbc\\x5d\\xc0\\x11\\x24\\x38\\xa7\\x44\\xcb\\x5d\\x76\\x52\\x78\\x73\\x88\\x4a\\x0b\\xb3\\x06\\x4d\\x55\\x64\\x71\\x6e\\x9e\\x7b\\x9a\\xe5\\xd3\\xcf\\xa7\\xe2\\x5d\\x1e\\x84\\x3d\\xc4\\xeb\\xe3\\x4b\\x7d\\xa1\\x2a\\x00\\x53\\xbf\\x78\\x20\\xfe\\xd4\\x50\\x0d\\x2b\\xe9\\x13\\x06\\xa2\\xe6\\xc2\\x5d\\x65\\x55\\x82\\xee\\x8b\\x78\\x45\\xa1\\xff\\xa6\\x99\\x04\\x4b\\xcd\\x4b\\xca\\x7e\\x49\\x3a\\x77\\x95\\x64\\xc2\\x29\\x90\\xaf\\xc2\\xf7\\xa7\\xe2\\x0d\\x07\\xfd\\x0e\\x60\\x83\\x41\\x31\\x18\\x39\\xcb\\x62\\xdc\\x9c\\x67\\x88\\xb9\\x12\\x73\\xfc\\xb8\\x94\\x39\\xc9\\x94\\xe4\\x84\\xa6\\x4f\\x11\\xfd\\xe5\\x21\\x94\\x86\\x03\\xf5\\xe3\\xb3\\xc7\\xf6\\xa6\\x4f\\x02\\xbe\\x9a\\x61\\xd7\\x01\\x8a\\xab\\x4c\\x60\\xcc\\xe8\\xe0\\x81\\x56\\x33\\xc8\\xc6\\xe6\\xdc\\xca\\x3e\\x4d\\x16\\x0f\\xc9\\xf1\\xfb\\x35\\xf5\\xbf\\x28\\x5e\\x04\\x71\\x4a\\x8a\\xb3\\xf9\\xc8\\x10\\x73\\x4b\\xc6\\x2e\\x4e\\xfd\\x82\\x47\\x78\\xc7\\x19\\x4f\\xe0\\xde\\x4c\\xeb\\x77\\x9c\\xe6\\xb7\\xc5\\xd2\\x75\\x13\\x2a\\x1a\\x8b\\x44\\xf9\\xdb\\x04\\x12\\x2d\\xc1\\x12\\x77\\x96\\x90\\x4a\\x0e\\xc4\\xf1\\x78\\xb1\\x50\\x47\\xe5\\x58\\x26\\x53\\xf5\\xab\\x51\\x33\\xe5\\xad\\xf4\\x7d\\x49\\x05\\xa2\\x8a\\x7e\\x0b\\x52\\x31\\xe8\\xa8\\x51\\x6f\\x0e\\x16\\x85\\x1b\\x0e\\x9f\\xf7\\xb6\\x9c\\xb3\\xc9\\x61\\x7b\\x07\\xad\\x9f\\x9c\\xec\\xb9\\xc2\\xb6\\x7f\\xf7\\x41\\xcc\\x78\\xc2\\x6f\\xb8\\x33\\xbf\\x93\\x99\\x3b\\x44\\x94\\xda\\x36\\x40\\x6d\\x6b\\x14\\x05\\x83\\xb2\\x9b\\x91\\x94\\x1c\\xda\\x37\\x73\\x81\\x8d\\xb6\\x6f\\xb9\\x1a\\x18\\xb4\\x2d\\x34\\x6b\\x92\\xe3\\xde\\x23\\x9b\\xf8\\x06\\x30\\xcc\\xe2\\xd5\\x2e\\x5c\\x0c\\xf0\\x40\\x1e\\x80\\xb6\\xbc\\x94\\x85\\x97\\x14\\x99\\xcc\\x68\\x1a\\xf1\\xb7\\xde\\x00\\xdd\\x94\\x50\\x57\\x15\\xdf\\x81\\x40\\xda\\x1b\\x81\\x33\\x06\\x56\\xb7\\x6c\\xe5\\x50\\x79\\x01\\x29\\xf9\\x98\\x6e\\x79\\x9f\\x43\\xe9\\xdb\\xe8\\x06\\xb4\\x05\\x47\\xfe\\xca\\x84\\xd2\\x89\\xb7\\x08\\x7f\\xd2\\xcc\\x99\\xd5\\x0f\\x1a\\x6c\\x77\\xe5\\x45\\xbb\\x98\\x85\\xd1\\x86\\xb6\\x34\\x40\\xb1\\x92\\x7b\\xec\\x20\\x13\\xae\\x66\\xe5\\xc1\\x51\\x2a\\x51\\x1a\\x31\\x66\\xfa\\x40\\x19\\x9b\\x83\\x52\\x18\\x95\\x19\\x6f\\x60\\x5e\\x6d\\x92\\x6a\\xb9\\xbd\\xc0\\xd7\\x78\\x5c\\x97\\xcc\\xe5\\x2f\\x14\\x02\\x77\\x18\\xdc\\x7d\\x72\\x79\\x82\\x1c\\x3e\\x77\\x37\\x6a\\xe9\\xe8\\xbc\\x4b\\x25\\x5f\\x0f\\x2e\\x29\\x0a\\x36\\xf3\\x80\\x44\\x9f\\x82\\x30\\xad\\x8d\\x45\\x44\\x64\\xd2\\xac\\x16\\x0e\\x3c\\x1c\\x8e\\x99\\x97\\xf4\\x72\\xbb\\x40\\x86\\xce\\x6c\\x0f\\xcc\\x2e\\x64\\x52\\xbd\\xe1\\xf1\\xbd\\x57\\xcc\\xb2\\x50\\x04\\x37\\xcb\\x82\\x1e\\x1c\\x47\\xa2\\xda\\xa8\\x24\\x1b\\xe2\\xe6\\xe0\\x80\\x6b\\xfb\\xd5\\xe1\\xbd\\x32\\xc8\\x08\\x02\\x34\\x1a\\x3f\\x92\\x02\\x9a\\xe1\\x46\\x89\\x2c\\xe1\\x17\\xc5\\xe2\\xaa\\xae\\x2d\\xcb\\xda\\xd4\\xf6\\x1a\\x2a\\x1f\\x0f\\xed\\xa8\\xaa\\x79\\xe2\\x38\\x71\\x3e\\x24\\xe0\\x62\\x29\\xe0\\x7c\\xa0\\xfa\\x25\\x44\\x8b\\x8e\\x4d\\x6f\\xd8\\xa5\\x38\\x36\\x88\\x8c\\x44\\x9d\\xd1\\xe0\\x09\\x04\\x64\\x5c\\xf3\\x17\\x0a\\x45\\x48\\xa7\\xdb\\x88\\x37\\x17\\x4b\\x4c\\xdb\\x12\\xc0\\x54\\x04\\xb5\\x3a\\xc1\\x48\\x87\\x5a\\x9a\\x88\\xfb\\xdc\\xd2\\x2f\\xa6\\x6d\\xba\\x15\\x76\\xaf\\x07\\xa4\\x1c\\x44\\x45\\x56\\x77\\x1d\\x26\\xca\\x95\\xf4\\x1f\\x52\\xa8\\x55\\x44\\x2b\\xdb\\x00\\xd6\\x0e\\x76\\x05\\xef\\xa4\\x89\\x22\\x85\\x2e\\xb5\\x21\\x32\\x35\\x19\\x32\\xd2\\x86\\x99\\x03\\x8c\\xba\\x27\\xb4\\xd7\\xb0\\x04\\x39\\xbd\\x3f\\x03\\xab\\x64\\x61\\x4d\\x43\\x2c\\xf2\\xc4\\x32\\x3b\\xaa\\xd5\\xa7\\x9b\\x71\\x43\\xa5\\xa8\\xf3\\xea\\x3e\\xf9\\x5b\\x89\\xdc\\xc5\\x35\\x9b\\x87\\x35\\xa8\\x9d\\xa6\\xd0\\xf3\\xab\\x1e\\x69\\xd1\\x08\\x0f\\x39\\xc3\\x67\\x60\\xa3\\x72\\xa7\\x16\\xbc\\x9f\\x97\\x87\\x07\\xbf\\xd6\\x2a\\x67\\x20\\xeb\\xa9\\xaf\\x1b\\xc1\\x0a\\xbb\\x2b\\xc6\\xb2\\x46\\x56\\x67\\xf3\\x48\\xbf\\xc3\\x20\\xed\\xd3\\xba\\x62\\x6e\\x28\\xa2\\xe7\\x14\\x08\\x15\\x72\\xc3\\x22\\xb4\\x9c\\xe7\\x06\\x8e\\x24\\xd2\\xa2\\x7c\\xaa\\x72\\xe9\\x96\\x3c\\xc3\\x14\\x38\\x9e\\xc5\\xac\\xf3\\x3b\\xb0\\xb4\\xbe\\xec\\x1f\\xe5\\x21\\x08\\x07\\xa4\\x91\\x4c\\x30\\xeb\\xf7\\xa2\\x84\\xad\\x18\\xac\\x80\\x62\\x74\\x1f\\xe8\\x5a\\xf9\\xb6\\xd8\\x11\\x56\\xe6\\x5f\\x44\\xfa\\xbd\\x38\\x28\\x66\\xb8\\xe4\\xb7\\x2a\\x57\\x2e\\x10\\x5a\\x74\\xc6\\x90\\x0e\\xb1\\x20\\xd5\\x10\\xe3\\xcc\\xd0\\x1c\\x4e\\xbd\\x2f\\x13\\x97\\xe1\\xd1\\x27\\x04\\xed\\x57\\x87\\x54\\x2a\\x19\\x0f\\x47\\x46\\xb8\\xc2\\xfb\\xdf\\xda\\x99\\x2a\\x8d\\xa9\\x72\\xff\\x48\\x33\\x87\\xd0\\xb2\\x75\\xfa\\xec\\x70\\x09\\xe7\\x34\\x18\\x5e\\x9e\\x7e\\xa3\\xea\\xfd\\x25\\xf1\\xbd\\x45\\x8e\\xaa\\x93\\x7d\\x5c\\x48\\x30\\x25\\x18\\xe3\\xa3\\xda\\xea\\x6a\\xe7\\xa5\\x6b\\xa3\\xad\\x68\\xa2\\x4c\\x8b\\xff\\x5e\\x8b\\x25\\xa3\\x7c\\xe0\\xd1\\x8d\\xb5\\x43\\x99\\x92\\xd8\\xfd\\x6e\\x3c\\x46\\x50\\x36\\x9a\\x37\\x86\\x66\\x1c\\x89\\x3b\\x7e\\x79\\x12\\x1e\\x3f\\x22\\x2f\\x4d\\x2d\\x9d\\x82\\x32\\xf5\\xa7\\x17\\x2a\\x00\\x11\\x84\\xa7\\xaa\\x8f\\xcd\\x1f\\x38\\xfd\\x24\\x35\\x2a\\xa5\\x7c\\x38\\xde\\x29\\x4c\\x6f\\x34\\x53\\xb4\\xbc\\xf6\\x6a\\x74\\xd3\\xd9\\x54\\x68\\x1a\\x79\\x0c\\x1f\\x2c\\x7e\\xda\\xb1\\x45\\x48\\xd6\\xe3\\x64\\x34\\x01\\x11\\xdb\\x3f\\x64\\x4b\\x90\\x60\\x89\\x15\\x99\\xa1\\x40\\xcf\\x9b\\xe2\\x60\\x77\\x5c\\xfe\\x01\\x0f\\x69\\x0d\\x09\\x6d\\x44\\x40\\xdf\\x99\\x8d\\x1d\\xe4\\x07\\xc6\\x57\\x8e\\xc3\\x83\\x07\\x69\\x25\\xc4\\x85\\xbf\\xef\\xa5\\xd6\\x21\\x13\\x46\\x5e\\x8a\\x01\\x0d\\x23\\x15\\x90\\xfb\\x41\\x64\\x4b\\x71\\x2e\\xe6\\xd4\\x14\\xef\\x00\\x08\\x2b\\xba\\xf9\\xb7\\x60\\x5d\\x1d\\x1f\\x80\\x96\\x3c\\xde\\xee\\x9d\\x86\\xce\\xda\\xdb\\x9d\\x0b\\x97\\x75\\xe3\\x39\\x58\\x20\\xab\\x5f\\x92\\x8f\\xc7\\x11\\xde\\xba\\xf2\\x77\\xbf\\x02\\xcc\\x28\\x63\\xaa\\xa9\\x91\\x7d\\xc8\\x69\\xff\\xb2\\xd4\\x61\\x33\\x89\\xd4\\x24\\x6b\\x75\\x52\\x32\\xb7\\xcb\\x5a\\xad\\x86\\x59\\xe8\\xdf\\x93\\x80\\x7d\\x55\\xb3\\xfb\\x9f\\x9d\\xe6\\x5e\\xca\\x48\\x8d\\xb2\\x7b\\xd4\\xda\\x40\\x57\\x95\\xe9\\x98\\xd2\\x5b\\x1f\\x0a\\x6d\\x2a\\xd3\\xa1\\x53\\xb3\\x18\\x9c\\x7a\\x4c\\xea\\x63\\xbb\\xe3\\x84\\xd7\\xf6\\x0c\\x06\\x0f\\xbb\\x5c\\x0a\\xa8\\x39\\x20\\x99\\x0a\\x62\\x92\\x45\\xf7\\x02\\x87\\x65\\x9e\\x41\\x68\\xa7\\xdd\\x6e\\xae\\x52\\x2e\\x35\\x12\\x68\\x9f\\x7b\\x76\\x3c\\x4a\\x14\\xa4\\x72\\x11\\xcb\\x22\\x1f\\xb9\\x49\\x12\\x2b\\x21\\xdd\\x39\\x16\\x83\\x06\\xb1\\x1b\\x90\\xf0\\xb6\\xbf\\x3c\\x4d\\x8d\\x65\\x50\\xc3\\x92\\xc7\\xdb\\xe8\\x35\\xc5\\x79\\x61\\xe8\\x48\\x5b\\x24\\x84\\xbf\\x63\\xb6\\x71\\x56\\xa5\\x69\\xa4\\x8c\\xfe\\x3a\\x22\\x41\\x4a\\x71\\xc7\\x40\\x28\\xda\\x46\\x91\\xe7\\x6f\\x63\\xde\\x77\\x76\\x8a\\x17\\xd1\\x55\\x61\\x41\\xd5\\xbb\\xcc\\x29\\xd0\\x8f\\x13\\x93\\xfe\\x93\\xad\\x06\\x31\\x9a\\xaa\\xc4\\x79\\xf5\\x12\\xb8\\xa9\\x4e\\xd2\\x20\\xc5\\xce\\xee\\x2a\\x3e\\x8c\\x67\\x3f\\x46\\x0a\\xfc\\xed\\x64\\xec\\x9a\\x1c\\x75\\xc8\\xfa\\x38\\xe1\\xa9\\xcf\\xfe\\x54\\xf0\\x86\\xd3\\xa4\\x7d\\xfe\\x29\\x03\\xe3\\xd0\\xc2\\x26\\xa0\\x68\\xea\\x7e\\x96\\x59\\x8a\\x88\\x43\\x51\\xd6\\x6d\\xf9\\x62\\x78\\x8c\\x1a\\x6d\\x92\\x49\\xd2\\x4c\\x35\\x29\\xeb\\xe9\\xed\\xdf\\xe3\\x42\\x9f\\x21\\xd6\\xef\\x10\\xb7\\x16\\xe7\\xdb\\x8c\\x13\\x07\\xd2\\x04\\xa0\\x11\\xa8\\x3f\\x6c\\xfe\\x9a\\x0e\\xe2\\x71\\x00\\x62\\xcf\\x84\\x27\\x97\\x1a\\x5a\\x7d\\xe5\\xa4\\x38\\x29\\x08\\xcf\\x36\\xd4\\xb4\\xa5\\xfa\\x0f\\xc7\\x03\\xc8\\xd4\\xb9\\x24\\xe5\\x32\\x24\\x0b\\x43\\x8d\\x28\\xfe\\x2a\\x36\\xae\\x75\\xad\\x25\\x59\\xa0\\xb6\\x2d\\x26\\x42\\xdf\\x81\\x46\\x70\\x44\\xb1\\xc0\\xbb\\x97\\x2f\\x45\\x2b\\xa2\\xbb\\xc3\\x23\\xff\\x39\\xc3\\x5b\\xc5\\xb5\\x78\\x69\\xcb\\x6f\\x57\\x32\\x1a\\x35\\x6b\\x66\\xf6\\x29\\xb2\\x7d\\x51\\xcc\\xcd\\xb7\\x8f\\x5e\\x93\\xe4\\x55\\xeb\\xc4\\x10\\x8e\\xc1\\x47\\x94\\xf2\\x93\\x6a\\x78\\x48\\xe8\\xe1\\x69\\x23\\x41\\x4c\\x7d\\x46\\x84\\xda\\x86\\x11\\x29\\x3c\\x50\\xdb\\x6b\\x32\\x83\\xaa\\x01\\x85\\xf5\\x47\\x08\\x37\\x61\\x15\\x53\\xf3\\x54\\xdc\\x19\\x96\\x29\\xfc\\x52\\x57\\x7e\\xd3\\x23\\xa3\\x12\\xdc\\x88\\x0a\\x22\\x91\\x99\\x57\\xd4\\x97\\x42\\xf1\\x39\\xb9\\x2d\\xb4\\x64\\xa4\\x26\\xb9\\x92\\x86\\x63\\x79\\xe2\\x1c\\xc5\\x7c\\x57\\x1c\\x0b\\x6c\\xaf\\xe9\\x40\\x84\\xf2\\x90\\x01\\x9f\\xee\\x31\\x9f\\x5b\\x67\\xab\\xac\\x4f\\x95\\xc0\\xfb\\xa7\\x26\\x6e\\x2c\\xa7\\x20\\x06\\xd4\\x7e\\x25\\x78\\xdd\\xa2\\x15\\xb6\\x9d\\x26\\x55\\xf3\\xc5\\x16\\xd1\\xaf\\x75\\x03\\x18\\xd9\\x46\\xe3\\x25\\x14\\x83\\xbd\\xfd\\x13\\x66\\x8d\\x9d\\x88\\x99\\xd3\\xb1\\x8c\\x05\\xbf\\x38\\x92\\x2e\\x3c\\xf0\\x2b\\x8d\\x87\\x91\\x45\\xef\\xc6\\x74\\xab\\x27\\x45\\xa3\\xfd\\x84\\xfb\\x4d\\x69\\x64\\xaa\\x75\\x45\\xe0\\x14\\xe0\\x8a\\xed\\xfb\\x55\\xeb\\x7c\\x5e\\xff\\xa3\\xe0\\x53\\x4c\\xc4\\xbb\\x8b\\xfc\\xd4\\xa4\\xed\\x64\\x6f\\xab\\xc2\\x7d\\x5c\\xdf\\x98\\x2e\\x6c\\x70\\xb3\\xe3\\x07\\x39\\x4b\\xde\\xe9\\xa9\\xf3\\x40\\xe0\\x5a\\x52\\xae\\x17\\x6c\\xd6\\xd8\\x13\\x9c\\x3d\\xd3\\x6b\\x62\\x3d\\xe8\\xe9\\xcb\\xe2\\x3b\\xdd\\xa7\\x04\\x24\\xe5\\x41\\xd4\\xda\\x4f\\x23\\x58\\x12\\x12\\x99\\xbf\\xb7\\xfb\\x57\\x40\\xc2\\xcc\\xec\\x51\\x9b\\xad\\x1f\\x9e\\x25\\x6d\\xb5\\x83\\x10\\x04\\x07\\xdb\\x2d\\x6b\\x8c\\x75\\x31\\xa2\\x8e\\x2d\\x79\\x96\\x5c\\x18\\x26\\x70\\x6c\\x48\\x7a\\x3a\\xd2\\xeb\\x56\\x2a\\xac\\x2f\\xbe\\x4e\\x10\\x93\\x04\\x8c\\xbe\\xd0\\x9f\\x68\\xdb\\x42\\xa2\\x75\\x38\\x60\\x8c\\xc1\\x83\\xea\\x6d\\x80\\x48\\xd9\\xa8\\xc1\\x3c\\x5d\\x29\\xf7\\xcd\\xad\\xf2\\x81\\x88\\xef\\xd6\\x48\\xb7\\xf0\\x48\\x37\\xfe\\x59\\xd0\\xb7\\x15\\xe8\\xe8\\x99\\x18\\x85\\x1e\\xe3\\xdf\\xdd\\x70\\xe3\\xbb\\x7d\\x18\\x66\\x75\\x04\\xf5\\x2c\\x12\\x0e\\xc9\\x4e\\x35\\x1c\\x39\\x5d\\xd7\\x3f\\x45\\x64\\xf4\\x91\\x08\\x80\\x3d\\xbc\\x24\\x22\\xe8\\x53\\xbe\\x6f\\x44\\xea\\x4c\\x06\\x8d\\x24\\x93\\x59\\xe1\\x63\\x24\\x42\\x7d\\x49\\x5f\\x85\\x4a\\x85\\x5e\\x14\\x39\\x7c\\xb5\\x8a\\x22\\xc9\\x8b\\xa8\\x41\\x91\\x18\\xa9\\xc8\\xd4\\x72\\xf1\\x7d\\x6d\\xd8\\xfa\\x1b\\x62\\x5c\\xed\\x1a\\x6c\\x9a\\xb0\\x9b\\x34\\x7f\\xa1\\x61\\x9c\\x45\\x1f\\xc7\\x09\\x5f\\x5a\\xcf\\x02\\x21\\xd4\\x71\\x2b\\xd7\\xce\\x36\\xa2\\x7e\\x00\\x11\\x82\\x1e\\x79\\x2c\\x61\\xf7\\x05\\xf2\\x5e\\xd7\\x6a\\x5c\\xc9\\x1d\\xf0\\x9f\\x7a\\x71\\x79\\x59\\x72\\x25\\x7c\\x7a\\x66\\x5d\\x17\\x86\\x59\\x53\\x8b\\x40\\x6a\\x15\\xda\\x4a\\xd7\\xdf\\x63\\xea\\x3c\\xf8\\x3b\\x99\\xb7\\xc0\\x63\\xed\\xef\\xf7\\xe7\\x9b\\x9c\\x42\\x93\\x56\\x76\\xbe\\x89\\x60\\x6f\\x47\\xa3\\xbd\\x18\\x3c\\xf2\\x46\\xdb\\xfc\\x41\\xf7\\xfe\\x1b\\x25\\x80\\xb7\\x0a\\xc1\\x92\\xbf\\x75\\xbe\\x65\\x5e\\x11\\x23\\x35\\x54\\x98\\x5b\\xa0\\x2a\\x97\\xb8\\xf2\\xbf\\x65\\xb9\\x0e\\x87\\xa4\\x1f\\xe6\\x06\\xb8\\x90\\x1a\\x23\\xde\\xf4\\x07\\x9e\\xda\\xc7\\x76\\xff\\xab\\x40\\x69\\x18\\x3a\\xae\\x6c\\x65\\xcf\\x84\\x3e\\xe6\\xa8\\x0f\\x23\\xab\\xd5\\x7d\\xff\\x5f\\x38\\x54\\xfd\\x57\\x18\\x00\\x8c\\xe8\\x6a\\xc7\\x61\\xaf\\xd0\\xc0\\xab\\x5a\\x49\\x1c\\x3a\\x3f\\xdc\\x0f\\xe1\\xc8\\x5c\\x78\\xdc\\x70\\x67\\x7a\\x1b\\x46\\x73\\x09\\xf4\\xdd\\xc3\\xac\\x87\\x3b\\x9c\\x77\\x53\\x04\\x30\\xc4\\xf1\\x9b\\xc5\\x77\\x75\\x76\\x5b\\x6a\\xba\\x28\\x47\\x55\\xba\\xd9\\x43\\x82\\xfb\\x22\\x3c\\xdd\\xba\\xaa\\x9e\\xcb\\xfe\\x1a\\x86\\x6a\\xe7\\x87\\x1e\\x5c\\xc4\\x29\\x35\\x4e\\xa0\\x07\\x9a\\x37\\x12\\x01\\x61\\x83\\x39\\x92\\x32\\xef\\x07\\x37\\x9e\\xba\\x75\\x1b\\xa1\\xfd\\xe6\\x6b\\x9a\\xbc\\x4b\\x09\\x4e\\xfa\\x78\\x5d\\x05\\xf1\\x92\\x9f\\xa1\\x42\\x83\\xaf\\x00\\x18\\xc2\\x40\\xa5\\x4d\\x2a\\x5b\\x42\\x00\\x50\\x0b\\x01\\x26\\x8d\\x0b\\x19\\x71\\xa0\\x3e\\x7a\\xfd\\x68\\x8b\\xc1\\x9b\\x9e\\x30\\x2c\\x82\\x4e\\xb4\\xe5\\xd4\\x28\\x40\\x98\\xd4\\xd8\\x4d\\xdd\\xac\\x96\\x6a\\x3c\\x43\\x16\\x47\\xfe\\x82\\xa3\\x53\\x89\\xa6\\xf9\\x0e\\x5c\\x34\\x0f\\xad\\x33\\x3b\\x04\\xdf\\x0d\\x6c\\x61\\xa1\\x8a\\x23\\x37\\xed\\xce\\xd5\\x30\\x87\\x59\\xe9\\x57\\x0e\\xa9\\x2e\\x3e\\x26\\xfe\\x49\\x6f\\xd8\\x35\\x12\\x88\\x7e\\x71\\xc6\\x71\\x47\\x8d\\x78\\xbd\\x01\\x4a\\xa9\\x75\\x15\\x09\\x67\\xdd\\x2c\\x45\\xdd\\xd8\\x42\\xf1\\x9e\\x24\\xcd\\xfd\\xcc\\x84\\x91\\xbc\\xe3\\xab\\x08\\xcc\\x6f\\x2f\\x51\\x85\\xdd\\x1d\\xf5\\x97\\x25\\xb6\\x80\\xb3\\x59\\xfd\\x44\\x07\\x7c\\xb5\\xad\\x0b\\x12\\x4d\\xf7\\x8a\\xcf\\xdf\\xf9\\xb1\\x9a\\x27\\x87\\x77\\xb3\\xa3\\xec\\xdf\\x47\\x06\\xea\\x6a\\x72\\x32\\x33\\x20\\xb8\\xfc\\x22\\x74\\xde\\x52\\xa6\\xcc\\x84\\x98\\xc6\\xc4\\x11\\x0f\\xaf\\xea\\x8b\\x88\\xfb\\x49\\x58\\x0d\\x6f\\xc8\\xae\\x01\\x57\\x1f\\x73\\xb5\\xe3\\x8d\\xbd\\x11\\xb7\\xb9\\x7c\\xf8\\xf3\\x1f\\x2b\\x54\\x27\\x3f\\xd9\\x62\\x42\\x07\\xc0\\x72\\xf2\\xe5\\x7c\\xf0\\x5d\\x5e\\x0b\\xd2\\x76\\xb9\\xde\\xa6\\x6d\\xab\\x10\\x83\\xc9\\x1b\\xb1\\xb2\\x85\\x35\\xb2\\x61\\x6e\\x1b\\x1c\\x1f\\x0f\\xd8\\xd6\\xe0\\x3b\\xce\\xd5\\x56\\x16\\x8f\\x11\\xbf\\x7c\\xd7\\xe3\\x1a\\x8e\\x9f\\x76\\xa9\\x89\\xc4\\x2d\\x4c\\xa5\\xb9\\x61\\xa7\\x64\\x4f\\xc8\\x48\\xa2\\x2e\\xa0\\xdf\\x88\\x10\\x3d\\xfe\\xe7\\x17\\xae\\x2f\\xf2\\x2b\\x1f\\x31\\xcd\\xfe\\x98\\xb0\\xbc\\x77\\x8e\\xc1\\x17\\xef\\x75\\x76\\x0f\\xf6\\xd9\\xfd\\x12\\x32\\x8f\\xf1\\xa8\\x18\\xed\\xd8\\xbd\\xfc\\x04\\xda\\xff\\x4e\\xb1\\x44\\x32\\x03\\xfd\\xf9\\x11\\xf3\\x18\\xee\\xf1\\xee\\x4a\\xbe\\xa1\\xbe\\xd4\\xe3\\x05\\x5b\\xa6\\x6a\\x10\\xb6\\xef\\x74\\x38\\x98\\x5d\\x9a\\xcf\\x8f\\x98\\x4a\\xf0\\xff\\x86\\xdc\\x88\\x58\\x22\\xd0\\x53\\x50\\xcd\\x09\\x3e\\x50\\xc3\\x47\\x61\\xbb\\x38\\x28\\x7b\\x58\\xbe\\xcd\\xe9\\xd2\\xe7\\xfb\\x99\\x5f\\xac\\x86\\x4a\\xa1\\x66\\xc1\\x8d\\x8a\\x5f\\x21\\x46\\xb9\\xeb\\x0a\\x92\\x92\\x22\\x52\\xb8\\x05\\x21\\x69\\x83\\x56\\xf8\\xdb\\x11\\x4a\\x2c\\xfe\\xf8\\x0b\\xac\\xa4\\xdd\\x28\\x87\\xbb\\xf0\\x63\\xa2\\x81\\x1c\\x97\\x9a\\x87\\x08\\x32\\x8b\\x53\\x81\\xe6\\x6d\\x39\\x7d\\x5f\\xa3\\x01\\x2c\\xad\\x09\\x88\\xb8\\x6e\\x39\\x04\\x59\\x77\\x1b\\x3e\\x03\\xd0\\x2a\\xcc\\x3b\\xf6\\xa6\\x4b\\x41\\x7b\\x07\\xea\\xaf\\x50\\x1c\\x6d\\x2a\\x20\\x38\\x77\\xe0\\xc6\\x3f\\xd4\\x5e\\x6d\\x8a\\x51\\xdb\\xcc\\xba\\x5c\\xe1\\xb6\\x0a\\xff\\x55\\xb4\\x9a\\xd5\\xd4\\x58\\xcd\\xb6\\x02\\xb4\\x02\\xd2\\x71\\x1f\\x23\\x7b\\x04\\x62\\x05\\xa6\\x39\\x36\\xcd\\x10\\x88\\x76\\x38\\x51\\x54\\xbe\\xcc\\x11\\x8f\\x36\\x8e\\x81\\x04\\xa3\\x76\\x3b\\xa1\\x06\\x44\\xf4\\xf0\\x2d\\xc2\\x06\\xb9\\x1d\\xd1\\x8e\\xcc\\x5a\\x0a\\x48\\x72\\x95\\xa3\\x2e\\xee\\x63\\x0d\\x42\\xee\\xdd\\x6b\\xe6\\xb6\\xdb\\xb5\\x17\\x7b\\x5c\\x8f\\xd8\\x98\\xac\\xb2\\xfe\\x5b\\xd6\\x45\\x32\\x97\\x95\\xec\\x6b\\x28\\xaa\\xcf\\x71\\x66\\x18\\x5f\\x30\\x24\\x3b\\x57\\xf9\\xe8\\x0a\\x6c\\x9f\\x3a\\xe4\\xc6\\xff\\x05\\x97\\x5c\\xc5\\xfd\\x30\\xbf\\x7e\\xa9\\xa3\\x6f\\xdc\\x0b\\xf8\\x16\\x60\\x4f\\x01\\xcf\\xad\\x49\\x02\\x72\\x24\\x79\\x07\\xe0\\xd6\\x04\\xff\\x56\\x24\\x30\\x1d\\xe3\\x19\\x9d\\xca\\x66\\xff\\x91\\x1f\\xe2\\x05\\xde\\xe0\\x24\\xd8\\x35\\xaa\\xbf\\x86\\x89\\xe4\\x36\\x18\\xcc\\x60\\x8f\\x78\\x40\\x56\\x98\\xbc\\xfe\\x1a\\xd8\\x8f\\xbb\\x10\\x47\\xe1\\xa8\\xdc\\x01\\x5f\\x77\\x92\\x86\\x6c\\x65\\x81\\xe3\\xcb\\x5f\\x4d\\x08\\xb0\\x46\\xe3\\xca\\x72\\xa9\\xe9\\x1a\\x2d\\x5c\\x56\\xc2\\xa1\\x45\\xc0\\x5c\\x00\\x14\\x92\\x7c\\x49\\x0c\\x48\\x70\\x24\\x8f\\x41\\x30\\xe9\\x65\\xff\\x33\\xbb\\xb8\\x74\\x63\\xf5\\x1b\\xd2\\x70\\x8f\\x1f\\x49\\x68\\xb6\\x4b\\x16\\xb1\\x4e\\xb2\\xe3\\x25\\xae\\x7a\\x50\\x1f\\x30\\xc2\\x29\\xf2\\xb5\\xfb\\x37\\x84\\x89\\xfd\\xd0\\x60\\x42\\x34\\x52\\xc5\\xbc\\x75\\x51\\x3e\\xa3\\xdf\\xdc\\xf6\\xf4\\xf0\\x88\\x9f\\x14\\xd3\\x42\\x8b\\xc1\\xfa\\x27\\x2b\\x84\\x68\\x24\\x61\\x6b\\x35\\x1a\\x29\\x32\\xe0\\x2d\\x39\\x3c\\x80\\x9f\\x51\\x97\\x09\\x61\\x0e\\x0e\\x45\\xf2\\x7b\\xc6\\x9d\\x04\\x1d\\x4a\\x05\\xcc\\xb0\\x6d\\x26\\x15\\x06\\x11\\x11\\x1a\\x5c\\x0a\\x98\\x00\\xec\\xd7\\x5d\\x19\\x64\\x19\\x97\\xc2\\x54\\x55\\xdd\\xc7\\x36\\xcf\\x2e\\x7d\\xa5\\xf4\\x57\\xa2\\x7f\\x23\\xd9\\x8b\\x39\\x0f\\x3b\\x82\\x97\\xca\\xc2\\xad\\x4a\\x63\\x7b\\x64\\xd5\\xc2\\x2d\\x7a\\x18\\xaf\\x28\\xeb\\xe2\\x4b\\x02\\x42\\xcb\\xea\\x97\\xa4\\x9e\\x5b\\xb8\\xd7\\xfb\\x66\\xcf\\x89\\xe4\\x5d\\xbc\\x8b\\xef\\x2c\\xce\\xce\\xa7\\x34\\xea\\xaf\\x1e\\x93\\xcf\\x5c\\xff\\x2c\\x38\\xe4\\x93\\x05\\xa9\\xd2\\x38\\xe0\\x08\\xf9\\x03\\x08\\x90\\xf6\\x12\\x1f\\x91\\x9b\\x53\\xea\\x16\\xb8\\x13\\x47\\xcc\\xbd\\x0d\\xa3\\x17\\xbd\\xaf\\xed\\x37\\x41\\x59\\xcf\\x71\\x14\\xd1\\xef\\x08\\x5b\\x58\\x2e\\xa5\\xb4\\x33\\x61\\x02\\xfc\\x68\\x2b\\xf3\\xd5\\x7b\\x87\\xf8\\x2d\\xea\\xe8\\x7b\\xa5\\xc5\\xac\\xff\\xbc\\xd2\\x6b\\x0b\\xd9\\xef\\xf2\\x8a\\x3e\\x24\\x37\\xb6\\x3a\\xc7\\xd3\\xad\\x30\\xa0\\xed\\xc1\\x7b\\x6d\\xa8\\x54\\x33\\xae\\x1b\\xc2\\x9c\\xfb\\x15\\xe7\\x02\\xe2\\x17\\x78\\xbf\\x0f\\x08\\x98\\x39\\x8b\\xdc\\x74\\x7f\\x95\\x0b\\x45\\x4b\\xad\\x46\\x35\\x61\\xd3\\xf7\\x84\\x58\\x11\\xc3\\xa3\\xf5\\x24\\xc2\\xcf\\x33\\x60\\xeb\\x76\\x05\\x45\\x4b\\xad\\xf1\\x08\\xa2\\x5c\\xf4\\x0f\\xdc\\x90\\x7a\\x1f\\x0d\\x88\\xd9\\x4e\\x2e\\x4e\\xe2\\xda\\xf2\\x81\\xb3\\xfc\\x35\\x70\\x58\\x36\\x52\\xbb\\x8b\\x48\\x3c\\xb1\\x49\\xe5\\x65\\x81\\x24\\xef\\x53\\x2f\\x3e\\xc1\\xbd\\x66\\x8f\\x54\\x0a\\x16\\x2a\\x8a\\x4b\\x68\\x90\\x1e\\x8e\\x8f\\xb7\\xf0\\x9d\\xb9\\xc4\\x94\\xd1\\x2c\\x62\\x61\\xd9\\x13\\xa5\\xc3\\x81\\x9c\\x30\\x8a\\x89\\xdb\\xe7\\xea\\xbb\\xc8\\x35\\xd4\\xea\\x15\\x71\\x7f\\x33\\x4d\\x80\\xa7\\xac\\x07\\x27\\x9b\\x57\\x7e\\x8a\\x84\\x4e\\x99\\x04\\x92\\x48\\x79\\x77\\xb3\\x4e\\xa5\\xfb\\x77\\x8a\\xa2\\x11\\x4b\\x82\\x56\\x27\\x8d\\x37\\x51\\xd5\\x6f\\x4c\\x8c\\x77\\xdf\\x6c\\xd5\\x15\\xb4\\xbf\\xa1\\xda\\x25\\x42\\x55\\x71\\xfa\\xf5\\x41\\x66\\x5a\\x38\\x95\\x0e\\x9b\\x88\\xea\\x52\\x03\\x2d\\x04\\x81\\xd2\\xc6\\x1c\\xd3\\x11\\x0d\\xdf\\x0a\\x94\\x48\\x7e\\xc8\\x9d\\x6b\\x30\\x2c\\x0b\\x3a\\x6c\\xaa\\x32\\xe2\\x3a\\x5e\\x54\\xc2\\xa3\\xa3\\x65\\xba\\xa5\\x1e\\xb1\\x4b\\x9d\\xe1\\x45\\xbf\\x2b\\xfb\\xe5\\xdc\\xca\\x14\\x7d\\xfb\\xca\\xc0\\xf7\\xea\\x98\\x79\\xc1\\x03\\x64\\x9e\\x20\\xd3\\x5c\\x34\\x4e\\x7e\\x2c\\xb6\\x3a\\x60\\x92\\xd7\\x4d\\xd5\\x18\\xee\\x61\\xdc\\xa2\\xc3\\x1a\\xdf\\xd2\\x8a\\x78\\xa4\\x82\\xa5\\x26\\xbd\\x8d\\xa6\\x84\\x47\\x48\\xdf\\x49\\xf2\\x93\\x3c\\x5c\\xd5\\x67\\xec\\xa7\\x96\\x90\\x21\\x60\\x2a\\xf5\\xe9\\xaf\\x8a\\x17\\xa6\\x43\\x30\\x14\\x2d\\x5b\\xdf\\x11\\x60\\xd0\\x44\\xea\\xce\\x24\\x88\\x74\\xae\\x82\\x73\\x37\\x52\\x86\\x21\\x42\\x52\\x21\\x0a\\x5e\\xf7\\xc0\\x5a\\xaa\\x2e\\x38\\x88\\xba\\xf2\\xa9\\x64\\x61\\x11\\xe4\\x2a\\xc5\\x11\\x46\\xaa\\x46\\xb2\\x19\\xa7\\x11\\x93\\xf5\\xbd\\xb1\\xa1\\x50\\xce\\xf9\\x6b\\x6d\\x33\\x80\\xb4\\xb8\\xcd\\xbe\\xb8\\x6c\\x48\\xb4\\x24\\x80\\x46\\x82\\xd6\\x95\\x2d\\x96\\x20\\x7f\\xc6\\xf1\\x0e\\x97\\x35\\x90\\xd0\\x68\\x2b\\x3f\\x39\\xaf\\x41\\xf1\\x51\\x57\\x44\\xf0\\x4c\\x5c\\xf5\\xf1\\x9d\\x19\\x15\\x81\\xd5\\x5d\\x6a\\xe8\\xd4\\x1b\\x78\\xaa\\x5b\\xc0\\xd1\\x07\\x3b\\x8f\\x21\\xcf\\x2d\\xa1\\x84\\x0b\\x9f\\xa6\\x07\\x8f\\x71\\xbd\\x0f\\x42\\x1c\\x2f\\x35\\xf2\\x50\\x31\\x35\\xe4\\x69\\x91\\x8d\\xb6\\xe8\\x00\\xda\\xd2\\x18\\x22\\xf3\\xe8\\x3c\\xc8\\x49\\x87\\x54\\x3c\\xc7\\x8e\\x74\\x96\\x50\\x5b\\x2a\\xec\\x56\\x29\\x47\\x09\\x41\\xc5\\xd7\\x63\\x92\\xb2\\x2c\\x6e\\x22\\x6b\\x99\\x6a\\x6b\\xa2\\x47\\x17\\x65\\x22\\x09\\x95\\xcf\\x62\\xa5\\xd0\\x48\\x2f\\xf7\\x5a\\xdc\\xdf\\xa5\\xdd\\x1d\\xe8\\x08\\x1b\\xe5\\x28\\x53\\xe6\\xbf\\x17\\x73\\x48\\xc2\\x69\\xa3\\xb7\\xca\\xe1\\xd7\\x86\\xd8\\x2b\\x62\\x31\\x68\\x91\\x95\\x00\\xf8\\x4a\\x69\\x69\\xc2\\x24\\x25\\x73\\x67\\xf4\\x6e\\x76\\x14\\xa9\\x36\\x14\\xe9\\x70\\xc8\\x7f\\x3b\\x1c\\x29\\xb9\\x05\\x42\\x31\\xc3\\x82\\x49\\x42\\x19\\x60\\xaf\\xdc\\x4a\\x07\\x93\\xf4\\x9b\\xbc\\x45\\x37\\x52\\x97\\x79\\x56\\x5f\\x18\\xd0\\x41\\xce\\xba\\x82\\x41\\x2f\\xf1\\x46\\x62\\xa1\\x11\\xb4\\x3f\\x52\\x8d\\x1d\\x5a\\x2e\\x02\\x30\\xde\\x14\\xdc\\x37\\xe3\\xaa\\xd4\\x62\\xd1\\x5f\\xfb\\x8a\\x16\\xdf\\xf5\\x12\\x6d\\xcf\\x8c\\xd9\\xb9\\xaa\\x0a\\x78\\x84\\xec\\x5e\\x24\\x21\\xd9\\x1b\\x11\\x21\\x04\\xdb\\x09\\x25\\x6f\\xf5\\x82\\xbd\\x3e\\xad\\x9c\\x36\\xea\\x6c\\x78\\x55\\xde\\x76\\x71\\xd5\\x83\\xc6\\xc1\\xd3\\x59\\x4c\\x0b\\x6f\\xb5\\x54\\x23\\x30\\xab\\x23\\x87\\x91\\xa1\\x17\\xfa\\x47\\xd4\\x62\\x74\\x25\\x9a\\xc9\\x3a\\xee\\x6d\\xbe\\x51\\xe8\\x45\\x0a\\x93\\xd4\\x67\\x22\\x82\\x5b\\x60\\x83\\x25\\xae\\x80\\xc8\\x1d\\x26\\xe3\\xdc\\x78\\x79\\x88\\x69\\xd6\\x3d\\x8d\\x5f\\xd8\\x26\\xce\\x6b\\xf4\\xdc\\x3e\\xf5\\xe9\\xe4\\x6a\\x96\\xe5\\x1b\\x6b\\x28\\xc9\\x8b\\x92\\xab\\xc2\\x83\\x38\\xbf\\xed\\x9c\\x3c\\x49\\xe7\\x82\\x85\\x68\\x70\\x36\\x0a\\x16\\x29\\xc6\\xa2\\x84\\x37\\x0e\\xbd\\xb0\\xa9\\x49\\x2f\\x9d\\x00\\xdd\\x66\\xc1\\xe8\\xfd\\x00\\x82\\x23\\x22\\x9f\\x05\\xae\\x21\\xbb\\x31\\xac\\xe8\\xc2\\x10\\xd1\\x99\\x43\\xff\\x9f\\xcd\\x39\\xd2\\xd9\\xcd\\x1d\\x72\\xf7\\x34\\x6a\\x68\\xa6\\xac\\xf7\\x50\\x29\\x77\\x9e\\xa3\\xb4\\xc7\\x75\\x5e\\x97\\x77\\xde\\x96\\x07\\xe4\\x14\\xb8\\x1a\\x29\\xad\\xe3\\x28\\x53\\x21\\x26\\x19\\x2e\\x33\\x9e\\x1d\\x07\\x4f\\x0a\\x58\\x92\\x77\\xa2\\xe1\\x3d\\x69\\x3a\\x12\\x2e\\xb6\\x71\\x5e\\x5e\\x9a\\xd2\\x9a\\xda\\xf3\\xc7\\x1b\\xa9\\x2a\\x5e\\xeb\\xc4\\x70\\x67\\xda\\x3f\\xce\\x09\\xa0\\xe3\\x65\\xc5\\xbc\\xf8\\x68\\x85\\xe3\\x36\\xaa\\x0c\\xfd\\xef\\x3f\\xe2\\xf7\\xe9\\x70\\xa4\\x58\\xe0\\x86\\x82\\xcd\\x6f\\x76\\xf6\\xaa\\xf0\\x1a\\xfc\\x67\\x93\\x71\\x44\\x95\\xd4\\x7e\\xf1\\x8c\\x67\\x6a\\xd9\\x7f\\x28\\x08\\x48\\x06\\xeb\\x36\\x96\\x24\\x3f\\x82\\xff\\x20\\xd3\\xe0\\x83\\x8d\\x18\\x2c\\xc2\\x92\\x7c\\x4a\\x9c\\x13\\x6a\\x77\\x12\\xc2\\x95\\xb0\\x8b\\xea\\x4b\\xd9\\x74\\x32\\x2d\\xbd\\xcc\\x74\\x30\\x9c\\x84\\xf2\\x1a\\x2a\\x74\\x87\\xcb\\xf2\\x59\\xa5\\x62\\xa3\\x09\\x4d\\x23\\x29\\x32\\x61\\xbc\\xbf\\xd3\\x8e\\x43\\xa1\\x9a\\x54\\xee\\x34\\xde\\x87\\x72\\xf6\\x14\\xe9\\xea\\x24\\x66\\x74\\xb8\\x30\\x1c\\x12\\x34\\x1e\\xc5\\x2b\\x9c\\xac\\x69\\x84\\x13\\x46\\xa5\\x8f\\x86\\xe1\\x5f\\x09\\xd4\\xdd\\xb4\\x5a\\xef\\xf8\\x72\\x09\\x4f\\x74\\x47\\x93\\xc7\\xa2\\x58\\x7a\\x5d\\x54\\x9f\\xfc\\x24\\x8e\\xce\\x2f\\x77\\x07\\xf1\\x8a\\xb0\\x31\\xf2\\x95\\xe0\\x3b\\x29\\x4c\\x5c\\x89\\x51\\x83\\x0c\\x67\\xff\\xde\\xaf\\x1d\\x5a\\x98\\x3f\\xdd\\xff\\xf7\\xdf\\x6e\\xd9\\xe4\\x5f\\x46\\x64\\xd8\\x44\\xd2\\xd6\\x96\\xef\\xb4\\x2c\\x4a\\x28\\x47\\x29\\xbe\\x98\\x31\\x5e\\xca\\x8c\\x76\\xae\\x20\\x30\\xb4\\x04\\x5e\\x03\\xbe\\x00\\x1b\\x39\\x5b\\x2e\\x96\\xea\\xf2\\x2b\\xcc\\xf6\\xb1\\x69\\x2b\\xa5\\xda\\xf1\\xd3\\x78\\xb0\\x4a\\x95\\xd9\\xb3\\xac\\xc4\\x60\\x85\\x6d\\x68\\x70\\xff\\x68\\x91\\x8f\\xfc\\xa1\\x9a\\xd1\\xf6\\x6d\\x31\\x1c\\xb9\\xa4\\xf3\\xc9\\xf5\\xc3\\xbb\\xf2\\x3f\\x4d\\xc0\\xc2\\x3e\\x4a\\x31\\xc6\\x10\\x88\\x0c\\xe0\\x04\\xd8\\x66\\xc5\\x58\\x03\\x24\\x63\\x8c\\xfd\\x43\\xda\\x32\\x03\\x12\\x3c\\x8b\\x9b\\x38\\x63\\x20\\x63\\x29\\xe1\\xde\\x73\\xab\\x2d\\x27\\x68\\x0b\\x3b\\x03\\xd8\\xa5\\x7d\\xba\\x85\\xd8\\x50\\x50\\x9c\\xb5\\x03\\x1c\\x76\\x42\\x50\\x07\\xa7\\x3d\\x49\\xd6\\x01\\x86\\x2c\\x06\\x26\\x13\\xb8\\x7a\\xc7\\xef\\x53\\xd0\\xfa\\x05\\xcd\\x2a\\xa6\\xcc\\x40\\x00\\x00\\x08\\x02\\x9a\\x02\\xa8\\xb4\\xeb\\x38\\x6f\\x72\\xf0\\x62\\x07\\xc2\\x76\\x66\\x56\\x5d\\xf9\\xa6\\x83\\x8b\\x94\\x6c\\x11\\x6a\\x3f\\x30\\x49\\x09\\xa5\\x30\\xab\\x23\\xdd\\x28\\xa8\\xa4\\xae\\x60\\xf0\\x50\\x93\\xf8\\x51\\x38\\x54\\x3f\\xfa\\xfa\\xeb\\xd2\\xd0\\x56\\x52\\xbc\\x17\\xc2\\x7f\\xd9\\x07\\x32\\x9e\\x19\\x44\\x11\\x7c\\xe3\\x12\\x31\\x7e\\xb7\\xfe\\xf4\\x0a\\x64\\x20\\x4a\\x40\\xc6\\x7d\\x0c\\x09\\x7a\\xe0\\xb2\\x04\\x46\\xbf\\xc5\\xea\\xad\\x46\\x7b\\xd4\\x7e\\x51\\x56\\x13\\x88\\x62\\x12\\x24\\xe2\\x39\\x5b\\x54\\x9b\\x51\\xc3\\x61\\x07\\x31\\xc7\\xbf\\xb7\\xff\\x61\\xd4\\xfc\\xc0\\xdd\\x98\\x3c\\x6c\\x9f\\xd9\\xc9\\x96\\xe5\\x53\\x08\\x31\\xab\\x47\\xee\\xbb\\xde\\x40\\xf8\\xc1\\xd4\\xf8\\xc7\\xdd\\xf9\\xde\\x64\\x9e\\xec\\x23\\x59\\x71\\x3c\\x36\\x14\\x58\\x64\\x92\\x19\\xa3\\x76\\x8a\\xb6\\x0d\\x4f\\x8a\\xcc\\x54\\x41\\x45\\x27\\x54\\xac\\xfb\\x9c\\xc8\\x86\\x0c\\xe4\\x43\\x1c\\xf4\\x93\\x47\\xd9\\x01\\x34\\xa3\\x83\\x25\\xf4\\x9c\\xb5\\x36\\x2d\\xd6\\xd7\\xda\\xb6\\x51\\x4e\\xc4\\x3a\\xd3\\x5a\\x9a\\xd6\\xa4\\x8e\\x01\\xff\\x5c\\xa4\\x9f\\x48\\xbb\\x73\\x91\\x93\\x04\\x34\\x41\\x63\\x9e\\x3c\\xda\\xbe\\x7e\\x73\\x32\\xcc\\xb2\\x16\\xd8\\x06\\x6f\\x21\\xe0\\xbe\\x06\\xe4\\xd6\\x22\\xc9\\xe9\\x4f\\x19\\xf3\\xb2\\x06\\xdd\\xd5\\xa1\\x89\\x60\\xcc\\xe7\\x2e\\xaa\\xec\\xd5\\x71\\xac\\xcf\\x54\\x04\\x75\\xc7\\x6e\\xb9\\xf7\\xef\\x9c\\x49\\xb5\\xc1\\x88\\x38\\x8c\\xfd\\x96\\xa1\\x77\\x9b\\xba\\xca\\x89\\x52\\x52\\x37\\xb3\\x4c\\x55\\x22\\x61\\xec\\x06\\xb0\\x53\\x05\\x21\\xf4\\xe1\\x10\\x2d\\x91\\x51\\xf5\\x18\\x08\\xf1\\xfe\\xbe\\x97\\x86\\xba\\x9c\\x2b\\x0e\\x72\\xa5\\x90\\x6a\\x38\\x1a\\x61\\xb2\\x55\\x14\\xb7\\x84\\xd2\\x2c\\x79\\x6a\\xd7\\x94\\x68\\x60\\x3c\\xf9\\x97\\x30\\xdb\\x0a\\x32\\x73\\x88\\x12\\x6e\\xc1\\x0c\\x2d\\xa6\\xff\\xf4\\xc9\\xe1\\x65\\x71\\x60\\x25\\x28\\x81\\x89\\x12\\x88\\x65\\x6e\\x1e\\x5c\\x16\\x1b\\xdb\\x77\\x40\\x93\\x51\\x1a\\xab\\x55\\xd8\\x71\\xb2\\x17\\xe8\\xe2\\xfc\\x4e\\xd6\\x88\\x58\\xaf\\x1b\\xfd\\x1e\\x64\\xd1\\x83\\x3b\\xb3\\x57\\xc4\\xb3\\x5e\\xb8\\x4e\\x17\\x61\\xed\\x96\\x42\\x42\\x70\\x2a\\x99\\x60\\xc0\\x60\\x66\\xb9\\x1d\\x4e\\x84\\xac\\x18\\xf5\\xe6\\x58\\x31\\x79\\x64\\x47\\x00\\xa3\\x8c\\x01\\x67\\xcd\\xd5\\x60\\xf7\\x38\\xb6\\xae\\xcf\\x4b\\x9d\\x92\\x84\\x5c\\x0c\\x8b\\xa8\\x24\\x28\\x06\\xd3\\x18\\x28\\x24\\xb4\\x58\\x05\\xb1\\xb6\\xf2\\x8a\\x55\\x2d\\xc9\\x54\\xd3\\x18\\x95\\xfe\\xc2\\xd8\\xe2\\x1e\\xb2\\x3d\\xd9\\x9a\\x25\\x90\\x17\\x7f\\xaf\\x2b\\xfa\\xb5\\x75\\x29\\x75\\xc2\\x3e\\x8f\\x06\\x4b\\x82\\x24\\x0c\\xe6\\xb7\\x72\\xec\\x7e\\x26\\x3f\\x99\\xda\\x47\\xda\\x9a\\x3c\\xf3\\xc1\\xe3\\x27\\x7b\\x52\\x4d\\x6f\\x52\\x0c\\xff\\xa9\\x9b\\x07\\x15\\xa6\\x93\\xfb\\x90\\x4d\\x7d\\xf5\\x1e\\xaa\\xae\\x9d\\xe0\\xb7\\x9b\\xa1\\x41\\xe5\\x1c\\xdf\\x91\\x6f\\x0a\\x92\\x03\\x6d\\xf0\\x1b\\x82\\xe7\\x4f\\xc8\\xd4\\xbe\\x09\\x6b\\xb5\\xb9\\x38\\x50\\xb2\\xa8\\x01\\xca\\xfc\\x0d\\x98\\x76\\xa9\\xa3\\x37\\xf4\\x94\\xa5\\xb4\\x5f\\x74\\x21\\x2a\\x6d\\x06\\x62\\xcf\\xe7\\x43\\xb6\\x5b\\xa8\\x7e\\xbc\\xcb\\xcc\\x1d\\xab\\x33\\xee\\xd4\\xb4\\x83\\x10\\xba\\x92\\xb5\\x41\\x28\\x54\\xf0\\xe2\\xb1\\x21\\x31\\xf0\\x35\\x65\\x62\\x56\\x2c\\xcb\\x2d\\x5a\\xe8\\xdb\\x83\\xd3\\x59\\xc9\\x79\\xd5\\x40\\xd6\\xfd\\x0d\\x98\\x2e\\xfc\\x23\\x5e\\x86\\x49\\xfd\\xe1\\x57\\x54\\xcc\\x2f\\x14\\xef\\xf0\\xbf\\xec\\xd8\\xad\\x33\\x45\\xc1\\x16\\x3f\\x93\\x19\\xf2\\x2e\\xeb\\x12\\xb0\\x13\\xeb\\x11\\xbc\\xdf\\xbf\\x9a\\x0f\\x06\\x47\\x49\\x86\\x36\\xef\\xf6\\x79\\x24\\x4a\\x82\\xbe\\x60\\x4c\\x76\\xb0\\xf2\\x24\\xd1\\x2b\\x97\\x4a\\xbc\\xaf\\x0b\\xf2\\xd3\\x73\\xb5\\xbb\\xb8\\xd5\\x1c\\x03\\xbc\\x46\\x6b\\x4d\\x3c\\x71\\xb7\\x27\\x7d\\x5d\\x0a\\x1b\\x42\\x2f\\xe5\\xd9\\x73\\x88\\xa7\\xb2\\x63\\x7e\\x39\\x1d\\x71\\x32\\x5c\\xa8\\xac\\x1e\\xcb\\x1a\\x02\\xee\\x5c\\x5a\\xf9\\xa3\\xcc\\xb8\\x83\\xdc\\x42\\xff\\x2d\\x63\\x95\\xc1\\x52\\x15\\xbc\\xc9\\x2c\\x15\\x81\\x9c\\xb4\\xbb\\xf4\\xcb\\x8a\\xbc\\xe9\\xb2\\xd5\\x2b\\x6f\\x2d\\x7f\\xa9\\xa2\\x80\\x79\\x6c\\x24\\x82\\x2b\\xe7\\x48\\x69\\x34\\x58\\x5f\\x60\\x96\\xb0\\xdd\\x7e\\xec\\x32\\xe9\\x70\\x33\\xa3\\xa1\\xa2\\xfc\\xe1\\x4a\\xc9\\x20\\xa0\\x00\\xdc\\xf3\\x07\\xda\\x48\\x99\\x0f\\xbb\\xd5\\xd1\\xfd\\xed\\x11\\x44\\x00\\x02\\xbf\\x75\\x4f\\x93\\x12\\xaf\\xbd\\x8c\\x2e\\x62\\xbf\\xb0\\x64\\x07\\xb6\\x1a\\xde\\x98\\xf8\\x95\\x40\\xa3\\x75\\xb2\\x2d\\x15\\x45\\xdd\\xb6\\xc8\\xfb\\xb0\\xfc\\x5c\\xdd\\x88\\x15\\x50\\x70\\x99\\x12\\x79\\x42\\x87\\x40\\x7c\\x7f\\x39\\xf2\\xc7\\x5d\\x58\\xe9\\xe7\\xed\\xa5\\x88\\x51\\x44\\x45\\x78\\xea\\xde\\x01\\x5d\\xb1\\x9e\\xd2\\x99\\x54\\xe0\\xfe\\xc9\\x53\\x94\\xcc\\x27\\xc1\\xa8\\x60\\x99\\x3f\\x6f\\x5c\\x14\\xe6\\xab\\x58\\xd7\\x58\\x1c\\xe2\\xf2\\xe5\\x94\\x70\\xc3\\x07\\x11\\x23\\x21\\x39\\xb1\\xe9\\x78\\x1f\\x91\\x68\\x58\\xa1\\x6c\\x14\\xd8\\xef\\xba\\x4a\\x84\\x71\\x74\\x9b\\x18\\xe2\\x56\\x9b\\x36\\x56\\x1b\\xa9\\xba\\xbf\\x08\\x87\\xe0\\x79\\xf0\\xc2\\x2e\\x85\\x86\\x06\\x02\\x69\\x88\\x51\\xb8\\x12\\x65\\xcf\\x7a\\x92\\x18\\x2c\\xf3\\x65\\x34\\xbd\\xc5\\xa8\\x38\\x2a\\x5d\\xd8\\x3f\\xa8\\x25\\x12\\xa3\\x12\\xd0\\x73\\x21\\x95\\xc3\\x3c\\x3f\\xf9\\xf4\\x80\\x52\\xf3\\x73\\xa5\\xf2\\xd8\\x17\\x6f\\x0e\\xec\\x81\\xab\\xfd\\x72\\x2d\\xc1\\x84\\x8d\\xf8\\xdf\\x87\\x96\\xaa\\x36\\x49\\x54\\x03\\x9a\\x57\\x43\\x3c\\x2c\\x6e\\x8f\\x4d\\xe6\\x0d\\x8a\\x03\\x63\\xb4\\xf6\\x87\\xbf\\xb8\\x33\\x6d\\x6e\\x32\\x21\\x59\\x72\\x60\\x93\\x50\\x4e\\x64\\x61\\xb3\\x24\\x6a\\x2d\\x06\\x67\\x0f\\x5c\\x38\\x26\\x50\\xd0\\x14\\x2e\\xf9\\x92\\x39\\x86\\xd2\\xc4\\xc3\\x9b\\x7a\\xf2\\xf0\\xd0\\x52\\xbf\\x2b\\x7f\\x46\\x2e\\xb9\\x28\\xc4\\x75\\x81\\xd2\\x88\\x74\\x23\\x49\\x28\\x2d\\xda\\x87\\x5b\\xd6\\xef\\xcf\\xb9\\x8f\\xa9\\x9c\\xfc\\x5c\\x53\\x9a\\x8b\\x65\\xa0\\x05\\xb3\\x1d\\xe6\\x1d\\x02\\x5a\\xc5\\x54\\xe5\\x65\\xfb\\xf1\\x4d\\x62\\xa6\\x3f\\x87\\x2d\\xb5\\xc9\\xc2\\xdb\\xca\\x4a\\xdf\\xe4\\x7c\\xf4\\xf0\\x75\\x69\\x9c\\x76\\xc4\\x8c\\x86\\x81\\x08\\xe6\\x72\\x3a\\x88\\xd9\\x2e\\x43\\xff\\xa4\\x3e\\x3b\\x31\\x55\\xeb\\x2c\\x5d\\xbf\\x53\\x42\\x83\\x6e\\x63\\x18\\x63\\x75\\x24\\x46\\xd2\\x4d\\x91\\x5e\\x85\\xe0\\x2c\\x90\\x30\\xfe\\x8e\\xde\\xec\\xa8\\x57\\xa6\\xd8\\x17\\xb1\\x04\\xc1\\xbe\\xe6\\x61\\x3e\\x52\\xa7\\xae\\x7b\\x79\\x92\\xc7\\x3b\\xef\\x0d\\x7c\\x2d\\x3f\\x66\\xb5\\x96\\x20\\xf1\\x5e\\x65\\x2d\\x3d\\x68\\x8b\\x30\\x01\\x3d\\x75\\xc1\\x7f\\x57\\x5e\\x27\\xd1\\x6c\\x05\\xd2\\xbd\\xb7\\xad\\x1b\\x74\\x30\\x63\\xda\\x07\\x4f\\x01\\x87\\xbb\\xca\\x68\\x65\\xe0\\x79\\x33\\x29\\xfa\\x0c\\x44\\x54\\x4c\\x16\\xad\\x09\\xa9\\x6e\\xf8\\xaf\\xe9\\x96\\xa8\\x0d\\x5b\\xf6\\xc9\\xc4\\x4f\\xdc\\x78\\x55\\x17\\x0d\\x22\\xe3\\xb7\\x2d\\xba\\x32\\xb7\\xeb\\x1d\\x13\\x4b\\xc2\\x73\\x7e\\xbc\\xef\\xa6\\xff\\x1a\\x63\\xbc\\xfa\\xa0\\xe7\\x40\\xa3\\x95\\x4a\\x1b\\x0d\\x8b\\x34\\x2b\\x8c\\x65\\x6e\\xd6\\xf6\\x1c\\x75\\x13\\x46\\x8f\\x61\\xd9\\x8d\\x01\\xfc\\x57\\x32\\x6b\\xff\\xe4\\x67\\x1f\\x5b\\x30\\xe7\\xf8\\x12\\x24\\x74\\x83\\x23\\xb5\\x3e\\x1e\\x30\\x84\\xca\\x27\\x8b\\x41\\x7a\\x89\\x2c\\xdf\\x84\\x4f\\x9e\\xb5\\xe4\\x81\\x11\\xa8\\x94\\x8c\\x3b\\xc2\\x50\\x06\\xb6\\x71\\xdf\\x0b\\xa4\\xf4\\xbe\\x9e\\x64\\x19\\xf5\\xc1\\x4c\\x44\\x9a\\x8a\\xd7\\xd5\\x25\\x40\\xac\\xa3\\xdb\\x85\\x48\\xe6\\x2e\\x15\\x0e\\xc6\\xd0\\x70\\x8b\\x5a\\x2d\\xa6\\x5b\\x2d\\x9a\\xef\\x41\\x74\\x95\\xa5\\x2e\\x70\\xfb\\x15\\x03\\x2c\\x38\\x0f\\xd3\\x8d\\x34\\x7c\\x88\\x19\\x1c\\x53\\x4f\\xe0\\x59\\xa8\\xdf\\x1c\\xb7\\xf4\\x21\\xd2\\x6a\\xd2\\x7f\\xfd\\xcd\\xcf\\x67\\xea\\x86\\xd7\\xe5\\x2d\\x86\\x5e\\xfc\\x7b\\x42\\xf7\\x91\\x6a\\xf6\\x10\\xbe\\x32\\x4e\\x7a\\x78\\xa9\\x79\\xd5\\xcb\\x4c\\x56\\x58\\xce\\xdf\\xb0\\xb9\\x79\\x18\\x99\\xd0\\x0c\\xc5\\x68\\xb4\\xb7\\xcf\\xa9\\xfd\\x11\\xaf\\xe8\\x17\\x38\\xfd\\x8f\\x55\\xd2\\x00\\x33\\xd6\\x6b\\x07\\x02\\x05\\x09\\x1a\\x87\\xc5\\x77\\x8c\\x30\\x35\\xc2\\x4b\\x37\\x64\\x0e\\xf4\\x94\\x95\\x9a\\x26\\xe1\\x39\\xe5\\xd5\\x37\\x77\\x57\\x3f\\x72\\x47\\xda\\xf4\\xf5\\xf7\\x5d\\xd1\\xc4\\x41\\x5f\\x11\\x4c\\x52\\x8d\\x02\\x42\\x03\\x43\\x63\\xac\\x49\\xf1\\x71\\x26\\x97\\x76\\x4b\\x0c\\x8a\\x74\\x3c\\xa1\\x43\\x47\\xaa\\xe0\\xbd\\xdf\\xfd\\x41\\xcc\\x9e\\x95\\x3c\\x77\\x71\\x39\\xa1\\x72\\xa1\\x2e\\x89\\x69\\x68\\x13\\x85\\x78\\x54\\xa8\\xc3\\xa3\\xeb\\xec\\xab\\x63\\x6a\\x15\\xf3\\xf1\\x2d\\x2f\\x7f\\xb0\\x92\\xc2\\x32\\x87\\xbf\\xc1\\x77\\x96\\x33\\xea\\x13\\x26\\xeb\\xa0\\xf8\\x05\\xdc\\xd3\\xdf\\x71\\xb7\\x26\\x60\\x59\\x42\\x4f\\xda\\xc5\\x7f\\xc8\\xf3\\xe5\\x42\\x98\\xeb\\x15\\x1e\\x69\\x7e\\x99\\xe5\\x7d\\x04\\xe1\\x1b\\x6a\\xd5\\xe0\\xa6\\x3e\\xae\\x23\\x1f\\xe5\\x22\\xee\\x41\\x5b\\x74\\xa3\\xed\\x74\\x5a\\x04\\xe0\\x65\\x6f\\x0f\\x51\\xc3\\x0a\\xe1\\x93\\x4f\\x9f\\x33\\x6f\\x8a\\x97\\xb7\\x23\\x8e\\xff\\xdb\\x78\\x58\\x54\\xcf\\x30\\xa4\\xa1\\x57\\x16\\x40\\x8a\\x36\\x55\\x13\\xb2\\xcd\\x43\\xaf\\xed\\xff\\x7d\\x8c\\x52\\x81\\x3e\\x63\\xff\\xbc\\xfb\\x42\\xb5\\xff\\x9a\\xa5\\x2c\\x57\\xa6\\xa5\\x29\\x06\\xfe\\x49\\xc1\\x72\\x53\\xbc\\x03\\xc4\\xde\\x37\\x0c\\xfb\\x5d\\x69\\x1b\\x21\\x64\\x8c\\x5a\\xa6\\xd7\\xbb\\xeb\\xaa\\xfb\\xeb\\xfa\\xb6\\xba\\xfb\\x87\\xe7\\x96\\x72\\xd0\\xcb\\x16\\xf9\\x7f\\xf8\\x24\\xa1\\x2a\\x9b\\xe7\\x5f\\x7e\\x49\\x84\\x7c\\xd6\\x53\\xf6\\x91\\x02\\xea\\x5d\\x52\\xb3\\xb8\\x74\\x3d\\x2a\\x87\\x48\\x0a\\x5d\\x11\\xbe\\x13\\x62\\xa7\\x50\\x55\\x4f\\x1d\\xfa\\xc5\\xe8\\x9f\\x76\\x82\\x27\\x23\\xcd\\x6a\\x75\\x72\\x5a\\xf4\\xcb\\xf6\\x13\\xf3\\xf6\\xcb\\x1e\\xf7\\xd7\\x32\\x05\\x99\\x74\\xd8\\x2d\\x50\\x70\\x77\\xfe\\x03\\x33\\xd5\\xc5\\x87\\xd1\\x26\\x32\\xd0\\x2c\\x71\\x33\\x10\\x17\\x5f\\x91\\xdf\\x43\\xb5\\x5a\\xfe\\x84\\xcd\\x68\\x82\\x0b\\x72\\x90\\x5c\\xb5\\xab\\x57\\x08\\x4c\\x04\\x4a\\x02\\xa0\\xd1\\x14\\x61\\x64\\xe1\\xa0\\x20\\x32\\x69\\xdd\\x7d\\xf2\\xfd\\x0f\\xa0\\x44\\xe1\\x2a\\x44\\xfd\\x70\\xc2\\x5d\\x0e\\x0d\\x49\\x2c\\x5d\\xd8\\xc1\\x47\\xdb\\x92\\xbb\\xf6\\xc2\\xac\\x9d\\x84\\x83\\x9b\\xe6\\x67\\x74\\x36\\x09\\xef\\x9f\\xb8\\xc9\\x1e\\xc9\\x46\\x42\\xc6\\xcf\\x64\\x99\\x72\\x96\\xf2\\x20\\x67\\xa5\\xd9\\xb2\\xb3\\x57\\x48\\x4a\\x98\\x56\\xa0\\x62\\xaa\\x6b\\xe3\\x5a\\xb6\\x1e\\x69\\x34\\x67\\x39\\x52\\x1c\\x4d\\x3e\\xc5\\xa5\\x59\\xcc\\x3f\\x00\\xde\\x64\\x13\\xcd\\x07\\xc4\\xab\\x1f\\x78\\xb3\\xf5\\x62\\x62\\x1a\\x36\\x64\\x92\\x9c\\x42\\x28\\x7b\\xfe\\xfb\\xaf\\x01\\x21\\x48\\xb9\\x31\\xc8\\x44\\x6c\\x71\\xc9\\x50\\x04\\xb4\\x1a\\xb8\\x8d\\x98\\xea\\x1c\\x59\\x27\\x15\\xb9\\xd3\\xc9\\x1f\\xb1\\x9c\\x10\\xd0\\xe5\\xf7\\xcd\\x71\\xb4\\xc6\\x99\\x11\\x28\\x50\\xf2\\xe9\\x25\\x99\\xc5\\xc7\\xe2\\x1b\\xba\\x28\\x70\\x22\\x6b\\xb2\\x93\\xcc\\xd8\\x5b\\x86\\x69\\x9b\\x62\\x78\\x6f\\xd3\\x2f\\x2d\\x48\\xc2\\x38\\x5a\\xec\\x1d\\xe1\\xc3\\xf0\\xf3\\x4a\\xe7\\xc8\\x01\\xdb\\x93\\xb4\\xd5\\xfe\\xae\\x1a\\x88\\x5b\\x86\\x63\\xf2\\x68\\x5c\\xb4\\x56\\x05\\xd0\\x34\\x46\\x32\\xd3\\xbc\\xca\\xde\\xbc\\xc5\\x1d\\x42\\xd3\\x03\\x71\\x60\\x23\\x53\\xbf\\x06\\x79\\x19\\x3f\\xbd\\x28\\x15\\x44\\x23\\xc3\\xfd\\xa9\\xb0\\x47\\xee\\xed\\xef\\x81\\x8e\\xeb\\xfc\\xa1\\xa7\\xde\\x43\\xc5\\xa4\\x7d\\x7e\\xc4\\x99\\x46\\x4e\\x85\\x2a\\xe5\\x9e\\x3a\\x1f\\x10\\x6d\\x27\\xbd\\x42\\x01\\x16\\x03\\xb1\\xe7\\x9a\\xa3\\x40\\x9a\\xb1\\x6e\\x28\\x0f\\x1d\\xa7\\x12\\x0f\\xa6\\x9c\\x4c\\x86\\x12\\x03\\x96\\x86\\xa5\\x05\\x94\\x23\\x95\\x12\\x2f\\xee\\x46\\xb5\\xca\\xe1\\x52\\x4a\\x6e\\x94\\xc2\\x97\\x8a\\x5f\\x9f\\x8b\\x4f\\x7a\\xd4\\x9c\\xef\\x28\\x24\\x86\\x51\\x25\\x32\\x38\\x2b\\x28\\xa1\\xbc\\x7d\\x15\\x22\\x44\\x9a\\x31\\xe3\\x46\\x02\\xcf\\x19\\x8f\\x90\\xd6\\xce\\xaf\\x7b\\x8b\\x4d\\xf1\\x2b\\xa1\\x65\\xc9\\xdc\\xf5\\x00\\xb6\\xfe\\xf9\\xa8\\xb4\\x0a\\x2d\\x0b\\x65\\x25\\xa4\\x06\\xaf\\xd4\\x8f\\x95\\x98\\xd0\\xfb\\x0d\\x8d\\x0a\\xfc\\x15\\x3c\\xb1\\x99\\xec\\x0b\\x93\\xfe\\x17\\xb3\\xb1\\x90\\xb8\\x96\\xc4\\x15\\x43\\x39\\xb5\\xff\\xdd\\xc4\\x43\\x1d\\xb4\\x88\\x7f\\x18\\xf3\\x0a\\xdd\\xb2\\x0d\\x8a\\x44\\x59\\xc7\\x7b\\x38\\x71\\x90\\xcf\\x4a\\x41\\x1e\\x95\\x12\\x52\\x60\\x93\\x1c\\x9c\\xdc\\x95\\x81\\x09\\x9e\\xf6\\x16\\x87\\x45\\x36\\xb5\\x75\\x3f\\xfa\\xd7\\xfc\\x37\\xa6\\x59\\x1f\\xb0\\xf3\\x2a\\xbc\\xd8\\x32\\x30\\x38\\x73\\xeb\\xba\\xaf\\xaa\\x07\\xaa\\x1d\\xce\\xbb\\x8a\\xbd\\xc5\\x2c\\x64\\xa5\\xbd\\x38\\x79\\xdc\\x95\\xe3\\x1c\\x68\\x4f\\xb4\\xd4\\xe4\\x89\\xb8\\xa7\\x11\\xdd\\x1a\\x16\\x77\\xd4\\x3e\\x9e\\xb2\\xf5\\xb8\\xca\\x62\\x80\\xe0\\x24\\x97\\xed\\xf1\\x7f\\x84\\xfc\\x58\\x0d\\x8b\\xfd\\x43\\x06\\x3f\\x91\\x55\\xdc\\x7f\\x23\\x5c\\x91\\xb9\\x2c\\x70\\x78\\xa0\\xeb\\x8e\\xf4\\xcb\\x60\\x66\\xc3\\x26\\x3a\\x74\\x7e\\x06\\xe9\\xe7\\x9a\\x6b\\x42\\x7c\\x19\\x79\\xd6\\x7e\\x14\\x69\\xd0\\x84\\xdd\\x8b\\xa0\\xa1\\x0c\\x98\\x44\\x29\\x1f\\xf7\\x49\\x48\\x0e\\x2c\\xe1\\xf5\\xd7\\xb1\\xae\\xf5\\x18\\x23\\x43\\xc2\\x59\\xc2\\x4e\\xc3\\xba\\xb9\\x88\\xda\\x0a\\xae\\x2b\\x3c\\x2b\\xd1\\x1b\\xc0\\x4c\\x4e\\xbd\\xed\\x37\\x0c\\x84\\x81\\x77\\x30\\x55\\x69\\xf0\\x57\\x75\\x46\\x99\\x2d\\x95\\x8a\\xa5\\xbc\\xff\\xa3\\x6e\\x7e\\x2c\\xd4\\x22\\x26\\x22\\x88\\x56\\x6b\\xd3\\x1b\\xd9\\x88\\x8c\\x6b\\x11\\x84\\xb7\\x3a\\x88\\x97\\x25\\x82\\xbb\\x3d\\xaf\\xf8\\x14\\x01\\x7f\\x71\\x34\\x32\\x86\\x04\\x4a\\x28\\x83\\x04\\x9d\\x89\\x0d\\xe5\\x41\\x52\\xf9\\x2b\\xff\\xa6\\xcd\\x98\\xdc\\x62\\xb8\\x3b\\xc3\\xe3\\xf3\\xe2\\x59\\x99\\xca\\xdd\\x1c\\xf9\\x9f\\x3e\\xa0\\xe4\\xa2\\xa0\\x94\\x40\\x4c\\x5e\\x81\\x24\\x6f\\xb1\\x61\\xb0\\xf5\\xb3\\x4c\\x41\\x42\\xe0\\xc6\\xfe\\x84\\x88\\xe2\\xb7\\x94\\xf6\\x34\\x65\\xdd\\x7e\\xd1\\x0b\\x1c\\x94\\x54\\xe9\\xd5\\x51\\xb0\\x9a\\x28\\x44\\xe6\\xff\\x03\\xcc\\x16\\x33\\xe9\\x92\\x41\\xc7\\x13\\xf8\\xc5\\xa8\\x4c\\xfc\\xfe\\x0d\\x9e\\x78\\xc7\\x93\\x0b\\x84\\x7f\\xa7\\x67\\xa6\\x9b\\xb6\\x0c\\x64\\x10\\xf6\\xd0\\x41\\xf3\\xf6\\x40\\x80\\xad\\xc3\\xde\\x8b\\x30\\x37\\x39\\xb2\\x05\\x5d\\x2f\\xa9\\xb5\\xe5\\x10\\x84\\x4c\\x5c\\x57\\x82\\x81\\x0b\\x14\\x12\\x88\\x2b\\xae\\x2b\\x33\\x68\\x2d\\xe9\\x16\\xae\\xdd\\x56\\x56\\xe2\\x6b\\x09\\xf6\\x25\\x06\\xdd\\x03\\x04\\x99\\x54\\xdc\\x65\\xb6\\xa3\\x75\\x26\\xf0\\xcf\\xa6\\xc4\\xc0\\x87\\x3d\\x60\\xc4\\xc0\\x30\\x71\\x9c\\x43\\x90\\xe4\\x86\\xf8\\x1c\\x2b\\xfd\\xc2\\x0a\\x01\\x73\\x96\\x33\\x98\\x48\\xee\\xbc\\x99\\x8b\\xc0\\x72\\xc9\\x37\\x92\\xf1\\xdb\\x06\\xda\\x98\\x4c\\xb2\\x59\\x23\\x06\\x60\\x05\\x87\\x22\\xf6\\x1a\\x0d\\x0c\\xb0\\xa6\\x18\\x0c\\xf7\\x90\\xa5\\x79\\x08\\x0f\\x60\\x4b\\x92\\x37\\x7b\\xa4\\xe3\\x98\\x55\\x65\\x8f\\x4c\\x95\\xad\\x58\\xa9\\x63\\xa5\\xf7\\xbb\\x82\\x6f\\x97\\xc2\\x58\\x19\\xe1\\xe1\\xb0\\xe1\\xf9\\xc5\\x31\\xfa\\xf7\\x48\\x8d\\xec\\x80\\x9c\\xf8\\xe5\\x17\\x44\\x39\\x4e\\x20\\x6d\\x29\\x7e\\x52\\x22\\xd8\\x3e\\x35\\x9e\\xc2\\x06\\x95\\x2d\\xb9\\x16\\x98\\xe2\\xf1\\xfa\\x0b\\x4d\\xfe\\xda\\x52\\xb9\\x8b\\x63\\xcd\\x42\\xef\\x30\\x68\\x23\\x8e\\x39\\x1c\\x5d\\x6e\\xb7\\xce\\xd1\\xc1\\xa6\\x0b\\x5e\\xc1\\x08\\x77\\xaa\\x1d\\xaa\\x7f\\xeb\\x06\\xe4\\x58\\x41\\x21\\xf2\\x24\\xa8\\x03\\x99\\x82\\x71\\xa1\\x01\\x13\\x20\\x12\\x22\\x4f\\xb4\\x68\\x06\\x4f\\x30\\x38\\x51\\xb9\\xcc\\xe0\\xdc\\x66\\xa1\\xf1\\x74\\x7a\\xc2\\x1f\\xb1\\x27\\x23\\x51\\x2f\\x21\\x3d\\xd0\\xb5\\x2a\\xba\\x17\\xd9\\xa5\\x9a\\x57\\x74\\x9c\\x12\\x04\\x36\\xfe\\x5b\\x14\\xac\\x85\\x4d\\x0f\\x45\\xfb\\xa6\\xcd\\x91\\x9f\\xd2\\x65\\x66\\xd2\\x0e\\xe4\\x00\\x28\\x02\\x11\\x74\\xbd\\xc6\\x47\\xda\\x47\\x78\\x67\\xd4\\x5d\\x52\\xeb\\xcd\\x41\\x4f\\x17\\x7a\\xfd\\xb3\\x33\\xc9\\x65\\xad\\x3e\\x7f\\x0a\\xc4\\x58\\x0d\\x32\\xa2\\x80\\x50\\xf6\\x5d\\xd6\\xa3\\x27\\xac\\x78\\x9b\\xe9\\xc5\\x65\\x6d\\x50\\x86\\xab\\x99\\x98\\x59\\x46\\xdb\\xd5\\x0f\\x38\\x4d\\x76\\x4f\\x2c\\x4f\\xd2\\xb2\\x28\\x53\\x3a\\x15\\xdd\\x08\\x60\\x0f\\x9d\\x9b\\x91\\xe2\\x5d\\x86\\xd2\\xa6\\x20\\x65\\x4d\\x59\\xea\\xf1\\xcf\\x78\\x4d\\x20\\xab\\xea\\x08\\x90\\xae\\xc7\\xe2\\xb8\\x83\\x18\\x2e\\x72\\x0a\\xda\\x92\\x01\\x98\\x98\\x16\\x9c\\x8b\\xe9\\xf0\\xac\\x2a\\xcb\\x01\\x7f\\x03\\xe5\\x32\\xa0\\xd9\\x3a\\xfa\\xb3\\xc7\\x80\\x53\\x75\\xc6\\x21\\x34\\x0c\\x4e\\xd8\\x6f\\x6c\\xaf\\x93\\x65\\x33\\x2b\\xb0\\xad\\x08\\x35\\xeb\\x30\\x05\\xe5\\x27\\xf4\\x9d\\x03\\xa0\\xf7\\x35\\xe0\\x86\\x4d\\x8a\\x20\\x61\\x97\\x8e\\x43\\xa4\\x8a\\x08\\x99\\x36\\x46\\x8b\\xe3\\x34\\xd8\\xea\\xc0\\x48\\xfa\\x84\\x51\\x33\\xe7\\x45\\x18\\x87\\x7a\\x12\\x41\\x81\\x16\\xc4\\x07\\x8e\\x75\\xc3\\xa1\\x69\\x49\\x8c\\x20\\x27\\x21\\x3c\\xa3\\x3b\\xb7\\x50\\x2d\\x93\\x96\\xe8\\x92\\xcc\\xab\\x45\\xe0\\x07\\x30\\x26\\x2b\\x75\\x0a\\x62\\x75\\x87\\xb5\\x09\\x58\\xe6\\xec\\x98\\x9f\\xe2\\x01\\xe5\\xea\\xbf\\x2d\\xa2\\x01\\x23\\x9b\\x47\\x62\\x47\\xe3\\xad\\xeb\\x73\\x66\\x24\\xa4\\x05\\x12\\x52\\x39\\x92\\x96\\x5d\\x8f\\x77\\xa9\\xab\\xf0\\x95\\x99\\xc4\\xab\\xee\\xa0\\xda\\x12\\x23\\x92\\xae\\x36\\x76\\x3f\\xb6\\xd7\\x1f\\x9b\\x68\\xc4\\x96\\x13\\xed\\x92\\xa2\\x4f\\x2d\\x2e\\xa6\\xf0\\x08\\x34\\xac\\x91\\xa5\\x80\\x41\\x79\\xe1\\x25\\x64\\x8d\\x38\\xc2\\x65\\xde\\xc2\\xd0\\x6d\\x03\\x2f\\x1b\\x99\\x02\\xf8\\x90\\xc1\\xb2\\x37\\x74\\xdc\\x5a\\xb7\\xbe\\x62\\xc0\\x9f\\x8c\\x4e\\x91\\xcb\\x1d\\xdc\\xbe\\x31\\x6a\\x07\\x13\\xcd\\x80\\x49\\x10\\x87\\x05\\x14\\x9c\\x71\\x89\\x8b\\x67\\x40\\x46\\x70\\x7b\\xc6\\xf1\\xf0\\x42\\xf9\\x6e\\x7c\\x79\\x58\\x8e\\x89\\x44\\x94\\x82\\xe4\\x15\\x41\\xd0\\x45\\x10\\x14\\x9d\\x17\\x21\\x42\\x07\\xc3\\x37\\x13\\xbb\\x7b\\x42\\xd8\\x3e\\x52\\x9c\\x9e\\x9a\\x37\\x26\\x7e\\xbb\\x70\\x55\\xb9\\x63\\x76\\x63\\xb4\\x96\\xe6\\x91\\x61\\x1a\\xfd\\x1c\\xab\\x44\\x2b\\xd8\\x6c\\x48\\x30\\x50\\x43\\x23\\xc9\\x75\\xb4\\x39\\x90\\x05\\x1c\\x41\\xfb\\x86\\x76\\x14\\x11\\x5a\\x9d\\x2e\\x17\\x46\\xfe\\x1d\\x7a\\xbb\\xfb\\xac\\xe3\\x4d\\x89\\x4a\\x7d\\xbe\\x2a\\x6b\\x24\\xc9\\xbf\\xd9\\x29\\xea\\xe6\\x5e\\x0f\\xed\\x51\\x25\\x82\\x4c\\x10\\xd0\\x9c\\x0f\\x8b\\x6d\\xfc\\x99\\x5f\\x96\\x16\\x9a\\x62\\x24\\xfe\\x0a\\xa7\\xaa\\xe4\\x01\\xb5\\xb1\\x04\\x49\\x85\\x4a\\x0c\\xc0\\xfc\\x4d\\x0b\\x0f\\x98\\x6f\\x1d\\x4e\\x5f\\x53\\x70\\x2d\\x91\\x9e\\xcc\\x7c\\xd7\\xa7\\x94\\xef\\xfd\\x57\\xdc\\x56\\xc4\\xa8\\x46\\xb8\\xfd\\x85\\xf3\\x75\\xba\\x38\\xa0\\x0a\\x23\\x02\\x64\\xbb\\xbc\\x10\\x14\\x20\\x2f\\x6d\\x6d\\x6e\\x06\\xc7\\x13\\x7f\\x68\\xf0\\xae\\x4f\\x99\\xd3\\xb6\\x17\\xd3\\xb7\\xa6\\x0f\\xd1\\x9c\\x98\\x53\\xd1\\x98\\x0a\\xd4\\xf7\\x91\\x0b\\x5c\\x8a\\xc4\\x14\\xe3\\x81\\xa3\\x9c\\x1a\\x60\\x3c\\x44\\x11\\xde\\xb0\\x70\\xe5\\x5d\\x2f\\xac\\x01\\x55\\xa4\\x2d\\xad\\x0a\\xc1\\x0d\\x22\\x98\\xe8\\x47\\xd6\\x7d\\x86\\xa8\\x9d\\x7e\\x91\\x54\\xed\\x74\\x97\\x9a\\x71\\x1b\\x15\\x08\\x6d\\x73\\x59\\x15\\x5e\\x01\\x94\\x2e\\xf4\\x23\\xec\\x21\\xaa\\x3b\\x88\\x0b\\xa9\\x05\\xa3\\x6e\\x6e\\xcc\\xd2\\xd0\\x48\\x5e\\x8d\\x23\\x06\\x45\\x03\\x78\\x7e\\x15\\x11\\x41\\xdc\\xc6\\xde\\xf3\\x11\\x86\\x13\\xc4\\xbe\\x01\\x4b\\x41\\x08\\x29\\x6c\\x43\\x40\\xcd\\x5d\\xeb\\xd2\\xfc\\xd0\\x08\\x51\\xc4\\xbd\\x9b\\xdd\\x0d\\x91\\xd1\\xc0\\x46\\x6e\\xb5\\xdf\\x3c\\xf0\\xe8\\x6e\\x83\\x16\\xab\\x4b\\xa1\\xdb\\x32\\x82\\xb5\\xe2\\x7e\\xc0\\xcd\\x15\\x3c\\xc3\\x83\\x31\\x5b\\x27\\x42\\xca\\x2c\\x31\\x06\\x1d\\x6b\\xef\\x70\\xbc\\x61\\x62\\xe8\\x9c\\x4d\\x9f\\xcb\\x0a\\x4c\\xb0\\xf2\\x04\\xf6\\x95\\xf8\\x7f\\x08\\x80\\x49\\x32\\xc3\\x00\\xd3\\x2a\\xe4\\x86\\x7a\\x7b\\x5b\\xeb\\xb2\\x06\\xb3\\xd0\\x4c\\x0d\\x95\\x4c\\x31\\x3c\\xb1\\x81\\x22\\x48\\x9d\\x8d\\x2d\\x5c\\x11\\xd0\\xb9\\x6f\\x35\\x5d\\xbc\\xac\\x88\\xa2\\x2e\\x93\\x3d\\xac\\x47\\x75\\x68\\xf2\\x93\\xaa\\x65\\x4f\\xc1\\xc9\\x43\\xd4\\x68\\xac\\xbb\\x94\\x50\\x0a\\x90\\x96\\xa5\\x4d\\x46\\x4b\\x5f\\xe6\\x47\\x7a\\x78\\x36\\x27\\x9d\\xd8\\x2d\\xf9\\x09\\x93\\xad\\x52\\xc6\\x66\\xd1\\x05\\xb1\\xd6\\x66\\xde\\x0c\\xac\\x00\\x79\\xd1\\x32\\x30\\xe0\\x7f\\x71\\xfb\\xdb\\xe9\\x5a\\xde\\xea\\x96\\x99\\xe4\\xd8\\x9e\\xf0\\x4a\\xe9\\xa8\\xec\\x9b\\x18\\x5c\\x47\\x46\\xf0\\xbd\\xc1\\x0b\\x08\\xed\\x0a\\xd8\\xaa\\xeb\\x88\\xc5\\x29\\x20\\x50\\x26\\xce\\x1d\\x77\\x6c\\x60\\x29\\x05\\x60\\xbd\\x83\\x74\\xaf\\x1e\\x40\\x38\\x29\\x01\\xae\\x31\\x86\\xd3\\xbc\\xad\\x12\\xb9\\x94\\xf8\\x2b\\x13\\x2f\\x62\\x38\\x21\\x2c\\x85\\x07\\x41\\xd9\\x71\\xc3\\x6b\\x3e\\x85\\x15\\x1b\\xbe\\x29\\x75\\x46\\xb3\\xdb\\x2b\\x92\\x21\\x39\\xea\\xee\\xb1\\x24\\x33\\x9b\\x83\\x95\\x36\\x3d\\xfd\\xc3\\x96\\x76\\xe4\\xd4\\xf7\\x4c\\x4f\\x43\\xe1\\x0a\\x9f\\x3c\\x2d\\xbf\\xf2\\xad\\xd6\\x83\\xc7\\x0a\\xfc\\xc2\\x7e\\xa4\\xe9\\xc4\\x19\\x20\\xa1\\x7a\\xda\\xb9\\x0a\\xcc\\x4a\\x0f\\xa7\\x26\\x63\\x02\\xd3\\xa8\\x34\\x38\\xe0\\x06\\x4e\\x0e\\x48\\x1d\\x0c\\xeb\\xae\\x5d\\xb4\\x93\\x84\\x7d\\x21\\xae\\x92\\x1e\\x19\\x1c\\x89\\x5b\\x52\\xa7\\x91\\xe9\\x96\\xa0\\xcb\\x84\\x63\\xf4\\x41\\xc9\\x23\\xa7\\x90\\xbf\\x6d\\xd8\\xdc\\x0f\\x98\\x84\\x64\\x0e\\x42\\x2d\\x84\\x8e\\x08\\xc7\\xe4\\xa0\\x53\\x6e\\x4b\\xdc\\x5b\\x03\\x9f\\xf8\\xeb\\x13\\xd4\\x15\\x8c\\xbe\\x4a\\x2c\\x15\\xfa\\xca\\x4a\\x98\\x55\\x46\\x67\\x37\\xa5\\x4e\\x30\\x85\\x94\\x18\\xc9\\xf3\\x32\\x75\\x79\\x3b\\xba\\x11\\x1a\\xe2\\x34\\xe0\\x61\\x98\\x94\\x26\\x90\\x88\\xb3\\xde\\xfa\\xd9\\xea\\x8c\\x45\\xc4\\xdb\\xb2\\x5c\\x2d\\xb0\\x64\\x53\\xf3\\xb5\\x86\\x28\\x4b\\x12\\xca\\xc8\\x95\\x18\\xc1\\xce\\xb5\\x40\\xf0\\x52\\x90\\x57\\x26\\xb9\\x3d\\xc7\\x36\\x7a\\xf6\\xfe\\xe4\\x93\\x3f\\xfb\\xed\\xc6\\xc8\\xf4\\x0b\\x52\\x3c\\x62\\x62\\x80\\xa9\\x14\\xa0\\x07\\x60\\xa2\\xe0\\xbb\\xa1\\x73\\xfe\\xc2\\x8c\\x6e\\x7a\\x09\\x30\\x17\\xc6\\x4b\\x1b\\x82\\x2a\\x91\\xd2\\x14\\xd5\\x6d\\x29\\xba\\x9a\\x94\\x8b\\x07\\xcd\\xe8\\xa9\\x8f\\x9e\\xf4\\x62\\xdc\\x67\\xc6\\x9d\\x7b\\x26\\x22\\x37\\x5d\\xe6\\x64\\xfe\\xdd\\x15\\x64\\x34\\x91\\x91\\x0e\\xf3\\xd7\\x4d\\x26\\x90\\xfe\\x1d\\xb0\\xc3\\x73\\x91\\x57\\xa4\\x7e\\x76\\x86\\x66\\x04\\xaa\\x43\\x72\\x07\\x64\\x51\\x06\\x59\\x46\\x87\\x9a\\x2b\\x5d\\x05\\x48\\x2b\\x75\\xca\\x29\\xe7\\xc2\\xe1\\x81\\x89\\x4c\\xfc\\x68\\xe0\\x32\\x31\\xbe\\x5a\\x53\\x0a\\x2a\\x02\\x68\\xae\\x52\\xcf\\x07\\x6e\\xef\\x4f\\x15\\x94\\x43\\x1c\\x10\\x2e\\x58\\x02\\xb6\\x70\\xe9\\xa1\\x56\\xba\\x67\\x97\\x1c\\x30\\x88\\x3c\\xf1\\x8f\\xdb\\xa7\\xf0\\xdd\\xa7\\x47\\x0c\\x01\\xc5\\x6f\\x46\\xa7\\x9a\\xfa\\x35\\xba\\x2b\\x43\\xc5\\x94\\x9e\\xdd\\x31\\x86\\xf7\\x5f\\x2b\\x88\\x0b\\x33\\x19\\x87\\x14\\x32\\x6d\\x98\\x84\\x4e\\x3d\\xd0\\xe3\\x89\\xf0\\x19\\x96\\x87\\x65\\xd1\\x64\\x00\\x18\\x70\\xb4\\x30\\x6c\\x78\\x10\\xd0\\x61\\x12\\x2f\\x68\\x65\\xe6\\x8f\\xd6\\x40\\x61\\x26\\x7a\\xdc\\x2a\\xf8\\xc8\\x89\\xc9\\x5e\\xbe\\xce\\x2e\\x68\\x42\\x94\\xf1\\x99\\x1a\\x0b\\xa6\\x53\\xda\\x58\\x4e\\x1f\\xf3\\x7e\\x7e\\x7e\\x2c\\xdd\\xac\\x9a\\xae\\x8c\\x00\\xf9\\xe2\\x10\\x72\\x30\\x7d\\xf7\\xf6\\x4a\\xf1\\x41\\x91\\x12\\xde\\x0e\\xca\\xa4\\xcc\\xfe\\xd0\\x43\\x44\\xcc\\x1c\\x73\\x64\\x38\\x14\\x86\\x96\\x42\\x83\\x85\\xca\\x2c\\xf1\\x12\\xa5\\x59\\x51\\xe8\\x66\\x77\\xd4\\xac\\x5f\\x3a\\xb9\\x8b\\x96\\x21\\xc0\\xa3\\x11\\x8e\\xaf\\xdc\\xc3\\x7a\\xdd\\x3b\\xdf\\x68\\x22\\x00\\x32\\x7b\\xca\\x04\\xff\\x1c\\xdd\\xe2\\xcf\\xfc\\x2d\\xad\\x01\\x3f\\xce\\x43\\x01\\x7e\\x03\\xaa\\x58\\x53\\x53\\xc6\\x7f\\x0f\\xa8\\x13\\x08\\xff\\xc8\\x58\\xd5\\xfc\\xdc\\x7b\\x4f\\x34\\x0a\\x49\\x07\\x09\\x87\\x60\\xcc\\x0b\\x44\\x78\\x0e\\xe3\\x48\\xc4\\xa0\\xae\\x27\\x50\\xa3\\x9a\\xe9\\x9c\\xe6\\x4a\\xfb\\xeb\\x05\\x4d\\x01\\x17\\x23\\x10\\xae\\x89\\x85\\x2c\\x4d\\x40\\xa4\\x9c\\x22\\x83\\x02\\x3b\\x7c\\xee\\x10\\xb3\\x40\\x2d\\x47\\xb3\\xb4\\xd1\\x92\\xe5\\x05\\x4e\\x2c\\xd5\\x89\\x9e\\x6c\\x70\\xaa\\x65\\xa6\\x41\\x2c\\xee\\xe3\\x97\\x22\\x95\\x24\\x07\\xa0\\x04\\xb8\\x2d\\x40\\x7c\\xea\\xec\\xbf\\xc5\\xd4\\xea\\xb2\\x9e\\x30\\x44\\x09\\x07\\x39\\x7b\\x39\\xc5\\x48\\x15\\x07\\xf6\\x52\\xe1\\xde\\xf9\\x9d\\x90\\x1d\\x2b\\xb0\\xbe\\x59\\xa4\\xe2\\x65\\xc4\\x92\\x58\\xb1\\x46\\x63\\x02\\x56\\x12\\xa8\\xdc\\x2e\\x8d\\xfd\\xe0\\x37\\x2b\\x5c\\xcc\\xdc\\xe0\\x56\\x29\\x20\\x4d\\xa9\\x6c\\x5c\\x5b\\x61\\x7d\\x94\\x1c\\x7d\\x7c\\xd3\\x99\\x5b\\x1a\\x21\\x5c\\x11\\x2c\\x38\\x29\\xd4\\x72\\xfa\\xee\\x45\\x4a\\x3f\\x18\\xb1\\xe6\\xef\\x8b\\xf2\\xe0\\x5d\\xd6\\xc6\\xc1\\x38\\x3a\\xda\\x46\\x80\\xd6\\xf0\\x22\\x6f\\xbd\\x43\\xc4\\x29\\x71\\x22\\xab\\x83\\x49\\x6d\\x2a\\x05\\x5c\\x26\\x22\\xba\\x54\\xaa\\x8e\\x22\\xeb\\x5d\\x53\\x06\\x6c\\x87\\x34\\x7a\\xb9\\xd1\\x0e\\x88\\x29\\xef\\xf4\\x59\\x91\\x40\\x46\\x8b\\x5e\\x06\\x1a\\x74\\x0c\\x3d\\x1a\\xb9\\x86\\x61\\x11\\xf1\\x93\\x14\\x26\\x94\\x84\\xf3\\x41\\xb6\\x68\\x1a\\xac\\xad\\x50\\xd5\\x15\\x69\\x1d\\xce\\x22\\x04\\x51\\xb5\\xa6\\xf7\\x7c\\xb9\\xad\\x52\\x75\\xc8\\xf5\\x00\\xcd\\x66\\x39\\x62\\xcd\\x05\\xa6\\x31\\xbf\\xc5\\x4b\\xff\\x8a\\x99\\x36\\x7c\\xf8\\x5a\\x7b\\xfc\\xfe\\x09\\x9f\\xc4\\x0b\\x92\\x14\\xa4\\x6e\\x43\\x39\\xb9\\xad\\x87\\xf7\\xb4\\x1f\\x6a\\xef\\xd4\\x9d\\xb8\\x07\\xb2\\x53\\xad\\xce\\x01\\x55\\xdf\\x21\\x46\\x26\\xa3\\xd5\\x87\\xcf\\xa4\\xde\\xf7\\xa9\\xaa\\x07\\x9f\\xa8\\x72\\xda\\x0f\\x70\\xd2\\x03\\xd5\\x7e\\xf4\\x9f\\x12\\x90\\x96\\x62\\x3d\\x2f\\x1c\\x8b\\xc7\\x61\\x3e\\x96\\x91\\xa0\\x3c\\x5c\\x2c\\x8b\\x14\\xd0\\x44\\x49\\x32\\x36\\x41\\x4d\\x9b\\xa0\\x48\\x40\\x8a\\xa6\\x18\\xe3\\x3a\\xa0\\x69\\x1f\\x87\\xd9\\x7a\\x9b\\x9a\\xd7\\x18\\x66\\x41\\xdf\\x0a\\x66\\xf6\\x67\\x51\\x7f\\x2c\\xf6\\x63\\xd6\\x19\\x68\\x5a\\x10\\x3c\\x66\\x64\\x7e\\xb9\\x64\\x41\\xde\\x6e\\x3a\\x8a\\xea\\xb8\\xc5\\x33\\xd8\\x24\\x13\\xfe\\x5d\\x36\\xf2\\x51\\x50\\x44\\x1f\\x19\\x7d\\x61\\x76\\xe5\\x40\\xbb\\x30\\x9d\\x37\\x31\\xd4\\x00\\xa8\\x5b\\x84\\x16\\x29\\x18\\xa9\\x1d\\x80\\x46\\x3f\\xe2\\x58\\x1e\\x72\\xdb\\x3e\\x80\\x20\\x55\\x78\\xa1\\x77\\xca\\xeb\\xe3\\xfb\\x78\\xd0\\x11\\x88\\xf0\\xe3\\x08\\x80\\xf0\\xe7\\xd4\\x6d\\xe0\\x45\\x05\\xbb\\x38\\x2d\\x27\\x5b\\xb9\\xc1\\x22\\xea\\x8b\\xfe\\x38\\x63\\xc1\\xb9\\xd1\\x2e\\x25\\xe8\\xe7\\x16\\x0c\\x13\\xbe\\x52\\x1d\\x47\\x92\\xee\\xa3\\x2b\\xd0\\x21\\x55\\x27\\xc0\\x38\\xfc\\xb9\\xbf\\x6c\\x1e\\x88\\x2a\\x08\\x55\\x77\\x3c\\x6a\\x0f\\x4d\\xa6\\x39\\x4f\\x0b\\xd1\\x58\\xed\\x48\\x63\\x61\\x90\\xcb\\x67\\xa8\\x46\\x9f\\x6b\\x17\\x29\\x94\\xd6\\x01\\xab\\x4b\\xb8\\xae\\x0c\\x6b\\xc6\\xdb\\xd1\\x0c\\x46\\x2b\\xc0\\x43\\x3a\\x28\\x06\\x7e\\x0b\\xff\\xa5\\x76\\x71\\xe3\\xa2\\x82\\x46\\x7e\\x3b\\x3f\\x9d\\x15\\xc8\\xdf\\x6c\\x41\\x09\\xde\\xa9\\xe9\\xd4\\x0c\\xf7\\x4a\\x83\\xdf\\x16\\x6e\\x20\\x04\\x96\\xa2\\xbf\\x52\\x6b\\x30\\x12\\x3a\\xce\\xe0\\x19\\xb7\\xc8\\xb8\\xf0\\xa0\\x77\\xd2\\xdf\\x0d\\xf1\\xba\\x6f\\x0c\\x1d\\x94\\x42\\xb3\\x4e\\x8d\\x1c\\x7f\\x0f\\xb0\\xc3\\x99\\x2c\\xc7\\xb3\\xd4\\xb9\\x2a\\x79\\x34\\x85\\xf7\\x05\\x5e\\x08\\xbe\\xf8\\xc7\\xa0\\x38\\xb0\\x85\\x7a\\x97\\xe6\\x96\\x13\\x40\\xf6\\x86\\xae\\x40\\x31\\xcf\\x71\\x31\\xc1\\x24\\x0b\\x1f\\x8f\\x5b\\x16\\xda\\x8d\\x04\\x31\\x0b\\x95\\x61\\xc8\\xf1\\xe2\\xad\\xab\\xae\\xa4\\x34\\x33\\xc2\\xc0\\x6c\\xcf\\x0b\\x26\\xda\\x3f\\x1c\\x44\\x57\\xc0\\xc1\\x13\\x3f\\x1a\\x23\\xa3\\x81\\xcf\\xb2\\xfe\\x18\\x27\\xfc\\xa3\\x83\\x06\\x84\\x42\\xf8\\x67\\x35\\x8e\\x1a\\x40\\xcb\\x71\\x16\\x14\\xcd\\xb9\\x29\\x12\\xbb\\xf2\\x18\\xb9\\x7d\\x57\\x4f\\xaf\\xa2\\x47\\xe4\\xbe\\xa9\\x1a\\x12\\x98\\x30\\x19\\xcd\\xb8\\x24\\x88\\x40\\xf7\\xe2\\xb5\\x0b\\x7c\\x04\\x34\\xd2\\xf7\\xc0\\x65\\xc5\\x89\\x20\\x92\\x52\\x00\\xfa\\xa3\\x7f\\xbe\\x59\\x24\\xd8\\xca\\xe5\\x00\\x86\\x53\\x20\\xd1\\x58\\x2a\\x85\\xfe\\x77\\x19\\x2a\\xf6\\xac\\xba\\x00\\x0b\\x2d\\x28\\x1a\\x0e\\x23\\x4b\\x7c\\xe9\\x3c\\xc0\\xe9\\x83\\xfb\\xb5\\x38\\x25\\x1a\\x4e\\x1f\\x66\\xe8\\x27\\xeb\\x60\\x82\\x9a\\x25\\x0d\\xed\\x7f\\xc3\\x9f\\xe4\\x2c\\x82\\x11\\x47\\x1a\\x34\\x04\\x65\\x32\\x36\\x29\\x59\\x33\\x78\\xf5\\x30\\x09\\x17\\x4f\\x8a\\xe6\\xac\\x7c\\x85\\xa3\\x64\\x82\\x8c\\xc0\\xd8\\x64\\xca\\xff\\x21\\x4b\\x6e\\x96\\xd5\\xa9\\x52\\x27\\x8d\\x70\\x54\\x04\\x1a\\xb3\\x87\\xbb\\x51\\x85\\x5a\\x2e\\x8f\\x2d\\x84\\xde\\x3d\\x80\\x08\\x0c\\x9b\\x4e\\x2a\\x88\\xa6\\xc3\\xb6\\x44\\xa8\\xe2\\x18\\x90\\x51\\x6e\\x21\\x58\\xb5\\xed\\x4c\\xff\\x9f\\x58\\xd0\\x81\\xe2\\xf8\\xf4\\x03\\xd2\\x32\\xc1\\x2f\\x7f\\xac\\xb9\\x99\\xe0\\x60\\xbd\\x67\\xf2\\xd0\\xd6\\x6f\\x51\\xb9\\x90\\x08\\xff\\x84\\x42\\xac\\x40\\x51\\xd1\\xf2\\x80\\x0f\\x5b\\xc5\\xbe\\xb9\\xd6\\x02\\x75\\x98\\xd4\\x20\\x58\\x99\\xc9\\xc0\\x5e\\x19\\x2a\\xcd\\xfa\\x80\\x45\\x11\\x06\\x8d\\xd0\\x85\\x4b\\xf4\\x6a\\xa9\\x21\\xef\\x30\\xc5\\x59\\x51\\x84\\xf5\\xa3\\x49\\x37\\x2f\\xde\\xa2\\x86\\x06\\xc2\\x3b\\x83\\xee\\x0e\\xc1\\x0e\\x84\\xbe\\xe0\\x1e\\xc4\\xe2\\xcd\\xab\\x64\\x1c\\x55\\xeb\\x8b\\x20\\x78\\x71\\x79\\x24\\x2e\\xc0\\x61\\xb4\\x92\\xf7\\xb1\\x07\\x0c\\xa1\\xc3\\xdd\\x04\\x6b\\xa2\\x9a\\xa4\\x4b\\xa5\\x54\\xd3\\x7a\\xc9\\x0e\\x0b\\x76\\x1c\\x92\\x07\\x09\\x3d\\x2f\\xc5\\x5e\\x59\\xcc\\xe7\\x73\\x95\\xdf\\x94\\xc8\\x09\\xd6\\x88\\x97\\xc4\\x60\\xdc\\x5a\\x40\\xf9\\xfb\\x89\\xca\\x72\\xc1\\x7d\\xf6\\x9e\\x00\\x13\\xf9\\xa6\\x71\\x7f\\x63\\xcf\\x06\\x69\\x9c\\x1e\\xe1\\x31\\x2d\\x42\\xf8\\x6e\\xa1\\x92\\x91\\x12\\x83\\xfa\\x3e\\xc1\\x3c\\x6c\\x3e\\x2f\\x3a\\x81\\x22\\x99\\x84\\xf3\\xbc\\x21\\x8f\\x65\\x8e\\x8a\\x64\\x23\\xdf\\xcd\\x55\\x0e\\xf5\\x05\\x3f\\x6f\\x50\\xec\\x0a\\xbd\\xa4\\x41\\x29\\x92\\xdc\\xc0\\x43\\x45\\x45\\xf5\\x38\\x88\\x70\\xc0\\xbf\\x07\\x03\\xc6\\x56\\xba\\x48\\xda\\xce\\x6c\\x17\\x19\\x1c\\x20\\x38\\x20\\xf1\\x91\\xe3\\x8e\\x9e\\xd4\\x49\\x84\\x10\\xfd\\xa9\\x03\\x41\\xec\\x2e\\xed\\x0c\\x48\\xdb\\xe7\\xe7\\x75\\x73\\xeb\\xd0\\x83\\x82\\x7c\\x83\\x9d\\x23\\x6c\\xe2\\x59\\xdd\\xab\\xa8\\x75\\x92\\xba\\xd1\\xff\\xfd\\x96\\x69\\x58\\x7f\\xa7\\x21\\x5b\\x80\\xa6\\xb2\\xa4\\xd6\\x1f\\xd4\\x7f\\xca\\x70\\x3a\\xd3\\x50\\x02\\x32\\xde\\x00\\x8a\\xdb\\x01\\x9b\\x98\\xf7\\x20\\xb8\\x44\\xba\\x7b\\xcd\\xee\\x3b\\xc6\\xa0\\x5e\\x6b\\x14\\x77\\xc3\\xd5\\x91\\x98\\x74\\x24\\xaa\\x05\\x5e\\x17\\xb8\\x60\\x57\\xbb\\xaa\\x81\\xbe\\x3b\\x28\\xd8\\xe7\\x00\\x7a\\x82\\xdb\\xb7\\xc1\\xb2\\x41\\x9b\\xb4\\x02\\x06\\x07\\x82\\x9f\\x99\\x7f\\xe3\\x5a\\x4d\\xa0\\x35\\x12\\x11\\x9f\\xef\\xf3\\x89\\x73\\xdf\\xcd\\xd9\\x83\\xc3\\x3c\\x88\\xce\\x53\\x86\\xba\\xa5\\x4c\\x84\\xbb\\xfd\\x6c\\xb7\\x01\\x06\\x66\\x40\\xdf\\x18\\x5d\\xb3\\x1f\\xd9\\xe0\\x25\\xfa\\x89\\x53\\x9b\\x95\\x5c\\x62\\x5c\\x0d\\xf1\\x69\\x81\\x38\\x19\\x2d\\x33\\x16\\x33\\xa1\\x23\\xf3\\x24\\xd1\\xbd\\x12\\x26\\x9e\\x73\\x6c\\x17\\x1c\\xca\\x04\\x23\\x5c\\x7e\\xee\\xe2\\xfc\\x65\\xcc\\xd1\\x0e\\xe1\\xe6\\x41\\xf1\\xf7\\x8f\\xb1\\x1f\\x44\\x05\\xdb\\x90\\x15\\x1e\\x52\\x48\\x5e\\x52\\x57\\xd4\\xd7\\xc1\\x03\\xe5\\x99\\x12\\x7d\\xf8\\x52\\x33\\xf0\\xb1\\x8e\\x41\\xda\\xc8\\xf2\\xd0\\x30\\x11\\x3c\\x22\\xe8\\x0e\\x35\\x2d\\x70\\xa7\\x5e\\xca\\xa2\\x58\\x01\\xa2\\x34\\x12\\xb4\\xfc\\x07\\xa5\\x8a\\x62\\xac\\x9d\\x73\\xa1\\x46\\x27\\x06\\x8e\\x70\\x13\\x80\\xcb\\x07\\x9b\\xde\\x36\\xd1\\xbd\\xee\\xb4\\xe9\\x90\\xa9\\x80\\x34\\x27\\xe3\\x4c\\xa6\\x0b\\xd2\\xa6\\x37\\x76\\x33\\xb7\\xa0\\x9c\\xd9\\x48\\x99\\xe6\\xf2\\xa6\\xac\\xbd\\x36\\x45\\xdc\\x1f\\xec\\x47\\xa7\\xf5\\x7c\\x34\\xa8\\x73\\x59\\xc2\\x14\\xdb\\xce\\xb8\\xc5\\xd0\\x71\\x52\\xe1\\x00\\x0e\\x53\\x98\\x94\\x02\\x01\\x15\\xcb\\x02\\x47\\x28\\xc2\\x27\\x50\\x21\\x2e\\x25\\xfd\\x69\\xac\\x25\\x4a\\xdb\\xed\\xc5\\x71\\xf4\\x5a\\xf0\\xbe\\xc6\\xe3\\xe0\\x0d\\x90\\x7f\\x16\\x6c\\x45\\x4a\\x9f\\x2a\\x7b\\x6d\\xd8\\x44\\x2c\\x39\\x49\\xdd\\xb2\\xdc\\x25\\x1e\\xba\\x1f\\xa7\\xb1\\xe1\\xb0\\x88\\x17\\x65\\x88\\x27\\x32\\x3d\\x8b\\x74\\x93\\x75\\x2e\\x40\\x62\\xdf\\x03\\x6c\\x0b\\x05\\x64\\x87\\x04\\x88\\xc1\\xd2\\x48\\x4b\\x54\\xea\\x9a\\x90\\x05\\xe2\\xc8\\xa3\\x6b\\xc5\\xa4\\x50\\x44\\x59\\x41\\xd8\\x04\\xef\\x52\\x02\\x1c\\xf8\\xd5\\x18\\x40\\x88\\xe3\\x10\\x2e\\xbc\\xe0\\xf8\\x56\\xa4\\x28\\x55\\x1a\\xee\\xf9\\x91\\xc9\\xf1\\x2d\\x9e\\xbc\\xde\\x65\\x03\\x3c\\xa5\\x8f\\x65\\xd3\\x53\\x2f\\x7d\\x19\\xbd\\x44\\x86\\xd8\\xa4\\x26\\x65\\x1e\\x49\\xdd\\xc3\\x8c\\xac\\xda\\x6a\\x80\\xd2\\x65\\x86\\x96\\xc2\\x00\\x8d\\x06\\xc1\\x6d\\xfb\\x4b\\x27\\xbb\\x2f\\xa6\\xd9\\x67\\xa0\\xa6\\x08\\x30\\x14\\xdb\\x68\\x70\\x6d\\x85\\xa6\\x63\\x04\\xe7\\x81\\x44\\x87\\x2e\\x9c\\x29\\x90\\x4b\\xb8\\x02\\xcb\\xbd\\x0d\\x38\\xc3\\x47\\x01\\xf6\\xc6\\x8b\\x74\\x47\\xb0\\x3b\\x02\\x67\\x3a\\x46\\x9c\\x24\\x88\\x12\\x48\\xf9\\x92\\xd8\\x01\\xf1\\x3d\\x8e\\x7d\\xf1\\x25\\xb0\\x04\\x96\\x93\\x35\\x32\\x7f\\x55\\xff\\xa2\\x36\\x72\\x2c\\x0d\\xfc\\x9e\\xbb\\x55\\x6e\\x96\\xed\\x9f\\x25\\x2c\\x45\\x53\\xf9\\x46\\x97\\xb7\\xf1\\x01\\xf6\\xe6\\xcd\\x25\\xda\\xcb\\x5f\\x86\\x1c\\xf3\\xc0\\x65\\xd0\\x73\\xd4\\x2e\\xab\\x93\\x54\\x64\\x43\\xb3\\x65\\xc6\\x99\\x1d\\x38\\x17\\x55\\x93\\x80\\x87\\x80\\x63\\xa0\\x9a\\xc4\\x76\\x1b\\xfd\\xe8\\xa0\\xc7\\x4a\\x6e\\x3a\\x08\\xe9\\x32\\xa2\\x09\\x78\\x07\\x94\\xfc\\x8c\\x37\\xb8\\xcf\\x48\\xe8\\x6d\\x24\\xb3\\x77\\x26\\x0a\\x1a\\x55\\x5a\\x0a\\x32\\xab\\x17\\x60\\x63\\xd8\\x1b\\x98\\x35\\x6b\\x8d\\x07\\xa4\\xde\\xb6\\x17\\x16\\xf2\\xa2\\x5c\\xae\\xc5\\xee\\xcd\\x6a\\x26\\xf9\\x96\\xa6\\xdd\\xfe\\x0e\\x80\\xbd\\x12\\x97\\x7b\\x87\\x84\\xef\\x14\\x19\\xae\\xf0\\x80\\x94\\x0d\\x27\\x99\\x3e\\xd6\\x7c\\xd2\\x9c\\x16\\x4d\\x90\\x7e\\x67\\x67\\xa2\\x96\\x30\\xf3\\x2a\\x7b\\x88\\x35\\x5b\\x5a\\x4a\\xf6\\x6d\\x65\\xc1\\xa7\\x89\\x65\\x73\\xc0\\x75\\x59\\xe9\\xf3\\xdc\\x78\\x1b\\x4a\\x07\\x5c\\xdb\\xc1\\x28\\xa5\\x31\\xa3\\xa9\\x4f\\x13\\x51\\xb5\\x97\\xf3\\x6c\\x21\\x2b\\xa7\\xee\\x5a\\xc9\\x7d\\xb5\\x8d\\x8c\\x41\\x7f\\x52\\x66\\x32\\x41\\x97\\x86\\x30\\x16\\x87\\xb2\\xb1\\x84\\x1c\\x68\\x43\\x18\\x09\\x89\\x54\\x80\\x51\\x72\\x2b\\x15\\x4e\\x09\\x36\\x76\\x7b\\xc3\\xeb\\x57\\x3a\\xe8\\x8c\\x16\\x6b\\x0b\\xe7\\x10\\x5f\\x1c\\x26\\x80\\x05\\x12\\xf3\\x70\\x99\\xd6\\xb8\\xc7\\xaf\\xe8\\x5e\\xfc\\xac\\x98\\xe3\\xa0\\x49\\xfb\\xd3\\xf3\\x4b\\xe6\\x0f\\x88\\x73\\xe5\\xee\\x0c\\xf9\\x7d\\x4d\\xb9\\x54\\x90\\xea\\xbc\\x58\\x85\\xf9\\x42\\x20\\xe4\\x1c\\x61\\x3f\\xbc\\x45\\x9a\\x62\\x81\\x1c\\x9e\\x9c\\x34\\x34\\xff\\xb9\\x21\\x94\\xb6\\x2f\\x6a\\x89\\x90\\xc3\\x3a\\x4c\\x2a\\xc5\\xe1\\xc9\\x27\\xad\\xcf\\x64\\x92\\x0f\\xfc\\x8b\\x83\\xad\\x1d\\xb8\\x15\\x11\\x38\\x2a\\x48\\x77\\xe4\\x64\\xe6\\x9a\\xc7\\x9f\\x93\\x36\\x9d\\xf0\\x9a\\x04\\x03\\x22\\x9f\\x24\\x23\\x20\\x8c\\x28\\x9f\\xde\\xfd\\x69\\xb2\\x85\\x61\\x08\\x7c\\x16\\xc8\\xe6\\x95\\xa4\\x08\\xd7\\x05\\x69\\x71\\x52\\x90\\xe8\\xa9\\x7d\\x19\\x68\\x6d\\xd2\\x0a\\x2e\\x61\\x84\\x2b\\xef\\x61\\x8b\\xfc\\xce\\x93\\xf3\\x0e\\x74\\x8b\\xa8\\x4d\\x92\\x5d\\xae\\xa7\\x52\\xd8\\xa7\\xa4\\x23\\xb6\\x02\\x29\\x49\\xdb\\x61\\x9c\\x50\\x21\\x11\\x16\\x6a\\x87\\xc8\\xad\\x83\\x0f\\x92\\x48\\x97\\xd6\\xa1\\x7c\\x24\\xb0\\x2c\\xb4\\xc4\\xf2\\x4c\\x4a\\xe9\\x1a\\x2b\\x4e\\x89\\x79\\x4a\\x4a\\x94\\x84\\x69\\xa7\\xc4\\xd4\\xd0\\xdc\\x80\\x7a\\x47\\x80\\xca\\x61\\x38\\x1f\\x97\\x0b\\x35\\x28\\x50\\xde\\x12\\x04\\x08\\xd9\\x8a\\x2d\\x80\\x64\\x6b\\x5c\\x64\\x0b\\x19\\x33\\xbd\\x05\\x9f\\x4c\\x02\\x15\\xb2\\xae\\x8a\\x79\\xcc\\xae\\xb0\\x05\\x07\\x47\\x3f\\x6b\\x7a\\x88\\xb2\\x90\\x08\\xd0\\x8e\\xe6\\x55\\xd7\\x13\\x2f\\x51\\xf5\\xf0\\x75\\x18\\x00\\x51\\x95\\xd6\\xe6\\xdb\\x79\\x43\\x78\\x38\\x0a\\x6f\\x1a\\xa6\\xec\\x1e\\xa1\\x95\\xf7\\xb1\\xf2\\xb7\\xc9\\x89\\xe9\\xf5\\xa4\\x16\\x01\\x3d\\x3b\\xaf\\xf1\\xf9\\x0c\\x26\\x8f\\x24\\xec\\x13\\x31\\x78\\x67\\x50\\xd5\\xe8\\x95\\x21\\x98\\x90\\x83\\x22\\x89\\xe4\\x18\\xa5\\xc3\\x29\\x0f\\xd1\\xca\\x18\\x28\\xac\\x2c\\xb9\\x53\\xb2\\xcf\\x4f\\x0f\\xe3\\xb5\\x6e\\x4f\\x96\\xc2\\x00\\xc3\\x6a\\xd0\\x40\\x20\\x10\\xd8\\x1c\\xa6\\x60\\x8a\\xc4\\xf4\\x89\\x90\\x87\\x16\\x54\\x43\\xdd\\x08\\x21\\xf9\\x1b\\x21\\xec\\xb4\\x54\\x19\\x8b\\x26\\xfd\\xce\\x95\\x99\\x44\\xd4\\x31\\x6a\\x64\\xf5\\x52\\xce\\x1e\\x89\\x2d\\x51\\x46\\x36\\x99\\x9c\\x02\\x52\\xb8\\x97\\x5c\\x5c\\x4a\\xdb\\xe0\\x08\\xa0\\xb7\\x96\\x1f\\x15\\x26\\x14\\x12\\xc9\\x70\\x0f\\x36\\x79\\xc7\\x11\\x23\\x9a\\x1d\\x01\\xb1\\xf2\\xea\\x6c\\x9e\\xd4\\xbe\\x74\\x16\\x98\\x2e\\xb6\\xda\\x25\\xad\\x3c\\x5f\\xb3\\x8e\\xa6\\x69\\xf0\\xd4\\x9f\\x6d\\x40\\xfa\\x49\\x07\\xbe\\x61\\xa7\\xb1\\xea\\xcf\\x87\\xf2\\xca\\xe7\\x72\\x01\\xb0\\xe8\\x61\\x99\\x4d\\x93\\x17\\x08\\x3d\\xde\\x61\\x14\\x9e\\xa4\\x46\\xde\\x31\\x89\\xbc\\xb1\\x7b\\x57\\x7a\\xdc\\xaf\\x83\\x42\\x69\\x81\\x60\\x57\\x9f\\x46\\x2c\\xad\\x71\\x05\\xa4\\x08\\xe2\\xcc\\x6d\\x90\\x43\\x13\\x38\\xb3\\x1a\\xee\\x1a\\x31\\x33\\x3f\\x95\\x54\\xe3\\xb2\\xbb\\x3b\\x2b\\xd6\\x02\\xf8\\x62\\xe0\\x66\\x49\\x28\\xcd\\x12\\x2d\\x42\\x01\\x60\\xc6\\xf1\\x90\\x61\\x2b\\x1e\\xb7\\x83\\xaf\\x18\\x89\\x20\\xe9\\x20\\xe5\\x8e\\x38\\x18\\x83\\x5a\\x0d\\xb0\\xda\\xed\\x52\\xa8\\xa0\\x4e\\x92\\xb8\\x8c\\x92\\x6a\\x72\\x05\\x63\\x2b\\x1d\\xf8\\xc0\\x41\\xaa\\x61\\x9a\\x53\\xac\\x92\\x19\\x82\\x35\\xd1\\x73\\x3d\\xc8\\x80\\xf5\\xba\\xb1\\x22\\x5e\\xa5\\xa8\\x33\\x35\\x88\\x28\\x2b\\x90\\x44\\xa1\\x58\\x42\\x3d\\xa0\\xa4\\x55\\xa1\\xf4\\xf5\\xd4\\xb4\\xa8\\xf3\\x89\\x5d\\xf2\\x08\\x8b\\x70\\x81\\x34\\x24\\x09\\xa5\\xdb\\xce\\x1d\\x37\\xe1\\x28\\x65\\xec\\x06\\x10\\x76\\xee\\x56\\x5a\\x55\\x32\\x38\\xea\\xe5\\x75\\xab\\x9c\\x2c\\x4f\\x30\\x09\\xd9\\x77\\xaa\\x86\\xeb\\x18\\x2a\\xe5\\x4f\\x35\\x29\\x89\\x6f\\xcc\\x49\\x0a\\xbe\\x76\\x18\\x62\\x64\\xe8\\x28\\x28\\xcd\\x4e\\x2a\\xc0\\xc5\\x5c\\xf1\\xb0\\x0c\\xcc\\x28\\xd2\\x54\\x2c\\x73\\x61\\xd4\\x4e\\x66\\x15\\x0b\\x99\\x83\\x06\\x70\\xa9\\x42\\x19\\x84\\x44\\xbb\\x85\\x98\\x31\\x4b\\x81\\x7f\\x44\\x54\\x39\\x4a\\x07\\x10\\x2f\\xb8\\xe2\\x20\\x12\\x8e\\x46\\xbd\\x79\\xd1\\xae\\xb7\\x0d\\xfc\\xf3\\x90\\xaf\\x93\\xbe\\x02\\x50\\x2f\\xfb\\x13\\xa6\\x38\\x52\\x1a\\x0c\\x14\\x33\\xd7\\x61\\x92\\x5a\\xcf\\xf9\\xa3\\x31\\x77\\x31\\x44\\xf2\\x29\\xe5\\x61\\x40\\x90\\x86\\x78\\xab\\xf2\\x8a\\x2f\\xba\\x93\\x9f\\x41\\x25\\x2c\\x92\\x32\\x4f\\x49\\xd7\\x3c\\x96\\x6b\\x13\\x20\\x11\\xd9\\x59\\x78\\xad\\x93\\xb6\\x1d\\xec\\x99\\x00\\x1e\\x13\\x7c\\x62\\x15\\x2c\\xcd\\x0d\\x54\\x80\\x48\\x44\\x17\\x54\\x14\\xcc\\x82\\x59\\xb1\\xba\\xeb\\xad\\x81\\x82\\x5d\\x61\\x07\\x9d\\x24\\xf8\\xf4\\xbe\\xe4\\x2b\\xb9\\xe2\\xdc\\x04\\x96\\x2e\\x11\\x66\\x20\\x46\\xeb\\x62\\x37\\x10\\xf2\\x9d\\xe0\\x74\\x77\\xc4\\x7b\\x86\\x17\\x99\\x21\\xb4\\x55\\xba\\x65\\x77\\x39\\x21\\x32\\xd8\\xf9\\x37\\x72\\x82\\x24\\xf5\\xe5\\x46\\xec\\x3f\\x63\\x5c\\x7d\\xb1\\x23\\xa7\\x0f\\x2b\\xca\\x94\\x43\\x14\\xa7\\xf9\\x79\\xf5\\x68\\x52\\x1f\\xdc\\xd4\\x72\\x02\\x03\\x90\\xc6\\xfc\\x6f\\x43\\xe0\\x6c\\x2a\\x82\\xca\\x36\\x83\\xbe\\xaa\\x43\\x7d\\x9b\\x90\\x1b\\x09\\x58\\xd2\\x4b\\x4d\\xb6\\x86\\x09\\x08\\x99\\xa7\\x95\\x42\\x38\\x90\\x40\\x6f\\x82\\xf0\\x92\\x5b\\x2e\\xb9\\xfe\\x98\\x12\\x4a\\xc3\\xc4\\x18\\x2a\\x68\\x18\\xd8\\xdf\\xb5\\x12\\x9e\\x37\\xfa\\xce\\xf9\\xf5\\x8a\\x6e\\x12\\x7d\\x84\\x63\\xdd\\x2a\\x27\\xd7\\x76\\x77\\xdf\\xfa\\x10\\xd3\\x21\\x6b\\x62\\x4f\\x62\\x2c\\x16\\x4f\\x43\\xd0\\xeb\\x3a\\x17\\xa2\\x37\\x11\\x7d\\x3c\\x49\\x09\\x63\\xf1\\x85\\x67\\xb9\\x2b\\x02\\xac\\xe8\\x58\\x09\\x3d\\x0f\\x9e\\x16\\x85\\x51\\xd0\\xb8\\x3c\\x4c\\x45\\xa2\\x49\\x64\\xba\\x7e\\x10\\x02\\x8e\\x14\\xb2\\x01\\x24\\x8d\\xe2\\x04\\x78\\xc8\\x90\\x7a\\x06\\x28\\x9e\\x1f\\x8e\\x87\\x15\\xfe\\x5d\\xec\\x29\\x7f\\xd5\\xd6\\x0a\\x24\\xcb\\xb5\\x02\\x51\\x1f\\xbf\\x49\\x97\\x0b\\xdc\\x3b\\x9d\\x42\\x16\\x55\\x4f\\x4c\\x71\\xd4\\x98\\xac\\x84\\x95\\xf2\\x19\\x98\\x76\\x14\\xc4\\xd5\\x4e\\x1e\\x4b\\x1a\\xe1\\xef\\x3c\\xae\\xe8\\xd0\\x5e\\x4f\\x88\\xdc\\x67\\xf1\\x31\\x91\\x26\\x5b\\xf1\\xbb\\x31\\xe8\\x5c\\x29\\x67\\xa0\\xaf\\x73\\xb2\\x52\\xa8\\x7a\\xe1\\xd8\\x60\\x94\\xa9\\x9c\\xbe\\x8c\\xda\\x5c\\x1c\\xb4\\x91\\xe0\\x20\\x70\\xec\\x4e\\x9c\\x48\\x7b\\x50\\x62\\x99\\xdf\\xe9\\x84\\x53\\x45\\x96\\x86\\x63\\xe3\\x90\\x32\\x54\\xda\\xbd\\xe2\\x6a\\x6e\\x82\\xaf\\xda\\xa3\\x26\\x6b\\x99\\x07\\x16\\xcc\\x45\\x33\\x3c\\xf2\\xf6\\x12\\xc2\\x36\\xfd\\x6c\\x96\\x86\\xd9\\x02\\x0c\\x09\\x19\\x46\\xfa\\x14\\x2d\\x92\\x30\\x05\\x3e\\x21\\x0b\\xdb\\xa7\\xe0\\x9d\\xba\\x4f\\x06\\x1d\\xcb\\xc1\\xba\\x09\\x2e\\x27\\xc0\\x83\\x97\\xc9\\xc1\\xc0\\x79\\xb1\\x77\\xdc\\x0a\\xdc\\x8d\\x69\\x7d\\x3b\\x70\\x68\\x35\\xc9\\xd5\\x0a\\xe0\\x98\\xa2\\xf8\\x10\\x72\\x94\\x56\\xe0\\x6f\\x31\\x43\\x5d\\x12\\x9e\\x08\\x21\\xb0\\x75\\x91\\x68\\xdb\\xa1\\x31\\x59\\x46\\xcd\\x68\\x0d\\x05\\xe3\\xfd\\xf4\\x5b\\xa5\\xf5\\x9d\\x4c\\x39\\xe1\\x92\\xa0\\xd6\\xcb\\xcf\\xcc\\x0c\\x43\\x4d\\x26\\x1b\\x27\\xa0\\x57\\x1e\\x25\\x55\\x90\\x07\\x2c\\x32\\x01\\xb7\\x00\\x99\\x30\\x6c\\x79\\xef\\x2e\\x10\\x82\\x5c\\x92\\xfd\\x64\\x97\\x9a\\x60\\x05\\x82\\x59\\xde\\x2c\\x13\\xbc\\x7e\\x9f\\x27\\x2c\\xe0\\xdc\\x0e\\x60\\xc9\\x1c\\x9e\\x12\\xbe\\xa7\\x2e\\xf1\\x85\\xc4\\x49\\x21\\x05\\x5e\\x45\\xc7\\x61\\x34\\xeb\\xd6\\x10\\x23\\xe2\\x60\\xd7\\x10\\x81\\x95\\x05\\x2e\\x8a\\x18\\x83\\x92\\xb5\\x59\\x47\\xc2\\x8d\\x2c\\xbc\\x23\\xd2\\x7d\\x50\\x0b\\x7d\\xe1\\xcf\\xdb\\xd1\\x65\\xd5\\x7f\\x14\\x39\\x65\\xd0\\x91\\x8b\\xb1\\x8d\\xad\\x11\\xc8\\x04\\xca\\x04\\x09\\x6d\\x7a\\xf3\\x60\\x47\\x8b\\x69\\x92\\x66\\xf0\\xbf\\xd4\\x16\\xfd\\xe1\\x4d\\x76\\x12\\x28\\x99\\xfe\\x21\\x5c\\x5a\\x63\\xc0\\x4f\\xda\\x0b\\x1b\\xdf\\x2d\\x73\\x94\\xc1\\x01\\xc3\\x3d\\xcd\\xfb\\x58\\x8b\\x9c\\x8c\\x2d\\x5a\\x52\\x10\\xb0\\x54\\x24\\x25\\x2f\\x94\\x6d\\x59\\x80\\x9f\\xe1\\xd4\\x3f\\x24\\x69\\x7a\\x8b\\x84\\x0c\\xd1\\x20\\xdb\\x26\\x03\\x12\\x2d\\x60\\x22\\x1e\\x9f\\x44\\x6d\\xc7\\xfc\\xb7\\x33\\x63\\xc9\\x6e\\x51\\x0d\\x2c\\xa0\\x03\\x4b\\x24\\x47\\x78\\xb1\\xd8\\x0a\\x41\\x12\\x18\\x24\\xcd\\xb0\\xe2\\xa4\\x7a\\x38\\x56\\x8a\\x8f\\xaa\\x4e\\x81\\x51\\x99\\x4a\\xca\\xa1\\x7e\\x31\\x6a\\xdc\\x94\\xe9\\x76\\x8e\\x8b\\xa3\\x7b\\xd0\\xaa\\x3f\\x50\\x52\\x4b\\xef\\xa6\\x1c\\x14\\xb2\\xf2\\x81\\x6c\\x16\\x33\\x27\\xdf\\xbb\\x30\\xbf\\xd3\\xb4\\xc5\\xba\\x76\\x22\\xe0\\x88\\xa3\\xc1\\xa3\\xeb\\xab\\x38\\xbf\\x11\\x49\\xee\\x7d\\x1f\\x45\\x08\\x1d\\x87\\xe2\\x5d\\x84\\x1f\\x4c\\x8f\\xad\\x60\\xa3\\xbf\\xef\\x8a\\x2e\\x1d\\xbe\\x11\\x1e\\xd6\\x89\\xe7\\xd1\\x7f\\xcd\\xbb\\x7f\\x45\\xb3\\x76\\x2f\\x9e\\x34\\x0c\\xd7\\xb1\\x9d\\xf0\\x30\\xec\\xee\\x70\\xa0\\xd1\\xdd\\xde\\xc6\\x84\\x47\\x76\\x2f\\x2c\\xf4\\xd8\\xa8\\xec\\x2b\\x44\\xb1\\x02\\x00\\x9f\\x64\\x8e\\x63\\xc7\\x06\\x3f\\x27\\x72\\x4b\\x51\\x2a\\x75\\x85\\xc3\\x84\\x09\\xe7\\x60\\xa3\\xb8\\x82\\x4f\\xa5\\x6c\\x09\\x41\\x58\\x5c\\xc9\\xf1\\x4a\\x6b\\xf3\\x7d\\x21\\x02\\xea\\x7d\\x05\\x31\\xb5\\x0d\\x92\\x5e\\xc3\\x8d\\xae\\xab\\xdb\\x3f\\x56\\xdb\\x14\\x27\\x46\\xa5\\x84\\x4d\\xd1\\x04\\x93\\x96\\x41\\x18\\x49\\x52\\x42\\x31\\xd5\\xce\\x9c\\xbb\\x40\\xdd\\x39\\x61\\x34\\xe8\\x9d\\x06\\xcc\\xba\\x42\\xe6\\x47\\x24\\x67\\xb0\\xce\\x12\\x37\\x5b\\xfb\\x22\\x52\\xd5\\x48\\xdf\\x95\\x38\\x15\\x63\\x15\\x1f\\x24\\x48\\x16\\x11\\x7c\\x3c\\x9a\\x1d\\xfd\\x66\\x9e\\xfe\\x5f\\xe7\\xcb\\x79\\xb0\\xb6\\x6e\\x72\\xd1\\x56\\x6d\\x3d\\x27\\xe0\\x60\\xfe\\x1e\\xb4\\xf7\\x39\\x30\\xbe\\x63\\x7a\\xf9\\xa2\\xba\\x53\\x48\\xdd\\xd3\\x6c\\xba\\xaa\\xea\\x3a\\x31\\x75\\x2c\\xc5\\x26\\x29\\xac\\x68\\x77\\x6f\\x0d\\x0f\\x10\\xd1\\x2b\\x58\\x48\\x7d\\xc5\\xdc\\x48\\x63\\xc8\\x80\\xdb\\xb7\\xef\\x46\\x12\\x65\\x01\\x7e\\x1b\\x3e\\xcc\\x18\\x11\\xaa\\x3f\\x33\\x0a\\x14\\x54\\xe0\\x7b\\x6a\\xe9\\x0a\\xba\\xe5\\x45\\x69\\x5a\\x03\\xdc\\x38\\xa9\\x6e\\x60\\x62\\x96\\x68\\xf6\\x3b\\x0c\\x59\\x7b\\xa0\\x66\\xbe\\xcc\\x1f\\xbc\\xd8\\xdb\\xf3\\x8c\\xb2\\x27\\x08\\xc0\\x00\\x34\\x3a\\xa7\\x7a\\xa7\\x33\\x09\\x8b\\xcf\\x09\\x62\\x09\\x7d\\x06\\xf6\\x5c\\x4a\\xfb\\xf0\\xd7\\xd2\\x78\\x80\\xab\\x74\\x88\\xe8\\x8e\\x40\\x13\\xa5\\x4b\\x22\\x6e\\xb2\\xe6\\x50\\xc3\\xc3\\x04\\xb1\\x15\\xd7\\x6c\\xbe\\x6c\\x19\\xed\\xb6\\xc7\\xa7\\x81\\x7a\\xd7\\xad\\xb5\\x00\\x6e\\x5c\\x1c\\xa1\\x31\\xa8\\xc0\\x9b\\x85\\xd4\\x6a\\x2a\\x72\\x97\\x79\\x4b\\x98\\xc7\\xd1\\x14\\xb8\\x6b\\x90\\x88\\x3b\\x51\\xce\\xb2\\x61\\xd4\\x37\\x90\\x01\\x00\\x00\\xff\\xff\\xa2\\x34\\x0d\\x45\\x27\\x57\\x00\\x00\")\n\nfunc fontsInconsolataRegularWebfontEotBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataRegularWebfontEot,\n\t\t\"fonts/inconsolata-regular-webfont.eot\",\n\t)\n}\n\nfunc fontsInconsolataRegularWebfontEot() (*asset, error) {\n\tbytes, err := fontsInconsolataRegularWebfontEotBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-regular-webfont.eot\", size: 22311, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataRegularWebfontSvg = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xbd\\x79\\x9f\\x26\\x47\\x6e\\x26\\xf6\\xff\\x7c\\x8a\\xd8\\xa6\\x3d\\x3e\\xa3\\x3a\\x00\\xc4\\xb9\\x4d\\x8e\\xec\\xd5\\xc8\\xf2\\xda\\x5b\\xbb\\xb2\\xa5\\xd5\\x7a\\x7d\\x37\\xd9\\xdd\\x4c\\xda\\x39\\xe4\\x24\\x99\\xca\\xa1\\xca\\xc7\\x67\\xdf\\x1f\\x1e\\x20\\xf2\\xad\\x6e\\xd6\\x5b\\x9a\\x3e\\x78\\x68\\xd4\\x7f\\x90\\xf5\\x76\\xd5\\x9b\\x99\\x91\\x71\\x00\\x0f\\x80\\x07\\xc0\\xa7\\x7f\\xf6\\xfd\\xef\\xd6\\x70\\xbc\\xfc\\xf6\\xbb\\xaf\\xbe\\xf9\\xfa\\xb3\\x27\\x74\\x93\\x9e\\x84\\xef\\xf6\\xe7\\x5f\\xbf\\x78\\xbe\\x7e\\xf3\\xf5\\xcb\\xcf\\x9e\\x7c\\xfd\\xcd\\x93\\x3f\\xfb\\xcd\\xaf\\x3e\\xfd\\x67\\xbf\\xfd\\x37\\x7f\\xfe\\x37\\xff\\xfe\\xaf\\xfe\\x22\\x7c\\x77\\x7c\\x19\\xfe\\xea\\xdf\\xfe\\x8b\\x7f\\xf5\\x2f\\xff\\x3c\\x3c\\x89\\x4f\\x9f\\xfe\\x3b\\xf9\\xf3\\xa7\\x4f\\x7f\\xfb\\x37\\xbf\\x0d\\x7f\\xfd\\xb7\\x7f\\x19\\xe8\\x86\\x9e\\x3e\\xfd\\x8b\\x7f\\xfd\\x24\\x3c\\x59\\xf6\\xfd\\xf7\\xff\\xfc\\xe9\\xd3\\x3f\\xfc\\xe1\\x0f\\x37\\x7f\\x90\\x9b\\x6f\\xbe\\xfd\\xf2\\xe9\\x5f\\x7e\\xfb\\xfc\\xf7\\xcb\\x57\\x5f\\x7c\\xf7\\xf4\\xaf\\xff\\xf6\\x2f\\x9f\\xea\\x17\\x7f\\xfb\\x37\\xbf\\x7d\\xfa\\xdd\\xf1\\x25\\xd1\\xcd\\x8b\\xfd\\xc5\\x93\\xf0\\x9b\\x5f\\x7d\\xaa\\xb7\\xfe\\xfe\\x77\\xeb\\xd7\\xdf\\x7d\\xf6\\xc0\\xf5\\x9c\\x52\\xd2\\xef\\x3f\\xf9\\xcd\\xaf\\x3e\\xfd\\xdd\\xcb\\xfd\\xf9\\x8b\\xe7\\xfb\\xf3\\xdf\\x7c\\xfa\\xf4\\xfc\\xf8\\xab\\x4f\\x5f\\xbc\\x7c\\xf5\\xdd\\x6f\\x7e\\xf5\\xe9\\xab\\x6f\\xbe\\xde\\xc3\\x57\\x2f\\x3e\\x7b\\xf2\\xd5\\xd7\\x5f\\x7c\\xf3\\xf5\\x77\\xdf\\xac\\xcf\\xf7\\xe7\\xdf\\xbe\\xfc\\xf2\\xef\\xd6\\xe7\\xdf\\x3e\\x09\\xcb\\x37\\xdf\\x7e\\x75\\x17\\x9f\\xbf\\x38\\xe2\\xf7\\x9f\\x3d\\xa1\\xc4\\x19\\x0f\\xd6\\x4b\\xe2\\xab\\xe7\\x5f\\xbc\\x0c\\x7f\\xf7\\xf5\\x57\\xfb\\x77\\xf1\\xf7\\x2f\\xbf\\x8d\\x2f\\x7f\\xf7\\xd9\\x13\\x4e\\xb9\\x3f\\x09\\xcf\\xbf\\xfb\\xe2\\xe5\\xd7\\xfb\\x67\\x4f\\xa8\\x4a\\x7f\\x12\\x5e\\xbc\\xf4\\x7f\\xc6\\x4c\\xe9\\x49\\x78\\xaa\\xc3\\xf9\\xea\\xbb\\xef\\xbe\\xfa\\xfa\\xcb\\xf8\\xe5\\xfa\\xf7\\xbf\\x5f\\x5e\\x7f\\x44\\x49\\xfe\\x1d\\xfb\\xdb\\x43\\x9f\\xfe\\xee\\xeb\\xaf\\xbe\\xf8\\xe6\\xc5\\xcb\\xcf\\x9e\\xfc\\xfa\\x93\\xef\\x5f\\x3c\\x7b\\x63\\x88\\xb5\\xd3\\x93\\x87\\xbe\\x1b\\x1e\\xfc\\xed\\x3f\\x7b\\x12\\x5e\\x7c\\xf6\\xe4\\x56\\xea\\x08\\xa3\\x6e\\x29\\xe4\\x11\\xa4\\xdc\\x94\\xd0\\xeb\\xde\\xf3\\x4d\\x09\\xd2\\xf6\\x5e\\x43\\x94\\xb6\\x4b\\x0b\\xb1\\xeb\\x57\\x62\\x6e\\x21\\x4a\\xbd\\x29\\x21\\x76\\xd9\\x63\\xc7\\x27\\xa9\\x5b\\xcc\\x23\\xa4\\x10\\xed\\xb2\\xb2\\x47\\xbb\\x4f\\xbe\\xbb\\x95\\x3e\\x02\\x31\\xb5\\x2d\\x85\\xc6\\x81\\x7b\\x20\\xa2\\x9b\\xb2\\xb7\\x16\\x64\\xdc\\x94\\x2d\\xb7\\x90\\x42\\xd3\\x2f\\xc7\\x9c\\x76\\xee\\xfa\\x81\\x84\\xf5\\x49\\x2c\\x21\\x72\\x88\\x25\\xdf\\x94\\x3d\\xd6\\x10\\x1b\\xdf\\x94\\x35\\x52\\x0a\\x91\\x52\\x5d\\xa3\\x0e\\xa9\\xd4\\xba\\x44\\x4a\\xb2\\x46\\x49\\xa1\\xd4\\xba\\x45\\x0e\\x22\\x21\\xea\\xfd\\x6a\\xc7\\x75\\xfa\\x69\\xd8\\x1d\\x2a\\xee\\x24\\xa1\\xd0\\x4d\\xb9\\x7b\\x70\\x42\\x7e\\xfd\\xc9\\xf7\\xcc\\xcf\\x6c\\x56\\x98\\x5b\\xe8\\x2d\\xad\\xb9\\x04\\xca\\x69\\xa3\\x14\\x84\\x02\\xe9\\x9d\\x4b\\xdf\\xf1\\x23\\xaf\\x91\\x72\\x20\\x1e\\x5b\\x0a\\xa5\\x05\\xd6\\x67\\xf5\\xb2\\x57\\xba\\x29\\x81\\xfb\\x5e\\x05\\x73\\x93\\x6e\\x8a\\xbf\\xd7\\xe8\\x37\\x45\\x5f\\xac\\xa5\\x10\\x6b\\x0f\\x91\\x4b\\x5d\\x75\\xde\\x22\\x49\\xb9\\xbb\\x2d\\x9d\\x5f\\x7b\\x5e\\x0f\\x95\\x02\\xe9\\x7c\\xf1\\x1a\\x89\\xdf\\xe1\\x39\\x55\\xec\\x59\\xaf\\x3d\\xe7\\xc1\\xf7\\xfe\\xc4\\x5e\\xb9\\x50\\x90\\x41\\x6b\\x0f\\x83\\x17\\x4e\\xb2\\x66\\x0a\\x52\\x68\\x89\\xcc\\xb2\\xd6\\x30\\xf2\\xc2\\xdc\\xec\\x97\\x69\\x25\\x2e\\x21\\xaf\\x31\\x4b\\x88\\x52\\xd2\\xc2\\x5c\\xd7\\x9c\\x82\\x64\\x5e\\x89\\x5b\\xe0\\x35\\x66\\x0a\\x51\\x72\\x5a\\xa8\\x37\\x8c\\x3f\\x0e\\x5d\\x2b\\xfd\\x07\\xae\\xc9\\x15\\x8f\\xc0\\x7a\\x0e\\x59\\x22\\xfe\\x91\\xf5\\x45\\x1a\\xde\\x57\\xdf\\x43\\xe7\\x42\\x5a\\xd1\\x01\\xcc\\xcb\\x6a\\xd5\\x3f\\x52\\x88\\xbc\\x66\\x09\\x52\\xf3\\x12\\x69\\x0c\\xdd\\x66\\x12\\x72\\x6f\\x0b\\x73\\xc1\\x1f\\xf2\\xc0\\x55\\x0f\\xbf\\xee\\x7f\\x64\\xaf\\x4b\\x2c\\x81\\x86\\xac\\xbd\\x07\\x62\\xde\\x7a\\x88\\x35\\xe8\\xb2\\xa4\\xbd\\xea\\xee\\xdb\\x28\\x71\\x88\\x44\\x14\\xb8\\xd4\\xa0\\x43\\x3a\\x72\\xa1\\x2d\\x52\\x4d\\xa1\\xe8\\xde\\xd4\\x0d\\x1c\\x88\\xfb\\x1e\\x1b\\x3e\\x75\\xdd\\xe4\\xa5\\x04\\xd6\\x05\\xa1\\x54\\x6e\\xca\\x5e\\x71\\x0c\\x74\\xff\\x51\\x4a\\xba\\x15\\xf5\\x97\\xc4\\xfa\\x75\\x3d\\x44\\x07\\xb1\\x2c\\x24\\xb4\\xb1\\x6e\\x75\\x0e\\xb1\\x62\\xa7\\x93\\x9e\\xac\\x10\\x39\\x1f\\xb1\\xf5\\x8d\\x06\\x1e\\x16\\x24\\xe9\\xd9\\x28\\x6d\\x8d\\xbd\\x63\\x5c\\x9b\\x4e\\x5e\\xd6\\x8f\\x81\\xb0\\xd9\\x75\\xa8\\xf9\\xa6\\x6c\\xb1\\x71\\xe8\\xfa\\x87\\x81\\x71\\x1c\\x51\\x46\\x0d\\x9b\\x5e\\xc5\\x23\\x50\\x61\\xdd\\x24\\xc5\\x06\\x85\\xf3\\x8b\\xa3\\x52\\xf1\\xeb\\x5e\\x77\\x4e\\x38\\x84\\x44\\xba\\x87\\xca\\xd0\\x67\\xdb\\x2f\\xec\\x20\\x36\\xfc\\x23\\x11\\x1e\\x98\\xf0\\xaf\\x36\\xf6\\x48\\x19\\xdf\\xca\\x72\\x44\\xe2\\xb1\\x44\\xa2\\x71\\x10\\x97\\x2d\\x32\\x53\\x20\\x95\\x22\\xa5\\x07\\xaa\\xf9\\xee\\x96\\x47\\x0b\\x43\\x92\\xde\\x9d\\xa8\\x05\\xb2\\x91\\xd2\\x21\\xa5\\x6c\\x71\\xe8\\x94\\xeb\\x5f\\xa4\\x87\\x58\\x9a\\x3e\\x24\\x57\\x9c\\xf8\\x9b\\x72\\x77\\x5b\\x53\\xd2\\xf1\\x6f\\xa3\\xe3\\x64\\x14\\x7d\\x64\\xd3\\xc1\\x17\\x9d\\x67\\x12\\xc2\\xc6\\x6f\\x39\\xe8\\x76\\x27\\xea\\x3b\\x16\\xab\\x8d\\x70\\xc4\\x9c\\xae\\x6c\\x86\\xff\\xd8\\xf7\\x7e\\x0b\\x94\\x20\\x78\\x4a\\xc1\\x74\\x06\\x4a\\xfa\\xc2\\x79\\xd8\\x69\\x6b\\x12\\x4a\\xdd\\xfb\\x08\\x3a\\x3d\\xfa\\x33\\xe2\\x43\\xb3\\xc9\\x6c\\xbb\\x9e\\xaf\\x5e\\x77\\x32\\x09\\xa6\\x97\\xce\\x17\\x8c\\xd8\\x04\\xfa\\x8a\\x98\\x32\\x3b\\xae\\x0d\\xeb\\x04\\xe9\\x17\\xe7\\x4d\\x23\\x9e\\x81\\x57\\xf6\\x87\\x46\\x1f\\x48\\xbd\\xbb\\x1d\\x39\\xa4\\xb5\\xa5\\x16\\x88\\x5b\\x5d\\x48\\xda\\x1a\\x1b\\x89\\x6e\\xcb\\xa6\\xe7\\x4a\\xe8\\xee\\x96\\x3a\\xcf\\x77\\x88\\xbd\\x42\\x10\\x12\\xcb\\xde\\x18\\x22\\xbc\\xda\\xa6\\xdb\\x55\\x50\\x04\\xe2\\x1c\\xf6\\x28\\x6c\\x1f\\xf7\\xd8\\x08\\x7f\\xdc\\x54\\xaa\\xaa\\xe4\\x18\\x7a\\xd4\\xf4\\x0b\\x7a\\x8b\\x7c\\x77\\x5b\\x24\\x05\\xce\\xf9\\xf5\\xd9\\x79\\x7d\\x6e\\x6c\\x56\\x1e\\x9e\\x1d\\x9d\\xc7\\x1e\\x62\\x2f\\x3b\\xf9\\xf6\\x11\\x7f\\x37\\x9b\\xaa\\x1d\\xe2\\xa9\\xe3\\x13\\x86\\x12\\x4b\\xd9\\xb1\\xcd\\x39\\xed\\x36\\x3f\\x36\\x3b\\xe7\\xdc\\xe4\\x73\\x6e\\x74\\x5b\\x14\\xdd\\xf8\\x50\\x4f\\xbd\\x07\\xd1\\xbb\\x72\\xdd\\x9b\\x6e\\xba\\x6e\\x63\\x90\\xb1\\xeb\\xe6\\x50\\x4d\\x14\\xb6\\x84\\xc3\\x21\\xfa\\xaf\\xb2\\xe9\\x4f\\x19\\x41\\xef\\x2e\\x63\\x53\\xa9\\xa5\\x12\\x3a\\x63\\xca\\xa2\\x4f\\xe1\\x75\\x65\\x51\\x5d\\x59\\xb4\\x1c\\xb8\\xab\\x7c\\x26\\x1e\\xa1\\xe9\\x0c\\xb3\\xe8\\xbe\\xa4\\xae\\xef\\x4b\\xb6\\xda\\xa4\\xa2\\x5d\\x47\\x45\\xb9\\x06\\xa1\\xee\\xe2\\x9c\\x6d\\x89\\xf5\\x08\\x26\\x9b\\x4f\\x15\\x18\\xba\\xdb\\x28\\xe9\\x2b\\xea\\x4c\\x6e\\x55\\xc7\\x45\\x84\\xf9\\xd4\\x2b\\xf6\\x8e\\xd9\\xd3\\x2b\\x76\\x95\\x4e\\xba\\xf5\\x46\\x88\\x43\\x4f\\x22\\xce\\x0b\\xcf\\xa3\\x33\\x70\\x88\\x1a\\x94\\x33\\xe6\\x32\\xd6\\xb4\\xb2\\xa4\\x10\\x85\\x79\\x63\\x55\\xf9\\xa1\\x74\\x68\\xfd\\x9b\\xb2\\x43\\x6f\\x8f\\xaa\\x9a\\x96\\x03\\x67\\xbc\\x51\\xe8\\x81\\x69\\x25\\x9d\\x8c\\x21\\x61\\xc3\\xbd\\x54\\x76\\x46\\x2a\\x10\\x94\\x6d\\xa5\\xac\\x67\\xb8\\x4f\\xd9\\x3c\\x68\\x8d\\x44\\x12\\xa8\\xd3\\x06\\x2d\\xd4\\xf5\\x8a\\xa2\\xdf\\x51\\x69\\x49\\x7a\\xc8\\x73\\xc7\\x8d\\x70\\xab\\x0e\\xb1\\xa5\\xe2\\x84\\x42\\xc5\\x01\\xd0\\xff\\x87\\xd1\\x77\\x93\\x3d\\xc4\\xe9\\xee\\x96\\x75\\xa8\\x26\\x94\\xb2\\x04\\x15\\x46\\x21\\xe2\\xec\\xeb\\xea\\xe9\\xa1\\xda\\x4b\\x35\\x09\\xb4\\xeb\\xf6\\xa5\\xb2\\x89\\x84\\x14\\x20\\xaf\\x28\\xed\\x35\\x07\\x56\\xe1\\x5b\\xb2\\xe2\\x13\\x88\\x6e\\x7d\\xd7\\x55\\x54\\x9d\\xad\\x91\\xab\\xfe\\xcc\\x5b\\xec\\x0a\\x39\\xc8\\x46\\x15\\x49\\xc4\\xe5\\x4f\\xe5\\xbb\\x70\\x2b\\x0a\\x5f\\x12\\x16\\x2e\\xaa\\x08\\x52\\x25\\xc5\\x25\\x6f\\x4d\\xef\\x19\\x20\\x20\\x5d\\xee\\x67\\x1c\\x32\\x6c\\x81\\x98\\x39\\x10\\xe9\\xf8\\xe2\\x68\\x21\\x17\\xdd\\x09\\x05\\xa7\\x6c\\x0c\\x05\\x3d\\xfe\\x95\\x88\\xc5\\x7e\\x78\\xa7\\xfd\\x27\\xb6\\xc9\\x32\\xf3\\x43\\x88\\x04\\x78\\xe4\\x1d\\xd1\\x88\\x02\\x2c\\x9c\\x97\\x66\\xbf\\xd8\\x63\\xc1\\x52\\x35\\xdd\\x00\\x98\\x86\\x6b\\x90\\xe1\\x3f\\x75\\x94\\xd4\\x4b\\x28\\xac\\x33\\x42\\xe2\\xe8\\x91\\x75\\xca\\x77\\x4a\\x62\\xa7\\x60\\xa7\\x0a\\x35\\xab\\x0f\\xa6\\x1a\\x54\\x72\\x55\\xcc\\xaf\\x9e\\x08\\xdd\\x08\\x01\\x3b\\x36\\xaf\\xaa\\xe3\\x78\\x8b\\x15\\x7b\\x42\\x95\\xf1\\x16\\xa9\\x1b\\xda\\x0b\\x91\\x3b\\xb4\\x12\\x43\\x97\\x46\\x53\\xa6\\x31\\xab\\x34\\x31\\x31\\x5b\\x82\\xd8\\x17\\x18\\x82\\x48\\x25\\x87\\x1e\\x96\\x9d\\xb2\\x69\\x33\\x88\\x66\\xfd\\x90\\xcb\\x1a\\x2b\\xe4\\x4e\\xdf\\xb0\\x8b\\x75\\x7f\\x32\\x41\\x81\\x9b\\xf0\\xd5\\xf1\\x72\\xd2\\x7d\\x9a\\xf4\\x08\\xe0\\x77\\xf6\\x62\\x8d\\x1e\\x9e\\x8b\\xff\\xcc\\xf1\\x84\\x62\\x63\\x16\\x05\\x0e\\xd9\\xe4\\x24\\xf6\\x9e\\xe4\\x9d\\x74\\xc7\\xb6\\xba\\x0f\\x0a\\x8c\\xfd\\x01\\x61\\xc4\\x8c\\x5d\\x71\\xff\\x33\\x44\\x1d\\x8e\\x2e\\x19\\xba\\x68\\xbc\\x63\\x16\\x48\\x68\\x15\\x45\\xd2\\x6d\\xc3\\xd1\\x83\\xe0\\xc0\\xfb\\xe8\\xf8\\xa8\\xe9\\x4b\\x24\\xda\\x29\\x0d\\xcc\\x82\\x5e\\xbc\\x0b\\xd6\\x99\\xab\\x60\\x8a\\x14\\x2f\\x8b\\xfd\\xb5\\x36\\xc5\\x0a\\x26\\x4b\\xb2\\x4a\\xd2\\x86\\x93\\xc3\\xa9\\xea\\x81\\xb3\\x09\\x2b\\x57\\xde\\xf5\\x3f\\xb7\\x77\\xed\\x39\\x34\\x96\\xb5\\x48\\x20\\x91\\x55\\xa0\\x28\\x14\\x66\\x8a\\x82\\x32\\x59\\xc8\\xb0\\x38\\x16\\x58\\x57\\xaf\\x39\\x86\\x67\\x6c\\x2c\\x51\\x68\\x98\\xfa\\x2a\\x5c\\x03\\xe5\\xae\\x77\\xd1\\xfd\\xb0\\x2a\\x92\\xd4\\x95\\x69\\x2b\\x97\\xae\\x5f\\x19\\x26\\x47\\x62\\xef\\x2b\\x70\\x84\\xe4\\xa4\\x1f\\x54\\x3b\\x65\\x45\\x89\\x44\\x61\\xa4\\x95\\x6b\\x0d\\x72\\x4d\\xbd\\xff\\x17\\x36\\xde\\xc1\\xa1\\x8c\\xaa\\x88\\x64\\x91\\x2a\\x87\\x42\\x56\\xe2\\x71\\x00\\xbb\\x4a\\x49\\x0a\\x5a\\xca\\x12\\xf1\\x49\\xba\\x2c\\x8a\\x61\\x0e\\x7c\\x90\\x7a\\x45\\xfc\\xff\\x97\\x6e\\x3c\\x29\\x50\\xe1\\x2e\\x5b\\x69\\x8a\\x0a\\x15\\x71\\x91\\x4e\\x7d\\xa0\\xa4\\x10\\x87\\xf5\\x85\\x74\\x76\\xa5\\xef\\x51\\x6a\\x90\\xec\\x9b\\x49\\x9a\\xed\\xb5\\x90\\x0d\\xad\\x2b\\xf6\\x16\\xb7\\xbd\\xaa\\x19\\x51\\xc3\\xe4\\x59\\xdb\\x0d\\x5a\\x11\\xdb\\x42\\x56\\xc6\\x86\\x55\\xe5\\x76\\xe5\\x6c\\xc6\\xb9\\x1f\\x4b\\x28\\xad\\x1c\\x24\\x7d\\x69\\xd2\\x0f\\x05\\x55\\x4b\\x6c\\xd2\\x1f\\xbe\\xea\\x66\\x5a\\x83\\x2d\\x8c\\xec\\xd6\\x60\\x35\\x5d\\xdb\\xc5\\x46\\x04\\x6b\\xb0\\x6c\\xd8\\x4a\\x2d\\xc0\\x28\\x9c\\xef\\x13\\x3b\\xef\\x11\\x1b\\x5e\\xbf\\xa1\\xb2\\x43\\x35\\x0e\\xde\\x54\\xbf\\xa2\\xa2\\xb1\\x5f\\x99\\xc9\\xa7\\x3e\\x5c\\xdd\\x16\\xdc\\xd6\\x9a\\x49\\x45\\xe7\\x58\\xb1\\xd1\\x6b\\x5e\\x63\\x55\\xe8\\x4f\\xd2\\xf3\\xc3\\xd7\\x27\\xbf\\x3e\\x71\\xa8\\xac\\x18\\x5c\\x5f\\x5c\\x72\\xe0\\xaa\\x27\\x0e\\x1a\\xb4\\xef\\x7a\\x77\\x92\\xb2\\x93\\x5a\\x7f\\x21\\xf7\\x4d\\x91\\x61\\x0a\\xdc\\x55\\x16\\xb5\\xb4\\x29\\xd0\\xed\\x49\\xd7\\x2f\\x72\\x1a\\xbb\\x40\\xe6\\x8c\\x73\\xc2\\xed\\xdf\\x40\\x70\\x23\\x1b\\x9c\\x33\\x49\\x84\\x9d\\x4f\\x00\\xc0\\x38\\x5c\\x0a\\x22\\x5a\\x87\\x0c\\xb3\\x27\\xd9\\x3a\\xe3\\xe9\\x38\\xd8\\x3e\\x22\\xb3\\x45\\x75\\x90\\x45\\x91\\x2d\\x4b\\x0d\\xb5\\xd8\\x02\\xab\\xfd\\x04\\xf8\\x4f\\x6b\\x2e\\x14\\x8a\\x6a\\xd1\\x4c\\x41\\x35\\x13\\x9e\\x0d\\xc4\\x66\\xd8\\x20\\x73\\x98\\x73\\x0d\\x48\\x6e\\xb0\\x45\\x95\\xbc\\x23\\x80\\x8a\\x83\\x89\\xa1\\x1a\\x8c\\xe7\\xd4\\xee\\x6e\\x45\\x2d\\x85\\x2e\\x9b\\xa2\\xae\\x01\\xd0\\x68\\x76\\xb7\\xec\\x8e\\xe8\\x33\\x6d\\xa5\\x28\\xe2\\xc0\\x5f\\x74\\x63\\xee\\x3d\\x87\\xd1\\x76\\x85\\xc9\\xb0\\xc8\\xd9\\x5e\\xa3\\x9a\\x5d\\x1f\\x55\\xb0\\x17\\x3c\\x45\\x11\\x43\\xba\\xa6\\xc9\\xc8\\x97\\x4a\\x25\\x1a\\xa5\\xbc\\x8a\\x64\\x45\\x47\\xcb\\xd0\\xdd\\xc9\\xad\\x2f\\x91\\x32\\x1d\\x44\\x49\\xcf\\xb9\\xca\\x80\\x56\\x1f\\xbe\\x11\\xfb\\x8d\\x4a\\x0a\\xe9\\x18\\x69\\x6b\\x35\\xe8\\x67\\x43\\xd7\\x5c\\x80\\xbd\\xaa\\x59\\x65\\x74\\x53\\xd6\\x31\\xc2\\xa0\\xad\\x50\\xc8\\x2d\\x74\\x15\\x7c\\xbd\\xed\\x25\\x05\\x95\\x7b\\xbb\\x62\\x0f\\x60\\xb6\\xbd\\x86\\xaa\\x2b\\x9e\\xa1\\x30\\xf4\\x2b\\xb1\\x30\\x9c\\x13\\x7b\\x6c\\x35\\x14\\xb5\\xca\\x5a\\x50\\x55\\xb1\\xc5\\x22\\xd0\\xe0\\x90\\x94\\xf8\\xbb\\x23\\xc6\\x62\\x8a\\x09\\x13\\x61\\x13\\x09\\x9c\\x6f\\x1a\\x0d\\x36\\xbf\\x9a\\xbc\\x39\\x74\\xd6\\x09\\x56\\x10\\x81\\x2b\\x60\\x94\\xed\\xd0\\x0d\\x41\\xa7\\x57\\xdf\\x47\\xf7\\xb1\\x2d\\x19\\xf4\\xa9\\xc1\\xe5\\xd6\\xc2\\xde\\x4d\\xe3\\xed\\x0c\\x93\\xde\\x8d\\x7d\\xdd\\xbf\\x0e\\xae\\x89\\x2f\\x66\\x13\\x9d\\x68\\x2a\\x0e\\xfc\\xba\\x61\\x9f\\xc3\\x93\\x02\\x08\\x47\\x0a\\x02\\x54\\x6f\\xb9\\x4d\\x18\\x62\\x31\\xc7\\x89\\x01\\x2c\\xdf\\x44\\xf3\\x80\\xc3\\xe2\\x8a\\xbd\\x2e\\x45\\x8a\\x02\\x90\\x14\\xb0\\x0f\\x86\\x6d\\x87\\xb1\\xd4\\x43\\x0d\\xc1\\x25\\xb6\\x3c\\x1e\\x5e\\x37\\x99\\xa2\\x89\\x02\\xb1\\xac\\x94\\x06\\x20\\x0b\\x26\\x47\\x95\\x85\\xbd\\xab\\x4e\\xa6\\x2e\\x9b\\xbe\\xa1\\x6a\\x3c\\x20\\xb0\\x50\\xdd\\xd9\\x74\\xa2\\x0b\\xcc\\xf1\\xdc\\xa8\\xec\\x50\\x79\\xef\\xac\\xd8\\xb9\\xe4\\xa0\\x52\\x6b\\x37\\xcd\\x9e\\xd4\\x28\\x52\\x75\\x11\\xbb\\x6a\\x62\\x5d\\x1e\\xea\\xa1\\x66\\xb5\\xe6\\x75\\x21\\xa1\\x83\\x23\\xb9\\x32\\x8e\\x72\\xe8\\xbc\\xa8\\xc9\\x15\\x80\\x85\\xb0\\xe8\\xfe\\xd0\\xc2\\x3b\\x7e\\xd5\\x4c\\xf1\\x02\\x2e\\x6f\\x09\\xc2\\x10\\x82\\xbe\\x19\\xa2\\xc3\\x4a\\x0e\\x00\\xef\\xcc\\x7b\\x1c\\xba\\x37\\x6f\\x4a\\xd8\\x20\\x0a\\x92\\x4b\\xf0\\xd1\\x57\\x15\\x3a\\xbd\\x6f\\x8a\\x25\\x55\\x45\\xab\\x91\\x4f\\xd2\\x14\\x52\\x26\\x03\\x90\\xba\\x34\\x58\\x7f\\x8c\\x0c\\x77\\x6f\\x66\\x42\\x01\\xca\\xc1\\x40\\xb3\\x2d\\xa0\\xb0\\xda\\x8c\\x7b\\xaa\\x2e\\x75\\xdc\\xc4\\xd2\\x3d\\x32\\xba\\xd9\\x3c\\xc5\\x7e\\xc7\\x6e\\x6e\\x44\\x4e\\xe6\\x94\\x72\\xed\\x1c\\xcc\\x92\\x77\\x9f\\x46\\x24\\xf7\\x2c\\xe8\\x83\\x3a\\x29\\x54\\x50\\x61\\x98\\x14\\x9a\\x41\\xc8\\x09\\x73\\xa0\\x7c\\xe5\\x90\\x66\\xd7\\xbd\\x6a\\x93\\xe5\\x83\\x52\\x59\\x4b\\x96\\xd0\\x69\\x2c\\xc4\\x74\\xc4\\x36\\xc6\\x42\\x35\\xe3\\xe4\\x2f\\x11\\x9f\\xa4\\xf0\\x12\\xa9\\xa4\\x43\\x4a\\x5e\\x62\\xa1\\x7c\\x77\\xcb\\x39\\x85\\xdc\\xc6\\x22\\x2d\\x1f\\xa5\\xf1\\xc3\\x4f\\x2a\\x17\\x15\\x42\\x2d\\xc3\\x05\\x35\\xb2\\x6e\\x50\\x15\\x4c\\xaa\\x56\\x54\\x64\\x89\\x99\\x4e\\xba\\xd9\\x28\\x07\\x43\\x11\\x6a\\x11\\xb0\\xc9\\xed\\xbd\\x19\\x44\\x66\\x85\\x69\\x11\\x88\\x7d\\x64\\xec\\xef\\xbd\\x8d\\x60\\x96\\x96\\x1e\\x8a\\x51\\x70\\x54\\xcd\\xf7\\x73\\x33\\x4f\\x3a\\x2c\\x1b\\x58\\x20\\x43\\x71\\x9c\\x84\\xe2\\x48\\x95\\xcd\\x80\\x8b\\xd5\\x80\\x2d\\x0f\\x7f\\x48\\x24\\xc2\\xfc\\xf7\\xb1\\xea\\xee\\x90\\xb6\\x66\\x09\\x35\\x8f\\xa5\\xe6\\xe6\\x3e\\x94\\xc2\\x75\\x8d\\x6a\\x50\\x49\\x6d\\x1b\\x25\\xa8\\x64\\x4e\\x23\\xe4\\xb1\\x75\\xc6\\xde\\xd4\\x57\\xd2\\x1b\\xee\\x38\\xcc\\x8a\\x1d\\x0c\\xbd\\xc9\\x44\\xf9\\xd4\\x1c\\x22\\x63\\xf9\\x93\\xff\\x6a\\x8f\\xc0\\xc2\\xaa\\x99\\x75\\xaa\\xa0\\xc5\\x7d\\x63\\xf0\\xd8\\xe0\\xb5\\xc0\\x16\\xad\\xf0\\x95\\x1a\\x24\\x26\\xdd\\xd2\\x0f\\xcf\\x7e\\x9d\\xb3\\xdf\\x42\\xe9\\x38\\x69\\x8d\\x83\\x70\\x90\\x94\\x01\\x79\\x99\\x77\\xca\\x30\\x73\\x05\\x30\\x5c\\x15\\x57\\x3d\\x15\\x30\\xa4\\x99\\x9a\\x8e\\x09\\x5a\\x4c\\x9f\\xdf\\xe1\\x31\\xe2\\xec\\x46\\xda\\x1e\\xf1\\x32\\xba\\x3d\\x37\\x05\\x8f\\x0a\\xaa\\x20\\x93\\x1c\\x57\\xea\\x6b\\xe1\\x6f\\x66\\xbd\\x0f\\xf7\\xb7\\xb8\\x49\\x79\\x91\\x63\\x3e\\x39\\x25\\x9d\\x90\\x3e\\xb2\\xfe\\x63\\xcb\\xa2\\x4a\\x8c\\xe0\\xdd\\x35\\xf1\\x09\\x25\\x17\\xd4\\x78\\xd8\\x1a\\xa6\\xda\\xbf\\x3e\\x2e\\x47\\xb1\\x97\\xb0\\x9b\\xe7\\x9a\\x84\\x77\\x3f\\x3b\\x76\\xfa\\xe7\\xdc\\xcb\\xae\\x58\\x20\\xba\\x6a\\x24\\x7d\\x29\\xd5\\x2a\\x94\\x69\\x1a\\x63\\x5b\\x1c\\xb6\\x2f\\x54\\x4e\\xd8\\x5c\\xe3\\xb5\\xc9\\x86\\xdf\\x5a\\x20\\x33\\x79\\x60\\xcf\\x31\\x5c\\xd7\\x30\\xba\\x72\\x6b\\xf0\\x77\\x24\\xc8\\x26\\xdd\\xd1\\xcd\\xac\\x5b\\x7d\\x8c\\x4a\\x41\\x7b\\xef\\xbe\\xab\\x51\\xad\\xab\\x8a\\xf3\\xea\\x2e\\xb3\\x6a\\x8e\\x49\\x66\\x35\\xa7\\x5b\\x0f\\xbe\\x85\\xa1\\xe7\\x4d\\x84\\x98\\xb3\\xaa\\x31\\xb4\\x5e\\xeb\\x81\\xda\\x16\\x21\\x93\\xe6\\xe0\\x4b\\x0a\\x13\\x84\\x44\\x62\\x3e\\xd1\\x3e\\xdb\\xba\\x1d\\xf8\\xff\\xc3\\xdb\\xa5\\xf9\\x76\\xa9\\x3a\\xe5\\xaa\\xee\\xa5\\x2c\\x8d\\xe5\\x88\\x5d\\xe5\\x0a\\x64\\x3e\\x60\\x58\\x26\\x55\\x49\\xac\\x07\\xac\\x86\\x58\\x53\\x56\\x21\\x01\\xe7\\x1f\\x0f\\x35\\xd1\\x80\\x6e\\xf5\\x2c\\x72\\x0d\\x45\\x5f\\x68\\x89\\x25\\x5f\\x79\\x66\\xbf\\xb8\\x7c\\x85\\xa7\\x32\\x00\\x40\\xe0\\xd4\\x76\\x02\\xe4\\xa6\\x3c\\xb6\\xd8\\xbb\\xe9\\xff\\x6c\\xee\\xa2\\xea\\x3a\\x8f\\x9a\\x62\\xb3\\x5a\\x03\\xb7\\x00\\xa7\\x5a\\x56\\x80\\xef\\x1e\\x1a\\x33\\x78\\xe1\\x4d\\x83\\x2c\\xf6\\x1d\\x63\\x2a\\x0a\\x4a\\x08\\x8a\\x1d\\x8e\\x40\\xf3\\xc3\\x99\\x57\\x86\\x6d\\xf7\\xe8\\x7a\\x9d\\xf2\\x1b\\xfb\\x46\\xb7\\x41\\xee\\x16\\x09\\x81\\xd6\\x2a\\x2a\\xd7\\x6c\\xae\\x61\\xf0\\x99\\x17\\x16\\x78\\x61\\x9b\\xfe\\x2a\\x3f\\xf9\\x10\\x49\\x1d\\xaa\\x5d\\x5f\\x01\\x1b\\x2a\\xc4\\x86\\xa5\\xb5\\xe5\\xc7\\x5e\\x9a\\xff\\xf0\\xcf\\xac\\xf6\\x1c\\xae\\x54\\x38\\x68\\x62\\x6d\\x98\\xf5\\x8a\\x1d\\xd7\\x52\\x10\\x99\\x01\\x20\\xdb\\x71\\xbd\\xef\\x76\\xbb\\xc6\\xbb\\xee\\xa1\\x3c\\x76\\xe0\\xa1\\xae\\x3f\\xa8\\xed\\xad\\x85\\xdc\\x76\\x80\\xe0\\x96\\xcc\\x31\\x0a\\x0f\\xf9\\xc8\\x18\\x30\\x4e\\x07\\x0d\\xf8\\x69\\xcd\\xef\\x2b\\x70\\xdb\\xb8\\xb3\\xb9\\xee\\xb1\\x9a\\x52\\xae\\xe3\\xee\\x56\\xd5\\xcc\\x18\\xb4\\x45\\x0a\\xb1\\xaa\\x1d\\x08\\x98\\xb3\\x31\\x10\\x56\\x50\\x7b\\xbe\\x11\\xc4\\x76\\xa9\\x2b\\xfc\\x19\\x23\\x28\\x84\\x02\\xca\\xd0\\xc3\\x94\\xe0\\xc9\\x0d\\x58\\xd5\\xa9\\xac\\xcb\\x19\\x1a\\xca\\x53\\x5a\\x03\\xf4\\xa8\\xba\\xd6\\x63\\xe5\\x60\\x89\\x4e\\x00\\x24\\xf6\\xe5\\x74\\xfa\\x34\\x55\\x8d\\xc4\\x7a\\xc5\\x9c\\x1a\\x53\\x28\\x8e\\xd0\\x6b\\xd7\\xf7\\x4e\\xaa\\x73\\xa8\\x36\\x55\\x27\\x76\\xd6\\xb0\\xf4\\xa1\\x77\\x17\\x8f\\xf0\\x5f\\x53\\xaf\\x10\\x8b\\x26\\x4f\\xa0\\x76\\x5c\\x88\\x15\\xf2\\xe5\\xbe\\x67\\x91\\x24\\xf3\\x2b\\x99\\xc0\\x33\\x29\\xe3\\xd6\\xa2\\xe1\\x52\\x82\\x33\\x1c\\x82\\x86\\x2a\\xce\\x2f\\xeb\\x0a\\x53\\x5d\\x55\\xdc\\xaa\\xb4\\x75\\x25\\x69\\x1b\\x2a\\x43\\xf4\\xcd\\x8f\\x30\\x8a\\x74\\xbd\\x33\\xec\\xd0\\x8d\\x8a\\xde\\x81\\x6d\\x63\\xe0\\xfe\\x1e\\x26\\x84\\x53\\x4b\\xbf\\x54\\x0d\\x52\\x06\\x08\\x73\\xdd\\x62\\x0a\\x11\\x1a\\x02\\x12\\xf0\\x41\\x94\\xc0\\x26\\x96\\x89\\x42\\x17\\xc0\\x6a\\x28\\x4e\\x46\\x6c\\xc0\\x76\\xda\\x08\\xbd\\x21\\x3a\\x50\\x6b\\x20\\x44\\x3a\\xba\\x79\\x8f\\x11\\xa5\\xe8\\xba\\xc6\\x3b\\x16\\x46\\x81\\xb8\\xe9\\xc1\\x5c\\x4d\\x78\\x52\\x6a\\xe6\\x6b\\xdb\\x58\\x35\\x08\\xe6\\x94\\xf7\\x84\\x1f\\x5b\\x0a\\x50\\x35\\x18\\x7c\\x2e\\xa7\\xa4\\xb3\\x78\\xa4\\x8e\\xa4\\xe1\\x43\\xef\\x70\\x14\\x6e\\x80\\xe9\\x98\\x6c\\x07\\xde\\x17\\x54\\xcc\\xfa\\x88\\x87\\x57\\xfd\\x9f\\xff\\x04\\x46\\x34\\xee\\xde\\x72\\xbf\\x7f\\x7b\\x58\\x68\\x78\\x80\\x2e\\xe1\\x03\\x8f\\x90\\x37\\x82\\xb7\\x7c\\x06\\x6f\\x2f\\x71\\x88\\xf3\\x7a\\xfb\\x92\\x1a\\x4a\\x0f\\xbf\\xe5\\xb3\\x5f\\x84\\xef\\xe3\\xe7\\x9f\\x87\\x5f\\x7f\\xf2\\xbd\\x7c\\x31\\x43\\x00\\x1c\\x6a\\xaa\\xc7\\x18\\x6b\\xaf\\x35\\xe4\\x02\\x53\\xa8\\xac\\xb1\\x11\\x00\\x9c\\xac\\x8d\\x9a\\x1e\\x45\\x3a\\x22\\x95\\x2b\\x80\\xf9\\xb3\\xd3\\x59\\x25\\xb9\\xc3\\x59\\xd5\\x33\\xbb\\x6f\\xaa\\x67\\xbe\\xd3\\xbf\\xb4\\xc6\\x0f\\xfc\\xe5\\xea\\xf0\\x5e\\xfa\\xf0\\x3a\\x87\\x51\\x0f\\x2a\\x75\\x6d\\xa4\\xc0\\x86\\x6c\\x64\\x52\\xe5\\xd0\\x61\\x76\\x3d\\x58\\x18\\xf4\\xb8\\x62\\xb9\\xfd\\xd9\\x3d\\x88\\xad\\x9a\\x52\\x4f\\x67\\x02\\xd4\\x3b\\x5d\\xa7\\x8c\\x58\\x86\\x7e\\x9c\\xe7\\xd2\\x20\\x25\\xac\\x71\\x95\\x95\\xad\\xab\\xe2\\x34\\xe3\\xb5\\x9a\\xba\\x1a\\x6e\\xbe\\xaa\\x44\\xce\\x1e\\x5a\\xc4\\x6e\\x41\\x54\\x51\\xe5\\x47\\xc5\\xb1\\x84\\xcd\\x05\\xf3\\x7a\\x86\\x89\\xb7\\xe8\\xe2\\x29\\x1a\\x70\\x9f\\xe2\\xcf\\xa4\\x9f\\x28\\x06\\xe9\\x0a\\x19\\xa4\\x1c\\x1d\\x47\\x51\\x82\\x04\\x1c\\x63\\x6c\\x4a\\x04\\x3d\\x33\\x05\\xd5\\x5e\\xd5\\x74\\x53\\x63\\x85\\x81\\xc3\\xc2\\xba\\xc3\\x20\\x9d\\x4a\\xb3\\xe9\\x13\\x70\\x97\\xba\\x3e\\xdf\\x39\\x05\\x15\\x50\\x76\\x8f\\x9d\\x60\\xde\\x6d\\xb1\\x1b\\x9a\\x33\\xd3\\x2a\\x77\\xd5\\xac\\xa6\\xc5\\x24\\xdd\\xdd\\x66\\xca\\x61\\xe8\\xc9\\xc8\\xcd\\x89\\x16\\xb2\\xdb\\xe9\\xae\\x46\\x84\\x98\\xfb\\x15\\xca\\x06\\x5a\\x0e\\x23\\xb7\\xfd\\x7a\\x11\\x10\\xd9\\xf6\\x2b\\x50\\x3c\\xc8\\x16\\x35\\xf4\\x2b\\x5b\\xe0\\xbf\\xb2\\x55\\xab\\x6a\\x5a\\x10\\x90\\x79\\x0a\\x59\\xaf\\xe7\\x91\\x77\\x7d\\x37\\x4e\\x79\\x77\\x1b\\x17\\xa6\\x1e\\x35\\x3d\\xaf\\xba\\x82\\xf0\\x40\\x4c\\xa3\\x00\\x61\\xeb\\x1a\\xe2\\x90\\x1d\\xd8\\xa2\\xca\\xce\\xee\\x6a\\xae\\x3a\\xd3\\x99\\xea\\xa2\\xa7\\xf4\\x68\\x7d\\x43\\xb8\\x67\\x20\\xaa\\xdb\\xf5\\x03\\x16\\x2a\\xb9\\x1d\\x6a\\x06\\x95\\x9d\\x39\\x53\\xa2\\x78\\xb8\\xda\\x96\\x00\\xa1\\x90\\x9a\\x70\\xe5\\x78\\x00\\x41\\xbf\\x2e\\x30\\xcb\\x15\\xd2\\x2e\\x08\\x1c\\xeb\\x6e\\xc1\\xbc\\xc2\\x5d\\xb5\\xeb\\xfd\\x7b\\x77\\xe1\\x0d\\x27\\x86\\x42\\xd3\\xe2\\x0f\\x3b\\x4d\\x2f\\xb7\\xed\\x61\\x7a\\xb5\\x13\\x84\\x99\\x29\\x54\\xbb\\x45\\xfb\\x38\\x4f\\x1d\\xab\\x0b\\x00\\x2f\\x9c\\xc2\\xa2\\x61\\x18\\xbb\\xd1\\x6e\\x7e\\x79\\xf7\\xac\\x90\\x0e\\x44\\xf2\\x66\\x06\\x13\\x73\\x0a\\xb5\\xaf\\xc5\\xfe\\xac\\x96\\xbe\\xda\\x64\\x59\\x0f\\x00\\x84\\xfc\\x06\\x6b\\x10\\x3a\\x08\\xbe\\xbb\\xa4\\xea\\x59\\x02\\xb1\\xda\\xd5\\xac\\x88\\xb6\\xee\\x31\\x03\\xe7\\x8f\\x76\\x77\\x9b\\x7b\\x09\\x95\\x0d\\xdf\\x75\\xf8\\x11\\x61\\xeb\\xef\\x88\\x98\\x86\\xa8\\x16\\x14\\x1e\\x6b\\xa6\\x0a\\xf6\\xf0\\xae\\x92\\x35\\xd8\\x92\\xc8\\x58\\x74\\x68\\xd1\\xcc\\xac\\xc8\\x02\\x04\\xb1\\x47\\x38\\x0f\\xe4\\x8a\\x77\\xff\\xbf\\x76\\xc1\\x4e\\x21\\xad\\xb9\\x20\\x9c\\xd9\\x17\\x6a\\x6b\\x86\\x49\\xac\\xff\\x50\\x43\\x63\\x8d\\x94\\x39\\x48\\x93\\x25\\xe6\\x34\\x3d\\x49\\xf8\\x27\\x65\\x52\\xb0\\x96\\x43\\xee\\xb2\\x48\\xce\\x6b\\xa4\\x4e\\x21\\xf7\\x2b\\x18\\xe9\\x5f\\x9c\\x0e\\x82\\x74\\x20\\x90\\x2d\\x55\\x00\\x78\\xd5\\xaa\\x21\\x53\\xb5\\x27\\x61\\x02\\xca\\x17\\x51\\x5d\\xb8\\x5e\\xd5\\x6e\\x25\\x45\\xd7\\x80\\xce\\x7a\\x48\\x7c\\x8d\\xd2\\x0c\\x9e\\xa8\\x14\\xd8\\x10\\x5b\\xe8\\xc1\\x20\\x52\\x61\\x45\\xa5\\xb1\\x59\\xb8\\x7e\\x88\\x49\\x02\\xd5\\xf4\\xa7\\x76\\xb1\\x28\\x5e\\xe4\\x9a\\xf4\\x5c\\xb1\\x45\\xca\\x96\\x28\\x95\\xcc\\x15\\xa1\\x12\\x97\\xb3\\x6c\\x86\\xa6\\x18\\x96\\x1e\\x44\\x89\\xc9\\x41\\x15\\x45\\x5b\\xcc\\xb6\\x43\\xd9\\xe3\\xe4\\xb1\\x54\\xa0\\x1d\\x5d\\x7e\\x2c\\x96\\x22\\x23\\x58\\x79\\x5d\\x8d\\x16\\x4e\\xe3\\x88\\x25\\xb1\\x3d\\xa0\\xe5\\xbe\\x70\\x4a\\x7e\\xfe\\xcc\\x0c\\xf1\\x90\\x30\\x30\\x4e\\x49\\x46\\x64\\xe2\\x14\\xe0\\x18\\x0e\\x70\\x8e\\x8f\\xd0\\xd3\\x1e\\x73\\x77\\x92\\x53\\xcf\\x21\\xbb\\x71\\xaf\\xaf\\x08\\x0a\\xcf\\x23\\x1c\\x88\\x3f\\x3f\\x83\\x3a\\x55\\x20\\x25\\xcc\\x0a\\x12\\x52\\x19\\x81\\x90\\xd4\\x0e\\x09\\xef\\xe7\\xcd\\xc4\\x1b\\xd0\\x6a\\x15\\x1d\\x25\\xc3\\xc1\\x09\\x29\\x2f\\xd8\\x65\\x43\\x3c\\x38\\x5b\\xe1\\x85\\xd4\\x7d\\xa0\\x87\\xa9\\xb6\\x2d\\xf6\\xa0\\x56\\x70\\x60\\x20\\x04\\x5d\\xd5\\xa0\\xa2\\x5c\\x51\\x7c\\x77\\x9e\\xc7\\x3c\\xd5\\xb6\\x8a\\xd0\\x10\\x33\\x54\\x8c\\xc8\\x91\\xc9\\xf9\\x34\\xe9\\x03\\xe6\\x7c\\x55\\x5c\\x6d\\x46\\x72\\xe4\\xb9\\x2b\\x88\\x29\\xcc\\x5f\\x25\\xf3\\x9a\\xa9\\x25\\x02\\xda\\x04\\xa5\\x9d\\xc4\\x90\\x96\\xd9\\x0a\\x3a\\xd9\\x4d\\xc1\\xbf\\x6a\\x2a\\xa2\\xbc\\x22\\xee\\xd8\\x12\\x3c\\x0e\\x88\\x85\\xea\\x63\\x46\\xda\\xa3\\x9e\\x05\\x98\\x72\\x6a\\xbb\\xbb\\x55\\x30\\x74\\x37\\xca\\x16\\x6d\\xf3\\x46\\x1a\\x75\\xa2\\x1c\\xa3\\xa6\\x90\\xfd\\x23\\x99\\xc5\\x29\\xbb\\x3e\\x95\\xc7\\x95\\x80\\xc8\\x6f\\x5d\\xd5\\xc2\\x73\\x75\\xc0\\x2f\\xce\\xa3\\xcd\\x2d\\x57\\xcc\\xc1\\x6c\\x3b\\x48\\x0f\\xe5\\xae\\xb2\\x56\\x6f\\xea\\x21\\x50\\x58\\x1b\\x11\\xd1\\x48\\x85\\x3c\\x5c\\xf3\\xe9\\x07\\xe1\\xa4\\xa7\\xc3\\x1c\\xa9\\x30\\x6e\\xb9\\xa8\\x7d\\x20\\x4b\\xe4\\x86\\xfd\\x57\\x15\\x0f\\x1b\\x25\\x89\\x54\\x68\\x8b\\x7b\\x06\\xd8\\x8d\\x10\\x51\\x1b\\x9d\\x03\\x17\\xd0\\xb6\\xb0\\x3c\\xaa\\xae\\x6d\\xd9\\x32\\x2d\\x6a\\xc0\\x1d\\xba\\x2a\\x57\\x62\\x35\\x7f\\x31\\xed\\x70\\xb2\\x23\\xdf\\x97\\xd6\\xd9\\x3d\\x80\\x70\\x7c\\x65\\x4e\\x4b\\x91\\x72\\xe8\\x5a\\x2f\\x11\\x9f\\x72\\x93\\xa5\\x66\\xf2\\x6f\\xb5\\x6b\\x21\\x81\\xff\\x66\\xba\\x15\\xd2\\x79\\x6b\\xdc\\x47\\x21\\x52\\x19\\xac\\xdb\\x9f\\x96\\xdc\\x9a\\xff\\x0a\\x9f\\x2a\\x3c\\x8f\\xf9\\xca\\x3a\\xfc\\xe5\\x49\\xee\\xa8\\xc0\\x9f\\x9c\\x28\\x14\\x18\\xc2\\x3b\\x49\\xf2\\x50\\x2e\\x55\\x09\\xa3\\xed\\xaa\\xb2\\x74\\xaf\\x4d\\x5d\\x60\\x1a\\xc6\\x02\\x11\\x6e\\xd3\\xea\\x82\\x9d\\x6e\\x2e\\x46\\xf4\\x5b\\x15\\x4c\\x03\\xf1\\x44\\xec\\x00\\xc0\\x77\\x85\\x6d\\xb2\\x9b\\xa3\\x2a\\x58\\x04\\xc1\\x35\\xa8\\x81\\x09\\x67\\x4b\\x90\\x39\\xe3\\xb3\\x9b\\xfb\\x16\\xbd\\x16\\x38\\x60\\x5c\\x85\\xc9\\xdc\\xfe\\x38\\x33\\x06\\x93\\xa0\\xc4\\x88\\x27\\xf3\\x86\\x72\\x02\\x81\\x93\\xc0\\x96\\xe0\\xcc\\xa1\\xf5\\x43\\x92\\xee\\x08\\xa1\\xe0\\x01\\xd3\\x7c\\xc4\\x3c\\xe0\\x98\\x63\\xbb\\x6d\\x14\\x53\\x23\\xd8\\xf1\\x05\\xfa\\x25\\x55\\x20\\x21\\xdf\\xef\\xa2\\xe7\\xa4\\xcf\\x60\\xb6\\x98\\xa7\\xe1\\xaa\\x47\\xe8\\xbf\\xbd\\x6c\\x78\\x57\\x04\\x54\\xc6\\x85\\x14\\x07\\x63\\x30\\x44\\x87\\x60\\x7b\\x6c\\xe6\\xc2\\xd0\\x41\\xf5\\xa5\\xa4\\x74\\x94\\xdc\\x16\\x2a\\xc5\\xae\\x10\\xbf\\x42\\xe5\\x8d\\xbd\\x30\\x24\\xe2\\xd4\\x26\\xba\\xfc\\x02\\x55\\x55\\x8e\\x4a\\x69\\xd1\\x9b\\x1c\\xb1\\x26\\xa8\\xb6\\x2b\\xd8\\xf7\\x5f\\xce\\xad\\x55\\xed\\x40\\xd2\\xc2\\x85\\x0f\\x4a\\x52\\x75\\x9a\\x3a\\x7e\\x53\\x05\\xd4\\x37\\x5a\\xa2\\xfe\\x2d\\x52\\x92\\xbe\\x30\\xbc\\xdb\\x34\\x96\\x58\\xcb\\x95\\x5b\\xff\\x77\\x33\\x78\\x99\\x02\\xd1\\x58\\x87\\x1a\\xb0\\x6d\\xab\\xfa\\xc2\\xcd\\x9d\\x98\\x0e\\x76\\x56\\xa3\\x9b\\xc0\\x7d\\x9d\\xe6\\xc2\\xaa\\x46\\xc8\\xec\\x74\\x2b\\xb8\\x8c\\x2a\\x3e\\xc0\\x64\\xd5\\xdd\\x98\\x0c\\x88\\xab\\xdc\\x69\\xbc\\x03\\x45\\x70\\x49\\x47\\xe3\\xb1\\x44\\xce\\x15\\x43\\x2f\\x3d\\xfb\\xd0\\x69\\xb4\\x23\\x36\\x04\\x51\\x8d\\x83\\x39\\x83\\x86\\x63\\x07\\x65\\x0d\\xb8\\xe8\\x74\\x5d\\x83\\xf7\\xe7\\x30\\x30\\xdb\\xee\\xd0\\xcd\\x94\\x28\\xd0\\x35\\x93\\xe4\\xbf\\x77\\x4d\\x53\\xe7\\x19\\xa5\\xc6\\xf6\\xb0\\x10\\x87\\x87\\x3a\\xf0\\xa1\\xe9\\x4a\\x15\\x69\\x6b\\x11\\x0e\\x65\\xf4\\x0d\\x08\\x5c\\x61\\xa1\\x4e\\x8b\\xca\\x88\\x35\\x66\\xdd\\xf7\\xa5\\xd0\\x5a\\x08\\xfc\\x60\\x3d\\x5d\\x8a\\xe6\\xfa\\x1a\\x73\\x56\\x35\\xd9\\xe6\\x71\\x23\\x3a\\x62\\x61\\x5d\\xe2\\x72\\x45\\x30\\xfd\\xab\\x69\\xde\\x94\\x73\\x0b\\x4e\\x39\\x8a\\x91\\x79\\xf0\\x56\\x77\\x3e\\xf6\\x50\\xea\\xb4\\x54\\xca\\x2e\\x4c\\x5a\\xbd\\x72\\xdb\\xdb\\x53\\xb3\\xce\\xbb\\x92\\xac\\x42\\xaa\\xf7\\xb8\\xac\\xc2\\x08\\x59\\x2f\\x94\\x2e\\xf1\\x4f\\x29\\xc7\\xa8\\xb2\\x46\\x56\\xa4\\x52\\x28\\x2f\\xb1\\x14\\x0b\\x86\\x96\\xd4\\x8e\\x38\\x0a\\xe8\\x7e\\x57\\x24\\xd6\\xbf\\xbe\\x84\\xc2\\xe7\\xf3\\x72\\x5a\\x8b\\x9a\\x53\\x23\\xd7\\x63\\xe4\\xbe\\x50\\x39\\x27\\xbc\\x5d\\x9c\\x81\\x6d\\x1a\\x6a\\x3a\\x0e\\xd6\\xe3\\x41\\xbc\\xc6\\x52\\x45\\x8d\\x3c\\x7d\\xcb\\x04\\xf7\\xeb\\x35\\xee\\xc0\\xbf\\x71\\x12\\xe5\\x98\\x66\\x86\\x5a\\x38\\x39\\x70\\xed\\x3b\\x24\\x1a\\x27\\x95\\x34\\xcd\\x25\\x03\\xe0\\x45\\xdd\\x86\\xea\\x74\\x52\\xa9\\x27\\xc3\\x3d\\x60\\x86\\xcc\\xf7\\xe1\\xee\\x4d\\xc3\\xfe\\x6a\\x7f\\x98\\xf9\\x0f\\xde\\x9e\\xae\\x01\\xa5\\xdd\\x22\\xdc\\xfa\\x2d\\x55\\x6f\\xf3\\x6a\\x0f\\x57\\x28\\x4c\\x90\\xfb\\x4e\\x9c\\x3e\\x02\\xac\\xb1\\x6c\\xd2\\x49\\x97\\x12\\x32\\x49\\x37\\x36\\xc4\\xe4\\xb8\\xbb\\x55\\xf1\\x3e\\x63\\xf0\\x99\\xc2\\xdc\\xd8\\x38\\x82\\xf5\\x0c\\xab\\x6d\\xaa\\xf4\\x61\\x39\\x91\\x3b\\xbb\\x66\\x04\\x12\\xd6\\x8d\\xcc\\xe1\\x77\\x31\\x57\\xaf\\x45\\xdf\\xe1\\xea\\xe5\\x52\\x61\\xdc\\x70\\xf0\\x80\\x46\\xd6\\x63\\x65\\xf6\\x33\\x44\\xfa\\x60\\xc7\\x89\\x46\\x56\\x5b\\xe2\\xd8\\xcc\\x32\\x06\\x2b\\x06\\xa4\\xe4\\xa8\\x0a\\x1b\\x78\\x2b\\x29\\x24\\xb1\\x28\\x81\\x8d\\xce\\x62\\x35\\x73\\xd8\\x57\\x56\\xea\\xaf\\xde\\x50\\xc0\\x75\\xc9\\x70\\x02\\x02\\x00\\x75\\x9a\\x11\\x58\\x3b\\xf7\\x6a\\xaf\\xb3\\x79\\x63\\x3d\\xbe\\x61\\x68\\xcc\\x3c\\xb8\\x33\\x5e\\x28\\x7d\\x8f\\x75\\xdc\\x9f\\x7f\\x1a\\x21\\xc2\\x89\\xad\\x7b\\x58\\xbf\\xa5\\xf8\\x42\\x0e\\xdd\\x4f\\x30\\x20\\xee\\x6e\\xb9\\xf6\\x50\\x47\\x5a\\x74\\x4a\\xd4\\xd4\\x52\\xc0\\xaf\\x77\\x83\\xbf\\x13\\x5e\\x36\\x80\\x4c\\xe0\\xdb\\x66\\xf8\\x76\\x20\\xa6\\x8d\\x98\\xca\\x08\\x79\\xcc\\x88\\x8a\\x63\\xe8\\xd2\\x8f\\x98\\xaf\\x91\\x96\\xfe\\x87\\xcb\\xf6\\x34\\x7c\\x3b\\x24\\xe4\\x1c\\xc4\\xc2\\xba\\xc4\\x81\\x13\\xfc\\xac\\xb6\\x43\\xc1\\xc5\\x34\\xf6\\x86\\x20\\x5e\\x88\\xc8\\x89\\x71\\x62\\xcf\\x6f\\xf9\\x4e\\x75\\x26\\x9a\\x22\\x64\\x35\\xd7\\x15\\xa6\\xc1\\xc7\\x2a\\x33\\x0c\\x95\\x8d\\x40\\xc6\\xdd\\xf1\\x57\\xbe\\x29\\x1b\\xbc\\xc6\\xf0\\x30\\x61\\xca\\xdc\\x0d\\x1c\\xd5\\xaa\\xd0\\x23\\xa1\\xfb\\xd1\\xb8\\xb5\\xa2\\x68\\x5f\\x76\\x53\\x9f\\x2b\\x68\\x04\\x6a\\xd6\\x21\\x4e\\x92\\xd2\\xc5\\x3b\\x09\\xff\\xb6\\x4b\\xe5\\xdc\\x3c\\x22\\x36\\x28\\x4c\\x92\\xac\\x18\\x2b\\xbc\\x07\\x50\\xab\\x71\\xeb\\x02\\xf3\\x60\\x18\\x99\\x04\\xb6\\x96\\xfb\\x8f\\xf5\\xd8\\x36\\x84\\x99\\x68\\x8c\\x50\\xab\\x4b\\x0b\\x09\\x8e\\x3d\\xb0\\xc3\\xab\\x43\\x09\\x9e\\xd6\\xa8\\x47\\xcd\\xcc\\x49\\x91\\x41\\xb5\\x48\\xc1\\x6d\\xf0\\x32\\x0d\\xe8\\x9e\\xf7\\x66\\xf6\\x8c\\x6e\\x13\\x8b\\x68\\x19\\x77\\xb0\\x9d\\x47\\xc2\\x3c\\xda\\x88\\x75\\x98\\x29\\x07\\x37\\x40\\x2f\\xf3\\xbc\\x03\\xdb\\xc7\\x6a\\x28\\xdb\\x6c\\x35\\x49\\x17\\x5a\\x4e\\x6b\\x16\\x64\\x4f\\xd5\\xe0\\xbf\\x7d\\x92\\x71\\x65\\x63\\xfc\\x8f\\x13\\x78\\x9c\\x52\\x5f\\x5a\\xdb\\x98\\x0b\\xa0\\x2f\\x4e\\x59\\xc2\\xe8\\x01\\xa3\\xdd\\x55\\x65\\xf4\\x10\\x05\\xf3\\x20\\x88\\x4c\\x96\\x85\\x62\\xa3\\xce\\xb0\\x4c\\xcc\\x18\\x5d\\x11\\xc6\\x2a\\x75\\xa8\\xda\\x19\\x2b\\x76\\x05\\x4e\\x00\\xe7\\x7e\\x9e\\x85\\xa2\\x67\\x21\\xd9\\x59\\xc8\\x7d\\x23\\x10\\xb0\\xcd\\x41\\x60\\x67\\x81\\xce\\xb3\\x00\\x37\\xa7\\x79\\xa1\\xd4\\x0c\\xd1\\xc3\\xc0\\x3e\\x55\\xf3\\x38\\x8c\\x79\\x1c\\xf2\\x63\\xc7\\xe1\\xaf\\xa7\\x96\\xa8\\x81\\xb2\\xac\\x3d\\x07\\xd2\\x47\\x5b\\x20\\xc0\\xf7\\xb3\\x3e\\xfa\\xc6\\xc9\\xc6\\x9b\\x1e\\xc1\\x02\\xf6\\x21\\x28\\xc6\\x46\\xe0\\x4d\\x1b\\x68\\xac\\xb6\\xc8\\x34\\xcc\\xed\\x5a\\xc8\\xb8\\xf8\\xcd\\xf3\\x08\\x20\\xb8\\x11\\xd8\\x41\\xe0\\x91\\xf6\\x08\\xef\\x93\\x85\\x5b\\x7a\\x03\\xa3\\x9b\\xdc\\x6c\\xb5\\x4d\\x8d\\x2f\\xd7\\x16\\x00\\x2e\\x52\\x87\\x67\\xc8\\xf8\\xc9\\x2a\\xbf\\xdb\\xc9\\xe6\\x68\\x29\\x48\\x32\\xce\\xff\\x8e\\xa0\\x95\\xc9\\xad\\x6c\\x6e\\x7c\\x2a\\x26\\x42\\x37\\x53\\x00\\x6a\\x8f\\xc5\\xcc\\x61\\xa7\\x62\\x11\\x05\\xc4\\xdc\\xe1\\x56\\x3e\\x93\\x28\\xb0\\xe3\\xe0\\x4d\\x72\\xc2\\xc7\\xa6\\xba\\x06\\xe2\\x17\\xaf\\x38\\x74\\x6d\\xab\\xc5\\xa4\\xb7\\x38\\x4c\\xaf\\x18\\xe7\\xb8\\x9c\\x31\\x22\\x12\\x63\\x28\\x17\\x4b\\x15\\x52\\x09\\xaa\\x93\\x07\\x7e\\xb2\\x1a\\xc5\\xd5\\x82\\xcb\\x90\\x96\\x2d\\x6d\\xc3\\x14\\x9a\\x81\\xe6\\xd8\\xda\\x8e\\x85\\x8f\\x9d\\x9c\\x95\\x30\\xc8\\xc3\\x31\\x94\\xba\\x87\\x44\\x2c\\x2c\\x8e\\x98\\x73\\x54\\xf1\\x3a\\x19\\x1a\\x62\\x24\\x9d\\xe2\\xfc\\x6a\\x48\\x2e\\xdd\\x07\\x3a\\xcc\\x9c\\x40\\x8d\\x0a\\x0f\\x6f\\x87\\xbf\\x39\\x7d\\x84\\x44\\x79\\x1c\\xc4\\x63\\xe9\\xbd\\x38\\x07\\x41\\x60\\x30\\x51\\x1e\\x86\\x98\\xed\\xd3\\x55\\x52\\xe4\\xbf\\xbd\\xe0\\x8f\\x9c\\xd3\\xd1\\x45\\x61\\x14\\x6f\\x8a\\x0b\\x75\\xcb\\x38\\x2c\\xf7\\x9c\\x12\\x1d\\x74\\x88\\x02\\xd0\\xd1\\x1c\\x06\\xa6\\x1a\\x3c\\xff\\x04\\x8e\\x0c\\x9d\\xfd\\x81\\x70\\x36\\xb2\\xbd\\x2c\\xc4\\x73\\x6e\\xcb\\xd2\\x42\\xb6\\x85\\x77\\xe6\\x4f\\x77\\xf7\\xf3\\x8e\\x09\\x36\\x37\\x91\\x9d\\x9f\\x71\\x53\\x8e\\x2e\\xbc\\x90\\xb4\\x23\\x76\\xcf\\x3e\\x01\\xc0\\x05\\x55\\x38\\x9d\\x8e\\xc0\\xac\\xfa\\x17\\x8e\\x3b\\x0b\\x8c\\x22\\x81\\x6a\\x20\\x40\\x69\\xe2\\x36\\xb0\\x6e\\x4c\\x49\\xc8\\x41\\xd0\\xa3\\x03\\x0f\\xac\\x5a\\x7c\\xe5\\xee\\xe1\\x34\\xbb\\xbf\\x3d\\xb3\\xab\\x0c\\xf1\\x96\\xb4\\x0a\\x4e\\x52\\xa7\\x55\\x28\\x85\\xd1\\xc6\\x42\\x99\\xd6\\x98\\x8d\\xce\\xd3\\xf3\\x12\\xeb\\x15\\x23\\xf7\\xdf\\xb9\\x83\\xae\\xcc\\x3c\\x10\\x59\\xc9\\x92\\xf3\\x78\\xe5\\xa4\\xe7\\xae\\x2f\\xb9\\xac\\x9c\\xe0\\xe6\\xe2\\x55\\xad\\xd1\\x5e\\xeb\\x42\\x9c\\x56\\xd5\\x52\\xf3\\xfe\\x05\\xcc\\x92\\x11\\x7a\\xe6\\x55\\x65\\xba\\xda\\x91\\xac\\x76\\xf2\\xc3\\x8f\\xfd\\x9f\\x2e\\x30\\x76\\x15\\x3d\\xae\\x85\\xd6\\x28\\xd9\\xd1\\x6b\\xc9\\x2b\\x23\\x7e\\xd0\\xcb\\xca\\x35\\x87\\xdc\\xcb\\x42\\x39\\xaf\\x11\\x22\\x14\\x40\\xb7\\xaa\\x1d\\x57\\x54\\xe2\\x55\\x72\\x49\\x98\\x74\\x08\\x0a\\x23\\x4a\\x52\\x48\\x7b\\x2d\\x26\\xf2\\xef\\x2f\\xf9\\x39\\x86\\xca\\xf3\\x2a\\x88\\xbb\\xd2\\x58\\xb9\\x73\\xa8\\x34\\x14\\xd3\\xae\\xba\\x29\\xf1\\xce\\x47\\x2c\\xc0\\xaa\\xa5\\x1c\\x25\\x5d\\x81\\xe5\\xff\\xf3\\x6b\\x38\\x39\\xa5\\xb5\\x66\\x45\\xba\\xb9\\x2d\\xb1\\x52\\xc7\\x11\\x68\\xbd\\x03\\xf6\\xae\\xb1\\x8a\\x59\\xcb\\x63\\xa9\\x89\\x37\\xd2\\x83\\x0f\\x57\\x72\\x35\\x1a\\x77\\x3d\\x5c\\x2b\\x5f\\xa3\\x41\\xfd\\x2f\\x4e\\x95\\x87\\x83\\xab\\xf3\\x41\\xa5\\xe4\\xa5\\xf4\\x0a\\x4b\\x74\\x89\\xb9\\x98\\xb7\\xa3\\x2c\\xb9\\xe0\\xac\\xd5\\x25\\x96\\x6b\\x1e\\xd3\\xff\\xf5\\x5e\\x14\\x86\\x47\\x5f\\x55\\xc7\\xd5\\xbc\\x4e\\x86\\xec\\xf0\\x0c\\x8c\\x6b\\xeb\\xf8\\xbf\\xf9\\xe5\\x48\\x41\\xac\\x78\\x20\\x9e\\x8c\\x41\\xe8\\x68\\xcc\\x14\\x2c\\x60\\x5f\\xf5\\x7a\\x10\\x5d\\x79\\xa7\\xff\\xdd\\x6f\\x34\\x52\\x68\\x85\\xb1\\x22\\x85\\x33\\xb6\\x5e\\x53\\x53\\x9d\\x79\\x35\\x45\\xa8\\x2b\\xa3\\x40\\x42\\xa0\\x01\\x19\\x81\\x8b\\x2b\\x83\\xfb\\x3f\\xce\\x40\\x5a\\x14\\x15\\x41\\x67\\x7c\\xab\\x23\\xe2\\xf5\\xf0\\x45\\xff\\xe7\\x25\\x0f\\x81\\x04\\x8c\\xc2\\x1a\\xd4\\x22\\xc4\\x7c\\x14\\x30\\x04\\xaa\\x84\\x62\\xb9\\x31\\x16\\x96\\x41\\x40\\x29\\xeb\\x28\\x4f\\x82\\x60\\xac\\x70\\x6b\\x21\\x69\\x91\\xc7\\xe4\\x40\\x66\\xe7\\x54\\x6e\\x91\\x41\\xf7\\xcc\\x14\\x1a\\xf4\\xae\\x19\\x83\\x9e\\x35\\xe3\\xe0\\x97\\xda\\xd5\\xb4\\xd2\\xe7\\x17\\x1b\\x9f\\x05\\x78\\x07\\xc4\\x04\\x0e\\xcc\\xb2\\x4b\\xa1\\x30\\xd2\\x42\\xad\\x1d\\x52\\x3c\\x8f\\xc2\\x6e\\x4d\\xc3\\xfc\\x3c\\x80\\x8e\\xc5\\x62\\xd2\\x05\\x62\\x88\\x0d\\x76\\x94\\x35\\x36\\x06\\xd1\\x0d\\xec\\x41\\x0a\\xa0\\xd3\\x0a\\x6d\\x84\\x78\\x3b\\x5b\\x2a\\x55\\x6f\\x1e\\xbe\\xe0\\x3e\\x8e\\x58\\x7a\\x52\\x3b\\x6e\\x1c\\xe6\\x82\\x2a\\x53\\x0e\\x8a\\x54\\x4f\\xca\\x70\\x9a\\x8f\\xd1\\x59\\x64\\x87\\xb7\\x7d\\xf2\\x23\\x78\\xc6\\x58\\x2d\\xfc\\x32\\x14\\xbd\\xe4\\x1e\\xb8\\xcc\\x80\\x3d\\xd4\\x25\\xc9\\xae\\x6f\\x18\\x73\\x0b\\x33\\x71\\x29\\x4d\\x12\\x25\\x02\\x3f\\xb9\\x99\\x84\\x46\\x00\\x08\\x0f\\x2a\\xbc\\x71\\x0a\\x6a\\x75\\x51\\x50\\x6b\\xbd\\xd2\\x82\\x88\\x2c\\xc3\\xef\\x65\\xce\\x72\\x67\\xd7\\xd2\\x86\\xa4\\x00\\xb3\\x07\\xcd\\xf0\\x41\\x3a\\x83\\x2a\\x78\\xb8\\xda\\x2d\\x2b\\x2a\\xba\\x02\\xbe\\x1a\\xbc\\xfd\\xfc\\x42\\x09\\x4a\\x07\\x49\\xe5\\x85\\x54\\x78\\x58\\x28\\x20\\x39\\x22\\x98\\x34\\x32\\xba\\xb8\\x8f\\x0a\\xe7\\x2d\\xab\\xa4\\xc5\\x12\\x82\\xec\\x8c\\x40\\x50\\x06\\xf5\\xa7\\x9b\\x23\\xf9\\x5e\\xd4\\xcc\\x14\\x79\\xda\\x91\\xe7\\x08\\xee\\x19\\x88\\xee\\x96\\xca\\x04\\x48\\x05\\xcb\\xc1\\x33\\xdd\\xcc\\x81\\xb6\\x7b\\x06\\xac\\x38\\xa3\\x43\\x4d\\xde\\x33\\xb8\\x58\\x7a\\x30\\x27\\xcc\\x50\\xe5\\xe7\\x79\\x3a\\x2a\\x49\\x46\\xbe\\xbb\\xe5\\xc6\\x21\\x8f\\xea\\x39\\x80\\x36\\x3f\\xb9\\xcc\\xa0\\xa7\\x2d\\xa6\\x4d\\x79\\xac\\xc5\\x09\\x3c\\x59\\x36\\x41\\xca\\x9e\\x31\\xa2\\x22\\x37\\xa3\\xb8\\xc6\\xb6\\x81\\x51\\x37\\xc0\\x86\\x19\\xa4\\x46\\x83\\xed\\x75\\xb8\\x0e\\x2d\\x3e\\x5a\\x8d\\xbd\\x44\\xbd\\xaa\\xcd\\x07\\x08\\x9f\\x77\\xcf\\xa8\\x19\\xfd\\xc2\\x4e\\xef\\x6e\\x3e\\x21\\x22\\xe6\\xc9\\x47\\x38\\x8c\\xc6\\x3d\\xe6\\x94\\x1e\\x5e\\xa6\\x2f\\x2e\\x10\\x3d\\x57\\xb0\\xfb\\x53\\x36\\xdb\\xc9\\xce\\xc7\\x68\\x0a\\x9f\\x76\\xb3\\x6a\\x28\\xd1\\xae\\x32\\x49\\xcc\\x13\\xab\\x8f\\x86\\xd2\\xcb\\x75\\x37\\x42\\x15\\x77\\x95\\x4b\\xf0\\x7e\\x5b\\xfe\\x6c\\x55\\x38\\x62\\xe9\\x59\\x8c\\x34\\x43\\x4f\\x25\\xc2\\xe9\\xcf\\x03\\x91\\x07\\x6c\\x6a\\x7d\\xfd\\x76\\x3a\\x62\\xcd\\xf7\\x6a\\x8e\\x58\\x33\\xf4\\x8c\\xf9\\xe7\\xb9\\x9e\\x06\\x28\\x1c\\xa9\\xe5\\x3c\\x59\\xe6\\xce\\xd2\\xf3\\x1c\\x5a\\x32\\x3c\\x83\\xb5\\x30\\x36\\xb1\\x45\\x28\\x31\\xaf\\x1b\\x61\\xea\\x39\\x5b\\x30\\xa2\\x23\\x8e\\xa2\\x76\\x1f\\xf0\\x31\\x7c\\xfb\\xc8\\x1a\\xcb\\xfd\\x62\\x0b\\x5a\\x2c\\xb9\\x19\\xa2\\xf6\\x04\\x80\\x31\\x09\\xfb\\xd1\\xe7\\xec\\x8a\\x40\\x7f\\x71\\x52\\x0f\\x8c\\x59\\x48\\x96\\x19\\xa8\\xdb\\x72\\x90\\x39\\x10\\x11\\x01\\xee\\x66\\x02\\x53\\xe0\\xbe\\x8d\\xd3\\x30\\xce\\x79\\x37\\x93\\x8b\\xfa\\xa1\\x86\\x0d\\x95\\x3e\\x9d\\x4c\\x6e\\x50\\x78\\xfc\\x63\\x9e\\x8b\\x15\\x48\\x84\\x90\\x60\\x91\\x07\\xec\\xd2\\x5e\\xe1\\x1b\\xd8\\x62\\x47\\x5c\\xa8\\x87\\x96\\x0e\\xb5\\x74\\x33\\x60\\xf4\\x4c\\x39\\x64\\xa3\\xaa\\x22\\xfe\\x39\\x13\\x2d\\x10\\x33\\xb5\\x45\\x23\\xb3\\x3a\\x18\\x3e\\xf1\\xf9\\xe2\\xa4\\xaf\\x61\\x39\\x16\\x25\\x19\\xf4\\x6b\\x35\\x38\\x87\\x0e\\x66\\xcb\\x6e\\x16\\x97\\x25\\x34\\x6f\\x60\\x68\\x57\\x8b\\xdb\\x18\\x53\\x12\\x6c\\x2d\\x80\\x74\\xe8\\x0c\\xb1\\xb2\\x02\\x1b\\x4b\\x68\\x39\\x20\\x8d\\xbc\\x39\\x93\\xb2\\x4e\\xef\\x37\\x0e\\x40\\x1f\\xee\\xfc\\x36\\x91\\x64\\x19\\x21\\x40\\xe6\\xd2\\x02\\xd2\\x5b\\xba\\x93\\x7b\\xa0\\x9a\\x88\\x2e\\xb1\\x72\\x9a\\xde\\x6e\\x38\\x39\\x61\\xf5\\xf6\\x6e\\xa9\\x94\\x48\\x6f\\x6b\\x57\\xce\\xcb\\xcb\\x8b\\xb2\\xc9\\x15\\x27\\x93\\x40\\x25\\x60\\xa2\\x7d\\x5c\\x7c\\x4d\\x24\\x35\\x0c\\x95\\x0a\\x6d\\xba\\x39\\x8c\\x72\\x9e\\x2f\\x0c\\x41\\x15\\x6f\\xe0\\xcc\\x9a\\xe8\\x92\\xbe\\x3b\\x4d\\x7e\\x78\\x5e\\x0c\\x1c\\x53\\x46\\x1a\\x15\\x23\\x53\\x2b\\x70\\x85\\x7f\\x63\\x74\\xa3\\xf4\\x38\\x8e\\x77\\xdf\\x71\\xba\\xe7\\x32\\xb1\\xd0\\x08\\xa5\\xe9\\xa2\\xdf\\x28\\x17\\x8f\\x40\\xa8\\x66\\x83\\x35\\xad\\xfb\\x9d\\xb0\\xdf\\xf5\\xfe\\x40\\xc7\\x59\\x2e\\x61\\xf4\\xde\\x00\\xc4\\x76\\x3b\\x62\\x61\\x48\\xd8\\xa3\\xbf\\xa2\\x87\\x1d\\x02\\xa7\\x6e\\x2a\\xaa\\x54\\x5a\\x0a\\xa9\\x70\\xef\\xc1\\xea\\x38\\xec\\x14\\x3c\\x7f\\x10\\x02\\x14\\xf2\\xaa\\x39\\x29\\xac\\x27\\x18\\x57\\xee\\x95\\xf3\\x1c\\xdc\\x93\\xaa\\xab\\xe8\\x73\\x20\\xbe\\x11\\xf9\\x1a\\x40\\x7a\\x35\\xb5\\xcb\\x08\\xad\\xe6\\x83\\xa8\\x2d\\x9c\\xe4\\x18\\xe0\\x9e\\xa6\\x11\\x4c\\x78\\x76\\x90\\xe8\\xf4\\xb4\\xc9\\x99\\xe3\\x01\\x6a\\x09\\xe5\\x8c\\xcc\\xe0\\x8d\\xb0\\xc7\\xc1\\x20\\x20\\x1e\\x6b\\xac\\xcd\\x80\\x8d\\x27\\x2e\\x40\\xaa\\xdb\\x3e\\xc9\\x93\\x7e\\xaa\\xef\\xad\\x02\\xa2\\x37\\x4b\\x52\\xd0\\x53\\x09\\x6f\\xe6\\x99\\xb6\\xc2\\x4e\\x6b\\xb4\\x7c\\x8f\\xe4\\x89\\xc2\\xf9\\xa2\\x35\\xa1\\x32\\x8e\\xd8\\x68\\x91\\x04\\x4c\\xda\\x96\\x88\\x4f\\x0d\\x15\\x17\\x32\\x1d\\xf8\\xc0\\xe9\\x8a\\x1d\\xf8\\xa5\\x43\\xb9\\x3e\\x2d\\x62\\x95\\xc5\\x54\\x74\\x3d\\xda\\x16\\x41\\x31\\x51\\x6d\\x81\\x7c\\x46\\xd3\\x2f\\xa9\\x06\\x6a\\x1d\\x5c\\x0d\\x60\\xd9\\x64\\xdc\\xbc\\x74\\xb2\\xb0\\xb0\\x33\\xcd\\xee\\xe7\\xee\\x87\\xac\\x59\\xb4\\x78\\xee\\xa3\\x46\\x3b\\x99\\x17\\xa9\\xba\\x23\\x85\\x61\\x67\\x25\\x95\\x54\\x5d\\x0f\\x6a\\x0e\\x3d\\x2f\\x5c\\x57\\x6c\\x2a\\x68\\x80\\x1c\\x3c\\xeb\\x24\\xc8\\x6e\\x3f\\x69\\x8b\\xc3\\x7d\\x6b\\xaa\\x39\\xcc\\xfb\\xa1\\x5a\\x15\\xa4\\xd1\\x8b\\x19\\x5e\\x27\\x21\\x23\\x36\\x1b\\xf0\\xa5\\x1e\\x02\\xb8\\x8f\\xd0\\xf2\\x75\\x26\\xfb\\x22\\x8e\\x2e\\x1b\\x72\\x4f\\xcd\\x18\\x02\\x82\\xdb\\x10\\x7d\\x0b\\xc6\\x57\\x80\\xe6\\xf7\\x14\\x4e\\x38\\x20\\xe0\\x18\\x6d\\x23\\xc8\\xae\\x53\\xb6\\x0d\\xbe\\x50\\x72\\xdc\\xfb\\x68\\xd9\\x5a\\xc3\\xdc\\x44\\x08\\xd1\\x78\\xfd\\x06\\xf3\\x98\\x97\\x72\\x0e\\x34\\xb5\\xdd\\x88\\x39\\x3a\\x4e\\xf3\\x3d\\x56\\x83\\x17\\xdd\\xed\\xf1\\x0b\\xae\\x1a\\xd9\\x5d\\x21\\x6a\\xe7\\xe6\\xee\\xb1\\x1f\\xe7\\xb6\\x83\\xb8\\xa4\\xc0\\x4f\\xad\\xf7\\x61\\xfc\\x24\\xb2\\xa2\\x17\\x26\\xce\\xdc\\x3b\\x98\\xcb\\x3e\\x9c\\x4b\\xb1\\xcf\\x58\\xa5\\x6e\\x68\\x38\\xd7\\xd4\\x40\\xcd\\xe6\\xb8\\x61\\xb0\\x18\\x10\\xd5\\xae\\x80\\xd3\\x6a\\x7e\\x8b\\x69\\x67\\x04\\x16\\x91\\x98\\x83\\x1f\\xa7\\xc4\\x37\\x66\\xc0\\x64\\x01\\xb4\\xcd\\x0b\\x2d\\x54\\xaf\\xb8\\x40\\x59\\xee\\x6e\\xb9\\xf4\\x50\\xb3\\xf8\\xf8\\x0c\\xfe\\xb4\\xb1\\xe7\\x3c\\x89\\xd8\\xee\\x9f\\x35\\x32\\x69\\xb5\\x34\\x00\\x90\\x44\\x71\\x9e\\xf0\\xe7\\x5c\\xf6\\x3c\\xab\\x76\\x20\\xb9\\x07\\x25\\x25\\xf4\\xc3\\x30\\x1a\\xd8\\x25\\x5b\\x3d\\x97\\x00\\xcf\\xb4\\xf3\\xc0\\x8a\\x79\\xed\\xf5\\x60\\x55\\x36\\x0e\\x81\\xfe\\x07\\x92\\xec\\xc9\\x1d\\x6e\\xed\\x1a\\x38\\x5d\\x66\\x9e\\xd4\\x3d\\x70\\x0a\\xcd\\xc5\\x41\\xb7\\xd5\\xae\\xff\\xf3\\xb0\\xe8\\x98\\x21\\x4e\\x5d\\x0f\\x8f\\x9b\\x65\\xd9\\x8a\\xda\\x26\\x81\\xa4\\x07\\x92\\xb6\\xab\\x96\\x2e\\xe4\\x74\\x0d\\x67\\xf8\\xaa\\xe8\\x34\\x96\\x0d\\x08\\x2c\\xe6\\x94\\x32\\x3c\\xeb\\x3e\\x18\\x15\\xfe\\x47\\x2c\\x15\\x41\\xf2\\xaa\\x9a\\xdd\\x63\\x3b\\xb1\\xe8\\x12\\x3a\\x75\\x9c\\x61\\x1d\\x4c\\xf6\\xa4\\x91\\x11\\x20\\x37\\x09\\x95\\x31\\xbc\\x64\\xc8\\x48\\x33\\x05\\x11\\x90\\xf8\\x88\\x45\\xe0\\x18\\xbd\\xa2\\xc6\\xbe\\x72\\xbb\\x2e\\xc1\\x33\\x4b\\x63\\x61\\x19\\x47\\x1d\\x1d\\x65\\x5d\\xf0\\x0b\\x69\\xe5\\x88\\x5d\\xe5\\x2a\\x8d\\x19\\x65\\x4d\\xf5\\xee\\x36\\x93\\x22\\xf3\\x9c\\x9c\\xf2\\x97\\x42\\x93\\xbd\\x51\\x90\\xb4\\x88\\xad\\x70\\x2b\\x96\\xf0\\xb5\\xab\\x5d\\xdf\\xf2\\x8c\\x9a\\x1b\\x45\\xbe\\x9d\\x0e\\x65\\x84\\xcb\\xed\\x23\\x88\\x15\\x2a\\x6c\\x1e\\x1e\\xeb\\xff\\x75\\xd2\\x98\\xd4\\xc2\\x45\\x0c\\x97\\xdb\\x66\\x95\\x8a\\x2c\\xfd\\x28\\x79\\x18\\x57\\x1c\\x07\\x02\\x0e\\xd9\\x99\\x95\\xae\\xa3\\x8a\\xcc\\x41\\xc5\\x32\\xf3\\x92\\xe7\\x39\\x87\\x73\\x81\\xe7\\xca\\x70\\x92\\x9b\\x72\\xb4\\xd6\\x97\\x68\\xe4\\x50\\x5a\\x10\\xb9\\xee\\x83\\xb6\\x33\\x4b\\x5e\\xf7\\x42\\x27\\x27\\xae\\xf3\\x85\\xe9\\x66\\x47\\xd7\\xa2\\x5f\\xd1\\xf2\\x68\\xa8\\xdb\\xf1\\xea\\x2d\\xa0\\x7a\\x48\\x81\\x38\\x96\\x66\\x64\\x47\\xa1\\xd0\\xea\\x26\\xc9\\xe6\\xef\\xfe\\xe4\\x5d\\x5c\\xee\\x86\\x06\\x80\\xf9\\xbd\\x2a\\x83\\xa7\\xcf\\xf9\\x4c\\xde\\x73\\xce\\xb7\\x73\\x26\\x39\\xb4\\xab\\xe4\\xe9\\xff\\xfb\\xb5\\x18\\x2c\\x36\\x7d\\xed\\xf7\\xa3\\xc3\\x75\\x46\\x87\\x11\\xfd\\xef\\x49\\xd6\\x5c\\x47\\xc8\\x92\\x21\\xa3\\x11\\x1d\\xee\\x67\\x74\\x58\\x06\\x78\\x0a\\xb4\\x66\\xb5\\xfe\\x4b\\x19\\x6b\\x54\\xd3\\x20\\xf6\\x35\\xa2\\x5a\\x50\\x6b\\x97\\x1c\\xc8\\x23\\x22\\xe1\\xec\\xea\\x6e\\x5c\\x2f\\x29\\x2b\\xbe\\x1b\\x5b\\x3d\\x88\\x58\\x75\\x20\\xb4\\xfb\\x58\\xb2\\x05\\x83\\xb3\\x2c\\xdc\\x66\\xd4\\xbf\\x5d\\x33\\x6a\\x7e\\x77\\xea\\xc7\\x74\\x0c\\xa9\\x0b\\x49\\x39\\xe2\\xe0\\x4d\\x44\\xc1\\x48\\xcf\\xe0\\x1c\\xab\\x2a\\x30\\x96\\x15\\x30\\x21\\xcc\\x16\\xa4\\x77\\x28\\xfc\\x85\\x05\\xc5\\x2d\\x54\\xfd\\x3a\\x9c\\x9d\\xbb\\x65\\x0e\\x49\\xdf\\x86\\xb1\\x99\\x54\\xcb\\xf4\\x0d\\x3f\\x44\\x4d\\x6b\\xb8\\xc4\\x22\\x55\\xd5\\xeb\\x7a\\xf4\\xa4\\x1e\\xb5\\xaa\\xfc\\xae\\x62\\x9e\\xff\\xe4\\x1c\\xcc\\x52\\x2f\\x39\\x57\\x76\\x3c\\x5a\\xb0\\x34\\xd1\\x14\\x3c\\x05\\xd4\\x58\\x9c\\x90\\x04\\x7e\\x80\\x6c\\x2f\\xec\\x58\\xab\\x4e\\x47\\xac\\x84\\x68\\x76\\x3b\\x6a\\x31\\x00\\x70\\x72\\x36\\x4b\\x55\\x49\\x09\\x58\\x3d\\x66\\xe1\\xb0\\x71\\x26\\x9e\\x7a\\xb9\\x0d\\x5d\\xe0\\xca\\x65\\xb9\\x5e\\x81\\xe2\\xeb\\x4b\\x82\\x85\\x4f\\x22\\x78\\x17\\xb5\\x6e\\x45\\x4c\\xf4\\xd5\\xd7\\x44\\x9f\\x39\\x22\\xf2\\x45\\xf4\\xf1\\x29\\xfa\\xcc\\x2f\\xe4\\xa2\\x8f\\xde\\x5d\\xf4\\xd5\\x29\\xfa\\x3a\\x7c\\x38\\xd3\\x1c\\x1c\\xe4\\x6a\\xd3\\x1e\\x71\\x8a\\xbe\\x2b\\x1c\\x89\\x6f\\x4e\\xc6\\x76\\xb6\\xa7\\xaa\\xc1\\x5b\\xd5\\x74\\xd3\\x51\\xd7\\x40\\xa5\\x81\\xb6\\xa3\\x90\\x83\\xaa\\x13\\xcd\\x48\\x17\\xd1\\x92\\x4a\\x44\\xf1\\x77\\xb3\\x2c\\x46\\xac\\x0e\\xfc\\x0b\\xce\\x71\\xa4\\x12\\x7c\\xb1\\x38\\x95\\xdd\\xa2\\x20\\xb6\\x84\\x1e\\xbc\\xb3\\x32\\x20\\xa0\\xba\\x48\\xbe\\x40\\xa1\\x61\\x86\\x25\\xc8\\xfd\\x9e\\x06\\x7f\\xda\\x57\\x88\\x1d\\xaa\\x7d\\xd5\\x43\\x6e\\x90\\x46\\x9d\\xad\\xae\\x8d\\x05\\x1b\\xf7\\x9a\\xce\\xb4\\xb4\\xa1\\xb6\\xae\\xe7\\x4d\\x45\\x6e\\x0e\\x61\\x38\\x9b\\xf3\\x5e\\x91\\x53\\xb1\\xf4\\x12\\x39\\x9d\\xf7\\xc5\\x80\\x1f\\xac\\x1e\\xb9\\xd4\\xe9\\xa8\\x7c\\xa6\\xa1\\x44\\xd0\\x23\\x9b\\xd7\\xa4\\x2a\\xe7\\xbe\\xf5\\xbc\\x2b\\xfb\\x87\\x5e\\x6f\\x5f\\xa9\\xd3\\x82\\xdf\\xa3\\x8f\\xb2\\x5c\\xcd\\x58\\xff\\xfd\\xc5\\x4b\\xa4\\x16\\xb7\\x93\\x56\\xf2\\x40\\xa2\\xb3\\x8a\\x1d\\xf8\\x81\\xaa\\x27\\xec\\x51\\x51\\x71\\x74\\xf1\\x03\\xdd\\x67\\x4f\\x23\\xd7\\x13\\x29\\x09\\x36\\x29\\x6e\\xec\\x93\\xb8\\x89\\x18\\x99\\x66\\xee\\xbe\\x17\\x22\\xe1\\x0b\\x2a\\xcf\\x26\\x4c\\xf9\\xe2\\x04\\x32\\x6e\\xe4\\x24\\x98\\x53\\x1a\\x47\\xcc\\x55\\xcf\\x4b\\x21\\xf3\\x02\\x49\\x1f\\x1b\\x5c\\x4e\\x1c\\x10\\xc4\\x30\\xc4\\x68\\xd8\\x53\\x65\\x8a\\x45\\x68\\xd9\\xd0\\xce\\xc8\\x76\\xea\\xeb\\xf0\\x0a\\x36\\xfa\\x4a\\x08\\x76\\xc1\\xb7\\x93\\x80\\xd6\\x59\\x51\\x0f\\x43\\xcc\\xca\\x4c\\xb6\\x84\\x69\\x98\\x2d\\x14\\x95\\xc7\\x1e\\x2d\\x92\\x35\\x2e\\x3e\\x42\\x1b\\xfb\\x01\\x6a\\xf0\\x83\\x33\\xbc\\x9d\\x94\\xa0\\xdc\\x50\\x42\\x89\\x04\\x21\\xf0\\xc4\\xba\\x5b\\x2c\\x56\\xac\\x60\\x1a\\xe1\\x69\\x9d\\x60\\x91\\xe9\\xe0\\x2c\\x66\\x97\\x6e\\x84\\x0d\\x1e\\xf0\\x23\\x1f\\x24\\x6d\\x21\\x19\\x97\\x8a\\x02\\xed\\xc8\\x83\\x37\\x28\\x28\\x73\\x24\\xd0\\x74\\x24\\xe8\\x2e\\xcf\\x15\\x8c\\xf5\\xe4\\xdb\\xc0\\x33\\x4e\\x51\\x1c\\x2e\\x91\\x25\\xc4\\xe9\\x51\\xe6\\x31\\xeb\\x36\\x98\\x27\\x21\\x5b\\x75\\x88\\xe1\\x29\\xf0\\x9e\\xaa\\x65\\xe1\\x45\\x38\\x3a\\x27\\x1e\\x9f\\xb9\\xea\\xe5\\x24\\x07\\x12\\x7c\\x0e\\xbd\\x87\\x1d\\xc8\\x91\\x41\\xf2\\x67\\xb5\\xf8\\x2d\\x23\\x51\\xad\\x4f\\x4b\\x49\\x6c\\x63\\xda\\x6c\\x93\\x68\\x40\\xd3\\x25\\x60\\x44\\x5f\\x0b\\x4f\\x8e\\x7b\\xb3\\x5d\\xae\\xa6\\xe9\\x7e\\x3b\\x21\\x95\\xc2\\x8d\\x63\\x48\\x5f\\x08\\x2c\\x2a\\x48\\x3b\\xd5\\xee\\x43\\xb1\\x22\\x4c\\xaa\\x92\\x76\\x32\\xbf\\x2f\\x6f\\xe6\\x73\\x66\\x2b\\xcd\\xc2\\x2b\\x4a\\x17\\x52\\x26\\x38\\xc5\\x01\\x69\\x29\\x14\\xda\\xad\\xb6\\x8c\\x65\\xcd\\x64\\xab\\x6a\\x35\\xfd\\xc5\\x9b\\x5e\\x72\\xfa\\x3a\\xfd\\x90\\x8a\\xe5\\xd9\\xec\\xb1\\x61\\x31\\x54\\xf5\\x00\\xb8\\xd3\\x11\\x73\\x69\\x8f\\x70\\xf1\\xbe\\x9b\\xfe\\x40\\xa0\\x2c\\x0b\\x5e\\x3b\\x61\\x4e\\x07\\x36\\x76\\x27\\x05\\xc0\\xc9\\x5f\\xe0\\x14\\x9e\\x1e\\x07\\x36\\xdf\\x8e\\x42\\x6f\\x77\\x74\\x02\\x97\\x01\\x21\\x01\\xff\\xeb\\x8e\\xee\\x62\\x74\\x8a\\x56\\x83\\x24\\xcb\\xf8\\xce\\xcd\\x00\\xb1\\xbe\\xce\\x66\\xc5\\xff\\xe0\\x6d\\x1c\\x58\\x27\\xc3\\x86\\x90\\x94\\x78\\x05\\x1a\\x60\\x34\\x37\\x4b\\x31\\x37\\x46\\xb3\\xda\\xd8\\x65\\x60\\x9e\\xb2\\x84\\x3a\\xad\\x08\\x64\\x23\\xe5\\x61\\x64\\xbe\\x91\\xd5\\xca\\x6b\\x46\\x49\\xb1\\xfa\\x5f\\x96\\xa9\\xa1\\xeb\\xba\\x31\\x68\\x96\\x02\\x27\\x66\\x6e\\x6b\\x84\\x1c\\x41\\xb2\\x36\\x42\\xab\\xe6\\x60\\xbf\\xf8\\x01\\x92\\xfb\\x98\\x0c\\x17\\x65\\xab\\x78\\xe1\\xd9\\x95\\x39\\x21\\xb2\\x9d\\x82\\x43\\x34\\x73\\xed\\x9f\\x9b\\x74\\x8f\\x6a\\x22\\x65\\xb6\\x4a\\x62\\x66\\xf0\\x72\\x41\\x75\\x06\\x78\\x32\\x41\\xc0\\xea\\xa0\\x53\\xab\\x76\\x55\\x21\\x85\\x04\\x43\\x94\\x36\\xd3\\xa5\\x37\\xa9\\xe7\\x75\\x3e\\x5d\\xbe\\xce\\x92\\x94\\x74\\xda\\xa3\\x4e\\xe5\\xec\\x1e\\xe0\\x8d\\x5e\\xed\\xc5\\xf9\\x5b\\x37\\x93\\x7b\\xa8\\xdb\\xcc\\x4a\\x34\\x8c\\xa2\\x2b\\xfd\\xf0\\xa6\\xd8\\x2f\\xe6\\x52\\xa7\\x62\\x0c\\x4d\\x35\\xf3\\xab\\xee\\xdb\\x55\\x85\\x1e\\xd7\\xcd\\xeb\\x4a\\x95\\x49\\xe6\\x73\\x8a\\xfe\\x6a\\xfe\\x67\\x9e\\xbe\\x0e\\x26\\xf8\\x3a\\x36\\x23\\x79\\x80\\xf1\\xda\\x21\\xfb\\x3d\\x8d\\x1e\\x64\\xf3\\x72\\x41\\x0a\\xc0\\x02\\x48\\x54\\x82\\xab\\xac\\xcd\\x63\\x6a\\xf5\\x23\\x38\\x8d\\xd0\\xf3\\x9a\\x8d\\x31\\xb4\\x81\\x59\\x06\\x82\\x57\\xe4\\x61\\x9f\\x36\\x58\\x89\\x90\\xd0\\x39\\xf4\\xb1\\xc5\\xca\\xa8\\xf5\\xa2\\x83\\x2e\\xed\\x40\\xe6\\x62\\xcb\\x21\\x07\\xea\\x63\\xd7\\x37\\xaa\\x75\\x89\\x4c\\x57\\x8e\\xc7\\xdf\\x4d\\x7d\\xd5\\x42\\xa6\\xbc\\x72\\x28\\xcc\\x8b\\x8a\\xc0\\x58\\x98\\x5d\\x60\\x79\\xd6\\x03\\x62\\x11\\xd9\\xc2\\x02\\x17\\xb7\\x34\\x1c\\x9c\\xdd\\xcb\\x48\\xe8\\xa1\\x18\\x21\\x87\\x31\\x9d\\x4b\\x7b\\x27\\x54\\x8b\\xdb\\x4b\\x0d\\x96\\xc3\\x9c\\xa6\\x6f\\xe6\\x28\\xa4\\x18\\x2c\\x1d\\xb1\\x1b\\xc5\\x30\\x37\\xf3\\xeb\\x02\\x58\\xa3\\x1e\\x94\\x0a\\xe8\\x6c\\x3e\\xbb\\x84\\xe4\\xfa\\x95\\x43\\xa3\\xfb\\x2e\\x5e\\x72\\x03\\x71\\x9f\\x79\\x97\\x39\\x9f\\xd9\\xa3\\x26\\x81\\xeb\\xe4\\x04\\xa9\\x32\\xb2\\x68\\x84\\xcc\\xea\\x36\\x34\\xda\\x95\\x18\\xfc\\x71\\xc9\\x82\\x53\\xa4\\xd8\\xea\\xa4\\x76\\xca\\xdc\\xf4\\xe2\\x3e\\x17\\x1d\\x38\\x58\\xc7\\x2b\\x5b\\xa1\\xd6\\xbc\\xaa\\x04\\x94\\xdc\\x37\\x14\\x95\\x14\\x1c\\x51\\x30\\x07\\x8d\\x2e\\xa6\\x78\\x40\\x4c\\x1f\\x5a\\x79\\x0c\\x8b\\x7d\\x11\\x4a\\x55\\xe9\\x7e\\x13\\x5e\\x22\\x51\\x5e\\xa3\\x28\\xb6\\xbf\\x46\\x45\\xfa\\xc3\\xcc\\xa9\\xb4\\x11\\x2a\\xc2\\x38\\x6d\\x9f\\x3c\\x1d\\xe8\\x9e\\xe7\\x6d\\x3c\\x0a\\xb8\\xd0\\x2d\\xfc\\x5f\\x5b\\x5e\\xa9\\xa6\\x50\\x6b\\x5e\\x46\\x5a\\x69\\x8c\\x10\\x6b\\x65\\x35\\x10\\x54\\x79\\x67\\x95\\x45\\xcd\\x18\\x57\\x34\\xf2\\x4e\\x56\\xf8\\xb1\\xed\\xd0\\x71\\x87\\xd0\\x42\\x2a\\xb2\\xe0\\xb1\\x42\\x9e\\x06\\xa4\\x63\\x6e\\x97\\x54\\xad\\x98\\x2b\\xf2\\x48\\x48\\xd4\\x8c\\xb2\\x5c\\xc7\\x15\\x29\\xc5\\x6a\\x74\\x3f\\xc2\\x48\\xfd\\xde\\x6d\\xe3\\x1a\\xd2\\x2a\\x92\\x42\\x6e\\xc5\\x78\\x01\\xb9\\xd2\\x42\\x95\\x57\\x56\\x69\\x23\\xb9\\xae\\x2c\\x12\\x24\\x57\\x0f\\xe6\\xab\\x82\\xc8\\xa5\\xac\\x02\\x61\\xd4\\x69\\xd1\\x0d\\x61\\x3c\\x58\\xa9\\x7a\\x66\\x71\\x19\\x00\\xcf\\xb5\\x0c\\xec\\xbf\\xf7\\xb2\\x79\\x00\\x9a\\x75\\x6d\\x1d\\xb1\\xd1\\x6a\\xb6\\x8e\\x47\\xf6\\xaa\\x39\\x4f\\x56\\x48\\xea\\x0d\\xdc\\x14\\xa0\\x83\\xbe\\xbb\\xfb\\x1a\\xb5\\x2b\\xcb\\x74\\x5e\\x9d\\x86\\x98\\x00\\x5f\\x93\\xc8\\x8a\\x82\\x8f\\xba\\xb6\\x1c\\x7a\\x05\\xa5\\x21\\xd4\\xba\\x50\\xe7\\xe9\\x23\\xbf\\xbf\\x78\\x4c\\x73\\xf1\\x80\\x5c\\x56\\x6e\\x30\\x41\\xfa\\x4a\\xad\\x87\\x92\\xb0\\x60\\x8d\\x43\\x16\\xe3\\xec\\xed\\xec\\xf9\\xcc\\xaa\\xa9\\x4d\\x20\\xa9\\xf2\\x91\\x7b\\x9e\\x9a\\x59\\xf1\\x05\\x84\\x33\\x4b\\xe7\\xa8\\x2d\\x85\\xd5\\xb2\\xe9\\x13\\x6f\\x5e\\xf9\\x17\\xfe\\x63\\x7d\\x5b\\x8f\\x29\\x36\\x27\\xd4\\x58\\x9a\\x1a\\xa4\\x4f\\x09\\xfd\\x8a\\xb9\\x7a\\xf7\\x26\\x5d\\xa2\\xf4\\x14\\x5a\\x6a\\x4b\\x2c\\xd2\\x8c\\x2d\\xc1\\xcd\\xd9\\x12\\xa5\\x2a\\xc4\\x4f\\x63\\x29\\xa5\\xbc\\x4e\\x96\\xe0\\xfb\\x64\\x09\\xbe\\xf2\\xa8\\xff\\x67\\x3e\\x6a\\x84\\x5c\\xdb\\x41\\x54\\x16\\xb5\\x68\\x2d\\x36\\xc1\\xc6\\x30\\x83\\x82\\xc1\\x76\\x30\\xe5\\x9f\\x82\\x14\\x35\\x83\\x24\\x48\\x69\\x56\\xd7\\x0d\\x1e\\x6b\\xaa\\x7d\\x83\\xcd\\x9f\\x2c\\x7e\\xa7\\x18\\x78\\x05\\x5e\\x85\\x2d\\x04\\xe7\\xb0\\x4e\\xbc\\xee\\xb6\\x0d\\x6e\\xfd\\xd2\\x02\\x7e\\x0a\\xb5\\x15\\x95\\x78\\x9d\\x96\\x24\\x56\\x00\\x46\\x6f\\x03\\xc3\\x7c\\x9c\\xa2\\x72\\x41\\x81\\x5d\\x1d\\x66\\x6c\\x6a\\x2e\\x19\\xd2\\x69\\x2d\\xb4\\x19\\xba\\x2d\\x46\\x6d\\x43\\xee\\x27\\x38\\x8b\\x7a\\x16\\xd7\\x1e\\xac\\xf0\\x0e\\x09\\x12\\x45\\x83\\x2a\\x1a\\xb5\\xaf\\x14\\x05\\x2f\\xf1\\x1a\\x56\\xfe\\x7f\\x7d\\x4b\\x63\\xf3\\xa7\\x71\\x50\\xcd\\x79\\x21\\xd4\\x76\\xd3\\x4f\\xd7\\x09\\xda\\xff\\xdf\\x2c\\xbc\\xd5\\x03\\x51\\xef\\x88\\x47\\xd4\\xbc\\x21\\xad\\xca\\xc3\\xd5\\x80\\xd7\\x8a\\x91\\x11\\xcc\\x6b\\x97\\x38\\x26\\xe2\\x8c\\xc3\\x27\\x24\\xb7\\x59\\xd7\\xd6\\xc8\\x88\\xa8\\x5d\\x10\\x62\\xa1\\x05\\x19\\x3a\\xe0\\x92\\x64\\x84\\xaa\\x3c\\xe1\\x3f\\xe6\\x66\\x8e\\x02\\xea\\xbc\\xd6\\xb3\\xde\\x10\\x14\\xab\\x93\\x62\\xa7\\x63\\xd9\\xb8\\x6f\\x20\\x30\\x52\\xed\\x58\\x7b\\x22\\xd9\\x10\\x17\\x02\\x90\\x60\\x45\\x74\\x6d\\x67\\x95\\xc3\\xa7\\x79\\xa8\\xd3\\xdb\\x73\\x28\\x03\\x2e\\x7e\\xa2\\x15\\xe5\\x0c\\x18\\xe9\\x65\\xdd\\x4a\\xd1\\x50\\x0b\\x1b\\x56\\x1a\\xd5\\x57\\x5b\\x0f\\x92\\x64\\xad\\xc1\\xf6\\x01\\x3c\\x13\\xc5\\x68\\x62\\x6d\\x26\\xb0\\x94\\xf4\\x48\\xae\\xc0\\xff\\x7f\\xa9\\x81\\x58\\xa1\\x15\\xba\\xe5\\xc0\\x91\\x10\\x02\\x37\\x85\\xbc\\x04\\x08\\xb3\\x33\\xdd\\x3a\\x39\\xfc\\xec\\xc8\\x82\\x36\\x92\\x47\\x6b\\xc6\\xa0\\x1c\\x4e\\x28\\x51\\x81\\xa2\\x48\\x75\\x45\\x85\\x8c\\x6e\\xf1\\x71\\x94\\x39\\x37\\x1f\\x1e\\x4f\\x57\\xaa\\x05\\x13\\x1b\\xcf\\xf2\\xa1\\x88\\x3f\\x5c\\x92\\xe4\\x68\\x18\\xe7\\x56\\x1f\\x64\\xb4\\x91\\x56\\x81\\x28\\x54\\x8f\\x75\\x3e\\xb9\\x6c\\x56\\xc7\\xf5\\x0a\\xa2\\xfa\\xf5\\x27\\xdf\\x3f\\x4f\\xcf\\xae\\xfe\\x89\\x9e\\x5d\\x6a\\xc7\\x93\\xe5\\x1b\\x9d\\x39\\xf8\\xd5\\x33\\xf0\\x1b\\x6c\\x20\\x69\\xbb\\xaa\\x94\\xc7\\xab\\xc7\\x7b\\xa5\\x83\\x0a\\x6a\\xa5\\x14\\xd4\\x2e\\x46\\xb0\\xc6\\x2a\\x7b\\xdb\\xae\\x63\\x09\\x96\\x3f\\xb9\\x57\\x6c\\x87\\xd5\\xd2\\x41\\x56\\x69\\xa1\\xd4\\xb6\\x50\\x92\\x55\\x92\\x4a\\xb5\\xb6\\x31\\xbc\\xed\\xf7\\x8a\\xae\\x9c\\x4e\\x50\\x15\\xff\\x7d\\x17\\x5d\\x0e\\x64\\xd6\\xb2\\x7b\\x4d\\x29\\xa1\\x06\\x84\\x22\\x5b\\xf3\\x4d\\x65\\x72\\x17\\x18\\xf1\\x15\\xa8\\xa5\\xf3\\x30\\xab\\xc5\\x8f\\x1e\\x0a\\x4a\\xc4\\xe8\\x62\\x2a\\x54\\x03\\x6d\\x58\\xac\\xaa\\xcc\\x6e\\x51\\x55\\x4a\\xb2\\x93\\x9a\\xb9\\x62\\xa5\\xcd\\x98\\x87\\x69\\x6f\\xca\\x53\\xd1\\xf7\\x33\\x52\\x4e\\xa6\\xe9\\x57\\x0b\\x7c\\xd4\\xbe\\x21\\xe8\\x2d\\x84\\x00\\xa9\\x95\\x01\\x37\\x71\\x72\\xa6\\x54\\x4e\\xaa\\x75\\xbc\\xd4\\x4a\\x2a\\x03\\xc5\\xf9\\xa8\\x50\\x18\\x7d\\x85\\x93\\xad\\x51\\x9d\\x75\\x3c\\x74\\xe9\\x28\\xaf\\x16\\xbd\\x4a\\x9e\\xaf\\x8c\\x5a\\x1f\\x50\\xba\\x94\\x71\\x0e\\x57\\x87\\x05\\x69\\x35\\xba\\x7d\\x59\\xb9\\x07\\x16\\xd2\\x13\\x55\\x2c\\xfb\\x94\\xb3\\x93\\xb5\\x07\\x05\\xa1\\x71\\x77\\xab\\xca\\xb9\\x0c\\x8b\\xb4\\x67\\x2b\\x0e\\x8d\\x42\\xc1\\x30\\xe0\\xbd\\x4e\\x0d\\xdd\\x94\\xb5\\xf7\\xd0\\xd2\\x40\\xd0\\x0f\\x66\\x28\\x2a\\x3b\\xd0\\x1e\\x91\\x3e\\xca\\x67\\x05\\x98\\x74\\xb1\\x6e\\xe5\\x7a\\xa9\\x83\\xe7\\x32\\x4b\\x1d\\x24\\x14\\xa0\\xc8\\x88\\xb0\\x9b\\x17\\xbf\\x5a\\xae\\x3f\\xdf\\xab\\x5c\\xb8\\x93\\x22\\xda\\x0d\\x75\\x9f\\x50\\xfe\\xc9\\x48\\x4c\\xd8\\x03\\x14\\x38\\xb1\\xe5\\xe2\\xa8\\xa0\\x24\\x58\\x03\\x19\\x6e\\x14\\x02\\xd3\\xca\\x6a\\x48\\xcf\\x6a\\xea\\xbb\\x9e\\x68\\x6a\\xbb\\x79\\x17\\x5b\\xf1\\x24\\x71\\x4b\\x07\\x44\\x70\\x59\\x41\\xbb\\x33\\xb6\\x6c\\xd5\\x18\\x01\\x5c\\x54\\xb9\\x9a\\x79\\x06\\xd3\\xc5\\x00\\x6a\\x8c\\x1e\\x26\\x8b\\x51\\x9a\\x93\\x54\\xac\\x30\\x85\\x15\\x49\\xf0\\xa4\\x11\\x94\\x19\\x2c\\x6c\\x99\\xb6\\xc1\\x19\\x07\\xaa\\x60\\x10\\xf9\\xb3\\xaa\\xeb\\x24\\xb2\\xb0\\x69\\x28\\x55\\x88\\xad\\x6e\\x66\\xa3\\xea\\xe8\\x90\\x88\\xbe\\x25\\xaf\\xe3\\x8c\\x12\\xb2\\x0d\\x2a\\x9b\\x31\\x9e\\x20\\xbb\\x15\\xed\\xda\\x58\\xe5\\x8a\\xaf\\x85\\x78\\xe5\\x69\\x14\\x75\\x40\\xac\\x67\\x58\\x41\\x42\\xb9\\x54\\x2d\\x2c\\xa1\\xf4\\x15\\xbe\\x19\\x4c\\x5c\\x42\\x69\\x74\\xb8\\xba\\x20\\x07\\x9c\\xd4\\xd5\\x6a\\xa0\\x59\\xf6\\xd9\\x0a\\xb5\\x78\\xfc\\xd4\\x5c\\x04\\x43\\xff\\x3c\\xfd\\x8f\\x8c\\x82\\x10\\x8f\\x88\\xaa\\xfc\\xec\\xe2\\x0d\\xce\\xa9\\xaf\\xfa\\x86\\x44\\xf6\\x2c\\xc0\\x71\\x31\\xfe\\x78\\x0e\\xc3\\x65\\x95\\x7e\\xac\\xaa\\x4f\\x7a\\x5f\\xad\\x10\\x3d\\xb5\\xb5\\xe5\\xd0\\x68\\xb5\\x0a\\x36\\x94\\x5d\\xad\\xe8\\x99\\x2d\\xc3\\xbd\\xea\\xa8\\x0f\\xdd\\xfc\\xfe\\xac\\x17\\xc4\\x86\\x72\\xd7\\x9e\\x6f\\xae\\x16\\x6e\\xaf\\x01\\x25\\x8e\\xf5\\x89\\xa8\\xcb\\xd8\\xf5\\x02\\x44\\x1a\\x78\\x45\\xe6\\x0c\\x7a\\x1c\\x90\\xe8\\xd6\\x33\\xc3\\x41\\xcf\\x58\\x47\\x09\\x0e\\x7f\\x77\\x2c\\xf4\\x3d\\xaa\\x43\\x0f\\xd5\\xaf\\xd1\\x67\\xdd\\xdd\\x4a\\x6a\\x8a\\xc0\\xc2\\x07\\x0e\\x6f\\x6e\\x11\\xe1\\x07\\x35\\x3e\\x29\\x5b\\xc8\\x28\\x54\\x3a\\xeb\\xa2\\x23\\xc1\\x70\\xba\\xb5\\xb3\\x95\\xc2\\xf0\\x5c\\xe8\\x39\\x82\\x47\\x6a\\xa5\\x3c\\x2f\\x97\\x72\\xe9\\x4e\\x85\\x1e\\x2b\\x0f\\xd5\\x70\\x52\\x56\\x6e\\x12\\x8a\\xc8\\x42\\xe0\\x16\\x83\\xc7\\x07\\x3e\\xde\\x19\\x50\\x69\\x4b\\xb4\\x4f\\x3c\\xe6\\xaf\\xb2\\xff\\x8a\\x13\\x19\\xab\\x11\\x1f\\xb8\\x2b\\x70\\xcc\\x0b\\x7e\\x22\\xd1\\x11\\xbf\\x68\\xf8\\xc5\\xb5\\x64\\x5f\\x1d\\xdf\\x2c\\xe7\\x7e\\xe2\\xab\\x46\\xc9\\xe0\\x95\\x7e\\x00\\xba\\xc2\\xdf\\x6a\\xca\\x47\\x83\\xd5\\xa4\\x7f\\x12\\x7a\\x04\\x78\\xe9\\x6d\\xdb\\xb9\\x39\\x25\\x54\\x59\\x51\\xa5\\x88\\xcb\\x66\\x96\\x1d\\xe1\\x9c\\xec\\xb0\\x35\\xdc\\x77\\x05\\x87\\xb1\\x95\\x59\\x53\\x68\\xb6\\x55\\xb1\\xf4\\x0b\\xb5\\xb6\\xca\\xd8\\x8c\\xee\\x65\\x38\\x25\\x37\\xef\\x7d\\x80\\x53\\x8f\\xd2\\x57\\x64\\x41\\xc3\\x28\\xdd\\xab\\xf7\\xb5\\x0c\\x6e\\xa2\\xa5\\x4b\\x79\\x2d\\xa8\\xd2\\xc1\\x7a\\x61\\x33\\x9b\\xe9\\xc2\\x5d\\x83\\xbf\\x75\\x4b\\xa1\\xf6\\x90\\x11\\x47\\x05\\x0d\\xa8\\xab\\xf5\\x21\\xcd\\x50\\x04\\xa8\\x4b\\x2a\\x02\\x8b\\x01\\x8d\\xd9\\xd2\\xc5\\x98\\x57\\x67\\x5b\\x89\\x6a\\xc4\\x2a\\x49\\x33\\x6b\\xc7\\xc7\\xdd\\x6d\\xf3\\xf4\\xdd\\x59\\x08\\x24\\x79\\xf5\\xb0\\x3d\\x28\\xa9\\xc9\\xac\\x33\\x0e\\xac\\xc6\\x8b\\xf9\\xd4\\xcc\\x15\\x79\\x63\\xa5\\xd2\\xf3\\xac\\xf9\\x67\\x82\\xa2\\x51\\x20\\xde\\xa1\\xdd\\xf5\\xb2\\x3d\\x42\\x51\\x1a\\x2b\\x69\\x58\\xc9\\x98\\x59\\x16\\xa6\\xd2\\xe4\\x9b\\x59\\x82\\x6c\\xdf\\x0d\\x73\\x7a\\x66\\x01\\xcd\\x81\\x39\\x20\\x06\\x2b\\x49\\x4f\\xe5\\xb0\\x92\\x08\\x28\\xee\\xed\\x5e\\x2c\\x68\\x61\\xaf\\xb1\\x05\\x01\\x87\\xda\\x5d\\x7e\\x8c\\x8d\\xfb\\xc1\\x76\\x3a\\xab\\x25\\x79\\x47\\x72\\x50\\x26\\x21\\x8e\\x7e\\xe6\\xd0\\xba\\xc7\\xcb\\x2b\\x7d\\xe6\\x4b\\xc6\\xe2\\x68\\x56\\xc2\\x41\\x4d\\x12\\x49\\x56\\xb3\\xb7\\xf6\\xee\\x77\\x74\\x2d\\x4a\\xbc\\x53\\x75\\x02\\x21\\xca\\xc6\\xd0\\x29\\xa8\\x61\\xb8\\x7a\\xe2\\xb9\\xb1\\xbb\\x64\\x84\\x26\\xae\\xbd\\x50\\x47\\x0b\\x4c\\xa4\\xd9\\x23\\x63\\x8d\\x7d\\x80\\x76\\x91\\xcd\\x43\\xea\\x55\\x63\\xf3\\x98\\xb1\\xab\\x6b\\xc6\\xa1\\xee\\xf0\\x7e\\x36\\xcd\\x51\\x38\\x58\\x10\\x44\\x26\\x04\\x91\\x51\\x2a\\x4f\\xd8\\x7c\\xab\\xa0\\x76\\xd3\\x2e\\x70\\x3d\\xba\\xe4\\xf2\\xc2\\x75\\xcd\\xd7\\xf2\\xe6\\x2c\\x8c\\x68\\x3a\\x4f\\xaf\\x46\\x5d\\xd6\\xd0\\xe8\\xee\\xb6\\xa8\\x56\\xf0\\xfb\\x8b\\x65\\x68\\xb6\\xec\\x2d\\x1e\\xe8\\xf5\\x67\\xd0\\x6b\\xcf\\xa0\\xf3\\x09\\xfc\\xc6\\xfd\\x61\\x57\\x8c\\x53\\xfd\\x5e\\xe7\\x0b\\xeb\\x7b\\x8e\\xf9\\x9e\\x23\\x14\\x6c\\x26\\x84\\x68\\xad\\x4b\\x43\\xf6\\x7d\\xaf\\x56\\x84\\x9e\\x2f\\x4f\\x89\\x1b\\x6c\\x67\\xce\\x77\\xff\\xb0\\xca\\x40\\x46\\x1a\\xee\\x67\\xe2\\x9c\\xdb\\x5b\\xb5\\xed\\x39\\x59\\xb0\\x2e\\x9a\\xbd\\x1a\\xac\\x12\\xa0\\x34\\xb2\\x06\\x12\\x00\\xf1\\x5e\\x28\\x1d\\xdd\\x68\\x66\\x49\\x19\\x06\\x62\\xc5\\x76\\xb1\\x02\\xc0\\x9e\\x98\\x55\\xeb\\x1e\\x7d\\x84\\x8c\\xac\\x3e\\x26\\x1f\\x3b\\xca\\x8e\\xfa\\x66\\x49\\xc8\\xb0\\x21\\xe9\\x3b\\x0a\\x30\\x0e\\xf6\\xa2\\x40\\x51\\xf2\\xac\\x35\\xaa\\xe0\\x3c\\xe0\\xcf\\x23\\xef\\xd8\\xe4\\x7d\\x17\\x09\\x54\\x07\\xc2\\xfa\\xf8\\x09\\x32\\x81\\x57\\x8c\\xc5\\xf7\\x8c\\xad\\xec\\xcc\\x32\\xbb\\xa1\\xcc\\x3f\\xc7\\x61\\x15\\x95\\x8d\\xce\\x33\\x6b\\xef\\x12\\x0a\\x51\\x08\\x4a\\x3a\\x5a\\x6c\\xfa\\x5e\\x41\\xcc\\x3a\\xdb\\x53\\xa8\\xb1\\x54\\xad\\xb4\\xa2\\xb8\\x74\\xb1\\xb2\\x31\\xd0\\xcf\\xb3\\x84\\x2b\\xc8\\xbe\\xcd\\x8a\\x72\\x77\\x48\\xda\\xe6\\x91\\x41\\xf6\\x3a\\x44\\x74\\x3a\\x36\\x2d\\x31\\x4d\\x60\\x2f\\x49\\x41\\xf1\\xb2\\x0e\\x3a\\xfa\\xc4\\x2b\\xd5\\xdd\\xec\\x2e\\x7c\\xa2\\x64\\x0b\\x56\\x97\\x31\\x7b\\x99\\x74\\xaf\\xb5\\x7a\\x66\\x7f\\xa1\\xa3\\x49\\xf6\\xb8\\x8e\\x47\\x99\\xc1\\x00\\x6e\\xee\\x77\\xda\\x10\\xfd\\x1e\\x6a\\xaa\\xee\\x55\\x42\\xed\\xeb\\x48\\x96\\x8c\\xa0\\xb8\\xda\\xf8\\x4c\\x76\\xd2\\xbd\\x2b\\x80\\x55\\x1f\\x04\\xbd\\x39\\x56\\x0b\\x0c\\x51\\x77\\xdc\\x0f\\x27\\xad\\xb7\\xbd\\x12\\x33\\x25\\x2f\\x0d\\x34\\x1e\\xdb\\xd5\\xcf\\xa7\\x7e\\xd2\\x35\\x26\\x3a\\x88\\x68\\x69\\xa0\\x33\\x10\\x2d\\xb1\\xa1\\x0a\\x6f\\x1a\\xa1\\x21\\xb5\\xbb\\x5b\\x23\\x2d\\xf3\\x1a\\xec\\x04\\x5b\\x49\\x01\\xe8\\x56\\x6b\\xa8\\xce\\xf4\\x6f\\x16\\x54\\xa1\\x85\\xc7\\x61\\x4d\\x44\\xf0\\x2a\\x45\\x77\\x49\\xdd\\x10\\x08\\xf2\\x3d\\x1b\\x47\\x5a\\xd5\\x6e\\xed\\x19\\xa5\\x0a\\x00\\x4c\\x15\\x1d\\x90\\xaa\\xc7\\x01\\x57\\x6c\\x4a\\x4e\\x99\\x42\\xa4\\x68\\x80\\x19\\xc0\\x74\\xc4\\x9c\\xab\\xd5\\xe9\\xaf\\x0d\\xe9\\x78\\xde\\x2f\\x46\\x65\\x71\\xbf\\x97\\x22\\x40\\xae\\x8a\\x76\\x23\\xa7\\x91\\x95\\x50\\x15\\x54\\xda\\x11\\x08\\x68\\x2f\\xb5\\xd5\\xd8\\x33\\x3d\\x91\\x39\\x8e\\x21\\x5a\\xf2\\x65\\x72\\x0e\\x30\\xa8\\x38\\x34\\x93\\x21\\x9c\\x68\\x7c\\x48\\x5b\\xa2\\xc8\\x19\\x97\\xf5\\x36\\x48\\xbb\\x91\\x2c\\x87\\x13\\xc9\\x23\\x22\\xb5\\xa6\\x83\\x1e\\x15\\x30\\x9f\\x3f\\xbb\\xd4\\xd2\\xcd\\x8d\\x8e\\xdc\\x56\\x21\\x0e\\x92\\x68\\x45\\xe5\\xee\\xbc\\x46\\x46\\x9b\\x89\\x4c\\x2b\\xa3\\x1a\\x5e\\x6f\\xab\\xa7\\x9e\\xde\\xdd\\x16\\x4a\\xe7\\x55\\x2a\\x98\\x12\\xad\\xe0\\x0b\\xe3\\xaa\\x7e\\xe5\\xaa\\xab\\x63\\x99\\x95\\xed\\x80\\x7f\\x91\\x83\\x33\\x96\\x5a\\xf9\\x88\\xd2\\x41\\x1f\\xa1\\x83\\x6b\\x5a\\x62\\xb9\\x56\\x4c\\x4a\\xef\\xf1\\xe2\\xd9\\x3b\\xf5\\x22\\xd0\\x4b\\x5f\\x7e\\x94\\xb5\\x3f\\x89\\xac\\x15\\x6a\\x81\\x1b\\x1f\\x65\\xf4\\x85\\x86\\x78\\x25\\x18\\x94\\x1d\\x86\\xfa\\x2f\\x4e\\x74\\x2d\\x6e\\x56\\x46\\x01\\xd5\\xc5\\x6e\\x57\\x69\\x35\\xb0\\x53\\xea\\x6a\\x66\\x0b\\xea\\x81\\xb5\\xc0\\x56\\xa7\\x42\\xcf\\x6a\\xe1\\x25\\x8e\\x72\\x77\\x9b\\x09\\x61\\x83\\x85\\x52\\x75\\xb2\\x37\\xe5\\x6a\\x05\\xf1\\x8c\\x86\\xc2\\x61\\x28\\xca\\x4e\\x29\\x1c\\x91\\x1e\\x83\\x1b\\xaf\\xe6\\xd6\\x28\\x10\\x19\\xe6\\x26\\x2e\\x9c\\xdc\\x01\\x59\\xae\\x39\\x97\\x7f\\xfd\\xc9\\xf7\\x9f\\xa7\\x79\\x2d\\x72\\x24\\xac\\xe3\\xd7\\xd9\\x85\\xe9\\x24\\x03\\xa1\\x9c\\x5c\\xef\\x16\\xeb\\xa2\\xe4\\x95\\xe4\\xac\\xd6\\x0d\\x0d\\x14\\xe2\\xdb\\x8c\\xa2\\x6e\\x98\\x78\\x9c\\xa9\\xe1\\x7c\\xf1\\x59\\x18\\xa3\\xb2\\x37\\xe3\\x9e\\xcc\\x82\\xe0\\xdd\\xb3\\x57\\x27\\x31\\x38\\xb5\\x59\\x13\\x4f\\x1f\\xe7\\x57\\xe9\\x45\\x97\\x0a\\x77\\x77\\xb7\\xa2\\xc8\\x2d\\x49\\x76\\xf6\\x71\\xf6\\x2a\\x8a\\xd0\\x6e\\x56\\x8c\\x11\\x59\\x56\\x96\\x08\\x6e\\x39\\x23\\x06\\xe3\\xab\\xa9\\x23\\x78\\x40\\xb3\\x98\\xd3\\x36\\x35\\x64\\xb6\\x58\\x21\\x7a\\xa7\\x7d\\x8a\\xcb\\xa9\\x36\\xb9\\x5c\\xc5\\xf7\\xce\\x3f\\x20\\xb1\\x3e\\x9f\\x9e\\xc0\\xc1\\xa1\\x25\\xbe\\xd7\\x61\\x85\\x66\\x87\\x15\\xfa\\x61\\x87\\x95\\x32\\x3b\\xac\\x14\\x4b\\x26\\xbe\\x1d\\x39\\x48\\xb1\\xd4\\x63\\xab\\x6b\\x39\\x1e\\xaf\\x6b\\xf9\\xf9\\xfd\\x36\\x8d\\x44\\x02\\x96\\x36\\xdc\\xb0\\xb0\\xad\\x76\\xea\\x2d\\x64\\x27\\xb9\\x8c\\xee\\x70\\xb8\\x23\\x94\\x04\\x96\\x06\\x20\\x67\\xf6\\x10\\xee\\x49\\x62\\xf6\\x04\\x15\\x43\\x8a\\x32\\x53\\x05\\x3d\\x1c\\x56\\x9d\\x4b\\x3f\\x15\\x3d\\x42\\x31\\x7a\\x91\\x1a\\xb0\\x28\\x76\\x06\\xda\\x65\\xab\\x37\\x65\\x91\\x26\\xd7\\xda\\x23\\xa0\\xb0\\x7b\\xa3\\x63\\xa4\\xad\\x28\\x7a\\x9d\\x65\\xc7\\x8d\\xbb\\x65\\x25\\x69\\xb9\\xdf\\x94\\xb5\\xd8\\x1b\\x80\\xba\\xd7\\x46\\xe8\\xb2\\x73\\x0d\\x0d\\x36\\x45\\x31\\xda\\x05\\x3c\\x1a\\x08\\x46\\x6d\\xf0\\x14\\xb9\\xa3\\x00\\x3e\\x16\\x14\\x59\\x83\\x1b\\xd1\\x36\\xd7\\xb0\\x0f\\xd7\\x27\\x54\\xee\\x41\\xf8\\x9a\\x1b\\x58\\xac\\xa9\\x79\\xb5\\x21\\x92\\x49\\x63\\x72\\xd7\\xcf\\xa6\\x06\\x44\\xed\\x10\\x55\\xb1\\x36\\xaf\\x91\\x01\\x9b\\x55\\x86\\xa5\\x95\\x61\\x56\\x31\\x47\\xdd\\x8b\\xa8\\xce\\x2c\\x75\\xcb\\x45\\xf0\\xce\\x0b\\x06\\x6f\\x9c\\x63\\x1b\\xe5\\xa0\\x84\\xce\\x12\\x91\\x3d\\x11\\x9c\\x17\\x90\\x19\\x8c\\x13\\x2b\\x64\\x3c\\x52\\x35\\x65\\x8c\\xaa\\x20\\xc1\\x6a\\x2e\\x18\\xe9\\xc2\\x2b\\xd7\\x1b\\xb2\\xc8\\xf0\\xb5\\xb4\\xba\\xe9\\x99\\x83\\x4c\\x6a\\x0c\\x66\\xae\\xd7\\x6b\\xc9\\xd3\\x4e\\x0a\\xbb\\xc7\\x38\\xb1\\x37\\xcc\\xd9\\x4e\\xce\\x81\\xee\\xe7\\xc1\\x46\\xff\\xb3\\x61\\xf9\\x6b\\x35\\x6d\\xe6\\xd0\\xf3\\xb2\\x2f\\xe6\\x92\\x9f\\x45\\x68\\xbc\\x84\\x64\\xf6\\x82\\x46\\x21\\x5a\\x35\\x75\\x73\\xde\\xb7\\x62\\x99\\x23\\x85\\x2c\\x31\\x03\\xd8\\x71\\x43\\x46\\x12\\x52\\xcd\\xd1\\x51\\xe9\\xfa\\x32\\x4d\\x47\\x57\\x46\\x6b\\x50\\x49\\x2b\\xf5\\x14\\x24\\xf1\\x0a\\x29\\xdf\\xeb\\x1a\\x91\\xfb\\xcd\\x8f\\x38\\xcb\\x3e\\x9f\\x6e\\x98\\x3c\\x26\\xaf\\x81\\x47\\x10\\x38\\xee\\xbd\\xf4\\xa9\\xd1\\x49\\xe0\\x3e\\x18\\x46\\xc0\\xdb\\x9b\\x71\\x83\\x76\\x41\\x5e\\xfd\\x01\\x5a\\x81\\x8a\\xf7\\x52\\x8a\\x27\\x1b\\x3a\\xad\\x00\\xfa\\x56\\x05\\x54\\x6f\\x33\\x13\\xa0\\x59\\xf1\\xbd\\x6e\\x29\\x0d\\xba\\x26\\x26\\xf2\\x60\\x62\\xe2\\x29\\x7a\\x7a\\x9b\\xb5\\xd3\\x20\\x6e\\x07\\xf5\\xa3\\x64\\xb4\\xc6\\x3c\\x62\\x75\\x27\\xa5\\xb7\\xc0\\xa1\\x8c\\xae\\x75\\xc9\\x9a\\xd6\\x71\\x9e\\xae\\x12\\xbd\\xcd\\x4a\\x1c\\xb8\\xac\\xc5\\x7c\\xad\\x88\\x7b\\xb8\\xcb\\x0c\\x6d\\x7e\\x88\\xc3\\x59\\x0c\\x14\\x21\\xf0\\x5c\\x77\\xcf\\x2d\\x25\\x02\\xea\\x8f\\x67\\xc3\\xb1\\x59\\x56\\x21\\x57\\x23\\xdd\\xe2\\x66\\xc9\\x5f\\xcf\\x39\\x62\\xe6\\xdf\\x4f\\xa0\\xdc\\xb3\\xbb\\x70\\x83\\x7d\\x5a\\x1e\\x8d\\xac\\x7c\\x5e\\x9f\\xdd\\xcb\\xe3\\x4e\\x54\\x3d\\xaf\\xc5\\x05\\xc1\\xde\\xab\\xfb\\x54\\x14\\x62\\xb4\\xb2\\xb3\\xd5\\xf5\\x54\\xc9\\xc2\\x28\\x2c\\x5c\\xe0\\xef\\xa2\\xa1\\x78\\xca\\xe8\\x15\\x40\\x54\\xfa\\x91\\xd3\\xd1\\x46\\x47\\xa6\\x44\\x76\\xf2\\x1d\\x8a\\xc4\\x12\\x55\\x50\\x26\\xe0\\xab\\xbe\\x74\\x29\\xc0\\x89\\xbc\\x3e\\xd0\\xf6\\xec\\x52\\xd0\\xba\\xb6\\xd7\\x4b\\x2d\\xcf\\x42\\xcb\\xaf\\x95\\x59\\x2e\\x56\\x66\\x99\\xdf\\xbf\\x2d\\x94\\x3e\\x7e\\xfa\\x15\\x84\\x1d\\xb4\\x16\\x0a\\xbd\\xa2\\x95\\x69\\xcb\\x96\\xda\\xd9\\x50\\xe3\\x13\\x14\\x19\\x32\\x56\\x8e\\x19\\x71\\x56\\x2d\\x65\\xa8\\xaa\\x5b\\x14\\xa6\\xb0\\x58\\xa7\\xa1\\xb4\\x22\\x51\\x62\\x58\\xa1\\x78\\xde\\x2c\\xa1\\xd2\\xf3\\xae\\x89\\x64\\x56\\x23\\x06\\x60\\x44\\x6d\\xa9\\x36\\x2c\\x88\\xa9\\xaa\\xa6\\x3d\\x32\\x57\\xa7\\x73\\xa0\\x80\\x68\\x5c\\x56\\xc8\\x9b\\x42\\xcb\\x48\\x47\\x6c\\x56\\xdc\\x8b\\x8e\\x0a\\x84\\x04\\x09\\xf0\\x88\\x7a\\xfb\\x23\\x4c\\x32\\x1a\\x2d\\x74\\x90\\x10\\x7b\\xf5\\xad\\x63\\x14\\x4e\\x3b\\xc4\\xe4\\xb4\\xb7\\x36\\x3c\\xaf\\xcc\\xc4\\xb6\\x25\\x80\\xf4\\x93\\x16\\x6b\\x85\\xb6\\x1b\\x5b\\xd1\\x25\\x2b\\xf5\\x24\\xaf\\x71\\xb6\\x60\\x56\\x95\\xf3\\x57\\x6e\\x47\\x19\\x67\\xcf\\x12\\xcb\\x41\\xfb\\xf6\\x0a\\xf2\\xe5\\x35\\xcb\\x14\\x91\\x28\\x2f\\x50\\xdf\\x4e\\x17\\xa3\\xb9\\xfd\\xcd\\x32\\x55\\x99\\xab\\x18\\x74\\x84\\x3e\\xcc\\x5f\\x46\\x2c\\xc1\\x58\\xa4\\x04\\x14\\x36\\xab\\xbf\\x96\\x33\\xc0\\x20\\x64\\x65\\x4e\\x67\\x8f\\x3d\\xa4\\xab\\x2a\\x64\\xc9\\x67\\xce\\xbc\\x24\\x2f\\xd1\\xec\\x39\\xb5\\xf6\\x0f\\xbf\\xed\\x78\\x74\\xcb\\xdf\\x37\\xc1\\x38\\x35\\x18\\x4c\\xb0\\x97\\x18\\xe4\\x36\\x18\\x62\\x3d\\xc3\\x2c\\x8b\\x92\\xd4\\x10\\x6d\\x5e\\xe9\\x42\\x72\\x35\\x1b\\xcc\\x2e\\x4b\\xf3\\xb2\\x8e\\xcb\\x14\\x2a\\xea\\x65\\xf4\\xda\\x65\\xd6\\x0b\\xf9\\xfa\\x68\\x4e\\x23\\x4c\\xdf\\xb1\\xf6\\x95\\x09\\x1d\\x13\\x96\\x96\\x8e\\x58\\x19\\x70\\x39\\x1f\\x19\\x1d\\x37\\x91\\x15\\x9b\\xee\\xb0\\x67\\xa2\\x88\\x37\\x52\\x1b\\x65\\xc5\\x66\\x2b\\x67\\x1f\\xb5\\x21\\x77\\xb7\\xb9\\xab\\x35\\x71\\xd4\\xb4\\x0a\\xf7\\x90\\x39\\x2d\\x15\\x05\\x62\\xf3\\x42\\x49\\x8e\\xd8\\xac\\xaf\\xb6\\x4a\\x9a\\xb1\\xc4\\x91\\x0f\\xfc\\x44\\x59\\xe2\\x32\\x52\\x18\\xbc\\xd0\\xe0\\x83\\xaf\\x55\\xf9\\xd4\\x81\\xbf\\xf8\\x71\\x06\\x5e\\x60\\xad\\x67\\xd5\\x23\\xa8\\x40\\x6e\\x22\\x98\\xce\\x96\\x2d\\x38\\xfb\\x96\\xa9\\x62\\xdb\\x74\\x16\\xab\\xca\\xbc\\xc3\\xa7\\x92\\x1c\\xc5\\x34\\xe7\\x51\\xa9\\x5a\\x6f\\xb3\\xa1\\x03\\x9f\\x3e\\x4f\\xdb\\x2a\\x06\\x82\\x11\\x8e\\x4c\\x88\\x45\\x99\\x4f\\x06\\x50\\x91\\x79\\xe1\\x31\\x36\\x00\\x9f\\x1e\\x9a\\x0a\\x1e\\x70\\x60\\x50\\x4d\\x63\\x1c\\x8d\\x83\\x4a\\xc4\\x3c\\x2c\\xbd\\x51\\x9c\\x03\\x0e\\x75\\xb1\\xa2\\x00\\xf8\\x86\\x26\\x8a\\xa1\\x2b\\x04\\x1c\\x8e\\xea\\x24\\x87\\x3e\\x33\\x08\\x0c\\x26\\x79\\xa1\\x21\\x04\\x5a\\x06\\x70\\x5d\\x05\\x65\\x73\\x66\\x7d\\xb5\\xf9\\xf1\\xfa\\x52\\x9c\\x96\\xb4\\x84\\xde\\x78\\x6d\\x4d\\x65\\x28\\x00\\xa2\\x27\\x64\\xcb\\x3e\\xbb\\x41\\x6e\\xd6\\x7e\\xc5\\x9d\\xc8\\x99\\x66\\xae\\x3a\\xdf\\xa3\\x3e\\xa5\\x3d\\xd7\\x50\\x5d\\x17\\x18\\x77\\xbd\\xe5\\xdd\\xfb\\x8d\\x30\\xaa\\x4f\\xdd\\x9c\\xd9\\xef\\x7c\\x74\\x06\\x9e\\xcb\\x9e\\x11\\x20\\xbb\\xd9\\x5a\\x66\\xb3\\x8c\\xb3\\x42\\x18\\x4e\\xb9\\xcb\\x1c\\x31\\xb8\\x65\\x88\\xdb\\x2d\\xe7\\x93\\xb6\\x60\\x11\\xcf\\x35\\x16\\x1d\\xe5\\xd6\\xb1\\x09\\x82\\x5a\\xef\\x94\\x9c\\x2b\\x62\\x9c\\xf4\\x93\\xd1\\x28\\x3d\\x80\\x09\\x5c\\x66\\x11\\x84\\xda\\x4f\\x3f\\xdd\\xe9\\xdb\\xde\\x4f\\x7f\\x37\\x4a\\x46\\xf7\\xa0\\xd6\\x6d\\xee\\xc8\\x9d\\x18\\x3c\\xed\\x03\\xc3\\x84\\x96\\x33\\x66\\xf5\\x77\\x6b\\x32\\xd8\\x9f\\x69\\xb7\\x9a\\xe7\\x16\\xb6\\x33\\x7e\\x2d\\xab\\xcd\\x9e\\xea\\x9d\\x55\\x0e\\xfd\\xd9\\x8f\\xe4\\xab\\x7b\\x92\\x4d\\x60\\x4b\\x2a\\xd4\\x51\\x3b\\xb8\\x21\\x85\\x36\\x10\\x27\\xeb\\xb9\\x8e\\xd2\\x4a\\xcd\\x82\\xe7\\x23\\xdb\\xb4\\x11\\xf1\\xd1\\x51\\x72\\xe8\\xb8\\xcf\\xe6\\xf0\\x14\\x71\\x8f\\xff\\xd9\\x92\\xe9\\x54\\xb5\\x34\\x53\\xc0\\xd4\\x1c\\x69\\xd9\\xa3\\x87\\x69\\xc6\\xf1\\xf7\\x59\\x3e\\xd0\\x54\\x6e\\x2e\\xde\\x83\\xa4\\x5b\\x6d\\x96\\x3a\\x76\\x5f\\x90\\x6a\\x0d\\xb8\\xcc\\x5f\\x6a\\x55\\xb1\\x61\\xa2\\x67\\x53\\x0e\\xd9\\x72\\x81\\x41\\x07\\xd1\\xb5\\x72\\x3a\\x81\\xd5\\xfd\\x9c\\xf4\\x63\\x14\\x47\\x8f\\xd6\\x9f\\xc0\\x69\\x6f\\x33\\x8f\\x02\\xb5\\xf5\\x86\\x19\\x76\\xad\\x23\\x40\\x30\\x15\\x94\\xdd\\x7a\\x98\\xfd\\x4d\\x3f\\xe0\\xb9\\x88\\xb7\\x3f\\xc9\\x5e\\xbc\\x7f\\x96\\xe5\\xb7\\xb2\\xd2\\x6f\\x40\\x20\\xef\\x31\\xb1\\x5b\\x67\\x6e\\x58\\x97\\xd7\\xfa\\x59\\xfe\\xfa\\x93\\xef\\xbf\\x98\\x5e\\x8a\\xf7\\xab\\xc4\\x0e\\x6b\\x22\\xb7\\xb6\\x76\\x46\\xa5\\x37\\x31\\x2c\\xcc\\x2b\\x96\\xae\\xd7\\xb7\\xa9\\xd5\\xae\\xa3\\xa2\\x0f\\x32\\x2a\\x61\\xd2\\xd1\\x74\\xa8\\x50\\x1d\\x8d\\xc1\\x7a\\x59\\xa3\\x64\\x8b\\x93\\xbd\\xed\\xb8\\xf8\\xc3\\xcc\\x16\\xc1\\x84\\x55\\xd5\\x3d\\x02\\x27\\x41\\x35\\x23\\x14\\xeb\\x4c\\x64\\x69\\x0f\\x2a\\x76\\x98\\x74\\xf4\\xd5\\xfb\\xd0\\x92\\x8c\\xb7\\x1d\\xac\\x7c\\x90\\xc1\\x12\\xe8\\x13\\x35\\x6f\\xa0\\x11\\xb4\\x1e\\x58\\x18\\x19\\xf4\\xc8\\x7b\\xf7\\x86\\xbe\\xb0\\xdb\\x5c\\x91\\xb9\\x1a\\x2c\\xce\\xea\\xb0\\x8c\\x6f\\x6c\\xdc\\x76\\xc6\\x52\\x71\\x4e\\xf4\\x5a\\xd5\\x11\\x11\\xdd\\xbb\\xbd\\xee\\xb9\\xdb\\x44\\xc9\\xfc\\xda\\x52\\x61\\x06\\x9b\\x9c\\xaf\\xc3\\x8a\\x62\\x58\\xd1\\x22\\xff\\x98\\xce\\x62\\x04\\x90\\xc8\\xc6\\xb3\\x82\\xa9\\x8d\\xf6\\xe1\\xc3\\x0e\\xd5\\x5b\\xcd\\x5b\\xfe\\x30\\x8b\\x9c\\x9a\\x62\\x72\\xf2\\x08\\x25\\x10\\xb2\\x58\\x59\\x4a\\xe1\\x99\\xe2\\xfa\\x78\\x04\\x31\\x9f\\x11\\x44\\x23\\x45\\xd0\\x1b\\x79\\xc2\\x74\\xf5\\xdd\\x6e\\x4b\\x93\\xf3\\xe9\\x96\\x9b\\x9c\\x91\\x9b\\x4c\\xaf\\x3f\\xf9\\x4a\\x7c\\x34\\x78\\x52\\xf2\\x1b\\x8f\\xf7\\xf0\\xa5\\xa4\\xc7\\x83\\x97\\x5f\\x94\\xcb\\x04\\x46\\x5e\\x33\\x9a\\x19\\x28\\xac\\x69\\xa8\\x43\\x4e\\x9c\\xd0\\xb0\\x52\\xd5\\x01\\xaa\\x9d\\x4b\\xb3\\x2e\\xeb\\xd6\\x28\\x25\\x85\\x52\\xcd\\x35\\x2a\\x03\\xdd\\xcf\\xf2\\x25\\xbb\\x03\\x58\\xdc\\x82\\x1c\\x19\\x04\\x3c\\xe7\\x31\\x4c\\x3d\\x0b\\xa6\\x62\\x9f\\x39\\x57\\x6a\\xca\\x95\\xbe\\x66\\x98\\xe4\\x5c\\x1f\\x5d\\xb5\\xf2\\x58\\x4b\\x89\\xdb\\x9c\\x7a\\xa0\\x8c\\x06\\x40\\xa8\\xa7\\x7f\\x8f\\xef\\xe7\\x95\\xf0\\xcf\\xe4\\x69\\x28\\x00\\x08\\xf4\\xea\\xc6\\xa1\\x77\\x85\\xb4\\xe6\\x6d\\xf1\\xfc\\xd6\\x8c\\xee\\xd9\\x67\\xbf\\xe5\\x63\\xe8\\xea\\x8b\\x69\\xcb\\x77\\xdd\\x96\\x89\\x8d\\xd9\\x52\\xfa\\xac\\x57\\x0f\\x8f\\xa7\\x6a\\x73\\x1e\\xcd\\xab\\xda\\xe3\\x53\\x6e\\xfa\\x3a\\xd5\\xbf\\x95\\x1b\\x1d\\x92\\xeb\\x12\\xb9\\x56\\x6b\\x6c\\x1d\\xf1\\x4f\\xa4\\x66\\x73\\x1b\\x21\\xd7\\xb2\\xb0\\xb4\\xa3\\x76\\xfd\\xd2\\x75\\xcb\\xf1\\x8b\\x69\\xb1\\xf7\\x1c\\x2a\\x5b\\xb1\\x5b\\xe8\\x72\\xf1\\x36\\xa2\\x6d\\xe6\\x92\\xef\\x5e\\xaa\\xdd\\xab\\xd8\\xdb\\x61\\xf8\\x39\\x1b\\x3a\\xb4\\x1f\\xb4\\x73\\xe8\\x1f\\xbe\\x99\\x03\\xc0\\x5d\\x9d\\x8c\\x78\\xf4\\x60\\x41\\xb2\\x0d\\x66\\x1d\\x12\\xfe\\xdd\\xdc\\x02\\xef\\xe3\\x99\\x40\\x0f\\x17\\x20\\x12\\xf0\\xab\\x50\\x4d\\x02\\xf1\\xc2\\x1c\\xa6\\x1b\\x2a\\xa5\\x7b\\x15\\x7a\\x5b\\xe0\\xf6\\x88\\xa0\\x9c\\x4e\\x93\\xf7\\x6c\\xb2\\xf0\\x0f\\xa3\\x87\\xab\\x23\\x18\\x1f\\x68\\x04\\xa2\\x16\\xfd\\xe3\\x48\\xe1\\xea\\x18\\x9e\\x7f\\xa8\\x59\\xe0\\xf6\\x4e\\xa8\\xe0\\xea\\xc0\\x3e\\xff\\x50\\x03\\xa3\\xf1\\x93\\x68\\xb2\\xd2\\xcb\\x7b\\xe8\\xac\\xfb\\x2a\\x2b\\xbc\\xbd\\xce\\x3a\\xdd\\x1f\\xef\\xd7\\x7a\\xe1\\x3d\\xf6\\xf2\\x8b\\x0f\\x34\\x82\\xf7\\xd9\\xcb\\x2f\\x3f\\xd4\\x2c\\x40\\x61\\x7e\\xc0\\xbd\\xfc\\xea\\x43\\x0d\\x8c\\xe4\\xa7\\xd9\\xcb\\x6d\\xfc\\x6c\\x7b\\xf9\\xc5\\xb4\\xe9\\x2a\\x85\\x4a\\x15\\x45\\x43\\x28\\xd1\\x51\\x32\\x2d\\xdc\\xb3\\x97\\xc1\\x67\\x23\\x45\\xe6\\xb6\\xc3\\x1b\\xa6\\x86\\x32\\xea\\x33\\xa5\\xd9\\xd1\\x99\\xeb\\xd9\\x2c\\x76\\x56\\xe9\\x71\\xf4\\xed\\xcd\\xaf\\xcc\\x0b\\x81\\x9e\\x62\\xb8\\x60\\xc0\\x25\\xdb\\x0d\\x23\\xa1\\xab\\x4b\\x94\\xa1\\x40\\x23\\x1d\\x56\\xa3\\x23\\x4d\\x4b\\x91\\xda\\xa2\\xd0\\x4f\\x01\\x43\\x0a\\x3c\\x46\\x20\\xc9\\x3b\\x25\\xc5\\x65\\x6a\\xef\\x33\\xaa\\x84\\x51\\x10\\x04\\xa7\\x7b\\xf7\\x86\\x3f\\xb9\\x38\\xbe\\xa1\\xe2\\x4b\\x8a\\x4f\\xf9\\x5a\\x23\\x41\\x9d\\x0a\\x7a\\xf6\\xe3\\x37\\xaa\\x00\\x6f\\xe5\\x97\\x6a\\x22\\x85\\x47\\x6c\\xa4\\x7b\\x26\\xd2\\xd5\\x09\\x9c\\x16\\xef\\xc7\\x8e\\x1b\\x1f\\xb4\\xe3\\x06\\x42\\x17\\xec\\xd9\\xe9\\xc6\\xd3\\x98\\xe0\\x0b\\x3e\\xc2\\x2b\\x9d\\x36\\xde\\x5d\\xbd\\xbc\\x90\\x8f\\x0b\\xf9\\x4b\\x5a\\xc8\\xf7\\xd0\\xd2\\x2f\\xf2\\xc7\\xa5\\xfc\\x25\\x2d\\x25\\x9c\\xef\\x1f\\x10\\xec\\xbc\\x28\\x7f\\x12\\xeb\\xfb\\xee\\x5a\\x31\\xfc\\xac\\x9e\\xc3\\xfb\\x8e\\xc3\\x77\\xdc\\xa3\\xef\\xb3\\x45\\xc3\\x8f\\xb1\\x47\\xaf\\x6e\\xb5\\xfa\\x27\\xb1\\xd5\\xfe\\x74\\x44\\xc9\\x4f\\x63\\x6a\\x87\\x0f\\x68\\x6b\\xbf\\xbd\\x79\\x72\\x66\\xa9\\x21\\x55\\x48\\x65\\x65\\xd7\\x65\\xb4\\x9a\\x1b\\xdc\\x78\\x1d\\x35\\x8c\\xbc\\xa2\\xc4\\x04\\x02\\xfa\\xf8\\x7b\\x5f\\xc7\\x30\\x16\\x3f\\x57\\xf0\\xce\\x32\\x98\\x0f\\x91\\x5b\\x59\\x61\\x8a\\x8c\\xac\\x7f\\x4a\\xb8\\x43\\xe4\\x82\\xca\\xb9\\xd7\\x03\\x5f\\x2f\\xfa\\x0f\\x77\\x3e\\xd2\\xc1\\xb9\\x7a\\x3e\\xb5\\xed\\xfc\\x32\\xbb\\x92\\xea\\x3e\\x6c\\x5e\\xdc\\xcf\\x3b\\x54\\x25\\x6b\\x37\\x7e\\xe3\\xfc\\xcd\\x15\\xd5\\x6c\\xfb\\x0a\\xa7\\x2a\\xaa\\x40\\x82\\xc4\\x48\\xb4\\x59\\x6d\\xe9\\xca\\x28\\x91\\x1d\\x73\\xb7\\x42\\x9a\\xbd\\xcf\\x33\\x21\\xf7\\xce\\x04\\xef\\x93\\xdb\\x6f\\x2c\\x61\\x64\\x4d\\x45\\xb9\\xdf\\x9c\\x13\\x59\\x6a\\x34\\x26\\x17\\x06\\xf9\\x9a\\x09\\x65\\x65\\xd2\\x0a\\x31\\x58\\x0a\\xfa\\x75\\x30\\xd7\\x0d\\xa5\\x11\\x50\\x6a\\x82\\xac\\x96\\xd8\\x3c\\x2d\\x23\\x58\\x69\\x8a\\x12\\xac\\xe1\\x18\\xaf\\x99\\x7a\\x68\\x3d\\x83\\xd1\\x85\\x0b\\x1a\\x87\\x96\\x2f\\x75\\xc1\\xea\\xcd\\x59\\xb8\\x69\\x16\\x93\\xef\\x5e\\x93\\x10\\xde\\xce\\xb9\\xa9\\xf3\\xbd\\x4d\\x2d\\x46\\x2a\\x2e\\xc8\\x6b\\xdb\\x5a\\x75\\x2e\\xa7\\x79\\x74\\x3d\\x3d\\x5c\\x2c\\x73\\xa4\\xef\\xcd\\xbc\\xb6\\x56\\xa4\\x0c\\x1d\\x17\\x83\\xf0\\x23\\x4b\\x38\\x9e\\xfd\\x13\\xef\\x02\\x74\\xcb\\x28\\x99\\xff\\x2e\\xe6\\xc0\\xf3\\x7f\\xf2\\x73\\xf7\\x3e\\x08\\xfc\\xf3\\x7f\\xf2\\xb3\\xf7\\xc1\\x41\\xef\\x17\\x1f\\xa7\\x54\\xea\\x4f\\xe2\\x9b\\xac\\x89\\x7f\\x36\\xdd\\x3f\\x9d\\xdc\\xef\\xdc\\x65\\xeb\\xbd\\x8e\\xed\\xcb\\x37\\x23\\x22\\x3a\\x80\\xb4\\xa1\\x58\\x5c\\xbe\\xf4\\x7f\\x36\\x3e\\x9f\\xb1\\x3a\\x8d\\x4a\\x66\\xed\\x9c\\xbb\\x2c\\x5c\\xeb\\x6b\\x3d\\x4c\\xfb\\xbd\\x1e\\xa6\\x48\\x1d\\x9c\\x9d\\xfd\\x1f\\xef\\x63\\x7a\\x49\\xf6\\x78\\xad\\x93\\xa9\\x51\\x4a\\xef\\xf7\\x32\\x6d\\x47\\x14\\xce\\x8b\\x17\\x9a\\xaf\\x39\\xe4\\x3c\\x16\\x6e\\xed\\x4c\\xc4\\x41\\x61\\x38\\x6b\\x7b\\x91\\xdb\\x9e\\x05\\xbd\\x09\\x5a\\xe8\\xfd\\x81\\x8e\\xa6\\x7c\\xe3\\xa5\\xe3\\x11\\xf4\\xbb\\xb4\\x34\\xad\\x7c\\xc4\\xfc\\x08\\x49\\xf8\\xc5\\xe9\\x7d\\x27\\x09\\xe9\\xe8\\x15\\x4e\\x5a\\x5d\\x07\\xb8\\x6c\\xc7\\x8e\\x4c\\x4a\\x3e\\xcb\\x72\\x58\\x85\\x47\\xab\\x2f\\xd9\\x51\\x2c\\xa2\\x5b\\x45\\x60\\xe3\\xde\\x45\\xf0\\xfb\\x27\\xe3\\x17\\xbc\\xb4\\xca\\x3e\\x05\\x44\\xb2\\xa1\\xd4\\x68\\x9f\\x79\\x13\\x45\\x70\\x75\\x47\\x8b\\x52\\x2f\\x82\\x48\\xce\\x15\\x9c\\x45\\xce\\xb2\\xc3\\x72\\xdd\\x25\\x3b\\x4a\\x43\\x4c\\x0e\\x80\\xde\\xd3\\x33\\x42\\x90\\x97\\x68\\x09\\x21\\x64\\xa4\\x39\\x42\\x95\\x04\\xf0\\xb0\\x0a\\xea\\x69\\x64\\x45\\xdf\\x48\\xa8\\xf0\\x1a\\x16\\x5e\\x14\\xd3\\xe6\\xb7\\x94\\xbd\\x70\\xc0\\x32\\x5b\\x13\\x0f\\xf4\\x13\\xc0\\x21\\x37\\x04\\x63\\x01\\xfe\\xea\\xfd\\x3d\\x46\\x09\\xd5\\x53\\x7f\\x53\\x60\\x5e\\x62\\xe5\\x83\\xa8\\x2e\\x2d\\xbb\\x05\\x6c\\x25\\xa5\\x8c\\x3b\\x98\\xd1\\x54\\xbb\\xb5\\xdd\\xfa\\xa8\\x92\\xbd\\x19\\xe6\\xa6\\x59\\x43\\x53\\x1d\\x5c\\xb3\\x72\\x92\\xd9\\x0b\\x7d\\x8e\\x12\\x2c\\xa7\\x03\\x66\\x8c\\xb5\\x09\\x69\\x97\\x13\\xda\\xac\\x18\\x5c\\x75\\x0a\\xb5\\x37\\xdc\\x28\\xf5\\x88\\xbd\\x59\\x6f\\xae\\xab\\x2b\\xfe\\x32\\x3d\\xfb\\xd8\\x4a\\xec\\xe7\\x6d\\x25\\x66\\x15\\xaf\\x24\\x57\\x24\\xdc\\xf4\\x8a\\xfc\\x9b\\x28\\x69\\x82\\xfd\\x7a\\x3d\\x19\\xf6\\x25\\x7d\\x5c\\xbd\\x9f\\x7b\\xf5\\xde\\x23\\x6d\\xea\\x25\\x7f\\x5c\\xbe\\x9f\\x7b\\xf9\\x10\\x75\\x24\\xaa\\x2b\\x73\\x0f\\xdc\\x1b\\xe0\\xad\\x61\\xbe\\x61\\xee\\x06\\x54\\x56\\xaa\\xc9\\x0a\\x01\\x5a\\x58\\x3a\\x3d\\x22\\x50\\xe5\\x4f\\x7b\\x4d\\x93\\x02\\x80\\x54\\x51\\x1c\\xe3\\x9e\\xaf\\x37\\xb8\\xaa\\x9b\\xa8\\xbd\\x4d\\x95\\x5e\\xd3\\x9b\\xe1\\x4f\\x74\\xeb\\xc9\\x1c\\xfa\\x7e\\x16\\xf2\\x31\\xdf\\x9b\\xa0\\x8f\\x61\\xa6\\x9b\\xb2\\xb6\\x8a\\x7c\\xe8\\x7b\\x2e\\x5f\\xef\\x59\\x8c\\x81\\x59\\x8b\\x19\\x23\\x79\\xf5\\x59\\x6c\\xc3\\x32\\xff\\xcc\\xe3\\xdb\\x2e\\x1f\\xe5\\x9a\\xeb\\x97\\x4f\\xd7\\xef\\x63\\xdb\\xf4\\x1f\\xde\\xa5\\xe1\\x67\\x6b\\x37\\xa9\\xbb\\x2d\\xff\\x69\\xef\\xb6\\x7f\\x14\\x12\\xa4\\xe4\\x1f\\xb5\\x42\\x51\\xd5\\x61\\xbf\\x59\\xa1\\x28\\xfc\\x74\\x25\\x8a\\x5e\\x96\\x8f\\x7b\\xec\\xe7\\xde\\x63\\x22\\xe0\\x50\\x0f\\x27\\x51\\x97\\xd9\\xd4\\x2f\\x93\\x8d\\xa1\\x0c\\x90\\xa8\\xad\\x72\\xfa\\xcc\\x69\\x44\\x97\\xc7\\xad\\x20\\x4f\\x29\\x80\\xfa\\x83\\xde\\x78\\x28\\x00\\x6b\\x37\\xb7\\x1c\\xc6\\x4c\\x33\\x59\\xcd\\xcb\\x10\\x0d\\xdb\\x31\\x94\\x83\\x17\\x41\\xa3\\x8c\\xb2\\x83\\xfa\\x87\\xf9\\xc4\\x78\\x0e\\xe2\\xee\\x36\\x67\\x0e\\xc4\\xf0\\xad\\x1b\\x6b\\xda\\xb3\\x76\\xca\\xf0\\xd6\\x50\\xa2\\xc2\\x17\\x37\\x87\\xf0\\x85\\xb4\\xaf\\x17\\x3a\\x74\\xbd\\xb0\\xa4\\xf9\\xc2\\x9d\\x76\\x41\\x6d\\x49\\x5f\\xf5\\x6a\\xab\\x2c\\xdd\\xa1\\x33\\xb8\\xc5\\x6a\\xad\\xf2\\xdc\\xa0\\x30\\x2b\\x99\\xeb\\xce\\xd8\\x81\\x83\\xd6\\xdc\\x02\\x1f\\xc5\\xd2\\x94\\x92\\x95\\x46\\x0c\\x9e\\x82\\x6a\\x01\\x1c\\x64\\x8b\\x9d\\x69\\x61\\xaa\\x84\\xba\\xed\\xd1\\xb4\\x01\\x27\\x88\\x1e\\x80\\x40\\xc4\\xde\\xdb\\xd2\\xa8\\x55\\x28\\xb4\\x60\\xcd\\x7f\\x86\\xd8\\xeb\\x96\\x11\\x10\\x5b\\x18\\xb2\\x9b\\x17\\x5f\\x4e\\x3a\\x16\\xfa\\x70\\x5a\\x5d\\x10\\x94\\x8a\\x35\\xd7\\x56\\x5f\\x63\\x46\\x01\\xcd\\x7c\\x44\\xef\\x86\\x49\\xc3\\xfb\\xc4\\x5a\\x82\\x61\\xb5\\xd3\\x3c\\x2b\\x57\\x8f\\xd0\\xaa\\x9a\\xb4\\xb1\\xd7\\x60\\x89\\x84\\xa8\\x1a\\xc7\\x02\\x75\\x39\\xde\\x68\\x65\\x8a\\xba\\x0e\\xde\\x68\\xd7\\xf2\\xd2\\x15\\xc8\\x8c\\x3a\\xa9\\xc7\\x62\\x7d\\xc3\\xce\\x5e\\xa1\\x20\\xaf\\xcf\\x52\\xed\\x56\\xec\\x08\\xdc\\x6e\\x14\\x88\\xb0\\x46\\xbc\\x28\\x47\\x53\\x66\\x95\\xd3\\x88\\x3a\\x6d\\xde\\xbc\\xc9\\xea\\x7d\\xe4\\x86\\xbc\\x2b\\xc9\\xbb\\x57\\x14\\x47\\xb9\\xe2\\xee\\x6c\\x70\\xfb\\x62\\x0d\\x16\\xb1\\x4b\\xb8\\x98\\x70\\x60\\x29\\x70\\x3e\\x30\\x21\\x3a\\x28\\xcb\\xb9\\xcf\\x5e\\xed\\x0e\\xfd\\x38\\x3c\\x3d\\x2e\\xec\\xd1\\x8a\\x57\\xf9\\x79\\x21\\x6b\\x1d\\x76\\x77\\x5b\\x5a\\x0f\\xa5\\xd1\\x2a\\xa9\\x05\\xa2\\x23\\xcb\\x5c\\x70\\xe9\\xe7\\x72\\xa7\\xea\\x8b\\xed\\xe2\\xc2\\x12\\x98\\x8d\\xba\\x6f\\xad\\x71\\xd0\\x2e\\xe0\\x88\\xd7\\x9a\\x45\\xe9\\xbe\\x3b\\x03\\x5c\\xa4\\x32\\x61\\x3e\\xc6\\xda\\xe2\\x22\\xd3\\xd8\\x7a\\xe5\\x9e\\xad\\x84\\xf9\\xed\\x5b\\x09\\x2b\\xcc\\x12\\x74\\x37\\x80\\x69\\x2f\\xee\\xe5\\x2b\\xf4\\x8b\\x6c\\x25\\x6c\\x7d\\x70\\x90\\xf0\\x89\\x26\\xab\\xc5\\x39\\xf0\\xef\\x9a\\x1a\\xff\\x01\\x38\\xf0\\x23\\xdd\\xe3\\xc0\\x77\\x14\\x0c\\xf1\\x6e\\xd3\\xa8\\x77\\x64\\x91\\x59\\xbc\\x1b\\xf5\\x47\\x60\\x7d\\x7f\\xf6\\xb1\\x0b\\xee\\x4f\\xdc\\x05\\xf7\\x7d\\x1c\\x23\\xe3\\xe3\\x72\\xfd\\xe4\\xcb\\xf5\\x3e\\x9e\\x90\\xe7\\x1f\\xd7\\xeb\\x27\\x5f\\x2f\\x2b\\x8b\\xf8\\x01\\x5d\\x1f\\x9f\\x7f\\x5c\\xc4\\x1f\\x2e\\xa2\\xd0\\x8f\\x6a\\x1d\\xfe\\xd8\\x9b\\xa4\\x8c\\x7e\\xbd\\x3e\\x6e\\xf8\\x09\\xac\\xcf\\x2f\\x9e\\xbd\\x73\\xdf\\x5e\\xae\\xed\\x5d\\xf5\\xc7\\x8b\\x77\\x7f\\x2a\\x32\\x36\\xdf\\x51\\x0c\\xbe\\x7c\\x8f\\x97\\x15\\xf9\\xb0\\xa7\\xf9\\xd5\\x7b\\x8c\\x85\\xe4\\xc7\\x2d\\xda\\x8c\\xba\\x7c\\x3f\\x7a\\xd1\\xe6\\x87\\x1b\\x7f\\xfd\\xfa\\x93\\xef\\x5f\\xcd\\xa8\\x59\\xe7\\x90\\x31\\x0c\\x04\\x48\\x4b\\xa0\\x21\\xfb\\x90\\x40\\x65\\xec\\x84\\x4a\\x1d\\xd6\\xa0\\x42\\x2c\\x45\\x55\\x27\\x3f\\x05\\x90\\xd9\\x28\\x55\\x74\\xd5\\x6f\\xdd\\xdb\\x16\\xcc\\xa4\\xcc\\x60\\x7d\\x2c\\x22\\x23\\x2a\\x2e\\x6b\\x54\\x59\\xd9\\x57\\x9d\\x51\\x45\\xf8\\x83\\x71\\x09\\x27\\x45\\x46\\xb4\\xa2\\x59\\x2b\\xda\\xb8\\xa3\\x3d\\x83\\x75\\x3c\\x6b\\x2b\\x33\\x85\\x9a\\x80\\xb9\\xc1\\x14\\x43\\x23\\x22\\xde\\xd8\\x1a\\xc8\\x33\\x9a\\x6d\\xc4\\x9a\\xc7\\x2c\\x8e\\xe4\\xf1\\x6a\\x56\\xeb\\x0b\\x11\\xdc\\x46\\xde\\x6e\\x1e\\x34\\x5b\\xb2\\x40\\xab\\x8c\\x70\\x76\\x6f\\x6d\\x6a\\xc6\\x58\\xc4\\xd3\\xcb\\x02\\xa3\\x8d\\xac\\x89\\xbe\\xaa\\xf3\\xa0\\xa2\\x09\\xcd\\xb9\\x3c\\x70\\x3b\\xfb\\xa2\\xf2\\xd9\\xbd\\x15\\x34\\xd2\\x64\\xdd\\x5b\\xc9\\x8d\\x0b\\xaf\\xaf\\x38\\xbc\\x4b\\xa1\\xb9\\x5b\\x6a\\xb7\\xf4\\x6b\\x94\\x92\\x62\\x2b\\xd2\\x6a\\xce\\x03\\x6b\\xb0\\x53\\xbd\\xe0\\x1a\\x0a\\x5e\\xd6\\xe4\\xd5\\xa1\\xa8\\xef\\x51\\xad\\x10\\xe3\\x64\\x8e\\x59\\xf3\\x37\\xce\\xb2\\x54\\x74\\xcf\\x0a\\x52\\x61\\x78\\xf5\\x24\\xbc\\xa2\\x67\\x7f\\x02\\x8d\\x81\\x6f\\x75\\x77\\x3c\\xe4\\xba\\x7f\\xdc\\x73\\x1f\\x7e\\xc1\\xae\\xfb\\xab\\x0b\\xc6\\xcf\\x3e\\x36\\x3c\\xfe\\x59\\x1a\\x1e\\xbf\\x87\\xc9\\xf6\\x4a\\x3e\\x2e\\xda\\xcf\\xb4\\x68\\xef\\x61\\xb8\\xbd\\xca\\x1f\\x57\\xed\\x67\\x5a\\xb5\\x0f\\x6d\\xbe\\xbd\\x2a\\xff\\x58\\x97\\x12\\x09\\x48\\x6f\\xad\\xd9\\xee\\x29\\xb6\\xf0\\x4b\\xd3\\x6c\\x1f\\x66\\x77\\xfe\\x91\\x9b\\x33\\xfc\\x54\\x9d\\xef\\x75\\x93\\xd5\\x7f\\xac\\x9b\\xec\\xfd\\x1a\\xd1\\x84\\x3f\\xc2\\x92\\xff\\x09\\x97\\xfc\\xc7\\x90\\x47\\x0f\\x76\\xd2\\xf9\\x09\\xe3\\xd4\\xaf\\xda\\x3f\\xd8\\x19\\xe2\\x36\\x4b\\x0a\\x82\\xfe\\x21\\x33\\x7b\\x0c\\x36\\x01\\x4c\\x02\\xf8\\x9d\\x2a\\xfa\\xcf\\x6d\\xd6\\x57\\x1e\\x1d\\xed\\xac\\x38\\x82\\xb4\\xd9\\x66\\xbc\\xe6\\xb3\\xb5\\x79\\x73\\xd4\\xcd\\xd5\\x4b\\x1f\\x57\\x55\\xa6\\xc2\\x61\\x20\\xc6\\x28\\x03\\xe1\\xcc\\x50\\xdb\\x8e\\xd9\\x66\\x17\\x48\\x10\\xc4\\xaf\\x3f\\xa3\\xbe\\xf1\\x0c\\xb9\\x84\\x6b\\xd0\\xf3\\x2f\\xe2\\x42\\x7b\\xae\\x3e\\x96\\x2d\\x2c\\x77\\x7d\\x2e\\xfa\\x7d\\x03\\x15\\xc7\\x8c\\x48\\x8f\\x19\\x27\\xb1\\x43\\x06\\x0f\\x98\\x45\\x49\\x77\\x6a\\x84\\x63\\xb6\\x75\\x4b\\xf7\\xd3\\xb1\\xe4\\x15\\x66\\x29\\xad\\x68\\x2f\\x50\\xc6\\x8a\\xa0\\x1b\\x95\\x84\\xee\\xfd\\x28\\x47\\x89\\x46\\x84\\xd2\\xda\\x0c\\x56\\xce\\x93\\x47\\x3c\\x4f\\x9e\\xd7\\x68\\xca\\xf7\\x4f\\x9e\\xd8\\xc9\\x3b\\x3b\\x5f\\xa4\\x90\\x8b\\x75\\x0e\\x41\\x9b\\x36\\x4a\\x2d\\x94\\xb2\\xa2\\xa7\\x78\\x35\\xc2\\x80\\x37\\xce\\xd0\\xf1\\x8b\\x1f\\x13\\x4f\\xac\\x2a\\x15\\x39\\x4d\\x5c\\xea\\x2a\\x54\\x43\\xe9\\x29\\x6c\\xb1\\xb0\\x75\\x22\\x4c\\xcd\\x5b\\x7b\\xdb\\x34\\x96\\x69\\x2c\\xf9\\x2e\\xa6\\x4b\\x24\\xcc\\x8f\\x9a\\x45\\xda\\x47\\x53\\x53\\x6e\\x43\\xf5\\xb1\\x62\\x55\\x80\\xa5\\xdc\\x2f\\xf0\\xce\\xde\\x92\\xbd\\xd1\\x3c\\x6c\\xf7\\x3a\\xc7\\x7a\\x2c\\xb3\\x9a\\x59\\xcf\\xd7\\x1a\\x49\\xeb\\x12\\x5d\\x4a\\x1a\\xfd\\x93\\x6d\\xac\\xfe\\x3e\\xe6\\xc2\\xf3\\x8f\\xd3\\xf7\\x5e\\xc0\\xfd\\xf3\\x8f\\xf3\\xf7\\xe1\\x21\\xf4\\x17\\x1f\\x27\\xf5\\x4f\\xbd\\x63\\xdf\\xab\\x19\\x1a\\x40\\xad\\xe7\\x56\\x57\\x34\\xdf\\xa6\\x0d\\x65\\xb4\\xd1\\x67\\x72\\x58\\x53\\x68\\x6a\\x37\\x65\\x05\\xdd\\x61\\x43\\x3a\\x1b\\xb8\\x11\\x7d\\xf7\\xd0\\x14\\x9a\\x29\\x5a\\x31\\xdf\\x9b\\x72\\xaf\\x14\\x36\\x90\\x2d\\x89\\xac\\x3c\\x42\\x4b\\x6b\\x94\\xc2\\xa1\\x57\\x3d\\xd1\\x2d\\xd4\\xba\\x50\\xe7\\x19\\xff\\xca\\xd3\\x6a\\xc8\\xe6\\x65\\xb4\\xbc\\x39\\x44\\xcb\\x56\\x6e\\xf0\\x37\\xf6\\x55\\xad\\xa1\\x92\\x58\\xc1\\x46\\x63\\x9d\\x2f\\x68\\xe3\\xdd\\x5a\\xdc\\xdc\\x94\\x85\\x8a\\x6c\\x91\\xba\\xe5\\xf5\\xca\\xb8\\xf8\\x26\\x63\\xb9\\x00\\xd0\\x35\\x22\\x45\\xbb\\xb6\\x14\\xd6\\x68\\x0c\\x0e\\x46\\x43\\x61\\xaf\\x79\\x68\\x8d\\x7f\\x2d\\x59\\xaf\\xb5\\x59\\x0e\\xd9\\xba\\x3e\\x45\\xa6\\x12\\x7a\\x7a\\x3f\\x27\\xc3\\x25\\x9d\\x0b\\xe8\\x81\\x0f\\x6a\\x29\\x2f\\x54\\x0d\\xf4\\x67\\x2f\\xe7\\x64\\xfd\\x32\\xda\\x34\\xc3\\x8e\\x58\\x12\\x6d\\xb9\\x05\\x05\\x32\\x5c\\xbd\\xdf\\x1f\\x95\\x81\\x76\\xd9\\x5b\\xb3\\xfe\\x32\\x06\\xa4\\x87\\xd7\\x52\\x8f\\x7d\\xa0\\xf7\\x84\\xe1\\x6e\\x67\\xbc\\x90\\xec\\x56\\x93\\x3c\\x32\\x35\\xc3\\x10\\x0e\\xa2\\xf1\\xe6\\xce\\x72\\x34\\xd2\\x90\\xf0\\xa5\\x0e\\xb4\\x25\\x39\\xef\\x7e\\xac\\x28\\x8d\\x23\\xe6\\x5a\\xf4\\x34\\xa2\\x02\\x27\\x07\\xe9\\x63\\xcb\\x56\\x7f\\x1c\\xc9\\x45\\x64\\xa6\\x0e\\x5b\\xc9\\xd1\\x60\\xbe\\x70\\x34\\xb1\\x83\\x6d\\x64\\x6d\\xaf\\x77\\x55\\x99\\xa8\\xb0\\xa9\\x8b\\x58\\xad\\x29\\x13\\xf4\\x66\\x53\\x88\\x49\\x7b\\x44\\xd5\\xe1\\x74\\xb6\\xd8\\xb5\\xda\\xe5\\x88\\xf9\\xdd\\xab\\x43\\x3f\\x2e\\x2c\\x48\\x1b\\xfb\\x81\\xba\\xa8\\x57\\x97\\xe0\\xd5\\xc7\\x5d\\xff\\x2e\\xbb\\xfe\\x1f\\xb1\\x30\\x0c\\x7f\\x8c\\x34\\xa4\\x72\\xe6\\xb0\\xf4\\x50\\x8d\\xa0\\xca\\x15\\xcd\\xce\\x42\\x06\\x71\\x91\\xad\\xa6\\x08\\x36\\xea\\xcc\\xb5\\x8b\\xd4\\x50\\x80\\xbd\\xf4\\xa3\\x8c\\x25\\x37\\x99\\x95\\x6d\\x73\\x9d\\x95\\x6d\\xe5\\xac\\x6c\\x2b\\xb3\\xb2\\x2d\\xdf\\xab\\x6c\\x5b\\xc5\\x58\\x8c\\xa8\\x0b\\xef\\x2d\\x33\\x3b\\x5a\\x1f\\x59\\x13\\x79\\x5d\\x82\\x9c\\x27\\xdb\\x4f\\x8d\\x0c\\x3d\\xa6\\x77\\xb7\\x54\\x92\\x57\\x81\\x00\\x09\\x19\\xed\\x21\\x06\\xa1\\x58\\xad\\xda\\x34\\x46\\x2d\\x1b\\x39\\x64\\x41\\x2f\\x10\\x4a\\x47\\xe3\\xb1\\x45\\x42\\x74\\xcf\\xc2\\x64\\xb5\\x23\\xc4\\x55\\xac\\x45\\x7a\\xae\\xe8\\xdc\\x07\\x3f\\x0a\\xda\\x34\\xcd\\x4c\\x59\\x37\\xde\\x66\\xbc\\xa9\\xdb\\xa6\\x85\\x5a\\xb7\\x3d\\x03\\xa3\\xe4\\xba\\x7d\\x40\\xe5\\xcc\\x24\\xe1\\x90\\x2b\\x82\\x8c\\x62\\x9d\\x0d\\x02\\x73\\xdf\\xd1\\x09\\x26\\x19\\x49\\x2f\\x74\\x99\\x2d\\x59\\x74\\x08\\x2a\\x26\\x53\\xf0\\x96\\x55\\x6a\\xd4\\x8d\\x1c\\x54\\xc8\\x82\\x69\\x3d\\x26\\xed\\x70\\xe4\\x1d\\x1d\\xda\\x7b\\x9a\\xf3\\x5a\\xdb\\x86\\xac\\x56\\x0a\\x34\\xe3\\x52\\xbb\\xf5\\x30\\x83\\xdc\\x91\\x0b\\x3e\\xa9\\x27\\x3e\\x21\\xb6\\x06\\x76\\x2d\\xb4\\x6e\\x74\\xd4\\xee\\x0d\\xda\\x51\\x1d\\x83\\x41\\xd0\\x26\\x95\\x4a\\x39\\x87\\x6e\\x2e\\x17\\x58\\x7b\\x28\\xfc\\xd0\\x79\\x76\\xf0\\x41\\x41\\x15\\x73\\xbd\\x40\\x62\\xa3\\xad\\xb1\\x89\\xe1\\xc8\\x23\\x70\\x96\\xbb\\x5b\\x7d\\xff\\xdc\\x2d\\x6a\\x39\\x9a\\x55\\xbd\\x8b\\x3c\\xd8\\xab\\x77\\xc4\\x51\\x7c\\xc7\\xd3\\x0c\\x1f\\xe2\\x28\\x79\\x0b\\x08\\x88\\xaa\\x8c\\xc6\\x66\\x38\\x13\\x84\\x98\\x9d\\x89\\x12\\x9c\\x7e\\xe7\\xab\\x8c\\x80\\x78\\xe7\\x3e\\x42\\x33\\xe1\\x8a\\x22\\x87\\x30\\xef\\xbd\\xc6\\xd0\\x9c\\x67\\xb7\\xca\\x9b\\x89\\x38\\x73\\xa9\\x60\\x27\\x62\\x99\\xd3\\xbd\\x26\\xe6\\x50\\x06\\xd6\\x6a\\xa4\\xd4\\xb1\\x48\\xce\\x07\\x1a\\x74\\x20\\xca\\x97\\x2d\\x37\\x3d\\x59\\xcb\\x7d\\x48\\x4a\\x38\\x6d\\x66\\x7f\\x28\\x3a\\xbb\\xd5\\xec\\xd1\\x0b\\x86\\x74\\x2b\\x57\\x78\\x1d\\x89\\x52\\xeb\\xef\\x9d\\x80\\xcd\\x4c\\x3f\\x51\\x39\\xd8\\xf6\\xb3\\x95\\xd0\\xe4\\xb3\\xd8\\xf6\\x87\\xb6\\x05\\xf8\\xc5\\xfd\\x6e\\xa7\\xef\\xe5\\x9e\\xfe\\xa5\\x79\\xa7\\xaf\\xbe\\x72\\x4a\\xe9\\xd9\\x93\\xb0\\x7c\\xf3\\xed\\x57\\x77\\xf1\\xf9\\x8b\\x23\\x7e\\xff\\xd9\\x93\\xce\\xf4\\xc8\\xd7\\xe9\\xcd\\xaf\\x53\\xcd\\xfc\\xc8\\xf7\\xf9\\xed\\x6e\\x2f\\x6f\\x79\\xfb\\xfc\\xe6\\xf7\\x4b\\x6e\\x8f\\x7c\\xbd\\xbc\\xf9\\xf5\\x4c\\xe9\\x91\\xaf\\xd7\\x37\\xbf\\xce\\x4d\\x1e\\xf9\\x7a\\x7b\\xbb\\xaf\\xf7\\x1f\\x7c\\x3d\\x95\\x47\\xbe\\x3e\\xde\\xfc\\xba\\x70\\x7f\\xe4\\xeb\\xcf\\xdf\\xfc\\xfa\\x78\\x64\\xde\\x29\\xbd\\x73\\x8f\\x5e\\x4e\\x44\\xef\\x73\\x31\\xbf\\xcf\\xc5\\x3f\\xdc\\x2e\\xa2\\x0b\\xfa\\xe6\\xfd\\x28\\x71\\xf6\\x1b\\xea\\xc7\\xc7\\xee\\xf8\\x83\\x0d\\xc5\\x22\\xf9\\x87\\x77\\xe4\\x94\\xe7\\x10\\xf5\\xe3\\x63\\x77\\x3c\\xfb\\xd7\\x35\\x09\\x03\\x2e\\x05\\x95\\x44\\x4c\\x2d\\x48\\x2f\\x50\\xc0\\x35\\x6f\\xc6\\xa9\\xa7\\xe0\\xec\\x7f\\xf7\\xd6\\x8b\\x55\\x4e\\x48\\x8e\\x9a\\x79\\x7a\\x22\\xa0\\x04\\xc5\\x32\\x35\\xf0\\xa3\\x7b\\x57\\xa3\\xdc\\x2f\\x6d\\x27\\x25\\x87\\x68\\x99\\x53\\xbd\\x19\\xdf\\x12\\x94\\x9f\\xdc\\xd0\\x31\\x93\\xf8\\xba\\x2f\\x9a\\x13\\x4d\\x57\\xa7\\x48\\x0f\\xdd\\x0a\\x3f\\x14\\x09\\x63\\x36\\x6e\\x43\\xd8\\xc5\\x14\\x30\\x27\\xc3\\x15\\xc1\\x4a\\x67\\x48\\x43\\xa7\\x41\\xc4\\x6e\\x10\\xa1\\x29\\x21\\x9f\\xbc\\x46\\x68\\xca\\x5e\\x0d\\x8d\\xc8\\x6c\\x3c\\x87\\xe2\\x18\\x86\\xe8\\xad\\x4e\\x1c\\xb2\\x6c\\xe0\\x9e\\xee\\x8f\\x89\\x2e\\x7a\\x7e\\x6f\\x90\\x91\\xfb\\x6b\\xa3\\x9c\\x63\\x7c\\x7d\\x84\\xc0\\x81\\xe8\\x3a\\x68\\xe3\\x33\\x7d\\x1f\\x7c\\xda\\x3e\\xfc\\x08\\x2f\\xa5\\xcb\\xf9\\xa1\\xb5\\x4f\\xef\\xb2\\xf6\\xd5\\xe6\\x1f\\x6b\\xdf\\xac\\xcc\\x5f\\xf9\\xc1\\xda\\x97\\x73\\xed\\xfb\\xb9\\xf6\\xc5\\xd6\\x9e\\xb1\\xf6\\xb7\\xa5\\xd7\\x07\\x86\\x54\\xc7\\x9b\\x43\\xba\\x37\\xa0\\xb7\\x1e\\x4e\\xf8\\xe3\\xc7\\xf3\\xc8\\x24\\x9e\\xd5\\xd7\\xb9\\xd8\\x5e\\x1c\\x58\\xe5\\x3a\\xf7\\x62\\x7b\\x7d\\x2f\\xb6\\xcb\\x5e\\xac\\xa0\\xbc\\x21\\x9a\\x81\\xbd\\x58\\x43\\xae\\x57\\x56\\xda\\xe2\\x05\\x56\\x23\\x51\\x97\\x9b\\x5f\\x5b\\xee\\xea\\xbd\\xc1\\x75\\xb9\\x6f\\x4b\\x1e\\x7f\\xcc\\x38\\xca\\x0f\\xc6\\x51\\xdf\\x7a\\x1c\\xe1\\xb1\\x81\\x3c\\x32\\x65\\x2f\\xef\\x4d\\x99\\x9d\\x8c\\xcb\\x58\\xe7\\x48\\x1f\\x3a\\x19\\xf5\\xa6\\xfc\\xe0\\x6c\\xd4\\x0f\\x31\\x5f\\x6f\\x33\\x88\\x3f\\xfe\\x78\\x5e\\x1b\\x44\\x78\\x9b\\xc9\\xe2\\xb3\\x73\\x94\\x5a\\x9a\\x09\\x7d\\x58\\x39\\x78\\x13\\x66\\xde\\xcd\\x17\\x54\\xd2\\x56\\x2d\\x0f\\x0e\\xbd\\x50\\x36\\x3d\\x1b\\x85\\x8c\\xab\\xcd\\x84\\xec\\x2e\\x2f\\xe5\\x82\\x2f\\xf8\\x87\\x32\\x33\\xbf\\x60\\x11\\x3c\\x36\\x86\\xb3\\x19\\x6c\\xb6\\x9e\\xc9\\xb9\\x05\\xa9\\x68\\x2f\\x56\\x82\\x54\\x6f\\x2e\\xe6\\x2d\\x56\\x8d\\xd8\\x89\\x23\\x95\\xcf\\x16\\x6c\\x67\\x8f\\x31\\x6f\\xb2\\x0a\\xcf\\x40\\x77\\x61\\x9c\\x43\\xe7\\x3b\\xf4\\x6f\\xb5\\x9b\\xcf\\xee\\x65\\xd9\\xdb\\xb7\\x96\\xd7\\xda\\xb7\\x36\\x6b\\xdf\\x9a\\xdf\\xaa\\x7d\\xeb\\x6d\\x63\\xba\\xdc\\xbd\\xe1\\xde\\xf9\\xfe\\x9d\\xaf\\x8f\\x3a\\xcc\\x61\\x5b\\x63\\xb4\\x6c\\x8d\\xd1\\x1e\\x13\\x09\\xfc\\xea\\xad\\xb0\\x90\\x9c\\x5d\\x59\\xd1\\x06\\x87\\x8e\\xdc\\xd0\\x83\\x53\\x12\\x3a\\x72\\xc6\\x9e\\xad\\x43\\x67\\xe4\\x4c\\x68\\xf5\\x89\\x36\\xb3\\xb1\\x93\\x8e\\xee\\x91\\x61\\xc8\\xf3\\x7b\\xf7\\x7d\\xa3\\x4d\\xe8\\x7b\\xf4\\xfb\\xe4\\x54\\x7e\\xf0\\x7e\\x8f\\xe2\\xd4\\xe7\\x53\\xcd\\xd4\\x1e\\x72\\xae\\xab\\xb9\\x4e\\x17\\xb8\\xe0\\xe0\\xe9\\x73\\x3b\\x9d\\x82\\x37\\xd2\\x29\\x23\\xd8\\x57\\x50\\x39\\xdf\\xbf\\x4e\\x09\\x66\\x8b\\x1a\\xd4\\x0d\\xed\\x81\\x76\\x4b\\x4b\\x24\\xa9\\x3b\\x49\\xb7\\x66\\xdb\\xe6\\x7e\\xc5\\x6d\\xa8\\xb6\\x40\\x81\\xad\\xbf\\x72\\x5a\\xed\\x08\\xe4\\xb4\\xa9\\xcd\\x1e\\x22\\x89\\xb5\\x74\\xd4\\xcd\\x97\\xf3\\xae\\xf6\\x1d\\x6a\\xb0\\xd1\\x4c\\x5f\\xb0\\x3e\\xfa\\x56\\xa4\\x6d\\x16\\x44\\xa2\\x59\\x6f\\x55\\x6e\\xca\\x52\\x52\\xb1\\x84\\x52\\x0c\\x34\\xb7\\x81\\x5a\\x5d\\x70\\x21\\x59\\x5c\\xfd\\x88\\x05\\xc5\\xbf\\xf2\\x08\\x4b\\x66\\x2f\\xac\\x88\\x2f\\x4b\\x15\\x34\\xb1\\xa4\\x06\\xd6\\xb9\\x45\\x93\\xfb\\xce\\x76\\xfb\\xde\\xdd\\x07\\xa2\\x1a\\xbc\\xe7\\xb5\\x4c\\x4f\\xa1\\x25\\x43\\x26\\x94\\xac\\x9a\\xed\\xa3\\xef\\xb1\\xa7\\xd3\\x2c\\x89\\xdb\\xc7\\x85\\x6c\\x81\\x6c\\x5d\\x74\\x5e\\xe0\\x84\\x4e\\x04\\x8f\\x60\\x41\\xba\\x88\\x1a\\x35\\xf1\\x69\\x1c\\x9d\\x96\\x5c\\xf8\\x88\\x9d\\x96\\x48\\x3d\\x1f\\xb1\\xd4\\xbc\\xc4\\xc1\\x07\\x7e\\x52\\xab\\x26\\x3d\\x6b\\x29\\x47\\xcd\\x65\\x69\\xbc\\xc2\\xff\\xc0\\xa3\\xae\\x54\\x72\\xe0\\x51\\x97\\xda\\x8e\\xa8\\x7f\\x8b\\xbd\\x1e\\x39\\x93\\xb7\\xcd\\x62\\x9d\\x0f\\xe1\\x20\\x2b\\x52\\xd7\\xc1\\xf6\\xcf\\x99\\x96\\xc7\\x0a\\x4f\\x72\\x41\\x34\\xec\\x75\\xa3\\x41\\xc8\\x46\\x9c\\xc0\\xa3\\xe6\\x65\\x08\\x1f\\x51\\x3f\\xe8\\xff\\xfc\\x56\\x4f\\x5f\\x7d\\xf3\\xf5\\xae\\x3f\\x5f\\xbc\\x7c\\xf5\\xdd\\x6f\\x3e\\x7d\\xfa\\xdd\\xf1\\xe5\\x6f\\xc2\\x7f\\x08\\x00\\x00\\xff\\xff\\xce\\x62\\x9a\\x93\\x25\\xf4\\x00\\x00\")\n\nfunc fontsInconsolataRegularWebfontSvgBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataRegularWebfontSvg,\n\t\t\"fonts/inconsolata-regular-webfont.svg\",\n\t)\n}\n\nfunc fontsInconsolataRegularWebfontSvg() (*asset, error) {\n\tbytes, err := fontsInconsolataRegularWebfontSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-regular-webfont.svg\", size: 62501, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataRegularWebfontTtf = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xac\\xfc\\x0b\\x78\\x1b\\xd7\\x79\\x27\\x8c\\xbf\\x67\\x66\\x70\\xbf\\xce\\xe0\\x46\\x12\\x04\\x01\\x10\\x04\\x21\\x68\\x04\\x8e\\x80\\x21\\x08\\x8d\\x28\\x5e\\x44\\x51\\x14\\x45\\xd1\\x34\\x4d\\x33\\x2c\\xc5\\x30\\x34\\x45\\x51\\x94\\x2c\\x59\\x96\\x64\\x9a\\x56\\x18\\x2e\\xab\\xb2\\xac\\xca\\x48\\x8a\\x2c\\x2b\\xb2\\x15\\xd9\\x51\\x1d\\x55\\x75\\x55\\xad\\xe3\\xbf\\x7b\\x06\\xa4\\x15\\x57\\x71\\x5d\\xd9\\x69\\x92\\xba\\xae\\xff\\xfe\\xb2\\xd9\\x28\\xeb\\x7a\\xfd\\xd9\\xae\\xeb\\x75\\xa7\\x75\\xd2\\x6e\\xbf\\x6c\\xea\\xd8\\x24\\xf8\\x3d\\xe7\\x0c\\x48\\x49\\x4e\\xb6\\xbb\\xfb\\x3c\\x9f\\x65\\x00\\x83\\x01\\x88\\x73\\x7b\\x2f\\xbf\\xf7\\xf7\\xbe\\xe7\\x00\\x02\\x00\\x1e\\x01\\x70\\xe0\\x6e\\x6b\\xeb\\xbd\\x6b\\xf4\\x1a\\xff\\x6f\\x00\\xa8\\x1c\\x00\\xca\\xb7\\xb5\\x6e\\x6d\\x43\\x1e\\xe0\\x00\\xd0\\x06\\x00\\x88\\xdc\\x7d\\xaf\\x94\\x39\\xe8\\xf6\\xff\\x0b\\x00\\xea\\x07\\x80\\xe1\\xdd\\x07\\x77\\x1d\\xe6\\xf8\\xcd\\x00\\x80\\x5e\\x04\\x40\\x7f\\xbb\\xfb\\x91\\x87\\x23\\xee\\x82\\xb5\\x0a\\x80\\x7d\\x1c\\x00\\x36\\x8e\\x1d\\xde\\x7b\\xf0\\xde\\x05\\xe9\\x4f\\x00\\xd8\\xff\\x0b\\x80\\xd9\\xb3\\x77\\xd7\\xf8\\x61\\x00\\x70\\x03\\x18\\xc9\\xef\\x99\\xf7\\x3e\\x30\\x39\\x76\\xc2\\xe8\\xd8\\x00\\x60\\x6c\\x06\\x78\\xf2\\xf0\\xbe\\x3d\\xbb\\x46\\x8d\\xdf\\xfb\\xfd\\x11\\x80\\x6f\\x61\\x00\\xa8\\xdb\\xb7\\x6f\\xcf\\x2e\\x97\\xcb\\xfc\\x10\\xc0\\xb7\\xfe\\x01\\x00\\xaa\\xf6\\x1d\\x7c\\xf8\\xcb\\xc7\\x3f\\x78\\xb0\\x03\\xe0\\x92\\x1d\\x80\\xbd\\xf0\\xc0\\xa1\\xdd\\xbb\\x7e\\xfb\\xb5\\x9d\\x7f\\x07\\xf0\\x47\\xcf\\x00\\xa0\\xff\\xff\\xc1\\x5d\\x5f\\x3e\\xcc\\xb0\\x68\\x01\\xe0\\x8f\\x1f\\x26\\xfd\\x7d\\x70\\xd7\\xc1\\x3d\\xe7\\x9f\\x9f\\xff\\x02\\xc0\\x1f\\x3f\\x0e\\x60\\xb8\\x7e\\xf8\\xd0\\xf8\\xc3\\x57\\xb3\\xf7\\xfc\\x12\\xe0\\xdb\\xdd\\x00\\xcc\\x9f\\x1f\\x7e\\x68\\xcf\\xe1\\x6f\\xdf\\xb3\\xfb\\xfb\\x00\\xcf\\xbb\\x01\\xd0\\x17\\x8e\\xee\\x19\\x19\\xfb\\x78\\xc7\\xbd\\x3b\\x01\\xfe\\x74\\x1f\\x00\\x18\\xc9\\xc0\\x00\\x00\\xfe\\xa6\\xe1\\xf2\\x9b\\xe4\\xf5\\xaf\\x3e\\xf9\\x4f\\x5f\\x22\\xaf\\x6f\\x1e\\xbb\\xf8\\xd7\\xf4\\x13\\x27\\x00\\x94\\x90\\x3b\\xc0\\x00\\x02\\x04\\x1f\\x02\\x22\\xb3\\x05\\x0c\\x00\\xb0\\xec\\xc7\\xe8\\x31\\x30\\x00\\x67\\x90\\x0d\\x4f\\x01\\xa0\\xb0\\xfe\\xca\\xfe\\x14\\x46\\x19\\x37\\x00\\x63\\x33\\x5a\\x58\\x60\\x01\\xe0\\x77\\x00\\x24\\x00\\x74\\x00\\x8a\\xff\\x75\\x8f\\x6d\\x1d\\x85\\x66\\x70\\xc4\\x17\\x8d\\x63\\x85\\x31\\x00\\xe3\\x14\\xfa\\x3a\\x00\\x78\\xc8\\x67\\xec\\x55\\x6e\\x91\\x8c\\x8c\\xb6\\xce\\x16\\x1f\\xe5\\x7a\\x2f\\xe1\\x3f\\x03\\x4b\\xaf\\xca\\x81\\x83\\x17\\x01\\x60\\x2d\\x44\\x80\\x03\\x2b\\x00\\x38\\xe0\\xb7\\x61\\x19\\xdd\\x8b\\xbe\\xcc\\xfc\\x80\\xf9\\xaf\\x11\\x6b\\xc4\\x1b\\x29\\x8b\\x54\\x44\\x2a\\x23\\xd5\\x11\\x29\\xb2\\x31\\x72\\x5f\\xe4\\xb9\\x68\\x65\\x7c\\x71\\x79\\x99\\xfe\\x8a\\x03\\x22\\x70\\x09\\xf5\\x14\\xbf\\x0b\\x11\\x77\\xa4\\x24\\x52\\x5e\\xfc\\xae\\x72\\xdb\\x77\\xd1\\xf2\\xff\\x58\\xfe\\x60\\xf9\\xd5\\xe5\\xc3\\xcb\\x9d\\x4b\\xcb\\x4b\\xff\\xf8\\xde\\x0f\\xdf\\x7b\\xf5\\xbd\\xbf\\x78\\xef\\xe5\\xf7\\xbe\\xfb\\xde\\x8b\\xef\\xe1\\xf7\\xfe\\xe4\\xbd\\xd9\\xf7\\x72\\xef\\xbe\\xfa\\xb7\\x5a\\xb1\\x6f\\xff\\x9b\\xff\\x21\\x23\\xac\\xfe\\x01\\x62\\x8a\\x33\\x79\\xc7\\x17\\x00\\x58\\xce\\x60\\x34\\x99\\x2d\\x56\\x9b\\xdd\\xe1\\x74\\xb9\\x79\\xc1\\xe3\\xf5\\xf9\\x03\\x25\\xa5\\x65\\xc1\\xf2\\x50\\x45\\x38\\x12\\xad\\x8c\\x55\\xc5\\xab\\x13\\x6b\\x92\\x6b\\xc5\\x75\\xa9\\x1a\\x69\\x7d\\x3a\\x23\\xd7\\x66\\xeb\\x72\\x1b\\x94\\x8d\\xf5\\x9b\\x1a\\x1a\\x9b\\x9a\\x37\\xb7\\x6c\\x69\\xdd\\xda\\xb6\\xad\\x7d\\x7b\\xc7\\x8e\\xce\\xbb\\xba\\xee\\xee\\xbe\\xa7\\xe7\\xde\\xde\\x2f\\xf4\\xfd\\x56\\xff\\xce\\x81\\x2f\\x0e\\x7e\\x69\\xe8\\xbe\\xe1\\x5d\\xf0\\xfb\\x73\\x27\\x4e\\x9d\\xbb\\xf0\\xf4\\x1f\\x5d\\x7e\\xe6\\xca\\x1f\\xff\\xc9\\x7f\\xfc\\xf6\\xb3\\xcf\\xfd\\xff\\xfe\\xf4\\x79\\xac\\xce\\xbf\\xb0\\x70\\xed\\xc5\\xef\\xbc\\xf4\\xdd\\x3f\\x7f\\x19\\x1e\\x1a\\xdd\\x73\\xff\\x3b\\x5f\\xfe\\xc3\\xc3\\x07\\xfe\\xfe\\x91\\xfd\\xf0\\xd5\\xa7\\x60\\x1c\\x60\\xef\\x51\\xda\\xbb\\x07\\xfe\\x03\\x5c\\xbd\\x3e\\xb3\\xfb\\x41\\x72\\x7d\\x70\\xfa\\xff\\x1e\\xf9\\xdd\\xe3\\xdf\\x78\\xf5\\x7b\\x3f\\xb9\\xf9\\xb7\\x6f\\xff\\xf4\\xbf\\xfc\\x19\\xbc\\xf2\\x97\\xf0\\xc1\\x7b\\xef\\x03\\xc0\\xe4\\x5b\\xff\\x15\\x7e\\xef\\x6b\\xb3\\xa7\\x4f\\x9e\\x79\\xec\\xec\\xa3\\x4f\\x9c\\x87\\xc7\\x2f\\xfe\\xc1\\x37\\xe1\\xfb\\x3f\\x38\\x02\\x00\\x5f\\x29\\x0e\\x93\\xae\\xf3\\x31\\x98\\x85\\x09\\x98\\x84\\x23\\x30\\x07\\xa7\\xe1\\x3f\\xc1\\x79\\xf8\\x09\\xfc\\x07\\x7a\\x7d\\x16\\xce\\xc3\\x53\\xf0\\x34\\x3c\\x03\\x57\\xe1\\x39\\xf8\\x32\\xec\\x85\\x7b\\x61\\x08\\x5a\\x0d\\x3c\\x00\\x86\\x75\\x18\\x3c\\x3b\\x70\\x67\\x77\\x3f\\xee\\x78\\x64\\x27\\x86\\x58\\x53\\x09\\x36\\x8a\\xfd\\x0d\\x3b\\xe9\\xbd\\xe9\\x9d\\x91\\xff\\x8c\\x91\\xa7\\xa6\\x24\\x85\\xd1\\xba\\xc8\\xdf\\x62\\xbb\\x98\\xc2\\xcc\\xba\\x1d\\x3d\\xfd\\x5b\\x63\\x3b\\xa3\\x29\\xcc\\xae\\xbb\\xbf\\x24\\x82\\x9b\\xbb\\xfb\\xa3\\xb8\\x79\\x67\\x0a\\x73\\xeb\\xc8\\x9f\\x46\\x63\\xd1\\xaf\\xf4\\xbf\\x13\\x7c\\x63\\x67\\x70\\x47\\x4f\\x7f\\xff\\x52\\xf0\\x67\\x3b\\x83\\xb1\\x28\\x36\\x88\\xfd\\xb8\\xed\\x91\\x9d\\xf4\\x83\\x9d\\x3b\\x4b\\x52\\xd8\\xb0\\xce\\x31\\x38\\x90\\xc2\\xc6\\x75\\x6a\\x25\\xfa\\x6a\\x77\\x3f\\x8e\\x7c\\x75\\x70\\x30\\x88\\x61\\x67\\x0a\\x9b\\xd6\\xa9\\x55\\xf4\\x56\\xf3\\xea\\x2d\\xf3\\x3a\\x81\\x8f\\x28\\x52\\x0a\\x5b\\xd6\\x45\\xa6\\x49\\x23\\x7f\\x19\\x7c\\x63\\x67\\x04\\xb3\\xf1\\xed\\xb1\\x08\\xe6\\xaa\\x3b\\x30\\x74\\xf7\\x9f\\xdc\\x73\\x72\\x57\\x84\\x5c\\x6c\\x08\\x46\\xa3\\x3b\\x83\\x27\\xe9\\xbb\\x1e\\xfd\\x1d\\x69\\xd0\\xaa\\xf7\\xce\\x1d\\x74\\x47\\x77\\xa6\\xb0\\x6d\\x5d\\xe4\\x3f\\xd1\\xe1\\xd8\\xd7\\x45\\x24\\x6c\\x12\\x07\\xfb\\x23\\x91\\x6d\\xb1\\xb6\\x5d\\xfb\\x23\\xfd\\x91\\xd1\\x11\\xfd\\x27\\xc8\\xf7\\x1c\\xa4\\xe5\\x88\\x22\\x45\\x4e\\x46\\xb6\\x9d\\x6c\\xdb\\x15\\x3b\\x19\\x39\\x19\\xa3\\xcd\\xc5\\xc8\\x8f\\xe3\\xe6\\x0d\\xc1\\xe8\\xce\\x60\\x8c\\xdc\\xc0\\xcd\\x7b\\xc8\\x9b\\x9d\\x29\\xec\\xa4\\x2d\\x35\\xdc\\x2c\\x89\\x46\\x83\\x91\\x9b\\x27\\x77\\xf4\\xf4\\x47\\x4e\\xc6\\xb6\\x47\\x30\\x7c\\xa1\\xd8\\xb7\\x28\\xfd\\x9a\\x6b\\x5d\\x2c\\x72\\xb3\\xd8\\x78\\x2c\\xd2\\xbf\\xe3\\xde\\x60\\x14\\xa3\\x9d\\xfd\\x27\\x31\\x57\\xbd\\x3d\\x76\\x32\\x16\\x39\\xb9\\xfd\\x64\\x6c\\x17\\xf9\\x03\\xfd\\x4f\\xc8\\x4b\\x0a\\xbb\\xc9\\x32\\x08\\x62\\x0a\\xf3\\x64\\x00\\xe4\\x42\\xf8\\xdc\\x00\\x4e\\x92\\x97\\xd8\\xae\\xfd\\xc3\\xb7\\x8f\\x84\\xfc\\xa9\\x67\\x5d\\xe4\\x64\\xe4\\xe4\\x1c\\x99\\xb6\\x8e\\xd1\\xd8\\x49\\x13\\x8e\\x74\\xf7\\x6f\\x0a\\xde\\xd8\\x99\\xc2\\xde\\x75\\xf3\\xd0\\x8c\\x9a\\x5b\\x5a\\xd0\\x8e\\x17\\xdd\\xb0\\x1b\\xe8\\x33\\xf9\\xf2\\x17\\xfa\\xc9\\x73\\x4f\\x7f\\x6c\\x24\\x82\\x21\\xd6\\x12\\x1c\\x89\\x60\\x14\\x6b\\xd9\\x19\\xc1\\xcd\\x3d\\xfd\\x79\\x88\\xc0\\x96\\xdd\\x2d\\x79\\x14\\x41\\x5b\\x76\\xb7\\xe0\\xc8\\x6e\\x5c\\xba\\xa7\\x7c\\xa5\\x2d\\xdf\\x3a\\x8c\\xb6\\xec\\x8e\\x61\\xd8\\xb2\\x3b\\x96\\xd2\\x35\\x11\\x2d\\x2f\\x83\\x0b\\x18\\x68\\x05\\x60\\x46\\x0d\\x5f\\x00\\x16\\x4c\\x50\\xa3\\x22\\x90\\x36\\xe5\\x4d\\x5c\\xf0\\x67\\x19\\xd5\\x68\\xf8\\xaf\\x9b\\xf2\\x2c\\x13\\xfc\\x59\\x06\\x54\\x96\\xdc\\x36\\x90\\xdb\\x79\\x93\\xb1\\x7c\\x71\\x53\\x1e\\x91\\xfb\\x32\\x1f\\xe5\\xe3\\x51\\x3e\\xda\\xca\\x44\\x0a\\x55\\xe8\\x42\\x61\\x9f\\xe1\\x0b\\x9f\\x7e\\xbb\\x95\\x7b\\x83\\x68\\x3e\\x3a\\xb2\\xac\\x31\\xa3\\x86\\x7e\\xb0\\x43\\x05\\xb4\\x41\\xde\\x0a\\x20\\x2e\\xb0\\x56\\xe0\\x39\\x11\\xe1\\xb0\\x84\\xe1\\xe6\\x82\\xc9\\x4e\\xde\\x61\\x4f\\x06\\x9b\\xdc\\xaa\\xc3\\xae\\x61\\x87\\x84\\x4d\\xee\\x05\\xd0\\x6f\\x83\\xa4\\x46\\x90\\xa8\\x9a\\x1c\\xbc\\xa0\\xb2\\x56\\x45\\x81\\xf5\\xe9\\x78\\x6d\\x9d\\x9c\\x09\\xf8\\x7d\\x5e\\x63\\xac\\xb2\\xda\\x43\\xde\\x90\\x6b\\x17\\x62\\x63\\x6c\\x0d\\x8b\\x8e\\x6c\\x4b\\xa7\\xe3\\xf1\\xed\\x99\\xf4\\x36\\xef\\x86\\xb4\\xa4\\x70\\x9c\\x35\\xbe\\xb7\\x82\\x31\\x19\\x8d\\xc3\\xe9\\x8e\\x78\\x3c\\x2d\\xb5\\xb7\\x71\\x5f\\x6f\\xbf\\xbb\\x7b\\x30\\xd0\\x94\\xdc\\xbf\\xf4\\xd7\\x4c\\x5d\\x74\\x5b\\x6b\\x03\\x30\\xf0\\x01\\xdb\\xc9\\xa6\\x0c\\xbd\\xe0\\x84\\x72\\x68\\x03\\xec\\x94\\x70\\xb9\\xbc\\x60\\xb6\\x82\\x99\\x13\\xb1\\x3f\\x83\\x70\\x48\\xc2\\xdc\\x4d\\xd5\\xe6\\xd5\\xb0\\xcd\\xad\\x0a\\x48\\x54\\x4b\\x7d\\x9a\\x5a\\x81\\x44\\xd5\\xc6\\xf1\\x82\\x6a\\x76\\x2a\\x0a\\x16\\x78\\xec\\x52\\x70\\xa9\\xa0\\xfa\\xcb\\x69\\x3f\\x3d\\xb9\\x46\\x94\\x4d\\x14\\xfb\\xe7\\x42\\x4d\\xa8\\xee\\xb6\\x77\\x1f\\xa4\\xac\\x36\\x67\\x36\\x16\\x53\\x5a\\xd3\\xff\\x92\\x12\\xec\\xe4\\xaa\\x2d\\xcd\\x8e\\x7d\\x2d\\x5c\\x17\\x9c\\x51\\x36\\x34\\xb4\\xb6\\x5d\\x9f\\x2b\\xfb\\x5a\\x83\\x4c\\xaf\\x9b\\x5e\\x99\\xa3\\x56\\x54\\x06\\x2f\\xfb\\xa6\\x81\\x81\\x20\\x84\\x51\\x37\\xe4\\xcd\\x0c\\x88\\xaa\\xc9\\x2e\\xcb\\xb8\\x44\\xca\\x7b\\x03\\x41\\x59\\x96\\x17\\xca\\x4d\\x90\\xe4\\xc4\\x3c\\xc3\\x87\\x32\\x99\\x4c\\xbe\\xa4\\xdc\\x2a\\xce\\x37\\x97\\x94\\x5a\\x44\\xcc\\x49\\xf3\\xac\\xbb\\x22\\x5c\\x15\\x90\\x17\\x0c\\xf4\\x3b\\xf3\\x46\\x8b\\xd5\\x51\\x15\\xc8\\x20\\x1c\\x91\\x70\\xd9\\x4d\\xb5\\x34\\xa0\\xe1\\x52\\xb7\\x6a\\x42\\xa2\\x6a\\x76\\x68\\xd8\\xec\\x56\\x6d\\x48\\x54\\xed\\x0e\\x4d\\x8d\\x22\\x11\\xd7\\x95\\x5d\\x6f\\x3a\\xfb\\xc9\\x39\\xf0\\x89\\x56\\x0e\\x9b\\xdc\\xb8\\xec\\x06\\x79\\x7f\\x96\\xbc\\x77\\x62\\xbb\\x1b\\xfb\\x6e\\x70\\xaa\\xcd\\xf1\\x2b\\x27\\xf6\\xdf\\x30\\xe0\\x32\\xf7\\x3c\\x53\\x66\\xf2\\x88\\xf3\\x2c\\x7d\\x36\\x92\\x67\\x5c\\xea\\x9e\\xb7\\x94\\x9a\\x3d\\x22\\xf6\\xbb\\xe7\\xad\\x7e\\x9b\\x47\\xc4\\x3e\\xf7\\xbc\\xc3\\x67\\xf7\\x88\\xf3\\x6e\\xfa\\xcc\\xd3\\x67\\x2f\\x79\\x26\\xdf\\x09\\xd0\\xef\\x94\\xba\\xe7\\x4b\\xe8\\x5f\\x95\\xb9\\xe7\\x83\\x2b\\xbf\\x53\\xbe\\xf2\\x3b\\x21\\xf2\\x9d\\xf9\\x8a\\x95\\x6f\\x86\\xc9\\x7d\\x16\\xe6\\x6d\\x3e\\x7f\\x59\\x4d\\x4d\\x4d\\x0d\\x6a\\x16\\x18\\x96\\x0c\\xd3\\xcd\\x53\\xf7\\x42\\x9d\\x4b\\xcd\\xaf\\xfd\\x87\\x9b\\xcb\\xe8\\x6a\\xc9\\x9e\\x58\\x4e\\xf6\\xe4\\x58\\xfa\\x30\\xc5\\xe8\\xc3\\xe4\\x21\\x0f\\xf2\\x91\\x6c\\x7e\\x3d\\xf9\\xae\\xf1\\x83\\xe4\\xb4\\xf8\\x77\\x6b\\x8e\\x25\\xbf\\x6b\\xff\\xae\\xf8\\xba\\xf5\\xf5\\xd4\\x74\\xea\\x03\\x71\\x52\\x3c\\xfe\\xbe\\xf8\\x01\\x9a\\x1b\\x44\\xf7\\x0d\\xa1\\x21\\xae\\x70\\x19\\xf5\\x31\\x85\\xe7\\x86\\x0b\\x57\\xbe\\x54\\xf8\\x9a\\x05\\x1d\\x2d\\x7c\\x9d\\x41\\x0f\\x0c\\x23\\x0a\\x3a\\x58\\x98\\x5a\\xbe\\xc4\\x3e\\x6f\\xc8\\x42\\x0d\\xd4\\x42\\x3d\\x5c\\x01\\x9c\\x92\\xf0\\x5a\\x59\\x35\\x1a\\x34\\x9c\\xcd\\xe4\\x53\\x46\\xb2\\x60\\xa9\\x75\\x16\\x11\\x97\\x49\\x38\\x23\\xe1\\xb0\\xac\\xba\\x0c\\x1a\\x0e\\x64\\xf2\\xae\\x0c\\xf9\\xc8\\xe5\\xb6\\x88\\x08\\x6f\\x92\\xb0\\xf5\\xa6\\x2a\\x39\\x35\\x2c\\xb9\\xd5\\x75\\x48\\xcc\\x1b\\x5d\\xe9\\x4c\\x26\\xa3\\x8a\\x01\\x6d\\xde\\xe3\\x0f\\x67\\xab\\x02\\x19\\x2c\\xba\\xd5\\x0d\\x48\\x54\\xe3\\x4e\\x4d\\x6d\\x40\\xa2\\x2a\\x59\\x79\\x21\\x8f\\x18\\x56\\x51\\x14\\x75\\x83\\xc8\\x0b\\x2a\\x1f\\x54\\x14\\x1c\\xe7\\xd5\\xb2\\x52\\x45\\x01\\xd5\\x98\\xe2\\x05\\x5c\\xa3\\xe0\\x32\\xfe\\x3b\\x80\\xac\\x91\\xb8\\x94\\xae\\xaf\\x0a\\x28\\x38\\x23\\xe0\\x52\\x65\\x7d\\xba\\x09\\xf9\\xbd\\x01\\x7f\\x80\\xaf\\x41\\xd9\\xda\\x46\\x26\\x97\\x95\\x89\\xc2\\x99\\x7c\\xfe\\x80\\xa9\\x06\\x25\\xaa\\x13\\x7c\\x05\\xeb\\xf3\\x3a\\x19\\x93\\x2f\\x96\\xad\\xf6\\x78\\x03\\xbc\\x13\\xa1\\x46\\x94\\xad\\xad\\x4e\\x4c\\xf5\\x9b\\x8d\\x63\\x4f\\x5d\\xfa\\x96\\xd4\\x3b\\xb1\\x6d\\x96\\xb1\\x33\\xaf\\x1c\\xee\\xb7\\x32\\xd6\\xf6\\xa9\\xfe\\x99\\xde\\xa4\\xd4\\x7f\\xac\\xfb\\xe8\\x3b\\xf1\\x17\\x07\\x07\\x91\\x34\\x72\\x68\\xe4\\xd0\\x2b\\x5f\\x31\\x96\\x5b\\x0e\\x39\\xd1\\xf7\\xb2\\xe7\\x0f\\xe7\\xf6\\x74\\x65\\xad\\x53\\x0c\\xc7\\x09\\xae\\xae\\xc0\\xef\\x1f\\xe2\\x42\\xd6\\x5e\\x5f\\xe1\\xe1\\x50\\x43\\xe7\\x70\\x53\\xfd\\xa1\\xc1\\x16\\xeb\\xcc\\xb4\\x9b\\x9d\\x98\\xe8\\x40\\xbb\\xad\\xf7\\x2d\\x7e\\x57\\x98\\xdc\\xd6\\xd1\\x1f\\x03\\x30\\x80\\xb2\\xfc\\x31\\xfb\\xb6\\x41\\x00\\x1e\\x7c\\x10\\x85\\x2c\\xb4\\xc0\\xd7\\x21\\x2f\\x00\\x88\\xf9\\x34\\x80\\xa8\\x2a\\x26\\x2d\\xef\\x61\\x40\\xcc\\x1b\\x88\\xe2\\x84\\x4d\\xda\\x42\\x73\\x22\\x6d\\x70\\x88\\x6a\\xb3\\x49\\x5b\\x28\\x75\\xd0\\xcb\\x52\\x93\\x86\\xf0\\x16\\x62\\x97\\x54\\xbf\\x43\\xc3\\x7e\\xb7\\x5a\\x8e\\x44\\xd5\\xea\\xd0\\xb0\\xd5\\xad\\x56\\x22\\x51\\xad\\x0b\\x68\\xb8\\xce\\xad\\x6e\\x42\\xa2\\xba\\x2e\\xa0\\xa9\\xad\\x48\\x54\\xcb\\xfd\\xbc\\x90\\x77\\xf8\\x0c\\x64\\x6a\\x37\\xd5\\xf1\\x42\\xde\\x93\\x4e\\x28\\x64\\x52\\x9b\\x05\\x5e\\x50\\x2b\\xd7\\x29\\x8a\\x1a\\x2e\\xe5\\x05\\xd5\\x0a\\x8a\\xb2\\x3e\\xed\\xa9\\x6d\\x64\\xe4\\x4c\\x05\\x43\\xcd\\x57\\x0d\\xe3\\x41\\x32\\x62\\xbd\\x7e\\x39\\x53\\x97\\xad\\xad\\x8e\\x55\\x1a\\xd1\\xea\\xc7\\x4e\\x86\\x7c\\x9e\\x2b\\x7e\\x96\\x20\\x1f\\x2a\\xf1\\xc6\\x5e\\x49\\xea\\x6d\\x88\\xcf\\x8e\\x48\\xbd\\x8d\\xf1\\x38\\xf3\\xbd\\x13\\x4b\\x39\\xb1\\x25\\x91\\x68\\xd8\\x9c\\x88\\x37\\xa3\\xc1\\xe2\\xc7\\xb1\\x78\\x43\\x8f\\x44\\xbe\\x30\\xd9\\x96\\x4c\\x36\\xc5\\x62\\xd5\\xc9\\x16\\xce\\x9c\\xdb\\xbd\\x2d\\x99\\xdc\\xbe\\x3b\\x37\\xf1\\x44\\xb2\\x7d\\x64\\x31\\xcd\\x2d\\x7e\\xc6\\x71\\xe6\\xbe\\x8e\\xf6\\xfe\\xfe\\xf6\\xf6\\xc5\\xc7\\x73\\x23\\xed\\xc9\\x64\\xc7\\x70\\x2e\\xb7\\xbb\\x6d\\xcd\\x9a\\xb6\\x91\\x8d\\xfd\\x9d\\x5d\\x3d\\xbd\\xc9\\x44\\x07\\x95\\xd9\\x8e\\xe5\\x8f\\xd8\\xb7\\x0c\\x66\\x58\\x03\\x39\\x68\\x81\\xfd\\x90\\xaf\\x02\\x10\\x71\\x44\\x56\\x6b\\x38\\x2d\\x6f\\x25\\x93\\xd9\\x6c\\x5c\\x9d\\xb6\\xa4\\xa0\\xcd\\x1b\\x92\\x60\\x16\\xd5\\x0d\\x2e\\x0d\\x27\\xdd\\x54\\xfa\\x5c\\x4e\\x7d\\xaa\\x1a\\x36\\xf0\\xc2\\x0b\\x56\\xb6\\xaa\\x26\\xeb\\x25\\xe2\\xe5\\xe2\\xd5\\x68\\x2d\\x99\\xa9\\x9a\\x2a\\x5e\\xc0\\x61\\x05\\x37\\xf3\\xd7\\xc0\\xc5\\x56\\x44\\xb3\\x1b\\xab\\x02\\x74\\xae\\xea\\x72\\xd5\\x89\\xdb\\x66\\xc4\\xe4\\x69\\x44\\xb9\\x44\\x6d\\x2e\\x60\\x34\\x05\\x4c\\x09\\x27\\xd2\\x67\\xa8\\x82\\x91\\x33\\x8d\\x4c\\x13\\x42\\x4e\\xe4\\xf1\\x06\\xa8\\xe8\\xc5\\x2a\\x8d\\x1d\\xa7\\x27\\xce\\xa2\\x54\\xe7\\x5e\\xa5\\x61\\x6f\\x47\\x75\\x64\\x53\\x77\\xfa\\xbf\\x85\\xea\\x8d\\x8c\\xf9\\x78\\x5b\\xdf\\x63\\x93\\x47\\x9a\\xae\\xed\\x69\\x7b\\xb8\\x4f\\xfa\\x66\\x28\\xdd\\x1c\\x8f\\x6e\\xad\\x4f\\xbb\\xc2\\x85\\xcf\\x7a\\x06\\x77\\x4f\\x77\\xdc\\xd3\\x9b\\x53\\x7a\\x51\\x74\\xe6\\xed\\xcd\\xf8\\x51\\x65\\xf7\\xb6\\x64\\xaa\\x73\\x58\\x96\\xf7\\x0e\\x76\\xfa\\x0b\\x2f\\xc7\\xf6\\xa6\\x4a\\xec\\x96\\x2f\\x4d\\x3d\\x74\\xfd\\x8b\\x2f\\x74\\x0f\\xa7\\x7b\\x0f\\xf7\\x89\\xdb\\x36\\x54\\x78\\xc3\\x09\\x77\\x0c\\x8d\\xc8\\xcf\\x30\\xe3\\x23\\x17\\x63\\xa7\\x5b\\x5b\\xbf\\x78\\x0f\\x00\\x42\\x57\\xd8\\x4e\\xe6\\xb4\\xa1\\x17\\x5c\\x90\\x00\\xec\\x92\\x8a\\xae\\x04\\x61\\xb7\\x84\\x0d\\x37\\x55\\x9b\\x5f\\x53\\x79\\xe2\\x3c\\x0c\\xc4\\x79\\xb8\\xa8\\xbb\\x40\\xb7\\xb9\\x0b\\x27\\x72\\x21\\x74\\x25\\x65\\xb5\\x52\\x17\\xc1\\x54\\xc4\\xe4\\xdb\\x5c\\x43\\xec\\xd8\\x10\\xf1\\x07\\x08\\x85\\x0a\\x4f\\xb3\\x63\\x86\\x5e\\x28\\x01\\x0f\\x20\\x5c\\x4a\\xa7\\xdf\\xe9\\xd2\\xd4\\x32\\x24\\x92\\xdf\\xab\\x15\\x1a\\x51\\x2e\\x60\\x8c\\x25\\x2a\\x4d\\x46\\xc6\\xe7\\xad\\x60\\x02\\xa6\\x1a\\x86\\x41\\xa1\\x6d\\x5f\\x7d\\x79\\xb2\\xc1\\xce\\x05\\x8c\\xf6\\x85\\xd7\\x1a\\xc6\\xaf\\x8c\\x6d\\x9e\\x7a\\xe5\\xf8\\x36\\xc6\\x7d\\x0a\\xa1\\xb7\\xaf\\x66\\xa7\\x39\\xc6\\xb8\\xbf\\x70\\xf6\\x1f\\xc7\\xdf\\xfd\\xeb\\x67\\x37\\x3d\\xd0\\xf4\\xdd\\x0f\\x91\\x99\\xe2\\x84\\x73\\x85\\x8b\\x8c\\x66\\xe8\\x01\\x1f\\xf8\\x01\\xdb\\x24\\x84\\xfd\\x74\\x20\\x6e\\xb7\\xa6\\x06\\x68\\x73\\x81\\x46\\x36\\x5b\\x5b\\xc3\\x24\\x72\\x15\\x8c\\xe0\\xf3\\x32\\x4e\\x64\\x3a\\xb7\\xef\\x4f\\x8e\\x36\\x35\\x8d\\x3f\\x33\\x92\\x98\\xfa\\x9b\\x47\\xef\\xba\\xfb\\xeb\\x6f\\x1e\\xd3\\x72\\x4f\\xbf\\xfa\\xd6\\xf8\\xf8\\x5b\\x2f\\x5d\\xcc\\x1e\\x53\\xe6\\xdf\\x5d\\x86\\xb9\\x13\\x85\\xc5\\xbf\\x7f\\xb1\\x1e\\x10\\xf4\\xc2\\x5b\\xec\\xb3\\x5c\\x02\\x78\\x00\\x4f\\xce\\xc0\\xca\\x4e\\x64\\x62\\xe3\\x01\\x03\\x32\\xd9\\x50\\x02\\xf5\\x66\\x51\\x67\\xf4\\x0a\\x63\\x66\\xc2\\xa8\\x2d\\x5b\\xb8\\x8c\\x98\\x23\\xef\\x7c\\x78\\x08\\x59\\x99\\x1f\\x1f\\xbf\\x88\\x0e\\xd8\\xc3\\xf6\\xc2\\xdf\\x3c\\x3e\\x7d\\xa0\\xf0\\x7a\\x3f\\xea\\x2d\\x3c\\x3b\\x80\\x64\\xd2\\xdf\\x41\\xf8\\x09\\x7b\\x85\\x93\\xc0\\x06\\x3d\\x80\\x41\\xc2\\x26\\x59\\x45\\xac\\x86\\x0d\\x99\\x3c\\x20\\x62\\x48\\xc1\\x6a\\x11\\xf3\\x08\\xc8\\x25\\x62\\x89\\x4d\\xb5\\x13\\x9b\\x8a\\x99\\x8c\\x6a\\x71\\x68\\x98\\xcb\\xe4\\x2d\\x56\\xf2\\x99\\xc5\\x64\\x11\\xf3\\x56\\x0b\\xb9\\xb4\\x82\\x45\\x54\\x1d\\x74\\xac\\x9e\\x6c\\x94\\x97\\xf9\\xa8\\x2f\\xca\\xc7\\xf8\\x41\\x74\\x60\\x06\\x0d\\x15\\x2e\\xcf\\x30\\xbd\\xd3\\xe4\\x75\\xba\\x30\\x83\\x8e\\x51\\x6c\\x85\\x7a\\x0a\\x57\\x99\\x71\\xf8\\x31\\xb8\\x61\\x0d\\x60\\xb7\\xb4\\x60\\x2b\\xca\\x00\\x2f\\x61\\xf6\\xa6\\xea\\x14\\xb4\\x3c\\xeb\\xb4\\x8a\\xf3\\xc0\\x9a\\x2d\\x22\\xc1\\x14\\x64\\xd1\\x88\\xf4\\xd6\\x30\\xd9\\x22\\x4e\\x30\\xa1\\x1e\\xa5\\x33\\x9a\\x88\\x6c\\xc9\\x66\\x7f\\xeb\\xed\\xc2\\x87\\xd9\\xff\\x50\\xed\\xad\\x8a\\x88\\x41\\xb9\\x6d\\xa8\\xf3\\xf2\\xbb\\x74\\x5d\\xce\\x32\\x4d\\xec\\x38\\xf3\\x1a\\xb0\\x10\\x20\\xe3\\x54\\x91\\x59\\x23\\x0f\\x84\\x39\\x49\\x35\\xac\\x74\\xd6\\x77\\x96\\xf9\\x3b\\xa6\\xe9\\xe4\\x49\\x40\\xe8\\xd0\\xb2\\xc6\\x8c\\xc0\\x4f\\xc0\\x0e\\xd9\\x5b\\x68\\x4c\\xe0\\xc4\\xdb\\xaf\\x11\\x81\\x60\\xab\\xc8\\xac\\xf8\\xa2\\x3a\\xe9\\xaf\\xdd\\x01\\xbe\\xd0\\xa1\\xed\\x92\\x94\\x88\\x6f\\xab\\x95\\xb7\\x0e\\xa5\\xdb\\x62\\x71\\x49\\x6a\\x6b\\x05\\x04\\xb3\\xcb\\xcf\\xb2\\xc7\\x0c\\x3d\\x24\\xae\\x0d\\xa0\\x00\\x9a\\x65\\x66\\xa6\\x96\\xa6\\x83\\x86\\x83\\xcd\\x9f\\x5e\\xa0\\xf6\\x64\\x6c\\x59\\x63\\x9f\\x32\\x70\\xe0\\x81\\x0a\\x58\\x0b\\x1d\\x90\\x77\\x11\\xf3\\x5c\\xc9\\x69\\xba\\x65\\x2e\\x63\\x35\\x84\\x45\\x2a\\xcd\\x5e\\xa7\\x86\\xbd\\x6e\\x35\\x41\\x6c\\xb0\\x53\\x23\\xae\\x4e\\x4d\\x78\\x79\\x61\\xde\\x65\\x08\\x84\\xab\\x02\\x0a\\xa8\\x65\\x95\\xbc\\x30\\x6f\\x05\\xff\\xda\\xa2\\xbd\\x20\\xa6\\x22\\xe0\\x17\\x6e\\x59\\xcf\\x00\\xaa\\x41\\xb1\\x4a\\x27\\xe3\\xa9\\x40\\xc4\\x48\\x10\\xaf\\x34\\xd6\\x3a\\x7e\\xae\\xeb\\xd2\\x64\\x7d\\x7b\\xfb\\xc4\\xb9\\xce\\xae\\x73\\xe3\\xad\\xbf\\x5f\\x8e\\xbe\\x97\\x3c\\x90\\x93\\xf7\\xdc\\x25\\xed\\x48\\x1f\\xcc\\xe6\\x76\\x6d\\x13\\xed\\x4e\\x66\\xfc\\xec\\xbf\\x3e\\x3f\\xfc\\x6c\\x77\\xa1\\x70\\xe9\\xf2\\x3f\\x5f\\xea\\xba\\xef\\xd9\\x7f\\x7e\\xee\\xd8\\x43\\xcc\\xd6\\x9e\\xde\\x8e\\xd9\\x97\\x0a\\xa1\\xc1\\x9e\\x2d\\xc7\\xae\\x8d\\xb7\\x1f\\x53\\xc8\\x1a\\x2c\\x10\\xec\\xcc\\x15\\xc0\\x08\\x71\\xc8\\x73\\xc4\\xdf\\x20\\x06\\x44\\x84\\x4d\\x14\\x33\\xb2\\x2e\\x4d\\x35\\x23\\x51\\x65\\x39\\x5e\\xc0\\x88\\x02\\xc3\\xb8\\xcc\\xc7\\x78\\xc3\\x02\\xea\\x1a\\x39\\x5d\\x28\\x70\\xdd\\xcf\\x7f\\xc6\\x70\\x9d\\x9d\\x3a\\x1e\\x3f\\x0f\\xc0\\xce\\x1a\\x38\\x58\\x0f\\x77\\x43\\x1e\\xc8\\xbc\\xac\\x65\\x35\\xfd\\xa2\\xc6\\xa2\\xe5\\xcb\\xc8\\x04\\xb9\\xc8\\x04\\xa5\\x29\\x06\\x08\\xbb\\xb4\\xbc\\x35\\xbc\\x2a\\x9e\\x19\\x24\\x82\\xba\\x16\\x68\\x43\\xaa\\xab\\x86\\x17\\x16\\x38\\x7f\\x20\\x5c\\x4d\\x27\\x47\\xce\\x36\\xa2\\x26\\xa4\\x6b\\x29\\x99\\x11\\x93\\xd1\\x94\\x68\\x44\\x2b\\x96\\xd5\\x85\\x9c\\xac\\x29\\x9a\\xa9\\xab\\x47\\xbe\\xf3\\x9d\\x7f\\xda\\xb3\\x5b\\x6e\\x8a\\xdb\\xab\\x5a\\x7b\\x53\\xd9\\xde\\xe6\\x38\\xc3\\x71\\xfb\\x72\\x7f\\xf1\\x60\\xe7\\xdc\\xd8\\xc6\\x98\\xd2\\x99\\x9c\\x0a\\x6e\\x6e\\x6e\\x08\\x30\\x01\\x6b\\xc0\\x6a\\x1c\\x38\\xff\\xd6\\xf6\\x2f\\x4a\\xdd\\xdb\\x5b\\x63\\xa9\\xde\\x2d\\x89\\xb0\\x28\\x09\\x82\\xa9\\x67\\xe4\\x60\\x6e\\xf7\\xec\\xf6\\xfa\\x03\\xc3\\x3b\\xab\\xc6\\x4b\\xb7\\x74\\xf5\\x89\\xc2\\x19\\x3a\\xb6\\xd3\\xcb\\x1a\\x3b\\x66\\x00\\xa8\\x85\\x2f\\x40\\x5e\\x26\\x43\\x32\\x73\\x5a\\x3e\\x46\\x86\\x54\\xc1\\x6a\\x0b\\x5e\\xb7\\x1c\\x73\\x88\\xaa\\x97\\xb8\\xe0\\xac\\x84\\x4b\\x6f\\xaa\\x6b\\x9c\\x1a\\x76\\x44\\x6e\\xf2\\x6a\\x8d\\x53\\x53\\xeb\\xc8\\xd8\\xdc\\x66\\x5e\\xc8\\x03\\xaa\\x51\\x14\\x05\\x7b\\x79\\x2c\\x2a\\xb8\\x42\\xc8\\x47\\xa2\\x6b\\x14\\x85\\xc2\\x94\\x0a\\x14\\x46\\xab\\x0b\\x1d\\xab\\x34\\x9a\\xb2\\xf4\\x92\\x0c\\xd8\\x94\\xa8\\x2b\\xba\\x5d\\x53\\x05\\xd2\\xe5\\xe3\\xf4\\x41\\xb3\\xd9\\x1a\\x72\\xef\\xc9\\xe6\\xee\\xdb\\x9a\\xb8\\x32\\xe7\\x0e\\xbb\\x87\\x8e\\x75\\xc7\\xa2\\x1b\\x7b\\xd2\\xb3\\xfd\\xdd\\xd3\\x0b\\x1d\\x33\\x43\\x1b\\xee\\xef\\x1b\\x99\\xcc\\xed\\xbb\\x30\\xfc\\xd2\\xd4\\x8c\\x39\\x61\\x0f\\xba\\x93\\xc9\\x6d\\xc3\\x75\\x87\\x7e\\x87\\x61\\xc6\\x13\\x9b\\xfb\\x6b\\xe3\\x5b\\xe4\\xe8\\x48\\xff\\x09\\x79\\x60\\xa2\\x65\\xf0\\x1b\\xd1\\xd8\\xc2\\x78\\xe7\\xdc\\xd8\\x26\\x9d\\x49\\x1a\\x01\\x60\\x9f\\xe6\\x0a\\x60\\x05\\x07\\x0c\\x43\\xde\\x42\\xa4\\x82\\x61\\x40\\x5c\\x00\\x9b\\x85\\x71\\x88\\x98\\x93\\x55\\x60\\x35\\x6c\\xcc\\x20\\x12\\x6b\\xd8\\x6f\\x62\\x4b\\x46\\xe5\\x6c\\x1a\\x36\\x65\\xf2\\x9c\\x9d\\xac\\x27\\x67\\xb4\\x88\\x79\\x3b\\x47\\x2e\\xed\\x64\\x69\\x5d\\x48\\x54\\x39\\x3b\\x2f\\x60\\x46\\x01\\xd5\\xa6\\x2f\\x31\\x66\\x78\\xec\\x20\\x72\\x9f\\x45\\x32\\x2f\\xfb\\x62\\x7c\\x8c\\x04\\x62\\x23\\x4c\\x78\\xf2\\x99\\x67\\xce\\x17\\xbe\\x86\\x1e\\x41\\x23\\xf7\\xb3\\xf2\\xe2\\xfb\\xc7\\x0a\\x97\\xd0\\xc8\\x34\\xb3\\x89\\xea\\xa6\\xc6\\x9e\\xe1\\x16\\x61\\x2d\\x1c\\x85\\xfc\\x1a\\xb2\\x06\\x16\\x56\\xcb\\x97\\x90\\x35\\x08\\xb2\\xda\\x42\\x85\\x67\\x4d\\x89\\x43\\x54\\x2b\\x0c\\xba\\x0a\\x3a\\x6f\\xaa\\x31\\x37\\xd5\\x3b\\x1a\\x01\\x7c\\xb8\\xd8\\x4f\\x10\\x3f\\x2e\\xa9\\x71\\xe2\\xc0\\x0d\\x83\\x1a\\x64\\x7f\\xe5\\xc4\\xe5\\x37\\x40\\x0d\\x94\\xd7\\xd4\\xa0\\x79\\x82\\xb0\\x8b\\x80\\x1a\\xa9\\x31\\x27\\x2f\\xa8\\xa5\\x65\\xc4\\xbb\\x7b\\x2c\\xbc\\x30\\x0f\\xc8\\x1f\\xa3\\x72\\x48\\x56\\x29\\x50\\xc1\\xca\\xab\\x2b\\x63\\x34\\x25\\x3c\\x51\\x5f\\x94\\xad\\xbb\\x85\\x7b\\xaa\\x67\\x8f\\x59\\x19\\xc6\\xbc\\xb6\\xa9\\x37\\x9d\\x1e\\x68\\x4d\\x26\\xdb\\x87\\x72\\x2d\\xc7\\xa4\\x01\\x91\\x99\\x5b\\xfa\\x57\\xdf\\xe8\\xc1\\x9e\\x47\\xf7\\x29\\x0d\\x07\\xcf\\xf6\\x4d\\xfc\\xe0\\xf9\\x21\\x63\\x9c\\x73\\x26\\xe3\\x41\\xb1\\xeb\\x48\\x7b\\xfb\\xe1\\xae\\x64\\xb3\\x12\\x67\\x4e\\xcc\\x14\\xce\\xa6\\xeb\\x8f\\xfc\\xc1\\xee\\x91\\xa7\\x1f\\xdc\\xb8\\x57\\x5f\\x8f\\x13\\xcb\\x1f\\xb3\\xb3\\x06\\x2b\\x54\\x41\\x0e\\x1e\\x84\\x7c\\x64\\x45\\xb3\\xa8\\xc5\\x71\\xb2\\xda\\x82\\x3f\\x13\\x21\\x00\\xd0\\x4f\\x74\\x6b\\x03\\x35\\x3e\\x71\\x9b\\x46\\xa2\\xd2\\xb8\\x5b\\x4d\\x21\\x51\\x0d\\xba\\x34\\x55\\x41\\xa2\\x9a\\x8a\\xf3\\xc2\\x82\\xd5\\x69\\xf0\\x47\\x08\\x82\\x09\\xf2\\xaa\\xd9\\x44\\xc6\\x98\\x59\\x4b\\x04\\x33\\xe8\\x21\\x20\\xd0\\xe9\\xe7\\x05\\x6c\\x56\\xb0\\x81\\xc7\\x26\\x6a\\x95\\x04\\xa2\\x67\\x14\\x2c\\xeb\\xc6\\xc8\\x74\\x4b\\xef\\x6e\\x21\\x98\\xba\\x95\\xd9\\x30\\x7a\\x4f\\x34\\x3f\\xf2\\x27\\x63\\x97\\xbe\\x3c\\x2a\\x38\\xfc\\xe1\\xa6\\x50\\xf2\\xe0\\xd0\\x16\\x46\\x3c\\xdb\\xd3\\x7e\\x6c\\x38\\xa7\\xec\\x3e\\xbe\\x63\\xf8\\xf1\\x3d\\xd9\\xc7\\x13\\x5b\\x87\\xea\\xfa\\x67\\x93\\xcd\\xdd\\xd5\\x1d\\x73\\x49\\x86\\x69\\x7b\\x0e\\x99\\x17\\x06\\x1f\\x3e\\xe8\\x4e\\x98\\xbd\\xae\\xc4\\xfe\\xef\\x3d\\xd9\\x7e\\x4f\\xfd\\xa1\\x27\\x87\\x86\\x9e\\x3e\\xd2\\x70\\xef\\xc5\\x77\\x63\\xdd\\x73\\x23\\x1b\\x2f\\x9c\\xed\\x3a\\xd4\\x5e\\x39\\xda\\x6e\\x2f\\x25\\xba\\x78\\x19\\x80\\x9d\\xe0\\x16\\xc1\\x0a\\x49\\xc8\\x9b\\x56\\x6c\\x96\\x0a\\xc4\\x75\\xd8\\x24\\x6c\\xba\\xa9\\x1a\\xbd\\x9a\\x6a\\x27\\x3a\\x87\\x88\\xb0\\xb1\\x8a\\xee\\x49\\xac\\x88\\x8d\\x95\\x21\\xcf\\x65\\xe6\\xc7\\x33\\xef\\x0d\\x5d\\x1e\\xb9\\x79\\x94\\x9b\\x98\\xeb\\x2e\\xbc\\xb5\\xf4\\x7c\\xe1\\x0d\\x14\\x67\\xb2\\x28\\x48\\x63\\x9c\\x8f\\xd9\\x39\\x83\\x1d\\xc2\\x20\\x41\\x0b\\x1c\\x80\\x7c\\x90\\xcc\\x76\\x9c\\xd5\\xf2\\x36\\xd2\\x46\\xe3\\x2d\\xb0\\x18\\x71\\x6b\\x38\\xe2\\xc6\\xeb\\x89\\x8e\\x1b\\x9d\\x1a\\x36\\x4a\\xea\\x7a\\x27\\xb9\\xa5\\xae\\x45\\xa2\\xea\\x77\\x6b\\x58\\x21\\x1f\\xb9\\x5d\\x3a\\x7c\\x54\\xd6\\xf3\\xc2\\x35\\x1b\\x1b\\x8c\\xa7\\x3c\\x75\\xd4\\xfc\\x37\\xc6\\x79\\xe1\\x05\\x30\\xba\\xfd\\xa9\\xba\\x55\\xc0\\xa8\\x07\\x29\\x9f\\xd7\\xf5\\x5b\\x38\\x91\\xb8\\x00\\x27\\xf2\\x18\\x03\\xc4\\x58\\xe8\\xee\\x96\\xac\\xc9\\xd4\\xa9\\x89\\xfe\\x03\\x75\\x43\\x53\\xdb\\xda\\xa7\\xfa\\xe5\\x07\\xbf\\x74\\x68\\xae\\xe1\\xfe\\x33\\x3d\\x3d\\x67\\xee\\xaf\\x3f\\x97\\x68\\xed\\x97\\xe5\\xfe\\x96\\xf8\\xe3\\xd3\\x83\\x53\\xb5\\x28\\x56\\xda\\x2d\\xc7\\x3a\\x47\\xc2\\xb9\\x0e\\x51\\x6c\\xcf\\x96\\xa3\\x96\\x43\\x37\\xb2\\xa9\\xcb\\x83\\x2d\\x0f\\xf5\\xa5\\xa5\\xde\\x43\\x0d\\x83\\x57\\xd2\\xf2\\x5f\\x3c\\xd8\\x31\\x33\\x94\\xcd\\x0e\\x4e\\xf7\\x49\\x3d\\x8d\\x55\\x95\\x9b\\xba\\xa5\\xa1\\xa7\\x13\\x89\\xa7\\x18\\xb9\\x41\\x4e\\x6e\\x2a\\xf3\\x24\\x4f\\xb5\\xc7\\x37\\xd7\\x55\\x54\\xa4\\x5b\\x80\\x81\\x53\\xcb\\x1f\\xb3\\xc7\\x0c\\x66\\x08\\x43\\x06\\x0e\\x42\\xde\\x41\\x66\\xca\\xb7\\x22\\x97\\xeb\\x59\\x6d\\x21\\x18\\x77\\x10\\xb9\\x0c\\x12\\xb9\\x94\\xf5\\x49\\x73\\xd1\\x19\\x12\\x91\\x88\\x4b\\x32\\xaa\\xd9\\xad\\xa9\\xb5\\x48\\x54\\x23\\xc0\\x0b\\xaa\\xcb\\xad\\x28\\x58\\xe4\\xe7\\x1d\\x42\\xd0\\x40\\x27\\xc8\\xe7\\xe0\\x05\\xec\\x22\\x72\\x8a\\xdd\\x8a\\xba\\x3e\\xce\\x0b\\x79\\x33\\x94\\x28\\xb7\\x02\\x11\\x81\\x27\\xb0\\xba\\x32\\x91\\xab\\x40\\x01\\x12\\x69\\x78\\x6e\\x07\\xd5\\x75\\xb9\\x95\\xf9\\x31\\x9e\\xda\\x38\\x7a\\xbc\\xf3\\xfa\\xeb\\xed\\x53\\xcf\\x0c\\x3e\\xf3\\xc8\\xa8\\xd5\\x65\\xae\\xef\\x7b\\xea\\x1b\\x96\\xd4\\xd7\\xba\\xdb\\x7f\\x7b\\x78\\xc3\\xd7\\xaa\\x36\\x75\\x26\\x7b\\x7e\\x47\\x64\\x50\\xa2\\xa5\\x2f\\xb5\\x6f\\x86\\x1d\\x1d\\x78\\xea\\x48\\x53\\xe1\\x2f\\x0a\\x7f\\x70\\xf9\\x67\\x4f\\xdd\\xc5\\x3c\\x7c\\xd0\\x18\\x37\\x4a\\x1f\\x21\\xae\\xa9\\xa3\\xfe\\xc0\\x13\\x83\\x2d\\xfb\\xb6\\x27\\xee\\x6d\\x77\\x47\\xdc\\xdd\\xb3\\x83\\xf2\\x37\\x81\\xd1\\x31\\x09\\x3b\\x02\\x76\\x28\\x05\\xe5\\x0e\\x54\\x82\\x03\\xd2\\x82\\xbb\\x88\\x49\\xca\\xc8\\xe0\\xb1\\x23\\xb3\\x42\\x18\\x79\\x57\\xae\\xd4\\xe0\\xaf\\x23\\x13\\xfe\\x7f\\x02\\x53\\xe8\\xc5\\xf6\\x8c\\xb4\\x7d\\x15\\xaf\\x30\\x7f\\x91\\xde\\x1a\\x8b\\xd7\\x48\\x6d\\x5b\\x29\\x5f\\x45\\x31\\x1b\\x3b\\x02\\x6e\\x08\\xc1\\x0e\\xc0\\x41\\x69\\xc1\\x5b\\x6c\\xbf\\x62\\x05\\xb5\\x61\\xa7\\x1b\\x97\\x44\\x6e\\xf2\\x0b\\xbc\\xde\\x11\\x5e\\xc2\\x66\\x79\\xa1\\x44\\xef\\x4b\\x98\\x78\\x7a\\x9e\\x17\\xb0\\x5b\\xc1\\x25\\x7c\\xde\\xe6\\x0d\\x2a\\x3a\\xba\\xff\\x1c\\xb0\\x63\\xef\\xe8\\xe0\\x6d\\x28\\x2f\\xb9\\xda\\xc5\\xcf\\xe3\\x3d\\xae\\x75\\xb5\\xa7\\x08\\xda\\x61\\x98\\xc5\\xdc\\x09\\x30\\x02\\x78\\xb2\\xc8\\x67\\x41\\xbe\\x76\\x76\\x64\\x49\\x61\\xde\\x60\\x86\\x76\\xa3\\xbf\\x3a\\x5b\\x78\\xa2\\x70\\xe8\\x22\\xb1\\x7b\\x83\\x68\\x90\\xbd\\xc2\\xce\\x50\\x5e\\xaf\\x4c\\x47\\x88\\xac\\x46\\xc1\\x21\\x11\\x28\\xb3\\xa4\\x5a\\x56\\x41\\x22\\xca\\x46\\x7d\\x83\\x6c\\xc7\\xe2\\x35\\xb6\\x03\\x0d\\x4e\\x4f\\xa3\\xab\\xd3\\xd3\\x3a\\x26\\xe9\\x81\\x61\\xf6\\xba\\xde\\x56\\x2e\\x6b\\x41\\x59\\xe4\\xeb\\x61\\x5e\\x5f\\x52\\xd8\\xd1\\xe1\\x8b\\xe8\\x2c\\x3a\\x70\\xb6\\xb0\\x61\\x37\\xb5\\xb1\\xb3\\xcb\\x1f\\xb2\\x93\\x86\\x1e\\xa8\\x82\\x34\\x1c\\x04\\x2c\\x49\\x0b\\x6b\\xf4\\x55\\x8c\\x4a\\x2a\\xcb\\x69\\x08\\x67\\x24\\xec\\xb9\\xa9\\x0a\\x4e\\x6d\\x9e\\xf7\\xc4\\x9d\\xe2\\xc2\\x3a\\x7d\\x02\\x05\\x3d\\xca\\x36\\x7b\\x35\\x55\\x46\\xa2\\x2a\\x78\\x78\\x61\\x81\\xf5\\x47\\xd7\\x48\\xc4\\xc2\\xae\\xe3\\x55\\x57\\xa9\\xa2\\xe0\\x72\\x41\\x2d\\x73\\x2a\\x0a\\x36\\x13\\x97\\x07\\x6a\\x74\\x0d\\xf1\\x29\\x66\\xa1\\x4a\\xd7\\xfb\\x3b\\x80\\x0c\\x0a\\xa1\\x18\\x25\\x2a\\x56\\xa5\\xd7\\xe4\\xd1\\xa7\\xdb\\x44\\xa7\\x7b\\xb6\\xe5\\x27\\x0f\\xf7\\x1c\\xbf\\x2f\\x1b\\x12\\x95\\x50\\xaa\\x3e\\x34\\x67\\x0c\\xe6\\xd2\\xed\\xb9\\xa8\\xd2\\x29\\xf6\\x3d\\x21\\xe5\\xb7\\x65\\xa4\\x44\\x0c\\x6d\\x4b\\xa7\\xdb\\xb9\\xe9\\xd1\\x23\\xca\\xee\\xd9\\x0e\\xa5\\xbf\\x2d\\x5b\\x12\\x97\\x76\\x6d\\xee\\xed\\x15\\xb7\\xb6\\x76\\xa6\\xdb\\x1f\\xda\\x98\\xea\\xae\\x8f\\x0e\\xf7\\x2c\\x36\\x49\\xed\\xb1\\x44\\x4a\\x6a\\x6b\\xa3\\xe3\\x6f\\x5a\\xd6\\xd8\\x17\\x0d\\x6e\\x58\\x0f\\xf5\\xf0\\xfb\\x90\\x5f\\x47\\x74\\x39\\x61\\x28\\xea\\x72\\xc8\\xa4\\x2d\\xb8\\x6a\\xd7\\x11\\x5d\\x76\\x99\\xb4\\x85\\x80\\x42\\x2f\\x03\\x04\\xec\\x6c\\xa2\\x6a\\x5d\\x19\\xd0\\x70\\xa5\\x5b\\xf5\\x22\\x51\\x4d\\x3b\\x34\\x9c\\x76\\x13\\xeb\\xab\\x96\\xe4\\x32\\x19\\xd5\\xe6\\xd0\\x49\\x1c\\x7b\\x9a\\x17\\x16\\x0c\\xae\\x50\\x62\\x1d\\x99\\x19\\x1b\\xaf\\x26\\xd7\\x12\\xdf\\xe3\\x4a\\xf0\\x02\\x4e\\x2a\\xb8\\x96\\x57\\x6d\\x0e\\x45\\xc1\\x8a\\x90\\xf7\\x56\\x82\\x72\\x07\\xdb\\xc0\\xc7\\xb2\\x94\\x6f\\xc8\\xd6\\xd6\\xd5\\xa3\\xa2\\xc9\\xf3\\x51\\x25\\x27\\x21\\x62\\x65\\x0d\\x13\\xa7\\x44\\x43\\x03\\x8a\\x55\\x1a\\x9b\\x76\\x9e\\x7e\\xbe\\xbf\\xef\\xec\\x81\\xfa\\xa9\\xee\\x47\\xea\\x77\\x77\\x24\\xdf\\xfc\\xfb\\x0a\\x71\\xc7\\x9e\\x5c\\xcb\\xec\\xbe\\x96\\xce\\xa9\\x8b\\x77\\x4f\\xec\\xcd\\x1d\\x7f\\x6a\\xec\\x95\\x27\\xbf\\x84\\xae\\xdc\\xa7\\x4c\\xec\\xa8\\xbc\\x74\\x9e\\x99\\x79\\xf6\\x93\\x4b\\x77\\xd5\\x1f\\xfb\\xe1\\x89\\xc2\\x70\\xd7\\x90\\xd8\\x3e\\x90\\x3e\\xff\\x47\\xca\\x9e\\x4e\\xb1\\x79\\xf6\\x8d\\x33\\xa7\\xde\\x9c\\x6b\\x6d\\xdd\\xd3\\xdb\\x7d\\xf9\\xd3\\x8b\\x5d\\x83\\x4f\\x5e\\x4a\\x8c\\xe9\\xfe\\x38\\x0c\\xc0\\xbe\\x63\\x10\\xc0\\x04\\x56\\x58\\xa7\\x23\\x5d\\xcc\\xca\\xd4\\x09\\x2d\\x18\\xcd\\x80\\x1c\\xa2\\x6a\\x34\\x51\\x5f\\x54\\x74\\x42\\x66\\x5e\\xc0\\x56\\x02\\x63\\x91\\x8c\\x62\\x6c\\x94\\xf5\\x44\\xd9\\x30\\x7a\\x95\\x47\\xff\\x74\\xee\\xd1\\xc2\\x81\\xa9\\x0b\\xa8\\xff\\x05\\x83\\xf0\\xe9\\xcf\\xd1\\x44\\xe1\\x14\\xfa\\x00\\xfd\\x03\\x8d\\x33\\x46\\x8a\\x39\\x18\\x01\\x42\\xb0\\x16\\xfa\\x8b\\x78\\xda\\xc3\\x6a\\xba\\xaf\\x5b\\x6b\\xd4\\x16\\x2a\\x42\\xb4\\xa9\\x0a\\xe3\\x6a\\xc8\\xe1\\x71\\x69\\xb8\\x22\\x93\\xf7\\xd0\\xd0\\xd0\\x63\\xb2\\x90\\x67\\x97\\x45\\x24\\x18\\x08\\xd4\\x90\\x47\\x37\\xa7\\x15\\x3c\\xb6\\x2a\\x78\\xad\\x40\\xfd\\xbb\\xcc\\x47\\x57\\x9c\\x0d\\x4b\\xf4\\x39\\x41\\x0c\\x67\\x0d\\x2b\\xa2\\x2c\\x71\\x37\\xf4\\x6a\\x04\\x1d\\x38\\xf4\\x87\\x23\\x75\\xbb\\x07\\xb2\\x3b\\x37\\x47\\x3f\\xfc\\xe4\\xed\\xff\\xe7\\x99\\x19\\x33\\x17\\xdf\\x31\\x33\\xf0\\xa3\\xbf\\xea\\x3b\\xd4\\x1a\\xe1\\xb8\\x8a\\x96\\xb1\\xce\\x77\\xb9\\x45\\xb1\\xef\\xc8\\x96\\x81\\x4b\\x51\\xa1\\xb5\\x6f\\xb4\\xee\\xf2\\x5f\\x4e\\x9f\\xb8\\x5f\\x19\\x6a\\x8f\\x4f\\x56\\x64\\x3b\\x45\\xb1\\x23\\x17\\x25\\xba\\xd8\\xbb\\xfc\\x31\\xfb\\x8a\\xc1\\x08\\x49\\x68\\x84\\x7c\\x9c\\x8c\\xa7\\xdc\\x58\\x94\\x30\\xc1\\xa0\\xcd\\xdb\\xe2\\x06\\xb3\\x88\\xf0\\x5a\\x3a\\x94\\x80\\x4b\\x23\\x5e\\x02\\x54\\x5b\\x39\\x51\\x96\\x40\\x98\\x42\\x16\\x81\\xa7\\xf3\\xb8\\x22\\x19\\x01\\x53\\x75\\xb6\\xb6\\x88\\x4b\\x7c\\x45\\xab\\x1f\\x70\\xb2\\x44\\x24\\x7a\\x07\\x1e\\xff\\xe3\\xae\\xa6\\xaf\\xec\\xeb\\x29\\x3d\\x69\\x36\\x26\\x67\\x3b\\xda\\xbe\\x72\\x5f\\x36\\xbb\\x6b\\x66\\x7b\\xe7\\xa3\\xe2\\xfe\\x70\\xdf\\xf0\\x70\\xfa\\xd0\\xb3\\xa7\\xbb\\x98\\xa3\\x2f\\x2d\\x5e\\x68\\x8a\\x6f\\x1e\\xdc\\xb8\\xc5\\xe8\\x2c\\xb5\\xb7\\xde\\xbd\\xed\\xc4\\xf7\\xa7\\x27\\x7f\\xf0\\x68\\x57\\x6f\\x7b\\x9b\\xdc\\x95\\x2d\\xdb\\x71\\xe9\\x97\\x64\\xbd\\x0f\\x2d\\x17\\xd8\\xe7\\xb9\\x45\\xb0\\x83\\x0f\\x36\\x14\\x57\\xc2\\x61\\x2a\\xae\\x84\\x8f\\x4c\\xbf\\x9f\\xf6\\xd9\\x41\\x20\\xbf\\x9b\\x92\\x23\\x26\\x97\\xce\\x2d\\xe8\\x4e\\x8c\\xcc\\x74\\xa0\\x38\\xd3\\x4e\\x86\\x4c\\xb2\\x90\\xad\\x66\\x44\\x74\\x08\\x25\\x9f\\xb9\\x76\\xac\\xa1\\x63\\xe6\\x6f\\x2e\\x9c\\x98\\x7d\\xfb\\x75\\xe6\\x3b\\x3f\\x7d\\x92\\xe1\\x0a\\x03\\x57\\x7f\\xfe\\xc4\\xb9\\x7f\\xbc\\xd2\\x77\\x04\\x99\\x3f\\xf9\\x14\\x95\\xe9\\x76\\x6c\\x12\\x80\\x9d\\xe3\\x0a\\x60\\x83\\x6d\\xc5\\x1e\\x58\\x56\\x64\\x81\\x63\\xb5\\x05\\x83\\x2e\\x76\\x06\\x62\\xa9\\xec\\xb4\\x33\\x16\\xa7\\x4e\\x05\\x50\\x59\\xb0\\xd8\\x2c\\x22\\x66\\x32\\x3a\\x27\\x50\\x24\\x02\\x74\\x12\\x40\\x7f\\x4c\\xb2\\xce\\xa5\\x49\\x26\\xb0\\xa4\\x31\\x33\\x5c\\xe1\\x58\\x61\\x70\\xb6\\x90\\xd0\\x79\\x00\\xb8\\x04\\xc0\\x1e\\xe3\\x0a\\x60\\x81\\x66\\xbd\\xdd\\x5f\\x6f\\x93\\x18\\x63\\xab\\xde\\xa6\\xeb\\xf6\\x36\\x59\\x4b\\x91\\x84\\x50\\x6d\\x9f\\x6b\\xf0\\x12\\xf3\\xee\\x12\\x46\\xef\\x14\\x62\\x5c\\x61\\xba\\x70\\x68\\x7a\\xe9\\xb4\\xde\\x56\\xc7\\xf2\\xc7\\xec\\xf3\\x06\\x33\\xc4\\xe1\\x30\\xe4\\xa3\\x64\\x8c\\x25\\xb7\\xa3\\xdc\\xf2\\x50\\x94\\x98\\x9d\\x72\\xd2\\x5e\\xf5\\xaa\\xbc\\x7b\\xdc\\x6a\\x19\\x12\\xd5\\xb0\\x53\\xc3\\xe6\\x4c\\xbe\\x8c\\xc6\\x93\\x65\\xe5\\x16\\x91\\x06\\xde\\x65\\x1e\\x5e\\xc8\\xdb\\x0d\\x51\\x12\\x72\\x85\\x79\\x6c\\x53\\x40\\x2d\\x2f\\xa1\\x74\\x9d\\xea\\x0c\\x51\\x23\\x6c\\xf1\\x14\\xc1\\x17\\xc5\\xb9\\xfe\\x80\\xa9\\xfa\\x0e\\x79\\xca\\xf1\\xb1\\x6c\\x94\\xa7\\x46\\xa6\\x63\\xf4\\xd2\\x95\\x2d\\x13\\xaf\\x65\\x47\\xed\\xae\\xf0\\x4c\\x5f\\xfd\\xf4\\x58\\x73\\x76\\xe8\\x77\\x77\\x1c\\x3f\\xf8\\x11\\x7a\\xe0\\xda\\x2b\\xe3\\xd7\\x66\\xb6\\x30\\x87\\x5e\\x43\\xce\\xd3\\xd9\\x89\\xe1\\x31\\x73\\xb8\\xf5\\xde\\xf4\\xd1\\x57\\x1f\\x3f\\xfe\\xc6\\x89\\xf6\\x2e\\x24\\x4d\\x17\\x1c\\xc7\\x07\\xaf\\xfe\\x8c\\x8e\\x91\\xc8\\xd2\\x79\\x6e\\x11\\x7c\\xf0\\xa5\\xa2\\xe5\\xe0\\x75\\xcb\\x81\\xad\\xf2\\x82\\xd9\\xcb\\x93\\x19\\x35\\xdf\\x12\\x29\\x9f\\x4d\\x53\\x39\\x53\\x26\\x83\\x7d\\x34\\x73\\x43\\x22\\x2d\\xde\\xad\\xa9\\x0e\\x0f\\x15\\x2f\\x55\\xf0\\xd1\\xa0\\x4a\\x75\\x10\\xaf\\x4d\\x46\\x47\\x4d\\x8d\\x8b\\x2a\\xb6\\x4e\\x74\\xf3\\x51\\x5e\\xf6\\x07\\xc8\\x45\\x8c\\x8f\\xf2\\x87\\xbe\\xc5\\x58\\x19\\xf4\\x8b\\x6f\\x32\\xc8\\xc1\\x9c\\x2d\\x38\\xb9\\x45\\x86\\x33\\xfa\\xdc\\x05\\x27\\x13\\x63\\x38\\xb3\\xc7\\xfe\\x99\\xc4\\x8c\\x2c\\x5d\\xa2\\xfd\\xbc\\xb2\\x5c\\x60\\x15\\x6e\\x51\\x97\\x37\\x1b\\x95\\x37\\x83\\x86\\x51\\x46\\x5f\\x0e\\xce\\x48\\xa2\\x3d\\x2a\\x6a\\x0c\\x5d\\xf6\\xbc\\x85\\x59\\x95\\x33\\x63\\x26\\xcf\\x50\\xd6\\x89\\x01\\x8b\\x88\\xb9\\x4c\\x51\\xde\\x02\\x59\\x99\\x4c\\xa6\\x2f\\xc6\\x47\\x7d\\x57\\x16\\x7f\\xce\\x4c\\x2e\\x22\\x33\\x33\\xc9\\xd9\\x27\\x27\\x3f\\xfb\\xd7\\xa3\\xb4\\xcd\\xd1\\x65\\x8d\\xda\\xbc\\x32\\x68\\x87\\x7c\\x29\\x69\\xd3\\xca\\x6a\\x79\\x37\\xa5\\x0d\\x8c\\x1a\\x16\\x32\\x08\\x07\\x25\\xec\\xb8\\xa9\\x7a\\x5d\\x5a\\xde\\xeb\\x20\\x4d\\x78\\x05\\x8b\\x98\\x77\\x78\\xc9\\xa5\\x83\\x58\\xba\\x72\\xa2\\x73\\x2e\\x2b\\x2f\\xa8\\x80\\x6e\\x0b\\xab\\x59\\x12\\xa2\\x14\\x5b\\xa7\\x90\\x7a\\x74\\x97\\x91\\x31\\x96\\x9a\\xe3\\x52\\xba\\x64\\xec\\xbe\\x5f\\x32\\xed\\xdf\\x97\\xc6\\x8e\\xb6\\x5d\\x3b\\x3a\\x61\\x0c\\x9a\\x4b\\xad\\x01\\xc1\\xf5\\x58\\x9e\\x79\\x6b\\x72\\x72\\x29\\x39\\x7d\\xf5\\xc1\\xf5\\xb4\\x6f\\x7d\\xcb\\x9f\\xb0\\xdf\\x37\\x18\\xc1\\x0d\\xb5\\xc5\\x75\\xb3\\x17\\xd7\\xcd\\x24\\x53\\x56\\x0c\\x6e\\xaa\\x6e\\x41\\xc3\\x86\\x8c\\xca\\xf8\\x35\\xca\\x88\\xd1\\xe0\\x43\\x35\\x3a\\x15\\x7d\\x39\\xbc\\x46\\x1f\\x8f\\xfc\\xf5\\xc8\\x82\\x4c\\xc8\\xc4\\xf7\\x3d\\x27\\x30\\xde\\x54\\x63\\xb6\\x10\\x62\\xb8\\x3f\\x2b\\xb4\\x8f\\x72\\x05\\x7b\\xd0\\xb9\\xf4\\x11\\xd3\\x67\\x5d\\x7a\\x6b\\x49\\x34\\x33\\x73\\x87\\x96\\xfe\\x85\\xb4\\x3b\\x07\\xc0\\xce\\x72\\x8b\\x60\\x06\\xb9\\xa8\\xf7\\xc6\\xa2\\xde\\x23\\x6c\\xa1\\xad\\x1a\\x6d\\x5a\\xde\\x48\\x35\\xce\\x68\\xb6\\x88\\x18\\xdc\\x2a\\xe3\\xd3\\x54\\x6b\\x51\\xe5\\x68\\xb3\\x51\\xdf\\xdc\\x55\\x81\\x19\\xe3\\x16\\x9d\\x71\\xcf\\x67\\x3f\\x9c\\xa6\\xb6\\x18\\x80\\x7d\\x9e\\x2b\\x80\\x1d\\x3a\\x8b\\xe3\\x31\\x16\\xc7\\xc3\\xc9\\x45\\x0e\\x4d\\xb5\\x3b\\x35\\x6c\\xd7\\xd3\\x6a\\x46\\xa7\\xa6\\x3a\\x89\\x17\\x07\\x2a\\x70\\xd8\\xc4\\x63\\x56\\xc1\\x46\\x01\\x73\\x4a\\x71\\x9c\\xac\\xb9\\x38\\x4e\\x0b\\x92\\xf9\\x18\\x8f\\x62\\x88\\xef\\x3d\\x82\\xea\\x51\\xcb\\x03\\x73\\x85\\x7f\\xca\\x15\\x0a\\xdc\\xe2\\xd2\\x19\\x66\\xfc\\x33\\x86\\xfd\\xde\\x52\\x01\\x7d\\xb6\\xd8\\x0a\\x08\\xc6\\x00\\xd8\\xcb\\xb4\\x0f\\x45\\xbe\\x08\\x5b\\xe4\\x3c\\x47\\xfa\\x80\\xf4\\xd7\\xcf\\x75\\x84\\x45\\x22\\x31\\x6b\\xaa\\xc1\\xa6\\x77\\x86\\xd5\\x29\\x05\\x6c\\x21\\x5e\\x01\\x54\\x8e\\x76\\xc3\\x56\\xec\\x06\\xd2\\x87\\x1e\\x43\\xfc\\xd8\\xd7\\x98\\x92\\x0b\\xae\\xc3\\x4b\\x6f\\x70\\x8b\\x8b\\x5d\\xec\\x82\\x3d\\xe4\\xfc\\x4c\\x61\\x3f\\x5e\\xf4\\x52\\x5f\\x5e\\xbf\\xfc\\x31\\xfb\\x7d\\x83\\x15\\x3c\\xb0\\x16\\x5a\\x8b\\x6c\\x5e\\xa9\\xa5\\x68\\x75\\xe2\\xe6\\x5b\\x6c\\x9e\\x8b\\xb2\\x79\\x15\\x48\\x54\\xad\\x3a\\xab\\xa0\\x56\\x78\\x79\\x41\\x35\\xb8\\x08\\x8a\\x89\\x97\\x12\\x89\\xb3\\xde\\x99\\x23\\x59\\x4d\\x82\\x90\\xe0\\x64\\x85\\x30\\x88\\x19\\x4d\\x4e\\xa6\\xbe\\x75\\xea\\xb9\\xb1\\x81\\x8b\\x33\\x2d\\x5d\\xc7\\x9e\\xee\\xd9\\xf7\\xec\\x64\\xcb\\xa3\\xf5\\xd2\\xf0\\x44\\xee\\x40\\xbf\\xac\\xf4\\x0f\\x6f\\x30\\x70\\x4a\\xa6\\x6e\\xa8\\x9e\\x99\\x39\\xf7\\xaf\\x57\\x07\\xbb\\xfe\\xe0\\x97\\xcf\\xbe\\xb8\\x78\\x71\\xcb\\xf0\\xf3\\xbf\\xf8\\xd6\\xe9\\xb7\\xea\\xc7\\xa5\\xa3\\x7f\\x75\\xf1\\xc2\\xab\\xe3\\x32\\xf2\\x97\\x1c\\xba\\x01\\x0c\\xf5\\x0b\\x57\\xb8\\x45\\x70\\x42\\x29\\x48\\xb7\\x5b\\xe8\\x52\\xb3\\xb6\\xe0\\x70\\x51\\x0b\\xed\\x20\\x16\\xb3\\x4c\\xa7\\xd8\\xdd\\x1a\\x76\\x65\\x8a\\x51\\x87\\xee\\xfc\\x89\\xc3\\x8c\\x96\\xa2\\x28\\x75\\xfc\\xb1\\xe8\\x24\\x7a\\x72\\xff\\xf9\\x5d\\x12\\xc7\\x49\\x83\\x5f\\xdf\\x57\\xf8\\x67\\x04\\xa7\\x26\\x8c\\x5c\\x45\\xe3\\x70\\x2b\\x59\\xc2\\xdc\\x9e\\xd9\\x8e\\x8e\\xdf\\xb9\\x2f\\xb7\\xf4\\x06\\x93\\x9f\\x1c\\x95\\x7a\\x1b\\xe3\\x74\\x0e\\x0b\\x3f\\xa5\\x73\\x18\\xd1\\xd9\\xb1\\x95\\xf0\\x0f\\x07\\x24\\xd5\\xcd\\x6a\\xd8\\x97\\xa1\\x9c\\x18\\xdc\\x54\\xa3\\x2e\\x0d\\x47\\x69\\xf4\\x47\\x29\\xd1\\x3a\\x24\\xaa\\x62\\x94\\x17\\xe6\\x0d\\x42\\xb9\\x83\\xb8\\x77\\x2b\\x9f\\xf7\\xf8\\xfc\\x34\\xff\\xb4\\xde\\x4d\\xc9\\xd1\\xf2\\xea\\xdb\\xc8\\xd1\\x0a\\xc6\\xe7\\x66\\x4c\\x3a\\x47\\x26\\x9b\\x28\\x22\\xac\\x61\\x6f\\x85\\xc6\\x45\\x06\\xa2\\xbe\\xff\\xab\\xdf\\x6a\\xef\\xbf\\x7c\\xbc\\xf5\\x2f\\xae\\x73\\x0d\\x7d\\xd6\\x9a\\xac\\x64\\xe5\\xba\\x47\\x4f\\xf4\\xc6\\xbb\\xce\\x8c\\xb7\\x7e\\x4d\\xec\\x9d\\xde\\x2e\\x1f\\x1c\\xc8\\x2a\\xa3\\x07\\xd2\\x0d\\x07\\x92\\xfb\\x99\\xa3\\xaf\\x2c\\x3d\\xbe\\x79\\xfb\\xe5\\x7f\\xc5\\x85\\x0f\\x0b\\x7f\\x96\\x6c\\xed\\xe3\\x18\\xee\\x94\\x6f\\xfb\\xc1\\x6e\\x6b\\xff\\xa5\\x8f\\xbe\\x3b\\xf5\\xda\\x99\\x1e\\x79\\xe2\\xfa\\xdc\\x73\\x6f\\x4d\\x49\\x0d\\xd2\\x24\\x30\\x30\\x0e\\xc0\\x5e\\xe3\\x16\\xc1\\x05\\x65\\xf0\\xc5\\xa2\\xd4\\xda\\x74\\xcd\\x51\\xcb\\xcc\\xda\\x82\\xd3\\x4d\\xa7\\xdc\\x49\\xa6\\x3c\\x48\\x07\\xed\\x72\\x6b\\xd8\\x9d\\xc1\\x2e\\x1d\\x1e\\x1b\\xdc\\x1a\\x0d\\x18\\xbc\\x2e\\x5e\\x50\\x1d\\x56\\x85\\x32\\x2d\\x76\\x05\\x54\\xb7\\x93\\x82\\x44\\x5c\\xc6\\x63\\x43\\x11\\x98\\xf9\\x69\\xda\\x08\\xc5\\x50\\xac\\x14\\x15\\x39\\x16\\x11\\x8d\\xa3\\xc9\\xf7\\x7f\\x50\\xd5\\x3a\\xbc\\x09\\x25\\xbe\\x55\\xf8\\xf0\\x93\\x4f\\x4e\\x4c\\x45\\xeb\\x47\\xda\\x3e\\xe1\\x16\\x5f\\x7b\\x26\\xf7\\xc0\\x7d\\x5b\\x5d\\x4b\\x3f\\x64\\x64\\x7d\\x79\\xd2\\x3d\\x64\\x79\\x00\\xc1\\xfe\\xe5\\x8f\\xd9\\x67\\x0c\\x1c\\x6c\\x80\\x21\\xc8\\xe7\\x88\\x84\\x9b\\x58\\x2d\\x1f\\xa4\\x12\\x6e\\xd0\\x10\\x56\\x24\\xec\\xbf\\xa9\\xae\\xb1\\x69\\x78\\x8d\\x0e\\xdc\\x33\\x2e\\x4d\\xdd\\x88\\x44\\x75\\x8d\\x9f\\x68\\x14\\x52\\x14\\x6c\\xe7\\x5f\\x30\\x09\\xc1\\x68\\x4d\\x4e\\xcf\\xac\\xaa\\x15\\x61\\x2a\\xf6\\x26\\x5e\\x78\\x01\\x90\\xbf\\x22\\x9c\\xb9\\x8d\\x1e\\x43\\x2b\\xcb\\x91\\xa8\\x61\\x75\\x3a\\xc3\\xbf\\xca\\x1f\\x19\\x69\\x2e\\x47\\xcf\\xb9\\xc6\\x2a\\xf7\\xf7\\x5a\\x91\\x51\\xba\\x74\\x58\\xd9\\xd5\\x96\\x0c\\x36\\x1e\\x1e\\x1c\\xfd\\xfd\\x9e\\xd8\\xa6\\x7d\\x8f\\xf5\\xec\\x7b\\xb1\\x65\\xc0\\xca\\x72\\x89\\xe3\\x23\\x43\\xd3\\xe1\\xa6\\xa9\\x91\\xa1\\xa9\\x8e\\x70\\xfa\\xfe\\x4b\\x87\\x3f\\x39\\xf3\\xb8\\x31\\x64\\xae\\xef\\xae\\x6e\\xee\\x4f\\x27\\x9a\\x73\\xb9\\x78\\xa2\\xbb\\x67\\x28\\xd7\\x36\\x35\\x28\\xf7\\x76\\x4e\\x71\\x41\\xa3\\xd2\\xf6\\x60\\x67\\xaa\\xa5\\xa1\\xb9\\x3a\\xd1\\xd9\\x37\\xbc\\xa9\\xe5\\xf7\\xee\\xa7\\xa5\\x81\\xd0\\x04\\xc0\\x2e\\x70\\x05\\x30\\xc1\\x46\\xc8\\x1b\\x6f\\xf1\\x45\\xac\\x86\\xd9\\x0c\\x09\\x24\\xb1\\xf1\\x26\\x59\\x98\\xbc\\x81\\xa6\\xb0\\x0d\\xac\\x45\\xcc\\x1b\\x0d\\xd4\\xa2\\x82\\x45\\xbc\\x2d\\xca\\x8c\\xf2\\x31\\xbe\\x89\\x9d\\x28\\xcc\\x9d\\xe5\\xa6\\x67\\x66\\x3e\\x9b\\xe5\\xa6\\xe9\\xef\\x8f\\x2d\\x6b\\xec\\x65\\x6e\\x11\\x2a\\xa0\\x09\\xf2\\x65\\x2b\\xbf\\x8f\\x3d\\x72\\xb1\\x4c\\x44\\x35\\xbb\\x34\\x95\\xf3\\xd2\\xc2\\x04\\x01\\x89\\xaa\\xcf\\xa9\\xd1\\xc2\\x10\\x81\\xe3\\x05\\x5c\\x46\\x0c\\x68\\x19\\x2f\\xe8\\x64\\x28\\x2f\\x67\\xa8\\xd7\\x26\\xb3\\xd4\\xc8\\x66\\x79\\x99\\x2f\\x9a\\x91\\xb1\\xcb\\x8c\\xc0\\x25\\xb7\\xef\\x51\\x48\\x6c\\x72\\x62\\xc3\\x43\\x17\\x86\\x06\\x2f\\x3c\\xb0\\x09\\xbd\\xc8\\xb6\\x72\\xe6\\x70\\x60\\x71\\x71\\xff\\x44\\x67\\x9c\\xe3\\xa2\\xdd\\x47\\x1f\\x64\\x9b\\x17\\x5f\\x9d\\xfe\\xf6\\xf8\\xc6\\x8d\\x0f\\x5e\\x02\\x04\\xf2\\xf2\\x27\\xec\\x8f\\x29\\xbf\\x7f\\x97\\x3e\\x76\\x6c\\x90\\xf3\\x40\\x86\\xcf\\x72\\xb2\\x4c\\x79\\x7e\\xf6\\xa6\\xca\\xe9\\x3c\\x3f\\xae\\x2b\\xbb\\xde\\xc0\\x7d\\xfc\\xbc\\x5e\\x1a\\xc1\\xba\\x31\\x73\\xc3\\x80\\x39\\x37\\x36\\xdc\\x60\\x01\\x33\\x35\\x48\\x65\\x0c\\xab\\x25\\x07\\xc4\\xce\\xa3\\x98\\x7c\\x1e\\x6d\\x43\\x75\\xa7\\x0b\\xbd\\x2d\\x5c\\x61\\x51\\x64\\x7f\\xfc\\xe9\\x22\\x20\\x88\\x2d\\x7f\\xc2\\x7e\\x44\\xf1\\xf2\\xf3\\x90\\xb7\\x53\\xec\\x60\\x93\\x8b\\xad\\x22\\xa3\\xbc\\xea\\x5f\\x90\\x53\\xc3\\xc8\\xad\\x1a\\x09\\x5e\\x0e\\x50\\x93\\x4e\\x3a\\x70\\xe3\\xf5\\xff\\xf1\\x0b\\xca\\xd4\\x82\\x1b\\xdb\\x6f\\x38\\x31\\x22\\xdd\\xb8\\xde\\x70\\xf3\\x9f\\x8f\\x91\\xbb\\x06\\x6c\\xab\\x71\\x62\\xeb\\x0d\\x15\\x31\\x66\\x95\\x29\\xf9\\x95\\x13\\xb3\\x37\\xae\\xbf\\x2a\\xfd\\xf3\\x41\\xfd\\x43\\x4b\\x8d\\x6a\\xb3\\x9a\\xb1\\xf5\\x86\\x53\\x35\\xb0\\xbf\\xc2\\xdc\\x0d\\x58\\x60\\x58\\xce\\x60\\xa5\\xc5\\x12\\xe8\\x3b\\xe4\\xda\\x62\\xb5\\xd9\\x6f\\x2b\\x9f\\x40\\xaa\\x11\\x51\\xca\\x93\\x0e\\x2a\\x88\\xc8\\xff\\x6c\\xcc\\x86\\x62\\xb1\\xe3\\x27\\xde\\x48\\xbd\\x39\\xf1\\xe5\\xbf\\xde\\xf0\\xf6\\xbb\\xf5\\xdc\\xe2\\xe2\\x65\\x16\\x16\\x17\\xd9\\x91\\x4f\\x17\\xd9\\x8e\\xc5\\x6b\\xb0\\xe2\\x43\\x5f\\xa6\\x98\\xbc\\xba\\x68\\x09\\xcc\\x32\\x25\\xca\\xb1\\x41\\x26\\xd8\\x88\\x02\\x1f\\x95\\x21\\x6e\\x89\\xa3\\xbe\\x81\\xcc\\x19\\xfd\\x3f\\x66\\x41\\xbd\\x68\\xb0\\xf0\\xec\\x53\\xc8\\x8e\\xcc\\x8f\\x15\\x5e\\x42\\xfb\\xff\\xb0\\xf0\\x61\\xe1\\xe7\\xcc\\x29\\x66\\xbc\\x10\\x44\\x1f\\x2e\\x9d\\x59\\x1a\\x47\\x9f\\x16\\x8c\\x80\\x40\\x01\\x60\\x5f\\xa3\\xfe\\x7f\\x7d\\x91\\xeb\\x24\\xd3\\x88\\x59\\x99\\xba\\x7f\\xd3\\x4d\\xd5\\x28\\x50\\x67\\xaf\\x1a\\x4d\\x45\\x7e\\x1d\\xf4\\x8b\\x95\\x25\\xe2\\x63\\xbc\\xf2\\x0c\\xda\\x88\\xca\\x2e\\x14\\x9e\\xf8\\x26\\xb7\\xb8\\xf4\\x04\\x73\\x60\\x71\\xb1\\x60\\x46\\x9f\\xe8\\x98\\x7b\\x8c\\xea\\x06\\x59\\xab\\x74\\x11\\x5f\\x98\\x58\\x0d\\xdb\\x32\\xd4\\xff\\xaa\\x2c\\x31\\x63\\x0e\\x89\\xe6\\xcf\\x54\\x53\\x31\\x37\\xc3\\xb1\\xbc\\x80\\x8d\\x34\\x2b\\x83\\xa2\\xd9\\xa8\\x8f\\xb8\\x0e\\xd9\\x37\\xc6\\xcc\\x2e\\x9d\\x67\\xbd\\x4b\\x5f\\x65\\x06\\x9c\\x31\\xe7\\x28\\x17\\x98\\x19\\xfd\\xec\\x23\\xfb\\x29\\x00\\x84\\xec\\xcb\\x1d\\x6c\\xbf\\x61\\x10\\x4c\\x20\\x51\\x16\\xc7\\x60\\xa0\\x2c\\x0e\\x32\\x52\\x16\\x87\\x48\\x82\\xc1\\xa9\\xe5\\x0d\\xb0\\xa2\\x7c\\xd8\\x98\\x29\\x2a\\x9d\\xa1\\x18\\x32\\x20\\x3b\\xd3\\x51\\x50\\xd0\\x6b\\xd7\\x8c\\xc2\\xd4\\xa7\\xef\\x3c\\x7c\\x47\\x9e\\xce\\x05\\x18\\x49\\xb7\\xe7\\x0c\\x73\\xc8\\x34\\x3b\\xc9\\xcc\\x4e\\x1a\\x84\\xe6\\x4f\\xcf\\xd5\\x03\\x82\\x67\\x97\\x3b\\x98\\x5f\\xac\\xb4\\x6f\\x92\\x54\\x30\\x68\\x98\\x95\\x08\\x88\\xa5\\xed\\xa3\\x9b\\xaa\\xd1\\xa1\\xe5\\x91\\x71\\x25\\xa1\\x8a\\x61\\xa5\\xfd\\x40\\x94\\x8f\\x66\\xa3\\x7c\\xf4\\x59\\xf4\\x5a\\x41\\x61\\xda\\x97\\xae\\xb5\\x18\\x62\\x53\\xbf\\xfa\\x39\\x20\\x78\\x99\\x79\\x99\\xe2\\x63\\x23\\xa4\\xa0\\x18\\xf9\\xeb\\x05\\x57\\x5c\\x86\\x2a\\x15\\xdc\\x5c\\x60\\xed\\x60\\xe2\\x44\\xa2\\x57\\xa0\\x22\\x23\\x2f\\x50\\xbb\\xee\\x41\\x32\\x32\\xd9\\xd0\\xcb\\x68\\x63\\x0a\\x79\\x1f\\xf8\\xe1\\xfb\\xcc\\xbf\\x30\\xf6\\xa5\\x5f\\xd6\\xa2\\xbd\\x85\\x27\\xe9\\x7a\\xb4\\x2f\\x0f\\xb2\\xd7\\x97\\xdf\\xd2\\x73\\xa2\\xac\\x44\\x8c\\x14\\x79\\xdc\\x36\\xbe\\x40\\xd4\\x17\\x6d\\x67\\x1f\\x5a\\x7c\\x34\\x31\\x0d\\x08\\x85\\xd8\\x49\\x66\\xc2\\x30\\x04\\x2e\\x88\\x00\\xb6\\x4a\\x0b\\xc8\\x0a\\x96\\x62\\xae\\x5e\\xcf\\x82\\xda\\x39\\x91\\x44\\xa4\\x34\\x49\\x4f\\x0c\\xaf\\xce\\x91\\x26\\x50\\x68\\x7f\\xb6\\xb4\\x35\\x9b\\x60\\xea\\xfc\\x81\\xaa\\x0d\\x0d\\x09\\x83\\x28\\xcf\\x35\\xb5\\xcb\\x1b\\x22\\xc9\\x98\\x53\\x9e\\x3c\\x44\\xb1\\x11\\xc1\\xe3\\x53\\xec\\x4b\\x50\\x0a\\x29\\xb8\\xbf\\x58\\x8d\\xe2\\x03\\x9d\\x0f\\xca\\x3b\\x10\\xd0\\x48\\x65\\x81\\xab\\xf6\\x39\\x1c\\xa2\\xca\\x99\\x34\\x84\\x6b\\xe8\\x6a\\x96\\xd9\\x34\\x5c\\xa6\\x9b\\x3a\\xae\\x2a\\x93\\x51\\x79\\x97\\xa6\\x4a\\x24\\x1a\\x03\\x1a\\xa5\\x60\\x81\\x5f\\xb0\\x3a\\x7c\\xa1\\x24\\x65\\x79\\x39\\x12\\xc2\\x78\\x14\\x6c\\xe6\\x55\\x2b\\xc5\\x6e\\xb9\\xda\\xba\\x9c\\x4c\\x53\\x60\\x34\\xed\\xe5\\x5f\\xa5\\x7f\\x68\\x39\\x49\\x23\\x93\\xab\\xcb\\x65\\x63\\x95\\xd5\\x24\\x46\\x1b\\xfd\\xc5\\x87\\xea\\xc4\\xd4\\x85\\xd1\\xf6\\xe9\\x1f\\x3d\\xf7\\xc3\\x53\\xe7\\xaf\\x77\\x4c\\xf4\\x88\\x8f\\x3f\\xd4\\xdb\\xb0\\xbb\\x23\\x65\\xf5\\xa2\\x58\\x48\\x2e\\x3d\\x72\\xe6\\x9e\\xf0\\xcf\\x4f\\x3f\\x63\\x8e\\x9d\\x3a\\x74\\xff\\xd0\\xec\\xf3\\x7f\\xbd\\xf4\\xd2\\xd8\\x74\\xcd\\xf6\\xa1\\x4d\\x2d\\x43\\x89\\xdc\\x26\\x7f\\xb2\\xad\\x81\\xa9\\xa8\\xdb\\x42\\xc6\\x3a\\x45\\x62\\x0f\\x43\\x0f\\x94\\x40\\x0a\\x76\\x15\\x71\\x94\\x97\\x8c\\x35\\xca\\x69\\x79\\x2b\\x19\\x6b\\x92\\x5d\\x1d\\x60\\xa9\\x4d\\x23\\x32\\xca\\xfa\\x69\\xd9\\x59\\x35\\x12\\x55\\x97\\x4d\\x1f\\x62\\x29\\x19\\x62\\x40\\xc1\\x2c\\x8f\\x83\\x0a\\xae\\x16\\xe6\\xad\\xde\\xa8\\x3e\\xce\\x64\\x94\\x17\\xf2\\xae\\x80\\x49\\x29\\xe2\\x53\\x1f\\x41\\xa7\\xb7\\xe7\\x52\\xaa\\x13\\x26\\x0f\\x75\\x8e\\xb7\\xe7\\x00\\x8d\\x53\\xcf\\x05\\x52\\x4f\\x75\\x77\\x9d\\xda\\xdf\\xd8\\xfa\\xe0\\xd7\\xb6\\xf7\\x3d\\x26\\xc9\\x39\\x4b\\x49\\x32\\x9a\\x68\\x08\\x26\\x47\\x7a\\x73\\xdf\\x78\\x4c\\x7e\\x28\\x58\\x6a\\xe8\\xe1\\xac\\x1e\\xfb\\xd2\\x2f\\x3a\\x77\\xd6\\x4f\\x2e\\x4c\\x1e\\xbb\\x3e\\xdd\\xd8\\xd5\\x3a\\x85\\xfe\\xa5\\xef\\x68\\x77\\x46\\xf0\\x3a\\x2b\\xba\\x66\\xf7\\x5c\\xff\\xcb\\xed\\x8d\\x0d\\x54\\xbe\\xc6\\xc9\\x38\\xd9\\xeb\\x10\\x23\\xf1\\x44\\x18\\x74\\xd4\\x92\\x37\\x90\\x01\\xba\\xc9\\x00\\xab\\x56\\xc3\\xce\\x38\\xcd\\x59\\x96\\xf1\\xc2\\x82\\x19\\x2c\\xe5\\xa1\\xdb\\x70\\x18\\x89\\x92\\xeb\\x6a\\x50\\xa2\\xfa\\x0e\\x22\\xce\\x54\\x59\\xc3\\x8c\\x6f\\x9d\\x7e\\x7e\\xef\\xa1\\x6b\\xca\\xfd\\x56\\xc6\\x58\\x12\\x6f\\x9b\\xac\\x3f\\xd8\\x93\\x4e\\xf7\\x1d\\x6d\\x3f\\xbd\\xb7\\xef\\xd4\\xeb\\xa3\\xdf\\x9e\\xde\\x8a\\x7e\\xbc\\xef\\x85\\x99\\xed\\x83\\x3d\\x93\\x46\\x57\\x69\\x55\\x58\\x49\\x0f\\xce\\x74\\x77\\xcf\\x8d\\xe4\\x1e\\x1a\\x3d\\x87\\x3a\\x66\\x89\\x69\\x1b\\x5c\\xfe\\x98\\x3d\\x6f\\xe8\\x81\\x20\\x64\\x60\\x04\\xf2\\x3c\\x59\\x87\\x00\\xe9\\x66\\x98\\x2d\\x76\\xb3\\xc6\\xa8\\xe5\\x0d\\x35\\xd4\\x56\\x58\\x2c\\xe2\\x4a\\x62\\xa1\\xdc\\xad\\xe1\\x72\\x37\\x4d\\x56\\xf3\\xd5\\x99\\x8c\\xea\\x70\\x6a\\xaa\\xd5\\x43\\x90\\x17\\xcd\\x30\\x98\\xcb\\x09\\x56\\x0f\\xd0\\x7a\\x9d\\x30\\x2f\\xe4\\xc1\\x6b\\xbe\\x8d\\x63\\xf4\\x07\\x68\\xb0\\xe0\\xf1\\x06\\x62\\xd5\\x0d\\x68\\x25\\x8b\\x50\\x94\\x36\\x1d\\xc9\\x20\\xba\\x1a\\x83\\x6d\\x87\\xbf\\xb6\\x6d\\xe4\\xd1\\xd8\\xd3\\x3e\\xc6\\x7a\\xce\\x9c\\xba\\xd8\\xdd\\x75\\x62\\x5f\\xe3\\x63\\x73\\xb3\\xe1\\xad\\x8d\\x69\\x7b\\xc0\\x51\\x96\\x0c\\xc7\\x9b\\x42\\xf5\\xbd\\xc9\\x7e\\xf4\\xce\\xcc\\xb5\\x89\\x0d\\xfd\\x1d\\x8c\\x6c\\x0f\\x3b\\x3f\\x6b\\x48\\xc7\\x4b\\x53\\xdd\\x5d\\x83\\x0d\\x53\\xd7\\xcf\\xe3\\x9f\\xfa\\x53\\x8d\\xd5\\x1d\\x53\\x5d\\xfb\\x3a\\x24\\x4f\\xc0\\x1f\\x8d\\x77\\x17\\x75\\xed\\x63\\xf6\\x0c\\xfb\\x32\\x94\\xc3\\x1a\\x18\\x85\\x7c\\x09\\x65\\xfb\\x0c\\xc5\\x21\\x57\\x9b\\xb4\\x85\\x90\\xb3\\xc4\\xe0\\x10\\xd5\\x10\\x01\\x6c\\xc9\\x95\\x72\\x19\\x1c\\xca\\x60\\xa7\\x5b\\x8d\\x16\\xa3\\x92\\xb5\\x48\\x54\\xa3\\x4e\\x5e\\xc8\\x1b\\x3c\\x25\\x8a\\x42\\xf0\\xb4\\x4a\\xe0\\x34\\xa8\\x4e\\x0f\\x2f\\xd0\\x4b\\x1c\\xe2\\x7f\\x2d\\x4e\\x31\\x9a\\xa2\\x24\\x40\\x2e\\x72\\xa9\\xb9\\x68\\xed\\x4a\\x36\\x6f\\xb4\\x75\\xe2\\x9b\\x03\\x1d\\xa7\\xee\\x6f\\x62\\x98\\xa5\\xbd\\x5c\\xfd\\xc0\\xa1\\xdc\\xd9\\x5d\\x3d\\x47\\x7f\\x34\\xf6\\xec\\xd1\\x96\\xc7\\x19\\x86\\x49\\xb4\\xf4\\xcb\\xc3\\x17\\xd1\\x8f\\x8e\\xbe\\x38\\xbd\\x39\\xfb\\xc0\\xd5\\x71\\x77\\x8c\\x1f\\x39\\xde\\x13\\xbb\\xbf\\xfb\\x4c\\xd3\\xd4\\xb5\\x9f\\x98\\x5d\\x56\\x79\\xb0\\x35\\x79\\x12\\x10\\xcc\\x50\\xbe\\x74\\x08\\x42\\x04\\x31\\x97\\x13\\x3f\\x09\\x12\\x2e\\x95\\x55\\x44\\xab\\x03\\x31\\x2f\\xa9\\x66\\x83\\x96\\xe7\\xcd\\x64\\x4d\\x79\\x9b\\x45\\xcf\\x57\\x94\\xd3\\x82\\x96\\xa0\\x4b\\xc3\\xfe\\x4c\\x3e\\x48\\x8b\\x41\\x83\\xa5\\x16\\x31\\x5f\\x1e\\x24\\x97\\xe5\\x04\\x98\\x85\\x89\\x84\\xf2\\xa8\\x48\\xae\\x7a\\xb2\\xb2\\x8e\\x36\\x03\\xa6\\xca\\x15\\x12\\x27\\x84\\x74\\xd0\\x36\\xf3\\x7a\\xee\\xfe\\xdf\\xeb\\xca\\x1f\\xdc\\xe2\\x46\\x5c\\xf4\\x81\\xe6\\x6c\\x57\\x43\\x18\\xc9\\x85\\x37\\x4e\\x33\\x8b\\x13\\x83\\x07\\x9f\\x1c\\x4a\\xcd\\xcc\\x45\\xcd\\x52\\x7d\\x45\\xdb\\xd1\\xbe\\x6d\\x13\\x4b\\x1c\\xb3\\xa8\\xd7\\x3b\\x76\\x15\\x2e\\xb1\\x6f\\xb0\\x3f\\x84\\x0d\\xb0\\x03\\xee\\x83\\x3f\\x87\\xbc\\x13\\x81\\x88\\x05\\x59\\xfd\\xa2\\x41\\x53\\xbd\\x81\\x4c\\x06\\xd7\\x4a\\x6a\\xa3\\x49\\xc3\\xdb\\x24\\x75\\x2d\\xab\\xe1\\x88\\xa4\\xde\\x43\\x96\\x67\\x58\\xc2\\x96\\x9b\\x6a\\xa7\\x53\\xc3\\x10\\xb9\\xc9\\xab\\x8a\\x53\\xc3\\x9d\\x6e\\x5c\\x45\\xae\\x39\\x07\\x75\\x7d\\x55\\x0e\\x72\\x4b\\xed\\x43\\xa2\\x1a\\x74\\x6a\\xf3\\x9b\\x83\\x7d\\x66\\x51\\x95\\x9c\\x9a\\xba\\x0b\\x89\\x6a\\xa7\\x45\\x27\\x75\\xaa\\x38\\xea\\x67\\x71\\x1f\\xff\\x9d\\x88\\x73\\x6d\\x6d\\x63\\x6b\\xc7\\x3d\\x34\\x6d\\x2b\\xa8\\x6e\\x5a\\xf7\\xb8\\xad\\x91\\x17\\xf2\\x12\\x28\\x64\\xa5\\xd7\\xf2\\x2a\\xd3\\xa1\\x28\\x38\\x22\\xa8\\x5c\\x95\\xa2\\xe0\\x7b\\x78\\xd5\\x58\\xa9\\x28\\xf8\\x8b\\x82\\x6a\\x09\\x92\\xe5\\x0e\\xd4\\xe6\\xaa\\xb3\\xb5\\xab\\x09\\xc6\\x40\\x5d\\x3d\\x0a\\x90\\x39\\x32\\xf9\\x75\\xeb\\x93\\x30\\xfa\\x28\\x89\\xfe\\x9b\\x72\\xbb\\x54\\xf8\\x89\\x81\\x32\\x7a\\x6e\\x0f\\xb6\\x8c\\x26\\x27\\xea\\x7a\\x72\\xc7\\xfe\\x96\\xed\\xca\\xf0\\x74\\xcb\\x89\\x81\\x91\\xaf\\x96\\x79\\x9c\\x41\\xe7\\x40\\xbb\\x94\\xfd\\xd2\\x57\\xda\\x94\\xc6\\xcd\\x77\\xb7\\x25\\xba\\x63\\x83\\xc7\\x7b\\x92\\xd9\\x03\\x97\\x1f\\x38\\x72\\x79\\x44\\x9e\\x93\\xba\\x0f\\xd6\\x4f\\x3f\\xc3\\xf5\\x7e\\xd1\\xea\\xb5\\x76\\x4d\\x49\\x13\\xa9\\x68\\xae\\x33\\x29\\x76\\x28\\xd1\\xa8\\xd2\\x99\\xfc\\x42\\x43\\xb8\\x7c\\xf6\\xd0\\x70\\xf5\\xce\\x81\\x7e\\x71\\xae\\xb3\\xed\\xcb\\x03\\xb5\\x03\\xbd\\x93\\x0c\\x93\\x6a\\xef\\x6b\\x79\\xb8\\xbf\\x36\\xd0\\x28\\x56\\x25\\x8c\\xb1\\xa6\\xbe\\x4c\\x6e\\x5f\\xb7\\x14\\x6b\\xe8\\xee\\x49\\xe6\\x62\\xfc\\x40\\x67\\xae\\x91\\x31\\x72\\x2d\\xcc\\xe3\\xc9\\xce\\x5c\\x34\\xaa\\x74\\x24\\x93\\x9d\\x4a\\x14\\x35\\x84\\xb7\\x03\\x82\\x33\\x00\\xec\\x51\\x43\\x0f\\x84\\x08\\xf6\\xa5\\xf8\\x4c\\x90\\xf3\\x76\\xa2\\x50\\x01\\x62\\xea\\x2a\\xa8\\x16\\x85\\x6c\\x94\\x38\\x0c\\x51\\xf4\\x11\\x32\\x58\\x44\\x1c\\x72\\xab\\x1e\\x82\\xce\\xdd\\x1a\\xcd\\x88\\x79\\x42\\xbc\\x40\\x23\\xb4\\x00\\xb1\\xed\\x96\\x22\\x99\\xa3\\xc3\\xf4\\xa2\\xfd\\xe6\\x63\\x7c\\xad\\x6e\\x0c\\xf9\\x33\\xcf\\x32\\x02\\x97\\xbb\\xd2\\xd7\\x74\\x7f\\x57\\xf2\\xeb\\xa3\\xed\\xd2\\x50\\xbf\\x64\\xe8\\x61\\x18\\x63\\xc0\\xbd\\xf4\\x7e\\xdf\\x98\\x38\\x74\\xee\\xc0\\xd2\\x6b\\x8c\\x7c\\xee\\x68\\x72\\xfb\\x81\\xad\\x4b\\x1f\\xea\\xf9\\x84\\x37\\x00\\x58\\xd1\\xd0\\x04\\x16\\x28\\x21\\x11\\x1a\\x45\\x61\\x44\\x37\\x4c\\x19\\x5d\\xfd\\x39\\x83\\x86\\xfd\\x92\\xea\\xb4\\x6a\\xb4\\x52\\x8e\\xb9\\xa9\\x9a\\x6c\\x5a\\xde\\x44\\x19\\x37\\x93\\xc5\\x22\\xe6\\x19\\xd3\\x2a\\xdd\\xc6\\xb8\\xe7\\xbd\\x8c\\xd5\\x29\\xaa\\x1e\\x3b\\x2d\\xa6\\x53\\x4d\\x0c\\x2f\\xe4\\x9d\\x6e\\xbf\\x9e\\xca\\x93\\x75\\x12\\x8e\\x97\\x7d\\xa8\\x36\\x57\\x27\\x67\\xf4\\xfa\\xf3\\x58\\x65\\xf5\\x1b\\xff\\xfc\\x01\\x3a\\xfa\\x76\\x61\\xa2\\xa2\\x22\\x89\\x18\\xb1\\xb9\\x59\\x14\\x1b\\x8e\\x32\\xd7\\x8f\\x2e\\xbe\\x79\\x94\\xfb\\x2f\\x62\\x45\\x45\\x93\\x28\\x36\\x34\\xd0\\xda\\x90\\xc2\\x45\\xd6\\x6b\\x68\\x82\\x12\\x48\\x40\\x1f\\xe4\\xdd\\xa8\\x48\\xce\\x05\\x24\\xd5\\xcc\\x6a\\x38\\x2e\\xa9\\x21\\xd2\\xcd\\x35\\x94\\xa7\\x13\\x6c\\x5a\\xde\\x21\\xac\\x90\\x73\\xd8\\xe1\\x9e\\xf7\\x3a\\x4a\\x9d\\xa2\\x5a\\x69\\xd7\\xd4\\x24\\x99\\x62\\x07\\x2f\\xa8\\xa1\\x38\\xcd\\x03\\x99\\x57\\x39\\xbb\\x40\\xae\\x82\\x0d\\xf8\\x49\\xdf\\xea\\xb2\\x14\\x7e\\xd1\\x2c\\xef\\xe7\\xfa\\x3b\\xb2\\xcb\\xca\\xd8\\xe3\\xa2\\x98\\x66\\x98\\xc1\\xa3\\x85\\x67\\xd0\\xbf\\x6e\\x1c\\x9d\\xeb\\x5a\\x40\\x0f\\x85\\x2b\\x44\\x06\\x89\\x4d\\x4d\\xa2\\xd8\\xfc\\xfe\\x31\\xab\\xaf\\xb4\\x22\\xe0\\x9f\\x3e\\xcd\\x5a\\x27\\x17\\x8f\\xef\\x3f\\x3f\\x24\\x71\\x46\\x25\\x15\\xae\\x68\\x48\\x91\\xc1\\x20\\x98\\x5b\\xfe\\x84\\xfd\\x89\\xa1\\x07\\xdc\\x2b\\xd8\\x17\\xdb\\xe5\\xbc\\x09\\x81\\xb8\\x4a\\xe8\\xd9\\x74\\x42\\xcf\\x57\\x24\\xf4\\x4c\\xff\\x0e\\xa1\\x37\\x77\\x55\\x40\\x3f\\x91\\x1a\\xb2\\x85\\xa3\\xe8\\xf5\\x97\\x0b\\x33\\x53\\x86\\x1e\\x7b\\xc8\\xbe\\xf8\\x0e\\xca\\x5b\\x0b\\xa7\\x97\\x7e\\x64\\x46\\xef\\x8c\\x17\\x9e\\x2e\\xd6\\x2e\\x0c\\x19\\x7a\\xc0\\x02\\x9b\\xee\\x58\\x69\\x8a\\xef\\x0c\\x3a\\x93\\xfe\\xef\\x2d\\xf0\\x0a\\x97\\x9e\\x2d\\x22\\x53\\xdf\\x65\\xe4\\x2d\\x7c\\x82\\x9e\\x46\\xc2\\x51\\x6e\\xf4\\xe8\\x67\\xf1\\xa3\\x80\\xa0\\x0b\\x80\\x7d\\x85\\x7d\\x19\\x92\\xb0\\x6f\\x25\\x6f\\x14\\x91\\xe5\\x3c\\x42\\x20\\xe6\\x8d\\x88\\x0e\\x53\\x8d\\x9b\\x34\\x5c\\x96\\x59\\xc9\\xb6\\x24\\x9d\\x1a\\x66\\x32\\x38\\xa9\\xbb\\x92\\x88\\x5e\\xc6\\xe0\\x25\\xc2\\xef\\xa4\\x69\\x18\\x35\\x9a\\xd4\\x6d\\x51\\x84\\xc7\\x16\\x05\\x7b\\x75\\x85\\x88\\x53\\xc2\\xcd\\xb2\\x02\\x68\\x74\\x02\\x9d\\x96\\x8b\\xf8\\x4d\\x5e\\xaa\\x14\\xc5\\x5c\\x5d\\x51\\x3f\\x8c\\x3e\\xbe\\x6b\\x2e\\x3a\\xb6\\xb1\\x7e\\xd0\\x1e\\x1c\\xdf\\x32\\x5c\\xb3\\x16\\x7d\\xd5\\x1e\\x2a\\x0f\\x04\\xb3\\xc9\\x92\\x13\\x62\\x5d\\x7a\\x90\\xbd\\x3a\\x28\\x37\\xdd\\xb5\\xa9\\xa1\\xb3\\xb5\\x69\\xd0\\x6c\\x5e\\x4a\\x33\\x17\\x9a\\x3a\\x12\\x56\\xb1\\xa5\\x37\\xb1\\x74\\x9e\\x39\\x35\\xd1\\x35\\xb1\\x6f\\xe9\\x0c\\xc1\\x30\\xa7\\x00\\xd8\\x09\\xf6\\x65\\x08\\xac\\xe4\\x42\\x28\\x17\\xbb\\x32\\x3a\\x95\\x27\\xca\\x5d\\xa2\\x67\\x91\\x6c\\x74\\x5c\\x01\\x37\\x09\\xc5\\x54\\xbb\\x5b\\x53\\x4b\\x91\\xa8\\x3a\\x02\\x74\\x30\\xa0\\xf2\\x2b\\xd5\\x21\\x2b\\xdd\\xbf\\x53\\x97\\x4f\\x5d\\xc8\\x5e\\xe9\\x6b\\x38\\xd0\\x25\\x12\\x45\\x1e\\xe9\\x96\\xd9\\xab\\x57\\xee\\x50\\xe1\\x1d\\x07\\xb6\\x2c\\x7d\\x08\\x0c\\xf4\\x2c\\x7f\\xc4\\x3e\\xcf\\xbe\\x04\\x1e\\x48\\xdc\\xe2\\x10\\x57\\xe0\\x4a\\x8c\\xd5\\xd5\\x01\\x6e\\xaa\\x5e\\xe1\\x0e\\x0e\\x31\\x79\\x27\\x87\\x18\\xfb\\xf7\\x38\\xc4\\xdb\\x39\\x2e\\x27\\xd3\\xd3\\xfe\\xe5\\x4b\\x7d\\x7d\\x4f\\x3d\\xd4\\xba\\x79\\xfc\\x62\\xff\\xc0\\xd3\\x8f\\xb4\\x5d\\x4c\\xed\\xd8\\x4b\\x99\\x01\\xa9\\x6b\\x4f\\x2e\\xb7\\x67\\x47\\x0a\\xbd\\xb9\\xef\\xcf\\x66\\x76\\x6c\\x39\\x76\\xed\\xc8\\xf8\\xc2\\x4c\\x6b\\xc7\\xcc\\xc2\\x91\\x9e\\xb9\\x91\\xba\\xf5\\x83\\x73\\x7d\\xfd\\x27\\x86\\xd2\\xe9\\xa1\\xe3\\x14\\xf3\\x16\\x9e\\x65\\x17\\xd8\\x97\\xc0\\x0b\\x71\\xb8\\x17\\xf2\\x6e\\x9a\\x71\\xe1\\xb4\\xdb\\xa6\\x32\\xc2\\x6a\\x18\\x24\\x9a\\x6e\\x41\\x3a\\x2a\\x64\\x3c\\x7a\\x32\\x22\\x84\\x44\\xd5\\x26\\x68\\x34\\xcb\\x12\\xf2\\x11\\xb5\\x70\\x93\\x41\\x44\\x4a\\x78\\x21\\x6f\\xf3\\xb0\\x3a\\xb8\\xba\\x35\\xab\\x45\\x84\\xcb\\xb3\\xb7\\x4a\\x19\\xc9\\x14\\x4f\\x3d\\x21\\x3d\\xdd\\xdd\\x75\\xfa\\x60\\xd3\\x96\\x43\\xa7\\x3b\\xfa\\xce\\xad\\x67\\xb8\\xdf\\x1b\\x96\\xc7\\xfa\\x6a\\xcf\\xcf\\x25\\xfb\\x5a\\xc5\\xc2\\xb3\\x5c\\xe1\\x4c\\xe7\\x6f\\xd5\\x1f\\x5d\\x98\\x9a\\x7a\\x69\\xba\\xb9\\xab\\xad\\x20\\x31\\x6f\\x5f\\x98\\x8d\\x76\\xcf\\xee\\x5e\\xf8\\x01\\x57\\xde\\x36\\xd1\\xa7\\xdb\\xcf\\xbe\\xc2\\xb3\\xec\\x09\\xf6\\x15\\xf0\\xe9\\xe3\\x20\\x98\\x51\\x0d\\xb2\\x3a\\x6c\\xd7\\x17\\x21\\x6a\\xd4\\xb0\\x43\\x5a\\x49\\x1b\\xf9\\x6d\\xb4\\x3a\\x9e\\x88\\x84\\xa5\\x22\\x93\\xa1\\x72\\x41\\xc6\\xe1\\xf0\\x93\\xc5\\xe0\\xc9\\x38\\xa2\\x41\\x02\\x12\\x2d\\xce\\xdb\\x40\\x62\\xc0\\xef\\x23\\xc6\\x93\\xbf\\xa3\\xc8\\x24\\xab\\xcb\\x4a\\x5f\\xcb\\xe1\\xf3\\xbd\\xcf\\xf5\\x38\\x4f\\x9d\\x13\\x2f\\xf6\\x77\\x9f\\xbe\\xbf\\xfe\\xbc\\xb8\\x7d\\x57\\x6e\\xe2\\xf8\\xa9\\x89\\xec\\x7d\\xdb\\x44\\xf4\\xee\\x91\\xfc\\x74\\xcb\\x49\\x2f\\x77\\xe2\\x33\\x06\\x7d\\xdc\\x35\\xb8\\x6d\\xf6\\xcf\\xbe\\x32\\x70\\x7a\\x44\\xc6\\x7f\\xf9\\xda\\xd3\\x62\\xdf\\x71\\x8a\\xcb\\x5f\\x5f\\x2e\\xb0\\xcf\\xb2\\x2f\\x83\\x17\\x94\\x15\\x16\\x77\\x75\\x15\\x28\\x99\\xe8\\xd3\\x45\\x88\\x0a\\xb4\\xea\\x27\\xd6\\xc8\\xb9\\xa2\\x7e\\x18\\xf1\\xd8\\x4c\\x53\\x8c\\xb2\\xa9\\x58\\xad\\xc5\\xea\\x12\\xfc\\xfa\\x93\\x9c\\xf8\\xdd\\xfd\\x17\\x46\\x5a\\x03\\x55\\xa2\\x1c\\x6f\\x7d\\xa4\\xbf\\x8e\\x61\\x9f\\x5d\\x18\\xd9\\x37\\x76\\x3a\\xbc\\x26\\xe4\\x6e\\xda\\xf7\\xd5\\xed\\x85\\x9c\\xce\\x03\\x4c\\x2c\\x7f\\xcc\\x1e\\x67\\x5f\\x06\\x05\\x86\\x21\\xbf\\x81\\x72\\x36\\x46\\x2d\\x1f\\x2a\\xa2\\x4f\\x84\\x37\\x4a\\xb8\\xe4\\xa6\\x2a\\xda\\x34\\x2c\\xba\\x29\\xf9\\x2e\\xdb\\x34\\xb5\\x1e\\x89\\xaa\\x58\\xb2\\xc2\\x11\\x3a\\xf9\\x17\\x2c\\x42\\xa8\\x7a\\xfd\\x06\\x82\\x52\\x64\\x21\\x1f\\xae\\x4c\\x53\\x2a\\xb7\\xda\\x42\\x59\\xc2\\x92\\x70\\x44\\x5e\\x61\\x09\\xd9\\x5b\\x51\\x4e\\xa2\\x7a\\x95\\x26\\xbc\\xad\\xca\\x4c\\xa7\\x09\\x8b\\xf5\\x4f\\x13\\xbd\\x46\\xae\\x74\\x73\\x6b\\xf8\\xae\\x44\\xb2\\xb7\\x35\\xb9\\x7b\\x76\\x20\\xd4\\xb1\\x39\\x1b\\xcd\\xee\\x3a\\xde\\xf5\\xd3\\xe3\\x7d\\x56\\xc4\\xc5\\xe7\\xfa\\x12\\xdb\\x36\\x44\\x4a\\xea\\x86\\xbb\\xf0\\xd9\\xec\\xde\\x33\\x03\\x1f\\x1f\\x3b\\x67\\x2c\\x8b\\x4b\\x21\\xa7\\xc3\\x97\\xc8\\xc5\\xb2\\x1d\\x89\\xa0\\x35\\xb4\\x76\\x53\\x67\\x2a\\x3d\\xb0\\x55\\x3c\\x37\\xc3\\x84\\x8c\\x52\\xb7\\x27\\x52\\x1b\\x29\\x4d\\xc4\\xe3\\x7e\\x69\\x66\\xa8\\xe1\\x50\\x8f\\x44\\xe6\\xe0\\xcc\\xf2\\xcf\\xd9\\xd3\\xdc\\x4b\\x10\\x81\\x8b\\xa0\\x07\\x1d\\x82\\x59\\xd7\\x06\\x95\\x31\\xcb\\xb2\\x0a\\x46\\x4d\\xb5\\x45\\x32\\x19\\x84\\xa3\\x12\\x0e\\xea\\x55\\xd0\\x4e\\x0a\\x47\\x9d\\x56\\x8b\\x98\\x0f\\x3a\\x29\\x48\\x25\\x46\\xba\\xb2\\x58\\x74\\xf8\\xee\\x67\\xff\\x48\\xa9\\xac\\x48\\x8d\\x13\\xb3\\x37\\x0c\\xaa\\xcd\\xf2\\x2b\\x27\\x36\\xdd\\x30\\xe0\\x88\\x7b\\x9e\\x89\\xb0\\x1e\\x11\\xdb\\xdc\\xf3\\x66\\x9b\\xc9\\x23\\xb2\\xa0\\xb2\\xa6\\x9a\\x1a\\xf4\\x02\\xc3\\x9a\\xcc\\xb6\\xc8\\xad\\xdd\\x3d\\xaa\\x40\\xac\\x95\\x4f\\xc1\\xc0\\xab\\x5e\\x0a\\xe5\\x3c\\x59\\xb9\\x09\\x79\\x8d\\x2e\\x82\\x6d\\x8d\\xb7\\xd5\\x41\\x24\\xaa\\xb3\\xb5\\xd9\\xda\\xba\\xdc\\x99\\xbf\\x73\\x5f\\xb6\\x32\\xa5\\x04\\xe0\\x0a\\xe6\\xd8\\xe6\\xdc\\xd0\\x78\\xea\\xf4\\xf9\\xaf\\xb7\\x36\\x9a\\xed\\xac\\x34\\xf9\\x69\\x99\\x10\\x32\\xbf\\x33\\x79\\xed\\xd2\\xc8\\x5c\\x97\\xd8\\x3b\\xb1\\x6f\\x67\\xcf\\x9f\\xba\\xdd\\x1d\\xff\\xed\\x1b\\x64\\xfc\\xc7\\x96\\x35\\xf6\\x38\\x7b\\x15\\x2a\\x88\\x5d\\xf5\\x10\\x19\\x2c\\xa3\\x85\\xae\\x06\\x7d\\x12\\xb0\\x73\\x95\\xd0\\x64\\x6d\\x1a\\x66\\xdd\\x44\\x0c\\xb1\\x23\\x43\\xdc\\x24\\xe5\\x33\\xfd\\xec\\x0a\\x9f\\x69\\xa6\\x51\\xf0\\xfa\\x74\\x10\\xc9\\x3c\\xe9\\x60\\x91\\xca\\x0c\\xc4\\x6a\\x50\\x53\\x31\\xbe\\x3a\\xc6\\x9c\\x8b\\x6e\\xda\\x91\\x4a\\x7f\\x71\\x5b\\xf2\\xbc\\xf5\\x22\\xc3\\x31\\x4c\\xea\\xc9\\xc1\\xf6\\xf1\\x41\\x09\\x3d\\xcd\\x58\\x97\\x7e\\x39\\x30\\xd9\\x11\\xe5\\x92\\x9d\\x47\\x7b\\x19\\x6e\\xf1\\x39\\x29\\xee\\x8c\\x05\\xb6\\x75\\xf5\\xd7\\xee\\x7f\\x86\\xd6\\xf4\\x2c\\x7f\\xca\\x5e\\x65\\xaf\\x02\\x0f\\x51\\xdd\\x6a\\xe5\\x01\\x51\\x1a\\x1e\\x61\\x41\\x22\\xd8\\x0d\\x54\\x70\\x17\\xd3\\xee\\x1e\\xe2\\xa6\\xbd\\x01\\xe4\\x69\\x44\\x39\\xd9\\x68\\x62\\x63\\xa8\\x07\\x1b\\x19\\xe4\\xbc\\x90\\x6e\\xe0\\x8f\\x27\\x47\\xff\\xfe\\xa1\\xc2\\x1f\\xb2\\x57\\x9d\\x01\\x33\\xc7\\x2c\\xf5\\xa2\\xc1\\x23\\x37\\x7a\\x9e\\xfb\\xf9\\xd2\\xc7\\xec\\x14\\xd5\\x89\\xe8\\x72\\x81\\x7d\\x8b\\xbd\\x0a\\xa5\\xf0\\xb1\\x9e\\x8f\\xcc\\xfb\\xfc\\x25\\xb2\\x2c\\xeb\\xcd\\xf1\\x32\\x4d\\xaa\\xf0\\x37\\xb1\\x33\\xa3\\x0a\\x4e\\x4d\\x0d\\xea\\x8b\\xde\\xb8\\xe1\\xbf\\x33\\xb7\\x55\\x9a\\xaa\\xe6\\xd2\\x5f\\x61\\xcb\\x8d\\xeb\\xaf\\x5e\\xfb\\xd9\\x39\\x9d\\xa3\\xf4\\xd7\\xa8\\x25\\x01\\x33\\x0e\\xdc\\x70\\xaa\\x36\\xc7\\xaf\\xb0\\xf5\\xc6\\xf5\\xa6\\xce\\x5f\\x9e\\xd6\\xb7\\xa7\\x39\\x6b\\x54\\xab\\xcd\\x8c\\x6d\\x37\\x9c\\xaa\\xa7\\xec\\x57\\x06\\xec\\xbb\\x71\\xbd\\x69\\xf8\\xdf\\x3c\\xe0\\x13\\x6d\\x44\\x54\\xec\\x36\\xa7\\x47\\x9c\\x77\\x90\\x67\\xec\\x73\\xcf\\x7b\\x7d\\x1e\\x8f\\x98\\xb7\\xdb\\x9c\\x91\\x93\\x91\\x93\\x31\\xa3\\x93\\x17\\x14\\xec\\x50\\xf2\\x5e\\x9f\\x87\\x17\\x14\\x68\\xb6\\x9a\\x2d\\x56\\x5b\\xc0\\xee\\x70\\x7a\\xbc\\xb7\\x76\\x8c\\xa1\\x66\\x3b\\xb9\\xed\\xf3\\x07\\x4a\\xec\\x8e\\xdb\\x3f\\xd0\\xd9\\x50\\xca\\x82\\xfa\\xe8\\x9c\\x05\\x91\\xec\\x69\\x64\\x1b\\x90\\x6c\\x64\\x4c\\x31\\x1b\\x8a\\x45\\x9f\\x30\\x33\\x27\\x2e\\x0d\\xfc\\x30\\x58\\xe9\\x31\\x9e\\x08\\xdf\\xb5\\xfe\\xd4\\x73\\xcf\\x1c\\x67\\xaf\\x9a\\xed\\x61\\x97\\x99\\x5b\\x1a\\x62\\x2e\\x2c\\xed\\x5f\\xf8\\xc7\\xa7\\x46\\xe5\\xf0\\xcf\\x0b\\x29\\x8d\\x19\\x5a\\xba\\x4c\\xe7\\x70\\x18\\x80\\xbd\\xc2\\x5e\\xfd\\x1c\\x47\\x8a\\xfe\\x7d\\x8e\\x34\\x48\\x39\\x52\\xc4\\x0e\\xa3\\x8e\\xc2\\x4b\\x97\\x7f\\xa1\\x5d\\x28\\xfc\\x08\\xf5\\x5f\\x2d\\x14\\x7e\\x81\\xde\\x46\\x6f\\x14\\xae\\xa0\\x81\\x82\\x52\\x08\\xa3\\x83\\x85\\x73\\xba\\xed\\x4a\\x15\\x2e\\xb2\\x0b\\xec\\x55\\x88\\x13\\x4c\\x45\\x10\\x29\\x0e\\xca\\xb8\\x4a\\x52\\xad\\x46\\xbd\\x52\\x20\\x78\\x53\\x2d\\x2f\\xba\\xaa\\xf2\\x20\\x2f\\xe0\\x0a\\x05\\x54\\x6b\\x15\\x2f\\x60\\x50\\xb0\\x9b\\xcf\\xa3\\x40\\x85\\x6e\\xe6\\x73\\x15\\x28\\xb0\\x3e\\x40\\xed\\x7a\\x13\\x42\\x89\\xdb\\x25\\xc7\\x89\\x4c\\xac\\x89\\x08\\x6e\\xaa\\xcb\\x68\\x66\\x2c\\xe6\\xb2\\x64\\x69\\xfd\\x60\\x2a\\x54\\xb8\\x14\\xbc\\x66\\xe6\\x90\\x27\\x1f\\x8c\\xd8\\x9e\\x14\\xc4\\x70\\x21\\x91\\x7e\\x6a\\xf4\\x78\\xe1\\xe3\\x59\\x63\\x90\\xb3\\x5a\\x04\\xbe\\x63\\xb8\\x8d\\x1d\\x69\\x71\\x07\\xac\\x66\\xc3\\x52\\x37\\xfa\\x65\\xfb\\xb4\\x9c\\x9d\\xeb\\x59\\x1a\\x19\\x3b\\x71\\x64\\x85\\x7b\\x7d\\x8a\\xbd\\xfa\\x1b\\xb8\\x57\\xf4\\x7f\\xca\\xbd\\xb6\\x2e\\x7d\\xc4\\xfc\\x74\\xe9\\x87\\x8c\\xe8\\x8c\\xb9\\x46\\x99\\xef\\xcd\\x8c\\x2e\\xd5\\x53\\xee\\x15\\x0e\\x16\\xae\\xb3\\xad\\x86\\x52\\xa8\\x84\\xfb\\x00\\x97\\x4a\\xaa\\xdf\\xa0\\xd1\\x42\\x3a\\x83\\x86\\x6d\\x34\\xee\\x46\\x38\\x26\\xe1\\xf0\\x4d\\x82\\x73\\x05\\x97\\x86\\x1d\\x99\\xbc\\x40\\x6b\\x28\\x04\\x8b\\x45\\xc4\\x81\\x4c\\x3e\\x4c\\xf1\\x7b\\x98\\x58\\xb5\\x2a\\xaa\\x59\\xc4\\x49\\x0a\\x15\\xba\\xd7\\x71\\x2b\\xd8\\xb6\\x82\\x88\\x3d\\x59\\xe2\\x0f\\x13\\xee\\xb8\\xec\\x8b\\x55\\x9a\\x02\\x5e\\x93\\x9f\\x37\\x79\\xfd\\xf5\\xc8\\x47\\x1c\\x7f\\x75\\x36\\x57\\x5b\\x1d\\x3b\\x58\\x3d\\xb4\\x8b\\x43\\x13\\x33\\x57\\x5f\\x46\\x5c\\xfe\\x79\\xe3\\xe4\\x89\\xfb\\x3b\\x46\\x9e\\x6e\\x7e\\xc8\\x3c\\xdc\\x8f\\x7e\\x3c\\x3e\\x36\\x71\\x0e\\x8d\\xa2\\x89\\xb7\\x1e\\xfb\\xa0\\x53\\x29\\x2c\\x3e\\x77\\xea\\xc0\\xb8\\x4b\\x1a\\x78\\xf3\\x8d\\xb9\\x21\\xba\\x1f\\xe5\\xa5\\xc2\\xeb\\x4c\\x9b\\x21\\x47\\x79\\x51\\x84\\x39\\xdd\\x0a\\x39\\x35\\xfa\\xd0\\x79\\x51\\xc4\\xcb\\x3c\\x7a\\xe9\\x64\\xe1\\x75\\xe3\\x03\\xbf\\x7a\\x9c\\xca\\xc5\\x4b\\x85\\xeb\\xec\\x79\\x43\\x29\\xac\\x81\\x01\\x20\\x01\\x54\\xc0\\xa0\\x61\\xa7\\xa4\\xda\\x56\\xa7\\x80\\x32\\x29\\x91\\x9b\\xb8\\x8a\\x72\\x94\\x24\\xde\\x8a\\xf0\\x64\\xb4\\x11\\x64\\x11\\xb1\\x3f\\xa3\\xae\\xa5\\x6e\\x36\\x40\\x06\\x1c\\x51\\x14\\x6c\\xe3\\x71\\xa5\\x82\\x41\\x50\\x4d\\x55\\xfa\\xf0\\xb9\\xe2\\xb0\\x2b\\x18\\xdf\\xca\\x50\\x8d\\xbe\\x80\\xd7\\xb8\\x52\\x3e\\x45\\xa6\\x23\\xa7\\x0f\\xfd\\xa5\\xe6\\xb6\\x6f\\xce\\xf6\\x1a\\x47\\xbe\\x94\\x5c\\xd7\\x3f\\x64\\xfc\\x23\\xf5\\xea\\x91\\x54\\x2e\\x16\\xb0\\xf6\\x1a\\x9f\\xcb\\x1b\\xf7\\xee\\xe3\\x9e\\x99\\xb0\\xdd\\xf5\\xd8\\xf4\\xb9\\x89\\xb1\\xf1\\xa1\\xb9\\x37\\xae\\xa9\\xe3\\x9c\\xd5\\x61\\xae\\xbf\\xf0\\x1c\\x62\\xea\\x3b\\x3f\\x78\\x6c\\x62\\x54\\x97\\xf3\\x5e\\xe6\\x02\\xfb\\x26\\x7b\\x0d\\x4a\\xa0\\x16\\xf2\\x2c\\x91\\x11\\xbf\\x51\\xa3\\xf4\\x09\\x47\\x23\\x43\\xba\\x79\\x4a\\x35\\xf3\\x94\\xdf\\x2a\\x51\\x14\\x45\\x65\\xfd\\xbc\\x90\\x37\\xda\\xec\\xba\\x7c\\xeb\\x00\\xdd\\x9f\\x5b\\xa9\\x92\\xaa\\x4e\\x54\\xc7\\x2a\\x4d\\xbd\\xe9\\xf3\\x5b\\xdb\\x47\\xc3\\xbd\\x39\\xa5\\xab\\x76\\xa8\\x74\\x73\\x5b\\x47\\x55\\xdb\\x48\\xa8\\xb3\\x73\\xb0\\x8b\\x85\\xee\\x31\\x29\\xd4\\x85\\x36\\xb7\\x76\\xc5\\xdb\\xe4\\x0a\\xb9\\xa2\\x87\\xd6\\x04\\xdd\\xb9\\x2f\\xba\\x45\\x67\\x74\\xf2\\x02\\x51\\x3b\\x8b\\x74\\xe7\\xfe\\x68\\xec\\xc8\\x2c\\x18\\xf5\\xda\\xd2\\x52\\xbb\\xb6\\x72\\x19\\x29\\xf2\\xa4\\x14\\xbb\\xd0\\xcd\\x5e\\x75\\x2b\\x61\\x5d\\xa2\\xda\\x53\\x5b\\xd7\\x84\\x3c\\xb2\\x47\\x2f\\x47\\xab\\xac\\x46\\x47\\xb6\\x4b\\x52\\xe7\\xf6\\x8c\\x1c\\x8b\\xb9\\x6e\\xed\\x87\\xde\\x28\\x49\\x0a\\xf7\\x4e\\xba\\xa3\\x23\\x2d\\xb5\\xc7\\xa2\\x9f\\x69\\x81\\xa6\\xe4\\x01\\x26\\xb7\\xf4\\x5a\\x78\\x6b\\x7b\\xb3\\xb7\\xbd\\xb3\\xa7\\xb8\\x8f\\x61\\x79\\x88\\xbd\\xc8\\x15\\x20\\x0c\\x6b\\x60\\x09\\xf2\\x46\\x86\\x58\\x06\\x89\\x84\\xd0\\x65\\xb2\\xea\\xe5\\x34\\x62\\x23\\x0c\\xb7\\xf8\\x34\\xbd\\xa0\\x9b\\x66\\x67\\xd7\\x52\\x53\\x8e\\xab\\xcb\\x90\\x1a\\x2c\\xaf\\x79\\x0d\\xd4\\xf2\\x60\\xcd\\x6b\\xd4\\xa3\\x9f\\xfe\\xe4\\x90\\x6e\\xc5\\xcb\\xdd\\xd8\\x78\\xc3\\x89\\x83\\x6e\\x6c\\xbd\\x41\\xde\\xcd\\x1b\\xca\\x8d\\x1e\\xf1\\x7a\\xd3\\xc3\\xff\\xf6\\x27\\xd4\\x5a\\x07\\xdd\\xf3\\xb6\\xa0\\xd5\\x23\\xce\\x7b\\xc8\\xb3\\x61\\xde\\x4b\\xdf\\x94\\x91\\xe7\\xeb\\x4d\\xbf\\xfb\\x09\\x4f\\xbf\\x54\\xee\\x9e\\x0f\\x91\\x3f\\x9b\\x8f\\x91\\x67\\xc3\\x7c\\x15\\x79\\xc9\\x87\\xca\\x8d\\xb7\\x19\\xf4\\x98\\x92\\xf7\\x04\\xad\\xe4\\xca\\xa6\\xc0\\x82\\xd5\\xe6\\x09\\xc5\\x8a\\x86\\xdc\\x6a\\x30\\x5a\\x6d\\x1e\\x6f\\x59\\x28\\x56\\xf5\\x39\\x23\\xae\\x56\\x79\\x79\\x61\\xc1\\x01\\x4e\\x7f\\x60\\x95\\xb7\\x6d\\x42\\x01\\x02\\x1a\\x56\\x36\\xbe\\xb2\\x04\\x34\\x88\\xc8\\x94\\xc8\\xd5\\xa0\\x9c\\xd7\\x1f\\xf0\\x38\\xd9\\x91\\xd6\\xa3\\x57\\xc7\\x42\\x27\\xdc\\xac\\xf7\\xe9\\xde\\x01\\x33\\x32\\xd7\\x0f\\xde\\xf7\\xd4\\xf8\\xf6\\xe3\\x3f\\x76\\x87\\x1f\\x2e\\x7f\\xea\\xda\\xd7\\x8f\\x0c\\xf5\\xb7\\xec\\xef\\x16\\x99\\x86\\xe1\\xff\\x38\\x73\\x97\\xe1\\x43\\xa7\\x3d\\xec\\xba\\x1a\\xfe\\xed\\x09\\x63\\xc2\\xdc\\x5e\\xb6\\x54\\xfb\\xd0\\xe8\\xd9\\xff\\xe6\\xfa\\x48\\x2c\\xfc\\xe8\\xcc\\x9f\\xc7\\x99\\xef\\x73\\x75\\x03\\x5f\\xa6\\x32\\xdb\\xbd\\xfc\\x3e\\xfb\\x3d\\x6e\\x11\\x1a\\x90\\x0c\\xf9\\x06\\x00\\x71\\xbe\\xb4\\xa1\\xce\\x29\\xe2\\x9c\\xac\\xa6\\xcd\\x1a\\x5e\\x9f\\xa1\\xdb\\x5a\\xd5\\xa0\\x41\\x53\\xeb\\x1b\\xdc\\x91\\x1b\\x12\\xde\\x28\\xab\\xeb\\x58\\x0d\\xa7\\x32\\x0b\\x36\\x6b\\x83\\xc7\\x21\\xe2\\x2a\\x99\\xaa\\x6c\\x65\\x06\\xe1\\x46\\x9a\\xf2\\x4a\\x38\\xb5\\x7c\\x82\\x46\\xc4\\x89\\x2a\\x8b\\x38\\x1f\\x49\\x98\\xcc\\xa2\\xea\\x74\\x52\\xe5\\x26\\xb1\\x6b\\x32\\x93\\x77\\x46\\x56\\x60\\x99\\xda\\xa4\\xbb\\xe5\\x8f\\xaf\\xbc\\xba\\x4c\\xdd\\xf2\\xc6\\x1a\\xbc\\xbe\\x06\\x6f\\x74\\xab\\x29\\xee\\x57\\x78\\xbd\\x5b\\xcd\\x71\\xbf\\xba\\xfe\\x33\\xc7\\xab\\xef\\xd2\\x05\\x49\\xb9\\xe7\\x6b\\x52\\xeb\\x3d\\xe2\\xbc\\x44\\x9e\\xf1\\x46\\xf7\\xfc\\x86\\x8d\\x39\\x8f\\x38\\xaf\\x90\\xe7\\x7c\\x4d\\x6a\\xfd\\x6d\\x0b\\x23\\x29\\x79\\x65\\x63\\x8e\\x5c\\x6d\\x50\\x60\\xbe\\x46\\xda\\xa0\\xe8\\x49\\xc6\\x54\\x8d\\xb4\\x3e\\xb7\\x41\\xd9\\x78\\x47\\x92\\xd1\\xe4\\xe4\\x05\\xd5\\x62\\x57\\x14\\x35\\x11\\xe1\\x85\\x7c\\x65\\xbc\\x9e\\x62\\xe3\\xfa\\x06\\x5e\\xc0\\xb5\\xb4\\x52\\x18\\x64\\x45\\xc1\\x56\\x82\\x5a\\xd4\\xa0\\x8d\\x17\\xb0\\x5f\\x59\\x9f\\xce\\x35\\xb2\\xb9\\xba\\x6c\\x6d\\x22\\x96\\x95\\xf5\\xbd\\xa4\\xc5\\xd5\\xd3\\x21\\x72\\x40\\xf6\\xc5\\xfc\\x26\\x6f\\x71\\x47\\xc6\\x2a\\x83\\x1b\\xab\\x34\\x75\\x4b\\xd9\\x90\\xd3\\xdc\\x1e\\x9e\\x3b\\xe0\\x44\\x1b\\x47\\x66\\x3b\\xbe\\x31\\x3e\\xe0\\xb6\\x95\\xa4\\xdb\\xc5\\xee\\xcd\\x09\\xf7\\x1b\\x38\\x88\\xb6\\x3b\\xe3\\x25\\xde\\x7b\\x87\\x86\\xa2\\x9d\\x5b\\xeb\\x0e\\xee\\x0b\\x0d\\x1d\\xdc\\x2f\\x0e\\x7c\\x7d\\x34\\x10\\xf4\\x0b\\xae\\x23\\x27\\x3a\\x7f\\x7b\\xa2\\xad\\xa1\\xf7\\xc4\\xae\\x2c\\xda\\x77\\xd8\\x1d\\xb5\\x27\\x42\\x0d\\xc3\\x2d\\x72\\xcf\\xc4\\xf8\\xbd\\x17\\x8f\\x32\\x4c\\x59\\x38\\xb8\\xf1\\x40\\x5f\\x28\\x56\\x7e\\x17\\xd5\\xb1\\x53\\xa8\\x9b\\x9d\\xe0\\x72\\x50\\x01\\x69\\x78\\x08\\x70\\x50\\x52\\xab\\x4c\\x1a\\x4e\\x49\\xaa\\xdd\\xa4\\x17\\x4d\\x73\\x37\\xd5\\x70\\x40\\xc3\\x61\\x37\\x8d\\x77\\x3d\\x01\\xbd\\x4e\\x3a\\xcc\\xf1\\xc2\\x3c\\x32\\x59\\x2a\\x48\\xac\\x90\\xe4\\xe7\\xad\\xce\\x92\\x10\\xb9\\xf4\\x08\\xf3\\x2e\\xde\\x17\\xa0\\x19\\x93\\xaa\\x20\\x2f\\xcc\\xfb\\x41\\xff\\x20\\xc5\\xcf\\x23\\x13\\xef\\x23\\x97\\x76\\x61\\xde\\x6c\\x75\\xba\\x75\\xc1\\xa6\\x8c\\x66\\x5d\\x2e\\x91\\x0b\\xd4\\xc9\\x99\\x40\\x2e\\x60\\xf2\\xfb\\xbc\\x2b\\xfb\\x6b\\xf5\\x84\\x0a\\x8d\\x33\\xaa\\xf5\\x39\\x3b\\x35\\x1e\\x2a\\x2f\\x0f\\x4f\\x74\\x8c\\xf7\\x8e\\x0d\\xf7\\x8d\\x77\\x8c\\x37\\xd4\\x1f\\xe9\\x38\\x92\\x1c\\x4a\\x8f\\xf5\\x1d\\x19\\x5a\\xa1\\x22\\x51\\x43\\x43\\x6f\\x92\\xbc\\x5e\\x78\\x38\\x39\\xb4\\x3e\\x3d\\x94\\x9c\\xd8\\xf6\\x50\\xbd\\x72\\x78\\xdb\\x91\\xbe\\xb1\\xb1\\x2f\\x1c\\x6e\\x3f\\x12\\x0e\\x35\\x8e\\xa3\\xf1\\x15\\xba\\xb1\\xb7\\xa1\\x21\\xb2\\x71\\x7b\\xb1\\x7e\\x11\\x80\\xbd\\xce\\x15\\xa0\\x04\\xbe\\xac\\xb3\\x00\\x2b\\xb9\\xda\\x05\\x5e\\x70\\x81\\x43\\xc4\\x56\\x59\\xe5\\x4d\\x1a\\xb6\\x67\\x16\\x7c\\x7e\\x7a\\xc3\\x28\\xab\\x3e\\x83\\x86\\xcd\\x19\\x4a\\xec\\xb9\\x6e\\xaa\\x9e\\x40\\x26\\x43\\xf7\\xc1\\x1a\\x2c\\x99\\x4c\\xde\\xe9\\xa2\\x52\\x6c\\xb6\\x88\\x04\\x15\\xb8\\x68\\x7c\\xe1\\xf2\\x59\\x44\\xcc\\x67\\x28\\xb7\\xe7\\x74\\xad\\xe4\\x7c\\xfd\\x77\\xe4\\x7c\\x7d\\xd1\\xe2\\xbf\\x58\\x36\\x5a\\xfc\\xd7\\xf1\\x2d\\x94\\x44\\xfc\\x37\\x0a\\x17\\x91\\x50\\xf8\\x39\\x79\\x9c\\x2a\\xbc\\x8f\\xc2\\xe4\\xc1\\x15\\x96\\x34\\xc6\\xb7\\x34\\x2c\\x4e\\xcc\\x3c\\xf4\\xda\\x6b\\x0f\\xcd\\x4c\\x88\\xc4\\xc6\\xdf\\xf2\\xb7\\x26\\x08\\x41\\x31\\x4f\\x8b\\xb9\\x0c\\x71\\xb8\\xd8\\x98\\x51\\x4d\\x4e\\xad\\x98\\x23\\x25\\x7e\\x97\\xd5\\x7d\\xef\\xc9\\x93\\x85\\xd7\\x99\\x1f\\x2c\\x6d\\x64\\xcf\\x32\\x6f\\x2f\\xc5\\xa9\\x7c\\x1c\\x5f\\x3e\\xcb\\xf6\\x1b\\x86\\xa1\\x19\\xee\\x86\\x07\\x01\\x37\\x4a\\xaa\\xd9\\xac\\xe1\\x35\\x92\\x1a\\x22\\xe0\\xac\\x9b\\x46\\x95\\x29\\x9b\\x86\\x3d\\x91\\x9b\\xbc\\xba\\xd9\\xa6\\xe1\\x14\\x3d\\xbc\\x01\\x6f\\xcf\\xa8\\x8a\\x5b\\x53\\x6b\\x05\\x4d\\xbd\\x07\\x89\\xaa\\xcd\\xc3\\x0b\\xdf\\x41\\xfe\\xd0\\x9a\\x74\\xe3\\xb6\\xbb\\x88\\x10\\x28\\x7c\\x3e\\x5a\\x95\\x53\\x14\\x05\\xd7\\x0a\\x38\\xa2\\x80\\xba\\xc6\\xcc\\x0b\\xdf\\x01\\x54\\x12\\x89\\x2a\\xf4\\x1b\\xc5\\x38\\xd3\\x5f\\x2c\\x9c\\x49\\xe8\\x72\\x52\\xbd\\x5a\\x90\\x42\\xc2\\xce\\xd5\\x48\\x93\\x96\\x4a\\x16\\x99\\xf0\\x6a\\x8f\\xd7\\x1f\\xa8\\x40\\x81\\xba\\x44\\x6d\\xb5\\x84\\x9c\\xe8\\xf8\\x01\\x3b\\x67\\x0c\\x54\\x34\\xed\\x19\\x3d\\xe4\\xaf\\x1b\\xda\\xfa\\xf4\\xec\\x60\\xe7\\x09\\x79\\x60\\x6a\\xeb\\xe8\\xb7\\xd3\\x13\\x56\\x86\\x0b\\x67\\x5b\\xe3\\xf1\\x2d\\xe9\\x50\\xbc\\x7b\\xaa\\xef\\xa5\\xde\\x2d\\xb3\\x75\\x83\\x33\\x1d\\xfb\\xae\\x3f\\xb4\\xe7\\x70\\x2c\\xcb\\x77\\xa0\\xd1\\x07\\x77\\x26\\xe5\\xa6\\x69\\xce\\xee\\x8f\\x87\\xea\\x87\\xb6\\xc4\\x72\\xeb\\x93\\x5e\\xf9\\xe8\\x60\\xeb\\xe1\\x60\\xcf\\x13\\xf5\\xf7\\x77\\x4b\\xc3\\x7d\\x63\\x56\\x7b\\x50\\x4e\\x94\\x94\\x88\\x1b\\x23\\xe9\\x8d\\xb9\\x64\\x7c\\xe0\\x4c\\xc3\\xc1\\x60\\xff\\xa9\\xd6\\xf1\\x7b\\xd6\\xf7\\x33\\x3f\\x6c\\xed\\x8f\\x58\\x5d\\xe6\\xc4\\x60\\x6b\\x4f\\x75\\xd8\\xd9\\x06\\x0c\\x7c\\xc8\\xcd\\xb2\\x51\\x43\\x0f\\xdd\\x6f\\x92\\x03\\x6c\\x95\\x70\\x40\\x56\\x59\\x2b\\x4d\\x74\\xb1\\xd6\\xd5\\x3a\\x2f\\x93\\x5d\\xa3\\x47\\x92\\x20\\x51\\xf5\\xda\\x69\\x68\\xa2\\x43\\x48\\x96\\x96\\x39\\xdc\\xbe\\xa1\\xe0\\x8e\\xad\\x27\\x1f\\x36\\x8a\\xc9\\x70\\x18\\x35\\x24\\xc5\\x46\\x74\\xa8\\x9e\\x5c\\x37\\x26\\xc5\\x7a\\x4e\\x4b\\x36\\x87\\xc3\\x62\\xb2\\xa1\\x71\\x8d\\xd8\\x48\\x2f\\xea\\x69\\x7e\\x24\\x04\\x09\\x76\\x91\\x6b\\x00\\x01\\xaa\\xa1\\x93\\x68\\xbf\\x53\\x5a\\x28\\xa1\\x07\\x74\\xe0\\x76\\x49\\xdd\\x6c\\xd2\\x70\\x4e\\x52\\xd7\\x99\\x34\\x5c\\x29\\x15\\x0f\\xee\\x40\\xf8\\x2e\\x9a\\x97\\xf6\\x04\\xc0\\xcb\\x89\\xd8\\xa3\\x6f\\x8f\\xdd\\x14\\xd0\\xf0\\x26\\x4a\\x29\\x2d\\x58\\xe9\\x07\\x6a\\x17\\x12\\xd5\\xd0\\x26\\x5e\\xb8\\x66\\x28\\xa9\\x5c\\x27\\x6d\\x6d\\xa7\\xf6\\x20\\xb7\\x99\\x17\\xbe\\xe3\\x09\\x25\\x24\\x58\\xdf\\xba\\xf5\\xce\\xb2\\x30\\xa3\\xc9\\x98\\xf8\\x0d\\x3c\\x59\\xe0\\xce\\x74\\x65\\xe2\\x8e\\x32\\x71\\x1a\\x85\\x86\\xee\\xfa\\xea\\xc2\\xd8\\xe8\\x0b\\x73\\xdd\\xe8\\xdc\\xd9\\x37\\xc6\\x16\\x7e\\xff\\xae\\xc1\\xa6\\x43\\xe7\\x7a\\x7b\\x1e\\x7f\\xb0\\xa5\\xf9\\xc1\\xc7\\x7b\\x7b\\xcf\\x1d\\x6a\\x1a\\x4f\\xf7\\x8c\\x66\\x0f\\x3d\\xea\\x3d\\x60\\x66\\x8c\\x81\\x68\\xac\\x26\\xd4\\x92\\x8b\\x87\\xe5\\xb6\\x64\\xba\\xc7\\x3f\\x20\\xce\\x6d\\x6f\\x7a\\xf0\\x6e\\x89\\x49\\x1f\\x7c\\xf9\\xb1\\x7b\\xee\\x79\\xec\\xe5\\x83\\x6f\\x3d\\x75\\x01\\xf5\\x9c\\xf9\\xf3\\x07\\x06\\x2e\\x3d\\xdc\\xda\\xf6\\xc8\\xd3\\x03\\x03\\x4f\\x1f\\xdd\\xba\\xe5\\xe8\\xa5\\xfe\\xa6\\x23\\xdd\\xd2\\xbe\\xbe\\x84\\xd3\\xe7\\x0f\\xfa\\xbd\\xc8\\x27\\x6d\\xab\\x4d\\xdd\\xbd\\x29\\x96\\x11\\x37\\xb5\\x6c\\x97\\xfb\\xc6\\xc9\\x5c\\x5e\\x44\\x39\\x76\\x8c\\xfb\\x14\\x58\\xa8\\x80\\x14\\x1c\\xd4\\x77\\xbb\\x98\\x34\\x5c\\x2e\\xa9\\x95\\x26\\x0d\\x27\\x25\\xd5\\x6a\\xa2\\x0e\\xce\\x53\\xcc\\xb3\\x13\\xbb\\xea\\xa4\\x76\\xb5\\x94\\xe8\\x47\\x22\\x93\\x51\\x4b\\x1c\\x7a\\x12\\x9a\\x18\\x57\\xd5\\xcd\\x2b\\x0a\\x2e\\xe5\\xf3\\xce\\xf2\\x4a\\xea\\x69\\x2a\\xcb\\x79\\x41\\x2d\\x29\\x53\\x88\\xb9\\xc5\\x9c\\xa2\\x3a\\xad\\xc5\\x2f\\x15\\x37\\xd0\\xd4\\xd6\\xe5\\x1a\\x51\\x3d\\xca\\xd6\\xea\\x79\\xf7\\x0a\\x14\\x42\\x7a\\xe2\\xbd\\xba\\x98\\x09\\x6d\\xa0\\xc4\\xcc\\x45\\xe6\\xaf\\x97\\x0e\\xcc\\x1c\\x6a\\xd9\\x19\\x0d\\x5d\\x38\\xb6\\xb9\\x6d\\xec\\xb9\\x99\\x47\\x67\\x86\\xc6\\x8f\\x9c\\x98\\x6d\\xdd\\x1c\\xdc\\xda\\x98\\x8c\\xf6\\x8d\\x6f\\x0d\\xa1\\xdc\\xa1\\x43\\xe8\\xf9\\xbe\\x29\\xde\\xc8\\x94\\x5c\\x19\\xe8\\x1d\\xe7\\x8e\\xcd\\xf8\\x0a\\x2d\\x5b\\xfa\\x8f\\x0d\\x24\\xb6\\x78\\x53\\x1d\\xb9\\xb8\\x39\\x2c\\xd1\\x7d\\x8d\\x30\\xcd\\x9e\\x65\\x65\\x30\\x82\\x83\\xee\\x04\\x0a\\x98\\x90\\xa9\\xf8\\x72\\x02\\x6d\\xb8\\xfb\\xdf\\x90\\xb1\\x27\\x8d\\xb2\\xdd\\x9f\\x20\\x63\\x0f\\xfa\\xa9\\x84\\x52\\xbd\\xff\\xbd\\xf0\\x7e\\x0f\\x1a\\x58\\xb9\\xa2\\x36\\xf7\\x3a\\x6a\\x61\\xbb\\x99\\x1f\\x82\\x01\\xd6\\xaf\\xec\\x10\\x5a\\xd9\\x25\\xcf\\x59\\x44\\x84\\x8d\\xfa\\x3e\\x66\\xa7\\x96\\xe7\\x58\\xba\\x35\\x95\\x04\\x32\\xa6\\xd5\\x9d\\xf0\\x31\\xfe\\x3a\\x73\\x7e\\x96\\x69\\x9b\\x29\\x4c\\x21\\xee\\xff\\x7c\\x4f\\x3a\\x77\\x87\\x0e\\xd4\\x42\\x3d\\x7c\\xfb\\x76\\x2d\\x90\\xa5\\x85\\xac\\x09\\x4a\\x39\\x31\\x2f\\x67\\x49\\xe3\\x72\\xc2\\x22\\xe2\\x7a\\x69\\x61\\x8d\\xfe\\xf1\\x6d\\x6a\\xb1\\xe9\\xd7\\xd5\\x62\\xa1\\x56\\x7f\\x97\\xcd\\xe0\\x5a\\x7a\\x1e\\xca\\xc2\\x3a\\xfd\\xc6\\xba\\x3b\\x54\\xa5\\x01\\x89\\xea\\x86\\x5a\\x5e\\x58\\x30\\x54\\x96\\x64\\x8a\\xbb\\x8e\\x70\\x5a\\xc1\\x21\\x01\\xaf\\x57\\x40\\x95\\x4b\\x78\\x41\\x5d\\x9f\\x56\\x14\\x9c\\xe5\\xe7\\x3d\\x20\\x51\\x67\\x5a\\x2f\\xe0\\x75\\xff\\x1b\\xea\\xe3\\xe1\\x75\\x5c\\x6e\\xf2\\x98\\xd8\\x98\\x8f\\x97\\x33\\xb9\\x5a\\x11\\xfd\\xaf\\x35\\xe6\\x2f\\x5f\\x39\\x7e\\x64\\x93\\x32\\x3b\\x7c\\x6c\\x6e\\xff\\x59\\x74\\x61\\xf4\\x7f\\xa9\\x1d\\x85\\x59\\xa6\\x6f\\xa4\\x53\\x1e\\x70\\x2f\\x83\\x0b\\xc1\\x22\\xea\\x1a\\x18\\xd0\\xfd\\xe9\\x22\\x77\\x9c\\xe5\\xb8\\x4f\\x80\\x85\\x4a\\x28\\x46\\x6c\\x7a\\xd4\\xc6\\x49\\x2a\\x20\\x71\\x81\\xb5\\x83\\x99\\x13\\x6f\\x5b\\x96\\x45\\xc6\\xcc\\x1d\\x1f\\x1f\\x27\\xb2\\xf5\\x09\\xf3\\x4b\\x36\\x6a\\x08\\x81\\x00\\x51\\x68\\x26\\x6b\\xa2\\xfa\\x4d\\x1a\\x0e\\x49\\xaa\\x81\\xe8\\x4f\\xa5\\xbe\\x7d\\xc0\\x41\\xb7\\x0f\\x10\\xfd\\xb1\\x38\\x34\\x35\\x46\\xe2\\x12\\x0f\\x2f\\xa8\\x4e\\x03\\x51\\x98\\x10\\x09\\x74\\x2d\\x70\\x07\\x01\\xfc\\x1b\\x0e\\x36\\x71\\x32\\x9f\\xa4\\x3a\\x47\\x73\\xe3\\xdd\\x3d\\x62\\xe7\\xe8\\x46\\x65\\xb4\\x53\\x9c\\xee\\x6f\\x6a\\xe9\\x4f\\x89\\xcd\\x61\\x25\\x59\\xc2\\x99\\x95\\xbd\\x1d\\x62\\x4f\\xf7\\x78\\x6e\\xb4\\x23\\x25\\x6e\\xdf\\x53\\xdf\\x32\\xb2\\x7b\\x73\\x8b\\x9c\\x2e\\x5b\\x5f\\xaf\\xc7\\x28\\x83\\x10\\x63\\xaf\\x72\\x4f\\x81\\x0d\\x5c\\x24\\x42\\xb7\\x4b\\xaa\\x83\\x72\\xee\\xff\\xeb\\x43\\x1f\\xdc\\xbf\\xf9\\xd0\\x07\\x97\\x5e\\x81\\x5f\\x3c\\xf7\\xc1\\xae\\x57\\x33\\xf1\\xbf\\x76\\xf4\\x03\\xdd\\x30\\xb7\\x72\\xfc\\x43\\xe1\\x1b\\x6c\\x07\\xf3\\xf2\\x34\\xba\\xaf\\xf0\\x87\\xd3\\x85\\x63\\x68\\x66\\x69\\xcf\\xcc\\x0c\\x20\\xf8\\x80\\x31\\xb2\\xb2\\xa1\\x14\\x12\\xd0\\x06\\xb4\\x98\\xd7\\xa4\\xa9\\x5e\\x96\\x98\\x73\\x95\\x35\\xe9\\x59\\x8d\\xf0\\x4d\\xd5\\xec\\xd0\\xf2\\x61\\x9a\\xbb\\x0f\\x07\\x2c\\x22\\x41\\x79\\xa0\\xba\\x03\\xbc\\x80\\x4b\\x14\\xb5\\x92\\x84\\x21\\x60\\x76\\x06\\x13\\x9f\\xdf\\xea\\x66\\x72\\xa2\\xe2\\x96\\xfd\\xa8\\xbe\\xb7\\x5f\\x3f\\xf9\\x84\\xdc\\xfe\\x40\\xba\\x74\\x40\\x1e\\xea\\x10\\x7d\\xe9\\x81\\xb6\\x6c\\x7f\\x0c\\x4d\\x58\\x03\\x56\\xe3\\xd2\\xf7\\x73\\x93\\x83\\x4a\\xb6\\xb6\\xa7\\x79\\x72\\x8b\\xd1\\xca\\x71\\x87\\xba\\x07\\x62\\x8d\\x7d\\x72\\xb2\\xa1\\x71\\x5b\\x6d\\x72\\x47\\x42\\x98\\x19\\xe8\\x38\\xba\\x35\\x95\\xec\\x8d\\xc9\\x1d\\x7d\\xe6\\xa0\\x7e\\xee\\xc7\\x87\\x0c\\xc3\\x36\\x19\\x82\\x20\\xc1\\x4e\\xc0\\x35\\x12\\x3d\\xa8\\xc8\\x2e\\x2d\\x78\\x74\\xed\\x2b\\x95\\xd4\\x0a\\x32\\x8a\\xf5\\x34\\x5b\\x9f\\x74\\x68\\xd8\\x4f\\x30\\x48\\xcc\\xa1\\xa9\\x69\\x22\\x11\\x04\\x52\\x55\\x2b\\xa0\\xda\\x8d\\xbc\\x30\\x0f\\x2c\\x4a\\x52\\x7c\\xca\\xe3\\x6a\\x05\\x97\\x0a\\xf9\\x60\\x79\\xec\\x16\\x69\\x44\\x42\\xea\\x95\\x4d\\xfb\\xfe\\xcc\\x4a\\x5a\\xe0\\x37\\xec\\xda\\xff\\x70\\x97\\xd9\\x6a\\x6d\\xed\\xef\\x3f\\xb0\\xab\\xd7\\x1d\\x72\\x5b\\x7d\\xd6\\xc1\\xae\\xbe\\x96\\x89\\x1d\\x1d\\x0f\\x3c\\x93\\xdb\\xdd\\x91\\x6c\\x91\\x5b\\xbe\\x20\\xf7\\x1e\\x6e\\xc4\\xcc\\xdc\\x01\\x6b\\xc2\\xd2\\x8a\\xba\\x72\\xd9\\x7a\\x86\\xb9\\x9f\\x69\\x48\\xa5\\x3a\\x86\\x3a\\x8f\\xc5\\x1a\\xbb\\x53\\xb9\\x7e\\xb7\\x75\\xcf\\xe6\\xf4\\x17\\x36\\xc7\\xf5\\x73\\x3a\\x2e\\x73\\x29\\xe6\\xa7\\x86\\x0b\\xc0\\x42\\x04\\x30\\x4b\\xeb\\xbf\\xec\\xc4\\xa0\\x50\\x86\\x64\\x81\\xb1\\x83\\x73\\x55\\x43\\x90\\x27\\xc0\\xa2\\xcb\\x0b\\x33\\x6f\\x72\\xfb\\x51\\x4d\\x5f\\xe1\\x9f\\xe8\\x1c\\xa5\\x0b\\xcf\\xb2\\xbf\\x60\\xaf\\x42\\x0a\\xf6\\xe9\\x7b\\x6e\\x70\\x42\\x56\\xcb\\x0c\\x5a\\xde\\x4c\\x02\\x7a\\xbf\\x4c\\xd3\\x3f\\x35\\x34\\xec\\xb2\\xae\\x14\\x34\\xa4\\xf4\\x23\\x85\\xbc\\x48\\x54\\x4b\\x9c\\xba\\xcb\\xf1\\x5a\\x79\\x01\\x27\\x14\\x5c\\xc2\\xe3\\x2a\\x05\\xd4\\x28\\x0d\\xef\\xd7\\x29\\x0a\\x2e\\xe3\\x55\\x57\\x58\\x51\\xb0\\x59\\xc8\\x57\\x54\\xad\\x5d\\x49\\xa7\\x70\\x94\\x0e\\xa6\\x35\\xae\\x0d\\x88\\x32\\xc3\\x99\\xba\\x26\\x14\\x30\\x26\\x2a\\xab\\x29\\x72\\xaf\\x4e\\x94\\x23\\x53\\xda\\x68\\xb3\\x9a\\x8d\\x73\\xd1\\x5c\\x7b\\x22\\xd1\\x51\\x1f\\x9b\\xed\\x09\\xd5\\xdb\\xed\\x1b\\x3a\\xef\\x6f\\xf9\\x92\\x39\\xf6\\xe8\\x8e\\xce\\x99\\x10\\x53\\x78\\x36\\xf4\\xd0\\x63\\xdf\\x7a\\x7c\\x3a\\xce\\x58\\x97\\x7e\\xd2\\x77\\x70\\x73\\x88\\xe3\\x62\\xad\\xfb\\x3b\\x04\\x26\\xbc\\xd4\\x76\\x1a\\xa5\\x83\\xa5\\xf7\\x1f\\x41\\x83\\x9b\\xbb\\xef\\xda\\xd6\\x3e\\xf1\\xd1\\x84\\x6e\\x53\\x66\\x97\\x27\\xd8\\x69\\x43\\x0f\\xf0\\xc4\\x2a\\x58\\x69\\xfc\\x9f\\xb7\\x1a\\x56\\x75\\xc5\\x94\\x41\\x58\\x90\\xb0\\xfd\\xa6\\x6a\\x0b\\x68\\xd8\\x46\\x8f\\x72\\xb3\\xd0\\xa3\\xdc\\xb0\\x4d\\xaf\\x2e\\x32\\x05\\x34\\x4a\\x31\\x17\\xad\\x02\\xd1\\x25\\xf2\\xaf\\x86\\x9d\\x95\\x27\\x5f\\x39\\x8d\\xe0\\xe8\\xc5\\x2f\\x77\\x1d\\xdf\\xad\\xb0\\x9f\\xb4\\xfd\\xf6\\xae\\xec\\xa7\\x31\\xc3\\xbe\\x4f\\x2f\\xb0\\x15\\x5c\\xe3\\xb0\\xbe\\x1f\\x15\\x1d\\x62\\xd2\\xcc\\x08\\x1b\\x04\\x3b\\xd4\\xd0\\x7a\\x3d\\x7d\\xaf\\xf0\\xff\\xc6\\xe1\\x25\\xe8\\x7f\\xb2\\x2b\\x98\\xb9\\x92\\x6e\\x8d\\xc5\\xe8\\xe9\\x25\\xe4\\xf7\\x5b\\x0a\\xe7\\x59\\x81\\x9e\\xd6\\xf9\\x5b\\xc5\\xdd\\xc8\\x16\\x0b\\x94\\x70\\x22\\x16\\xa4\\x05\\xb6\\xe8\\x6c\\xbc\\xc4\\x72\\x2c\\xd8\\x74\\x6f\\x62\\xd3\\x0b\\x70\\x5d\\x01\\x4d\\xf5\\x11\\x20\\x41\\x60\\x81\\x5d\\x20\\x06\\x90\\x15\\x74\\x8a\\xd4\\xc2\\xab\\xc8\\xa5\\xc7\\xa6\\x0e\\x65\\x7d\\x1a\\xe5\\x74\\x71\\x17\\x51\\x4e\\x36\\x15\\x3b\\x84\\x5a\\xe4\\xfe\\x87\\xb2\\x6b\\x77\\x35\\x04\\x06\\x1c\\xb1\\x53\\x0f\\x4f\\x4e\\x16\\xde\\xef\\xeb\\x40\\x61\\x6f\\xfa\\xf9\\x61\\xc6\\xba\\x57\\x19\\xd2\\xe7\\xfe\\x53\\xc6\\xc8\\x8c\\x1a\\xdc\\x60\\x84\\x08\\xdc\\x79\\xcc\\x88\\xf3\\x37\\x1f\\x33\\x62\\xfa\\x14\\xb9\\x07\\x66\\x7f\\xc0\\x4d\\x7e\\x63\\xf1\\x97\\xcc\\xde\\xda\\x3b\\x71\\x52\\x00\\x62\\xb0\\x6d\\x15\\x27\\x79\\x24\\x35\\x68\\xd0\\x70\\x54\\x52\\x2d\\x06\\xbd\\x8c\\x8d\\xbb\\x49\\x00\\x11\\x2e\\xd1\\x13\\xae\\x4e\\x07\\xad\\x68\\x53\\x2b\\x88\\x3f\\xb4\\x78\\x56\\x72\\x7c\\x2a\\xe7\\xbc\\x85\\x80\\x7e\\xf3\\xe9\\x55\\x44\\xad\\x09\\xea\\xb9\\x4f\\xee\\x1b\\x6f\\x68\\x3a\\xd4\\x23\\xc9\\x7d\\x47\\x1a\\x9a\\x0e\\xf5\\x4a\\x5f\\x39\\xd4\\xd1\\xf9\\xe0\\x03\\x9d\\x9d\\x87\\x08\\xde\\x61\\x5a\\xfa\\x4e\\xef\\x51\\xd2\\xf7\\x9d\\x18\\xe8\\x3f\\xbd\\x5b\\xae\\x1b\\x3e\\x3e\\x30\\x35\\x3b\\x33\\x35\\x7d\\xea\\xd4\\xe7\\x71\\x4e\\x0e\\x25\\x72\\xc8\\x87\\xe2\\xfa\\xcb\\x09\\x64\\xfc\\xb7\\xbb\\xd1\\x86\\xc2\\x4b\\x28\\x86\\xb8\\x4f\\xba\\x51\\xae\\xf0\\xe7\\x6f\\xa2\\xf0\\x7f\\xef\\x2d\\xfc\\x58\\x2a\\x5c\\xe9\\x59\\xbd\\x22\\xf3\\xc7\\x81\\x75\\xf9\\x08\\xfb\\x23\\xc3\\x7e\\x30\\x82\\x15\\x7c\\x50\\x02\\x8f\\x03\\xb6\\x49\\x98\\x97\\x17\\xfc\\x14\\x64\\x60\\x57\\x26\\x6f\\xf3\\x13\\x51\\xb6\\x79\\x2d\\x62\\xde\\x6f\\x23\\x97\\x7e\\x87\\x45\\xc4\\x66\\x89\\xc6\\x97\\xdc\\xcd\\x05\\x36\\x00\\x55\\x9c\\x88\\x59\\xb7\\x1a\\x40\\x74\\x1b\\xba\\x4b\\x97\\x02\\x21\\x93\\x77\\x05\\x68\\x78\\xc9\\x5b\\xc4\\x7c\\x80\\xc6\\x9d\\x01\\x9b\\x45\\xa4\\x61\\x26\\x59\\x16\\x15\\x59\\x15\\x05\\x07\\x78\\xec\\x57\\xb0\\x4b\\x50\\xcd\\x0e\\x32\\x83\\x7e\\x1b\\x2d\\x8d\\xc1\\x66\\x7e\\x1e\\x58\\x4b\\x49\\x31\\x22\\xa7\\x2b\\xe7\\x41\\x01\\x94\\x2b\\x1e\\xed\\xe1\\x8b\\x65\\x13\\x72\\xd6\\xfa\\x76\\xdb\\xbe\\xa7\\x8f\\x32\\x33\\x23\\x4b\\xd3\\x1f\\xa1\\xf6\\xa6\\xbd\\x7b\\x87\\x5e\\xbe\\xc1\\xfd\\xe2\\x91\\xa5\\xc7\\xd1\\x3f\\xad\\xf9\\xac\\xc2\\x30\\x9e\\xfb\\xf4\\xcc\\xd8\\x26\\xf4\\x4c\\xe1\\x81\\xce\\x6f\\x7d\\xab\\xf3\\x17\\x64\\xad\\xad\\xcb\\xfb\\xd9\\x5f\\x14\\xc7\\x2b\\xc1\\xef\\x02\\x8e\\x48\\x0b\\x65\\xba\\xf1\\xae\\xc8\\xe0\\xb5\\xd2\\x82\\x53\\x7f\\x43\\x86\\xb7\\xfe\\x73\\xc3\\x23\\x00\\x4a\\x87\\x53\\xf9\\x84\\x87\\x52\\x45\\x11\\x8b\\x48\\x0d\\xfb\\xad\\xd1\\x24\\xf8\\x17\\xcc\\x16\\x9b\\xb3\\xa4\\x4c\\x3f\\x8e\\x27\\xc2\\x0b\\xaa\\x35\\x4a\\x8b\\xa9\\x16\\x4c\\x36\\x4f\\x15\\x01\\x53\\xaa\\xd9\\xc9\\x0b\\x79\\x60\\x2d\\x45\\x63\\xbf\\x32\\x36\\x0b\\xba\\xcd\\x95\\x19\\x4d\\x94\\x85\\xd7\\x1d\\x59\\xdd\\xaa\\x1f\\xbb\\x6d\\xc0\\x28\\x9c\\x98\\x19\\x10\\xb7\\x6d\\xa8\\x70\\x26\\xda\\x95\\x01\\x19\\x89\\x66\\xaf\\xad\\x90\\x8d\\xef\\x6f\\x97\\x7a\\x5b\\x73\\x43\\xb2\\xd1\\xc4\\x7d\\x6e\\x26\\xd0\\xf3\\x2d\\xdb\\x2a\\xea\\xb6\\xc4\\xa3\\xe9\\xf4\\xc6\\x64\\xcb\\x06\\xe7\\xfd\\xed\\xe9\\x83\\xd9\\x58\\xbb\\x24\\xd7\\x6f\\x35\\x06\\x8c\\xc0\\x41\\x80\\xca\\xc2\\x24\\xac\\x87\\x5a\\x68\\x82\\x16\\x78\\x0f\\xf4\\x84\\x31\\xcd\\x79\\xaf\\x25\\xb6\\x3b\\x2b\\xe1\\x7a\\x79\\xa1\\x59\\x17\\x0d\\x25\\x93\\xcf\\x36\\x93\\x69\\xc8\\x36\\x5a\\xc4\\x7c\\x33\\x45\\xa3\\xcd\\x39\\x8b\\x88\\x25\\x69\\xc1\\xa4\\xcf\\xa2\\x8b\\x7a\\x46\\xf2\\xe5\\x8c\\x34\\x5f\\x9a\\x09\\x3b\\xc5\\xe2\\x64\\xd3\\x03\\x2f\\xac\\x37\\x17\\xd6\\xea\\xa2\\x12\\x88\\xdc\\xe4\\x17\\xaa\\xf4\\xeb\\xb5\\x6e\\x75\\x33\\x12\\x71\\x63\\x66\\x41\\xd1\\x6f\\x6c\\xca\\xe4\\x95\\xcd\\xe4\\xc7\\x95\\x7a\\x8b\\x98\\xdf\\xac\\x90\\xcb\\xcd\\x59\\x8b\\x48\\x8f\\xc0\\xb0\\x06\\xa8\\x93\\x50\\x37\\xaf\\xe5\\x05\\xdc\\x4c\\x62\\x78\\x35\\x93\\x23\\x72\\x24\\x35\\xf3\\x02\\x6e\\x51\\x54\\x64\\xa2\\x16\\x47\\xf5\\xb8\\x74\\x6f\\x52\\xc6\\xcf\\x97\\x87\\xaa\\xe4\\xa2\\x5c\\x15\\xf7\\x96\\xd0\\x09\\x5e\\x8b\\x4c\\x59\\x7f\\xdd\\xbf\\xe3\\x69\\x7f\\x5d\\xfe\\x02\\x77\\x19\\x2d\\xe6\\xd0\\xe6\\x58\\xfd\\xe0\\x96\\x2e\\x7b\\xa9\\xdd\\x5a\\x6a\\x6d\\xa9\\x6f\\x51\\x06\\x37\\xd5\\xf7\\xcd\\xa6\\xba\\x94\\xa8\\x9c\\xcc\\xb6\\x26\\x5b\\x07\\xd2\\xa7\\xd2\\x74\\xc5\\xde\\x59\\x11\\x51\\x76\\x5f\\x9f\\xb9\\xc2\\x12\\x2a\\xd9\\x54\\x9d\\xce\\x30\\x3d\\x1c\\x23\\x47\\x63\\x4d\\x5d\\x0d\\x7b\\x43\\x52\\x53\\x3c\\xd5\\xe6\\x34\\x77\\xd7\\x26\\xb7\\x64\\x43\\x8b\\xef\\xff\\xba\\xfc\\x32\\x70\\x62\\xf9\\x43\\x76\\xc6\\xd0\\x03\\x95\\x20\\xc1\\x34\\xe8\\x1e\\xb5\\x42\\x52\\x03\\x9c\\x86\\xd7\\x49\\x0b\\xd5\\x45\\x93\\xbf\\x9e\\x62\\x51\\xc1\\xab\\x61\\x41\\xdf\\x6b\\x47\\xfc\\xac\\xd5\\x3d\\xcf\\x5b\\x93\\x4e\\x71\\x21\\xa6\\x1f\\x33\\x10\\x93\\x16\\x92\\xba\\x37\\x20\\x22\\x2c\\xe8\\xa1\\x3c\\x8e\\xf1\\xaa\\x9b\\x53\\x14\\x6c\\xd2\\x6b\\x48\\xb0\\x95\\x9f\\x0f\\x54\\x54\\xaf\\xa3\\xe2\\x6c\\x0e\\x10\\xc1\\x2d\\x0b\\x16\\x5d\\x6e\\x1d\\x81\\x58\\x0d\\x48\\x2e\\x62\\xaf\\xcf\\x85\\xc1\\x9e\\xdb\\x29\\xf8\\x13\\xc3\\x8d\\x29\\x25\\x7a\\xdc\\x18\\xcc\\x49\\x1d\\xb9\\x98\\xd2\\x99\\xec\\x7b\\x22\\xb3\\xaf\\xe5\\x27\\x0f\\xf7\\xcd\\xdd\\x97\\xfe\\xc7\\xed\\xeb\\xa5\\x1d\\xdb\\x64\\x39\\x16\\x43\\x5d\\xfb\\x4f\\xca\\x71\\x69\\x68\\x73\\x5f\\x9f\\xb4\\xa5\\xa5\\x23\\xdd\\xf5\\x40\\x7d\\xaa\\x7b\\x63\\x6c\\x57\\xcf\\xee\\xd1\\x23\\x1b\\x47\\x66\\xd9\\xb7\\xd2\\xad\\x6d\\x92\\xd4\\x16\\x8d\\xea\\xb5\\x94\\x74\\xcf\\xbc\\xb1\\x17\\x4c\\x60\\x03\\x27\\xac\\xd3\\xcf\\x9a\\xc2\\xb0\\xb2\\x6b\\xde\\xce\\xad\\xee\\x9a\\x77\\x49\\xaa\\x9b\\x96\\xcc\\xdb\\x79\\x01\\x3b\\x6f\\xdf\\x35\\x9f\\x33\\x98\\xd0\\x1d\\x3b\\xe7\\x27\\x7b\\x90\\x22\\x15\\xbe\\x77\\xdb\\xfe\\x79\\xc3\\xf7\\xcf\\x5c\\xeb\\x5b\\xfc\\x26\\xfa\\x87\\xff\\xaf\\xda\\x8c\\x07\\x0c\\xec\\x1d\\x6d\\x3e\\x81\\x36\\xf4\\x14\\xfe\\x78\\xdd\\xed\\x6d\\x3e\\x7d\\xed\\xcc\\xf4\\xaf\\xb7\\xe9\\x04\\xfe\\xd7\\xdb\\x74\\xdd\\x6a\\x73\\x25\\x55\\x8d\\x88\\xb0\\xf3\\x77\\xb4\\x29\\x07\\x4c\\x09\\xd3\\x9d\\x87\\x04\\x54\\x23\\x47\\x6a\\xb1\\xf5\\xc7\\x1f\\x6e\\xb8\\xbd\\xe1\\x13\\xaf\\xbf\\xd6\\xf5\\xf5\\x53\\x8b\\xdf\\x2a\\x9e\\x19\\xa0\\xb7\\xbd\\x1f\\x4c\\x50\\x01\\x51\\xe8\\xf8\\x7c\\xdb\\xe1\\x95\\xb6\\xb1\\x5f\\xa2\\x27\\x73\\x06\\x25\\xd5\\x6a\\xa0\\xd1\\x10\\x89\\x7d\\x40\\x45\\x61\\x5e\\xc0\\x51\\x45\\x75\\x91\\xc8\\xc7\\x5c\\xa1\\xd0\\xa3\\x57\\x3c\\xb7\\xf7\\xac\\x4e\\x27\\x9a\\x57\\xe5\\x86\\x1e\\x4f\\x71\\x47\\x3f\\xb9\\x23\\x47\\xe3\\x77\\xb7\\xe7\\x5c\\x92\\x14\\xbd\\xab\\x61\\x40\\x92\\x3a\\x9a\\xb3\\x25\\xa9\\x3a\\xf1\\x8e\\x6e\\xbf\\x98\\x97\\xea\\xa5\\xa6\\xd4\\x3d\\x1d\\xed\\xe9\\x8d\\xe9\\x5c\\xfb\\xe2\\x03\\xb4\\xff\\x5c\\xb1\\xff\\xdd\\x60\\x02\\x2f\\x04\\xa0\\x0a\\xee\\xff\\xfc\\x08\\x7c\\xab\\x23\\x10\\x24\\x5c\\x29\\xab\\x36\\xab\\x86\\x83\\x19\\x84\\xe3\\x12\\x36\\xdf\\x54\\x5d\\x76\\x0d\\xbb\\xdc\\x6a\\x09\\x12\\xd5\\xb0\\x5d\\xd3\\xcb\\xf2\\xcd\\xbc\\xa0\\x1a\\x7d\\x0a\\x3d\\xcf\\x04\\x31\\x01\\xba\\x0f\\x5c\\xc8\\x1b\\xfc\\xf4\\x64\\x13\\x15\\xf9\\x8a\\x75\\x0a\\xab\\x03\\xbc\\xe3\\x78\\xde\\xd5\\xf7\\x3a\\x53\\x76\\xdb\\x28\\x63\\x0d\\x49\\x31\\x1c\\x6e\\x14\\x93\\x0d\\x13\\xa8\\xff\\x85\\xbe\\x4d\\xe4\\x1d\\x6a\\x10\\x93\\x9b\\x56\\xc7\\xf8\\x51\\x91\\x32\\x6b\\x58\\x8c\\xa3\\x7f\\x60\\xca\\xef\\xe0\\xcd\\xc2\\xcb\\x05\\xf6\\x1d\\xe3\\x20\\xf8\\xa1\\x14\\xe2\\xf0\\xc8\\x6a\\x6d\\x2a\\xf6\\x49\\x6a\\xc0\\xa4\\x11\\x65\\xb7\\x14\\x2d\\x6f\\xb1\\x60\\xc9\\x45\\x0b\\x96\\x38\\x24\\x2e\\x94\\xe9\\x1e\\xae\\xcc\\xad\\x46\\x90\\xb8\\xe0\\xd4\\x39\\x80\\x04\\x12\\x55\\xce\\xaf\\x97\\x89\\x94\\xf1\\x38\\xa0\\xe0\\x88\\x30\\x6f\\x41\\xa5\\x3c\\x09\\x59\\x9c\\x3c\\x2e\\x51\\x40\\x8d\\x05\\x78\\xe1\\x05\\xce\\x89\\xf8\\x52\\xbd\\x94\\x3f\\x80\\xee\\x3c\\x6c\\xa8\\x78\\x30\\x85\\x0d\\xdd\\x06\\x7b\\xc2\\xe8\\xc5\\xf6\\xe1\\x90\\xdc\\x96\\x48\\x6c\\x91\\x43\\xc3\\x1d\\xe8\\xfd\\xd5\\xf3\\x2a\\xee\\x96\\x63\\xb1\\x74\\x3a\\x16\\x93\\x19\\xee\\x97\\xe6\\xb1\\xf6\\x78\\x53\\x3a\\x14\\x4a\\x37\\xc5\\xdb\\xf7\\x19\\x3f\\xb3\\xa3\\x89\\xc2\\x09\\xf4\\x21\\xfa\\x07\\xf4\\x4e\\x22\\x9b\\x4d\\x24\\xb3\\x59\\x62\\x0b\\xcd\\x00\\xec\\xbb\\x5c\\x01\\x5c\\xe0\\x81\\xff\\x97\\xba\\x73\\x01\\x6f\\xea\\x3c\\xf3\\xfc\\xff\\xd3\\x39\\x92\\x25\\x59\\x96\\x74\\x8e\\x64\\xc9\\x77\\x4b\\x96\\x65\\x21\\x64\\x5b\\xb6\\x64\\x59\\x08\\xdb\\x18\\x83\\x6d\\x8c\\x71\\x08\\x75\\x3d\\x2e\\xb8\\xd4\\x0d\\x37\\x63\\x08\\x60\\x08\\x26\\x84\\xba\\x84\\xf2\\x90\\x34\\x69\\x53\\xd2\\x32\\x69\\x69\\x86\\x49\\x5b\\xca\\x64\\xd8\\x0c\\xdb\\x65\\xcf\\x91\\x15\\x9a\\x65\\x33\\xf4\\x96\\xcc\\xf4\\x92\\xa6\\x4d\\x2f\\x69\\x33\\xe9\\x5c\\x9a\\xc9\\x66\\x56\\x1d\\xda\\xcd\\xf6\\x49\\xf3\\x64\\xb2\\x89\\xd8\\xe7\\x7c\\xe7\\xd3\\xc5\\x42\\xc2\\xee\\x64\\x76\\xba\\x63\\x1e\\x71\\xce\\xd1\\xe5\\x9c\\xf7\\x7d\\xbf\\xf7\\xfb\\xbe\\xf7\\xbb\\xfd\\xbe\\xb3\\x6c\\x55\\x18\\x2c\\xe1\\x70\\x16\\x63\\x60\\xa3\\xcb\\xf1\\x12\\x66\\xab\\x89\\x2e\\xa0\\xd4\\x26\\x13\\x5a\\xbd\\x29\\x03\\x35\\xb0\\xab\\x6b\\x29\\xcd\\x34\\x89\\x4d\\x84\\x76\\x81\\xa7\\x1b\\xbe\\x94\\x39\\x66\\xd0\\x64\\x70\\x03\\xe5\\xea\\x88\\x4f\\xf7\\xff\\xbe\\x7e\\x38\\xbd\\x90\\x8c\\x7c\\x5d\\xb2\\x58\\x25\\xdb\\xd7\\xe7\\xcd\\x16\\x9b\\x2d\\x30\\x6f\\x55\\xfe\\xe7\\xe6\\x89\\xd9\\x6a\\xcb\\x52\\x74\\xc3\\x24\\x0b\\x44\\x70\\x0b\\x6e\\xce\\x16\\x16\\x3c\\x7a\\xf2\\xc7\\x9a\\x81\\xd4\\x05\\xe2\\x4f\\xfd\\x8c\\x4c\\xa4\\xfc\\xa9\\x37\\x67\\x3e\\xf5\\x6b\\x47\\x06\\x91\\x40\\x26\\x52\\x17\\xc9\\x0b\\x9a\\xcb\\x20\\x18\\x4b\\x9d\\xa5\\x6c\\x8b\\x95\\xb8\\x03\\x19\\xa4\\x85\\x12\\xa3\\x04\\xd5\\xda\\xb5\\x34\\x48\\xa4\\xae\\x34\\xd9\\x42\\x72\\x5a\\xe5\\x10\\x09\\xc8\\x3e\\x67\\x92\\xd2\\x58\\x43\\x4e\\x41\\x5c\\x6d\\xd0\\x8a\\x35\\x9e\\xc6\\xe5\\xcd\\x11\\x15\\x0f\\x15\\x54\\x2a\\xc9\\xe6\\x98\\x54\\x2a\\xcc\\xc3\\xe9\\x6b\\xa1\\xf4\\x0b\\x36\\xd1\\x5d\\x65\\x15\\x14\\xc3\\x5f\\x10\\x0b\\x61\\x1e\\xec\\xcb\\x46\\xea\\xad\\xdc\\xd8\\xe4\\xe9\\x4b\\x23\\x0b\\x80\\x18\\x5b\\x57\\xa4\\x81\\x18\\x91\\x27\\xb6\\x97\\xd2\\xb0\\x7d\\x2f\\x0b\\xe3\\xed\\xe3\\x5f\\x3e\\x31\\xac\\xd9\\xff\\x2c\\x21\\x67\\x7b\\x0a\\xe3\\x31\\xc6\\xf7\\x99\\x36\\xd2\\xd0\\x7e\\x83\\x1a\\xe8\\x9f\\xd3\\x8f\\xfe\\xe9\\x75\\xb6\\x1e\\xf9\\x01\\xdd\\x18\\xed\\xcf\\x58\\x94\\x54\\x61\\x5d\\x8c\\x54\\x21\\xdc\\x44\\xaa\\x20\\x51\\x6d\\x49\\x0e\\xad\\xe2\\xdd\\xc7\\x95\\x2a\\x20\\x93\\x20\\xb4\\xf8\\xa7\\xfd\\x2a\\xff\\xcf\\xe5\\xf0\\x3a\\xb5\\xb9\\x72\\xfc\\x92\\x56\\x0b\\x59\\x41\\x94\\x3a\\x61\\xa1\\x1c\\x62\\x86\\x8a\\x58\\x54\\x0e\\xdb\\x62\\x72\\x28\\x4d\\x6e\\x03\\xd4\\xf9\\xe8\\xf9\\xf2\\xd0\\x4a\\x23\\x57\\xa4\\xed\\xac\\xca\\xc8\\x0a\\xa5\\xd6\\x17\\xb4\\x0c\\x52\\xe5\\xda\\x84\\x52\\x54\\xc0\\x8b\\x7b\\x6e\\x2d\\x99\\xe4\\x08\\x4a\\x9e\\xb0\\x6c\\x31\\x26\\xa5\\x9a\\x50\\xba\\x50\\x2a\\x28\\xa6\\xc9\\x00\\x3d\\x9d\\x7b\\x2e\\x19\\xd4\\x8e\\x35\\x97\\x89\\x0e\\x17\\x29\\x25\\x94\\xcd\\x20\\x88\\xb2\\xc5\\x11\\x8b\\xc9\\xae\\x4a\\x41\\x94\\x6a\\x6e\\x52\\x21\\xb7\\xf0\\xf5\\xe6\\x96\\xbc\\xb9\\x5a\\x4d\\x64\\x8a\\x5e\\x72\\x20\\x5b\\xee\\x66\\x75\\xcc\\x14\\xbc\\xfe\\x9c\\x32\\x57\\xa3\\xf2\\x2c\\xb2\\xfe\\x50\\x94\\x68\\x61\\x5d\\x12\\xd1\\x42\\xb8\\x89\\x68\\xa1\\xf8\\x65\\x9a\\x6a\\xf1\\xee\\x75\\xc5\\x29\\x33\\x6c\\x0b\\xed\\x5f\\x53\\xa7\\xfc\\x77\\x90\\xc1\\xeb\\xd4\\xa6\\x65\\x48\\xf9\\xa9\\x43\\x66\\x85\\x38\\xaf\\x38\\x64\\xae\\x0c\\x22\\xde\\x7f\\x0b\\x19\\x6c\\x4b\\x92\\x81\\xfa\\xa3\\x46\\x10\\xe3\\x65\\x66\\x41\\x5d\\x60\\xb0\\x50\\x1e\\xea\\x93\\x19\\xb3\\x7c\\x9e\\x39\\x64\\x56\\xa8\\x87\\x98\\x43\\x72\\x4c\\xae\\x1c\\x7f\\x2c\\x22\\xd9\\xcd\\xae\\xb8\\xb8\\x98\\xf3\\x36\\x83\\x46\\x1f\\x90\\x4d\\xa6\\xa4\\x64\\x0a\\xe6\\x39\\x27\\xf5\\xcc\\xac\\x3f\\x2e\\x10\\xbf\\xa8\\x3f\\x66\\x34\\x7a\\xac\\xa0\\x33\\x66\\xf5\\x4b\\x16\\x70\\x46\\x0d\\x7a\\x6e\\xa4\\xb8\\xab\\x94\\xed\\x54\\x8f\\xdd\\x6c\\xde\\xb5\\x4d\\x9b\\x8c\\x73\\x74\\x26\\x84\\x2e\\x99\\x20\\xb0\\x72\\x65\\x01\\xa9\\x4e\\x5d\\x22\\x55\\xa3\\x72\\xee\\x05\\xda\\xd9\\x6b\\x33\\x2b\\x21\\x4f\\xdc\\x46\\xe7\\x29\\xd9\\xea\\x0c\\x81\\xb8\\x40\\x9b\\xb7\\x82\\xa2\\xaa\\x8d\\x36\\xeb\\x29\\x23\\xc3\\x9d\\x01\\x90\\x18\\x9c\\x6c\\x76\\x56\\x06\\x40\\x54\\xa2\\xf3\\xb8\\x05\\x5b\\x38\\x24\\x46\\x3a\\x34\\x01\\xa2\\xb4\\x90\\x7a\\x76\\x91\\x9a\\x87\\xbe\\x76\\x2c\\xe6\\xdf\\x70\\x68\\x68\\xd3\\xe7\\x53\\xef\\x9c\\x9a\\x7b\\xf6\\xb9\\x2b\\xcf\\x9e\\xf9\\xd9\\xcf\\x34\\xd3\\x47\\x35\\xb5\\x93\\x97\\x5e\\x3f\\xb3\\xf5\\xab\\x5f\\x38\\xee\\xf6\\x69\\xf6\\xa6\\xca\\x88\\xe9\\xb7\\x6f\\x92\\xaa\\xd4\\xd6\\xa3\\x34\\x5f\\x51\\x86\\x87\\x6e\\x2f\\x4c\\xf0\\xe0\\x54\\x61\\x8a\\x87\\x12\\x67\\xda\\xb5\\x74\\x79\\x94\\x45\\x9b\\x59\\x62\\x58\\x80\\xe9\\xe1\\x4d\\x03\\x46\\xca\\x62\\x12\\x27\\x24\\x34\\x16\\x7b\\xb5\\x47\\xa9\\xf7\\x0c\\x62\\xdc\\xe8\\xac\\xa0\\x11\\x5b\\x86\\xf1\\x21\\xdb\\xab\\x05\\x51\\x2e\\xf3\\xc4\\xe8\\x9a\\x84\\x8a\\x98\\x64\\x61\\x91\\x5c\\x2e\\xf9\\x83\\x2b\\x14\\xaf\\x66\\x70\\x20\\x9d\\x85\\x43\\xd5\\x3c\\x4a\\x48\\x7e\\xb4\\x0a\\x4e\\x65\\x86\\xe8\\xc6\\xe8\\x7c\\xff\\x00\\xd6\\xe7\\x53\\x43\\x3c\\xfa\\x24\\x91\\x9a\\x0b\\x51\\x43\\x5a\\xd8\\x8c\\xff\\x79\\xad\\x65\\xd9\\x72\\x5a\\xcb\\x7b\\x2a\\xe9\\x64\\x2d\\x63\\x6c\\x71\\x74\\x48\\x93\\x59\\xa3\\xb4\\x80\\x6e\\xcd\\x0e\\xe9\\xbd\\x73\\xb2\\x6b\\x2b\\x2d\\x7d\\x6e\\x49\\x0f\\xd1\\xb4\\xcf\\x7c\\x5d\\x73\\x5e\\xad\\x2b\\xff\\x90\\xfa\\x78\\x9d\\xda\\xc5\\xf5\\xf9\\x13\\xb5\\x24\\x5b\\x5c\\xa1\\x63\\xb4\\xce\\x5d\\xa8\\x4f\\x6b\\x11\\x7d\\x82\\x85\\xf4\\x69\\xcb\\xd1\\x27\\xf0\\xaf\\xd2\\x87\\x16\\x78\\x8b\\xab\\xe4\\x4a\\x97\\x84\\x8b\\x2b\\xb5\\x33\\x5b\\x67\\xab\\x7a\\xed\\xa5\\xac\\x9a\\x55\\x38\\xc2\\xf4\\x6a\\x4b\\xeb\\xb5\\x52\\x4f\\x87\\x66\\xaa\\xb5\\x49\\xc9\\x47\\x27\\x7a\\x12\\xa9\\x97\\x6a\\x19\\xb0\\xd0\\x59\\xfb\\x11\\xa6\\xe5\\x6a\\x12\\x90\\x03\\x4a\\x36\\xb3\\xc7\\xa4\\x88\\xf0\\xa4\\xd6\\x51\\xd7\\xb0\\xdc\\x42\\xf1\\x2b\\xa2\\x54\\x1f\\x83\\xbc\\xb2\\x4d\\xd1\\x39\\xa0\\xe8\\x2c\\x57\\x37\\x08\\xa2\\x6c\\x5f\\x4e\\x3b\\xcb\\xa4\\xfa\\x02\\x36\\x28\\xd8\\x24\\xe4\\xf2\\x0d\\x73\\x93\\x45\\x4e\\x14\\xce\\x7b\\xb7\\xe5\\x1b\\xea\\x26\\x03\\x71\\xdf\\x5d\\x98\\x1d\\xdf\\x75\\xe4\\x5b\\x4c\\xed\\x2b\\x55\\x6d\\xb5\\x89\\xfa\\x40\\x07\\xfa\\x70\\xa8\\x80\\x17\\x48\\xa1\\xa0\\xd4\\x1b\\x96\\x03\\xc6\\xa4\\xb4\\x22\\x44\\xa4\\x35\\xb9\\x2e\\xb1\\x8c\\x04\\xe4\\xa0\\x89\\x6e\\x52\\xa1\\xd8\\xad\\xdb\\x44\\xa7\\x28\\xa4\\x1d\\x65\\x2d\\x09\\xc8\\x91\\xa0\\x20\\xc6\\xb5\\x95\\x16\\xa5\\x4d\\xd9\\x2d\\x48\\x2b\\x7e\\x7f\\x6f\\x29\\x5a\\xbf\\x2c\\xee\\x40\\x62\\xe1\\x8a\\x67\\x71\\x77\\xfa\\x66\\xa1\\xf0\\x08\\x04\\x97\\x89\\x9f\\x3b\\xc4\\xeb\\x50\\x0a\\xd8\\x0c\\x24\\x4a\\xbb\\x38\\x4b\\x0c\\xe4\\x32\\xd1\\xa4\\x52\\x77\\xa4\\x88\\x66\\x47\\xea\\x77\\x84\\x9f\\x4c\\xbd\\x73\\x03\\xe4\\x21\\x52\\x46\\xac\\x93\\xa9\\x37\\x88\\x69\\x22\\xf5\\x9b\\xd4\\xaf\\x27\\x89\\x35\\xf5\\x16\\xf3\\xcf\\x13\\xdc\\xb3\\xda\\xbd\\xa8\\x44\\x23\\x9a\\xb1\\x5f\\x25\\x06\\xc8\\xbe\\xb4\\xc5\\xeb\\x95\\x7c\\xd7\\xa2\\x12\\x02\\x2c\\x94\\x10\\xb0\\x9c\\x04\\xe4\\x32\\x6b\\x52\\x32\\x86\\xe4\\x56\\xc6\\x07\\x90\\x1d\\x15\\xb4\\x07\\xf6\\x49\\xbd\\x58\\xae\\xad\\xf5\\x2a\\x6e\\x59\\x26\\xca\\x86\\x52\\xa5\\xf0\\xf7\\x89\\x6a\\x13\\xb7\\x5e\\x78\\xb2\\xb4\\xa2\\xac\\xc6\\x4b\\x49\\x92\\x5a\\x91\\xae\\x7d\\x49\\x2f\\xe4\\x8e\\x3a\\x4b\\x1c\\x42\\x7a\\x3d\\xbd\\x2f\\xda\\x64\\xb3\\x3b\\x09\\x1d\\x98\\x33\\x13\\x9b\\x23\\x1a\\x12\\x85\\x0e\\x5f\\xd7\\x9a\\x63\\x97\\xa6\\x7b\\x8e\\x75\\x4e\\xce\\x1c\\x3e\\xba\\xf1\\xc4\\xf9\\x4d\\x5d\\xc7\\x62\\xbb\\xf7\\x1e\\x7b\\xe0\\xf4\\x00\\xb9\\xb0\\x71\\x32\\x72\\x67\\x7b\\xb0\\xeb\\x73\\x23\\xa3\\xe7\\xbe\\x14\\xd5\\x9c\\x3c\\xf3\\xfa\\xa5\\x49\\xbf\\x3f\\xde\\xf5\\xe3\\x0b\\xa9\\x6f\\x3c\\xfd\\xf6\\xb9\\xde\\xa6\\xc0\\xb5\\xe8\\x2b\\x97\\xc9\\x6d\\xbf\\xfc\\x04\\x67\\x1d\\x0e\\x47\\x22\\xdf\\x7b\\xf7\\xcb\\xfd\\x84\\x80\\x18\\xbf\\x77\\x8c\\xd6\\x85\\x37\\x92\\xdc\\x05\\xdd\\x18\\xea\\xd0\\x80\\xb5\\xf9\\x24\\x18\\x4f\\x31\\x12\\x4c\\x23\\x23\\xc1\\xc4\\xab\\xea\\xdd\\x6a\\xaf\\xc4\\xe2\\x34\\x18\\xa5\\x22\\x28\\x4c\\x84\\xf9\\x4b\\xa5\\xf0\\x5f\\x04\\x0b\\xc3\\x7f\\x56\\x29\\xf9\\xff\\x5d\\xe5\\xf5\\x3a\\xb5\\x85\\xe5\\x7d\\x87\\x16\\xee\\x8b\\x09\\xbc\\x9f\\x96\\xec\\x0b\\x6d\\x4c\\xd7\\x7a\\x2d\\x94\\xb9\\xa9\\x98\\xcc\\x4a\\x90\\xa7\\x87\\x0a\\xfe\\x53\\x64\\x4f\\x54\\xb9\\xdc\\x1e\\xea\\x5c\\xe5\\x82\\xd4\\xb0\\x54\\x1d\\x68\\xe1\\x5e\\x58\\x8d\\x53\\xac\\x40\\x5f\\x4c\\x91\\xcd\\x6a\\x69\\xce\\x31\\x3d\\x36\\xa1\\x0e\\x01\\xac\\x50\\xf2\\x4a\\xae\\x26\\x92\\x3f\\x28\\x75\\x86\\xe5\\x06\\x63\\x52\\x0a\\x86\\x28\\x9f\\x29\\xab\\xd6\\x7c\\xbd\\x5e\\x69\\x62\\x35\\x99\\x72\\x15\\x9c\\x0f\\x97\\x8b\\xfa\\x80\\xdc\\x6c\\x4a\\x4a\\xcd\\x41\\x39\\x6c\\x52\\xf1\\x4d\\xcd\\x4d\\x74\\x3d\\x8e\\x14\\x16\\xa4\\xe0\\x12\\x75\\x2c\\x5a\\x24\\x15\\x56\\xfb\\xe3\\x05\\x8b\\xa1\\xc5\\x8c\\x70\\xa5\\x60\\x19\\xa4\\x51\\x59\\x37\\xba\\x31\\xe8\\x61\\xba\\x99\\x76\\x53\\x96\\xa1\\xdd\\x98\\x6f\\x4d\\xbb\\xe1\\xbc\\x4e\\x6d\\x96\\x78\\xb3\\x4d\\x6d\\x97\\xe7\\x70\\x6f\\xb8\\x8b\\xaa\\x33\\x65\\xd9\\x69\\xe5\\x68\\x40\\x7f\\x0e\\x3b\\x2d\\x61\\x77\\xd0\\x96\\xaf\\x9d\\x4b\\x26\\xf4\\x0d\\xf4\\x54\\xaf\\x4f\\xa6\\xb3\\x44\\xb9\\x25\\x29\\x97\\x38\\x42\\x21\\x25\\x31\\x68\\x66\\xe0\\x55\\x08\\x23\\xb2\\xd0\\xc5\\xf2\\x05\\x5c\\x35\\xca\\x51\\xf5\\xb8\\x8f\\x9d\\xe7\\x05\\x9e\\x18\\x73\\xe0\\x6a\\xff\\x4c\\xca\\xd7\\x6c\\xe9\\xae\\xe2\\x55\\xbc\\xda\\xdb\\xfc\\x3b\\xbc\\x46\\x57\\x2d\\x7e\\x35\\xb6\\xfd\\xd4\\xf0\\xf0\\xc9\\xc9\\x68\\xea\\x69\\xf2\\x8d\\x86\\xee\\x51\\xba\\x69\\x0e\\x2d\\xa3\\x0f\\xdd\\xb8\\xce\\x5d\\xd1\\x4e\\x60\\x05\\xf6\\x32\\x69\\x1d\\x6c\\xa9\\xa3\\xd4\\x14\\x94\\x7d\\x5a\\xa5\\x42\\x93\\x79\\x46\\xf4\\xc2\\x8b\\x74\\x13\\x9b\\x15\\xb4\\xa3\\x50\\x16\\xcc\\xc9\\x79\\x83\\xe0\\xd2\\x07\\xe4\\x16\\x0b\\x9d\\x9e\\x6b\\x60\\x88\\xaf\\x96\\x15\\x82\\xf8\\x24\\xef\\x30\\x55\\x37\\x55\\xd0\\x80\\xc7\\xe7\\x10\\x44\\xd9\\x54\\x19\\x8b\\x49\\x21\\x81\\x2d\\x76\\xef\\xc8\\x0e\\xae\\x30\\x6e\\x97\\x2f\\xaa\\x56\\x64\\x19\\x50\\x6c\\x24\\xb3\\xd2\\xf7\\xd0\\x73\\x5f\\x19\\x79\\x60\\x57\\xd7\\xf8\\x48\\xec\\xc3\\x7d\\x9e\\xd8\\xd4\\x83\\x9b\\x8e\\x4e\\x0e\\xf5\\x6c\\x09\\x8c\\xf5\\xf9\\x78\\xdf\\xf0\\xec\\xe8\\xaa\\x61\\xef\\x48\\x97\\xd7\\xd3\\x3b\\xde\\x11\\x1d\\xef\\xa9\\xe7\\xb6\\xa7\\xde\\xee\\xda\\x71\\x6a\\xdd\\xe6\\xcf\\xfa\\xc4\\xc1\\x3b\\x8e\\xf4\\x8e\\x3d\\xbc\\xb7\\xab\\xf7\\x70\\x7b\\x60\\xed\\xe6\\xe0\\xe0\\xe1\\xdb\\x9b\\x67\\x6b\\x7b\\x3e\\xd4\\x17\\x18\\xed\\xf5\\x46\\x77\\x7e\\x6a\\xfc\\x9d\\x73\\xb4\\x8e\\xa1\\x4c\\x1a\\xed\\xa3\\x94\\x49\\xd3\\x8e\\x3b\\x97\\x44\\xa5\\x09\\x15\\xa5\\xd2\\x84\\x17\\x50\\x69\\xae\\x50\\x2a\\x4d\\x6b\\xdb\\x7b\\xe6\\xd2\\xd8\\xa2\\xb6\\x92\\xa5\\xb1\\x69\\x8e\\x9d\\x4c\\xec\\x5e\\x94\\x4f\\xc3\\xbb\\xc7\\x53\\x3f\\xea\\xc1\\x7f\\x1c\\xfd\\xab\\x89\\x93\\x5b\\x9a\\xfe\\x97\\x12\\x27\\x7f\\xb0\\xa8\\xfe\\xdc\\xfa\\xf4\\x7c\\x95\\xb4\\xfe\\x73\\x54\\xff\\x0e\\xdc\\xb5\\x24\\xfd\\x23\\x45\\xf5\\xef\\x5c\\xa0\\xff\\x57\\x99\\xfe\\x21\\xa5\\x62\\x10\\x44\\xa9\\xfd\\x3d\\x9b\\x21\\x6c\\x2b\\xf1\\x2d\\xd1\\x13\\x96\\xbd\\xda\\xf2\\xcb\\xc9\\xf3\\x17\\x17\\x37\\x46\\x17\\xa9\\x4f\\xfd\\xfd\\xd0\\x8f\\x5f\\xc8\\xfa\\xc3\\x49\\xed\\x34\\x2a\\x11\\xc2\\x20\\xfe\\x3c\\xd7\\x1e\\x9d\\x0b\\xec\\xd1\\x9b\\xb6\\x87\\xb4\\x3c\\x28\\xbb\\xb5\\x49\\x29\\x18\\x94\\x6b\\x94\\xb2\\x62\\x1d\\xb5\\x4e\\xb8\\x34\\x29\\x85\\x99\\x75\\x7a\\x54\\xeb\\x48\\xbe\\x90\\x3c\\x44\\x02\\x72\\x58\\x09\\xcb\\x4a\\xab\\xe8\\x2e\\x81\\xab\\x0d\\xc6\\xb2\\xf2\\x1a\\xf7\\xf2\\x50\\xe7\\x1a\\xd5\\x48\\xb2\\xb7\\x49\\x89\\x01\\x7a\\x45\\x25\\xf2\\xb5\\x85\\x95\\x60\\x98\\x17\\x24\\x4d\\x4c\\xd2\\x8b\\xd4\\x60\\xb2\\x7b\\xb9\\x12\\x2a\\xb4\\x84\\x94\\x4f\\x82\\x82\\xe4\\xbb\\x95\\x09\\xd3\\x8d\\x89\\x55\\x9a\\xbc\\xd6\\xc4\\x12\\xb8\\x4f\\xd3\\x33\\xc7\\xbc\\x63\\x7d\\x51\\x4b\\x65\\x43\\x75\\x85\\x6d\\xa4\\x67\\x4b\\x30\\x38\\x12\\x5b\\x59\\xd1\\xd2\\xd9\\xd2\\xba\\x14\\x20\\x14\\xf7\\x96\\xd2\\xac\\xb0\\xd6\\xfb\\x1c\\xa3\\xc3\\xeb\\xd4\\x51\\xa9\\xfb\\xf3\\x18\\x51\\x3c\\xf3\\xbd\\x51\\xea\\x7b\\x2b\\xb1\\x0e\\x5f\\x5e\\x82\\xf7\\x49\\x2b\\x82\\xd2\\x40\\x58\\x6e\\x37\\x26\\xa5\\x55\\x21\\x22\\x0d\\xe5\\xba\\xa2\\x12\\xf3\\x46\\x4c\\x49\\x29\\xb2\\xd0\\x2b\\x25\\xc1\\x2a\\xad\\x71\\xbd\\x28\\xc8\\x5d\\xa6\\xa4\\xd4\\x15\\x94\\xd7\\x98\\x92\\xf2\\x7a\\xe5\\xab\\xad\\x82\\x38\\x6f\\xac\\x2d\\x6f\\xa7\\x53\\x38\\x85\\xb8\\xde\\x5f\\xa6\\xae\\xaf\\x56\\x6d\\x5f\\x75\\x93\\xed\\x7f\\xbf\\x32\\xab\\xe8\\xa4\\xf0\\xa5\\xf9\\xaf\\xae\\xe0\\xd4\\xf1\\xc5\\xdd\\xf9\\xdb\\x85\\xe6\\x96\\xa7\\x6d\\xfd\\x10\\xb5\\xf5\\x6a\\x8c\\xe0\\xab\\x4b\\xb1\\x75\\x77\\x30\\xd1\\xaf\\x0e\\xb7\\x0c\\x07\\x13\\xe1\\xdc\\x19\\xe7\\x39\\x26\\x4f\\xf4\\xa9\\x43\\x68\\x7d\\x56\\x79\\x1d\\x09\\x24\\xa2\\xea\\xc4\\x85\\x68\\x5e\\xc9\\xb0\\x91\\x04\\xe4\\xd6\\x2a\\x15\\xc9\\xd9\\x27\\x28\\xad\\x8e\\x75\\x62\\x42\\x5f\\x5b\\xd6\\x1d\\x56\\xac\\x1f\\x15\\x24\\xff\\xad\\x2c\\x2f\\x0f\\xf7\\xd3\\x3d\\x09\\x7f\\xcf\\x14\\x50\\x67\\x99\\x3a\\x0b\\x4c\\x40\\x5a\\x5a\\x1a\\x4c\\xd4\\x87\\xd7\\x7a\\x47\\x62\\x51\\x52\\x1f\\x1e\\xf4\\x7a\\xd7\\x86\\xeb\\xa7\\x43\\x0d\\x9e\\x70\\xd8\\xe3\\x69\\x5f\\x3c\\x1d\\xae\\x78\\xfb\\x42\\x35\\x91\\xe8\\x90\\x72\\xa8\\x09\\xf5\\xf9\\x7c\\xd1\\xa8\\xf2\\x52\\xca\\x18\\xfb\\x8d\\x24\\xf7\\x06\\xf7\\x34\\x02\\xe8\\xc1\\x20\\x2e\\x65\\xe7\\x09\\xd6\\x68\\x93\\x52\\x7b\\x88\\x26\\x85\\x64\\x0b\\xcb\\xfa\\x92\\xa4\\xb4\\x36\\x94\\xe8\\x75\\xba\\x95\\x04\\xe9\\x2d\\x49\\x4a\\x5c\\x48\\xea\\xb5\\xca\\x2b\\x74\\x99\\x62\\xa6\\xd9\\x9c\\x94\\x9a\\xad\\x72\\x94\\xd0\\xee\\xe3\\xca\\x32\\x25\\x57\\x48\\x95\\x56\\xb9\\x97\\x04\\x64\\x87\\x33\\x49\\xcb\\x9b\\x66\\xa5\\xbc\\x51\\xac\\x28\\x45\\x85\\xb8\\xde\\xd7\\xae\\x58\\xb7\\x52\\x94\\xad\\x8d\\xb1\\x98\\xd4\\x2b\\xc4\\x6d\\x35\\x14\\xe7\\xed\\x50\\xd7\\xf1\\xae\\xa8\\x51\\x92\\xa0\\xae\\x31\\x16\\x8b\\xd1\\x29\\x0f\\xb2\\xd1\\x1a\\x8b\\x49\\x65\\x82\\x54\\xaa\\x1a\\xbf\\x97\\xa4\\x8d\\xef\\x64\\x70\\x12\\x47\\x2d\\xd1\\x52\\xd6\\x11\\x5d\\x2e\\xd5\\xe4\\xcb\\xe7\\x39\\xf4\\x90\\x12\\x33\\x47\\xbc\\xaa\\xdd\\xcb\\xed\\x2f\\xc8\\xc1\\x0f\\xae\\xdb\\xba\\x7a\\x68\\xf3\\xd9\\xe1\\x63\\x2e\\xcf\\x91\\x9e\\x87\\x3e\\x9a\\x1a\\xbf\\x6b\\xc7\\x64\\x74\\x68\\xe2\\x33\\x1b\\x3f\\xe1\\xf7\\x7c\\x64\\xb8\\x6b\\xd7\\x90\\xef\\xbe\\x0a\\x7f\\xb8\\x7a\\xf3\\x90\\xa6\\x65\\x64\\x47\\x97\\x83\\x5c\\x22\\xe1\\x91\\xfe\\xe1\\x2d\\xef\\x9c\\xbe\\xa4\\xd3\\x74\\xee\\x3c\\xb2\\x79\\xe2\\x10\\x59\\xdb\\xdd\\xd5\\xff\\xd2\\xb5\\x8d\\xe6\\x1d\\x47\\x3f\\x3d\\x32\\xbe\\x7f\\x64\\xcd\\x9a\\x91\\xd0\\x6d\\x3b\\x82\\xb5\\xe1\\x40\\xe5\\xfe\\x43\\x26\\x47\\xd9\\x46\\x8e\\xaf\\xeb\\x18\\x20\\x15\\xa5\\x81\\x9d\\x47\\x1e\\xd8\\x45\\x39\\x6d\\xa9\\xb3\\x94\\xd3\\xd6\\x89\\x03\\x88\\x87\\x14\\x7b\\xd7\\x87\\xe5\\x2a\\x3e\\x8b\\x6a\\x93\\x9a\\x82\\x89\\x00\\x73\\xf1\\x68\\x1a\\xda\\x26\\x95\\xab\\xa5\\x8a\\xc7\\x99\\xa4\\x3b\\x68\\xb6\\x96\\xd3\\x81\\x45\\x6b\\x55\\xbd\\xab\\x69\\x59\\x7b\\x88\\x56\\xec\\x01\\xa5\\x55\\xb0\\x4c\\x89\\xef\\x64\\x8f\\x3f\\x16\\x2b\\x8a\\x78\\x6b\\x25\\x9d\\x4d\\x79\\x88\\xb7\\xc2\\x23\\x8b\\x39\\xd0\\x37\\x4d\\xcd\\x42\\xe8\\xdb\\xb1\\x78\\xde\\xb8\\xe2\\xc4\\x9f\\xcc\\xf4\\x92\\x97\\x76\\xca\\xa7\\x0a\\x31\\xe0\\x4e\\x5a\\x47\\x16\\x0e\\x29\\x6e\\x3a\\x79\\x59\\xad\\xe3\\xae\\x73\\x9f\\xd6\\x3e\\x4a\\xd9\\x68\\xcd\\x98\\x5a\\x8c\\x8e\\xd6\\x52\\x84\\x8e\\xd6\\xca\\xe8\\x68\\x09\\xad\\xad\\xc2\\x1f\\x50\\x79\\xc3\\xef\\x89\\x8f\\x46\\xc3\\xbc\\xa5\\x30\\xd2\\x76\\x9d\\x4c\\xec\\x5e\\x8c\\x93\\xa6\\xb9\\x97\\x05\\x79\\xff\\xff\\xea\\x4b\\xc3\\xba\\xa5\\xe8\\x7b\\x36\\x71\\xf2\\x07\\x8b\\xe9\\x4b\\x2e\\xb2\\xa0\\x2e\\xad\\xef\\x1c\\xd5\\x37\\x88\\x3d\\x8b\\xe9\\xdb\\x56\\x44\\xdf\\x76\\xa6\\xef\\x93\\x54\\xdf\\x16\\x06\\x94\\x2e\\x77\\x34\\xc7\\xde\\x8b\\xca\\x6a\\x08\\xb7\\x14\\xad\\x75\\x6a\\x04\\xb7\\xa8\\xe2\\x8f\\x66\\x03\\x38\\x9e\\xe9\\x3e\\x8a\\x1a\\xf8\\xe9\\xae\\xaf\\x67\\xf2\\xb5\\x0f\\x97\\x24\\x13\\xcb\\x55\\xed\\x97\\xd3\\x9e\\x5d\\x69\\x75\\x58\\x76\\x19\\x93\\x52\\x2c\\x94\\xde\\x89\\x4a\\x31\\xc5\\xf2\\xd0\\x7c\\xad\\x19\\xfa\\x80\\xdc\\x68\\x4a\\x2a\\x46\\x69\\x55\\x8d\\x32\\xdf\\x63\\x6c\\xd5\\x07\\xe4\\x4e\\x53\\x52\\xea\\x0c\\xca\\x3d\\x26\\x75\\x2f\\xaa\\xc6\\x5a\\x41\\x94\\x5c\\x31\\xa9\\x53\\x98\\xb7\\x55\\x68\\x69\\x8d\\xd6\\x23\\x4a\\xe5\\x0b\\xac\\xb4\\x7c\\x31\\x2b\\x2d\\x08\\x18\\x6c\\x59\\x93\\x2d\\x18\\x36\\xbb\\x85\\xe1\\x4e\\x65\\x03\\x06\\x21\\x4b\\x13\\x1c\\xce\\x84\\x0e\\x45\\xec\\xc8\\x9d\\x4e\\x07\\x0c\\xef\\x1e\\xcc\\xe4\\x1d\\xef\\x82\\xb1\\x5e\\x95\\xa7\\xf6\\x28\\x0c\\x28\\xc3\\x50\\x61\\x9e\\x1a\\xdd\\xb9\\xee\\x96\\x9c\\x2d\\x0b\\x63\\xa7\\xc9\\xa6\\xb2\\x7c\\x72\\x5a\\xd4\\x56\\xa2\\xe2\\xd2\\xde\\xfd\\x87\\x93\\x89\\xdd\\x0c\\x93\\xa6\\x5d\\xc3\\xf2\\xef\\xbf\\xf5\\xf3\\x4b\\x6f\\x7a\\xbe\\xcd\\xc9\\x31\\x5c\\xdb\\xee\\xc4\\xc9\\x1f\\xa4\\x31\\x6d\\xe9\\x49\\xfd\\xe9\\xe7\\xcf\\xc1\\x00\\x2b\\x86\\x8b\\x3d\\x5f\\x58\\xe4\\xf9\\x62\\x9a\\x1d\\x57\\x6a\\xb2\\xdc\\xc4\\x8e\\xb3\\xd1\\x5c\\xc1\\x8c\\x70\\x4d\\xf5\\xfb\\xb4\\x1c\\x5b\\x17\\xb4\\x4f\\x54\\x59\\x46\\x61\\x80\\x03\\x9e\\x74\\xbf\\xc5\\x4d\\x74\\x3b\\x7b\\x50\\x72\\x87\\xe5\\x32\\xa3\\xca\\x24\\x6b\\xa4\\x2b\\x5b\\xf8\\x90\\x2c\\x98\\x94\\x60\\x58\\xd6\\x28\\xa2\\x2c\\x10\\x74\\xde\\x59\\xa2\\xd1\\x07\\xe4\\x3a\\x93\\x3a\\x68\\x28\\x18\\x69\\xcf\\x96\\x5c\\x57\\x22\\x88\\x72\\x95\\xfb\\x26\\xd2\\x5d\\xb1\\xc8\\x96\\x29\\x70\\xa9\\x60\\xe8\\x9a\\xd6\\xa7\\xd0\\xe2\\x47\\xc6\\xfc\\xd2\\xde\\x41\\x99\\xf7\\xaf\\xa8\\x0c\\x04\\xb9\\x29\\xcd\\xfc\\x6a\\xe3\\x92\\x52\\x69\\x50\\xb2\\x05\\x33\\xe0\\x7b\\x1b\\x05\\xdf\\x9b\\x08\\x9d\\xc2\\x31\\x5f\\x6e\\x77\\x9a\\x03\\x2a\\x4c\\x29\\x28\\x3b\\x4b\\x69\\x3b\\x34\\xcd\\x1b\\x28\\x35\\xb5\\x7e\\x07\\xb2\\xa9\\xb4\\xf5\\x3b\\x44\\xb6\\xd9\\x95\\x73\\xbb\\x4d\\x65\\x0f\\x08\\x0f\\x7f\\x73\\x36\\x0d\\x82\\x31\\x96\\xda\\x6d\\x01\\xc9\\x64\\x9d\\x2f\\x33\\xd9\\x6c\\x81\\x79\\x51\\xf9\\x5f\\x79\\xbf\\x5c\\x79\\x3f\\x5e\\x66\\xb2\\xe5\\xac\\x53\\x17\\x63\\x71\\x63\\xa9\\x5d\\x39\\x2b\\x8f\\x61\\xde\\x58\\x26\\x96\\xd3\\x75\\xea\\x99\\x33\\xba\\x3e\\x5d\\xe5\\xf0\\x97\\x58\\x6a\\x68\\x8c\\xd0\\xd6\\x24\\x88\\xb2\\x13\\xb1\\x9c\\x7d\\x00\\x69\\x6c\\xda\\x4a\\x7c\\x5a\\x5f\\xb4\\xc9\\x17\\xa5\\x1d\\xed\\xa2\\x50\\x8c\\x4f\\x36\\x38\\x7b\\x76\\xe3\\xf9\\x9d\\xee\\xf1\\x58\\xea\\x5f\\x1a\\x7f\\xba\\xf5\\xc8\\xc5\\xad\\xe3\\x7f\\xeb\\xb9\\xfc\\x4f\\xd1\\x3d\\x5f\\xd8\\x35\\x71\\xfe\\x9e\\xa1\\x2f\\xb6\\x6c\\xd8\\xd3\\x15\\xde\\x36\\xd2\\x12\\xba\\x7d\\x5b\\x7b\\xfb\\xce\\x4d\\xed\\xe4\\x3b\\x53\\x57\\x1e\\xbc\\x7d\\xef\\xc6\\xd3\\x3d\\xeb\\xb7\\xc7\\x36\\x46\\xdc\\xe1\\x91\\xee\\x89\\x8e\\xd4\\xdb\\xa9\\xe3\\x73\\xdf\\x7e\\x78\\xe3\\xd0\\x49\\x69\\x6e\\xec\\x13\\xdb\\x3b\\x03\\x1f\\x7a\\x68\\xfb\\xf6\\x4f\\x8e\\x35\\xb6\\x4c\\xdc\\x0f\\x8d\\xca\\x80\\xd3\\x4e\\xc3\\x89\\x36\\x1c\\x29\\x42\\x81\\x93\\x96\\x05\\xe5\\x7a\\x2d\\xed\\xee\\xaa\\xd2\\xaa\\xdb\\x8e\\x16\\x64\\xc2\\x85\\x48\\x80\\xc2\\x1d\\xe5\\x8a\\x36\\x1a\\x3b\\x26\\x74\\x55\\xf5\\xcb\\x5a\\xd4\\xa5\\xe6\\xb2\\x87\\xe2\\x09\\xeb\\x97\\x09\\x62\\xbc\\x22\\xd0\\xa6\\x44\\x9e\\x2d\\x82\\xe4\\x2d\\xca\\x8c\\xe3\\x0a\\x36\\x61\\xf3\\x49\\x72\\x87\\x8a\\x35\\x56\\x0b\\x22\\xe6\\xf8\\x2b\\xf9\\x8d\\x53\\x35\\x6f\\xa9\\x3e\\xf8\\x28\\x1b\\xb7\\x5d\\x57\\x90\\x3c\\xd7\\x5c\\x88\\x3c\\x57\\x78\\xdc\\x76\\x89\\xf0\\x39\\x25\\xea\\x59\\x1c\\x40\\x77\\x4a\\x09\\x79\\x16\\x83\\xd0\\x71\\xce\\x4c\\xcc\\xf3\\x87\\xd1\\x45\\x89\\x68\\x16\\xd7\\x25\\xa1\\x84\\x33\\x8b\\xe9\\xa2\\xe9\\xcd\\xc4\\x33\\xaa\\x2e\\x73\\x6c\\xfc\\xb9\\xb0\\x2e\\xc1\\x42\\xba\\x14\\x1e\\x7f\\x5e\\xb2\\x2e\\xb4\\x50\\x5e\\x5c\\x9d\\x46\\x16\\xa7\\x2c\\xaa\\x51\\x7b\\xa6\\x24\\x4f\\xeb\\x34\\x0d\\x1b\\x9a\\xb1\\x1a\\x47\\x99\\x4e\\xa1\\xb4\\x4e\\xdd\\x1c\\xa5\\xa9\\x54\\x6b\\xe9\\x52\\x65\\x3a\\xf6\\xdc\\x47\\x35\\x6c\\x11\\xe9\\x92\\xfe\\x28\\xd3\\x70\\x0d\\x09\\xc8\\x2d\\x6c\\xec\\x39\\x2a\\x3c\\xa9\\x75\\xd4\\x37\\x36\\xb3\\xb1\\x67\\xd9\\xa5\\x14\\xdc\\x72\\x77\\x88\\x69\\x2c\\x57\\x37\\x0a\\x62\\xdc\\xee\\x53\\xc2\\x37\\xc9\\x2f\\x48\\xee\\x5b\\x8c\\x3e\\xe7\\x77\\x18\\x2d\\x82\\x4b\\x2c\\xda\\x57\\xd4\\xb4\\x28\\x47\\x91\\xdb\\x94\\x9f\\x17\\xdf\\xdd\\x7e\\x13\\x5a\\x11\\x3c\\xb3\\xd7\\x28\\x6c\\xb4\\x86\\xe8\\xcb\\x8c\\xd6\\x2f\\xa8\\x23\\xea\\xe8\\xf8\\xb3\\x73\\xc1\\xf8\\xb3\\x5b\\x4c\\xce\\xdb\\xdd\\x4a\\x24\\x57\\x6d\\xca\\xee\\x96\\x62\\x4d\\xce\\x77\\x1b\\x03\\x7a\\xd6\\x5f\\x14\\x94\\xbb\\x4d\\xea\\x20\\x74\\xb5\\x5d\\xe5\\x8d\\x47\\x84\\x79\\xad\\xa5\\xa9\\x2d\\x5b\\x78\\x17\\xf6\\x99\\x85\\x31\\x5b\\x9e\\x99\\x16\\x04\\x6e\\x37\\xd9\\xec\\x91\\x6c\\x25\\x69\\xb8\\xc9\\x4a\\x53\\xd9\\xa8\\xed\\x26\\x83\\x9d\\xca\\xc4\\x6b\\x8e\\x7c\\x07\\xbb\\x96\\x3b\\xfe\\xc3\\xe1\\x0c\\x92\\xdc\\x61\\xbe\\x12\\x1c\\xdd\\xc1\\x72\\x15\\x5d\\x49\\x5d\\x62\\x44\\x33\\x5d\\x7f\\x27\\x13\\x7d\\x92\\x6d\\x69\\xd9\\xcc\\xb6\\xb4\\xe4\\x5f\\x94\\x84\\x90\\x5c\\xea\\x48\\x4a\\x15\\x21\\x8a\\xea\\x2d\\xe5\\x05\\x51\\x2e\\xb1\\xd3\\xfa\\xdf\\x16\\x71\\x97\\x6b\\x17\\xa8\\x9b\\x7b\\x71\\x46\\xf3\\x4a\\xaa\\xab\\xcb\\xe3\\xa9\\xad\\x26\\x11\\xaf\\x37\\xa6\\x89\\x7a\\xbc\\xca\\xa9\\xcf\\x1b\\xd1\\xf4\\x7e\\xf2\\x93\\xff\\xc7\\x1f\\xa9\\xad\\x6f\\xf0\\x76\\x76\\x68\\xbe\\xe0\\x5b\\x51\\x5b\\xef\\xf1\\x46\\x3a\\xd5\\x3c\\x70\\x9c\\xbb\\xcc\\xfb\\xe0\\x84\\x1b\\x01\\x4c\\x33\\xd2\\x64\\x63\\x3a\\x45\\x6b\\xb3\\x65\\x54\\x85\\x48\\x17\\x9e\\xf9\\x59\\x05\\xa3\\x94\\x51\\x15\\x48\\x47\\xd6\\x7e\\xe1\\x8a\\x5e\\x2b\\xd8\\x8d\\xd5\\x0d\\x6a\\x15\\x23\\x19\\x62\\x90\\x1b\\x05\\x41\\x94\\x6d\\xac\\x79\\x52\\x15\\x50\\x6a\\x5e\\x51\\x2e\\xc9\\x49\\x44\\x3a\\xb2\\x5d\\xa2\\x0e\\xbf\\x94\\xf8\\xa2\\x4d\\x51\\x75\\x60\\xdb\\xac\\xb1\\xb1\\x49\\x05\\xbe\\xd1\\xa1\\x7b\\x2e\\x4c\\x6c\\xda\\x34\\xb2\\xef\\xf6\\x47\\x49\\xdf\\xe1\\x73\\xe3\\x53\\x9b\\x47\\xef\\x9c\\x78\\xf4\\x0b\\x03\\xa4\\xbb\\x23\\x1a\\xdd\\x75\\x5b\\xcb\\x97\\xba\\xd6\\x44\\x77\\x8c\\x04\\x46\\xc8\\xb3\\x33\\x4f\\xdd\\xbf\\xa1\\xe1\\x74\\xd7\\xd9\\x87\\x7e\\x73\\xf4\\xea\\xc9\\xfe\\x96\\xcf\\x47\\x2f\\x9e\\x79\\xf3\\xb1\\x9d\\x9a\\xfe\\xaa\\xf0\\xd6\\x93\\xa9\\x09\\x4f\\x68\\xeb\\xa9\\xd1\\x27\\x76\\xaa\\x63\\x72\\x94\\x09\\xa8\\x7d\\x94\\x8e\\x11\\x6f\\x28\\x4a\\x05\\xf4\\x14\\xa1\\x02\\x36\\x32\\x2a\\x60\\x76\\xac\\x78\\x09\\x64\\x40\\xa5\\x82\\x29\\x4a\\x07\\xfc\\xad\\x52\\xaf\\xdc\\x92\\x10\\xc8\\xb3\\x4a\\xe5\\x0f\\x22\\xbb\\x12\\x9b\\x17\\x27\\x1b\\x7a\\x94\\x8a\\xe4\\x96\\xc2\\x73\\xe9\\x5a\\x24\\x2b\\xff\\x1c\\x1d\\xeb\\xde\\x52\\x54\\xfe\\xa6\\x22\\xf2\\xfb\\x48\\x40\\xe6\\xd4\\x31\\x6f\\xc9\\x21\\x64\\x47\\xbc\\xad\\xa2\\x3a\\xe2\\xbd\\x04\\x6d\\x58\\x95\\x52\\x54\\xa1\\x47\\x58\\x4d\\x72\\x6b\\x95\\xb2\\xd5\\x08\\x38\\xa6\\xd3\\x28\\x1b\\xf7\\x3e\\x52\\x44\\xab\\x82\\x03\\xe0\\x5c\\x69\\x72\\xbe\\x9e\\x4b\\x0f\\x7e\\x2f\\x50\\x76\\x3e\\x6c\\x75\\xdc\\x3c\\xfe\\xdd\\x54\\x2f\\x28\\xba\\x4a\\xcd\\xc2\\x92\\xa9\\x94\\xc5\\x7b\\xc1\\x8b\\x1a\\x61\\xaa\\x60\\xeb\\x61\\x11\\x9b\\x5c\\xbb\\xb9\\x51\\xa1\\x51\\x39\\x86\\xda\\x47\\xe1\\x85\\xbf\\x10\\xc9\\x70\\x79\\x86\\x64\\x18\\xf8\\xb7\\x20\\x19\\x2a\\xae\\xba\\x14\\x9a\\x21\\xf5\\xda\\xa5\\x20\\x0d\\xb5\\xcf\\xe7\\xf8\\x2e\\x65\\x0b\\x6b\\x47\\xe1\\xc4\\x32\\xbc\\x5f\\x4d\\x65\\xb9\\x9a\\x4f\\xc6\\x0d\\x2c\\x02\\x92\\x10\\xa4\\xdb\\xb6\\xa8\\xe8\\xb5\\x8a\\xd2\\xa4\\xac\\x75\\x84\\x42\\x4a\\xa1\\xe9\\x22\\x01\\xd9\\x2c\\xaa\\x9b\\x19\\x50\\x9c\\xb0\\xc6\\x60\\xa3\\xf9\\xcf\\x53\\x2d\\x88\\x71\\xb3\\x43\\x97\\x66\\x0b\\xdf\\xbc\\x81\\x46\\x0e\\x5e\\x98\\x46\\xe3\\x73\\x8f\\x5b\\x0a\\xf1\\x85\\xc7\\x3a\\xd3\\x7c\\x61\\xdd\\x13\\x66\\xaf\\x90\\x2a\\x2d\\xc2\\x18\\xfe\\x2e\\x45\\x0c\\x73\\x2c\\x5d\\x46\\xe1\\x45\\x08\\xbd\\x38\\x9e\\x9f\\x32\\x52\\x5b\\x50\\xea\\x09\\xcb\\x7e\\x63\\x52\\xea\\x0c\\x11\\x69\\x75\\x50\\x6a\\x7a\\x51\\x6e\\x31\\xd1\\xb8\\x27\\x4c\\x02\\xf2\\x4a\\x53\\x72\\xbe\\x7a\\x65\\x58\\x1f\\xa0\\x69\\xd7\\xa7\\x44\\x40\\x4d\\x82\\xf8\\xa4\\x51\\x70\\x34\\xda\\x29\\x54\\x20\\x2c\\xc8\\x4e\\x73\\x8c\\x92\\xfd\\x3b\\x7b\\x62\\x31\\xb9\\x66\\xe5\\x7b\\x4c\\xda\\xe2\\x5e\\xbc\\x94\\x04\\x2f\\xec\\xd0\\x4b\\xf1\\x00\\xdd\\x6d\\x05\\xdb\\xca\\xe2\\x8d\\xdf\\x72\\x7f\\xaf\\x35\\xa3\\x02\\x7e\\x9c\\x61\\xb3\\xc2\\x2c\\x5c\\x52\\x9d\\xbd\\x50\\xc3\\x29\\x0d\\x7b\\xb6\\xd7\\x23\\xc7\\xf6\\x24\\x4b\\x94\\x9a\\x1d\\x5c\\x99\\x52\\xa1\\x27\\xd3\\x88\\xf2\\x4a\\x33\\xdd\\x6c\\x45\\xa9\\xe6\\x75\\x62\\x28\\x24\\x5b\\xca\\x92\\x92\\x31\\x14\\xb7\\x50\\x58\\xa5\\xc5\\x6a\\x08\\x48\\xfa\\xd0\\xfc\\x6a\\x4b\\x99\\x21\\x40\\xb3\\x47\\xbd\\x12\\x38\\x73\\xb4\\xb3\\xd3\\x22\\xd2\\x21\\x5c\\xb9\\xd4\\xac\\xc4\\x45\\x95\\x74\\x9d\\xa4\\xe4\\x8a\\x49\\x25\\x2a\\x49\\xd3\\x66\\x15\\xc3\\x21\\x87\\x33\\x92\\xb3\\xf8\\x27\\xa2\\x18\\x51\\x63\\xb3\\x8b\\xe1\\x50\\x67\\x54\\x50\\x39\\x51\\xa2\\xfc\\xa5\\xc0\\x98\\x97\\xbc\\x94\\xba\\x48\\xbc\\xa9\\x97\\xc9\\x78\\xca\\xef\\x19\\x0d\\x9e\\x4b\\xdc\\x77\\x70\\x4f\\x64\\xd4\\x6c\\xaa\\xf7\\x87\\xeb\\xfd\\x03\\xdd\\x75\\x9a\\x13\\x64\\x90\\xac\\x6f\\xf0\\x77\\xb1\\xe5\\x08\\xbd\\xfe\\x46\\xd2\\x43\\x46\\xdf\\x49\\xfd\\x6a\\x7c\\xad\\xe6\\x25\\xcf\\x9a\\x70\\x7d\\xc7\\xdc\\x73\\x4a\\x39\\x68\\xba\\xf1\\x4f\\xdc\\x1b\\xdc\\x55\\xb8\\xd0\\x89\\x5e\\x48\\x6a\\xaf\\x9f\\x54\\x13\\x96\\x6d\\xba\\xa4\\xd4\\xa8\\x76\\x8d\\x48\\x86\\xb0\\x1c\\xd2\\x25\\xa5\\xee\\x50\\x22\\xaa\\xf6\\x00\\x46\\x95\\xc0\\x7a\\xb5\\x1a\\x27\\x96\\xd1\\xe8\\xb0\\x99\\x04\\xe4\\x68\\x59\\x52\\x32\\x87\\xa4\\xa8\\x55\\x0e\\x3a\\x93\\x4a\\xcb\\x22\\x4a\\x79\\x31\\xb2\\xc9\\xa9\\xba\\x5b\\x33\\x6d\\xdb\\xd7\\x34\\x86\\x1a\\x9d\\x31\\x39\\xa8\\x54\\x09\\xcb\\x63\\xd2\\x0a\\xe1\\x4a\\x89\\xc1\\x56\\x51\\xe5\\xf3\\xb3\\x28\\xa4\\x3c\\x06\\xd9\\x56\\x21\\x88\\xb2\\xa3\\x8a\\xc2\\x9c\\xe5\\xf2\\xe5\\xb1\\x98\\x14\\x15\\xe3\\x70\\xd3\\x10\\x3c\\x24\\x48\\x41\\x3a\\xdd\\x2e\\xa7\\x3f\\xa0\\x93\\x0e\\xa7\\x64\\x7b\\x05\\x7d\\xba\\x05\\x78\\x14\\xca\\xdc\\x62\\x99\\x51\\xeb\\x66\\x23\\x2a\\xa6\\xf0\\x87\\x66\\x7a\\xe7\\x06\\x36\\x9d\\x38\\xf9\\xc7\\xa9\\x16\\x4d\\xd5\\x8a\\x75\\xe1\\xe3\\x43\\x43\\xfb\\x4f\\x9f\\xde\\x3d\\x71\\x28\\xbc\\x77\\xf3\\xca\\xb9\\x3b\\xb7\\xfa\\x7b\\x74\\x26\\xbd\\x18\\xf3\\x7b\\xfb\\x63\\x6e\\xf2\\x59\\xb2\\xf9\\xc3\\xe3\\x23\\x1f\\x20\\x3f\\x7e\\xe0\\xea\\xe1\\xf0\\xe4\\xe4\\xd3\\x57\\x4f\\xcc\\x3c\\x34\\xec\\xde\\xb8\\x79\\x66\\x6c\\x34\\xb0\\xff\\xda\\xa5\\x67\\xaf\\x05\\xbc\\x3a\\xff\\xd0\\xa9\\xe8\\xd1\\x63\\x66\\x5f\\xb8\\x71\\xf4\\xa4\\xc5\\xf6\\xc8\\x9d\\xa7\\xe6\\x68\\x5d\\xa3\\xce\\x27\\xda\\x04\\x3d\\x9d\\xe1\\xb3\\x73\\xe1\\x8c\\x22\\xc9\\x16\\x94\\x5c\\x61\\xd9\\x64\\x4c\\x4a\\x95\\x21\\x1a\\x05\\x18\\x5e\\x94\\xad\\xa6\\xa4\\x64\\x65\\x3b\\x5e\\x8a\\xc9\\x79\\x87\\xae\\x44\\x1f\\x90\\x6b\\x4d\\x6a\\x30\\x60\\x35\\xa8\\x0c\\x56\\x87\\x3a\\xe5\\x48\\xae\\xd5\\x09\\xa2\\x5c\\xe9\\x8a\\x15\\x9e\\x85\\x54\\x74\\x26\\x55\\x76\\x6e\\xd2\\x6b\\x85\\x97\\xb2\\xe4\\xce\\x55\\xfa\\x5f\\x37\\x4f\\x95\\x22\\x44\\xe4\\x45\\x8e\\xd7\\xce\\x41\\x87\\x00\\x24\\x3e\\x28\\xe9\\xc2\\x09\\x0d\\xc3\\x7e\\x64\\x76\\x9e\\x32\\xa4\\x77\\x9e\\xd2\\xf0\\x6c\\xe7\\x29\\xd6\\x69\\x47\\x44\\xb5\\xd2\\x5e\\xd0\\x4f\\x47\\x70\\x95\\xdf\\xcc\\xcd\\x68\\xa7\\x51\\x81\\x4e\\x48\\xd6\\xa0\\x5c\\xa2\\x4d\\x4a\\xe5\\x41\\x59\\xa3\\xcd\\x21\\x8b\\x96\\x58\\xe9\\x70\\x27\\xdd\\x5a\\xa6\\x5c\\x90\\xca\\x62\\x92\\x46\\x8c\\x6b\\xd3\\x74\\xd1\\x82\\x4d\\xb1\\xab\\xc5\\x5a\\x5a\\x85\\xfb\\x34\\x72\\xf9\\x4b\\xc8\\x05\\x2d\\xbd\\xd7\\xcf\\xf8\\x33\\x39\\x9f\\xf1\\x58\\xf0\\x99\\x3e\\xf7\\x33\\x7d\\xf6\\x33\\x72\\x44\\xf3\\xba\\xe6\\xac\\xb6\\x1a\\x56\\x2c\\xa3\\x6d\\x11\\x0d\\xdd\\xe1\\x2b\\xbd\\x39\\x84\\x4e\\x64\\xfb\\xae\\x42\\x57\\xaa\\xf6\\x97\\x52\\x4a\\x87\\xa2\\x7d\\xb9\\x9d\\x76\\x97\\x7b\\x1a\\x9a\\xc8\\x91\\x97\\x86\\x62\\xb7\\xb9\\x7d\\xee\\xfe\\x48\\x64\\x9c\\x3b\\x77\\xf1\\xe5\\xd5\\xe1\\xe3\\x3e\\xbb\\xc7\\x1d\\xa8\\x6e\\x1f\\x98\\x54\\x9e\\x31\\xaa\\x79\\x5d\\x73\\x38\\xfd\\x0c\\x6b\\x30\\x51\\x9a\\x7d\\x86\\xba\\x63\\x7f\\x9c\\x33\\x2b\\xcf\\xe0\\xf4\\xd9\\x67\\xe4\\x6d\\xc7\\x4f\\x77\\xe0\\xf7\\xd7\\xd1\\x1d\\xf8\\xb9\\x96\\xc8\\x9c\\xcf\\xee\\x75\\xfb\\xd9\\xbe\\xfb\\x54\\x8f\\xd1\\xd4\\x13\\x9a\\xc3\\xf8\\xf1\\x7b\\x7e\\x06\\xdb\\xe5\\x3f\\x7f\\x6f\\x7f\\x5a\\xdf\\x5f\\xd0\\xbc\\xce\\x4d\\x53\\x3d\\xdc\\xd8\\xa8\\x58\\x4b\\xaa\\x0f\\x33\\x83\\x49\\xb6\\x50\\x9a\\xb8\\xb4\\xd0\\x66\\x92\\x4e\\xdd\\x2c\\xdb\\x29\\x26\\xe3\\x4e\\x41\\x79\\xd7\\x59\\x63\\x08\\x50\\x0e\\x93\\xa0\\xe4\\x2d\\x0d\\xa7\\xb6\\xe4\\xf2\\x6c\\xea\\xcd\\xbb\\xbe\\xf0\\xd2\\x60\\xec\\x36\\x77\\xa0\\x7e\\x30\\x12\\x19\\x23\\x4f\\xbc\\x34\\x10\\x1b\\x61\\x17\\x19\\x7b\\xbb\\x3d\\xd4\\xde\\x23\\x0b\\x2f\\xa9\\xdc\\xc7\\x35\\xaf\\x73\\x83\\x59\\xb9\\xad\\x41\\xc9\\x1d\\x66\\x06\\xa2\\x0b\\x6f\\x1a\\x0a\\xd8\\x48\\x32\\xab\\xf0\\x9b\\x7a\\x31\\x19\\xb7\\x2b\\xf5\\x0f\\xec\\x95\\x4c\\x6e\\xbb\\x52\\xc7\\x08\\x6a\\x0f\\xb4\\x2d\\xcf\\x86\\xde\\xbc\\xeb\\xe3\\x5d\\xc3\\x1e\\xaf\\x6b\\x6d\\x24\\xfa\\x47\\x2f\\x91\\x3b\\xba\\x86\\xeb\\xfd\\xea\\x39\\x4b\\x42\\x8f\\x8f\\x9a\\xf7\\xe2\\xcb\\x3d\\x0b\\x2f\\x15\\x99\\x53\\x4f\\x70\\x83\\x34\\x3d\\xff\\x10\\x32\\x53\\x37\\x60\\x32\\xa7\\xcf\\x99\\x4b\\x78\\x9b\\x32\\x32\\xe7\\x78\\xc8\\xc5\\x97\\x41\\xc8\\x24\\x49\\x68\\xae\\x72\\xc6\\x5c\\xee\\x8d\\x49\\xe5\\xde\\x98\\x16\\x70\\x6f\\x4c\\x2a\\xf7\\xc6\\x54\\x84\\x7b\\x33\\xb9\\x67\\xa0\\x3f\\x1a\\x9e\\x1a\\x1a\\x9a\\xd2\\x4c\\x0e\\xed\\x0c\\x87\\x07\\x07\\x77\\xee\\xa2\\x65\\xbd\\xf9\\x46\\x92\\xfb\\x16\\x7e\\x4a\\xb9\\x88\\x4d\\x18\\x53\\xd9\\x37\\xb2\\xb3\\x31\\x1c\\x66\\x6c\\x1d\\xd9\\x5a\\x1b\\x0a\\xa9\\x44\\x9c\\x34\\x6c\\xc7\\x97\\x03\\xdb\\x61\\xb4\\xc4\\x84\\x5d\\xbd\\xb2\\xd3\\x5d\\xc5\\x13\\x6e\\x95\\xb9\\xb0\\x8c\\x4a\\x12\\x2d\\x50\\xa4\\x17\\xb8\\x30\\x0f\\xb5\\x07\\x7d\\x9e\\xc1\\x70\\xa4\\x9f\\x6c\\xcb\\x50\\x7a\\xc8\\xf6\\xe1\\x20\\x7d\\x37\\x3c\\x38\\x19\\x1c\\xf2\\xf8\\x5a\\x82\\x83\\x83\\xc1\\xf6\\x41\\x8f\\x37\\x18\\x1c\\xec\\x6f\\x6f\\x1f\\xa4\\xef\\xf4\\x83\\x10\\x3f\\x8e\\x6b\\xae\\x51\\x56\\x8c\\x03\\xe9\\xe2\\x5c\\x6b\\x42\\x29\\x2b\\xce\\xdb\\xda\\x89\\x0a\\xc8\\x23\\x7e\\x12\\xdd\\xf4\\x16\\xd1\\xbd\\x2f\\x4b\\xc6\\xa3\\x79\\x3d\\xfb\\xfb\\xba\\x02\\xbf\\x97\\xb5\\x4a\\xed\\xcf\\x2b\\x29\\xcd\\x00\\x34\\xc4\\x4f\\x74\\xf9\\xdc\\x19\\xa5\\x5c\\xec\\xbf\\x91\\xe4\\xae\\x68\\x75\\x68\\xc7\\x41\\xc4\\x9b\\xe9\\x3c\\x7e\\x5d\\x32\\x6e\\x51\\xe2\\x33\\xa7\\x36\\x99\\x00\\x69\\xb6\\x94\\x05\\x24\\x77\\x98\\x6e\\xa6\\xe8\\x09\\x25\\x0c\\x7a\\xfa\\x46\\x4d\\x98\\xae\\xd9\\xab\\x0a\\xd1\\x59\\x87\\xda\\x17\\xa5\\xf6\\x90\\xec\\x2a\\x53\\x22\\x1a\\xc9\\x65\\x95\\xaa\\x5c\\x2f\\x0a\\xb2\\x51\\x09\\xdc\\x82\\x72\\x55\\x19\\x9d\\x7e\\x08\\x19\\x3e\\x41\\x94\\xfc\\x31\\xd9\\xa9\\x54\\xaf\\xa2\\x4a\\x59\\xe9\\x68\\x8a\\x74\\x44\\x3d\\xd1\\xf0\\x2a\\x2e\\xdc\\xa9\\xee\\x66\\xa1\\x2b\\x71\\x97\\xb8\\x75\\xf6\\x5a\\xe2\\x2e\\x71\\x2b\\x41\\x3e\\xdb\\x70\\xce\\xd7\\x5f\\x35\\xaa\\xd1\\x1d\\xac\\xda\\x53\\xb9\\xf3\\xc4\\xe7\\x86\\xff\\xd3\\xfe\\xb0\\xce\\xdc\\xb9\\x79\\xdd\\xe1\\xaf\\x35\\x90\\x7f\\x69\\x49\\xb9\\x79\\x72\\x31\\x98\\xfa\\x5c\\xed\\x37\\xee\\x3f\\x3e\\xd9\\x75\\xec\\xcf\\x27\\xce\\x1f\\x1f\\xb7\\x90\\x6b\\x47\\x8d\\x4e\\x53\\x57\\xf7\\xd1\\xa3\\x4f\\x4c\\x07\\xc9\\xcc\\xa7\\xf8\\x40\\x8b\\xff\\x4f\\x2f\\x1e\\xf5\\xc4\\x9c\\xed\\x47\\x2f\\x49\\x63\\x53\\xd3\\xa4\\xfb\\xe8\\xe5\\x59\\xb5\\x0d\\xe3\\xd5\\x7c\\x9a\\xfb\\x5b\\xad\\x9d\\xf2\\x08\\xe6\\xa0\\xb4\\x58\\xb8\\x70\\x82\\x50\\x46\\x8a\\x6c\\x30\\x85\\x32\\x64\\x36\\x9d\\x21\\x20\\xeb\\xcd\\xa1\\x10\\xdd\\xa4\\x43\\xf7\\x62\\x42\\xab\\x72\\x67\\x0a\\xee\\x26\\x2b\\x69\\x29\\x46\\x2a\\x61\\x57\\xa7\\x1d\\x19\\x43\\x8a\\xab\\x59\\xb2\\x4b\\xf9\\x1d\\x24\\x20\\x5b\\xec\\xea\\x8c\\x44\\xb3\\xa0\\xae\\xf3\\xb5\\xd1\\x05\\x89\\x1e\\x81\\x08\\xe1\\x6a\\xba\\xb9\\x76\\x49\\x90\\x08\\x5e\\xf2\\xcc\\x53\\x5b\\xc9\\xa6\\xa1\\x47\\xce\\xad\\x1d\\x9f\\x73\\x1d\\xe2\\xbf\\xf5\\xbe\\xf7\\xbd\\xfb\\x9c\\xa6\\xe3\\xdd\\xe7\\x34\\xf7\\xa7\\x7e\\x4e\\x96\\xbd\\x3b\\x47\\xfe\\xdb\\xdf\\x71\\x2f\\xa7\\xd6\\x81\\xd0\\xce\\xb5\\xc7\\xb9\\xc7\\xc1\\x21\\xa2\\x8e\\x94\\x24\\x88\\x11\\x25\\x7c\\x20\\xf7\\x3c\\x4d\\x0c\\x53\\x37\\xad\\x4c\\xef\\x5d\\xa9\\x82\\xc3\\xda\\x05\\xb7\\xa0\\xdc\\xe0\\x9d\\xad\\x6a\\x9d\\x09\\x10\\xcd\\x0b\\x9f\\x7e\\xe4\\x85\\x07\\x3f\\x6c\\xe9\\xfe\\x1d\\xea\\xf5\\xca\\xbb\\xf8\\xc1\\x89\\xc7\\xbe\\x9b\\x3d\\xa6\\xce\\xea\\xcf\\xe8\\xf6\\x02\\xd0\\x43\\x03\\xf5\\x8f\\x00\\xba\\xb9\\xd4\\x01\\xc0\\x50\\x07\\xdc\\xb8\\xa1\\x3f\\xa3\\x4a\\x96\\xf3\\xf7\\x9a\\xe6\\x3a\\xfa\\x79\\xc5\\xf4\\x7f\\x01\\xf0\\xb4\\x1b\\x95\\x1c\\xe2\\x81\\x7f\\xe4\\x81\\x30\\x0f\\xcc\\xf1\\x40\\x8c\\x07\\x86\\x79\\x90\\x8b\\x3c\\x48\\x2d\\x0f\\x3c\\xc2\\x03\\x63\\x3c\\xb0\\x95\\x07\\x19\\xe5\\x81\\x33\\x3c\\xc8\\x0c\\x0f\\x9c\\xe2\\x81\\x29\\x1e\\x48\\xf0\\xc0\\x59\\x1e\\x38\\xcd\\x03\\xdb\\xd9\\xfb\\x9f\\xe0\\x81\\x0b\\xec\\x7e\\x0f\\xa9\\xdf\\xa7\\xbf\\x1d\\x52\\xef\\x83\\x51\\xf6\\xbd\\x5e\\x1e\\xa8\\x67\\xbf\\x53\\x9e\\xa1\\xdc\\xf7\\x18\\x0f\\x9c\\x57\\x65\\xa0\\xd7\\x17\\x79\\x60\\x27\\x0f\\x8c\\xf3\\xc0\\x03\\xec\\x7b\\xca\\x73\\xbb\\xd8\\x77\\x95\\xe3\\x61\\x1e\\xd8\\xcb\\xee\\x37\\xc5\\x74\\xf1\\xb0\\xef\\xc6\\xd4\\xf7\\x88\\x89\\x3d\\xf3\\x12\\x0f\\x5c\\x53\\x65\\xa1\\xfa\\xed\\x64\\x72\\x1e\\x66\\xb2\\x29\\xd7\\x27\\x79\\x60\\x23\\x0f\\x7c\\x9a\\x07\\xbe\\xcf\\xe4\\x7b\\x80\\xe9\\xb4\\x51\\xd5\\x89\\xea\\x30\\xc7\\xe4\\xfa\\x1e\\x0f\\x1c\\x61\\xdf\\x3f\\xc1\\x3e\\x73\\xf3\\xc0\\x1d\\x3c\\xd0\\xc2\\x64\\xda\\xcf\\x83\\x3c\\xcd\\x03\\x4f\\x33\\xb9\\xd2\\xb6\\x57\\xee\\xbd\\x89\\xdd\\x73\\x98\\x7d\\xe7\\x7e\\x1e\\xf8\\x1f\\x3c\\xa0\\xc8\\xf7\\x18\\xb3\\xe7\\x55\\xd5\\xf6\\xf4\\xbd\\x77\\x78\\xe0\\x2d\\x26\\xef\\x3f\\xaa\\xdf\\x25\\x8a\\x6c\\xed\\xaa\\x8e\\xd4\\xde\\x6b\\x78\\xe0\\xed\\x9c\\xdf\\x1b\\xd9\\xcb\\xc9\\xae\\xeb\\x8b\\xbc\\xf4\\x4c\\xbe\\x63\\x79\\xaf\\x8b\\x79\\xaf\\x9e\\x9c\\x74\\xc8\\x7f\\x5d\\x66\\xc7\\xa9\\xbc\\x57\\x8c\\xdd\\xeb\\x10\\xb3\\x73\\xa1\\x97\\x9d\\xa5\\x45\\xfe\\xfb\\xdf\\xcf\\x7b\\x8d\\xe6\\xa4\\x43\\xfe\\xeb\\x0c\\x3b\\x9e\\xc8\\x7b\\xb5\\xb0\\x34\\x53\\x8e\\x22\\x0f\\x98\\x54\\x99\\x88\\x72\\x7e\\x95\\x8b\\x00\\x4a\\x8e\\x4a\\x1f\\x35\\x1e\\x80\\x9c\\x03\\x88\\xa0\\xbe\\xf0\\x7d\\x80\\x28\\x41\\xf4\\x07\\x69\\xde\\x39\\x93\\x7e\\x69\\xeb\\x70\\xc6\\x50\\x47\\xf3\\xc5\\x11\\xd5\\xcf\\xa9\\xaf\\x2b\\xe9\\x71\\x5c\\x7d\\x91\\x49\\x1e\\x30\\x2b\\xbf\\xe5\\x41\\xfc\\xca\\x4b\\xb9\\x2f\\x0f\\x9a\\x17\\xbd\\xdc\\x9f\\xd1\\xbc\\xd9\\xcc\\xfe\\x7d\\x0c\\x3f\\x22\\x09\\xcd\\x76\\xce\\xcc\\x3d\\xc1\\xfd\\x0d\\x6f\\xe5\\x57\\xf3\\xd3\\xfc\\x25\\xfe\\x17\\xfc\\x1b\\xda\\x26\\x6d\\xa7\\xf6\\x8b\\xda\\x67\\x74\\x21\\xdd\\x13\\xba\\x37\\x4a\\x0e\\x96\\xbc\\xa5\\x6f\\xd2\\x3f\\x6d\\x58\\x65\\xb8\\xcf\\xf0\\x73\\xc3\\x75\\xa3\\xd9\\xd8\\x60\\xbc\\x50\\xba\\xa2\\x74\\x6f\\xe9\\x4f\\x4c\\x6d\\xa6\\xbb\\x4c\\x97\\x4d\\xaf\\x96\\x8d\\x97\\x5d\\x2a\\x7b\\xd5\\x1c\\x32\\x1f\\x30\\x9f\\x33\\xff\\xc2\\x52\\x67\\xb9\\xd7\\xf2\\x75\\x6b\\xa7\\xf5\\x33\\x82\\x55\\x58\\x2d\\x3c\\x2c\\x7c\\x5b\\xec\\x16\\x0f\\x88\\x5f\\x14\\x7f\\x28\\xbe\\x6d\\xb3\\xda\\x56\\xda\\xa6\\x6c\\xf7\\xda\\xbe\\x62\\x6f\\xb0\\x9f\\xb5\\xbf\\x56\\xbe\\xbd\\xfc\\x87\\x8e\\x66\\xa7\\xc9\\x79\\x87\\xf3\\x4a\\x45\\x4d\\xc5\\x78\\xc5\\x83\\x15\\x6f\\x55\\xae\\xae\\x7c\\xac\\x0a\\x55\\xdb\\xab\\x2e\\x54\\x37\\x56\\x3f\\x5e\\xfd\\x56\\x4d\\x73\\xcd\\xf3\\xb5\\xa8\\xdd\\x5a\\xfb\\x70\\xed\\x6f\\xeb\\x4c\\x75\\xb3\\x75\\x4f\\xd5\\x3d\\x55\\x6f\\xaa\\x7f\\xde\\x75\\xcd\\xdd\\xef\\xbe\\xe4\\x7e\\xbe\\xe1\\xee\\x86\\xa7\\x3d\\xdb\\x3d\\xbf\\xf0\\xa4\\x1a\\x9b\\x1a\\x57\\x35\\x5e\\xf7\\x1a\\xbd\\x93\\xde\\xaf\\x34\\x99\\x9a\\xee\\x6d\\xfa\\xa2\\xcf\\xe1\\x1b\\xf7\\x7d\\xdc\\xf7\\x13\\xdf\\x9b\\xcb\\x36\\x2d\\x9b\\x5d\\x76\\xdd\\xff\\x91\\xe5\\x23\\xcb\\x7f\\x14\\x30\\x05\\x06\\x03\\xf7\\x05\\x5e\\x6d\\xde\\xdc\\xfc\\xa3\\x96\\x35\\x2d\\x7f\\xd5\\x6a\\x6c\\xdd\\xd8\\x7a\\x2e\\x28\\x06\\xc7\\x82\\x67\\x83\\xaf\\xb4\\x6d\\x6e\\xbb\\xd6\\xbe\\xa2\\xfd\\x7c\\x48\\x1f\\x9a\\x0d\\x1b\\xc3\\x17\\xc2\\xcf\\x74\\xf4\\x77\\x3c\\xd6\\xf1\\x66\\x64\\x22\\xf2\\x6a\\x67\\x4d\\xe7\\x6c\\xe7\\x9b\\xd1\\xbb\\xa3\\x6f\\xae\\xb8\\x37\\xd6\\x11\\xfb\\xd5\\x4a\\xa9\\x6b\\x6f\\xd7\\xeb\\xdd\\xd3\\xdd\\xff\\xd0\\x33\\xb9\\x4a\\xbf\\x6a\\x68\\xd5\\x83\\xab\\x9e\\xef\\x5d\\xd9\\xfb\\xf6\\xea\\x8f\\xae\\x7e\\xa5\\x6f\\xa8\\x2f\\xbe\\x66\\x78\\xcd\\xab\\x6b\\x3b\\xd6\\x5e\\xee\\x37\\xf5\\xef\\xeb\\x7f\\x71\\x60\\xe7\\xc0\\x77\\x07\\xdb\\x06\\x7f\\xb8\\x6e\\x62\\xc8\\x34\\x74\\xcf\\xd0\\x85\\xa1\\xd7\\x8a\\xfc\\x7b\\x63\\xbd\\x66\\xbd\\x75\\x7d\\xdd\\xfa\\xe6\\xf5\\x93\\xeb\\x3f\\xb3\\xfe\\x9b\\xc3\\x75\\xc3\\xf7\\x0c\\xff\\x68\\x83\\x66\\xc3\\xd4\\x86\\xa9\\x0d\\x1f\\xdf\\x70\\x69\\xc3\\xa5\\x91\\xe6\\x91\\xcf\\x8c\\x3c\\xc5\\xca\\xf0\\xd7\\x70\\x07\\xb4\\x50\\x6b\\x3a\\x02\\x0d\\x1c\\xca\\xdb\\x64\\x13\\x2b\\x8b\\xad\\xf8\\x2b\\x70\\x20\\xbc\\x01\\xc0\\x2b\\x34\\xc2\\x52\\xce\\x09\\x1c\\x78\\x85\\x9d\\x6b\\x60\\xc6\\x5b\\xec\\x9c\\xc3\\xbd\\x44\\xc7\\xce\\x79\\x34\\x91\\xfb\\xd8\\xb9\\x16\\x55\\xe4\\x12\\x3b\\xd7\\xa1\\x89\\x3c\\xc3\\xce\\xf5\\x30\\x91\\x5f\\xb1\\x73\\x03\\x3a\\xc9\\x9b\\xec\\xdc\\x88\\x37\\x35\\xcd\\xec\\xbc\\x14\\x35\\x5c\\x03\\x3b\\x37\\xa1\\x86\\x5b\\xc5\\xce\\xcb\\x88\\x8b\\x9b\\x60\\xe7\\x66\\x74\\xf0\\x1f\\x61\\xe7\\xdf\\x86\\x83\\xbf\\xcc\\xce\\xbf\\x83\\x36\\xfe\\x19\\xac\\xc5\\x0c\\x0e\\xe2\\x18\\xee\\xc2\\x1e\\xec\\xc6\\x34\\x66\\xe1\\xc2\\x32\\xec\\x80\\x1f\\x2e\\x84\\xd0\\x86\\x36\\x74\\xa2\\x85\\x9e\\xb5\\x23\\x84\\x66\\xb8\\x30\\x8a\\x6d\\x38\\x88\\x69\\xb8\\x30\\x82\\x5d\\xb8\\x1b\\x7b\\xb0\\x0b\\x07\\xe8\\xaf\\xa6\\xb0\\x07\\x77\\xe1\\x30\\x66\\x71\\x00\\xdb\\xb0\\x1f\\xbb\\xd0\\x8a\\x7d\\xd8\\xb6\\xe0\\x9d\\xd5\\xd8\\x8d\\xfd\\xd8\\x86\\x3d\\xd8\\x87\\x56\\xec\\xc0\\x0c\\xf6\\xc3\\x4f\\xef\\xbb\\x98\\x24\\xed\\x68\\xcf\\x93\\x64\\x2d\\xfd\\xf6\\x2e\\x6c\\xc3\\x3e\\xf6\\xdd\\xec\\x75\\x2b\\x66\\x70\\x17\\x76\\xc3\\x8f\\xf5\\x38\\x40\\x9f\\x73\\x00\\x87\\x31\\x43\\xe5\\x99\\xc5\\x36\\x8c\\x62\\x17\\x76\\xe3\\x08\\xbd\\xbe\\x2b\\xa3\\x53\\xae\\x46\\xcd\\xd8\\x40\\xf5\\x51\\x24\\xdd\\x87\\x31\\xdc\\x89\\x6d\\xd8\\x81\\x69\\xfa\\x8d\\x62\\xcf\\x5a\\x09\\x57\\x91\\xe7\\xb9\\xf2\\x9e\\xb8\\x32\\xa3\\x55\\x68\\x89\\xbf\\x18\\xc7\\x2e\\x6a\\xdd\\x3d\\xf4\\x9b\\x2e\\xb4\\xa3\\x95\\xfe\\x3e\\x5c\\xe4\\xf7\\x2d\\x79\\xbf\\xcf\\xb5\\x56\\xe1\\x34\\x54\\x6c\\x9a\\xab\\xb3\\x2b\\x4f\\xeb\\x85\\xf7\\x73\\x61\\x07\\xbb\\xdf\\x2c\\x76\\x61\\x27\\x5c\\xd8\\x8e\\x63\\xb7\\xf0\\x8f\\x23\\x54\\xf6\\x03\\xd8\\x0d\\x17\\xa6\\xb1\\x07\\x87\\xe1\\xc2\\x0c\\x8e\\xd2\\xcf\\xde\\x8f\\x83\\xf4\\xb9\\x33\\x68\\xc1\\x76\\xea\\x31\\xea\\x1d\\x67\\x31\\x43\\x35\\x52\\xbe\\xbb\\x0d\\x07\\xe8\\x7b\\x83\\x54\\xd3\\x59\\x7a\\x54\\xac\\xae\\x78\\x99\\x0b\\x6b\\xe8\\xf7\\x76\\x16\\x95\\xea\\x56\\x7a\\xb9\\x30\\x45\\xef\\xb5\\xd0\\xa3\\xd2\\xa9\\x7a\\x94\\xfe\\x6b\\x2d\\x98\\xe2\\xe9\\xcf\\xf6\\xe5\\x68\\x9a\\xf6\\xea\\xb1\\x8c\\x96\\x69\\x89\\x15\\x3d\\x67\\x30\\x85\\x59\\x1c\\xa5\\x16\\xdc\\x05\\x17\\xfb\\xc6\\x3e\\xec\\xc1\\x0e\\xfa\\xeb\\xb4\\xe6\\x47\\xa8\\xb6\\xbb\\xa8\\x54\\xb3\\x54\\x4e\\xe5\\xd7\\xeb\\x31\\x02\\x17\\x6e\\xc7\\x41\\x66\\xd3\\xec\\x9d\\x47\\x16\\xdc\\x41\\x49\\xc9\\x42\\xfe\\xd2\\x4e\\x6d\\x95\\x95\\x6c\\xe1\\x73\\xd3\\xd2\\x6c\\xc3\\xdd\\x2c\\x87\\x6e\\xc3\\x76\\xaa\\x9b\\x0b\\x47\\xb1\\x87\\xca\\xe1\\xa2\\x9e\\x39\\x88\\x3e\\xbc\\x8f\\x9e\\xcf\\x52\\x4f\\x56\\x72\\xeb\\x2c\\x0e\\x62\\x25\\x82\\x08\\xe2\\x30\\x4d\\x83\\x3d\\x38\\x88\\x59\\x1c\\x46\\x2b\\x95\\x21\\x6b\\xb3\\x20\\x6e\\xc7\\x20\\x46\\xfe\\x55\\xbf\\xf9\\x00\\x76\\x61\\x3b\\x4d\\x2d\\x55\\x6b\\x35\\x0f\\x0c\\xd2\\x5f\\xba\\xd0\\x87\\x83\\xd4\\x5e\\x21\\x44\\xe0\\xa2\\x79\\x63\\x25\\xda\\x10\\x62\\xff\\xa7\\xf3\\x5b\\x07\\x2d\\xcd\\xe9\\x5f\\xea\\x1c\\xa6\\x50\\xe8\\xef\\x35\\x25\\x7c\\x27\\x1c\\x38\\xf0\\xd0\\x42\\x87\\x12\\xe8\\xa1\\x94\\xbc\\xa5\\x30\\xa1\\x0c\\x66\\x58\\x60\\x85\\x00\\x11\\x36\\xd8\\x51\\x0e\\x07\\x9c\\xa8\\x40\\x25\\xaa\\x50\\x8d\\x1a\\xd4\\xa2\\x0e\\xf5\\x70\\xc1\\x8d\\x06\\x78\\xd0\\x08\\x2f\\x9a\\xe0\\xc3\\x32\\xf8\\xb1\\x1c\\x01\\x34\\xa3\\x05\\xad\\x08\\xb2\\x9c\\x1f\\x46\\x07\\x22\\xe8\\x44\\x14\\x2b\\x10\\xc3\\x4a\\x74\\xa1\\x1b\\x3d\\x58\\x85\\x5e\\xac\\x46\\x1f\\xd6\\x60\\x2d\\xfa\\x31\\x80\\x41\\xac\\xc3\\x10\\xd6\\x63\\x18\\x1b\\x30\\x82\\xdb\\xb0\\x11\\xb7\\x63\\x13\\xde\\x87\\x51\\xbc\\x1f\\x63\\xf8\\x23\\x8c\\xe3\\x03\\xd8\\x8c\\x2d\\x98\\xc0\\x07\\xb1\\x15\\x1f\\xc2\\x24\\x3e\\x8c\\x3b\\xb0\\x8d\\xf0\\xf8\\x33\\xdc\\x87\\xfb\\xf1\\x97\\x38\\x8b\\xff\\x89\\x8f\\xe3\\x61\\x3c\\x84\\x2f\\xe0\\x2f\\xf0\\x38\\xd1\\xe2\\x93\\xf8\\x1b\\x9c\\xc2\\x23\\x44\\x47\\x4a\\x70\\x9a\\xe8\\xf1\\x20\\xbe\\x85\\xbf\\x23\\x06\\x7c\\x11\\x97\\xf0\\x3b\\xbc\\x81\\x37\\x71\\x01\\xff\\x05\\xdf\\xc1\\x5f\\xe3\\x32\\xb6\\x63\\x07\\x3e\\x83\\x9d\\xf8\\x1e\\x76\\xe1\\xdb\\xf8\\x2e\\x7e\\x80\\xe7\\xf0\\x7d\\x3c\\x8f\\x24\\xa6\\xf0\\x63\\xfc\\x10\\x2f\\xe0\\xbf\\x62\\x37\\x5e\\xc7\\x19\\xbc\\x88\\x9f\\xe0\\xa7\\x98\\xc6\\x3f\\xe3\\xd7\\xf8\\x04\\xf6\\x62\\x0f\\xee\\xc4\\x7e\\xec\\xc3\\x01\\x9c\\xc7\\x0c\\x0e\\xd1\\xf4\\x39\\x8c\\x23\\x98\\xc5\\xdd\\x38\\x8a\\x5f\\xe1\\x1e\\x7c\\x04\\xc7\\x30\\x87\\xe3\\xf8\\x28\\x9e\\xc2\\x97\\x71\\x02\\xf7\\xe2\\x63\\x38\\x89\\xeb\\xf8\\x0d\\xae\\x42\\x82\\x8c\\xff\\x8e\\x9f\\xe3\\x25\\x62\\x24\\xa5\\xc4\\x44\\xca\\x88\\x99\\x58\\x88\\x95\\x08\\x44\\x24\\x36\\x62\\x27\\xe5\\xc4\\x41\\x9c\\x88\\x63\\x1e\\x57\\xf0\\x55\\x3c\\x83\\x04\\x9e\\xc4\\xb3\\x78\\x00\\xff\\x99\\x54\\xe0\\x1a\\xbe\\x46\\x2a\\x49\\x15\\x3e\\x45\\xaa\\x75\\xbb\\xf7\\x1d\\x3b\\x38\\xdd\\x5e\\x72\\xe4\\xc0\\x9e\\xb6\\xb6\\xb6\\x7e\\xf5\\xd8\\xd7\\xc6\\x8e\\xec\\x7a\\x4d\\x88\\x1d\\xc3\\xec\\x18\\x61\\xc7\\x98\\x72\\x0c\\xb5\\xb5\\xb5\\xb1\\x63\\x3b\\x3b\\x86\\xd8\\x31\\xcc\\x8e\\x1d\\xec\\x18\\x61\\xc7\\x4e\\x76\\x8c\\xb2\\xe3\\x0a\\x76\\x4c\\xdf\\xaf\\x4f\\x3d\\xb6\\xb3\\xfb\\xb6\\xb7\\x1b\\xa7\\xf6\\xec\\x3e\\x72\\xd7\\xae\\x9d\\xdb\\x0e\\x4f\\xab\\x6f\\x85\\x06\\xd5\\x63\\x64\\x90\\x1f\\x38\\x72\\xd7\\x0c\\xbd\\x88\\x0c\\xae\\x05\\xf0\\x14\\xb9\\x71\\xbf\\x44\\x4e\\x63\\x83\\xa4\\xdf\\xb4\\x59\\x26\\xe4\\xe1\\x2d\\xf2\\xa0\\x2e\\xb0\\xd9\\x2d\\x59\\xb7\\x6c\\x90\\xec\\xa3\\x9b\\xdd\\xd2\\xc7\\xb6\\xd4\\x4a\\xba\\xc0\\xd6\\xcd\\x90\\x38\\xd7\\x80\\xc4\\x05\\xfa\\x25\\xde\\x35\\x70\\x15\\x1c\\xa9\\x82\\x26\\x40\\xaf\\xb5\\xae\\x81\\x38\\xbf\\x87\\x5d\\xe8\\x94\\x0f\\xb5\\xc4\\x92\\xfe\\xb0\\xc4\\x35\\x10\\xd7\\x6d\\x61\\x17\\x7a\\xd7\\x40\\xbc\\xe4\\x83\\xec\\xc2\\xe0\\x1a\\x88\\xeb\\x37\\xb3\\x0b\\xa3\\x6b\\x20\\x6e\\xb0\\xab\\x17\\x44\\x2a\\x65\\x4f\\x32\\xb9\\x06\\xe2\\xa5\\x76\\x4d\\x40\\xe6\\x06\\xef\\x0e\\xf4\\x4b\\x65\\xae\\x81\\xb8\\xa9\\x3a\\x73\\x69\\x76\\x0d\\xc4\\xcb\\x7a\\x32\\x97\\x16\\xd7\\x40\\xdc\\xdc\\x9c\\xb9\\xb4\\xba\\x06\\xe2\\x96\\x40\\xe6\\x52\\x70\\x0d\\xc4\\xad\\x35\\x99\\x4b\\xd1\\x35\\x10\\x17\\xb2\\xb7\\xb2\\xb9\\x06\\xe2\\xe2\\x63\\x99\\x4b\\xbb\\x6b\\x20\\x6e\\xeb\\xcd\\x5c\\x96\\xbb\\x06\\xe2\\xf6\\xf6\\xcc\\xa5\\xc3\\x35\\x10\\x2f\\x6f\\xcc\\x5c\\x3a\\x5d\\x03\\x71\\x47\\x4b\\xfa\\x72\\x8b\\x64\\x0f\\xd0\\xf6\\xf7\\xfb\\xb7\\x5c\\x1f\\x06\\xfe\\x6f\\x00\\x00\\x00\\xff\\xff\\xa2\\x5f\\x93\\x24\\x70\\xaf\\x00\\x00\")\n\nfunc fontsInconsolataRegularWebfontTtfBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataRegularWebfontTtf,\n\t\t\"fonts/inconsolata-regular-webfont.ttf\",\n\t)\n}\n\nfunc fontsInconsolataRegularWebfontTtf() (*asset, error) {\n\tbytes, err := fontsInconsolataRegularWebfontTtfBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-regular-webfont.ttf\", size: 44912, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsInconsolataRegularWebfontWoff = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x64\\xb4\\x63\\x6c\\xe0\\xcf\\xfb\\xbf\\xfb\\xae\\x6d\\xbb\\x5b\\xdb\\xb6\\xb6\\xb6\\x6d\\xdb\\x36\\xb7\\xb6\\x6d\\x1b\\x5b\\x6f\\x6d\\x5b\\x5b\\xdb\\xdd\\xda\\x27\\x9f\\xef\\xf9\\x3d\\xfb\\x4f\\x72\\xe5\\x35\\x93\\xc9\\x20\\xd7\\x9d\\xdc\\x1e\\x0a\\xe2\\xe2\\x00\\x08\\x00\\x00\\x80\\x29\\x19\\x80\\xf2\\x5f\\xd6\\x3b\\xfe\\xff\\xeb\\xff\\x77\\x88\\x8b\\xab\\xca\\x01\\x00\\x48\\x20\\x00\\x00\\xf8\\xff\\x61\\xda\\x86\\xf2\\x2c\\x21\\xf6\\x53\\x1c\\x00\\x40\\x72\\x00\\x00\\x20\\x04\\x00\\x80\\x18\\x04\\x0d\\x00\\x57\\x50\\x61\\x64\\x01\\x00\\x90\\x6e\\x00\\x00\\xb4\\x00\\x00\\x30\\xb4\\x43\\xc6\\xbc\\x35\\xb1\\x33\\x72\\x04\\x00\\x50\\x6c\\x00\\x00\\x09\\x00\\x00\\x90\\x0d\\x70\\x14\\x61\\xc0\\xc4\\xdd\\x95\\x18\\x00\\xc0\\x32\\x00\\x00\\xe0\\xf9\\x0f\\xe4\\x2f\\x58\\x32\\x73\\x47\\x0b\\x3b\\x00\\x00\\x5b\\x02\\x00\\x90\\x46\\x00\\x00\\x35\\x53\\x69\\x61\\x2c\\xb7\\x30\\x72\\x71\\x04\\x00\\x88\\x5f\\x00\\x00\\x40\\xff\\x1f\\xc8\\x16\\xb6\\x5e\\xe6\\x00\\x00\\x91\\x00\\x00\\x6a\\xa7\\x00\\x90\\xe9\\x18\\x09\\x89\\xc0\\x65\\x69\\x66\\x64\\x0a\\x00\\x3a\\x9e\\x00\\x00\\x30\\x03\\x00\\xc0\\x01\\x39\\x18\\x6e\\x6c\\x69\\x69\\x66\\x04\\x00\\x3a\\x35\\xff\\xfd\\x0d\\x00\\x00\\x32\\x24\\x24\\x68\\x67\\x4b\\x3b\\x57\\x4f\\x00\\xd0\\x99\\x02\\x00\\x90\\x90\\xff\\xde\\x0f\\x3b\\xb0\\x97\\xb6\\x75\\x30\\x31\\x02\\x00\\x3d\\x45\\x00\\x00\\x19\\x06\\x00\\x90\\x19\\xff\\x71\\xad\\x7d\\x3b\\x23\\x4f\\x47\\x00\\x30\\xc0\\xfe\\xbf\\xb3\\xc4\\xa0\\x60\\x20\\x2d\\xf6\\x46\\x76\\x66\\x00\\x60\\xc0\\x05\\x00\\xa0\\xbc\\x00\\x00\\xd1\\x99\\x56\\xd7\\xac\\xe6\\xe8\\xe0\\xe2\\x0a\\x00\\x46\\xae\\x00\\x00\\xb2\\x07\\x00\\xa0\\x3d\\x15\\xec\\x4a\\x4f\\x8e\\xce\\x66\\x8e\\x00\\x60\\xa2\\x09\\x00\\xc0\\x00\\x00\\x80\\xa8\\x55\\x2b\\x99\\x0c\\x7b\\x98\\x19\\x9b\\x03\\x80\\xe9\\x7f\\xee\\x20\\xff\\xe3\\x52\\x46\\xe5\\x3f\\x3f\\xff\\xb3\\x3d\\xc5\\x5f\\x34\\xfb\\x5f\\x8e\\xbd\\x2c\\xe8\\xfd\\x97\\xb3\\x01\\x39\\x13\\x9e\\x1b\\x26\\x86\\xa6\\x86\\x86\\xbb\\x60\\xc6\\x30\\x90\\xc8\\x86\\xc6\\x86\\xe0\\x03\\xe5\\x42\\x53\\xa0\\xc7\\xcc\\x00\\x80\\xf8\\x03\\x04\\x1b\\x00\\xfe\\xdb\\x37\\xf7\\x1f\\xe4\\x0a\\x0a\\x4a\\x0d\\x0a\\x5b\\xce\\x70\\xc3\\x04\\x03\\x2b\\xe6\\x0b\\x35\\xef\\x9d\\x49\\x18\\x20\\xeb\\xeb\\xeb\\x1b\\x9a\\x1e\\x19\\x9f\\xea\\x9b\\xea\\xeb\\x9b\\xeb\\xeb\\x2b\\x40\\x4a\\x99\\x35\\x0f\\x0c\\x0e\\x64\\x5b\\x45\\x87\\x84\\x82\\xd4\\x5f\\x16\\xb4\\xb5\\xfa\\x5e\\xc0\\xc6\\x5e\\xab\\xc2\\xa1\\x04\\x09\\x0b\\x13\\x76\\x9e\\xa2\\xd5\\xfc\\x02\\xa8\\x21\\x20\\xc5\\x01\\x1b\\x64\\x84\\xff\\x04\\xfe\\x77\\xb7\\xa1\\xa1\\x79\\xa0\\x21\\x0e\\xa4\\x38\\x24\\x72\\x3b\\xe8\\x21\\x73\\xf0\\x2b\\x1d\\x3c\\x6f\\x60\\x0b\\x66\\x08\\x68\\xc2\\x30\\x84\\xe9\\x1d\\xcb\\x12\\xf3\\x87\\x05\\xbc\\x79\\x8d\\x21\\xcf\\x88\\xab\\x44\\x90\\x8c\\xb0\\x98\\xb0\\xb4\\xb0\\xbc\\xb0\\x94\\xb0\\x9c\\xb0\\x41\\xbf\\xf4\\x0f\\x7d\\xa3\\xd8\\xa2\\xa4\\xf3\\xfc\\xef\\xef\\xfe\\xb2\\x5b\\x50\\x37\\x7a\\x43\\xf8\\xe0\\x2a\\x33\\x45\\x64\\xc5\\x04\\xc5\\x84\\xa0\\xaa\\x56\\x31\\xe5\\xc9\\x97\\xef\\x8b\\xef\\xd1\\x6f\\xa4\\x4f\\xc6\\x97\\x9b\\xfb\\xe7\\xef\\x1d\\x0d\\xa4\\x38\\x41\\xae\\x07\\xc3\\xef\\x10\\x3f\\x24\\x77\\xc1\\xb5\\x3b\\xc3\\xc1\\x90\\x23\\xa4\\x2c\\xa2\\x8c\\x1d\\x41\\xd7\\x0b\\xf2\\x25\\x3b\\x31\\x50\\x71\\x0e\\xc8\\x76\\x48\\x71\\x0a\\xe2\\xfe\\xd0\\x3a\\xe0\\xd4\\x0c\\x53\\x9d\\xc3\\x1d\\x51\\x9e\\xc1\\x9e\\x50\\x5f\\xc0\\x1f\\x44\\xf8\\x87\\x11\\x8a\\x12\\xb3\\x13\\x8c\\x14\\xb5\\x15\\x8e\\x16\\xb7\\x17\\xc4\\x4f\\x72\\x33\\x0c\\x35\\x76\\x37\\x04\\x39\\x7a\\x3b\\x02\\x3d\\x7e\\x3f\\x30\\x51\\x52\\x13\\x34\\x15\\x56\\x17\\x38\\x19\\x5a\\x1b\\x3c\\x1d\\x5e\\x1f\\x28\\x09\\x4a\\x0b\\x2c\\x0d\\x4e\\x0f\\x24\\x05\\x46\\x07\\x22\\x03\\xc1\\xef\\xc0\\xbe\\x82\\xdd\\x84\\xb9\\x86\\xdb\\x5f\\x63\\x15\\xa7\\x19\\x6b\\xed\\x2f\\xa1\\x62\\xe1\\x6d\\x4f\\x33\\xd7\\xe3\\xac\\xc7\\xf4\\xfa\\x2d\\xa6\\xeb\\x0b\\x47\\xb4\\x1a\\xf5\\xda\\xcd\\xee\\x9f\\x9d\\x08\\x78\\x9c\\x0e\\x7f\\x9b\\xec\\x46\\x9f\\xf8\\xbb\\x9e\\xaf\\x4d\\xa8\\xa4\\xa5\\xa6\\xbb\\x75\\x1a\\x1b\\x88\\xdf\\xa5\\xb4\\x30\\x45\\x47\\xe9\\xc2\\x8d\\x21\\xc3\\x1f\\x9c\\x1b\\x2e\\x9c\\xad\\xb1\\xd5\\x2f\\xad\\x65\\x67\\xc0\\x1a\\x5d\\x6c\\x6e\\xc8\\xd9\\x5b\\xe5\\x05\\x5d\\x5f\\xce\\x5b\\x75\\x7e\\xd7\\xef\\xac\\x8d\\x3b\\xde\\x42\\x0f\\x1e\\x40\\x21\\x05\\xb1\\xa4\\x72\\xde\\x30\\xb5\\x3c\\xb0\\x3d\\xbb\\x3f\\x2a\\x64\\xac\\x71\\xba\\xe1\\x0e\\xa6\\x70\\xbb\\x58\\xb0\\xe2\\xf3\\xab\\x43\\xa7\\x54\\x81\\x1a\\x03\\xc5\\x6e\\x61\\x37\\x00\\x00\\x80\\x55\\x80\\x7f\\x00\\x01\\x40\\x08\\xe0\\x06\\x78\\x01\\x4e\\x40\\x04\\x10\\x0b\\x2c\\x00\\x69\\xc0\\x32\\xe0\\xfb\\xbf\\x79\\x22\\x90\\x06\\x64\\x01\\x79\\x40\\x09\\x50\\x01\\xd4\\x00\\x9e\\x80\\x05\\xa0\\x02\\xe8\\x03\\x62\\x10\\x28\\xff\\xd5\\x4e\\x4f\\xa9\\x4b\\x5e\\x47\\x18\\xf9\\x2f\\x02\\x12\\x58\\xd0\\xd0\\x1a\\x31\\xf7\\x06\\x7a\\x73\\x66\\xc2\\x88\\x4f\\x21\\x04\\xcc\\xd0\\x72\\xac\\xb1\\x29\\x6f\\xd8\\x11\\xb4\\x15\\xa7\\x73\\x62\\xb4\\x13\\x08\\x91\\x50\\x90\\x18\\xc2\\x46\\x3d\\x4e\\x41\\x61\\x89\\x64\\x36\\xe4\\x0f\\x2c\\x49\\x5f\\x11\\x81\\x1f\\xa8\\xac\\x36\\xbf\\x8a\\xd8\\x78\\x79\\x9b\\x5d\\x66\\x32\\x59\\x65\\x26\\x12\\xab\\x3c\\xce\\x6c\\x66\\x55\\x4e\\xc8\\x12\\x06\\xfe\\x42\\x4e\\x73\\x7c\\xca\\x4b\\xb6\\x36\\x03\\xcf\\x25\\x17\\x17\\xb1\\x31\\x2d\\x21\\x50\\xda\\xb6\\xe6\\x0f\\x13\\x6e\\xef\\x5f\\x70\\x90\\xd9\\xf3\\x29\\xbc\\xd6\\xc0\\x11\\xbf\\x03\\x35\\x12\\x8e\\x1c\\x6f\\x90\\x76\\x4b\\xf9\\xd7\\xfc\\x07\\x6c\\xf8\\xfb\\x07\\xd1\\x3d\\x2f\\x76\\x0b\\xdb\\xe2\\xc3\\x12\\x0f\\xcc\\xd9\\x0f\\xf0\\xe3\\x6c\\x27\\x99\\x90\\x1b\\x9c\\xe9\\xce\\x49\\xa4\\xb7\\xe0\\xe5\\x3d\\x63\\x26\\xa6\\x92\\x8c\\xb2\\x7d\\x06\\xc1\\x32\\xe5\\xaf\\xdf\\x6c\\x27\\xd6\\x93\\x0d\\xad\\x89\\xf3\\xdd\\x21\\xac\\x28\\xaf\\xe3\\x6c\\x42\\x2a\\x36\\x76\\xe0\\x59\\x5f\\x4b\\x3f\\x96\\xef\\x9d\\xd0\\x65\\x12\\x26\\xcb\\x1a\\x39\\x32\\x32\\x9a\\xbe\\xc8\\xd0\\xfa\\xc3\\xc6\\x5d\\xd5\\x54\\x5a\\xa7\\x5e\\x36\\xfa\\xf5\\x9a\\x9a\\x4f\\x0d\\x43\\x68\\xa6\\x83\\xa0\\xd6\\x06\\xd5\\xbd\\xe0\\x09\\x11\\x91\\x28\\xd0\\x17\\x7e\\x93\\x4d\\xd0\\x21\\xa0\\x3c\\x19\\x57\\x0f\\x41\\xa3\\x24\\xe3\\xc3\\x72\\x1f\\x6d\\x8d\\x7f\\x95\\x08\\xbd\\x4a\\xa2\\x8e\\x74\\x4b\\x49\\xf3\\x1e\\x84\\xb7\\x42\\x8e\\x24\\xae\\xf6\\x15\\x70\\x28\\x34\\x7f\\xf3\\x65\\xcb\\xd9\\x39\\x10\\x0c\\xbc\\x68\\xe1\\xf7\\x7b\\xfc\\xc1\\x91\\xe1\\x79\\x19\\x0b\\xdf\\xc0\\x46\\x31\\xe6\\x35\\xa6\\x0e\\x84\\x11\\x13\\x11\\x57\\x7b\\x0d\\xc7\\x9d\\xed\\xa1\\x83\\x3c\\x54\\x7e\\x9f\\x15\\x4a\\x09\\x3c\\xba\\x8b\\x0f\\xc8\\x85\\x6e\\xb9\\x5e\\x13\\xe3\\x4b\\x6f\\x75\\x43\\x64\\x56\\x87\\xf6\\xf6\\xdf\\xdc\\xfa\\x37\\x19\\xd5\\xa5\\xde\\x31\\x13\\x2d\\xe2\\xe1\\x50\\x65\\x5d\\xb1\\x40\\x3d\\xfd\\xae\\x3f\\xd3\\x3b\\x0a\\x96\\x47\\x08\\x37\\x28\\x6c\\xd2\\x9f\\x3d\\xfb\\xfe\\x25\\x1d\\xf4\\xc6\\x47\\x57\\xc7\\x66\\x89\\x08\\x2e\\xea\\xcd\\xe9\\xfd\\x5d\\xd4\\x7a\\xfe\\xab\\xba\\x1b\\x4b\\xa0\\x89\\x72\\xf1\\x4f\\xa3\\x36\\xf0\\xbf\\x2e\\x00\\xf2\\xfd\\x0d\\x20\\x79\\x6e\\x2c\\xf5\\xc0\\x69\\xea\\x9c\\x64\\x32\\x74\\x7e\\xb5\\xa6\\x5d\\x8b\\x3c\\xc3\\x11\\x87\\x22\\x8b\\x8c\\x35\\xd1\\xa5\\x95\\x86\\x25\\x98\\xfd\\xb0\\x1f\\xc1\\x9e\\x0c\\x45\\x96\\x66\\x0f\\x55\\x16\\x61\\x1a\\x89\\x23\\x88\\xe0\\x0a\\x55\\x9e\\x30\\xe7\\x83\\x3f\\x50\\x5e\\x75\\xc2\\x5f\\x8d\\xbc\\x28\\xb1\\xdf\\xf7\\xb6\\xe0\\x13\\xc8\\xe3\\xdb\\xb6\\x81\\xd9\\x77\\xdf\\x92\\x3d\\x6f\\x49\\x76\\x5f\\x90\\xcd\\xe3\\xe3\\xf7\\x3a\\xcf\\xe3\\xe3\\xf6\\x62\\xb1\\xa2\\x4c\\x9e\\x96\\xcd\\x9a\\x79\\x30\\xb5\\x58\\x00\\x3f\\xbc\\xff\\xfc\\xd6\\xde\\x37\\x3e\\x58\\x73\\x31\\xcf\\xe7\\x3f\\x61\\x83\\xa0\\x97\\xd2\\xbc\\xf8\\xee\\xfd\\xee\\xea\\xde\\x39\\xfa\\x16\\x9b\\x57\\x65\\xfd\\x39\\x1f\\x12\\xc5\\xa8\\x0c\\x5f\\x5a\\x54\\x25\\x26\\xe6\\xd4\\xaa\\x85\\x71\\xf1\\x66\\xa7\\xaa\\x4a\\xf3\\x35\\xbb\\x41\\x27\\x3a\\x48\\x4e\\xce\\xf2\\x62\\x06\\xe1\\xcf\\x5d\\xad\\x9c\\x46\\xb7\\x64\\x8e\\xe2\\x9f\\xcb\\xe9\\x33\\xed\\x5f\\xbf\\xbe\\x29\\x9b\\x7e\\x44\\x33\\x57\\xb9\\x45\\x38\\x8c\\x25\\xf8\\x39\\x69\\xfe\\xc4\\x0e\\x2b\\x80\\x4a\\xd0\\xce\\x81\\x94\\xbf\\x29\\x77\\x56\\xa9\\x5c\\x15\\x36\\x61\\x4d\\x4d\\xc3\\x36\\x6a\\x49\\xcd\\x8a\\x27\\x12\\x1c\\x81\\x56\\x51\\xed\\x42\\xc3\\xef\\x4f\\xa1\\x59\\x1c\\x3c\\x41\\x86\\x79\\x7a\\x12\\x06\\x8a\\x58\\x77\\x4c\\x75\\x66\\x16\\x85\\x36\\xa9\\x28\\xa9\\x8a\\x91\\x41\\x4f\\x52\\x2c\\x47\\x56\\x11\\x8b\\x12\\xe0\\x86\\x40\\xe4\\xc6\\x73\\xc9\\x51\\x5a\\xdf\\xbd\\x10\\x95\\xbf\\x6b\\x43\\x6a\\xec\\x2b\\x8b\\x11\\x82\\x68\\x1b\\x2d\\xf6\\xf1\\x75\\x35\\x3f\\xc6\\xb1\\x59\\x06\\x9d\\x6e\\xa8\\x55\\x1b\\xe0\\x41\\x5d\\xab\\x4c\\xf3\\x4e\\x6a\\xf5\\x47\\x70\\xa0\\xb5\\xad\\x61\\xc7\\xba\\xa7\\xb9\\x78\\x55\\x8b\\x68\\xab\\xeb\\xc5\\xa5\\x73\\xa4\\xab\\x96\\xfb\\xe7\\xfc\\x92\\x43\\x06\\x07\\x45\\xcd\\x69\\x11\\xbc\\x2a\\x4c\\x8d\\x0a\\x93\\xa3\\x08\\x8c\\x60\\xf9\\x8a\\xb2\\xb5\\x66\\x08\\x69\\x14\\x38\\x27\\x65\\x83\\xc6\\xcf\\x5c\\x3b\\xfd\\xb9\\x4c\\x31\\xb8\\x9a\\x8a\\x31\\x01\\xc6\\xb4\\x81\\xe2\\xb8\\xb0\\xd4\\x4a\\x84\\xc8\\x50\\x43\\x66\\xb8\\x91\\x50\\x45\\x53\\x14\\x02\\x72\\xd3\\xdc\\x15\\x4f\\x82\\x28\\x88\\xc3\\x47\\x1c\\x25\\xfe\\x2a\\xad\\xbb\\x4b\\x4e\\xa3\\xda\\x19\\xe4\\xfb\\x57\\xd4\\xe9\\xc4\\x00\\x18\\x9d\\x87\\x97\\x2a\\xf2\\x01\\x78\\xfe\\xfd\\x4a\\x27\\x39\\x72\\x8e\\xd2\\x2c\\x1d\\x86\\x59\\x74\\xc1\\xa4\\xfd\\x71\\xb7\\x4f\\x19\\xd6\\x8c\\x74\\x74\\x85\\xf5\\x8c\\x55\\x0c\\xb6\\xa3\\x22\\xbe\\x8a\\x90\\x89\\x2a\\x2b\\x58\\xec\\xe2\\x13\\xaf\\xc2\\x84\\xc9\\x8d\\x1c\\x86\\xbc\\x93\\x13\\x69\\x55\\xd5\\x04\\x04\\x33\\xab\\x66\\x5e\\xdc\\x58\\x73\\x38\\x99\\x96\\xc2\\xf5\\xf0\\x01\\x12\\x39\\x49\\xc3\\x0e\\xad\\x11\\xd5\\xf3\\x4a\\xc7\\x7f\\x2e\\xb0\\xff\\x38\\x9b\\xa5\\x63\\xdb\\x0a\\x06\\x60\\x4a\\x52\\x9d\\x44\\xee\\xd4\\x1a\\xc7\\xb8\\x19\\xd1\\x33\\xc5\\x30\\x12\\x4a\\x18\\x32\\xb0\\x96\\x28\\x94\\xa0\\xd2\\xdf\\x82\\xbd\\xe6\\xa3\\x45\\x44\\xe4\\xee\\x8e\\xde\\x0e\\xf2\\x73\\x0a\\x2e\\x7f\\xd0\\xc3\\x75\\x91\\xa2\\x1b\\xf4\\xcf\\xc6\\x1f\\x9c\\x40\\x0a\\x3b\\xa0\\x5e\\x6a\\x68\\x2a\\x69\\xdc\\x42\\x85\\xec\\xb6\\x17\\x21\\x47\\xc9\\x35\\xbb\\x36\\x4e\\xe0\\x66\\x99\\x8d\\x39\\x90\\x7f\\x21\\xe4\\xf3\\x57\\x53\\x2b\\x0f\\x86\\x0d\\xb2\\x55\\xbb\\x9d\\xee\\x0e\\xd8\\x67\\xd1\\x37\\x5c\\xec\\x21\\xc9\\x1e\\xfe\\xce\\xfc\\x68\\xdb\\xdb\\x79\\x71\\xc8\\x39\\x74\\xd8\\x35\\xc0\\x48\\x0a\\x80\\xc8\\x3f\\x9b\\x08\\x90\\x97\\xfa\\x72\\xd9\\x7a\\x71\\x30\\x97\\xb9\\x0f\\x38\\xeb\\xaf\\x67\\x5d\\xaa\\x99\\xb9\\xa6\\xaa\\x0b\\xfe\\x2e\\x84\\x84\\x9b\\x36\\x64\\x91\\x33\\xcf\\xfe\\xbb\\x47\\xe7\\x9a\\xda\\x2e\\xc3\\xaf\\xc6\\xf9\\xa1\\x60\\x49\\x45\\xd1\\x35\\xac\\xe3\\x77\\x8b\\x66\\x31\\x16\\x3f\\x21\\xe1\\xaf\\xaa\\xfe\\x11\\xb2\\xb3\\xbf\\x5c\\x0f\\xb9\\xa3\\xf4\\x45\\xc1\\x85\\xf3\\xf6\\xd8\\x19\\xd2\\x4f\\x74\\x1e\\x80\\xed\\xad\\xf6\\x6e\\xed\\xc9\\xf2\\x91\\x3d\\xe7\\x79\\x3a\\xd7\\x55\\xb8\\x53\\x90\\xa9\\xef\\xaa\\x40\\x74\\x6e\\xe2\\x62\\xa1\\x14\\x3e\\xc3\\xbf\\x9a\\xcf\\xfb\\x7c\\xb4\\x45\\x8a\\xcb\\x96\\xf6\\x8e\\x19\\x7b\\x7d\\x23\\x61\\x10\\x4e\\x0f\\x7e\\x95\\xd5\\xee\\x1e\\xde\\x51\\xf1\\x4b\\x49\\x4d\\x95\\x3d\\xb5\\x64\\x46\\x49\\x24\\x03\\x6d\\xe5\\xbe\\xc0\\xec\\x5e\\x84\\x2e\\x0b\\x81\\xf6\\x2e\\x3c\\x8c\\xb3\\x2f\\x1c\\xc3\\x45\\x24\\x05\\x8d\\xaf\\xdb\\x32\\xf4\\x77\\xce\\x7c\\x0d\\x73\\xd4\\x0e\\x4b\\x16\\x5b\\x01\\x57\\x6b\\x4e\\x41\\x0f\\x8d\\x73\\xb8\\x57\\x10\\x6b\\x24\\x9e\\x22\\x55\\x35\\x9b\\xb8\\xe1\\x9f\\xe1\\x04\\x17\\xff\\x95\\xf3\\xdb\\x21\\x43\\x9d\\xb0\\x04\\xa9\\x2d\\x70\\xbc\\x53\\xce\\xa9\\x68\\x6a\\xcf\\xc3\\x16\\x73\\xb8\\x0a\\xda\\x64\\x49\\xb2\\x21\\xb9\\x1f\\xc8\\x5a\\xcd\\x70\\x62\\x2b\\x0e\\x98\\xd1\\xd1\\x42\\x9a\\x3f\\xcd\\xd6\\x6c\\x51\\xaa\\x50\\x45\\x1a\\x5f\\xdf\\xd1\\x17\\xd2\\x5e\\x3b\\x24\\x9b\\x06\\x32\\x91\\x8b\\x30\\x0b\\xa9\\x1a\\x99\\x95\\xe3\\xf1\\x39\\xca\\x07\\xad\\xea\\x44\\x1a\\xcf\\x79\\x78\\x08\\x0f\\x1a\\x07\\x2a\\x03\\x4b\\xab\\x68\\xd0\\x2b\\xe0\\x33\\x64\\x70\\xba\\xa6\\x85\\xaa\\x2f\\x7b\\x35\\x4b\\x97\\x8f\\xd9\\xf0\\x90\\x41\\xc7\\xeb\\xeb\\xe0\\x65\\x5d\\xab\\x53\\x45\\x15\\x72\\xbd\\xc2\\x2f\\x70\\xff\\x72\\xc8\\x5d\\x9c\\xa5\\x13\\x5e\\xae\\x2c\\x6c\\xac\\x44\\x5e\\x57\\xd6\\x11\\xaf\\xfa\\x35\\x98\\x5c\\xda\\x7d\\x23\\x79\\xfb\\xa0\\x70\\x32\\xf1\\x31\\x7d\\x2c\\xac\\xa6\\x90\\x67\\x19\\x81\\xbd\\x49\\x5d\\x1e\\x86\\xdc\\xe9\\x5d\\x31\\x5f\\x81\\x4f\\x37\\x61\\x9a\\x74\\xdd\\x5f\\x0c\\xd6\\xe8\\x6c\\x9a\\xcd\\xf2\\x5f\\xca\\xb7\\x3e\\xae\\x52\\x46\\xf8\\x64\\xb7\\xa8\\x24\\x53\\x98\\xbb\\xb2\\xc5\\xba\\x5b\\xdf\\x68\\xbd\\x14\\x9a\\xf9\\xea\\x74\\x6e\\x4a\\x28\\xc1\\xd2\\x38\\x5d\\x81\\x1d\\xd3\\x87\\x85\\xb1\\xa8\\xb8\\x4f\\xc8\\x0c\\x57\\x50\\x9c\\xeb\\xa8\\xae\\x80\\x62\\x52\\xe2\\x05\\x19\\x18\\x8b\\xb0\\xe7\\xb7\\x06\\xcf\\x98\\x62\\x68\\x3a\\xf1\\x55\\xbd\\x76\\x84\\x0b\\x89\\x29\\x21\\xa3\\xe2\\xed\\x36\\x55\\x04\\xea\\x62\\x56\\x1e\\x27\\x36\\x40\\x6c\\x92\\xcf\\x83\\x68\\xef\\x32\\x45\\x92\\xf7\\xf1\\xd1\\xeb\\x5a\\xcb\\x19\\x73\\xeb\\xae\\x04\\x66\\x2d\\x65\\x0c\\x69\\xb7\\x6f\\xed\\xe6\\x60\\x65\\xef\\x35\\x0e\\x81\\xd4\\xd0\\x37\\xd0\\x32\\xd9\\xd8\\xd8\\xec\\x6e\\xe0\\xc2\\x90\\x31\\xa9\\xe0\\xd1\\xf5\\x9d\\xfc\\x43\\xb8\\x6d\\x2a\\x87\\xae\\x6b\\x51\\x05\\xf5\\xb4\\x82\\x40\\xfc\\x37\\xaf\\x9c\\x95\\x51\\x4f\\xb3\\x11\\xe5\\x39\\xb4\\x86\\xef\\xdb\\x02\\x89\\x7d\\x4c\\xab\\x51\\x54\\xfa\\x1b\\x81\\xcd\\x5f\\x90\\xe1\\x0f\\x56\\x9f\\x03\\xc5\\x87\\x9b\\x1e\\xfe\\x6a\\xea\\x3f\\x05\\x24\\x47\\x3d\\x37\\x7f\\xc1\\xcf\\xe4\\xc1\\xe8\\x3b\\x45\\x15\\xe2\\x04\\x6b\\xf8\\x17\\x3c\\xc5\\xfa\\x8f\\xb6\\xd9\\xfc\\xf3\\xc3\\x5b\\xa2\\x98\\xdf\\xe0\\x21\\x8f\\x02\\x06\\x66\\x0d\\x91\\x6a\\xa3\\x1e\\xf6\\x70\\x90\\xbf\\x6f\\x62\\xe2\\x05\\x50\\x6c\\x09\\x34\\x7f\\x35\\xc0\\xe5\\x37\\xd6\\xf0\\x24\\xdb\\x5f\\x5d\\xdb\\xdb\\xe9\\x79\\xf2\\x09\\xcc\\xe1\\xc2\\x97\\xbd\\x1f\\xdc\\xe5\\xd2\\x5f\\xac\\xb4\\xc2\\xdb\\x5e\\xdb\\xdb\\xdc\\x5c\\xc2\\x42\\x2e\\x88\\x99\\x2f\\xae\\x6e\\x5b\\x6c\\xab\\x56\\x54\\xba\\xa9\\xe2\\x7b\\x76\\xa6\\x4f\\xa8\\x03\\xbc\\x61\\x2c\\xfa\\x35\\xc6\\x27\\xcd\\xda\\x53\\x53\\x90\\x47\\xa8\\x9b\\xc1\\x69\\xaf\\x5a\\x3f\\x13\\x94\\x23\\x86\\xe4\\x46\\xbc\\x7e\\x58\\x92\\x2c\\x58\\xb0\\x49\\xd6\\x48\\xdb\\xb1\\xe8\\xe4\\xad\\xb2\\x60\\xa8\\x31\\xe3\\x61\\x32\\x16\\x6b\\x3d\\xa8\\x9b\\xc8\\xab\\xa9\\x05\\xbe\\x78\\xa1\\x8a\\x84\\xbc\\xa2\\x9a\\x99\\x4a\\xf7\\x34\\x4e\\xdf\\x72\\x1c\\xab\\xc9\\x75\\xb3\\x34\\x04\\x93\\xd2\\xd8\\x10\\x44\\x41\\x55\\x1d\\xc8\\x97\\x4e\\x54\\xc2\\x62\\x27\\x0c\\x15\\x2a\\x7b\\xfe\\x89\\xab\\x93\\x18\\x0b\\x14\\xfa\\xf8\\x75\\x0a\\xd2\\xbc\\x20\\x21\\x11\\x5f\\xec\\xb8\\x79\\x2d\\x66\\xed\\xd1\\xd9\\x54\\xd3\\x46\\xfa\\x2f\\xfe\\xba\\x24\\x49\\x9d\\xc8\\x7a\\x9c\\x8f\\xc3\\xbf\\xe0\\x6b\\xa1\\x2e\\x2d\\x82\\x75\\xcb\\x63\\x2b\\x11\\xf2\\x8f\\x87\\x0d\\x8b\\xf1\\xc3\\xa1\\xc0\\xc5\\xe5\\x5f\\xee\\xcc\\xde\\x6a\\xda\\xbc\\x53\\x91\\xed\\xca\\xdf\\xb8\\x61\\x12\\x68\\x7d\\x4d\\x8e\\x3a\\x82\\xb3\\x37\\xd7\\x76\\x2e\\x87\\xfa\\x0f\\x57\\x88\\x58\\xe7\\xec\\x06\\x79\\x9e\\xa7\\xff\\xd2\\xf3\\x6e\\x4e\\xe3\\x5d\\xf9\\x33\\x60\\xec\\x36\\x55\\xad\\xef\\xc1\\x65\\x05\\xd8\\xfa\\x04\\x65\\xe2\\xe1\\x73\\x9e\\x08\\xec\\xec\\xbf\\x16\\xf4\\xd0\\xc3\\xe6\\xb8\\xcb\\x62\\x05\\x60\\xbf\\x86\\x24\\x21\\xa8\\xfa\\xc7\\xc6\\xeb\\xc0\\x61\\x28\\xe4\\x15\\x03\\x89\\x9c\\xa6\\xa2\\xcd\\x2f\\xf9\\xd0\\xd7\\xbc\\xb0\\x23\\xbb\\x84\\x68\\xb7\\xc2\\x40\\x70\\xf6\\x48\\x07\\xb4\\xe9\\x9d\\x50\\x5c\\x2b\\xe3\\x0d\\xf6\\x70\\x7d\\xa1\\xde\\x1b\\x04\\x85\\xc6\\x72\\x7d\\xb2\\x70\\x82\\x7d\\xd0\\x95\\xd5\\x61\\x61\\x7e\\x86\\x7e\\x42\\x1e\\x74\\x6b\\xc6\\x88\\xbc\\xdc\\x57\\xd1\\xf7\\xd1\\x95\\x2f\\x60\\x51\\x69\\x50\\x07\\xf9\\x94\\xb2\\x55\\xd0\\xca\\x91\\x3e\\xb7\\x39\\x74\\x73\\xe5\\x2d\\x34\\xcb\\x97\\xfa\\x5f\\xa7\\x2e\\x8d\\x75\\x14\\x8e\\x44\\xa6\\x23\\xda\\x15\\xcb\\x49\\x20\\x7b\\x5f\\xf8\\xda\\x26\\x95\\xa6\\xfa\\xb8\\x8c\\x7e\\x5b\\x1d\\xe6\\xe6\\x1b\\x54\\xf4\\xfc\\xf9\\x8a\\xb8\\xf9\\xc1\\xde\\x8b\\xe5\\x46\\xe2\\x91\\x95\\xa7\\xe1\\x1a\\x6c\\xce\\x4d\\x25\\x3c\\xfa\\xa3\\x5f\\x18\\x9a\\x39\\xf3\\xf8\\x27\\x65\\x47\\x6e\\x73\\x5c\\xa4\\x9a\\xc6\\x7c\\x90\\x27\\xb5\\x5d\\xe3\\xa6\\x25\\x98\\x72\\xee\\xda\\x3d\\x96\\xc9\\xe3\\x23\\xe9\\x2c\\x22\\x38\\xc5\\xd7\\xf5\\x3c\\xef\\xf5\\xc7\\xca\\x05\\xd4\\xc9\\x81\\xc2\\xf7\\xcb\\x74\\x62\\x22\\xa7\\x01\\x17\\x01\\x6f\\x46\\x86\\xdf\\x09\\x2e\\xbb\\x0b\\xd7\\xef\\x5b\\x24\\x41\\xc9\\x81\\x13\\x0f\\x25\\x07\\x16\\xac\\x35\\xe0\\x94\\xc1\\x2c\\x96\\x16\\x9b\\xf0\\x8b\\xff\\xc0\\x83\\x26\\x41\\x3a\\x02\\xb4\\x82\\x36\\x7c\\xa3\\xfb\\xc4\\x92\\xfd\\x4a\\x98\\x9e\\xb9\\xa1\\xfe\\x21\\xe8\\xf7\\x0e\\x9e\\xb8\\xf6\\x5b\\xac\\x68\\xf9\\xbc\\x40\\x8f\\x44\\xfe\\x7b\\xd7\\x28\\xe5\\xf3\\x91\\xfe\\x95\\xb8\\x5e\\x07\\x1c\\xff\\xaf\\xd1\\x8b\\xab\\x52\\xff\\xf1\\x1c\\x13\\x6e\\x69\\x09\\x37\\x65\\x80\\x04\\x1c\\x83\\x91\\xc4\\x5c\\x5f\\x51\\xac\\xd9\\x70\\xa7\\x2f\\x41\\x59\\x5b\\x8e\\x2a\\x9a\\xca\\x37\\x12\\xdb\\x56\\xe5\\x71\\xad\\x0c\\xd6\\x55\\x75\\x29\\xb0\\xa9\\x79\\xbe\\x46\\x3c\\x7a\\x67\\xb1\\x62\\x77\\xb6\\x05\\xd7\\xb7\\xb2\\x94\\xed\\x47\\x63\\xe0\\x9c\\x75\\xac\\xd7\\x74\\xa0\\xf7\\xa5\\x7e\\xf3\\xec\\x56\\xf4\\x93\\x5c\\x61\\xef\\xd6\\x3a\\x75\\xa7\\x0d\\xaa\\xa0\\xfc\\x71\\xd9\\x9c\\x70\\xd4\\xa5\\x82\\xc5\\x35\\x1f\\xbf\\x48\\x8f\\x70\\xa6\\x90\\x8b\\xe1\\xc1\\x89\\x6b\\x13\\x7c\\x06\\x77\\x50\\x50\\x6e\\xd3\\x94\\x05\\x0e\\x98\\x2f\\xcb\\x70\\xc5\\x5e\\x32\\xfd\\x42\\x99\\xd1\\x59\\x6d\\x91\\x09\\x8b\\xbc\\x62\\xe1\\x8c\\x58\\x36\\xa7\\x62\\x1b\\x39\\xe6\\x7b\\xf1\\x6f\\xe7\\x9b\\xe1\\x2f\\x99\\xd2\\xda\\x22\\xba\\xc3\\x7d\\x9d\\xb7\\x8d\\x99\\x5e\\xd1\\xa7\\x23\\x2e\\xbd\\xd9\\x98\\xb9\\xfa\\xc0\\x34\\x1e\\xe6\\x5c\\x12\\xe5\\xd9\\x03\\x22\\x70\\x44\\x03\\xd5\\x43\\x2c\\x1b\\x41\\xf9\\xef\\xac\\xba\\xef\\x63\\x4e\\x23\\xb9\\xc1\\xc0\\x51\\xc8\\x0a\\x03\\xd0\\xce\\x28\\xfa\\x62\\x66\\x38\\xa1\\x70\\x8c\\x55\\x68\\xd1\\x06\\x72\\x53\\x0a\\xc1\\x5f\\x90\\xff\\xac\\xaa\\xfb\\xb0\\x70\\xb7\\x67\\x9c\\x40\\xbe\\xdb\\xac\\xfd\\x6d\\x0c\\x4a\\x86\\x4f\\x4e\\xda\\xd3\\xcc\\x35\\x17\\x1f\\x5a\\xe1\\xa6\\x84\\x13\\x30\\xc2\\x8b\\x72\\xc6\\x22\\xcb\\xce\\x2a\\x23\\x87\\xa5\\xd2\\x8d\\x03\\x06\\xcb\\xcb\\x7f\\xf1\\xe3\\x74\\x72\\xcc\\xf2\\x95\\x1a\\x0a\\x5b\\xcb\\x54\\x3e\\xaa\\x66\\x4d\\xe0\\x36\\x7a\\x31\\x40\\x99\\x88\\xd0\\xb9\\x30\\x83\\x4d\\x22\\xa1\\x58\\xb5\\x05\\x45\\x37\\x67\\x0e\\x01\\x6d\\xfd\\x86\\x22\\x7d\\xcb\\x91\\x20\\xd9\\xeb\\x2c\\x36\\xaa\\x5c\\x20\\x13\\x81\\x7b\\x54\\x0c\\x11\\x16\\xda\\x13\\x8d\\xfa\\x6d\\x58\\x6b\\xaa\\x5c\\x04\\x69\\x66\\x17\\x67\\x62\\x6a\\x86\\xe4\\xf0\\x2d\\xad\\xe8\\x46\\xa4\\x41\\x3d\\x0b\\x8a\\xf7\\x63\\x91\\x4f\\xac\\x07\\xe3\\x2b\\x2b\\xf3\\x68\\x76\\x57\\x94\\xe2\\x59\\x7f\\xf4\\x83\\xfd\\x51\\xb7\\xb0\\x4e\\x3c\\xfe\\xf6\\x5f\\xfd\\xba\\x8c\\x1f\\xbe\\xf9\\x8b\\xb9\\x80\\x77\\x9a\\x78\\xf0\\xe7\\xcf\\x5a\\x40\\x21\\x69\\x3a\\xaf\\xcb\\x93\\x87\\xc5\\xc6\\x4d\\xc7\\x6d\\xd7\\x09\\xa2\\x80\\x98\\xc3\\xd5\\xa5\\xb4\\xc2\\x9f\\x04\\x97\\x67\\x77\\x7b\\x6e\\x4f\\xab\\x92\\x47\\x43\\xd0\\x9b\\x7e\\xfc\\x91\\x19\\xdb\\x38\\x65\\x65\\x7f\\x9a\\x49\\xe3\\x80\\x90\\x40\\x44\\xb2\\x0a\\x68\\x73\\x53\\x21\\xd2\\xe5\\x06\\x47\\xc8\\xc0\\xa2\\x40\\x68\\xa6\\x87\\x7b\\x62\\xae\\x28\\xee\\x25\\x01\\x47\\xb6\\x74\\x13\\x5e\\x06\\x7f\\xf1\\x66\\x3b\\x3b\\x31\\xf3\\x8a\\xe4\\xbe\\x02\\xab\\xdd\\x69\\xf1\\x73\\x79\\x1a\\x19\\xa3\\xde\\x1a\\x8b\\xe3\\xd2\\x68\\x9a\\x69\\xdf\\x36\\x6c\\xd6\\xb1\\x5f\\x38\\xe8\\x3f\\xb0\\xfb\\x4c\\xc0\\xe1\\x2e\\xb5\\x50\\x67\\xa9\\x2e\\x13\\xdb\\xf3\\x48\\x38\\x51\\x63\\xd5\\xcc\\x27\\xf1\\x2f\\x1c\\xbd\\x69\\x60\\x5c\\x5e\\x34\\x09\\x0c\\x15\\xa5\\x64\\x98\\x25\\x54\\xa5\\xd5\\x0a\\x10\\x8f\\xe8\\xab\\x51\\x70\\xb0\\x53\\x39\\xb5\\x93\\xc5\\x9e\\x92\\xed\\xbe\\x6b\\x5d\\x28\\x0d\\x6e\\x56\\x35\\xd8\\x3c\\xc2\\x4c\\xf4\\x10\\xfc\\x1d\\x87\\x7c\\xf6\\x05\\xbd\\x0b\\xec\\xcc\\x2d\\x9b\\x19\\xe7\\x31\\x73\\x1c\\xd9\\x39\\x4a\\x72\\x5a\\x54\\x2e\\x96\\x68\\x7c\\xe4\\x7b\\x3b\\x3e\\x65\\x74\\x47\\x9f\\xcc\\x0d\\xda\\x6d\\x64\\xfa\\xd0\\xf6\\xe9\\x30\\xd5\\x4e\\xfa\\xbe\\x5e\\x66\\xce\\xae\\xc6\\xfd\\x3e\\x3d\\x34\\x62\\xd0\\xed\\xac\\x66\\x43\\xe9\\x46\\xa1\\xed\\x24\\x8c\\x76\\x22\\xd0\\xd1\\x89\\xf3\\x19\\x95\\xb5\\x08\\x93\\x4b\\xc2\\xf9\\x9f\\x8d\\x92\\xa4\\x33\\x5f\\xb9\\xb3\\x23\\x9f\\x83\\xe0\\xda\\x8c\\xb0\\xf0\\x0f\\x42\\x8b\\xaa\\xf7\\x79\\xd6\\xbe\\x82\\x9b\\xaa\\xcd\\x1b\\x61\\x39\\xfe\\x40\\x2e\\x9a\\x2b\\x87\\x04\\x94\\x2a\\x62\\xbc\\x68\\xf4\\x9b\\x63\\x8a\\xc0\\x14\\x2e\\x25\\xd1\\xdf\\xd7\\xc9\\x90\\x41\\xcb\\x52\\xff\\x24\\x6c\\x69\\x99\\xdf\\x05\\x53\\x65\\x76\\x8e\\x84\\x51\\x87\\xb0\\x36\\xfd\\x5d\\x4d\\xf3\\x33\\xc9\\x17\\xff\\x6f\\xbd\\xba\\xcd\\xdf\\x32\\xbd\\xc6\\x17\\x7e\\x1d\\xb0\\x13\\x73\\x59\\x42\\x95\\x9d\\x7e\\xc4\\x7c\\x0f\\x17\\x0b\\xd3\\xce\\x2e\\x13\\x67\\x06\\xfe\\xe5\\xdf\\x67\\xbd\\x53\\x7d\\x9e\\xbe\\xb3\\x95\\x5f\\x58\\x14\\x65\\x4b\\x20\\x3d\\x93\\xe8\\xf0\\xf6\\x17\\xf5\\x38\\x5f\\x68\\x59\\x84\\x30\\x6c\\xee\\x1a\\xef\\xbf\\x6f\\xb7\\x83\\xae\\x07\\x7d\\x67\\x2d\\x55\\x6e\\x7e\\xf7\\xf4\\x76\\xa0\\x18\\x2a\\xd1\\xff\\x6c\\x78\\x03\\x2e\\x0f\\x16\\x89\\xd1\\xb4\\xab\\x02\\xcf\\xcb\\x9b\\x70\\xe9\\x30\\xd8\\x14\\x79\\x24\\xce\\xd8\\x5c\\x41\\x76\\x9d\\xf4\\x4b\\xfa\\x08\\xa9\\x41\\x02\\x44\\x6b\\x0a\\xff\\xd0\\x58\\x16\\x91\\x54\\x67\\x63\\xa9\\xce\\xd3\\x55\\x8f\\xbe\\x8f\\xd3\\xf4\\xff\\x3b\\xd5\\xf2\\xad\\x1c\\xd5\\xb1\\x01\\x47\\x31\\x7e\\x6c\\x68\\x66\\xfb\\xd5\\x23\\xbf\\x61\\x1c\\xc4\\x01\\x07\\xa1\\x79\\x6d\\xf2\\x8b\\xf3\\xde\\x9d\\x48\\x12\\x03\\xdc\\x18\\xac\\xc5\\xe2\\x63\\xdd\\x42\\xe1\\x98\\x50\\xd8\\x40\\x18\\xec\\x99\\xf9\\x63\\xa0\\x0b\\xca\\xc5\\x62\\xae\\x8f\\x4c\\x4f\\xc6\\xd5\\x25\\x8f\\x7b\\x84\\x21\\x70\\x3b\\x56\\x69\\xdd\\xcd\\x13\\x89\\x8d\\xd8\\x20\\xcc\\x13\\x49\\xb7\\x01\\xaa\\x74\\xc5\\x2d\\xac\\x01\\xaa\\x14\\x56\\x0a\\x02\\x41\\xe3\\x67\\x7e\\xe4\\x29\\x41\\x24\\xb0\\xad\\x73\\x3a\\xf2\\xcb\\x80\\xaa\\x86\\x05\\x7a\\x86\\x16\\xf6\\x05\\x2b\\xf0\\x45\\xa6\\x4e\\xb1\\xa8\\x19\\x7c\\xee\\x89\\x4e\\x7c\\x8d\\xa5\\x40\\xbc\\x68\\x16\\xa8\\xab\\xad\\xc0\\xf6\\xf1\\xa8\\x86\\x4c\\x49\\x11\\x41\\x24\\x4a\\x14\\xed\\x96\\x99\\x51\\x0e\\x37\\xd8\\xc0\\x49\\x10\\xa5\\x5d\\x53\\x2e\\x33\\xc7\\x79\\x56\\x95\\x27\\x5a\\x5a\\x68\\xf1\\xf6\\xf3\\xd3\\x20\\x5b\\x58\\xc4\\x87\\x6f\\x7b\\x1a\\xce\\x46\\x74\\xe6\\xff\\xe1\\x6d\\x7e\\xf7\\xfc\\xd4\\xff\\x99\\x1b\\x7f\\x2d\\x55\\xf2\\x44\\x34\\x1b\\xf3\\xf5\\x60\\x9c\\xbf\\x30\\x8b\\x1b\\xec\\xaf\\x51\\xf1\\x29\\x64\\x73\\x11\\x72\\xd5\\x1f\\x1e\\x9a\\x2f\\xc0\\x97\\xca\\x4b\\x28\\x45\\xf8\\x72\\x3d\\x13\\x54\\x4e\\xb4\\xd6\\xad\\xb3\\x11\\x3f\\x18\\x88\\x50\\x8e\\xa1\\x5d\\x05\\xca\\x34\\x05\\xa6\\xda\\x46\\x57\\xaf\\x35\\xb4\\x8f\\x1d\\xe8\\x2c\\xd1\\x02\\x0f\\x26\\x04\\xb5\\x52\\x2b\\x37\\xf4\\xf2\\x62\\xc4\\x4b\\x4c\\xf3\\x98\\x3d\\xc4\\x74\\xbb\\x0d\\x61\\x9d\\x13\\x38\\xda\\x40\\xd4\\x22\\x6d\\xa3\\xc8\\x35\\xc1\\x14\\xec\\x94\\xf9\\xb3\\x15\\x76\\x11\\x5b\\x2f\\x1e\\x62\\xd1\\x6c\\x98\\x78\\x0e\\x08\\x54\\x54\\xa4\\x04\\x0f\\xd3\\x52\\x44\\xa9\\x36\\xed\\xf7\\x16\\xef\\x6b\\x32\\x8d\\x51\\x9d\\xf4\\xfe\\x1d\\x63\\x68\\xfd\\x6f\\x4b\\x71\\x03\\x91\\xd3\\xf7\\x88\\x31\\x7c\\xc6\\xd7\\x6d\\x4e\\x79\\xf7\\x76\\xa9\\x2b\\xe4\\xfd\\xbd\\x6d\\xae\\xf0\\x20\\xb7\\x16\\xea\\xfd\\x20\\x32\\x37\\xc2\\xfd\\x41\\xb0\\x97\\xf6\\xc9\\xd3\\xd0\\xc6\\x40\\xee\\xd9\\xb5\\xa1\\xb0\\x98\\x85\\x1f\\xad\\xe4\\x2c\\xed\\x24\\xc1\\xbb\\xee\\x79\\xef\\xb3\\x2c\\x70\\xc3\\x1c\\xfe\\xf2\\x73\\x3c\\xb9\\xd6\\x83\\x3c\\x22\\xff\\xf2\\xc2\\xe7\\x4d\\xe8\\x1c\\xae\\x7c\\xe7\\xce\\x6d\\x0a\\xde\\x56\\xc0\\xad\\xdb\\xaf\\xbd\\xd5\\xb7\\x41\\xcd\\x20\\xd4\\xed\\x8e\\x6e\\xec\\x84\\x6a\\x2c\\x28\\x0d\\x56\\x59\\x4b\\x6d\\xdb\\x3c\\x12\\xdd\\x9d\\x80\\xc7\\x31\\x5d\\xe3\\x67\\xa9\\x9d\\xfe\\x92\\x49\\xae\\xa8\\xe6\\x5a\\x46\\xe8\\xa1\\x54\\x0b\\xb2\\x39\\x16\\xe9\\x85\\xd6\\x5b\\x6c\\xe5\\x9f\\x1b\\x5e\\x5e\\x47\\xb7\\x18\\x82\\xdc\\xb3\\xb1\\x9e\\x0e\\x4f\\xe6\\x67\\xdc\\x7f\\x8b\\xcc\\x87\\x24\\xcc\\x33\\x50\\x53\\x31\\x22\\x0a\\x5e\\x54\\x88\\xb7\\xfb\\x02\\x34\\x17\\x03\\x5b\\x4f\\x60\\xbf\\xdd\\x5e\\x08\\xdd\\x26\\x0d\\x1b\\xa7\\xd8\\x18\\x53\\x32\\x43\\x63\\x35\\x47\\x53\\x0b\\x2e\\xa5\\xe5\\xb7\\x2c\\xfb\\x18\\x23\\x2f\\x82\\x96\\x11\\x3d\\x39\\x83\\x76\\x58\\x70\\xc8\\x5f\\x32\\xd6\\x2c\\xdb\\x74\\x17\\x98\\x19\\x02\\xd6\\xb4\\x45\\xa7\\x02\\x08\\x6c\\x47\\xee\\x53\\x16\\x0e\\xa1\\x57\\xe9\\x40\\xc4\\xa9\\x25\\x3b\\xf4\\x57\\xd3\\x9d\\x48\\xdc\\x41\\x00\\xf4\\x54\\x79\\x5b\\x3a\\x32\\x8f\\xe8\\x67\\xd3\\xfd\\x31\\xcb\\xe7\\xde\\xac\\xde\\x48\\x3b\\xe4\\xbc\\x5b\\x24\\x5f\\x2f\\x4f\\x0a\\xb7\\x9d\\xc6\\x99\\x19\\x93\\x67\\x72\\x05\\xf0\\xac\\x2e\\xaf\\xde\\xae\\xf1\\xef\\x17\\xd3\\x1b\\x31\\xf6\\x7f\\x18\\x6e\\xb7\\xbd\\x6d\\x20\\x0a\\x7c\\x04\\xb0\\xad\\x23\\xd2\\x8a\\x8b\\xb7\\xa9\\x9a\\x2f\\xb6\\x0e\\x8b\\xa2\\x99\\xd0\\xab\\xec\\x39\\xe7\\xfc\\x58\\x7b\\x01\\x0f\\x40\\x46\\x9c\\x66\\x8d\\x07\\xcb\\xa0\\xdb\\x8a\\x5a\\xca\\xaa\\xbb\\xa3\\x9f\\x02\\x14\\xa8\\xc2\\xbc\\x6f\\x14\\xd2\\x0a\\xa6\\x4e\\x88\\x84\\xf6\\x67\\x2c\\x7b\\x69\\x69\\x22\\x45\\xc2\\x24\\x69\\x5f\\x75\\x48\\x60\\x2d\\xbf\\x6a\\xca\\x86\\x82\\x19\\x1c\\x53\\xf9\\xa5\\x57\\xc7\\x16\\xb4\\xf3\\xd9\\x3f\\x2c\\xc3\\x0e\\x57\\xa3\\x8e\\x43\\xf2\\x32\\x1c\\x98\\x08\\x91\\x82\\x94\\x30\\x25\\x25\\x84\\x37\\x2d\\x84\\x6e\\xea\\x10\\x3d\\xd4\\x58\\x8a\\x86\\xe8\\x1f\\xf7\\xb6\\x41\\xc3\\xa5\\xc4\\xf0\\x4d\\x58\\x7d\\xdb\\x38\\x8d\\x39\\xb0\\x65\\xa1\\xed\\x28\\x6b\\xa9\\x6a\\x2a\\x61\\x91\\x47\\x42\\x43\\xc6\\x23\\x0d\\x9d\\xf8\\x86\\x78\\xce\\xfb\\x92\\x83\\x9d\\xa8\\xaa\\xab\\x43\\xf7\\x1f\\x4a\\x84\\xeb\\x7c\\x9e\\x15\\x57\\xff\\xaa\\x6b\\xd1\\x66\\x9f\\x04\\xde\\x53\\x85\\x6b\\x95\\x72\\xa7\\xf8\\x1e\\xed\\xe4\\x5e\\x12\\xe3\\x56\\x04\\xaf\\x77\\x1e\\x24\\x7f\\xda\\xe9\\x34\\xdc\\x2b\\x88\\xb0\\xc1\\xb2\\x99\\x0d\\xf8\\x94\\x65\\xf4\\xe7\\x95\\x23\\x2e\\x9d\\xf8\\xa7\\xbc\\x5f\\xaf\\xef\\x08\\xb8\\x41\\x7d\\xde\\xfa\\x97\\x1a\\x8c\\xf7\\xc4\\xaf\\xbd\\xb9\\x3a\\xef\\xa0\\xf5\\xc8\\xf9\\xb4\\x41\\xf5\\xce\\x59\\xd3\\xb0\\xba\\xc9\\x3e\\xff\\xdb\\x29\\xb4\\x84\\x49\\x66\\x02\\x0b\\x94\\x8a\\xaa\\x18\\xa2\\x51\\x25\\xe1\\xea\\xe0\\x4e\\x8e\\x91\\x8a\\x62\\xbe\\x13\\x11\\x66\\xcb\\x67\\x6a\\x3a\\xaa\\x17\\x5b\\x8d\\x1d\\x1b\\xf2\\x45\\xcb\\x10\\x61\\x68\\x93\\xe8\\xb8\\x92\\xf1\\x0c\\xfb\\x52\\x32\\xad\\x9e\\x35\\x18\\x6e\\xb5\\x25\\x7f\\xa5\\x09\\x5e\\x37\\xa4\\xa7\\x98\\x90\\xbb\\x2a\\x00\\xc7\\xe2\\xb4\\x48\\xbe\\x31\\xc8\\x92\\xb0\\x0b\\xee\\x27\\x43\\x0f\\xd6\\x9c\\xc9\\x2c\\x0d\\x03\\x72\\x54\\xee\\x5d\\xc2\\x16\\xb4\\xf9\\xd6\\x16\\xb3\\x83\\xce\\xca\\x42\\x15\\x2d\\x67\\xce\\x6d\\xeb\\x42\\x43\\xaf\\xeb\\xc1\\xdc\\xa7\\xaa\\x20\\xea\\x84\\xbc\\xfa\\x4b\\xc9\\xf5\\xe3\\x9f\\xd7\\x8e\\x4b\\x53\\x49\\xaa\\x52\\xcf\\x2d\\xc0\\x9f\\x98\\x0c\\x11\\x61\\x6b\\xfe\\xe8\\x85\\x5c\\xd6\\x4e\\xf5\\x19\\x07\\xfb\\xc7\\x5e\\x6f\\x46\\x7e\\x3d\\x79\\x5e\\x47\\x6e\\xdd\\x5a\\xd9\\x3e\\x7b\\x2b\\x31\\xba\\xc4\\x65\\x92\\x78\\xf5\\x18\\xc3\\xfc\\x08\\xde\\xec\\xdf\\x45\\x86\\x4b\\xc9\\x42\\x63\\x97\\x21\\x46\\xe9\\x57\\x60\\x4c\\xd6\\x6f\\x1f\\x2a\\x51\\xba\\x39\\x24\\xe3\\x11\\xe4\\xa6\\x36\\x4a\\x92\\x6f\\x5f\\x35\\x3b\\xd3\\xbf\\xcb\\x80\\xec\\xbf\\xe2\\x39\\xd3\\xc0\\x42\\x9b\\x32\\xfc\\xb6\\x72\\xc5\\xbf\\xe2\\xcd\\xdb\\x6c\\x49\\x5e\\x5b\\x3b\\xb3\\xb9\\x61\\x3e\\x08\\x7c\\xa7\\xa9\\x80\\x1e\\x6b\\xea\\x73\\x72\\xb9\\x28\\xd1\\x7b\\x70\\x0e\\xf4\\xdf\\x75\\x57\\x92\\x6f\\xd0\\xc7\\xa0\\x0f\\x7f\\xd5\\x6a\\x5e\\x76\\x80\\x9e\\xb6\\x4b\\xc0\\xb6\\x4c\\x2c\\xb2\\x65\\xc7\\xc6\\x27\\x24\\xa4\\x57\\x6f\\x68\\x88\\x19\\xec\\x8a\\x1b\\xc4\\x74\\x0f\\xd1\\x62\\xc3\\x0c\\x52\\x4d\\xd7\\x1c\\x32\\xce\\x31\\x53\\x31\\x49\\x97\\x88\\xdc\\x76\\x5b\\x2b\\xaf\\xa0\\xc7\\x48\\xda\\xae\\x07\\x65\\x19\\x8b\\xf5\\x25\\x53\\x6a\\x24\\xeb\\xa1\\xa9\\x1e\\xb2\\xc7\\x30\\x7a\\x76\\x5d\\x64\\x24\\xba\\xe6\\x73\\x55\\x98\\x22\\x90\\x6e\\x1f\\x94\\x7a\\x8e\\x59\\xc0\\x88\\x6f\\x19\\xe9\\x89\\x6c\\x53\\x3c\\x86\\x61\\xe8\\xa2\\x9f\\x80\\xf0\\xb5\\xd4\\x21\\x5b\\x98\\x90\\x47\\x24\\x94\\xbc\\xcc\\x91\\xa7\\xec\\xd4\\x31\\x0e\\xf3\\xbf\\xde\\x1e\\xa9\\xab\\x9b\\x5b\\x39\\x6e\\x93\\xbc\\x10\\xcd\\x1e\\x24\\x90\\x72\\x08\\x38\\x11\\xe1\\x5f\\x3d\\x87\\x0b\\xed\\x48\\xc3\\x14\\x09\\xe0\\x7f\\x59\\x21\\xa2\\x92\\x0d\\xfc\\x9b\\xb4\\xb4\\x5a\\x79\\x09\\x59\\x33\\x09\\x12\\x56\\x33\\x69\\xbf\\xfc\\x91\\xd3\\xe8\\x0d\\xb6\\x62\\x46\\xaa\\xcb\\x83\\x76\\xb8\\x10\\xd9\\x2f\\x4f\\xaf\\x74\\xe1\\x7c\\xd2\\xad\\x68\\x8f\\x6a\\xd7\\x17\\x04\\x1d\\x4a\\x8c\\x82\\xd6\\xd6\\x6b\\x6c\\xc4\\x87\\x8b\\xe1\\x06\\xa1\\x8c\\x2a\\x41\\x04\\x32\\x43\\x15\\x73\\xdd\\x07\\x39\\x85\\x93\\xab\\x05\\x5f\\x37\\xda\\x3b\\x8a\\x0d\\x78\\xc1\\x51\\x84\\x5a\\xb3\\x7e\\x90\\x37\\x50\\x19\\x8d\\x6f\\x4c\\x54\\x0e\\x55\\xd9\\x86\\xac\\x63\\x91\\xbe\\x42\\x22\\xf7\\x91\\x25\\xc9\\xe5\\xe5\\x52\\x71\\x23\\xa2\\xec\\x21\\x08\\x4a\\xb1\\x95\\x08\\xbd\\xa7\\x3e\\x7a\\x10\\xf5\\xac\\xe5\\x72\\xf7\\x32\\x72\\xcf\\xdf\\xa5\\x1e\\xce\\xb8\\xde\\x3e\\x06\\x50\\x21\\x5c\\xad\\x61\\x38\\x64\\x6d\\x2f\\x2e\\x71\\x38\\xbd\\xcd\\xcc\\xff\\xbd\\x13\\x55\\x40\\xe8\\x79\\x38\\x4c\\x9f\\xef\\xf0\\x41\\x2d\\xe6\\x9d\\x98\\xcd\\x29\\x29\\x67\\xf0\\x75\\x3e\\x8e\\x3b\\xec\\xcf\\x27\\x98\\x79\\xfc\\xfd\\x1c\\xa6\\xed\\x43\\x42\\xf9\\x6d\\x63\\xac\\xa1\\x53\\x61\\xf4\\xd6\\x6a\\x22\\xa1\\x9f\\x6f\\x65\\xbf\\xbd\\xbc\\xec\\xf4\\xb4\\xb8\\x78\\xd5\\xa3\\x90\\x07\\x03\\x2f\\xf5\\xb5\\x06\\xf6\\x75\\x62\\x17\\x06\\x51\\xa2\\x2c\\x63\\x97\\x90\\x50\\xd7\\x77\\x3b\\x04\\x33\\x4d\\xbd\\x8c\\x0e\\xba\\x4d\\xa5\\x36\\x84\\x35\\x2e\\x0f\\x1d\\x98\\x5f\\x30\\xcc\\x84\\x79\\x37\\x36\\xea\\x89\\x53\\x9d\\x7e\\x57\\x40\\x94\\x3d\\x2f\\x98\\xef\\xc9\\xf6\\xdb\\x61\\x1f\\xfd\\xdc\\x5f\\xdf\\xe8\\xf5\\x41\\x94\\x2d\\x8b\\x37\\xd8\\x3f\\xe4\\x8b\\x37\\x92\\x95\\x09\\x92\\x17\\x49\\x60\\x06\\xb4\\xb3\\x3b\\xef\\x3c\\xed\\xae\\x05\\xa3\\x86\\xf6\\xce\\xed\\x22\\x35\\xd0\\x63\\xeb\\x50\\xbd\\x74\\xa2\\x34\\x61\\x10\\x76\\xa5\\x95\\x2d\\xab\\x35\\x69\\x6e\\x0e\\x76\\x8f\\xe8\\x83\\x03\\xf4\\x6b\\x23\\x50\\x63\\xaf\\x4d\\xfa\\xb8\\x65\\x09\\xde\\x06\\x65\\x45\\xe7\\x57\\x40\\x84\\x24\\xd3\\x8d\\x2d\\x76\\xcd\\x2c\\x88\\x2d\\x57\\x75\\x06\\x72\\x94\\x91\\x87\\x68\\x1d\\xe4\\x5c\\xef\\xde\\x0d\\xc2\\xd2\\xe5\\x65\\xe4\\xdf\\xbf\\xa7\\x7e\\x37\\xc9\\xbf\\xbf\\xea\\x2d\\xca\\x97\\x6a\\x02\\x46\\x55\\x67\\x19\\xbf\\x38\\x58\\xb7\\x74\\x47\\x9a\\x4a\\xe5\\x44\\xed\\x6e\\x1a\\xe0\\x0a\\xa7\\x82\\xe8\\xf9\\x2d\\xba\\xd3\\x8e\\xa7\\x0c\\xa7\\xd7\\xff\\x64\\xf2\\xf9\\x1a\\x14\\xd5\\x2f\\x0b\\xea\\xe3\\xda\\xc0\\x85\\x2d\\x38\\x31\\xae\\x0c\\x33\\xdc\\x62\\x31\\x52\\xa7\\xec\\xb6\\x5e\\x54\\xd4\\x10\\x2d\\xaa\\x14\\xa5\\x90\\x4f\\x15\\x65\\xe4\\x2f\\xbf\\x62\\x58\\x37\\xa8\\x5d\\xc0\\x50\\xcb\\x3b\\x66\\xff\\xe8\\xb6\\xd5\\x83\\x51\\xc7\\x2c\\x8f\\x10\\xc2\\x8c\\xce\\xbc\\x65\\x66\\xc4\\x91\\x57\\x33\\xab\\xd1\\x1e\\x21\\x77\\x5f\\x3f\\xe7\\x45\\x80\\xc7\\x8c\\xac\\xcb\\x1b\\xfd\\xee\\xee\\xf9\\xb2\\xf1\\xe1\\x89\\xee\\xad\\x54\\x87\\x2c\\x5f\\xa4\\x37\\xe8\\xa2\\xc4\\xec\\xf2\\xb0\\xf6\\xd9\\x2c\\x2e\\xec\\xc9\\x93\\x0d\\x08\\x30\\x7d\\x19\\x98\\x77\\xf7\\xbe\\x0c\\x0b\\x53\\x79\\xfc\\x1a\\xd9\\x9e\\xd6\\x49\\x09\\x27\\xf1\\xbb\\xcf\\xdd\\x44\\xfc\\xc3\\xc7\\xfd\\xb5\\x28\\xb1\\xd9\\xa5\\xad\\xf3\\xf2\\xa4\\x79\\x17\\xc7\\x4a\\x74\\xf0\\x49\\xd8\\x9b\\x66\\xc2\\x30\\xa0\\x7f\\x4a\\xcd\\xdb\\x2a\\xb5\\x1d\\x09\\x9a\\xda\\x8d\\xe6\\x3e\\xe5\\x0f\\xa5\\xe5\\x02\\x12\\xfe\\x41\\x91\\x84\\xaf\\x84\\x53\\xba\\x15\\x7c\\x38\\xc4\\x54\\x9e\\xcb\\x52\\xde\\x5f\\x08\\x96\\x4c\\xdf\\x28\\xcd\\x13\\x1a\\xae\\x74\\xbb\\x2e\\x03\\xa5\\x72\\x56\\xf9\\x87\\xd7\\xcd\\xf3\\xad\\x56\\xe3\\xec\\xe6\\xfb\\x5c\\x2a\\x6b\\xfa\\x31\\xe7\\xfb\\x36\\x12\\xed\\xdb\\x95\\xc1\\x05\\xa8\\x14\\x7c\\x45\\xc7\\x90\\x71\\xb7\\xc5\\x3f\\x34\\x82\\x64\\xea\\x88\\xdb\\xa0\\xa8\\x17\\x4a\\x4e\\x87\\xc0\\xe4\\xab\\x15\\x41\\xe5\\x85\\x68\\x53\\xf5\\x6e\\xc2\\x8e\\x15\\x96\\x86\\x40\\xd6\\x9a\\x3b\\x65\\xfb\\x11\\x14\\x27\\xcd\\x0d\\xc2\\x8d\\x42\\x4c\\x0e\\x52\\x92\\xef\\x34\\xd2\\xc0\\x25\\xcf\\x8b\\x75\\x72\\x46\\xcd\\xe1\\xc1\\xb4\\xca\\x9b\\x0b\\x27\\xe9\\x05\\x9c\\xc3\\x6f\\x3d\\x13\\x6f\\x69\\x88\\xb2\\x4b\\x3e\\xf7\\xdc\\xe5\\xad\\x61\\xdb\\x94\\xfa\\xe0\\x6a\\x6c\\x27\\xcf\\x8f\\x49\\x41\\xe7\\xc4\\x1a\\xb8\\x0d\\xb2\\x3e\\xf0\\x46\\x83\\x7a\\xf3\\x9e\\x98\\xb8\\x24\\x77\\xec\\x8d\\x0f\\x17\\x2f\\xf4\\x2c\\x10\\x13\\x61\\xed\\xa9\\x7c\\x2e\\x85\\xa8\\xae\\x44\\x5b\\xd1\\xe9\\x46\\x3a\\xcb\\x6c\\xe9\\xdb\\xba\\x4b\\xdf\\x7e\\xd2\\xa4\\x1f\\xfe\\xb5\\x1e\\xe0\\x26\\x9d\\x07\\x3b\\xac\\x2a\\x5e\\x37\\x46\\x55\\xc0\\x4c\\xef\\x93\\x73\\xda\\xd5\\x83\\x67\\xc9\\x5f\\xa6\\xed\\xe6\\x3a\\xfc\\x97\\x01\\x41\\x80\\x9d\\x93\\x24\\x92\\x54\\x87\\x86\\x60\\x6f\\x1c\\xca\\xae\\x8e\\xe3\\x8b\\x92\\x73\\x01\\x44\\x6a\\x93\\x2b\\x38\\x35\\xf0\\xeb\\xb3\\x32\\xb3\\x9c\\xf5\\xb3\\x9e\\xb4\\xc5\\xf4\\xa2\\xe2\\x2d\\xe1\\xf1\\xab\\x64\\x1e\\x1e\\x2a\\x8a\\xd6\\xdc\\x28\\x78\\xe0\\x6f\\x7c\\x0b\\x74\\x7e\\x2f\\xc8\\x90\\xa6\\x97\\xb5\\xcd\\x0d\\xd6\\x13\\x0f\\xce\\xaf\\x59\\x7e\\x27\\x6c\\x2c\\x7e\\x84\\x8d\\xad\\xc5\\x13\\x09\\x3e\\x6c\\xec\\xad\\xb8\\x0f\\xc9\\x1d\\xc3\\x22\\x3e\\xe6\\x7d\\xd3\\x17\\xa2\\x4c\\x2e\\x48\\x25\\x90\\xf3\\x3e\\x9a\\xad\\x3b\\x67\\x90\\x4f\\xfe\\xb0\\x7c\\xe5\\x6e\\x9d\\x8e\\xe1\\xae\\xd2\\xc7\\xa4\\xee\\xb2\\xd7\\x37\\x55\\x9b\\xaf\\x30\\xa4\\x4c\\xc5\\xc3\\xb7\\xca\\x04\\x61\\xc3\\xd0\\x8c\\xf4\\x8c\\xc4\\xe4\\x85\\xa9\\x1a\\x02\\xbd\\x6c\\x65\\x76\\x1b\\x5a\\xc2\\x8e\\x34\\x96\\x89\\xb4\\x6f\\xc6\\x62\\xc8\\x79\\x19\\x80\\x4a\\x1f\\x9c\\x9d\\xd3\\xc6\\xf5\\x7b\\x20\\xc0\\xc5\\x98\\x1b\\x75\\x81\\x74\\x0f\\x32\\x4f\\x75\\x57\\x41\\x34\\x4d\\x32\\x5f\\x56\\xff\\xb4\\xc0\\xe7\\x6f\\xf0\\x0c\\xaf\\xb9\\xc7\\xaf\\x61\\x05\\xb9\\x20\\xfb\\x57\\x46\\xfa\\xaf\\x2c\\x03\\x4b\\x51\\x75\\x03\\x51\\x3d\\xb2\\x98\\x9f\\xc4\\x9a\\x6d\\xfd\\xa9\\x26\\x5c\\x3f\\x89\\xd5\\x8c\\x4d\\x26\\xb9\\x06\\x4d\\x6e\\x6f\\x5f\\x4e\\x35\\x8d\\xd3\\x22\\x66\\x74\\x2a\\x54\\x72\\xd6\\x46\\xf0\\xf7\\xed\\x0f\\xfe\\xde\\xc0\\xa5\\x07\\xae\\x6a\\x22\\xa2\\xef\\xcb\\x67\\x93\\xc3\\xbc\\x90\\xdd\\x90\\x86\\x69\\x5a\\xc8\\xd0\\x04\\xfa\\x81\\xe7\\xa5\\x81\\xaf\\x6c\\xc9\\x0d\\xc0\\xde\\x32\\x08\\xaf\\x93\\xab\\x70\\xb7\\xca\\x32\\x04\\x6f\\x03\\xf6\\x96\\xde\\x16\\xf3\\x17\\x1b\\x9c\\xed\\x4b\\x13\\xa0\\xd3\\x89\\x5a\\xe3\\x22\\x4e\\xdf\\x27\\x05\\x5b\\x0b\\x5d\\x8d\\x83\\x5f\\x34\\xe6\\x41\\x99\\xe0\\x7d\\xab\\x4f\\x5e\\x4b\\xa7\\xfc\\xde\\x21\\xb9\\x37\\xc7\\x4f\\xb4\\x58\\xcb\\xe8\\x22\\x6a\\x42\\x9f\\x3e\\x22\\x9e\\xca\\xe0\\x96\\xb8\\x62\\xc5\\x2c\\x90\\x56\\xba\\x83\\x4f\\x64\\x00\\x2f\\x9f\\x17\\x60\\x48\\xaa\\xa5\\x73\\xbc\\x41\\x39\\x35\\x69\\xd8\\x25\\xab\\xda\\xda\\xed\\xe0\\xed\\xb5\\xa3\\xca\\x37\\x1e\\xd5\\x6f\\x9e\\x49\\xc7\\x25\\x45\\xb9\\x10\\xe7\\x95\\x84\\x42\\xda\\x0f\\x15\\x0a\\x09\\x63\\xc5\\x6b\\x2b\\xdd\\x85\\xc3\\x9d\\x24\\x19\\xa2\\x2a\\x69\\x36\\xc3\\x67\\x51\\x68\\xb7\\xd7\\xa9\\x39\\x23\\xd7\\x1c\\x90\\x6a\\x43\\x60\\xea\\xe2\\x9d\\x6e\\x74\\xe7\\xc7\\x53\\xac\\xe7\\xeb\\xc2\\x5c\\x52\\x66\\x11\\x8e\\xf5\\x0d\\xb1\\xe3\\x01\\x79\\xa2\\x1a\\x48\\x69\\x1d\\x95\\xfe\\xa8\\x4f\\x7d\\xc1\\x8f\\xca\\x76\\x58\\x27\\xfd\\xd7\\x57\\x5d\\x8a\\x4d\\xbe\\x12\\xd2\\x5f\\x85\\x22\\xb1\\x6d\\x36\\x5a\\x5b\\xeb\\x68\\xcc\\xae\\xe7\\x29\\xf3\\x1e\\xd3\\xfb\\x97\\x1e\\xd3\\x4b\\x6d\\xfe\\xa7\\x6d\\xd2\\x9a\\xf1\\xcb\\x56\\x74\\xc1\\xaa\\x77\\x95\\x5c\\x99\\x04\\xf5\\xe2\\xe0\\x3f\\x67\\x44\\xb9\\xa5\\x10\\xf9\\xb3\\xd2\\x26\\x5c\\x70\\x2e\\xae\\x48\\x8a\\x73\\x6a\\x12\\xc7\\xe0\\x09\\x78\\xa5\\xd4\\x82\\x16\\x68\\x5b\\x91\\xb2\\x64\\xa5\\x49\\x57\\x6b\\xe4\\x19\\xe4\\x1f\\x44\\x2c\\x1e\\x04\\x42\\x52\\x4b\\xae\\xdf\\xb2\\xd7\\xf9\\x07\\x1d\\xf8\\x5d\\x0d\\x9e\\x31\\x84\\xaf\\x31\\xe6\\xfe\\x4d\\x19\\xa2\\xf9\\xf4\\xbb\\xba\\x78\\xed\\x2a\\xc7\\x74\\x5a\\x21\\x39\\x8c\\xa8\\x6c\\xbe\\x69\\xc3\\x36\\x42\\x0b\\x07\\x6e\\x70\\x46\\x86\\x20\\x86\\x2b\\x62\\x61\\xf2\\xda\\xf0\\xa4\\xa5\\xe8\\xe0\\x08\\x4f\\xb0\\x29\\x63\\x49\\x66\\xa7\\x87\\x66\\xc4\\x91\\xae\\x9a\\x23\\x73\\xa4\\xae\\x7b\\xd4\\x07\\x21\\xd1\\xf5\\x8d\\x70\\x70\\x57\\x53\\x39\\xdb\\x76\\x2f\\x74\\xfd\\xbe\\x0d\\x86\\xa4\\xbd\\x7c\\x30\\x1c\\x27\\x66\\xbf\\x6a\\x6b\\x77\\xcd\\xb2\\x8f\\x6c\\xf5\\x13\\xc5\\xdb\\x78\\xfc\\x1f\\x9d\\x39\\x66\\x25\\x9b\\xbc\\xda\\xad\\xab\\x52\\x9b\\x60\\x8d\\x2b\\x11\\xae\\xcb\\xfb\\x60\\x1c\\xe7\\xe3\\x6d\\xc8\\x52\\xdc\\xdd\\x62\\x4d\\x2b\\xa1\\x83\\x43\\x92\\x7d\\x07\\xfa\\xca\\x55\\x71\\x4e\\x4d\\xef\\x87\\x5c\\x44\\xf9\\xcb\\xcb\\xb3\\x36\\x90\\x04\\xfe\\x76\\x9c\\x0c\\x78\\x2e\\x16\\x4b\\xd5\\x05\\xb0\\xf5\\xd6\\x67\\x2b\\xb8\\x3e\\x3b\\x28\\x37\\x44\\x5a\\xca\\x19\\x24\\xe5\\xf1\\xdc\\xbd\\xdf\\xf7\\x5c\\xed\\x7c\\xbe\\x0c\\x20\\x61\\xca\\x3b\\x9c\\xfd\\x79\\x99\\x67\\x95\\xd8\\x91\\x8d\\x73\\x34\\x09\\xf0\\x79\\x5b\\x8a\\x97\\xf0\\x3c\\xa4\\xc2\\xef\\x05\\xbd\\x18\\xf5\\xdf\\xc3\\x1f\\x8b\\x00\\xd9\\x47\\xb2\\x2f\\x0d\\x63\\x50\\x9e\\x9d\\xc5\\xc0\\x8e\\x0c\\x63\\xe8\\xc3\\x6c\\xd6\\x94\\x6e\\x14\\xd5\\xb4\\x8e\\x99\\x50\\x8a\\x38\\xfc\\x68\\x1c\\x7c\\xc0\\xfc\\xc1\\xe8\\xf4\\x21\\x70\\xc3\\xe5\\xed\\x7c\\x33\\xee\\xc3\\x9d\\x76\\xe4\\xfd\\xa7\\x95\\xf2\\x99\\x57\\x8c\\x00\\x47\\xad\\xa9\\xd4\\xed\\x73\\xda\\x13\\xee\\xa0\\xab\\x6c\\xf1\\x4c\\xb0\\x83\\xb2\\xf7\\x05\\x37\\x97\\x80\\x68\\xc8\\x0c\\x77\\x60\\x70\\xab\\x1e\\x1a\\x69\\xb2\\xe4\\x52\\x53\\xe0\\x23\\x04\\x90\\x64\\xeb\\x0f\\xe1\\x97\\x76\\x36\\x76\\xf4\\x60\\x64\\x9a\\x97\\x29\\x12\\x4c\\x42\\xad\\x0d\\x1a\\x4d\\xc0\\x9a\\x6a\\x18\\x50\\x56\\x0e\\xfc\\xdb\\xb5\\x92\\xd3\\xba\\x41\\x50\\xf2\\xd5\\x32\\x2f\\x96\\x54\\x4c\\x9e\\x4a\\x9b\\x54\\xdc\\xa7\\x8a\\x56\\x9b\\xe4\\x6c\\xda\\x1d\\x45\\x3c\\x40\\x63\\xce\\xcd\\x96\\xc6\\x8a\\x3c\\x7e\\xed\\xc0\\xb7\\xb8\\xe1\\xf7\\xa4\\x78\\x1f\\xcf\\xd0\\x5c\\x19\\xd3\\x46\\x33\\x62\\xb5\\x1e\\xd7\\x3f\\xa8\\xf7\\xf5\\x64\\x42\\x3a\\x1d\\x1f\\xda\\x49\\xf1\\xfb\\xfe\\xdd\\xc7\\x38\\xb2\\xdf\\x2f\\x71\\xa9\\x77\\x57\\xdf\\xfb\\xb2\\x74\\x78\\x14\\xef\\x77\\xfe\\x67\\x4f\\x82\\x0f\\xe3\\xb3\\x46\\xff\\x31\\xbc\\x4c\\xb3\\xc4\\xe5\\xe6\\xb3\\x87\\x65\\xd7\\x6c\\xf7\\xf7\\x60\\xa4\\x46\\x9c\\xdb\\xbf\\xe2\\x74\\x8b\\x3c\\x1f\\x97\\x60\\x19\\xa7\\x03\\xa1\\x0b\\xe8\\xdb\\x77\\xd4\\xdb\\x4d\\x68\\xf5\\x73\\x99\\xa6\\xa5\\x73\\xb2\\x69\\x94\\xe8\\xa0\\x23\\x48\\x34\\xa3\\x0e\\x90\\xe6\\xad\\x9f\\xbf\\x38\\x40\\x27\\xe5\\x94\\xfa\\xa9\\xfa\\x4d\\x20\\xa0\\x91\\x10\\xb1\\x6d\\xc5\\x13\\x32\\x40\\x13\\xb0\\x73\\xac\\xe6\\xc1\\xfa\\x29\\xc0\\x40\\x22\\x45\\x1a\\xb5\\x14\\xc7\\xfa\\xa6\\x84\\x27\\xc4\\x0b\\xa4\\x7a\\x49\\xc8\\x4e\\x34\\x45\\x2c\\xc1\\x63\\xff\\xbc\\x2f\\x46\\x1d\\x7f\\x69\\xa3\\x7b\\x52\\x3c\\x6f\\x53\\xe6\\xe3\\xe7\\xdd\\x52\\x40\\x69\\x0b\\x18\\x61\\xe9\\x7b\\x71\\xf8\\x7f\\xf3\\xeb\\xc4\\x46\\x0b\\x16\\x7b\\x59\\xf9\\x90\\xe4\\x7a\\xfa\\x08\\xcd\\x3e\\x05\\xc7\\x08\\x56\\x1b\\x82\\x74\\x3d\\x28\\xad\\x73\\xa5\\x39\\x62\\xac\\x21\\x63\\x25\\x3a\\xe6\\xd0\\xc9\\x38\\x06\\x1f\\x54\\xb5\\xcb\\x73\\x32\\xd6\\x24\\x07\\xfa\\xa0\\xcf\\x4d\\x9a\\x7b\\xea\\x9e\\xf4\\xe1\\x42\\x84\\xab\\xce\\x65\\xe7\\x6b\\x68\\xe9\\x6e\\x57\\xb5\\xab\\x6a\\x61\\xc8\\xf0\\x8b\\x5d\\xaa\\x71\\x85\\x05\\xe1\\x97\\xe6\\x9d\\x46\\x3d\\x60\\x4f\\x38\\x48\\x14\\x44\\x25\\x2e\\xe0\\xc4\\x95\\x7e\\x24\\x26\\x2d\\x39\\x97\\x64\\x55\\xd7\\xfb\\x3a\\xa4\\x63\\x52\\x77\\xb0\\x22\\x51\\x5c\\xdb\\xc1\\x74\\x9e\\x13\\x5e\\x12\\x7c\\x78\\x97\\xd7\\xbb\\xcf\\x9a\\xe4\\xfa\\xf8\\xcf\\x2d\\x15\\x9b\\xad\\xf5\\x15\\x06\\xf5\\x4a\\x29\\x7c\\x0e\\x09\\xed\\x88\\x6d\\xa0\\x75\\xdc\\x4c\\x85\\xe4\\xe3\\xfb\\xe8\\x9e\\xa9\\x53\\xf2\\xd2\\xe0\\x75\\x92\\x06\\x85\\x7b\\x6e\\x11\\x9d\\x9e\\x5e\\x46\\xff\\x96\\x7d\\xf8\\xa7\\x67\\x87\\x56\\x23\\x93\\x69\\xe9\\x55\\x40\\xbf\\x95\\x62\\x5d\\x01\\xdf\\x62\\xf6\\x66\\x93\\xfd\\x75\\xd9\\x2b\\x2e\\x12\\xc0\\x7f\\xb9\\x8e\\xbf\\x86\\x83\\xd1\\x9a\\x09\\xaa\\xd2\\x91\\xc2\\x08\\xba\\x6e\\x5a\\xc4\\x95\\x80\\x9e\\xa2\\x71\\x37\\x62\\x8a\\x51\\x12\\x5a\\x0b\\xec\\x26\\xa9\\xd1\\xfc\\xfa\\x39\\xbc\\x3e\\x79\\x44\\x85\\xb6\\x2a\\x7b\\x9e\\x39\\xbf\\x35\\xe5\\xe4\\xee\\x6c\\x7d\\xde\\x6c\\xe5\\x9e\\xe4\\x2b\\x50\\x07\\x93\\x03\\x91\\x49\\x15\\xc6\\x6b\\x16\\x7d\\x9f\\xcf\\xa8\\xe9\\xd5\\x21\\x27\\xa6\\x0a\\x26\\xa8\\x85\\x67\\x25\\xdb\\x77\\x85\\xe5\\x9e\\xe0\\xb7\\x85\\x6d\\xdc\\xaf\\xf5\\x68\\x6c\\x2b\\x14\\xbd\\x17\\x4c\\x26\\x3a\\xed\\x9b\\xe2\\x69\\x37\\x55\\xca\\x43\\x61\\x7e\\x3c\\xdd\\x84\\x83\\xc3\\x23\\xa3\\xb3\\xb6\\xfb\\xa4\\x07\\x83\\x9f\\x8d\\xbf\\xfd\\x30\\x57\\xd9\\xbb\\xad\\xf2\\xbc\\x5a\\x44\\xc4\\x34\\x5d\\xb3\\x71\\xa0\\xab\\xb9\\xc6\\xbb\\x71\\x6c\\xa1\\xe5\\x30\\xba\\x06\\x26\\x3b\\x38\\x10\\x4f\\xf9\\xed\\x6c\\x7a\\x7f\\x0c\\x35\\xd3\\xb7\\xe1\\x79\\xab\\xe3\\x90\\xf0\\xf1\\x45\\x80\\x7a\\x15\\x1c\\x3c\\xab\\x9c\\xe1\\x1b\\x7e\\xe4\\x95\\x74\\x62\\x51\\x17\\x55\\x93\\x72\\x32\\x1a\\xb9\\x80\\xfe\\xde\\xff\\xb3\\x92\\x3d\\x98\\x19\\xe6\\x01\\x23\\xac\\x2f\\x0b\\x7c\\x18\\x23\\x1c\\xf5\\x94\\x86\\x6c\\x21\\xaa\\x34\\x0d\\xcc\\xf6\\x24\\x31\\x5e\\x30\\xb2\\xad\\x30\\xab\\xb8\\xa3\\x8e\\x82\\xe3\\x37\\xb2\\xf1\\xf6\\x8b\\x2b\\xc8\\xf5\\x59\\x88\\x4f\\xaf\\xc2\\xed\\xbf\\x9f\\x34\\xd5\\x94\\x6b\\xc2\\xa3\\x93\\x1e\\x3f\\xa5\\xfd\\xc7\\xff\\x10\\x33\\x5d\\x8c\\x91\\xd1\\x30\\xeb\\xbb\\xa3\\x26\\xc7\\x61\\x39\\x1e\\x2d\\x7f\\xdf\\xa1\\x8c\\x2f\\x29\\x53\\x08\\x07\\x0c\\x03\\x01\\x20\\x93\\xed\\x39\\x9d\\x6f\\x5d\\x21\\x2f\\x6a\\x61\\x05\\xd5\\x2c\\xd0\\x1b\\xb4\\x24\\x45\\xcb\\x24\\x7a\\x2f\\x50\\x9a\\xc7\\xa9\\x93\\x82\\xc7\\xfe\\xbf\\x0d\\xbc\\x55\\x54\\xc8\\xcf\\x5b\\xac\\x3d\\x77\\x80\\xf6\\x07\\x24\\x50\\x9f\\xb0\\xac\\x62\\x1c\\xf5\\x42\\xf2\\x69\\xd4\\xd3\\xf7\\x17\\xed\\xe2\\xe5\\x33\\x8d\\x16\\x05\\xe2\\x76\\x41\\x29\\x2f\\xd4\\x22\\x5d\\xe8\\xef\\xfc\\xbb\\xb3\\x84\\x59\\x8f\\xd3\\x5b\\x9b\\xbd\\x55\\x89\\x3f\\x6f\\xf7\\x72\\x0e\\x3d\\xc9\\xe0\\xab\\x4e\\x69\\x85\\x98\\x98\\x19\\x41\\x0a\\x58\\x8e\\x59\\x41\\x13\\xef\\x73\\x58\\x30\\x14\\xf5\\x29\\xf4\\x41\\x59\\x94\\x91\\xce\\xbb\\xcc\\x23\\xe2\\xe0\\x2f\\xbf\\xd8\\xdc\\x65\\xe8\\xee\\x10\\x32\\x2c\\x0e\\xbf\\x05\\x10\\xce\\x45\\x7a\\x3a\\xe0\\x14\\x7e\\xf0\\x2b\\x0b\\xa6\\xf9\\x80\\x5c\\x7d\\x12\\x66\\xe4\\x23\\x9d\\x91\\x3e\\x48\\xce\\x84\\x6d\\xeb\\xf0\\xb5\\x71\\x05\\x0b\\x4c\\x53\\xef\\x11\\xc2\\xb4\\x8f\\xd2\\x0e\\x7d\\x3b\\xa4\\xb8\\xe4\\x66\\xc4\\x22\\xdb\\xa3\\x3e\\xc7\\xab\\xe4\\x62\\xee\\x5f\\xfe\\xd8\\x4f\\xb9\\xbf\\x48\\x71\\x4d\\xdc\\x21\\x41\\x5e\\x1f\\x6a\\xb6\\x64\\xa5\\x11\\x48\\xf5\\xd9\\xe7\\xdd\\x0d\\xcd\\x2f\\x78\\xa6\\xa7\\x3b\\x5c\\x3a\\x45\\x83\\x71\\x41\\x42\\xf9\\xdb\\xe7\\x83\\x91\\x78\\x07\\xb1\\x06\\x29\\x8c\\x45\\xfe\\xa5\\x61\\xda\\x80\\x43\\xbb\\x2b\\xf9\\x29\\xab\\x3a\\xde\\x8a\\x93\\x16\\x24\\x41\\x5e\\x39\\x41\\xcc\\x38\\xd3\\x13\\x78\\xb1\\x7b\\x25\\xfa\\xf0\\xb0\\x2f\\x35\\xd2\\xf6\\x82\\xd0\\x39\\xba\\xcb\\x0a\\xdf\\x34\\x53\\xd9\\x3f\\xbb\\xbd\\x4a\\xd4\\xdf\\x2a\\xf6\\xd9\\xca\\xb6\\x58\\x7b\\x0a\\xf1\\x79\\x20\\x89\\x29\\x51\\x48\\xac\\x85\\x5f\\x42\\xa6\\x85\\x4f\\x07\\x03\\x0b\\x46\\x45\\x94\\xaa\\x21\\x20\\x94\\xd0\\xb4\\x40\\x7d\\x98\\x00\\x72\\x76\\xe6\\xca\\x10\\xa4\\xdf\\x51\\xd2\\x22\\xeb\\xfb\\xf6\\x34\\x58\\x7d\\xee\\x2a\\x2e\\x2d\\xb4\\x35\\x91\\x65\\x84\\x5f\\x59\\x36\\x7a\\x76\\xe6\\x14\\x56\\xba\\xb7\\x88\\xd6\\x2e\\xe0\\xb3\\xa7\\x9d\\xf5\\x45\\x15\\x10\\x80\\x41\\xa9\\xec\\x18\\x10\\x3e\\x48\\x9c\\xb6\\x45\\x04\\x82\\x06\\x07\\xa8\\x50\\xdf\\x43\\xa8\\x05\\x4d\\xec\\xec\\xc0\\x70\\x42\\x7d\\xdc\\xf4\\x04\\xea\\x8f\\x93\\x9f\\xae\\x0c\\xcb\\xc8\\xc1\\xee\\x0c\\x11\\x09\\x84\\xce\\xfa\\x26\\xfa\\x27\\xee\\x9a\\x90\\x63\\x94\\x1d\\x8e\\x19\\x58\\xb7\\x1b\\x17\\x8b\\x55\\x56\\x54\\xbb\\xc4\\xe4\\x29\\x37\\xfe\\xa8\\xd1\\x28\\xd8\\x93\\xde\\xc5\\x69\\xbb\\x68\\xb7\\x10\\x29\\x15\\x65\\x2c\\x9a\\x36\\x32\\xed\\xfa\\xb6\\xb8\\x59\\xf8\\x16\\xb9\\xc0\\x12\\xac\\x13\\xef\\x72\\x51\\x48\\xfa\\xb4\\xec\\x59\\x99\\xd4\\xed\\x7d\\x2a\\x53\\x45\\x0b\\xfb\\x19\\x9c\\x38\\x20\\x48\\x7b\\xea\\x02\\x2a\\xa3\\x9d\\x19\\x81\\x49\\x88\\x20\\xbb\\xcf\\xc3\\xc3\\x2a\\x1f\\x4f\\xf3\\x16\\x08\\x67\\x86\\x2e\\x66\\xe4\\x22\\x29\\x63\\x75\\xa8\\xdd\\xa3\\x0a\\xb1\\x3c\\x88\\x3a\\xa5\\xec\\xc7\\x11\\x87\\x50\\x9f\\x42\\x8a\\x40\\xfc\\xbc\\xad\\xa9\\xe4\\x42\\x27\\xb4\\xca\\x95\\x83\\x91\\xad\\x0c\\xf2\\xf3\\x57\\x7e\\xa5\\xc3\\x11\\x67\\x2a\\x84\\x1f\\xa4\\xbf\\x6f\\x86\\x21\\x69\\xcc\\x28\\x65\\x06\\x16\\xa0\\x15\\x5a\\xf9\\x7e\\x68\\x8f\\xce\\x4b\\x7e\\x14\\xd2\\x04\\xf1\\x8b\\x24\\x71\\x02\\x5f\\xc7\\x8a\\x11\\x88\\x1f\\xdd\\x8f\\x91\\xc0\\x58\\x9f\\x36\\xbe\\x25\\x1b\\x4e\\xaa\\x34\\xa1\\x2d\\x42\\x6e\\x0c\\x74\\xdb\\x73\\x64\\x13\\x4f\\xa4\\x82\\x28\\x7a\\xe1\\xb6\\x0b\\xfa\\x4b\\x40\\xa6\\xa5\\x8f\\x19\\xc1\\xa4\\x9e\\x83\\x87\\xd6\\x0a\\xde\\x35\\x5c\\x6d\\xb3\\xcf\\x47\\x1d\\x94\\xd8\\x94\\x6e\\x42\\xfd\\x29\\xba\\x21\\x75\\x7e\\xea\\x29\\xc7\\x77\\x4c\\x5b\\x3f\\xc4\\xbc\\xb1\\x2b\\x71\\x13\\x59\\x8c\\x56\\x0e\\xa9\\x43\\x19\\x70\\xb7\\x35\\x1b\\x97\\xd3\\x9d\\x43\\x78\\x05\\xcf\\xff\\xa5\\xa8\\x61\\x6d\\xc1\\x53\\xd3\\xfa\\x23\\x3f\\x9b\\x91\\xc7\\xf1\\x92\\x61\\x36\\x42\\x22\\x5f\\xed\\x3d\\x0e\\x7e\\x67\\x95\\xd3\\xef\\xee\\x24\\x9a\\x11\\x5e\\x4e\\xdd\\xee\\xa6\\xda\\xee\\x1c\\x6e\\xc8\\x86\\xa0\\x3f\\x0d\\x5d\\x4f\\xbb\\x19\\x62\\x91\\x27\\xc8\\x04\\x29\\xa1\\x5c\\xa4\\xe0\\x51\\x1f\\x47\\x62\\x9d\\xa9\\x56\\x7f\\x8b\\x32\\xd8\\x0a\\x81\\x45\\x06\\x1c\\xf3\\xcc\\xf1\\x51\\xc6\\x14\\xbf\\xe4\\xaa\\x06\\x95\\x33\\xf2\\x94\\x0c\\x35\\x9a\\x29\\x72\\x97\\x04\\xa7\\x79\\x57\\x1a\\x3a\\x15\\x30\\xb2\\xd5\\x8f\\x9c\\x21\\x06\\x72\\x6b\\xe6\\x2b\\xa5\\xc7\\x5e\\x96\\xe2\\xe6\\xcf\\x26\\xb4\\xa5\\xcd\\x84\\xcc\\xc8\\x67\\x9c\\xcc\\x10\\x14\\xb9\\xef\\x72\\x58\\x3f\\x54\\x25\\xde\\x13\\x7b\\xdc\\xa6\\x91\\xf8\\x9a\\xf8\\xef\\xb1\\x47\\x47\\xd9\\xc3\\x84\\x1d\\x88\\x8f\\x60\\x11\\x5d\\x87\\xff\\x7c\\x62\\x7f\\x27\\x54\\x4b\\xce\\x8f\\x5b\\xd7\\xbe\\x0d\\xc7\\x6f\\x5c\\xcb\\xc7\\xcd\\xc6\\x12\\x75\\xf3\\x69\\xad\\x6e\\xf3\\x05\\x7d\\x91\\xb3\\xae\\xa0\\xb4\\xae\\xc1\\x97\\x5e\\x2d\\x76\\x31\\x7c\\x4f\\x3f\\x75\\xa2\\x27\\xd6\\xa3\\xc8\\x52\\xba\\x64\\xfe\\xdb\\xf3\\x1c\\x10\\x95\\xaa\\x20\\xaf\\xee\\x03\\xcf\\x62\\x0a\\xc2\\x90\\x31\\x2a\\xcf\\x5f\\xa2\\xeb\\x67\\x9d\\xae\\xa4\\x96\\x8b\\xf4\\x81\\x40\\x1c\\x54\\x72\\x46\\xb8\\xce\\xd3\\x4e\\xfd\\xa5\\xd2\\x8f\\x19\\x6b\\x9b\\xdb\\xdd\\xee\\xf3\\xa2\\xbc\\x2f\\x40\\x5f\\x4b\\xf7\\xf0\\x3b\\x86\\xf2\\xd9\\x43\\x9c\\x24\\xb3\\x71\\xa5\\xb8\\x8b\\x55\\x42\\x9f\\xe0\\x63\\x72\\xbc\\xf6\\x34\\x96\\x7f\\x56\\xc1\\xee\\xe6\\x0a\\x5f\\x03\\x37\\x9a\\x86\\x2f\\x52\\xf2\\x46\\x55\\x62\\x74\\x4a\\xe8\\xa3\\xb0\\x1f\\x8d\\x8a\\x3f\\x56\\x4e\\x87\\xd1\\x30\\x35\\xb9\\x01\\x89\\x81\\x46\\x1a\\x41\\x51\\x8b\\x75\\x1b\\x8a\\x52\\xbf\\x2c\\x22\\x31\\x5d\\x2b\\xcc\\x45\\x5c\\x6d\\x48\\xdd\\xd2\\xf1\\x3e\\x44\\x55\\x93\\x0a\\x24\\x45\\xcd\\x98\\x64\\xd8\\xda\\x85\\x7c\\x4c\\x17\\xe4\\x45\\xb3\\x16\\x83\\x94\\x51\\xd9\\x48\\x31\\xdd\\xb0\\xe6\\x9a\\xec\\x93\\x87\\x50\\xf7\\xaa\\xa9\\x52\\xe3\\x10\\x9b\\x40\\x1e\\x95\\x4e\\xd3\\x4e\\xde\\xc0\\x0c\\xf6\\xa8\\x1a\\xba\\xa9\\x45\\x4a\\x12\\x32\\xf1\\xef\\xa9\\x9d\\xd7\\x6d\\xa2\\x1d\\x58\\xfc\\x5b\\x5e\\xdb\\xe2\\x06\\xda\\xf9\\xed\\x59\\xdc\\xd3\\xa0\\xcf\\x39\\x61\\x76\\xe6\\x93\\x6d\\x6d\\xf4\\x69\\x2e\\xc4\\xb0\\x70\\xfc\\x9f\\xed\\xdc\\x4b\\x58\\xf7\\xe2\\xdf\\xe5\\x0c\\xb1\\xf6\\xe7\\xf2\\x8b\\xdd\\xdb\\x26\\x2f\\x74\\x18\\x77\\x58\\x61\\xbc\\x1b\\x3e\\x2a\\x68\\xe9\\x0a\\xb0\\x7f\\x9c\\x43\\x2f\\x68\\x16\\xd1\\xae\\x7c\\x16\\x72\\x96\\xcf\\x6e\\xdf\\x78\\x4d\\xf5\\xde\\x03\\xb9\\x47\\xba\\x25\\x53\\x15\\x2f\\x2a\\x84\\x69\\x74\\x24\\x9b\\xfc\\x60\\x33\\x0f\\xa5\\x97\\x3f\\x72\\x36\\x15\\x7f\\x35\\x13\\xd9\\xc3\\xaf\\x05\\xbf\\xba\\xe3\\xf4\\x13\\x60\\xc0\\x53\\x6c\\x1d\\x49\\x16\\xa1\\xea\\x7a\\xfe\\x03\\x8d\\x9b\\xa2\\xa9\\x69\\x97\\x07\\xf5\\xd4\\x1e\\x72\\xcc\\x42\\x45\\x50\\x27\\x26\\x32\\x80\\xb5\\xbf\\x47\\x70\\x8a\\x52\\x3e\\x1a\\x06\\x69\\xca\\x91\\x89\\xf5\\xa9\\xbe\\x5f\\xee\\xee\\x3f\\x9e\\xbf\\x79\\x28\\x89\\xdf\\xd2\\x50\\x58\\x8c\\xee\\x5a\\x37\\x9d\\x75\\xfc\\x78\\xe9\\xc9\\x35\\xf9\\x83\\xdd\\xc9\\xb4\\xf2\\xc0\\x25\\xb7\\x18\\x54\\x66\\xdf\\xfb\\xcd\\xf6\\x36\\xbc\\x86\\x44\\x81\\x67\\xf2\\x9c\\x4f\\xc4\\xfc\\x3a\\x05\\x16\\xc1\\xe3\\xf7\\xec\\x86\\x5f\\x9d\\xdf\\xfe\\x20\\xd3\\xaa\\x34\\xf9\\xcc\\x01\\xf5\\x07\\x86\\x85\\xf3\\xe7\\xbf\\x52\\xbf\\x14\\x3c\\xd2\\x63\\xd4\\x4b\\x4a\\x6a\\x79\\xaa\\xfd\\x9f\\x62\\x9d\\x60\\x3f\\x3c\\x31\\x97\\x85\\x2a\\xb5\\x62\\x9f\\x97\\x6a\\x16\\x25\\x1f\\xa3\\x50\\x17\\xe6\\xf6\\x41\\x71\\x09\\xe6\\x6b\\xa2\\xd9\\x42\\x3a\\xa3\\x80\\x8c\\xd4\\xf6\\x5b\\x33\\x18\\x48\\x73\\x42\\xba\\x42\\x73\\x32\\x4a\\x8d\\x5a\\x66\\x7d\\x91\\x6c\\x79\\x35\\x2f\\x81\\xc8\\x03\\x71\\x54\\xcb\\x6c\\x6f\\x76\\xff\\x9d\\xfc\\x56\\x8b\\x67\\x07\\xe6\\x1f\\x2b\\x3e\\x01\\xa2\\x35\\xfc\\x47\\xc2\\xbe\\xd7\\xad\\xc5\\x0f\\x03\\x96\\x37\\x5f\\x94\\xef\\x03\\x2a\\xac\\xfa\\xec\\xe9\\x74\\x76\\x38\\x93\\xb6\\x78\\x7a\\xa6\\x67\\x10\\x95\\x3b\\x8d\\xfc\\x1e\\xe1\\x5e\\xb1\\xaf\\x38\\xbb\\xc7\\x04\\x4b\\xfc\\x4b\\x06\\x2a\\x5a\\x60\\xb6\\xe1\\x86\\x7b\\xc3\\x8c\\xd4\\xc7\\x3f\\xb3\\x59\\x71\\x31\\xaa\\xb8\\x1b\\xe5\\xd9\\x19\\x6d\\x0f\\x1c\\xf9\\xd5\\xa9\\x0e\\x86\\xba\\x6e\\x9f\\x1e\\x5c\\x82\\x8f\\xab\\xd6\\x20\\x4f\\xc3\\x07\\x30\\xfa\\xc0\\x75\\x5b\\x32\\x43\\x61\\x7d\\xa7\\x31\\x91\\x57\\x35\\x94\\x02\\x0d\\x50\\x59\\xdb\\x39\\x6c\\x32\\xf2\\xed\\x5c\\xcd\\x96\\x7e\\x6c\\xa1\\x51\\x6f\\xc3\\xd5\\xb7\\x58\\x95\\x94\\xc8\\x43\\xc8\\x7c\\xd4\\x24\\x30\\x07\\xfc\\x99\\x6a\\xe8\\xed\\xac\\xe3\\xf6\\xc3\\xa2\\xde\\xd4\\x16\\x43\\x3b\\xf3\\xd9\\x52\\x87\\xe2\\x9d\\xde\\xd3\\xf5\\x12\\xd1\\x74\\xc0\\x3c\\x63\\xe3\\x4b\\x03\\x59\\xaa\\x08\\x1c\\xed\\x9a\\x2a\\x6a\\xc2\\x27\\xfc\\x63\\x8a\\xc2\\xce\\xd0\\xfd\\x77\\xe6\\xdc\\xd3\\xac\\xc6\\xbb\\xb2\\xef\\xb4\\x46\\x8a\\x84\\xf2\\x38\\x71\\xe2\\x87\\x56\\x3e\\x40\\xec\\x92\\x23\\x66\\x50\\xdd\\x26\\x13\\x4a\\x84\\x47\\x55\\xea\\x66\\xd6\\x00\\x91\\x48\\x67\\x1d\\xe0\\x3c\\xba\\x5d\\x76\\x15\\xf9\\x35\\x5e\\x36\\xc8\\x0f\\xb6\\x43\\xd5\\x86\\xab\\x1b\\x9e\\xa7\\xce\\xf0\\x74\\x54\\xdf\\x4a\\x76\\x8e\\x7b\\x63\\x0b\\xe3\\xfa\\xe2\\x8d\\xe4\\x06\\x69\\xf2\\x3e\\xb3\\x1d\\xb0\\x7b\\x09\\x08\\x0e\\xba\\x5d\\x2a\\xc8\\x0b\\x4c\\xba\\xfb\\x49\\xd9\\x2c\\xb6\\x29\\x38\\x16\\x1b\\x39\\x74\\xd3\\x63\\x4b\\x53\\x76\\x6f\\x8b\\xe9\\xdc\\x46\\x53\\x2b\\x8c\\x3f\\x38\\x06\\x1c\\xfd\\xe5\\xff\\x5b\\x98\\xd9\\x96\\x56\\xff\\xa4\\xfa\\xec\\x1a\\xbb\\xe8\\xda\\xce\\xbe\\xf8\\xe0\\xe8\\xd1\\xda\\xcc\\xa0\\x8a\\xa2\\xf8\\x76\\xce\\x3a\\xff\\x92\\x87\\x38\\x93\\x7e\\x7e\\x0a\\x3f\\xe2\\x77\\x9c\\xd7\\xe6\\x49\\x50\\x6b\\x9a\\x7d\\x3a\\x1a\\x62\\xe7\\xf4\\x92\\xe2\\xca\\xb4\\x96\\x76\\x5b\\x94\\x62\\xc1\\x3b\\xf6\\x97\\x79\\x6d\\x88\\xb9\\x81\\xdc\\x3e\\xc6\\x0f\\x46\\xa0\\xf9\\x56\\x8b\\x5f\\x9d\\x8a\\x92\\xc3\\xad\\x54\\x2c\\x7a\\x8b\\x27\\x89\\xcb\\x15\\xed\\x61\\x4f\\x3d\\xf0\\xd9\\x23\\x5b\\x8c\\x56\\xfc\\xa4\\x40\\xb1\\x9d\\xc4\\xdc\\x6d\\x90\\x63\\x17\\x7a\\x3a\\xd2\\xae\\x4b\\x5c\\xfe\\x58\\x92\\x49\\xaf\\x6d\\x87\\xd8\\x68\\x39\\x89\\x99\\x8d\\xa8\\x0b\\xe0\\xe2\\xf7\\x67\\x50\\x09\\x30\\xf0\\xb9\\xd5\\x09\\xa9\\xd5\\x35\\xe0\\x2c\\x3f\\x2d\\xb1\\x2a\\x5d\\x6c\\x79\\xb1\\x37\\xa7\\x5a\\xf2\\x30\\xde\\xd9\\xa7\\x65\\x0b\\x30\\xa6\\x6b\\xf7\\xdb\\x59\\x19\\x7e\\x2e\\xf1\\x1e\\xb0\\x69\\x98\\x49\\x28\\xca\\x5b\\x08\\x7c\\x3e\\x4b\\x56\\xc2\\x5e\\x41\\x50\\x53\\x55\\x0e\\xc0\\xac\\x23\\x00\\x06\\x5a\\xee\\x4b\\x54\\xe2\\x7a\\x69\\xaa\\x5c\\xef\\xb5\\x30\\xc6\\xdb\\x2b\\xfb\\x20\\xcd\\xad\\x96\\x95\\x3b\\x63\\x39\\xa6\\x37\\x2c\\x6b\\x41\\xd2\\x6a\\x29\\xa7\\x5d\\x8b\\xa2\\x20\\xa9\\x99\\x33\\xf0\\x95\\xa9\\xe3\\xd3\\x93\\x1c\\x77\\xfd\\x15\\xdd\\xf0\\x39\\x74\\xce\\x05\\x23\\x7a\\xfc\\xae\\x3c\\xfe\\x08\\x9b\\x38\\x1c\\x89\\xcb\\xc8\\x84\\xfc\\x42\\x64\\x67\\x0b\\x15\\xa9\\x64\\x7e\\xfb\\xb7\\x36\\x70\\x61\\x72\\xf9\\x8d\\x42\\x43\\x5f\\x1b\\x71\\x42\\xbd\\x80\\x97\\xc4\\x3b\\xbd\\x66\\x58\\x1b\\xa6\\x1a\\x38\\xa1\\xa8\\x85\\x96\\x94\\xec\\x82\\x7c\\x51\\x2d\\x0c\\xf1\\x91\\x73\\x3a\\x32\\xa9\\x2b\\xf1\\xcf\\x15\\x53\\xd3\\x3c\\x88\\x3c\\x3f\\x07\\x0d\\xd6\\xd0\\x0e\\xe2\\x67\\x43\\x9b\\xb3\\xa6\\x0e\\x72\\x33\\xb6\\xc7\\x48\\xd7\\x67\\x09\\x62\\x89\\xfe\\xc4\\x3a\\xf7\\x41\\x29\\xbc\\x7c\\x66\\x42\\x0e\\x41\\xb8\\x41\\xc9\\x84\\xcf\\x5f\\x6f\\xa8\\xeb\\xe5\\x05\\xef\\x00\\x2a\\xf4\\xc2\\xb3\\xed\\xc6\\xad\\xe6\\xd3\\xe7\\x6c\\x28\\x8b\\x8d\\x93\\x39\\xd1\\xbc\\x05\\xe4\\x58\\x91\\xc7\\x86\\xed\\x70\\x0f\\x24\\xeb\\xab\\x9f\\xa5\\xf2\\xa3\\x87\\x4a\\xe2\\xbc\\xbd\\x8e\\x96\\x37\\xe3\\x02\\x71\\x6a\\x14\\x03\\x79\\x0b\\xaa\\xd8\\x68\\x21\\x15\\x38\\xbf\\x54\\xfc\\x61\\xfe\\x19\\x4d\\x98\\x18\\xe4\\x2c\\xaa\\xfc\\xa0\\x69\\x49\\x99\\x5b\\x94\\x82\\xe1\\xef\\xca\\x99\\x53\\xf1\\x93\\x17\\x71\\x38\\xee\\x86\\xf8\\x4c\\x92\\x19\\x76\\x36\\x39\\x5d\\xc6\\x72\\x51\\x41\\x8b\\x92\\xef\\xd1\\xf9\\x73\\xcb\\x31\\x61\\xed\\x22\\x81\\x15\\x50\\x28\\xee\\x10\\x7f\\x98\\x97\\xe6\\x83\\xf5\\xb6\\x9b\\x87\\x5b\\xe5\\xbe\\x2c\\x8f\\xe6\\x5b\\x9e\\xc0\\x72\\x96\\xff\\xbb\\xff\\x55\\xd7\\x5b\\x56\\xbc\\xec\\xa9\\x79\\x2c\\xed\\x1d\\x9c\\x3f\\x96\\xce\\xe4\\x72\\x77\\xcd\\xe2\\x8b\\xb9\\x5d\\x82\\x77\\xeb\\x80\\xfc\\x96\\x5c\\xd8\\x5a\\xa1\\xd7\\x5e\\x15\\xf2\\x0e\\x0b\\x74\\xa2\\x49\\x5a\\x6c\\x2c\\x74\\x8e\\x80\\x49\\x9b\\xcd\\xc0\\x0e\\x26\\x38\\xb2\\xa8\\xb8\\xfd\\x00\\xa3\\x2b\\x89\\xa5\\x32\\x16\\xa4\\x9c\\xb6\\x06\\x52\\x39\\x1c\\xa5\\x47\\x78\\x1c\\x33\\x35\\x53\\x18\\x0c\\x3c\\xbb\\x04\\xd9\\x3f\\xc9\\x71\\xf1\\x10\\x24\\x36\\x45\\x88\\xf2\\x8a\\x04\\x31\\x35\\x96\\x2a\\x4c\\xb7\\x3a\\xf9\\x11\\xec\\x65\\x59\\xe0\\x80\\x60\\x23\\xe7\\x72\\xb9\\x4b\\xbc\\xed\\x41\\xa3\\x56\\x62\\x67\\xae\\x4b\\x26\\xa7\\x4e\\xb3\\xe1\\xd6\\xb1\\x82\\x62\\x61\\x32\\xe7\\xe6\\xe8\\xe2\\xa6\\x42\\xae\\x95\\x7d\\xf5\\xb9\\x6a\\x39\\x1a\\xe5\\x4d\\xd5\\x8f\\xa7\\x00\\x81\\xdd\\x0d\\x02\\x53\\x61\\x41\\x42\\x7c\\x53\\xe2\\x99\\x8e\\x70\\x10\\xfb\\x18\\xfa\\xfa\\x1b\\x78\\xcb\\x79\\xd5\\x86\\x1e\\x1f\\x3e\\xae\\x44\\x9b\\xd6\\xec\\x80\\x2b\\xa5\\x49\\x8a\\x9b\\x3b\\x62\\xdb\\x53\\x94\\x5d\\x0a\\x11\\xc7\\xea\\x37\\x09\\x4a\\x46\\x06\\xeb\\x25\\xdd\\x21\\x48\\x32\\xf8\\xb2\\xd6\\x13\\x70\\xa6\\x71\\x67\\x48\\xde\\x58\\x25\\x1c\\x88\\xe2\\x9b\\xeb\\x67\\x3d\\x99\\xad\\x55\\xde\\x23\\x78\\x6f\\x0b\\x84\\x5d\\x54\\x3d\\x69\\x7d\\xce\\x8c\\x0e\\x4c\\xae\\x2d\\x40\\x93\\xe1\\x1e\\xe2\\xd3\\xbd\\x63\\x4e\\xe2\\xd9\\xc5\\x2f\\x32\\x53\\x43\\x64\\x6e\\xe7\\x89\\x38\\x7d\\xef\\xc6\\xdf\\x9f\\xc0\\x4f\\x0f\\xba\\xb6\\xfd\\x3c\\xcf\\x94\\x3d\\xae\\x8c\\xc8\\xc2\\x93\\x90\\xf7\\x78\\xe6\\xfb\\x4c\\x4d\\x5b\\xdc\\x23\\xe8\\x92\\x32\\x0f\\xb4\\xd9\\xc1\\x88\\xbf\\xd9\\x40\\x11\\xaf\\xbf\\x79\\xad\\xae\\x24\\xd0\\x41\\xd4\\xe7\\x61\\x62\\xe1\\x5c\\xce\\xc9\\xcb\\xe2\\x9d\\xe3\\x66\\x55\\x6c\\x6e\\xf4\\xa0\\x58\\xf4\\x6b\\x67\\x44\\x3d\\xe3\\x15\\x63\\x72\\xb8\\x06\\x65\\x85\\xba\\x68\\x53\\xf2\\x3f\\x87\\x2b\\x98\\x2c\\xd9\\x07\\x75\\xf4\\xc8\\x4c\\x35\\x2b\\x58\\x40\\x97\\x98\\xa0\\x97\\x14\\x09\\x6b\\x51\\xa3\\x11\\x6f\\x77\\x82\\x62\\x0a\\xcd\\x6b\\x9f\\xd8\\x6f\\x33\\x69\\x65\\x32\\x22\\x99\\x80\\xed\\xdf\\x38\\xad\\x89\\x01\\xaf\\x4b\\xeb\\xa0\\x21\\xd5\\x65\\x6d\\xde\\x9a\\xf8\\xa5\\xc5\\x77\\x07\\xfe\\xec\\x2a\\xf1\\x3e\\xff\\xf9\\xa8\\x13\\x1e\\x5f\\xc6\\x4a\\xc9\\xb1\\x70\\x99\\xff\\x78\\x2f\\x9a\\x79\\x9e\\xcc\\xda\\x2f\\xeb\\x42\\xe5\\x11\\x34\\x4d\\x60\\xf3\\x5e\\x7c\\xb8\\xb6\\x35\\x34\\x04\\x97\\x8c\\x70\\x45\\xcf\\x1d\\xe7\\x7f\\xb1\\xd4\\xf2\\xdb\\xc4\\xfb\\x64\\x4b\\x61\\x3d\\x29\\x6d\\x3e\\xc6\\x54\\x90\\x55\\x68\\xd4\\xe8\\x98\\x7c\\x82\\x61\\x3e\\x88\\x99\\xf4\\x9a\\xfb\\x47\\x83\\xde\\x06\\x78\\x3d\\x2a\\xd1\\xf4\\x78\\x7a\\x2c\\x3e\\xcf\\x02\\x41\\xfc\\x4f\\x11\\x15\\x58\\x4d\\x94\\x49\\x88\\xb2\\x62\\xa0\\xbc\\x0b\\xdd\\x5c\\x36\\x62\\x35\\x4c\\xb8\\x68\\xa4\\x01\\x94\\x8c\\x87\\xc0\\xdd\\x96\\x6f\\xba\\x3a\\x4b\\xd6\\x38\\xa9\\xc6\\x34\\x8b\\x90\\x6f\\xfd\\x51\\xb7\\x7c\\x6f\\x2c\\x72\\xee\\xec\\x3a\\xae\\xf8\\x99\\x5c\\x21\\xbc\\x6d\\x07\\x8f\\x88\\xdf\\xd5\\x94\\xcd\\x7d\\xb6\\x0d\\xd9\\xfb\\x44\\xc8\\xbd\\xe9\\x2c\\x9b\\xe3\\xe9\\xd6\\x82\\xed\\xad\\xa0\\xc7\\x63\\xf3\\xc1\\xc0\\xaf\\xf6\\xe4\\x14\\x60\\xfc\\x98\\xa6\\x55\\x88\\x60\\x89\\x80\\x66\\x08\\x78\\xd4\\x8e\\xeb\\x00\\x58\\xec\\x06\\xf5\\xc8\\x94\\x31\\x3d\\xac\\xb0\\x24\\x59\\xe6\\x19\\x22\\x91\\x51\\x2c\\xe7\\x83\\x6a\\x13\\x7f\\xd4\\xfb\\x83\\xb2\\xc0\\x59\\x2b\\x1b\\x1f\\xaa\\x39\\xff\\xc6\\x24\\x95\\xba\\xad\\x56\\x68\\x2a\\x24\\xba\\xe6\\x67\\x9f\\xbb\\xac\\x81\\xbe\\xfb\\x3a\\xae\\x77\\x5d\\x9d\\x9b\\x0a\\xeb\\x08\\xe2\\x17\\x95\\xe0\\xbf\\xd8\\x2a\\x7b\\xe3\\xdf\\x59\\xcb\\x8b\\x96\\xf1\\x0a\\x54\\xea\\xcb\\x8f\\xd8\\xfd\\x82\\xd9\\xba\\xfb\\x1d\\x79\\x68\\x0b\\x58\\x74\\x99\\x3d\\x44\\x86\\x4e\\xe7\\x28\\x7a\\xaa\\xc1\\xf7\\x5f\\x89\\x52\\x24\\xf9\\x9e\\x08\\x63\\x27\\x71\\x05\\xe9\\x64\\xcc\\xa2\\xe0\\x4e\\xcd\\xda\\xd0\\x5d\\x4f\\xc4\\x66\\x33\\x49\\xef\\xd1\\x6b\\x29\\x78\\x85\\x96\\x38\\xd3\\xb2\\x93\\xc9\\x68\\x9e\\x52\\x1f\\xdc\\x6b\\x89\\x98\\x73\\x4f\\xc0\\xa8\\x32\\x94\\xc2\\x68\\xb8\\x66\\x4a\\x59\\x89\\x74\\x7c\\x5b\\xb5\\xc8\\x8c\\x63\\xb2\\x73\\xf8\\x5c\\x43\\x83\\x77\\x65\\x85\\xf0\\x96\\xfb\\x6c\\x9d\\x8d\\x64\\x70\\xba\\xdf\\x14\\x3e\\x19\\x10\\x4c\\x58\\xa2\\x5c\\xe4\\x8f\\x83\\xb7\\xd9\\xd1\\xd0\\xd6\\x9c\\x39\\x60\\xc5\\x8d\\xba\\x13\\x5d\\xbc\\xee\\xee\\xc2\\x98\\x35\\xe6\\xbb\\xe0\\xc1\\x5e\\x06\\xb5\\x33\\xa6\\x21\\xb6\\xb7\\x5c\\x3f\\xb6\\xda\\xed\\x49\\xce\\xae\\xcc\\x45\\x52\\x6f\\xd4\\x1e\\xf2\\xd4\\x98\\x2d\\x9b\\xfd\\x04\\xf9\\xb3\\xd3\\x2f\\xf7\\x58\\x1a\\xce\\xcb\\x3d\\x15\\x62\\xb2\\x2a\\x60\\x1a\\xd7\\xc4\\x28\\x44\\xe6\\x97\\x95\\x14\\x8c\\x18\\xad\\xbd\\x00\\x99\\xa8\\x7e\\xdf\\x2d\\x49\\x7d\\xf2\\x53\\x4f\\x0b\\xbd\\xa6\\x2c\\x1d\\x4d\\x57\\x19\\xab\\x25\\xa8\\x4f\\x09\\xec\\x7a\\xcc\\x1d\\x07\\x5a\\x72\\x58\\xbc\\x53\\xd7\\x9e\\xc7\\xf7\\xa4\\x39\\x80\\xa4\\xb2\\xa6\\x89\\x26\\xa7\\x5c\\xf9\\x17\\xcf\\x34\\x11\\x7c\\xf0\\x79\\x14\\xe8\\xd4\\x05\\x9d\\xde\\x88\\xa6\\x68\\xf0\\x0c\\x5b\\xf5\\x4a\\xe5\\xed\\x3c\\x51\\xa2\\x92\\x9a\\x5a\\xe1\\x89\\x95\\x78\\xe9\\x4a\\x2a\\x7d\\xfe\\x35\\x0a\\xfd\\x9a\\xf6\\x3a\\x1a\\xa8\\x19\\xa6\\x1d\\xf8\\x04\\xc8\\x5c\\xad\\xc4\\xcb\\x1c\\xb6\\xa1\\xce\\x51\\x94\\xc0\\x2f\\x00\\xe8\\xc6\\x06\\x9f\\x1d\\xf5\\xb7\\xe3\\xa9\\x2e\\x8d\\x66\\xea\\x6b\\xad\\xf0\\x8b\\xbd\\xeb\\x4d\\xbc\\x9d\\x4f\\xde\\xb1\\xae\\x53\\xb9\\xc0\\xb1\\xff\\x58\\x34\\x8e\\xd6\\xf9\\x7c\\x7a\\x29\\x65\\x05\\x63\\xbd\\x2a\\xac\\x9b\\xe7\\xf7\\xf0\\xf8\\xe2\\x4c\\xa6\\xfe\\x8c\\xdf\\x19\\x79\\x20\\x0a\\x5d\\xbb\\x45\\x76\\xc9\\xa3\\x19\\x76\\x5f\\x8e\\x32\\x6b\\xc8\\x60\\xeb\\xa4\\x21\\xa3\\x80\\x0e\\x2f\\x0d\\xa5\\x00\\x73\\xee\\xcb\\x68\\xc0\\x86\\x85\\x50\\xba\\xa4\\x90\\x12\\x58\\xec\\x3f\\xbc\\xcf\\xb4\\x46\\x85\\x70\\x88\\x69\\x47\\x8e\\x57\\xc9\\xec\\xce\\x99\\x70\\x7d\\xab\\x52\\xec\\xc1\\x37\\x20\\x28\\x51\\xf0\\xb4\\xf1\\x08\\x25\\x35\\xd8\\xc0\\xe4\\xab\\xe4\\x97\\x6b\\x06\\x1e\\xf2\\x2e\\xed\\x08\\xce\\x8e\\xe6\\x16\\x5b\\xdc\\xef\\x0e\\xf2\\xee\\x5a\\xd2\\x11\\xda\\x62\\xdd\\xe6\\x2f\\x07\\x5c\\x72\\x76\\x76\\x5d\\xec\\x6d\\x6e\\xea\\xb6\\xdf\\xe9\\xce\\xce\\x3a\\x9e\\xa8\\x87\\x1a\\x4e\\xa8\\x59\\x8f\\x52\\x6b\\xd4\\xd3\\x44\\xc8\\x10\\xe2\\xc1\\xe1\\x22\\x1a\\xf1\\xc8\\x95\\x29\\x3a\\x2e\\xed\\x87\\xed\\x37\\x8e\\xc5\\x5e\\x6e\\x21\\xea\\x55\\x99\\x05\\x96\\xa8\\xa9\\xac\\x4c\\xb9\\x30\\xa4\\x32\\x91\\x20\\xa0\\xbe\\xf7\\x0a\\xb7\\x9e\\x33\\xee\\x21\\xcb\\xb3\\x4a\\xb1\\xba\\x14\\x6f\\x82\\x68\\x73\\x67\\xfd\\xda\\x5f\\x40\\x58\\x85\\x5d\\x07\\xe0\\x78\\x5e\\x29\\xb6\\xca\\x7f\\xbd\\x09\\x55\\x49\\x98\\x5f\\xc5\\x89\\x10\\x5a\\xb0\\xa0\\x54\\x6e\\x26\\x15\\x45\\xbd\\x56\\x19\\xfe\\xda\\xef\\x25\\xd6\\x55\\xed\\xcf\\xd6\\xff\\x7d\\x66\\x70\\x86\\x91\\x5b\\x56\\xd4\\x79\\x8a\\x14\\x7c\\x3c\\x71\\x44\\x64\\xf0\\x76\\x05\\x43\\x2d\\x71\\x56\\x81\\x0a\\x97\\x6b\\xed\\x39\\x19\\x18\\x9f\\x0b\\xb3\\x41\\x9b\\x7e\\xb1\\x29\\x20\\x40\\x43\\xa0\\xc0\\xaa\\x1a\\xa9\\x9d\\xab\\x3d\\xd7\\xef\\xb3\\xb2\\x2f\\x48\\x05\\xce\\xdb\\xbd\\xfe\\xed\\xa0\\xee\\xa9\\x12\\xf1\\xf3\\x67\\x3d\\xab\\xa6\\x68\\x33\\xc4\\x0b\\xa7\\x40\\xb0\\x79\\xb3\\x4e\\x6d\\x21\\x5d\\xb7\\xe6\\xd3\\x74\\x93\\xc3\\x5b\\x0a\\xf2\\x2b\\x79\\x68\\xb0\\x18\\xa6\\x7e\\x38\\x6d\\x95\\x70\\xf5\\x8a\\xa5\\x9b\\xbc\\x5f\\x50\\xbf\\xb5\\x8e\\x00\\x73\\x38\\xee\\xc3\\x8b\\x99\\x6f\\x99\\xac\\x41\\xc3\\x3f\\x04\\x6a\\x3c\\xe9\\xa6\\x02\\xf7\\x01\\xd6\\x35\\x3e\\x1b\\x82\\x64\\x91\\xee\\x24\\xf5\\xbd\\xd0\\x8a\\x67\\x18\\x76\\xbf\\x17\\xd9\\xd9\\x59\\xdd\\x23\\xf5\\x23\\xa3\\x59\\x02\\xbc\\x78\\xbe\\x67\\x3a\\xc9\\x68\\xed\\x1b\\xe6\\xaa\\xf5\\x61\\x81\\xb7\\xa5\\xfd\\xed\\x8e\\x00\\x6f\\xeb\\x84\\x67\\xdf\\x0c\\xb8\\xd9\\x45\\xbf\\x68\\x0b\\x18\\xa4\\x77\\x27\\x3f\\x58\\xcf\\x76\\x1e\\x89\\x28\\x01\\x41\\x89\\x73\\x12\\x6e\\xe5\\xa1\\x87\\x62\\xd7\\xeb\\xb0\\x66\\xa2\\xe9\\xfc\\x89\\x4f\\x50\\xb7\\xfc\\xd9\\x23\\x01\\x11\\x87\\xc2\\x55\\xe7\\x13\\x45\\x05\\x86\\xc4\\xfb\\x82\\xcf\\x0e\\xb4\\xa4\\x2b\\x58\\x30\\x8a\\xdc\\x10\\x9f\\x17\\xe6\\xb2\\x81\\x5f\\xaa\\x8e\\x77\\x22\\x10\\x94\\xd6\\xa9\\xca\\xe5\\x40\\x85\\x75\\xe4\\x65\\x95\\x74\\x5f\\x1d\\x5c\\x29\\x71\\x91\\xb6\\xaf\\x75\\x84\\x34\\x34\\x85\\x0b\\x26\\xb7\\x0c\\x39\\x6b\\xfc\\x3b\\x34\\x27\\x4f\\xa4\\x5e\\xbd\\x04\\x55\\x83\\xb2\\xf3\\x6d\\x22\\x22\\x06\\xe6\\x96\\x63\\x97\\xb2\\x9c\\xcd\\xd2\\x70\\x7f\\x91\\xa9\\xc3\\x5a\\x2e\\xef\\x41\\x67\\x89\\x79\\x22\\xfb\\x05\\xcd\\x22\\xbf\\x15\\x8c\\x97\\x73\\xd0\\x98\\x4a\\x48\\x84\\x33\\x91\\x2c\\xad\\x5e\\x8d\\xba\\x09\\x73\\xf9\\xbb\\x4e\\x46\\x10\\x45\\xb2\\x4a\\xb5\\x3a\\x9d\\x7b\\x41\\xbc\\x0e\\xe5\\xeb\\x9a\\xec\\xc9\\x7e\\xdf\\xdc\\x1e\\xd8\\xeb\\xd6\\x85\\x4a\\xc3\\x35\\x9e\\x4b\\xfd\\xe9\\x4e\\xb6\\x8f\\x9d\\xbe\\x6f\\xfe\\xd7\\xf2\\xfe\\xec\\x69\\x42\\xbf\\x05\\x7e\\x49\\x00\\x0b\\x7b\\x7b\\x06\\x59\\x87\\x86\\x75\\xc0\\x35\\xcb\\x62\\x0d\\x55\\xd1\\xc4\\x8f\\xe0\\xb0\\x5d\\x61\\x57\\xaa\\x63\\x29\\x52\\x02\\xbe\\x53\\xc9\\xad\\x58\\x70\\x22\\x4a\\xcf\\x3a\\xe3\\x1c\\x9b\\x20\\xc3\\x2e\\xe2\\xac\\xd6\\x04\\x42\\x58\\xb8\\x5d\\x79\\x5f\\xf7\\x59\\xd1\\xdb\\x2e\\x28\\x9d\\x56\\xd8\\x22\\xad\\x35\\x29\\x6d\\x69\\xf2\\x7a\\x13\\x69\\xe8\\x4e\\x3e\\x12\\xc8\\x66\\xf0\\x2f\\x26\\xc3\\x7f\\xf7\\xee\\xd0\\xb4\\xb9\\x1c\\xa9\\x83\\x35\\x4d\\x20\\x7c\\x6d\\x26\\xa3\\x06\\x38\\xd1\\x21\\xe5\\x5b\\x06\\xeb\\x1e\\x8c\\xd1\\xe2\\xe5\\x33\\x7f\\x7e\\xad\\x5d\\xfe\\x3c\\x7a\\xd9\\x7b\\x5f\\x00\\x53\\xe0\\xe4\\x2b\\xb9\\xbe\\x11\\x77\\x88\\x81\\x8f\\xcd\\x13\\x0a\\xb1\\x7c\\x98\\x1e\\xf5\\x5f\\x4c\\x1b\\xa3\\xe7\\xf3\\x30\\xdd\\xf9\\x95\\x78\\xe1\\xf5\\xd9\\x9a\\x29\\xe0\\x4c\\x78\\x14\\xb6\\x55\\xed\\x1a\\x4d\\x22\\xff\\xaf\\x88\\x0b\\x47\\xba\\x06\\x99\\x8a\\xe0\\x2b\\xf1\\x5f\\x11\\x34\\x1d\\xbc\\xf7\\x5e\\x76\\x87\\x46\\xea\\xf3\\xf7\\x9e\\x13\\x09\\x16\\x23\\x70\\x45\\x19\\xf4\\xe4\\xa6\\x8a\\x14\\x06\\x46\\x45\\x89\\x6c\\xb7\\x2b\\xf6\\x17\\x15\\x4e\\x92\\xa2\\xf4\\xb2\\x4a\\x51\\xd8\\x39\\x85\\x6b\\x9b\\x86\\xd5\\xc4\\x7a\\x32\\x01\\x32\\x3f\\x67\\xf8\\x15\\xdd\\xb1\\x59\\x5e\\xd6\\x51\\x0b\\x94\\xb3\\x16\\xe6\\xc8\\x30\\x82\\xbe\\xa8\\x4a\\x84\\x24\\x3f\\x75\\x1c\\x32\\x30\\x99\\x52\\xcd\\xca\\x63\\x23\\xe5\\xf5\\x89\\x7a\\x2a\\xae\\x5d\\xec\\x0d\\x0e\\x81\\x7e\\x27\\xf3\\x5a\\x19\\xd1\\x97\\xbb\\xbd\\xb0\\x4b\\xe1\\xd5\\x60\\xf8\\x1e\\x6a\\xc0\\x29\\x5f\\x65\\xb3\\xd4\\x97\\xa1\\x7a\\xab\\x27\\xc2\\xcf\\x5d\\xd5\\x63\\xd4\\x24\\x99\\x52\\x3c\\x42\\xfc\\xcd\\x5c\\xbf\\x8b\\x2c\\xae\\x61\\x03\\xd4\\xed\\xdf\\x92\\xcb\\x2f\\xf9\\xb6\\xcf\\xe3\\xc6\\x79\\x61\\xa9\\x99\\xae\\x53\\x95\\xa9\\x8b\\x29\\xf2\\x5f\\x3d\\x55\\x95\\x74\\x21\\x66\\x43\\x20\\xed\\x90\\xe5\\x0a\\x9a\\xa8\\x38\\x49\\x83\\x2a\\x45\\x1b\\xb2\\xff\\x74\\xb8\\x40\\xc8\\x58\\x5e\\x3c\\xf3\\x95\\xcb\\xd3\\x0f\\x75\\x40\\x4f\\xe3\\x3c\\x7b\\x65\\xaa\\x50\\x2d\\x6e\\x55\\xf5\\x12\\x93\\x75\\x74\\xa0\\xf8\\xf5\\xee\\xc4\\x7c\\xdc\\x0c\\x94\\x4c\\x64\\x3a\\x8b\\xcc\\xfa\\xfe\\xae\\xac\\x6c\\xce\\x28\\x12\\x88\\xe6\\x74\\x11\\xb0\\x73\\xfc\\x7e\\xd7\\x79\\x51\\xee\\x6d\\x49\\x7e\\x00\\xaf\\x15\\xc0\\xfa\\x4b\\x66\\xe6\\xda\\x84\\x59\\xe3\\x8e\\x6b\\xff\\xf8\\x6a\\xb9\\x75\\x57\\x95\\xe2\\x2d\\x13\\xfd\\x70\\xff\\x3a\\xc9\\xc2\\xad\\x20\\xdd\\x00\\xc7\\x7d\\xa9\\x96\\x8c\\x74\\x01\\xfa\\x22\\xeb\\xca\\xdf\\xf4\\x4f\\xbd\\x92\\xa0\\xb6\\x1b\\x95\\x60\\x6d\\xc6\\xc9\\x6e\\xb3\\xb8\\x7b\\xd6\\x42\\x57\\x00\\xa9\\x27\\xf3\\x00\\xf5\\x72\\x33\\xd1\\x95\\x67\\xa0\\xf5\\xad\\x3b\\x7f\\x9a\\xf7\\x22\\xe4\\xfd\\xf4\\x65\\x9f\\x36\\xaf\\xb6\\x16\\xa1\\x6d\\xa5\\x4d\\xfe\\x15\\x7f\\xb0\\x55\\xe0\\x98\\x2d\\xbb\\x98\\x8f\\x18\\x24\\x5a\\x55\\x3d\\x12\\x8e\\x92\\x01\\x31\\x62\\x6e\\xb8\\xdb\\xd2\\xe4\\xa4\\x31\\x56\\x91\\xee\\x64\\xb1\\x24\\xdc\\x5e\\x39\\x57\\x4f\\x41\\xb6\\x43\\x51\\x2b\\x46\\x4c\\x43\\x6a\\x99\\x16\\x7d\\x2d\\xb6\\x4a\\xe3\\x97\\x84\\xe0\\xdb\\x78\\x83\\xe9\\xb0\\x8c\\x6c\\xf0\\xbf\\x28\\x61\\xc7\\xcc\\xbe\\xc0\\x03\\x8b\\xe6\\x28\\xd4\\x52\\x76\\xd7\\x8e\\xaf\\xbd\\x80\\x77\\x38\\xe3\\x5a\\xbd\\x32\\xad\\x5c\\x19\\xb8\\x95\\x8d\\xa8\\x00\\x5a\\x73\\xbb\\x43\\x29\\xe6\\x2f\\xbf\\x8e\\x2f\\x05\\x41\\xe6\\x64\\xc1\\xe0\\x80\\xe3\\x91\\x6f\\xdb\\x95\\x88\\x00\\x5a\\x73\\xda\\x5b\\x51\\x4c\\x7d\\x6d\\xa3\\x39\\xbf\\x48\\x3a\\x5f\\xf0\\xde\\x05\\xf2\\x0a\\xee\\xda\\x99\\xf3\\xa7\\xf1\\x70\\xdd\\x6a\\xc5\\x01\\x15\\x9d\\xc6\\x4d\\x0d\\xa7\\x5c\\x14\\x2c\\x5a\\xe2\\xba\\x0c\\xda\\x02\\x78\\xc4\\x13\\xe5\\xed\\x36\\x42\\x6e\\x66\\xcb\\x31\\x22\\x5f\\x33\\x26\\x4b\\xe8\\x1f\\x6a\\xc4\\xfa\\x61\\x8e\\xf1\\xc1\\xcb\\x7d\\xf0\\x6c\\xf1\\xb9\\x44\\xce\\x44\\x1c\\xcc\\x6d\\xe5\\x5d\\xde\\x4b\\x92\\xb9\\x97\\x3d\\x27\\x95\\x89\\x57\\x11\\xdb\\x4c\\x5e\\x84\\x0c\\x5e\\xe7\\x0b\\xbf\\x11\\x1f\\xdc\\x38\\xaf\\xae\\xa0\\xe7\\x2b\\xbf\\xbe\\xed\\xce\\x11\\x87\\x7d\\x20\\x99\\x3e\\x4e\\xf8\\x03\\xf8\\xaa\\xe0\\x2b\\x74\\xa2\\xb1\\xaa\\x89\\x70\\xf9\\xbe\\xe2\\x47\\x9e\\x45\\x3b\\x0c\\xf0\\xdf\\x6d\\x04\\x3f\\x59\\x74\\x16\\xef\\xd5\\x48\\x9a\\x09\\x56\\xb7\\xcd\\xfc\\x07\\x18\\x14\\x77\\xc5\\x2b\\x6c\\x61\\xc9\\xcc\\xda\\xa8\\xd4\\x4c\\xa0\\x61\\x9c\\xf4\\x63\\x2a\\x4e\\xc2\\x62\\x95\\x9c\\x6b\\xd4\\x5c\\xa9\\x01\\xb9\\x32\\x59\\x33\\x0d\\x2e\\x23\\x56\\x46\\x7b\\x80\\x15\\x3b\\x6e\\xe6\\xac\\x85\\xda\\x46\\x58\\xb2\\x62\\x37\\x72\\x22\\x0d\\xec\\xba\\x8a\\x94\\xbc\\x3e\\xd0\\x48\\x00\\x8f\\x18\\xc5\\xa9\\x40\\x04\\x2d\\x8b\\x1e\\xae\\x62\\x09\\x48\\x42\\x10\\xeb\\x70\\xba\\xc4\\x8d\\x31\\x47\\x30\\xf3\\xd2\\xa4\\x58\\x91\\xb1\\x7f\\x0d\\x71\\x11\\xec\\x15\\xdf\\xfa\\x77\\x4c\\x63\\x64\\x92\\xda\\xb0\\x4e\\x16\\xbe\\x2e\\x08\\x8d\\x27\\x67\\x9c\\xf3\\x39\\x78\\xb4\\x83\\xf9\\xf1\\x42\\xd0\\xf4\\xc3\\x68\\xd1\\x56\\xcd\\x93\\xd4\\x16\\x3a\\x22\\x60\\xd0\\x60\\xda\\x7e\\x03\\x3f\\xa2\\x1c\\xe6\\x83\\x17\\xce\\xa1\\x76\\x0d\\x9b\\x21\\x31\\x2c\\xfd\\x6e\\xb9\\x0c\\x9c\\x5d\\x67\\xd8\\x4e\\x5a\\xf2\\xe7\\x88\\x23\\xc6\\x6f\\xe6\\x5e\\xea\\x46\\x2f\\xb5\\x44\\xa5\\xb0\\xf8\\x14\\x4b\\x21\\x94\\x61\\x21\\x9c\\x53\\xd3\\x0e\\x41\\xa9\\x06\\x27\\x16\\x88\\xa7\\xee\\x2c\\x57\\x58\\x15\\xbe\\x99\\x35\\xe3\\x25\\x92\\x4e\\xd7\\xdb\\x2a\\xb0\\x55\\x91\\x73\\xec\\x9c\\x40\\xc4\\x17\\xe3\\x6e\\xd7\\x34\\xd5\\x6d\\x7e\\x18\\x12\\xde\\xfe\\x05\\x91\\x12\\xfa\\xfc\\x31\\xcd\\x89\\xdd\\x60\\x79\\x0f\\x47\\xe6\\xdf\\xc2\\x7f\\xcf\\x33\\xd7\\x2d\\x84\\xb2\\xa1\\xca\\x16\\x77\\x08\\xcf\\x98\\xcf\\x60\\x49\\x6b\\x0b\\xe3\\x46\\x02\\xcf\\xd8\\xfb\\xc3\\xda\\xf0\\x3e\\xc2\\xda\\x18\\x1f\\x1e\\xbd\\x36\\xdb\\x56\\x2e\\x77\\x0e\\xae\\x37\\xff\\x70\\x2e\\xdd\\xd7\\x0a\\x97\\x4f\\x1a\\x31\\x13\\x72\\x6d\\x3d\\x8d\\x16\\xd3\\x57\\xd6\\x0d\\x3e\\x8f\\xcc\\xe5\\x41\\xc9\\xe9\\xfb\\xf5\\xe5\\x9e\\x3b\\xec\\xf3\\x4a\\x48\\xf4\\x3a\\x7a\\xc7\\x94\\x45\\xf3\\xd7\\x4d\\xbf\\xb3\\xd8\\x1b\\x8c\\x13\\x88\\x8d\\xc6\\x15\\x20\\x9a\\xa7\\xc4\\x86\\x90\\xff\\x52\\x44\\xda\\xcb\\x73\\x69\\x14\\x81\\xc8\\x1e\\x8d\\xf4\\x4e\\x5d\\x62\\x9b\\xd6\\xc7\\xe0\\x9f\\xf1\\xea\\x37\\x21\\xb9\\xab\\x5b\\xa6\\x7e\\x94\\xf2\\xd1\\x6c\\x36\\xc3\\xac\\x64\\x2b\\xe5\\x52\\x87\\xce\\xb2\\x68\\x0d\\x17\\xd1\\x35\\x42\\xae\\x49\\xd3\\x2a\\x5e\\xbf\\x26\\xc3\\x48\\x86\\xbd\\x5d\\x6e\\x46\\x94\\xf6\\x26\\xb5\\x0d\\x17\\xe4\\xdc\\xbc\\x2b\\xdd\\x66\\xa9\\x5e\\xc1\\x95\\x4d\\x32\\x4c\\x8e\\x31\\x97\\xe3\\x43\\xf6\\xd8\\xa7\\x38\\x6b\\x47\\x3b\\x61\\xbd\\x3f\\xb1\\x29\\x0d\\x86\\x8d\\x64\\xa5\\x21\\xcf\\x23\\xc0\\x71\\x4a\\x4f\\xf1\\x14\\x5f\\x24\\xd5\\x13\\xfd\\xcc\\x4c\\x7c\\x90\\xa4\\xf1\\x22\\xf6\\x23\\x5e\\xc3\\xc2\\x99\\xc0\\x3f\\x9d\\x2c\\x27\\x51\\xa2\\x59\\xc6\\x18\\x8a\\x2f\\x27\\x44\\x7c\\xb2\\x8b\\x79\\x80\\x90\\xf8\\xcd\\x9f\\x22\\xcb\\xd7\\x7e\\x25\\x64\\x6e\\x79\\x1a\\x8d\\xd4\\x46\\x78\\xdb\\x7e\\x21\\x3e\\x27\\x29\\xf0\\x77\\x2d\\x55\\x3a\\xd5\\x6e\\x9b\\xe1\\x99\\x31\\x58\\xf0\\x0f\\xfc\\x53\\x59\\xc2\\x5b\\x55\\x0a\\xc4\\xd8\\xaa\\xf5\\xc9\\x14\\x26\\xa9\\x5a\\xa0\\xce\\x87\\x18\\xab\\xa3\\x04\\x51\\x6e\\x33\\xef\\x18\\x9c\\xb4\\x7e\\x0b\\xad\\xe3\\x57\\x22\\xd9\\x53\\x8c\\x46\\x90\\x20\\x72\\xfc\\xbe\\x4b\\x03\\xac\\x1c\\x7a\\xc9\\x9a\\x64\\x09\\xf6\\x6f\\x37\\x10\\x1a\\xa6\\xa4\\x97\\x01\\xcb\\x08\\x8b\\x63\\xaa\\xf1\\x2b\\x9c\\x98\\xd7\\xac\\x7a\\x13\\xb5\\xe9\\xd5\\xeb\\xd4\\xef\\x7b\\xe1\\x0c\\xb2\\xcf\\x74\\x7f\\x48\\x88\\xc4\\xd7\\xcd\\x8e\\xc5\\xb1\\xa4\\x77\\xe4\\x6f\\xfc\\xf1\\x9e\\x68\\xbe\\x97\\x88\\x69\\xfa\\x99\\xc5\\xa7\\xe1\\xaf\\xb9\\xd3\\x25\\xd1\\xfa\\xee\\x7f\\x73\\x4b\\x96\\xd0\\x9b\\x2f\\x66\\x01\\xd5\\x45\\x5b\\x29\\xba\\xe5\\xc3\\xd3\\xbe\\x31\\x41\\x4b\\xbd\\xaa\\xbb\\x1e\\xec\\x32\\xfe\\xe9\\x89\\xbe\\x37\\x9c\\xfd\\xef\\x0b\\x82\\x7a\\x5b\\x53\\xf8\\xe5\\x3b\\xda\\x0f\\x68\\xaf\\x5c\\xae\\x57\\x5c\\x8b\\xb5\\xa7\\xe5\\xb8\\x15\\xbc\\x95\\x50\\x54\\x8a\\x86\\x4a\\x08\\xd6\\x7f\\xe2\\xd0\\xfe\\x62\\xe7\\xb8\\x25\\x54\\xb0\\xc4\\x20\\xd1\\xee\\x5d\\x7a\\x92\\xea\\x86\\x8e\\xdf\\x42\\x1a\\xf9\\xa8\\xca\\xee\\x2e\\xfe\\x08\\xdc\\xbc\\x1e\\xa8\\x84\\x14\\x6a\\xd9\\x91\\x40\\x7c\\xee\\x94\\xfc\\xdb\\xc6\\xdb\\x80\\x4c\\x36\\xa5\\xe5\\xf0\\x13\\xbf\\xbc\\xb7\\x9a\\x5e\\x04\\xa7\\xc1\\x90\\x60\\x08\\x7f\\x27\\x82\\xaa\\x79\\x2a\\x9b\\x38\\xe0\\xc7\\x68\\x26\\x62\\x87\\x13\\x05\\xf1\\xb8\\xd4\\x91\\xb2\\x28\\x2c\\x22\\x6f\\x3a\\x89\\xdc\\x02\\x0d\\xb5\\xc5\\x00\\x6d\\xad\\x21\\x02\\x08\\xcc\\x0a\\x78\\x15\\x2d\\x37\\xb4\\x3a\\xe2\\xd5\\x62\\xb3\\xb4\\x85\\xd5\\x67\\x5d\\xbf\\x91\\x84\\xdc\\xce\\x4a\\x79\\xb9\\xcf\\x26\\xe2\\x3d\\x3f\\x9a\\x0e\\xd4\\x37\\x0b\\x4b\\x55\\xa9\\x96\\x42\\xcd\\xfa\\xcd\\x0e\\xaa\\xd3\\x3b\\x2f\\x05\\x0b\\xa3\\xab\\x5d\\x66\\xdd\\x59\\xae\\xf4\\x4d\\xc7\\xc7\\x5c\\x1d\\x94\\x1f\\xb3\\x0b\\x2e\\x82\\x80\\xa3\\x47\\x42\\x7d\\xbe\\xe9\\x23\\xe2\\x1f\\xde\\xf5\\xdf\\xc3\\x58\\x3b\\xd8\\x2d\\x77\\x26\\x3d\\xd3\\x48\\x9d\\x3c\\xf9\\x92\\xdb\\xab\\xfd\\x8f\\x16\\xe1\\x2d\\xde\\x58\\x44\\x54\\x74\\xf0\\x76\\x0c\\xd1\\xb6\\x71\\x50\\x9f\\xfc\\xa3\\xca\\xef\\x7a\\x7f\\x25\\xb2\\x24\\xae\\x37\\xd6\\xe4\\xbe\\x6b\\x3a\\xba\\x64\\x6d\\x54\\xa1\\xbc\\xb3\\x79\\x69\\xf9\\xc3\\x31\\x77\\x4f\\x7c\\x2e\\xd9\\x0e\\xd4\\x5c\\x93\\xee\\x29\\x9c\\x74\\xef\\x30\\x72\\xba\\xc7\\x2c\\xa5\\x0a\\xa3\\xe7\\x19\\x1e\\xbd\\x2a\\x1f\\xee\\x4d\\xc9\\x60\\xae\\xd9\\x16\\x92\\xe7\\xc4\\x82\\x13\\xe0\\xad\\x5c\\x34\\xbd\\x0a\\x0c\\x97\\xe7\\x93\\x9f\\xcf\\x45\\x84\\xe3\\xa1\\x4a\\x83\\x0b\\x79\\xd8\\x72\\x86\\x56\\xdd\\xfa\\x15\\x93\\x72\\x91\\x38\\x3c\\xf9\\x0a\\x0d\\xab\\xec\\xf5\\x2a\\xe2\\x74\\xc9\\xa4\\xfc\\x86\\xe4\\x20\\x32\\x20\\x38\\x7e\\x6a\\x01\\x9b\\xbf\\x8d\\xae\\x38\\x1d\\x5d\\xc2\\x4c\\x85\\x22\\xe6\\x26\\x22\\x63\\x89\\xcf\\x9c\\xe4\\xb7\\x00\\xa4\\xa3\\x1c\\xbe\\x76\\x30\\x18\\x8f\\x84\\xce\\x96\\x65\\xa9\\xf5\\xdb\\x2d\\xf4\\x33\\x4f\\x5b\\xfa\\xb5\\x08\\xed\\x24\\xe5\\xac\\xc5\\x24\\xce\\x21\\xf7\\x1c\\xb5\\x2a\\x76\\x1d\\x06\\x6a\\xd8\\x49\\x4e\\x47\\x1d\\x9d\\x48\\xfe\\x5f\\x9c\\x03\\x88\\x3a\\x7f\\x41\\xe2\\x36\\xd6\\xba\\xdd\\xdc\\x74\\x32\\x94\\x4b\\xe1\\x6b\\x12\\x29\\x5d\\xea\\x18\\x34\\x20\\xd5\\x5b\\x23\\x93\\xa9\\x96\\xfc\\x46\\x39\\x8f\\xc3\\x21\\xf3\\xf3\\xcf\\x84\\x28\\xe3\\xfe\\x70\\xb0\\x3d\\x3f\\xf2\\x7a\\x5f\\x44\\x28\\xb8\\xba\\x09\\x7c\\x09\\xa9\\x0c\\x82\\xc5\\x7b\\xb8\\xe5\\x62\\xd7\\x11\\x45\\xba\\x22\\x8e\\x84\\x13\\xb5\\x5e\\xa9\\x2c\\x4a\\x97\\xaf\\x6a\\x1c\\xd9\\x47\\xbd\\xf3\\xfb\\xca\\x30\\x2d\\x9c\\x9d\\xc2\\x4c\\xdb\\xd6\\x07\\xec\\xca\\xc7\\xc5\\x5d\\x06\\xdc\\x35\\x76\\x5d\\x7b\\x5f\\x0e\\x7f\\x3a\\x08\\xb8\\xc1\\xba\\x11\\xbe\\x5f\\xbc\\xfb\\xcc\\xf0\\x6d\\x6d\\xfd\\x4b\\x2d\\xf7\\xf1\\xce\\x23\\xdc\\xec\\x34\\xbb\\x94\\xf5\\xf8\\x0c\\x42\\xb4\\x57\\xa0\\x30\\x6c\\xe0\\xd5\\x45\\xc4\\x6b\\x72\\xd9\\xac\\x1a\\xf4\\x58\\x79\\x2b\\x2a\\xdc\\x28\\xbb\\xf2\\x85\\xfc\\x9d\\xa2\\x54\\xae\\x94\\x83\\x63\\x2c\\x18\\x56\\xad\\x4c\\x13\\xa3\\x50\\x60\\x18\\x0a\\x5b\\x43\\xbb\\x37\\xe4\\xec\\x09\\x2d\\xc2\\x56\\x4c\\x82\\x38\\x43\\xb3\\xba\\xde\\xa8\\xc7\\x8e\\xdc\\x15\\xa5\\x92\\xd5\\x09\\xac\\xc5\\x0e\\x80\\x56\\x42\\xc7\\xc6\\x56\\x5b\\xb2\\x84\\xd8\\xa3\\x67\\x36\\x87\\x27\\x39\\xef\\x5b\\x4d\\x38\\x41\\xb4\\x34\\x70\\x05\\x4d\\xd3\\x03\\x1a\\xf3\\x05\\xa9\\xdf\\x92\\x02\\x42\\x2a\\xb1\\x48\\xb2\\xe4\\xc2\\x52\\x25\\x9d\\x3e\\xd4\\xce\\xa4\\x95\\xb7\\xfa\\xd4\\x1a\\x22\\x2a\\x64\\xcc\\x2e\\x59\\x5f\\xaf\\xfb\\xbd\\x95\\x7b\\x65\\x5d\\x3d\\xd7\\x2a\\x50\\x78\\x3a\\xe1\\x79\\xd9\\xde\\xae\\x55\\x0e\\x87\\x7d\\x7b\\x67\\xc7\\xe2\\xab\\x2b\\x9d\\x05\\x9c\\xac\\x4d\\xcb\\xb1\\xfb\\x83\\x83\\xa7\\xc6\\xe6\\x03\\x35\\x25\\x70\\xb3\\x8f\\xae\\xb1\\x0d\\x50\\xe5\\x97\\x1d\\x65\\xf4\\x7f\\xa1\\x7c\\x40\\x75\\x6c\\xf7\\x5c\\xb7\\xea\\x9f\\x1c\\x0f\\x75\\x49\\xd9\\xc7\\xf1\\x2d\\x3c\\xa5\\xa5\\x30\\x12\\x92\\x85\\xe4\\x31\\x94\\xc7\\x91\\x22\\xe6\\xcb\\x78\\xbf\\x11\\xa8\\x79\\x49\\xa9\\x56\\xee\\x60\\xf8\\x8a\\x0c\\x9c\\xa8\\xb6\\x1e\\xeb\\x3b\\x3c\\x78\\x95\\x14\\xbe\\xa2\\xd6\\xb6\\x26\\x2b\\x22\\xcf\\x0a\\x02\\xc4\\xa9\\x2b\\x62\\x5f\\xd1\\x44\\x5e\\x55\\xfe\\xd1\\xd5\\x91\\xd1\\x94\\xba\\x4c\\x05\\x62\\x6b\\x86\\xe3\\xcb\\x0d\\x07\\xc5\\x58\\x9f\\x91\\x75\\xcf\\xfa\\x66\\x0a\\x70\\xcb\\xfd\\x96\\x3d\\xa2\\x40\\x7e\\xbf\\x11\\x4c\\x9e\\xa9\\x5b\\x00\\xe1\\xc3\\x38\\x62\\xd4\\xb0\\x06\\x99\\x9d\\x1e\\x56\\x55\\x45\\xc1\\x9b\\xf8\\xc7\\xec\\xeb\\x22\\x00\\xb4\\xf1\\x8e\\x4f\\xd7\\x26\\x6f\\xeb\\x17\\x62\\xb6\\x72\\x56\\x0d\\xeb\\xb6\\x3e\\xd0\\x61\\x62\\x54\\x8d\\xf3\\xa5\\x74\\x20\\x2c\\xc0\\xe1\\xa9\\x57\\xc2\\x0a\\xe8\\x34\\x57\\xe2\\xe6\\xd7\\x52\\x33\\xc6\\x4c\\x94\\xc7\\x85\\x4a\\x8a\\x38\\xea\\x84\\xc6\\x36\\x5c\\xf1\\xc9\\xcf\\xda\\xc5\\xf4\\xb5\\x8d\\x4e\\x35\\xab\\x47\\x91\\xce\\xb0\\x59\\xa1\\x70\\x6c\\x85\\xbf\\xed\\xda\\xb3\\x19\\xe3\\xd4\\xd2\\x8c\\x58\\x44\\x50\\xde\\x9d\\x23\\x77\\xb6\\x8e\\x7c\\x4c\\xcb\\x44\\x20\\x2e\\x51\\x94\\xbd\\x23\\xcd\\x5c\\xf2\\xc7\\xc9\\x23\\x6c\\x2b\\xf3\\x3a\\x2f\\xba\\x9a\\x17\\xc4\\xde\\x30\\xeb\\x15\\xc7\\xfc\\xd2\\x16\\xba\\xe2\\xe7\\x4f\\x12\\xd4\\x33\\x44\\x62\\xa6\\x7b\\x87\\xb9\\xfc\\xc9\\x4d\\x2e\\x61\\xab\\xbc\\x04\\xe9\\x23\\x0c\\x02\\x85\\xcd\\x7f\\xdd\\xae\\xd5\\x48\\x0f\\xd7\\x92\\xc5\\xcf\\xc6\\x12\\x6c\\x76\\x81\\xf6\\x66\\xd2\\x90\\x6c\\xbf\\x86\\xc5\\xf8\\x42\\x58\\xc3\\x85\\x38\\x47\\xc4\\x69\\x4b\\xb2\\x92\\xef\\x7c\\xf6\\x22\\x04\\xc2\\x2d\\x10\\xf8\\x28\\x01\\x56\\x75\\x30\\xe8\\x04\\xc3\\x90\\x82\\x87\\xae\\x69\\xb4\\xc5\\x35\\xb7\\xac\\x58\\x8d\\xda\\x67\\x03\\xcf\\xc1\\x3c\\x97\\x1f\\xba\\x09\\x79\\x40\\x4a\\x90\\x5b\\xd8\\xd6\\x3f\\x1d\\xd9\\xdf\\x36\\x67\\xea\\xe1\\xa7\\xe2\\xc1\\xb5\\xb4\\x2b\\x05\\x0e\\xa7\\xe5\\x66\\xec\\xc1\\xb3\\xb4\\xce\\x8c\\x4a\\x24\\x1b\\x21\\xba\\xe9\\x41\\x9e\\x0d\\xe9\\xce\\xc1\\x71\\x97\\xb8\\x1f\\x2b\\x45\\x2d\\x7e\\x56\\xea\\x3b\\xe5\\xf5\\x44\\x2d\\x2d\\x81\\xe3\\x14\\x1a\\x87\\x46\\x42\\x76\\xe2\\x7f\\x51\\x88\\x54\\xd6\\x1a\\x21\\x80\\x5d\\x8a\\xe8\\xeb\\x75\\x1d\\xa2\\x7f\\x6e\\xce\\xb2\\xc3\\xf4\\x16\\x84\\x9f\\x31\\x19\\x1f\\x30\\xe6\\x97\\x2d\\xb5\\xc8\\x28\\x5f\\xe4\\xe3\\xbc\\x93\\x3d\\x45\\x20\\xa6\\x12\\xdd\\x55\\x56\\x16\\xf8\\xfd\\xa7\\x30\\x15\\x1e\\xe9\\xce\\x05\\x50\\x48\\x1d\\x98\\xee\\xae\\xf2\\x9a\\x1f\\x31\\x74\\x61\\x60\\xa1\\xa9\\xac\\xda\\xeb\\x88\\xa2\\x64\\x30\\xe3\\x2f\\x71\\xbf\\x71\\x0a\\xb6\\x87\\x90\\xda\\x84\\x9e\\xd1\\xc2\\xa4\\x18\\x72\\xc6\\x0f\\x57\\xb4\\x0e\\xa1\\x75\\xfc\\x54\\xe2\\x4c\\x05\\x19\\x97\\x78\\xea\\x59\\x58\\xf7\\xb7\\xfa\\x07\\xe3\\xff\\xca\\xb9\\x95\\xe9\\xe7\\x6b\\xc0\\x63\\x1a\\xff\\xd0\\x32\\xd4\\xe9\\x67\\x89\\x4e\\xb4\\x62\\xe0\\xcb\\x2d\\xb0\\x9d\\xfd\\x4b\\xcd\\x83\\x23\\xc6\\x41\\xc9\\x5a\\xcb\\xbd\\xbd\\x78\\x54\\x23\\x7d\\xaf\\x9f\\xd2\\xae\\x1a\\xf1\\x1a\\x5a\\xb3\\xcc\\x7b\\xc1\\x44\\x67\\xb0\\x9f\\x81\\x28\\x7f\\xa6\\x42\\x6f\\x61\\x2b\\xfe\\xd9\\x32\\xab\\x52\\xa3\\x9d\\x2a\\xae\\x33\\x1b\\x34\\x59\\x0a\\x12\\xe3\\xac\\x83\\xbb\\xba\\xc4\\x0f\\x99\\x31\\xdd\\x98\\x86\\x23\\xc9\\xda\\x0f\\x59\\x61\\xaa\\x1f\\x7b\\x08\\x2a\\x09\\xb9\\x1f\\x35\\xe8\\x87\\x1a\\xf9\\x58\\x90\\x7e\\x24\\x52\\x14\\x13\\x95\\xe4\\x6d\\x25\\x8e\\x3e\\x5a\\x14\\x9d\\x96\\x46\\xa4\\x03\\xb7\\x55\\xa8\\xe8\\xf9\\x47\\xa1\\x9f\\x04\\x9b\\x01\\xa6\\xe6\\xc1\\xd2\\x97\\xcf\\x73\\x55\\xeb\\xc6\\xf1\\xf5\\xb5\\xdf\\xb3\\x7b\\xe6\\x16\\x45\\xad\\xde\\xe6\\x66\\x9e\\x15\\xee\\xdf\\xc4\\xde\\xef\\xf5\\x97\\x19\\xd7\\x86\\x48\\x87\\x37\\x92\\x9d\\x47\\xc3\\x5c\\xa1\\xd9\\xcb\\x45\\x48\\xb6\\xe9\\x0a\\x7e\\x42\\x99\\x85\\x07\\x3f\\x57\\x1a\\x7c\\xf9\\xe7\\x56\\x82\\x87\\x65\\xb7\\xd0\\x83\\xbf\\x14\\x57\\x75\\x23\\x63\\x58\\x78\\x9f\\x0b\\x39\\x71\\xcd\\xb6\\x19\\x5f\\xa9\\xfb\\xe8\\xa7\\x92\\x38\\xd7\\x58\\x83\\x9f\\x06\\xde\\xb6\\x8a\\x92\\xe1\\xa6\\x71\\x2b\\x2a\\xe1\\xe4\\x08\\xc2\\xea\\x94\\x21\\x33\\x33\\x72\\x3d\\x33\\xd7\\x3f\\xd5\\x32\\xb7\\x04\\xd1\\x08\\x7f\\x3a\\x63\\x65\\xc4\\x67\\xdc\\xef\\xba\\x3c\\x49\\x5a\\xd8\\x87\\x02\\x8c\\x98\\xb4\\xc7\\xcd\\xd6\\xf8\\x73\\xbc\\x9e\\xca\\x5f\\x95\\x24\\x46\\xe9\\x1c\\x3b\\x73\\xc8\\x69\\xe2\\xb0\\x7b\\x6f\\x86\\x85\\xc2\\xce\\xdc\\x1c\\xb7\\x14\\x22\\x00\\x11\\x1e\\x06\\x8d\\xe3\\x6b\\x68\\xe8\\x33\\x1e\\x6a\\x7b\\xae\\x16\\x9b\\xf7\\xed\\xbc\\x84\\x4c\\x5b\\x8b\\xb1\\x5f\\x6f\\xce\\x40\\x92\\x2b\\xd3\\x99\\x93\\xdc\\x8f\\x24\\x9c\\x11\\x6a\\x4e\\x4a\\xcd\\x42\\xe9\\xe0\\x2d\\x5a\\x30\\x72\\x49\\x0c\\xa5\\xf3\\x16\\xeb\\xa3\\x18\\xce\\x6d\\x5c\\xe8\\x92\\xe4\\xde\\x33\\x79\\x0f\\xe5\\xfa\\x9d\\x25\\x77\\x83\\xc5\\xf4\\xe5\\x5e\\x09\\x8f\\x16\\xb9\\x8e\\xb3\\x2d\\x88\\x67\\xd1\\x78\\xfe\\xfb\\x97\\x92\\xfc\\x15\\x86\\x2f\\x96\\xe6\\x3f\\xf3\\xd3\\x4d\\xbd\\xc7\\x3d\\x56\\x70\\x57\\x5a\\xb6\\xdc\\x51\\x24\\x75\\x45\\xef\\x88\\x05\\xdb\\x23\\x71\\xbc\\x6d\\xad\\x71\\xbd\\x82\\x34\\xeb\\x29\\x67\\x36\\xc5\\x53\\x64\\xbb\\x94\\xac\\x6d\\xb0\\xda\\xa8\\xdf\\x16\\xad\\x51\\xe4\\x7a\\xfd\\x11\\xda\\x74\\x9e\\x65\\x41\\x15\\x2e\\xfb\\x4e\\x56\\x9e\\x29\\xd9\\xe1\\x31\\xce\\x83\\xcd\\x8b\\x4b\\xce\\xe5\\x55\\x6a\\xca\\x94\\xb6\\x18\\x0d\\x0c\\x7b\\xdf\\x55\\x19\\x56\\xfe\\x1f\\xa5\\xc5\\xbf\\x70\\x79\\x3f\\x97\\x9f\\x44\\x79\\xd1\\xa6\\x28\\xe9\\x03\\x7c\\x1d\\x2e\\x55\\xf2\\x8d\\x67\\xcb\\xcb\\x33\\x94\\xdb\\xea\\x0c\\x78\\xe2\\xa3\\xc2\\xcf\\xa0\\xf9\\xfb\\xda\\x77\\x4d\\xaa\\x25\\xff\\xe4\\xb9\\xaa\\xbf\\x70\\x84\\xa7\\x17\\x64\\xe7\\xc0\\x96\\xcd\\xfe\\xcc\\xf2\\x13\\x60\\xe9\\x01\\x0f\\xf0\\x57\\xb9\\x26\\x33\\x09\\xa2\\xa5\\x7d\\x94\\xf8\\x67\\x65\\x1a\\x1b\\x4e\\x33\\x04\\xa5\\xb6\\xa7\\xdf\\xd4\\xdc\\x68\\x34\\xc9\\x5c\\x9e\\xdc\\x1d\\x29\\x6f\\xdd\\xc7\\x0e\\xaa\\xe5\\x0e\\x4f\\xc6\\x44\\x37\\xa7\\xd3\\x00\\x62\\x4a\\xa7\\x1c\\xa5\\x6a\\x82\\x99\\xa8\\x14\\x25\\xe7\\x14\\xcf\\x12\\x25\\xb3\\x4f\\x28\\xe2\\xa4\\x4f\\xce\\x08\\xcd\\x7e\\xf7\\x17\\x69\\x78\\x65\\x27\\xdb\\xf9\\x09\\xfd\\x25\\x8e\\x8f\\x4f\\x20\\xcf\\x87\\x33\\x59\\x9c\\x50\\xe7\\xd0\\x58\\xb0\\xf6\\x6f\\xee\\x69\\xb2\\xe7\\x37\\x75\\x6d\\x09\\x14\\x06\\xc5\\xed\\xb3\\xd9\\xd2\\x39\\x33\\x69\\x78\\xeb\\x68\\x4c\\x85\\xc0\\xcf\\xb2\\xbc\\xb3\\xfc\\xa6\\x83\\x1d\\xfd\\x97\\x8c\\x6d\\xbd\\x1e\\x5c\\x4a\\x6e\\x6a\\xa2\\x56\\x3b\\x18\\x4a\\x2d\\xee\\x1c\\xd1\\xbe\\x72\\x37\\x76\\xd8\\xca\\x58\\x04\\x01\\x2c\\x20\\x51\\x91\\x0a\\x43\\x17\\x01\\xa2\\xa4\\x58\\x8e\\x6e\\xf8\\x4b\\xd1\\x64\\x7a\\xf5\\x45\\x6c\\xa5\\x21\\x26\\x70\\x25\\x4f\\x3f\\x6c\\x19\\xb7\\x38\\xcf\\x07\\xa8\\x2c\\x3d\\x8f\\xe0\\xe5\\x16\\x70\\x01\\x08\\xbb\\xda\\xeb\\x11\\xca\\x37\\x09\\xdb\\xff\\xd4\\xda\\x61\\x1f\\x10\\x74\\x52\\xbb\\xb8\\x6a\\x90\\x38\\xcf\\xee\\xe5\\x5d\\x17\\xf3\\xbe\\x66\\x7d\\x89\\xf2\\xa3\\x2d\\xaa\\xa0\\x25\\x4b\\xc4\\xe9\\xc6\\xbb\\xec\\x53\\x21\\x4b\\xb8\\x1f\\xa6\\x13\\x22\\x92\\x1e\\xfd\\xf9\\x1b\\xc9\\x71\\xa4\\x2f\\x24\\x30\\xe4\\xbf\\x10\\xb4\\xdf\\xf1\\xc7\\x9f\\xc0\\xeb\\xab\\x95\\xf6\\x19\\x32\\x9d\\x77\\xb5\\xc3\\x35\\xec\\x75\\x54\\x79\\xc3\\x06\\x2a\\xc3\\x80\\xea\\x69\\xe0\\xc4\\x92\\x9a\\x57\\x2c\\x33\\xfe\\xc0\\x4a\\x3c\\x38\\x33\\xdf\\x05\\x39\\xe1\\x07\\x76\\xb1\\x56\\x2e\\x58\\x74\\xd3\\x0c\\x64\\xef\\x40\\xe1\\x60\\x7a\\x1c\\x68\\x82\\x35\\xbb\\xc4\\xbe\\xcc\\xd3\\x39\\xfe\\x41\\x09\\xcd\\x2e\\x23\\x0e\\x9a\\x80\\x40\\x78\\x7c\\x21\\x1e\\x39\\x75\\x83\\x90\\xe7\\x19\\xd9\\x5e\\x29\\xce\\x57\\x65\\xf2\\x50\\xae\\x3c\\x41\\xc6\\xbd\\xb1\\x97\\x8e\\x58\\xe8\\x2c\\x0d\\xd7\\x74\\x30\\xe9\\x0f\\x6c\\x7a\\xc3\\x07\\x66\\x28\\x02\\x9e\\x05\\x5c\\xd2\\x8a\\x69\\x43\\x62\\xf6\\x30\\x67\\x31\\x79\\xf7\\x99\\xa8\\x1c\\x2a\\x86\\xf8\\xa7\\x40\\x26\\x36\\x00\\x38\\xad\\x4d\\xe3\\x57\\x88\\x9f\\x57\\x01\\x8b\\x4e\\xbe\\x29\\x5e\\x79\\xfb\\xdb\\xf5\\xae\\xdf\\x3d\\xe0\\xff\\x90\\x3a\\x3c\\x3a\\x2f\\x58\\xff\\x5e\\xa3\\xca\\x8c\\xfa\\xfd\\xb0\\xa6\\x48\\xef\\xcd\\xe1\\x11\\xb0\\xc9\\x3a\\xdb\\xe2\\x17\\xfa\\xac\\xed\\x63\\xc7\\x78\\x9f\\x28\\xcb\\x28\\xf1\\x49\\x4d\\x9e\\xe2\\xe4\\x32\\x9c\\x74\\xc7\\x10\\x0b\\x7b\\xd1\\xc1\\x1d\\xf2\\x00\\x9e\\xfc\\xfb\\x8e\\xe7\\x1f\\x53\\x60\\xd2\\xae\\x2a\\x87\\x21\\x79\\x65\\x11\\x4b\\x01\\x45\\x53\\x54\\x56\\xe0\\xab\\x57\\xab\\xb8\\x05\\x15\\x5d\\xda\\xc8\\x5d\\xca\\x1e\\xb7\\x85\\xfe\\x82\\x2c\\x7b\\xf9\\x82\\x16\\x2d\\x53\\x06\\xea\\x72\\x7b\\x6e\\xdc\\x40\\xe6\\x84\\x5a\\x8b\\xd5\\x1c\\xac\\x46\\x99\\x6a\\x22\\x5d\\xf7\\xe1\\x98\\x75\\xda\\xc7\\x1a\\x6c\\x70\\x22\\x25\\xd3\\x72\\x08\\xa5\\x3d\\x0e\\x68\\x6d\\x24\\x21\\x61\\xd8\\x12\\x87\\x1e\\xc3\\xf1\\xce\\xe6\\x84\\x1b\\xfb\\xe8\\xbb\\x67\\x69\\x54\\x4f\\x1c\\xda\\xa9\\xf1\\x62\\xdb\\x42\\x16\\xbd\\xbf\\x03\\x59\\x13\\xf7\\x5a\\xcb\\xb8\\xa3\\x81\\x8d\\x69\\xc0\\xd4\\xea\\xc4\\xdd\\x78\\xad\\x74\\x39\\xaa\\x69\\xbf\\x94\\xa9\\x11\\xbe\\xa2\\x03\\xbb\\x9a\\x02\\xbb\\x52\\x80\\x82\\x14\\x84\\x89\\xf2\\xbd\\x7e\\xbc\\x9d\\x47\\x0c\\x5a\\xd2\\x87\\x6e\\x08\\x19\\x6e\\xa4\\x25\\xc7\\x4a\\xe0\\x3a\\x72\\x75\\xc8\\xa7\\x1d\\xb1\\x65\\xcb\\x0f\\xc4\\xa2\\x7e\\x27\\x17\\x9a\\xc8\\x68\\xf1\\x7d\\x9c\\x3b\\x22\\x89\\x8e\\xf5\\xa2\\x8a\\x51\\xe4\\xa4\\x4c\\x39\\x48\\xfd\\xc0\\x7e\\x4d\\xc6\\xc8\\x28\\xb4\\x78\\xa4\\x8a\\x84\\xba\\xd5\\xec\\x21\\xf1\\x84\\xe2\\xce\\x53\\x5d\\x11\\xef\\x42\\x8e\\x2c\\x39\\xb6\\x7d\\x24\\x05\\xb2\\x3d\\x81\\x58\\x18\\xdf\\x75\\x6c\\xb0\\x99\\x03\\x14\\x6c\\x6d\\x4a\\x27\\x54\\xe3\\x03\\x6f\\x4f\\xdb\\x3e\\xe6\\x6e\\xec\\x58\\x13\\xee\\x7d\\xdc\\xdd\\xb0\\x32\\x70\\x2a\\x96\\x46\\xae\\xa2\\x65\\x2a\\xaf\\x64\\xe3\\x7b\\xdb\\xc8\\xae\\xe0\\xf4\\x23\\x69\\x01\\x1d\\x11\\xec\\x6e\\xc2\\xa0\\xf2\\xda\\x57\\x7c\\x05\\x9f\\xe2\\x0f\\xee\\x1b\\x45\\xeb\\xa5\\x6b\\x71\\x83\\x26\\x0f\\x99\\xae\\x5e\\xc9\\x7a\\xfa\\x05\\x0e\\xf2\\x6c\\xd4\\x9e\\xd6\\xf1\\x29\\xd7\\x76\\xfe\\xbd\\xa3\\x90\\xc6\\x63\\x43\\x17\\x85\\x43\\xc9\\xd0\\xcb\\xb5\\x4d\\x2f\\x14\\xb3\\x27\\xd3\\xa5\\x52\\x5c\\x0f\\x23\\xbb\\xff\\x0f\\xcc\\x23\\x33\\xdc\\x65\\x24\\x4a\\x77\\xb2\\x60\\xf1\\x7d\\xf5\\xed\\xa9\\xdd\\x6e\\xae\\xde\\x1f\\x6e\\x31\\xa8\\x3b\\xaa\\x83\\x5b\\x62\\xee\\x85\\x77\\x6f\\x94\\x5f\\x3c\\xb7\\xe5\\x3d\\x66\\x0a\\x7c\\x4d\\x39\\x48\\xef\\x24\\x25\\x79\\xd4\\x52\\x4e\\x74\\xb2\\xf3\\xc2\\x06\\x6e\\xae\\x52\\x36\\xf9\\x1b\\x09\\x16\\xb5\\xd8\\xe6\\xf1\\x2c\\x01\\x95\\x74\\x34\\x0a\\xdc\\xeb\\xac\\x59\\x1b\\x84\\x2d\\xf0\\x49\\x63\\x06\\x7c\\xdc\\x5c\\x50\\xf2\\x06\\x58\\x84\\x2d\\x52\\x28\\x2f\\xf8\\xcc\\xa2\\x89\\x05\\x81\\x55\\x49\\x3d\\x24\\x82\\xd6\\x3c\\xeb\\x2c\\xad\\xdc\\x40\\xc4\\x59\\xed\\xc4\\x82\\x5b\\xec\\x92\\x5d\\x6e\\x0d\\x86\\x58\\x29\\xc4\\xcb\\xd8\\xeb\\xba\\x30\\xd8\\xba\\x32\\x05\\x7f\\xb8\\xbf\\x2e\\x9c\\xf0\\x1e\\x52\\xba\\xe2\\x5c\\x3a\\x8e\\x87\\x26\\x65\\x9e\\x88\\xee\\x69\\xfa\\xe5\\xc3\\x99\\x99\\x7b\\x22\\xff\\xb4\\x7d\\x23\\xb7\\x63\\x1b\\xcf\\xfb\\x7c\\xa8\\x7d\\xef\\x37\\x79\\x3f\\xd7\\xd7\\x98\\xc9\\x70\\x5b\\x9a\\xd2\\x91\\xf6\\xfb\\x93\\xe1\\x8e\\xcd\\xbe\\x7b\\x3b\\x77\\x0e\\x1e\\xd8\\x3c\\x30\\xcd\\xbc\\x19\\x69\\x6e\\x01\\xaf\\xe4\\xf5\\x4a\\xbd\\x94\\xe4\\xcc\\xbc\\xb2\\x8b\\x52\\x01\\xd2\\x35\\xe0\\x53\\xf3\\x2c\\xe9\\x03\\xcd\\x9f\\x9a\\xd7\\xb3\\x4b\\xa7\\xe6\\x8d\\x00\\x34\\x49\\xcb\\x3c\\x3e\\xdd\\x67\\x58\\x79\\x6a\\x3e\\xae\\x50\\xa1\\x55\\x27\\xe7\\xc7\\x3b\\x51\\x82\\xcb\\xfd\\x64\\xc5\\xf9\\x79\\xc5\\xcb\\xc7\\x2e\\x65\\x16\\xbe\\x83\\x0f\\xd1\\xff\\xcf\\xb9\\xa7\\xdf\\xa9\\x60\\x56\\xdd\\xf3\\x09\\xb4\\xa9\\x33\\xf7\\xe7\\x1b\\x56\\xde\\xf3\\xe9\\x4b\\xc7\\x26\\x6f\\xbc\\xa7\\x01\\x30\\xc6\\x0d\\xf7\\x34\\x2e\\xdf\\x33\\x5f\\xaa\\x46\\x58\\xd8\\xcd\\xab\\xee\\xc9\\x3b\\x55\\x01\\xd5\\xea\\x21\\x01\\x95\\xa8\\x20\\xbc\\xd0\\xfc\\xc6\\x7b\\x9b\\x56\\xde\\xf8\\xf0\\xab\\xaf\\xb4\\x7f\\xeb\\xc8\\xc2\\x33\\xf2\\xcc\\x00\\xe9\\xde\\x7b\\xe1\\xde\\xa5\\x10\\xf5\\xa4\\xaf\\xbf\\xb7\\x27\\x7f\\x6f\\x5c\\x0b\\xc3\\x93\\x39\\x5d\\x9c\\xa8\\x55\\x90\\x68\\x08\\xc7\\x3e\\xb0\\x12\\x0f\\xac\\xc4\\x9b\\x10\\x8d\\x38\\xf2\\x51\\xe3\\x12\\x9f\\xcb\\x2c\\x58\\x57\\xae\\xac\\x46\\x4a\\x34\\x2f\\xc9\\x0d\\x19\\x4f\\xb1\\x6a\\x9d\\xec\\x81\\x31\\xff\\x9d\\xad\\x71\\x23\\xc7\\x79\\xef\\x48\\xf5\\x70\\x5c\\xba\\x21\\x56\\x18\\xae\\x09\\xad\\x5a\\xf6\\x0f\\xb2\\x5c\\x92\\xab\\x0f\\xdf\\x95\\x6e\\x8d\\x6c\\x8e\\xc4\\x5b\\x17\\xee\\x27\\xeb\\x67\\xe5\\xf5\\x77\\xc0\\xfa\\x6d\\xe0\\xdd\\x2b\\xf0\\x99\\x83\\xd5\\x14\\xd8\\x97\\x28\\x00\\x8c\\x56\\xce\\x03\\x58\\x01\\x22\\x00\\xb1\\xf9\\x39\\x41\\x7d\\x55\\x34\\xea\\xe7\\xf1\\x29\\xbb\\x42\\x9c\\x01\\xd1\\xcf\\x4b\\x6d\\xf9\\xb8\\xab\\x50\\x69\\x4f\\x90\\x79\\x26\\x88\\x76\\x92\\x73\\xe0\\x96\\xac\\xc2\\x41\\x26\\x9b\\x88\\xc8\\x2e\\xf7\\x29\\x2c\\x11\\xb8\\x6a\\x3c\\xef\\xd2\\x73\\x29\\x53\\xb6\\x82\\x4a\\x5f\\x2a\\x18\\xf2\\x78\\xea\\x42\\xc1\\xd4\\x28\\x10\\x96\\xa9\\xc5\\xcf\\x50\\x2a\\x14\\xac\\x5d\\xa2\\xf1\\x7d\\x39\\x65\\x96\\x5a\\xf0\\xa3\\xff\\x4e\\x97\\xac\\xca\\x9b\\x79\\xae\\xe5\\x80\\xce\\x5e\\xca\\x41\\x15\\x51\\x7e\\xea\\x2b\\x4b\\xbd\\xa9\\x82\\x9d\\xc3\\x43\\x35\\xb0\\xb2\\x6b\\x64\\xcb\\x2b\\x37\\x2c\\x19\\x49\\xc3\\x12\\x0b\\x3e\\xad\\x58\\xf2\\x70\\xc5\\x26\\x5c\\x46\\x9b\\x33\\x48\\x39\\x00\\x9c\\x44\\x63\\x1d\\x52\\x9b\\x48\\xb1\\x19\\x9f\\x3f\\x28\\xb3\\xcc\\x6a\\x50\\x91\\x19\\x87\\x2c\\x06\\x33\\x44\\x62\\x94\\xe8\\x03\\x7b\\xf0\\x3c\\x6b\\x40\\xe6\\x22\\xa9\\x95\\x1f\\x0f\\x97\\x5b\\x39\\x6c\\x48\\x1e\\x4c\\xa1\\x43\\x2b\\x60\\x8f\\x07\\xfd\\xa0\\xb5\\xdf\\xcd\\xb7\\x04\\x02\\x5b\\x78\\x77\\x7f\\x1a\\xbd\\xbb\\x34\\xaf\\xe2\\x4e\\xb0\\x00\\x91\\x88\\xcf\\xc7\\xd3\\xec\\xc7\\xea\\xa1\\x56\\x7f\\x7d\\xc4\\xed\\x8e\\xd4\\xfb\\x5b\\xf7\\x28\\x3f\\xd3\\x03\\xfd\\x87\\xd1\\x7b\\xe8\\xbf\\xa3\\xb7\\x03\\xb1\\x58\\x20\\x18\\x8b\\x61\\x5b\\x08\\x11\\x19\\xf3\\x0e\\x9b\\x83\\x28\\xd7\\x4a\\x9d\\x94\\x4f\\x85\\x51\\x46\\x9e\\x5f\\x1e\\x63\\x60\\x25\\xc7\\xf1\\xe6\\x0c\\x26\\x3d\\x39\\x40\\xa9\\xc0\\x03\\x06\\xf4\\x4b\\x43\\x0d\\x6c\\xd2\\x59\\x4a\\x03\\xd9\\x62\\x3d\\x22\\x29\\xf0\\x7c\\xe0\\x4b\\x66\\x8e\\x69\\xe8\\xa5\\x71\\x03\\x76\\xa9\\xe2\\x53\\xfb\\xaf\\x1f\\x8c\\xe4\\x0f\\x92\\xa1\\x2b\\xf0\\xef\\x04\\xeb\\x95\\x59\\x83\\xd1\\x8a\\xa7\\xf6\\xe2\\xdf\\xcc\\x2c\\x32\\x98\\xac\\xcb\\x53\\x74\\x79\\xb4\\x3c\\x10\\x01\\x7e\\x18\\x2b\\x38\\x7b\\x35\\xfa\\x16\\xbd\\x35\\x77\\x16\\x05\\x73\\xbf\\x42\\x3d\\xb9\\x60\\xee\\xe3\\xe1\\x47\\x7e\\xeb\\x58\\x1a\\x91\\x00\\x2f\\x9d\\x43\\xbf\\xa0\\x2f\\xe2\\xda\\x2c\\xe0\\x6e\\x3c\\xdb\\x62\\x33\\xee\\x9f\\xca\\x8f\\xb4\\xc0\\x18\\x85\\x93\\xbc\\x2b\\x1e\\x3b\\x99\\xcc\\x4f\\xb6\\xc0\\x0d\\x89\\x51\\x3c\\x0f\\x10\\x40\\x37\\x9e\\xc6\\x1a\\x85\\xbd\\x69\\xd0\\x28\\x2c\\x25\\xbe\\x8a\\xf5\\x1b\\x62\\xd2\\x78\\x28\\x0e\\x3b\\xc9\\x0d\\xb8\\xe8\\x3c\\x4b\\x39\\x03\\x61\\x32\\xfd\\x42\\x6e\\x74\\x97\\x66\\x15\\xdc\\x6c\\xfc\\x05\\x32\\x22\\x59\\x82\\x03\\xcb\\x48\\xbd\\x8a\\xe9\\xea\\x3b\\x7a\\xa1\\x6d\\xd5\\x40\\x8c\\xde\\x4d\\xf9\\x81\\x18\\xb1\\xf3\\x03\\x3a\\x02\\xdb\\xf7\\xca\\x30\\xde\\x96\\xf9\\xde\\xc1\\x34\\xbd\\xff\\x65\\x84\\x4e\\xa6\\xd6\\x1e\\x8f\\x91\\xb9\\x5f\\xdf\\x4e\\xa0\\xfd\\x0e\\x09\\xe8\\x3f\\xa5\\xee\\xfc\\xce\\x07\\xf2\\x79\\xe4\\x19\\xb0\\x7f\\x38\\x9f\\x71\\xcb\\x49\\x15\\xa6\\x5b\\x4d\\xaa\\x30\\xdf\\x30\\xa9\\x02\\x81\\x13\\x58\\x31\\xad\\x62\\xf1\\x59\\xec\\x02\\x96\\x36\\x84\\x98\\x7f\\x92\\x57\\xf9\\x7f\\x7d\\x1d\\xe0\\x18\\x56\\xae\\xe3\\x5d\\xe2\\x16\\x96\\x17\\x82\\x7d\\xc2\\xea\\x75\\x58\\x96\\xa6\\x22\\xde\\x74\\x1d\\xd6\\x5b\\xad\\x03\\x87\\xdc\\x1a\\x4a\\xea\\x47\\xbf\\x7e\\x3d\\xc4\\x69\\xac\\x5c\\xd2\\x80\\xec\\x32\\x96\\x17\\x25\\xf9\\x0b\\x62\\x83\\xa4\\x75\\x75\\xc0\\xba\\x0a\\xc1\\x06\\x7d\\xf5\\xf3\\x57\\x86\\x87\\x51\\xf8\\x78\\xd1\\x08\\xe6\\xb6\\x24\\x9a\\x37\\x4a\\x6b\\x2e\\x53\\xaf\\xc1\\xd3\\x73\\xad\\x60\\x89\\x35\\x52\\x62\\xad\\x4c\\x4f\\xca\\x45\\xd8\\x42\\xe1\\x51\\x7a\\xe0\\x5b\\x12\\x09\\xb1\\xac\\x08\\x48\\x28\\xb9\\x81\\x84\\x95\\xc6\\xd7\\xbf\\xd2\\xf2\\xae\\xa4\\xaa\\x67\\xc9\\xf4\\xa2\\x07\\x96\\xed\\xee\\x32\\x8d\\x4b\\x86\\x37\\xb8\\xc2\\xe6\\xd2\\xd2\\x3c\\x8b\\x65\\x79\\xb8\\xe9\\x44\\x0b\\xd3\\x6d\\x4d\\xb4\\x30\\xdf\\x30\\xd1\\x02\\xcb\\x65\\x7e\\xaa\\xc5\\xe2\\x07\\x58\\x28\\x97\\x66\\x5b\\x28\\x7e\\x46\\x84\\xf2\\x7f\\xc1\\x1a\\x40\\x26\\xf3\\x6b\\xc8\\x05\\x89\\x40\\x2e\\x2f\\xe2\\x0c\\x16\\xc8\\x95\\x6b\\xb0\\xe0\\x5e\\xd9\\x9b\\xae\\xc1\\x7a\\x5b\\x6b\\x20\\xf2\\x88\\x0f\\x18\\x14\\x18\\xcc\\xd2\\x01\\x83\\xd5\\xeb\\x21\\x32\\xb9\\xc4\\x96\\x6f\\xcb\\x02\\xb9\\xbc\\xa8\\x23\\xb2\\x40\\x32\\xf2\\xba\\x56\\xc8\\xe3\\x4d\\x56\\x76\\xa3\\x28\\xde\\x7a\\x99\\xb3\\x56\\x0d\\x0d\\x52\\xa9\\xd7\\xe3\\xf4\\xdf\\x75\\xc2\\x49\\x24\\x73\\x59\\x1e\\x57\\x2d\\xff\\xa6\\xf2\\xb8\\x44\\xd1\\xe9\\x35\\x85\\x71\\x99\\xbe\\xf9\\x35\\x84\\x91\\xa6\\x52\\x40\\xeb\\x65\\x32\\xdb\\xc9\\x43\\xed\\x96\\xfb\\xae\\xf1\\x59\\x2f\\x86\\x74\\x42\\x28\\xe7\\xe7\\x10\\x65\\x62\\x0a\\x20\\x56\\x90\\x8e\\x48\\x95\\x48\\x73\\xee\\xcd\\x24\\xd9\\x6b\\x35\\x60\\xc8\\x93\\xb5\\x92\\x3e\\x25\\x6b\\x29\\x04\\x59\\x66\\x12\\xde\\x9a\\x31\\xa9\\x56\\x12\\xd6\\x93\\x19\\x19\\xde\\xa5\\x01\\x24\\x1a\\xa7\\xdc\\x9d\\xb5\\x34\\x80\\x48\\xa5\\xf4\\x79\\xcd\\x56\\x3c\\x84\\xa8\\x9a\\x0e\\x21\\x1c\\x21\\xa5\\x76\\xa1\\x92\\x23\\x3f\\x1a\\x4f\\x04\\x77\\x1c\\x68\\xed\\xf8\\x76\\x6e\\x61\\x7a\\xe2\\xe5\\xbf\\xbb\\xf4\\xf2\\xf1\\x5f\\xfd\\x8a\\xde\\x33\\x46\\xbb\\xfb\\x2e\\xfc\\xcb\\xf1\\xde\\xef\\x7f\\x77\\xd2\\x1b\\xa0\\xf7\\xe6\\x0a\\x90\\xfe\\xf7\\x1f\\xa3\\xe2\\x5c\\xef\\x18\\xd1\\x2b\\x32\\xc3\\x03\\x30\\xa7\\x9e\\xf2\\x51\\xd3\\x6b\\x4f\\xf1\\xc0\\x38\\xd3\\xa6\\x20\\xc7\\xa3\\x8c\\x8a\\xa5\\x23\\x86\\x6b\\xcc\\xf4\\xf0\\xe7\\x07\\x8c\\x14\\xe0\\x03\\x94\\x73\\xb4\\xd1\\xe6\\xc2\\x63\\x37\\x05\\x8d\\x25\\xab\\x75\\x16\\x12\\xc4\\xb6\\x34\\xe3\\x43\\xb4\\xe1\\xec\\x4d\\x81\\x2f\\x41\\xce\\x24\\x14\\xe2\\xa4\\x84\\x84\\xe4\\x56\\x4e\\xfe\\x60\\xd6\\xc2\\xab\\x4b\\xe3\\x40\\x6a\\xd6\\x86\\xaa\\xd7\\x4d\\x09\\xb9\\x1e\\xad\\x82\\xac\\x92\\x99\\x21\\xa0\\x43\\xb8\\xdf\\x3f\\x44\\x6d\\xbf\\x7e\\x6a\\x88\\x0f\\x97\\x8b\\x36\\xac\\x35\\x35\\x24\\x2c\\x77\\xfc\\xcf\\x2a\\x8c\\xeb\\xd6\\x13\\x2f\\x8f\\x9b\\xfe\\xb3\\x94\\x4d\\x9b\\xb8\\xf5\\xe8\\x90\\x4a\\x03\\x8d\\x23\\xa0\\xcf\\x9f\\x1d\\x52\\xbf\\xaf\\x2f\\xd9\\x4b\\xac\\xcf\\xe7\\x4e\\x0f\\xa1\\x23\\xc3\\x57\\xe8\\x33\\x92\\xaf\\xfc\\xcf\\xa4\\x07\\x0c\\xd6\\xad\\xe9\\x79\\x52\\xb2\\x64\\xb7\\x26\\x68\\x9c\\xf8\\xdc\\xd5\\xf4\\x54\\xdd\\x84\\x1e\\x6e\\x2d\\x7a\\x36\\xae\\xa0\\x27\\xf4\\xff\\x88\\x1e\\x62\\xf0\\x6e\\x4d\\x52\\x59\\xde\\x12\\xde\\x9a\\xa8\\xc1\\x65\\x9f\\x2d\\xd1\\xb5\\x97\\xcc\\xaa\\xa9\\xa3\\x46\\x65\\xba\\x36\\xe6\\xe9\\xda\\xac\\x26\\xa5\\x19\\x9c\\x06\\x0d\\x90\\x46\\x4f\\x24\\xd4\\x13\\x2a\\x43\\x46\\xd2\\xb5\\x1f\\x93\\xa9\\x6c\\xc0\\x5d\\xfb\\x58\\xcd\\x6c\\xb8\\x28\\xf8\\xbc\\xc2\\x51\\x5a\\xbe\\xde\\x48\\xc6\\xaf\\xe0\\xc1\\x58\\x94\\xb8\\x79\\x23\\xa6\\x39\\x84\\x69\\x16\\x5d\\xe5\\xa0\\x65\\xb6\\xf5\\x24\\x59\\x06\\x6f\\xde\\xc8\\x83\\x35\\x43\\x42\\xe6\\x7a\\xc6\\xdc\\xc0\\x91\\x83\\x6b\\xeb\\xde\\x1d\\xd7\\x33\\xea\\x06\\x06\\x31\\x3f\\x5f\\xad\\x8e\\x8b\\x8e\\xeb\\x39\\x26\\xe5\\x4a\\x25\\x5e\\x75\\x10\\x19\\xa8\\xa6\\x1a\\xa9\\x03\\x6b\\x48\\x01\\x6e\\x4f\\xaa\\xe7\\xc5\\x10\\xf8\\x92\\x4d\\x60\\x63\\x9b\\x56\\x8a\\xc4\\x3a\\xfc\\xbd\\x13\\x7a\\xf2\\x25\\x15\\x98\\x6f\\xb5\\x7a\\xd2\\xa2\\x90\\x17\\x94\\x2d\\xf0\\x18\\xe3\\xf0\\x41\\xdb\\x22\\x23\\x8e\\x29\\x6b\\xcd\\xb8\\x07\\xec\\xdf\\x2b\\x2d\\x37\\xf5\\x2f\\xb7\\x16\\x20\\xcb\\xda\\x8e\\xe7\\xd6\\xe2\\xf4\\xe3\\xb5\\xe0\\x11\\xc4\\x2f\\x17\\x51\\x90\\x39\\xc0\\x2a\\xc1\\xff\\x52\\x56\\x0d\\x8a\\x93\\x14\\xa7\\x4a\\x83\\x2e\\x22\\x3a\\x97\\xeb\\xcf\\x21\\x7a\\x67\\xee\\x7f\\x20\\xb6\\x2f\\xb7\\x70\\x8d\\x42\\x47\\x50\\x01\\x32\\xf5\\xe5\\x3e\\x42\\xfa\\x9e\\xdc\\x87\\xb9\\xdf\\xf6\\x21\\x53\\xee\\x13\\x59\\x3e\\x0f\\x32\\x2f\\x2b\\xf6\\x42\\x54\\x5b\\x41\\x6d\\xc0\\x13\\x61\\x2d\\x64\\x8a\\x64\\x9e\\xe3\\x1e\\xac\\x77\\x61\\x69\\x42\\x80\\x91\\x4c\\x08\\xc0\\xe7\\x95\\x0b\\x4c\\xf3\\x82\\x36\\x2a\\x56\\xc9\\xf3\\x01\\x44\\x47\\x21\\xc9\\xc0\\x3e\\xaf\\xb6\\xd8\\x15\\x6e\\x3f\\x16\\xcb\\x02\\xf0\\x61\\x3a\\x6c\\xfc\\x03\\x16\\x29\\xc4\\xf5\\x98\\x9f\\xd7\\x15\\x16\\x94\\xf8\\xc9\\x24\\x49\\x85\\x85\\x9c\\x7d\\xc9\\x1f\\xe4\\xc6\\x1d\\x60\\xe6\\xfc\\x79\\xfa\\x40\\x1c\\x7f\\xa7\\x07\\x22\\x85\\x39\\x03\\xb2\\x42\\x34\\x64\\x31\\x57\\x07\\x92\\x4d\\xe3\\x17\\xf6\\xa4\\xc6\\x6b\\xfa\\x86\\x47\\xc6\\xda\\x0f\\x9e\\xe9\\x48\\x8e\\x27\\x76\\xef\\x1d\\x9f\\x39\\xba\\x15\\x9d\\x6d\\xef\\x8b\\xed\\x8b\\x70\\xc9\\x27\\xda\\x3a\\x9f\\x7a\\x26\\x4e\\x4f\\x1d\\xff\\x97\\x0b\\x7d\\xc1\\x60\\x36\\xf9\\xc6\\xd9\\xdc\\x4b\\x2f\\x7c\\xfa\\x54\\x7d\\x65\\xe8\\xc5\\xf8\\xaf\\x2f\\xa2\\x3b\\xde\\x3d\\xcc\\x98\\xd2\\x7c\\x2c\\xf6\\xea\\xe2\\xf7\\x9a\\x11\\xa2\\x90\\xf6\\xd5\\x71\\xe2\\x0b\\xf1\\x1c\\x18\\xb0\\x3b\\xa5\\x54\\x39\\xb5\\xe5\\xfa\\x49\\x30\\xbe\\x9b\\x4d\\x82\\xa9\\x90\\x27\\xc1\\x64\\x8b\\x3d\\x5e\\x29\\x2b\\x71\\xeb\\x69\\x30\\xd8\\x11\\xac\\x3d\\x11\\xe6\\xaf\\xb1\\xf1\\xbf\\xc5\\x58\\x18\\xf6\\x71\\x6c\\xf9\\xff\\x97\\xae\\x17\\x0c\\xfd\\xda\\xeb\\x5d\\x20\\xc6\\xfd\\x56\\x0b\\xde\\x4f\\x2c\\xfb\\x6a\\x1e\\x93\\xb3\\x5e\\xab\\xd7\\x5c\\x79\\xb3\\x35\\x63\\x90\\xa7\\xa6\\xa4\\xc1\\x7f\\x78\\xed\\x73\\xc5\\x65\\x5e\\x1f\\x11\\x2e\\x3b\\xee\\xe9\\xbe\\x4d\\x1a\\x88\\x71\\x5f\\x9b\\x8c\\x69\\xd9\\xa0\\xdf\\x8a\\x90\\x6e\\xc9\\x9a\\x33\\x32\\x1d\\x1d\\x40\\x47\\x88\\xda\\x84\\x75\\x65\\x25\\x25\\xb8\\x21\\xb9\\x86\\x17\\xcb\\xc1\\x30\\x71\\x51\\x32\\x9f\\x69\\x99\\xac\\x59\\x8f\\x1a\\x87\\x58\\x95\\xfa\\x95\\x04\\xce\\xf2\\x76\\x0b\\xbc\\xb8\\x41\\x8f\\x33\\xcb\\x22\\xaf\\x97\\xc6\\x37\\x6d\\xa8\\x24\\xe7\\x71\\x04\\xde\\x2c\\x70\\xb7\\x49\\xe3\\x4d\\x4d\\xd2\\xda\\x64\\x7f\\x7d\\x4d\\x33\\x74\\x2b\\x26\\x5c\\x5a\\xd3\\x06\\xd1\\xd2\\xac\\x1b\\xd8\\x5b\\x35\\xa0\\xc9\\x1b\\xa6\\xdd\\x14\\x2c\\x4d\\xbb\\x31\\x7c\\xfe\\xb4\\x1b\\xfc\\xd5\\x1b\\xcb\\x13\\x6f\\xee\\x95\\xe2\\xf2\\x15\\x73\\x6f\\x98\\x73\\x92\\x30\\x2d\\xcf\\x4e\\xb3\\x83\\xfc\\x37\\xaf\\x98\\x9d\\x36\\x67\\x73\\x90\\xc8\\xd7\\x06\\x41\\xb0\\xba\\x9c\\x5c\\xaa\\xd5\\xf3\\x79\\x95\\xb0\\xc3\\x3e\\xa8\\x1c\\xd1\\x28\\xde\\x0c\\xa2\\x0c\\xac\\x34\\x84\\x91\\x5a\\x1e\\xba\\x68\\x5f\\x35\\x57\\x8d\\xcc\\x51\\xf5\\x79\\xc7\\xcf\\xb0\\x66\\x16\\x69\\x57\\x0c\\x57\\xfb\\x67\\x64\\x6f\\xba\\xbb\\xb6\\x98\\x95\\xc6\\xab\\x7d\\xca\\x2e\\xb0\\xb4\\xd2\\x65\\xf9\\x7e\\x62\\x60\\x3a\\x9d\\x9e\\xea\\x8b\\xe7\\x5e\\x40\\x2f\\x95\\xd7\\x76\\x92\\x2f\\xcd\\x21\\x36\\xfa\\x00\\xf8\\xb4\\x4b\\x8a\\x1e\\x90\\x97\\xbd\\xf2\\x6a\\x1d\\xf2\\x51\\x47\\x90\\x7c\\x3c\\xad\\x17\\x1c\\x1a\\x3e\\x2c\\x9e\\x97\\x18\\xfc\\x25\\x36\\x9b\\x48\\xa2\\x50\\x34\\x83\\x8c\\x68\\xcc\\x65\\x20\\x23\\x61\\x23\\x69\\xcf\\xd5\\xc8\\x23\\xbe\\xc2\\xf8\\x5b\\x6d\\x58\\x87\\xde\\x55\\x59\\x48\\x00\\x4f\\x00\\xe7\\x7e\\xf5\\x78\\x68\\x71\\xd4\\x2c\\x1f\\x76\\xaf\\x5e\\x2e\\xae\\xc8\\x73\\xbb\\x02\\x71\\xc9\\x91\\x2d\\x0d\\x8a\\x8d\\x2d\\x9d\\xf4\\x3d\\xf0\\x77\\xcf\\xb5\\xcd\\xec\\x4a\\x66\\xda\\x12\\xf7\\x34\\xfa\\x12\\x43\\xdf\\xe8\\x18\\xeb\\x6b\\x4d\\xdd\\x1d\\xea\\x6a\\x0c\\xb0\\x81\\xf4\\xc3\\x9d\\x75\\x69\\x7f\\x5b\\xd2\\xef\\xab\\xcf\\x54\\xc7\\x33\\x29\\x0f\\x33\\x90\\xfb\\x34\\xb9\\x73\\x7a\\x5b\\xf7\\xe3\\x01\\x4b\\x4b\\xff\\x68\\x7d\\xd7\\xa3\\x7b\\x93\\xf5\\x23\\x91\\xd0\\x96\\x6e\\xae\\x65\\xe4\\xce\\x0d\\x0f\\xbb\\x53\\x5f\\x6e\\x0c\\x75\\xd6\\xfb\\xe3\\x83\\x8f\\x64\\x16\\x9e\\x22\\x3e\\x86\\xcc\\xa4\\x51\\x9c\\x22\\x33\\x69\\x22\\x78\\x3e\\xfb\\x6d\\x4c\\xa5\\x89\\xde\\x74\\x2a\\x0d\\xbf\\x6a\\x2a\\xcd\\x25\\x32\\x95\\xa6\\x6a\\xe3\\x7f\\x78\\x2e\\x8d\\x35\\x6e\\x55\\xdd\\xde\\x6c\\x9a\\xf1\\xa9\\xb9\\xdd\\xb7\\x9c\\x4f\\xc3\\x7a\\x33\\xb9\\xff\\x3d\\x45\\xfd\\xff\\x87\\x7e\\x17\\x72\\x32\\xb7\\x47\\xff\\x85\\xb9\\xa9\\xd7\\x6f\\x49\\x3f\\xb3\\x3d\\xdf\\xaf\\x92\\xa7\\x7f\\x82\\xd0\\x5f\\x4d\\x3d\\x74\\x5b\\xf4\\xc7\\x6e\\x4a\\x7f\\xcd\\x2a\\xfa\\xbf\\x2f\\xd3\\x8f\\x87\\xd9\\x09\\xf0\\x62\\xe4\\x3f\\xcc\\x06\\xde\\x0a\\x1e\\xe3\\xf6\\x38\\xb1\\xee\\x1f\\xc2\\xef\\xf6\\x9d\\x39\\x77\\x6b\\x66\\x24\\x91\\x27\\xf7\\x4e\\xeb\\x1b\\xbf\\x58\\x96\\x87\\x29\\xc5\\x1e\\xe0\\x47\\x94\\x6a\\xa1\\xfe\\x7c\\x25\\x3f\\x6a\\x56\\xf1\\xa3\\x3e\\xcf\\x0f\\x61\\x3d\\x27\\x7a\\xc1\\x56\\x70\\x9c\\x58\\x82\\x6d\\xc5\\x36\\xc2\\x1d\\x1e\\xb8\\xc3\\xcb\\xdc\\x49\\x49\\xdc\\x11\\x02\\x51\\xb1\\x15\\x9f\\xf4\\xc5\\xb0\\x4c\\x57\\x4c\\xbe\\x25\\xb0\\x41\\x03\\x3c\\x2a\\xf1\\xae\\x8f\\xd6\\x34\\x49\\x4c\\x12\\xfd\\x95\\x18\\x03\\xd4\\x5b\\x30\\xf2\\xb5\\xf2\\x18\\x0c\\xb3\\x66\\x3c\\x94\\x53\\x6d\\x21\\x0c\\x13\\xbd\\xf8\\xcb\\x25\\x8a\\xc3\\x51\\xfc\\x0e\\x67\\x16\\x02\\x9f\\xc7\\xc2\\x7c\\x30\\x01\\x5c\\x5c\\x1d\\x4d\\xdc\\xc6\\xdc\\xa7\\x3d\\xc3\\xe3\\xfe\\xae\\xc6\\xb8\\xb1\\xa8\\xdc\\x55\\x68\\x6d\\x4b\\xdd\\xcd\\x71\\x6d\\x89\\xcd\\x10\\x53\\x84\\xab\\x6e\\x67\\x20\\x14\\xf3\\x09\\x0e\\x2b\\x4c\\x9e\\x80\\xa3\\x33\\xbd\\x4d\\xaa\\x4a\\x1d\\xba\\x6e\\x46\\x14\\x2b\\xcb\\x5e\\x27\\x91\\xbd\\xcd\\xd4\\x36\\xea\\x7b\\xb7\\x21\\x7d\\xf8\\xfb\\x38\\xb6\\xf2\\x62\\x04\\x5c\\x79\\x1d\\xb8\\xf2\\xd6\\x95\\xa2\\x88\\x31\\x6f\\x0c\\x5c\\x76\\x6c\\xb5\\x54\\x0a\\x66\\x93\\xd0\\x84\\xfb\\xac\\x92\\xf0\\x5e\\x92\\x13\\x9b\\xc0\\x9d\\x6f\\xc7\\x7f\\x5a\\x85\\x47\\x62\\xba\\xed\\x11\\xd2\\xc2\\x69\\xce\\xaa\\x83\\x05\\xd2\\xf9\\x6a\\x89\\xf7\\xc5\\x37\\xf0\\xfe\\xdf\\x67\\xb3\\x6e\\xda\\x14\\x7e\\x7b\\xf2\\xab\\x5c\\xb3\\x75\\xfc\\xd6\\xe2\\xfc\\xb7\\x6b\\xf5\\x96\\xe7\\x79\\x7d\\x84\\xf0\\xba\\x81\\x6a\\xa3\\xbe\\x7f\\x3b\\xbc\\xae\\xe5\\xe6\\x9a\\xa5\\x72\\x4b\\x9a\\x9b\\xe3\\x57\\x76\\x9c\\xaf\\x60\\xf9\\x5c\\xa3\\x54\\x42\\x6b\\x34\\x89\\xdb\\xe0\\x59\\x5c\\x6a\\x5c\\x88\\x5f\\x67\\x19\\x70\\x07\\x7a\\x55\\xb1\\x34\\x92\\xb3\\xd1\\x8c\\xa3\\x8e\\x6d\\x96\\x39\\xb5\\xbb\\xa0\\x16\\x77\\x23\\x08\\x71\\xb3\\x10\\xfc\\x3c\\xce\\x8b\\xe9\\x66\\xf2\\x9d\\x84\\xff\\xce\\x1d\\x90\\xba\\x4c\\x9d\\x6b\\x34\\x20\\xdd\\xde\\x1e\\xf4\\x78\\xf8\\x2d\\xfe\\xb6\\x44\\x1c\\x79\\xf8\\x16\\xbf\\x7f\\x0b\\xef\\xd9\\x13\\x2d\\xf7\\xe1\\x62\\x7d\\xe4\\xd6\\xfb\\x70\\xc9\\xdf\\x18\\x2d\\x89\\xc5\\x5b\\xf1\\x43\\x49\\xb4\\x31\\x10\\x88\\xc7\\xf1\\x0f\\xb6\\x31\\x36\\xd8\\x8b\\x8f\\x98\\x17\\x00\\xa9\\xa6\\xc0\\xc6\\x5c\\x58\\xee\\x13\\x04\\xfb\\x21\\x44\\xa2\\x64\\x2b\\x00\\xb5\\x8a\\x6a\\xd8\\x82\\x2d\\xd1\\xb9\\x7a\\xa7\\x17\\x6f\\x48\\xbd\\x0a\\xd7\\xf3\\x84\\x7a\\x93\\xb8\\x49\\xb9\\x64\\x66\\x36\\x18\\xe6\\x71\\xff\\x72\\x1c\\x91\\xf4\\x71\\x51\\x01\\xd6\\x0a\\x3c\\x43\\xad\\x1e\\x1f\\x1f\\x77\\xce\\x13\\x7b\\xb3\\x01\\xdb\\x1b\\xcc\\x45\\x60\\x73\\x56\\x1d\\xc0\\x43\\x04\\xf0\\x37\\x93\\x9a\\xf0\\xa1\\xcb\\x7a\\x73\\xd6\\x5a\\x42\\xc6\\x79\\x3b\\xa4\\x73\\xbc\\x9b\\x4a\\xf0\\x16\\x94\\x56\\xe0\\x64\\x05\\x6e\\x79\\x80\\xf0\\x1c\\xde\\x2c\\xc0\\xb3\\xbe\\x09\\xf3\\xeb\\x51\\x9e\\xf9\\x4e\\x79\\x38\\x89\\xc3\\x8d\\x14\\x64\\xd6\\x11\\x39\\x2e\\x55\\x19\\xb8\\x7e\\x9e\\x43\\x0a\\xa9\\x0c\\x0c\\xf2\\x4b\\x7c\\xb7\\xdb\\x7e\\x21\\x72\\x5f\\xda\\xd6\\xdb\\xd0\\xda\\x7d\\x32\\x3d\\x5e\\xe6\\x1b\\x4d\\x1d\\xf9\\x2f\\xb9\\xcc\\x43\\x3b\\xfb\\xe2\\xad\\x3d\\x8f\\xb5\\x1f\\x0e\\xfa\\xbe\\x96\\x4e\\xee\\x6a\\x0d\\xfc\\x59\\x61\\x90\\x77\\x75\\xb7\\xd2\\xe1\\xb6\\x9d\\x49\\x07\\xba\\x80\\xf8\\xb6\\xe6\\xf4\\xdd\\x0b\\x47\\x2f\\x28\\xe9\\x9a\\xc1\\xd1\\xee\\x9e\\x03\\x68\\x4b\\x6d\\xb2\\xf9\\xcd\\x17\\xdb\\x0d\\x3b\\xc7\\x8e\\xb5\\x65\\xf6\\xb7\\x35\\x35\\xb5\\x45\\xef\\xd8\\xc9\\xb9\\xf9\\x50\\xd1\\xfe\\x03\\x7a\\x47\\x41\\x3b\\xc3\\x96\\x56\\x6f\\x45\\x85\\xba\\xd0\\xe0\\xe8\\xcc\\x2e\\x32\\xa7\\x2d\\x77\\x92\\xcc\\x69\\xab\\xc1\\xdf\\xf8\\x13\\xc5\\xfc\\xf6\\xf0\\x62\\x31\\xbb\\x3c\\xaa\\x0d\\x20\\xdf\\x5c\\x48\\x16\\xf1\\x78\\x7e\\x68\\x1b\\x9e\\xcc\\x81\\xad\\x8a\\x0f\\x58\\x89\\xbf\\x41\\xb3\\xca\\x4e\\x0a\\x8b\\xa6\\x62\\x4f\\x59\\xe5\\xba\\x48\\x94\\x38\\xf6\\x10\\x8e\\x0a\\xd6\\x61\\x7c\\x27\\xfa\\x82\\xc0\\xb5\\x9b\\x8d\\x78\\xab\\x42\\x35\\x95\\xd7\\x8d\\x78\\x5b\\xbb\\xb2\\xb8\\x62\\xe8\\x1b\\x5d\\xb2\\x7a\\xe8\\xdb\\x78\\xf6\\xba\\xba\\x62\\xcf\\x93\\xc3\\xf5\\xe8\\xcd\\x41\\x71\\x7a\\xad\\x19\\x70\\x53\\xa6\\xb6\\xd5\\x25\\xc5\\x8e\\xa9\\x8b\\x92\\x8f\\xfb\\x80\\x39\\x06\\x98\\x07\\xcf\\x46\\xdb\\x40\\x0d\\xdd\\x6a\\x3a\\x5a\\xf8\\x26\\xd3\\xd1\\xaa\\xe4\\xe9\\x68\\x73\\x0a\\x6b\\x61\\x30\\x24\\xcd\\x1b\\xfe\\x0f\\xcd\\x47\\x23\\x30\\xef\\x76\\x66\\xa4\\xed\\x02\\x94\\x77\\xab\\x39\\x69\\xf4\\x1f\\xcb\\x20\\xef\\xff\\xbb\\xf4\\x12\\x58\\x77\\x3b\\xf4\\x9e\\x04\\x54\\x77\\x2b\\x7a\\xd1\\x39\\x19\\xd4\\xe5\\xe9\\x9d\\x20\\xf4\\x72\\xb8\\xeb\\xe3\\xf3\\xe9\\xdd\\x78\\x13\\x7a\\x23\\x32\\xbd\\xcf\\x13\\x7a\\xc3\\xf2\\x40\\x69\\xbb\\x63\\x43\\xe2\\x3f\\x42\\xb2\\x04\\xe1\\x6e\\x87\\x6a\\xa5\\x84\\xe0\\x6e\\x49\\xf8\\xa9\\x65\\x00\\xc7\\xca\\xb4\\x77\\x02\\xed\\x41\\xf2\\xad\\xaf\\xc7\\xaf\\xa7\\x9e\\x07\\xea\\xd7\\x4b\\xd4\\xaf\\x27\\x99\\x5d\\xa1\\x81\\x17\\xcb\\x00\\x4e\\x24\\xa2\\xf9\\x6f\\xa2\\xc2\\xac\\x58\\x1f\\x9d\\x75\\x1b\\x70\\x62\\xa0\\x42\\x8f\\xbf\\xe4\\x87\\x6c\\x3e\\x30\\x65\\x36\\xa5\\xad\\x82\\x17\\x6b\\xe0\\xc5\\x1a\\x4e\\x4c\\xe9\\xa5\\xef\\xa2\\xaa\\xc0\\x23\\xcd\\xca\\x12\\x42\\x8d\\x79\\xd6\\x5a\\xa8\\x20\\x1e\\x2d\\x85\\x33\\x6b\\x2b\\xb9\\xb4\\xfe\\x56\\x5c\\x5a\\x05\\x18\\xac\\xcb\\x2c\\x5b\\x55\\x36\\xfb\\x1c\\xc6\\x4d\\x2f\\x03\\x06\\xf3\\xf2\\x34\\xc1\\xf4\\x12\\x74\\xb8\\x09\\x1f\\x99\\xa3\\x79\\xc0\\xb0\\xf8\\xe0\\x92\\xee\\xf8\\x57\\xd5\\x7a\\xa5\\x79\\x6a\\xa7\\x28\\x0d\\x55\\x80\\xbf\\x49\\x60\\xad\\x79\\x6a\\xe4\\x9b\\xeb\\x3e\\x77\\xce\\x96\\x51\\x9e\\x9d\\x26\\xea\\x0b\\xae\\x9f\\x9c\\x06\\x6a\\x2f\\x8d\\x4b\\x5b\\xfc\\x7b\\x50\\x6c\\x79\\x4c\\x9a\\xa2\\x49\\xd6\\xdf\\xff\\xd9\\xf7\\xd7\\xdd\\x70\\x7f\\xab\\x93\\x91\\xc7\\xb5\\xed\\x06\\x45\\xcb\\x8f\\x69\\xcb\\x37\\xf5\\xe7\\xef\\x3f\\x01\\xf7\\x37\\xe1\\x2e\\xb0\\xb5\\xef\\x6f\\xbe\\xc5\\xfd\\x2d\\xf9\\xd9\\x71\\x3a\\xbd\\xf1\\x86\\xd9\\x71\\x56\\xa2\\x15\\x32\\x13\\x5e\\x94\\xe4\\x3e\\xbf\\x8e\\xde\\x55\\xf1\\x89\\xb4\\x16\\x3c\\xef\\xcc\\x41\\xf9\\xf2\\x79\\x8b\\x1b\\xa6\\xdb\\xd9\\x38\\xc1\\xcb\\x8b\\x05\\x5a\\x69\\x26\\x59\\x05\\x39\\xd9\\x82\\x4b\\xdc\\x7a\\x0c\\x86\\x45\\x1a\\x2f\\x65\\xd5\\x42\\x67\\x9d\\x2a\\x5c\\xd1\\x2d\\xd5\\x4b\\x45\\x43\\xb3\\x96\\x64\\xb6\\xc4\\x52\\x15\\xf0\\xab\\xd8\\x7b\\xc3\\xa4\\xbb\\x9b\\x21\\x5b\\x99\\x80\\x0b\\x6b\\x42\\xd7\\x3c\\x3d\\x6b\\x1d\\x7e\\x94\\x67\\x7e\\x29\\xfa\\xc9\\xcc\\xfb\\x5f\\x4b\\x33\\x10\\xc4\\xca\\xfc\\xcc\\x2f\\x3c\\xfc\\x5e\\xc7\\x09\\x56\\x6e\\x69\\xf0\\xbd\\x95\\x0c\\xbe\\xc7\\xb3\\xd5\\x6d\\x28\\x34\\x6b\\xb7\\x39\\x0d\\x21\\x69\\x98\\x12\\x87\\x67\\x94\\xe1\\x38\\x34\\x3f\\x6f\\x40\\xa7\\xc7\\xf3\\x06\\xf4\\xba\\xaa\\x57\\x90\\x68\\xb5\\xe1\\x6b\\x9b\\x55\\x9a\\x3d\\x60\\x7e\\xf4\\xc7\\x0f\\xe7\\x07\\xc1\\x68\\x75\\x36\\x6b\\x48\\xd0\\x9b\\x66\\x0b\\xf4\\xb8\\x9f\\xc9\\x82\\x7f\\xe3\\xd7\\xed\\xf8\\xf5\\x2c\\xbc\\xb8\\xe2\\x9c\\xba\\x25\\x91\\x85\\x3f\\xc7\\x57\\xa0\\xe1\\xb3\\xda\\x02\\x8b\\x9d\\x9c\\x53\\x5f\\xba\\x22\\xe7\\xd3\\xa5\\x39\\xfc\\x2a\\x63\\x09\\xc1\\x08\\x1b\\x01\\x23\\x88\\x4e\\x2a\\xb1\\xe2\\x7b\\x00\\x09\\x36\\xad\\x42\\x01\\x45\\x20\\x5e\\x09\\xee\\x1f\\x27\\xda\\x2d\\xe6\\x9b\\xcd\\x27\\x6b\\x79\\xf8\\x64\\xfb\\x99\\x41\\x6f\\x26\\x91\\xfb\\x43\\xc5\\x2f\\x7b\\x47\\xcf\\xf5\\x66\\xde\\xf6\\x5d\\x7c\\x3f\\x7e\\xdf\\x77\\x77\\xf5\\x9c\\xf9\\x6a\\xeb\\xd3\\xe1\\x1d\\xf7\\x25\\xf9\\x7b\\xdb\\xc2\\xd1\\x3b\\xef\\x8d\\x44\\x06\\x3b\\x22\\xe8\\x95\\xa1\\x4b\\xdf\\xb8\\x73\\x6f\\xfb\\xd1\\xd4\\xf6\\x81\\x44\\x7b\\xcc\\xcb\\xb7\\xd5\\xf6\\x54\\xe7\\x3e\\xcd\\x4d\\x4e\\xfc\\xed\\xa3\\xed\\xad\\x53\\xc2\\x44\\xd7\\xe1\\x81\\x9a\\xd0\\x97\\x8f\\x0c\\x0c\\x7c\\xb3\\xab\\x22\\xdc\\x73\\x08\\x9f\\x3b\\xc7\\x33\\xe0\\x20\\xee\\x75\\x52\\x1b\\x71\\x25\\x6c\\xcd\\x29\\x70\\xf8\\x98\\xb1\\x47\\x41\\xd2\\x5d\\xc5\\x0a\\xe9\\x6b\\x47\\xd7\\x9c\\x09\\x87\\x5b\\xb1\\xf0\\x70\\x47\\xb1\\x70\\x23\\xc1\\x8e\\x73\\xca\\x62\\xcf\\xba\\xb0\\x74\\xd4\\x5c\\xf4\\x91\\xf1\\x84\\x9e\\x75\\xa0\\x09\\x85\\xa1\\x8d\\x18\\x79\\x86\\xcd\\x82\\xff\\xa6\\x33\\xe3\\x98\\x35\\x43\\xd8\\xeb\\x27\\xc9\\x1d\\xb8\\x59\\xb0\\xba\\xe6\\x88\\x39\\xf6\\xd2\\xf5\\xc1\\xa9\\xa4\\x5b\\x92\\x0c\\x9e\\x92\\xeb\\xb6\\xdb\\xd6\\x9c\\x3c\\xb7\\x61\\xad\\xc9\\x73\\x6b\\xd7\\x6d\\x6f\\x73\\xf8\\x1c\\x46\\x3d\\xb7\\x1e\\x40\\x37\\x8d\\x21\\xcf\\xad\\x86\\xd0\\x31\\xce\\x25\\xcc\\xf3\\x9f\\x43\\x0b\\x46\\x34\\xb7\\xa6\\x65\\x0e\\xc3\\x99\\x5b\\xd1\\x42\\xd7\\x2f\\xe1\\x19\\x89\\x96\\x09\\xb9\\xfe\\xbc\\x36\\x2d\\xdc\\x5a\\xb4\\xac\\x5d\\x7f\\xbe\\x6d\\x5a\\x88\\x51\\xbe\\x35\\x39\\x15\\x32\\x4e\\xb9\\x25\\x45\\x91\\x25\\x4b\\x9e\\xa7\\x69\\x0f\\xd0\\xb4\\x01\\xe2\\xf1\\x31\\x99\\xa6\\x68\\x9e\\xa6\\x5a\\x86\\x4c\\x53\\xc1\\xb5\\xe7\\xa0\\x5c\\x7b\\x6e\\x24\\x14\\x86\\x2d\\xe4\\x48\\x7f\\x5c\\xa6\\xb0\\x09\\xa7\\x9c\\xe5\\xda\\x73\\x1c\\xd7\\x9e\\x3d\\x15\\x1b\\xe4\\xda\\xb3\\x58\\x86\\x0d\\xb7\\x58\\x1b\\x95\\x29\\x16\\x5d\\x15\\xa0\\x73\\xb6\\x00\\x86\\x6f\\xf8\\xcc\\xb2\\xf7\\x73\\xaa\\xcf\\xd7\\x27\\x8c\\x6e\\x31\\x2e\\xf1\\xa6\\xb9\\xa2\\xca\\x5b\\xce\\x51\\x64\\x3a\\xae\\xd7\\xc5\\xc5\\x81\\x1b\\x46\\x2b\\x02\\xae\\x93\\xf8\\xd5\\x09\\xfc\\x2a\\x23\\xf5\\xe7\\x7c\\xb5\\x7e\\x95\\x8f\\x28\\x25\\xf5\\x67\\xe7\\xaa\\xfa\\xb3\\xd7\\x32\\x3f\\x6b\\xf3\\x62\\x24\\xe7\\xd2\\x2f\\x7f\\x5b\\x0a\\x20\\xb9\\x5a\\x6d\\x48\\x2d\\xe7\\x8b\\x38\\x5c\\x8f\\x26\\x45\\x68\\x97\\x4d\\x9a\\x37\\x1e\\x33\\x83\\xcc\\x54\\x6e\\x5c\\x36\\xde\\x6b\\xcb\\xcc\\x6a\\xcc\\x76\\x1d\\x9b\\x56\\x01\\xb7\\x1b\\x78\\x76\\x62\\xd9\\x49\\x6a\\x6e\\xe0\\xd2\\xd0\\x32\\x6a\\xbb\\x81\\x61\\xd3\\x4b\\x78\\xcd\\x71\\xbd\\x80\\xbd\\xb8\\xb2\\xfe\\xc3\\x00\\xf6\\x9d\\x67\\x46\\xd8\\x22\\xb8\\xc2\\xdf\\x60\\x59\\x47\\x4e\\x52\\xab\\xb4\\xd4\\x06\\x72\\xfe\\x0e\\x9f\\xc2\\x96\\xbf\\xd2\\x72\\x83\\xfc\\x95\\x96\\xec\\x55\\xdc\\x05\\xac\\x73\\xcc\\xe3\\xef\\x12\\xc5\\xa3\\x7a\\x75\\xf8\\x68\\x8f\\xca\\x46\\xfc\\x3f\\x3e\\xd2\\xa5\\x58\\x45\\xee\\xca\\x27\\xc7\\xe9\\x5f\\xe7\\x92\\x49\\x9f\\xcf\\xed\\x42\\x31\\xbf\\x3f\\x41\\xc7\\x7d\\x7e\\x7c\\x19\\xf0\\xc7\\xf0\\xb9\\xee\\xcf\\x82\\x31\\xb7\\xa7\\xdc\\x5f\\x53\\x4d\\x7f\\x37\\xb0\\xc9\\xed\\xf1\\xf9\\x63\\x35\\x92\\x0e\\x4c\\x32\\x17\\xd9\\x00\\xf8\\x1c\\x2f\\xd8\\xa8\\x3d\\xf2\\xa4\\xc9\\x8a\\xfc\\x8e\\xba\\x97\\x6d\\x54\\xa1\\x85\\x1c\\x3c\\x0b\\xca\\x0e\\x06\\xdb\\xa8\\x42\\x2a\\x8f\\xac\\x83\\xe6\\x4b\\x6a\\x85\\xd9\\xa6\\x75\\x95\\x4b\\x2e\\x46\\xd0\\xe0\\x61\\x27\\x66\\x78\\xdb\\x2a\\x87\\x27\\xc5\\x21\\xec\\x79\\x81\\x94\\x15\\x9b\\x48\\x2a\\xdb\\x2a\\xa9\\xfc\\x82\\x0b\\xdb\\x71\\xa9\\xb0\\x0d\\xf6\\x58\\x6e\\x2a\\x08\\xc0\\x96\\x9d\\xed\\xe9\\xe8\\x68\\xbb\\xff\\xce\\x53\\xa8\\x71\\xe4\\xa9\\xcc\\x50\\x77\\xe7\\xbe\\x9e\\x53\\xdf\\xdd\\x8a\\x6a\\xab\\x61\\x97\\xee\\x08\\x3f\\x93\\x6c\\x8a\\xef\\x6c\\x0b\\xb5\\xa1\\x97\\x87\\x7f\\x70\\x68\\x47\\xf9\\xd1\\xe4\\xc9\\x23\\x1f\\x8e\\x5d\\x9e\\x6a\\x0e\\x7f\\x3b\\x7e\\xee\\xf8\\xc7\\xa7\\x07\\xe9\\xe6\\x62\\xbe\\x77\\x2a\\xd7\\xe3\\x8b\\xf6\\x4e\\x77\\x9e\\x1f\\x94\\x6a\\x72\\x64\\x26\\x20\\xd8\\x65\\x5c\\x23\\xde\\x71\\xd3\\xa9\\x80\\xbe\\x9b\\x4c\\x05\\xac\\x90\\xa7\\x02\\x2e\\xd7\\x8a\\x6f\\x63\\x32\\x20\\x76\\x30\\x37\\x9d\\x0e\\xf8\\x7b\\xec\\x57\\x3e\\x77\\x42\\x20\\x2b\\x3b\\x95\\xff\\x94\\xb5\\x63\\x6c\\x7e\\xf3\\xc9\\x86\\x3e\\xec\\x48\\x3e\\x77\\xf1\\x4c\\xde\\x8b\\x2c\\xaf\\x7f\\x82\\xd4\\xba\\xef\\xbe\\xe9\\xfa\\x2b\\x6f\\xb2\\x7e\\x5c\\xf3\\x66\\xa4\\x9a\\xb7\\xe0\\x30\\x2f\\x57\\xbc\\x4d\\x16\\xa9\\xe2\\x7d\\x1b\\xd4\\xc8\\x2e\\xe5\\xa6\\x04\\x9d\\x90\\x3d\\xc9\\xe7\\x93\\xb4\\xec\\x46\\x40\\x87\\x24\\x9a\\x3a\\xe5\\xba\\xf7\\xe8\\x4d\\xa8\\x5a\\xb3\\x00\\x0e\\x24\\xce\\x7a\\x98\\x7c\\xf1\\x7b\\x15\\xb1\\xb3\\xbc\\xc9\\x71\\x63\\xfd\\xbb\\x12\\x9f\\x67\\x29\\x27\\x03\\x11\\x6e\\x77\\x2a\\xe5\\xff\\x5d\\xdc\\xd9\\xc4\\xb6\\x51\\x44\\x01\\x78\\x67\\xd7\\x5e\\xc7\\xc9\\xc6\\x3f\\x6b\\xc7\\xce\\x6f\\x9d\\xad\\xe3\\x38\\x5b\\x37\\x5a\\x79\\xb7\\x8e\\xeb\\xfc\\xa8\\x85\\x3a\\xae\\x89\\xd2\\xaa\\xb5\\x42\\x1a\\x55\\xc5\\xfc\\x28\\x84\\x96\\xaa\\x4a\\xab\\x50\\x45\\x95\\x89\\xa2\\xaa\\x54\\x1c\\xa0\\x42\\xa5\\xc0\\xa1\\x1c\\x40\\x55\\x09\\x51\\x0f\\x68\\x37\\x98\\x0a\\x22\\x14\\x84\\x0a\\x17\\x54\\x71\\xa9\\xa8\\x88\\x22\\xe8\\x09\\xa4\\x70\\xa1\\x42\\x5c\\x90\\x5a\\xc3\\xbc\\x99\\x75\\x6c\\xa7\\xb6\\x88\\x54\\x24\\x0e\\x96\\xf6\\x47\\xf6\\x8e\\xdf\\xbc\\xd9\\x79\\xf3\\xe6\\xbd\\xef\\xd5\\xf6\\x82\\xd7\\x14\\xc2\\x54\\xd5\\xd5\\xc3\\xbf\\xc8\\x64\\xe5\\xd1\\x45\\x05\\x4b\\x39\\x86\\x58\\x5f\\x43\\x8c\\x5c\\x8d\\x64\\xb8\\x63\\x83\\x64\\x18\\xf9\\x2f\\x48\\x86\\xa0\\xaa\\x5b\\xa1\\x19\\x12\\xad\\xdd\\x0a\\xd2\\xd0\\xfa\\x7d\\x99\\xee\\x12\\xb6\\x30\\xee\\x67\\x3f\\xd3\\x03\\x71\\x1a\\x1e\\xb2\\x51\\x6d\\x59\\x5f\\xb2\\x9b\\x16\\x10\\x64\\x54\\x43\\xd9\\x16\\x8a\\x5e\\x6b\\xc6\\xfa\\x6a\\xf5\\xa9\\x2a\\xbc\\x34\\x61\\xbb\\xda\\x21\\xd2\\x62\\x06\\x04\\x27\\xcc\\x42\\xba\\x2e\\xd8\\x42\\xc0\\xe4\\x75\\xf8\\xf8\\x22\\x5b\\xf8\\xd1\\x02\\x1a\\x65\\x78\\x61\\x62\\x8d\\xe7\\xae\\x3b\\xab\\xf1\\x85\\xc7\\xfa\\x8a\\x7c\\x61\\x7e\\xd1\\x11\\x72\\x17\\x1a\\x6a\\x30\\x86\\xbf\\x23\\x88\\x61\\xce\\xec\\x97\\x0c\\xee\\x17\\x95\\xd9\\x03\\x99\\x7c\\x95\\x3d\\x03\\x0e\\xa9\\x21\\xcd\\x90\\xb1\\xb2\\xf6\\x61\\x65\\xdd\\xab\\xe8\\xdd\\xd8\\xee\\x11\\x88\\xdd\\x03\\x1b\\xac\\xfd\\xc2\\xfa\\xa7\\x6d\\xfd\\x1a\\xd6\\x4f\\xe8\\xbb\\x27\\xc0\\x02\\xc2\\x33\\xf4\\x67\\xf5\\x6e\\x5f\\x97\\x97\\x40\\x05\\x34\\xb7\\xe1\\x87\\xf2\\xc0\\x6d\\xa2\\xd1\\x37\\x84\\x0d\\x9f\\xf6\\xfe\\xc7\\xec\\xda\\xda\\x5a\\xbc\\x95\\x0e\\xaf\\xae\\xd0\\x5b\\xd1\\x00\\xfe\\x40\\xd5\\xb5\\xb2\\xf8\\xf7\\x1f\\xdc\\x3d\\xab\\x83\\x69\\xc6\\x7a\\x7d\\xd9\\x8c\\x0a\\x73\\xe2\\x59\\x93\\x44\\x2f\\xb4\\x73\\xb0\\xb0\\x37\\x6b\\x3d\\x72\\x66\\x4d\\xb2\\x7c\\x83\\xc3\\xc7\\x35\\xc2\\x84\\xbe\\x5e\\x44\\x94\\xb7\\x38\\x48\\xb1\\x15\\x98\\xe6\\x79\\x51\\x55\\x0d\\x27\\x40\\x08\\xd4\\x25\\x27\\x81\\x55\\x3a\\x5d\\x90\\xe5\\xac\\xe2\\x83\\x46\\x7b\\x84\\x0c\\x8f\\x00\\x18\\xce\\x1c\\x71\\x76\\x3a\\x45\\xb2\\x85\\x6b\\x34\\x00\\x82\\x8d\\x69\\x21\\x79\\x92\\xe0\\xfd\\xb2\\x51\\x92\\xa6\\xc7\\x25\\x82\\xbf\\x3b\\x56\\x96\\xfc\\x13\\x03\\x21\\xb2\\x1e\\xaf\\x08\\x71\\x8d\\x6e\\xca\\x89\\x12\\x8d\\x0f\\x22\\x63\\x21\\xb4\\x5a\\x58\\x40\\xa1\\xc2\\x1a\\x1a\\x2f\\xc8\\xc1\\x8c\\x72\\x35\\xff\\xda\\xe9\\x13\\xb1\\x8c\\x43\\x08\\xc8\\x5a\\x40\\x1e\\x1e\\xdc\\xc6\\xce\\xa3\\x14\\x7a\\x6a\\xbb\\x3c\\x60\\xa6\\x23\\xec\\x91\\xbb\\xd0\\x10\\xca\\x3c\\x28\\xfc\\x36\\xbe\\x8f\\x5d\\x0d\\x3e\\xa9\\x05\\x76\\xe5\\x6e\\xc3\\x7b\\x50\\xc0\\xf6\\xe1\\x9f\\xdc\\x32\\xb6\\x0e\\xfb\\xb0\\x4e\\xe9\\xd4\\xeb\\xa7\\xb7\\x6b\\x86\\x07\\x2b\\x54\\x17\\x75\\x8d\\xe8\\x76\\xcd\\x50\\xf1\\xe9\\xa0\\x9a\\x8f\\x53\\x0f\\x60\\x1c\\x0c\\xeb\\xbd\\xd4\\x4e\\x6c\\x24\\xd6\\x21\\x14\\x22\\x8c\\xe3\\x43\\x87\\x0a\\x5b\\x58\\x8a\\x1f\\xf6\\x75\\xe1\\x08\\xbc\\xff\\x82\\x9f\\xaa\\xdb\\x4e\\xb2\\xb6\\x6f\\xef\\x02\\xff\\xbf\\xa1\\xc0\\x94\\xb0\\x23\\xa1\\xef\\x76\\xdf\\xb4\\xd9\\x3d\\xcd\\xad\\x61\\xd9\\xb4\\x42\\xc0\\xfd\\xe7\\x81\\xec\\x78\\x5f\\x2b\\x81\\x39\\x1b\\x4d\\x10\\xf6\\x19\\x17\\x97\\x18\\x89\\x98\\xe0\\x2a\\x44\\x11\\x41\\xb8\\x5d\\x99\\x3f\\xa0\\x8f\\x6c\\xa7\\x94\\xbc\\x82\\x61\\xbe\\x02\\x8f\\x42\\x98\\x5b\\xe6\\x60\\xb4\\x4a\\xe6\\x8e\\x8a\\xa0\\x3d\\x33\\xbd\\x27\\x37\\x7c\\x68\\xfe\\xfc\\xdb\\x85\\x5e\\xb6\\x75\\xf7\\x7e\\x6d\\x2e\\x9d\\x3e\\x75\\xe9\\xd2\\x4b\\x47\\xcf\\x68\\x2f\\x4f\\xf4\\xe7\\x4e\\x1e\\x93\\x87\\x78\\xa1\\x4e\\x4c\\xc8\\xa1\\x64\\x42\\x42\\xef\\xa0\\x89\\x67\\xc7\\x47\\x8f\\xa0\\x3b\\xaf\\x2f\\xcf\\x68\\xd9\\xec\\x97\\xcb\\xf3\\xd3\\x6f\\x8c\\x48\\x07\\x27\\xa6\\xc7\\x32\\x91\\x53\\x2b\\x37\\xbe\\x5d\\x89\\x84\\x78\\x39\\x7d\\x21\\x3e\\x7b\\xce\\x11\\xd6\\xba\\x32\\xe7\\x9d\\x9e\\x2b\\x27\\x2f\\xe4\\xc8\\x5c\\x43\\xe3\\x89\\x0e\\x31\\x75\\x24\\xc2\\x67\\xb2\\x32\\xa2\\x08\\x32\\x1c\\x3a\\x35\\x43\\xc0\\xa3\\xb6\\x45\\x25\\x56\\x80\\xfd\\xae\\xe1\\xc2\\xa3\\xd6\\x65\\x56\\xbc\\xc4\\x76\\xb8\\x8f\\x07\\xb2\\x60\\x87\\x40\\x8d\\x01\\x97\\x9d\\x32\\x58\\x7d\\x34\\xe4\\xc8\\xe8\\xe0\\xb1\\xb0\\x5a\\x3a\\x13\\xd5\\xa3\\x90\\x6a\\x46\\x52\\x95\\x62\\x93\\x7e\\xad\\x9e\\xca\\x52\\x1e\\xab\\xf4\\xfb\\xa3\\xa1\\x52\\x08\\x89\\x16\\x91\\xb3\\x60\\xbb\\x80\\xc7\\x73\\x28\\x80\\x3e\\x78\\x2d\\xcf\\x9a\\xd8\\x8f\\x8d\\xca\\x53\\xf6\\x62\\xe5\\x29\\xd6\\x62\\x56\\x9e\\x32\\x9d\\x76\\x48\\xa4\\x93\\x76\\x85\\x9f\\x0e\\x31\\xcb\\x96\\x09\\x6e\\x1a\\xaf\\xef\\x9a\\xb1\\x3e\\xea\\x2e\\xc5\\xb0\\xe1\\x95\\x5c\\x93\\x62\\xb0\\xd6\\x32\\xb2\\xa8\\xcd\\x45\\xb6\\x3b\\x49\\x69\\x99\\x26\\x28\\x65\\xae\\xb3\\xe2\\x92\\xb5\\x48\\x17\\xad\\xba\\x14\\x5b\\xae\\xb5\\xd2\\xaa\\xee\\xd3\\x28\\xe7\\x2f\\x31\\xe5\\xa0\\xa5\\xc7\\xbd\\x67\\xb9\\x5c\\x76\\xcf\\xc2\\x54\\xdc\\xab\\x2b\\xbf\\x57\\x57\\xba\\x87\\xce\\xb2\\xf7\\xd9\\xf7\\xac\\x6d\\x78\\x35\\xd2\\x43\\xd6\\x22\\x2c\\xa9\\xf0\\x55\\x2c\\x0e\\x81\\x15\\x84\\xd6\\x5d\\x65\\xf8\\x06\\xea\\x2f\\x25\\x94\\x0e\\xf8\\xf7\\xb0\\x61\\x66\\x82\\x3a\\xce\\xae\\xa6\\x13\\x07\\xa4\\xb0\\x94\\x8c\\xc5\\xc6\\xb9\\xab\\x0b\\x6b\\x7b\\xb5\\xb9\\xb0\\x37\\x28\\x45\\xda\\xa2\\xc3\\x59\\x78\\x46\\x06\\x3f\\x63\\xa6\\xf8\\x0c\\x97\\x92\\x6f\\x28\\x3d\\x83\\xa3\\x84\\x71\\x0e\\xb0\\x7f\\x0c\\x57\\x57\\x7a\\x06\\x2d\\x0d\\x1f\\x33\\x73\\xb6\\x6d\\x28\\x93\\x18\\x95\\xe4\\x6d\\xfb\\x62\\xb1\\x23\\x6b\\x5c\\x6f\\x2c\\x17\\xf6\\x86\\x24\\xb9\\x4d\\x4b\\x65\\x47\\xaf\\xdd\\x23\\xff\\x23\\x53\\x58\\x64\\x67\\x98\\x3b\\x8f\\xfd\\x8c\\x70\\x27\\x79\\x46\\xe1\\x97\\xd8\\xab\\xdd\\xde\\xae\\xce\\x48\\xe9\\x19\\x2c\\x73\\x8d\\xbd\\xcf\\x1d\\x27\\xff\\x43\\x62\\x0e\\x82\\xb4\\xf4\\x80\\x66\\x0a\\x4c\\xf7\\xa8\\x45\\xe2\\x52\\xa5\\xcc\\x74\\x9e\\x16\\xcb\\xf6\\xe3\\xab\\x7e\\x48\\x68\\x61\\xfc\\x50\\xb8\\x19\\x38\\x4c\\x6e\\x18\\x5b\\x2c\\x47\\x57\\x72\\x9b\\x64\\x1a\\xda\\x74\\x7e\\x6d\\x35\\x85\\x45\\x1c\\x09\\xa4\\x62\\xb1\\x31\\xb4\\xb8\\x3a\\x8c\\x5b\\x4a\\x4f\\x36\\xe4\\x2d\\x05\\x89\\xbc\\x47\\x2b\\x4f\\x49\\xbb\\xe7\\x70\\xbb\\x53\\xa5\\x76\\xbb\\xc0\\x11\\x6d\\x0a\\x88\\x24\\xde\\x6c\\xaf\\x22\\x23\\xd8\\x5f\\x81\\xcc\\xa7\\x00\\xbe\\xea\\x85\\xf9\\x87\\xf1\\xb6\\x98\\xed\\xf6\\xc2\\x1c\\xe3\\xa6\\x1e\\x68\\xcf\\x26\\x19\\x86\\x36\\x9d\\xcf\\x0d\\x8c\\x04\\x43\\x58\\xa4\\xf1\\xa7\\x57\\xd1\\x73\\x03\\x23\\x01\\x99\\x1e\\x9b\\x5d\\x18\\x0c\\x13\\xf1\\x2e\\xac\\x0d\\x55\\x9e\\x42\\x9b\\x0b\\x8b\\x5c\\x8a\\xf4\\xe7\\xff\\xd1\\x66\\xa2\\x06\\x66\\x9b\\x8b\\xc7\\xa6\\x4a\\x84\\xba\\x37\\xda\\x5c\\xa6\\x21\\xb8\\xcd\\x08\\x65\\x51\\x9e\\x5d\\xe6\\xea\\xcb\\xb9\\x37\\x02\\xe5\\xde\\x08\\x15\\xdc\\x1b\\x81\\x72\\x6f\\x84\\x1a\\xdc\\x9b\\xec\\x89\\xe1\\x64\\x5c\\x9b\\x4a\\xa7\\xa7\\xd8\\x6c\\x7a\\x52\\xd3\\x52\\xa9\\xc9\\x17\\xc9\\xbb\\xde\\x81\\xd7\\x15\\xb7\\x98\\x1f\\x08\\x17\\xb1\\x9b\\x19\\xa3\\xec\\x1b\\xc3\\xdf\\xa5\\x69\\x26\\x5b\\xc7\\x70\\x75\\xa8\\x2a\\x25\\xe2\\x14\\x61\\x3b\\xe1\\x32\\xd8\\x8e\\x49\\x4b\\xcc\\x7b\\xe9\\x99\\x97\\x54\\x15\\xcf\\x4b\\x94\\xb9\\xd0\\x43\\x5a\\x12\\xaf\\xf2\\x4a\\xaf\\x72\\xe2\\x48\\x47\\x95\\x70\\x30\\xa5\\xc5\\x92\\xe8\\xf9\\x0d\\x4a\\x0f\\x7a\\x61\\x44\\x21\\x57\\xb1\\x40\\x94\\x74\\x30\\xdc\\xab\\xa4\\x52\\x4a\\x34\\x15\\x0c\\x01\\xb8\\x27\\x8a\\x0f\\xe0\\x4a\\x12\\xcb\\x49\\xc6\\x1a\\xb9\\x42\\x58\\x31\\x3e\\xa6\\xf8\\x3a\\xb7\\x0a\\x4c\\x83\\xf9\\x3a\\xc7\\xf2\\xa0\\x80\\x3c\\x24\\xa3\\x38\\x90\\xf1\\x0e\\x97\\xc8\\x78\\x64\\xac\\x97\\xbe\\xbf\\xad\\xca\\xf7\\x0d\\x2b\\xcc\\xfe\\x16\\xe8\\x69\\x13\\x40\\x83\\x7f\\x87\\xdf\\xcc\\x9d\\x81\\xf7\\x62\\x12\\xcb\\xf3\\xa6\\x95\\x67\\xa2\\x50\\x8b\\x7d\\x27\\x89\\xe3\\xe7\\xd7\\x97\\x9c\\x60\\x9f\\xf9\\xb1\\x7d\\xc6\\xa0\\x9d\\xce\\xc6\\x08\\x6c\\xda\\x40\\x31\\xc5\\xa0\\x9a\\xb7\\xd7\\x91\\x0b\\xd8\\x80\\x81\\x9c\\x3d\\xd8\\xc5\\x51\\x15\\xdd\\x7a\\x57\\x8f\\xaa\\x46\\x67\\x23\\x58\\x34\\x7a\\xa7\\x4b\\x6f\\x85\\xa8\\xa6\\x7a\\x30\\xdc\\xf0\\x8c\\xd2\\x48\\xc2\\x0f\\xf1\\xdc\\x19\\xc6\\x4d\\x92\\x13\\x86\\x1f\\xa6\\x57\\x91\\x52\\x56\\x76\\x41\\xad\\xaa\\x60\\x1c\\xaf\\xd0\\xb4\\x3e\\x5a\\xcd\\x82\\xb7\\x49\\x36\\x89\\xf7\\x62\\x63\\xc3\\x26\\x81\\x91\\x6f\\x16\\x9c\\x0b\\x27\\x5b\\x33\\x2c\\x7f\\xba\\xf5\\x44\\xcb\\xe4\\xfc\\xbb\\x23\\x1f\\x9f\\xd2\\x78\\x47\\xdf\\xc4\\xfe\\x99\\xaf\\xb6\\xa3\\xbf\\x7a\\x0b\\x92\\x05\\x2d\\x28\\x85\\x77\\x3b\\xbe\\xbe\\x38\\x97\\x1d\\x38\\xf7\\xd1\\xd1\\x0f\\xe7\\xc6\\x9d\\x68\\x65\\xb6\\xde\\x2f\\x0c\\x0c\\xce\\xce\\x2e\\x1e\\x57\\xd0\\xf4\\x9b\\x96\\x48\\xaf\\xfc\\xfe\\xc2\\x6c\\x30\\xe1\\x8f\\xce\\xde\\xd0\\xc7\\xa6\\x8e\\xa3\\xc1\\xd9\\x4f\\x5e\\xa1\\x6b\\x98\\x10\\xfb\\x16\\xf7\\x93\\xd5\\x4b\\x78\\x04\\x39\\x20\\x0d\\x01\\xca\\x15\\x11\\x46\\x8a\\x61\\x17\\xd4\\x0d\\x32\\x1b\\x8f\\x07\\x52\\x9d\\x03\\xea\\x42\\x34\\x41\\x29\\xd9\\xbc\\x95\\x72\\x67\\xaa\\x56\\x93\\xd5\\xad\\x04\\x23\\x95\\xf7\\xd2\\xb0\\xa3\\x7a\\x15\\x54\\xcd\\x59\\x4a\\xe5\\xf7\\x01\\xb5\\xc0\\x4b\\x23\\x12\\x1d\\x6e\\x9a\\xe7\\xeb\\x21\\x09\\x89\\x41\\x37\\x72\\x03\\x19\\x1f\\x08\\x34\\x0a\\x72\\x87\\xd0\\x37\\x9f\\x1f\\x43\\x87\\xd2\\x57\\xae\\xee\\x1b\\xcf\\x75\\x9e\\xb1\\xdc\\x3a\\x7c\\xf8\\xe1\\x6d\\x76\\x17\\xfe\\x5c\\x2c\\xfc\\x88\\x7a\\x1e\\xe6\\xd0\\x17\\x3f\\x73\\x6b\\x85\\xfd\\xb8\\x2f\\x61\\x80\\x5c\\xe7\\xae\\xe3\\x51\\x12\\xa3\\x3b\\x25\\x40\\x09\\xb3\\xe1\\x16\\x96\\x1d\\x17\\x89\\x61\\xb4\\x68\\x65\\xb1\\x76\\x25\\x05\\x87\\x45\\xdd\\x92\\x1b\\x7e\\xe0\\xc1\\x31\\xfc\\x85\\x7f\\x00\\xc9\\xad\\xc9\\xf7\\x78\\xda\\x63\\x60\\x64\\x60\\x60\\x60\\x64\\xba\\xd8\\x3f\\xf9\\x62\\x47\\x3c\\xbf\\xcd\\x57\\x06\\x79\\x0e\\x06\\x10\\x38\\x5f\\x3f\\xe7\\x14\\x82\\xfe\\x37\\x8d\\x63\\x22\\x5b\\x16\\x90\\xcb\\xc1\\xc0\\x04\\x12\\x05\\x00\\x85\\xf7\\x0d\\x26\\x00\\x00\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\x60\\xab\\xfe\\x97\\xc7\\xc0\\xc0\\x29\\xc7\\xc0\\xf0\\xff\\x3f\\xc7\\x44\\x06\\xa0\\x08\\x0a\\x78\\x06\\x00\\x75\\x2d\\x05\\x94\\x78\\xda\\x75\\x93\\x31\\x4b\\x82\\x51\\x14\\x86\\xcf\\xa7\\x16\\x15\\x12\\x14\\x41\\x53\\x4a\\x48\\x43\\x83\\x43\\x44\\x83\\x44\\x04\\xd1\\x20\\x0e\\x12\\x12\\x2d\\x45\\x44\\x88\\x83\\x10\\x21\\xe2\\x20\\x12\\x12\\x11\\x11\\x11\\xf1\\x11\\x34\\x44\\x43\\x14\\x08\\x35\\x34\\x35\\x89\\xf4\\x07\\xc2\\x5f\\x21\\x6d\\xfd\\x80\\x88\\x86\\xde\\x73\\xcf\\x2b\\xc8\\xa5\\x86\\x87\\xf7\\xde\\xf3\\x9d\\x7b\\xee\\x7b\\xee\\xfd\\x6e\\xe4\\x53\\xd6\\x63\\x22\\x12\\x79\\x12\\x51\\x8d\\x49\\x50\\x81\\xf6\\xc0\\x22\\x68\\x80\\x0c\\xc8\\x21\\xde\\x02\\x33\\x18\\x5f\\x83\\x4d\\xb0\\x83\\x79\\x01\\x1a\\x42\\x0f\\xa1\\x27\\xa0\\x04\\x5e\\xc1\\x0d\\xb8\\x04\\xfb\\x8c\\x9f\\x83\\x07\\xd6\\xbb\\xb0\\x7c\\xb7\\x36\\x6b\\x75\\xa4\\xc0\\xbc\\x55\\x90\\xe4\\x3a\\xdd\\x43\\xeb\\xd6\\xc1\\xbd\\x79\\x70\\x73\\xf8\\x90\\x22\\xd8\\x02\\x67\\xcc\\xd3\\x7d\\x97\\x99\\xab\\x5a\\x05\\x65\\xd6\\x2b\\xb1\\x97\\x14\\x73\\x33\\x16\\x0b\\xe2\\xdc\\xf3\\x19\\xbc\\x99\\x17\\xd7\\x5f\\x91\\x3e\\xab\\xf4\\xa6\\xf3\\x63\\x90\\x07\\x57\\xa0\\x4b\\x7f\\x67\\xec\\x29\\x6f\\x3d\\xb9\\x1e\\x1a\\xf4\\xf5\\x0e\\x6a\\xcc\\x6f\\xf2\\xdb\\x2c\\xd8\\x03\\x69\\x7a\\x3a\\xc0\\x7e\\x1d\\x68\\x87\\xbe\\xfa\\x67\\xaf\\xb5\\x37\\x58\\x33\\xc7\\x9c\\x53\\xf0\\x01\\xd4\\xdf\\x1d\\xcf\\xb3\\x6d\\x67\\xef\\x62\\x3f\\xe0\\x8b\\x7e\\x7b\\x96\\x1b\\xa8\\xb7\\x05\\xeb\\xd1\\x9d\\xf7\\x1a\\xc6\\xdf\\x03\\xeb\\xc7\\xc8\\x34\\xe7\\xc9\\x7f\\x18\\xa1\\xbf\\xba\\x47\\xcb\\x63\\x65\\xe0\\x1e\\x7c\\x5e\\xa8\\x25\\x8f\\x0c\\x6b\\x55\\x78\\xce\\x7f\\x31\\xc5\\xbb\\xf0\\xe3\\x5d\\x8f\\xc2\\xc0\\x3d\\xf8\\x84\\xd4\\xa6\\x47\\x9a\\x77\\xa6\\x3a\\x09\\xe2\\xe6\\x29\\xd0\\x71\\x3b\\xba\\x24\\x32\\x5c\\x16\\xe9\\x6b\\x24\\x25\\x12\\xdc\\x82\\x09\\x43\\xba\\xd0\\x2c\\x74\\xdb\\xbd\\x9d\\xb0\\xcf\\x50\\x42\\xc2\\xd1\\x84\\x7b\\x17\\x35\\xfb\\xcf\\xdd\\xbf\\xae\\xf7\\x71\\x64\\x04\\xbb\\xd0\\x71\\x5d\\x8b\\xf1\\xbc\\xa2\\x75\\x11\\xd3\\xb7\\x38\\x17\\x7d\\x14\\xf9\\x05\\x36\\xd2\\x62\\xc3\\x00\\x78\\xda\\x63\\x60\\x60\\xd0\\x81\\xc2\\x06\\x86\\x4b\\x8c\\x5b\\x98\\x92\\x98\\xf9\\x98\\x57\\x30\\xdf\\x62\\x11\\x60\\x71\\x60\\xc9\\x60\\x59\\xc5\\x72\\x87\\xe5\\x0b\\xab\\x1a\\xab\\x19\\xeb\\x3c\\xd6\\x23\\x6c\\x46\\x6c\\x2b\\xd8\\xbe\\xb0\\x17\\xb0\\xff\\xe0\\x50\\xe3\\xd8\\xc3\\x69\\xc7\\xd9\\xc2\\x79\\x83\\xf3\\x0d\\x17\\x1f\\x97\\x12\\xd7\\x22\\x6e\\x0b\\xee\\x2c\\xee\\x2b\\x3c\\x06\\x3c\\x45\\x3c\\xeb\\x78\\x9e\\xf0\\x86\\xf1\\xae\\xe2\\x7d\\xc2\\x67\\xc4\\x97\\xc7\\x37\\x8b\\xef\\x0e\\xbf\\x1c\\x7f\\x1d\\xff\\x01\\x01\\x33\\x81\\x09\\x82\\x02\\x82\\x0e\\x82\\x7d\\x82\\x27\\x84\\x6c\\x84\\xf2\\x84\\xe6\\x09\\x5d\\x10\\xfa\\x25\\x2c\\x20\\x6c\\x25\\x9c\\x26\\x5c\\x27\\xbc\\x46\\x44\\x49\\x64\\x9a\\xc8\\x33\\xd1\\x24\\xd1\\x0b\\x62\\x3a\\xe2\\x3c\\xe2\\x09\\xe2\\xdb\\x24\\x64\\x24\\xc2\\x24\\x3a\\x24\\x7e\\x48\\x3a\\x48\\xce\\x91\\x62\\x90\\x4a\\x92\\x5a\\x24\\xad\\x22\\xbd\\x44\\xfa\\x87\\x8c\\x8e\\xcc\\x39\\x59\\x06\\xd9\\x18\\xd9\\x3e\\xd9\\x4f\\x72\\x3c\\x72\\x25\\x72\\x3b\\xe4\\x76\\xc8\\xf3\\xc8\\x9f\\x53\\xd8\\xa7\\xe8\\xa2\\xb8\\x4a\\xf1\\x9c\\x52\\x99\\xd2\\x1e\\xe5\\x24\\xe5\\x3b\\xca\\xff\\x54\\xd4\\x54\\xec\\x54\\xde\\xa8\\x72\\xa9\\xc6\\xa9\\xae\\x51\\xe3\\x51\\xab\\x53\\x9b\\xa7\\x2e\\xa6\\x1e\\xa6\\xde\\xa6\\x7e\\x45\\xfd\\x9b\\x46\\x80\\x46\\x89\\xc6\\x1b\\xcd\\x2a\\x2d\\x1f\\xad\\x4b\\xda\\x3c\\xda\\x6e\\xda\\x2d\\xda\\x4f\\x74\\x22\\x74\\x2e\\xe9\\x3a\\xe9\\x1e\\xd3\\xe3\\xd2\\xf3\\xd3\\x9b\\xa5\\x2f\\xa4\\x1f\\xa2\\x3f\\x4d\\xff\\x91\\x41\\x84\\xc1\\x3e\\x43\\x0b\\xc3\\x05\\x46\\x1c\\x46\\x25\\xc6\\x5c\\xc6\\x8b\\x8c\\x8f\\x98\\xb8\\x98\\xcc\\x31\\xf9\\x66\\x1a\\x65\\xfa\\xc4\\x4c\\xc6\\xac\\xc4\\xec\\x9b\\x79\\x99\\xf9\\x37\\x8b\\x3a\\x4b\\x13\\xcb\\x57\\x56\\x1b\\xac\\xb3\\xac\\x3f\\xd8\\x64\\xd8\\x3c\\xb0\\x8d\\xb3\\xe3\\xb0\\xf3\\xb0\\xeb\\xb0\\x3b\\x67\\x6f\\x65\\xff\\xcb\\xa1\\xc6\\xe1\\x91\\xa3\\x87\\xe3\\x26\\x27\\x2f\\xa7\\x27\\xce\\x26\\xce\\xeb\\x5c\\x78\\x5c\\x72\\x5c\\xae\\xb9\\xa6\\xb8\\x9e\\x72\\x33\\x70\\xbb\\xe0\\x1e\\xe5\\xc1\\xe3\\x51\\xe1\\xb1\\xc8\\xe3\\x19\\x0e\\xf8\\xc5\\x93\\xc9\\x53\\xc0\\x53\\xce\\x53\\xc7\\x33\\xce\\x73\\x82\\xe7\\x21\\x2f\\x39\\xaf\\x0a\\xaf\\x4b\\xde\\x4c\\xde\\x69\\x40\\xd8\\xe6\\xbd\\xca\\x7b\\x95\\x8f\\x8e\\xcf\\x04\\x9f\\x1d\\x00\\x44\\xc8\\x97\\xfe\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\xe6\\x00\\x60\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x01\\x00\\x02\\x00\\x16\\x00\\x00\\x01\\x00\\x01\\x50\\x00\\x00\\x00\\x00\\x78\\xda\\x9d\\x53\\xcb\\x4a\\x23\\x41\\x14\\x3d\\x6d\\x7a\\x44\\xc7\\x07\\xb3\\x72\\x31\\xcc\\xa2\\x70\\x21\\x06\\x62\\x6b\\x32\\x8e\\x8b\\x2c\\x44\\x0d\\x04\\x44\\x41\\x7c\\xa0\\xe0\\xae\\x13\\x33\\xda\\x4c\\x9b\\x96\\x58\\x31\\xe8\\x62\\x56\\x7e\\x8d\\x0b\\xbf\\x42\\x44\\x7f\\xc3\\xa5\\x1f\\x20\\x2e\\xe7\\xd4\\xed\\xea\\xa4\\x13\\x3a\\x33\\x83\\x14\\x5d\\x7d\\x6e\\xd5\\x7d\\x9c\\x73\\xab\\x0a\\xc0\\x17\\x3c\\x22\\x07\\xc7\\x1d\\x07\\xf0\\xc2\\x2f\\xc6\\x0e\\x66\\x68\\xc5\\x78\\x04\\xd3\\x78\\xb7\\x38\\x87\\xdf\\xce\\xa8\\xc5\\x2e\\xe6\\x9c\\x5b\\x8b\\x3f\\xe1\\xab\\x73\\x67\\xf1\\x28\\xd7\\x1f\\x2c\\x1e\\xc3\\xa4\\xf3\\x6a\\xf1\\x38\\x56\\x9c\\x37\\x8b\\x3f\\xe3\\x6d\\xa4\\x60\\xf1\\x04\\xbe\\xe5\\x66\\x2d\\x9e\\x24\\x5e\\xb5\\x78\\xca\\x51\\xb9\\x63\\x8b\\xa7\\xb1\\xec\\xde\\x58\\xfc\\x84\\x19\\xf7\\xde\\xe2\\x67\\x2c\\xb9\\x0f\\xa8\\x20\\xc2\\x05\\xae\\xd1\\x42\\x80\\x53\\x9c\\x41\\x43\\x61\\x1e\\x75\\xe4\\xf9\\x2f\\x61\\x89\\x63\\x05\\x0b\\x82\\x8a\\x9c\\x0b\\x5c\\xdd\\x83\\xcf\\x88\\x33\\xa2\\x6d\\x34\\x70\\xc5\\xb8\\x06\\x9a\\x12\\xf5\\x93\\xb8\\x85\\x4b\\xe6\\x68\\xd2\\xe7\\x9c\\xeb\\x1e\\x42\\xa2\\xf4\\xca\\x1a\\xab\\x9c\\x13\\x07\\xdc\\xf1\\x58\\x27\\xa2\\x95\\x97\\xbc\\xff\\x62\\x52\\xe4\\xe8\\x67\\x52\\x11\\xef\\x06\\xb3\\x85\\xd6\\xb7\\x67\\x7b\\xcc\\xd6\\x62\\x9e\\x3c\\x36\\x59\\xdb\\xd4\\x69\\x92\\x47\\x24\\x7c\\x34\\xbf\\x3d\\xfa\\x9d\\xa2\\x2d\\x76\\xab\\xab\\x29\\xad\\xa8\\x80\\x2d\\xd1\\x63\\x98\\x86\\x38\\xc0\\x2f\\xfa\\xd4\\xe9\\x63\\x3c\\x86\\xd5\\x2a\\x93\\x47\\x76\\x3d\\x35\\x50\\xb1\\xdc\\x55\\x55\\xfa\\xcf\\x88\\x43\\x5a\\xa6\\xbb\\x81\\x78\\x2a\\x46\\x7a\\x12\\xff\\x7d\\x48\\xfc\\xc2\\x40\\x7c\\xba\\x5b\\xd9\\x67\\x68\\x7a\\x9a\\xd6\\xac\\x06\\x54\\xf7\\xe7\\x53\\x5c\\x8f\\xf3\\x69\\xce\\x27\\xb4\\x6b\\xac\\x30\\xfc\\x7e\\xb4\\x85\\x7b\\x93\\x19\\x14\\x77\\x03\\x5a\\x8a\\x6c\\x3b\\xb2\\xb7\\xcf\\x08\\x53\\x37\\x22\\xeb\\x9a\\xdc\\x98\\x38\\xa3\\xe6\\x8a\\x51\\x64\\x7c\\x7d\\x7a\\x9a\\xb5\\xaa\\x28\\xd5\\xf2\\x37\\x5d\\x37\\xb7\\x4c\\x61\\x43\\xfc\\x4e\\x86\\xb2\\xfa\\x9b\\x2e\\xc5\\x9b\\x1b\\x89\\xa2\\x4a\\xc6\\xa9\\x76\\x64\\x78\\x99\\x27\\x9e\\xec\\x85\\x29\\xa5\\xc9\\xad\\x3e\\xe8\\xaa\\x4c\\x18\\x1b\\x9d\\x11\\x6b\\x69\\xc6\\xf8\\x92\\x4b\\x59\\x8f\\x90\\xff\\xba\\x44\\x27\\xca\\xdb\\xa2\\xb6\\x21\\xac\\xb4\\xf0\\x34\\xd1\\x9b\\xec\\xa9\\xc2\\x0e\\xbb\\x15\\xf7\\xb4\\x97\\x79\\xbb\\x2f\\x83\\x39\\xc9\\xac\\xfb\\x52\\x94\\x5e\\xf5\\x98\\xf5\\xd7\\x4d\\xd8\\xf8\\xd4\\x12\\xbf\\x50\\x9f\\xdd\\x0b\\x65\\xa7\\x43\\x5b\\xcb\\xa9\\xfa\\x52\\x77\\x1d\\xbb\\x82\\xb5\\xdc\\x64\\xf3\\x5a\\x35\\x59\\x95\\xb1\\xc8\\x71\\x29\\x67\\x10\\xd0\\xd6\\xc4\\x9e\\x70\\xe8\\xf5\\x6c\\x91\\xfc\\xab\\xe4\\xfb\\x91\\x98\\x23\\x72\\xa9\\xc9\\x69\\xc5\\xaa\\xe3\\x37\\x50\\x95\\x48\\x45\\x4e\\x17\\xd2\\xaf\\x12\\x7e\\x70\\x36\\x6f\\xa3\\xcc\\xb9\\x64\\xe7\\xe4\\xbd\\x2d\\xff\\x01\\xa6\\x2a\\xec\\x62\\x00\\x78\\xda\\x6d\\xd0\\x47\\x4c\\x54\\x61\\x14\\x86\\xe1\\xf7\\xc0\\x30\\x03\\x43\\xef\\x55\\xc5\\xde\\xf5\\xde\\x3b\\x5c\\x8a\\x7d\\x28\\x63\\xc1\\xde\\xb0\\x2b\\x0a\\xcc\\x8c\\x22\\xe0\\xe0\\x88\\xd8\\x8d\\x05\\x7b\\x34\\x26\\x2e\\x4c\\x34\\x16\\x36\\x6a\\xec\\x35\\x1a\\x75\\x21\\x04\\x7b\\x89\\x25\\xea\\xc2\\xa5\\xb1\\x41\\x5c\\xa8\\x4b\\x23\\x32\\xbf\\x3b\\xbf\\xcd\\x93\\xef\\x24\\xe7\\x2c\\x0e\\x41\\x74\\xe4\\xf7\\x61\\x2a\\xf8\\x5f\\x3e\\x82\\x04\\x49\\x30\\xc1\\x58\\x08\\xc1\\x8a\\x8d\\x50\\xc2\\xb0\\x13\\x4e\\x04\\x91\\x44\\x11\\x4d\\x0c\\xb1\\xc4\\x11\\x4f\\x02\\x89\\x24\\x91\\x4c\\x0a\\xa9\\xa4\\x91\\x4e\\x06\\x9d\\xe8\\x4c\\x17\\x32\\xe9\\x4a\\x37\\xba\\xd3\\x83\\x9e\\xf4\\xa2\\x37\\x7d\\xe8\\x4b\\x3f\\xfa\\x33\\x80\\x81\\x0c\\x62\\x30\\x1a\\x3a\\x06\\x0e\\xb2\\x30\\xc9\\x26\\x87\\x5c\\xf2\\x18\\xc2\\x50\\x86\\x31\\x9c\\x11\\x8c\\x64\\x14\\x4e\\xf2\\x29\\xa0\\x90\\x22\\x5c\\x8c\\x66\\x0c\\x63\\x19\\x47\\x31\\xe3\\x99\\xc0\\x44\\x26\\x31\\x99\\x29\\x4c\\x65\\x1a\\xd3\\x99\\xc1\\x4c\\x4a\\x98\\xc5\\x6c\\xe6\\x30\\x97\\x79\\xcc\\x67\\x01\\x0b\\x59\\x44\\xa9\\x58\\x38\\xc9\\x56\\xb6\\x71\\x9b\\x43\\x7c\\x62\\x3b\\xfb\\xd8\\xcd\\x11\\x4e\\xd1\\x28\\x21\\xec\\xe2\\x3d\\x5b\\x38\\x28\\x56\\xb1\\xb1\\x57\\x42\\xd9\\xc1\\x3d\\x3e\\x48\\x18\\x47\\x39\\xcd\\x4f\\x7e\\xf0\\x8b\\x13\\x9c\\xe5\\x01\\x2d\\x9c\\x63\\x31\\x4b\\xd8\\x4f\\x19\\x8f\\x28\\xe7\\x3e\\x0f\\x79\\xc6\\x63\\x9e\\xf0\\x94\\xcf\\xed\\xdf\\x7b\\xc9\\x73\\x5e\\x70\\x1e\\x37\\xdf\\x39\\xc0\\x1b\\x5e\\xf1\\x1a\\x0f\\x5f\\x69\\x65\\x27\\x4b\\xf1\\xb2\\x8c\\xe5\\x54\\x52\\xc5\\x31\\xaa\\x59\\x41\\x0d\\x3e\\x6a\\xf1\\xb3\\x92\\x55\\xd4\\xf1\\x85\\xd5\\xac\\xa1\\x9e\\xb5\\xac\\x67\\x1d\\x37\\x38\\xce\\x46\\x36\\xb0\\x89\\xcd\\x7c\\xa3\\x8d\\x9b\\x5c\\xe0\\x22\\xb7\\x78\\xcb\\x3b\\xb1\\x4b\\xb8\\x44\\x48\\xa4\\x44\\x49\\xb4\\xc4\\x48\\xac\\xc4\\x49\\xbc\\x24\\x48\\xa2\\x24\\x49\\x32\\x97\\xb8\\xcc\\x35\\xae\\xd3\\xc4\\x15\\xae\\xd2\\x4c\\x03\\x67\\x24\\x85\\x3b\\xdc\\x95\\x54\\x49\\x63\\x8f\\xa4\\x5b\\xdd\\x95\\xf5\\x35\\x1e\\xdd\\xe6\\xaf\\xf2\\x6a\\x9a\\x56\\x18\\xd0\\xa9\\x29\\x55\\xcf\\x37\\x94\\x0e\\xa5\\xa9\\xcc\\xfb\\xab\\xd1\\xbe\\xa8\\xd4\\x95\\x86\\xd2\\xa1\\xcc\\x52\\x9a\\xca\\x6c\\x65\\x8e\\x32\\x57\\xf9\\xef\\x9e\\x33\\xa0\\xae\\xee\\xea\\xba\\xbd\\xc2\\xeb\\xf6\\xfb\\xca\\xcb\\x4a\\x6b\\x3d\\x81\\x91\\xe1\\x0a\\x68\\xba\\x2c\\x45\\x7e\\x5f\\x75\\x47\\x31\\x5d\\x05\\x7f\\x00\\xee\\xa2\\x95\\xa1\\x00\\x00\\x00\\x78\\xda\\x45\\xcd\\x4d\\x0e\\xc1\\x50\\x14\\x05\\xe0\\x3e\\xa5\\x2d\\x55\\x2d\\x9e\\x4a\\xfc\\x24\\x95\\x98\\x3d\\x06\\x16\\x20\\x26\\x6a\\x62\\x22\\x46\\x7d\\x61\\x03\\x36\\x60\\x6c\\x62\\xc8\\x0a\\x2c\\xe2\\xd6\\x48\\x6c\\x8e\\x83\\xd7\\x6b\\x76\\xbf\\x73\\x92\\x73\\x1f\\xe2\\x75\\x26\\x71\\xb1\\xd6\\xe4\\x6d\\xb2\\x5c\\x88\\xab\\xce\\x57\\x8e\\xca\\x46\\x14\\xe9\\x35\\xc9\\x2d\\x8e\\x93\\x1e\\x92\\xa3\\xf6\\x99\\x45\\x76\\x92\\x92\\xad\\x96\\x54\\x4e\\xd2\\xa7\\x65\\x8b\\x9e\\x55\\x52\\x5f\\x57\\x92\\xf4\\x5e\\x3e\\x18\\x38\\x9f\\xb2\\x22\\xc2\\xa2\\x74\\x51\\x3a\\xda\\xc0\\x03\\xdc\\x9d\\x41\\x15\\xf0\\x32\\x83\\x1a\\x50\\x95\\x3f\\x08\\xf2\\xcd\\xa7\\x3a\\x52\\x1f\\x69\\x6e\\xaf\\x8e\\x60\\x00\\xd6\\xfb\\xcc\\x06\\x18\\xcc\\x99\\x21\\xd8\\x98\\x30\\x23\\x30\\x54\\xcc\\x26\\x18\\x0d\\x98\\x2d\\xb0\\xf9\\x9f\\x6a\\x83\\xad\\x1b\\x53\\x82\\xed\\x05\\xb3\\x03\\xca\\x19\\x33\\x06\\x3b\\x63\\x66\\x17\\x8c\\xa7\\x05\\x35\\x49\\xf5\\x06\\x33\\xde\\x5d\\xe1\\x00\\x00\\x00\\x01\\x53\\x59\\xec\\x4a\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\x7a\\x6b\\x5f\\x8e\\x24\\x64\\x00\\x00\")\n\nfunc fontsInconsolataRegularWebfontWoffBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsInconsolataRegularWebfontWoff,\n\t\t\"fonts/inconsolata-regular-webfont.woff\",\n\t)\n}\n\nfunc fontsInconsolataRegularWebfontWoff() (*asset, error) {\n\tbytes, err := fontsInconsolataRegularWebfontWoffBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/inconsolata-regular-webfont.woff\", size: 25636, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoBoldWebfontEot = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x64\\x8d\\x73\\x50\\x25\\x00\\xa0\\xf5\\x6f\\xb6\\xed\\xba\\xd9\\xb6\\xee\\x4d\\x9b\\x5d\\x9b\\x37\\xdb\\xd6\\xd6\\xcd\\xb6\\xb9\\xd9\\xb6\\x6d\\xdb\\x9b\\xbd\\xb5\\xb9\\xad\\xb6\\xda\\x6f\\xbe\\x37\\xef\\xcd\\x3c\\xfc\\xfe\\x39\\x73\\xe6\\xcc\\xfc\\xce\\x3f\\x35\\x00\\x80\\x53\\x0d\\x00\\x80\\x06\\x40\\x03\\x60\\x01\\xff\\x3f\\xff\\x0b\\x28\\x40\\x0f\\x34\\x00\\x00\\x0b\\x50\\x54\\xbd\\x81\\x06\\xec\\xeb\\x53\\x02\\x54\\x29\\xff\\x73\\xf9\\x01\\x05\\xa0\\x04\\x00\\xa0\\x54\\x04\\x1f\\x94\\xe5\\x01\\xff\\x07\\x54\\x80\\x3a\\xc0\\x09\\x60\\x0a\\x70\\x02\\xb8\\x03\\x9c\\x00\\x00\\x00\\x22\\x40\\x02\\xe0\\x04\\xb0\\x07\\x98\\x03\\x00\\x00\\x16\\x80\\x36\\xc0\\x02\\xe0\\x0a\\x70\\x03\\xd8\\x00\\x9c\\x00\\x8e\\x00\\x4a\\x00\\x27\\x80\\x0d\\xc0\\x09\\xe0\\x00\\x70\\x00\\x38\\x01\\x3c\\x00\\x4e\\x80\\x30\\x80\\x12\\xc0\\xf5\\x1f\\x8d\\x1b\\x00\\x00\\xe0\\xff\\x0f\\x17\\xe5\\x7f\\x33\\x01\\x00\\x12\\x1a\\x5f\\x54\\xff\\xf7\\x37\\x0c\\xc0\\x2d\\x15\\xc0\\xe5\\x05\\xe0\\xfa\\x0e\\x60\\x9e\\xc2\\x9e\\xbd\\x88\\x9e\\xf0\\xd6\\xfb\\x3a\\x69\\xad\\xef\\x22\\x1f\\xe8\\x0d\\x34\\xeb\\x72\\x65\\xb1\\x62\\x91\\xfe\\x43\\xf7\\x07\\x4e\\x32\\x78\\x87\\x78\\xa4\\x2f\\xfa\\xf9\\xf1\\x3d\\x15\\xb1\\x1e\\x14\\x06\\x59\\x63\\xe2\\x80\\xd7\\x96\\xe1\\xc0\\xb6\\xe9\\x68\\x85\\x2f\\x1b\\x45\\x1e\\x34\\x32\\xd3\\x39\\x2a\\xa3\\xa6\\xdb\\xe5\\x6b\\xca\\x21\\x26\\xae\\x99\\x94\\x14\\x33\\xf3\\xef\\x1a\\x88\\x42\\x1f\\x04\\xce\\x99\\x5a\\xf8\\x33\\x91\\x76\\x2a\\x71\\x5c\\xce\\x58\\xba\\xf0\\x34\\xff\\xc0\\x95\\xca\\x0e\\x71\\x15\\xd2\\x52\\xf2\\xb1\\x7f\\x2c\\x3a\\xea\\x39\\x99\\x8d\\xe2\\xde\\x3d\\x89\\xe1\\xd5\\x0b\\x6b\\x82\\xcb\\x34\\xa9\\xb1\\x75\\x08\\xef\\xa6\\xf2\\xd0\\xa9\\x2c\\x7b\\xdf\\x68\\xd7\\x1a\\x0c\\x2b\\x01\\xa7\\x52\\x72\\xd0\\xb7\\xff\\x76\\x30\\xbf\\x18\\xad\\x82\\xe4\\xd1\\x76\\xfe\\xdc\\xf4\\x8a\\x79\\x8c\\xf2\\x71\\xbc\\xd8\\xa0\\x12\\xa9\\x17\\x8a\\x20\\xaa\\x58\\x9d\\x90\\xcf\\x04\\xe0\\xba\\x99\\xc2\\x45\\x38\\x2d\\x51\\xcc\\xd5\\x98\\x21\\xc8\\xb3\\x68\\x7c\\x5b\\x93\\x39\\x62\\x22\\x77\\x3a\\x7d\\x6a\\x19\\xef\\x2a\\x16\\x64\\x3e\\x14\\x11\\x8b\\x36\\x21\\x30\\xe6\\x65\\xe1\\x23\\x90\\x85\\x8c\\x65\\x34\\xf5\\xec\\xa3\\x07\\x8b\\xe4\\x0e\\x95\\x05\\xcf\\xce\\x97\\xfe\\x3a\\xa0\\x51\\xbb\\x62\\xff\\x47\\x55\\xa5\\x85\\x44\\xfe\\xfb\\xa1\\xb3\\xbe\\xaf\\x0b\\x3b\\xe6\\x48\\x95\\x37\\xfe\\xcd\\x05\\xfb\\x52\\x10\\x2e\\xde\\x04\\xfc\\x71\\xa1\\x93\\x14\\x71\\xbd\\x72\\xa4\\xa9\\x99\\x6b\\xe0\\x21\\x88\\xb4\\x79\\x3a\\xca\\x7a\\x60\\x11\\x43\\xd1\\x61\\x10\\x17\\x10\\x76\\x99\\x4f\\xe8\\xad\\x5b\\x18\\x1e\\x56\\x85\\x9a\\xa8\\x3a\\xdb\\x70\\x07\\x44\\x1b\\xc3\\x28\\xe8\\x6d\\x8b\\xeb\\x3b\\x08\\x62\\xd9\\xb6\\x41\\xa6\\xe7\\x3d\\xc9\\x64\\x65\\x79\\x42\\xf1\\x0f\\x85\\x81\\x75\\x07\\x56\\xf8\\x61\\x04\\x98\\x56\\xb5\\x68\\x16\\x24\\x86\\x5c\\x6b\\xc8\\x0b\\xed\\x0b\\xf0\\x78\\xac\\x40\\x54\\x7f\\xd5\\xfc\\xb2\\x83\\xe1\\xa0\\xc4\\x69\\x5b\\x2a\\x5d\\xf2\\x5c\\x75\\x4e\\x43\\xbb\\x9c\\xc6\\xc8\\xc4\\x49\\x2e\\x00\\x5b\\x1c\\xe5\\x10\\x70\\x7b\\x4e\\x49\\xe9\\x20\\x9f\\xb8\\x49\\x73\\x14\\x20\\xdf\\xa0\\xcb\\xf4\\x98\\x31\\x98\\x53\\xa6\\xef\\xf4\\xf2\\x32\\x76\\x32\\x99\\xb7\\xda\\x14\\x58\\x23\\x34\\x20\\x6b\\xf8\\xf1\\xac\\xa9\\xc9\\xcd\\x14\\xb9\\x99\\xc2\\xd3\\xa7\\x24\\xb2\\x42\\x31\\x19\\x08\\x8c\\xf3\\xa3\\xbb\\xcf\\x05\\xe6\\x76\\x66\\x62\\x53\\xe2\\xe2\\xa0\\xc2\\xc4\\xc2\\xe8\\xc0\\xd9\\xaf\\xe8\\x20\\xab\\x01\\xf0\\x1a\\x54\\x9b\\x93\\x07\\xde\\x06\\x9a\\x0f\\x20\\x4d\\x90\\xd8\\xfc\\x28\\x51\\x4e\\xaa\\xe2\\x9e\\x4a\\x6c\\x64\\x1a\\x52\\x49\\x29\\xac\\xb3\\x22\\x51\\x16\\xea\\x38\\xc4\\x97\\x3b\\x5c\\x6d\\xde\\xa6\\x9e\\x0c\\x2e\\x66\\xd3\\x5c\\x36\\x1e\\x17\\xac\\x03\\x10\\x8b\\x79\\x8e\\xfe\\x99\\x09\\x96\\x51\\xcf\\x54\\x56\\xda\\xaf\\x12\\xae\\xcf\\x18\\xc2\\xb6\\xda\\xa2\\x5d\\x20\\x8e\\x40\\x24\\xd1\\xa1\\x19\\xb5\\xec\\xaa\\x5c\\x2d\\xbb\\x15\\x0f\\xb5\\x95\\x03\\x02\\x99\\xe8\\xc0\\x65\\x78\\xa9\\x8d\\xeb\\x98\\xbe\\x6a\\x70\\x24\\x07\\xdc\\xfb\\xbc\\xc1\\xc1\\xa0\\x31\\x53\\x22\\xc1\\x17\\x95\\x81\\x06\\x68\\x18\\xc6\\x18\\x84\\xc5\\xf6\\x99\\xa8\\xd7\\xc4\\xaf\\x51\\x48\\xa4\\xb1\\x81\\x9f\\x79\\xa3\\xed\\xad\\xc6\\x74\\x4e\\x74\\x71\\x43\\x99\\x44\\xe1\\x81\\xd0\\x3c\\xad\\x84\\xb8\\x32\\x8c\\xf5\\x61\\xc1\\x7c\\xcc\\x67\\xa6\\xe5\\x79\\xd1\\xf9\\x80\\x21\\xe8\\x65\\x9e\\x56\\xe5\\x6b\\xf9\\x36\\x8c\\x4c\\x08\\x17\\x29\\x9b\\x41\\xbb\\x8b\\xf7\\x81\\xeb\\x11\\x50\\x01\\x46\\xbe\\x90\\x10\\x54\\x67\\xae\\x37\\xba\\x63\\xbe\\xbe\\x37\\x26\\x27\\x71\\x68\\x61\\xd1\\x51\\xd1\\xe1\\x23\\xa0\\xaf\\xa2\\xab\\x2b\\x6a\\xc0\\x50\\x75\\xa0\\x3b\\x1c\\x81\\x21\\x45\\x3e\\x21\\x86\\x95\\x0e\\x7e\\xec\\x80\\x63\\x8c\\xde\\x98\\x1d\\x4e\\x1c\\xd9\\xf4\\x0e\\x9f\\x61\\x26\\xa3\\x37\\x63\\x36\\x21\\x0c\\x45\\x81\\xd2\\x1c\\x1d\\x64\\xa2\\xa9\\x28\\x9a\\x24\\x37\\x6c\\xd2\\xde\\xdf\\xfe\\xb2\\xc0\\x77\\x7e\\xc9\\x3f\\x43\\xdd\\x57\\x5b\\x40\\xc5\\x4b\\x1f\\x1d\\x04\\xac\\xa3\\x54\\x30\\x2c\\x90\\xa6\\x49\\x54\\xa5\\x66\\x4b\\x64\\x53\\x2c\\xd6\\x30\\xed\\x17\\xcb\\x0a\\x71\\x74\\xb5\\xa4\\xf4\\x49\\x3a\\x27\\x2b\\x10\\x05\\x7b\\x22\\x34\\x10\\x1b\\x47\\x03\\xc6\\xcc\\xac\\xf0\\x84\\x95\\x58\\x39\\xda\\x4e\\x37\\xed\\xec\\xf4\\x7b\\xea\\x1c\\xdc\\xb6\\x0b\\x84\\xec\\x9d\\xe5\\x48\\x62\\xf1\\xe8\\x6e\\x7f\\xa7\\xb1\\xca\\x31\\x92\\x99\\x5f\\x91\\xba\\x9a\\x51\\x3d\\x4f\\x32\\x56\\x12\\x5c\\xb8\\x48\\x3f\\xed\\x58\\xbc\\x00\\xe7\\x3e\\x14\\x7f\\x6c\\x33\\x66\\x57\\x69\\xc1\\xd6\\xf2\\x10\\x64\\x9d\\x74\\xe2\\xed\\xac\\x52\\x0b\\x9f\\xcf\\xf6\\x71\\x40\\xf1\\x09\\xd3\\xb2\\x41\\x6b\\xa7\\x22\\x82\\x10\\xbd\\xb6\\x34\\x47\\xca\\x47\\xa5\\x33\\xac\\x5a\\x4c\\x45\\xf3\\xcc\\xdd\\x01\\x39\\x87\\xfd\\xa8\\x8a\\x41\\x23\\x1d\\x40\\xf3\\x70\\x6e\\x49\\x7b\\x7c\\x3b\\xc3\\x4a\\x99\\xa8\\x42\\xd1\\x99\\x6c\\xc4\\x2f\\xa4\\x0e\\xa1\\x1b\\x6b\\x66\\x15\\x49\\x08\\x92\\x38\\x59\\xba\\xe5\\xb8\\xb5\\xd4\\x40\\xb6\\x4e\\x25\\xb6\\x16\\x29\\x63\\x1f\\x02\\x13\\xc4\\x38\\x5c\\x96\\xa9\\x98\\xf6\\xd2\\x18\\x6f\\x91\\x10\\x42\\x1c\\x60\\xf0\\x0a\\x4f\\x01\\x6f\\x65\\x01\\xb6\\xb7\\x21\\xdc\\xfc\\x26\\xfd\\xe9\\x2f\\x92\\xf4\\x11\\x00\\x22\\x92\\x04\\x34\\x54\\xa7\\x2b\\x9d\\x28\\x4f\\x3e\\xa6\\x6a\\xa1\\x6b\\xea\\x42\\x23\\x5b\\xc9\\x52\\xca\\x58\\x69\\x25\\x86\\x60\\xca\\x4d\\xaf\\x44\\x59\\x1c\\x43\\xc4\\x08\\xab\\x2c\\x02\\x48\\x16\\x76\\x98\\x61\\xee\\x60\\x9c\\x20\\xb7\\xc4\\x20\\xfd\\x50\\x0b\\x36\\x9c\\xdb\\xf9\\xdc\\x18\\x53\\x3b\\xf3\\xf1\\x3e\\xdd\\x69\\x91\\x63\\x60\\x5a\\xef\\x10\\xe0\\xdf\\x1c\\x08\\x2a\\xd2\\xb1\\x90\\x79\\xec\\x18\\xb5\\x19\\x2a\\x48\\xf4\\x83\\xdf\\x99\\x71\\xcf\\xd9\\x0c\\x40\\x34\\x14\\x6d\\x11\\x2c\\x7c\\xc1\\xf5\\xc2\\x4e\\x88\\x61\\x7e\\x57\\x4f\\xda\\x6b\\xcb\\x67\\x83\\x24\\xca\\xb1\\x77\\x79\\xbc\\xe8\\x41\\x77\\xe0\\x02\\x4e\\x13\\x43\\x80\\x0b\\xf9\\x67\\x2b\\xff\\x2c\\x83\\xe7\\x90\\x4c\\x31\\xe5\\x04\\xa8\\x89\\x46\\x04\\xc4\\x2a\\x60\\xd9\\x5d\\xbc\\x00\\xd2\\xef\\x94\\x1a\\xd8\\xa8\\x5e\\x32\\x70\\xc6\\x3f\\x0e\\x31\\xe9\\x0f\\xa1\\x40\\x40\\x1a\\x68\\x72\\xdb\\x9a\\x30\\xd0\\x8e\\x0e\\x25\\xd3\\x37\\x29\\x28\\x99\\x4a\\x96\\x22\\xdd\\x73\\x60\\x24\\x17\\x38\\x04\\x2b\\xa2\\xd9\\xe2\\xf9\\x61\\xd2\\x81\\xf6\\x52\\xb7\\x66\\xc4\\x3a\\xa4\\xc8\\xac\\xc8\\xa8\\x85\\xc1\\xbf\\xe5\\x8b\\x06\\x76\\x08\\x72\\xd8\\x04\\xbf\\xe4\\x7c\\xc8\\xa8\\xf1\\xc0\\xbe\\x2c\\x2b\\x94\\x30\\x02\\x21\\xdc\\x84\\x48\\xf2\\x9a\\x38\\x02\\x23\\xbd\\xfb\\x34\\xc5\\xad\\x73\\x22\\x05\\xe7\\xaf\\x0c\\x20\\x2b\\xd4\\xb2\\xc2\\xba\\x97\\xa2\\xdd\\x83\\x6d\\x82\\x49\\xe4\\x7d\\x18\\x2d\\x8c\\x31\\xa2\\xc8\\x12\\x42\\xca\\xf8\\x58\\x2c\\xd7\\x50\\x5f\\x6d\\x01\\x84\\x72\\x2f\\x72\\x30\\x78\\xa9\\x22\\x9c\\x94\\x8a\\x4c\\x13\\x75\\xbf\\x3c\\xbe\\xe8\\x12\\x53\\x44\\x28\\xef\\x5d\\x6e\\xad\\x0b\\x8a\\xd4\\x84\\x78\\x92\\x50\\x26\\xf2\\xd4\\x35\\x53\\x06\\x72\\xfa\\xf4\\x5d\\x98\\xb1\\xf6\\x17\\xa1\\x22\\x68\\x6d\\x0f\\x95\\xee\\x50\\x58\\x61\\x03\\xd6\\x93\\x20\\x96\\x45\\x42\\x70\\x0a\\xf5\\x90\\x73\\x16\\xf4\\xe6\\x86\\x29\\x2c\\x3e\\x9e\\x3c\\xf1\\x6d\\xd2\\xa2\\x18\\x95\\x55\\x30\\xf1\\x7c\\x4b\\x90\\x89\\x95\\x38\\x04\\x48\\x27\\xc4\\x5f\\xb4\\xfc\\xe1\\xf2\\x77\\x5a\\xe5\\xb1\\x1f\\x9f\\x55\\xdc\\xce\\x91\\x33\\xf9\\x47\\x5b\\x3d\\xb2\\xac\\xca\\xb6\\xca\\x3a\\x33\\xfd\\x9b\\xdc\\x07\\xed\\xef\\x5b\\xcf\\x8c\\xe6\\xd4\\xa5\\x57\\xf5\\xb8\\x97\\xf7\\xe3\\xb3\\x68\\x71\\x74\\x10\\x27\\x85\\xf1\\x67\\xf9\\x1e\\x73\\x96\\xdc\\x8b\\x92\\x74\\xd7\\x05\\x6b\\x2d\\x4f\\x92\\xd8\\x6e\\xdc\\x27\\x7a\\xdd\\x6f\\xce\\x4f\\x02\\xc8\\x96\\xad\\xba\\x16\\x6f\\x30\\x70\\x2c\\x77\\xf2\\x89\\x63\\x97\\x43\\x49\\x11\\x3d\\xe9\\x52\\xfd\\xf8\\xa8\\x95\\x44\\x1a\\xeb\\x9c\\x50\\xf6\\x4b\\x12\\x58\\x42\\x34\\x48\\xa0\\x6f\\xfe\\xc7\\xf4\\xf1\\x18\\x31\\x41\\xcd\\x2b\\xbb\\x0e\\xd3\\x24\\xcd\\x34\\x7c\\x41\\x4d\\x5c\\x92\\xd9\\x35\\xff\\xe5\\x04\\xdc\\x6d\\x31\\xb2\\x56\\x03\\x27\\xab\\x4d\\x80\\x81\\xb9\\x02\\x95\\x79\\xcb\\x19\\x1b\\x93\\x37\\xed\\x60\\xdc\\x92\\x7b\\x03\\x32\\x64\\x16\\xae\\x7e\\x2a\\x87\\x15\\xd8\\xc1\\x48\\xa3\\x5a\\x6d\\x20\\x4d\\x39\\xb3\\x08\\x1a\\x0d\\x55\\x41\\x24\\x4f\\x52\\x12\\x43\\x2c\\x81\\x4e\\x19\\x38\\x2c\\xa1\\x1e\\xa8\\x45\\x4d\\xc2\\x33\\x83\\xa6\\x0f\\xf2\\x97\\xd2\\x87\\xcf\\x64\\xfd\\x41\\x31\\xa8\\xdc\\xec\\xf4\\x21\\x1c\\x98\\xcc\\x7c\\xa6\\x85\\xcb\\x7d\\x57\\xd4\\x15\\xc6\\xa3\\xcd\\x42\\xc3\\x7e\\xb1\\x20\\x68\\x1f\\xd5\\x81\\x13\\xba\\x33\\x76\\x80\\xfb\\x48\\xda\\xd7\\xe2\\x9a\\xbd\\xa0\\x0a\\xfc\\x4d\\x6d\\xdd\\x29\\x70\\x11\\xa7\\x91\\x20\\x28\\x6d\\x19\\x84\\x25\\xa9\\x37\\xa0\\xf5\\xe6\\xea\\x56\\x8a\\x19\\x75\\x53\\x12\\xf8\\x64\\x2d\\xf0\\xfe\\x58\\xae\\xf0\\x0d\\x6a\\x56\\x06\\x88\\x5d\\xfc\\xb4\\xc1\\x00\\x84\\x5f\\x31\\x2a\\x93\\x58\\xf8\\x0a\\x49\\x8a\\x03\\x21\\xd9\\xa4\\x40\\xfa\\xe3\\x13\\x12\\x87\\xc1\\x19\\x93\\xc8\\x5c\\xa6\\x01\\x83\\xba\\x7b\\x62\\xa2\\x3f\\xb0\\x04\\x7e\\x1b\\x50\\x8f\\x87\\x67\\x74\\xde\\x72\\x2e\\x28\\xd8\\x8f\\x54\\xbf\\x52\\x36\\xc3\\x37\\xba\\x3a\\xa0\\xfc\\xe2\\x52\\x97\\x8f\\x4f\\xc3\\x65\\x33\\x94\\x25\\x91\\xd3\\x4b\\x1b\\xdd\\x5b\\x23\\xa0\\x89\\x52\\x64\\xd6\\xc4\\x73\\x1f\\x84\\x31\\xa1\\x31\\xd4\\xa6\\xa4\\x56\\x69\\xa0\\x0b\\xb2\\xfb\\x64\\x6f\\x18\\xc7\\xfa\\x64\\xb2\\xeb\\xb6\\x1f\\x33\\x57\\x8f\\x39\\x88\\xd6\\xaa\\x63\\x06\\xf2\\x14\\x58\\xb2\\xb2\\xb6\\x14\\x3b\\xff\\x62\\xf1\\x26\\x52\\x07\\xa2\\xae\\x8d\\x97\\xcc\\xa8\\x52\\xf9\\x6f\\xa5\\x66\\xb6\\x3d\\x1c\\xc4\\x35\\x6e\\xc5\\x7b\\xc7\\xad\\xcc\\x81\\x43\\x91\\xab\\x6e\\xea\\x77\\x1f\\xa2\\x33\\x79\\x88\\xf4\\x62\\x44\\x20\\x34\\x50\\xbb\\xa4\\x2a\\x12\\x81\\x8e\\xee\\x34\\x49\\x8b\\x33\\xb7\\x53\\xb7\\x22\\x86\\x2f\\x02\\x85\\x5c\\x58\\x5f\\xbd\\x29\\xc6\\x53\\x5f\\xcb\\xe1\\x94\\x16\\x0c\\x08\\x37\\xd7\\x51\\xba\\x17\\x1c\\x0c\\xd4\\x92\\x3c\\xe0\\x18\\xea\\x14\\x68\\x1d\\x47\\x10\\x2a\\xc3\\x4b\\x90\\xbc\\x18\\xf3\\x44\\xb6\\x0d\\x40\\x0e\\xd9\\xcb\\x64\\xb1\\xeb\\x17\\xa7\\x4a\\xdf\\x85\\xef\\x5a\\x66\\xdd\\x09\\x0e\\xc3\\x1d\\xd8\\x63\\xee\\x6a\\x2e\\x61\\x68\\x3d\\xe6\\xf4\\xcd\\x78\\x57\\x40\\xe3\\xde\\x83\\x41\\xf0\\xd5\\x24\\x06\\x41\\x6c\\x1c\\x71\\x74\\x19\\x8a\\x74\\xa5\\x79\\xd9\\xd6\\x09\\x0a\\xd9\\x2e\\xda\\xc9\\x42\\xe9\\xc2\\x3a\\xd6\\x47\\x9f\\x3c\\x72\\x45\\x68\\x8e\\x0e\\x36\\xb5\\xca\\x63\\xc6\\x87\\x54\\x44\\xb2\\x0c\\xab\\xf1\\x4c\\xa2\\x99\\x99\\x3e\\xbc\\x8a\\xe5\\xc5\\x4b\\xde\\x67\\xef\\x8b\\x84\\xbf\\x41\\xd9\\x2f\\x5a\\x95\\xed\\xcd\\xf3\\x43\\x47\\xdf\\xaf\\x6e\\xab\\x5d\\x10\\x31\\xe0\\x1a\\xa6\\xf0\\x82\\xf8\\x8e\\x0c\\x72\\x84\\x0e\\x9c\\x37\\x3b\\xcc\\xf8\\xb6\\x0b\\xf5\\xf5\\xc6\\xf7\\x9c\\xf0\\x98\\xd2\\x7c\\xcd\\xbe\\x96\\x8d\\xde\\xf9\\x6e\\x5b\\xf0\\xeb\\xff\\x42\\xa9\\x77\\x10\\x20\\x9d\\x4a\\x7f\\xa9\\x34\\xa8\\x17\\x98\\xc2\\x8b\\x2f\\x4f\\x9b\\xa7\\x52\\xa7\\xf1\\xb6\\xcb\\xfd\\x3e\\x65\\xf3\\x2d\\x66\\xe3\\xe9\\xba\\x64\\x52\\x73\\x3c\\x8e\\x48\\x27\\xb3\\xe1\\x77\\x0a\\x5e\\x4b\\xd3\\xc2\\x76\\xba\\xd8\\xce\\x79\\x48\\x7c\\x16\\x53\\x58\\x80\\x4d\\x2a\\x45\\x4a\\xba\\x79\\x50\\x23\\xa1\\xbf\\xe4\\xbe\\x1e\\x13\\xbf\\x57\\x60\\x8c\\xca\\xa0\\xcf\\x81\\xde\\x55\\x32\\x22\\x73\\x38\\x14\\x54\\x1f\\x25\\xf4\\x9a\\x92\\xe0\\x33\\x4e\\x90\\xe3\\x5e\\x0f\\x2b\\x9c\\xb2\\x19\\x73\\x4a\\xa7\\xf1\\x14\\x4f\\x52\\x4c\\x90\\x37\\x0e\\xe4\\x47\\xe3\\x6f\\x59\\x04\\x4a\\x9d\\xeb\\xef\\x80\\x2e\\x68\\xbc\\xec\\x4f\\x8a\\x07\\x98\\x81\\x5c\\xe4\\xcc\\xd9\\xef\\x7b\\x7f\\x06\\x60\\xf5\\x78\\x0f\\x2b\\x7a\\x62\\x2d\\x03\\x8c\\xd2\\x5a\\xe1\\xa2\\xf7\\x62\\x7b\\xb6\\xe7\\x6b\\x17\\x2d\\x58\\xcd\\x74\\x1c\\xf9\\x97\\x10\\xbb\\xbf\\xaf\\xd8\\x5e\\xe2\\xe2\\xc2\\x8e\\xed\\xfe\\x92\\xf6\\x6d\\x2d\\x7c\\x55\\x99\\x53\\x20\\x02\\x7a\\x80\\x8d\\x6f\\xbd\\x2b\\xbd\\xd0\\x7b\\x3c\\x1a\\xfe\\xb0\\x52\\x27\\x33\\xf8\\xfb\\x9a\\xf9\\xa0\\x8d\\xb1\\xc1\\xb7\\x2e\\x1e\\x80\\x84\\x3f\\x42\\x51\\x54\\x4e\\x8f\\x0a\\x1e\\xda\\xe1\\x5d\\x63\\x2b\\x46\\x22\\x3a\\x9a\\x17\\x88\\xd5\\x43\\xca\\x3a\\x5e\\x6b\\x0c\\x9c\\x59\\x84\\xfe\\x29\\xf6\\xd2\\x10\\x9b\\x14\\x7b\\x15\\x4d\\x89\\x36\\x40\\xc0\\xb3\\xa2\\x77\\xc1\\x82\\xe8\\x9a\\xbb\\xa5\\x98\\xaf\\x31\\xf1\\x31\\xce\\xab\\x9a\\x80\\x8a\\x85\\x8d\\x23\\x39\\xe1\\x17\\x8a\\x5c\\x18\\xce\\x6d\\xef\\x37\\x84\\x13\\x47\\x89\\x33\\x12\\xa9\\xba\\x61\\x07\\x1b\\xf8\\x89\\xe6\\x4a\\x1a\\x5f\\x68\\x96\\xc6\\x2e\\xf2\\xc4\\x70\\x58\\x8a\\x04\\xfc\\xb5\\x80\\x7a\\xfd\\xf6\\x40\\x50\\x34\\xbd\\x83\\x35\\x6c\\x0d\\x92\\x73\\xf6\\x15\\x06\\x5e\\xba\\x10\\x36\\x1c\\x75\\x97\\xd5\\x1a\\x01\\x2d\\xf6\\x80\\x76\\x09\\x08\\x6d\\x5c\\xe8\\x4b\\x5e\\x73\\x9c\\x88\\x3a\\x54\\xc7\\x02\\x18\\xfe\\x14\\x5e\\xb6\\xc5\\xc6\\x81\\xfe\\xde\\x3d\\x6c\\x11\\xc9\\x2d\\x1b\\xa6\\xeb\\xa9\\x64\\x64\\x99\\x4e\\xfe\\xfe\\xa0\\xe9\\x26\\x43\\x8e\\x37\\xce\\x14\\xa4\\xf9\\x92\\xf8\\xf1\\x7b\\x82\\xfa\\xa1\\xa4\\x43\\x74\\x6a\\xa0\\x51\\x54\\xef\\xf1\\x5e\\x60\\xa6\\x59\\x16\\x45\\x69\\x38\\x7e\\x25\\x7d\\x78\\xb2\\x52\\xda\\xc6\\xea\\xea\\x11\\x2b\\x40\\xaa\\x53\\x69\\x9f\\x46\\x60\\xc8\\x36\\x0f\\x3b\\x41\\xdb\\xfa\\x73\\x6e\\xa3\\x2a\\xb8\\x4c\\xbe\\x16\\x99\\x58\\xae\\x40\\x76\\xb1\\x49\\x27\\x01\\xd6\\x8c\\x08\\xa0\\xb0\\xe2\\x40\\xc3\\x12\\xf4\\x0f\\x53\\x5a\\x85\\xf2\\x2c\\xea\\x0e\\xfe\\x0a\\x66\\x76\\x86\\xc8\\x7b\\xe2\\x61\\x54\\xef\\x27\\xea\\x6e\\xf5\\xd8\\x19\\xd6\\x27\\xfe\\xb3\\xe0\\xf5\\x32\\x74\\xe5\\x20\\x60\\x85\\xa3\\x9c\\x5b\\x24\\x9d\\xa4\\x4d\\x8d\\x50\\xa3\\xa4\\x26\\x1d\\xb3\\x0e\\xaa\\x82\\x66\\x12\\x5b\\xdd\\x2b\\xba\\xf3\\xc5\\x36\\x15\\x3a\\xbc\\x21\\x0b\\x83\\xbd\\x7f\\xe5\\xdd\\x76\\x17\\xc3\\x36\\x2b\\x20\\x0c\\xa1\\xc1\\xb6\\x56\\xf1\\x58\\xd3\\x76\\x25\\x64\\x2d\\x08\\x65\\x9e\\x71\\x74\\xb9\\xfd\\xc8\\x60\\x9e\\x11\\xdb\\x88\\xdd\\x52\\xf9\\x73\\x3b\\x89\\xd5\\xf6\\x31\\x8e\\x48\\x7e\\x59\\x5f\\xd1\\x2e\\x5f\\x31\\xdc\\x90\\xfa\\x8b\\xe7\\x53\\x08\\x7a\\x24\\xfc\\x15\\x03\\xf9\\x1d\\x06\\x16\\x81\\x4a\\xb4\\xe3\\x13\\xfc\\x98\\x71\\x11\\x56\\xdb\\x0d\\xd2\\x5f\\x2f\\x7c\\x8d\\x42\\x3c\\x8d\\x42\\x32\\x66\\x8a\\xc1\\xc2\\xbf\\x29\\x15\\xef\\xcf\\x22\\xb2\\x72\\x49\\x52\\x9b\\xdd\\xfc\\x62\\x5a\\x94\\xc4\\x83\\x06\\xf3\\x21\\x73\\x5a\\x68\\x3d\\x4c\\xd6\\x25\\x86\\x27\\x3f\\x81\\xd4\\xb6\\x24\\xf1\\xb8\\xaf\\x5b\\x72\\x16\\x27\\xb8\\x15\\xe8\\xb8\\xdd\\x0f\\x23\\xa2\\x8f\\xc4\\xb2\\xcd\\x5b\\xa8\\x08\\x8c\\x46\\x79\\x91\\x99\\x93\\x61\\xc4\\xc3\\x83\\x4b\\xab\\x49\\x1b\\x05\\xf7\\x93\\xb2\\x3b\\x2b\\xcb\\x10\\x9d\\xe4\\xae\\x91\\x0c\\xf9\\xa7\\x51\\x56\\x8a\\x54\\xb1\\xf4\\x98\\x52\\x39\\x55\\xa9\\x9e\\xf9\\x3d\\x7f\\x61\\x0f\\x3a\\x18\\xd7\\x81\\xbe\\x80\\x4a\\xe7\\x91\\xeb\\xaf\\xe8\\x50\\xbb\\xb2\\xfc\\x60\\xb6\\x79\\x39\\x93\\x09\\xf8\\x86\\xd9\\x83\\xfd\\x3f\\x7b\\x91\\xc8\\x9a\\x46\\xf5\\x22\\x73\\x5b\\x9a\\x76\\x38\\x0f\\x26\\xae\\x86\\xb5\\x38\\xa8\\x51\\xa9\\x3d\\xeb\\x63\\x6d\\xd7\\xcf\\xe9\\xbf\\x8e\\x8c\\x14\\xe0\\x51\\x2e\\xa9\\x45\\x54\\xba\\xf3\\xeb\\xed\\x2f\\x3e\\x3f\\xad\\x24\\x75\\xb7\\x6e\\xae\\x63\\xdf\\x4f\\xae\\xe5\\x59\\x58\\x6b\\x3e\\x2b\\x53\\x45\\x8a\\xf5\\xc9\\x17\\xad\\x65\\x2d\\xae\\x1b\\x63\\x5c\\xad\\x17\\x69\\x8c\\xf7\\x41\\xc3\\x1d\\xea\\x02\\xa5\\xcf\\x09\\x56\\xba\\x72\\x27\\x81\\x9f\\x82\\xa4\\xf2\\x82\\xc6\\xa1\\x3e\\x70\\x64\\x72\\x07\\xf6\\x85\\x8b\\xf9\\x36\\xea\\x31\\x89\\x52\\xae\\x62\\x28\\xa8\\x81\\x2b\\x02\\x4b\\x58\\x7f\\xae\\x85\\x63\\xeb\\xc7\\x6b\\x27\\xaa\\xfb\\x4b\\xba\\x6a\\x0b\\xef\\xf0\\xa6\\xae\\xe4\\xda\\x52\\x6b\\xd2\\xa1\\x21\\xa8\\x42\\x4d\\xcb\\xd0\\x6f\\x09\\xe9\\x36\\x05\\xba\\xd9\\xb8\\xa7\\xd9\\x98\\x3d\\xdd\\x43\\xf1\\x8a\\x78\\xd0\\xea\\x57\\x53\\x1c\\xe3\\xc2\\x5b\\x4c\\x9e\\x6e\\x5b\\xfe\\x5f\\xc7\\x36\\x99\\x99\\xf2\\xd8\\x3f\\x1e\\xb3\\x1f\\xe1\\x9a\\xdd\\xa1\\x78\\xf4\\xe0\\x55\\x20\\xdf\\x84\\x8d\\xd6\\xcd\\x41\\x46\\x2b\\xad\\x69\\xd7\\x52\\x7b\\xae\\x61\\xaf\\xad\\x9c\\xac\\x36\\x66\\x51\\x41\\xf7\\x8d\\xb1\\xe4\\xdf\\x1d\\x4c\\x92\\x4b\\x98\\x67\\xa6\\xb5\\x3d\\x8f\\x84\\x37\\xc8\\x6f\\x61\\x65\\x24\\xd9\\x80\\x99\\x82\\x99\\x1c\\xbc\\xa1\\xc7\\x1d\\x13\\x2a\\x2d\\xf9\\x89\\xeb\\xb0\\xd9\\x4a\\x1d\\xc6\\x42\\x46\\x58\\x28\\xf9\\x51\\x7a\\x64\\x9f\\xc9\\x5f\\x69\\x73\\x73\\x26\\x1c\\x62\\x09\\xb6\\xfe\\x48\\xc0\\x6a\\x35\\xa3\\x4c\\x07\\x0f\\x10\\xab\\xb5\\x0f\\x33\\x1b\\xf3\\x1e\\xc5\\xc7\\xbf\\x11\\x7f\\x83\\x27\\xf6\\x2c\\x12\\xb7\\x86\\x35\\xf9\\x9a\\x22\\x38\\x78\\x0f\\xba\\x3c\\xfd\\xbe\\x73\\xcc\\xa7\\x09\\x92\\xe9\\xe7\\xba\\xb6\\x28\\xca\\x65\\xe4\\xcc\\x61\\x74\\x6e\\xaa\\x2d\\x33\\x2d\\xe3\\x2e\\x00\\xe0\\xc1\\x73\\x12\\xf1\\x0e\\x7a\\x7b\\xc7\\x14\\x36\\x31\\x74\\xa8\\x55\\x58\\xac\\xdc\\xf3\\xc0\\xa0\\x4d\\x0f\\x63\\x8d\\x19\\x40\\x53\\x80\\xa5\\x31\\x9b\\xda\\x86\\x57\\xc8\\x5b\\x83\\x83\\x5f\\x59\\x22\\xd3\\x49\\xf4\\x6d\\x95\\x53\\x00\\x69\\x47\\x1b\\xaa\\x40\\x44\\x88\\x29\\xf7\\x17\\x5d\\xce\\x39\\x30\\xd9\\x00\\xd7\\x10\\xae\\x33\\x9a\\xca\\x5f\\xa8\\xbc\\x0a\\xc7\\xc6\\x18\\x05\\x79\\x93\\xe9\\x74\\xf1\\xf7\\xc6\\xf5\\x8d\\x31\\xe3\\x6e\\x73\\xe8\\x21\\x16\\x67\\xc8\\xb7\\x33\\xb5\\x6e\\xa8\\x20\\xa4\\xc7\\xd9\\x1a\\xbb\\x94\\x17\\xcb\\x2a\\x1f\\xa3\\xb3\\xa1\\x06\\x16\\xe1\\x31\\x47\\x7c\\xdf\\x40\\xbd\\xea\\xcf\\x95\\xfd\\x87\\xd5\\xe2\\xbd\\x2f\\x91\\xf2\\x08\\x75\\x9e\\xb1\\xa0\\x85\\x47\\x8e\\x85\\x88\\x51\\xbf\\x26\\x6c\\xb8\\xd9\\x98\\x47\\xa9\\x3e\\x2f\\xdc\\x3b\\xbc\\xd8\\x67\\x45\\x38\\x7f\\x99\\xa0\\x93\\x19\\xe6\\xeb\\x38\\x1a\\x48\\xdc\\xb0\\xa5\\x93\\x30\\xac\\x40\\x0b\\x83\\x9a\\x12\\x66\\x7c\\x70\\x9a\\x9b\\x64\\x71\\x82\\xbe\\x4a\\x96\\x49\\x37\\x56\\x41\\xf6\\x97\\x13\\x04\\xd5\\x25\\x49\\x1e\\x94\\x0a\\xc7\\xaf\\xdf\\x4b\\xa8\\x80\\x94\\x94\\x9d\\x4a\\x5d\\x29\\x7c\\x65\\x58\\x01\\xd4\\x3b\\x83\\x52\\x9d\\x7a\\x8d\\x71\\x8c\\x8f\\x4b\\xf2\\x2f\\x98\\x3e\\x9d\\xa9\\x0b\\x93\\x45\\xc8\\xa4\\x82\\x67\\xf2\\x68\\x14\\xc9\\x2a\\x41\\xb0\\x1f\\x81\\x83\\x36\\x0e\\x83\\x09\\xd8\\x34\\x3f\\x9a\\x7d\\x13\\x5a\\x44\\x84\\xbb\\xda\\x0e\\xc5\\xda\\xcb\\x7f\\x81\\x25\\x93\\xa1\\xf6\\x89\\x08\\x94\\xc1\\x6d\\xb4\\x47\\xa8\\xec\\x4b\\x44\\x23\\xba\\x4d\\x8f\\xf8\\x70\\x34\\xf0\\xef\\x19\\xab\\x31\\xc5\\x61\\x85\\x12\\xc9\\x16\\x88\\x9f\\x6c\\x23\\xde\\xce\\xf6\\xbb\\x9e\\xa6\\x25\\xa3\\xc8\\x43\\xc6\\x4a\\x1a\\xa4\\x4d\\xbd\\x92\\x94\\xcf\\xd6\\x80\\xf7\\x22\\x51\\xaf\\xe1\\x5b\\x9b\\xfa\\x11\\xc5\\x20\\xc0\\x6b\\x2c\\x54\\xb3\\x11\\xe7\\x58\\xb8\\xb1\\x1b\\x52\\x7f\\xf4\\x6f\\x38\\x17\\x58\\x24\\x50\\xcc\\x8f\\x96\\x87\\x82\\x31\\xd4\\x51\\x92\\x5f\\xf9\\x89\\x83\\xec\\x0e\\x0c\\x26\\x8b\\xe9\\x48\\x66\\xfc\\xda\\x9a\\xeb\\x73\\x77\\x51\\xf9\\x20\\xc6\\x30\\x86\\xb2\\xe6\\xc3\\xfa\\x98\\xde\\xed\\x65\\xba\\x76\\xc1\\xdc\\x6c\\x2c\\xe4\\x9a\\xe8\\xe5\\x7e\\x6c\\xd1\\x51\\x8b\\x07\\x83\\x05\\x11\\xd1\\xdb\\xc4\\xfa\\x63\\xe6\\x6f\\x24\\x89\\x78\\x78\\xa6\\x50\\xfb\\xf5\\x1a\\x22\\xed\\x13\\x1b\\x1e\\x3c\\x8b\\xf7\\xee\\xa6\\x48\\xab\\xa5\\x42\\xb7\\xb5\\x06\\xa9\\xfc\\xf1\\xb0\\x86\\xc4\\xd3\\x0c\\x41\\x12\\x8e\\xc0\\x36\\x2e\\x24\\x2d\\x1a\\xc6\\x78\\xd2\\xae\\x8e\\x54\\xe4\\x75\\x37\\x34\\xc0\\xd8\\x01\\xfd\\x58\\xc7\\x99\\xea\\x8c\\x4f\\xe4\\x85\\xc6\\x26\\x17\\x83\\x13\\xb1\\x29\\x8e\\xc5\\x6e\\x87\\xd9\\x80\\x4f\\xcc\\x05\\x54\\xef\\xe2\\xa0\\x1c\\xda\\x41\\x91\\xab\\x59\\x21\\x7d\\x92\\xdf\\xc3\\x40\\x25\\x9b\\x45\\x24\\x4e\\xe2\\x42\\x5d\\xca\\x35\\x57\\xd8\\xa0\\xc0\\x24\\x63\\x6e\\x1f\\xf4\\xe6\\x95\\x1e\\x98\\x71\\xd9\\x00\\x5c\\xba\\x38\\x88\\xcf\\x3c\\xa4\\x78\\x4f\\x87\\xd7\\xe1\\xa8\\xc5\\x40\\x60\\x1f\\xb3\\x2c\\x28\\x7e\\xe6\\x1b\\xde\\xf0\\xca\\x6a\\xc7\\xbb\\x3d\\x93\\x77\\x5d\\x78\\xeb\\x67\\xb4\\x6c\\x0f\\x8b\\x38\\xd4\\x07\\xb1\\x4d\\x00\\x0b\\x7f\\x31\\x86\\xda\\x5b\\xf5\\x9e\\xc5\\x37\\x75\\x64\\x99\\x86\\xeb\\xc9\\x61\\x3b\\x3d\\x4c\\x06\\xca\\xaa\\xc3\\x67\\x7a\\x65\\x8d\\x43\\x8f\\xb5\\x60\\xa6\\x2d\\x07\\x3d\\x4a\\x20\\xca\\x70\\x22\\xe6\\x8a\\x3a\\x92\\xe4\\xf5\\xff\\xa3\\xcd\\x2e\\x41\\xe6\\x20\\x0d\\x9c\\xa4\\x31\\xd6\\x74\\x86\\xe9\\x87\\x59\\x31\\x0e\\xa2\\x95\\x44\\xd5\\x91\\x10\\x40\\x82\\xa6\\x82\\xdf\\x33\\x9d\\x4c\\x23\\x9d\\x2a\\xab\\xd7\\x23\\x8c\\xc3\\x0a\\x63\\x66\\x85\\x4d\\x3f\\x66\\xd2\\xb6\\xb3\\xfa\\x48\\x1f\\x06\\xe0\\xca\\x38\\x09\\x0f\\x86\\xf9\\xe8\\xcc\\x28\\x7e\\x2b\\x31\\x86\\x2b\\x34\\x29\\xf6\\x11\\x0c\\xae\\xa0\\xf3\\x64\\x5b\\xf5\\x7b\\x3a\\x67\\x5c\\xf5\\x2d\\xa2\\xe4\\x12\\x7e\\xa4\\x6d\\x12\\xde\\x02\\xbc\\xa7\\xd8\\x28\\xed\\xd7\\xde\\x0b\\x0f\\xb3\\x79\\x20\\x3b\\x68\\x50\\xc6\\x2f\\x0f\\x5a\\xc1\\xe0\\x36\\x28\\xbe\\x60\\x08\\x47\\x97\\x50\\x10\\x99\\xc2\\xdb\\x47\\x9c\\x14\\x71\\xda\\xe6\\x39\\xb4\\x28\\x09\\xde\\x2a\\xac\\x2c\\x14\\x5b\\x2b\\x1d\\xf8\\x24\\x90\\xe1\\x50\\xce\\x24\\x7f\\x47\\x7b\\x05\\x21\\xcd\\x1d\\x10\\x19\\x4d\\x55\\x7e\\x1e\\x11\\x1d\\x0e\\x1c\\x89\\x5a\\xc8\\x62\\x05\\xdb\\x8c\\xe5\\x97\\x23\\xde\\x7d\\xc9\\x56\\x27\\xa1\\x42\\xa4\\xcc\\xd6\\xda\\x0e\\x8f\\x2a\\xf8\\xa0\\x41\\x41\\xa0\\xb7\\x55\\x8b\\x03\\xaf\\xd9\\x44\\x09\\x59\\x42\\x90\\xb8\\x5a\\x98\\x6f\\x2b\\xe8\\xc7\\x05\\xb7\\x0a\\xc8\\xe5\\x04\\x61\\x06\\x8d\\x5e\\x35\\x12\\x68\\x00\\xc5\\xce\\xef\\xd5\\xbb\\xd2\\x78\\x7e\\xc2\\xea\\x4b\\x08\\x31\\xc4\\xb1\\xaf\\xdd\\x07\\xbb\\x4c\\x56\\xa3\\x8e\\x3f\\xc0\\x6a\\xbf\\x83\\x64\\xbf\\x9e\\x2b\\xf9\\xfe\\x0b\\xec\\x82\\x4a\\x29\\xae\\x96\\x62\\x3d\\xc8\\xce\\x56\\x51\\xcc\\x6b\\x89\\x9b\\xa7\\xf8\\xd1\\x61\\x33\\xf2\\x72\\x25\\xdb\\x8b\\x10\\x5d\\x9e\\x96\\x79\\x3c\\x05\\x69\\x17\\x12\\xa1\\x30\\x84\\xc3\\x15\\xc7\\xfd\\x63\\xe5\\xc0\\x55\\x4f\\xc0\\x95\\xca\\x4c\\xd2\\x3a\\x20\\xd0\\xb4\\x08\\x2d\\x38\\xb5\\x98\\x8e\\x08\\x13\\x3e\\x50\\xed\\x45\\x76\\x68\\x3b\\xad\\xa7\\xbf\\x89\\x7c\\xee\\x26\\x7c\\x14\\x13\\x63\\x4b\\x62\\x52\\x93\\x4e\\xb5\\x75\\xb1\\x78\\x63\\x43\\xd7\\x95\\xfe\\x63\\x97\\xd3\\x0b\\xea\\x8b\\x43\\x3d\\x74\\x4f\\x77\\x53\\x9a\\x78\\x0b\\x72\\xb9\\x0e\\xed\\xe1\\x3b\\xbf\\x1a\\x04\\xfd\\x03\\xb2\\x69\\x26\\x89\\x8d\\xae\\xb5\\x77\\x73\\x0c\\xc6\\xb9\\xda\\xaf\\xae\\x9e\\x73\\xd0\\x52\\x8f\\x77\\x2e\\x5b\\x70\\x65\\x94\\x2c\\xa5\\x96\\xa8\\x6e\\xb1\\x94\\x68\\xef\\xc2\\x33\\x0f\\x78\\x9a\\x59\\x20\\x24\\x76\\x90\\x12\\x9e\\xc1\\x4a\\xc8\\xa5\\x94\\xde\\xfd\\x9a\\x47\\xcd\\x8d\\x1c\\x89\\x4f\\x18\\x79\\x8c\\xb1\\x05\\x3b\\xd5\\x27\\x1b\\xd4\\x87\\x09\\x14\\x2e\\xcf\\x84\\x9a\\x8f\\x50\\x99\\xaf\\xa7\\x55\\x49\\x23\\x7a\\x22\\x42\\x2c\\x96\\xde\\x00\\x16\\xbc\\x9c\\xd4\\xce\\xf0\\x43\\x6e\\x08\\x63\\xf3\\x98\\x84\\x5c\\xb3\\x4c\\xac\\x4b\\x88\\x89\\x8f\\x2c\\xe3\\x04\\xd8\\xa2\\x4a\\x63\\x7d\\xa7\\xa6\\x33\\x6d\\x64\\x18\\xd5\\x32\\x90\\x41\\xce\\x3a\\x02\\x2b\\x36\\x0b\\xe8\\xac\\x98\\xcf\\x15\\x07\\xe2\\x25\\xb2\\xfb\\xd7\\xe1\\x8d\\x34\\xf3\\xef\\xfe\\xac\\xd3\\x25\\x14\\xe2\\x2e\\x67\\x15\\x49\\x35\\x0b\\x22\\x65\\x52\\x14\\x55\\x56\\x84\\xdc\\x3b\\xec\\x1f\\x6e\\xbc\\x79\\xa6\\xb3\\xd9\\xcb\\x7c\\xf6\\xc9\\xb8\\x8d\\xcb\\xcc\\x84\\x57\\xfb\\x7f\\xe8\\xb1\\x06\\x11\\x12\\x22\\x41\\x8a\\x17\\xc7\\xb3\\x44\\x0c\\xc9\\x26\\x31\\x66\\x61\\xbb\\xe4\\xca\\x03\\x36\\x52\\x1c\\x8c\\x4c\\xa6\\x8f\\xc7\\xf6\\xc4\\x5c\\xf7\\xf0\\x04\\x5f\\xf5\\x7e\\xb9\\x32\\xfa\\x52\\x4f\\x9b\\xfa\\x89\\x4b\\xda\\x04\\x69\\x52\\x1f\\x31\\xa3\\x55\\xce\\xb7\\x1e\\xa4\\x00\\x5f\\x36\\xcf\\x87\\xe1\\xb1\\x1b\\x7e\\x6b\\x0d\\x71\\x62\\xa9\\x3f\\x75\\x6a\\xfb\\x83\\x0c\\xa4\\x19\\xdd\\x39\\xf4\\x71\\x89\\x46\\x38\\x5c\\xc6\\x59\\x80\\x57\\x0c\\x68\\x1a\\x95\\x52\\x82\\x34\\x6e\\x17\\x43\\x6a\\x63\\x69\\x6f\\xfe\\xd3\\xb9\\x9c\\xd1\\xa8\\xad\\xec\\x09\\x62\\x98\\x0d\\x8c\\x0c\\x72\\xac\\x02\\x9e\\x48\\x59\\x1e\\xde\\x46\\xd6\\x65\\x58\\xf5\\x82\\x8b\\x4f\\x3e\\x00\\x67\\x55\\xda\\xe0\\xc5\\x05\\x0c\\xb7\\x08\\x77\\xbb\\x99\\xb1\\x1f\\x7d\\x1d\\x2b\\x8b\\x97\\x02\\xa7\\x1e\\xe1\\x41\\xb6\\x2e\\x02\\x2c\\xb4\\xb0\\x57\\xa4\\xd9\\xb3\\x59\\xb6\\x11\\x86\\x5f\\x4a\\x90\\x81\\xcc\\x14\\x16\\xd3\\x00\\x65\\xe9\\x1f\\x77\\x62\\x35\\x25\\x6b\\xcc\\xd0\\xc4\\x7d\\xfc\\xc7\\x13\\xc4\\x55\\x38\\xe0\\x11\\xae\\x53\\x5c\\xec\\xab\\xcb\\x35\\x39\\xb8\\xc6\\xfb\\x47\\x57\\x4b\\xc5\\xc2\\xaa\\xe7\\x21\\x96\\x5f\\xf8\\x7d\\x14\\xc1\\x82\\xcc\\xfe\\xa8\\xf4\\x20\\xf8\\xb4\\xf3\\x58\\xc6\\x42\\xac\\x8e\\x3b\\xd1\\x87\\x09\\x66\\x24\\xbc\\x0e\\x2e\\xde\\xc9\\x7a\\x87\\x83\\xb0\\x02\\x14\\x8e\\x56\\x1e\\xd0\\x70\\x61\\x5c\\x19\\xe4\\x8a\\x33\\xda\\x34\\x2d\\xf1\\xa9\\x0c\\x76\\x7b\\x27\\x27\\xef\\x0f\\xbc\\xe5\\x3d\\xc1\\xc7\\x37\\x8a\\x81\\xcc\\x64\\x1b\\xd9\\x8a\\x24\\x6d\\x28\\x90\\x31\\x7a\\xad\\x92\\x65\\xb3\\xda\\x77\\xe3\\x64\\xb2\\xa7\\xc0\\xe5\\xf0\\xa4\\x8a\\x38\\xba\\xf6\\x4b\\x92\\x15\\x96\\x6c\\xf6\\x90\\x5e\\x0e\\xaa\\xf5\\x18\\x26\\x2c\\xe8\\x3e\\xba\\x09\\xf5\\x73\\x98\\xee\\x5e\\x02\\xe2\\x89\\x25\\x6b\\x22\\x33\\x17\\x79\\x03\\xc1\\xfc\\x3f\\x5f\\x8f\\x25\\x82\\x27\\x97\\x8b\\x70\\x52\\x82\\x91\\x4b\\x27\\xe9\\xfe\\x3c\\x5f\\xae\\xe7\\xbf\\x09\\x99\\xdd\\x7e\\x6d\\x3b\\x33\\x85\\x3b\\xe1\\xfe\\xf0\\x7e\\x80\\xa0\\xe7\\xc8\\xa0\\x7e\\x5f\\x2c\\x04\\x0f\\x9a\\x61\\x87\\xc8\\x2b\\x2b\\x35\\xf0\\xe2\\xf5\\x0c\\x15\\x60\\xfc\\xb8\\x15\\x04\\xbb\\x72\\x8b\\xcf\\xbe\\xdd\\x33\\xc3\\x0f\\x01\\x39\\x83\\xb3\\x68\\x82\\x1c\\xe7\\x78\\x97\\x3f\\xd5\\x39\\x2e\\x13\\x65\\x3e\\x4d\\xa6\\x2a\\xa1\\x95\\xb9\\xee\\xf3\\x36\\x28\\xd4\\xd9\\x0e\\xbf\\x69\\x49\\xee\\x8b\\x25\\xd0\\x61\\xdd\\x98\\xc8\\xf6\\x31\\x8d\\x9b\\x64\\x21\\x18\\x13\\xff\\xf9\\x4e\\x1a\\x1a\\x1a\\x8a\\x80\\xda\\xed\\x14\\xdc\\x99\\x8b\\xc9\\x7a\\xa8\\xb1\\x7e\\x7a\\x07\\x9a\\xbc\\x39\\x31\\x9e\\x2a\\x30\\x50\\xa4\\xf8\\xdb\\xec\\xe9\\x59\\x17\\x6f\\x7f\\x02\\xc5\\xf8\\x75\\xe0\\xbd\\xed\\x88\\x95\\x5d\\x2b\\x68\\x94\\xe8\\x2e\\xd1\\x2b\\x3f\\xcb\\xa4\\x2b\\x70\\x25\\x51\\xee\\x99\\x91\\x83\\x06\\xd9\\x9b\\x86\\xdd\\x70\\x49\\x56\\x86\\xd8\\xe9\\x9c\\xc1\\xda\\x9e\\x25\\x79\\x15\\x95\\x28\\x35\\x8c\\xfc\\xc7\\x86\\x04\\x45\\x82\\x38\\xf5\\xb8\\x31\\x25\\xa8\\xd3\\x64\\xbe\\xd5\\x9c\\x45\\x7d\\x43\\x19\\x11\\x69\\x8f\\xb1\\x47\\xfb\\x79\\xca\\xa1\\x4e\\x8c\\x04\\xbb\\x46\\x75\\x39\\x3a\\xdb\\xb4\\xaf\\xf0\\x33\\xd9\\xbb\\x2c\\xce\\x69\\xff\\x95\\x06\\xbc\\x6a\\x3c\\x32\\x51\\x86\\x38\\xbd\\x98\\xea\\x84\\x43\\x11\\x5c\\x51\\x80\\x8c\\xaa\\x96\\xe5\\x82\\xd5\\x51\\xe2\\x5d\\xb4\\x4e\\x6e\\x8b\\xe0\\x69\\x60\\x5d\\x93\\xad\\x68\\xe8\\xaf\\xc8\\x28\\x6c\\x82\\x23\\x89\\x3b\\xeb\\x9b\\x50\\x47\\x89\\x03\\xcb\\x1e\\x29\\xad\\xd2\\x45\\xfa\\x4f\\x08\\x65\\x52\\x6e\\xee\\x67\\x4e\\x09\\xe9\\xbd\\xf7\\xf6\\xc5\\x78\\x34\\x11\\xb6\\x46\\x3b\\x20\\x6f\\x1c\\xee\\x8b\\xcc\\x9c\\x70\\xce\\x88\\xbd\\x6c\\x8d\\x1d\\x2b\\xaa\\xfc\\x6c\\x8e\\x26\\x61\\x59\\x9a\\x4c\\x59\\x07\\x90\\x26\\xa9\\x33\\x11\\x64\\x38\\xf7\\xb0\\xfe\\xda\\x6f\\x2e\\x4a\\x7b\\x5c\\x53\\xac\\xe0\\x17\\x6b\\x2d\\xe7\\xa9\\x46\\x7e\\x2c\\xa4\\x24\\x47\\xa9\\xe5\\x83\\x85\\x54\\x6a\\xa9\\xb3\\x90\\x72\\xf4\\x53\\xe2\\x80\\x55\\x09\\x9d\\x5d\\xb4\\x46\\x7b\\x7e\\xbb\\x1c\\x6b\\x80\\xb2\\x0b\\x01\\x7b\\x11\\xcf\\x33\\xfe\\xad\\xe3\\x4f\\xfd\\xf3\\xe8\\x06\\xae\\x02\\x2d\\xef\\x80\\x89\\xc1\\x47\\x90\\x2f\\x49\\x88\\x4b\\xe1\\x3a\\x4a\\x7a\\xd9\\x14\\xc8\\x15\\x8d\\xd2\\xd8\\xe4\\x7a\\x7b\\x65\\xfd\\x91\\x9e\\xd7\\x3d\\x20\\x6c\\xf8\\x1c\\x2f\\xf4\\xc3\\x78\\xea\\x12\\x7c\\xf7\\x4b\\x92\\xa8\\x0a\\xfd\\x30\\x37\\xd9\\xb6\\x17\\x9a\\x22\\x7e\\x07\\xc3\\xb8\\xb0\\x82\\x44\\xaf\\x89\\x22\\x85\\x26\\x4d\\x79\\xc5\\xcd\\x7d\\x23\\x53\\x5b\\xb3\\xf0\\x6d\\xac\\xa6\\xcc\\xaa\\x31\\xb3\\x50\\xca\\x61\\xb5\\x4f\\x78\\x5f\\xe0\\x93\\x28\\x6c\\xdf\\x3d\\x42\\x79\\xf1\\x98\\x8d\\x5c\\x82\\xec\\xf0\\xba\\x3a\\x76\\xb4\\x8a\\x75\\xcc\\x12\\xa6\\x5e\\x03\\xfb\\xd5\\xdf\\xbf\\x89\\x79\\xfd\\x4b\\x92\\xc4\\x57\\xba\\xfc\\x71\\xdc\\xe0\\x7c\\x14\\x9a\\x85\\x9a\\x6c\\xe5\\x02\\xc7\\xd2\\x1f\\xb0\\xc9\\x04\\x02\\xa8\\x21\\xd0\\x2e\\x0c\\xff\\x74\\x38\\xa9\\xf0\\xa4\\x63\\xbb\\xd1\\x61\\xe8\\x64\\x06\\x18\\xf9\\xcc\\x8a\\xd7\\x24\\x7f\\xa5\\xee\\x66\\xbf\\x5d\\xa8\\xe3\\x57\\x57\\x06\\xdd\\x92\\xc2\\xb0\\x6a\\x8e\\x62\\x85\\x9c\\x86\\x34\\xc6\\x1f\\x1c\\x1e\\xc9\\x5d\\xf5\\x90\\x4a\\x43\\xbe\\x81\\xae\\x7d\\x54\\x06\\xd7\\x81\\x51\\xd8\\xf6\\xa1\\x9d\\xd3\\xbc\\x1a\\xc1\\x30\\x0d\\x12\\x17\\x1f\\x56\\x5d\\x56\\xb1\\xc3\\x1d\\xbd\\x5a\\x53\\x5e\\x17\\x93\\x17\\xe5\\x85\\x6c\\x97\\x86\\x8e\\x37\\xa8\\x58\\x91\\x6e\\xb9\\xf5\\x83\\x4b\\x9f\\xce\\xbd\\x6a\\xe1\\x73\\x38\\x9a\\xb8\\xdd\\x94\\xd8\\x60\\x0a\\x4c\\xf0\\xe1\\xfd\\xbd\\x7c\\x2a\\xaa\\xdd\\x2c\\xaf\\x2e\\xe6\\x9e\\x05\\x6a\\xb3\\x70\\x56\\xca\\xdd\\x62\\xba\\xff\\x68\\x17\\xba\\x8c\\x21\\xd2\\xdf\\xb4\\x3f\\xef\\xbd\\x96\\xee\\xda\\x61\\x04\\xb0\\x06\\xde\\xf7\\xcf\\x5a\\x7b\\x5f\\xc3\\x46\\x97\\xb8\\xfa\\x53\\xe4\\x82\\xf2\\x59\\x10\\x74\\x4c\\x12\\xca\\x30\\x6d\\xa5\\x32\\x60\\x13\\x93\\xd2\\x20\\x1f\\xaf\\x1a\\x65\\xd0\\xb6\\xf5\\xe1\\xdc\\x1f\\xb1\\xe2\\xa4\\x6c\\xab\\xcb\\xa1\\x06\\x99\\x78\\x64\\xc7\\x70\\x46\\x25\\x83\\x5a\\xfc\\xda\\x7b\\xc9\\xda\\xbd\\x51\\x88\\x54\\x3c\\x89\\xb9\\xfe\\xed\\x1c\\xe9\\x6d\\xd7\\x92\\xa6\\xd9\\x21\\x2f\\x1e\\x72\\xbb\\x89\\xd3\\xa1\\xd8\\x03\\x0f\\xb2\\x2d\\x6b\\xf1\\x8a\\x13\\x56\\x75\\xbb\\x76\\xdc\\xb4\\xb2\\x28\\x0e\\x71\\x6a\\x1b\\x95\\xb8\\xb9\\xb4\\x7f\\xee\\x99\\xae\\x7b\\x70\\x17\\xc0\\xc1\\x85\\x75\\x27\\xfd\\x61\\xc5\\xbd\\x9f\\xfe\\xbb\\xc1\\xef\\x2c\\x2f\\xef\\xab\\x1b\\xf2\\xe1\\xa5\\x6e\\x24\\xde\\x28\\xc3\\xd0\\xd7\\x96\\xb1\\xa1\\xa8\\x34\\xe4\\x73\\x96\\x27\\xd2\\x28\\xdb\\xa8\\x8c\\x3b\\x2c\\xe8\\xc4\\xad\\xf6\\x35\\x99\\x70\\x79\\x59\\xaa\\x1b\\x94\\x0d\\x22\\x5e\\x44\\x8d\\xf9\\x13\\x3e\\x2b\\x45\\x87\\x98\\x48\\x92\\x14\\x24\\xcc\\x16\\xe1\\x18\\x13\\xf2\\x13\\x50\\xd2\\x09\\xc9\\xfe\\x62\\x72\\xe3\\x0f\\xf2\\xd0\\x3e\\xd9\\x2a\\xd8\\x67\\x40\\xd7\\x0b\\x05\\x9a\\xe4\\x6e\\x2b\\x7b\\xc6\\xe1\\x33\\xb5\\x33\\xc3\\xbf\\x33\\x16\\xc6\\xb1\\x5c\\x96\\x74\\x1c\\x39\\xf8\\x85\\xbb\\xd1\\x3a\\x11\\x49\\xff\\xe4\\xa2\\x43\\x80\\x43\\x2f\\xfe\\x94\\x25\\xe6\\x27\\x0a\\x8d\\xd8\\x00\\xd3\\x32\\x0d\\x9e\\xb8\\xb3\\x0b\\xaa\\x1d\\xcb\\x5e\\x62\\xf2\\x15\\x2c\\xb8\\x8b\\x16\\x92\\x68\\xec\\x8a\\xba\\x20\\xc5\\x20\\x80\\xce\\x36\\xed\\x71\\x40\\xcd\\x4f\\x5b\\x24\\x5e\\xf8\\xf8\\x84\\x97\\xec\\x6d\\xc4\\xbd\\x80\\x51\\xd9\\x21\\x7f\\x3d\\x1e\\x2a\\xb7\\xa7\\x9a\\x98\\xe2\\x44\\x04\\x78\\x22\\x01\\xfa\\x7d\\x0e\\x41\\x9b\\x3f\\xcd\\x66\\x77\\x51\\x79\\xb6\\x0d\\xac\\x59\\x57\\x02\\x2b\\x8c\\xcc\\x18\\x06\\x9d\\x01\\x55\\xb3\\x43\\x0b\\x0f\\x0d\\x3f\\xaa\\x55\\xdf\\x14\\x01\\xf2\\x47\\x31\\x57\\xdf\\x0a\\x6d\\xbe\\x13\\x2e\\x2c\\x03\\x07\\x7d\\x1a\\x0b\\x4c\\x66\\x6d\\x97\\xdb\\xa5\\x87\\xde\\xd7\\xcb\\x7f\\xa8\\x52\\x05\\x88\\xbe\\xb0\\x80\\x0d\\x30\\xa0\\x44\\x60\\x83\\x9b\\x20\\x2d\\x54\\xd6\\xe6\\xfb\\xe5\\xf0\\x81\\x45\\x7c\\x69\\x6d\\x84\\x1e\\x22\\x60\\xf1\\x68\\x38\\x78\\x61\\x83\\xb8\\x57\\xf5\\x28\\x66\\x8a\\x46\\x4d\\x1c\\xd7\\x68\\xa0\\x89\\x56\\xf8\\x86\\xe3\\x9d\\xb5\\x3a\\x34\\x67\\xeb\\xf3\\xd6\\xef\\xe6\\xea\\x5f\\x53\\xe6\\xa7\\xac\\x41\\x64\\xdb\\x5f\\x54\\xc2\\x34\\xa4\\x08\\x8b\\x5c\\xe0\\xd3\\xe0\\xf5\\x61\\xae\\x07\\x61\\x9d\\x65\\x77\\x33\\xc1\\x83\\x64\\xca\\xfd\\x8b\\x07\\xc2\\xf0\\x33\\xe0\\x34\\xa2\\x48\\x76\\xe0\\xe0\\x97\\x3b\\x08\\x6b\\xa8\\x5c\\xb3\\xf2\\x73\\x65\\x70\\xee\\x9a\\x90\\x93\\x7d\\x4d\\x89\\x4c\\x55\\x96\\xa2\\xe8\\x9b\\x7f\\x3f\\xc5\\xbe\\xca\\xf7\\xb8\\xa7\\x9f\\x72\\x9d\\x85\\x1f\\x43\\xe7\\x60\\xb5\\x93\\x5f\\x00\\xf0\\x0a\\x2a\\x6e\\xa1\\xae\\x01\\xd6\\x00\\x99\\x22\\x0d\\xae\\xeb\\x77\\x12\\x16\\x3b\\x7a\\x66\\xa8\\x57\\x5f\\xd3\\x54\\xea\\x17\\x26\\xeb\\x41\\x26\\x52\\x8d\\xd7\\xcb\\x0d\\xdf\\xfd\\xea\\x52\\xb2\\xcb\\x64\\xfd\\xe6\\x5f\\x09\\x91\\x06\\xea\\x92\\xbf\\x67\\x4f\\x0e\\x83\\x15\\xd7\\x73\\x5c\\x78\\xdf\\xae\\x43\\x11\\xcf\\x5d\\x70\\x97\\xcb\\xcd\\x7f\\xe5\\xaf\\x1e\\xb0\\x9c\\xa3\\x55\\x7d\\x49\\x7c\\x6a\\x86\\x44\\xf6\\x93\\x7d\\x00\\xbd\\x1b\\x2c\\x92\\x5e\\x8a\\x87\\x82\\x59\\xbe\\x5f\\xc9\\x7d\\x0f\\xd6\\x8a\\x23\\x41\\x93\\x02\\xfc\\xbc\\xe7\\xee\\xd7\\xf8\\x59\\x1b\\x62\\xfd\\x6d\\x58\\xc8\\x85\\x68\\xd5\\x40\\xa6\\xf3\\x9f\\xb6\\x2e\\x16\\x07\\x2d\\xbd\\x64\\x18\\xd0\\x24\\x92\\x7a\\x54\\xed\\xdd\\xdb\\x6f\\xb8\\x7b\\x2f\\xf5\\x4b\\x62\\x35\\x13\\xe0\\x28\\x9f\\x85\\xc7\\x3e\\x3f\\xb4\\x90\\xca\\x26\\xc2\\x2e\\x89\\x66\\xab\\xa4\\xca\\xa7\\xd3\\x94\\xd7\\xd4\\xc2\\x6e\\x79\\x49\\x67\\xf2\\x81\\x05\\xa9\\x13\\xcd\\x84\\x69\\xb7\\x19\\x34\\x21\\x77\\xc7\\xe7\\xa3\\x1f\\x95\\x22\\x64\\x6a\\x71\\xf1\\x05\\x59\\x73\\x2e\\x2b\\x82\\x90\\xd1\\x02\\xf1\\x2f\\x00\\x39\\x48\\x53\\x4d\\x8d\\x5a\\x9a\\xba\\x95\\x94\\x25\\x07\\x54\\xf6\\x0f\\x69\\x53\\xa1\\x49\\x40\\x8e\\xea\\x9f\\xdf\\xa1\\xe8\\xb0\\xe6\\x0a\\xee\\xf2\\x79\\xf4\\xc0\\x61\\x36\\xdd\\x74\\x22\\xc9\\x67\\xfb\\xb1\\xfc\\xc6\\x27\\xff\\xc7\\xde\\xe7\\xd2\\xc1\\x91\\xc0\\x8b\\x54\\xfc\\x5f\\xac\\x94\\x1c\\x42\\x7a\\x69\\x58\\x42\\xa5\\xac\\xf9\\x76\\x42\\x45\\xf7\\x40\\x19\\x39\\xd8\\x3b\\x31\\x06\\xc5\\x0b\\x5c\\x28\\x42\\x9b\\x59\\x5b\\xfb\\xf7\\x2b\\xf6\\xd8\\x37\\xff\\x50\\x21\\x87\\xe2\\x01\\xd5\\xb3\\x30\\x10\\xb2\\xde\\xf9\\x9a\\x80\\x8d\\x10\\xcf\\xd4\\x8e\\x91\\x62\\xf9\\xf3\\x39\\xc1\\xc7\\x40\\xa2\\x15\\xb7\\x95\\x00\\x29\\xb1\\xc5\\x52\\x51\\x98\\xc0\\x9b\\x59\\xf2\\xec\\x58\\x30\\x0f\\x8c\\x74\\x72\\x4a\\xb1\\xd0\\xc1\\x7e\\x2e\\xc3\\x66\\x7d\\x43\\x05\\x03\\x30\\x41\\xce\\x6a\\x3d\\x81\\xf7\\x6b\\xc3\\x0b\\x8c\\x30\\xf6\\xb7\\xc2\\x40\\xc4\\x63\\xac\\x1c\\xba\\x5a\\xd9\\xf9\\x96\\x25\\x08\\x3d\\x84\\x94\\x33\\x40\\xa8\\x90\\x36\\xf2\\xcf\\xcc\\x64\\x6e\\x1a\\x83\\x33\\x66\\x32\\xf1\\x4d\\x11\\x43\\x4e\\x5d\\xf7\\x17\\x23\\x58\\x35\\xd2\\xa0\\x4e\\x77\\x73\\x83\\xd4\\xa9\\x75\\xd2\\xc4\\xcf\\x93\\x69\\xde\\xcf\\x75\\xca\\x37\\xbc\\xaf\\x06\\xa7\\x85\\xc7\\x34\\x5d\\x9a\\xc4\\x98\\x32\\xc4\\xda\\x65\\xc5\\xdc\\x5c\\x7f\\xfa\\x0c\\x2a\\xc8\\xe0\\xe5\\x4a\\x7d\\xfe\\x25\\xe4\\xad\\xb1\\x0b\\xb8\\xda\\x07\\x71\\x22\\x2e\\x6a\\x0a\\x22\\xa6\\xc3\\x84\\xcb\\x9c\\xfa\\xf2\\x2b\\x0c\\x0c\\xc3\\x41\\x98\\x19\\xa8\\x9d\\xa3\\xd3\\xe3\\xc6\\xa4\\x72\\x45\\x6a\\x2c\\x52\\xce\\x3c\\x47\\x5a\\xfd\\x85\\x6e\\xcb\\x36\\x2c\\x66\\x84\\x3a\\x2a\\xed\\xf9\\x52\\x1e\\x39\\x75\\x6d\\x56\\x0f\\x93\\x1d\\xa2\\x9c\\xab\\x2e\\x52\\x07\\x0e\\x33\\x67\\x0f\\x91\\x20\\x44\\x4b\\xb8\\xca\\x48\\x03\\xbd\\xce\\xcc\\x7c\\x91\\x9e\\x4d\\x64\\xa0\\xf1\\x37\\x72\\x13\\x59\\xf5\\x88\\x96\\xa0\\x42\\xeb\\x3c\\xfb\\xf0\\x22\\xba\\xbf\\xf2\\x72\\x46\\x65\\x40\\xe0\\xe4\\x1e\\x17\\xbb\\xa7\\x7c\\xb7\\x4e\\x3e\\x93\\xbb\\x14\\x1d\\x8b\\x8e\\x29\\xa7\\xbe\\x8f\\x65\\x20\\xe9\\x54\\xae\\x8f\\x26\\x4f\\x84\\x93\\x1f\\xa1\\x30\\x1f\\xae\\x8a\\xe6\\xc4\\x33\\x85\\x9c\\xcc\\xef\\xda\\x7c\\xcb\\x33\\xdd\\x27\\x4a\\xf3\\xa0\\x4a\\x25\\x5f\\xcd\\x7a\\xd0\\x47\\x48\\x15\\x19\\x4f\\x88\\xe1\\xed\\x10\\x18\\x6f\\xb8\\x6e\\xbc\\x7a\\x86\\xf1\\x0e\\x45\\xac\\xa8\\xe9\\xb8\\x6b\\x9d\\xf4\\x17\\x7e\\x32\\x5c\\x42\\xc1\\xc8\\x8a\\x0e\\xb9\\x39\\x69\\x23\\x1c\\xdc\\xce\\xa4\\x45\\x46\\x95\\x0e\\xd7\\x29\\xcb\\x81\\xb1\\xb1\\x47\\xcd\\xa9\\xae\\xc7\\xae\\x40\\xa0\\xba\\xb4\\xd9\\xfb\\x60\\xc2\\xa0\\xab\\xd5\\x78\\xa9\\xfa\\x1f\\x2b\\x8e\\xdb\\x73\\x4f\\x91\\x73\\x88\\x77\\x9c\\x58\\x5c\\x8f\\xba\\x28\\x66\\xf7\\x5e\\xc2\\x53\\x7d\\x0a\\x43\\xd4\\xde\\xb1\\x7a\\x93\\x8a\\x57\\x68\\x4a\\xac\\xb5\\xba\\xcc\\x56\\xb8\\x5e\\xb1\\x0d\\x56\\xa3\\x60\\x58\\x32\\x3e\\xd0\\xd6\\xeb\\x3b\\xa6\\x57\\xa2\\x7e\\x9a\\x62\\xbe\\xe5\\x54\\xa0\\x80\\x1c\\xf2\\x9a\\x54\\xae\\xc8\\xb3\\x04\\xa6\\x5b\\xea\\x3e\\xa9\\xc8\\xee\\x8a\\x82\\x0a\\xb7\\x51\\x42\\xb4\\x29\\x56\\x35\\x64\\x6d\\xac\\x23\\x03\\x89\\xb1\\x0f\\xad\\x07\\xca\\x06\\x9c\\x28\\x55\\x81\\x9f\\x8c\\x1a\\xb2\\xc3\\xc4\\xc6\\x15\\x29\\xe4\\x85\\x4d\\x42\\xa3\\x0f\\x0a\\x85\\x61\\xfb\\x9d\\xd8\\x86\\x3b\\x55\\x36\\x05\\x87\\x8d\\x71\\x2f\\x61\\x16\\x41\\xfb\\x37\\x0e\\x69\\x6a\\x62\\xcd\\x65\\x37\\x73\\x09\\x80\\xea\\xe5\\xb9\\x0c\\xd3\\x76\\x63\\x24\\x42\\x7b\\x74\\xea\\x09\\x2d\\x95\\x23\\x4e\\x5a\\x83\\x98\\x36\\x67\\xeb\\xf3\\x75\\x67\\x46\\x69\\x48\\x94\\x04\\x5f\\xde\\x7d\\x6b\\x05\\x49\\xd9\\x95\\x13\\xe0\\xd9\\x03\\xbf\\x1d\\x74\\xc3\\x44\\x66\\xd6\\xd3\\x68\\x17\\x1d\\x7b\\x58\\x22\\x9b\\x5a\\x3a\\x1e\\x23\\x05\\x37\\x6e\\x6f\\xeb\\x05\\xd2\\xd6\\xc2\\x58\\x2e\\x30\\xe5\\x47\\x6b\\xb4\\x7f\\x92\\x1e\\xd6\\x6c\\xcd\\x60\\x22\\xba\\x92\\x3a\\x3c\\x98\\xf4\\x77\\xaa\\x61\\xee\\x15\\x6a\\xb9\\x48\\x93\\x0f\\x52\\x1d\\x60\\x1b\\xfc\\xe7\\x04\\x0b\\xa4\\x4c\\x63\\xbf\\x65\\x61\\x6f\\x13\\x0a\\x04\\x5d\\xcb\\x57\\x57\\x2e\\x07\\x31\\xe0\\x3c\\xc8\\x86\\xf4\\x22\\x15\\x72\\xd8\\xea\\x85\\x77\\xd0\\xc1\\xb0\\xa4\\x2e\\x24\\xb0\\xbf\\xa6\\x4f\\x59\\xcb\\x93\\x1d\\xd2\\x1c\\x7c\\xad\\x04\\x63\\xfb\\x3e\\xef\\x07\\xe3\\xa3\\x4c\\x52\\x56\\x40\\x2b\\x88\\x8a\\xb8\\xae\\xcf\\xce\\xe3\\x71\\x7d\\x48\\x01\\x36\\x24\\x78\\x19\\x05\\x14\\x50\\xf5\\x98\\x38\\x4a\\x57\\xd6\\xa0\\xa6\\x52\\x9e\\xdf\\x54\\x30\\x3d\\xc6\\x61\\x32\\xfb\\x25\\x7b\\x57\\xab\\x25\\x45\\xb9\\x8f\\x03\\x89\\xb8\\xac\\x7b\\x42\\x29\\x94\\x5b\\x8f\\x24\\x13\\x11\\x0a\\xd6\\x1c\\x88\\x0c\\x6b\\x0a\\x31\\x87\\x19\\x5d\\xe8\\x43\\x60\\xdd\\x2a\\x4c\\xfe\\x24\\x68\\xf6\\xe9\\x82\\x71\\x8e\\x7d\\x84\\xef\\x49\\xbf\\x3c\\x7b\\xfb\\x4d\\x94\\x25\\xeb\\x76\\x30\\xb1\\xd0\\xbf\\x77\\xb0\\xcb\\xd4\\x56\\x28\\xdc\\x54\\xc2\\xda\\xd2\\xac\\xbb\\x24\\xcb\\x2a\\xd5\\x1d\\xa7\\x18\\x87\\xca\\x76\\xbf\\x07\\xf6\\x57\\x1b\\xc5\\x89\\x0c\\xfa\\x5a\\xaf\\xcc\\xc9\\x80\\xa3\\x67\\xe7\\x27\\x24\\x78\\xb2\\x9b\\x28\\x87\\xd5\\xb8\\x24\\xe1\\x42\\x0b\\xaa\\x57\\x90\\x12\\xc3\\x43\\x49\\x6d\\x16\\xa9\\x38\\xf3\\xf1\\xf5\\x14\\xc9\\x8c\\xe8\\xa6\\x91\\xc5\\x1b\\x93\\xaa\\x00\\x26\\xc3\\x84\\x08\\x5e\\x27\\xf3\\x9b\\xa8\\xc6\\xb5\\xf3\\x96\\xf1\\xab\\xd2\\x4d\\x74\\xc3\\x93\\xc2\\xb7\\xe2\\xec\\xad\\x99\\x38\\x81\\x79\\x99\\xa4\\xe6\\xb9\\x36\\xfb\\x58\\x47\\x39\\xf9\\xb8\\xdf\\x05\\x5a\\xdc\\x22\\xad\\x3b\\x2f\\xd5\\x0c\\x35\\x76\\x4a\\x47\\x6e\\x9e\\xc2\\x4c\\x4a\\xd8\\x52\\x85\\x9e\\x1f\\x49\\xc6\\x16\\x39\\x1c\\x3c\\xe8\\x2e\\xff\\xc9\\x10\\xf7\\x73\\xc2\\x61\\x06\\x4e\\xca\\x22\\x6d\\x7f\\xe4\\x88\\x72\\x50\\x83\\xdd\\x72\\x59\\x02\\xa0\\x42\\x5a\\x52\\xda\\x33\\x3f\\xd7\\x31\\xb1\\x46\\x49\\x19\\x17\\x13\\x4b\\x20\\x84\\xfd\\x25\\x0d\\x70\\xf6\\xdb\\xfa\\xb3\\xc7\\x82\\xf2\\x66\\xa5\\xf5\\x18\\xf2\\x7f\\x85\\x33\\x25\\x80\\x54\\x2a\\xd1\\x78\\xac\\x5b\\x7e\\x07\\xde\\x93\\x64\\xf0\\x02\\x1c\\xae\\x1b\\x74\\x27\\x3a\\xde\\x71\\x90\\xc3\\x6b\\x74\\x0f\\x8e\\x89\\x65\\xbf\\x46\\x00\\x7d\\xfe\\x2d\\xad\\x53\\x1c\\x91\\xd3\\xba\\x1f\\x1b\\xde\\xae\\x47\\x65\\x54\\x13\\x12\\x16\\xca\\xe3\\xbd\\x4f\\x39\\xf0\\x5a\\xa0\\xd9\\x50\\x3f\\x3d\\xc5\\x0e\\x37\\xdb\\x8b\\x0a\\x29\\x47\\x3b\\x0d\\xa9\\x04\\x99\\x16\\x12\\x8a\\x89\\x25\\x6d\\x05\\x2b\\xe2\\xc4\\x5b\\x13\\x8d\\x16\\x5f\\x49\\x21\\x99\\x76\\x40\\x34\\x56\\xd1\\xa6\\x54\\x42\\xaf\\x33\\xe8\\x44\\x07\\xc7\\x6a\\xdd\\x70\\xb8\\xbc\\xca\\xfc\\x23\\xa3\\x85\\xd5\\xb3\\xc7\\x51\\x3a\\xc8\\x33\\x85\\x4a\\x90\\x33\\xfa\\xb5\\x70\\x8b\\x8a\\xa9\\x6f\\x6f\\x32\\xd5\\x91\\x5f\\x46\\x7a\\x72\\xf6\\x81\\x4b\\x02\\x67\\x9a\\x9e\\x63\\x79\\xd0\\x97\\x49\\xe0\\xeb\\xc0\\x0a\\x27\\x09\\x51\\xe7\\x19\\x60\\x82\\xdc\\xb1\\x12\\xcf\\x50\\x66\\x39\\xff\\x5c\\x68\\xad\\x1f\\x4a\\xb7\\x18\\x49\\x9f\\xce\\xcd\\x4e\\x61\\x97\\x1b\\x2a\\x34\\xf8\\xb3\\xff\\x67\\xbc\\xb2\\x3d\\xd9\\x5e\\xac\\xf0\\xc3\\x43\\xa5\\xc2\\x66\\xdb\\xdb\\xcc\\x4d\\x14\\xed\\xa1\\x8e\\x55\\xc0\\x12\\xbf\\xf8\\xbf\\xdb\\x6b\\x5f\\xbb\\xe1\\xf0\\x02\\xc6\\xe9\\xf7\\x0d\\x4a\\xe7\\xfb\\x3b\\x9c\\xbf\\x9e\\x3a\\x88\\x70\\x77\\x2c\\xad\\xc4\\xc9\\x5f\\xa5\\x68\\x1d\\xf1\\x63\\xc0\\x22\\x15\\xce\\x98\\xb7\\x74\\x5f\\x18\\x62\\xfa\\x37\\x85\\x46\\x8e\\xf5\\xf8\\xae\\xab\\x76\\xd8\\x4f\\x75\\x02\\x40\\x9c\\x7c\\x5f\\xc0\\xaa\\x56\\xbc\\x12\\x96\\xe9\\x2d\\x93\\xbf\\x6c\\x28\\xeb\\xb0\\xc7\\xa7\\x4e\\x65\\xd8\\xbf\\x8c\\xee\\x78\\xc2\\x4f\\xea\\xc6\\xfe\\x23\\xa6\\x36\\x0a\\x4f\\xcc\\x7b\\x2c\\x7d\\x10\\x9d\\x69\\xa6\\xe7\\xd9\\x6c\\x49\\x22\\x81\\xd2\\x6c\\x8e\\xdc\\xa6\\xe2\\x41\\x4b\\xf6\\x17\\xc4\\x76\\x7a\\xe4\\x2d\\xd4\\x78\\x0c\\x93\\x75\\xdf\\x2f\\xe6\\xae\\xd4\\xfc\\x9d\\x5f\\x33\\x73\\xb4\\x1c\\x26\\xd9\\x61\\x5c\\x72\\xde\\x7f\\xa6\\x87\\x35\\xe8\\x17\\xc3\\xee\\x26\\x2e\\xc9\\x95\\x31\\x1b\\xc3\\x8c\\x19\\xab\\x57\\x6a\\x03\\x4f\\x85\\x8b\\x2f\\x12\\xd8\\x71\\x0d\\x15\\x30\\x15\\x34\\xcb\\x1b\\xb0\\x95\\xc9\\xe2\\x65\\xf9\\xc5\\x26\\x7b\\xbd\\xc3\\x6f\\x17\\x72\\x2b\\x87\\x08\\xb7\\xeb\\xdb\\xc1\\xd6\\x86\\x79\\x50\\x8a\\xa5\\x5c\\xc4\\xa9\\x7e\\x7c\\x4a\\xb6\\xd3\\xe9\\x69\\x18\\xdb\\x72\\x78\\xf9\\x6b\\x0c\\x19\\x2e\\x53\\x16\\x3b\\xdf\\x3b\\x7b\\x3c\\x3c\\x94\\x7a\\x85\\x69\\xcc\\xfe\\xfa\\x2b\\xa9\\x25\\x54\\xbe\\x8c\\x9c\\x99\\xa6\\x7c\\x08\\x83\\xe1\\x12\\x52\\x49\\x33\\x14\\xec\\x7d\\xeb\\x61\\x95\\xc5\\x78\\x94\\xab\\x96\\x0b\\x69\\xa8\\x3c\\x15\\x85\\x3c\\xbb\\x09\\xb7\\x63\\xf4\\x50\\x5a\\xeb\\xec\\x1d\\x2e\\x1a\\xaa\\x88\\xa9\\x1a\\xe8\\x9b\\x46\\x89\\xd3\\xd0\\x45\\x02\\x8e\\xbd\\xfd\\x1f\\x40\\xa7\\x2f\\x17\\x4d\\x11\\x32\\x9c\\x35\\x33\\x0b\\x6b\\xe3\\xc9\\xa5\\xeb\\x88\\x1b\\xa3\\x16\\xd8\\x40\\x29\\x5e\\x66\\x6d\\x81\\x01\\x6c\\xc6\\x66\\x2e\\x97\\x59\\xf3\\x7b\\x68\\xba\\xb8\\x63\\xde\\x88\\x44\\x56\\x34\\x4f\\x17\\x97\\xbc\\x0f\\x20\\x57\\x31\\xcf\\x03\\xf3\\x0c\\x37\\x40\\x39\\x1b\\x8d\\x1f\\xd9\\x8e\\x65\\xec\\xbe\\xf4\\xed\\x1e\\x8a\\xf8\\xca\\x75\\x5a\\x95\\xea\\xe2\\x14\\xe5\\x9b\\x06\\x99\\x7a\\x76\\xe7\\x8b\\x7a\\xb9\\x02\\xb1\\x54\\x65\\x5e\\xcb\\xd5\\xda\\xbb\\x50\\xd5\\xe0\\x76\\xfe\\xc0\\xef\\x2f\\xfe\\x3c\\x1b\\x22\\x05\\x91\\x7a\\xd0\\xb2\\xef\\xe4\\xe5\\x39\\x21\\xaf\\x35\\xc6\\xc9\\x3f\\xe7\\xa1\\xde\\x31\\x7e\\xd1\\x48\\x9e\\x90\\xd1\\x5a\\x38\\x59\\xec\\x11\\x91\\x04\\x33\\x3a\\x82\\x2d\\x9d\\xfb\\x61\\xb9\\xe1\\x2c\\xd8\\xbe\\x5e\\xae\\xa2\\x90\\xdd\\x0a\\x60\\x01\\x91\\x45\\x1b\\xc4\\x76\\x9f\\x21\\x3f\\x9a\\xbc\\x23\\x2e\\xe2\\xaa\\x85\\xb4\\xfa\\x69\\xf7\\xc3\\x51\\x44\\xa4\\xe7\\x33\\x0e\\xfe\\x2d\\x14\\x53\\x55\\x58\\x62\\x7c\\xc3\\x4a\\x1e\\x08\\x3c\\x6e\\x77\\xb1\\x5a\\x47\\x70\\xca\\x06\\x43\\x88\\x71\\x59\\x1f\\x8c\\x5c\\xfc\\x79\\xa5\\xaf\\x05\\xcf\\xf7\\x6f\\x72\\x3a\\xba\\xe1\\x61\\xec\\xfa\\x72\\x20\\x03\\xe4\\x55\\x85\\xaf\\xea\\xe4\\x80\\x4f\\xf8\\x51\\x70\\x97\\x1b\\x95\\x05\\x26\\xf7\\xc7\\x25\\xff\\xe4\\xe8\\x65\\x45\\xd4\\x04\\x45\\x06\\x95\\x3f\\x7e\\x3a\\x33\\x3a\\xed\\x48\\x97\\x78\\x71\\xa4\\x8f\\x69\\x46\\x87\\xd1\\x63\\xef\\xc1\\xb3\\x64\\x1d\\x10\\x26\\xfc\\x5f\\xfb\\x39\\xd2\\x99\\x00\\x6e\\x39\\x3b\\x77\\xec\\x02\\x3e\\xa6\\x47\\x05\\xac\\xcd\\xaa\\x8b\\xf8\\x1d\\xaa\\x9d\\xc8\\xf8\\xcf\\x20\\x4d\\x55\\xd0\\xb8\\x1e\\xbd\\xa7\\xb2\\xda\\x21\\xb7\\x43\\xa2\\xb0\\x48\\x6f\\xa6\\xdf\\x86\\x9b\\x6b\\xa7\\xb7\\x6a\\x87\\x1d\\x7e\\x7c\\xf4\\x20\\x74\\x80\\x57\\x01\\x23\\x59\\x77\\x9e\\x5f\\x72\\x77\\x23\\xb2\\xed\\xd9\\x4f\\x90\\x07\\x20\\xa2\\xb8\\x6a\\x66\\xa0\\xb6\\x3a\\xc2\\x4a\\x88\\xf4\\x27\\x87\\xbd\\x1a\\x9a\\xea\\xef\\x6b\\x6c\\x29\\x33\\x62\\x7d\\x4b\\x19\\x4b\\x97\\x02\\x3f\\x27\\x22\\x6c\\xd5\\x50\\x26\\xd1\\x9a\\x88\\x3d\\x5e\\x88\\x56\\xf0\\x52\\xb0\\xa8\\x23\\xfa\\x2a\\xf3\\x85\\x21\\x6e\\x85\\x38\\x65\\x4f\\x28\\x71\\x33\\x46\\xfd\\xd0\\x1d\\xb2\\x0c\\xde\\xd5\\x22\\x37\\xd1\\xcc\\xbf\\x5b\\xdf\\x81\\x72\\xf8\\x23\\x4b\\xa5\\x0b\\x42\\x83\\x93\\x23\\xf8\\x93\\xa9\\x85\\xd5\\x55\\xff\\x26\\x48\\x79\\x57\\x28\\xac\\x6f\\xb1\\xaf\\x05\\xe7\\xf1\\xf5\\x0e\\x01\\xf3\\x92\\x73\\x13\\xc2\\xf6\\x67\\x8f\\x1d\\x15\\x61\\x60\\x93\\xe0\\xc8\\xd0\\x37\\xac\\xbe\\x80\\xa3\\x90\\xd7\\x1c\\xb8\\x7b\\x6d\\xc4\\x78\\xf9\\xc6\\xaf\\x76\\x54\\xfe\\x24\\x34\\xbe\\x81\\x22\\xf3\\xd3\\x3d\\x4d\\x5d\\x24\\x97\\xde\\x6e\\x22\\x71\\xbb\\x68\\x16\\xf7\\x25\\x3b\\xb6\\x47\\xb1\\xf7\\xfe\\x89\\x89\\x5b\\x68\\x04\\x53\\x1e\\x0c\\x54\\xe0\\x75\\xa2\\x68\\x25\\xc5\\x4d\\x28\\xca\\x93\\x28\\x7d\\x3d\\x03\\xc2\\x85\\xb1\\x46\\xae\\x10\\xa8\\xd7\\x62\\x24\\xd2\\x48\\x47\\xa5\\xd3\\xa7\\x6f\\x1a\\x06\\x74\\x3c\\x1a\\x69\\x5c\\xf5\\xe6\\x29\\x89\\x86\\x33\\x76\\x81\\x25\\x53\\x25\\x6f\\x09\\x71\\x17\\x1d\\x0b\\x2c\\xae\\xa0\\x4d\\x39\\xe5\\x42\\xd9\\x49\\x45\\xd4\\xb2\\xa6\\x57\\x44\\x0e\\x2d\\xd4\\xf6\\x99\\xa8\\x51\\xe3\\x0b\\x44\\x89\\x45\\x7f\\xf1\\x95\\xbe\\x5a\\x76\\x7b\\xcc\\xb6\\x77\\x66\\x98\\x1c\\x89\\x05\\x8e\\xec\\x51\\xe4\\x58\\x28\\x1a\\xf0\\xd4\\x19\\x87\\x7f\\x8a\\x1c\\xf7\\x26\\xdd\\xc4\\x09\\x39\\x3a\\xc6\\xae\\xdc\\x6d\\x2e\\xa1\\x01\\x7c\\x45\\x4e\\x18\\x36\\xb1\\x73\\x64\\x8e\\xce\\x0f\\xce\\x62\\xad\\x5a\\xf6\\x98\\x01\\x76\\x63\\x24\\x6a\\x9a\\x96\\xf1\\x78\\x4e\\xa1\\xc9\\x96\\x3f\\xa6\\x4b\\xef\\x01\\x15\\xbd\\x7b\\x43\\x00\\x57\\x8d\\x26\\x71\\xd5\\xa2\\x90\\x4b\\x2b\\x16\\x51\\xaf\\xc7\\x03\\x4c\\x8a\\x07\\xb9\\xef\\xf4\\xca\\x44\\x4b\\x44\\x06\\x30\\x9f\\x4f\\x82\\x31\\xfc\\x27\\xc0\\x30\\xb2\\x91\\x45\\xdf\\xf6\\x28\\x52\\x14\\x3a\\xe2\\x9a\\x67\\x6c\\x7e\\xae\\x04\\x99\\x01\\x84\\x1d\\xed\\xf2\\xc9\\x42\\x9c\\x45\\xa4\\x22\\x0a\\xcc\\x19\\xb7\\x3e\\x9b\\x14\\x1c\\xa8\\x7c\\xdb\\xc7\\xdf\\x1a\\x7f\\x26\\x4a\\x0f\\x6d\\xd4\\x6b\\x90\\x13\\xa1\\xbe\\x12\\x92\\x6d\\xf3\\xbd\\xe9\\xf1\\x49\\x88\\xd9\\xfc\\x6d\\xc8\\xf9\\xea\\x10\\x4e\\x4d\\x86\\x81\\xe6\\xf1\\x7d\\x5f\\xbc\\x28\\x50\\x1a\\xaf\\x29\\x72\\xc0\\xb4\\x91\\x37\\xde\\x5d\\x42\\xec\\xeb\\xdf\\x00\\x67\\xcc\\x35\\x44\\x9d\\x15\\x60\\x82\\x66\\x34\\x3b\\x9d\\x16\\x1e\\x68\\x55\\x43\\x18\\x3a\\x0e\\xdd\\x57\\xa5\\xbd\\xb4\\x46\\xf8\\x61\\xf3\\xb0\\xe1\\x78\\x58\\x00\\x17\\xdb\\x9e\\x08\\x74\\xbd\\xe9\\x03\\xb4\\x59\\xe3\\x5a\\x39\\x51\\x1b\\xed\\xd8\\x14\\x48\\x53\\x8b\\x25\\x2b\\x66\\xc7\\xc4\\xce\\xeb\\x30\\xd0\\xd8\\x55\\x75\\x9a\\x4c\\xa9\\xc9\\x18\\x19\\x30\\x4f\\x26\\x0d\\xc9\\x11\\x8c\\xe2\\x21\\x88\\x90\\xb7\\xe9\\x6c\\x5f\\xc2\\xb7\\x80\\x1b\\xb8\\x40\\x1e\\x16\\x1b\\xbf\\x38\\xfd\\xfc\\x9a\\xec\\x8b\\xf4\\x16\\xcc\\xa4\\x23\\xeb\\xc5\\xa9\\x3d\\x38\\x72\\x67\\x71\\xf5\\xac\\x51\\xc0\\xfa\\x02\\x13\\x15\\x0d\\x5d\\x4d\\xe1\\xbf\\x3b\\xe3\\x6a\\xbc\\xba\\xdc\\x91\\x98\\x7c\\xd5\\xc7\\xfd\\x80\\xfe\\x13\\x76\\x26\\xaf\\x67\\x59\\xec\\x44\\x90\\xc6\\xbf\\xbf\\xff\\x81\\x32\\x9b\\xab\\xb1\\x88\\x9a\\x6f\\x04\\x36\\xf7\\x54\\x76\\x52\\x5d\\x5e\\x05\\x27\\x46\\x29\\x0b\\x66\\xca\\x09\\xc0\\xc9\\x8c\\x6a\\xce\\x7f\\xb7\\x24\\x6c\\x5c\\xa2\\x31\\x38\\x50\\x5d\\x32\\x61\\xb2\\x6a\\xaa\\x25\\x11\\x57\\x19\\xe1\\x4c\\x4a\\x6e\\x83\\x2e\\x6c\\xe4\\x9c\\x5a\\xaa\\xba\\x1f\\xba\\x5c\\x13\\x75\\xa7\\x5c\\x1c\\xe9\\x68\\x55\\xac\\xba\\xa9\\xc5\\x81\\x89\\xe3\\x12\\x05\\xd5\\xa0\\x3e\\x61\\x65\\x73\\x7b\\x21\\xa4\\x19\\x3c\\xb5\\x24\\x96\\xb4\\xdf\\x9b\\xf0\\x61\\x02\\x65\\x63\\x2c\\x0b\\x8c\\x19\\x8e\\x08\\x8d\\x8f\\xfc\\x52\\x4c\\x8c\\x79\\x29\\x30\\x4a\\xbf\\x1f\\x33\\x26\\x39\\x47\\x34\\x18\\x26\\xa2\\x3d\\x99\\xd9\\xfb\\x13\\xde\\x7a\\x83\\xbc\\x1e\\xab\\x29\\x40\\x28\\x53\\xd9\\x53\\xbc\\x54\\x6e\\x94\\xdb\\xb9\\xdf\\xc1\\xe6\\x44\\xba\\x52\\xba\\xa7\\xba\\xec\\x2b\\x5c\\x75\\x55\\xcd\\x28\\x5a\\x90\\xc9\\xe7\\x48\\x37\\x1a\\xe1\\x76\\x6b\\xce\\x19\\x11\\xb1\\x10\\x4e\\x9c\\x44\\x93\\x35\\x10\\x63\\x56\\x12\\x83\\x61\\x5e\\x83\\xe6\\x10\\x5b\\x03\\x40\\x57\\x8d\\x8a\\x87\\x4b\\x04\\xd6\\xad\\xd2\\x56\\xd1\\x99\\xf2\\x40\\x28\\x0e\\x1e\\xf7\\x96\\x51\\x92\\xd1\\x71\\xfc\\x79\\xc5\\xe5\\xec\\x63\\x1c\\xdd\\xe5\\x28\\x53\\xe6\\xd2\\xb4\\xd9\\xe1\\x93\\x4e\\xe0\\x4a\\xe1\\xf0\\x32\\x15\\x45\\xad\\xbc\\x4b\\x46\\xd8\\xde\\x36\\x75\\xa5\\xd8\\xee\\x55\\x94\\x03\\xdb\\x2f\\x1c\\x6e\\xa7\\xef\\x86\\x28\\xd0\\xa6\\xb8\\xdc\\x4d\\x36\\xd4\\x14\\x3a\\x24\\xcd\\xe9\\xb0\\x3d\\x66\\x25\\x60\\x7f\\x62\\xdd\\xef\\x37\\xa7\\x28\\xd6\\x16\\x5f\\x66\\xc0\\x63\\xfd\\x8f\\x72\\x9e\\xd8\\xef\\x38\\xfd\\xca\\x2c\\xeb\\x4d\\xef\\xc5\\x07\\xbe\\xc1\\xa3\\xb4\\x18\\xde\\x44\\x41\\x19\\x39\\xcd\\x80\\x43\\x06\\xed\\x4d\\x48\\xb5\\x83\\x2b\\xd2\\xcd\\x57\\x66\\x26\\xe6\\x18\\xb1\\x9d\\x1f\\xfa\\xd7\\x89\\x3c\\x80\\xbd\\xe3\\xe9\\x85\\x51\\xaf\\xed\\x48\\xdc\\x58\\x02\\x53\\xc9\\x36\\xd9\\x61\\x05\\x93\\xc4\\xe7\\xaf\\x49\\x13\\xdc\\x8b\\xee\\x34\\x7c\\x98\\xe2\\xf2\\x0c\\xb7\\x98\\xa5\\x66\\xd4\\x9e\\x29\\x89\\x1e\\x4f\\x07\\xb8\\x8d\\xfd\\x3d\\x70\\xf8\\x2e\\x95\\x12\\xf7\\x8e\\x55\\x99\\x74\\x0b\\x67\\xa4\\xb3\\xb7\\x1b\\xc9\\x4d\\xe5\\xf3\\x6f\\xd1\\x4f\\xef\\x4a\\x95\\xb0\\x55\\x4a\\x11\\xbf\\x7b\\xda\\x72\\x26\\xd9\\x9c\\xe9\\xf8\\xe8\\xf6\\x3c\\xbc\\xe8\\x3e\\x1e\\x54\\x18\\xd2\\x08\\x4d\\x78\\xac\\x3b\\x36\\x0d\\xae\\xeb\\x50\\xc3\\xf5\\xef\\x33\\x5c\\x47\\x21\\x92\\x23\\x25\\xf7\\x7c\\xfa\\xd3\\x7b\\xdc\\x7c\\x4b\\xda\\x8a\\x73\\x12\\x6b\\xc2\\x89\\xc5\\x43\\x1e\\xa4\\xfc\\x79\\x6a\\x19\\xa9\\x9f\\xf2\\x56\\xc3\\xe9\\xc9\\x9b\\x22\\xf3\\x61\\x63\\xfe\\x16\\x13\\x29\\x2e\\x42\\x82\\xce\\x4f\\xf3\\x5f\\xd8\\x6e\\x3a\\x81\\xae\\x3a\\xe3\\x1d\\xf4\\x2e\\x76\\xa0\\x9e\\xc6\\x95\\x53\\x4e\\x80\\xff\\xd1\\x8e\\x72\\x10\\x9e\\x94\\x87\\xe7\\x0d\\x8a\\x49\\x75\\xe8\\xed\\xd0\\x7e\\xf0\\x3a\\xa4\\x86\\x81\\xfe\\x51\\x8b\\x48\\x46\\xc9\\x38\\xbb\\x2b\\xea\\x77\\x5a\\x76\\x83\\xbb\\xa3\\x3b\\x90\\xa2\\x8a\\xa5\\x45\\x27\\x9e\\xe3\\x82\\x3e\\x26\\xf6\\x41\\xbe\\x04\\x0e\\x8e\\x61\\xc3\\x33\\xd0\\xc9\\xf7\\xf0\\xed\\x3d\\x2a\\xb3\\x6b\\xb2\\xad\\xdb\\x0a\\x99\\x9d\\x38\\xd9\\xda\\x2a\\x82\\x4b\\x62\\xfa\\xf4\\xe7\\x3f\\xad\\x1e\\xaa\\xcd\\x0a\\xba\\x70\\x9f\\xa7\\xb0\\xd3\\x84\\x66\\x36\\x19\\x65\\x83\\x7e\\x99\\x32\\xa2\\x06\\xc8\\x8d\\xeb\\x23\\xac\\xf7\\xef\\xbf\\x67\\xb3\\x6d\\xc8\\x37\\xbb\\x47\\xf6\\xb6\\x9a\\x30\\xeb\\x99\\x8c\\x72\\x09\\xf8\\xeb\\xef\\xad\\x97\\xa4\\x0e\\x09\\xf9\\x70\\xde\\x4d\\x21\\xd0\\xcf\\x1f\\x93\\x83\\x07\\xca\\xc9\\xc2\\xbf\\x6b\\xfe\\x8c\\x85\\xc2\\x6c\\x86\\x48\\x8b\\x01\\x77\\x7e\\x63\\xcb\\x47\\x66\\x87\\x37\\x65\\x67\\xc2\\x47\\xd4\\xe8\\xd9\\x5a\\x8f\\xb1\\x2e\\xa2\\xf3\\x5a\\xc0\\x07\\x0e\\x99\\x3f\\x1f\\x69\\xb2\\x0a\\x6a\\x50\\xe8\\x78\\xaa\\x4d\\x2a\\x2b\\x99\\x2f\\xe8\\x3e\\x2d\\xe1\\xf4\\x67\\x1d\\x0d\\x9b\\xd8\\xd8\\x35\\x7d\\x2a\\x70\\xa3\\x25\\x44\\xf2\\xc2\\xbb\\x63\\xe7\\xa4\\x7f\\xe7\\x9a\\x36\\x95\\x65\\x1a\\x89\\x5b\\x68\\x8a\\xff\\xc2\\xcc\\x0c\\x0b\\x07\\x88\\xda\\xcd\\x9a\\xd1\\x18\\xf6\\x0d\\xf5\\x97\\xde\\x46\\xdb\\x27\\xed\\x0e\\xfd\\x68\\xa6\\x2c\\x3e\\x86\\xba\\xcb\\x5a\\xfd\\xc3\\x8d\\x17\\x55\\x1a\\xe5\\xa4\\xaa\\xbd\\xe8\\x21\\x52\\x79\\x4f\\x5c\\x56\\x30\\x9e\\xbe\\xcc\\xe1\\xbc\\xd0\\x1c\\x1c\\xf9\\x4b\\x65\\x19\\xae\\x04\\x1b\\xff\\x4b\\xf4\\x4d\\x0a\\x3f\\x3e\\x8d\\x4c\\xb9\\x75\\x45\\x7b\\xc5\\x1e\\x1d\\xd1\\x7e\\x30\\xff\\xe7\\xb0\\xd9\\x2f\\x04\\x98\\x38\\x8b\\x9c\\x69\\x73\\x18\\x6b\\xb0\\xa9\\xa5\\xe6\\x1b\\x0e\\xe2\\x07\\x6a\\xc7\\x73\\x05\\xcc\\x33\\x5c\\x99\\xb7\\x4a\\x12\\x0b\\x92\\xbf\\x97\\xb2\\x26\\x5b\\xb3\\xfd\\x28\\x88\\x30\\xf8\\xb7\\xc7\\x8a\\x62\\xa6\\x60\\xaa\\x31\\x07\\xa2\\x6b\\x8c\\x96\\x4e\\x25\\xf3\\x18\\xcf\\x69\\x1f\\xce\\xac\\xd3\\x29\\xb3\\x38\\xcc\\x4d\\xe5\\xa0\\x67\\x53\\x65\\x7b\\x1c\\xde\\x77\\xc4\\x50\\x6e\\xf5\\x74\\xc4\\x7c\\x7e\\xcc\\xee\\x82\\x58\\x9c\\x10\\x11\\xda\\x25\\xb2\\x1f\\xe2\\xff\\xce\\x6b\\xeb\\xae\\x4d\\x0d\\x1e\\xe9\\xb9\\x83\\x5e\\xc7\\x0d\\x78\\x3f\\xc7\\x15\\xc6\\x5f\\x1c\\x79\\xc5\\x70\\xd2\\x87\\xab\\x7c\\x6c\\x69\\x27\\xff\\x66\\x77\\xcf\\xf0\\xff\\x61\\xc3\\xac\\xf3\\x44\\xd7\\x85\\xe9\\xe3\\x01\\x28\\x08\\xb3\\xca\\x5a\\x43\\xa2\\x97\\x7c\\x91\\xe5\\xed\\xc6\\xe4\\x56\\x9c\\x9c\\xeb\\x2d\\xc5\\xf2\\x94\\x89\\xc6\\xe7\\xac\\xae\\xf0\\x6a\\xa6\\xcf\\x50\\x0a\\x06\\xcc\\xc2\\x15\\x16\\x96\\xc3\\xe5\\x07\\x10\\xe2\\xfd\\x14\\xa8\\x94\\x2d\\x95\\x71\\xbd\\x95\\x30\\xdb\\x7a\\xad\\x2c\\xc9\\xa5\\x70\\xcb\\x52\\xaf\\xa4\\xbc\\x6b\\x91\\x0c\\x79\\x19\\xed\\xaf\\xe0\\xcd\\x8b\\xb9\\x79\\x1a\\xfe\\x1a\\x53\\x3f\\xb4\\xc0\\xdf\\x1f\\xd3\\xa3\\xf6\\x74\\x14\\x0a\\x7c\\xf1\\x06\\x6a\\xb3\\xbf\\xc2\\x8e\\xe7\\x52\\x63\\x06\\x7d\\x3f\\x9a\\x20\\x3d\\xb2\\xe2\\x3a\\xbf\\x9e\\x08\\xab\\x8a\\x93\\x31\\x21\\x94\\x2c\\x08\\x77\\x3c\\x78\\x03\\x03\\x94\\xf1\\x9f\\xc1\\x66\\xd1\\x2c\\x17\\xd4\\xf4\\xea\\x93\\x95\\xc4\\x9f\\xdf\\x47\\xc3\\x37\\xad\\x86\\x65\\x6b\\x06\\x06\\x6b\\x26\\x43\\xf7\\xba\\xe8\\x51\\x51\\xf8\\xec\\xb9\\x48\\x9d\\x37\\x2e\\x52\\xa7\\x6a\\x8b\\x36\\xca\\x8e\\xd0\\xcf\\xd1\\x9a\\x1f\\xec\\xe9\\x6f\\xd0\\x14\\x45\\x8e\\xf0\\xc2\\xa9\\x04\\xdb\\x8c\\x3f\\x9a\\xa1\\xc8\\xce\\xf8\\x91\\x57\\xa6\\x96\\x9d\\x64\\x34\\xcc\\x2a\\x3b\\x1b\\x44\\x3c\\x41\\x76\\x5c\\x93\\x48\\xf1\\x7c\\x17\\x7c\\xc9\\x0f\\x8c\\xdf\\xa5\\xfc\\x5f\\x16\\xe4\\x0e\\xc2\\x93\\xfd\\xef\\x73\\x32\\x91\\xec\\xf1\\x63\\x46\\xc4\\xd4\\xef\\xe4\\x0b\\x79\\x2a\\x1b\\x16\\x01\\xc5\\x29\\xf5\\xfc\\x7c\\xc6\\x71\\x53\\x4f\\xf4\\xad\\x3f\\x7b\\x8b\\x86\\x4c\\x74\\x91\\x68\\xfa\\xa8\\x8a\\x24\\x95\\x91\\xc6\\x15\\x10\\xd0\\xb2\\x24\\xf5\\x5c\\x38\\x9c\\x3f\\x08\\xee\\x30\\x83\\x48\\xa3\\xbc\\x7b\\xeb\\x2b\\x6f\\x10\\x41\\x02\\xb6\\x5f\\x43\\x79\\x98\\x83\\x21\\x50\\x15\\xfb\\xd1\\xe0\\x11\\x69\\xb8\\x78\\xa7\\x49\\x30\\xd8\\x93\\xcc\\x35\\x8d\\x12\\x0f\\x4b\\x3a\\x22\\x19\\xad\\xec\\x1e\\xca\\x5b\\x7e\\x20\\xc6\\x65\\x27\\xc7\\x7f\\x47\\x0d\\x41\\xf9\\x51\\x63\\x4f\\x7a\\xdb\\xa3\\xa3\\xe7\\xed\\x63\\x02\\x27\\x19\\xba\\xbc\\xe6\\x90\\x72\\x70\\x6f\\x51\\x37\\xd7\\x50\\x95\\x7a\\x37\\x99\\xf0\\x1e\\xda\\x02\\x7e\\x2f\\xa9\\xf3\\xc0\\x21\\x51\\x2e\\x7b\\xe7\\xe0\\x46\\x96\\xf5\\xe7\\x6f\\x03\\x87\\x9d\\x4f\\xd4\\x35\\x19\\x79\\xfd\\xc3\\x10\\xab\\x57\\xe5\\xf7\\xfb\\x3c\\x14\\xef\\x1d\\x9f\\xce\\xf8\\x24\\x9a\\x7a\\x1e\\x83\\x14\\x4b\\x7d\\x10\\xb6\\xb2\\xdc\\x5a\\x28\\x07\\xed\\x69\\x04\\x51\\xdd\\x89\\xb9\\x75\\x32\\xe9\\x92\\xf9\\x94\\x64\\xb4\\xf8\\x29\\xfd\\x93\\x0b\\x43\\xaf\\xb5\\x30\\x9d\\x9f\\xec\\x07\\xd2\\x4f\\xe5\\xdd\\x6c\\xb9\\x74\\x1e\\x0f\\x8a\\x1e\\x99\\x7e\\x6c\\x4a\\x33\\x63\\xe8\\xc5\\xd2\\xd5\\x23\\x6c\\x67\\xdb\\xd7\\xbc\\x63\\x67\\x89\\xdf\\xb3\\xd1\\x3f\\xc3\\x22\\xbc\\x22\\x8b\\xdd\\x17\\xf3\\xc4\\xbb\\x4b\\xda\\x31\\x29\\x42\\x42\\x65\\x9c\\xdb\\x15\\x41\\xc6\\x7a\\x80\\x08\\x42\\x9b\\xc1\\xc8\\xc5\\x07\\x74\\xae\\x18\\x41\\x09\\xe4\\x08\\x16\\xd0\\x41\\xc3\\x16\\x4d\\xf2\\x82\\x7f\\xea\\xce\\x1f\\x15\\x09\\xae\\x4b\\xbf\\xde\\xc1\\x13\\x52\\xcb\\xa1\\xd2\\xc2\\xc2\\xfc\\x66\\x0f\\x49\\x8f\\xfe\\x6e\\x49\\x88\\xbb\\xf3\\x01\\xe8\\xa7\\x13\\x69\\x1d\\xb8\\x05\\x65\\x36\\x3e\\x86\\x07\\x6f\\x04\\x63\\xde\\xaf\\x82\\xd9\\x1c\\x23\\x15\\x47\\xbc\\x64\\xbb\\x85\\x1f\\xa7\\x26\\x5e\\x9f\\x93\\xa7\\xf7\\x8d\\xbe\\x57\\x5e\\x1d\\x7d\\xa6\\x08\\xb8\\xfe\\xb9\\x1b\\xaf\\x13\\x6d\\xe9\\x39\\x47\\x5f\\xdb\\xa8\\x2c\\xad\\xeb\\x7f\\x6c\\xf0\\xf3\\x57\\x0b\\xeb\\x91\\x2e\\x04\\x07\\x4a\\x5d\\xd0\\xf2\\xfe\\xb2\\x66\\x6e\\x69\\x20\\x8f\\xca\\xa5\\x80\\x3a\\xe3\\x97\\x3a\\xfe\\x80\\x07\\xac\\x1a\\xb5\\xfc\\x4c\\xb6\\x98\\xc1\\xf2\\x42\\xb5\\x08\\xa7\\xec\\x5c\\x89\\x70\\x3e\\x89\\x39\\xd2\\xc4\\xd2\\x2e\\x59\\x17\\xb1\\x0b\\x8c\\xc6\\x50\\x14\\xa1\\xbf\\xe0\\x31\\xaa\\xc6\\xb0\\xbb\\x74\\xd3\\x94\\x20\\xac\\x94\\x88\\x0e\\x65\\x36\\xa2\\x2d\\x35\\xc5\\x80\\x5a\\x21\\xb1\\xda\\xa5\\xee\\x74\\x78\\xa7\\x95\\xec\\x87\\xfc\\xb4\\x1a\\xf7\\x01\\x51\\x3e\\x06\\x3e\\x95\\x48\\x27\\xc9\\x10\\x92\\x88\\x82\\x5d\\x65\\x3d\\x1e\\xcf\\x59\\x55\\x58\\xf9\\x98\\x16\\x7e\\x9f\\xa9\\x91\\xc2\\x27\\x8a\\xd6\\x1a\\xe8\\xb8\\x9b\\xbf\\x78\\xc6\\xf3\\x4f\\x98\\x79\\xcd\\x03\\x7b\\xb5\\x73\\xaf\\xe8\\xbc\\x9d\\x97\\xdb\\xfb\\xc8\\xde\\x05\\x15\\xb6\\xed\\xfc\\x0d\\xd0\\xd7\\x5b\\x7d\\x8b\\xd7\\xaa\\x94\\x54\\xb1\\xe2\\x5e\\x8e\\x84\\xf8\\x3b\\xd0\\x8f\\x89\\x10\\xb1\\xbc\\xd1\\xb7\\x70\\xd4\\x02\\x6e\\xf2\\x8d\\x5e\\xf4\\xec\\xbc\\x0b\\x60\\x21\\x2d\\xab\\xf4\\x4f\\xea\\xad\\x15\\x1d\\x70\\x79\\x91\\xc9\\x60\\x6a\\x1c\\xde\\x40\\xb0\\xe1\\x4d\\xe5\\x81\\xab\\x04\\x1b\\x20\\xf3\\x0f\\x31\\x6c\\x2d\\x8a\\x33\\x7f\\x56\\x68\\xd2\\xbf\\x26\\x96\\x48\\xa3\\x2b\\x62\\xe8\\x03\\xe2\\x22\\x61\\x23\\xf6\\xe8\\x9f\\x23\\x24\\x0e\\xc7\\x6f\\x75\\xdc\\x1f\\x80\\x2e\\x0a\\xc2\\xd1\\x8b\\x06\\xb5\\x48\\xff\\x00\\x03\\xe0\\x6a\\xea\\x2b\\x98\\x84\\x06\\x85\\xc6\\x9a\\x75\\x68\\x0b\\x38\\x5a\\xf0\\xdc\\x84\\x3e\\xa6\\xd4\\xba\\x5b\\x81\\x9d\\x5a\\x85\\xa3\\x0a\\x4d\\x94\\x8f\\x84\\xb2\\xef\\xb1\\x82\\x73\\xfd\\xc9\\xcb\\x59\\x07\\x6a\\x17\\x12\\x4a\\x15\\x9b\\x41\\xaa\\xd8\\xd0\\x3a\\x89\\xbc\\xfc\\x3f\\x85\\x41\\x6c\\x88\\x09\\x89\\x9a\\x06\\x1b\\xbe\\xa9\\x9b\\x7a\\x78\\x7d\\xad\\xd8\\x50\\x24\\x4a\\x26\\x28\\x24\\x59\\xb5\\x36\\x4c\\x15\\xbb\\xd4\\x05\\x26\\x45\\x76\\xc1\\xfe\\x06\\x93\\x38\\x13\\xa1\\x98\\x89\\x88\\xe6\\x15\\xd3\\x97\\x4d\\xfd\\x3f\\xa6\\x7e\\xa0\\x8b\\x18\\x59\\xec\\xaa\\x6a\\xbf\\x26\\xcd\\xa2\\x4c\\x25\\xd3\\xb4\\x83\\x80\\x8d\\x6a\\x63\\x10\\x4d\\xde\\xc7\\x84\\x1a\\xe6\\x67\\x6f\\xc9\\x9c\\x46\\x98\\x7c\\x24\\x20\\xf5\\x24\\xf5\\x46\\x30\\x95\\x91\\x5a\\xc7\\x4b\\x5e\\x83\\xb0\\xe6\\x8c\\xca\\x45\\x11\\x31\\xf2\\x42\\x4e\\x32\\x15\\x6b\\x7a\\xd9\\xc5\\x76\\x88\\xf2\\xdb\\x75\\xcf\\xa5\\xa7\\x77\\x60\\x8e\\x48\\x3f\\xec\\xec\\x18\\x0e\\x89\\xd6\\xa0\\x83\\xc0\\xdc\\x74\\x4f\\x9d\\xb2\\x60\\x66\\xe8\\x31\\x0e\\x7b\\xdf\\xb9\\xd2\\x14\\xde\\x6e\\xeb\\x98\\x15\\x38\\xaa\\x46\\x63\\xcf\\xad\\xbc\\x97\\x87\\xbf\\xbe\\xb2\\xa2\\x56\\xb5\\x94\\x90\\x43\\x06\\xcf\\x27\\x25\\xe1\\xeb\\x20\\x0e\\xdd\\x04\\xb4\\xbf\\xa9\\x56\\x44\\x75\\x56\\x7e\\x7f\\x72\\x7b\\xed\\x7c\\x26\\x65\\x71\\xee\\x66\\xf8\\x66\\x74\\x33\\x03\\x2f\\x75\\x91\\x37\\x82\\x5b\\x01\\xa3\\x85\\x29\\xf3\\x50\\xbb\\xad\\x5a\\xe2\\x6f\\x9f\\xe9\\xc2\\xac\\xb0\\x0e\\xf0\\x44\\xe9\\x86\\x8f\\xd2\\x53\\xee\\x5b\\xf9\\xc8\\xc3\\x80\\x60\\x54\\xc2\\x1c\\x32\\x01\\x75\\x6d\\x77\\x7f\\xfc\\x5a\\xba\\x63\\x5c\\xa0\\xcb\\xaa\\x54\\x03\\x7f\\xf9\\x6c\\xac\\x2a\\xfc\\x8f\\x4b\\x09\\x22\\x9f\\x54\\x8e\\xef\\x43\\xe0\\xd0\\x5d\\x54\\x0a\\xc7\\xc8\\x8e\\x84\\xac\\x32\\x54\\x49\\x43\\xe4\\x08\\xa8\\xed\\x5f\\x71\\xad\\xef\\x13\\x86\\xd9\\x7c\\xfa\\xfa\\xa5\\x36\\xfc\\x90\\xe2\\x06\\xc4\\x1d\\x33\\xa5\\x35\\xd5\\x51\\x54\\xdd\\xb1\\x50\\x8b\\x2b\\x5c\\x1d\\xee\\x7d\\x45\\xce\\xb7\\x99\\x6c\\xd3\\x6d\\x53\\x4e\\xc2\\xb7\\x3c\\xc5\\x6d\\xa4\\x2d\\x58\\xed\\xe8\\x28\\xb2\\x76\\x09\\xdd\\x10\\x0e\\x5a\\xe4\\x9f\\xa8\\xd0\\x2c\\x15\\x9b\\x39\\x4c\\x95\\x51\\x96\\x67\\x81\\x12\\x56\\x07\\xb7\\xad\\x1b\\x89\\xba\\xf3\\x55\\x4b\\xd9\\xf0\\x6a\\x3a\\xbd\\x3b\\x0e\\x7d\\xbf\\x9d\\xea\\xb5\\x7f\\x2e\\x08\\x39\\x07\\x3e\\xb8\\x4d\\x86\\x92\\xa2\\xf0\\x57\\xef\\xf7\\x69\\x53\\x56\\x57\\xd4\\x12\\xb1\\xbb\\x29\\x0b\\xb4\\x26\\xe2\\xa2\\x94\\x41\\x00\\x72\\x6d\\x09\\xcb\\xca\\x9c\\x73\\x64\\xa9\\xaf\\x54\\x71\\x71\\x3c\\x62\\xc2\\xc7\\xe1\\xf0\\x08\\x42\\x64\\xa4\\x8a\\x82\\x8e\\x1e\\x36\\x3a\\x36\\x13\\x65\\x90\\xd9\\x25\\x1f\\x99\\xd4\\xe4\\x15\\x33\\x36\\x19\\xca\\xe9\\x5d\\x2a\\xdc\\x8c\\xfb\\x0d\\x52\\x55\\x9e\\x51\\x22\\xc9\\x12\\xbc\\x92\\x61\\x14\\x43\\x5a\\x7b\\x7f\\xce\\x7f\\x37\\x76\\x36\\x57\\xc8\\x74\\xb0\\x08\\x30\\x59\\xd0\\xa8\\x41\\x08\\x03\\x75\\x62\\x8f\\x3d\\xbb\\x2e\\xbc\\x8c\\xf1\\xe9\\x41\\x00\\x57\\x6a\\x25\\xa3\\x88\\x71\\x32\\x4c\\xa1\\x47\\x67\\xd5\\x89\\xe1\\x6d\\xac\\x6c\\xcc\\xaf\\x45\\x10\\x85\\x7d\\x38\\x73\\x26\\x29\\xec\\xa1\\xec\\x51\\x58\\xe4\\xfb\\x35\\xce\\xb6\\x5d\\x91\\x2d\\x6c\\x26\\xe7\\x98\\x28\\x50\\x6c\\x61\\xa1\\xe5\\x03\\xa2\\x30\\xfb\\xbf\\x54\\xc7\\x29\\x0b\\x08\\xd1\\x17\\x6a\\x49\\xb1\\xf0\\x64\\xb2\\xbf\\xee\\x50\\x8e\\x73\\xfc\\x06\\x92\\xe0\\x71\\xf5\\x2c\\x63\\x55\\x1f\\x2a\\xa5\\xd0\\x00\\x1b\\xc6\\xbf\\xb6\\xeb\\xc1\\xa6\\x58\\x74\\xd2\\x05\\x2d\\x13\\xda\\x62\\xc1\\x86\\x6b\\xb5\\xba\\x67\\x15\\x07\\xc4\\xb0\\x1a\\xe1\\x98\\x7e\\x21\\xd9\\x15\\xb0\\x88\\x99\\x58\\x98\\x9c\\x90\\x6c\\xe8\\x59\\xdb\\xe3\\x90\\xd6\\x38\\x15\\x8c\\x69\\x17\\x6d\\x0a\\xce\\xe3\\x81\\xa0\\xc1\\xec\\x17\\x87\\x8a\\x7e\\xe9\\xd8\\x2d\\x6e\\x55\\x16\\xdb\\x68\\x2c\\xd1\\x64\\x6e\\x86\\x83\\xd8\\xe8\\x6a\\x3d\\x30\\x4c\\xac\\x1b\\x34\\x1e\\x3a\\x34\\xac\\x0e\\x2e\\x6c\\x9c\\x31\\xfe\\x6a\\xcd\\x65\\x89\\x16\\x98\\x9a\\x1c\\x84\\x0e\\xe1\\xf8\\xcb\\x29\\x8f\\x46\\xa5\\x17\\x41\\xe2\\x2e\\x1c\\x31\\xa7\\x7c\\x5a\\xf7\\x8f\\xcc\\x93\\x25\\xa4\\x4e\\x3e\\xc3\\x30\\x8a\\x50\\xb8\\x6f\\x58\\x41\\x40\\x50\\xe5\\x68\\xbc\\x64\\xc7\\x11\\x48\\x62\\xd8\\x35\\x82\\x40\\xf5\\x3a\\xdd\\xfc\\xe7\\xd7\\x18\\x66\\x34\\x8f\\x5f\\x4c\\x0e\\x90\\x0a\\x4c\\x8e\\x9f\\xa8\\x54\\x7c\\x8e\\x57\\x20\\x4a\\x85\\x34\\x9c\\x8a\\x85\\x40\\x6c\\x64\\x3b\\x2c\\xe0\\x42\\xf5\\x1e\\xc3\\xc5\\x3c\\xbd\\x6b\\x27\\xb8\\xc0\\xf7\\x38\\xb3\\xfa\\x79\\x84\\xb6\\x3a\\x53\\xc6\\xa3\\x1e\\x4b\\xcd\\xd0\\xfc\\x70\\x0b\\xdb\\x2a\\x81\\x3b\\x2a\\x0c\\x47\\x49\\xe3\\x34\\x83\\x77\\x8b\\xb8\\x0e\\x95\\x89\\x0d\\x5d\\x11\\x89\\x76\\x1a\\xdf\\x85\\x02\\xaf\\x3c\\xb4\\xe4\\x41\\xad\\xf6\\xb3\\x11\\x1b\\xd0\\x0a\\xf2\\x19\\x91\\x13\\xf8\\xf3\\x49\\xc8\\x3e\\x8f\\xe7\\x8e\\x1f\\xc9\\x51\\xc3\\x03\\x0a\\xc4\\x3f\\x38\\xb0\\xfd\\x1a\\xa2\\x5a\\x88\\x60\\x2a\\x16\\xcc\\x4c\\x38\\x3d\\x5d\\x64\\x05\\xf9\\x03\\xb2\\xae\\x90\\xe4\\x90\\x82\\xe1\\xf3\\x51\\xc7\\x25\\x2d\\x35\\x61\\x14\\x5c\\x6e\\x75\\x5d\\xb6\\x4e\\x0b\\x4c\\x25\\x09\\x85\\xa3\\x15\\x36\\xe9\\x5d\\xf4\\xa4\\x0e\\x81\\x92\\x24\\x45\\xf8\\xa9\\x77\\x2b\\x18\\x91\\x8f\\xef\\xd3\\x60\\x01\\x2f\\x2a\\x87\\x1d\\x9a\\x57\\x84\\x1f\\x96\\x9e\\x3c\\xc3\\x7a\\xe0\\xf0\\xfd\\x3b\\x65\\xa4\\x87\\x2c\\x88\\x58\\xdd\\x17\\x5b\\x5d\\x47\\xae\\x58\\xfd\\x7c\\x21\\x5f\\xd0\\x19\\x17\\x48\\xd9\\xc3\\xf2\\x0c\\x67\\xe0\\x64\\x9b\\x1d\\xf0\\x6d\\x05\\x3b\\x18\\xab\\xce\\xbb\\xdd\\x83\\x23\\x18\\x93\\x5c\\x4e\\xbe\\x09\\x2a\\xbc\\x6e\\xd1\\xd6\\xb6\\xec\\x9b\\x40\\xc4\\x59\\x05\\x55\\x41\\x5a\\xb7\\xaf\\xcb\\x88\\x3c\\xf4\\xd6\\xb4\\xb9\\x35\\x6d\\x74\\xd6\\xe8\\x7d\\xb6\\x3b\\x6c\\x02\\x38\\x92\\xf9\\xc9\\xa8\\x80\\xa3\\x84\\x85\\x81\\x17\\x58\\x48\\xaf\\x7a\\x71\\x95\\x3d\\xcc\\x89\\x3a\\xc3\\x20\\xbc\\xe6\\x92\\xb4\\x86\\x67\\x35\\x06\\x5d\\xaf\\x45\\x8c\\xbe\\x8b\\x4b\\x27\\x44\\xef\\x11\\x4d\\x18\\xcc\\x99\\x3d\\xc9\\x92\\x79\\xe5\\xc4\\xe2\\xe8\\xcc\\xb6\\x24\\xe6\\x61\\xa0\\x86\\x2a\\x6a\\xd1\\x57\\xd0\\x58\\xcf\\x57\\xca\\xa1\\x96\\xee\\xc9\\x56\\x4a\\xa9\\x2b\\xdd\\x3e\\x80\\x88\\xdd\\xa7\\xbf\\x5e\\xce\\x3e\\x6a\\xdf\\x58\\x4e\\x79\\x7a\\x9f\\x88\\xe3\\xf8\\x85\\x65\\x54\\xc5\\xc8\\x08\\x99\\x17\\xfa\\x2a\\x71\\xa8\\xbc\\x02\\x37\\xcb\\x77\\x3f\\x28\\x15\\x56\\xb0\\xcd\\x41\\x4e\\x39\\x06\\x17\\xab\\x13\\xdf\\x63\\xbe\\xf6\\x27\\x8a\\xe4\\xdb\\xea\\x68\\x26\\x25\\x33\\x55\\xd5\\xaa\\x76\\x25\\x9e\\xc2\\x8c\\x98\\x75\\xec\\xa4\\x62\\xf7\\x04\\xc4\\x93\\xe3\\x86\\x94\\x10\\x96\\x30\\xc1\\xc4\\x4c\\xd9\\x7f\\xce\\x0b\\xdd\\x27\\x5b\\xc6\\x30\\x19\\xce\\xef\\x33\\xce\\xac\\xaf\\xa4\\xa6\\xc5\\x47\\xd0\\x66\\x54\\xa7\\xb9\\xfe\\xe0\\x80\\x24\\x0b\\x77\\xd4\\x71\\x76\\x7a\\xac\\x04\\xc1\\xe1\\x00\\x47\\x95\\x30\\xf5\\x85\\xc9\\x24\\x5a\\x73\\x5d\\xa5\\x2b\\x97\\x2e\\xcd\\xae\\x0f\\xdc\\x58\\x1b\\xc2\\xb2\\xcc\\xd2\\x5c\\xa6\\x21\\x87\\xb4\\xa1\\xee\\x67\\x44\\x22\\x6b\\xc2\\x28\\x26\\xfb\\xb5\\x33\\x8f\\x36\\x6f\\xe6\\x2b\\x49\\xbb\\x22\\xbb\\x96\\x7f\\xe7\\xb0\\xcd\\x88\\xec\\x56\\x25\\x86\\x9c\\xe4\\x1d\\x23\\x44\\xc8\\xb4\\x5c\\x72\\x28\\x95\\xcf\\x90\\x5e\\x4c\\x03\\xa7\\xaa\\x3e\\xc5\\x4a\\x50\\x0a\\x0b\\xb9\\x0a\\x4e\\xdf\\xcc\\x60\\xab\\x55\\x13\\x8a\\x57\\x28\\xeb\\x24\\x4a\\xc0\\xad\\x3a\\x93\\x0f\\x02\\x2f\\xcf\\x25\\xbf\\xda\\x17\\xab\\x1d\\x1c\\x2b\\x2f\\x73\\x39\\x14\\x25\\x3b\\x99\\x69\\x95\\xc8\\x66\\x9f\\x6c\\x9f\\x4f\\x3f\\x11\\x37\\xe4\\x98\\xc5\\x38\\xe8\\x95\\xd1\\xd4\\xa1\\x5e\\xc8\\x02\\x6a\\x91\\xfc\\x13\\x55\\x62\\x3c\\x54\\xde\\x4c\\xff\\x45\\x71\\x3f\\xf3\\x57\\x16\\xb4\\xf7\\xf9\\xd3\\x8c\\xe1\\xe0\\xa3\\x74\\x71\\x80\\xee\\x7d\\x59\\x72\\x43\\xc8\\x30\\x68\\xe8\\x6b\\xd2\\x2c\\x9b\\x4b\\x72\\xa3\\x6a\\x4d\\xe7\\xfd\\xc6\\x2e\\x2c\\xcb\\x02\\x63\\x5d\\xc8\\xe0\\xf8\\x79\\x9a\\xf1\\xfe\\xe2\\xbb\\x0b\\xb8\\x7b\\x11\\xce\\xd8\\x2b\\xa3\\xcc\\xcb\\x77\\x05\\xfc\\xf3\\xb2\\x12\\xcd\\xac\\xc4\\xc3\\x99\\xa6\\x2b\\x84\\x7c\\xb4\\xbd\\x6b\\x4f\\x20\\xb9\\x31\\x9d\\x89\\xa9\\x17\\xe7\\x7b\\xb0\\xe7\\xb7\\x62\\xe7\\x26\\x81\\x55\\xdb\\x5a\\x1d\\x7d\\x2d\\xa7\\x57\\xe2\\x7a\\xdb\\xc4\\xa0\\xa6\\x93\\x30\\x9b\\x6d\\xad\\xb5\\x30\\xe5\\xa7\\xab\\xb4\\x0b\\xda\\x00\\xda\\x45\\x7c\\xbe\\x3a\\xeb\\x2a\\xd9\\xcb\\xeb\\xeb\\xd5\\x73\\xd5\\x8d\\xe2\\x5e\\x03\\xdc\\xce\\x03\\x86\\xf3\\xfd\\x9b\\xa9\\x19\\xed\\x29\\xa3\\xd5\\x03\\xa3\\xa0\\x50\\x8d\\x29\\xd9\\x20\\x09\\x58\\x2e\\x21\\xc4\\xb7\\x64\\xb5\\xab\\xf4\\x36\\xc4\\x48\\x44\\xd5\\x5e\\xe4\\x22\\x2a\\xd2\\xe1\\xb4\\x16\\x69\\xb2\\xdf\\xc9\\x1b\\xa2\\xc1\\xfc\\x49\\x29\\x8c\\xc5\\xf4\\x15\\x46\\x74\\xba\\xbe\\x3e\\x4b\\x8e\\xf4\\xb7\\xc9\\x82\\x34\\x95\\xfd\\xd1\\xe6\\x1d\\xca\\x54\\x96\\xf0\\xa4\\x32\\xc6\\xc2\\x8d\\x02\\x1f\\x00\\x81\\x17\\xd8\\x23\\x4b\\xf1\\x00\\x64\\x3d\\x46\\x03\\x74\\xc5\\xde\\x54\\xb5\\xbf\\xde\\x75\\xe6\\xaa\\x3d\\x1d\\x15\\x93\\x18\\x72\\x68\\x38\\xef\\x7d\\xa4\\xea\\xa1\\x0e\\x21\\x06\\x66\\xd0\\xed\\x29\\xbe\\x78\\xe1\\x99\\xdd\\x99\\x17\\x47\\xa0\\x00\\x2a\\x18\\x4e\\xc4\\x97\\x5f\\x17\\x00\\xe4\\x51\\x6d\\x65\\xde\\x92\\x61\\x10\\x8f\\xf8\\x11\\x10\\x09\\x8b\\x14\\xf3\\x8e\\x24\\x1c\\x63\\x41\\x35\\x32\\x9a\\x0e\\xe4\\x5f\\x01\\x8b\\xa4\\x48\\xf3\\xcf\\x43\\x2b\\x33\\x62\\xf5\\x7c\\x86\\x1b\\xa0\\xd2\\x95\\xbf\\x62\\x06\\x7d\\x36\\x0e\\xbb\\x87\\x94\\x32\\x75\\xb5\\x46\\xa0\\x4c\\x11\\x60\\x51\\x47\\x01\\x54\\x6c\\xf9\\x01\\xff\\x6d\\xe2\\xb1\\x70\\x4f\\x6f\\x8f\\xaa\\x49\\xcd\\x02\\x84\\x29\\x27\\xd9\\x5c\\xa0\\xb5\\xfd\\x3d\\x41\\xd2\\x5d\\x3f\\x6e\\xe7\\x52\\x96\\x61\\x6c\\x1a\\x6f\\x55\\x6a\\x20\\x06\\x39\\x3f\\xe4\\x94\\xb0\\x06\\xeb\\x2f\\x4e\\x2c\\x49\\x32\\x66\\xf1\\x6a\\x9c\\x2c\\x91\\x5b\\x8a\\x1a\\x98\\x8e\\x0b\\x78\\x2c\\x57\\xf7\\x36\\x95\\x04\\xdc\\xce\\x83\\x10\\xc6\\x71\\xa5\\xf3\\x43\\xf6\\xdf\\x64\\xe8\\xf9\\x21\\xf8\\x6f\\x7a\\x41\\xd9\\xa0\\xcf\\x37\\x89\\x09\\xdd\\x81\\xd4\\xb7\\x00\\x06\\x53\\xa8\\xe5\\xc9\\xe0\\xc2\\x48\\x94\\x04\\xda\\x35\\xe9\\x05\\x7c\\x23\\xa5\\xe9\\x98\\xf6\\x8d\\xa0\\x2b\\x0e\\x05\\x99\\x8b\\x04\\xe3\\xa6\\xce\\x98\\x9c\\xaa\\x7c\\x97\\xe5\\xd9\\x2e\\xbb\\xba\\x2e\\x74\\xfc\\x9f\\x82\\x6a\\xba\\x30\\x0f\\x8e\\x07\\xa6\\x0e\\x64\\xd9\\x6e\\xc7\\xb3\\x3c\\x50\\x68\\x82\\xc3\\xbb\\xd9\\x48\\x63\\xb9\\x58\\x81\\xa2\\x70\\xfa\\xca\\x59\\x94\\x73\\x3b\\xb2\\xf5\\xf9\\xc3\\x5b\\x0d\\x43\\x70\\x10\\x36\\x3d\\x00\\x00\\x0a\\x06\\xca\\x18\\x00\\x0c\\x63\\xe5\\xfe\\x9d\\x83\\x9f\\x1c\\x82\\xd2\\x9d\\x53\\xb3\\xef\\x92\\x05\\x27\\x91\\xb9\\x80\\xa5\\xfb\\x06\\x14\\xe2\\x8a\\xa4\\xd6\\xc2\\x3c\\x04\\xc9\\x44\\x6d\\xc0\\xb2\\x90\\x00\\x5d\\x25\\x01\\x94\\xef\\xbd\\xfc\\xee\\x0c\\xa9\\x13\\xa5\\xb6\\xdb\\x0e\\x98\\x8e\\x75\\x13\\xd0\\x5a\\xc2\\xdf\\xe9\\x06\\x3c\\xac\\x62\\x77\\x1e\\xca\\xc9\\x52\\x25\\x4a\\xe9\\xef\\x7b\\x63\\x2b\\x34\\x9c\\x34\\x4d\\x69\\x79\\x1a\\x9b\\x19\\x84\\x35\\x3d\\xdf\\xd5\\x18\\xf4\\xbe\\x13\\x33\\x54\\x06\\xa1\\xd2\\x40\\x7b\\x19\\xd0\\xa7\\xda\\xbf\\x2a\\xc8\\x78\\x05\\xf9\\x89\\x99\\x3a\\xaf\\xd0\\x5d\\xe4\\xce\\x97\\x48\\x1a\\x59\\x21\\x16\\xab\\xa2\\x42\\x7f\\xaf\\xcf\\xab\\x5a\\x58\\x91\\x1d\\x3b\\xc3\\x47\\xc3\\x95\\x99\\xd0\\x68\\x7e\\x53\\x88\\x4d\\x65\\xd0\\x0c\\xf4\\xfc\\xd4\\x08\\x40\\x5a\\x34\\x32\\x31\\x36\\xb3\\x16\\x83\\x39\\xdb\\x84\\xeb\\x83\\xed\\xf3\\xc9\\x74\\xec\\x47\\x8b\\x09\\x79\\x66\\x1f\\xce\\x0a\\x56\\x56\\xed\\xd4\\x7e\\x5d\\x97\\x75\\x84\\x19\\xff\\x65\\x24\\x98\\x00\\x2b\\x36\\xae\\xa9\\x6a\\x3e\\xde\\x67\\x1d\\x72\\x87\\xfa\\x34\\x15\\xba\\x05\\x6d\\x6e\\x3c\\x2c\\x05\\xc0\\x1f\\x5d\\xc0\\x5c\\x7e\\x1a\\x35\\x6b\\x02\\x4c\\x47\\x87\\x64\\xb7\\x0d\\xa4\\x09\\x6e\\xfe\\x6c\\x57\\xec\\x59\\x61\\x69\\xd1\\x26\\xd6\\xb9\\x04\\xfe\\xbe\\xbc\\xdd\\x50\\xc9\\xff\\x9a\\xf6\\x8e\\xdf\\x01\\xd4\\x22\\xfd\\x13\\x07\\x6b\\x91\\x6c\\x02\\x10\\x5d\\xdf\\x51\\x9b\\x9a\\x31\\xc6\\xe2\\x70\\x93\\x95\\xbd\\x80\\xb8\\x76\\x4a\\x98\\x12\\x3b\\x8d\\x52\\xcb\\xd8\\xf4\\xe6\\x29\\xca\\x0c\\x06\\x2d\\x2b\\xa7\\x84\\x8c\\x55\\xed\\xd0\\x73\\x79\\x4f\\x90\\x4e\\x3e\\x75\\x47\\x31\\x5d\\x85\\xc8\\x11\\x35\\x52\\x39\\x4d\\xa5\\xd1\\x01\\x1d\\x08\\x3e\\x74\\x8a\\x89\\xb2\\xf3\\x60\\x8d\\xa0\\x8b\\xa5\\x14\\x8c\\x65\\x94\\x67\\x0b\\xa2\\x87\\xf3\\x2b\\x01\\x71\\xf9\\x85\\x4b\\x98\\x0a\\xa6\\x43\\xd0\\xfc\\x5f\\xdb\\x0b\\x95\\x43\\xff\\x5a\\xd4\\x58\\x4f\\x83\\xf0\\x74\\x5e\\x46\\x28\\x9a\\x9c\\x9d\\x58\\xb4\\xbc\\xcd\\x6f\\x05\\x0e\\xb1\\xbe\\x50\\x90\\x62\\xe2\\x7e\\xd2\\xee\\xba\\x28\\xc8\\xdb\\xc1\\x1c\\x66\\x6b\\x11\\xa5\\x7a\\xfc\\x0c\\xb6\\xf9\\xfb\\xad\\x79\\x81\\xac\\x5a\\xea\\x47\\x3f\\xd3\\x67\\x06\\xc8\\x27\\x70\\x45\\x23\\x2f\\xfe\\xf1\\x31\\x49\\xce\\x52\\x7a\\x60\\x38\\x97\\x8a\\xae\\x4f\\x3e\\x93\\x67\\x3b\\x97\\x53\\x7a\\x8e\\x50\\x9c\\x09\\x32\\xcb\\xb5\\x99\\xae\\xdc\\x4a\\x99\\x79\\xde\\x84\\xca\\xa3\\x64\\x95\\xd9\\xf3\\x47\\x1b\\x3a\\x49\\x7b\\x4c\\xbe\\xd6\\x7d\\x49\\x54\\x62\\x46\\xbf\\xb7\\x65\\x68\\x45\\x7a\\x65\\xc6\\x57\\xc3\\xe0\\xeb\\x44\\x13\\xeb\\x11\\xae\\xf3\\xe5\\x46\\x06\\xa7\\x13\\x23\\xc3\\x61\\xb3\\xbc\\xcb\\x40\\x81\\x42\\xa4\\x88\\x94\\x6e\\x0c\\x3c\\x22\\xa1\\x92\\xd5\\x0a\\xa6\\x5a\\x29\\x95\\x15\\x76\\x3e\\xde\\x99\\xed\\xa3\\x8d\\xd1\\x4f\\x0e\\x0a\\x96\\x49\\xba\\x87\\x86\\x53\\x64\\xa2\\xf8\\xae\\xe0\\xa9\\xca\\xfc\\xcb\\x8b\\x8d\\x4f\\x17\\x17\\xf5\\xbf\\x09\\x25\\xbd\\x01\\x9d\\xb6\\xe7\\x5a\\xe2\\x0f\\x7f\\xd5\\x23\\x10\\xae\\x23\\xfe\\x75\\x90\\x32\\xce\\x14\\x48\\xf1\\x5d\\x9f\\x6b\\x53\\xc7\\xb4\\x01\\x28\\xc9\\xf3\\xce\\xe3\\xae\\x39\\x54\\x96\\x3f\\xdb\\x9f\\x32\\xb2\\xf3\\xbc\\x54\\xbc\\x3f\\x08\\x89\\x22\\x75\\xef\\xc8\\x21\\x78\\xb1\\xb0\\xd0\\xd0\\x4b\\xb0\\x03\\xc6\\x47\\xd8\\xa3\\x25\\x6b\\xea\\x6b\\xee\\xa6\\xc9\\x22\\x3a\\x8c\\xa4\\x2d\\x50\\xd8\\xa3\\x8e\\x6d\\x00\\x5f\\xcc\\x9f\\x8e\\x58\\xed\\xc1\\x2c\\x1e\\x96\\xdd\\xec\\xba\\x49\\x9d\\x62\\x63\\xc4\\x26\\xa6\\xfd\\x4e\\xe6\\x1f\\x91\\xa6\\xed\\xc2\\xbf\\x2b\\x02\\x8e\\x79\\x78\\xd0\\xe8\\xe1\\x4a\\xdc\\xc5\\x54\\x70\\xd6\\xb1\\x65\\xb1\\x2f\\x81\\xe8\\xc2\\xbd\\x32\\xe8\\x8f\\x89\\x97\\xa1\\x30\\xf3\\x45\\x39\\x04\\xc0\\xaf\\x20\\xf4\\xfe\\xd1\\xdc\\x6d\\xeb\\xd8\\x09\\x7e\\xa4\\x46\\x4b\\x58\\x76\\x36\\x2d\\xc0\\xb7\\x25\\xa0\\xb1\\x71\\x40\\xcc\\xe8\\x3f\\x46\\xc4\\x06\\x92\\x84\\x40\\x66\\xcf\\x3b\\x56\\x3d\\xd7\\xb7\\x51\\x93\\x44\\x7a\\x71\\x9d\\xd0\\x2f\\x67\\xf8\\x9d\\x31\\xb7\\x1e\\x42\\xb3\\x55\\xdd\\xde\\x54\\x0f\\xfb\\xe4\\xc9\\xcf\\x07\\x34\\x3e\\x16\\x03\\xcf\\x82\\x65\\x3c\\x7f\\x88\\x94\\x21\\x8a\\xdf\\x5e\\x69\\xb9\\x00\\x64\\x59\\xce\\x8f\\x7e\\xa3\\xe5\\xeb\\x2d\\x4e\\x53\\xbf\\x72\\x32\\x95\\xa8\\xc5\\xdd\\xf9\\x0a\\xe0\\xac\\xe7\\x46\\x7e\\xfc\\x40\\x3e\\xff\\x7b\\xc9\\xe8\\x6c\\x9b\\x02\\x39\\xd5\\x2a\\xa5\\x9f\\xb8\\x65\\x3c\\x11\\x1e\\xd6\\xd9\\x30\\x1b\\x09\\xda\\x44\\xd4\\x5c\\x76\\x57\\x64\\xc0\\x90\\xe7\\x4a\\x0d\\x75\\x59\\x4f\\xf9\\x69\\xcd\\x06\\x40\\x35\\xd8\\xa8\\xb4\\x03\\x7f\\x38\\x27\\x23\\xb2\\x32\\x91\\xdc\\xac\\x6c\\x84\\xf7\\xde\\xcb\\x37\\xbe\\x59\\x6b\\x37\\xa4\\x5f\\xe3\\x60\\x27\\xa3\\x33\\x27\\xb2\\xb8\\x80\\x85\\x63\\x54\\xc3\\x16\\x5d\\x02\\x2a\\x78\\x84\\x14\\x9e\\xa8\\xf8\\x8e\\x52\\xb3\\x2d\\x68\\x32\\x40\\x2b\\x4f\\xad\\x38\\x4b\\x89\\x78\\x29\\xd6\\x1f\\xa1\\x94\\x3e\\xc1\\xfc\\x36\\x00\\xb6\\x41\\x86\\x1b\\x13\\x20\\xac\\xe0\\x0d\\x74\\x92\\x33\\xbd\\x16\\x3e\\xf1\\xb4\\xa6\\x62\\xee\\x63\\x61\\x14\\xfb\\x42\\xb3\\x95\\xc9\\x70\\xd5\\xe6\\x4d\\x79\\xc8\\x08\\x59\\xd4\\x60\\xd9\\x9c\\x81\\x0e\\x26\\x3a\\x93\\x55\\x0d\\x8d\\x4f\\xde\\x7e\\x74\\x69\\x8e\\xe9\\xd5\\x86\\xf0\\x14\\x05\\x4a\\x91\\x0d\\xcc\\x5d\\xb6\\x7f\\x3e\\x14\\xb1\\x06\\x1d\\xdc\\x57\\x21\\x74\\xca\\xcb\\x64\\x7d\\x64\\xbf\\xee\\x3d\\xd0\\x96\\x70\\xb7\\xc5\\xf4\\xcf\\x44\\x1a\\xe4\\x65\\xfd\\x3c\\x60\\x81\\x4d\\x5e\\x25\\x01\\x2d\\xcc\\x9f\\xed\\x05\\x63\\xf8\\x5c\\x9b\\x6f\\x52\\xbb\\x94\\x02\\xac\\xc7\\x85\\x40\\x65\\x90\\xeb\\xc4\\xa7\\xfb\\x11\\xa1\\x38\\xe1\\x10\\x8d\\xb6\\x4f\\x08\\x01\\xb2\\xa6\\xad\\xb0\\xe7\\x44\\xde\\x3e\\x1c\\x8d\\xb4\\x69\\x87\\x9e\\xaa\\x6d\\xa2\\x9b\\x4f\\x6e\\x03\\xc1\\xd5\\x82\\x25\\xf2\\x19\\x0c\\x74\\x87\\xc7\\x97\\x5c\\xc3\\x84\\x09\\x3d\\xa3\\x3d\\xbe\\x1e\\x45\\x56\\xdd\\x74\\x12\\xd7\\x08\\x55\\xc9\\xe8\\x93\\xb0\\x3d\\xcd\\x9c\\x43\\x7c\\x0f\\x65\\x06\\x74\\x0f\\x1a\\x51\\x5f\\x72\\xc3\\x1e\\x5c\\x2a\\x41\\x23\\x2a\\x53\\xd5\\xc0\\x07\\x7a\\x3f\\x3e\\x54\\x78\\xf3\\x91\\x65\\xc8\\x72\\x73\\xec\\xfc\\x2e\\x02\\xa7\\x96\\x7b\\xd9\\x56\\xbc\\x77\\x45\\xec\\x07\\xad\\xdf\\x29\\x66\\x10\\x9d\\xcc\\x3f\\x6e\\x8e\\x14\\x33\\xca\\x8c\\x2e\\x8d\\x80\\x0a\\xd2\\x1a\\x0b\\xbf\\x42\\xa3\\xc2\\x50\\xc0\\x12\\x9e\\x94\\x15\\xc7\\xcb\\x26\\x47\\x4c\\xa6\\x1e\\xe3\\x7d\\x99\\x81\\x47\\x1d\\x60\\x94\\x56\\x12\\x0f\\x36\\x56\\x31\\xce\\x4f\\x87\\x9a\\x43\\x96\\x96\\x80\\xfd\\xfd\\xbb\\xbc\\xf4\\x56\\xab\\x08\\x11\\x11\\x71\\x57\\xe3\\x70\\x14\\xe5\\xa8\\x35\\xf9\\x44\\xe4\\x8a\\x05\\x1a\\xd2\\x4c\\x45\\xe7\\x68\\x98\\xda\\xe8\\x06\\x5b\\xe3\\xa0\\xe4\\xd5\\xcf\\x1e\\x3f\\x9b\\xc5\\xc6\\xf6\\xef\\xaa\\x65\\xcd\\xb6\\x8b\\xb8\\x69\\x8e\\x50\\x99\\xbb\\x91\\x42\\xfe\\xd5\\xd8\\xa0\\xf9\\x28\\x02\\x5c\\x11\\xab\\x11\\x43\\xd0\\xd2\\xf0\\x51\\x7d\\x3e\\xd1\\xe9\\x53\\xb7\\xf3\\x6a\\x7f\\x50\\x15\\xd6\\xaa\\x5a\\x2c\\xdb\\xed\\xa0\\xc8\\x69\\x93\\xc4\\x64\\x57\\xaa\\xae\\x84\\xdb\\x22\\x45\\x9e\\xd4\\x08\\x4f\\x18\\xc3\\x03\\x2d\\x14\\xa3\\xd6\\xaf\\x19\\xb5\\x48\\x36\\x26\\x89\\x0e\\xb9\\xe9\\x26\\x22\\x39\\x6b\\xd7\\x24\\x11\\x3b\\xdc\\x05\\x4a\\xef\\x6a\\x9d\\x46\\x96\\x0d\\x6f\\x8e\\x05\\x1a\\xa3\\x6d\\x8c\\xbc\\x66\\x37\\x7d\\xeb\\xd7\\x13\\x64\\x2c\\x4b\\x25\\xe6\\x75\\x11\\xb8\\x65\\x9b\\xa5\\x0e\\x16\\xe3\\x81\\xa1\\x4c\\x1f\\x7b\\xf6\\x41\\x1d\\xfd\\x1e\\xce\\xea\\x37\\xb8\\xb6\\x61\\x0c\\x59\\x3e\\x12\\xaf\\x1b\\x66\\x5c\\x75\\x27\\x5d\\x84\\x72\\xcb\\x45\\x9e\\xe2\\xca\\x41\\x31\\x72\\x84\\x07\\x6f\\x7f\\x09\\xd6\\x61\\x43\\x0e\\x59\\xe0\\x4f\\x06\\x1e\\x3d\\x51\\x43\\x2c\\x45\\x08\\x4e\\x33\\x8a\\x88\\x42\\x52\\xe6\\x19\\x69\\xb8\\xf5\\x5f\\x1e\\xcb\\x92\\x4b\\x4d\\x8a\\x19\\xc8\\x07\\xca\\x13\\x42\\x8c\\x87\\x1b\\x09\\x96\\x63\\x4a\\x8a\\x3f\\x76\\xb5\\x94\\xbe\\xea\\x46\\x14\\x26\\x02\\x3b\\xb5\\x74\\x33\\x3a\\x6a\\x6a\\xca\\x5c\\x83\\xe4\\x2f\\x8a\\x99\\x72\\x03\\x0d\\x5e\\xd6\\xc4\\xbb\\xd0\\x99\\xd3\\xbf\\xf8\\x1d\\x99\\x94\\xf4\\xb1\\x3a\\x55\\x0b\\x6a\\x7e\\x4c\\xd5\\x3b\\x4c\\xe9\\x7a\\x7b\\xe7\\xa0\\x33\\x31\\x89\\x40\\x52\\x1f\\x95\\x55\\x05\\x4f\\x11\\xe1\\x0a\\x97\\x08\\x27\\xc5\\xbf\\xa6\\x61\\xa7\\xed\\x7b\\xfa\\xbf\\x19\\xad\\xd1\\x9e\\xf9\\xa5\\x7f\\xa4\\x15\\x86\\x36\\x7e\\x8c\\x2a\\x76\\x94\\xd4\\x32\\x05\\x98\\x66\\xab\\xd8\\xf5\\xb3\\x1c\\xfc\\x1d\\x49\\x2a\\xbc\\x51\\x75\\x84\\xf6\\xee\\xc5\\x88\\xe7\\xa1\\x85\\x61\\x27\\x9c\\xa7\\x8f\\xbd\\xf1\\x3c\\x44\\x47\\xf5\\x20\\x8b\\x95\\xae\\xe4\\x25\\xc4\\xc7\\xbc\\xa7\\x10\\x20\\x96\\xad\\x56\\xde\\xd7\\xfb\\x4b\\xf0\\x90\\xf6\\x25\\x92\\x9d\\xd2\\x65\\x83\\xf0\\xfe\\xdf\\xab\\xb8\\xf6\\xdf\\x8e\\x2b\\x58\\xf7\\xbf\\x61\\x18\\xef\\xa9\\x7c\\xea\\x6b\\xe0\\x46\\x7c\\x23\\xc7\\x6e\\x13\\x58\\xf3\\x0f\\x81\\xed\\xd9\\x7b\\xd9\\xde\\xb9\\xdf\\xd4\\xe5\\x76\\x65\\x07\\x2b\\x17\\x24\\x7d\\x48\\x3e\\x44\\x4e\\x00\\x6c\\xf7\\x0c\\xd2\\x2a\\xc6\\xeb\\x84\\x3d\\x18\\x03\\xc7\\x23\\x23\\x54\\x2e\\x5e\\x97\\xbf\\x99\\xbb\\xc4\\x3c\\x95\\xde\\x0e\\x70\\x21\\x43\\x1d\\xba\\x17\\xa6\\x17\\xce\\x5c\\x27\\x04\\x52\\x28\\xb9\\xd3\\x27\\x83\\xbf\\x4f\\xff\\x7e\\xbb\\xe1\\xf8\\x12\\x36\\xe3\\xc2\\x66\\x18\\x90\\x1e\\xbd\\x06\\xf6\\xc7\\xf8\\x5b\\x8a\\x89\\x35\\xb6\\xc1\\x18\\x90\\xa1\\xfd\\x63\\xdf\\x01\\x9f\\xf5\\x1a\\xac\\x9a\\xdf\\x14\\xed\\x8c\\xbc\\x24\\xc1\\x07\\xcd\\x7c\\x3b\\xc4\\x8c\\x07\\x16\\x3f\\x3e\\xda\\x6a\\x44\\xc3\\xdf\\xb0\\xaf\\x08\\xf3\\x44\\x3d\\x47\\x25\\xfa\\xc6\\x10\\x0a\\xa0\\x63\\x12\\xf8\\x90\\x26\\x9b\\x42\\xc5\\xdf\\x60\\x14\\xdb\\x9e\\xcd\\x57\\xa9\\x65\\x27\\xe1\\xe0\\x82\\x44\\xd4\\xa9\\x27\\xec\\xd2\\xb4\\xb4\\x30\\x87\\x01\\xf9\\x9b\\x86\\xa0\\x6d\\x58\\xa3\\x9f\\x27\\x27\\x9a\\x11\\xfd\\xd1\\xfa\\xe2\\xc4\\x89\\xf6\\x8f\\x0d\\x92\\x5f\\x1c\\x48\\x25\\xc5\\xe8\\x50\\x6a\\x10\\x74\\xb5\\xbd\\xa9\\x82\\x48\\xaf\\xb3\\x4d\\x1e\\x8f\\x3e\\xc7\\x1d\\xb3\\x79\\x46\\x05\\xb8\\x4b\\x7b\\x34\\x35\\x6a\\x3d\\xe6\\xa9\\xaa\\xba\\x98\\x89\\x0e\\x09\\x75\\x46\\x42\\xa0\\x3f\\x42\\x03\\x77\\xeb\\x7f\\x37\\x0d\\x10\\x14\\x4a\\xe2\\xb5\\x13\\x9c\\x2c\\x88\\xb4\\x3f\\x40\\xd5\\x90\\xff\\x55\\x96\\x3a\\xf7\\x88\\xa7\\xaa\\x9b\\xec\\x97\\x43\\xdb\\x68\\xc4\\x3f\\x90\\x6d\\xda\\x22\\x19\\x86\\x45\\xb5\\x26\\x39\\xe2\\x20\\x6e\\x30\\x78\\x0d\\x26\\x13\\xb5\\xaa\\x18\\x38\\xcd\\x34\\xac\\x92\\xe5\\x91\\xa4\\x07\\xec\\x1f\\x78\\x86\\xb8\\x51\\x85\\x97\\x76\\xd0\\xdd\\xfb\\x7e\\x37\\xe4\\x67\\xfa\\x42\\xbe\\x22\\x0b\\xd1\\xec\\x98\\x33\\x73\\x67\\x2e\\x3c\\xba\\x9f\\x38\\x2f\\x86\\xa2\\xb9\\x8b\\x3a\\xd0\\x69\\xa2\\xb6\\xbe\\xcd\\x09\\xb2\\x87\\x87\\x57\\x54\\x36\\x1a\\x45\\xf4\\x22\\x06\\x6c\\x53\\x6e\\x6f\\x66\\xef\\x1c\\xb3\\xa0\\xcf\\x70\\xb8\\x89\\xd7\\x17\\x3c\\xe3\\xd5\\xd7\\xb2\\xd8\\x56\\x1a\\xd3\\x70\\x72\\xb5\\xea\\x50\\xc3\\x66\\xec\\x1a\\x08\\xac\\x02\\x96\\x56\\xc2\\x27\\xa9\\xf1\\xca\\x42\\x1d\\xe3\\x3f\\x37\\x9f\\x47\\xa5\\x7a\\x43\\x88\\xf8\\x17\\x3a\\xe6\\x20\\xea\\x28\\x4f\\x7d\\x2a\\x5a\\x46\\x50\\x04\\xb4\\x6e\\x96\\x3a\\xbe\\x32\\x06\\x4b\\xdf\\x98\\xb3\\x40\\xad\\x7a\\x42\\x08\\x53\\xd0\\x48\\x80\\xaa\\x03\\x2a\\xcc\\xd4\\x0c\\xdd\\x40\\x96\\xe3\\x5f\\x6c\\xfa\\xd4\\x99\\xad\\xc8\\x19\\x04\\xe3\\xa5\\x51\\x8d\\x03\\x10\\x21\\x57\\x32\\x3b\\xea\\xb6\\xa5\\x9d\\x3e\\x01\\xac\\xea\\xa0\\x70\\x6b\\x6f\\x8c\\x64\\x74\\x80\\xfb\\x64\\x85\\xf9\\x0d\\x34\\xc5\\xe1\\xfc\\x9d\\x24\\x24\\x45\\x20\\x85\\x53\\x62\\x97\\x11\\x83\\xe1\\x21\\xed\\x96\\xaf\\x70\\x86\\xe3\\x54\\x06\\x8b\\x4b\\xf1\\x46\\x21\\xef\\xfb\\x4d\\xf0\\xf1\\x7e\\xca\\x25\\x79\\x72\\x4d\\xab\\xbd\\x9c\\x3f\\x29\\xca\\xe2\\x2c\\x04\\x9d\\x58\\xda\\x78\\xb0\\x82\\xd8\\xb2\\x5d\\xdc\\x23\\x7d\\x08\\x99\\x2a\\x84\\xaa\\xfa\\x17\\xfa\\x37\\x45\\x75\\xec\\xb2\\xa6\\x31\\xf0\\x1a\\xf2\\x87\\x93\\xdf\\x9d\\x3f\\x84\\x6f\\x6a\\x9b\\x3f\\x36\\x5c\\x92\\x6f\\x78\\xb3\\x2b\\xcb\\xf0\\xbe\\xb3\\x41\\x2d\\x0b\\x0f\\x03\\x37\\xe1\\xe2\\x72\\x18\\x8a\\x63\\xc4\\xf4\\xb4\\x54\\x19\\xc0\\x06\\x87\\x40\\x37\\x9f\\xb9\\x83\\x4c\\x8a\\xed\\x5a\\x8c\\x79\\x1d\\x16\\xaa\\xaa\\x8e\\x18\\x6a\\xc7\\x87\\x5c\\x21\\x36\\x4b\\x91\\x98\\x85\\x9a\\x17\\xd0\\x10\\x7c\\x7d\\x47\\x7d\\x47\\xd6\\xb4\\x47\\xfc\\x37\\x8e\\x33\\xb0\\x1d\\x55\\x54\\x81\\x86\\x9e\\x44\\x9b\\x6c\\xad\\x55\\x09\\x1c\\xc9\\x39\\xda\\x70\\x8b\\x3f\\x5c\\xc1\\xfa\\x8a\\x46\\x99\\x8b\\x82\\x4c\\x8d\\x60\\xc3\\xe7\\x8e\\x59\\xea\\xb8\\xa5\\x1c\\x1b\\xa9\\x91\\xc3\\x71\\x90\\xae\\x3d\\xbe\\x1b\\x9a\\xee\\x8f\\xc9\\x01\\x45\\x85\\x28\\x99\\xfd\\xb6\\x03\\x5c\\x7c\\x6e\\x5e\\xb9\\xe7\\xc1\\x5a\\x16\\x70\\x25\\xe3\\x10\\x03\\x06\\x52\\x66\\xbd\\xf6\\xa4\\xeb\\x1c\\xbd\\x0a\\x31\\x8e\\x67\\x2a\\x28\\x27\\x0e\\xa0\\xc2\\x9b\\xda\\xbd\\xae\\xde\\x81\\xad\\xdb\\x4f\\x32\\x8e\\xbb\\x45\\x8d\\x28\\x6a\\x5f\\xb4\\x1b\\xbf\\x31\\x09\\x91\\x09\\xdc\\xc5\\x60\\xb6\\xe9\\xa6\\x7c\\x17\\x58\\xc3\\x09\\x64\\x7c\\x2e\\x62\\xf2\\x93\\x7a\\xf4\\xd6\\x26\\x0b\\x44\\xfb\\x49\\x28\\x6b\\xb9\\x1d\\xdb\\xd2\\x00\\x9f\\x34\\x7b\\x1d\\x40\\xa7\\xb0\\xd0\\x17\\x01\\x97\\xfe\\xad\\xb9\\x9d\\x3f\\x67\\xc5\\xca\\x3e\\x01\\x4c\\x7c\\xbe\\x85\\x75\\xb8\\x7c\\xdb\\xc7\\x6a\\x30\\x87\\x98\\xa5\\x8d\\x64\\x62\\x27\\x6a\\x1e\\xd8\\x23\\xa5\\x12\\x74\\x9a\\x9b\\xb0\\x10\\x93\\x77\\xc0\\x41\\xd3\\x20\\x23\\x1b\\x36\\xfb\\x0f\\xb6\\x2f\\x6c\\x96\\x93\\x01\\xf9\\xb0\\x7a\\x98\\x50\\x4b\\x0f\\xfe\\x0e\\x6c\\xca\\xd2\\x4f\\xd3\\x2b\\x20\\xcc\\x91\\x3a\\x18\\x73\\xfb\\xb9\\x20\\xea\\x86\\xf4\\xa3\\x88\\xea\\x63\\x87\\x68\\xd4\\x82\\x33\\xbe\\xc7\\xd0\\x84\\xe2\\xe8\\x01\\x9d\\xbf\\xc9\\x26\\xa9\\x14\\xd5\\xf9\\x48\\x9f\\x56\\x0c\\xbb\\x05\\x0d\\x13\\x10\\x95\\x37\\xa3\\xd9\\x36\\x56\\xd7\\x19\\x9d\\x92\\xdb\\x1e\\x35\\x06\\xf7\\x45\\x2c\\x4b\\x9b\\x89\\xfd\\xc7\\xcd\\xa5\\x56\\x61\\x32\\x55\\xfe\\x67\\x05\\x1f\\xe2\\x8e\\xa6\\x04\\x3f\\xd6\\xf4\\xbf\\xa8\\xae\\x21\\xa3\\x7b\\x78\\x89\\x11\\x52\\x3c\\xa8\\x46\\x6b\\x80\\xc3\\x93\\x59\\x37\\x09\\x75\\xae\\x53\\x06\\x60\\xc3\\xa3\\x29\\x8c\\x44\\x4a\\xf8\\x38\\x8a\\x6f\\xf6\\x57\\x7d\\x6a\\x0e\\x59\\x5f\\x46\\x5c\\x35\\xe8\\x8f\\xc5\\x5f\\x6c\\x38\\x8f\\xb3\\x1c\\x2a\\x22\\x79\\x19\\xdd\\x24\\xf9\\x54\\x57\\x4c\\x78\\xbe\\x5f\\xe6\\xf0\\xe2\\x4a\\xda\\xa7\\x56\\xf8\\x92\\x2a\\xf9\\xd0\\x1b\\x03\\x87\\xb3\\xa8\\x27\\x17\\x61\\x6f\\x58\\x91\\x98\\x38\\xb4\\x9b\\x67\\x9a\\xd6\\x2f\\x22\\x30\\x77\\x6b\\xcf\\x6e\\x9a\\x02\\x83\\xdc\\x22\\xab\\x1a\\x71\\xb7\\xfa\\x3e\\xc5\\x60\\x84\\xbd\\x56\\x35\\x4f\\x99\\x20\\x26\\x2c\\xba\\xcd\\x10\\x49\\xd1\\x95\\xf5\\xd2\\x48\\xee\\x11\\x3c\\x79\\x9e\\xdb\\x63\\x1a\\x80\\xae\\xec\\x16\\xb3\\x90\\xf9\\x2f\\x58\\x86\\x0d\\x9e\\x78\\xbe\\x83\\xe8\\x5c\\x0e\\x2a\\x4e\\x37\\x7e\\xd1\\x43\\x22\\x53\\x3c\\x64\\xdb\\x38\\x72\\x61\\xfe\\x3a\\x64\\xd3\\x15\\x65\\xde\\x99\\xf9\\x65\\xba\\x5e\\x03\\x25\\x8d\\x36\\x39\\xd2\\x4a\\x9d\\xb3\\xf0\\xc1\\xca\\x34\\x6b\\xa3\\x02\\x65\\x56\\xf5\\x06\\x26\\x14\\xce\\x2c\\x01\\xbf\\xf2\\xa0\\x1d\\x3b\\x3c\\x0c\\x7e\\xc9\\x92\\x83\\xa8\\x68\\xa5\\x2d\\x24\\xb4\\x46\\x3d\\x00\\x5a\\xf0\\x11\\xc6\\xd4\\x90\\xa5\\x5c\\xc1\\xfd\\x28\\x06\\xa8\\x66\\x1f\\x93\\x6e\\xce\\x8b\\x5f\\x87\\x50\\xa9\\x22\\xcb\\x6b\\x69\\xbc\\x0f\\x8f\\xb1\\xb1\\xdc\\xd6\\x36\\x2a\\xc8\\x98\\x0d\\x06\\x3f\\x15\\xa7\\x71\\x9f\\xcf\\x9a\\x47\\x13\\x5b\\x3a\\xc9\\xc0\\x62\\x2f\\x63\\x65\\xcb\\x92\\x4c\\x3f\\xa3\\xf7\\x52\\x99\\x0c\\x55\\xbc\\x32\\x8c\\xf1\\xb5\\x04\\x8a\\x26\\x12\\x6f\\x21\\x63\\x2b\\xf4\\x60\\xd4\\x86\\x98\\xcb\\x7d\\x09\\x10\\x3b\\x41\\x59\\x3a\\xa1\\x9e\\x44\\x0e\\xaf\\xcd\\x6a\\x42\\xc3\\x13\\x32\\x27\\xf1\\x0a\\x9e\\xe9\\xa1\\x46\\x31\\xfa\\xb6\\x0f\\xeb\\xe3\\xdd\\x9c\\x58\\xa5\\x55\\xb2\\x73\\x48\\x38\\x7a\\x3d\\xc2\\xd9\\x3f\\x2e\\x1d\\x66\\xcc\\xd2\\x9e\\xa4\\x6f\\x5b\\xce\\x03\\xbf\\x55\\x57\\x23\\xdb\\x86\\x9f\\xac\\xcb\\x8d\\xe4\\x30\\x36\\xb7\\x1d\\xf8\\xb8\\x1a\\xf8\\x51\\x5d\\x4b\\xa0\\xbd\\x73\\xfd\\x42\\x85\\xaf\\xe3\\x8a\\x82\\x75\\x35\\x21\\x24\\x20\\xe3\\xad\\x4e\\x18\\x9a\\xc5\\x1a\\x8a\\x3d\\x61\\x5a\\xb2\\xd1\\xc5\\x08\\x2e\\xbe\\xf9\\xad\\x49\\x36\\x32\\x94\\x62\\x20\\xcc\\x9c\\x30\\x97\\x81\\x81\\x09\\x33\\xad\\xd4\\x52\\xa7\\x49\\xca\\x09\\xc0\\xe2\\x50\\x30\\x7d\\xed\\x50\\x89\\x4f\\x8b\\xae\\xfc\\x51\\x69\\xb6\\xc0\\xf4\\xc3\\x37\\x9c\\x3d\\x94\\xcb\\x4e\\x02\\x2e\\xca\\xc4\\x87\\x2a\\x42\\x58\\x11\\x62\\x64\\x14\\x4a\\x7f\\x85\\x26\\xab\\x91\\xc7\\x5f\\x39\\x90\\x5a\\x7c\\x8a\\x36\\xc9\\x44\\x5f\\x80\\xe3\\xc8\\x55\\xb4\\x65\\xdc\\xf3\\xe3\\x61\\xa0\\x1a\\xef\\x94\\x43\\x4d\\x49\\xfe\\x13\\xf9\\xda\\xf7\\x82\\x52\\x65\\x7e\\x32\\x0a\\x9c\\x3b\\x77\\x41\\x54\\x94\\x04\\xda\\x2c\\x57\\x9e\\xb6\\x38\\xc5\\xc6\\x05\\xec\\x9e\\x17\\x38\\x8c\\x21\\x0f\\x20\\x44\\xae\\x7f\\x97\\x2a\\xc6\\xf0\\xdd\\xba\\xdd\\x7e\\x5c\\x15\\xe0\\x16\\x29\\xac\\x16\\xf9\\xd7\\xe0\\x2c\\x2f\\xb9\\x94\\x8e\\x49\\x44\\x15\\xc6\\x15\\xd4\\x8d\\x27\\x4e\\xe3\\x5d\\x2b\\x1a\\xab\\x1a\\xbe\\x69\\xea\\x70\\x48\\x3b\\xbf\\x38\\x37\\x8f\\x64\\x49\\xfd\\xc8\\xf7\\x48\\x68\\xd4\\xe5\\xd9\\x19\\x2b\\xe7\\x42\\x28\\x2e\\xf0\\x30\\x83\\x38\\x76\\x24\\x72\\xf1\\xcf\\x8d\\x5f\\x1c\\xa6\\xb6\\xaa\\x45\\x82\\x19\\xdd\\x5f\\x15\\xd4\\x79\\x22\\x01\\x5c\\x50\\xfb\\x7f\\x00\\xb6\\x11\\x49\\xee\\xa0\\xf4\\x98\\xc6\\x5d\\xf1\\xc1\\xd3\\xb1\\x01\\x73\\xdd\\xf5\\xa1\\x47\\x93\\x7d\\xb7\\xee\\x66\\xc8\\xfc\\x5c\\x1f\\x66\\x17\\x6d\\x1c\\xc2\\x99\\xb7\\x36\\x67\\xca\\x9c\\x9b\\x80\\x43\\x6f\\xf1\\x95\\x36\\x57\\xe1\\x2a\\xcc\\xfa\\x2e\\x45\\x9e\\xf7\\xdb\\xb2\\x83\\x6f\\x8b\\xe6\\x8e\\x87\\x3b\\x73\\x69\\x3e\\x57\\xfb\\xf9\\x99\\xab\\x20\\xbb\\x56\\x8f\\x5b\\xda\\xdf\\xcc\\x5e\\x2f\\x1d\\x3e\\xf5\\x3b\\xcf\\x97\\xd3\\x5e\\x36\\x5a\\xad\\x6e\\x2f\\x4e\\x64\\x77\\xb7\\xa9\\x7e\\x52\\x44\\x27\\x2f\\x98\\xf6\\x9f\\xa8\\xb4\\x7e\\xa7\\xe2\\xec\\xf3\\x7e\\xd9\\x9d\\x60\\x5e\\xb8\\x98\\xda\\x6d\\xa7\\x56\\xf0\\x60\\xa7\\x55\\xc9\\x16\\x9f\\x27\\xdb\\x5e\\x97\\xe0\\x7b\\xc2\\x04\\x91\\x24\\x6e\\x79\\x78\\x06\\xeb\\xde\\xbe\\xe9\\xaf\\x6e\\x7e\\x43\\xb1\\x3e\\xd8\\x64\\x08\\x23\\x8a\\x0a\\xaa\\x90\\xcd\\xc1\\x0b\\xec\\xb9\\xf3\\x6a\\xcd\\x0e\\xe3\\xad\\x04\\x1d\\x68\\xf8\\x45\\x86\\x0b\\x74\\x78\\x9e\\xa2\\x8b\\x4b\\x94\\x4a\\xc1\\x4d\\x83\\x0c\\x4b\\x99\\xcf\\x73\\x45\\x9e\\x71\\xa5\\x5a\\xc5\\x7c\\x63\\x95\\x06\\x9c\\x50\\x14\\xfa\\xe3\\x2c\\xba\\x2c\\x3b\\x93\\x8d\\xa2\\x34\\x44\\x9a\\x51\\x5e\\x48\\x93\\x59\\x51\\x1a\\x79\\xb2\\x29\\x5f\\xe4\\x1c\\x6b\\xa0\\xd0\\x54\\x22\\xdd\\xa7\\x66\\x82\\xcd\\x0c\\x27\\x1d\\x12\\xbb\\x90\\xc4\\x29\\x60\\xa5\\xf0\\x1b\\x58\\xa6\\x9d\\x60\\x64\\x20\\xef\\x69\\x2e\\xf2\\xc6\\x1a\\x15\\x8a\\x64\\x75\\xda\\x2f\\xdc\\x89\\xac\\x23\\xad\\x81\\xee\\xa7\\xcf\\x1c\\xfd\\xdb\\x3c\\xd8\\x99\\x08\\xb5\\x40\\xb9\\x89\\x95\\x08\\xe4\\x6e\\xc5\\x34\\x79\\x10\\xae\\x67\\xe0\\x00\\xd4\\x2d\\x0a\\xdc\\x01\\xae\\x76\\xd0\\xa9\\x57\\xa1\\x03\\xaa\\x1e\\xa2\\xcc\\xad\\xea\\x85\\x79\\x67\\x9b\\x38\\xb8\\xe1\\x68\\x30\\xf3\\x77\\x96\\xdd\\x51\\x06\\xdb\\x8a\\x21\\x4f\\x15\\x82\\x6e\\x61\\x6a\\xd9\\xa0\\x4a\\xbb\\x4d\\xaa\\xcf\\xa5\\x49\\xda\\x09\\x97\\x3b\\x82\\x70\\x85\\x3e\\x21\\x85\\x73\\x8b\\x67\\x4e\\xb8\\x73\\x58\\x5d\\x0f\\xdf\\xf2\\xb8\\x06\\x86\\xed\\xc2\\x19\\xca\\x26\\x2f\\x0e\\x0d\\xa9\\xe8\\xc5\\x4e\\x74\\x7e\\xf9\\x0f\\x5f\\x93\\x6f\\xd0\\x6e\\x2a\\xda\\x3a\\x94\\xd8\\x4d\\xb3\\x21\\xac\\x97\\x84\\x0f\\x42\\xcf\\x82\\x46\\xed\\x36\\xfb\\x5a\\x36\\x61\\xf6\\x53\\x6f\\xa7\\x46\\x0d\\x6f\\xb6\\x6d\\x25\\xce\\xf5\\xd6\\x0f\\x24\\x82\\x1b\\x0d\\x51\\x40\\xe9\\x5b\\x4d\\xbc\\x29\\xe2\\x24\\xcd\\x16\\xe1\\xd3\\x49\\xfb\\x6a\\xff\\x63\\x0a\\xb4\\xb2\\x55\\x8a\\xa8\\x0a\\x26\\x18\\xbf\\x4b\\x08\\x04\\xdd\\x56\\x5b\\x84\\x65\\x76\\x3d\\x12\\x9a\\x07\\x31\\xf7\\x27\\xc6\\xc2\\x65\\x62\\xd4\\x85\\xf7\\x98\\x8f\\x57\\x4d\\x40\\x06\\x65\\x07\\x45\\x2d\\x05\\x13\\x48\\x99\\x34\\x7a\\x18\\x45\\x2f\\x83\\x42\\x60\\xc4\\x66\\x9b\\xe9\\x92\\x62\\x19\\xda\\xa9\\x91\\x54\\x28\\x92\\x82\\x13\\x11\\xa8\\x19\\x90\\xce\\xb2\\xee\\x69\\x29\\xd9\\x2c\\xdf\\x15\\xd4\\xbc\\xe4\\xc3\\xc0\\xc4\\x5b\\x4e\\xe8\\x8e\\x40\\xb8\\xc6\\x41\\x9c\\x0d\\x88\\x45\\x98\\x32\\x73\\x49\\xe0\\xb4\\x81\\xfb\\x7a\\x64\\x22\\xe3\\xcd\\x29\\x60\\x20\\x7c\\x20\\x68\\x9d\\x31\\x3f\\xee\\x65\\x9a\\xb9\\x6a\\x00\\x33\\x05\\x22\\x33\\x71\\x3d\\x27\\x6f\\x09\\x72\\x93\\xec\\x7f\\x07\\x45\\x7a\\x1d\\x0f\\x98\\x3b\\x71\\x7c\\xda\\x19\\x0d\\x0c\\x50\\x52\\x07\\x30\\x64\\xe8\\x78\\x2e\\xa3\\x86\\x1a\\xc3\\x9c\\x74\\x36\\x3f\\x6b\\x2e\\x72\\x82\\x03\\x36\\xf4\\x9d\\xa4\\xb6\\x2f\\x98\\xa3\\x59\\xa5\\x3d\\x37\\x09\\xa1\\x44\\x4a\\xf1\\xeb\\xf2\\x3b\\x20\\xca\\x5e\\xfb\\x50\\xb4\\xb8\\xe3\\x8c\\x90\\xe8\\x8a\\xc0\\x5f\\x73\\xb0\\x6b\\x5b\\x4a\\x28\\x73\\x7e\\xad\\x38\\x2b\\x49\\x6d\\x2d\\x33\\x2d\\x4d\\x72\\xc3\\xba\\x0c\\x40\\x05\\x0c\\x26\\x40\\x1a\\x2f\\x69\\x11\\x03\\x91\\x04\\x49\\x3b\\xaf\\x05\\xa9\\xc2\\x1e\\xea\\x18\\x3c\\xad\\xb3\\x27\\x3a\\xa0\\xc6\\xc0\\x0a\\x14\\xa3\\x11\\x08\\x31\\x1d\\x9d\\x93\\xb3\\xb8\\xad\\x3f\\x9b\\x81\\x1c\\xdd\\x2f\\x89\\xf1\\xed\\xc2\\xbd\\x27\\x1b\\x70\\x17\\x24\\x78\\xfd\\xc1\\x6b\\xe4\\xc1\\x23\\x0a\\xbe\\x50\\x74\\x2c\\xe5\\xf5\\x33\\x00\\xe1\\xc3\\x7c\\xc2\\xc5\\x13\\x2a\\x94\\x85\\x57\\x56\\xcf\\xf3\\x9d\\x7d\\xda\\x80\\x21\\xb5\\x57\\x74\\x9d\\xfd\\xe9\\x36\\x48\\xcf\\x57\\x77\\xd2\\x91\\x3a\\xdf\\x75\\xf1\\x54\\xf2\\x7c\\x3c\\xef\\x54\\x9b\\xff\\x7a\\xd9\\x38\\xe1\\x5d\\x28\\x40\\x72\\x71\\x45\\xcd\\xc7\\x09\\x9f\\x73\\xd2\\x81\\x7f\\x36\\x05\\x02\\x5e\\x73\\xd8\\xc4\\x51\\xde\\xcb\\xd5\\xa0\\x67\\x51\\xe1\\x7b\\x44\\x3e\\x00\\x5b\\xa2\\x6f\\x4f\\xa2\\xa6\\x48\\xdf\\x5a\\x60\\x08\\x13\\x7b\\x00\\xc9\\x1a\\x70\\x04\\xc0\\xd7\\xc8\\x8b\\x60\\x64\\xba\\x5f\\x94\\x3c\\x09\\x88\\x77\\xdf\\x85\\x0e\\x3c\\x46\\xbe\\xf0\\x0e\\x05\\x92\\x14\\xdc\\x09\\x66\\xf2\\x0a\\x01\\x19\\x56\\x51\\x8a\\xab\\x19\\xc6\\x6b\\x38\\x60\\x03\\x00\\x51\\xc3\\x93\\x96\\x06\\xb1\\xa9\\x9c\\xb6\\xa0\\x40\\x27\\x97\\xba\\x87\\x09\\x81\\xaa\\xfe\\xc9\\xd2\\xc1\\xb8\\xb3\\xe9\\xb2\\xce\\x4c\\x07\\x33\\x75\\x39\\xc9\\x62\\xb3\\xb1\\x6e\\x90\\x30\\xf2\\x50\\xd7\\x8d\\x07\\x42\\x9b\\xb7\\xf0\\x81\\xd1\\x5b\\x84\\xf2\\xc0\\x85\\x02\\x7e\\x9e\\x10\\x5a\\x30\\xec\\x53\\x40\\xce\\x5c\\x72\\x52\\x2b\\x72\\xdc\\xf9\\x60\\x1a\\x2d\\x17\\x9c\\x0a\\x17\\xa4\\x7d\\x7a\\xd7\\x76\\x50\\x3c\\x0d\\x10\\xbf\\x5d\\x06\\xd3\\x2c\\x28\\x04\\x87\\x92\\x87\\xc0\\xa8\\xde\\xa6\\x58\\xab\\xf1\\x80\\xb8\\x44\\x38\\xc8\\x40\\x71\\xbc\\x3b\\xda\\x16\\x16\\xbf\\x01\\x47\\xb5\\xca\\xe0\\xb0\\x03\\x8d\\x66\\x96\\x93\\x21\\x10\\x8c\\x65\\xf4\\x22\\x5b\\xbc\\xc3\\x46\\x20\\x27\\x22\\x5b\\xad\\x76\\xa4\\xc9\\xc1\\x60\\x9a\\x14\\x10\\x2a\\xf1\\xc2\\xf1\\x59\\x56\\x5d\\x1c\\xec\\x9b\\x14\\xbe\\x5d\\x1c\\xe7\\x33\\x15\\x19\\xa9\\x0e\\xb4\\xde\\xfd\\x99\\xde\\x6b\\x38\\xb1\\xd4\\xec\\xc8\\xc0\\x17\\xe0\\x56\\x54\\xa7\\xed\\x86\\x07\\xdc\\x4e\\xfd\\xb0\\x5e\\x48\\x85\\x36\\x63\\xb6\\x08\\x90\\x1e\\xbc\\x5c\\xec\\x4d\\x7a\\x87\\xf6\\xa5\\x11\\x15\\xd3\\x05\\x54\\x83\\xb7\\x26\\x43\\x28\\x63\\x0a\\x24\\x40\\x31\\xc0\\x98\\x54\\xd0\\x09\\xa7\\x99\\x38\\xdc\\xf5\\x3c\\xf0\\x0d\\xbc\\xb8\\x6a\\x23\\xc4\\x2f\\xdd\\xf5\\x3c\\x41\\x23\\x19\\xb6\\x2e\\x22\\x7a\\x93\\xa1\\x3b\\x41\\x89\\xbe\\x49\\x8a\\x08\\xf6\\xb8\\x9c\\xd3\\x02\\x68\\x31\\x11\\x28\\x20\\xfc\\xb3\\xd8\\x8e\\xea\\x76\\x75\\x99\\xf3\\xd3\\xed\\xb6\\x82\\x7d\\xa5\\x52\\xd9\\x00\\x75\\xc5\\x10\\x5a\\xfe\\xc1\\x66\\xb2\\xd8\\x7d\\x92\\xee\\x69\\xcd\\x16\\x21\\xe0\\x47\\x4b\\xae\\x41\\xac\\x59\\x06\\xaa\\x8d\\x6b\\x80\\x1b\\x5d\\x52\\xd6\\xf6\\x34\\x1f\\xba\\x95\\x67\\xb8\\x30\\x72\\xa2\\x81\\x48\\x12\\xcd\\xe3\\xea\\xc1\\x37\\x8c\\x37\\xf8\\xcb\\x51\\x9c\\x2b\\xc8\\x89\\x11\\x79\\x14\\x51\\xed\\xba\\x99\\x96\\x10\\xef\\x9b\\xdd\\x63\\x60\\xe0\\xa2\\xb3\\xe0\\x91\\x8f\\xf9\\x0a\\x21\\x3d\\x3f\\x0c\\xa2\\xaf\\x12\\xcf\\x63\\x59\\xe8\\x55\\x03\\x1c\\xe8\\xaf\\x7b\\xdc\\xf8\\xcf\\x0e\\x08\\x49\\xc9\\x69\\xec\\xc7\\x36\\x22\\x5d\\xab\\x51\\xc8\\x70\\x6f\\x62\\xfd\\x03\\xdf\\x30\\x5c\\x52\\x61\\x0f\\x8e\\x61\\xda\\x4c\\xc2\\xc9\\x76\\x8c\\x95\\xc1\\xa2\\x65\\xe0\\xc1\\x1e\\x2e\\x82\\x5a\\xff\\x00\\x87\\x84\\xf6\\x01\\x00\\x05\\xdd\\x00\\xc0\\xb5\\x8b\\x00\\x08\\xaf\\xc2\\x61\\x42\\x72\\x75\\x0f\\x91\\x2d\\x16\\xdf\\x72\\xdb\\x79\\xea\\xa4\\xf1\\x4c\\xfb\\x09\\x21\\x93\\xc9\\x6f\\x76\\x15\\x6d\\xc4\\x96\\x5b\\xd7\\x56\\x88\\x28\\xdc\\xbf\\xc9\\xd6\\x06\\x49\\xe1\\x53\\x92\\x9e\\xc4\\x44\\xb8\\x27\\x1a\\x3b\\x3c\\x54\\x41\\xe4\\x4f\\xb8\\xb7\\x18\\x6c\\xfc\\x85\\xfc\\x2d\\xb0\\x1d\\x02\\xf6\\xbc\\x0a\\x88\\x36\\x43\\x06\\xcc\\x31\\xd9\\x79\\x28\\x22\\x41\\x46\\x85\\xae\\xba\\x42\\x24\\x5c\\x38\\xad\\xdd\\xd5\\x8d\\x39\\x21\\x1e\\xea\\x8e\\x7d\\xc9\\x10\\xf4\\x7b\\x30\\x82\\x50\\x75\\x0c\\x14\\xbe\\xd3\\xb8\\x29\\x20\\x24\\xcc\\x07\\xc6\\x4c\\x3d\\x8b\\x59\\x9d\\x82\\x8d\\x75\\xea\\xd8\\x77\\x38\\x37\\x34\\x82\\x96\\x08\\x05\\x29\\xe3\\x1b\\xb2\\x44\\xe5\\xac\\x79\\xb5\\xdd\\xca\\xc2\\x81\\xc5\\xe4\\x1c\\x7c\\x0e\\x2b\\x28\\xba\\x05\\x4b\\x99\\x03\\xc2\\x00\\x95\\xb0\\x73\\x71\\x09\\x69\\xd5\\xcc\\x89\\xaa\\x90\\x50\\x04\\x86\\x24\\xfa\\x90\\xe8\\x21\\x5d\\xc0\\x3f\\x01\\x87\\xc7\\x01\\x01\\x44\\x36\\x3f\\xf4\\xc0\\xb4\\x72\\xb9\\xd1\\x97\\x07\\x8a\\x00\\x2b\\xb3\\x72\\xbe\\xd2\\xed\\x3c\\x4d\\xae\\x9d\\x55\\x48\\xb5\\x8e\\x4f\\x88\\xba\\xc2\\x07\\xb1\\x4e\\x1c\\x6c\\x59\\xb8\\xa1\\xa0\\xfb\\x01\\x8d\\xa0\\xb5\\x55\\x1e\\xcb\\xb8\\x3f\\xc1\\x21\\x1b\\xe9\\x27\\x66\\xbf\\xca\\x5a\\xab\\xe8\\xa1\\x02\\x9a\\xe0\\xab\\x41\\xf0\\x2c\\x30\\xa7\\x85\\xbc\\x74\\x88\\x74\\xb7\\x8b\\x56\\x34\\x57\\x6d\\xa2\\x44\\x89\\xa6\\x0c\\x87\\x0d\\xc1\\x0e\\xae\\x36\\xef\\x93\\x69\\xe9\\x38\\xff\\x1f\\x27\\x5d\\x14\\x1f\\xe7\\x62\\x14\\x74\\x87\\x62\\x0d\\xf4\\x56\\xa7\\x22\\x24\\x47\\x88\\xd2\\x42\\xf4\\x84\\x69\\x71\\xe7\\x5c\\x28\\x67\\x89\\xc7\\x1d\\x82\\x80\\xbe\\xfb\\x15\\x84\\x6b\\x9c\\x4a\\x64\\x8f\\x06\\x46\\x6d\\x7d\\xef\\x07\\x90\\xc4\\xc8\\x7a\\x26\\x5d\\x63\\x30\\x33\\xfe\\xc9\\x6a\\x2a\\x21\\x7a\\xca\\xeb\\xd9\\x12\\xab\\xe2\\x4e\\x3d\\xf1\\x9c\\x3a\\xdb\\x4c\\x62\\x5d\\x61\\xfb\\x2a\\xec\\x45\\x3c\\x90\\xf2\\x8b\\x06\\x12\\xb7\\x24\\xc3\\x56\\x68\\x8a\\x30\\x16\\x34\\x92\\x6e\\x14\\x37\\x04\\x46\\xe8\\x57\\x90\\x44\\x6d\\x32\\xa3\\x06\\x2d\\x6c\\x24\\xdb\\xc6\\x99\\x77\\x7c\\xbb\\xc2\\x1b\\xb0\\x79\\x66\\xdc\\xbd\\x57\\x2c\\xca\\xcd\\x95\\xa7\\x61\\x1b\\xf8\\x4a\\x1d\\xb4\\x85\\xc4\\x84\\xdc\\xbb\\x93\\xb7\\x08\\x88\\xef\\xb5\\xd4\\x1b\\x6c\\x0c\\xb7\\x4f\\x1a\\x5b\\x94\\x47\\x2c\\x7c\\x5e\\x7e\\x2e\\xef\\x3d\\xcc\\x46\\x12\\xda\\xe3\\x13\\x5e\\xbc\\xac\\x8f\\xa6\\x15\\x0a\\x8a\\x1f\\x69\\x51\\x80\\x07\\x2d\\x3b\\x98\\x94\\x6f\\x06\\x94\\xcc\\x5b\\xc5\\x68\\xb5\\x62\\x94\\x44\\x43\\x8c\\x63\\x08\\x99\\x17\\x1b\\xa0\\x13\\xe9\\x61\\x80\\x18\\x5e\\x2a\\xe0\\xf0\\xd6\\x0c\\x6d\\x3e\\x48\\xb6\\xb8\\xff\\x14\\x16\\x48\\x9e\\xdc\\xc9\\x32\\xce\\x0a\\x79\\xf6\\x1d\\x7f\\x6c\\x43\\x74\\xa5\\x28\\x02\\x35\\xe2\\xdf\\x57\\xac\\x52\\xa2\\x5d\\xb2\\x6e\\x72\\x47\\x04\\x5c\\x04\\x53\\xca\\xe1\\x11\\x23\\xc7\\x27\\x11\\xdc\\xa9\\xce\\x51\\x10\\x6f\\xc7\\x94\\xfd\\x2b\\x2c\\x17\\x75\\xb6\\x94\\x17\\xeb\\xad\\x17\\xb8\\x1e\\xc7\\xa0\\x7d\\x34\\xdb\\x13\\x2f\\x02\\x91\\x9e\\x00\\xc9\\x54\\x75\\xa5\\x5d\\x05\\x93\\x42\\x3a\\x93\\x8c\\xf5\\x3e\\x7c\\x84\\x39\\x4e\\x99\\x5a\\x8e\\x24\\x5f\\xa6\\x7a\\x83\\xb0\\xec\\x09\\x81\\x6f\\xda\\x7a\\x1d\\x8e\\x25\\x26\\x28\\x04\\x8d\\x8d\\x08\\xb2\\x13\\xe0\\xeb\\x02\\xa0\\x0a\\x1a\\xee\\xd7\\xdb\\x05\\xa7\\x43\\xfa\\xe0\\x94\\x30\\xe7\\xef\\x3e\\x88\\x0f\\x2e\\x37\\xce\\x4c\\x47\\xb0\\x44\\x00\\x22\\x01\\x36\\x00\\x08\\xa2\\x90\\x58\\xf2\\xc4\\x1c\\xb7\\xb2\\xd7\\x2d\\x03\\x73\\x17\\x7e\\xa1\\xdb\\xa5\\xe2\\x89\\xd7\\x2b\\xe2\\x9a\\xf4\\x2d\\x8b\\xb8\\x5d\\x32\\x1a\\x39\\xc8\\xe8\\x93\\xbb\\x12\\xef\\xa9\\x0f\\x4f\\x4b\\x26\\xaf\\xb5\\x56\\x10\\xe5\\x2d\\xf7\\x97\\xa2\\x3f\\x10\\xf5\\x81\\x04\\x88\\x18\\x2f\\x74\\x96\\x2e\\x26\\x82\\x69\\x0f\\x83\\x52\\x32\\x1e\\x83\\x31\\x74\\x28\\x9e\\x59\\x7d\\x66\\x54\\x1e\\x2f\\x74\\x90\\x96\\xd1\\xfc\\x09\\xe5\\x0b\\x43\\x82\\x5e\\x15\\xe9\\x3c\\x11\\xbc\\x9c\\xa1\\x8e\\xa2\\xe1\\x48\\x26\\x84\\xa8\\xb8\\x60\\x44\\x94\\x07\\x32\\x3f\\xd3\\xd2\\xe3\\x6c\\xb4\\xb2\\x27\\x8c\\x66\\x05\\xb6\\x57\\xb5\\x00\\x98\\x2d\\x79\\x01\\x40\\x51\\x21\\xcf\\xd6\\x94\\x18\\x33\\x00\\x11\\x94\\x53\\x58\\x00\\x8e\\x88\\xdf\\xf8\\x8e\\x10\\x44\\x33\\x02\\xd3\\xd0\\x5c\\xd2\\x03\\x7e\\x44\\x8d\\xef\\x75\\x4c\\x4a\\xc6\\xe8\\xc0\\x52\\xcc\\x01\\x70\\x12\\x71\\x14\\xce\\x0e\\xaa\\xc1\\x17\\x68\\x7d\\x82\\x14\\x51\\x5a\\xb1\\x59\\xfc\\x04\\x3c\\x31\\xbf\\xe5\\x32\\x0e\\x48\\xfb\\xb2\\x18\\x4e\\x21\\x2c\\xf5\\x7e\\x57\\xd4\\xc4\\x50\\xff\\xf1\\x0d\\x9f\\xeb\\x81\\xf5\\x61\\xa1\\x3f\\xb5\\x05\\x32\\x76\\x92\\x40\\x69\\x22\\x7b\\xc1\\x04\\x37\\xb1\\x12\\xd6\\x52\\x73\\xb8\\x0e\\x1e\\x64\\x4c\\x29\\x7d\\xdc\\x9e\\x09\\xec\\x31\\xfe\\x6a\\x5f\\x9f\\x81\\xb2\\x5f\\x13\\x7e\\xa2\\xc9\\x01\\x6a\\x00\\x0a\\x29\\x41\\xd0\\xec\\xd0\\x0d\\x80\\x78\\x9e\\x0b\\x23\\x98\\xc4\\x5b\\xa1\\x7c\\xc8\\x3a\\x0b\\x99\\x7f\\x5f\\xcc\\x10\\x54\\x3f\\x4e\\x7e\\xee\\x2c\\xab\\x2a\\x3f\\x1f\\xc4\\xcd\\x58\\xf5\\x88\\x0e\\xb3\\xcb\\x51\\x13\\x55\\x8e\\xa4\\x4f\\xe8\\xba\\x5a\\x18\\x44\\x22\\xc3\\x58\\x89\\xa2\\xec\\x0b\\xb1\\xde\\x0b\\xcb\\xf0\\x87\\xfc\\x75\\x3e\\x00\\xd6\\x26\\xc4\\x66\\x0e\\xe5\\x46\\x43\\xee\\xf2\\xea\\x98\\xde\\x4c\\xae\\x61\\x79\\x70\\xee\\x05\\x8a\\x6f\\x66\\xf8\\xbd\\x25\\xa6\\xf2\\x3e\\xb4\\x09\\x68\\x2d\\x42\\xeb\\x86\\x2b\\x81\\x77\\x34\\x52\\xfe\\xa8\\x40\\xd9\\xff\\x5c\\x16\\x1a\\xff\\xb1\\xf3\\xda\\x4b\\x59\\x49\\x60\\x6d\\x8d\\xbe\\x80\\xa4\\x55\\x46\\x02\\x51\\x60\\xea\\x75\\xd8\\x86\\xd9\\xb7\\xe2\\xbd\\x05\\x81\\x85\\x75\\xad\\xc5\\x35\\x1e\\xb3\\x9e\\x28\\x74\\x9c\\xa8\\xa4\\x35\\x01\\x2a\\x22\\x71\\x5b\\xa9\\xf2\\x86\\x61\\xd2\\x74\\xb0\\xf4\\x90\\x54\\x0c\\x1f\\xde\\xee\\x53\\x17\\xf6\\x61\\x4f\\xd8\\x60\\xce\\x40\\xdd\\x68\\x60\\xd5\\x1c\\xda\\x39\\x76\\x4b\\x11\\x8b\\xe6\\x3a\\x7a\\x88\\x67\\x47\\x5f\\x0e\\xc3\\x16\\xba\\x23\\x10\\xbc\\x06\\xb2\\x53\\x70\\x14\\xb1\\x2b\\xb4\\x0a\\xa6\\x22\\xd1\\xd9\\xf2\\x79\\x09\\xfa\\xdf\\xb7\\xe0\\xc2\\xb0\\x32\\xbf\\xcc\\x47\\x55\\x1c\\x48\\xaf\\x80\\x55\\x71\\x36\\x90\\xe1\\x43\\xb2\\x5f\\x01\\xae\\xee\\xe8\\xb5\\xfc\\x12\\x82\\xb4\\x67\\x85\\x2b\\x0a\\xcb\\x69\\xd8\\xe2\\x4c\\x2a\\xf6\\xb8\\x2b\\x52\\xcb\\xe7\\x29\\x4f\\x1a\\x37\\x5c\\xe4\\xd9\\x37\\x90\\xf8\\x0f\\x69\\x2d\\xd1\\xa4\\x1f\\xf3\\x43\\xf1\\x32\\x51\\x67\\x43\\x70\\x74\\xf6\\xc9\\x2f\\xb1\\xed\\x3f\\x3c\\x82\\x4c\\x1c\\x85\\xa1\\x08\\xf2\\xeb\\x3a\\xb2\\xff\\x91\\x5a\\x56\\xaa\\x2b\\x41\\xc4\\x26\\x6b\\xf1\\x05\\xfb\\x0a\\x3c\\xbc\\xb0\\x2b\\xc4\\x2f\\x87\\xe4\\x3d\\xb2\\xaf\\x62\\xd3\\x8c\\x21\\x60\\xf5\\x21\\xbd\\xcb\\x2b\\xc3\\xe8\\xc7\\x45\\x32\\xd1\\x7f\\x0d\\x32\\x63\\x35\\x73\\x2e\\x18\\xa8\\x6b\\x05\\xe7\\x47\\x26\\xb7\\xfa\\x59\\x0f\\x61\\x28\\x09\\xf0\\x00\\x46\\x5d\\xf2\\xe6\\x74\\x41\\x21\\xe1\\x65\\xd1\\x0a\\x31\\xb0\\x2e\\xf9\\x48\\x5f\\xb5\\x3f\\x50\\x3e\\xf3\\x83\\x3d\\x87\\x8f\\x55\\x4a\\xf8\\x36\\x78\\x19\\xf3\\x66\\xd1\\x0d\\x94\\x16\\x71\\xed\\xc8\\x0c\\x0c\\x04\\x7c\\xe1\\x8b\\x2e\\x50\\x2c\\xb5\\xe0\\x66\\x27\\x14\\x6b\\x77\\x1b\\x0c\\xeb\\xd0\\xb8\\xa8\\x46\\xd3\\x33\\x15\\x19\\xd5\\x19\\x14\\x71\\x59\\x24\\x0f\\x09\\xb6\\x33\\x58\\x4d\\x4c\\xe4\\x9a\\xa2\\x2c\\x28\\xbf\\xf1\\x54\\x0b\\x7d\\x20\\x41\\x14\\x93\\x28\\xe5\\x31\\x1b\\xb8\\x4e\\xc6\\xac\\x00\\x9a\\x3f\\xfd\\x97\\x8d\\xd3\\x9f\\xaa\\xc5\\xc0\\x08\\x09\\x69\\x2e\\xd4\\xd3\\x64\\xde\\x27\\x1f\\x8b\\xa2\\x97\\x34\\x24\\x01\\x8c\\x50\\x8e\\x7e\\x32\\x8c\\xea\\xf6\\x9f\\x9b\\x69\\xd8\\xfa\\x22\\x80\\x5d\\xaa\\x7a\\xb5\\x46\\xdb\\xc6\\x0e\\xb6\\x27\\x9b\\x43\\x90\\x54\\xf2\\xfb\\x60\\x42\\x0c\\xf0\\x44\\x9b\\xaa\\x0e\\xaa\\x61\\xaf\\x96\\x80\\x6b\\xc6\\xc2\\x22\\x3b\\x10\\x74\\xda\\x7f\\xac\\xfe\\x0d\\x45\\x62\\x53\\x2a\\x49\\x7f\\xe0\\xe9\\xf4\\x67\\x15\\x24\\xff\\xb9\\xdc\\x66\\xa5\\xab\\x38\\x59\\xac\\xa7\\x26\\x08\\x79\\xb8\\xc0\\x2a\\xa9\\xfc\\x7e\\x08\\x5c\\x41\\x00\\xee\\x41\\xcd\\x37\\x01\\x10\\x71\\xd8\\xa7\\x46\\x21\\x2a\\xb9\\x42\\xc9\\xa7\\x2e\\x32\\x1b\\xb2\\x04\\x30\\x02\\x8c\\xb1\\x11\\x55\\xcf\\x17\\x73\\xb0\\xe2\\xe0\\xda\\xad\\x71\\x9a\\x8e\\x35\\xc3\\x09\\xf0\\x62\\xcf\\x0c\\x4c\\x52\\xcb\\x2a\\x8d\\x66\\x16\\xa4\\x74\\x4c\\xe9\\x8e\\xe6\\x10\\xfc\\x0c\\x70\\xd0\\xe9\\xb4\\x75\\x18\\x9b\\xea\\x81\\x88\\x3b\\x5a\\x53\\x4b\\xc0\\x05\\x04\\x2e\\xcf\\xbf\\x72\\x06\\x43\\xe4\\xc1\\x03\\x20\\x71\\xa1\\xc8\\x93\\x85\\x1a\\xac\\xc1\\xb4\\xcd\\x5d\\x12\\xe7\\xe8\\x7a\\x69\\x63\\xbd\\x9e\\x90\\x44\\xbe\\xa4\\x9b\\x95\\xce\\xa1\\x06\\xc0\\x7a\\x55\\x0c\\x23\\xce\\x8c\\x22\\x78\\x30\\x40\\x4e\\xec\\x88\\xb0\\x83\\x58\\x17\\x01\\x65\\xd1\\xcd\\x07\\x57\\x9e\\x47\\xe5\\x5a\\x7b\\x15\\x8b\\xe3\\x78\\x72\\x29\\x10\\x30\\x43\\xa9\\x80\\x0f\\x5a\\x65\\x45\\xbe\\x52\\x2a\\x2d\\xe4\\x03\\x8a\\x36\\xff\\xa2\\xf1\\x95\\x45\\xdb\\xd9\\xd6\\x1b\\xf0\\x86\\x80\\xac\\x7f\\x0a\\xd9\\x57\\x43\\xac\\x57\\x1d\\x39\\x1a\\x1b\\x2e\\x60\\x58\\xda\\x37\\xdd\\xd1\\xa4\\x92\\xb7\\xe0\\x64\\x8e\\x3f\\x08\\x00\\xf6\\x5d\\xc8\\x94\\xa2\\x60\\xd7\\x58\\x46\\x8c\\x93\\x48\\x4b\\xc9\\x27\\x40\\x98\\x3b\\xe6\\x55\\xb2\\x90\\xc6\\xc2\\x3a\\x2c\\x81\\x18\\xc3\\x27\\x38\\x44\\x3f\\xde\\xf1\\x28\\x3f\\x07\\xa2\\x0d\\x8a\\x3d\\x16\\x45\\x18\\x47\\x82\\x10\\xaf\\x5b\\x81\\x3c\\x33\\x9f\\xf5\\x60\\x57\\x9a\\xe2\\x25\\x98\\x53\\x1f\\x6f\\xcd\\x1d\\xce\\xed\\x5c\\x0b\\x32\\x20\\x26\\x46\\x27\\xb2\\x43\\x1b\\x59\\x8c\\x03\\x22\\xbc\\x7e\\x64\\xc5\\x1c\\x16\\x67\\xf0\\xe4\\x43\\xa3\\x16\\x42\\x6b\\xb3\\xe5\\xe0\\xa3\\x90\\x7c\\xce\\x3c\\xc1\\xe2\\xb3\\x6f\\x36\\xeb\\x9f\\x1f\\xbd\\xd7\\x5a\\x86\\xac\\x99\\x74\\x1e\\x0e\\x89\\x46\\x80\\x18\\xf2\\xbe\\xd4\\x26\\x0a\\xd5\\x7b\\x51\\x59\\xd7\\x29\\x7b\\x52\\xb4\\x38\\x49\\x18\\xc5\\xf6\\xc5\\x72\\x07\\x5f\\x58\\xa1\\x96\\x08\\x22\\xdb\\xc0\\xf2\\xd9\\x38\\x6c\\xed\\xc7\\x0c\\x2d\\x8e\\x38\\xb8\\x24\\x7d\\xf3\\x72\\x7f\\x11\\x6d\\xa6\\x71\\x73\\xe9\\x4a\\x05\\xbf\\x8a\\xe1\\x23\\x8f\\x5e\\x45\\x9d\\x60\\x59\\x81\\x59\\xb3\\xf4\\x8b\\xed\\x03\\xd7\\xaa\\x3b\\x12\\x15\\x42\\x2d\\x67\\x9c\\x59\\x20\\xdf\\x2c\\x48\\x50\\x0b\\x89\\x97\\xc2\\x41\\xa4\\x11\\x72\\x1b\\x53\\x70\\x72\\x61\\x3d\\x58\\x0c\\x0d\\x85\\x88\\x15\\x55\\xfa\\x87\\xbf\\x0f\\xca\\x97\\x4c\\x70\\x60\\xea\\x22\\xe1\\x0a\\x80\\x2e\\x6c\\x6f\\x4b\\x20\\x32\\x62\\xba\\x45\\x53\\x78\\x8c\\x45\\xe8\\xfc\\x39\\x11\\x78\\x26\\xa3\\xb1\\x51\\x32\\x78\\xd8\\x7e\\x22\\x14\\x60\\xdc\\x21\\x80\\xa9\\x44\\x84\\x57\\x6b\\x38\\xb9\\x0e\\x3a\\xdd\\xc0\\xe2\\x37\\x0b\\xa9\\x08\\xe3\\x91\\x78\\x86\\x99\\x72\\x38\\x7b\\x0d\\xf9\\x8a\\x08\\x74\\xb1\\xc5\\xc3\\x0b\\x08\\x25\\xe2\\xc0\\xac\\xa3\\xce\\xb8\\xfe\\xb1\\xf3\\x00\\xca\\xf9\\x73\\x3d\\x9f\\xde\\xbc\\x22\\xb4\\xde\\x7f\\xe1\\xba\\x58\\x49\\xc6\\xdc\\x7f\\x48\\xf2\\x88\\x4b\\xd6\\xab\\x8a\\x1f\\xe0\\xa4\\xb9\\xaa\\xfc\\x08\\xe2\\xe0\\x9c\\xc5\\x72\\xae\\xdd\\xb1\\x39\\x5c\\xf8\\xda\\xdc\\x1a\\x29\\x64\\x50\\x8b\\x25\\xab\\xe4\\xf9\\x62\\x45\\x0f\\x2f\\x2f\\x5c\\x51\\xb5\\xcc\\xf0\\xbe\\xb4\\xa3\\x2d\\x4a\\x3b\\x43\\x38\\x9a\\x13\\x8c\\x86\\x68\\x5f\\x90\\xbc\\x53\\x0b\\x77\\xf4\\xa4\\xef\\x7c\\x1c\\x18\\xd4\\x2c\\x8c\\xcb\\x3e\\x31\\xa0\\x2c\\x8c\\x70\\x08\\xd2\\xa1\\xac\\x2c\\x8c\\xc8\\xb7\\xcb\\x7d\\xe2\\xbc\\x3c\\x8a\\x68\\x9b\\x7b\\xb8\\x1d\\x86\\x10\\x1b\\xbe\\xf1\\x67\\xa7\\x57\\x40\\xcb\\x03\\xe6\\xe1\\xd3\\x4b\\xd5\\xf0\\xd2\\xd4\\x02\\x58\\xaa\\x37\\x55\\x22\\xc3\\x97\\x1b\\x41\\x4d\\xe1\\x5b\\xa2\\x3e\\x04\\x9d\\x76\\xa4\\x29\\x24\\x72\\x3b\\xe3\\x2d\\x27\\x5d\\x42\\xe6\\x34\\x82\\x6a\\x08\\x4d\\xb9\\x9d\\xb1\\x48\\x11\\x6f\\x81\\x15\\x77\\x3c\\xae\\x6a\\xb4\\x02\\x36\\x2f\\xb8\\x94\\xb2\\xae\\x55\\x0e\\xb0\\x70\\x4d\\x94\\x0d\\x10\\x1a\\xcd\\x10\\x4b\\x35\\x37\\xe6\\xa8\\xd1\\x37\\x0a\\xe7\\x06\\x89\\x74\\xdb\\x08\\x5d\\x96\\x5c\\x79\\xa4\\xcb\\x10\\x42\\xd3\\x58\\x1c\\x78\\x88\\xa7\\x91\\xdb\\x48\\xb2\\x17\\xe0\\x0b\\xdc\\xe8\\x51\\x76\\x33\\xad\\x1a\\x71\\xe3\\xd9\\x36\\xff\\x10\\x2c\\x30\\x3a\\xd7\\x97\\x33\\x97\\xfe\\xfa\\x8d\\x66\\xf1\\x1f\\xa5\\x50\\x41\\xdf\\x2c\\x45\\xe7\\x39\\x44\\x91\\x1a\\xd3\\x4a\\x8f\\x11\\x56\\x6d\\x19\\xbe\\x79\\x7c\\xce\\x11\\x3c\\xd2\\x03\\x93\\x0c\\x04\\xb5\\x46\\x44\\x63\\x33\\x79\\x8f\\x47\\x0b\\xf4\\xba\\xd1\\x46\\xb3\\x34\\x40\\x44\\x97\\x44\\xf2\\x61\\x69\\xb4\\xc2\\x79\\xe6\\xda\\x78\\xa2\\x73\\x68\\x21\\x64\\xc5\\x28\\x81\\xb7\\xd9\\x8a\\x84\\xf3\\xd9\\x64\\x4a\\xf9\\xfd\\x71\\xef\\x54\\x60\\xb3\\x21\\x67\\x61\\xd1\\x94\\x51\\xda\\xf4\\x82\\x6c\\x59\\x65\\x51\\x67\\xb5\\x33\\x0a\\x2f\\x9f\\x2a\\x50\\x56\\x39\\xad\\x8d\\x68\\xca\\x14\\xda\\x7c\\x83\\xb7\\x6f\\x02\\x48\\xb2\\xc1\\x77\\x2e\\x9e\\xeb\\x52\\x62\\x4e\\x66\\x65\\x25\\x77\\xb5\\x57\\xa2\\xe0\\xd8\\x5a\\x65\\x03\\xde\\xf3\\xc7\\xb9\\xb9\\x4e\\xd9\\xf8\\x3b\\x90\\x7c\\xf9\\xf0\\x08\\x05\\xc3\\x31\\x3f\\x01\\x18\\xfd\\xb6\\x7b\\xd5\\xcc\\x18\\x94\\xf3\\xff\\x60\\x59\\x68\\x9e\\xc1\\x87\\xd6\\x09\\xb2\\xe5\\x0f\\x82\\xc6\\xbb\\x88\\x50\\x7b\\x36\\xc7\\x35\\x3d\\xc6\\x32\\x33\\x5c\\x52\\x3d\\x38\\x39\\x3e\\xaf\\x38\\xb1\\xe4\\x8e\\x82\\xe6\\xe3\\x60\\x74\\x4c\\x12\\x06\\x60\\x08\\xd7\\xbc\\x3b\\x5a\\xa0\\xaa\\xf1\\xa1\\x45\\x6a\\x56\\xba\\xc0\\x07\\x65\\xb1\\xdf\\xad\\x19\\x21\\xb6\\x78\\x51\\xf4\\x7b\\xa5\\x91\\x00\\x2c\\x00\\x08\\x28\\xd0\\xed\\x39\\xf6\\x20\\x93\\x0c\\x21\\x7a\\xf3\\x93\\xba\\xf6\\xa4\\x16\\x9b\\x32\\xb6\\xcc\\x31\\x0c\\x7a\\xc1\\x00\\x00\\xd2\\x89\\x73\\x14\\xe7\\x66\\x4f\\xbb\\x52\\x9c\\x52\\xa9\\x39\\x36\\x50\\x12\\x23\\xb7\\x20\\x87\\x24\\x4b\\x47\\x0c\\xff\\x78\\xa9\\x6e\\x3e\\x4c\\x9c\\xb5\\xd6\\x8a\\x98\\xc2\\x8f\\x04\\x72\\x7b\\xd2\\xb5\\xb4\\x02\\x3d\\x72\\xc4\\x04\\xe5\\x77\\x3d\\x54\\x87\\x05\\xad\\x71\\x98\\x88\\x97\\x0c\\xcf\\x8b\\xe4\\x65\\xe2\\xd3\\x35\\x88\\x27\\x7c\\xf2\\xd0\\xc3\\xd4\\x10\\xb6\\x9c\\xa2\\x59\\x41\\xa2\\x08\\x08\\xaa\\x0c\\x90\\x40\\xa1\\x3f\\x62\\x18\\x25\\x93\\x25\\x36\\xc7\\x00\\xbc\\x89\\xe0\\x18\\x2d\\xd9\\x90\\x82\\xa5\\x25\\x31\\xc4\\xf6\\x38\\x14\\x9c\\xad\\xd2\\x88\\x25\\xe6\\xa0\\xc2\\x37\\x30\\x59\\xde\\xc1\\xb6\\x57\\x00\\xfc\\x25\\x84\\x93\\x05\\x43\\x21\\x2c\\xc6\\xdd\\x28\\x7b\\xef\\x87\\x6d\\x6a\\x91\\xae\\xa3\\xc3\\xa3\\xec\\xd8\\x8e\\x33\\x69\\x7c\\x00\\x9c\\xd4\\xd7\\xa0\\x4a\\x79\\x0a\\x51\\x67\\x6d\\xc3\\xea\\x91\\x54\\x36\\x86\\xac\\x38\\xdc\\x63\\x43\\x54\\xbe\\x0a\\x1e\\x9e\\xd6\\x15\\x36\\x9b\\x85\\x96\\x1a\\x34\\xd1\\xe9\\x51\\x90\\x09\\x47\\x21\\x65\\x9f\\x2e\\x52\\x79\\xc9\\x45\\x0a\\x38\\xdd\\x8b\\x65\\x78\\x12\\x8e\\x81\\x82\\x39\\xaa\\x01\\x3e\\x60\\x72\\x17\\xe8\\x67\\xe3\\x42\\x8a\\x8d\\x20\\xa9\\x85\\xf7\\x12\\x79\\x49\\xf7\\x44\\xc8\\x93\\x7d\\x20\\x78\\x4e\\xc3\\x28\\x54\\x90\\x33\\xe9\\x10\\x5e\\xa0\\xa7\\x16\\x51\\x83\\x18\\x70\\xf0\\x9b\\xf6\\x95\\xce\\x94\\x0c\\x57\\xbb\\xab\\x82\\x58\\xae\\xc3\\xf6\\x59\\x8e\\xc6\\x04\\x2c\\x71\\xb0\\x96\\x49\\x01\\x12\\x05\\x13\\xb9\\x43\\xb6\\x0f\\xe7\\x61\\x24\\xec\\xaf\\xab\\x9a\\x85\\x97\\x43\\xc9\\xe9\\x71\\x43\\x04\\x24\\x58\\x5b\\x2e\\x8f\\x79\\x7c\\xd7\\xdd\\x1e\\x7e\\xac\\x06\\x16\\xb4\\x47\\x35\\xab\\x21\\xfe\\x61\\x91\\x3d\\x52\\xde\\x52\\x7a\\x32\\xb5\\x66\\xdb\\x17\\xc0\\xd1\\x0c\\x9f\\xe7\\xb1\\x2f\\x35\\x78\\xda\\x15\\x21\\xde\\x4d\\x88\\x75\\x3f\\x39\\xa7\\x67\\x11\\x47\\xcc\\xc5\\xd8\\x5c\\xb8\\x09\\x7d\\x3d\\x05\\xf9\\x2c\\xa6\\x71\\xc9\\x2b\\x32\\x8b\\x23\\x03\\xa3\\x19\\x96\\x6e\\x66\\xda\\x11\\x72\\x98\\x84\\xdc\\xe7\\xd9\\x29\\xf1\\x1c\\x6e\\x6e\\xbb\\x0b\\x46\\x9d\\x6e\\x59\\x15\\xcb\\x73\\x45\\x66\\x39\\x17\\x85\\xc1\\x49\\xa1\\x4c\\xe1\\x82\\x28\\xd3\\x64\\xc0\\x62\\xfb\\x82\\x24\\x44\\x6a\\xaa\\x1d\\x2b\\xe5\\x95\\x04\\xac\\x1d\\x34\\x5a\\x73\\x4e\\x81\\x5c\\xa1\\x56\\x5f\\xd4\\xea\\x8a\\x74\\x88\\x69\\xf6\\x34\\xee\\xc2\\x30\\xbe\\xe1\\x2c\\x0d\\xb3\\x81\\x46\\x06\\xda\\x68\\x0b\\x45\\x44\\x10\\x25\\xd0\\x68\\xd4\\xd3\\xa8\\x6b\\x4a\\x0d\\x20\\x70\\xdb\\xbd\\x9e\\x16\\x18\\x87\\x4b\\x61\\x3e\\x11\\x6d\\xa4\\x74\\xa5\\xbc\\x4c\\x22\\xe2\\x34\\x32\\xcd\\x08\\x18\\xc0\\xb7\\xf1\\x2c\\x6b\\xb2\\x7f\\xad\\xfe\\xd6\\x30\\xec\\x95\\x8d\\xbc\\x5a\\xa5\\x1d\\xb6\\x28\\x9d\\xd0\\x33\\x38\\x19\\x3b\\x41\\xb6\\xbb\\x0c\\xbd\\x21\\x6c\\xdd\\x1f\\xc6\\xb6\\x9f\\x1a\\xdb\\xa0\\xb7\\x6a\\x37\\xb7\\x2f\\xc4\\x4a\\xdf\\x8d\\xad\\x82\\x84\\xd1\\x9e\\x20\\x8d\\x7f\\x75\\x0a\\x64\\x19\\xe8\\x69\\xc3\\x16\\xba\\xe8\\x06\\xc5\\xad\\x61\\x80\\x1e\\xf5\\xad\\xc7\\x8b\\x3f\\xd4\\xe0\\x01\\x00\\x00\\xff\\xff\\x55\\x1f\\x0f\\x9e\\xff\\x51\\x00\\x00\")\n\nfunc fontsRobotoBoldWebfontEotBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoBoldWebfontEot,\n\t\t\"fonts/roboto-bold-webfont.eot\",\n\t)\n}\n\nfunc fontsRobotoBoldWebfontEot() (*asset, error) {\n\tbytes, err := fontsRobotoBoldWebfontEotBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-bold-webfont.eot\", size: 20991, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoBoldWebfontSvg = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xbd\\x69\\x9b\\x1d\\xc7\\xb1\\x26\\xf6\\x79\\xf4\\x2b\\x72\\x20\\x5b\\xde\\x3a\\xc1\\x8c\\x88\\x5c\\x47\\xa2\\xae\\x79\\x25\\x8e\\x3c\\x12\\x7b\\x28\\xdd\\x4b\\x91\\xa2\\xc6\\x63\\x1b\\x4b\\x83\\x07\\x56\\x11\\x60\\x01\\xc5\\x12\\xd5\\x5e\\x7e\\xbb\\x9f\\x78\\x23\\xeb\\xf4\\x52\\x5d\\xa7\\x4f\\x37\\x9a\\x14\\x78\\xad\\x2f\\x40\\xf5\\xa9\\xac\\xac\\xac\\xcc\\xc8\\x88\\x37\\xd6\\xfc\\xc5\\x3f\\x7d\\xf7\\xf5\\xe0\\xe6\\xb3\\x37\\x6f\\x5f\\xbe\\x7e\\xf5\\xe1\\x23\\x7a\\x1c\\x1e\\xb9\\xb7\\xd3\\x93\\x57\\xcf\\x9f\\x0c\\xaf\\x5f\\x9d\\x7d\\xf8\\xe8\\xd5\\xeb\\x47\\xff\\xf4\\xcb\\x9f\\xfc\\xe2\\xdf\\xff\\xfa\\xd3\\x5f\\x7d\\xf6\\xe5\\xef\\x3f\\x76\\x6f\\xe7\\xaf\\xdc\\xef\\xff\\xf8\\xcf\\x9f\\xfc\\xa7\\x5f\\xb9\\x47\\xfe\\x83\\x0f\\xbe\\x90\\x5f\\x7d\\xf0\\xc1\\xaf\\x3f\\xfb\\xb5\\xfb\\xd7\\xcf\\x7f\\xe3\\xe8\\x31\\x7d\\xf0\\xc1\\xc7\\xff\\xf9\\x91\\x7b\\xb4\\x9b\\xa6\\x6f\\xfe\\xc3\\x07\\x1f\\xfc\\xf5\\xaf\\x7f\\x7d\\xfc\\x57\\x79\\xfc\\xfa\\xcd\\x57\\x1f\\xfc\\xe6\\xcd\\x93\\x6f\\x76\\x2f\\x9f\\xbd\\xfd\\xe0\\x5f\\x3f\\xff\\xcd\\x07\\xda\\xf0\\xd7\\x9f\\xfd\\xfa\\x83\\xb7\\xf3\\x57\\x44\\x8f\\x9f\\x4f\\xcf\\x1f\\xb9\\x5f\\xfe\\xe4\\x17\\xda\\xf5\\x77\\x5f\\x0f\\xaf\\xde\\x7e\\x78\\xc3\\xf3\\x1c\\x42\\xd0\\xf6\\x8f\\x7e\\xf9\\x93\\x5f\\x7c\\x7d\\x36\\x3d\\x79\\xfe\\x64\\x7a\\xf2\\xcb\\x5f\\x7c\\xb0\\xbf\\xfc\\xc9\\x2f\\x9e\\x9f\\xbd\\x78\\xfb\\xcb\\x9f\\xfc\\xe2\\xc5\\xeb\\x57\\x93\\x7b\\xf9\\xfc\\xc3\\x47\\x6f\\x5e\\x3f\\x7d\\x3d\\xbd\\x7e\\xfa\\x7a\\x78\\xfe\\xc8\\xed\\x5e\\xbf\\x79\\x79\\xee\\x9f\\x3c\\x9f\\xfd\\x77\\x1f\\x3e\\x22\\x4a\\x19\\x2f\\xd4\\xa6\\xfe\\xc5\\x93\\x67\\x67\\xee\\xdb\\x57\\x2f\\xa7\\xb7\\xfe\\x9b\\xb3\\x37\\xfe\\xec\\xeb\\x0f\\x1f\\x71\\x88\\xf5\\x91\\x7b\\xf2\\xf6\\xd9\\xd9\\xab\\xe9\\xc3\\x47\\x94\\xa5\\x3e\\x72\\xcf\\xcf\\xfa\\x9f\\x3e\\x52\\x78\\xe4\\x3e\\xd0\\x61\\xbc\\x7c\\xfb\\xf6\\xe5\\xab\\xaf\\xfc\\x57\\xc3\\xdf\\xbe\\xd9\\x5d\\x7d\\x45\\x5a\\xda\\xd8\\xbd\\x6f\\x5f\\xbd\\x7c\\xf6\\xfa\\xf9\\xd9\\x87\\x8f\\x7e\\xf6\\xd3\\xef\\x5e\\x3c\\x0d\\xf4\\xf3\\xeb\\x23\\xe2\\xd8\\x1e\\xb9\\xe7\\x1f\\x3e\\x3a\\xe5\\xe0\\x6a\\x29\\x33\\x87\\xb4\\xa3\\x4c\\x73\\x89\\x63\\x70\\x1c\\xa2\\x23\\x8e\\x8f\\x93\\x13\\x8a\\x8f\\xd3\\x24\\x29\\x3c\\x4e\\x8e\\x28\\x3c\\x4e\\x63\\xa9\\x2e\\x38\\x4a\\xd1\\x79\\x4a\\x8f\\xd3\\x44\\x25\\x3b\\x1f\\xe3\\xe3\\x34\\xf8\\xc8\\xce\\xb3\\x84\\xd1\\x17\\x71\\xcc\\xce\\x93\\xb0\\xf6\\x10\\x27\\x4f\\x92\\xf5\\x79\\x1e\\x3d\\x05\\x72\\x41\\x1f\\xa5\\xc7\\xc9\\xf9\\x98\\x27\\x8f\\xae\\x3d\\x49\\x9a\\x7d\\x89\\x3b\\x26\\x99\\xbd\\x8e\\xc5\\xe3\\xaa\\x96\\xb2\\xf3\\xdc\\x78\\xc6\\x05\\x65\\x3a\\x3f\\xad\\xdc\\x5c\\x98\\x29\\x54\\xde\\xe9\\x0d\\x8f\\x2b\\x6d\\x73\\x7e\\xf9\\xfb\\xaf\\x7c\\xac\\xcd\\xee\\x91\\x37\\x2f\\xcf\\xdc\\xf3\\xeb\\xd3\\xb6\\x35\\xcb\\xee\\x91\\x3b\\x7a\\x39\\x42\\x3b\\xb6\\xd7\\x9f\\xfd\\xf4\\xbb\\x27\\xe1\\xd8\\xc6\\xff\\xfe\\x7a\\xbb\\x54\\x6c\\x81\\x49\\xa2\\x0b\\x33\\xa7\\x6c\\xf3\\xa5\\x17\\x98\\x2e\\xdc\\x48\\x81\\xe7\\x96\\xa2\\xdd\\xd2\\x8b\\xd5\\x4c\\x5e\\x1e\\x0d\\xf3\\xf5\\xd1\\x64\\x25\\x6c\\x7d\\x4b\\x0a\\x8e\\x82\\xb4\\x39\\x71\\xdc\\xb1\\x84\\xd9\\x73\\x49\\x83\\xa7\\xa0\\x34\\x11\\xdb\\xce\\x13\\xd7\\xf3\\x53\\x29\\xf9\\xf6\\x56\\x37\\xbe\\xfc\\xa7\\x2b\\xfa\\xa5\\x4e\\xbf\\xb1\\xba\\x48\\x61\\xa6\\xdc\\x76\\x9c\\xf2\\x90\\xc8\\x71\\x0b\\x3b\\xcf\\xc2\\x33\\x15\\xda\\x71\\xe6\\xa1\\x88\\x8b\\x94\\x77\\x54\\x65\\x50\\xda\\xf4\\xf8\\xa3\\xf1\\x50\\xe2\\xfa\\x77\\xe6\\x30\\x7b\\x7d\\xd0\\x73\\x0a\\x83\\x4f\\xe4\\xbc\\xf6\\xc7\\x9c\\x66\\xaf\\xef\\xf0\\x9c\\xe2\\xe0\\x0b\\x6b\\xeb\\xb0\\xf3\\x54\\xe3\\x50\\xd8\\xd9\\x75\\xe3\\xc1\\x17\\xba\\xe1\\x0e\\x73\\x39\\x3f\\x8d\\xb5\\xba\\x54\\xda\\x8e\\x1a\\xed\\x47\\x49\\x5b\\x93\\xfd\\xdf\\xac\\x38\\x48\\x49\\xf6\\xbd\\x2d\\xbb\\x18\\xdb\\xc0\\x2e\\xed\\xb8\\xa6\\x51\\x37\\x93\\x44\\x97\\xb1\\x9f\\xa8\\xf1\\x44\\x49\\xf7\\x9a\\x4f\\x75\\x6c\\xba\\xd5\\x48\\xda\\xe3\\xe4\\x62\\x7d\\x9c\\x26\\xfd\\xc7\\x91\\xe8\\x26\\x0e\\xae\\xea\\x38\\xb1\\x2b\\x85\\x27\\x4f\\x49\\x5b\\xb5\\x34\\x7a\\x66\\xc6\\x3d\\x61\\xfd\\x85\\x6a\\x78\\x9c\\x26\\x4f\\xa1\\x3c\\x4e\\x8e\\xab\\x3d\\x4a\\xb9\\xba\\xfe\\x4b\\x51\\x16\\xc0\\x15\\x4d\\x39\\x3f\\x4e\\x33\\x53\\xda\\x51\\x6a\\xb3\\x67\\x2a\\x23\\x78\\x03\\x67\\xc7\\x05\\x43\\xa2\\x58\\xa6\\xa6\\x63\\xf0\\x42\\x71\\xf0\\xe2\\xbc\\x6e\\x73\\x7c\\x03\\x51\\x75\\xde\\xc6\\x57\\x75\\x38\\xe0\\x1c\\x39\\xba\\xd1\\xd7\\x0c\\x7e\\xc1\\x7a\\xbf\\xe9\\x58\\x22\\x38\\x0b\\x61\\x24\\xbe\\x54\\xa7\\xbc\\x47\\x1b\\x64\\x65\\x46\\x59\\xf4\\x8f\\x96\\x1e\\xa7\\x91\\x99\\x9c\\xaf\\xc5\\x09\\x17\\x34\\xa8\\x79\\xa2\\x80\\x71\\x70\\x29\\x98\\xb6\\xa2\\x3c\\x2c\\x14\\xfd\\xa1\\x4e\\x9e\\x1b\\x69\\x37\\x32\\x7b\\x6a\\x75\\xa7\\x33\\x32\\x53\\x2b\\xa3\\xa7\\x5a\\x1c\\x35\\xe7\\x25\\x34\\x87\\x71\\x4d\\x5e\\x47\\x2b\\x22\\x8f\\xd3\\xcd\\x6b\\xf7\\xdf\\x5e\\x5f\\xbb\\x44\\xd2\\xd7\\x2e\\x39\\x0a\\xad\\xcd\\x18\\x00\\x71\\x73\\x55\\xc7\\xcb\\x94\\x26\\xc6\\x17\\xd7\\x3c\\x52\\xd2\\x55\\x63\\x89\\xce\\x57\\x9d\\xdc\\x2a\\xce\\xb3\\x72\\xda\\xd9\\xf7\\x61\\x73\\x73\\xde\\x7e\\x8d\\x93\\x92\\xb9\\x36\\x1c\\x3d\\xa5\\xa0\\x13\\xa5\\x0f\\xd6\\x34\\xf9\\x1a\\x1d\\x53\\x3c\\x3f\\xe5\\xda\\xf0\\x4a\\x7d\\x32\\x55\\xa7\\xad\\x5b\\x79\\x9c\\xa6\\xc6\\xce\\x2b\\x65\\x8c\\x49\\xd9\\x39\\x16\\x50\\xff\\x9c\\x74\\x62\\x9d\\xb6\\xb0\\x31\\xa6\\xaa\\x94\\xe0\\x74\\xd5\\x26\\xdf\\xc8\\x45\\x90\\x43\\x03\\xcb\\xb6\\x6b\\x3c\\xe0\\xb5\\x81\\x0e\\xf0\\xfc\\x54\\xa8\\x39\\x90\\x3e\\x91\\x23\\x92\\xea\\x06\\xd2\\x15\\xd3\\x6d\\xae\\x3f\\x79\\xfd\\xed\\xfc\\xb4\\x34\\x52\\x72\\x5a\\x26\\xa2\\x3a\\x1b\\xef\\xc4\\x22\\x36\\x09\\x01\\x93\\x80\\xd5\\xec\\xd3\\x80\\x95\\x53\\x69\\xb4\\x9f\\x08\\x09\\xcb\\x44\\xa4\\x1b\\x27\\x42\\x27\\x54\\x9f\\xf5\\x35\\x62\\x96\\xe3\\xe3\\x74\\x7e\\xda\\x2a\\x08\\x19\\xf3\\x51\\x1c\\x1a\\xf5\\x19\\xd9\\x7f\\xd4\\x98\\x93\\x0b\\xae\\x89\\x93\\x02\\xea\\x76\\x14\\xc2\\x7e\\x42\\x8a\\x4d\\x48\\xb9\\x34\\x21\\xa3\\xcf\\x78\\x65\\xa3\\xa5\\x07\\xb7\\x9f\\x97\\xd2\\xe7\\x65\\x93\\xa3\\xe6\\x95\\x64\\x96\\xd8\\x59\\x6a\\x26\\x27\\x8d\\xfb\\xee\\xc8\\xc9\\x71\\x10\\xa5\\xf1\\x56\\x1d\\x95\\x8a\\xd7\\x56\\xa7\\xeb\\x48\\x41\\xdf\\x45\\xb9\\x4e\\x1e\\x33\\x46\\x09\\x5b\\xaa\\x88\\xa3\\x50\\x6d\\xf3\\x4d\\x46\\x07\\xf2\\x38\\x8d\\x94\\x9a\\xce\\x6d\\xaa\\xcb\\xba\\x4d\\xad\\x61\\x6e\\xa5\\xda\\x9e\\x6a\\xd8\\x6a\\xba\\x3f\\xda\\x04\\xde\\xe2\\x29\\xf2\\xe0\\x9b\\x38\\x9f\\xf3\\xc0\\xba\\xa7\\x85\\x79\\x94\\xec\\x72\\x70\\x29\\x2b\\x47\\x99\\x38\\x38\\x8a\\x75\\xc7\\x54\\x6d\\x65\\x94\\x6c\\xa2\\x53\\x5e\\xa9\\xcc\\x43\\xaf\\x42\\x1e\\x38\\x54\\x65\\xf3\\x71\\xf0\\x8c\\xad\\x2f\\xac\\x9c\\xb4\\xb8\\xda\\x74\\x9f\\x2b\\xcf\\xd2\\x7d\\x5a\\x74\\xc9\\x6d\\x9b\\xe9\\x2b\\x75\\xf7\\x8e\\x9e\\x49\\xc9\\xd4\\x4b\\x2c\\x8e\\x80\\x48\\xb0\\x0d\\x58\\x87\\x7f\\x7e\\x2a\\x49\\x5c\\x0c\\xa0\\x89\\xda\\x1c\\x3a\\x89\\xe0\\x06\\x31\\xea\\x22\\x2b\\x91\\x8b\\x72\\xc2\\xa0\\x63\\xd5\\xdf\\x03\\x63\\xdd\\x06\\x2f\\x21\\x38\\x89\\x75\\xf0\\xba\\xc1\\x49\\x46\\xb0\\xfb\\x58\\x9d\\xcf\\x98\\x92\\x26\\x78\\x93\\xcd\\x14\\xe9\\xab\\xa2\\x8a\\x39\\x0a\\x20\\x9f\\x28\\x8e\\xb1\\xc8\\x55\\x27\\x31\\x1b\\x1b\\x52\\x4a\\x19\\x6a\\x76\\x29\\x8f\\x29\\x3b\\xc9\\x4e\\x39\\xa4\\x2b\\x71\\x22\\xed\\xb1\\x8a\\x92\\x90\\x7e\\x88\\x32\\xa2\\xda\\xdc\\x04\\x5e\\xe5\\xa4\\x8d\\x1e\\x44\\xa7\\x1d\\x68\\xcf\\xd8\\x59\\xe8\\xaf\\x6e\\x71\\x99\\xff\\xee\\x1a\\xdd\\x88\\x84\\x4b\\x92\\x38\\xd4\\x39\\x25\\xee\\x32\\x36\\xb7\\x45\\xc6\\x56\\x39\\x20\\x63\\xff\\xfb\\x6b\\x3d\\x16\\xa2\\x8e\\x20\\x38\\xba\\x54\\xc2\\xcc\\x4a\\x8c\\xd2\\xd8\\x51\\x62\\x97\\xb3\\xee\\x2d\\x89\\xd1\\x49\\x8a\\x8f\\xd3\\x2e\\x0f\\x49\\x30\\xf3\\xa3\\xb2\\x67\\x23\\x23\\x66\\xfd\\x56\\xca\\x93\\x2e\\x8c\\x4f\\x29\\xeb\\x60\\x74\\xee\\x44\\x9a\\xeb\\x3f\\x29\\x71\\x5a\\xb3\\xaa\\x4b\\x62\\x9d\\xc8\\xce\\x6b\\x3f\\xad\\xcb\\x22\\x7b\\x89\\x8a\\x29\\x7d\\x6f\\xbe\\x79\\xf8\\xff\\xc3\\x6a\\xf8\\x9d\\xeb\\xea\\x68\\x24\\x94\\x51\\x49\\xa6\\x55\\xc7\\xd4\\x9c\\x50\\x99\\x5a\\x70\\x29\\xd5\\x19\\x03\\x12\\xc9\\xba\\xc4\\xce\\xc6\\x03\\x72\\x13\\x5d\\xb1\\x21\\x45\\x47\\x91\\x77\\x79\\xa4\\xa6\\x1c\\x39\\x38\\x49\\x0c\\x09\\x96\\xda\\x44\\xb6\\x87\\x72\\xa6\\xd9\\x63\\x6a\\xbc\\x28\\x3b\\xba\\xf8\\xd9\\x56\\xb1\\xb7\\xaf\\x8f\\xd3\\xce\\x6f\\x0c\\xfd\\x7f\\xbc\\x36\\xf4\\x16\\x6a\\x07\\xe7\\xc5\\x51\\x48\\x69\\x48\\xc5\\x51\\x29\\x03\\xb7\\x02\\x19\\x35\\x78\\x1d\\x60\\x2c\\x3b\\xaa\\xc5\\x88\\x57\\x92\\x0c\\x2a\\xc1\\x88\\xc3\\x90\\xb2\\x8a\\xbb\\xa0\\xe4\\x9d\\x75\\x4b\\x0c\\xac\\x44\\xc5\\x59\\x91\\x56\\x52\\x7e\\x41\\x61\\x80\\xf4\\xe3\\x86\\x0b\\xdd\\x65\\x95\\xf4\\xa6\\x72\\x0c\\xdd\\xa7\\xcd\\x71\\xd9\\x00\\x26\\xff\\xd3\\x0a\\x98\\x50\\xc7\\x99\\x49\\xa9\\x5e\\x81\\x26\\xef\\x24\\xf3\\x2c\\x2d\\xee\\xb8\\xe4\\xd9\\xeb\\x85\\x64\\xa5\\xc3\\xc4\\x3b\\x8f\\xab\\x48\\x0a\\x34\\x4b\\x9e\\x71\\x21\\x79\\xe3\\x5d\\x27\\xd7\\x21\\x2d\\xf7\\x69\\xc9\\xa2\\x2b\\xca\\x43\\x09\\x4e\\x38\\xce\\xcc\\x75\\xc7\\x35\\xce\\x9e\\x45\\xa7\\x23\\xe9\\x7c\\x50\\x52\\x74\\xb5\\xb1\\x77\\xfc\\xb5\\x8e\\x6b\\x58\\x28\\x9d\\xc4\\x25\\x52\\x4a\\x4f\\xbb\\x94\\xb5\\x47\\x4e\\x3b\\x9f\\x72\\xbc\\xb9\\x9f\\xc7\\xd7\\x07\\xd8\\x3a\\xeb\\x56\\xd6\\x73\\x13\\xe6\\xbe\\xb1\\x97\\x0f\\xae\\x8f\\x86\\x3b\\xd4\\xf3\\xa4\\xcc\\x97\\xd3\\x90\\x24\\x3a\\x4a\\x95\\xf4\\x2b\\x75\\x8b\\x40\\xf9\\xaa\\x8a\\x51\\xeb\\xc6\\xc8\\xc2\\x36\\x7e\\x4c\\x2e\\xe5\\x32\\x0b\\x93\\x2a\\x7a\\xb5\\x1a\\xa8\\x71\\x51\\xd9\\xff\\x24\\xc0\\x81\\xa4\\x3a\\xd9\\xc8\\xac\\xd0\\xcb\\x7e\\xf1\\xf8\\x69\\x22\\x93\\xc8\\x68\\x3b\\x7b\\xeb\\xc2\\xab\\x68\\xe9\\x88\\xcd\\xee\\x4c\\x46\\xed\\xba\\x8f\\x1b\\x98\\x37\\x1b\\xf3\\xce\\xe4\\xc8\\x30\\x1c\\x89\\xd8\\x0b\\xcf\\x4f\\x45\\x99\\xa5\\x34\\x03\\x64\\xd9\\x99\\x5e\\xc8\\x29\\x4f\\x5d\\x45\\xac\\x61\\x6c\\xd0\\x38\\x63\\x73\\x35\\x4c\\x0a\\x9c\\x53\\x9e\\xa5\\xb4\\x2e\\xe2\\x7c\\x62\\xc7\\xc9\\x18\\x75\\x0a\\x0e\\x10\\xd5\\xb7\\x66\\x4a\\xa6\\x4a\\x84\\x30\\x19\\x88\\x4f\\xd1\\xcd\\x5e\\x4a\\xbb\\x79\\xbe\\x68\\x73\\xbe\\xa8\\x28\\x90\\x69\\x75\\x56\\x11\\x96\\x14\\xc3\\xab\\xd2\\x19\\xfb\\x8a\\xce\\x04\\xb4\\xc8\\x6d\\x63\\x67\\xf3\\x66\\xbf\\x50\\x85\\x42\\x19\\x7d\\x72\\xd4\\x8a\\xa2\\x41\\x15\\x04\\x3a\\xc1\\x93\\x64\\x06\\x30\\xcf\\x58\\x85\\x84\\x55\\xc0\\xc4\\x13\\x95\\x89\\xb8\\x43\\x68\\x36\\x51\\xab\\xe0\\x0a\\x73\\xcf\\x26\\x36\\x58\\x4c\\x9c\\x37\\x56\\x76\\xca\\xba\\x19\\xb8\\xca\\x00\\x91\\x9b\\x49\\x89\\x91\\xe3\\xce\\xb7\\x16\\x67\\x55\\x44\\x62\\x21\\x97\\x42\\x1a\\x55\\x3c\\x10\\x15\\x47\\x11\\xc3\\x51\\x6d\\x41\\x6c\\xb5\\xc6\\x00\\x90\\x11\\xf7\\x84\\x31\\x79\\x02\\xc6\\x49\\xc0\\x20\\x7b\\x85\\x1e\\x03\\xcc\\x58\\x7e\\x63\\x79\\xa4\\x52\\xfc\\x00\\x89\\xca\\xf6\\xd4\\xa8\\x94\\x09\\x03\\xbb\\xbc\\x63\\x88\\x4c\\x85\\xb3\\xd9\\x80\\x85\\x52\\xa1\\x32\\x31\\x95\\x39\\xa3\\xbd\\xdc\\x94\\x97\\x94\\x27\\x50\\x1d\\x25\\x83\\x4c\\xc9\\x64\\xbf\\xe2\\x22\\x8c\\x19\\x22\\x5d\\x47\\xb9\\xf3\\x94\\xe3\\xcc\\xd4\\x76\\x94\\xe3\\xa8\\xe8\\xc4\\xec\\x19\\xda\\xe3\\xa4\\xc2\\x33\\x99\\x72\\x51\\xab\\xf3\\xfa\\x67\\x24\\xfd\\x62\\x7d\\x76\\xf4\\x95\\xdd\\x82\\x6f\\x62\\x9d\\x3c\\x38\\x2d\\x2b\\x25\\xa8\\x0a\\xc9\\x2e\\x8f\\x3e\\x3b\\x10\\x8c\\x28\\xbe\\xe5\\x49\\xa2\\x0e\\x85\\x96\\xbd\\x94\\xcd\\xd6\\x11\\xea\\x44\\x86\\x3c\\x25\\x54\\x07\\xcc\\xa5\\x73\\x17\\xc0\\xb6\\x6d\\xb0\\x30\\x89\\x00\\xae\\xa9\\x1a\\xa3\\x6b\\x51\\x0d\\x60\\x08\\x4f\\xa6\\xe4\\xb0\\x21\\x1e\\xf0\\x76\\x8a\\xa9\\xab\\x55\\xd8\\x7d\\x46\\x0f\\x00\\x4a\\xa3\\xe7\\x20\\x06\\x9d\\x30\\x39\\xa1\\x5c\\x2c\\xa0\\x84\\x4d\\x15\\x26\\x6e\\xae\\x4d\\x2a\\x2e\\x36\\x1a\\x72\\x88\\xae\\xe5\\xb4\\xe3\\x16\\x67\\xdf\\x28\\xee\\x28\\x27\\x25\\xad\\xac\\xb3\\xab\\xbc\\x81\\xb0\\x3f\\x68\\xc6\\x45\\x6a\\xf1\\xfc\\x54\\xb8\\xb9\\x14\\x79\\x27\\x92\\x54\\xff\\x1f\\x7c\\x76\\x3c\\x78\\x86\\xde\\x7d\\xf3\\x28\\xd2\\xf6\\xa6\\xa4\\x85\\x44\\xd2\\xc0\\x55\\xf9\\x0a\\x66\\xb1\\x18\\xfa\\xd3\\x05\\xec\\xe8\\xcf\\xa8\\x84\\xb1\\xc4\\xfa\\xcd\\x3a\\x35\\x5d\\x11\\xae\\x46\\xdc\\xc4\\xd9\\x98\\x48\\x80\\x1e\\x1c\\x5d\\xc9\\xa3\\xd2\\x9b\\x69\\x9d\\x36\\xad\\x93\\xb7\\x39\\x57\\xee\\xcb\\x90\\xc5\\x43\\x8d\\xae\\x12\\xed\\x2a\\x76\\x94\\xc4\\x9d\\x4f\\x45\\x06\\x1f\\x81\\x6d\\xf2\\x18\\x83\\x93\\xe0\\x9a\\xce\\x95\\x0e\\x45\\x75\\x60\\xb0\\x54\\x1d\\xb6\\x13\\x4e\\xa6\\xb2\\x96\\x89\\xc8\\x16\\x2e\\x63\\x33\\xeb\\x6d\\xd3\\x64\\x75\\xbd\\xda\\xe4\\xa5\\xa3\\x4a\\x51\\x84\\xcc\\xb6\\xd3\\x14\\x0c\\x51\\xe8\\x6c\\xb4\\x3a\\x51\\xf0\\x7f\\xf3\\xf4\\xe5\\x6d\\x19\\xd0\\x5c\\xca\\x6d\\xe6\\x0a\\x63\\x5f\\xcd\\x4e\\x09\\x2e\\xa6\\x34\\x45\\x05\\xf2\\xb9\\x8d\\xd5\\x66\\xcc\\x8c\\x0a\\x30\\xf3\\x19\\x57\\x51\\x3a\\x1b\\x74\\xb6\\x54\\x15\\x1b\\x7d\\xce\\x4e\\xd7\\x8f\\xa8\\xc0\\xd0\\x67\\xba\\x31\\x18\\x05\\x81\\x37\\x08\\x48\\x8f\\xc9\\xb4\\x72\\x8c\\xb9\\x44\\x53\\xc1\\xb5\\x23\\xe5\\xde\\x63\\x6c\\x2e\\x29\\x6e\\x89\\xca\\xde\\x29\\x2b\\xaa\\x1f\\xa9\\x81\\xe9\\x05\\x9b\\x27\\xdb\\xf4\\x14\\x0c\\x47\\x89\\x69\\x29\\xc0\\x8c\\x66\\x57\\xf4\\x92\\x65\\xf2\\x0b\\x8b\\x8c\\x32\\x7a\\x16\\x9b\\x2a\\xe5\\xb1\\x30\\x87\\xd8\\x0e\\x8e\\xd0\\xd9\\x4f\\x45\\x81\\x9e\\xcd\\xb8\\x4a\\x90\\x6c\\xdc\\x33\\xe7\\x89\\x72\\x36\\xd8\\x3f\\xb6\\x00\\x91\\x03\\x15\\x52\\x29\\x46\\xe9\\xc8\\x51\\x5b\\x28\\x86\\xa0\\xab\\x50\\xcb\\xda\\x6f\\x71\\x25\\x8d\\xbe\\xd2\\x9e\\x33\\xb0\\xe2\\xdd\\xea\\x7c\\xa1\\xd9\\xb7\\x0d\\xd5\\xaf\\x6c\\xae\\x4d\\xd6\\x17\\x08\\x01\\x82\\x50\\xe0\\x06\\x0c\\x32\\x42\\xb1\\xf7\\x5c\\xa2\\x92\\x23\\x96\\x22\\x91\\xf2\\x25\\xc6\\xe0\\x53\\xe1\\xc1\\xc0\\x42\\x84\\x30\\xe2\\x81\\x14\\xb7\\xd6\\x51\\xa2\\x13\\xd6\\xed\\x91\\x5d\\xaa\\xd0\\xef\\x83\\xd2\\x24\\xb8\\x60\\x89\\x1b\\x7a\\x40\\xdd\\xa6\\x1b\\xd5\\x48\\xeb\\xa2\\x91\\xea\\x64\\x71\\xc0\\xe2\\x40\\x3d\\x27\\x53\\x86\\xa1\\x5e\\x29\\x4e\\x4d\\xcd\\xac\\x4d\\x93\\x6a\\xda\\xa4\\xf2\\x48\\x9f\\x6c\\xd1\\x11\\x17\\x27\\xaa\\x29\\x4d\\x22\\xca\\x93\\x20\\xe7\\x42\\xd1\\x25\\x37\\xa5\\x07\\xda\\x1b\\xab\\x12\\x19\\xcc\\xe4\\xe4\\x29\\xb4\\xce\\xcf\\x55\\x2d\\x9c\\x16\\x90\\x4d\\x42\\x23\\x51\\x86\\xc2\\x4a\\x00\\xdf\\x31\\x4c\\xb9\\x28\\x5b\\xac\\xc6\\x1d\\x61\\x2d\\x52\\xa5\\x9d\\x42\\x47\\x26\\x5d\\xab\\x52\\x5c\\x62\\x9c\\x11\\x5c\\x19\\xbf\\xe9\\x96\\x02\\x29\\x6b\\x63\\xc5\\x26\\xd1\\x45\\x32\\x0e\\xad\\x8a\\x19\\xd8\\xbd\\x0e\\x62\\x52\\x34\\x62\\xaa\\xa5\\x19\\xd9\\x62\\x71\\xa9\\x4e\\xaa\\x0c\\x27\\xe5\\xca\\xaa\\xfb\\xe8\\x37\\xa7\\xa2\\x04\\x52\\x5d\\x6a\\xa3\\x6f\\x26\\x3a\\x22\\xbe\\x21\\xb5\\xc9\\x27\\xa3\\xee\\x54\\xce\\x4f\\x23\\x01\\xe7\\x83\\xa1\\x37\\x72\\xc6\\xcd\\x41\\x7e\\x53\\x67\\x07\\x20\\xfb\\xa2\\xb0\\xc6\\xec\\xf2\\x40\\x3c\\x68\\x87\\x66\\x5d\\x5c\\x99\\x41\\x2f\\x92\\x29\\xc8\\xa9\\xb7\\x1b\\x55\\x6f\\x01\\x67\\xd1\\x8e\\xa0\\x5a\\x47\\xf4\\xcf\\x5b\\x9c\\xa3\\x6d\\x52\\x40\\x65\\xd7\\x8a\\xaa\\xbf\\xaa\\x22\\x81\\xff\\xe8\\xf6\\x99\\x44\\xb7\\x30\\x06\\x62\\x93\\x2a\\x99\\x3b\\x26\\x50\\xce\\xa1\\x02\\x8c\\x80\\x18\\x23\\xf8\\x34\\x43\\xbc\\xd9\\xf7\\x47\\x2a\\x93\\x97\\x66\\x06\\xc2\\xc4\\xa3\\x2f\\x66\\xf0\\xc3\\xb6\\x05\\xeb\\x31\\x18\\x89\\x49\\x19\\x24\\x3a\\x26\\x1a\\x33\\x30\\xa2\\x5b\\xf8\\xb3\\x29\\xfb\\x1d\\x21\\x29\\xc3\\x27\\x65\\x1f\\x54\\xcb\\x62\\x01\\x82\\x40\\x64\\x1d\\xdf\\x5c\\x78\\x84\\x75\\x03\\x03\\x24\\xdb\\xef\\x71\\xda\\x4b\\x50\\xbe\\x10\\x98\\xc6\\xc8\\x80\\x6b\\xa7\\xde\\x14\\xb8\\xf6\\xfc\\x54\\x8a\\xf4\\x59\\xf0\\x50\\x8d\\x83\\xc9\\xe3\\x70\\x31\\x8c\\xa2\\x24\\x5d\\xc0\\x44\\x61\\xff\\x9c\\x6a\\x71\\x85\\x67\\x92\\x08\\xfb\\x69\\x70\\x0a\\x1d\\x38\\x8a\\xa9\\xb4\\x55\\x91\\x45\\x35\\xf2\\x30\\x39\\xc3\\x0b\\x79\\x70\\x08\\x37\\x2f\\xd1\\x7f\\xb8\\xae\\x7a\\x54\\x3e\\xac\\x7a\\xe0\\x46\\x2d\\xf9\\x58\\xad\\x64\\xe5\\x77\\xc8\\xcb\\x0b\\x94\\xd1\\x1c\\xa9\\x7d\\x9d\\x2a\\xdb\\xbd\\xc3\\x4b\\x7f\\xf6\\xd3\\xef\\xe4\\xd9\\xca\\x22\\x16\\x62\\xd7\\xe4\\x53\\x74\\x51\\xf2\\xcc\\x5c\\x86\\x9a\\xd9\\x49\\xce\\xb3\\x67\\xe5\\x7d\\xa9\\x60\\xcf\\x97\\xd9\\xe7\\xa1\\x5f\\x0b\\x6e\\xdd\\xfc\\x9a\\x0f\\x57\\xf4\\x5d\\x17\\x05\\x50\\xb2\\x13\\xe1\\x99\\xb9\\xed\\x6a\\xd3\\xee\\xb9\\xed\\x7c\\x6d\\xf9\\x1c\\xb7\\x4a\\x96\\x1b\\x6e\\x6d\\x7e\\xca\\xd9\\xfa\\x53\\x52\\x5d\\x66\\xb1\\x39\\x15\\xc1\\x25\\x0c\\xa9\\x2a\\x3c\\x68\\x73\\x1e\\xbc\\x5d\\xe6\\x99\\x73\\x1b\\x6a\\x61\\xa5\\x6d\\xbc\\x68\\x43\\x8a\\xfc\\xd3\\xaa\\x7b\\xee\\xdf\\x21\\xac\\x1c\\x8d\\x46\\x2f\\xca\\x79\\xcd\\x38\\xef\\xb8\\xc5\\x49\\xc0\\xe0\\x28\\xf0\\xc8\\x1c\\xa1\\x59\\x98\\x90\\x37\\xcb\\x98\\xd9\\xca\\x25\\x74\\x53\\xa0\\x32\\xea\\x45\\x62\\x0b\\x4c\\x61\\xb6\\x4f\\xb5\\xe3\\xac\\xb8\\xb4\\xc0\\x26\\xe2\\x9b\\x89\\x7e\\xe8\\x81\\x01\\xa0\\xbf\\xd1\\xa8\\x1c\\x21\\x38\\x65\\x46\\x8e\\x43\\x9a\\x08\\x2e\\x0a\\x4a\\x75\\x54\\x95\\xa3\\x3a\\xbc\\xd1\\x11\\x2b\\xe8\\x30\\xd5\\x62\\xd1\\x34\\xaa\\x71\\xb5\\xc9\\x24\\xbf\\x03\\x53\\xe8\\x78\\xcc\\x58\\x46\\xdc\\xab\\x18\\xba\\x02\\xaa\\x60\\x9c\\x8a\\xb2\\x9d\\x99\\x53\\x70\\x06\\x49\\x39\\x05\\x1d\\xc5\\x86\\xea\\xf1\\x3f\\x5f\\x9f\\xb7\\xba\\x18\\x31\\x72\\x76\\xb1\\xd4\\x91\\xaa\\x8b\\x5c\\x1c\\x63\\x13\\x66\\x95\\x6e\\x53\\xc6\\xcb\\x59\\xf9\\xd2\\x28\\x55\\x85\\x55\\x82\\x7d\\x52\\x47\\x3f\\x51\\x0b\\xce\\x67\\x65\\x85\\xa3\\x57\\x85\\x8b\\x6a\\xf7\\x59\\x48\\xc9\\x2a\\x74\\x20\\x38\\xea\\xe8\\x8b\\xed\\x72\\x49\\x4e\\x3f\\x42\\x81\\x2b\\xcb\\xe8\\x15\\xa9\\x56\\x18\\x72\\x4d\\xd7\\x66\\xf0\\x05\\x53\\xb5\\x69\\xf4\\x14\\xc9\\x60\\x14\\x58\\x22\\x2d\\xa2\\x43\\x28\\x8d\\xac\\x23\\x52\\x51\\xaf\\x8d\\x63\\x28\\x13\\x83\\xe9\\x51\\x12\\x88\\x45\\x65\\x82\\xe6\\xf2\\x50\\x7d\\x3a\\x9a\\x3e\\x0d\\xcf\\x4b\\xdc\\x25\\x73\\x6e\\xa5\\x22\\x6e\\xf4\\x05\\x2a\\x08\\x10\\x84\\x84\\x09\\x46\\xee\\x0b\\x36\\x0a\\xec\\x13\\xda\\x54\\xcc\\xe5\\x93\\x47\\xca\\xaa\\x90\\x2e\\xf0\\x2b\\x25\\x9a\\x7c\\x2c\\x58\\xdd\\x56\\x47\\x2f\\xc6\\x3f\\x63\\x8d\\x80\\x7e\\x4a\\x17\\x8a\\xb0\\x8b\\x7e\\x09\\x3a\\x4e\\xc0\\x23\\x3e\\xe5\\x30\\xc5\\xac\\xb3\\x15\\xd2\\x58\\xf1\\x2a\\x18\\x4b\\x39\\x4c\\x26\\x1b\\x52\\x18\\x14\\x4e\\x51\\x2c\\xa3\\x57\\x99\\x0e\\xcf\\x4f\\x01\\xb3\\x85\\xed\\x51\\xa5\\xbb\\x91\\xa6\\x4e\\xbb\\x34\\x08\\x8e\\x0c\\x9c\\xc8\\x8a\\x9e\\xa1\\xc7\\xba\\x5c\\xf9\\xfc\\xb4\\xb0\\x52\\x62\\x56\\x70\\x62\\x54\\x6d\\x46\\x5d\\x80\\x12\\x37\\xe1\\x5f\\xf4\\x39\\x26\\x4c\\x1a\\x0c\\xea\\x9c\\xa7\\x0a\\x6f\\x48\\x9e\\x21\\x60\\x5c\\x7e\\x9c\\x86\\x18\\x5d\\x6c\\x59\\xe1\\x98\\xd3\\x11\\x65\\xa7\\x28\\x2c\\x56\\x17\\x47\\x4f\\x64\\x10\\x50\\x3f\\xa9\\xc1\\x8c\\x08\\xf7\\x57\\xdb\\xc4\\xe7\\x1f\\xad\\x2c\\xff\\x17\\x06\\x57\\x17\\x86\\x14\\x74\\x07\\x81\\x6f\\xb6\\x21\\xb6\\xe6\\xf6\\x56\\x87\\x34\\xf8\\xd6\\x9c\\x90\\x6a\\x1d\\x44\\xf8\\xc3\\xe3\\x2f\\x56\\x96\\x1b\\x4b\\x75\\x29\\xca\\x4e\\xb2\\xb2\\xe3\\x1a\\x5c\\x2a\\xbc\\x69\\x79\\xfc\\xe7\\xf5\\x18\\xe2\\x05\\x27\\x0c\\x33\\x5e\\x19\\x1b\\x8f\\xaa\\xf6\\x04\\x17\\x03\\x01\\x0a\\x99\\x76\\xc5\\xe6\\x57\\x52\\x2d\\xdc\\x77\\xf4\\xdd\\xf5\\xd7\\x8e\\x6d\\x54\\x84\\x8e\\xb0\\x06\\x73\\x55\\xb8\\x6c\\xd4\\x1d\\xa6\\x6c\\xb2\\x8d\\xc4\\x30\\x5a\\x5b\\x5c\\x06\\x84\\x69\\x13\\x78\\xe2\\x54\\x53\\xdd\\xf9\\x94\\xe9\\xfc\\x34\\x72\\x75\\xcc\\x71\\xc7\\xb9\\x2d\\x64\\x5d\\x0a\\xc4\\xee\\xb4\\xd8\\x94\\x54\\xac\\x86\\x02\\x45\\x0e\\x4e\\x40\\xd5\\xa1\\xa3\\xd3\\xcd\\x6a\\x6a\\xa8\\x8f\\x1c\\xac\\xa3\\x1a\\xf3\\x8e\\x29\\x8c\\x44\\x05\\xd4\\x1d\\x5c\\xac\\x53\\x16\\x30\\x2b\\xf4\\x42\\xce\\xb4\\x3d\\x02\\x0d\\x55\\x73\\x9f\\xee\\x54\\x12\\xcf\\x5e\\xea\\xc6\\x5a\\xfe\\x6a\\x35\\x8f\\xa1\\xfb\\xa7\\x9b\\xb8\\x54\\x65\\xe6\\xaa\\x73\\xa5\\xc8\\x47\\xc5\\x7f\\x94\\x34\\x45\\xca\\x8e\\x4a\\x18\\xb9\\xe8\\x1c\\xba\\x68\\x21\\x13\\x6d\\x54\\xc0\\x08\\x16\\x81\\x0b\\x51\\x6d\\x9a\\x18\\x3e\\x13\\x18\\x1a\\x80\\x20\\x74\\xf6\\x55\\x55\\xe2\\x60\\xe6\\xea\\xe4\\x80\\x38\\x60\\x79\\xc7\\x94\\xd6\\x05\\x46\\x7b\\x48\\xc3\\x02\\xf8\\xa5\\x5c\\x19\\x14\\x5a\\x60\\x56\\xe7\\xa2\\x13\\xc5\\x60\\xdb\\xc0\\xe0\\x0a\\x94\\x83\\xb3\\x5d\\x85\\x7b\\x58\\x27\\xd6\\xbd\\xb2\\xeb\\x36\\xa4\\xac\\x83\\x19\\xf5\\x61\\x15\\x0d\\x14\\x05\\x76\\xbd\\xd1\\xf7\\x41\\x57\\x38\\xbf\\x0d\\x72\\x8f\\x9e\\xb3\\x71\\x02\\xdd\\x6f\\xb9\\xd9\\x92\\x44\\xd9\\x98\\xc1\\x5f\\xaf\\xfd\\x60\\xbc\\xa2\\xc4\\x14\\xc2\\xc8\\x19\\x94\\x18\\x43\\xe7\\x06\\x13\\xcc\\x80\\x51\\xe0\\x6a\\xe3\\x68\\x36\\xc9\\x5c\\x4d\\xb9\\xb3\\xdf\\x27\\x6f\\xcd\\x73\\x03\\x4d\\x85\\x70\\x41\\x53\\xd4\\x64\\x24\\xd0\\x36\\xeb\\x6e\\x0e\\x79\\xaa\\xcd\\x71\\x29\\x33\\x47\\x01\\x56\\x6b\\xf0\\x2a\\x71\\xd1\\x79\\xb6\\x16\\x0a\\x6d\\x64\\xd6\\x6d\\xb0\\x21\\x96\\x3f\\x5e\\xc3\\xe7\\xbc\\xfa\\x94\\xd6\\x52\\x37\\x2f\\x17\\xc5\\x2a\\x92\\xf3\\x2e\\x03\\xb4\\xe8\\x4f\\xb8\\x8a\\x94\\x77\\x25\\xa4\\xbd\\xc5\\x6e\\xe3\\x6d\\xff\\x71\\x0d\\x66\\xd6\\x13\\x47\\x21\\x2c\\xd6\\xec\\x42\\x3c\\xfb\\x18\\x68\\x97\\x29\\x2c\\xaf\\xd3\\xab\\x8c\\xa8\\x9b\\x2d\\x64\\xf6\\x9b\\xd5\\xf2\\xe4\\x76\\x61\\x4c\\x28\\x79\\x96\\x00\\x63\\x42\\x8e\\x8e\\xb2\\x19\\x94\\x75\\x6d\\x22\\x18\\x2d\\x14\\xeb\\x91\\x73\\x06\\x0b\\x29\\x5d\\x74\\x9b\\x91\\xc6\\x8c\\x1d\\x70\\xc7\\x75\\x12\\x87\\x3a\\xed\\xa0\\xd6\\x95\\xe8\\xa0\\x5b\\x9a\\x33\\x30\\x17\\xa3\\xf1\\xd8\\xc5\\xa1\\xd2\\x2d\\x6e\\xaa\\xf0\\x64\\x7d\\xc7\\xec\\x25\\x64\\xa3\\xf1\\xec\\x2a\\x04\\x5f\\x83\\x83\\xa9\\xf5\\xb6\\x8b\\x31\\x28\\xab\\x22\\x31\\xb5\\xe8\\x12\\x2b\\x06\\xdb\\x79\\x4e\\x75\\xe6\\xc0\\xbb\\x94\\xc2\\xec\\x53\\x34\\x87\\x9c\\xaf\\xd9\\x2d\\x52\\x86\\x92\\x4c\\x5e\\x4c\\x7d\\xcb\\x46\\xdd\\x05\\xd4\\x2d\\x59\\xbf\\x0f\\x16\\x46\\x17\\x65\\xc3\\x94\\xf5\\xbf\\x5c\\x9f\\xbe\\x98\\xc2\\x6a\\x91\\x00\\x90\\x33\\xe7\\x5d\\x6a\\x71\\xd6\\xff\\xc1\\xb9\\x16\\xae\\x4f\\x33\\x56\\x48\\xef\\xdd\\xb2\\x56\\xff\\xe9\\x7a\\x90\\xce\\xde\\xbd\\x91\\xe2\\x95\\x77\\xed\\xcd\\xd8\\x37\\xf7\\xf3\\xdb\\x15\\x65\\x2d\\x6b\\x9e\\xc5\\x45\\x2a\\xdd\\x42\\x0b\\x9d\\x4e\\xc1\\x02\\x8c\\x6f\\xd9\\xf4\\xe3\\x6a\\xaa\\xe6\\x58\\x2d\\x08\\x05\\x92\\x18\\x96\\x14\\x80\\x18\\xf0\\x23\\x0a\\xd4\\xfa\\x27\\x06\\x6a\\x66\\x00\\x23\\xd7\\x55\\x70\\x2f\\x66\\x4f\\xea\\x33\\x4e\\x26\\xe4\\x2f\\xbb\\x12\\x48\\xd9\\x0e\\xbc\\xf3\\xc5\\xc0\\x96\\x10\\xcd\\xb4\\x21\\xe7\\x7e\\xb7\\x22\\x5f\\x96\\x9b\\xe7\\x3f\\xb5\\xb4\\x23\\x2e\\x03\\x1c\\x13\\x2d\\xed\\x24\\x95\\xc1\\x47\\xe0\\xbb\\x52\\x87\\xa4\\x94\\x54\\x4a\\xdd\\x29\\xa8\\x1b\\x20\\xaa\\x72\\xa8\\x3b\\x4f\\x59\\x97\\x2e\\xd4\\x03\\xb3\\xf9\\xc9\\x6a\\x36\\x17\\x2f\\xdf\\xf5\\x21\\x10\\x0b\\xef\\x72\\xac\\xcb\\xce\\x8f\\x1b\\x3a\\xe0\\xe9\\xf5\\x1e\\x4b\\x2d\\xab\\x1e\\xa5\\xd2\\x20\\xc5\\x24\\xaa\\xec\\xf2\\x20\\xba\\xa7\\xf4\\x52\\xea\\x15\\x47\\x46\\x94\\x38\\x70\\x75\\x39\\xca\\xe0\\xb3\\x23\\xfd\\x36\\xc8\\x76\\xfd\\x56\\x6a\\xfa\\xad\\x15\\x73\\x0d\\xc3\\xad\\x27\\x6d\\xeb\\xb3\\xb4\\xd9\\x47\\x39\\x14\\x35\\xf6\\x9f\\x8f\\x24\\x7c\\xb8\\x56\\x7c\\x6b\\x71\\xc8\\x8e\\xe6\\xd6\\xe4\\x1a\\xf1\\xab\\x6e\\x54\\x5d\\x53\\xec\\xa3\\xaf\\x9f\\xb5\\xe9\\x81\\xd7\\x7e\\xba\\x5a\\xef\\xb6\\xb0\\x2b\\x76\\xa9\\x95\\x99\\x61\\x00\\xd4\\x3d\\x0c\\x8a\\x75\\x11\\x38\\x3e\\x5a\\xa0\\x62\\x41\\x00\\x51\\x21\\xc8\\x19\\x42\\x50\\x02\\xe4\\x8c\\x6e\\x77\\x6d\\x37\\x7b\\xee\\x16\\x5b\\xc8\\x19\\x8b\\x16\\x88\\xaa\\xce\\xc7\\x68\\x26\\x7e\\xe5\\x61\\x9c\\x9b\\x31\\x88\\xa2\\x3d\\x2a\\x83\\xa8\\x2e\\x46\\x39\\x3f\\x95\\x2a\\x3a\\x86\\xc5\\x00\\x89\\x18\\x96\\xca\\x13\\x0b\\x56\\xa9\\xed\\xc3\\x5f\\x60\\xe8\\x9d\\x6a\\x74\\x5c\\x79\\xe6\\x0c\\xc9\\xaf\\x63\\xa8\\x0a\\xc3\\xdb\\xe4\\x97\\x16\\xbe\\x3f\\x59\\xf7\\xbc\\xb0\\x34\\x1b\\xe4\\x86\\xfe\\xf3\\xfb\\xd5\\xec\\xc8\\x1a\\xf5\\xa5\\x1a\\x46\\x46\\x34\\x92\\x34\\xec\\xc0\\x6a\\xa8\\x4f\\x04\\x56\\x2d\\x5c\\xa9\\x72\\x63\\x37\\x8b\\x62\\x93\\x3a\\xfb\\xc4\\x7d\\x0f\\x40\\xc2\\x96\\x24\\x3b\\xae\\x75\\x24\\x06\\xd7\\xad\\x09\\x56\\x43\\xc0\\xad\\xbc\\xa0\\x36\\xe5\\xa7\\xd0\\x00\\x4b\\x0f\\xb7\\x30\\x9d\\xcb\\x7c\\x47\\x75\\xf6\\xb1\\x6c\\xd8\\x29\\xff\\xb0\\x22\\x2d\\x91\\xef\\x61\\x8d\\xe1\\x62\\x8b\\x50\\xf5\\x7a\\xe4\\x89\\xaa\\x3e\\x2d\\x3d\\x4e\\x03\\xeb\\x83\\x2c\\x79\\xf0\\x04\\xcc\\xaa\\x2c\\x81\\x33\\xab\\x4e\\x36\\x7a\\x84\\xc8\\xaa\\xdc\\x21\\x5d\\x11\\x33\\xd8\\xc3\\x68\\x0d\\x2b\\xe9\\x83\\x13\\x87\\x7b\\x30\\xea\\xf8\\x97\\x15\\x75\\xa4\\x1b\\xa8\\x23\\xb6\\x91\\xa3\\x7e\\x83\\xd4\\x76\\xc9\\x82\\x60\\xf4\\x0f\\x24\\x6f\\x62\\x41\\x9c\\x4f\\x3a\\x0b\\xb0\\xb2\\x15\\xe9\\x36\\x5b\\x65\\xa3\\x52\\x9d\\x2d\\x36\\x5c\\x21\\x16\\xb6\\x68\\xe1\\x97\\xe6\\xda\\x52\\x26\\xdf\\x55\\x86\\xb2\\x48\\x8e\\x1e\\x69\\xc6\\xb4\\xf3\\x12\\x68\\xf4\\x31\\x20\\xa6\\x4d\\x61\\x7f\\x50\\xb2\\x64\\x47\\x91\\x67\\x0a\\xc0\\x6e\\xb0\\x19\\xc3\\x8a\\x97\\x6d\\xfa\\x41\\x05\\xd9\\x2c\\x14\\x45\\x89\\x75\\x09\\x1d\\x36\\xcd\\x20\\x94\\x1d\\x27\\x1e\\x09\\x26\\x4c\\xb3\\x69\\x27\\x76\\x93\\xd9\\x87\\x13\\xb6\\x5f\\xd0\\x71\\xd9\\xdf\\x0a\\x68\\x0b\\x0c\\x14\\x88\\x0a\\x2d\\xaa\\x63\\x6c\\xcc\\xe8\\xbf\\xae\\xa2\\x57\\xf7\\xdc\\x48\\xa9\\x2f\\x5d\\x11\\xa4\\x12\\x5c\\xb1\\x19\\x6d\\x01\\xd8\\x05\\x06\\x1a\\x7d\\xe9\\x48\\x04\\x0b\\x70\\x65\\x17\\x1b\\x36\\x91\\x28\\xda\\x55\\x45\\xdb\\x3e\\x53\\xa0\\x14\\x57\\x28\\xad\\x4a\\x62\\xc1\\x15\\x5d\\x8c\\x26\\x8e\\x4a\\x35\\xb7\\xbb\\xd2\\x12\\xc1\\x7a\\x02\\x0f\\xf1\\x64\\xab\\x87\\xc5\\x1b\\x39\\x06\\x47\\xce\\xd4\\x2f\\x2e\\x23\\xb4\\x74\\x9d\\x0c\\x5c\\x88\\x42\\xd2\\xcb\\x8a\\x88\\xec\\xb5\\x25\\x73\\xb3\\xf6\\xdd\\xdb\\xba\\xa4\\x57\\x85\\x18\\x00\\x89\\x54\\xd7\\x48\\x3c\\xf9\\x0c\\xf3\\x82\\xc0\\x9c\\x5e\\x22\\xb6\\xb8\\xf6\\x4f\\xfa\\x91\\xe6\\xc8\\x41\\xf8\\xd4\\x88\\x5d\\x95\\x8b\\x13\\x98\\x89\\x4b\\x99\\x88\\x23\\xc2\\x0c\\x30\\x3d\\xb5\\xec\\xad\\xe8\\xdc\\x14\\x20\\x74\\xf2\\x0b\\x55\\xb5\\xf2\\xea\\x10\\x7f\\x9b\\xcc\\xb0\\x42\\x85\\x1d\\x61\\x0f\\x16\\x76\\x22\\x34\\xd3\\x86\\xb8\\xf8\\x6c\\x13\\xe9\\x28\\xc0\\xd8\\xbb\\x63\\x88\\x16\\x10\\x1d\\xc9\\xe4\\x34\\xf5\\x28\\x00\\x5c\\x45\\xda\\x10\\xd4\\x7f\\x5c\\x71\\xaa\\xb0\\x08\\x6a\\x0e\\x2e\\xb6\\x30\\xb7\\xac\\x52\\x50\\x66\\xdf\\xb2\\xe1\\xd7\\x18\\x1d\\x34\\x37\\x98\\xc0\\x59\\x59\\x48\\xa1\\x0b\\x15\\x4d\\x15\\x3e\\x9a\\x4a\\x75\\x4c\\x79\\xf5\\x2c\\xc3\\xba\\x9f\\xd9\\x79\\xd1\\x55\\x8f\\x6c\\xf3\\xae\\x04\\x41\\xa6\\x8f\\xc1\\x56\\x23\\xa2\\x3b\\x02\\x8e\\xe0\\x2d\\x0e\\xfb\\xf9\\x5a\\xab\\xed\\x1c\\xb6\\x98\\x69\\x42\\x42\\x1d\\x84\\xcc\\x67\\xd3\\x06\\xaa\\xce\\x97\\xb6\\xcb\\x03\\x15\\x57\\xca\\x20\\xf0\\x6a\\x14\\x42\\x2b\\x1f\\x21\\x27\\x20\\xce\\x65\\xcb\\xa8\\xfd\\xc5\\xda\\x2e\\xd7\\xfd\\x0e\\x1c\\xbb\\x2d\\xa4\\x5a\\x7c\\x92\\xaa\\x43\\x83\\xe1\\x90\\x22\\xae\\xb5\\xba\\x63\\x4a\\x03\\x17\\xf8\\x19\\xeb\\xce\\x82\\x0d\\xf1\\x73\\x4d\\x83\\xea\\x17\\x7b\\xeb\\x49\\xa1\\x01\\xd0\\xbd\\x65\\xda\\xf9\\x6c\\xd7\\x1e\\x7f\\x70\\xd9\\x00\\xef\\x7f\\xda\\x9c\\x06\\x55\\xb7\\x87\\x18\\xc5\\x15\\x89\\x83\\x8f\\xc2\\xae\\x30\\xef\\x44\\xea\\xa0\\xfc\\xdd\\x27\\xca\\x18\\x5f\\xa2\\xbc\\x93\\x18\\xac\\x85\\x2f\\xcc\\x43\\x4c\\xc5\\xf9\\xa2\\xc8\\x49\\x92\\x0c\\x9e\\x2b\\xb9\\xc4\\xc9\\x2e\\x7c\\x52\\x0a\\x93\\x2d\\xaf\\xf8\\x97\\x6b\\x66\\xd2\\xf5\\xbd\\xd4\\x17\\x85\\xc3\\x20\\xba\\x16\\xb9\\x90\\x02\\x3e\\xaa\\x4e\\xaf\\xf4\\x67\\xd5\\x7d\\x9d\\x6f\\x31\\xce\\x3e\\x11\\x9b\\x56\\x91\\xb6\\xac\\xcb\\x7f\\x5e\\xbd\\x28\\x74\\x35\\xb6\\x14\\x15\\x03\\x89\\x87\\xdc\\xc0\\x78\\xdb\\xce\\xe7\\xb6\\xb8\\x2c\\x63\\x51\\xd8\\x96\\x07\\x9f\\x9b\\xed\\xcb\\xbc\\x2b\\xfb\\xb8\\x13\\x0a\\x79\\x43\\xff\\xff\\x2f\\xd7\\xfd\\x0d\\x25\\x5c\\x58\\xca\\x15\\x6a\\xa8\\x7a\\x56\\x76\\x51\\x74\\x0b\\x92\\x2a\\xe1\\x51\\xf1\\x21\\xe0\\xba\\x5e\\xe1\\xb7\\x28\\x1b\\x1c\\xf8\\x7f\\xbd\\x1e\\x63\\x95\\xfb\\x0a\\xf2\\x42\\x57\\x6d\\xc8\\xb0\\x9a\\xf4\\xb8\\xaa\\x8d\\x38\\xa1\\xff\\xba\\x39\\x4a\\x81\\x69\\x6b\\x07\\xf1\\xa3\\x83\\xf2\\x7a\\xa5\\x83\\xb2\\x11\\xeb\\xd8\\x75\\x78\\xfa\\xd3\\xcd\\x5d\\xff\\x6f\\xd7\\x87\\xb8\\x04\\x93\\x29\\x2b\\xe0\\x36\\x70\\x6b\\xae\\x70\\xd9\\x31\\x31\\xae\\x7d\\x01\\xe8\\x12\\x1a\\x10\\x2f\\x12\\x49\\x06\\x5f\\x9d\\x92\\x54\\x1e\\x7c\\x51\\xa5\\x7a\\x30\\x2e\\x10\\x49\\xd0\\xee\\xe6\\xd7\\xfe\\xef\\xd7\\x63\\x0f\\xf7\\x06\\x40\\x17\\x76\\x0d\\x26\\x02\\x6a\\x3b\\xaf\\x57\\x4c\\x1b\\xb3\\xf2\\x7f\\x5c\\x57\\x38\\x4b\\xdd\\x13\\x0a\\xc5\\xc2\\x90\\x6f\\x12\\xda\\x40\\xad\\x40\\x53\\xd7\\xf1\\x6c\\x50\\xdd\\x93\\xb5\\x9a\\xb4\\x04\\xb6\\x26\\x27\\x01\\x98\\x31\\x35\\x67\\x9e\\x6f\\x46\\xa0\\xaf\\xc0\\x31\\x5c\\xcb\\xe3\\xb4\\xa3\\x2c\\x73\\x55\\x2e\\x58\\x60\\x8a\\x72\\xc4\\xf0\\x92\\x93\\x8b\\x32\\xfa\\x62\\x06\\x5a\\xb3\\xb2\\x77\\xf5\\xb2\\x2e\\x09\\x03\\xba\\xf7\\x58\\xf5\\x1e\\x72\\x79\\x46\\x3c\\x09\\x94\\x4b\\x6a\\x8e\\x59\\x31\\x01\\xc2\\xb5\\x54\\x88\\xe8\\xff\\x08\\x07\\x0d\\x0e\\xac\\x0f\\x31\\xd4\\x88\\x09\\x40\\x82\\xc4\\xec\\x63\\x04\\x7c\\x29\\x19\\x61\\x10\\xb0\\x92\\x4d\\x5d\\xbe\\x89\\x40\\x5e\\x8c\\x9e\\xb2\\x93\\x62\\xd1\\xcd\\x0e\\xa2\\x19\\x01\\xc1\\x71\\x84\\x67\\xb6\\x00\\x35\\x2e\\x0e\\x6e\\x37\\x19\\x36\\x55\\xbe\\xa0\\x22\\xcd\\xc2\\xdb\\x33\\xe3\\x83\\x27\\xdf\\xd8\\x71\\x0f\\xa5\\x8b\\x19\\x4e\\x81\\xe0\\x14\\x7b\\x4a\\x76\\xbe\\x96\\xa9\\x55\\xdd\\x3c\\x63\\x29\\xa6\\x86\\x3b\\xa9\\x53\\x25\\x57\\xeb\\x4c\\x49\\x54\\x6d\\x95\\xd1\\x37\\x31\\xd7\\x63\\xcf\\x08\\x81\\x3d\\x5b\\x51\\xeb\\x96\\xdd\\xfa\\xe9\\xb2\\x2f\\x19\\x5c\\x20\\x07\\x53\\xd5\\x52\\x93\\x31\\x16\\x97\\x15\\x4d\\x00\\xcf\\x87\\x30\\x59\\xd0\\x8d\\xa4\\x91\\x03\\x02\\xa0\\xe0\\x61\\x48\\x00\\xda\\x01\\x0b\\x14\\x0d\\xcd\\x99\\xd8\\x82\\x0b\\x44\\xc7\\x5b\\xcb\\xe4\\x45\\x65\\x1e\\xc5\\x34\\xfa\\x66\\xce\\x1f\\xc4\\xc2\\x48\\xbb\\x1c\\x64\\x62\\xcb\\x06\\xbb\\x69\\x44\\xc2\\xce\\xf9\\x69\\x0c\\xe2\\x24\\x94\\x91\\x0b\\x82\\x02\\xcc\\x79\\x55\\xd2\\xd4\\x7d\\xbd\\x9c\\x47\\x85\\xa4\\x4a\\x43\\x15\\x30\\x6b\\x8a\\xc9\\x31\\x27\\xa4\\xae\\x8c\\xf6\\xb3\\xb9\\xd1\\xb9\\xc7\\xba\\x21\\xd0\\x00\\x1e\\x02\\x04\\xdc\\x77\\x53\\x87\\xe7\\x6a\\xd1\\x2c\\xce\\x57\\xd8\\x56\\x63\\xda\\x90\\xa1\\xcf\\x56\\x3e\\xba\\xdc\\xe9\\x39\\xb3\\xf2\\xfc\\x59\\xe0\\x4e\\x97\\x1e\\x2c\\xe1\\xa4\\xc9\\x64\\x11\\x5c\\x0a\\x39\\x2d\\xe8\\x47\\x2c\\xca\\x26\\x8e\\x06\\x66\\xa8\\x27\\xcc\\x40\\x3d\\xba\\x04\\xc9\\x20\\xfe\\x15\\x0d\\xc6\\x6c\\x79\\x3f\\x13\\x7c\\x1d\\x3a\\xdf\\x8a\\xc6\\xcc\\xb1\\xde\\x53\\x64\\xc2\\xe4\\x3b\\x88\\x12\\x9e\\xbd\\x98\\x33\\x3b\\x26\\xb7\\xfc\\x08\\x30\\x6f\\xe1\\x47\\xb5\\xee\\xd3\\xfe\\xd8\\xfc\\xf0\\x53\\x2c\\x0e\\xc0\\x6d\\xc7\\x19\\x61\\x3c\\x59\\x41\\xfb\\x68\\x7e\\x7b\\x73\\x8a\\xab\\x7a\\x61\\xf6\\x19\\x8c\\x57\\x35\\x02\\x07\\x17\\xc9\\x88\\x85\\x46\\x74\\x8e\\x38\\x18\\xd5\\x94\\xc6\\xa5\\xc9\\xcd\\xd3\\xf7\\xbc\\xcf\\x55\\x71\\x89\\xc8\\xd6\\x88\\x53\\xb6\\x5c\\x44\\xe5\\x79\\x93\\x90\\xf9\\x15\\x4b\\x37\\x35\\x01\\xab\\xea\\x7a\\x23\\xbb\\x27\\xcc\\x09\\xa6\\x04\\xc5\\xae\\x4a\\xa9\\x9e\\x93\\xca\\xff\\xe8\\x48\\xd8\\xc2\\xfd\\x8b\\xf9\\x24\\x7a\\xc4\\xdc\\x92\\x0a\\xe5\\xa5\\x8d\\x9e\\x2c\\x8e\\x54\\xc0\\x30\\x28\\x66\\x25\\x3c\\x2c\\x51\\xcd\\xe7\\xa7\\x92\\xaa\\x0e\\xc9\\xe6\\x8d\\x5d\\x44\\xb8\\x3b\\x66\\x4d\\xa7\\x40\\x89\\x62\\x84\\xf9\\x5b\\xbf\\x9e\\x11\\x84\\x50\\x40\\x8d\\x73\\xcc\\x34\\x7a\\x09\\x0e\\x2f\\x57\\x4a\\x2b\\xb6\\x52\\xc0\\xed\\x88\\x68\\x18\\x91\\x96\\xb4\\x8f\\x82\\xf0\\x0a\\x73\\xa3\\x45\\x75\\xc2\\x28\\xb4\\xc1\\xc9\\xcf\\x56\\x94\\x56\\xe3\\x9e\\x0d\\x27\\x0a\\x73\\x0c\\x23\\x39\\x45\\xd7\\x8a\\xc2\\xa5\\x95\\x51\\x55\\x5b\\x52\\xb6\\x9a\\xf0\\xff\\x4e\\x46\\x86\\x86\\x61\\x78\\x49\\xd8\\xd8\\x9a\\xa8\\x6e\\x43\\xaa\\xe5\\x64\\x15\\xeb\\x4a\\x6c\\x63\\xb5\\xd4\\xa9\\x62\\x0c\\xae\\xe4\\x89\\x2c\\xe8\\x30\\xb7\\xb1\\x81\\xd5\\xa8\\xf2\\x66\\x16\\xde\\x80\\xe4\\xb4\\x01\\x4c\\xad\\x06\\x04\\x8d\\x99\\x6e\\xac\\xca\\x20\\x82\\x92\\x80\\xdb\\xbd\\x80\\x4c\\xd9\\xac\\xbb\\xb0\\x52\\xa5\\x80\\x50\\x45\\x27\\x95\\xce\\x4f\\xa5\\x34\\x97\\x13\\x23\\x68\\x6c\\x27\\x4b\\xe0\\x7e\\x13\\x4b\\x97\\x70\\x14\\x7b\\xfc\\x0e\\xc1\\x25\\x89\\x59\\xec\\x31\\x59\\xb0\\x54\\xf1\\xe4\\x11\\xfa\\x93\\x37\\xe8\\xec\\xc5\\xf5\\xec\\x01\\xe1\\x7d\\x08\\xfe\\xe5\\xfc\\x58\\x62\\xa5\\x73\\x55\\xc1\\x28\\xf4\\x94\\xb8\\x89\\x5b\\x42\\x8a\\xd4\\x08\\x70\\xde\\x79\\xf5\\xe3\\x34\\xf5\\x90\\x4d\\xe3\\x52\\x70\\x78\\x15\\xa5\\x7e\\x17\\x3b\\x8b\\x29\\xdd\\x8f\\x7d\\x49\\x34\\x99\\xe9\\x13\\xa1\\x7f\\x46\\x91\\x50\\x33\\x82\\xa2\\xdb\\x7d\\x5e\\x6c\\xba\\x29\\x2f\\xf6\\xc6\\x8f\\xfa\\x6a\\x6b\\xf3\\xd0\\x7e\\xf3\\x70\\xdf\\x3c\\x16\\xc7\\x94\\x55\\x3d\\xa0\\x09\\xdc\\x85\\xa8\\x0c\\xaa\\xfc\\x49\\x55\\xad\\x18\\x5a\\x79\\xb9\\x64\\xa4\\xb5\\xd0\\x1b\\x36\\x8f\\x5d\\x57\\xe3\\x09\\x4b\\xd8\\x83\\x64\\x4b\\x74\\x6c\\x79\\x3c\\xa5\\x93\\x40\\x8a\\x8e\\xa9\\x8e\\xd9\\x72\\xa8\\x7a\\xf0\\x5e\\xb4\\x90\\x5e\\x23\\x24\\x78\\xa1\\x18\\xc1\\x77\\xd8\\x1a\\x29\\x74\\x83\\x71\\xca\\x73\\xab\\xa3\\xe5\\xe6\\x50\\x37\\x2b\\x20\\x0e\\x2c\\x36\\x8b\\xda\\x59\\xf6\\x2a\\x36\\x28\\xf2\\x7f\\x10\\xb5\\x43\\xd8\\xae\\xc9\\xd2\\x84\\xda\\xad\\x1b\\x16\\xa4\\x8b\\xc0\\x04\\x56\\x78\\x00\\xe9\\x01\\x5b\\x75\\x2c\\x61\\xf4\\x5c\\x9d\\xbe\\xce\\x7e\\xcd\\x4b\\xf7\\x5c\\xee\\xb9\\x5f\\x77\\x5d\\x8e\\x86\\x74\\x21\\x47\\x79\\xf6\\x99\\xd2\\x98\\xc8\\xe9\\x06\\xe0\\x2e\\xe4\\x26\\x78\\xce\\xa0\\xff\\xc1\\x6c\\xc4\\xb9\\xcf\\xb7\\xce\\x6f\\xeb\\xf1\\xa2\\xf0\\x7f\\xe5\\x68\\x16\\x8d\\x39\\xc7\\xb8\\x04\\xb7\\xc2\\xc7\\x02\\x53\\xc5\\x92\\x59\\x09\\xcb\\x7c\\xcf\\x5a\\xa3\\x90\\x75\\x4d\\x17\\x7f\\x75\\x06\\x84\\x29\\x4d\\x0e\\x18\\x57\\x5f\\x5e\\x07\\xc1\\x71\\xaf\\xcd\\x96\\x8d\\xdc\\x6c\\xdc\\x22\\x89\\x84\\xc0\\x6b\\x8b\\x04\\x52\\x58\\xb9\\xf9\\x8e\\xff\\x73\\xf5\\x8e\\x0e\\xd8\\x2d\\x3f\\x8d\\xc3\\x40\\x4a\\x5f\\x32\\xaa\\x68\\xcc\\x4e\\xb9\\x7e\\x9b\\x40\\x0c\\x23\\x12\\xdc\\x1a\\x61\\xc2\\x26\\x25\\x34\\x45\\x59\\x33\\x11\\x73\\x17\\x04\\x64\\xd9\\x3a\\xd4\\x16\\xe7\\x35\\x5b\\xa6\\x17\\x94\\x2f\\x73\\x13\\xf9\\x88\\xc9\\x29\\xe2\\xe2\\xe4\\x8b\\x42\\x27\\xfd\\x84\\xaa\\x9f\\x20\\x33\\x53\\xb1\\x9e\\xf4\\x42\\x1f\\xbe\\xf9\\x13\\xfe\\xb2\\xe2\\xc7\\xad\\xdc\\x00\\x9d\\x78\\xf6\\xb5\\xa6\\x9d\\xa2\\xe4\\x44\\x2e\\x86\\x02\\xfd\\xd1\\x2b\\x9a\\xf3\\xb1\\x85\\x41\\x1a\\xcc\\x58\\xbc\\xf3\\x22\\xca\\x48\\x5a\\x73\\x51\\xb1\\x5b\\x0d\\x8a\\x3a\\x0e\\xad\\xd3\\x70\\xcb\\x3a\\xed\\xdf\\xdf\\x45\\xe3\\x56\\x3f\\x5f\\xaf\\xfc\\x0c\\x85\\xaf\\x7c\\x08\\x16\\xbc\\xd0\\x60\\x90\\x4d\\xc6\\xc4\\x8a\\xbf\\x0d\\xcf\\x40\\xb6\\x4e\\x84\\x50\\x8a\\xc8\\xf0\\xc0\\x21\\xe2\\x1e\\x00\\x3d\\x4f\\xb0\\x8e\\x92\\xb4\\x31\\x05\\x57\\x95\\x44\\x74\\xae\\xf3\\x44\\x55\\xf7\\xda\\x48\\xa0\\x51\\xee\\xd1\\x3e\\x08\\xe1\\xb4\\x60\\x0d\\x11\\x78\\xfb\\x72\\x4a\\x9d\\xdc\\x53\\x06\\xb9\\xab\\x38\\xd0\\xce\\x09\\x20\\xd1\\xc5\\x3a\\xfa\\xcc\\x97\\x58\\x2b\\x2c\\x89\\x3d\\x61\\xa2\\x2c\\x36\\xca\\xe6\\x90\\xf0\\x8c\\x20\\x0f\\xb4\\x98\\x7d\\x21\\xea\\x3e\\xb7\\xde\\x71\\xb0\\x8e\\x61\\xea\\x37\\x43\\xae\\x25\\xb7\\x24\\x4b\\x35\\x09\\x16\\x93\\x0f\\x7e\\x57\\x2c\\x15\\x42\\xd0\\x4f\\x05\\x91\\x6f\\x70\\x80\\x57\\x0b\\x07\\xb8\\xd8\\x36\\x85\\x07\\xa8\\x92\\x29\\x8d\\x29\\xba\\x2a\\x90\\xd5\\xc4\\x6d\\xa2\\x52\\x5c\\xcc\\xa3\\x72\\x02\\xe3\\xe2\\xfa\\x52\\xcb\\xe3\\x65\\x99\\x7d\\x2e\\xf0\\x93\\xc8\\x9c\\x4b\\x5a\\x6c\\x9f\\x51\\x65\\x68\\xdc\\x27\\xdc\\x80\\x39\\x27\\x83\\xb0\\xc8\\xc9\\x94\\x25\\x3e\\xc0\\x5c\\xa7\\xa5\\x1e\\x72\\x2a\\xbe\\xbe\\x90\\x25\\x12\\xba\\x2c\\x89\\xca\\xc5\\x15\\xb2\\x42\\x0b\\x2b\\xfd\\x75\\xb0\\x23\\x06\\x27\\x05\\x51\\x4f\\x71\\x22\\x55\\x45\\xa4\\x95\\x0b\\xa0\\x0f\\x83\\x94\\x05\\x5c\\x5a\\x26\\xad\\x94\\x2e\\x2a\\xcd\\xcb\\x67\\x9b\\x4f\\x20\\x49\\xa9\\x27\\xf7\\x88\\x25\\x4a\\x16\\x63\\xe5\\x55\\x47\\x61\\xac\\xbc\\x3a\\xc4\\xa3\\xc3\\xcf\\x4f\\xb9\\x1a\\xa6\\x58\\x50\\x3e\\x18\\x65\\x0b\\x93\\x59\\x3c\\xa5\\x74\\x94\\x8f\\xdc\\x00\\x71\\x16\\xd4\\x96\\x8b\\x6b\\x34\\x7a\\x7b\\xc2\\xdb\\x23\\xc8\\xf7\\x5c\\xc2\\xcc\\x2c\\x97\\x78\\x9b\\x91\\x7f\\x73\\xb1\\x19\\x7c\\x24\\xd5\\x1e\\x5b\\xdd\\x71\\x96\\x81\\xcc\\x33\\x39\\xc6\\xea\\x90\\x45\\x94\\x2c\\x92\\x0a\\x32\\x07\\x71\\xc6\\x15\\x91\\xcf\\x80\\xf8\\xd8\\x07\\xa9\\x4c\\x8a\\x91\\x55\\x65\\xbf\\x98\\xad\\x60\\xc0\\xd9\\x4b\\xcd\\xaa\\x16\\x85\\x9e\\x65\\x59\\x53\\xaf\\xa4\\xe1\\xc4\\x02\\x7e\\x49\\xa0\\xa7\\xcc\\x3e\\x51\\x27\\x3a\\x68\\x43\\xdc\\xba\\x36\\x94\\x9d\\x51\\x66\\x09\\x13\\x72\\x43\\xb4\\xef\\x91\\xa0\\x98\\x59\\xc0\\x4e\\x95\\x09\\x62\\x8b\\x79\\xaf\\x0d\\x29\\xda\\x52\\xcc\\xa8\\x2a\\x6a\\xca\\xa8\\x10\\x90\\x4d\\x8f\\x20\\x9b\\x9a\\xe2\\x16\\x82\\x2f\\x65\\xf6\\xb1\\x6c\\xd8\\x5f\\xc6\\xe3\\x61\\xbc\\xc5\\xde\\x23\\xf3\\x1c\\x33\\x85\\x49\\x54\\x99\\x3c\\x40\\x84\\xc8\\x0e\\x42\\x15\\x73\\x8c\\xad\\x9f\\x14\\x55\\x01\\x18\\x5c\\x0c\\xab\\x21\\x67\\xc7\\xc0\\x14\\xdd\\x07\\xc8\\x2f\\xa8\\x40\\x46\\xec\\x37\\x80\\xf8\\x38\\x95\\xe4\\x4a\\x98\\xa3\\xa2\\x58\\x6e\\x68\\x69\\x58\\x20\\xee\\xe1\\x7b\\x5e\\x61\\x81\\xec\\x2e\\xc0\\x40\\xdb\\xa6\\xa1\\x37\\xab\\xec\\xd5\\x72\\x33\\x8b\\x55\\xe6\\x90\\xc3\\x28\\xd5\\x55\\x43\\x9d\\xbd\\x2a\\x41\\x2f\\xf4\\x50\\x10\\x83\\x8d\\x38\\x0b\\x7c\\x3d\\x36\\x26\\xb4\\x38\\x24\\x3c\\x23\\x13\\x0e\\xe9\\xc0\\x45\\x61\\xe7\\x92\\x74\\x0c\\x53\\x84\\x59\\xe8\\x4b\\x9e\\x7d\\x31\\xbb\\xf6\\xc6\\x50\\xdf\\xae\\x83\\x5a\\x97\\x8c\\xf5\\xe8\\x60\\xfb\\x74\\x79\\xc7\\xb9\\x8c\\x82\\x02\\x0c\\x09\\x9b\\x20\\x4f\\x30\\x30\\x48\\xeb\\x6a\\x9a\\x32\\x1f\\x27\\x6c\\xc1\\x9f\\x55\\x81\\x65\\x5c\\x34\\xef\\xaa\\xb8\\x0e\\x2c\\x3a\\xb3\\x25\\x01\\x0b\\x92\\xd8\\xf6\\x3a\\xff\\x84\\xbc\\x7a\\xcb\\x3d\\xc0\\x6e\\xd6\\x05\\x2a\\xb6\\xc1\\x51\\xc3\\x20\\xf6\\x22\\x06\\x4b\\x56\\x01\\x37\\xe7\\x55\\xdd\\x51\\x58\\xdb\\xa4\\x2b\\xcf\\x72\\xcd\\x9f\\xa1\\x98\\x20\\x23\\xe4\\x12\\xbb\\x34\\x4f\\xe6\\x9b\\x70\\x91\\xf6\\xf0\\xdc\\xec\\x39\\x66\\x39\\xb2\\xf9\\x45\\x78\\x25\\x2c\\x2e\\x01\\xd2\\x0d\\xb1\\xdb\\x5d\\x17\\x4a\\x65\\x44\\x76\\x56\\x0c\\xce\\x12\\x77\\x09\\x75\\x06\\x4a\\xcf\\x88\\x31\\x82\\xcb\\x3d\\x2e\\x9f\\x7b\\xe6\\xa4\\x04\\xe7\\x91\\x2a\\x81\\xa8\\x2e\\x8f\\xec\\x67\\x52\\xa6\\x31\\x42\\xe8\\xc0\\x5d\\xaa\\x17\\xca\\xcb\\x68\\x03\\x78\\x4c\\x2b\\x5a\\x5a\\xf2\\x37\\x2e\\x54\\x19\\x28\\x50\\xa9\\x23\\xb1\\x9c\\x76\\x54\\xb9\\x2b\\x18\\xb8\\x4a\\x09\\x1b\\x22\\x8b\\x53\\x04\\xd9\\xc2\\x54\\x94\\x15\\x95\\xd1\\xa2\\xfb\\xc1\\x24\\xe0\\x3c\\xd2\\xe5\\xd2\\x9d\\x09\\xed\\x86\\x2c\\x94\\x95\\x96\\xc0\\x19\\xee\\x45\\x12\\xbc\\xc5\\xed\\x24\\x8b\\x4d\\xb3\\x4a\\x17\\x32\\x01\\x72\\x3b\\xce\\x82\\x4c\\x75\\x4f\\x5b\\x06\\x94\\x6f\\x2f\\x60\\x72\\xe4\\x36\\xe7\\xd4\\x43\\x03\\x72\\xea\\x1e\\xc6\\xea\\xf6\\xc1\\x5d\\xa6\\xb9\\x20\\x81\\x0f\\x76\\x32\\xcc\\x94\\x0e\\xa3\\x32\\x3c\\xcf\\x73\\xa9\\xe5\\x0a\\x34\\x8d\\x6d\\xf0\\x8c\\x2c\\xa1\\xd1\\x27\\x73\\x9e\\x5a\\xd4\\x33\\x89\\xb2\\x90\\x02\\xbe\\x39\\x7a\\x32\\x02\\x60\\x73\\x75\\x59\\xf6\\x15\\x70\\x37\\x22\\x97\\x6e\\x1e\\xf7\\xbc\\x0e\\x63\\x5f\\xa2\\xc0\\xb2\\xc3\\xeb\\x25\\xa4\\x41\\x35\\x49\\x9f\\x4b\\x1b\\x2c\\x0c\\x2f\\xc0\\x75\\xe1\\x28\\x84\\x41\\x11\\x52\\x2e\\x0d\\xad\\xbc\\x64\\xcb\\x5b\\xd1\\x31\\x6f\\xe5\\xb0\\xfe\\x75\\x55\\x77\\x64\\xf1\\x32\\x71\\x73\\x9d\\x81\\xc4\\x01\\x31\\x7b\\xb9\\x09\\x5e\\xc4\\x4e\\xaf\\xa8\\xa5\\x81\\x03\\x42\\x0a\\xd3\\x2e\\x0f\\xba\\x51\\xf5\\x4a\\x5b\\x7b\\xb8\\x54\\x96\\xc9\\xd2\\xbf\\x03\\xb9\\x1c\\xcd\\xc8\\xcc\\xf0\\xfe\\xe9\\x1f\\x1c\\x37\\x48\\xf1\\xbb\\xed\\x49\\x68\\x2e\\x0c\\x22\\xc5\\xa5\\x58\\x06\\x2f\\xac\\xb8\\x22\\xed\\x84\\xeb\\x60\\xae\\xab\\x18\\x75\\x28\\x39\\x3b\\xbd\\x12\\x09\\xda\\x26\\xab\\xd4\\x4e\\x78\\xca\\xa7\\x58\\x76\\x5e\\x58\\x79\\x59\\x29\\x4e\\x52\\xbf\\xf0\\x92\\x9a\\x22\\xe5\\x0d\\x0f\\xd3\\xdf\\x36\\xc7\\x93\\xfa\\x9a\\x50\\x1c\\x90\\x49\\x94\\x75\\x24\\xba\\x36\\xb6\\x24\\xc5\\xe5\\x5a\\x71\\xd7\\x47\\x65\\x47\\xc4\\x31\\x8e\\x1e\\xdb\\x97\\x96\\x3d\\x8c\\xa0\\x80\\x49\\xa1\\x88\\xf3\\x05\\xe8\\x10\\x06\\x01\\x64\\xc5\\xba\\x3c\\x99\\xb5\\x87\\x8a\\x65\\xb1\\xc8\\xa8\\xac\\x9c\\x1d\\x2a\\xdb\\x4c\\x4a\\x72\\xdc\\x33\\x46\\x88\\x9c\\x82\\x9d\\x29\\x07\\x57\\xab\\x25\\xbd\\x6c\\xe5\\xd0\\x9e\\x6f\\x7e\\x4e\\x81\\x52\\x59\\x78\\x48\\x94\\x5c\\xae\\x71\\xe7\\x63\\x6b\\x33\\x73\\xde\\xd5\\x9c\\x67\\x05\\x3d\\x83\\xe2\\x04\\x5d\\x73\\xda\\x25\\xc9\\xdd\\x3f\\x53\\xdb\\x06\\x71\\xfd\\x5f\\x2b\\x13\\x7f\\xde\\xd7\\x5f\\x4a\\x54\\x67\\x0e\\xd4\\x25\\x37\\x72\\xc4\\x01\\x3b\\x63\\xaf\\x46\\xf2\\x38\\xcd\\x6c\\x1e\\xf9\\x42\\xc8\\xa7\\x73\\x6c\\xae\\x6d\\x44\\x94\\x93\\xca\\xd0\\xa1\\xe7\\x56\\x59\\x21\\x10\\x04\\x2c\\x20\\x56\\x62\\xc9\\xda\\x72\\x16\\xcd\\xad\\x2c\\x4a\\xc6\\x05\\xc0\\xf6\\xd2\\x3f\\xb5\\x43\\xdc\\x5e\\x08\\x48\\x61\\xae\\x6a\\x76\\x11\\x0a\\xe7\\x45\\xfc\\xc0\\xd2\\x9a\\x2f\\x77\\x43\\xd5\\xed\\x3b\\x9f\\x2e\\x5e\\x39\\xf8\\x7d\\xc8\\x3e\\x35\\x0b\\x6c\\x5b\\x06\\xab\\xf0\\xbf\\x7f\\x03\\xf5\\xcf\\x6a\\x6d\\x31\\x42\\xa1\\x48\\x85\\x4d\\xc0\\x06\\x57\\xf8\\xbf\\x57\\xe5\\xbc\\xda\\x92\\x67\\x8e\\x6a\\x27\\x58\\xb4\\xbc\\x23\\x15\\xc3\\xb8\\xf2\\x54\\x36\\x1c\\x46\\xff\\xcf\\xd6\\x92\\x20\\x55\\x30\\xf0\\x58\\x93\\x13\\x94\\x84\\x30\\x9c\\x35\\x49\\xcf\\xed\\x5e\\x56\\x23\\x44\\xd5\\x9b\\xa9\\x46\\x58\\xe9\\x88\\xcd\\xd6\\x6e\\xb9\\x61\\xf8\\x1b\\x72\\x2e\\x5b\\x94\\xc6\\xf2\\x10\\xc1\\x54\\xd7\\x93\\xc4\\xfd\\xbe\\xf3\\xa1\\x27\\xbf\\xa1\\x4e\\x46\\x4a\\x8e\\x75\\x2f\\x62\\x69\\xad\\x84\\x51\\x0b\\x57\\x56\\x8f\\x5c\\x94\\xbd\\x2b\\x40\\x57\\x20\\x99\\x27\\x20\\xd0\\x3e\\x53\\x0e\\xbf\\xea\\x00\\xd0\\x30\\x5e\\x3c\\x5c\\xa8\\xd7\\xfd\\x51\\x94\\xd7\\xdf\\xb3\\x31\\xdb\\xff\\xef\\x3a\\xec\\xaf\\x5c\\x12\\x27\\x11\\xb9\\x8c\\x99\\x1d\\xc4\\xf8\\x12\\x2b\\x2a\\x4b\\xa2\\xf4\\x58\\xbb\\xa7\\xc0\\x34\\xce\\x0b\\x3b\\x15\\x12\\x41\\xa3\\xae\\x7a\\xb2\\x47\\x7d\\xc6\\x87\\xf6\\x22\\x5c\\x8f\\xd3\\x88\\x20\\x1d\\x05\\x3f\\x3c\\x49\\xd1\\xa9\\x1c\\x38\\x60\\x7d\\x2d\\x38\\x95\\xcc\\xaa\\x8e\\x05\\x07\\xcb\\x60\\x0b\\x9f\\x0f\\xe0\\x1a\\x0b\\xb2\\x2f\\x0b\\xb2\\x4f\\x3d\\x27\\x61\\xf4\\x89\\x1d\\xb2\\x45\\x10\\x65\\x11\\x17\\x19\\x1a\\x70\\x43\\xc5\\x97\\x65\\x17\\xd2\\xe4\\xa5\\x07\\xd6\\x6c\\x27\\x5a\\x3d\\x59\\x15\\x05\\x4c\\x75\\x71\\x66\\x46\\x04\\x0f\\xc4\\xb9\\x41\\xd8\\xa2\\x34\\x9c\\xec\\xd3\\xc8\\xd8\\x55\\x55\\x10\\x52\\x59\\x32\\xba\\xca\\xe1\\x8c\\xae\\x27\\xab\\xaa\\x71\\x17\\xf9\\x56\\xe5\\xb2\\x0f\\x84\\x6a\\x57\\x08\\x24\\x1b\\x8e\\xdb\\xb3\\x87\\x99\\x99\\x76\\x88\\xc0\\x67\\xee\\x11\\xf2\\xca\\x44\\xb1\\x75\\x61\\xe6\\xa9\\xf0\\x2b\\x26\\x8b\\xec\\x89\\x7f\\x07\\x37\\x48\\x41\\x85\\x85\\x51\\x3a\\xe1\\x9a\\x41\\x94\\xa5\\x20\\xfc\\xea\\xf1\\x52\\xe1\\x90\\xc5\\x32\\x09\\xdc\\xac\\xdf\\xe1\\x55\\xac\\xb0\\x28\\xbf\\xb3\\x2f\\xed\\xd5\\xc5\\x6c\\x0a\\x36\\x2b\\xff\\xe8\\x94\\xca\\xba\\xa0\\x23\\xe5\\x8b\\xe0\\xb7\\x5a\\xcd\\x19\\x9f\\xd2\\xe0\\xab\\x63\\xb8\\x33\\x99\\x82\\x19\\x63\\x9c\\x48\\x98\\x04\\xfe\\x53\\xe2\\x30\\x32\\xd2\\x7c\\x44\\x7a\\xfe\\x24\\x72\\xe7\\xbb\\x7a\\xd8\\xe2\\xa5\\xb0\\x6c\\x84\\x27\\xb5\\x6c\\xd3\\xda\\x73\\x4c\\xa9\\x74\\xb3\\x82\\x79\\x25\\xe1\\xe9\\x49\\xd5\\xe0\\x31\\x82\\xb0\\x1f\\xa7\\x81\\x60\\x33\\x8e\\x3b\\x49\\x4b\\xc0\\xbb\\xc4\\x34\\xa0\\xbe\\x59\\x2f\\xe1\\xe6\\xc5\\xaa\\x75\\x4c\\x80\\x8d\\xc4\\x6d\\x57\\xa0\\xff\\x5a\\xd8\\x7b\\x9e\\x11\\xa7\\x1f\\x46\\xcc\\xb6\\x43\\x02\\x50\\x4b\\x93\\x6d\\xd3\\x42\\x83\\x8f\\x0e\\x05\\xdb\\x72\\x74\\xdb\\xf3\\x15\\x57\\xf3\\x15\\x17\\x05\\xab\\x82\\xa9\\x0d\\xc8\\xb8\\x90\\x82\\xec\\xd0\\x92\\xbb\\x66\\x47\\x3d\\xd1\\x08\\x8a\\xbb\\x6e\\xae\\x1e\\xf3\\x84\\x74\\x96\\x38\\x55\\xb2\\x11\\x50\\x8c\\x8e\\x62\\x01\\x72\\xa2\\x18\\xad\\xe4\\x19\\xc5\\x34\\x96\\xa8\\xb2\\xc3\\x02\\xe2\\x6b\\x9a\\x2c\\xdc\\x4d\\xc2\\xd8\\x72\\x0f\\x87\\xf4\\x88\\x92\\xd7\\xb1\\x43\\x95\\x18\\xac\\xa7\\xba\\xef\\x61\\xe8\\x99\\x15\\x89\\x46\\xf8\\x8b\\xaa\\x83\\x1f\\xc5\\x38\\x95\\xde\\x68\\xbd\\x12\\x1e\\xd4\\x0a\\xdb\\xf3\\x56\\xf4\\xac\\x17\\x81\\x50\\x3a\\x1f\\x90\\x83\\x4b\\x11\\x23\\xb5\\x7e\\xdd\\x80\\xb8\\x46\\x92\\x38\\x9a\\x05\\x88\\x97\\xcc\\xa5\\x9e\\xca\\xc7\\x66\\x11\\xbb\\x28\\xf0\\xd1\\x4c\\x61\\xbb\\x88\\xa3\\xd3\\x1f\\x06\\x2b\\x47\\x47\\xc2\\xe7\\xa7\\x12\\x10\\x0b\\x6d\\x41\\x5a\\xc9\\xe2\\xae\\x84\\x78\\xe2\\x7d\\x3c\\x19\\x88\\x64\\xa9\\x16\\x08\\x81\\x0b\\x3f\\x2e\\x54\\x7f\\x38\\x55\\xa4\\xe7\\x0c\\x39\\xa1\\x30\\xf9\\x7d\\x4b\\x0b\\xe4\\x0a\\x6e\\xa9\\xd1\\x57\\xcc\\xb8\\xe7\\x65\\x2b\\xde\\x4a\\x57\\x3c\\xad\\x77\\x48\\x5a\\x62\\x3e\\x78\\x09\\x94\\xa1\\x81\\x2b\\x22\\xfa\\x10\\x32\\x54\\x2d\\x98\\x1b\\x81\\x32\\x52\\x11\\x72\\x15\\x77\\x1c\\x21\\x7a\\x02\\xea\\x95\\xcd\\x4a\\xe2\\x3b\\x5c\\x5c\\xfc\\xc4\\xd2\\x6d\\xee\\xb8\\x10\\x69\\xb3\\xde\\xd3\\xff\\xb5\\xf1\\xfe\\x07\\xce\\xdb\\x65\\xe0\\x9e\\xac\\xca\\xc0\\x25\\xba\\x64\\xab\\x05\\x2e\\x28\\x0a\\xc9\\x33\\xcf\\x5e\\x2f\\x3c\\xe7\\x6e\\x54\\xcf\\xad\\xce\\x25\\xd5\\x7e\\x2b\\x55\\xbb\\xb5\\xf9\\xa2\\xb2\\x9e\\x96\\x25\\x68\\xbc\\x45\\x97\\x04\\x2e\\xe4\\xe6\\x22\\xab\\xdc\\x83\\xff\\x8f\\x48\\x46\\x9f\\x1b\\xea\\x96\\x51\\x90\\x6e\\xd0\\x55\\xfe\\x8b\\xd2\\x2a\\x80\\x75\\x6c\\x1c\\xa1\\x17\\x9b\\x93\\x62\\xb5\\x46\\xcc\\x16\\x08\\x8d\\xb1\\x76\\x07\\x2b\\x4d\\xbd\\x52\\x90\\x10\\x5d\\x0d\\x25\\xac\\x66\\xc1\\x41\\x22\\xb6\\x85\\xc3\\x26\\x53\\x1b\\xc9\\xdc\\xff\\x28\\xac\\x29\\xbd\\x9a\\x80\\x31\\x49\\xb0\\x8f\\xee\\xed\\xeb\\xf1\\xa7\\xa6\\x5d\\x62\\x2f\\x8d\\x1c\\x95\\xb0\\xa3\\x13\\xe3\\xf5\\x3d\\x73\\x7f\\x89\\x03\\x48\\x5d\\x71\\x57\\x92\\xc2\\xa6\\x40\\x40\\x27\\xc3\\xb9\\x44\\x63\\x86\\x1a\\xe9\\xa8\\xe7\\x7e\\x30\\x4d\\x1d\\x4a\\x66\\x23\\x70\\xa0\\x8e\\x08\\x9d\\xb8\\x4c\\x5e\\xf0\\x67\\x08\\x23\\xca\\x10\\xa2\\x10\\x18\\x76\\x48\\xeb\\xd2\\x1b\\x14\\x5d\\x1e\\x23\\xce\\x73\\xe0\\x2a\\xce\\xac\\x4d\\x21\\xbb\\xbe\\x4b\\x13\\x4f\\x64\\x53\\x14\\xf3\\x68\\x06\\x24\\x2b\\x46\\x01\\x3e\\x6b\\xc1\\x9d\\x16\\xc0\\x9b\\x69\\x29\\xe2\\xc2\\x12\\x5c\\xb3\\x58\\xe2\\x18\\x9d\\x72\\x10\\xa4\\x45\\xa4\\xb2\\x70\\x66\\x7c\\xe3\\xf9\\xa9\\xd4\\xb4\\x94\\xbb\\xa8\\x61\\x99\\x2c\\x58\\x36\\x96\\xd9\\xd2\\x9d\\x3c\\xa2\\xa8\\x54\\xe8\\x51\\x99\\x1c\\x26\\x0b\\x6a\\x67\\x1a\\xa5\\x39\\x66\\x44\\xcd\\xba\\xd4\\x26\\x3c\\x08\\xce\\xad\\x0b\\x92\\xd9\\x11\\x65\\xab\\xbe\\xd8\\x0a\\xbc\\x26\\x64\\xd1\\x9d\\x4c\\x93\\xcf\\xc9\\x31\\x8f\\x1e\\x35\\x31\\x54\\x3a\\x5a\\x25\\x83\\xb6\\x94\\xd4\\xdb\\xca\\xa5\\x53\\x32\\xad\\xeb\\xcc\\xe9\\xb6\\x80\\x13\\x45\\x9a\\x9c\\x78\\xe6\\x10\\x77\\x8c\\xfc\\xe8\\x10\\x11\\xfd\\x70\\x7e\\x9a\\xb7\\xef\\x6d\\xbe\\x6a\\x55\\x8e\\x97\\xf2\\x12\\xe7\\x56\\x75\\x81\\xda\\x68\\x81\\x3e\\x2a\\xac\\x93\\xd0\\x94\\x82\\x38\\xa6\\x3c\\x32\\x8a\\x94\\xa4\\x9e\\x83\\x4a\\x79\\x62\\x73\\x31\\x24\\x04\\xe5\\x5a\\xc0\\x03\\x12\\xf1\\x92\\xc8\\xe4\\x13\\xea\\xef\\xc1\\x01\\x6c\\x89\\xaa\\xd6\\x8d\\xe2\\x03\\xf4\\x2b\\xe7\\xa7\\xda\\xd8\\x5e\\xe7\\x91\\x46\\x65\\xce\\xf5\\x88\\xa8\\xf3\\xd8\\x23\\xa1\\xab\\x05\\xc8\\xea\\x96\\x88\\x66\\x4e\\xae\\x96\\x02\\x07\\x4b\\x55\\x2f\\x05\\xc1\\x59\\xb0\\x61\\xf6\\x21\\xef\\xbe\\xb7\\x35\\xa5\\x94\\x23\\x06\\x10\\x61\\x58\\xed\\xc1\\x07\\xd8\\x5d\\x28\\x08\\xe1\\x4e\\xa3\\x88\\xcb\\x59\\xb9\\xd7\\x52\\x64\\xab\\x45\\x2b\\xff\\x3a\\xb1\\x15\\x42\\x09\\x65\\x9f\\x33\\x07\\x72\\x42\\x27\\xe6\\xed\\x66\\xae\\x17\\x98\\x81\\x00\\xb0\\x55\\x23\\x88\\xbd\\x9e\\xd5\\x64\\xc9\\xcf\\x96\\x28\\x6d\\x1b\\xdb\\x72\\x19\\x27\\x98\\x5f\\x60\\x7b\\x32\\x17\\xbb\\x65\\x14\\xe1\\x37\\x59\\xca\\xf9\\x80\\xdf\\x74\\x2d\\x33\\x2e\\xbb\\xc3\\xdc\\x9b\\x82\\xe8\\xaf\\x58\\x91\\xa4\\x38\\x46\\x33\\x8c\\x7b\\xe4\\x20\\x5b\\xec\\x3d\\xa2\\x62\\xad\\x6e\\xa6\\x79\\x95\\xfc\\xf2\\x31\\x79\\xf2\\xfd\\x03\\xe9\\xdc\\x6d\\x92\\xc9\\x93\\xeb\\x64\\xd2\\x96\\x0c\\x4f\\x22\\x76\\xcd\\xc2\\x02\\x88\\x9c\\xa5\\x4b\\x17\\x9a\\x10\\x9b\\xe6\\x72\\xd8\\x91\\x94\\x19\\xe6\\xb4\\xdc\\x13\\x01\\x9c\\x09\\x59\\x68\\x0e\\x26\\x64\\xbb\\x4d\\x1d\\x34\\x92\\x27\\x2f\\x8a\\x3f\\xc4\\xe2\\xfa\\x48\\x10\\x92\\x36\\xfa\\xec\\x1a\\xa4\\x3f\\x65\\x99\\x98\\x93\\xcb\\x69\\xb4\\x54\\x38\\x36\\x9b\\x37\\x02\\x82\\x6d\\xf3\\xa2\\x00\\x13\\xa2\\xc9\\x13\\xb9\\x0c\\x87\\xb4\\xaa\\xb6\\x15\\xda\\xa4\\xea\\xd8\\x0e\\x7c\\x4e\\x9c\\x65\\x34\\xd4\\xee\\xcb\\x12\\xe9\\x29\\xfd\\xd5\\xec\\xf9\\xdd\\x73\\xf4\\xb8\\xc3\\x94\\xd1\\x5b\\xfc\\xb9\\x6a\\xdc\\x2e\\x93\\xc3\\x06\\xa7\\x5c\\xce\\x4f\\xb9\\x16\\xd7\\x38\\x2e\\x55\\x31\\x5b\\x4f\\xd0\\xae\\xd5\\x8c\\x80\\x23\\x2c\\x7f\\xaa\\x71\\x49\\x98\\x0a\\xb9\\x9c\\x66\\x0a\\xb2\\xf3\\x24\\x79\\x9f\\xda\\xdf\\x0b\\x21\\xf1\\x64\\xf6\\x57\\xbf\\x15\\x92\\xac\\x4b\\xf1\\x74\\xcd\\x1c\\x96\\x92\\x79\\xad\\xba\\x14\\xca\\x4c\\x0d\\x82\\x5d\\x5a\\xb0\\x12\\x89\\x70\\xa2\\xc4\\x10\\x06\\x5c\\x48\\x6b\\x3b\\x4f\\xb5\\x9c\\x9f\\x46\\xe1\\xbb\\xb4\\xdf\\x1c\\xd1\\xba\\x66\\x05\\xf1\\x42\\x1d\\x9c\\x5d\\x96\\x88\\x62\\xd4\\x55\\x75\\x80\\x08\\xe3\\x7a\\x08\\x33\\xe7\\xb0\\xf3\\x79\\x2b\\x1f\\x56\\xbb\\x5d\\xd5\\x1f\\xbf\\x6f\\xa1\\x42\\xed\\x6c\\x5d\\x8c\\xe2\\xff\\xe7\\x7c\\x2e\\x05\\x72\\x42\\x79\\xae\\x29\\xec\\xb8\\xd2\\xbe\\xf4\\xb2\\x02\\x91\\x0a\\x8d\\x92\\x5a\\xec\\x85\\x93\\xbd\\x65\\x90\\x42\\xeb\\x51\\xd8\\xae\\xda\\xc1\\x98\\x4c\\x75\\x31\\xc6\\x07\\x2b\\x14\\xf7\\x7c\\x15\\x24\\xa9\\xc0\\x73\\xec\\x23\\x39\\x73\\x8f\\x59\\x31\\x9c\\xc7\\xbd\\x98\\xcf\\xec\\x11\\xc3\\x9c\\x50\\x30\\xc2\\x50\\x87\\xb3\\x8a\\xa1\\x0c\\x13\\xd9\\x8c\\x7c\\x13\\x1d\\xae\\xd5\\xf4\\x0d\\x08\\x11\\x03\\x36\\x8e\\x30\\x96\\xcf\\x5e\\xa4\\xe8\\x15\\xa9\\xd8\\x63\\x57\\x6a\\xd9\\x91\\xa4\\xb1\\x98\\x7b\\xc5\\x0a\\xbc\\x99\\x3f\\xcf\\x02\\x62\\x51\\xf1\\x19\\xda\\x0b\\x0a\\xf2\\x3b\\x56\\xa2\\x46\\x7d\\xd8\\x78\\x40\\x3a\\xbe\\xb8\\x61\\xaf\\x2d\\x69\\x8b\\xb1\\x3a\\x42\\xf6\\x43\\x4e\\xbb\\x22\\xa4\\x9f\\x94\\x76\\xbe\\x6c\\x45\\x1a\\xff\\xec\\xa7\\xdf\\x3d\\x5d\\x95\\xb3\\x2f\\xfb\\x92\\x99\\xac\\xa2\\xbb\\xdb\\x98\\x18\\x85\\x1c\\x1d\\x35\\x99\\xac\\x46\\x83\\x2e\\x0f\\x81\\xf1\\xd7\\xe6\\x7c\\xa5\\x09\\x6a\\x50\\x93\\x7d\\x8e\\x91\\xfd\\xcd\\xc8\\x40\\xd1\\xbf\\x2e\\xfc\\xb9\\x4d\\x5c\\x69\\x93\\x62\\x1f\\x6a\\x7c\\x7e\\xca\\x45\\x96\\xf7\\xf8\\x24\\x88\\xc2\\x45\\x01\\xdf\\xda\\x7a\\x08\\x1a\\xa8\\xa0\\x66\\x27\\x30\\x98\\xd5\\x06\\xf3\\x63\\x23\\x28\\xa7\\xaa\\x1f\\x76\\x4b\\x8b\\x36\\x07\\xf4\\x53\\x08\\xb9\\xfd\\xc1\\xeb\\x93\\x17\\x68\\xd9\\xc3\\x4d\\xd7\\x37\\x41\\x6b\\x10\\x91\\x59\\xb2\\xec\\x38\\xe5\\xd9\\xeb\\x85\\x70\\xe9\\x8a\\x05\\xae\\xa4\\xca\\xce\\xa3\\xf0\\xa5\\x5e\\x88\\xee\\x22\\x04\\x38\\x46\\x41\\xf9\\x9d\\x8a\\x10\\x73\\xae\\x3b\\x5f\\xb7\\x02\\xe0\\x75\\x2c\\x2b\\x3b\\x4c\\x5d\\x42\\x51\\x29\\xe8\\x52\\xb2\\xa0\\x7e\\x61\\xc8\\x66\\xa4\\xa5\\x4a\\x3d\\x31\\xa7\\xa4\\x11\\x65\\x85\\x1c\\x23\\xda\\x26\\xd9\\xec\\xf7\\xd2\\x8c\\xbc\\x2f\\xfe\\xd0\\xf3\\xe3\\x4c\\x0a\\x41\\x75\\x1e\\xac\\x70\\x57\\xb3\\xda\\x01\\x3b\\x89\\x79\\x56\\x9a\\xdf\\xf9\\xcc\\x3c\\x53\\x4a\\x83\\x84\\xe6\\x38\\xf1\\x98\\x51\\x17\\x19\\x26\\x56\\x13\\xf7\\x08\\x8c\\xb6\\x6d\\x0e\\xef\\x9f\\xbe\\x21\\x5f\\x28\\xb6\\x8c\\x72\\x07\\x09\\x86\\xb2\\x8a\\x6a\\xb0\\xaa\\x2f\\xaa\\xd0\\x52\\xde\\x7a\\x60\\x3d\\x56\\x86\\x93\\xba\\x38\\x2f\\x9b\\x2e\\xb6\\x98\\xf3\\x32\\x80\\xb5\\x45\\x76\\x66\\xbb\\xc1\\x8b\\xad\\xbc\\x37\\xf2\\x90\\x51\\x25\\xa4\\xc1\\x25\\x2c\\xd1\\x41\\x25\\x40\\x55\\xe7\\xe4\\x54\\x1b\\x50\\x31\\xce\\xba\\x35\\x89\\x66\\x12\\xd9\\x41\\x9f\\x50\\xa2\\x69\\x6c\\x61\\x65\\x12\\x60\\xc5\\xd0\\x4f\\xab\\x16\\x49\\xec\\x2c\\x7b\\xca\\xca\\xc1\\x5b\\x9c\\x06\\xb4\\x6e\\x4b\\x04\\x63\\x9e\\xac\\x95\\x87\\x15\\x2e\\x84\\x8b\\x5a\\x93\\x81\\x5c\\x65\\x33\\x30\\x4c\\xac\\x30\\x1d\\x41\\x62\\x20\\x51\\x36\\x0f\\x65\\x02\\x36\\xeb\\x4b\\x62\\x39\\x97\\x28\\xb4\\xdd\\x0d\\x84\\xc1\\xca\\x95\\x5b\\x10\\x19\\x46\\x05\\x4f\\x5f\\xec\\x15\\xfe\\x91\\x75\\xd4\\x3d\\xc8\\x16\\xde\\x17\\x7a\\x46\\x63\\x4f\\xbb\\x2a\\x51\\xa1\\x95\\xcd\\x12\\x8f\\x70\\x68\\xf6\\xa0\\x05\\x8c\\xc9\\xd7\\x6a\\xa9\\x96\\xdb\\x2b\\xb2\\x32\\xcd\\x94\\x0b\\x1b\\xad\\x52\\x25\\xf1\\x40\\xad\\x39\\xce\\x96\\x42\\xa0\\x84\\x34\\x98\\xd9\\x17\\x02\\x94\\x65\\xc3\\xf5\\xa4\\x7d\\xdf\\x60\\x04\\xc8\\xfb\\x5c\\xc6\\x76\\x39\\x5a\\x03\\x1e\\xc5\\x0e\\x3c\\x63\\x83\\x11\\x1c\\x89\\xff\\xdd\\x3a\\x8d\\xf2\\x6b\\xa9\\xdb\\xfe\\x60\\xbb\\x28\\x16\\x3f\\x3e\\x97\\xdc\\xae\\x78\\x14\\x0b\\x0f\\x3e\\xbb\\x5c\\xcc\\x17\\x0a\\xe3\\x75\\xb8\\x54\\xb3\\xc6\\x1c\\xdf\\x06\\x8b\\xfa\\x22\\x37\\x83\\xa1\\xa0\\xed\\x0a\\xf3\\x1c\\x02\\xca\\xe5\\x50\\xe4\\x90\\x7e\\xdc\\xba\\x74\\x7c\\x58\\xf2\\x2e\\x32\\xb9\\x56\\x2b\\x4e\\x72\\xb9\\x28\\x2d\\x5b\\x2e\\x95\\x96\\x0d\\x8f\\xd3\\x4e\\x4a\\xba\\x9c\\x00\\x9e\\x38\\x28\\xff\\x50\\x1d\\xb6\\xd7\\xc5\\x33\\x0b\\x61\\x37\\xa0\\x5a\\x1f\\x87\\x8c\\x92\\x4f\\x57\\xb6\\x85\\xbc\\x77\\x6e\\xa4\\xe6\\x52\\xae\\x80\\x3c\\xdd\\xe5\\x7c\\x28\\xe0\\x4c\\x3b\\x5b\\x69\\x80\\x69\\x39\\xb1\\x06\\xbe\\x74\\xc9\\x83\\x10\\x6a\\x73\\x33\\xb5\\x41\\xa5\\xa7\\x4f\\x65\\x44\\x8a\\x21\\x2d\\xa5\\x60\\x26\\xcc\\x3e\\x77\\x65\\xbb\\x2c\\x15\\xfa\\x11\\x1d\\xc6\\x16\\xe6\\x9d\\xe3\\xe0\\x8b\\xa3\\x4c\\x9d\\xed\\x13\\x0a\\x75\\xea\\x0e\\xcd\\x56\\xaf\\x10\\x41\\x0b\\xec\\x16\\xad\\x3a\\xa0\\xe6\\xfb\\xf6\\xa8\\xd7\\x67\\xbb\\x94\\x25\\x63\\x0e\\xc2\\x32\\xcd\\x94\\xda\\x20\\x52\\x1d\\xcb\\xec\\x2b\\x72\\xb0\\x88\\xe6\\x2c\\x61\\xe7\\x69\\x2b\\x11\\x4b\\x3b\\x5e\\xab\\x1f\\xb2\\x0f\\x10\\xa9\\x4e\\x01\\xf0\\x4c\\x84\\xd3\\x14\\x62\\x55\\x8d\\x0b\\x7b\\x72\\xe2\\xc4\\xb0\\xd3\\x4d\\x3d\\x84\\x0e\\xd7\\xad\\xc7\\xfe\\x20\\x6f\\xc1\\x1e\\xb2\\x38\\x5a\\x55\\xd4\\xec\\x39\\xcf\\xaa\\x3d\\x59\\x1c\\x82\\x1d\\x18\\xe0\\x51\\x64\\x19\\x01\\x46\\x8b\\xba\\x14\\x51\\x12\\x9f\\x9b\\xe0\\xf5\\xa3\\x79\\xcf\\x2d\\xb6\\xcb\\x0a\\x38\\xb6\\xee\\x8a\\xaf\\x4b\\x21\\xbc\\x64\\xfa\\x9a\\xa9\\x82\\x7d\\xbc\\xca\\xbd\\xbb\\x0a\\x67\\x86\\xfa\\x5e\\xf2\\x6b\\x29\\xc1\\x6a\\x58\\x53\\xf5\\x02\\xd9\\x9b\\xd1\\x89\\xca\\xb6\\xa6\\xf6\\xf4\\x80\\x7a\\x80\\x32\\xc7\\x89\\x06\\x96\\xe6\\xa4\\xb5\\xc1\\xeb\\x45\\x0c\\x8a\\xfa\\xab\\x99\\x02\\xa5\\x85\\xd9\\x2b\\x45\\x2d\\x7f\\x29\\xf2\\xaf\\xe7\\xa7\\x51\\xc1\\xce\\x7d\\x9e\\xdc\\x1c\\xe6\\x5a\\x67\\x88\\x6d\\xa9\\x49\\x91\\xb1\\x6b\\xe3\\x2d\\xc4\\x72\\x8a\\x33\\x49\\x1a\\xef\\x0f\\xdb\\xb8\\xf9\\xac\\x8d\\xcc\\x8e\\x73\\x1a\\x22\\xc3\\xbe\\xb7\\xd3\\x2e\\x7c\\x0a\\x69\\x47\\x01\\x09\\x74\\x2a\\xa9\\x70\\x05\\x86\\x03\\x99\\xd5\\x2c\\x97\\xf5\\xb4\\x95\\xea\\xb8\\xa9\\x3c\\xac\\x33\\xa7\\xd2\\x4b\\xf6\\xc2\\x6f\\xbd\\x6d\\x79\\x7d\\xba\\xd2\\x5a\\x28\\xa5\\xbb\\x7e\\x18\\xf3\\xed\\x1f\\xd6\\xa8\\xb9\\x94\\xf2\\xfb\\x8f\\x59\\xdc\\xbb\\x82\\x96\\xb5\\xea\\x76\\x29\\x3c\\x8c\\x5c\\x6d\\xf1\\xdf\\x3c\\x6c\\x71\\x37\\xe0\\x96\\x1f\\x02\\xb6\\x9c\\xc6\\x76\\x0c\\x29\\x26\\xba\\xef\\x1e\\x23\\xdd\\x13\\x77\\xdf\\x64\\x37\\xe8\\x65\\x8b\\x40\\x28\\xc8\\x49\\x30\\xa8\\x52\\xa2\\x63\\x91\\x09\\x87\\x18\\x55\\x51\\x92\\x8d\\x96\\x70\\x64\\x9c\\xfc\\xa2\\xc6\\xa9\\x22\\xa0\\xd1\\xf3\\x92\\x07\\x68\\xca\\xbe\\x55\\x10\\xa3\\xe5\\x08\\x00\\xd8\\xe3\\x55\\x8f\\x44\\x26\\x0d\\x5d\\xc4\\x5b\\x4c\\xfd\\x81\\xa5\\x14\\x9b\\x6f\\x01\\x47\\x4e\\x21\\xa2\\x72\\xa9\\x1d\\x9d\\x78\\x2c\\x62\\x05\\x6c\\x5d\\x94\\x29\\x45\\x47\\xa8\\x1c\\x6a\\xfb\\x6c\\x64\\xd7\\x8b\\x68\\x70\\xcf\\xed\\x67\\x8b\\x87\\xeb\\xcb\\x4d\\x56\\xfe\\x07\\xcb\\x24\\x49\\x74\\x29\\xcc\\xad\\x2b\\x41\\xb9\\xb3\\x88\\xab\\x42\\x6e\\xe6\\x44\\x4b\\x01\\x48\\x3a\\x50\\x00\\xf2\\x67\\x3f\\xfd\\xee\\xd9\\x4a\\x15\\x7d\\xa0\\xfa\\x7b\\xa2\\x90\\xab\\x72\\xd8\\x48\\x7a\\xbd\\x5b\\x7d\\x3e\\x1d\\xe8\\x5a\\x85\\xfc\\x7e\\x0b\\x05\\x9e\\x26\\x6a\\x8e\\x52\\x0e\\xf7\\xc6\\xdd\\xcf\\xd6\\x1e\\xff\\x87\\x19\\x32\\x6a\\x95\\xa7\\xc6\\x33\\xe7\\x81\\xab\\xf2\\xa5\\xb0\\xa3\\xdc\\x06\\x86\\xff\\x3f\\x8a\\xea\\xcc\\x38\\xfb\\x6d\\xb0\\x10\\x16\\x91\\xc1\\x9b\\xf3\\x13\\x99\\xb7\\x7c\\x9f\\xe9\\x5f\\xbb\\xda\\x1f\\xea\\x5b\\xc8\\x91\\xa5\\xe9\\xb4\\xe8\\x7a\\x9d\\x12\\x33\\x75\\x23\\xba\\xa3\\xed\\xcb\\x51\\x26\\xee\\xae\\x2f\\xf8\\x82\\x63\\xf7\\xd6\\x04\\x97\\x83\\x13\\x9e\\x38\\xbb\\xd2\\x06\\x9c\\xc8\\x18\\x6d\\xf3\\xe5\\x5e\\x0f\\xc4\\x2f\\x45\\x39\\xac\\x42\\xb1\\x95\\x4f\\xeb\\x9e\\x7a\\x04\\xb5\\x98\\x3f\\xcd\\x6a\\xb6\\x44\\xab\\xa2\\x69\\x45\\x34\\x43\\xcf\\x87\\x50\\x8e\\x0a\\x43\\xf0\\x95\\x79\\x73\\xc7\\x4d\\xdc\\xda\\xe7\\xfe\\x40\\x13\\x57\\x54\\x74\\x04\\xba\\xc9\\x01\\xb4\\x49\\xd3\\x65\\xfb\\xa1\\xcd\\x0f\\x58\\x6b\\x8f\\x0f\\xb4\\xf1\\x14\\x02\\x17\\x1c\\x7a\\x52\\xc5\\x8e\\xee\\xb3\\x38\\x15\\x0b\\x2f\\x42\\x89\\xd9\\xba\\x1c\\x7a\\x02\\xb7\\xd9\\x84\\xa4\\x37\\xe9\\xdc\\xb5\\xc6\\x5e\\x84\\xc6\\x93\\xd4\\xa5\\x3e\\xb6\\x4f\\x71\\xf4\\x2d\\x5c\\x9c\\xae\\x99\\xe2\\xe4\\x7b\\xdf\\xf5\\xd0\\x66\\xcf\\x61\\x19\\x0c\\x8c\\xf7\\xd5\\xe4\\xe9\\x84\\xca\\xac\\xaa\\xf5\\x64\\x2b\\xfb\\x0a\\x7f\\x21\\x80\\x95\\x61\\x00\\x14\\x00\\xc5\\xdf\\x3c\\x59\\x09\\x18\\xae\\xa3\\xb7\\xd4\\xde\\xee\\x3b\\x84\\xc3\\x92\\xf7\\xf2\\x78\\x7b\\xa2\\xd7\\x9a\\x6c\\x5b\\x10\\xbb\\xb8\\x30\\x94\\xda\\xab\\x7f\\x50\\xa0\\xdc\\x0d\\x5d\\xa9\\xe5\\x81\\x32\\x0a\\x24\\xef\\x62\\x43\\x95\\xfc\\xb2\\x43\\xbe\\x14\\x15\\xe7\\x63\\xa8\\xbb\\x6c\\x6d\\xcb\\xce\\xd7\\x56\\x51\\x1e\\x5f\\x24\\xed\\x7c\\x8c\\x61\\x80\\x7b\\xd9\\xe3\\x4f\\x89\\x7c\\x7e\\x9a\\x45\\x5c\\x2a\\x69\\x27\\x14\\x70\\x22\\x45\\x4a\\x0d\\x45\\xd0\\xb6\\x47\\xbc\\x76\\xa3\\xdf\\xad\\xe0\\x67\\x58\\xea\\x7d\\xd6\\x65\\x5b\\x8b\\x6e\\xb3\\xf7\\xa6\\xcc\\xe7\\x88\\xfc\\xa0\\xb4\\xaf\\x48\\x2e\\x16\\x9b\\x14\\x7b\\x85\\x62\\xb1\\x53\\xd9\\xae\\xd4\\xf7\\x74\\x17\\x05\\x3e\\x4f\\x93\\xd5\\x9c\\x29\\xef\\xa3\\x8e\\xfe\\x6c\\xed\\x5b\\x7e\\xa8\\xfa\\x9c\\xa7\\xac\\x3b\\x7b\\x5b\\xf6\\x6f\\x0e\\x69\\xed\\x83\\x7e\\xb0\\x21\\x45\\x04\\x66\\xbe\\x8b\\x30\\x5f\\x99\\x1e\\x1e\\x70\\xbe\\xa4\\xbe\\xa3\\x3c\\xdf\\x1c\\xf5\\xda\\x0a\\xf0\\x70\\xa3\\x66\\xda\\x14\\x40\\x65\\xfb\\xde\\xe6\\x50\\x57\\x96\\x80\\x7d\\xc1\\x4e\\x45\\xda\\x87\\xb0\\xe4\\x1d\\x0b\\x7a\\xea\\xcb\\x56\\xda\\xf9\\xa5\\xea\\xa0\\x7c\\x1c\\xa5\\xdc\\xe7\\xb5\\x2b\\x15\\xf6\\xe2\\x1b\\x73\\x7c\\x57\\x4c\\x77\\x8f\\xf1\\xac\\xf4\\xa7\\x8b\\xf1\\xd4\\xed\\xd5\\xdd\\x7e\\xd1\\x69\\x54\\xd0\\x7c\\xb7\\x85\\x7f\\x7e\\x83\\x0a\\xb2\\x64\\xd6\\x0a\\xb9\\x9c\\x78\\xa6\\x4a\\x3b\\x92\\x34\\x67\\x96\\x07\\x2b\\x7e\\x3c\\x67\\xe4\\xdb\\x08\\xce\\xb3\\x7c\\xd7\\x2a\\xc8\\xd2\\xaa\\x85\\xc8\\x11\\xea\\x26\\xe9\\x55\\xdc\\x3a\\x60\\x52\\x3f\\x79\\xad\\xcc\\x3c\\x78\\x41\\xd0\\x53\\x89\\xed\\x47\\x84\\xac\\x37\\x0d\\x99\\xcf\\x6f\\xd0\\xa2\\xde\\xa7\\x2a\\xa6\\xd2\\x0e\\xf2\\xa6\\x07\\xae\\x72\\xea\\xee\\x5e\\xc8\\x52\\xe7\\xf0\\x06\\xed\\xed\\x7d\\x9a\\xc3\\x1f\\xb0\\x12\\xec\\x69\\x4a\\x84\\x53\\x24\\xdd\\xbd\\xa1\\xc0\\xf3\\x1b\\x54\\xba\\xf7\\x69\\x36\\x45\\x14\\x26\\xca\\x3b\\x48\\x92\\xfb\\x2c\\x88\\x7b\\xd0\\xda\\xbc\\x3a\\xcd\\x37\\x28\\x9e\\xef\\xd3\\x34\\x73\\x74\\x94\\x73\\xfa\\x41\\xd9\\xab\\xbb\\xbf\\xe5\\xe2\\xef\\x5e\\x6e\\x59\\x97\\xf4\\x86\\x73\\xbe\\xdf\\xa7\\x25\\x55\\xd5\\x34\\xf3\\x8d\\x31\\xb5\\xdf\\xe3\\xf4\\xb9\\x35\\x93\\xaa\\xdb\\x23\\xd9\\x9c\\xdb\\xb5\\x32\\x1e\\x6a\\xbd\\xc8\\x48\\x2f\\x04\\x97\\x8d\\x10\\x4e\\xfc\\xb6\\x0b\\x84\\xac\\xe7\\x38\\x48\\x40\\xfa\\x4d\\x18\\x24\\x44\\xa7\\xff\\xeb\\x0d\\xd5\\x63\\xad\\xa9\\xd7\\xb6\\xfb\\x0b\\x7f\\xf9\\x66\\x74\\xca\\x3d\\xbd\\x75\\x10\\x36\\xb2\\x26\\x75\\x74\\x6b\\x75\\x33\\x52\\xb8\\xe3\\xca\\x53\\xb0\\xd8\\x27\\x8b\\xef\\x84\\x77\\xd5\\x8e\\x2d\\x44\\xee\\x64\\x15\\x28\\xd9\\x14\\xc1\\xcf\\x70\\x38\\xa2\\x8c\\xa5\\xc1\\xc9\\x64\\x91\\xde\\x9e\\x5a\\x3f\\x67\\x49\\x41\\xe2\\x71\\xc4\\x52\\xda\\x52\\x5f\\x82\\x72\\xaf\\x20\\x52\\x06\\x1c\\xf7\\x44\\x08\\x3c\\x8b\\x32\\xa0\\x3a\\x62\\x88\\x23\\xd2\\x31\\xab\\x55\\x26\\x40\\x3e\\x1a\\x62\\x06\\x10\\xef\\xcd\\xa5\\x5e\\xda\\x83\\x4b\\xed\\x5f\\x4a\\x7b\\x33\\xc2\\xd4\\x4f\\xbb\\x0b\\xe5\\x71\\xb2\\x8a\\xae\\x31\\x57\\x57\\x83\\xc0\\x98\\x14\\x51\\x60\\xd1\\x95\\x30\\xa1\\xaa\\x1c\\xa7\\x11\\xae\\x6a\\xe4\\x91\\x1f\\x90\\x74\\x92\\x1c\\x27\\x1a\\x45\\x10\\x79\\x8e\\x53\\x13\\xa5\\x07\\xa4\\xda\\x09\\x71\\xdb\\x34\\x8b\\x30\\x61\\x57\\xcb\\xe4\\xa9\\xba\\x22\\x87\\xed\\x40\\xcf\\xd7\\x8a\\xfb\\xfb\\x57\\xda\\xf7\\x54\\xee\\x67\\x95\\x78\\xbe\\x56\\xfc\\xdf\\xc3\\x8f\\x4b\\xef\\x6a\\xdf\\x78\\xbe\\xb6\\x14\\xbc\\x87\\x9f\\x29\\xdf\\x9b\\xa5\\xe4\\xf9\\x0d\\x81\\x08\\xef\\xe1\\xf7\\x1f\\xb0\\xb9\\xd4\\xbb\\xdb\\x5c\\x9e\\xaf\\x83\\x14\\x1e\\xa0\\x8c\\xf2\\x69\\x0a\\xf1\\x1d\\x89\\x71\\xed\\xea\\xe7\\x7d\\xd5\\x2e\\xe1\\x2b\\xc6\\x07\\x2e\\x61\\xc7\\x4c\\x23\\x27\\xd4\\xa2\\x6d\\x56\\x79\\x73\\xb2\\xe4\\x5d\\x8b\\xc6\\x47\\x85\\x86\\xfe\\x03\\x4e\\xd6\\xb2\\x36\\x4a\\x10\\x2a\\x05\\x6a\\xdb\\x97\\xbf\\x8f\\x2e\\x51\\x44\\x77\\x4b\\xf9\\xfb\\xb8\\xf8\\xf7\\x97\\x83\\xfb\\x2c\\xfd\\x08\\x68\\x4f\\xd9\\xb1\\x35\\x48\\xbd\\xaf\\x18\\x0f\\x50\\xd8\\xda\\x59\\xcd\\x6d\\x1f\\x86\\x87\\x42\\x05\\x84\\xd0\\x05\\x46\\x0c\\x70\\x73\\x12\\xdb\\x84\\x9a\\x94\\x2c\\x23\\xe1\\xf0\\x52\\x14\\x3c\\x46\\x79\\x05\\x64\\xfe\\xc1\\xd2\\x6d\\x26\\xe3\\xba\\x84\\x72\\x70\\x80\\x27\\xba\\xc7\\x75\\xe4\\xee\\xf4\\x07\\x77\\x08\\xfb\\x0c\\xff\\x84\\x03\\xeb\\x97\\x87\\x71\\x72\\xbd\\x55\\x73\\x95\\xc9\\x8b\\xb0\\x2e\\xea\\xbe\\x6e\\x64\\xaf\\xf3\\x3f\\xf5\\x5a\\xbc\\x91\\x86\\x94\\x50\\x72\\x0e\\xc1\\x1d\\x8c\\x5c\\x58\\xb3\\xdf\\xc3\\x94\\x8f\\x23\\x3f\\x01\\x7b\\xa9\\x39\\xa9\\x38\\x40\\x1d\\x61\\xc6\\x38\\x7c\\x25\\x05\\x87\\x01\\x3a\\x4b\\xe7\\xe6\\x5e\\x7c\\xac\\x05\\xd7\\xcf\\x16\\x0e\\xfd\\x90\\x61\\x94\\xef\\x52\\xb9\\x1c\\x53\\x77\\x72\\x07\\x71\\x31\\xed\\x0f\\x46\\xb5\\xf8\\xc1\\x6c\\x86\\x1d\\x0b\\x70\\xa8\\xc8\\x9d\\xa7\\xd0\\xca\\xe1\\x88\\xc1\\xb3\\xb5\\xbd\\xe9\\xef\\x50\\x5c\\x79\\xf4\\x05\\x95\\x88\\x01\\x1e\\x10\\x29\\x26\\x42\\xc8\\x95\\x7b\\x2f\\xab\\x2a\\x13\\x9c\\x4f\\x6d\\xab\\x86\\xf5\\x0f\\x56\\x75\\x59\\xd7\\xef\\xa6\\x60\\xf2\\x7f\\xac\\xdf\\x0f\\x5e\\x15\\xfb\\x54\\xf9\\x28\\xa9\\xac\\xbd\\x2f\\x9b\\x3f\\xbb\\xa1\\x24\\xc2\\x3f\\x56\\xf2\\xb6\\x9d\\x88\\x10\\xda\\x12\\xde\\xc5\\xbc\\xf3\\x03\\x6e\\xd6\\xb5\\xe5\\xf1\\x1f\\x4b\\x7c\\xeb\\x12\\xe7\\xe6\\x48\\x50\\x9e\\xf5\\x47\\x60\\xb9\\x3f\\x96\\x9c\\xdc\\x83\\xd0\\xd3\\xda\\xf6\\xfa\\x0f\\x7a\\xba\\x9d\\x9e\\xf4\\x43\\x4b\\xbb\\xd1\\xae\\xf5\\x3d\\x08\\x86\\xbc\\xfd\\xbe\\xcd\\x75\\x5d\\x1b\\x7b\\xff\\xb1\\xae\\xb7\\x0a\\x75\\x41\\xc5\\x89\\xf2\\x43\\x46\\x50\\x7d\\x1f\\xf4\\x82\\xac\\x82\\x48\\x66\\x17\\x3b\\x1c\\x7d\\xf5\\x7d\\x05\\x5f\\x9d\\xad\\x2d\\xd3\\x65\\xc9\\x5d\\xc6\\x17\\x97\\x3d\\xfd\\x15\\xc7\\x31\\x4d\\x52\\x82\\xab\\x79\\x47\\x95\\xe6\\xd4\\x94\\xee\\x5a\\xa7\\x3b\\x8b\\xa4\\xa7\\xd4\\x4b\\x02\\x2d\\xd5\\xf7\\x8b\\x2a\\xfa\\xbd\\x92\\x98\\xb7\\xa2\\x31\\x28\\x81\\x51\\x2f\\xc2\\xc1\\x63\\xec\\x76\\x4a\\x96\\x3a\\x89\\x58\\x8a\\xfc\\x72\\x54\\x2b\\x4a\\x49\\xda\\xa1\\xa2\\xd2\\xeb\\xea\\x65\\x72\\x09\\x27\\xbd\\x2d\\xa7\\x27\\x58\\xf1\\x0c\\x46\\xc9\\x4f\\x62\\x2b\\x67\\x74\\xe5\\x04\\x83\\x3a\\x2b\\x7b\\xdf\\xf9\\x9c\\x42\\x3f\\xc1\\x20\\x5a\\x40\\x78\\x56\\x8d\\x18\\xb5\\xd1\\xf1\\x22\\x14\\xdd\\x18\\x51\\x81\\x4c\\xa5\\x07\\x87\\x7e\\x80\\xc1\\x80\\x0a\\x1f\\x4a\\xb5\\x38\\x51\\xa7\\xf6\\x6a\\x39\\x56\\x7a\\x8e\\x05\\xc7\\x20\\x23\\x32\\x8b\\xcd\\x38\\x89\\x74\\xa9\\x18\\x2e\\xaa\\xe5\\xa0\\xee\\x08\\x6a\\xae\\x7b\\x33\\xba\\xf6\\x63\\xf7\\xbb\\x44\\xb1\\xda\\x1f\\x11\\x5d\\xb4\\x5e\\xeb\\x26\\xa3\\x74\\xb1\\x9d\\x0d\\x61\\x09\\x37\\x26\\x74\\xa4\\x3a\\xb1\\xa3\\xb3\\x53\\xb3\\xf3\\xf5\\x2d\\xaf\\xa7\\xab\\x86\\xd2\\x53\\x93\\x83\\xce\\xa9\\xb3\\xfa\\x42\\x21\\xa0\\xd2\\xc8\\x4c\\x05\\x25\\x00\\xda\\xe8\\x9b\\xd5\\x81\\xb6\\xb4\\x20\\x9c\\xa8\\x1f\\xbb\\x19\\xd6\\x9d\\x9f\\x52\\xe0\\xe2\\x72\\x04\\xa6\\x4d\\x3b\\xc9\\x3c\\xf3\\xbe\\x90\\x03\\xdb\\xd1\\xd8\\x96\\x14\\x96\\xfa\\x61\\x0b\\xa3\\x6f\\x56\\xb3\\x2c\\xea\\xdc\\x5a\\xe9\\xe4\\xd8\\x0b\\x40\\x6d\\x53\\xde\\x0d\\x76\\xfb\\xbb\\x9d\\x8d\\x82\\x32\\xd3\\xdc\\x8b\\x83\\xc7\\xa9\\x33\\x12\\x09\\xe1\\x7d\\x38\\x12\\x05\\x14\\x86\\x60\\xb7\\x9e\\xf2\\x57\\x8c\\xff\\xf6\\x0c\\xf7\\x7e\\x0c\\xe4\\x95\\xb3\\x50\\xdc\\xc5\\x61\\x28\\xa7\\x91\\xd2\\x7b\\x1b\\x42\\x77\\x76\\x43\\x79\\x96\\xf5\\x59\\x23\\xa1\\x9f\\x35\\xc2\\x56\\xb8\\x7b\\x92\\x64\\xf5\\xbc\\xd3\\x7b\\x7c\\xca\\x88\\x32\\x01\\x8a\\xad\\x6e\\x6a\\xfb\\xeb\\x53\\x48\\xdc\\xc1\\x63\\x48\\xee\\x76\\x0a\\x89\\xce\\xed\\xda\\xa5\\xf0\\x6f\\x64\\x6e\\x1f\\xee\\x04\\x97\\x53\\x69\\x38\\x96\\xb1\\xde\\x5f\\x01\\x5f\\xfb\\x36\\xfe\\x8d\\xcc\\x32\\x55\\x65\\x4a\\x85\\xee\\xa3\\x25\\xbb\\x45\\x4d\\xbe\\xe3\\x4a\\xdd\\x9d\\xc8\\x6f\\xc8\\xd1\\xfc\\x37\\x32\\xfd\\x59\\x1c\\x71\\x0d\\x37\\x6a\\x1c\\x0f\\xc6\\x3c\\x4e\\xf3\\xf6\\x6b\\x36\\xe7\\x7c\\xe5\\xe7\\x49\\xb9\\x7b\\x3c\\x7c\\xa9\\x07\\xb9\\x9e\\x92\\xc6\\xcd\\xe7\\xba\\x6c\\xbe\\x6c\\xe5\\x5f\\xd9\\xbf\\x0c\\x75\\x07\\x99\\xca\\x11\\x61\\xa6\\x77\\x7f\\xed\\xca\\x7d\\x72\\xf1\\x8d\\x15\\x07\\xea\\xdc\\x6b\\x5f\\x2c\\x61\\xa6\\x77\\x1f\\xcf\\xca\\xf3\\x71\\x31\\x1e\\x0a\\x0a\\x9a\\x95\\x0a\\x6e\\x88\\x33\\xdd\\x7c\\xd3\\xa9\\xb4\\xb6\\xf5\\xd8\\xd6\\x28\\x5e\\xac\\xed\\xfe\\x4c\\x75\\x5f\\xbe\\x39\\x22\\x13\\x14\\xbe\\x17\\x54\\xd5\\x42\\xe2\\xff\\x24\\xc8\\x0a\\x40\\xa6\\x76\\x2f\\xd9\\x9f\\xc4\\x4a\\x4c\\xda\\x79\\xbc\\xaa\\x89\\x0c\\xd1\\xc5\\xd1\\x93\\xf9\\xfe\\x53\\xdc\\x9f\\xd5\\x11\\x7a\\xf5\\xe0\\xa1\\x3b\\xfb\\x24\\x0f\\x20\\x31\\x92\\x81\\x70\\x62\\x68\\xee\\x4a\\xa7\\x62\\x9b\\x0c\\x44\\x2c\\x01\\x39\\x0c\\x9c\\x07\\xd5\\xf2\\xa8\\x8e\\xf0\\xd5\\x37\\xab\\x31\\xe8\\x70\\x10\\x47\\x37\\x02\\x79\\xc5\\xfa\\x03\\xa9\\x04\\x08\\xcd\\x70\\x39\\x6a\\x64\\x29\\x30\\x6f\\x01\\x5a\\x03\\x4a\\xeb\\xf5\\xba\\xbd\\xaa\\xb2\\x58\\xe5\\x39\\x3b\\xc1\\xb8\\x61\\xcf\\x79\\x4e\\xbd\\xc4\\xae\\x8f\\x16\\x43\\x20\\x8d\\xbb\\x09\\xc8\\xce\\x11\\x46\\x15\\x3f\\xd4\\x31\\xec\\x30\\xde\\xca\\xf8\\xc5\\x6e\\x54\\x0e\\x7d\\xda\\x4c\\x89\\xd0\\xb1\\x56\\x53\\x22\\xa4\\x1f\\x2c\\x63\\xe0\\xd2\\xbc\\x64\\x38\\x1f\\x05\\x1f\\x02\\xf5\\x7d\\x26\\xaa\\xa3\\xc7\\xc1\\x29\\xce\\x37\\xe5\\x09\\x13\\xe2\\x2c\\x70\\x7a\\x04\\x5b\\xf5\\xe3\\x8a\\xb3\\x74\\x27\\xb0\\x21\\x0e\\xdb\\x01\\xb5\\x2f\\xe8\\xe7\\xef\\xe7\\x21\\x32\\xa7\\x1c\\xf8\\x07\\xb1\\xe5\\xb9\\x87\\x31\\xe6\\x6d\\x4e\\x30\\xff\\xfc\\x3d\\x3a\\xf9\\x86\\xa9\\x1c\\xc6\\xa7\\x0f\\x7f\\x32\\x8e\\xbb\\xf5\\x68\\x9c\\xed\\x53\\x4d\\x74\\xfe\\xe4\\x7d\\x9a\\xbf\\xbf\\xdf\\xc9\\x41\\xa7\\x91\\xdb\\xbb\\x61\\xd6\\x17\\xf1\\x7d\\x9a\\x49\\x26\\x7a\\x67\\x6f\\xcc\\x5d\\x17\\xc3\\x3d\\xc0\\x6a\\x1c\\x26\\xd6\\xf4\\x5e\\x4d\\xf1\\x0f\\xc4\\x41\\x1f\\x2c\\xd0\\xf6\\xef\\xb0\\xb9\\x0e\\x2f\\x67\\x7e\\x9f\\x96\\x93\\x5a\\xdc\\x76\\x46\\xfc\\xdd\\xf8\\xf6\\x69\\xde\\x1e\\xd6\\xe6\\xbc\\xae\\x2d\\x77\\x94\\x97\\x88\\x5b\\x71\\xa9\\xc8\\xcc\\x5c\\x76\\x14\\x78\\x49\\xcc\\xd5\\x4b\\x2b\\xb7\\x49\\x39\\xce\\x2c\\xfd\\x4c\\x5e\\x36\\x2f\\x81\\xd8\\xad\\xa6\\xcf\\xad\\x6e\\x6d\\x0e\\xa2\\xde\\x61\\x71\\x11\\xef\\x69\\xd5\\x42\\xea\\xd4\\x40\\xec\\xcc\\x43\\xd1\\x89\\x93\\x1d\\x65\\x1a\\x10\\x66\\x83\\x33\\x8c\\x5a\\xb2\\x10\\x55\\x9c\\xed\\x82\\x39\\x4b\\xa4\\xdc\\x99\\x2e\\x1f\\x55\\x7d\\x0b\\x2d\\x44\\x00\\xa4\\xc6\\xae\\x4c\\xd0\\x3b\\xda\\xe0\\x11\\x05\\x14\\x33\\x4e\\x6b\\x1d\\x08\\x45\\x31\\xc9\\xaa\\xab\\x5b\\x7c\\x90\\x58\\x14\\xd0\\x7e\\x89\\x70\\x1a\\xc5\\x15\\xc2\\xc8\\xec\\x6a\\x37\\x75\\xf6\\x54\\x6c\\x5f\\xb3\\x85\\xcc\\x72\\x0e\\x2e\\xd9\\x49\\x67\\xae\\x1f\\x9c\\xe6\\xcc\\xb4\\x0c\\xc5\\xd2\\xec\\xca\\xc7\\x10\\x43\\x0a\\xc9\\x31\\xa5\\x91\\x10\\x05\\x6b\\xb5\\x5f\\x55\\xf7\\xb5\\x12\\x1e\\x7c\\x1b\\x19\\x2a\\x8b\\x41\\x35\\xaa\\xc9\\x33\\xbb\\xca\\x87\\xa3\\x67\\x5f\\xb4\\x9f\\xbf\\xff\\x67\\x3b\\x9d\\x32\\x65\\x47\\xb1\\x94\\x3b\\x46\\xcf\\xbe\\x78\\xf2\\x63\\xf8\\xb8\\xc8\\xf5\\x38\\x65\\x7c\\xf3\\x33\\x9f\\xfe\\x18\\x3e\\xd3\\xce\\xbe\\x78\\x17\\xe5\\x7f\\xf3\\xfb\\x9f\\xfd\\x18\\xbe\\x9f\\x9a\\x6c\\xda\\x1a\\xf2\\xf6\\xbd\\xcd\\x8f\\x5e\\x47\\xcf\\xfe\\x68\\xce\\xd1\\x3a\\x95\\x92\\xde\\x91\\xe4\\xd7\\x31\\xba\\xb4\\x37\\x6e\\x31\\x5d\\x39\\x59\\x37\\x35\\x1a\\x63\\x71\\x39\\xa2\\xa8\\xad\\xf9\\xcf\\x53\\x70\\xf0\\xd1\\x7d\\x7f\\x07\\x7f\\xce\\x11\\xc5\\x85\\xcf\\x4f\\x23\\xbd\\x27\\xe7\\x7f\\xea\\xb4\\xdd\\x50\\xb2\\xea\\x47\\x43\\x34\\xa4\\xb8\\x62\\x6b\\x03\\x6d\\xdf\\xdb\\x9a\\x0b\\x4a\\xeb\\x00\\xc0\\xb6\\x18\\xc0\\x5b\\x71\\xa9\\xe4\\x59\\x42\\xdc\\x17\\x10\\x29\\x2e\\x0a\\x4d\\xc8\\xdb\\xca\\x79\\x44\\x16\\x17\\x4e\\x9f\\xc8\\x16\\xd1\\x4c\\x69\\x57\\xf3\\xdd\\x0a\\x19\\xd4\\x5c\\x70\\xd2\\x96\\xa7\\x8b\\xb3\\x4a\\xed\\x6c\\x4d\\x33\\x3f\\x7b\\x33\\x73\\x9b\\x2a\\x10\\xa5\\x2e\\x47\\xe1\\x20\\x65\\x4c\\xc8\\x72\\x7a\\xaa\\x0e\\xd4\\x22\\xa9\\x19\\x35\\xf0\\xec\\x3c\\x8c\\x7e\\xe2\\x51\\x4b\\x23\\x20\\x31\\xca\\x8d\\xb1\\x15\\xa7\\x2f\\x33\\x05\\x09\\x88\\xfd\\x50\\xa8\\x80\\x0a\\x79\\x56\\x20\\x2f\\xdb\\x99\\x92\\x23\\xf0\\x2f\\xf2\\x7b\\x80\\xd2\\x7a\\xa9\\xfc\\x4e\\x6c\\x49\\xa9\\x5c\\xc2\\xa1\\x89\\x5d\\x87\\xdd\\xd5\\x58\\x8f\\x07\\x8a\\x38\\x1a\\xdb\\xb1\\x6d\\x18\\xe0\\x6f\\x1c\\x5f\\x8a\\xa8\\x83\\xe4\\x2a\\x4a\\x15\\x58\\x05\\xd5\\x09\\xa7\\x78\\xba\\x98\\xff\\xfe\\xde\\x08\\x1b\\xb4\\x67\\xae\\x0e\\x87\\xdb\\x22\\x8a\\x4e\\x15\\x00\\x1d\\x3c\\x44\\x46\\x5e\\x44\\x46\\xff\\xb2\\xf7\\xd4\\x54\\x62\\x20\\x94\\x28\\x95\\x77\\xf1\\x3f\\xb9\\xdb\\x1d\\x50\\x54\\xd6\\x2e\\xec\\x87\\x48\\x00\\xe1\\xbc\\x59\\x05\\xe2\\xb4\\x6c\\xdf\\xdb\\x1a\\x26\\xdf\\x50\\x1a\\x29\\xd0\\xbe\\x8c\\x49\\xe9\\x87\\x9d\\x3c\\x34\\xa8\\xe1\\x75\\x4e\\x50\\xab\\xcb\\x5b\\x09\\xa1\\x40\\x3f\\x92\\x10\\xcd\\xcd\\x2f\\x0c\\x61\\xe5\\x14\\x69\\xb9\\x1c\\x68\\xbe\\x8e\\xbd\\x6f\\x92\\x0e\\xb4\\x5f\\x31\\xf8\\xc3\\xdd\\xaf\\xd9\\xd6\\xe1\\xee\\x57\\xd1\\xa0\\x39\\x1e\\x6a\\xbe\\x0a\\x32\\x8c\\x55\\x0e\\x34\\x5f\\x51\\x9d\\x30\\x1f\\x68\\xbe\\x32\\x07\\x1c\\x6e\\xbe\\xda\\x7a\\x1c\\xe9\\x40\\xf3\\x55\\x40\\x84\\xd4\\x43\\x33\\x79\\x83\\x67\\xff\\x40\\x73\\x5a\\x91\\xc1\\x3b\\x9c\\xb1\\xc1\\x81\\x56\\x64\\xf2\\x6e\\xdd\\xad\\x4b\\xf6\\xbf\\x53\\x77\\x6b\\x2a\\x8b\\xb4\\x94\\xe6\\x8d\\xe4\\xc0\\x9c\\xb8\\xee\\x28\\xd4\\xe5\\x40\\x01\\xbd\\x3c\\xd4\\xe3\\x3a\\x2a\\x39\\x97\\xfd\\xa1\\x02\\xf9\\xa2\\x47\\xd9\\x1f\\x51\\xa0\\x97\\x87\\x7a\\x5c\\x51\\x47\\x0c\\xbd\\x16\\x9c\\x1d\\x83\\x99\\x66\\x6a\\x8c\\x43\\x82\\x25\\x89\\x25\\x3d\\x63\\xe3\\x27\\xd5\\x9a\\x9a\\x72\\xb6\\x78\\x68\\xdf\\xd3\\x8a\\x9c\\x2e\\xfa\\x2f\\xda\\x7f\\x1e\\x94\\x41\\xc5\\x36\\x53\\x4b\\x3b\\x46\\xf5\\xdf\\x16\\xbb\\x7f\\x51\\x52\\xd8\\x79\\x8a\\x07\\xc7\\xbf\\xa2\\xbf\\xb8\\x1c\\xb3\\x82\\xe4\\xb3\\x2c\\xda\\xbf\\xb2\\x7f\\xae\\xd1\\xfa\\xe7\\x8c\\xfa\\x74\\x05\\x89\\xf5\\x3b\\x45\\x0d\\x87\\xfa\\x5f\\xb1\\xe6\\x12\\xf9\\xce\\xf3\\x83\\x58\\x84\\x07\\x98\\xcc\\x95\\x22\\x58\\x96\\x6a\\x3e\\x77\\x98\\xcc\\x53\\x69\\xf1\\x21\\x66\\x7e\\xa5\\x97\\x15\\xe1\\x4b\\x33\\xcf\\xc9\\x66\\xbe\\xce\\x9c\\xd2\\x8e\\xed\\xe8\\x93\\xc5\\x73\\xcc\\x15\\xb5\\xa7\\xab\\x0e\\x86\\x2e\\x1a\\x97\\x3c\\x73\\x2c\\x3b\\x16\\xba\\xa1\\xf1\\xa1\\x65\\xe2\\xd5\\xce\\x2d\\xfb\\x82\\xed\\x92\\x5c\\xa1\\x3c\\x37\\x1c\\x19\\x15\\x70\\xea\\x3c\\xe5\\xa8\\x68\\xd0\\xe5\\xb8\\x9c\\x73\\x52\\x54\\xf4\\x59\\x75\\x3e\\xc4\\x11\\x2a\\x38\\x6a\\x61\\x39\\x3d\\xd7\\xe7\\x7e\\x1c\\x1d\\xce\\xca\\xb7\\x94\\x40\\xd6\\xcb\\xd8\\x0b\\x18\\xe7\\x7e\\xec\\xe4\\xa1\\x21\\xae\\xb1\\xc5\\xc5\\x69\\xc4\\x31\\xba\\x30\\xf3\\x3e\\xd5\\x74\\x5f\\xe6\\x2a\\xd5\\x72\\xf3\\x0d\\x0a\\xe1\\xe6\\x3b\\x07\\x06\\xb0\\xd2\\x08\\x0f\\x72\\x76\\x59\\xed\\xdc\\x2c\\xed\\xe2\\xa4\\x88\\x14\\xe9\\x5d\\xcf\\x71\\xe2\\x20\\xab\\xdd\\xbb\\x3f\\xc3\\xa0\\x86\\x87\\x2d\\x00\\xcf\\x21\\xad\\xbe\\xff\\xa0\\x54\\xbe\\xe9\\x94\\xa9\\x05\\x0b\\x16\\x72\\x31\\x25\\x9c\\x33\\x49\\x31\\xcf\\x04\\xfd\\x3f\\xe6\\x8b\\x1f\\x04\\x87\\x41\\x88\\xdb\\x87\\x31\\x4c\\x62\\xe7\\x4e\\xc4\\x34\\xe2\\x38\\x34\\x42\\xf9\\x72\\x5f\\x27\\x8b\\xea\\xf5\\x2c\\x83\\x47\\xa4\\x3f\\xb7\\x51\\x61\\x3c\\x14\\x6d\\x24\\x12\\x58\\xc5\\x67\\x33\\x00\\x34\\xb3\\x2c\\x5b\\x3c\\x80\\x1d\\x7a\\x8b\\x83\\x9a\\xcc\\x95\\x64\\x3f\\xa9\\x1e\\xb4\\x8b\\x5c\\xfb\\x99\\x99\\xb8\\xd2\\x01\\x5e\\xfb\\x09\\xd1\\x14\\xad\\xb9\\xfe\\x24\\x2a\\x78\\x93\\x1d\\x68\\x5c\\x78\\x1f\\xd2\\x0c\\x9d\\x0b\\xa5\\x43\\x50\\xcc\\x12\\x83\\x19\\x6c\\x9c\\x65\\xb4\\xa3\\x21\\x93\\x19\\xdd\\x3c\\xa3\\x42\\xb4\\xea\\x4b\\x23\\xe2\\x50\\xb0\\x28\\xd9\\x8e\\x8a\\xb3\\x80\\x0b\\x51\\x1d\\x73\\xae\\x98\\xaa\\xed\\x75\\xa2\\xf5\\x5e\\xbe\\xc8\\x5f\\x46\\x87\\x89\\x66\\x0a\\x69\\x27\\x4d\\xbf\\x2c\\x24\\x30\\x92\\xd9\\x47\\x9c\\xd4\\x14\\xe3\\x6c\\x17\\x8c\\x62\\xab\\xc9\\x35\\x4a\\x73\\x8a\\xb4\\xa3\\xd4\\x06\\x3b\\xc6\\x34\\xf3\\x2e\\x0f\\xc4\\xc1\\xe9\\x15\\x8e\\xba\\xd6\\xfb\\xca\\x60\\x66\\xee\\x36\\xf4\\x41\\xfb\\x45\\x9e\\xf2\\xce\\x4e\\x86\\xa3\\xe0\\xb8\\xd5\\xa5\\xf6\\x19\\xb7\\x72\\x0b\\x43\\x4a\\x2f\\xd6\\xd4\\x13\\x96\\xf3\\x9e\\x83\\x45\\x8e\\x04\\x15\\xfc\\x01\\xb6\\xc7\\x00\\xc9\\xbf\\x5d\\x7f\\xfc\\xc5\\xd3\\x35\\xc0\\x25\\x2e\\x7d\\xab\\x70\\x71\\xb5\\x94\\x99\\x43\\xda\\x51\\xa6\\xd9\\x0e\\xf4\\xa3\\xca\\x38\\x03\\x0e\\xa9\\x23\\x13\\xb7\\x04\\x73\\xd8\\x08\\x2b\\x4d\\x4f\\xfa\\xd8\\x9f\\x22\\x48\\x16\\x3c\\x94\\x96\\xa3\\xc4\\xa2\\x8b\\xa6\\x8f\\xbb\\xd2\\xf5\\xc5\\x4b\\xc9\\x2d\\xc5\\xdc\\x30\\x93\\xef\\x99\\x27\\x64\\x67\\x08\\xee\\x98\\x70\\xa2\\x78\\xda\\x79\\x5c\\xd5\\x62\\xe7\\x54\\xcf\\xb8\\xa0\\x4c\\xe7\\xa7\\x35\\xb5\\x2b\\xd6\\x3a\\x5c\\x1d\\x64\\x5a\\x2f\\x9e\\xde\\x84\\xd4\\x97\\xd3\\xac\\x7f\\x2c\\xdf\\x5d\\x12\\x5f\\x19\\x28\\x4e\\xcc\\xe6\\x10\\x2d\\x89\\xc3\\x09\\xa1\\xdc\\x3f\\x38\\x85\\xc5\\xa9\\x5b\\xa8\\x3b\\x0c\\x10\\x56\\x77\\x28\\x5b\\xb6\\xc2\\x80\\xa3\\x53\\x59\\x82\\x1b\\x7d\\x11\\x67\\x25\\x6d\\x31\\x4c\\x1c\\x84\\x0f\\x93\\x1b\\x5f\\x9c\\x21\\x6c\\xa7\\xa7\\xc7\\x3c\\xf9\\xd4\\x93\\x6f\\xd2\\xec\\x4b\\xdc\\x31\\xac\\x9e\\x36\\x62\\xb9\\x71\\xc4\\x94\\x32\\xdd\\x31\\xf6\\xee\\xc5\\xd3\\xb5\\x92\\xa4\\x00\\xfd\\xc7\\xb6\\x54\\xed\\x21\\x07\\xea\\xbe\\xbf\\x91\\x52\\x6a\\x74\\x70\\x37\\xed\\xfe\\x72\\xf6\\xe6\\x95\\xfb\\x96\\x8c\\x21\\x29\\xfb\\xf8\\x96\\x3f\\x7c\\xf4\\xd7\\x47\\xee\\x2f\\x1f\\x3e\\xf2\\xc4\\x37\\x35\\x2a\\xc7\\x34\\xaa\\xbd\\xd1\\xde\\xac\\xa3\\x4d\\x39\\xdd\\xd2\\x14\\x15\\x40\\x6e\\x6f\\xf9\\xe5\\x31\\x8d\\xbe\\xe8\\x8d\\xf2\\xa1\\x46\\x9f\\xf7\\x46\\x72\\xbd\\xd1\\x47\\x97\\xbf\\x51\\x11\\xcd\\x8d\\xb7\\x27\\xdc\\xe6\\xb0\\x71\\xfb\\x67\\x3f\\xfd\\x4e\\x5e\\xd8\\x17\\x95\\x72\\xbd\\xcd\\xaf\\xf6\\x6d\\xb8\\x59\\x1b\\x59\\xf5\\xf3\\xeb\\x7d\\x1b\\xd8\\x9c\\xfe\\xa2\\xc8\\xe7\\x7a\\x9b\\x8f\\x2f\\x8f\\x74\\x3d\\x25\\xff\\xf1\\xe2\\x35\\x06\\x2e\\xf5\\x45\\x87\\x9b\\x01\\xb3\\x1f\\xd1\\xec\\xc9\\x11\\xcd\\xcc\\xf6\\xfb\\x97\\x0f\\x1f\\xa5\\x15\\x99\\x5c\\x34\\x7a\\xd1\\x27\\x89\\xeb\\x81\\x36\\xcf\\x8f\\x68\\xf3\\xec\\xe7\\xb7\\xce\\x02\\x7c\\xa3\\xb7\\xb5\\x79\\x72\\x44\\x9b\\x76\\x44\\x9b\\x3e\\xdf\\x29\\x1e\\x68\\x93\\x8e\\x68\\x13\\x8f\\x68\\x23\\x47\\xb4\\xe1\\xdb\\xdb\\x9c\\x3d\\xbd\\x7d\\xbd\\xce\\x9e\\x1c\\xd1\\xa6\\x1d\\xd1\\xa6\\x1e\\xd1\\xa6\\x1c\\xd1\\xa6\\xcf\\x61\\x3e\\x40\\x1b\\x67\\xf1\\x88\\x36\\x72\\x44\\x1b\\x3e\\xa2\\x0d\\x1d\\xd1\\x26\\xdc\\xde\\xe6\\x59\\xff\\x2e\\xca\\x2b\\xfe\\x74\\xa9\\x51\\x3c\\xa6\\x91\\x1c\\xd3\\x88\\x8f\\x69\\x44\\xc7\\x34\\x0a\\xb7\\x35\\xfa\\xdb\\xe1\\xcd\\x3c\\x1f\\xbe\\xfd\\xed\\xe1\\xad\\xf7\\x66\\x83\\x9d\\xf6\\xdb\\xe3\\x61\\x82\\x7a\\x7d\\x78\\x8f\\x7c\\x75\\xf8\\xe9\\xb3\\xc3\\xb7\\x9f\\x1f\\xbe\\xfd\\xec\\xf0\\xed\\x27\\x87\\x49\\xe6\\xb3\\x2e\\xcd\\xb6\\x3e\\xfc\\xa3\\xdb\\x57\\x4e\\x8e\\x61\\xea\\x7c\\x94\\x80\\x78\\xb6\\xd9\\xe8\\x77\\x97\\x45\\x56\\x59\\x4d\\xf4\\x27\\x97\\x6f\\x53\\x58\\xdd\\xff\\xf4\\x08\\xa9\\xf8\\xfb\\x55\\x1b\\xca\\xab\\x71\\xfc\\xfe\\xb2\\x14\\xf7\\xb4\\x42\\x0a\\x7f\\x58\\x63\\x98\\xb2\\x7a\\xd3\\x1f\\x56\\xe8\\x65\\xb3\\xcd\\x97\\x87\\x6f\\x1b\\x62\\x59\\x63\\x91\\x3f\\x5c\\xc6\\x2a\\xb2\\x75\\xfb\\xb3\\x0d\\xa8\\xf2\\x2f\\xeb\\x8f\\x48\\x2b\\x30\\xf2\\x2f\\xab\\x8f\\xd8\\x6c\\xf3\\xe5\\xe1\\xdb\\x36\\x4a\\x5e\\x51\\xf0\\xbf\\x5c\\x19\\xe5\\x6a\\x0a\\x3e\\xbb\\x10\\x52\\x7d\\x90\\xb4\\x06\\x96\\x17\\x8d\\xce\\xfa\\xa2\\xb6\\xd5\\xe7\\x7e\\xb6\\x5e\\xf8\\xb6\\x5a\\xf8\\x8b\\x46\\x4f\\xbb\\xb8\\xa3\\xb2\\x9a\\xd7\\x8b\\x46\\x4f\\xf6\\x8d\\xb6\\x7a\\x32\\x5a\\x4d\\x5b\\xb7\\xdf\\x6c\\x60\\xc0\\xcf\\xf7\\xaf\\x28\\x7b\\xe4\\xbb\\xfa\\xea\\xcf\\xaf\\x30\\xb5\\xd5\\x2b\\xfa\\xed\\xff\\xba\\xb5\\xf7\\x3f\\x5f\\xe1\\xcc\\x1b\\xe0\\xee\\x17\\xeb\\x81\\xac\\xb7\\xc3\\x17\\x97\\x07\\xc2\\xab\\x6d\\xf9\\xc5\\x95\\x81\\xd0\\xd6\\xfd\\xcb\\x03\\xa1\\xd5\\x8c\\x7c\\x79\\x19\\xae\\x2e\\xf2\\x28\\xac\\x3e\\xfa\\xcb\\x15\\xb9\\xb4\\x15\\x49\\x7d\\xb9\\xa2\\x96\\xba\\xa2\\x96\\x2f\\xd7\\xd4\\x22\\xab\\xef\\xfe\\x72\\x45\\x2d\\x79\\x35\\xcb\\x5f\\xae\\x89\\x85\\x0e\\xbc\\xed\\xc0\\x72\\x7f\\x79\\x99\\x29\\xad\\x77\\xfb\\x97\\x97\\x17\\x21\\x6f\\x3d\\xfd\\x02\\xb7\\xe3\\xd6\\x30\\x17\\x62\\x39\\x30\\x67\\xdc\\x05\\x41\\x5d\\x09\\x9b\\x2f\\x8f\\x21\\xa8\\x4b\\x8d\\xf2\\x16\\x43\\xf9\\xf3\\x15\\x1d\\x6b\\x35\\x96\\xff\\x72\\xc1\\x93\\x16\\x5c\\x7f\\xa8\\xcd\\xd3\\x23\\xda\\x3c\\x39\\xa2\\x4d\\xbb\\xa5\\xcd\\x1f\\x0f\\xdf\\xfe\\xed\\xc6\\xed\\x17\\x97\\x35\\xa7\\x65\\xf5\\x65\\xb5\\x49\\xae\\x34\\x7b\\x76\\x5c\\xb3\\x76\\x5c\\xb3\\x7a\\x44\\xb3\\x3d\\x5d\\xca\\x6a\\xb5\\x5e\\x5c\\x21\\x9d\\xbc\\xda\\x25\\x2f\\xd6\\x64\\x91\\x56\\x64\\x71\\xa9\\x51\\x39\\x66\\xd4\\xbc\\xd9\\xe8\\x2f\\x6b\\x15\\x73\\x4d\\x85\\x7f\\x59\\xa9\\x35\\x07\\xdb\\x3c\\x39\\xa2\\x4d\\x3b\\xa2\\x4d\\x3d\\xa2\\x4d\\xb9\\xa5\\xcd\\x78\\xf8\\xf6\\x57\\x87\\x6f\\x9f\\x1d\\xbe\\xfd\\xfc\\xf0\\xed\\x67\\x1b\\xb7\\xdf\\x5c\\xde\\xb0\\x9e\\x57\\x24\\xf2\\xe6\\x0a\\x9e\\xda\\xbc\\xff\\xa2\\xdf\\x5f\\xad\\xe9\\x7c\\xe5\\x3e\\xad\\xb8\\xfe\\x5f\\x6f\\xb0\\x65\\x94\\x15\\x0b\\xfc\\xeb\\x0d\\xa6\\x8c\\x5b\\x5a\\x3d\\xb9\\xbd\\x95\\x1c\\xd1\\x86\\x8f\\x79\\xdb\\xb3\\xad\\x36\\x7f\\xbb\\xe5\\xeb\\x75\\x7b\\x3e\\xfd\\xf9\\x9a\\x29\\xae\\x96\\xe9\\x7a\\xc3\\x4d\\xd2\\xbf\\xde\\x70\\x93\\xfe\\xaf\\x37\\xdc\\xdc\\x04\\x97\\x1b\\xfe\\xf1\\x88\\x36\\xbf\\xdd\\x6e\\x03\\x1d\\xf2\\xdb\\x03\\x36\\xb8\\xcb\\x6d\\xb6\\x0c\\x71\\x97\\xdb\\x1c\\xb4\\xc6\\x2d\\x9a\\xed\\x6d\\x2f\\xa4\\x23\\x5e\\x48\\xc7\\xbe\\x90\\x8f\\x78\\x21\\x1f\\xf1\\x42\\x3e\\xf6\\x85\\x72\\xc4\\x0b\\xe5\\x88\\x17\\xca\\xb1\\x2f\\x8c\\x47\\xbc\\x30\\x1e\\xf1\\xc2\\x78\\xec\\x0b\\xd3\\x11\\x2f\\x4c\\x47\\xbc\\x30\\x1d\\xfb\\xc2\\xf2\\xf3\\x95\\xdc\\x5b\\x1b\\x1e\\x96\\x13\\xee\\xbe\\x3d\\x60\\xa8\\x5d\\x8e\\x9c\\xbb\\xad\\xcd\\x93\\x23\\xda\\x3c\\xbd\\xbd\\xcd\\xf3\\x4b\\xdb\\x62\\x5b\\x8d\\x5e\\x4e\\x3c\\x3a\\xaa\\xa1\\x1c\\xdb\\x30\\x1e\\xdb\\x30\\x1d\\xdb\\x30\\x1f\\xdb\\xf0\\xf9\\xcf\\x8f\\x53\\x30\\xae\\xb5\\xdd\\xd6\\x32\\xae\\x35\\xdc\\x56\\x35\\xae\\x35\\x3c\\xa0\\x6f\\x5c\\x6b\\xb9\\xad\\x74\\x5c\\x6b\\x78\\x40\\xf3\\xb8\\xd6\\xf2\\x80\\xfa\\x71\\xb9\\xe5\\x96\\x0e\\x72\\xb9\\xcd\\x96\\x22\\x72\\xb9\\xcd\\x96\\x36\\x72\\xb9\\xcd\\xa6\\x4a\\x72\\x7d\\xd5\\x36\\xf5\\x92\\xeb\\x0d\\xb7\\x95\\x93\\xeb\\x2d\\x37\\x35\\x94\\xc5\\xef\\x70\\x9b\\x5c\\x86\\x03\\xe3\\xb6\\x46\\x66\\x7e\\x39\\x92\\xf8\\xae\\x34\\x3e\\x48\\x7d\\x57\\x5a\\x1e\\x24\\xbf\\x2b\\x2d\\x0f\\xd3\\xdf\\x95\\xa6\\x07\\x09\\xf0\\x4a\\xcb\\xc3\\x14\\x78\\xa5\\xe9\\x61\\x12\\xbc\\x68\\x7a\\x80\\x06\\x2f\\x1a\\x1d\\x20\\xc2\\x8b\\x46\\x07\\xa8\\xf0\\xa2\\xd1\\x21\\x32\\xbc\\xba\\x80\\x87\\xe8\\xf0\\x6a\\xcb\\x83\\x84\\x78\\xb5\\xe9\\x21\\x4a\\xec\\x2a\\xdc\\xb7\\xb7\\xb9\\x5e\\x4d\\x21\\x3c\\xa2\\xd9\\xb3\\xe3\\x9a\\x3d\\x3f\\xd4\\xec\\x2b\\xfa\\xf0\\xd1\\xb3\\xd7\\x5f\\x7f\\xfd\\xe4\\xe4\\x9b\\xb3\\x37\\x2f\\x5f\\x3f\\x3f\\x79\\xf6\\x7a\\x78\\xfd\\xea\\x64\\xfc\\xf6\\xf5\\x74\\xf6\\xf6\\xe5\\xab\\xaf\\x86\\xa7\\x4f\\xde\\x9e\\xd9\\x9f\\xcf\\x9f\\xda\\x1f\\x67\\xc3\\xf0\\xf2\\x9b\\xb7\\x2f\\xdf\\x3e\\x72\\xff\\xee\\x2b\\x55\\x74\\xfa\\xbd\\x4b\\xcf\\xf4\\x07\\x86\\xb3\\x17\\x93\\x5d\\xbd\\x79\\xf9\\xd5\\x6e\\xda\\xf7\\x72\\xf1\\xfb\\xf3\\xa7\\x03\\x6e\\x3d\\x72\\xff\\x0e\\xee\\x82\\x74\\x7d\\x68\\xff\\xdc\\x5f\\xf2\\x99\\xb5\\xb8\\x6a\\x64\\xb8\\xdc\\xe0\\xf3\\xa5\\x8b\\xad\\x06\\x5f\\x9e\\x7c\\xf9\\xe4\\xd9\\xb7\\xd3\\xd9\\xc9\\x97\\xcf\\x5f\\x9e\\xbd\\x39\\xb3\\xf1\\x63\\xff\\x84\\xeb\\x8f\\xfc\\xea\\xe4\\x57\\xcf\\xce\\x9e\\xbf\\x1c\\x86\\x27\\xd7\\xde\\x1e\\xaf\\xb7\\xfc\\xf5\\xc9\\xa7\\x27\\x1f\\x4f\\xbb\\x93\\x4f\\xbf\\x7a\\xf3\\x64\\x3e\\x3b\\xf9\\xd4\\xde\\xf0\\xe9\\xb3\\x97\\x6f\\x9e\\x7d\\xfb\\xf5\\x8b\\xe1\\xec\\xbb\\x93\\x4f\\xa7\\x97\\xc3\\xf3\\xb3\\x93\\x4f\\x2f\\xbd\\x54\\x7b\\xfc\\xe8\\xe4\\x23\\x7b\\xe4\\x23\\x7b\\xe4\\xa3\\x4b\\x8f\\x7c\\x64\\x8f\\x7c\\xb4\\x3c\\x72\\xf2\\xd1\\x9b\\x97\\xaf\\xbe\\xea\\xdf\\xf7\\x70\\x43\\xd8\\x9c\\xd2\\x7b\\xf7\\xb8\\xac\\xc1\\x6a\\x15\\xef\\xdd\\xe3\\xd6\\xa2\\xa5\\xd5\\x9a\\xdd\\xfb\\x15\\xf7\\x27\\xfe\\x15\\xf3\\x78\\xa7\\x71\\xfc\\xe9\\xc1\\x27\\xef\\xcf\\xbd\\xc7\\x7c\\xbd\\xc7\\x8f\\x4f\\x3e\\xb6\\xbe\\x3e\\xb6\\xbe\\x3e\\xbe\\xd4\\xd7\\xc7\\xd7\\xa7\\xe7\\xe4\\xf9\\xc9\\xd9\\xc9\\x57\\x27\\xe3\\xc9\\xb3\\xbe\\x27\\x4e\\xce\\xec\\xe1\\x33\\x7b\\xf8\\xec\\xd2\\xc3\\x67\\x7b\\x92\\x7d\\x7d\\xb6\\xec\\xae\\x77\\x79\\xf9\\xeb\\x93\\xd7\\xd6\\xf6\\xb5\\xb5\\x7d\\x7d\\xa9\\xed\\x6b\\xfb\\xe8\\xd7\\x57\\x09\\x83\\x57\\xcc\\xed\\x2e\\xef\\xeb\\x5b\\xe2\\x9a\\x11\\xfe\\xae\\xbd\\x7c\\x7b\\xf2\\xad\\xb5\\xfd\\xd6\\xda\\x7e\\x7b\\xa9\\xed\\xb7\\xd7\\x86\\xfb\\x4e\\x2f\\x9a\\x4f\\xfe\\x76\\xf2\\x37\\x6b\\xf6\\xb7\\xab\\xfd\\xae\\x79\\xda\\x6f\\x4f\\xfe\\x78\\xf2\\x47\\xeb\\xf9\\x8f\\xf6\\xc8\\x1f\\x2f\\xf5\\xfc\\xc7\\x87\\x62\\x4f\\x2b\\xea\\xfd\\xdd\\xc3\\xd0\\xd1\\xfa\\x83\\x7e\\x77\\x6f\\x1a\\x59\\x73\\xbc\\xdf\\xdd\\x63\\xe5\\x56\\xbb\\xea\\x77\\xb7\\xae\\x4a\\x2c\\x5b\\xcf\\xec\\xfe\\xf6\\xcd\\xee\\xec\\xd5\\xc9\\xb7\\xaf\\x5e\\x86\\xf0\\xd1\\xaf\\x4f\\xce\\x5e\\x3d\\x7f\\xf2\\x76\\x77\\x72\\xf6\\xb5\\xfe\\xd7\\x37\\x52\\x5e\\xb1\\x9a\\xe5\\xe1\\x5f\\x9d\\xfc\\xe6\\xe4\\xd3\\x93\\x3f\\xec\\x85\\xd6\\x1d\\x38\\xc5\\xc9\\xa7\\x6f\\x07\\x7d\\xd3\\xa7\\x1f\\x77\\xbe\\xba\\x7a\\xc9\\x27\\x0f\\x2f\\xe5\\xdb\\xe6\\x4b\\xee\\x4b\\x76\\x7e\\xbd\\xed\\x3f\\xb9\\xba\\xa5\\x79\\xcd\\x88\\x3e\\xb9\\x26\\xb5\\x68\\x45\\xbb\\x9f\\xdc\\x22\\x85\\x38\\xaf\\x16\\xf4\\x93\\xbb\\x53\\x12\\xad\\x28\\xe9\\x93\\x5b\\x29\\x89\\xe2\\x6a\\x3f\\x7c\\xf2\\x3d\\x50\\x43\\xdb\\x7a\\xc9\\xb1\\xbc\\xe4\\x46\\x44\\xb6\\x74\\xf2\\x45\\xff\\x16\\x5a\\xcd\\xe2\\xef\\xdf\\x91\\x1e\\x6e\\xd8\\x2c\\x4b\\x97\\x4f\\x4e\\x9e\\x58\\x97\\x4f\\xac\\xcb\\x27\\x97\\xba\\x7c\\x62\\x5d\\x3e\\xd9\\x77\\xf9\\xe4\\x52\\x97\\x2b\\x0a\\xfb\\xfd\\x03\\x49\\xc8\\x15\\xd9\\xfd\\xfe\\xde\\x9c\\x6d\\xbb\\xaf\\x77\\x42\\x39\\x52\\x37\\x3f\\xbe\\xa3\\x96\\xb2\\xb9\\x84\\x1d\\x84\\xc8\\x8a\\x94\\x7e\\x7f\\x2b\\x91\\xfb\\x35\\x61\\x7c\\xf6\\xae\\x84\\x11\\x56\\xfb\\xe6\\xb3\\x77\\x24\\x8c\\x35\\x37\\xfb\\xec\\x81\\x08\\x23\\xac\\x56\\x73\\xe9\\xf9\\xeb\\x93\\x57\\x27\\xdf\\x9c\\xbc\\xc2\\xa8\\x3a\\x10\\x5d\\xb1\\xb7\\xcf\\xee\\x4d\\x45\\x6d\\xb3\\xaf\\xa5\\xc1\\xe6\\x24\\x2e\\x00\\x8a\\x56\\xcb\\xfd\\xd9\\x55\\x6e\\x7b\\xa0\\xc5\\x16\\xb7\\x3d\\xf0\\xc8\\x3b\\x51\\x37\\x87\\xcd\\xef\\xbd\\x03\\x17\\x5f\\xef\\x80\\xcf\\x6e\\x25\\xf0\\xb6\\xf9\\xcc\\xed\\x78\\x80\\xb7\\x29\\xf9\\x01\\x25\\x80\\x6c\\x4e\\xcd\\x17\\xb7\\xee\\xd1\\x7f\\xed\\x64\\xbc\\xb9\\x6a\\xdf\\xf5\\x59\\x58\\xc1\\xb1\\xa5\\xc1\\x79\\x9f\\xda\\x55\\x83\\xcf\\xdf\\x95\\x0d\\xc4\\xcd\\x2e\\xef\\xcb\\x06\\xd2\\x4a\\x31\\xff\\xfc\\x61\\xd8\\x40\\x5a\\xf1\\xde\\xcf\\xef\\xbd\\xb3\\x0f\\x0c\\xf2\\x9d\\x76\\xd0\\x5a\\xee\\x7c\\x7e\\xf7\\x1d\\xb4\\xa6\\xb5\\xcf\\x6f\\xc7\\x41\\x9b\\x93\\x73\\xfb\\x0e\\x2a\\x9b\\xef\\x7b\\xc8\\x0d\\xb4\\xda\\xa5\\x5f\\xbc\\x23\\xed\\xae\\x87\\xfd\\xc5\\x3b\\x92\\xee\\x5a\\x36\\x7f\\xf1\\x40\\x4a\\xdb\\x0a\\xd9\\x7e\\x71\\x7f\\xa5\\x6d\\xb3\\xaf\\xbd\\xcc\\xd9\\x6c\\xf1\\x4e\\xc4\\x4d\\x79\\x73\\x7a\\xee\\xa2\\x2e\\xae\\x08\\xf5\\x8b\\xe3\\x55\\xbf\\xb0\\xe2\\x56\\x7f\\xfa\\xbe\\xb4\\xea\\x3f\\xdd\\x7f\\x81\\x56\\x5f\\xf8\\xa7\\xeb\\x22\\x7f\\xb5\\x40\\x7f\\xba\\xc7\\x44\\xae\\x58\\xd8\\x9f\\x6e\\xe5\\x12\\x69\\x73\\xfe\\x8e\\x98\\xfc\\xba\\x39\\xea\\x87\\x64\\x13\\x2b\\x29\\x7a\\x23\\x0a\\x7a\\x27\\x99\\xb7\\xd6\\xe6\\x36\\xdf\\x71\\x6f\\x2c\\xbc\\x9a\\xab\\xcd\\x57\\xbc\\x2b\\x38\\xe6\\xe3\\xbf\\x66\\x8d\\x96\\xd7\\x60\\x6d\\xf3\\xe1\\x7b\\x28\\x61\\x71\\x45\\xa2\\x9b\\xbd\\xef\\xc5\\xd8\\x8a\\x42\\x37\\x1f\\xd9\\xb6\\x51\\x6e\\x3e\\xb2\\x6c\\xc0\\x3b\\xbc\\x65\\x13\\x84\\xdf\\xa1\\x8f\\x77\\xc3\\x14\\x6b\\x63\\xd9\\xe6\\x8b\\xee\\x02\\xd3\\x57\\x48\\x65\\xb3\\xd7\\x6d\\x7e\\xc2\\x2b\\x11\\xbc\\xd9\\xc9\\x11\\x0c\\x66\\x6d\\x8e\\xdc\\xec\\xed\\x21\\x39\\xce\\xf1\\x44\\x7a\\x07\\x63\\x4f\\x3e\\xfe\\x5b\\xbe\\xb8\\x3b\\x1d\\x6f\\x6a\\x14\\x9b\\x4f\\x7c\\x77\\xe7\\x8f\\xed\\x3a\\x47\\x5c\\x49\\xb3\\xcd\\x27\\x7e\\xbb\\xc9\\x5f\\xff\\xfc\\xae\\x66\\xcd\\x35\\xae\\xfe\\xf3\\xc3\\xb0\\xcf\\xb5\\x14\\xfd\\xf3\\xfd\\x5d\\x2e\\x9b\\x7d\\xbd\\x13\\x3e\\xfa\\xf3\\xed\\x4e\\x8e\\x15\\xb1\\xfd\\xf9\\x87\\x00\\xf0\\xf7\\x12\\x8e\\x0f\\x6b\\x42\\x5f\\xbb\\x3f\\xef\\x3d\\xa8\\x03\\xba\\xd5\\x8a\\x01\\x3f\\x3d\\xf9\\xe6\\x64\\xda\\xbd\\x7e\\xf3\\xea\\xc1\\x3f\\x28\\xae\\xf6\\xce\\xf5\\x77\\xdd\\x45\\x07\\xbc\\xfe\\xec\\x77\\xc7\\x7e\\xd0\\xf9\\x56\\xc3\\x67\\xfb\\x6d\\xf6\\xf0\\x9f\\xbe\\x1a\\xfe\\xd9\\x31\\x5b\\xf9\\xc1\\xc7\\x21\\x2b\\x3b\\xe6\\x5d\\xc6\\x71\\x60\\x79\\x56\\x3c\\x6c\\x77\\xa2\\x88\\x6c\\x8f\\xc7\\x1e\\x78\\x6b\\xac\\x20\\xe8\\x1d\\x39\\xda\\xc3\\x0e\\x67\\x2d\\x10\\xef\\x31\\x9c\\xbb\\xec\\xd1\\x7b\\x74\\xff\\xdd\\x96\\x02\\x77\\x8f\\xbe\\xce\\xb7\\x44\\xf4\\x9b\\x07\\x9f\\xda\\x1b\\xec\\xc1\\x6f\\x1e\\x44\\xe1\\x8f\\x2b\\x12\\x7a\\x73\\xbb\\xaf\\x62\\xed\\xe6\\xda\\x68\\xfc\\x4e\\x4e\\xa8\\xd5\\x72\\x1f\\x78\\xc9\\x83\\xfb\\xa5\\x0e\\xbc\\xeb\\x1e\\x5a\\xd2\\x9d\\x3e\\xe5\\xdd\\xd6\\x73\\x25\\x2d\\xbf\\x7b\\x20\\x14\\xb5\\xd2\\x03\\xbe\\xbb\\x3f\\x8a\\x5a\\xd1\\xcf\\xf9\\x03\\xad\\xe3\\x6a\\x97\\x9c\\xdf\\x7f\\xd1\\x7a\\x5f\\x1f\\xbc\\x78\\xfd\\x6a\\xd2\\xff\\x9f\\x9f\\xbd\\x78\\xfb\\xcb\\x5f\\x7c\\xf0\\x76\\xfe\\xea\\x97\\xee\\xff\\x0b\\x00\\x00\\xff\\xff\\xa4\\x49\\xfe\\x60\\x83\\x16\\x01\\x00\")\n\nfunc fontsRobotoBoldWebfontSvgBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoBoldWebfontSvg,\n\t\t\"fonts/roboto-bold-webfont.svg\",\n\t)\n}\n\nfunc fontsRobotoBoldWebfontSvg() (*asset, error) {\n\tbytes, err := fontsRobotoBoldWebfontSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-bold-webfont.svg\", size: 71299, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoBoldWebfontTtf = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xa4\\xbd\\x07\\x7c\\x54\\xd5\\xf6\\x3f\\xba\\xd6\\x69\\xd3\\xcb\\x99\\x9a\\x64\\x52\\x66\\x32\\x29\\xc0\\x24\\x4c\\x32\\x93\\x10\\x26\\xb4\\xd0\\x82\\x74\\x08\\x20\\x5d\\xe9\\xa2\\xd2\\x55\\x40\\xaf\\x15\\x14\\x11\\x15\\xcb\\xc5\\x72\\x2d\\x60\\x17\\x45\\x74\\x9f\\xc9\\xa8\\x58\\xae\\x22\\x8a\\x22\\xe2\\xb5\\x47\\x51\\x50\\xb0\\xe1\\x88\\xd8\\xbd\\xf7\\x2a\\xe4\\x9c\\xf7\\xd9\\xfb\\xcc\\xa4\\x00\\xe2\\xef\\xfe\\x1f\\x71\\x66\\x4e\\xdd\\x67\\xaf\\xb5\\x57\\xf9\\xae\\xb5\\xf7\\x3a\\x02\\x02\\x80\\x1b\\x01\\x04\\xa8\\x6a\\x6c\\x1c\\x3f\\x72\\xc6\\xd6\\x31\\xbb\\x01\\xb0\\x37\\x00\\xe4\\x0f\\x19\\x34\\xb8\\x91\\xfb\\x19\\xdf\\x05\\xc0\\x49\\x00\\x50\\x31\\x64\\xcc\\xe8\\x71\\xcd\\x81\\xcb\\x46\\x02\\xe0\\x95\\x00\\xb6\\xcf\\x87\\x8c\\x9b\\x30\\xa0\\xec\\xe5\\xe0\\x07\\x00\\x8e\\xf9\\x00\\x30\\x63\\xf4\\xb8\\x68\\xec\\x99\\xe2\\x63\\x97\\x01\\x38\\x76\\xd1\\xfd\\xd9\\x0b\\x67\\x2e\\xf9\\x6a\\xcf\\x80\\x6e\\x00\\xce\\x2e\\x00\\xf8\\xf9\\xec\\xe5\\xe7\\x07\\x73\\x72\\xe4\\x19\\x00\\x2e\\x2b\\x00\\x0c\\x98\\xb7\\xe4\\xac\\x85\\xe3\\x52\\xd1\\x87\\x01\\x5c\\x63\\x00\\xb8\\xb9\\x67\\xcd\\x3c\\x6f\\x09\\x00\\x38\\x01\\x3c\\xdb\\x00\\xc0\\x78\\xd6\\x82\\x0b\\xe7\\xe5\\x0e\\x92\\x9e\\x01\\xf0\\x6c\\x07\\xb8\\xfe\\xd7\\xf9\\x73\\x67\\xce\\x11\\xbb\\x5e\\x39\\x11\\xe0\\xbe\\x14\\x00\\xf4\\x98\\x3f\\x7f\\xee\\x4c\\xc7\\x05\\x52\\x35\\xc0\\x7d\\xdf\\x01\\x40\\xc9\\xfc\\x85\\xe7\\xaf\\xfc\\x60\\xc0\\x80\\x3e\\x00\\xf7\\x3b\\x01\\xf8\\xcd\\x0b\\x16\\xcf\\x9e\\x39\\x6d\\x5e\\x3d\\x00\\x3c\\xb4\\x0d\\x00\\x5b\\x16\\xce\\x5c\\xb9\\x84\\x33\\x20\\x01\\xd8\\x7c\\x23\\x00\\x04\\x17\\xcd\\x5c\\x38\\xb7\\xf1\\xa7\\x95\\x31\\x80\\xcd\\x04\\x80\\xaf\\x5a\\xb2\\xf8\\xbc\\xf3\\xf3\\x2e\\x8e\\x3d\\x04\\xb0\\xe5\\x00\\x00\\xf7\\xd5\\x92\\x65\\x73\\x97\\xdc\\xb9\\xe8\\x81\\x7b\\x00\\x1e\\xdf\\x05\\x80\\x43\\x56\\xcc\\x9d\\x35\\xef\\xbb\\x91\\xe3\\x26\\x03\\x10\\x27\\x00\\x48\\x00\\x8c\\x7b\\xb0\\xa7\\xcf\\x7d\\x6f\\xd1\\xdf\\x57\\x7e\\x94\\xbb\\xd3\\xdf\\xb7\\x2e\\xbb\\x6b\\x0f\\x3b\\x63\\xa7\\xbd\\xa2\\x47\\x80\\x03\\x1e\\x10\\xbe\\x02\\x84\\xaf\\xe1\\x6b\\xe0\\xe0\\x10\\xa4\\x01\\x41\\x60\\x67\\xf4\\x56\\xcc\\x50\\x05\\x7d\\x81\\x1b\\xd4\\x38\\x62\\x3c\\xd8\\x17\\xcc\\x3c\\x7f\\x11\\xe4\\xb1\\xf3\\xa0\\x69\\xec\\x7c\\xc7\\x6d\\x3c\\x77\\xee\\xb2\\x45\\x60\\xcc\\xdc\\x49\\xdb\\xe1\\x58\\x4b\\x66\\x7e\\x0e\\x20\\xf7\\x3d\\xbb\\xb6\\x06\\x96\\xc1\\x32\\x58\\x09\\xeb\\xe1\\x2e\\xb8\\x0f\\x36\\xc3\\xe3\\xb8\\x04\\x97\\xc3\\x7d\\x78\\x31\\xae\\xc1\\x7b\\xf0\\x29\\x7c\\x1f\\xbf\\xc6\\xff\\x72\\x31\\xae\\x27\\xd7\\xc4\\xad\\xe4\\x1e\\xe2\\x52\\xdc\\xb3\\x5c\\x8a\\x7b\\x1f\\xd6\\x77\\xf8\\xbb\\x0b\\x36\\x67\\xfe\\xee\\x6b\\xff\\xc3\\xff\\x72\\x29\\x2e\\x85\\xff\\x65\\xed\\xd3\\x3f\\x84\\x29\\x60\\x05\\x11\\x12\\xe0\\x87\\x7a\\xc8\\x83\\xde\\x90\\x0b\\x9b\\x20\\x17\\x5e\\x81\\x5c\\xe0\\xa1\\x58\\x6b\\x86\\x89\\xda\\x77\\x30\\x45\\xdb\\x0b\\x08\\x56\\xed\\x73\\x40\\x58\\xab\\xbd\\x4c\\xef\\xd2\\x0e\\x41\\x15\\x38\\xd4\\xe7\\x40\\x56\\x9f\\x83\\x02\\xf5\\x39\\x28\\xd1\\xa6\\x43\\x1d\\x78\\x60\\x90\\xf6\\x3c\\x34\\x6a\\x7b\\x60\\x88\\xb6\\x07\\x4e\\xd3\\xf6\\xc0\\x30\\x6d\\x0f\\x34\\x69\\xbb\\x61\\xbc\\xb6\\x07\\x26\\x68\\x9f\\xc3\\x24\\xed\\x10\\x4c\\xd6\\xbe\\x84\\x69\\xda\\x97\\xb0\\x4a\\x9b\\x0e\\xab\\xb5\\xe9\\x70\\xa5\\x36\\x1d\\xae\\xd2\\xa6\\xc3\\x1a\\x6d\\x3a\\x5c\\xad\\x4d\\x87\\xfb\\xb4\\xe7\\xe1\\x7e\\xed\\x79\\x78\\x40\\x7b\\x1e\\x1e\\xd4\\x9e\\x87\\x87\\xb4\\xe7\\xe1\\x61\\xed\\x79\\x78\\x44\\xdb\\x03\\x8f\\x6a\\x7b\\x60\\x8b\\xb6\\x07\\x1e\\xd3\\xf6\\xc0\\x56\\x6d\\x0f\\xa4\\xb4\\xdd\\xf0\\xa4\\xb6\\x1b\\x9e\\xd2\\x76\\xc3\\xd3\\xda\\x6e\\xd8\\xa6\\xed\\x86\\xe7\\xb4\\x43\\xf0\\xbc\\x76\\x08\\xfe\\xa9\\x1d\\x82\\x17\\xb4\\x43\\xf0\\xa2\\xf6\\x25\\xbc\\xa4\\x7d\\x09\\x2f\\x6b\\x7b\\x60\\xaf\\xfa\\x1c\\xec\\x53\\x9f\\x83\\x4f\\xd5\\xe7\\x18\\x1d\\x4f\\xb1\\xef\\xdb\\x81\\x83\\x89\\xe0\\x84\\xb5\\xda\\x54\\x90\\xa0\\x4e\\xdb\\x0b\\x09\\xed\\x33\\xa8\\xd7\\xd2\\xd0\\x5b\\x7b\\x06\\x36\\x69\\xcf\\xc0\\x2b\\xda\\x33\\x20\\x42\\x9d\\x76\\x10\\x12\\xda\\xb7\\xd0\\x5b\\x7b\\x0d\\x36\\x69\\xaf\\xc1\\x2b\\xda\\x6b\\x60\\x80\\x09\\x5a\\x33\\x4c\\xd1\\x5e\\x87\\x85\\xda\\x58\\xb8\\x44\\x1b\\x07\\x6b\\xb5\\x3e\\xb0\\x59\\xbb\\x1b\\x9e\\xd5\\x6e\\x04\\x01\\xac\\xe0\\x87\\x06\\xf0\\xc0\\x04\\x6d\\x3f\\xcc\\x00\\x1f\\x3b\\x22\\x43\\x03\\xd8\\x61\\x82\\xf6\\x0d\\xcc\\x00\\x27\\xd8\\xc1\\xa4\\xbd\\xc6\\xae\\xb3\\x69\\x9b\\xa1\\x01\\xbc\\x30\\x54\\xfb\\x08\\x26\\x68\\x3b\\x60\\xa2\\xf6\\x19\\xbb\\x67\\xa1\\x76\\x0d\\x5c\\xa2\\xbd\\x02\\x6b\\xb5\\x95\\xb0\\x59\\x7b\\x18\\x9e\\xd5\\x1e\\x84\\xfd\\xda\\x6d\\xac\\xef\\x07\\x41\\x82\\x4a\\xed\\x30\\xf4\\xd4\\x0e\\xc3\\x9d\\xda\\x61\\xb8\\x4b\\x3b\\x0c\\x77\\x6b\\x87\\x61\\xa3\\x76\\x18\\x4c\\x20\\x42\\x31\\x98\\xa1\\x18\\xac\\x50\\x0b\\x0d\\x30\\x00\\x66\\x40\\x29\\x7c\\x08\\xc5\\xf0\\x11\\x14\\xc3\\xc7\\x50\\x0c\\x9f\\x40\\x31\\x58\\xa0\\x51\\x4b\\xc3\\x10\\x2d\\x0d\\xa7\\x69\\x69\\x18\\xa6\\xa5\\x61\\xbc\\x96\\x86\\x47\\xb4\\x34\\x3c\\xaa\\xa5\\x61\\x8b\\x96\\x86\\xc7\\xb4\\x34\\x6c\\xd5\\xd2\\xf0\\xb2\\x96\\x06\\x1e\\x86\\x42\\x0e\\x4c\\x84\\x00\\x4c\\x81\\x00\\x20\\x0c\\x05\\x07\\x48\\xe0\\xd0\\xb6\\x81\\xac\\x6d\\x83\\x02\\x6d\\x1b\\xec\\xd5\\xb6\\xc1\\x3e\\x6d\\x1b\\x7c\\xaa\\x6d\\x63\\x7d\\x4b\\x43\\x4f\\x2d\\x0d\\x77\\x6a\\x69\\xb8\\x4b\\x4b\\xc3\\xdd\\x5a\\x1a\\x36\\x6a\\x54\\x87\\x6a\\x40\\x04\\x33\\x58\\xa0\\x04\\xca\\xa0\\x1c\\xba\\x40\\x57\\xe8\\x0e\\x51\\x88\\x41\\x1c\\x6a\\xa0\\x16\\xea\\x20\\x01\\xf5\\xd0\\x1b\\xfa\\x40\\x5f\\x18\\x0a\\xa3\\x60\\x02\\x4c\\x86\\x29\\x30\\x0d\\xce\\x80\\x55\\xb0\\x1a\\xae\\x84\\xab\\x60\\x0d\\x5c\\x0d\\xd7\\xc0\\x3a\\xb8\\x16\\xae\\x83\\xeb\\xe1\\x66\\xd8\\x00\\xb7\\xc0\\xad\\x70\\x1b\\xdc\\x0e\\x9b\\xe0\\x45\\x78\\x09\\x5e\\x81\\x0f\\xe1\\x23\\xf8\\x18\\x3e\\x01\\xce\\x74\\x07\\xd5\\x2c\\x83\\xcf\\xd8\\x08\\x45\\x50\\x00\\xa0\\x7d\\xa0\\x35\\x69\\x4f\\x68\\x0f\\x68\\x69\\xed\\x11\\xed\\x11\\xf8\\x1f\\xfe\\xa9\\x5f\\xfc\\x2f\\x57\\xff\\xf9\\x3f\\xed\\xa0\\xf6\\xa5\\x76\\xa9\\xf6\\xf2\\xff\\xc3\\x9d\\x9f\\xfe\\x4f\\x57\\x7f\\xd3\\xe9\\x99\\x87\\xb4\\x7f\\x01\\x68\\x9b\\xb5\\x43\\xda\\xd7\\xda\\x9b\\xff\\x87\\xbb\\x7f\\x01\\xd0\\xbe\\x05\\x00\\xcf\\x71\\xc7\\xbf\\xd3\\x3e\\x3f\\xc5\\x5d\\x87\\xfe\\x97\\x1e\\x9e\\x70\\xf7\\xe7\\xb4\\xa7\\x27\\x39\\xfe\\xb5\\xf6\\x8e\\x36\\x49\\x7b\\x55\\xbb\\xf9\\xc4\\x73\\x6a\\x0b\\xf8\\x3a\\x5c\\x19\\xd1\\xba\\xaa\\xbf\\x75\\xd8\\xff\\x51\\x3b\\x1f\\x40\\xdb\\x09\\xa0\\x7d\\xa9\\x5d\\x7b\\x42\\xbb\\x93\\xb4\\x5f\\xb5\\x9f\\x00\\xe8\\xa7\\xad\\xbd\\x55\\x5a\\xb3\\xb6\\x57\\x9b\\x07\\x00\\x72\\x87\\x2b\\xef\\x3d\\xee\\xce\\xbb\\xb4\\x8d\\xda\\x6d\\xda\\x56\\xed\\x7e\\xed\\x21\\x70\\xb3\\x3f\\xd0\\x6a\\xd9\\x99\\x1d\\x5a\\xb3\\xb6\\x49\\xeb\\xa9\\x7d\\xa6\\xcd\\xa1\\x6d\\x68\\xf3\\xb4\\x23\\xda\\x83\\xda\\x33\\x6d\\x77\\x9e\\xa7\\xed\\xd6\\xf6\\x00\\x68\\xbb\\x3b\\xb4\\xd6\\x35\\xf3\\xfb\\x99\\xf6\\xab\\xf6\\xf4\\x9f\\xf1\\x57\\x7b\\x5a\\xdb\\xab\\xed\\x03\\xa0\\x1f\\xea\\x6f\\xd9\\xb1\\x89\\x99\\xdf\\x6f\\x01\\xb4\\x3b\\x4f\\x7e\\x5f\\xe6\\x0a\\xca\\xdb\\x03\\x6c\\xd3\\xd9\\xe1\\xb0\\x47\\xfb\\x46\\x7b\\x53\\x6b\\xd4\\x3e\\xd1\\x9a\\xf5\\xfd\\xe3\\xee\\x9a\\xa9\\xdd\\xa3\\x5d\\xa6\\x35\\x6b\\x4b\\xb4\\xab\\xc1\\x03\\x5e\\xf0\\x02\\x68\\xa6\\xcc\\xb9\\x27\\xb5\\xb4\\x76\\x09\\x95\\x49\\xed\\x65\\x7a\\x9f\\x76\\x44\\xfb\\x54\\x6b\\xd1\\x66\\x66\\x6e\\x75\\xe8\\x12\\xd8\\x51\\x0a\\xdb\\x5a\\xfd\\x96\\x8e\\xf2\\xc9\\xe9\\xa4\\x52\\x7a\\x4a\\x3a\\x7e\\xf8\\xd3\\x33\\x6f\\xfd\\xc5\\x9d\\xbf\\x76\\xd8\\xfe\\x91\\xb6\\x94\\x6d\\x4b\\x6b\\x39\\xf5\\x9d\\xa7\\x68\\xf3\\xe3\\xbf\\x38\\xff\\xd3\\x9f\\x9e\\xd9\\xf5\\xff\\xfc\\xcc\\xbf\\xb0\\x1c\\x1d\\x39\\xa4\\x1d\\xa1\\xa3\\x4e\\xbf\\xd9\\x3f\\xf7\\x49\\xaf\\x5f\\xd4\\xb6\\x99\\x7f\\xea\\x76\\x99\\xae\\x74\\x6c\\xfd\\xfc\\x93\\x5e\\x77\\x12\\xca\\xb4\\x34\\xd5\\xc0\\x53\\xf7\\xfb\\x4f\\x9e\\x7a\\x44\\xff\\xfc\\x8f\\x77\\x0d\\xd0\\x1a\\xb5\\x7a\\x6d\\x86\\x36\\x4a\\x1b\\x07\\x56\\xf6\\x07\\xea\\xdf\\xd9\\x99\\x55\\xda\\x39\\xda\\x69\\xea\\xed\\x5a\\x4a\\xa5\\xf2\\x67\\x54\\x0f\\x69\\x7b\\xb4\\xa6\\x2c\\x25\\x5a\\xaa\\x53\\x2b\\xd7\\x6b\\x2f\\x68\\x1b\\x4f\\x26\\xc1\\x6d\\x57\\x6c\\x67\\xdf\\xcc\\x33\\x68\\xb7\\x68\\xf7\\x68\\x8a\\xb6\\x53\\x53\\xb4\\xdd\\x54\\x4f\\x98\\xae\\x44\\xd8\\x99\\x97\\xd8\\xf7\\x0c\\xed\\x6b\\xed\\x6b\\xb6\\xf5\\xc4\\x49\\x5a\\x4a\\xeb\\x9f\\xbf\\xa0\\xeb\\x9d\\x4e\\x7b\\x33\\xff\\xe2\\x6a\\x66\\x75\\x98\\x15\\xd7\\xf7\\xb3\\x1a\\xc0\\x41\\x0c\\x1c\\xe0\\x00\\x04\\x19\\x64\\x40\\x28\\x80\\x02\\x40\\x28\\x85\\x52\\xe0\\xa0\\x0c\\xca\\x80\\x87\\x72\\x28\\x07\\x01\\xba\\x40\\x17\\x10\\xa1\\x12\\x2a\\x41\\x82\\xee\\xd0\\x1d\\x0c\\x10\\x85\\x28\\x18\\x21\\x06\\x31\\x10\\x20\\x0e\\x71\\x30\\x41\\x1d\\xd4\\x81\\x19\\x7a\\x42\\x4f\\x90\\x20\\x01\\x09\\xb0\\x40\\x3d\\xd4\\x83\\x15\\x7a\\x41\\x2f\\xb0\\x41\\x6f\\xe8\\x0d\\x76\\xe8\\x03\\x7d\\xc0\\x01\\x83\\x60\\x10\\x38\\x61\\x30\\x0c\\x06\\x19\\x1a\\xa1\\x11\\x5c\\x70\\x1a\\x9c\\x06\\x6e\\x18\\x0e\\xc3\\xc1\\x03\\x63\\x60\\x2c\\x78\\xa0\\x09\\x9a\\xc0\\x0b\\xe3\\x60\\x1c\\xc8\\x30\\x01\\x26\\x80\\x0f\\x26\\xc3\\x64\\xf0\\xc3\\x54\\x98\\x0a\\x39\\x30\\x0d\\xa6\\x81\\x1f\\xa6\\xc3\\x74\\xc8\\x85\\x6b\\xe0\\x1a\\xe0\\x61\\x1d\\x5c\\x0f\\x22\\xdc\\x0c\\x37\\x83\\x00\\x1b\\xe0\\x76\\x10\\xe0\\x4e\\xd8\\x08\\x12\\x6c\\x82\\x4d\\x60\\x87\\xfb\\xe0\\x61\\x70\\xc2\\x23\\xf0\\x08\\xb8\\xe0\\x51\\xd8\\x0a\\x6e\\x68\\x86\\x66\\xf0\\x40\\x0a\\xb6\\x81\\x17\\x5e\\x84\\x17\\xc1\\x0f\\xdb\\x61\\x3b\\xc8\\xf0\\x12\\xbc\\x04\\x7e\\x78\\x05\\x5e\\x01\\x3b\\xec\\x05\\x8a\\x7a\\xf7\\xc1\\x3e\\x40\\xf8\\x14\\x3e\\x05\\x04\\x0e\\x7a\\x82\\x08\\x22\\x20\\x98\\xc1\\x0c\\xc8\\x78\\x67\\x05\\x27\\x38\\xc1\\xc5\\x38\\x68\\x65\\x1c\\xb4\\x42\\x09\\x94\\x64\\x38\\xe8\\x86\\x6e\\xd0\\x0d\\xdc\\x8c\\x77\\x01\\xc6\\x2f\\x37\\xd4\\x40\\x0d\\xb8\\xa1\\x07\\xf4\\x80\\x1c\\xc6\\x35\\x23\\xe3\\x9a\\x97\\x71\\xcd\\xc4\\xb8\\xe6\\xeb\\xc0\\x35\\x33\\xe3\\x9a\\x9d\\x71\\x8d\\x87\\x46\\x38\\x0d\\x04\\x18\\x06\\xc3\\x40\\x60\\x9c\\x12\\x19\\xa7\\x24\\xc6\\x29\\x11\\xc6\\xc3\\x78\\x10\\xe0\\x74\\x38\\x1d\\x0c\\x30\\x09\\x26\\x81\\x93\\x71\\x4d\\x66\\x5c\\xcb\\x65\\x5c\\x93\\x19\\xd7\\xf2\\x60\\x31\\x2c\\x06\\x17\\xac\\x82\\xab\\x81\\x63\\x1c\\x74\\x33\\xae\\xb9\\xe1\\x0e\\xb8\\x03\\xdc\\x8c\\x77\\x5e\\xc6\\x3b\\x33\\xe3\\x1d\\x0f\\x8f\\xc0\\x56\\x10\\x18\\xd7\\x44\\xc6\\x35\\x09\\x9e\\x83\\x17\\xc0\\xc9\\x78\\xa7\\x73\\x4d\\x86\\x1d\\xb0\\x03\\xdc\\xf0\\x32\\xbc\\x0c\\x02\\xe3\\xa0\\x19\\x3e\\x80\\x16\\x70\\x31\\x0c\\x86\\x8c\\x9b\\x56\\x86\\xc5\\x74\\x9e\\x5a\\x19\\x4f\\xad\\x80\\x30\\x9a\\xa1\\x40\\x07\\xc8\\x50\\x00\\xa5\\x19\\x24\\x58\\xd9\\x86\\x04\\xeb\\xa0\\x27\\xc3\\x81\\xbd\\x18\\x12\\x1c\\x04\\x83\\x19\\x0f\\x86\\x33\\xea\\x9b\\x60\\x1c\\x43\\x85\\x53\\x61\\x1a\\x4c\\xff\\x13\\x24\\x78\\x27\\xdc\\x05\\x77\\xc3\\x46\\xd8\\x04\\xf7\\xc1\\xfd\\xf0\\x00\\x3c\\x08\\x0f\\xc1\\xc3\\xf0\\x08\\x3c\\x0a\\x5b\\xe0\\x31\\xd8\\x0a\\xcd\\x90\\x82\\x27\\xe1\\x29\\x78\\x1a\\xb6\\xc1\\x8b\\xb0\\xbd\\x0d\\x35\\xee\\x65\\x7d\\xdd\\x07\\x9f\\xb6\\xc5\\x78\\xdd\\xa1\\xf7\\xff\\x21\\xc6\\x03\\xc0\\x05\\x67\\x9f\\x35\\xb3\\x53\\x84\\x27\\xb0\\x5f\\x23\\x20\\xb8\\x32\\xbf\\x02\\x8b\\x24\\x47\\x00\\x32\\xfc\\xcc\\x0b\\xdd\\xb9\\xe7\\x41\\x04\\x41\\xbc\\x43\\x8c\\x03\\x60\\x91\\xfe\\xcb\\xbf\\x03\\xf3\\xb8\\x4c\\x98\\xa9\\xff\\x3b\\x00\\xdc\\x0f\\x63\\x20\\x38\\x95\\x46\\xc0\\x74\\x7f\\xc8\\xe2\\xc5\\x67\\x41\\x10\\x6c\\x47\\x05\\x69\\x9e\\x3a\\x0f\\xc0\\x78\\x31\\x37\\x2e\\x08\\xb8\\x69\\x34\\x02\\x08\\xf5\\x22\\x61\\xd7\\xd1\\xdb\\xf9\\xcc\\x27\\x5f\\x8f\\x7a\\x61\\x1f\\x8b\\x69\\xe9\\xbe\\x00\\xd4\\x76\\x55\\x40\\x90\\xc5\\x25\\x00\\x36\\xb8\\x14\\x34\\x1c\\x87\\x2b\\xb9\\x57\\xb9\\x7d\\x41\\x73\\xd0\\x13\\xcc\\x0b\\x16\\x06\\x8b\\x83\\x65\\xc1\\x68\\xb0\\x3e\\x78\\x66\\xf0\\xb1\\x50\\x71\\xe9\\xb1\\xa3\\x02\\xa3\\x94\\x5e\\x1d\\x84\\x7b\\xb0\\x29\\x73\\x35\\x04\\x9d\\xc1\\x9c\\x60\\x7e\\xe6\\xea\\x44\\xdb\\xd5\\x48\\x79\\xa4\\xfd\\xa6\\x7d\\xa1\\xed\\xd0\\x96\\x68\\x23\\x5a\\xb5\\xd6\\x6f\\x0f\\xbc\\x76\\x60\\xc7\\x81\\x17\\x0f\\xbc\\x70\\xe0\\xb9\\x03\\xdb\\x0e\\x90\\x03\\x0f\\x1f\\x58\\x7d\\xa0\\xee\\xb3\\x1d\\x1f\\xa7\\xc5\\xaf\\x32\\x3d\\xfc\\x3f\\xff\\x43\\x09\\xda\\x6e\\xc1\\xce\\xec\\xca\\x1c\\x04\\xe0\\x05\\x51\\x32\\x18\\x4d\\x66\\x8b\\xd5\\x66\\x77\\x38\\x65\\x97\\xdb\\xe3\\xf5\\xf9\\x73\\x72\\xf3\\x02\\xf9\\x05\\x85\\x45\\xc1\\x50\\x71\\xb8\\xa4\\xb4\\xac\\xbc\\x4b\\xd7\\x6e\\x91\\x8a\\xca\\xee\\xd1\\xaa\\xea\\x58\\xbc\\xa6\\xb6\\x47\\x5d\\xcf\\x44\\x7d\\xaf\\xde\\x7d\\xfa\\xf6\\x6b\\xe8\\x3f\\x60\\xe0\\xa0\\xc1\\x8d\\x43\\x4e\\x1b\\x3a\\x6c\\xf8\\x88\\x91\\xa3\\x46\\x8f\\x19\\xdb\\x34\\x6e\\xfc\\x84\\xd3\\x27\\x4e\\x9a\\x3c\\x65\\xea\\xb4\\xe9\\x67\\x9c\\x39\\x63\\x26\\xac\\xb9\\xfa\\x9a\\x6b\\xff\\x7e\\xfb\\xc6\\xfb\\xef\\x7b\\xe0\\xa1\\x07\\x1f\\x7e\\x64\\xcb\\xa3\\x8f\\x6d\\x7d\\xe2\\x71\\xa2\\x34\\x3f\\x99\\x7a\\x6a\\xdb\\xd3\\xcf\\x3f\\xf7\\xcf\\x17\\x60\\xd9\\x9c\\xb9\\x67\\xef\\x5f\\x79\\xef\\x92\\x73\\xbf\\x5c\\x7e\\x0e\\xac\\xbd\\x03\\xce\\x03\\x38\\x6b\\x05\\xeb\\xdd\\x82\\x8b\\x61\\xf3\\xb3\\x57\\xcc\\x66\\xce\\x77\\xe1\\x25\\x9f\\xce\\x5a\\x75\\xd5\\x6d\\x3b\\x5e\\xfe\\xa0\\xe5\\xe3\\x4f\\x3e\\xfc\\xe8\\x19\\x78\\xe9\\x15\\xf8\\xe2\\xc0\\xc1\\xaf\\x0f\\xc1\\x85\\x7b\\xf7\\xc1\\x95\\xd7\\xad\\xbe\\x7e\\xdd\\x0d\\x37\\xde\\xb4\\xfe\\x96\\x5b\\x61\\xc3\\x5d\\x77\\xdf\\x09\\x3b\\x5f\\x5d\\x0a\\x00\\x17\\x65\\xc8\\x64\\xe3\\x7d\\x10\\xad\\xf0\\x12\\xec\\x82\\x37\\xe1\\x03\\xd8\\x0b\\xfb\\xe1\\x2b\\x38\\x02\\xad\\xf0\\x20\\x96\\x60\\x3d\\x5a\\xd1\\x85\\x39\\x58\\x88\\x25\\x58\\x83\\x46\\x48\\xc1\\x6e\\xf8\\x02\\x9e\\x83\\x6f\\xe0\\x45\\x2c\\x86\\x41\\xa2\\x0c\\x40\\xa0\\x82\\x80\\x7b\\x38\\x19\\x31\\x66\\x12\\x19\\xb6\\x7c\\x32\\x81\\x70\\xbf\\x1c\\x22\\x45\\x26\\xf5\\x99\\xcc\\x8e\\x5d\\x32\\x39\\xf8\\x3e\\x41\\x77\\xf7\\x9c\\x4a\\x82\\x15\\xc1\\x8f\\x89\\x35\\x52\\x49\\xb8\\x8a\\xe1\\x4d\\x93\\x06\\x87\\x27\\x87\\x2a\\x09\\x5f\\x71\\x76\\x4e\\x90\\x34\\x8c\\x99\\x14\\x22\\x0d\\x93\\x2b\\x89\\x50\\x41\\x6f\\x0d\\x85\\x43\\x17\\x4d\\xda\\x1f\\x78\\x73\\x72\\x60\\x78\\xd3\\xa4\\x49\\xad\\x81\\x23\\x93\\x03\\xe1\\x10\\x11\\x23\\x93\\x48\\xe3\\xf2\\xc9\\xec\\xc4\\xe4\\xc9\\x39\\x95\\x44\\xac\\xb0\\x4d\\x9b\\x52\\x49\\xa4\\x0a\\xa5\\x18\\xd7\\x8e\\x99\\x44\\x82\\x6b\\xa7\\x4d\\x0b\\x10\\x98\\x5c\\x49\\x0c\\x15\\x4a\\x09\\x3b\\xd4\\xd0\\x76\\xc8\\x58\\xe1\\x92\\x83\\x89\\x68\\x25\\x31\\x55\\x04\\x2f\\xa1\\x0f\\x79\\x25\\xf0\\xe6\\xe4\\x20\\xe1\\x4b\\x87\\x86\\x83\\x44\\x28\\x1b\\x46\\x60\\xcc\\xa4\\x75\\x73\\xd7\\xcd\\x0c\\xd2\\x8d\\x9e\\x81\\x50\\x68\\x72\\x60\\x1d\\xdb\\x6b\\xd2\\xf7\\xe8\\x03\\xcd\\x7a\\xef\\x9c\\x01\\x67\\x68\\x72\\x25\\xb1\\x54\\x04\\xdf\\x65\\xe4\\x58\\x2b\\x82\\x51\\x62\\x88\\x4c\\x9b\\x14\\x0c\\x0e\\x09\\x37\\xce\\x3c\\x27\\x38\\x29\\x38\\x67\\x96\\xde\\x04\\xbd\\xce\\x46\\x9f\\x1c\\x4c\\x44\\x83\\xeb\\x82\\x43\\xd6\\x35\\xce\\x0c\\xaf\\x0b\\xae\\x0b\\xb3\\xc7\\x85\\x69\\xe3\\xa4\\xa1\\x67\\x20\\x34\\x39\\x10\\xa6\\x07\\x48\\xc3\\x5c\\xba\\x33\\xb9\\x92\\xd8\\xd9\\x93\\xfa\\xb4\\xe4\\x84\\x42\\x81\\x60\\xcb\\xba\\xe1\\x4d\\x93\\x82\\xeb\\xc2\\x43\\x83\\x04\\x26\\x64\\xfa\\x16\\x62\\x97\\x39\\x2a\\xc2\\xc1\\x96\\xcc\\xc3\\xc3\\xc1\\x49\\xc3\\xc7\\x05\\x42\\x04\\x27\\x4f\\x5a\\x47\\x84\\xb2\\xa1\\xe1\\x75\\xe1\\xe0\\xba\\xa1\\xeb\\xc2\\x33\\xe9\\x0d\\xfa\\x2d\\xf4\\xa7\\x92\\x38\\xe9\\x30\\xb8\\x22\\x95\\x44\\xa6\\x04\\xd0\\x0d\\xd7\\x71\\x04\\xac\\xa3\\x3f\\xe1\\x99\\xe7\\xcc\\xe8\\x48\\x09\\xbd\\xd5\\x5d\\x11\\x5c\\x17\\x5c\\x77\\x35\\x65\\xdb\\xb0\\x39\\xe1\\x75\\x06\\x12\\x1c\\x33\\xa9\\x77\\x60\\xfb\\xe4\\x4a\\xe2\\xa9\\x68\\x86\\x06\\x6c\\x18\\x30\\x00\\x87\\x6f\\x73\\xc2\\x6c\\x60\\xdf\\xf4\\xe2\\x09\\x93\\xe8\\x77\\xd3\\xa4\\xf0\\xac\\x20\\x81\\xf0\\x80\\xc0\\xac\\x20\\xc1\\xf0\\x80\\xc9\\x41\\xd2\\xd0\\x34\\x29\\x09\\x41\\x18\\x38\\x7b\\x40\\x12\\x83\\x38\\x70\\xf6\\x00\\x12\\x9c\\x4d\\x72\\xe7\\xe6\\x67\\x9f\\xe5\\xad\\x20\\x38\\x70\\x76\\x98\\xc0\\xc0\\xd9\\xe1\\x4a\\x5d\\x23\\xa9\\x45\\x70\\x00\\x07\\x83\\x00\\xb8\\x39\\xe2\\x04\\xe0\\xc1\\x00\\xdd\\x15\\x84\\x68\\xef\\xa4\\x41\\x28\\x3a\\x12\\x53\\x24\\x71\\x5f\\xef\\x24\\xcf\\x15\\x1d\\x89\\x81\\xc2\\xd3\\xc3\\x22\\x3d\\x9c\\x34\\x48\\xc1\\x63\\xbd\\x93\\x48\\x8f\\xc7\\xe5\\x90\\x5c\\x1a\\x92\\x43\\x83\\xb8\\xa0\\x5a\\x82\\xb7\\xab\\xf3\\xc5\\x09\\x7f\\x6c\\x19\\x24\\xbc\\xc9\\x2c\\xc0\\x1a\\x00\\x7c\\x54\\x24\\xac\\xdd\\x38\\x24\\x01\\x20\\xa2\\xa0\\x2d\\x9d\\x14\\x39\\x88\\x20\\x31\\x46\\x09\\xb4\\x10\\x21\\xa6\\xf0\\x8e\\x34\\x91\\x62\\x8a\\xc1\\x91\\x56\\x4c\\x18\\x01\\x45\\x44\\xd9\\x45\\x84\\x44\\x55\\x35\\x6d\\x1c\\xe5\\x90\\xbc\\x06\\x4b\\xd4\\x7d\\x58\\x82\\xa0\\x01\\xfe\\x9b\\x7f\\xf6\\x58\\x23\\xc5\\x4c\\x82\\x83\\x3b\\x43\\x0a\\x80\\x00\\x26\\xa8\\x01\\x02\\x51\\x22\\xc6\\x53\\x28\\x80\\x51\\x88\\x10\\x29\\x86\\xc4\\x4c\\x5b\\x4f\\xf1\\x7e\\xc8\\x15\\x22\\x84\\x77\\x2a\\x22\\x46\\x52\\x46\\xb6\\xa7\\x58\\x30\\x02\\x55\\xd5\\x6e\\x39\\x2e\\x1b\\xe2\\xf4\\x2b\\xf6\\xf5\\xbc\\x57\\xbf\\x9e\\x27\\x38\\x38\\xab\\x7a\\xe4\\x77\\xf6\\x05\\x1c\\x54\\x01\\x08\\xd7\\x89\\x04\\x02\\x50\\x84\\xf3\\x20\\x99\\x07\\x10\\x49\\x7a\\x7d\\xb9\\xf1\\x78\\x3c\\x69\\xe0\\x20\\x92\\x34\\x5a\\xac\\xf1\\x78\\x3c\\x05\\x98\\x67\\xb0\\x45\\x9a\\x39\\x39\\xbf\\xa0\\xc4\\x1f\\x57\\xc0\\x9e\\x6e\\xf6\\xf8\\x73\\x02\\x25\\xfe\\x58\\x4a\\x14\\xd8\\x29\\xde\\x59\\x58\\x44\\x4f\\x89\\xf6\\x74\\xb3\\x64\\x32\\xdb\\x4a\\xfc\\x31\\x24\\xc1\\x28\\xc9\\x6b\\x49\\xe5\\xfa\\xc1\\x22\\x44\\x48\\xae\\x53\\xf1\\x61\\x24\\xe5\\x65\\x7b\\x49\\xaf\\xcf\\x1c\\x69\\x6e\\xf0\\xba\\x4d\\x91\\x66\\xa3\\xd7\\x67\\x8c\\xa4\\x0c\\xfa\\x55\\x86\\x28\\xed\\x3f\\xbd\\xc2\\x60\\xa4\\x57\\x18\\x04\\x53\\x84\\x78\\x9d\\x94\\x9a\\x94\\x95\\x9d\\x50\\x42\\x18\\x21\\x3d\\xf2\\x9e\\xed\\x67\\xfc\\xf5\\x5b\\xf0\\x46\\xcc\\xcf\\xf6\\x33\\xfd\\xfa\\x23\\xdd\\x20\\x79\\xce\\x66\\x2e\\xcf\\xe0\\x8e\\x34\\xf3\\xec\\x5b\\xa2\\xdf\\x24\\xd7\\xd9\\x6c\\xca\\x35\\xba\\x23\\xc4\\xe7\\x6c\\x36\\xfb\\x2c\\x6e\\xda\\x5a\\xb3\\xcd\\x6b\\x75\\x47\\x9a\\x9d\\xec\\x5b\\x66\\xdf\\x1e\\xfa\\x4d\\xaf\\xf1\\xb3\\x6b\\x72\\x9d\\xcd\\x39\\xec\\xae\\x3c\\x67\\x73\\x20\\xdb\\x4e\\x7e\\xb6\\x9d\\x02\\x7a\\x4d\\x73\\x61\\xf6\\xca\\x22\\x7a\\x9c\\x6f\\x70\\x72\\x3c\\xa5\\xdc\\x29\\x53\\xd6\\x50\\x63\\xdf\\xfd\\xb8\\x7f\\xa4\\x21\\x8f\\x8e\\x48\\x6d\\xc8\\x1d\\xae\\x0d\\xb9\\xe3\\x7c\\x9c\\x7e\\xbc\\x61\\xf6\\x09\\xbb\\xe9\\xa7\\x2e\\xee\\x0e\\x57\\x21\\xc4\\xbf\\x41\\x69\\xe8\\xd3\\x43\\xb7\\x0f\\x7b\\x7a\\xe8\\xbe\\x3f\\xe2\\x07\\xd5\\xd3\\xb6\\x9d\\xb6\\x7d\\xc8\\xb6\\xd3\\x3e\\x78\\x31\\xbe\\x1d\\xef\\x78\\x04\\x8b\\xb7\\xe0\\x3d\\xea\\x0c\\xfa\\xd9\\xa2\\x7e\\xfa\\x88\\x3a\\x0f\\xef\\xa0\\x9f\\x47\\xb0\\x58\\x97\\xf7\\x19\\x5a\\x37\\xa1\\xa7\\x74\\x3b\\x54\\xc2\\x0d\\x40\\xba\\x45\\x53\\xa2\\x00\\x66\\x21\\x42\\xf2\\xa3\\x29\\x17\\xdb\\x42\\xd2\\x3d\\x4a\\xec\\x2d\\x4a\\x91\\x23\\x4d\\x20\\xd8\\x22\\x2b\\x9c\\x27\\x4d\\x8a\\x9c\\x8a\\x8c\\x91\\x94\\x47\\x1f\\x85\\x6e\\xc1\\x16\\x39\\xd5\\x55\\xdf\\xf6\\x38\\x15\\x23\\x46\\x48\\x6e\\x4c\\x29\\x75\\xa4\\x89\\x3f\\xa6\\x44\\x31\\xa2\\x14\\xd9\\x65\\x17\\xb1\\x26\\x94\\xae\\xdd\\x64\\x57\\xb3\\x45\\xcc\\x2f\\x2e\\xf1\\x27\\x40\\x11\\xbb\\xc9\\x2e\\xa5\\x4b\\x24\\x91\\x20\\xf9\\xf2\\x93\\x80\\x76\\x7f\\x4e\\x69\\x89\\x3f\\x41\\x5c\\x2e\\x45\\xf6\\x24\\x12\\x55\\xd5\\xee\\xba\\x90\\xc7\\x17\\x8f\\xf5\\xa8\\xad\\x29\\x2b\\xef\\x8e\\xb5\\x35\\x3d\\xea\\x6a\\xe3\\xde\\x42\\x74\\x60\\xa8\\xa6\\x2c\\x5c\\x2c\\x79\\x3d\\x3e\\x7f\\x21\\x7a\\x3d\\x92\\xc1\\x1b\\xae\\xed\\x8e\\x33\\x38\\x2c\\xf8\\xdb\\x99\\x53\\x67\\x4e\\x5f\\xfa\\xe9\\x87\\x1f\\x3e\\xb5\\x89\\xbc\\xce\\xf1\\xea\\x17\\x33\\xc7\\x9f\\x3e\\x7e\\xf2\\x8a\\xfd\\x1f\\xb4\\x6c\\xdb\\xf4\\xdc\\xaf\\xf8\\x92\\xb8\\xe6\\xfc\\x99\\x4d\\x63\\xe7\\x55\\x8c\\x7d\\xed\\xc9\\xcd\\x1f\\xba\\x3f\\xdc\\x9b\\xf7\\xf3\\x4b\\xe2\\xf2\\xcb\\x67\\x37\\x8d\\x9a\\x19\\x9d\\xf8\\x6a\\xf2\\xf1\\xb7\\xdd\\xaf\\xee\\x74\\x7f\\x01\\x22\\x9c\\xa9\\x7d\\x27\\xde\\x24\\xee\\x04\\x1b\\x95\\x74\\xa8\\x84\\x5e\\x70\\x33\\x24\\x23\\x54\\x53\\xab\\xed\\xe9\\xa4\\xc0\\x41\\x44\\xc9\\xb1\\xa7\\x53\\x3d\\x4b\\x22\\x82\\x2d\\xa2\\xf4\\xb4\\xa7\\x53\\xb2\\x85\\x6d\\xca\\xf6\\x34\\x92\\xde\\x4c\\xcb\\xec\\x7e\\x70\\x09\\x11\\x62\\x77\\x2a\\x1e\\x5d\\xcb\\xe8\\x9e\\xd1\\xa9\\x04\\x31\\x92\\xea\\xae\\xef\\x75\\x77\\x2a\\x35\\x18\\x49\\x75\\x61\\x7b\\x4a\\x1f\\x8c\\x28\\x1e\\x3b\\x65\\x90\\x90\\x5f\\x54\\xe2\\x4f\\x28\\x35\\xdd\\x65\\x57\\x73\\x41\\x49\\xa4\\x90\\x71\\xab\\x67\\xb5\\xec\\x22\\xf9\\x09\\x25\\x47\\x96\\x5d\\xa4\\x90\\xb2\\xa7\\xb6\\xa6\\x47\\x3c\\xe6\\x2b\\x40\\x8f\\x14\\x2e\\x2e\\xab\\x63\\xac\\xea\\x83\\x3a\\x6b\\xdc\\xe8\\xc7\\xd2\\x53\\x9c\\x3f\\xf3\\xe1\\x5b\\x6e\\x7b\\xe8\\xa1\\x5b\\x6e\\xdd\\xbc\\xa3\\xa1\\x77\\x7d\\xbf\\x86\\x5e\\xbd\\xfa\\x15\\x72\\xaf\\xad\\x6f\\x4d\\xe0\\xb0\\xcd\\xb7\\xdc\\xfa\\xf0\\x43\\xb7\\xdc\\xfa\\xc8\\x8e\\xc1\\x3d\\xfb\\xf7\\x6c\\xe8\\xd5\\xbb\\x9f\\x30\\x7c\\xe4\\x15\\x8f\\x6d\\x59\\x35\\xf2\\x8a\\x47\\x1f\\xbd\\xa2\\x7e\\xf4\\xe8\\xfa\\x91\\xf5\\x63\\xc7\\xd6\\x1f\\x0b\\x0a\\xcb\\x86\\x1f\\x5d\\xbf\\x65\\xe4\\xe5\\x8f\\x6d\\xb9\\x62\\xe4\\xaa\\x47\\xb7\\x5c\\x91\\x18\\x3b\\xbc\\xdf\\xc8\\xc4\\xd8\\xb1\\x09\\x8a\\xe6\\xfa\\x68\\x87\\xc5\\x7c\\x71\\x27\\x84\\xa0\\x02\\x12\\x94\\x77\\x01\\x6a\\x29\\x8a\\x28\\x03\\x4b\\xf9\\x74\\xd2\\x44\\x19\\x58\\xc7\\xa7\\x91\\xd4\\x53\\x56\\x29\\xc5\\x8e\\x34\\x29\\x76\\x92\\x4a\\x2a\\x5d\\x92\\x3f\\x4d\\xa4\\xa8\\x52\\xe9\\xa7\\x87\\x18\\x7b\\xac\\x3a\\xb3\\xac\\x3a\\x23\\xbd\\x3a\\xb3\\x7a\\x61\\x44\\xa9\\x94\\x64\\x17\\xe1\\x13\\xa4\\x46\\x4e\\x99\\x8a\\x4a\\xbb\\x3a\\xa9\\xf0\\x58\\x5d\\x49\\x39\\xbf\\x4b\\x22\\x91\\x20\\x1e\\x99\\x04\\x12\\xa0\\x94\\x06\\x18\\xdb\\x48\\x9d\\xfc\\x24\\x48\\xd6\\x9c\\xae\\x55\\x25\\x7e\\xca\\xbb\\x9a\\x1e\\x75\\x4c\\xa4\\xe2\\x31\\x9f\\xd7\\x23\\x39\\x10\\xfb\\x62\\x6d\\xdc\\x23\\x19\\xfc\\x86\\x50\\xb9\\x1d\\xc3\\xc5\\x25\\xa5\\x8c\\x5f\\x75\\x68\\xb0\\xa3\\xdb\\xe3\\xf3\\xd7\\xf5\\xc5\\x5a\\xc6\\xba\\x3e\\xab\\xae\\x1a\\x34\\xf0\\xa3\\x27\\x37\\xbd\\x36\\x6b\\xc2\\x74\\xf4\\x94\\x74\\xf9\\x78\\x50\\xe3\\xdb\\x9c\\xfa\\xfc\\xc8\\x09\\xa9\\xb3\\x3e\\x56\\x55\\x2c\\x59\\x34\\xb9\\xf6\\x9c\\x6a\\xf5\\x7d\\x77\\xbc\\x74\\x66\\x24\\x72\\x7a\\xcf\\xf2\\xa1\\xbd\\xfa\\x37\\xe2\\xda\\xe5\\x5b\\xa6\\x4f\\xbb\\x7d\\xf4\\xd6\\xb7\\x76\\x5e\\x37\\xeb\\xbe\\x3e\\x03\\xd4\\x17\\x7a\\x5f\\x37\\x6a\\xdd\\x37\\x53\\x7e\\x15\\x27\\xd7\\xd5\\x7d\\xf5\\xda\\xe4\\xf3\\x02\\x01\\x9c\\x66\\xab\\x9a\\xca\\x5d\\x1d\\x99\\x5a\\xd7\\xb3\\x64\\x44\\x65\\x6c\\xd4\\x44\\xa6\\x9b\\x31\\xfe\\x47\\xcc\\x91\\x72\\x40\\x80\\x72\\x6a\\xcd\\x33\\xa6\\x1c\\x89\\xd8\\xc1\\x8e\\x67\\x7e\\x14\\xa9\\xcd\\x80\\xf3\\xb1\\xaf\\xe7\\xf1\\x3f\\x72\\x5d\\xd4\\x5f\\xd4\\xaf\\x74\\x1d\\xbf\\x58\\xed\\xcb\\x3d\\x2c\\x8d\\x00\\x19\\xdc\\x80\\xc4\\xc5\\x98\\x6e\\xf6\\xa7\\x15\\xb7\\x7e\\x4f\\xad\\x13\\xea\\xe2\\x7e\\x89\\x93\\xbd\\x4e\\x97\\xdf\\x10\\x2e\\x83\\x8b\\xb1\\x6a\\xbb\\x54\\xbb\\x3a\\x99\\x5c\\x5d\\x2b\\x6d\\x57\\xdf\\xe6\\xea\\x7d\\xb8\\x96\\x0b\\x8f\\xbd\\x79\\x96\\x3a\\x42\\x7d\\x3c\\x4f\\xdd\\xaa\\x8e\\x9c\\x7b\\xc3\\x58\\xae\\x98\\xb5\\x5d\\xa4\\xf6\\xe5\\xa6\\x74\\x6c\\x9b\\x6f\\x51\\x6c\\xed\\x6d\\xf7\\x70\\xc9\\xb5\\x4e\\xae\\xbc\\x2e\\xee\\x03\\xd9\\xeb\\x04\\x43\\xb8\\xe8\\x8a\\xd4\\x53\\x97\\xf5\\x90\\x76\\x60\\x1f\\xf5\\xe5\\x1d\\x92\\xfa\\xe6\\x2c\\x7c\\x0a\\xc7\\xe5\\xe1\\x18\\x7c\\x66\\xf6\\xfa\\x31\\xad\\xef\\xaa\\xab\\x7c\\xea\\x15\\xad\\xef\\x8d\\x61\\x6d\\x07\\xb8\\x81\\xfc\\x22\\x91\\x80\\x1d\\x64\\x48\\xf2\\xcc\\x41\\x3a\\xa2\\x8a\\x53\\x6f\\xb9\\x4e\\xe4\\xe3\\x7c\\xa9\\x5f\\x74\\x1b\\x2c\\x58\\xee\\x0e\\x24\\xb0\\xab\\xeb\\x39\\x37\\x86\\x7b\\xaa\\xff\\xda\\x75\\xfb\\xe3\\x5b\\xff\\xf1\\x8e\\x50\\xa4\\xfc\\x0d\\xa7\\xaa\\x9b\\x56\\xa6\\x26\\xab\\xff\\x59\\x84\\xc5\\xea\\xa1\\x73\\xd0\\xa9\\xf3\\xa3\\x27\\xdc\\x2c\\x14\\x0a\\x4f\\x81\\x05\\x9a\\x98\\x97\\x34\\xc4\\xa9\\x0b\\x26\\x62\\x2c\\x09\\x48\\xdd\\x08\\x98\\x4d\\x91\\x24\\x02\\xdd\\x44\\xde\\x14\\x41\\x62\\x8d\\x12\\x73\\x0b\\xe1\\x62\\x8a\\xc9\\x95\\x26\\x42\\x2c\\x69\\x32\\xd3\\x73\\x26\\x83\\x29\\x92\\x34\\x9b\\xe8\\xa6\\x19\\x4c\\x11\\xc5\\x96\\x61\\x67\\x48\\x0e\\xc9\\x21\\x2f\\xfd\\xee\\x89\\xe7\\xa0\\x07\\xe7\\xab\\xb7\\xab\\xdf\\x71\\x55\\xc7\\x70\\x9d\\xba\\xfc\\x98\\x3a\\x0b\\x37\\xd2\\x3e\\xf4\\x53\\xdf\\xc5\\x7b\\xe1\\x0f\\x10\\xa1\\x94\\x8d\\x2d\\x97\\x19\\x5b\\x29\\x4a\\xb0\\x45\\x11\\x3c\\x69\\xc5\\x80\\x11\\x45\\xa0\\x6e\\x5f\\x4c\\x40\\x55\\x75\\x00\\x6b\\x43\\x5e\\xbe\\x5f\\x23\\xe6\\x6f\\x52\\xdf\\xc5\\x41\\x5f\\x1e\\x51\\x77\\x32\\x5a\\x96\\xa2\\xca\\x3d\\xc8\\x7d\\x06\\x3c\\x14\\xd3\\x76\\x14\\xe4\\xd3\\xf4\\x83\\x44\\x88\\x2a\\x80\\x91\\x14\\xef\\xa4\\xed\\x52\\x57\\xaf\\xf7\\xcd\\xbb\\x94\\xab\\x41\\xf5\\xe0\\x41\\x7a\\xef\\x8d\\x00\\x98\\xa2\\x41\\x08\\x74\\xed\\x80\\x44\\xb2\\x1b\\xb4\\x09\\x2a\\x29\\xbc\\x23\\xcd\\x3e\\x7a\\x13\\x14\\x7f\\xdc\\xa8\\xe3\\x0e\\xfa\\x7c\\xed\\x67\\x6d\\x35\\x5f\\xc2\\xf0\\x8c\\x0c\\x49\\x64\\x63\\x24\\x44\\x33\\xd7\\x1a\\x30\\x84\\x76\\xce\\x87\\xf9\\xad\\xdf\\x5e\\x22\\x55\\xfe\\xfe\\x1e\\xc5\\x3f\\x67\\x6a\\x87\\x85\\x9e\\x19\\xdb\\x5a\\x0f\\x49\\x0b\\x7d\\x98\\xcc\\x67\\xad\\x2a\\xed\\x78\\x3e\\x7b\\xaa\\xdd\\x91\\xce\\x18\\x4f\\xc5\\xe8\\x48\\x2b\\x05\\x19\\xeb\\xa8\\x58\\x84\\x44\\x82\\x09\\xba\\x13\\xe2\\x31\\xc8\\x45\\x27\\x84\\x8b\\x01\\x75\\x47\\x21\\x67\\xac\\x1b\\x9a\\xbe\\xf8\\x1c\\x2d\\xea\\x7f\\x3e\\xff\\x52\\xfd\\x37\\x86\\xcf\\x9a\\x33\\x6b\\xde\\xfc\\x59\\xb3\\xe7\\x71\\x75\\xd8\\x1f\\x83\\x58\\xa9\\xbe\\xa7\\x1e\\x50\\x5f\\x54\\x3f\\x53\\x3f\\xc0\\x08\\x8a\\xe4\\x9e\\x7b\\x08\\xfe\\x6d\\xeb\\xbd\\xf7\\x3c\\xae\\xcb\\xc6\\x16\\x00\\xee\\x3f\\x22\\x01\\x91\\xa2\\x33\\x81\\xda\\x2d\\x8e\\xf6\\x0c\\x39\\x67\\x70\\x7b\\x54\\x01\\x43\\x9a\\x0d\\x91\\xc0\\xd8\\x92\\x14\\x78\\x3a\\xf8\\x02\\x1d\\x7c\\x43\\x86\\xc1\\xa5\\x72\\x48\\xde\\xc2\\x8d\\x50\\xf7\\x09\\x8f\\xff\\xab\\xe6\\x8f\\x31\\xc2\\xe3\\x80\\x30\\x02\\x40\\x18\\x2c\\xee\\x64\\xd9\\x8d\\xa4\\x9d\\x52\\x6c\\xe1\\xd3\\x4c\\xa0\\x15\\x1f\\x9f\\x4e\\xfa\\x58\\x2b\\xbe\\x3c\\x2a\\x69\\x01\\x0a\\x82\\x94\\x5c\\x4f\\x9a\\x22\\x20\\x37\\x46\\x14\\xc9\\x91\\x4e\\x4a\\x6e\\x7a\\x81\\x64\\x33\\x45\\x92\\x6e\\x89\\x6e\\xba\\xed\\xa6\\x88\\x92\\x8f\\x11\\xc5\\x9d\\x2b\\xbb\\x92\\xbc\\xc5\\x9c\\x48\\x24\\x40\\xb1\\x50\\x37\\xeb\\x48\\x10\\x9f\\x9c\\x94\\xc0\\x9d\\x60\\x3e\\xb4\\x0c\\xe2\\x31\\x81\\x3a\\x49\\xf4\\x87\\xbc\\xa1\\x5a\\xcc\\xda\\x31\\x6f\\x68\\x84\\x88\\xb6\\x2f\\x0f\\x22\\xde\\xf4\\xb0\\xda\\xca\\x71\\x73\\x8e\\x15\\xe2\\x87\\xf3\\x4e\\x9f\\x3d\\x75\\xee\\xd9\\xea\\x97\\xfc\\x0f\\x3b\\x51\\xfe\\xf6\\xe5\\x2b\\x3f\\x7b\\x52\\xfd\\x4a\\x3c\\xf0\\x22\\xfe\\x7e\\xc1\\xbd\\x83\\xa7\\x5d\\x70\\xcd\\x32\\xca\\x9f\\x46\\xed\\xb0\\x50\\x2b\\xee\\x84\\x6e\\x70\\x11\\x24\\xbb\\x50\\x5a\\x44\\x3e\\x9d\\x14\\xbb\\xd0\\x6e\\x89\\x68\\x8a\\x24\\xf3\\x29\\x59\\x1e\\x3e\\x9d\\xf4\\xe4\\xd3\\x63\\x9e\\x1c\\x53\\x24\\x65\\xb3\\x76\\xc9\\xb7\\x45\\x14\\x9b\\x29\\x8d\\x24\\x12\\x25\\xc6\\x16\\x86\\x0e\\x64\\x6a\\xf0\\x8b\\x1c\\xe9\\xa4\\x5c\\x44\\xaf\\x94\\xad\\xa6\\x88\\x52\\x41\\xe1\\x82\\x51\\x76\\x91\\xe2\\x04\\x28\\x56\\x51\\x76\\x29\\x50\\x9a\\x48\\x10\\x9b\\x4c\\x8a\\x13\\xc4\\xe3\\x52\\x72\\x8b\\x8e\\x83\\x06\\x11\\xac\\xd5\\x37\\x18\\x51\\xe5\\x65\\x25\\x19\\x7a\\x29\\x34\\x10\\xc2\\xc5\\x25\\x8d\\x1c\\x06\\x56\\x4e\\x9b\\x7b\\xc1\\x79\\x4b\\x1e\\x78\\x60\\xfe\\x9c\\x39\\x67\\x36\\x2d\\x51\\xbf\\xe2\\x24\\x74\\xbd\\xf1\\x39\\xda\\x56\\x9e\\x7d\\xe1\\x65\\xea\\xfe\\x2f\\xde\\x50\\xf7\\xe3\\x1a\\x69\\xfc\\xc2\\x25\\x33\\xce\\x3b\\xf7\\x93\\x85\\x33\\x27\\x9d\\x33\\x63\\x94\\xb4\\xe5\\xd3\\x8f\\x76\\x9d\\xb9\\xa5\\x2a\\x92\\x5c\\xbe\\xeb\\xab\\x0f\\xa9\\xdc\\x26\\x00\\x84\\x19\\x22\\x61\\xf9\\xa0\\x91\\x90\\x34\\x52\\xc9\\xa0\\xe2\\x9e\\x32\\x5b\\x8c\\x68\\x8b\\x10\\x3e\\xae\\x98\\x79\\x6a\\x43\\x90\\x38\\x29\\x85\\xc4\\xca\\xd0\\x3b\\xe1\\x62\\x49\\xa3\\x81\\x92\\x67\\xa4\\x52\\x22\\x53\\x2c\\x6f\\x31\\xcb\\x2e\\x02\\x09\\x82\\x32\\xb1\\x53\\x62\\x30\\x24\\xc7\\xbd\\x61\\x6a\\x34\\x4a\\x43\\x72\\xb9\\x21\\xc1\\x4d\\xc3\\xb2\\x07\\x1f\\x54\\xf7\\xb7\\x3e\\x8e\\x3c\\x8e\\x96\\xfc\\x78\\x98\\xdf\\x79\\x6c\\xd1\\xe7\\xea\\x2b\\xd8\\xfb\\x73\\xce\\xca\\x75\\x65\\x72\\xba\\x48\\x3b\\x2c\\xf4\\x12\\x09\\x14\\xc1\\x28\\x48\\x16\\x64\\xc7\\xc1\\x49\\x99\\xef\\xb6\\xa6\\x53\\x7e\\x4b\\x81\\xd3\\x16\\x51\\xfc\\xc6\\x34\\x03\\xd6\\xc6\\x16\\x25\\xcf\\x91\\xa6\\x60\\x58\\xc9\\x33\\xca\\x2e\\x45\\x76\\x31\\x81\\x11\\x65\\x57\\x0a\\x38\\xbb\\x23\\x8f\\xfa\\x4e\\xbf\\x4c\\x3c\\x8c\\xb7\\xa5\\x59\\xde\\x86\\x8b\\x25\\x43\\xa9\\x3b\\xe4\\x0d\\xf1\\x7d\\xb1\\xae\\x87\\xcb\\xeb\\xe1\\xc2\\xc5\\x25\\x8b\\x38\\xcc\\x5d\\x34\\x79\\xde\\xcc\\xf9\\xf3\\xc6\\x4f\\x76\\xab\\xda\\x78\\xbe\\xa2\\xf5\\xe5\\x2e\\x5d\\x96\\x0d\\x7e\\xf7\\x50\\xeb\\xf7\\xaf\\xab\\x9f\\xe3\\x1a\\xd1\\x3e\\x73\\xe1\\x4d\\x17\\x5c\\x7a\\x7b\\xdf\\x5a\\x99\\x8f\\x7c\\xab\\x92\\xc2\\x72\\xe4\\xd5\\x63\\xdf\\xbc\\xab\\x7e\\xfb\\x09\\x70\\x30\\x5b\\x3b\\x2c\\x9c\\xce\\x74\\xa1\\x9c\\x6a\\x43\\x0e\\xed\\x79\\x61\\x56\\xff\\x2d\\x96\\x74\\xca\\x55\\x92\\x43\\xa1\\x94\\xcb\\x9c\\x46\\xd2\\x85\\x99\\x82\\x00\\x35\\x05\\x31\\x12\\x70\\xb2\\xfe\\x7b\\x1d\\x69\\xa5\\x2b\\x46\\x94\\x50\\x80\\x61\\x25\\x57\\x0e\\xed\\xbb\\x57\\x56\\x8c\\x06\\x4a\\x52\\x49\\xa1\\xec\\x22\\xde\\x04\\x71\\xc9\\x8a\\xdd\\x91\\x48\\x10\\x8b\\x8b\\x18\\x13\\x44\\x90\\x89\\x21\\xa1\\x1b\\x8d\\x50\\xcc\\xe7\\x37\\x74\\xc7\\x70\\xb1\\x54\\x84\\x7d\\x31\\x1e\\x73\\x79\\x3d\\x1d\\x2c\\x88\\x4e\\xf3\\x6c\\x1c\\x06\\x5a\\xd3\\xb5\\x8d\\x35\\x03\\xce\\x1a\\x74\\xd5\\xbd\\x12\\x5f\\x7d\\xeb\\x19\\x2f\\xef\\x57\\x7f\\xd8\\x7b\\x48\\xfd\\x14\\x4b\\x2e\\x99\\x3f\\x65\\xe1\\xa2\\x69\\x63\\x97\\x15\\x71\\x09\\xcc\\xc7\\x42\\x6c\\x2a\\x2a\\x6c\\xf1\\xfb\\x5f\\x23\\x62\\xbc\\x5e\\x3d\\xfc\\xe1\\x3e\\xf5\\x73\\x4c\\xa0\\x7d\\xeb\\xb3\\x0f\\x5e\\x70\\xe1\\xad\\x35\\x99\\x98\\xb2\\x37\\x80\\xd0\\x5f\\x24\\x60\\x85\\x9a\\x0e\\x92\\xa3\\x00\\xb5\\x76\\x36\\x36\\x38\\x06\\x47\\x3a\\x1b\\xc2\\xf0\\xa6\\x88\\x62\\xa7\\x62\\x02\\x46\\x86\\x6f\\x74\\xab\\x6d\\x46\\xde\\x10\\xaa\\xcb\\xc3\\xba\\xde\\x82\\xf8\\xed\\x96\\x52\\xbb\\xba\\xcf\\x5e\\x7c\\xe0\\x65\\xe1\\xad\\x83\\x07\\xd5\\xef\\xd5\\x32\\x55\\xd9\\xb0\\x01\\xfb\\x73\\xb9\\x6c\\x6a\\x92\\x87\\xa9\\xda\\x61\\xa1\\xb7\\xb8\\x13\\xfc\\x10\\x86\\x28\\xac\\x83\\xa4\\x97\\x72\\x39\\x90\\x85\\x5e\\x95\\x7c\\x3a\\x55\\x1e\\xf2\\x9a\\x6c\\x11\\xa5\\x9c\\x76\\xa1\\x8a\\x71\\x39\\xc7\\x91\\x26\\x39\\x4e\\x52\\xc2\\x50\\x98\\x83\\xa1\\xb0\\x12\\x76\\x48\\x29\\xc4\\x88\\xe2\\x72\\xa4\\x19\\xce\\x57\\xac\\x8e\\xb4\\x52\\x8d\\x11\\xa5\\x24\\x83\\xbe\\xba\\xc9\\xcd\\xde\\x40\\xc8\\xa4\\x83\\x2f\\xe2\\x48\\x00\\x1b\\x18\\xc5\\x05\\x89\\x04\\x29\\x97\\x15\\x07\\x9f\\x48\\x90\\x4a\\x97\\x62\\x95\\x12\\x9d\\x71\\x57\\x27\\x25\\xed\\x28\\x71\\xee\\x0e\\xdb\\x53\\xaf\\xba\\x60\\xde\\x32\\xf5\\xed\\xb7\\x10\\xce\\x9b\\x7b\\xfe\\x1a\\xf5\\xfb\\xfd\\x9f\\xa9\\x47\\xb0\\x74\\xc9\\xf4\\xa9\\x4b\\x96\\x4d\\x9d\\xb6\\x38\\x34\\x75\\xec\\xe8\\xa9\\xd3\\x47\\x8f\\x99\\x82\\xeb\\x97\\x3f\\x19\\x8b\\x3e\\xbc\\x70\\xc7\\x07\\x1f\\xec\\x58\\xb8\\x39\\x5a\\xfd\\xd4\\x05\\xbb\\xf7\\xee\\xfd\\x74\\xce\\x79\\xe7\\xcf\\x9e\\xb5\\x7c\\x39\\x57\\x30\\xf5\\xdc\\x73\\xa7\\x4e\\x3a\\xf7\\x6c\\x7d\\x5e\\xa1\\x49\\x3b\\x2c\\x54\\x65\\xe4\\x6f\\x21\\x24\\xcd\\x59\\xff\\xc3\\xac\\x71\\x29\\x9f\\x4e\\xe5\\x14\\x9a\\x79\\x5b\\x44\\xc9\\x31\\x76\\x92\\xbf\\x00\\x73\\x45\\x24\\xa4\\x87\\xe4\\x54\\xfe\\x02\\x20\\xbb\\x14\\x9b\\x9d\\x41\\xcd\\x66\\xb3\\xcc\\xe7\\x30\\x98\\x2e\\x53\\xdd\\xb6\\x25\\x48\\x0e\\xd5\\x6d\\x52\\xc8\\x64\\xb1\\x54\\x26\\xc0\\x88\\x6f\\xf7\\x58\\x65\\xe5\\x75\\x85\\xc8\\x00\\x39\\x45\\x9b\\x5c\\x06\\x6d\\xea\\x44\\x37\\xa1\\xe7\\x83\\xcf\\xd0\\xa7\\xbe\\xfe\\xd3\\x88\\x7b\\x07\\x17\\xf7\\xbf\\x6c\\xcc\\x79\\x37\\x55\\x5f\\x3d\\xea\\x8d\\x34\\x86\\xe7\\x4e\\x3f\\x6d\\x41\\x68\\xc9\\x8c\\x49\\x8b\\xf9\\xdd\\x1f\\x63\\x48\\x7d\\x53\\xfd\\x56\\xdd\\xac\\xfe\\x47\\x7d\\xbb\\xa8\\xf0\\xbd\\x5c\\xff\\x96\\x4d\\xa7\\xf5\\x6d\\x40\\xd3\\xe7\\x17\\xff\\xa3\\x47\\xe5\\x9a\\x7b\\x1e\\x7a\\x00\\x38\\xdd\\xbf\\x0b\\x0b\\x58\\xae\\xa1\\xb2\\xdd\\xc3\\x33\\x07\\x4d\\xfd\\xfb\\xf1\\xd9\\x06\\x3e\\x93\\x6d\\x68\\xcf\\x32\\xdc\\xd8\\x9e\\x65\\xe0\\x17\\x64\\x7c\\x3e\\x07\\xcb\\xd4\\x77\\xf1\\x7d\\x61\\x01\\x88\\x60\\x82\\x5a\\xa0\\x92\\x62\\xa0\\xcd\\x99\\xa3\\x44\\x6a\\x51\\x4c\\x8e\\x34\\x31\\x39\\x89\\x40\\x85\\x05\\x3d\\x69\\x82\\x51\\x86\\x66\\x2c\\x18\\x51\\x4c\\x9d\\xd1\\x8c\\x85\\x3e\\x61\\x19\\x45\\x34\\x0f\\x60\\x49\\x16\\xd4\\x08\\x77\\x64\\x1e\\x03\\x08\\x3d\\x60\\x30\\xbf\\x41\\x10\\xc1\\x00\\xe0\\xae\\x45\\x59\\xf4\\x8a\\x72\\x0f\\xfe\\x8c\\xd6\\x17\\xb9\\xfe\\x98\\xfa\\x02\\x17\\xa9\\x3f\\xbe\\x25\\xbd\\xa1\\xfe\\xa8\\xf7\\x69\\x2d\\x8e\\x10\\x8c\\xfc\\x01\\x46\\x6b\\x9e\\x8e\\x84\\x2c\\x3a\\xa5\\x16\\x46\\x69\\x86\\x30\\xaa\\x4b\\xf4\\xd9\\x6b\\xf9\\xcb\\x8f\\x5d\\xce\\x5f\\x8e\\x23\\xbe\\xfa\\x0a\\x9f\\xf8\\x2a\\x83\\x93\\x57\\xc0\\x60\\xfe\\x33\\xfd\\x79\\x75\\x72\\x69\\x6d\\xa9\\x8c\\xde\\x15\\xdc\\xb0\\xd6\\xa7\\xf8\\xf9\\x83\\xd1\\xfe\\x8e\\xf4\\x2f\\xb4\\xa9\\x37\\x7f\\x01\\x1c\\x04\\x01\\xf8\\xb7\\x98\\x0c\\x15\\xc2\\x5c\\x3d\\xba\\x51\\xf2\\x6d\\x59\\x8f\\x6e\\xe9\\xec\\xd1\\x8b\\xa2\\x24\\xd0\\x42\\x6c\\x31\\xa5\\xd0\\x91\\x26\\xd6\\x18\\x29\\x6c\\xf3\\xeb\\x34\\x16\\x54\\x0a\\x03\\xd4\\x83\\xcb\\x3e\\x1a\\xb3\\xb8\\x65\\x62\\x4e\\x10\\xc9\\x45\\x4c\\x09\\x50\\x7c\\xf9\\xb2\\x2b\\x09\\x92\\x35\\xe3\\xc7\\xb3\\x7e\\xcd\\x8e\\xde\\x50\\x5f\\x6c\\x8b\\x47\\x0c\\x21\\x4a\\x4d\\x90\\x47\\xfe\\xed\\x03\\xa0\\xdd\\xb2\\xa4\\x4f\\x99\\xba\\x1f\\xc7\\x5e\\x38\\x64\\xc2\\xcc\\x29\\xc3\\xce\\x42\\xf5\\x4b\\x0c\\x61\\x99\\x90\\xd8\\xbe\\xe7\\x8b\\x97\\x2f\\xfb\\x68\\x68\\xf4\\xcc\\x71\\xd7\\xad\\x9a\\x5e\\xbf\\x66\\xdc\\xb4\\xf9\\x93\\x26\\x1c\\x7d\\xf3\\x8f\\x3f\\x80\\x83\\x01\\x6a\\x2f\\x69\\x87\\xb8\\x0e\\xe2\\x30\\x10\\xb6\\x41\\xd2\\xc4\\xec\\xb1\\x3d\\x9d\\x74\\xd0\\x8d\\x3a\\x7b\\x9a\\x54\\x47\\x95\\x6e\\xf6\\x34\\xe9\\x1f\\x55\\xbc\\xf6\\x34\\x29\\x89\\x2a\\x3c\\x0d\\x72\\x07\\xb1\\x10\\xa4\\x5c\\x8f\\xcd\\xca\\x99\\x65\\x4e\\x49\\x7a\\xc6\\x65\\x70\\x26\\xe3\\xf2\\xe2\\x1f\\xe3\\xc0\\x1b\\x31\\xdb\\x49\\x1f\\x27\\xe9\\xbb\\x5d\\x09\\xe4\\xfe\\x4e\\xf2\\xb6\\x43\\x73\\x5e\\xa0\\x4f\\xdf\\xee\\xdd\\xbb\\x77\\xc7\\xb6\\x2d\\xd2\\x90\\x87\\x4a\\x39\\x55\\x27\\xec\\x92\\x48\\x90\\x90\\xdc\\x60\\x32\\xf1\\x72\\x49\\xb7\\xee\\xd5\\xb5\\xf5\\xd4\\xae\\x48\\x2e\\xc5\\x50\\x4c\\x8d\\xbb\\xa9\\x9b\\xec\\x22\\x95\\x09\\xa5\\xae\\x50\\xcf\\x27\\x78\\xfb\\xcb\\x2e\\x92\\x4b\\xd9\\xe3\\x82\\x50\\x10\\x78\\x89\\xa3\\x9a\\x45\\x35\\xaa\\xac\\xae\\x87\\x2b\\x4e\\x2d\\x7d\\x9c\\x97\\x98\\x6a\\xe9\\x17\\x70\\x10\\x8a\\xf5\\xa8\\xf3\\xdb\\x31\\x1c\\x04\\xd4\\x4f\\xf4\\xc6\\x3a\\x37\\x73\\x07\\x03\\x5c\\xf8\\x09\\x5e\\x89\\xab\\xf1\\x2e\\xa7\\xe9\\xfb\\x23\\xa3\\x96\\xe5\\x54\\xac\\x9e\\x74\\xfd\\x6d\\x9e\\xdc\\x23\\x8f\\x9c\\x7f\\xfd\\x78\\x5e\\x8c\\x1b\\xba\\x95\\x9c\\x77\\xad\\xd1\\xa9\\xbe\\xa5\\xbe\\xa4\\xbe\\xa3\\xde\\xea\\x90\\xb1\\x11\\x63\\x13\\x9e\\xec\\x5f\\x36\\xf0\\xad\\xd9\\xea\\xf9\\xea\\x38\\x6e\\x93\\x39\\xd1\\xd0\\x73\\x6a\\x09\\x56\\xf8\\xbb\\xe7\\x2e\\x3e\\x1f\\x3f\\xc5\\x2d\\x1c\\xaa\\x01\\x75\\xda\\xc7\\xea\\x2b\\x93\\x46\\x37\\x35\\x7d\\xff\\x8a\\x8a\\xb1\\x9a\\x1e\\x42\\xeb\\xcb\\x67\\x36\\x7e\\xfc\\x30\\xce\\xc4\\xeb\\xd4\\xd3\\xd5\\x3b\\xd4\\xbb\\xd5\\x79\\x5d\\x0a\\xff\\xde\\x2d\\x8a\\x3f\\xe3\\x79\\x97\\xad\\xae\\x69\\x14\\x44\\x01\\x7f\\x34\\x18\\x5f\\xa2\\x32\\x6d\\x05\\x10\\x8b\\x44\\x02\\x06\\xb0\\xc0\\x70\\x5d\\x7f\\x09\\x1f\\xd7\\x61\\x87\\x64\\x04\\xb4\\x45\\x14\\x89\\x4a\\xb7\\x95\\x99\\x29\\x8a\\x36\\x0c\\x4e\\x45\\xc0\\x08\\x53\\x64\\x1b\\x0d\\x1f\\x0c\\xb2\\xab\\x99\\x43\\xa3\\x89\\xd9\\x26\\xa4\\x0e\\xc5\\x9c\\xa8\\xaa\\x8e\\x63\\x08\\x43\\x7c\\x88\\x77\\x87\\xf8\\xb0\\x15\\x7f\\xc3\\x08\\xfe\\xa2\\xee\\x9d\\xad\\xe2\\xec\\x2d\\xb8\\x38\\x25\\x89\\xe4\\x8f\\x31\\x58\\xaf\\xbe\\xca\\x15\\x71\\xbd\\x75\\x7f\\xb2\\x16\\x40\\xd8\\xcd\\xe2\\x30\\x3f\\x04\\xa9\\xd5\\x64\\x18\\xd6\\xc1\\xa7\\x75\\x6c\\x1c\\xa4\\x56\\xd3\\x6f\\xe7\\xa8\\xd5\\x94\\xd2\\x48\\x42\\xac\\x3b\\x0e\\xea\\x3c\\x62\\xc4\\xa1\\x8b\\xbb\\xc5\\x91\\x26\\x16\\x27\\x11\\xa9\\x55\\xc8\\x77\\xa4\\x49\\x7e\\x54\\x11\\x1d\\x69\\xa5\\x18\\x23\\x8a\\xe8\\x96\\xa9\\x93\\x06\\xc5\\xef\\x90\\x5d\\xc4\\xc2\\x6c\\xa7\\x31\\x41\\x82\\xd4\\x54\\x30\\x4b\\x14\\xec\\xe0\\x2b\\x4a\\x43\\xba\\x6f\\x08\\xd5\\x66\\xe1\\xdf\\x5a\\xfc\\x0e\\x11\\x83\\xe7\\xce\\x5b\\xbd\\x5a\\xfd\\xae\\x55\\xfd\\x05\\x6d\\xe7\\x5f\\x34\\x7f\\x89\\xba\\xff\\xdd\\x0b\\x2e\\xbd\\xec\\xd2\\x5d\\x22\\xd9\\xf5\\xda\\xdc\\x4d\\x5d\\xf2\\xb7\\x5d\\xf8\\xce\\x87\\x07\\xe6\\xce\\x3e\\x77\\xe9\\xee\\x19\\xd3\\xe6\\xce\\x00\\x84\\xe9\\xda\\x61\\xe1\\x43\\x71\\x27\\x84\\xe1\\x0c\\x48\\x86\\x20\\x0b\\xc5\\x43\\x59\\xc5\\xd5\\x01\\x09\\xa5\\xd1\\x21\\xd0\\x63\\x0e\\x0b\\x55\\xe6\\x12\\x46\\x9a\\xdb\\x91\\x26\\x6e\\xa7\\x92\\x8b\\x11\\x8a\\xf2\\x0a\\x3c\\x69\\x62\\x8c\\x29\\xa5\\x18\\x51\\x72\\xdd\\xb2\\xee\\x03\\x1d\\x3e\\xd9\\xa5\\x18\\x03\\x89\\x2c\\xe8\\x10\\xfc\\x3e\\xaf\\xc7\\x6b\\xc8\\x64\\xae\\x64\\xdd\\xc5\\x85\\xfc\\x1e\\xaf\\xcf\\x20\\x95\\x06\\x61\\x3a\\x36\\x20\\xa0\\xfd\\xf6\\x0d\\x9c\\xfa\\xe5\\xba\\x9b\\x57\\xdf\\x71\\xdf\\xba\\x6b\\x56\\x63\\x80\\xc3\\x1b\\x37\\xa8\\x7f\\xa8\\xbf\\xab\\xdb\\xb8\\x21\\x18\\x42\\x13\\x8e\\xc7\\x75\\x57\\x7f\\x2d\\x49\\xd2\\x8d\\xff\\xf8\\xe0\\x41\\x75\\xff\\xc3\\x1f\\xfc\\xfd\\x26\\x49\\x92\\xbe\\x58\\xb3\\x0e\\xb1\\x49\\xb7\\x81\\x00\\xc2\\x41\\x91\\x80\\x09\\xdc\\x50\\x95\\xd1\\x65\\x73\\x76\\x94\\xdc\\xd4\\xd5\\x7b\\xf4\\xd8\\xdf\\x91\\x26\\x66\\x27\\x45\\x19\\xcc\\x0c\\x79\\xb3\\x26\\x3f\\xc8\\x62\\xf4\\x50\\x79\\x26\\x53\\x44\\x79\\xfb\\x2b\\x5a\\x70\\x8a\\xfa\\x90\\xfa\\xdb\\xdb\\x2f\\xdd\\x9d\\x4c\\xde\\xfd\\x92\\x48\\xd4\\x2d\\xea\\x6f\\x3f\\xa9\\xbf\\xaa\\x5b\\x0f\\xbc\\xbf\\xe5\\x97\\x47\\xde\\xa7\\x76\\x93\\x3e\\x77\\xa1\\x48\\xc0\\x02\\x43\\x32\\x5e\\xc6\\xc4\\xa7\\x75\\x8c\\x23\\xf0\\xe9\\x94\\xa8\\x8b\\xaa\\xc8\\xb7\\x89\\x2a\\xf5\\x11\\x34\\x8c\\x66\\x21\\xb6\\x89\\x37\\x45\\x88\\x39\\xa6\\xc7\\xd3\\x99\\x20\\x3a\\xae\\x07\\xd0\\xec\\xb3\\x96\\xff\\xa2\\xb5\\x3f\\x37\\xb5\\xf5\\x41\\xee\\x25\\x91\\x1c\\x54\\x6f\\x3e\\xa8\\xce\\x38\\xa0\\xdb\\x6b\\xfa\\xdc\\xf3\\x19\\xbd\\x0d\\xfa\\x73\\xdb\\x9f\\x69\\x14\\xd9\\x33\\x8d\\x7c\\x3a\\x93\\xf6\\x3e\\xf1\\x99\\x99\\x07\\x5a\\x8e\\x7b\\xe0\\x5a\\xfe\\xbb\\xd6\\x9e\\xdc\\xac\\xd6\\x8d\\xf4\\x61\\x8b\\x0f\\xb6\\xde\\xaf\\x3f\\x8b\\xe2\\xd6\\xaf\\xc5\\x9d\\x10\\x84\\x15\\x90\\x2c\\x04\\x9d\\xa1\\xba\\x90\\x58\\xf9\\x74\\xd2\\xca\\x84\\xc4\\x6a\\x34\\x45\\x52\\x39\\xb9\\x85\\x42\\x67\\x55\\x70\\x3a\\xd2\\xc4\\xc9\\x12\\xda\\xc4\\x14\\xa3\\x70\\x22\\xe9\\x0b\\x30\\x39\\xcb\\x31\\x45\\x88\\xcf\\xa9\\x18\\x5c\\xba\\x26\\xf8\\x9c\\xb2\\x2b\\x29\\xb8\\x0b\\x59\\x34\\xe7\\xa6\\x46\\x2e\\x90\\x50\\xac\\xb9\\xb2\\xab\\x1d\\xbd\\x06\\xc1\\x6f\\x08\\x31\\x7b\\x95\\x91\\xa2\\x3a\\x39\\x54\\x1b\\x92\\x25\\x21\\x1c\\x84\\xd9\\x38\\x18\\x01\\xcd\\x18\\xe0\\x39\\xf5\\x88\\xf1\\xca\\xcb\\xd6\\x3c\\xf0\\xe8\\x8d\\xf3\\x2e\\x0e\\xaa\\x2a\\x57\\xd6\\x5f\\x3d\\xf2\\xae\\xfa\\x9b\\xfa\\x38\\xd7\\x80\\x55\\x68\\xc4\\x91\\x6a\\xeb\\x7b\\xd2\\xf9\\x57\\xbf\\x75\\xbf\\xfa\\xaf\\x87\\xde\\xea\\x56\\x84\\xf6\\xdd\\xad\\x9f\\x9c\\xbe\\x06\\x47\\xe8\\x3c\\x15\\x43\\x6c\\x2c\\xfb\\x65\\x2c\\x8e\\x41\\xb7\\x38\\x44\\x8c\\xa7\\xcc\\x3c\\xe3\\xaa\\xb9\\x7d\\x24\\x2d\\x2c\\xc4\\x21\\x16\\x3d\\xed\\x2b\\xe8\\xf0\\xa8\\x6d\\x0c\\xdb\\xfe\\xd6\\x62\\x09\\xd7\\x84\\x61\\x1a\\xd3\\x88\\xa4\\x75\\x3d\\xb7\\xec\\x8f\\x31\\xdc\\xf4\\xd6\\xfb\\x01\\xe1\\x0e\\x00\\x7c\\x81\\xe5\\x0f\\x42\\x1d\\xc6\\xf0\\xcf\\x73\\x0f\\x77\\x60\\x09\\x35\\x50\\x6c\\x4c\\xfa\\x69\\x87\\x05\\x9b\\x48\\xc0\\x4d\\xe5\\xce\\xde\\x16\\x8b\\xda\\xdb\\x62\\x51\\x13\\x6b\\xca\\x13\\x25\\xae\\x16\\x96\\xb7\\xe6\\x58\\x37\\x69\\xa7\\xa9\\xd0\\x2b\\x46\\x4e\\x76\\x11\\x3b\\x75\\x2c\\xa2\\xec\\x22\\xae\\x8e\\x81\\xa5\\x1c\\x92\\x29\\x32\\x2d\\x2f\\xab\\xad\\xe9\\xc7\\x61\\xfe\\xa2\\xe9\\x63\\x97\\x62\\x58\\x3d\\xf2\\xee\\x97\\x57\\x5d\\x8e\\xf7\\x4a\\xe7\\x9d\\x7d\\xc9\\x42\\xfe\\xe8\\x31\\xf1\\xbd\\xff\\x2c\\x3e\\x77\\x8f\\x31\\x2b\\x8b\\x62\\x82\\x61\\xfc\\x44\\x86\\x6f\\xc6\\x76\\xbe\\xf1\\x16\\xc6\\x37\\xde\\xa6\\x03\\x7e\\x68\\xa1\\x30\\x9a\\x70\\x31\\x1d\\xe8\\xf3\\x96\\xcc\\x08\\x53\\xfa\\xe2\\x18\\x32\\x61\\x08\\xc3\\x94\\x65\\x97\\xe1\\x2a\\x9c\\xab\\xfa\\x38\\x59\\xbd\\x4b\\xbd\\xf0\\x3e\\x91\\xb4\\x6e\\xe5\\xc6\\xb5\\x4e\\x39\\xf6\\x6f\\x6e\\x46\\xeb\\x3d\\x59\\xf9\\xaf\\x61\\xb9\\x8a\\x8a\\x8c\\xde\\xf1\\x19\\xbd\\x63\\x49\\x0a\\x9d\\x7f\\x49\\x9e\\x49\\x3c\\x2f\\xb6\\x25\\x29\\xd8\\xc0\\x78\\xe9\\x90\\xac\\x15\\xc9\\xd1\\xaa\\x03\\xd9\\xfe\\x4b\\xcb\\x44\\x02\\x32\\xcc\\xce\\xb4\\x65\\xb0\\xc6\\xdb\\x28\\xc8\\x66\\x0d\\x65\\x47\\x5a\\x71\\xf8\\xd3\\x44\\xd6\\x19\\x99\\x71\\x39\\x66\\x7f\\x9a\\x98\\xa3\\xcc\\xce\\xcb\\x0e\\xc6\\x52\\x62\\x94\\x9b\\x39\\xd1\\x6a\\xa3\\xee\\xdb\\x4c\\x8d\\x3a\\x28\\x08\\x2c\\x55\\x61\\x67\\x78\\x26\\x2e\\x87\\x30\\x8e\\x54\\x32\\xdc\\xe5\\x18\\x46\\x83\\x5b\\x5e\\x8b\\x97\\xe0\\x79\\x12\\x2e\\xc7\\x4b\\xd5\\x7d\\xf9\\x92\\x7a\\xd1\\x2b\\xea\\xc5\\x52\\xbe\\x48\\x8e\\xbe\\x25\\x54\\xff\\x31\\x06\\x93\\xdc\\x6a\\x3c\\xba\\x5b\\x88\\x61\\xeb\\x15\\xea\\xa8\\x36\\x7e\\xeb\\x72\\xda\\x78\\x82\\x9c\\x76\\x14\\x4e\\x8b\\xee\\x11\\x33\\x62\\xa9\\x58\\x40\\x76\\x11\\x8e\\x45\\x84\\xc6\\x4c\\xa7\\x14\\xde\\x94\\xed\\x52\\x1d\\xe5\\x0c\\x1a\\x98\\xb8\\x8e\\x90\\x98\\xbc\\x52\\x7f\\x78\\xac\\x10\\xf9\\x83\\x7f\\x8c\\xe1\\xbf\\xc0\\x63\\x85\\xd4\\xce\\x4e\\xd3\\x0e\\x8b\\x81\\x3f\\xcd\\x61\\x59\\xfe\\x32\\x87\\x25\\x58\\xda\\x72\\x58\\xa1\\x20\\x8b\\x08\\x42\\xc1\\xe3\\x72\\x58\\xd3\\x70\\x34\\xda\\xd0\\x81\\xe3\\xd5\\xad\\xea\\x4f\\xea\\x2f\\x2a\\xc1\\xf0\\x43\\x1b\\x6e\\xdd\\xfc\\xe8\\x2d\\xb7\\x3c\\xc0\\x4d\\x40\\x09\\x2d\\x78\\xa6\\x7a\\xaf\\xfa\\x9b\\xfa\\x87\\xfa\\xab\\x7a\\x1f\\x9e\\x81\\xd6\\xad\\x1f\\x7f\\xbc\\x15\\x8d\\x8f\\x7e\\xbc\\x77\\x0b\\xb4\\xf9\\x82\\x43\\x2c\\x5f\\xe1\\x86\\x01\\x19\\xcd\\xca\\xfa\\x81\\x94\\xc9\\x02\\xd4\\x5b\\x9b\\x3a\\xbb\\x04\\x4b\\x8c\\x7a\\x05\\x07\\x75\\xc9\\x19\\xaf\\xa0\\xb8\\x2d\\x72\\x9b\\x1b\\x8e\\x01\\x75\\xc0\\xa1\\x5c\\xcc\\xba\\xe0\\xb5\\xdc\\xa0\\xa3\\x18\\x54\\x0f\\x1c\\x55\\x0f\\x60\\xf0\\xa2\\x4b\\x2f\\xf9\\x9b\\x7a\\x40\\x24\\x1a\\xbc\\xf3\\x8e\\xda\\xfa\\x23\\xf7\\xd3\\x55\\x67\\x9d\\x7d\\x0d\\xe3\\x95\\x57\\x9c\\x27\\xee\\x04\\x37\\x84\\x60\\x14\\x24\\x65\\xca\\x2b\\x7f\\x96\\x57\\x85\\x94\\x57\\xc5\\xac\\x03\\x1e\\x47\\x9a\\x78\\x9c\\x4a\\x5e\\x86\\x57\\x61\\x8c\\x28\\x79\\x1e\\xd9\\x95\\xb4\\x0b\\x32\\x85\\xc6\\x46\\x59\\xb1\\xd8\\xa8\\x59\\xf4\\xcb\\xb2\\x4b\\xa1\\x52\\xd4\\x81\\x7f\\x2c\\x71\\x5f\\xaa\\xa3\\xba\\x93\\x73\\xf1\\xf4\\x31\\x3f\\xbd\\xa8\\xfe\\xd1\\xe3\\xfc\\xbe\\xa7\\x62\\xe5\\x95\\x07\\xc7\\x7d\\x77\\x97\\xea\\xf6\\x1e\\xc7\\x4e\\xc6\\x4b\\xd1\\x25\\x12\\xc8\\x83\\x30\\xcc\\xcc\\x48\\x9b\\x33\\xae\\xb3\\x33\\xcc\\xa7\\x53\\xb9\\x01\\xc6\\xce\\x5c\\xca\\x4e\\x1d\\x21\\xe4\\xd1\\x90\\x31\\x46\\xf2\\xf4\\xa8\\xb1\\x28\\xc6\\xf4\\x5d\\xd4\\x41\\x82\\xd5\\x43\\xb1\\x81\\x4c\\x89\\xc9\\x05\\x1d\\xf1\\x04\\x18\\xe2\\x09\\xb7\\xb3\\x3a\\x83\\x78\\x0a\\xd0\\xe3\\xf3\\x7b\\x43\\xdd\\x91\\x4d\\xdc\\x84\\x72\\x31\\xde\\xc6\\xfa\\xd2\\xdf\\x31\\x77\\xf9\\xb2\\x2b\\x96\\x86\\xba\\xa8\\xef\\x75\\xc9\\x59\\xb1\\x40\\xfd\\xf6\\xd8\\xdf\\x2e\\xbc\\x70\\xb9\\xaa\\x89\\xe4\\x8b\\x37\\x96\\xde\\x17\\x2b\\x4b\\xae\\x3e\\xb7\\xcf\\x55\\x41\\x6f\\xf0\\xd6\\x81\\x67\\x2d\\xbc\\xb0\\xf5\\x59\\xbe\\x7c\\xfe\\xbc\\x39\\xcb\\x75\\x5f\\x36\\x45\\x3b\\x2c\\xbc\\x20\\xee\\x84\\xca\\xf6\\x1c\\x9e\\xb9\\x53\\x0e\\x4f\\xa6\\x94\\xe5\\x9b\\xd3\\xc9\\x7c\\x99\\x1e\\xcb\\xcf\\x31\\x75\\x9a\\x07\\xac\\xe8\\x30\\x0f\\xd8\\x61\\xb6\\xcf\\x9b\\x99\\xed\\xe3\\x18\\x3a\\x27\\x46\\x39\\x29\\x5a\\x8a\\xe9\\xe0\\x95\\xba\\x48\\x38\\x01\\x4a\\xbe\\x28\\xbb\\x9a\\xed\\xde\\xd2\\x0a\\x7d\\x0e\\xa6\\xc3\\xf4\\x5e\\x05\\xd6\\xd6\\x94\\xc4\\x7b\\x74\\x02\\x49\\x99\\xe9\\x3d\\x21\\x5c\\x46\\x8d\\xf0\\x14\\x0e\\xf3\\x37\\xad\\x5f\\x71\\xe9\\x8a\\x5b\\xd4\\x63\\xea\\xbf\\xb1\\xfa\\xc8\\x8f\\xb7\\xdd\\xcc\\xa9\\x5f\\x5d\\x7d\\xd1\\x05\\x97\\x5f\\xb3\\xf9\\xa7\\xff\\xaa\\x7b\\x7f\\xfe\\x5e\\x79\\x0c\\xff\\x29\\xad\\xba\\x70\\x56\\xd3\\xf8\\x79\\x95\\xc3\\xff\\xd5\\xdc\\xfc\\x05\\x5e\\xfe\\xb7\\x94\\x24\\x49\\x73\\x2f\\x99\\x3f\\x76\\xd8\\x99\\xb5\\x03\\xf7\\x35\\x3f\\xf7\\x11\\x5e\\xb4\\xe2\\x7d\\xbd\\xc2\\x26\\x1f\\x40\\x58\\xce\\xb0\\x75\\x3d\\x24\\xa5\\x8e\\x39\\x19\\xc2\\xc7\\x58\\x68\\x2c\\xb5\\x50\\x3d\\x48\\x8a\\x2c\\xe3\\x2a\\xf2\\xa6\\x48\\x52\\x12\\x59\\x1e\\x16\\x4c\\x91\\x0e\\xd1\\x24\\x35\\x62\\xf9\\xc2\\x14\\x75\\x8e\\xba\\x4f\\x78\\xeb\\xe0\\xc1\\xa3\\xd5\\xc2\\x5b\\xb4\\xfd\\x95\\xda\\x61\\xd1\\xc8\\xec\\x69\\x1d\\xe8\\xc1\\x94\\x94\\xb1\\xcd\\xc4\\xdc\\x66\\x4e\\x69\\xdc\\xcd\\x3b\\x69\\x63\\x2c\\xaf\\x42\\x0d\\xa8\\x89\\xd7\\x21\\x24\\x15\\xef\\x90\\xdc\\xee\\x8c\\xa8\\xa4\\xaf\\xc4\\xd2\\x3b\\xae\\xbe\\xe6\\x2e\\x2c\\x55\\x9f\\x57\\xff\\x50\\x8f\\xaa\\x2f\\xe2\\xb7\\xfc\\xab\\xc7\\xea\\x6f\\xbc\\x61\\xfd\\x4d\\xf4\\xf7\\x37\\xf5\\xdf\\x68\\xa6\\xcf\\x36\\x00\\x88\\x4e\\x86\\x8b\\xfa\\xe8\\x28\\x30\\x09\\xf4\\xb9\\x52\\x3c\\x8b\\x85\\xd0\\x97\\x26\\xe8\\x54\\x24\\x6a\\x18\\x7d\\x7a\\x6c\\x2e\\x21\\x95\\x4a\\x13\\x95\\x4a\\x30\\x65\\x13\\x4f\\x21\\xf4\\xc7\\xeb\\x68\\xb0\\x60\\xc0\\x1a\\xec\\xe5\\x92\\x64\\x2a\\x88\\xaa\\xac\\xbe\\x2f\\x92\\xa3\\xef\\x8d\\x1e\\x29\\x44\\xa9\\x23\\x46\\xc8\\x01\\x90\\x8e\\x8a\\x04\\x1c\\x70\\x53\\x86\\x56\\x8b\\x3d\\x1e\\x67\\x0f\\x4d\\x0a\\xa2\\x31\\x1e\\x8f\\xb3\\xa4\\x28\\x7d\\xb0\\x87\\x3d\\x98\\xfa\\x0e\\x93\\x27\\xad\\xc8\\x7a\\xa8\\xd8\\xe7\\xb9\\x1f\\x0a\\xd8\\x9c\\xbc\\xd0\\xdd\\x4e\\xf8\\xed\\x8a\\x2d\\xef\\x77\\x91\\xd8\\xb7\\x3f\\xbb\\x63\\xe4\\x0f\\xc0\\x8e\\x5b\\xba\\xdb\\x89\\x75\\xbb\\x22\\x59\\x7e\\x17\\x89\\xb8\\x9d\\x87\\x66\\x5e\\xb2\\xda\\x58\\x10\\xf9\\x34\\x2f\\x88\\x92\\xc5\\x6a\\xb3\\x77\\x98\\x36\\x57\\x8c\\x94\\x16\\xb3\\x43\\x37\\xb2\\x21\\xb7\\x1f\\xe3\\x18\\x77\\x87\\xa8\\x57\\xc5\\x50\\x0e\\x16\\xbe\\x23\\xa1\\xfc\\x21\\xba\\xa5\\xb7\\xb1\\x40\\x7d\\x4c\\xfd\\x49\\xfd\\x4d\\x52\\x7f\\x53\\x7f\\x12\\xc9\\xb1\\x00\\xf2\\x5f\\x1f\\xcb\\xe3\\xbf\\xfe\\x63\\x0c\\xff\\xd2\\xb1\\x7e\\xba\\xae\\x14\\x01\\x88\\x06\\xe6\\x67\\xca\\xda\\xfd\\x3a\\xd7\\xee\\x67\\x18\\xd8\\x51\\x38\\xea\\x47\\x04\\x33\\xf3\\x23\\x26\\xe6\\xc1\\xd9\\x7f\\x45\\xf8\\x9c\\x3a\\x06\\x9b\\xd0\\x86\\x32\\x8e\\x57\\xc7\\xe0\\xeb\\xea\\x26\\xf5\\x90\\x7a\\x88\\xfb\\x94\\x7b\\xb7\\xf5\\x18\\x27\\xb4\\x76\\x6f\\x2d\\xe6\\x6c\\xad\\xbf\\xd0\\xe7\\x88\\x99\\xe7\\x98\\x20\\x96\\xc9\\x11\\xb2\\x31\\x13\\xf4\\x31\\xd3\\x53\\x84\\x6c\\xa0\\x0c\\x46\\xea\\xb2\\x38\\x36\\x50\\x46\\xe6\\xcc\\xd8\\x40\\xd1\\x98\\x4e\\x0e\\xc9\\x22\\x36\\x60\\x5f\\x09\\xfb\\x62\\x83\\x6a\\x55\\xf7\\x8b\\xa4\\x75\\x26\\xb7\\xe9\\xd8\\x18\\x15\\x38\\x07\\x20\\x8c\\xcc\\xc8\\xbc\\x09\\xba\\x67\\x7d\\x7c\\xd6\\x12\\xf3\\x3a\\x50\\x66\\x68\\x58\\x31\\x50\\xb3\\x84\\x09\\x45\\xa0\\xb2\\x28\\x51\\x9a\\x6a\\x31\\x54\\x1b\\xf2\\x62\\xc8\\x3b\\x92\\x4b\\xb5\\x8e\\x14\\xfc\\xad\\x43\\xb9\\x5d\\xb7\\x0b\\x75\\x07\\x6f\\x3e\\xba\\x23\\x83\\xc5\\x57\\xa8\\x84\\xeb\\x2a\\xdd\\x09\\x06\\x2a\\xef\\xac\\x49\\xce\\x94\\x26\\x86\\xa8\\x22\\x9a\\xb2\\x99\\xa6\\x94\\xc1\\xc9\\xd6\\x16\\x70\\x31\\xaa\\x58\\xd9\\x3d\\x3e\\x96\\x55\\x26\\x39\\xe4\\x0d\\xcb\\x71\\xef\\x0a\\x4c\\x5e\\x7f\\xbd\\x4a\\x0c\\x87\\x3f\\xfa\\x7d\\xe7\\x47\\xac\\x6d\\x4e\\x5b\\xcd\\xaf\\xce\\xce\\x31\\x41\\xe7\\x39\\x26\\x3a\\xae\\x1c\\x86\\xb8\\x19\\xea\\x67\\x22\\xf9\\xfd\\x3d\\x76\\xbd\\x4d\\x25\\xf8\\x22\\xeb\\x4b\\x83\\x3e\\x6f\\xa8\\x08\\x7a\\x5f\\x20\\xd3\\x17\\x43\\x0b\\xe1\\x63\\x29\\x49\\xef\\x80\\xe4\\x54\\xd0\\x91\\x26\\x18\\x25\\x92\\x33\\xdb\\x29\\x43\\x36\\x5f\\xe4\\x8f\\xcb\\xe1\\xda\\x90\\x1c\\xb2\\xad\\x5f\\x8f\\x49\\x75\\xd4\\x4a\\xa9\\xd7\\x47\\xff\\xf5\\xd2\\x67\\x54\\x70\\x7b\\xf9\\xd3\\x19\\x2f\\xdb\\xe6\\xbd\\x32\\xec\\xab\\xaa\\x76\\x63\\x1c\\xc3\\x7c\\x79\\xd8\\xc0\\x57\\x60\\xe4\\x7d\\x8c\\x1c\\x7a\\xd0\\x28\\x19\\xee\\xe3\\xf6\\x72\\x1f\\xb6\\x76\\xc5\\xbb\\x8b\\x8b\\xd5\\xd9\\xd9\\xb5\\x46\\xa5\\xfc\\x0d\\x2c\\xc2\\xce\\xcb\\xe2\\x37\\x93\\x3e\\xff\\xd6\\x81\\xc0\\x78\\xc8\\x1b\\x42\\x7e\\xfd\\xb1\\x65\\x9f\\xb0\\x7b\\x46\\x0a\\xcf\\x73\\x43\\xc5\\x57\\x41\\x80\\x22\\xd0\\x3d\\x90\\x20\\xa4\\xdb\\xa6\\x84\\x9d\\x60\\x6a\\x9f\\x0b\\xae\\x0b\\xb9\\xc3\\x23\\x39\\xac\\xdd\\x79\\x44\\xdc\\x2e\\xa9\\xff\\xd6\\x71\\x41\\x9d\\x76\\x58\\x70\\x08\\xa3\\x20\\x0c\\xdd\\xe1\\x82\\xcc\\xcc\\x3c\\x0b\\x7f\\xcb\\x4d\\xe9\\xa4\\x1b\\x21\\xa2\\x18\\x8d\\xe9\\x14\\x5f\\x11\\x72\\x53\\xc0\\x6a\\x4f\\x23\\x89\\x32\\xcd\\x2d\\x71\\xa4\\x49\\x89\\x53\\xe9\\x86\\x11\\x45\\x28\\x8c\\xc5\\x14\\xbf\\x23\\xad\\x54\\x61\\x44\\x29\\xa1\\xb0\\xce\\x6a\\x73\\x50\\x3b\\xdf\\x4d\\x4e\\x5a\\xdc\\x21\\xba\\xe5\\x77\\xb1\\xd9\\x77\\x3e\\x24\\xbb\\x14\\x7f\\x21\\xf3\\xdf\\x49\\x8b\\xc3\\x97\\xc8\\x24\\x81\\x7b\\x65\\x67\\xa1\\x4a\\xcb\\x6b\\x6a\\x6b\\xea\\xd8\\x34\\xbc\\xec\\xf1\\xf9\\x43\\xdd\\x51\\x4f\\xdf\\x64\\x13\\xa2\\xe1\\x62\\xa9\\xee\\xb7\\xc3\\xf7\\x37\\x8d\\x19\\x32\\x52\\xfd\\x1a\\x57\\x5c\\xfa\\xe6\\x8e\\x9f\\xfd\\xb9\\xea\\x3e\\xa7\\x5f\\xac\\xfc\\xfb\\xbc\\x47\\xb7\\x61\\xf8\\xb4\\xbe\\x23\\x57\\x7a\\xef\\x9f\\x3e\\x03\\xab\\x37\\x3d\\x71\\xfa\\xa8\\xd3\\x07\\xf7\\x41\\xc9\\x60\\xb8\\xfc\\x8c\\x39\\x3b\\x9f\\x52\\xfb\\x8f\\x58\\x33\\xa0\\xb4\\x29\\x32\\x7a\\xfe\\x13\\xf7\\xf6\\x18\\x30\\x22\\xf6\\x8f\\xe9\\x8c\\xfe\\x25\\xda\\x61\\xa1\\x41\\xca\\x01\\x19\\x8a\\xb2\\x48\\x37\\x69\\xa3\\xf4\\x7b\\xf9\\x74\\x52\\xa2\\xf4\\xe7\\xd3\\x0d\\x36\\x77\\x25\\x21\\xf5\\x7b\\x41\\x46\\xbf\\x4b\\x0f\\x74\\x5c\\x4e\\x25\\x07\\x23\\x14\\x2e\\xb1\\xc9\\x08\\x17\\xd5\\x14\\x67\\x82\\xe4\\xc8\\x8a\\xc4\\xe0\\x89\\x57\\x3f\\xa0\\x48\\xf9\\x19\\x1b\\x4a\\xc1\\x36\\x9b\\x67\\x90\\xd9\\xf4\\x49\\x59\\xb9\\xc1\\x9d\\xc9\\xfc\\xea\\xf9\\xbb\\x25\\x18\\x8e\\xae\\x9e\\xf0\\xaf\\x8f\\x3e\\xda\\x73\\xc6\\xf5\\xd5\\xbe\\xae\\x81\\x33\\x07\\x2f\\x9d\\x32\\x7d\\xc9\\xa0\\x33\\x02\\x52\\x4e\\xeb\\x13\\xfd\\x1b\\xd5\\xd7\\xd5\\x56\\xef\\xcf\\xea\\xa7\\xa3\\x47\\xac\\xc1\\x78\\x75\\xcd\\xa6\\x9b\\xbd\\x1b\\x9f\\x49\\xd4\\x02\\x42\\x5f\\xed\\x30\\xff\\x3d\\x1b\\xc7\\x3f\\xcb\\x5f\\x60\\xe7\\xfc\\x85\\xf5\\x4f\\xf3\\x17\\x72\\xe7\\xfc\\x85\\x90\\xcd\\x5f\\x98\\x0b\\x12\\xfa\\x3a\\x13\\x88\\xc7\\xfc\\x3e\\x43\\x9b\\x6b\\x2e\\xc0\\xf6\\xfc\\x85\\xc7\\x20\\x19\\x8a\\xa1\\x2f\\x8a\\x3f\\xbf\\x7e\\xd1\\x0a\\xe4\\xd4\\x7f\\x4f\\x1b\\x7b\\xfe\\x99\\x67\\x5e\\x30\\xea\\x0c\\x34\\xf1\\x17\\x5f\\xfe\\xfc\\xcf\\xea\\x1f\\x9c\\xad\\xf0\\x07\\xac\\x59\\xb6\\x28\\x29\\x49\\xd2\\xf8\\xc5\\xa9\\xf5\\x85\\x37\\x29\\x53\\x47\\x48\\xa2\\x78\\xd7\\x82\\x45\\x88\\x31\\x36\\x26\\x03\\xb5\\xc3\\x82\\xab\\x7d\\x4c\\x28\\x9e\\xd6\\xdd\\x08\\x1d\\x13\\x21\\x3b\\x26\\x02\\x1b\\x13\\xc1\\xd8\\x79\\x4c\\xf4\\x01\\x21\\x86\\x58\\xdb\\x98\\xe4\\xb8\\xa8\\x2d\\x76\\x24\\x12\\xc4\\x2c\\x13\\x2b\\x1d\\x13\\x8b\\x9e\\x2e\\x14\\xf2\\xb3\\x91\\x74\\xad\\x93\\x65\\x07\\xe5\\x90\\x1c\\x2e\\xef\\x98\\x80\\x97\\xf5\\xc8\\x7a\\xe0\\xfe\\xd7\\xc7\\xae\\xaa\\xc6\\xd2\\xa3\\x39\\xf1\\x6b\\xa7\\xbc\\xb6\\x1f\\xc3\\x33\\x16\\xf4\\x3b\\xa3\\xb0\\x70\\x7a\\xdf\\x73\\x67\\xa3\\xe6\\x45\\xc0\\xfa\\xc6\\xfe\\xdc\\xd8\\xdf\\xbf\\xb9\\x72\\xf8\\x28\\x2c\\xf9\\x71\\xfd\\xfd\\xf1\\x6a\\x7c\\x33\\x9e\\x78\\xe1\\x1f\\x94\\x96\\x91\\xda\\x61\\x81\\x13\\x46\\x41\\x2e\\x14\\xc3\\x38\\x48\\xfa\\x29\\x19\\x4e\\x1a\\x95\\x62\\x26\\x53\\x16\\xb0\\xfa\\x45\\x5b\\x44\\x09\\x88\\x69\\x24\\xe1\\x28\\xc9\\x6f\\x51\\xcc\\x9e\\x74\\x32\\x9f\\xad\\x28\\xc8\\xa7\\xd0\\xa2\\x84\\xca\\x57\\xbe\\xec\\x52\\xdc\\x1e\\x2a\\x51\\x4e\\xbf\\xec\\x22\\x9e\\x04\\xb1\\xca\\xc4\\xcd\\xfa\\xde\\x83\\xea\\x4b\\x3c\\xe6\\x2a\\xc0\\x90\\x81\\x89\\x12\\x4b\\x68\\x16\\x03\\xfa\\x43\\xba\\x56\\x8d\\xc4\\x2b\\xaf\\xdc\\x87\\xdc\\x27\\x3f\\xb7\\x5e\\xc4\\x19\\x2f\\x5b\\x38\\xf3\\xf2\\x11\\xa3\\x07\\xb4\\xac\\xfe\\x56\\xfd\\x06\\xbb\\xf3\\x38\\x6f\\xe2\\xa4\\xb1\\x67\\xa0\\xda\\xe5\\xa7\\xbb\\xee\\x54\\xff\\x7b\\x70\\x93\\x74\\xee\\xba\\xf2\\x6e\\xa9\\x1e\\x43\\xb0\\x02\\x2f\\x10\\xf3\\xa6\\x2f\\xbe\\x98\\xad\\xbb\\x00\\xe0\\xbe\\x93\\x2a\\xc1\\x0f\\x93\\x20\\xe9\\x63\\xd8\\x08\\x21\\x42\\xe4\\xb8\\x02\\x86\\x34\\x71\\xc7\\x88\\x2d\\xaa\\x27\\x1e\\x73\\xa2\\xc4\\xc7\\xd6\\x45\\x78\\x1d\\x69\\xe2\\x8c\\x75\\x58\\xa7\\x97\\xf4\\x79\\x99\\x24\\x52\\x82\\x72\\xa9\\x4f\\xb1\\x21\\x4b\\x3e\\x12\\x49\\x26\\x26\\x46\\x46\\x5c\\x5f\\x7e\\x93\\x99\\x8c\\x2b\\x40\\x7d\\x0a\\x34\\x70\\xef\\xbb\\x2f\\x94\\x8e\\xec\\x9e\\x9b\\x53\\x59\\x38\\x64\\xe8\\x87\\x1f\\xaa\\xfb\\xf8\\x85\\x6f\\xae\\x7c\\x6a\\xa7\\xc5\\xbc\\x57\\x90\\x46\\x0d\\x5d\\xf9\\xe6\\xb1\\xbf\\xf3\\x0b\\x75\\x99\\x51\\x87\\x0b\\x1e\\x61\\x14\\x14\\x40\\x04\\x96\\x64\\x72\\xf0\\x21\\x3e\\x9d\\x34\\x22\\x64\\x64\\xbf\\x0b\\x9f\\xa6\\x1d\\xf5\\x58\\xd3\\x48\\x2a\\x98\\xbc\\x14\\x3a\\xd2\\xa4\\xd0\\xa9\\xf8\\x31\\x42\\x4a\\x74\\x79\\xa9\\xc4\\x88\\x52\\x48\\x7d\\xb7\\x53\\xa6\\x56\\x4b\\x6e\\x16\\x3c\\xb6\\x40\\x26\\x68\\x35\\x24\\x40\\x09\\x78\\x64\\x17\\x91\\x13\\x4a\\x17\\x9b\\xec\\x22\\x39\\xd4\\x8c\\x75\\x12\\xa0\\xba\\x38\\xcb\\x12\\x9c\\x7c\\x36\\x27\\x2b\\x4c\\x9f\\xbd\\x3e\\x75\\x5d\\xb5\\xff\\x98\\x7a\\xf8\\x3f\\x4d\\xdb\\x46\\xf5\\x18\\x78\\x6d\\xd3\\xca\\xa5\\x55\\xab\\xc6\\xbf\\xf6\\x19\\x96\\xcc\\x58\\x30\\x70\\x7a\\x7e\\xfe\\xf4\\xfe\\x6d\\x62\\xd5\\x34\\x62\\xdd\\xd1\\x37\\xde\\x3b\\x54\\x59\\xfe\\x71\\x30\\x34\\xe7\\x9c\\x59\\x7d\\x1a\\xb0\\xf4\\x87\\xf5\\xf7\\x57\\x47\\xb1\\xa5\\xba\\x07\\x15\\x2f\\x40\\x38\\x1b\\x40\\xc8\\x91\\x72\\xc0\\x0d\\x23\\x33\\x78\\xc4\\x1c\\xd7\\xed\\x16\\xd5\\x75\\xc9\\xd1\\x6e\\xb7\\x3c\\x6d\\xba\\xce\\xc5\\xa8\\xba\\x5b\\x32\\x76\\xcb\\x4b\\xc3\\x60\\x37\\xf3\\xec\\xa0\\x48\\x8e\\xe3\\xec\\x94\\xcf\\x2b\\x87\\xf4\\xe8\\xc9\\x20\\x9f\\x8d\\x25\\xf1\\x0d\\x53\\x1e\\x79\\x49\\xdd\\x37\\x79\\x52\\xef\\x69\\x85\\x52\\x4e\\xeb\\x3f\\x86\\x8d\\x3b\\x78\\xb8\\xf5\\x52\\xee\\xca\\x4b\\xcf\\x8e\\x94\\x1f\\x3b\\x04\\x1c\\x5c\\x06\\x80\\xf7\\x4b\\x39\\xfa\\x3a\\xd9\\x6c\\x06\\x87\\x4a\\x8b\\xd0\\xd1\\xf5\\xff\\xf9\\x24\\x53\\x6d\\xc8\\x7b\\x99\\x3e\\xc9\\x24\\xd4\\x1f\\x7d\\x55\\xec\\xf3\\xc9\\x27\\xcc\\x4f\\x69\\x1b\\xd5\\xe1\\xb8\\x45\\xca\\x01\\x07\\xb8\\x21\\x0e\\x6c\\x58\\xe9\\x68\\x0a\\x96\\x34\\x11\\x9c\\x0c\\xa6\\x3b\\xa3\\x8a\\x6c\\xd2\\x03\\x58\\x43\\x0b\\x71\\xb2\\x01\\x25\\xae\\x58\\x26\\x9d\\xc9\\xeb\\x43\\xc2\\xb0\\xb3\\x14\\x2e\\x2e\\xa3\\x50\\x7d\\x96\\xdd\\xdf\\x3d\\xaf\\x57\\x03\\x96\\xee\\x4e\\x75\\x19\\xf0\\x4f\\x2c\\x55\\xa7\\x7d\\x26\\x49\\xe3\\x4e\\x17\\x66\\x1d\\xdd\\xf8\\xc2\\x5b\\x46\\xe9\\xbb\\xbd\\x7b\\x75\\xbf\\xbc\\x04\\x40\\x38\\x43\\xca\\x01\\x6b\\x76\\xd6\\x8c\\x62\\x3e\\xaa\\xc0\\x27\\xcb\\xde\\x88\\x2c\\x85\\x60\\x4e\\x64\\xf3\\x37\\xee\\x4c\\xfe\\x66\\x09\\x96\\x9c\\x76\\x14\\x9b\\xd4\\x87\\xf0\\x06\\x55\\x51\\x3f\\x18\\x23\\xe5\\x1c\\xbb\\x16\\x6f\\x53\\x7d\\xad\\x04\\x77\\xaa\\xbd\\xd8\\x73\\xda\\x79\\x97\\x0f\\x6d\\x6e\\xff\\xe4\\x69\\xaf\\xcb\\xb0\\x44\\xca\\xf9\\xfd\\x9b\\xb6\\xfe\\x49\\x17\\x0b\\xa3\\xa0\\x14\\x16\\x66\\x70\\x83\\x33\\x3f\\x1e\\x67\\x6c\\x67\\xa2\\x40\\xac\\x71\\xaa\\x0b\\xc4\\x1b\\x43\\x52\\xc6\\x1a\\x2c\\x75\\xa4\\x15\\x4e\\x4e\\x93\\x52\\x27\\xcb\\x42\\xb0\\x0c\\x3c\\x5b\\xc3\\xa9\\x38\\x1d\\x69\\xa5\\x1c\\x23\\x4a\\x29\\xc7\\x04\\x41\\xc9\\xa7\\x0e\\xcc\\x94\\x20\\xb2\\xac\\x58\\xbd\\xd4\\xfe\\x60\\xa8\\x63\\x8a\\xc4\\xcf\\x64\\xc4\\x7f\\x9c\\xa4\\x78\\x3a\\x4a\\xcd\\x12\\x74\\x58\\x6b\\xee\\x3e\\x6b\\xfe\\x86\\xb2\\xd8\\x3d\\x0b\\xee\\x79\\x46\\xdd\\x37\\x66\\x74\\xdf\\xa9\\x01\\x4e\\xdd\\x3f\\x66\\x4c\\xaf\\xc9\\x05\\x42\\xfd\\x0d\\xa3\\x26\\x4c\\x9b\\x3e\\x71\\xd6\\xfe\\xcf\\x5b\\x97\\x72\\x37\\xfe\\x6d\\x46\\x5d\\xb5\\x3b\\x60\\x6f\\x4d\\x70\\x37\\xae\\x9c\\x5d\\xd9\\xf5\\xd8\\x61\\x4a\\xdf\\xb9\\x00\\x42\\x9e\\x30\\x0a\\xdc\\x30\\xaa\\x5d\\xc6\\xdb\\xa8\\xa3\\x82\\xde\\x41\\xba\\x15\\xce\\x95\\x3e\\x5e\\xbc\\xdd\\x3a\\x31\\xc4\\x22\\x33\\x21\\xc7\\x0e\\x42\\x7e\\x7c\\xd7\\xe5\\x73\\xd1\\x69\\xeb\\xb1\\x71\\xd6\\x03\\xdb\\xd4\\x4f\\x26\\x4d\\xae\\x9f\\x56\\x24\\xd4\\xdf\\x39\\x6e\\xda\\xbf\\xf6\\xb5\\x4e\\xe3\\xee\\x5f\\x38\\x35\\x1a\\x39\\xf6\\x03\\xb4\\xf9\\xa8\\x06\\x61\\xd4\\x89\\x39\\x1f\\xfc\\xdf\\xd6\\x2d\\x31\\x6f\\x0a\\x05\\xc8\\x56\\x1d\\x94\\x76\\x5a\\x95\\x39\\x10\\xed\\x3f\\xfc\\x88\\x4e\\xf5\\xa7\\x1f\\x7e\\x54\\x7f\\xc2\\xf0\\xfc\\xf3\\x97\\x9e\\x7d\\xce\\xb2\\xa5\\x67\\x73\\x2e\\xef\\xcf\\x58\\xab\\xee\\xf9\\xc5\\xfb\\xab\\xfa\\x26\\xc6\\x7f\\xdd\\xd0\\x9c\\xfa\\xbb\\xf7\\xc6\\xa7\\x9e\\xbe\\x41\\xc7\\x33\\xea\\x0c\\xd6\\x2f\\xea\\x3b\\xa7\\x42\\x3b\\x94\\x69\\x67\\x57\\x3e\\x9f\\x26\\x10\\xcd\\xfa\\x4c\\x99\\x29\\x09\\x91\\x3b\\xe3\\x18\\x19\\x74\\x86\\xe5\\xc8\\x8a\\x4d\\x62\\x38\\xc6\\xa6\\xe3\\x18\\xcc\\xe2\\x18\\x77\\x86\\x75\\x6d\\x38\\x26\\x17\\x8f\\xc3\\x31\\x06\\xb9\\xea\\xea\\x29\\xaf\\x7f\\xfa\\xe9\\x6b\\x13\\xae\\x8c\\x06\\xa6\\x0f\\x3a\\x67\\xf6\\xbc\\xb3\\x07\\x4c\\x0f\\xa8\\x33\\xc4\\x8f\\x2f\\x1f\\x32\\x52\\x7d\\x55\\x03\\xef\\x8f\\xea\\xbe\\x7e\\x7d\\x5a\\x7f\\xe7\\x5e\\xef\\x5e\\xf5\\xd0\\x7a\\xef\\x3f\\x5e\\xe8\\x11\\xcb\\xf0\\x56\\x9d\\xc1\\x30\\x69\\x86\\x86\\x36\\xd7\\xdf\\x6e\\xcb\\x29\\x0d\\x96\\xe8\\x71\\x7e\\xdf\\x82\\x11\\x92\\xd3\\xee\\xf7\\x2d\\x1d\\xfd\\x3e\\x35\\xde\\x5e\\x87\\xee\\xf7\\x8d\\xc7\\xfb\\xfd\\x3a\\xaa\\x51\\x27\\xf7\\xfb\\x53\\xd6\\x56\\x07\\xfe\\xab\\xee\\xab\\xba\\x62\\x9c\\xee\\xf7\\x1b\\xa6\\x15\\x14\\x4c\\xed\\xd7\\x66\\xa0\\x47\\x0f\\xbb\\xea\\x8f\\x32\\x4e\\xec\\xdd\\x97\\xfa\\xfd\\x87\\xaa\\xba\\xe3\\x81\\xaa\\x9a\\xed\\xff\\xc8\\xe8\\x24\\xb7\\x4b\\x18\\x05\\x0e\\x2a\\x1d\\x6d\\x56\\x50\\x1f\\x01\\x0b\\x45\\xe8\\xce\\xec\\xac\\x18\\x55\\x44\\xa6\\x7a\\x0e\\x5d\\x4a\\x41\\x41\\xcb\\xf1\\xf2\\xe9\\xe7\\xcb\\x33\\xaa\\x64\\x2b\\xbb\\x70\\xb4\\xaf\\xd4\\x5d\\x74\\x6e\\xff\\xf1\\x3e\\xa1\\xfe\\x9e\\x09\\x67\\x1a\\x44\\xb5\\x95\\xef\\x51\\xdd\\x5a\\xaa\\xdb\\x82\\x06\\xed\\x30\\xff\\xbe\\x30\\x0a\\x2a\\x61\\x65\\x36\\x97\\x23\\x75\\xce\\xe5\\x30\\xfe\\x49\\x6d\\xb9\\x9c\\xdc\\x0e\\xb9\\x1c\\x77\\xa7\\x14\\x8e\\x3b\\xad\\x78\\xfd\\xb1\\xf6\\x25\\xdb\\x49\\xde\\xca\\xe9\\xb9\\xb7\\x66\\xd1\\x22\\x17\\x53\\xb7\\xf8\\x67\\x99\\x9c\\x42\\xec\\xb8\\x50\\x9b\\xc2\\xc5\\x13\\x33\\x39\\x52\\x58\\x2a\\x2f\\xab\\xad\\x69\\xe0\\xd0\\xc2\\x2f\\x98\\x38\\x76\\xc2\\xf4\\x4b\\xb7\\xbf\\x7c\\x78\\xe7\\x5b\\x17\\x2d\\xe7\\xd4\\xaf\\xc7\\x8d\\x19\\x32\\x76\\xc2\\xaa\\x5d\\x3b\\xfe\\x78\\xf3\\xc3\\x4b\\x57\\x62\\x93\\x34\\x71\\x54\\x43\\x5d\\x55\\x63\\xa0\\xfc\\x1f\\x57\\x5e\\xf7\\xf2\\xcc\\xe9\\xd7\\x49\\x92\\xd4\\xbf\\x69\\x70\\x4d\\xac\\x21\\xb7\\xcb\\x9d\\x6b\\x6f\\x7e\\x06\\x17\\x9d\\x7d\\xa5\\x01\\x10\\x4c\\xda\\x61\\xee\\x66\\x71\\x20\\xf8\\x61\\x06\\x24\\xdd\\x94\\x76\\xab\\x45\\x97\\x7c\\x22\\xea\\x58\\xc5\\x10\\xcb\\xae\\xe3\\x14\\x28\\xd9\\x6d\\x78\\x25\\x3b\\x19\\xe4\\x6b\\x5b\\xc7\\xe9\\x33\\x75\\xc6\\x2b\\x56\\xb7\\x8e\\xec\\x41\\x26\\x0e\\x1d\\xaf\\xc8\\xfa\\x32\\x2d\\x5d\\x62\\x18\\xe4\\x2a\\xab\\x95\\x4d\\x1b\\xb1\\xe4\\xa9\\xa7\\x6a\\x2a\\xfc\\x21\\x5f\\x6e\\xc5\\xf8\\xea\\xdb\\xee\\xe7\\x17\\xbe\\x89\\x26\\xf5\\x3f\\x6f\\xb6\\xee\\xed\\xd7\\x43\\x94\\xde\\x73\\x38\\x1e\\x4a\\x71\\x5d\\xa8\\xdf\\xd6\\x0e\\x0b\\x39\\x42\\x3d\\xb8\\x61\\x98\\xae\\xa5\\x7a\\x2a\\x54\\xca\\xa8\\x2a\\x4b\\x0a\\x79\\x4e\\x96\\x14\\xf2\\x66\\x93\\x42\\x32\\xc3\\x80\\x76\\xea\\xb4\\x6d\\x2c\\xc9\\xde\\x21\\x45\\x54\\xd7\\x06\\x65\\xcb\\xce\\xc6\\xf0\\x98\\x51\\x8d\\x73\\x82\\x58\\xf2\\x7b\\x5e\\xec\\x8e\\x39\\x5b\\x5e\\xc2\\xad\\xdc\\xf5\\xad\\x4b\\x97\\x9f\\x55\\x59\\xc1\\xbb\\x8f\\xbe\\x7a\\xd7\\x84\\x69\\x9f\\x50\\xb9\\x71\\x02\\x08\\x06\\xa1\\x1e\\x4c\\x10\\xca\\xe6\\x88\\xb0\\x2d\\x47\\xa4\\xa7\\x01\\x3a\\xe4\\x81\\xdc\\xfe\\x78\\x1d\\x8d\\xb4\\x9d\\x58\\xfd\\x94\\x5b\\xf2\\x24\\xb1\\x5a\\xbd\\x51\\x4d\\x0b\\xf5\\xad\\x93\\xe7\\xcc\\xe1\\x1e\\x3e\\xfa\\xaa\\x2e\\x8b\\x05\\x00\\xe2\\x0e\\xa1\\x1e\\x1c\\xd0\\xa8\\x6b\\x31\\xb5\\xdb\\xb4\\x59\\x45\\x30\\x76\\xc8\\x01\\xb9\\xda\\x73\\x40\\x2e\\x5d\\x13\\xda\\x13\\x36\\x0a\\x38\\x64\\x57\\x92\\xcb\\x2e\\x7b\\x08\\xb9\\xe3\\xec\\x2f\\x84\\x61\\x3e\\xcc\\x87\\x0b\\xd0\\x75\\x83\\xb4\\xfb\\xe5\\x3d\\xd2\\xf5\\xe8\\x52\\x8f\\xfc\\xfa\\xba\\xf4\\xfa\\x2f\\x42\\x7d\\xeb\\x70\\xee\\xc9\\xd6\\xa1\\xdc\\xd3\\x47\\x5f\\xe5\\xae\\x6c\\x65\\xf8\\xd5\\x0d\\x20\\x18\\x85\\x7a\\xb0\\xb6\\xe5\\x6c\\x4c\\xf1\\x24\\x97\\x25\\xcf\\x16\\xd5\\x1d\\xb7\\x9e\\xb3\\xb1\\x64\\x73\\x36\\x6e\\xdd\\x73\\x5b\\xd0\\x8d\\x63\\xd5\\x67\\xf0\\xb4\\xfb\\xa4\\x87\\x70\\x98\\xfa\\x2c\\x8e\\x55\\x9f\\x56\\x14\\x2e\\xcc\\xf9\\xd5\\xcd\\x38\\xa9\\x35\\xdd\\xba\\x1f\\xcf\\x52\\xff\\xa1\\xd3\\x2b\\xaa\\xc3\\x05\\x59\\xa8\\x07\\x2f\\x54\\x81\\xce\\x3e\\x31\\x4e\\xb9\\x27\\x53\\x6c\\xec\\x8b\\x12\\xb1\\x45\\x91\\x9c\\x69\\x8a\\x37\\xdb\\x17\\x06\\x81\\xdc\\xce\\x52\\x77\\x88\\x01\\xc6\\x2c\\x7c\\xec\\x87\\x22\\xd6\\x3f\\x6d\\x95\\xde\\xc2\\x7a\\x75\\x68\\xf7\\x8d\\x1b\\x4b\\xfb\\x55\\x16\\xdb\\x0a\\xad\\xa7\\x8d\\xf2\\x16\\x0b\\xf5\\xad\\xd7\\xf5\\xe6\\xc8\\xd1\\x92\\xf3\\x37\\x59\\x2d\\x1f\\x70\\xc2\\x90\\xda\\xf1\\x80\\x30\\x1c\\x80\\xff\\x17\\x1b\\xc3\\x4e\\xf9\\x1c\\xfc\\x1f\\xf2\\x39\\xc3\\x39\\x5e\\xb5\\xf1\\xb3\\x5a\\x7f\\xe7\\x72\\x1e\\xe3\\x1e\\xfb\\xfc\\xe1\\xd6\\x91\\x99\\x7c\\x4e\\x95\\x7a\\x3b\\x77\\x85\\xd4\\x07\\x0a\\xa1\\x4a\\x5f\\x4d\\x23\\xa5\\xb3\\x6b\\x59\\x84\\x98\\xe2\\xf1\\xa7\\x69\\xe8\\x18\\xa4\\xde\\x2d\\xc0\\x14\\x45\\x9f\\x4b\\x21\\x4e\\xa6\\x2b\\xcc\\x2d\\x30\\x25\\x29\\xc0\\xf6\\x44\\xb6\\x41\\xcf\\x63\\x57\\x4d\\x99\\xf8\\xe0\\xcb\\x3d\\x27\\x34\\x4e\\x9e\\x32\\x65\\x72\\xe3\\x84\\x9e\\x2f\\x3f\\x38\\x91\\x93\\x5e\\x5f\\x38\\xf7\\x8d\\x2d\\x3f\\xd4\\xdd\\x5d\\xb4\\x69\\xf9\\x1b\\xf3\\xef\\xad\\x8c\\xde\\x3b\\xef\\x8d\\xe5\\x9b\\x8a\\x36\\xd6\\xfd\\xb8\\xe5\\x0d\\x56\\x80\\x88\\xb0\\x55\\xfd\\x19\\xa7\\xb3\\x1c\\x50\\x31\\x74\\x9c\\x22\\x4c\\xf1\\x6c\\xd5\\x49\\xe6\\x27\\x9b\\x14\\x92\\xe3\\xf2\\x56\\xa2\\xfe\\x2c\\xbd\\xf0\\xfb\\x00\\x40\\x28\\x56\\x6f\\xe7\\xce\\xcf\\xd2\\xe2\\x8f\\x2a\\xbe\\x0c\\x2d\\x7c\\x0b\\x31\\xc7\\x94\\x80\\x9f\\xc1\\x46\\x4a\\x4b\\x80\\x97\\x75\\xdc\\xef\\xf3\\x67\\x5c\\x86\\xbf\\x2f\\x32\\x52\\xf4\\xae\\xd3\\x81\\x62\\xd1\\xaf\\x97\\x45\\xc1\\x92\\xa1\\x78\\x42\\xe3\\xb4\\x33\\xce\\x98\\xd6\\x38\\xa1\\xe7\\x8e\\x87\\x4e\\x9f\\x36\\xed\\xf4\\x87\\x76\\xec\\x66\\x24\\xdc\\x53\\x59\\x79\\xef\\xd9\\x94\\x84\\xbb\\xeb\\x7e\\xd8\\xf2\\xc6\\xdc\\x85\\xaf\\x2f\\x9a\\xfd\\xc6\\x96\\x1f\\xeb\\xa8\\x1d\\xc0\\x8b\\x84\\x57\\xf8\\x04\\xe4\\xc2\\x38\\x20\\xbe\\xa8\\xc2\\x5b\\xd2\\xcd\\x26\\xde\\x67\\x8c\\x28\\x4e\\x2a\\x35\\x79\\x8c\\xa6\\x5c\\x7d\\x5d\\x4d\\xae\\x53\\xb1\\x62\\x24\\x65\\xd3\\x6b\\x1e\\x02\\xd4\\x20\\xe4\\x52\\x30\\xe6\\xa4\\x8a\\xe2\\x73\\xca\\x2e\\x05\\x72\\x13\\x09\\x85\\x37\\xc9\\x2e\\xc5\\x6a\\xcb\\xe4\\x56\\xa8\\xf7\\xd0\\xcd\\xb1\\x9f\\x01\\xdf\\x72\\xdd\\xb7\\x9d\\xbd\\xf5\\x9a\\x71\\xb7\\x8d\\xa8\\x1e\\x5e\\x11\\x1b\\xf6\\x86\\x72\\xf5\\x84\\x1b\\x47\\xd5\\x0c\\xaf\\xa8\\x19\\x82\\xdb\\xef\\xfb\\x70\\xe0\\x80\\xca\\xf2\\xf9\\x43\\x03\\xf7\\x7e\\xd2\\xaf\\xb1\\xa2\\xcb\\xbc\\x21\\xc0\\xc1\\x7a\\x75\\x1d\\x26\\x85\\x7a\\x86\\xe9\\xcb\\x40\\x0f\\x5d\\x85\\x53\\x2f\\x18\\x73\\x67\\x16\\x8c\\xad\\xd7\\xb1\\xbc\\xba\\x8e\\x7f\\xe6\\xd8\\x10\\xe1\\x09\\x44\\x55\\x5f\\x27\\x0e\\xa7\\x69\\x16\\x5e\\x15\\xcb\\xa0\\x18\\x96\\x01\\x29\\x8a\\xa6\\xbc\\x7a\\x9d\\x91\\x3d\\x5b\\x71\\xc4\\x82\\xe1\\x76\\xdf\\x5e\\xc4\\x66\\x93\\x53\\x85\\x3a\\x23\\x24\\xb6\\x6c\\x8a\\xc6\\xf9\\x96\\x98\\x92\\x27\\xa7\\xe9\\xb0\\xd1\\x30\\xb9\\xb0\\x48\\x76\\x29\\x76\\x06\\x53\\xbd\\x74\\xb3\\x20\\x98\\x48\\x10\\xbb\\x9c\\x34\\xe7\\xe4\\x51\\xc7\\x25\\xba\\x14\\xc1\\x90\\xc9\\x61\\xb8\\xf4\\xea\\x21\\xef\\xf1\\x29\\x0c\\x1f\\xab\\x1f\\x2a\\xe3\\x4e\\xdb\\xff\\xd6\\xae\\x0d\\x8f\\xab\\xdf\\xb7\\xe5\\x2f\\x2c\\x1c\\xaf\\xdc\\xb0\\xeb\\xad\\xfd\\x9c\\xad\\xf0\\x63\\x8c\\xe4\\xee\\xff\\xaa\\xf8\\xc3\\x8d\\x6d\\xf9\\x0b\\xf1\\xea\\x3d\\xa1\\xef\\xbf\\xa2\\x8a\\x4d\\x69\\x9b\\x06\\x20\\x5c\\x2e\\xee\\x84\\x62\\xb8\\x0d\\x92\\xf9\\x54\\x0f\\x0b\\xf8\\x34\\xc9\\x8d\\x25\\x25\\x0e\\x22\\x8a\\x9d\\x4f\\x27\\xed\\x6c\\x12\\xc1\\x6e\\x31\\x45\\x52\\x80\\xf9\\x92\\x2d\\x42\\x5c\\x71\\x16\\xc4\\x78\\x62\\x8c\\x70\\x8e\\x11\\x9e\\xe4\\x5c\\xf4\\x32\\x0e\\x4c\\xf4\\x3b\\xdf\\x14\\x21\\x9c\\x93\\x84\\x82\\x2d\\xb2\\xe2\\x73\\xb4\\xe5\\x76\\x3c\\xf4\\xa4\\x2f\\x60\\x8a\\x64\\x20\\x90\\x62\\xf6\\xa4\\x19\\x33\\x5c\\x21\\xb6\\x1a\\x4a\\xb1\\xf8\\x64\\x97\\x22\\xd9\\x29\\x53\\xec\\xc8\\xc0\\x3c\\x73\\x5f\\xe5\\x4c\\x34\\xda\\xaa\\xa7\\xfc\\x21\\x6f\\xc8\\xef\\x91\\x0c\\x21\\x6f\\xa8\\x36\\xde\\x17\\x6b\\xcb\\xa7\\xdd\\x69\\xfc\\x69\\xf7\\x87\\x47\\x04\\x4e\\xfd\\x72\\xda\\x90\\xc6\\x31\\x66\\x9c\\xad\\x3e\\x2c\\xf4\\xee\\xc9\\xbd\\x7e\\x2c\\xdf\\x1c\\x8d\\x0a\\xdc\\x88\\x83\\x2d\\xef\\xfe\\xf8\\xd9\\xd3\\xd2\\x8c\\xa9\\x17\\x2c\\x68\\x39\\x38\\x61\\xd4\\x8d\\x89\\x03\\x07\\xac\\x0f\\x4d\\x9a\\x05\\x1c\\x8c\\xd1\\xbe\\x12\\x07\\x08\\x3f\\xb1\\xd5\\xa6\\x97\\x81\\x5e\\xe8\\x13\\x08\\xc7\\xe3\\x4a\\xb9\\x98\\x26\\x95\\x51\\xc5\\x26\\xea\\xab\\x4c\\x85\\x96\\x54\\x89\\x5e\\x26\\xa6\\x67\\x12\\x53\\x3e\\x5d\\x69\\xd9\\x7a\\x52\\x41\\x76\\x35\\xa3\\xc1\\x14\\xa6\\x30\\xa3\\x9b\\xdc\\x6c\\x76\\xb2\\x32\\x31\\xe2\\x73\\x35\\xcb\\xee\\xdc\\x00\\x5b\\xc0\\x54\\x5e\\x24\\xbb\\x9a\\xf3\\x40\\x3f\\x51\\x29\\x37\\xa3\\xc1\\x9d\\x4b\\x37\\x6d\\xae\\x66\\xa3\\xd9\\xe9\\x62\\x60\\xa4\\x1f\\xea\\xb5\\x62\\xe5\\x75\\x19\\x24\\x55\\xe7\\x37\\xe8\\x65\\x62\\x7e\\x83\\xee\\x20\\xcb\\x0d\\x6c\\x89\\xa9\\x4b\\x4f\\x96\\x8c\\xb9\\xba\\x3a\\xde\\xb3\\xf6\\xc6\\xeb\\xd7\\x0f\\x53\\x66\\xce\\x48\\x0e\\xbf\\x71\\xfd\\x86\\x78\\xcf\\x78\\xf4\\xda\\xf5\\x57\\x8e\\xdc\\x36\\x67\\xee\\x33\\xc3\\xaf\\x18\\xf3\\xfd\\x63\\x8f\\xfe\\xf0\\xc3\\xa3\\x8f\\x7d\\xbf\\xfc\\x9a\\x11\\xcd\\xb3\\xe6\\x3e\\x3b\\xea\\xef\\x37\\xde\\x54\\xd7\\xbb\\x4f\\xcf\\x0d\\x37\\xdd\\x36\\xea\\xe9\\x39\\x33\\x95\\xe1\\xd7\\xdf\\xb4\\xa6\\x6f\\xff\\xfe\\x7d\\xae\\xe4\\x2e\\x7a\\x46\\x05\\x6d\\xdb\\xd3\\xaa\\xca\\x64\\xc2\\x07\\x20\\xfc\\x4b\\x24\\xe0\\x87\\xe5\\xba\\x2f\\xcc\\xe6\\xf3\\x53\\xb2\\xcb\\x01\\x36\\xea\\x1a\\x15\\x59\\xa2\\x56\\x34\\xe5\\xf5\\xb1\\x03\\x52\\x5c\\xf1\\x4a\\x69\\x62\\x8c\\x31\\x9c\\xe2\\x68\\x21\\xee\\x18\\x8b\\x26\\x4c\\xb1\\xa4\\x9d\\x85\\xf5\\x76\\xab\\x29\\x42\\x11\\x8d\\x83\\x2d\\x70\\x70\\xc8\\xa6\\x08\\xf1\\xc6\\x28\\x5a\\x51\\xec\\x8e\\xf6\\x39\\x01\\x5f\\xe7\\x39\\x81\\xb8\\x37\\xa4\\xff\\xd5\\x66\\xfe\\x7c\\xd8\\x1f\\x73\\x24\\xcc\\xc5\\x06\\x75\\xd5\\xaf\\xea\\xf3\\x38\\x48\\x7d\\x5e\\xdd\\xa7\\x6e\\xc5\\x71\\xea\\x56\\xb4\\x88\\xa4\\xf5\\x1e\\x6e\\x46\\x6b\\x8f\\x5d\\x8b\\x76\\x7d\\xf3\\xcd\\xae\\x45\\xbb\\x74\\x7c\\x7e\\x99\\xfa\\x33\\x5e\\x95\\xa9\\x59\\x2d\\x86\\x13\\x4a\\x55\\xfd\\xba\\x2d\\xf0\\x1f\\x6f\\x0b\\x2e\\x43\\x49\\xfd\\x03\\x25\\xf5\\x67\\x3e\\x70\\xec\\x2b\\x7e\\x17\\xf7\\xef\\x56\\xb3\\xde\\xde\\x19\\x6a\\x5c\\xb8\\x4b\\xdc\\x09\\x71\\x18\\x0c\\xb7\\x80\\xbe\\x28\\x99\\xc6\\x52\\x32\\xc3\\x60\\xb2\\xdd\\x14\\x21\\xe1\\xa8\\x12\\xa1\\x2e\\xac\\x91\\x3d\\xa5\\x2c\\xa6\\xd4\\x38\\xd2\\xa4\\x4b\\x8c\\x48\\x54\\x1b\\x3c\\x8e\\x34\\xa9\\x71\\x2a\\xdd\\x31\\x42\\xec\\x31\\x25\\xa8\\xaf\\xab\\x0c\\x3a\\x49\\x1e\\x3d\\xd9\\xc7\\x93\\x26\\x7d\\xa2\\x4a\\x9e\\x27\\xad\\x0c\\xa1\\xee\\x49\\xa2\\xac\\x89\\x25\\x12\\xa4\\xbb\\xdc\\x60\\x96\\x4d\\xfe\\x70\\xa4\\x3a\\x51\\xdf\\x30\\x90\\xca\\x4d\\xd0\\xa5\\xe4\\x14\\x50\\xa6\\xc9\\x11\\xd9\\xf5\\x94\\x64\\x0d\\x96\\x75\\xa9\\x1f\\xd8\\xa9\\x40\\xac\\x24\\x1e\\x13\\x4e\\x2c\\x38\\xcc\\x2e\\x5b\\xee\\x87\\xa5\\x1d\\x2a\\x14\\x4b\\xd9\\x79\\x3f\\x5b\\x99\\x59\\xce\\x12\\xd9\\x67\\x8c\\x1f\\x3d\\x78\\x10\\x06\\x8e\\xfc\\x82\\x6e\\x91\\x53\\xbf\\x5a\\xb9\\x60\\xd9\\xb2\\xc5\\xca\\x7f\\xd2\\xe3\\x47\\x0f\\x1a\\xac\\x7e\\x73\\xe4\\x1b\\xf5\\x75\\x91\\xc3\\xc0\\x4d\\x0b\\xce\\x5d\\x71\\xd1\\x23\\xbf\\x7e\\x8b\\xe1\\xc5\\x4a\\xf1\\xe0\\x70\\x79\\xe4\\xe2\\x47\\xbb\\x0c\\x2a\\x2a\\x2b\\xe5\\x72\\x26\\xaf\\xab\\x88\\x5d\\x3f\\xeb\\xb1\\x77\\x3e\\xdd\\x25\\x4d\\x3a\\x6f\\xe2\\xc0\\xe1\\x23\\xab\\x1a\\x9e\\x7b\\x6c\\xea\\xda\\x48\\xfc\\xba\\x59\\xca\\xae\\xd7\\x3e\\x96\\xf0\\x9c\\x69\\xe3\\x06\\x0e\\x1c\\x1b\\x6b\\x78\\xee\\xd5\\x31\\xe3\\x6a\\xcc\\x1e\\x8b\\x6f\\x58\\xd5\\x90\\x29\\x35\\x66\\x9f\\xc5\\x37\\x8c\\xf1\\xf9\\x2e\\xe1\\x4b\\xfe\\x8e\\xcc\\xb8\\xf5\\x80\\xec\\xea\\x08\\x06\\x8c\\x85\\x58\\x66\\xbe\\xd3\\x90\\x35\\xeb\\x0a\\x2f\\x33\\xdc\\xc9\\x56\\x4b\\xc8\\xe9\\x0e\\x33\\x9c\\xf1\\xda\\x90\\xf7\\x2e\\x34\\x7f\\x8b\\x66\\xe1\\xcb\\x3d\\x7b\\xf6\\xec\\x61\\x33\\x16\\xa7\\x6b\\x87\\xc5\\xcf\\xc5\\x57\\xc0\\x02\\x7e\\xa8\\x85\\x27\\x74\\x0c\\x99\\x72\\xd8\\xc1\\x2e\\x44\\xd8\\x9c\\x4b\\xca\\xcb\\xb6\\x53\\xf1\\x88\\x89\\xb7\\x45\\x52\\x71\\xfd\\x4c\\x24\\x4e\\x87\\x38\\x12\\x35\\x45\\x52\\xf9\\x25\\xec\\x44\\xbe\\x7e\\xa2\\x84\\x65\\x77\\x4b\\x82\\x14\\xa6\\xf7\\x60\\x4e\\x50\\x2f\\xe0\\x25\\x56\\x66\\xf8\\x53\\x5d\\xf4\\xbd\\x2e\\xfa\\xb0\\x87\\x62\\xa9\\x2a\\xfd\\x40\\x51\\x8c\\x54\\x39\\x15\\x57\\xfb\\xf2\\xd3\\x3a\\x8c\\x28\\xdd\\xbb\\xc8\\xae\\xa7\\x4c\\x0e\\x2f\\x5f\\x92\\x1f\\x67\\x96\\xa3\\x24\\x22\\xbb\\x9e\\x94\\xac\\xae\\x22\\xc8\\x14\\x00\\xb2\\x95\\x03\\xfa\\xfa\\x01\\x37\\xab\\x24\\x92\\x59\\x21\\x51\\xa6\\xa8\\xd2\\x81\\xe1\\x4e\\x6e\\x22\\xee\\xf7\\x51\\x57\\x7a\\x3a\\x6e\\xc4\\x2e\\x58\\x8e\\x9b\\xd4\\x19\\xea\\xc7\\xea\\x47\\xea\\xac\\x8b\\x70\\xe2\\x6f\\xbf\\xe2\\x44\\xf5\\x91\\x5f\\xff\\xad\\x3e\\x7a\\xf0\\x9f\\xf7\\xdc\\xad\\x08\\xdc\\x86\\x29\\x53\\xce\\x98\\x33\\xe7\\x8c\\x29\\x93\\x37\\x70\\x02\\xb9\\xfb\\x9e\\x7f\\x72\\x7b\\xb1\\x17\\x12\\x75\\x8c\\xba\\x53\\x7d\\x45\\x1d\\x85\\x49\\xec\\xad\\xfe\\x57\\xbd\\x0d\\xcf\\x46\\x23\\x1a\\x28\\x94\\x54\\xff\\xb9\\x62\\x6b\\xcb\\xa6\\x5b\\xa4\\x33\\x26\\xac\\x5b\\xba\\xf2\\xbc\\x6b\\xc6\\xcd\\x90\\x6e\\xbb\\xfb\\x7d\\x5d\\x4f\\x96\\x70\\x29\\xde\\xc6\\xd6\\x9c\\x45\\xe0\\x0a\\x60\\xc5\\x1d\\x29\\xa3\\x1d\\x06\\x0b\\x11\\x52\\x18\\x4d\\x95\\x30\\xc6\\x91\\xae\\xd1\\x14\\xcf\\xb6\\x32\\x59\\xce\\x54\\x48\\x67\\x4c\\xc8\\xc9\\xf2\\x3a\\x42\\x20\\x16\\xcb\\x14\\xea\\xb2\\x6c\\x67\\x88\\xa2\\x5e\\xab\\x9d\\xad\\xce\\x4f\\x5a\\x9c\\x85\\xac\\x56\\xd2\\x45\\x72\\x32\\xb5\\x13\\x8a\\x3f\\x90\\x48\\x90\\xae\\xb2\\xe2\\x81\\x44\\x42\\x31\\xf2\\xb2\\x2b\\x69\\xb1\\xba\\x4f\\x98\\xb7\\x89\\x62\\x59\\xdb\\xa4\\x4d\\x38\\x3b\\x69\\x53\\xd7\\x3e\\x69\\xb3\\xe4\\x91\\xfb\\xae\\xe9\\x95\\x18\\x70\\xda\\x83\\x28\\x3d\\x7a\\xdd\\x9a\\xbb\\xad\\x76\\xc5\\x68\\xe6\\x43\\x8b\\x47\\xad\\x58\\xf5\\x44\\x7d\\xaf\\xf8\\x02\\x79\\xed\\xb0\\x71\\xfc\\xed\\x8b\\x57\\xc6\\xfb\\xf6\\xaf\\x89\\xda\\xa4\\x59\\xab\\xd6\\xaf\\x51\\x5f\\x8d\\x4f\\xea\\xe6\\x8d\\xe6\\x45\\xfb\\x5c\\xb4\\x28\\x52\\xd9\\x3b\\x7c\\x56\\x83\\xce\\x83\\x59\\x70\\x01\\xbf\\x9a\\xdf\\x00\\x12\\xd8\\xd8\\x2a\\xf0\\x38\\xef\\x0e\\x67\\x7e\\x66\\x61\\xce\\x73\\x3f\\xfe\\xf8\\x5c\\x0f\\xfd\\x07\\x8f\\xba\\x71\\x8d\\xba\\x44\\x5d\\x8a\\x6b\\x32\\x1b\\xcc\\x0e\\x5f\\x8a\\xcb\\xf9\\x97\\xf8\\x52\\x56\\xcf\\xc5\\x70\\xac\\x3d\\x9d\\xad\\xf2\\x63\\x21\\x21\\x2b\\xe6\\xa2\\xe8\\xd1\\x25\\x44\\x4e\\x56\\xcf\\x15\\x92\\xc3\\xf2\\xa5\\xfc\\xc0\\x5d\\xdc\\x45\\x5b\\xd4\\xb1\\x28\\xfc\\xff\\xac\\xb9\\x13\\x3a\\xe9\\x4d\\x0c\\x7a\\xc1\\x8b\\x7f\\xae\\x39\\xd5\\x71\\xa6\\x20\\xd5\\xfa\\x99\\x6a\\xa6\\x39\\xd5\\x39\\xa6\\x08\\xe9\\x12\\x4b\\xe5\\xf5\\x62\\xe7\\xf2\\x32\\x23\\xdf\\xfb\\x24\\x1a\\x13\\xd3\\xf7\\xe2\\x31\\x12\\x73\\x2a\\x15\\x18\\x21\\x75\\xb1\\xac\\xfb\\x2d\\x88\\x65\\xf5\\xa9\\xa4\\x93\\xee\\xf4\\xc1\\x88\\x52\\x11\\x93\\x5d\\xcd\\x4c\\x77\\xfc\\x09\\x52\\x22\\x93\\x60\\x02\\x94\\x6a\\x87\\x4c\\x03\\x7f\\x12\\x97\\x53\\x92\\xd5\\x05\\x41\\x7a\\xaa\\x97\\x8b\\x14\\x9c\\x42\\x93\\x50\\x0e\\xb1\\xda\\xda\\xb6\\x55\\x2c\\x61\\x1d\\x42\\x47\\x30\\xbb\\x8a\\x25\\x82\\xa7\\xd6\\x27\\x2c\\xc5\\xdc\\xdb\\x1e\\xaf\\xef\\x59\\x5f\\x6b\\x30\\xdf\\x69\\x12\\x06\\x8e\\xd8\\x78\\xf5\\x90\\xd9\\xa3\\x66\\xae\\xfa\\x2b\\x85\\x6a\\x9d\\xc6\\x37\\xad\\xbd\\xb4\\x7e\\x62\\x51\\xe1\\xc2\\x61\\x3d\\xbb\\xf6\\xf7\\x3a\\xbd\\x63\\xbb\\xf5\\x18\\x32\\x48\\x7d\\x02\\x3f\\xec\\xdd\\xf3\\xb4\\x7a\\x40\\xd8\\x20\\x5a\\xf9\\xc5\\xa2\\x02\\x3c\\x14\\x42\\xc6\\x0c\\xda\\xd3\\x6d\\x1b\\x1d\\x27\\x97\\x6b\\x43\\xde\\x0d\\xdc\\x27\\xa2\\xf5\\xc1\\x07\\xa9\\x2c\\x5e\\xca\\x3f\\xc0\\xdd\\x29\\xee\\x64\\x63\\x37\\x0a\\x3a\\x8e\\x15\\x31\\x45\\x33\\x23\\xc8\\x9c\\x77\\xa7\\xb1\\xe8\\xc0\\x5f\\xea\\xab\\x5d\\x56\\xd9\\xa5\\x98\\xf8\\x44\\x26\\x41\\xa5\\x48\\xd0\\x0e\\xdc\\xbd\\x1d\\x6a\\xb5\\x75\\x4d\\xbb\\xf4\\xde\\x25\\x8b\\x36\\x6e\\x5c\\xb4\\xf4\\x9e\\xbf\\x0f\\xab\\x89\\x37\\x36\\xc6\\x6b\\x86\\x09\\xcd\\x4b\\xee\\xbb\\x6f\\xc9\\xd2\\x8d\\x1b\\x97\\xd6\\x0e\\x69\\xec\\xd1\\x63\\xd8\\x30\\x5d\\x4f\\xa6\\x68\\x1f\\xf0\\xdf\\x8b\\x85\\x60\\x01\\x07\\x4c\\x06\\xb6\\x30\\xc1\\x92\\xce\\x16\\xb7\\x5a\\x4e\\x55\\xdc\\xea\\x6c\\x2b\\x6e\\xf5\\x9f\\xa2\\xb8\\x55\\x3e\\xa1\\xb8\\x15\\x6b\\x43\\xde\\x29\\x38\\x12\\x01\\x87\\xa8\\xcf\\x68\\xa0\\xbe\\xc1\\x0f\\xe0\\xde\\xf8\\x06\\xcf\\x55\\x6f\\xf9\\x46\\xbd\\x02\\x2f\\x6b\\x35\\x7f\\xf9\\x25\\x20\\x2c\\xe0\\xee\\xe4\\x0e\\x88\\xaf\\x41\\x1e\\x8c\\x04\\x62\\x8f\\x2a\\x16\\x7b\\x9a\\x85\\x3d\\xf6\\x13\\xea\\x1e\\xdd\\x2d\\x94\\x4d\\xac\\xd6\\x3b\\x76\\x5c\\x9d\\x63\\xc7\\xda\\xc6\\x2c\\xc3\\xca\\xda\\x8a\\xb7\\x59\\x65\\x63\\x69\\x5b\\x65\\x63\\x78\\x81\\xa4\\x6c\\xb8\\x71\\xe3\\xb9\\x97\\x2c\\xe4\\x70\\x4a\\xeb\\xcd\\x58\\xdb\\x3b\\x1c\\xad\\xae\\xeb\\xf9\\xba\\xf0\\xda\\x39\\xb7\\xae\\x5a\\xde\\x74\\xc9\\x59\\xd3\\xa5\\x3b\\xef\\x3c\\x16\\x1b\\xd8\\xb5\\xbc\\xb6\\x77\\x94\\xe9\\xf3\\x99\\xdc\\x0d\\xdc\\xcf\\xe2\\xab\\xd0\\x8d\\x5a\\x59\\xbd\\x7e\\xd1\\xde\\xb1\\x7e\\x91\\x74\\x89\\x2a\\xa2\\xbd\\x63\\x56\\x8d\\x58\\xa3\\x29\\x5b\\x66\\xbc\\x59\\x41\\x63\\xaa\\x54\\xef\\x7a\\x51\\x8c\\x94\\x3a\\x53\\xb2\\xbe\\x23\\x47\\x93\\x72\\x29\\x83\\x34\\xb6\\x4c\\x69\\x63\\xe9\\xff\\xa1\\xb4\\x31\\x7e\\xd2\\xd2\\xc6\\x70\\x79\\x96\\x60\\x1d\\xce\\x86\\x8b\\xcb\\xce\\xe4\\x5e\\xef\\xd7\\xbb\\xe7\\xa0\\xc6\\x81\\x8b\\x17\\xf7\\xed\\x9d\\xa8\\x8b\\x27\\x76\\x71\\x12\\x59\\x73\\xbb\\x32\\xa4\\x4f\\xe3\\xf0\\xe6\\xdb\\x6f\\x7e\\x9e\\xbf\\x44\\xea\\x16\\xad\\xaa\\x88\\xf5\\xb8\\xaa\\xba\\x7b\\x59\\xbc\\xa2\\x48\\x9a\\xfb\\xb7\\x15\\x8b\\xea\\xa6\\xe6\\xe6\\x9c\\x39\\x68\\xc9\\xc5\\x97\\xd0\\xb1\\x11\\x9e\\xe7\\xce\\x61\\x6b\\x09\\xba\\x66\\xf5\\xe0\\x64\\x6b\\x09\\x14\\x9e\\xfa\\x0c\\x4e\\x4f\\x60\\x07\\x30\\xe4\\xc7\\x05\\xaf\\x61\\x2d\\xa7\\x1e\\x16\\x9e\\x47\\xb3\\xa4\\x1e\\x63\\x3c\\xbc\\x56\\x9d\\x21\\x8c\\x65\\xb9\\x90\\xa6\\x3f\\xc9\\x6f\\xb1\\x24\\xb4\\x8f\\x41\\x0d\\xaf\\x3e\\x29\\xe5\\x6d\\xcf\\x72\\xf9\\x31\\xa2\\x98\\xbc\\x27\\x64\\xb9\\x14\\xbb\\xfe\\x2a\\x88\\x8e\\x79\\xae\\x50\\x06\\xc6\\xcb\\xd7\\x62\\x78\\xca\\x94\\xe1\\x73\\xf2\\xb1\\x44\\xfd\\x51\\xaa\\x58\\x3a\\x30\\x3e\\x31\\xac\\xce\\x10\\x3f\\x6e\\xdd\\x70\\xcb\\xb9\\x75\\x35\\x3c\\x1e\\x7d\\x75\\x60\\xa4\\xd2\\xeb\\x57\\x87\\xb2\\xfe\\xf5\\x01\\xe0\\xef\\x61\\xeb\\x21\\xeb\\x32\\xeb\\xbd\\xf4\\x82\\x72\\x0b\\x23\\x56\\x70\\x82\\x41\\x88\\x10\\xc1\\x99\\x29\\x7d\\x23\\x82\\x33\\x05\\xfa\\x31\\x88\\xd2\\x20\\x1c\\xf4\\xfa\\x2d\\x2a\\xf7\\xe1\\x62\\xe8\\x43\\xad\\xfd\\x0a\\x75\\xdf\\xb8\\xb4\\xda\\xca\\xef\\x7b\\x0b\\xc5\\x3f\\xc6\\x70\\x46\\xe4\\xe9\\x73\\x36\\x71\\x3d\\xf1\\x65\\xbe\\x77\\xbb\\x6f\\xb0\\xa5\\xff\\xbc\\x98\\x9a\\xd2\\xb5\\x09\\x4b\\xb8\\x9e\\x28\\x30\\x36\\x02\\xc2\\x4c\\xb5\\x16\\xbf\\x06\\x09\\x1c\\xd0\\x1b\\x88\\x29\\xaa\\x98\\xed\\x69\\x56\\xfa\\x9f\\x11\\x36\\x67\\x94\\xd8\\x5a\\x14\\xc9\\xaf\\xe7\\xcd\\x18\\x8b\\x32\\xb8\\xdf\\xcc\\x72\\x3b\\x04\\xf5\\xfc\\x92\\xbf\\x2e\\x9e\\x91\\x93\\x72\\x26\\x42\\x33\\x8b\\x3e\\xb1\\x34\\x9c\\xfe\\xf4\\x66\\x43\\xbc\\x77\\xc3\\xda\\xf5\\x09\\x4b\\xd3\\x98\\x73\\x2f\\xbf\\xb7\\x6b\\xb7\\xae\\x21\\xfa\\xcc\\x51\\xdc\\x3f\\xf0\\x1e\\x71\\x27\\x7b\\x93\\x9e\\xbe\\xb6\\x49\\x77\\x94\\x7f\\xed\\x1d\\x4b\\xe5\\xb0\\x3c\\x0a\\x9b\\xde\\x13\\x1d\\x9b\\xfc\\xc7\\xde\\xe7\\x96\\xeb\\xb6\\x68\\x39\\xd7\\xcc\\x47\\x32\\xeb\\x63\\x07\\xe9\\xab\\x81\\x52\\x39\\x3a\\x6e\\xb1\\x44\\x53\\x72\\x86\\x94\\xfc\\xec\\x7b\\x32\\x2c\\x9d\\xde\\x93\\x41\\xed\\xe4\\x49\\x66\\x4d\\xfe\\xf4\\x5d\\x16\\xcb\\x9f\\xdf\\xb8\\xf1\\x9f\\xcf\\xdf\\xbd\\xe9\\x9f\\x4f\\x4c\\x9a\\xd0\\x34\\x69\\xf2\\xb8\\xf1\\x13\\x05\\xbc\\x60\\xc3\\x73\\xcf\\x6d\\xb8\\xe0\\x96\\x67\\x9e\\xb9\\x65\\xc2\\x59\\x67\\x4d\\xb8\\x60\\xdc\\xfc\\xf9\\xe3\\x68\\xbf\\xe6\\xc1\\x6d\\xfc\\x06\\xfe\\x29\\x1d\\x4b\\xd4\\xb9\\xf9\\x38\\x7a\\x31\\xae\\xff\\xcc\\xfb\\xe1\\x87\\xe7\\x31\\x47\\xfd\\x66\\x63\\xe6\\xf7\\x36\\xbc\\x01\\x6f\\x54\\x2f\\x72\\xab\\x17\\xb5\\x6d\\xb0\\x57\\x59\\xc1\\xc3\\x00\\xe2\\xc7\\xe2\\x2b\\xac\\xf6\\xcd\\x03\\xb9\\x70\\x17\\x24\\x5d\\xd9\\xb5\\xb5\\x29\\x8f\\xd7\\xc5\\xd9\\x22\\xc4\\x16\\xa7\\x06\\x84\\x38\\x62\\x49\\xaf\\x87\\x4d\\x88\\x5b\\x4c\\xed\\x15\\xe4\\x76\\x3d\\xcb\\x73\\x32\\xb6\\x52\\xf8\\xed\\xc2\\x08\\xf1\\xc5\\xb2\\x16\\xc4\\x1a\\x63\\x69\\x1f\\x5e\\xa0\\x8e\\xc2\\x94\\x48\\x10\\x97\\x9c\\x32\\x18\\xcd\\x16\\x2f\\x43\\xb5\\x1e\\x97\\x3e\\x57\\xe7\\x95\\x15\\xb3\\x94\\x48\\x10\\x70\\x25\\x79\\x63\\x0e\\x45\\x74\\x98\\x9d\\xa7\\xa6\\x03\\xc4\\xde\\x06\\x82\\x71\\x39\\xee\\x0d\\x7b\\xc3\\xb5\\xa1\\xba\\xb8\\x5c\\x6e\\x78\\x18\\x9b\\xde\\x73\\xe8\\xef\\xfc\\xa8\\xc3\\xcd\\xef\\xcd\\x9d\\xfb\\x9e\\x3a\\x6f\\xf7\\xdb\\x92\\x4d\\xb4\\xeb\\x03\\x79\\x34\\xc9\\xde\\xf0\\xb1\\x81\\xcb\\x51\\x0d\\x77\\x5f\\x7b\\xed\\xdd\\x88\\x9c\\x87\\xe1\\xfe\\x87\\x01\\x24\\x4b\\x86\\xfe\\x12\\xb8\\x3f\\x53\\xc1\\xeb\\xb5\\xeb\\x55\\x26\\xa9\\xa0\\x2d\\x87\\xb3\\x45\\x94\\xa0\\x3d\\x4d\\xf8\\x58\\x32\\x68\\xa3\\xa4\\x05\\x4b\\x8e\\x23\\xbf\\xf4\\xcf\\xc9\\x2f\\xc0\\x48\\xca\\xa9\\xd3\\xee\\x8b\\x25\\x0b\\x9c\\xf4\\x5c\\x41\\x8e\\x29\\xa2\\x94\\x75\\x62\\x43\\x81\\xfc\\xa4\\xc1\\x68\\xb1\\x79\\x74\\x3e\\x04\\xbd\\xb2\\xab\\x59\\x72\\x9a\\x73\\x4b\\xfc\\x09\\x05\\x72\\x32\\x0b\\x19\\x4f\\x60\\x82\\x09\\xff\\xdc\\x67\\x50\\x7e\\xe4\\xeb\\xfc\\x78\\xed\\xe4\\xee\\xe3\\x38\\xce\\xe0\\xd3\\x27\\xf3\\x26\\x02\\x2c\\x06\\x90\\x6e\\x13\\x5f\\x83\\x6e\\xd0\\x1d\\x12\\xd0\\x17\\xde\\x80\\x64\\x1d\\x40\\x84\\x24\\xa2\\xa4\\x26\\xae\\xd4\\xdb\\xd3\\x24\\x16\\x3b\\x95\\x3f\\x21\\x9e\\xa8\\x92\\xdf\\xc9\\xfb\\x20\\xe9\\xf7\\x7f\\xf3\\x30\\xa4\\xd4\\x49\\xa3\\x1f\\xd2\\x2b\\x96\\xea\\xa1\\x9f\\xae\\x8e\\x29\\x0d\\x19\\xaf\\xa3\\x14\\x77\\x4f\\x24\\x48\\x9d\\x9c\\xaa\\xa8\\x8c\\x56\\xd5\\x33\\xb6\\xd5\\x27\\x64\\x97\\x12\\x8d\\x24\\x12\\xa4\\x8b\\x4c\\xfa\\xb0\\x74\\x59\\x55\\x75\\x82\\xda\\xdf\\x8c\\x67\\x72\\x31\\xcf\\x24\\x27\\x73\\x8b\\x2a\\x13\\xff\\xa3\\x6f\\x32\\x9d\\x44\\xe6\\x16\\xff\\x85\\xbf\\xc2\\xd5\\xfa\\x00\\xf4\\xe9\\x28\\x90\\xfc\\xa5\\xa7\\x72\\x62\\xad\\xcd\\x27\\x15\\x53\\xe0\\x60\\xb8\\xba\\x9c\\xff\\x43\\xa8\\x67\\x35\\x9a\\xb3\\x21\\x99\\x8f\\x10\\x51\\x02\\xb6\\x34\\xc9\\x89\\x2a\\x4e\\x4b\\x3a\\xe9\\xcc\\xa1\\x5c\\x73\\xba\\x33\\x15\\x9a\\xd0\\xa2\\xd8\\x1c\\x69\\x62\\x73\\x52\\x75\\x23\\x92\\x5e\\xac\\x69\\xd0\\x93\\xc2\\xb6\\xcc\\xdc\\x68\\x40\\x26\\x42\\x82\\x14\\xba\\x92\\x16\\x67\\x0e\\xab\\xd0\\x09\\x38\\x59\\x85\\xa6\\x97\\xf1\\xa6\\xae\\xa6\\x47\\x5d\\x5f\\xac\\x0d\\xd9\\xd1\\x60\\x47\\xaf\\xee\\xac\\x42\\x7e\\x9f\\x10\\x2e\\x2e\\xa3\\x40\\x69\\xf8\\x86\\xa5\\xbd\\xcb\\x31\\xcc\\x8d\\x5d\\x71\\xda\\x84\\x99\\x53\\x87\\xce\\xe3\\x31\\xc0\\x71\\x6a\\xeb\\xbf\\x3e\\x57\\x71\\x1e\\x96\\x05\\x2e\\xf9\\x68\\x78\\xe5\\x99\\x13\\xae\\x5f\\x3d\\xad\\xfe\\xea\\xa6\\x29\\xf3\\x4f\\x9f\\x20\\xbd\\xf8\\xc6\\xe7\\xfc\\xa1\\xa3\\x47\\xf5\\xfa\\x3b\\x56\\x07\\x68\\x28\\x06\\x03\\x7b\\xa7\\xe7\\x84\\xe3\\x2b\\x01\\x6d\\xd9\\x4a\\x40\\x62\\x8d\\x22\\x91\\x4f\\x56\\x0c\\xe8\\xa2\\x41\\x3d\\xc8\\x99\\x62\\xf8\\x14\\x87\\x16\\x9b\\x5d\\xaf\\x09\\xb4\\x31\\x5c\\xd5\\x5e\\x13\\x28\\xd7\\x85\\xdc\\x61\\xfe\\xf8\\xc2\\x40\\xb6\\x8a\\x70\\x4e\\xc7\\xea\\x40\\x43\\xbe\\xa4\\xfe\\xfb\\x98\\x81\\xeb\\xdd\\xa9\\x7f\\x16\\xf6\\x66\\xcf\\x3f\\xab\\x54\\x3c\\x75\\xff\\x04\\x83\\xec\\x7a\\x8a\\x43\\xa3\\xc9\\x6a\\x63\\xef\\xf2\\xe1\\xf5\\x12\\xfe\\x3f\\xa9\\x5b\\xe4\\xdd\\x21\\x3f\\x9e\\x58\\xbc\\x78\\x9d\\x8e\\x4c\\x3a\\xd6\\x30\\xe2\\x3f\\x75\\x94\\x92\\xed\\xe7\\x00\\x30\\x80\\x13\\x3c\\x70\\xe6\\xf1\\xfd\\x94\\xdb\\x2b\\x2a\\xbd\\x27\\xeb\\xa4\\x2f\\xc3\\x44\\xdd\\xba\\x08\\xf2\\xd3\\x1c\\x9a\\x2d\\x76\\xa7\\xec\\x62\\xbd\\xd5\\x53\\xf0\\xa0\\xa0\\x2c\\xbb\\xd8\\x4a\\xad\\x4c\\x6f\\x2d\\x58\\x5b\\x1a\\x17\\xbd\\xe1\\x72\\xc3\\x09\\x5c\\xf5\\x62\\xde\\x23\\x58\\xf4\\xcd\\x75\\xd7\\x86\\x3b\\x72\\x56\\xea\\x99\\xf7\\xe3\\x2f\\xfe\\xab\\xae\\x3a\\x7a\\x28\\x5b\\x7f\\xa9\\xf7\\x7b\\x21\\x18\\xd8\\xfb\\xa8\\x6e\\x3b\\xbe\\xdf\\xf9\\x6d\\xfc\\xf5\\x46\\x15\\xbb\\x3d\\xdd\\x9c\\x63\\xf7\\x1a\\x23\\x14\\x69\\x67\\xde\\xfd\\x90\\x0a\\x30\\xb7\\xda\\x6c\\x08\\x18\\x8d\\x11\\x05\\x1c\\x14\\x51\\x30\\xe2\\x02\\xfa\\x7b\\xbc\\x5c\\xfa\\x69\\xc1\\x25\\x1b\\x75\\x4a\\x43\\x18\\x51\\x02\\x46\\x1d\\x50\\xc8\\xf2\\x93\\x9c\\x05\\xbd\\xf9\\x05\\xfa\\xcb\\xb9\\x88\\x48\\x69\\xcc\\x67\\x2f\\xa1\\x22\\x5e\\x99\\x04\\x12\\xc4\\x4e\\xc5\\xaa\\x03\\xbd\\xcc\\x57\\xb7\\x4f\\x40\\xb0\\x17\\x52\\x1d\\x4f\\x7a\\xde\\x8a\\x29\\x3d\\xb7\\xd7\\x14\\xd7\\xdc\\xb1\\x62\\x6a\\xa3\\x52\\x53\\x52\\xd5\\xb5\\x13\\x07\\x16\\x9c\\x71\\xed\\xc4\\x86\\x68\\xe5\\x8c\\xab\\x27\\xf6\\xaf\\x3c\\xba\\x9f\\xeb\\xad\\xbf\\x01\\x54\\x2c\\x32\\xd8\\x98\\x8c\\x39\\xc0\\x0d\\x57\\x1e\\xcf\\x05\\x6b\\x1b\\x17\\x8c\\x51\\xe2\\x8c\\x2b\\x26\\x43\\x9a\\xc8\\x31\\x36\\xa9\\x6a\\x6c\\x51\\x2c\\x72\\xba\\xd9\\x60\\x39\\x8e\\x7c\\x8b\\x53\\x71\\x62\\x44\\x71\\xcb\\xe9\\x66\\xc1\\xed\\xcc\\xd0\\xce\\x96\\x47\\x19\\x65\\x57\\x12\\xd9\\x24\\x24\\x71\\x66\\xde\\x24\\xe1\\x76\\x25\\x39\\xd1\\xc6\\x14\\x1f\\xad\\x99\\xf9\\xd7\\xf6\\x21\\x0e\\x79\\xe9\\xe8\\xd2\\x78\\xb1\\x13\\x99\\x61\\x34\\xf7\\xa6\\x94\\x2d\\x45\\x73\\x1b\\x71\\xfd\\xf7\\xec\\x39\\xfa\\x29\\xd7\\x1b\\xbf\\xde\\xb3\\xa7\\x8d\\xae\\x1b\\xc0\\x00\\x6e\\xf6\\xbe\\x86\\x7b\\x8f\\xa7\\xcb\\xd3\\x46\\x97\\x1c\\x4d\\x05\\x74\\x1f\\x11\\x8a\\xa6\\x2c\\x19\\x14\\x55\\xd2\\x51\\x52\\x8d\\x18\\x49\\xe5\\xe8\\x80\\x4a\\x7f\\x6f\\x43\\x07\\x78\\x95\\x95\\xe2\\x52\\x8c\\x28\\x46\\x83\\x3e\\xb6\\x39\\xb2\\x82\\x9e\\x04\\x35\\x6a\\xcd\\xb2\\xcf\\x6f\\xa1\\x23\\x6c\\x97\\x15\\xce\\x4b\\xc5\\x3b\\x33\\xd2\\x1e\\xd9\\x45\\x7c\\x09\\xfd\\xa5\\x0e\\x76\\x63\\xa2\\xa3\\x16\\x76\\x08\\x59\\x99\\x46\\x76\\x08\\x5b\\x3b\\x31\\xe1\\x9a\\xbf\\x4d\\x99\\x74\\xd1\\x85\\x93\\xa7\\xfc\\xad\\x98\\xb2\\x62\\x76\\xcf\\xae\\x5d\\x6b\\x6b\\xbb\\x76\\xab\\x6b\\x63\\xc8\\x1b\\xe3\\x96\\x2e\\x1d\\x37\\x7e\\xc1\\x82\\xa3\\x9b\\xb9\\xde\\xdc\\x92\\x48\\x5d\\x5d\\xa4\\xa2\\x67\\x42\\xff\\xbf\\x9b\\x80\\x61\\x28\\xab\\x2b\\x70\\x53\\x6d\\xb5\\x52\\xbe\\x40\\xbc\\x43\\x71\\xa9\\x25\\x9d\\xb2\\x3b\\xad\\x94\\x3f\\x76\\x6b\\x3a\\x25\\x1a\\xad\\x6d\\x75\\xa6\\x7a\\xcd\\x9f\\xe0\\x49\\x27\\x05\\x36\\xa7\\x22\\x48\\xa6\\x08\\x1b\\x5a\\xc1\\xc5\\xd6\\x2b\\xcb\\x6c\\x20\\x05\\x1a\\x85\\xb9\\xdc\\x19\\xaa\\xbc\\x21\\x77\\xe6\\xc3\\x87\\x78\\x0c\\xf1\\xe5\\x3c\\xef\\xe4\\xff\\xdb\\xfa\\x98\\x13\\x7f\\x51\\x7d\\x32\\x37\\xff\\xd8\\xa5\\x76\\xf5\\xb4\\xcd\\x18\\xc4\\x1e\\x7e\\x49\\x24\\x5f\\xaa\\x37\\x7f\\xa1\\xce\\xff\\x02\\x47\\xab\\x0a\\xd7\\x8f\\x8b\\x22\\x70\\x30\\x5d\\xad\\x61\\x35\\xc5\\x05\\x50\\x09\\xd7\\xe8\\x6b\\x12\\x53\\x45\\x7a\\xf6\\xe6\\x24\\x85\\xa2\\xa4\\x3c\\xaa\\x74\\xa1\\x3a\\xda\\xbd\\x63\\x91\\x68\\x04\\x23\\x4a\\x89\\x9f\\xad\\xb5\\xce\\xd4\\x8b\\xe6\\x78\\x98\\x2b\\x8a\\x62\\x44\\x89\\x38\\x65\\x57\\x73\\x61\\x51\\x79\\x17\\x3d\\x37\\xf3\\xa4\\x55\\x08\\xb8\\x43\\x41\\x66\\xc8\\x03\\x5d\\x64\\x57\\xb2\\x30\\x54\\x92\\x48\\x24\\x14\\x6b\\x91\\xec\\x6a\\x36\\xb8\\x7d\\x39\\x7a\\xae\\x53\\x4f\\xce\\xb4\\xa5\\xb1\\xdb\\xaa\\x8f\\x7d\\xac\\xec\\xec\\xb8\\x40\\x21\\x53\\x8a\\x8c\\x55\\x42\\xe7\\x5a\\x64\\x41\\xdd\\xab\\xd7\\x22\\xe3\\x13\\x1d\\x42\\x89\\x6c\\x61\\xb2\\x7a\\xf8\\x87\\x8e\\x55\\xc9\\x87\\xd5\\x23\\xd8\\xa4\\xd6\\x77\\x8e\\x33\\xf4\\x9a\\xb4\\x85\\x86\\x62\\xe6\\x25\\xc6\\x9f\\xba\\x52\\x98\\x38\\xdb\\x5c\\xc5\\x29\\x8a\\x85\\xa9\\xdb\\x30\\x41\\x66\\xf6\\xf3\\xb8\\xb2\\x61\\xa4\\x8e\\xac\\x43\\xed\\xf0\\xb1\\xab\\xf5\\xa5\\xf0\\xd9\\x12\\x62\\xe6\\xc0\\xda\\x6b\\xe5\\xb2\\xfd\\x1a\\xf6\\x17\\xfd\\xb2\\xfe\\x1f\\xfb\\x75\\x7c\\x6f\\xa8\\xbb\\xea\\xd0\\x9b\\xd6\\xa9\\x59\\x47\\x95\\xe9\\x8e\\x94\\x93\\x8d\\xa5\\xb3\\xfd\\x19\\x00\\x16\\xf0\\xc0\\xd8\\xbf\\xaa\\xa8\\xf6\\xfe\\x55\\x67\\x7c\\xa7\\x62\\x52\\xd6\\x37\\x75\\x64\\xd4\\x15\\x59\\xb7\\xd4\\xde\\xb9\\x8c\\x4b\\xca\\xbc\\x0b\\x60\\xa1\\xc1\\x96\\xb1\\xc2\\xcb\\xfe\\x92\\x5b\\xd4\\x14\\xdb\\xda\\x4d\\xf1\\x29\\xbb\\x4a\\x4c\\x4e\\xe2\\x60\\x2f\\x99\\x91\\xe9\\xad\\x8a\\x43\\x4e\\x13\\x53\\x9b\\x8d\\x6e\\xaf\\x53\\xef\\xd0\\x7d\\x7d\\x76\\xa2\\x63\\xef\\x97\\xb0\\x99\\x8a\\xf6\\xae\\xf7\\xcf\\x4c\\x59\\x00\\xa7\\xbd\\x0a\\x80\\x3b\\x0c\\xc5\\x20\\x80\\x91\\x46\\xba\\x22\\x8d\\xdb\\x24\\x36\\x2b\\x17\\x45\\x62\\x62\\xeb\\x35\\x8c\\x0e\\x1a\\xb8\\x28\\x66\\x6a\\x24\\xa9\\x71\\x10\\x38\\xc6\\x33\\x9e\\xa1\\x22\\x39\\x24\\xd7\\x33\\x21\\xea\\x85\\x25\\x4c\\x7c\\x7e\\xff\\x26\\x53\\x8b\\xcc\\xc1\\xed\\x00\\xdc\\xad\\x27\\x6b\\x1b\\xb2\\x6d\\x13\\x88\\xb1\\x25\\x81\\xed\\x6d\\x63\\x7b\\x46\\x85\\xb6\\x7d\\xbb\\x2e\\x12\\x87\\xb0\\x24\\x23\\x0c\\x6d\\xcd\\x03\\xa7\\x6d\\x07\\xe0\\xee\\x33\\x0c\\x00\\x23\\x58\\xa1\\x5b\\x66\\xc5\\x8e\\x99\\xcb\\x2c\\x49\\x35\\xb1\\x25\\xa9\\xac\\xa0\\xdf\\x6a\\x92\\x5d\\xcd\\xbc\\xc4\\x19\\xa9\\x55\\xa8\\xaa\\xe6\\xdb\\xc0\\x87\\x1c\\x92\\x1b\\xb2\\x03\\x6b\\xc2\\x92\\xec\\x90\\xfe\\xbe\\x2b\\xfb\\x0c\\x5e\\x7b\\x02\\x80\\xdb\\x6a\\xb0\\xb1\\xf9\\x22\\x0b\\x0c\\xce\\xbc\\xff\\x4c\\xd4\\xa9\\x20\\xc6\\xb8\\x82\\x86\\x34\\x31\\xc5\\x58\\x79\\xad\\xc0\\x9c\\x4e\\x33\\x6f\\x10\\xa8\\x4f\\x95\\x99\\x4f\\xe5\\xe5\\x74\\xb3\\x91\\x1d\\xb0\\xc8\\xd9\\x2a\\x70\\x9e\\xba\\x46\\x39\\x24\\xd3\\xdf\\xb1\\x68\\x2e\\xc2\\x92\\x00\\x9a\\xe9\\xa0\\xfc\\xfe\\x22\\x7d\\x30\\xdd\\x62\\xfc\\x2b\\x02\\x10\\x34\\x91\\xb0\\x9c\\xc1\\xf4\\xcc\\xfa\\x4a\\x7b\\xb6\\x3a\\xc9\\xcf\\xa7\\x53\\x08\\x16\\xc1\\x16\\x21\\x79\\x71\\x05\\xc5\\x34\\xc9\\x89\\xb1\\x04\\x82\\x95\\x25\\x2e\\xed\\xec\\x55\\xa3\\x49\\xbb\\x95\\xcd\\x92\\xe6\\x99\\x22\\x49\\x2b\\x9b\\x22\\xb5\\xd2\\xa0\\xd2\\xce\\x62\\xea\\xec\\x62\\x4c\\xc8\\x2c\\xe5\\xd2\\x5f\\x75\\xd0\\x15\\x65\\x6c\\x7b\\xd9\\x01\\x8d\\x55\\x8a\\xae\\x6e\\x7f\\xe3\\x81\\x6a\\xc5\\x12\\xfd\\xa5\\x07\\xbf\\xfe\\xca\\x5d\\xf7\\x24\\xb7\\xb8\\xed\\xcd\\x07\\xdc\\x75\\xea\\x78\\xf6\\xf2\\x03\\x75\\xd9\\x93\\x19\\x7d\\x15\\x43\\x86\\x85\\x60\\x81\\x22\\x78\\xf8\\x84\\x6a\\x64\\x92\\x1b\\x55\\x5c\\xf6\\x74\\x73\\xbe\\x2b\\xd7\\x18\\x51\\x1c\\x19\\x54\\xd6\\x56\\x9e\\x4c\\x8a\\x82\\x2d\\x72\\x5b\\xba\\x38\\x9a\\x2a\\xd2\\xb7\\xda\\xeb\\x96\\x9b\\x7d\\x94\\xa5\\x99\\x57\\xe1\\x12\\x6f\\x34\\x3b\\x6b\\x4e\\x41\\x5a\\x11\\x4b\\x26\\x73\\x09\\x96\\x03\\x70\\xe4\\x26\\x12\\xc4\\xe7\\x52\\x78\\x63\\xa2\\x63\\x69\\x33\\xc9\\x95\\x49\\x51\\x82\\xe4\\xb3\\xb5\\x90\\x0e\\x17\\xf3\\xe7\\x9d\\xcb\\x9d\\xf9\\x93\\x20\\xb6\\x4e\\x25\\xd0\\xa3\\x8f\\x43\\x6b\\x9d\\x4b\\xa2\\x3b\\xc1\\x35\\x8a\\x57\\x59\\x7d\\xb4\\xa1\\x18\\x6c\\xe0\\x82\\x20\\x0c\\xcd\\x8c\\xa6\\x2f\\x3b\\x9a\\x05\\x96\\x34\\x71\\x45\\xb3\\x2f\\x47\\x68\\x2f\\x46\\x61\\x63\\x54\\x4c\\x95\\x9d\\x76\\x9d\\x81\\xae\\x5c\\x39\\x25\\x38\\x2d\\x2e\\x59\\x17\\xe6\\xce\\x05\\xd3\\xac\\xbe\\x89\\x3f\\x75\\xd5\\xf4\\x7f\\x98\\xba\\x7e\\x71\\xaa\\xd2\\x69\\xf1\\x3d\\x1a\\xc8\\xf4\\xe9\\x5c\\x3f\\x9d\\xa5\\xa1\\x8e\\xc9\\x63\\x10\\x1a\\x4f\\x5a\\xe5\\x1d\\x3a\\xd9\\x8a\\xdf\\xe2\\x4c\\xee\\x2a\\x25\\x58\\xf2\\x0b\\xd8\\x4c\\x89\\x51\\x56\\x0a\\x8b\\xfe\\xb2\\xe2\\x9b\\x99\\x81\\x53\\x94\\x7d\\x6f\\xd6\\xad\\xc3\\x5f\\x55\\x7f\\x73\\x6f\\x67\\xfd\\x48\\x96\\x86\\x89\\x60\\x03\\x1f\\x94\\xc0\\xe8\\x0c\\x0d\\x79\\x59\\x1a\\x42\\x16\\x3d\\x17\\x03\\x2d\\x8a\\x9f\\x6a\\x90\\xbe\\x36\\x9c\\xd2\\x50\\x86\\x11\\xc5\\xdf\\x36\\x08\\x05\\xf2\\x93\\x82\\x53\\xf6\\x58\\x7c\\x8c\\x18\\x1d\\x30\\x9d\\x38\\x1a\\x6d\\x86\\xe6\\xd4\\x23\\xf2\\x53\\xd6\\x06\\x29\\xa7\\x1c\\x14\\x41\\xb7\\x4e\\xc7\\x8c\\x27\\x1f\\x97\\x55\\x60\\x83\\x10\\x44\\x61\\x55\\x86\\xa6\\xd2\\x2c\\x4d\\x15\\x96\\x34\\x09\\x44\\x15\\x8f\\x3d\\xdd\\x5c\\xe8\\x09\\x18\\x33\\xaf\\xe4\\xad\\xca\\xbe\\x67\\xb6\\xd9\\x5e\\x0c\\xc6\\x48\\x76\\x8a\\xb4\\xd8\\xa9\\x74\\xd1\\x29\\x6e\\xce\\x31\\x76\\x31\\x46\\x52\\x7e\\xfd\\xb8\\x3f\\x9a\\x41\\xd1\\x6c\\x65\\x8a\\x3f\\x24\\xbb\\x9e\\x14\\x64\\x4b\\x80\\x2d\\x77\\x05\\x25\\x20\\xc8\\x2e\\x12\\x62\\x6f\\x98\\xb5\\x27\\x4e\\x60\\xc3\\x49\\x54\\xe9\\x2f\\x38\\xf2\\xcd\\x71\\xca\\x35\\xf3\\x94\\x8c\\xe9\\xd9\\x31\\x34\\x52\\x3b\\x72\\x47\\xe8\\xa0\\x77\\x32\\x14\\x41\\x18\\xe6\\x66\\xb8\\xe3\\xcd\\x72\\x27\\xdf\\x92\\x26\\xf6\\x28\\x09\\xc6\\x15\\x87\\x21\\x4d\\x42\\xb1\\x6c\\xf8\\xe0\\xa2\\x9c\\x71\\x01\\x65\\x97\\x9c\\x2d\\xa9\\x62\\x6c\\x09\\x1b\\x73\\x8c\\x11\\x25\\x28\\xa7\\x49\\x30\\xaa\\x84\\x65\\x3d\\x7a\\x08\\xca\\xb2\\xab\\x59\\xb0\\x78\\xf3\\x4f\\xaa\\x95\\xd4\\xde\\x77\\x22\\x98\\x3a\\xe9\\x13\\x88\\x3e\\x80\\xe6\\xd7\\xb2\\x74\\xa2\\x82\\xe6\\x93\\xd2\\x6a\\xdb\\xb3\\xe7\\xa8\\xd6\\x41\\xb4\\x7f\\x67\\xbe\\x02\\xa1\\x01\\xde\\xe2\\xff\\x23\\x5c\\x0f\\x16\\x00\\xb7\\x09\\xeb\\x4c\\xe8\\x37\\xa1\\xc1\\x84\\x0d\\x58\\xab\\xbe\\xf1\\x18\\x46\\xb1\\xea\\x31\\xf5\\x0d\\xac\\x7d\\x4c\\x7d\\x5b\\x7d\\x07\\xcf\\xc3\\x5e\\xd8\\xeb\\x01\\x75\\x37\\xf6\\x78\\x40\\xdd\\xa9\\xee\\x7c\\x80\\x5e\\xa3\\xcb\\xd1\\xbd\\x62\\x40\\xfc\\x1e\\x72\\xa1\\x14\\xaa\\x61\\x4e\\xe6\\xcd\\x04\\x5d\\xb3\\x9c\\x2a\\xa6\\xba\\x11\\x6b\\xab\\xe5\\xcf\\x63\\x33\\xa8\\x54\\xd5\\x95\\x38\\x46\\x94\\x3c\\xd0\\xdf\\x32\\x58\\x21\\xa7\\x04\\x8f\\x5c\\x54\\xc6\\x02\\x27\\x7d\\xe5\\x60\\x57\\x59\\x76\\x29\\x1e\\x7f\\x22\\x41\\x8a\\x65\\xa5\\xb0\\x9a\\x45\\x52\\x8a\\xc1\\x9c\\xe8\\xf0\\xfa\\x41\\x1d\\x71\\xd3\\x9d\\xe2\\xb2\\x72\\x43\\xb8\\x8e\\x2d\\x1d\\x29\\x42\\xd4\\x17\\xea\\xb9\\x33\\x75\\x2b\\x35\\x65\\x51\\xdd\\x1c\\xcc\\x51\\x86\\x8d\\xbb\\x61\\xd5\\xe8\\x09\\x94\\x75\\xa3\\x6f\\xec\\x33\\xe6\\x86\\x15\\xf3\\x97\\x62\\xb8\\xa8\\x50\\xc2\\xf7\\xbb\\x2d\\x19\\x74\\xcb\\x03\\xb7\\x87\\x9a\\xa2\\xb7\\x6e\\xb6\\x5b\\xa4\\x2c\\x0f\\x6b\\xab\\xd6\\x7f\\x36\\xee\\xc0\\x15\\x3a\\x1b\\x83\\x45\\xd7\\xec\\x19\\xd7\\x7a\\xfb\\xb0\\xcb\\x2a\\x90\\x0f\\x57\\xc6\\xf6\\x6e\\x69\\xdd\\xe8\\xf3\\x53\\x8e\\x56\\x8e\\x2f\\xa2\\x31\\x0b\\xab\\x53\\x37\\x14\\x83\\x0c\\x3e\\x18\\x72\\x62\\xa5\\x3a\\xf1\\x45\\x91\\xf8\\x4f\\xb6\\x2e\\x39\\x27\\x3b\\x31\\x44\\xcd\\x01\\x31\\xc9\\xcd\\x0e\\x8f\\xd7\\x97\\x95\\x88\\xe3\\x2b\\xd7\\x99\\xad\\x3e\\xa1\\x7c\\xfd\\x00\\xb3\\xce\\x27\\x29\\x62\\x97\\xca\\xdb\\xb0\\xf9\\x5f\\xf5\\xcf\\x75\\xaa\\xfe\\x99\\x78\\xd9\\xd5\\xec\\x70\\xb9\\x99\\xe5\\xb2\\xca\\x8a\\xc7\\x9b\\x38\\x79\\xff\\x18\\x3c\\x3f\\xb1\\xbc\\x3e\\xa5\\xdb\\xdc\\x93\\xf4\\x50\\x0c\\x67\\xcd\\x6c\\x5b\\x1f\\x07\\x80\\xcc\\x66\\x39\\x4f\\x52\\xed\\x1f\\x38\\x59\\x07\\xf3\\x8f\\x63\\x60\\xca\\xe1\\xf1\\xe6\\xe4\\xe9\\x2f\\x52\\x54\\x7c\\xfe\\x3f\\xe9\\x69\\x9b\\x9d\\x3d\\xa1\\xb7\\x1f\\x67\\x2d\\xeb\\xc9\\xba\\x3b\\x30\\x03\\xe0\\x99\\x0d\\xd5\\xfb\\x4b\\xad\\x84\\x17\\x72\\x61\\xe6\\x49\\xb9\\xfa\\xff\\xf1\\xf6\\x25\\xe0\\x71\\x14\\x67\\xda\\x6f\\x75\\x57\\xcf\\x25\\xcd\\xd1\\xa3\\x39\\x74\\x6b\\x46\\x1a\\x49\\x96\\x46\\xd2\\x8c\\x7a\\x24\\x5b\\x97\\x2f\\xc9\\x92\\x83\\xb1\\x8d\\xb1\\x0d\\xd8\\x46\\x60\\x8c\\x2f\\xe4\\x1b\\xdb\\xd8\\x5c\\x6b\\x1b\\xaf\\xc1\\x86\\x70\\x38\\x40\\x6c\\x20\\x09\\xd7\\xfa\\xdf\\xec\\xb2\\x24\\xe9\\x1e\\x0d\\x4e\\x9e\\x2c\\x10\\x8e\\x04\\x4c\\xec\\xb0\\x59\\x02\\x5e\\x96\\x0d\\x81\\x84\\x63\\x19\\x1b\\x08\\x4b\\x82\\x21\\x01\\x8f\\xfe\\xa7\\xab\\x6b\\x46\\x33\\x3a\\x6c\\xb3\\xf9\\x9f\\x1f\\x3f\\x4d\\x55\\xcf\\x8c\\xba\\xeb\\x7b\\xeb\\xeb\\xaa\\xaf\\xeb\\xab\\xef\\xfd\\x54\\x5f\\x4c\\x2b\\x30\\xeb\\x76\\x15\\xdf\\x94\\xaa\\x37\\x7f\\xd0\\x2d\\xea\\x83\\x84\\x57\\xce\\x16\\x64\\xb0\\x28\\xdf\\x6a\\x09\\x6b\\x3e\\x99\\x39\\x76\\x8b\\xe4\\x24\\x73\\x59\\xf8\\xbc\\xb2\\x5b\\x73\\x9a\\xc6\\x95\\xc2\\x30\\xdc\\x47\\x09\\xf1\\x12\\xb3\\xde\\xc7\\x92\\x60\\x76\\xc6\\x8e\\x37\\x62\\xe5\\xcd\\x95\\xb0\\xc2\\x81\\xf6\\xdc\\x68\\x79\\xd5\\x16\\x21\\xaa\\x33\\x13\\x30\\xef\\xe2\\x01\\xf3\\x09\\x51\\xb0\\xe5\\x19\\x2b\\x9e\\x63\\x04\\xcd\\xb3\\xa9\\x37\\x37\\x72\\xde\\x92\\x7e\\x3d\\x1b\\x0e\\xa0\\xa7\\x56\\xa3\\xcb\\x05\\xec\\x01\\xe8\\x43\\x8c\\xeb\\xc7\\x9b\\xe6\\x65\\x33\\x16\\x6b\\xf2\\x8c\\xa5\\xd8\\x3c\\x31\\x99\\x10\\xbd\\x06\\xe5\\x8f\\x98\\x4c\\x3b\\x3d\\xf5\\x3e\\x17\\xec\\x8a\\xa2\\xe6\\x1b\\x91\\x57\\x66\\x27\\xdf\\x1a\\xce\\x62\\x6d\\x32\\xfc\\x3f\\x0a\\xf5\\x7a\\x68\\xf6\\x2e\\x89\\x3d\\x24\\xf4\\x66\\x8a\\x94\\xa6\\xde\\x4d\\xbd\\xf9\\xe6\\x0d\\x37\\xdc\\x70\\xc3\\x9b\\x92\\x9a\\xfa\\xf4\\x8b\\x23\\x2f\\x7d\\x91\\x7a\\x4b\\x10\\x76\\x2e\\x5d\\xba\\x9b\\x8d\\x89\\x7b\\x87\\x4e\\xd2\\xa3\\xa6\\x6a\\xd4\\x62\\x3b\\x6f\\x91\\x8b\\x53\\xad\\xa8\\x55\\x11\\xfd\\xb5\\x2c\\xcd\\x66\\x59\\xeb\\x4c\\xaa\\xb5\\x8c\\x87\\x9e\\xaf\\x1a\\xa9\\x36\\xfd\\x95\\xab\\xcc\\x99\\x54\\xcb\\x22\\x9a\\xcd\\x99\\x1c\\x2c\\x36\\x07\\x2c\\x61\\xcd\\xce\\x79\\x2e\\xcb\\x6a\\xf5\\xd1\\xde\\x53\\xc0\\x36\\x66\\xda\\x64\\xcd\\xe5\\x67\\x34\\x2c\\x60\\xab\\x9c\\x6a\\x95\\x1c\\x37\\xdb\\x3d\\x9c\\xd3\\xa7\\x25\\x64\\x2c\\x08\\x79\\x3d\\x30\\x96\\x85\\xf8\\xc6\\xf6\\xd6\\x16\\xb4\\xb6\\xa4\\x9d\\x05\\xf2\\x5e\\x22\\xbc\\x95\\xf8\\x78\\x2d\\x69\\x78\\xff\\x3f\\x2f\\x7c\\xa8\\x76\\x52\\xed\\xe6\\xe9\\xb3\\x2f\\x4e\\xbd\\xba\\x7e\\x49\\xc7\\xec\\xa5\\x74\\xce\\x1f\\x4e\\xfd\\x4c\\x5d\\xf7\\xfc\\x8c\\xb6\\xd4\\x7b\\xb7\\x3f\\xf5\\x64\\x79\\xf1\\x5b\\xbe\\xe0\\xec\\xe9\\x33\\x89\\xfd\\xce\\x25\\x47\\xce\\x9f\\xb1\\x64\\xef\\x35\\x5f\\xfe\\x58\\xd7\\x5f\\x16\\xc3\\x2e\\xbd\\x81\\x00\\xaa\\x11\\xc5\\x75\\x86\\x0f\\xca\\x20\\xe5\\xaa\\xb3\\x26\\xe3\\xae\\x4c\\x14\\x7b\\x53\\xb9\\x2b\\x1d\\xc5\\xde\\xcc\\x84\\xaf\\x71\\x26\\xd5\\x1a\\x63\\x2c\\xa7\\x25\\x8a\\xa2\\x79\\x9c\\x49\\x4d\\x21\\x61\\xad\\x06\\xb2\\x7b\\x30\\xdf\\x11\\x64\\x3b\\x4b\\x1b\\xe4\\x27\\xf2\\x5c\\xe5\\x55\\x21\\x96\\x8e\\x80\\xef\\x8d\\x12\\xcb\\xf5\\x61\\xbd\\x84\\x47\\xb2\\x8f\\xb1\\x23\\xaa\\xba\\xb6\\x66\\x74\\x18\\x7b\\x96\\x89\\x3a\\x32\\x96\\xdd\\xfc\\xd5\\x88\\x58\\xf6\\x9b\\xd8\\x60\\xb8\\x7e\\x8c\\x80\\xf6\\x5b\\x5f\\xcc\\x89\\x66\\x97\\x3a\\x74\\x83\\x75\\x6d\\x26\\xa6\\x3d\\x1b\\x8f\\x30\\xa2\\xb8\\x3e\\x1b\\x8f\\x50\\x0e\\x1e\\x75\\x23\\xf1\\x08\\x3a\\x93\\xd9\\x1b\\xc5\\x32\\x78\\x64\\xef\\x12\\xd3\\xc1\\x68\\x68\\x8c\\x1a\\x60\\xc4\\x0b\\x9b\\x22\\x6c\\xe9\\xec\\x7f\\x07\\x48\\x56\\x5c\\x3f\\x7b\\xe8\\xce\\x04\\xc8\\x70\\x70\\xbf\\xc2\\x87\\xe1\\x71\\x21\\xe1\\x01\\xfe\\xe2\\x82\\x61\\xdb\\x97\\x61\\x62\\x02\\x02\\xa8\\x43\\x0b\\x76\\x64\\x63\\xd2\\x98\\x83\\x89\\x32\\x8c\\x49\\x2b\\xc3\\xa4\\xde\\x99\\x54\\xeb\\x5d\\x8c\\xdc\\x20\\x83\\xc9\\x44\\x12\\xd6\\xea\\xb3\\x75\\x24\\x2a\\x1f\\x66\\x3a\\x52\\x5b\\x97\\xc6\\xa5\\xba\\xe6\\x6f\\xc0\\x65\\x84\\xf5\\x7c\\x56\\x65\\xb9\\x21\\x3d\\xd6\\x77\\x9e\\x5d\\x5f\\x68\\x3f\\xb7\\xa5\\x7b\\x33\\x2a\\x93\\xc1\\x27\\x8c\\x00\\x5a\\x30\\x15\\x4f\\x65\\xe3\\xd3\\x66\\x4d\\xc6\\x6b\\x75\\x23\\xa8\\xc9\\x91\\x1c\\x6c\\xae\\x6d\\xb2\\x84\\xb5\\x90\\x23\\x1b\\xb2\\xc9\\xc3\\x90\\x4d\\x63\\x90\\xb5\\x3a\\x93\\x83\\x2d\\xad\\x59\\x96\\x75\\x30\\x92\\x68\\x31\\x6a\\xad\\x2e\\x96\\xac\\x21\\x8d\\xe4\\x60\\xbd\\xa7\\xd3\\x12\\x4e\\x84\\x0d\\xf3\\x7a\\x3a\\x09\\x6b\\x9d\\x2d\\xb2\\x5b\\x57\\xb1\\x50\\x6d\\x73\\xc8\\xdf\\xce\\x50\\x8e\\x3b\\x0a\\x9b\\x18\\x98\\x93\\x0b\\x65\\x77\\x1c\\x3a\\x9a\\x39\\x7b\\x11\\xb5\\x26\\x97\\xec\\x56\\x5b\\x74\\xe5\\x54\\x83\\xe7\\x04\\xef\\x58\\x2e\\x89\\x73\\x43\\x7a\\xf3\\x08\\xeb\\xdc\\x7b\\x0e\\x80\\xef\\xcf\\xb2\\xd1\\xbf\\xea\\x4c\\xa3\\x4e\\xf9\\x73\\x7a\\x14\\x01\\x84\\x10\\x41\\x0c\\x0f\\x67\\xa3\\x3e\\x21\\x47\\x2b\\x1b\\xd3\\x10\\xeb\\x2f\\x99\\xd1\\x98\\x56\\x69\\x4e\\xaa\\xcd\\x0a\\x51\\x5b\\x22\\x6a\\xf0\\xb8\\x16\\x92\\x93\\x6a\\xc8\\xa5\\x56\\xeb\\x03\\x37\\xf7\\x67\\x54\\x1b\\xfc\\x1c\\xe1\\x2c\\xac\\xd5\\xa8\\xfe\\x7d\\x4c\\x4e\\x6a\\xad\\x24\\xac\\x85\\x82\\xb2\\x5b\\x2b\\xcf\\x6b\\xd7\\x75\\x37\\xee\\xb2\\xb0\\x24\\x19\\x31\\x63\\x70\\x6b\\x1c\\x1b\\xe6\\x73\\xd2\\xdb\\xb4\\xb5\\xcf\\x80\\xd4\\x4d\\xfd\\x33\\x81\\xb9\\x86\\xd8\\x2e\\xcc\\xe0\\xd7\\x49\\x6c\\x67\\xc0\\x70\\xe5\\xb1\\x63\\x5f\\x75\\xf1\\xc7\\x7a\\x37\\x9b\\xf8\\x39\\x7e\\xa6\\x39\\x08\\xa0\\x01\\x93\\xd0\\x83\\x7f\\xcd\\xc6\\x2f\\x9a\\x83\\x5f\\x6b\\x06\\xbf\\xfa\\x48\\xa2\\xd3\\xf0\\x9a\\x4c\\x4f\\xef\\x99\\xe5\\xf4\\xb5\\x5a\\xa3\\x33\\x39\\x18\\x6c\\xd4\\xd5\\xb6\\xcd\\x50\\xd6\\x46\\x17\\x33\\xef\\x33\\xca\\x5a\\xeb\\x89\\x59\\xc2\\x89\\x29\\xc6\\x97\\x53\\x22\\x89\\xda\\x0c\\xc3\\xad\\xd6\\x96\\x81\\x73\\x8a\\x9c\\x70\\x59\\xea\\xa3\\x21\\x7d\\x20\\xa8\\x35\\x00\\x6d\\x1d\\x47\\x6f\\xa7\\x77\\xca\\x6e\\xad\\x36\\x78\\x4e\\xd0\\x92\\x6c\\xf7\\xca\\x30\\xc4\\xd9\\xf4\\xd8\\x67\\x1c\\x3d\\xbd\\x69\\xaf\\x8b\\x23\\x8d\\xf8\\xaa\\xb4\\xe7\\xe5\\x0c\\xb0\\xff\\x91\\xfb\\x62\\xbe\\x32\\x19\\xd8\\xd3\\xfc\\x8c\\x3f\\x46\\x44\\xd3\\xd0\\x49\\xd3\\x1d\\x74\\x2e\\xdb\\xd9\\xd0\\x8d\\x1f\\x20\\x5e\\x03\\x84\\xd5\\x86\\x98\\x56\\x21\\x26\\x59\\x5d\\x53\\xcc\\x46\\x27\\xe8\\xd6\\xa3\\x45\\x4c\\xaa\\xd3\\x94\\x44\\x67\\x49\\x8d\\xcb\\x1e\\x56\\x27\\xc6\\xb4\\x4e\\xc9\\xe0\\xd6\\xea\\x61\\xe0\\x47\\x9c\\x49\\x35\\xe2\\xd2\\x47\\x56\\x95\\x2a\\x5a\\xa9\\x2f\\xa9\\x76\\x28\\x6a\\xa9\\x4b\\xeb\\x22\\x61\\xad\\xc8\\x93\\xd4\\x66\\x90\\xb0\\x16\\xc9\\x4c\\x43\\x13\\xe5\\x78\\x9e\\xab\\x41\\xd7\\xd9\\x52\\xb7\\x56\\x50\\xd7\\xde\\xae\\x76\\xc9\\x83\\x25\\x3e\\xe3\\xd5\\xab\\xc8\\xad\\x55\\x56\\xe9\\xe3\\x45\\x67\\x8d\\x8e\\x7b\\x65\\x5d\\x16\\x63\\x9c\\xea\\x32\\xbc\\xb1\\x23\\xf0\\x0e\\xa5\\xa3\\xd8\\x47\\xd2\\x68\\xd4\\x8c\\x9a\\xa8\\x32\\xbc\\x1a\\x4d\\xa9\\x3f\\x3d\\x31\\x7f\\xd6\\x85\\xfd\\xa9\\xf7\\x04\\x13\\x86\\x5e\\x5d\\xf5\\x4f\\x9d\\x93\\xff\\x61\\xf9\\xab\\x9f\\x9e\\xde\\x26\\xd0\\x1b\\x6f\\xec\\xbf\\x71\\xee\\x9c\\x29\\xc7\\x77\\xdc\\xf4\\x52\\x4f\\xd7\\xd1\\x6f\\x3e\\xf3\\xef\\x24\\xb4\\x60\\x7e\\xc7\\x8e\\xea\\xc1\\x2b\\xd7\\x0b\\x9a\\x40\\xd6\\x5c\\xb4\\x60\\xe9\\xe5\\x64\\xf2\\x43\\x8f\\x77\\x5e\\x70\\xe9\\xf9\\x6d\\x6e\\xd3\\xfe\\x27\\x27\\xb5\\xb4\\x4c\\x4a\\x7d\\xf1\\x87\\x07\\x4d\\x9b\\x6e\\x9e\\x50\\xf7\\x93\\xe8\\x79\\x17\\xce\\x9e\\xb1\\xf8\\x89\\xfb\\x3b\\x7b\\x27\\xd7\\xab\\x8b\\x88\\x2c\\x95\\x5e\\xbe\\xf1\\x06\\xc3\\xd6\\x9d\\x92\\x6a\\x61\\x3c\\x2f\\x65\\x2c\\x43\\x53\\xae\\x4f\\x89\\xe4\\xfa\\x94\\xac\\xe3\\xf9\\x94\\xd2\\x8e\\x24\\x39\\xa9\\x9a\\x95\\xc1\\x50\\xa1\\xcf\\x12\\xd6\\xc2\\xfe\\xa4\\x1a\\x8e\\x68\\x21\\x7f\\x72\\xb4\\x67\\xc9\\x27\\x3f\\x41\\xf3\\x0b\\x4a\\x02\\xc1\\xb3\\x79\\x96\\x58\\x30\\x7b\\x26\\xa6\\x28\\x3b\\xa8\\xaa\\xaa\\x72\\x94\\x67\\x69\\x0a\\x91\\x3e\\x3d\\xf2\\x19\\xcd\\xe5\\x88\\xa1\\x43\\x4f\\x7d\\x9a\\xfa\\x2b\\xc9\\xde\\x9e\\x66\\x10\\xc6\\xbc\\xfb\\xd3\\x2c\\xb6\\x98\\x43\\x6f\\x12\\x25\\xb5\\x24\\xd7\\x9d\\x04\\xd1\\xe0\\x5a\\x91\\xde\\x86\\x0f\\x25\\x08\\x61\\x01\\xe2\\x1e\\x5d\\x07\\xed\\xe9\\x18\\xc8\\x4a\\x31\\x99\\x28\\xb3\\x7a\\xa8\\x3d\\xac\\x95\\x49\\xc6\\x52\\x57\\xf9\\x71\\xcd\\xec\\x49\\xc6\\xcb\\x59\\x46\\x86\\x72\\xf0\\x7d\\x45\\xe6\\x72\\xce\\x00\\x02\\xcd\\x6e\\x10\\x7e\\xa8\\x56\\x99\\x87\\x32\\xb6\\xc0\\x3f\\x9a\\x6a\\xc5\\xb0\\xeb\\x86\\xf9\\x56\\xac\\x6f\\x8d\\x26\\x5b\\x59\\xcf\\xec\\xb9\\xb9\\x59\\x8c\\x2b\\xa4\\x8d\\xe4\\x52\\xae\\xd0\\xe7\\x4d\\xa9\\x53\\xa7\\x0f\\x73\\xde\\x95\\x6c\\x79\\x2a\\x10\\xc2\\xc5\\x23\\xe5\\x29\\x13\\x93\\x89\\x42\\x43\\x9e\\x42\\x2e\\x4f\\x91\\x21\\x4f\\x11\\x93\\xa7\\x28\\x23\\x4f\\x91\\xec\\x1e\\x74\\xc9\\x95\\x55\\xac\\xff\\xce\\x4d\\xa4\\x8c\\x96\\x33\\xbb\\x6c\\x6c\\x91\\x32\\xfc\\x31\\xfc\\xed\\x68\\x4c\\xa1\\x38\\x8f\\x0c\\x79\\x6f\\xd8\\x16\\x63\\x72\\x99\\x08\\x93\\x6b\\xc2\\x68\\xb9\\x6a\\xc4\\x64\\x22\\x68\\xc8\\x15\\xd4\\xe5\\xaa\\x8b\\xa8\\x95\\x86\\x5c\\x95\\x4c\\xae\\x4a\\x5d\\xae\\x7a\\x5d\\xae\\x4a\\x26\\x57\\x49\\xe9\\xd7\\x90\\x6b\\xd8\\xb2\\x3a\\x73\\x77\\xad\\x4e\\x5b\\x54\\xa5\\x67\\xea\\x31\\xf1\\x6d\\xc3\\x96\\x3a\\xfd\\x6d\\xa3\\xd3\\x28\\xef\\xb3\\x63\\xf0\\x31\\x76\\xc8\\x5a\\xdc\\x36\\x52\\xba\\xa0\\x98\\x4c\\x94\\x1a\\xd2\\x95\\x4a\\x49\\xd5\\x1f\\x51\\x43\\x31\\xad\\xd0\\x9c\\x54\\xab\\x15\\xf6\\x4a\\xe6\\x3f\\xce\\x22\\x1a\\x8b\\x5d\\x2c\\x88\\xaf\\x56\\x4e\\xaa\\x65\\xfa\\xb4\\xad\\x8b\\x5f\\xc6\\xc4\\x2f\\xd3\\xc5\\xd7\\xdf\\xc4\\x8a\\xfd\\xb2\\x3b\\x61\\xcd\\xb3\\x31\\xf9\\xd5\\x90\\x1c\\xb7\\x7b\\x82\\xfa\\x43\\x59\\x5b\\x66\\x84\\xaa\\x9b\\x65\\x55\\x6e\\x87\\x66\\xb5\\x67\\xe2\\x70\\xc7\\x41\\x24\\xe8\\xcd\\x80\\xa1\\xcf\\xd8\\x63\\x03\\x72\\x31\\xb1\\x29\\x69\\x28\\x64\\x62\\x1b\\x1b\\x8e\\xe4\\xb1\\x63\\xa7\\x6f\\x67\\x50\\x08\\x4e\\x7d\\x92\\x16\\x86\\xe2\\x00\\xf9\\xa1\\xf4\\x36\\xf3\\x83\\xd5\\xa7\\xfd\\x60\\x8c\\x3a\\xe5\\xdc\\x1c\\x6c\\x73\\xd9\\x63\\xd3\\x45\\x42\\xd2\\x1b\\xa6\\xd4\\xa9\\x2f\\xeb\\x69\\xc7\\x97\\x2f\\xc0\\x78\\xe7\\x16\\x76\\x4b\\x47\\xc7\\xbb\\xee\\x59\\x9d\\x6b\\x7b\\x0c\\x95\\xfd\\x80\\x84\\xe8\\xb3\\x4c\\x33\\xbf\\x9c\\x6a\\x5c\\x1a\\xc2\\xd0\\xe3\\x80\\x70\\xa7\\xf4\\x51\\xae\\x6f\\x8d\\x7c\\x3d\\xdf\\xda\\xc2\\xb4\\xfe\\xd8\\x48\\x88\\xbe\\xc3\\x77\\xf0\\x94\\xf1\\x5b\\x40\\x1c\\xfa\\x0e\\x20\\xdc\\x2f\\x1d\\xe6\\xbe\\xb5\\x99\\xdc\\xb7\\xc6\\xd6\\x5b\\xac\\x46\\x48\\x96\\x45\\xe1\\x1c\\x33\\xff\\x4b\\xef\\xda\\x4a\\x62\\x0b\\x90\\x50\\x31\\xb1\\xd1\\x13\\xc7\\x8e\\x7d\\xe9\\xd3\\x6f\\xad\\xd7\\x20\\x20\\x3a\\x74\\x92\\x6e\\x92\\x3e\\x42\\x10\\x4d\\x58\\x88\\x4c\\x22\\x36\\xb5\\x21\\xa2\\x89\\x96\\x0c\\xc3\\x9b\\x91\\x86\\x8d\\xad\\x88\\x97\\x72\\x72\\xb7\\x09\\x95\\xb2\\x3b\\x21\\xe6\\x9b\\xbd\\x15\\xba\\xc6\\x95\\xca\\x9a\\xaf\\x50\\x1f\\x24\\x1b\\xaa\\x8d\\x04\\x36\\xa2\\xac\\x99\\x8c\\xf8\\x5a\\x36\\x0f\\xf8\\x27\\x35\\x91\\x5a\\x73\\xed\\xa4\\xda\\x26\\xa2\\xbf\\xf8\\xfb\\x27\\xf9\\xcd\\x3e\\xf7\\x08\\xa6\\x13\\xb6\\xc6\\x19\\x25\\xf6\\xff\\xbe\\x70\\x7f\\x0b\\x75\\xcc\\xeb\\xfa\\x6c\\xee\\x33\\xa4\\x62\\xd6\\x84\\xfe\\x45\\x8f\\xf4\\xbe\\x30\\xe7\\xd1\\x55\\x57\\xa7\\x5e\\x38\\xf9\\x71\\xea\\x37\\x24\\xb4\\x6f\\xcb\\xd6\\x5b\\xab\\x76\\x5d\\x72\\xfd\\x1e\\xf2\\xea\\x1f\\x88\\x1c\\x6b\\xa4\\x0b\\xee\\x98\\xb4\\xef\\xea\\x35\\x26\\x57\\x69\\xfe\\x1b\\x05\\x3d\\x91\\xf5\\x57\\x2f\\x59\\x93\\x3a\\x71\\xe8\\xe7\\x7f\\x4d\\x3d\\x4f\\x8a\\x7e\\xbd\\xe9\\xfe\\x67\\x0f\\x6c\\xab\\x6d\\x79\\x50\\xd7\\x13\\xc6\\x1d\\x63\\x0a\\xa3\\x00\\xb5\\x78\\x60\\x98\\x3d\\xa6\\x98\\x39\\x3c\\x1c\\xc9\\xc1\\x50\\x71\\xd0\\x12\\xd6\\xfc\\x8e\\xe4\\x48\\x42\\x99\\x09\\xd9\\x84\\x32\\x83\\xb5\\x05\\xba\\x59\\xc8\\x13\\x1c\\x7a\\xd2\\x96\\x5f\\x16\\xcf\\xcc\\x60\\x99\\x2d\\xcf\\x12\\x4e\\x94\\x1b\\x16\\x61\\xdd\\x30\\xe9\\x8c\\x96\\x57\\x2b\\xbb\\x07\\x4d\\xfe\\x62\\x63\\xf6\\xe4\\x04\\x4b\\x5a\\x90\\xc8\\x6e\\xb5\\xb6\\x5d\\x2d\\x36\\xb2\\xec\\x8c\\xc5\\x44\\x33\\x96\\x1b\\x6e\\x24\\x3b\\xcd\\x2f\\x46\\xbc\\x8e\\x8c\\x62\\xab\\x91\\xea\\xb3\\x9d\\x71\\xa2\\xc1\\x5b\\x23\\xbd\\xcd\\x7d\\x71\\x7d\\xd9\\xbe\\x38\\x3e\\xa7\\x9c\\xab\\x23\\x2e\\xcf\\x45\\x33\\x8e\\xb8\\x1c\\x16\\x9b\\xac\\x55\\x8e\\x31\\xa9\\x6c\\x0e\\xb0\\x47\\x7a\\xf7\\x38\\x7c\\x36\\xf4\\x49\\x7d\\x12\\xec\\x1a\\x66\\xb5\\xc9\\x6e\\xf3\\x28\\xdf\\x5b\\x86\\x6d\\xe7\\xcc\\xbe\\xb7\\x3c\\x3a\\xda\\xf7\\x76\\x06\\xe6\\x1d\\x36\\x4a\\x8c\\x43\\xbf\\x33\\x93\\xfb\\xdd\\xc6\\x63\\xe1\\x11\\x7e\\xc4\\x27\\x3a\\xde\\x6e\\x13\\xc6\\xf2\\xb7\\xf1\\x99\\xe0\\x5c\\xfd\\x6d\\x79\\x2e\\xd9\\x43\\x47\\xfa\\xdb\\x72\\x41\\xcf\\x5d\\x31\\x18\\x13\\xf8\\xfd\\xe9\\x31\\x69\\xde\\x38\\xd8\\x8b\\xaf\\xf3\\xe9\\xac\\x34\\x8b\\x54\\x28\\x2d\\x47\\x98\\xfb\\xd8\\xae\\xcb\\xf2\\xb1\\x79\\xf4\\xc7\\xa8\\x24\\xdb\\xb9\\x66\\x88\\xd6\\x20\\x66\\x7b\\xd9\\xd4\\xa0\\xa2\\x56\\xba\\x32\\x7b\\xcf\\x22\\x7c\\x58\\x51\\xfd\\x6c\\x8c\\xce\\xf6\\xad\\xb1\\x01\\x26\\x4f\\xf6\\x94\\xd0\\x31\\x5d\\x6b\\xb9\\x12\\x8f\\xf1\\x78\\xc8\\xe3\\x0b\\xbf\\x77\\xc4\\x93\\x32\\x9e\\xfa\\xe5\\x67\\x3d\\x2f\\xa7\\xdd\\x59\\x38\\x50\\xae\\x87\\x47\\x33\\xfe\\xb4\\x55\\xd9\\xfe\\xb4\\x34\\x2d\\xd1\\x38\\xfe\\x34\\xd5\\xed\\x32\\x12\\x9c\\x39\\x64\\xfd\\x37\\x23\\x1c\\x6b\\x6a\\x40\\xff\\x2a\\xc7\\xa1\\x96\\x47\\x33\\x0e\\xb5\\x11\\x1d\\x9d\\x7e\\xc5\\x4e\\x8b\\xa9\\xcf\\xd9\\x39\\xa2\\xee\\x24\\xb6\\x55\\x69\\xf1\\xc8\\x3c\\x62\\x1b\\xd9\\xcb\\xbf\\x3f\\x76\\xec\\x74\\xc1\\xb0\\xc2\\xbe\\x6e\\xac\\xa3\\x8b\\x98\\x8a\\x43\\x74\\x06\\x4d\\xcf\\x49\\x4d\\xe0\\xe9\\x72\\x78\\x48\\x23\\x4b\\x9a\\xc3\\xd3\\x8b\\xd0\\xe3\\xaa\\xc5\\xc8\\x67\\x66\\x53\\x86\\xf3\\x1c\\xb2\\x96\\xe8\\xc7\\x54\\x2a\\x9d\\x5e\\x47\\xaa\\x53\\xff\\x45\\xaa\\x85\\xc9\\xef\\xbc\\x93\\x5a\\x9d\\x4c\\x8a\\x75\\xc9\\xa4\\xa1\\x4b\\x5b\\xe8\\x34\\xfa\\x33\\xee\\x67\\x5b\\x99\\xed\\x67\\xe3\\x36\\xfa\\x39\\xf9\\xd9\\x9e\\x30\\xcb\\x1e\\x9a\\x71\\xb4\\x59\\xce\\xe2\\x68\\x6b\\xe5\\xf3\\x51\\xcc\\x88\\x3e\\x64\\x09\\x97\\xc6\\x71\\xb4\\xe9\\xa0\\x46\\xd8\\xb3\\xaf\\x5c\\xd6\\xd0\\xf7\\xc8\\xea\\xa5\\xab\\x52\\xff\\xf3\\xc7\\xe8\\xa2\\x09\\x33\\x1f\\x59\\xbd\\x72\\x80\\x54\\xc9\\x6e\\x13\\xa1\\x05\\x75\\xfe\\xab\\x07\\xee\\x71\\x56\\x7b\\xaf\\x1e\\x70\\x39\\x4c\\x06\\xba\\x2e\\xc7\\x5d\\xbf\\x99\\x75\\x72\\xbf\\x8e\\xb0\\x23\\xff\\xee\\xdf\\xcc\\xfc\\xe3\\x81\\x29\\x57\\x55\\x12\\xa1\\xc0\\x62\\xfd\\xf1\\x5d\\x29\\xd5\\x2c\\x25\\xee\\xf1\\x4e\\xbc\\xa2\\x92\\xb0\\x77\\x38\\xc6\\xfd\\x23\\x1d\\x45\\x01\\x0a\\x71\\xc9\\xb8\\xec\\x3f\\x45\\x63\\x39\\x89\\x8a\\xd3\\x4e\\x22\\x8f\\xd7\\xf0\\xb2\\xc9\\x3e\\x7f\\x21\\x4f\\xb6\\x75\\x56\\x2a\\x20\\x36\\x30\\x8f\\xe2\\x03\\xda\\x68\\x78\\xdd\\x46\\xb1\\x02\\xd1\\x21\\xc3\\xe9\\x96\\xdb\\xde\\x05\\x5f\\xbf\\xbd\\xcc\\xeb\\x26\\x7b\\xbc\\x46\\x3b\\xe5\\xb8\\xc3\\xe7\\x67\\xab\\x79\\x67\\x6c\\x2b\\xf3\\xc0\\x8d\\xe6\\x2e\\xea\\xe1\\x6f\\x1a\\xa3\\x5a\\x2b\\x7e\\x39\\xbc\\x5f\\xce\\x68\\xef\\x47\\x28\\x40\\x29\\xfa\\xc7\\x6d\\x6f\\xd9\\x58\\xed\\x2d\\x1f\\x81\\x6f\\x42\\xf6\\xf9\\x8b\\x4b\\x79\\x2a\\x59\\x47\\x61\\xd1\\xd9\\x1b\\x9e\\x19\\x88\\x47\\x35\\x7e\\x20\\xe3\\x90\\x1b\\x8d\\x75\\x59\\xb6\\x3f\\xce\\x68\\xff\\x61\\xb6\\x03\\xb8\\x44\\x1f\\x6f\\x73\\x25\\xf0\\xea\\x46\\x62\\x51\\x4c\\xf3\\x98\\x93\\x6a\\xa1\\x32\\x2c\\x50\\x69\\x96\\x40\\xaa\\x9f\\x11\\x23\\xc8\\x49\\xd5\\x13\\xd1\\xfc\\x39\\xfe\\x39\\xb5\\x50\\xff\\xaa\\x44\\x36\\xc8\\xe8\\x0a\\xfd\\xb2\\x5b\\x93\\x4d\\xed\\xed\\x6a\\x89\\xcc\\xd2\\x97\\x9d\\x55\\x3c\\xc3\\x53\\x37\\x4a\\xba\\x45\\x86\\xa7\\x6e\\xb4\\x68\\x21\\xee\\xa8\\x13\\x0c\\x7e\\x24\\xe9\\x28\\xbc\\x28\\x66\\xac\\x68\\x23\\x18\\x92\\x4a\\x32\\x0c\\x49\\xa5\\x24\\xac\\x99\\x74\\xab\\x5d\\x07\\xfc\\x1c\\xb9\\x92\\x58\\x00\\xc0\\xb8\\x84\\x49\\x0e\\x1e\\xa1\\x38\\x9a\\x37\\x89\\x3e\\xc3\\x15\\x47\\xc0\\x75\\xa9\\x2b\\xe8\\x2c\\xc6\\xa5\\x19\\xc4\\x12\\xce\\x9d\\xe7\\x17\\x0d\\x06\\x66\\xc3\\x32\\x2c\\x17\\x93\\xaa\\x3b\\xa2\\x92\\x48\\x3a\\x4d\\x81\\x4b\\xb7\\x0f\\x3d\\x8a\\xa2\\xba\\x8c\\x5c\\x05\\xb6\\x74\\xae\\x02\\x97\\xec\\xe6\\x14\\xc0\\x7e\\x4e\\x9d\\x67\\x2a\\x1f\\x8f\\x02\\x58\\x0e\\xca\\xb9\\xe4\\x79\\xd7\\x91\\x50\\x64\\xf7\\x45\\x9c\\x3b\\x2f\\xf5\\x26\\xa9\\x1a\\xe6\\xcf\\x33\\x15\\x9e\\xd6\\xa6\\xf5\\x66\\xd3\\xe7\\x91\\x87\\x49\\x5d\\x36\\x81\\x9e\\xc8\\x71\\x3e\\xcc\\xbc\\xb9\\x65\\xb8\\x0a\\x71\\xbf\\xae\\x31\\x25\\x31\\xcd\\x67\\x4e\\xaa\\xc5\\xca\\x28\\xe0\\xcb\\x23\\xaa\\xef\\xb8\\x56\\x24\\xb3\\x24\\xa3\\x92\\x8e\\xbd\\x2b\\x69\\x90\\x67\\x94\\xc9\\x49\\xad\\x82\\x84\\xb5\\x22\\x9f\\xec\\x1e\\x24\\xb2\\xcd\\xab\\x3f\\x09\\xc5\\xb2\\x26\\xd2\\x73\\xef\\x17\\xae\\x30\\xe3\\x76\\xcd\\xe7\\x06\\x95\\xc4\\x18\\x3d\\x93\\x64\\x9a\\x23\\x60\\xd9\\xd0\\x49\\x73\\x37\\xcb\\x5f\\x58\\x8d\\xad\\x46\\x7c\\x1d\\x63\\x37\\xcd\\xa4\\x31\\x34\\x0b\\x3c\\xb3\\x91\\xb1\\x57\\x43\\x4c\\x26\\xf2\\x1c\\x5e\\x6a\\x78\\x5e\\xd3\\x94\\x97\\x85\\xc3\\xc9\\x0b\\x9d\\x6c\\xde\\x8a\\x3b\\xcb\\x19\\x6f\\x8a\\xd5\\x1a\\x56\\x5d\\xca\\xe0\\x34\\xa7\\xdd\\x1a\\x66\\x9e\\xaf\\xf2\\x42\\xd9\\xad\\x79\\x69\\x7b\\xbb\\xea\\x94\\x55\\x77\\x66\\x4b\\x8b\\xe2\\xf3\\x0f\\xef\\x34\\x0d\\x66\\x65\\x97\\x48\\xd3\\x05\\x2e\\x23\\x73\\x89\\xa3\\xf7\\xce\\x0b\\xc4\\x65\\x99\\xcd\\xa7\\xdf\\xeb\\xbf\\xa9\\x27\\xf5\\x69\\x4a\\x25\\x55\\xdf\\xbf\\x77\\xc2\\x05\\xb5\\x8d\\x73\\x6a\\xee\\xfd\\x3f\\x2c\\xe7\\x8e\\x95\\xcc\\xce\\xb7\\xf2\\x2d\\xa9\\xb6\\x3c\\x72\\x3e\\xb1\\x1d\\x7e\\x9a\\x4a\\xd4\\x44\\xa5\\xa7\\x9e\\x00\\xb7\\xb9\\xcc\\xf9\\x74\\x2e\\x2a\\x11\\x45\\x3b\\xae\\x47\\x3c\\xa0\\xbf\\xb9\\x14\\xc7\\xb4\\x1a\\x31\\xa9\\x16\\x28\\x6c\\xb6\\x54\\x6d\\x31\\xad\\x51\\x4c\\xaa\\x93\\x94\\x84\\xe2\\x0c\\xe8\\xf2\\x2a\\x52\\x26\\x8b\\x76\\x95\\x33\\xa9\\x56\\x19\\xeb\\xd7\\x76\\x4f\\x92\\x39\\x5d\\x62\\x55\\xb2\\x7b\\x9a\\x95\\xda\\x9c\\x05\\xc5\\x01\\x57\\x5d\\x33\\xa3\\xca\\x91\\x8d\\xad\\x05\\x5a\\x4d\\x40\\x76\\x6b\\xfe\\x32\\x43\\x68\\x5f\\xbb\\x46\\x1b\\x33\\x24\\x89\\xc6\\xe4\\x39\\xfe\\xe2\\xe8\\x08\\xe3\\xb9\\x3a\\xbd\\x96\\xa0\\x4f\\xa2\\x3b\\x8f\\xf4\\x4c\\x7f\\x6a\\xfb\\x88\\xd5\\x84\\x9d\\xbf\\x9c\\xd1\\x73\\x64\\x67\\x8e\\x55\\x2d\\x56\\xf0\\xb5\\x05\\x63\\x36\\xbd\\x6c\\xc1\\xc2\\xfe\\xec\\xa5\\x85\\xfe\\x8b\\x2e\\xea\\xcf\\x36\\xb2\\x57\\x66\\xd6\\xc8\\x0c\\xdf\\xbf\\x1d\\x56\\x66\\x95\\xad\\x19\\xe5\\xfd\\x57\\x1d\\x31\\x2d\\xcf\\x9c\\x54\\x9d\\x0a\\x4b\\xb2\\x60\\xec\\x03\\x18\\xb4\\x9b\\x2d\\x96\\xb0\\x66\\x93\\x59\\x9e\\x1a\\xbb\\x9c\\x1c\\x74\\xb0\\x0f\\x64\\xd9\\x48\\xba\\x60\\xb1\\x19\\x04\\x69\\x0e\\xbb\\xec\\xd6\\x04\\xb1\\xbd\\x5d\\x93\\xcd\\x9c\\x09\\x7b\\x8c\\xed\\x02\\xc3\\x1a\\x9e\\xbd\\x63\\xe0\\x1d\\xbe\\xef\\x38\\x6b\\xc3\\x80\\xc2\\xf4\\x99\\xe0\\x56\\xfa\\xae\\xb8\\x56\\xfa\\x18\\x16\\x94\\xb3\\x7c\\xd3\\x52\\x4c\\x13\\x68\\x92\\xb0\\xf0\\xde\\x34\\x13\\x5d\\x3a\\x54\\xd1\\x98\\x4b\\x6e\\x4d\\x4f\\x1d\\xf4\\xdd\\xcc\\x44\\x41\\xb0\\x9d\\xbe\\x2c\\xae\\x90\\xfe\\x82\\x02\\x5c\\x00\\xc6\\xc1\\xec\\x48\\x0e\\xba\\x4c\\x76\\x0b\\xf7\\xc5\\xb1\\xed\\xd5\\x89\\x82\\xcc\\x9b\\xaa\\x95\\x84\\x13\\x36\\xc3\\xd6\\x66\\x24\\x82\\x05\\xb2\\x5b\\x13\\xd9\\x10\\xe5\\xb2\\xb3\\x17\\x78\\x4d\\x34\\xf1\\xc8\\xaa\\xb1\\x6c\\xeb\\xed\\x23\\x5f\\x35\\xbf\\xc8\\xd9\\xe6\\x99\\xc3\\x83\\x81\\x1c\\x96\\x8b\\xbf\\xe5\\xbb\\x3b\\x84\\xc5\\xf4\\x25\\x71\\x32\\x44\\xf8\\xd3\\x59\\x1c\\xf5\\x63\\x04\\x29\\xc3\\x1d\\xb4\\x4b\\x58\\xcc\\xf8\\x05\\xd6\\x08\\x8b\\xa5\\x87\\xcf\\xfa\\xfb\\x35\\xd2\\x44\\xfe\\x7b\\x45\\xfc\\x9c\\x2c\\x37\\x15\\x8e\\x95\\x77\\x1b\\xc7\\x35\\xc9\\x6f\\xe4\\xdd\\x96\\x8c\\x34\\x41\\xec\\xaf\\x0b\\x62\\xa2\\x57\\x79\\xf4\\xae\\x2e\\xf1\\xf3\\x67\\xc8\\xb2\\xd4\\xc3\\xcf\\x1a\\xed\\x6c\\x17\\xbf\\x20\\x6b\\xc7\\xbe\\x0e\\x39\\xae\\x51\\xff\\x18\\xf9\\xbb\\x63\\x5e\\xb1\\xbd\\xeb\\xd4\\xa3\\xe2\\x17\\xe4\\xb2\\xe7\\x9f\\x4b\\x3d\\x6a\\x5c\\x47\\x49\\xfd\\x85\\xac\\x20\\x15\\x5f\\xe3\\x3a\\x2c\\xc5\\x7b\\xd7\\xa9\\x7b\\x52\\x7f\\x21\\x36\\x52\\x9a\\xfa\\x73\\xea\\x7d\\x7d\\x2e\\x53\\xc4\\xcf\\x85\\xc7\\x59\\x7b\\xf2\\xd0\\xcd\\xb4\\xcc\\x14\\xe3\\x17\\x63\\x94\\x52\\xf9\\x69\\xf9\\x54\\xc9\\x48\\xfc\\x91\\xe7\\x37\\x32\\x22\\x71\\x51\\x55\\x93\\xcc\\x18\\x73\\x99\\x71\\x9d\\x16\\x3b\\x96\\x11\\x7e\\x61\\x16\\x00\\x1c\\x06\\x41\\xc7\\x40\\x78\\xf2\\xcc\\xf7\\x34\\x64\\x50\\xa9\\x8b\\x89\\x61\\xe3\\xf7\\xe4\\xe2\\xa8\\x66\\x59\\x35\\xa5\\x13\\x44\\xa5\\x21\\x8a\\x15\\xa4\\x81\\x7a\\x36\\x0b\\x2c\\x0e\\x99\\x00\\x65\\xa8\\x42\\x78\\x8c\\xd4\\xb3\\x7b\\x7e\\x03\\xac\\xdb\\x62\\x09\\x8b\\x71\\x4f\\x21\\x7d\\xcf\\x04\\x65\\x49\\xf1\\xf9\\x6d\\xf5\\x87\\xa0\\x88\\x86\\xcf\\x70\\x67\\x7f\\x81\\x9c\\xb9\\xb3\\xd2\\xf5\\xfe\\xa3\\xaf\\x75\\xfd\\xf7\\xa3\\xbf\\x27\\xf9\\x18\\xfa\\x53\\xea\\x03\\xe2\\xf9\\xfc\\x4f\\xa9\\x0f\\x8c\\x3d\\x36\\xe4\\xa4\\xb0\\x82\\xda\\x60\\xd7\\xdf\\x95\\xf2\\x22\\x09\\xca\\x6e\\xcb\\x0b\\xa2\\xbf\\x09\\xe2\\x78\\xc2\\xc2\\x78\\x13\\x78\\xa1\\x39\\xb9\\x0a\\x66\\xc7\\xaf\\xef\\xdd\\xbd\\x76\\xc3\\xee\\x9b\\xd6\\xaf\\xdf\\x2d\\x1c\\x5b\\xb2\\x62\\xd7\\xce\\x95\\x4b\\x56\\xde\\xf8\\x77\\x6c\\x0e\\xd8\\x0f\\x48\\x05\\x2c\\x1f\\x3b\\xdf\\x7f\\xcf\\x62\\x2b\\xa8\\x25\\xc6\\xf2\\xd3\\x6b\\x92\\x55\\x51\\xb2\\xb2\\xb3\\xe7\\x67\\xdb\\xb3\\x74\\x38\\x1b\\x57\\x3a\\xc3\\xd9\\x70\\x16\\xb6\\xf4\\xb1\\x9f\\x84\\x0e\\x92\\xd0\\x2e\\x23\\x9f\\x6b\\xfa\\x00\\xc1\\x3a\\x1c\\x14\\xa6\\xb2\\xb8\\xf8\\x20\\x88\\x6a\\x66\\x62\\x48\\xac\\xfd\\xaa\\xa8\\xb0\\xeb\\x31\\x25\\xa1\\x86\\x62\\x30\\xee\\x9d\\x75\\x06\\xe9\\x8e\\x50\\x96\\xcd\\xb5\\x33\\x0f\\x07\\x85\\x50\\xee\\x75\\x54\\x41\\xe1\\x97\\x1a\\xbe\\x0e\\xd1\\xaf\\xc3\\xc3\\xef\\xe7\\x8d\\x8a\\xb7\\x07\\xc1\\xcc\\xa1\\x93\\xe2\\x47\\xd2\\x2f\\x10\\xc6\\xdf\\x21\\x5e\\x0b\\x83\\x38\\x9f\\x45\\x3b\\x68\\xb2\\x98\\x4c\\x80\\xd4\\xda\\xec\\xcc\\x22\\x86\\x29\\xa9\\x96\\x28\\x09\\x89\\xb2\\x0f\\xfc\\x31\\x4d\\x32\\x19\\xac\\xd7\\x0d\\x11\\xb5\\xfe\\xb8\\x26\\x98\\x14\\x45\\x2b\\x73\\x26\\x35\\x4f\\xa1\\xa2\\xc4\\xcb\\xea\\xd9\\x6a\\x7a\\x89\\x95\\x85\\x96\\xd7\\x97\\xe9\\x67\\xf5\\xb0\\x32\\xf7\\x63\\x23\\xe3\\x3b\\x0d\\x30\\x96\\x1b\\x4d\\x96\\xd2\\xf6\\x70\\x6b\\xac\\xb5\\xaa\\x35\\xc6\\x27\\xc4\\x34\\x51\\x3d\\xe7\\x53\\xf3\\x66\\x11\\xc1\\x62\\x32\\x99\\x79\\xf7\\xdd\\x77\\x93\\xc6\\x3f\\x77\\x6d\\x99\\xe1\\x6d\\xbd\\xba\\x6d\\xdb\\x5e\\xf2\\x78\\x6a\\xa1\\x7e\\xec\\xbd\\xb6\\x63\\x63\\xcc\\xdb\\x7e\\xfd\\x94\\xcf\\x52\\xaf\\x90\\x17\\x8f\\x6c\\x3d\\x62\\x3f\\x4a\\x2a\\x5d\\xce\\xf7\\x5c\\x05\\x8f\\x0c\\x38\\x8f\\x6c\\x3d\\x62\\x59\\xfe\\x2d\\x59\\x7e\\xc7\\xe9\\x22\\x05\\xcf\\x5a\\xf4\\xe7\\xf8\\x0a\\xf1\\x1e\\xba\\x9c\\xe5\\x25\\xf2\\xe3\\x6e\\xce\\x8d\\x46\\xec\\xb1\\xb4\\x8e\\xc7\\x25\\x67\\x81\\xa2\\x28\\xec\\xf3\\xf4\\x47\\xac\\x0e\\xc3\\xc7\\x2d\\x1a\\xec\\x71\\xa6\\xe3\\x09\\x89\\x8d\\xfc\\x63\\xa7\\x2f\\xd2\\xc7\\x00\\x0b\\x19\\xde\\xef\\xcc\\x62\\x6c\\x12\\xce\\x61\\x92\\x1a\\x97\\xfe\\x96\\x60\\xb3\\xa7\\x93\\xcc\\x0c\\xe6\\xe5\\xbb\\xbd\\xdc\\xe5\\x17\\xf4\\x56\\xc9\\x55\\x32\\x91\\x19\\x31\\xab\\x5c\\x25\\xd7\\x8a\\x55\\xa2\\x59\\xbe\\x82\\xdc\\xb9\\x6b\\x3f\\xb9\\xe4\\xa1\\xed\\xa6\\x6b\\x1f\\xb8\\xc9\\x34\\x70\\xde\\x06\\x93\\x34\\x73\\x60\\x20\\x35\\x97\\xc4\\x53\\xb3\\x85\\xb2\\xd4\\x01\\xb2\\xe6\\xf4\\x3b\\xa4\\x98\\xa4\\xde\\x23\\xf5\\x24\\xf5\\x1f\\x20\\x8c\\x4c\\xa1\\x8d\\xb6\\x41\\x44\\xab\\xa1\\xe7\\x09\\x42\\x61\\xa6\\xe1\\xec\\x7a\\x86\\xe2\\x93\\x31\\x71\\xf0\\x82\\x8f\\xea\\xcd\\x72\\x50\\xd6\\x2f\\xf0\\x25\\xe7\\xa8\\xf3\\x00\\x74\\x19\\xcb\\x59\\x50\\xa2\\x5b\\x4f\\x3e\\xdd\\x7a\\x2a\\x34\\x58\\xc3\\x35\\xb9\\x28\\x96\\x93\\xba\\x20\\xdf\\x60\\xeb\\x3e\\x7b\\xea\\x02\\xd5\\x6b\\xac\\xd8\\x94\\x70\\x26\\xef\\x42\\xaf\\xec\\x66\\x04\\xd9\\xfa\\xcb\\x93\\x8d\\x25\\x4b\\x3a\\xc7\\xbc\\x06\\xba\\xdd\\xe0\\x79\\xe4\\x2f\\x7f\\x98\\x7b\\xdf\\x8a\\xfa\\xf3\\xb6\\xcf\\x59\\xb9\\xf2\\xb5\\xd7\\x52\\xbf\\x15\\xf6\\x91\\x90\\xb8\\xfe\\x57\\xb3\\x8e\\xbd\\x59\\x51\\xf6\\xbe\\xaf\\xb0\\x7f\\xf1\\x2c\\x96\\xdf\\xe0\\xab\\x7b\\x98\\xdb\\x40\\x40\\x09\\x40\\x77\\x72\\x99\\xb6\\xe4\\xca\\x94\\x95\\x8c\\xc1\\x1a\\x51\\x8b\\x62\\x83\\x0e\\xab\\xc9\\x11\\xd6\\xec\\x79\\x7f\\x93\\x68\\xa6\\x6c\\x91\\xce\\x2c\\xcc\\xa8\\x44\\x0d\\xc2\\x43\\x4c\\x98\\x91\\xc9\\x1a\\xbe\\xba\\x27\\xcd\\x5b\\x2f\\xea\\xf2\\x98\\x27\\x33\\x79\\x22\\x88\\xe1\\x17\\x86\\x44\\x5a\\x63\\x94\\x73\\xd7\\x0f\\xca\\x45\\xba\\x91\\xca\\x04\\x8b\\x17\\x14\\x86\\x15\\x45\\x51\\xab\\x23\\xba\\xd1\\x5b\\x9e\\x9f\\xe4\\x1c\\xa0\\x4c\\xc0\\x96\\x73\\x15\\xb0\\x89\\x84\\xd5\\x62\\x45\\x6b\\x64\\xdc\\x81\\xf1\\xc6\\x26\\xfd\\xbb\\xc6\\xb0\\x35\\x1c\\x6f\\x6a\\xd4\\xab\\x4d\\x85\\x56\\xb6\\xe7\\x23\\xaa\\xdb\\xca\\x4e\\x63\\x9b\\x4c\\x53\\x1a\\x07\\x2d\\xda\\x28\\xbb\\xb5\\xea\\xf2\\xf6\\x76\\x35\\x26\\x6b\\x95\\x41\\x1d\\x99\\x6a\\xc2\\xe8\\x7b\\xb4\\x72\\xdd\\x4e\\xb4\\x1a\\xfb\\x38\\xc6\\xc1\\x28\\xf8\\xb5\\xb0\\x6b\\x19\\x47\\x35\\x46\\xa2\\x39\\x9e\\xae\\x18\\xd8\\x5e\\x9a\\xc1\\xf6\\xf1\\x91\\xd8\\xc6\\xe5\\xa2\\xba\\x58\\x2c\\x07\\x5a\\x7b\\x44\\xad\\x8c\\xb1\\xc0\\xe2\\x72\\x45\\xb3\\x5a\\x93\\x5a\\xb0\\x59\\x51\\xfe\\xbf\\x82\\x5b\\x1e\\xe4\\x0b\\xdb\\xff\\x2f\\x20\\xec\\x3c\\x47\\x85\\x1c\\x57\\x43\\x09\\x9b\\xc3\\x30\\x6b\\xee\\x9f\\xda\\x97\\x3a\\xbb\\x3e\\x43\\x85\\x85\\xa5\\x21\\xff\\xb7\\x9d\\xdf\\x3d\\x96\\x2e\\x87\\xbe\\x93\\x8a\\x99\\x2f\\x35\\xdf\\x05\\x02\\x0b\\x04\\x80\\xe7\\x29\\x87\\xe5\\xc6\\xd3\\x3f\\x00\\x2c\\x18\\xfa\\xce\\xd0\\xfd\\xe6\\x4b\\x8d\\xd1\\x2d\\xeb\\xbf\\x13\\xc2\\x87\\x98\\xc1\\xd2\\x84\\xa6\\x8c\\x43\\x68\\xc4\\x2d\\xc2\\x7e\\x28\\xf4\\x79\\x44\\xe9\\x41\\x5c\\x21\\x25\\xb1\\x54\\xea\\xc6\\x64\\x32\\x0b\\x8a\\xf0\\x22\\x6e\\x14\\x5e\\x42\\x85\\x78\\x3b\\x4a\\xe8\\x65\\x68\\x13\\x5c\\x98\\x2a\\x06\\x71\\xb5\\xb0\\x10\\xfb\\xc5\\xf6\\xa1\\x4f\\xe9\\x41\\x2c\\xa5\\x07\\xf1\\x2f\\xf4\\x20\\x66\\xd3\\x83\\xe8\\xa3\\x07\\xd1\\x4e\\x0f\\x62\\x03\\x3d\\x88\\xe5\\xf4\\x20\\xba\\xe8\\x41\\x5c\\x4a\\x0f\\x62\\xbe\\xd0\\x87\\xfd\\x82\\x82\\xcd\\xb4\\x00\\x13\\xe9\\xf7\\xb0\\x8f\\x56\\x62\\xbb\\x78\\x1a\\x01\\x73\\x11\\xba\\xa5\\x0a\\xe4\\x4b\\x95\\xd8\\x27\\x95\\xe1\\x32\\x69\\x0a\\xf6\\xd1\\xfb\\xb0\\x8f\\x3e\\x88\\x7d\\xd2\\x62\\x2c\\x97\\x1e\\xc3\\x3e\\x61\\x31\\x1e\\xa0\\xdf\\xc2\\x54\\x29\\x8c\\x7d\\x74\\x21\\xf6\\x99\\xbe\\xc4\\x3e\\xfd\\x73\\x69\\x3b\\xfa\\xa5\\x89\\xd8\\x27\\xdd\\x8f\\x7e\\x69\\x16\\xf6\\x49\\x05\\x58\\x42\\xbf\\x85\\x52\\x69\\x27\\xae\\x95\\xfc\\x30\\x9b\\xfd\\x28\\x94\\xfc\\xa8\\x90\\xf2\\x21\\xd1\\xc3\\x98\\x23\\x74\\x60\\xbb\\xb8\\x14\\x82\\xd0\\x01\\xbb\\xb8\\x0b\\x0d\\xe2\\xdd\\x20\\xc2\\x3f\\x62\\x0e\\x9d\\x8d\\x49\\x74\\x0f\\x36\\xd1\\x10\\xa6\\xd0\\x3d\\xe8\\xa1\\x5d\\x98\\x23\\xfc\\x16\\x25\\xac\\xbe\\x07\\x03\\x42\\x15\\x76\\x0a\\x15\\x43\\x0f\\xd2\\xf3\\xb0\\x49\\xaf\\x9b\\x3e\\xc4\\x26\\xba\\x07\\x6b\\xf9\\xf7\\x7a\\xbd\\x47\\xf8\\x15\\x36\\xd1\\x00\\xa6\\x09\\x47\\x61\\xd5\\xff\\x86\\xfa\\xe0\\x92\\xde\\x41\\x19\\xf5\\xa1\\x80\\xfa\\x20\\x51\\x1f\\xce\\x17\\x0e\\x21\\x2a\\x98\\xf1\\x03\\xe1\\x10\\x2a\\xa5\\x08\\x06\\x18\\xf6\\x33\\x70\\x27\\xfd\\x1e\\xbe\\x41\\x9f\\x41\\xbf\\x74\\x2b\\xe6\\xd1\\xf7\\xe0\\x13\\x24\\xec\\x94\\xcc\\xb8\\x9c\\x76\\xe3\\xbb\\xa6\\x3e\\x5c\\x2c\\xde\\x81\\x4d\\x94\\xe0\\x4a\\x3a\\x80\\x1d\\x3a\\xf6\\xfa\\x67\\x94\\xe2\\x5e\\xb1\\x14\\x3b\\xe8\\x1c\\x2c\\x11\\xfb\\xb1\\x4e\\x5c\\x84\\xa5\\xc2\\x7f\\x60\\x1d\\xfd\\x04\\xdf\\xa4\\x13\\x31\\x59\\x58\\x8b\\x87\\x84\\x6a\\x2c\\x13\\x26\\x63\\xae\\xf8\\xcf\\xd8\\x46\\x09\\x56\\x49\\xaf\\xe1\\xfb\\x26\\x19\\xdf\\x37\\x3d\\x81\\x8d\\xd4\\x8e\\xf3\\x19\\xee\\x63\\x1c\\xe6\\x9b\\x21\\xea\\x7d\\xc1\\xfa\\x21\\xeb\\x10\\x16\\x0f\\xbd\\x20\\x2c\\xc6\\x7d\\xc2\\xe2\\xa1\\x67\\x84\\xc5\\x43\\x3f\\x92\\xfa\\x51\\x91\\xe9\\x87\\x11\\x07\\x9d\\x86\\x69\\xd2\\x6e\\xf4\\xb3\\xbe\\xc8\\x3e\\xf4\\xbe\\x78\\x0b\\x7b\\x24\\x07\\xf6\\x32\\xdc\\xc7\\x38\\x4c\\xcf\\xa2\\x89\\xf5\\x45\\x17\\xe6\\x64\\x1f\\x82\\x32\\x14\\x17\\x14\\xec\\x11\\x94\\xa1\\xc7\\x05\\x65\\xe8\\x3b\\xf4\\x39\\x44\\xb3\\xfa\\x21\\xf7\\xd8\\x8f\\xa9\\xe9\\xfe\\xcb\\x39\\xf4\\xbe\\xb8\\x0d\\xd7\\xe9\\xa5\\xf9\\x19\\x2c\\x33\\xb7\\xa1\\x47\\x6f\\x93\\xf8\\x05\\x6e\\x15\\xdf\\xc0\\x76\\xf1\\x45\\xc0\\x7c\\x17\\x90\\x2e\\x85\\x9b\\x01\\xf2\\x0e\\x40\\xba\\x8d\\x03\\xff\\x03\\x90\\xbf\\x07\\xb0\\x16\\xd0\\xfb\\x22\\x7d\\x48\\x37\\xe3\\x0e\\xd3\\x2d\\x58\\x43\\xbe\\x0d\\x85\\x7c\\x1b\\xed\\xe4\\x00\\x14\\xe1\\x7d\\x28\\xc2\\xc7\\x68\\x17\\x7e\\x0b\\x45\\xf8\\x3d\\xf6\\x4a\\x7f\\xc4\\x7e\\xfd\\x6f\\x85\\x9d\\x58\\x27\\xac\\xc5\\x3c\\xfd\\xba\\xb4\\x1f\\x33\\x25\\x07\\xae\\xa0\\x6d\\x00\\xfd\\x3d\\x3c\\x74\\x08\\x25\\xe6\\xa7\\x50\\x62\\xfe\\x2f\\x7d\\x0c\\x45\\x03\\xff\\xb7\\x04\\xb7\\x91\\xad\\x24\\x25\\x3c\\x28\\x76\\x8b\\xab\\xc4\\x7b\\xc5\\xe7\\xc4\\x8f\\x69\\x94\\x2e\\xa4\\x9b\\xe9\\xbd\\xf4\\x71\\xfa\\x95\\x54\\x23\\xdd\\x6e\\xb2\\x98\\xe6\\x99\\x1e\\x37\\xd7\\x98\\x2f\\x37\\x7f\\x68\\xb9\\xd2\\x72\\xa7\\xe5\\x39\\xcb\\xeb\\x96\\xbf\\x5a\\x1d\\xd6\\xad\\xb6\\x6e\\xdb\\x2d\\xb6\\x4f\\xf2\\x96\\xe4\\x1d\\xc8\\x7b\\x25\\xdf\\x92\\x7f\\x63\\x7e\\x22\\xff\\x15\\x7b\\xa1\\x7d\\xbe\\xfd\\x5a\\xfb\\xaf\\x1d\\x0e\\xc7\\x15\\x8e\\x43\\x4e\\x93\\x73\\x83\\xf3\\x13\\x57\\xc0\\x75\\xb9\\xeb\\x80\\x4c\\xe5\\x36\\x79\\x8d\\x7c\\x9f\\xfc\\x82\\xfc\\x3b\\xb7\\xcb\\xad\\xb8\\x67\\xbb\\xd7\\xb9\\x3f\\x2c\\x98\\x57\\x70\\xd8\\x53\\xea\\xd9\\xe1\\xf9\\xb5\\x77\\xb6\\xf7\\x5e\\xef\\x33\\xde\\x94\\x4f\\xf1\\xcd\\xf5\\x3d\\xed\\xb7\\xf8\\x17\\xfa\\x0f\\x17\\x16\\x16\\x2e\\x2c\\x7c\\xa5\\x68\\x42\\xd1\\xa6\\xa2\\x07\\x8a\\x7e\\x57\\xec\\x2e\\x9e\\x5f\\xbc\\xab\\xf8\\x48\\xf1\\xfb\\x25\\x0d\\x25\\x3b\\x4a\\x76\\x94\\xfc\\x53\\xa9\\xaf\\xf4\\x40\\x59\\xa0\\xec\\x96\\xb2\\x1f\\x96\\x5f\\x59\\xbe\\xbf\\xa2\\xbb\\xe2\\xe7\\x15\\xef\\x06\\x1c\\x81\\x86\\xc0\\xc7\\x41\\x5b\\x70\\x51\\xf0\\x50\\xf0\\x54\\xe5\\xe6\\xca\\xfb\\x2a\\x3f\\xa8\\x2a\\xad\\xea\\xaa\\xda\\x56\\xf5\\x60\\xd5\\x89\\x50\\x7e\\xe8\\xf6\\xea\\xd2\\xea\\xb7\\x6b\\xfa\\x6a\\x0e\\xd4\\x9c\\xa8\\xed\\xab\\x3d\\x32\\xa1\\x65\\xc2\\x73\\x75\\xc5\\x75\\x8f\\xd5\\x9d\\xaa\\x9f\\x52\\x7f\\x7b\\xfd\\x89\\x70\\x61\\xf8\\x1b\\xe1\\xeb\\xc3\\x3f\\x69\\xf0\\x35\\x3c\\xd8\\x88\\xc6\\x2b\\x1b\\x8f\\x35\\x2d\\x69\\x7a\\xb9\\xe9\\x93\\xc8\\xd6\\xc8\\xcf\\xa3\\xbe\\xe8\\x86\\xe8\\xcb\\xcd\\x8e\\xe6\\x45\\xcd\\x2f\\x2b\\x17\\x2b\\x6f\\xc7\\x36\\xb5\\xd4\\xb7\\xfc\\xb2\\xf5\\xb6\\x89\\x33\\x26\\xbe\\x32\\xa9\\x63\\xd2\\x3f\\xb6\\x79\\xda\\xbe\\xdb\\x76\\xa4\\xed\\x54\\xfb\\x84\\xf6\\x55\\xed\\xbf\\xed\\x58\\xd1\\xf1\\x74\\x67\\x71\\xe7\\x8e\\x2e\\xa1\\x6b\\x73\\xd7\\xa1\\xc9\\x35\\x93\\x77\\x4c\\x3e\\x3e\\x65\\xe2\\x94\\x47\\xa7\\x7c\\x3a\\xf5\\xe2\\xa9\\x4f\\x4f\\x6b\\x9b\\x76\\x6c\\x7a\\xcd\\xf4\\x59\\xd3\\xef\\x1e\\xe7\\xdf\\xc3\\xd3\\x7f\\x38\\xfd\\xc9\\xe9\\xaf\\x4e\\xff\\xb0\\xdb\\xd5\\xdd\\xd2\\xbd\\xa8\\xfb\\xee\\xee\\x63\\x3d\\xb6\\x9e\\x8e\\x9e\\x6d\\x3d\\xdb\\x7a\\x1e\\xe8\\x79\\xba\\xe7\\xe9\\x19\\x5d\\x33\\xd4\\x19\\xaf\\xf7\\x76\\xf7\\x3e\\xd6\\xb7\\xa8\\xef\\xaf\\xc6\\x18\\x8d\\x13\\xe8\\x83\\x04\\xc3\\x5a\\x24\\x10\\xe0\\x63\\x29\\xf8\\x56\\xf1\\x31\\xda\\x05\\x7d\\x16\\x25\\xd4\\x0a\\x60\\x0a\\xb3\\x56\\xf4\\x3a\\x41\\x3e\\xa6\\xf0\\xba\\x00\\x0b\\x66\\xf1\\xba\\x88\\x26\\xcc\\xe7\\x75\\x0a\\x1f\\x76\\xf1\\xba\\x84\\x06\\x1c\\xe0\\x75\\x13\\x7c\\x78\\x8e\\xd7\\xcd\\x98\\x86\\xd7\\x79\\xdd\\x8a\\x7c\\x52\\xc8\\xeb\\x79\\xf0\\x90\\x10\\xaf\\xe7\\xa3\\x86\\xb4\\xf1\\xba\\x1d\\xfd\\xe4\\x72\\x5e\\x77\\x60\\x21\\xf9\\x29\\xaf\\xbb\\xe1\\x13\\x1c\\xbc\\x7e\\x04\\x3e\\x21\\xfd\\xb7\\x2f\\x21\\x2a\\x74\\xa0\\x0f\\x1b\\xb1\\x01\\x5b\\x11\\xc0\\x0a\\x2c\\xc3\\x56\\x2c\\x43\\x00\\xcb\\xb1\\x11\\x9b\\x70\\x1d\\x36\\x63\\x00\\xab\\x71\\x15\\xfb\\x76\\x26\\x36\\x62\\x23\\x56\\x63\\x1d\\x56\\x22\\x00\\x05\\x51\\x34\\x43\\xc1\\x7c\\x6c\\xc4\\x95\\xd8\\x88\\xad\\xd8\\x88\\x6e\\x6c\\xc4\\x3a\\xac\\xc8\\xf9\\x65\\x47\\xce\\x2f\\x02\\x99\\xdf\\x74\\xf0\\x2b\\xc4\\xc6\\xf9\\xfe\\x62\\xac\\xc4\\x66\\x6c\\xc1\\x00\\x6b\\x5d\\x00\\xcd\\x68\\x42\\x33\\xa2\\xec\\x6f\\x5a\\xd0\\x8c\\xce\\x4c\\x1b\\x72\\xaf\\xd0\\x98\\xb9\\x42\\xee\\x75\\x07\\xb0\\x05\\x01\\x26\\xdb\\x56\\x6c\\xc6\\x32\\xac\\xc0\\x4a\\xac\\xc7\\x32\\x6c\\xc6\\x5a\\x04\\xb0\\x11\\xab\\x46\\x48\\xd8\\x94\\x73\\x96\\xfb\\x8d\\x8e\\xce\\x7a\\xf4\\xe0\\x2a\\x86\\xcf\\x16\\x6c\\xc5\\x00\\x96\\xb1\\x56\\x1a\\xf7\\xd4\\x5b\\xbe\\x15\\x5b\\x58\\xcb\\x67\\x63\\x00\\xcb\\xb1\\x12\\x1b\\xb0\\x05\\x2b\\xb1\\x02\\x01\\x5c\\x83\\x0d\\xec\\xee\\x9b\\x59\\x5b\\xae\\x62\\x68\\x4e\\xc7\\x26\\x2c\\xc3\\x72\\x7e\\x96\\xfb\\x37\\x0d\\x08\\x8c\\x42\\x43\\x41\\x13\\xa2\\xac\\x5f\\xb6\\x62\\x13\\x3a\\x10\\x41\\x04\\xdb\\xd9\\xbf\\x26\\x2c\\xcb\\xba\\x56\\x13\\x36\\x62\\x33\\x56\\x23\\x82\\x75\\x39\\xd7\\xdc\\x82\\x08\\x66\\xe3\\x3c\\xf4\\xa0\\x17\\x73\\xb1\\x00\\xbd\\x68\\xe4\\xd7\\x1c\\xbb\\x37\\x2e\\xc1\\x4a\\x5c\\x89\\x55\\x19\\x4d\\x69\\x66\\xbf\\xed\\x63\\xf2\\x1b\\xad\\xdf\\xcc\\x5a\\xd5\\x8a\\x00\\xeb\\x93\\x0e\\x44\\xa1\\xb0\\xff\\xb7\\x64\\xfa\\xa9\\x25\\x6d\\xfb\\x0c\\xad\\xc1\\x0a\\x8c\\xf5\\xdf\\x09\\x80\\x08\\x44\\x84\\x08\\x0a\\x09\\x26\\x98\\x61\\x81\\x15\\x36\\xe4\\x21\\x1f\\x76\\x38\\xe0\\x84\\x0b\\x32\\xdc\\x28\\x80\\x07\\x5e\\xf8\\xe0\\x47\\x21\\x8a\\x50\\x8c\\x12\\x94\\xa2\\x0c\\xe5\\xa8\\x40\\x00\\x41\\x54\\xa2\\x0a\\x21\\x54\\xa3\\x06\\xb5\\x98\\x80\\x3a\\xd4\\x23\\x8c\\x06\\x34\\xa2\\x09\\x11\\xae\\xb3\\x31\\xb4\\xa0\\x15\\x13\\x31\\x09\\x6d\\x68\\x47\\x07\\x3a\\xd1\\x85\\xc9\\x98\\x82\\xa9\\x98\\x86\\xe9\\xe8\\x46\\x0f\\x66\\xa0\\x17\\x7d\\x98\\x89\\x6f\\xe0\\x3c\\xcc\\xc2\\xf9\\x98\\x8d\\x39\\x98\\x8b\\x0b\\x30\\x0f\\x17\\x62\\x3e\\x16\\x60\\x21\\x2e\\xc2\\xc5\\xb8\\x04\\x8b\\xb0\\x18\\x4b\\x70\\x29\\xfa\\x71\\x19\\x2e\\xc7\\x52\\x5c\\x81\\x65\\x84\\xe2\\x1f\\xb0\\x07\\x37\\xe3\\x29\\x1c\\xc0\\x07\\xb8\\x05\\x77\\xe2\\x9b\\xf8\\x1e\\xfe\\x19\\x87\\x88\\x84\\xdb\\xf0\\x06\\xfe\\x1e\\xf7\\x10\\x13\\x31\\xe3\\x0e\\x62\\xc1\\x3e\\x3c\\x8f\\xdf\\x11\\x2b\\x1e\\xc4\\x63\\xf8\\x0c\\x7f\\xc6\\x29\\x3c\\x8a\\x1f\\xe0\\x25\\xbc\\x88\\x1f\\xe2\\x4a\\x2c\\xc7\\x7e\\xac\\xc0\\x51\\xac\\xc4\\x11\\xfc\\x12\\xff\\x86\\x63\\xf8\\x15\\x5e\\x46\\x12\\xab\\xf0\\x1b\\xfc\\x1a\\xff\\x8e\\x1f\\x61\\x35\\x3e\\xc1\\xb7\\x70\\x1c\\xaf\\xe2\\x35\\x5c\\x85\\x93\\xf8\\x08\\xb7\\x62\\x0d\\x06\\xb0\\x16\\xeb\\xb1\\x0e\\x1b\\xf0\\x30\\x36\\xe2\\x6a\\xd6\\x3b\\x5b\\x70\\x0d\\xb6\\x62\\x1b\\xb6\\xe3\\x04\\xae\\xc5\\xf5\\xb8\\x0e\\x37\\xe0\\xef\\x70\\x23\\x7e\\x82\\x47\\xb0\\x13\\x3b\\xb0\\x0b\\x37\\xe1\\x43\\x7c\\x8c\\x9f\\x42\\x85\\x86\\x7f\\xc5\\xeb\\xf8\\x4f\\x62\\x23\\x79\\x24\\x9f\\xd8\\x89\\x83\\x38\\x89\\x8b\\xc8\\xc4\\x4d\\x0a\\x88\\x87\\x78\\x89\\x8f\\xf8\\x11\\xc7\\x20\\x0e\\xe3\\xc7\\xf8\\x39\\x12\\x78\\x02\\xbf\\xc0\\x5e\\xfc\\x0b\\x29\\xc4\\xd3\\xf8\\x19\\x29\\x22\\xc5\\xb8\\x9d\\x94\\x90\\x52\\x52\\x46\\xca\\x49\\x85\\x69\\xf5\\xba\\xeb\\x36\\x5d\\xd5\\x6c\\xbe\\x66\\xc3\\x40\\x34\\x1a\\x9d\\x61\\x94\\xd3\\xa3\\xbc\\xe4\\xe7\\xdd\\x0a\\x2f\\x63\\xbc\\x6c\\xe5\\x65\\xbb\\x5e\\x2a\\xd1\\x68\\x94\\x97\\xcd\\xbc\\x54\\x78\\x19\\xe3\\x65\\x0b\\x2f\\x5b\\x79\\x39\\x91\\x97\\x93\\x78\\xd9\\xc6\\xcb\\xf4\\xf5\\xa6\\x1b\\x65\\x33\\xbf\\x6e\\x73\\xb3\\x6d\\xd5\\xc0\\xea\\x6b\\x36\\xaf\\x5c\\xb1\\x6c\\xcb\\x55\\xc6\\x47\\x4a\\x9f\\x51\\xb6\\xf6\\xd1\\xde\\x6b\\x36\\x6f\\x64\\x27\\xad\\x7d\\x3d\\x7a\\xd9\\xd7\\x6d\\xb4\\xa3\\xaf\\xdb\\x68\\x47\\x5f\\xb7\\xd1\\x8e\\xbe\\xee\\x68\\x0b\\x80\\x9f\\x90\\xa1\\x9b\\x55\\x72\\x07\\xce\\x57\\x2d\\xf3\\x16\\x69\\x84\\xdc\\xb9\\x58\\xeb\\x33\\x85\\x17\\x05\\x55\\xd7\\xe2\\xf3\\x55\\xcf\\xfc\\x45\\x41\\x75\\xd7\\xe2\\x32\\xd5\\x14\\xee\\x5f\\x04\\x55\\x0c\\xf4\\xaa\\x62\\x78\\x86\\x4a\\x03\\xbd\\x71\\xb1\\x42\\x08\\xb3\\x13\\x29\\xd0\\x1b\\xa7\\xe9\\x13\\x53\\xa0\\x37\\x2e\\x1d\\xe2\\x27\\xe6\\x40\\x6f\\xdc\\xb4\\x84\\x9f\\x58\\x02\\xbd\\x71\\x73\\x07\\x3f\\xb1\\x06\\x7a\\xe3\\x96\\x76\\x7e\\x62\\x0b\\xf4\\xc6\\xad\\xd5\\xfc\\x24\\x2f\\xd0\\x1b\\xb7\\x85\\xf8\\x49\\x7e\\xa0\\x37\\x9e\\x57\\xc5\\x4f\\xec\\x81\\xde\\x78\\x7e\\x90\\x9f\\x38\\x02\\xbd\\x71\\xbb\\xdf\\x38\\x21\\xaa\\x93\\xb7\\xcb\\x15\\xe8\\x8d\\x3b\\x3b\\x85\\xb0\\x26\\xf6\\x6d\\x0b\\xcf\\x50\\xe5\\x40\\x6f\\xdc\\xd5\\x9a\\x39\\x75\\x07\\x7a\\xe3\\xf2\\x40\\xe6\\xb4\\x20\\xd0\\x1b\\x77\\x0f\\xff\\xd8\\x13\\xe8\\x8d\\x17\\x74\\x64\\x4e\\xbd\\x81\\xde\\xb8\\xa7\\x3d\\x73\\xea\\x0b\\xf4\\xc6\\xbd\\x13\\x33\\xa7\\xfe\\x40\\x6f\\xdc\\xd7\\x94\\x3e\\x5d\\xac\\x7a\\xc2\\x00\\x59\\xb0\\xf8\\xc3\\xd9\\xc0\\xff\\x0d\\x00\\x00\\xff\\xff\\xfd\\x8c\\x82\\x7d\\x18\\xb0\\x00\\x00\")\n\nfunc fontsRobotoBoldWebfontTtfBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoBoldWebfontTtf,\n\t\t\"fonts/roboto-bold-webfont.ttf\",\n\t)\n}\n\nfunc fontsRobotoBoldWebfontTtf() (*asset, error) {\n\tbytes, err := fontsRobotoBoldWebfontTtfBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-bold-webfont.ttf\", size: 45080, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoBoldWebfontWoff = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x64\\xb6\\x53\\x74\\xdf\\x5f\\x17\\xed\\xfd\\x8d\\xad\\xa6\\x8d\\xd9\\xd8\\xb6\\x6d\\xdb\\xb6\\x6d\\xb3\\x71\\x93\\x06\\x8d\\x6d\\xdb\\xb6\\x6d\\xa7\\xb1\\xed\\xfc\\xde\\xf1\\x7f\\x9f\\x73\\xae\\xce\\x1e\\xe3\\xb3\\xe7\\xde\\xeb\\x62\\xad\\x8b\\x79\\x31\\x97\\x87\\x82\\xb8\\x38\\x00\\x06\\x00\\x00\\x60\\x78\\x01\\xa0\\xff\\xa7\\xb5\\x58\\xff\\xfb\\xff\\xbf\\x47\\x5c\\x5c\\x55\\x0e\\x00\\xc0\\x4a\\x01\\x00\\xc0\\xfb\\x0f\\xc3\\x2a\\xc5\\x71\\x09\\x51\\x31\\x71\\x00\\x00\\x1b\\x04\\x00\\x80\\x0a\\x00\\x00\\x5a\\xf0\\x3b\\xb0\\x79\\x09\\x45\\x05\\x15\\x00\\x00\\xbb\\x01\\x00\\x68\\x2c\\x00\\x40\\xda\\x6f\\xc0\\x0d\\x90\\x93\\x50\\x51\\x13\\x06\\x00\\x58\\x58\\x00\\x00\\xe4\\xff\\x1b\\x46\\x3e\\x40\\xb4\\xa4\\xa0\\xc2\\xc0\\x0c\\x00\\xb0\\x9a\\x00\\x00\\xa8\\xff\\x57\\x6b\\xfb\\xf9\\x11\\x60\\x62\\x67\\xe4\\x08\\x00\\xb0\\xb5\\x00\\x00\\x16\\x09\\x00\\x60\\xfb\\x87\\x93\\xc2\\xd4\\x26\\xee\\xae\\x44\\x00\\x00\\xcf\\x09\\x00\\x80\\xf0\\x7f\\x60\\x61\\xa1\\x19\\x9a\\x3b\\x5a\\xd8\\x01\\x00\\xbc\\x2f\\x00\\x80\\xd5\\x01\\x00\\xb8\\x99\\x4a\\x23\\x43\\x89\\x85\\x91\\x8b\\x23\\x00\\x20\\x32\\x02\\x00\\x00\\xfb\\x7f\\x40\\xb5\\xb0\\xf5\\x32\\x07\\x00\\x44\\x4e\\x00\\x90\\x59\\x00\\x80\\xd8\\x07\\x6c\\x51\\xe8\\x36\\x4b\\x33\\x23\\x53\\x00\\xd0\\x44\\x04\\x00\\x80\\x09\\x00\\x00\\x76\\x28\\xaa\\x50\\x0d\\x4b\\x4b\\x33\\x23\\x00\\xd0\\x14\\x04\\x00\\x80\\x10\\x00\\x00\\x52\\x14\\x37\\x68\\x26\\x4b\\x3b\\x57\\x4f\\x00\\xd0\\x34\\x04\\x00\\x70\\x4b\\x00\\x80\\x28\\x5d\\x12\\x16\\xe6\\xb3\\x75\\x30\\x31\\x02\\x00\\xed\\x51\\x00\\x00\\x9b\\x04\\x00\\xb0\\x65\\x5d\\x73\\x6e\\xc0\\xce\\xc8\\xd3\\x11\\x00\\x74\\xff\\x00\\x00\\x40\\xf4\\x1f\\xe0\\x30\\x60\\xb5\\xf6\\x46\\x76\\x66\\x00\\xa0\\xdb\\x08\\x00\\x60\\xc1\\x00\\x00\\xc1\\x28\\x7e\\xeb\\xc9\\xec\\xe8\\xe0\\xe2\\x0a\\x00\\xfa\\x9c\\x00\\x00\\x76\\x05\\x00\\xe0\\x87\\x38\\xbe\\xcc\\xc5\\x8e\\xce\\x66\\x8e\\x00\\x60\\x48\\x09\\x00\\x40\\x3b\\x00\\x80\\x49\\x64\\xd8\\x17\\xe6\\x7a\\x98\\x19\\x9b\\x03\\x80\\xe1\\x3f\\x00\\x00\\xa0\\xff\\xe3\\x42\\x4e\\x45\\x0b\\x00\\xfe\\xe7\\xca\\x24\\x5f\\xfe\\xcc\\x7f\\x3a\\x78\\x83\\x46\\xff\\x9f\\xce\\x04\\x64\\x4e\\x7a\\xae\\x9b\\x18\\x9a\\x1a\\x1a\\xee\\x42\\x18\\xff\\x80\\x46\\x35\\x34\\x36\\x34\\x37\\x34\\xf5\\x84\\x1f\\x9c\\x09\\x4c\\xf8\\xb5\\xc7\\x35\\x20\\x43\\x94\\x01\\x45\\x3b\\x00\\x00\\x2a\\xa8\\x90\\x43\\x00\\x00\\x78\\xae\\x57\\xa5\\x5a\\xd9\\xaa\\xa9\\x7d\\x0f\\x5b\\xf1\\xc3\\xb7\\x3c\\x2f\\xb8\\x3c\\x68\\x8a\\x61\\x27\\x0f\\x55\\x02\\xc7\\x82\\xa6\\x4a\\x62\\x82\\xb4\\x01\\x0b\\x51\\x16\\x34\\x87\\x80\\xbb\\x13\\x81\\x82\\xfb\\x36\\x80\\x32\\x17\\xaa\\x24\\x18\\x23\\x84\\xda\\xaf\\x6a\\x4a\\x1f\\x32\\xd8\\x38\\x39\\x1a\\x43\\x09\\x86\\x04\\xa7\\x92\\xf7\\x5d\\x08\\x5c\\x17\\x32\\x39\\x12\\xae\\xa7\\xfd\\xf3\\xca\\x2a\\x08\\xa6\\xf9\\xfb\\x6c\\x4b\\xfd\\x15\\x1f\\xdf\\x71\\xb6\\xdf\\x93\\xbe\\xc5\\x7a\\x32\\x05\\x95\\x18\\xc3\\x09\\x59\\x58\\xfb\\x71\\xe7\\xb2\\x42\\xd9\\x75\\x2c\\x96\\x80\\xf8\\xe3\\x0f\\x85\\xae\\xc9\\xef\\x8d\\x23\\x29\\x5d\\x1e\\x3b\\x04\\x1c\\xe2\\x52\\x42\\x63\\x4c\\xfa\\xc4\\xdb\\xc4\\x45\\x83\\xb1\\x7f\\x30\\xdf\\xb6\\xfc\\x36\\xe4\\x0f\\x7a\\x21\\xfd\\xaa\\x87\\xb4\\xab\\x9b\\xde\\x86\\x71\\xcf\\xfd\\x4a\\x0f\\xb7\\x25\\xb6\\x59\\x1d\\xfe\\xb6\\x0c\\xf1\\xec\\xe9\\xdd\\x5e\\x85\\xae\\x87\\xd6\\x8b\\x78\\xe5\\xc1\\xe5\\x2d\\xe5\\xe5\\xcf\\x22\\x7b\\x06\\x5f\\x5f\\x9b\\x30\\x7d\\x8e\\xd7\\x7d\\xf0\\x9f\\xa8\\x7d\\xa7\\xbe\\xbb\\xe2\\x7c\\x07\\xe3\\x45\\x52\\xd7\\x84\\x3b\\x2b\\xe5\\x3e\\x0b\\x5d\\xd1\\x53\\x55\\x78\\xbd\\x21\\x8a\\x51\\x11\\xa1\\x59\\x04\\x3a\\xf2\\xfa\\xd4\\x27\\x53\\x8d\\x3a\\x06\\xef\\x55\\x78\\x50\\x1f\\xea\\x2b\\x06\\x33\\xd5\\x9b\\x55\\xd0\\xd2\\xa0\\x70\\xd7\\x18\\xdd\\x14\\xc3\\xdb\\x37\\xe8\\x0f\\x57\\x95\\xba\\xe0\\x5d\\x8c\\x14\\xd2\\x2c\\x24\\x16\\xe3\\x3d\\x02\\x68\\x11\\x0b\\x8f\\x89\\x3a\\x2a\\xf3\\x1c\\xbf\\xf9\\x91\\x0f\\x50\\x39\\x52\\x67\\x42\\x97\\x0c\\x1c\\xae\\x6a\\x82\\x69\\xf4\\xab\\x39\\xb2\\xe9\\x42\\x20\\xd4\\xd6\\x21\\x57\\x47\\xe0\\xee\\x8a\\x6b\\x86\\x5e\\x4e\\x39\\x22\\x6c\\xc2\\xb7\\xf4\\x65\\xc5\\xd4\\x21\\xf8\\xc3\\x78\\x0c\\xf0\\xc5\\x34\\xa1\\x10\\xec\\xbe\\x1b\\xfb\\xd2\\x05\\x15\\x31\\x46\\x9a\\x44\\xfb\\xd0\\x1b\\x42\\x43\\x53\\x66\\x9d\\x84\\x53\\x2a\\xe1\\x47\\xb6\\x14\\xe8\\x29\\x52\\xdc\\x2f\\x0d\\x35\\xd3\\x10\\x12\\x84\\xc2\\x35\\xea\\x16\\x1e\\x72\\x37\\x45\\x94\\xf1\\xc9\\x5e\\x1a\\x2d\\x11\\x55\\x0b\\xdb\\x7e\\x94\\xce\\x2d\\x4b\\xa0\\x57\\x31\\xa8\\xb7\\x5b\\x57\\xd1\\xcd\\x21\\xbf\\x07\\xbf\\x22\\x16\\x5c\\x4e\\x50\\x2e\\xec\\x4c\\xdb\\xb4\\x5a\\x77\\xa4\\xc3\\xb2\\x95\\x2d\\xea\\x16\\x90\\x67\\x29\\x33\\xbb\\x07\\x5f\\x5b\\xaf\\x6b\\x6b\\x33\\x2f\\x0d\\x4c\\xcf\\xb6\\x13\\x3e\\x32\\xb4\\xf2\\x17\\xd8\\x41\\xa7\\xa0\\x18\\x7b\\x81\\xa7\\xac\\x18\\x7a\\x25\\x4f\\x6f\\xf8\\x1e\\xbf\\x8b\\xf1\\xda\\x5b\\xf5\\x50\\xe1\\xd2\\x07\\x47\\xef\\x7d\\x6b\\xfd\\x4e\\x7e\\xe0\\x22\\xb2\\x6c\\x21\\x52\\xd9\\x32\\xe2\\xcc\\x51\\xc9\\xb6\\x6c\\xf5\\xc5\\x0f\\x31\\xd3\\xef\\x72\\x83\\x6d\\x3e\\x69\\x31\\xec\\xfb\\xbf\\x6b\\x42\\xc2\\x8e\\xb0\\xc9\\x6f\\xf1\\x49\\x69\\x43\\xc2\\x8e\\x10\\xca\\x6f\\x59\\x0c\\x65\\x49\\xac\\x0a\\xba\\x32\\x0b\\xda\\x73\\x56\\xc4\\xca\\x33\\xc1\\x7c\\xe3\\x7b\\x90\\x56\\x2d\\x56\\x4a\\xaf\\x32\\xd6\\xcb\\xd1\\x41\\x46\\xbc\\x03\\x7f\\xf7\\xeb\\x7f\\x0f\\x85\\x19\\x77\\xcf\\xd4\\xfe\\x93\\xd8\\x45\\x51\\xb9\\x25\\xd9\\xa9\\x25\\xe9\\xaa\\x25\\x71\\x3b\\x2b\\xab\\x19\\xeb\\xb3\\xd1\\xf4\\x8b\\xfc\\xea\\x8b\\x2a\\x82\\xb3\\xaa\\x2f\\x9c\\xc1\\x48\\x91\\xc7\\x14\\x72\\xab\\xfa\\x62\\xcb\\xf2\\x62\\xab\\x76\\x73\\xcb\\x62\\xf3\\x53\\x96\\xa9\\x65\\xbc\\xa9\\x25\\x5e\\xbf\\xa2\\x57\\xed\\x5e\\x9c\\xed\\x02\\xbf\\xca\\xfd\\x85\\x41\\xaf\\x14\\x2c\\x91\\x31\\x84\\x90\\x2c\\xb5\\x02\\x77\\xe5\\xb8\\x6c\\x15\\x8c\\x8e\\xdb\\xc2\\xc3\\x35\\x72\\x1d\\xab\\xee\\x1f\\x9a\\x41\\xd9\\xbb\\x1a\\x4f\\x15\\x5f\\xa9\\x39\\x7a\\x8d\\x13\\x4f\\x4c\\x1d\\xa7\\x63\\x3e\\x29\\xfc\\x73\\x2b\\x2b\\x04\\x58\\xf7\\xe5\\x9f\\x83\\x3e\\x74\\xd7\\x34\\xee\\x17\\x4c\\xde\\x20\\xa8\\x1a\\x95\\x51\\xcf\\xd2\\x2f\\x68\\x9f\\xb6\\x33\\x7d\\x0d\\x50\\x12\\x73\\x2a\\xb8\\x02\\x4d\\x59\\x8f\\xf1\\x88\\x5d\\xae\\x9f\\x83\\x0b\\xf5\\xdf\\x64\\x95\\x8b\\xc4\\x77\\x83\\xe6\\xda\\x23\\xb3\\x80\\x91\\x8f\\xcf\\x92\\xd8\\x63\\x2f\\x58\\xfd\\x66\\x2d\\x50\\x3d\\xcf\\xac\\xfd\\x06\\xdd\\x76\\x8b\\xf1\\x85\\x5c\\xbd\\x30\\x4d\\xb3\\xd2\\x77\\x12\\x26\\x03\\xff\\x4f\\xc5\\x99\\xa1\\xe6\\xc5\\xa3\\x0d\\x71\\x1d\\xa3\\x8a\\x1f\\x6e\\x09\\x4d\\x1e\\x74\\xef\\xa7\\x39\\x0e\\x6b\\xee\\x7d\\xe2\\xd0\\xec\\xb6\\x7f\\xb6\\x1a\\xd5\\x32\\x89\\x3d\\x7c\\xfc\\x0d\\x25\\x38\\x63\\x07\\xad\\xdc\\x76\\xb4\\xef\\xa3\\x9e\\xa1\\x3e\\xd6\\xb4\\x93\\xbb\\x1b\\xbf\\xeb\\xc0\\x39\\x8c\\xae\\x29\\xe9\\x73\\xe4\\xee\\x4f\\xc9\\xae\\xe5\\x5b\\x37\\x7d\\x0e\\xfd\\x58\\x30\\x29\\x67\\xb9\\x48\\xc7\\x6f\\xc0\\xe3\\x19\\x91\\x2a\\x96\\x36\\xf7\\x09\\xa5\\x6b\\x50\\x88\\xb4\\xac\\x94\\x2b\\xa1\\x43\\x1f\\x4d\\xa4\\x59\\x67\\x6f\\x88\\x20\\x87\\xb6\\x49\\x6c\\x92\\x15\\xd8\\xa7\\x6d\\x52\\x61\\xcf\\xcf\\xb7\\xd1\\x7e\\x85\\x8f\\xd1\\x0b\\x7b\\xae\\xd4\\x47\\x31\\x6f\\xbb\\xe3\\x0c\\x51\\x7b\\x1b\\xe5\\xfc\\x2a\\xad\\x3f\\x3c\\xb6\\xf6\\xde\\x8e\\xd3\\xc3\\x0c\\x2a\\xea\\x68\\xbe\\x58\\x54\\xa9\\x59\\x6d\\x58\\x6a\\xdc\\x29\\xaf\\x3f\\x8c\\x28\\x21\\xb8\\xef\\x3d\\xa0\\x31\\xe5\\x08\\xd1\\x42\\xc9\\xbe\\xc2\\xac\\x7a\\x78\\x67\\x7a\\x8e\\x9a\\xe1\\x5f\\xaf\\xde\\xa0\\xa9\\x5b\\x1e\\x11\\xb0\\x37\\xcd\\x7c\\xbb\\xe8\\x2d\\x89\\x7a\\x32\\xe7\\xca\\xa9\\xd5\\xe0\\x58\\x76\\xa5\\xc0\\xb5\\xef\\x6a\\x4b\\x1e\\x40\\xa6\\x7e\\x9f\\x6f\\x92\\xad\\xf7\\xa0\\x6d\\xb1\\x0d\\xfa\\x91\\x0c\\x75\\xce\\x50\\x76\\x51\\x8e\\x7f\\x28\\x5e\\x1a\\x39\\x18\\x45\\x50\\xcb\\xbc\\xe1\\xde\\x30\\x53\\xc3\\x67\\x9c\\xd9\\x75\\x75\\x6a\\x0f\\x9d\\x31\\xa2\\xff\\xba\\x8c\\xdc\\x47\\xd2\\xc7\\xef\\xe4\\x53\\x14\\x66\\xb3\\x76\\x9c\\x3d\\xc0\\x35\\x52\\xdd\\x3a\\x5f\\x4c\\xfd\\xfd\\xae\\x22\\xf6\\xfc\\x25\\xa4\\xa3\\x21\\xbd\\xa6\\x65\\x87\\x0f\\x97\\x60\\x1d\\x8c\\xf8\\x6a\\x9d\\x75\\xd7\\x69\\x58\\xcc\\xd3\\x1c\\x2c\\xfe\\x23\\x97\\x89\\x4e\\x4e\\x10\\xaf\\xc5\\x59\\xe5\\x6a\\xca\\x9c\\x48\\x88\\x4e\\xe8\\x27\\x87\\x2b\\x0d\\x73\\xf6\\x32\\xd1\\xaf\\x6d\\x3b\\x4b\\x3b\\x84\\xc4\\xb6\\x2a\\x1e\\xc7\\x54\\x8b\\x10\\xd1\\xab\\xcb\\xb8\\xcd\\xb3\\x2c\\x41\\xcd\\x2c\\x21\\x39\\xfb\\x5b\\x7a\\x53\\x2e\\x3d\\xa1\\xf4\\xf6\\x10\\xd7\\x2e\\xf0\\x9f\\xe3\\x60\\x4d\\x7f\\x10\\xf2\\xcf\\xa0\\x98\\x1f\\xc2\\xdf\\x6e\\x26\\x21\\xfe\\x9e\\x21\\xfc\\xdc\\x7c\\xff\\xe4\\xda\\x80\\x09\\xe2\\xc6\\x01\\x3f\\x4b\\x84\\x40\\x2c\\xe2\\x45\\x5c\\x3c\\xf8\\xca\\x09\\xca\\x61\\x69\\x03\\xa1\\x8f\\x02\\x47\\xbb\\x33\\xba\\x57\\x20\\x4f\\xba\\x79\\x65\\xde\\x31\\x98\\x32\\xd3\\x6e\\x1b\\xac\\x3a\\x60\\x71\\x9e\\xdb\\xce\\xb4\\x52\\x38\\x21\\xef\\xa7\\x9d\\xc9\\x1f\\xbe\\xdc\\xb8\\xa7\\x60\\x58\\xae\\x01\\xfe\\x71\\x18\\xa1\\xf2\\xa8\\x1f\\xa6\\x5d\\x64\\xbd\\x2a\\x54\\x37\\x8a\\x64\\x19\\x4a\\xdf\\x28\\x8b\\x80\\x19\\x2b\\xcc\\x61\\x67\\x6e\\x77\\x08\\xa8\\x01\\xf9\\x3e\\xc6\\x57\\xd9\\x02\\x78\\xa8\\x02\\x6f\\x02\\xd1\\x2c\\x77\\xa4\\x4c\\x7d\\x25\\xe7\\x0c\\x77\\x5e\\x03\\x48\\xb7\\x2c\\x6b\\x29\\xf9\\x26\\xd9\\x12\\xed\\x7a\\x95\\x2a\\xf7\\x18\\x6b\\x2a\\xf9\\x26\\xd5\\x12\\x6d\\x3c\\xeb\\xc3\\x6f\\x3a\\x0a\\xa8\\xd7\\x7f\\xa4\\x1d\\xa5\\xc9\\xb8\\x8b\\xbe\\x2d\\xa2\\x0c\\x9e\\xcb\\x29\\x8a\\x40\\x08\\xb5\\xab\\xd0\\xed\\xab\\x56\\x1c\\xab\\x46\\x73\\x2e\\x9d\\x9d\\xfb\\x29\\x46\\xf3\\x5a\\x73\\xfb\\x43\\xc3\\x8b\\x67\\x59\\x2b\\xd1\\x41\\x2a\\x95\\xe8\\x15\\x2f\\xd0\\x0f\\x59\\x61\\x46\\x38\\xe3\\xd6\\xe1\\x95\\xa6\\xec\\xaa\\xca\\x2c\\xca\\x5f\\x0e\\xfb\\xe7\\xea\\xb5\\x59\\xa3\\x5d\\xc2\\x28\\xe1\\x03\\xb7\\xf2\\x7d\\xdf\\xb3\\x16\\xa9\\xc4\\xe1\\x9c\\x19\\x67\\xca\\xb0\\xdd\\xdb\\x34\\xdb\\x8a\\x8d\\x4a\\xac\\xd2\\x7a\\xf4\\x3d\\xb4\\x0c\\x71\\x30\\xea\\x35\\xbd\\x0e\\xff\\x1a\\x4e\\xf8\\xfc\\x35\\x84\\x69\\x84\\xbb\\xeb\\x9d\\xa6\\x47\\xbf\\x98\\x2e\\x87\\x63\\x3d\\x39\\xcc\\x9f\\x21\\x39\\x23\\xa2\\xc1\\x13\\x36\\x1d\\x28\\x1f\\x85\\xc4\\xbc\\xcd\\x99\\xfd\\xb6\\x3f\\x46\\x91\\xf8\\x43\\xbb\\x4c\\x4d\\x5b\\x4e\\x14\\xaa\\x32\\xe4\\x71\\x5d\\x50\\x35\\x6c\\xb0\\x41\\x4b\\xa7\\x31\\xb9\\xf4\\xa9\\x16\\xfa\\xca\\x3c\\x76\\x68\\x7a\\xe5\\x5b\\xf2\\x17\\x84\\x5b\\x0c\\xb2\\xf0\\xff\\xcd\\x10\\xe3\\x59\\x93\\x5a\\x23\\x43\\x67\\xa7\\x7b\\x38\\xa3\\xdd\\x09\\x29\\xda\\x31\\x93\\x04\\x63\\x43\\xb0\\x28\\x96\\x0f\\xd0\\x0c\\x90\\x18\\x51\\x87\\x8d\\x85\\xe5\\xc2\\xbc\\x80\\x8e\\xcd\\x29\\x48\\xcb\\x68\\x0e\\x36\\xc1\\x04\\x2e\\x86\\x85\\x1d\\x9a\\xcb\\x8a\\x30\\xc0\\x02\\x4d\\x0e\\x4d\\x48\\x14\\xfd\\xbb\\x0f\\x1d\\x30\\x9e\\x82\\x5f\\xf9\\x2f\\x67\\x4c\\x0c\\xcd\\xe7\\x4c\\xd6\\x07\\x7a\\xc7\\x7b\\xfb\\xb9\\xa3\\x97\\xd2\\x82\\x82\\x94\\x08\\x84\\x59\\x0c\\x4c\\x25\\x4d\\x8c\\x0d\\x0d\\x01\\x23\\x58\\xcf\\xde\\xde\\x07\\xfe\\x40\\x21\\x62\\x9c\\x51\\x55\\xe0\\x76\\xeb\\xfe\\x7e\\x21\\x88\\x76\\x7b\\x87\\xd6\\xd6\\x0a\\x34\\x8f\\x85\\xc5\\x69\\x9d\\x16\\xfc\\x03\\x0b\\xeb\\xf8\\x9d\\x85\\x99\\xb1\\x56\\xb3\\xce\\x1e\\xa8\\x30\\x01\\x07\\x82\\x32\\x91\\x65\\xfe\\xd7\\xd7\\xd0\\xd0\\x3c\\xd0\\x10\\x1b\\x5a\\x1c\\x1a\\xb5\\x15\\xe2\\x1f\\x53\\xf0\\x2b\\x2d\\x22\\x4c\\x60\\x23\\x72\\x08\\x78\\xc2\\x10\\x84\\xe9\\x2d\\xf3\\x22\\xd3\\x87\\x05\\xa2\\x79\\xa5\\x21\\xf7\\xb0\\xab\\x44\\x90\\x8c\\x90\\xa8\\x90\\xb4\\x90\\xbc\\x90\\x94\\x90\\x9c\\x90\\x41\\x9f\\x34\\xb1\\xbe\\x51\\x6c\\x7e\\xe2\\x59\\xce\\x0e\\x2d\\x08\\x14\\x32\\xb5\\x07\\x75\\xa6\\xd3\\x8b\\x05\\xa9\\x36\\x95\\x4b\\x94\\x4b\\x94\\x47\\x04\\xa1\\x66\\x07\\xa7\\x31\\x05\\xab\\x3a\\xf5\\x02\\x3a\\x07\\x8d\\x80\\x50\\x3e\\x19\\x5e\\xae\\xef\\x9f\\x41\\x3b\\x1a\\x28\\x71\\x02\\x9c\\x0f\\x86\\xa0\\x10\\x3f\\x14\\x77\\x81\\xd5\\x5b\\xc3\\x81\\x90\\x43\\x94\\x74\\xc2\\xb4\\x1d\\x01\\xd7\\x73\\xb2\\x73\\x95\\x52\\x84\\x5f\\xd0\\x31\\xb6\\x88\\x8e\\x74\\x31\\xb2\\x82\\xc1\\x70\\x7a\\x60\\xb3\\xe7\\xb4\\x95\\xb6\\x17\\x78\\x99\\xba\\x9b\\xbc\\x9d\\xbe\\x1f\\xe0\\xc1\\xc2\\xfd\\x3f\\xf3\\x8d\\xf7\\xbf\\x25\\x2a\\xcf\\x33\\xd7\\x3b\\xdf\\xc1\\x47\\x49\\x8f\\x53\\x97\\x5b\\x9f\\xe1\\xa4\\x6b\\xaf\\x73\\xb7\\x7b\\xbf\\x41\\x87\\x8b\\x0f\\x93\\x17\\x9b\\x1f\\x61\\xa4\\xa8\\x2f\\xb3\\x37\\xbb\\x3f\\x21\\xc7\\xc9\\x4f\\xd3\\x57\\xdb\\x5f\\x11\\x64\\xeb\\x6f\\xf3\\x77\\xfb\\x7f\\x81\\x05\\x09\\xf5\\x11\\xe7\\x19\\xed\\xa1\\xfd\\x56\\x9a\\x63\\xaa\\x73\\xba\\x85\\xfb\\x85\\x68\\x77\\x99\\xb5\\x95\\x64\\x31\\xa9\\xd3\\x69\\x39\\x56\\x5f\\x34\\xa1\\x51\\xad\\xdf\\x64\\x7e\\xf9\\xe6\\x86\\xcb\\x6e\\xbf\\xdd\\x6e\\xb6\\x11\\x77\\xe9\\xe3\\x7e\\xbd\\x35\\xa2\\xf8\\x27\\x31\\xdd\\xab\\xc5\\xd8\\x48\\xe8\\x29\\xa9\\x9e\\x36\\x3c\\x4e\\x0b\\x71\\x08\\x11\\xf1\\xf4\\xd0\\x70\\xe5\\x70\\x91\\xb1\\x72\\x75\\x29\\x2d\\x13\\xc6\\xf8\\x78\\x79\\x5b\\xc6\\xda\\x3a\\xcb\\xff\\xe4\\x66\\xc9\\xa6\\xc5\\xde\\xa0\\xa7\\x2e\\x69\\x6f\\x17\\x2d\\x7c\\x04\\x85\\x80\\xdf\\x67\\x5a\\xd1\\xeb\\x1e\\x59\\x44\\x46\\xc1\\xc5\\x41\\x03\\x14\\xfa\\xcb\\x4f\\xa5\\x84\\x49\\xf6\\x2f\\x8b\\x07\\xfb\\xc0\\x9c\\x49\\x98\\xa0\\x9c\\x9a\\x20\\x22\\x40\\xd0\\x1e\\xd5\\x04\\x00\\x90\\xdc\\x50\\xb5\\xc0\\x1e\\x18\\x22\\xd0\\x07\\x8c\\x02\\x53\\xc0\\x12\\xb0\\x06\\x6c\\x01\\x87\\xc0\\x25\\xf0\\x09\\x14\\x81\\x91\\x82\\x71\\x83\\x21\\x82\\x7d\\x03\\xc3\\x02\\x23\\x00\\x23\\x05\\x63\\x05\\x83\\x05\\x1a\\x81\\x71\\xe0\\x00\\xe8\\x00\\x4e\\x80\\x1e\\xb0\\x9f\\x80\\x28\\x14\\xda\\x7f\\x5e\\xea\\x29\\x75\\xc8\\xeb\\x08\\xa1\\x6e\\x21\\xa1\\x40\\x04\\x0d\\xae\\x12\\x71\\xad\\x7f\\x6f\\xf8\\x9b\\x30\\xec\\x93\\x07\\x05\\x37\\xb8\\x14\\x6b\\x6c\\xca\\x13\\x76\\x08\\x6b\\xc5\\xe1\\xfc\\x3b\\xda\\x09\\x8c\\x50\\x30\\x48\\x14\\x69\\xbd\\x06\\x3b\\x37\\xaf\\x50\\x32\\x03\\x9a\\x18\\x53\\xd2\\x57\\x98\\x9f\\xf8\\x1b\\x8b\\x4d\\x64\\x3e\\x2b\\x0f\\x4f\\x83\\xcb\\xf4\\x5f\\x16\\x99\\xf1\\xdf\\xe5\\x1e\\xa7\\x36\\x33\\x2a\\xc7\\xa4\\x09\\xfd\\x5b\\xd0\\x53\\xec\\x9f\\xf2\\x92\\x4d\\x0d\\xc0\\x73\\xe1\\xf9\\x79\\x6c\\x4c\\x63\\x08\\x8c\\xb6\\xad\\xf9\\xc3\\xb8\\xdb\\xfb\\x17\\x02\\x74\\xc6\\xdc\\x1f\\x1e\\x6b\\xe0\\x90\\xcf\\x81\\x0a\\x05\\x5b\\x8e\\x27\\x48\\xbb\\xb1\\xe4\\x6b\\xee\\x03\\x3e\\xfc\\xfd\\x83\\xf0\\x9e\\x07\\xab\\x91\\x75\\xe1\\x61\\x91\\x1b\\xee\\x94\\x18\\xf2\\x28\\xc3\\x49\\x26\\xe4\\x1a\\x7b\\xaa\\x7d\\x02\\xe5\\x2d\\x78\\x69\\xcf\\x98\\x91\\xb1\\x30\\xad\\x78\\x9f\\x5e\\xa0\\x58\\xf9\\xab\\x85\\xf5\\xd8\\x7a\\xa2\\xb6\\xe9\\xf7\\x5c\\x67\\x08\\x0b\\xda\\xeb\\x18\\xab\\xa0\\x8a\\x8d\\x1d\\x64\\xfa\\xd7\\x22\\xf1\\xd2\\xbd\\xd3\\x77\\x99\\x84\\x89\\xe2\\x3a\\xf6\\xb4\\xb4\\xfa\\x2f\\x52\\xf4\\xbe\\xb0\\x31\\x57\\x35\\x95\\xa6\\xc9\\x97\\xf5\\x3e\\xbd\\xfa\\x86\\x13\\xc3\\x10\\xea\\xa9\\x20\\x98\\xd5\\x01\\x75\\x2f\\x44\\x02\\x64\\x14\\xf2\\xef\\xf3\\x2d\\xa4\\xe3\\xb4\\x48\\x68\\x4f\\xc6\\x15\\x83\\xb0\\x68\\x49\\x78\\xf0\\x5c\\x87\\x9b\\x63\\x5f\\x85\\x82\\xaf\\x92\\xdf\\x86\\x3b\\xa5\\xa4\\x79\\x0e\\xc2\\x9b\\xa0\\x87\\x7f\\xaf\\xf4\\xe6\\xb2\\x2b\\x34\\x80\\x78\\x33\\xe4\\xec\\x1c\\xf0\\xfb\\x5f\\xb4\\xf0\\xfa\\x3c\\x7a\\xb0\\x65\\xb8\\x5f\\x46\\xc3\\xd7\\xb1\\xd0\\x8c\\x79\\x8c\\xa9\\x02\\xe1\\x44\\x85\\xc5\\xd5\\x5e\\xc3\\x71\\x66\\xba\\x68\\xa1\\xff\\x29\\xbf\\xcf\\x08\\xfe\\x09\\x3c\\xbc\\x8d\\x0f\\xc8\\x82\\x6d\\xbc\\x5a\\x15\\xe5\\x4d\\x6d\\x72\\x43\\x66\\x52\\x87\\xf5\\xf6\\xdf\\xd8\\xbc\\x9b\\x88\\xea\\x50\\x6f\\x9b\\x8e\\x16\\xf6\\x70\\x28\\xb7\\x2e\\x9d\\xa7\\x9a\\x7a\\xd7\\x9f\\xee\\x1e\\x81\\xc8\\x26\\x40\\x18\\x10\\x32\\xe9\\xcb\\x98\\x79\\xff\\x92\\x0e\\x7a\\xe3\\xa5\\xad\\x66\\xb5\\x44\\x86\\x14\\xf1\\xe6\\xf0\\x06\\xe5\\x37\\x9d\\x45\\x56\\x74\\x62\\xf2\\xd7\\x53\\x2c\\xf4\\xd4\\x69\\x03\\xff\\xff\\x16\\x0a\\x06\\x02\\x01\\x28\\x9e\\xeb\\x5d\\x5d\\x30\\xbe\\xdf\\x97\\x9e\\x00\\xdf\\xeb\\xc9\\x0b\\xdb\\x9d\\x0b\\x5b\\xb9\\x7a\\xab\\x0c\\x64\\x62\\xdb\\xfa\\x0c\\x54\\xf0\\x3c\\x29\\x15\\x6f\\xb5\\x53\\x7c\\x21\\x6e\\xea\\x55\\x25\\x5a\\x4d\\xb4\\x1f\\x1d\\xc1\\xab\\x39\\x9a\\xe6\\xec\\x36\\x3e\\x67\\xe8\\x8f\\x65\\x44\\xcd\\x16\\x7d\\x51\\x5d\\x62\\xd9\\x5d\\x08\\xd8\\xdd\\x2e\\x57\\x59\\x6b\\xb6\\xf0\\xbb\\xef\\x5f\\x3b\\xd7\\xe8\\x49\\x59\\x59\\x5b\\x93\\x9b\\x2e\\x57\\xa7\\x76\\x91\\x82\\xe1\\xa8\\x3f\\x27\\x5b\\x64\\xc9\\x7f\\xd6\\x25\\x66\\xe3\\x90\\xd5\\x15\\x17\\xaa\\x51\\x7f\\xb0\\x57\\x8f\\xa5\\xa0\\xa4\\x27\\xe6\\x03\\x11\\xa2\\xe8\\xb7\\x8d\\x50\\x0a\\x14\\x55\\xce\\x73\\x41\\xc5\\xa4\\x43\\xf7\\x70\\x64\\xe5\\x7f\\xc4\\x92\\x4f\\x50\\xf3\\x24\\x19\\x8a\\x56\\xce\\xa3\\x69\\x93\\x40\\xeb\\xfc\\xa2\\xde\\x7f\\x7b\\xc9\\xc6\\xc2\\x42\\x67\\x7d\\xe8\\xa8\\x3b\\xec\\x83\\x49\\xf7\\x74\\x93\\xc5\\xb7\\xe8\\xa4\\xa2\\x05\\xcb\\x4b\\xad\\xa3\\xcb\\x4c\\xe3\\xa9\\x87\\xd8\\x98\\x2a\\xc4\\x92\\x0f\\xd2\\xd9\\x2a\\xc4\\x1a\\x16\\xa8\\xf3\\xb5\\x4a\\xf7\\x55\\x8a\\x86\\xd3\\xb5\\x3b\\x39\\xc3\\x72\\x10\\xac\\xca\\xbe\\xc0\\xe8\\x8a\\xfe\\x11\\xe5\\xf5\\xfc\\x02\\xf1\\x32\\x22\\x56\\xe3\\xa7\\xd6\\x87\\xfe\\x75\\x0e\\x95\\x1c\\x94\\x3f\\x8b\\x94\\x36\\x2e\\x27\\xfb\\x9d\\xff\\xad\\x4e\\x4a\\xcd\\x91\\xa9\\x9c\\xfb\\xe6\\x8c\\x8a\\x49\\xd6\\x79\\x37\\xf4\\x24\\x2c\\x5a\\xbd\\xc8\\xf6\\x22\\xeb\\x28\\x34\\x63\\x71\\xf1\\x2d\\x39\\xd4\\x58\\x6e\\xb7\\xe6\\x25\\x15\\x21\\x07\\xe4\\x4c\\xac\\x3b\\x53\\x14\\xf0\\x4e\\xf1\\x0e\\xb5\\x52\\x43\\x2c\\xda\\x8e\\xb8\\x4c\\x40\\x1c\\xe6\\x4a\\x2c\\x75\\xd4\\xbf\\x9e\\xd4\\xa7\\x28\\xff\\xf3\\xb7\\xa4\\xb6\\xd1\\xab\\x54\\xc6\\x02\\xd4\\x08\\x95\\xb0\\x4b\\xd5\\x55\\xb9\\xb9\\xd0\\xd8\\x04\\x03\\x12\\x05\\xeb\\xbe\\x95\\x15\\x72\\x68\\x03\\x49\\xd1\\x9e\\xe7\\xf8\\xcf\\xba\\x78\\x51\\x07\\x21\\x62\\x7f\\xd3\\xa0\\x78\\xd3\\x8e\\x01\\x24\\x42\\xa5\\x26\\xca\\xe2\\xa3\\x2b\\xa9\\xc3\\xd0\\x5f\\xe8\\xea\\xa9\\x07\\x4b\\xc2\\xb5\\xed\\x44\\x3e\\x30\\x1c\\x4e\\xaa\\x6c\\x28\\x88\\x6f\\x97\\x6a\\x53\\xcd\\x86\\xa3\\xea\\xc9\\xf5\\x77\\x0e\\x5a\\x26\\xad\\xfe\\x1f\\xe1\\x4b\\xe1\\x3b\\xb5\\xd2\\x4f\\xd4\\x6c\\x27\\x62\\x96\\xca\\xf4\\x4f\\x41\\x18\\x45\\x6a\\xd6\\x35\\x9b\\x01\\xc8\\xb5\\x9f\\x77\\x48\\x70\\xea\\x5c\\x5f\\x5c\\xbd\\x5f\\x13\\x28\\x9e\\xb9\\x47\\xde\\x19\\x61\\xba\\x15\\x84\\x18\\x03\\xfe\\x13\\x2f\\xb8\\xf6\\x1b\\xb6\\x33\\x75\\x7d\\x42\\xa3\\x1b\\x17\\xb0\\x5c\\x9f\\x9e\\x4d\\xe6\\x1e\\xb3\\x50\\x06\\x37\\xf5\\x3b\\xf0\\xef\\xf8\\xbd\\x3b\\x2f\\x59\\x8c\\xef\\xc8\\x1f\\x6a\\xec\\xef\\x34\\xad\\xe6\\x83\\x9d\\xf2\\xd9\\x5e\\x59\\xbe\\x1f\\xf2\\x2e\\x41\\xaf\\x53\\xc2\\xbc\\x0c\\xc8\\x0f\\xf0\\x3f\\x85\\xaf\\xd4\\x50\\xd9\\xbc\\x5e\\xa1\\xc2\\xf8\\x78\\x3e\\x4a\\x90\\x27\\x87\\xf0\\xcb\\xe2\\xdf\\x64\\x76\\x29\\x88\\xc9\\x6f\\x28\\x34\\xfb\\xfd\\xa5\\x3f\\x5e\\x16\\x12\\x6e\\x52\\x17\\x15\\x13\\x5f\\xd2\\xc7\\x47\\x78\\x9d\\x27\\xe3\\xd0\\xe2\\xf1\\xee\\xfb\\x0c\\x7e\\x29\\x3c\\x14\\x10\\xf2\\x79\\x8f\\xdc\\x48\\xc4\\xfb\\x9f\\x97\\x0d\\x22\\x7b\\x1f\\x08\\x58\\xde\\xba\\x7b\\x57\\xf0\\xe3\\x06\\x34\\x9f\\x13\\x7e\\x89\\x18\\x48\\x3a\\x0c\\x12\\x72\\xa2\\x14\\x4a\\x50\\xfe\\xf5\\xab\\xed\\x58\\xd4\\xe9\\xce\\x56\\x4d\\xa2\\x89\\x5c\\xe7\\x83\\xe6\\x11\\xc5\\x0b\\x5c\\xeb\\xd4\\x1c\\x1f\\x89\\x2b\\x5d\\x67\\x29\\xf6\\x7e\\xb2\\x0c\\x13\\x4c\\x28\\xb4\\x8c\\xcf\\x87\\x0b\\xc2\\x68\\x9a\\xad\\xa0\\x0a\\xdc\\x07\\x76\\xc2\\xae\\x1c\\xb9\\x97\\x62\\x09\\x61\\x3a\\xd3\\x91\\x18\\xb3\\xd1\\x57\\xc6\\x77\\x51\\xfa\\x9d\\xe8\\xc4\\x2b\\x1a\\x85\\x51\\x50\\x6b\\x2a\\x94\\xce\\x97\\xf5\\x6e\\xd9\\x78\\xe8\\xbc\\x86\\x8a\\xf6\\xc4\\x89\\xac\\x3c\\x4b\\xd4\\xd4\\xd9\\xd8\\xcb\\xbd\\xc6\\x45\\x42\\xbd\\xfb\\xd7\\xcc\\x1c\\xf5\\x1f\\x5f\\x59\\xc9\\x66\\x61\\xff\\x5c\\x39\\x44\\x42\\x0b\\xff\\xf2\\xac\\x79\\x6b\\xbf\\x8b\\xca\\x6e\\xec\\xae\\xd6\\x10\\xf1\\xfb\\xa9\\x29\\xd8\\x60\\xd9\\x58\\xdd\\x59\\xa8\\x89\\x0c\\x2d\\xbc\\x07\\x8e\\x83\\x38\\xba\\x6c\\x28\\xe5\\xa7\\xc0\\xad\\x93\\xfb\\x6a\\x31\\x99\\xce\\x6e\\x31\\x5c\\x8e\\xb2\\xe3\\xff\\xbe\\x57\\x75\\x46\\x2f\\xb4\\x28\\x90\\xc1\\x72\\xba\\x2a\\xa5\\xb2\\x7c\\xe5\\x67\\x33\\x53\\xa0\\x43\\x08\\x0a\\xe3\\xb7\\x6b\\xbb\\xf9\\xc7\\x85\\x3e\\xcc\\x70\\xc1\\xf4\\x15\\x16\\x71\\xe5\\xb5\\x01\\x7a\\xea\\x68\\x13\\xe0\\xb3\\xd3\\x72\\x99\\xee\\x84\\x33\\x39\\x1a\\x8c\\xf3\\xe1\\x7f\\xed\\xb5\\xf9\\x3a\\xce\\xb9\\x0f\\x10\\xa7\\x35\\x5d\\xee\\x03\\x69\\x57\\x37\\xf2\\x4a\\x6c\\x4a\\x9e\\x06\\xfe\\xed\\xfe\\x47\\x9d\\x58\\x29\\x2c\\x5f\\xf5\\xd8\\x48\\x4a\\x46\\xe4\\x46\\xb7\\xb1\\x90\\x78\\xa6\\xa7\\x4d\\xd6\\x56\\xd1\\xb8\\xed\\x58\\xca\\xb9\\x96\\xb7\\x6f\\x95\\x67\\x8d\\x7e\\xc0\\xac\\x90\\xf6\\x02\\x10\\x12\\xd4\\x60\\xec\\xea\\x86\\x5f\\xdb\\xea\\x57\\xc1\\x6e\\x3f\\xfe\\xbb\\xf6\\xf6\\x6e\\xe2\\xf6\\xd4\\x18\\xdb\\xb6\\xfa\\x04\\x94\\xc0\\x50\\x7e\\x4a\\x8e\\x43\\x1c\\x59\\x2e\\x9e\\x79\\xf7\\x67\\x7c\\xcc\\x97\\x83\\x87\\x57\\x6d\\x37\\x05\\x0e\\x74\\x8a\\xd3\\xe9\\x04\\xad\\x80\\x8b\\xa2\\x18\\x92\\xa2\\xa1\\x1c\\x2e\\x04\\xea\\x2a\\xeb\\x6e\\xf7\\x2a\\x2e\\xc5\\x3b\\x2f\\xbe\\x58\\xa5\\xa5\\xe0\\x1f\\xdd\\x6b\\x79\\x18\\xb8\\x6c\\xe9\\x79\\xe8\\xb9\\x5c\\xf2\\xcd\\x20\\xda\\x9e\\xb1\\x18\\x1a\\xee\\x74\\x43\\xc0\\x87\\x62\\xb2\\x37\\xb3\\xcf\\xa3\\x3d\\xeb\\xba\\x5c\\x6e\\xdd\\xf4\\x09\\x64\\x63\\xaf\\xfb\\x28\\x5e\\x07\\xf9\\x65\\x40\\x4b\\x92\\x48\\xe4\\xf8\\xec\\x3c\\x3d\\x16\\xcc\\x74\\x3d\\x6f\\xbb\\xbc\\xc7\\xe0\\x6f\\x58\\xb8\\xe6\\xdc\\x1e\\xbc\\xe3\\x51\\x26\\xaa\\xc7\\x6f\\xf6\\x38\\xbd\\x9f\\xb8\\x5c\\x6d\\xf8\\x5f\\x9d\\x3c\\x3e\\xdb\\x0b\\xb4\\x38\\x7d\\x8c\\x82\\x15\\xe0\\x8e\\xc4\\x3b\\x90\\x12\\xad\\xbd\\xe1\\x6f\\x5a\\x8c\\x41\\x7c\\x88\\x49\\xa1\\xcc\\x47\\xb6\\x46\\xe7\\x16\\x52\\x8a\\x42\\xa6\\xfc\\xa2\\x93\\xe2\\xf9\\x59\\x2b\\x04\\xa9\\xfa\\x28\\xa4\\x6a\\x35\\x24\\x48\\x35\\xa4\\xdf\\x84\\x53\\x26\\x83\\x1c\\xb2\\x19\\x6d\\xb5\\x64\\xc4\\x3b\\x34\\x7b\\xb0\\x3f\\xea\\xec\\x24\\x0a\\xcd\\x55\\xff\\x06\\x5e\\x5f\\x6e\\xd6\\x1b\\xba\\x5a\\xba\\x4c\\x45\\xe5\\x63\\xa4\\xc5\\xc1\\xf0\\x2d\\x7e\\x22\\x55\\xf5\\x8e\\x1a\\x37\\xa8\\x18\\x3c\\x0a\\x07\\xac\\x31\\x59\\x0c\\x6b\\x7d\\x11\\x9a\\x88\\x69\\x2d\\x79\\xab\\x0a\\xba\\x1b\\xaa\\x15\\xc2\\xd8\\x98\\x14\\x0a\\x16\\x1c\\x7e\\x3c\\xbf\\x51\\xa0\\x4a\\x01\\xa0\\x0a\\xab\\x9a\\x83\\x47\\xa1\\xa3\\xa2\\xa7\\x33\\x79\\xb1\\xce\\x55\\x47\\x79\\x84\\xc8\\x63\\xeb\\x3d\\x46\\x74\\xfb\\x5c\\x36\\x60\\x34\\xbd\\xe1\\x41\\xb1\\xf3\\x33\\xba\\xfa\\x87\\xcd\\xaa\\xa8\\xfd\\xba\\x9d\\x60\\x54\\x03\\xf7\\x86\\x5e\\x40\\x51\\x22\\xef\\xa9\\xb0\\x62\\x75\\x7a\\x47\\xf5\\x48\\xb1\\x7c\\xe6\\xf0\\x86\\x6e\\xe6\\x52\\x5e\\x1e\\x77\\xa9\\xe7\\x24\\xbb\\x23\\x34\\x70\\x22\\x66\\xd3\\x3c\\x93\\xe6\\xff\\xb9\\xfa\\x6e\\xe0\\x77\\x55\\xdf\\xd6\\xf2\\xc8\\x23\\x0d\\xd2\\x58\\x30\\x33\\xa1\\x7f\\xf5\\x3e\\x63\\x48\\xa1\\x42\\x42\\x32\\xe8\\x64\\x3c\\x2c\\x94\\x0c\\x95\\xf7\\x58\\x91\\x45\\x67\\x57\\x95\\xb3\\x39\\xd1\\xe3\\x2e\\xe7\\xe6\\x3f\\xe2\\x1c\\xce\\x70\\xba\\x85\\x49\\xa7\\xb3\\x08\\xe1\\xad\\x11\\xb4\\xb2\\x8f\\x74\\x2e\\xd7\\x66\\xfe\\xd7\\x7a\\x9b\\x3f\\x66\\x05\\x46\\x1f\\x7c\\x81\\x11\\x80\\x4a\\xfd\\x98\\xf3\\xc8\\xc0\\x19\\x9f\\x53\\xf6\\x8c\\x79\\x95\\x22\\x81\\x16\\xf6\\x02\\xa7\\xe6\\x87\\x78\\x1a\\xe7\\x18\\x7d\\x74\\x1c\\xa0\\x72\\x4d\\x86\\xf4\\xab\\x96\\x96\\x52\\xa8\\x86\\xc1\\x96\\x8e\\x8a\\xc2\\x62\\x3e\\x1d\\xdf\\xf9\\xd3\\x6b\\xec\\x9f\\xd7\\xe3\\x1d\\xf2\\x27\\x5b\\x9e\\x42\\xa4\\x3e\\xe9\\x9f\\x98\\x1e\\xeb\\x6a\\x7e\\xe9\\x00\\x22\\x8d\\x1e\\x03\\xc2\\xae\\xdd\\xa8\\x5b\\x61\\xa6\\x0e\\x77\\x62\\x5d\\x1f\\xeb\\xa3\\xa6\\x21\\xbe\\xf4\\x8e\\xcb\\xf5\\x2e\\x5f\\xe9\\x2e\\x8d\\x52\\x4b\\xc9\\x50\\x58\\xdd\\x6c\\x4d\\x19\\xf8\\x19\\x39\\xbe\\xce\\xea\\xd4\\x0f\\xc4\\xcb\\x12\\x81\\xf7\\x98\\xca\\x1e\\xde\\x54\\x7e\\x59\\x8a\\xa3\\x79\\xa7\\x87\\x3a\\x2f\\xdc\\x91\\xa6\\xee\\xea\\x1a\\x94\\xd3\\xe3\\xe6\\x6e\\xa6\\x38\\x3d\\x9e\\x9f\\x88\\x18\\xa9\\x21\\xdd\\xb7\\xbd\\x4b\\x42\\x87\\xf9\\xc1\\x93\\x51\\x56\\xfa\\xfe\\x87\\xd0\\xd1\\x69\\xa8\\x13\\xfd\\x18\\x3d\\x4b\\x52\\x34\\x1f\\xbf\\xc5\\xd7\\xa7\\x9e\\x5b\\x73\\x52\\x1e\\x96\\x0d\\xd6\\xbc\\x3e\\x21\\x9e\\x77\\x6e\\x08\\xcb\\x14\\x79\\x42\\xe4\\x17\\x5a\\xb2\\xd3\\xd3\\xf3\\x41\\xdd\\x99\\x18\\xe7\\x06\\x59\\x92\\x5d\\x78\\x84\\x5d\\x63\\x6a\\xca\\x41\\x0f\\x8c\\x4e\\x89\\x70\\xb2\\x32\\xda\\xe8\\xa5\\xc1\\x6a\\x32\\xbc\\x52\\x94\\xe5\\x68\\xfb\\xb5\\x1a\\x64\\x54\\x7d\\x22\\xd4\\xeb\\x7b\\xd5\\xd5\\x69\\x67\\xab\\x05\\xf0\\x4e\\x53\\x57\\x36\\x60\\x97\\x99\\x8d\\x3c\\x37\\x2c\\x1d\\x3f\\xba\\x8f\\x6a\\x0f\\xf2\\x42\\x56\\x2b\\x58\\x5b\\x82\\xe4\\x15\\x3f\\xa5\\x59\\x23\\x7b\\x7c\\x16\\xd0\\xad\\x02\\xe9\\xe7\\x6b\\x56\\x40\\x34\\x8b\\x78\\xb9\\xa9\\x27\\x36\\xc8\\x27\\x2e\\xa7\\x18\\xba\\x03\\xc0\\xa7\\x5b\\x7b\\xec\\x07\\xd4\\x7c\\x71\\xcc\\x65\\x95\\xe1\\x45\\x15\\x9e\\xca\\x29\\x81\\x1c\\x7c\\xa3\\xa5\\x7a\\xae\\x13\\xdc\\x52\\x77\\x11\\x1a\\x3d\\x6e\\xde\\xe3\\x5c\\x2e\\xa7\\x21\\xd6\\xd4\\x06\\x7c\\x00\\xd7\\xbf\\x7b\\x87\\xc7\\x63\\x2c\\xda\\x8a\\x52\\xfa\\x4d\\x2a\\x5f\\x48\\x5d\\x8d\\x98\\x95\\xb9\\xd2\\xd5\\x60\\x01\\xd5\\x64\\x63\\x1c\\xb0\\x70\\xb4\\x2e\\x4f\\x3d\\xd5\\x47\\x5f\\xbb\\x3e\\x35\\x61\\xfc\\x25\\x81\\x57\\x48\\x90\\x3b\\xfa\\x87\\xb4\\xd2\\xbf\\x55\\x7b\\xec\\x94\\x48\\xaf\\xc0\\x54\\x41\\x69\\x30\\x95\\xd0\\xcf\\x1b\\x99\\xdc\\xcf\\xba\\x5f\\x1b\\xf8\\x9e\\xa0\\x10\\x01\\x7c\\x5e\\x05\\x5a\\xb3\\x27\\xc4\\x0b\\x34\\x33\\x1f\\x48\\x8f\\xa3\\x9d\\xa6\\x79\\xca\\x47\\x58\\xe2\\xf4\\x95\\xb7\\x29\\x2d\\xe7\\xc7\\x1c\\x87\\xdc\\x4f\\x96\\xf3\\x5d\\xfe\\xb2\\x16\\x62\\x9d\\xf7\\x84\\x42\\x74\\x87\\xe2\\xc8\\x62\\xd5\\xa1\\xb0\\xe3\\xba\\x0e\\x6f\\x41\\x4a\\xc7\\xbd\\xb2\\xb5\\xdd\\xa3\\xd7\\x70\\xd7\\xc5\\x4c\\x65\\x13\\x12\\x12\\x57\\x06\\xa9\\x41\\x29\\x64\\x5b\\x2b\\x29\\xa6\\x3c\\x5d\\x25\\xca\\x70\\xd7\\x82\\xa7\\x19\\xfe\\x22\\xf9\\xcf\\x67\\x05\\x81\\x95\\x80\\x02\\x32\\x8a\\xc9\\x9c\\x0e\\xc7\\xb9\\x4d\\x2f\\x84\\x30\\x68\\xee\\x48\\x8c\\x39\\xeb\\x4f\\xa4\\x4f\\x93\\x4f\\xaa\\x4f\\x92\\x4f\\x3a\\x6d\\x31\\xba\\xb3\\xaa\\x96\\xf2\\x87\\x98\\xf7\\x96\\xad\\x37\\xa0\\x24\\xf6\\xb2\\x76\\x74\\x07\\x8c\\x00\\x41\\xdb\\xe2\\xdb\\x38\\x1d\\x98\\x86\\x38\\x94\\xc3\\x1c\\x72\\x6f\\x69\\x53\\x98\\xdd\\xef\\xc1\\xd9\\xc4\\x3f\\xa2\\x9b\\xbe\\x70\\x1c\\x3b\\xd6\\x44\\xad\\x88\\x37\\x0d\\x7a\\x58\\x45\\x01\\x44\\x7c\\x37\\xd2\\x5b\\x06\\x07\\x85\\x30\\xbb\\xe9\\x05\\xbd\\xf6\\x38\\xf0\\x8c\\xc7\\x89\\x3f\\x48\\x4f\\x85\\x22\\xb3\\x00\\xa6\\x6f\\x8d\\x18\\xc1\\x21\\xa8\\x1d\\xd2\\x94\\x98\\x54\\x74\\xc1\\xe2\\x09\\x29\\x10\\xdc\\x18\\xb4\\x44\\xbb\\xc4\\x72\\xe1\\x1b\\xa3\\xfe\\x1f\\xc1\\x17\\xd0\\xce\\xf7\\x13\\x9e\\x27\\xcf\\xbd\\xf8\\xf7\\xbb\\x2a\\x01\\x71\\xfb\\x32\\x51\\xf2\\x30\\x92\\xbc\\xf9\\x5c\\x4a\\x53\\xe6\\x6c\\xe5\\xc4\\x64\\x54\\xe8\\x01\\x24\\x0b\\x79\\x87\\x81\\x64\\x70\\xc9\\xa4\\x48\\x10\\x52\\xcb\\x2a\\x2a\\x71\\x50\\x05\\x05\\xb4\\x8b\\x9f\\xaf\\x14\\x7f\\xf4\\xbd\\x5a\\xb6\\xa9\\x61\\xef\\x51\\xbe\\xcf\\xb6\\x60\\x12\\xf0\\x38\\xac\\x07\\x0f\\xbd\\x1d\\xef\\x3f\\xcf\\x28\\x1d\\x66\\x58\\xcc\\x80\\x4e\\x88\\x3f\\x11\\x26\\x46\\x14\\xe6\\x04\\x14\\xd6\\xd8\\x5d\\xdf\\xa8\\x30\\x6b\\xc4\\x3f\\x10\\x43\\x3e\\x2b\\x60\\x34\\xdb\\x93\\x16\\xa4\\xea\\xbf\\x19\\xd5\\x01\\xb0\\x29\\xd2\\xba\\x29\\x61\\xfd\\xf0\\xf7\\xa8\\x95\\x40\\x26\\xc2\\xbf\\xbd\\x36\\xc1\\xe6\\x2e\\xea\\x43\\x77\\xb5\\xa3\\x20\\x6f\\xd7\\x0d\\x30\\x1f\\x35\\xa6\\xa5\\xe6\\x08\\x2d\\x18\\x78\\x78\\xdf\\x5a\\x9a\\x44\\x69\\x62\\x7f\\x15\\x27\\x30\\x45\\xbe\\x59\\xdd\\x5a\\x30\\xbc\\x21\\x20\\x61\\x02\\x1c\\x57\\x7e\\x5c\\x30\\xbd\\xe3\\x07\\x67\\x1e\\xb4\\xaf\\xb6\\xbc\\x11\\xcc\\x42\\x2e\\x3c\\x24\\x07\\x8f\\xa1\\xa0\\xda\\x9f\\x54\\x9c\\x9b\\x7c\\x2b\\xa2\\x20\\x22\\x42\\xf2\\xd9\\xd1\\xb2\\x05\\xcc\\x4c\\xe7\\xf9\\x71\\x9e\\x2b\\x4d\\xd6\\x80\\xaf\\x4a\\x38\\x9a\\x47\\x06\\xc8\\xbf\\x6f\\xee\\x01\\xd2\\x5b\\x25\\xf4\\xfc\\x76\\x59\\xdd\\xcf\\x0d\\x5b\\x6f\\xfa\\xde\\x79\\xbc\\x56\\x6b\\xe3\\x6b\\x14\\x74\\x5e\\x01\\x6b\\x99\\x07\\x0a\\x99\\x7c\\xe2\\xdb\\x5f\\x7b\\x3c\\x3c\\x16\\x76\\x35\\x65\\xd2\\xd5\\x6b\\xaf\\x43\\x1b\\x92\\x2d\\xb9\\xab\\x85\\x6b\\x82\\x98\\xc8\\x89\\x62\\xe2\\x49\\x85\\x48\\x54\\x10\\x63\\x7c\\x87\\x8e\\xeb\\xa5\\xb8\\x93\\xa7\\xa1\\x47\\xa8\\x4a\\xe1\\x8a\\x4b\\xd1\\xa8\\xe5\\xf4\\xe6\\x5d\\x21\\xb3\\x92\\xeb\\x95\\xb0\\xd9\\x48\\x65\\xa2\\x42\\x3a\\xdb\\xa7\\xc0\\x8b\\x64\\x81\\xf4\\x8f\\xa5\\x90\\xde\\xd9\\x52\\x70\\x71\\x7c\\x78\\xa4\\x1b\\x1c\\xea\\xca\\xd8\\x7e\\x57\\x6d\\xff\\xe3\\xac\\xb7\\xed\\x65\\x98\\x52\\xc9\\x91\\x71\\xa3\\x76\\x05\\xdf\\xab\\xde\\x3b\\x85\\xc7\\x80\\x85\\x62\\x05\\xa8\\xd4\\xd9\\xd8\\xb9\\x53\\xe7\\xd5\\x88\\xee\\xda\\x6c\\x61\\xe6\\x70\\xd2\\xfb\\x29\\xbf\\x9b\\x9f\\x77\\x9f\\xd5\\x29\\xaa\\xab\\x7f\\xaf\\xa1\\x62\\x22\\xec\\xe8\\x26\\x6b\\xa1\\x63\\x8e\\xc1\\x31\\x83\\x98\\x2a\\x0f\\xc1\\xdd\\xd9\\x86\\x46\\x60\\xa1\\x6f\\x32\\x7e\\x06\\x53\\xd0\\x60\\xba\\x59\\x68\\x2a\\x41\\x20\\xb6\\x98\\x91\\xdb\\x83\\x15\\x2d\\x33\\x0b\\xcc\\xc6\\xae\\xe6\\xb0\\x3f\\xdc\\x41\\x41\\x80\\x13\\xb9\\xb6\\x09\\xba\\xa4\\x28\\x68\\x71\\x5a\\xcc\\xf5\\x4b\\xa9\\x7c\\xbc\\xf5\\x49\\x19\\xc7\\x2f\\x5b\\xd0\\xd0\\x68\\xa0\\xf8\\x7d\\x56\\x2c\\x5f\\xbb\\x9f\\xe6\\xcc\\x23\\xd0\\x65\\x73\\x4d\\x54\\xf3\\x1e\\x5e\\x9c\\xbf\\xaf\\xd0\\x18\\x2f\\x71\\xb4\\x6b\\x2b\\x0a\\x89\\x7d\\xf6\\xae\\xd4\\x9c\\xef\\x74\\xa2\\x78\\x66\\xc2\\x9c\\xf3\\xa7\\xdc\\x0a\\x43\\x39\\x8b\\xb0\\x57\\x77\\xf6\\xfe\\x0b\\x28\\x69\\x20\\x3b\\xa4\\x99\\x12\\x57\\x19\\x3f\\x0e\\x4c\\xd6\\x60\\x56\\x42\\x15\\x52\\x42\\xd5\\x20\\xd1\\x6f\\xfe\\x22\\xea\\x9d\\x43\\xd2\\x2f\\x40\\x33\\xa7\\x79\\xad\\x77\\xba\\x14\\x12\\x6b\\xd0\\x42\\x2b\\x9c\\x07\\xef\\xb5\\x43\\xad\\x94\\x84\\x22\\x85\\x45\\x8d\\x5b\\x28\\x59\\xc7\\x51\\x93\\x52\\xaa\\x8a\\xd5\\xb5\\x14\\x3d\\xc8\\xab\\x6d\\xa2\\x28\\xf5\\x6c\\x43\\x4d\\x23\\x46\\x83\\x29\\x65\\x26\\x85\\x8d\\xf0\\x22\\xc0\\x17\\x42\\x96\\x6f\\x75\\xd5\\xdc\\x52\\xa2\\x40\\x6c\\x33\\xcc\\xa0\\x5d\\xd6\\xe7\\xb9\\x5f\\xeb\\x7a\\x7b\\xbe\\xf6\\x2f\\x0a\\x90\\x94\\x99\\xd1\\x66\\x75\\x5b\\xbb\\x3b\\x3d\\xd0\\xc0\\x84\\x8f\\x65\\x8d\\xc7\\x98\\x85\\x0b\\x83\\xf2\\xe9\\xdf\\xc3\\xec\\x5d\\x3a\\x2b\\xb8\\xf6\\x79\\x87\\xe8\\x15\\x24\\x79\\xdc\\x04\\xcd\\xf0\\x28\\x70\\x5d\\xae\\xb7\\x5b\\xd3\\xab\\xa4\\x07\\xba\\x43\\xf7\\xe9\\xb7\\xf5\\xd2\\xd8\\x14\\xe0\\xc5\\xe6\\x36\\xba\\x34\\x4c\\x81\\x49\\x33\\xe9\\x61\\x29\\x72\\xa6\\xc3\\x8c\\x85\\xae\\xa6\\xf9\\x0d\\x14\\x35\\x87\\x44\\x2d\\x5b\\x8a\\xd0\\xdb\\x59\\x26\\xd2\\xee\\xd8\\x32\\xdc\\x9f\\x10\\x7a\\x46\\x09\\xf8\\xab\\x7b\\x3f\\x26\\x29\\x3c\\x5c\\x3f\\x38\\xeb\\x6d\\x74\\xfe\\x45\\xfe\\xe6\\xcc\\xdf\\xf7\\xfe\\xcb\\x14\\x67\\xb7\\x15\\xce\\x11\\x8f\\x9c\\x8c\\x54\\x9c\\x9e\\x78\\x8c\\xc8\\x98\\xcb\\x38\\x5d\\x7f\\xc9\\x58\\xa6\\xfc\\x27\\x4e\\x23\\x44\\x0a\\x8d\\x23\\x1c\\x1b\\xe2\\xc4\\x5a\\xe0\\xa1\\x6d\\x8d\\xf6\\x78\\x65\\x2d\\xad\\x79\\x58\\x72\\xbd\\x8a\\x36\\x98\\xe1\\x06\\x4c\\x84\\xe5\\xb1\\x0d\\xbd\\x60\\x00\\x5d\\x26\\x25\\x5b\\x65\\xcd\\x95\\xb4\\x0b\\xe3\\xb7\\x26\\x97\\x03\\x84\\x42\\x14\\x23\\xdc\\x82\\x57\\x58\\xa2\\x1e\\xe1\\xb9\\x7a\\x51\\xcf\\xaa\\x27\\x2b\\xfa\\xb6\\xba\\xae\\xad\\xa5\\x38\\x29\\x16\\xaa\\xe9\\x1c\\x27\\xde\\xcb\\x60\\x15\\x8c\\xea\\x65\\x03\\x9f\\xe4\\xc4\\x24\\x8c\\x4c\\xdf\\xbc\\xaf\\xad\\xed\\xf8\\x07\\x07\\xab\\xb5\\x71\\xec\\x05\\xf5\\xea\\x6c\\x76\\x3f\\x31\\xd7\\xf5\\x97\\xba\\x05\\xf3\\x18\\x7c\\x8e\\x64\\x7b\\xdd\\x7b\\x45\\x5e\\xf7\\xe7\\x7a\\x8b\\x6d\\xef\\xf3\\xbf\\x66\\xcf\\x83\\xd6\\x84\\xfc\\x87\\x43\\x1e\\x3b\\x9f\\x8e\\x5f\\x52\\x14\\x33\\x19\\x1d\\xe6\\xb1\\x09\\x02\\x76\\x63\\x89\\x56\\x23\\x0c\\x5a\\xb2\\x69\\x20\\x3e\\x30\\x47\\x15\\x93\\xd9\\x1d\\xe6\\x44\\xd7\\xb4\\xb7\\x08\\x29\\x93\\x5a\\x79\\x95\\x35\\x28\\x64\\x34\\xc6\\x24\\x3b\\x1b\\x89\\x00\\xb4\\xe2\\xa8\\x45\\x4a\\x8f\\xb1\\xdf\\x5f\\x3f\\x21\\x7b\\x5d\\x7d\\xd2\\xca\\xd6\\x2e\\x14\\x07\\x6d\\xcd\\x8b\\x69\\x46\\x37\\xae\\xc4\\xd9\\x70\\xbd\\x74\\xe8\\x0c\\x1b\\x35\\x8b\\x81\\x16\\x92\\x1b\\x3b\\x9c\\x8a\\xce\\xfc\\xbc\\x40\\xe6\\x10\\xbc\\x2a\\xb9\\xbe\\x5a\\x76\\xae\\x59\\x74\\xcb\\xdd\\xaa\\x78\\x4b\\xc9\\x9d\\xc7\\x83\\x52\\x3b\\x91\\x68\\x98\\x2a\\x5c\\x8f\\xf9\\xe4\\x26\\xdc\\xe1\\x0b\\xfb\\x3c\\x32\\x04\\x73\\xbc\\x2e\\xd6\\x76\\xe7\\xa7\\x5b\\x9a\\x41\\xcc\\x9d\\x02\\xa5\\x4f\\xb3\\x4f\\xdc\\x4f\\x82\\x4f\\x8f\\xcf\\xa6\\xfe\\x60\\x0e\\xe7\\xfe\\x8d\\x16\\x82\\xad\\x00\\xa2\\xa6\\x00\\xef\\x23\\xa4\\xae\\x72\\x86\\xce\\xc7\\x6a\\x1e\\x40\\xbd\\x78\\xa7\\xa8\\x88\\x76\\x59\\x71\\xab\\x78\\xef\\x6f\\xb0\\xf8\\xe7\\x36\\xd3\\x3a\\x11\\xce\\x5c\\x78\\x33\\xe5\\x40\\x71\\x33\\x65\\x48\\xeb\\xe2\\xec\\x2b\\xb8\\x16\\x12\\xc6\\x68\\x86\\xa3\\x1e\\x42\\x5d\\x92\\x77\\xf0\\x1f\\xe3\\xa1\\x09\\x2e\\xe3\\xf2\\x4e\\x89\\x86\\x81\\xa6\\x0b\\x7d\\x35\\x61\\xe3\\xbc\\xdc\\x11\\xcb\\x18\\x2d\\x96\\xdd\\xc4\\x81\\xa6\\x0d\\x2d\\x16\\xf9\\xce\\x01\\xeb\\x46\\xcb\\xab\\xc0\\x0d\\x2c\\xf1\\x58\\xd7\\x02\\x27\\xdc\\xdd\\x0c\\x7d\\xd3\\xd2\\x56\\xad\\xfa\\xde\\xb3\\x5f\\x3d\\xd9\\xd4\\x29\\xb9\\x62\\xa7\\x64\\xd3\\xb6\\x7e\\xd2\\x58\\xa2\\x2a\\x39\\x73\\x87\\x6f\\x28\\x35\\xe3\\x1d\\x8f\\x84\\x2f\\xe9\\xf4\\xf9\\x05\\xa4\\x19\\x2f\\x4c\\x21\\x6c\\xa9\\x3a\\xc2\\xf2\\xc8\\x65\\x49\\x42\\xd6\\x40\\x78\\x67\\xe8\\x73\\xb7\\x24\\xef\\x71\\x2f\\xd7\\x3e\\x97\\xeb\\x22\\xa6\\xc1\\x2c\\x4c\\x0f\\xe3\\xc5\\xbf\\x26\\xc7\\x9e\\xf8\\x97\\x4f\\x9c\\x3f\\xcc\\x8a\\x87\\xac\\xad\\xea\\x58\\x73\\x6f\\xb5\\xad\\x96\\x94\\x8f\\x1f\\x12\\xfe\\x61\\xed\\x8f\\x15\\xfc\\x21\\x3e\\x3f\\xc0\\x92\\xba\\xc6\\x2d\\x4b\\x03\\x69\\x77\\xb7\\x63\\x53\\x8e\\xd9\\xd9\\xda\\x1b\\xba\\xc4\\x19\\x62\\xca\\x7e\\xf3\\x95\\xf3\\x54\\xff\\x00\\x8c\\x75\\x9d\\x9a\\x88\\xaa\\x56\\xe6\\x30\\x17\\xe1\\x7f\\x96\\xf6\\x25\\xa3\\xbe\\xd1\\xfa\\x8b\\xb9\\xb1\\x96\\xd7\\x2b\\x34\\x41\\x90\\x85\\xdd\\xed\\x42\\xdc\\x68\\x21\\xf2\\xd9\\x9f\\xb1\\xa1\\x20\\x89\\x0b\\xe1\\x64\\x78\\x6f\\xe2\\x88\\x59\\x46\\x89\\x52\\x77\\x3f\\x31\\x71\\x79\\x4e\\x8d\\xfb\\x1f\\xe6\\x4e\\x0e\\xe7\\xb0\\xfb\\xde\\x65\\x96\\x91\\xc8\\xe7\\xbe\\x1d\\x1b\\x06\\x25\\xcb\\xc4\\xf2\\xe8\\xbf\\x5d\\xac\\xb9\\x5d\\xe3\\xa1\\x67\\xb0\\xdd\\xd6\\x3f\\xb2\\xbc\\xe9\\x72\\x3a\\xbd\\xe5\\x1f\\x50\\x5c\\x07\\xbc\\xd6\\xf4\\x00\\x29\\x05\\x0f\\xdd\\x77\\x2c\\x29\\x32\\xbd\\xeb\\xd8\\xb2\\x04\\x64\\x52\\x3c\\x49\\x23\\xbb\\x87\\xe6\\x7b\\x42\\x21\\x25\\x62\\x55\\xb1\\x56\\x5b\\x7b\\x66\\x8a\\xb2\\x08\\xfd\\x32\\x56\\xb2\\xe8\\x73\\x63\\xf8\\xfd\\xba\\x09\\xf0\\x57\\x19\\x6a\\x8c\\x63\\x99\\x89\\x5e\\x83\\x66\\xa5\\x68\\x4e\\x5e\\x67\\x35\\xbf\\xb0\\x2c\\x6f\\x4b\\x3f\\x3b\\xad\\x41\\xf8\\xda\\xa4\\xc7\\x0a\\x6c\\x1e\\x30\\x56\\xd3\\xb1\\x0f\\xe7\\xf1\\xb7\\x48\\xe9\\xfc\\xca\\x30\\x47\\xca\\x55\\xe0\\x6b\\xbf\\x82\\xcf\\x8b\\xc5\\x93\\x83\\xdc\\x3b\\x4a\\xff\\xb8\\x5f\\x6b\\xe9\\xec\\xc0\\x1c\\x46\\x5d\\x2c\\x54\\x0e\\x51\\x6e\\x5e\\x6e\\x05\\xf9\\x97\\xe3\\x36\\x85\\x83\\x13\\x28\\xc0\\x22\\x07\\xaf\\xe0\\x89\\xc6\\xc7\\x8b\\x46\\x47\\x52\\x22\\x8c\\x6a\\x8d\\x2a\\x1d\\xe6\\x56\\x7f\\xa3\\x3c\\x45\\xcf\\x9f\\xd4\\x8c\\x0e\\x10\\x02\\x6e\\x77\\x2a\\x88\\x11\\x77\\x28\\x7f\\xfe\\x09\\x98\\x15\\xc5\\xfd\\x90\\xc5\\xc7\\x3b\\x2c\\xb8\\x5e\\xb8\\x3f\\xf5\\x7a\\x30\\xaf\\xf9\\xec\\x70\\x18\\xa9\\x9c\\xbe\\x72\\xda\\xbe\\x4d\\x35\\xc0\\x1c\\x7d\\x7d\\x22\\xa4\\x30\\xe0\\x97\\x6a\\x24\\xad\\xdc\\x92\\x51\\x68\\x5f\\x3c\\x5a\\x32\\x58\\xca\\x59\\x06\\x15\\x18\\x64\\x14\\xcd\\x1a\\xb1\\xf2\\xbf\\xe6\\x09\\x1d\\x86\\x18\\x64\\x95\\xe4\\x54\\x2a\\x7c\\x6f\\xe6\\xc6\\x81\\x79\\xca\\x56\\x97\\xf6\\x09\\xf5\\x39\\xaa\\xe4\\xfc\\xeb\\x2f\\xd9\\x82\\xa0\\x1a\\x7f\\xb2\\xb0\\xb3\\x00\\xf2\\xfb\\x58\\x85\\x43\\xef\\x7e\\x6f\\x91\\x3f\\x70\\xeb\\x2a\\x5c\\xb6\\xb0\\x40\\xf2\\xb9\\xb6\\xe7\\x8e\\xd0\\x2f\\x26\\xac\\xd8\\x29\\xdd\\xc9\\x67\\xa8\\xa4\\x6d\\x6d\\xf7\\x89\\xf9\\x12\\x55\\xd0\\xf6\\xd0\\xdf\\x62\\x1c\\xfb\\x39\\x47\\x58\\xd9\\x5c\\xf2\\xbb\\x58\\x2f\\x54\\x13\\x5e\\xc8\\x41\\xb3\\x4f\\x05\\x7b\\xec\\x15\\xf3\\x02\\xd1\\xde\\x7d\\x94\\x1d\\xdc\\x3c\\x82\\x9c\\xc4\\xad\\x23\\x2d\\x4d\\xd8\\x66\\xe0\\x0c\\x2a\\x35\\x2f\\x8a\\xa9\\x1e\\x77\\x0b\\x86\\xe6\\x44\\x32\\x68\\xfd\\x42\\x96\\x5d\\x49\\x95\\x12\\x39\\x86\\x18\\x5c\\x4d\\x74\\xa8\\xf4\\x24\\x3e\\x8a\\x8c\\xfe\\x8d\\x26\\xad\\x4f\\xe0\\xfc\\x7a\\x7a\\xe1\\xb4\\xf3\\xd2\\x55\\x4c\\xba\\xb9\\x34\\x20\\xb6\\xc0\\xef\\xe1\\x38\\x4c\\x38\\xef\\xd7\\x79\\x52\\xb4\\x60\\x40\\xd7\\xe8\\x47\\x2d\\xe3\\xec\\x17\\xf3\\x40\\xf8\\x14\\x78\\xd9\\x98\\xed\\xc1\\xcf\\x3f\\xe9\\x46\\xf1\\x81\\xca\\x2a\\xe1\\x87\\xa2\\x6b\\xce\\xf5\\x8a\\x5e\\x83\\x4b\\xb4\\xf2\\x57\\xf2\\x9e\\xc7\\x0f\\xe5\\x18\\x7f\\xe0\\xbd\\x1c\\x33\\x61\\x62\\xe0\\xa2\\x69\\xc3\\xe3\\x69\\xfd\\xa1\\x92\\x59\\xe7\\xfa\\xb5\\x1c\\x77\\x4d\\xeb\\xd1\\x5d\\xdd\\xd1\\xa2\\xe0\\xc9\\x7f\\x45\\x31\\xbb\\x8a\\x69\\xfd\\x39\\x0f\\xb7\\xec\\xb2\\xfa\\xd2\\x13\\x05\\xc9\\x50\\xd1\\x69\\xd7\\xdf\\x74\\xde\\x3f\\x80\\x9a\\xcf\\x04\\x54\\x9e\\xc7\\x4a\\x18\\xb4\\xcb\\xae\\xfd\\x3e\\xff\\x34\\xac\\x64\\x75\\x2d\\xe4\\x5f\\xf9\\x1a\\xf5\\x2d\\x8f\\x77\\x4a\\x28\\xbc\\xcf\\x6c\\x10\\x32\\xa4\\xb5\\x98\\x2e\\x45\\x37\\x94\\x30\\xa4\\x21\\x75\\xf2\\x43\\x3c\\xf4\\x6e\\xf4\\x0e\\x90\\x99\\x92\\x4b\\x89\\xff\\xb2\\x8a\\x92\\x90\\x1b\\x3e\\x84\\x86\\xeb\\x4f\\x23\\xdb\\x6b\\xa3\\xa5\\x60\\x76\\xa1\\x82\\x98\\x42\\x01\\x5e\\xba\\xb4\\x91\\x51\\xb9\\x35\\xbd\\x5e\\x89\\xfe\\xd9\\x3a\\x55\\x21\\x0a\\x8e\\xdd\\xd2\\xe8\\xc2\\x98\\x87\\x05\\xa6\\xdb\\xfd\\x16\\x5f\\x38\\x49\\xe8\\xcf\\x33\\x24\\xb2\\x64\\xfb\\xa9\\x01\\xaf\\xe1\\x34\\xe7\\x48\\x84\\x55\\x3f\\x6e\\x26\\x66\\x0a\\x8d\\x2f\\x09\\xf7\\xa8\\xdb\\xa3\\x35\\x2b\\xd0\\xf3\\xaf\\xfc\\xde\\xbe\\xf3\\x32\\x31\\x7a\\xa6\\x00\\x2d\\xc8\\x7e\\xbd\\x12\\x54\\x04\\x2a\\x13\\xa0\\x46\\x8c\\xc0\\x6f\\x58\\x90\\x7a\\x48\\x44\\x32\\x18\\xaf\\xef\\x3c\\x0d\\x6f\\xe9\\xe5\\xed\\x7c\\xaf\\xaa\\xa8\\x09\\xe5\\xc8\\xd1\\xf3\\x84\\x2b\\x42\\x6f\\x45\\x0c\\xf5\\x7b\\x83\\x7c\\x1a\\x43\\xee\\xf6\\x8c\\xed\\x9b\\x40\\x76\\x49\\xfd\\x28\\x3d\\x83\\xd8\\x7c\\x8e\\x78\\xe4\\xe9\\xb4\\x34\\x63\\x64\\xfa\\xce\\x2a\\xe6\\x8f\\x76\\x3f\\x57\\xf0\\x43\\xbc\\x10\\xd6\\xe9\\x1d\\xc1\\x6d\\xbe\\xec\\x4d\\xef\\xad\\xa6\\x86\\xcf\\x4f\\x86\\xd9\\x6b\\x62\\x01\\x43\\x6d\\xa7\\x1a\\xf4\\x56\\xf0\\x15\\xed\\x0f\\x1a\\x71\\xb0\\x07\\xbd\\x12\\x3a\\xe4\\x6f\\x0e\\xbe\\xd3\\x87\\xbc\\x73\\x8f\\x39\\x8a\\x4c\\xac\\xee\\x55\\x4f\\x0e\\xff\\x0e\\x64\\xa7\\xcd\\x54\\xa5\\x33\\x4e\\x57\\x55\\x92\\xc8\\xc5\\x9d\\xd2\\xb5\\xe5\\xd1\\xe4\\x2d\\x27\\x99\\xfe\\xb4\\x1a\\xf8\\x25\\xef\\x08\\x93\\xfe\\xa9\\x4b\\xea\\xbf\\xcc\\x2d\\x99\\xb6\\xec\\x5d\\x02\\x78\\x80\\x44\\x7b\\xce\\xd0\\xfd\\x9e\\x46\\x74\\xf5\\x0f\\xfc\\x14\\xcc\\x6f\\x90\\xff\\x3d\\xdb\\x75\\x94\\x4c\\xf5\\x5f\\x59\\xa1\\xeb\\xc4\\xd4\\x7a\\x1c\\xfb\\xe0\\x70\\xb8\\xba\\xb7\\xee\\x89\\xed\\x07\\xe8\\xf8\\x20\\xb8\\xe8\\xb4\\xec\\x4e\\xa9\\xfb\\xce\\x7b\\xf3\\xf4\\x60\\xae\\x57\\x19\\x80\\x77\\x7d\\x0f\\x4a\\x91\\xc4\\x40\\x8d\\x53\\x94\\x27\\xa5\\xe7\\x74\\x64\\xfa\\xe9\\xb4\\xd6\\xbb\\x36\\x36\\x4d\\x95\\xb0\\xde\\x10\\x8c\\x69\\x7f\\x69\\x06\\x66\\xb7\\x44\\x20\\xe1\\xf2\\x13\\x3b\\x8a\\x91\\x1b\\x62\\x47\\x12\\xc9\\x8b\\xad\\x22\\xde\\x45\\x78\\x14\\xe1\\xa7\\xc1\\x1d\\x26\\xa3\\xc3\\x74\\xbc\\x30\\xfd\\x7c\\x69\\x5b\\xef\\x90\\x4d\\x83\\x7e\\xb4\\xe4\\x2a\\x8e\\xd9\\xdd\\x78\\x6e\\x3e\\x34\\x99\\x36\\xa1\\x9a\\x29\\x1c\\xe9\\x3a\\x2f\\xf7\\xf7\\xd2\\x51\\x21\\x92\\xfc\\xdc\\x00\\x1b\\x9e\\x80\\xad\\x30\\x8f\\xcd\\x0e\\xab\\xbd\\xbf\\x62\\xed\\xf4\\x7f\\x50\\xe6\\x7b\\xfc\\xf4\\x40\\x6a\\x01\\x82\\x58\\x92\\x36\\xa5\\xb1\\x71\\xcb\\x3a\\x3b\\x09\\x0a\\xdb\\x37\\x67\\x97\\x6f\\x34\\x1e\\x5d\\xeb\\x5d\\x09\\xde\\xfa\\xb6\\x7e\\xa0\\x55\\x84\\x53\\xca\\x38\\x15\\x99\\x3f\\x97\\x87\\x80\\xc8\\xbe\\x66\\xdb\\x60\\x9f\\x6e\\xb0\\x88\\xa9\\xa6\\x5b\\xe3\\x65\\x61\\x52\\x1b\\x67\\xef\\x3a\\xed\\x05\\x8d\\xd3\\x3d\\x65\\x57\\xc4\\x69\\x00\\xe6\\x9c\\xb2\\x11\\x38\\x9d\\x50\\xce\\x70\\x7e\\xb3\\xfd\\x77\\x75\\x10\\x9b\\x7c\\x1a\\x58\\x69\\xd1\\x3f\\x71\\xc1\\xab\\x1e\\xcd\\x0f\\xa2\\xf4\\xba\\x88\\x88\\x38\\xbe\\x4d\\x49\\x19\\x25\\xc1\\x3a\\x3e\\x6c\\xc0\\x67\\x3f\\xbc\\xe7\\x91\\x64\\xcb\\x6b\\xbe\\xbb\\x94\\xe2\\x32\\x7a\\x7d\\xad\\x28\\xf0\\xc4\\xcf\\x47\\x73\\x53\\xdb\\x70\\x62\\x50\\x8c\\x64\\xce\\x86\\x1d\\x4c\\xf1\\x5c\\x68\\x08\\x3c\\x2e\\xe1\\x6c\\xc2\\x95\\x76\\x4f\\xde\\xf2\\xaf\\xfa\\x9f\\x95\\x15\\x24\\x54\\xcb\\xed\\x3b\\xec\\x03\\x8d\\xbe\\xbb\\x1e\\xbf\\xcf\\x7b\\x84\\xe9\\xbc\\x8d\\x7f\\x49\\x18\\x39\\x4d\\xb2\\x9b\\x01\\xbd\\x77\\xc3\\xd7\\x34\\x29\\x9d\\xa6\\x2c\\x56\\x73\\xf3\\xa3\\xb6\\x1f\\xe2\\x10\\x0e\\xcd\\xec\\x9d\\xbf\\xe4\\xc3\\x39\\xe6\\xa6\\x90\\xfc\\x81\\xc9\\xa1\\x9b\\x61\\x24\\xbf\\x39\\xab\\x0b\\xc6\\x7e\\x98\\xfa\\x35\\xe4\\x49\\xfd\\x60\\x4a\\x1d\\x89\\x95\\x05\\x28\\x6f\\x49\\xc5\\x87\\x8c\\xc7\\x05\\x7b\\x88\\xc1\\x2d\\x06\\x59\\xdb\\x2c\\xef\\x5d\\x0e\\x23\\xf7\\xf3\\x2a\\xf2\\xcf\\x95\\x3a\\x4d\\x31\\x94\\x90\\x6b\\xd1\\x90\\x6b\\xcd\\x84\\xe0\\x03\\x06\\x2a\\xe6\\x28\\x4c\\xba\\x53\\x22\\xa8\\x8d\\x34\\x22\\xfb\\x31\\x31\\x0c\\xb7\\x80\\xa9\\x91\\xa3\\xb7\\xc3\\x25\\x47\\xba\\xb0\\x49\\x96\\x6a\\x33\\x37\\xb2\\x79\\xd4\\x34\\x25\\x11\\x28\\xc6\\xd4\\x1f\\xd0\\x2b\\x59\\x24\\xf3\\x8a\\x5c\\xc8\\x9c\\x07\\x91\\x4c\\x5c\\x35\\xa6\\x4c\\x7f\\xca\\xd9\\x8b\\xb4\\x6a\\x5b\\x37\\x4b\\xbb\\xf1\\x29\\x17\\x85\\xde\\x51\\x31\\xca\\x6f\\x18\\x7d\\xa0\\x53\\x04\\xc1\\x94\\x35\\x23\\x7b\\x82\\x53\\x14\\x2b\\x08\\x7b\\xf9\\xa2\\xb3\\x49\\x17\\xd8\\x1e\\x6c\\x3f\\x43\\x78\\xb5\\x04\\x3e\\x77\\xde\\xfe\\x3a\\x13\\xd0\\x5e\\xab\\x95\\x61\\x2c\\x2a\\x29\\x73\\xc6\\x5f\\x05\\x28\\x45\\x2d\\x2c\\xbb\\x3c\\x32\\x59\\xf9\\xba\\x70\\xe3\\x2f\\xff\\x92\\x67\\xf9\\xb5\\x30\\xc6\\x96\\x2f\\x94\\x92\\x8e\\xae\\x9e\\x07\\x3f\\x49\\xd2\\x88\\x1d\\x3d\\x2f\\xda\\xd1\\x56\\x08\\x3d\\x88\\xd8\\xc4\\xec\\x8c\\x4f\\xc6\\xe2\\x2d\\xe6\\xe7\\x99\\x1b\\x18\\x95\\xf3\\xc1\\x26\\xff\\x11\\x43\\x40\\x29\\xc8\\xc5\\xf3\\xb9\\xcb\\x2f\\xf3\\x2f\\x81\\x89\\xf6\\x18\\xcd\\x44\\x33\\x91\\x05\\x7f\\x00\\x3c\\x5c\\x3c\\x1e\\xd0\\x5f\\x1f\\xa9\\x2d\\x5e\\xa8\\x5b\\x94\\x6b\\x38\\x21\\xfd\\xf4\\xff\\x94\\xf8\\xb4\\xd0\\x2b\\x22\\xf3\\xb0\\xeb\\x7e\\xca\\xf6\\xa9\\x69\\x3b\\x42\\x36\\x62\\x4e\\x16\\xa2\\x9e\\x99\\x6f\\x01\\x93\\x00\\x41\\x25\\xbe\\xb0\\x73\\x27\\xb5\\x5f\\x05\\x5c\\x77\\xbd\\x97\\x5d\\x6e\\x3f\\x6f\\x6f\\xc9\\xcf\\xb7\\xef\\xd2\\x60\\xd4\\xdc\\x24\\x15\\x20\\x4e\\x33\\x3f\\x0a\\x8e\\x5f\\x91\\x96\\x56\\x5d\\x5e\\xaa\\x05\\xb3\\xc4\\x69\\x13\\x23\\xa8\\xd5\\xe7\\xfd\\x60\\xed\\x51\\x91\\xaa\\xd8\\xe3\\x14\\x82\\xc2\\x9b\\xca\\x2b\\x86\\xef\\x96\\xc4\\xaa\\xcf\\xc1\\x38\\x25\\xbc\\x5e\\x11\\x28\\x16\\x2b\\xc9\\xf1\\x5b\\xc6\\x7e\\x1b\\xc1\\x78\\x24\\x7a\\x9d\\x09\\x78\\x58\\x26\\x0c\\x25\\x64\\xe0\\x34\\xba\\x1d\\x42\\xd4\\x10\\x9a\\x10\\xee\\x4d\\x26\\x7c\\xf1\\x41\\x94\\xa2\\x8e\\xac\\xa8\\xfd\\x55\\x01\\x3e\\xa8\\xc6\\xa4\\x23\\x08\\x60\\xa0\\xde\\x58\\xb7\\x41\\x57\\x4b\\x33\\x2a\\xa3\\x01\\x51\\xb7\\x92\\xf0\\xe9\\xc3\\xec\\x62\\x2e\\xed\\x4a\\xb4\\xe1\\x3f\\x10\\xc1\\xbd\\x71\\x70\\x59\\x6e\\x46\\xc0\\x9f\\xcd\\x36\\xcb\\xcf\\x71\\xa2\\x47\\xe2\\xde\\x6f\\xa9\\x3e\\x6b\\xf4\\x29\\x9e\\x05\\xf0\\xa8\\x67\\x40\\xa6\\xfb\\x01\\x0e\\xcb\\x9f\\x7d\\xc8\\x27\\xa6\\xad\\x8d\\x2f\\x40\\x6a\\x9b\\x21\\xdd\\x24\\x53\\xe9\\x54\\xc6\\xee\\x09\\x2d\\x98\\xeb\\x91\\x28\\x16\\xb7\\x0b\\x6a\\xd6\\xa6\\xf0\\xa8\\x58\\x2a\\x53\\xf5\\x91\\x73\\x4d\\x1d\\xe3\\xf4\\xcb\\x56\\x7f\\x2c\\xa4\\x06\\x60\\x07\\x01\\x15\\x34\\x46\\xbc\\xb9\\xff\\x8b\\x31\\xba\\xa4\\x10\\x69\\x29\\x7c\\x28\\x09\\x65\\x37\\x34\\x84\\xe8\\x5a\\x6b\\x1f\\x5a\\x31\\x47\\xb2\\xa0\\xfb\\x42\\x21\\xbd\\xc1\\xfc\\xb1\\xad\\x22\\x3f\\xf9\\x0d\\x37\\x79\\xcd\\x26\\xf5\\x6c\\x07\\x8f\\xf3\\xa0\\x71\\x61\\xf9\\x04\\x86\\xee\\xcc\\xa2\\x43\\x63\\x0b\\x83\\x41\\x21\\xbb\\xa5\\x70\\x07\\x4a\\xac\\x2f\\xdf\\x06\\x26\\xa7\\xf6\\xa2\\x71\\x39\\x20\\xea\\x47\\x34\\xc6\\xb4\\xc1\\x80\\xdb\\x9a\\x6a\\x42\\x06\\x28\\x98\\xaf\\xcc\\x3e\\x7a\\x8f\\x6b\\x7d\\xe8\\xe6\\x7b\\x28\\x2d\\xca\\xf4\\x21\\x95\\x27\\x3d\\xc3\\xc6\\x36\\x3d\\xca\\x2a\\x09\\x09\\x4a\\xda\\xef\\x4b\\x04\\x9c\\x35\\xfe\\x20\\xad\\xe3\\x5a\\x33\\xa9\\xe8\\x06\\x2c\\x8e\\x9a\\xc9\\x92\\x14\\xa0\\xd1\\x8b\\xc8\\x2c\\x83\\xaf\\xaf\\x9e\\x80\\x17\\x26\\xe9\\xf7\\xf6\\x39\\xd8\\xb6\\xac\\x55\\xbe\\x06\\x0f\\xc9\\x98\\xe4\\xb5\\x14\\xd9\\x21\\x65\\x68\\x49\\x30\\xea\\x76\\xbb\\xd3\\xe5\\x9a\\x4d\\xcd\\x1c\\xca\\x49\\xcf\\xdc\\xba\\x43\\x40\\xeb\\x15\\xb5\\x10\\xc8\\x78\\xe0\\xb4\\x24\\xd3\\xe5\\x96\\x4f\\xe0\\x2b\\xaf\\xe7\\x7d\\xc1\\x63\\xdd\\xef\\x41\\xca\\xeb\\xd3\\xca\\x85\\x42\\x56\\x5b\\x93\\xef\\x2e\\xf9\\xe8\\x68\\xe6\\x84\\xcb\\xa2\\xb0\\x57\\x50\\xdb\\x71\\x39\\xff\\x96\\xc4\\x7c\\x09\\xe5\\x2b\\xf7\\xf5\\xd6\\xe3\\xe4\\xd4\\x66\\xe7\\x0f\\x36\\xf2\\x5d\\xa0\\xc0\\x32\\xe3\\x06\\x0e\\xa7\\xe6\\x74\\xcc\\x58\\xa9\\x71\\x66\\xdb\\xf0\\xee\\x04\\x38\\x21\\x29\\x1d\\xed\\xbe\\x35\\x58\\x08\\x31\\x95\\x8e\\x26\\x1e\\x06\\x84\\x97\\xdd\\x36\\x29\\x7c\\x1d\\xaf\\x55\\x39\\xbf\\x01\\x08\\x18\\x60\\x7a\\xb7\\x29\\xd2\\xb8\\x7d\\x2b\\x09\\x8e\\xa9\\x65\\xf2\\x5a\\x17\\x6c\\x65\\x21\\xc3\\xad\\xd7\\x72\\x2b\\x1c\\xa2\\x7a\\xdb\\xca\\xc7\\x64\\x18\\xde\\xa7\\xa6\\x14\\xec\\xbb\\x37\\x22\\x27\\x4d\\xf4\\x50\\xb5\\x52\\x11\\x97\\x3c\\x2d\\x99\\xaf\\xc7\\xe5\\xd0\\xf5\\x65\\xa1\\x5b\\xc8\\x01\\x86\\x77\\x6a\\x04\\xc4\\x7a\\xd0\\x72\\x04\\x66\\x2d\\x16\\x7e\\xe0\\xd6\\x0c\\xae\\x18\\x80\\x31\\x21\\x77\\x72\\xbc\\xd4\\x60\\x30\\x34\\x44\\xbf\\x39\\xd1\\x30\\x4a\\xdd\\x74\\x3b\\xf7\\x37\\x86\\x59\\xc2\\x7e\\x38\\x33\\x1c\\xc5\\xb0\\xda\\x44\\xbe\\x1f\\x31\\x8b\\x95\\x37\\x92\\xa8\\x7d\\xeb\\xc0\\xf6\\x8c\\x9a\\x77\\xcc\\x07\\xcb\\x82\\xa2\\xa9\\x2a\\xf0\\xf3\\xab\\x0f\\x0e\\x2d\\xa5\\x79\\xcb\\x20\\x4a\\xdb\\xc1\\xe2\\xd1\\x8e\\xca\\xfb\\x59\\x4c\\x8a\\xeb\\x3a\\xe2\\xdf\\x6a\\x80\\xd1\\x36\\x1f\\xb8\\x74\\x0a\\xb6\\x15\\xc4\\x21\\x27\\x8d\\xa1\\xf3\\xf3\\xb7\\xa1\\x90\\x52\\xa7\\x53\\xe0\\x16\\x96\\x5b\\x04\\xdf\\x6c\\xf0\\x9e\\xa2\\xeb\\x8f\\x77\\xbe\\x2f\\x3f\\xfe\\x89\\x31\\x19\\x3e\\xbe\\xf2\\x56\\x11\\x97\\xe3\\x2f\\x2b\\x25\\x3e\\x9e\\xaf\\xd7\\xc9\\x93\\x6b\\x38\\x9e\\xeb\\xd0\\xfb\\x6a\\xfc\\xdd\\x8b\\x5e\\xaf\\x09\\xe4\\xdf\\xac\\xd1\\xf5\\x13\\x53\\x99\\xa3\\x12\\xa2\\x63\\x3f\\x79\\xf4\\xec\\x15\\xc4\\xd7\\xf1\\xe8\\x51\\x6a\\x39\\xeb\\x5b\\x13\\x62\\xdf\\x06\\x72\\xad\\xbf\\x01\\x08\\x96\\x6a\\x38\\x53\\xc5\\x50\\x20\\x30\\xcd\\x9d\\x62\\xff\\x57\\xb6\\xf4\\x9a\\x1d\\x98\\xf9\\x47\\x0d\\xec\\x56\\x90\\x04\\xea\\x3d\\x1a\\xb5\\xbf\\x17\\x91\\xc6\\xc7\\x37\\xd1\\xcf\\x05\\x18\\x68\\x47\\x7d\\x2a\\x48\\x5d\\xed\\xbf\\xd9\\x54\\x0e\\x0b\\xe7\\xc2\\x19\\xd9\\x46\\xc3\\x71\\xe4\\xb9\\x04\\xbf\\xf1\\x64\\xe3\\x57\\xff\\x42\\x5b\\x80\\x30\\xe7\\x47\\x1e\\x9d\\x5c\\xc1\\x47\\x89\\xa0\\x48\\x5f\\x39\\xdb\\x65\\x76\\xca\\x03\\x8a\\x02\\xc8\\x7c\\x29\\x3b\\xb7\\xbd\\x05\\x13\\xb4\\x7d\\x9a\\x31\\x10\\xae\\x96\\x73\\x6e\\xf9\\x31\\x0e\\xf8\\xdd\\xbf\\x71\\x18\\x87\\xda\\xce\\x90\\x76\\x5b\\xf0\\x8a\\x8e\\xb2\\x8f\\x47\\xdd\\xea\\x28\\x19\\xe2\\x9a\\x99\\x8c\\xc7\\xd8\\x7d\\x7f\\x73\\x15\\xa4\\xc0\\xb8\\x21\\x7d\\x9b\\x68\\x14\\xc0\\x2f\\xed\\x78\\xe8\\x32\\x64\\x9e\\x44\\x6b\\x26\\xc0\\x2a\\x41\\x27\\x46\\xb8\\x62\\x5a\\xcf\\xf5\\xe2\\x39\\xb5\\x3a\\xf3\\x54\\xf9\\x16\\xbd\\xa9\\x68\\xbe\\x5c\\x6b\\x2e\\x56\\x27\\x8a\\xdb\\x97\\x10\\xae\\x81\\x6d\\x54\\x5e\\xa2\\x84\\x98\\x29\\x1a\\x52\\x10\\xa6\\x7a\\x6e\\x49\\xb5\\xe9\\x1d\\x53\\x7b\\xef\\x5d\\xb6\\x97\\x54\\xf1\\x24\\x60\\xb2\\xba\\x6f\\xe3\\xa6\\x76\\x42\\xbe\\x03\\xd9\\x08\\xf3\\x30\\x4d\\x4f\\xb5\\xda\\xc7\\x09\\x70\\xcc\\xd8\\x8b\\xa7\\x2b\\xab\\x33\\x54\\xd0\\x01\\x1d\\x30\\x58\\x13\\xbe\\x14\\xc3\\x72\\xe6\\xe0\\x05\\x85\\xa2\\x52\\x90\\x2b\\xf3\\xff\\x0e\\x53\\xcf\\xcb\\xdd\\x76\\x78\\x02\\xf8\\x9f\\x91\\x3b\\x9a\\x1d\\x6f\\x78\\x6f\\x79\\x59\\x46\\x44\\xd7\\x8f\\xd3\\x1c\\x0d\\xa0\\x5e\\x02\\x9a\\xbf\\x7e\\x8b\\x0d\\x7d\\x47\\xf7\\xdd\\x41\\x62\\xfe\\xa2\\x6a\\x4e\\x09\\xe2\\x75\\x28\\x95\\xf2\\xa5\\x1b\\xd4\\x8c\\x76\\x43\\xd9\\x64\\x27\\xbb\\x87\\x1a\\xd5\\x8f\\x35\\x37\\xca\\x84\\x8f\\x9b\\x14\\xd3\\x9a\\xf2\\x54\\xe2\\xcc\\xfb\\x63\\x28\\x3c\\xd3\\xe5\\x44\\x22\\x77\\x66\\x22\\x9f\\xfc\\xde\\x7d\\x2f\\x81\\x7a\\x3d\\x27\\xe2\\xa9\\xc1\\x9b\\xb2\\xc7\\x9c\\xf5\\xcc\\x3c\\x1b\\x81\\xf6\\x09\\x49\\x87\\x46\\x23\\x5d\\x69\\x8c\\xa2\\xfd\\x48\\x5e\\xf5\\x76\\x26\\x9f\\x61\\xdb\\x25\\xe7\\xa9\\xe1\\xd9\\xd1\\x84\\xdb\\x55\\xd4\\xaa\\x99\\x33\\xe2\\x24\\x8e\\x92\\xf2\\x4b\\x83\\x11\\x85\\x67\\xa5\\x71\\xe7\\x82\\x17\\x94\\x02\\x66\\x08\\x2e\\x8a\\xf8\\x83\\x83\\x40\\xf3\\x93\\xff\\x3d\\x63\\x6e\\x1e\\xbd\\x9f\\x29\\xe5\\xf8\\x17\\xe4\\x9f\\x31\\xb6\\x04\\xd2\\xa6\\x42\\x95\\x7e\\x7d\\x63\\x87\\x09\\x28\\x0e\\xd1\\x4f\\xb2\\x02\\x28\\x6d\\xd0\\x66\\x4b\\x0a\\x7e\\xfd\\x17\\x6e\\x0b\\x02\\x8e\\xe0\\x93\\x85\\x94\\x89\\x60\\xd2\\x23\\x69\\x09\\xd6\\x5f\\xaf\\xa3\\x2f\\xf5\\xde\\xaa\\xcf\\xef\\xc8\\xb6\\xcd\\x29\\x7f\\x56\\x49\\xce\\x24\\x42\\x7e\\x88\\xf0\\x31\\x0d\\xb7\\x61\\x21\\xd0\\x3f\\x5a\\x6f\\x31\\x95\\x2b\\xa2\\xc6\\x87\\x34\\x6c\\xe7\\x2f\\x19\\xe2\\x61\\x4d\\x71\\xa7\\xf2\\x20\\x1c\\xfa\\x7a\\x90\\x9d\\x3e\\x48\\xdc\\x52\\x5e\\x98\\xac\\x79\\x30\\xc1\\x37\\xe2\\xd0\\x1b\\xbe\\xf1\\x9c\\x4e\\xc2\\xb3\\xe1\\x08\\xed\\x76\\x9b\\x63\\x94\\x57\\xe6\\x57\\x77\\x57\\x07\\x15\\xed\\x09\\x2d\\x87\\x09\\x2d\\xdc\\xde\\xc4\\x62\\xa3\\x86\\x5d\\xb3\\x7e\\xb4\\x5f\\x3f\\xc1\\x1d\\x84\\xc7\\x2f\\xf7\\x14\\xda\\xcc\\xf8\\xbf\\xfe\\xcd\\xe9\\xe7\\x7a\\x83\\xd9\\xae\\x2d\\x7a\\x3b\\x0b\\x7b\\xe6\\x97\\x96\\x89\\xbb\\x12\\x78\\x5b\\xdc\\xbd\\x64\\x31\\x5f\\x58\\xaf\\x42\\x21\\xe0\\x39\\x5a\\xcd\\xfb\\x2c\\xb5\\x6d\\xca\\x66\\x71\\xf9\\x72\\x41\\x39\\x0f\\x11\\xd7\\xf3\\x54\\x5d\\x0b\\x2d\\xaf\\x8b\\x26\\xd8\\x5c\\x3e\\x2f\\x55\\xba\\xc5\\x35\\x67\\x7c\\xd1\\x00\\xff\\x80\\x38\\xb4\\x5d\\x6d\\x12\\x5e\\x98\\x97\\x6b\\x47\\xfb\\x22\\xaa\\x0d\\x8e\\xb9\\x39\\xde\\x03\\x9b\\xd0\\x1b\\xfb\\xfe\\xa8\\x8f\\x16\\xb2\\x33\\x82\\x8f\\x9f\\xa3\\x31\\x01\\x5d\\x8a\\x2f\\xce\\x3c\\x14\\x91\\xb9\\x3f\\x94\\x10\\x46\\xce\\x72\\x4f\\x3a\\xaa\\x60\\xe9\\x9c\\x4d\\x2c\\x32\\xb7\\x6a\\xee\\x05\\x1d\\x56\\xa4\\x30\\x4e\\x53\\xe9\\x4f\\x72\\x37\\x71\\xe0\\x41\\x63\\x25\\x75\\xd1\\x39\\x56\\xd3\\x79\\x3f\\x2d\\xc3\\xc2\\x50\\x83\\xe4\\x16\\x3d\\x89\\xd3\\x6e\\x7d\\x16\\x93\\x2c\\x62\\x2e\\xfe\\xef\\x62\\x19\\x06\\x06\\x69\\xc1\\xe3\\xb4\\xaa\\x2f\\xe7\\x01\\x65\\x24\\xae\\x3d\\x81\\xdc\\xfa\\xbc\\x59\\xff\\xc7\\xe6\\x9d\\xa6\\x09\\xdf\\xac\\x10\\x28\\xe4\\x7d\\xf0\\x7a\\x95\\x9f\\x80\\xda\\x5f\\x68\\x63\\x84\\x41\\x37\\x22\\xc6\\x80\\xf2\\xf2\\x00\\x33\\x11\\xbb\\xc7\\xf1\\x1f\\xc7\\x1d\\x37\\x7a\\x62\\x64\\x84\\xc8\\x72\\xa3\\xf5\\x74\\x89\\xdd\\x6d\\x74\\xa0\\x5a\\x33\\x46\\xd2\\xd7\\xe2\\xdd\\x42\\xf5\\xc2\\x8a\\xb2\\x10\\xc8\\xee\\xed\\x25\\xc9\\x62\\x8a\\xdb\\x6c\\x52\\xd6\\x1a\\x73\\x86\\xf7\\xf8\\x57\\xce\\x43\\x0f\\xa4\\x47\\xdf\\x73\\xa3\\xfd\\xe3\\x1d\\x69\\xe9\\xbe\\x14\\x8d\\x32\\x2e\\x42\\xf5\\x62\\x71\\x6c\\x22\\x5d\\x4a\\x46\\x2a\\x7d\\x09\\xeb\\xf4\\x93\\x29\\xe3\\xc5\\xaf\\x1a\\x3b\\x85\\xd9\\xec\\x23\\x6b\\xc8\\x67\\x51\\xe6\\x67\\x51\\x63\\x9f\\x9f\\x6b\\xeb\\xd7\\x70\\x3b\\xa8\\x4b\\x38\\x0a\\xd7\\x52\\xcd\\x28\\x66\\x4c\\xe4\\x01\\x78\\xf0\\xab\\xc4\\xb5\\x14\\xf2\\x04\\xf4\\x7f\\xee\\x64\\x15\\xda\\xb7\\x27\\xf2\\x43\\x6a\\xd9\\xc8\\x7e\\xfc\\x05\\xf3\\x0c\\xf3\\x59\\x0e\\x79\\xbe\\xc2\\xe9\\xe9\\x4e\\x49\\xb9\\x9c\\x91\\xd7\\xe5\\x7e\\x0c\\xeb\\x6a\\x34\\x7d\\x9a\\x07\\x63\\x41\\x80\\x37\\x7f\\x30\\x60\\x8e\\x27\\x40\\x04\\xdf\\x79\\xc2\\x66\\x97\\xc4\\x02\\x1d\\xaf\\x1c\\xc7\\xe3\\x89\\xc8\\x04\\xac\\x7a\\xfa\\xe4\\xa7\\x74\\x67\\x5a\\x7e\\xac\\x20\\xc1\\x4e\\x58\\x06\\x8a\\x05\\xfa\\x8d\\x11\\x0f\\x99\\xfe\\x94\\x0a\\x47\\x43\\x64\\xf0\\x2e\\x5a\\x8c\\xfc\\x23\\xa6\\x6b\\x84\\x50\\xab\\x3e\\x08\\x5e\\xa9\\xf6\\x4d\\xe5\\xbe\\xf7\\x09\\x39\\x30\\x6f\\x88\\x1a\\xfe\\x6e\\xb6\\x91\\x52\\xec\\x2d\\xb8\\xc8\\xfa\\x0b\\x50\\xfe\\xc3\\x81\\x58\\x81\\xcc\\x5a\\x4e\\x2f\\xf6\\xd8\\xd0\\xf4\\x2c\\xec\\x0f\\x16\\x3c\\x0e\\xd3\\x34\\x29\\xf9\\x0b\\x8a\\x35\\x1a\\x0e\\x49\\x82\\x4b\\x23\\xb6\\xf8\\x38\\x07\\x04\\xf6\\x63\\x1b\\x54\\xf6\\xe8\\xda\\xd7\\x6c\\xbf\\x96\\xe9\\x22\\x1e\\xcb\\x67\\x3d\\xe3\\xb5\\x73\\x62\\xb0\\x90\\xfd\\x53\\xcf\\x73\\xf3\\xf6\\xc0\\x42\\xb9\\xeb\\x6e\\x24\\xc3\\x61\\x1e\\xf4\\x62\\x5a\\xd1\\xf9\\x2f\\x31\\xea\\xaa\\x4c\\x7f\\xc0\\x0a\\xc5\\x3b\\x8a\\xcc\\x63\\x38\\x8a\\x45\\x6b\\x0b\\x0a\\xb8\\x33\\x68\\x4b\\x0f\\x1d\\xbb\\x25\\xc5\\x36\\x6e\\x46\\xab\\xd4\\x57\\xfb\\x96\\x06\\x52\\xff\\x74\\xba\\x31\\xf2\\xda\\x65\\xe2\\x29\\x0e\\xd7\\xd4\\x13\\x45\\x25\\xc1\\xbb\\x8d\\xe1\\xee\\x32\\xa5\\x1c\\xa5\\x44\\x03\\x1b\\x17\\xca\\xda\\x2f\\xa6\\x7d\\x29\\x1d\\x8f\\xb2\\xb6\\x30\\x24\\xf5\\x7c\\x8d\\xfd\\x1d\\x33\\x51\\xc2\\x0b\\x85\\xb3\\xf6\\xf4\\xd6\\x33\\x2e\\xfe\\x3c\\x39\\x56\\x4d\\x8f\\xe5\\x3f\\xb9\\xe1\\x70\\x4e\\x18\\x39\\xa1\\xcf\\xff\\xb8\\x77\\x9c\\x19\\xe7\\x41\\xe6\\x35\\xc9\\x54\\xd2\\xed\\xbb\\x6b\\xed\\x84\\x5d\\x82\\xed\\x57\\xf8\\x1d\\xe0\\x3d\\x4e\\xa2\\xae\\x9f\\x8f\\xec\\x93\\x00\\x9b\\x61\\x97\\x46\\x5c\\xaf\\x81\\x54\\x41\\xc6\\xc0\\x71\\xec\\x13\\xf6\\x61\\xf4\\xee\\x83\\xf5\\x0d\\xd2\\x40\\x80\\xe8\\xfa\\xe3\\xec\\x5d\\x36\\x0c\\xcb\\x7b\\x66\\x5f\\x13\\xac\\x2c\\x63\\x95\\x02\\x7e\\x15\\xb9\\xd7\\xa8\\x0d\\xf6\\x8a\\x56\\xbb\\xa4\\x56\\xa4\\x54\\xe1\\x3a\\x60\\xc3\\x1e\\x55\\xe7\\x0e\\xb9\\x98\\x60\\xa8\\x14\\x5c\\xdd\\xc0\\x45\\xce\\xe4\\xd7\\x68\\xb3\\x4e\\xd6\\xb4\\x07\\xf1\\xd6\\xbd\\x43\\xc1\\xcb\\x5d\\xbc\\xb2\\x2b\\x43\\x91\\xd9\\x5e\\x6e\\xfe\\x59\\x88\\xc9\\x9f\\x5f\\xd4\\x90\\x8a\\x9c\\xfd\\x3b\\x95\\xc3\\x44\\x31\\xbd\\x92\\x3c\\xa6\\xdd\\x14\\x74\\xc5\\xd1\\x5d\\x5e\\xed\\x59\\x43\\xc9\\x0d\\x1a\\x6c\\xfb\\x84\\x9e\\xaf\\xbf\\xe6\\xd8\\xd6\\xc7\\x2d\\xf0\\xb1\\xf6\\x21\\xf6\\xea\\xdb\\xa6\\x85\\xc6\\x8f\\x63\\x13\\xf2\\x9f\\x14\\x66\\xf1\\x19\\xfc\\xbd\\xeb\\x8c\\xe0\\xa5\\x37\\x6d\\x9d\\xa4\\x13\\xc4\\x5a\\x13\\xb2\\x79\\xd7\\x90\\x2f\\x09\\xcd\\x22\\xce\\x9f\\xe9\\x5f\\xbc\\xf6\\x8b\\xdc\\xc2\\x2d\\x41\\x85\\x28\\xb2\\x60\\xd3\\xa7\\x9e\\x3a\\xda\\xca\\xca\\xf8\\x7e\\x31\\x80\\xb7\\x2a\\x80\\xf1\\xf0\\xa5\\xf8\\x14\\x8a\\xe8\\xb7\\x3d\\x16\\xd3\\x6d\\x92\\x5f\\x95\\x05\\xc2\\x71\\x4e\\x57\\x6b\\xf9\\x7e\\xaf\\x46\\x2d\\xca\\xb9\\xa1\\x52\\xcb\\x80\\xb7\\x66\\x56\\x25\\x76\\x9f\\x90\\xf5\\x6f\\x66\\x35\\x50\\x5e\\x92\\xac\\xa1\\x7a\\xe5\\x81\\x14\\x79\\xd9\\xcc\\xd7\\x31\\xdd\\xe7\\x76\\x40\\xce\\x69\\x59\\x88\\xce\\xc3\\x6f\\x57\\x1e\\x5d\\x0e\\x04\\x22\\x39\\xd4\\xe6\\xaa\\xd6\\x8c\\x6f\\xe4\\x6e\\x9d\\x93\\xb2\\xcf\\xc3\\xac\\x43\\xd3\\xf8\\x9a\\xb3\\xc7\\xfa\\xcd\\x79\\xe5\\x0c\\xf6\\xa1\\x2c\\x62\\xdd\\x64\\x93\\xee\\xc3\\xe0\\x9c\\xac\\x4b\\xc7\\xde\\xfd\\x7c\\x2e\\xef\\xe0\\xca\\x06\\xb2\\x6a\\x04\\x8f\\xa4\\x69\\x73\\x0b\\x02\\x89\\x87\\xbf\\x46\\xa4\\x5d\\x9e\\x1d\\x5e\\x57\\x2a\\xd8\\x5f\\x7b\\xae\\xbb\\x27\\x1e\\xef\\xa4\\x7b\\x6f\\x65\\x5b\\x5b\\x26\\x26\\xd3\\xf3\\xa6\\x22\\x10\\x37\\xd5\\x1e\\x86\\xfb\\x85\\x61\\xe3\\xc4\\x59\\xfc\\x0f\\x38\\xf6\\x39\\x68\\xac\\x4e\\xe7\\xde\\x4f\\x21\\x3f\\xe9\\xbd\\xc3\\xaa\\x4f\\x1d\\x62\\x93\\x1a\\x50\\x74\\xa5\\x6b\\x16\\x44\\xaa\\xa8\\xfd\\xe4\\xaf\\x27\\xae\\x16\\xc2\\x3b\\x78\\x13\\xd5\\xdf\\xf5\\x22\\xba\\x00\\x09\\xe7\\xa7\\x1c\\x83\\x92\\x15\\x8a\\x1c\\xb8\\x46\\x83\\xf0\\x3a\\x4f\\x73\\x0e\\xcf\\x7b\\x46\\xf5\\x90\\xc2\\xf8\\xc2\\xdc\\xf6\\x6f\\xa3\\x08\\xbb\\x09\\x4a\\x4d\\x99\\x7a\\xa8\\x9b\\x2c\\x72\\x00\\x97\\xc1\\x91\\x99\\x12\\x2c\\x46\\x90\\x05\\x5b\\x26\\x56\\xc6\\x22\\xf5\\x6e\\x93\\xac\\x61\\x68\\xee\\x61\\x1e\\x78\\x03\\x47\\x79\\x54\\x7e\\x5b\\x30\\x65\\x80\\x25\\x2b\\x8b\\xe8\\x37\\x73\\xd6\\x6f\\x57\\x82\\x54\\x41\\xb2\\xe5\\x5a\\x52\\x0d\\xba\\x6e\\x2d\\x99\\xb5\\x96\\x2e\\x5e\\x1f\\xcb\\x45\\x2d\\xfc\\xc5\\x01\\x8c\\xf6\\xb6\\x20\\x2b\\x34\\xa1\\x1d\\x1e\\x7b\\xdd\\x1d\\xaa\\x57\\xe5\\x1c\\x9a\\x61\\xd9\\x6c\\xfe\\x83\\xd6\\x36\\x1f\\x01\\x3b\\x3d\\x32\\x5b\\x6e\\x13\\x77\\x91\\x2a\\x81\\x7d\\x2b\\xbb\\xef\\xec\\x59\\xdc\\x35\\xed\\x1b\\x41\\x7e\\xb0\\x3b\\xdf\\x7a\\x03\\xe8\\x7b\\x8f\\x47\\x22\\x83\\xa4\\x0e\\xac\\x4e\\x12\\x66\\x59\\x4a\\x75\\xd0\\x7d\\xe9\\xf0\\xc7\\x36\\x66\\x82\\x94\\xb2\\xe0\\x49\\x9c\\xd3\\x85\\xfe\\xe1\\xa7\\x56\\xd3\\xe6\\xe9\\x7b\\xd4\\xd0\\xb9\\x5c\\x7b\\xaa\\x06\\x80\\x5e\\xa8\\xfc\\x8a\\x31\\xa5\\xfd\\xec\\xd3\\x39\\x3f\\x93\\x51\\xb4\\x4b\\x10\\x5a\\x18\\x32\\x30\\x2a\\xb8\\x6f\\xf8\\xa4\\xce\\x4b\\x83\\x6a\\x8b\\xe5\\x99\\x08\\xdf\\x7a\\x96\\xe8\\x98\\xec\\xa4\\x05\\xc3\\x8c\\x97\\x84\\xb4\\x3a\\xca\\x27\\xfb\\x16\\xef\\x3f\\x51\\x16\\x2b\\x40\\x2f\\x9f\\x28\\x6f\\xf1\\x8d\\xa6\\x73\\x63\\x15\\x18\\x39\\xad\\xde\\x4b\\xc6\\x7d\\x98\\x1f\\xbf\\x96\\xcf\\x19\\x3e\\xf1\\x3e\\xc4\\x02\\xfe\\x92\\xfb\\xaf\\x6d\\x66\\xb6\\x73\\xb7\\x9e\\xee\\x49\\x54\\xef\\x3e\\xc5\\xf0\\x67\\x54\\x21\\xb8\\x1d\\xb3\\xce\\x9b\\x8f\\x37\\xe6\\x21\\xb8\\x96\\x48\\x1b\\x17\\x4f\\xab\\x62\\x25\\x19\\x02\\x0c\\x0b\\x71\\x4a\\xb0\\x12\\x58\\xab\\x4c\\xf6\\x7f\\xd7\\x98\\xec\\xed\\x47\\x14\\x17\\xe2\\x6e\\x71\\x4b\\x65\\x36\\x98\\xb8\\x1a\\x43\\xf0\\x4d\\xd4\\xac\\xd9\\x65\\xb7\\x1e\\xf7\\x22\\x18\\x64\\xf9\\x05\\x30\\xfe\\x32\\xfd\\x1b\\xf4\\x42\\xc0\\x24\\x64\\x23\\xc9\\x9f\\x69\\xee\\xf4\\x40\\xd6\\x74\\x98\\x21\\x24\\xed\\x23\\x7c\\x40\\x81\\x7e\\xb0\\xf9\\x54\\x59\\x5d\\x6a\\x38\\xaa\\x8e\\xed\\xc3\\xfd\\x5a\\xa2\\xb1\\xdf\\xc5\\x30\\x1c\\xb5\\x0e\\x21\\xae\\x7a\\xdb\\x30\\xe5\\xea\\xdf\\x8d\\x71\\x9b\\x7d\\xaf\\x3d\\xb0\\x76\\xcf\\xd8\\xf6\\x30\\x3f\\xf3\\xfb\\xbe\\xdd\\x47\\x5b\\xfd\\x6c\\x87\\xff\\xe8\\x0f\\xe1\\xac\\xba\\xe2\\x1d\\x70\\x26\\xd6\\xf4\\x5b\\xe0\\x01\\xc5\\x7a\\x3a\\x6b\\xf4\\xf1\\xab\\xf7\\xf4\\xf5\\x75\\x01\\xba\\x10\\xea\\x61\\x15\\x0d\\xf3\\x43\\x8d\\x5e\\x33\\xfd\\xad\\x60\\xbb\\xa7\\xa2\\x98\\xe2\\xb3\\xb5\\xd8\\x7e\\x04\\x09\\x5a\\x01\\x9e\\x07\\x2c\\x9c\\xb6\\x30\\xae\\xf1\\xfb\\x3f\\x9e\\x5d\\x51\\x84\\x2d\\x1b\\xf3\\xa1\\x04\\x34\\xec\\x73\\x33\\x27\\x6a\\xa8\\x37\\x57\\xf7\\xc2\\x99\\x5a\\x4d\\xa3\\xda\\xc4\\x8e\\x8f\\xc6\\xba\\x3c\\xe6\\x80\\xbd\\x44\\xa1\\x24\\x61\\xe5\\x1c\\x1d\\x8a\\x99\\x7a\\xed\\x07\\xf5\\x3a\\x0d\\x3b\\x1b\\xec\\x54\\x28\\x88\\x3e\\x64\\x5f\\xf4\\x2b\\x1d\\x39\\x79\\x36\\x13\\x2e\\xe7\\x77\\x4d\\xe4\\x81\\x9c\\xcc\\xb8\\xc3\\x7f\\xa6\\x83\\xce\\x1f\\x97\\xc2\\x9c\\xfe\\x86\\xd9\\x8e\\x9d\\x55\\xa6\\x3c\\x54\\xed\\x90\\x04\\x3e\\x36\\xcd\\x9c\\x3f\\x68\\xd7\\xf9\\x4d\\x49\\x4b\\x02\\xcd\\x31\\xac\\x0b\\xda\\x56\\xb9\\x12\\x49\\x52\\x47\\xb1\\xc6\\xb0\\x29\\x15\\x4b\\x5a\\x1f\\x5a\\x6f\\x93\\x2c\\x32\\xbb\\x0e\\xd6\\xfc\\x66\\xba\\xbc\\xdf\\x70\\x84\\x40\\xce\\xfb\\xad\\x7b\\x07\\x14\\x35\\x3b\\xaf\\x93\\x06\\x0c\\x3d\\x7e\\x4f\\x65\\xae\\xc1\\xbe\\x9b\\x69\\x41\\x48\\x6c\\x03\\x3f\\x7f\\x70\\x64\\x06\\xac\\x35\\xb8\\x98\\xeb\\x42\\x17\\x1f\\xe4\\xc2\\x89\\x9c\\xef\\x43\\xb8\\x50\\x3b\\xb4\\x9f\\x94\\x8f\\x9c\\xdc\\x0d\\x1d\\xeb\\x80\\xb9\\xbf\\xf7\\xf9\\xf5\\xab\\xa5\\xf4\\x19\\x96\\x4c\\x92\\x4b\\x09\\xf4\\x5f\\x39\\x3b\\x8f\\xc3\\x1c\\x67\\xae\\x51\\x2f\\xb7\\x6a\\x8d\\x50\\x11\\xaf\\x5a\\xf9\\x0c\\xc9\\x42\\x87\\xcd\\xbb\\x65\\x12\\xfb\\xf8\\xf8\\x0c\\x1d\\x1e\\xa7\\xf0\\x29\\x2d\\xd2\\xda\\xd7\\x50\\x76\\xca\\x46\\xab\\x20\\xb2\\xb4\\x8d\\x9f\\xff\\x78\\xc7\\xd0\\x7e\\xbb\\x19\\x70\\xe3\\xeb\\x9f\\x53\\x94\\x8f\\x97\\x6a\\x5a\\xd9\\x42\\x7e\\x82\\x6f\\x3a\\xef\\xe9\\xd9\\x7c\\xbb\\x0a\\xd4\\xc7\\x78\\x8d\\xad\\xac\\xec\\x50\\x16\\x26\\x3b\\xb3\\x4b\\x20\\x5c\\x53\\x26\\x4c\\xb0\\x22\\xe1\\x4c\\xbd\\x53\\x2c\\xb5\\xad\\xa5\\x46\\x80\\x87\\x6a\\x87\\x87\\x87\\x9a\\xca\\x4d\\xe8\\xb7\\x15\\x94\\xd5\\x18\\xb5\\xc7\\x30\\x9d\\x81\\x45\\x63\\x2b\\x94\\x5b\\xbb\\x1b\\x6a\\x34\\xdd\\x4c\\x33\\xba\\x8f\\xb6\\x3c\\xcd\\x69\\xbb\\xc5\\x3d\\x76\\x08\\x48\\xdf\\x66\\xd0\\xdd\\x6e\\xb7\\x9e\\x82\\x5b\\xe2\\x13\\x05\\x7d\\x1d\\x3b\\x64\\xf3\\x7e\\xfa\\x15\\xe2\\x32\\x8c\\x6a\\xd2\\x54\\x8e\\xc4\\x79\\x61\\x12\\x90\\xe4\\x9f\\x62\\xa1\\xa1\\x40\\x98\\x0e\\x06\\x7d\\xec\\x89\\x42\\x78\\xaf\\xeb\\x6b\\xbf\\xd7\\x1a\\x20\\x93\\x5a\\x55\\x75\\x4b\\x39\\xfc\\x7e\\x6b\\x94\\xff\\x2b\\x60\\xd0\\xea\\x03\\xba\\xcf\\xc4\\xb8\\x87\\xab\\xe3\\x85\\x58\\x99\\xec\\x4f\\xf3\\x4d\\x21\\x6e\\xb9\\xad\\x4f\\x37\\x9d\\x88\\x04\\x7b\\x5d\\x37\\x16\\xe4\\x9f\\x86\\xb3\\x03\\xc3\\x8d\\x05\\x16\\xc8\\xa1\\x1a\\x2e\\x88\\xcf\\x14\\x6a\\x03\\x72\\x15\\xc5\\x5e\\x52\\x15\\xfc\\x34\\x46\\x19\\xf8\\xdf\\x13\\x7d\\xb9\\x1e\\x4f\\x77\\xbe\\xea\\x65\\xb6\\x1f\\x59\\x2a\\x8d\\x0a\\x6f\\x14\\xcf\\x99\\xfa\\x49\\xde\\x73\\x30\\xa7\\x1d\\xcc\\x9e\\x68\\x12\\x82\\x4d\\x43\\xdc\\x5a\\xe7\\x99\\x70\\x7d\\x7e\\x52\\xa5\\xed\\x06\\xfd\\xd8\\xb3\\x8a\\x5e\\xe3\\x9c\\x4a\\x8b\\xcd\\xb1\\xb1\\xa7\\x78\\x5c\\xb8\\x7d\\x33\\x79\\x38\\xd9\\xf8\\xd7\\x71\\x02\\xfb\\x99\\x73\\x73\\x84\\x26\\x87\\x2e\\x1d\\x5a\\xeb\\x8f\\xc2\\xd7\\xdd\\x54\\xe4\\xc6\\xc0\\x27\\xd4\\x13\\x34\\x60\\x03\\x86\\xab\\x1a\\xf4\\x0e\\xc9\\xb4\\x21\\xcd\\xb9\\x46\\xfc\\xf4\\xbd\\x31\\x56\\x84\\x69\\xa9\\x5e\\x22\\xa9\\x8b\\xce\\xd2\\xa1\\xf9\\x07\\x34\\x18\\x5f\\x91\\x12\\xbc\\x61\\x1d\\x1d\\xcb\\xe4\\x08\\xd8\\xa2\\xf0\\x3b\\xef\\x7e\\xa2\\x41\\x91\\xdf\\x83\\x89\\xb7\\xfd\\x9a\\x32\\x7b\\x6e\\xfb\\xaa\\xde\\x2e\\xb7\\xb7\\x6c\\x2d\\x56\\x6e\\x67\\xa5\\x94\\xe2\\x73\\x6a\\x76\\xe7\\xd2\\xa1\\xaf\\x4c\\x42\\xf8\\x8a\\x42\\xf0\\x7b\\x2c\\xa9\\xa8\\x6f\\xd8\\xa5\\x51\\x87\\x27\\xf2\\x27\\xe1\\x3e\\x17\\x09\\x94\\x92\\x47\\xb4\\x8b\\x10\\xa5\\xc5\\x0e\\xc5\\xe6\\xf3\\xe9\\x56\\x55\\x41\\xac\\xa7\\x7c\\xac\\x7f\\x97\\x63\\xf5\\x66\\xfc\\x77\\xc0\\xb6\\x32\\x1d\\x7a\\xe1\\x6f\\x67\\x0a\\x94\\x6d\\x9b\\x20\\x96\\x8d\\x96\\x26\\x98\\x0c\\x51\\x3f\\x56\\xd8\\xb1\\xf2\\x2e\\xe0\\x15\\x56\\x06\\x35\\x4c\\xba\\xea\\x6f\\x08\\x5d\\x5f\\xc5\\x1b\\xa7\\xc7\\xf2\\xd8\\xca\\x93\\x73\\xc9\\xe7\\xb5\\xfa\\xa7\\x4c\\xa5\\x04\\x31\\x63\\xf3\\x7d\\x8d\\x27\\x1e\\xfd\\x9f\\xde\\x04\\xc6\\xc5\\xf6\\x97\\xdf\\x00\\x5d\\x98\\xce\\xca\\x85\\x7e\\x63\\x15\\x77\\xb3\\xdd\\xde\\x15\\x9b\\x0e\\x42\\x0b\\xeb\\x47\\xad\\xdf\\x73\\xe7\\xa1\\x2d\\xdf\\xf3\\xb9\\xc0\\x1c\\x36\\x2d\\xb4\\xaa\\x2c\\xb3\\x4a\\xa8\\x26\\xe8\\xea\\x9f\\xd9\\xcd\\x74\\x33\\xb7\\x05\\x59\\xde\\x66\\xcd\\x99\\xc0\\x18\\xe8\\xed\\x9e\\xf2\\x65\\xc3\\x38\\xf0\\xd0\\x14\\x3d\\xc5\\x51\\x16\\x01\\xbb\\x36\\xd2\\x47\\x55\\x42\\x37\\x3a\\xf4\\xef\\x5a\\x64\\xad\\xa8\\x68\\xd8\\xc6\\x67\\x5e\\x6d\\x1e\\xb3\\x20\\x1e\\x8b\\xe2\\xcb\\xbc\\x53\\x41\\xda\\x33\\xae\\xa9\\x3e\\x63\\x6b\\x77\\x52\\x84\\x5c\\x0e\\x97\\x0b\\x77\\xe0\\xed\\xa4\\xde\\x88\\x7c\\x8e\\xff\\x85\\xde\\x4c\\xe7\\xa8\\x60\\x6b\\x53\\xbb\\xf7\\x86\\x31\\xe4\\x5e\\x4a\\xf8\\x75\\xcb\\xb5\\x7e\\xad\\xed\\xca\\x9d\\x57\\x47\\x0b\\x68\\x36\\xd0\\x39\\x30\\x9b\\xfe\\x13\\x37\\xd4\\x1f\\xd9\\x33\\x42\\x90\\x24\\xfd\\xc4\\xd6\\xaa\\x39\\x9a\\x18\\x57\\xd3\\x58\\x92\\xad\\x0d\\xb1\\x18\\x4f\\x5f\\x23\\xe9\\x60\\x49\\xb7\\x91\\xfa\\xf0\\x88\\x0f\\x05\\xed\\x3b\\x2c\\x97\\x65\\x8c\\xd7\\x6f\\x25\\x46\\xad\\xca\\xdf\\x99\\xc3\\xe2\\x8c\\xd3\\xbb\\xa3\\x87\\xec\\xc6\\x34\\xa5\\x7c\\xad\\x9c\\xc8\\x2c\\x03\\x2d\\xc1\\xe7\\xcd\\x43\\xcf\\x06\\xbc\\xb7\\xed\\x4a\\x4d\\x24\\x3e\\x83\\x12\\x17\\xcb\\xec\\xb2\\xdb\\xac\\xc5\\xf6\\xa6\\xf1\\xed\\x7b\\xae\\x23\\x76\\x0e\\x28\\xfc\\xe5\\xed\\xc6\\x73\\x4c\\xbf\\xed\\xae\\x51\\xb0\\x96\\x0b\\x9c\\xf7\\x1c\\x67\\x47\\x70\\x1f\\x65\\x2c\\xbf\\x9d\\xc0\\xdb\\x79\\xef\\x12\\x1d\\xb5\\x4b\\x47\\x30\\x60\\xdd\\xe3\\x42\\x99\\xe0\\xb6\\xd1\\xd5\\x18\\xfc\\xe4\\x77\\x37\\x6c\\x7d\\x20\\x2a\\xe2\\xae\\x41\\xa7\\x90\\x20\\x74\\x8d\\x6a\\x2f\\xc2\\x73\\x77\\x60\\x03\\xdb\\x2c\\x09\\xee\\x9c\\x19\\x35\\x71\\xc7\\x63\\xb2\\x68\\x95\\x6b\\xc1\\xac\\xb7\\x75\\x2e\\x0f\\x24\\x11\\x36\\x37\\x53\\x39\\x39\\xe6\\x39\\xd0\\xa6\\x5f\\xad\\xab\\xb5\\x3b\\x21\\xc7\\xfc\\x0e\\xfe\\x8f\\xc0\\xbc\\x18\\xfa\\x96\\xb1\\x07\\x76\\x31\\x59\\x42\\x8a\\xbb\\xde\\x45\\xc9\\x49\\x2b\\xb0\\xa7\\x4a\\x1c\\x71\\x60\\xa4\\x23\\x22\\x18\\x5f\\x04\\x8b\\x78\\x59\\x40\\x95\\x1e\\xaf\\xeb\\x79\\x29\\x2b\\x83\\x70\\xb6\\x47\\x66\\x84\\x21\\x33\\xb8\\x54\\xaf\\xee\\x7e\\xa9\\x2b\\xb8\\x63\\x97\\x4f\\x3b\\xb9\\xe1\\x39\\x7a\\xbf\\xa5\\xa5\\xf0\\x00\\x33\\x05\\x89\\x41\\xac\\xe7\\x1d\\x1c\\x1b\\xd7\\x28\\x03\\xf9\\xee\\x08\\x6f\\xc2\\x05\\xd8\\x70\\x23\\xfd\\x1b\\xe1\\x9b\\x86\\xf2\\x24\\x2d\\xcf\\x4b\\x65\\xe2\\x3b\\x0d\\xc1\\x7b\\x6a\\x24\\x05\\x19\\xbf\\xa0\\x9f\\xfc\\x93\\x55\\xc1\\x5d\\xa3\\xac\\x1b\\xd2\\xc5\\x18\\xdc\\x09\\xba\\xb5\\x17\\x50\\x80\\xe7\\xff\\x48\\x17\\xac\\xe5\\x14\\x1a\\x6d\\xd0\\x28\\x0b\\xd6\\x88\\x35\\xae\\x27\\xfb\\x93\\x1c\\x77\\x09\\x79\\x33\\xa0\\x08\\xc9\\xff\\x80\\x2d\\xee\\x90\\x1b\\x46\\x3c\\x80\\x69\\xb6\\xa4\\x98\\x8e\\x6e\\xc2\\x51\\x0f\\xf3\\x7b\\x3f\\x6f\\x32\\xcd\\xe2\\xac\\x22\\xf8\\xb7\\x78\\xbb\\x0f\\xfc\\x44\\x5f\\x90\\x60\\xa5\\xe6\\x8f\\xec\\x13\\x85\\x73\\x9a\\xe2\\x1d\\xd3\\xf7\\xdb\\xa1\\x96\\x9e\\x64\\xc8\\xcf\\xfb\\xd3\\x81\\x88\\x58\\x97\\x59\\xaf\\xb7\\x2d\\x65\\x15\\x07\\xa3\\x95\\x20\\x5e\\x09\\x5a\\x72\\xb8\\x02\\xfe\\xb5\\xfb\\x37\\x14\\x42\\xbe\\x9f\\x33\\xd9\\xee\\xe3\\xf3\\x7c\\x39\\xb2\\x04\\x0d\\x65\\xb7\\x07\\xf1\\x7a\\x1e\\xf8\\x02\\x98\\x27\\x66\\x9b\\x7d\\x0c\\xb4\\x12\\x52\\x02\\xf5\\xd6\\x0b\\x6e\\xa1\\x1c\\x6f\\xa2\\xd2\\xdf\\xe0\\xaa\\xfa\\xe7\\xf3\\xd5\\x47\\x58\\x5b\\xc2\\x34\\xfe\\x4a\\xfb\\x28\\x17\\x75\\xca\\xc5\\x48\\x7c\\x53\\x21\\x9e\\x6e\\xac\\xcc\\x56\\x05\\x4f\\x0a\\xd6\\xbe\\x24\\xb3\\x34\\x77\\xd5\\x48\\xc7\\xd7\\x5f\\x26\\x2f\\x0e\\xf7\\x9d\\x8a\\x12\\xa0\\xe8\\x87\\x4f\\xa3\\x36\\x8c\\xcf\\x70\\x81\\x03\\xe5\\x6a\\x07\\xd5\\xbc\\xbb\\xdc\\xcc\\x5e\\xda\\x34\\x73\\x75\\xf2\\x9b\\xc7\\x20\\xe6\\x76\\x6a\\x54\\xe6\\xf7\\xd5\\x16\\xe2\\xf4\\xab\\x6f\\x93\\x63\\x34\\x3b\\x43\\x69\\x19\\x99\\x91\\x15\\xf3\\x13\\xd0\\x62\\xb7\\xe4\\xb1\\xcf\\x75\\xf8\\x2f\\x1c\\xe2\\x4a\\x58\\xba\\x98\\x53\\x48\\xd8\\xaf\\xb7\\x72\\xcd\\xf1\\xa0\\x75\\xb8\\x1e\\xbc\\x16\\x10\\x66\\xf5\\xec\\xd6\\xfd\\x3e\\x8e\\x7b\\xbf\\xea\\xf6\\xe9\\x01\\x7d\\x6d\\xbf\\x77\\xeb\\xb8\\xdc\\x96\\x1e\\xb5\\x21\\x7c\\x71\\x1d\\x9d\\xc9\\x69\\xb0\\xb3\\x3e\\x9e\\x77\\xbd\\x8e\\x9f\\x0f\\xf3\\x32\\x07\\xc4\\xb1\\xdf\\xdd\\xd1\\x30\\x5c\\x08\\x58\\x2a\\xf6\\xdc\\x87\\x2d\\x10\\x2e\\x8c\\xf5\\x49\\x10\\xce\\xb9\\x89\\xa3\\x13\\xe7\\xfe\\xd2\\x10\\xd4\\x0f\\x1b\\xc3\\xa9\\x46\\x98\\xf2\\xf4\\x97\\xbe\\x35\\x43\\xe3\\x28\\x17\\x97\\xfb\\xad\\x14\\x55\\x1c\\x4c\\xec\\x2e\\x2c\\x6f\\x29\\x84\\x2d\\xe2\\x34\\x29\\x3f\\xb6\\x5e\\xf0\\x76\\x30\\x99\\x51\\x3b\\x92\\x44\\x70\\xb4\\xec\\xa3\\xeb\\x8e\\xe8\\x4a\\xd6\\xa0\\x19\\x24\\x92\\x12\\xdc\\x15\\xe7\\xd4\\xa8\\xbe\\x6b\\x63\\xc7\\x15\\xa4\\xf8\\x9e\\x29\\xf8\\x13\\xeb\\x10\\x74\\x16\\x1b\\x40\\xcc\\x1d\\x69\\x3e\\xc1\\x1a\\x81\\xbc\\xb8\\x02\\xca\\x17\\x10\\x8a\\x38\\x51\\x38\\x21\\x3c\\x79\\x5e\\xf8\\x75\\x73\\xd0\\x58\\x5a\\xd5\\x02\\xdf\\xa0\\xe3\\x73\\xa9\\xdb\\x7d\\x7f\\x5e\\xb3\\x87\\xd9\\x32\\xb3\\x12\\x74\\xd1\\xd5\\x7b\\xa2\\x05\\x75\\xba\\x51\\xa7\\xc6\\x36\\x69\\x26\\xd4\\x5a\\x40\\xab\\x29\\x61\\xf6\\xc9\\xf0\\xf2\\x2a\\x15\\x83\\xf7\\x22\\xbc\\x49\\xf5\\xb1\\x7c\\xb6\\xbb\\x92\\x51\\x46\\x51\\x98\\x11\\x64\\xf0\\xcd\\x94\\xb2\\x2d\\xfc\\x26\\xdf\\xf4\\xa1\\xe8\\xbb\\x79\\x08\\x15\\x01\\x50\\x49\\x5a\\xac\\x96\\x07\\x8f\\x3b\\x7c\\xa5\\x4c\\xb0\\x72\\x06\\xa0\\x27\\x3b\\xa9\\x89\\xdb\\xf7\\xea\\x3a\\x65\\x69\\x9c\\xc3\\xdd\\xf5\\x42\\x04\\x67\\xac\\xa8\\x61\\x78\\x2d\\xe9\\x7e\\xd4\\x1a\\xe4\\x8a\\x5d\\x62\\x2e\\x38\\x07\\xd1\\x84\\x17\\x78\\x27\\xa2\\xb1\\x39\\x25\\x40\\xf3\\x25\\x07\\x21\\x0f\\x11\\xd0\\x97\\x95\\xdb\\x5d\\xb0\\x38\\x32\\xce\\xcb\\xfd\\x56\\x98\\x98\\x96\\x28\\xa4\\x52\\x8b\\xba\\x36\\x5a\\x53\\x53\\xd5\\x5f\\xb3\\x70\\xec\\x80\\x66\\xaa\\x6c\\xbf\\xd8\\x74\\xb4\\x4c\\xa1\\x43\\xc9\\x35\\xc3\\xc6\\x8f\\x32\\xbb\\xb8\\x67\\xac\\x98\\xac\\x34\\x0c\\xba\\xf8\\x9b\\x34\\x8c\\x8c\\x2f\\x4c\\xb2\\xf3\\x25\\xfb\\x89\\x21\\x04\\xda\\x5f\\x2c\\xaa\\xd0\\xa8\\x99\\xf5\\x77\\xf8\\xcb\\xea\\x3e\\xaa\\xf8\\x79\\xee\\xd0\\xb3\\xec\\xa1\\x05\\x89\\xd3\\xe6\\x7c\\x9a\\xd8\\x54\\x02\\x3a\\x48\\x75\\xb0\\x1c\\x83\\xaf\\xf2\\xb4\\x94\\x12\\x5b\\xfa\\xfb\\xac\\x8e\\x4c\\x45\\xcb\\x80\\x5e\\x5f\\xa2\\x3b\\x4f\\xe2\\xff\\xba\\xf9\\xfe\\x75\\xbf\\x27\\xff\\xfa\\x92\\x14\\x87\\xcb\\xeb\\xec\\x3a\\xd5\\x3b\\x72\\x9d\\xe1\\xae\\xa4\\xb6\\x5f\\xdf\\xb6\\x3e\\x8d\\xb9\\x9d\\x74\\xfa\\x6b\\x81\\x02\\x99\\x80\\x97\\x9f\\xff\\xe6\\xf6\\x78\\x44\\xae\\xd2\\x05\\x32\\x33\\x0f\\x8d\\x6d\\xa0\\x64\\x99\\x4b\\xd8\\xb1\\xf7\\xc6\\xb7\\xe1\\xa1\\xcd\\xb3\\xa0\\xce\\xa1\\x2b\\x52\\x0b\\xbf\\x0f\\xd1\\x84\\xd1\\xdf\\xab\\x7b\\xc1\\x3a\\xca\\x4d\\x4e\\x35\\x6d\\x6b\\xac\\x9c\\xec\\x4f\\x4a\\x0c\\xa2\\x05\\xb8\\xbf\\x7d\\x71\\x9c\\x43\\xa9\\xc8\\xdb\\x07\\xd9\\x4b\\xbc\\x19\\x6d\\x1c\\x5f\\xeb\\xcc\\x5d\\xd9\\xe1\\xce\\x20\\xdc\\x77\\x7d\\x05\\x82\\x7f\\xec\\xa6\\xd4\\x13\\x22\\xbc\\xca\\x3f\\x26\\xda\\x0a\\x83\\x2f\\x38\\x93\\x4b\\xeb\\xa3\\xed\\x3d\\xf7\\x72\\x54\\xc9\\x1c\\xa3\\x2b\\x8c\\x89\\x60\\xef\\xa5\\xd7\\x60\\xbc\\x3e\\x42\\x94\\x31\\xb6\\xe8\\xe8\\x84\\x59\\xba\\x30\\x55\\x82\\x3b\\x83\\x30\\x71\\x41\\xf5\\x5e\\xa9\\xa4\\xdd\\x15\\xff\\x36\\x08\\x62\\x4b\\xac\\x5f\\x7e\\xf5\\xb7\\x6a\\x1f\\x2c\\xf9\\xda\\x1d\\x96\\x20\\xd5\\x7e\\x65\\x27\\xd7\\xe6\\x3c\\x55\\xe6\\x6a\\xa6\\xa7\\x1a\\x26\\x16\\x7c\\x67\\x7f\\x21\\x5e\\x3b\\xa4\\x21\\x15\\x87\\x20\\xaa\\xc0\\xdb\\x7d\\x84\\xf0\\x5f\\x96\\x2a\\xac\\x15\\xff\\x59\\x50\\xc6\\x1c\\x9d\\xd2\\xa8\\x82\\x0e\\xa7\\x88\\x4e\\xc4\\x15\\x57\\xa4\\x63\\x49\\x56\\x95\\xab\\xf3\\xb8\\xf6\\xe6\\xf3\\xc6\\xf3\\xb6\\xb9\\x70\\xea\\xd4\\xf3\\x25\\x1c\\xbf\\x00\\xba\\x9d\\x70\\x78\\xeb\\xca\\xe1\\xf5\\x3a\\xa7\\x4b\\x27\\xb5\\xcd\\xe6\\x76\\x3b\\xfa\\x78\\x65\\x29\\x91\\x5f\\xa3\\x95\\x3c\\xa3\\x6b\\xe1\\xa7\\xea\\x94\\x79\\x57\\x56\\x23\\x2c\\x11\\x28\\x01\\xe9\\x10\\x8a\\x24\\x35\\x4a\\x81\\x44\\x7a\\xe2\\xe8\\x8b\\xd9\\xad\\xc5\\x54\\x94\\x03\\x9c\\x2f\\x3f\\x7d\\x9a\\xf5\\x49\\x66\\x32\\x7d\\xc7\\xca\\x55\\x14\\xda\\x3d\\xf7\\x6d\\x5f\\xdb\\x75\\xb6\\xff\\xf9\\xd6\\x2b\\x4b\\xfe\\xb2\\x57\\x77\\x51\\x17\\x9b\\x26\\xab\\x6c\\x23\\x31\\xbb\\x4f\\xc8\\x03\\xdc\\x85\\x68\\xd5\\xc6\\x51\\x4b\\xdc\\xa3\\x8b\\x44\\xdd\\x4d\\x45\\xb9\\x54\\x94\\xe2\\xd2\\x4a\\x53\\x87\\xdc\\x0a\\x25\\x79\\xed\\x59\\xcf\\xea\\x2d\\x2d\\xbe\\x57\\xe9\\xa7\\x46\\xa8\\x1d\\x53\\x64\\x6d\\x83\\x2f\\xd3\\xfc\\xaa\\x93\\xdb\\xe6\\xc9\\x0b\\x23\\x71\\xcc\\xc7\\xbd\\xc1\\x02\\x9b\\xe8\\x87\\x7e\\x52\\x9c\\x3f\\xbd\\xf3\\x18\\xdf\\x18\\xb4\\xf4\\xe2\\xb6\\x52\\x31\\x26\\xb7\\xc3\\x59\\x4f\\x64\\xa7\\x01\\x39\\x6d\\x0c\\xf9\\xe1\\xc6\\x73\\xbf\\xc9\\x53\\xef\\xf8\\xac\\x85\\xb5\\xb4\\xf2\\xa6\\x4f\\x11\\x8b\\x6b\\xc4\\x68\\x75\\x7c\\xf5\\xf1\\xfb\\xa1\\xcb\\x24\\x47\\x8b\\xcb\\x7e\\xaf\\x31\\x70\\xb2\\xce\\x07\\xe5\\xb6\\xa7\\xe9\\x64\\x77\\xf8\\x1f\\x84\\xbd\\xdd\\xff\\x3a\\xe8\\x80\\x31\\x69\\xab\\xf3\\x2f\\x61\\xa8\\x29\\xb7\\xa7\\xe6\\x32\\x22\\x1a\\xe9\\xd3\\x75\\x8e\\xf2\\xcc\\x6e\\xfd\\x3b\\x3a\\x38\\x55\\xde\\x8b\\x9e\\xdf\\x33\\xe8\\xf9\\x57\\xa6\\x81\\x10\\xb4\\x17\\x31\\xe2\\x73\\x8b\\xd9\\xbe\\xa3\\xc0\\xb0\\xa8\\x71\\x56\\x71\\x12\\x36\\x0c\\x96\\x34\\x60\\xb1\\xc0\\xb6\\xbf\\x60\\x8c\\x7d\\x7e\\x6c\\xec\\x5e\\x59\\x32\\x74\\x71\\x67\\x42\\x4f\\x6c\\x73\\x24\\x7c\\x8e\\x76\\x11\\x53\\xfd\\xd6\\xd6\\x5b\\xa3\\x3c\\x8d\\x01\\x73\\xfd\\x5d\\x7e\\xa7\\x3a\\xbe\\x64\\x1e\\x54\\x77\\x2c\\x6f\\x3d\\xc2\\xe1\\x34\\x9f\\xca\\xeb\\x66\\x39\\x0d\\xd6\\x02\\x89\\x5d\\x98\\x12\\xa0\\x3c\\xc1\\x59\\x82\\x21\\x03\\x4d\\x73\\x50\\xb6\\xd9\\x7d\\xd1\\xa0\\x6b\\x72\\x9c\\xd1\\xbe\\x9b\\xc6\\x19\\x90\\x1a\\x59\\xe1\\xc4\\xf0\\xa4\\x56\\x86\\xe4\\xa4\\xf2\\x79\\x34\\x22\\xe7\\x4f\\x6d\\x37\\xc2\\xb3\\x1a\\xb2\\x49\\x82\\x2c\\x9d\\x72\\x8b\\x2c\\x39\\xaa\\x2c\\x46\\x07\\x3e\\x5e\\x3a\\x24\\x29\\x2d\\x55\\x90\\xae\\xa8\\xdc\\x2b\\x5a\\x08\\x2b\\x70\\x76\\xae\\x72\\x8f\\x32\\x20\\x95\\x0b\\x68\\x3a\\xd8\\xb5\\x47\\x15\\x85\\x66\\xcc\\xaa\\x2d\\x56\\x1a\\x97\\xe5\\x47\\x1c\\x53\\x68\\x8b\\xbb\\x54\\xfb\\xe4\\x2a\\x5c\\xf3\\x3f\\xaa\\x8f\\xc8\\xb9\\x5b\\xdd\\x94\\xd2\\xe1\\x86\\xcf\\xe0\\xb2\\x58\\x7c\\xfe\\xc6\\x2a\\x77\\x6b\\xe7\\xdc\\xcb\\x6f\\x78\\xc7\\xd3\\xd0\\xac\\xb5\\x15\\xbd\\xb6\\x0f\\x09\\xde\\xde\\x7d\\xb9\\xea\\x0a\\x47\\x99\\x23\\x2c\\x74\\xe0\\x78\\xe4\\x6f\\x47\\xb9\\xd8\\x31\\x8f\\x96\\xd1\\x35\\x02\\x7b\\x47\\xe0\\x05\\x17\\x41\\xf4\\xd6\\x9e\\x87\\xf9\\x3b\\x66\\xb6\\xda\\x31\\xd5\\xff\\x8e\\xb1\\x92\\xe5\\xf1\\x93\\x2e\\x9b\\x6e\\x9b\\x78\\x13\\xf2\\x23\\xd2\\x87\\x23\\xdc\\xf4\\x2a\\xd9\\x3a\\x1e\\x9b\\x67\\xf4\\x8f\\x47\\x47\\xd7\\x68\\x2f\\xc3\\x99\\x75\\x0e\\x42\\xeb\\x24\\x3d\\x3b\\x0e\\x18\\xb5\\x1c\\xb9\\x5d\\xb8\\x0f\\x63\\x81\\x46\\x86\\xcb\\xfa\\xda\\x86\\x3a\\xfd\\x4e\\xbd\\xd9\\x6b\\xb9\\x4e\\x0d\\x81\\x52\\x2a\\x16\\x3b\\xad\\x12\\x87\\xb0\\xb5\\xbe\\xd7\\x86\\x1d\\x8d\\x86\\xdd\\x5a\\x7d\\xb9\\xff\\x4b\\xad\\x7e\\x97\\x78\\xcc\\xae\\x2f\\xf3\\xe3\\xae\\xce\\xbe\\x47\\x0a\\xb8\\xa6\\x0e\\xc6\\x5f\\x61\\x4d\\xa3\\xe0\\x86\\x21\\x5b\\x7b\\x37\\x82\\xea\\xb6\\xa5\\x0c\\x7b\\x7b\\x24\\xc2\\xe2\\x36\\xb5\\xd3\\xc5\\xcd\\xa8\\xbc\\xf7\\x32\\x57\\x56\\x32\\xd7\\xd6\\xaf\\x55\\xa1\\xfc\\x6b\\x8c\\xf8\\x6f\\xee\\x01\\x72\\xa9\\x27\\x2b\\xbe\\x55\\x39\\x32\\x2b\\x4d\\xdc\\xfc\\x20\\x3c\\xc7\\x2e\\xd5\\x56\\xa9\\x97\\xd5\\x3b\\xf0\\x31\\xb2\\x02\\x38\\xcd\\xf7\\xf4\\x85\\x85\\xfe\\x4d\\x02\\x85\\x92\\x6e\\x09\\x10\\x81\\x28\\xfa\\xf9\\x63\\x9c\\xc7\\x89\\xcb\\xe4\\x85\\x1d\\x2b\\x9a\\x7a\\xb6\\xfd\\xb6\\x79\\x56\\xac\\xd9\\xe9\\xf4\\x70\\x62\\x51\\x7d\\xb3\\xd7\\x42\\x0a\\x99\\x05\\x1d\\xfa\\xc9\\xe2\\x72\\x85\\xa5\\x9f\\x8a\\x54\\x65\\x73\\xde\\x33\\xfd\\x69\\x18\\x7a\\x8d\\x5e\\x8f\\x79\\xbf\\x16\\xc5\\x64\\x82\\x43\\xfb\\xa9\\xa0\\xaf\\x63\\x4b\\xd4\\x5b\\x31\\xd6\\xc1\\xb1\\x56\\xff\\x8f\\x7e\\x85\\x94\\x63\\x29\\x8f\\x3f\\xf5\\x9d\\x01\\x73\\x49\\x6b\\x3d\\xa5\\xea\\xc3\\x8e\\xaa\\x62\\xe2\\xaa\\x48\\x37\\x19\\xce\\xb8\\xef\\x53\\x38\\x38\\x2a\\x66\\xbe\\xa7\\xb9\\x71\\xe3\\x9d\\x54\\x61\\x3d\\x4a\\xc6\\x52\\x45\\x31\\x7f\\x59\\xed\\x0b\\x9a\\xea\\x2e\\x1c\\x1a\\xd9\\xc9\\xdb\\x6d\\xed\\x68\\xcb\\x18\\xc1\\x8e\\x8e\\x68\\x67\\xc7\\x68\\x8d\\x56\\x02\\x8b\\xb7\\x45\\xc2\\x91\\xf4\\xeb\\xf2\\x03\\x54\\x4c\\x44\\xf2\\x9d\\x4a\\x88\\x2a\\x30\\xf5\\x6b\\x90\\xae\\x39\\x6c\\x4d\\xef\\x1f\\x35\\xf8\\x88\\xb3\\xc9\\x3c\\xe2\\x97\\x1e\\x22\\x9f\\xdb\\x73\\x9b\\x2d\\xbc\\xf2\\x25\\xf2\\x3a\\x77\\x63\\x9a\\x26\\x70\\x8b\\x0f\\x4d\\x67\\x70\\xea\\xef\\x26\\x1b\\x1c\\x1d\\x0a\\x29\\x42\\xd1\\xb5\\xe8\\x84\\x38\\x92\\x50\\xda\\xcb\\xc9\\x66\\x45\\x17\\xb1\\xc1\\x51\\x0c\\x25\\x2c\\x59\\x65\\x53\\xbb\\x05\\xcf\\xa1\\xfc\\x72\\x1e\\x20\\xdd\\x46\\xdf\\xc0\\xc2\\x07\\x64\\x1e\\xd7\\xe6\\x3d\\x31\\x10\\xfe\\x3a\\x46\\xbe\\x60\\x20\\x08\\x47\\xa4\\x95\\xa1\\xfd\\x93\\x2a\\x33\\xd4\\xf9\\x43\\x13\\x33\\x97\\x6b\\x58\\x42\\x99\\x7a\\xb4\\x57\\x40\\xc4\\x7c\\xa0\\xab\\x34\\x10\\xa3\\x41\\x5f\\x44\\xa6\\x52\\x12\\x97\\x99\\x03\\x73\\x75\\x84\\xe2\\x1c\\xaf\\x16\\x82\\x3e\\x92\\x6c\\xd8\\xd8\\xe6\\x76\\xcf\\x26\\x83\\x73\\x26\\xda\\x0e\\x7a\\xed\\x53\\x5b\\xea\\xab\\xf5\\x47\\xd4\\x31\\x10\\x60\\xd4\\xb6\\x37\\x7b\\x4c\\x40\\x12\\xef\\xc2\\x74\\xa0\\xf4\\x60\\x36\\x24\\x63\\xa8\\xeb\\x0f\\x97\\xd2\\x2f\\x78\\x44\\x8a\\x53\\x0e\\xcd\\x81\\x78\\xbd\\xda\\x6f\\x34\\x90\\xf8\\x26\\xf9\\x4c\\xb4\\xf9\\x96\\xd7\\x68\\x50\\x11\\xc0\\x58\\x27\\xe6\\xf0\\x43\\xc0\\x33\\x59\\xfb\\x0b\\x87\\x62\\xb5\\x34\\xf2\\x79\\x8d\\xfa\\xa1\\x78\\x26\\x4a\\xce\\xae\\xbd\\x6f\\xcb\\xf9\\xc4\\xdc\\x3a\\xd4\\x86\\x86\\x2e\\x4c\\xe0\\x37\\x16\\xce\\xde\\xf5\\xf1\\xc9\\xe3\\x83\\xcc\\xac\\xbb\\x56\\xe1\\xaf\\x40\\xd5\\x39\\xbc\\x6c\\x8c\\xe5\\x37\\x07\\x54\\x5c\\xc6\\x0a\\x1f\\x14\\x79\\x29\\x43\\x27\\x96\\xf0\\x9f\\x03\\x57\\x1e\\xb5\\xab\\xc8\\xec\\xc9\\xc6\\xbe\\x54\\x9b\\x09\\x8c\\x27\\x85\\xc1\\xbf\\x67\\x33\\xfb\\x9f\\xb3\\x20\\xe2\\xfd\\xfe\\x11\\xd8\\xe4\\x5b\\xed\\x8a\\xe1\\xe2\\x66\\xa1\\x0f\\xd3\\x71\\x59\\xe8\\xb4\\x5c\\x6d\\xe5\\x7b\\xce\\x30\\xf5\\x23\\x3d\\xa8\\x27\\xd8\\x60\\x4c\\x7a\\xd4\\xad\\x93\\x57\\x53\\xc6\\x57\\xe2\\x4f\\x08\\xf2\\xc4\\xe5\\xa1\\x6f\\xd7\\x9a\\xda\\x21\\x11\\x7a\\xaa\\x68\\x0e\\x98\\xcd\\xe1\\xe4\\x69\\x55\\x32\\x9f\\x99\\x44\\xdc\\x58\\xe7\\xaa\\xb2\\xb7\\xe8\\x64\\xd6\\xfd\\x31\\x0e\\x4c\\xb4\\x98\\x1e\\x73\\x6c\\xce\\x48\\x0a\\x72\\xae\\x8f\\xae\\x1c\\x23\\xb6\\xd0\\xaa\\xf4\\x32\\x9e\\x48\\xa1\\xc8\\x69\\x35\\x3b\\x4f\\x42\\x21\\x10\\xf0\\xea\\xbf\\x55\\x21\\x97\\xe7\\x96\\xcf\\x2f\\xb1\\xf5\\xff\\xb8\\x9d\\x2a\\xd1\\xbd\\x5f\\x35\\x59\\x91\\xe5\\xdf\\x0b\\x1d\\x2b\\x91\\xd5\\x6d\\xb4\\xfc\\x59\\x6d\\x43\\xdc\\x26\\xbf\\x49\\xcb\\x3f\\x69\\xf7\\x0b\\xba\\x27\\x2d\\x57\\x28\\x7d\\x97\\x01\\xa1\\x07\\xf4\\x05\\x97\\x5e\\x15\\xd0\\x35\\xe4\\xd9\\x15\\xa7\\x2f\\xc4\\x71\\x5a\\xf2\\xfe\\xb8\\xb0\\x00\\x03\\x9b\\x21\\x7a\\x45\\x3e\\x78\\x47\\x70\\xe2\\x70\\xe1\\x87\\x90\\x80\\xe7\\xcc\\x22\\xf5\\x36\\xb9\\xbe\\xae\\x4a\\x74\\x82\\xde\\x9b\\xe4\\x42\\xa1\\x18\\x58\\xaa\\x75\\x6b\\xca\\xd8\\xfb\\x6d\\x7f\\xf7\\xb9\\x84\\x67\\x94\\x8f\\x77\\x7c\\xe1\\x87\\xf6\\xdc\\x07\\xb4\\x5d\\x5e\\xf8\\x7e\\x31\\xa4\\xd3\\x90\\xd6\\xaa\\xc4\\x1f\\x45\\xa5\\x55\\xdc\\xba\\x1a\\x36\\xb3\\x26\\xae\\x4c\\x21\\xf3\\x25\\x68\\x5f\\x5e\\x0d\\x4c\\x55\\xd6\\x08\\x44\\xc2\\x6f\\x06\\xca\\x8d\\x66\\x05\\x62\\x12\\x53\\xbc\\x6c\\xf6\\xa8\\x19\\xd0\\xc2\\xe8\\x58\\x5d\\xc8\\x29\\x8b\\x12\\xb8\\xdf\\xa4\\xc3\\x1e\\xed\\x57\\x1b\\x69\\xf9\\xef\\x0b\\x82\\xb6\\xef\\x87\\x83\\xa1\\x1c\\x4e\\x10\\x0c\\x7c\\xe5\\xdc\\x75\\x78\\x7d\\x49\\x9e\\x29\\xd6\\x42\\xe3\\xa7\\x84\\x9b\\xed\\xbb\\x0e\\xe7\\x65\\x1c\\xf2\\x54\\x61\\x19\\x3b\\x08\\x77\\x53\\xb3\\xa0\\x3f\\x8a\\xfe\\xb9\\x17\\x84\\x70\\x9c\\xec\\xe9\\x91\\x97\\xfd\\xf4\\x60\\x4f\\xe9\\xc7\\xf0\\xaa\\x8d\\x61\\xd6\\xfa\\x27\\x3e\\x1b\\x25\\xcd\\x13\\x68\\xe0\\x6e\\x79\\x63\\x74\\xac\\xa2\\x8f\\xec\\x43\\x99\\x3d\\xf9\\xbc\\x6f\\xf1\\x4a\\x14\\xdc\\x74\\xe7\\x6e\\x39\\xaa\\x41\\x50\\xbf\\x9e\\x79\\x05\\x8c\\x88\\xa0\\xc1\\xc6\\x99\\xaf\\x9d\\xf7\\x1a\\x06\\x8a\\xd7\\xc7\\x0a\\x0f\\xcb\\x4b\\xd6\\x2e\\x88\\x9c\\x23\\x0e\\x4a\\x10\\x8c\\x8c\\x20\\xe8\\x55\\xc4\\x23\\xa7\\xe5\\xc5\\xbb\\x16\\xc9\\x91\\xd6\\x83\\xdf\\xb8\\xe0\\x9f\\x74\\x5c\\x15\\x52\\x58\\x91\\x7e\\x8e\\xd9\\x27\\xda\\xf6\\xc2\\xba\\x9a\\xc8\\x56\\xc9\\x58\\xfa\\x01\\x0c\\xb7\\x2f\\x7b\\x0f\\xbf\\x70\\x22\\xad\\xbc\\x2e\\x1b\\x51\\xd4\\x60\\x3e\\xf8\\x90\\x42\\xd6\\xf4\\x6e\\xfc\\x17\\xbb\\x6f\\x55\\x19\\xbe\\x9c\\xec\\x74\\x71\\x2d\\x2d\\xf1\\xab\\x5a\\x2d\\x48\\xe2\\x84\\xa4\\x1e\\x4b\\xe3\\x96\\x1e\\x8c\\x2c\\xcf\\x17\\x60\\x4b\\x4c\\x38\\x03\\x4b\\x94\\x95\\xde\\xeb\\x1c\\xb5\\xe4\\xec\\x48\\xc6\\x0d\\x44\\x58\\x5e\\xd3\\xcc\\x95\\x13\\xb9\\xc2\\x96\\x62\\x41\\x05\\xf6\\xf5\\x1e\\x42\\x2e\\x34\\x71\\xb9\\x35\\x27\\x5e\\xbe\\x10\\x6f\\x66\\xdf\\x0a\\x3d\\x9f\\xf6\\xfe\\x68\\xda\\xb8\\xa4\\x9a\\xc2\\x77\\xf2\\x2b\\x1b\\x90\\x7c\\x41\\xbd\\xc1\\xfa\\xb0\\x1e\\x07\\xa9\\x8f\\x60\\x99\\x0f\\x6e\\x81\\x2f\\x63\\x43\\x6b\\x27\\x6d\\xdb\\x0e\\xa6\\xaf\\x38\\xb8\\x5a\\x06\\x9b\\xba\\x87\\xec\\x7a\\xf8\\xfc\\xde\\x62\\x4c\\x0f\\x2a\\xfa\\xa9\\x4e\\xf0\\xdd\\x1d\\xb7\\x6d\\x2e\\x32\\x5f\\x7a\\x75\\x1e\\x41\\x5f\\x85\\xfd\\x7c\\xf6\\x97\\xa7\\x56\\x84\\x79\\xc2\\x5e\\x71\\x5e\\x35\\x26\\xbb\\x99\\x38\\x1f\\x27\\x33\\xf9\\x68\\xb2\\x1a\\x2b\\x5e\\xff\\x19\\x2a\\xeb\\x1f\\x71\\x7b\\xfd\\x25\\x55\\x21\\x99\\xd0\\x5b\\x9b\\xf8\\x6c\\x5e\\x8b\\x75\\x26\\x04\\x31\\x1c\\x34\\xc8\\xae\\xc7\\x64\\x05\\xb7\\xf6\\x84\\x14\\x89\\x69\\x6f\\x0b\\xd3\\xc7\\xca\\xb1\\xd4\\x1c\\x8e\\xae\\x99\\x70\\x38\\x15\\x4c\\x7c\\x1e\\x2d\\x7f\\xeb\\xe7\\x92\\x7d\\x8d\\xf7\\xe7\\xfb\\x2f\\x9e\\x65\\x18\\x4b\\x3a\\x68\\x86\\x6d\\x28\\x69\\x2b\\xe7\\x11\\x79\\xc1\\x96\\x35\\x38\\x58\\x55\\xd1\\x20\\xd2\\x76\\x4b\\xe8\\x87\\x3c\\x15\\x85\\xef\\x05\\xd8\\xfc\\x64\\x8a\\x25\\x1b\\x03\\x3e\\xe0\\x5b\\x93\\xd5\\xd6\\xe7\\x70\\xaa\\xb5\\xd6\\x8a\\x17\\xab\\x58\\xa3\\xe5\\xb0\\xc7\\x16\\xee\\x30\\xda\\xf7\\xa6\\x9f\\x2d\\x10\\xea\\x79\\x65\\x5b\\x6f\\x99\\xb5\\xdd\\x54\\x11\\x17\\xaa\\xbc\\x1f\\x6f\\xb5\\x5a\\xb7\\x46\\xb6\\xea\\xae\\x6d\\x6b\\xb4\\x84\\xbf\\x5b\\x6e\\x08\\xf3\\x1d\\xd0\\xfc\\xc3\\xac\\x8e\\x8f\\x86\\x26\\x5a\\xcd\\x12\\xd7\\x06\\x24\\x73\\xfe\\xa9\\x47\\xb5\\x4d\\x17\\x18\\x66\\xe9\\x27\\x6c\\x35\\x70\\x57\\xab\\x58\\x9d\\x97\\x22\\xba\\x37\\x8d\\x26\\x04\\x89\\xd2\\xeb\\x91\\x1e\\xa2\\x05\\x71\\x67\\x12\\x10\\x81\\x37\\x6b\\x13\\x04\\x47\\x2c\\xed\\x07\\x92\\x07\\x6c\\x58\\x67\\x35\\x76\\xd3\\x1a\\x81\\x11\\xd4\\xb9\\xf7\\x5b\\x27\\x1c\\x7d\\x85\\x60\\xf8\\xfb\\xad\\x15\\x91\\xfd\\x4d\\x4b\\xf6\\x39\\xfe\\xba\\x71\\x79\\x09\\x46\\x78\\x0a\\x30\\x7b\\x32\\xb8\\x73\\x63\\x08\\x71\\x3b\\xe0\\x2d\\x3f\\xe7\\xae\\xe6\\x61\\x88\\xdd\\x31\\x94\\xbd\\xf7\\xd4\\x4e\\x6f\\xe0\\x13\\xc2\\x5d\\x36\\xcc\\x68\\x20\\x54\\x46\\x2b\\x56\\xcf\\xa8\\x42\\xc3\\xcd\\xa4\\xe0\\x1c\\xa3\\x19\\x0e\\x8c\\xbe\\xe1\\xd2\\xe7\\xff\\xaa\\xfb\\xa7\\x62\\x8b\\xa7\\x2c\\x5b\\x22\\x61\\xbb\\x99\\xab\\xf8\\x27\\x02\\x92\\x02\\x69\\x9f\\x96\\x03\\x6f\\x3a\\xec\\x73\\xa3\\x93\\x3a\\x17\\xf8\\x11\\x8f\\x63\\xa5\\xca\\x27\\xa9\\x8e\\x7d\\xc3\\xac\\xb7\\x95\\x12\\x68\\x08\\x51\\xc6\\x1d\\x9c\\xdd\\xe1\\x6e\\x7d\\x8d\\xef\\x36\\xe4\\xc6\\x51\\x9d\\xc5\\x2e\\x5b\\x41\\x53\\x75\\xba\\x8c\\x0c\\x21\\x63\\xa1\\xef\\xbd\\xd9\\xab\\xf9\\x78\\x81\\x34\\x82\\x54\\xbe\\xdd\\x83\\x39\\x4b\\x84\\xcd\\xe9\\xc8\\x82\\x33\\x90\\x9e\\x7b\\xcf\\x63\\xdc\\x97\\x3c\\x1c\\x4c\\x57\\xec\\x8d\\x9e\\xbe\\xb5\\x9e\\x4f\\xed\\x94\\xa2\\xda\\x74\\x39\\x97\\x29\\x2d\\xd3\\xb0\\xb4\\x06\\xe6\\x5b\\x82\\x19\\x01\\x67\\xe5\\xff\\x22\\x7b\\xe7\\x83\\xb4\\xaa\\xe5\\xf5\\xbd\\x37\\xbb\\x90\\x16\\xae\\xcc\\x3b\\x56\\xea\\x9b\\xbf\\x81\\x72\\x6d\\x2b\\xf6\\x81\\x4a\\xea\\xef\\x00\\xbb\\x8d\\x7d\\x4b\\x54\\x0f\\xcc\\xcf\\x21\\x77\\xc3\\x14\\x45\\x09\\x74\\xe1\\xe6\\x28\\xee\\xf9\\x5e\\x24\\xef\\xd3\\xa2\\x4f\\x42\\x70\\x2d\\xff\\xd7\\x79\\x19\\xab\\xd6\\x6a\\xa0\\xf5\\xc3\\x56\\x7f\\xa0\\x39\\xce\\x11\\x6a\\xde\\x91\\xaa\\x4e\\x35\\xf4\\x3c\\xd2\\x92\\xf6\\x90\\xb5\\xb2\\x74\\x5e\\x56\\xba\\xa9\\xcf\\xdc\\xdc\\x25\\x24\\x6a\\xc6\\x6e\\x94\\xb1\\x46\\x96\\x7a\\x98\\x5b\\x21\\x23\\xf9\\xda\\x8e\\xbd\\xf9\\x84\\x23\\x5f\\xd1\\x46\\x5d\\xd8\\x88\\xe2\\xaa\\x56\\x62\\x2e\\x94\\x28\\xb1\\xa5\\x6e\\x41\\x13\\xc0\\xb4\\xfe\\x27\\x82\\xcf\\xdb\\x3c\\x2c\\x4b\\x3f\\xe9\\xa8\\x85\\x2d\\x61\\xde\\x5a\\x75\\x99\\xe0\\x78\\x8b\\xad\\x12\\x2f\\xf0\\xd9\\x48\\xa5\\x32\\x43\\x29\\xae\\x3a\\x79\\xbe\\x55\\xa5\\xe3\\xe7\\xd7\\x72\\x85\\x64\\x15\\x7a\\x91\\xdd\\x6a\\xbd\\x34\\x28\\x25\\x93\\x7a\\xd5\\x23\\x61\\xf9\\x4d\\x5d\\x9d\\x8d\\x55\\xf5\\xf1\\x64\\x2b\\x92\\x19\\x0f\\xd1\\xfa\\x9c\\xa9\\xb2\\xa6\\x37\\x7e\\xf3\\x4c\\xb8\\x33\\x41\\x54\\xdc\\xa5\\xac\\x81\\xec\\xf0\\xb6\\x1d\\x55\\x80\\x00\\xf3\\xe9\\x6f\\xfb\\xbc\\x5f\\x71\\xe7\\xb1\\x02\\x7c\\x23\\x29\\x59\\x8a\\xca\\x6f\\xd3\\x5a\\x62\\x47\\x9b\\xa0\\xd1\\x3a\\x7d\\x2d\\x23\\x5c\\xaa\\x3c\\xcc\\xa3\\x7b\\x5c\\x45\\xa8\\x02\\xff\\x03\\x98\\x5c\\x08\\x54\\x1a\\xd1\\x39\\x9a\\xaf\\x39\\xef\\x1c\\x4c\\x00\\x8e\\xaa\\x3f\\x1f\\xc2\\xc2\\xe7\\xa1\\xe0\\x3a\\x4f\\xac\\x51\\x03\\x4b\\xf2\\xd1\\xe5\\xb3\\x7c\\xe6\\x41\\x2c\\x67\\xae\\xae\\x9d\\x1c\\x11\\xd5\\xf8\\xfb\\x32\\x8f\\x48\\x8d\\x09\\xdf\\xd0\\xab\\xa1\\x84\\xc1\\xa4\\xcd\\x37\\x95\\x30\\x5e\\xef\\x05\\xb1\\x82\\x52\\x6d\\xb4\\x05\\xea\\xdf\\x12\\x3e\\xe6\\xec\\xbf\\xd4\\x8d\\xe8\\x49\\x27\\xad\\xab\\x62\\xfd\\xe7\\x2e\\x00\\x15\\x31\\xcd\\x64\\x25\\xa8\\xfe\\xe2\\xb6\\xdc\\xda\\xfc\\xc4\\x11\\x73\\x02\\x67\\x29\\xb4\\x80\\xc6\\x48\\xb8\\x3b\\x49\\xb2\\x5e\\x35\\x54\\x3a\\xa8\\x56\\x56\\xcc\\x23\\xa9\\xca\\x2f\\x45\\xf6\\x78\\xb7\\xbb\\x5d\\x59\\xee\\x98\\xac\\x2b\\x7e\\xe4\\xba\\xe6\\x06\\xe4\\xb8\\xe0\\xb9\\x28\\x59\\x9b\\xc2\\xa7\\xae\\xd1\\xc4\\x2f\\xfa\\x6b\\xb1\\x62\\x14\\xf3\\xd6\\x6f\\xe6\\x26\\xf5\\xdd\\xd7\\xef\\x93\\xd5\\xff\\xfc\\xde\\x5a\\x5c\\x83\\xb7\\x4b\\xba\\x72\\xfa\\x7c\\xe6\\x53\\x82\\xb2\\x05\\xe9\\x98\\x4e\\x6f\\xb2\\xfa\\x77\\x4f\\xd2\\xca\\xf7\\x19\\xa7\\xfa\\x4b\\xd9\\x2f\\xfe\\x3f\\x00\\x92\\x20\\x6d\\xdf\\xc4\\xc8\\x7e\\x76\\x68\\x1b\\xa6\\xa8\\xc8\\x32\\x7a\\x87\\x0f\\x6c\\xe0\\xa5\\xf0\\x66\\x0b\\x31\\x53\\x60\\x6d\\xbd\\x72\\xe6\\xba\\x46\\x1c\\x61\\x5d\\xae\\xbf\\xb9\\xae\\x8e\\xab\\x41\\x75\\x95\\xb1\\x9a\\xd6\\x69\\xa6\\xa2\\x32\\x96\\x23\\x67\\x9b\\xbe\\xb4\\xb9\\x9e\\xa3\\x60\\x3d\\x01\\x32\\xfe\\x48\\x1d\\xd5\\xc1\\x23\\x2d\\x26\\x74\\x38\\x24\\x99\\xba\\x29\\x13\\x51\\xe7\\x9a\\x6a\\xa9\\x6d\\x71\\x86\\x4a\\x32\\x66\\x01\\x2c\\x03\\x39\\xcc\\xa5\\xf0\\xea\\x23\\x62\\x0b\\x45\\xb1\\xbb\\x4d\\x14\\x1f\\x76\\xa9\\x38\\x37\\x24\\x8b\\x0d\\x99\\x51\\xf0\\x4f\\xb5\\x2c\\x05\\x47\\x89\\x98\\x32\\xba\\xad\\x4f\\x3d\\x63\\xf9\\x3c\\x3b\\x91\\xb9\\xfa\\x95\\x2c\\x53\\xd1\\xb6\\xf4\\x41\\x46\\xca\\x82\\x08\\x07\\x9f\\x07\\x67\\xf7\\x19\\xd8\\x67\\x89\\xd8\\xd0\\xd3\\xb5\\xa0\\xdf\\x26\\xb3\\xac\\x1c\\x6c\\xaa\\x9d\\xd5\\x6b\\xd8\\xb0\\xf8\\x26\\xae\\x39\\x50\\x48\\xa2\\x70\\x90\\x04\\x86\\x33\\x91\\x59\\x45\\xe0\\xad\\xf7\\x61\\x44\\xd4\\x97\\x96\\x32\\xf2\\xf9\\xf3\\x6b\\xa3\\x17\\x59\\x20\\xd7\\xc3\\xaf\\x6b\\xbb\\xba\\x36\\x31\\xaf\\xad\\x92\\x38\\x2b\\x09\\x6c\\xbb\\x36\\x6d\\x8b\\xa8\\xe0\\xb5\\xaf\\xe7\\x24\\xf1\\x15\\x96\\x7a\\x32\\x62\\x48\\x5f\\x1e\\xd6\\xbe\\x03\\x7e\\xdd\\x06\\x34\\x61\\x03\\x8d\\xd1\\xdd\\xa8\\xd8\\x71\\x08\\x46\\x49\\xaa\\x9d\\x95\\xa4\\xb2\\x86\\x7e\\x97\\x1d\\x78\\x5f\\x94\\x05\\x1b\\x4a\\x05\\x58\\x78\\xda\\xf8\\x80\\x1b\\x0c\\x34\\x37\\xd6\\x0e\\xb7\\x30\\xb6\\xf4\\xcf\\x9d\\xe6\\x3d\\xc4\\x83\\x0f\\xc2\\x3d\\xee\\x87\\xbd\\x15\\x99\\x96\\x1d\\x6a\\xcc\\x3f\\xb3\\x70\\x28\\x54\\x5b\\x42\\xa3\\x56\\x4c\\x47\\xb2\\xf6\\x5a\\x89\\x29\\x9d\\x66\\xd1\\x2a\\xa1\\x4e\\x55\\x98\\x4e\\x15\\x41\\x91\\xda\\xd8\\x09\\x50\\xb7\\x46\\x17\\xb8\\x88\\xaa\\x11\\xee\\x8d\\xaf\\xe3\\xa9\\xa3\\x90\\x96\\x46\\x00\\x36\\xd8\\x94\\x3f\\x9f\\xc2\\x1b\\xe3\\x11\\xc3\\x5f\\x21\\xd0\\xd5\\x41\\x90\\xf5\\x18\\x33\\x98\\x61\\xd4\\x57\\x7a\\xcc\\xee\\xa4\\x30\\x50\\x15\\x05\\x45\\x06\\xbe\\x75\\x2e\\xac\\xc2\\x82\\x93\\x25\\x58\\x00\\xc1\\xc5\\x02\\x97\\x1e\\x36\\x6a\\x34\\xe9\\x71\\xb1\\x2c\\x29\\x36\\x3f\\xb8\\x58\\x8a\\xd4\\x85\\x4e\\xa5\\x87\\xf9\\xd4\\x66\\x31\\x26\\x31\\x4a\\xb9\\xf8\\xa8\\x83\\x6e\\x54\\xa1\\xe9\\x61\\x07\\xe8\\xab\\x14\\x6e\\x68\\x9b\\x78\\xa0\\xbb\\x68\\x29\\x1f\\x7a\\xf0\\xcb\\x2f\\xc2\\x65\\x0f\\x09\\x2b\\xd2\\x93\\x0f\\x84\\xcb\\xf4\\x49\\x6c\\xf8\\x81\\xbe\\xfa\\x21\\x83\\x5f\\x2d\\x51\\xb0\\xcf\\x9c\\x00\\xc5\\xdd\\x9d\\xba\\x91\\xd5\\x9c\\x98\\xe6\\x03\\xab\\x2c\\xcf\\x97\\x03\\x98\\xc9\\x32\\xac\\xb2\\x74\\x7b\\xb2\\x5a\\x88\\xe3\\x53\\xcd\\x70\\x71\\x2c\\x55\\xc8\\x8f\\xda\\xfa\\x96\\x9b\\x43\\x88\\x52\\x63\\x14\\x2e\\xb0\\xbb\\x99\\x35\\x47\\x23\\xad\\x90\\x05\\x93\\x81\\x46\\x31\\x06\\x90\\x95\\xd3\\x88\\xf9\\x72\\x4d\\xb4\\x35\\x66\\xb6\\x36\\xab\\x39\\x8a\\x5a\\xd8\\xa8\\xe6\\xb1\\x5a\\xc8\\x2c\\x1f\\xd3\\xe7\\xed\\xdb\\x9d\\xc5\\x2e\\x2c\\xb6\\x76\\x2d\\xd0\\x63\\x3b\\x58\\x6b\\xed\\x5b\\xa2\\xdb\\x99\\x6b\\x68\\xaf\\xb2\\xfe\\x68\\xe0\\x05\\x37\\xf1\\x91\\x22\\x72\\x8c\\xb1\\x9b\\x21\\x73\\x37\\xf3\\xc1\\x96\\xf1\\xc5\\xcc\\xe1\\x08\\x6d\\xcd\\x28\\x6c\\x8f\\x70\\x0e\\x82\\x1f\\x97\\xce\\x8c\\xae\\x1c\\x25\\x25\\x79\\x9d\\x3e\\x85\\x13\\x73\\xfb\\x86\\x69\\xd6\\xdf\\x24\\x1e\\xbe\\x6b\\xfa\\x77\\xc6\\xae\\x9f\\x1d\\xae\\x75\\xda\\xf2\\x06\\x3a\\x32\\xfd\\xda\\xf7\\x4f\\x9b\\x30\\x34\\x30\\x7a\\x2c\\xc2\\x7a\\xb6\\x2e\\xba\\xbc\\xa3\\x5d\\x55\\xfc\\x16\\x1b\\xb1\\xab\\x94\\xe4\\xcc\\xcb\\x67\\x99\\x12\\x9b\\xa2\\x15\\x14\\x1e\\xb1\\xe3\\x9b\\x89\\x81\\xc3\\xb4\\x7d\\xdf\\xc3\\xa5\\xc3\\x91\\xba\\xbf\\x85\\xd7\\x4c\\x3d\\x62\\xc2\\x70\\x1c\\xc0\\x10\\x22\\xa5\\x64\\xac\\x01\\x43\\xae\\x09\\x43\\xd4\\xc9\\x63\\x31\\x00\\x43\\x18\\x39\\x88\\xd7\\x86\\x23\\x0c\\x18\\x6c\\x09\\xa7\\x37\\x21\\x5f\\x79\\x48\\xf2\\x2a\\x01\\x67\\x88\\x01\\xc3\\x0d\\xa6\\xce\\xbb\\x91\\x16\\x34\\x87\\xdf\\x91\\x1f\\x4d\\x19\\xa4\\x1d\\x76\\x53\\x24\\x2e\\x9d\\x0e\\xd8\\xba\\xde\\x97\\xf5\\x00\\x53\\x94\\xc4\\xc8\\x7a\\x03\\xa6\\x32\\x13\\xa6\\x1e\\x40\\x5b\\x91\\x18\\x86\\xdf\\x9a\\x0b\\x02\\x11\\x9b\\x31\\x92\\xb7\\xc6\\x9c\\x33\\xdb\\xec\\x29\\x26\\xc0\\x4b\\x46\\x8a\\xb4\\xd8\\xab\\x55\\x72\\x88\\x9b\\xb3\\x6d\\x95\\x70\\x3e\\xcc\\xcf\\x87\\x63\\x86\\x15\\xcd\\x2a\\x53\\xc2\\x51\\xc5\\xf7\\x90\\xa4\\x38\\x23\\xac\\xdc\\x15\\x2c\\x2d\\x09\\x58\\x28\\xca\\x26\\xcc\\x7a\\x1a\\x3b\\xa1\\xa1\\x0b\\x56\\x3a\\x02\\x46\\xbe\\xee\\xc0\\x5c\\x73\\x0e\\x8b\\x98\\xde\\x99\\xae\\x91\\x9e\\x89\\x1d\\x29\\x83\\xef\\xb0\\x92\\xba\\x04\\x67\\x53\\x39\\xd3\\x6d\\x54\\xac\\xa5\\x1b\\xb0\\xe3\\x89\\xa9\\x45\\x09\\x2d\\x0b\\x24\\x79\\x34\\x6e\\xba\\x0f\\x3e\\xc4\\x8c\\x8f\\x20\\xba\\x14\\xb3\\xa5\\x8a\\xa1\\xa5\\xc4\\x96\\x0d\\x27\\x8b\\xe0\\x64\\x51\\x4c\\x2b\\x51\\xb8\\xf7\\x50\\x04\\x1e\\x6e\\xb3\\xe4\\x0c\\xe6\\x75\\xc9\\x95\\x28\\xef\\xdb\\x01\\x8c\\x4a\\xba\\x13\\xd0\\x1f\\x53\\xc7\\x0b\\x26\\x9c\\x54\\xa3\\x8e\\x2e\\x61\\x75\\x83\\xa7\\x74\\x30\\x83\\xb4\\xff\\x64\\xba\\x82\\x92\\x81\\xe4\\x55\\xf1\\x77\\xe9\\x72\\x90\\xb7\\xc4\\x6f\\xa7\\x0d\\x76\\x0c\\xed\\x59\\xed\\x60\\xb8\\xd6\\xeb\\xbb\\xef\\xa3\\x31\\x5a\\x73\\x9f\\xbe\\x9b\\xd6\\xdf\\xa7\\xbf\\xa6\\xff\\x87\\x9e\\x44\\xfb\\xd2\\xbe\\x77\\xe8\\x2f\\xd2\\x5e\\x77\\xe8\\xcf\\xe9\\xcf\\xdd\\x81\\xdf\\xe1\\x74\\xb4\\xcd\\x12\\xb1\\x7c\\x47\\x72\\x48\\x19\\xa9\\x25\\xf3\\x8d\\xc9\\x04\\xdd\\x4c\\x4c\\x15\\x23\\x6f\\xc4\\xd3\\xbd\\xfc\\xb9\\x2c\\x83\\x8a\\xac\\xae\\x25\\x70\\x32\\x01\\xe1\\x53\\x06\\x7b\\x80\\x78\\x0a\\x28\\x85\\xe5\\xcc\\x71\\xe2\\x95\\x83\\xdd\\x70\\x3e\\x41\\x20\\x0c\\x6c\\x53\\x0c\\x6c\\x5f\\xcb\\x3c\\x29\\xcd\\xea\\x68\\xcc\\x18\\x3f\\xc8\\x2d\\x6e\\x7c\\x83\\xc5\\x48\\x25\\x0d\\xac\\x74\\xa4\\x90\\x52\\x5e\\xa8\\xe7\\x37\\xfa\\x56\\xea\\xca\\x63\\x5c\\x1c\\xcc\\xd7\\x46\\x4c\\xbc\\x62\\xfd\\xd8\\xc9\\x88\\xba\\xb1\\x9b\\xfa\\x8d\\xbb\\x62\\xed\\xa2\\x55\\xb4\\xa4\\xb0\\x40\\xa6\\x6f\\x76\\x5f\\x39\\xe4\\x9a\\x3b\\xae\\x8f\\x4e\\x88\\x5d\\x7b\\x8f\\xc7\\x29\\x9b\\x38\\xac\\xaf\\xd9\\xf8\\xd1\\xc4\\x8f\\xcf\\xe5\\x68\\x2c\\x2a\\xbc\\xf8\\xa5\\x89\\xad\\xd7\\x8f\\x58\\xd7\\x83\\x8a\\x25\\xd5\\xf1\\x77\\xb7\\xb7\\x6e\\x09\\x85\\x11\\xa3\\xd5\\x93\\x0a\\xd1\\x67\\x61\\x7d\\xea\\x40\\x33\\x0a\\xc8\\x88\\xe1\\x9d\\x3b\\xd5\\xd5\\x10\\x08\\xea\\x70\\x57\\x75\\xc9\\xd9\\x66\\x62\\x08\\xc5\\x81\\x6a\\x57\\x9a\\xb3\\x02\\xc1\\x90\\x49\\x11\\x1d\\x3b\\xd7\\x99\\xac\\xee\\xd4\\xbe\\xfe\\x31\\x93\\xce\\x5d\\x34\\xb1\\xcb\\x15\\x69\\xdb\\xfc\\x48\\xeb\\xf3\\x1d\\x6e\\x7d\\x58\\x37\\xdd\\x9c\\xe5\\xf3\\x33\\xc9\\xe5\\x52\\xb4\\x40\\xb0\\xb1\\xeb\\xf5\\x31\\xf3\\xbc\\x73\\x7b\\x7d\\x8a\\xcb\\xdc\\x2e\\x56\\x68\\x29\\x31\\xc5\\x6c\\x7a\\x8d\\x47\\xc1\\x1a\\x31\\xcb\\xd9\\x45\\xb7\\x7f\\xa4\\xab\\x05\\xe6\\x75\\x40\\x60\\x0a\\x10\\x98\\x9d\\xcb\\x07\\x29\\x6a\\xa1\\xf0\\x21\\x56\\x9a\\x96\\xb3\\x9d\\x56\\xfb\\x9e\\x29\\x59\\xbb\\x5a\\xee\\x60\\xc3\\x80\\x67\\x32\\x94\\xaf\\x17\\xa5\\x44\\x10\\xe8\\x7f\\x4e\\x97\\x58\\x55\\x43\\x09\\xcd\\x6f\\x45\\xbb\\xca\\x28\\x4a\\xc5\\xe5\\x37\\xfb\\x44\\x14\\x12\\x41\\x25\\x13\\x90\\xe6\\x1c\\x97\\x1d\\x4e\\x86\\x14\\x96\\xd8\\xcd\\x01\\x21\\x81\\x29\\x8b\\x50\\x10\\x20\\xcb\\x92\\x0f\\x09\\x05\\x37\\xdc\\x3b\\x01\\xb1\\x8b\\x59\\xef\\x5d\\x41\\x30\\x2a\\x6d\\xc7\\xf3\\x5e\\x79\\xa0\\x09\\x3b\\xf1\\xe0\\xb4\\x9d\\xcc\\x6e\\x79\\xd5\\x11\\xc3\\x21\\xd1\\x66\\xc3\\xbc\\xd7\\x68\\x98\\x4f\\x89\\x82\\xc3\\xc9\\x23\\x9e\\x5d\\x34\\xcd\\x33\\xd5\\xdb\\xbe\\x73\\xde\\x66\\xba\\x67\\x6d\\x0d\\xf4\\x92\\x9d\\x6f\\xb9\\x40\\xce\\x07\\x61\\xbb\\x95\\xcd\\xfa\\x09\\x9a\\x73\\xd9\\x78\\xb0\\xc6\\xc9\\x43\\xb1\\x4e\\x30\\x57\\xc5\\x20\\x1f\\xf9\\x23\\xb6\\x98\\x49\\x4f\\xdc\\x73\\xc1\\x1d\\x8f\\x63\\x4d\\x80\\x62\\x8c\\xa4\\x61\\xa5\\xe1\\xac\\xd7\\x26\\x3d\\xff\\x07\\x67\\x7f\\x48\\x99\\x55\\x12\\xe7\\xd3\\xd2\\xbd\\x3a\\xcd\\xd3\\x3f\\xd7\\xf7\\xee\\x3d\\x03\\xfe\\xdb\\x6b\\x51\\xf5\\x9f\\xfe\\xd8\\xb9\\xeb\\x0f\\xfd\\x23\\x41\\x58\\x37\\x6b\\xd6\\x7a\\x26\\x13\\x37\\x1c\\xdc\\x27\\xed\\x96\\xcb\\x48\\x05\\xce\\xa7\\x62\\x2b\\xf2\\x1a\\xa3\\x56\\xb0\\x96\\x4e\\x12\\xd3\\xd3\\x2c\\x2b\\x80\\x0a\\x2b\\xd8\\x1c\\x7a\\x23\\x6a\\xa4\\x3a\\xd0\\xe5\\xca\\x87\\xe3\\xfc\\x18\\x36\\xd3\\x34\\xe7\\x5a\\x8b\\x60\\x3f\\xdd\\xc6\\x9c\\xcb\\xfc\\x0a\\x94\\xf6\\x01\\x3f\\x2b\\xcc\\x74\\x28\\x9a\\x37\\xcc\\xc6\\xb0\\x10\\x16\\xe5\\x54\\x4b\\x94\\xa4\\xd5\\x1d\\x30\\x66\\xfa\\x60\\xb9\\x1c\\x06\\x84\\x82\\x01\\xc2\\xc3\\x42\\x46\\x61\\x7b\\x7d\\x1d\\xa9\\xaf\\x33\\x93\\x05\\xca\\x06\\x2a\\x7c\\x94\\xfa\\x6e\\x09\\xed\\xf1\\xe5\\xbb\\xe3\\xb7\\x56\\x34\\x54\\xac\\x1e\\x34\\xea\\x58\\xfd\\xcd\\x65\\x53\\xfb\\x8c\\x9a\\x25\\x8d\\xfe\\xf4\\xb7\\xa7\\xd4\\xa5\\xcf\\x0e\\xe9\\xad\\x7f\\x71\\xd9\\x93\\x4f\\x14\\xe4\\x7e\\x14\\x8a\\x8e\\x1a\\x34\\x9c\\xba\\x37\\x4e\\xdd\\x39\\x72\\xc8\\xd4\\x0d\\xa7\\xec\\x7f\\x04\\xe9\\x97\\xf5\\xb0\\x5b\\xde\\x03\\xbb\\xac\\x8c\\xd4\\x90\\xd3\\x78\\x0e\\x8a\\x0f\\xe5\\xea\\x66\\x6f\\x49\\x7a\\xd3\\x5d\\xec\\x3d\\x0b\\xbc\\x66\\x17\\x7b\\x2d\\x03\\xbe\\x1c\\xa0\\x2c\\xe7\\xb2\\x1c\\x0b\\xa3\\xb0\\x92\\x50\\x8b\\xc3\\x9b\\x72\\x00\\xa7\\xd9\\xe5\\x89\\xb2\\xca\\xd2\\x1e\\xca\\x43\\x4e\\x6f\\x41\\x49\\x29\\x7b\\x1c\\x81\\x51\\x1b\\x25\\x62\\x6d\\x54\\x20\\x62\\x74\\xb2\\x77\\x51\\x11\\x55\\x56\\x51\\xde\\xb9\\x8d\\x3d\\xc3\\x44\\xed\\xd8\\xcb\\x6e\\x3d\\xd0\\xa1\\x97\\xfd\\x5c\\x26\\x0c\\x97\\x75\\xd1\\xd0\\x7e\\xf1\\x0b\\xed\\xba\\xd9\\x2d\\x7d\\xd0\\x60\\x5d\\x92\\xee\\x69\\xcf\\xc4\\x07\\xf8\\x37\\x38\\xd3\\xa5\\x0d\\x1f\\xa5\\xed\\xf0\\xd1\\xad\\x23\\x3e\\xa2\\x80\\x8f\\x8c\\x42\\xb1\\x34\\x3e\\x32\\xab\\xc4\\x10\\x19\\x3d\\xaa\\x6b\\x38\\x32\\x92\\xd9\\x3d\\x63\\x2c\\x74\\xf6\\xff\\x0e\\x21\\x19\\x7d\\xfd\\x8c\\xe9\\x0e\\x87\\x90\\xb6\\xe6\\xfe\\xb8\\x21\\x86\\x0f\\x89\\x12\\xa3\\xc1\\x5f\\x9c\\xd8\\x66\\xfb\\x32\\x9c\\xc8\\x04\\x70\\xd2\\x8d\\xd4\\x91\\xb3\\x33\\x71\\x52\\xdd\\x0e\\x27\\xf1\\x36\\x9c\\xd4\\x33\\x9c\\x74\\xc7\\x51\\xb7\\x5e\\x36\\xdc\\x20\\x8d\\x93\\x5e\\xf0\\xa6\\x7b\\x26\\x8d\\xd4\\x28\\x0f\\x33\\x1a\\xa9\\xe8\\x66\\xe2\\xa5\\xac\\xfc\\xff\\x80\\x97\\x0e\\xd6\\xf3\\x11\\x89\\xe5\\x0c\\x53\\xd6\\xf7\\x3d\\x32\\xbd\\x48\\xd3\\x0d\\x5b\\x7a\\x68\\x9a\\x64\\xd2\\xf8\\xa9\\x02\\xfc\\xd4\\x91\\x01\\xe4\\xc9\\x4c\\xfc\\xf4\\x06\\xfc\\x54\\xa0\\x11\\xd4\\x13\\xac\\xe8\\xda\\x8a\\x9e\\x20\\x0c\\x4a\\x3d\\x99\\x28\\xeb\\xd7\\x86\\xb2\\x81\\x0c\\x65\\xf5\\x20\\x35\\xea\\xea\\x33\\x2c\\xeb\\x68\\x2c\\x55\\xc7\\x8f\\xea\\xbd\\xec\\x61\\x0d\\x26\\x26\\x9b\\xbb\\x07\\xfa\\xc2\\xd7\\xaa\\xb8\\x79\\x3d\\x08\\x3e\\xe9\\x5b\\x07\\xe6\\x35\\xe0\\xb2\\xb4\\xa2\\x16\\xd3\\xb7\\x88\\xe5\\xa4\\x27\\xbb\\x27\\x43\\x66\\xbf\\x6c\\xcc\\xb0\\x21\\x36\\xdb\\xd5\\x22\\x6a\\x3d\\xbd\\x20\\x7d\\xea\\x90\\x38\\xc1\\x10\\xff\\x3b\\xe8\\xed\\x2a\\x25\\xf1\\xf7\\x30\\xbd\\xba\\x83\\x75\\x1e\\xfc\\x1b\\x08\\xdf\\x94\\x61\\xa3\\x1f\\xe8\\x6b\\x62\\x5d\\x32\\xf8\\x74\\x37\\xe0\\xbc\\x14\\x7c\\x97\\x04\\xb9\\x35\\x13\\xeb\\x95\\xed\\xa8\\xb2\\xda\\x44\\x31\\x3a\\x99\\x35\\x09\\xad\\x18\\x54\\x71\\x2d\\xa8\\xe2\\xba\\x98\\x1a\\xdd\\xa3\\x95\\x2a\\x18\\x20\\x56\\xcb\\x50\\x70\\x1b\\xf9\\x8c\\x32\\x3e\\x9f\\xa3\\x2a\\x03\\xd7\\x6a\\x0d\\x7e\\x9e\\x00\\x85\\x5c\\x8f\\x41\\x65\\xec\\xe3\\x2d\\x70\\x36\\x22\\xed\\x26\\xbd\\x36\\xf6\\x90\\x8c\\x04\\x17\\x6e\\xd5\\x5d\\xa3\\xf9\\x6f\\xd1\\xad\\x69\\xed\\x33\\x44\\xa2\\xa9\\x7f\\x38\\x64\\x9e\\x48\\x1d\\xe3\\xd3\\xf8\\xeb\\x0b\\x7a\\xfe\\xd0\\x38\\x5c\\xf0\\xd2\\x4b\\x07\\x9a\\x0c\\xb6\\x5e\\xcf\\x14\\xbf\\x81\\x3f\\x79\\x34\\xe0\\xaf\\x07\\x69\\x20\\x83\\xc9\\xe3\\x99\\xf8\\xab\\x69\\x87\\xbf\\xfa\\x34\\xfe\\xba\\xc7\\x52\\x7d\\x79\\xd6\\x64\\x90\\x59\\x33\\x6b\\x8c\\xaf\\xd5\\xaa\\x81\\x1e\\xa3\\xd5\\x48\\xb6\\xbd\\x39\\xb1\\x56\\x7b\\x99\\x79\\x9f\\x26\\xd6\\x8a\\x40\\x02\\x3e\\xec\\xcf\\x3f\\xec\\x1f\\xc3\\x79\\xb7\\xc6\\x84\\x5b\\xad\\x77\\x1a\\x9d\\xfd\\x95\\x94\\xd7\\xd6\\xbd\\xa6\\x14\\x05\\x41\\x05\\x47\\x68\\xfd\\x21\\xe8\\x76\\x50\\x5f\\xf8\\xa3\\x8a\\xe8\\xdf\\x42\\x2d\\xcd\\x4c\\xaf\\xb4\\xa1\\x38\\x73\\x3c\\xf6\\x61\\xa5\\x67\\xd0\\xcc\\xba\\x78\\x4c\\x8c\\x2f\\x34\\x33\\x2f\\x87\\x41\\xfb\\xf7\\x46\\x2e\\xe6\\x80\\xcc\\x71\\x2f\\xb9\\xd2\\xf9\\x18\\x91\\xf4\\x3c\\xb8\\x4f\\xbe\\x5c\\x1a\\xc3\\x2a\\x1b\\x8e\\x22\\xf7\\x93\\x64\\x39\\x46\\xba\\x7a\\x24\\xb4\\x42\\x30\\x1d\\xf1\\x58\\x8b\\x5b\\xf9\\x26\\xa0\\xf5\\x68\\x03\\xd3\\x63\\x60\\x3c\\xd5\\x37\\x52\\x0e\\x5b\\xa1\\xf6\\x4a\\x68\\x7d\\x2d\\x7c\\xb6\\xd6\\x60\\x86\\xfc\\x18\\x10\\x68\\xcc\\x8b\\x92\\x15\\x9b\\x08\\xf2\\x42\\x2d\\x6a\\x9f\\x38\\x36\\xa5\\x37\\xe1\\x1c\\x92\\x40\\x8b\\x36\\x04\\x5e\\x63\\x69\\x35\\xd4\\x0b\\x8b\\x95\\x7b\\x20\\xcd\\xe6\\xf9\\x34\\x7f\\x37\\x78\\x6d\\x52\\x9a\\x23\\x21\\xee\\x7a\\xe5\\xf8\\xb4\\xe2\\x12\\x94\\x17\\x7d\\xcb\\x11\\xef\\xc5\\xdd\\x32\\x26\\xc6\\xa9\\x5e\\x9e\\x8d\\xed\\x80\\xef\\x52\\xb3\\x8b\\xbd\\xe3\\x18\\x8d\\xf2\\x4e\\x8a\\x2a\\x3d\\x57\\xa3\\xa7\\xfe\\xf3\\x43\\x13\\x46\\x8c\\x9f\\x8e\\x0f\\x10\\x20\\x07\\xdf\\x5c\\x78\\x4f\\xdf\\x7e\\xb7\\xcf\\x7b\\xf3\\xa7\\xd6\\x35\\x82\\x74\\xe6\\x99\\xd3\\xcf\\x1c\\x33\\xba\\xff\\x9e\\xb3\\xcf\\xdd\\x35\\xb8\\x69\\xf7\\xa5\\x3b\\xfe\\x43\\x4b\\x27\\x4e\\xe8\\x73\\x76\\x59\\xf3\\xdc\\x65\\x82\\x26\\xd0\\x13\\x27\\x4f\\x9c\\x35\\x93\\xf6\\xdb\\x7a\\x5f\\xdf\\xb1\\xd3\\x46\\xf6\\xf6\\xc9\\x9b\\x9e\\x68\\xa8\\xab\\x6b\\xd0\\xff\\xf8\\x74\\x8b\\xbc\\xf2\\x82\\xca\\x6e\\x8f\\xd6\\x1c\\x33\\x7e\\xd4\\x90\\x29\\x0f\\xdd\\xd0\\x77\\x68\\xbf\\xee\\xea\\xf1\\x54\\xb1\\xe4\\xcd\\x5c\\x71\\x06\\xb7\\x75\\xfb\\xeb\\x75\\x6c\\xce\\x4b\\x3e\\x7b\\x42\\x53\\xfb\\x9c\\x12\\x6d\\x9f\\x53\\xb2\\x1f\\x2a\\xa7\\x64\\x26\\x92\\x14\\x4c\\x24\\x35\\x97\\x66\\x63\\xb7\\x59\\x55\\xb8\\x45\\xad\\x8a\\x61\\xaa\\xa9\\x73\\x66\\x29\\xa4\\x3c\\x24\\xb9\\xfc\\x91\\xa2\\xe8\\x91\\x32\\x4b\\xac\\x99\\x3d\\xdd\\x53\\x94\\xd9\\x54\\x85\\x15\\xc0\\x1d\\x32\\x4b\\x38\\x24\\x66\\xe7\\xaf\\x52\\xfb\\x19\\x31\\xd2\\xc1\\x27\\x7f\\xd2\\xff\\xa2\\x99\\xe5\\x69\\x7c\\x60\\xcc\\xe7\\xff\\xcc\\x98\\x16\\x73\\xc7\\x5e\\x1a\\xd7\\xa7\\xb6\\x4f\\x27\\x01\\x3d\\xb2\\x59\\x2b\\x96\\x8f\\xc1\\x33\\x8c\\x80\\x44\\x9d\\x48\\x92\\x01\\xa4\\x41\\xb7\\xd9\\x03\\x59\\x0c\\x66\\x78\\xbe\\x3d\\x80\\xc3\\x58\\xf3\\x2d\\x3c\\xd4\\x55\\x00\\x6e\\x41\\xa0\\x25\\x59\\xc0\\x9e\\xc8\\x50\\x40\\x8c\\xba\\x22\\x6b\\x81\\x31\\x01\\x84\\x68\\x6e\\x3e\\xf0\\x03\\xdc\\x31\\xa3\\x95\\xb1\\x8e\\x84\\x3b\\x8f\\x5a\\xe1\\x76\\x5d\\xdb\\xbc\\x15\\xfb\\x47\\x9d\\x87\\xad\\x2c\\x63\\xf6\\xdc\\x98\\x8c\\x89\\x2b\\xb4\\x37\\x6d\\x3f\\x72\\x45\\x7a\\x16\\x2c\\xb9\\xd6\\x87\\x8d\\xb9\\x2b\\x99\\xf0\\x14\\x02\\x3c\\xc7\\x76\\x84\\x27\\x1f\\xe7\\x2c\\x73\\x78\\xb2\\x0d\\x78\\x72\\x38\\x3c\\x39\\x0c\\x9e\\x9c\\x34\\x3c\\x39\\xb0\\x4b\\x5e\\xa5\\xb8\\x84\\xed\\xdf\\xdf\\x03\\x29\\x4d\\xe5\\xcc\\x2e\\xeb\\x1a\\xa4\\xf4\\xfc\\x18\\xc3\\x3b\\xea\\x12\\x28\\x63\\x8e\\x0c\\xfd\\xa2\\xcd\\x16\\x63\\x70\\xc9\\x94\\xc1\\x55\\xd9\\x19\\xae\\x72\\x80\\x2b\\xca\\xe1\\x8a\\x22\\x5c\\xdd\\x62\\x6a\\x31\\x87\\xab\\x98\\xc1\\x55\\x8c\\x70\\xe1\\xe0\\x29\\x6b\\x31\\x83\\x2b\\x92\\xf7\\x3f\\xc0\\xd5\\x66\\x59\\x1d\\x7e\\xbb\\x4e\\x30\\x2d\\xaa\\xbc\\xc3\\xed\\x98\\xf8\\x31\\xb7\\xa5\\x5a\\xaf\\xe1\\x9b\\x26\\x19\\x7b\\xf6\\x12\\xc0\\x86\\xd3\\x21\\x2b\\xf0\\x69\\x0b\\xed\\xa1\\x8b\\x02\\x74\\x79\\x1c\\xba\\x3c\\x10\\x80\\xe1\\x98\\x5a\\x9a\\xd0\\xb2\\x41\\x9d\\x97\\xc5\\x99\\x4b\\x16\\xde\\xc3\\x3a\\x1a\\x73\\xbd\\xac\\x89\\xaf\\x02\\x0e\\xf3\\x51\\x6d\\x23\\xf8\\xf9\\x0c\\xfc\\x7c\\x04\\x1f\\x3d\\xb1\\xdc\\x30\\x38\\xb2\\x76\\xa7\\x83\\xc1\\xaf\\x96\\x2a\\x49\\x77\\x00\\x87\\x6d\\x69\\x15\\xf9\\xbc\\x55\\xdd\\xaa\\x00\\x3a\\x88\\x66\\x77\\xa7\\xfb\\x70\\x0f\\x81\\x11\\xd0\\xd9\\x26\\x32\\x50\\x63\\x77\\x8d\\x90\\x63\\xa9\\x23\\x6e\\xa2\\x42\\x01\\x55\\xdd\\x25\\x3a\\x5a\\x5e\\x7a\\xa9\\xf5\\x32\\x86\\x0a\\x21\\x0b\\x95\\xb4\\x70\\x10\\x7c\\x4f\\xfa\\x00\\xd0\\x30\\xe6\\xc1\\xba\\x9b\\x79\\x30\\x36\\x3a\\xe5\\xef\\x25\\xd8\\xc6\\x30\\xb6\\x69\\xa2\\xa5\\x96\\xf7\\x80\\x39\\xf6\\x77\\xc7\\xa9\\x30\\x84\\xfb\\xdc\\xc2\\x7a\\xb0\\x9d\\x0e\\x71\\xdd\\x23\\x26\\xd7\\xce\\xe7\\x24\\xfb\\x35\\x2d\\x95\\x9e\\x66\\x94\\xb9\\x7f\\x00\\xbf\\x34\\xac\\xf9\\x3e\\xf8\\xb5\\xd1\\xf2\\x6d\\xfb\\xdc\\x1a\\xfd\\xdf\\x72\\x6b\\x93\\x4c\\xfa\\x71\\xc0\\x1d\\x3e\\x33\\x2a\\x78\\xf2\\x8d\\x5b\\x10\\xf1\\xe0\\x4d\\x70\\x8f\\x1b\\x2c\\x0f\\x1b\\xb9\\xb5\\xe1\\x46\\x6e\\x8d\\xc5\\x5b\\xec\\xbc\\x25\\xcb\\x16\\x37\\x66\\xcc\\xfc\\xbf\\xcc\\xae\\x2d\\xa0\\x8e\\x22\\x5a\\x9a\\x4b\\x1d\\xd2\\x37\\x2f\\xbd\\xb4\\x3f\\x84\\xb7\\xc6\\x23\\x7c\\x6e\\x23\\xd0\\xe8\\x4a\\x80\\x2f\\x0a\\x9a\\x7b\\x12\\x49\\x3f\\x88\\x4d\\xed\\x01\\x17\\xb5\\xa5\\x27\\xbc\\xf1\\xc7\\xb0\\xb1\\x88\\x78\\x9e\\x31\\xdc\\xad\\xb2\\x18\\x43\\x27\\x2e\\x6b\\x10\\x1f\\x48\\xa7\\xe6\\x29\\x5a\\x28\\x1b\\x85\\x64\\x8f\\x32\\xfe\\x00\\x1b\\x51\\xd1\\x64\\xde\\x5f\\xcb\\xf4\\x40\\xb8\\x01\\x6c\\x17\\x2b\\x78\\xf4\\xf0\\x02\\x8e\\x3f\\x76\\x5e\\x86\\x7c\\x1d\\x26\\x9d\\xb0\\x18\\x67\\x0d\\x75\\x7f\\x35\\x7e\\x53\\x9d\\xe4\\x19\\xd7\\xf4\\xeb\\x98\\x1d\\xb4\\x70\\x44\\xe5\\xf4\\xe3\\xb7\\x0d\\x7d\\x7e\\xf4\\x6d\\x0b\\x57\\xe9\\xcf\\xef\\xfb\\x4e\\x7f\\x83\\x96\\x5e\\x74\\xd2\\xc9\\x17\\x97\\x9c\\x73\\xdc\\xe9\\xe7\\xd3\\x37\\x3f\\xa5\\x4a\\xa2\\x5a\\x9a\\x78\\x79\\xc3\\x45\\xab\\x4e\\x94\\xbd\\x79\\xae\\xf7\\xfc\\x83\\x63\\xcb\\x56\\x4d\\x3d\\x51\\xff\\xe6\\x8e\\x7f\\xff\\xa5\\x3f\\x4b\\x73\\x5e\\x5b\\x79\\xc3\\xd3\\xd7\\xae\\xa9\\xa8\\xdb\\x82\\x74\\xc2\\x66\\xc7\\x80\\x5f\\xe3\\x07\\x5e\\xbc\\xb1\\x6d\\x7a\\x4c\\x2e\\x4b\\x78\\x80\\x3f\\x53\\x9a\\x1b\\x05\\x0c\\x86\\x3d\\x2d\\x1d\\x07\\xca\\x54\\x66\\x0e\\x94\\x69\\xae\\xf0\\xa3\\x59\\x68\\x3c\\xe0\\x30\\x60\\x5a\\x7e\\x19\\x73\\x66\\x9a\\xf3\\x1d\\x4e\\xf8\\x46\\x01\\xb7\\x08\\xbb\\xb5\\x0d\\x9d\\xd1\\x9c\\x18\\x30\\x91\\xc3\\xb9\\x5c\\x7b\\x1a\\x03\\x96\\xb4\\x28\\xb6\\xe2\\x56\\x34\\xaa\\xb9\\xfc\\x29\\x3b\\x5d\\x4d\\xa2\\xe9\\x2a\\x0d\\xd7\\x71\\x3a\\xcd\\x73\\x1d\\xdc\\x91\\x4e\\xd3\\x6a\\x2c\\xdd\\x33\\x93\\x71\\x22\\x9f\\x5b\\x03\\xfc\\xc8\\x73\\x71\\xc3\\x32\\x73\\x71\\x86\\x4e\\xf9\\xbb\\x89\\x38\\xa7\\x57\\x4a\\x27\\xe2\\xda\\x4d\\xb1\\xc9\\x88\\x72\\x74\\x39\\xca\\xe6\\x5a\\xc6\\xd2\\xeb\\x0f\\x31\\xcf\\x46\\x7a\\x02\\x95\\x60\\x53\\xdb\\x54\\x9b\\xcc\\x35\\x77\\xca\\xbd\\xa5\\xa7\\xed\\x1c\\x3e\\xf7\\xe6\\x94\\x3a\\xe7\\xde\\x0e\\x33\\x79\\x87\\x49\\x89\\x43\\x8c\\xdf\\x19\\x6e\\xe4\\xdd\\x0e\\x35\\x85\\x47\\x78\\xd0\\x50\\x74\\xc6\\xba\\x65\\xd2\\x55\\xbe\\xcd\\xd0\\x04\\x7f\\x37\\xdf\\xe6\\xf4\\x2a\\x01\\xa9\\x63\\xbe\\xad\\x3d\\xd2\\xdb\\x47\\x0c\\xba\\x44\\xfc\\x26\\x53\\x26\\x8d\\x3b\\x04\\xee\\xc5\\x77\\x0c\\x75\\x96\\x97\\x31\\x54\\xc8\\x84\\xa3\\xca\\xc8\\xb1\\x9d\\x96\\x91\\x63\\x0b\\x20\\x1b\\x45\\x32\\x93\\x6b\\x1c\\xb4\\x1e\\x62\\x66\\x96\\x4d\\x8d\\xc6\\x41\\x92\\xa4\\x6b\\xcf\\x62\\x86\\x58\\xc1\\xc7\\x81\\x02\\xb4\\x99\\xb9\\x35\\x26\\x60\\x9c\\x4a\\x20\\x22\\x75\\x99\\x5a\\x6b\\x0f\\x71\\x17\\xec\\xa1\\x1c\\x1a\\xf8\\x0d\\x1d\\x38\\xe5\\x50\\xe4\\xe7\\xca\\xe0\\x97\\x56\\x5f\\x06\\x1e\\x24\\x83\\x0e\\x77\\xa7\\xf3\\x69\\x0b\\x33\\xf3\\x69\\xe6\\x58\\xa2\\x43\\xe4\\xd3\\x54\\x9f\\x97\\x3f\\xe0\\xcc\\xa3\\xe0\\x77\\x3a\\x24\\xd6\\xd4\\x22\\xfc\\xa8\\x5d\\x42\\xcd\\x29\\xa5\\x13\\x6a\\x1d\\x36\\xda\\x74\\xb1\\x4d\\x30\\x51\\x67\\xb7\\x03\\x75\\x1d\\x75\\x2c\\x34\\xc1\\xa3\\xe3\\xa8\\xa3\\xe3\\x2e\\x7f\\x02\\x5a\\xda\\xdf\\x46\\xb0\\xef\\xf0\\x38\\xba\\x48\\x06\\x90\\x3b\\xa4\\x21\\x92\\xa9\\x93\\x7a\\x12\\xe3\\x71\\x39\\x46\\x4b\\x23\\x7b\\x68\\x8e\\xf1\\x78\\x11\\x69\\x0f\\x8e\\x88\\xc4\\x78\\xb1\\x23\\xde\\xf6\\x9c\\x43\\xb6\\x12\\xfc\\x19\\x20\\x59\\x5a\\x97\\xd2\\x32\\xfd\\x7d\\x5a\\x26\\xf4\\xfb\\xec\\x33\\xfd\\x84\\x96\\x16\\xb1\\x5b\\x4b\\x0b\\xa7\\xa5\\x93\\xa4\\x81\\xd2\\x53\\x46\\x9e\\x6d\\x41\\x66\\x9e\\xcd\\xb0\\xd1\\xff\\x56\\x9e\\xed\\x21\\x2b\\x30\\x44\\x3a\\xd1\\x66\\x3b\\x42\\xa2\\xad\\xde\\xd0\\x47\\x09\\xde\\x7d\\xc8\\x1e\\xb8\\x74\\x88\\x44\\x1b\\x22\\x35\\xc6\\x78\\x3f\\x3e\\xa3\\xc7\\xb0\\x6d\\x27\\xcc\\x5a\\x08\\x38\\xad\\x39\\xbe\\x72\\xf8\\xb6\\x13\\x16\\x2c\\xa6\\x25\\x8a\\x4f\\xa6\\x92\\xbf\\x5b\\x78\\xd5\\xe2\\xab\\xb3\\xca\\x82\\xab\\x16\\x7b\\x3d\\x32\\xc7\\xae\\xd7\\x73\\xc5\\x1b\\x23\\xf6\\x6d\\x42\\x0c\\x7b\\x5c\\x57\\xbd\\x31\\xfc\\xfb\\x6b\\xfb\\x2f\\x2a\\xa6\\x82\\xdf\\x66\\x7f\\xe4\\x0a\\x5d\\xb5\\x5a\\x00\\xd9\\xbd\\x66\\x17\\x53\\xe6\\xc3\\xb1\\xd9\\x3f\\x40\\x47\\x7e\\x92\\x4d\\x8e\\x3b\\xe4\\xf4\\x9f\\x9c\\xae\\x92\\x44\\xb9\\x66\\x92\\x08\\x53\\x57\\x98\\x65\\x53\\x42\\xe1\\x6c\\xe3\\x61\\x5b\\x47\\x1c\\x05\\xc4\\x04\\x73\\xa7\\x79\\x40\\x2b\\x78\\xd6\\xad\\xd3\\x54\\x20\\xe9\\x20\\x4f\\xba\\xb5\\x5f\\xef\\xc4\\xff\\x7d\\xbd\\x2c\\xeb\\xa6\\x04\\x82\\x7c\\x9d\\x4a\\xd2\\x83\\xc9\\xac\\x23\\xad\\x95\\x65\\xe0\\x3a\\xcf\\x2e\\x1a\\x6c\\x78\\x1a\\x9d\\x56\\x2b\\xee\\x6f\\xab\\x97\\xe3\\xeb\\xfd\\x16\\xd6\\x9b\\x47\\xa6\\x1f\\x72\\xbd\\xf9\\x5d\\xad\\xb7\\xa0\\x03\\x7e\\x53\\x80\\xdf\\xdc\\x3c\\xe3\\x51\\xb2\\x9e\\xec\\x9c\\x23\\x2f\\x3c\\x2d\\x88\\x3b\\x2d\\x7e\\x71\\x3a\\x21\\xd7\\x19\\xd7\\xf9\\x99\\xf9\\x38\\xbe\\xfe\\x87\\x59\\x05\\x70\\x04\\xe5\\x6d\\x7b\\x08\\x82\\x68\\x24\\xe6\\x24\\xb4\\x80\\x15\\xeb\\x9e\\xda\\x00\\xca\\xcb\\x00\\x48\\x0d\\xb3\\xc1\\x08\\x20\\x64\\x02\\x31\\x2d\\xdc\\x2e\\x3f\\xa7\\x66\\xe3\\x47\\x11\\x85\\x0f\\xa3\\xcb\\x0e\\xe3\\xe3\\xff\\xb0\\x5b\\x28\\xa2\\xb0\\xc7\\x97\\x1d\\x11\\x3c\\x9e\\xa9\\xeb\\x04\\xdd\\xf1\\x3c\\x53\\xd7\\x19\\xb4\\x52\\x23\\x51\\x27\\xf0\\xf9\\x48\\x40\\x47\\x41\\xf0\\x8d\\xfa\\x74\\x9e\\x90\\x14\\x49\\x4f\\x48\\xc2\\x54\\xa8\\x8c\\x56\\x3b\\x22\\xfc\\x6f\\xce\\x4a\\x62\\x0d\\x00\\x87\\x1c\\x98\\xe4\\x31\\x3a\\x14\\x3b\\xcf\\x4d\\x92\\x76\\x18\\x84\\x23\\x90\\xd3\\xf4\\xd9\\xd2\\x08\\x36\\x4b\\x33\\x4a\\xa6\\x1a\\xb3\\xf3\\xf0\\xd9\\x04\\xc4\\x74\\x2e\\xf0\\xc9\\x84\\x98\\x0b\\xa5\\x31\\xf3\\x31\\x05\\x38\\x2e\\x51\\x08\\xc4\\xe3\\x18\\x56\\xc9\\x35\\x06\\xe8\\xb1\\x67\\x15\\xe0\\x34\\x1e\\x3e\\x02\\x38\\x6c\\x8c\\xce\\x93\\x0b\\x0e\\x35\\x02\\x18\\x9b\\x67\\xdb\\x0d\\xcf\\x3b\\x8d\\x96\\xc6\\xd6\\x4f\\x36\\x66\\xe7\\xe9\\x7b\\x69\\x49\\xdb\\xfc\\x3c\\x39\\xbb\\x55\\x1b\\x38\\x34\\x73\\x7c\\x1e\\xbd\\x95\\x76\\xcb\\x1c\\xa0\\x27\\x1a\\x78\\x7e\\x98\\x65\\x73\\xf3\\xc9\\x22\\x92\\x0c\\x23\\xc5\\x44\\x12\\x5a\\x08\\x28\\x26\\x37\\xde\\x09\\xf1\\x05\\x38\\x06\\x0d\\x33\\xb5\\x38\\x61\\xc8\\x82\\xb8\\xf7\\xb6\\xf0\\xe1\\x19\\xf9\\x40\\x25\\x85\\x18\\x80\\x0b\\xe1\\x34\\x16\\xc5\\x81\\xfd\\x55\\x60\\xb2\\x6a\\xa2\\xf4\\xf7\\xf7\\xc5\\x20\\x98\\x43\\x6e\\xcd\\xef\\x7c\\x94\\x44\\x17\\x3b\\xd3\\xc2\\x28\\x47\\x20\\x73\\x0e\\xee\\xb3\\x1e\\xc5\\x9e\\x5f\\x58\\x46\\x4e\\xe6\\xfd\\x75\\x6c\\xba\\x69\\xfa\\x31\\x86\\xf8\\xb4\\x79\\xf6\\x64\\x23\\x5e\\xab\\x01\\x1e\\xb6\\xd3\\x13\\x94\\x78\\xe6\\xd5\\x1c\\x79\\x99\\xdd\\xf6\\xf0\\xc2\\x2c\\xa6\\xb7\\x92\\x59\\x05\\x6c\\x6e\\x0a\\x86\\xc9\\xbc\\x71\\x38\\xc0\\xa6\\x5c\\xcc\\x7c\\x15\\x60\\xc7\\x58\\x10\\x20\\x54\\xb3\\x14\\xd5\\x97\\x2e\\x69\\x01\\x05\\xd2\\x56\\x69\\x1a\\xcd\\x78\\xba\\x84\\x39\\x2e\\x70\\x0e\\x1d\\x43\\x3d\\x43\\x37\\x8e\\x15\\xe7\\xa4\\x8b\\x4f\\x6f\\x99\\x7e\\xee\\x60\\xfd\\x27\\x2c\\xdb\\xba\\x7b\\x73\\xe5\\xd8\\x8a\\xea\\xd1\\xe5\\x9b\\xef\\x64\\xcf\\xdc\\xb1\\xd3\\x51\\x2e\\xbb\\x51\\x92\\xea\\x70\\xd2\\x91\\xd4\\xf1\\xf0\\xbf\\x24\\x8b\\x24\\x4b\\x96\\x27\\x1f\\x22\\x86\\xcd\\x65\\x75\\x49\\x63\\x48\\x31\\xa9\\x21\\x8d\\x98\\xc3\\x2b\\x42\\xcf\\x25\\x37\\x81\\xd1\\x11\\xd5\\x1f\\x67\\xda\\x12\\x67\\xc6\\x54\\xc3\\xdb\\x86\\x78\\x2a\\x9e\\x55\\x84\\xf0\\xc6\\x2d\\xe9\\xa7\\x68\\x97\\x00\\x90\\x25\\x3c\\x7e\\xed\\x0e\\xb4\\xb0\\xa4\\x4b\\x02\\xd4\\xd7\\x40\\xbb\\xe4\\xc8\\xf2\\xe7\\x16\\x79\\xbb\\xd5\\xb2\\x51\\x39\\x0a\\x2f\\x2d\\xd0\\xca\\x8b\\x70\\xd8\\x43\\x3e\\x07\\x3a\\xd4\\xa8\\x49\\xd5\\xe9\\x21\\x89\\x5c\\x79\\x1e\\x3a\\x38\\xda\\xc1\\x78\\x2e\\x33\\x63\\x09\\xa8\\x44\\xd7\\xed\\x1c\\x3c\\xe8\\xc9\\xb5\\x1d\\xa2\\x09\\xeb\\x5e\\x1c\\x32\\x78\\xe7\\xba\\x76\\x56\\xb5\\x58\\x68\\xc4\\x16\\xb8\\x36\\x9d\\x31\\x71\\xd2\\xf4\\xcc\\xd0\\xc2\\xf4\\xc9\\x93\\xa7\\x67\\x1a\\xd9\\x0b\\xd2\\x31\\x32\\x9e\\xfb\\x77\\x13\\x3b\\xb3\\xca\\x4e\\xec\\x94\\xfd\\x57\\x3d\\x09\\xcd\\x69\\xc5\\xe6\\x4b\\xf6\\x90\\x05\\x5e\\x07\\xd0\\xec\\xb6\\x62\\xeb\\x87\\x43\\x61\\xcf\\xa9\\x71\\x83\\x23\\xed\\x61\\x27\\xc0\\x28\\x63\\x0f\\x5d\\xb0\\x39\\xf8\\x80\\x34\\x0f\\xf6\\xd3\\x0a\\x62\\x63\\xa3\\xa6\\x58\\x8d\\x49\\xd8\\x5d\\x94\\x0b\\xb4\\x51\\x78\\x66\\xc5\\xc0\\x67\\x46\\xdd\\x71\\x46\\xc1\\x40\\x9c\\xd1\\x33\\x25\\x17\\x4b\\x9f\\x8b\\x4b\\x2c\\xdf\\x11\\x1b\\x29\\x60\\xcf\\x9b\\xb6\\x24\\x34\\x01\\x1b\\xad\\xb1\\xbd\\xd7\\x9c\\x44\\x67\\xb6\\x2a\\x72\\x5d\\x72\\xb1\\xa9\\x3a\\xa4\\xcf\\xd3\\x8a\\x82\\x92\\xb5\\xd2\\x2b\\xe2\\x7c\\xcb\\x9f\\x20\\xaf\\xc6\\x12\\x36\\x83\\x19\\x0c\\x71\\xaf\\xec\\xb6\\x19\\xb9\\x38\\x56\\x5e\\x9d\\xf2\\xa7\\x3d\\x55\\x90\\xff\\x29\\x07\\xb7\\xb5\\xd9\\x10\\x41\\x3f\\x16\\x84\\x32\\x11\\xe5\\x75\\x33\\x07\\x5e\\x13\\x65\\xa3\\xb3\\xaa\\x2b\\xdb\\x7a\\x6d\\x47\\x57\\xf3\\x8f\\x76\\x65\\x9e\\xed\\xe6\\x60\\x90\\x76\\x53\\x2e\\xfe\\x2f\\x9f\\x5d\\x2e\\x4c\\x91\\x76\\x89\\xfd\\xe0\\xb3\\xb0\\xf9\\x14\\x47\\xfc\\xe9\\x30\\x94\\xe1\\x72\\xa9\\x49\\x98\\xc2\\xe6\\x0b\\x9c\\x28\\x4c\\xb1\\xdc\\x7a\\xc4\\xef\\x9f\\x68\\xe9\\x65\\x7c\\x3f\\x2e\\xfe\\x4e\\xe7\\x81\\xcc\\xef\\xe2\\xb9\\xdb\\xc0\\x44\\x96\\x30\\x7f\\xee\\xb6\\x85\\x3f\\x26\\x88\\xfd\\xb5\\x3f\\x21\\x06\\xe3\\xb7\\x5d\\xd1\\x24\\xfe\\xbe\\x83\\xce\\xd1\\x6f\\x7d\\x9a\\xaf\\xb3\\x51\\xfc\\x83\\x2e\\xe9\\xfa\\x3a\\xf8\\xfc\\xee\\x70\\x17\\xcf\\xef\\x4e\\x04\\xc5\\xc6\\xa6\\xdf\\x6e\\x83\\x3f\\x9c\\xf1\\xec\\x33\\xfa\\x6d\\xfc\\x3a\\x71\\xfd\\x4f\\x3a\\x9f\\x16\\xfe\\x0f\\xd7\\x61\\x8f\\x78\\x6f\\xfa\\xed\\x6a\\xf8\\x43\\x07\\xcd\\xd3\\x7f\\xd1\\xbf\\x44\\x5d\\x06\\x70\\x09\\xf7\\xb1\\xf5\\x38\\xc9\\x51\\x8c\\xca\\xe4\\x84\\x71\\x31\\x36\\x52\\xca\\x65\\xc2\\xa7\\x5a\\xf8\\x83\\x3f\\x9c\\x61\\xfe\\x44\\x24\\x03\\x54\\x1c\\xcc\\x2d\\x1a\\xcf\\xcb\\x4d\\x83\\x9d\\x48\\x03\\x3f\\x29\\x03\\x01\\x06\\x1a\\x04\\xc4\\x81\\xf0\\xc4\\xe1\\xef\\xc9\\x61\\xc0\\xc6\\x7a\\x04\\xc3\\x61\\xdc\\xd3\\x00\\x07\\x23\\x96\\xb2\\xf9\\x80\\x28\\x13\\x45\\x09\\xbf\\x89\\xa8\\xa7\\x33\\x90\\x65\\xa0\\x0c\\xe0\\x3c\\x58\\x28\\xdc\\x4b\\xbb\\xb3\\x7b\\x1e\\x4d\\xd8\\xb6\\x25\\x52\\x36\\x7e\\x4f\\xc1\\xbc\\x67\\x4a\\x0a\\x93\\x1c\\xde\\xcf\\x6f\\xe5\\x4c\\x00\\xef\\x0e\\x73\\xe7\\xb0\\x5f\\x49\\xdf\\x39\\xde\\xf4\\xe5\\x6d\\x6f\\x35\\x7d\\x75\\xdb\\x27\\xd4\\x45\\x0e\\xfe\\xac\\x7f\\x4d\\x03\\xbf\\xc3\\x6f\\x5e\\x63\\x43\\xf7\\x09\\xf3\\x25\\x07\\x48\\x1e\\xf0\\x95\\x9c\\xb1\\x94\\xc4\\x6e\\x6b\\xbc\\x50\\xf4\\x04\\x81\\xff\\x6c\\x6c\\x6e\\x82\\xf1\\x82\\x4f\\x53\\xea\\xd4\\xbf\\xbe\\x61\\xfd\\x92\\xe5\\xeb\\xcf\\x5d\\xb6\\x6c\\xbd\\xf0\\xd2\\xd4\\xf9\\xe7\\xac\\x5b\\x30\\x75\\xc1\\x99\\x67\\x31\\x1d\\xb0\\x09\\x64\\x9b\\x9f\\x3d\\x8f\\xdd\\xa8\\xbf\\x67\\xbd\\x15\\x38\\x3b\\x93\\x8d\\x11\\xb0\\xd8\\xe3\\xf1\\x8c\\xa7\\xb3\\xbb\\x32\\xed\\x59\\xa9\\xed\\x69\\x5c\\xe6\\x13\\xce\\xda\\x9e\\xc2\\x66\\xfe\\x6c\\xa2\\xa5\\xd7\\xd1\\xd2\\x73\\xf8\\xf3\\x5c\\xcd\\x1f\\x9c\\x03\\x41\\xae\\x13\\x06\\xb0\\xbe\\xf8\\x28\\xa1\\xaa\\x95\\x81\\x61\\x61\\xeb\\xc7\\x50\\xad\\xcd\\x24\\x12\\x89\\x13\\x06\\x9b\\xbd\\xb3\\x94\\x0f\\xdd\\x11\\xf2\\x33\\x67\\xed\\x8c\\x83\\xeb\\x94\\xb6\\xbf\\x0e\\xec\\x89\\x71\\xa9\\xb6\\xeb\\x50\\xbc\\x8e\\xd1\\x7e\\x3f\\xae\\x53\\xbf\\x3d\\x5c\\x67\\xf8\\xc1\\x7d\\xe2\\xb7\\xa0\\xff\\xab\\xc8\\x59\\x24\\x59\\x41\\xf8\\xe0\\x7c\\xd6\\xed\\x80\\x41\\xa0\\x14\\xa1\\x15\\x0e\\x37\\xb3\\x88\\x89\\x8c\\x8f\\x59\\x4a\\x59\\x24\\x76\\x22\\x9c\\xc0\\xd9\\xb7\\x6c\\xea\\x75\\x8f\\x98\\xda\\x7d\\x8f\\x26\\xc8\\xf1\\x38\\x16\\x36\\x69\\x81\\x6c\\xc0\\x5c\\x7e\\x77\\x16\\x4d\\xc7\\xc9\\x79\\xa1\\x78\\xb2\\x7b\\x3e\\xbe\\xeb\\x8e\\x1d\\x02\\x52\\x1c\\x27\\x23\\x81\\xa8\\x2f\\x62\\x53\\x6e\\x34\\xc5\\x62\\xda\\xc3\\xf5\\x89\\xfa\\x12\\x1c\\x54\\x4f\\x32\\x07\\xd5\\x1b\\xf3\\xd4\\x82\\x19\\x83\\x60\\x49\\x3f\\x3a\\xfc\\xaa\\xab\\xae\\xa2\\xd5\\xbf\\x34\\x9d\\x34\\x24\\x58\\xbf\\xaa\\xf7\\x9a\\x0d\\xf4\\x3e\\x7d\\x12\\xfe\\x6c\\x38\\xb5\\xcf\\x8a\\x44\\xb0\\xf1\\xf4\\xfe\\xbf\\xea\\xaf\\xd3\\x17\\x76\\x9e\\xbc\\xd3\\xbd\\x9b\\x16\\x7b\\xb3\\xbe\\xf0\\xfa\\xb7\\x2d\\xce\\x82\\xb7\\xb6\\x79\\x57\\x2a\\xca\\x67\\x59\\x5e\\xea\\x7f\\xda\\x86\\x7c\\x3c\\x5b\\xbc\\x5a\\x9a\\xc7\\x9e\\x4b\\x14\\x26\\x57\\x19\\xb3\\xd1\\xa8\\x3b\\x61\\xd2\\x78\\xd2\\x92\\xe5\\x8f\\x03\\x30\\x76\\x36\\x0b\\x8a\\x9f\\x62\\xc7\\x84\\xe7\\xb8\\x45\\x3e\\x3d\\x4e\\x86\\x0d\\x64\\x92\\xbf\\xeb\\xc7\\x17\\xa1\\x0c\\xc0\\x5e\\x41\\xb3\\xde\\x99\\xf5\\xd8\\xa4\\xb2\\xda\\x86\\xd4\\xe0\\x43\\x07\\x34\\x87\\xdb\\x7c\\xc8\\x4c\\xb3\\xd3\\xe5\\x0b\\x1a\\x29\\x3f\\x7c\\x48\\x4b\\x89\\x02\\x52\\x08\\x07\\xb3\\xc2\\x51\\x85\\x58\\x22\\x5a\\x95\\xd9\\x74\\xe3\\x39\\x9b\\xe8\\x71\\x5b\\xd7\\xca\\xa7\\xde\\x78\\xae\\xbc\\xf8\\x98\\xe5\\xb2\\x65\\xf8\\xe2\\xc5\\x38\\x9e\\x47\\x1f\\x25\\xe4\\xeb\\xd7\\xd2\\x13\\x5b\\x3f\\xa3\\xb9\\x54\\xff\\x82\\x76\\xa7\\xfa\\xdb\\x84\\xb2\\x61\\x0a\\xbd\\xa5\\xde\\x40\\xeb\\xf5\\x9c\\xce\\x53\\x54\\xc2\\x79\\x1b\\x99\\xc7\\xe9\\x11\\x9f\\x6c\\x12\\x87\\xf1\\x62\\x48\\xf5\\x5a\\xa0\\x67\\xbc\\xc0\\x7e\\x63\\x46\\x5d\\x00\\xae\\x37\\x87\\x3d\\xb3\\x20\\x82\\xd6\\x13\\x3e\\xb5\\x40\\xcd\\xe6\\x53\\xc3\\x35\\x25\\x27\\xd1\\xee\\xd1\\x05\\x2e\\x3e\\xad\\xfb\\xc8\\x8f\\x2e\\xc0\\x09\\x25\\x18\\xb1\\x89\\x18\\x93\\xbc\\xb3\\xb1\\xa8\\xd1\\x6d\\x38\\x4f\\x0e\\xf6\\xb0\\xa4\\xbf\\xf9\\x5c\\x03\\xb4\\x1b\\x02\\xdb\\xfe\\xfc\\x74\\xcc\\xf5\\xf3\\xbb\\x1f\\xb3\\x76\\xf4\\x82\\x05\\x6f\\xbd\\xa5\\x7f\\x20\\x5c\\x44\\x4b\\xc5\\x65\\x2f\\x8f\\x78\\x69\\x6f\\x61\\xfe\\x97\\xa1\\xec\\xe9\\x53\\x46\\xb0\\xe7\\x1b\\x1c\\xb8\\x9a\\xa5\\x0d\\x04\\x7c\\x0e\\x83\\xb4\\xce\\x80\\xe9\\xa4\\xf6\\x30\\x65\\x3c\\x8c\\xc1\\x1e\\x03\\x56\\x68\\xf6\\xd8\\x65\\x4f\\x15\\xce\\xfc\\xf9\\xbf\\x80\\x26\\x67\\x82\\x74\\x78\\x60\\x3a\\x3d\\xa8\\x41\\xd8\\xca\\x80\\xe9\\xf8\\xb0\\x86\\x03\\x57\\x9b\\x73\\xeb\\x45\\x84\\xc7\\xda\\x8f\\xc1\\x83\\xd5\\x2f\\xcf\\x71\\x88\\xb4\\xea\\x1a\\x63\\x76\\x7d\\xb3\\x92\\x83\\x46\\x2a\\x03\\x2c\\xe9\\xcf\\xae\\x02\\x3a\\xc7\\x70\\x29\\x18\\xbd\\x05\\xae\\x16\\x63\\x06\\x28\\x03\\xb0\\xee\\xef\\x02\\x88\\xa3\\xe2\\x72\\xe3\\x58\\xe7\\xa1\\x56\\xc6\\x93\\xd5\\x3d\\xf1\\xb3\\xea\\x2a\\xf8\\x5a\\xcf\\x6a\\x3c\\xec\\x89\\xb3\\x7d\\xaa\\x79\\xa9\\x57\\x22\\x8b\\x97\\xc9\\xf4\\x34\\xf1\\xa0\\xd5\\x80\\x45\\xac\\x95\\xe1\\xc3\\x6b\\x12\\x8a\\x56\\x1c\\x45\\xcc\\x94\\x51\\x36\\xbe\\x47\\x2b\\x40\\x3b\\xd1\\xce\\xeb\\x38\\x0e\\x81\\xa3\\xe8\\xff\\x84\\xbb\\xba\\x43\\x90\\x46\\x47\\x6c\\x1e\\x8a\\x56\\x38\\x6e\\xa7\\xa5\\x71\\x7b\\x5f\\x47\\xdc\\x26\\x01\\xb7\\x89\\x44\\x3b\\xd4\\xba\\x63\\x6a\\x71\\x82\\x35\\x16\\x17\\xc4\\x35\\xbb\\xbd\\x45\\x8b\\xd6\\xc6\\xe3\\xff\\xbf\\x22\\xb7\\x20\\x6a\\x04\\xb6\\xff\\xbf\\x40\\x61\\xdf\\xbf\\x49\\x90\\x87\\xa2\\xd0\\xff\\x07\\xda\\x23\\xff\\xc1\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\x60\\x00\\x62\\x2f\\xbf\\xcf\\x96\\xf1\\xfc\\x36\\x5f\\x19\\xe4\\x39\\x18\\x40\\xe0\\x7c\\xfd\\x9c\\x33\\x30\\xfa\\xff\\xec\\x7f\\xc6\\xec\\xd1\\xec\\xfd\\x40\\x75\\x1c\\x0c\\x4c\\x20\\x51\\x00\\x54\\xec\\x0c\\xc7\\x00\\x00\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\xe0\\xa8\\xf9\\xbb\\x16\\x48\\x32\\xfc\\x9f\\xfd\\x7f\\x26\\x7b\\x34\\x03\\x50\\x04\\x05\\xbc\\x02\\x00\\x92\\xee\\x06\\xb7\\x00\\x78\\xda\\x6d\\x93\\x5b\\x48\\x54\\x51\\x14\\x86\\xff\\x59\\x7b\\xed\\x39\\x05\\x1a\\x86\\xa1\\x85\\xca\\x98\\xd5\\x53\\x37\\x99\\x07\\x73\\xc2\\x1b\\xa3\\x58\\x79\\x09\\x09\\x89\\xb4\\xb1\\xd1\\x84\\xc0\\x94\\xb2\\x1e\\xb2\\x20\\x9c\\xa8\\x51\\xc7\\xca\\x9a\\xa2\\x8b\\xdd\\xec\\x25\\x8a\\x6e\\x04\\x41\\xbd\\x05\\x56\\x90\\x44\\xf4\\x18\\x41\\x05\\x21\\x52\\x10\\x48\\xb7\\xa7\\x20\\x6a\\xfa\\xcf\\xd8\\x90\\x86\\x0f\\x1f\\xff\\xda\\x7b\\xaf\\xbd\\xcf\\xd9\\xeb\\x5f\\x5b\\x26\\x51\\x35\\x07\\x80\\xe7\\xf7\\x14\\xb2\\x12\\xfd\\x12\\x87\\x5f\\x9f\\xa2\\x50\\xcf\\xa3\\xd5\\x7e\\x42\\xd8\\x06\\x51\\xea\\xa9\\x81\\x5f\\xc6\\x70\\x50\\x9e\\xc3\\x67\\x8e\\x23\\x47\\x5b\\x50\\x2c\\x19\\x28\\x37\\x8b\\xb1\\x47\\x1a\\x11\\x37\\x81\\xc4\\x77\\xe6\\x87\\xc9\\x6d\\x52\\x47\\xaa\\x49\\x80\\xec\\x22\\xed\\xa4\\x84\\x6c\\x25\\x9b\\xa4\\x1a\\x71\\xf1\\x63\\xaf\\x66\\xa2\\x48\\xaf\\x20\\xa6\\x05\\xe8\\x31\\xbf\\x90\\xef\\x2c\\x42\\xd0\\xfa\\x90\\x66\\x0b\\x10\\xb3\\x79\\x68\\xb1\\x65\\x5c\\x1b\\x26\\x23\\x1c\\x37\\xa1\\xdd\\xde\\x42\\x4c\\x9a\\x70\\x51\\x4f\\xa1\\xdc\\x2e\\xe7\\x7c\\x23\\x62\\xde\\x9f\\x5c\\xe3\\xbc\\xed\\x41\\xc8\\x16\\x51\\x2f\\x50\\x6b\\xa8\\x99\\x68\\x66\\x5e\\xae\\x8d\\x60\\xbf\\xcd\\x86\\xe3\\x64\\x63\\x21\\xd5\\x67\\xd3\\x60\\xf5\\x21\\xea\\x65\\x2d\\xbf\\x19\\x86\\x50\\xd3\\xcd\\x21\\xac\\x30\\xa7\\xe1\\x91\\xeb\\xa8\\xd7\\x3a\\xac\\xd1\\x28\\xba\\x75\\x29\\xca\\xa8\\x95\\x5a\\xc2\\xdc\\x77\\xbc\\xaf\\x1b\\x47\\xd1\\x21\\x4b\\x10\\x11\\x5f\\x62\\x44\\x37\\xa0\\xdb\\x8d\\xbd\\x93\\xcc\\x8d\\xa2\\xf3\\xef\\xba\\x1b\\x57\\xca\\x4b\\x6a\\x3e\\x2a\\xe4\\x05\\xe6\\xba\\x7b\\x34\\x0b\\x19\\x76\\x02\\x79\\xd4\\x4c\\x62\\x49\\xad\\x5c\\x43\\xa1\\x38\\xb8\\x4b\\x2d\\xb0\\xab\\xd1\\x91\\xac\\x7d\\x15\\x4e\\xb0\\x1e\\xeb\\x75\\x94\\x77\\x18\\x44\\x83\\x7e\\x40\\x96\\x58\\x44\\xac\\x83\\x6d\\x1a\\xc4\\x65\\x6f\\x35\\x36\\x9b\\x21\\x9e\\xed\\xc1\\x76\\xed\\x40\\xaf\\x5b\\x7b\\x77\\x4e\\x15\\x67\\x4c\\x2e\\x7a\\xb5\\x1e\\xcd\\x26\\x84\\x2e\\xb3\\x05\\x61\\x79\\x8d\\x2e\\xfd\\x8a\\x63\\x5a\\x84\\x52\\xe9\\xc4\\x55\\x59\\x86\\x36\\x29\\xc5\\x46\\x73\\x13\\xfb\\xb8\\x7f\\x87\\x7d\\x85\\x1b\\xde\\xf9\\xe4\\x01\\x76\\x6b\\x3a\\x6a\\x93\\x75\\x9f\\x05\\xa7\\x0f\\xc6\\xf5\\x22\\xe9\\xc3\\x34\\xa4\\x29\\xf1\\x8c\\x5e\\x0c\\x53\\x47\\xc9\\x3d\\x1b\\x62\\x6d\\x53\\x3e\\xfc\\x87\\x56\\xa0\\xc2\\x1e\\x66\\xec\\x7a\\x31\\x1d\\xd7\\x8b\\xf7\\x88\\xda\\x79\\x18\\x48\\xd6\\x7d\\x16\\xbc\\x8f\\xb1\\x2a\\xe9\\x05\\x7d\\x98\\x8e\\xf8\\x13\\xf7\\xd9\\x43\\x51\\xea\\x1d\\x72\\x49\\x9f\\xb0\\x5f\\xff\\xf9\\x30\\x93\\x38\\xca\\x53\\xfe\\xcd\\xc0\\xf5\\xe2\\x28\\x0e\\xb8\\xea\\x8c\\xa2\\xcd\\x29\\x46\\xa5\\xfb\\x4f\\xe6\\x07\\x06\\xcd\\x1b\\xf6\\xc7\\x18\\xe0\\x9c\\x04\\x52\\x2a\\x7d\\x7c\\x23\\x13\\x24\\x38\\x05\\xbe\\x51\\x8f\\x50\\x3b\\x99\\x43\\x2f\\x52\\xd8\\x3e\\x0c\\x79\\xfb\\xb1\\xd3\\x73\\x16\\x7e\\x12\\xf0\\x9c\\xe3\\xdb\\xf9\\x48\\x3e\\x23\\xc0\\x5e\\xf2\\xcb\\x38\\x06\\xec\\x17\\xc4\\xdd\\xbd\\x12\\x41\\x17\\xfd\\x69\\x70\\xcf\\xd5\\x10\\xd6\\xb1\\x16\\xad\\x5a\\xcc\\x78\\x1c\\x0b\\x34\\x81\\x1c\\xe7\\x11\\x79\\x8b\\x9c\\x3f\\x3c\\x80\\xbb\\xdf\\x78\\xda\\x63\\x60\\x60\\xd0\\x81\\xc2\\x28\\x86\\x2e\\xc6\\x12\\xc6\\x7f\\x4c\\xf3\\x98\\x9d\\x98\\xd3\\x98\\xa7\\x30\\x1f\\x62\\x7e\\xc7\\x62\\xc0\\x12\\xc2\\x52\\xc4\\x32\\x85\\x65\\x0d\\xcb\\x1f\\x56\\x35\\xd6\\x1e\\x36\\x0e\\xb6\\x00\\xb6\\x35\\xec\\x6a\\xec\\x71\\xec\\x6f\\x38\\x92\\x38\\xfa\\x38\\x0e\\x71\\xdc\\xe0\\xf8\\xc5\\xc9\\xc7\\x59\\xc2\\xe5\\xc4\\xd5\\xc6\\xf5\\x81\\x3b\\x8a\\x7b\\x1a\\xf7\\x25\\x1e\\x0e\\x9e\\x1a\\x9e\\x2d\\x3c\\x97\\x78\\x25\\x78\\x83\\x78\\x2b\\x78\\x2f\\xf0\\xf1\\xf1\\x25\\xf0\\x2d\\xe1\\x67\\xe3\\xcf\\xe3\\xff\\x20\\xa0\\x20\\x10\\x27\\x30\\x4d\\x90\\x45\\xd0\\x42\\x30\\x4b\\x70\\x86\\xe0\\x31\\xc1\\x7b\\x42\\x02\\x42\\x46\\x42\\x3e\\x42\\x39\\x42\\x6f\\x84\\x03\\x84\\xb7\\x89\\xc8\\x88\\xd4\\x89\\x5c\\x10\\xf5\\x11\\x9d\\x22\\x7a\\x40\\xf4\\x9f\\x98\\x91\\x98\\x9f\\xd8\\x3e\\x71\\x0e\\xf1\\x10\\xf1\\x6d\\x12\\x12\\x12\\x21\\x12\\x97\\x24\\x35\\x24\\x0b\\x24\\x67\\x49\\xde\\x93\\x12\\x92\\x0a\\x92\\x6a\\x90\\x3a\\x21\\xf5\\x4c\\x5a\\x47\\xba\\x0e\\x08\\x57\\xc8\\x88\\xc9\\x4c\\x93\\x55\\x90\\x6d\\x93\\x5d\\x27\\x97\\x24\\x37\\x41\\xde\\x49\\xfe\\x88\\xfc\\x13\\x05\\x3e\\x05\\x1d\\x85\\x77\\x8a\\x5c\\x8a\\x11\\x8a\\x4b\\x14\\xbf\\x29\\x15\\x29\\xcd\\x50\\x7a\\xa1\\x2c\\xa3\\x6c\\xa3\\x5c\\xa6\\x3c\\x4f\\xf9\\x95\\x0a\\x8f\\x4a\\x8f\\xaa\\x8c\\xea\\x03\\x35\\x37\\xb5\\x69\\x6a\\xaf\\xd4\\xdd\\xd4\\x4f\\x68\\x98\\x68\\x1c\\xd2\\x94\\xd2\\x5c\\xa5\\xf9\\x4d\\xcb\\x4e\\xab\\x47\\xeb\\x95\\xb6\\x84\\xb6\\x87\\x76\\x95\\xf6\\x0e\\x1d\\x31\\x9d\\x79\\xba\\x0c\\xba\\x49\\xba\\x67\\xf4\\xa2\\xf4\\xce\\xe9\\x7d\\xd0\\x2f\\xd1\\x3f\\x62\\x20\\x66\\x90\\x67\\x70\\xce\\x90\\xcf\\x30\\xc2\\xf0\\x9c\\x51\\x98\\xd1\\x03\\xe3\\x02\\x13\\x2d\\x93\\x53\\xa6\\x5d\\x66\\x2e\\x66\\x97\\xcc\\xad\\xcc\\x97\\x59\\x88\\x58\\xcc\\xb1\\x38\\x61\\xf1\\xcd\\x52\\xc3\\x32\\xcd\\xf2\\x8e\\x55\\x8a\\xd5\\x3e\\x6b\\x29\\xeb\\x3a\\x1b\\x26\\x9b\\x22\\x9b\\x25\\xb6\\x6a\\xb6\\x75\\xb6\\xd7\\xec\\xcc\\xec\\x16\\xd9\\x7d\\xb2\\x0f\\xb3\\xdf\\xe7\\x60\\xe1\\x70\\xc6\\x51\\xcd\\xd1\\xcb\\x71\\x12\\x0e\\xb8\\xc0\\x71\\x9d\\xe3\\x1e\\xc7\\x2b\\x8e\\x6f\\x9c\\x04\\x9c\\x4c\\x9c\\x22\\x9c\\x26\\x39\\x9d\\x71\\xe6\\x72\\xb6\\x72\\x2e\\x03\\xc2\\x59\\xce\\xfb\\x9c\\xf7\\xb9\\xd8\\xb8\\x6c\\x70\\xb9\\xe1\\xea\\xe4\\xba\\xca\\x2d\\xc2\\xed\\x17\\x00\\xd1\\x61\\x93\\x7a\\x00\\x01\\x00\\x00\\x00\\xea\\x00\\x46\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x01\\x00\\x02\\x00\\x16\\x00\\x00\\x01\\x00\\x01\\x66\\x00\\x00\\x00\\x00\\x78\\xda\\x75\\x52\\xcb\\x4a\\xc3\\x50\\x10\\x3d\\xb7\\xad\\x8f\\x62\\x2d\\x22\\x52\\x5c\\x66\\x21\\xae\\xda\\x34\\x8d\\x15\\x24\\x82\\xf8\\xc0\\x8a\\x52\\x5c\\x54\\xd1\\x8d\\x08\\x69\\x1b\\x6d\\xe9\\x4b\\xd2\\x88\\xb8\\xf3\\x2b\\xfc\\x18\\x97\\x2e\\x44\\xff\\xc0\\xcf\\xf1\\xe4\\x66\\x1a\\x9b\\xa2\\x84\\x99\\x7b\\x66\\xee\\xcc\\xb9\\xe7\\xce\\x0d\\x80\\x15\\x7c\\x20\\x0d\\x95\\xc9\\x02\\xd8\\xa3\\x45\\x58\\x21\\xc7\\x28\\xc2\\x29\\x2c\\xe2\\x4c\\x70\\x1a\\x26\\x1a\\x82\\x33\\x28\\xe0\\x45\\xf0\\x1c\\x8a\\x78\\x15\\x3c\\xcf\\xfc\\xbb\\xe0\\x05\\xec\\xe3\\x5b\\x70\\x16\\x39\\xb5\\x2e\\x78\\x09\\x6b\\x6a\\x43\\x70\\x0e\\x9b\\x6a\\x47\\xf0\\x32\\x6e\\xd4\\xad\\xe0\\x3c\\x2e\\xd5\\x9b\\xe0\\x55\\x14\\x52\\x79\\xc1\\x9f\\xc4\\x93\\xde\\x2f\\x58\\x29\\x07\\x35\\x8c\\x30\\x44\\x00\\x03\\x6d\\xb8\\x5c\\x5d\\xa2\\x16\\x73\\x0f\\x78\\x86\\x8f\\x2e\\xee\\xd1\\xd1\\xbb\\x27\\xcc\\x8d\\x18\\xf5\\xe1\\x31\\xb2\\x61\\xa1\\x42\\xdf\\x60\\xae\\x49\\x0b\\x68\\x87\\xb4\\x3e\\x59\\xa6\\x2b\\x9d\\x44\\x85\\x11\\xd7\\x38\\xc2\\xb0\\xf5\\xcf\\xfe\\x15\\x7b\\x7d\\x8c\\x79\\x7e\\xa8\\xce\\x60\\xa5\\x49\\xb3\\x74\\x4f\\x95\\xb6\\x1b\\x6b\\x48\\x32\\x94\\x62\\x86\\x24\\x6f\\x97\\x5c\\x86\\xbe\\x5b\\x40\\x5e\\x97\\xfb\\x1e\\x06\\x5c\\x7d\\xf4\\x98\\x1b\\xe1\\x6e\\xe6\\x86\\x66\\x22\\x4a\\xee\\x84\\xd3\\x19\\xe0\\x88\\x73\\xf1\\x35\\x6f\\x40\\xef\\x6a\\x95\\xd1\\x99\\xa1\\xf2\\x80\\xf9\\x50\\x79\\x9d\\x7b\\x2d\\x66\\x86\\x8c\\x3d\\x9e\\x6a\\xe0\\x91\\xb8\\xad\\x6b\\x42\\x2d\\x1d\\x3d\\xcd\\x03\\x4e\\xdb\\x65\\x5d\\x14\\x25\\x7b\\x8a\\xcc\\xcc\\x4e\\xc3\\xa6\\x0a\\x4b\\xbf\\x4b\\xc0\\x4e\\x07\\x65\\x7e\\x4f\\xfa\\x33\\xc9\\xf3\\xcb\\x65\\xb2\\xde\\xa7\\xee\\x32\\x95\\x4f\\x73\\x8e\\x99\\xa9\\xe3\\x94\\x77\\x38\\xc6\\x39\\x2e\\xe8\\x4b\\xc2\\xf9\\xf7\\x6b\\x5c\\xb3\\xa7\\xc9\\x19\\x4d\\xfe\\x94\\x8a\\xae\\xad\\xe9\\xfb\\x47\\xea\\x7d\\xad\\x6a\\x9b\\x3e\\x7c\\x13\\x87\\xde\\xd6\\xbe\\x1a\\xbf\\x53\\xf5\\x07\\x58\\x2b\\x74\\x6f\\x00\\x00\\x78\\xda\\x6d\\xd0\\x47\\x4c\\x93\\x71\\x18\\xc7\\xf1\\xef\\x03\\xa5\\x85\\xb2\\xf7\\x06\\xf7\\x1e\\xef\\xfb\\xb6\\x65\\xb8\\x5b\\xe0\\x75\\xef\\xbd\\x45\\x81\\xb6\\x88\\x80\\xc5\\xaa\\xb8\\x8d\\xe0\\xd6\\x68\\x4c\\xbc\\x69\\x5c\\x17\\x35\\xee\\x19\\x8d\\x7a\\x50\\xe3\\x5e\\x71\\x44\\x3d\\x78\\x76\\xc7\\x83\\x7a\\xd5\\x42\\xff\\xde\\x7c\\x2e\\x9f\\x3c\\x4f\\xf2\\x3c\\x79\\xf2\\x23\\x82\\xf6\\xfa\\x53\\x4b\\x15\\xff\\xab\\xcf\\x20\\x11\\x12\\x49\\x24\\x16\\xa2\\xb0\\x62\\x23\\x9a\\x18\\xec\\xc4\\x12\\x47\\x3c\\x09\\x24\\x92\\x44\\x32\\x29\\xa4\\x92\\x46\\x3a\\x19\\x64\\x92\\x45\\x36\\x39\\xe4\\x92\\x47\\x3e\\x05\\x14\\xd2\\x81\\x8e\\x74\\xa2\\x33\\x5d\\xe8\\x4a\\x37\\xba\\xd3\\x83\\x9e\\xf4\\xa2\\x37\\x7d\\xe8\\x4b\\x3f\\xfa\\xa3\\xa1\\x63\\xe0\\xc0\\x89\\x8b\\x22\\x8a\\x29\\xa1\\x94\\x01\\x0c\\x64\\x10\\x83\\x19\\xc2\\x50\\x86\\xe1\\xc6\\x43\\x19\\xe5\\x54\\x60\\x32\\x9c\\x11\\x8c\\x64\\x14\\xa3\\x19\\xc3\\x58\\xc6\\x31\\x9e\\x09\\x4c\\x64\\x12\\x93\\x99\\xc2\\x54\\xa6\\x31\\x9d\\x19\\xcc\\x64\\x16\\xb3\\x99\\xc3\\x5c\\xe6\\x31\\x9f\\x05\\x54\\x8a\\x85\\xa3\\xb4\\xd0\\xca\\x0d\\xf6\\xf3\\x91\\xcd\\xec\\x66\\x07\\x07\\x38\\xce\\x31\\x89\\x62\\x3b\\xef\\xd9\\xc4\\x3e\\xb1\\x8a\\x8d\\x5d\\x12\\xcd\\x56\\x6e\\xf3\\x41\\x62\\x38\\xc8\\x09\\x7e\\xf1\\x93\\xdf\\x1c\\xe1\\x14\\x0f\\xb8\\xc7\\x69\\x16\\xb2\\x88\\x3d\\xa1\\xa4\\x1e\\x51\\xcd\\x7d\\x1e\\xf2\\x8c\\xc7\\x3c\\xe1\\x29\\x9f\\xa8\\xe1\\x25\\xcf\\x79\\xc1\\x19\\xbc\\xfc\\x60\\x2f\\x6f\\x78\\xc5\\x6b\\x7c\\x7c\\xe1\\x1b\\xdb\\xa8\\xc5\\xcf\\x62\\x96\\x50\\x47\\x3d\\x87\\x68\\x60\\x29\\x8d\\x04\\x68\\x22\\xc8\\x32\\x96\\xb3\\x22\\x94\\xf2\\x4a\\x56\\xd1\\xcc\\x6a\\xd6\\xb2\\x86\\xab\\x1c\\x66\\x3d\\xeb\\xd8\\xc0\\x46\\xbe\\xf2\\x9d\\x6b\\x9c\\xe5\\x1c\\xd7\\x79\\xcb\\x3b\\xb1\\x4b\\xac\\xc4\\x49\\xbc\\x24\\x48\\xa2\\x24\\x49\\xb2\\xa4\\x48\\xaa\\xa4\\x49\\xba\\x64\\x48\\x26\\xe7\\xb9\\xc0\\x65\\xae\\x70\\x87\\x8b\\x5c\\xe2\\x2e\\x5b\\x38\\x29\\x59\\xdc\\xe4\\x96\\x64\\x4b\\x0e\\x3b\\x25\\x57\\xf2\\x24\\x5f\\x0a\\xa4\\xd0\\xea\\xad\\x6b\\x6e\\xf4\\xe9\\xb6\\x60\\xbd\\x5f\\xd3\\xb4\\xf2\\xb0\\x6e\\x4d\\xa9\\x7a\\x8f\\xa1\\x74\\x28\\x5d\\xca\\xd2\\x36\\x8d\\xd0\\xa2\\x52\\x57\\x1a\\x4a\\x87\\xd2\\xa9\\x74\\x29\\x8b\\x94\\xc5\\xca\\x12\\xe5\\xbf\\x7b\\xee\\xb0\\xba\\xba\\xab\\xeb\\xf6\\x1a\\xbf\\x37\\x18\\xa8\\xae\\xaa\\x6c\\xf2\\x85\\x47\\x86\\x19\\xd6\\x65\\x5a\\x2a\\x82\\x81\\x86\\xf6\\xc6\\x65\\x96\\xb5\\x69\\x7a\\xc2\\x7f\\x84\\x34\\x94\\x0e\\xa5\\xf3\\x2f\\x0f\\x26\\x9e\\xe4\\x00\\x00\\x78\\xda\\x45\\xce\\x3f\\x12\\xc1\\x50\\x18\\x04\\xf0\\x3c\\x8f\\x24\\x22\\xc8\\x3f\\x51\\x19\\x31\\xa8\\xde\\x8c\\x8e\\x19\\xd1\\x4a\\x1a\\x8d\\x51\\x25\\xc6\\x05\\x5c\\x40\\xad\\x51\\x72\\x0a\\x07\\xf8\\xa2\\x72\\x3b\\x76\\xf8\\x3c\\xdd\\xfe\\x76\\xb6\\xd8\\xa7\\x78\\x5d\\x48\\x5c\\x8d\\x0d\\xd9\\xdb\\xa2\\x12\\xe2\\x56\\x56\\xb9\\xa9\\x8a\\x11\\x79\\xe5\\x86\\xa2\\x1d\\xc2\\xb9\\x1c\\x90\\xa9\\x0e\\x85\\x41\\x32\\xc9\\x48\\xaa\\x35\\xd5\\x93\\xec\\x21\\x87\\x35\\xf5\\x41\\x03\\xa8\\xff\\x60\\x02\\x8d\\x3b\\xc3\\x02\\xcc\\x3d\\xc3\\x06\\xac\\x94\\xd1\\x04\\xec\\x25\\xc3\\x01\\x9a\\x53\\x46\\x0b\\x70\\x26\\x0c\\x17\\x68\\x8d\\x19\\x6d\\xc0\\x1d\\x31\\x3a\\x40\\xbb\\xff\\x85\\xa0\\x2e\\xff\\xf2\\xd0\\x76\\x57\\x35\\x55\\xc9\\xfc\\x04\\xfa\\xa0\\x37\\xd7\\x0c\\x40\\xff\\xa8\\x19\\x82\\xc1\\x7f\\x1c\\x81\\x61\\xaa\\xd9\\x03\\xa3\\xa5\\x66\\x0c\\xf6\\x16\\x9a\\x7d\\x30\\x9e\\xfd\\x58\\x52\\xa4\\xde\\x75\\xba\\x5b\\x0c\\x00\\x00\\x00\\x01\\x53\\x59\\xec\\x4c\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\x06\\xa9\\x28\\xa4\\xec\\x60\\x00\\x00\")\n\nfunc fontsRobotoBoldWebfontWoffBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoBoldWebfontWoff,\n\t\t\"fonts/roboto-bold-webfont.woff\",\n\t)\n}\n\nfunc fontsRobotoBoldWebfontWoff() (*asset, error) {\n\tbytes, err := fontsRobotoBoldWebfontWoffBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-bold-webfont.woff\", size: 24812, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoRegularWebfontEot = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x64\\x97\\x63\\x70\\x1c\\x00\\xdb\\xae\\x37\\xc6\\x46\\x1b\\x6e\\x6c\\x36\\xd8\\xb0\\x61\\xbb\\xb1\\x6d\\x36\\xb6\\xed\\x6e\\x6c\\xdb\\x4e\\x63\\x35\\xb6\\x6d\\x35\\x6c\\xec\\xa4\\x71\\xdb\\xa8\\x39\\xf3\\x9e\\x39\\xe7\\xc7\\xf7\\xbd\\xd7\\x9f\\x67\\x9e\\xb9\\x67\\xae\\xb9\\xff\\xde\\x26\\xea\\x00\\x40\\x84\\x1a\\x00\\x00\\x0f\\x80\\x07\\x20\\x02\\xfe\\x73\\xff\\x3f\\x70\\x80\\x44\\x38\\x00\\x00\\x11\\xa0\\xa0\\x72\\x0d\\x0f\\xd8\\xd5\\xa7\\x02\\xa8\\x50\\xfd\\xbf\\xa4\\x00\\x0e\\x40\\x05\\x00\\xc0\\x29\\xbf\\xff\\xe6\\x6b\\x07\\xfc\\x17\\x18\\x00\\x35\\x80\\x13\\xc0\\x14\\xe0\\x04\\x70\\x07\\x38\\x01\\x00\\x00\\x2c\\x80\\x1a\\xc0\\x02\\x60\\x05\\xf0\\x00\\xd8\\x03\\x4c\\x00\\xae\\x00\\x00\\x80\\x15\\xa0\\x05\\xb0\\x00\\xb8\\x02\\xdc\\x00\\x36\\x00\\x27\\x80\\x23\\x80\\x0a\\xc0\\x09\\x60\\x07\\x70\\x02\\x20\\x00\\x08\\x80\\x13\\xc0\\x03\\xe0\\x04\\x08\\x01\\xa8\\x00\\x5c\\xff\\xf7\\xe3\\x06\\x00\\x00\\x64\\xff\\xc3\\x48\\xf5\\x5f\\x3e\\x00\\x40\\x4c\\x5d\\x5a\\xe5\\x7f\\xf7\\x40\\x00\\xb8\\x4b\\x00\\xb8\\x72\\x00\\x5c\\x45\\x00\\x56\\x1a\\xdc\\x99\\xb3\\xe8\\x71\\x6f\\x3d\\xed\\x09\\x6b\\x7d\\x17\\xb9\\xaf\\xde\\x34\\x66\\x9d\\xae\\xac\\x56\\xac\\x92\\x7f\\x18\\xfe\\x20\\x89\\x07\\x6f\\x91\\x0c\\xf7\\x46\\xff\\x7e\\x78\\x4d\\x45\\xad\\x87\\xc6\\xde\\xb2\\x6a\\x18\\x63\\xd4\\xc4\\x1a\\xc3\\x9d\\xb5\\xb7\\x20\\x97\\x8f\\xa0\\x0f\\xd9\\xd1\\x99\\xd4\\xb8\\x2c\\x81\\x52\\x9c\\xd0\\xe7\\x48\\x48\\x30\\xcd\\x8b\\x0a\\x38\\x7b\\x0d\\x4d\\xac\\xb0\\x30\\x93\\xac\\x38\\xb9\\x7a\\x89\\x02\\x15\\xca\\x8d\\x3d\\x2d\\xb9\\xf9\\xb3\\xf7\\x24\\xa2\\xbf\\x67\\x86\\xb8\\x0a\\xae\\x88\\xd6\\x34\\xfa\\x89\\xf2\\xdd\\xf3\\x9e\\xa8\\xc9\\xf4\\xf9\\x30\\x48\\x70\\xcb\\xb4\\x46\\xfe\\x3d\\x67\\x41\\x3e\\x22\\x1c\\x32\\x4c\\x14\\x9c\\x22\\xe0\\xd9\\x99\\x4d\\xaf\\x5a\\x83\\x34\\x47\\xaa\\x99\\x23\\x21\\xbe\\xf7\\xd4\\x7e\\xfb\\xc9\\x3f\\xa5\\x81\\xe0\\x65\\xeb\\xe5\\xae\\xd8\\x63\\x52\\xc3\\x58\\x2f\\xa0\\x0d\\x0b\\x8b\\x24\\x27\\xc9\\x95\\x50\\x08\\x10\\x23\\x63\\x02\\x30\\x9d\\x0c\\xe3\\xce\\xf7\\xcb\\x18\\x93\\x67\\x8e\\xf2\\x36\\x8c\\x45\\x69\\xd7\\x6a\\x92\\xd5\\x1a\\x76\\x23\\x3e\\xbc\\xa9\\x6a\\xf9\\x16\\xcc\\x42\\xf5\\xd0\\x42\\x6d\\xa3\\x75\\x5a\\xd6\\x99\\x71\\x91\\xf0\\x58\\x96\\x1b\\xf8\\xdd\\x27\\xef\\x08\\xe4\\x30\\xc9\\x73\\xf2\\xa7\\x99\\xcf\\xe8\\x8c\\xed\\xeb\\x6f\\xe6\\x7f\\x5b\\x4b\\x24\\x6c\\x4b\\x55\\x5f\\x9c\\xa5\\x4c\\xaa\\xfa\\xdb\\x00\\x5a\\x5f\\x15\\x5e\\x8d\\x64\\x0a\\x5b\\x59\\x99\\x3e\\xb7\\x71\\xc7\\xf2\\x06\\x56\\x67\\x25\\xe1\\x9f\\x10\\x93\\x2b\\xa1\\x07\\x46\\xf9\\x7f\\x55\\x68\\x49\\x6e\\x72\\xe2\\x9e\\xaa\\xe6\\x63\\x61\\x3b\\xf2\\x8c\\x5a\\x65\\xf6\\xd6\\xdf\\xab\\xb8\\x03\\xcf\\x40\\x3f\\x86\\xe8\\x50\\x1a\\x23\\xeb\\x2a\\x0d\\x70\\x9a\\x7e\\xe8\\x4f\\xc8\\x00\\x29\\xed\\xce\\xcd\\x92\\x04\\x52\\x14\\x18\\xee\\xc3\\x03\\xdd\\x37\\x22\\x70\\x62\\xd0\\xee\\x08\\x94\\xab\\xc2\\x6c\\x58\\x87\\x4b\\xad\\xad\\x2d\\x0f\\x49\\xd0\\x2c\\xf6\\x75\\x36\\x93\\x05\\x25\\xf3\\x56\\xf1\\x8b\\xa2\\x91\\x1a\\x7a\\xd9\\xc0\\x36\\x8e\\xe5\\x54\\x39\\x65\\x48\\x87\\x58\\xe4\\x20\\x2b\\x66\\x6b\\x2b\\xff\\xaa\\xe4\\x51\\xa9\\x73\\x8b\\x12\\xb7\\x08\\xb9\\x22\\x81\\xcf\\x6f\\x73\\x6e\\x81\\x8d\\xac\\xae\\x9f\\x6b\\x0c\\xed\\x0d\\x42\\x5c\\x5c\\xc2\\xda\\x8a\\xba\\xbe\\x1b\\xa1\\xa7\\xce\\x17\\xea\\x25\\x9b\\x3a\\xed\\xea\\x16\\x02\\x1c\\xf8\\x79\\xe0\\x52\\xc2\\xe4\\x69\\xf8\\x36\\x60\\x6c\\x88\\x5a\\x05\\x2b\\x41\\x46\\x30\\x70\\x08\\x0e\\xac\\x4e\\x74\\x87\\x1f\\x3b\\xdb\\xf4\\xc1\\xd9\\xd9\\x59\\xcb\\x4c\\x3d\\xfc\\x00\\xe0\\xb3\\x8b\\x0d\\x76\\xaf\\x41\\xd5\\x31\\xd6\\xfd\\x61\\x4c\\x00\\x25\\xa2\\x4a\\xe3\\xc6\\x17\\x43\\xfc\\x11\\xca\\x49\\x40\\xc3\\x32\\xa6\\x12\\x1d\\x30\\x0c\\x65\\x8d\\x05\\xaf\\x90\\x55\\xc7\\x72\\xbb\\xbb\\x99\\x1e\\x06\\x85\\x37\\xf2\\x4b\\xb1\\x58\\x9a\\x52\\xb2\\xa2\\x49\\xa1\\x75\\xa0\\x65\\x10\\xc6\\xb2\\x98\\x57\\x8c\\x36\\xa5\\x11\\x17\\xea\\xec\\x95\\x48\\xd5\\x02\\x7f\\x67\\x6a\\x2f\\x1a\\x67\\x9f\\x4a\\x13\\x42\\x8b\\xeb\\x9c\\xc2\\x8c\\x25\\x12\\xf4\\x9c\\x27\\x16\\xc8\\xf8\\x21\\x03\\x26\\x2c\\xf1\\x47\\xa2\\x26\\x65\\x63\\x95\\x3a\\x08\\x28\\x97\\xc4\\xef\\x82\\xc0\\x98\\x4b\\x99\\x4f\\x5e\\x04\\xf0\\x9f\\x36\\x71\\xf9\\x93\\x0a\\xba\\x9f\\x8c\\x24\\x9f\\xe4\\xec\\x16\\xb9\\xe1\\xf6\\xdc\\x7f\\x91\\x5a\\x65\\xfb\\x2c\\x90\\x7f\\x4c\\x31\\x02\\x58\\x9c\\x26\\x36\\x5d\\x7e\\x0a\\x48\\x9c\\x9e\\x3f\\xa3\\xa4\\x2d\\xd2\\x92\\x76\\x63\\x62\\xd1\\x08\\x12\\x84\\xe7\\x7a\\xb2\\xa9\\x95\\xdc\\x0b\\x52\\x08\\x8a\\x97\\x10\\x53\\xa8\\xc4\\x40\\xc3\\x40\\x03\\x2e\\xe9\\x68\\x19\\x00\\x61\\x1f\\x92\\x6d\\x94\\x55\\x2e\\xdf\\x64\\x41\\x83\\xe2\\xb1\\x05\\x85\\x7a\\xf2\\x09\\xb7\\xf3\\x54\\xa2\\xd0\\xde\\x7d\\x2c\\xa4\\xb7\\x24\\x11\\xf5\\x10\\xe7\\x88\\xe1\\xd0\\x3d\\x74\\x01\\x18\\xc3\\xac\\x68\\xfa\\x2d\\xe9\\xa1\\x33\\x6d\\x2c\\x4c\\xec\\x0e\\x03\\xec\\x5f\\x22\\x13\\x4b\\x32\\x3c\\x4d\\x33\\xc1\\x0d\\x7d\\x8a\\x98\\x54\\xab\\x06\\x37\\x5b\\xc6\\xca\\xb3\\xe8\\xfb\\xb9\\xcc\\x86\\x27\\x93\\x28\\xd8\\x88\\xf2\\x37\\xe6\\x0c\\x22\\xa0\\x61\\x30\\x99\\x04\\x85\\x87\\x47\\x5e\\x0d\\xef\\xcc\\x4f\\x9a\\xb8\\x80\\x12\\x2a\\x93\\xc8\\x5b\\xb8\\x98\\xd2\\x14\\xf2\\x0c\\x22\\x53\\x18\\x4b\\x65\\x13\\xc9\\x2c\\x87\\x27\\x62\\x68\\x2a\\x79\\xce\\x7d\\x97\\x64\\x24\\xc4\\x35\\xb0\\x72\\x6d\\x13\\xab\\x82\\xab\\xd1\\x67\\xc1\\xdd\\xe8\\xd6\\x34\\x5b\\x31\\xae\\x56\\x31\\xbf\\x65\\x7d\\x70\\x0f\\x5f\\x62\\x23\\x4e\\xb1\\xf5\\x49\\x1f\\xfa\\xc5\\xb4\\x60\\xae\\x15\\x54\\x14\\x72\\xf3\\x74\\x49\\x4a\\x4e\\xbd\\x54\\xeb\\x54\\x50\\xb9\\x25\\x81\\xd0\\xe3\\x24\\x14\\xf4\\xa6\\xaf\\x31\\xdd\\xb8\\x63\\x8e\\xf0\\x15\\x9d\\x32\\xfb\\x5c\\xc5\\xd3\\x70\\xfc\\xe1\\x71\\x08\\xda\\xe5\\xc1\\xfd\\x8e\\xa2\\x0e\\xd2\\x6a\\x11\\x44\\x21\\x12\\xc9\\x7c\\xd9\\x6a\\x07\\xa9\\x1b\\x9c\\x60\\xf3\\x78\\xe8\\x8a\\x65\\x8b\\xc8\\x63\\x47\\xc6\\xe3\\x02\\x45\\xe2\\x06\\x72\\xd8\\x5d\\x0a\\x9c\\xd2\\x04\\xb6\\xc5\\x3f\\x21\\x52\\x12\\x2b\\xf9\\xe2\\x43\\x0a\\x53\\xb9\\xe7\\x3d\\x72\\x7a\\xb8\\xcd\\xaf\\xbe\\x20\\x15\\x04\\x53\\x15\\x7c\\x0c\\x10\\xfa\\x41\\xc2\\x47\\x16\\xac\\x31\\x12\\xda\\x56\\xdf\\x7c\\xff\\x17\\xd2\\x47\\x0c\\x2b\\xbf\\x35\\x76\\x17\\xf6\\xd6\\xef\\xd4\\xd4\\x84\\xc8\\x08\\xe1\\xd1\\xf4\\x52\\x8c\\xbb\\xd3\\x7a\\xd6\\x6b\\xad\\xe3\\xc2\\x0b\\xe2\\x37\\x44\\xb9\\xd6\\x50\\x01\\x86\\xc5\\xe5\\x19\\x29\\x17\\x52\\x74\\xe3\\x0e\\xd9\\x81\\x78\\x26\\x95\\x64\\x3e\\x9e\\xaa\\xcd\\x5a\\x5b\\x0b\\xc6\\xda\\xd2\\xaa\\x56\\x51\\x75\\x0e\\x53\\x6d\\xa4\\x32\\x2d\\xee\\xcb\\x8e\\x7d\\xd9\\x09\\xe7\\x2c\\xc0\\x7d\\xe3\\x51\\xc8\\x17\\x0f\\xc1\\x49\\x63\\xfe\\x41\\x4a\\x68\\x8e\\xc4\\x4e\\x1a\\x4c\\xff\\x01\\x2f\\xb8\\x05\\xf0\\xf4\\x0e\\xbe\\x92\\x42\\x5c\\x3a\\x2c\\xcd\\xd3\\xfa\\xd9\\x4a\\xe4\\x40\\xad\\xff\\xb2\\x3c\\xd9\\xde\\x76\\xae\\xb4\\xc5\\x4b\\x52\\x66\\xed\\x2d\\x0d\\x7b\\x9a\\xb2\\x33\\x4e\\x4b\\xb9\\x2c\\xd2\\x43\\x13\\xb2\\x8c\\x46\\xbf\\x01\\xb1\\x68\\xc5\\xd4\\xc0\\xaf\\xc0\\xd1\\xef\\x16\\x0b\\xa8\\x66\\xa5\\x5a\\x25\\x2f\\x99\\x76\\x3a\\x14\\x8f\\x79\\xbf\\x77\\x4a\\x00\\x1f\\x0f\\x8d\\x01\\x60\\x71\\xe4\\x11\\x9d\\xb6\\x67\\x32\\x29\\x0f\\x9c\\x15\\x39\\x26\\x2a\\x97\\x03\\xb9\\x62\\x29\\x20\\x27\\x3b\\x4d\\x70\\x68\\x35\\x2e\\x8b\\x6e\\x2b\\xc4\\x37\\x08\\x56\\xe9\\x4f\\x86\\x0f\\x25\\xc1\\xc0\\x8c\\x16\\x47\\x8e\\xa3\\x8f\\xae\\xf1\\x4e\\x9a\\x9e\\x2d\\x85\\x0c\\xdc\\x2f\\xb9\\xa0\\x13\\x28\\x27\\x4c\\x0a\\x48\\xb7\\x81\\x33\\x51\\x5e\\x49\\x9c\\x53\\xe1\\x3b\\xed\\xf7\\x91\\xd1\\xb6\\x53\\x29\\xc5\\x8d\\xd1\\x10\\x42\\x62\\x86\\xdb\\x31\\xcb\\x1a\\x45\\x11\\xab\\x35\\x82\\xf3\\xd4\\x68\\x86\\x6a\\x61\\x97\\xed\\x61\\xc3\\x9c\\x35\\x3a\\xf0\\x02\\x09\\x73\\x5d\\xc5\\xd5\\x41\\xfa\\x74\\xa1\\xa4\\xd8\\x6d\\xfa\\x53\\x2c\\xfa\\x20\\xc9\\xfa\\x17\\x49\\x53\\x02\\x3b\\xcf\\xfc\\x2f\\xb3\\xec\\xb7\\x1f\\x81\\x77\\x05\\x1a\\xb7\\x9c\\x8a\\x0d\\x1e\\xdb\\x83\\x0e\\x27\\xf3\\x4b\\x2a\\xe4\\x83\\x8c\\xfe\\x17\\xdb\\xc4\\x94\\xd9\\xc6\\xca\\xea\\x09\\x24\\x97\\x70\\xf2\\x55\\xf2\\x88\\xc7\\x0e\\x3b\\x9a\\x37\\xad\\xc2\\xd9\\xd3\\xd6\\xd0\\xfc\\xe9\\x45\\x57\\xe8\\x94\\xb8\\xd0\\xf3\\xe6\\x98\\x94\\x7e\\x46\\x3c\\x67\\x0d\\x9e\\xb0\\x53\\xb4\\x10\\x10\\x39\\x01\\x8f\\x9d\\xc7\\x92\\xa3\\x50\\xe2\\x00\\x96\\xe9\\x26\\x4d\\xbc\\x1f\\x4d\\xa9\\x96\\x80\\x0c\\xcb\\xce\\xe6\\xe3\\x31\\xbd\\xa3\\x3b\\x0e\\xbf\\x27\\x8b\\x51\\xa0\\x38\\x5a\\xfc\\x71\\x38\\x43\\x56\\x72\\xbc\\xa7\\x05\\x78\\xc1\\x88\\x41\\xfd\\xe4\\x33\\xb8\\xb0\\xa4\\x8f\\x18\\x3a\\x50\\x0b\\x09\\x1d\\x59\\xc5\\x84\\xbe\\x94\\x37\\x9a\\xd6\\x77\\x79\\x44\\x3e\\x32\\x78\\xbe\\x52\\xc5\\x08\\x7d\\x4d\\x0c\\x3d\\x61\\x79\\x7f\\x94\\xde\\x92\\xec\\xad\\x76\\x98\\x8b\\x17\\xb2\\xb9\\x67\\xc8\\x42\\x79\\x2e\\x14\\xea\\x35\\xcb\\x66\\xfe\\x5d\\xa9\\x40\\xf2\\x71\\x3a\\x75\\x78\\x54\\xc0\\xc2\\x0b\\x6f\\xd7\\xcc\\xbf\\xf1\\xc2\\xa0\\xe2\\x93\\xea\\xb4\\x20\\x58\\x28\\xc7\\x5b\\x3e\\x10\\x6f\\x77\\x3c\\xd4\\x01\\x8e\\x23\\x10\\x55\\xc1\\xb5\\x44\\x49\\xb1\\x3b\\xbd\\x8d\\x13\\xb2\\xcb\\x08\\x49\\xcc\\x84\\x23\\x1b\\x30\\x17\\x6d\\x87\\xe8\\x9e\\x39\\x9a\\xe0\\x44\\x3b\\x33\\x80\\x78\\x7e\\x68\\x04\\x90\\x1b\\xaa\\x0f\\x6d\\x5c\\xc1\\xcd\\xf6\\x84\\x84\\x6c\\x19\\x6a\\x87\\xac\\x7b\\xb4\\x26\\x5f\\x98\\x8f\\x58\\xdb\\xd1\\xa9\\x75\\xdc\\xa1\\xae\\x11\\x0a\\x61\\xbe\\x55\\x4c\\xc3\\x95\\xc8\\xc1\\x95\\x48\\xcd\\xf3\\xbd\\x27\\x97\\x84\\xf3\\xa2\\xc5\\xcc\\xf8\\x0e\\xcc\\x75\\xb8\\x2f\\xa3\\x0c\\x7e\\x57\\x85\\x4c\\x0e\\x86\\xed\\xc8\\x3e\\x5f\\x94\\xde\\x27\\xb8\\x27\\xf8\\xf5\\xe0\\x4f\\xb7\\x3c\\x33\\x33\\xfd\\x91\\xa5\\xf9\\x53\\xfa\\xed\\xbe\\xd4\\x05\\x45\\xdc\\x9a\\xb0\\xc0\\x76\\xc6\\xe8\\xd1\\x23\\xe0\\x11\\xb5\\x2d\\xcb\\x00\\xc0\\x69\\x84\\x85\\x92\\xea\\xcc\\x8c\\x31\\xbe\\xeb\\x48\\x77\\x5a\\x9a\\xf7\\x10\\xae\\xa7\\x10\\x03\\xf8\\x57\\x1c\\x36\\x52\\x5c\\x12\\x54\\x41\\xd6\\xa2\\x0a\\x74\\x83\\x39\\x34\\x54\\xd1\\x84\\x9b\\xfd\\x79\\x5f\\x1e\\x1f\\x79\\x54\\x05\\x3a\\x68\\x88\\x23\\x89\\x92\\x11\\xe4\\x8f\\x38\\xb8\\x48\\xb2\\x56\\x93\\xa9\\x37\\xa0\\xf4\\x0e\\xef\\x98\\x46\\xa3\\x63\\x17\\xcf\\x8b\\x8d\\xb3\\xa1\\xc2\\x22\\x13\\xc5\\x72\\x4b\\x61\\x88\\xaf\\x0b\\xa4\\xb5\\x04\\xc8\\xb1\\xd6\\x79\\xa7\\x15\\x0d\\x00\\xad\\xcf\\x68\\x28\\x5d\\x82\\x4f\\xa3\\x5c\\x25\\x21\\xdc\\x25\\xc0\\xe8\\x08\\xa4\\x31\\xc8\\xe0\\xc7\\xd1\\xc2\\x1c\\x7b\\x78\\x24\\x6b\\x2a\\x3d\\x78\\x6a\\xb3\\x79\\xe0\\xdc\\x98\\xa4\\xfd\\xb8\\xd1\\x84\\x2a\\xd5\\x95\\x60\\x78\\x88\\x60\\x51\\xe6\\x65\\x91\\xe4\\xd4\\xc3\\xb5\\xdb\\x10\\xfb\\x7e\\x9a\\x5e\\x65\\xfa\\x39\\xa1\\x95\\xaf\\xca\\xaf\\x87\\x86\\xa9\\x46\\x55\\xbe\\xe8\\x13\\x01\\x7a\\x3f\\xe8\\x5e\\x6d\\x98\\xaa\\x14\\xb5\\x93\\x8e\\x9c\\x6a\\x66\\xba\\x61\\x4a\\x44\\x4a\\x71\\x9d\\x53\\x52\\xd7\\xac\\xc2\\x5f\\xaa\\x35\\x82\\xc6\\x4f\\x54\\x5f\\x0f\\xb3\\xd7\\xc3\\x3a\\x09\\x75\\xa0\\x7f\\xfb\\x42\\xf6\\x82\\x8e\\x68\\x6a\\x83\\xf8\\x13\\x33\\x20\\xb2\\x6e\\xa9\\x46\\x68\\xbf\\x47\\x9e\\x10\\xa2\\xa5\\xee\\x1a\\xfc\\xb1\\x10\\x0e\\xca\\x90\\x44\\x46\\xed\\x58\\x19\\x9e\\xd3\\xb7\\x49\\xd8\\xe7\\x3a\\x77\\xff\\x09\\xa3\\x9f\\x71\\xa2\\x8a\\xa8\\x99\\xc9\\x4b\\x61\\x60\\x53\\x2d\\xac\\x19\\x2a\\x4e\\x8b\\x56\\xfe\\xed\\x30\\x5e\\xbc\\xaa\\x6c\\x81\\xfd\\x85\\x77\\xa4\\x4b\\xfe\\xbd\\x31\\x96\\xa6\\x8b\\x78\\x6e\\x0d\\xd2\\xc2\\xb3\\xd1\\xfc\\x29\\xe6\\xd8\\xe4\\xa4\\x4f\\x7e\\x63\\x16\\x09\\x2a\\x9d\\x1a\\x83\\x89\\x93\\x93\\x5c\\x4e\\x0c\\x99\\x91\\xbc\\xe6\\x4b\\x78\\x64\\x3b\\x08\\xb5\\xae\\x5d\\xa9\\x12\\x85\\xec\\x3d\\xf4\\x98\\x32\\x88\\x8d\\x76\\x9c\\x10\\xc9\\xe2\\x1f\\xc4\\x32\\xf2\\xc2\\xde\\xe8\\x58\\x6c\\xbf\\xd4\\xb8\\x79\\xf4\\xb6\\x2a\\x9e\\x0a\\x13\\x47\\x60\\xea\\xb5\\x44\\x64\\x4a\\x9b\\x51\\x61\\xc9\\xe8\\x8d\\x04\\x33\\x14\\x21\\xcb\\x68\\xc9\\xbb\\x8e\\xa4\\x33\\x40\\xfb\\x17\\x4c\\xa2\\xb1\\xe0\\xb1\\x4d\\x08\\x67\\x8a\\x1d\\x83\\x1a\\x99\\xd4\\x54\\x73\\x96\\xb4\\x12\\xe1\\x73\\x8b\\x96\\xc1\\x58\\x05\\xf1\\xb6\\xee\\x8c\\x19\\x4c\\x55\\xa6\\x7f\\xd0\\x9a\\x1a\\xc4\\x09\\x6b\\x2d\\xce\\x61\\xa4\\xda\\xa6\\x13\\x2a\\x28\\xee\\x5b\\x04\\x28\\xe3\\xd6\\x7d\\x1a\\xbf\\x0d\\x37\\x3d\\x73\\xc9\\x46\\x3a\\xba\\xcb\\x23\\xf8\\xae\\x4f\\x3b\\x56\\x46\\xab\\xc9\\xbf\\x3c\\x7c\\xc8\\xc1\\x2e\\x4a\\x11\\x28\\x42\\xe6\\x64\\x3d\\xfb\\xbb\\xc4\\x3b\\x5d\\x76\\xf0\\x4d\\x5e\\x81\\x3d\\xb2\\xc7\\x8b\\xf4\\x7b\\xd6\\x80\\xd6\\xd4\\xe7\\xf5\\x36\\xb1\\x0b\\x5b\\x99\\x21\\x91\\x2e\\xeb\\x9f\\xee\\xbf\\x87\\x88\\x46\\x8a\\xd7\\xc4\\x03\\x45\\xa8\\xea\\x3f\\x48\\x9c\\xb6\\xe5\\xc4\\x1b\\x73\\xf7\\xf3\\x92\\x13\\x52\\x6a\\xb7\\xc5\\xf9\\xa9\\x70\\xcf\\x1c\\x1d\\xb8\\x4f\\x62\\x7f\\x4b\\x09\\x41\\xc4\\x32\\x9e\\xbb\\x71\\x11\\x1d\\x68\\x45\\x41\\x2f\\x5b\\xe3\\xe8\\x79\\xa0\\xea\\xc0\\x32\\xc4\\xfa\\xc4\\xf3\\x17\\x1c\\xe1\\x3d\\x5b\\x76\\xe3\\xf3\\x28\\xe5\\x71\\x57\\x80\\xd0\\xb1\\xdd\\x4f\\xe1\\x9b\\x9b\\xc7\\xa5\\x80\\xf6\\xed\\xc1\\xa7\\x93\\x9c\\xab\\x3e\\xb5\\x41\\x16\\xeb\\x9c\\x5f\\x00\\x1d\\xbb\\xed\\x62\\x27\\xf6\\x85\\x17\\xeb\\x25\\x06\\x21\\x8b\\x71\\x1c\\x8a\\x82\\xda\\xe7\\x0d\\x1f\\x70\\x39\\x37\\x99\\x85\\xf7\\xbe\\x34\\x78\\x4f\\x83\\x00\\x18\\xd2\\xb9\\x0c\\x0e\\x25\\x40\\x4d\\x7d\\x40\\x29\\x80\\x73\\x18\\xff\\xb8\\x2f\\xf0\\x6f\\xfe\\x7c\\x67\\x3a\\x68\\xac\\x88\\xf9\\x33\\x69\\xbf\\x28\\xb1\\xdd\\xa6\\x6d\\x7c\\x80\\x82\\xf4\\xe4\\x69\\x11\\xb0\\x0f\\x80\\x83\\x09\\x3b\\x50\\x26\\x4f\\xe7\\x1b\\x6c\\x71\\xb8\\xa1\\x54\\x21\\xda\\x65\\xf2\\x60\\x15\\xe3\\x12\\x94\\x88\\xbc\\x5e\\x83\\x09\\x43\\x05\\x4d\\x6a\\xe4\\x20\\xaf\\xe7\\x2d\\x6d\\x72\\xf1\\xf1\\x74\\x52\\x0c\\xcb\\x36\\xc6\\x41\\x79\\xb8\\x87\\xcb\\x84\\xec\\xb4\\x47\\x1f\\x09\\x79\\xdb\\x32\\xad\\x20\\x84\\xfe\\x56\\x65\\xb8\\xc9\\x07\\x67\\xd1\\x6d\\x9e\\x17\\xc5\\x87\\xdb\\x01\\x65\\xaa\\xd1\\x05\\x7a\\x2d\\xe3\\xdc\\xfa\\xc8\\x46\\xe0\\x86\\xc6\\xf0\\x2d\\x5a\\x1a\\x5e\\xb4\\x4f\\xd9\\xac\\xa0\\x6f\\x4f\\x0e\\xb1\\x36\\xec\\x21\\xcc\\x62\\x08\\x9d\\x5b\\xf2\\x47\\xad\\x63\\x52\\xa2\\xb9\\xc1\\x19\\x89\\xc5\\xc6\\xf2\\xbf\\x75\\x77\\x07\\xb6\\x98\\xa4\\x6b\\x20\\xb1\\x05\\xfc\\xf8\\x39\\x64\\x42\\xb4\\x19\\xea\\x05\\x2c\\x49\\xe7\\xf3\\x9e\\x56\\x49\\x10\\x9c\\x32\\x48\\x82\\x33\\xa9\\x64\\xfb\\x2e\\xda\\x45\\x07\\x68\\xeb\\xeb\\xf6\\x6b\\x98\\xf9\\x85\\xf0\\x10\\x56\\x24\\x76\\xb0\\xb3\\xf7\\x5f\\x2a\\xd4\\x71\\xbc\\x21\\x38\\x34\\x36\\xe3\\xc3\\x3f\\x49\\xc9\\xd0\\x50\\xd4\\x7c\\xcc\\x60\\x43\\xf1\\x70\\xf4\\xa5\\xd3\\xb5\\xd1\\xbc\\x47\\x21\\xcf\\xe3\\x1b\\x38\\xdf\\xfd\\xfc\\xe9\\x66\\x3a\\xeb\\x7b\\xba\\xac\\xab\\x50\\x0c\\x96\\xc8\\x53\\xe0\\xb7\\x38\\x10\\x99\\x4d\\x45\\xfb\\xa6\\x77\\x02\\x93\\x38\\xe9\\x53\\xda\\xfe\\x86\\x8c\\x2e\\x22\\x96\\x71\\x74\\xbc\\x13\\xa1\\xc1\\xa4\\x73\\x3a\\xcf\\x2f\\x16\\xe2\\x3d\\x17\\x5d\\xe3\\xda\\x79\\x06\\x27\\xd5\\x12\\xb7\\x48\\xfd\\x53\\x2c\\x75\\x43\\xa9\\xe0\\xba\\x62\\x72\\x90\\x13\\xf3\\xb4\\x03\\xa8\\xbf\\x2e\\xf1\\xe6\\x5b\\xfa\\x86\\x55\\x99\\x41\\xf3\\xc1\\x33\\x97\\x5a\\xe9\\x05\\x92\\x27\\x69\\x95\\x85\\x4b\\x4b\\x78\\x4e\\x1f\\xc0\\x2a\\x78\\x48\\x5b\\xf5\\x5e\\x50\\xd3\\x14\\xf7\\x73\\x7f\\x9a\\x1c\\x9e\\xb3\\xd3\\xfe\\xa7\\x47\\x4f\\x86\\x20\\x12\\x26\\x16\\x70\\xf8\\x32\\x0f\\x9e\\x40\\x65\\xc8\\xe1\\x3f\\x41\\x15\\xe1\\x07\\xe5\\xb4\\xa8\\x07\\x7e\\xec\\x32\\x04\\xf3\\xae\\xf1\\x02\\x4c\\x08\\x79\\xcd\\x11\\xf8\\x69\\x8b\\x1f\\xd1\\xea\\x4f\\x5f\\x85\\x26\\x0a\\xd1\\x8a\\xcc\\xcf\\x10\\x82\\xd0\\x9e\\xc4\\x50\\x78\\xf4\\x20\\xbc\\x00\\xc4\\x40\\x14\\xab\\x92\\x16\\x95\\x54\\xc2\\x42\\x7f\\x07\\xc9\\xbd\\x0d\\xbf\\x2e\\x11\\xd4\\x16\\xaa\\xf3\\xe2\\x96\\x7f\\x8e\\x78\\xf9\\x5b\\xeb\\x99\\xe2\\x82\\x21\\xea\\x62\\xdd\\x43\\x2c\\x0b\\x80\\x75\\xea\\x13\\x86\\xc6\\x28\\xa5\\xf1\\xa5\\x84\\x5f\\x65\\x24\\x77\\xe4\\x43\\x47\\x47\\x3f\\x73\\xa2\\xb7\\xa0\\xf1\\x9f\\x28\\x06\\x17\\x42\\xbf\\xae\\xaa\\xa9\\xfa\\x9a\\x60\\xd0\\xbf\\x6f\\xa3\\xfb\\x0e\\xc0\\x99\\x8e\\x49\\xca\\xa4\\xff\\x5d\\x0e\\x1b\\xc1\\xec\\xac\\x0c\\x0f\\xa3\\xba\\xd5\\xa8\\x3d\\x42\\x67\\x52\\x53\\x03\\x18\\x5d\\x8c\\x2c\\x67\\x79\\x28\\x7e\\xf6\\x6b\\x82\\xa1\\x78\\x01\\x23\\x51\\xe5\\x68\\x1e\\x7b\\xe9\\x81\\xb1\\xcb\\xb8\\x72\\x56\\x0a\\x84\\xea\\x14\\xc4\\xb5\\xda\\x2d\\xf2\\xd4\\x26\\x3a\\x1a\\xa2\\x61\\x5f\\x48\\x26\\xe4\\xe1\\x57\\xa2\\x68\\x82\\x7f\\xa5\\x73\\x6a\\xed\\xd1\\x34\\x75\\xa0\\x93\\xf8\\x70\\x10\\x91\\x59\\x60\\x28\\xd3\\x7b\\x3a\\xa0\\xdd\\xdc\\x3f\\x2e\\x8e\\x2b\\x24\\x68\\xc1\\x39\\x28\\xf8\\x0f\\xb6\\xf0\\xc2\\x21\\xe7\\xcc\\xe2\\x86\\xd8\\xe5\\x1a\\xda\\xef\\x6e\\x2e\\x99\\x68\\x11\\x30\\xee\\xc6\\xeb\\x04\\xd8\\x7c\\xb0\\x4a\\x46\\x4a\\xb5\\x46\\x32\\x56\\x9f\\x8b\\x84\\xfa\\x50\\x67\\xd7\\x9b\\x26\\xfe\\xbd\\xca\\x0c\\xca\\x5f\\x48\\x81\\xe3\\xf2\\x59\\xb9\\x46\\xf5\\xd6\\x41\\x77\\x51\\x85\\xe7\\xc4\\xc6\\xc1\\xa6\\x5d\\xe1\\xe1\\xae\\x5e\\x9e\\x09\\xb8\\xbd\\xa2\\xc9\\xb1\\x70\\x5b\\x96\\x23\\x3f\\xe3\\xd9\\x17\\x53\\x38\\x52\\x69\\x22\\xe9\\xb4\\x57\\x96\\x6f\\x41\\xa9\\x82\\x8b\\x8c\\xfe\\xbe\\xd7\\xd7\\xf5\\x33\\xab\\xba\\x86\\xa8\\x49\\xe6\\x44\\xe5\\xe0\\xce\\x6b\\xde\\xfc\\x4e\\x93\\x81\\x9c\\x2e\\x4a\\x96\\x42\\xb7\\x5f\\x9c\\x79\\x2a\\x55\\xa4\\xaf\\x8a\\x38\\xe7\\xf4\\xa8\\x4a\\x03\\xc0\\x11\\x84\\xdb\\x18\\x52\\x51\\xc1\\x84\\x8f\\x7a\\xcd\\xbe\\xd7\\xb7\\x63\\x74\\x13\\xba\\x1a\\xac\\x50\\x7f\\xf8\\x85\\x7e\\x22\\xc0\\xd4\\xee\\x6c\\x5f\\xe3\\xf2\\xf1\\xdb\\xc7\\xc9\\x6b\\x96\\x03\\x11\\xe7\\x19\\xac\\x14\\xa7\\xf1\\x1f\\xeb\\xf7\\x1c\\x90\\xb6\\x84\\x42\\xab\\xc4\\x80\\x3e\\xef\\xbf\\x92\\x59\\xf4\\x6a\\x25\\x34\\xc1\\x8a\\xaa\\x6f\\xea\\x3f\\xfd\\x0d\\x17\\x6c\\x0a\\x09\\x46\\x79\\x01\\x72\\x53\\xc9\\x91\\x58\\xc2\\x1f\\x58\\xd7\\x02\\x07\\x7e\\xf1\\xfe\\x64\\x99\\xd4\\xef\\xd1\\x24\\x45\\x0d\\xdc\\xb6\\x90\\x6c\\x5e\\xcf\\x81\\x8e\\xef\\x5b\\x82\\x77\\xb5\\x8e\\xf1\\x38\\x23\\xbf\\xec\\x18\\x86\\x0d\\x24\\x39\\x07\\x99\\xb9\\xe4\\x2d\\x49\\xe8\\xe7\\x80\\x32\\x1f\\xd9\\x0c\\x13\\x5e\\x54\\x27\\x70\\xd9\\x9c\\x5b\\x0f\\xd1\\xb6\\xeb\\x96\\xd4\\x9b\\x88\\x00\\x85\\xe0\\x2b\\xa1\\x72\\x39\\x51\\xa3\\x81\\xf9\\xe0\\x91\\x49\\x04\\x09\\xa0\\xbf\\x3c\\x00\\x8a\\x5a\\xb6\\x96\\xc1\\x6b\\x42\\x42\\x1d\\x44\\x3f\\xe7\\xfa\\x9b\\x90\\xf2\\x83\\xd2\\x7b\\x7f\\x1c\\xef\\x24\\xa8\\xad\\xce\\xa5\\xc8\\x10\\x06\\xce\\xc7\\xf6\\x1b\\x62\\x0f\\xf4\\xd2\\x30\\x48\\x59\\x51\\x7f\\x6a\\xc4\\x62\\x6c\\xed\\xef\\x07\\x79\\x77\\x22\\x77\\x7d\\x09\\x24\\xd2\\xd8\\x74\\x32\\xa1\\xdb\\x57\\xed\\x4c\\x16\\xc3\\xb1\\xc9\\x23\\x20\\x1c\\x96\\x9d\\x6b\\x4b\\x6c\\xa2\\x6c\\xa8\\x47\\x72\\x50\\x18\\x23\\xe4\\x0b\\x43\\x76\\x5c\\x30\\xca\\xc9\\x04\\xeb\\xe5\\x0e\\x11\\x18\\xc8\\x45\\x62\\x7c\\x90\\xd1\\x97\\x5b\\x32\\x34\\xd5\\x7a\\x68\\x80\\x7d\\xec\\xb6\\xb1\\x36\\xef\\xdc\\xea\\x55\\x5f\\x58\\x0a\\xf7\\xcb\\xe5\\x0e\\x53\\xdc\\xfc\\xf3\\x52\\x2b\\xd1\\xff\\x36\\x5c\\x35\\x1d\\x38\\xc6\\x65\\xd8\\x78\\x9c\\x63\\xa5\\xa6\\xc2\\xca\\xd6\\x23\\xe7\\x13\\x01\\x5c\\x92\\x2a\\xbf\\x9c\\x95\\xe7\\x87\\x60\\xc3\\x6d\\x85\\xa2\\x7c\\xf6\\xba\\x4e\\x11\\x6e\\x53\\x08\\xbc\\x2f\\x0c\\x24\\x66\\x39\\x48\\x8c\\x39\\x10\\x3c\\x22\\x94\\x2d\\x12\\x51\\xef\\xc9\\xf6\\xb4\\xf1\\x03\\x10\\xb0\\x5d\\xf2\\x2f\\x61\\xd0\\xce\\x88\\x92\\x4f\\x93\\xea\\x99\\x7b\\x50\\x36\\xb7\\xb2\\x65\\x6d\\xae\\xce\\x4e\\x55\\xef\\x78\\xc9\\x3e\\x4c\\xfc\\x7d\\xf9\\x11\\x3f\\xc5\\xff\\x74\\x16\\x74\\xce\\x7e\\xe6\\x93\\x97\\xb5\\x56\\x86\\x6f\\xcb\\x2b\\x29\\x77\\x38\\x2b\\xd9\\x50\\x4d\\xa9\\x57\\xa1\\x54\\x67\\x6d\\xc2\\x8a\\x9f\\x4e\\x3b\\x99\\x90\\x0c\\x2f\\x98\\x56\\x1a\\x0f\\x5e\\x75\\x56\\x21\\xa6\\x0e\\xdc\\x3a\\x84\\x3e\\x20\\x21\\x45\\x06\\x9c\\xaa\\x67\\x82\\x12\\x4d\\x74\\xb2\\x5b\\x15\\xd1\\x0a\\x21\\x49\\xf8\\x17\\x78\\xbb\\xc3\\xe8\\x77\\x6e\\x0b\\x8c\\x81\\x85\\x4a\\xe5\\x54\\x44\\x6d\\x49\\x3d\\xe4\\x8d\\xeb\\x46\\xab\\xf3\\xe2\\xa8\\x09\\x0e\\xcf\\xf7\\x91\\xb8\\x2f\\x54\\x82\\x28\\xc1\\x51\\x71\\xa7\\xe8\\x29\\xc0\\x11\\xaf\\x10\\x1c\\x4d\\x10\\x11\\x1c\\x81\\xf2\\x74\\xf2\\xed\\x08\\x83\\x98\\xb3\\xf2\\x66\\xa6\\xce\\x1b\\xbe\\xe1\\xf5\\xf7\\xb5\\xb1\\x44\\x1e\\xe8\\x33\\x0d\\xc0\\xa8\\x65\\x8e\\x95\\xb8\\x87\\xe6\\xe0\\x33\\x03\\x93\\xe6\\xa8\\xf9\\x8c\\xe7\\x4a\\xf9\\x3e\\x8b\\x98\\xca\\xdc\\x0b\\x3a\\x97\\x56\\x87\\x10\\xfe\\x05\\xcb\\xc8\\xe2\\x5b\\x6e\\x81\\xf5\\xb4\\xf9\\xbe\\x60\\x02\\xaa\\xd9\\xc5\\xab\\xb9\\xb3\\xfa\\xe5\\x44\\xb4\\x57\\x10\\xb2\\xc5\\x10\\x2b\\x06\\xcc\\xdd\\xc6\\x7a\\xf7\\x4f\\x97\\xc6\\x22\\x60\\x52\\x79\\x79\\x67\\xea\\xdd\\x9b\\xe3\\x52\\x89\\x52\\xad\\x12\\xa6\\x43\\x83\\xd7\\x93\\x6a\\x83\\x22\\xd1\\x2b\\xd3\\x11\\x4d\\x42\\x11\\xa2\\x47\\xa8\\xd5\\x7c\\x0e\\x89\\xf5\\xf7\\xb3\\xfd\\xa6\\x5a\\x48\\xa8\\x9b\\xdf\\x26\\x97\\xc9\\x05\\x0a\\xe2\\xfa\\x2e\\xca\\x45\\xb3\\x8b\\x4d\\xe4\\x73\\xc8\\x01\\xff\\x8b\\x37\\x4f\\x72\\xdc\\xda\\x43\\xf6\\x73\\xd0\\x25\\xe5\\xe1\\x17\\xfd\\x0e\\x50\\x4f\\x69\\x57\\xb9\\x88\\xe3\\x8c\\x70\\x8f\\xd2\\xe8\\xba\\x87\\xf6\\x62\\xcb\\x12\\x8d\\xa1\\x23\\x04\\x6f\\xbe\\xdf\\x67\\xd8\\xd8\\x3b\\x04\\x97\\xdd\\xce\\x5b\\x83\\xb5\\xb1\\x80\\xfe\\x38\\x1a\\x76\\x33\\x45\\x24\\xb8\\x3d\\x8b\\x4f\\xa0\\x03\\xe5\\x8b\\xdf\\xe2\\x24\\x0b\\x58\\xcb\\xdf\\x1a\\x42\\x8b\\xe1\\x31\\xf7\\xab\\x89\\x1e\\x61\\xf8\\xc8\\xfe\\xbb\\xd6\\x4f\\x75\\xb3\\x72\\xee\\x45\\x7c\\x08\\x16\\x3e\\x99\\x6b\\x6e\\x9d\\x22\\x72\\x32\\x08\\x89\\xea\\xd8\\x80\\x61\\xb5\\xd0\\x9b\\x78\\xc8\\x81\\x0c\\x9d\\x6a\\x8b\\xd4\\xb7\\x7a\\x52\\xbb\\x49\\xe3\\x0c\\xc9\\xa7\\x60\\xf1\\xfb\\xb2\\xac\\xce\\x79\\xf0\\xf9\\x0d\\x9b\\xb3\\x27\\x6c\\x28\\x75\\xf3\\x88\\x92\\x67\\x7c\\x76\\x88\\xaa\\x8a\\x4a\\x15\\x9e\\xeb\\xbb\\xd4\\xc6\\xfe\\x65\\x5d\\xac\\x0e\\x1d\\xb2\\x89\\x6d\\x1c\\xcf\\xc0\\x88\\x64\\xaf\\xfa\\x64\\x2e\\xe2\\x15\\x00\\xd2\\x1d\\xff\\x38\\xd3\\x1f\\xbd\\xea\\x60\\x3c\\x8b\\x2f\\x5e\\x28\\x61\\xe7\\x4a\\x64\\x62\\xaa\\x7f\\xd0\\x45\\x93\\xe1\\xff\\x72\\xdb\\xee\\x6a\\x94\\x4b\\xa9\\xcb\\xe3\\x40\\x6c\\xbb\\xd3\\x84\\xcd\\x9b\\x96\\xa0\\x02\\xc2\\xa8\\x40\\x95\\x56\\x97\\x41\\x36\\x57\\x4a\\x07\\x1b\\x25\\x13\\x6f\\xa7\\x9c\\x6c\\x0a\\x62\\xb1\\x4b\\x54\\x92\\x5f\\x69\\x8d\\xa9\\x8e\\xfa\\x31\\x39\\x0c\\x81\\x86\\x74\\xa5\\x98\\xcc\\x87\\xac\\xb6\\x6b\\x63\\xaa\\x59\\xd6\\x16\\xe0\\xc6\\xd6\\xa2\\x3c\\x2c\\xe3\\x60\\x34\\x56\\x92\\x3c\\x51\\x55\\xe3\\x75\\x61\\x48\\x1d\\xaa\\xaa\\x77\\x78\\x3c\\x72\\xe1\\x1d\\x25\\xd5\\x88\\x8e\\x98\\x75\\xc9\\x02\\x3b\\x46\\x31\\x9b\\x5b\\xe8\\xde\\x34\\x84\\x43\\x3c\\xd3\\x20\\x19\\xf2\\x28\\x87\\x4e\\x49\\xe7\\x50\\x98\\xc7\\xe4\\xcd\\xcb\\x07\\x7a\\x48\\xa8\\xbf\\xeb\\x44\\xb7\\xb9\\x73\\x26\\x77\\xc2\\x1c\\xbe\\xd3\\xbc\\x75\\xdc\\xc5\\xfe\\xd8\\xff\\xc0\\xea\\x26\\x90\\x38\\x88\\x79\\xfb\\xfa\\x03\\xbf\\x5c\\x16\\x30\\x66\\xfc\\xbb\\x9b\\x00\\x58\\x94\\xb2\\x80\\x58\\xb6\\xb6\\xfe\\x0f\\x9d\\x9e\\x18\\x0d\\x49\\xcc\\x55\\x06\\x18\\x73\\x59\\x77\\xdc\\xcd\\x7b\\xa3\\x9d\\x28\\x88\\xe1\\xbb\\x6e\\x90\\x7f\\x46\\x8b\\x60\\xa5\\x56\\xc8\\xca\\xd8\\x9d\\x56\\xbc\\x9a\\x8c\\x9c\\x6d\\xc9\\xd1\\xdb\\x63\\xa9\\xa0\\x9b\\x02\\x98\\x81\\x1a\\x37\\xe4\\x7c\\x36\\x1a\\x12\\x6d\\x7d\\x3e\\x27\\x9d\\xc2\\xfd\\x93\\x50\\x56\\x3a\\x43\\x6a\\x04\\x6a\\xaa\\xb0\\x45\\xf6\\xf1\\x0c\\xf4\\x23\\x93\\xb3\\x06\\x30\\x87\\x40\\x43\\xb4\\xe8\\xb8\\xb7\\x46\\x16\\x7f\\x74\\x21\\x5f\\x86\\x21\\x4b\\xee\\x8d\\xd6\\xa6\\x68\\x71\\xe4\\x59\\x1a\\x7d\\x16\\x3d\\x1f\\x78\\xbb\\xbc\\x2b\\xcd\\x13\\x1b\\xa6\\x45\\xc4\\x11\\x31\\x9f\\x2a\\x1c\\x25\\x91\\x50\\x98\\x28\\x8f\\x67\\xfa\\x53\\x93\\x21\\xb7\\xdd\\x30\\x8a\\x6f\\x07\\x59\\x49\\xcc\\xc4\\xe8\\x54\\x17\\x0b\\x98\\x76\\xc6\\xf2\\xfd\\xa7\\x16\\x35\\xf1\\x8f\\x70\\x00\\x29\\x16\\xb9\\x74\\x19\\xae\\x65\\x72\\x1f\\xe1\\x27\\x8b\\x3a\\x49\\x44\\x0d\\x90\\x33\\xde\\xa0\\xda\\xa3\\x69\\x66\\xfe\\xaf\\x39\\xab\\x35\\xd4\\x4b\\x6d\\xc1\\xf6\\x87\\xe6\\xc5\\xf5\\x4f\\x25\\xfc\\xa4\\x6b\\x24\\x16\\xca\\x4e\\x92\\x79\\x53\\x59\\xe4\\x8e\\xec\\x66\\x1f\\xd2\\x92\\x7c\\x26\\xf2\\xe1\\x06\\x17\\x6b\\x4d\\x7e\\xde\\x06\\x6f\\x0c\\x5c\\x46\\x51\\xc2\\x29\\xa5\\x41\\x0c\\xa1\\x67\\xce\\x8b\\x77\\x52\\xbf\\x0f\\xa9\\xd9\\x21\\x15\\x63\\x2b\\xea\\x12\\xc1\\x9b\\x76\\x60\\x9f\\x2b\\x9a\\xa5\\x0f\\xa1\\x59\\x93\\xfa\\x9e\\x57\\x47\\x91\\x69\\xf3\\x77\\xa0\\x6b\\x6f\\x7a\\x44\\x67\\xa4\\xab\\x0d\\xfd\\xce\\x4f\\x6a\\x19\\x3d\\x5d\\x99\\xb9\\x59\\x80\\xf5\\xba\\xf2\\xb9\\xd2\\x53\\xeb\\x8f\\x38\\xaf\\xc8\\x80\\x25\\x01\\xa7\\x15\\xd5\\x89\\x4b\\x25\\xac\\x21\\x83\\xea\\x2d\\x48\\xb3\\x51\\xf0\\x8f\\x56\\x91\\xf3\\x2b\\x03\\x3a\\xe8\\xde\\xf7\\xaf\\x03\\x1f\\x58\\xaa\\xe3\\x25\\x1a\\x1b\\x68\\x76\\xf9\\x76\\xe0\\x3a\\x2f\\xb2\\xbb\\x4e\\x4c\\xa8\\xb1\\x50\\x94\\x75\\x8c\\x75\\xb7\\xe7\\x5f\\x51\\x08\\x9a\\xab\\xf3\\x20\\x2a\\x1a\\x55\\x12\\xa8\\xf9\\x84\\xaa\\x9e\\x20\\x51\\x0f\\x90\\x2f\\x3f\\x95\\xf3\\x37\\x56\\xc9\\x3b\\x0d\\x10\\x23\\x55\\x11\\xa5\\x7c\\x4f\\x2a\\x82\\xba\\xca\\x17\\x0b\\x07\\xb3\\x56\\x6c\\xba\\xd3\\x22\\x3e\\x78\\xb5\\x46\\x3a\\xea\\xef\\x4d\\xca\\x96\\x03\\x78\\x73\\x92\\x71\\xe3\\xaf\\x47\\x8d\\x41\\x42\\x9b\\x96\\xdc\\xeb\\x6c\\x6d\\x08\\x0e\\xae\\x34\\x0e\\xec\\x3c\\xb6\\x15\\x2e\\x59\\xd9\\x21\\x99\\x02\\x83\\x60\\x82\\xe8\\xc2\\xf6\\xeb\\x85\\xbe\\xf5\\x07\\x0b\\x95\\x61\\xff\\xcb\\x5d\\x63\\x78\\x2a\\xc7\\x6c\\x4c\\x11\\xb6\\x4b\\x69\\xd9\\x9e\\x60\\xc7\\xc5\\xd3\\x9d\\x65\\x8d\\x50\\xdf\\x2d\\xe0\\x42\\xb6\\xe5\\x99\\xe2\\xfe\\x0d\\xad\\x31\\xbb\\xee\\x20\\x96\\x3b\\x77\\xf0\\xf6\\xd7\\xae\\x38\\xdf\\x52\\xb3\\xdf\\xb5\\x4a\\x99\\xac\\x52\\x14\\xef\\x1a\\x08\\x5e\\x3f\\x6a\\x9a\\xcd\\x0d\\xd7\\xe2\\xbe\\x17\\x23\\xea\\xb5\\xa7\\xc1\\x36\\x7f\\x32\\xe2\\x5e\\x20\\x30\\x88\\xc9\\xb8\\xf6\\xfa\\x48\\xd0\\x92\\xa0\\xd0\\xcd\\x36\\xec\\x50\\x6e\\x5c\\x80\\x3e\\xe0\\x97\\x64\\x6d\\x55\\x94\\x99\\xd6\\xdc\\xe9\\x21\\x82\\x59\\xa6\\xb5\\x54\\x95\\xb7\\x3f\\x72\\xf9\\x62\\x0e\\xa4\\x68\\x84\\x43\\xfc\\xda\\x6d\\xec\\x72\\x45\\xd4\\x71\\x60\\x3b\\x21\\x0c\\x5b\\x74\\x41\\x14\\x96\\xba\\x1e\\x24\\xb8\\x7f\\x9c\\xf4\\x08\\x62\\xbf\\x8b\\xd5\\x7c\\x19\\x33\\x8b\\x1e\\x83\\xdb\\xb6\\x4c\\x4a\\x20\\xf9\\xbc\\xcd\\xbe\\x2d\\xd6\\x05\\x54\\xa2\\x70\\xdf\\x95\\x42\\xa8\\x6c\\x32\\x4e\\x8e\\xa2\\xfd\\x11\\x52\\x1f\\x3f\\x3b\\xb2\\x4a\\x00\\x22\\x95\\x8c\\x43\\x7d\\x33\\xe1\\x39\\x25\\x84\\xfb\\xbe\\x5c\\x05\\xbc\\x82\\xbf\\xfd\\xf5\\xd8\\x34\\x14\\xa5\\x1a\\xea\\x81\\x42\\x15\\x35\\x2d\\x68\\xc7\\x4b\\x3d\\xd8\\xdf\\xa5\\xb8\\x43\\x24\\x7a\\x63\\x4c\\x45\\x9b\\x9a\\xd0\\x48\\x2c\\x7c\\x2e\\xd1\\x13\\x3f\\x1b\\xf3\\xa1\\x87\\x39\\x39\\xc0\\xe3\\x08\\xd2\\xaa\\xb1\\x3a\\x50\\xd2\\xb1\\x54\\xaa\\x53\\x20\\x6c\\xf9\\x7d\\xe5\\x4e\\x53\\xc2\\xe6\\xc3\\xec\\x1c\\x3d\\xfa\\xc6\\xf9\\x53\\x2d\\xfa\\xf8\\xe0\\x49\\xd5\\xca\\xd9\\x60\\x43\\x21\\xb0\\xef\\xd9\\xb2\\x75\\xca\\x11\\xf9\\xd9\\x40\\x5f\\x0b\\xc9\\x15\\xbc\\xd0\\x60\\x55\\x4e\\xdd\\xaa\\xab\\xa4\\xcc\\xce\\xcf\\xcc\\xad\\x34\\xd7\\x7b\\x2f\\x0d\\x71\\x8d\\xe9\\x77\\x93\\xe6\\x47\\xad\\x5c\\x35\\x2b\\x64\\x65\\x3e\\x7e\\xef\\xe5\\x8d\\x42\\x71\\x88\\x54\\xd6\\x25\\xc8\\x55\\x68\\x70\\x2f\\x87\\x8d\\xb0\\x2b\\xce\\xd0\\x03\\x3a\\xd5\\x9b\\xd7\\xc2\\x75\\x2a\\xc2\\x08\\x24\\x90\\x51\\x56\\x13\\xac\\x55\\x22\\xb2\\x11\\x51\\x27\\x27\\x44\\x75\\x42\\xb3\\x0f\\x43\\x8f\\x10\\x74\\x62\\x67\\x09\\xd3\\x9d\\x24\\x0e\\x3c\\xd9\\x23\\xe8\\x62\\xc8\\x70\\x01\\xe1\\x47\\x8c\\x62\\xfd\\xee\\x47\\xa1\\xcc\\x1a\\x39\\x63\\x7d\\xf9\\xba\\x9f\\xab\\xe9\\x73\\xb3\\xe6\\x88\\x45\\x1d\\xaa\\xe2\\xe9\\x82\\xd5\\x5e\\x12\\xd6\\xc7\\x57\\xc1\\x9a\\x05\\x06\\x0a\\x48\\xfd\\x0f\\x8a\\x35\\x57\\xf1\\x59\\xd9\\x52\\xdb\\x52\\xe5\\x5a\\xdf\\xb2\\x78\\x53\\x4a\\xc9\\x34\\x62\\x06\\xc2\\xfe\\xa6\\x96\\x9f\\x14\\xfa\\x3f\\xeb\\x01\\x73\\xf1\\xab\\x1d\\xb8\\xd6\\xdf\\xbf\\x4a\\xf1\\xa0\\x79\\x70\\xac\\x98\\x61\\x89\\x97\\xcd\\x1c\\xd3\\x4c\\xac\\x18\\x54\\x3b\\xab\\x0e\\x68\\xa2\\x91\\x3b\\xa4\\x47\\x11\\xfc\\x75\\x65\\x44\\x2f\\x51\\xd5\\x09\\xa3\\x74\\x55\\x2b\\xbf\\xcc\\x43\\xe7\\xc3\\xd5\\xd2\\x74\\xf3\\xfc\\x44\\x77\\x5a\\xe9\\x00\\x44\\x9a\\xf7\\x96\\xd3\\x6a\\x97\\xc9\\x06\\xe2\\x20\\x0c\\x25\\x0e\\xea\\x1d\\x56\\x4b\\xfc\\xa3\\x27\\x9e\\x7d\\xbf\\xc4\\xa1\\x66\\xee\\x61\\x60\\x75\\xfb\\x7d\\xc2\\xd4\\x41\\x43\\xfb\\x85\\xae\\x58\\x2d\\xcd\\xe7\\xe4\\x60\\x4d\\x5f\\xa1\\x03\\x5d\\x4b\\x4f\\x02\\xdf\\x24\\x89\\x04\\x5e\\x69\\x98\\x8e\\xa5\\x50\\x03\\x15\\x52\\xb8\\xfb\\xe1\\x61\\x97\\xf4\\x4c\\x6c\\x75\\x44\\x7c\\x26\\xf5\\x99\\x35\\x49\\x7a\\xb3\\x76\\xc4\\xaf\\x8a\\x59\\x8a\\xc4\\x41\\x15\\x21\\x12\\x72\\x95\\x37\\xcd\\xa4\\xcb\\xdf\\xb6\\xc7\\x86\\xfc\\x45\\x11\\x3e\\x5f\\x54\\x8d\\x34\\xe5\\x88\\xe5\\xc7\\x43\\x36\\xd2\\x4f\\x32\\x3c\\xbb\\xcc\\xdf\\x16\\xcc\\x21\\xe6\\x17\\x0f\\x50\\xa9\\x76\\x4a\\xab\\xd4\\x55\\xc7\\x52\\x99\\x6b\\x67\\xbd\\xec\\x7c\\x2c\\x53\\xff\\xa4\\x70\\x05\\xdd\\xd0\\xaf\\x5c\\x4c\\x3c\\xcb\\xe7\\x7a\\x0f\\xe6\\x6d\\x6d\\x99\\x23\\xc4\\xc8\\x16\\x13\\xc9\\xeb\\xb4\\x10\\x7d\\x63\\x8c\\xfe\\xfc\\x1d\\x3c\\x3a\\x05\\xfb\\x7d\\x1a\\x3d\\x77\\x59\\x31\\x57\\xa2\\xfc\\xe0\\x9b\\xb8\\x03\\x33\\xdf\\x01\\xf8\\x81\\xfa\\x91\\xfb\\xf0\\xa0\\x40\\x39\\x60\\x5c\\x02\\x19\\xb5\\x79\\x7c\\x47\\x0c\\xb7\\x54\\x84\\x3b\\xde\\x0f\\xf1\\xc9\\x06\\x8d\\xe1\\xc4\\xc4\\x20\\x38\\x02\\x55\\x07\\xa9\\xb3\\xa6\\x98\\xc7\\x83\\x78\\x84\\xe5\\x98\\xdf\\x53\\x63\\x75\\xd1\\x6b\\x8a\\x48\\x75\\xfc\\x86\\x8f\\x10\\x22\\x8b\\xc2\\xfd\\x69\\xae\\xf8\\xc4\\x2e\\x87\\x9f\\xee\\x98\\xab\\x7e\\x1f\\x98\\x36\\xfe\\x25\\x74\\x84\\xea\\x5f\\xc0\\xd8\\x2c\\xf9\\x12\\xa5\\x16\\x13\\xb0\\x46\\xba\\x49\\x3d\\x52\\x4a\\x68\\x1d\\x95\\x79\\x44\\x08\\xe1\\x07\\x7b\\x25\\xd8\\x1d\\xc4\\x7f\\xf1\\x4a\\x1e\\x0c\\xbc\\x38\\xd1\\xa1\\x78\\x67\\x29\\xba\\x48\\xfb\\x71\\x0c\\x15\\xde\\x1f\\xd1\\x50\\x24\\x54\\x90\\x9b\\x52\\x49\\x1c\\xfd\\xe4\\x74\\x5d\\x28\\xed\\x6f\\x93\\x9a\\x68\\x75\\xc7\\x49\\x72\\x36\\x3a\\x88\\x43\\x62\\x88\\x76\\x58\\x53\\x4f\\x66\\x66\\x40\\x30\\x89\\xe1\\x46\\x8f\\x08\\x6d\\xeb\\x0d\\x75\\x0a\\xfe\\xc8\\x70\\xdb\\x73\\x1e\\x15\\xb9\\x0f\\x6d\\x66\\xd3\\x7f\\xef\\xb5\\xff\\xc8\\x7e\\xfc\\x7e\\xff\\xf1\\xa2\\x7c\\x00\\x5e\\xa0\\x86\\xc4\\x70\\xef\\x9d\\x7e\\x11\\x3f\\xce\\x31\\xda\\x15\\x4e\\xff\\xf8\\x86\\xb0\\xed\\x71\\xe2\\xee\\x06\\x91\\x3f\\x7a\\x9f\\xa3\\x29\\x47\\xdd\\xc7\\x52\\xa3\\x13\\xc7\\x14\\xff\\xe2\\x97\\xe9\\x76\\x73\\x32\\x4b\\x22\\xa3\\x37\\xea\\x3e\\x01\\x4f\\xd3\\x7c\\xbe\\x3c\\x2d\\xea\\x5c\\x61\\x68\\xf9\\xa6\\x49\\xcb\\x0b\\xd4\\xb4\\x90\\x82\\x4f\\xa3\\xc0\\x70\\xd6\\x77\\xbf\\x41\\xb7\\x25\\x76\\xc5\\x85\\x9f\\xb0\\x65\\xc8\\xbb\\x84\\xed\\xf3\\x94\\x58\\xfc\\xeb\\xe2\\x96\\x74\\xcb\\x98\\x9e\\x83\\x00\\x9f\\xaa\\xab\\xc7\\xbf\\xa7\\x8d\\xa7\\x83\\x2c\\x7a\\xec\\xe5\\xfd\\xe7\\xca\\x93\\x53\\x29\\x42\\xca\\x4b\\xfe\\xcd\\x56\\x53\\xe9\\x8d\\xf1\\x05\\xee\\xaa\\x22\\x3a\\xdf\\x4e\\x9a\\x18\\xfa\\x79\\xb2\\x6f\\x2c\\x84\\x03\\xed\\xc5\\x9a\\x3a\\x3c\\x9e\\x4e\\x12\\x12\\x8d\\xa8\\x71\\xe6\\x69\\x9c\\x4f\\x06\\xf6\\x0f\\xb1\\x88\\xb5\\xe4\\x29\\xe8\\x78\\x9d\\xde\\x1a\\x95\\x76\\x75\\x6f\\xfa\\xc6\\xd9\\x25\\xdd\\x1f\\x73\\x23\\xa0\\x90\\x7e\\x0f\\x45\\x9c\\xa6\\x2c\\x9f\\x53\\x54\\xc4\\x5f\\x32\\xdf\\xe6\\x28\\x01\\x42\\x71\\x0d\\x82\\x01\\xe4\\x51\\xd5\\x05\\xd5\\x29\\x7c\\xbc\\xae\\xd5\\xdc\\x0f\\x1d\\x4a\\x83\\x26\\x05\\x9d\\x50\\xcb\\x6d\\x83\\xc5\\xb1\\x33\\xa4\\x75\\x46\\xb0\\x30\\x3e\\x21\\x39\\x20\\x45\\x2d\\x62\\x4f\\x02\\x78\\xbe\\xee\\x84\\x58\\x0d\\x1d\\x0c\\x02\\xcd\\xf2\\x0d\\x02\\x55\\x79\\xbc\\xe9\\x9b\\x8a\\xfc\\x80\\x5a\\xbf\\x0c\\x3c\\x5a\\x2f\\xbc\\x5f\\xc2\\x2b\\xe5\\xb5\\x03\\xa0\\x85\\x93\\x8f\\x5e\\x7f\\x9f\\x8c\\xe1\\x99\\x8d\\xc6\\x67\\x10\\x98\\xa3\\xbd\\x7b\\x6a\\xa0\\xf7\\xc2\\x15\\x1d\\x35\\x1c\\xd3\\xdb\\xaf\\x83\\x35\\x6d\\x78\\xcc\\x51\\x11\\x0b\\xd7\\xc2\\x05\\x41\\x15\\x1a\\xe5\\xaf\\x42\\xea\\xf0\\x30\\xae\\x70\\xfc\\x7c\\xda\\x91\\xad\\xa4\\xe6\\xf2\\xbd\\xbe\\x5e\\x9c\\xb5\\x1a\\xb0\\x61\\xb5\\xba\\x23\\xa7\\x8e\\x3e\\x15\\xfc\\xb7\\xbf\\xa6\\x74\\xa4\\xcc\\x78\\x0d\\x8e\\x08\\xe5\\xe5\\x73\\xb6\\x98\\xe8\\x0d\\x10\\x20\\x3c\\x37\\xab\\xc8\\x06\\x3c\\x7c\\xfc\\x9a\\x7b\\xf1\\x5e\\xbf\\x5a\\xea\\x67\\xd2\\x86\\x2e\\x38\\xf8\\xe9\\x0a\\x56\\x56\\xcd\\xb7\\x1f\\x23\\xb8\\x38\\x7b\\x6c\\x06\\xfd\\x2c\\xc9\\x43\\x31\\x36\\x4f\\xa2\\x6b\\xdc\\xae\\x21\\x5b\\xaf\\x49\\x22\\x5e\\x4c\\xcf\\xc4\\xb2\\xa3\\xe2\\xf0\\x03\\xc8\\x22\\x15\\x41\\xcb\\x43\\x87\\xc7\\x97\\x4d\\xbc\\xdc\\xb5\\xe5\\xf0\\xa1\\x33\\xe2\\x3f\\x8c\\x5e\\x7d\\xa0\\x5f\\x79\\xe2\\xf7\\x32\\xa8\\xd8\\x86\\x36\\xba\\x0e\\x99\\x87\\x85\\xae\\x0a\\x0c\\xbe\\xd2\\x08\\xc7\\xde\\xbb\\x21\\x30\\xb0\\x69\\xae\\x11\\xa6\\xed\\x61\\xb0\\x7a\\x86\\x0c\\xe0\\x1c\\xbd\\xc0\\xbb\\x3c\\x7d\\xf1\\x22\\x66\\xbc\\xe4\\x4c\\xbb\\x97\\x1d\\x47\\xfa\\x56\\x3e\\xa0\\x50\\xc7\\x16\\x99\\xcc\\x59\\x05\\x43\\x7a\\xad\\x68\\x30\\x45\\x65\\xea\\xf3\\xa3\\x5b\\xe5\\x28\\xcf\\xc5\\xfa\\xf5\\x9d\\x8a\\x82\\x49\\xe8\\xeb\\x53\\x7e\\xad\\xa9\\x9c\\xa4\\x03\\x53\\xf7\\x9c\\x12\\xfd\\x6f\\x15\\x85\\x03\\x83\\xa4\\x52\\x4d\\x35\\x1d\\x4c\\xaa\\x1b\\xef\\x6f\\x68\\xda\\x74\\x1d\\x7f\\xf7\\xa8\\x90\\x31\\xc4\\x59\\xef\\xd0\\x7d\\x16\\x37\\x49\\x01\\x90\\x46\\xb0\\x58\\xc5\\xf0\\xa5\\xbb\\x41\\xd8\\xb5\\xa7\\xba\\xd4\\xf5\\xf2\\xf5\\x15\\x19\\xc2\\xf0\\xe3\\xa6\\xd8\\x1f\\x0c\\x56\\x72\\xde\\xc3\\x29\\xc9\\x0f\\x6d\\x3f\\x15\\x58\\xd2\\xbf\\xbd\\x45\\xf3\\x9c\\xc1\\x8c\\x08\\x05\\x3b\\x33\\x2e\\xdc\\x22\\x8a\\x30\\x2e\\x84\\x3c\\x04\\x57\\x45\\x21\\x8a\\xbc\\x42\\x0d\\x91\\x95\\x0d\\x98\\xc2\\x07\\xdd\\x48\\x75\\x2f\\x49\\xe8\\x01\\xe1\\x18\\xa5\\xf2\\xe2\\xff\\x4c\\x4f\\xd3\\x4a\\x48\\x43\\x6b\\x12\\x60\\x4e\\x2c\\x92\\x88\\xf1\\x30\\x4e\\x72\\xc5\\x3b\\x4d\\x00\\x34\\x8b\\x02\\x56\\x89\\x53\\x6d\\x38\\xe1\\x4a\\x07\\x6f\\xe8\\x89\\x31\\x3a\\x14\\x3a\\x0d\\x55\\xfc\\xf6\\x8a\\x90\\xe3\\xcb\\x92\\x50\\x25\\xe7\\x49\\xcb\\x39\\x13\\x6c\\xc6\\x6d\\xb2\\x34\\x97\\x17\\xd8\\xec\\xdb\\xb4\\xe0\\xbf\\x11\\x11\\xf0\\x73\\xa9\\x4b\\xa1\\x46\\xd9\\x2c\\x90\\x7e\\x76\\x2f\\x5c\\x19\\x35\\x14\\x5d\\xd3\\x32\\xbd\\x10\\xff\\x87\\xb5\\xe5\\x00\\xd8\\xcf\\x2b\\xcc\\xa4\\x68\\x94\\x9c\\x85\\x51\\x14\\xf3\\x99\\x1d\\x1d\\x0e\\xd1\\x9e\\x55\\x6e\\x3c\\x5e\\xff\\x87\\xea\\x78\\x97\\x8c\\x08\\xe6\\x2f\\xc3\\x76\\x66\\x2d\\xe4\\x2d\\xa4\\x85\\xbb\\x1a\\x46\\xe7\\xec\\xae\\xa1\\x26\\x2e\\x24\\x18\\x32\\x19\\xde\\xd6\\xf3\\x9f\\x9d\\x9f\\xa1\\xed\\x7d\\x28\\x88\\x9a\\x4b\\x1b\\xb6\\xf3\\xd2\\x8c\\x7c\\x28\\x77\\x39\\x1d\\x21\\xf2\\x64\\xb9\\xfa\\x2c\\x55\\xac\\xb3\\x91\\x5b\\x06\\x3d\\x95\\x21\\x75\\x54\\xc4\\xeb\\x2a\\x7c\\xd0\\x6a\\x74\\x46\\x8a\\xd1\\x8c\\x06\\xb7\\x83\\x5e\\xe0\\x58\\x93\\xec\\x87\\xdb\\xbd\\xbb\\xcb\\xa3\\x3b\\x3f\\xc4\\xdb\\x41\\x37\\x7a\\xda\\x20\\xc3\\x35\\xb6\\x74\\xd4\\xc3\\x7a\\xf1\\xaf\\xe9\\xf2\\x68\\xa7\\xd3\\x9a\\xbd\\x6b\\x4c\\x95\\xf0\\x39\\xb5\\x1d\\xaa\\xbf\\xa4\\x4a\\x35\\xe4\\x3b\\xd9\\xb3\\xb3\\x3e\\x9c\\x58\\x8a\\x99\\x09\\xe3\\x3b\\x99\\x4e\\x34\\xfb\\x74\\xd2\\xa3\\xcd\\x5d\\xe8\\x32\\xa6\\x47\\x75\\x90\\xb4\\x71\\x53\\x97\\x92\\xa7\\xe8\\x5f\\x44\\xb3\\x83\\xe1\\xc0\\x29\\x49\\xcd\\x4d\\x7f\\x99\\x7e\\xb2\\xa0\\x21\\x0f\\xdb\\xc9\\x9e\\x72\\x48\\xaa\\xb7\\x96\\x8f\\xbd\\x08\\x45\\x72\\x77\\xce\\x06\\xa1\\x56\\xcc\\xd4\\x0b\\xd1\\x9c\\x23\\x99\\x76\\x8e\\xcb\\xea\\x10\\xc1\\xe1\\xd8\\x7a\\x75\\x5a\\x6c\\x45\\x79\\xc8\\xd8\\xc1\\x9d\\x80\\x10\\x90\\xe7\\x94\\xf8\\x6b\\xf1\\xfd\\x3e\\xb7\\xbd\\x0a\\x3b\\x1e\\x04\\x3d\\x4c\\x58\\x7b\\xcb\\xd1\\xfc\\x88\\xef\\x24\\xed\\xf9\\xae\\xc5\\xd0\\x91\\x4f\\x8a\\x53\\xc4\\xb5\\xf0\\xdd\\x94\\x62\\x5b\\x89\\x07\\x8e\\x87\\x7d\\x48\\xc9\\xa2\\x19\\x53\\x97\\x87\\xad\\x4a\\x4d\\xd1\\x4e\\x73\\xea\\x0f\\xaa\\x58\\xa4\\xc8\\x7d\\x36\\xef\\xe2\\xed\\x2b\\x3f\\x6d\\x52\\x16\\x6b\\xbb\\x76\\x85\\x53\\x33\\xe9\\xb3\\x76\\xc8\\x1e\\xfa\\xbc\\x39\\x82\\xe5\\x3b\\x5c\\x34\\x6c\\x57\\xca\\x42\\x2b\\xbb\\xcb\\xad\\x9f\\xc4\\x87\\xf2\\x59\\x4a\\x80\\x26\\x5a\\xf7\\xd2\\xf8\\x10\\xcc\\x81\\x8a\\x5c\\x4b\\x3c\\x11\\x09\\x47\\xcd\\xd9\\x76\\x2f\\x94\\x5a\\x4a\\xfc\\xcc\\x6a\\x17\\xc8\\xd7\\x2b\\x8a\\xf2\\xed\\xa6\\xf5\\x34\\xa3\\x5d\\xf4\\x02\\x47\\x23\\x9b\\xfa\\xb5\\x8f\\x2f\\x6f\\xcd\\xe7\\xc9\\x5e\\x8a\\x56\\xfa\\xda\\xc9\\x9d\\x1f\\x61\\xef\\xf3\\x5d\\x28\\x2f\\x8a\\xb3\\x9b\\x7f\\x20\\x9b\\x93\\x0d\\x9e\\xe8\\x03\\x2a\\xa6\\x51\\x03\\xae\\xe1\\xd4\\x5e\\x81\\x4b\\x38\\x06\\x8a\\x50\\x74\\x3b\\xfe\\xc9\\xf2\\x24\\xfe\\x74\\xfc\\x5d\\x4f\\x98\\xe9\\xe8\\x72\\x1a\\x49\\x58\\x83\\x07\\xfa\\x66\\x01\\x5b\\x4c\\x59\\xa1\\xd8\\xd1\\xdd\\x91\\xd3\\x31\\xdd\\xd0\\xa9\\xf2\\x1b\\x3c\\x46\\xad\\xb0\\x95\\x2e\\x51\\xbf\\xee\\x9a\\xfe\\xa2\\x5c\\x24\\xce\\x32\\x7e\\x1c\\x59\\xf8\\x1c\\x95\\x77\\x22\\xea\\x2a\\xf5\\xeb\\xe8\\xa9\\xb9\\xbb\\x98\\x74\\xf2\\xad\\x29\\xa0\\x25\\xb9\\xd4\\xff\\x3d\\x21\\xed\\xdc\\xd4\\x82\\xdd\\xfb\\x2e\\x9d\\x60\\x49\\xd4\\x52\\x21\\xf4\\xf8\\x8f\\x5a\\xfb\\x25\\x96\\xd8\\x9b\\x18\\x65\\x78\\x83\\x34\\x10\\x74\\xf4\\xd5\\x95\\xe2\\x97\\x1b\\x05\\xf9\\x17\\x48\\xeb\\xb3\\x49\\x99\\xb2\\x47\\x5b\\x0b\\xc1\\x7a\\xc5\\x8a\\xa6\\xee\\x45\\xda\\x57\\x64\\x7a\\x20\\x83\\x15\\x8a\\xcc\\xf4\\x7d\\xa8\\x75\\x6c\\xdd\\x4c\\xa6\\x7a\\x8b\\xc0\\xbf\\xd0\\x3e\\xee\\x72\\x07\\xd1\\x67\\x94\\x44\\xb5\\x04\\x46\\x92\\x7b\\x16\\xa6\\xcf\\xec\\x92\\xec\\x03\\xc1\\xa6\\x6c\\x6e\\x85\\x31\\x10\\xf7\\xdd\\xed\\x0f\\x41\\xfc\\xb9\\x7b\\x14\\x9a\\xb6\\xdc\\x79\\x1f\\xd2\\x70\\x08\\xce\\x50\\x8b\\xb4\\x1b\\x1c\\xe7\\x6f\\xa6\\xe1\\x39\\x04\\x49\\x09\\x92\\x5c\\xf4\\xe3\\x3d\\xd8\\xa1\\x9a\\xbe\\xc3\\x1e\\x38\\xc5\\x95\\x65\\xc6\\xbe\\x57\\x77\\x3f\\x39\\x80\\x48\\x69\\xeb\\x69\\x14\\x87\\x51\\xfd\\x4b\\x3f\\xef\\xd9\\xc8\\xe5\\x5d\\x3e\\x07\\x3d\\xf7\\x1c\\x4b\\xf4\\x15\\x0e\\x76\\xb6\\x89\\x6c\\x3c\\x01\\xf2\\x2d\\xe6\\xcd\\xa2\\xfc\\x52\\x30\\xa0\\x0a\\xb0\\xea\\x49\\x9a\\x96\\xe7\\x8e\\x3f\\x39\\x3b\\xb4\\xcd\\x72\\x8d\\x77\\xd2\\x31\\x22\\xe8\\x68\\x92\\xcd\\x7c\\xe6\\xc4\\xc5\\x89\\x24\\x8d\\x2a\\x3c\\xaa\\x35\\x14\\x5e\\x7f\\x88\\xb0\\xe6\\xdd\\x07\\xc6\\x52\\x4b\\xe4\\x52\\xb5\\x29\\x65\\xe9\\xb0\\x30\\x36\\x07\\xeb\\x70\\x00\\xc4\\xc4\\x63\\x27\\x69\\x82\\x24\\x45\\x18\\xc8\\x98\\xf3\\xd8\\xdd\\x0c\\xe2\\xfc\\x1f\\x63\\xf6\\x90\\x70\\x4a\\xf1\\x9b\\xf5\\xa6\\x2e\\x43\\xd7\\xa7\\x7f\\x2f\\x38\\x45\\xab\\xae\\xe0\\x70\\x08\\x48\\xa6\\x39\\xab\\x32\\xf5\\x8a\\x25\\x3d\\xd1\\x39\\x5b\\xa8\\xae\\x32\\x11\\x07\\x12\\x25\\xe4\\x26\\x9c\\xee\\xe8\\x0a\\x76\\xa3\\x03\\x13\\x3c\\x35\\x8c\\x01\\x45\\x85\\xcf\\x4e\\xdf\\x08\\x41\\xdc\\x9b\\x87\\xd4\\x03\\x36\\x2d\\x4e\\xd1\\x8d\\x37\\xb3\\x71\\x7a\\x9b\\x49\\x63\\x0f\\x2e\\x8f\\xee\\x47\\xfb\\xcc\\x08\\x92\\x0e\\x1d\\x86\\xc2\\x8c\\xcb\\x3a\\xdb\\x2e\\x19\\xd6\\xc0\\x82\\xfa\\x35\\x42\\xf7\\xb5\\x45\\x13\\x06\\x13\\xc8\\x05\\xf2\\xca\\x28\\xaa\\xfa\\x4c\\x0a\\xf9\\x4c\\xbf\\x52\\x7e\\x41\\x12\\x93\\xff\\x5f\\x39\\xc9\\xa6\\xdb\\xfb\\xc2\\x76\\xbe\\x05\\x41\\x78\\x87\\x94\\x61\\x4c\\x97\\x9e\\xe0\\x5f\\xe3\\xf8\\x3e\\x29\\xf4\\xf5\\x28\\x1d\\xdc\\xdb\\x66\\xea\\x4c\\x45\\xee\\x0d\\xe1\\xc4\\xb7\\xa2\\x3c\\xa6\\x90\\x41\\xca\\x7c\\xf1\\xd4\\x0a\\x05\\xef\\xdc\\x6f\\x93\\x4d\\xff\\x0e\\x47\\x01\\x44\\x91\\x7f\\x28\\xf1\\x89\\xe8\\x59\\x91\\x4f\\x16\\x1c\\x1e\\x30\\x1c\\xab\\x31\\xbd\\x37\\x5a\\x2f\\x2c\\x88\\x23\\xa6\\x89\\x99\\xee\\x25\\x73\\x9f\\xd1\\x60\\x44\\x53\\x03\\xfb\\x04\\x6c\\x92\\x2c\\xdf\\x44\\x69\\x78\\x4d\\xc3\\xb1\\x36\\x59\\x18\\xfa\\x7d\\x6d\\x4f\\xae\\x44\\x13\\x2b\\xb5\\xed\\x71\\xce\\x4a\\xfb\\x03\\x6d\\xb2\\x5f\\x89\\xef\\xb1\\xea\\x1d\\xbc\\xc8\\x60\\x2f\\xf8\\x43\\x3f\\xd3\\xea\\x5e\\x91\\x55\\xf8\\x97\\x5d\\x83\\x56\\xb0\\xc2\\xe9\\x34\\xe0\\x20\\x8a\\xd9\\x74\\x55\\x67\\x29\\xd4\\x63\\xa8\\x14\\x28\\x06\\x6e\\x7d\\x26\\x02\\xf9\\x55\\x95\\x6e\\x24\\xe2\\x53\\xbc\\xa5\\xff\\x59\\x0f\\x3b\\xa6\\xec\\xe7\\x6f\\x19\\xc6\\x84\\x9d\\x14\\x9e\\xaa\\x8e\\x06\\x89\\xf8\\x52\\xae\\xf2\\xdf\\x0f\\x9e\\x40\\x3a\\x21\\xff\\x66\\xe9\\x75\\xb2\\x9c\\x2e\\xc3\\xeb\\xb8\\x24\\xf0\\x4c\\xbe\\xd6\\x10\\x7f\\x9a\\x99\\xed\\x12\\xff\\x33\\xa3\\xf7\\x80\\x83\\xe5\\x25\\xcb\\x7f\\x9a\\xe6\\x7b\\x77\\x18\\x6f\\xee\\xb7\\x96\\x23\\x2a\\x09\\x37\\x57\\x53\\x30\\x3b\\x0d\\xfd\\x75\\x97\\xd4\\x34\\x3c\\x04\\xbd\\xf9\\xeb\\x9f\\x06\\xac\\x70\\x87\\x3b\\xbd\\x0f\\xd2\\xfc\\xc5\\x98\\x35\\x17\\xce\\x0c\\x73\\x4d\\x4c\\xb4\\xfd\\xcc\\x35\\xdc\\x49\\x39\\x59\\x30\\xe8\\x75\\x0c\\x85\\xd9\\x93\\x1a\\xaa\\x56\\xcd\\xb1\\x06\\x0a\\xe6\\x14\\x82\\xe5\\xc0\\x50\\xe8\\x41\\xf4\\xe8\\xe7\\xb9\\x2e\\x34\\xdb\\xb8\\xec\\x13\\x95\\xf3\\x11\\x05\\xe6\\x55\\xf3\\xb5\\xcc\\xd8\\xc5\\x71\\xe6\\xb9\\x6d\\x1a\\x22\\x55\\x12\\x63\\x05\\xc6\\xb5\\x4e\\x63\\x9f\\xcc\\x29\\x00\\xcf\\x43\\xfa\\xcc\\x5f\\xcf\\x01\\x42\\x48\\x83\\x58\\x39\\xdd\\x5a\\xaf\\x60\\xf4\\x23\\xe9\\x6c\\x07\\xa7\\xc6\\x76\\x6d\\xe9\\xe4\\xfb\\x51\\xcc\\x78\\x9e\\x9c\\x9a\\x3d\\x19\\x7e\\xf4\\x4a\\xc3\\x21\\xad\\x65\\xca\\x3a\\xab\\x17\\x02\\xfd\\x20\\x4e\\xb2\\xca\\xf6\\x32\\x70\\x21\\x88\\x03\\x4f\\x25\\x26\\x16\\xc6\\x9c\\x80\\x41\\xe2\\x0a\\x7f\\x74\\x79\\x7d\\x31\\x5a\\x17\\x86\\xe1\\x02\\x65\\x98\\x59\\xdf\\xf2\\xf3\\x50\\xd8\\x26\\x58\\x58\\xcf\\x75\\x81\\x55\\xdf\\x12\\x76\\x75\\x1b\\xed\\x87\\xee\\x05\\x21\\x37\\xa2\\x46\\xfd\\xf0\\xf4\\x56\\x03\\xc3\\xa7\\x26\\x10\\x5b\\x16\\x9c\\x04\\x37\\x8b\\x3d\\x74\\x66\\x5a\\xf4\\x99\\x54\\x21\\x90\\x68\\x21\\x5a\\x25\\x13\\xdb\\xeb\\x09\\x5c\\x05\\xa5\\xc0\\x7e\\xfe\\x56\\x47\\x90\\xa2\\x32\\x42\\xcc\\x3c\\x33\\x62\\xbb\\xd2\\x83\\x42\\xd6\\x57\\xff\\x7a\\xf1\\x46\\x4b\\x46\\x9d\\xb9\\x99\\xa1\\xb2\\x60\\x4b\\xc4\\xfa\\xd3\\xd8\\x24\\x0a\\xde\\xf3\\x9a\\xb1\\x6b\\x63\\x8c\\xca\\x9a\\x8e\\x8c\\x35\\x18\\xf6\\x26\\x39\\x4b\\xd2\\xc6\\xf0\\xb4\\xbf\\xfb\\x31\\x0e\\x47\\x8a\\xac\\x1f\\xb8\\x7e\\xb1\\x2e\\x25\\xc4\\xe0\\x95\\xe1\\xb7\\xe7\\x9e\\x8f\\x1b\\xba\\x1e\\x62\\x15\\x05\\x22\\xec\\x4f\\xe0\\xed\\xec\\x86\\x84\\x4c\\x9d\\xda\\x27\\x71\\x4a\\x50\\xbe\\x12\\x61\\x7e\\xf3\\xbe\\xe7\\x95\\xde\\xf0\\x41\\x27\\xe4\\xae\\xcf\\xf3\\x61\\xa3\\x7f\\x59\\xcb\\xc1\\x58\\x36\\x97\\x3a\\xf8\\x4c\\x12\\x0d\\x08\\x04\\x9a\\x85\\xa2\\x8f\\x17\\xa6\\x2a\\xd1\\xfa\\xb2\\x7e\\x9e\\x5b\\xc5\\xd7\\xf4\\xee\\x1f\\x5e\\xd1\\x69\\xc6\\xca\\xed\\x0d\\x20\\xb9\\xa6\\xef\\x33\\x1c\\xe2\\xd3\\x89\\x24\\x49\\x41\\x54\\xe6\\xe4\\xe0\\x82\\xa1\\xbf\\xc9\\x13\\x7c\\x6b\\xa0\\x14\\x55\\x51\\xc7\\x8d\\xb8\\x38\\xb7\\x82\\x3b\\x3e\\xda\\x5a\\xe8\\xe6\\xaa\\x8f\\xdb\\xab\\xd0\\x4b\\xbb\\x8d\\xcc\\x37\\xc6\\x39\\xc0\\x57\\xe1\\x2c\\x99\\xe0\\x24\\x45\\x3c\\x88\\x3c\\xce\\x0a\\xab\\x48\\x24\\x73\\xdd\\x12\\x11\\x39\\x48\\x67\\x94\\x2c\\xc6\\xb7\\xdf\\xa7\\x2c\\x19\\x45\\x00\\xd2\\xff\\x02\\x26\\x2f\\x9d\\x7d\\xa7\\xaa\\x35\\x52\\x87\\x73\\xdc\\x5b\\x63\\xe5\\xdf\\xa8\\x48\\xf5\\x0b\\xd4\\xcd\\x65\\xe2\\xea\\x6d\\xc1\\xa6\\x65\\xc1\\xa7\\xed\\x40\\x9f\\xac\\x83\\x47\\x07\\xa9\\xfd\\xae\\x75\\x98\\x08\\x09\\xd7\\xab\\x7e\\x47\\x08\\xa7\\x70\\xbf\\xd1\\x8f\\xea\\xe7\\xae\\xa6\\x09\\x6b\\xb2\\xbb\\x30\\x80\\x99\\xc1\\xee\\x9a\\x4a\\x72\\x3b\\xb3\\x2b\\x7b\\xc2\\x3f\\xbc\\x16\\xa2\\xae\\x99\\xb2\\x9e\\x0b\\xce\\x44\\x69\\xe0\\x53\\xac\\x77\\x47\\xe0\\x43\\xbe\\xc8\\xb5\\x0d\\x4d\\x7f\\x14\\xd0\\x18\\xc8\\xc0\\x3b\\x52\\x43\\x18\\x1b\\x2a\\xab\\xd9\\x78\\xcc\\x36\\x10\\x9b\\x81\\xfa\\xca\\x45\\x52\\x66\\xeb\\x9c\\xe8\\xaa\\x6a\\xc6\\x24\\xe8\\xb7\\xb6\\xe3\\x91\\xcf\\xf7\\x58\\xab\\xe0\\xf7\\xd8\\x85\\x8e\\xb3\\xbe\\x70\\xc2\\xcb\\x21\\x8e\\xc8\\xed\\x21\\x09\\x3c\\xfc\\x51\\xfd\\xe4\\xff\\xe2\\x28\\xf1\\x94\\x81\\xde\\x07\\x9d\\xcc\\x9f\\xc6\\xf2\\xb0\\x23\\x5b\\x45\\x33\\x29\\x41\\x46\\x62\\xe1\\x7b\\x2e\\x41\\x0d\\xba\\x09\\x55\\xb7\\xe5\\x46\\xe7\\xbc\\xbb\\x77\\x80\\x22\\x88\\x2c\\xdc\\x03\\x1c\\x9e\\x14\\x5c\\xdf\\x5d\\x71\\x5e\\xd1\\xbd\\xd8\\x50\\xa4\\xcb\\xc1\\xeb\\x15\\x11\\x66\\x87\\xc0\\x5f\\x22\\x65\\x0b\\x06\\xc4\\x7a\\x65\\xbb\\xa6\\x08\\x29\\x0d\\xa4\\x93\\x79\\x84\\x0d\\x44\\xc1\\x07\\x56\\xd6\\x7f\\xb5\\x40\\x41\\x3d\\x04\\xfb\\xa3\\xdc\\xad\\xe3\\x7c\\x31\\x98\\x74\\x8e\\x2b\\xa9\\xff\\xe2\\x2d\\x87\\xfd\\xba\\x3a\\xcb\\xbf\\xe5\\x8d\\xa2\\xc8\\x27\\xd2\\x0d\\xc9\\x97\\xbc\\x1e\\xe3\\x61\\x04\\xa9\\xd0\\x32\\x04\\x4b\\x52\\x00\\x14\\x03\\xd7\\x44\\x8c\\xb1\\x06\\x4d\\x31\\x92\\xe5\\x1a\\xc0\\xac\\x52\\x5c\\x06\\x6d\\x71\\xaf\\x0e\\xba\\x06\\x08\\xd0\\xcc\\xf0\\x06\\x9e\\xc1\\xdd\\x27\\x7c\\x94\\x26\\x4b\\xa8\\x23\\x1b\\x2b\\x92\\x1f\\x7e\\x4a\\xa9\\xcb\\x76\\xe8\\x85\\x43\\xc9\\x72\\x4f\\xbf\\x88\\xa2\\x49\\x43\\x1e\\x87\\x65\\x5e\\xa3\\x9a\\xcc\\x28\\xe1\\x20\\xcb\\x1d\\xfb\\xcf\\xe4\\x02\\x8b\\x0f\\x41\\xf3\\xac\\x49\\x57\\x9f\\x7c\\x92\\x3e\\xda\\xaf\\xef\\x85\\x0f\\xe4\\x9b\\x7f\\xe9\\xec\\x50\\x53\\x7c\\x50\\xe8\\x92\\xca\\xe8\\x31\\x1f\\x10\\xfd\\x32\\x5d\\xf5\\x31\\x4d\\x0d\\xdc\\x1f\\xeb\\xf1\\xe2\\x5e\\xc9\\xd3\\x1d\\xac\\x27\\x92\\x9c\\x32\\x34\\x26\\xc5\\xc7\\x29\\x69\\xa0\\x8e\\x6c\\x37\\x3e\\xc8\\x48\\x7d\\xf5\\x46\\x14\\xea\\xa3\\xc2\\x48\\x82\\xa1\\x20\\x84\\xc4\\xb0\\xe6\\x3a\\x2f\\xbc\\x54\\x93\\xe1\\x11\\x76\\x85\\xf6\\x4c\\xc3\\x58\\xdc\\x1e\\xf9\\xc1\\xfe\\x45\\x4b\\x29\\x29\\xc3\\x5d\\x84\\x93\\x70\\xd8\\x7a\\x78\\x9a\\x36\\xec\\x40\\x8b\\x2f\\x86\\x2c\\xdc\\xcb\\xb1\\x0f\\x0c\\xc1\\x79\\xf5\\x50\\x43\\x4f\\x32\\xb4\\xff\\x1d\\x19\\xf5\\x25\\x3a\\x8e\\x09\\x42\\xc6\\x8d\\xf4\\x11\\x42\\x11\\xfa\\xba\\x04\\x68\\xc1\\x42\\x84\\xc7\\xe7\\x00\\x92\\x88\\x1b\\x20\\x9c\\xa2\\x21\\xd5\\x2b\\x34\\xa3\\xab\\xfb\\x60\\x47\\x54\\xe7\\x78\\x96\\x15\\xc3\\x87\\xc9\\xc9\\xd8\\xe2\\xad\\x93\\x00\\x6f\\xe2\\x38\\x0c\\x79\\x8f\\x03\\x84\\x83\\x7b\\x44\\xfb\\x0b\\xee\\xcf\\xe4\\xf7\\xe9\\x48\\x52\\xff\\xdc\\xc6\\xa3\\x55\\x2c\\x45\\xba\\xbc\\xab\\x79\\x3b\\x2a\\xb0\\x74\\xdd\\x97\\xe6\\x7c\\x80\\xac\\x2d\\x12\\x63\\xce\\x0b\\x0d\\x6d\\x16\\x16\\x2e\\x66\\x2a\\x7c\\x61\\xf7\\x83\\x71\\xda\\x30\\x13\\xef\\x94\\x71\\xfe\\xdb\\xb4\\xb5\\x0c\\x96\\xa4\\xe3\\x71\\xd2\\x23\\x3e\\x1a\\xa3\\xce\\x93\\x99\\x58\\xe8\\x74\\xa9\\x42\\x65\\x25\\xfe\\xc5\\xf5\\x48\\x23\\x28\\x7b\\xb0\\xce\\x1d\\xad\\x4f\\x46\\x45\\x99\\xd8\\x3e\\xfc\\x39\\xd8\\x74\\x67\\x3e\\x25\\x2a\\x9b\\x31\\x1f\\x25\\x76\\x61\\x74\\x81\\xfa\\x7b\\x73\\x26\\x2d\\x90\\xb8\\xd4\\x5f\\x34\\x6b\\x2d\\xa0\\xf5\\x1f\\x55\\x7c\\x3a\\xd1\\x6f\\xbc\\x15\\x3a\\x9a\\x6b\\xa1\\xe4\\xa9\\xdc\\x3b\\xb6\\x36\\xb3\\x90\\xf3\\xe3\\x4b\\x3a\\xba\\x7e\\x44\\x77\\x37\\x20\\x45\\x8e\\x42\\x2d\\x29\\xdf\\x77\\x49\\x3b\\x63\\x1e\\x9e\\x88\\xc1\\x73\\x9a\\x69\\x4f\\x66\\x9e\\x08\\xfa\\xf8\\x3d\\x55\\x34\\x50\\xa6\\x1c\\x6b\\xde\\x84\\xb2\\x37\\x10\\xc6\\x4d\\x24\\xbb\\x1f\\xf8\\xd2\\xac\\x67\\x8c\\x1d\\x1c\\x58\\x03\\x88\\xee\\xdf\\xf0\\x46\\x2c\\x85\\xe3\\xde\\xde\\x1e\\x7d\\x5d\\x2e\\x32\\x32\\x4c\\xa1\\x83\\x8b\\x68\\xaa\\x35\\x7d\\x5e\\x25\\x7d\\xa2\\xbb\\x8e\\x3f\\xda\\x1e\\xd2\\x4c\\x3a\\x98\\x04\\x47\\x7e\\x5f\\x7f\\x1e\\xf5\\x00\\x6f\\x15\\xd6\\x62\\xfa\\xd3\\x91\\x4d\\x55\\xdb\\x99\\xa9\\xe0\\xa9\\x7b\\xad\\x1b\\x04\\x07\\x9b\\xe9\\xc0\\x6b\\xf9\\x5c\\x42\\xa0\\xa4\\x25\\x64\\x45\\xea\\x60\\x5e\\x6d\\x21\\x8c\\x73\\x72\\x41\\xa4\\x29\\x8e\\x14\\x71\\xcb\\xf8\\x5e\\xeb\\x5c\\x13\\xbf\\x08\\xeb\\x6b\\xeb\\xfd\\x74\\xd6\\x2a\\x4d\\xfc\\x14\\xa6\\x6a\\x42\\xe2\\xd1\\xdd\\x84\\xee\\x59\\x6d\\x85\\xf2\\x5f\\x74\\xe2\\x1b\\x9d\\xce\\x10\\x7d\\x52\\x58\\xde\\xbd\\x60\\x45\\xe9\\x7a\\xf2\\x96\\x87\\x55\\x17\\xe1\\x99\\xfa\\xf6\\xc7\\xb3\\xf3\\x2b\\xc1\\xe5\\xb9\\x0f\\x67\\x62\\xde\\x76\\x06\\x1c\\x30\\xe3\\x36\\x85\\xf4\\x4f\\x8c\\x88\\xd9\\x97\\xfe\\x8b\\xcb\\xfe\\xb8\\x35\\xc8\\xa6\\xd6\\x4d\\xd1\\x27\\x7b\\x6e\\xbb\\xb4\\x06\\x90\\xf7\\x72\\x16\\x57\\xbd\\x41\\x63\\x42\\x41\\x2c\\xbd\\x7c\\xad\\x7d\\x9b\\xbe\\x88\\x1b\\xd6\\x7e\\xaa\\x43\\x7c\\x95\\xdf\\x12\\x2f\\xea\\x3f\\x5f\\x46\\x97\\x1d\\x75\\x8f\\x37\\x5c\\x47\\x90\\x24\\x83\\x06\\xf9\\x34\\x02\\x2c\\x5d\\xfc\\xd7\\x96\\x40\\x57\\xb3\\x16\\x79\\x65\\x9b\\xd5\\xf8\\x57\\xe6\\xa3\\x93\\xa7\\x8d\\xfa\\xd4\\x56\\x75\\x53\\x74\\xc6\\xc2\\x49\\x8d\\x26\\x41\\x74\\x37\\x1f\\x48\\x44\\x13\\x05\\x1c\\xf5\\x22\\x99\\x98\\x53\\xb2\\x90\\x93\\x2b\\x25\\x64\\xc7\\xc6\\xc3\\x66\\xc8\\xf6\\x7b\\x9b\\x0f\\xb2\\x53\\x23\\x93\\x16\\x23\\x04\\xe6\\x0b\\x9d\\x59\\x32\\x2a\\xc2\\x24\\x2f\\x6c\\x4f\\x45\\x25\\xc9\\xb9\\x23\\xf1\\x94\\x24\\x8f\\xc3\\xa9\\x6b\\x45\\x62\\x69\\xed\\x95\\xa8\\x6f\\xce\\xdc\\x4c\\xee\\x91\\xf3\\xb0\\x10\\x9a\\x48\\x14\\x8c\\x9e\\x96\\x18\\x40\\x63\\x54\\xfc\\xa2\\xa4\\xba\\x36\\x74\\x7b\\xc6\\xb4\\x10\\xda\\x92\\xef\\x01\\x16\\x17\\x95\\xe1\\x18\\x9b\\x72\\x3c\\x15\\x8c\\xe7\\xaa\\x9f\\x52\\xb2\\x89\\x17\\xae\\x07\\x74\\xd5\\x4c\\xf1\\xcf\\x85\\x62\\xcf\\x18\\xcc\\x3b\\x65\\x1a\\x37\\x17\\x44\\x00\\x75\\x82\\x33\\xa9\\xeb\\xfb\\x52\\xfa\\x85\\x3f\\x72\\xf2\\xf0\\xff\\x9c\\x0a\\xa8\\x8d\\xeb\\x19\\x08\\x96\\xca\\xaa\\x6c\\xa8\\x44\\xf0\\x12\\x5b\\x0b\\xc2\\x95\\xac\\xb9\\x2b\\xd2\\x15\\x58\\x54\\xd5\\x4e\\xa0\\xf1\\x64\\x9e\\x64\\x7b\\xf2\\x70\\xc0\\x88\\xf3\\x30\\x56\\x55\\x70\\x63\\xf5\\x1b\\xb1\\xf1\\x38\\xe8\\x74\\x49\\xfd\\x98\\xf3\\x23\\x14\\xcb\\xf0\\x76\\x2d\\xe9\\x99\\xea\\x1e\\xf6\\x2d\\xdd\\x46\\x73\\x6a\\x06\\x21\\x0b\\x32\\x22\\xc8\\x75\\x1d\\xdd\\x8b\\xad\\x70\\x5e\\x44\\xb8\\x00\\xb7\\xd0\\x32\\x04\\x83\\xa7\\x14\\x62\\xfc\\x56\\x3f\\xfc\\x76\\x19\\xe5\\xe3\\xd6\\x8f\\xe6\\x59\\xb2\\x93\\x8e\\x7e\\xe4\\x7a\\xdb\\x49\\x0b\\x72\\x17\\xd2\\x1d\\x1b\\x84\\xd3\\x8f\\xb7\\x86\\x20\\xa1\\xdb\\x67\\xf2\\xa0\\x8a\\x56\\x4d\\x0b\\x36\\x02\\x92\\x44\\xe6\\xcf\\x3b\\xa7\\xf8\\xc0\\x23\\xc4\\xf8\\xe8\\x43\\x56\\xc0\\xfc\\xd1\\x56\\xf7\\xb8\\xb9\\xf8\\xde\\x7c\\x4a\\x18\\x5c\\x56\\xe1\\x8b\\x9b\\x6b\\xd5\\x55\\x22\\x73\\xd5\\x71\\x7a\\xc1\\x48\\x58\\x48\\xca\\x19\\x26\\x49\\x36\\x14\\xd5\\xcd\\xe6\\xc5\\x82\\x7d\\xf0\\x4a\\x7a\\x80\\x0c\\x1f\\xf1\\xf4\\xed\\xf0\\x45\\x7c\\x29\\x33\\xb3\\x47\\x8b\\x15\\xff\\xb6\\x7e\\x89\\xca\\xd8\\x31\\x7c\\xd2\\xb2\\x8d\\x6b\\xec\\x67\\x23\\x19\\x16\\xef\\x65\\x37\\x80\\x80\\x26\\x3b\\x66\\xc9\\x30\\x2e\\xc1\\x0a\\xf5\\x33\\xa4\\x1a\\xdb\\xad\\x4d\\xfb\\xd3\\x69\\xf7\\xce\\x29\\xe3\\x02\\x87\\xba\\xf3\\x32\\xa7\\x3c\\x59\\x92\\x1c\\x91\\x9e\\x9e\\xfb\\x31\\xb9\\x5a\\x8e\\x7d\\xc1\\xce\\x07\\x1a\\x21\\x86\\x6c\\x01\\x9e\\x2f\\xb0\\x6b\\x1e\\x37\\x9e\\x1c\\xa6\\xdd\\x2e\\x3c\\x49\\xf2\\x4e\\xf8\\x0d\\x06\\x87\\x01\\xc5\\x65\\x53\\xd7\\xac\\xd5\\x93\\x64\\xc8\\xbe\\x0b\\xb6\\x86\\xb7\\x78\\x66\\xf5\\x4b\\xf4\\xd3\\xbe\\xc3\\xcf\\xbc\\xce\\xae\\x1f\\x41\\x18\\xc8\\xac\\x00\\xa7\\x59\\x40\\x54\\xf9\\x63\\x8c\\x71\\x21\\x31\\x53\\x6f\\xd1\\xcb\\x8c\\x78\\x9d\\xb0\\xd5\\xcd\\x32\\x57\\x40\\xb0\\xc9\\x00\\x8d\\x77\\xb1\\x24\\x99\\x8d\\x0e\\xf3\\x55\\x1e\\x5d\\xf8\\x8e\\xbd\\x7b\\xd8\\xf9\\xd5\\xeb\\x23\\x1a\\x47\\x8e\\x5e\\xd8\\x99\\xb9\\x7d\\x4c\\x7f\\xff\\xe3\\x29\\x1a\\xdd\\x78\\x7b\\x26\\xfa\\x78\\xf9\\xd8\\xe7\\xbb\\xfe\\x4f\\xca\\x56\\x08\\x45\\xa1\\x29\\x5c\\x39\\x1b\\x87\\xed\\xf4\\xa1\\x22\\x86\\x27\\x45\\xbf\\x55\\x9a\\xb6\\x38\\x12\\x8d\\x11\\x67\\x30\\x6a\\x95\\x6b\\x52\\xcb\\xb9\\x02\\x83\\xea\\x85\\xe1\\x15\\xb7\\x9b\\x69\\x91\\x9b\\x3c\\xfd\\x67\\x2b\\x23\\xa3\\x87\\x37\\x82\\xd9\\x43\\x3e\\x1d\\xdf\\x60\\xf9\\xde\\x77\\xb6\\xfe\\x73\\x21\\xc0\\x23\\x48\\xfd\\x05\\xcc\\x4b\\x0c\\x51\\xf8\\x70\\x78\\xf2\\x6b\\x0e\\xff\\xb2\\x64\\xb1\\xd2\\xa6\\x5e\\x2f\\xc4\\xd6\\x16\\xa4\\x94\\x0d\\xce\\xe5\\xed\\x8f\\xab\\xc4\\x57\\xb6\\xae\\xcf\\xe2\\x45\\x72\\x83\\xd9\\x78\\xa1\\xef\\x16\\x2c\\x1d\\x2a\\xd2\\xec\\xc7\\xff\\x5d\\x41\\xe3\\x50\\x58\\xb3\\x62\\xf4\\xd8\\x98\\x70\\x94\\x35\\x73\\x69\\xe0\\x16\\xd6\\x3f\\x04\\x7c\\x1d\\xbf\\x0e\\xe1\\x9c\\x96\\x09\\xb2\\x83\\xa2\\xff\\xa0\\xe9\\x66\\x76\\x6e\\xb3\\xec\\x04\\x7a\\x98\\xd3\\xa0\\x0d\\x57\\x89\\x90\\x32\\x3c\\x0f\\x41\\xd1\\x62\\x82\\x83\\xd9\\xb9\\x75\\xda\\xf4\\x1e\\x17\\xa2\\x38\\x8f\\x05\\x8a\\xb8\\x2c\\xbd\\x9e\\xf9\\x1b\\x85\\xaa\\x09\\x74\\xf8\\x4c\\x45\\xd2\\x62\\xfa\\x04\\x9e\\xeb\\x7d\\xbc\\xa5\\x35\\xf2\\xfe\\x41\\x9f\\x58\\x8f\\x7d\\x3f\\x52\\x63\\xb8\\x72\\xda\\x9f\\x16\\x32\\x26\\x94\\x4a\\xfb\\xfa\\x01\\x11\\x7e\\x8e\\x47\\x8a\\xd3\\xb0\\x7a\\x5e\\x45\\x38\\x4b\\x5c\\x16\\x9d\\x4b\\x2e\\x3d\\x56\\x26\\xa1\\xae\\x38\\x5a\\xa5\\x4f\\x09\\xcc\\x02\\x17\\xd0\\x7c\\x43\\x35\\xe0\\x0c\\xe1\\x55\\x07\\x45\\xe3\\x15\\xb1\\xfc\\xb7\\xbd\\xc1\\x31\\x3e\\xcd\\xc9\\x61\\x9d\\xef\\x55\\xd6\\x30\\x91\\xf4\\x6e\\x6b\\xdf\\x06\\xc2\\xc7\\x07\\x30\\x8b\\x64\\x1c\\x33\\x8f\\x29\\x0b\\x43\\x8e\\x79\\x16\\xce\\xda\\x1a\\xd8\\x18\\x7d\\x73\\x8f\\x32\\x8a\\xac\\xab\\xb6\\xef\\xd8\\xfe\\xbb\\x5e\\x24\\xc2\\x27\\x23\\x0c\\x5c\\xc5\\x4b\\xbf\\x21\\x13\\x93\\xe4\\x2d\\xd0\\x90\\x1c\\xf2\\x2d\\x2e\\x90\\x59\\x85\\x40\\x18\\x4e\\x21\\x45\\xc0\\x7e\\xc2\\x20\\xd4\\x79\\x56\\xe1\\xe6\\xdf\\xb2\\xf1\\x2a\\xa3\\xaa\\x93\\xa4\\xb1\\x31\\x17\\x4f\\x05\\x57\\x6a\\xef\\xd8\\x81\\x6e\\x3f\\x85\\x62\\x68\\x9e\\xbc\\x70\\x1d\\x54\\x61\\x18\\x6c\\xb3\\x25\\x49\\x85\\x56\\xba\\x86\\x4c\\x45\\xca\\x0f\\xf9\\x1c\\x15\\x6e\\x3b\\x1c\\xbc\\x7b\\x53\\x85\\x92\\x73\\xe9\\x5c\\xa3\\x2a\\xb6\\x75\\xd0\\x8a\\xe7\\x3a\\x8f\\xe2\\x4c\\xe6\\x99\\xb5\\x38\\x43\\xe7\\xa8\\xbe\\xe6\\xf1\\xf7\\xa9\\x9f\\x01\\xd1\\xd3\\x44\\x02\\xe3\\x9f\\x50\\x64\\xd0\\xa7\\xf8\\x96\\x5e\\x32\\x72\\x4e\\x24\\x2f\\xd5\\x97\\x6f\\x40\\x66\\x14\\xa9\\xb7\\x91\\xb0\\x4f\\xee\\xe6\\x20\\x5c\\xba\\xef\\x31\\xc0\\x76\\x55\\x21\\xaa\\x04\\x5c\\xca\\xf2\\x42\\x51\\x44\\x72\\x06\\xc6\\xf1\\x60\\x63\\x07\\xcf\\xa4\\x9d\\x74\\xfa\\x7d\\xe8\\x94\\xfb\\x20\\x5e\\x32\\x23\\xcf\\xaa\\x1b\\x4d\\x9d\\x95\\x0e\\xb2\\x28\\xf3\\x87\\xd1\\xc0\\x34\\x03\\x84\\xc1\\xad\\x4c\\xf6\\xdf\\x1d\\x1b\\x47\\x56\\xde\\x4a\\x7b\\x8e\\x5b\\x68\\xf9\\xe3\\x15\\x72\\x84\\x56\\x16\\xad\\x6f\\x8b\\xa5\\x1a\\x7f\\xa7\\x37\\x5d\\x92\\x6d\\xb3\\xde\\x7b\\x5b\\xb1\\x67\\xfc\\x3f\\xc6\\x87\\x05\\x21\\xe7\\x04\\xb0\\xa4\\x44\\xa9\\x05\\x70\\xd0\\xd2\\xd2\\xee\\x80\\x2f\\x2f\\xd2\\xd3\\x71\\xff\\x5e\\x99\\x1a\\xb2\\x20\\xd3\\x22\\x7b\\x3f\\x31\\x6f\\x4a\\x28\\x6a\\xa8\\x86\\x8b\\x77\\x89\\x0b\\x91\\x97\\xb8\\xfc\\x25\\x60\\xbc\\x67\\xe6\\x1e\\x48\\x1f\\x82\\xae\\x7e\\xd2\\xbc\\xbd\\x1b\\x74\\xae\\xc0\\x54\\xf8\\x9a\\xa2\\x73\\xd2\\x9a\\x31\\x1b\\x71\\x4b\\x81\\xc6\\xba\\xf4\\x56\\x1a\\x14\\x94\\x3c\\x6c\\xed\\xf7\\x9c\\xfd\\x92\\x0d\\xce\\xaf\\xb4\\x91\\xd6\\xcc\\xe4\\x4f\\xb4\\x2c\\x73\\x2c\\x1d\\xa7\\x91\\x77\\x65\\xb6\\x06\\x35\\x96\\xa0\\x20\\xa0\\xbe\\x2c\\x75\\x64\\xca\\x7b\\xb9\\x12\\xb6\\xb1\\x8c\\xd3\\x1f\\x1b\\xfe\\xa6\\xdd\\x61\\x3a\\xd7\\xf6\\xf5\\x3a\\x5e\\xc3\\xaa\\xb6\\x2b\\x09\\x74\\x27\\xae\\x2c\\x4f\\xb3\\x81\\x6b\\x11\\xc9\\x2c\\xf7\\x85\\x0d\\x78\\xde\\xb5\\x0f\\xe3\\x24\\xc8\\xb2\\x07\\x23\\x04\\xb1\\xc7\\x84\\x1c\\xb2\\x27\\x3a\\xab\\x6e\\x03\\x96\\xb8\\x50\\xf9\\x3d\\xe9\\x2c\\x66\\x4c\\x53\\xb9\\x9a\\xb3\\x6a\\x2d\\xc1\\x1c\\x03\\xbe\\x21\\x63\\xc1\\x6f\\x4f\\xc1\\x7f\\xa2\\x99\\xb6\\xc8\\x18\\xca\\xce\\x93\\x92\\xa3\\x19\\x65\\x3e\\x0c\\x8e\\x0e\\xa2\\x21\\x52\\xd6\\x62\\x7c\\xdb\\x22\\xfb\\x86\\x99\\x6d\\xd7\\xce\\xd3\\x28\\x42\\x12\\x0f\\x68\\x5a\\x74\\xbe\\x39\\xca\\x42\\x4e\\x2b\\x8a\\x1a\\xa6\\x98\\xe7\\x0a\\x16\\x46\\x59\\x1a\\x18\\xb5\\xf5\\xfb\\xf4\\x73\\x3b\\xf4\\xb5\\x53\\x89\\xd6\\x39\\x55\\x24\\xa1\\xdf\\x57\\xfb\\x07\\x26\\x1c\\x62\\xcc\\xcd\\x76\\x17\\x89\\x10\\xff\\x01\\x4a\\x2c\\x45\\xa0\\xc7\\x78\\xa6\\x80\\xbe\\xb0\\x06\\x9e\\xba\\xb3\\x4b\\x5a\\x49\\xe1\\x1f\\xe6\\x3c\\x62\\x5a\\x7b\\x8c\\xf4\\x7e\\x83\\x10\\x0f\\x2d\\xa8\\x28\\xe0\\x81\\xf1\\x06\\xaf\\x69\\xf2\\x50\\xe8\\xbb\\x81\\x9f\\x9a\\xac\\x0c\\x87\\x8b\\x0c\\x12\\x32\\xce\\x36\\x98\\x31\\xf6\\x6b\\x0c\\xed\\xa7\\x44\\x1d\\x7e\\x74\\x27\\x2f\\xf4\\x8e\\x7a\\x78\\xce\\x57\\x23\\x46\\x7e\\xfb\\xee\\xc4\\x18\\xb9\\x00\\x2b\\x9c\\x45\\xbc\\x98\\xac\\x03\\x92\\x69\\x25\\x30\\x6e\\xa8\\xf0\\x04\\xed\\xa4\\x8f\\x18\\x49\\x31\\x9d\\x64\\x44\\xae\\xe8\\x3a\\x06\\x67\\x0c\\x6f\\x37\\x63\\xcb\\x3e\\x16\\x65\\xd4\\xe2\\xa4\\xc7\\x2b\\x0f\\x38\\xfc\\x61\\x25\\x17\\xd8\\x5a\\xf3\\xb3\\x75\\x9a\\xad\\xfd\\x42\\xa2\\x96\\x2c\\xa7\\xab\\x5f\\xc6\\x55\\xd9\\x97\\xa2\\x0a\\xae\\x6e\\x5f\\xa6\\xf8\\xe7\\x17\\xd9\\x78\\x7c\\xe7\\xd8\\x60\\xb0\\x00\\x67\\x81\\x44\\x82\\xb8\\x0e\\x0d\\x19\\xd2\\xb1\\x2e\\x62\\x53\\xe0\\x3b\\x70\\xa1\\xf3\\xcb\\x28\\x8f\\xc9\\x9b\\x44\\x58\\x6a\\xbe\\x8c\\x7b\\xf8\\x5b\\xb2\\x7f\\xf2\\xcd\\xe1\\x9d\\x66\\x48\\x97\\x3d\\xfe\\xe2\\x4d\\x6c\\xa5\\xcf\\xa1\\x95\\x6a\\xec\\x90\\xe4\\xb5\\x6e\\xe7\\x7d\\xad\\x32\\xe7\\xc5\\x68\\x70\\xf9\\x9d\\x04\\x1a\\xc2\\x87\\x80\\xe0\\x81\\xc3\\x11\\x07\\x49\\x12\\x26\\x22\\x52\\x4f\\x48\\x58\\x88\\xad\\xd6\\xc5\\x9d\\x18\\xa7\\x3e\\x14\\x00\\xeb\\x9b\\x95\\x16\\xd3\\x09\\xec\\x9e\\x31\\x31\\x33\\xc8\\x76\\x96\\xb4\\x4f\\x83\\xc2\\x53\\xb3\\x4c\\x74\\x3f\\xf5\\x67\\x3b\\xdf\\x9e\\x60\\x84\\x45\\xd8\\xca\\xe6\\xfe\\x80\\xc5\\xe7\\x26\\x8f\\x27\\xbd\\x45\\x04\\x70\\x39\\xdc\\x32\\xe7\\x3c\\x11\\x5b\\xd9\\xa2\\x1a\\x1e\\x3c\\x83\\x07\\x32\\xbf\\x2d\\xc5\\x8a\\xe1\\xf9\\x58\\x38\\xf7\\x0e\\x66\\x06\\xd2\\x32\\xef\\x6e\\x89\\x21\\x43\\xe4\\xb7\\xca\\xfa\\xca\\xf8\\xa8\\x31\\x9c\\x02\\x1d\\x10\\x00\\xce\\xa8\\x10\\x52\\x08\\xdc\\x7d\\x87\\xc4\\x34\\x9e\\x4d\\xcb\\x6a\\x66\\x68\\x50\\xb2\\x9f\\x4b\\x84\\x88\\xc6\\x79\\x39\\xe8\\x74\\x62\\x81\\xee\\x67\\xd2\\xa6\\x4c\\x67\\xcd\\x3b\\xc2\\xde\\xc9\\x38\\xc2\\xfa\\x07\\xe3\\x0c\\xfb\\x0f\\xc1\\x64\\x2a\\xde\\x67\\xb5\\xc8\\xde\\xa2\\x79\\xb8\\xc1\\xf7\\x1c\\x84\\x92\\x1b\\xdf\\xc4\\x86\\x91\\xc9\\x4e\\xce\\xd7\\xfe\\xba\\xf1\\x34\\xb2\\x91\\xa6\\xf0\\x3a\\xdb\\xa6\\x13\\x68\\x36\\xb8\\xe3\\x3c\\xa1\\x04\\xe9\\x00\\x5c\\x8b\\x5d\\x5f\\xbd\\x41\\xa7\\x7f\\x4b\\xe3\\x4d\\xd0\\x70\\x2e\\x2d\\xde\\x74\\x3f\\x8e\\x3a\\x12\\x24\\x08\\xb2\\xac\\xa9\\x62\\xbd\\x6b\\x24\\xcb\\x20\\xd2\\xec\\xe9\\x40\\xd1\\x56\\x35\\xaa\\xf2\\x8c\\x4b\\xbc\\x76\\xf7\\x9d\\xa5\\xfc\\x93\\x73\\x70\\x5a\\x57\\xd6\\x28\\x77\\xb6\\x08\\x50\\xd3\\x3e\\x1f\\x4d\\x48\\x05\\x0a\\x6f\\x9b\\xdc\\xc8\\x29\\x7e\\x21\\xb5\\xf6\\x93\\xb1\\x40\\x7c\\x7d\\xd1\\x77\\x11\\x8c\\x03\\x8d\\xa0\\x6c\\x58\\x85\\x7b\\x99\\x25\\x1e\\xf8\\x76\\x9f\\x81\\x10\\xc4\\x8a\\x14\\x28\\xda\\xc1\\xb8\\xaf\\x58\\x30\\xfd\\x15\\xde\\x3c\\xb4\\x43\\x94\\x89\\xa2\\x48\\x15\\xa8\\x23\\xf1\\x83\\x35\\xe1\\x16\\xbb\\x87\\xd4\\x06\\xdc\\xc0\\xe6\\x2e\\x3e\\x89\\x4f\\x12\\x1c\\x60\\x28\\x8a\\xda\\xd9\\x26\\x91\\xe7\\xbd\\x3b\\xf3\\x0a\\xe4\\xd5\\x94\\x43\\xed\\xfa\\x30\\x36\\x4c\\x4f\\xff\\xf4\\xbe\\xc0\\x99\\x61\\x7a\\x2d\\xc3\\xbc\\x90\\xd8\\x13\\xdf\\x6f\\xd3\\xa7\\x7a\\xc1\\x60\\x07\\x24\\x2a\\x28\\x9b\\xad\\x0e\\x25\\xde\\x13\\x72\\x49\\x7e\\xf1\\xad\\x70\\x8a\\xe2\\x3f\\xa0\\xce\\x6a\\xc4\\xb8\\x16\\x8b\\x94\\xae\\x81\\xac\\x47\\xf6\\x7e\\xcd\\x11\\x63\\xe3\\x56\\x6d\\xe9\\x20\\xdd\\xc1\\x0a\\x49\\xfe\\x69\\xa1\\xb5\\x5f\\x78\\xe6\\xad\\x48\\xd0\\x44\\xe8\\xb2\\x76\\xbc\\xea\\x60\\x5f\\x14\\x7d\\x76\\x79\\x91\\x2e\\x6f\\x0f\\xde\\xdd\\xea\\x69\\xb1\\x5e\\x5d\\x73\\x3e\\x26\\x9c\\x1d\\xdb\\x9b\\xf6\\xe2\\x9d\\xba\\xac\\x16\\x6f\\xfe\\xc9\\x12\\x1a\\x82\\x8a\\xf5\\xa0\\xee\\xab\\x95\\x73\\x52\\xe4\\x56\\xef\\x3c\\x7a\\xf9\\xc9\\x9b\\xe7\\x5f\\x56\\xdc\\x65\\x5d\\xc6\\x4a\\x96\\xc5\\x98\\x07\\x8c\\x6c\\xd8\\x25\\x8c\\xa6\\x60\\xf7\\xd7\\x64\\xe2\\x38\\x2b\\xde\\x4d\\x5e\\x3b\\x21\\x05\\xf7\\xe5\\x8c\\x72\\x6b\\x99\\x6c\\x24\\x1d\\x67\\x11\\x1d\\x03\\xbc\\x92\\x2a\\xbf\\x86\\x37\\x97\\x14\\xe9\\xda\\xc4\\xec\\x51\\xff\\x10\\xd3\\x03\\x44\\x70\\x2b\\x19\\x71\\x12\\xb7\\xda\\xbc\\x7e\\x09\\x20\\x19\\x74\\x27\\x13\\xf2\\x46\\x0e\\x12\\x60\\xb2\\xaf\\x35\\x0b\\x2e\\x5c\\xf1\\x41\\x36\\xde\\xcb\\x24\\x2e\\xc0\\x9e\\x55\\x5a\\x07\\xfc\\x9c\\x8f\\xfd\\x6c\\x58\\x66\\xa8\\x63\\xfc\\xb7\\xc9\\x83\\x34\\xb5\\xc7\\xe4\\x0f\\x02\\xae\\xbc\\xe8\\x81\\x7f\\x1b\\x83\\x1e\\x03\\x47\\x79\\xf6\\x49\\x8a\\xed\\x03\\x9a\\xd3\\xc7\\x2c\\xf1\\xcf\\xdd\\x35\\x88\\xc7\\x04\\x30\\x16\\x59\\x18\\x6d\\x95\\x7c\\x65\\x83\\xe4\\xca\\xa7\\xeb\\x71\\x30\\x31\\xfb\\xea\\x5c\\x75\\xe6\\x8f\\x22\\x57\\x23\\xf6\\x2f\\xfa\\x7b\\xa6\\xa0\\x36\\x92\\xf5\\x5c\\x76\\xab\\x94\\xe1\\x89\\x58\\x49\\x3d\\x6a\\x2d\\x2e\\x77\\x8d\\x0b\\x1a\\x7a\\xb7\\xcc\\xa0\\x88\\x39\\x1e\\xfc\\x50\\xb8\\x88\\x4a\\x54\\x02\\x41\\xf7\\xc2\\x71\\x8f\\x97\\x0c\\xf1\\xd8\\x2d\\x04\\xf6\\xa0\\x86\\xa0\\xe5\\x20\\xee\\xfe\\xd0\\x2f\\x26\\x46\\x6e\\x14\\x3e\\xdb\\x1e\\xb4\\xe4\\xd4\\xb0\\x05\\x33\\x0f\\x32\\xbd\\x9c\\xb3\\x21\\x98\\x94\\xf0\\xf4\\xa6\\x24\\x1b\\xdb\\xa9\\x1f\\x44\\x74\\x83\\x47\\x3f\\xca\\x45\\x4c\\xf2\\xb0\\x05\\x34\\x0b\\x85\\x87\\x9a\\xfa\\x78\\x58\\xdd\\x5c\\x26\\xb3\\xc9\\xb8\\x94\\xa2\\x9a\\xba\\x12\\x5f\\x72\\x8c\\xa1\\xe5\\x20\\xda\\xe1\\x36\\x87\\x3e\\x1c\\xe8\\x9c\\x7b\\xba\\x11\\x8c\\xe6\\x0a\\xb3\\xb5\\xdc\\x06\\x46\\x0a\\x38\\x83\\xbb\\xed\\xd3\\x69\\x92\\xd2\\x91\\x8d\\x39\\x4d\\xc1\\xfc\\xbf\\x90\\xeb\\xfd\\x63\\x87\\xf9\\xe6\\x9b\\x6f\\xc6\\x4d\\x67\\xe7\\x32\\x24\\xe3\\xba\\x32\\x29\\x29\\x41\\xb3\\xd4\\xde\\x92\\x37\\x2f\\x12\\xb4\\x2c\\x87\\xb8\\xbb\\x32\\x4d\\x2a\\xe1\\xf3\\x62\\x40\\x2a\\x65\\xe4\\x40\\xa0\\x18\\xfc\\x03\\x7d\\xdc\\x45\\x1a\\xbc\\xdb\\x61\\x10\\x60\\xf0\\x22\\x43\\xbf\\x24\\xde\\xb6\\xc1\\x4f\\x2a\\x46\\xe9\\x79\\xc7\\xae\\x96\\xba\\xd1\\xf2\\x0b\\xcd\\x76\\xd1\\x6e\\x17\\x45\\x4e\\xa8\\x42\\x6d\\x33\\x60\\x01\\x19\\x4d\\x10\\x06\\x5f\\x09\\x14\\x1c\\xd8\\xf4\\x36\\x42\\xed\\x37\\x7b\\x72\\x03\\x34\\xdb\\x46\\x67\\x0f\\x03\\xaa\\x83\\xdf\\xf4\\xd5\\x50\\x8f\\x60\\x85\\x70\\x42\\xe2\\xf4\\xae\\x0e\\x49\\xef\\x4e\\x91\\xdd\\xc1\\x5f\\x87\\x7f\\x5d\\xbc\\xa0\\x4c\\x40\\xb7\\x72\\x11\\xff\\x9e\\x1d\\x7e\\x3d\\x0f\\x84\\x83\\x66\\x4b\\xdf\\xa4\\x20\\xed\\x13\\x78\\x47\\xfc\\xaa\\x1d\\x77\\x55\\x15\\xe4\\x7c\\x5c\\xb8\\xe8\\x73\\xf1\\x39\\x58\\xc7\\x18\\x79\\xeb\\x15\\xbd\\xc8\\x3d\\xc1\\xab\\x24\\x14\\x33\\x1a\\x53\\xb1\\xd8\\x34\\x57\\xb9\\x10\\x30\\xd7\\xf9\\x30\\x2e\\x3c\\xc4\\x81\\x40\\x36\\x60\\x73\\x76\\xe3\\xaf\\x1d\\x44\\x82\\x7a\\x23\\x7b\\x2e\\x91\\xd9\\xf8\\x4f\\x73\\xc7\\x1a\\xe4\\x88\\xc0\\x0f\\x42\\xb2\\xd1\\x63\\x88\\x8b\\xd7\\x43\\xd4\\x2b\\xeb\\x92\\x09\\xb7\\x6d\\x53\\xbd\\xe1\\xfc\\x4a\\x18\\xd9\\x21\\xbe\\xb6\\x23\\xe6\\xac\\xda\\xd8\\x3c\\x40\\xb8\\xdb\\xff\\xdc\\x0a\\xb7\\xb7\\x83\\xb6\\x35\\xd3\\x3e\\xba\\x4c\\xc5\\x23\\x3a\\x09\\x97\\x6d\\xb8\\x29\\x7a\\x04\\x15\\x01\\x90\\x00\\x28\\x99\\x58\\xd0\\x07\\x11\\xee\\xc8\\xb2\\x6a\\x75\\xed\\x94\\x75\\x46\\x50\\xd8\\xd5\\x8f\\x5f\\xea\\xc2\\x66\\xa6\\xa2\\x63\\x6a\\x7b\\xf1\\x6c\\x06\\xd2\\xe4\\x72\\x51\\x12\\x78\\x52\\xee\\x47\\x68\\x0d\\xb5\\x6c\\x68\\x2d\\x55\\xe8\\x59\\xe0\\xcf\\xc0\\x83\\x70\\xe2\\x76\\x25\\xe5\\x45\\xe2\\x48\\x3c\\x18\\x11\\xc7\\xb8\\x15\\xd4\\x9a\\x9a\\x16\\xd9\\x2d\\x4f\\xf2\\x9f\\x0d\\x0c\\xda\\x5d\\x13\\x3e\\x71\\xce\\x94\\x2b\\xf8\\x4a\\x95\\xfd\\x03\\x1b\\x25\\xf0\\x3b\\xa1\\x27\\x56\\x78\\x94\\x3f\\x26\\x1b\\xe1\\xea\\xea\\x8f\\x80\\x9b\\xa0\\xc0\\x2f\\xaa\\xb3\\xdb\\x3d\\x74\\x9e\\xd9\\x2e\\xb1\\xa4\\xe1\\xc0\\xcc\\xee\\x33\\x0f\\x02\\xdb\\xa3\\x76\\x17\\x6d\\x05\\x9c\\x1c\\x5c\\x37\\x73\\x06\\xa7\\xb7\\xc3\\x0a\\x84\\x18\\xe2\\xd9\\x8a\\x3d\\xdd\\x6c\\x3e\\x4e\\xd6\\xd9\\xa4\\x8f\\xb5\\x9d\\xef\\x99\\x5d\\xc1\\xb2\\x91\\xab\\x15\\xa1\\x59\\x35\\xec\\x35\\x1e\\x3c\\xf2\\x2d\\x2c\\x27\\x19\\x43\\xb8\\xeb\\x3c\\x2f\\x18\\x3d\\xa1\\xfd\\xc9\\x43\\x76\\x89\\x30\\x1b\\xc9\\xdf\\xac\\xa6\\xbf\\xd6\\x79\\x49\\x49\\x0e\\x17\\x09\\x76\\xeb\\x2b\\xc6\\xd7\\x11\\x77\\x4e\\x52\\xf0\\xf4\\xd8\\x4a\\x56\\x27\\xed\\x14\\x35\\x36\\x7f\\x45\\xd1\\x95\\xb0\\x90\\xfc\\x39\\xb7\\xd7\\x3d\\x72\\xba\\x1e\\xb5\\xfe\\xc2\\x8b\\x94\\x50\\x3f\\x29\\x2f\\xad\\x2e\\xda\\x4f\\x4c\\xed\\xb3\\xc6\\x12\\x57\\x44\\xbf\\xa8\\x7e\\xa5\\x53\\x55\\xa4\\x19\\x5c\\x91\\xd4\\x26\\xbd\\xaa\\x61\\x28\\x69\\xd9\\x78\\x7a\\x85\\x38\\xc5\\x8a\\x51\\xaf\\x02\\xfb\\xf2\\x34\\x56\\xd4\\x99\\x71\\x9e\\xf9\\x76\\x00\\x03\\xdc\\x11\\xd0\\x67\\x88\\x8c\\x08\\x50\\xa8\\xf9\\xc8\\x67\\x34\\xcf\\x49\\xca\\x78\\x1d\\xdb\\xe3\\xbb\\x95\\x2e\\x7b\\x1b\\xb9\\xc1\\x89\\xa1\\xbe\\xdd\\x08\\xca\\xd5\\x0a\\xd1\\x2d\\x2e\\x03\\xe7\\xf8\\xe6\\xa8\\x05\\x71\\xf0\\x32\\xc0\\xf8\\x6c\\xc4\\x13\\x30\\x1a\\x36\\xda\\x5e\\xe9\\x7d\\xd5\\x95\\xc0\\xb7\\x44\\xdf\\x87\\x69\\xfa\\xdf\\x29\\x52\\xd0\\x8a\\xec\\x5e\\x18\\x26\\xe3\\x31\\x33\\x5b\\x47\\xca\\x70\\xe3\\xcd\\x49\\x29\\x78\\x2b\\x10\\xed\\xa3\\x78\\xc4\\x85\\xa2\\x7c\\xca\\x07\\xec\\x94\\xea\\xf8\\x0b\\x20\\x4b\\x41\\x19\\x6b\\x9a\\xc0\\xad\\x05\\xab\\xad\\xa9\\x5f\\x32\\xc3\\x58\\xe5\\xde\\xa4\\x1e\\x41\\xe1\\x7d\\x7e\\xa5\\x54\\x0f\\xe6\\xb8\\xfb\\x2e\\x31\\x23\\x56\\x57\\xf5\\x29\\xef\\x45\\xd0\\x71\\x47\\x84\\x40\\xfc\\x88\\x05\\x35\\x90\\x96\\xcc\\xcc\\xa6\\x3a\\x00\\x63\\x7d\\x21\\xea\\x82\\x75\\x5c\\x45\\x96\\x18\\x81\\x93\\x0a\\x48\\x8d\\x18\\x77\\x1a\\x75\\xc7\\x45\\xc6\\x36\\xaf\\x61\\x80\\xcf\\x5a\\x9c\\xfd\\x47\\x4a\\x58\\x00\\x91\\x0d\\x49\\xed\\xe6\\xf4\\x85\\x4e\\x7e\\x73\\x62\\x59\\x03\\x60\\x3b\\xe3\\xc1\\xd3\\x0d\\x21\\xf4\\x26\\x4f\\xb0\\xe1\\x28\\xaf\\x8c\\x0d\\xfb\\xaa\\x1c\\xe3\\xa0\\x8b\\x19\\x24\\x6a\\xfe\\x07\\x29\\xa5\\xd9\\x92\\xfe\\x98\\xae\\xb9\\xf3\\x04\\x5f\\xd9\\x5a\\xc3\\x22\\xcd\\x31\\x24\\x8c\\x00\\xa8\\x49\\xbe\\x60\\x97\\x6c\\xd0\\x75\\x23\\x8b\\x86\\x55\\xd6\\x99\\x67\\x49\\xb0\\x50\\x2e\\xe3\\xc3\\x5a\\x1a\\x2f\\xc8\\xe1\\xcf\\x33\\xa8\\x9e\\x98\\x14\\xbc\\x14\\x33\\x79\\xcc\\xd2\\xf3\\xb8\\x38\\xa6\\xf0\\x2d\\x08\\x98\\xbb\\x30\\x19\\x7b\\x87\\xc5\\xf2\\x61\\x1c\\x44\\xae\\xd0\\x09\\x67\\x3f\\x96\\x91\\xe1\\x54\\x29\\x98\\xd9\\xd3\\xae\\xa0\\xc2\\x66\\xfc\\xfc\\xfd\\x3d\\x8e\\x95\\x3b\\x76\\x85\\xfb\\x2b\\x1a\\xdc\\x3b\\x9e\\x55\\x9c\\x11\\x37\\x46\\xe2\\x4c\\xee\\x4e\\xb9\\x9f\\x41\\x3d\\x62\\x5d\\xfd\\x0f\\x30\\x23\\xab\\x6d\\x6f\\x62\\x8b\\x66\\xd2\\x1d\\x95\\xe0\\x0c\\x7b\\x7b\\xfc\\xa0\\x4d\\x7f\\x32\\x99\\xb4\\x85\\xa8\\x7f\\xaa\\x54\\xcd\\x23\\x73\\x18\\x62\\xc9\\x33\\xa2\\x06\\xc8\\xe6\\x08\\x95\\x10\\x43\\x15\\x24\\x45\\x47\\x86\\xf7\\x10\\xcf\\x65\\x33\\xa1\\x4c\\xbb\\x2e\\x10\\xa2\\x8b\\x99\\xcc\\x17\\xf8\\xcc\\xbf\\x47\\x6e\\x33\\x74\\xcc\\x65\\x95\\xe6\\x45\\xf2\\xc2\\x96\\x66\\x15\\x3e\\xd9\\x55\\xa2\\x7b\\x13\\x3a\\x78\\xe3\\x18\\xfa\\x8d\\x0c\\xbe\\x49\\x5b\\xee\\xa0\\xae\\x80\\x62\\xa5\\xc4\\xc1\\x40\\x81\\x88\\x4e\\xc7\\x13\\xa3\\xae\\x17\\x36\\xd5\\x04\\x26\\x36\\x0e\\x89\\xf9\\x9d\\x42\\x45\\xc1\\x69\\xe2\\x8e\\x1a\\xff\\xf2\\x81\\xa2\\x00\\x80\\x83\\xf3\\x4a\\x27\\x2f\\x8a\\x50\\x81\\xce\\x4d\\x25\\xf6\\xe3\\x99\\xba\\xbe\\xd8\\xef\\x86\\xf9\\x53\\x31\\x3a\\x53\\x68\\xcb\\x21\\x26\\x22\\xfd\\xab\\xc5\\xc9\\x8d\\xd6\\x08\\x99\\x42\\xbd\\x1a\\x64\\x76\\xb2\\x3f\\xa0\\xc4\\xdc\\x6e\\x8a\\x53\\xc5\\x9a\\xc6\\xe0\\x25\\x40\\x42\\xbe\\x94\\x23\\x25\\xdd\\x3f\\x78\\x3c\\xd5\\xba\\x0f\\x72\\x64\\x49\\x14\\x3b\\x4f\\xdb\\xfc\\xa1\\x68\\x07\\xdf\\xef\\xe2\\x63\\xcd\\x2a\\xe8\\xa0\\x75\\x2d\\xb9\\xc3\\x16\\x9a\\xcb\\x85\\x48\\xea\\x46\\x88\\x9e\\xd6\\xae\\x13\\x09\\x4c\\x38\\xba\\x70\\xeb\\xa3\\x49\\xfc\\x55\\x8b\\x64\\xcc\\xc5\\x75\\x89\\xb4\\x35\\x6d\\x22\\x26\\x6a\\x5a\\x36\\x91\\x1b\\xf5\\x67\\xd1\\x0a\\xf1\\x7b\\x81\\xec\\xb3\\x02\\x00\\xaf\\x37\\x2b\\x5e\\x9e\\x8a\\xb1\\x37\\xf9\\x93\\x3c\\x00\\x4d\\x38\\xb9\\xbe\\x06\\xf1\\x8f\\x1a\\x3d\\xb0\\xfa\\x2d\\x6b\\x0b\\x40\\xac\\x45\\xce\\x39\\xaa\\x93\\x6e\\x6d\\x15\\x2b\\xc2\\xde\\x5e\\xfb\\x83\\x7a\\xc4\\x86\\xaa\\xcc\\x65\\xe8\\xae\\x59\\xe5\\x63\\xfb\\xb9\\x2a\\xeb\\x03\\xe1\\xac\\x40\\xf7\\x98\\x00\\x42\\x57\\xfc\\xf7\\xee\\x54\\x4a\\xb6\\x8e\\xed\\x37\\x7a\\x40\\x5e\\x9b\\xe7\\xfc\\xde\\xac\\xe7\\xec\\xe1\\x8c\\xd6\\xe1\\x0b\\x99\\xc0\\x8c\\xcb\\x3c\\x00\\x00\\x87\\x00\\x67\\x0c\\xa0\\x1d\\x62\\xe3\\xfe\\x95\\x43\\x18\\x5b\\x14\\xb6\\x3d\\xb3\\xea\\xcc\\x3f\\x1d\\x5c\\xa4\\x60\\x8d\\x5a\\xf3\\x06\\x22\\x27\\x96\\x00\\x55\\x45\\xba\\x50\\xd1\\x20\\x5e\\xc2\\x13\\x62\\x26\\x09\\x50\\xc3\\x70\\x02\\x8d\\xb2\\xc1\\xe8\\xf4\\x5c\\xcc\\x7a\\xad\\x9b\\x12\\xa4\\xd5\\x79\\x30\\xb9\\xba\\x02\\x99\\x33\\xbe\\x9a\\xdb\\xfe\\x4e\\xe3\\xf0\\x4a\\xd9\\xd7\\x7a\\x1a\\x16\\xfc\\x4d\\x7a\\x70\\x94\\x22\\x9b\\x81\\x9b\\x8d\\xb8\\xb4\\x53\\x93\\x7a\\x96\\xc9\\x96\\x2d\\xed\\xa7\\xe2\\xda\\x49\\x46\\xdc\\xc9\\x08\\x57\\xb8\\x06\\xee\\xc2\\x0e\\x93\\xee\\x93\\xe5\\x5f\\xe9\\xf2\\x6a\\x2c\\xd6\\x7b\\x04\\x36\\x3f\\xaa\\x5b\\x4f\\x47\\xb2\\xc7\\x42\\x06\\x1c\\xe0\\x2a\\x73\\xed\\x0b\\x1a\\x3d\\x43\\xca\\x76\\x94\\xee\\xb7\\x8d\\x1e\\x45\\xb4\\xff\\x06\\x79\\x5b\\x4e\\x54\\x40\\xf0\\xa9\\xa3\\xb6\\xfd\\x33\\xf2\\x56\\xe0\\x3b\\x4d\\x4c\\x15\\x5d\\xfc\\x34\\x54\\x92\\xda\\xd9\\x6e\\xb0\\x6e\\x8f\\x0a\\x7d\\x92\\xe4\\xd3\\xbd\\x9e\\x07\\x95\\xb9\\x7e\\xcf\\xde\\xdc\\xbf\\xdd\\x92\\x6c\\x95\\xdd\\x50\\xb4\\xc4\\xde\\xcf\\xb2\\xf7\\x75\\x29\\x80\\x0b\\xf2\\x26\\xea\\xaf\\xe9\\xc9\\xbc\\x69\\x20\\xbd\\x98\\xce\\x4e\\xfb\\x38\\xbc\\x6e\\x0b\\xb8\\xbd\\xff\\x40\\xc2\\x09\\x40\\xd6\\xdd\\x2e\\x00\\x0e\\xe0\\xc0\\x6d\\xa6\\xd4\\x6c\\xb5\\xe9\\xe3\\xeb\\x29\\x82\\x57\\x12\\xba\\xea\\x54\\xc7\\xd3\\xbc\\x9e\\xf3\\x16\\x2d\\xd5\\x27\\x46\\x39\\x7b\\x6e\\x4b\\xd9\\xd0\\x0c\\xbc\\x3a\\x27\\x3b\\xf4\\xb8\\x44\\x73\\x7c\\x92\\x70\\x30\\xf8\\xd7\\x0b\\xcc\\x94\\x9c\\x71\\x04\\x20\\xe8\\x5a\\x02\\xe6\\x6a\\x2e\\x0c\\x09\\xde\\xc5\\xdc\\xe3\\x4e\\x39\\x26\\x02\\x89\\x61\\x93\\xd1\\x83\\xf0\\xd8\\x7e\\x70\\x00\\x6c\\x6f\\x6c\\x85\\x7c\\x2c\\x5e\\x9c\\x34\\xc8\\xc8\\xe0\\x45\\x84\\xe3\\x30\\xe3\\x66\\x4d\\x50\\xa5\\xf9\\x30\\x0b\\xbf\\xe5\\xe1\\x5c\\xc0\\x6b\\x53\\x29\\x05\\xdd\\x48\\x87\\x96\\x00\\x81\\xc5\\x8c\\xe6\\x2d\\x1f\\x79\\x65\\x62\\x6a\\x9d\\xcd\\x19\\x2d\\xa1\\x18\\x5c\\xf8\\x09\\xc1\\x74\\x3a\\x84\\x71\\xe1\\xd4\\x6d\\x1a\\xfe\\x7f\\x10\\x4c\\xce\\x65\\x30\\x8c\\xda\\xf9\\x37\\xa9\\xbf\\x3a\\x1a\\x75\\x10\\xf0\\x8b\\x5f\\xc5\\x02\\x7e\\x23\\x82\\xd5\\x1a\\x17\\x92\\xd2\\x40\\x6c\\x4a\\x83\\x2b\\x6e\\x24\\x48\\x94\\x55\\x33\\x7c\\x48\\x63\\x0d\\xb9\\x07\\x12\\x45\\xf2\\xdf\\x68\\x56\\x6f\\xb9\\x25\\xa2\\x1d\\x33\\xc7\\xb7\\xb8\\xbd\\x34\\xe4\\x35\\x58\\x5b\\x99\\x79\\x9b\\xcc\\x13\\xc8\\x19\\x3f\\xb2\\xe6\\x97\\x8f\\xc6\\xaa\\x95\\x79\\xa7\\x32\\x06\\xc4\\x5e\\x9f\\xb2\\x72\\x75\\xef\\x92\\xec\\xb2\\xd6\\x5a\\x8d\\x2b\\x21\\x9d\\xfe\\xe3\\x93\\x1c\\x65\\xea\\xb2\\x58\\xd7\\x5f\\x50\\x4e\\x31\\x6f\\xbc\\x52\\xbe\\xe2\\x3c\\x93\\x12\\x2e\\xf0\\xf1\\xfe\\x25\\x70\\x3d\\x37\\x91\\x59\\x2a\\x17\\xce\\x87\\xfb\\x1a\\x22\\xc1\\x74\\xc5\\x50\\x9a\\x97\\x78\\x8a\\xfc\\xa3\\x93\\xc3\\x57\\x8c\\x32\\xed\\x17\\xdb\\x18\\xa5\\xee\\xcb\\x4e\\x19\\xcb\\x18\\x0a\\x9a\\x2a\\xbd\\xf3\\x84\\xec\\x7a\\x52\\xd6\\x40\\xb8\\x5a\\x6c\\x7c\\xbb\\x11\\x13\\xca\\xbd\\x17\\x9e\\x9a\\xeb\\x06\\x43\\xde\\x26\\x3f\\x8d\\x95\\x0e\\x7f\\x34\\x24\\x6e\\x92\\xd4\\xb3\\xaa\\x57\\xb2\\xe4\\x48\\xc3\\x3e\\xb7\\x8e\\xf8\\x89\\x53\\x06\\xe0\\xa1\\xbc\\xad\\x2f\\xea\\xac\\x5e\\x5f\\xec\\xed\\x89\\x91\\xc5\\x1c\\x61\\x27\\x51\\xa0\\xdc\\xb6\\xbc\\x73\\xe3\\x85\\xb6\\x81\\xe4\\x3a\\xa1\\xb3\\x04\\xf6\\x80\\xe2\\xf6\\x45\\x1e\\x03\\x6f\\x1c\\x8c\\x2f\\x95\\xf9\\x09\\x46\\x4a\\x83\\x00\\x21\\xec\\x6e\\x30\\x0e\\xfc\\x3e\\x30\\xba\\xc0\\xa3\\xa8\\xd7\\x72\\x5b\\xb7\\xe3\\x0f\\x42\\x32\\x33\\x9b\\x92\\x0c\\x86\\x3e\\xae\\x73\\x93\\x85\\x90\\xe2\\xbd\\xe2\\x77\\x23\\xe9\\xc9\\xce\\x37\\x2b\\xfc\\x08\\x1e\\xf1\\xbf\\x96\\x85\\x42\\xbf\\xbe\\x6f\\x47\\x60\\xd9\\x9e\\xa8\\x11\\xc6\\x3f\\xf1\\x67\\x47\\xa1\\x0c\\x24\\x70\\x6a\\x2f\\x4b\\xe1\\x55\\x50\\xcd\\x52\\x43\\x93\\x32\\xf8\\x7f\\xbc\\xae\\x69\\x00\\x2a\\x1c\\x82\\xdf\\x52\\xa9\\x28\\xd7\\x4c\\xd3\\x5e\\x4d\\xd1\\xd3\\x70\\x50\\x4d\\xf1\\x2d\\x51\\x75\\x31\\xd6\\x90\\xe9\\xaa\\xfb\\x4e\\x7f\\x1f\\x20\\x01\\x15\\x54\\xa2\\x02\\xc2\\xde\\x3a\\x4b\\xf4\\x41\\x7d\\xe1\\xd9\\x67\\xd4\\xd3\\xc7\\x9c\\x42\\xfe\\xf3\\xc2\\xe8\\x69\\xd8\\x4f\\x85\\x51\\xe8\\xa1\\x34\\xeb\\xc3\\x60\\xef\\x05\\x48\\x55\\x78\\x44\\x30\\x5a\\x69\\x91\\xb7\\x69\\x3f\\xfc\\x1f\\xe8\\x35\\x92\\xac\\x1d\\x2a\\x3d\\x56\\x10\\xfd\\xc0\\x77\\x46\\x83\\x48\\x2b\\xb1\\x43\\xac\\xa8\\x0d\\xe1\\xa8\\xa3\\xe9\\xc3\\x6d\\xc9\\xc9\\x47\\xb1\\x7e\\x01\\x9c\\x0c\\x8a\\xb6\\x81\\xef\\x00\\x4a\\xb5\\x3d\\x7b\\xbf\\xf6\\x28\\x82\\xbf\\x25\\xef\\xd1\\xaa\\x24\\xa2\\xbd\\x14\\xa9\\x56\\x41\\x85\\x96\\x45\\xe7\\x01\\xef\\x53\\x65\\xd5\\x81\\x82\\xe1\\x9a\\x32\\xda\\xff\\x1a\\xa9\\x3f\\x89\\xe2\\x25\\xd1\\xf2\\x93\\x8c\\x75\\x80\\x9e\\x89\\xd5\\x84\\xe1\\x23\\x5b\\x3d\\xdc\\xc7\\xd5\\xc6\\xf4\\xa7\\x9f\\x8a\\xa5\\x40\\x2a\\x9c\\x12\\x01\\xee\\xf1\\xa3\\xf8\\x86\\xdc\\xa2\\xb2\\xef\\x7f\\x0b\\x2e\\x32\\x51\\x69\\x07\\x42\\xcb\\xe4\\xbe\\xb3\\x68\\x46\\x73\\x7f\\x13\\x0b\\xbf\\x85\\x3c\\x80\\x8b\\x7a\\x39\\x15\\xd7\\x7c\\x3c\\xa3\\x51\\x4d\\xd5\\xbb\\xb1\\x1a\\x0e\\xcb\\xc3\\x3b\\x63\\xa2\\x9e\\x24\\x02\\xf9\\xb2\\x95\\xfb\\xf2\\x5f\\x99\\xc8\\x38\\x8e\\x08\\xf4\\xa9\\xd0\\xa8\\xaf\\x54\\x9a\\x07\\x5f\\x2f\\xd2\\x63\\x07\\x64\\x7f\\x2b\\x1d\\xdf\\xe9\\x51\\xf8\\xe0\\x1a\\xb7\\x24\\xfe\\x12\\xfa\\x86\\x86\\x2a\\x84\\x83\\xc6\\xbd\\x77\\x9b\\xaa\\xec\\xfd\\xde\\xb7\\x01\\x52\\x39\\x8f\\x7c\\x66\\x41\\xe8\\x1f\\x08\\x33\\x0c\\x1c\\xea\\xca\\xb7\\x6b\\xd8\\xa0\\xd3\\x4d\\xcb\\x3b\\x18\\x8b\\x3c\\x25\\x87\\x80\\xd8\\x92\\x1f\\xc5\\xcd\\x7b\\xd2\\x74\\x80\\x55\\xce\\x6d\\x38\\x2f\\x58\\x59\\xbf\\x6d\\xc4\\xf7\\x67\\x79\\x44\\xaa\\x90\\x67\\xf2\\x10\\x91\\x7d\\x4a\\xbf\\x6f\\x6c\\x1c\\x22\\x83\\x18\\xc3\\x08\\x84\\xc3\\x73\\xe1\\x9c\\xd2\\xa9\\xb9\\x95\\xd8\\x25\\x12\\xa3\\x0e\\x07\\xbd\\xda\\x82\\x8a\\xd7\\x3b\\x91\\xbd\\xbd\\x17\\x8a\\x6f\\xd0\\x58\\xf0\\x62\\x6b\\x66\\x31\\x00\\x9f\\x3f\\xbf\\x5e\\xf0\\x9c\\x64\\x21\\xa6\\xec\\x9f\\x8e\\x4b\\x29\\x18\\xf8\\x3d\\x42\\xe3\\x9a\\x55\\xfa\\xf9\\xb8\\xcf\\x0d\\xcf\\x4c\\x1a\\x39\\xd1\\x78\\xdc\\xd3\\xe9\\x04\\xfa\\xaa\\x69\\x88\\xeb\\x84\\x23\\xd8\\x9d\\xfe\\x06\\x5f\\x85\\xe5\\x12\\xbb\\x6c\\x71\\xef\\x9b\\x6c\\xc4\\xd6\\x7d\\x0f\\x3c\\x7e\\x14\\xd6\\xca\\x5a\\x8c\\x92\\x10\\x90\\x2a\\x97\\x25\\x6d\\x20\\xc5\\xa7\\x9e\\xf1\\x97\\x22\\x23\\xa0\\x63\\x7e\\x14\\xb6\\x52\\xa1\\x25\\xa0\\xa3\\x37\\xcf\\x58\\xe1\\x2c\\x45\\xe9\\x61\\xc6\\x15\\x33\\x9d\\xcb\\xeb\\xc9\\x2c\\x26\\x16\\x93\\xf7\\x23\\xad\\x59\\xb7\\x57\\x73\\x6f\\x5f\\xd4\\xce\\xd3\\xd1\\x57\\x92\\x48\\xf0\\x5d\\x32\\x34\\x80\\x1d\\x58\\xfb\\x23\\x0f\\xa1\\x0a\\xad\\xaa\\x45\\x4c\\x82\\xf9\\x1b\\xe4\\xa2\\xc7\\x3f\\xb3\\x25\\x18\\x56\\xe4\\xb0\\x3e\\x45\\x6a\\x4d\\xcc\\x8b\\x52\\x15\\x79\\x74\\x00\\x22\\xc9\\xf1\\x5c\\x40\\xa1\\x96\\x50\\x37\\x06\\x90\\xec\\x4a\\x02\\xd1\\xcb\\xc9\\x20\\xe6\\x70\\xb0\\x1d\\x7c\\x46\\x73\\xf3\\x65\\x59\\xd4\\x79\\xd6\\x5c\\xa8\\x42\\x36\\x16\\xf2\\x95\\x2c\\x31\\x2f\\x3d\\x53\\xec\\x70\\x78\\xee\\xee\\x44\\x31\\xbf\\x3a\\x46\\x76\\x88\\x37\\x5c\\xb3\\xf9\\x15\\x88\\x8f\\xac\\xd8\\xac\\x0c\\xb9\\xb1\\x46\\x19\\x8e\\xfe\\x2b\\xc2\\xc7\\xa2\\x19\\x23\\xa9\\xbf\\x4b\\x7f\\xa6\\x30\\x8f\\x29\\xa1\\x35\\x62\\xae\\xbf\\x50\\x17\\x44\\x62\\x44\\x26\\xfe\\xac\\x5f\\x06\\xc2\\x6e\\xc8\\xb2\\xcf\\x79\\xe2\\xaf\\x85\\xda\\x14\\x90\\x7b\\xf5\\x99\\x4f\\xe5\\x99\\xea\\x90\\xe6\\x9b\\xb4\\x0c\\x9d\\x35\\xbd\\x55\\xad\\xa0\\xc7\\xf2\\xc5\\xd6\\xcd\\xff\\xd0\\xb3\\xdd\\xb3\\x21\\xf2\\x50\\x4f\\x26\\xf8\\xaf\\xe2\\x7c\\x15\\xed\\xa9\\x3f\\x24\\xa0\\x8c\\x57\\xad\\x93\\xe4\\xf8\\xf0\\x82\\xcc\\x90\\x4a\\xbe\\x3a\\x06\\xe4\\x77\\xb6\\xd6\\x04\\x5d\\xbe\\x6f\\x2d\\xa0\\x4d\\xb3\\x92\\xf8\\x4d\\x17\\xaa\\x04\\xcc\\x96\\x02\\xde\\xb4\\x70\\xe0\\xc9\\x30\\x01\\x56\\xc4\\x6b\\x75\\x3b\\x47\\x9f\\xca\\x07\\xdd\\x32\\xc2\\x91\\x41\\x09\\x26\\x54\\x96\\x02\\x1a\\xec\\x35\\x1f\\x7c\\x9d\\x25\\xeb\\xa0\\x08\\x12\\x35\\x86\\x42\\xee\\xa0\\xef\\xfc\\x2d\\x55\\x0c\\x9b\\xc5\\xde\\x6a\\xc6\\x19\\x48\\x89\\xa2\\x22\\x70\\x4c\\xab\\xd9\\x14\\xe4\\xb2\\x9f\\x90\\x71\\x1d\\x15\\x4b\\x49\\x1e\\x7d\\xf9\\x90\\x4f\\x14\\x38\\xe7\\xdc\\xf0\\x48\\x48\\xff\\x89\\xc8\\x57\\x5e\\x69\\x56\\xe8\\xe3\\x84\\x7c\\xd4\\x89\\x3d\\x5a\\x78\\xbe\\xf1\\xf1\\xcb\\xbe\\x72\\x9a\\x99\\x6f\\xe1\\x1e\\xf2\\xf8\\x3e\\xa6\\x83\\x21\\x30\\xbb\\x92\\xa4\\xed\\x72\\x9d\\x6d\\x31\\xd8\\x2a\\x56\\x66\\xfe\\x6f\\xcc\\x7c\\x40\\x15\\x2f\\x5c\\x4a\\xc6\\x0c\\xf6\\xc0\\x23\\x3b\\x53\\xc9\\x5e\\x87\\xb5\\x48\\x2c\\x2f\\xb5\\xd9\\x0c\\xc6\\x4c\\x58\\x41\\x54\\x6d\\xb9\\x09\\x93\\xa3\\xcd\\xf8\\xf7\\x07\\xee\\xe4\\x1d\\x6b\\x2e\\xfd\\x90\\x86\\xd8\\x2b\\x3e\\x1e\\x7e\\x98\\x33\\xdd\\x53\\xc2\\x42\\x57\\x79\\xc5\\x46\\x07\\x67\\x2f\\x23\\x9a\\x83\\x45\\x4d\\x2b\\xcd\\xff\\x50\\x92\\x94\\x78\\xcc\\xba\\xa0\\x3a\\x64\\x6c\\x52\\xe2\\x0d\\x10\\x30\\xfc\\xb8\\x2d\\x12\\x65\\xe3\\x40\\xf6\\x73\\x6b\\xa3\\x33\\x58\\x38\\x18\\x74\\x25\\x26\\x82\\xc9\\x09\\x1d\\xa4\\x0a\\xc1\\xb4\\xb8\\x6c\\xff\\x7a\\xa1\\xfb\\xd1\\x95\\x62\\x3a\\x5b\\x59\\x33\\xaa\\x37\\x58\\x2d\\x32\\x98\\x43\\x97\\xaf\\x57\\x6a\\xaa\\x86\\x0d\\x27\\xb0\\x7f\\x29\\x11\\xb7\\x32\\x1c\\xc2\\xa9\\x43\\x11\\xf1\\x15\\x16\\x64\\x0e\\x4a\\xa6\\x31\\xbb\\xf9\\x15\\x7c\\x36\\x29\\xcd\\x98\\xf5\\x96\\x2d\\x8c\\x51\\xfc\\x8e\\x80\\xbd\\xc1\\xa6\\x67\\x7c\\x79\\x30\\x8b\\xae\\x0f\\xad\\x39\\x63\\xb2\\xfb\\xfb\\x3b\\x1b\\x93\\xe4\\x76\\xef\\xf6\\x36\\x30\\x91\\x6d\\xba\\x5d\\xc2\\x2a\\x8a\\xcc\\x1b\\xad\\x17\\x64\\xac\\x9b\\x33\\x6b\\x62\\x49\\x85\\x98\\x69\\x29\\x34\\x65\\x69\\x2e\\x00\\x6f\\x32\\x21\\x3f\\x30\\x79\\x29\\x92\\x12\\xaa\\xb0\\xb0\\xfd\\x43\\xc6\\xbf\\x27\\x6e\\x50\\xeb\\xcb\\x9c\\x96\\xf2\\xc0\\xc0\\x4e\\xaa\\x3f\\xc3\\xfa\\xf5\\x94\\xab\\x0b\\x87\\xb2\\x5f\\xac\\x0a\\x4b\\xf0\\x90\\x74\\x38\\xfa\\x9e\\x39\\xef\\x2f\\xd8\\x6d\\x5a\\x3f\\x0a\\xb6\\xf1\\x21\\xb9\\xdd\\xe9\\x90\\xcf\\xa5\\x17\\x42\\x33\\x7e\\xc7\\xe2\\x73\\x96\\xb0\\x36\\x6d\\x3c\\x00\\x85\\xa8\\x5f\\xd8\\x4b\\xa6\\xa2\\x58\\x54\\x21\\xde\\x6c\\x8e\\x16\\xee\\x92\\x90\\x12\\x43\\x8c\\xb4\\x0f\\x28\\x26\\x23\\x71\\x31\\x9a\\x65\\x75\\x78\\xbf\\x87\\x32\\x73\\xb3\\x8e\\xb0\\x23\\x93\\x65\\x1d\\xff\\x4e\\xf9\\xd7\\x5f\\x52\\x14\\xac\\xec\\x2b\\x39\\x93\\x72\\x2c\\x09\\x27\\x92\\xaa\\x9d\\xdb\\x68\\x01\\x8d\\x1f\\x9c\\xd0\\x5a\\xe7\\xda\\x58\\xfe\\x0d\\x1d\\x57\\x09\\xa5\\xef\\x50\\x4a\\xdc\\x8d\\x18\\x48\\x6b\\x3b\\xb5\\xb0\\x07\\xa5\\xb2\\x6e\\x5b\\xd9\\x66\\x28\\x04\\xd1\\xc8\\x4a\\x91\\x15\\xec\\x32\\xd2\\x7b\\x11\\xc5\\x71\\x56\\xd2\\x74\\xe2\\xa4\\x5f\\x63\\x13\\xc6\\x1e\\x6a\\x37\\xdc\\x23\\xf2\\x19\\xe1\\xfa\\xd3\\xcc\\x6f\\x3c\\xff\\x6c\\x5c\\x8b\\x2a\\x65\\x91\\x57\\x26\\xca\\xf9\\x69\\x09\\x7f\\x83\\xf8\\x49\\xdb\\x6b\\x84\\x1f\\x53\\xb2\\x0f\\x47\\x74\\x44\\xec\\x34\\x26\\x53\\x8d\\xae\\x89\\x13\\xcc\\xc3\\x38\\x47\\xf1\\x9d\\x4a\\x42\\x91\\x11\\xe9\\x7b\\xf8\\xac\\xd1\\x53\\x1d\\xf7\\xc1\\x55\\x66\\xbe\\x01\\x27\\x4b\\x29\\xbd\\xfc\\x96\\x93\\x7e\\x05\\xd8\\x96\\x8f\\xf2\\x44\\x0c\\xc1\\x9e\\x53\\x15\\xa2\\xa7\\x4d\\xa8\\x56\\x9b\\x77\\x71\\xf2\\x37\\x90\\x9b\\x61\\xca\\x9d\\x93\\xf9\\xcc\\x4a\\x84\\xcc\\x60\\x0d\\x45\\x24\\xca\\x24\\xa4\\xc9\\x7e\\x0b\\x4e\\x11\\x5e\\xdc\\x2e\\x56\\xd9\\xd9\\xf3\\xf5\\xa0\\x4a\\x24\\x30\\x1d\\x13\\x2e\\xf2\\x47\\x66\\xda\\x1d\\x50\\xb2\\xa3\\xea\\xf3\\x06\\x95\\xb4\\x36\\x0c\\x5b\\xbd\\xff\\xd3\\x24\\x31\\x1b\\xc9\\xb8\\x38\\x33\\x8d\\x31\\xa3\\x5b\\x50\\x98\\xe2\\xec\\x97\\x27\\xa6\\xa6\\x7e\\xf7\\x0d\\x62\\x8b\\x79\\x90\\x0c\\x63\\xec\\x01\\x44\\x42\\x2e\\x6d\\xd9\\xd3\\x2c\\x9c\\x0d\\xe4\\x4e\\x3b\\x8e\\xc3\\x8f\\xaa\\xa9\\x84\\x1b\\x79\\xe8\\x6a\\xc2\\x00\\x1a\\xd2\\x8e\\xe7\\xc0\\x4e\\x8a\\x05\\xd1\\xcb\\x5e\\x2f\\x64\\x17\\xcd\\xbc\\x36\\xb9\\x8a\\x03\\xbc\\x85\\xd1\\x13\\x9d\\x4d\\x67\\x7e\\x68\\x35\\x40\\x7b\\xb2\\x19\\x1c\\x50\\xca\\xfc\\x4c\\xc5\\x6b\\xb3\\x3e\\x17\\x69\\x22\\xdb\\x00\\xfd\\x57\\x1a\\x33\\x2c\\xb0\\x6b\\x4b\\x6a\\x61\\xf0\\x23\\x1d\\xe6\\xe5\\xbb\\x4e\\x80\\x92\\xbc\\xf6\\x89\\xf1\\xef\\x4f\\x8a\\x1f\\x33\\x7c\\x94\\x3e\\xe2\\x3d\\x27\\xfa\\x57\\xb2\\xf0\\x89\\xda\\xa5\\x5e\\x69\\x4f\\x36\\x40\\x8a\\x92\\x16\\xad\\xc5\\xb9\\x32\\xe3\\x50\\x05\\x65\\x44\\xad\\x7c\\xce\\x51\\xa9\\x72\\x5b\\x76\\x07\\xeb\\x6f\\x90\\x3c\\xbf\\xe4\\x04\\x9f\\x35\\x19\\x16\\xe1\\x7f\\x6d\\x89\\x66\\xd3\\xfa\\x65\\x46\\x67\\xf4\\x32\\x84\\x3d\\xe9\\xaf\\x30\\x15\\x37\\x36\\x79\\x9d\\xd9\\x4b\\x55\\x79\\x12\\x1a\\xe4\\x2d\\xf2\\xad\\x67\\x71\\x44\\x26\\x19\\x65\\xf3\\x54\\x14\\x6c\\x10\\xe0\\xb0\\x96\\xd9\\xc7\\x59\\x81\\x1b\\xc0\\x96\\x5f\\x34\\x3f\\xb8\\xb7\\xbe\\x08\\x78\\x03\\xa5\\xf0\\x67\\xc9\\x88\\x5b\\xaf\\xbf\\x4c\\x68\\x95\\xd0\\x69\\x5c\\x7e\\x8b\\x14\\x7d\\x22\\x65\\x62\\x5a\\x29\\x5c\\x11\\x3a\\xf7\\x03\\xd8\\x83\\x2d\\x0f\\xbe\\xbb\\x3d\\xa9\\x91\\x3b\\x8f\\xb8\\x32\\xa8\\xb4\\xe5\\x2e\\xa4\\x52\\xaa\\x6c\\xc5\\x50\\x99\\x2d\\xf5\\x47\\x6c\\xab\\x63\\x9c\\xfc\\x54\\x29\\x0e\\x29\\x20\\xaf\\x7a\\xdd\\x7d\\xc0\\x8c\\x9c\\x2f\\x5f\\x9b\\x93\\x93\\x54\\xfc\\xaa\\x98\\xce\\xff\\x8f\\x0e\\x71\\xf0\\x07\\x22\\x62\\x3c\\x28\\xc3\\xd9\\xa5\\x9e\\x12\\x75\\xde\\xb3\\x04\\x85\\x73\\x28\\x95\\x97\\xfa\\xbb\\x35\\xa9\\x66\\x12\\x48\\x85\\xba\\x19\\x9b\\x15\\x17\\xe7\\x20\\x95\\xf2\\xdf\\x61\\x30\\xbf\\x00\\xae\\x6b\\x6e\\xfd\\xe6\\x27\\xe2\\xb0\\x30\\x31\\xc8\\x8f\\x85\\xf3\\x4c\\x77\\x16\\x5d\\x7a\\x92\\x8a\\xed\\x60\\x9c\\x7a\\xcd\\xde\\xb9\\x6f\\x00\\x72\\x3e\\x0e\\x7f\\x4b\\x02\\xf7\\x72\\x7d\\xfe\\x3e\\x1c\\x76\\x17\\x14\\xc4\\x21\\xf6\\x5d\\xfb\\x03\\x82\\x6a\\x16\\x73\\x8d\\x60\\xe2\\xf4\\xdf\\xe8\\xc5\\x88\\x7a\\x30\\x99\\x54\\xa0\\x54\\xa1\\x60\\x68\\xb0\\xc2\\xd9\\x60\\xfe\\x65\\x51\\xc8\\x72\\x98\\x96\\x6e\\xa4\\x13\\x88\\x07\\x02\\xc3\\x28\\xf5\\x2c\\x0f\\x8d\\x14\\xd4\\xcd\\x27\\x03\\x0c\\xcf\\xd9\\x6e\\x87\\xea\\xb2\\x10\\xc0\\x6e\\x47\\xdb\\x91\\x7f\\x7f\\x4f\\xaa\\x0f\\x2b\\x27\\xed\\x97\\x5b\\xa7\\xf0\\x56\\x8f\\xcc\\x24\\x25\\xf1\\x2d\\x04\\xe3\\xa0\\xf2\\x44\\xa7\\xf5\\xd8\\x41\\x3e\\xb0\\x81\\x84\\x55\\xbb\\x6d\\x70\\x77\\x63\\xb8\\x87\\xb5\\xfd\\x31\\x60\\x39\\x9e\\x0b\\xa0\\x30\\x5d\\xc7\\x31\\x59\\xad\\xfc\\x50\\xfd\\x23\\x69\\xd9\\x2a\\x90\\x6b\\x4f\\xc5\\x98\\x0b\\x7f\\x6c\\xfb\\x2b\\xde\\x69\\x7a\\xb1\\x9a\\x2a\\xf0\\x0c\\x1d\\x11\\x19\\xab\\xe6\\x49\\xb7\\x9f\\x0a\\x3a\\x42\\x2f\\x84\\x40\\x53\\xc1\\x46\\xe2\\xd7\\xe1\\x6c\\x73\\x9b\\x64\\xf2\\x33\\xc5\\x36\\x40\\x15\\xae\\xfd\\x11\\xdf\\x47\\x21\\x3a\\x8b\\x33\\x1f\\x45\\x38\\x99\\x6a\\x14\\xeb\\x80\\xd6\\x7e\\x66\\x74\\xfc\\x8d\\x07\\xcb\\x8f\\x36\\x51\\xf1\\x10\\x3e\\x05\\x06\\xb5\\xb0\\xc2\\x35\\x89\\xf8\\x34\\xe0\\xd4\\x8d\\x39\\x4b\\x4b\\xab\\xd5\\x50\\x79\\xcb\\xb7\\xb1\\x6a\\x56\\x83\\x21\\x2f\\xc1\\x1c\\x20\\xca\\x17\\xda\\x30\\xf2\\x96\\xd2\\xbf\\xa2\\x34\\x82\\xaa\\x20\\xca\\x71\\x19\\x39\\x4e\\x10\\x97\\x10\\x2e\\xb5\\x58\\xb6\\xd5\\x2e\\x13\\xc2\\xd2\\xf0\\x9b\\xd8\\x3a\\x98\\x9b\\x3b\\x12\\x8f\\x46\\xb6\\x88\\x2f\\x7c\\x95\\xb8\\xcb\\x62\\x74\\x25\\x01\\x44\\x1c\\x6e\\xef\\xcf\\x83\\xbd\\x73\\x12\\x1d\\xf9\\x39\\xcc\\x01\\x66\\xa5\\x9e\\x81\\x8f\\x47\\x03\\x43\\x33\\x00\\x72\\xbe\\x3f\\xbd\\xc6\\x4d\\xa2\\x5e\\x82\\xa0\\xc4\\x38\\x37\\xb4\\x93\\xb1\\x69\\x55\\x37\\xa0\\x8a\\x43\\x5e\\xc9\\x07\\x02\\x7f\\xf8\\xe3\\x66\\xeb\\xf2\\x06\\x29\\x1e\\x6c\\x58\\x34\\xce\\x67\\x14\\xbc\\x20\\x0b\\xc3\\xa2\\x89\\x7e\\x13\\xf3\\xe3\\x73\\x51\\x16\\x24\\xeb\\xa1\\x3e\\x46\\x11\\xd9\\x43\\xdc\\xaf\\x9f\\x3a\\xb0\\x4b\\xf9\\x9f\\x62\\xea\\x9d\\x35\\x30\\xf6\\x9b\\x09\\x49\\xb8\\xd8\\x7a\\xc3\\x75\\x98\\xc3\\xb1\\x08\\x29\\x39\\x19\\xfc\\x4b\\xad\\xe7\\xce\\xd2\\x2c\\xac\\x57\\xe7\\x2a\\x75\\xb1\\x1f\\x3c\\x75\\x6b\\x57\\x56\\xb6\\x0d\\x55\\xc9\\x4a\\xba\\x94\\x2d\\x0d\\xac\\x71\\x85\\xcc\\xe2\\x92\\xa5\\x98\\x8e\\xc9\\x28\\x8b\\xb0\\xd8\\x87\\xca\\x11\\xd5\\x53\\x61\\x4a\\x21\\x0e\\xad\\x9e\\x0d\\x34\\xb7\\xd3\\x8e\\xb5\\xaa\\x41\\x6c\\x2c\\x2a\\x2f\\xe9\\x35\\x1c\\x2d\\x0a\\x7b\\x7f\\x4e\\xd9\\x1c\\x5e\\x19\\xde\\x59\\x68\\x0a\\x5f\\x66\\xb7\\x9d\\xff\\x80\\x09\\xf1\\x9c\\x1c\\x47\\x0d\\x00\\x24\\xad\\x3f\\xaa\\xae\\x51\\x3f\\x0e\\x80\\x57\\x7f\\xfa\\xf4\\xa7\\xe4\\x15\\x32\\x7c\\x8b\\xa4\\xdc\\x42\\x8a\\xa0\\x22\\x4e\\xd4\\xcf\\x84\\xcd\\xe4\\x44\\x92\\xc9\\x83\\x5a\\x6e\\x96\\xec\\xd8\\xe3\\xcf\\xd5\\xd7\\xed\\x4a\\x05\\x12\\x97\\x17\\x81\\x53\\x69\\x15\\x6c\\x15\\xd9\\x56\\xac\\x4e\\xca\\x92\\x96\\x96\\xfc\\x84\\x18\\x74\\x54\\xbd\\x7f\\x59\\x02\\x92\\x62\\x26\\x39\\x75\\x0e\\x4c\\xa7\\xe2\\xfd\\x3f\\x78\\x70\\x89\\xcc\\x71\\x1b\\x9e\\x99\\x3c\\x70\\xb9\\x96\\x06\\x53\\x08\\xe2\\x02\\xbe\\x82\\x20\\xfb\\x7d\\x03\\x85\\x8e\\x27\\x82\\x4b\\x75\\x94\\x0d\\xe8\\xd8\\xa5\\x36\\x3e\\x12\\xaf\\xa3\\xd7\\x62\\x05\\xbd\\x57\\x1e\\x97\\x09\\x4d\\x77\\xda\\xc8\\x64\\x27\\x9c\\x56\\x6c\\x12\\x01\\x26\\xd8\\x1d\\xd9\\x69\\xc5\\x4e\\xd5\\x61\\x87\\xb8\\xc5\\x3f\\xff\\x0f\\x00\\x0f\\x13\\xf0\\xec\\x87\\x5c\\xaf\\x8e\\x52\\xe9\\x00\\x04\\x06\\x21\\x94\\x81\\xa7\\x92\\xcb\\xaa\\xfe\\x48\\xd1\\x4d\\x22\\x19\\x39\\x5c\\x80\\xb1\\x83\\x91\\x4a\\x77\\x2d\\x37\\x9a\\xcd\\xdb\\xdc\\x5d\\xd8\\xd3\\x7c\\x91\\xdb\\x12\\x40\\x1b\\xc5\\x3b\\x7a\\x92\\x01\\xa5\\xe5\\x59\\x84\\xdd\\xd9\\x9b\\x0b\\xc0\\x7e\\x88\\xd0\\x9f\\x10\\xe6\\x32\\xf1\\x94\\x7b\\xbf\\x44\\x6a\\xf0\\x08\\x3b\\x9c\\x63\\x4f\\x95\\x90\\x4d\\x36\\x44\\x6f\\xb9\\x34\\x34\\x02\\xaf\\x4b\\x30\\x5a\\x1d\\xe6\\x51\\x92\\xe4\\xe0\\x6d\\xcb\\x76\\xc2\\x9b\\xf3\\xcd\\xa1\\xae\\x8f\\xe6\\x8a\\x66\\x17\\xaa\\xe8\\xdd\\x5d\\x21\\xde\\x16\\x8d\\x63\\x75\\xdc\\xbb\\x9e\\x24\\xfe\\x3d\\xe9\\xe6\\x88\\x2a\\x9f\\x21\\xa6\\xdf\\x4c\\x59\\xc3\\x74\\x56\\x40\\x03\\x49\\x43\\x1f\\x4d\\x24\\x81\\x49\\x84\\xcc\\x42\\x60\\xa6\\x92\\x17\\x2b\\x98\\x48\\x01\\xf7\\x55\\x72\\x49\\x2b\\xf6\\x5b\\x4b\\xc2\\x43\\x23\\x78\\xaf\\x16\\xda\\x7a\\x91\\x4c\\xe0\\xd4\\x53\\xd8\\xe1\\x4b\\x2e\\x79\\xd2\\x8c\\x22\\xd3\\x42\\x89\\x34\\xd7\\xe9\\x28\\xa0\\xfd\\xa1\\x78\\x04\\xc1\\xb4\\x54\\x25\\x2a\\x0f\\x0c\\x22\\xc6\\xf5\\x5e\\xba\\xbb\\xf2\\x6b\\x27\\xdc\\x29\\x6e\\x27\\xf9\\x6c\\x51\\x16\\x50\\x64\\x41\\x30\\x71\\x23\\x55\\x39\\x90\\x86\\xa7\\x79\\xfb\\x02\\x76\\x5e\\xbc\\x43\\xd1\\x61\\x11\\x66\\x5a\\xc1\\xea\\x8c\\xe5\\x60\\x65\\x13\\x02\\xec\\x99\\x7e\\x14\\x59\\x24\\x50\\xb3\\x68\\x78\\xcb\\xab\\xcf\\x9a\\x8c\\xa1\\x74\\xb6\\xee\\xb2\\xc5\\x24\\xe3\\x9c\\x92\\xe4\\xbe\\x8a\\xaa\\x1e\\xd3\\x97\\x80\\x80\\x07\\x6f\\xd3\\xf4\\x42\\x9f\\x90\\xac\\x04\\xc2\\x2e\\x52\\xad\\xe4\\x2d\\xa4\\x0c\\x46\\xd3\\x62\\xd7\\xcc\\x54\\x66\\xcf\\x9d\\xff\\x03\\x3d\\x3e\\x46\\xda\\x9b\\x72\\x89\\xdb\\x64\\x80\\x61\\x31\\x03\\x53\\x09\\xf4\\x2f\\x07\\x15\\x9b\\x2a\\x4a\\x16\\x1f\\xf0\\xa0\\x3a\\x56\\x39\\xce\\xea\\xc3\\x55\\x98\\x10\\xe2\\x42\\x90\\x46\\xcb\\xf0\\x1b\\x4a\\xab\\x73\\x9d\\x0b\\x9e\\x8d\\x34\\x36\\xd6\\xb3\\x79\\x32\\xdc\\xa8\\x68\\x56\\xec\\x4e\\x02\\x70\\x6e\\x02\\x0f\\x8d\\x63\\x40\\x8c\\x07\\x38\\xd2\\xf5\\xd7\\x70\\x4a\\x9e\\xaa\\x60\\x3e\\x63\\xd8\\x7e\\x95\\x0e\\xd9\\xe9\\xf7\\xac\\x24\\x8d\\x09\\xa2\\x91\\x1a\\x42\\xac\\xa0\\xb1\\x2d\\x04\\xe7\\xe0\\x75\\xa0\\xde\\x11\\xb4\\x8a\\x03\\xbc\\xd9\\xa2\\xfd\\x26\\xc8\\xc9\\x81\\xbd\\x9e\\x38\\x64\\x1f\\xec\\xba\\x76\\x94\\x2f\\x9c\\x18\\x91\\x89\\x6e\\x56\\x8b\\x83\\xb6\\xf9\\x51\\x70\\x84\\x4f\\x21\\xa7\\x18\\xdc\\xd7\\x2a\\xe5\\x15\\xd5\\x17\\xf6\\x95\\x31\\xc8\\x6d\\xdc\\x7d\\xa5\\x4c\\xa4\\x6d\\xde\\x9e\\x32\\x8b\\x01\\xf0\\x2f\\xf9\\xfa\\x12\\x66\\x57\\x88\\x9b\\xc0\\x8a\\x94\\x18\\x6d\\x74\\xdd\\xed\\xd8\\xec\\x6d\\x1f\\xba\\xc8\\xa1\\x47\\xc9\\x83\\x81\\x3d\\x30\\x5b\\x73\\x71\\xba\\xce\\x20\\x40\\x06\\xac\\x5d\\x3b\\x03\\x56\\x50\\x37\\x0d\\x46\\x01\\x52\\x71\\xee\\xe8\\x2f\\xb7\\x25\\x70\\x70\\xb8\\xa6\\xdf\\x71\\x11\\xb6\\xe5\\x2a\\x3c\\x21\\x2c\\x40\\x88\\x61\\x70\\x80\\x4f\\x99\\x15\\x29\\x40\\xb7\\x01\\x64\\xb0\\x74\\xd1\\xa5\\x46\\x22\\x30\\x7a\\xda\\xec\\xd2\\x65\\x67\\x63\\xb6\\xbb\\x7f\\x84\\xd8\\xa3\\x36\\x24\\x86\\xf5\\x10\\x2b\\xab\\xb1\\xaa\\x1d\\xee\\x89\\x22\\x34\\x0c\\x2f\\xd6\\x02\\xbf\\x07\\x3d\\x8d\\xd3\\x1a\\x03\\x6c\\x99\\xa4\\xc2\\x0f\\xda\\xe3\\x84\\xe0\\xa1\\x06\\xc9\\x9e\\x80\\xb3\\xd1\\x6f\\x7f\\x81\\x75\\xb3\\xc3\\xf3\\x8d\\x81\\x8c\\x51\\xbc\\x31\\x40\\x37\\xd1\\xee\\xdb\\xca\\x06\\x93\\x1b\\xa2\\xac\\x2b\\x29\\x09\\x7e\\x0b\\xc2\\x95\\xd8\\xc9\\x13\\x93\\xce\\x39\\x38\\x21\\xe1\\x23\\xa8\\x37\\xc1\\xab\\xe8\\xc3\\xe0\\x96\\x0b\\xfe\\x70\\x38\\xf2\\xdd\\x14\\xe4\\x76\\xe7\\x81\\x52\\x91\\xff\\xf0\\x9d\\x0d\\x4e\\xa0\\x82\\x45\\xf2\\xab\\xba\\xb5\\x2c\\xa7\\x26\\x19\\x04\\xf9\\x65\\xb0\\xdc\\x8e\\x81\\xe8\\x20\\xcc\\x1f\\x69\\x81\\x7b\\x43\\xd7\\xf3\\x36\\x99\\x9a\\x5d\\xea\\x7e\\x2c\\x7a\\x94\\x24\\x19\\x4e\\x91\\xe7\\x7a\\x50\\x43\\x10\\x75\\xc1\\xb0\\x17\\xd2\\xa2\\xb8\\xa5\\x3d\\x98\\x0f\\x54\\x0e\\x05\\xaa\\x0e\\xb7\\x66\\xf7\\xf3\\x82\\x60\\x1e\\xb5\\x2e\\xa8\\xbf\\x61\\x15\\x49\\xb6\\x53\\x02\\xdd\\x5d\\xb9\\xd1\\x52\\xe6\\xb9\\x38\\x0d\\x9b\\x0e\\x49\\xe6\\x9e\\x59\\x62\\xac\\x37\\x2d\\x68\\xb0\\xfd\\xd0\\x7a\\x5a\\xdd\\x79\\x40\\x3a\\x32\\xa1\\x4b\\x31\\x33\\xd2\\xcd\\x01\\x27\\xf9\\x68\\x82\\x26\\x28\\x1c\\x63\\x8d\\x40\\xb0\\xc8\\xc2\\x7b\\xba\\x63\\x89\\x8d\\x7f\\xfc\\x03\\xc7\\x31\\xd2\\x75\\xf9\\xbb\\x4e\\x5f\\x9a\\x20\\x71\\xe2\\x5a\\x8d\\x87\\x04\\x66\\x0a\\xa6\\xef\\x8b\\x80\\xa9\\x8c\\x5c\\x47\\x16\\x91\\x3a\\x00\\x2f\\xc8\\xaa\\xce\\x26\\x5c\\x63\\x0e\\x8c\\x09\\x6d\\x65\\xc4\\x86\\xd6\\x8d\\xf2\\xb9\\xad\\x9b\\x92\\x62\\xeb\\xde\\x64\\x08\\x8a\\x04\\xe0\\x9e\\x70\\x05\\x73\\x78\\x95\\x26\\xe3\\xc2\\x6f\\x44\\x5e\\x0a\\x78\\x0d\\x53\\x3c\\x6d\\xc4\\xb9\\x9a\\x86\\x17\\x50\\xef\\xf3\\x16\\x39\\x6b\\xb4\\x47\\xf0\\x39\\xab\\x62\\x02\\x28\\x0d\\x62\\x51\\x58\\xdc\\x1a\\x9d\\x94\\x74\\xbd\\xad\\xee\\x4c\\x4e\\x46\\x18\\xc8\\x48\\xd2\\x61\\x2d\\xa7\\x50\\x14\\xaf\\x23\\x51\\x07\\xb7\\x55\\x41\\xe6\\x4a\\x68\\x05\\xaf\\x26\\x6e\\x8b\\x00\\xac\\x72\\x99\\x14\\xaf\\xec\\xb7\\x16\\x3c\\x51\\x81\\xb9\\x5a\\x41\\x1f\\x45\\x28\\xe0\\xf7\\x79\\x1f\\x00\\x2d\\xd7\\x31\\xea\\x2e\\x47\\x16\\x0e\\xb0\\xf2\\x7b\\x07\\x49\\xec\\x6e\\xe4\\x51\\xda\\xb4\\xf0\\x2e\\xa9\\x60\\x02\\xc0\\x8c\\x8c\\x36\\x50\\x5f\\xd2\\xa1\\x25\\x67\\x08\\x14\\x46\\x2c\\x7b\\xcf\\xf5\\xe4\\x6f\\x3d\\x19\\x3a\\xa2\\x79\\xf6\\x97\\x79\\xe3\\x64\\x25\\x6d\\xc6\\x86\\x3f\\x50\\xd4\\x34\\x16\\x28\\x18\\x4d\\xf3\\xdf\\x40\\xf2\\x81\\x6f\\xbe\\xcb\\x62\\x27\\x83\\x80\\x20\\xae\\x7a\\x23\\x6a\\x6b\\x0d\\x72\\x49\\x30\\xde\\x42\\xb7\\x2d\\x24\\xb2\\xc2\\xcd\\x43\\x00\\x03\\x55\\xe3\\x06\\x00\\x45\\xca\\xef\\x00\\x08\\x05\\xf5\\x8b\\x00\\x3f\\xf9\\x4d\\xce\\x4a\\xd7\\x3b\\x9b\\x83\\x06\\xd6\\x17\\xb0\\x61\\x4c\\xe6\\x40\\x85\\xc2\\x4a\\x58\\x41\\x80\\x69\\x21\\x03\\x96\\x2c\\x1c\\xa0\\xa0\\xf6\\xe4\\x02\\x0e\\x3b\\x11\\x68\\x9c\\x60\\xa0\\xe4\\xb4\\x86\\x0d\\x91\\xc2\\x08\\xd9\\x14\\x71\\x50\\x35\\x5e\\x6d\\x10\\xe0\\x99\\xd7\\xed\\x60\\x8d\\xcf\\x89\\xdf\\xae\\xe1\\x9e\\x45\\xb3\\x87\\x65\\x08\\x0e\\xa2\\xc8\\x5c\\x01\\xbf\\x35\\x6b\\x51\\x89\\x51\\x4d\\x3e\\xe8\\x28\\x87\\x33\\xad\\x40\\x46\\x54\\xbd\\x60\\x99\\x33\\x9e\\xfe\\x9d\\x79\\xe5\\x2d\\xb1\\x11\\x61\\xcd\\x0e\\x51\\x45\\x7e\\xd3\\x34\\x76\\x16\\x6c\\xda\\xcb\\x21\\x56\\x69\\xa1\\x80\\xa7\\x05\\x34\\x54\\x42\\x0f\\x44\\xec\\xa2\\x60\\x70\\x83\\x65\\x1c\\x7c\\xa4\\x30\\x7e\\xf3\\x08\\x88\\x34\\x24\\xbc\\x87\\xc9\\xd0\\x8f\\x3a\\x98\\xf7\\xf4\\x7d\\x42\\xf6\\xbb\\xdc\\x09\\xd7\\xc9\\x6a\\x65\\x95\\x39\\xe7\\xbd\\x76\\x4b\\xea\\x3d\\x92\\x05\\x45\\x81\\x18\\x3b\\x00\\x2a\\xa5\\xa8\\x4a\\x2b\\xcc\\x04\\x6f\\x4c\\x46\\x48\\x5e\\x2c\\x7c\\x17\\xf7\\xb2\\xe4\\x24\\x2a\\xcb\\x1e\\x0f\\x78\\xeb\\xdc\\xbf\\x9b\\x05\\x67\\x83\\x76\\x92\\xd2\\x7f\\xb9\\xcc\\x41\\xb8\\x5f\\xcc\\x39\\x83\\xfa\\xdd\\x72\\x6f\\x4a\\x15\\x7f\\x6c\\x20\\x7d\\xef\\x08\\x1f\\x7b\\xca\\xe6\\xc3\\xaf\\xaf\\xfd\\x64\\x44\\x3e\\x5e\\xae\\xb2\\xb7\\xaf\\x56\\xf5\\xad\\xfa\\x2a\\xa7\\x83\\x9d\\x5d\\xd6\\xcb\\x4b\\xaa\\xc9\\x66\\x59\\x28\\x3d\\x82\\x6b\\x0d\\x0a\\xca\\xbb\\xf3\\x50\\x5f\\x9e\\xc4\\x26\\x58\\x29\\xae\\x6e\\x48\\x0e\\x4f\\x6a\\x7e\\x96\\x7b\\x0a\\xea\\x96\\x70\\xdc\\x0a\\x68\\x00\\x13\\x49\\xf0\\x8a\\x36\\x0c\\x67\\x06\\xda\\x56\\x45\\x34\\x5e\\x8a\\xe1\\xa1\\x69\\x80\\x22\\x81\\x12\\x04\\x43\\xf9\\xbc\\x53\\xc1\\x9f\\xff\\x83\\xa3\\x39\\xc2\\x39\\xbb\\xd7\\x23\\x15\\x18\\x8b\\x6e\\x83\\x08\\xb6\\xbd\\xde\\x33\\xb9\\x5c\\x63\\xe5\\x66\\x8d\\xc2\\x36\\x63\\x20\\x80\\x92\\x59\\xbf\\xac\\x83\\x7a\\x0a\\xe7\\x8a\\x53\\x7e\\x1d\\xf8\\x03\\xf5\\x58\\x8b\\x27\\x3a\\x05\\x51\\x0b\\x9b\\x16\\xec\\xeb\\x96\\x40\\xcf\\x84\\x88\\x05\\xa0\\x4a\\x5b\\x42\\xd9\\xd9\\x24\\xfa\\xeb\\x70\\x0c\\x97\\x1d\\x26\\xaa\\xa2\\xfb\\xc8\\xbf\\xac\\xd4\\x16\\x58\\xb3\\x48\\x1b\\xd3\\x29\\xd9\\x95\\xba\\x37\\xeb\\x8a\\x8c\\xd1\\x9b\\x74\\xe4\\xea\\xa6\\x07\\x31\\x51\\x62\\xe8\\x41\\x99\\x8a\\x0b\\x63\\xc6\\xf6\\xd4\\x66\\xa4\\x04\\x10\\x5b\\x58\\x4a\\x15\\x1b\\x72\\xa5\\x18\\xfa\\x14\\x19\\x89\\x39\\x8f\\x61\\x5c\\xc0\\xd1\\x89\\x07\\x4e\\x0c\\x58\\x10\\xfe\\x0c\\x63\\x7e\\x7e\\x1e\\xff\\xe9\\x53\\xcc\\x83\\x2a\\xd6\\xbf\\x50\\x24\\x70\\x03\\x33\\x09\\xd0\\x13\\x10\\x19\\xe4\\x3a\\x06\\x01\\x8d\\xc2\\x24\\xbf\\x8d\\x65\\x94\\x34\\xa8\\x49\\xd9\\xcc\\xfe\\xc2\\x20\\x9a\\x87\\x84\\x4c\\xdb\\x51\\xb8\\x44\\x94\\x7d\\xcb\\x7a\\xc3\\x59\\xe0\\xf0\\xd9\\xe6\\x22\\x59\\x75\\x20\\x79\\x5a\\x92\\x82\\x0d\\x1b\\x7c\\x87\\xaa\\x1e\\x02\\x1f\\xd1\\x5c\\x04\\x19\\x0a\\x0d\\x05\\xf0\\xab\\xf8\\x25\\x0c\\x4e\\xe4\\xe6\\x31\\x48\\xf0\\xf3\\x40\\x0c\\xb1\\x78\\x70\\xde\\xe9\\xfd\\x36\\xc5\\x8f\\x2a\\x7f\\x8e\\x4d\\xf0\\x2b\\x3b\\x30\\x6c\\xd5\\x25\\xf6\\xbd\\x37\\xee\\x46\\x46\\x5e\\xfc\\x3e\\xa2\\xf7\\x3d\\xe7\\xc5\\xd4\\xd5\\x46\\xc8\\x51\\xc7\\x26\\x0a\\x7e\\x98\\x88\\x1d\\xbb\\x94\\x2a\\x23\\x22\\xf5\\xd4\\xf4\\x4e\\xed\\x6c\\x7e\\x0c\\xe8\\xfa\\x8b\\x3c\\x86\\xff\\xa7\\x0e\\xcb\\xc4\\xdb\\x06\\x94\\x8c\\x09\\x92\\xea\\x61\\x9d\\x79\\x1c\\xb7\\x50\\x0b\\x86\\x52\\x91\\xba\\x00\\x09\\x7d\\xd4\\xaf\\x1a\\xdc\\x1e\\x05\\x0d\\xf6\\xa9\\x5e\\x5a\\x4d\\x03\\xbc\\x05\\x9e\\x68\\xb0\\x85\\x3a\\x1f\\xef\\x2f\\x12\\xa7\\x57\\x3b\\xe9\\x6c\\x8d\\x70\\x2d\\x15\\xbe\\x7e\\xec\\x05\\x14\\x61\\x20\\x13\\x0f\\xad\\xb7\\x3a\\x45\\xca\\xc8\\x5e\\x89\\x15\\x08\\x84\\x24\\x79\\xbc\\x82\\x44\\xd2\\xc8\\x05\\x86\\xa3\\xc7\\xd9\\xd9\\x0d\\x79\\x31\\x15\\x52\\xe1\\xd6\\x09\\xd7\\x8b\\x4c\\xb2\\x20\\x9d\\xb4\\x4f\\xc3\\x6f\\x57\\xca\\x96\\x80\\xb2\\x98\\x89\\xba\\xa1\\x59\\x33\\x76\\x90\\xbc\\x26\\x63\\x08\\x13\\x96\\x71\\x76\\x0b\\x99\\xcb\\xff\\x0a\\x37\\x58\\xf0\\x22\\x0b\\xfa\\x04\\x56\\x19\\x70\\xeb\\x15\\x2d\\x78\\x32\\xac\\x46\\x96\\xc8\\x29\\xe0\\xb7\\x6d\\x85\\x56\\x51\\x48\\xc1\\x2c\\x77\\x4f\\x34\\x75\\xf5\\xf0\\xa6\\x14\\x9f\\x51\\xbd\\xda\\x5a\\xba\\x77\\x59\\xe5\\xc1\\xcc\\x49\\xb4\\x7b\\x26\\xd6\\x9b\\x84\\x27\\x40\\x17\\x0c\\xde\\xdc\\x43\\xda\\x97\\xae\\x11\\x47\\x51\\x23\\xf3\\xc5\\xf0\\xd3\\xf8\\x4b\\xb3\\x65\\x5c\\x3c\\xb6\\x41\\xe6\\x6c\\xf9\\x3c\\xb6\\x57\\xa9\\xc4\\x56\\xba\\x23\\x8d\\xa0\\x01\\x42\\x12\\x20\\x3a\\x9f\\x20\\xd6\\xcb\\x91\\xf0\\x19\\x0e\\xcb\\xbc\\xb5\\x00\\xdf\\x00\\xf5\\x41\\xa0\\x06\\x30\\x29\\x05\\x31\\x1e\\x15\\x3d\\x2f\\x3e\\x26\\x90\\x81\\x85\\x45\\x59\\xf2\\x45\\x34\\x2e\\x7c\\xb1\\xb4\\xa2\\x42\\x51\\xdc\\x75\\x80\\xf4\\x87\\x13\\x49\\x1a\\xd6\\x4e\\x6f\\xe4\\x82\\x3d\\x17\\x5c\\xab\\x9d\\xef\\x83\\x9e\\x89\\x03\\x1c\\xfa\\x88\\xe5\\xda\\xbf\\xd6\\x70\\x3c\\x5e\\xfc\\x36\\xec\\x9d\\xd4\\x46\\x6a\\xbb\\xba\\xd8\\xc6\\xdc\\x60\\xb1\\xd4\\x90\\xe5\\x94\\xa4\\x3b\\x98\\x36\\x87\\x65\\x3e\\xa9\\xc6\\xf4\\x6c\\xbf\\x9c\\x04\\x45\\xf2\\x3a\\xda\\xe5\\xbc\\x2d\\x39\\xee\\x76\\xf1\\x4b\\x04\\xf6\\x43\\x6b\\x80\\xdc\\x20\\xc5\\xda\\xfa\\xe9\\x51\\x52\\xa0\\xa5\\x8b\\x3e\\x02\\x90\\x88\\x20\\x4a\\x42\\x26\\x1c\\x6a\\x23\\xad\\xd1\\x81\\xc7\\xb7\\x2d\\xd0\\x64\\xa5\\xe1\\x44\\x10\\x3b\\xdb\\x51\\x5f\\xb1\\x95\\x66\\x0c\\x69\\xeb\\xe9\\x3f\\x11\\x89\\x39\\x27\\x55\\x68\\xd9\\xbf\\xef\\xaf\\x06\\x06\\xfd\\x9a\\xb0\\x11\\x46\\xda\\x24\\xf1\\x9a\\xc1\\xaf\\x71\\xc8\\xb4\\x3d\\xd6\\xb2\\xe9\\x40\\x62\\x9e\\xa9\\x15\\xee\\x29\\x81\\x1e\\xef\\xa5\\x51\\xe7\\xe1\\x43\\xd2\\x3d\\x6d\\x72\\xa7\\x31\\x64\\xb1\\x15\\xcb\\x9c\\xdc\\x12\\x30\\x74\\x79\\x20\\x86\\xc8\\x00\\x23\\xd2\\x93\\x68\\x42\\xa8\\x8f\\x78\\x5a\\xb1\\xf0\\xa0\\x75\\xc7\\x2f\\x00\\xd9\\x24\\x27\\x2c\\x3e\\x66\\x73\\xb5\\xb7\\x3e\\x80\\x92\\xf4\\x54\\xd1\\x3f\\xcd\\x54\\x52\\xbd\\x26\\x64\\x3f\\x53\\x2a\\x38\\xc2\\x95\\xe8\\x84\\x26\\x02\\x76\\xca\\x01\\xd6\\x3b\\xc5\\x6b\\x42\\x85\\x5a\\x74\\x23\\xd6\\x83\\x94\\x4e\\x84\\x3a\\xc5\\x4f\\x1a\\x0d\\x11\\x40\\x9c\\xfa\\x6e\\xb2\\x0f\\x58\\xc8\\x62\\xd7\\x51\\x6c\\xf9\\x8f\\xee\\x05\\x6d\\x4d\\x4f\\x10\\x5c\\x52\\x09\\x82\\x99\\x06\\xbd\\x94\\xb2\\x72\\x40\\x81\\x37\\x8d\\xc9\\x13\\x9c\\x4b\\x1d\\x09\\x1a\\xf9\\x4f\\x03\\x61\\x58\\x00\\x5e\\xaa\\x81\\xd1\\x3e\\xf2\\x94\\x2a\\xce\\xe6\\x63\\xe7\\xae\\x44\\x31\\x91\\x46\\xb2\\x83\\x74\\x26\\xb9\\x3c\\x89\\x10\\x1f\\x84\\xc4\\x9b\\x44\\x5e\\xf2\\x82\\xf7\\x1d\\x51\\x00\\x4d\\xcb\\x13\\x03\\x47\\x3d\\x1c\\x68\\x8c\\xba\\x38\\xb8\\x1b\\x0b\\x51\\xcf\\x62\\x96\\x49\\xc8\\x67\\xb1\\x0e\\x2e\\x60\\x06\\xec\\xb4\\x36\\x60\\xaf\\x4b\\xc8\\x15\\xd4\\xdb\\x5a\\xc6\\x6e\\x40\\xd1\\xbf\\xea\\xd9\\xf1\\x76\\xe9\\x6d\\xa6\\x73\\x84\\x60\\x8a\\xc0\\x3e\\x5a\\x14\\x41\\xf0\\x73\\x0a\\xd4\\x4c\\xf5\\x52\\x4f\\x4d\\xa0\\x7d\\x09\\x8a\\xa6\\xef\\xdc\\xdd\\x52\\x09\\x8c\\x5f\\x13\\x77\\x6d\\xf5\\x07\\x42\\x6c\\x17\\xfa\\xf2\\x1d\\x75\\x6b\\x62\\x7a\\xf2\\xd8\\x00\\x22\\xac\\x5c\\x63\\x57\\x56\\xf0\\xee\\x86\\x86\\x33\\x2b\\x54\\xa1\\x3d\\x01\\x11\\x87\\x4e\\xab\\x01\\xf8\\x1a\\x75\\xd8\\x9d\\x2a\\x40\\xa9\\x30\\x9f\\x04\\xe1\\x13\\x91\\x88\\x47\\x1d\\xa7\\xa2\\x2a\\x58\\xe2\\x98\\x7f\\x98\\xc7\\x68\\x12\\x7a\\x2d\\xf2\\x02\\xe8\\xbb\\xe7\\xbf\\x46\\x6d\\x54\\xd0\\x01\\x24\\x9c\\x7b\\x7a\\x2c\\xc4\\x5b\\xf6\\x88\\x98\\x3a\\xc6\\xd7\\x2f\\x15\\xec\\xf6\\xd7\\x70\\x96\\xbf\\x49\\x4f\\xd8\\x60\\x90\\x97\\x02\\x0c\\x16\\x73\\xb4\\xa8\\xaf\\xbf\\x0f\\x02\\x96\\x42\\x81\\xe5\\x66\\x17\\x9f\\x0b\\x61\\x83\\x24\\x70\\x51\\x67\\x42\\x6f\\x1b\\xd8\\xc9\\xe0\\xe0\\x7a\\x86\\xa3\\xe4\\x4d\\x04\\x36\\x12\\x9f\\xed\\xc7\\x29\\xfe\\xc5\\x20\\xfd\\xcd\\xd0\\x9b\\x54\\xd0\\x10\\x8f\\xf5\\x50\\x83\\xfb\\x7c\\xa1\\x0e\\x00\\xac\\xed\\x3e\\x25\\xb8\\xaa\\x4a\\xd6\\x5c\\xc0\\x69\\x3f\\x42\\x35\\xf6\\x55\\x61\\xad\\xe1\\x41\\x29\\x5e\\x3c\\x58\\x58\\x99\\xdc\\xe1\\x61\\x72\\xa6\\xce\\xce\\x16\\x00\\xf3\\x77\\xed\\x82\\xea\\x85\\x9f\\x85\\x97\\xdc\\xb4\\xec\\xd4\\xb2\\x81\\xb4\\x3a\\xa8\\x6f\\x7e\\x3d\\xd2\\x21\\x1e\\x5b\\x6b\\xf0\\x1f\\xce\\x22\\x30\\x05\\x1d\\x6c\\x75\\xb7\\x15\\xec\\xee\\x9d\\x62\\x83\\x6f\\x51\\x94\\xe9\\x86\\x83\\x81\\x8b\\x12\\xae\\x72\\x13\\xb3\\x15\\x82\\xbc\\x64\\xe4\\xdb\\x7a\\x7b\\xe2\\x60\\x66\\x2f\\x8d\\x97\\x3d\\x8d\\x14\\xf8\\x46\\x0e\\xf1\\x18\\x31\\x6e\\x71\\x2b\\xcb\\xf2\\x4b\\xfd\\xc2\\x12\\x52\\xb8\\x7d\\xe5\\xa3\\x46\\xe5\\x3c\\x52\\xc7\\x05\\xc2\\x8d\\x87\\x0d\\xd0\\xbd\\x57\\x79\\xb8\\x1c\\x37\\xd6\\x64\\x2a\\x1c\\x74\\x24\\x96\\x3a\\xba\\x84\\x15\\x5d\\xbd\\x10\\xd2\\x58\\x9c\\xcd\\x25\\xdd\\x27\\x96\\x78\\xb0\\xc1\\xa2\\xc9\\x51\\x33\\x21\\x08\\xdd\\x96\\xc0\\xa1\\x8c\\x66\\x40\\xb2\\x55\\xd2\\xd6\\x3c\\x9b\\xb3\\x0c\\x37\\x16\\xdd\\x19\\x59\\x49\\x45\\xa8\\x1c\\x7d\\xe7\\x18\\xa9\\xb0\\x6e\\xcd\\x87\\xa1\\x07\\x47\\x52\\xce\\x86\\xc5\\xee\\x25\\x59\\x60\\x5d\\x5a\\xda\\xd4\\x0e\\x81\\x6c\\x13\\x54\\x9d\\x39\\x75\\xb3\\x9b\\x14\\x36\\x60\\x63\\x8a\\x9a\\xd4\\x17\\x85\\xe2\\xb4\\x95\\x12\\x27\\x5f\\xcc\\x60\\xd6\\x1e\\x1e\\x80\\xe3\\x83\\x4b\\xaf\\x95\\x32\\x68\\x8e\\xb2\\xc9\\x43\\x58\\xf2\\x29\\xef\\x47\\x82\\x99\\x55\\x75\\x31\\x03\\x3e\\xfb\\x08\\x55\\xa5\\x5e\\x40\\xbe\\x3b\\x70\\xb4\\x03\\x0f\\xb1\\x25\\x36\\xab\\x43\\x8b\\x07\\x10\\x8c\\x6d\\xc8\\x7d\\x05\\x34\\xf8\\xc6\\x82\\x62\\x11\\x61\\x4d\\xc4\\xdd\\x1d\\x88\\xce\\xee\\x53\\x78\\x4c\\x99\\x88\\xa7\\x2e\\x4f\\x61\\x27\\x84\\xc7\\xe7\\x8a\\xd8\\x32\\x1b\\x1b\\x98\\x4c\\x83\\x4f\\xe1\\x10\\x54\\x1c\\xc0\\x6d\\x0a\\x77\\x19\\x9a\\x4f\\x60\\x77\\x0e\\x05\\x58\\x9a\\xbc\\xee\\x1b\\x69\\x8b\\xbf\\x0d\\xa6\\x08\\x54\\x19\\x97\\x90\\x4d\\xd2\\xab\\x27\\x2a\\xb1\\x9c\\xb0\\x6b\\xc6\\xc1\\x17\\xe2\\x38\\xc0\\xad\\x16\\x02\\xab\\x9c\\x4d\\xf1\\x3d\\x4b\\x92\\x0e\\x18\\x96\\x6c\\xa0\\x2a\\x37\\xb4\\x89\\x5c\\xe4\\xfd\\xd0\\x52\\x82\\xb9\\x09\\xc3\\x88\\xd9\\x38\\x2b\\x50\\x9c\\x2f\\x93\\x97\\x94\\xe5\\x7d\\x8b\\x39\\x4c\\xac\\xdc\\x90\\x9e\\xc9\\xc0\\xfa\\x4a\\x08\\x5f\\xbb\\x53\\x8a\\x4c\\x9b\\x0c\\xb0\\x28\\x69\\x69\\x5c\\x0d\\xbb\\xaa\\x61\\xd9\\x19\\xa5\\xba\\x97\\x0c\\x13\\xd1\\x42\\x84\\x02\\x05\\x51\\xec\\xf6\\xef\\x93\\xc1\\x4e\\xd8\\xb8\\x8d\\x10\\x92\\xb8\\x11\\xd4\\xdc\\x35\\x62\\x25\\xa8\\xda\\xc9\\xd2\\x86\\xd6\\xca\\x49\\xed\\x9c\\x5a\\xb0\\x5a\\xb6\\xd9\\x71\\x6b\\x79\\x4b\\xd9\\xf1\\xe6\\xe9\\xb5\\x39\\xb0\\x08\\x4f\\x76\\xc0\\x40\\x23\\x04\\xcf\\xc1\\xc0\\x47\\xd6\\x24\\x5b\\xd7\\x6c\\x53\\x0d\\x9c\\xc8\\xa0\\xdb\\x37\\x02\\x73\\x83\\x5b\\x1a\\x9e\\x92\\x23\\x2c\\x1d\\xfc\\x8d\\xb4\\xee\\x18\\x2c\\xfa\\x9f\\x56\\xf2\\xa0\\x30\\xd1\\xde\\x90\\xc6\\x9b\\x0b\\xaa\\x86\\x12\\xe6\\x3a\\x07\\x22\\xdc\\xc4\\x1c\\x8d\\x14\\x11\\x80\\x72\\x37\\x45\\xdf\\x44\\x8d\\x81\\x5f\\x29\\xa7\\x6c\\x54\\xf2\\x82\\x32\\xc8\\x2b\\x2e\\xb4\\xb7\\x88\\x0b\\xe2\\x2d\\x2e\\xdf\\x50\\xfd\\x7b\\x21\\xa9\\x30\\x19\\x99\\x32\\x7e\\xa4\\x55\\x84\\xba\\x53\\xb4\\x00\\x26\\x54\\xf5\\x6f\\xf1\\x90\\xa9\\xb6\\x08\\xd6\\xa5\\xab\\xcb\\xb6\\x8d\\x79\\x08\\xbe\\xdf\\xac\\x8a\\xe0\\x6d\\x95\\x89\\xf3\\xae\\x78\\x26\\x10\\xd6\\x0e\\xac\\x12\\x50\\x98\\xb0\\x7f\\x74\\x12\\x8c\\x74\\x16\\x7e\\x91\\x15\\xb2\\x19\\xd3\\xeb\\x97\\xa9\\xc9\\x3e\\x28\\xa2\\xe5\\x52\\x6a\\x4e\\xa3\\x16\\x83\\xf2\\x95\\xaf\\x15\\x30\\xbf\\xef\\xef\\x86\\xdb\\x86\\x07\\xd8\\x72\\xe1\\x80\\x63\\x97\\xa0\\x04\\x22\\x05\\x07\\xc1\\x41\\xd6\\x00\\x38\\x1d\\x7d\\x2c\\x28\\x11\\x7d\\xcb\\x0c\\x04\\x42\\x29\\x72\\xfb\\xba\\x71\\xcd\\x23\\xc2\\x35\\x6f\\x42\\x40\\x8b\\x74\\xe0\\x4a\\x98\\xaa\\x8d\\x0b\\x0a\\xf0\\xf8\\xdb\\x6a\\x91\\x00\\x6b\\xaf\\x63\\xf3\\xf0\\xd4\\xf7\\x38\\x2e\\xd3\\x77\\x8f\\x5f\\xb8\\xfb\\x8f\\xce\\xe1\\xb9\\x27\\x5d\\x04\\x73\\x80\\xbe\\xff\\x6c\\xa3\\x89\\xe4\\x44\\xb6\\x9d\\xe6\\x08\\xf9\\x10\\xaf\\x4c\\xae\\x62\\x2f\\x6c\\x0b\\x5a\\xd0\\x7e\\x38\\xda\\x39\\x04\\x91\\x06\\x90\\x43\\x23\\x83\\xbf\\x33\\x27\\x81\\x56\\x23\\xa1\\x5f\\x2a\\x0d\\x15\\xda\\xf3\\x83\\x88\\x62\\xb3\\xa5\\x57\\xcc\\x24\\xa8\\xc7\\x49\\x74\\x62\\x32\\xa7\\x7d\\xb9\\x2e\\x71\\xec\\x86\\xcf\\xe1\\x93\\xa6\\x87\\xa4\\x94\\x9c\\xec\\xc5\\xc0\\x2e\\x92\\x8a\\xcf\\x90\\xca\\x52\\x90\\x35\\x8c\\xce\\x89\\xb1\\x89\\xe7\\x4d\\x40\\xec\\x04\\xb0\\x37\\xf0\\x5d\\x0b\\x01\\x0c\\x2e\\x19\\x21\\x17\\xc8\\x60\\xd4\\xca\\x11\\x82\\x64\\x08\\x51\\x0b\\x19\\xd9\\x72\\xcf\\xf0\\xec\\xc7\\x27\\x10\\x7e\\x0b\\x08\\x9a\\x6a\\xcc\\xf9\\x3b\\x0d\\x43\\x66\\x00\\x79\\x20\\xcb\\x6b\\x2d\\x9f\\x3c\\x73\\x47\\xdf\\x43\\xa6\\x8a\\x30\\xb0\\xcc\\x4f\\xb8\\x41\\x74\\x82\\x24\\x61\\x28\\x1e\\x7b\\x19\\x14\\x45\\x0c\\xea\\xf2\\xaf\\x15\\x32\\x18\\xf1\\x24\\x8d\\x4a\\xbc\\xd8\\x16\\x9c\\xd1\\xe1\\xc3\\x95\\xce\\x20\\x63\\x45\\x73\\x03\\x84\\x21\\x04\\x93\\x92\\x36\\x77\\x46\\x0e\\x08\\x90\\xa7\\xa1\\x07\\x78\\xc0\\x51\\x46\\x8e\\xba\\x14\\x6f\\xb8\\xf8\\x63\\x71\\x53\\x21\\x20\\x89\\x45\\x8d\\xbd\\x62\\xe6\\x4c\\xc9\\x10\\x85\\xe3\\x25\\x40\\x44\\xe6\\xc9\\x01\\x81\\xc2\\x2c\\xb3\\x07\\x36\\xde\\x9c\\x85\\x79\\xa2\\xd0\\x11\\x31\\x0f\\xb0\\x91\\x25\\xc5\\x20\\x14\\x32\\x56\\xe2\\x48\\xe1\\x76\\x63\\x06\\x5d\\xb0\\x27\\xca\\x1a\\x9c\\x49\\x29\\xc4\\x8a\\x71\\x01\\x01\\xba\\x11\\x8f\\xd0\\xcc\\x37\\x9e\\x4a\\x12\\xc0\\x2d\\x89\\x48\\x0c\\x6e\\x25\\x39\\x23\\xca\\x39\\x8c\\xaa\\x6f\\x7a\\xd7\\x95\\xaa\\x25\\xc7\\x06\\x51\\xcf\\x92\\xba\\x08\\x83\\x98\\xb9\\x78\\x1a\\x12\\xaa\\x08\\x05\\x04\\xe1\\x4d\\x59\\xef\\xc1\\xe2\\x08\\xb1\\xc4\\xe4\\xba\\x0f\\x02\\x22\\x39\\x17\\x74\\x81\\x41\\x1f\\x21\\x29\\xec\\x01\\x38\\xb6\\x9d\\x60\\x19\\xc5\\xa9\\x30\\x13\\xc4\\x69\\xa0\\xce\\x17\\xd6\\x3e\\xe8\\x9b\\x0d\\xeb\\x1a\\xbd\\xed\\x12\\x53\\xe2\\x1f\\x10\\x04\\xaa\\x01\\xef\\x4f\\x81\\x99\\x0a\\xcc\\x88\\x31\\x5b\\x04\\xc3\\xc2\\x93\\xab\\xa1\\x02\\xb4\\x7c\\x21\\xd8\\xc8\\x44\\x44\\x84\\x20\\x53\\x6f\\x44\\xc1\\x13\\x4a\\xd8\\x78\\x66\\x27\\xc0\\x88\\xfb\\x26\\x8b\\xe8\\xda\\x9a\\xad\\x2d\\x25\\x8c\\xe3\\xf6\\xea\\x5f\\x98\\x70\\x88\\x79\\x4f\\x6d\\x22\\x38\\x4e\\x19\\xc6\\x62\\xf3\\x8a\\x14\\xd0\\xc6\\x6d\\x1d\\xcf\\xa3\\x40\\x0b\\x90\\x68\\xfe\\xcc\\x45\\x6d\\xe8\\x73\\xc1\\x66\\x2c\\xcf\\x36\\x8a\\x35\\x66\\x3c\\xe0\\xff\\x17\\xd4\\x0c\\xf3\\x95\\x64\\xda\\x38\\xa9\\x34\\x3d\\xfb\\x89\\x13\\x42\\x0e\\xd1\\x24\\xf3\\x5c\\xa2\\x6b\\x46\\x22\\x7d\\x26\\x56\\x36\\x98\\x9a\\xaa\\xb6\\x7a\\x8c\\x94\\x77\\x71\\x95\\x92\\xaa\\x3c\\x12\\xca\\xba\\x49\\xae\\x49\\xe4\\x31\\xe5\\xb7\\xf1\\xa4\\x68\\xb8\\x97\\xa2\\x14\\xf3\\x17\\xca\\x1a\\x03\\x16\\x28\\x53\\x60\\x2a\\x1b\\x4d\\xfc\\x13\\xe0\\x71\\xbb\\x42\\x51\\xea\\x29\\x05\\x5c\\xeb\\xbf\\xc0\\x48\\x32\\x3b\\x16\\x88\\x4d\\xd5\\x2b\\x26\\xb2\\x12\\x89\\x64\\x26\\xc5\\x54\\xc4\\x6d\\xc7\\x48\\xe0\\x14\\xc5\\x6f\\x53\\x03\\xbd\\x88\\xe5\\xe4\\xc3\\xa9\\x26\\xa0\\xc9\\xd3\\x86\\x89\\xa8\\xd8\\x42\\x0a\\x8b\\xc6\\x06\\xeb\\x6a\\x27\\x60\\x2a\\xfd\\x44\\x15\\x43\\xf3\\xc8\\xea\\xa8\\x11\\xff\\xd9\\xf2\\xad\\x00\\xf1\\xb1\\xfa\\x68\\x36\\x97\\xa3\\x70\\x10\\xc9\\xd1\\x07\\x5a\\x69\\xa1\\x8a\\x1d\\xaf\\x84\\xf8\\x45\\x2a\\x09\\x06\\x92\\x07\\xbb\\x1c\\x24\\x52\\x45\\x92\\x97\\xb0\\xeb\\x36\\x36\\x00\\xa1\\x7e\\x2f\\x60\\xcd\\x4c\\xd6\\x2b\\xa1\\x3a\\x0a\\x4e\\xc2\\x74\\x1e\\xb0\\x60\\x08\\x02\\xdd\\x13\\x91\\x70\\x35\\x92\\x9e\\x75\\x78\\x7d\\x09\\x5b\\xa8\\xe6\\xb5\\x0a\\x0c\\xb7\\x33\\xbc\\x09\\xcb\\x89\\x8a\\x48\\x4b\\xda\\x8e\\x02\\x11\\xc1\\x07\\x8f\\xaf\\x0f\\x3a\\xb6\\xfd\\xb7\\x13\\xc0\\x74\\x52\\xe3\\x83\\x28\\x18\\x16\\x1f\\xb3\\x76\\x78\\x1b\\x9f\\xb3\\xd4\\x4a\\x9e\\xb0\\xfa\\xcf\\x52\\xa5\\x55\\x2a\\xa0\\x66\\x30\\x13\\x44\\x73\\xe3\\x10\\xbd\\x65\\x00\\x5a\\xe0\\xe1\\x9c\\xb4\\x92\\x17\\x96\\x04\\xb3\\xcb\\x43\\x03\\x75\\x40\\x70\\xa6\\xd6\\x75\\x82\\x3c\\x59\\xcc\\x51\\x6c\\xfe\\x17\\x1a\\x5c\\x84\\x92\\xa9\\xc9\\x4c\\x10\\xc8\\x6e\\x5c\\x88\\x28\\xdf\\xa0\\x67\\x52\\x72\\xc4\\xb9\\x97\\x98\\xc9\\xbc\\xb8\\x53\\x2f\\x78\\xc5\\x6d\\xa7\\x19\\xfb\\x6e\\x1e\\x21\\xc8\\x8e\\xe3\\x0e\\xe8\\x31\\xe7\\x13\\x03\\x96\\xf8\\x42\\x49\\xc6\\xed\\x62\\x47\\x6c\\x99\\x04\\x37\\x5f\\x13\\x03\\x00\\xaa\\x1e\\x01\\xdb\\x82\\xb1\\x35\\x4f\\x0f\\x64\\x5c\\xa4\\xb2\\x76\\x30\\xc3\\xd6\\x01\\xbd\\x3d\\x61\\x77\\x35\\xf9\\x69\\xa4\\x2b\\x19\\x2c\\x6d\\x58\\x38\\xcd\\x45\\xab\\x11\\x86\\x6f\\x79\\x23\\x19\\x65\\xd1\\x86\\x39\\x1a\\x7c\\x46\\x14\\x15\\xae\\x9e\\xcb\\x2a\\x08\\x92\\xde\\x38\\x36\\x78\\xed\\xb2\\xb8\\xf4\\xf3\\x34\\x80\\x79\\xc5\\x0c\\xdd\\x00\\x04\\xe1\\x01\\x2a\\x46\\x03\\xcc\\xd6\\xcc\\x2e\\x95\\x37\\xa7\\x5c\\x6c\\xfe\\x44\\x11\\x37\\x54\\x40\\x4d\\xe3\\xd8\\x91\\xa6\\x90\\x51\\xab\\xc7\\xac\\x4a\\xd8\\xdf\\x9f\\x78\\x68\\xb3\\xc0\\x44\\xe1\\xea\\xbe\\x9b\\x8d\\x65\\x1c\\xce\\x0a\\xdb\\x2b\\x49\\x77\\x3f\\xf4\\x21\\x88\\x08\\x4b\\x07\\xe9\\x34\\x2a\\xad\\xd3\\x70\\xa3\\x4b\\xb8\\x73\\xcf\\x70\\x0a\\xbc\\x2b\\x2c\\x7a\\x74\\xb2\\xcb\\xde\\x05\\x1a\\x12\\x18\\x02\\x08\\x72\\x42\\xc1\\x03\\xf6\\xa6\\xa4\\x35\\x09\\xe6\\xbb\\x63\\xaf\\x6c\\x4f\\xb5\\x65\\x48\\xd0\\xe5\\x4e\\x98\\x90\\x65\\x42\\x4d\\x4f\\xb7\\xc0\\x10\\x61\\x2f\\xb0\\x06\\xe0\\x5b\\xa0\\x08\\x00\\xa7\\x0b\\x70\\x4c\\x44\\xd7\\x22\\x63\\xd0\\xb2\\xc0\\x1a\\x3f\\x63\\x79\\x28\\x24\\x85\\x78\\x1f\\xb1\\xc5\\xf2\\x81\\x99\\x2f\\x2c\\xeb\\xc8\\x7f\\x54\\x2e\\xc6\\x70\\xd1\\x03\\x83\\xb7\\x5e\\x21\\xb9\\x29\\x49\\xd4\\x0f\\x2a\\x6c\\xac\\x84\\x49\\xdc\\x83\\x31\\xb2\\x99\\x88\\x9a\\x5d\\x0e\\xa5\\x1e\\xb5\\xf5\\x5b\\x9f\\x2f\\x29\\xb0\\x70\\xd4\\x27\\xd6\\xb2\\x35\\xc6\\x73\\x09\\x6d\\x81\\x94\\x3a\\xea\\x4c\\xa5\\x78\\xe4\\x54\\xe5\\x17\\xb6\\x84\\xbd\\x38\\x6c\\xb4\\x54\\x71\\x8f\\xa0\\xc0\\xef\\x65\\xe3\\x18\\x24\\x23\\x44\\xfb\\x4d\\x19\\xe0\\x1d\\xbc\\x3c\\xbb\\x13\\xf7\\x66\\xeb\\x01\\x89\\xbb\\x09\\x85\\x34\\xf1\\xc1\\x67\\xe9\\xd4\\x8b\\x09\\xd1\\x91\\x9b\\x03\\xda\\xb7\\xdc\\x80\\x40\\x07\\x10\\x58\\xcd\\x80\\x7a\\x48\\x60\\x12\\x17\\x40\\x87\\x0f\\x5a\\xc3\\xcf\\x06\\xc1\\x8d\\x93\\x62\\x23\\x33\\xa5\\x4c\\xc9\\x82\\x51\\xf3\\x44\\x51\\x9a\\x52\\x4a\\xf5\\x43\\xc3\\x9c\\xe7\\x30\\x23\\x8e\\xc1\\xc1\\x81\\x28\\x47\\x44\\x27\\x65\\x01\\xc1\\x86\\xcc\\xf2\\xe7\\x52\\x77\\xd5\\x9a\\xa7\\x7b\\x3a\\xf7\\x5c\\xeb\\xc7\\x5d\\x98\\x77\\x56\\x75\\x58\\x2d\\xc6\\x03\\xdc\\xc9\\x9b\\xbb\\x18\\x0e\\x7f\\x06\\x90\\xf3\\xcf\\x90\\x76\\x9c\\x68\\x04\\x74\\x9a\\xae\\x57\\x28\\xf5\\x89\\xd9\\x06\\xc1\\x7b\\xbc\\x35\\xa2\\x82\\x25\\x5c\\x8a\\x3c\\x8c\\xcc\\x22\\xec\\x8a\\x51\\xe9\\x59\\xb3\\x18\\xc0\\x63\\x6a\\xc7\\xc0\\xb1\\xaa\\xb6\\x53\\x8e\\x02\\x22\\x5a\\xbb\\x11\\x04\\x17\\xa6\\x46\\xf0\\x15\\xe0\\x56\\xad\\xe0\\x8e\\x26\\xd4\\x8a\\xd0\\xb0\\x50\\x93\\xac\\x53\\x75\\xd4\\x73\\x93\\x64\\xd2\\xa8\\x24\\xce\\x8d\\x0b\\xf8\\x31\\x07\\x8b\\x00\\xe0\\xda\\x18\\x0a\\xd5\\xd6\\xe3\\xd3\\x5e\\xd8\\xc8\\xf7\\x9e\\x75\\x44\\x98\\xa7\\xc8\\xf2\\x9c\\x15\\x49\\x61\\xf2\\x6e\\x3d\\x8f\\xab\\xc9\\x66\\x6e\\x54\\x8f\\x8e\\x31\\x7c\\x68\\xe2\\xf7\\x8d\\xc1\\xc0\\x4a\\xde\\x23\\x6d\\x1b\\x2b\\x7b\\xb4\\xac\\x11\\xa0\\x4b\\xb9\\xa6\\x18\\x5b\\x33\\x20\\x7f\\x94\\x04\\x43\\x9a\\x9e\\x06\\x2c\\xe2\\x86\\x3a\\x66\\x57\\x71\\x55\\x8a\\x18\\x9f\\xc8\\xb7\\x0b\\x38\\xf1\\x5c\\xac\\x2e\\x45\\x5f\\xa0\\x7f\\xa5\\xcc\\x81\\x80\\x6a\\x40\\xed\\x32\\x37\\xf1\\x2a\\x81\\x22\\xb9\\xa6\\x29\\x24\\x31\\x2d\\x19\\xb7\\x08\\xae\\x56\\xcd\\xbb\\xed\\xca\\x38\\x4f\\xff\\x28\\x32\\x5e\\x22\\xd6\\x10\\x16\\x69\\xfd\\xef\\x84\\x56\\xa3\\xcc\\x88\\x9f\\x49\\x3b\\xd8\\xcd\\xd3\\x08\\x19\\x3f\\x00\\x01\\x00\\x00\\xff\\xff\\xc1\\x4f\\x1a\\xb6\\x61\\x53\\x00\\x00\")\n\nfunc fontsRobotoRegularWebfontEotBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoRegularWebfontEot,\n\t\t\"fonts/roboto-regular-webfont.eot\",\n\t)\n}\n\nfunc fontsRobotoRegularWebfontEot() (*asset, error) {\n\tbytes, err := fontsRobotoRegularWebfontEotBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-regular-webfont.eot\", size: 21345, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoRegularWebfontSvg = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xbd\\x69\\x9b\\x1c\\xc7\\x91\\x26\\xf8\\x79\\xf4\\x2b\\x7c\\xa0\\x5d\\xed\\x55\\x0e\\xba\\x99\\xf9\\x39\\x12\\xd5\\xcb\\x96\\x38\\x1a\\x49\\xac\\xa6\\xd4\\x4d\\x91\\xa2\\x66\\x67\\x77\\x71\\x14\\x98\\x58\\x05\\x01\\x06\\x10\\x0c\\x51\\xb5\\xc7\\x6f\\xdf\\xc7\\x5e\\xf3\\xc8\\x4a\\x54\\x54\\x24\\xb2\\x0a\\x45\\x09\\xea\\x87\\x1f\\x24\\x06\\x2a\\x3c\\x3d\\xfc\\xb0\\xe3\\xb5\\xc3\\xcd\\x7f\\xf6\\x4f\\xdf\\x7d\\x3d\\xb8\\xf9\\xe2\\xd5\\xeb\\xe7\\x2f\\x5f\\x7c\\xf8\\x80\\x1e\\x86\\x07\\xee\\xf5\\xf4\\xe8\\xc5\\xd3\\x47\\xc3\\xcb\\x17\\x17\\x1f\\x3e\\x78\\xf1\\xf2\\xc1\\x3f\\xfd\\xfc\\x47\\x3f\\xfb\\x8f\\xbf\\xfc\\xf4\\x17\\x9f\\x7d\\xf9\\xbb\\x8f\\xdd\\xeb\\xf9\\x2b\\xf7\\xbb\\x3f\\xfc\\xf3\\x27\\xbf\\xfe\\x85\\x7b\\xe0\\x3f\\xf8\\xe0\\x0b\\xf9\\xc5\\x07\\x1f\\xfc\\xf2\\xb3\\x5f\\xba\\x7f\\xfb\\xfc\\x57\\x8e\\x1e\\xd2\\x07\\x1f\\x7c\\xfc\\x2f\\x0f\\xdc\\x83\\xdd\\x34\\x7d\\xf3\\x9f\\x3e\\xf8\\xe0\\x2f\\x7f\\xf9\\xcb\\xc3\\xbf\\xc8\\xc3\\x97\\xaf\\xbe\\xfa\\xe0\\x57\\xaf\\x1e\\x7d\\xb3\\x7b\\xfe\\xe4\\xf5\\x07\\xff\\xf6\\xf9\\xaf\\x3e\\xd0\\x86\\xbf\\xfc\\xec\\x97\\x1f\\xbc\\x9e\\xbf\\x22\\x7a\\xf8\\x74\\x7a\\xfa\\xc0\\xfd\\xfc\\x47\\x3f\\xd3\\xae\\xbf\\xfb\\x7a\\x78\\xf1\\xfa\\xc3\\x1b\\x7e\\xcf\\x21\\x04\\x6d\\xff\\xe0\\xe7\\x3f\\xfa\\xd9\\xd7\\x17\\xd3\\xa3\\xa7\\x8f\\xa6\\x47\\x3f\\xff\\xd9\\x07\\xfb\\xc7\\x1f\\xfd\\xec\\xe9\\xc5\\xb3\\xd7\\x3f\\xff\\xd1\\xcf\\x9e\\xbd\\x7c\\x31\\xb9\\xe7\\x4f\\x3f\\x7c\\xf0\\xea\\xe5\\xe3\\x97\\xd3\\xcb\\x57\\x17\\x5f\\x7d\\x3b\\x3c\\x7a\\xf5\\xc0\\xed\\x5e\\xbe\\x7a\\x7e\\xe9\\x1f\\x3d\\x9d\\xfd\\x77\\x1f\\x3e\\x20\\xca\\x11\\xdf\\xd4\\xd6\\xfe\\xd9\\xa3\\x27\\x17\\xee\\xdb\\x17\\xcf\\xa7\\xd7\\xfe\\x9b\\x8b\\x57\\xfe\\xe2\\xeb\\x0f\\x1f\\x70\\x88\\xf5\\x81\\x7b\\xf4\\xfa\\xc9\\xc5\\x8b\\xe9\\xc3\\x07\\x94\\xa5\\x3e\\x70\\x4f\\x2f\\xfa\\x3f\\x7d\\xa4\\xf0\\xc0\\x7d\\xa0\\x23\\x79\\xfe\\xfa\\xf5\\xf3\\x17\\x5f\\xf9\\xaf\\x86\\xbf\\x7e\\xb3\\x7b\\xf3\\x13\\x29\\x34\\x6b\\x63\\xef\\xbe\\x7d\\xf1\\xfc\\xc9\\xcb\\xa7\\x17\\x1f\\x3e\\xf8\\xc9\\x8f\\xbf\\x7b\\xf6\\x38\\xd0\\x4f\\x57\\x23\\x8a\\xe1\\x81\\x7b\\xfa\\xe1\\x83\\x73\\xae\\xae\\x49\\x9e\\x29\\xe6\\x1d\\x95\\x30\\x13\\x95\\x31\\x38\\xaa\\xec\\x28\\xe4\\x87\\xc9\\x71\\xe5\\x89\\x5b\\x7a\\x98\\x1c\\x85\\x30\\xe6\\xe2\\x82\\x23\\x61\\xe7\\x29\\x3d\\x4c\\x13\\x25\\x71\\x3e\\xa6\\x87\\x69\\xf0\\x12\\x9d\\xa7\\x1c\\x46\\x9f\\xc4\\x31\\x39\\x4f\\x24\\x4e\\xf2\\xe4\\x89\\xc5\\x51\\x1a\\x3d\\x91\\xfe\\xd4\\x53\\xae\\x0f\\x93\\xf3\\x89\\x27\\x9f\\x48\\x9f\\x28\\x87\\x59\\x5f\\xee\\x98\\xd2\\xec\\x75\\x14\\x1e\\x4f\\x4d\\xf2\\xce\\x53\\x2b\\xb3\\x3d\\x94\\x70\\x79\\x5e\\xaa\\xb8\\x30\\x53\\xa8\\xbc\\xa3\\x56\\x67\\x8f\\x27\\x4f\\xad\\x5e\\x1e\\xce\\xfc\\x8d\\x69\\xda\\xba\\x9e\\xf8\\xf2\\x70\\xcd\\x9e\\x5e\\x5f\\xb0\\xad\\xf5\\x75\\x0f\\xdc\\xc9\\x1b\\x11\\xda\\xa9\\xbd\\xfe\\xe4\\xc7\\xdf\\x3d\\x0a\\xa7\\x36\\xfe\\x8f\\xd7\\xdb\\x49\\xb3\\xad\\xa5\\x42\\x2e\\xcc\\x1c\\xa2\\xad\\x97\\x3e\\x60\\xb9\\xf0\\x22\\x96\\x3a\\xb7\\x52\\x77\\xba\\xc6\\x5e\\x1f\\x74\\xb5\\x2f\\xb7\\x46\\xc3\\x7c\\x7d\\x34\\x39\\x57\\xfb\\x4a\\x0d\\x8e\\x42\\x0c\\x03\\x39\\x8e\\x61\\xe6\\x1a\\xac\\x4b\\x2e\\x61\\xf0\\x14\\xc8\\x79\\x4e\\x61\\xe7\\x5b\\xb9\\x3c\\x97\\xda\\xae\\x9a\\xd6\\x99\\x0b\\x6f\\x35\\xbd\\x71\\x18\\x3f\\xbe\\x4e\\xc3\\x5c\\xb2\\x0d\\xa1\\x04\\x17\\x29\\xcc\\x14\\xc3\\x8e\\x73\\x1c\\x72\\x75\\x12\\xeb\\xce\\x73\\x52\\xba\\xe6\\x1d\\xd7\\x38\\x54\\x76\\x91\\xf2\\x8e\\x12\\x0d\\xbe\\xb2\\xf3\\xfa\\x0f\\x4e\\xe9\\xc6\\xbf\\x53\\x6b\\x4a\\x8a\\xbc\\xf3\\xcc\\x79\\xf0\\xb9\\x3a\\xaf\\xfd\\x31\\xe1\\xcf\\x61\\xe7\\x39\\x96\\xc1\\xd7\\xa0\\xad\\xc3\\xce\\x53\\xe2\\xa1\\x62\\x04\\xfa\\xc9\\xf4\\xc6\\x1b\\xba\\x7a\\x23\\xf9\\xf2\\x3c\\xd6\\xe4\\x52\\x0a\\xf8\\xf2\\xd5\\x28\\xd3\\xcd\\xf3\\xfd\\xef\\x56\\x3c\\x9b\\xa4\\x6f\\x2c\\x45\\x17\\x39\\x0e\\xec\\xd2\\x8e\\x5a\\x18\\x95\\xb1\\x52\\x74\\xa5\\x28\\x47\\x31\\x35\\x65\\xcd\\x16\\xf4\\x1f\\x39\\x3d\\x4c\\x23\\x71\\x73\\xc1\\x71\\x50\\x86\\xcb\\xf4\\x30\\x4d\\x85\\x95\\x9f\\x4b\\x78\\x98\\xc6\\xe0\\x6a\\x73\\x3e\\x47\\x47\\x49\\x26\\xcf\\x14\\x1c\\x51\\x1c\\x3d\\x07\\x76\\x99\\x9c\\x97\\x90\\x1c\\x65\\x99\\x3c\\x05\\x71\\x5c\\x58\\x65\\x43\\x4e\\xae\\x45\\x15\\x0d\\xb9\\x4d\\x9c\\xf5\\x33\\xc4\\x69\\x66\\xa6\\x1d\\x25\\x25\\x33\\xe6\\x91\\x74\\xcd\\x38\\x3a\\x7b\\xed\\x29\\xca\\xc3\\x34\\x35\\xfd\\xaa\\x17\\x0e\\x0f\\x93\\x12\\x5b\\xd6\\xbe\\x24\\x3b\\x9f\\xc5\\x31\\x87\\xc9\\x53\\x49\\xae\\x46\\x15\\x15\\x15\\xa2\\xa2\\x64\\xcc\\x40\\x47\\x3d\\xf9\\x54\\x4d\\x5a\\x54\\x8c\\xd9\\xb7\\xe2\\x7a\\xd7\\xa9\\x4c\\x4c\\xf6\\x92\\xe2\\xc8\\x41\\x7f\\x92\\x9d\\x04\\xc8\\xa3\\xa8\\x9f\\x6d\\xce\\x73\\x2e\\xf6\\x3b\\x2a\\x2a\\xbb\\x82\\x38\\xcf\\x45\\xc7\\xe4\\xb9\\x8a\\xf3\\xa4\\x63\\x9a\\x3d\\x35\\x95\\x27\\xa9\\xcc\\xd4\\x68\\x44\\x53\\xd2\\x69\\xa8\\x2c\\x64\\x15\\x77\\x9e\\x42\\x76\\xa2\\x92\\xef\\xe6\\x0d\\xfb\\xef\\xaf\\x6f\\x58\\x6c\\x9d\\x47\\x28\\x44\\x47\\xa1\\xb5\\xb9\\x40\\xba\\x72\\x71\\x95\\x1d\\x53\\x9c\\x98\\x9a\\xab\\x05\\xff\\xf1\\x35\\x3f\\x4c\\x93\\xd2\\x20\\x53\\xd4\\xe1\\xa0\\xad\\xd7\\xc6\\xbe\\x92\\xed\\x2c\\xb6\\x08\\xbb\\x5c\\xf3\\xe8\\x49\\xb0\\x50\\xac\\xa3\\x77\\x35\\x4f\\xbe\\xea\\x0a\\x33\\xc9\\xe5\\x39\\xa7\\x80\\x0f\\x6a\\x0f\\x25\\xba\\x68\\x6b\\x85\\x59\\x10\\x61\\x5d\\x55\\xfc\\x8e\\x45\\x54\\x9e\\x93\\xb8\\x44\\x53\\xd4\\x81\\x65\\x1b\\x61\\x89\\xce\\x47\\xdb\\xd9\\x8c\\x89\\xeb\\x88\\x5c\\xe2\\x87\\x69\\xf4\\x25\\x61\\x77\\x08\\x62\\x5c\\x5f\\x46\\x8c\\x32\\xdb\\x90\\x2f\\xcf\\x25\\x36\\x47\\xa5\\xb8\\xa1\\x10\\x69\\xdf\\x75\\xa0\\xa0\\x24\\x56\\x06\\xaf\\x7f\\x51\\xcd\\x50\\x2f\\xcf\\x6b\\x68\\x8e\\x4b\\x9b\\x4b\\x3d\\x5c\\x10\\xdd\\x12\\x2c\\x49\\x56\\xb2\\x95\\xac\\x64\\x6b\\x9b\\xdb\\x17\\xa7\\x2f\\x03\\xbe\\x55\\x6d\\x79\\xaa\\xf3\\x7d\\xd1\\xb0\\x38\\xc7\\x97\\x26\\x5e\\x9e\\xb7\\x94\\xf4\\xcb\\x58\\x99\\xb4\\x5f\\x99\\xbc\\xbd\\x32\\x0f\\x53\\x5f\\x9b\\x87\\xc9\\x86\\x8b\\xd5\\x21\\xfd\\x0b\\x56\\xc6\\x25\\x1e\\x75\\x91\\xb1\\x2a\\xd1\\xd4\\x9b\\x9b\\xfc\\xbe\\x67\\x1d\\xea\\xb6\\x60\\xcd\\x2b\\xd5\\xbc\\x17\\x6b\\x39\\x3a\\x69\\x60\\x39\\x66\\xa7\\xdc\\xba\\x5f\\x21\\x6c\\x4d\\x15\\x6c\\x47\\x75\\x4a\\xe1\\x44\\xd9\\x81\\x63\\x26\\x2f\\xd5\\x51\\x6a\\xa0\\x77\\xca\\xcd\\xb5\\x02\\x5e\\x0d\\xfa\\x43\\x68\\xdf\\xa6\\xf3\\xa3\\xa4\\x0b\\xc4\\xa9\\x38\\xdf\\xc8\\x78\\x84\\xb0\\x26\\xad\\xda\\xbe\\x2a\\xfb\\x34\\xec\\x7d\\x4a\\xc6\\xc3\\x59\\xf5\\x3c\\xf6\\xb2\\x86\\x41\\x74\\xd7\\x63\\x68\\x63\\x24\\x97\\x93\\x53\\x01\\x12\\xe3\\xa4\\xca\\x3e\\x97\\x1d\\x95\\x8c\\xbd\\x51\\xa0\\x20\\xda\\x75\\x8c\\x13\\x10\\x81\\xe7\\x40\\x03\\x55\\xdd\\x44\\x96\\xc1\\xb3\\xf3\\x49\\x85\\x6c\\x1b\\x7c\\x55\\x80\\xc1\\x6e\\x84\\xf0\\xcc\\xe0\\x54\\x0c\\x0d\\x3c\\xaa\\xaa\\x41\\x74\\xd4\\xd8\\xe0\\xa0\\xe2\\x18\\x88\\x84\\x74\\x78\\xac\\x73\\x62\\x55\\x6b\\x9c\\xa9\\x2f\\x18\\x3e\\x56\\x94\\xd8\\x6a\\x9e\\x38\\x64\\xe7\\x8b\\x8c\\x85\\x75\\x4b\\x23\\x3b\\x56\\xb1\\xa0\\x83\\xd3\\x35\\x1d\\xbc\\x64\\x72\\x51\\xd2\\x00\\x42\\xe6\\x36\\xfa\\x46\\x0e\\x42\\x1f\\x62\\x41\\xa7\\x11\\x26\\xcf\\xcd\\x44\\x0c\\xab\\x1a\\xab\\x8e\\x88\\xc1\\x9d\\x8a\\x76\\x8a\\xfe\\x5d\\x97\\xb7\\x52\\xe7\\xb1\\x41\\xc9\\xaf\\xa5\\x31\\x15\\x27\\xd5\\xc4\\xb2\\xd2\\xdf\\x84\\xfe\\x9a\\x89\\x30\\x95\\xae\\xb1\\x02\\x57\\x55\\x37\\x19\\x05\\xba\\x58\\x46\\x5f\\x09\\x94\\xc4\\x4a\\x47\\xd8\\xcf\\xa8\\xa2\\x4c\\xea\\x96\\xd4\\xf9\\x1f\\xae\\xd1\\x8f\\xa4\\x76\\xa0\\x98\\x53\\x52\\x6d\\x9b\\xd3\\xcc\\x71\\x51\\xcc\\xba\\xf2\\xa6\\x6d\\x15\\x3f\\x6d\\x69\\xdb\\xff\\xf1\\xba\\xbe\\x2f\\x0b\\xaa\\x10\\x76\\xa9\\xf2\\xac\\xd4\\x22\\x4d\\x15\\x47\\x73\\xb9\\xc8\\x24\\x12\\x9d\\x14\\x1e\\xb2\\xf3\\x34\\x48\\x05\\x49\\x2a\\x23\\xea\\xf2\\x84\\xe2\\x3c\\x0b\\x18\\x59\\x22\\xb4\\x09\\x04\\x5a\\xaa\\x32\\x7b\\x92\\x11\\x3b\\x5a\\x1c\\x06\\x95\\xaa\\x4c\\xac\\x44\\x23\\x89\\x07\\x8f\\x7e\\x42\\xdd\\x79\\xed\\xaa\\x24\\xd7\\xc4\\x79\\xfb\\x10\\x19\\x6d\\xe2\\xdb\\x5b\\x4b\\xf3\\x3f\\x5d\\x9f\\x43\\x2d\\x9d\\xb3\\xb4\\x7b\\x95\\x30\\xba\\xfc\\xc9\\xb1\\xe8\\x16\\x81\\xa8\\x26\\x0a\\x4a\\xfc\\xa9\\xb6\\x87\\x69\\xc6\\xd0\\x24\\x42\\x65\\x24\\xfc\\xd5\\x74\\x86\\x28\\x97\\x8b\\x4a\\x06\\x9d\\xa8\\x8e\\x2f\\x8f\\xa4\\x52\\xa1\\x89\\x13\\x11\\x4c\\xb3\\xf0\\x04\\x2e\\x54\\xc9\\x27\\xb3\\x07\\x6f\\x49\\x83\\xc6\\x5a\\xfe\\x0a\\x66\\x5d\\x9a\\x93\\x6a\\xc5\\x7c\\xf3\\x3c\\xfe\\xe7\\x6b\\xf3\\xa8\\x35\\xee\\xc1\\x3b\\x85\\x42\\x83\\x8a\\xdc\\x14\\x07\\x6e\\xba\\xf8\\x44\\xba\\xbf\\x3a\\xee\\x1d\\x65\\x7b\\x56\\xfc\\x32\\x70\\x13\\x47\\x14\\x86\\xa8\\x6b\\x9a\\xf2\\xe0\\x25\\xb0\\xf3\\xb5\\x0d\\xd4\\xa0\\x0f\\x15\\x84\\x09\\x39\\xdf\\xf2\\xe0\\xa9\\x92\\xe3\\x5a\\x06\\xd5\\xc2\\xfa\\xae\\x0d\\xe0\\xe6\\x26\\x03\\xb5\\xea\\xb8\\xc4\\x9b\\x07\\xfa\\xbf\\xac\\x0d\\x1f\\xee\\x10\\xad\\xba\\x1c\\xd2\\x4c\\xa5\\xee\\x62\\xe0\\x39\\xb2\\x18\\x35\\xea\\x83\\x00\\x6f\\x29\\x04\\xc5\\x53\\x4c\\xcd\\xa0\\x3f\\x1e\\x62\\xe0\\x9b\\xbf\\x75\\x76\\xed\\x5b\\x31\\xf4\\x45\\xd1\\xf9\\x71\\xaa\\x43\\x09\\x4e\\x28\\xcf\\x94\\xfb\\xa7\\xa8\\x28\\xe1\\x27\\x5d\\x8d\\xa0\\x36\\x05\\x6d\\x50\\xbe\\xbf\\x8e\\xa7\\x33\\x59\\xc7\\x92\\x5c\\x92\\x3a\\x53\\x8a\\xbb\\xd8\\xd4\\x6c\\x49\\x71\\xe7\\x63\\x0b\\x37\\x77\\xf3\\xf0\\x7a\\x37\\x71\\x01\\x03\\xd9\\x60\\xf9\\x82\\x7e\\x03\\x1f\\xc1\\xde\\x1f\\x5c\\xdf\\xfa\\x14\\x96\\x5e\\x20\\x24\\x86\\x1c\\x54\\xdc\\x57\\xda\\x91\\x6a\\xd8\\xac\\x9c\\x86\\x7f\\x2a\\x56\\xba\\xb9\\xcb\\xb0\\xc6\\x95\\x71\\xc1\\x95\\xe2\\x52\\x4a\\xb3\\x44\\x95\\x50\\x5c\\xaa\\x23\\x95\\x95\\x2e\\x72\\x79\\x98\\x26\\x01\\x03\\x53\\x54\\xd5\\xc2\\xa4\\x28\\x40\\xc4\\xa4\\x62\\x04\\xe2\\x44\\x53\\x8f\\xb6\\xb3\\xb7\\x2e\\x94\\x72\\x74\\x98\\xb2\\x7f\\xa3\\x14\\x6f\\x68\\x4d\\x85\\xdf\\xe4\\x55\\x8f\\x50\\x6c\\x13\\x04\\x5e\\x64\\xc5\\x0f\\x14\\x5c\\x22\\x43\\x6b\\xb5\\xb9\\xac\\xfa\\xa3\\x82\\x33\\x55\\x4b\\x35\\x28\\x6a\\xe8\\xb4\\x96\\xa7\\x0c\\xdd\\x56\\xf3\\x1c\\xd9\\xcc\\x56\\x05\\x1a\\xd0\\x07\\x35\\x42\\x3e\\x34\\x28\\xbc\\xd4\\x9f\\x9d\\xb7\\x47\\xa0\\xd3\\x0a\\x90\\xa5\\x9f\\x74\\x37\\x2e\\x13\\x6d\\xc3\\xef\\x9a\\x55\\xf9\\xab\\xc1\\xc1\\x43\\x6c\\xc9\\xa5\\xa8\\x86\\x41\\xea\\x16\\x2b\\x71\\xde\\x60\\x0f\\xde\\xec\\xb2\\xa9\\xf4\\x13\\x19\\xbd\\xea\\x75\\x5d\\xf6\\xa4\\xb4\\x3b\\x49\\x56\\xe5\\x5f\\x47\\x6a\\x0a\\x85\\x84\\xb8\\xe3\\xdc\\x2b\\xb0\\xc2\\xd0\\xe6\\xd0\\x78\\xcd\\x79\\x80\\x04\\x93\\xb4\\x3a\\x61\\xb3\\x07\\x12\\x14\\xb7\\x28\\xd0\\x8d\\x54\\x06\\x28\\xdd\\x12\\x16\\xfa\\x6d\\x31\\xce\\x24\\x69\\x88\\xa5\\xb8\\x24\\x61\\x54\\x40\\x45\\x51\\x1c\\xa9\\x7c\\x72\\xcc\\x65\\x32\\x5d\\x6b\\xd8\\x1f\\x48\\x4e\\x16\\xf4\\x31\\x75\\x7b\\xbe\\x44\\xd5\\xcd\\x94\\xc8\\x30\\x17\\x46\\x59\\xb0\\xd9\\xa5\\x03\\xd7\\x02\\xcc\\x5f\\xdb\\xcd\\xeb\\x22\\xdb\\x4b\\x1d\\x82\\x93\\x52\\x07\\x71\\x79\\x47\\xd5\\x10\\x1f\\x25\\x03\\x43\\x9e\\xaa\\x4c\\xd4\\x40\\x5b\\xb9\\x8e\\xba\\x66\\xc1\\xe9\\x4a\\xe5\\x3a\\x15\\x52\\x7b\\x07\\x16\\x46\\x82\\x85\\x41\\x4d\\x69\\xac\\x35\\x97\\xd5\\x08\\x2e\\x0c\\x2e\\xd6\\x49\\xa9\\xc8\\x53\\xca\\xd1\\x49\\xaa\\xb5\\x34\\xa5\\x88\\xe9\\xb1\\x01\\x28\\x55\\xc3\\x99\\x1d\\x35\\x35\\x50\\xaa\\xb8\\x0c\\x5f\\x86\\x41\\xe0\\x1a\\x4d\\x90\\x83\\xa4\\x8c\\x13\\x4a\\xeb\\x13\\x55\\x70\\x93\\xb1\\x9d\\x59\\x81\\x4a\\x03\\x4d\\x2a\\x48\\x10\\xee\\xd0\\x45\\xb9\\x28\\x28\\x24\\x11\\x86\\x82\\x29\\xe0\\x21\\x93\\x4e\\x0f\\x93\\x03\\x16\\x53\\x84\\x11\\xf7\\x1d\\xeb\\x72\\x8b\\x21\\x12\\xc3\\xc7\\x0a\\x21\\xa4\\x8f\\xdd\\x93\\xf4\\xb1\\x7b\\x0e\\x06\\xbf\\x80\\x0b\\x05\\x4b\\x25\\x6a\\x3a\\x74\\x5d\\x03\\x03\\x4f\\x5f\\xea\\xb7\\x80\\x6b\\xec\\xe3\\x86\\x5d\\x1c\\x28\\xea\\xe6\\x7d\\x8a\\x9b\\xfb\\x94\\x92\\x13\\xc9\\xb3\\xea\\x9e\\x1c\\xd9\\x51\\x08\\x6d\\xc7\\xa1\\xce\\xbe\\xe5\\xbc\\xe3\\x40\\x9d\\xd8\\xf0\\x24\\xe6\\xda\\xc9\\x33\\x1e\\x72\\x8a\\x8a\\xdc\\x92\\x8b\\x2d\\xec\\x62\\x8c\\x73\\xae\\x32\\xf8\\xec\\x54\\x71\\x35\\xe7\\xd3\\x86\\x74\\x4d\\xdb\\x24\\xa3\\xa8\\xab\\x28\\x9d\\xe7\\x1d\\x75\\x23\\x81\\x9a\\x33\\xc7\\x13\\xf6\\x6c\\x22\\xb3\\x94\\xbb\\x71\\x6c\\x64\\x13\\x5d\\xad\\x53\\x6e\\x8e\\x23\\xc8\\x46\\xb1\\x60\\x09\\x8e\\x15\\xfb\\xa9\\x7e\\x6c\\x61\\x04\\xc6\\x36\\x1f\\x96\\xc2\\x87\\xc9\\xab\\x6a\\xa4\\xa0\\x4a\\x52\\xe1\\x6f\\x19\\x6a\\x74\\xa5\\xb5\\x5d\\x61\\xa8\\xb3\\xb4\\xf3\\x29\\xf3\\xe0\\x55\\x1d\\x01\\x28\\x67\\x27\\x6a\\x05\\x02\\x5e\\x40\\x8a\\x61\\x6b\\x54\\x6a\\x8e\\x8a\\x70\\x59\\x39\\xde\\x36\\x92\\x26\\xd0\\x87\\x7e\\x05\\xe3\\x87\\x79\\x48\\x66\\xf8\\x49\\x62\\x95\\x9a\\x26\\x09\\x44\\xdc\\xe8\\x15\\x4f\\x83\\x6c\\x14\\x0c\\xd0\\x04\\xfb\\x99\\xb7\\xf4\\x49\\xde\\x5e\\x37\\xc5\\x75\\x85\\x66\\xc6\\x9a\\xb1\\xa2\\xc7\\x94\\x5d\\x4c\\x71\\x92\\x5a\\x1c\\x95\\x38\\xc2\\xf2\\x83\\xdc\\x56\\x82\\x9c\\x88\\xc1\\xdc\\x51\\x06\\x0f\\x88\\x94\\x68\\xf4\\xb1\\x39\\xe5\\x18\\x9b\\xa5\\x5a\\x40\\x0b\\x55\\x81\\xde\\x15\\x76\\x40\\x44\\x74\\xdf\\x1f\\xa7\\x09\\x12\\x59\\xe9\\x30\\xcf\\x9e\\x65\\xcc\\xd1\\xa5\\xec\\x60\\x6b\\xb8\\x5a\\xf6\\x5b\\x05\\xf0\\x4f\\x0d\\x3a\\x07\\x36\\xa4\\x40\\x00\\x2a\\xae\\x01\\xdc\\x67\\xce\\x7b\\x35\\x23\\xd9\\x14\\x4b\\x47\\xec\\x91\\xcd\\x6e\\x80\\x7d\\x26\\x49\\xf1\\xaa\\x0e\\x2a\\x06\\x17\\xa5\\x5c\\xba\\x73\\xe1\\xea\\x52\\xb2\\x5e\\x02\\xb9\\x0a\\x66\\x09\\x13\\xab\\xb5\\x42\\xa1\\x8d\\xc4\\x26\\x1f\\x0c\\xaa\\x2b\\x8a\\x37\\xa5\\xa3\\xac\\x06\\x42\\x89\\xce\\xc3\\x9f\\xc2\\x52\\x60\\xaa\\xa8\\xc2\\x91\\x11\\x08\\x7b\\x71\\x38\\x44\\xdd\\x95\\x00\\x28\\xab\\xa4\\x41\\x1b\\x8a\\xb9\\x6c\\xee\\x4d\\x29\\x8e\\x24\\xd0\\x4c\\x29\\xed\\x5a\\x4d\\xca\\x4d\\x3a\\xa9\\x1c\\x75\\xb0\\xfa\\x7f\\xc9\\x2c\\x57\\x33\\x18\\xc8\\xf8\\x3c\\xe9\\x02\\x2a\\x71\\xc2\\x4b\\x02\\xdd\\x34\\xa8\\x95\\x98\\xca\\x18\\xd9\\x49\\x8c\\x8e\\xb2\\xb8\\x4c\\xaa\\xd9\\xc9\\x25\\x6e\\x3b\\x5f\\xda\\x06\\xd8\\xaa\\x47\\x24\\x34\\xab\\x19\\x00\\x59\\x29\\x6a\\x1a\\x33\\x95\\x89\\x83\\x4a\\xde\\x3a\\xc2\\x5c\\x04\\x71\\x14\\xb5\\x97\\x4d\\x52\\xaa\\x34\\xed\\xe6\\x69\\x63\\x47\\x64\\xf6\\x9b\\x8e\\x5c\\x08\\xaa\\x25\\x44\\xec\\x36\\x64\\x23\\x99\\xc8\\x0a\\x60\\x5b\\x23\\x38\\xb4\\x35\\xb6\\x8e\\x70\\x5d\\x79\\xf4\\x37\\x29\\xc0\\x83\\xbf\\x04\\x5c\\x9d\\x9d\\x1a\\x4e\\xb6\\x1f\\x6a\\x3e\\x4d\\x25\\x75\\x55\\x64\\x5b\\xcd\\x60\\x34\\x10\\x4c\\xe8\\x48\\xc4\\x9a\\xaa\\xf4\\xbd\\x22\\x98\\x08\\x6d\\x10\\xfa\\xba\\x2a\\xc3\\xa2\\xf9\\xa5\\x3b\\xe7\\xd6\\x9c\\xb4\\xee\\x84\\x88\\x0e\\xc2\\xa0\\x45\\x58\\x79\\x6c\\x9a\\x78\\xd4\\x15\\x09\\x4e\\x17\\xa3\\xd0\\xa4\\x7b\\xd8\\xd7\\x49\\x65\\x4b\\x73\\xd4\\x40\\x30\\xc1\\x95\\x32\\x7a\\x6b\\x6a\\x33\\x51\\xe5\\xa9\\xd2\\x05\\xc3\\x81\\xe3\\x54\\x41\\x52\\x28\\xdd\\xb2\\x25\\xe8\\x29\\x5d\\xd3\\x3a\\x91\\x29\\xd8\\x5c\\x46\\x0a\\x3a\\x60\\x2a\\xc1\\xe5\\x32\\xe5\\xec\\x4c\\xf4\\x81\\xea\\x40\\xb0\\x54\\x54\\x01\\x42\\x71\\x16\\xd2\\x8d\\x31\\x1d\\x56\\x82\\x21\\xa6\\xc9\\x67\\x88\\xc7\\x4d\\xd9\\xdf\\x36\\x29\\xa0\\x8a\\x6b\\x26\\x33\\xa8\\x39\\x5b\\x53\\x49\\x6d\\x12\\x28\\x3d\\x8a\\x61\\x64\\xae\\xba\\x95\\xe9\\x8a\\x21\\xa7\\xbe\\xf4\\x51\\xdb\\x28\\x58\\xb4\\x4d\\xa9\\xcb\\x7b\\x95\\x2a\\x65\\x32\\xab\\x48\\xa9\\x97\\x47\\x5f\\x2c\\x7e\\x00\\x42\\x27\\x03\\x77\\x68\\xa9\\x1b\\x34\\x88\\x0a\\x2b\\x1a\\x93\\x9a\\x8d\\x4a\\x68\\xbd\\x0b\\xfd\\x50\\xb4\\x65\\x54\\x29\\xa0\\xbc\\x0a\\x91\\x8e\\x2d\\x6d\\x53\\xd5\\x57\\xc2\\x71\\xce\\x19\\x92\\xcb\\xc3\\x63\\x60\\x3f\\x5e\\x54\\x62\\xee\\x32\\xc5\\x68\\x02\\x2c\\x2d\\x6a\\x35\\xa2\\x93\\x09\\x3b\\x8f\\x89\\x5d\\x9e\\xab\\xc4\\x6c\\x5d\\xdf\\xa4\\xd0\\x21\\x0a\\x47\\x85\\x28\\x98\\x45\\x93\\x51\\xb9\\x41\\x65\\x09\\xc1\\xd4\\x9f\\x40\\xd5\\x4a\\x0e\\x0a\\x19\\xc1\\x0e\\xe4\\xbc\\xc1\\xae\\xda\\x26\\x73\\x03\\xba\\x06\\x2e\\xaa\\x1d\\x70\\x74\\x00\\x0c\\xd5\\xc3\\xb1\\x6c\\x6d\\xd6\\x7f\\xba\\x6e\\x7b\\x50\\x39\\x6e\\x7b\\xe0\\x45\\x2d\\xf9\\x54\\xb3\\x64\\x15\\x9b\\xe0\\xd4\\x81\\x6c\\x3b\\xd9\\xf8\\x3a\\xa7\\xcc\\xb7\\xf9\\xe6\\x4f\\x7e\\xfc\\x9d\\x3c\\x59\\x79\\xcb\\xc2\\x12\\xc8\\x2a\\xe4\\x62\\xce\\x33\\xc5\\x36\\x54\\xca\\x8a\\x1a\\x67\\xb8\\x9b\\x7c\\x52\\xb2\\x60\\x11\\x38\\x99\\x3c\\xd5\\xd9\\xe7\\x01\\x4f\\x6d\\xb0\\x57\\x6c\\x2d\\x6f\\xfe\\xea\\x87\\x47\\x80\\x06\\xbb\\x18\\xca\\x4c\\x39\\xee\\xaa\\xa8\\x09\\xa0\\xd8\\xb2\\x4a\\xbc\\xc4\\xab\\xca\\x72\\xc3\\xab\\xcd\\x99\\x5d\\xac\\x67\\x56\\x78\\xd1\\xcc\\xd9\\xd5\\x32\\x53\\xcb\\x43\\x52\\xeb\\x5b\\xaa\\x8e\\x9f\\xca\\x9c\\x31\\x25\\x0e\\x83\\xb7\\xbf\\xc7\\x99\\x5a\\x1a\\x6a\\x52\\xc5\\xa8\\xd3\\xa7\\xb8\\x01\\xb8\\xff\\xe9\\xda\\xb7\\x5a\\xe9\\x16\\x60\\x26\\x47\\xc4\\x3c\\x7a\\x71\\x84\\x67\\x50\\x63\\xaa\\x13\\x84\\xae\\x6b\\x65\\xa4\\xa6\\x8c\\x28\\x01\\xd8\\x27\\xc0\\x61\\x02\\x0b\\x2d\\x74\\x99\\xcc\\x07\\x66\\x48\\x56\\xcc\\x9c\\x7b\\x50\\x62\\xf4\\x29\\x3a\\xfc\\xcf\\xc4\\x97\\x4a\\x3f\\xea\\xd2\\x19\\x81\\xa9\\x32\\x92\\xa3\\xa8\\x9f\\x53\\xb1\\x3d\\xa9\\x08\\xa7\\x58\\xc7\\xd6\\x1c\\x51\\x71\\x14\\xc9\\x51\\x0d\\x93\\xa2\\xcb\\x64\\xb6\\x48\\x36\\x0f\\x59\\x0f\\x50\\x20\\x50\\x90\\x0a\\xdc\\x77\\xe0\\x41\\x15\\x01\\xd0\\x0b\\x50\\x11\\x6a\\xc5\\x28\\x32\\xaf\\x97\\xe7\\x92\\x04\\x4c\\x50\\x77\\x1c\\x14\\x76\\x84\\xea\\x14\\x9a\\x6e\\x38\\x5f\\xfe\\xd7\\xeb\\xfb\\x52\\xe5\\x30\\x0c\\x53\\xd4\\x3a\\x73\\x91\\xc5\\x71\\x54\\x94\\x59\\xa7\\x1c\\xd8\\x71\\x4e\\xa3\\x14\\xe5\\xf6\\xd4\\x7d\\xf7\\x29\\x4c\\x1d\\xa8\\xe7\\xd2\\x46\\x0f\\x87\\x6b\\x84\\x8f\\xf1\\x0a\\xb2\\x58\\x60\\x15\\xc6\\x54\\x31\\x75\\xc0\\xd9\\x45\\xea\\x0c\\x0f\\x00\\x38\\x7a\\xe5\\xa1\\x8a\\x77\\x0c\\x64\\xdb\\xcd\\x30\\xe7\\xd5\\x18\\x1f\\xbd\\xe1\\x59\\x55\\x45\\x0e\\xfe\\xcb\\xc9\\x27\\x32\\x64\\x39\\xea\\x18\\x93\\x8a\\x68\\xd5\\x07\\x11\\x11\\x5c\\x2e\\x10\\xd2\\x09\\xf6\\x04\\x54\\x02\\xc1\\xe0\\xce\\x13\\x89\\x39\\x7a\\x7d\\x74\\x3e\\xee\\xf2\\xa0\\xdd\\xf8\\x54\\x93\\xc3\\xd8\\x89\\x54\\xdc\\x9b\\x70\\x26\\xb8\\x3e\\x4d\\x9c\\xef\\x95\\x9e\\x92\\x09\\xa8\\x67\\xaa\\xec\\x58\\xd1\\xd3\\xa8\\x4c\\x59\\x75\\xcc\\x31\\xba\\x64\\x86\\x78\\x6c\\xd9\\x7c\\xda\\x23\\xe0\\x6b\\xd0\\x1d\\x33\\x35\\x2d\\xa4\\xba\\x11\\xa2\\x38\\x07\\x56\\x90\\xab\\x34\\xad\\xe8\\x45\\x6d\\x22\\xe8\\xd9\\x68\\x6e\\x7f\\xed\\xba\\x56\\xe8\\x3e\\x20\\x09\\x42\\x60\\x7a\\x41\\xd9\\xe6\\x89\\x0c\\x65\\xf4\\xb9\\x38\\xc3\\xa9\\x65\\x1f\\x19\\xdb\\x7f\\x82\\x6d\\x08\\x35\\xe8\\x10\\x80\\x9b\\x74\\x37\\xb1\\xb2\\x55\\x17\\x28\\x43\\x2f\\xba\\xf3\\xc2\\xc1\\x45\\xb8\\x35\\x09\\x9a\\xaa\\xaf\\x01\\x53\\x9e\\x2c\\x5c\\xee\\x4b\\x54\\x0c\\x1b\\x40\\xb2\\xf0\\x33\\xb7\\x02\\x20\\x3b\\x7a\\xd5\\x4b\\xce\\x03\\xf2\\x63\\xe5\\x81\\x7a\\x1e\\xaa\\xe1\\xed\\x92\\x42\\x25\\x25\\x77\\xee\\xf6\\x1e\\xb5\\xc9\\x43\\x5d\\x96\\x83\\x0d\\x25\\xe0\\x47\\x1d\\x54\\x55\\x06\\x97\\x4d\\x55\\xfd\\xd1\\x75\\x8a\\x15\\xee\\x11\\x05\\x0e\\x2e\\x0c\\x49\\xcd\\xe1\\x98\\xf2\\x8e\\xb2\\x4a\\x40\\x63\\x8e\\xbc\\x33\\x61\\xa9\\xb2\\x46\\xd4\\x76\\xc9\\x04\\x7f\\x20\\x96\\x3d\\xe1\\xe5\\xe5\\x79\\xe4\\xe0\\x52\\x0c\\xbb\\xd8\\xc2\\xe0\\x39\\x06\\x97\\xb3\\x6c\\x3a\\x2d\\xff\\x79\\x35\\x8a\\xb0\\x78\\x90\\x75\\x9d\\x67\\x7c\\x34\\x96\\xb4\\x87\\x07\\xc5\\xf9\\x56\\x01\\xf3\\x94\\x02\\x95\\x0e\\x7a\\xa4\\x4f\\x21\\xa3\\xa7\\xd2\\x1d\\x0e\\x02\\xef\\x3e\\xec\\x5f\\xdd\\xff\\xea\\x38\\x14\\x53\\xf1\\x6d\\xc1\\x78\\x62\\xbe\\xa7\\x60\\xf2\\xc8\\x30\\x1e\\xb6\\x5b\\xba\\xe1\\x11\\x20\\x0c\\x92\\xa8\\x30\\x50\\x5c\\x96\\xe2\\x4e\\x22\\x8d\\x24\\x00\\x08\\xa1\\xb9\\xac\\x5a\\xb6\\x24\\xc3\\xfd\\xc0\\x6c\\x8a\\xa3\\xb0\\x67\\x30\\xb1\\x10\\xcb\\x2c\\xb2\\xf3\\x52\\xc2\\xec\\x13\\x37\\xeb\\xa8\\x4a\\xd9\\x09\\xb5\\x51\\xd9\\x43\\x09\\xb2\\x21\\x4a\\xa9\\x66\\xa5\\x39\\x4a\\xb4\\x27\\xa5\\xe4\\x82\\x4d\\xb6\\x70\\x8d\\xa9\\xf9\\x54\\x75\\x44\\xac\\x52\\x3b\\x6e\\xb9\\x8f\\x7e\\xb1\\x8a\\x14\\xb5\\x45\\xad\\x53\\x75\\xa9\\xd5\\x99\\x53\\x53\\x1c\\xa6\\xdf\\x43\\xd4\\x26\\x46\\x30\\x4a\\xb0\\x78\\x2f\\x5c\\x0e\\xb1\\x38\\x72\\xd2\\x04\\xf0\\x77\\x24\\x70\\x04\\x5c\\x3e\\xac\\x34\\xa5\\x9a\\x9a\\x11\\x98\\xc9\\x70\\x63\\xe8\\x80\\x93\\xc0\\x13\\xc1\\x91\\x27\\xcf\\x29\\xba\\xda\\x46\\x4f\\x19\\x44\\xc9\\xd8\\x0d\\x91\\x09\\x61\\x23\\x91\\x30\\x7b\\xce\\xb4\\x38\\x1f\\xec\\x6f\\x3c\\x2d\\xad\\x46\\x02\\x6b\\xa0\\x0f\\xdd\\x68\\x74\\x1a\\x1f\\xa6\\x1d\\xd5\\x36\\xe8\\x27\\xd5\\x36\\xb2\\x1f\\x57\\x13\\x13\\xfa\\xf3\\xd1\\x13\\x3c\\xd6\\x20\\x45\\x30\\x81\\x54\\x37\\x2a\\xfa\\x81\\xbc\\x58\\xe6\\xb6\\x04\\xaa\\x62\\xdc\\x58\\xbd\\x5f\\xae\\xe8\\x31\\xde\\x40\\x8f\\xb1\\x8c\\x5c\\xd5\\x48\\x8d\\x0a\\x0d\\xb0\\x66\\x13\\xec\\x8a\\x98\\xc4\\x62\\xc4\\xed\\xca\\xaf\\xb9\\xff\\xfb\\xe4\\x7b\\x73\\x9d\\x8d\\x8f\\xb1\\x5c\\xd1\\x15\\xa7\\xb0\\xf8\\x79\\x60\\xe9\\xe8\\x6a\\x99\\xef\\x4e\\x22\\xcd\\xe6\\xa4\\x42\\x84\\xaa\\xff\\x51\\xda\\xe4\\xf7\\x2d\\x77\\xaa\\x37\\x74\\x55\\xe2\\x06\\x26\\xfa\\x78\\x85\\x4e\\xf6\\x24\\x71\\x35\\xa9\\x96\\xcc\\x62\\xdc\\xf9\\x92\\x94\\xbe\\x0a\\xed\\x72\\x2e\\xfd\\x4f\\x78\\x4a\\x4c\\xbb\\x92\\xdb\\xe2\\x12\\xcc\\x1b\\x2c\\xfd\\x9f\\xd7\\x5f\\x93\\xf5\\xd7\\xb2\\x2c\\x5f\\xcb\\x79\\xf6\\x29\\xf0\\x2e\\xe7\\xb8\\xff\\x5a\\x9c\\x7d\\x8e\\xf1\\x08\\xcc\\xfb\\xd5\\x6a\\x9f\\x5a\\x97\\x5e\\xaa\\x2b\\x53\\xa9\\xb3\\x84\\x00\\x2a\\x4f\\x88\\x3d\\x45\\xe1\\x29\\x92\\x2a\\xae\\x32\\x72\\x52\\xbe\\x33\\xea\\x66\\x51\\xf0\\xaf\\x06\\x41\\xb9\\x22\\xe8\\xaa\\xda\\x0b\\x21\\x75\\xe0\\x19\\x0e\\x8a\\xb3\\xa1\\x2c\\xaa\\x12\\x1a\\xf2\\x9b\\xbc\\xf2\\x8f\\x39\\x27\\xd4\\xb8\\xd5\\x0e\\x66\\x2f\\xc1\\xac\\x2f\\x55\\xab\\xb0\\xb8\\xa1\\x78\\xb9\\x85\\x1e\\xf2\\x1b\\xd5\\x12\\xd0\\x9d\\x14\\x87\\x0d\\x16\\x57\\xd2\\x2c\\x42\\x3b\\x6d\\x09\\xbb\\x3d\\x91\\xae\\x86\\xc4\\xd1\\x27\\xee\\x1a\\xbc\\xf6\\xec\\x88\\x02\\xdd\\xdf\\x0d\\x39\\xe5\\x20\\x50\\x36\\x4c\\x24\\x1d\\xd2\\x62\\xb7\\x45\\xd9\\xb0\\xce\\xff\\xcb\\x2a\\xf1\\x60\\x09\\x59\\x1c\\xec\\x0b\\x10\\x76\\x4e\\x75\\x57\\x42\\x99\\xf5\\xbf\\x86\\xcb\\xf7\\x6e\\xeb\\x1c\\x65\\xe7\\xf5\\x9d\\xc7\\xd3\\xe6\\xfe\\xfc\\xfa\\x3a\\xf4\\xdf\\x07\\x06\\xdb\\xc1\\xb7\\xea\\x55\\xd7\\x1b\\xde\\x8e\\xdf\\xac\\x88\\x49\\x3a\\x92\\xcf\\xd9\\x49\\x4b\\xe6\\xc0\\x83\\x08\\xf2\\x24\\xa9\\x3b\\xf0\\x60\\xd0\\xef\\xbd\\xbe\\x06\\x5b\\x9a\\x29\\x7f\\x07\\x0d\\xa1\\xb2\\x4f\\xf7\\x76\\xa6\\x90\\x16\\xdb\\x23\\x24\\xb1\\xcd\\x4b\\x57\\x5e\\x22\\xd3\\xa4\\xd2\\x43\\xbc\\x14\\xcd\\xc0\\x0b\\x66\\xe0\\x45\\x07\\xc8\\x40\\x6a\\xd0\\x06\\x83\\x59\\x8e\\x9b\\xe2\\xf9\\x9b\\xe7\\xf2\\xdb\\x15\\xcd\\xd2\\x9a\\x0d\\x6d\\x03\\x62\\xdc\\x51\\xe2\\x21\\x31\\x39\\x7d\\x66\\xaa\\x83\\x38\\x9f\\x06\\x9f\\xd4\\x00\\xcf\\xad\\x0d\\x19\\xf1\\xea\\x58\\x06\\x2f\\x16\\x1f\\x17\\x7d\\xcb\\xc5\\x65\\x78\\x71\\x54\\xe1\\xe4\\xee\\xcf\\xb9\\x79\\x34\\x9f\\xac\\x56\\x36\\xe4\\x9b\\x47\\x43\\xa2\\xdc\\x59\\x17\\xc6\\xaf\\x75\\x63\\x7e\\xe7\\xd7\\x7b\\x2c\\x6d\\x2d\\x3b\\x39\\xf1\\x10\\x81\\xb5\\xa9\\xca\\x2e\\xe3\\x19\\x8f\\x9c\\xf8\\x90\\xd0\\x52\\xc9\\x83\\x72\\x72\\xe3\\xc1\\x27\\x47\\x83\\x8f\\x48\\xca\\xa1\\xdc\\x76\\xaa\\x93\\xf4\\xdf\\xaa\\x26\\xb3\\x62\\x4e\\xe7\\x69\\x80\\x1b\\x58\\xc7\\x98\\x4a\\x3e\\x32\\xeb\\x7f\\x39\\x91\\x09\\x86\\x12\\x90\\x85\\xc2\\x71\\xc8\\x8e\\x67\\x35\\x77\\xae\\xb1\\xc2\\xe0\\xb5\\x09\\x11\\x92\\xbf\\x9c\\xd7\\xc1\\x13\\x1f\\x13\\x59\\x9f\\x6e\\x8b\\x2c\\x92\\x37\\x14\\x73\\xb6\\xd4\\x0c\\x17\\xa3\\x4c\\x91\\x0c\\x05\\x94\\x91\\xa1\\x17\\x63\\xf7\\x58\\x02\\x16\\x90\\x19\\x49\\x31\\x42\\xeb\\xd8\\xcf\\x3d\\x2b\\x86\\xbd\\x7a\\x33\\xf9\\xab\\x9f\\x8c\\x9e\\x13\\x54\\xf2\\xd2\\x6b\\x9e\\xfc\\xfe\\x53\\x3d\\xa8\\x66\\xce\\x2a\\x55\\x46\\xe6\\x9f\\x55\\x85\\x3d\\x71\\xb1\\x00\\x03\\xd7\\x91\\x2a\\xdc\\x55\\xcd\\x12\\x7f\\xe0\\x7d\\x05\\xb4\\x12\\x09\\x0f\\xd3\\x6c\\x8a\\xdd\\x40\\x55\\xa8\\x4e\\xb8\\x4e\\x5e\\xe5\\x9f\\xfe\\x12\\x6e\\x4e\\xa8\\xc5\\xa5\\x33\\x37\\xf9\\xe5\\x23\\x30\\xaf\\xf3\\x86\\x79\\xfd\\xbb\\x35\\xe7\\xf0\\x6a\\xd7\\x52\\x2a\\x23\\x8b\\x0e\\x4e\\x00\\x05\\x39\\x18\\x48\\x14\\x3a\\x08\\x74\\xd8\\x1f\\x2c\\xc4\\x88\\x56\\x04\\x48\\x25\\x59\\x01\\x5a\\xed\\xdb\\x07\\xb5\\x5c\\xa4\\xee\\x24\\x87\\x51\\x71\\x45\\x70\\xcc\\xe4\\x10\\x5d\\x29\\xa2\\xb3\\x83\\xb1\\x05\\xab\\x37\\x28\\xde\\xb1\\x04\\x22\\x5a\\xfa\\xc9\\x72\\xf3\\x34\\x7e\\xff\\x37\\xa2\\x00\\xc0\\xb4\\x64\\xc8\\xcb\\xbc\\xd8\\x9e\\x43\\x1a\\x14\\x0c\\x99\\x8b\\x03\\xf1\\x2e\\xe2\\x36\\x78\\x2e\\xd9\\xb1\\xda\\xc3\\x49\\x69\\x58\\x16\\x80\\xe1\\xc5\\x9c\\x67\\x16\\xad\\x25\\xcb\\xaa\\xb9\\x7f\\xd2\\x71\\xef\\x40\\x3b\\x27\\x92\\xce\\xbf\\xae\\xd6\\x3c\\x5d\\x17\\xba\\x69\\x97\\x58\\x49\\xa7\\x81\\x74\\xcc\\xbb\\x0b\\xc7\\x82\\x9a\\x9b\\xe6\\x4d\\xd5\\xf5\\xb4\\x88\\x46\\x4b\\x8b\\xa2\\xf5\\x24\\x3c\\x9a\\x65\\xde\\x1c\\x15\\xbe\\x4a\\x11\\x4b\\x3d\\x03\\x0d\\xd9\\x6e\\x24\\x70\\x5b\\xe6\\xea\\x08\\x0d\\x78\\x82\\x66\\xd7\\x31\\x23\\xd6\\x25\\xa3\\xfe\\x5e\\x22\\x76\\x8c\\x42\\x98\\xd4\\x6c\\x24\\xc9\\xb3\\x62\\xe1\\x6e\\x09\\x40\\x5d\\x21\\xb6\\x98\\x5c\\x61\\x25\\xb3\\x3c\\xfb\\xac\\xb8\\xe1\\x8a\\x5c\\x6b\\xde\\x09\\x85\\xd1\\xd0\\x09\\x23\\xaf\\x2c\\x0b\\x08\\x16\\xa6\\xa2\\x74\\xc3\\x42\\xf7\\x18\\x0e\\x53\\xe4\\x7e\\x4e\\x3d\\x10\\x9b\\x11\\x7a\\x05\\x34\\x4f\\xb4\\x61\\x30\\xfe\\xdb\\x3a\\x05\\xad\\x5c\\x79\\xf7\\x23\\x49\\xd7\\xc5\\xb6\\x64\\x70\\x46\\x8b\\xa5\\x23\\x2a\\xe5\\xf8\\x22\\x23\\x45\\xa4\\x98\\x4a\\x76\\x59\\x26\\x84\\x8b\\x10\\x45\\x0b\\x96\\x64\\x47\\x16\\x23\\x05\\xf1\\x9b\\xb5\\xcf\\x42\\x2e\\xc1\\xb1\\x0a\\x8a\\xc9\\x3c\\x75\\x4b\\x8d\\x33\\x6c\\x0e\\xd5\\x00\\x62\\x41\\xd3\\x38\\x09\\x5c\\x3b\\x48\\xef\\xb4\\x9d\\x44\\xa2\\x95\\x5a\\x2f\\x48\\x2e\\xe2\\x62\\x79\\xa4\\xdc\\xf8\\x4d\\xeb\\xa5\\x2e\\x86\\x1b\\x02\\xb5\\x1c\\xca\\xe4\\x19\\x3e\\xe3\\xa2\\x16\\x8c\\xd9\\x0f\\xcc\\x69\\x41\\x12\\x93\\x2f\\x3d\\xb4\\x25\\x4b\\xfc\\x35\\x21\\x1e\\x44\\x4a\\x20\\x13\\x17\\x4b\\xae\\x81\\x23\\x25\\x38\\x9f\\x8a\\x93\\x64\\xe1\\x40\\x8b\\xdb\\x72\\xe9\\x29\\xa6\\xb9\\x1b\\x2f\\x5c\\x65\\x82\\xd3\\xc2\\x1c\\x10\\x6c\\x79\\xad\\x52\\x75\\x15\\x94\\xee\\xd5\\x0e\\x07\\xe5\\x64\\x76\\x12\\xd2\\x4c\\x1b\\x84\\xfe\\xd9\\x6a\\x7b\\x42\\x47\\x4a\\x0a\\x54\\x96\\xb8\\x10\\x91\\x70\\x47\\xd9\\x31\\x57\\xe8\\x76\\xea\\x09\\x09\\x78\\x8a\\x79\\x43\\x7b\\xfd\\x61\\xc5\\x47\\x75\\x91\\x5d\\xb1\\xb8\\x98\\xdb\\xdc\\x6a\\xe9\\x79\\xe2\\xd5\\x72\\x52\\x91\\x02\\x0c\\xa7\\x96\\x2e\\x8c\\x9a\\x67\\x15\\x18\\x38\\x2b\\x27\\x33\\xb6\\x0b\\x29\\x1b\\x88\\x66\\xa0\\xd5\\xaa\\x0f\\x86\\x63\\xc6\\x02\\xd6\\x92\\xe3\\xe4\\x63\\x90\\xce\\x67\\x23\\x7c\\x0b\\x58\\xaa\\x76\\x90\\x83\\x1a\\xf5\\x1f\\x92\\x37\\xb3\\xbd\\x3e\\x5f\\x9b\\xc7\\xdd\\x29\\xcd\\x6c\\x0e\\x0f\\xa6\\x38\\xf4\\xfd\\x68\\x71\\x10\\xc8\\xc4\\xb4\\xcb\\xfa\\x44\\x94\\xf0\\x4a\\xdf\\xec\\x98\\x64\\xf0\\x29\\xd2\\xe2\\x19\\xa1\\xbc\\xe1\\x47\\xfd\\x62\\xe5\\x1b\\x5c\\x7c\\x1c\\x29\\x76\\x1f\\x4b\\xcb\\x03\\x33\\x2b\\x2d\\xf1\\x80\\x54\\xc1\\xba\\xa4\\xc8\\x35\\x47\\x55\\x06\\xd5\\xe9\\x2d\\xf1\\x8e\\x4a\\x1c\\x60\\x78\\x68\\x43\\xa4\\xd4\\xd6\\xb2\\xcb\\x03\\x6b\\xab\\x32\\x30\\xf5\\x56\\x8a\\x4e\\x24\\x5d\\x8d\\xac\\xe4\\xc1\\x73\\x45\\xee\\x5c\\x18\\xe0\\x43\\x52\\xd9\\xa1\\x7f\\xb4\\x48\\xf2\\xa0\\x6c\\xa1\\x13\\x46\\x3e\\x7a\\xd9\\xc0\\x77\\x7f\\xdc\\x5c\\xba\\x9c\\x5d\\x18\\x14\\xa0\\x15\\x89\\x83\\x8f\\x99\\x5d\\x61\\xde\\xb1\\xe8\\xa2\\x55\\xe7\\x53\\xae\\x48\\x05\\x4d\\xb9\\xee\\x58\\xaa\\xb5\\xf0\\x85\\x19\\xbf\\xf1\\x45\\x62\\xc7\\xaf\\x12\\x9b\\xda\\x6e\\x3a\\x78\\xf0\\x4e\\xd5\\xbf\\x6f\\x58\\x06\\x5f\\xae\\x46\\xb3\\x24\\x3d\\x71\\xe8\\x1b\\xc9\\x69\\x90\\x8a\\xdc\\xe6\\x80\\x87\\x12\\x03\\xfe\\xe8\\x13\\x91\\x43\\x4e\\x8b\\x4f\\xc4\\x96\\x66\\x90\\x78\\x83\\x60\\xfe\\xb4\\xfa\\xce\\x3e\\x8a\\x51\\xa0\\x3f\\xf2\\x50\\x4a\\x55\\xd2\\x80\\x31\\x5b\\x2c\\xfc\\x0a\\x29\\x13\\x69\\xf0\\x05\\x62\\x88\\x32\\xed\\x2a\\xc5\\x8e\\xa0\\x29\\xc8\\xc6\\x12\\xff\\xd7\\xeb\\x66\\x53\\x5a\\x70\\x4e\\x14\\x05\\x2e\\x3c\\x53\\x2b\\x79\\x27\\x75\\xb1\\xd5\\x49\\x15\\x09\\xe5\\x0c\\xc1\\xdb\\xff\\x26\\x75\\x63\\x2a\\xff\\xdb\\xf5\\x34\\xb1\\xd8\\x59\\x58\\xa9\\x0c\\x74\\x58\\x33\\x52\\xc5\\x96\\xe4\\xb0\\x2d\\xa4\\xff\\xdf\\x36\\x87\\x49\\x16\\x46\\xa6\\xda\\x66\\x8c\\xca\\xe3\\x29\\xa5\\x9d\\xd4\\x3c\\x7b\\x0c\\x5e\\x65\\x9b\\xfe\\xe9\\xe6\\xae\\xff\\xf7\\x55\\x2a\\x5b\\xde\\x07\\x1d\\x0a\\xb7\\x81\\x5b\\x73\\x85\\xcb\\x8e\\x24\\x0e\\xdc\\xaa\\x92\\x91\\x5a\\x39\\x95\\x06\\x5d\\x06\\x17\\xa9\\x21\\x98\\x5d\\x02\\xe8\\x9b\\xd4\\x48\\x0a\\x83\\x39\\x04\\x23\\xa9\\xed\\x50\\x37\\xc0\\xd9\\xff\\x71\\x3d\\xda\\x21\\xdd\\x30\\x88\\x2e\\xec\\x1a\\xcb\\xe2\\xf6\\x60\\x99\\x29\\x6d\\x78\\x8f\\xfe\\xcf\\xeb\\xa9\\xa4\\xb1\\xf7\\x51\\x55\\xb6\\x14\\x42\\x86\\x12\\x4b\\x18\\xa8\\x28\\x40\\xc0\\xfa\\xa4\\x0d\\xfa\\x7e\\xb4\\xb2\\xcf\\x16\\xff\\x2c\\x0e\\x18\\x04\\x04\\x89\\x53\\x72\\x3d\\x1f\\x07\\x01\\x53\\x81\\xda\\xaf\\xaa\\xcc\\x99\\xe2\\xac\\x0a\\x25\\xb8\\x86\\x28\\xbf\\xa3\\x64\\x89\\x16\\x39\\xba\\x84\\x34\\x8b\\x66\\x1e\\x63\\x13\\xae\\x96\\x67\\xd7\\x83\\xaf\\x0a\\x5c\\x40\\x5a\\xc8\\x4f\\x9a\\xe1\\x6e\\x23\\xe4\\xe9\\xb3\\xe3\\x90\\x46\\xc5\\x24\\xad\\x3a\\x09\\xe2\\x9a\\xa2\\x3a\\xf8\\x34\\x5a\\x76\\xbe\\x21\\x98\\xaa\\x68\\x89\\x33\\x62\\xb6\\x89\\xe1\\xaa\\x4b\\xd5\\x41\\x2d\\xf2\\x64\\x59\\x4c\\xb9\\x03\\x1f\\x0a\\x2e\\x36\\x3b\\x26\\x86\\x6c\\xfe\\xc9\\x2b\\xf8\\x84\\x0b\\xd2\\x03\\x33\\xd4\\x7e\\x2c\\x64\\x49\\x51\\x9a\\x7c\\x3f\\xb2\\x62\\xa7\\x0c\\x28\\x37\\xcb\\x14\\x29\\xfb\\x0e\\x90\\x82\\x81\\xdc\\xb6\\xcb\\x73\\x1d\\xa0\\xb9\\x81\\x7c\\x61\\x17\\xcd\\x84\\x9f\\x48\\x45\\x7a\\xe4\\x91\\x02\\xce\\xa9\\x35\\x71\\xc9\\x06\\x4d\\x9c\\x67\\x52\\x02\\x65\\x26\\x33\\xeb\\x61\\x36\\x58\\x20\\x20\\x2c\\x69\\x6a\\x14\\x37\\x14\\xf0\\xe3\\x2b\\x4e\\x0d\\x33\\xa5\\xdc\\x33\\xa9\\x73\\xc8\\x63\\x52\\xda\\x35\\x15\\xe5\\x88\\xc2\\x64\\xa7\\x56\\xa4\\x8e\\x0a\\x76\\x91\\xb2\\x87\\x33\\x6e\\xb6\\x74\\x91\\x69\\xf6\\xb6\\x6e\\x8c\\x03\\x73\\x96\\xd0\\x27\\x96\\x2b\\x07\\x97\\x44\\x5f\\x95\\xd1\\xdb\\x1c\\x94\\x51\\x7b\\x04\\x88\\x96\\xc8\\xf6\\xe0\\x19\\x3e\\x7b\\x51\\xc5\\x44\\x96\\x1d\\x20\\xa1\\x8d\\x2a\\x8f\\x6b\\x70\\x96\\x41\\x40\\x9c\\xa6\\x9e\\xb9\\x1f\\xd3\\x48\\x62\\x27\\x80\\x8a\\x6b\\x6d\\xca\\xd5\\x71\\xe6\\x19\\xe3\\xd0\\xee\\x2d\\x63\\x52\\x82\\xe5\\x36\\x07\\xb8\\x1e\\x91\\x6b\\x74\\x15\\x4a\\xb3\\xfc\\x4d\\x18\\x0e\\xbd\\x7b\\x0b\\xdc\\xc7\\x2d\\xc5\\xf8\\x64\\x15\\xcc\\x5c\\x52\\xaf\\x5b\\x71\\x89\\xc3\\x8c\\xbc\\x1d\\xc6\\x94\\x12\\x16\\x4c\\xe1\\x42\\x47\\x83\\xc9\\xf2\\x3f\\x68\\x9f\\xed\\x43\\x3c\\x12\\x15\\xb3\\x1d\\x90\\xf6\\xc3\\x59\\xa5\\x64\\xd8\\x43\\x3d\\x84\\xdd\\x1b\\x22\\x8f\\xe6\\x69\\x9f\\x70\\x7e\\x20\\x5b\\x44\\xcc\\xac\\x1b\\xee\\xf1\\x2a\\xc2\\x6a\\x66\\x0b\\x4b\\x16\\xb1\\x24\\x50\\x43\\x35\\xd9\\x65\\x64\\x3b\\x2b\\xb9\\xb1\\x85\\xd7\\xc2\\xc3\\x34\\x36\\x8b\\x2e\\x01\\x4d\\x2b\\xa7\\x99\\xf7\\x5e\\xf9\\x6a\\x47\\x48\\x34\\x83\\xe7\\x3a\\x8c\\x1e\\xb0\\x34\\xf6\\xe4\\x7d\\x86\\x9b\\x9a\\xa4\\xdb\\x3c\\x5e\\x82\\x05\\x70\\x14\\xfc\\x22\\x0b\\x4a\\x32\\xe9\\x5c\\x2d\\xf5\\x55\\xea\\x06\\x3a\\x7b\\xda\\x97\\xad\\xba\\x14\\x82\\x6d\\x1a\\x23\\x32\\x8b\\x24\\x02\\xa6\\xc9\\xb2\\x42\\x29\\x87\\xb1\\x59\\xfc\\xce\\xd2\\xec\\xd3\\x64\\x2b\\xab\\xb6\\xd4\\x9c\\x5a\\xea\\x3e\\x0e\\x25\\x5e\\x8f\\xb4\\x70\\x16\\x47\\xc8\\x38\\x55\\xb3\\x21\\xbb\\x3e\\x52\\x1c\\xa9\\x28\\x6a\\x4a\\x2b\\x46\\x6e\\x86\\x58\\x49\\xd5\\xae\\x85\\x5f\\x88\\x1d\\xc8\\xf5\\xf2\\x9c\\x5b\\xd2\\x21\\xd9\\xca\\x45\\x97\\xd5\\x02\\xcd\\x76\\xca\\xa1\\x5a\\x24\\xa7\\x87\\xe5\\x62\\x75\\x31\\x4c\\x0d\\x87\\x26\\xe6\\x14\\x10\\x68\\x43\\xf3\\x56\\x0f\\x72\\x6b\\x90\\x65\\x0a\\xc8\\x3f\\xc2\\xca\\x85\\xb9\\xd9\\x69\\xad\\x4c\\x96\\xc3\\xe2\\x25\\x44\\x65\\xa0\\x9b\\x57\\xea\\x62\\x4d\\x73\\xb2\\x4f\\x4a\\x00\\xcd\\xc5\\x85\\xe6\\x2c\\xdf\\x1f\\xb9\\x80\\x3d\\x1f\\x53\\x49\\x7c\\x64\\x08\\x06\\x11\\xec\\x23\\x1b\\xcf\\x0a\\x9c\\x57\\x0c\\xdf\\x28\\x9b\\x4b\\x6e\\x14\\x24\\xa2\\xb8\\xd2\\x7a\\x76\\xed\\x92\\x2d\\x86\\x9c\\x9f\\x60\\xa1\\x1f\\x88\\xee\\xba\\x4f\\xf3\\x53\\xd3\\x62\\x28\\xc5\\xac\\x65\\x95\\x9a\\x6a\\x3f\\x78\\x8b\\xad\\xe0\\x48\\x01\\xe0\\xee\\x88\\x4c\\x36\\x24\\xaa\\x59\\x5c\\x36\\x5c\\xe5\\x73\\x89\\x8a\\x2b\\x95\\x7c\\xc5\\xe5\\x14\\x2d\\x8d\\x37\\xb6\\x36\\x5b\\xea\\x88\\x72\\x05\\x32\\xab\\x94\\x9e\\x6a\\x74\\x45\\x89\\xcf\\x72\\x3c\\x11\\xd1\\xb5\\x74\\x5d\\xe5\\x76\\xac\\xea\\xcd\\x2b\\xf8\\xec\\xda\\x0a\\x96\\xd0\\x99\\x36\\xe5\\xab\\x43\\xc2\\xb9\\xcd\\x66\\xf8\\x52\\x11\\x07\\x11\\x8a\\xd3\\x75\\x93\\xb9\\xd1\\x9b\\xf2\\x2e\\xc2\\x68\\xfd\\xa4\\xaf\\xf2\\x8b\\xa5\\xe0\\xa4\\xbd\\xe8\\x4a\\x01\\x01\\xdd\\x68\\x39\\x3a\\xae\\x4c\\x1e\\x12\\x46\\x46\\x5f\\x2d\\xc3\\x52\\x8d\\x36\\xc4\\x95\\x2d\\x62\\x1b\\x5b\\x37\\xb7\\x15\\xe3\\x2d\\xa7\\x84\\x79\\x7d\\x4a\\x78\\x4b\\x1a\\x7d\\x75\\x95\\x4c\\x7c\\x8d\\x89\\x62\\x67\\x21\\x63\\x20\\x35\\x6b\\x91\\x9f\\x63\\xa1\\xec\\xa9\\xb3\\x44\\x7b\\x98\\x06\\x56\\x3c\\x4f\\x3b\\x4a\\xf0\\x27\\xd7\\xee\\x0e\\xc1\\x21\\x21\\x5a\\xa2\\x01\\x00\\xb9\\xdd\\x44\\x54\\x05\\xb7\\x3f\\xef\\xcc\\xcb\\x61\\x95\\x1e\\xe8\\x1b\\x12\\xc2\\x6a\\xa3\\xee\\xbe\\x74\\x1b\\x15\\x6a\\xda\\x22\\x5d\\xf5\\x2a\\x57\\x09\\x1c\\x80\\x50\\x35\\xbc\\x41\\x48\\x0f\\x9b\\x91\\xa0\\xa1\\xbf\\xb5\\x43\\x4a\\xa5\\xe7\\x5b\\x4e\\x96\\xcd\\x25\\x96\\x8c\\xdd\\xf3\\x7b\\x49\\x90\\xa2\\x68\\x07\\xd5\\xa4\\x14\\xe5\\xdb\\x72\\xc5\\xb7\\x62\\xf9\\xf5\\x99\\x27\\x26\\x35\\x78\\xdb\\x58\\xe1\\x4d\\x8f\\xcd\\xb2\\x37\\x91\\x7c\\x11\\x1f\\xa6\\x39\\xb6\\x6a\\x7c\\xab\\x16\\x4a\\x73\\x3d\\x10\\x0d\\x03\\x31\\xe0\\x7b\\xd1\\x92\\xbf\\x4d\\x5e\\xd7\\xc9\\x63\\x28\\x41\\xb6\\xd9\\x75\\xb7\\xa1\\x54\\x59\\x46\\xe5\\xad\\xda\\xb9\\x94\\x2c\\xa0\\x5f\\x2d\\x00\\xa2\\x2b\\x83\\xd4\\x08\\xee\\x09\\xd7\\x21\\x4e\\xcd\\xdc\\x5a\\x1c\\x66\\x9f\\xfb\\x39\\xe6\\x39\\xd7\\x80\\xe4\\xef\\xa8\\x7c\\x86\\x85\\xab\\xba\\x3c\\x38\\x01\\x1b\\x47\\x5f\\x21\\x5f\\x7a\\x2a\\x6b\\xcf\\x96\\x0f\\x6d\\x9f\\x69\\x38\\xfb\\xd2\\xda\\x11\\x7f\\xef\\xf3\\x55\\x7a\\xd5\\x82\\xdf\\x52\\xbb\\x3a\\xa2\\x5e\\xae\\x8e\\xa8\\x97\\x4b\\xbc\\x22\\x49\\x6d\\xe6\\x40\\x4b\\xb6\\x13\\x1d\\xf9\\xc6\\xff\\xb5\\x3a\\xd5\\xdd\\x6d\\x20\\xaf\\x3a\\x4a\\xc1\\x30\\x21\\x97\\x75\\x24\\x9d\\xa3\\x53\\x8b\\x51\\xe7\\x01\\x63\\xe2\\x61\\x1a\\x11\\x9f\\x25\\x98\\xd4\\x31\\x4e\\xfd\\xe4\\x86\\xcc\\x44\\xa5\\x7f\\x9d\\xcc\\x45\\x83\\x98\\x97\\xc9\\x85\\x64\\x4e\\x1a\\xd1\\x1d\\xc6\\x9e\\x22\\x33\\xde\\x52\\x6c\\xa0\\xfa\\x2d\\x35\\x41\\xed\\xef\\x73\\xfd\\x15\\x49\\x16\\x35\\x5a\\x7a\\x7f\\xed\\x58\\x48\\xe2\\xcf\\x2b\\xd9\\xbc\\x3f\\xc7\\xa2\\x84\\x7e\\xb0\\xff\\x2d\\xc4\\x1d\\x71\\xc6\\x59\\xa6\\xc8\\x19\\xa6\\xa6\\x97\\x82\\xd4\\x10\\x1e\\x22\\xab\\x00\\x6e\\x38\\x4f\\xcd\\x66\\x09\\x47\\x6c\\x15\\xd7\\xd9\\xc7\\xa3\\x9b\\x36\\xbc\\x65\\xd3\\xf6\\x23\\xe8\\x3a\\x72\\xab\\x9f\\xaf\\xd7\\xb1\\x90\\xf0\\x06\\x29\\x63\\xf7\\x4b\\x1e\\x90\\xde\\x13\\x59\\xb9\\x1c\\xf9\\xbb\\x58\\x3d\\x3b\\x9c\\x0d\\xbf\\x86\\x25\\x42\\x5a\\x4e\\x50\\x0a\\xcb\\x81\\x0e\\x15\\x8e\\x89\\x5c\\x63\\x1c\\x5d\\xa0\\x98\\x27\\x6a\\xd9\\xa5\\x38\\x5a\\xc8\\x5d\\xc5\\x96\\xe5\\x3f\\x4c\\x0d\\xf9\\xcf\\xa4\\xe4\\x9a\\x63\\x59\\x82\\x78\\x70\\x9f\\x65\\xdd\\xb7\\xe4\\xb8\\x7b\\x4e\\x54\\x3d\\x67\\x03\\x95\\x06\\xe8\\x2c\\xab\\xb1\\x84\\xee\\xea\\x56\\xb0\\x34\\xfb\\x3a\\xfb\\x5c\\xd1\\x4f\\x5d\\xfa\\x49\\xdc\\xf7\\x1f\\xbe\\x44\\xed\\x09\\xee\\xb3\\x60\\xe0\\x30\\x74\\x26\\x52\\x04\\x3b\\xf9\\xda\\xc0\\x3d\\xb3\\xaf\\x47\\xe9\\xfa\\xc5\\xf6\\x5a\\x65\\x1a\\x53\\x74\\x35\\xeb\\xcc\\x2d\\xfe\\xbd\\x5f\\xa0\\x88\\xa4\\x5e\\x24\\xa0\\x33\\xb2\\x34\\x21\\xf0\\xb0\\x02\\xe6\\x8b\\xcd\\x55\\xfa\\x0a\\xe0\\x68\\x2f\\x8c\\x6a\\x1b\\x79\\x10\\xe5\\x7c\\x03\\x6f\\xa3\\xaf\\xdd\\x34\\x0a\\x96\\xaf\\x34\\x19\\xc3\\x03\\x63\\xce\\xbe\\xd4\\x63\\x04\\xf4\\xf2\\x00\\xc0\\xb6\\x99\\x01\\x60\\xa3\\x0a\\x99\\xe0\\x04\\xe9\\x4c\\x92\\xc4\\xf2\\x2e\\x46\\x46\\xce\\x8e\\xf4\\x93\\xb3\\x69\\x01\\x01\\x5e\\x5a\\x9e\\x3d\\x5b\\xb2\\x39\\x34\\x1b\\xd4\\x7e\\xcb\\x13\\x32\\xd3\\x3d\\xd0\\xa0\\x18\\x9b\\xa5\\x78\\x90\\x72\\xac\\xdd\\xab\\xe4\\x8e\\xfa\\xe9\\xe5\\x1c\\xbb\\xf9\\xa5\\xb9\\xc6\\x89\\xed\\xb4\\x00\\x70\\x32\\xe4\\x30\\xab\\x6c\\x20\\x46\\x48\\xa3\\x46\\x1b\\x2b\\x94\\x43\\xcf\\x2e\\xc5\\x39\\x72\\x3b\\x87\\x22\\x07\\xb2\\xbb\\x1f\\x0f\\x91\\xc9\\x2f\\x7d\\xab\\xfc\\xde\\x08\\x3a\\x7f\\x73\\xe0\\xbe\\x88\\x84\\xc4\\xcb\\x8a\\x3a\\x0a\\x80\\x4f\\x31\\x80\\xee\\x2b\\xaa\\x85\\x10\\xb5\\x49\\x41\\x49\\x24\\x9c\\x74\\xb8\\x3a\\xc9\\x94\\xc0\\x0d\\x96\\x05\\x18\\x19\\xa4\\xfc\\xa6\\x79\\x74\\x68\\x1c\\x1d\\x98\\x46\\x46\\x79\\xc0\\x58\\x62\\xb8\\x94\\x0d\\x4b\\x06\\x33\\x4d\\xdb\\xee\\x2a\\x71\\x9a\\x4b\\x1a\\xa5\\x38\\x9f\\x8b\\x6b\\x65\\x9f\\x4a\\x1e\\x8b\\x76\\x0d\\x45\\x1b\\xb0\\x60\\x3d\\xb2\\x31\\x15\\x76\\x9c\\x55\\x07\\x74\\xfb\\x68\\x49\\xef\\x17\\x53\\xb1\\xb6\\x48\\x96\\xb4\\xbe\\xa7\\xa6\\xb8\\xd7\\x22\\xf6\\x85\\x64\\xa3\\xd8\\x70\\x47\\x8c\\xb7\\x40\\xf4\\x16\\xda\\x8e\\x36\\xd6\\xa9\\xeb\\x7a\\xe0\\x11\\xa4\\x31\\xec\\x08\\xe9\\x21\\xba\\xf2\\x16\\x5a\\xa5\\x6a\\xe9\\x05\\x90\\x12\\x2a\\x2b\\x1b\\x83\\x6b\\x95\\x4f\\x6e\\x8b\\xe7\\x41\\x01\\xc0\\x1e\\x4b\\x86\\x55\\x50\\x64\\x83\\xf3\\xc9\\x38\\x8f\\xec\\x24\\x9b\\xf2\\xa5\\x40\\x73\\x8a\\x19\\xe1\\x8e\\x4c\\x3d\\xb7\\x42\\xa9\\x1a\\x07\\x95\\x9c\\x18\\xa6\\xa7\\x8e\\xe9\\xf7\\x59\\x8b\\x48\\x5a\\x0c\\xd9\\x76\\xfd\\xe6\\xb5\\xba\\x5e\\x49\\xa7\\x04\\xbe\\x59\\x7e\\xc0\\xd7\\x50\\xc7\\x98\\x5d\\x8d\\x3d\\x6d\\x15\\xe7\\x68\\x2c\\x27\\xa8\\x8c\\xcc\\x88\\xaf\\x41\\x39\\x4e\\xa2\\x26\\x0f\\xd0\\x28\\x1c\\xb2\\xfd\\x3c\\x74\\xde\\x83\\xb6\\x7e\\x2e\\xa0\\xf4\\xb2\\x01\\x26\\xd6\\x4a\\x39\\x96\\x15\\xf1\\x7a\\x9d\\xbd\\xbb\\x44\\x9f\\x43\\x73\\xc2\\x6d\\x1f\\x42\\xb1\\xfc\\x33\\x07\\x07\\x08\\x72\\x87\\xa8\\xf4\\xa3\\xe0\\xfb\\x0c\\xcc\\xb8\\x68\\x07\\xb3\\x02\\xc8\\x8e\\xf8\\xe5\\x9e\\xd0\\xea\\x28\\x14\\x05\\xf9\\x05\\x29\\x68\\xba\\xab\\xc5\\x29\\x13\\x5a\\x8a\\x2e\\xd4\\x48\\x37\\xd3\\x11\\xce\\x1c\\x43\\xe7\\x41\\x76\\xcc\\x69\\xe2\\xc6\\xae\\xc9\\x48\\xc0\\x79\\xb0\\x49\\x5b\\x81\\xc3\\xc4\\x37\\xb1\\x9c\\x5a\\xe6\\xb8\\x8e\\xa3\\xe8\\x18\\x6d\\x34\\x76\\x8a\\x83\\x00\\xab\\x52\\xd7\\x2a\\x5d\\xa8\\x2a\\x30\\xc9\\x48\\x38\\xc5\\x31\\x05\\x04\\xc7\\xa2\\x79\\x67\\x02\\x4d\\x54\\x15\\xb2\\x66\\xab\\xd1\\x11\\xa3\\x93\\xb0\\x38\\x12\\x26\\x04\\x8a\\x90\\x8b\\x69\\x11\\xa6\\xb8\\x8f\\x56\\xb2\\x88\\x32\\x3f\\x64\\x74\\x55\\xdb\\xd9\\xdc\\x22\\xc2\\xd9\\x51\\xc0\\x59\\x3c\\xb1\\x30\\x93\\x3e\\xb0\\xf0\\x4c\\x1b\\x5c\\x37\\xad\\x28\\xa9\\xee\\x63\\x28\\x57\\x05\\x90\\x78\\xe6\\xbc\\xc0\\xb3\\x4c\\x3b\\x0e\\x7b\\x73\\x43\\x9f\\x72\\x42\\xe8\\xa2\\x64\\x27\\x3d\\x8f\\xb0\\x4c\\xd5\\xd2\\x49\\x68\\x44\\x65\\x02\\x4b\\xad\\x9d\\xc4\\xb8\\x62\\xc0\\xb1\\x24\\x49\\x6a\\xd6\\x39\\xa4\\xb0\\x66\\x3b\\xa0\\x67\\x59\\x9c\\xe9\\x2a\\x02\\x4b\\x1c\\x96\\x24\\xcf\\xc2\\x76\\x70\\xd2\\x31\\x4e\\xd2\\xf6\\xa4\\x8f\\x0d\\x21\\xfc\\xed\\x92\\x21\\xde\\x1c\\xce\\xce\\x49\\x5d\\xd2\\x4c\\x8c\\x91\\x8b\\x38\\xdd\\x0d\\x96\\x3a\\x29\\xcc\\xf1\\x79\\x4f\\x64\\xd0\\x04\\x06\\x41\\x80\\x12\\xad\\x06\\x4a\\x59\\xca\\xf7\\x74\\xe4\\x5a\\xca\\xe0\\x75\\x85\\x51\\xd9\\x89\\x9c\\xaf\\xc5\\xd9\\x21\\x71\\x92\\x68\\x41\\x4b\\x1f\\xcb\\x08\\x67\\x0b\\x22\\x60\\x08\\xf0\\x29\\xf5\\x39\\x49\\x1b\\x43\\x9e\\x57\\x9c\\xb2\\x20\\xdb\\xa8\\x7b\\x5a\\x79\\xc7\\x81\\x07\\x56\\x62\\x2a\\x59\\x06\\x2a\\xfa\\xdf\\x1d\\x58\\xbc\\xe4\\x81\\xa3\\xfe\\x47\\x76\\x48\\x56\\x95\\x66\\xe5\\x01\\x74\\xa4\\x5b\\xa9\\xee\\x7f\\xb9\\xfe\\xb9\\xb4\\x20\\xcf\\x98\\x5c\\x47\\xea\\x79\\x80\\xcb\\x23\\xd7\\x3a\\xb0\\x25\\x46\\xee\\xf2\\xc0\\xaa\\xbb\\x68\\x60\\xca\\x2e\\x57\\xd5\\x6c\\x15\\x51\\x18\\xb4\\x32\\x15\\x97\\x7b\\x7c\\x26\\xea\\xef\\x83\\xb5\\x6a\\x8a\\x56\\x81\\x66\\x6c\\x58\\xa9\\x0d\\x90\\x79\\x59\\x1f\\xf4\\x8b\\x35\\x22\\xa9\\x84\\x06\\xaf\\x3c\\x0b\\xe1\\x83\\xf4\\xbf\\x8c\\x53\\xef\\x69\\x63\\x16\\xdf\\x1d\\x5b\\xb4\\x30\\x48\\x26\\x97\\x62\\x0f\\x0d\\x25\\x49\\x3b\\xe6\\x32\\xb0\\x4a\\x37\\x69\\x6d\\x60\\x20\\x94\\x06\\xf7\\xb4\\x05\\x8f\\x92\\x24\\xfc\\xc6\\x27\\x05\\x8e\\xa8\\x72\\xa4\\x50\\x26\\x86\\x66\\x0f\\x3e\\x86\\xa6\\x7f\\xdf\\x70\\x60\\xff\\x75\\x73\\x34\\xbc\\x6c\\x21\\x87\\x81\\x91\\x33\\x5b\\x69\\x10\\x3b\\xb2\\xaa\\xab\\x95\\xb3\\xab\\x28\\xf6\\x85\\xd5\\x80\\x9f\\x32\\xd6\\xd1\\x47\\x73\\x8d\\xed\\x0f\\x39\\x22\\x24\\xce\\x96\\x51\\x5d\\x69\\xf4\\xc8\\xad\\x53\\xa5\\x86\\x2c\\xde\\x54\\x1c\\x05\\xd5\\x81\\x70\\x93\\x8f\\x3e\\x3b\\x72\\x62\\x99\\xbf\\x3d\\x40\\x2f\\x63\\x16\\xb3\\x7f\\x5c\\xca\\x93\\xda\\x2a\\x1c\\x87\\x88\\x8c\\xf4\\x9b\\x67\\x74\\xb9\\x39\\xa3\\x06\\xf3\\x44\\xea\\x90\\xaa\\x0a\\xed\\xba\\xf3\\xa9\\x54\\xb5\\x16\\x76\\x15\\xf5\\xa0\\x24\\x0e\\x3e\\xe1\\xe0\\x4e\\x8b\\xbb\\x0c\\xf7\\x04\\x52\\xa9\\xf2\\xc6\\xc1\\xd5\\xff\\xfb\\x7a\\x20\\x61\\x49\\x14\\xc9\\xe2\\x92\\x5a\\x68\\x51\\xc5\\x71\\xd6\\xd1\\x43\\xc4\\xa2\\x60\\x13\\xd2\\x96\\x91\\x5d\\x3a\\xdb\\xe1\\x5e\\xd5\\x19\\x95\\x2d\\xe1\\x62\\xe2\\x52\\xec\\xa5\\xc5\\x0d\\x09\\x99\\x6b\\x70\\x22\\x75\\xa1\\xdc\\xcb\\x17\\xc5\\xdc\\x4f\\x67\\xcf\\xfb\\x23\\xc2\\x10\\xc5\\xa6\\xe3\\x2a\\x60\\x54\\x4f\\xa5\\x4e\\x23\\x58\\x3b\\xbb\\xfd\\x5f\\x54\\xab\\x2c\\x2d\\x2d\\x23\\x25\\xa4\\xa5\\xc8\\x8b\\x75\\x6c\\x89\\xf7\\xcb\\xe7\\xac\\x9c\\x8a\\x05\\xba\\x15\\x59\\xc0\\xdb\\x5a\\x2c\\x53\\xd7\\x46\\x3e\\xab\\x22\\x80\\xef\\x8a\\xcd\\xdb\\x63\\x93\\x58\\x74\\x8b\\x9a\\x1a\\x37\\x2f\\xe1\\xff\\xb3\\x2a\\x8c\\xb6\\x64\\x2b\\x20\\xf6\\x52\\xc2\\x4c\\x85\\xb3\\x55\\xa3\\xc2\\xd3\\x76\\x28\\xe6\\xff\\xdd\\xda\\x0d\\x56\\xa9\\x19\\x33\\xb2\\x0b\\x25\\xe3\\x28\\xac\\xad\\x62\\x2c\\x0e\\x53\\x9d\\x6d\\xfe\\xaa\\x39\\xc1\\xd6\\x05\\x27\\x26\\x88\\x65\\xf4\\x4d\\x91\\xae\\xae\\x8c\\xfe\\x9b\\x26\\x63\\xfb\\xb6\\xec\\x9c\\xb0\\xca\\xcc\\xbd\\x45\\xb5\\x74\\x3c\\x44\\x85\\x80\\x65\\xa4\\x16\\xcd\\x76\\xeb\\x5e\\x33\\x2c\\x49\\x2f\\x7c\\xd4\\xc2\\xe1\\xde\\x91\\x38\\x33\\x63\\xac\\x0d\\x59\\x1a\\x4b\\x06\\x8a\\x26\\x48\\xe5\\x7e\\x6c\\xac\\xbf\\xc0\\xf7\\x0e\\x7e\\x71\\xb5\\x85\\x6a\\x19\\xec\\x3f\\xe1\\x26\\xbf\\xff\\xf6\\xc6\\x06\\xfc\\x7f\\xeb\\x6c\\xa7\\x05\\xec\\x70\\x75\\xb1\\xc4\\x5e\\xda\\x0b\\x1a\\x8e\\x05\\x4e\\x61\\xb2\\x92\\x0d\\x7b\\xaf\\x70\\x96\\x9e\\x8a\\x04\\x63\\xd5\\xce\\x7c\\xc2\\x2d\\x4a\\x86\\x42\\x4a\\xec\\xa8\\x40\\xc6\\x0c\\x6e\\xb0\\x34\\xf9\\x32\\x59\\xd1\\x1c\\x89\\x03\\x61\\x91\\x2d\\x27\\x45\\x01\\x7e\\xb5\\x22\\x33\\xbd\\x0a\\x14\\x05\\xda\\x9b\\xa8\\x30\\x77\\x15\\x48\\xd8\\x52\\x20\\x1b\\x23\\x35\\x17\\x4d\\x7b\\xb8\\xc2\\xd0\\x58\\x1c\\x71\\x48\\xe4\\xa0\\x8c\\x93\\x4c\\x3e\\x76\\xf2\\xdf\\xae\\xe0\\xf4\\x68\\x55\\x5c\\xf1\\x8a\\x1e\\x91\\xc2\\x5e\\xe2\\x0d\\x85\\xf6\\xf0\\xce\\x0e\\xbf\\xe5\\xc5\\x1d\\x74\\x2c\\xbb\\x51\\x3f\\xb4\\xaa\\xc1\\x47\\xc4\\x0b\\x1c\\x0e\\x07\\x61\\x15\\xe4\\xde\\x27\\x87\\xb3\\xab\\x48\\x5b\\x31\\x8e\\x65\\xae\\xbd\\x10\\x20\\xcb\\x48\\xa9\\x58\\x85\\xb6\\x5e\\xeb\\x49\\xc2\\xbe\\x42\\x1b\\xf2\\x35\\x96\\xe2\\x4c\\x04\\x73\\xfa\\xef\\x13\\x5a\\x41\\x66\\x6c\\x86\\xb7\\x1d\\x19\\x14\\x15\\x65\\xa3\\x26\\xa4\\xfe\\x5b\\x61\\x2d\\x16\\x76\\xe6\\xb0\\x60\\xc9\\xa3\\xa7\\xca\\x4e\\x96\\xcf\\x38\\xaa\\xba\\xaf\\x28\\xd5\\xb3\\x95\\x3e\\xaf\\xab\\x2a\\xeb\\x55\\x6d\\x71\\x5f\\x57\\x30\\x53\\xb2\\xec\\x9a\\x54\\x51\\x49\\x87\\x0b\\x72\\xcf\\x03\\xec\\x6b\\x87\\xf4\\xe1\\x49\\x42\\x30\\xd8\\xbd\\x0f\\xfa\\x85\\xbd\\x9d\\x19\\x96\\xe1\\xec\\xe1\\x34\\xea\\xf5\\x59\\xee\\x97\\xf4\\x83\\x0b\\xaa\\xd8\\xca\\xde\\x5d\\xaf\\x3b\\x63\\x82\\x50\\xf9\\x01\\xb6\\xd7\\x40\\x40\\x57\\x61\\x17\\x69\\x49\\x05\\x88\\x24\\xc8\\x23\\x89\\x6d\\xa9\\x14\\xd1\\x9d\\x00\\x56\\x19\\x29\\x9a\\x57\\x23\\x86\\x87\\x69\\x57\\x24\\x0d\\x88\\x4d\\x21\\xca\\x5d\\xb2\\xd5\\xbe\\x08\\x63\\x54\\x84\\x83\\xf0\\x25\\xd1\\xc4\\x38\\x2c\\x8d\\xca\\x0b\\xb1\\xe9\\xa2\\x6e\\x9d\\x42\\xd1\\x35\\x8b\\xab\\x35\\x8b\\x29\\x1f\\x94\\xba\\x23\\x46\\x09\\x2c\\x8a\\x01\\xe7\\xd5\\x0a\\xb0\\x1c\\x6c\\x5a\\x3b\\xf2\\x62\\xdb\\xd3\\x0f\\x81\\x07\\x76\\x66\\xbd\\xb7\\x6c\\x82\\x8e\\x0a\\x0f\\x0a\\xaf\\x74\\x24\\x03\\xa4\\xa8\\xb4\\x01\\x7e\\x06\\x8a\\x79\\x2c\\x51\\x95\\x89\\xca\\x0f\\xab\\x0a\\x53\\xd5\\x36\\x57\\x52\\x42\\xcc\\x17\\x47\\xa3\\x68\\x52\\x0b\\xd6\\xd7\\x32\\xec\\x7b\\x89\\x96\\xb9\\xd6\\xcf\\xa0\\xc2\\xf9\\xce\\x88\\x42\\xf7\\x1c\\xfc\\x02\\x45\\xda\\x13\\x01\\xa5\\x1f\\x3d\\xd2\\xe5\\x37\\x49\\x58\\xad\\x9a\\x89\\x2d\\x6a\\x46\\x89\\x2f\\x8b\\x4c\\xa8\\xed\\x88\\xbe\\xa5\\xb9\\x01\\x05\\x19\\x80\\xf7\\xcb\\x72\\x6a\\xc9\\xdc\\xd4\\x48\\x2d\\xb4\\x9c\\x75\\x88\\x21\\x3c\\x4a\\x77\\xa9\\x41\\x30\\x0a\\x8e\\xea\\x8b\\x29\\xd4\\xcb\\x73\\x61\\x72\\xb9\\xa7\\x28\\xa2\\x1e\\x4c\\x78\\xb8\\xd4\\x4e\\x54\\x0b\\xae\\xe7\\x28\\xc2\\x27\\x16\\xae\\x12\\x2f\\xd1\\xa3\\xb5\\x45\\xd3\\x25\\xc0\\xdb\\xff\\x44\\x96\\x75\\x69\\x2d\\xaf\\xf2\\x2e\\xf7\\xdd\\x4d\\x4b\\xc5\\x33\\xd9\\xaa\\x50\\xa0\\x7b\\x9f\\xd6\\x05\\xeb\\x62\\x8f\\xb3\\xc9\\x3e\\x3d\\x27\\x0f\\x02\\x73\\x23\\xcb\\x20\\xd9\\xce\\x89\\x31\\xc7\\xc1\\x47\\x9c\\x7e\\xa2\\xba\\x13\\xe2\\x7d\\x4e\\x0b\\x8a\\x80\\xa5\\x9d\\x3d\\xec\\xff\\xc4\\xad\\x7b\\xf4\\xf0\\x20\\xc5\\xf8\\x10\\xff\\x95\\x74\\xf0\\x87\\xad\\xac\\x39\\x1d\\xeb\\xaa\\xb8\\x5e\\xdc\\xe7\\xad\\xc7\\x0e\\x15\\x4a\\xeb\\xbe\\xfa\\xd2\\xf6\\xae\\xfa\\x98\\x5c\\x6e\\x75\\x2e\\xcb\\x21\\x09\\x7d\\x38\\x2e\\x9a\\xcb\\x7a\\x51\\x96\\x32\\x6c\\x4d\\xe9\\x95\\x54\\x88\\x92\\x53\\x08\\x9a\\x2d\\xb2\\x14\\xbb\\x5d\\xef\\x73\\x75\\x20\\xc9\\xc0\\xdd\\x3b\\xec\\xf5\\x5d\\xce\\xbd\\x80\\x5f\\x46\\x14\\x83\\xc1\\x38\\x92\\xaa\\xf9\\xb8\\xf6\\xd9\\xd0\\xb2\\x48\\x5d\\x4b\\x6a\\x25\\x90\\x91\\x1c\\xe6\\x3f\\x62\\xc1\\x97\\x62\\x03\\x6a\\x43\\x21\\xf7\\xb1\\x8b\\xed\\x60\\x46\\xfd\\xe4\\x4b\\xea\\x4e\\x51\\xd0\\x7d\\x43\\x78\\xd6\\x2a\\x34\\x71\\xa9\\xfd\\x34\\xfc\\xc8\\xaa\\xce\\x72\\xbb\\xf2\\x6b\\x1e\\x78\\xef\\xe0\\x28\\xc2\\x8f\\xa3\\x43\\xc9\\x13\\xe5\\xc0\\xa9\\xa7\\x23\\x53\\x18\\x73\\xeb\\xaa\\x1d\\xa6\\x7d\\x9b\\xf0\\xf7\\x9c\\xaf\\x6a\\x72\\x8a\\xf4\\xd4\\x92\\xc9\\xeb\\x34\\x7d\\xc3\\xa1\\x49\\x66\\x3b\\x72\\x5f\\x16\\xf7\\x1c\\xe4\\x82\\x20\\x0d\\x82\\x5d\\x1e\\x94\\x39\\x4c\\xc3\\x44\\x71\\xad\\x1f\\x35\\x06\\x93\\x48\\x2f\\x8c\\x80\\x83\\x82\\x48\\x9c\\x85\\x7c\\xc4\\x98\\x91\\xe7\\xd9\\x83\\xab\\xda\\xb3\\x25\\x58\\x74\\xeb\\xd5\\xd2\\x53\\x9b\\x03\\x40\\x49\\xac\\xd0\\xcf\\x8a\\x17\\x72\\x09\\x97\\xe7\\xdc\\xc8\\xa5\\x7e\\x9c\\x24\\xa8\\xcd\\xb7\\x9c\\x80\\xb5\\x75\\x42\\x65\\xc6\\x11\\x20\\xb8\\xa0\\x58\\x1d\\xd7\\xa9\\x18\\x8a\\x29\\xec\\xd8\\xc0\\x2e\\x66\\x19\\x83\\x79\\x11\\x8d\\x30\\xcc\\x31\\x4b\\x96\\x62\\xc1\\x25\\x2d\\x8e\\x9c\\x51\\xa1\\x22\\x21\\xab\\xb8\\xd7\\x8a\\x99\\x50\\x59\\xc9\\xa1\\xca\\x85\\x47\\xc1\\x8b\\xe6\\x96\\xe0\\x55\\x6e\\x13\\x4a\\x15\\x60\\x89\\xb7\\x89\\xb5\\xae\\x8f\\x9a\\xf3\\x82\\xdf\\x0a\\x6a\\x1e\\x29\\x2c\\x09\\x56\\xf0\\x56\\x1f\\x94\\x70\\x2e\\xcf\\x73\\xdc\\x7c\\xb7\\xf9\\xa9\\x55\\xc5\\x63\\xca\\x4b\\x99\\xb6\\xaa\\xc0\\x0b\\x45\\x04\\x09\\xc9\\xb9\\x2e\\x09\\x4d\\x29\\x88\\x63\\xca\\x23\\x23\\x97\\x21\\x05\\xb6\\xc3\\xb5\\xfa\\xda\\x27\\x81\\x6b\\x58\\x90\\x00\\x62\\x1e\\xc9\\xa4\\xd2\\x34\\x85\\xa5\\xc8\\xd4\\xe8\\x19\\x85\\xb2\\xbc\\x75\\x83\\xf2\\x1a\\xda\\xaf\\x5c\\x9e\\xab\\x0d\\x6e\\x9f\\xf3\\x38\\x38\\x66\\x19\\x3f\\x31\\x96\\x29\\x76\\x93\\xb3\\xf2\\xc8\\xe0\\x8b\\x48\\x05\\xd8\\x41\\xe9\\x32\\xa2\\x32\\x85\\x1d\\x60\\xc4\\x3f\\xe3\\xe4\\xed\\x3d\\xac\\xd2\\x6c\\x69\\xf3\\xbd\\x03\\x5a\\x42\\x8c\\x3e\\xc6\\x78\\x79\\x1e\\x45\\x41\\x4f\\x9b\\x89\\xda\\x12\\x2d\\x8f\\xa8\\xab\\x33\\x71\\xb2\\x03\\x46\\xaa\\xea\\x83\\x63\\xa4\\x3e\\xf8\\xd2\\x26\\x2b\\x28\\xc5\\x5c\\xf7\\x60\\x21\\xe6\\x9e\\xe6\\x65\\x45\\xb8\\x7a\\xa8\\x12\\x7b\\x6c\\xbe\\xf0\\x16\\xf7\\x1e\\xe8\\xb2\\x9c\\xf6\\xb6\\x2a\\x47\\xb3\\x4a\\x73\\x33\\x14\\x8a\\xb3\\xbf\\x96\\xa9\\x37\\x1c\\x9b\\x39\\x71\\xb3\\x8b\\x32\\xa9\\x79\\x12\\x69\\x47\\x31\\x23\\x95\\x65\\x44\\x20\\x82\\x9c\\xaf\\x51\\xc7\\x02\\x8e\\x64\\xfc\\xac\\x5a\\x62\\x56\\xb0\\xc4\\xac\\xb8\\xa4\\x6e\\xd8\\xac\\xb6\\x8c\\x35\\xa5\\x82\\x47\\xd7\\xa9\\xa0\\xed\\x8f\\x47\\x71\\x70\\x8d\\x0d\\x11\\x05\\x57\\xed\\xfc\\x41\\x98\\x6c\\x49\\x72\\xd8\\x91\\xb4\\x19\\xa7\\xfd\\xb3\\x85\\xca\\x55\\x8a\\xd5\\xea\\xe4\\x0a\\xaa\\x5b\\xd6\\x30\\x97\\x85\\xf2\\x0b\\x72\\x03\\xd9\\x91\\x6a\\x66\\x97\\x47\\x9f\\x5d\\xab\\xce\\x38\\x3e\\xcb\\xc4\\x38\\xf7\\x90\\xd3\\x72\\xd6\\x57\\x79\\xab\\xd0\\x54\\x80\\xb4\\xd2\\xec\\x85\\x22\\xd2\\xda\\x82\\xcb\\x2a\\xcb\\x26\\x15\\x91\\x08\\x8a\\x95\\x38\\xfa\\x6a\\xa5\\xcd\\xc5\\x45\\x35\\x62\\x5d\\x0a\\xa3\\x47\\xc6\\x99\\x1a\\x1f\\x56\\xb7\\xa5\\xee\\xab\\xef\\xc8\\x41\\xa2\\x59\\x8d\\x2e\\x13\\x2a\\xac\\x50\\x2e\\x28\\x1d\\x23\\xae\\x31\\x3e\\x14\\x93\\xe3\\x06\\xce\\xad\\x28\\x94\\x3a\\xa2\\x88\\x9a\\x95\\x9b\\x94\\x60\\x95\\x9a\\x73\\x9a\\x09\\xe9\\xbb\\x52\\xaf\\xca\\xef\\xe6\\x05\\x4c\\x58\\xd9\\x9a\\x72\\x84\\x09\\x1f\\xaf\\x96\\x3f\\xe7\\x83\\x18\\x44\\x99\\xa9\\x0d\\xca\\x70\\x52\\xdb\\x8e\\xa2\\x12\\x1f\\x52\\xf3\\x5b\\x1b\\xfa\\x83\\x6a\\xbf\\x58\\x95\\xa2\\xf9\\x36\\xed\\x37\\x07\\xb4\\xae\\xe2\\x41\\xb2\\x27\\x88\\xe2\\xb2\\x94\\x99\\x72\\xda\\x55\\xb1\\x02\\x7d\\x1d\\xe1\\x67\\xde\\xf9\\x2c\\x47\\x94\\xf0\\xba\\x68\\xfb\\xdd\\x2a\\x37\\x6a\\x5f\\xeb\\x72\\x1c\\xef\\x83\\xe0\\xca\\x07\\x82\\x4b\\x75\\xc8\\x5e\\xf2\\x74\\xed\\x8c\\xea\\x04\\x2b\\xe1\\x15\\xbb\\x55\\xd0\\x8f\\x83\\xfb\\x48\\x86\\xbf\\x11\\xe4\\xbf\\x2e\\xc4\\x2c\\xe3\\x68\\x2f\\xc6\\x1e\\xa6\\xcb\\xf3\\x14\\xa2\\xd3\\xc1\\xcf\\x35\\x85\\x1d\\xd7\\x30\\x52\\x42\\x9e\\xbf\\x15\\x72\\x44\\x84\\xa8\\xf6\\x62\\x45\\xbd\\x18\\x21\\x02\\x4e\\x56\\x40\\x6b\\xf2\\x4d\\xd1\\x7f\\x1d\\x61\\xff\\x65\\xd7\\x16\\x61\\xd7\\xcf\\x3a\\x71\\x9d\\x7d\\x02\\x0e\\x88\\xe4\\x2c\\x2c\\x8d\\xa0\\x88\\x95\\xb0\\xb2\\x33\\xd7\\xf0\\xe0\\xc8\\xe8\\x5b\\xbf\\x5a\\xc0\\x9c\\x62\\x9e\\x51\\x55\\x77\\x4e\\xca\\x48\\x05\\x5f\\xb4\\x7c\\xb2\\xa9\\xeb\\x61\\x94\\x15\\x49\\x6d\\xf6\\x22\\xd5\\x3c\\xc4\\xe7\\x19\\x41\\x49\\x1c\\xc1\\x1c\\x95\\x1d\\x5d\\x6f\\xa9\\xd0\\x02\\x32\\xa7\\x5a\\xa1\\x70\\x55\\xac\\xd2\\x96\\x92\\x5f\\x00\\x32\\xa5\\x17\\x6c\\xc0\\x21\\xc5\\xd9\\xf3\\x96\\x7f\\x5b\\xa9\\xe7\\xd9\\x8a\\xe3\\xf6\\xe9\\x0e\\x48\\xbb\\x43\\xb1\\xfa\\xbc\\x2b\\x4c\\x3d\\xbc\\x50\\xb6\\x02\\x60\\x3f\\xf9\\xf1\\x77\\x8f\\x57\\x37\\x01\\x94\\x2c\\x57\\xee\\x16\\x62\\x9c\\x82\\x53\\x4b\\x73\\x31\\xf5\\x27\\xaa\\x84\\xb2\\xc3\\x4b\\x46\\x93\\xd5\\xbb\\x43\\x24\\xb5\\xdb\\x30\\xb5\\xdb\\x38\\x48\\x4d\\x2c\\x11\\xfa\\xcf\\x76\\xbe\\x97\\x27\\x18\\xbd\\x79\\x21\\x8d\\xba\\x9c\\x19\\xa4\\x06\\x4c\\xb4\\xe5\\xe5\\x39\\x4a\\x89\\xd8\\xb7\\x7d\\x4a\\xce\\xa4\\x6f\\xa3\\xc9\\x24\\xa1\\xe4\\x11\\x44\\x82\\x28\\x95\\xe4\\x09\\xfe\\xd9\\x46\\x2a\\xa5\\x5d\\xc3\\x97\\x6a\\x41\\xb4\\x04\\x99\\x4c\\x61\\x11\\xa0\\xd2\\xcf\\xef\\xa1\\xaf\\x4d\\x07\\xa0\\x2e\\xca\\xfa\\x4a\\x8b\\xb0\\x1c\\x7d\\x6f\\xcd\\x95\\x60\\x15\\x1e\\xa5\\xd2\\x1c\\x89\\x76\\x48\\x70\\xd0\\x07\\x81\\x53\\x50\\xd9\\x1f\\x4f\\x91\\x04\\x51\\x8e\\x19\\x0f\\x52\\xe9\\x12\\xd5\\x76\\x22\\x4c\\x0b\\xc8\\x1f\\x18\\x24\\x55\\x8e\\x8c\\x64\\xe5\\x96\\xa9\\xcb\\xd5\\x08\\x38\\x3f\\xcc\\x6a\\x04\\x67\\xa7\\x83\\xaa\\x8e\\x72\\x9b\\x98\\x93\\x2b\\x01\\xc5\\x87\\x55\\x01\\x91\\xf3\\x39\\x4e\\xc8\\xc0\\x44\\xd2\\x92\\x5d\\x1f\\x60\\xbb\\x84\\x0a\\x3a\\xbd\\xd0\\x3d\\x4a\\xf9\\x26\\x84\\x27\\x12\\x14\\xf5\\x4e\\x32\\xe1\\x98\\xcf\\xce\\xa7\\xc6\\x33\\x49\\x18\\x04\\xa5\\x67\\x58\\xd1\\x76\\x06\\xae\\x6c\\xc8\\xcc\\x63\\x1c\\x70\\x1c\\x03\\x0c\\x0d\\x18\\xb9\\x8a\\x55\\xac\\xfc\\x15\\x5d\\xd3\\xa4\\x6a\\x06\\xda\\xfa\\x23\\x7e\\xb1\\x75\\xf8\\x4e\\x27\\xbe\\xf2\\x9c\\xd4\\xb2\\x3f\\xf4\\xc8\\xae\\x56\\x1e\\xc8\\xe5\\x1d\\x65\\xa0\\x65\\x85\\xed\\x46\\x85\\xe6\\x17\\xb1\\x12\\x41\\x0a\\x29\\xac\\x2e\\x37\\x45\\x70\\xd7\\x14\\xd9\\x28\\x37\\x38\\x08\\x11\\x44\\x92\\xc3\\x55\\x82\\x16\\x57\\xe3\\x40\\x9e\\x89\\xf3\\x4e\\xed\\x58\\x8c\\xbe\\x2d\\xef\\x26\\x9c\\xa3\\xef\\xd5\\x88\\x90\\x0c\\x85\\xbc\\x73\\xb5\\x6d\\x83\\x55\\xb7\\xc4\\x81\\xc8\\x60\\x39\\x4e\\xaa\\x71\\x27\\xb8\\x21\\x75\\x13\\x74\\xba\\xdc\\x0b\\x77\\x66\\x05\\x6b\\xdd\\x4e\\xb8\\xaa\\xb9\\x8e\\xb2\\xea\\x66\\x3d\\xb1\\xaa\\x6d\\x58\\x13\\x35\\x2e\\x76\\x7e\\x67\\x05\\x2f\\x3d\\xf1\\x36\\x58\\x4a\\x00\\x66\\x8d\\xa2\\xf2\\xb0\\x04\\xac\\x28\\x5b\\xa1\\x69\\x29\\x92\\xdd\\xab\\xba\\x99\\x13\\xa7\\xc8\\x84\\x04\\x61\\x9f\\xd5\\x44\\x67\\x8b\\xab\\x41\\x38\\xa7\\x3a\\xd9\\x49\\xb6\\xcd\\x3c\\x47\\xdd\\x94\\x95\\x6b\\x26\\xef\\xab\\xfb\\x22\\xdb\\x9a\\xac\\x00\\x3b\\x67\\x3b\\xae\\xa0\\x84\\x34\\xa8\\x21\\xac\\xc2\\x59\\x31\\xc6\\x11\\x57\\xd9\\x63\\x35\\xfd\\x2d\\x63\\xea\\x8d\\x9c\\x8f\\x96\\x67\\x9f\\x23\\x8f\\xa8\\xd2\\x52\\x5d\\xb2\\xcc\\x01\\x8b\\x2d\\x9a\\xa9\\x98\\xe3\\xde\\xd7\\x97\\x96\\xc4\\x01\\x36\\x61\\x3d\\xd7\\x50\\x56\\x21\\xc7\\xa6\\x6b\\x34\\xa2\\xf2\\x39\\xa0\\xb7\\x29\\x4d\\x64\\x14\\xc4\\x0e\\x7c\\x46\\x6f\\xee\\x8b\\x9e\\x7a\\xdf\\x91\\xa8\\x2e\\x13\\x59\\x66\\x3a\\xbc\\x07\\x1b\\xa7\\x5c\\x74\\x32\\xeb\\xc2\\xfb\\x21\\x5c\\x85\\x62\\x1a\\xac\\x67\\xd5\\xc2\\x76\\x2e\\x51\\x20\\x99\\x04\\xf9\\x4f\\x70\\x96\\xee\\xb8\\xd2\\x1b\\xa7\\xda\\x39\\xec\\x7c\\x8d\\x6a\\x3b\\x8a\\x65\\x77\\xa3\\xa9\\xe1\\xe7\\xa5\\x8f\\xcd\\x22\\xee\\x3a\\xa0\\x95\\x0f\\x21\\xc5\\x70\\x55\\xb5\\x2d\\x73\\x9c\\x99\\xfa\\xd5\\x37\\x4c\\x37\\xdc\\x7c\\xf3\\x46\\x67\\x2b\\x1b\\x2f\\xed\\xab\\xef\\xa8\\xc1\\x28\\x9c\\x17\\xbe\\xcb\\x66\\x56\\xc6\\x88\\xfa\\x09\\xca\\x35\\x55\\x47\\xef\\x72\\xb1\\xdb\\x7b\\x38\\x0f\\x82\\x64\\xb4\\x9d\\xf9\\xcf\\xd8\\x79\\x53\\x9e\\x38\\xcd\\x1a\\x70\\x5d\\x00\\xd2\\x0e\\xc9\\x52\\x77\\xa0\\xee\\x91\\x8e\\xa1\\x94\\xcc\\xd9\\xf9\\x74\\x84\\xa4\\xd6\\x57\\xe2\\x2c\\x87\\x78\\x1b\\xdc\\x54\\x61\\x26\\x89\\x83\\x04\\x72\\x2c\\xb3\\xaf\\x98\\x77\\x89\\x73\\xc6\\x09\\x29\\x3e\\xd2\\xf1\\xda\\xe6\\xd8\\x97\\xed\\x62\\x38\\x1d\\xd3\\x72\\xd7\\x51\\xac\\x30\\xcc\\xe0\\x04\\xe0\\x44\\xf0\\xc5\\xed\\xef\\x47\\xe0\\x7e\\xf4\\x05\\xc7\\x1d\\x2d\\xd9\\xce\\x7e\\xa6\\x78\\xc2\\xde\\xf5\\x17\\x93\\x39\\xce\\x4d\\x6f\\x8d\\xde\\x3a\\xe8\\xc5\\x45\\x4c\\xe3\\xd9\\xad\\x29\\xda\\xf6\\x12\\x26\\x80\\x0e\\x02\\x02\\xbf\\x3a\\x64\\x3c\\x20\\xe3\\x16\\x3e\\x40\\x9c\\x81\\xc1\\x91\\x6a\\x8b\\xbf\\x25\\x99\\xac\\x10\\x65\\x5c\\x6e\\x68\\x52\\xa1\\xa3\\x86\\x9b\\xf4\\xca\\xbd\\xcd\\xa5\\x25\\x11\\xca\\x60\\xd3\\x72\\x6f\\x40\\xe9\\x43\\xde\\xa8\\x72\\xad\\x4b\\xb5\\x6d\\x1f\\xa8\\x51\\x46\\x89\\x81\\xeb\\xa5\\x75\\xa4\\x2f\\xcd\\x60\\xbf\\x42\\x5d\\x2f\\x28\\x1e\\xd1\\x06\\xbf\\xfc\\x6b\\x31\\x15\\x52\\xbe\\xdb\\x2f\\x37\\x47\\xb9\\x36\\x1a\\xd2\\x72\\x48\\x51\\x0d\\x2c\\x42\\x9d\\x95\\xa3\\xb4\\x72\\x2e\\x38\\x73\\x99\\x8e\\xdf\\x4c\\x52\\x2a\\xaa\\xbb\\x0e\\x91\\xd9\\xa5\\x58\\x76\\x54\\x64\\xf6\\x89\\xda\\x0e\\x11\\x07\\xa8\\x5b\\x7b\\x4a\\x6c\\xd5\\x38\\xf0\\x10\\xa9\\x5c\\x9e\\xb7\\x5c\\x1c\\x57\\xde\\x71\\x94\\x59\\x28\\x2c\\x65\\x8c\\xc5\\x6d\\x26\\xd1\\xe9\\xc4\\x56\\x66\\x0b\\xed\\x73\\x53\\x4e\\x9e\\x58\\xe2\\xb7\\x4f\\xac\\x49\\x70\\xa9\\xc8\\x7b\\x0d\\x46\\xdc\\xdd\\xd1\\xc8\\xda\\x62\\x2b\\xf5\\x20\\x2a\\x59\\xab\\xfc\\x00\\x47\\xbe\\x37\\x38\\x72\\x9e\\xf8\\x14\\x0a\\x2c\\xf1\\xae\\xac\\x45\\x94\\xf2\\x1d\\x78\\x6b\\x65\\x88\\x51\\xa0\\x83\\xea\\x8d\\x76\\xf9\\x88\\x4e\\x0b\\xb5\\xbe\\xcd\\x74\\x2a\\x0e\\x55\\x3f\\xc6\\x24\\x2e\\x89\\xcb\\xc8\\x64\\xa4\\xae\\x01\\x9b\\x9a\\xea\\x88\\x43\\xc1\\x98\\xf5\\x28\\x12\\x82\\xe3\\x5e\\x3d\\xe2\\x6e\\x39\\x0f\\x38\\x4b\\xb8\\x77\\x0a\\xf6\\xc7\\x64\\xde\\xb8\\x90\\x1d\\xfc\\xc3\\x59\\x26\\x24\\x66\\xa6\\x32\\x22\\x4c\\x6d\\xc7\\x35\\x51\\x75\\x30\\x9b\\xac\\x4f\\x28\\x8d\\xd6\\xa3\\xa0\\x08\\x26\\xd1\\x3e\\x36\\xcd\\x09\\xc1\\x9c\\x5e\\x49\\xf3\\x2a\\xb5\\x33\\xe4\\x25\\x0f\\x16\\x25\\xa7\\x97\\xb2\\xf3\\x97\\xe7\\x31\\x92\\xab\\x25\\xce\\x1c\\x9a\\x5b\\xea\\x5e\\xb6\\x23\\x65\\x2f\\x7f\\xf2\\xe3\\xef\\x9e\\xac\\x0c\\xcf\\x7b\\xab\\x24\\x28\\x2a\\x7e\\x2a\\x87\\x8d\\x63\\xb3\\xb7\\xab\\x34\\xa8\\x43\\x5d\\x9b\\x83\\xdf\\x77\\xd1\\xc3\\xf3\\x4c\\x48\\xf7\\xce\\x77\\xc6\\xd3\\x4f\\xd6\\x01\\xfd\\x7b\\x5b\\x5f\\x55\\xbf\\x39\\xd0\\xcc\\x79\\xe0\\x98\\x1d\\x4b\\xd9\\x11\\x87\\x01\\xb5\\x1a\\x58\\x14\\x42\\xa6\\x7e\\x0e\\x90\\x62\\x71\\xf0\\xe2\\x81\\xa8\\x29\\x56\\xfd\\x7b\\xb8\\xc3\\x16\\xac\\x03\\xe9\\xf7\\x36\\x1b\\xd2\\xd9\\x30\\x0e\\x79\\x8a\\x4b\\x6d\\x09\\xa2\\x25\\x3b\\x65\\x36\\x42\\x82\\x22\\x0c\\x1b\\xcb\\x84\\x5a\\x20\\xb1\\x8c\\xc8\\x37\\x2e\\x64\\xbe\\x1d\\x09\\xd0\\x3a\\x83\\x9d\\xc4\\xe4\\x25\\x50\\xd5\\x4f\\x45\\xa7\\xb6\\x94\\x97\\xf0\\x39\\x8d\\xbe\\xd0\\x72\\xb0\\x21\\xe6\\x05\\x53\\x45\\x0b\\xc6\\x00\\xda\\xc3\\xd7\\x64\\xd9\\xe0\\xcd\\xdc\\xe2\\xdb\\xab\\xb5\\x89\\xba\\x9e\\xac\\x63\\xe8\\xf7\\xb7\\x5c\\xba\\x42\\x21\\xdd\\x14\\xc4\\xd9\\xa4\\xe6\\x52\\x37\\x7f\\xb4\\x39\\x85\\x75\\x28\\xf8\\x7b\\x67\\xba\\x98\\x8a\\xa3\\x22\\xd1\\x20\\xb0\\x9d\\x17\\x8e\\x34\\x11\\xf2\\x74\\x52\\x19\\xab\\xdd\\x51\\xb0\\x5c\\x9e\\x85\\xdc\\xa2\\xd8\\xbd\\x92\\x35\\xef\\x77\\x3c\\x86\\xe5\\xc8\\xa9\\x4f\\x71\\xf4\\xd5\\x30\\x87\\x75\\x12\\x27\\xdf\\xfb\\x0d\\x97\\xe7\\x29\\x87\\xe5\\x7b\\xba\\xfb\\xd2\\x43\\x75\\x13\\x72\\xf2\\x55\\x4b\\xe0\\xa8\\x6a\\x61\\xa0\\x05\\x07\\x3a\\x8b\\x76\\x5e\\xc1\\x95\\x8c\\xe8\\xa2\\xd0\\x9e\\x6e\\x50\\x37\\x70\\xf2\\xe8\\xe4\\x08\\x23\\xad\\x2d\\xd3\\xb6\\xe4\\xf9\\x78\\xac\\x6b\\xad\\x3d\\xd0\\xde\\xae\\xca\\x38\\x36\\x1a\\x18\\xb8\\x26\\xef\\x92\\xb9\\xb8\\xd3\\xce\\xa7\\x1a\\x07\\x86\\xc1\\x96\\x77\\x25\\xec\\x73\\x13\\x5b\\x52\\xf4\\xe6\\x24\\x29\\x5a\\x4b\\x65\\xb0\\x72\\xf8\\xf8\\x27\\x63\\xd2\\x9c\\x70\\x1f\\x40\\x44\\x4a\\x29\\xb9\\xa2\\x3b\\x94\\xdc\\xb6\\x9e\\x7d\\x72\\x43\\xfc\\xfb\\xd6\\xb5\\x49\\xa7\\xa5\\x2a\\x29\\xce\\x67\\x30\\x2e\\xad\\x3a\\xc8\\x9b\\xf9\\x5b\\x17\\x23\\x1d\\x23\\x42\\x42\\x4b\\x21\\xd2\\x28\\xd3\\xbe\\xfc\\xe8\\xf1\\xea\\xa3\\xe7\\xa9\\x92\\x15\\x11\\x7c\\x2f\\x4c\\xec\\x27\\xeb\\x70\\xef\\x7d\\x15\\x09\\x45\\x19\\x86\\x23\\x6a\\x7c\\x73\\x48\\xeb\\xb0\\xf0\\xbd\\x0d\\x29\\xe1\\xfa\\xc3\\x77\\xd1\\xca\\x2b\\xcf\\xc1\\x3d\\xae\\x97\\xa2\\xe4\\x77\\x52\\xcb\\x9b\\xa3\\x5e\\x19\\xf1\\xf7\\x37\\x6a\\x56\\x2b\\x74\\x43\\x9f\\x94\\xb4\\xf9\\x6e\\x73\\xa8\\x2b\\x4b\\x7e\\x5f\\x42\\x14\\xa9\\x2f\\x47\\x60\\xe1\\x2d\\x4b\\x8c\\xea\\xc7\\xd6\\x41\\xc1\\xb7\\xd7\\x2b\\x3d\\x57\\x81\\xf1\\x6e\\x44\\xb4\\xb2\\x46\\xaf\\xe6\\x68\\x87\\xcd\\xdf\\x05\\x9a\\xdd\\x61\\x19\\x56\\x86\\xd0\\xd5\\x78\\x92\\x6c\\xee\\xee\\x91\\x25\\x42\\x16\\xc4\\xed\\x36\\xfe\\xe9\\x0d\\xf6\\xc4\\x32\\x8a\\xc8\\xaa\\xe2\\x2d\\xd5\\x32\\x57\\x1c\\x64\\xb9\\xaf\\x5a\\xcc\\x33\\xb0\\x03\\x65\\x1d\\x74\\xb8\\xbf\\xa2\\xcc\\xb1\\xca\\x8e\\x4b\\xee\\xbc\\x83\\xa7\\x14\\x8e\\x4c\\x7e\\x6d\\xa1\\x7c\\x2f\\x05\\x4a\\xcf\\xa5\\xd2\\x7b\\x0e\\x96\\x37\\x97\\xe8\\x06\\x7b\\xe8\\x87\\x42\\xaa\\xeb\\x6a\\x98\\xe7\\x52\\x54\\xed\\xc6\\x5b\\x15\\x9d\\xd2\\xf5\\xbd\\xc1\\x42\\xfb\\x61\\x7d\\x6f\\x58\\x5f\\xbb\\x53\\xb3\\x94\\x3b\\x8b\\xff\\xa7\\x37\\x18\\x77\\x3f\\xac\\xf4\\x4d\\x94\\xdc\\x14\\x10\\x31\\xdf\\x3f\\x20\\x7a\\x7a\\x83\\x71\\xfa\\xc3\\x16\\xdc\\xb4\\x05\\x49\\xf5\\x05\\x8e\\x11\\xfc\\xa3\\xe9\\x8b\\xb5\\xa1\\xfc\\xc3\\x16\\xdf\\xbc\\xc5\\x0a\\xd2\\xf9\\xc6\\xac\\xde\\xca\\x9b\\xef\\x36\\xd7\\x7d\\x6d\\xed\\x87\\x65\\xdd\\x6b\\x75\\x92\\x68\\x10\\x2e\\x4e\\x24\\x0e\\x7e\\x79\\xc0\\x6d\\x4e\\xb0\\x73\\x71\\x77\\x8d\\xf4\\x16\\x82\\x17\\x1e\\x48\\x46\\x18\\x26\\x7a\\x1c\\xf6\\x0f\\xfe\\xf0\\xa5\\x36\\xe7\\xc1\\xf7\\x0e\\xb6\\x7d\\x11\\x4f\\xd7\\xf6\\xee\\x2d\\xa9\\xa2\\xc5\\xfd\\x6d\\x42\\x1e\\x67\\xfe\\xec\\xd6\\x39\\x04\\x4d\\x86\\x8a\\xf2\\x61\\x3b\\x8a\\xfd\\x4a\\x6c\\x94\\x14\\x2c\\x05\\xe9\\xb2\\x76\\xcf\\xab\\xc2\\xb0\\x7e\\x54\\x92\\x23\\x9f\\x46\\x43\\xbd\\x90\\x04\\xfc\\x4e\\xdc\\x8b\\x7e\\xb5\\x7e\\x28\\x6a\\xc0\\x85\\xf4\\x56\\x5e\\xb4\\x1f\\x88\\x61\\x89\\xa3\\x7e\\x10\\xb1\\x1e\\xbb\\x00\\x3f\\x70\\x3f\\xf4\\xc3\\x29\\xef\\xc9\\x0e\\x21\\xa0\\x9a\\x5c\\x2f\\x8f\\x30\\xa5\\xd8\\x2f\\x8d\\x76\\x9e\\x86\\x14\\xa3\\x6b\\x94\\x71\\x42\\x27\\x1a\\xe2\\x74\\xa8\\x2a\\x2e\\xd1\\x31\\x9f\\x54\\x97\\xfb\\x3c\\x16\\xfd\\x74\\x1d\\xcd\\x45\\x82\\x02\\x1b\\x09\\xb7\\x97\\xea\\xbc\\x4e\\xa2\\x6b\\x9c\\x3c\\xb0\\x4b\\xfd\\x74\\x06\\x56\\xc2\\xa0\\x20\\xbc\\xb3\\xbd\\xc5\\x6b\\xff\\xc1\\xfb\\x5f\\xb3\\xf8\\x1c\\x87\\x18\\x6e\\xef\\x2c\\x79\\xba\\xf6\\x47\\xfc\\x03\\x4c\\x36\\xc3\\xd2\\x7a\\x07\\x0b\\xfa\\xe9\\xda\\xa1\\xf1\\x0f\\x30\\x6d\\x69\\xf4\\x3d\\x39\\x78\\x9e\\xae\\xf3\\x1f\\xfe\\x11\\xd6\\xe3\\x88\\x73\\xa1\\xf2\\xe6\\xbb\\xcd\\x45\\x58\\xe7\\x4a\\xbc\\x7b\\x6d\\xe8\\xf3\\x24\\x49\\x69\\x35\\xdd\\x9d\\x56\\xd7\\xb9\\x07\\xbc\\x4f\\xb7\\xca\\xf2\\xc6\\x95\\x2b\\xdc\\x64\\xc7\\xb9\\x8d\\x2c\\xbc\\xbf\\xcf\\x82\\xaa\\xa5\\xfd\\x48\\xb0\\x6d\\x43\\xe4\\xbd\\xff\\xe1\\xe0\\x3e\\x0b\\x54\\xf2\\xe7\\xdc\\x66\\x2f\\x24\\x8b\\xb5\\x9f\\x83\\x8b\\xb9\\xa0\\x4b\\x2b\\x69\\x6f\\x57\\x56\\x94\\xba\\x5c\\x0f\\x60\\x25\\x7e\\xe3\\x72\\xc4\\xa8\\x59\\x99\\x57\\x6b\\xd4\\xf6\\x3d\\xa6\\x78\\x44\\xa3\\xae\\xa3\\xe8\\xbc\\x3f\\x30\\x24\\xa5\\xd7\\xe1\\x51\\x85\\xaa\\x3b\\x8a\\xe4\\x00\\x89\\x75\\x92\\x60\\x72\\x5f\\xe9\\x0d\\x45\\xa9\\x74\\x16\\x35\\x4f\\x14\\x48\\x49\\xd2\\xce\\x50\\x1d\\x14\\x45\\x51\\x05\\x93\\xfb\\x09\\x4b\\xac\\x43\\xe5\\x5e\\xa6\\xc4\\x33\\xc7\\x69\\x79\\xac\\x57\\x65\\xeb\\x7a\\xed\\x2e\\x4e\\x3c\\x79\\xb6\\x03\\xec\\x35\\x41\\x31\\xda\\xb1\\xb2\\x2b\\x65\\x8a\\x22\\x9f\\x38\\xd7\\x1c\\xa3\\xea\\xfc\\x11\\x05\\x73\\xea\\xde\\xb9\\x0e\\xa0\\xc1\\x71\\xb4\\x23\\xf3\\xb8\\x56\\xaa\\xa0\\xee\\x82\\x1d\\xce\\xef\\x09\\x57\\xfb\\x3b\\xf1\\x2d\\x25\\x7c\\xb9\\xaa\\xd5\\xde\\xf7\\x2b\\x5f\\xed\\xf2\\x05\\x7b\\xac\\x76\\x88\\xaf\\x89\\x9d\\x7d\\x8b\\xb8\\xf1\\xb2\\xb8\\x14\\x47\\x6f\\xd7\\xf5\\xda\\xc5\\x8d\\x56\\x9b\\x33\\x47\\xdc\\x5c\\x07\\xc7\\x56\\x2f\\x1b\\xb8\\x1d\\x23\\xba\\x58\\xbb\\xd2\\xfe\\x5e\\x45\\xa4\\x51\\x7f\\x83\\x6a\\xaf\\x5f\\xc5\\x94\\x27\\x94\\x12\\x7e\\xbf\\xeb\\x47\\x33\\x8e\\xaa\\xb6\\xba\\xe5\\x68\\xfe\\xdb\\xd6\\x97\\xd6\\x0d\\x5d\\xbb\\x07\\x7f\\xd8\\xd0\\xf7\\xa1\\x20\\xf8\\x79\\xcc\\xba\\xe6\\x6a\\xc2\\xdc\\x51\\x3b\\x5c\\xdc\\x54\\xb7\\xe1\\x87\\xad\\x3d\\x9d\\x57\\x23\\x6a\\xdd\\xb5\\x77\\x08\\x98\\xfc\\xed\\xd9\\xf9\\x86\\xaa\\x12\\x3f\\xec\\xf9\\x2d\\xf6\\x3c\\x54\\x47\\x82\\x42\\x37\\xef\\xa9\\x53\\xea\\x16\\x34\\xe5\\xee\\x8b\\xa8\\xd6\\x5e\\xe5\\x1f\\x88\\xea\\x36\\x44\\x45\\x0a\\xe7\\xaa\\xdc\\x64\\x8c\\x7c\\x7f\\xfa\\x23\\xd7\\xcd\\xaf\\x6e\\x6e\\xf4\\xda\\x77\\xfd\\xc3\\x46\\xbf\\x17\\x60\\x40\\x50\\x4f\\x86\\xf8\\x6f\\x94\\x7e\\xe6\\xce\\xa3\\x2a\\x3f\\xfb\\xe0\\xdb\\xf3\\xcf\\xee\\x25\\xfd\\xec\\x62\\xed\\x55\\x2f\\xbc\\xdc\\x6a\\x55\\xf7\\xb4\\x87\\x7b\\x91\\x2c\\x65\\x6a\\x12\\xb1\\x5d\\xd8\\x31\\xb7\\xb9\\xa6\\xfd\\xe5\\xfc\\x74\\x55\\xf2\\xc7\\x84\\x6d\\xb6\\x5a\\xf1\\xc1\\x2e\\xb7\\xcf\\xa8\\x74\\x36\\x59\\xb1\\x5a\\x5c\\x5e\\x58\\xab\\xa3\\x85\\xee\\x50\\xee\\xc0\\xf5\\x34\\x7b\\xcb\\xa5\\x47\\xca\\x3c\\x6a\\x93\\xab\\x41\\x1b\\x1c\\xdb\\x01\\xea\\x7e\\x6e\\xc6\\x0e\\x30\\xe3\\x92\\xfc\\x1c\\x5d\\x51\\x9b\\x9e\\xf6\\x05\\x51\\x71\\x91\\x37\\x6e\\x52\\x19\\x19\\xbf\\x95\\xee\\x7d\\x95\\x30\\x91\\x55\\x4e\\xb2\\xa3\\xa1\\xd4\\x76\\xbe\\xa0\\x0e\\xa2\\xf3\\xc9\\x8d\\xf0\\xbc\\x36\\xa8\\x12\\x4b\\xba\\x66\\x3b\\xde\\xdf\\xda\\x72\\xb6\\x16\\xa9\\xf6\\xe6\\xdc\\x84\\xff\\x15\\x37\\x3d\\xc0\\x3a\\x95\\x6a\\x65\\xfa\\xed\\x70\\x4f\\x51\\x43\\x6f\\xb2\\xca\\xc6\\xb8\\x5c\\xc3\\x6e\\x01\\x41\\xdd\\xc5\\xba\\x54\\xef\\x47\\x85\\x07\\xbb\\xb2\\x11\\x59\\x0d\\x56\\x85\\x17\\x49\\x6d\\x6c\\x64\\x08\\xe3\\xb1\\x58\\x0d\\x06\\x1c\\x31\\xab\\x65\\xc2\\x91\\x23\\x25\\xfe\\xcb\\x73\\x1c\\xb3\\xe9\\xa4\\x1f\\xad\\xb0\\x0c\\x4c\\x60\\x7c\\x1f\\x2a\\xad\\xe4\\xc5\\xc2\\x95\\x5e\\x37\\xc6\\xca\\x26\\x33\\x81\\x03\\x8a\\xbb\\xaa\\x46\\x5a\\xed\\xac\\x7a\\x5e\\xae\\xdf\\x20\\x29\\x97\\xe7\\x2d\\x89\\xcb\\x31\\xd9\\x05\\x14\\x29\\xd4\\x19\\xa7\\xdb\\x51\\xa1\\x2b\\xa3\\xf6\\xd8\\x84\\x7d\\x2c\\xc5\\x8a\\xb3\\xa2\\x1f\\xb6\\x3b\\xf8\\x26\\x1c\\x27\\xc1\\xf1\\x81\\x6d\\xf2\\xbb\\x21\\xb8\\x70\\xfb\\xbb\\x63\\x7a\\x19\\x2e\\xa3\\x08\\x5e\\x6a\\xab\\x73\\x49\\xef\\xcf\\x95\\x31\\xa3\\x09\\x02\\xb7\\x5c\\xc5\\xc9\\x46\\x05\\x12\\x7a\\x69\\x59\\xab\\x30\\xbd\\x75\\x57\\xcc\\x79\\x8c\\x76\\x53\\xf1\\x7b\\x91\\x63\\x78\\x71\\x43\\x49\\x99\\x7f\\x8f\\x97\\xaf\\xb0\\x88\\xa3\\xd8\\xda\\xb6\\xdb\\xe0\\xea\\x72\\x16\\x77\\xf4\\x76\\x96\\xdb\\x5f\\xce\\xa2\\xcb\\xbc\\x8e\\x7b\\xfc\\xbb\\x5c\\xe6\\x7b\\xba\\xe3\\xe6\\x3c\\xe6\\xaa\\xa6\\xfb\\xdd\\x1d\\xbb\\x17\\xeb\\xd8\\xcb\\xbf\\xcb\\x05\\xe7\\xa4\\x28\\xa8\\x86\\xb7\\x9a\\xd8\\xee\\x98\\x8d\\x7d\\xe2\\xa6\\xdd\\x8d\\xf4\\xd7\\xe1\\xa0\\x7f\\x9f\\x3b\\x41\\x51\\x77\\x22\\xde\\x6c\\xa3\\xbc\\xb9\\xc2\\xee\\x6e\\x4b\\x7c\\x9e\\xeb\\xe6\\x37\\x36\\x97\\x7f\\x9d\\xb3\\x4b\\xfd\\xf0\\xad\\x1a\\xcf\\x14\\x4b\\xd9\\xcc\\xd9\\x4d\\xb2\\x71\\x27\\xce\\xe6\\xc7\\xd6\\x39\\xbb\\xcb\\xc7\\xb6\\x3b\\x3b\\x47\\xd1\\x27\\x26\\xb9\\x3b\\xb3\\xaf\\x73\\x76\\xf7\\x73\\x04\\x7f\\xa4\\xfa\\x2e\\x39\\xbb\\xb7\\x5f\\x86\\x75\\xce\\xee\\x7e\\x3c\\x48\\xff\\xc8\\x7c\\x63\\xce\\xee\\xf6\\x12\\x49\\xdd\\xfc\\xd9\\xd6\\x20\\x9e\\xad\\x03\\x0d\\xbc\\xdc\\xc1\\xa0\\xb6\\x15\\x4a\\xf8\\x31\\x6a\\xa5\\x57\\x27\\x25\\x4c\\x48\\x27\\x8a\\xdc\\xcf\\x34\\xe6\\x5e\\xd5\\x65\\xea\\x77\\x2a\\xb4\\x32\\x44\\xa7\\xe6\\xa7\\xc3\\xf9\\x50\\x03\\xe8\\xad\\x2c\\x15\\x7b\\x28\\xc5\\x01\\xb9\\x2d\\x9e\\x72\\x1a\\x7c\\x29\\x8e\\x7a\\x2d\\x78\\xea\\xd7\\x4b\\x28\\xc4\\xaa\\x76\\x27\\x4a\\xaf\\xa0\\x2f\\x34\\x64\\x5c\\x9a\\x30\\x02\\xae\\x34\\x87\\xe2\\x65\\x89\\x27\\xd4\\x1e\\x2c\\x6d\\x60\\x35\\x5f\\xb9\\xb3\\xa7\\x32\\x39\\xb5\\x7e\\x59\\x4a\\xb3\\xbb\\x1d\\x1c\\xc0\\xb1\\x1d\\xe2\\x4f\\x2a\\x13\\xec\\x1a\\x11\\xb6\\xf2\\x69\\xa8\\x7d\\x86\\x33\\x20\\x31\\x98\\x29\\x8a\\xd2\\x96\\x76\\xd1\\xcb\\xfe\\x52\\x67\\xbb\\x65\\x0a\\x76\\x1d\\x12\\x37\\x24\\x96\\xcb\\x73\\xce\\xad\\xaf\\x10\\x52\\x45\\x14\\x06\\xf7\\x6a\\xc8\\x66\\x0e\\x43\\xa0\\xa0\\x5c\\x84\\x1d\\xa9\\x55\\x2b\\xd5\\xee\\xaa\\xae\\x75\\xa6\\x58\\x47\\x2f\\xc9\\xe1\\x63\\xb0\\x50\\x9a\\xd5\\x92\\xc0\\xb5\\x79\\xfd\\xd6\\x2d\\x59\\x6e\\xdd\\x32\\xcc\\x18\\x27\\x5b\\x1c\\xcf\\x69\\xa3\\xd0\\xb9\\x6e\\x29\\xfd\\xf4\\x1f\\xe1\\x0e\\x9e\\x73\\x13\\xe5\\xf7\\xe8\\x03\\x74\\x7f\\xb3\\xcc\\xb4\\x67\\xfc\\xd3\\xbf\\xfb\\x65\\x41\\xa9\\x1c\\x8d\\x70\\x7d\\x3f\\x97\\x09\\xb9\\xbb\\xde\\x26\\xa4\\x8b\\x26\\x7f\\xff\\x45\\xfb\\x7b\\xdd\\xb0\\xe4\\xce\\x63\\xe3\\x77\\x0b\\x33\\x3d\\x8b\\x7f\\xff\\xe5\\x2b\\xf9\\x5d\\x23\\x35\\xef\\xb0\\x03\\xee\\x7b\\xb8\\xe4\\x4a\\xd7\\x35\\xfd\\xfd\\xd7\\x55\\xd2\\xdf\\x2f\\x1a\\xe2\\x4e\\x0b\\x87\\xbc\\x5f\\x97\\x93\\xe9\\xbe\\xe5\\xf7\\x60\\xdf\\xea\\x66\\xc0\\xe1\\xef\\x27\\x7f\\xcf\\x4b\\xd8\\x1c\\xd6\\xe6\\x62\\xae\\xbd\\x72\\x54\\x7a\\xe2\\x55\\x21\\x97\\x5a\\x99\\xa9\\xd6\\x5d\\xc3\\x21\\xb1\\x5a\\x77\\xbe\\xe1\\x8c\\x18\\x32\\x1e\\xc3\\xcc\\x41\\x7a\\xdd\\xaa\\x20\\xcb\\xf1\\xb1\\xc2\\xae\\xa9\\x91\\xb8\\x7a\\xb5\\x39\\x84\\x7a\\x8b\\xfd\\x34\\x8e\\xe8\\xd7\\x96\\xd1\\x64\\x45\\x4f\\x84\\x86\\xa2\\x60\\xaf\\xed\\x88\\xdb\\x00\\xe4\\xa7\\xd0\\x69\\xac\\x56\\x02\\xd1\\x6a\\x55\\xb7\\x30\\x01\\x0d\\xa6\\xf2\\x96\\x8d\\xc7\\x85\\x48\\xca\\x47\\xc5\\x55\\x0b\\x40\\xc0\\x03\\x37\\x80\\x3b\\x08\\x17\\x32\\x72\\x1b\\xd4\\x5e\\xe4\\x10\\x47\\xdf\\x32\\xee\\xd0\\x32\\x27\\x3f\\x35\\x9a\\x0c\\xfc\\x72\\x7e\\x93\\x16\\x1a\\x39\\x36\\xc7\\xe2\\xc3\\x34\\xf5\\x5b\\xdc\\x1e\\xa6\\x5d\\x76\\x83\\x08\\xbb\\x5c\\xe2\\xa8\\x3c\\x67\\x16\\x1f\\x72\\xf6\\x26\\xd4\\xfd\\x75\\xed\\x94\\x8d\\x8f\\x38\\x7c\\x9d\\x47\\x5c\\xc2\\xcb\\x2e\\xa1\\x60\\x5b\\xff\\x0e\\xf2\\x02\\x37\\xe9\\xad\\x06\\x6b\\xba\\xd8\\xac\\x76\\x0f\\x99\\x65\\xa4\\x6d\\x87\\x12\\x9e\\xb5\\x9f\\xbe\\xd7\\xf7\\x53\\xc1\\x5b\\x7e\\xc4\\x76\\xdd\\x9c\\xd7\\xa3\\xf7\\x7c\\x5e\\x11\\xf6\\xe1\\x3b\\xd8\\xc2\\xcf\\x1e\\xbf\\xe7\\x33\\x64\\x65\\xd8\\x77\\xb2\\xc8\\x37\\xa7\\xfe\\xe4\\x7d\\x9f\\xba\\xe4\\x4d\\xe3\\xbf\\x84\\xcd\\x77\\x9b\\xf3\\x5d\\xe7\\xd4\\xfe\\x23\\x5d\\xe7\\x75\\x1e\\x39\\xbe\\x23\\xad\\xaf\\xb3\\x77\\x69\\x9f\\x59\\xbd\\xaf\\x74\\xd9\\x4a\\x4f\\xe0\\x4d\\xad\\x8e\\x49\\x1c\\x5c\\xcb\\xd5\\xa9\\xcd\\xad\\x04\\x21\\xf9\\x6f\\x7d\\xb5\\x69\\x7a\\x0f\\xaf\\x36\\xd5\\xd5\\xbc\\xa1\\xe4\\xd6\\x3f\\x12\\x39\\xd9\\x0d\\x08\\x37\\x73\\x97\\xdd\\x80\\x70\\x2b\\xee\\xa2\\xb4\\xce\\xfe\\x6b\\x39\\x5c\\xdd\\x95\\x93\\x4a\\x9e\\x2d\\xa6\\x8e\\x7b\\x09\\xac\\x08\\x98\\xd0\\x64\\x69\\xf6\\x94\\xf3\\x98\\xed\\x46\\x76\\x4b\\x47\\x98\\xba\\xdb\\x84\\xd2\\xae\\x85\\x72\\xbb\\x5a\\x0e\\x54\\x47\\xdf\\xe0\\x78\\xea\\xb7\\x0c\\x51\\x32\\xc8\\xca\\xa6\\xfe\\x3d\\xc7\\x66\\x55\\x4d\\xac\\xac\\x5b\\xde\\x57\\x35\\x11\\xba\\x3c\\x97\\x40\\x3a\\x58\\x90\\x30\\xd9\\x51\\x1f\\xe1\\x3a\\xe9\\xa6\\x79\\xa2\\x38\\x22\\xc7\\x9b\\x98\\x71\\x57\\x38\\x2a\\x1f\\xcb\\xc3\\x34\\x13\\x25\\x1a\\x75\\x6f\\xaa\\xdd\\xe2\\x04\\x1a\\x9b\\x70\\x6b\\x7e\\x3a\\xcc\\xe4\\xb0\\x40\\x24\\x08\\x1e\\x1e\\x25\\x86\\x47\\x49\\x8e\\x54\\x27\\xa3\\xb4\\xce\\xb1\\xab\\x4b\\xad\\xdb\\x53\\x30\\xa2\\xfe\\x2d\\x38\\xb8\\xe6\\x93\\x5d\\x44\\x06\\x60\\xc7\\x76\\x7b\\x7a\\xeb\\x57\\xb5\\x38\\x4a\\x3c\\x31\\x56\\x24\\xbd\\x17\\x21\\x84\\xc5\\xe7\\x87\\xca\\x82\\xa9\\xdf\\x21\\x94\\x97\\xf0\\xb2\\x1b\\x91\\x48\\xde\\xac\\xc2\\xdc\\x72\\x89\\x4b\\x0f\\xe0\\xb2\\x5d\\xa9\\x12\\xcd\\x63\\xf9\\xde\\x39\\x41\\xce\\x29\\xd4\\x74\\xc7\\x18\\x92\\x3b\\x25\\x88\\x44\\x65\\x1d\\xa7\\xbe\\x87\\xf3\\x23\\x8c\\x8a\\x0b\\xe1\\xc6\\x98\\x4d\\x49\\x9b\\xef\\xb6\\x46\\xc9\\xeb\\x02\\x50\\x6d\\x5f\\xb3\\xa4\\x20\\xeb\\xe1\\x7b\\x38\\x2f\\xcd\\xeb\\x03\\x46\\x57\\x5f\\x15\\x9c\\xdf\\x4b\\xef\\x6f\\x36\\xe6\\xe6\\xac\\x42\\x58\\x05\\x30\\x50\\xdd\\x76\\xb3\\xf9\\x3a\\x0f\\xbf\\x09\\x1f\\x69\\xbf\\x12\\xef\\xc7\\xbb\\x5f\\xcb\\xac\\xe3\\xdd\\xaf\\xcb\\x79\\xc7\\x78\\xa4\\xf9\\x2a\\x71\\x30\\x56\\x39\\xd2\\x7c\\x45\\x68\\xc2\\xc7\\x06\\xb3\\x72\\x02\\x1c\\x6f\\xbe\\x62\\x36\\x8e\\x74\\xa4\\xf9\\x2a\\xb9\\x01\\xe7\\xdb\\x36\\x9b\\xdf\\x10\\x9a\\x2f\\xdb\\xcd\\x69\\x45\\x06\\x77\\xbf\\x1c\\x84\\x03\\xad\\xef\\x7c\\x7c\\x97\\xde\\x56\\x34\\xf4\\x4e\\xbd\\xad\\x49\\x2c\\xd2\\x02\\x67\\x73\\x73\\x39\\x56\\x2b\\xb3\\x13\\xea\\x52\\xbc\\x46\\x1f\\x8f\\xf5\\xb8\\xce\\x3b\\xce\\x7b\\x08\\x13\\xe9\\xaa\\x47\\x91\\x7d\\x8f\\x22\\x47\\x7b\\x5c\\x91\\x46\\xa4\\x5e\\xf2\\xb8\\xa2\\x38\\x77\\x98\\xa9\\xc6\\x81\\x72\\x70\\x92\\xf2\\xae\\x95\\xc1\\x67\\xab\\xa9\\x3e\\x7b\\x2a\\x6f\\xb9\\x8c\\x8d\\x03\\xad\\x48\\xe9\\x5a\\xf7\\x08\\x19\\x4a\\x94\\x99\\x5a\\x47\\xf5\\xd4\\x64\\xc0\\xdd\\x46\\x5e\\x62\\xde\\xf9\\xe3\\xdd\\xaf\\x48\\x2f\\x2e\\xf7\\x19\\x21\\xbf\\x2d\\x25\\xed\\x9e\\xb3\\xcc\\x1c\\x97\\xcb\\xc4\\x79\\xe9\\x9e\\x2b\\xbd\\xad\\xfb\\x95\\x20\\x2e\\x31\\xde\\x76\\x71\\xce\\x63\\x68\\xf7\\xb0\\x90\\x2b\\xdb\\xb0\\x24\\xbe\\xed\\x42\\x5a\\xa9\\xa8\\x77\\x5e\\xf4\\x95\\x95\\x56\\x96\\x94\\x68\\x2c\\xba\\x34\\x74\\xcf\\x69\\xa6\\x16\\x7b\\xf7\\x35\\x2e\\xdd\\x4b\\xb2\\xa1\\x48\\xad\\x57\\x6d\\x45\\x66\\xaa\\x79\\xab\\xed\\xf6\\x50\\x78\\xc5\\xaf\\x79\\x5f\\x89\\x5c\\x8a\\x2b\\x22\\x73\\x0e\\x63\\x70\\xb5\\x3a\\x44\\xae\\x23\\x34\\x65\\xca\\x23\\x92\\xae\\x2d\\x2b\\xd5\\xa7\\x3c\\x59\\x55\\x01\\x52\\x40\\x91\\xad\\xd8\\x76\\x73\\x48\\xfd\\x84\\x31\\x38\\xd9\\x2d\\x5c\\x1d\\xa0\\x25\\x72\\x49\\x8d\\x1b\\xed\\x6f\\xdb\\xf8\\xe2\\xc0\\x37\\xd4\\xc4\\xa8\\x07\\xd7\\x08\\x84\\x99\\x03\\x2f\\x17\\xce\\x2e\\x79\\x01\\x39\\xc4\\x9b\\x5f\\x50\\xe0\\x9b\\xdf\\x1c\\x19\\xc0\\xca\\xfe\\x3b\\x2a\\xc6\\x65\\xc5\\xaa\\x79\\x9f\\xeb\\x11\\xaa\\x4b\\x91\\xde\\xf5\\xb6\\x29\\x0e\\xb2\\xe2\\xd7\\xfd\\x37\\x6a\\xbd\\xdf\\x2a\\xf5\\x1c\\xd2\\x6a\\xfe\\x47\\x55\\xf0\\x0d\\x77\\x61\\x85\\xda\\x65\\x55\\x69\\x2e\\x56\\x32\\xd1\\x1a\\xf3\\xac\\x46\\xb2\\xc7\\xc3\\xf2\\x87\\x04\\xeb\\x26\\xda\\x05\\x86\\x0e\\xa7\\xb0\\x27\\x01\\xa6\\x46\\x72\\xf9\\x98\\x60\\x39\\x9a\\xd1\\x5c\\xa7\\x25\\xcf\\x54\\x79\\x0e\\x09\\x0c\\x6d\\xf4\\x28\\x0c\\xb2\\xdc\\x5b\\x68\\xb7\\x84\\x13\\x1c\\x18\\x96\\x06\\x6b\\x77\\x43\\xf5\\xbb\\x14\\x29\\x48\\x4f\\xb9\\xf0\\x5c\\x92\\xca\\x8f\\x5d\\x6c\\xcb\\x2d\\x9e\\xf6\\x24\\xf9\\xf0\\x4f\\xb5\\xdf\\x22\\x3c\\x7a\\x54\\xda\\xae\\xae\\xda\\x7d\\x57\\xd1\\x2e\\x68\\x34\\x3f\\x49\\x50\\xa3\\x04\\xf7\\xe0\\x11\\x89\\x53\\x0b\\x66\\xd2\\x8d\\xc7\\x95\\xd8\\x36\\xcc\\x62\\xf9\\xd0\\x94\\xf6\\x0e\\x00\\x16\\x05\\x85\\x76\\xde\\x77\\xd4\\xe1\\xd9\\x1d\\x91\\x07\\x57\\x28\\x12\\xea\\x6f\\x20\\x2b\\x03\\x6b\\xb6\\xbd\\x61\\xb4\\xe6\\x66\\xe2\\xba\\x5c\\x99\\x12\\xc4\\x91\\x94\\x38\\x57\\xde\\x49\\x8d\\xb3\\x55\\xa1\\x8f\\x69\\xf6\\x51\\x67\\xd8\\xe2\\x8c\\xff\\x52\\x4c\\x97\\xe7\\x49\\x8d\\x46\\x6a\\x73\\x52\\x48\\x4e\\x79\\x40\\xb5\\x6e\\x69\\x61\\xa7\\x8f\\xec\\xf4\\x89\\x28\\xcc\\x5e\\xdf\\xfb\\x26\\xb3\\x44\\x19\\x7c\\x76\\xdc\\xaf\\xa4\\x95\\x98\\x76\\x3e\\xa1\\xac\\x7e\\x76\\x92\\xda\\x52\\xd9\\x4d\\x12\\x9a\\x6f\\x4f\\x20\\x3d\\xbb\\x89\\x84\\x3a\\xcb\\x07\\x4b\\xf0\\x08\\xaa\\xed\\x03\\x1c\\x90\\x01\\xea\\xfe\\x88\\xfb\\xf3\\xf1\\x1a\\xd2\\x12\\x73\\x4f\\xb5\\x4b\\xd9\\x35\\xc9\\xb8\\xbc\\x8a\\x72\\x9b\\x49\\xca\\x72\\xb5\\x21\\x08\\x28\\xa3\\xc2\\xbf\\x5d\\x79\\x11\\x1f\\xa6\\x11\\x77\\xec\\x65\\x14\\x52\\x51\\xda\\xea\\xd7\\x8a\\xe3\\x76\\x78\\xc4\\x20\\x52\\x18\\x3d\\x55\\x17\\x9d\\xc7\\x61\\x8f\\x32\\xe1\\xea\\x0a\\x27\\xa3\\xaf\\x76\\xf7\\x14\\x6e\\xb3\\xb0\\x0b\\x8d\\x11\\x55\\xc1\\xe1\\x12\\x92\\xa2\\x06\\x59\\xbf\\x3a\\x0b\\x4f\\x4d\\xfa\\x35\\x2c\\xf6\\x90\\xdb\\xe5\\x79\\xcd\\x59\\x27\\x9f\\xf2\\xe2\\x7c\\x4d\\x70\\x04\\x1e\\x11\\x5e\\xcf\\x1e\\xdf\\x00\\xcf\\x6b\\x2c\\xff\\x70\\x53\\x2f\\x92\\xae\\xc6\\x5a\\x96\\x2b\\x43\\xa8\\xb2\\x5d\\xd9\\xe8\\xb8\\xf2\\x64\\xb5\\xe3\\x29\\x04\\xbb\\xb1\\x00\\x4e\\x20\\xb2\\x62\\x37\\x62\\xd7\\x4d\\x0e\\x1e\\x9e\\xca\\x1c\\x1c\\x8e\\x31\\xd8\\xd5\\x6b\\xe2\\x70\\x0d\\x04\\x8b\\x23\\x15\\x10\\x54\\xfa\\x29\\x76\\x3b\\x9b\\xd3\\x83\\x5a\\xfa\\x23\\x5c\\x3a\\xb2\\x63\\xda\\x8f\\x95\\xd6\\x63\\x2d\\xe1\\xf2\\x9c\\x62\\x0b\\x57\\xf9\\x6a\\xf5\\x2a\\x5f\\xed\\x48\\xf8\\xe5\\xf1\\xda\\x2c\\xa2\\xb6\\x38\\x19\\xff\\x91\\xf6\\x29\\xcb\\xfd\\x8c\\xd5\\xfd\\x0d\\x06\\x4b\\xa9\\xc8\\x51\\x86\\xda\\xfd\\xf9\\xe2\\xd5\\x0b\\xf7\\x2d\\x99\\x58\\x52\\x21\\xf2\\x2d\\x7f\\xf8\\xe0\\x2f\\x0f\\xdc\\x9f\\x3f\\x7c\\xe0\\x89\\x6e\\x6a\\x54\\x4e\\x69\\x54\\x7b\\xa3\\xbd\\x03\\x47\\x9b\\x2e\\x86\\xe7\\x66\\x53\\x94\\x0a\\x79\\x7b\\xcb\\x2f\\x4f\\x69\\xf4\\x85\\x35\\x92\\x72\\xac\\xd1\\xe7\\xbd\\xa7\\x70\\xbd\\xd1\\x47\\x87\\x73\\x14\\xd9\\x78\\x3d\\xe1\\x35\\xad\\x3e\\xf1\\xd1\\x7e\\x46\\xf2\\xcc\\x66\\x54\\x57\\x5f\\xf8\\xc5\\xbe\\x4d\\xe9\\xb3\\x5e\\xf7\\xd3\\xdb\\xfc\\x37\\x7b\\xbd\\x9a\\xee\\x55\\x17\\xdc\\xac\\x0b\\xce\\xd7\\xdb\\xfc\\x72\\xdf\\x06\\x1e\\xaa\\x1b\\x67\\xf3\\xf1\\xe1\\x64\\xd7\\xab\\xda\\x5f\\x3f\\xb3\\x51\\xd4\\xeb\\xaf\\xff\\xf3\\xd5\\x28\\x0c\\xc9\\x6a\\x27\\x65\\xf5\\x91\\xc3\\x66\\xb0\\x0b\\x4e\\x68\\xf6\\xe8\\x84\\x66\\xe6\\x52\\xd6\\x56\\x2b\\x42\\xbc\\x6a\\xf4\\xac\\x6f\\x03\\xc7\\x23\\x6d\\x9e\\x9e\\xd0\\xe6\\xc9\\x4f\\x37\\x16\\xe9\\xa0\\xcd\\xe3\\x13\\xda\\x3c\\x3a\\xa1\\x4d\\x3b\\xa1\\x4d\\x3e\\x61\\xee\\xe9\\x84\\x36\\xf1\\x84\\x36\\xa7\\xac\\x33\\xbf\\xbd\\xcd\\xc5\\xe3\\x13\\xda\\x3c\\x3a\\xa1\\x4d\\x3b\\xa1\\x4d\\x3d\\xa1\\x4d\\x39\\xa1\\x4d\\x5f\\x43\\x39\\x42\\x1b\\x17\\xf1\\x84\\x36\\x72\\x42\\x1b\\x3e\\xa1\\x0d\\x9d\\xd0\\x26\\xbc\\xbd\\xcd\\x93\\x3e\\xaf\\xd4\\x8e\\xb4\\x89\\x27\\xb4\\x91\\x13\\xda\\xf0\\x09\\x6d\\xe8\\x84\\x36\\xe1\\x2d\\x6d\\xfe\\x7a\\x9c\\x8d\\xe7\\xe3\\xaf\\xbf\\x3d\\xce\\x74\\xaf\\x36\\xe4\\x6c\\x7f\\x3d\\x1e\\x27\\xa5\\x97\\xc7\\x5f\\x7f\\x75\\xfc\\xf5\\xc5\\xf1\\xd7\\x4f\\x8f\\xbf\\x7e\\x72\\xfc\\xf5\\xa3\\xe3\\xc4\\xf2\\xd9\\x96\\xa6\\xec\\xef\\x3f\\x7a\\xeb\\xbe\\xc9\\x29\\xd2\\x9c\\x4f\\xd2\\x0c\\x4f\\x36\\x1b\\xfd\\xf6\\x50\\x95\\xe5\\xd5\\xeb\\x4f\\x0e\\x5f\\xa7\\xd5\\x1e\\x7f\\x7a\\x82\\xb2\\xfc\\xdd\\xaa\\x0d\\xb7\\xad\\x46\\x53\\x87\\x48\\xab\\x45\\xfd\\xfd\\x1a\\x1d\\x49\\xda\\x6e\\xb4\\xe0\\xa2\\xcd\\x36\\x5f\\x1e\\x7f\\x6d\\x58\\x68\\xbd\\x77\\xbf\\x3f\\x44\\x41\\xbc\\xd2\\xec\\xbf\\x3f\\xdc\\xfa\\xf5\\x4a\\xfc\\xeb\\x7a\\x12\\x71\\xd5\\xc7\\xbf\\xae\\x26\\xb1\\xd9\\xe6\\xcb\\xe3\\xaf\\x6d\\x94\\xb4\\xa2\\xb0\\x7f\\x3d\\x1c\\x65\\x5a\\xcd\\xf1\\xb3\\x2b\\xe5\\xd4\\x07\\xd9\\x56\\xcb\\x74\\xd5\\xe6\\xa2\\xef\\x69\\x5d\\x6d\\xd9\\x67\\xab\\x7d\\xa7\\xba\\x1a\\xea\\x55\\xa3\\xc7\\x5d\\xcb\\x51\\x5c\\xa1\\xba\\xab\\x46\\x8f\\x96\\x46\\x69\\xc5\\x95\\x9f\\x1d\\x52\\xea\\x66\\x1f\\x26\\x8d\\xf2\\x6a\\x42\\x9f\\xaf\\xc0\\xa5\\x5f\\x2f\\xdc\\xe7\\x87\\x7d\\xc8\\x6a\\xe1\\x3e\\x3f\\x04\\x9f\\x7e\\x0d\\x4e\\x3f\\x5f\\xa1\\xcf\\x1b\\xa4\\xc3\\x17\\x37\\x0c\\x64\\xb5\\xb4\\x5f\\xbc\\x21\\x5a\\x57\\x4b\\xf1\\xc5\\x9b\\x03\\x59\\x71\\xed\\x17\\xeb\\x81\\xd0\\x6a\\x45\\xbe\\x3c\\x44\\xa9\\x5d\\x13\\xc5\\x23\\xad\\x16\\x62\\xc9\\xab\\xd1\\x7e\\xb9\\x22\\x96\\xb5\\x9c\\xf9\\x72\\x45\\x2c\\x6d\\xa5\\x31\\xbe\\x5c\\xd1\\xca\\x9a\\x0a\\xbe\\x5c\\x91\\x4a\\x5d\\x4d\\xff\\xcb\\x53\\xf6\\xfa\\xcb\\x43\\x81\\xb4\\x56\\x6e\\x5f\\x1e\\xee\\x40\\x5c\\xed\\xe2\\x97\\x87\\x16\\xc0\\xe6\\xaf\\x97\\x0d\\x5a\\x71\\xc5\\xc1\\xda\\x77\\x1d\\x10\\xb7\\x06\\x78\\x9c\\x9a\\x0e\\x1a\\x2d\\xf2\\x79\\xd5\\xe6\\x4f\\x6f\\x18\\x33\\x2b\\xaa\\xfd\\xaf\\x57\\xf2\\xe8\\xc9\\x4f\\x37\\x2c\\x9a\\x83\\x36\\x8f\\x4f\\x68\\xf3\\xe8\\x84\\x36\\xed\\x2d\\x6d\\xfe\\x70\\xfc\\xf5\\x6f\\x36\\x5e\\x3f\\x3b\\xb4\\x96\\xf6\\xbb\\xbf\\x22\\xb5\\x37\\x9a\\x3d\\x39\\xad\\x59\\x3b\\xad\\x59\\x3d\\xa1\\xd9\\x95\\x89\\xb6\\x62\\xa6\\x67\\x6b\\xb3\\xe0\\x58\\x9b\\x47\\x27\\xb4\\x69\\x27\\xb4\\xa9\\x27\\xb4\\x29\\x6f\\x6f\\x73\\x84\\xe1\\x9e\\xbd\\x81\\x07\\xb7\\xfa\\xf8\\xea\\xf8\\xeb\\x8b\\xe3\\xaf\\x9f\\x1e\\x7f\\xfd\\xe4\\xf8\\xeb\\x4d\\x76\\x7d\\x76\\x0a\\x2b\\x1e\\x34\\x2a\\xa7\\x50\\x0a\\x6f\\x36\\xfa\\xf3\\x0d\\x74\\xb2\\xfa\\xdc\\x9f\\xd7\\x74\\x72\\xac\\xcd\\xa3\\x13\\xda\\xb4\\x13\\xda\\xd4\\x13\\xda\\x94\\xb7\\xb4\\x19\\x8f\\xbf\\xfe\\xea\\xf8\\xeb\\x8b\\xe3\\xaf\\x9f\\x1e\\x7f\\xfd\\x64\\xe3\\xf5\\xab\\x43\\x21\\x79\\x83\\x6e\\x7f\\xf5\\x26\\x7e\\xdd\\x7a\\xff\\x6c\\x4b\\xdb\\xce\\x6f\\xbe\\x5f\\xe9\\xc7\\xbf\\x1c\\x6a\\xe3\\x05\\x4e\\xad\\x29\\xf5\\xb0\\xd9\\xe2\\x33\\x7a\\x5b\\xb3\\x47\\x27\\x34\\x93\\x53\\x1a\\xf1\\x49\\x1f\\x7c\\xb2\\xd9\\xe8\\xaf\\x6f\\x59\\x03\\x95\\x1f\\x8f\\x7f\\xba\\x52\\x47\\xeb\\xcd\\xba\\xde\\x70\\x93\\x01\\xae\\x37\\xdc\\xe4\\x82\\xeb\\x0d\\x37\\x59\\xe1\\xb0\\xe1\\x1f\\x4e\\x68\\xf3\\x9b\\xed\\x36\\x30\\xdb\\xbf\\x3d\\xe2\\x53\\x3d\\x6c\\xb3\\xe5\\x58\\x3d\\x6c\\x73\\xd4\\xbb\\xba\\xf8\\x12\\xde\\xf6\\x41\\x3a\\xe1\\x83\\x74\\xea\\x07\\xf9\\x84\\x0f\\xf2\\x09\\x1f\\xe4\\x53\\x3f\\x28\\x27\\x7c\\x50\\x4e\\xf8\\xa0\\x9c\\xfa\\xc1\\x78\\xc2\\x07\\xe3\\x09\\x1f\\x8c\\xa7\\x7e\\x30\\x9d\\xf0\\xc1\\x74\\xc2\\x07\\xd3\\xa9\\x1f\\x2c\\x3f\\x5d\\x69\\xf7\\x9b\\x7b\\x5c\\x1a\\x6e\\x39\\xe7\\xaf\\x75\\xb6\\xed\\xa1\\x5f\\xae\\x7b\\xfc\\xf6\\x88\\x0b\\xfe\\xb0\\xcd\\x96\\x1f\\x7e\\xb9\\xa3\\xf1\\x6d\\xfd\\xb4\\x13\\xfa\\x79\\x74\\x42\\x3f\\x8f\\x4e\\xe8\\xe7\\xf1\\x09\\xfd\\x3c\\x7e\\x7b\\x3f\\x4f\\x0f\\x78\\x7e\\xdb\\x33\\xb3\\xdc\\x46\\x76\\x52\\x43\\x39\\xb5\\x61\\x3c\\xb5\\x61\\x3a\\xb5\\x61\\x3e\\xb5\\xe1\\xd3\\x9f\\x9e\\x64\\xb4\\x5e\\x6b\\xba\\x6d\\xb9\\x5e\\x6b\\xb8\\x6d\\xbe\\x5e\\x6b\\xb8\\x6d\\xc3\\x5e\\x6b\\xb8\\x6d\\xc8\\x5e\\x6b\\xb8\\x6d\\xcd\\x5e\\x6b\\x78\\x04\\x61\\x1f\\xb6\\xdc\\xb2\\x6b\\x0f\\xdb\\x6c\\x19\\xb7\\x87\\x6d\\xb6\\x2c\\xdc\\xc3\\x36\\x9b\\xb8\\xf9\\xfa\\x96\\x6d\\xda\\xba\\xd7\\x1b\\x6e\\xa3\\xec\\xeb\\x2d\\x37\\xad\\xde\\x25\\x7e\\xf5\\x36\\xc4\\x81\\x40\\xd8\\xdb\\x1a\\x99\\x3b\\xef\\x34\\xca\\x7b\\xa3\\xed\\x51\\xd2\\x7b\\xa3\\xe5\\x51\\xda\\x7b\\xa3\\xe5\\x51\\xe2\\x7b\\xa3\\xe5\\x51\\xea\\x7b\\xa3\\xe5\\x51\\xf2\\x7b\\xa3\\xe5\\x71\\xfa\\xbb\\x6a\\x7a\\x84\\x00\\xaf\\x1a\\x1d\\xa1\\xc0\\xab\\x46\\x47\\x48\\xf0\\xaa\\xd1\\x31\\x1a\\x7c\\x73\\xf7\\x8e\\x11\\xe1\\x9b\\x2d\\x8f\\x52\\xe1\\x9b\\x4d\\x8f\\x91\\x61\\xf7\\x09\\x7c\\xfb\\xb6\\x0c\\x01\\xf3\\x30\\x9c\\xd0\\xec\\xc9\\x69\\xcd\\x9e\\x1e\\x6b\\xf6\\x15\\x7d\\xf8\\xe0\\xc9\\xcb\\xaf\\xbf\\x7e\\x74\\xf6\\xcd\\xc5\\xab\\xe7\\x2f\\x9f\\x9e\\x3d\\x79\\x39\\xbc\\x7c\\x71\\x36\\x7e\\xfb\\x72\\xba\\x78\\xfd\\xfc\\xc5\\x57\\xc3\\xe3\\x47\\xaf\\x2f\\xec\\x9f\\x4f\\x1f\\xdb\\x3f\\x2e\\x86\\xe1\\xf9\\x37\\xaf\\x9f\\xbf\\x7e\\xe0\\xfe\\xc3\\x57\\x6a\\xc5\\xf5\\x77\\x07\\xbf\\xe9\\x3f\\x18\\x2e\\x9e\\x4d\\xf6\\xf4\\xea\\xf9\\x57\\xbb\\x69\\xdf\\xcb\\xd5\\xdf\\x9f\\x3e\\x1e\\xf0\\xea\\x81\\xfb\\x0f\\xf0\\xb3\\xf3\\xf5\\xa1\\xfd\\x73\\xff\\xc8\\x67\\xbd\\x45\\xd9\\x6a\\xf0\\x79\\x6f\\x10\\xb7\\x1a\\x7c\\x79\\xf6\\xe5\\xa3\\x27\\xdf\\x4e\\x17\\x67\\x5f\\x3e\\x7d\\x7e\\xf1\\xea\\xc2\\xc6\\xaf\\x3c\\x91\\xae\\xff\\xe2\\x17\\x67\\xbf\\x78\\x72\\xf1\\xf4\\xf9\\x30\\x3c\\xba\\xf6\\xf1\\x76\\xbd\\xe5\\x2f\\xcf\\x3e\\x3d\\xfb\\x78\\xda\\x9d\\x7d\\xfa\\xd5\\xab\\x47\\xf3\\xc5\\xd9\\xa7\\xf6\\x81\\x4f\\x9f\\x3c\\x7f\\xf5\\xe4\\xdb\\xaf\\x9f\\x0d\\x17\\xdf\\x9d\\x7d\\x3a\\x3d\\x1f\\x9e\\x5e\\x9c\\x7d\\x7a\\xf0\\x4d\\xed\\xf1\\xa3\\xb3\\x8f\\xec\\x27\\x1f\\xd9\\x4f\\x3e\\x3a\\xf8\\xc9\\x47\\xf6\\x93\\x8f\\x96\\x9f\\x9c\\x7d\\xf4\\xea\\xf9\\x8b\\xaf\\xfa\\x10\\x56\\x7b\\x77\\xe7\\x21\\x6c\\xae\\xe8\\x9d\\x7b\\x5c\\xb6\\x60\\xb5\\x89\\x77\\xee\\x71\\x6b\\xcf\\xa2\\xdc\\xdb\\x27\\xee\\x4e\\xfb\\xc0\\xb6\\xf7\\xb7\\x1f\\x7f\\xbc\\xf7\\xd5\\xfb\\x53\\xef\\x71\\xb5\\x58\\x1f\\x9f\\x7d\\x6c\\x7d\\x7d\\x6c\\x7d\\x7d\\x7c\\xd0\\xd7\\xc7\\xd7\\xd7\\xe7\\xec\\xe9\\xd9\\xc5\\xd9\\x57\\x67\\xe3\\xd9\\x93\\xce\\x14\\x67\\x17\\xf6\\xe3\\x0b\\xfb\\xf1\\xc5\\xc1\\x8f\\x2f\\xf6\\x34\\xfb\\xf2\\xa2\\xaf\\xd0\\x8a\\x67\\x6e\\xf3\\xf1\\x97\\x67\\x2f\\xad\\xed\\x4b\\x6b\\xfb\\xf2\\xa0\\xed\\x4b\\x9b\\xf4\\xcb\\x37\\x29\\xe3\\xdd\\xbe\\xd7\\x79\\xe2\\x9a\\xa0\\xbf\\x6d\\x2f\\xdf\\x9e\\x7d\\x6b\\x6d\\xbf\\xb5\\xb6\\xdf\\x1e\\xb4\\xfd\\xf6\\xda\\x70\\x57\\xdc\\x77\\x9b\\x0f\\xcd\\x67\\x7f\\x3d\\xfb\\xab\\x35\\xfb\\xeb\\x9b\\xfd\\xbe\\x69\\x4b\\x69\\xbf\\xff\\xe5\\xec\\xd7\\x67\\xe7\\x67\\xff\\x72\\xf6\\x6b\\xeb\\xfd\\xd7\\xf6\\xb3\\x5f\\x1f\\xf4\\xfe\\xeb\\xfd\\xe6\\xfd\\x0b\\x96\\xf6\\x1d\\x45\\xd5\\x35\\x15\\xfc\\x4e\\x63\\xd8\\x14\\xc0\\x77\\xee\\x71\\x4b\\xb2\\xf0\\xfd\\x0d\\xfa\\x8f\\xcb\\x3a\\xac\\xf6\\xf8\\x37\\x67\\x7f\\x38\\xfb\\x83\\x75\\xf7\\x07\\xeb\\xee\\x0f\\x07\\xdd\\xfd\\xe1\\xbe\\x74\\xc5\\x4a\\x92\\xfc\\xf6\\x7e\\x78\\x7a\\x4d\\x5c\\xbf\\xbd\\x33\\xbf\\xae\\xd5\\xcf\\x6f\\x6f\\xcf\\x45\\x6b\\x09\\xf7\\xdb\\xb7\\x72\\x48\\x5c\\xb1\\xf8\\xf2\\x9b\\xdd\\x5f\\xbf\\xd9\\x5d\\xbc\\x38\\xfb\\xf6\\xc5\\xf3\\x10\\x3e\\xfa\\xe5\\xd9\\xc5\\x8b\\xa7\\x8f\\x5e\\xef\\xce\\x2e\\xbe\\xd6\\xff\\x74\\xae\\xcd\\x9b\\x4b\\xfb\\x8b\\xb3\\x5f\\x9d\\x7d\\x7a\\xf6\\xfb\\x3d\\x82\\xb8\\x85\\xd4\\x3e\\xfb\\xf4\\xf5\\xa0\\x5f\\xfa\\xf4\\x63\\xfb\\x8a\\xac\\x74\\xcb\\x27\\xf7\\x8f\\xb8\\xd6\\xe8\\xe7\\x93\\x77\\xe6\\xfb\\x15\\x97\\x7e\\x72\\x8d\\x8d\\xc3\\x8a\\x80\\x3e\\xb9\\x06\\x21\\xc2\\xe6\\xb0\\x36\\x19\\xb7\\xac\\x38\\xf7\\x93\\x3b\\xc8\\xe3\\x15\\x7c\\xfc\\xe4\\xad\\x94\\x44\\x6b\\xf2\\xfb\\xe4\\xfe\\xa9\\x81\\x37\\x57\\xe4\\x54\\x59\\x72\\x23\\x3a\\x5e\\x3a\\xf9\\xc2\\x1a\\xb4\\xd5\\x54\\x7e\\xf7\\x8e\\xe4\\x40\\x65\\xc5\\xe1\\x4b\\x97\\x8f\\xce\\x1e\\x59\\x97\\x8f\\xac\\xcb\\x47\\x07\\x5d\\x3e\\xb2\\x2e\\x1f\\xed\\xbb\\x7c\\x74\\xd0\\xe5\\x8a\\x31\\x7e\\x77\\x4f\\x60\\x65\\x73\\xf6\\x77\\x00\\x22\\x9b\\x7d\\xbd\\x13\\xe2\\x8c\\x61\\x25\\x7a\\x7e\\xf7\\xa6\\xbe\\x49\\x2b\\xc1\\xf6\\xbb\\x37\\xf1\\xa0\\xac\\x28\\xe9\\x77\\x6f\\xa5\\xf1\\x6b\\x81\\xac\\xaf\\x2c\\xcf\\xe6\\xdd\\x08\\x23\\xac\\x18\\xf6\\xb3\\x77\\x24\\x8c\\xba\\x5a\\xf3\\xcf\\xee\\x87\\x30\\xea\\x4a\\xa4\\x2d\\x1d\\x7f\\x7d\\xf6\\xe2\\xec\\x9b\\xb3\\x17\\x8b\\xde\\x3f\\xda\\xf6\\xf6\\x44\\x54\\x36\\xfb\\x5a\\x1a\\xac\\x24\\xe9\\x67\\xd7\\xa0\\x2c\\x6d\\xb6\\xf8\\xfc\\xad\\x2d\\xb6\\x64\\xed\\x91\\x9f\\xbc\\x13\\x71\\x73\\x5a\\xc9\\x8a\\xcf\\x6e\\x2f\\xc3\\xf3\\x26\\xa9\\x6e\\xd3\\x77\\x5d\\x89\\x94\\xcf\\x4e\\x46\\x03\\x5c\\x36\\x7f\\x7c\\x9f\\xf2\\x7f\\x93\\x5b\\xbe\\x78\\x2b\\x8b\\xfe\\xdb\\x02\\x5b\\xb6\\x1a\\x7c\\xd7\\xa9\\x69\\x73\\xf9\\x2f\\xfb\\xd2\\xae\\x64\\xcb\\xe7\\xef\\x28\\x05\\xca\\x6a\\xd0\\x9f\\xbf\\xa3\\x10\\x88\\xab\\x59\\x7e\\x7e\\x3f\\x42\\x20\\xae\\x94\\xe7\\xe7\\x77\\x66\\xec\\x23\\x83\\x7c\\x27\\x06\\x5a\\xd3\\xc0\\xe7\\x77\\x80\\xd3\\x2b\\x52\\xfb\\xfc\\xed\\x20\\x68\\xc5\\x03\\x9f\\x9f\\x0e\\xa7\\xd3\\xe6\\xca\\xde\\x23\\x03\\xad\\x15\\xf2\\x17\\xef\\x48\\xbb\\x6b\\x2f\\xd4\\x17\\xef\\x48\\xbb\\xb2\\xd9\\xe3\\x3b\\xd2\\xee\\xda\\x96\\xf8\\xe2\\xce\\xb4\\xbb\\xdd\\xd7\\x5e\\xe7\\xac\\xf6\\xf3\\x8b\\x7b\\xf1\\xb6\\xc5\\x15\\xf6\\xf9\\xe2\\x0e\\x10\\x7f\\xa5\\x53\\xbf\\x38\\x99\\x52\\xd7\\xf2\\xef\\x8f\\xdf\\x97\\x49\\xfd\\xc7\\xbb\\x9b\\xd4\\xab\\xfd\\xf9\\xe3\\x75\\x8d\\xbf\\xda\\x9f\\x3f\\xde\\x41\\x4a\\x6c\\x7e\\x66\\x5b\\x4a\\xac\\x49\\xe7\\x8f\\xb7\\x90\\x12\\x2b\\xe6\\xf8\\xe3\\xdf\\xc2\\xcc\\xba\\x11\\x04\\xbd\\x13\\xf0\\x8d\\x2b\\xf9\\xba\\xf9\\x8d\\xbb\\x0a\\x92\\xbc\\x5a\\xab\\xcd\\x4f\\xbc\\x23\\xe5\\xae\\xd1\\xd6\\xe6\\x97\\xd6\\x58\\x79\\xed\\x84\\xd9\\xfc\\xf1\\xed\\xf9\\xe0\\x16\\x23\\x5b\\x42\\x41\\xa7\\x6f\\xcc\\x67\\x9b\\xce\\xbd\\xcd\\x9f\\x7c\\xbe\\xe9\\x17\\xdd\\xfc\\xc9\\x36\\x00\\x3f\\xbd\\x8f\\x77\\x03\\x14\\x72\\xfa\\x0e\\xed\\xfd\\x9d\\xa7\\xd3\\xde\\x2d\\xc4\\x8d\\xac\\xc4\\xf6\\x66\\xaf\\x47\\xdc\\xe2\\xa7\\xcf\\xe6\\x14\\x81\\x74\\x7a\\x6f\\xf7\\x29\\xa1\\x4e\\x5f\\x88\\x5b\\x78\\x86\\xda\\x4a\\x01\\x6d\\xf6\\xfa\\xc5\\xed\\x49\\x7f\\xd3\\x00\\xd9\\xfc\\xc5\\x77\\x5b\\x9e\\xdd\\xcd\\x5f\\x74\\x13\\xe5\\x16\\x04\\xfb\\x9b\\xad\\xa9\\xff\\xe9\\x9d\\x5d\\xa0\\xab\\x61\\xff\\xe9\\x9e\\x70\\xc2\\x4a\\x81\\xfe\\xe9\\x1e\\x71\\xc2\\x9f\\xee\\x03\\x4d\\xfd\\xe9\\xed\\x5c\\xb8\\x22\\x9c\\x3f\\x7d\\x0f\\x6c\\xb2\\xda\\xd5\\x3b\\xe9\\xd2\\xfb\\x75\\xb7\\xaf\\x59\\xe6\\xce\\x83\\x3a\\x62\\x8a\\xad\\xf4\\xde\\xe3\\xb3\\x6f\\xce\\xa6\\xdd\\xcb\\x57\\x2f\\xee\\x3f\\x7e\\xb0\\xda\\xfe\\xeb\\xdf\\xba\\x8d\\xc9\\x78\\xfd\\xb7\\xdf\\x9d\\x3a\\xa1\\xcb\\xad\\x86\\x4f\\xf6\\x6c\\x76\\xff\\x7b\\xb9\\x1a\\xfe\\xc5\\x29\\xac\\x7c\\xff\\xe3\\x58\\x81\\xf9\\xdb\\x8c\\xe3\\xc8\\xf6\\xac\\x64\\xd8\\xee\\x4c\\x11\\xdc\\x8b\\xc3\\x18\\xe7\\x3d\\x4e\\x63\\xc5\\xaf\\xb7\\x94\\x68\\xf7\\x4c\\xd8\\x2b\\x35\\x72\\x87\\xe1\\xdc\\x86\\x47\\xef\\xd0\\xfd\\x77\\x5b\\x72\\xfc\\x0e\\x7d\\x5d\\x6e\\xed\\xc2\\xab\\x7b\\x5f\\xda\\x1b\\xbc\\xc7\\xaf\\xbe\\xaf\\x64\\x93\\x57\\x77\\xd7\\x8e\\x2b\\x02\\x78\\x75\\x2f\\x3e\\x8c\\xb2\\xf2\\x61\\xbc\\x3a\\x21\\xfa\\xb2\\x82\\xfb\\x1b\\x8d\\xef\\x7b\\xa7\\x56\\x64\\x7a\\xe4\\xbb\\x77\\x0e\\xe7\\xdd\\xe6\\x23\\xf7\\x1e\\xe1\\x3b\\xf2\\xad\\x3b\\x04\\xfd\\x6e\\x35\\x95\\x77\\xa2\\xa3\\xb5\\x75\\xfb\\xdd\\x3d\\x41\\xcc\\x15\\xe1\\x7f\\x77\\x77\\x57\\xe1\\x8a\\x21\\x2f\\xef\\x69\\x1f\\x57\\x22\\xe4\\xf2\\xee\\x9b\\xd6\\xfb\\xfa\\xe0\\xd9\\xcb\\x17\\x93\\xfe\\xf7\\xe9\\xc5\\xb3\\xd7\\x3f\\xff\\xd9\\x07\\xaf\\xe7\\xaf\\x7e\\xee\\xfe\\xff\\x00\\x00\\x00\\xff\\xff\\x6d\\x13\\x60\\x05\\xe2\\x1d\\x01\\x00\")\n\nfunc fontsRobotoRegularWebfontSvgBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoRegularWebfontSvg,\n\t\t\"fonts/roboto-regular-webfont.svg\",\n\t)\n}\n\nfunc fontsRobotoRegularWebfontSvg() (*asset, error) {\n\tbytes, err := fontsRobotoRegularWebfontSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-regular-webfont.svg\", size: 73186, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoRegularWebfontTtf = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xb4\\x7c\\x07\\x7c\\x14\\xd5\\xf6\\xff\\xb9\\xd3\\xb6\\x97\\xd9\\x9a\\x9e\\xdd\\x6c\\x1a\\xd9\\x24\\x1b\\x76\\x13\\xc2\\xd2\\xa5\\x17\\xc1\\x48\\x91\\x00\\x8a\\xf4\\x0e\\x02\\x2a\\x45\\xa5\\x08\\x28\\x45\\x8a\\x52\\x04\\x89\\x80\\x28\\xa8\\x20\\xe8\\x9d\\x4d\\x78\\x2a\\x82\\xa0\\xb2\\x08\\x28\\x3c\\xf5\\x3d\\x63\\x41\\x11\\xeb\\x63\\x09\\x36\\xfc\\x3d\\x7d\\x94\\xcc\\xfc\\x3f\\xf7\\xce\\x6e\\x0a\\x82\\xfa\\xde\\xe7\\xf3\\x27\\xec\\xee\\xec\\xcc\\xec\\xcc\\x3d\\xe5\\x9e\\xf3\\x3d\\xe7\\x9e\\x33\\x80\\x00\\xc0\\x8e\\x00\\x38\\x28\\xe9\\xde\\x7d\\x60\\xdf\\x09\\xdc\\x6f\\xef\\x01\\xa0\\x76\\x00\\x90\\xd6\\xa3\\x6b\\xb7\\xee\\xcc\\x45\\xf4\\x01\\x00\\xaa\\x04\\x80\\xc2\\x1e\\x15\\xb7\\x0c\\x78\\xb5\\xc3\\xe2\\x4e\\x00\\x68\\x09\\x80\\x79\\x78\\x8f\\x01\\x83\\x3a\\xe7\\xbe\\xe5\\xf9\\x10\\xc0\\xf2\\x0d\\x00\\x8c\\xb8\\x65\\x40\\x20\\xf8\\xf2\\xaf\\x57\\x57\\x02\\x58\\xbb\\x92\\xef\\xa3\\xa7\\x8e\\x9c\\xfe\\xed\\xbb\\x9d\\x0b\\x00\\xac\\x3b\\x00\\xd0\\x57\\xa3\\x67\\xdd\\xe3\\x31\\xbd\\x22\\x96\\x00\\xd8\\x96\\x01\\x40\\xeb\\x71\\xd3\\xc7\\x4f\\x1d\\x50\\x13\\x78\\x0e\\xc0\\x76\\x18\\x80\\x19\\x3b\\x7e\\xe4\\xdd\\xd3\\x01\\xc0\\x0a\\xe0\\xcc\\x07\\x00\\xed\\xf8\\x29\\x73\\xc7\\x3d\\x36\\x6f\\x36\\x0f\\xe0\\x2c\\x01\\x58\\xe3\\x99\\x30\\x76\\xe4\\x18\\x3e\\xbc\\xa4\\x14\\x60\\x47\\x05\\x00\\xb4\\x9a\\x30\\x61\\xec\\x48\\xcb\\x83\\x42\\x57\\x80\\x1d\\xe4\\x7a\\xd9\\x13\\xa6\\xde\\x33\\xe7\\xd8\\x03\\xfd\\xbf\\x06\\xd8\\xb1\\x07\\x80\\x7d\\x7e\\xca\\x5d\\xa3\\x47\\x4e\\xfd\\xb4\\xcf\\xeb\\x00\\xcf\\x0f\\x04\\x40\\xb5\\x53\\x47\\xce\\x99\\xce\\x68\\xd0\\x76\\x80\\xdd\\x85\\x00\\xe0\\x99\\x36\\x72\\xea\\xd8\\x3e\\xdd\\xef\\xdf\\x03\\xb0\\xfb\\x66\\x00\\xb6\\xdf\\xf4\\xbb\\xee\\xbe\\x27\\xe5\\x81\\xe0\\xb3\\x00\\x7b\\x9f\\x04\\x60\\xbe\\x9d\\x3e\\x73\\xec\\xf4\\x2f\\x5b\\x56\\x66\\x03\\xe0\\x25\\x00\\xc8\\x3e\\x7b\\xec\\xa8\\x71\\x17\\x6e\\x19\\x30\\x04\\x40\\xda\\x04\\x00\\x02\\x00\\xe5\\x1e\\xbc\\xdb\\xfe\\xe9\\xbf\\xd3\\xcf\\x1e\\xaf\\x84\\xc8\\xe7\\xdf\\x17\\x3c\\x79\\x92\\x1e\\x31\\x93\\x51\\x91\\x3d\\xc0\\x00\\x0b\\x08\\xbe\\x05\\x04\\xdf\\xc1\\x77\\xc0\\xc0\\xbf\\x20\\x06\\x08\\x38\\x7a\\x44\\xbd\\x8a\\x1e\\x4a\\xa0\\x03\\x30\\x5d\\xbb\\xdf\\x3c\\x10\\xcc\\x53\\x46\\xde\\x33\\x0d\\x52\\xe8\\x71\\x50\\x14\\x7a\\xbc\\xe9\\x36\\x9a\\x3c\\x76\\xe6\\x34\\xd0\\xc6\\x7f\\x49\\xae\\xc3\\xd0\\x2b\\xe9\\xd9\\x27\\x01\\xb1\\xb9\\xf4\\xdc\\x52\\x98\\x09\\x33\\x61\\x0e\\xac\\x86\\x27\\x61\\x37\\x60\\xd8\\x8f\\x1e\\x40\\x8b\\x60\\x37\\x5a\\x86\\xd6\\xa2\\x3d\\xe8\\x4d\\x74\\x16\\x5d\\x64\\x38\\xa6\\x03\\xd3\\x95\\x19\\xce\\x60\\xe6\\x0c\\x73\\x81\\xb9\\xc8\\x5c\\x60\\x8d\\xb0\\xba\\xc9\\xdf\\x93\\x80\\xe3\\x7f\\xbb\\x1b\\xff\\x18\\x8e\\xb9\\xc0\\x5c\\x60\\x38\\x7a\\x7d\\xf2\\x87\\x60\\x28\\x18\\x80\\x87\\x30\\x38\\xa0\\x0d\\xe4\\x40\\x3b\\x70\\xc1\\x36\\x70\\xc1\\x11\\x70\\x01\\x0b\\x59\\x0a\\x86\\xc1\\xca\\x8f\\x30\\x54\\xf9\\x02\\x58\\x30\\x2a\\xdf\\x41\\x27\\xe5\\xff\\x60\\x84\\xf2\\x23\\x20\\x58\\xa6\\x7c\\x01\\x0c\\xf4\\x52\\x7e\\x80\\xa1\\xca\\x79\\x28\\x01\\x8b\\xfc\\x23\\x88\\xf2\\x8f\\x90\\x2e\\xff\\x08\\xd9\\x4a\\x14\\xca\\xc1\\x01\\x5d\\x95\\x33\\xd0\\x5d\\xa9\\x83\\x1e\\x4a\\x1d\\xf4\\x54\\xea\\xa0\\xb7\\x52\\x07\\xfd\\x95\\x3a\\x18\\xa8\\xd4\\xc1\\x20\\xe5\\x3b\\xa8\\x54\\xce\\xc3\\x10\\xe5\\x1c\\xdc\\xae\\x9c\\x83\\x45\\x4a\\x14\\x16\\x2b\\x51\\x58\\xa2\\x44\\xe1\\x21\\x25\\x0a\\x0f\\x2b\\x51\\x58\\xaa\\x44\\xe1\\x69\\xe5\\x0c\\x3c\\xa3\\x9c\\x81\\x1d\\xca\\x19\\xd8\\xa9\\x9c\\x81\\x67\\x95\\x33\\xf0\\x9c\\x72\\x06\\x76\\x29\\x75\\xb0\\x5b\\xa9\\x83\\x17\\x94\\x3a\\xd8\\xa3\\xd4\\xc1\\x5e\\xa5\\x0e\\x6a\\x94\\x3a\\xd8\\xa7\\xd4\\xc1\\xdf\\x94\\x3a\\x78\\x59\\xa9\\x83\\x57\\x94\\x3a\\x78\\x4d\\x39\\x0f\\x07\\x94\\xf3\\x70\\x50\\x39\\x0f\\xaf\\x2b\\xe7\\xe1\\x90\\x72\\x0e\\xde\\x50\\xce\\xc1\\x5b\\x4a\\x1d\\x7c\\x22\\xff\\x08\\x9f\\xc9\\x3f\\xc2\\x19\\x99\\x50\\x34\\x54\\x79\\x83\\xbe\\xbf\\x0b\\x0c\\x0c\\x06\\x33\\x2c\\x93\\x4f\\x83\\x00\\xe5\\xca\\x17\\x10\\x56\\xbe\\x81\\x36\\xca\\x05\\x68\\xa7\\x7c\\x0e\\xdb\\x94\\xcf\\xe1\\x88\\xf2\\x39\\xf0\\x50\\xae\\x9c\\x82\\xb0\\xf2\\x3d\\xb4\\x53\\xde\\x83\\x6d\\xca\\x7b\\x70\\x44\\x79\\x0f\\x34\\x30\\x48\\x39\\x04\\x43\\x95\\xf7\\x61\\xaa\\x32\\x11\\xe6\\x29\\x53\\x61\\x99\\xd2\\x15\\x9e\\x57\\xf6\\xc0\\x7e\\x65\\x3b\\x70\\x60\\x04\\x07\\x74\\x02\\x11\\x06\\x29\\x5f\\xc1\\x08\\xb0\\xd3\\x3d\\x16\\xe8\\x04\\x46\\x18\\xa4\\xd4\\xc1\\x08\\x30\\x83\\x19\\x74\\xca\\x57\\xf4\\x3c\\x93\\xf2\\x77\\xe8\\x04\\x36\\xe8\\xa5\\x9c\\x87\\x41\\xca\\xc7\\x30\\x58\\x39\\x4f\\x7f\\x33\\x55\\x79\\x11\\xe6\\x29\\x27\\x61\\x99\\xf2\\x14\\x3c\\xaf\\xbc\\x01\\xfb\\x95\\xc3\\xf0\\xb9\\xf2\\x0f\\x3a\\xf6\\x6f\\x41\\x80\\x22\\xe5\\x07\\x68\\xad\\xfc\\x00\\x55\\xca\\x0f\\xf0\\xa4\\xf2\\x03\\x6c\\x51\\x7e\\x80\\xad\\xca\\x0f\\xe0\\x00\\x1e\\xac\\xa0\\x07\\x6b\\x7c\\x14\\x36\\xe8\\xae\\x9c\\x83\\x1e\\xca\\x39\\xe8\\xa9\\x9c\\x83\\xde\\xca\\x39\\x18\\xa8\\x9c\\xa3\\x77\\xd8\\xa5\\x9c\\x83\\xdd\\xca\\x39\\x78\\x41\\x39\\x07\\x7b\\x94\\x73\\xb0\\x97\\xf2\\xeb\\x1c\\x7c\\x04\\x56\\xf8\\x18\\xac\\xf0\\x29\\x58\\xe1\\x34\\x58\\xc1\\x00\\xdd\\x95\\x0b\\xd0\\x43\\xb9\\x00\\x3d\\x95\\x0b\\xd0\\x5b\\xb9\\x00\\x03\\x95\\x0b\\xb0\\x4b\\xb9\\x00\\xbb\\x95\\x0b\\xf0\\x82\\x72\\x01\\xf6\\x28\\x17\\x60\\xaf\\x72\\x01\\xde\\x52\\x2e\\x00\\x0b\\xbd\\xc0\\x02\\x83\\x41\\x84\\xa1\\x20\\x02\\x82\\x5e\\x60\\x02\\x01\\x2c\\xca\\x12\\x10\\x95\\x25\\x90\\xae\\x2c\\x81\\x4f\\x94\\x25\\xf0\\x99\\xb2\\x04\\xce\\x28\\x4b\\x28\\x1d\\x17\\xa0\\xb5\\x72\\x01\\xaa\\x94\\x0b\\xf0\\xa4\\x72\\x01\\xb6\\x28\\x17\\x60\\xab\\x72\\x01\\x10\\x94\\x02\\x0f\\x7a\\x30\\x40\\x36\\xe4\\x42\\x1e\\xe4\\x43\\x0b\\x28\\x86\\x00\\x04\\x21\\x04\\xa5\\x50\\x06\\xe5\\x10\\x86\\x36\\xd0\\x0e\\xda\\x43\\x07\\xe8\\x05\\xfd\\x60\\x10\\x0c\\x81\\xa1\\x70\\x3b\\x0c\\x87\\x45\\xb0\\x18\\x96\\xc0\\x43\\xf0\\x30\\x2c\\x85\\xe5\\xb0\\x02\\x1e\\x81\\x95\\xb0\\x0a\\xd6\\xc2\\x7a\\xd8\\x00\\x8f\\xc3\\x46\\xd8\\x04\\xdb\\xe0\\x10\\xbc\\x01\\x47\\xe0\\x23\\xf8\\x18\\x3e\\x85\\xd3\\xc0\\xe8\\x2e\\x90\\x19\\xa9\\xa9\\xd0\\x6e\\x02\\x0f\\xa4\\x03\\x28\\x9f\\x2a\\xcb\\x94\\x53\\x4a\\x54\\xb9\\xa0\\x3c\\xab\\xec\\x84\\xff\\xe2\\x9f\\xfc\\xdd\\x7f\\x73\\xf6\\x8d\\xff\\x29\\xdf\\x2a\\xe7\\x94\\xe3\\xca\\x2f\\xff\\xc3\\x2f\\xbf\\xfe\\xaf\\xce\\xae\\x6b\\x76\\xcf\\xf3\\xca\\x87\\x00\\xca\\x52\\xe5\\xbc\\x12\\x53\\xbe\\xfc\\x0b\\xbf\\xfe\\x5e\\x7d\\x81\\xe3\\x9a\\xfd\\x3f\\x2a\\x7f\\xc4\\x07\\x5b\\xf3\\xd1\\x2a\\xdf\\xd0\\x4d\\x31\\xfe\\x22\\xdf\\x45\\xe5\\xdb\\xeb\\xde\\xef\\xfc\\x9f\\x8f\\xe9\\x0f\\x46\\xfb\\x1d\\xa1\\xf1\\x3a\\xfb\\x63\\xca\\xc7\\xf4\\xf3\\x19\\x65\\xf8\\xb5\\x54\\x2b\\x08\\xec\\x4d\\xbe\\x05\\x95\\x90\\xdc\\x64\\x0c\\xca\\x45\\xe5\\xa1\\x86\\xed\\x7f\\x29\\xe7\\x94\\x67\\x9a\\xfd\\xf6\\x16\\xe5\\xdf\\x44\\x82\\x4d\\xa5\\x28\\x4f\\x53\\x4e\\x29\\x9f\\x2b\\x33\\x00\\xc0\\x02\\xa0\\x3c\\x7f\\x83\\x91\\xae\\x57\\xf6\\x2a\\xcf\\x29\\xcf\\x29\\x92\\x52\\x03\\x56\\xfa\\x07\\xb2\\x42\\x8f\\xbc\\xa3\\x1c\\x52\\x5e\\x02\\x50\\xe6\\x2b\\x0f\\xc8\\x3f\\x53\\xce\\x59\\x94\\x9f\\x94\\x6a\\xe5\\x48\\xfc\\x97\\xfb\\x94\\x0f\\x94\\x7f\\x02\\x28\\x1f\\x34\\xb9\\x5a\\x8b\\xf8\\xe7\\x37\\xca\\xbf\\xe3\\x5b\\xe3\\x7e\\xaf\\x59\\xca\\x87\\xca\\x17\\x84\\x7a\\xca\\x01\\x73\\x7c\\xdf\\xcc\\xf8\\xe7\\xf7\\x0d\\x67\\x1d\\xb9\\xc1\\x88\\xbf\\x6b\\xd0\\x25\\x73\\x93\\xdd\\xa2\\x52\\x47\\xaf\\x27\\x2a\\xef\\x2b\\xe3\\x95\\x7f\\xfd\\xee\\x57\\x53\\x94\\x37\\x94\\x43\\xca\\xc7\\xca\\x21\\xe5\\x28\\x88\\x60\\x23\\x9a\\xa1\\xa4\\x80\\x89\\x1e\\xfb\\x44\\xb9\\x10\\x3f\\x6b\\x92\\xf2\\xb5\\xf2\\x14\\x88\\xca\\x4f\\x4a\\x4c\\xf9\\x4a\\x79\\x8a\\xee\\x34\\xa9\\xf7\\x6b\\xaa\\xbf\\x0d\\x57\\xfd\\xbe\\x51\\xca\\xd7\\xea\\xa1\\xf2\\xe3\\xf5\\xc7\\xdf\\x70\\xfc\\xe7\\x1b\\x1e\\xf9\\x93\\x79\\x45\\x78\\xab\\x5c\\x6c\\x7e\\x2d\\xf5\\x6a\\x09\\xae\\xff\\xf7\\xff\\x9a\\x5f\\xef\\x3a\\xc7\\x6f\\x68\\x1f\\x94\\x9f\\xfe\\xe7\\x7b\\x5e\\xf8\\x93\\xe3\\x3f\\x5f\\x7b\\x75\\xa5\\x2e\\xfe\\xdd\\x0a\\x09\\x9b\\xd0\\xe4\\x1a\\xca\\xc0\\x86\\x4d\\xdb\\x0d\\x2f\\x6a\\xa1\\xdc\\xfa\\xa5\\x39\\xff\\x95\\x61\\xcd\\xee\\xf2\\xd1\\x1f\\x8f\\x59\\xf9\\xe4\\x8f\\xc7\\x7d\\x83\\x5f\\xfe\\xf4\\xbf\\xf0\\x4a\\x29\\x55\\x86\\x2b\\x83\\x94\\x41\\xca\\x38\\x65\\x12\\x68\\xe8\\x1f\\xc8\\xad\\xe9\\x91\\xb5\\xca\\x3c\\x65\\x14\\x80\\x62\\x51\\x8c\\xb2\\x47\\x39\\x08\\x00\\xbc\\xf2\\xbe\\x32\\x49\\x79\\x98\\x1e\\x3d\\xdc\\xec\\x2a\\x4f\\x2a\\xc7\\x94\\xbd\\xcd\\x35\\xf8\\xda\\x39\\xa2\\x1c\\x6f\\xd8\\xda\\xa9\\xbc\\xa4\\x1c\\x54\\x5e\\x54\\x0e\\x2a\\x1f\\x50\\x4e\\xda\\x00\\xe4\\xd9\\xf4\\xc8\\x89\\xf8\\x19\\xaf\\x29\\x31\\xa5\\xad\\x12\\xbb\\xee\\x88\\x2f\\xfc\\x91\\x64\\x55\\xfb\\xf7\\xbb\\xbd\\x73\\xff\\x84\\x0b\\x9f\\x43\\x33\\xdb\\xd0\\xa0\\xe9\\x0c\\xb4\\x02\\x0b\\x58\\x00\\x81\\x48\\x31\\x40\\x3a\\xa4\\x03\\x82\\x1c\\xc8\\x01\\x06\\x72\\x21\\x17\\x58\\xc8\\x83\\x3c\\xe0\\x20\\x1f\\xf2\\x81\\x07\\x3f\\x14\\x12\\x1c\\x00\\x45\\xa0\\x81\\x62\\x28\\x06\\x2d\\x04\\x20\\x00\\x3a\\x28\\x81\\x96\\x20\\x40\\x10\\x82\\xc0\\x41\\x08\\x42\\xa0\\x87\\x72\\x28\\x07\\x03\\xb4\\x86\\xd6\\xa0\\x81\\x30\\x84\\xc1\\x08\\x6d\\xa0\\x0d\\x98\\xa0\\x2d\\xb4\\x05\\x33\\xb4\\x83\\x76\\x60\\x81\\xf6\\xd0\\x1e\\xac\\xd0\\x15\\xba\\x82\\x08\\xdd\\xa0\\x1b\\xc1\\x3f\\xd0\\x1d\\xec\\xd0\\x13\\x7a\\x82\\x03\\xfa\\x40\\x1f\\x70\\x42\\x05\\xdc\\x0a\\x4e\\xe8\\x0f\\xfd\\xc1\\x05\\x03\\x60\\x00\\xd8\\x60\\x10\\x0c\\x02\\x37\\x0c\\x81\\x21\\x90\\x04\\xc3\\x60\\x18\\x24\\xc3\\xed\\x70\\x3b\\x24\\xc1\\x1d\\x70\\x07\\xa4\\xc0\\x72\\x58\\x0e\\x2c\\xac\\x80\\x55\\xc0\\xc3\\x6a\\x78\\x0c\\x04\\x58\\x0b\\x6b\\x81\\x83\\x75\\xb0\\x0e\\x04\\x58\\x0f\\x9b\\x80\\x83\\x2a\\xd8\\x0a\\x1a\\xd8\\x06\\xdb\\xc0\\x02\\x4f\\xc3\\x73\\x20\\xc2\\x2e\\xd8\\x05\\x76\\xd8\\x0d\\x7b\\xc1\\x01\\xd5\\x50\\x0d\\x4e\\xa8\\x81\\x57\\xc0\\x05\\x87\\xe0\\x10\\x24\\xc1\\x61\\x38\\x0c\\x36\\x78\\x03\\xde\\x80\\x24\\x38\\x02\\x47\\xc0\\x02\\x9f\\xc0\\x27\\x80\\xe0\\x33\\xf8\\x0c\\x10\\x9c\\x81\\x33\\x80\\x80\\x81\\xd6\\xc0\\x03\\x0f\\x08\\xf4\\xa0\\x07\\x44\\x79\\x6a\\xa4\\xde\\xc0\\x49\\x39\\x6b\\xa4\\x9c\\x35\\x42\\x36\\x64\\xc7\\x39\\xeb\\x82\\x02\\x28\\x00\\x17\\xe5\\x66\\x1a\\xe5\\x9d\\x0b\\x4a\\xa1\\x14\\x5c\\xd0\\x0a\\x5a\\x41\\x32\\xe5\\xa0\\x96\\x72\\xd0\\x4d\\x39\\xa8\\xa3\\x1c\\x4c\\xa2\\x1c\\x34\\x51\\x0e\\xea\\x29\\x07\\xcd\\x94\\x83\\x2c\\x74\\x87\\x9e\\xc0\\x41\\x6f\\xe8\\x0d\\x1c\\xe5\\x1a\\x4f\\xb9\\x26\\x50\\xae\\xf1\\x30\\x10\\x06\\x02\\x07\\xb7\\xc1\\x6d\\xa0\\x81\\x4a\\xa8\\x04\\x2b\\xe5\\xa0\\x48\\x39\\x98\\x42\\x39\\x28\\x52\\x0e\\xa6\\xc2\\x5d\\x70\\x17\\x38\\x61\\x11\\x2c\\x05\\x86\\x72\\xd3\\x45\\xb9\\xe6\\x82\\xcd\\xb0\\x19\\x5c\\x94\\x77\\x6e\\xca\\x3b\\x3d\\xe5\\x1d\\x0b\\xbb\\x60\\x2f\\x70\\x94\\x6b\\x3c\\xe5\\x9a\\x00\\xaf\\xc1\\xeb\\x60\\xa5\\xbc\\x13\\x29\\xd7\\x44\\x78\\x13\\xde\\x04\\x17\\xbc\\x05\\x6f\\x01\\x47\\x39\\xa8\\x87\\x0f\\xa1\\x16\\x9c\\x14\\xd5\\x21\\xca\\x4d\\x23\\x45\\x77\\x2a\\x4f\\x8d\\x94\\xa7\\x46\\x60\\x20\\x89\\xf2\\x14\\x9a\\xf0\\x94\\xa1\\xdc\\x64\\x29\\x37\\x39\\xc8\\x89\\x6b\\x65\\x08\\x74\\x50\\x0e\\xed\\xc1\\x06\\x5d\\xa1\\x3b\\x24\\x53\\x0d\\x4a\\xa3\\x1a\\x94\\x0e\\x15\\x30\\x00\\x32\\xa8\\xd6\\x64\\x51\\x9a\\x7d\\x30\\x0c\\xee\\x80\\x6c\\x58\\x0e\\x9b\\x20\\x0f\\xaa\\x60\\x1b\\x94\\x53\\x4a\\xda\\x51\\x4a\\x3a\\x43\\x35\\xbc\\x02\\x3d\\x28\\xea\\xec\\x4b\\xc7\\x5a\\x01\\x1f\\xc1\\x67\\x70\\x2b\\x1d\\xd3\\xe0\\x86\\xf8\\xb2\\x18\\xda\\xfd\\x85\\xf8\\x12\\x00\\x4d\\x99\\x38\\x7e\\x64\\xb3\\xe8\\x92\\xa3\\x9f\\x5a\\x40\\x60\\x8b\\x7f\\x72\\x34\\x8a\\xbd\\x19\\x10\\xc5\\xe0\\x2c\\xe7\\x41\\x8f\\x02\\x0f\\x1c\\xbf\\x99\\x0f\\x01\\xa0\\x4c\\xf5\\x93\\x7d\\x1f\\xc6\\x31\\xf1\\x10\\x57\\xfd\\x77\\x16\\x98\\x1f\\x2b\\xc0\\x43\\x2c\\xaf\\x87\\x7c\\xef\\x71\\xd7\\x5d\\xe3\\xa1\\x13\\x98\\xae\\x70\\xc2\\x38\\x79\\x1c\\x80\\x76\\x36\\x33\\xc0\\x03\\x68\\xdb\\x2d\\x08\\x80\\x6b\\xc3\\x63\\x7a\\x1e\\xf9\\x39\\x1b\\x7f\\xa5\\xa9\\x11\\x37\\x7c\\x46\\xe3\\x69\\xf2\\x9d\\x03\\x62\\xf5\\x0a\\xc1\\x43\\xe3\\x20\\xe2\\xb9\\xe7\\x83\\x82\\x06\\xa0\\x39\\xcc\\x51\\xe6\\x33\\x8f\\xde\\xe3\\xf0\\xa4\\x78\\x32\\x3c\\x59\\x9e\\x5c\\x4f\\xc0\\xd3\\xc6\\x73\\xa7\\x67\\x8f\\x37\\x2b\\xe7\\xea\\x15\\x8e\\x52\\x4a\\xce\\xf6\\xc0\\x53\\xa8\\x7f\\xfc\\x6c\\xf0\\x58\\x3d\\x49\\x9e\\xb4\\xf8\\xd9\\xe1\\x86\\xb3\\x11\\xe1\\x91\\xf2\\x6f\\xe5\\x6b\\xe5\\x4d\\x65\\xba\\x72\\x73\\xbd\\x52\\x7f\\xfe\\xec\\xdb\\x67\\xdf\\x3c\\x7b\\xe8\\xec\\xeb\\x67\\x5f\\x3b\\xfb\\xca\\x59\\x7c\\xf6\\xb9\\xb3\\x8b\\xcf\\x96\\x7f\\xf1\\xe6\\xa7\\x31\\xfe\\xdb\\xf8\\x08\\xff\\xf2\\x3f\\x24\\x40\\xc3\\x4f\\x50\\x73\\x76\\xc5\\x77\\x02\\xb0\\x1c\\x2f\\x68\\xb4\\x3a\\xbd\\xc1\\x68\\x32\\x5b\\xac\\xa2\\xcd\\xee\\x70\\xba\\xdc\\x49\\xc9\\x29\\xa9\\x69\\xe9\\x19\\x99\\x1e\\x6f\\x96\\x2f\\x3b\\x27\\x37\\x2f\\xbf\\x45\\x81\\xbf\\xb0\\xa8\\x38\\x50\\xd2\\x32\\x18\\x2a\\x2d\\x6b\\x55\\xde\\x3a\\xdc\\xa6\\x6d\\xbb\\xf6\\x1d\\x3a\\x76\\xba\\xa9\\x73\\x97\\xae\\xdd\\xba\\xf7\\xe8\\xd9\\xab\\x77\\x9f\\x9b\\xfb\\xf6\\xbb\\xa5\\xe2\\xd6\\xfe\\x03\\x06\\x0e\\xba\\x6d\\x70\\xe5\\x90\\xa1\\xc3\\x6e\\xbf\\x63\\xf8\\x9d\\x23\\x46\\xc2\\xc3\\x4b\\x97\\x3f\\xb2\\x6e\\xd3\\xd6\\x67\\x9e\\xde\\xf1\\xec\\xce\\xe7\\x76\\xbd\\xb0\\x7b\\xcf\\xde\\x97\\x5e\\xc4\\x52\\xf5\\xbe\\x9a\\xbf\\xbd\\xf2\\xf2\\x81\\xd7\\x0e\\xbe\\x0e\\x33\\xc7\\x8c\\x9d\\xf8\\xf9\\x9c\\xed\\xd3\\x27\\x7f\\x33\\x6b\\x12\\x2c\\xdb\\x0c\\x77\\x03\\x8c\\xa7\\xde\\x01\\xa6\\x3c\\x00\\xcf\\xef\\x7f\\x70\\xf4\\x34\\xb2\\x3d\\x75\\xde\\x99\\x51\\x8b\\x1e\\xda\\xf8\\xe6\\x5b\\x1f\\xd6\\x7e\\x7a\\xfa\\xa3\\x8f\\x5f\\x85\\x37\\x8e\\xc0\\xd7\\x67\\xbf\\xfc\\xee\\x5f\\x30\\xf7\\x93\\xcf\\x60\\xc9\\xca\\xc5\\xab\\x56\\xac\\x79\\xf4\\xb1\\xd5\\x1b\\x1e\\x87\\xf5\\x4f\\x6e\\xa9\\x82\\xe8\\x51\\x02\\x54\\xef\\x8b\\x93\\xc9\\xb5\\xe1\\x5f\\x82\\x2a\\xd8\\x09\\x6b\\xe1\\x29\\x78\\x08\\x0e\\x40\\x14\\x8e\\x43\\x14\\x4e\\xc3\\x16\\xd8\\x0e\\x12\\x1c\\xa2\\xdf\\x37\\xc2\\x7a\\x78\\x8b\\x5a\\xbd\\x57\\x61\\x0d\\x74\\xe5\\x45\\x0c\\x85\\x18\\xec\\x7d\\xf0\\xcd\\x15\\x95\\xb8\\xf7\\xac\\x21\\x18\\x7c\\x1d\\x93\\xb0\\xe0\\xaf\\x6c\\x3f\\x84\\xee\\x9b\\x37\\xc4\\xf3\\x4f\\x8c\\xec\\xc5\\x49\\x45\\x18\\x15\\x7a\\x3e\\xc5\\x46\\x7f\\x11\\x66\\x0a\\xfb\\xf4\\xaf\\xec\\xe6\\x1b\\xe2\\x2d\\xc2\\x6c\\xe1\\xc4\\x24\\x0f\\xee\\x54\\x51\\xe9\\xc5\\x9d\\x86\\x14\\x61\\xae\\x90\\xfc\\xd4\\xeb\\xf3\\xde\\x57\\xf9\\x79\\xea\\xc9\\x21\\xa9\\x7d\\xfa\\x57\\x56\\xd6\\xa7\\x7e\\x3f\\x24\\xd5\\xe7\\xc5\\xbc\\xbf\\x12\\x77\\x9f\\x35\\x84\\x1e\\x18\\x32\\x24\\xa9\\x08\\xf3\\x85\\xa6\\xdb\\x87\\x16\\x61\\xa1\\x50\\xca\\x42\\xcb\\x2a\\x2a\\xb1\\x67\\xd9\\xed\\xb7\\xa7\\x62\\x18\\x52\\x84\\x35\\x85\\x52\\x36\\xdd\\xd5\\xa9\\x61\\x97\\xb6\\xd0\\x26\\x7a\\xc2\\x81\\x22\\xac\\x2b\\xf4\\xcc\\x23\\x37\\x39\\x92\\x7a\\x72\\x88\\x07\\xb3\\x39\\xbd\\x7c\\x1e\\xcc\\xe5\\xf6\\xc6\\x50\\x51\\xb9\\x62\\xec\\x8a\\x91\\x1e\\xb2\\xd1\\x3a\\xd5\\xeb\\x1d\\x92\\xba\\x82\\x7e\\xeb\\xaf\\x7e\\x23\\x37\\xd4\\xab\\xa3\\xb3\\xa6\\x5a\\xbd\\x43\\x8a\\xb0\\xa1\\xd0\\xf3\\x01\\x25\\xc7\\x58\\xe8\\x09\\x60\\x8d\\xff\\xf6\\x4a\\x8f\\xa7\\x87\\xaf\\xfb\\xc8\\x49\\x9e\\x4a\\xcf\\x98\\x51\\xea\\x25\\xc8\\x79\\x26\\x72\\x67\\x4f\\x38\\xe0\\x59\\xe1\\xe9\\xb1\\xa2\\xfb\\x48\\xdf\\x0a\\xcf\\x0a\\x1f\\xbd\\x9d\\x8f\\x5c\\x1c\\x77\\x6a\\x9d\\xea\\x1d\\x92\\xea\\x23\\x3b\\x70\\xa7\\xb1\\xe4\\xcb\\x90\\x22\\x6c\\xa6\\x77\\x6a\\x5f\\x9b\\xe4\\xf5\\xa6\\x7a\\x6a\\x57\\xf4\\xe9\\x5f\\xe9\\x59\\xe1\\xeb\\xe5\\xc1\\x30\\x28\\x3e\\x36\\x2f\\x3d\\xcd\\x52\\xe8\\xf3\\xd4\\xc6\\x6f\\xee\\xf3\\x54\\xf6\\x19\\x90\\xea\\xc5\\x68\\x48\\xe5\\x0a\\xcc\\xe5\\xf6\\xf2\\xad\\xf0\\x79\\x56\\xf4\\x5a\\xe1\\x1b\\x49\\x7e\\xa0\\xfe\\x84\\x7c\\x14\\x61\\x2b\\x11\\x83\\xcd\\x5f\\x84\\x45\\x42\\x00\\xd9\\xb0\\x5d\\x43\\xc0\\x0a\\xf2\\xe1\\x1b\\x39\\x69\\x44\\x53\\x4a\\xc8\\x4f\\xed\\x85\\x9e\\x15\\x9e\\x15\\x4b\\x09\\xdb\\x7a\\x8f\\xf1\\xad\\xd0\\x60\\x4f\\x45\\x65\\xbb\\xd4\\xc3\\x43\\x8a\\xb0\\xa3\\xb0\\x1a\\x3a\\xa1\\x4e\\x9d\\x3b\\xa3\\x3e\\xaf\\x58\\x61\\x34\\xd0\\x77\\x72\\xf2\\xa0\\x4a\\xf2\\xde\\xbf\\xd2\\x37\\xca\\x83\\xc1\\xd7\\x39\\x75\\x94\\x07\\x23\\x5f\\xe7\\x21\\x1e\\xdc\\xa9\\x7f\\x65\\x04\\x3c\\xd0\\x65\\x74\\xe7\\x08\\xf2\\xa0\\x2e\\xa3\\x3b\\x63\\xcf\\x68\\x9c\\x3c\\x36\\x2d\\x71\\x2f\\x67\\x21\\x46\\x5d\\x46\\xfb\\x30\\x74\\x19\\xed\\x2b\\x52\\x67\\x21\\xb1\\x02\\xc4\\x9a\\x77\\x05\\x60\\xc6\\xf0\\x83\\x80\\x25\\x88\\x42\\x42\\x10\\x68\\x17\\xd1\\x70\\x29\\xdf\\x07\\x25\\x81\\xff\\xac\\x5d\\x84\\x65\\x52\\xbe\\x0f\\x82\\xc4\\x92\\xdd\\x3c\\xd9\\x1d\\xd1\\x08\\xa9\\x57\\xdb\\x45\\x10\\xd9\\x1f\\x12\\xbd\\x62\\x8e\\x57\\xf4\\x76\\x65\\x3c\\x72\\x36\\xda\\x24\\x4f\\xe0\\x07\\x5d\\x7e\\xa1\\x2b\\x77\\x92\\xce\\xfa\\x17\\x00\\xd0\\x0c\\x1e\\xd3\\xeb\\x86\\x20\\x02\\x00\\x7e\\x09\\xe9\\x63\\x11\\x9e\\x01\\x3f\\xc2\\xda\\x00\\xe6\\x6a\\x31\\x04\\x25\\x8d\\x21\\x86\\x19\\xfa\\x21\\xe9\\x90\\x1f\\x24\\x1e\\x89\\x36\\xcc\\x85\\x4b\\x5a\\x86\\xca\\x42\\x4e\\x56\\x0c\\x89\\x2f\\x1c\\x3d\\x1a\\x7d\\xf7\\x5d\\x74\\x86\\xfd\\xe0\\x6a\\x31\\xb9\\x6e\\x05\\x67\\x65\\xfa\\x08\\xc4\\x2f\\x19\\xa0\\x03\\x60\\x08\\x60\\x21\\x54\\xc3\\xe8\\x41\\xcb\\xf9\\xb1\\x36\\x88\\xb0\\x31\\x80\\x51\\xad\\xc4\\x19\\x62\\x98\\xb3\\x4a\\x1a\\xe4\\x97\\xf4\\x86\\x98\\x64\\x42\\x7e\\x89\\x23\\x57\\xe6\\xc3\\x92\\x5e\\x23\\xda\\xb0\\x21\\x0c\\x25\\x2d\\xed\\xe5\\x62\\x48\\xd4\\x84\\xe8\\x7b\\x05\\x8a\\x8e\\xfd\\x27\\x8a\\x8e\\xe5\\xac\\x3f\\xa1\\x24\\xf9\\xe2\\xe5\\xff\\x20\\xab\\x7c\\xf1\\x32\\x30\\xd0\\x1d\\x80\\x7b\\x9a\\xc7\\x90\\x0a\\x99\\x68\\x30\\x44\\x52\\x00\\xfc\\x11\\xa7\\x2b\\x39\\x14\\x0a\\x45\\x34\\x0c\\xf8\\x23\\x5a\\x83\\x31\\x14\\x0a\\xd5\\x00\\x4a\\xd1\\x98\\xfc\\xd5\\x8c\\x98\\x96\\x9e\\xed\\x0e\\x49\\xc0\\xc7\\xaa\\x1d\\xee\\xa4\\xd4\\x6c\\x77\\xb0\\x86\\xe7\\xe8\\x21\\xd6\\x9a\\x91\\x49\\x0e\\xf1\\x7c\\xac\\x5a\\xd0\\xe9\\x4d\\xd9\\xee\\x20\\xc2\\x9e\\x00\\x4e\\xa9\\x95\\x92\\xed\\x31\\x9c\\x6c\\x95\\x5c\\xc8\\x2f\\x39\\xed\\xb1\\x88\\xd3\\xa5\\xf7\\x57\\x77\\x72\\xda\\x75\\xfe\\x6a\\xad\\xd3\\xa5\\xf5\\x4b\\x1a\\x7b\\x0c\\x6b\\x02\\x92\\xd6\\x1e\\x8b\\x68\\xb4\\xe4\\x98\\x86\\xd3\\xf9\\xb1\\xd3\\x2a\\x19\\x90\\x5f\\x32\\xda\\x63\\x92\\x17\\xf9\\x71\\xab\\x94\\xfd\\x1d\\xde\\xfb\\x65\\x3f\\x38\\xfd\\xfa\\xfd\\x1d\\xde\\xf9\\x65\\x1b\\xd9\\xc0\\x29\\xd6\\x6a\\x26\\x45\\x63\\xf7\\x57\\xb3\\xf4\\x5d\\x20\\xef\\x38\\xd9\\x5a\\xad\\x4b\\xd6\\xda\\xfd\\xd8\\x65\\xad\\xd6\\xbb\\x0c\\x76\\x72\\xa9\\x6a\\x93\\xd3\\x68\\xf7\\x57\\x5b\\xe9\\xbb\\x48\\xdf\\x1d\\xe4\\x9d\\x9c\\xe3\\xa6\\xe7\\x24\\x5b\\xab\\x93\\xe8\\xaf\\x52\\xac\\xd5\\xa9\\x89\\xeb\\xa4\\x25\\xae\\x93\\x4e\\xce\\xa9\\xce\\x48\\x9c\\x99\\x49\\xf6\\xb3\\x9d\\xac\\x0c\\x4b\\x48\\xb5\\x8a\\x84\\x17\\xc4\\xba\\x17\\x5f\\xf3\\x0f\\x77\\x4a\\x21\\x82\\x28\\xf3\\xda\\xbd\\x65\\x5e\\x7b\\x88\\x25\\xaf\\x90\\xd3\\x47\\x5f\\x3e\\x3b\\x79\\x95\\x7b\\xed\\xbe\\xee\\x48\\xdb\\x55\\x01\\x94\\xd6\\x7f\\x63\\x7f\\x50\\xfa\\x6f\\xec\\xff\\xf6\\x57\\x5d\\x4f\\xff\\x56\\xb1\\xa9\\x42\\xa9\\xd8\\x58\\x51\\x0d\\x4a\\x57\\x05\\x6d\\x5e\\x89\\x6e\\x5f\\x8d\\x9e\\x92\\x47\\x90\\xd7\\x6a\\x79\\xc7\\x4a\\x79\\x1c\\xda\\x4c\\x5e\\x2b\\xd1\\xed\\xaa\\xbe\\xcf\\x54\\x4a\\x38\\xa7\\xb0\\x05\\x0a\\x61\\x13\\x44\\x0a\\x00\\xfc\\x38\\x2f\\x24\\xf1\\x42\\x2c\\x52\\xc0\\x13\\x8e\\x16\\xb4\\xd0\\xf9\\x23\\x22\\x03\\x7e\\xec\\x08\\x49\\xa9\\x42\\x2c\\x22\\xa6\\x92\\xdd\\xa2\\x4d\\xe7\\x47\\xb8\\x28\\x80\\xcd\\xb5\\x52\\x86\\x21\\x86\\xc1\\x53\\x2b\\x4a\\x8c\\x35\\x86\\x33\\xac\\x92\\x88\\xfc\\x92\\xc3\\x14\\xc3\\x2d\\xc8\\xbe\\x7c\\x53\\x0c\\x3b\\xac\\x92\\x16\\xf9\\x71\\x52\\x50\\xca\\x36\\xc4\\xb0\\x3b\\x28\\x15\\x23\\xbf\\xd4\\x22\\x43\\xb4\\x61\\x63\\x18\\xe7\\x8b\\xd5\\x06\\x3e\\xd5\\x9b\\xed\\x0e\\x4b\\x5a\\x87\\x68\\xc3\\x59\\x61\\x90\\x52\\x79\\xd1\\x56\\x03\\xc8\\xec\\xce\\xce\\x76\\x87\\x89\\x3e\\x86\\x1c\\xae\\x50\\xb0\\x55\\x59\\x69\\x6e\\x5e\\x31\\x2a\\x2b\\x6d\\x55\\x5e\\x16\\x72\\x66\\x20\\xa7\\xaf\\x34\\xd7\\x97\\x25\\x38\\x1d\\x2e\\x77\\x06\\x72\\x3a\\x04\\x8d\\xd3\\x57\\x56\\x8c\\x66\\x32\\xaf\\x57\\xcd\\x78\\xf0\\xb1\\x85\\x6b\\x4f\\x9c\\x3a\\xf8\\xec\\xd6\\xe7\\x5f\\x3d\\x32\\x7f\\xfa\\xac\\x7b\\xe7\\x6e\\x3d\\x79\\xf4\\x54\\xcd\\x96\\x3d\\x9f\\xa1\\xe7\\xf9\\xcd\\x8b\\xef\\x9f\\x3a\\x64\\x61\\xb0\\xfd\\xbb\\xbb\\x77\\xbe\\xe7\\xfc\\xfc\\x4c\\xd2\\x8f\\xc7\\x97\\x3d\\x7f\\xff\\xe4\\x91\\x73\\x5a\\x75\\x8e\\xee\\xda\\xf3\\x8e\\xfd\\xf0\\x21\\xdb\\x47\\x00\\x3c\\x4c\\x50\\xea\\xf8\\xc5\\x7c\\x14\\x4c\\x44\\xc3\\xa1\\x08\\xda\\xc2\\x0a\\x88\\xf8\\xc9\\x6c\\x6d\\xa9\\x89\\x45\\x38\\x06\\xfc\\x52\\x92\\x26\\x56\\xd3\\x3a\\xdb\\xcf\\x99\\xfc\\x52\\x6b\\x4d\\xac\\x46\\x34\\xd0\\x4d\\x51\\x13\\x43\\xb8\\x5d\\x00\\x43\\xad\\x64\\xb6\\xc7\\xb0\\xd9\\x2a\\x39\\x90\\x9f\\xe8\\x28\\xd6\\x5a\\x25\\x0f\\xf2\\x4b\\xc5\\xf6\\x18\\x2e\\xb6\\x4a\\xa5\\xc8\\x2f\\xe5\\xdb\\x63\\x52\\x7b\\xc2\\x2e\\xb3\\x68\\xab\\x36\\x70\\x69\\x99\\x84\\x0d\\xa5\\xc5\\xa2\\xad\\x3a\\x3d\\xdb\\x9f\\x91\\xed\\x0e\\x83\\xd4\\xba\\xa5\\x68\\x93\\xd2\\x32\\xc3\\x61\\x29\\x49\\x14\\x6d\\x52\\x7a\\x46\\x98\\x70\\xa4\\xac\\xb4\\x55\\x28\\xe8\\x4a\\x47\\x0e\\xc1\\x97\\x95\\x5b\\x4e\\xb9\\xd3\\x1e\\xa9\\xec\\xb0\\x23\\x37\\xca\\xf9\\x83\\xe3\\x13\\x76\\x2c\\x5f\\xbe\\xe3\\x99\\x65\\x2b\\x76\\xae\\xbd\\xf5\\xe6\\x5e\\x15\\xb7\\xf6\\xee\\x53\\x31\\x9a\\x79\\x7b\\x6a\\x7d\\x18\\xdd\\xb9\\x63\\xf9\\xb2\\x9d\\x3b\\x96\\xc6\\x0f\\xf4\\xef\\xd5\\xfb\\x56\\xae\\x4f\\xdf\\x05\\x2f\\xee\\x5d\\xd8\\x77\\xc1\\x9e\\x3d\\x0b\\x7a\\x8f\\x1f\\xd7\\xa7\\x6f\\xef\\x89\\x13\\x7b\\x5f\\x4d\\xe6\\x66\\x76\\xb9\\xb2\\x7a\\x57\\xbf\\x05\\x7b\\xf7\\x2e\\xe8\\xb7\\x70\\xcf\\x9e\\x85\\x7d\\xc6\\x8f\\xef\\xd3\\xaf\\xf7\\x84\\x09\\xbd\\x09\\x7a\\xeb\\xa4\\xd4\\x71\\xef\\xf1\\x51\\xf0\\x42\\x21\\x84\\x61\\x31\\x44\\x52\\x89\\x65\\xc8\\x24\\x8c\\xcb\\x61\\x63\\x11\\x1d\\x61\\x5c\\x39\\x1b\\x43\\xb8\\x0d\\x65\\x51\\x96\\x21\\x56\\x2d\\x64\\x81\\xd6\\x2f\\x15\\x19\\x62\\x38\\x4b\\x65\\x8b\\xd1\\x12\\xc3\\x46\\x95\\x6f\\x4e\\x4b\\x4c\\x6a\\x8b\\xfc\\x52\\x91\\x20\\xda\\x30\\x1b\\xc6\\xa5\\x62\\x8d\\x2e\\x33\\xa7\\x85\\x35\\xdb\\x1d\\xc6\\x46\\x1b\\xce\\x0f\\x63\\x87\\x18\\x11\\x53\\xd3\\xc2\\xe1\\x30\\x48\\x39\\xa9\\xa2\\x0d\\xa7\\x85\\x71\\xb9\\xb8\\x0f\\x04\\x63\\x52\\x8b\\x12\\x55\\x7d\\x4a\\x5b\\x95\\x53\\xb5\\x09\\x05\\x5d\\x4e\\x87\\x60\\x41\\xa8\\x03\\x2a\\x0b\\x39\\x04\\x8d\\x5b\\xe3\\xcb\\x33\\x23\\x5f\\x56\\xb6\\xca\\xa0\\x72\\xa4\\x31\\x23\\xbb\\xc3\\xe5\\x2e\\xef\\x80\\xca\\x28\\xaf\\x3a\\xad\\x5a\\xd9\\xef\\xe6\\xb7\\x5e\\xd8\\x7a\\x74\\xe2\\xf8\\xa9\\x68\\x60\\x8b\\x62\\xdc\\xaf\\xf7\\xab\\xcc\\xb7\\x83\\x2a\\xde\\x9c\\xf0\\x89\\xac\\x44\\x57\\x2f\\xed\\xb9\\xb2\\x83\\xbc\\x31\\x7f\\x58\\xdb\\x05\\xad\\x5a\\xad\\x08\\xb7\\x18\\xd9\\xef\\xd6\\x4a\\xb4\\xec\\xbe\\x97\\x6f\\x1f\\x5d\\xd5\\x7f\\xd7\\xcb\\x7f\\x5b\\x38\\x6a\\x4d\\x9f\\x0a\\x79\\xfc\\x4d\\x5b\\x2b\\x97\\x9c\\x1d\\xf2\\x05\\x3f\\xae\\x5d\\xc7\\xef\\x5e\\x9e\\xb1\\xb6\\x65\\x31\\xaa\\x4e\\xef\\xfa\\x00\\xb3\\xb7\\xec\\xee\\xae\\x77\\xe6\\x0e\\x69\\xd5\\x7e\\xf8\\x0c\\x75\\x1e\\x56\\x70\\x99\\xc8\\x45\\xed\\x77\\x0b\\x62\\xbd\\x89\\xe9\\xd6\\x71\\x7e\\x84\\x85\\x84\\xdd\\xa6\\x2f\\x4d\\xa3\\xc1\\x86\\x92\\x96\\xa9\\x88\\x38\\x03\\x62\\xa2\\xb9\\x4c\\xa4\\xfb\\xe9\\x0b\\x35\\x71\\x8c\\x60\\x89\\xdc\\x92\\xd9\\x22\\x8c\\x01\\x11\\xec\\x80\\xb0\\x8d\\x32\\x9a\\x98\\x7b\\x3b\\xf2\\x53\\xab\\x62\\x85\\xf2\\x4c\\x24\\x30\\xa2\\xd3\\x6a\\x73\\x6b\\x7c\\xb9\\xb0\\x04\\x75\\x78\\x49\\xc8\\x5d\\xfe\\xce\\x89\\x15\\xb9\\xc2\\x4b\\xf2\\x9b\\x4c\\x77\\x1d\\x5a\\xc1\\x14\\xdf\\x81\\xee\\x99\\x2c\\xe7\\xcb\\x3b\\x4d\\xf2\\x4e\\x39\\xff\\x9e\\x29\\x77\\x30\\x45\\xe4\\xda\\x82\\xdc\\x92\\xc9\\x6c\\x7a\\x6d\\xb6\\x56\\x32\\x35\\x5e\\xbb\\x95\\x4d\\x2c\\xb3\\x32\\x79\\xe5\\x21\\x17\\x88\\x4e\\x2b\\x68\\x7c\\xc2\\xd2\\x93\\xff\\x78\\x30\\x57\\x78\\x11\\x75\\x94\\xdf\\x78\\x51\\x90\\xb7\\x4c\\x44\\x5f\\xa2\\x3b\\x4c\\xe8\\x36\\xf4\\xf5\\xb4\\x29\\x77\\xd4\\x7f\\x20\\xcf\\xd2\\xc9\\xf7\\xd6\\xff\\xe3\\x0e\\x3a\\xee\\x34\\xe6\\x4e\\x76\\x30\\x8f\\xc1\\x0c\\x1e\\x88\\xb0\\xd4\\x21\\x5a\\x02\\x98\\xa9\\x95\\x78\\x7b\\x4c\\xb2\\x22\\xbf\\xc4\\x33\\x8d\\x3e\\x8a\\x67\\x43\\x6c\\x8e\\x9b\\xb7\\x6b\\x0c\\x28\\xcf\\x9e\\xd6\\x12\\xe5\\xeb\\xb7\\xeb\\x51\\x4e\\x89\\xfc\\xc1\\x1b\\x8b\\xf7\\xe1\\x25\\x47\\xb9\\xc0\\xe6\\xbb\\xd0\\x6d\\xf2\\x8e\\x69\\x4f\\x0e\\x91\\x2f\\x8e\\x40\\x99\\x72\\xec\\x0e\\x44\\xe2\\x9a\\x7e\\xb0\\x96\\x2b\\xe5\\xfe\\x06\\x06\\xe8\\x4f\\xbd\\xa4\\x26\\x24\\x21\\x6d\\x0c\\xf3\\xc1\\x08\\x20\\x62\\xd9\\x40\\xaf\\xf3\\x47\\x10\\x90\\x4d\\xc4\\x12\\x23\\x67\\x0c\\x60\\x7d\\x2d\\xf1\\xc5\\x3a\\xe2\\x3b\\x83\\x11\\x9d\\x9e\\x1c\\xd3\\x69\\x74\\xfe\\x88\\x5e\\x47\\x36\\xf5\\xa0\\xf3\\x13\\x4f\\xaa\\x1a\\x6c\\x31\\x24\\x7a\\x9d\\x5e\\xd1\\x27\\xf6\\x43\\x6b\\xa3\\x68\\x8d\\x3c\\x23\\xca\\xdc\\x11\\x41\\xcf\\xc9\\x43\\x22\\x72\\x19\\x7a\\x47\\x95\\x4f\\x89\\x2c\\xa3\\xb6\\xf0\\x39\\xf0\\x90\\x73\\x03\\x59\\x5f\\x4f\\xce\\x25\\xdd\\xa3\\x8f\\xcb\\x32\\x6a\\xf7\\xcc\\x5e\\xf9\\x94\\x7a\\x1d\\x1f\\x93\\xc2\\x98\\x98\\x1a\\x60\\x21\\x8b\\x5c\\x47\\x42\\x6c\\x8c\\xbc\\x10\\xe6\\x02\\x12\\x20\\x7f\\x0d\\x6b\\x24\\xd7\\x95\\xf8\\xc4\\xd8\\x9c\\x3e\\x74\\x9e\\x49\\xd9\\xbc\\x99\\xfc\\x76\\x3b\\x00\\x1a\\x07\\x27\\x80\\x85\\x16\\x4d\\x50\\x48\\x62\\x83\\x5c\\x82\\x68\\x0d\\x6b\\x88\\xd1\\x97\\x7a\\x09\\x82\\x3d\\xb6\\x47\\x4f\\x9c\\x20\\xbf\\xb7\\x2a\\x8b\\x59\\x37\\xc5\\x31\\x22\\x44\\x10\\x95\\x15\\x17\\x88\\x9f\\xe7\\x46\\x21\\x64\\x65\\x46\\x3c\\x57\\xbf\\x7d\\x9e\\x50\\x74\\xe9\\x1f\\x14\\xf7\\xcc\\x50\\xea\\x38\\x6b\\xdc\\x9e\\xb6\\x81\\x88\\x81\\xdc\\x48\\x64\\x13\\x96\\x94\\x0c\\x3a\\x4d\\xb5\\x99\\x86\\x46\\x9b\\x69\\x88\\x49\\xe9\\x71\\xeb\\x28\\x19\\xb8\\x30\\x95\\xbb\\x68\\xb5\\x85\\x82\\xb6\\x64\\x64\\x65\\x7c\\x59\\x8c\\x3a\\x71\\xcb\\x44\\xd5\\xb2\\xcd\\xb8\\x54\\xfb\\xd1\\xa5\\xdf\\x3e\\xfa\\xe8\\x72\\x74\\xc5\\xa2\\x45\\x4b\\x97\\x2f\\x5a\\xb4\\x8c\\xf1\\xa3\\x21\\xc8\\x85\\xfc\\xf2\\x87\\xf2\\x79\\xf9\\x39\\x39\\x26\\x7f\\x84\\x0a\\x7e\\x38\\xf8\\xc6\\xe1\\xd7\\xd1\\x0b\\x07\\x0f\\x1d\\x3a\\x48\\xe8\\xd8\\x0f\\xc0\\xec\\xe2\\x31\\xf0\\x04\\x8d\\x71\\xc4\\x56\\x31\\x64\\x44\\x88\\xb1\\x7a\\x0e\\x07\\x08\\x5e\\xa1\\x62\\xe1\\x28\\x2b\\x22\\x1c\\x4b\\x04\\xce\\x21\\x9d\\x9f\\x48\\x88\\x32\\x35\\x47\\xf4\\x89\\xfb\\xd1\\x8f\\x51\\xee\\xc2\\xea\\x56\\x97\\x2b\\xb8\\x9f\\xc8\\x35\\x47\\x02\\x70\\xb9\\x7c\\x14\\x52\\xe0\\x2e\\x88\\x98\\x09\\xa5\\x06\\x36\\x46\\x15\\x5a\\x72\\xb1\\xb1\\x88\\x8b\\x5e\\xc5\\x95\\x42\\xb4\\x2b\\x55\\x05\\x3a\\x56\\x0a\\x74\\xec\\xc8\\x2f\\x09\\x86\\x58\\x44\\xb0\\x93\\x13\\x04\\x93\\xce\\x1f\\xb1\\x0b\\x64\\xd3\\x6e\\xd6\\xf9\\xa5\\x34\\xe4\\x97\\xec\\xc9\\xa2\\x2d\\xc2\\x1a\\xf4\\xd4\\xdc\\x19\\xcc\\xa2\\x0d\\x5b\\xc2\\xd8\\x25\\x46\\x04\\xb0\\x87\\xa9\\x63\\xc8\\x05\\xd5\\xca\\x69\\x90\\xdb\\xeb\\xf4\\x96\\xa1\\x84\\x29\\x73\\xfa\\x46\\xf2\\x88\\xfb\\xee\\x48\\x6c\\xd5\\x02\\xf9\\x41\\x86\\x39\\x70\\xb5\\x02\\x7d\\xbe\\x70\\xd8\\x82\\x89\\x1b\\xd7\\x1c\\xe4\\x74\\x07\\x10\\x7c\\x2b\\xcd\\xfe\\x71\\xb9\\x7c\\x27\\xbf\\x79\\x29\\x63\\x5b\\xf3\\x7c\\xe5\\xd4\\x0d\\x55\\x2b\\x55\\x1d\\x1b\\xa3\\xd4\\xb1\\x57\\xf8\\x28\\x14\\xc0\\xa3\\x10\\xc9\\x27\\xb4\\xf0\\x6c\\x2c\\xc2\\xe7\\x93\\x61\\xf1\\x48\\xe7\\x8f\\xa4\\x11\\xb2\\x1c\\x6c\\x2c\\xe2\\x48\\x23\\xfb\\x1c\\x49\\x3a\\x7f\\x8d\\xc9\\x98\\x9f\\x66\\xf2\\x4b\\x26\\x22\\x56\\x3f\\x11\\x2b\\x71\\xfe\\x04\\x1e\\xb8\\x83\\x98\\xa1\\x68\\x40\\xca\\x31\\xc4\\xb0\\x48\\x10\\x42\\xa6\\x21\\x16\\x11\\x33\\x29\\xa8\\x30\\xea\\xfc\\x52\\x21\\xf2\\x4b\\x22\\x23\\xda\\xaa\\xf9\\xb4\\xac\\x7c\\xea\\x01\\x8d\\xbc\\x68\\x93\\x20\\x27\\x1c\\xc6\\x26\\x11\\x67\\x85\\xb1\\xc3\\x26\\x25\\x67\\x86\\x9b\\xe3\\x02\\x3f\\x2a\\x53\\x37\\x28\\xa9\\x79\\xb9\\x71\\x5b\\xaf\\x21\\xc0\\x80\\xf3\\x65\\x65\\x8f\\x61\\x0f\\xac\\xba\\x7f\\xde\\xea\\xf9\\xcb\\xf6\\xec\\x59\\x3c\\xf5\\x81\\xb9\\x77\\x3f\\x72\\x90\\xe1\\x2f\\x1d\\x3f\\xf1\\xd3\\xd4\\xa9\\x8b\\xa7\\xca\\x57\\xde\\x79\\x5b\\xbe\\x82\\xee\\x13\\xee\\x5e\\xb6\\xec\\xa1\\xa5\\x0b\\x37\\x2f\\xbe\\x77\\xde\\xa2\\xa5\\xd3\\x85\\x9d\\xff\\xfa\\xe8\\xed\\xa1\\xd5\\x01\\xff\\x2b\\x33\\xdf\\xfe\\xe6\\x23\\x35\\x23\\x59\\x0e\\xc0\\xf5\\xe7\\x31\\xe8\\xc1\\x02\\x95\\x10\\xd1\\x25\\xb4\\xa5\\x06\\x0c\\x3a\\xc6\\xe4\\xc7\\x5c\\x48\\x02\\x36\\x86\\x85\\x20\\xc2\\xd6\\x00\\xd6\\xd5\\x62\\x63\\x90\\x28\\x31\\x66\\x83\\x11\\x2d\\x35\\x15\\x5a\\x41\\xe7\\x8f\\xe8\\x28\\x54\\xd5\\x11\\xab\\x21\\x12\\x68\\x6f\\x00\\xd1\\x86\\x51\\x18\\x33\\x22\\x36\\x53\\xdf\\x8e\\x42\\x62\\xc8\\xe9\\x13\\x7d\\x24\\x88\\xc8\\xd3\\x94\\x33\\x8b\\xde\\x3b\\x7e\\xfc\\x88\\xdc\\x15\\x1d\\x10\\xec\\xa8\\xe2\\x2e\\xf6\\xe7\\xab\\x6d\\x36\\xcb\\x18\\x55\\x6c\\x66\\x5e\\x40\\x41\\x2a\\xa3\\x2d\\x4a\\x1d\\x67\\xe7\\x31\\x64\\xc2\\x5b\\x10\\x49\\x6f\\x90\\x51\\x7a\\x83\\x8c\\xac\\x44\\x46\\x76\\x2e\\x56\\x6d\\x4e\\xb7\\x6a\\xfd\\x35\\x6e\\x43\\xba\\xd5\\xe4\\x97\\xdc\\x5c\\x8c\\x22\\x6d\\x4b\\x6d\\xb5\\xd5\\x02\\x66\\xbf\\xc4\\x58\\x62\\x54\\x36\\x29\\x86\\x04\\x74\\xc6\\xb9\\x29\\x48\\x32\\x5b\\x8a\\x8f\\x83\\x64\\x31\\x17\\x1f\\x27\\x60\\xba\\xe3\\xb3\\x97\\x6e\\x21\\x18\\x9a\\xc7\\x16\\x2b\\xb6\\x1e\\xc6\\x66\\x2b\\xb6\\x1f\\xde\\xdf\\x71\\xf2\\x6f\\x63\\xc0\\xe9\\x37\\x54\\x3b\\xcc\\x76\\xbb\\x3f\\xe2\\x30\\xdb\\x49\\x48\\xe6\\x13\\xcc\\xa2\\x2d\\x0c\\xd8\\x51\\x8c\\x22\\x56\\xbb\\x43\\x05\\xb6\\x48\\xd2\\x12\\x33\\x9e\\x1e\\xc6\\x29\\xa2\\x24\\xda\\x88\\x26\\x9b\\x79\\xd1\\x16\\x01\\x6d\\x4a\\xf8\\x1a\\xb1\\xfa\\xb2\\x04\\x4d\\x9e\\xdd\\xeb\\xf4\\xb2\\x1d\\x50\\x79\\x2b\\x9b\\xd3\\xc1\\xf8\\xb2\\x72\\xb7\\x30\\x91\\xe5\\x53\\xe7\\xad\\x58\\x79\\xff\\x3d\\x13\\x92\\x76\\x0c\\x64\\x3e\\xa9\\x3f\\x55\\x52\\x3c\\xa3\\xf7\\xf1\\x7f\\xd5\\x7d\\xf9\\xea\\xaf\\x68\\xae\\x30\\x7b\\x31\\x7e\\x62\\x65\\x4d\\xf7\\x9e\\x22\\x9b\\xf9\\x92\\x3c\\x3e\\xab\\x88\\x61\\xe4\\x5f\\xbf\\x3c\\x2d\\xff\\x7a\\x42\\x95\\xe1\\x12\\xa5\\x8e\\x2b\\xa7\\x73\\x33\\x0f\\xa6\\x42\\x24\\x89\\x70\\x2b\\x23\\x61\\x87\\x0c\\x6c\\xac\\xc6\\x96\\x9d\\x44\\x60\\x9c\\x8d\\xcc\\xfc\\x7c\\x6a\\x92\\x52\\x89\\x49\\x0a\\xe2\\x54\\x2b\\x61\\x8a\\xe4\\x34\\xc4\\xa4\\x16\\xc8\\x2f\\x79\\x53\\x29\\x66\\xb3\\x25\\x11\\x28\\xe2\\x14\\x25\\xad\\x86\\x50\\x92\\x4d\\x60\\xad\\x33\\x8c\\x6d\\x22\\x99\\x99\\x06\\x1b\\xd6\\x86\\x31\\x27\\x62\\x4d\\x98\\x9a\\x2e\\x32\\x39\\xdd\\x9a\\x62\\xe4\\xcb\\x12\\xd2\\x51\\x07\\x14\\x0a\\xaa\\x24\\x81\\xbd\\x29\\xc1\\x4b\\x50\\xeb\\x7f\\xf5\\x59\\x57\\x52\\xd0\\x72\\x72\\xcf\\x27\\x0f\\x75\\xda\\x79\\xe7\\x5b\\xe7\\x7e\\x3b\\x55\\x2b\\x9f\\x3b\\xb2\\x7b\\xe1\\xdc\\xa5\\x8f\\x3d\\x38\\x76\\x75\\x0e\\xd3\\x16\\xb9\\x50\\x12\\xba\\x3d\\x2b\\x65\\x63\\x72\\xe6\\xe5\\xe3\\xee\\xd6\\x1d\\xe5\\x8b\\x7f\\xff\\x4a\\xfe\\x1a\\xb5\\x42\\x9a\\xe3\\x9f\\x9e\\xdc\\xf4\\xe8\\xfe\\xfe\\x5d\\xa9\\x5e\\xf4\\xa5\\x76\\x08\\x83\\x11\\xe6\\x42\\x44\\x4b\\xb0\\xbd\\x26\\x44\\x6d\\x35\\x51\\x53\\x84\\x4d\\x01\\xc9\\xac\\x06\\x48\\x1d\\xf7\\x5c\\x5a\\x4c\\xe3\\x22\\x6d\\xb1\\x19\\xeb\\x0f\\xf3\\x92\\xc6\\x79\\xc9\\x8c\\xf9\\xc3\\xd5\\x82\\x86\\xb7\\xfb\\xb1\\xd6\\x5a\\xad\\xd3\\xea\\xed\\x54\\x75\\x1b\\xc5\\x1a\\x11\\x34\\x3c\\x91\\xae\\x24\\xe8\\x8a\\x8b\\x51\\xb5\\xa0\\xd1\\xea\\xe2\\xa1\\x0b\\x02\\x09\\xb4\\x14\\xaf\\xa9\\x6e\\x07\\x18\\x56\\xe3\\x2b\\x4f\\x41\\xf6\\xbe\\xec\\x27\\xf2\\x7f\\x5e\\x6d\\x61\\x8d\\x5a\\x0b\\x2e\\x7e\\xc0\\x3b\\xab\\xaa\\xe4\\xa3\\x72\\xaa\\xfc\\xdc\\x96\\x2d\\xa8\\x92\\xc9\\x40\\x0c\\xc1\\x8f\\xe3\\x94\\x3a\\x2e\\x85\\x8f\\x82\\x1b\\x7c\\x10\\x80\\x85\\x10\\x71\\x12\\x09\\xa5\\x26\\xa0\\x63\\x11\\x1b\\xab\\xc9\\xf3\\x3a\\x75\\x26\\xbf\\x94\\x47\\x68\\x28\\xa1\\x12\\x4a\\x32\\xc4\\xb0\\x40\\x8c\\x09\\x09\\x30\\x92\\xac\\x52\\x06\\xf2\\x4b\\x36\\x43\\x0c\\xdb\\xac\\xd8\\x48\\x76\\x17\\x18\\x62\\xb8\\x20\\x20\\x19\\x0d\\x31\\xa9\\x25\\xf2\\x4b\\x05\\xd9\\xa2\\x6d\\x9f\\x8e\\x75\\xa6\\x7a\\x2d\\xd4\\xc2\\x10\\x51\\x4a\\x36\\x08\\x87\\x71\\x9e\\x28\\x59\\xd8\\x70\\x18\\x17\\xd9\\x24\\xa3\\x10\\xfe\\x3d\\x78\\x6c\\x30\\x28\\xe5\\x4d\\x24\\xd6\\x54\\x7a\\xe3\\xd6\\xcf\\x9f\\xfa\\xc0\\xf7\\x6f\\x1d\\xfe\\x65\\xe1\\xd4\\xf9\\x1b\\xe5\\x4b\\x1f\\xd4\\xca\\x57\\xa2\\x9b\\xe6\\xdf\\xbf\\x79\\xeb\\xdc\\xfb\\x9f\\x68\\xb1\\x78\\xd2\\x84\\x25\\x4b\\xc7\\x4f\\x5c\\x84\\x56\\xdc\\x7f\\xa0\\xb0\\xe0\\x85\\x99\\x87\\xdf\\x7f\\xff\\xf0\\xcc\\x17\\x0a\\x0a\\x0f\\xdc\\x7f\\xe2\\xc3\\x0f\\x4f\\x3d\\xb0\\x6a\\xf5\\xfd\\x73\\x36\\x6f\\x66\\x0a\\xee\\x7a\\xf8\\xe1\\xbb\\xa6\\xac\\x5e\\xae\\xea\\xeb\\x00\\xa5\\x8e\\x43\\x8d\\xfa\\xaa\\x4f\\xf8\\x4d\\xea\\x4d\\x72\\xd8\\x58\\x4d\\x52\\x86\\x9e\\x35\\xc5\\x5d\\x68\\xa3\\xbe\\xa6\\x52\\x17\\x8a\\xbd\\x6a\\x0a\\x81\\xe8\\x6b\\x2a\\x88\\x36\\xc9\\x64\\x0e\\x13\\xc4\\x5c\\xad\\x17\\xd9\\x24\\x4a\\xba\\xa8\\x17\\x6d\\xd8\\x14\\xc6\\x49\\xc4\\xf8\\xe0\\x0c\\xaa\\xbb\\x39\\x22\\x06\\x4a\\x3a\\x84\\x82\\x90\\x8c\\xac\\xe0\\xcb\\xca\\xcd\\x2b\\xcf\\x40\\x34\\x88\\x20\\x80\\x39\\xee\\x77\\xcb\\x55\\x92\\x07\\x20\\xcd\\x81\\x6f\\x90\\x46\\xfe\\xfa\\xdb\\xbe\\xdb\\x3a\\x66\\xb4\\x5d\\x30\\xe0\\xd1\\xbd\\x2d\\xd7\\x0d\\xfd\\xc7\\x7f\\xa2\\xab\\xe6\\x4e\\x7d\\xcc\\xb3\\x6e\\xd5\\x94\\x4d\\xec\\x07\\xa7\\x51\\x92\\xfc\\xb5\\x5c\\x27\\xef\\x94\\xbf\\x96\\xdf\\x4b\\xcf\\xd8\\x98\\x99\\xfc\\xe9\\x47\\x9d\\x7b\\xf4\\x42\\xfc\\xb7\\x8f\\xef\\x1f\\xde\\x6b\\xfe\\xa1\\x23\\x6f\\x10\\x5a\\x29\\x26\\xe1\\x5a\\xd1\\xdc\\x48\\x51\\x23\\x2a\\xa1\\xc0\\x82\\x60\\x12\\x2d\\x75\\x25\\x5c\\x90\\xf8\\x62\\x2c\\xd0\\x0f\\x9a\\x1d\\x89\\x67\\x45\\x28\\x3a\\x89\\x46\\x4f\\x9c\\x60\\xa7\\x10\\x8c\\xc2\\xc0\\x68\\x59\\x46\\xd3\\xb8\\x56\\xc0\\x83\\x0e\\xf2\\x01\\x0b\\x01\\x49\\x43\\x2e\\xa3\\x0f\\x60\\xa1\\x16\\x23\\x15\\xd1\\xb1\\x41\\x9a\\x2d\\xd0\\x09\\xcd\\xc0\\x96\\x81\\xbc\\x8d\\xee\\x1e\\x7d\\xbc\\x55\\x34\\x01\\xb9\\xb8\\x69\\x27\\x4e\\x00\\x82\\x1e\\x30\\x98\\x9d\\xcd\\x7e\\x09\\x3a\\x00\\x7b\\x19\\x72\\xf2\\x1a\\xa7\\x9b\\x77\\xf6\\x60\\x4b\\xea\\xdf\\x1f\\x34\\x88\\x09\\xa0\\x0f\\x36\\xa0\\xfb\\x8e\\xc7\\x6c\\x82\\xfd\\x9b\\xe3\\xaa\\xfc\\x36\\xa1\\x8d\\xec\\xa7\\xec\\x69\\x4a\\x53\\x8a\\x8a\\xd2\\x38\\x95\\x22\\x8e\\x52\\x14\\x27\\x80\\x4c\\x13\\x54\\xe6\\x75\\x6e\\x62\\x3b\\x5f\\x7d\\x9d\\xed\\x8c\\x36\\xee\\xd8\\x81\\x9e\\xda\\xb1\\x43\\xf5\\xc1\\xcb\\x60\\x30\\x7b\\x56\\xbd\\x67\\x79\\x59\\x4e\\x79\\x59\\x5e\\x4e\\x19\\x72\\x2e\\x63\\x6e\\x1b\\x34\\xa8\\x7e\\x37\\x5b\\x39\\xf8\\xc8\\x0f\\xa2\\xe0\\x38\\xff\\x96\\xfc\\xf0\\x06\\x60\\xa0\\x3d\\x00\\x3b\\x8b\\xea\\x4b\\x06\\x4c\\x53\\xa3\\x2f\\x29\\x4d\\x9f\\x40\\x1f\\x5c\\x73\\xf4\\x91\\xd9\\x14\\x7d\\xa4\\x22\\x3f\\x36\\x05\\xa5\\x0c\\x5b\\x0c\\x1b\\x83\\x24\\x90\\x8f\\xc3\\x11\\x1a\\xb4\\x66\\xa4\\x12\\xe0\\x61\\x75\\x85\\xc3\\x61\\x6c\\x17\\x23\\x7a\\x51\\x47\\x21\\x88\\x2b\\x8d\\x18\\x6e\\xc1\\x18\\x07\\x1f\\x89\\x59\\x62\\x46\\x4e\\x5f\\x07\\x54\\xde\\x08\\x3e\\x08\\x3b\\xdb\\xb3\\xb1\\x9a\\xe8\\xa7\\xab\\xee\\x69\\xe5\\x8e\\xa2\\x92\\x71\\xa3\\x07\\xce\\x98\\x38\\x6c\\xe1\\x01\\xe4\\x3d\\xc5\\x8d\\xda\\xfe\\xe6\\xf1\\x9a\\x07\\x6b\\xa7\\xb7\\xba\\x6d\\xd8\\x63\\xd3\\x6f\\xbf\\x77\\xfe\\x90\\x49\\x33\\x47\\x8f\\xb8\\xb2\\xe3\\xbd\\xf7\\x08\\xff\\x66\\xca\\x6d\\x85\\x23\\xfc\\x46\\x08\\x41\\x17\\x78\\x55\\xf5\\xb9\\xd8\\x12\\x92\\x32\\x34\\x31\\xba\\x2d\\x95\\xf3\\x31\\xdc\\x32\\x50\\x53\\xa0\\x01\\x2f\\xe7\\xc7\\x37\\x05\\x24\\xa7\\x26\\x86\\xb3\\x03\\x12\\x4b\\xc2\\xf0\\xae\\x74\\x3e\\xe4\\xd9\\x63\\x38\\x8f\\x1a\\xef\\x1a\\xc1\\x0e\\x99\\x9c\\x5f\\xea\\x16\\x37\\x7b\\x6f\\x5e\\x9e\\x41\\xcc\\x9e\\x19\\xb7\\xb7\\xe2\\x0e\\x87\\xa5\\x54\\xf6\\x12\\x4e\\x39\\x0c\\xd5\\x29\\xa9\\xed\\x3b\\x10\\x53\\x86\\x1a\\xb6\\xa8\\xdb\\xca\\x23\\x33\\x08\\xe5\\x87\\xc3\\xd8\\x2b\\x76\\xd2\\xe9\\x58\\x31\\xbb\\xa0\\xb8\\x65\\x59\\x1b\\x62\\xff\\x05\\x9b\\xa4\\xc9\\x22\\x0c\\xd1\\x15\\x88\\x36\\x5c\\x14\\x96\\x6e\\x2a\\x57\\xd3\\x1b\\x4e\\x11\\x27\\x13\\xd6\\xd8\\xc0\\xeb\\x01\\x56\\x20\\xfe\\x8b\\xc6\\x9c\\xb9\\xe5\\x29\\x88\\x3a\\x83\\x10\\x2b\\xd0\\xb9\\xa4\\x9e\\xc0\\x80\\x37\\xd8\\xaa\\xdc\\x6d\\x46\\x3e\\x0f\\x20\\xf5\\x40\\x6e\\xab\\x72\\x3b\\xf5\\x18\\x33\\xed\\xe8\\x5d\\x74\\x0f\\xba\\x1f\\x6d\\x10\\x75\\x67\\x3e\\xef\\x35\\xc9\\x1d\\x7c\\x74\\xc4\\xbc\\x15\\x36\\xf7\\xb7\\x3b\\x27\\x2e\\xec\\xc3\\x09\\x21\\x5d\\xfb\\xd0\\xfd\\xeb\\xb5\\x56\\xf9\\xb0\\x8c\\xe5\\x77\\xe5\\xe5\\x16\\x1b\\xaa\\x40\\x6d\\x2a\\xf7\\x75\\xc8\\xed\\xf2\\xf7\\xd1\\xf2\\x12\\x79\\x24\\x33\\xdd\\x70\\x53\\xef\\x4e\\x93\\x0a\\x11\\x62\\x02\\x29\\xe1\\xcc\\x79\\x4b\\xd0\\x19\\xf4\\x1c\\x63\\x93\\x8d\\xf2\\x80\\x5a\\xf9\\x9d\\x01\\x37\\x57\\xdc\\xf2\\xf3\\x11\\xc4\\xa2\\x70\\x69\\x2b\\xae\\xfe\\xe5\\x69\\x03\\xbe\\x7e\\x09\\xcd\\x47\\x2f\\xc8\\x41\\x79\\x95\\xbc\\x4c\\xee\\xe3\\xf7\\x4d\\x2e\\x08\\xa0\\x5f\\xd0\\xcc\\xd5\\xeb\\x5b\\x76\\x34\\xa6\\x5a\\x99\\x14\\xa3\\xf9\\x34\\x91\\x8f\\x03\\x80\\x4f\\xe1\\x31\\x68\\xc0\\x00\\x85\\xea\\x9c\\xc5\\xac\\xea\\x65\\x6a\\x04\\x2d\\x20\\x93\\x5f\\x12\\x88\\xa6\\x1b\\x03\\x34\\x46\\x92\\x10\\x71\\x0c\\xfa\\x70\\x49\\xcb\\x10\\x0a\\x21\\x1f\\xeb\\x65\\xed\\x5e\\xd6\\xe7\\x60\\x42\\xbb\\x98\\x82\\xe3\\xcb\\xea\\xb7\\xae\\x78\\x1b\\x9d\\xff\\x49\\xe0\\xf1\\xe5\\x0a\\x34\\x5b\\x5e\\xce\\xa4\\x31\\x1b\\x81\\x85\\x1a\\x00\\xee\\x25\\x1a\\x17\\xba\\xc1\\x03\\xa3\\xe3\\x96\\xc1\\xc2\\xc6\\x54\\x67\\xe6\\x21\\x56\\xd0\\x4d\\x6f\\x45\\xad\\xa0\\x97\\x4a\\xdd\\x42\\x5c\\x41\\x10\\x5b\\x54\\x3d\\x36\\x18\\x62\\x38\\x8d\\xb8\\x02\\xde\\x10\\x93\\xb2\\x90\\x5f\\x4a\\xb3\\x88\\xc4\\x39\\x83\\xe4\\xb6\\xd0\\x98\\x92\\x58\\x40\\x6d\\x18\\x7b\\x88\\x15\\x28\\x69\\x19\\x12\\xbd\\x41\\xae\\xd1\\xde\\xe7\\x78\\x55\\xfb\\xee\\x2d\\x4b\\x6c\\xd4\\xa0\\xd3\\xdf\\x20\\xe6\\x81\\xb1\\x4b\\x36\\xca\\xf5\\x67\\xe4\\x17\\xd0\\xa0\\x87\\x1f\\x9f\\xb7\\x48\\x5e\\x8d\\x3a\\x4e\\x5b\\xb1\\x61\\xa5\\x7c\\x9e\\xc7\\xd1\\xe8\\xc8\\x27\\x72\\xd2\\x4e\\x3c\\x7c\\xec\\x1f\\x9b\\x1f\\xba\\x6f\\xe1\\xda\\xcd\\x73\\xa7\\xcc\\xba\\x97\\xcc\\xe5\\x59\\x4a\\x1d\\xf7\\x1a\\x1f\\x05\\x1f\\x0c\\x87\\x88\\x17\\x12\\x21\\x81\\x37\\x31\\x29\\x55\\x20\\x42\\x68\\xb3\\x70\\x64\\x9f\\xc5\\x40\\x26\\x6a\\x36\\x25\\xc9\\x6e\\x88\\x61\\xbb\\x55\\x4a\\x46\\x7e\\x82\\x2c\\xd3\\xad\\x31\\xac\\x0d\\x4a\\x39\\xc8\\x2f\\x25\\xdb\\x45\\x1b\\xf6\\x86\\x41\\xb2\\xb8\\x44\\x9b\\xa4\\x4d\\x0f\\x27\\xe0\\x46\\x2b\\xb7\\xcb\\xe9\\x70\\x6a\\x68\\xa6\\x8c\\x71\\x8a\\x0e\\x1b\\x71\\x54\\x21\\xb7\\xc3\\xe9\\xd0\\x08\\xbe\\x2c\\x98\\x85\\xca\\x7f\\xfb\\x6d\\xed\\x6a\\xe6\\x60\\xcd\\x8e\\x9d\\x47\\x8e\\xec\\xdc\\x51\\x73\\x90\\x79\\x74\\xfd\\x2f\\xbf\\xc9\\xc7\\x99\\xdb\\x10\\x8b\\x4c\\xe8\\x4e\\xb4\\x64\\xe1\\xfb\\x82\\x20\\x3c\\x11\\x91\\x7f\\x8d\\xca\\x57\\xde\\x96\\x7f\\x95\\x9e\\x14\\x78\\xe1\\xe8\\xc3\\x2b\\xd0\\x70\\x60\\xa8\\x5c\\xea\\x78\\x0c\\x3a\\xb0\\x43\\x49\\x5c\\x2a\\xfa\\x84\\x54\\xec\\x44\\x14\\x8e\\x44\\xee\\x01\\xeb\\xad\\x04\\x6c\\x50\\x7b\\xe2\\x54\\x4d\\xb6\\xe8\\xf5\\xd0\\x1c\\x81\\x37\\x2f\\x14\\xb4\\xb5\\x47\\xa5\\x8c\\x1f\\xd5\\xa0\\x43\\x28\\x03\\x0d\\x95\\x9f\\x95\\xbf\\xba\\x7c\\xf9\\x44\\x2c\\x76\\xe2\\x32\\x8f\\xe5\\xed\\xf2\\xf9\\xb7\\xe5\\x98\\xfc\\xcc\\x66\\xa4\\x7f\\xef\\xf8\\x29\\xa4\\x57\\x6d\\x22\\xb9\\xf7\\x7d\\x3c\\x06\\x03\\xf4\\x88\\xdf\\x59\\x97\\xb8\\x33\\xc7\\xc6\\x6a\\x78\\x55\\xf5\\x78\\x96\\xaa\\x1e\\x19\\x44\\x22\\x7c\\xa7\\xa1\\xbd\\x8e\\xd5\\xf9\\xb1\\x3e\\xa8\\xc6\\xf1\\xf1\\xe0\\x5d\\x0d\\xdc\\xd5\\x57\\x0d\\xfb\\x5a\\xbd\\x9e\\xa9\\xaa\\x1f\\xcb\\x22\\x1e\\x57\\xc9\\x2d\\xaa\\xea\\x7f\\xdb\\xdc\\x78\\xdf\\xd9\\x94\\xe6\\x4e\\xea\\x7d\\x1b\\xef\\xa9\\xe5\\xe9\\x3d\\xb5\\xac\\xea\\x63\\xae\\x77\\xcf\\xf8\\x0d\\x0d\\xd7\\xdc\\xb0\\x86\\x7d\\xab\\x9e\\x61\\x36\\xd5\\x4f\\x20\\x37\\xd3\\x57\\xd5\\x3f\\xa0\\xde\\x6b\\x8e\\x52\\xc7\\xfd\\x83\\x8f\\x82\\x07\\x66\\x43\\x24\\x03\\x54\\xa6\\xaa\\x0a\\x62\\x64\\x63\\x11\\x23\\x55\\x10\\xa3\\x56\\xe7\\xaf\\x49\\x4a\\xce\\xe0\\x9a\\xab\\xbf\\xd5\\x10\\xc3\\x56\\x9a\\x3b\\xc7\\xba\\x20\\x85\\x04\\x9a\\x60\\xc4\\x45\\x93\\xb7\\xae\\x24\\x9d\\x9f\\xce\\x01\\x97\\x55\\xb4\\x49\\x5c\\x46\\x38\\x8c\\x53\\x45\\x2c\\x84\\x41\\x4a\\x22\\x7a\\x94\\x1a\\x96\\x8c\\xc9\\xa2\\xad\\x09\\x66\\xe5\\xdc\\x1a\\x1f\\x35\\x41\\x4e\\x51\\x75\\xfc\\xa2\\xb7\\xcc\\x2b\\x0a\\x9c\\xcf\\x03\\x73\\x50\\x87\\x2b\\x97\\x51\\x06\\xcb\\x1c\\xd0\\xbd\\xb4\\xf3\\xb9\\x77\\xbf\\xc1\\x0f\\x6c\\xcd\\x92\\xdf\\x60\\xb8\\x52\\x59\\x79\\x57\\xbe\\x22\\xbf\\xc0\\x74\\x46\\x85\\x48\\x87\\xfa\\xfd\\xfa\\xa6\\xb0\\x60\\xc7\\xe5\\xc3\\xf2\\x07\\x6f\\x5e\\xe9\\x5c\\x80\\xfa\\x54\\xd5\\x9f\\xaf\\x78\\x18\\xf5\\x53\\xf9\\xc9\\x23\\x2a\\xc7\\x8e\\x71\\xeb\\x11\\xc7\\xa8\\x98\\x0f\\xd5\\xe8\\x59\\xca\\x51\\x7d\\xa3\\x14\\x0d\\x74\\x5d\\x04\\x1b\\xd4\\x94\\x32\\xa7\\xc2\\x9b\\x84\\xfc\\x42\\xa2\\x57\\x0c\\x89\\x3e\\xd1\\x2b\\xd6\\x44\\x99\\xb7\\xa2\\xd1\\xfa\\xf6\\x3c\\xae\\x9f\\xc6\\xac\\xbd\\x5c\\xc1\\x2c\\xae\\x9f\\xa7\\xf2\\xf4\\x75\\x00\\xb4\\x84\\xe6\\x2d\\xbc\\x4d\\xe4\\x77\\x83\\x7c\\x87\\x18\\x12\\x5f\\x3f\\x4a\\x8c\\x91\\xfa\\xdb\\xce\\x4a\\x1d\\xfb\\x16\\x8f\\xc1\\x4e\\x74\\xce\\xdc\\x10\\x67\\x99\\x1b\\xe2\\x2c\\x1d\\xbd\\x94\\x23\\x80\\x6d\\xb5\\x34\\xdc\\x8d\\xc7\\xba\\x06\\x55\\xe9\\xd5\\xb8\\xc7\\x4c\\xbc\\x04\\x2f\\xda\\xb0\\xad\\x69\\xac\\x23\\x86\\x44\\x87\\xe0\\xcb\\xca\\xcb\\x2d\\x2b\\xed\\xcc\\x1c\\x5c\\x3e\\x6f\\xea\\x8a\\xe8\\x6f\\xd1\\x0f\\x1e\\x98\\x8d\\x1e\\x11\\x96\\x3e\\xb4\\xee\\x7e\\x2e\\xfd\\xca\\xd7\\x6f\\x7d\\x3b\\x79\\xdc\\x21\\x6d\\x5c\\x07\\x79\\x0f\\xb5\\x87\\x09\\x9e\\xe9\\x1a\\x79\\xc6\\x9a\\x28\\xcf\\x58\\xc2\\x33\\x4b\\x43\\x4a\\x85\\x09\\x4a\\x56\\x62\\x7e\\x59\\x13\\x35\\x7b\\x18\\xa9\\x31\\x09\\xa1\\x30\\x84\\x42\\x6e\\x1d\\xd2\\xf8\\x90\\x4f\\xac\\x89\\x6e\\x62\\x74\\x9f\\xb2\\xf5\\xef\\x30\\xc3\\xd9\\xba\\xfa\\x9f\\x77\\xf3\\xb8\\xfe\\x01\\x66\\x09\\x5f\\xdf\\xad\\xde\\xc9\\x33\\x8f\\xd5\\xdf\\x15\\xd7\\xff\\x02\\x9a\\x2f\\x89\\x5b\\x7b\\x72\\xa7\\x38\\x0f\\x85\\x04\\x0f\\x23\\x2c\\xd5\\x78\\x96\\x6f\\x48\\x94\\x50\\xe1\\x38\\x6b\\xa2\\x8c\\xc4\\xe3\\xcb\\xe7\\x1b\\xe7\\x92\\x40\\xe2\\x69\\xb1\\xc1\\xa6\\x6b\\x8c\\xa1\\x06\\x4a\\x12\\x99\\x4b\\xd1\\x10\\x93\\x2c\\x96\\x18\\x16\\x55\\x66\\x6a\\x88\\x2a\\x5b\\x25\\xbd\\x25\\x86\\xf5\\x01\\x6a\\xdb\\x45\\x0b\\x65\\x2b\\xd6\\x8a\\xd5\\x0c\\x6f\\x34\\x11\\x7f\\xac\\xa7\\x69\\x42\\x09\\x01\\x4d\\x97\\x98\\x29\\x3c\\xa1\\x94\\x22\\xa2\\x1f\\xf6\\x3c\\xe4\\x43\\x1a\\xbb\\x58\\x73\\x15\\xbd\\x27\\xa0\\xf7\\xae\\x46\\x1d\\xbc\\x9c\\xbf\\x58\\x2e\\xe0\\xed\\x3c\\xbe\\x32\\x92\\xdb\\x76\\xb9\\x82\\xe9\\xc4\\x54\\xa0\\x2b\\x77\\x71\\xab\\x51\\x7d\\x75\\xfd\\x61\\x68\\xa6\\xa7\\xdd\\x7f\\xa7\\xa7\\x4d\\x95\\xd3\\x60\\x95\\x38\\x75\\x94\\x74\\x75\\x8d\\x06\\xf7\\x0c\\x8d\\x01\\xb5\\xf1\\x01\\x49\\xac\\x2e\\x31\\x9c\\x72\\xa2\\xae\\x48\\x43\\xd4\\xf5\\xa0\\x10\\x8d\\xd6\\x77\\x11\\x78\\x7c\\xe5\\x49\\x86\\x1b\\x75\\xb9\\x82\\x1b\\xc7\\x5c\\x79\\x52\\xcd\\x9b\\xf1\\xcc\\xb5\\x79\\x33\\x21\\x91\\x37\\x13\\xfe\\x8b\\xbc\\x19\\x01\\x18\\x04\\xcd\\x7b\\x49\\xbc\\x69\\x0b\\x05\\x6d\\x65\\x62\\x29\\x43\\xdc\\xc2\\x0c\\xd4\\x11\\x14\\xa4\\x45\\x7d\\xe4\\x7d\\xf2\\x7f\\x14\\xf9\\x8d\\xe8\\xc9\\x3d\\x2f\\x7f\\xf4\\xf1\\xdf\\xf6\\x9c\\xa4\\x5e\\x40\\x8f\\x46\\xc9\\xdb\\xe4\\x7f\\xcb\\xf5\\xf2\\xbf\\xe5\\xa7\\xd0\\x08\\x64\\x38\\xa1\\x00\\x28\\xef\\x20\\xfe\\x18\\x02\\x05\\x8e\\x41\\xdc\\x0f\\xbc\\x4b\\xf3\\x22\\x76\\xe8\\xdc\\xd4\\x2a\\xda\\xd9\\x58\\x8d\\xce\\x40\\xf5\\x51\\xd7\\xdc\\x1d\\x18\\x82\\xc4\\x23\\x58\\x90\\x9f\\x3a\\x64\\xe2\\x11\\x24\\xbb\\x41\\x6c\\xe6\\x7c\\x39\\x9f\\x37\\x19\\x35\\xf8\\x5b\\xa6\\x28\\x86\\x18\\x59\\x8e\\xc9\\x9b\\xd0\\x84\\xf5\\x6b\\xd7\\xad\\x93\\x37\\xf1\\xf8\\xa7\\x23\\x6f\\x7f\\x5f\\xff\\x0a\\xf3\\xd5\\xb6\\xb9\\x73\\x9f\\x56\\x73\\x8c\\x49\\x7c\\x5b\\x3e\\x0a\\x76\\xf0\\x42\\x3f\\x88\\x88\\x84\\x57\\xee\\x04\\xaf\\x32\\x08\\xaf\\xb2\\xe8\\x00\\x1c\\x06\\xba\\x28\\x95\\x12\\xe7\\x95\\x0f\\xf9\\xa5\\x14\\x87\\x68\\x8b\\x98\\x45\\x8e\\xe0\\x5b\\xad\\x28\\x19\\x4c\\x04\\xcc\\xb9\\x45\\xc2\\x40\\x73\\xc2\\x9b\\x52\\xfe\\xd1\\x75\\x03\\x1a\\x05\\xdd\\x88\\x8b\\x63\\x86\\xfe\\xb6\\x54\\xbe\\xd0\\x7a\\x6e\\xa7\\x1b\\xb3\\x72\\xf5\\xc5\\x81\\xb1\\x07\\x11\\x72\\xbb\\x6f\\xcc\\xcf\\xef\\xf9\\x97\\x20\\x05\\x7c\\x30\\x36\\xae\\x6d\\xd6\\x78\\xe4\\xee\\x63\\x63\\x35\\xc9\\xa9\\x94\\xa5\\xc9\\x84\\xa5\\x2a\\x32\\x48\\x21\\x21\\x5f\\x10\\xa7\\xa8\\x51\\x5f\\x66\\x90\\x84\\xba\\x98\\x57\\xc1\\x81\\x23\\x45\\x9d\\xf2\\x46\\x11\\x8b\\x61\\x90\\x92\\x41\\xc5\\x3b\\xa9\\x14\\xef\\xf8\\x1a\\x59\\x1e\\x8f\\x6f\\xd3\\x91\\xc3\\xe5\\x76\\xfa\\x8a\\x11\\x5d\\x30\\x6a\\x26\\x02\\xcb\\x8f\\x57\\xef\\x9d\\x3e\\x67\\x62\\x46\\xce\\x3b\\x79\\xae\\x15\\xf7\\xc8\\x6b\\x51\\xab\\xe7\\xd6\\xad\\xd9\\x28\\xff\\x8d\\x7f\\xe9\\x9f\\x27\\xa6\\x3f\\xdb\\x32\\xef\\xa5\\x07\\x97\\x77\\x9d\\x92\\x95\\x94\\xb5\\xa4\\xfb\\x43\\xb3\\x1e\\xad\\x5f\\xce\\xda\\x16\\x2c\\xba\\x7f\\x29\\x20\\x1a\\xd3\\xaf\\xe5\\xa3\\x50\\x04\\x73\\xae\\x9f\\x43\\x14\\x09\\x65\\x69\\x6c\\x2c\\x92\\x26\\x92\\x7d\\x69\\x49\\x04\\xf3\\x14\\xd3\\xd5\\xc5\\x4c\\x43\\x0c\\x17\\x26\\x56\\x17\\x33\\x55\\xb3\\x9f\\x1c\\x94\\x72\\x88\\xd6\\xb8\\x83\\x41\\x29\\x40\\x84\\x98\\x29\\xda\\x6a\\x78\\xa3\\xe8\\xcb\\x27\\x73\\x3f\\x47\\xc4\\x8e\\x30\\x48\\x69\\xbc\\x68\\xab\\x06\\xb3\\x3b\\xe7\\x77\\x6b\\x88\\xb9\\xd9\\x65\\xa5\\xd9\\xa1\\xa0\\xdb\\xa5\\x49\\x40\\xa3\\x86\\x45\\x44\\x8e\\x98\\xe0\\xf2\\xd2\\x71\\xcc\\x81\\x53\\x9b\\x36\\xbc\\xf8\\xf8\\xa1\\x7f\\xc9\\xf5\\xc8\\x7d\\xe6\\xc7\\xd5\\xcb\\x11\\x73\\x60\\xd7\\xd6\\x75\\x5b\\x76\\x1f\\xfa\\xee\\x27\\xf9\\xec\\xb9\\x4f\\x9f\\x7f\\x06\\xa1\\x2d\\xc2\\xca\\xb5\\xf3\\xa7\\x8c\\x59\\x5a\\x5c\\x5e\\xfb\\xf4\\xee\\x6f\\x16\\x2f\\xd8\\x29\\x08\\xc2\\xc2\\xad\\x0f\\x4d\\xbe\\x73\\x41\\x49\\xf8\\xcc\\x0e\\x5c\\x3b\\xeb\\xee\\xd7\\x79\\xd5\\xce\\x65\\x01\\x70\\xab\\x29\\x46\\x6e\\x03\\x11\\xa1\\x61\\x76\\x00\\x4b\\xc2\\x4f\\x1a\\xd6\\x0a\\xb5\\x64\\x1e\\x44\\x78\\x9a\\xed\\xe5\\x59\\x9d\\x3f\\x22\\xd0\\xe5\\x57\\x01\\x74\\xfe\\x26\\x11\\xa2\\x57\\xf4\\x89\\x59\\xdc\\x14\\xb9\\x30\\xca\\x3b\\xab\\xaa\\x2e\\xd7\\xf1\\x4e\\x7a\\xfd\\x75\\x4a\\x1d\\xf7\\x19\\xb5\\xa3\\xe5\\x10\\xb1\\x10\\xfe\\x0a\\x71\\x9b\\x8c\\xf5\\x0d\\x66\\x94\\xc4\\xcc\\xac\\x95\\x5c\\x8c\\xe6\\x41\\x88\\xe1\\xd4\\xb1\\x34\\x81\\x4c\\xcd\\x43\\x48\\x6c\\x74\\x44\\x9c\\x2f\\x2b\\x7b\\x5d\\xf4\\xc0\\xe6\\xa7\\xdf\\x8e\\xca\\xef\\x5c\\xfa\\x49\\xfe\\x10\\x7d\\xc8\\x9e\\xbe\\x9a\\xb3\\xf3\\x85\\x17\\x76\\x92\\xcf\\x1f\\xae\\xd6\\xab\\x74\\xb9\\x00\\xb8\\x4b\\x14\\x0b\\x79\\xe3\\xd9\\x50\\x20\\xf7\\x14\\x42\\x04\\xff\\x50\\x90\\x23\\x81\\x2e\\x91\\x07\\x0a\\x21\\x77\\xa8\\x9c\\x60\\x7e\\x57\\x2d\\x9a\\xe3\\x15\\xbc\\x68\\xce\\x87\\xf5\\x5f\\xef\\xe2\\xf1\\x95\\xfd\\x77\\xdf\\xcd\\x75\\xbf\\x5c\\x01\\x08\\x5a\\x01\\x08\\x7f\\xe7\\x31\\x38\\xe1\\x03\\x35\\xef\\x13\\x31\\x5b\\x1c\\xa1\\x50\\x88\\x5e\\xb6\\x06\\x09\\x1a\\x62\\xdc\\x43\\x08\\xbb\\x28\\x41\\xc8\\x10\\xc3\\xc8\\x2a\\x19\\x91\\x9f\\x2e\\x40\\xb9\\xd5\\x98\\xee\\x8d\\x3d\\x3f\\xcf\\xa6\\xa9\\x2c\\xb0\\x62\\xe7\\x61\\x33\\x46\\x56\\xcc\\x1c\\xde\\xdf\\x7e\\xdb\\x0f\\xaf\\xa8\\x49\\x4b\\xa1\\xd8\\x8c\\xf9\\xc3\\x92\\xdd\\x75\\x89\\xc7\\x8e\\xc3\\xfb\\xdf\\x9c\\xf8\\xc3\\x13\\xf4\\x74\\x4b\\xb1\\x19\\x5b\\x0f\\x4b\\x5a\\xf7\\x25\\x1e\\x6b\\x0e\\xef\\xef\\x30\\xee\\xe7\\xb7\\xd5\\xd0\\xd0\\x68\\xc5\\x86\\xc3\\x3c\\x36\\x59\\xb1\\xf9\\x30\\x0b\\xfb\\x18\\x5e\\x6b\\xb0\\xda\\xd5\\x55\\x7a\\xd4\\xc9\\xc8\\xf0\\x82\\x46\\x6b\\x30\\x5b\\xac\\x76\\x87\\xf3\\xda\\x05\\x7c\\x09\\x9c\\xa2\\x2d\\xc2\\xe9\\x44\\x35\\x3a\\x0e\\xd9\\x33\\x11\\x61\\x80\\x3b\\x54\\x6e\\x0f\\x21\\x1f\\xca\\xf3\\x69\\x90\\xaf\\xd5\\x91\\x33\\xa9\\x42\\x1e\\x32\\xbc\\x88\\x4c\\xf9\\x42\\xfa\\x27\\x51\\x79\\x3b\\x96\\xbf\\x4c\\x11\\x92\\xe5\\xcf\\x30\\x8f\\xaf\\xf6\\xfc\\x1b\\x7a\\x99\\x7d\\xe5\\x6a\\xcf\\xd7\\x5e\\x63\\x5f\\xb9\\x5c\\xc1\\x5e\\x5c\\xbc\\xf8\\xaa\\x99\\xe0\\x10\\x00\\xae\\x96\\xfa\\xa2\\xdc\\xb8\\x75\\xd0\\x86\\x68\\x22\\x3a\\xee\\x8b\\xd4\\x48\\x8b\\x21\\xbe\\x86\\xd3\\x53\\x5f\\xa3\\x43\\xea\\x7f\\x9f\\x0e\\x75\\x46\\x1f\\xcb\\xc1\\x0b\\xa8\\x3f\\x1a\\xf8\\x83\\x1c\\x44\\x1f\\xd7\\xc9\\xcf\\xc8\\x4f\\x33\\x67\\x98\\x0f\\xea\\x8f\\x31\\xad\\xeb\\x8b\\xeb\\xb3\\x98\\xce\\xf5\\xaf\\x03\\x22\\x71\\x1d\\x77\\x8a\\xc7\\xa0\\x25\\xc8\\x5e\\xd3\\x20\\x5b\\x36\\x84\\xb0\\x2e\\x80\\x35\\xb5\\x14\\xc9\\xeb\\x09\\xa2\\xd7\\x50\\x0f\\x07\\x12\\xa8\\x1b\\x84\\x52\\x1d\\x0a\\x21\\xd1\\x27\\x3a\\xbe\\x44\\x0f\\xa0\\x07\\xbe\\x94\\xd1\\x11\\x1e\\xd7\\xa7\\x31\\xdf\\x5c\\xad\\x90\\x81\\x31\\xa9\\xba\\x33\\x12\\x80\\x9b\\x4a\\x75\\xa7\\x38\\xe1\\xfb\\x13\\xd8\\x96\\x55\\x01\\xb4\\xaa\\x40\\x1a\\x35\\x3b\\x2e\\x71\\x44\\x57\\x05\\x5a\\x00\\x83\\xbc\\x65\\x5e\\x27\\xf2\\x3a\\x47\\xb2\\xfa\\x7a\\xc4\\x9e\\xbd\\xfa\\x0b\\x5b\\xbc\\x96\\x5b\\x5c\\xb5\\xea\\xca\\xec\\x38\\xae\\x58\\x23\\x1f\\x63\\xac\\xc2\\x42\\xd0\\x40\\x19\\x60\\x4d\\x80\\x58\\x1b\\xcc\\x05\\x24\\x86\\x4d\\xe4\\x90\\x6a\\x34\\x46\\x30\\x70\\x7e\\x82\\x8a\\x78\\x43\\x2c\\xf1\\x8d\\x0d\\x26\\xa6\\x9a\\xe8\\x75\\xfa\\xc4\\x90\\x73\\x0d\\x7a\\xf0\\xc0\\x01\\xf9\\x98\\xe6\\x95\\xaa\\x4b\\xf3\\xab\\x00\\x41\\x9e\\xb2\\x98\\xbd\\x29\\xb1\\xe6\\x05\\xcd\\xd7\\xbc\\x88\\x48\\xf3\\xf6\\x33\\x23\\xf6\\xf3\\xf8\\xd2\\x3f\\x00\\x81\\x41\\x3e\\x86\\x56\\xd1\\x31\\x74\\xa0\\x63\\xa0\\x93\\x3d\\x40\\xe2\\x04\\x3a\\x06\\x4d\\x2d\\x66\\x83\\x35\\x82\\x7a\\x63\\xc1\\xaa\\x2a\\x73\\x00\\x0b\\xd6\\xc4\\x60\\x34\\x89\\xcc\\x90\\x3b\\x24\\xfa\\xca\\xbc\\xa2\\xd7\\x70\\xf0\\x20\\x5a\\x24\\xcf\\xdf\\x22\\x2c\\xaa\\xfa\\x4f\\x4f\\x95\\xce\\xf6\\xcc\\x27\\x6c\\x12\\xe5\\x61\\xc3\\x1a\\x5c\\x9c\\x6d\\x25\\x2d\\xed\\x34\\xbc\\xce\\xf3\\x69\\xd8\\xf6\\xc8\\xff\\x30\\x2a\\xd8\\xf7\\xac\\x55\\xb0\\x3e\\xc3\\x7c\\xc2\\x7c\\x54\\xdf\\x02\\x3d\\xd3\\xbd\\xbb\\x7c\\x87\\x7a\\x0d\\x4e\\x19\\xc7\\x6e\\xa3\\x75\\x97\\x29\\x4d\\xf0\\x1c\\xd9\\x68\\x42\\x5c\\xc8\\xeb\\xf4\\x72\\x6c\\xd5\\xd5\\xb1\\x9b\\xe9\\x6f\\xfa\\x73\\xaf\\xa1\\xf3\\x7c\\x14\\x38\\xc8\\x02\\x75\\x01\\x84\\xd5\\x83\\x95\\xf3\\x23\\xcc\\x53\\xee\\xb2\\x46\\xd0\\x73\\x7e\\x49\\x50\\x07\\x52\\x1e\\xb2\\xfb\\xfa\\xb3\\xdf\\xbd\\xb4\\x95\\x3f\\x24\\xc8\\xbf\\x12\\xff\\x36\\x49\\xa9\\x63\\x7f\\xe1\\xfa\\x81\\x0f\\x8a\\x61\\x69\\xbc\\x42\\x80\\x86\\xc2\\x79\\x5c\\x2c\\x62\\x47\\x40\\x63\\xa8\\x88\\x96\\xae\\x82\\x69\\x8d\\x3a\\x7f\\x0d\\x5b\\xe8\\xb5\\x13\\x4c\\xab\\x89\\x21\\x1c\\xa0\\x93\\x3f\\xdb\\x10\\xc3\\xd9\\x56\\x6c\\x20\\x9e\\xc1\\x64\\x8d\\x61\\x53\\x40\\x32\\x58\\xc9\\x2e\\x9a\\xfb\\xe5\\x0a\\x82\\x41\\xc9\\x6d\\x88\\x49\\x25\\xc8\\x2f\\x65\\x18\\x44\\x5b\\xc4\\xee\\xcd\\x23\\xae\\xdd\\x2d\\xe2\\xd4\\x30\\x48\\xac\\x57\\xb4\\x49\\xee\\x0c\\xd5\\xd7\\x5b\\x5c\\xf1\\x44\\x6f\\xdb\\x86\\x74\\x55\\x5e\\x69\\x59\\x69\\x39\\x4d\\x66\\x89\\x0e\\x97\\xdb\\x57\\x8c\\xe2\\x39\\x9b\\x78\\xda\\xd3\\x97\\x25\\x4c\\xba\\xf2\\x51\\xed\\x3d\\x93\\xee\\x9c\\x7d\\x80\\x99\\x3e\\xeb\\xd5\\x57\\xce\\x1a\\xad\\xef\\xe8\\x0d\\xa8\\x5c\\x1a\\xb7\\x4b\\x8a\\x0e\\xad\\x9c\\xbc\\x27\\xe5\\xf3\\xd9\\x6b\\x50\\x49\\xd5\\x4b\\x93\\xef\\xbc\\x6b\\x64\\x57\\x41\\xe0\\xef\\x1a\\x3e\\xea\\x35\\x5c\\xff\\x5b\\x9b\\x29\\xa5\\x2d\\xfb\\xe4\\xf6\\x9b\\xb8\\x77\\x7d\\xcf\\x81\\xd3\\x7a\\xe0\\x39\\xc0\\xc0\\x1a\\xa5\\x8e\\xf3\\x0b\\x49\\x20\\x42\\x66\\xc2\\xd7\\x47\\x4c\\x84\\x17\\x4e\\x21\\x16\\x11\\x08\\x2f\\xd2\\xc8\\x06\\x5d\\x5b\\x13\\x10\\xf1\\x8b\\x1e\\xca\\x00\\x9b\\x0a\\xea\\x45\\x73\\x0c\\xdb\\xac\\x52\\x52\\xbc\\xa0\\xcb\\x8b\\xfc\\x92\\x4d\\x14\\x6d\\xd8\\x1a\\xc6\\x49\\xa2\\x24\\x50\\x18\\x93\\xe6\\x54\\x77\\x08\\x22\\xb5\\xc4\\x04\\x8a\\xd3\\xb5\\x07\\x51\\x5d\\x4f\\xc9\\xd3\\xd8\\xe3\\xb9\\x5d\\x75\\xfd\\x61\\x4d\\x34\\xb4\\x71\\xec\\xb1\\xb3\\x5f\\x46\\x27\\x6f\\x2d\\x4d\\xca\\xce\\xbd\\x7f\\xf8\\x23\\xcb\\x96\\xaf\\x1c\\x36\\x2f\\x47\\x48\\xaa\\x7f\\xba\\xe7\\xcd\\xf2\\x61\\xf9\\x8a\\xf3\\xbc\\xfc\\xe5\\x80\\x5b\\xd7\\xa0\\xb2\\x8a\\xa1\\x47\\x9f\\x71\\xee\\xaf\\x1b\\xd2\\x27\\x3e\\xa7\\x95\\x3a\\xf6\\x22\\x95\\xeb\\x8d\\x72\\x1b\\xe8\\xaf\\xe6\\x36\\x2c\\xcd\\x73\\x1b\\x5c\\x22\\xb7\\xa1\\x4f\\x8d\\xd7\\xbf\\xd8\\x9a\\x3b\\x70\\x82\\x5a\\x12\\xb9\\x0d\\x41\\x23\\x68\\xb2\\x98\\x91\\x57\\xea\\x0e\\xcd\\xb9\\x17\\x31\\x91\\x95\\x93\\xab\\x1e\\x5a\\xf2\\xe4\\xa8\\x0d\\x12\\x83\\x1e\\x58\\xf4\\xc2\\x85\\xcb\\x8c\\xb6\\xe0\\x5f\\xa8\\x6c\\xfa\\x94\\x2d\\x3c\\x2f\\x8c\\x7e\\xe4\\x8b\\xa7\\x0b\\x9e\\xfd\\x7c\\x6e\\xa5\\xc0\\xf3\\x0f\\x4f\\x98\\x82\\x50\\x29\\xd1\\xcf\\x51\\x4a\\x1d\\xfb\\xef\\xb8\\x4c\\xa6\\xaa\\x98\\x5b\\x75\\xab\\x44\\x26\\x5c\\x42\\x26\\x1c\\x95\\x09\\xa7\\x6d\\x2e\\x13\\x55\\x18\\x58\\x13\\x4c\\x64\\x3d\\x0c\\xe6\\x18\\x36\\x04\\xa8\\x64\\x92\\x6c\\xc4\\x22\\x5b\\xc2\\x61\\x6c\\x10\\xb1\\x31\\x0c\\x92\\xd3\\x40\\xb3\\x84\\x12\\x97\\x96\\x88\\xb7\\xcb\\xac\\xb6\\x50\\xd0\\xe5\\x26\\x71\\x41\\x5e\\xd3\\x54\\xbb\\xa8\\xc6\\xdf\\xa3\\xbe\\x38\\x7e\\xe7\\xba\\xd2\\xe8\\x76\\x77\\xd9\\xe6\\x71\\x47\\xcf\\x46\\x1f\\x5e\\x55\\x39\\x27\\x37\\x77\\xee\\xa0\\xd5\\x4b\\xd1\\xff\\x39\\x11\\x8f\\x3a\\x75\\xef\\xc2\\x0c\\xb8\\x74\\xee\\xa1\\x9b\\xfb\\xa1\\xcc\\xf3\\x3b\\xa2\\x15\\x3d\\xd1\\xa5\\x2e\\xb7\\x9c\\x7f\\x8d\\xe6\\xc2\\x95\\x3a\\xf6\\x7b\\xae\\x1f\\xb8\\x20\\x13\\x46\\x42\\xc4\\x41\\xc8\\x31\\xb1\\x71\\x72\\xd2\\xd9\\x58\\x4d\\x92\\xce\\xd1\\x90\\x42\\x50\\xc9\\xd1\\xdb\\xe8\\x82\\xad\\x9e\\x4a\\x85\\x46\\x34\\x84\\x88\\x64\\xbd\\x68\\xab\\xd6\\x71\\x26\\x07\\xc1\\x5a\\x1a\\x51\\xb2\\x8a\\x44\\xc7\\x4c\\x0e\\xd1\\x86\\xc5\\x30\\xd6\\x89\\xd8\\xaa\\x0a\\x08\\x42\\x41\\x5b\\x3a\\xf2\\x6a\\xa8\\x6e\\xd1\\x94\\x66\\x16\\xd8\\xdd\\x5e\\x75\\x8a\\x8d\\x46\\xf6\\x03\\xa7\\xcf\\xd6\\x77\\x66\\xd9\\x4d\\xcb\\xc7\\x6c\\x2c\\xef\\xdb\\xe6\\xf5\\xa5\\x5f\\xc9\\xff\\x7e\\x8f\\x41\\xbf\\x3c\\x70\\xdf\\xe8\\x95\\x8c\\xb6\\xf0\\x5f\\x28\\x24\\xff\\xe7\\xb3\\xfb\\xf9\\x27\\x8f\\x87\\x83\\x0b\\xc3\\x37\\xa3\\x22\\x34\\x8b\\x4f\\xb9\\xe7\\xc9\\xe7\\xa8\\x9e\\xb5\\x06\\x60\\x8e\\x0b\\x45\\xe0\\x86\\x4a\\x88\\xb8\\x28\\x9e\\x42\\xe0\\xc7\\x22\\xad\\x2f\\xc4\\xf6\\x20\\xb1\\x06\\x02\\x81\\xfb\\x49\\x01\\xec\\xa2\\xb5\\x1b\\x4e\\x43\\x0c\\x5b\\x83\\x4d\\x2a\\x08\\x23\\x2e\\x27\\xd5\\x4a\\x82\\xaf\\x92\\x89\\x9f\\x31\\x21\\x9a\\x97\\x24\\x93\\x44\\x47\\x09\\x08\\xa9\\x8b\\x3e\\x0d\\xcb\\x75\\xea\\x92\\x6c\\xeb\\x5d\\xfb\\x9e\\xce\\xea\\x56\\x90\\x64\\x0b\\xa5\\xdd\\x36\\xf0\\xcb\\x2f\\xa3\\xec\\xf3\\x6b\\x97\\xef\\x3d\\x68\\xd0\\x3f\\xce\\x09\\xe3\\x47\\x2d\\x5f\\x7b\\xb5\\x92\\x7d\\x5e\\xcd\\xfb\\x8f\\x91\\xfb\\xb0\\xf5\\x5c\\x3f\\x48\\x07\\x3f\\xcc\\x8a\\xe7\\xe1\\xbd\\x42\\x2c\\xa2\\x45\\x10\\x9f\\x07\\xf9\\x02\\x35\\x5b\\x0e\\x2e\\x86\\x70\\x21\\x65\\x78\\x86\\x81\\x16\\xd0\\x11\\x24\\x93\\xdd\\xa0\\x3f\\x5a\\x53\\x0c\\x6b\\x03\\x52\\x11\\xb1\\x64\\xc4\\xa3\\x13\\x7e\\x63\\xb7\\x58\\xcd\\x39\\x4c\\xa9\\x44\\x04\\x5a\\xa2\\x39\\x20\\xa5\\xaa\\x02\\x90\\xf2\\x4d\\xa2\\x4d\\xd2\\x24\\x85\\x9b\\x28\\x53\\xb9\\x9a\\x5b\\xb8\\xfe\\x1a\\x4e\\x5c\\xb1\\xc6\\x7c\\x73\\x7c\\xfc\\x93\\xa5\\x49\\x5b\\x2e\\x7e\\xd3\\x6f\\x5f\\xb7\\x60\\xd9\\xe3\\xbd\\x1e\\x5d\\x5c\\xb6\\x7e\\xc4\\xdb\\xdf\\x44\\x57\\xac\\x1a\\x32\\x27\\x2f\\xf7\\xbe\\xdb\\x56\\xad\\x8c\\xab\\xd8\\x80\\x7e\\xab\\xae\\x1c\\x7e\\xef\\x0b\\x7f\\xce\\x13\\x19\\x39\\x8b\\x1f\\xbe\\xaf\\x6b\\x37\\xe4\\x89\\x3d\\x73\\xf4\\xd6\\xde\\xe8\\x62\\xb7\\x5b\\x2f\\xbc\\xaa\\xfa\\x5f\\x00\\x0e\\x84\\x24\\xb0\\x43\\xdf\\x38\\x3e\\xd1\\x87\\x54\\x5b\\x66\\x21\\xb6\\xcc\\xd2\\x68\\xcb\\x1c\\x0d\\x73\\x9f\\x09\\x92\\xe9\\x6f\\x88\\xdb\\x31\\x27\\x09\\x9d\\xed\\xd4\\xe3\\x83\\x64\\x81\\x38\\x86\\x4c\\x58\\x2e\\x97\\x53\\xf4\\xa9\\x35\\x1f\\x1a\\x71\\x4d\\xb4\\xf5\\x33\\xa3\\xf7\\xbe\\x11\\xbd\\x7b\\x66\\xff\\x87\\xfc\\x42\\x52\\xfd\\x63\\xfd\\x06\\xbf\\xf7\\x71\\xfd\\x50\\xe6\\xf9\\x87\\x17\\xf6\\xed\\x7c\\xf5\\x4b\\x2a\\x8b\\x6d\\x00\\x68\\x8c\\x90\\xa4\\xd6\\xf2\\x26\\xe2\\x53\\xa2\\x31\\x7f\\x61\\x61\\x49\\x0c\\x89\\x6c\\x59\\xc8\\xb9\\x2d\\x1a\\x8d\\x72\\x6d\\xae\\x1c\\xe5\\x6f\\x39\\x7e\\x9c\\x5c\\x53\\x79\\x5d\\xee\\x83\\x66\\x0a\\x49\\x60\\x01\\x3b\\x84\\x80\\x8a\\x95\\x48\\x93\\x13\\x68\\x81\\x2d\\xf1\\xf6\\xd6\\x80\\x24\\xea\\xd4\\xa0\\x57\\x53\\x8b\\xad\\xaa\\x40\\x6d\\xc1\\x78\\xfa\\x93\\x55\\x85\\x91\\x48\\xfc\\xe4\\xda\\xcb\\x42\\xce\\xce\\x66\\x73\\xa9\\x78\\x53\\xdf\\xe8\\x9e\\x27\\x32\\x43\\xef\\x46\\xe5\\x3b\\xaa\\x78\\x4d\\xe5\\x68\\x6e\\xdd\\x95\\xa9\\xcf\\xed\\xd3\\x09\\x4a\\x34\\x4a\\x78\\xfb\\x28\\x00\\x97\\x26\\x24\\x81\\x11\\x6e\\x6a\\xc4\\x7e\\x3c\\x22\\x3e\\xd8\\x00\\xbc\\x9a\\xf8\\x89\\xb0\\x06\\x9a\\x7e\\xa1\\x2c\\x36\\x51\\x16\\x1b\\x55\\x77\\x61\\xa6\\x39\\x20\\x43\\xdc\\xda\\xc4\\xb3\\x3f\\x3a\\xe4\\x43\\x3e\\xf1\\xd1\\xe8\\x7c\\x94\\x7f\\x41\\x5e\\x8d\\x9e\\x3b\\x27\\x6f\\x5f\\x28\\x24\\x5d\\x9d\\x83\\x76\\xcb\\x8e\\xfa\\x08\\xfa\\x45\\x36\\x01\\x6a\\xc2\\xc3\\x34\\x68\\x80\\x07\\xd7\\x4f\\x99\\x6d\\x8b\\x0a\\x49\\x97\\xce\\xa9\\x7a\\x20\\xdc\\x45\\xfd\\xc1\\xe4\\x38\\xb6\\xb0\\xa6\\x84\\x42\\x94\\xf5\\x54\\x1d\\xb0\\x31\\x24\\x65\\x0a\\x31\\xec\\x0c\\x26\\xbc\\x80\\xcf\\x10\\x93\\x18\\x4b\\x0c\\xfb\\xe8\\x72\\x14\\x0d\\x6b\\x53\\xd4\\x8a\\x52\\xab\\x21\\x46\\xdd\\x81\\x8f\\xa1\\xca\\x20\\xa5\\x10\\xa5\\xd0\\x85\\xb1\\xa8\\x5a\\xd2\\xcc\\x66\\x89\\x15\\x37\\xd5\\x12\\xf7\\x35\\xba\\xd2\\x54\\x6b\\xb0\\xb9\\xec\\x99\\x29\\x53\\xaa\\xf2\\x42\\xcf\\x4f\\xdf\\x79\\x38\\x3a\\x6d\\xea\\xd8\\x79\\x86\\xa3\\x33\\x26\\x0d\\xbd\\x27\\x93\\x6b\\xb3\\xba\\xef\\xa0\\x31\\x63\\x6e\\x9f\\xf2\\xf5\\x37\\xf5\\x73\\x99\\xe5\\x4f\\x3d\\xb4\\x72\\xb2\\xb6\\xfe\\x56\\x66\\xf9\\xa6\\x55\\xbd\\xbb\\x5c\\xfd\\x02\\x12\\xfa\\x4d\\xe7\\xb6\\x1d\\xfa\\x35\\xea\\x77\\x03\\x55\\x44\\xc9\\x9b\\x68\\x36\\xa5\\xe7\\x1a\\xd5\\xb6\\xab\\x44\\x10\\x37\\x70\\xad\\x82\\x5f\\x3b\\x68\\x32\\xd4\\x56\\xcf\\x4c\\x78\\xe9\\x70\\x74\\xc6\\x3d\\x83\\x16\\xe7\\x71\\x6d\\xb6\\xdf\\x76\\xe7\\xc9\\xda\\xfa\\x41\\xcc\\x73\\x6b\\xe6\\xf4\\xef\\x71\\xb5\\x8e\\xe8\\xf7\\x48\\xa5\\x8e\\x2b\\xe0\\xfa\\xfd\\xbe\\xb6\\x0a\\xfd\\xb5\\xda\\x2a\\xce\\xa0\\xe6\\x88\\xa8\\xd1\\x86\\x74\\xe4\\x00\\x5f\\x16\\x34\\xaf\\x1a\\x1d\\x89\\xb8\\x2f\\xbe\\x44\\xbc\\x7c\\xf5\\xec\\x59\\xf9\\x4a\\xf4\\xb1\\x35\\xab\\xd6\\xae\\x5b\\xbd\\xea\\x31\\x46\\x74\\xfd\\x84\\xca\\xe5\\x13\\x3f\\xbb\\x2e\\xca\\xef\\xa2\\xb2\\x9f\\xf7\\x9c\\x3d\\xbb\\xc7\\xb5\\xfb\\xab\\xaf\\x76\\xab\\x36\\x70\\x8d\\x3c\\x82\\x6b\\xc1\\xf5\\xa3\\x7e\\xf4\\x0e\\x88\\xc3\\x1a\\x12\\x99\\x36\\xb0\\x2a\\x4d\\x88\\x61\\x08\\x24\\x1c\\x8e\\xa8\\x4e\\x10\\xc6\\x4e\\x93\\x7d\\x4d\\x31\\x8d\\x18\\x67\\x58\\x92\\x28\\x99\\x04\\xe2\\x6f\\x9c\\x26\\x15\\xd3\\xa4\\xa9\\x98\\xc6\\x1e\\x67\\x5c\\x03\\xa6\\x49\\x46\\xcd\\x31\\xcd\\xc6\\xcc\\xb2\\xad\\x13\\x8f\\x7f\\x71\\x36\\x3a\\x66\\x63\\x59\\xce\\x9c\\xc1\\x2b\\x1f\\x7d\\x6c\\xd5\\xa0\\x39\\x39\\xf2\\x08\\xfe\\xd3\\x95\\xfd\\xfa\\xcb\\x6f\\xc8\\x97\\x09\\xa6\\xe9\\xd2\\xa5\\xfe\\x47\\xa6\\xba\\x4b\\x9f\\x93\\x4f\\x3b\\x5f\\xf9\\xbe\\x6f\\x17\\x4a\\xc3\\x28\\x79\\x04\\x7b\\x3e\\x4e\\xc3\\xd8\\x78\\x74\\x4d\\x68\\x68\\xb4\\xe3\\x69\\x2c\\x71\\xf0\\xd7\\x60\\x00\\x83\\x5a\\xf0\\x9c\\xb0\\xe1\\x76\\x6a\\xc3\\x09\\x25\\x86\\x06\\x0c\\xa0\\x15\\xa9\\xe1\\x76\\x5a\\x54\\x0c\\xa0\\xbd\\x16\\x03\\x94\\x87\\x44\\x9f\\x78\\x7d\\x0c\\x30\\xfa\\xf1\\xd2\\xf4\\xc7\\xa3\\xa5\\xab\\x87\\x1d\\x3d\\x1b\\x5d\\xba\\xf2\\xd6\\xbb\\xf3\\xf2\\xee\\xbe\\x65\\xd5\\xb2\\xb8\\x81\\xee\\xd3\\x73\\xc1\\xe5\\x5c\\x46\\x68\\xdf\\x81\\x60\\x80\\x77\\x7a\\xde\\xc4\\x64\\xb5\\xef\\xfe\\xe3\\x6b\\x71\\xbd\\x65\\x76\\x73\\xfd\\xc0\\x42\\xb4\\xa4\\xc1\\x0a\\xaa\\x92\\x30\\x68\\x63\\xb4\\x6a\\x49\\x5d\\x39\\xa3\\xa5\\x40\\x64\\xda\\x59\\x54\\xc6\\x83\\x84\\x0c\\xd7\\xea\\xa8\\x5b\\x93\\xa7\\xea\\xa7\\xbd\\x78\\x69\\xa5\\x2b\\xdf\\x94\\x3a\\xb6\\xdf\\xe4\\x74\\xae\\xcd\\xd6\\x81\\xc3\\x35\\xdc\\xcb\\x42\\xef\\x2e\\x57\\xaf\\x90\\x7b\\x4e\\x55\\xea\\xd8\\xe3\\x5c\\x3f\\x28\\x82\\xd9\\x37\\xc8\\xfd\\xa0\\xff\\x25\\xf7\\xe3\\xb6\\xc6\\xd4\\xd4\\x4f\\xa1\\x68\\xab\\xe1\\x0d\\x22\\xad\\x15\\x23\\xf0\\xde\\x97\\x48\\xfd\\x98\\xdd\\x39\\x85\\x89\\xd4\\x8f\\x6a\\x6a\\x13\\xe5\\xe3\\xd7\\x4f\\xfd\\xc4\\xb3\\xef\\x53\\x99\\x03\\xfc\\xda\\x51\\x13\\x67\\x8f\\x5e\\x11\\x7d\\xfb\\x6c\\xcd\\xc1\\xe9\\x93\\x11\\x73\\x60\\xf6\\xa8\\x89\\xe3\\x86\\xae\\x38\\x79\\x2c\\x76\\xe0\\xef\\xb3\\x67\\xa0\\x5e\\xc2\\xc4\\x91\\x83\\xba\\xdd\\x34\\x30\\xd3\\xbf\\x6e\\xc1\\x92\\xfd\\x23\\xef\\x58\\x2c\\x08\\x42\\x8f\\x19\\xb7\\xdf\\xd4\\xa9\\x77\\x7a\\xe1\\xc6\\x05\\x8f\\x46\\x26\\x8e\\x59\\x22\\xc4\\xf3\\x3e\\x4a\\x1d\\x33\\x89\\xef\\x08\\x6e\\x18\\x01\\x11\\x3b\\xa1\\xdd\\x28\\xa8\\xda\\x8f\\x79\\x15\\xab\\x68\\x82\\x89\\x5a\\x53\\x8e\\x90\\xdd\\x80\\x57\\x12\\x0b\\x47\\xae\\x86\\x5a\\x53\\x97\\xae\\x39\\x5e\\x31\\xda\\xd5\\x09\\x00\\x22\\xb6\\xa8\\x78\\x45\\x54\\xcb\\xc6\\x54\\x5d\\xa1\\x78\\x2b\\xb7\\x4c\\xcc\\xda\\x13\\x3d\\x79\\xb2\\x63\\xa9\\xd8\\xc2\\x9a\\xe2\\x1a\\xe4\\x9f\\xb3\\x9a\\x7d\\x7e\\x2d\\xe2\\xe5\\x2b\\x6b\\xeb\\xef\\xba\\xb9\\x83\\x56\\x58\\x6a\\x73\\x3f\\x56\\xc5\\x3c\\x46\\xc6\\xfa\\x88\\x52\\xc7\\x5e\\xe5\\xda\\x80\\x1d\\x06\\xaa\\x33\\x55\\x4d\\x9f\\x0a\\x89\\x01\\xeb\\x43\\x09\\x9b\\xd6\\x3c\\x91\\x84\\x8d\\x56\\xc9\\x64\\xa1\\x48\\xc6\\x99\\x48\\x29\\x89\\xb4\\x54\\xcf\\x4c\\xb4\\x46\\xa0\\xa9\\xf9\\x26\\x09\\xa6\\xf2\\x06\\x68\\x9b\\xfb\\x48\\x74\\xdc\\x94\\x89\\xcb\\x7d\\x51\\xc9\\x14\\x7a\\x6a\\xa2\\x74\\x14\\x1d\\x60\\xe6\\xd7\\x2f\\xdc\\xbb\\x68\\x50\\x3f\\xd6\\x78\\xe5\\xe8\\x53\\x83\\x87\\x7f\\x45\\xc6\\x55\\x0c\\xc0\\x7e\\xc3\\xb5\\xa1\\x15\\x1c\\xf1\\x1c\\x13\\x6a\\xc8\\x31\\x61\\xa1\\x56\\xd2\\xd8\\x62\\xd7\\x4d\\x35\\x91\\x80\\xbc\\xf8\\x04\\x02\\x51\\xb0\\x5f\\x3a\\x2e\\xcf\\xdc\\xc0\\xb5\\xa9\\xe7\\x6f\\xbe\\x99\\xb9\\x72\\xe5\\x28\\x95\\x4d\\x11\\x00\\xff\\x19\\xd7\\x06\\x9c\\x30\\x47\\xcd\\x35\\x61\\x73\\x88\\x5e\\x5a\\x12\\x8c\\xa1\\x3f\\xc9\\x31\\x75\\x78\\xfc\\xe2\\x36\\x35\\x39\\xc4\\x59\\x69\\x32\\x49\\x7b\\x09\\xdb\\x0e\\x43\\x35\\xc7\\xdb\\xec\\x6a\\xdd\\x40\\x62\\x8b\\xd6\\x0d\\x18\\x91\\x68\\x93\\xcc\\x4e\\x62\\xb6\\x68\\x46\\x88\\x6d\\xcc\\x08\\xd1\\x71\\xda\\xe3\\xa3\\x65\\xf3\\x2c\\x88\\xf5\\x15\\x1d\\xa9\\x76\\x0b\\x69\\x1f\\x6f\\xfd\\x24\\x53\\x48\\xdf\\x7d\\x44\\x3e\\xba\\xed\\xfd\\x22\\xc1\\x7f\\x6a\\x1b\\xd7\\xa6\\xbe\\x62\\xf1\\x62\\x06\\xd7\\x57\\xac\\x5d\\xcb\\xe0\\x2b\\x47\\x99\\x75\\xaf\\xa0\\x97\\xeb\\xa7\\x42\\x82\\x47\\xff\\xe4\\xda\\x5c\\x93\\x0f\\x42\\x7f\\x9c\\x0f\\x4a\\xa5\\x8e\\xdf\\x80\\x8a\\xd1\\x44\\x79\\xfb\\xd7\\x5f\\x7f\\xf7\\x9d\\xbc\\x1d\\x4d\\xfc\\xea\\xa7\\x9f\\x18\\x1f\\xe3\\x96\\x67\\xa0\\x35\\xf5\\xb1\\xfa\\xcf\\xd1\\x13\\xf2\\x78\\x40\\x90\\x22\\xf7\\x61\\xcf\\x51\\x5e\\x95\\x82\\xca\\x7e\\x3e\\x84\\xf5\\x01\\x49\\x24\\xd0\\xd5\\x15\\xc0\\x7c\\xad\\x24\\x18\\x29\\x77\\x1a\\x0b\\x8a\\x40\\x8c\\xb0\\x66\\x4b\\x23\\x9d\\x28\\x44\\x61\\x67\\x6e\\x5e\\x79\\x2e\\x51\\x83\\x8e\\x28\\xe5\\xb3\\x6f\\x7c\\x02\\xd2\\x9f\\x96\\xc3\\x2d\\x9e\\x58\\x94\\xd4\\xdb\\xe1\\x10\\x06\\x18\\x3a\\x56\\xa4\\x06\\xb8\\x36\\xf5\\x83\\x97\\xb1\\x2d\\xaf\\x78\\xa6\\x3e\\x6d\\xe0\\xab\\x90\\x30\\xbd\\xeb\\x0c\\x42\\xe3\\x70\\x00\\x76\\x3f\\xd5\\x83\\x66\\xf9\\x22\\xf4\\x5f\\xe4\\x8b\\x86\\x33\\xbd\\xea\\x5f\\x67\\x43\\xf5\\x12\\x33\\x63\\x05\\xeb\\x78\\xf2\\xe1\\xab\\xdf\\xc5\\xf3\\x45\\x1d\\xe5\\xf5\\xcc\\x36\\xa1\\x3d\\x64\\xc0\\x40\\xc0\\x49\\x81\\x1a\\xb7\\x5a\\x4c\\x02\\x01\\x09\\xf1\\x31\\xac\\x0b\\xd4\\x68\\xe9\\x0e\\x5a\\x2f\\x93\\x4a\\x71\\xa2\\x83\\x28\\x7e\\x90\\x56\\xc6\\x38\\x52\\xe9\\x44\\x04\\x09\\xdc\\xa2\\x4d\\xb2\\xa7\\x86\\xe9\\xe2\\x9a\\x35\\x8c\\x75\\x36\\x89\\x37\\xa9\\x38\\x9c\\x3a\\x22\\x3a\\x29\\xd3\\x51\\x63\\x92\\x5d\\xa3\\xe6\\xd8\\x3b\\x4e\\x1a\\xbf\\xe3\\xad\\xfc\\x69\\xb7\\x0f\\x1a\\x34\\x68\\xd0\\xed\\xd3\\xf2\\xdf\\xda\\x31\\x9e\\xc9\\x5c\\x77\\xff\\x8c\\x53\\x2f\\xfc\\x58\\x7e\\xaf\\x6f\\xdf\\x92\\x53\\x13\\x9f\\x2a\\x2a\\xde\\x3e\\xfe\\xe4\\x92\\xea\\xec\\x59\\xe5\\x3f\\xed\\x3e\\x39\\x7d\\x1e\\x1d\\xf3\\x4b\\xf2\\x45\\xd4\\x97\\xe6\\xa2\\xd2\\xa0\\xf9\\x12\\xa6\\x29\\x46\\x5f\\xf1\\xb4\\x94\\x18\\x12\\x5f\\xda\\x2a\\x5f\\x14\\x5e\\xbf\\xd4\\x99\\xfe\\xce\\x29\\xaf\\x67\\x66\\x25\\x68\\xcd\\x08\\xd4\\x80\\x4a\\xab\\x3b\\x20\\xb9\\xf8\\x18\\x36\\x07\\x6a\\x2c\\x8d\\xb4\\xb2\\xb5\\x58\\xaf\\xae\\x1d\\xdb\\x54\\x5a\\x53\\x59\\x51\\x8d\\x36\\xdc\\x54\\x97\\x08\\xad\\x2e\\xe2\\xc5\\xb0\\xd9\\x26\\xe9\\x6d\\x84\\x56\\x77\\x07\\x44\\x49\\x55\\x49\\x23\\x11\\x07\\x8d\\xcc\\x9d\\x34\\x42\\x17\\x34\\xce\\xa9\\xc3\\x87\\x0e\\x1f\\x3e\\x74\\xf8\\xd4\\x16\\x6f\\xee\\x1c\\x3b\\x65\\xca\\xd8\\x9d\\x6f\\xfe\\x9a\\x5d\\xbd\\xe4\\xe4\\xe4\\xa7\\xfc\\x2d\\x9e\\x9a\\x7a\\x6a\\xc9\\x3e\\xdf\\xbd\\xe5\\x3f\\xbe\\x70\\x6a\\xc6\\xfd\\xeb\\xe6\\x4d\\x3f\\xb9\\xfb\\xa7\\x72\\x40\\xb0\\x10\\x3d\\xc6\\xfd\\xc4\\xfa\\x20\\x99\\x8c\\xd7\\x1a\\x90\\x74\\x5c\\x0c\\xbb\\x02\\x12\\x4b\\x54\\x2f\\x85\\x12\\x1c\\xef\\x12\\xa3\\x73\\xd4\\x1e\\xa3\\xb8\\xd1\\x98\\x4c\\xd0\\xa0\\x95\\x16\\xe4\\x58\\x45\\x5b\\x04\\xec\\xc9\\x61\\x3a\\x56\\x49\\xe3\\x08\\x87\\x31\\x6b\\x8b\\x08\\x46\\x53\\x38\\x9e\\xf6\\x21\\xae\\x4c\\x75\\x10\\x6e\\x35\\x4c\\x52\\xdd\\xec\\xc2\\x17\\x96\\x54\\x3e\\x3e\\xa8\\xcd\\x88\\xd2\\xce\\x23\\x57\\xbd\\xb8\\x68\\xe8\\xba\\x41\\x6d\\x47\\x05\\xbb\\xdc\\x89\\x3e\\x5d\\xf6\\x46\\xb7\\xee\\xa1\\xe2\\x99\\x7d\\x6d\\xcb\\x4f\\x74\\xee\\x5d\\x52\\x32\\xa9\\x8f\\x8a\\x75\\x1e\\x95\\x57\\xa0\\x41\\x5c\\x1b\\x1a\\x63\\xe4\\x02\\x45\\xe4\\x12\\xf7\\xc7\\xb1\\x85\\x3d\\x1e\\x5b\\x3c\\x1a\\x8d\\x46\\xe5\\x15\\xec\\x07\\x57\\x8b\\xb9\\xaf\\x4e\\x9d\\x02\\x04\\x93\\x15\\x03\\x5b\\xcf\\xe7\\x82\\x0f\\xa6\\x03\\xf6\\x04\\x6a\\x5c\\x7a\\x9a\\x12\\xb4\\x04\\x6a\\x78\\xba\\x75\\x4d\\xce\\xc4\\xa3\\xae\\x84\\x67\\xd2\\xeb\\x13\\x3f\\x19\\x4f\\xa2\\xa4\\x5a\\x62\\x44\\x7e\\x04\\x35\\x67\\x7a\\x44\\x1b\\x4d\\x74\\x81\\xe4\\x22\\x9b\\x19\\xde\\x70\\x18\\x5b\\xc4\\x6a\\xbd\\x21\\x99\\x06\\x91\\xbc\\x4d\\xe2\\x34\\x89\\xcc\\x8a\\xda\\x5e\\x65\\x41\\xd7\\x66\\x56\\x5c\\xb4\\xc5\\x2a\\x97\\x99\\xfc\\xfa\\xbe\\xa3\\x5b\\x0e\\xb1\\x4c\\x75\\x22\\xb3\\x12\\x61\\xd9\\x13\\x6b\\x8f\\xfe\\xed\\x20\\xa3\\x2d\\x78\\x1b\\xf9\\x72\\xbf\\xf9\\x22\\xe9\\xc3\\x47\\xf9\\xc6\\xd4\\xca\\x7d\\x27\\x92\\xcf\\x5d\\xc8\\x46\\xd9\\x54\\xff\\xba\\x03\\x70\\x83\\xf9\\x28\\x64\\xc1\\x7c\\x88\\xa4\\x81\\x9a\\x7c\\xc0\\xc9\\xc1\\x88\\xc0\\x80\\x5f\\x32\\xb3\\xb1\\x1a\\x40\\x69\\x82\\xc9\\x8f\\x6d\\x6a\\x31\\xb5\\x23\\x58\\x6d\\x48\\x13\\xb4\\x7e\\x84\\x7d\\x01\\x9c\\xd5\\x10\\xcc\\xdb\\x82\\x11\\x67\\x16\\x0d\\xe6\\x1d\\x3a\\x7f\\x24\\x8b\\x06\\xf3\\x59\\xa0\\x23\\xef\\x69\\x8d\\x3d\\x80\\x7a\\x6b\\x4c\\xca\\x46\\x7e\\xc9\\x99\\x25\\xda\\x24\\x31\\x99\\x26\\x5e\\x24\\xc1\\x1c\\x47\\xbb\\x21\\x96\\x0a\\x3f\\x41\\xa8\\xd3\\xee\\x75\\x7a\\xdd\\x0e\\x41\\xe3\\xd5\\x78\\xcb\\x42\\x1d\\x50\\x59\\x5e\\xf7\\xad\\xfa\\xb3\\x07\\x8e\\x7d\\xc6\\x31\\xaf\\xcf\\x1f\\x35\\xfa\\x1e\\x3d\\x7a\\x5a\\x1e\\x2d\\x64\\xa6\\x33\\x5f\\xa0\\xab\\x25\\xfa\\x92\\x12\\x81\\x19\\x5f\\x85\\xcc\\xef\\xc6\\xde\\xdf\\x23\\xcc\\x9a\\xb9\\xe1\\x21\\xf9\\x62\\xd5\\x86\\xa1\\xcf\\xb4\\xdd\\xbc\\xd9\\x74\\x64\\xfc\\x06\\x55\\x27\\x26\\x28\\xdf\\xf2\\x43\\xb9\\x9f\\x69\\x25\\xeb\\x5c\\x50\\x9b\\xa0\\x52\\x7d\\xa1\\x90\\x94\\xc7\\xc5\\x70\\x51\\x40\\x32\\x71\\x6a\\x05\\x2b\\x57\\x2b\\x65\\x5b\\x68\\xf2\\xb2\\x00\\xf9\\x25\\x97\\x45\\xad\\x52\\xcd\\xe6\\x44\\x5b\\x35\\xd2\\xe8\\x7c\\x44\\x40\\x05\\x62\\xb5\\xde\\x9a\\x96\\x45\\x36\\x5d\\xb6\\x6a\\xd1\\x4e\\xc5\\x06\\x52\\x5e\\xa6\\x68\\xab\\x4e\\x01\\xf5\\x40\\x91\\x58\\x8d\\x34\\xf6\\x64\\xb2\\x69\\xb2\\x55\\x6b\\xf5\\x56\\x1b\\xc5\\x3f\\x1d\\x91\\xda\\x34\\x97\\x57\\x1e\\xc7\\x6d\\xe5\\x6e\\x8d\\xda\\x30\\xe7\\xd6\\xa8\\x8e\\x38\\x4f\\x13\\x5f\\xca\\xa4\\x2b\\x99\\x13\\x56\\x04\\xcb\\xc2\\xad\\xd6\\x3e\\xb2\\xa6\\x77\\x64\\xc4\\xc8\\x48\\x9f\\xb5\\x2b\\x1f\\x2f\\x0d\\x97\\x95\\xac\\x5e\\xf9\\x50\\xdf\\x57\\xc7\\x8e\\x7d\\xb5\\xcf\\xa2\\x7e\\x3f\\xef\\xd9\\xfd\\xf3\\xcf\\xbb\\xf7\\xfc\\x3c\\x7d\\xe5\\xcd\\xfb\\x46\\x8f\\x3b\\xd0\\x6f\\xc3\\x23\\x6b\\xcb\\xdb\\x77\\x68\\xbd\\x61\\xe5\\x13\\xfd\\x5e\\x1d\\x3b\\xaa\\xfa\\xe6\\x35\\x8f\\x2c\\xed\\xd0\\xf9\\xa6\\xf6\\x4b\\x98\\xfb\\x0e\\xc8\\xbf\\x21\\xdd\\x81\\xfd\\x48\\x2b\\xff\\x87\\xc8\\x3e\\x23\\x5e\\xc7\\xe5\\x82\\x7b\\xd4\\xfa\\x89\\xc4\\x9a\\x42\\x8d\\x55\\x34\\x83\\xc9\\x8f\\x75\\x21\\xc9\\x4a\\xd0\\x74\\xb0\\xc6\\xe1\\xa4\\x3b\\xf8\\x90\\xe4\\x60\\x09\\x4c\\x42\\xd8\\x4d\\x20\\x21\\x31\\x44\\x26\\x43\\x0c\\x6b\\x83\\x11\\x13\\x2d\\xbb\\x30\\x19\\x74\\x7e\\x2c\\x04\\x23\\x66\\x13\\xf9\\x66\\xb6\\xea\\xfc\\xd8\\x11\\xa4\\xa1\\x83\\xc9\\x9c\\x58\\x97\\x70\\x36\\x5b\\x97\\xf0\\x3a\\xe9\\x9f\\xe8\\x13\\xbd\\x65\\xf4\\x2f\\xe3\\x2b\\x34\\x1e\\x4d\\x38\\x2b\\x0f\\x47\\xad\\xe5\\x07\\xd1\\x02\\xf9\\xc1\\xa8\\xbc\\x1c\\xcd\\x96\\x97\\xa3\\x72\\x1e\\xd7\\x4f\\x64\\x36\\xd6\\x07\\xab\\x96\\x56\\xc9\\xa7\\x51\\x4e\\xd5\\xd2\\x2a\\x55\\xae\\x8f\\xc9\\x17\\xd1\\x6d\\xf1\\x1e\\xde\\x2c\\x68\\x6c\\xdd\\xfd\\xa3\\x79\\x2e\\x86\\xc4\\xc7\\xc8\\x3c\\xbf\\xc8\\x26\\x5d\\x3d\\xc7\\x1e\\x63\\x7e\\xad\\xd7\\xd3\\x6b\\x0d\\x97\\x45\\xee\\x01\\x3e\\x0a\\x21\\xe8\\x06\\x4f\\x83\\x5a\\xe4\\x4c\\x62\\x37\\x91\\xe2\\x3d\\xd1\\xa4\\xf3\\x63\\x5f\\x40\\xf2\\x13\\x17\\xd7\\x9d\\xde\\x21\\x37\\x28\\x95\\x1a\\x62\\x38\\x3f\\xa8\\x56\\x3c\\x13\\x4f\\x54\\x6a\\xa5\\x5d\\x84\\x6a\\xb4\\x8c\\x3d\\x64\\x77\\xb1\\x21\\x86\\x8b\\x03\\x92\\xc7\\x10\\xc3\\x1e\\x2b\\x36\\x91\\x5d\\x66\\x2b\\xb1\\xef\\x92\\xc9\\x1a\\x93\\x7a\\x10\\xbf\\x25\\x10\\x1b\\x19\\x0c\\x87\\x71\\xb1\\xd8\\x49\\x2f\\xea\\xdc\\x3e\\x7f\\xcb\\x70\\x9b\\x4e\\x5d\\x88\\xfa\\x78\\x6c\\x52\\x52\\x3a\\x31\\x16\\xa2\\x5f\\xb4\\xfd\\x4d\\x30\\x7a\\x72\\xf3\\xdb\\x74\\x69\\xd6\\x4c\\x97\\x1d\\x0a\\x72\\x0d\\x13\\xa7\\xa1\\x03\\x33\\x51\\x1d\\xdd\\x91\\x69\\xd2\\xb0\\x59\\x4e\\x0f\\xbb\\x69\\x31\\x68\\x1e\\x4d\\xa5\\x0f\\x1f\\x3e\\xb8\\x6b\\x57\\x64\\x3c\\x1b\\x43\\x1c\\xc7\\x1e\\xd8\\xba\\xf2\\xb1\\xc7\\x1f\\xfe\\xc7\\xff\\x7d\\x31\\x62\\x70\\xb7\\xee\\xf2\\xaf\\x5f\\x7e\\x2e\\x7f\\xc0\\x33\\x07\\xde\\x58\\xba\\x7c\\xcb\\xa3\\xef\\xfe\\xf8\\x55\\x74\\xd9\\x07\\xad\\x7b\\x7b\\x7b\\x56\\xac\\x3b\\x11\\x18\\x90\\xdd\\xab\\x17\\x93\\x37\\x6c\\x55\\x8b\\xe0\\x23\\x23\\x9f\\x3d\\xfe\\xc5\\x09\\x61\\xd6\\xd6\\xd9\\xc3\\x46\\x8f\\x6e\\xd3\\x6d\\xdf\\x4b\\xc3\\x57\\xe6\\x87\\x96\\x8d\\xda\\xf3\\xd6\\xc9\\xcf\\x04\\x66\\xcd\\xd2\\xd9\\xc3\\x86\\x8d\\xed\\xd8\\x71\\x7f\\xf5\\x98\\xf1\\x6d\\x45\\x97\\xd1\\x31\\xba\\xdb\\xb0\\xc9\\x1d\\x8d\\xc9\\x16\\xfb\\x18\\xc2\\xef\\xdd\\xdc\\x39\\x76\\x58\\x5c\\x76\\xad\\x20\\x51\\xc1\\x21\\x81\\x9e\\x02\\x6e\\x75\\x5d\\xb6\\xc1\\x6c\\x4b\\xac\\x91\\x62\\x5d\\x5a\\xd1\\x61\\x6c\\x90\\x67\\x59\\xc8\\x19\\x2a\\x0b\\x39\\x77\\x9f\\xbe\\x72\\x9a\\x3b\\x77\\xec\\xd8\\xb1\\x63\\xc0\\x42\\xa5\\x52\\xc7\\x7f\\xcd\\x1f\\x01\\x03\\xb8\\xa1\\x0c\\xb6\\xa8\\x58\\x55\\xb2\\x68\\xe2\\x95\\xb7\\x4e\\x4d\\xac\\x26\\xe4\\xd7\\xb1\\x26\\xbf\\x14\\xd2\\xc4\\x22\\xfe\\x10\\x91\\xae\\x3f\\xa0\\xf3\\xd7\\xa4\\x65\\xd3\\xbd\\x69\\x9a\\x58\\x24\\x9b\\x66\\x94\\xb3\\x3d\\x24\\x14\\x68\\x45\\x57\\x52\\x8c\\x76\\xb0\\x72\\x7e\\x82\\xb1\\x93\\xd4\\x76\\x51\\x9c\\x6f\\x95\\x8a\\xd5\\xc2\\xee\\x12\\x7b\\x0c\\x67\\x06\\x71\\x89\\x55\\xb2\\xa9\\x95\\xad\\x56\\xce\\x2f\\x95\\x23\\xbf\\x54\\x9c\\x2f\\xda\\xfe\\xa6\\xb3\\x38\\xd9\\xec\\xb4\\x10\\xb5\\x12\\xd9\\x7e\\xd1\\xb6\\x4f\\x30\\xda\\x32\\x21\\xde\\x11\\x49\\x6b\\x19\\xd4\\x8a\\x06\\xbb\\x95\\xc4\\xfc\\xa2\\x95\\x84\\xfc\\xf1\\xb6\\xd2\\xeb\\x59\\x7e\\x5f\\x56\\x6e\\x25\\xda\\x8a\\xf2\\x51\\x1e\\xda\\x2a\\x8f\\x94\\x3f\\x95\\x3f\\x96\\x47\\xcd\\x45\\x83\\x7f\\xfd\\x37\\xaa\\x94\\x9f\\xff\\xf7\\xaf\\xf2\\xae\\xaf\\x0f\\x3c\\xb5\\x45\\xe2\\x98\\xb5\\xc3\\x86\\x0d\\x1f\\x37\\x6e\\xf8\\xb0\\xa1\\x6b\\x19\\x0e\\x6f\\x79\\xea\\x00\\xf3\\x09\\x6a\\x8b\\xb0\\x5c\\x21\\x47\\xe5\\x23\\x72\\x3f\\x14\\x41\\xed\\xe4\\xdf\\xe4\\xf5\\x68\\x0a\\xd2\\x21\\x0d\\x9a\\x24\\x3f\\x2e\\x1f\\x9c\\xbd\\xb7\\x76\\xeb\\x06\\xe1\\xce\\xc1\\xab\\x66\\xce\\xb9\\x77\\xe5\\x6d\\xa3\\x84\\x8d\\x5b\\x3e\\x24\\x72\\x9a\\xc3\\xd4\\xb0\\x76\\x5a\\xfb\\xe6\\x87\\x7b\\x41\\xed\\x60\\xd1\\xf2\\x31\\x9c\\x11\\x90\\xb2\\x35\\x31\\xdc\\x22\\x50\\xc3\\xc6\\x81\\x8a\\x9a\\x3b\\xf5\\x5a\\x62\\xd8\\x6b\\x95\\xf2\\x90\\x5f\\xe2\\x52\\x83\\x41\\xc9\\x61\\x89\\xd1\\x9c\\xa9\\x97\\x20\\x15\\xa3\\x99\\xd6\\xf6\\x47\\x0c\\xd6\\x0c\\x82\\x03\\x1c\\x36\\x9c\\x14\\xef\\xd5\\x90\\xdc\\x04\\xc4\\xb4\\x10\\x25\\x07\\x84\\xc3\\x92\\x96\\x15\\x6d\\x11\\x83\\xd1\\x1e\\xbe\\x76\\x45\\x28\\x80\\x72\\xff\\x70\\x39\\x68\\xce\\xae\\xed\\x8f\\xb4\\x6b\\xd3\\xa5\\xd7\\xd3\\x48\\xd8\\xb5\\xf2\\xe1\\x27\\x8d\\xe6\\x17\\xb5\\x7a\\xd6\\x3b\\xa3\\xef\\xec\\x45\\x7b\\xdb\\xb4\\x0b\\x4d\\xb5\\xad\\xe8\\x33\\x80\\xdd\\x34\\x6d\\x4e\\x69\\xc7\\xae\\xad\\x5a\\x9a\\x84\\x51\\x8b\\x56\\x3f\\x2c\\x1f\\x0d\\x56\\xfa\\x9d\\x25\\x29\\x81\\x0e\\xf7\\x4d\\x2b\\x2a\\x69\\xe7\\x9b\\xd6\\x59\\xb5\\x2d\\xa3\\x60\\x16\\x3b\\x99\\x5d\\x07\\x02\\x98\\x68\\x85\\x79\\x88\\x45\\xbe\\xf8\\xc7\\x28\\x94\\xb7\\x5e\\x01\\x65\\x7d\\x5e\\xfc\\x13\\x5d\\xb1\\xa3\\x87\\xe4\\x19\\xf2\\x4c\\xf4\\x50\\x7c\\x03\\x10\\x2c\\x40\\xb3\\xd9\\x37\\xd9\\x2c\\xe0\\xa1\\x24\\x51\\x6d\\x9e\\xe8\\x6c\\xa4\\x21\\xe6\\xef\\x9a\\xd9\\xa0\\x49\\x33\\x1b\\xb1\\x8a\\x0b\\xd8\\x2e\\x47\\x99\\x79\\x3b\\xe5\\x41\\xea\\x23\\x4b\\xfe\\xf7\\x1e\\x43\\xae\\xd9\\x9c\\x08\\x42\\x5b\\xd8\\x7d\\xbd\\x59\\xd1\\x32\\x44\\xf5\\xbf\\xa5\\x26\\x16\\x69\\x49\\x67\\x45\\xcb\\x24\\x9d\\x1f\\xe7\\x07\\x6b\\x52\\xda\\xd2\\x03\\x29\\x0d\\xfd\\xd4\\xd7\\xcc\\x86\\xa0\\x3d\\x86\\x43\\x41\\x1c\\xb4\\x4a\\x85\\xc8\\x8f\\xcb\\x83\\x52\\xb6\\x3d\\x86\\xd3\\x83\\x74\\x96\\x64\\x37\\x9b\\x14\\xc4\\x38\\x16\\x06\\x45\\x5b\\x35\\x9d\\x14\\xee\\x30\\xce\\x16\\xb1\\x27\\x0c\\x52\\x4b\\x8b\\x68\\xc3\\xbe\\x30\\x0e\\x89\\x35\\x82\\xd1\\x06\\x1e\\x72\\xa8\\xad\\x0d\\xa7\\xff\\xc1\\x14\\x41\\x37\\x28\\x94\\xf1\\xa3\\x64\\x14\\xa2\\x26\\xce\\x8f\\xae\\x3b\\x51\\xfe\\x0f\\x55\\xca\\xbb\\xc8\\x44\\x41\\x79\\x28\\x69\\xd3\\xde\\xce\\x1d\\x3b\\xb7\\xd5\\xe8\\x9f\\xd0\\x71\\x5d\\xfa\\x6e\\xdb\\x74\\xd3\\xb0\\x5b\\x46\\x2d\\xbe\\xce\\x4c\\xf9\\x55\\xde\\x40\\x67\\x8a\\x16\\x4d\\x94\\x37\\xd6\\x0f\\x63\\xfb\\x2f\\x9e\\xdf\\x61\\x78\\x66\\xca\\xa4\\x3e\\xad\\x5b\\xdc\\xe4\\xb4\\x3a\\x6f\\x2d\\x68\\xd5\\xb3\\xab\\xfc\\x22\\xfa\\x27\\xea\\xd8\\xba\\x57\\x5b\\x40\\x70\\x3f\\x9f\\xc1\\xde\\x4c\\x6d\\x5b\\x06\\xc4\\x4d\\x19\\x1f\\x6b\\xd8\\x68\\xba\\x58\\x5d\\xe6\\x75\\xde\\xcf\\xbc\\xcf\\x67\\xac\\x5d\\x4b\\x74\\x6e\\x21\\x7b\\x88\\x99\\xc7\\x47\\xa9\\x9c\\x7a\\x43\\x83\\x68\\x22\\x16\\x02\\x62\\x75\\x1a\\x75\\x21\\x45\\xe5\\x7f\\xa6\\xca\\xff\\x26\\xcc\\x4d\\x46\\x7e\\xc9\\x66\\x14\\x6d\\x92\\x8e\\x0d\\xc7\\xd3\\x59\\x92\\x00\\x8d\\xd8\\xda\\xd9\\xa4\\x07\\x5d\\x9d\\x4d\\x0b\\x37\\x4d\\x1c\\xbf\\x61\\xfd\\x84\\x49\\x1b\\x17\\xf7\\x2a\\x2b\\xed\\xd1\\x33\\x54\\xd6\\x8b\\x3b\\x3c\\xa9\\xaa\\x6a\\xd2\\x94\\x0d\\x1b\\xa6\\x94\\xf7\\xec\\x59\\x5e\\xde\\x27\\x8e\\xa9\\x47\\x03\\xc7\\xfe\\xc6\\xfd\\x02\\x06\\xb0\\xc0\\x10\\xa0\\x81\\x2c\\x1b\\x4b\\x34\\xed\\xb2\\x7f\\xd4\\xb4\\x6b\\x6d\\x68\\xda\\xb5\\xfc\\x41\\xd3\\xae\\xf8\\xbb\\xa6\\x5d\\x54\\xe6\\x75\\x8e\\x46\\xf3\\x24\\x34\\x4e\\xde\\x2c\\xc9\\xcf\\xb3\\x5d\\x98\\xd7\\x37\\xa3\\x2a\\x79\\xec\\x66\\x79\\x34\\xda\\x52\\xdf\\xbd\\xaa\\x8a\\x62\\xd8\\xd9\\x4c\\x15\\x73\\x82\\x7f\\x1b\\x52\\xc8\\xa8\\xcc\\x01\\xc9\\xa0\\x51\\x63\\x12\\xcd\\x75\\x7a\\x3b\\xb1\\x39\\x28\\x25\\x9b\\x1b\\xdb\\x3b\\x2d\\x34\\x70\\xfc\\x83\\x5e\\x4e\\x09\\x84\\x66\\xcd\\x14\\x96\\xdf\\x75\\x72\\xce\\x16\\x9e\\x5f\\xb5\\x74\\xd3\\x90\\x7b\\x9e\\x60\\xd0\\xc4\\x7a\\x8c\\x8a\\xbb\\x15\\x86\\xdb\\x74\\xe9\\xb5\\x9d\\xfb\\x78\\xf4\\xca\\x85\\xf7\\x54\\x4c\\x9f\\xb8\\x54\\x58\\xb4\\x08\\x09\\xed\\xfa\\x14\\x04\\x3b\\x74\\x0a\\x92\\xf1\\x4e\\x67\\xd6\\x30\\xdf\\xf0\\x47\\xa1\\x00\\x56\\x42\\xbc\\x5f\\x53\\xd3\\xb4\\x5f\\x13\\xe7\\x07\\x24\\x5e\\xd3\\x34\\x2b\\x47\\x79\\xad\\x51\\xbb\\x37\\x91\\xda\\xbd\\x69\\x6e\\xd2\\xbd\\x89\\xc5\\xa0\\x94\\x63\\x21\\xee\\x27\\xa2\\xcd\\x49\\xac\\xd2\\xd3\\xd6\\x4d\\x06\\x89\\x36\\x9c\\x42\\xd7\\xd5\\xd3\\xf2\\xc3\\x61\\x9c\\xa3\\x3e\\xd1\\xc1\\xc8\\x8b\\x36\\x9c\\xd3\\xd8\\xc1\\x89\\x33\\xff\\x7a\\xff\\x26\\x51\\x9f\\xe9\\xe8\\x99\\x3e\\x1d\\x7b\\x0e\\xec\\xd5\\x6b\\xc9\\x92\\x2e\\x37\\xf5\\xea\\xd6\\xba\\xdb\\xd3\\x8c\\xb0\\x6b\\xfe\\x63\\xcf\\xf7\\xe8\\xd0\\xfd\\xe6\\x9a\\xb5\\x0b\\xf6\\xb1\\x33\\x85\\xe2\\x70\\xdb\\x92\\x0e\\xe1\\xf9\\xe1\\x52\\x7f\\x9b\\x92\\x7c\\x61\\xf8\\xec\\xd9\\xd3\\xca\\x87\\xa5\\xb8\\x47\\x74\\xbd\\xeb\\x81\\x7b\\x08\\x0f\\x16\\x73\\xaf\\x31\\xd9\\xb4\\x66\\xa1\\x50\\x9d\\x1b\\x35\\x70\\x83\\x9a\\x05\\x89\\x25\\x2e\\x83\\x51\\xeb\\x26\\x53\\x51\\xc8\\x8d\\x16\\xbf\\xfa\\x1d\\x23\\x5f\\xe4\\x5e\\x43\\x7a\\x41\\xbe\\x0a\\x08\\x9e\\x90\\x47\\xb0\\x17\\x69\\x3e\\xe4\\xf6\\x66\\xb9\\x32\\xb6\\x21\\x57\\x46\\x93\\xda\\x6a\\x0a\\xc9\\xa9\\x2e\\x6e\\x39\\xaf\\x97\\x31\\x73\\x23\\xbf\\xa4\\x73\\x36\\xcb\\x98\\x09\\x26\\xd1\\x26\\x99\\x1d\\xe1\\x78\\xce\\x4c\\x5d\\x3d\\x6d\\xcc\\x99\\xe5\\x89\\x4f\\x1c\\x61\\xee\\x1a\\x33\\x6a\\xae\\x27\\x2a\\xe9\\x0a\\x17\\x0c\\xe8\\x39\\x35\\x5f\\x1e\\xc1\\x7f\\x5a\\x3f\\x3f\\xf2\\x60\\xcf\\xee\\x6c\\xde\\x95\\xa3\\x53\\x3a\\x76\\xf6\\xfa\\xe4\\x96\\x6a\\x5e\\x03\\x80\\xed\\x4a\\xeb\\x32\\xcb\\xe3\\x75\\x67\\x6a\\x53\\xbd\\x81\\x52\\xcc\\x19\\x41\\xc3\\xf9\\x31\\x67\\x95\\x04\\x82\\x58\\x03\\x98\\xb3\\xd6\\x80\\xba\\x0f\\x02\\x24\\x9c\\x06\\xb5\\x07\\x8c\\xcc\\x0b\\x5f\\x16\\x74\\x24\\x56\\x3f\\x39\\x3a\\x30\\x26\\xd7\\xb3\\x9f\\xfd\\x1d\\xf1\\x97\\x2b\\x18\\x2d\\x62\\xe9\\x7d\\xb6\\x33\\xd3\\xd1\\x78\\xb6\\x6b\\xa3\\x8f\\xd0\\xc7\\x6e\\xdc\\x44\\x4e\\xd0\\xd3\\xf6\\xa3\\xcc\\xf4\\x7f\\xfe\\x53\\x9d\\x4b\\x72\\x5f\\xf4\\x12\\x7d\\x7a\\x63\\x07\\xb5\\xce\\x48\\x12\\x34\\x31\\x12\\xea\\x42\\xdc\\xbd\\x5b\\xe9\\x23\\x06\\x8c\\x76\\x35\\x1f\\x6d\\x64\\x45\\x9b\\xa4\\xd5\\x91\\x29\\x23\\x80\\xda\\x62\\xa3\\x89\\xaf\\xd8\\xaa\\x78\\xb3\\x3c\\x14\\x57\\x9a\\xd9\\x3d\\x2b\\x7b\\x0e\\xf6\\xac\\x34\\xde\\x74\\xdb\\xd6\\x75\\xf2\\xfe\\x96\\x2d\\x4b\\x72\\x35\\x4b\\x4b\\x0d\\xfd\\x2b\\x46\\xcc\\xa4\\xf7\\xbd\\x93\\x79\\x02\\xad\\xe4\\xa3\\x6a\\x1d\\xb3\\x6a\\x22\\x35\\x31\\x5a\\xcc\\xd2\\xe0\\x23\\x2d\\xd7\\xf5\\x91\\x39\\xa2\\x4f\\xbc\\x13\\x15\\xbd\\xc8\\xe7\\x3f\\xec\\xbe\\xfa\\x4f\\x66\\x0d\\xc5\\x2a\\xd5\\xac\\x3f\\x5e\\xa3\\xdb\\x1a\\xe2\\xa5\\xb9\\x3c\\x5d\\xf6\\x17\\xf9\\xc6\\xd5\\x17\\x4b\\xe3\\xea\\x8b\\xe5\\x3a\\x15\\xba\\x7f\\xf0\\xcc\\x8e\\x39\\x07\\xb6\\x6c\\x3d\\xf0\\xda\\x96\\xad\\x07\\xf7\\x56\\xde\\x36\\x60\\xc8\\xd0\\x81\\x03\\x2b\\x39\\x74\\xef\\xfa\\xd7\\x5e\\x5b\\x7f\\xef\\x86\\x57\\x5f\\xdd\\x50\\x39\\x71\\xd2\\xe0\\x7b\\x07\\x4e\\x9e\\x3c\\x90\\xd8\\xcc\\x69\\xb0\\x89\\x5d\\xcc\\xee\\x53\\xf1\\x43\\x39\\x62\\x43\\xc8\\x89\\x42\\xea\\xc7\\x34\\x50\\x94\\xf5\\x28\\x4f\\xfe\\xe4\\x68\\x62\\x63\\x13\\x5a\\x8d\\xd6\\xc8\\xf7\\xdb\\xe5\\xfb\\x1b\\x36\\x88\\xdf\\x7e\\x05\\x80\\xff\\x8a\\x3f\\x42\\xfb\\xe6\\x1c\\x90\\x0c\\x8f\\x43\\xc4\\xd6\\xd0\\x19\\xef\\xb0\\x59\\x3d\\x87\\x03\\xd8\\x12\\xa2\\x9d\\x56\\xa6\\x60\\xc4\\xe9\\xa0\\x71\\xb8\\x41\\xd7\\xd8\\x35\\xaf\\x51\\x93\\x33\\xbf\\x63\\x22\\xc1\\xd2\\x36\\xe4\\xc7\\xae\\xa0\\x24\\xaa\\x86\\x30\\x95\\xcc\\x37\\x8e\\xb8\\x0c\\x5d\\x38\\x8c\\x6d\\x62\\x8d\\x46\\xab\\x37\\x38\\x29\\x6a\\x75\\xd8\\xd4\\x15\\x3e\\xa7\\x28\\xe9\\x85\\x70\\x18\\x83\\x2d\\xc2\\x6a\\x93\\xc2\\xe1\\x86\\xe2\\x75\\x55\\x16\\xf4\\x79\\x27\\x6a\\xcb\\xb4\\xd3\\x57\\xe6\\x2d\\x0f\\x89\\x79\\x9a\\x57\\x50\\xd1\\x8b\\x69\\xea\\x53\\x4d\\x6e\\x45\\xcf\\xee\\x9d\\x3f\\x7f\\xb7\\x7c\\xe7\\x8b\\xbf\\x08\\x26\\x3e\\x4f\\x95\\xd9\\x95\\xb5\\xf4\\x19\\x26\\xcb\\x18\\x5f\\xfd\\xa5\\x45\\x9b\\x36\\x2d\\x42\\xad\\x90\\x0b\\x58\\x4a\\xf7\\xbf\\xe3\\x74\\x67\\xc3\\xae\\x78\\x77\\xb0\\x33\\xae\\x17\\x35\\x26\\x4f\\x12\\x63\\xf2\\x13\\xbb\\x18\\xf1\\xd0\\x70\\xd3\\x93\\x7d\\x0d\\xcd\\x39\\x37\\xa0\\x39\\x5b\\x5d\\x0d\\xf2\\x99\\xe9\\xca\\x26\\x91\\xbc\\xd5\\x12\\x23\\x5c\\xc8\\x6d\\x46\\x7e\\xb6\\x88\\x0d\\xb4\\x24\\x57\\x13\\xc6\\xe9\\x62\\xb5\\xc9\\xe1\\xd4\\x52\\x4e\\x78\\x9c\\xa2\\x6d\\x1f\\x27\\xe8\\xad\\x2c\\x09\\xee\\x25\\x48\\x8a\\xcf\\x81\\xdf\\x31\\x42\\x87\\x6e\\xec\\x35\\x08\\x4f\\x5a\\xa8\\x3c\\xf9\\xf0\\xfa\\x0e\\xe4\\x1a\\xee\\xa0\\xb7\\xaf\\xef\\x4f\\x38\\x58\\x08\\x20\\x6c\\xe3\\xdf\\x86\\x02\\x28\\x86\\x30\\x74\\x80\\xcf\\x20\\x52\\x0e\\xe0\\xc7\\xe1\\x00\\x2e\\x0d\\x49\\x6d\\x34\\x31\\x1c\\x0c\\x46\\xda\\x84\\x09\\x07\\xda\\x94\\xfc\\x81\\x7b\\xc1\\x8e\\x00\\x8d\\x7b\\x1a\\x3d\\x11\\xc2\\x1d\\xff\\xba\\xc3\\xc1\\x39\\x56\\x12\\xef\\xe0\\xb6\\x41\\xa9\\x95\\x25\\x86\\x5b\\x06\\xa5\\x4e\\xcd\\x3c\\x50\\x24\\x2d\\xdf\\x1f\\xa6\\x3e\\x48\\xca\\x2a\\x0e\\x87\\x71\\xb9\\x58\\x53\\x58\\x14\\x28\\x69\\x43\\x79\\xda\\x26\\x2c\\xda\\xa4\\x80\\x3f\\x1c\\xc6\\xf9\\x22\\x6e\\x1f\\xfe\\x9d\\x87\\x8a\\x64\\x16\\x16\\x5d\\xdb\\x8e\\xfe\\x67\\x5e\\x4a\\x77\\x1d\\x55\\x5c\\xf8\\x27\\x9e\\x0b\\x3d\\xaa\\xca\\x64\\x70\\x53\\x3d\\x65\\xef\\xfe\\x23\\x77\\x56\\xbf\\xef\\x3a\\xda\\xab\\xf6\\x4a\\xce\\x62\\x5f\\xe0\\xda\\xd2\\xde\\xcf\\x29\\x10\\x49\\x23\\xf0\\x2d\\x55\\x1f\\xc3\\x49\\x01\\xc9\\xca\\xc5\\x22\\xd6\\x24\\xc2\\x39\\xab\\x23\\xde\\xf9\\x09\\xf4\\xc1\\x2d\\xd8\\xa4\\x76\\x7e\\x0a\\x6a\\xe7\\xa7\\xa6\\xa1\\xf3\\xd3\\x69\\x55\\x3b\\x3f\\x53\\x4d\\xa2\\x2d\\xc2\\x19\\x58\\xc2\\xc9\\x0c\\x31\\xa2\\xb7\\x26\\x51\\xc0\\x92\\x4a\\xf3\\xaa\\x82\\x93\\xf2\\xc8\\x5d\\xda\\xaa\\xbc\\x03\\x2a\\x0b\\x99\\x91\\xc6\\x8c\\x9c\\xcd\\xa2\\x46\\x54\\x16\\x72\\xce\\x5c\\x79\\x6f\\x59\\x52\\x94\\x29\\x19\\x3b\\x66\\xc0\\xf4\\x49\\x43\\x1f\\x3c\\xc0\\x32\\xb1\\xea\\xa3\\x9f\\xa0\\x1e\\xa7\\x4c\\x0b\\x3e\\x9c\\x59\\x76\\xdb\\xed\\x6b\\xa7\\x0f\\x9b\\x35\\x7f\\xf0\\xa4\\x99\\xa3\\x47\\x08\\xdb\\xdf\\x3c\\xce\\xf9\\xdf\\x7f\\x1f\\x68\\x45\\x22\\xed\\x2d\\xd4\\x64\\x81\\x86\\x3e\\xb1\\x34\\x70\\x6d\\x77\\xa1\\x29\\xd1\\x5d\\x88\\x8d\\x01\\x84\\xc5\\x00\\x31\\x2d\\x20\\x21\\x13\\x45\\x52\\x4d\\x1a\\x0c\\xcb\\x43\\x76\\xf2\\xd9\\xb4\\xcb\\x70\\x0b\\xfb\\xdd\\x4b\\x5b\\xdf\\x6b\\xda\\x6a\\xa8\\x49\\x13\\xe4\\x5f\\xaf\\x72\\xb4\\xdf\\x50\\xbd\\x6f\\x06\\xed\\x69\\xb4\\xfe\\x61\\x57\\x63\\xc3\\x4d\\xaf\\xd7\\xd5\\xc8\\xda\\x43\\x6e\\x74\\x6d\\x6b\\x63\\x88\\x62\\x89\\xa6\\x0d\\x8e\\x68\\xa4\\x8a\\x2b\\x12\\xf7\\xed\\x09\\x1a\\xb0\\x82\\xe3\\xf7\\xf7\\x15\\x1b\\xef\\xeb\\x0c\\x48\\x2e\\x7a\\x5f\\x51\\xb4\\x61\\x7b\\xd3\\xfb\\x96\\x95\\x87\\xdc\\x4e\\x5f\\x9e\\xe6\\x1a\\x82\\x97\\xfe\\x3a\\xe7\\x3f\\xdb\\xd7\\xad\\x1d\\xd1\\x94\\x64\\xe1\\xa6\\x94\\xef\\x7f\\x48\\x5e\\xbf\\xfe\\xca\\x69\\x66\\x63\\x13\\x7e\\x0f\\x04\\x0d\\x7d\\xe6\\xd5\\x83\\xd7\\xde\\x3f\\xad\\x81\\xdf\\xce\\x80\\x64\\xe6\\x63\\xd5\\x49\\x66\\xa7\\xd6\\x2f\\x19\\x78\\xb5\\x62\\x4c\\x5b\\x5b\\x93\\xaa\\x06\\x68\\x69\\xf4\\x61\\x09\\x22\\xf2\\xd7\\xd8\\xd4\\x18\\xc1\\x4b\\xf4\\x48\\x4b\\x17\\x64\\xb0\\x28\\xee\\x63\\x0c\\xc8\\x99\\x91\\x49\\xa2\\x2d\\x9b\\x4d\\xe2\\x69\\xa2\\x09\\xa5\\x89\\x36\\x9c\\x41\\xfb\\x65\\x53\\xc3\\xd8\\x6c\\xc3\\xda\\xa6\\x44\\x51\\xcf\\xd8\\x98\\xa1\\x27\\xd3\\xef\\x1a\\xfa\\xee\\x9c\\x35\\xac\\xf5\\xf3\\xa5\\x2d\\xda\\x4d\\x99\\x3d\\xb4\\xc7\\xe6\\x90\\xbf\\x0d\\xd7\\x8c\\xd0\\xdb\\xef\\x58\\x3e\\xfc\\xa6\\x80\\x67\\xf8\\xa2\\x3b\\x6e\\x2a\\xbe\\xf2\\x29\\xb3\\x11\\xb8\\x38\\xad\\x26\\x2a\\x63\\x0b\\xd8\\x61\\xc2\\xb5\\xd4\\x1a\\x1b\\xa8\\xd5\\x06\\xb0\\x35\\x24\\xe9\\xf4\\x31\\x2c\\x06\\xe9\\x22\\xa8\\xb6\\x56\\x32\\x18\\x69\\xab\\x8f\\x95\\xe0\\x78\\x63\\xbc\\x5e\\x49\\x4b\\xec\\xb8\\x31\\x1c\\xc6\\x56\\xb1\\x9a\\x41\\x66\\x0b\\x21\\xd0\\xae\\x2e\\x02\\x81\\x84\\x8c\\xf1\\x95\\xd0\\x46\\x49\\x85\\x28\\x11\\xe4\\xb3\\x09\\x21\\xa3\\x4e\\xcf\\x22\\x43\\x9f\\x77\\xba\\x61\\xf0\\xdd\\x8e\\x1d\\xbb\\xf2\\x11\\xb3\\x11\\xad\\x3d\\x76\\xac\\x61\\xdc\\x2b\\xe9\\xb8\\xdd\\xe0\\x83\\x19\\x37\\xd4\\x4e\\xec\\x0c\\xd4\\xa4\\x6a\\xc0\\xc1\\xf9\\xb1\\x97\\x2e\\xeb\\x38\\xe2\\x2b\\x07\\xc6\\xda\\x9a\\x24\\x55\\x50\\xea\\xa3\\x12\\x12\\x52\\xca\\x41\\x7e\\x29\\x23\\x49\\xb4\\xed\\x63\\x90\\xde\\xe2\\x34\\x50\\x33\\x19\\x57\\xec\\xf8\\x23\\x12\\x8c\\xe1\\x6b\\x55\\xfc\\x06\\x21\\xde\\xb5\\x5a\\xff\\xf7\\xb9\\x83\\x07\\xcd\\x99\\x7d\\xdb\\xe0\\xb9\\xe3\\x3b\\xf8\\x0b\\xda\\xb5\\x2b\\xf0\\x77\\x68\\x3a\\x03\\x18\\xfb\\xc0\\x99\\x33\\x06\\xdd\\x36\\x65\\xca\\x6d\\xfe\\xf6\\x6d\\x8b\\x8a\\x3a\\x74\\x00\\x46\\xb9\\x00\\xa0\\x19\\xc9\\x63\\x2a\\x9b\\xf9\\x10\\x31\\x12\\x1a\\x21\\xd4\\xbc\\xc9\\xd3\\x6c\\x35\\x12\\x5a\\xcd\\xda\\x58\\x0d\\xaf\\x35\\x36\\xf4\\x7b\\xaa\\xfd\\x77\\xea\\xa3\\x0e\\xb1\\xce\\x53\\x2b\\x4a\\x46\\x2b\\xb1\\x11\\x92\\xce\\x1a\\x8b\\xe8\\x8c\\x89\\x48\\xb0\\xba\\x93\\xce\\x40\\x5c\\x91\\x95\\x3e\\x87\\x06\\x9b\\x42\\x92\\xd6\\x4a\\x9b\\x66\\x68\\x37\\x12\\xc7\\x13\\x82\\xed\\x84\\x60\\x1f\\xf2\\x3a\\xbd\\xf6\\xf8\\x8b\\xf5\\xb2\\xc8\\xcb\\xe6\\x39\\xd8\\xe9\\xec\\xdb\\xf5\\x7d\\x1d\\x4c\\xbf\\xfa\\x57\\x5c\\xcc\\x1b\\x57\\x1f\\xb4\\xd4\\xff\\xe3\\x04\\x6a\\x89\\x0e\\x65\\xf2\\x3c\\xae\\x92\\x8b\\xab\\xea\\x2f\\x6e\\x46\\xc3\\xe5\\xa7\\x19\\x91\\x39\\xca\\x10\\xdb\\x3c\\x4b\\xee\\x46\\xfb\\x7e\\xd3\\xa1\\x08\\x1e\\x51\\xeb\\x01\\x6b\\x72\\xa8\\x4c\\xae\\xd7\\xd0\\x89\\x8b\\x02\\x35\\x19\\x71\\x00\\x5c\\xdc\\xb4\\x9f\\x93\\xcc\\xa4\\x02\\x7b\\x0c\\x17\\x34\\xb4\\x76\\x26\\x59\\x89\\xd5\\xa6\\xc5\\x10\\x5e\\xab\\x68\\x7b\\xd9\\xc8\\xd9\\x53\\x33\\xb2\\x73\\x8a\\xd4\\x55\\x03\\x29\\x37\\x8f\\x5a\\xeb\\x0c\\xd1\\x16\\xc9\\xce\\x2b\\x08\\x87\\xc3\\x92\\x31\\x47\\xb4\\x55\\x6b\\xec\\xae\\x24\\x35\\x17\\x48\\x3b\\x3c\\x21\\x9e\\xf3\\x6b\\xd2\\x23\\xec\\xa2\\xe9\\x8e\\x6b\\x40\\x35\\x6d\\x18\\x46\\xd9\\x5c\\xd3\\x8e\\x61\\x4e\\xfe\\xf8\\x97\\xdf\\xe4\\xe3\\xe8\\xef\\x4d\\x00\\x77\\xa2\\x7f\\x58\\xbe\\xf4\\x49\\xf3\\xe6\\xe1\\x93\\xf2\\x05\\x34\\xbc\\x7e\\xe2\\x35\\x70\\x3c\\xde\\xf3\\x74\\x9f\\x26\\x8b\\x5a\\xdc\\x81\\x7f\\xdc\\xd1\\x8b\\xad\\xd4\\xdc\\xff\\x49\\x53\\xaf\\x8d\\xc4\\x56\\x34\\xf9\\x67\\xa2\\xf8\\xba\\x69\\x7b\\x2f\\x22\\x2e\\xa1\\x49\\x8f\\xef\\xd5\\x7d\\xb4\\x3e\\x3d\\xd1\\xe9\\x4b\\x7d\\x41\\xc3\\x98\\x32\\xe8\\x98\\xfe\\xb4\\xcb\\xf8\\xaf\\x0c\\xe8\\xda\\x61\\x10\\x07\\xd1\\x64\\x18\\xf5\\x4f\\xc5\\x9d\\x43\\x7c\\x1c\\x82\\x43\\xf5\\x0c\\x8d\\xfc\\xe9\\x09\\x06\\x70\\xc0\\xad\\x7f\\x36\\x16\\xe7\\x9f\\x8d\\xc5\\xf5\\x47\\xcc\\x49\\xb8\\x90\\xa6\\x0c\\x3a\\xa6\\xfa\\x8f\\xc6\\xa1\\xc5\\x7d\\x07\\xf5\\x1b\\xea\\xd8\\x4c\\x71\\x4b\\x3a\\xf1\\x4f\\xa4\\x67\\xa4\\xe6\\xd4\\xd4\\x68\\x4e\\xff\\x70\\xa8\\xd5\\x46\\x1d\\x68\\xfd\\x92\\xc5\\x18\\xc3\\xba\\x66\\xf6\\xf6\\x77\\xa3\\x56\\x93\\xf2\\x4d\\x07\\xfd\\xf4\\xe9\\x2b\\xa7\\x1b\\x47\\xdc\\x8d\\x66\\xea\\x01\\x18\\xe5\\x0c\\x00\\x5a\\xa2\\xc9\\x02\\x0e\\xb4\\xc4\\xcb\\xf2\\x24\\xb6\\x11\\x18\\x5a\\x0f\\x4a\\xbb\\x5b\\xf8\\x5a\\x5a\\x1f\\xa7\\x27\\x91\\x1a\\x2f\\xda\\x22\\x0c\\x47\\xd0\\x0f\\x2d\\xda\\x24\\x50\\x42\\x0c\\x89\\x59\\x44\\x5f\\x52\\x8e\\x52\\x45\\xb9\\x74\\x4e\\xed\\x10\\x66\\xe0\\x75\\x00\\x66\\x82\\x26\\x03\\x58\\xd0\\x26\\x9e\\xaa\\x16\\x5f\\x9a\\xd7\\x35\\x04\\xc2\\xfa\\x78\\x82\\x21\\xc2\\xf1\\xda\\x70\\x9c\\xf7\\x21\\x91\\x42\\x85\\xd7\\x8f\\x1e\\x6c\\x00\\x07\\x8d\\xa2\\x07\\x46\\xf9\\x19\\x80\\x19\\xac\\xe9\\x09\\x5a\\x30\\x92\\xeb\\xd2\\x2a\\x18\\x3d\\xbd\\xae\\x29\\x80\\x75\\xb4\\xb8\\x93\\x36\\xd7\\x1b\\x75\\xa2\\x2d\\xc2\\x32\\x9a\\xf8\\x60\\x13\\x72\\xb4\\x8b\\x21\\xd1\\xa2\\xca\\xaf\\xe8\\x68\\x42\\x70\\x97\\x0e\\x25\\xfa\\x9a\\x59\\xe5\\x1d\\x00\\xe6\\x01\\x8d\\x89\\xae\\x89\\x18\\xa0\\x53\\xfc\\x39\\x68\\x3c\\xe1\\x08\\x04\\xb0\\x36\\x44\\x1f\\xc2\\xa2\\x0b\\x26\\xda\\x5c\\x9b\\x2e\\x8a\\xa8\\xcd\\xb8\\xb4\\xc9\\xd9\\x98\\x68\\xc4\\x66\\xcb\\x42\\x4e\\x72\\x4f\\xe2\\xd9\\xca\\x4e\\x27\\x1d\\x4d\\x3f\\x4d\\x78\\x7f\\xe9\\x35\\x4a\\x57\\x37\\x55\\x06\\x50\\x00\\xc0\\xeb\\x78\\x4c\\x63\\xe6\\x3b\\x54\\xfb\\x2e\\x99\\x13\\xcf\\xb5\\x71\\xb3\\xb1\\x1a\\x04\\x46\\xd6\\xe4\\xc7\\x29\\x6a\\xaa\\x2f\\x29\\x48\\xc3\\x68\\x23\\x4d\\xea\\x99\\xe9\\x63\\x44\\x23\\x66\\x6a\\xca\\xcd\\x29\\x3a\\x7f\\xc4\\x48\\x17\\x03\\x8d\\x24\\xdc\\x32\\xd3\\x10\\x33\\x51\\xe0\\xa8\\x26\\x1c\\x12\\x8f\\x1a\\x68\\x81\\x44\\x7b\\xc3\\xc3\\x06\\x88\\xe2\\x14\\x3c\\xdf\\xf8\\xc4\\x01\\xf9\\xa6\\xa8\\xfa\\xcc\\x01\\xe4\\x90\\x2f\\x30\\x1b\\xab\\x98\\xf9\\x0d\\x8f\\x1e\\x60\\x36\\xca\\x6c\\xfc\\xe9\\x03\\x72\\x7a\\x55\\x62\\x3e\\xf2\\x48\\x33\\x10\\x0c\\x90\\x09\\xab\\x7e\\xd7\\x11\\x8c\\x93\\x03\\x92\\x8d\\x8f\\x55\\xa7\\xd9\\x92\\x89\\xf2\\xf2\\x0d\\x35\\xf5\\xf1\\x16\\x61\\xa3\\xc1\\x5f\\x93\\xa9\\xfa\\xe0\\x4c\\x2b\\xd1\\xe6\\x1a\\x97\\xfa\\xcd\\xd5\\xd8\\x3e\\x4c\\x4c\\x7d\\xa6\\x41\\xb4\\x49\\x8c\\x2e\\x1c\\x96\\x38\\x97\\x68\\x93\\x58\\x6d\\xb8\\x69\\x13\\x31\\x4e\\x16\\x71\\x66\\x18\\xa7\\xd1\\xfa\\x41\\x0b\\x09\\x97\\x5d\\xd7\\x34\\x16\\x5f\\x0f\\x39\\x35\\x36\\x1b\\x73\\xd7\\x80\\xa6\\xe6\\xcd\\xc7\\xcd\\x50\\x13\\x9d\\xe7\\xb4\\x17\\x59\\x53\\x4e\\x65\\xe6\\x81\\xf6\\xd7\\xed\\x46\\xf6\\x5e\\xaf\\xd2\\x34\\xeb\\x9a\\x67\\x9c\\xfe\\x49\\x43\\x32\\x45\\xec\\x37\\xec\\x4a\\xee\\x48\\xe6\\xde\\x5f\\x69\\x4d\\x66\\x6b\\x69\\xbf\\x51\\x62\\xdc\\xa1\\xff\\xef\\xe3\\xa6\\xf6\\xfc\\x86\\xe3\\x46\\x05\\x74\\x76\\xff\\x95\\x91\\x33\\xa7\\xe2\\xb3\\x3f\\x31\\xf6\\x3b\\xe8\\xd8\\xb3\\x6f\\x30\\xf6\\x9c\\xeb\\x8d\\x3d\\xb7\\xc9\\xd8\\x3d\\x7f\\x81\\xe7\\x09\\x6b\\x71\\xc3\\xf1\\xf7\\x57\\x4d\\xc8\\x5f\\x1a\\xff\\x95\\xb8\\x77\\x48\\x8c\\x7f\\x22\\x1d\\x7f\\x00\\xee\\xbb\\xce\\xf8\\x71\\x8b\\x80\\x94\\xc5\\xc7\\xaa\\x0b\\xb3\\x5a\\x68\\xfd\\x52\\x26\\xdf\\xf0\\x54\\xaf\\x38\\x41\\x69\\xc8\\x5f\\x13\\x50\\x67\\x47\\xc0\\x4a\\x40\\x6a\\x4d\\xae\\xfa\\x2d\\xb7\\x91\\xd8\\x96\\xc8\\x2f\\xe5\\x04\\x44\\xdb\\x3e\\x83\\x98\\x94\\xc9\\xb5\\xa0\\xd0\\xb5\\x05\\x27\\xda\\x70\\x20\\x8c\\xb3\\x44\\x9c\\x16\\xfe\\x13\\xe2\\xaf\\x33\\x4d\\x6e\\xc8\\x87\\x16\\xd7\\xcc\\x9a\\xbf\\xa4\\x8a\\xae\\xe6\\x73\\x89\\x8b\\xf3\\x25\\x2b\\xfe\\x7c\\x61\\x1f\\x8c\\xb8\\x1e\\x67\\xd2\\x02\\xd8\\x13\\x92\\xd2\\xf5\\x31\\xec\\x6d\\x28\\x91\\x6f\\xe4\\x8a\\x94\\x69\\xa4\\x65\\xb1\\x24\\x4a\\xf7\\x19\\x69\\x6a\\x29\\xc1\\x0f\\x02\\xe5\\x3d\\x99\\x44\\xf8\\x62\\x12\\xf7\\x57\\x84\\xaf\\x3a\\xcf\\x1b\\xd2\\x5c\\x78\\xfa\\xca\\xe9\\xbf\\x24\\x78\\x45\\x75\\xb2\\x08\\x2a\\xe1\\x4b\\xf6\\x4b\\x6e\\x2e\\x18\\x00\\xec\\x3a\\x54\\xae\\x43\\x6e\\x1d\\xd2\\xe8\\x50\\x25\\xea\\x21\\xbf\\x3a\\x1f\\x75\\x47\\x3d\\xe6\\xcb\\xaf\\xa0\\x9e\\xf3\\xe5\\x57\\xe5\\xfd\\xe8\\x4e\\xd4\\x0f\\xf5\\x9b\\x2f\\x57\\xa3\\xbe\\xf3\\xe5\\x88\\x1c\\x99\\x8f\\x6e\\x96\\x6b\\x54\\xdd\\x7f\\x9a\\x67\\xf8\\xef\\x21\\x19\\x72\\xa0\\x25\\x8c\\x8d\\x77\\xf4\\xb7\\x48\\x70\\x28\\x8b\\xe8\\x7e\\xb0\\xa1\\xff\\x3d\\x85\\x2e\\x04\\x12\\xfe\\x48\\x21\\xe4\\x57\\x1b\\x04\\x9c\\x61\\x5c\\x28\\xee\\xd3\\x88\\x0e\\x2e\\x33\\x97\\x00\\x62\\xb3\\xfa\\xcc\\x9f\\x16\\xa2\\x68\\x93\\x1c\\xee\\x30\\x51\\x8e\\x88\\x3e\\xa3\\x65\\x38\\x1c\\xc6\\x5c\\xe3\\x13\\x4f\\xbc\\xb4\\xfa\\x9a\\x40\\x5e\\xf2\\x25\\x2b\\x37\\x4f\\xe3\\x2b\\xa7\\x75\\x0c\\x99\\x08\\x15\\x23\\xca\\xb0\\x0c\\xa4\\xb2\\x2f\\x37\\xa0\\x4e\\xf8\\xe1\\xbb\\x7a\\xde\\xba\\x61\\x49\\xdf\\x41\\x84\\x71\\x83\\x36\\x76\\x1a\\xb6\\xe1\\x91\\x81\\x43\\xa2\\xb9\\x3e\\x81\\xf1\\x04\\x1f\\xe8\\xb9\\xe7\\xe4\\xce\\xc2\\x49\\x1d\\x5e\\xfe\\xc8\\x9b\\x21\\x24\\x98\\x18\\x2a\\x5e\\xfe\\xf9\\xc0\\xaf\\x1e\\x54\\xf9\\xd8\\x22\\x7f\\xf3\\xf9\\x81\\x17\\x56\\x0c\\x5a\\x5b\\x8a\\xd8\\xf5\\x2d\\x0a\\x15\\x38\\x56\\x7f\\x6f\\x56\\x16\\x65\\x6b\\x9f\\x87\\x83\\x88\\xfa\\x1b\\xda\\xe3\\xad\\xc9\\x02\\x11\\x5c\\xd0\\xe1\\xf7\\x5d\\xde\\xd8\\x15\\xa0\\x25\\x32\\xbf\\x6f\\xf4\\x4e\\x8a\\x57\\xe5\\x46\\x2c\\x36\\x67\\x38\\x7c\\xfd\\x66\\x6f\\x6a\\x70\\x9b\\x75\\x7c\\x7f\\x49\\x8c\\xec\\xef\\xda\\xbe\\x85\\x52\\x6a\\x51\\x1b\\xc7\\x93\\x41\\xc7\\xd3\\xf6\\x7a\\x5d\\xe7\\xff\\xf3\\x60\\xa8\\x15\\x6d\\xde\\x7e\\xfe\\x2e\\xb5\\x9c\\xbf\\x1b\\x0e\\x5f\\xd8\\x88\\x8f\\xd5\\xf1\\xf4\\x04\\x11\\x52\\xae\\x3f\\x9e\\xd4\\xeb\\x8d\\x27\\xad\\x71\\x3c\\xae\\x1b\\x32\\x27\\x61\\x19\\x9b\\x8d\\xe9\\xff\\x54\\x6b\\xf8\\xfb\\x31\\x0d\\x49\\x00\\xe3\\xff\\x47\\xdb\\xb7\\xc0\\x47\\x51\\x9e\\x7b\\xff\\xdf\\xb9\\xec\\x7d\\x93\\x99\\xdd\\x4d\\x36\\xf7\\xec\\xe6\\xb6\\x84\\x4d\\xb2\\x9b\\xdd\\x04\\x12\\xc2\\x35\\x21\\xd1\\x2a\\x02\\x62\\xd5\\x68\\x15\\x0c\\xb7\\x04\\x44\\x88\\xdc\\x44\\xda\\x53\\x01\\x51\\x11\\x41\\x11\\x2c\\xc7\\x5b\\xab\\xa0\\x55\\x01\\xab\\x33\\x9b\\x15\\x91\\xcf\\x7a\\xf0\\x12\\xc4\\x62\\x6d\\xcf\\xf1\\x48\\x3d\\x62\\xbd\\x54\\x8f\\xba\\x42\\xfd\\xb0\\xad\\x9e\\xb6\\x90\\xcd\\xf7\\x9b\\x77\\xde\\xdd\\x6c\\x36\\x09\\x60\\xfb\\x9d\\xf0\\x1b\\xde\\x99\\xcd\\x66\\xe6\\x7d\\xfe\\xef\\x33\\xef\\xed\\x79\\x9e\\xff\\xc3\\xb3\\x3a\\xd9\\x21\\x23\\x8b\\x66\\x03\\x1a\\xda\\x6a\\x8e\\x80\\x92\\x1d\\x56\\x9d\\x16\\x6d\\x3e\\x93\\xf0\\x67\\x64\\x55\\xd4\\x26\\x31\\x59\\xb6\\x98\\x92\\xa5\\x13\\xe0\\xe7\\xda\\xa8\\x0d\\x31\\x51\\xf1\\x7c\\xe2\\x57\\xb3\\xb3\\x64\\x87\\x9a\\x69\\x18\\xb1\\xda\\xfa\\x3b\\x3d\\xa8\\xd6\\x6f\\x1d\\x3f\\x7d\\x7c\\x68\\x95\\xaf\\xa5\\x2f\\x2d\\xa7\\xc7\\x7c\\x1b\\x0b\\x61\\x82\\x1d\\x75\\xe9\\x51\\xdf\\x19\\xc9\\xa8\\xef\\x4c\\x16\\xf5\\x1d\\xe1\\xcc\\x76\\xba\\x17\\x38\\x34\\xf2\\x9b\\x9a\\xcd\\x06\\xc2\\xbf\\x6d\\x6c\\x5e\\x3b\\x10\\x04\\x2e\\x18\\x06\\xe6\\xb7\\x78\\x0c\\x10\\x3a\\x28\\x4f\\x65\\x16\\x2e\\x4e\\x99\\x37\\x47\\xad\\xfa\\x16\\x9f\\x95\\x8f\\x45\\xf9\\xac\\x01\\x5a\\x9b\\xec\\x44\\x48\\x93\\xca\\xd9\\x43\\x21\\xc5\\xa6\\x47\\x08\\x19\\xad\\xcc\\x05\\x99\\xc6\\x86\\x24\\xe2\\x9b\\x86\\x52\\x89\\x3c\\xd6\\x4b\\xec\\x5f\\x10\\x21\\x7e\\xe6\\x8b\\xf8\\x9f\\x89\\x7d\\xc7\\x8e\\x1d\\x3b\\xe2\\x7f\\x16\\x95\\xf8\\xf1\\x93\\xbf\\x7c\\xe9\\x44\\xfc\\x75\\xf2\\xf6\\xc3\\x37\\x2e\\x7f\\x44\\xf7\\x0b\\xbe\\xb3\\xff\\x84\\xd0\\x6d\\x70\\xc2\\x87\\xd5\\xac\\x56\\x12\\xf4\\xd9\\xa9\\x52\\xca\\x42\\xb9\\x75\\xc6\\x45\\x9f\\x95\\x32\\xcc\\x69\\x1d\\xb1\\x51\\x8a\\xf5\\x58\\x8c\\x1e\\x93\\x5f\\x2d\\xb4\\xc6\\x94\\xc2\\x00\\x0d\\x01\\x31\\xea\\x64\\x23\\x76\\x46\\xc5\\x58\\xe8\\x93\\x1d\\x3d\\x82\\xcb\\x49\\x3d\\xfb\\x2c\\xb2\\x2a\\xb9\\x1b\\x99\\x4f\\xad\\xe2\\x6c\\x54\\x4a\\xe5\\x88\\xd1\\xee\\x62\\x94\\x35\\x89\\xfd\\x95\\x2c\\x17\\xb2\\x52\\x83\\xf8\\xea\\xeb\\x50\\x5f\\x97\\xd8\\x8a\\x96\\xef\\x3c\\xf1\\xfc\\xae\\x5f\\xad\\x27\\x3f\\xf8\\xf7\\xc8\\xf7\\xd5\\xf2\\x2a\\xff\\x86\\x09\\x4b\\x16\\xc6\\x7f\\xbe\\x75\\x61\\x73\\xd7\\x3a\\x61\\xdc\\x87\\x7f\\x7f\\xfa\\xc9\\xd5\\xef\\x37\\xce\\x8a\\x7f\\x7a\\xd7\\x93\\x7b\\x2b\\x8b\\x1e\\x29\\x08\\xce\\x99\\xfe\\x7d\\x52\\xbc\\x7d\\xe6\\xef\\xa7\\x5d\\xbb\\xe4\\xc9\\xfb\\xa9\\x3b\\x3c\\x78\\x3d\\x26\\x5b\\xfc\\x08\\x1e\\x94\\x23\\x88\\x07\\x75\\xdb\\x87\\x4e\\x3a\\x55\\x29\\xc4\\x22\\x52\\x32\\x2a\\x5b\\x1a\\x88\\xca\\xae\\x29\\x92\\x12\\x51\\xd9\\xb5\\x14\\x87\\x0a\\x6b\\x4c\\xa9\\x60\\x51\\xd9\\x6c\\xcf\\xc5\\x2a\\x69\\x1f\\x51\\x7d\\x15\\xaa\\x42\\xd4\\x73\\x5a\\x0d\\x69\\x4a\\x0c\\x9d\\xb4\\xa7\\x42\\x56\\xbd\\x25\\x8d\\x8d\\x6a\\xbe\\x55\\x76\\x3c\\x27\\x15\\x95\\x96\\x95\\x6b\\xa3\\xb7\\xe2\\x92\\xa9\\x8b\\x0e\\x5f\\xa4\\x75\\xd4\\xf9\\x7a\\xa0\\xb6\\xdd\\x39\\x34\\x50\\x7b\\x18\\xb7\\x1c\\x7d\\xbf\\x77\\xb8\\x50\\x6d\\xc3\\x89\\x83\\x83\\x42\\xb5\\x7f\\xa4\\x75\\x72\\xea\\xd0\\x78\\xed\\xd5\\xaf\\x0d\\x0a\\xd6\\x16\\x9b\\x0d\\xf1\\x6f\\xcf\\x5c\\xc1\\x42\\xb6\\x93\\x58\\xbd\\x4f\\x7d\\x93\\x82\\xd8\\x99\\x8a\\x55\\xd9\\x48\\x58\\x55\\xa6\\x63\\xe5\\xb5\\xc6\\x14\\xef\\x50\\xac\\xbc\\x0c\\x2b\\xdf\\x50\\xac\\x12\\x18\\x95\\x55\\x55\\x07\\x75\\x8c\\x22\\x39\\x35\\x01\\xfa\\x06\\xfe\\x23\\x38\\xa5\\xb8\\x2f\\xd1\\xd7\\x75\\x64\\x9c\\x92\\x21\\xed\\xbb\\xf5\\x7e\\x78\\x24\\xa0\\x58\\x54\\x3b\\x7f\\x79\\xf2\\xdd\\x66\\x58\\x19\\x0c\\xf0\\xa0\\x12\\x75\\x78\\x24\\x15\\xab\\xea\\x91\\xb0\\x0a\\x0d\\x60\\x55\\x4f\\xb1\\xa2\\xfc\\xad\\x43\\xb1\\x1a\\xcd\\xb0\\x0a\\x32\\xac\\xc6\\xa4\\xe8\\xd5\\xe8\\x14\\xbd\\xda\\xaf\\xe9\\x95\\xaf\\xb2\\x3a\\x01\\x5a\\x79\\xc5\\x3f\\x0c\\xda\\xc0\\xfe\\xfa\\xf9\\x28\\xd8\\x3d\\xfa\\x20\\xb1\\xf8\\x9c\\x2a\\x26\\x74\\xea\\xa3\\xc6\\x99\\xea\\x84\\x96\\x0d\\x60\\xe7\\x80\\x07\\x75\\x98\\x84\\x23\\xa9\\xd8\\x35\\x8c\\x84\\xdd\\x84\\x04\\x76\\x4a\\x4d\\x40\\xf5\\x89\\xb1\\x9e\\x5a\\x5f\\x8d\\xc9\\xaf\\x96\\x69\\xd3\\xea\\xc9\\x14\\xcc\\x7a\\x6b\\x4c\\xa9\\x0b\\x29\\xf5\\x43\\xf1\\xac\\x97\\xa2\\x5e\\x7d\\x6a\\xed\\x0d\\x28\\xf5\\x14\\xdc\\x88\\x30\\xba\\x29\\xa4\\xc3\\x1b\\xf5\\xeb\\xdb\\xc4\\x53\\x88\\x5f\\xcd\\xf7\\xca\\x8e\\x1e\\xa9\\xc8\\x57\\x53\\xe6\\x6e\\x54\\x5d\\xda\\x7a\\x34\\x23\\x47\\x83\\x74\\x42\\x8e\\xec\\x88\\x40\\xc3\\x54\\x77\\xa6\\xa3\\xb0\\xaa\\x35\\x92\\xec\\x50\\xea\\x1a\\x15\\x9f\\xac\\x78\\xcf\\x0b\\xe4\\xe1\\xf6\\xfb\\xcf\\x07\\xef\\x85\\x69\\x53\\x73\\xfb\\xb9\\x81\\xdf\\x90\\x32\\x31\\x3f\\x53\\x95\\x40\\x5f\\x60\\xef\\xf8\\x51\\x78\\x50\\x86\\x00\\xc2\\xd8\\x9f\\x8a\\xfe\\xa8\\x91\\xd0\\xaf\\x4e\\xa2\\xef\\x0d\\x28\\xc1\\xb0\\x5a\\x62\\x89\\x29\\xb5\\x21\\xa2\\xd4\\x51\\xe4\\xcb\\xad\\x31\\xa5\\x7c\\x08\\xec\\x3d\\xde\\x72\\x68\\x2d\\x64\\xd3\\x7e\\xa9\\x2b\\xb4\\x5f\\x47\\x5c\\x71\\x49\\x4a\\x58\\xfb\\x72\\xd0\\x16\\x53\\x82\\x01\\x35\\x6c\\x8b\\xa9\\xf5\\xc4\\xaf\\x06\\xcb\\x28\\xfa\\x26\\x1a\\xf3\\x16\\xd6\\x7b\\xca\\xea\\xe1\\x90\\x3f\\x2f\\x85\\x0e\\xa7\\x62\\x4b\\xea\\xc3\\x59\\x23\\xe3\\xbb\\xe8\\xf8\\x2d\\x49\\x44\\xd7\\x1e\\x1f\\x19\\xd4\\xeb\\x8f\\x1c\\x39\\x53\\xc9\\x3a\\x83\\xdb\\xb5\\xf5\\x00\\xc3\\xd3\\x70\\x11\\xed\\x33\\xc7\\xa2\\x05\\xaf\\x7c\\xb7\\x5e\\x53\\xa9\\x0f\\x44\\x9b\\x74\\x63\\xc6\\x94\\x40\\x34\\xc0\\x8c\\x19\\x53\\xcf\\xd1\\x93\\x56\\x11\\x7f\\xb4\\x41\\xd7\\xe8\\x06\\x49\\x9d\\x48\\xfc\\xd1\\x90\\x7e\\x15\\x4a\\xeb\\x65\\x5b\\x89\\x5f\\x9d\\xd8\\xa0\\xf7\\xae\\xa6\\xfa\\x80\\xbe\\x7e\\x1c\\x56\\x97\\xa7\\x34\\xc9\\x0e\\x35\\x54\\xf5\\x5d\\x7b\\xd8\\x91\\x7c\\xe1\\xce\\xa3\\xd3\\xf5\\x0f\\xb1\\x9d\\x9c\\xab\\x03\\x16\\x8c\\xe9\\xf6\\x14\\x1e\\xe3\\xfa\\x4f\\x18\\x7e\\x24\\x4c\\xa7\\x16\\xfb\\x66\\x3c\\x83\\x48\\x15\\xe0\\x57\\x2a\\xc2\\x6a\\x88\\xa7\\x66\\x75\\x0d\\x7e\\x6d\\x2e\\x6a\\xe2\\x63\\xca\\xe4\\x50\\xb4\\x29\\xbf\\x4a\\xb2\\xfb\\x95\\x31\\x61\\xb5\\x49\\xd4\\x59\\xaa\\x5a\\x28\\xd6\\x01\\x6b\\x4c\\x09\\x0c\\xe5\\x5d\\x09\\x48\\x9a\\x62\\x2a\\x42\\x48\\x2d\\xb0\\xc5\\x94\\x71\\x21\\xa5\\x40\\x52\\xc7\\x6b\\xb3\\x56\\x6b\\x4c\\x9d\\x4a\\xfc\\x6a\\xbd\\x55\\x76\\x44\\xa4\\xaa\\x90\\xb6\\xd0\\x2a\\x90\\x55\\x67\\x65\\x63\\xa3\\x32\\xde\\xd1\\x93\\x9f\\x4d\\x97\\x65\\x50\\x43\\x55\\xba\\x27\\x66\\xbe\\x1c\\x41\\x49\\x25\\x45\\xbc\\x49\\x76\\x44\\xac\\xf6\\x11\\x5d\\x71\\xf5\\x70\\xdf\\x34\\x82\\x89\\x8a\\x21\\xb8\\x93\\x04\\xe3\\xc4\\xb8\\xcf\\xde\\xff\\xef\\xce\\xb9\\x9d\\x6b\\x5f\\xe4\\xc4\\xff\\xfe\\xb7\\xe5\\xcf\\x86\\x26\\x3f\\xbb\\xe0\\xd8\\xe7\\x7d\\x4d\\x1c\\xf9\\xe9\\x43\\x9d\\xb7\\x4d\\x6f\\xa9\\x7f\\x71\\xcb\\xa6\\xdf\\x36\\x37\\x7c\\xf8\\xe8\\xde\\x17\\x7a\\xe7\\x77\\x4c\\x7b\\xc2\\xff\\xc9\\x9a\\x3b\\xb8\\x83\\x1c\\x39\\xb3\\x66\\xdd\\x8d\\x9b\\x49\\xf0\\x67\\xbf\\xb8\\x7c\\xf1\\xcd\\x4b\\xa7\\x3b\\x0c\\x9b\\x9f\\xbb\\xf4\\x92\\x8b\\x2f\\x8b\\x9f\\xf9\\xf4\\x26\\xf1\\x91\\xc3\\x63\\xc3\\x9b\\xab\\xa6\\x77\\x5c\\x3d\\x63\\xc9\\x33\\x3b\\x2e\\xba\\xf6\\xca\\xc6\\x77\\xbb\\x89\\x49\\x2c\\x5e\\xfb\\xe0\\x1e\\x1a\\x93\\x1d\\x6f\\xa5\\x5c\\x28\\xc3\\xd9\\x7b\\xc8\\x3f\\x65\\xef\\xc9\\xfc\\xe7\\xec\\x3d\\x94\\x3a\\x65\\x38\\x1f\\x6f\\xa1\\xb4\\x84\\x4b\\xb7\\xf7\\x74\\x9c\\x3e\\xf1\\xd2\\xd7\\x42\\x2a\\x87\\x8a\\x18\\xef\\x7b\\xfa\\xe4\\xdf\\xc9\\x95\\xa9\\xc6\\x1e\\x4a\\xa8\\xf2\\xd1\\x63\\x29\\x6c\\x2a\\x5b\\xfe\\x8b\\xd4\\xf5\\xed\\x18\\x6c\\xe5\\xe1\\x75\\x0e\\x12\\xf1\\x63\\x64\\xd3\\xbd\\xac\\x25\\xe9\\x2c\\x24\\x25\\x7c\\x2c\\x5a\\xa8\\xb3\\x90\\x14\\xf2\\xc9\\x6d\\x2d\\x8b\\x23\\xa6\\x14\\x50\\x16\\x92\\x22\\x36\\xc9\\xaf\\x20\\x7e\\xd5\\xa2\\x8d\\x39\\xee\\x1c\\xea\\x93\\xb0\\xdf\\x2c\\xd8\\x5d\\xb9\\x79\\x34\\x90\\xc9\\xe8\\xf8\\x6e\\x84\\x24\\x74\\xae\\x78\\x76\\x56\\x92\\xdb\\xb5\\x59\\xa2\\x72\\x16\\x6a\\x12\\xe1\\x55\\x43\\xfc\\xdb\\xbe\\xe7\\x13\\xfc\\x24\\x09\\x39\\x7f\\x4f\\xb9\\x56\\xca\\xd0\\x79\\x2e\\xb6\\x95\\xf2\\x11\\xd8\\x56\\x2a\\x18\\xdb\\x0a\\x95\\xcf\\xe3\\x2d\\xd3\\x09\\x57\\x7a\\x24\\xb9\\xa4\\x94\\xbe\\x34\\xdf\\x91\\x73\\x85\\x4e\\xf2\\xce\\x4e\\xbc\\x72\\xaf\\xbe\\x43\\x39\\x32\\xfd\\x0a\\x79\\x3d\\xe1\\xab\\x40\\x65\\x34\\x18\\xa9\\x8c\\xa3\\xd0\\x9d\\x2e\\x63\\x05\\x1f\\x8b\\x7a\\x75\\x19\\xbd\\x9a\\x8c\\x95\\x49\\x19\\x3d\\x54\\xc6\\x12\\x26\\xe3\\xe8\\x41\\x6d\\x59\\x22\\x3f\\xaf\\xb7\\x65\\x61\\xb1\\xde\\x98\\x3d\\x92\\x9c\\x5f\\xf0\\x5d\\x84\\x4d\\x4e\\xcf\\xce\\xde\\xa6\\x0f\\xe8\\x13\\xb3\\x45\\x67\\x69\\x55\\xfe\\x0b\\x7d\\x4a\\xd6\\x77\\x37\\x6b\\x58\\x81\\xb5\\xeb\\x9b\\xc8\\xa6\\xcc\\x8c\\x3e\\x6c\\x48\\x97\\xda\\xcb\\xc7\\xa2\\x05\\xba\\xd4\\x05\\x7c\\x4c\\x71\\x07\\x94\\xb2\\xb0\\x9a\\x63\\x89\\x29\\xe5\\xa1\\xc4\\x52\\x51\\x83\\x20\\x3f\\xd4\\xe3\\xb6\\x68\\x63\\x7e\\x9e\\x8d\\xd2\\x03\\x94\\x11\\xbf\\xea\\xb3\\xc5\\x7a\\x0a\\x7d\\x65\\x26\\x7f\\x92\\xb0\\x3f\\xcf\\x2d\\x3b\\x54\\x73\\x01\\xf5\\x0b\\xeb\\xb1\\xbb\\x04\\xaf\\x06\\x89\\x4f\\x8f\\x35\\x35\\xeb\\xf4\\x07\\x67\\xc1\\x21\\x9c\\x95\\x84\\x80\\x72\\xd9\\x0f\\x0b\\xc3\\x8a\\xe3\\x3f\\x66\\x08\\x90\\x45\\xc7\\x87\\x05\\xe1\\xe4\\x91\\x23\\x7d\\x9b\\xf5\\xa6\\xff\\xeb\\x91\\x23\\xe0\\xfa\\x5f\\x00\\xc8\\x6c\\xf1\\x28\\xb5\\x9d\\x55\\x26\\x6c\\x67\\x84\\xd9\\xb8\\xce\\x6d\\x38\\xbb\\x80\\x1a\\xce\\x7a\\xc5\\x5e\\x43\\xfc\\xdb\\xd3\\x93\\x84\\x71\\xa7\\x0f\\x83\\xc3\\x03\\x00\\xd7\\x22\\xbe\\x3e\\xd8\\x6e\\x46\\xce\\xdb\\x6e\\xf6\\x40\\xef\\x8b\\xba\\x83\\xee\\xb8\\xd3\\x87\\x85\\x5f\\xa6\\xd8\\xcd\\xde\\x04\\xb8\\x90\\xf8\\xf5\\x60\\xbb\\x19\\xf9\\x4e\\x76\\xb3\\x3a\\x66\\x37\\xeb\\x15\\xbe\\x64\\xce\\x32\\xd9\\xb4\\xd2\\xd4\\x6e\\xf6\\x04\\xc0\\x5d\\x29\\xee\\x67\\x76\\xb3\\x66\\x66\\x37\\xa3\\x7b\\x3b\\x66\\x3d\\xa4\\xc8\\x14\\xa2\\x91\\xa0\\xff\\x88\\xe5\\xec\\xea\\xe3\\x39\\xbd\\x45\\xc7\\x85\\xaf\\x8e\\x1c\\x39\\xed\\xa0\\x92\\x7d\\x45\\xf7\\x68\\x2e\\xec\\x3f\\x21\\x04\\xc5\\x3f\\xc2\\x83\\x6a\\x2c\\x67\\xac\\xd0\\x65\\x7c\\x4c\\xf1\\x07\\x54\\x9e\\x91\\xce\\x08\\x3a\\xa3\\x4a\\x4d\\xca\\xe4\\x88\\xc6\\xc5\\xe4\\x5b\\xa9\\xcf\\xa1\\x36\\x72\\xf8\\xbc\\xb2\\xe3\\x39\\xde\\xe6\\x72\\x17\\x19\\x35\\xad\\xca\\x97\\x95\\xac\\x46\\xa8\\xfe\\x32\\xd9\\xa1\\xa0\\x51\\xe1\\x65\\xd5\\x60\\x6c\\x6c\\x54\\x24\\x47\\xc4\\x62\\x75\\x6b\\x63\\xb6\\x2c\\xab\\x2e\\x46\\x93\\x46\\x73\\x98\\x8c\\xad\\x21\\x3e\\xd1\\x57\\x5e\\x43\\x7c\\x63\\x8b\\x88\\x7b\\xac\\xdb\\x98\\xed\\x48\\xa3\\x0d\\xa1\\x41\\xb4\\x17\\x12\\xd7\\x3b\\x57\\x3f\\x52\\x27\\x98\\x2f\\x9f\\x1a\\xff\\xe0\\x12\\x02\\xdf\\x65\\x55\\xe3\\x67\\x6c\\x9b\\xf4\\xde\\x25\\xaf\\xce\\xe9\\x8a\\x7f\\xf4\\xbb\\xf7\\xe2\\xb1\\xde\\xc7\\xb7\\xdc\\xb6\\xa7\\x74\\xd7\\xea\\x5b\\x77\\x91\\xff\\xf8\\x94\\x14\\x5c\\x34\\x5e\\xbc\\x41\\x69\\xfe\\xf9\\xc2\\xed\\xd9\\x25\\x19\\x8f\\x3b\\x9b\\x6b\\xfe\\x65\\x61\\x77\\x57\\xfc\\x8f\\x8f\\xbd\\xff\\x4d\\xfc\\x0d\\x92\\xf3\\x9b\\x8d\\x6f\\x7c\\xfa\\xcc\\x7d\\x4d\\x97\\xd2\\xbc\\x00\\x94\\x83\\xc5\\xe0\\x80\\x13\\x3e\\xdc\\x36\\x02\\x0b\\x8b\\xe2\\x0d\\xa8\\x79\\x62\\xac\\xa7\\x2c\\xcf\\x6b\\xf2\\xab\\x6e\\x96\\xd1\\x85\\x1c\\xa3\\x94\\x2c\\x9c\\xa4\\xf8\\x3c\\xc7\\xe4\\xa8\\x4b\\x9f\\x11\\xba\\x02\\x51\\x9f\\x7e\\xe6\\xa0\\x4e\\x87\\x56\\xe2\\x57\\x0a\\x29\\x81\\x47\\xb4\\x48\\x5f\\xf7\\x68\\xef\\xa4\\x95\\xc8\\x8e\\x88\\x21\\xd3\\x4b\\xd7\\x8f\\x5e\\x22\\x3b\\x14\\x5f\\xa3\\x92\\x27\\x2b\\xae\\x11\\xc8\\x5b\\xf8\\x61\\x56\\x32\\x83\\x09\\x5d\\x6e\\x48\\x77\\x5c\\x4a\\x27\\x78\\x11\\xf3\\x06\\x9b\\x0e\\xc0\\xeb\\x7c\\x2f\\xe2\\x47\\xb0\\x43\\x5b\\x1b\\xb6\\x31\\xcb\\x41\\x76\\xca\\xf8\\x92\\xb0\\x67\\x0d\\xb0\\xaa\\x25\\xed\\x59\\x4e\\xba\\x5a\\xcb\\xa4\\xd6\\xc3\\xa8\\x20\\x59\\x1d\\x32\\xb3\\x0f\\x0c\\x62\\x7f\\x49\\xd9\\x44\\x19\\x96\\x02\\xe6\\x51\\xed\\x3d\\x7e\\x67\\x04\\x1e\\x18\\xe1\\xa0\\x36\\x20\\x36\\xa5\\xb0\\xc1\\x24\\xea\\xfc\\x3e\\xb3\\xc1\\xb5\\x0d\\xcb\\x52\\x73\\x56\\x1b\\x5c\\x54\\xb0\\x16\\x14\\xd2\\x10\\x1d\\x93\\xac\\x16\\x15\\x9f\\x93\\xb1\\x86\\x0e\\x77\\xc3\\xd3\\xd6\\x1c\\xd6\\x87\\xb9\\x91\\xc8\\x6b\\xb8\\x7d\\x29\\xfb\\x17\\xb4\\xde\\x06\\x03\\xec\\xc8\\x46\\x19\\x66\\xb0\\x7a\\xe7\\xa5\\xf4\\xf8\\x89\\x01\\xdc\\x6d\\x8d\\x29\\x6e\\xdd\\xbb\\x37\\x61\\x7f\\x73\\x27\\xb1\\x2e\\x94\\x9f\\x13\\x24\\xd9\\x95\\x6d\\xd5\\x29\\xbb\\xa8\\x67\\xd1\\x50\\xd0\\x07\\x6f\\x2e\\x0c\\x0b\\x7c\\x8f\\xde\\x21\\xdd\\x3d\\x02\\xf4\\xfc\\x87\\x6c\\xd4\\x72\\x0c\\xe2\\xe2\\x49\\xc8\\xe1\\x80\\x1d\\x5e\\x04\\x70\\x2b\\x93\\xa3\\x3c\\x21\\x47\\x15\\x1f\\x53\\xf2\\x03\\xaa\\x4b\\x8c\\xf5\\x14\\xb9\\xf2\\x4d\\x7e\\xdd\\x71\\x3d\\x98\\xc8\\xd1\\xa8\\x94\\x48\\x8a\\x57\\x7b\\x5b\\x32\\xf4\\x77\\x24\\x23\\x90\\xd8\\x29\\x28\\x91\\xd4\\x51\\xba\\xc4\\x8a\\x5b\\xfb\\x82\\xee\\x59\\x46\\x0d\\x72\\x6e\\xad\\x93\\x11\\x64\\x6b\\x3e\\x25\\x62\\x81\\x9a\\x2f\\xd0\\x2c\\x05\\x8a\\x2b\\x91\\xe8\\x6a\\x90\\xec\\x23\\xae\\xf9\\x87\\x85\\x61\\x73\\xda\\x6b\\x53\\x3b\\x12\\x1e\\x7f\\x4f\\x79\\x7b\\xfa\\xe4\\x54\\x50\\x04\\xa6\\x93\\x47\\x61\\xa7\\xec\\x3e\\x94\\x6b\\xd9\\x9a\\xe0\\xf7\\x49\\x52\\xfb\\x64\\x50\\x1b\\x5c\\xe6\\x20\\x1b\\x9c\\xc3\\x1a\\xeb\\xc9\\x70\\x68\\x23\\xb8\\x6c\\x4b\\xf2\\x2f\\x9a\\xac\\xb1\\x9e\\x52\\x53\\x8e\\xc9\\xaf\\x7a\\x6c\\x31\\xc5\\x13\\x50\\x4b\\x6d\\xcc\\x10\\x27\\xcb\\x8e\\x1e\\xc1\\x9a\\x55\\x30\\xec\\x8b\\x96\\x5c\\x7f\\x27\\xe4\\xd4\\x86\\xeb\\x41\\xb2\\x6e\\x3d\\xfe\\x58\\x42\\x3a\\xf2\\xb3\\xe3\\xe9\\x02\\x7e\\x72\\xe4\\x48\\x5f\\xc6\\x80\\xee\\xbe\\x4f\\xfd\\x2b\\x78\\x5c\\x80\\xa8\\x50\\x2d\\x44\\xd8\\xd8\\x54\\x03\\xc6\\x75\\x46\\xc3\\x33\\x4c\\x94\\x8d\\xc8\\x6c\\xd1\\x59\\xf5\\x85\\x63\\x8a\\x49\\x4f\\x38\\x6c\\x09\\x0d\\xe4\\x31\\xa4\\xd5\\xd0\\xc6\\xa3\\x0b\\xf8\\xcf\\xfa\\xf6\\x1d\\x3e\\x7c\\x98\\xbb\\xfc\\xc5\\x17\\xe3\\x73\\x8e\\x1e\\xe5\\xc3\\x47\\x8f\\x52\\x7d\\xba\\x59\\x18\\x2d\\xbc\\xc0\\x6c\\x73\\x5d\\x09\\xdb\\x5c\\xca\\x5c\\xfe\\x5c\\xb6\\xb9\\xec\\x46\\xa5\\x4a\\xde\\x6f\\x12\\xb2\\x64\\x77\\xc2\\x38\\xa7\\x5a\\x68\\x64\\x47\\xaa\\x79\\x4e\\x2d\\x0c\\x52\\xe3\\x9c\\x6a\\xb4\\x34\\x26\\x95\\x86\\x99\\xe7\\x74\\x08\\x07\\xcc\\x73\\xee\\xb0\\x3e\\xec\\x64\\x0d\\x10\\x5a\\xfa\\x4a\\x35\\x28\\x1b\\x3a\\x6b\\x2e\\x5a\\xdf\\xd5\\x3e\\x3b\\x7e\\xe6\\xa3\\xf0\\x35\\xa3\\x2f\\x5c\\x3f\\xff\\xba\\xce\\xde\\x51\\x95\\x06\\x32\\xad\\xb0\\xa5\\x7c\\xeb\\xbd\\xcf\\xe6\\x34\\x78\\xb7\\x6e\\x2f\\xf5\\x18\\x74\\x68\\xb3\\x5d\\x3f\\x79\\xfb\\xa2\\x2f\\xb6\\x6a\\xf0\\xca\\xd2\\x8e\\x37\\x2f\\x38\\xf5\\x93\\x1f\\xfc\\x6b\\x90\\xdb\\x2d\\x39\\xfe\\xb0\\x37\\xbe\\xca\\x66\\xfd\\xe8\\xe9\\xec\\x99\\x5b\\x03\\xd4\\x6e\\x41\\x39\\x73\\xc4\\xa3\\x70\\x22\\x07\\x1d\\x23\\xb2\\xe6\\xe4\\x9e\\x9d\\x35\\x27\\x2f\\x11\\x71\\xe4\\xca\\x6a\\xd4\\xa6\\xb7\\x3d\\x72\\xb6\\x3b\\x47\\x8f\\xe1\\x3f\\x37\\x85\\x0e\\xed\\xa6\\xd3\\x78\\x74\\x56\\x52\\xd3\\xdd\\x10\\x32\\x1d\\xe1\\xaf\\x49\\xdb\\x9d\\x5e\\xef\\xd7\\xff\\xf9\\x7a\\x9b\\x79\\xd9\\xd1\\x23\\xbb\\xb2\\xf4\\xfa\\xd2\\x14\\x52\\x36\\x87\\x9a\\x4d\\xcd\\x19\\x67\\xad\\x37\\xb5\\xf1\\xa5\\xf3\\xff\\xcc\\xd1\\x77\\x97\\x87\\xd4\\x9c\\x3f\\x95\\x62\\x2b\\xd2\\xeb\\xfe\\x35\\x9c\\x28\\xc0\\xe2\\x11\\xeb\\x5e\\x78\\xf6\\xba\\x17\\xa5\\x61\\x1e\\x95\\xb3\\xdd\\x79\\x05\\x49\\xd0\\x15\\x9b\\xac\\xe6\\xe4\\x9e\\x53\\x88\\x64\\x77\\x9d\\x26\\x08\\xf3\\xb5\\x1e\\xa6\\x09\\x0a\\x07\\x6c\\x83\\xba\\x1c\\xfb\\xe1\\x84\\x1b\\xf9\\xf8\\x61\\xba\\x24\\x59\\xda\\x24\\x32\\x37\\xac\\xba\\x2c\\x31\\x25\\x27\\x34\\x20\\x58\\x41\\x52\\x30\\x97\\xe7\\x98\\xac\\xba\\x6d\\x69\\x12\\x2a\\xf9\\xda\\xc7\\x39\\x36\\xea\\xf4\\x9f\\x6f\\x4b\\x15\\x5a\\x1b\\x98\\x72\\xb4\\x35\\x85\\x6c\\x38\\x0f\\xd1\\x74\\xe3\\x61\\x9a\\x64\\x1d\\xc7\\x4f\\x1f\\x1f\\x46\\x2c\\x2f\\xb3\\x1f\\x52\\x9e\\x20\\xf1\\x75\\x64\\x21\\x0f\\x13\\x87\\x32\\x05\\xe5\\x27\\x99\\x82\\x0a\\x88\\x5f\\x35\\x88\\xb2\\x83\\xa1\\x7c\\xde\\x9c\\x41\\x74\\xba\\x3f\\x22\\x71\\x10\\x5b\\x04\\x0c\\xa1\\x0f\\x12\\x9e\\x4c\\xd1\\x9f\\x07\\xe2\\xd7\\x09\\x61\\xc6\\xed\\x7a\\x79\\x0a\\x27\\x5d\\x0a\\x1d\\x9d\\x42\\x52\\x19\\xe9\\x54\\xce\\x11\\x0a\\xa5\\xf3\\xd1\\xd1\\x5c\\xcc\\x3a\\xbb\\x2e\\x63\\xa2\\x53\\x0d\\x05\\x09\\xfa\\xa9\\x74\\x7e\\xdd\\x34\\x2e\\xba\\x07\\x7a\\xeb\\x77\\xce\\x1d\\x86\\x8a\\xce\\x78\\xa0\\x6f\\xef\\xd4\\x0b\\x47\\xe6\\xa2\\xe3\\x19\\xbe\\xfb\\xa9\\x35\\xb9\\x10\\xab\\x10\\x71\\x6b\\x5a\\x92\\x1f\\x56\\xb3\\x2d\\x31\\x25\\x2f\\x34\\x04\\xf0\\xa2\\x80\\x92\\x7d\\x2c\\x61\\x39\\x16\\x35\\xcc\\xb5\\x45\\xa6\\x41\\x64\\x2b\\xcf\\xbc\\x80\\x5a\\x68\\x8b\\xa9\\xc5\\xc4\\xaf\\xe6\\x66\\xcb\\x8e\\x88\\x45\\x26\\xda\\x5c\\x3f\\x4f\\x8e\\xf0\\x02\\xb5\\xce\\x9f\\x7f\\xc3\\x24\\xbc\\x2f\\x47\\x6a\\x9b\\x78\\xfc\\xf8\\xe9\\xe3\\xc3\\x35\\xcd\\xbb\\xba\\xbf\\x08\\x87\\xae\\xfe\\x13\\xc6\\x19\\x34\\xef\\x5f\\x39\\x36\\xea\\xf1\\x66\\x94\\x29\\x38\\x99\\xfe\\xcf\\xc8\\xb1\\xec\\x42\\xba\\xef\\x07\\x1f\\x8b\\x5a\\x33\\xb2\\x04\\xdd\\x3a\\x4c\\x94\\x8a\\x64\\x1e\\x40\\x96\\xfe\\x2f\\x93\\x8e\\x67\\x91\\xcc\\x22\\x4a\\x34\\x6c\\x36\\xfb\\x15\\x29\\xd4\\x33\\x39\\xd3\\x6e\\xf6\\xd3\\xb5\\x50\\x51\\x8e\\xec\\x50\\xb3\\x04\\xca\\x82\\xa3\\x38\\x1a\\xa1\\xbb\\xcf\\x15\\x35\\xaa\\x46\\x4d\\xe4\\xe2\\x94\\x74\\x8d\\x03\\x2e\\xa6\\x5e\\x96\\xf5\\x21\\x95\\x8c\\xaf\\x8b\\xd4\\xff\\xad\\xf5\\x9e\\x19\\xfc\\x5d\\x49\\xa7\\xd3\\xc5\\xd7\\x6c\\x68\\xf9\\x5b\\xfc\\x8d\\xde\\x57\\xf6\\x4c\\x58\\x3b\\x6e\\xc2\\xda\\xf1\\x7b\\x0e\\x71\\x93\\x49\\x90\\x98\\xc9\\x34\\x9b\\x99\\xb9\\xa2\\x5a\\xac\\x64\\x1a\\x31\\x1f\\xfb\\xd4\\x6c\\x16\\x6e\\x31\\x59\\x3f\\x79\\x87\\xcd\\xcf\\x0c\\xff\\x23\\x4c\\x47\\x09\\x82\\x68\\xc4\\x76\\x44\\x3c\\xda\\x8a\\x26\\x2f\\xac\\x56\\xf0\\x31\\xc5\\x19\\xa2\\xa3\\xaa\\x62\\x09\\xab\\xd5\\x7c\\x4c\\x19\\x1b\\x8a\\x86\\x32\\x3d\\x9a\\xec\\xa1\\x81\\x4c\\xda\\xa5\\x56\\xea\\x01\\xa4\\xad\\x52\\x24\\x47\\x4c\\xa9\\x0d\\x29\\x92\\x44\\x07\\x5b\\xbb\\x55\\x4f\\xa1\\x5d\\x59\\x2a\\x3b\\x54\\xc1\\x43\\xe3\\x13\\x54\\x63\\x61\\x63\\xa3\\x12\\x76\\xf4\\x64\\x5a\\x9c\\x79\\x7a\\xe7\\xcd\\xba\\xed\\x0a\\x8f\\xec\\x50\\xdc\\x1a\\x2c\\x6a\\x76\\x61\\x63\\xa3\\x5a\\x1d\\x4a\\xd2\\x12\\xea\\x23\\xef\\xc8\\xfb\\xae\\x69\\x13\\xf0\\xf2\\xc4\\xfe\\x83\\x36\\x02\\x6f\\x38\\x32\\x79\\xca\\xcb\\x4b\\xd2\\x76\\x20\\x6e\\x3d\\x3a\\x65\\xf2\\xe1\\x5b\\x52\\x67\\xe6\\xbc\\x3b\\xb1\\x23\\x43\\x87\\xe2\\x1b\\xe6\\x76\\x2c\\x4d\\xdd\\x90\\x58\\x74\\xdd\\x75\\x8b\\x52\\x67\\xea\\x9d\\x03\\x7b\\x6e\\xba\\xef\\x82\\x8d\\xae\\xf5\\x25\\x5c\\x36\\xd8\\x7b\\x41\\x31\\x07\\x14\\x7b\\x58\\xb5\\x58\\x62\\x4a\\x46\\x88\\xba\\x6a\\x6b\\xab\\x7f\\xbd\\x77\\x34\\xea\\x59\\xa9\\x14\\x83\\x44\\x13\\xb6\\x48\\xb6\\x18\\x75\\xbd\\x38\\x0b\\xad\\x3d\\xcf\\x94\\x7d\\xc0\\xbf\\xe1\\x4f\\xd4\\xd1\\x38\\xc5\\xbb\\x61\\x2c\\xf3\\x35\\x26\\xd8\\x27\\x7c\\xca\\xcb\\xe2\\x09\\x98\\xe0\\xa7\\xf9\\xa6\\xc5\\x70\\x94\\x63\\x81\\xc7\\x74\\x73\\x23\\x2a\\xd2\\x90\\x5b\\xd5\\x92\\xa0\\x68\\x63\\x60\\xb3\\xa1\\x65\\x9f\\x3e\\x96\\x08\\x9f\\x26\\xdd\\xad\\x41\\x70\\x87\\xf0\\x31\\x3f\\x41\\xfc\\x33\\x9c\\x98\\x01\\xca\\x75\\x2c\\xc6\\x7a\\x24\\x83\\xdd\\xe4\\x57\\x79\\x31\\x41\\x3d\\x1a\\x75\\xea\\xf3\\x73\\x27\\x1d\\x1d\\xa2\\x16\\x7d\\x5a\\x4e\\x29\\xfa\\x9c\\xb2\\x43\\xe5\\x69\\xdf\\x25\\xd9\\xe9\\x82\\x5f\\xe5\\x0d\\x2c\\x7c\\x69\\xb8\\x59\\xf8\\x1d\\xe9\\x2b\\xd4\\xd3\\x83\\x17\\xa4\\xa9\\x1c\\x11\\x18\\xc4\\x00\\xf1\\xcf\\xfc\\x6e\\x0f\\xb7\\x49\\xf8\\x9c\\x2f\\x05\\x0f\\xf7\\x10\\xde\\x89\\x01\\x12\\x83\\x3d\\xc2\\x44\\x6e\\xd3\\x43\\x0f\\x81\\x60\\x2b\\xb7\\x49\\xec\\x3d\\xe7\\xf7\\xb7\\x8a\\x0d\\xec\\xfb\\x33\\xf9\\x33\\xe4\\x52\\x9a\\x6f\\x3d\\x99\\x83\\xdb\\x34\\x90\\x83\\x5b\\x64\\x39\\xb8\\x45\\xa2\\x6b\\x81\\xf6\\xd7\\xce\\x30\\x9f\\x35\\xf3\\xd1\\x8e\\xf1\\xfc\\x99\\x03\\x64\\x7e\\x7c\\x67\\x84\\xe5\\x6d\\xe7\\xfb\\xce\\x72\\x9f\\x11\\x73\\xb6\\x8f\\xef\\x7d\\x94\\xef\\x23\\x57\\xbe\\xf6\\x72\\xfc\\x09\\x76\\x9f\\x7e\\x42\\x2e\\xc5\\xdf\\xce\\x3b\\x27\\xb8\\xdb\\x99\\xb8\\x4f\\x3f\\x31\\x7e\\xfd\\x61\\xfc\\x73\\x70\\x9a\\x4c\\xdc\\x83\\xb4\\x2e\\x56\\x34\\x53\\x6d\\x33\\x84\\x59\\x85\\x14\\x93\\xee\\xbe\\xad\\xcb\\xa6\\x88\\xba\\xde\\x5b\\x59\\x96\\x22\\x26\\xa6\\x62\\x94\\x29\\x2b\\x2d\\x75\\x92\\x4b\\x88\\x1c\\x4e\\x0a\\xbe\\x31\\x45\\x78\\x06\\x81\\xf6\\xcc\\x3e\\x6e\\xf7\\x39\\x9f\\xa9\\x07\\xe3\\xd0\\x67\\x5a\\xd8\\x33\\x99\\x28\\xda\\x33\\x0d\\x89\\x84\\x4d\\x09\\x78\\xc2\\x49\\xe1\\x4e\\xa5\\x00\\xc5\\xe0\\xe2\\x30\\xb3\\x5f\\xe6\\x6e\\x23\\xff\\xdf\\x9e\\xa9\\x43\\x39\\xf0\\xcc\\xb7\\xc7\\xf7\\x3e\\xfa\\x7f\\x49\\xeb\\x2b\\x07\\xe2\\x2a\\xb9\\xe4\\xe0\\x81\\xb8\\x4a\\x7d\\x81\\x38\\x37\\xe7\\xe3\\x3f\\x86\\x5d\\x5b\\x4b\\x59\\x03\\x51\\x81\\xb6\\x0f\\x2b\\xa8\\x77\\x14\\x8e\\x45\\x4d\\x94\\x44\\x80\\x15\\x6a\\x26\\x53\\xbb\\xd4\\xb8\\xee\\x3b\\xbb\\x67\\xcf\\xb9\\xb1\\x7b\\xce\\x9c\\x6e\\xee\\xf7\\xe3\\xdb\\xbb\\xbb\\xdb\\xc7\\x5f\\x75\\xc3\\x52\\xda\\x7f\\xed\\x02\\x84\\x5e\\x9a\\x8f\\x5d\\x5b\\xaf\\xb5\\xb2\\x18\\x0a\\xc1\\x14\\xa6\\xde\\xf7\\xaa\\x68\\x0e\\x85\\x52\\xb2\\xb3\\xdb\\x52\\xe7\\xb7\\xe9\\xdb\\x89\\x03\\x19\\xd1\\x58\\x47\\xa5\\xe7\\x6d\\xff\\xb6\\xf7\\xc3\\xde\\x5f\\xd1\\x1f\\x4d\\x9e\\x25\\xb8\\x9f\\xf3\\xd1\\x38\\x71\\x2f\\x88\\x62\\x4c\\x74\\x45\\x16\\x3d\\x0f\\x86\\x76\\x1f\\x11\\x3a\\xf1\\xbe\\x9e\\x92\\x9a\\x27\\xa5\\x4b\\x18\\xef\\x0c\\x57\\x98\\xa0\\x9b\\xa1\\x7e\\x9e\\xf7\\x73\\xce\\xc1\\xf7\\x51\\xb8\\x10\\xbb\\xd5\\xc0\\x7d\\x88\\x76\\x1f\\x16\\x8e\\xde\\x3e\\x34\\xfc\\x5c\\x7f\\x07\\x66\\xf4\\x9f\\xe0\\xdf\\xa1\\xb9\\xc6\\xff\\x07\\x11\\x1f\\xf4\\xd4\\x8e\\x34\\xd2\\x41\\xb1\\x86\\x55\\x99\\x8f\\x29\\x52\\x28\\x0a\\xe2\\xb3\\xd8\\xe9\\xdc\\x18\\x7c\\x4c\\xc9\\x0f\\x45\\x45\\x81\\x7e\\xe0\\x0e\\xd3\\xe8\\x92\\xac\\x50\\x4f\\x86\\xcf\\x62\\xf2\\x53\\xea\\x0a\\xee\\x98\\x6a\\x18\\x1d\\x0a\\x51\\x33\\xa4\\xab\\x30\\x14\\x8a\\xe4\\x72\\xda\\x74\\x20\\x37\\xdf\\xec\\x57\\xb2\\x43\\x11\\x2e\\x57\\xbb\\xe2\\x60\\xf6\\x2b\\x42\\x48\\x9b\\x23\\x69\\x3a\\x52\\x95\\x92\\xf8\\xda\\x5e\\xf3\\x06\\x54\\x3b\\x4b\\x7c\\xfd\\xa7\\x8f\\x5f\\xbe\\x46\\xcf\\x21\\x93\\x41\\x13\\x5f\\xdb\\x25\\xc5\\x7a\\xe8\\xe0\\x37\\x33\\x0f\\x7d\\x86\\x2c\\xbf\\x55\\xb1\\x4a\\x3d\\x36\\xab\\xdd\\xe9\\x57\\x24\\xa9\\x27\\x53\\xca\\x70\\xfa\\x23\\x36\\xab\\x3d\\x25\\x5b\\x72\\xa6\\x44\\x73\\x61\\xab\\xb6\\xcc\\x9a\\x1a\\xd2\\x63\\xb5\\x65\\x4a\\x29\\xd9\\x92\\x3d\\xd4\\xfc\\xa9\\xd3\\xce\\x97\\xd6\\x87\\xd9\\x50\\x9b\\xa0\\x9e\\x67\\x94\\x65\\x46\\xc3\\x00\\xb5\\x2b\\xea\\x67\\x6c\\xdf\\xbe\\x9d\\xe4\\x7f\\xde\\xb4\\xaa\\xd9\\x39\\xe6\\xc6\\x86\\xed\\xfb\\xc8\\xc9\\xb8\\x8b\\x9c\\x8c\\xe7\\x73\\xc2\\xbe\\x1d\\x8d\\xdd\\x75\\xce\\x86\\x1f\\x4e\\xf8\\x3c\\xfe\\x09\\xf9\\xf8\\xa1\\x4d\\x0f\\x65\\xfe\\x85\\x94\\x4a\\x99\\x8f\\x48\\xce\\xb7\\x9e\\x96\\x1f\\xda\\xf4\\x90\\xb8\\xf9\\xd7\\xb2\\xfc\\xd3\\x4c\\x89\\x78\\xdf\\xd1\\xe7\\xc4\\x9d\\xfc\\xbf\\x0a\\xd7\\xd1\\xfc\\x44\\x6e\\xac\\x61\\x6c\\x08\\x66\\x7b\\x38\\x1c\\x85\\x6e\\x71\\xe7\\x93\\x3c\\x2b\\x06\\xb3\\x3f\\x62\\xca\\x74\\x86\\x42\\x21\\xca\\x09\\x63\\x38\\x16\\x15\\xe9\\xc0\\x32\\x7c\\xe6\\x22\\xad\\x9b\\x31\\x11\\x7f\\xd4\\xad\\x0f\\x45\\x6e\\x1a\\xbf\\x13\\xcd\\x1c\\xe0\\x8d\\x91\\xb4\\xe5\\x88\\xc5\\xce\\xb6\\xc2\\xbc\\x94\\x61\\x9f\\xc8\\x61\\x67\\xd8\\x19\\x96\\x4b\\x65\\x1f\\x5f\\xca\\x1b\\xe5\\x4e\\xb2\\xee\\xde\\xd9\\x64\\xc2\\xca\\x5d\\x86\\xdd\\x4b\\xaf\\x35\\xec\\x0c\\x3f\\x6c\\x10\\x67\\xcf\\x9a\\x15\\x6f\\x24\\xaf\\xc7\\x1b\\xb9\\xdc\\xf8\\x5a\\x72\\x7b\\xdf\\xe7\\xe4\\x4a\\x2e\\xfe\\x24\\xe9\\xe4\\xe2\\x3a\\x3f\\x0b\\x00\\xa1\\x41\\x68\\x00\\x8f\\x7a\\xfd\\x3d\\x8a\\x12\\x8b\\x36\\xc8\\xa6\\x9e\\x33\\x72\\x8a\\x28\\x4f\\x87\\x5f\\x56\\xb0\\x91\\xa2\\x56\\xf6\\xca\\xda\\x0d\\x4e\\x1f\\xd1\\xf1\\x29\\x00\\xf8\\x77\\x68\\xbe\\x81\\x7c\\x7c\\xae\\x67\\x1c\\x50\\x72\\xf4\\xbd\\x66\\x55\\xce\\x0d\\x27\\xd3\\x0e\\x58\\x02\\x8a\\x3d\\xa0\\xd8\\xc2\\x34\\xfa\\xd2\\xa8\\x47\\xac\\x9c\\x3b\\xff\\x00\\xa3\\x06\\xe9\\x91\\xcc\\xf9\\x19\\x7e\\x7d\\x0a\\x1b\\x50\\xf3\\xf5\\xf0\\x95\\x84\\x26\\x5a\\xcc\\x9a\\x26\\x9a\\x2d\\xba\\x26\\x9e\\xbc\\xe4\\xd5\\x02\\x5d\\x13\\x2d\\x92\\x62\\x3b\\xa4\\x98\\x25\\xc5\\x78\\xe8\\xe0\\x57\\x2f\\xbf\\x32\\x9b\\x6a\\xa2\\x51\\xea\\x31\\x19\\xcd\\x4e\\xbf\\x62\\x93\\x7a\\xac\\x36\\x8b\\xd3\\x1f\\x31\\x19\\xcd\\x29\\x9a\\x68\\xb5\\x59\\xa8\\x26\\x9a\\xac\\x9a\\x26\\x1a\\x4d\\x56\\x5b\\x92\\xaa\\x36\\x27\\x4b\\xe7\\xdc\\x1f\\x39\\x01\\x02\\x91\\xc3\\x72\\xc1\\xde\\x77\\x7e\\xd9\\xb2\\xa1\\xbd\\xa4\\x7e\\xcd\\xa4\\x55\\x9d\\xbf\\xfb\\x5d\\x2f\\xf7\\xbd\\xc3\\xfc\\x53\\xdb\\x57\\xed\\x3f\\x52\\x5c\\xf4\\x68\\x56\\x51\\xd7\\x92\\x55\\x34\\x0f\\xc2\\x99\\x76\\xdd\\x52\\xc2\\xa1\\x01\\x10\\x7c\\x0c\\xbf\\x15\\x83\\xf1\\x4b\\x49\\xda\\x60\\x0e\\x28\\xb9\\xe1\\x1e\\x97\\xd9\\x90\\xe1\\x57\\xed\\x2c\\xb1\\xdd\\xf9\\xa1\\x97\\xa3\\x1b\\x37\\xf4\\x15\\x6e\\x16\\x63\\x53\\x48\\xa6\\x74\\x38\\xbb\\x2c\\xe9\\x09\\x1d\\xb8\\xf5\\xc3\\xe5\\x74\\x38\\xd3\\x4e\\x29\\xed\\xc1\\x6b\\xb2\\x18\\xee\\xa7\\xb2\\x04\\x10\\x26\\x21\\x5d\\x1a\\xb5\\x3a\\xc8\\x78\\xed\\x7b\\xe4\\xdc\\xca\\xda\\x32\\x37\\x15\\x2a\\xe2\\xcc\\xf1\\x87\\x42\\x21\\xa5\\x84\\xaa\\x45\\x79\\x58\\x5b\\xd8\\x2b\\xc5\\xba\\x37\\xd0\\xf9\\x09\\x56\\x43\\xfc\\x4a\\x5e\\x48\\xad\\xa6\\x7c\\x7f\\x91\\xea\\x1a\\xed\\x77\\xd5\\x7e\\xb3\\x3f\\x52\\x53\\xad\\x9d\\xd6\\xe4\\x98\\xfd\\x4a\\x35\\x75\\x12\\xe8\\x91\\xbc\\xe1\\x0c\\xbf\\x1a\\xb4\\xea\\x8e\\x42\\x56\\xea\\x28\\x94\\xd0\\x9e\\x12\\xaf\\xa6\\x3d\\xde\\x92\\xc1\\xda\\x93\\xa1\\x94\\x48\\x4a\\xd9\\x21\\x51\\xf1\\x4a\\x4a\\x71\\x8a\\xfa\\x14\\x4b\\x3d\\x9e\\x62\\xaf\\xd3\\xaf\\x94\\x49\\x3d\\xa5\\x65\\x25\\x4e\\x7f\\xc4\\x53\\xec\\x4d\\x51\\x9f\\xd2\\xb2\\x12\\x4d\\x7d\\x22\\x9e\\xd2\\x32\\xca\\x75\\x5c\\xac\\x9f\\xe8\\x0a\\x54\\x93\\x80\\x5f\\x0d\\x56\\xd3\\x05\\x15\\x54\\x7b\\xc9\\x79\\x65\\xd6\\xf0\\x7e\\x87\\x46\\x22\\xf1\\x61\\x35\\x30\\xbd\\xd5\\x46\\x54\\x49\\xd6\\x8e\\x5f\\x26\\xda\\x11\\x4f\\xa7\\xb7\\x63\\x44\\xce\\xad\\x0c\\x87\\x07\\x35\\xa3\\x3d\\xa0\\x94\\xe8\\x6d\\x58\\x14\\x52\\xcd\\x62\\x4c\\xf5\\xd6\\x86\\xfe\\x17\\x1a\\x33\\x48\\xfc\\x89\\xf6\\x4b\\x43\\x93\\xb2\\xb6\\x9e\\xe5\\xd5\\xfc\\x2e\\x08\\x72\\x79\\xe7\\xa5\\xf7\\x23\\xbd\\x08\\x44\\xef\\x67\\x0f\\x8c\\xf9\\xb6\\x7f\\x4e\\xe6\\xf8\\x6f\\x50\\x6c\\xd2\\x7a\\x4a\\xfc\\xe6\\x96\\x87\\x7f\\x9d\\x28\\xfb\\x9f\\x88\\xcb\\xc6\\x0e\\xe3\\x16\\x00\\x26\\x70\\xd0\\x7f\\x08\\x60\\xba\\xa9\\xef\\x17\\xda\\x47\\xfd\\x4f\\xf4\\x3f\\x6d\\xec\\xd0\\x7b\\xeb\\x94\\x9f\\x2f\\xb9\\x93\\x98\\xaa\\xdd\\x8d\\xf4\\xe9\\x07\\x97\\x8f\\x7d\\xdc\\xc3\\x98\\x29\\x9c\\x41\\x9b\\xb0\\x1e\\xcb\\xc5\\xf7\\xd0\\x25\\x9c\\xc1\\x64\\xd2\\x89\\x99\\xdc\\x93\\xd8\\xc8\\x3d\\x0b\\x03\\xbf\\x12\\x05\\xc2\\x66\\x4c\\x27\\xf7\\x21\\xc8\\xd5\\xa2\\x94\\x2b\\xc3\\x2e\\x7e\\x16\\x24\\x61\\x03\\x6e\\x14\\xd6\\xe3\\xa0\\xb0\\x1e\\x1d\\xc2\\x7a\\xcc\\x17\\xd6\\x63\\xac\\xb0\\x1e\\x3f\\x15\\xd6\\x63\\xa3\\xb0\\x1e\\x97\\x08\\xeb\\xb1\\x50\\x58\\x8f\\xcb\\x38\\x11\\xbb\\x38\\x3b\\xe6\\x09\\x12\\x2e\\x10\\xd6\\xe3\\x7e\\x21\\x88\\x4d\\xfc\\x5b\\x98\\x60\\xac\\xc4\\x72\\xb1\\x06\\x2e\\xb1\\x10\\x51\\x51\\xc6\\x6a\\xb1\\x15\\x51\\xe1\\x17\\x88\\x0a\\x7b\\x10\\x15\\x57\\x62\\x8d\\xf8\\x1c\\xa2\\x5c\\x0b\\x5e\\x12\\x16\\xa3\\x59\\x2c\\x47\\x54\\x98\\x85\\xa8\\xd1\\x88\\xa8\\xf6\\xb9\\xb8\\x12\\x37\\x8a\\x1e\\x56\\x5e\\x82\\xa8\\xd0\\x87\\x85\\x82\\x82\\x12\\x71\\x31\\x76\\x88\\x99\\xc8\\x36\\xca\\x18\\x23\\x66\\xa2\\x59\\xf8\\x03\\x5c\\xc2\\x1b\\xe8\\xe0\\x46\\xe1\\x1e\\x7e\\x3a\\x7c\\xdc\\x28\\x58\\xf9\\x76\\x4c\\xe0\\x1f\\x83\\xc0\\xad\\xc7\\x2c\\x61\\x21\\x16\\x0b\\x5b\\x70\\x8f\\x30\\x09\\x1d\\xc2\\x16\\xcc\\x15\\x9a\\x30\\x8f\\x7b\\x15\\x0d\\xc2\\x16\\xcc\\xd7\\x3e\\xe7\\x04\\x3c\\xc2\\x39\\xfa\\x5f\\x12\\xf2\\xb0\\x4d\\x3b\\x37\\xc4\\x71\\x0f\\xfd\\xfe\\x16\\xfa\\x7d\\xad\\x9c\\xcb\\xbd\\x84\\x7b\\x84\\x00\\x6e\\xe0\\x5e\\x43\\x89\\xb0\\x05\\x77\\x09\\x06\\xd4\\x18\\x32\\x50\\xad\\x95\\x82\\x01\\x79\\x82\\x01\\xb3\\xb9\\x03\\x98\\x44\\x4e\\xe3\\x59\\xee\\x00\\xb2\\xc4\\x65\\x58\\x47\\xf1\\x3f\\x8d\\x6d\\xc2\\x5c\\x5c\\x2f\\xec\\x45\\x9b\\xa8\\xa0\\x4b\\x38\\x8e\\x22\\xf2\\x67\\xdc\\x2b\\x9c\\xc0\\x6c\\xbe\\x0f\\x7b\\x0d\\x53\\xd1\\xce\\xff\\x04\\x6b\\xf8\\xc3\\x98\\x2b\\xdc\\x88\\x5b\\x34\\xec\\xe9\\x67\\xfb\\xf1\\x43\\xee\\x34\\xd6\\x09\\xdf\\xc3\\x3c\\x7e\\x3e\\x6e\\xe2\\x97\\xa0\\x9b\\xbb\\x1b\\xb7\\x0a\\x5b\\xf0\\x00\\xff\\x15\\x26\\x71\\x05\\xd8\\x45\\xfa\\x70\\x13\\x57\\x8d\\x39\\xfc\\xcf\\xe9\\xdf\\x2f\\x35\\x34\\xe1\\x80\\xe1\\x69\\x1c\\x30\\x7c\\x83\\x75\\xfc\\x37\\x0c\\xf7\\x61\\x0e\\xe3\\x86\\xfe\\x93\\x5a\\x5b\\xd0\\x76\\x48\\x39\\xb8\\x96\\xfe\\x0f\\xb4\\xb6\\xe0\\x5a\\xfa\\xbf\\xe6\\x5a\\xfa\\x8f\\x8a\\xf3\\x30\\x3a\\xd9\\x0e\\x69\\x87\\x70\\x21\\xda\\xe9\\xb9\\xd6\\x16\\x29\\x07\\x6d\\x8b\\x17\\xf0\\x98\\xd0\\x8b\\x3b\\x29\\xee\\xc3\\x1c\\x86\\x97\\x31\\x8e\\xb6\\x45\\x13\\xe6\\xa5\\x1e\\x1c\\xdf\\xff\\x02\\xc7\\xe3\\x01\\x8e\\xef\\x7f\\x93\\xe3\\xfb\\x9f\\x10\\x22\\xb8\\x30\\xa5\\x1d\\x06\\x1f\\xdb\\x71\\x01\\x3b\\xbf\\x6b\\xd0\\xa1\\xb5\\xc5\\x6e\\x3c\\xa0\\x95\\xc6\\xa7\\xd0\\x65\\x9c\\x88\\x0e\\xad\\x4e\\xfc\\xdb\\xd8\\xc7\\xbf\\x8d\\x3b\\xf8\\xc3\\x80\\xf6\\x46\\x25\\x4a\\x6e\\x23\\x40\\x3e\\x01\\x48\\xb3\\x7e\\xe0\\x6b\\x80\\x6c\\x00\\x70\\x3d\\x40\\xdf\\x03\\x76\\x88\\x9b\\xb0\\xc7\\xf0\\x23\\x6c\\x25\\xbb\\x31\\x93\\x1e\\xbb\\x30\\x93\\xfb\\x02\\x33\\xb9\\x53\\x98\\xc9\\x1d\\xc3\\x4c\\xee\\x79\\xdc\\x29\\xce\\xc7\\x2e\\xed\\x6f\\xb9\\x4e\\x2c\\xe1\\x3a\\xd1\\xae\\xdd\\x57\\x98\\x8c\\x19\\xa2\\x80\\x4e\\x41\\x1b\\xc1\\xb5\\x77\\xec\\x75\\x34\\x18\\xc7\\xa2\\xc1\\xb8\\x59\\xeb\\x3f\\x51\\xc5\\xfe\\xb5\\x63\\x1b\\x59\\xc9\\x81\\x7b\\x98\\x6f\\xe0\\x67\\xf3\\x5b\\xf8\\x83\\xfc\\x49\\xa1\\x46\\x98\\x25\\x74\\x0b\\xdb\\x84\\xa7\\x84\\xbf\\x88\\x45\\xe2\\x46\\x83\\xc5\\x70\\x85\\xe1\\xa4\\x71\\xae\\xf1\\x45\\xd3\\x54\\xd3\\x41\\xd3\\x1f\\xcc\\x36\\x73\\x99\\xb9\\xcd\\x7c\\x8d\\xf9\\x35\\xcb\\x7d\\x96\\xc3\\xd6\\x2a\\xeb\\x76\\xeb\\x6f\\x6d\\x36\\x5b\\xb3\\x2d\\x6a\\x3b\\x69\\xb7\\xd8\\xa7\\xdb\\xb7\\xd8\\x23\\x19\\xa6\\x8c\\xa9\\x19\\x3b\\x33\\xde\\xcb\\x9c\\x98\\xf9\\x84\\x54\\x21\\x5d\\x21\\x6d\\x97\\x0e\\xca\\xd3\\xe5\\x75\\xb2\\x22\\x7f\\xe0\\xb0\\x38\\x3c\\x8e\\x59\\x8e\\x95\\x8e\\xbb\\x1d\\xcf\\x38\\xeb\\x9c\\x0f\\x3a\\xe3\\xae\\x2e\\xd7\\x5b\\x59\\x9e\\xac\\x9f\\x65\\x7d\\x96\\x2d\\x65\\x4f\\xcb\\xde\\x94\\xbd\\xdb\\x9d\\xe1\\xbe\\xc2\\xbd\\x3b\\x47\\xc8\\x59\\x9c\\xf3\\x78\\x6e\\x49\\xee\\x9a\\xdc\\xd7\\x72\\x4f\\xe5\\x5d\\x91\\x77\\x7b\\xde\\x91\\xbc\\x6f\\xf3\\x67\\xe6\\x2f\\xc9\\x7f\\xad\\x20\\xa7\\x20\\xa7\\x60\\x62\\xc1\\xd3\\x85\\x25\\x85\\x7b\\x8b\\x32\\x8a\\xea\\x8a\\x4e\\x16\\xe7\\x14\\x1f\\xf2\\x8c\\xf7\\x5c\\xe3\\xd9\\xe8\\xd9\\xed\\xbd\\xda\\xbb\\xda\\xfb\\x4a\\x49\\x46\\xc9\\xc2\\x92\\x2f\\x4a\\x33\\x4a\\xe7\\x96\\xee\\x2c\\x8d\\x96\\x9e\\x2a\\xcb\\x2e\\xbb\\xa6\\xec\\xc7\\x65\\x7f\\x2f\\xbf\\xbb\\xe2\\xea\\x8a\\x57\\x2a\\xe2\\xbe\\x71\\xbe\\xb5\\xbe\\x53\\xa3\\xa6\\x8d\\x3a\\x54\\x39\\xaa\\xf2\\xc0\\x68\\x6e\\xf4\\x85\\xa3\\x77\\x8e\\xfe\\xca\\x9f\\xe7\\x6f\\xf3\\xaf\\xf6\\x2b\\x55\\x52\\xd5\\xe6\\xaa\\xcf\\xaa\\xa7\\x56\\x3f\\x5e\\x13\\xac\\x79\\xb4\\xe6\\x95\\xc0\\x85\\x81\\x6d\\x81\\x77\\x83\\x25\\xc1\\xb5\\xc1\\xfd\\xb5\\x5c\\xed\\x9a\\x50\\x46\\xe8\\xf1\\x70\\x73\\x1d\\xea\\x9e\\xaa\\xef\\x1a\\xe3\\x19\\xb3\\x77\\x6c\\xd1\\xd8\\x6d\\x0d\\x96\\x86\\x2d\\x0d\\xfb\\x1b\\xfe\\xd0\\xe8\\x68\\x9c\\xd6\\xf8\\xdb\\x71\\xd3\\xc7\\x3d\\xd5\\x24\\x34\\x75\\x35\\xfd\\x69\\xfc\\x75\\xe3\\xb7\\x4d\\x70\\x4c\\x58\\x3a\\xe1\\xcd\\x89\\xc1\\x89\\x0f\\x4e\\x3c\\x39\\xe9\\xa2\\x49\\x07\\x26\\x37\\x4c\\x7e\\x77\\x4a\\xd9\\x94\\xe9\\x53\\x76\\x8e\\xf0\\xef\\xf1\\x29\\x91\\x29\\x87\\xa6\\xbc\\x3b\\xe5\\x54\\xb3\\xab\\xb9\\xa1\\xf9\\xea\\xe6\\xfb\\x9a\\xdf\\x6a\\x31\\xb5\\x34\\xb4\\x74\\xb7\\x74\\xb7\\xdc\\xd7\\x72\\xb0\\xe5\\xe0\\xd4\\xd5\\x53\\x3f\\x68\\x35\\xb4\\x3e\\xd1\\x66\\x6b\\x3b\\x75\\xc1\\x36\\x36\\x7f\\xfe\\x12\\x6d\\xa0\\xc9\\x4b\\xc1\\x81\\x80\\x43\\xb6\\xf6\\x31\\xb9\\x92\\xf5\\xd1\\x12\\x0e\\x83\\x07\\x11\\xcc\\x00\\x26\\xd2\\xd1\\x54\\x3b\\x27\\xb0\\x61\\x22\\x3b\\xe7\\x90\\x81\\x8b\\xd8\\x39\\x8f\\x3a\\xb4\\xb3\\x73\\x01\\x05\\xd8\\xc2\\xce\\x45\\x54\\xe1\\x29\\x76\\x6e\\x40\\x01\\xfe\\x93\\x9d\\x1b\\x31\\x19\\xa7\\xd8\\xb9\\x19\\x36\\x12\\x64\\xe7\\x56\\xb8\\xc8\\x78\\x76\\x6e\\x43\\x05\\x99\\xc9\\xce\\xed\\xb8\\x86\\xac\\x66\\xe7\\x19\\xf8\\x3e\\xf9\\x0f\\x76\\xee\\x40\\x01\\x57\\xc1\\xce\\x8f\\x20\\x9b\\x6b\\x66\\xe7\\x6f\\x20\\xc8\\xb5\\xa3\\x0d\\xcb\\xb0\\x14\\x2b\\xe1\\xc1\\x7c\\x74\\x60\\x25\\x3a\\xe0\\xc1\\x3c\\x2c\\x43\\x37\\x6e\\xc6\\x72\\x2c\\x42\\x27\\xba\\xe8\\x6f\\x2f\\xc0\\x32\\x2c\\x43\\x27\\x96\\x60\\x01\\x3c\\x08\\x21\\x88\\x5a\\x84\\x30\\x0b\\xcb\\x30\\x17\\xcb\\xb0\\x12\\xcb\\x30\\x0b\\x0b\\xd0\\x89\\x55\\x58\\x82\\x0e\\x2c\\x1f\\xf4\\xfd\\x71\\x83\\xbe\\xe7\\x49\\xfb\\xe6\\x38\\x76\\xb7\\xf0\\x59\\xbf\\x75\\x05\\x16\\x60\\x39\\x56\\x60\\x11\\xad\\xaf\\x07\\xb5\\xa8\\x41\\x2d\\x82\\xf4\\x2f\\xeb\\x50\\x8b\\xa6\\x64\\xad\\x06\\xdf\\xa7\\x3a\\xed\\x3e\\x83\\x9f\\xb1\\x08\\x2b\\xe0\\xa1\\x32\\xaf\\xc4\\x72\\x74\\x60\\x3e\\x16\\xe0\\x06\\xfa\\xbd\\xeb\\xe1\\xc1\\x32\\x2c\\x4c\\x93\\xbc\\x66\\xd0\\xd5\\xe0\\xdf\\x68\\xa8\\xdd\\x80\\x16\\x74\\x51\\xdc\\x56\\x60\\x25\\x16\\xa1\\x83\\xd6\\x55\\x7f\\xa6\\x56\\xff\\x95\\x58\\x41\\xeb\\x3f\\x0d\\x8b\\x30\\x0f\\x0b\\xb0\\x14\\x2b\\xb0\\x00\\xf3\\xe1\\xc1\\x2a\\x2c\\xa5\\x4f\\x5f\\x4e\\xeb\\xd2\\x45\\x51\\x9e\\x82\\x6e\\x74\\x60\\x1e\\xbb\\x1a\\xfc\\x37\\x55\\xf0\\x0c\\xc1\\x24\\x84\\x1a\\x04\\x69\\x7b\\xad\\x44\\x37\\xc6\\x21\\x80\\x00\\x6e\\xa2\\xff\\x6a\\xd0\\x91\\x72\\xaf\\x1a\\x2c\\xc3\\x72\\x74\\x22\\x80\\x25\\x83\\xee\\xb9\\x02\\x01\\x4c\\xc3\\xf7\\xd0\\x82\\x56\\x4c\\xc7\\x65\\x68\\x45\\x35\\xbb\\xe7\\xd9\\x5a\\xe6\\x4a\\x2c\\xc0\\x5c\\x2c\\x4c\\xea\\x51\\x2d\\xfd\\x8b\\x36\\x8a\\x82\\x2e\\xc3\\x72\\x5a\\xb7\\x7a\\x78\\x68\\xfb\\x8c\\x43\\x10\\x21\\xfa\\xff\\x98\\x64\\x9b\\xd5\\xd1\\x37\\x8c\\xfe\\xf4\\x2f\\xc6\\x7c\\x0c\\xf7\\xf3\\x25\\x40\\x38\\xc2\\x83\\x87\\x00\\x11\\x06\\x18\\x61\\x82\\x19\\x16\\x58\\x61\\x83\\x1d\\x19\\xc8\\x84\\x04\\x19\\x0e\\x38\\xe1\\x42\\x16\\xb2\\xe1\\x46\\x0e\\x72\\x91\\x87\\x7c\\x14\\xa0\\x10\\x45\\x28\\x86\\x07\\x5e\\x94\\xa0\\x14\\x65\\x28\\x47\\x05\\x7c\\x18\\x85\\x4a\\x8c\\x86\\x1f\\x55\\xa8\\x46\\x0d\\x02\\x4c\\xa7\\xc3\\xa8\\x43\\x3d\\xc6\\x60\\x2c\\x1a\\xd0\\x88\\x71\\x68\\xc2\\x78\\x4c\\xc0\\x44\\x4c\\xc2\\x64\\x4c\\x41\\x33\\x5a\\x30\\x15\\xad\\x68\\xc3\\x05\\xb8\\x10\\xdf\\xc3\\x45\\xb8\\x18\\xd3\\x70\\x09\\xa6\\x63\\x06\\x66\\xe2\\x52\\xcc\\xc2\\x65\\xf8\\x3e\\x2e\\xc7\\x15\\xb8\\x12\\xed\\xb8\\x0a\\x57\\xe3\\x07\\xb8\\x06\\xd7\\x62\\x36\\xe6\\xe0\\x3a\\x74\\x10\\x01\\x8f\\x61\\x23\\x6e\\xc3\\x2f\\xb1\\x13\\x5f\\xe0\\x76\\xdc\\x8d\\xbb\\xf0\\x53\\xec\\xc1\\xe3\\x44\\xc4\\x66\\xbc\\x87\\x5b\\xb1\\x83\\x18\\x88\\x11\\x5b\\x89\\x09\\x9b\\xf0\\x2a\\x3e\\x20\\x66\\xfc\\x0c\\x7b\\xf1\\x0d\\xfe\\x82\\x6f\\xb1\\x1b\\xbf\\xc0\\x1b\\x78\\x1d\\xcf\\x60\\x2e\\xe6\\x61\\x1b\\xe6\\xe3\\x28\\x16\\xe0\\x08\\x7e\\x85\\xdf\\xe0\\x4d\\xfc\\x1a\\x6f\\x21\\x86\\x85\\x78\\x1b\\xbf\\xc5\\xbf\\xe3\\x59\\x74\\xe2\\x14\\xee\\xc5\\x31\\xfc\\x27\\xde\\x41\\x17\\x4e\\xe0\\x8f\\xb8\\x13\\x8b\\xb1\\x08\\xd7\\xe3\\x06\\x2c\\xc1\\x52\\x3c\\x8a\\x65\\xb8\\x91\\xb6\\xcf\\x0a\\xac\\xc2\\x4a\\xac\\xc6\\x4d\\xf8\\x12\\x6b\\xb0\\x16\\x37\\xe3\\x87\\xf8\\x17\\xfc\\x08\\x07\\xb0\\x0b\\xb7\\xe0\\xc7\\x58\\x87\\xf5\\x38\\x89\\xaf\\x70\\x10\\x0a\\x54\\xfc\\x1f\\xbc\\x8b\\xff\\x22\\x16\\x62\\x25\\x36\\x62\\x27\\x19\\x24\\x93\\x48\\x44\\x26\\x0e\\xe2\\x24\\x2e\\x92\\x45\\xb2\\x89\\x1b\\x11\\xf4\\x60\\x3f\\x9e\\xc7\\x6b\\x88\\xe2\\x39\\xf4\\xe2\\x0e\\xec\\x23\\x39\\x78\\x09\\xff\\x46\\x72\\x49\\x1e\\xb6\\x90\\x7c\\x52\\x40\\x0a\\x49\\x11\\x29\\x36\\x74\\x2e\\xb9\\xb9\\xbb\\xab\\xd6\\xb8\\x6a\\xe9\\xa2\\x60\\x30\\x38\\x55\\x2f\\xa7\\x04\\x59\\xc9\\xae\\x9b\\x43\\xac\\x0c\\xb3\\xb2\\x9e\\x95\\x8d\\x5a\\x19\\x0a\\x06\\x83\\xac\\xac\\x65\\x65\\x88\\x95\\x61\\x56\\xd6\\xb1\\xb2\\x9e\\x95\\x63\\x58\\x39\\x96\\x95\\x0d\\xac\\x4c\\xdc\\x6f\\x8a\\x5e\\xd6\\xb2\\xfb\\xd6\\xd6\\x5a\\x16\\x2e\\xea\\x5c\\xb5\\x7c\\xc1\\xfc\\x8e\\x15\\x5d\\xfa\\x47\\xa1\\x36\\xbd\\xac\\x6f\\x13\\x5a\\x57\\x2d\\x5f\\x46\\x2f\\xea\\xdb\\x5a\\xb4\\xb2\\xad\\x59\\xaf\\x47\\x5b\\xb3\\x5e\\x8f\\xb6\\x66\\xbd\\x1e\\x6d\\xcd\\x41\\x4d\\xcd\\x0f\\x90\\xfe\\xdb\\x14\\xb2\\x15\\x17\\x2b\\xa6\\x99\\xed\\x2a\\x21\\x77\\x5f\\xa5\\xb6\\x19\\xfc\\xed\\x5e\\x45\\xba\\xea\\x62\\xc5\\x35\\xab\\xdd\\xab\\xac\\xbb\\xaa\\x50\\x31\\xf8\\xaf\\x69\\x87\\xc2\\x7b\\x5a\\x15\\xde\\x3f\\x55\\x11\\x3c\\xad\\x11\\xbe\\x9b\\xf3\\xd3\\x0b\\xd1\\xd3\\x1a\\x11\\x12\\x17\\x06\\x4f\\x6b\\x44\\x5c\\xc9\\x2e\\x8c\\x9e\\xd6\\x88\\x61\\x3c\\xbb\\x30\\x79\\x5a\\x23\\xc6\\x2a\\x76\\x61\\xf6\\xb4\\x46\\x4c\\x1e\\x76\\x61\\xf1\\xb4\\x46\\xcc\\xc5\\xfa\\x05\\x51\\xac\\xec\\x19\\x36\\x4f\\x6b\\xc4\\xda\\xc8\\xf9\\x55\\xbe\\x6d\\xb5\\x7f\\xaa\\x62\\xf7\\xb4\\x46\\x6c\\x79\\xc9\\xcb\\x0c\\x4f\\x6b\\xc4\\xbe\\x25\\x79\\x99\\xe9\\x69\\x8d\\x64\\x94\\x26\\x2f\\x25\\x4f\\x6b\\x24\\xd3\\x9b\\xbc\\x94\\x3d\\xad\\x11\\xc9\\x93\\xbc\\x74\\x78\\x5a\\x23\\x72\\x71\\xf2\\xd2\\xe9\\x69\\x8d\\x38\\x7c\\x89\\xcb\\xab\\x14\\x97\\x1f\\x20\\x97\\x5d\\x75\\x72\\x3a\\xf0\\xff\\x02\\x00\\x00\\xff\\xff\\xb3\\x46\\xeb\\x4b\\xa0\\xb1\\x00\\x00\")\n\nfunc fontsRobotoRegularWebfontTtfBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoRegularWebfontTtf,\n\t\t\"fonts/roboto-regular-webfont.ttf\",\n\t)\n}\n\nfunc fontsRobotoRegularWebfontTtf() (*asset, error) {\n\tbytes, err := fontsRobotoRegularWebfontTtfBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-regular-webfont.ttf\", size: 45472, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoRegularWebfontWoff = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x64\\xb6\\x43\\x70\\xe0\\xdf\\xdb\\xc5\\xf9\\x8d\\xd3\\xb1\\xd3\\x71\\xd2\\x51\\xc7\\xb6\\x6d\\xdb\\xb6\\xad\\x8e\\xd1\\xb1\\x6d\\xdb\\xb6\\x6d\\xdb\\xe9\\xd8\\x76\\x32\\xf5\\xfb\\xbf\\x53\\x35\\x8b\\xb9\\xb7\\x3e\\x75\\xee\\xb9\\x8b\\xb3\\x79\\x16\\xe7\\x71\\x93\\x13\\x15\\x05\\x40\\x00\\x00\\x00\\x0c\\x7a\\x01\\xd4\\xff\\xb4\\x2e\\xf7\\xff\\xfc\\xff\\xff\\x88\\x8a\\x2a\\xcb\\x00\\x00\\x48\\x29\\x00\\x00\\xb8\\xff\\x61\\x0e\\xfe\\x3c\\x2b\\x26\\x2c\\x22\\x0a\\x00\\x20\\x83\\x00\\x00\\x50\\x00\\x00\\x40\\x0d\\x7a\\x07\\x32\\x2f\\x26\\x2f\\xa7\\x04\\x00\\x20\\x37\\x00\\x00\\x29\\x03\\x00\\x08\\xba\\x6d\\xbc\\x81\\xfc\\x62\\x4a\\x2a\\x82\\x00\\x00\\xcd\\x0f\\x00\\x80\\x2c\\x00\\x00\\xfa\\x64\\x03\\x84\\x4b\\x72\\x4a\\x74\\x8c\\x00\\x00\\x1d\\x0b\\x00\\x80\\xda\\x7f\\x7f\\x2d\\x4f\\x1f\\x91\\x46\\x36\\x06\\xf6\\x00\\x00\\x7d\\x02\\x00\\x20\\xa1\\x00\\x00\\xb2\\x7f\\x38\\x29\\x48\\x69\\xe4\\xea\\x4c\\x08\\x00\\x30\\xf6\\x00\\x00\\xb0\\xff\\x07\\x7c\\x2b\\x32\\xbd\\xa9\\xbd\\x99\\x0d\\x00\\xc0\\x94\\x02\\x00\\x48\\x1d\\x00\\x80\\x9a\\x28\\x35\\xd2\\x95\\x98\\x19\\x38\\xd9\\x03\\x00\\x9c\\x36\\x00\\x00\\xd0\\xff\\x2f\\x48\\x66\\xd6\\x1e\\xa6\\x00\\x00\\x67\\x0c\\x00\\xd2\\x51\\x00\\x10\\x43\\x18\\xe7\\xed\\x06\\x61\\x6e\\x62\\x60\\x0c\\x00\\xea\\x0f\\x00\\x00\\x30\\x00\\x00\\xc0\\x0a\\xc1\\x11\\xc4\\x6c\\x6e\\x6e\\x62\\x00\\x00\\x1a\\xbf\\x01\\x00\\x20\\x00\\x00\\x80\\x04\\xd1\\x1f\\x52\\xd8\\xdc\\xc6\\xd9\\x1d\\x00\\x34\\xc4\\x01\\x00\\xd4\\x00\\x00\\xc0\\x4a\\x47\\xff\\x28\\x1e\\x58\\xdb\\x19\\x19\\x00\\x80\\x56\\x25\\x00\\x80\\x4c\\x02\\x00\\xc8\\xb2\\xcd\\xba\\x54\\xb7\\x8d\\x81\\xbb\\x3d\\x00\\xe8\\xb8\\x03\\x00\\x40\\xf8\\x1f\\xa0\\x50\\x20\\x79\\xb6\\x06\\x36\\x26\\x00\\xa0\\x93\\x0a\\x00\\x20\\xc1\\x00\\x00\\x26\\x2b\\x25\\xea\\x55\\x69\\x6f\\xe7\\xe4\\x0c\\x00\\x7a\\x84\\x00\\x00\\x72\\x05\\x00\\xa0\\x87\\xd8\\x7f\\x18\\x8b\\xed\\x1d\\x4d\\xec\\x01\\xc0\\x00\\x09\\x00\\x80\\x62\\x00\\x00\\x41\\xdd\\x63\\x50\\x27\\x71\\x33\\x31\\x34\\x05\\x00\\x83\\x56\\x00\\x00\\x20\\xff\\xe3\\x42\\x4e\\x49\\x03\\x00\\xfe\\x6f\\x2a\\x93\\x3c\\xf9\\x33\\xff\\x53\\xb1\\x56\\xa6\\xff\\x74\\xc6\\x37\\x73\\xca\\x7d\\xdd\\x48\\xdf\\x58\\x5f\\x7f\\x17\\xcc\\x10\\x1d\\x12\\x49\\xdf\\x50\\xdf\\x54\\xdf\\xd8\\x1d\\x66\\x70\\xc6\\x2f\\x36\\x6c\\x8f\\x63\\x40\\x8a\\x30\\x03\\x82\\x7a\\x00\\x00\\x94\\x90\\xc0\\x87\\x00\\x00\\x70\\x5f\\xaf\\x4a\\xf6\\xb0\\x56\\x56\\x41\\x1b\\xee\\x61\\xcb\\xca\\x6b\\x94\\xe6\\xca\\x02\\x1d\\xf8\\xc5\\x02\\xb9\\xb6\\x29\\x0f\\xb2\\x46\\x3d\\x98\\x3a\\x7e\\x14\\x42\\xfd\\x2b\\x42\\x58\\x66\\x31\\x34\\x20\\x2e\\xb5\\x34\\xec\\x05\\xaa\\xbe\\x83\\x64\\x5f\\xb4\\x30\\x20\\xc0\\x3a\\x18\\x14\\x52\\xf9\\x97\\x61\\x99\\x2a\\x31\\x6d\\xe8\\x6f\\x41\\xe4\\xb3\\xe8\\x22\\x6e\\x88\\xf0\\x2f\\xae\\x91\\x9d\\x0e\\xa6\\x79\\x84\\x0a\\xe5\\x9d\\x14\\xbb\\xed\\x2c\\xaf\\x1d\\x8e\\xe7\\xec\\xeb\\xec\\xf7\\xed\\x38\\x72\\x0a\\x35\\x35\\xf3\\x5c\\x41\\xd2\\x40\\xdb\\x9f\\x45\\x1f\\x50\\x57\\x7f\\xdc\\xc3\\xd7\\xa9\\xa4\\x7b\\x26\\xd1\\x22\\xd9\\x6c\\xbd\\x9e\\x77\\x78\\x5c\\xc2\\xd3\\xa1\\x68\\x46\\x6a\\x05\\x37\\x85\\xc6\\xa7\\x28\\x93\\x52\\x96\\x86\\x78\\x36\\xa4\\x94\\xfa\\x0a\\x3c\\x55\\x8b\\x28\\x17\\x3c\\xbb\\xce\\x79\\xae\\x64\\xd4\\xd2\\xd8\\x46\\x32\\xae\\xab\\x6e\\x79\\x6f\\x7c\\x6e\\xce\\x84\\xf6\\x66\\x7b\\xe5\\x25\\xcc\\x0d\\xcd\\xbd\\x4b\\xc9\\xfe\\xfd\\x3d\\x13\\xf2\\x51\\x4d\\x3c\\xc6\\x91\\x0f\\xd7\\x81\\x31\\x81\\xef\\x1d\\x87\\x32\\x38\\xe6\\xf3\\x2b\\x71\\xb0\\xcc\\x0b\\x7d\\x2b\\x4b\\x7a\\xab\\x68\\x08\\x4f\\x9a\\x35\\x54\\x87\\x68\\x58\\x9c\\x5b\\xb6\\x8a\\xc4\\x5b\\x66\\x7f\\xcf\\xf6\\x55\\xe0\\xca\\xb5\\xba\\x90\\xdb\\x12\\x88\\x29\\xe1\\x78\\x08\\x66\\x5e\\xfc\\xd2\\x6f\\x8c\\x7e\\x31\\x1a\\x1b\\x08\\x1f\\xf8\\xb5\\x3a\\xc6\\xab\\x48\\xc0\\x9d\\xac\\x1e\\x05\\xb9\\x46\\x04\\x1f\\x22\\xb4\\x4b\\xcf\\x0e\\x1a\\x1d\\x50\\x70\\xeb\\x8a\\x93\\x6c\\x54\\xa5\\x8a\\xba\\xeb\\x6c\\x9d\\x1d\\xc4\\xb4\\x2b\\xcd\\x0e\\x3b\\x1d\\x22\\x75\\x53\\x87\\xd6\\x0d\\x92\\xd2\\x77\\x68\\x0f\\xa1\\x1d\\x1c\\xc3\\xd8\\x8a\\x5d\\xed\\x7f\\x68\\x4f\\xfc\\x07\\xb6\\x1b\\x7e\\xc7\\x3f\\x63\\xd7\\xf4\\xc8\\x1d\\xd1\\xd6\\xff\\x7a\\x00\\xe6\\xa8\\x3c\\x88\\x80\\x51\\x75\\x4a\\xf3\\xb9\\x2f\\xdd\\x18\\x69\\x8e\\xbd\\xc2\\xb9\\x27\\x07\\x75\\xe5\\xe7\\xa1\\x95\\xec\\x1d\\x17\\x8b\\x12\\xc1\\xfe\\x85\\x59\\x4f\\x69\\xcf\\x2b\\x65\\xf3\\xa7\\x26\\x5c\\x85\\x7e\\x50\\xdc\\x65\\xe4\\x87\\xec\\x35\\x82\\xa7\\xdb\\x6c\\x87\\xd0\\xda\\xa0\\x8a\\x7f\\x4c\\x0d\\xf3\\xda\\xd5\\x02\\x73\\x46\\xa4\\x2c\\xa9\\xa6\\x85\\xd5\\x43\\x75\\xd7\\xf4\\xb6\\xa8\\xc2\\x21\\xf6\\x90\\xc7\\x19\\xf9\\x56\\x5e\\x72\\x35\\xb9\\xa8\\x5c\\x62\\xb6\\xd0\\xc3\\xbf\\x40\\xdc\\xe1\\x80\\xe3\\xbb\\x0b\\x29\\x51\\x98\\xb9\\xd6\\xe8\\x39\\x9e\\x0b\\xe1\\xac\\x86\\x34\\x6b\\xab\\xdb\\x0f\\x88\\x6c\\xbd\\x01\\x27\\xd2\\xec\\x16\\xcb\\x1e\\xef\\xcb\\xe5\\x2f\\x2a\\xaa\\xee\\x48\\x9e\\x53\\x58\\xcc\\x7e\\xc5\\x17\\x4a\\x6d\\x70\\xad\\xba\\x23\\x50\\xc7\\x26\\xc2\\xae\\x70\\xc1\\xa7\\xe2\\xe4\\xae\\x32\\x13\\x3b\\xcb\\xb5\\x0c\\xcd\\xa7\\xa2\\xe5\\xa9\\xda\\x70\\x2f\\x2c\\x6d\\xf8\\x95\\x5e\\xc7\\x12\\xb5\\x2a\\x57\\xa3\\x0e\\xa8\\xab\\xe0\\x9d\\x3e\\x0c\\xf7\\x9b\\xdb\\xdd\\x83\\xbe\\x91\\xc0\\x18\\x28\\x02\\xab\\xff\\xef\\xe6\\xc0\\x61\\x4b\\x56\\x1a\\x85\\xfa\\xe0\\x3e\\xbc\\xa4\\x8c\\x58\\x1a\\xb1\\x0a\\x39\\xa8\\x83\\x57\\xec\\xf1\\xaa\\x83\\x05\\xb2\\xff\\xd9\\xbf\\x09\\x1b\\x20\\x47\\xc8\\xf9\\xef\\x51\\x77\\x21\\x42\\xd2\\x36\\xb9\\x2d\\xa1\\xb3\\xa8\\xb2\\xe5\\x1c\\xd7\\x7e\\xee\\xf8\\x28\\x2f\\x27\\x5a\\xfd\\xeb\\xfe\\x2d\\x6e\\x62\\x08\\xbb\\x37\\x0d\\xb7\\x3c\\x83\\x59\\xd3\\x28\\xcd\\x21\\x80\\xcc\\xb2\\x3d\\x7b\\x11\\x6e\\x6a\\x91\\x7a\\x6a\\x59\\x7b\\x6a\\x41\\xc9\\x53\\x73\\xc6\\xbc\\x5b\\x77\\x36\\xc2\\x53\\x82\\xce\\x0a\\xa4\\x4d\\x2f\\x4f\\xb2\\xde\\x97\\xcd\\xe1\\x8a\\x74\\x58\\x3e\\x9a\\x20\\x73\\xf4\\x62\\x6f\\x0a\\xf3\\x04\\x14\\xdd\\x21\\xfc\\x79\\x1d\\x77\\xc3\\x96\\x20\\xcd\\x6e\\xc2\\x26\\x6d\\x7a\\x4f\\x12\\x7f\\xf6\\xdb\\x71\\xad\\x46\\xd5\\x6a\\xe3\\x42\\x1d\\x95\\xda\\x97\\xb7\\xa4\\x04\\xd1\\x64\\x52\\xc3\\xac\\xa3\\x75\\xe6\\xc8\\x67\\xd6\\xe7\\x03\\x73\\xb9\\xa7\\x44\\xbc\\xd8\\xe4\\x89\\xa0\\x99\\xe9\\x54\\x3e\\xb5\\x4d\\x73\\x5a\\xc7\\x7e\\x68\\x01\\xee\\x6b\\x64\\xec\\x56\\x69\\x4a\\xed\\x39\\x87\\x99\\x07\\x69\\xd0\\x3d\\xfc\\x2b\\x30\\xb3\\x63\\xb7\\x7b\\x91\\x2c\\xfb\\x67\\x93\\x47\\x66\\x62\\x88\\x2f\\x4f\\xa5\\x59\\xfd\\x1c\\x76\\xe5\\xb6\\x29\\xbe\\xdd\\xf7\\x70\\x34\\xcd\\x54\\x6d\\xd7\\xda\\x17\\x8c\\x6b\\xed\\x2d\\x2d\\x59\\x49\\xac\\xda\\xfb\\x25\\x51\\x3a\\x83\\xa8\\x6a\\xb6\\x69\\x11\\x9d\\x7a\\x5b\\x15\\x60\\xb7\\x2e\\x2a\\xab\\x0f\\x90\\x4e\\x45\\xfd\\x31\\x45\\x6f\\x8e\\x7e\\x47\\x7d\\x72\\xbf\\x2b\\x55\\xa2\\x35\\x15\\xb3\\x0e\\x54\\x29\\xa2\\xd9\\xa9\\xcf\\x7a\\x82\\x7f\\xce\\x8a\\xea\\xd4\\x49\\xec\\xfe\\x36\\xf4\\x2d\\xd2\\x7a\\xce\\xcc\\xd4\\x68\\x9e\\xe8\\x46\\xcc\\x77\\x83\\xf9\\x57\\xf2\\x5e\\xcc\\x7a\\xe1\\xd4\\xae\\xe2\\x02\\x69\\xa3\\xd4\\x96\\xb8\\x53\\xca\\x65\\xfb\\x37\\xb3\\xa7\\xd5\\xdb\\xe4\\x79\\xdd\\x8e\\x5c\\x83\\x47\\x3f\\x69\\xb0\\x01\\xca\\x67\\x72\\x1b\\x13\\x32\\xcd\\xe0\\xd2\\xc3\\x08\\xdc\\x68\\xa9\\x13\\x42\\x51\\x4e\\xa6\\x3e\\xc7\\x03\\x76\\x38\\xec\\x3e\\xf7\\x53\\x98\\xaa\\xf5\\x4e\\xf1\\x9e\\x65\\x7a\\x27\\xa4\\xd2\\x7a\\xf5\\x10\\xf5\\x3e\\xb6\\x66\\x3d\\xcd\\xe9\\x9f\\xb9\\xd2\\x8c\\x4a\\x6e\\xd5\\x92\\xd9\\x9b\\xa4\\xc7\\xbb\\xd8\\x23\\x99\\xb1\\xf5\\xa7\\xc6\\xb0\\xdc\\xbb\\x4f\\x2d\\xb1\\x4c\\xf6\\x02\\x5f\\x87\\x60\\xda\\xf6\\xda\\xc1\\xe2\\x77\\xc0\\xc1\\x75\\x90\\x28\\xaf\\xf5\\x62\\xd9\\xf4\\xe7\\x0f\\xb5\\xc9\\x32\\x17\\x6a\\x25\\x5f\\x9c\\x1c\\x86\\x89\\x2b\\xa6\\x9a\\xb5\\xf2\\x0c\\xb4\\xcb\\xb8\\x62\\x73\\x93\\x2e\\x77\\xa5\\x48\\xc8\\xe7\\x55\\x92\\x72\\x7f\\x40\\xf2\\xc9\\x85\\xf8\\xde\\x26\\x7d\\x6b\\x88\\xc7\\x74\\xee\\x1f\\x44\\x73\\x70\\x35\\x74\\x1b\\xdf\\x98\\x69\\xdb\\x5c\\x15\\x96\\xae\\xe4\\x25\\x2a\\xd5\\xcc\\xe4\\x2e\\xea\\x4c\\xa8\\x0d\\xd7\\xb6\\xa6\\xe9\\xb9\\x75\\x44\\x55\\x30\\x57\\x56\\x3c\\xfd\\x6b\\x28\\xce\\x2b\\xf3\\xe7\\xa0\\xe9\\xf4\\xc8\\x92\\xeb\\x4d\\x23\\x4c\\x96\\xab\\x99\\xd2\\x75\\x4f\\x82\\x27\\x01\\x57\\x04\\xcc\\x3b\\xd3\\x0e\\xfc\\x08\\x13\\x4f\\xe1\\xf6\\x85\\x79\\xa4\\x9d\\xfb\\xe6\\x12\\x20\\xd2\\x5b\\x70\\x75\\x31\\x29\\x8e\\x19\\x3b\\xf4\\xdc\\x49\\xa5\\xb7\\x69\\x4b\\x98\\x2f\\xe5\\x6c\\x21\\x0f\\xe5\\x67\\xdd\\x7d\\xb3\\x55\\x96\\x4e\\x07\\xc5\\xa1\\x9c\\xa1\\x36\\xbf\\x03\\x16\\xf4\\x7a\\xf4\\x5c\\x88\\x71\\x02\\xa6\\x59\\x4a\\x37\\x7a\\x74\\xbe\\x13\\x03\\x53\\xc2\\x37\\xba\\xb0\\x44\\x98\\xa3\\x99\\x9b\\xca\\x01\\xe5\\x07\\x9a\\xe4\\xd7\\x5a\\x0d\\xb6\\xc8\\x97\\x5b\\x14\\xe2\\xa7\\xda\\x8e\\xdf\\xb8\\x6c\\xbf\\xd5\\x7f\\x0d\\x1d\\x3b\\x2b\\x2e\\x2f\\xfe\\x48\\xaf\\x69\\x53\\x4a\\x38\\x5c\\x5e\\x35\\x1c\\xe8\\xaa\\x8c\\x82\\x6a\\xbe\\x83\\xb0\\xae\\x24\\x32\\x69\\x32\\x75\\x5f\\xfa\\xeb\\xd7\\xe2\\xe6\\x4c\\x5d\\xf9\\x2b\\x61\\xe5\\xb1\\x00\\xd3\\x59\\x38\\x44\\x23\\xa6\\x25\\x72\\x85\\x26\\x9c\\xa1\\x66\\x3e\\xfa\\x64\\x37\\x4c\\x63\\x21\\x3e\\x9d\\xd9\\x36\\x7c\\x6e\\x13\\xab\\x25\\x2a\\x93\\xaa\\x5f\\xf3\\x3a\\x0c\\x4c\\x99\\x20\\xa5\\x85\\x9a\\x7f\\x6a\\xb9\\x7f\\x89\\x77\\xaf\\x12\\xfc\\x8d\\x7c\\x05\\x1d\\x93\\xa8\\xf9\\x21\\xe8\\x8c\\x05\\xb6\\x8b\\x5e\\xe0\\xb2\\xec\\x5a\\xa9\\x12\\xab\\x64\\xf0\\x22\\x45\\x95\\xb5\\x20\\x66\\x60\\x90\\x52\\x43\\xe0\\x02\\xad\\x40\\xd3\\x62\\xc4\\xce\\x76\\x6e\\x96\\x52\\x6d\\x9b\\x52\\x6d\\x94\\x12\\xfd\\x08\\xc5\\xea\\x32\\x45\\xea\\x31\\xda\\xa4\\x0b\\xcc\\x11\\x17\\x44\\x83\\xbc\\x2d\\x74\\x1d\\x3c\\x98\\x41\\x89\\xe6\\x60\\xd9\\xf2\\x64\\x19\\xc6\\xdc\\x6f\\xa4\\xe5\\x2a\\x42\\xad\\x16\\x7f\\xd0\\x12\\xfd\\x4d\\x8a\\xd5\\x6d\\x8a\\x9f\\x6e\\x30\\xd9\\x25\\x50\\x02\\x56\\x94\\x0d\\x6b\\x95\\x4c\\xf2\\x4c\\x7b\\xca\\x52\\x27\\xe8\\xb1\\xf6\\xeb\\x4d\\x0e\\xeb\\x87\\x9c\\x97\\xf5\\xf2\\xd5\\xb8\\x33\\xfe\\x96\\xc8\\x25\\x9a\\x4c\\x36\\xcb\\xef\\x2f\\x88\\x8d\\x11\\x5c\\x4b\\xfb\\x6f\\x00\\xc9\\x03\\x11\\x34\\x17\\x84\\x53\\x93\\xd4\\x0e\\xa3\\x94\\xfc\\x92\\x87\\xec\\x54\\x69\\xc5\\x95\\x62\\xba\\x68\\x56\\xb1\\xc2\\x91\\xdd\\x39\\xb3\\x0a\\xb1\\x8c\\x90\\xec\\x14\\x75\\x89\\x69\\x2a\\xb5\\x8c\\x89\\x89\\xdc\\xe2\\x69\\x20\\x46\\xf0\\x6f\\x06\\xe8\\xcb\\x00\\xb8\\xb3\\x5d\\xc6\\x52\\x68\\x1a\\xd1\\xb3\\x3f\\x29\\x2c\\x78\\x3a\\x93\\x98\\x28\\xb7\\x97\\x17\\xfd\\xda\\xf9\\x67\\x92\\xdc\\x11\\x75\\x70\\xbf\\x28\\x5c\\xe3\\xb4\\xa5\\x70\\x33\\x98\\x57\\x55\\xb2\\xd8\\xda\\x9b\\x10\\xcc\\x92\\xde\\x67\\x99\\xd4\\x17\\x52\\x7b\\x40\\xd0\\x6d\\xb9\\x99\\xff\\xd7\\x27\\xff\\xd7\\x3d\\x86\\xb3\\x46\\xb5\\x06\\xfa\\x8e\\x0e\\xf7\\x3f\\x0c\\x76\\x27\\x24\\xa8\\xc7\\x8c\\x62\\x0d\\xf5\\x41\\xc2\\x99\\x3e\\xbe\\x67\\x80\\xf8\\xbf\\x75\\x58\\x3f\\x7f\\x3a\\x31\\x2e\\xa0\\x62\\xb1\\xf3\\x53\\xd3\\x9b\\x82\\x4c\\x30\\x80\\x8a\\xfc\\xc4\\x0a\\xca\\x65\\x86\\x1d\\x60\\x82\\x24\\x83\\x24\\x20\\x8c\\x88\\xeb\\x43\\x05\\x0c\\xa7\\x60\\x56\\xfe\\x2f\\xcf\\x54\\x41\\x3f\\xb3\\xb7\\x77\\xbc\\xb7\\x9f\\x33\\x62\\x29\\xd5\\xdf\\x5f\\x01\\x5f\\x90\\x49\\xcf\\x58\\xdc\\xc8\\x50\\x5f\\x1f\\x30\\x80\\x76\\xef\\xed\\x7d\\xe0\\xf5\\x13\\x20\\xc2\\x1e\\x55\\x06\\x6e\\xb7\\xee\\xef\\x17\\xb0\\x70\\x7f\\xba\\xfb\\x36\\xd4\\x16\\x7d\\x4a\\x19\\xe9\\xef\\xfe\\x36\\x83\\x51\\xd5\\xd7\\xcf\\xbc\\x9e\\x19\\xed\\xed\\x35\\x1c\\x6a\\x07\\xa9\\x8c\\xfe\\x01\\xd8\\xf3\\x20\\x50\\xfd\\x2f\\x57\\x5f\\xdf\\xd4\\x4f\\x1f\\x0b\\x52\\x14\\x12\\xa9\\x15\\xec\\x1f\\x43\\xc0\\x2b\\x35\\x1c\\x94\\x5f\\x23\\x42\\x20\\x68\\xec\\x10\\x98\\xf1\\x2d\\xe3\\x22\\xc3\\x87\\x19\\x9c\\x69\\xa5\\x3e\\xe7\\xb0\\xb3\\x98\\xbf\\x94\\x80\\xb0\\x80\\xa4\\x80\\xac\\x80\\x84\\x80\\x8c\\x80\\x5e\\x9f\\x24\\x91\\xae\\x41\\x54\\x7e\\xfc\\x59\\xce\\x0e\\xf5\\xf7\\x77\\xe0\\xd4\\x1e\\xc4\\x99\\x56\\xef\\x4f\\x70\\x95\\xa9\\x5c\\xc2\\x5c\\xc2\\x3c\\x42\\x30\\x15\\x9b\\x1f\\x6a\\x53\\xd0\\xca\\x53\\x2f\\xdf\\xe7\\xdf\\x23\\xdf\\x88\\x9f\\x74\\x2f\\xd7\\xf7\\xcf\\xdf\\x3b\\x6a\\x88\\xd1\\x7c\\xec\\x0f\\xfa\\xdf\\x81\\xde\\x88\\xae\\x7c\\xab\\xb7\\xfa\\x03\\x81\\x87\\x88\\xe9\\x04\\xa9\\x3b\\x7c\\xce\\xe7\\xa4\\xe7\\x4a\\xa5\\xb0\\x61\\x90\\x91\\xd6\\x70\\xf6\\x34\\x91\\xd2\\xfc\\x01\\x3f\\x74\\x40\\x66\\xcf\\xa9\\x2b\\xad\\x2f\\x70\\x33\\xb5\\x37\\xb9\\x3b\\xff\\x7c\\x80\\x06\\x08\\xf6\\xff\\xca\\x37\\xdc\\x47\\x89\\x57\\x9c\\x67\\xac\\x77\\xbc\\x83\\x09\\x97\\x1c\\xa7\\x2c\\xb7\\x3c\\xc3\\x4e\\xd7\\x5c\\xe7\\x6c\\xf7\\x7c\\x83\\x0c\\x11\\x1d\\x26\\x2b\\x36\\x3d\\xc2\\x48\\x56\\x5d\\x66\\x6d\\x76\\x7d\\x42\\x88\\x96\\x9d\\xa6\\xad\\xb6\\xbd\\xc2\\xcf\\xd6\\xdd\\xe6\\xed\\xf6\\xf9\\x02\\xf1\\x17\\xe8\\x23\\xca\\x33\\xd8\\x43\\x8e\\x53\\x98\\x63\\xa8\\x73\\xb8\\xfd\\x11\\x06\\x67\\x73\\x99\\xb5\\x95\\x60\\x36\\xa9\\xd5\\x69\\x3e\\x56\\x5f\\x34\\xa1\\x56\\xad\\xdb\\x64\\x7a\\xf9\\xe6\\x82\\xc3\\x6a\\xbb\\xdd\\x6e\\xb2\\x11\\x7d\\xe9\\xe5\\x7a\\xbd\\x35\\x22\\x9f\\x18\\x9f\\xee\\xd1\\x62\\x68\\x20\\xf0\\x94\\x50\\x4f\\x1d\\x12\\xad\\x01\\x37\\x04\\x07\\x77\\x7a\\xa8\\xbf\\x72\\xb8\\x48\\x5f\\xb9\\xba\\x94\\x9a\\x09\\x65\\x78\\xbc\\xbc\\x2d\\x65\\x69\\x99\\xe5\\x73\\x72\\xb3\\x64\\xd5\\x62\\xab\\xd7\\x53\\x97\\xb0\\xb7\\x8b\\x1c\\x32\\x82\\x88\\xcf\\xeb\\x35\\x2d\\xef\\x71\\x8f\\x20\\x24\\x25\\xe7\\x64\\xa7\\xf6\\x1d\\x14\\xe6\\xad\\x54\\xc2\\x20\\x9d\\xc6\\xe4\\xc6\\x3a\\x30\\x67\\x14\\xcc\\x2f\\xa3\\xc2\\x0f\\x07\\xe0\\xb7\\x87\\x37\\x01\\x00\\x38\\x27\\x44\\x0d\\x90\\x01\\x14\\x01\\xf1\\x40\\x2e\\x10\\x0c\\x74\\x02\\x43\\xc0\\x18\\x30\\x04\\x6c\\x00\\x59\\x40\\x1e\\x50\\x07\\xf4\\xfc\\xcf\\xa7\\x00\\x89\\xc0\\x00\\x50\\x0e\\x54\\x01\\x6d\\x40\\x0c\\x20\\x0c\\x81\\xec\\xbe\\xae\\xa3\\xd0\\x21\\xab\\x25\\x80\\xb4\\x05\\x8f\\x08\\xe6\\x3f\\xb8\\x4a\\xc8\\xb1\\x8e\\xd6\\x90\\x16\\x3b\\xec\\x95\\x07\\xf1\\x63\\x70\\x29\\xca\\xd0\\x98\\x2b\\xf8\\x10\\xda\\x82\\xcd\\x31\\x2e\\xc2\\x01\\x84\\x80\\xdf\\x5f\\x18\\x7e\\xbd\\x06\\x2b\\x37\\xaf\\x50\\x3c\\x03\\x92\\x08\\x53\\xfc\\x8f\\x20\\x2f\\x11\\x0a\\x93\\x55\\x68\\x3e\\x33\\x17\\x57\\x83\\xd3\\x74\\x1a\\x93\\xd4\\x78\\x5c\\xb9\\xdb\\xa9\\xd5\\x8c\\xd2\\x31\\x49\\x6c\\xff\\x16\\xe4\\x14\\xeb\\xa7\\xac\\x78\\x53\\x03\\xf0\\x5c\\x78\\x7e\\x1e\\x15\\xd9\\x18\\x08\\xa5\\x69\\x6d\\xfa\\x30\\xee\\xf2\\xfe\\x05\\x0b\\x99\\x31\\x97\\xc8\\x65\\x09\\x1c\\xf2\\xd8\\x51\\x20\\x62\\xc9\\x70\\xf9\\x6b\\x36\\x96\\x7c\\xcd\\x7d\\xc0\\x84\\xbc\\x7f\\x10\\xdc\\x73\\xfd\\x6c\\x64\\x5e\\x78\\x58\\xe4\\xfc\\x71\\x4a\\x04\\x7e\\x94\\xe1\\x20\\x15\\x78\\x8d\\x35\\xd5\\x3e\\x81\\xf8\\x16\\xb0\\xb4\\x67\\x48\\x4f\\x5f\\x98\\x5a\\xbc\\x4f\\xcb\\x57\\xac\\xf8\\xd5\\xc2\\x7c\\x6c\\x39\\x51\\xdb\\x14\\x37\\xd7\\x19\\xc8\\x84\\xfc\\x3a\\xc6\\xcc\\xaf\\x64\\x65\\x03\\x9e\\xfe\\xb5\\x48\\xb4\\x74\\xef\\x80\\x26\\x15\\x3b\\x51\\x5c\\xc7\\x9a\\x9a\\x5a\\xff\\x45\\x82\\xda\\x17\\x3c\\xe6\\xac\\xa2\\xd4\\x34\\xf9\\xb2\\xde\\xa7\\x53\\xdf\\x70\\xa2\\x1f\\x48\\x39\\xe5\\x0f\\xb5\\x3a\\xa0\\xea\\x01\\x87\\x8f\\x80\\x48\\x86\\x36\\xdf\\x42\\x32\\x4e\\x0d\\x8f\\xfc\\x64\\x58\\x31\\x08\\x8d\\x9c\\x80\\x0b\\xc3\\x71\\xb8\\x39\\xf6\\x55\\xc8\\xff\\x2a\\x8e\\x32\\xdc\\x29\\x21\\xc9\\x75\\x10\\xd2\\x04\\x39\\x1c\\xb7\\xd2\\x9b\\xcb\\x2a\\xd7\\xf0\\xcd\\x9d\\x21\\x63\\x63\\x87\\xd7\\xff\\xa2\\x81\\xdb\\xe7\\xd6\\x83\\x25\\xc5\\xf9\\x32\\x1a\\xb2\\xfe\\x13\\xd9\\x90\\xcb\\x90\\xc2\\xef\\x87\\xb0\\xa0\\xa8\\xca\\x6b\\x08\\xf6\\x4c\\x17\\x35\\xe4\\x3f\\xc5\\xf7\\x19\\xfe\\x44\\xbf\\xc3\\xdb\\x18\\xdf\\x2c\\xe8\\xc6\\xab\\x55\\x61\\xee\\x94\\x26\\x17\\x04\\x06\\x55\\x68\\x4f\\x9f\\x8d\\xcd\\xbb\\x89\\xf0\\x0e\\xd5\\xb6\\xe9\\x08\\x41\\x37\\xbb\\x72\\xcb\\xd2\\x79\\x8a\\xa9\\x77\\xdd\\xe9\\xee\\x11\\xb0\\x6c\\x7c\\xd8\\x01\\x01\\xa3\\xbe\\x8c\\x99\\xf7\\x2f\\x49\\xff\\x37\\x6e\\xea\\x6a\\x66\\x73\\x04\\x70\\x21\\x4f\\x36\\xcf\\xef\\xfc\\xa6\\xb3\\xd0\\x8a\\x4e\\x4c\\xde\\x7a\\xf2\\x85\\x9e\\x3a\\x4d\\xe0\\x7f\\x1b\\x2b\\xc8\\xf7\\x37\\x80\\xe8\\xbe\\xde\\xd4\\xf5\\x43\\x1f\\x75\\x69\\x99\\xdd\\xe7\\x7a\\xd2\\xb8\\xbe\\x25\\x8d\\x5a\\xe6\\x99\\x55\\xc7\\x42\\x2a\\x23\\xbe\\x31\\xb1\\xb6\\x26\\x9c\\x30\\x14\\x26\\x20\\xbf\\x72\\x3c\\x1a\\x94\\x32\\xf7\\x37\\x61\\x2e\\x75\\xfd\\xef\\x50\\x42\\xe8\\xf0\\x0e\\x3f\\xce\\x04\\x0c\\x4c\\xe1\\xa1\\x22\\xe8\\x56\\xee\\x1c\\xde\\x5b\\x8a\\xab\\xb7\\xc5\\xf2\\xeb\\x36\\x6f\\x39\\x02\\xa9\\x90\\x6f\\x8e\\x67\\xd9\\xf9\\xc6\\xc6\\xd1\\xf7\\xee\\x1d\\x02\\x1b\\xa6\\xb4\\x42\\xa6\\x67\\xea\\xe7\\x8b\\x63\\x38\\x64\\x71\\x5f\\xc1\\x20\\x2a\\x19\\xe2\\x50\\xf1\\xc9\\x42\\xc9\\x02\\x92\\x55\\x1e\\xcb\\x64\\xc6\\x6f\\xac\\x79\\xe3\\x85\\x91\\xad\\x82\\x7c\\xe0\\xaf\\x30\\xea\\x6d\\xe3\\x0f\\x39\\xb1\\x29\\xc7\\xe5\\xb1\\x2b\\x85\\xf0\\xe3\\x01\\x49\\x7e\\x0a\\x84\\xdf\\xfe\\x5f\\x82\\xdd\\xba\\xc2\\x6c\\xe7\\x4a\\xd2\\xc4\\xd1\\xd7\\x67\\x74\\x5d\\x22\\xbb\\xf1\\xc6\\x98\\x44\\xce\\xcd\\x12\\x26\\x2b\\xf0\\x09\\xbf\\x33\\x2b\\x66\\x4b\\xab\\x28\\x2c\\x51\\xc4\\x21\\x54\\x68\\x04\\x54\\x38\\xf3\\xe3\\x63\\x4d\\x9b\\xd9\\xca\\x40\\xbd\\xe6\\x2a\\x1b\\x03\\xcc\\xc9\\xca\\x5b\\x55\\x28\\x14\\xb7\\x28\\xb4\\x71\\x9e\\xc2\\x24\\xd5\\xd7\\x5c\\x76\\xf9\\x0f\\x32\\xec\\xe6\\xe5\\x86\\xdc\\xe4\\x54\\xf7\\x5c\\xfe\\x4a\\xd0\\x1a\\xd4\\x66\\xca\\x4a\\x0f\\xca\\x7a\\xa2\\x24\\x81\\xab\\x70\\x6c\\x12\\xae\\x86\\x8a\\x94\\xcb\\xd3\\x10\\x95\\x73\\x06\\x50\\xf2\\xe4\\x4b\\xd8\\x6b\\x8c\\x15\\xa5\\x59\\x04\\x9b\\x06\\x4a\\x71\\xed\\xa9\\xf4\\x53\\x65\\xfc\\x4a\\x9f\\x82\\xab\\x79\\x82\\x2e\\xbb\\xfa\\x57\\x16\\x78\\x9e\\x31\\x70\\xf1\\x4c\\xbf\\xee\\xbe\\xb4\\xb3\\x2b\\xe6\\xf8\\x29\\xbd\\xf0\\xa8\\x17\\xf3\\xfd\\xb7\\x7d\\x97\\x6d\\xf3\\x1a\\x57\\xb0\\x10\\x0a\\x88\\xa6\\x8e\\x17\\x13\\x8b\\x37\\x27\\xeb\\x45\\x7e\\x2c\\x32\\x09\\x1a\\xd8\\x2b\\xc5\\xe2\\x0f\\xd3\\xbc\\x40\\x60\\xb7\\x25\\x64\\x5e\\xb8\\xa8\\x2c\\xc5\\x4c\\xbc\\xc8\\xfc\\xe5\\xab\\x4e\\x5c\\x5c\\xec\\x59\\xc3\\xc7\\x53\\x31\\x4a\\x60\\x09\\x74\\xee\\x89\\xe5\\x53\\xb1\\x21\\xf2\\x31\\xf6\\x89\\xd5\\x2f\\x1d\\x05\\xc5\\x94\\xa6\\x13\\x28\\x33\\xc5\\x98\\x63\\x65\\x93\\xb1\\x0c\\x14\\x15\\xf5\\x51\\x7a\\x67\\x93\\xb5\\x76\\x56\\xe5\\x77\\xb7\\xcc\\x18\\x55\\x95\\xb6\\xbc\\xcc\\x53\\xa3\\xa7\\x63\\xf1\\xb2\\x41\\xb1\\xc0\\xfe\\x31\\x6d\\xde\\x35\\x33\\x1d\\xd3\\xcc\\x7b\\xd3\\x4e\\xc7\\xfb\\xea\\xdf\\xb3\\x98\\x07\\x6d\\x14\\xbc\\xcc\\x6c\\x6b\\x39\\xe6\\xea\\xb9\\x24\\xed\\x86\\xd9\\xd8\\xce\\xb6\\xfb\\x70\\x25\\xc0\\x2f\\x4d\\xab\\xf6\\x24\\x5a\\xb8\\xf0\\xef\\x68\\xd8\\x61\\xfc\\x0a\\xd1\\x5a\\xd2\\x62\\xa2\\xb6\\x8f\\x3d\\x2a\\x6f\\x29\\x5a\\xe3\\x71\\x2f\\xf3\\x2c\\x99\\x01\\xd1\\xb3\\xaf\\xdb\\x81\\x79\\xbf\\x1c\\xda\\x79\\xc1\\xe3\\x7b\\x47\\xf8\\x50\\xe1\\x7c\\xa7\\x6a\\x35\\x55\\xfd\\xe0\\x5c\\xbb\\x3d\\xff\\xb7\\xeb\\x76\\xe6\\x74\\xb0\\x33\\x39\\x70\\x6f\\x68\\x97\\x42\\xf8\\xab\\x94\\x16\\xc2\\x21\\x2e\\x2b\\x21\\x43\\x6d\\xe9\\x2c\\x67\\x9d\\x0b\\xf5\\x87\\x02\\xce\\x0d\\xf8\\x2e\\x39\\xf5\\xbe\\xdc\\xaa\\xda\\xa8\\x0f\\x0c\\xcf\\x8b\\x12\\xe6\\x0d\\x5a\\xb6\\x10\\xcd\\xa7\\x1c\\x72\\xba\\xf7\\x5c\\x71\\xc4\\x28\\xc5\\xcb\\xe3\\x5b\\xca\\x67\\xcc\\x17\\x83\\xf5\\x7d\\xad\\xd2\\x00\\x2b\\x7c\\x05\\x79\\xc9\\x5b\\x4e\\xbe\\x96\\xea\\xc2\\xc4\\xca\\xfc\\xfb\\xa3\\xc3\\x4b\\x83\\xaa\\xaf\\x79\\x13\\x6f\\x98\\x6d\\x1f\\x01\\x3b\\x62\\xa5\\xd8\\xef\\x34\\xa7\\x72\\xcd\\xbb\\xb1\\x0d\\x71\\xb1\\xfa\\x34\\xe1\\x09\\xff\\x70\\x4b\\x8a\\x59\\x41\\xdb\\xf0\\xe4\\x0c\\xa4\\x82\\x43\\x93\\xe5\\xf0\\x52\\x50\\x70\\x95\\x2e\\x03\\x1a\\x58\\x59\\x2a\\x0d\\x77\\x4d\\x07\\x2d\\x7f\\x2d\\xaa\\x40\\xcb\\x71\\x64\\x1a\\x4c\\xf7\\xf0\\x7f\\x04\\x0a\\xcc\\x7d\\x4b\\x85\\x47\\xed\\xcc\\x10\\xb1\\xd7\\x2e\\xac\\x65\\x26\\xee\\xd5\\x60\\xb8\\xee\\x3a\\xe9\\x10\\xd0\\x71\\xf8\\xf3\\xe1\\xbb\\x15\\x5f\\xb1\\xaa\\x10\\x3b\\xbf\\x27\\x20\\x5c\\x9d\\x84\\x17\\x11\\x24\\xbb\\xb6\\x12\\xd1\\x7f\\xdf\\x89\\x31\\x47\\x60\\xca\\xa2\\x0b\\x87\\x26\\x9b\\x28\\x6e\\xf6\\x72\\x50\\x7c\\xfd\\x62\\x8f\\xfa\\xf8\\xf9\\x54\\x1c\\x2c\\x94\\x65\\x65\\x25\\x29\\x59\\x61\\x6e\\x23\\x73\\xcc\\xb9\\x0a\\xd6\\xb6\\xa8\\xa6\\xae\\xa4\\xa8\\x4e\\xf8\\xde\\x69\\xe1\\xe3\\x7e\\x90\\x34\\xd5\\xdd\\xbf\\x4e\\xc9\\x29\\xe6\\xee\\x70\\x7e\\xa1\\x75\\xa5\\xdd\\xf9\\x75\\xb3\\x41\\xc7\\x5d\\xff\\x59\\x77\\xac\\xab\\xc5\\x6e\\x75\\xf5\\xc8\\x66\\xed\\x7b\\xde\\xbb\\x01\\xbf\\xe1\\xea\\x2b\\x4d\\xc0\\x64\\xa3\\xd1\\xae\\x7f\\x54\\x14\\x21\\xc4\\xb3\\xbd\\xf9\\x7a\\xc3\\xd5\\x2d\\xc7\\x2b\\xf3\\x7d\\x3a\\x1b\\x3e\\x82\\x21\\x4d\\xc0\\xd7\\xe3\\xb4\\x33\\x3c\\xe2\\xd6\\xb3\\xb7\\xf6\\x1d\\xff\\x0e\\x06\\xda\\x61\\x3e\\x5e\\x46\\x20\\x2d\\x25\\x13\\x35\\x18\\x86\\x2b\\x4b\\x29\\xc1\\x56\\x1f\\x2e\\x4c\\x65\\xdf\\xe2\\xca\\xc8\\x26\\x42\\xda\\x1b\\x9a\\x6c\\x6b\\x6b\\x79\\xa2\\xa8\\x4c\\xc4\\x41\\xd5\\x48\\x6b\\x5f\\xba\\xba\\x96\\x67\\x68\\x9b\\x6f\\xf9\\x9c\\x2b\\x19\\x6d\\x4e\\xd1\\x9b\\x43\\x41\\x3b\\x05\\xbb\\x0b\\x1a\\x53\\x8e\\x91\\x92\\x8c\\xf8\\x57\\xc5\\x5e\\xfd\\x70\\xde\\x72\\xb7\\x16\\xec\\xc6\\x1c\\x51\\x58\\x2d\\x7c\\xbf\\xba\\x45\\x6a\\xcd\\x23\\x34\\x24\\x9d\\xd2\\x3d\\x41\\x49\\x39\\x0e\\xd6\\x2e\\x74\\xb9\\x28\\x61\\x7f\\xb9\\xfe\\xfe\\x17\\x32\\x8d\\x8e\\x7f\\x41\\xe6\\x26\\xb4\\x21\\x78\\x2c\\x12\\x42\\xd1\\xa1\\x7c\\x8d\\xb6\\xba\\xbc\\xe2\\x48\\xed\\x42\\xa0\\xa3\\xb3\\x7b\\x69\\x0e\\x46\\xce\\xde\\x3d\\x05\\x62\\x95\\xf6\\xeb\\x6c\\x20\\x95\\x2a\\x4f\\xe7\\x57\\xff\\xfd\\x0c\\x8e\\xeb\\x5e\\x6e\\xdf\\x00\\x19\\x4c\\xcd\\x4c\\xa4\\xc8\\xc9\\xea\\x5f\\xd5\\x6a\\xf7\\x97\\xbc\\xc3\\x61\\x28\\xcc\\x2c\\xb6\\x13\\x41\\x8b\\x9b\\x58\\x11\\x39\\xde\\x3a\\xf7\\xd1\\xfc\\xad\\x0e\\x4c\\xf8\\x74\\x6e\\x8b\\x9b\\x58\\x01\\xa5\\x12\\x04\\xce\\x34\\xa2\\xa9\\x53\\x37\\xc3\\xcb\\x03\\x21\\x4c\\x9e\\xdb\\xc1\\xfc\\xbc\\x08\\xb7\\x6b\\x5d\\x6e\\xf7\\xbb\\x7f\\x7d\\x42\\x50\\x32\\x69\\x8c\\xa1\\x7e\\xca\\xe7\\xde\\x67\\x50\\xa7\\x78\\xbd\\x5a\\x00\\x3b\\xa5\\x60\\x72\\xbc\\x39\\x86\\x64\\x08\\xb7\\xb0\\x76\\xdd\\x2a\\x5a\\xd3\\xaf\\xfd\\x33\\x61\\x7e\\x05\\xb5\\x90\\x7c\\x50\\xae\\x8b\\x37\\x50\\xd0\\x8c\\x36\\x14\\xf7\\x02\\xbf\\x82\\xa1\\xb8\\xf5\\x42\\x4e\\xf6\\xed\\x3f\\x65\\x32\\x9a\\x6c\\xee\\x55\\x89\\xfe\\x6c\\x83\\xa1\\x9a\\x05\\xcc\\xea\\xf7\\xe1\\x13\\xda\\x7e\\x38\\x4b\\x7b\\xaa\\x5c\\xc2\\xca\\x35\\xa0\\xdc\\x69\\x78\\x61\\x40\\x75\\x78\\xc3\\xae\\xd4\\x1a\\x72\\x93\\xec\\x9a\\x90\\xb1\\x98\\xa7\\x06\\x8b\\x19\\x81\\xfe\\xcf\\x61\\x56\\x3f\\x64\\xfd\\x04\\x65\\x49\\xaf\\xf9\\x75\\xfa\\x9b\\x88\\x1d\\x6d\\xf5\\x74\\x41\\x58\\xd8\\x70\\xf6\\x80\\xb3\\x52\\x8e\\x60\\x4f\\xbf\\x8c\\xb3\\x5d\\xa7\\x90\\x8a\\x6d\\x2b\\x55\\x44\\x9e\\xef\\x25\\x9d\\x0d\\x44\\xe9\\x2c\\xee\\x04\\x04\\xba\\x0a\\xc5\\xbf\\x08\\x9e\\xb2\\x2f\\x23\\xa1\\x06\\x35\\xd2\\xaf\\xf2\\x7c\\x4b\\xad\\xae\\xaf\\xbd\\x4b\\x3c\\x8f\\x32\\x78\\xa2\\x6e\\x5a\\x8b\\x6d\\xf7\\xe5\\xe2\\x6b\\x2f\\x79\\x98\\xd1\\xf9\\x54\\xb6\\x7f\\x8e\\xee\\xc2\\xb4\\xe8\\x3c\\x3f\\xd2\\x4a\\x30\\xe5\\xd4\\xd9\\xdc\\x53\\x79\\xdb\\x66\\x9e\\x14\\x26\\x78\\x7b\\x1e\\x98\\x16\\x0a\\xaf\\xba\\xba\\x3d\\x4c\\x9f\\xde\\x64\\x55\\x1a\\x79\\x4b\\xbe\\x65\\xfa\\x51\\x9b\\x56\\x9e\\x08\\xb4\\x1c\\x2d\\x8e\\xf1\\x8d\\x4c\\xef\\xbd\\xd9\\xa5\\xc7\\x0b\\x2c\\xa4\\x7d\\x52\\xf2\\x1e\\x44\\xe7\\x6c\\x92\\xf4\\x63\\xc6\\x1c\\xda\\xa6\\x7c\\x26\\xa7\\x40\\x71\\xfe\\x09\\x61\\x88\\x98\\xf8\\xfd\\xc2\\xfe\\x5a\\x7d\\xbb\\x37\\x7b\\x63\\xfb\\xd0\\x9c\\x78\\x90\\xed\\x67\\x7d\\x95\\xcc\\x47\\x42\\xcc\\x2b\\xcf\\x20\\xc2\\x1e\\xea\\x82\\x62\\xfe\\xc1\\x18\\x13\\xb1\\x78\\xa8\\xa0\\x21\\xff\\x87\\x96\\x6d\\x37\\x37\\x88\\xba\\x80\\x27\\x27\\x5e\\x4a\\xb5\\xdb\\xc1\\x5d\\x25\\xec\\x23\\xf1\\x2b\\xdc\\x3e\\x3a\\xa9\\x1a\\xa5\\xbc\\x3a\\x77\\x45\\x66\\x85\\xeb\\x04\\x91\\xeb\\xf1\\xef\\x23\\xc2\\xca\\x54\\xab\\x60\\xe9\\xa0\\xd5\\x84\\xfd\\x65\\xe7\\x3f\\xab\\x08\\x31\\x66\\xb3\\xfb\\x26\\xae\\x8e\\x24\\xcd\\x14\\x79\\x4d\\x4c\\x59\\x62\\x7b\\x0f\\x43\\xda\\xc4\\x94\\x9e\\xc7\\x6d\\x1a\\xd2\\xbb\\x84\\xc6\\x94\\xaf\\xbb\\x84\\xfa\\x6e\\x1b\\xca\\xcf\\x00\\xdd\\xbd\\xc2\\x94\\xd9\\x9a\\xea\\x6c\\x07\\x91\\x0b\\x1d\\xef\\x6a\\x95\\x1e\\xde\\xa7\\x6d\\x74\\xeb\\xad\\xb5\\x7e\\x75\\x07\\x92\\x93\\x44\\xb4\\x78\\x39\\xfe\\xa1\\x7c\\x41\\x69\\xf8\\xf2\\x7e\\xe4\\x29\\xf0\\xf7\\x41\\x88\\xdc\\x8c\\x20\\x53\\x3c\\x13\\x94\\x01\\xc3\\xba\\x9d\\x7f\\x0c\\x1b\\x16\\x65\\xe4\\x1d\\xa8\\x97\\xfa\\x1b\\x06\\x05\\x43\\x4b\\x6f\\x1d\\x74\\x74\\x5b\\x05\\xb4\\x5c\\x84\\x10\\x2d\\xda\\x42\\x74\\x73\\x04\\xed\\x6f\\xdb\\x52\\x8f\\x7a\\x23\\x73\\xdc\\x5d\\xa7\\x30\\x67\\x21\\x5e\\x70\\xa4\\xe7\\x45\\xd8\\xa7\\x16\\xb3\\xf1\\x98\\x0c\\x34\\x16\\x08\\x56\\x8b\\xf3\\x85\\xe9\\x82\\x0a\\x82\\x0a\\xf5\\xc8\\x38\\xd0\\xdc\\x92\\x37\\xb1\\xe1\\xbf\\xff\\xf1\\x3b\\xac\\x47\\xe7\\xd2\\x36\\xe7\\x5f\\xc1\\x89\\x54\\xb1\\x7e\\x4c\\x5a\\x86\\xd4\\xac\\x55\\xba\\x43\\x07\\x95\\xf3\\xcb\\x8c\\x43\\xb0\\xfe\\x9e\\xf2\\xa3\\xcb\\x45\\xa3\\x14\\x3a\\x7d\\x13\\x6d\\x97\\xcd\\xd9\\xfa\\xad\\x8d\\x5c\\x14\\x73\\x96\\x22\\xfa\\xa8\\xf9\\x06\\x59\\x22\\xd7\\x54\\xbd\\x60\\xfb\\x0f\\x35\\xd7\\xc5\\x81\\xab\\xd1\\x36\\x62\\x7a\\xe9\\x98\\x79\\x1b\\xde\\x77\\xf5\\xb3\\x8f\\xfc\\xa1\\xe5\\xd5\\x05\\x26\\x58\\xba\\x8f\\x82\\xb9\\xb7\\x9a\\xaa\\xf7\\xdc\\x5c\\xd9\\xba\\x9f\\xa0\\x5c\\x52\\x20\\x6a\\x36\\x1c\\x72\\xce\\x7f\\x05\\x62\\xa3\\x4f\\x3d\\xa3\\x26\\xd6\\x87\\xce\\xd8\\x76\\x2d\\xc0\\xb7\\x03\\xcc\\x47\\xe6\\xd7\\xdf\\x3d\\xbb\\x89\\xf8\\xca\\xd8\\x17\\x10\\x5d\\xd0\\x36\\xd1\\xa0\\xa6\\x5d\\xc4\\x1e\\xf0\\x75\\x7c\\x2e\\x6c\\x44\\x82\\xe1\\x1e\\xb7\\x2c\\x4d\\xca\\xb7\\x34\\xbc\\x02\\x24\\x7a\\xaf\\x58\\x55\\x7b\\xb5\\x2f\\x1e\\x3e\\x78\\xa5\\x14\\xfa\\xab\\xb9\\xd5\\xe8\\x8c\\xc3\\x71\\xa3\\x6b\\x86\\x0e\\x33\\xd6\\x51\\x88\\x14\\x22\\xb9\\x8e\\xf8\\x52\\x3c\\xbb\\xc2\\x50\\x07\\x89\\xf0\\x88\\xe9\\x23\\xc6\\x85\\x6d\\x6a\\xa6\\xbd\\x61\\x8e\\x10\\xe7\\xc5\\x0b\\xc5\\xa0\\x39\\x1d\\x87\\xb6\\x01\\x22\\x37\\x48\\xed\\x9e\\x5a\\xfe\\x5d\\x9c\\x16\\xd5\\xbd\\x78\\x9b\\xa7\\x3a\\x62\\x02\\xdc\\xf7\\x83\\x40\\xc4\\x68\\xb6\\x6a\\xcd\\x7a\\xe3\\xd7\\x71\\x52\\x29\\x55\\x68\\xf4\\x07\\x45\\x98\\xa3\\xc0\\xaf\\xee\\xaf\\xae\\xaf\\xd2\\xed\\x42\\x5f\\xfe\\x89\\xef\\xc7\\xfe\\x89\\x77\\xbd\\xc2\\x0e\\x5d\\xf7\\xd3\\x22\\x4c\\xa4\\xe8\\xae\\xda\\xd6\\x11\\x10\\x04\\x54\\x4d\\x23\\x94\\x71\\x4a\\x10\\x35\\x61\\x08\\xb5\\xaf\\x2f\\xc2\\x75\\xaa\\x48\\x6a\\x14\\x21\\x11\\x65\\x94\\xb8\\x5d\\x14\\x88\\x80\\x0c\\xf8\\x42\\x0c\\xb0\\xb2\\xe7\\xf9\\x1c\\xec\\x22\\x82\\x15\\x57\\x5e\\x5e\\xe9\\x37\\xac\\x1a\\x0e\\x7c\\xeb\\x02\\x14\\x3f\\x96\\x04\\x6d\\xa1\\x7c\\x0a\\xe8\\x32\\x3c\\x42\\x91\\x90\\xe5\\xf9\\x5d\\xc2\\x28\\x1d\\x52\\x1a\\xd4\\x36\\xaa\\x08\\x1c\\x4e\\x5a\\xd3\\x93\\x5e\\xfc\\x79\\xe3\\xd6\\xa8\\x8b\\x3e\\xba\\x51\\x59\\x7d\\x86\\x98\\xc8\\xbf\\xd9\\x68\\xad\\x46\\xac\\x7f\\xce\\xc6\\xe4\\x37\\x15\\xe6\\x6c\\x8d\\xf6\\xa7\\x11\\xdc\\x15\\x94\\x88\\x2d\\xd3\\x51\\x92\\xc2\\xc8\\xfb\\xd1\\x84\\x7e\\xec\\x29\\x4e\\x4b\\x7f\\xf6\\x86\\x34\\x31\\xd3\\x8e\\xff\\x09\\x3e\\x90\\x51\\x7e\\x3b\\x6a\\x2a\\x66\\x89\\x78\\xd0\\x02\\x37\\xd8\\x19\\x33\\x78\\x48\\x18\\x2a\\xc0\\x94\\xd9\\x6a\\xbc\\x82\\x18\\x6b\\x8f\\x89\\xf7\\x35\\xbf\\xf7\\xd1\\x2c\\x8b\\x61\\xb1\\xd1\\xa0\\x6d\\x5d\\xe1\\x61\\xb5\\x3c\\x1a\\xae\\xaa\\xe0\\x88\\xd1\\xf1\\x38\\x83\\xba\\x05\\xef\\x55\\x94\\xbd\\x22\\x9c\\x43\\x80\\x8e\\xf8\\xc1\\x4f\\xef\\xd2\\x6b\\x92\\x06\\x20\\xcf\\x59\\x83\\x4f\\xc0\\x1e\\x77\\xae\\xb9\\x4f\\x67\\xd8\\x56\\x99\\xdb\\x73\\x72\\x1a\\x07\\x52\\x3a\\xff\\xd2\\xa0\\x8a\\xad\\x2c\\xfd\\x98\\xe3\\xbe\\xf9\\xab\\xec\\xaf\\x01\\xa6\\xc9\\x30\\xab\\x21\\x00\\x4b\\x84\\x08\\xa8\\xde\\xa5\\x2a\\xec\\x01\\xbf\\xb9\\xfa\\xcd\\x60\\xac\\xef\\x3d\\x95\\x5c\\x05\\xa0\\x8a\\x41\\xf0\\xf4\\xe1\\xcd\\x0b\\xd9\\x51\\x14\\xb2\\x60\\x52\\xa1\\xca\\x57\\xaa\\x4c\\xfe\\x89\\x68\\xae\\x43\\xa0\\xd7\\x0a\\xad\\x82\\x80\\x35\\x35\\x0e\\xc6\\x3e\\x9a\\x32\\xc3\\x91\\xc4\\xde\\xa8\\x85\\xbf\\x2f\\x53\\xb7\\x7a\\x5c\\xf6\\xa3\\x77\\xb8\\xd1\\x65\\x79\\x2c\\xc0\\xaf\\x6c\\x7f\\x05\\xe8\\x73\\xba\\x9e\\xdc\\xcc\\x30\\x99\\xd1\\x66\\x95\\xe5\\xb8\\x1f\\xb8\\x7c\\x82\\x77\\x29\\x74\\xbb\\x0e\\x85\\x6b\\xa5\\xd0\\x6d\\xd7\\x3f\\xbc\\x65\\xa4\\x50\\xe7\\x90\\xf2\\x7d\\x5c\\x42\\xd5\\xe8\\xa9\\x12\\x54\\xba\\xbb\\x4e\\x9f\\xeb\\xf9\\xf2\\xff\\x44\\x5c\\x01\\xd1\\xa1\\x03\\xd5\\xad\\x8b\\x53\\x66\\x0c\\x17\\xae\\x72\\xb0\\xb5\\x20\\x74\\xad\\xd8\\xad\\x94\\x27\\xa5\\xb7\\x1f\\x22\\x53\\x81\\x04\\x5b\\x46\\x57\\xae\\x12\\x53\\x16\\x83\\x4e\\x53\\x47\\x17\\x52\\x80\\x45\\x45\\xc7\\xc0\\x42\\x32\\x35\\x29\\x2e\\x47\\x2f\\x0a\\x09\\x28\\xee\\xca\\x02\\xb0\\x2c\\x84\\xd1\\xd1\\x58\\x82\\x4f\\x5d\\xb1\\x55\\x7b\\xa7\\xc1\\xba\\x41\\xc9\\xf3\\x17\\xb5\\xc9\\xa9\\x3d\\x8e\\x67\\xf3\\x56\\x1e\\xbe\\x9c\\x73\\x2e\\xf2\\x06\\xaa\\x91\\x7d\\x39\\xd6\\x5c\\x22\\xaa\\xe7\\x0d\\xb4\\x82\\x74\\x98\\x07\\xcd\\x1b\\xe1\\x9f\\x92\\xa1\\x96\\x93\\xc4\\x74\\x49\\xe7\\x32\\xc1\\xa3\\x1c\\x51\\x98\\x1d\\x89\\xa2\\xb8\\x15\\x95\\xbc\\x25\\xa3\\x27\\x14\\xe7\\x76\\x5b\\x8e\\x5b\\xfd\\xb8\\x7d\\xca\\xc2\\x34\\xd6\\xcb\\xc4\\xce\\x74\\xca\\x48\\x8a\\x04\\x51\\xf9\\xd7\\x7e\\xd9\\x30\\x5e\\x3a\\x2c\\x68\\xd0\\x8c\\x15\\x6a\\x4a\\x5a\\x2e\\x11\\xe5\\x17\\x15\\x2b\\xe3\\x09\\x1a\\xb5\\xaf\\x10\\x8f\\xd0\\xf2\\xe3\\xac\\x17\\x16\\xb7\\x2b\\xaf\\xf8\\xac\\x56\\x96\\x9b\\x7d\\x6f\\xeb\\x2e\\x7c\\xb7\\xa2\\x4c\\xaf\\x9f\\x77\\x51\\xe0\\xcb\\x89\\xa0\\xf9\\x1c\\xd7\\x8c\\xeb\\xa9\\xfc\\x06\\x8b\\x10\\x0d\\x3d\\xab\\xca\\x57\\x48\\x19\\x99\\x80\\xd7\\x2a\\xd7\\x90\\x8f\\x3c\\x16\\x5e\\x94\\x16\\x09\\x8c\\xf1\\x1f\\xa4\\xe0\\xdf\\xff\\x5d\\x67\\x2c\\xaa\\x19\\x87\\x5e\\x6a\\x41\\xfb\\x08\\x10\\x47\\xf0\\x58\\xe8\\x98\\xb5\\xcc\\xc0\\x66\\x74\\x1b\\x67\\x20\\xe9\\x70\\xdc\\x1f\\xa9\\x54\\x60\\x6a\\xb3\\x91\\x7e\\xe6\\xed\\xf5\\xff\\xad\\x6b\\xa9\\xa8\\x30\\x45\\xe4\\x7c\\xb8\\x44\\xd4\\xe3\\x7e\\xe6\\xea\\x12\\xc8\\x6e\\x51\\xee\\x32\\x73\\x19\\xe0\\x00\\x43\\x67\\xb8\\xa6\\xf0\\x76\\x14\\x28\\x22\\x3c\\xe9\\xf1\\x75\\x50\\xfe\\xfe\\xa4\\x2f\\xd9\\x63\\xec\\x55\\xc1\\xdb\\xc8\\x28\\x32\\x26\\x0b\\x2b\\x26\\x6e\\x76\\x3c\\x70\\x84\\x6e\\xb6\\x08\\xec\\xf8\\x8d\\x37\\xc5\\xce\\x76\\xf5\\x81\\x20\\x4d\\x62\\x92\\x27\\x0e\\x53\\xa6\\x41\\x2b\\x1c\\x7e\\x04\\xf6\\x2f\\xb1\\xcf\\x8a\\x30\\x62\\xcd\\xfa\\xca\\x99\\x59\\xe4\\x4f\\xb8\\x29\\x03\\x31\\x89\\x88\\xf9\\xf2\\xdb\\xaf\\x72\\xad\\xbe\\x2c\\x0b\\xb7\\x8a\\xe4\\x50\\x4a\\x8a\\x72\\x8e\\x7e\\x61\\x4c\\x5b\\xd9\\x9e\\x36\\x18\\x6b\\x04\\x0e\\xa8\\x66\\x32\\x68\\x46\\x48\\x94\\x5b\\x12\\xb0\\xce\\x48\\xd7\\x57\\xd7\\x9b\\x90\\xb3\\x3b\\xd9\\x05\\xa8\\xed\\x77\\xc5\\xeb\\xbf\\x23\\xdd\\x6f\\x5b\\x04\\x76\\x04\\x73\\x3d\\x5e\\x36\\xc7\\xfb\\x38\\xc9\\x3b\\x1e\\x13\\x2a\\x56\\x11\\xc1\\xb6\\x84\\x0b\\xf3\\xa7\\x87\\x10\\x69\\x19\\x8c\\x77\\xd1\\x04\\x77\\x6e\\xa7\\x45\\xdf\\x6f\\x29\\x74\\x8f\\x35\\xe6\\x66\\x96\\xbc\\x0f\\x73\\x5a\\x19\\xd7\\xab\\x5e\\x0a\\xbe\\xc3\\x98\\x42\\xa9\\xb8\\x8a\\x61\\x81\\x9b\\xfc\\xf9\\x18\\x8d\\x97\\x53\\x06\\x64\\x15\\x71\\x32\\x65\\x67\\x70\\x96\\x14\\x9b\\x02\\x67\\x4d\\xef\\xab\\x8a\\x47\\x98\\x1a\\xe5\\x8a\\xca\\x1b\\x3e\\x09\\xa6\\x4f\\x78\\x52\\x0a\\x32\\xef\\xe7\\x26\\x0d\\x3f\\x70\\x31\\x61\\xd9\\x45\\x31\\x32\\xfe\\xd6\\xd9\\x32\\x69\\x14\\xdc\\x10\\x29\\xaa\\x25\\x54\\xa9\\xe8\\x2f\\x8d\\x9a\\x46\\x2c\\xd9\\xeb\\xfc\\x9e\\x0b\\x0d\\x5e\\xb3\\xd2\\xbe\\x44\\x12\\x60\\xc6\\x5c\\x36\\x51\\x9c\\x41\\xba\\x15\\xfa\\xe4\\x9b\\x49\\x6a\\xc3\\xd6\\x39\\xec\\xe9\\xb6\\xba\\xb3\\xd9\\x2a\\x27\\x98\\x6d\\x78\\x10\\x6b\\xb1\\x29\\x28\\x08\\xd2\\x56\\xff\\x69\\x9e\\x20\\xc1\\x9f\\x23\\x9d\\x1b\\x93\\x83\\x16\\x4f\\xa8\\x21\\x9d\\xcf\\x5b\\x28\\xaf\\xba\\xe9\\x5c\\x09\\x0e\\x93\\x04\\xf9\\x47\\x35\\x57\\x9e\\xa2\\x5f\\x7e\\xea\\x77\\x22\\x02\\x5a\\xbc\\x42\\x6a\\x6e\\x60\\xdc\\xd5\\xbc\\xa3\\x3f\\xaf\\x2d\\xbb\\x73\\x87\\x32\\x54\\x36\\xed\\xdf\\x83\\xbb\\xdc\\x23\\x60\\xde\\x25\\x20\\x66\\x3c\\x02\\xed\\x19\\xbf\\xe2\\x64\\x02\\xa6\\x90\\xf1\\x47\\x60\\xe1\\xe2\\x26\\x38\\x89\\x74\\x59\\x7e\\x51\\xf8\\x8d\\xe6\\xe9\\x32\\xae\\xe3\\x3f\\xe7\\x03\\x06\\x22\\xf9\\xb3\\xf8\\xdf\\xc9\\xd2\\x5d\\x12\\x6e\\x34\\x99\\x1e\\x0b\\x7c\\x7a\\x5b\\xdf\\x1b\\xfb\\x69\\xb0\\x6c\\xa7\\x23\\xdb\\x3c\\xf9\\x39\\xe6\\x9b\\x9d\\xf6\\x7d\\xc9\\x97\\x6c\\xd4\\xad\\x25\\xd6\\xa7\\x8d\\x14\\x13\\xc9\\x72\\xd9\\xed\\x41\\xd5\\x9a\\xb5\\x35\\x46\\xaf\\xd5\\x1c\\xef\\xdf\\x6f\\x2b\\x9f\\x4e\\xae\\x49\\x6e\\x9b\\x2d\\xbb\\x37\\xef\\xd7\\x3d\\xde\\x0b\\xe9\\x4d\\xb0\\x47\\x76\\x6b\\xbf\\x12\\xf5\\x9c\\x36\\x6c\\x56\\x26\\xd5\\x3b\\xe2\\xef\\xcf\\x87\\xfc\\x10\\xd7\\x27\\x6b\\x9a\\x5b\\xb7\\x8d\\xd7\\xc1\\xa9\\xcf\\x42\\x1e\\xb4\\x33\\x4e\\x98\\x95\\xcd\\x99\\x7a\\x4c\\x19\\xd0\\xcb\\x21\\xdd\\xa1\\x41\\x5e\\x59\\x60\\x07\\x23\\x8f\\xa4\\xc3\\x72\\x87\\xb4\\xed\\x94\\x06\\x9d\\x21\\xdb\\x0d\\xc1\\x38\\x39\\x88\\x2d\\x39\\x61\\x08\\x58\\x52\\x6e\\x6d\\xeb\\xf2\\x51\\x20\\x39\\x6b\\xa9\\x40\\x64\\xa4\\xf4\\x17\\x92\\x96\\x0f\\x15\\x8f\\x84\\x73\\xfb\\xac\\x4f\\xb6\\x38\\x11\\xee\\x86\\x16\\x3b\\xaf\\xad\\x2c\\x97\\x7b\\xde\\x46\\x62\\xdf\\x3d\\x0f\\x5d\\xb5\\x9c\\x6f\\xf1\\xe4\\x9c\\xd7\\xed\\xd7\\xbc\\xbe\\x2d\\xb4\\x9d\\x06\\x26\\xb9\\xee\\xd9\\x2a\\xd3\\xea\\x34\\xfe\\x3c\\xff\\x96\\x59\\xe9\\x99\\xf7\\x05\\xa4\\xee\\xa8\\x3e\\xb3\\x32\\x37\\x65\\x3c\\xb0\\x08\\xbc\\x67\\x9f\\x37\\xef\\x4b\\x4f\\x09\\xdc\\xae\\xf1\\x9c\\xb6\\xfb\\x53\\x74\\xbd\\xb0\\x0c\\x4c\\x58\\xc3\\x16\\xd3\\x86\\x44\\x29\\x33\\xaa\\x50\\x4c\\xd5\\x73\\x65\\x0c\\x0d\\xca\\x85\\x61\\xf2\\x68\\x21\\x29\\x26\\xa8\\x51\\xad\\xfa\\x19\\x91\\xd3\\x5c\\xe6\\xa1\\x9f\\xc2\\xd8\\xc1\\x6c\\xd0\\xfc\\xa5\\xc1\\x9d\\x4e\\x2d\\x5b\\xb3\\xc3\\xd4\\x25\\xa0\\x40\\x3d\\xb5\\x99\\x0e\\x4c\\xac\\x05\\x54\\x78\\xf3\\x15\\x6d\\xe7\\xc2\\x88\\x30\\x68\\x6a\\xc7\\x69\\x22\\x69\\xb8\\xbe\\xd2\\xa1\\x21\\xd5\\x8e\\x87\\x5b\\xc7\\x48\\x75\\xe0\\x31\\x8b\\xfe\\x69\\x33\\x2a\\x66\\x92\\xfb\\x80\\xa8\\x91\\x10\\x96\\x79\\x93\\x35\\xcc\\xd8\\xdd\\x65\\x51\\xa9\\x8e\\x7c\\x71\\x1a\\x06\\x21\\x15\\x5e\\xdb\\x16\\xb2\\xe1\\x5b\\x3a\\x4e\\x64\\xd7\\x20\\x3a\\xbc\\xd9\\x14\\x67\\x0c\\xc6\\x0c\\x16\\xc0\\x15\\x4b\\xdb\\x16\\x49\\xe0\\xfe\\x0a\\x13\\x30\\x06\\xfc\\x36\\x82\\xfa\\x67\\x4c\\xeb\\xae\\xc7\\x30\\x87\\xba\\x9d\\x17\\x84\\x10\\xe7\\xde\\x09\\x3c\\x43\\xcf\\x77\\xd1\\xed\\x67\\x66\\x5e\\x79\\xce\\x2d\\x23\\xce\\x2d\\xa5\\x22\\xf6\\xa6\\xa9\\x82\\xa4\\x44\\x23\\x43\\x2f\\xd1\\xc4\\xa2\\xfe\\x5c\\xea\\x85\\x5f\\x7c\\x7e\\xa9\\x7c\\x36\\x47\\xd9\\xf7\\xe0\\xd7\\x86\\x1d\\x31\\xfa\\x8c\\x91\\xaa\\x39\\x5d\\x4b\\x4d\\x34\\x0f\\x55\\x21\\x96\\x15\\x3d\\xc6\\xa5\\x58\\x7b\\x1b\\x83\\xf4\\xb0\\x0b\\x69\\x56\\xe3\\x64\\xd6\\x20\\x71\\xde\\x85\\x70\\xf4\\x67\\x2e\\x6f\\x52\\x33\\x73\\x6b\\x5b\\x10\\xe6\\xa9\\xc4\\xa0\\x34\\x51\\xa8\\x9a\\x06\\x14\\x9a\\x14\\xec\\x26\\xe3\\x85\\xdc\\x22\\xef\\x90\\x52\\xec\\x66\\x06\\x0e\\xda\\xb2\\xf2\\x22\\x65\\xf1\\xf8\\x69\\xe0\\xf0\\x69\\x3a\\xe9\\x98\\xf9\\x12\\x57\\x65\\x33\\x3b\\xbc\\x5c\\x94\\x15\\x60\\x5e\\x17\\xf8\\xb7\\x14\\xfd\\xe0\\xd2\\xe5\\x58\\xb4\\x9f\\x88\\xd3\\xc8\\xa2\\xc3\\xf2\\x3e\\xae\\x9c\\xa8\\xd1\\x73\\x3f\\x6d\\xe4\\x40\\x1d\\xc9\\x72\\x3f\\xc9\\x72\\x43\\xf2\\x75\\x7a\\xb0\\xbd\\xb3\\x2a\\x96\\xd1\\xcf\\x7a\\x24\\x9e\\x71\\xc8\\xaa\\x28\\x0e\\x69\\xd2\\xb6\\xef\\xbf\\x55\\xaf\\x60\\x62\\x29\\xcb\\x0a\\x80\\x3f\\x34\\x45\\x89\\xa5\\x5c\\xe4\\x15\\x98\\x32\\xb3\\x55\\x8c\\x08\\x48\\x0f\\xb5\\x75\\xf7\\x6d\\x26\\x90\\xec\\xdb\\xa3\\x35\\xe9\\xef\\x10\\x78\\x8a\\xe5\\xae\\x0d\\x85\\xfa\\x69\\x78\\x9d\\x74\\xd0\\xa0\\x70\\x51\\x54\\xca\\xa3\\x6d\\x39\\xf3\\x49\\x68\\x12\\x5d\\x96\\xf6\\x2e\\xe1\\x6d\\xaa\\x1a\\x93\\xfd\\x7b\\xdc\\x7c\\x3f\\xb4\\xac\\x4a\\x71\\x53\\xa0\\x11\\x4c\\x9f\\x30\\xf7\\xa1\\x59\\x53\\xa4\\xa8\\xb4\\xb3\\x5c\\xc9\\x46\\x2d\\xf1\\xbb\\x5e\\x8b\\x09\\x93\\x50\\xb0\\xf2\\xb0\\x57\\x2c\\x09\\xb9\\x4a\\x0e\\x0f\\xd1\\xee\\x05\\x8d\\x05\\x4c\\xe1\\x80\\xcc\\xff\\xcf\\xaf\\xf1\\xd2\\x9e\\xd4\\x19\\x0d\\xd0\\xfd\\x58\\x8a\\xc0\\xda\\xdf\\x0d\\x5d\\x83\\x3d\\x84\\xb1\\x00\\xee\\xfb\\x1e\\xce\\x6b\\xd0\\x1d\\xa2\\x24\\xe7\\x8a\\x47\\xea\\x70\\xea\\x41\\x9e\\xdd\\xfc\\xf9\\x09\\x68\\xbb\\x42\\x9d\\xcf\\xdb\\x98\\xc7\\xc2\\x47\\x1e\\xd7\\xf0\\x56\\xe7\\xf8\\xe5\\xf7\\xc8\\x80\\x12\\x26\\x62\\xf2\\xbf\\xda\\x26\\x31\\xf7\\x3e\\x1d\\x8c\\x94\\x6e\\x3d\\xb5\\x47\\xb6\\xc7\\xa4\\x32\\x5b\\xce\\x48\\x57\\xbc\\xa6\\x12\\x33\\x89\\x9e\\x1e\\xe9\\xc5\\x94\\xd3\\x83\\x60\\x8d\\x27\\xde\\x40\\x4f\\xb9\\x73\\xf1\\x32\\xa4\\xc9\\xc8\\x7f\\x5b\\x9d\\x91\\x3e\\x92\\x04\\xe8\\x9b\\xed\\x42\\x3d\\x2f\\xa1\\x5f\\xc3\\x43\\xc7\\x88\\x1d\\xbb\\x29\\x2b\\xa5\\xe2\\xc4\\x2c\\x59\\x45\\xab\\x4c\\x6a\\x7a\\x1f\\x4b\\x4a\\xce\\x44\\x5b\\x45\\x7f\\x1f\\x58\\xde\\x60\\xbc\\xed\\x45\\xf6\\x1e\\xee\\x08\\x3f\\xa3\\xa6\\x35\\xbc\\xd4\\x4a\\x74\\xa3\\xa9\\x53\\x62\\x4f\\xc5\\x39\\xc2\\x1f\\x6e\\x51\\x0c\\xc7\\xc1\\xf1\\x8c\\x20\\x63\\xca\\x89\\x77\\x1a\\xca\\x47\\x9b\\xa4\\x03\\xad\\x89\\xd0\\x84\\x13\\x22\\x33\\xaf\\xa0\\x19\\x09\\x7e\\x64\\xd2\\xf0\\x47\\xc2\\x83\\xa5\\xed\\x92\\xa0\\x85\\x83\\xcc\\xa1\\x22\\xc1\\x76\\x09\\xbe\\x38\\xe4\\x7d\\xcc\\x86\\xaf\\x3e\\xa9\\xd4\\x2c\\x5c\\xfb\\x26\\xcb\\x9c\\xdd\\x1a\\x38\\x67\\x77\\x2b\\x8e\\x62\\xb0\\xf6\\x4d\\x5b\\x00\\x3c\\x4f\\x68\\xf7\\xb0\\x9f\\xbb\\x58\\xb2\\xcc\\x24\\x42\\x94\\xe2\\x02\\xc5\\x93\\x77\\x0a\\x30\\x6f\\x6b\\x55\\xa9\\x68\\x70\\xf4\\xe5\\x25\\xf9\\x94\\xd0\\xfe\\x71\\xfd\\x2f\\xab\\x08\\xd7\\xf5\\x0a\\xe8\\xa9\\x7e\\x79\\xb0\\xbb\\xc2\\xae\\xe5\\x01\\xe3\\x69\\xe6\\x5f\\xca\\x47\\x4a\\xf9\\xe0\\xe0\\x3a\\x59\\x31\\x8a\\x00\\x46\\x09\\xb8\\xa0\\x62\\x43\\x27\\x1d\\x82\\xfd\\x2b\\x7e\\x69\\x14\\x01\\xf3\\x6c\\x81\\x9e\\xd2\\x5e\\x71\\x45\\xb2\\xcd\\xbc\\x51\\xce\\x59\\xc7\\x49\\xe8\\xc6\\x55\\xb7\\x47\\x58\\x77\\xf2\\x53\\xbb\\xe7\\xd2\\xf0\\xd2\\xdb\\x33\\x59\\x53\\x9d\\xc3\\x07\\xcf\\xd0\\xda\\x5f\\x3b\\xae\\x97\\xed\\x64\\x2d\\x3b\\xed\\x4e\\x9f\\x09\\x78\\xa6\\x23\\xdd\\x18\\x2f\\x0f\\xda\\xd1\\xfb\\x63\\x03\\x5f\\x8c\\x78\\x06\\x12\\x6c\\x42\\x87\\x14\\x42\\xa4\\x9d\\xc4\\x4d\\x24\\x81\\x55\\x45\\x52\\xee\\x14\\xcb\\x91\\x28\\xcd\\x41\\xfe\\x3b\\x00\\x09\\x3f\\x25\\x19\\x64\\x13\\x36\\xd9\\x04\\xc1\\x5a\\x4b\\x4a\\x9c\\x0a\\x52\\x9f\\x91\\x1b\\x10\\x02\\xfc\\x24\\x64\\xc0\\x30\\x9a\\xfe\\x09\\xef\\x1f\\x89\\x9a\\xf1\\x5d\\x88\\xe5\\xa4\\x89\\x8c\\x83\\xe7\\xec\\xbb\\x14\\xe4\\xc3\\xbc\\x77\\xf1\\xd6\\x68\\x40\\x76\\x18\\xd1\\x56\\xbd\\x1f\\xc4\\x3c\\x5a\\x05\\x63\\x62\\xe3\\x7b\\xbe\\x34\\xad\\xe0\\xfb\\x94\\xee\\x41\\xec\\x45\\x77\\xf8\\xbc\\x0b\\xf1\\x91\\x68\\x83\\x66\\xee\\x16\\x1a\\x9d\\xd6\\x0f\\xf9\\x26\\x99\\xbc\\x66\\x97\\x7e\\x79\\x15\\xf8\\xec\\xbb\\x7c\\xba\\x5d\\xea\\xae\\x91\\x10\\xb4\\xda\\xa0\\xe3\\x81\\x35\\x8a\\xb5\\x7f\\x00\\xce\\x75\\x28\\x88\\x65\\xac\\xa5\\x86\\x11\\x4a\\x43\\x81\\x85\\x37\\xc3\\x46\\x88\\xe5\\x53\\xc1\\xc3\\x90\\x09\\xe4\\xbc\\xb4\\xf5\\xe8\\xfa\\xee\\x91\\xc8\\xe0\\x92\\x7d\\x08\\x67\\x02\\x56\\xbd\\x1a\\x56\\xb9\\x74\\x73\\xda\\x9e\\x69\\x5f\\xa1\\x5f\\x87\\xb7\\x07\\x7f\\x33\\xd2\\x11\\x08\\xd8\\xca\\xde\\x10\\x3e\\xdf\\x57\\xfa\\x5c\\xbc\\xec\\x61\\x9b\\xba\\x9c\\x4e\\x6c\\x2c\\x0f\\x18\\x91\\xaf\\xbd\\x89\\x37\\x37\\x10\\x50\\xd2\\x76\\xd6\\xb0\\x7b\\x1a\\xc0\\x3f\\xf4\\xf7\\x2b\\xcd\\x50\\xb0\\xce\\xf7\\x7e\\xed\\x5f\\x71\\x39\\x5d\\x56\\xed\\xae\\x57\\x34\\x23\\x3d\\x1f\\xc0\\x1f\\x67\\x71\\x5d\\x7d\\x94\\x08\\xfc\\xe1\\x35\\x45\\x6d\\x1e\\xae\\x46\\x29\\x93\\xd8\\x2a\\x4f\\xb1\\x89\\xfa\\xac\\x2b\\x7a\\xed\\xbe\\xff\\x39\\xd9\\xf5\\xea\\x9d\\x71\\x6d\\xc1\\x50\\xe7\\xa5\\x29\\x5c\\x6d\\xb4\\xde\\x5e\\xe2\\x20\\xe4\\x55\\x81\\xc3\\x1a\\x5a\\x33\\x0c\\x6e\\xe0\\x64\\x0d\\xb3\\x3d\\xd9\\xcc\\xe2\\x8a\\xda\\xb3\\xf2\\x67\\x37\\xe9\\xd9\\x4f\\xed\\x6e\\x8c\\x1b\\x65\\x8a\\x14\\xb7\\x2c\\x53\\x00\\xd7\\x7e\\x57\\x1f\\x6e\\xbf\\xd6\\x6f\\x20\\x29\\x3b\\x8e\\xaa\\xc9\\xd8\\x17\\x73\\x73\\x7d\\xc8\\xf0\\xb8\\x9c\\x65\\x50\\x1a\\xd4\\xe9\\x77\\xfa\\x70\\x40\\x8b\\xc5\\x6e\\x7e\\x1d\\x4f\\xec\\x11\\xa8\\x6d\\x9c\\xa3\\x40\\xae\\x09\\x45\\x39\\xdc\\x45\\x42\\xf4\\x9f\\x44\\xf4\\x39\\xdc\\x5d\\x53\\xb2\\xb5\\xca\\xf8\\x1d\\xed\\x51\\x61\\x24\\x7b\\xa4\\x04\\x09\\x18\\x6b\\x70\\x91\\x64\\x7e\\xf1\\xa9\\x12\\x1e\\x39\\xdc\\x92\\xb6\\xfc\\xda\\x99\\xb7\\xc5\\x81\\x98\\xee\\xd7\\x26\\xcf\\x85\\x27\\xd0\\x4f\\x13\\x81\\xf2\\x39\\xb9\\xae\\xb2\\x9c\\x59\\xb7\\x1f\\xde\\x16\\x62\\x96\\x45\\x42\\xbe\\xbe\\x22\\xba\\x0f\\xb3\\xb7\\x9f\\x6f\\x1d\\x35\\x99\\x27\\x5a\\xb2\\x50\\x76\\x51\\xde\\x7c\\x17\\xac\\x9c\\x89\\x07\\x0b\\xc2\\x58\\x78\\x5e\\x58\\xf3\\x03\\xb5\\x0a\\x2a\\x4a\\xad\\x7d\\x64\\x8c\\x91\\xeb\\xe9\\x65\\xe6\\x66\\x1e\\xc8\\x4b\\xd3\\x42\\xe3\\x28\\x6c\\x76\\xfb\\x0f\\x03\\x83\\x52\\x3f\\x3f\\xc8\\xf8\\xcd\\x0b\\x6e\\x2c\\x8d\\x8c\\x2a\\xff\\x4a\\x44\\xe9\\xd0\\x54\\xf2\\xf1\\x4a\\xab\\x63\\x77\\xa4\\x1d\\x3c\\x88\\xbc\\x34\\x45\\x0e\\xd1\\x80\\x4a\\x3c\\x58\\x91\\x6f\\x83\\xa8\\x79\\xdd\\x02\\x30\\xc4\\x5f\\x2d\\xde\\x7d\\x98\\x3e\\xe8\\x5f\\xcb\\x81\\xdc\\x29\\xf1\\x37\\x0d\\x8a\\x28\\x3e\\xc9\\x49\\x3a\\x30\\xa9\\xdb\\xde\\x41\\x6d\\x1d\\x21\\x35\\x56\\xc7\\xd2\\x33\\x9f\\xd9\\x68\\x8b\\x28\\xfa\\xec\\x15\\x57\\xc6\\x7a\\x50\\x57\\x41\\x75\\xeb\\xf3\\xf1\\xeb\\xe9\\xdd\\xfd\\xb0\\x54\\x76\\xd9\\x6d\\xe5\\xb7\\x31\\xc3\\x6e\\x76\\xe9\\x62\\x76\\x29\\x29\\x3b\\xed\\x06\\xfe\\x89\\x4e\\xfb\\x15\\x6a\\xdf\\x0c\\xde\\xf3\\x52\\x18\\x81\\x50\\x32\\xaf\\xd2\\xf8\\xc3\\x0e\\xa6\\x36\\xc3\\x69\\x27\\xc6\\xec\\xa8\\xc8\\x66\\x65\\x61\\xb1\\xe1\\x48\\xfd\\x00\\xf6\\x9c\\x30\\x39\\xaa\\x17\\xe5\\x21\\xef\\x0f\\x41\\xe8\\x80\\x55\\xbb\\xa2\\x23\\x41\\x4d\\x68\\xf3\\x0d\\x6a\\x75\\x3e\\x14\\x23\\x3b\\x68\\xa3\\x41\\x02\\xc3\\x9e\\x0b\\xf0\\x87\\x2d\\x12\\x6a\\xa6\\x21\\xc8\\xc1\\x3f\\x64\\x7b\\xd3\\xab\\x2c\\x90\\xdf\\x29\\x0d\\xee\\x61\\x44\\x97\\xb7\\xb2\\x90\\x08\\x87\\xec\\x08\\x05\\xbf\\x0e\\xdc\\xe7\\x12\\xa1\\x13\\xe9\\xf7\\x5f\\xfc\\xa8\\xb1\\x73\\xef\\xdf\\x8f\\xba\\x48\\x0a\\xf8\\xaa\\x48\\x8c\\xdb\\xd7\\x90\\x65\\xf9\\x51\\x62\\xb4\\x29\\xfd\\xba\\x16\\x17\\xc9\\x54\\xf6\\x46\\x07\\x27\\x53\\xd7\\x8a\\xd6\\x76\\x23\\x69\\x46\\x8d\\x3b\\xe2\\xc7\\x67\\xcb\\x35\\x13\\x3d\\xfb\\xfe\\xd9\\xe7\\xf3\\x36\\xd7\\xd1\\xe7\\x89\\xfe\\x80\\x4d\\x29\\xa4\\xbf\\x0f\\x12\\x90\\x8c\\xe3\\xe3\\x2e\\x6a\\x8c\\x4d\\xe7\\x91\\x1c\\x90\\x78\\x8b\\x96\\xde\\xe1\\x58\\x3b\\x61\\x39\\xc5\\x4b\\x3e\\x3b\\x24\\xb3\\xcf\\x97\\x8b\\x4c\\xb9\\x02\\xf3\\x39\\xa5\\x81\\x2b\\x20\\xaf\\x8e\\x5b\\x9e\\x57\\xf7\\xb6\\xe6\\xb3\\xe8\\x2b\\x39\\xce\\x1c\\x2e\\x19\\x9b\\xfc\\x91\\x49\\x71\\xab\\x52\\x7f\\x81\\xed\\x74\\x05\\x71\\x04\\xa6\\x19\\x09\\x61\\x91\\xcf\\xd2\\x8d\\x2b\\x5d\\xd7\\x27\\x19\\xab\\xa3\\x17\\xeb\\xaf\\xf7\\xee\\x7f\\xc4\\xe5\\x50\\x43\\x28\\xc3\\xce\\x2b\\x9d\\x4e\\x92\\xd9\\x9a\\x32\\x32\\x25\\x2d\\x78\\xde\\x9a\\x86\\x1b\\x93\\x31\\xf6\\x2d\\xb2\\x09\\x07\\x0f\\xd7\\x78\\x04\\x76\\x62\\x67\\x88\\x54\\xa5\\x5a\\xd6\\x47\\x98\\x6e\\xc7\\x7a\\x29\\x22\\xab\\x00\\x8b\\x57\\x79\\x3d\\xf7\\xed\\x24\\xe9\\xdb\\x76\\x5b\\xb5\\x35\\xf3\\xe7\\xe6\\xb9\\xc4\\xad\\x67\\xa8\\xd1\\x2f\\x4a\\x76\\xf6\\x7a\\xe1\\xbb\\x6a\\x64\\xf7\\xd8\\x87\\x33\\x7a\\x1d\\x31\\xe7\\xd7\\xbf\\x45\\x9c\\x45\\xe7\\xd8\\x78\\xa5\\x7f\\x84\\x0c\\x0f\\xbd\\x19\\xd4\\xb4\\xfb\\x44\\xde\\x09\\x45\\xbf\\x42\\x2b\\x20\\x2b\\xb2\\x6e\\x0b\\x9a\\x8a\\x38\\x6b\\xff\\xca\\x13\\x17\\x1a\\x4a\\xaf\\xcc\\x42\\xe7\\x6e\\x25\\x62\\x8c\\xab\\x51\\xc2\\x19\\xcf\\x06\\x75\\xa3\\x53\\x66\\x94\\xe6\\x06\\xe2\\xaf\\x4a\\x97\\x6c\\x36\\xf9\\x0c\\x40\\x7a\\x37\\x48\\x7c\\xbe\\x36\\xad\\x7c\\x63\\x79\\xa9\\xbe\\xdc\\x75\\xe3\\xd8\\xba\\xfb\\x8d\\xfc\\x5c\\x90\\xd9\\x02\\xd4\\xf0\\x57\\x37\\x84\\x24\\x94\\x05\\xb4\\x5f\\x0f\\x5a\\xc7\\x45\\xb4\\xd1\\x6b\\x21\\xdc\\x2f\\xa9\\x29\\x92\\x2c\\x76\\xcb\\x91\\x84\\xf0\\x75\\x77\\x13\\xd1\\x44\\x04\\xdf\\x97\\xf3\\xcd\\x5d\\xc9\\xb1\\x9d\\x7c\\x26\\x5b\\x09\\x9f\\x49\\xf6\\x62\\x0e\\xe1\\x53\\x31\\x17\\xf1\\x31\\x6a\\x3a\\x2f\\x62\\x0e\\xdf\\x62\\x74\\x6c\\x4f\\xb6\\x78\\x29\\x57\\xbe\\x38\\x3b\\x4f\\x31\\x24\\x3f\\xbf\\x9e\\x6e\\x5f\\xe5\\x16\\x94\\xf4\\x07\\x30\\xe3\\x2b\\xe0\\x6c\\x9d\\xb0\\xb2\\xbd\\x88\\x72\\x99\\x89\\x23\\xf2\\x98\\xc1\\x14\\xc6\\x69\\x02\\xa5\\x9d\\x5f\\x05\\x2d\\xc9\\x9e\\xdf\\xee\\x04\\x4f\\xce\\xca\\xc9\\x6c\\x71\\xdd\\x99\\x5e\\x93\\xdd\\x7e\\x97\\x83\\xf2\\x9b\\x20\\xd9\\x5e\\x1b\\x33\\x78\\x95\\xd4\\x62\\x1d\\x86\\xf8\\x66\\x08\\x75\\x59\\xf8\\x10\\x8c\\x7a\\x25\\xd3\\x5b\\x0a\\x04\\x2c\\xe6\\xc8\\xea\\xf2\\x59\\x7d\\x2d\\x6e\\xee\\xb3\\x49\\x2e\\xa8\\xea\\x94\\xd4\\x94\\x64\\x11\\x6c\\xd5\\xda\\x26\\x7c\\x35\\x9e\\x96\\xf5\\xe0\\x65\\x3f\\x8a\\x97\\xcc\\x97\\xd8\\x6a\\xac\\xf9\\x8a\\x0a\\x78\\xf6\\xd5\\x3b\\xd9\\x66\\x79\\x89\\x59\\x17\\x9d\\xe8\\x36\\x1a\\xf7\\x39\\xae\\x72\\x9d\\x2c\\xd4\\x40\\xb5\\x2b\\xc7\\xbf\\xda\\x8c\\x20\\x31\\xf4\\x95\\x9a\\x0c\\xb4\\x59\\x43\\xcc\\x98\\x94\\x14\\x4c\\x29\\x0d\\xd5\\x47\\x78\\x00\\xe2\\x23\\xee\\xae\\x0c\\x31\\x11\\x9f\\x91\\x48\\x21\\x88\\x2c\\x39\\x7c\\x68\\xf3\\x01\\xe2\\x83\\xdc\\x43\\x5b\\xfa\\x8e\\xbf\\x83\\x7f\\xd2\\x0b\\x3f\\x2f\\xc1\\xda\\x9b\\x06\\x46\\x56\\x91\\x53\\x7c\\xed\\x2f\\x38\\x86\\x92\\x8a\\x34\\xb1\\x88\\xec\\xc5\\xf2\\x4d\\xe1\\xb2\\x45\\xa1\\x48\\x08\\xff\\x10\\xb1\\xd7\\x99\\x22\\x31\\xd8\\xd9\\xc8\\x60\\xe3\\xf5\\x78\\x96\\xda\\x39\\x63\\x38\\xfb\\x7e\\x28\\x69\\xa2\\x2a\\xab\\xbd\\xbe\\xbd\\xc4\\x69\\xbe\\xfc\\x73\\x9a\\x91\\xf3\\x38\\xd3\\xf3\\x7e\\x52\\x07\\x45\\xb1\\x45\\x56\\xa3\\xdb\\x63\\x3f\\x9c\\x34\\x51\\x71\\x16\\xcd\\x5d\\x7b\\x7f\\x5e\\x14\\x81\\x0f\\x29\\x64\\x71\\xfb\\xa4\\x55\\x12\\xa3\\xa3\\x8c\\xf7\\xfa\\x40\\xf4\\x38\\xba\\x69\\xa5\\xc7\\xec\\xc0\\xa1\\x06\\x3c\\x68\\x4f\\x58\\x1b\\xaf\\xf6\\x39\\x1a\\xba\\xe9\\x57\\xca\\xc3\\x31\\xb4\\xa8\\xf2\\x06\\xbc\\x13\\x5a\\x1a\\xce\\xe9\\xa2\\xfe\\x84\\x51\\x48\\x2b\\xd2\\x33\\x89\\x44\\x61\\xf5\\x0a\\x4d\\x55\\xfb\\x1d\\x6b\\x7a\\x82\\x87\\xc3\\xe0\\xee\\xf8\\x01\\x95\\x10\\xa3\\xe3\\x0b\\xb6\\xfb\\x6c\\x44\\x26\\x76\\x2e\\xce\\x8c\\x7e\\x4b\\x85\\xc3\\xa8\\xd1\\x44\\x3a\\xf8\\xfb\\x6d\\x32\\x1f\\x96\\x6e\\x78\\x9f\\xf0\\x37\\x7b\\x5f\\x70\\x1f\\xc0\\x88\\x8a\\x68\\x50\\xa4\\x81\\x6c\\xe0\\x67\\x24\\x74\\xd0\\x4d\\x83\\xd8\\xb9\\x5d\\xda\\xe3\\x70\\x61\\xf6\\xe9\\xfd\\xd6\\xed\\xfe\\x60\\x7c\\x3b\\xd0\\xe1\\xca\\x13\\x59\\xf3\\xcd\\x89\\x75\\x60\\x5f\\x04\\xa2\\x3d\\x92\\x4a\\x83\\x46\\x9f\\x9f\\x07\\x7e\\x4d\\xf1\\x77\\xee\\xcb\\x40\\x34\\x5a\\xb4\\xf2\\x96\\x5d\\x3e\\xf5\\x6d\\xc0\\xc5\\xfc\\xbe\\x04\\x2f\\xef\\x1e\\xcc\\xd1\\x6f\\xda\\x97\\xef\\x69\\xe9\\x80\\xf0\\xfa\\x49\\xd7\\xab\\xca\\x19\\xa1\\x54\\x5d\\x92\\x33\\x90\\xf7\\x05\\x56\\x7b\\x46\\x6c\\xfb\\xd0\\x21\\xc7\\x5c\\xb2\\x1c\\x93\\x0a\\xe6\\xa6\\x1e\\x5e\\x99\\xb5\\xc0\\xfe\\x6f\\x44\\x09\\x83\\xdf\\x6f\\x40\\x58\\x27\\x1d\\x0c\\xe8\\x03\\x4f\\xcc\\x79\\x77\\xa6\\xbb\\xfe\\x32\\xc1\\x87\\x35\\x41\\x4e\\x39\\xdb\\xc8\\x01\\xdd\\x91\\x0f\\xfe\\xf4\\xf2\\xda\\x7c\\xae\\x31\\xf3\\x98\\x55\\xac\\xee\\xef\\x4d\\x3e\\x92\\x08\\x0c\\xf6\\x7a\\xbe\\xf6\\x36\\x39\\xeb\\xb9\\x32\\xd0\\x93\\x0b\\xbe\\xaf\\xfe\\x4c\\x1f\\x42\\x3c\\x9e\\x7a\\x7f\\x7e\\xca\\x7c\\x98\\x38\\xdf\\x64\\x71\\x6e\\x55\\x7e\\xf7\\x49\\x38\\x73\\x2e\\xa3\\x78\\x17\\xa9\\x17\\xa3\\xd7\\xb8\\xa0\\x45\\x9c\\x99\\x5f\\xd8\\x46\\xe8\\x23\\xc9\\xa0\\x79\\x4a\\x54\\x4e\\x19\\x39\\xb7\\xca\\xea\\x5d\\x09\\x45\\x0c\\x0a\\x37\\x56\\x69\\x75\\xc3\\x7d\\xfa\\xa7\\x20\\x0c\\xe4\\x82\\xc4\\x2a\\x88\\x4b\\xc1\\x4e\\x35\\xd6\\xde\\x5b\\xe5\\x98\\x8e\\x15\\x2d\\x7e\\x91\\xb8\\xb8\\xc6\\x3a\\xf1\\x5a\\x2f\\xba\\x95\\xbe\\x61\\xa6\\x39\\x86\\x7c\\xd5\\x59\\x2a\\xca\\x21\\xfc\\x49\\xe7\\x25\\xe6\\xf5\\x72\\xdc\\xbd\\x9f\\x89\\x98\\xc1\\x27\\x20\\xfb\\x6a\\x77\\x3e\\x1d\\x43\\x6b\\x14\\x02\\xae\\xc5\\x52\\x69\\x29\\x19\\x0a\\x03\\x49\\x27\\x41\\xe7\\x42\\x68\\xf7\\xb3\\x93\\xfd\\xda\\x45\\xeb\\x19\\x74\\x8c\\x8a\\x3e\\xbe\\x05\\xa9\\x2e\\xa5\\xbe\\xab\\xff\\xfa\\x14\\x62\\xce\\xed\\x7d\\xcf\\x0b\\x3d\\x5c\\xf3\\x9d\\x20\\x9e\\x21\\x42\\xe7\\xc0\\x5c\\x0f\\x23\\xc0\\xe8\\x18\\xaa\\xd4\\x81\\xe6\\xd9\\x5d\\x88\\xb4\\x42\\xbd\\xb8\\xcc\\x6f\\xd8\\x23\\xc2\\x6a\\x3e\\x1d\\x81\\xdb\\x88\\xb4\\xfa\\xb3\\x94\\xa6\\xc7\\xd0\\x4b\\x6d\\x87\\x60\\x74\\xa5\\x59\\xb0\\xfb\\x25\\x13\\x10\\x16\\xda\\xd3\\xc1\\x54\\x9e\\x7d\\x06\\x6c\\x0b\\xdb\\xbd\\x09\\x96\\xd4\\xf8\\x13\\xc5\\xd1\\xfc\\xf1\\x76\\x4c\\x95\\x05\\x27\\x3f\\xc6\\x9b\\x8c\\x9b\\x34\\xee\\x54\\x42\\x5f\\xf9\\x74\\xd8\\x50\\xfd\\x07\\xc9\\x6c\\x46\\xc8\\x14\\x13\\x1d\\xe8\\x0f\\x5f\\xc3\\x48\\xe5\\x97\\x07\\x02\\x97\\x0c\\xfe\\xe7\\x40\\x44\\x2b\\x32\\x3c\\x27\\xe7\\x43\\xa6\\x52\\x93\\x8e\\x66\\xab\\xfd\\x68\\x90\\x7b\\xa0\\x5a\\xbd\\x84\\x00\\x4d\\xfb\\xce\\x70\\xd5\\xae\\x09\\x1c\\x56\\x98\\x7f\\x5d\\x7f\\x50\\x04\\xe9\\x80\\xa1\\x10\\xb2\\x21\\x70\\xb5\\x08\\xa6\\x31\\x5c\\x7f\\x63\\x68\\x27\\x2c\\xef\\x45\\x15\\x4c\\xa9\\x48\\xfe\\xc7\\xfb\\xf2\\x9c\\xd6\\xd3\\xe5\\x02\\x62\\x7a\\xce\\x96\\xa7\\xf5\\x9e\\x6a\\xab\\xed\\x69\\x59\\x91\\x61\\x8e\\xfb\\x74\\x44\\xe3\\xa4\\x07\\x91\\x84\\xd4\\x33\\xcc\\xc1\\x53\\xfa\\xa2\\xd1\\x75\\x9f\\xdb\\xe5\\x9b\\x40\\x7b\\x48\\x55\\x1e\\xb9\\x16\\xd8\\xc6\\x85\\xc0\\x03\\xea\\x2a\\xf6\\xa4\\xd8\\xae\\x2b\\x3c\\x63\\x4f\\xdd\\xc5\\xfe\\x24\\x9c\\x63\\x2f\\xba\\x5e\\x24\\x07\\x3e\\xd6\\x5d\\x60\\x18\\xb0\\xec\\xda\\xfb\\xd5\\x0f\\xeb\\x1c\\xd6\\x6d\\x9f\\xd1\\x69\\x7c\\xee\\x0b\\xe9\\xc8\\xee\\x05\\x4d\\x10\\x7e\\x0a\\xf7\\x37\\x0c\\x37\\xd3\\x9f\\x55\\x1d\\xd1\\xa9\\xc6\\x7f\\x64\\x10\\xbf\\x71\\x9f\\x55\\xb3\\xfb\\x18\\x39\\xe5\\xc2\\x53\\xfe\\x45\\xfe\\x85\\x50\\x55\\x94\\x80\\xfb\\x18\\xf7\\x13\\xc6\\x07\\xfe\\x74\\x91\\xe4\\x96\\x37\\x20\\x6e\\x65\\x92\\xc4\\x0b\\x01\\x31\\xde\\x0f\\x36\\xf0\\x24\\x6e\\xb0\\x8a\\xbc\\x66\\xbd\\xff\\xeb\\xe8\\xd7\\xa9\\xc7\\x1b\\xcf\\xa8\\xd3\\x0f\\x12\\x1c\\x39\\xbf\\x50\\xd6\\xfd\\x7e\\xb8\\xe2\\x30\\x03\\x35\\x67\\xa4\\x0c\\xf0\\xcc\\x3e\\x4c\\x45\\xcc\\x27\\x34\\x5d\\x12\\x9f\\xfb\\x45\\xd7\\x05\\xa9\\xfa\\x2f\\xae\\xb3\\x16\\x0b\\x7d\\xb1\\x6f\\x32\\x78\\x88\\x4b\\x55\\x91\\x64\\x1c\\x74\\xd0\\x49\\x74\\xda\\xa4\\xf4\\x7c\\x7c\\xc9\\x54\\x44\\xf4\\xa6\\x5a\\xea\\xd4\\x21\\x90\\xab\\xa8\\x55\\x86\\x5d\\x81\\x0c\\x0c\\x23\\x4e\\x81\\xe6\\x57\\x86\\x59\\x2d\\x70\\x2e\\x54\\x96\\x40\\x54\\xe6\\x40\\xd4\\x5d\\xd7\\x3d\\x0a\\x8c\\xf7\\xa4\\x71\\x01\\xa6\\x17\\x7f\\x81\\x0a\\x06\\x67\\x08\\x57\\x91\\x45\\xd4\\xdf\\x22\\x4b\\x57\\x6a\\xbd\\x5d\\x20\\x54\\xec\\x80\\xd6\\x40\\xce\\x84\\x8b\\xb7\\x65\\x3a\\xf2\\xc9\\x65\\x32\\xb4\\x5a\\xd2\\xf2\\xe2\\xf2\\x62\\x9d\\x3e\\x86\\xb8\\x08\\xdf\\x89\\x20\\xb1\\xa9\\x51\\x10\\xcf\\x1e\\xd7\\x82\\xec\\x1f\\xfb\\x7f\\xed\\x16\\x46\\xc7\\x97\\xa8\\xa6\\x53\\xde\\x57\\x6b\\x33\\x78\\xd5\\x6c\\xd6\\xae\\x9a\\x25\\x32\\x9e\\xda\\x56\\x9d\\xd6\\x8b\\x0f\\x5b\\x69\\x39\\x93\\x5a\\x62\\x15\\x2d\\xbc\\x2c\\xde\\x17\\x2c\\x07\\xef\\x13\\xf5\\xa7\\xe9\\x0c\\xa8\\xd9\\x6a\\x46\\xbe\\xce\\x59\\x0a\\x0b\\x16\\xf6\\x63\\xb3\\x65\\x72\\x9b\\x2c\\xf6\\x2f\\x4b\\xc7\\xe5\\xf7\\x20\\x98\\xe7\\xfc\\xae\\x6a\\xa3\\xa7\\xfc\\x7d\\x9d\\xad\\xd5\\x31\\x9c\\xc8\\x98\\xbc\\xf4\\xda\\xc6\\x83\\x22\\xac\\xf8\\xb5\\x9b\\xe9\\xd2\\x0a\\x74\\x47\\x4c\\xe0\\xad\\x6d\\x0a\\x35\\x85\\xfa\\x89\\x5a\\x52\\x6c\\x30\\xed\\xf4\\x02\\x7b\\x90\\x15\\x22\\x2e\\x06\\xfc\\x42\\x09\\x69\\x58\\x09\\x97\\x07\\xe4\\xc6\\xc1\\x12\\x86\\xcc\\x43\\x1a\\x57\\x02\\x7b\\xaf\\x89\\x8a\\x0d\\x23\\xa1\\x97\\x77\\x1f\\x03\\xed\\xc3\\x37\\xc5\\x15\\x08\\x3e\\x5f\\x22\\x07\\x0f\\x97\\x2c\\xa7\\x22\\xa4\\xb0\\xc3\\x9b\\xdd\\x86\\x87\\x67\\x73\\x6c\\x98\\x13\\xa7\\x75\\x50\\x90\\xd9\\x35\\xd7\\x2b\\x72\\x2f\\xdd\\x2b\\x3d\\xad\\x2f\\xfd\\x2e\\x8d\\xae\\xab\\x26\\x50\\xf8\\x0f\\x97\\x9f\\x7b\\xf3\\x7d\\xc3\\xd9\\x90\\xed\\x5f\\xe3\\x27\\xeb\\xba\\xd6\\x81\\xd9\\x36\\xd6\\xc4\\x4d\\x26\\xd6\\x42\\xe1\\x23\\xac\\xd6\\x1a\\xa2\\x9f\\x11\\x1d\\x45\\xa0\\x62\\x15\\xa4\\xf8\\x1b\\xb1\\x53\\xf5\\x6d\\xfc\\x3f\\x7d\\xf7\\xff\\xa6\\x1c\\xe9\\xc9\\x05\\x9f\\x9c\\x9d\\x6a\\xd9\\xe9\\xb8\\x5e\\x07\\x45\\xa5\\xf3\\xdb\\x69\\xd6\\x9f\\x8f\\x1c\\x04\\x14\\x7d\\x68\\x69\\x72\\x59\\x0d\\xb3\\x26\\x48\\x64\\xbb\\xbf\\x9b\\x21\\x26\\xf2\\xdd\\x8d\\xc1\\x17\\x18\\x27\\x9c\\x36\\x53\\x30\\xfd\\xae\\x12\\xf8\\xca\\x04\\xec\\x3f\\x36\\x72\\xc7\\xa4\\x6d\\x9d\\x9c\\x9a\\xc2\\x99\\xe3\\xf6\\x99\\xe3\\x7e\\xca\\x90\\x48\\x49\\xa5\\xdb\\x1b\\xfa\\x35\\xe0\\xc5\\x78\\xae\\xfa\\x0b\\x3e\\x11\\x16\\x48\\xb7\\xe3\\x90\\x3a\\x52\\xd6\\x66\\xe9\\x28\\xe0\\x01\\xf1\\x33\\xd3\\xf9\\x41\\xe9\\x89\\x78\\xcf\\x2d\\x56\\x0c\\x5d\\x59\\x47\\x62\\x3d\\xb9\\xcc\\x1c\\x8b\\xd5\\xf6\\xdf\\x5e\\xfd\\x66\\x7f\\x87\\x6d\\x4b\\x2d\\x36\\xf7\\x6a\\xb6\\x18\\x4f\\x7b\\x8f\\xa3\\x5a\\xaa\\xb0\\x58\\x7a\\x0a\\xff\\x85\\x20\\x5b\\xa5\\x2c\\x7c\\xdf\\x2a\\xa0\\x5e\\x7a\\xcb\\xf2\\xed\\xed\\x1b\\xed\\x6c\\x79\\x7e\\xc9\\xa7\\x3f\\x7f\\x0a\\x45\\x0d\\x40\\xce\\x1b\\x7d\\xd2\\xbe\\x7c\\x79\\x60\\xc0\\x42\\xa5\\x7e\\xfd\\x68\\x94\\x00\\x4b\\x1d\\x4e\\x28\\xc5\\xec\\x73\\x08\\x87\\x64\\xe7\\xf8\\x29\\xd0\\xe0\\x89\\x4a\\x04\\x8e\\x10\\x3d\\x35\\x85\\xd2\\xcc\\x2a\\x8a\\x7e\\x34\\x47\\x88\\x84\\xc5\\x5a\\x5b\\x51\\x19\\xbf\\x10\\xd1\\x9c\\xac\\x31\\xa7\\x0d\\x73\\x97\\x8a\\x6a\\xd5\\x92\\x18\\x6a\\xa9\\xe2\\xb7\\xf0\\xd3\\x1f\\xda\\x5e\\x1d\\x01\\x3e\\x15\\xcb\\xae\\x2e\\x96\\x4c\\x7d\\xf2\\x0b\\xd8\\x31\\x44\\x2d\\x33\\xdb\\x99\\x9b\\x31\\xf2\\x16\\x71\\xb8\\x1f\\xa7\\x62\\x5b\\x82\\x3f\\x7d\\xdb\\xbf\\xa3\\x7b\\xf4\\xed\\x21\\x9e\\xdd\\xb1\\x6d\\x77\\xd8\\xb7\\xec\\x9b\\xbf\\xd5\\xc2\\x5e\\xfe\\xbe\\xbf\\x05\\x5d\\xe8\\xfa\\xfb\\x2b\\x6f\\x28\\xee\\xde\\x82\\x34\\xcb\\x6a\\xbc\\xf3\\x6a\\x5b\\x0c\\x2b\\xc7\\x05\\xc4\\x0f\\x61\\x2c\\x69\\x30\\x46\\x63\\x95\\xd9\\x54\\x0e\\x04\\xad\\xbc\\xff\\x0c\\x56\\x45\\x0e\\xba\\xc8\\x3f\\xf2\\xc8\\xc7\\x53\\x5e\\xc6\\xa8\\x09\\x87\\x37\\x32\\x24\\x28\\x9e\\x12\\xba\\xc0\\x82\\x77\\x38\\xc9\\x5c\\xcf\\x24\\x37\\xdb\\x41\\x11\\x23\\x65\\x50\\xc6\\xd0\\x04\\x08\\xf2\\x98\\x27\\x8f\\xab\\x3e\\xa0\\x58\\xa3\\x8d\\xb9\\xf6\\xc8\\xd5\\xe7\\xf7\\x68\\xe7\\xca\\xf4\\x1e\\xbb\\xa1\\xeb\\x36\\x47\\x23\\xd0\\xea\\xb9\\x0b\\xc3\\xbc\\x68\\xee\\x20\\xf5\\xb8\\x0b\\x4a\\x3a\\x97\\x8b\\x46\\x21\\x38\\x70\\xf8\\xa6\\x7a\\xec\\x33\\x84\\xbb\\xc9\\x12\\xa2\\x1c\\xd5\\x26\\x46\\x20\\x00\\xaa\\xeb\\x7a\\x25\\x39\\xe6\\xb9\\x46\\xa5\\xad\\x3d\\x18\\x38\\xd7\\xe3\\x88\\x70\\xa9\\x4e\\x1d\\x75\\x26\\xe3\\x29\\x24\\x6f\\x62\\x86\\xd6\\x82\\x2c\\x02\\x24\\x13\\x8d\\x4b\\xe7\\x90\\x77\\x08\\x47\\xce\\x48\\x6b\\x98\\x60\\x25\\xf4\\x05\\xa6\\x89\\x34\\x31\\xc8\\xfd\\x96\\x41\\x70\\xff\\x4c\\x65\\xe2\\x4b\\x18\\x16\\x73\\xe2\\x6b\\x99\\x73\\xfd\\x35\\xa2\\x5f\\x4e\\xd2\\x23\\x48\\xff\\x63\\x27\\xf3\\xd6\\xac\\xd7\\x83\\xdf\\x6e\\xc6\\x5f\\xfa\\x74\\x75\\x7f\\xa5\\xae\\xe9\\xb5\\xd2\\xba\\xd2\\x63\\xab\\xdd\\x74\\x34\\xff\\x5a\\x44\\xca\\xa6\\x5b\\x6f\\xda\\xd4\\x67\\x88\\x89\\xa8\\xe3\\x64\\xf8\\xcd\\x95\\xa3\\x82\\xb6\\x93\\xa0\\xd5\\xf9\\xd0\\x8c\\xf3\\x8e\\x98\\xfb\\x2a\\x83\\x88\\xdf\\x6a\\x8f\\xf4\\xe9\\xd2\\x1b\\xcc\\xc7\\x3b\\xf2\\x48\\x77\\xe2\\x0a\\xfa\\x3e\\x22\\x14\\xf2\\xf3\\x29\\x8c\\x66\\xd2\\x44\\x83\\x72\\xbc\\x7e\\xd1\\x54\\xe3\\x48\\xe6\\xc2\\x9b\\x28\\x68\\x63\\xc7\\x76\\x94\\x21\\x32\\x79\\x95\\x47\\xfa\\x60\\x60\\x98\\x3c\\x04\\x1e\\x2b\\x45\\x9b\\x30\\x19\\xd6\\x63\\xea\\xaf\\x86\\xc6\\xca\\xea\\x61\\x5f\\x98\\x5c\\xe7\\xa6\\xfb\\x65\\x66\\x84\\x2d\\x04\\x07\\x76\\x87\\xd3\\xc9\\xa8\\xdb\\x17\\x7e\\x87\\xb4\\xfb\\x45\\xf3\\x90\\xd0\\x5b\\xf6\\x47\\xc0\\x1c\\xe8\\x03\\x4e\\x17\\xca\\xf2\\x80\\xa5\\xc7\\xc1\\x17\\x85\\xe3\\xa4\\x06\\x49\\xf2\\x6e\\x72\\xaa\\x7a\\x7b\\x4d\\x5d\\x9d\\xc2\\x99\\xe7\\xbe\\xdf\\x69\\x80\\x50\\xea\\x2a\\xb2\\x6c\\x57\\x29\\x62\\xb1\\xd3\\x6e\\x7a\\x19\\x60\\x92\\x4a\\x5f\\xff\\x8b\\x85\\x34\\x0d\\x7d\\x35\\xbf\\xd9\\x0d\\x82\\x65\\x68\\x3c\\x4b\\x77\\xf6\\x89\\x56\\x56\\xde\\x6d\\x14\\xda\\x37\\x3c\\xf3\\xe7\\x6d\\xaf\\xdc\\x0f\\xfa\\xcc\\x1a\\x3b\\x49\\xc9\\xa8\\x79\\x33\\xf1\\x83\\x2b\\xaf\\xbb\\x7e\\x3b\\xd6\\x33\\x35\\x6b\\x96\\x34\\x31\\x99\\x44\\xd6\\xcc\\xd4\\xd7\\x13\\xfc\\x8a\\x3f\\xe5\\x75\\xc8\\x0e\\x5e\\x50\\xbb\\xac\\x38\\x57\\xe7\\x84\\xde\\xe9\\x36\\x7c\\xa8\\x22\\x78\\xd6\\xe4\\x64\\xf8\\x2f\\x7d\\x30\\xc8\\x70\\x3d\\xf4\\x68\\x5c\\x58\\xe1\\x78\\xda\\x3a\\x85\\xb5\\x3f\\x63\\xb7\\x62\\x59\\x45\\x1f\\xa0\\x26\\x05\\x35\\x4b\\x37\\xe7\\x5a\\x63\\x5d\\x5f\\x14\\xf4\\xa4\\x08\\x3e\\x65\\x77\\xea\\xd4\\x65\\xf9\\x38\\x72\\xae\\x16\\xbb\\xea\\x7e\\x7f\\xca\\xb8\\xf5\\x7b\\x67\\x38\\xa4\\xca\\xa0\\x1c\\x09\\x6c\\x10\\x35\\xbc\\x63\\x1f\\x3e\\x18\\xed\\x38\\xf0\\xc6\\xd6\\x18\\xbc\\xe9\\xb7\\x1b\\x68\\xb5\\x32\\x32\\x74\\x07\\x6a\\x01\\x6b\\x02\\x2e\\x41\\x4d\\xdc\\xfc\\xa9\\x74\\x68\\x2b\\xa0\\xc1\\xf6\\x44\\x20\\xc6\\xbe\\x44\\x52\\x62\\x0c\\x2d\\xac\\x09\\x6a\\x89\\xed\\xbb\\xa8\\xca\\x50\\xc1\\xa0\\x46\\x90\\x34\\xa8\\x69\\xfd\\xd8\\x0a\\xe8\\xb4\\x12\\xf7\\x9a\\xe0\\xaa\\x1f\\x91\\x52\\x1f\\x55\\xee\\xa4\\x69\\x56\\x8b\\x89\\xeb\\x50\\x66\\x93\\xab\\x9a\\xd8\\x3e\\xd6\\xcb\\x03\\xef\\x38\\x35\\xd9\\x1e\\x4b\\x53\\x4f\\x60\\x0d\\x25\\x3a\\xae\\x3a\\xd9\\x8b\\x2e\\x97\\xb1\\xc8\\x6a\\xba\\x1e\\xaf\\x91\\x35\\xdd\\xd1\\x5b\\x84\\x95\\x9d\\xdf\\xcb\\x4b\\x0b\\x34\\x75\\xb0\\xc1\\x49\\x19\\x2b\\x70\\x67\\x6e\\x77\\x4c\\x28\\xc7\\x76\\xcd\\x2d\\x3c\\x3f\\x4d\\x42\\xef\\xdd\\x40\\x29\\x8d\\xef\\x48\\xa6\\x4d\\x6f\\x1a\\x0d\\x6d\\x10\\xa1\\x40\\x97\\xf8\\xad\\x20\\x9f\\x73\\x86\\x77\\x2d\\x25\\x8f\\xa1\\x4a\\xb8\\x9b\\x7a\\x1c\\x9e\\x5c\\x88\\x93\\x93\\x25\\x75\\xdc\\xb4\\x19\\x9f\\xaa\\x88\\xeb\\x90\\xfb\\x0b\\xce\\x8f\\xf4\\x9c\\xaf\\xc6\\x08\\x62\\x7b\\x04\\xae\\x25\\x0f\\x6b\\xb3\\x17\\x2c\\x2b\\x4e\\xd6\\x96\\x54\\x25\\x5c\\xf1\\x89\\x0d\\x05\\x33\\xfc\\x28\\x49\\x09\\x2b\\xb4\\x54\\xa3\\xa2\\x4b\\xe6\\xcd\\xf4\\xe4\\x13\\x7c\\xee\\xee\\x67\\x1e\\x51\\xa3\\xdc\\xaa\\xb5\\x1a\\x7c\\x06\\xd6\\x59\\xdc\\x60\\x24\\xd7\\x67\\x1a\\x65\\xf9\\x3e\\xa4\\xd6\\x6b\\xde\\x32\\x1a\\x9f\\x52\\xb6\\x72\\x7c\\xbb\\xb9\\x6c\\x8e\\x53\\xf4\\xae\\xfe\\x31\\xda\\x67\\xf1\\xca\\x52\\x06\\xba\\xe4\\xe1\\x77\\x05\\xfc\\x34\\x85\\xf7\\x2c\\xfe\\xa1\\xec\\x8f\\xaf\\x22\\x41\\x5f\\x6d\\x8f\\xd6\\x2d\\x00\\x8e\\x08\\xfb\\x44\\xba\\xc1\\x1c\\xee\\x4f\\x5f\\x6b\\x91\\xc9\\x78\\x86\\x93\\x93\\xb0\\xc1\\xbc\\xb6\\x59\\x7c\\xfb\\x33\\x54\\x6a\\x95\\x19\\xab\\xb1\\x48\\xa6\\x81\\xa2\\xc6\\xf5\\x7d\\x51\\x28\\xc7\\x7b\\xdb\\xfd\\xb0\\x78\\x7d\\xff\\x95\\x58\\x6d\\xc7\\xe1\\x38\\x1d\\xf9\\x3e\\xe2\\xd1\\xa1\\x38\\x46\\x15\\xb1\\x4b\\xdc\\x57\\x83\\x2f\\x9a\\x55\\xa6\\xc7\\xa7\\x2e\\x27\\xe8\\xcd\\x27\\x70\\xc7\\xb3\\xf7\\xf9\\x82\\xef\\xef\\x83\\x11\\xbd\\xf4\\xec\\x48\\xd8\\x0e\\x0e\\xbd\\xb6\\x89\\xfb\\x0a\\xb4\\x50\\x03\\xee\\x0c\\x86\\x42\\x5f\\x4b\\x3d\\xc8\\x45\\xe7\\x2e\\x07\\xed\\x00\\x8f\\x74\\x08\\x31\\xc9\\x53\\x10\\xbc\\xbe\\x42\\xea\\xee\\x53\\x91\\x23\\x4e\\xef\\xfc\\x3a\\x64\\xe9\\x80\\xbc\\xc9\\x06\\x6b\\xef\\x60\\x87\\x95\\xe3\\x95\\x6d\\xa5\\x06\\x17\\xb6\\xb5\\xdf\\x61\\x05\\x5d\\x67\\x73\\xe3\\xc3\\x3a\\xec\\x72\\x25\\x3d\\xf8\\xc3\\xae\\x7f\\x44\\x74\\x0a\\xb4\\x63\\x4c\\xb6\\x39\\x58\\x27\\x43\\x6d\\x8c\\xfc\\xec\\x41\\x66\\x4e\\x36\\xdb\\x8b\\xea\\xea\\x8f\\xda\\xc2\\x5f\\x29\\x24\\x85\\x84\\x25\\x41\\x5b\\xf3\\x83\\xe5\\xc9\\xee\\x47\\x91\\x49\\xa0\\x7b\\xcd\\x52\\x87\\xa1\\xe4\\xbb\\xb9\\x8d\\x47\\x0a\\x3d\\x6d\\x89\\xf7\\x25\\x25\\x96\\xaf\\xa5\\x8d\\x08\\xd3\\x95\\x15\\x21\\xb2\\x33\\x71\\xed\\xb6\\x04\\xbc\\xc3\\xd4\\x3c\\xc4\\x03\\xb6\\x1c\\xfe\\xcf\\x99\\x3f\\x5c\\x47\\x88\\x5a\\xcd\\x48\\x8f\\xe8\\xd7\\x23\\x3f\\x67\\xbf\\x65\\x2e\\x46\\xae\\x2d\\xf7\\xf3\\x72\\xa2\\x7f\\xbe\\xd5\\x51\\x55\\xaa\\xc2\\x4d\\xbd\\xf7\\xbb\\x9f\\x90\\x0f\\xe9\\x6d\\x32\\xe0\\xbf\\xed\\xe5\\xb3\\xea\\xf2\\x6e\\xbb\\x9e\\x8c\\x84\\x76\\xcf\\xa0\\x3d\\xa5\\x2d\\xcb\\xa5\\x72\\xda\\xed\\x97\\x0f\\xaf\\xf0\\xd9\\xb9\\x1b\\x2c\\x3b\\x53\\x5e\\x64\\xb0\\x19\\x9c\\x15\\x4e\\xa8\\x76\\xb9\\xd4\\x5a\\xec\\xe8\\x1d\\x4d\\x15\\x1f\\x8f\\x29\\x8d\\xc4\\xfc\\x9c\\x35\\x73\\xd7\\x1d\\x0a\\x11\\x99\\x78\\x8a\\xee\\x31\\x2c\\xa3\\x9e\\x38\\x9e\\xee\\xee\\x94\\xbb\\x16\\xe0\\xc0\\x63\\xa3\\x69\\x27\\xe6\\x7c\\x1c\\x37\\xa9\\x47\\x7e\\xe6\\x78\\x0c\\xa4\\x9f\\x5a\\x84\\xbd\\x48\\x74\\x20\\x39\\x13\\x58\\xc5\\x63\\x3c\\xf6\\xb1\\x5f\\x4c\\xab\\x32\\x44\\x18\\xb2\\x92\\x21\\x05\\xe7\\x32\\xa8\\x19\\x44\\x15\\xb3\\x08\\xd3\\x5c\\x60\\xb6\\x92\\xf2\\x1a\\xda\\xdb\\xc3\\xf1\\xd3\\xcf\\x43\\x6e\\x50\\x43\\xd3\\x65\\x1d\\xf6\\x08\\x5e\\xd3\\x22\\x6d\\x92\\xec\\xbb\\x1a\\x6e\\xd9\\x3e\\x53\\x29\\x48\\x6c\\x63\\x5c\\x10\\x55\\x9e\\xd4\\x83\\x7d\\x82\\xb9\\xd8\\x47\\x3d\\x37\\x5a\\xc9\\xdc\\x59\\xf8\\x45\\xe7\\xf6\\x7e\\xbd\\x49\\xb9\\x19\\x66\\xd5\\x85\\x77\\xe2\\xac\\x78\\x06\\xc3\\x68\\xc3\\xbe\\x53\\xc6\\xfd\\x87\\x72\\x04\\x33\\xd2\\x9f\\xc4\\x0e\\xc7\\x9f\\x84\\x7a\\xd1\\xb5\\x98\\x51\\x6a\\x18\\x13\\x91\\x82\\xa2\\x52\\x19\\x11\\x15\\x4f\\xd9\\x34\\xef\\xb5\\x10\\x50\\xd2\\xe9\\x6f\\xa4\\x69\\xeb\\x72\\x98\\x8f\\x2c\\xa3\\x82\\xc5\\x61\\x31\\x7b\\xf9\\x2a\\x5b\\x07\\x69\\x97\\x53\\xff\\xa9\\xf5\\x31\\x18\\x8f\\x2c\\x24\\x32\\x12\\x06\\xf6\\x1c\\x83\\x7b\\x4f\\x5a\\x5d\\x01\\x63\\x7c\\xb9\\x52\\x4b\\x5b\\xb9\\x4b\\x6f\\x28\\xcd\\x8c\\x6c\\xd4\\xdf\\x9a\\xb6\\xb6\\xb5\\x68\\x5a\\xfa\\x03\\xef\\xae\\x7c\\x20\\xf1\\x77\\xfd\\xf1\\x2a\\x91\\xf7\\xb4\\x68\\x99\\xd5\\xa4\\xf3\\xd7\\x6b\\x7f\\x18\\x2a\\xd4\\x4f\\x1b\\xca\\x1f\\x0c\\xde\\x70\\x2b\\x8f\\x06\\xd2\\x28\\x46\\x32\\x96\\x92\\xa9\\x3a\\x9a\\x09\\x78\\x7b\\x7c\\x61\\x0c\\x8f\\x9d\\xef\\x2b\\xef\\xee\\xf6\\xe2\\x8e\\x75\\xfa\\xf1\\x87\\xa9\\x67\\xdb\\x72\\x67\\xa4\\x09\\x1b\\x03\\xe7\\x90\\xfb\\x62\\x95\\xb6\\xbd\\x20\\xc5\\x45\\xc9\\xfb\\x42\\x75\\x43\\xbf\\x04\\x0d\\x9d\\x84\\x43\\xab\\x16\\x8c\\x2a\\x55\\xa9\\x65\\x8a\\x0c\\x0d\\x0e\\xad\\x1e\\x7d\\x38\\xde\\xaf\\x37\\xf8\\x26\\x13\\x9c\\x5c\\xbb\\x8b\\x09\\x5a\\xaf\\x6b\\x92\\x1c\\x87\\x36\\x9e\\xfb\\xee\\xfe\\xd2\\xe8\\x50\\x96\\xd6\\x19\\x9c\\xaf\\xc0\\x9e\\x85\\x81\\xf5\\x87\\x98\\x9d\\x32\\xd5\\xa5\\x91\\x44\\x17\\xf4\\x80\\x50\\xd3\\x1c\\x08\\x3c\\x4c\\xde\\xe6\\x52\\x17\\xbf\\x5c\\x36\\x86\\xcb\\x2e\\xb9\\xfd\\x79\\x5c\\x62\\xdb\\x39\\xe1\\x3a\\x59\\xa4\\xf3\\xfd\\xd2\\xf8\\x8d\\xf6\\xf1\\x66\\xdd\\x4e\\xbb\\x8c\\xf6\\x1e\\xb4\\x5d\\x20\\x17\\x72\\x6e\\x16\\x40\\xf3\\x8e\\x37\\xa0\\x02\\xbf\\x77\\xc2\\x16\\xcc\\x30\\x9f\\x9b\\x7b\\x0a\\x13\\xca\\x88\\x07\\x52\\xc8\\x70\\xc1\\x8c\\x89\\x86\\x4c\\x4a\\x59\\x5c\\xc8\\x3a\\x20\\x31\\x30\\x79\\x01\\x4e\\xdc\\x08\\xbe\\x96\\x8b\\x39\\xf5\\xf1\\x72\\x2e\\x98\\xb6\\x1e\\x7d\\x16\\x57\\xef\\x95\\x5c\\x88\\x78\\xe7\\x79\\x18\\x71\\xd9\\x15\\x62\\x02\\x01\\x32\\x1b\\x47\\x35\\x28\\x4b\\x7e\\x67\\xc6\\xab\\xcf\\x66\\x53\\x74\\x57\\xf9\\xd5\\x80\\x3c\\xcc\\x00\\x1c\\xe8\\x0e\\x43\\xd1\\xec\\x8b\\x3c\\xf4\\x84\\x62\\x46\\x21\\x4f\\x47\\x74\\xfd\\x0e\\x31\\x4a\\xa7\\xf7\\x4a\\x3a\\xe9\\x7a\\x6e\\x4e\\xd8\\xf9\\x79\\x9b\\xaf\\xfb\\xa6\\xd3\\xef\\xed\\x88\\x18\\x0f\\xdb\\x89\\xe8\\x55\\xdb\\x37\\x13\\x21\\x51\\xab\\x0a\\xf5\\x54\\xca\\xb2\\xaa\\x6f\\x40\\xae\\xde\\x25\\x8d\\xd1\\x80\\xca\\x10\\x08\\xd8\\x52\\xaa\\x0e\\xbb\\x37\\xac\\x8a\\x82\\xaf\\xbf\\x81\\xf4\\xe0\\xdf\\xc8\\x31\\xb4\\x41\\x72\\x2d\\x9c\\x2d\\x4b\\xcb\\xda\\xfe\\x65\\x12\\x19\\x64\\x25\\x6d\\x36\\x1e\\x0c\\xbc\\x30\\xc5\\x37\\xba\\x66\\xb1\\xb9\\x13\\xaa\\x71\\x6d\\x7d\\xbb\\x43\\xbe\\xb9\\xbe\\xab\\xe0\\xea\\x7c\\x9b\\x35\\x26\\xb2\\x1b\\x08\\x58\\xb3\\xbb\\x7e\\x2b\\xbb\\x7a\\xeb\\xe7\\x99\\xd8\\xce\\xf6\\xf4\\x35\\x59\\x8a\\x1e\\xb3\\xa3\\xa9\\xa0\\x4b\\xd7\\x7a\\xbe\\x9f\\x6e\\x31\\xdd\\x9a\\x5c\\xfe\\x48\\xfc\\xa2\\xc2\\xeb\\x37\\x54\\x58\\x2b\\x34\\x81\\x59\\x58\\x1b\\xf4\\x89\\xac\\x45\\xb3\\x6e\\x29\\x69\\x3e\\xef\\x19\\xa7\\xc3\\x3f\\x9f\\xf8\\x9a\\x86\\xaa\\x9d\\x8e\\x1a\\x48\\xc7\\xb1\\x26\\xc4\\x55\\xf5\\x95\\x97\\x02\\x53\\x57\\x0a\\x80\\x2f\\x9b\\xaa\\x0d\\x17\\x53\\xc6\\x99\\xc1\\xeb\\xe0\\xa8\\xd4\\xc8\\xef\\xef\\x82\\xe7\\x3b\\x20\\x0d\\x62\\x81\\x6f\\x4a\\x4d\\x07\\xcd\\x6e\\xc3\\x31\\x80\\x58\\xea\\xe5\\x3f\\xcc\\xcd\\x1b\\xe9\\xe3\\x76\\x22\\xb8\\x9f\\xed\\x03\\xcf\\xe0\\x38\\xaa\\x67\\xb8\\xf9\\x9e\\xac\\x57\\xc3\\xef\\xb6\\x1c\\x8e\\xac\\xc0\\xf7\\x39\\x7c\\xce\\x7f\\x33\\xb1\\x93\\xe9\\xe9\\xc9\\xbf\\xf8\\x4a\\xb3\\xa3\\xdb\\x50\\x72\\xf7\\xde\\x92\\xeb\\xd8\\xce\\xee\\xd2\\x1f\\x98\\x6a\\xd8\\x5e\\x7f\\x75\\xc2\\xab\\x74\\x63\\xe8\\x52\\x7a\\xd3\\xa0\\x26\\xc1\\x6a\\xd5\\xa5\\x2f\\xab\\x52\\x44\\xad\\xcd\\x24\\xfb\\x75\\x6e\\xc2\\xe8\\x17\\x45\\xcb\\xd0\\x2c\\xc6\\x23\\x33\\x69\\x3b\\xf8\\xd1\\x44\\xd6\\xae\\x2e\\x10\\x0d\\x4b\\x95\\xc8\\x8d\\x85\\xdc\\xac\\x3a\\x75\\x11\\xac\\x36\\x87\\x97\\x84\\x37\\x1d\\x8a\\xfc\\x24\\xa0\\x32\\x8c\\x1e\\x94\\xd3\\x21\\xa1\\x3d\\x45\\xbb\\xdd\\x64\\xbd\\xb8\\x45\\xdc\\x1e\\x5d\\x71\\xca\\xe5\\x33\\x95\\x20\\x45\\xbb\\x41\\x9f\\xbf\\x11\\x24\\xdf\\x53\\xf7\\x50\\x80\\x4e\\x87\\xc8\\x4e\\xae\\xcd\\x62\\x16\\xea\\x75\\xb8\\xd7\\x1d\\x58\\x5e\\x51\\x02\\x7f\\xd4\\x3c\\x8d\\xf7\\x46\\xc9\\x09\\xfa\\x82\\xea\\x0d\\xb7\\x1a\\x6c\\x1e\\x37\\x60\\xca\\x55\\x60\\xb7\\xc7\\xf0\\x27\\x82\\xab\\xb7\\x65\\x56\\xcd\\x80\\x38\\xe7\\xe1\\x70\\xc3\\x0e\\x6c\\x72\\x41\\x6e\\x6d\\x28\\xb5\\x0c\\xfc\\xe2\\x48\\x03\\x7c\\x32\\x3c\\x84\\x19\\x07\\xf6\\x47\\x31\\x24\\x8e\\xf4\\x45\\xa9\\xca\\x24\\x49\\x8e\\x59\\xff\\xfd\\xea\\xa3\\x82\\x1c\\xb6\\x40\\x22\\xb5\\x74\\xdc\\x1d\\xa1\\xa4\\x2e\\x2f\\x21\\x38\\x98\\x8e\\xb0\\xd4\\xc0\\xc0\\x26\\x90\\x4b\\xa4\\x52\\xd6\\xb2\\xc6\\x94\\x8a\\x6a\\x01\\x6a\\x99\\x7e\\x10\\x87\\xbe\\xad\\x9b\\x24\\xa9\\x25\\xa6\\x3a\\xaf\\x1e\\xa1\\x12\\x46\\xff\\x39\\xc4\\x03\\xd5\\xdc\\x45\\x02\\xf3\\x78\\x3b\\x2a\\xa9\\x8c\\x86\\x58\\xc3\\x77\\xf3\\x00\\x1b\\x50\\xf4\\xe1\\xa2\\xa9\\x7e\\xf7\\x68\\x76\\x7a\\xbd\\x63\\x60\\x89\\x50\\xb5\\xe9\\xce\\x7e\\xd0\\x41\\x10\\x61\\x8e\\x7c\\xc0\\x77\\x81\\x83\\x6b\\x61\\x49\\x02\\x61\\x4c\\x14\\x66\\x8a\\x8a\\xff\\x07\\xa8\\xc2\\x4f\\x62\\x78\\xc8\\xf8\\xc5\\xca\\x82\\x94\\x4e\\xc3\\x45\\xa5\\xcc\\x46\\x57\\xfc\\x14\\x72\\x76\\xb9\\x56\\x0f\\xa1\\x4f\\x0b\\x57\\x0e\\xf1\\xc3\\x6c\\x1b\\x7e\\xfa\\x0f\\x88\\xd3\\x51\\x57\\x2e\\x2e\\x6c\\x2a\\x93\\x1e\\x7f\\x6d\\x6f\\x3e\\x61\\x47\\x1b\\xd4\\x2c\\xa4\\xaa\\x20\\xf2\\xf2\\x05\\x06\\x30\\x29\\x09\\x09\\xdb\\x69\\xee\\x18\\x6e\\x70\\x19\\x22\\x22\\xfa\\xc1\\x9e\\xcb\\x4b\\xcd\\x0c\\x89\\x41\\x0f\\x35\\xe9\\xbf\\x6e\\x2f\\xa7\\xa9\\xe5\\x39\\xed\\xba\\x71\\xfc\\x8e\\xe0\\x43\\xfd\\x83\\x8e\\x36\\x93\\xfe\\x96\\x13\\xc7\\x9b\\x3f\\xe7\\xf7\\xf1\\x21\\x74\\xce\\x5c\\xc2\\x52\\xf3\\x99\\xa5\\x46\\x6a\\x67\\x52\\x71\\xe7\\xda\\xc3\\xca\\xd6\\xdd\\x26\\x07\\x8e\\xdd\\x92\\xef\\x56\\xfb\\x6d\\x3d\\x54\\x87\\xcd\\xda\\xfe\\x1f\\x9b\\x3b\\xd1\\x69\\x54\\x25\\xd9\\xcf\\x01\\xe7\\xb4\\x07\\xd8\\x0a\\xe3\\x2e\\xff\\x1b\\xb2\\xd2\\xca\\x7e\\xfb\\x9f\\x07\\x99\\x96\\xa4\\xa1\\x26\\x61\\x6a\\xb5\\x92\\x62\\x8d\\xf9\\xca\\x18\\x9d\\xd4\\x23\\xe5\\x91\\xca\\xba\\x45\\x9a\\x24\\xfe\\xe8\\x42\\x53\\xcb\\x82\\x24\\xf2\\x1c\\xb3\\xe3\\x49\\x3a\\x7e\\x7f\\x2d\\xae\\x3c\\x87\\x06\\x46\\x45\\x1b\\xe7\\xb9\\x5f\\x64\\xc9\\xf6\\x08\\x94\\x29\\x6f\\x5c\\xe4\\x20\\xf1\\x39\\xb7\\x1e\\x31\\x32\\x26\\xa6\\x2e\\x72\\x74\\x13\\xd9\\xa6\\x92\\x96\\xb1\\x5c\\xb5\\xb2\\x76\\x26\\x71\\x8e\\x7a\\x03\\x0e\\x18\\xd7\\xac\\x0b\\x19\\x35\\xc8\\x9c\\xc6\\xcb\\xe5\\x6d\\x0a\\xef\\xdf\\x36\\x56\\xe0\\xc3\\xa3\\x71\\x08\\xf0\\x3a\\x7d\\x1e\\xb7\\x58\\xe2\\xd6\\xcf\\x9a\\x2a\\xec\\xf0\\xee\\x36\\x55\\xd4\\x78\\xd8\\xdc\\xc7\\x66\\xf5\\x5c\\xaf\\x3f\\x0e\\x53\\xb2\\x3a\\x7c\\xd3\\x9a\\xde\\x3e\\x78\\x50\\xc9\\x2f\\x71\\xda\\x6f\\x9f\\x1e\\x5d\\x78\\x3c\\x5d\\xd7\\x5a\\xdf\\xb2\\xf3\\x66\\x74\\x58\\xf2\\xbe\\x3e\\x5c\\x5a\\xe8\\xae\\xd7\\x5a\\xe4\\x62\\x4c\\xfa\\xa3\\xde\\x1f\\xf8\\x4a\\x5d\\x76\\x74\\x2d\\xe7\\xbe\\x03\\x1b\\x67\\x58\\xce\\x5a\\xe7\\x47\\x5d\\x3a\\x7d\\x7e\\x65\\x2b\\x99\\xdb\\x53\\x50\\x0c\\x86\\x99\\xc0\\xa5\\xc3\\x56\\x9d\\xca\\x07\\xae\\x8c\\xc8\\xfa\\xa5\\xfd\\x43\\x9f\\x93\\xce\\x27\\xcc\\xeb\\x25\\x11\\x16\\x00\\x0f\\x57\\x6f\\x0a\\xca\\x97\\x55\\x75\\xdd\\x6b\\x04\\x6b\\x3a\\x94\\x67\\x1e\\x0a\\xbb\\x56\\xd4\\xbe\\x99\\xc6\\x31\\xac\\x0e\\x64\\x22\\xcd\\x4e\\xb9\\x69\\x1a\\x95\\x02\\xe2\\xbc\\xb9\\x13\\x20\\x2d\\x41\\xbe\\x27\\x3e\\xe3\\x65\\x8b\\x95\\x78\\x57\\x46\\x66\\x69\\xdf\\x68\\x9c\\xe3\\x7c\\xa4\\x0a\\xba\\x51\\x22\\x66\\xcc\\xb3\\x24\\xa2\\x64\\xd0\\x59\\x87\\x04\\xb5\\x52\\xec\\x96\\x62\\xe6\\x0d\\xdd\\xf7\\x9c\\xbb\\x50\\x8d\\xaf\\x49\\x45\\x11\\xed\\x40\\x2c\\x6c\\xb7\\x78\\x16\\x78\\xff\\xe6\\x70\\x39\\xe4\\x7c\\x53\\x16\\xe7\\x7c\\xc8\\x72\\xff\\xfe\\xc0\\x6f\\xa8\\xb3\\x8a\\x9a\\x43\\x3f\\x25\\x5b\\x45\\x34\\x60\\xf4\\xe3\\xe6\\x77\\x8f\\x63\\x7a\\xb3\\x85\\x69\\x78\\x46\\x23\\x07\\x94\\x7f\\x2e\\x52\\xca\\x0f\\x65\\x0d\\x5c\\xc9\\xa3\\xcc\\x5b\\xee\\x22\\xe0\\x09\\x76\\xee\\x63\\xb1\\x28\\x44\\x45\\xb8\\x20\\x3b\\xda\\x69\\x4c\\x8d\\x2c\\xa8\\xd8\\x6b\\xa3\\x2f\\xde\\xed\\x91\\xee\\x14\\x71\\xde\\x2a\\x87\\xc3\\x1e\\x72\\x89\\x4e\\x34\\x39\\x29\\xd8\\x8d\\xfd\\x26\\x16\\xaa\\x25\\x2f\\x4f\\xdc\\x66\\x1d\\x3a\\xa3\\xab\\x3c\\x41\\x3b\\x5d\\xef\\x20\\xa8\\x97\\xeb\\xd6\\x92\\x9a\\x11\\x30\\xc8\\x53\\xfe\\x7d\\x55\\x62\\x22\\xe6\\x23\\xf1\\xb7\\xfa\\x53\\x93\\x79\\x01\\x3d\\x58\\x48\\xd1\\xf0\\x80\\x84\\x93\\xfe\\x60\\x69\\xae\\x2b\\xa8\\x30\\x64\\x8a\\xf3\\xa9\\x2e\\x07\\x3d\\x30\\xb9\\x5e\\xfe\\x2d\\x95\\x81\\xf8\\xfd\\xb9\\x24\\x7a\\x26\\xa3\\x94\\x24\\xec\\xbd\\xb9\\xa6\\xfb\\xfe\\x6a\\x63\\xfb\\x3d\\x67\\x66\\x38\\x0a\\xd7\\x3e\\xfa\\xeb\\x1d\\x33\\xe7\\xe4\\x3a\\x3d\\xc8\\x9b\\x8e\\x4e\\xaf\\xed\\x32\\x9a\\xcd\\xf7\\xad\\xde\\x61\\xa8\\x43\\x07\\x12\\x02\\x12\\x61\\xc3\\x9e\\xdd\\xdd\\x61\\xce\\xe3\\xf8\\x47\\x51\\xc1\\x4a\\x62\\xb0\\x2d\\xc1\\xf7\\x68\\xde\\x0c\\xc2\\x84\\x53\\xcb\\x0c\\x0e\\x8f\\x83\\xe1\\x0a\\x88\\x57\\x36\\x76\\x43\\xbb\\x90\\xfb\\x50\\xd0\\x56\\x4d\\xf7\\x63\\x1d\\x75\\xa5\\x16\\xaf\\xdd\\xc3\\x49\\x85\\xe7\\xe3\\xba\\x96\\xef\\xe1\\x3f\\x5b\\xc9\\xf4\\x01\\x2e\\x87\\xde\\x93\\xd3\\x2e\\x5c\\xac\\xb2\\x6c\\x2a\\xe4\\x1d\\xae\\xa2\\xeb\\xc1\\x39\\xc8\\x4b\\xce\\x04\\x77\\x88\\xbf\\xa2\\xd6\\x93\\xbb\\x47\\x1e\\x6b\\x41\\xab\\xcb\\xc2\\x50\\x0d\\x2e\\x1a\\x22\\x7f\\x89\\x05\\xe4\\x62\\x63\\xd4\\xed\\x3b\\xef\\x4f\\xc2\\x0a\\xe6\\xdd\\xa0\\xf6\\x08\\xb4\\x6d\\x16\\xcb\\x08\\xa4\\xf5\\xd2\\x74\\xc1\\x70\\x26\\xe5\\x2c\\xc7\\x58\\x6d\\x2b\\x2c\\xcb\\x4c\\x0b\\xee\\x96\\xcd\\x6c\\x2d\\xa1\\xd5\\xd4\\xeb\\x14\\xb9\\xe0\\x8e\\x29\\xfb\\xc5\\xb7\\xc2\\x73\\x9b\\xf2\\x89\\x3a\\x42\\xb3\\xa6\\x42\\x1a\\x44\\xa8\\xf3\\xb5\\x13\\x63\\xaa\\xf9\\xcd\\x92\\x25\\x1c\\xdc\\xe9\\x6b\\x02\\x58\\x5d\\x39\\xed\\x30\\x55\\xb8\\x5a\\x6b\\xbd\\x31\\x60\\x3b\\x2a\\xf6\\x74\\x74\\xc5\\xab\\x5c\\x2d\\x6c\\x75\\xd7\\x60\\x76\\x16\\xcf\\x6a\\xfb\\x1a\\xc1\\x90\\xa6\\xd2\\xcf\\x50\\x23\\xea\\x07\\xa4\\x25\\xd1\\x40\\xd0\\x9f\\x47\\x11\\xdc\\xf0\\x19\\x38\\x7f\\x69\\xd0\\x80\\xd5\\x98\\xdf\\xe8\\xfb\\x63\\xe2\\x1b\\xb9\\x37\\x37\\x07\\xf3\\x4b\\x27\\x7f\\x10\\x92\\x8a\\xce\\x5d\\x36\\x82\\xd1\\x14\\x6d\\x3c\\xde\\xbe\\x89\\xbd\\xed\\x3c\\xfe\\x60\\x9b\\x8d\\xeb\\xf9\\xce\\x88\\x9e\\x27\\x78\\x7f\\xbe\\x7e\\x3b\\xd0\\xbb\\xec\\xf0\\xcd\\x20\\xfb\\x71\\x2e\\x16\\x83\\xcf\\x64\\x31\\x9f\\x3a\\x97\\x52\\x85\\x49\\xe2\\xb2\\xf1\\xf9\\x1e\\x84\\x68\\xc1\\x56\\x7e\\x36\\xf0\\x20\\xfa\\xc9\\xe2\\xfd\\x3b\\x6a\\xfe\\xea\\x8d\\xe0\\x4d\\xc7\\x19\\xb2\\x49\\x91\\x29\\xab\\x78\\xa7\\xaa\\x87\\xfe\\x3a\\x8c\\x78\\x83\\x6d\\xdc\\x48\\xac\\x3a\\x8d\\xe9\\xfb\\x6d\\x29\\x45\\x3a\\x96\\xcd\\xc6\\x8b\\xe0\\x94\\x59\\xcf\\x1c\\x89\\xa7\\xf2\\xa9\\x2a\\x40\\x5b\\xce\\x1d\\x2a\\x02\\x82\\x3a\\x71\\x33\\x57\\xd5\\xd8\\x56\\x71\\x22\\x00\\x3e\\xdf\\xa0\\xf4\\x66\\xd5\\x02\\x00\\x37\\xef\\x2d\\x4a\\x32\\x7c\\x22\\xa7\\x02\\xc7\\xc0\\x16\\x57\\x88\\x4c\\x83\\x9c\\x55\\x74\\x28\\xac\\x5d\\xff\\x2a\\xdd\\x4a\\x8a\\x70\\xf5\\x5b\\xa9\\x2a\\xc6\\xe9\\xc2\\x4e\\x27\\x88\\x4a\\x65\\x5c\\x15\\x23\\x01\\xe5\\x65\\x5f\\x65\\x53\\xe8\\x18\\x40\\xb5\\xc8\\x42\\x86\\x99\\x8f\\x67\\x2a\\x0e\\x3c\\xe2\\xeb\\x3e\\x78\\xba\\xd2\\x79\\xcf\\x7a\\x06\\x92\\x08\\xf4\\xbc\\x37\\xba\\xa2\\x13\\xc9\\x69\\x58\\x19\\xe8\\xbd\\x46\\x3b\\x49\\xe5\\x9c\\x2f\\xf1\\xb3\\x4f\\x75\\x59\\x5e\\x0c\\x1d\\xee\\x97\\xee\\xad\\x3c\\x1f\\xaf\\x37\\xc7\\x28\\xe4\\xd4\\xeb\\x9f\\x58\\x3f\\xf9\\xcd\\x95\\x83\\x6b\\x38\\x99\\x56\\xef\\x87\\x2b\\xa8\\x2a\\x3a\\x30\\x75\\xb7\\x52\\x26\\x92\\x7f\\x18\\x57\\xb3\\xeb\\x6c\\xf2\\x1b\\xef\\x1b\\xa3\\x1f\\x19\\xc4\\x61\\x60\\xd3\\xa1\\x9a\\x9f\\xea\\x94\\x8c\\x96\\x75\\x48\\x46\\xa9\\x79\\xf6\\x0b\\xd9\\x2d\\x99\\x9d\\x3b\\x9d\\x54\\x0d\\x83\\x8c\\xae\\x8a\\x38\\x67\\xbf\\x84\\xab\\xf3\\x4b\\x17\\x72\\xea\\xda\\xe0\\x5f\\x5b\\x1b\\xd3\\x1e\\x59\\x4c\\x59\\x93\\x94\\xa5\\xc1\\x17\\xed\\xff\\xaa\\xdb\\x01\\xd9\\x3b\\xfa\\xfb\\x88\\xac\\xfc\\xd5\\xf3\\xf8\\x53\\x92\\xe6\\x49\\x38\\xd4\\x99\\x98\\x6b\\x63\\x1d\\x7d\\x37\\x92\\xf0\\xdb\\x48\\xcd\\x85\\xbc\\x99\\x8a\\xb3\\x28\\x70\\xf2\\x1c\\xc9\\x72\\xf4\\x62\\x98\\x77\\x54\\xfa\\x41\\xa9\\x65\\x1d\\x9e\\x68\\xf7\\xdb\\x5e\\x1c\\xbe\\xad\\xd6\\x4c\\xba\\x0a\\xd6\\x42\\xc4\\xfe\\x17\\xf9\\xa0\\xab\\x84\\x42\\x84\\x8c\\x7f\\x7f\\x9d\\x11\\xf4\\x02\\x46\\x2b\\x05\\x7f\\x37\\x3a\\x85\\x25\\x2f\\x3d\\x3f\\x39\\x5c\\x17\\x9a\\xe8\\x62\\xed\\x3c\\xd0\\x11\\xf8\\xef\\x40\\x6c\\xab\\x96\\xa9\\xec\\x93\\x46\\x70\\x83\\x22\\xb1\\x2c\\x17\\x8b\\x79\\x52\\x58\\x1b\\xc2\\xc6\\xa9\\xe0\\x03\\xd1\\x3a\\x71\\xc4\\xa1\\xa0\\x17\\xea\\x34\\x23\\xe7\\x64\\xa3\\xc2\\x8e\\xad\\xe1\\x12\\xbf\\x62\\xd1\\x6e\\xd4\\x3b\\xe3\\x3d\\xb2\\x5b\\xbf\\x7f\\x9e\\xd5\\x75\\xfc\\xfa\\x4d\\xb4\\x59\\x89\\x7a\\x37\\xdf\\x26\\x3c\\x0a\\x83\\x4e\\xb3\\xbd\\xf6\\x38\\xb5\\x73\\xd2\\x22\\xb0\\x23\\xf1\\xf1\\xb6\\xed\\x0f\\x66\\xb2\\x1b\\xfe\\xaa\\x9e\\x6f\\xfc\\x57\\xd4\\xd3\\x99\\xa3\\x2e\\x5b\\xee\\x12\\xa8\\x52\\xb5\\x3b\\x6f\\x82\\x4d\\xdb\\x20\\x92\\x49\\x71\\xf1\\xa0\\x80\\x63\\x3d\\xf6\\x49\\x23\\xff\\x4b\\x05\\x85\\xdb\\xa7\\xe7\\xbf\\xb6\\xa1\\x7d\\xa9\\xfe\\xa9\\xda\\x95\\x58\\xd9\\x40\\xf1\\x00\\xe6\\x39\\x65\\x66\\xc3\\x2a\\xd3\\x6c\\xf1\\xbd\\x97\\x99\\x83\\x17\\x39\\x41\\xda\\xa3\\x90\\x4d\\x84\\x55\\x09\\x55\\x06\\xc3\\xa0\\x06\\xe6\\x34\\xe6\\x8d\\xe5\\xee\\x42\\x7c\\xe7\\xee\\x0c\\x0c\\xbb\\x6c\\x4e\\x8f\\x03\\x1d\\xa5\\x62\\x1b\\x4d\\x4f\\x5d\\x9b\\xa9\\x36\\xb0\\x81\\xa6\\x63\\x89\\xf7\\x12\\x9b\\x2d\\x4e\\x9b\\xe1\\xe1\\x28\\xa6\\x33\\x48\\x84\\xca\\x0a\\x1c\\xeb\\xd5\\x45\\xd4\\x30\\x92\\x2f\\xa2\\x4f\\xc8\\x73\\x49\\xd2\\x14\\x94\\xa3\\xd1\\x70\\x99\\xdb\\x62\\x9d\\x5b\\x69\\x99\\x8e\\x6a\\xe1\\x05\\xdb\\x33\\xac\\x74\\xd7\\xa4\\x85\\x74\\xd7\\x3a\\x08\\xa3\\x5f\\x5d\\x1a\\x05\\x09\\x0f\\x34\\xe9\\x5f\\xa9\\xab\\x72\\xee\\x0e\\xb0\\x5b\\xe5\\x7a\\x4d\\x22\\x39\\xe2\\x2d\\x43\\xd3\\x6b\\xed\\x49\\x6b\\xb5\\xf7\\x41\\x55\\xfd\\x06\\x0b\\xe7\\x24\\xa8\\x6a\\x10\\x94\\x4b\\xb6\\x47\\xbc\\x61\\x6d\\x51\\xdb\\xb2\\x2c\\xa4\\x85\\x26\\x85\\xcc\\x2d\\x6e\\xc5\\x8c\\x23\\xb7\\x70\\x5d\\x99\\xd8\\x71\\x5a\\xcc\\x4a\\x85\\xd9\\xcb\\x63\\x1c\\x72\\x3e\\xd6\\x53\\x77\\x53\\x29\\xba\\x6e\\x31\\xfc\\x25\\xc3\\xca\\x9a\\x2c\\xb9\\x46\\xe0\\xc2\\x33\\x08\\xa7\\xd7\\xa8\\x6a\\x74\\xdd\\xb6\\xab\\x95\\x65\\x13\\x87\\xa4\\x52\\xa5\\x9b\\xde\\xf6\\x1e\\xa5\\x66\\xd7\\x48\\xd5\\x6e\\xc9\\xb5\\xb2\\x2f\\xeb\\xce\\x7e\\x89\\x09\\x4b\\x83\\x27\\x2b\\xcc\\xe4\\xcf\\x56\\xe5\\x78\\x7e\\x0c\\x93\\x63\\x0a\\x1c\\x21\\x56\\x4c\\xd7\\xdb\\x85\\x9d\\x5e\\x4c\\xa4\\x65\\x5e\\x4a\\x2a\\xbd\\x55\\xe2\\x22\\x8f\\xa8\\x4d\\x68\\x23\\x0d\\x0f\\x95\\x2e\\x4a\\xbd\\xcc\\x9a\\x64\\x13\\x15\\x66\\x46\\x25\\xc2\\x0c\\x39\\x27\\x7e\\x3c\\x99\\x96\\x0e\\x4e\\x50\\x25\\xe9\\x6e\\x4f\\x9f\\x19\\xa3\\xbc\\x0d\\x27\\x81\\x81\\x5e\\xf0\\xb8\\x3e\\xdb\\x1e\\x13\\xc9\\x8f\\xe7\\x4e\\xdb\\x7e\\xb4\\x60\\xf8\\x48\\xff\\x46\\x30\\xb7\\x5f\\x57\\xdb\\x78\\x66\\x38\\x7a\\x0c\\x3e\\xf3\\x79\\xf6\\x71\\xdb\\x28\\xe7\\xab\\xda\\xcd\\x8c\\x0d\\x0a\\x8b\\xf3\\xad\\x5c\\xa0\\x3c\\x26\\x3b\\x3d\\xd4\\x56\\xa2\\xa6\\x1f\\x62\\xce\\x7d\\xa7\\x64\\x56\\x88\\x10\\x92\\x25\\x67\\x60\\x45\\x2a\\x4d\\xf3\\x88\\x77\\x70\\xe0\\x0b\\xb3\\xd2\\x21\\x64\\x84\\x93\\x88\\x6e\\xda\\xc7\\xa8\\xb1\\x9f\\x16\\x8a\\x66\\xbc\\x89\\x4f\\x7a\\x24\\x67\\x94\\x32\\x2a\\x73\\x82\\xac\\xb6\\x0a\\x62\\x50\\x7d\\x4d\\x6e\\x63\\x27\\xb4\\x06\\xc7\\x07\\x85\\x2b\\x23\\x21\\x9a\\x3c\\xa0\\xc7\\x46\\x12\\xb4\\xba\\x9b\\x7f\\x99\\xfa\\x44\\xa6\\xbe\\x6a\\x0a\\x4f\\x1a\\x4f\\xee\\x14\\xb9\\x13\\x8b\\x4e\\x46\\x9a\\xc9\\x65\\x18\\x99\\x16\\x8d\\xf3\\xd4\\xfc\\x58\\xd1\\xe6\\xd8\\x0b\\xf9\\x10\\x9d\\x5a\\x77\\x98\\x1b\\x02\\x33\\x73\\xed\\x25\\x74\\xb5\\x36\\x78\\x48\\xf6\\x3f\\x0e\\x2d\\x22\\x47\\x98\\x3c\\x59\\x62\\x93\\x2f\\x75\\xdb\\x77\\x80\\x17\\x1c\\xfc\\xaa\\xa4\\x6d\\x98\\x2e\\xe5\\x3a\\x90\\x79\\x74\\x85\\xac\\xfb\\x47\\x68\\xba\\x3a\\x15\\x0f\\x2b\\xe5\\x91\\xaa\\x6b\\xcf\\x82\\xe4\\x83\\xf0\\xaf\\x33\\xf0\\x3a\\x0a\\x1b\\x65\\xd8\\x1b\\x24\\xbe\\x06\\x53\\xf2\\x33\\x72\\x78\\x4f\\xc6\\x53\\xfa\\xe3\\x85\\x6e\\xd1\\xf9\\x4f\\xaa\\x7e\\xde\\xaf\\x8e\\x19\\x04\\x03\\x8c\\x2c\\xea\\x27\\xbb\\x65\\xe4\\xe6\\xe2\\xa7\\x8c\\xd1\\x39\\xcf\\x75\\x07\\xfe\\xd4\\xc7\\x96\\x9e\\xdb\\xae\\x42\\xc4\\x3c\\xb9\\x3e\\x05\\xca\\xd3\\xb1\\xf3\\x48\\x66\\x2c\\x57\\x25\\x4b\\x6e\\xfa\\xbe\\xe6\\x7a\\xf7\\x20\\x19\\xa7\\x3e\\xf7\\x46\\xa1\\x41\\x48\\x28\\x2a\\x5b\\xac\\xb4\\x1b\\x0c\\x9c\\x86\\xb8\\xba\\xc3\\x27\\x53\\x9d\\x55\\xfd\\x74\\x0f\\x30\\x31\\x78\\xdc\\xb4\\x9e\\xf5\\xb9\\xe3\\xf8\\x4b\\x9c\\x87\\xae\\x2c\\x4e\\x95\\x94\\xd4\\x94\\x95\\x55\\x3a\\x6c\\x56\\x5b\\x84\\x8e\\x6b\\xf5\\x3d\\xfc\\x76\\xec\\x97\\x3e\\xb4\\x63\\xa8\\xa8\\x5e\\x04\\xa4\\x7d\\x97\\xc9\\x52\\x62\\xa5\\x8d\\xc5\\xb8\\xd5\\x1b\\x9e\\x64\\x55\\x5e\\x8b\\x33\\xfb\\x8c\\xef\\x7f\\x3b\\x41\\x2e\\x93\\xaa\\x65\\x98\\x54\\x91\\xd8\\x5b\\xb4\\x83\\xbf\\xa7\\x58\\xea\\x1a\\x7b\\x0c\\x2d\\xa7\\xbb\\x0b\\x59\\xcd\\xf4\\x14\\x37\\x4a\\x67\\x79\\x06\\x26\\xa3\\x5f\\xdf\\x9b\\x6d\\x76\\x9e\\x3f\\x9a\\x2f\\xe9\\xb8\\x19\\xce\\xe2\\x23\\xe8\\xba\\xac\\x5f\\x6e\\x14\\x50\\xba\\xbe\\xaa\\x8f\\x73\\x7a\\xce\\xdf\\xa2\\x66\\x78\\x5a\\x1c\\x16\\x17\\x2d\\x88\\x6b\\x08\\x78\\xbd\\xdf\\xec\\x13\\xd3\\xd4\\x12\\xa6\\xf6\\x15\\x1d\\x10\\x5b\\x08\\xce\\x4a\\x7f\\x16\\xf3\\xda\\x7b\\xae\\x4e\\x2c\\xfd\\x43\\xfb\\x09\\x5f\\xf4\\xf6\\x17\\x6a\\x1f\\x2a\\xe3\\x54\\xb3\\x5d\\x56\\x6f\\x77\\x0e\\x93\\x04\\x41\\xde\\x8e\\x4f\\x2a\\xf4\\x54\\x6a\\x76\\x63\\x95\\xed\\x98\\x14\\xeb\\x9f\\x2d\\x8a\\x0b\\x39\\xe7\\x41\\x97\\xed\\x45\\xe4\\x08\\x3e\\xf5\\x45\\xa3\\x63\\x00\\xc1\\x95\\x89\\x0f\\x3b\\xbb\\x61\\x58\\xb5\\x07\\x13\\xe2\\x74\\x66\\x88\\x70\\x63\\x91\\x80\\x4b\\xa9\\x05\\x91\\xcc\\x5e\\x00\\x52\\x01\\x4b\\x7e\\x10\\x25\\x98\\x79\\x79\\x7b\\x12\\x64\\xc3\\x90\\xe9\\x33\\x43\\xc5\\xd2\\xf9\\x11\\x16\\x6f\\x4e\\xfe\\x1a\\x3f\\x49\\x39\\x78\\x61\\x11\\x29\\x0f\\x8a\\x04\\x5a\\x8d\\x93\\x66\\xad\\x07\\x79\\xa7\\xc9\\xba\\x9a\\x3a\\x4e\\x29\\x2c\\x55\\xd1\\x91\\x99\\x3f\\xef\\xda\\x9f\\xf2\\xb1\\xe0\\x87\\x38\\x72\\x0c\\xda\\xcd\\xb2\\x18\\xef\\x3b\\xb6\\x35\\x0b\\xca\\x43\\x66\\xae\\xba\\xec\\x29\\x7a\\x0d\\x22\\xb4\\xe1\\x68\\x9a\\xb5\\x4e\\x8f\\x1f\\x97\\xd2\\x0b\\x7e\\x5e\\xc8\\x57\\xbe\\x38\\xf6\\x98\\x71\\x23\\x51\\x57\\xfa\\x39\\x7d\\x98\\xf0\\xd3\\x1f\\xce\\x20\\x1d\\xeb\\x7b\\xde\\xbc\\x4e\\x6c\\xf7\\x11\\x9a\\x7d\\xda\\x9b\\x08\\x93\\x22\\xdc\\x38\\xca\\xa9\\xfd\\x8c\\x19\\xe2\\x1e\\x98\\x7e\\x88\\xea\\xbf\\x2d\\x40\\x78\\x53\\x49\\x5d\\x55\\xe3\\xad\\xa2\\x4b\\x39\\x24\\xbb\\x16\\xce\\x1b\\xe8\\xa5\\xff\\x05\\x86\\xae\\x12\\x8f\\xb1\\xa6\\x84\\x4e\\x77\\x89\\xce\\x47\\xf1\\xd8\\x63\\xff\\xaa\\x6c\\xf4\\xae\\xf2\\x67\\xa7\\x38\\x60\\xf7\\xe8\\xb1\\x81\\x98\\x87\\xe1\\x7a\\x78\\x6c\\x7e\\x0c\\x13\\xc6\\x40\\xfd\\xb5\\x03\\xf5\\x56\\x93\\xa9\\x1c\\x07\\x7d\\xb1\\x11\\x23\\xd1\\x88\\x50\\x30\\x1d\\x97\\xab\\x89\\xba\\xdc\\x0e\\xaa\\x15\\x24\\x38\\x57\\x8d\\x3c\\xc8\\xbf\\x72\\xc6\\x54\\x8a\\xb9\\x84\\x63\\xec\\x23\\xd7\\x40\\x96\\x6f\\x59\\xd3\\xa0\\xc6\\x6e\\x59\\x07\\xfb\\x89\\xd7\\xa4\\x25\\x7e\\x0e\\x97\\xe3\\x02\\x63\\xd1\\xa5\\x65\\x9e\\x6b\\xee\\xfa\\x37\\x1c\\x7a\\x41\\x40\\x53\\x40\\x05\\x7c\\xa4\\x9f\\xd9\\xb9\\x12\\x4e\\xd5\\xcd\\x84\\xfd\\x12\\x1b\\x84\\x04\\x72\\xcf\\xa9\\x29\\x30\\xff\\x29\\x34\\xb3\\x38\\x2f\\xdf\\x03\\x8f\\x8a\\x38\\xee\\x5b\\x56\\x4a\\x63\\x43\\x7f\\x68\\xc8\\x37\\xbf\\xed\\x04\\x2f\\x93\\x8c\\x38\\xe1\\x55\\xb9\\xf3\\x49\\xfa\\x8c\\xba\\xb9\\x04\\xfe\\xea\\xb0\\x2b\\xde\\x69\\x48\\x47\\x91\\x6d\\xf9\\x9d\\x03\\x8c\\x99\\x27\\xdd\\x4e\\x63\\x77\\xb5\\x18\\x8a\\x05\\xb3\\x15\\xa4\\xda\\x79\\x30\\x73\\xc2\\xca\\xd9\\x07\\x85\\xb5\\x55\\xc4\\xe5\\x6e\\x5a\\x2e\\xcd\\xcd\\x27\\x1d\\x35\\x2b\\x87\\x17\\xf3\\xfa\\x63\\xd2\\xd1\\x10\\xb9\\x42\\x47\\x58\\xfa\\x88\\x52\\x21\\x83\\x2a\\x0b\\x8b\\x5a\\x83\\xba\\x9a\\xf2\\xfd\\x67\\xf4\\x07\\x4b\\x56\\xdd\\x1a\\x53\\x66\\x00\\xb1\\xf3\\x1f\\x9a\\x4e\\xd1\\x8b\\x8f\\xcc\\x86\\xb7\\xb7\\xf5\\x07\\xd1\\xbc\\xb7\\x72\\x2a\\xba\\x6c\\x96\\xcb\\x7a\\xad\\xa7\\x30\\x41\\xa5\\x4f\\x7f\\xc4\\xd3\\x36\\x3b\\x2e\\xcc\\x2e\\xbe\\x92\\xa7\\xf8\\x89\\x95\\x19\\x6c\\x1e\\xb7\\x3d\\xf1\\x8b\\xb7\\x44\\xb7\\x4e\\x47\\xf1\\xf2\\x97\\x73\\xbd\\x1f\\x15\\xe2\\xc6\\x5d\\xc1\\x47\\xa0\\xb3\\xe0\\x08\\xfb\\xbf\\xfa\\x96\\xb7\\x82\\xa7\\xdd\\xdd\\x88\\x6a\\x51\\x55\\x92\\x08\\xc3\\x31\\xf2\\x15\\xc8\\x1b\\x0a\\xe3\\xb1\\xe1\\xea\\x00\\x05\\xeb\\x35\\x93\\x56\\xf8\\x73\\xe4\\x1d\\x09\\x5b\\x16\\x66\\xb3\\x89\\xb7\\x6b\\x72\\xd2\\x65\\xbb\\xd1\\xeb\\x8c\\x09\\x4f\\x6c\\x1d\\xb3\\x0b\\x4b\\xe9\\xcd\\xc6\\xaa\\x6a\\xd1\\x39\\xb0\\x66\\xa1\\xf3\\xe5\\x61\\xfa\\x06\\xd2\\x78\\x1c\\xdc\\x53\\x77\\x5b\\xb5\\xc1\\x6b\\x2e\\xa4\\xab\\xf3\\x80\\x83\\x85\\xab\\x0a\\xe6\\x9d\\x15\\xcc\\xc1\\x69\\xda\\x56\\xba\\xe5\\x37\\x8f\\xf8\\x6b\\x2d\\x2d\\x4c\\xc8\\x92\\xc2\\xc5\\x4d\\x98\\xdd\\xc3\\x9e\\x99\\xef\\x99\\x68\\xf8\\xf3\\x11\\xd2\\x40\\xea\\xe7\\xb1\\x8f\\xe3\\x1e\\xc6\\xab\\xf6\\xf3\\x41\\x05\\xbf\\x76\\xac\\x9d\\x81\\xbd\\x2f\\xf6\\xfb\\xb3\\xe4\\xe5\\xe7\\x19\\xd9\\x5d\\x1c\\xdb\\x1c\\x43\\xcb\\x72\\x39\\xb9\\x5b\\x0d\\x4a\\xe6\\x8e\\x30\\xb5\\x48\\x8d\\x68\\x66\\x63\\x07\\x28\\x9a\\x0c\\x78\\x29\\xc0\\x65\\x6b\\xf7\\x88\\x17\\x94\\xac\\xbb\\x81\\x9a\\x9a\\xa8\\x80\\x72\\x1c\\xbf\\x4f\\xd6\\x9b\\xfd\\x01\\x1e\\xbc\\x5b\\x8b\\xa9\\x8e\\x1f\\x75\\xe8\\xc2\\x8d\\xf6\\x3c\\x65\\xaa\\xdf\\x39\\xc0\\x52\\x02\\x32\\xdc\\x62\\xf8\\x08\\x9a\\xc7\\xb6\\x47\\xf5\\x26\\x2a\\x8b\\xab\\x7d\\xc2\\x88\\xc5\\x64\\xcb\\x6c\\xb2\\xe3\\x62\\x93\\x66\\x2f\\xbc\\x5a\\x11\\x96\\x9f\\xae\\xc7\\xf0\\x30\\x95\\xb7\\xef\\x83\\x41\\xaa\\xfa\\x44\\xc9\\x65\\x9f\\xd8\\x4f\\x95\\x51\\xdf\\x85\\x11\\xdb\\x08\\x7e\\x26\\x71\\x79\\x96\\x13\\x65\\x56\\x33\\xa0\\x9c\\xaa\\x52\\xc3\\x80\\x98\\x82\\x28\\x19\\xbc\\x09\\x77\\xee\\x02\\x61\\xf9\\x2c\\x50\\x28\\x8c\\x1b\\xa1\\x40\\x77\\x2c\\xc0\\x71\\x13\\x64\\x63\\xb0\\x68\\x11\\x96\\x19\\xc2\\x0c\\xb6\\x14\\x3f\\x1b\\x1c\\x14\\xc0\\x13\\x25\\x6b\\x4c\\x53\\x34\\x80\\x04\\xef\\x26\\x03\\x61\\xdc\\x3b\\xd1\\xd6\\x7e\\x9b\\x12\\x43\\x8d\\x20\\xb0\\xbf\\xd9\\x0d\\x43\\xf4\\x93\\x59\\x26\\xe0\\x4e\\x55\\x7f\\xb6\\x6c\\xb6\\xcd\\x8c\\xa3\\xef\\xd0\\xb9\\x02\\xa7\\x64\\x31\\x4e\\x0b\\xc3\\x84\\x46\\xd1\\xb7\\xc0\\xab\\x89\\xe3\\xb0\\xc7\\xb5\\x10\\x3f\\x0e\\xda\\x2f\\x40\\xd9\\x57\\xee\\x17\\x16\\xa0\\x3d\\x49\\xe6\\x01\\x6d\\x2a\\x7a\\xbb\\x90\\x96\\xc6\\x8e\\xb4\\x89\\x14\\xb7\\x17\\xd6\\x6c\\x70\\xe7\\xa2\\xd5\\xb5\\xaa\\xfe\\x9e\\x80\\x27\\x16\\x9b\\xcc\\x71\\x1b\\x1b\\xc5\\x21\\x7b\\xae\\xfc\\x7d\\xbd\\xdd\\xd5\\x99\\x6f\\x76\\x87\\x80\\xc4\\x3d\\x70\\x3c\\x89\\xef\\x30\\x16\\x89\\x95\\xa2\\xfc\\x70\\xa2\\xaa\\xb1\\xd6\\x40\\x8e\\x2c\\xfb\\x29\\x1e\\xea\\xc1\\xbd\\x5a\\x2d\\x9e\\x11\\x4c\\x72\\xc6\\xff\\x53\\xa2\\xd5\\x24\\xc1\\x2c\\x7c\\xc2\\xbf\\xb6\\x58\\xbd\\x76\\x67\\x21\\xee\\xe4\\xf9\\xdf\\xa7\\xdb\\x9f\\xc5\\x3c\\xcb\\xa1\\xd9\\x92\\x81\\x60\\x46\\xc1\\x86\\xf6\\xf4\\x7c\\x55\\xb1\\x4d\\xd4\\xa0\\x9d\\x9f\\xdc\\xae\\xad\\xab\\xb8\\xd8\\x4b\\x58\\xcb\\xd4\\xb4\\xcb\\xcc\\x03\\xed\\x71\\x24\\x99\\x9c\\x07\\x4f\\x84\\xbd\\xc1\\x3f\\x99\\x9e\\x7e\\xf2\\x01\\xec\\xf0\\xa1\\xff\\x0f\\x00\\x60\\x21\\x9f\\xde\\xa5\\x5e\\x71\\x96\\xf8\\x7a\\x6c\\x88\\x57\\x18\\x1a\\x7b\\x36\\x4d\\x78\\xf9\\xe4\\x2d\\xa9\\xb1\\xf7\\x0e\\xd3\\x4e\\xf4\\xa5\\x3c\\x13\\xf6\\x70\\x56\\x6d\\x8d\\xfd\\xba\\x85\\x8e\\xd1\\x1f\\x10\\x14\\xe1\\x80\\x80\\xb2\\x79\\xae\\x3e\\x80\\xf5\\xfd\\xe6\\x90\\x4a\\x72\\x3b\\xaf\\x07\\x6c\\x28\\x66\\x34\\x69\\xab\\xa1\\x53\\xad\\x0c\\x36\\xe4\\x1a\\x06\\x70\\x55\\x72\\x3f\\x27\\xee\\xa4\\x72\\x4f\\x93\\x5a\\x9e\\x68\\xed\\x4c\\x77\\xa1\\xd4\\x66\\xc5\\x10\\x01\\x90\\xc9\\xcf\\x38\\x24\\x4f\\x56\\x6e\\x51\\x71\\x25\\xcf\\x1a\\x68\\x25\\xa5\\x4c\\x5a\\xe7\\x82\\xb4\\x2e\\x2a\\x2d\\x07\\x69\\xad\\x39\\x8a\\x15\\x77\\xbd\\xd9\\x93\\x96\\xce\\x63\\x81\\xac\\xc3\\x93\\x18\\x31\\xbf\\xa4\\x1e\\xe1\\x34\\x16\\xee\\x68\\x65\\x54\\xb3\\x86\\x61\\x5a\\x24\\x25\\x77\\x0c\\x4b\\xfa\\xdf\\xb1\\x65\\x98\\xfe\\x25\\xc9\\xe0\\x8e\\xf7\\x0f\\xeb\\xc7\\x3e\\x6c\\xd9\\x3c\\xfc\\x96\\xfe\\x23\\x1d\\x13\\x9b\\xda\\xca\\x1c\\x37\\x7a\\x9e\\x6e\\x04\\x59\\x8f\\x12\\x77\\xf8\\x99\\x3b\\x7a\\xc1\\x25\\x40\\xc9\\xfb\\x27\\x4d\\xbd\\x6e\\xf4\\xad\\x58\\xf0\\xcf\\xc9\\xec\\xeb\\xe4\\xf6\\x5e\\x8a\\x2a\\x21\\xa9\\xc7\\xf7\\xe4\\x1e\\x56\\x9f\\x1e\\xef\\xf4\\x65\\xba\\x20\\xb1\\xa6\\x5c\\xb6\\xa6\\x3f\\xed\\x32\\x3e\\x9b\\x05\\xb5\\x5e\\x06\\x2a\\x88\\xa4\\x65\\xc4\\xee\\x37\\x94\\x83\\xb1\\x0e\\xd9\\xcb\\x35\\x43\\x33\\x7e\\x06\\xc2\\x5a\\xbc\\xe4\\xc2\\x3f\\x5b\\x8b\\xef\\xcf\\xd6\\x92\\x76\\x26\\xe4\\xc4\\x55\\x48\\x32\\x82\\x0e\\x72\\xfd\\xd1\\xbc\\x34\\x43\\x77\\x30\\xbd\\xc1\\xd7\\xe6\\x34\\x24\\xe9\\xd4\\x3f\\xa1\\x9e\\x83\\x89\\x53\\x67\\xb3\\x38\\x3d\\xe3\\x52\\xeb\\x1d\\x56\\x9c\\x0e\\x98\\x0a\\xf2\\xd6\\xda\\x42\\xde\\x9e\\xb6\\x6a\\x1e\\x94\\x4f\\x5e\\xf4\\x03\\x47\\x4f\\x1c\\x6d\\x5e\\xf1\\x00\\x16\\xa9\\xc7\\xda\\xcd\\x4f\\xb1\\x07\\x18\\x78\\x4d\\x22\\x16\\xd4\\xb2\\x26\\xf4\\x6d\\x30\\xfd\\x08\\xfe\\x2a\\xeb\\x6e\\x31\\x1d\\x61\\xf5\\x71\\xd8\\xdd\\x62\\xc1\\xc9\\x44\\x82\\x84\\xd6\\x0f\\x2b\\xda\\x44\\x53\\x02\\xbc\\xf1\\x02\\xe4\\x97\\xcc\\x03\\x8c\\x51\\x8e\\x7d\\xc7\\x3b\\x84\\x05\\xec\\x2d\\x16\\xa6\\x00\\xbf\\x88\\x70\\xdd\\xb2\\x16\\xdd\\xc5\\xd6\\x84\\x23\\x6c\\x33\\x02\\x0c\\x51\\xc9\\x64\\x89\\x18\\xb8\\x0f\\x2b\\xcc\\x54\\x78\\xf1\\xc0\\x0b\\x09\\xe3\\xa0\\x99\\xf4\\xb0\\xde\\x5f\\xe0\\xd7\\x48\\xa0\\xbd\\x05\\xec\\xa0\\x32\\xa3\\x0a\\xc6\\xc6\\xae\\xeb\\xc4\\x31\\x53\\xac\\x9f\\x0b\\x9b\\xeb\\x1d\\x56\\x8c\\x28\\x09\\x66\\x63\\xb1\\x71\\x3a\\x62\\x1c\\x21\\x95\\xd3\\xaf\\xf2\\x40\\x9c\\x70\\xc7\\x5e\\x8a\\xf7\\x35\\x8b\\xa7\\xde\\x80\\xeb\\xdf\\x04\\xf4\\x13\\x99\\x56\\xe9\\x6d\\xcc\\x41\\xc3\\xb4\\x16\\x06\\xdb\\x2c\\x61\\x36\\x84\\xc5\\x1a\\x8a\\xb7\\xb9\\x26\\x27\\x45\\x78\\x33\\x2e\\x6b\\x72\\x76\\xc4\\x1b\\xb1\\x31\\xa7\\x8d\\xf7\\x44\\xcd\\x56\\x7b\\x34\\xfd\\x40\\xce\\x51\\xc4\\xfd\\xb1\\xe7\\x19\\x5c\\x03\\x38\\x0d\\xc0\\x77\\x20\\x26\\x2b\\xc8\\x77\\xf4\\x99\\xaf\\xe0\\xf2\\x1d\\xb3\\xbf\\x3c\\xf8\\xe8\\x07\\x8e\\xa1\\xc4\\x21\\x3a\\x2b\\xd4\\x4c\\x1e\\xea\\x4b\\x0f\\x31\\x37\\xda\\xc1\\x82\\x7a\\x29\\x6c\\x8c\\x68\\x34\\x85\\x89\\xf2\\x14\\x6c\\x2c\\x70\\xb0\\x64\\xa0\\x03\\xdd\\xad\\x14\\xe6\\x62\\xc6\\x0b\\x1c\\x79\\xc0\\x21\\x3e\\x6a\\xa0\\x8c\\x2a\\x9e\\xc4\\xb0\\x01\\x64\\x9c\\xf2\\xc7\\x9a\\x27\\x0e\\xe8\\x7d\\x1a\\xf9\\xcc\\x01\\xea\\xd5\\x7f\\x14\\x36\\x6d\\x15\\x16\\x26\\x46\\x0f\\x08\\x9b\\x74\\xd1\\x98\\x3e\\xa0\\xe7\\x6c\\x8d\\xef\\x47\\x13\\x05\\x5b\\xc9\\x0e\\x96\\xd2\\x9a\\xd3\\x3a\\x82\\xd5\\x8c\\x20\\x4e\\x90\\xaa\\xcf\\x76\\x67\\x20\\xf3\\x9a\\x12\\x35\\xf5\\x46\\x8b\\xb0\\xc3\\x5e\\xd1\\x90\\xc7\\x75\\x70\\x9e\\x0b\\xb9\\xb9\\x21\\x8d\\xbf\\x4b\\x6b\\x6e\\x1f\\x46\\x51\\x9f\\x67\\xc7\\x50\\x14\\xb8\\x7a\\x9a\\x84\\xdd\\x0f\\xa2\\x25\\x92\\xdc\\x44\\xac\\x66\\x28\\x6a\\x5e\\x44\\xcd\\x66\\xf5\\x83\\xa9\\xe8\\x2e\\xa7\\xb5\\x6a\\x2c\\x6e\\xcb\\x72\\x6a\\x6e\\x36\\x96\\x5a\\x19\\x4d\\x2d\\x9b\\x8f\\x5b\\x58\\x4d\\x6c\\x9f\\xb3\\x5e\\x64\\x73\\x1d\\xa3\\x59\\x3e\\xe9\\xd1\\x66\\x37\\x72\\xa0\\xad\\x4a\\xd3\\x82\\x56\\x33\\x4e\\xff\\xa4\\x21\\x99\\x59\\xec\\xed\\x76\\x25\\xf7\\xc2\\xbd\\x77\\x36\\xad\\xc9\\xe2\\x11\\xd6\\x6f\\x14\\x5f\\x77\\xf8\\xff\\xf7\\x75\\x33\\x79\\xde\\xee\\xba\\x69\\x39\\xdb\\xdd\\x67\\xb3\\x72\\xe1\\x6d\\x63\\xf7\\xc7\\xd7\\x7e\\x05\\x5b\\x7b\\x51\\x3b\\x6b\\x2f\\x6e\\x6b\\xed\\x25\\x49\\x6b\\xcf\\x3f\\x0b\\x9c\\xc7\\xa5\\x45\\xbb\\xeb\\xbf\\x88\\x8b\\x90\\xb3\\x5a\\xff\\x09\\x43\\x3b\\xc4\\xd7\\x3f\\x95\\xad\\x3f\\x48\\x6e\\x6c\\x63\\xfd\\x6a\\x59\\x50\\x2b\\x80\\xbd\\xd2\\xb1\\xa0\\x0c\\xf6\\x4a\\x9e\\x29\\x31\\xd5\\xcb\\x00\\x28\\x1b\\x76\\x47\\x90\\xef\\x8e\\xa0\\x0b\\x8d\\xd4\\x86\\x12\\xfe\\xae\\xa4\\x19\\x58\\xac\\x97\\x28\\x0e\\x82\\xe9\\x6a\\x57\\xd2\\xf3\\xa4\\x32\\x66\\xba\\x96\\x49\\xb0\\x21\\x82\\x11\\xb5\\x40\\x51\\xb3\\x23\\x7f\\x02\\x7c\\x1b\\xdb\\xa4\\x5d\\x3c\\x94\\xb5\\xda\\x35\\x67\\xc5\\x8a\\x69\\x2d\\xf7\\x92\\x64\\xe0\\xa5\\xc0\\x98\\x2f\\x5c\\x88\\x15\\xa2\\xa7\\x63\\x06\\x24\\x5e\\x7e\\x58\\xcb\\x01\\xe9\\x1b\\x48\\x94\\xc8\\x37\\x63\\x45\\xcb\\x73\\xb0\\xb2\\x58\\xf4\\xd2\\x0b\\x1d\\x2c\\xb4\\x14\\xc7\\x07\\x9a\\xf2\\xf9\\x58\\x1b\\x02\\xf8\\x90\\xce\\x86\\xf8\\x5c\\x79\\xb6\\x0b\\x73\\x47\\xd0\\xa4\\x67\\x45\\xf8\\x53\\x5c\\xc9\\x52\\x32\\x8a\\x7c\\x21\\x7e\\x21\\xdd\\x00\\xf2\\x91\\x78\\xac\\xb4\\xce\\x8a\\xc1\\x29\\xb3\\x95\\x8e\\xa2\\xe7\\xea\\xcf\\x2d\\xa4\\xe7\\xd0\\x73\\x17\\xea\\xcf\\xd2\\x81\\x0b\\xf5\\xe7\\xf4\\xbd\\x74\\x2c\\x1d\\x4a\\x87\\x2e\\xd4\\xeb\\xe9\\x90\\x85\\x7a\\x54\\x8f\\x2e\\xa4\\xe7\\xeb\\x0d\\x9c\\xf7\\x1f\\x30\\x09\\xa6\\x7f\\x92\\x0c\\x52\\x4c\\x3a\\x61\\xf5\\x35\\x0b\\xb3\\x97\\xc5\\x31\\x54\\x80\\xbc\\x1f\\x4a\\xf4\\xbf\\x67\\xb2\\x44\\x20\\xe2\\x47\\x0b\\x63\\x35\\x04\\xe1\\x93\\xf8\\x3a\\x2a\\x7b\\xcc\\x8a\\x57\\xca\\x2b\\x41\\x83\\x38\\x85\\xcf\\xfc\\x29\\xc3\\xc6\\x7e\\xaf\\x3f\\x82\\xcc\\x11\\xb5\\xe5\\x76\\xc2\\xd8\\x86\\xd4\\x3c\\xf1\\x24\\xc0\\xaa\\xaf\\xd1\\xe4\\xc5\\x37\\x58\\x1f\\x53\\x58\\xc7\\xea\\x18\\xf2\\x28\\xc5\\xe2\\x30\\x40\\x18\\xc6\\xe5\\x11\\x7d\\x25\\x41\\xbe\\xe1\\xc7\\x3c\\x3e\\xf0\\xc2\\x8d\\xcb\\x86\\x8c\\x40\\xc4\\x8d\\xd8\\xd4\\x7b\\xf4\\xc6\\xdb\\x87\\x5f\\xda\\x58\\x52\\x28\\x0b\\xf9\\xa1\\x9b\\x06\\xee\\x7e\\xeb\\xe1\\x8e\\xd3\\x7a\\x3e\\xf3\\x41\\x20\\x57\\x8e\\x23\\x31\\x5c\\xb5\\xf2\\x93\\xe1\\x5f\\xde\\xc2\\xf1\\x58\\xd6\\x61\\xcb\\xf7\\xc3\\x7f\\x5c\\x35\\x62\\x7d\\x0d\\x15\\xef\\x2a\\xeb\\x08\\x78\\x8c\\x5d\\x5f\\x50\\xc0\\xd0\\x3a\\xf8\\xb6\\x10\\x65\\xfa\\x86\\xf5\\x78\\x03\\xbf\\x28\\x24\\x0d\\x23\\xe5\\xad\\xbb\\xbc\\xd5\\xb4\\x20\\x2b\\x91\\x39\\xbd\\xd1\\x3b\\xdd\\xa8\\xca\\x8d\\xa6\\xba\\x7d\\x91\\x48\\xdb\\xcd\\xde\\x4c\\xe0\\xb6\\xe8\\xf8\\xfe\\x02\\x85\\xec\\x69\\x6d\\xdf\\x72\\x0d\\x93\\xa8\\xcd\\xeb\\xc9\\x65\\xeb\\xe9\\xd6\\x56\\xd7\\xf9\\xff\\x7a\\x31\\x4c\\x8a\\xb6\\x6c\\x3f\\x7f\\x93\\x49\\xce\\xd3\\x96\\x63\\xea\\xd8\\x6c\\x1f\\xf3\\xf5\\x0c\\x84\\xf5\\x64\\xb6\\xbd\\x9e\\xac\\xb6\\xd6\\x93\\xdd\\xbc\\x9e\\xb4\\x76\\x91\\x13\\x97\\x8c\\x2d\\xd6\\xf4\\x3f\\x5c\\x1a\\x9e\\xbe\\xa6\\x4b\\xe3\\x86\\xb1\\x68\\xac\\xc9\\x09\\x6b\\xf2\\x01\\x0f\\x5f\\xde\\x06\\xd5\\xdc\\x41\\x35\\x2d\\xac\\x79\\x6c\\x68\\xcf\\xc4\\xeb\\x19\\x8d\\x25\\xa2\\x11\\xe3\\x83\\x5d\\xed\\xe3\\x03\\xf0\\x33\\x1c\\x2c\\x87\\x18\\x5f\\x38\\xc6\\xcd\\xd3\\x7c\\x58\\xd4\\x27\\xb7\\xbb\\x6c\\xbe\\xa7\\x5b\\xac\\xfa\\x6d\\xd8\\xc7\\xa7\\x2f\\xf9\\x0a\\xb6\\x69\\x05\\xde\\xf3\\x6d\\xce\\x01\\x3b\\xd3\\x89\\x95\\xbe\\x2d\\xbb\\xbe\\x53\\x12\\x5d\\xdf\\xa9\\x46\\xd7\\x77\\x54\\xb0\\x3a\\x59\\x2c\\xf0\\xf4\\xce\\x6f\\x96\\x36\\x6b\\x6e\\xff\\x76\\x18\\x76\\x6d\\x73\\x13\\xb8\\x24\\x37\\xdb\\xb7\\xe4\\x41\\xb8\\xef\\x78\\x36\\xa7\\xd2\\x47\\x06\\x27\\xd9\\xcd\\x0d\\x76\\x1e\\xe2\\xc3\\xb1\\x9c\\xa2\\xaf\\x79\\xac\\x4d\\x5a\\xbc\\xa5\\x49\\x13\\x9c\\xa1\\x10\\xe6\\xd3\\x14\\xc3\\x66\\x62\\x25\\xc8\\xac\\x37\\x24\\xde\\xdf\\x74\\xfa\\x28\\x91\\x07\\x1b\\xa9\\xf3\\x3b\\x2a\\xe9\\x27\\xbf\\xd3\\x7f\\xa3\\xce\\x0d\\xf0\\x4f\\xff\\xcd\\xa4\\xea\\x47\\x7f\\x7c\\xe1\\xc5\\x1f\\xf4\\xd7\\xe9\\x7b\\xf7\\xce\\x9e\\x73\\x1f\\xaf\\x0b\\x5e\\x09\\xf4\\x9b\\x25\\x7b\\x48\\x29\\x76\\xf0\\xb1\\x55\\xb9\\x08\\xb7\\x4e\\xb1\\x26\\x4b\\x6a\\x9e\\xb8\\x58\\x6a\\x67\\x13\\xe6\\x50\\x10\\x9b\\x5d\\x4d\\xf5\\x36\\x73\\x3e\\x68\\xb2\\x1c\\x38\\x99\\x13\\x64\\x2d\\x20\\x66\\x3e\\x6c\\xc4\\x69\\x8c\\x62\\xcc\\x29\\x05\\xc9\\x2c\\x79\\x3d\\xac\\xb2\\xcf\\xa6\\x68\\x2e\\x7f\\xc4\\xa8\\xa9\\x55\\x3d\\x11\\xb5\\x50\\x89\\x9a\\x9d\\x5e\\x63\\x64\\x4d\\x3c\\xbe\\xe2\\xf3\\x12\\x5f\\x72\\x13\\x5f\\x6d\\x0d\\xa9\\xad\\x89\\x87\\xa2\\x95\\x95\\x3f\\x3c\\xb3\\xe3\\xf0\\x2d\\x74\\xf4\\x5f\\xa3\\xc3\\xb5\\xe2\\x8e\\x15\\x4b\\x7a\\xcc\\x98\\xa4\\x3f\\xbc\\x66\\x52\\xdf\\x29\\x8b\\xa5\\xae\\x9f\\x1d\\xdf\\xfd\\xe8\\xdc\\x8f\\x23\\x17\\xe9\\x5f\\xdf\\xfe\\xe8\\xce\\xb2\\xdc\\xfb\\xb2\\xab\\xc7\\x0e\\x1d\\x4e\\xf3\\xd6\\x0f\\xfb\\xe4\\xfc\\x2b\\x66\\x3c\\xba\\x99\\x95\\xc3\\x03\\xaf\\xb2\\x9e\\x6c\\xd3\\xe7\\x60\\x1f\\x15\\x93\\x6a\\xb2\\x85\\xe7\\x3e\\xf8\\xd0\\xa9\\x32\\x8c\\x1d\\x27\\xba\\xb2\\x5d\\xcd\\x5d\\xd9\\x55\\xb9\\xae\\x78\\x57\\x76\\x27\\x86\\x87\\x12\\x80\\xb5\\xc4\\xe8\\xca\\x36\\x62\\x2e\\xd8\\x95\\x5d\\xc2\\xbb\\xb9\\xa4\\x8e\\x21\\x56\\x39\\xad\\x85\\x90\\x89\\x09\\x1f\\xda\\x53\\xa2\\x68\\x81\\x02\\xb0\\x6f\\xb3\\xc0\\xd2\\xdd\\xe3\\xca\\x2d\\x2c\\x2a\\x46\\xed\\xad\\x7a\\x15\\x56\\xa2\\x23\\x62\\x89\\x8e\\x37\\x8b\\x37\\x6a\\x3b\\x3d\\xa7\\x37\\x6a\\xb7\\x51\\x96\\xc3\\xe3\\xbd\\x6d\\xb5\\x6a\\xcb\\x3f\\xec\\x6d\\xd1\\xaa\\x7d\\x13\\x0a\\x39\\xed\\xf4\\x7e\\xed\\xb9\\xaf\\xb5\\x68\\xd6\\x36\\xf5\\xc5\\xd0\\xf0\\x25\\x46\\xcb\\x76\\x02\\x57\\x1f\\xb3\\xda\\xa4\\x6a\\xcc\\x8e\\x35\\xe3\\xaa\\xa8\\x3d\\x5c\\x95\\xb5\\xc6\\x55\\xc0\\x8e\\x05\\x4b\\xa7\\xe1\\x2a\\x60\\xe0\\xaa\\xf4\\x74\\x5c\\xc5\\x71\\x54\\xd4\\xb1\\xb2\\x9a\\xe3\\x28\\x9a\\x5e\\x15\\x64\\x3b\\xf0\\x7f\\x83\\xa7\\xa4\\xf2\\x25\\xb6\\x5d\\xdb\\xc7\\x53\\xa2\\xa5\\xfd\\x01\\x2e\\x87\\xdb\\x43\\x94\\xd1\\xd5\\x2e\\x8e\\x48\\xec\\x6d\\x03\\x57\\xb2\\x0c\\xb8\\x2a\\x03\\x99\\x72\\x5f\\x32\\xae\\x2a\\xdb\\xc3\\x55\\xa8\\x19\\x57\\xb5\\x0c\\x57\\x6c\\x7e\\xeb\\xe9\\xb8\\x2a\\x37\\x70\\x55\\x6d\\xe0\\xaa\\x73\\x12\\x5f\\x95\\x27\\xf1\\xd5\\xd3\\xc8\\x57\\xa5\\x65\\x95\\x71\\xa4\\x15\\x97\\xfc\\xaf\\x91\\xd6\\x1c\\x5f\\x3f\\x1b\\x06\\x5b\\xc7\\x95\\xc4\\xb4\\x3f\\x65\\x31\\x69\\x32\\xd7\\x1a\\x27\\x2b\\xe3\\x5c\\xd6\\x8c\\x3b\\x37\\xe0\\xae\\x86\\xf4\\x22\\x07\\x93\\x71\\xd7\\xa5\\x3d\\xdc\\xf5\\x88\\xe3\\x0e\\xcb\\x3f\\x4b\\xc1\\xac\\xee\\x54\\x5a\\x05\\xc2\\xa8\\x08\\xcd\\xea\\xde\\x0c\\x99\\xb5\\x58\\x31\\x1a\\x52\\x6b\\x4f\\xc7\\x67\\xad\\xab\\x21\\xc0\\x4d\\x6b\\xf0\\x86\\x6a\\x19\\x72\\xa3\\x52\\x79\\xb7\\x10\\x47\\x6f\\x43\\x05\\x0f\\x13\\xf7\\xc1\\x60\\x7e\\x00\\x24\\x98\\x2b\\xb7\\xb4\\x0a\\xf3\\x91\\x5e\\xf4\\x47\\x53\\xd2\\x11\\xa5\\x3d\\xd2\\x31\\x2b\\x84\\x38\\xe5\\xc5\\x74\\x0c\\xad\\x5a\\x95\\x0b\\x68\\x52\\x83\\x15\\x78\\x6a\\xe0\\xac\\x90\\xdc\\x56\\xbc\\xff\\x6c\\xf0\\x3d\\xa9\\x95\\x69\\xee\\xfc\\x73\\xc4\\x2f\\x49\\x32\\xcc\\x4f\\x76\\x8c\\x63\\x5f\\x32\\xf6\\xf8\\x1b\\x80\\xfb\\x22\\xf0\\x5b\\xc2\\xe4\\xe9\\x64\\xec\\x77\\x68\\x0f\\xfb\\x95\\x09\\xec\\x03\\x06\\xab\\xc3\\x5a\\x81\\x0d\\xf3\\x92\\x54\\xad\\x61\\x98\\xc7\\x99\\xe7\\xc5\\xa7\\xa1\\xbd\\x3e\\x50\\x8c\\x11\\xae\\x22\\x07\\x7e\\xc8\\x19\\xba\\x82\\x63\\x5c\\xf5\\xba\\xd4\\x30\\x7e\\xb9\\x1a\\x3e\\xab\\x0e\\x6a\\x61\\x47\\x93\\x56\\x0b\\x9f\\x57\\x17\\x31\\xec\\x5b\\x58\\xcf\\x5b\\x98\\x4b\\xca\\xca\\xb6\\x30\\x7f\\x56\\x0c\\x1d\\x4e\\xc6\\x2d\\x86\\xd1\\xda\\xc7\\xef\\xd4\\xa3\\x8b\\x12\\x18\\xbd\\xf1\\x68\\xfb\\x48\\x9d\\x7e\\xf0\\xe0\\xc9\\x32\\x43\\x18\\xdc\\x86\\xfe\\x80\\x81\\x4f\\x79\\x10\\x93\\x99\\x75\\xa4\\x1f\\x79\\xe5\\xbf\\x93\\x9a\\x20\\x08\\x1a\\xba\\xf1\\x64\\x46\\x9f\\x60\\x43\\xd0\\x48\\x66\\xf4\\xff\\x13\\x49\\x0a\\xfe\\x40\\x43\\x17\\xce\\xd1\\x5d\\x5c\\x5a\\x4f\\x78\\x17\\xe2\\xef\\x42\\xad\\xa4\\xec\\x00\\x78\\xd3\\xb3\\x0b\\x97\\xae\\x96\\xda\\x20\\xf7\\x1f\\xdb\\xe4\\xe5\\x3e\\xdd\\xe0\\x28\\xd4\\xf1\\xbf\\x95\\xb0\\xed\\xd5\\xc2\\x9d\\x85\\xd0\\xad\\x38\\x2d\\x77\\xf2\\x67\\x02\\x58\\x32\\xb7\\xce\\xa7\\x88\\xa4\\xeb\\xa9\\x1f\\xe4\\x9b\\xa4\\xa1\\x2c\\x63\\xdf\\x97\\x3c\\x49\\xa2\\x1d\\x31\\x62\\x55\\x12\\xd6\\x42\\x22\\x4b\\xab\\x23\\xfa\\xd1\\x16\\x05\\x0a\\xa8\\xbd\\x43\\x0d\\xdd\\xb2\\x3a\\x02\\xe6\\xd5\\xce\\x61\\xad\\x9b\\x89\\x4f\\xa9\\xea\\xc7\\x70\\x1d\\x04\\x5c\\x07\\x4f\\x9f\\xbb\\x02\\x8e\\x79\\x2d\\xef\\x42\\xc9\\x06\\x56\\xed\\x1a\\x52\\xb3\\x5d\\x5a\\x77\\xb4\\x5a\\x01\\xb7\\xfd\\xe1\\xb5\\x16\\x67\\xb0\\xb8\\x3a\\x86\\xd0\\xd1\\xca\\x56\\x34\\x4f\\x19\\xbc\\x76\\x77\\xd7\\x67\\xa5\\x31\\xb7\\x8c\\x00\\x42\\x79\\x25\\x66\\x96\\x12\\x25\\x05\\x65\\x0c\\xe3\\xdd\\xb0\\x14\\xd7\\xd9\\x6e\\x29\\x2e\\x6f\\xf7\\x6d\\x35\\x60\\xa2\\xe4\\x34\\xbc\\xd3\\xf8\\xc4\\x89\\xae\\xdf\\x7c\\xfc\\x8f\\xc9\\x13\\x26\\xdf\\xb8\\x4f\\x30\\xfd\\xe3\\xa5\\x39\\x4f\\x85\\x7a\\x3f\\x75\\xd5\\x91\\x6f\\x63\\xdd\\x04\\xba\\x6d\\xeb\\xe4\\x5b\\x87\\xf6\\xab\\xdd\\xb7\\x7a\\xc5\\x3b\\x7d\\xbb\\x7c\\x76\\xff\\xce\\xe7\\x1a\\xaf\\x1c\\x7f\\xfe\\x23\\x15\\x5f\\xcd\\x5f\\x2e\\xec\\x15\\xe8\\xc9\\xf9\\x8b\\x67\\xaf\\xa2\\xd5\\xdb\\x9f\\x18\\x31\\xed\\x86\\xab\\x87\\xba\\xe5\\x55\\x7b\\x2e\\x1c\\x32\\xf8\\x62\\xfd\\xe4\\xd7\\xf3\\x4c\\xf7\\x1d\\xa8\\x0b\\xaf\\xea\\x38\\x74\\xfc\\x65\\x17\\xcc\\x78\\x72\\xc3\\xa0\\x2b\\x46\\x46\\xfe\\x3e\\x8b\\x5a\\x4c\\x79\\x37\\x6e\\x79\\x9c\\xf5\\x64\\xeb\\x03\\xd8\\x2c\\x94\\xb6\\xf2\\x3d\\xf4\\xff\\x94\\xef\\x49\\xfd\\xbf\\xe5\\x7b\\xd8\\xe8\\x94\\xb6\\x6a\\xbc\\xc1\\x69\\x10\\x5a\\xe7\\x7b\\xc6\\x9f\\xf8\\xe1\\xc5\\x5f\\xa4\\xe4\\x19\\x2a\\x26\\x3d\\xb6\\xfb\\xc7\\xe3\\x74\\x64\\x72\\xb2\\x87\\x0d\\x54\\xf9\\xfc\\xc1\\xa4\\x69\\x2a\\xab\\x3f\\xa4\\x35\\xb1\\x0d\\x2d\\xb3\\x3c\\x22\\x9f\\x41\\x62\\xfa\\x02\\x3c\\x46\\x8c\\x65\\xcd\\x68\\x3d\\x85\\xa4\\x00\\xcc\\xfc\\x1c\\x3e\\x85\\x24\\x47\\x4c\\x84\\xb5\\x70\\x0a\\x49\\x36\\x9b\\x42\\x92\\x6b\\x18\\xf9\\x18\\xd9\\xb2\\xa1\\xce\\xf1\\xa7\\xb3\\x9a\\x84\\xa7\\x71\\x1a\\x49\\x46\\x26\\x6b\\x64\\x32\\xbb\\xff\\xbb\\x81\\x24\\xcc\\x56\\x3c\\xf3\\x54\\x92\\xdb\\xd0\\x4a\\x54\\xcf\\x30\\x9a\\x44\\x7a\\x15\\xec\\xc3\\xd8\\x33\\xf1\\xf9\\x24\\x71\\x38\\x3f\\x61\\xb3\\x56\\x8a\\xc8\\xe4\\x3f\\x9b\\xb6\\x52\\xdc\\xce\\xb4\\x95\\x12\\x63\\xda\\x0a\\x83\\x2f\\x3f\\x50\\xc4\\x07\\xae\\xd4\\xbb\\x94\\x82\\x42\\xb6\\x69\\xfe\\xcb\\x99\\x2b\\xcc\\xc8\\x3b\\xf3\\xe0\\x95\\x3b\\x79\\x84\\xb2\\xfd\\xf1\\x2b\\xf4\\xf5\\x78\\xad\\x02\\x83\\x51\\x36\\x33\\x18\\x3b\\x90\\x59\\xad\\x61\\x2c\\x01\\x18\\x03\\x1c\\xc6\\x00\\xc2\\x58\\x96\\x80\\x31\\x9f\\xc1\\x58\\x60\\xc0\\x58\\xde\\x82\\x96\\x05\\xca\\x33\\x9c\\x96\\x39\\x79\\x9c\\x98\\x00\\x6c\\x56\\xf6\\x7f\\x03\\x6c\\xc2\\x3c\\x3b\\x33\\x4d\\xef\\xe1\\x86\\xd9\\xd4\\x33\\x50\\x55\\xfc\\x8e\\x9b\\x64\\xb1\\xb5\\x06\\x61\\x25\\x83\\xae\\x6f\\x02\\xcc\\x38\\x99\\xb1\\x94\\x2c\\x69\\x0d\\x35\\x80\\xda\\x90\\xcd\\xa1\\xc6\\xa9\\x00\\xfe\\xa0\\x5a\\x14\\xd6\\xd2\\xc1\\x06\\x28\\x0e\\xc5\\x5d\\x45\\x44\\x41\\x56\\xa8\\xde\\x6f\\x43\\x9d\\x9f\\xe9\\x60\\xe3\\x01\\xb0\\x45\\xad\\xd4\\xd1\\x54\\x9f\\x53\\x5a\\x64\\xa9\\x48\\x0c\\xec\\xcf\\xc4\\x7e\\x52\\x6b\\x36\\xab\\x0b\\xab\\x77\\x7a\\x25\\x7c\\x46\\x9a\\x5a\\xca\\x7b\\x4d\\xad\\x7c\\xfc\\xc1\\x19\\xf0\\x00\\x5a\\x3d\\x8e\\x02\\x36\\xcb\\xbe\\x4d\\x34\\x5c\\x7b\\x74\\xa1\\x81\\x01\\x3a\\xf5\\x68\\x9b\\x48\\xf8\\xf1\\xe0\\xc1\\xd8\\x2a\\x4e\\xfa\\xff\\x60\\x8c\\xe0\\xd4\\x73\\xe0\\x18\\x8f\\x01\\xbb\\x48\\xe2\\x39\\x2e\\x9e\\x3b\\xa3\\x46\\x8e\\xeb\\xcf\\x13\\x67\\xe7\\xb2\\xc4\\x59\\xa3\\xa9\\x11\\xb6\\xcc\\x89\\x5e\\x38\\x51\\x05\\x64\\xe5\\x3d\\x20\\x30\\xfb\\x99\\x5e\\x6f\\x99\\x37\\xa3\\x67\\x9d\\x37\\xbb\\xa7\\x71\\x1f\\x2f\\xd0\\x85\\xab\\x49\\x2f\\x24\\xe5\\xcd\\xde\\x84\\x5f\\x21\\xd3\\x2f\\x2d\\xf3\\x66\\xf4\\xbf\\xca\\x9b\\xd5\\x18\\x79\\xb3\\x46\\xe9\\x7b\\xa3\\x58\\x26\\x8d\\x2d\\x9a\\xe5\\xcd\\x1e\\xc1\\xbc\\x9c\\xe9\\x69\\x23\\x6f\\xd6\\xd7\\xc8\\x9b\\xb1\\xd8\\x8e\\x95\\xb7\\x14\\x59\\x42\\xac\\x13\\xf4\\x7f\\x93\\x39\\xbb\\xec\\x68\\x7a\\x63\\xee\\x51\\xe9\\x5f\\x07\\x0f\\x9e\\x70\\x33\\xc8\\xfe\\xc5\\x62\\x34\\x03\\x4f\\xfd\\x20\\x55\\x9b\\xfe\\x09\\x76\\x54\\x25\\x99\\x63\\x4c\\x85\\x2e\\x02\\x5e\\xab\\x08\\x62\\x6c\\x84\\x0d\\x9d\\x91\\xf8\\x44\\x95\\xaa\\x24\\xe3\\x88\\xf5\\xc5\\x60\\x23\\x6f\\x1a\\xd7\\x1c\\xa5\\x60\\xbf\\xef\\x11\\x1d\\x5e\\x7f\\xae\\x19\\xb9\\x2a\\x4b\\x51\\x7d\\xc0\\x55\\x15\\x60\\x57\\xaa\\x24\\xa2\\x8a\\x8a\\x26\\x9b\\xb1\\x8e\\xc5\\x1d\\xb5\\xd9\\xfd\\xa8\\xb3\\x15\\x45\\xf3\\x1a\\x63\\xd2\\xd8\\x33\\x4c\\xea\\xc0\\xc4\\x31\\x95\\x16\\xc3\\xef\\xba\\x5c\\x8a\\x0d\\x85\\x69\\xee\\x56\\x63\\x43\\x58\\x13\\xed\\x40\\xea\\x7d\\xff\\xb2\\xfb\\x6a\\x24\\xeb\\x88\\xfe\\xfa\\xa7\\x43\\x28\\x29\\xbd\\xb8\\x63\\xf7\\x0b\\xee\\xe8\\xf5\\xd1\\x90\\x57\\xc7\\x4e\\xd1\\x3f\\xff\\xe0\\x23\\xbd\\xa9\\xf1\\xa1\\xd5\\xb7\\x3e\\x5e\\xb8\\x63\\xee\\xd2\\x1d\\xf4\\xdd\\xaf\\x69\\xf6\\xa0\\xee\\xa6\\x99\\x6a\\xdf\\x87\\x27\\xad\\x4f\\x2b\\x48\\x79\\xc8\\xd3\\xb7\\xea\\xe6\\x49\\xb3\\xa6\\xe8\\xff\\x7c\\xf0\\xe3\\x7f\\xeb\\x87\\x68\\xfa\\x5f\\x96\\x1d\\xfa\\xfa\\xc9\\xbb\\xba\\x5d\\xc8\\x9e\\x0b\\xc0\\x66\\xb0\\x80\\x6f\\x84\\xd1\\x99\\x5b\\xdb\\x99\\xc2\\x02\\x46\\xb8\\x96\\x09\\x2e\\x50\\x51\\x66\\x00\\xf6\\x95\\xdf\\x78\\xa2\\x0b\\x3d\\xc2\\x46\\xb2\\x08\\x2e\\xb5\\x14\\xac\\x98\\x06\\x2f\\xb7\\x08\\xbd\\xc1\\x86\\x52\\x7e\\xe4\\x66\\x45\\x87\\x38\\xc0\\x23\\x87\\x0d\\xf0\\x68\\xc8\\xe5\\x7e\\x0f\\xee\\x49\\x3b\\x05\\x4e\\x91\\x53\\x03\\xcc\\x7f\\x0c\\x60\\xa5\\x61\\x29\\x3e\\xc6\\x46\\xf5\\xb6\\x33\\xbc\\x45\\x6c\\xc3\\x93\\x69\\x39\\xd0\\x65\\x66\\xeb\\xc2\\xa5\\xd6\\x03\\x5e\\x4c\\x99\\x2d\\x53\\x07\\xc0\\x6d\\x6c\\xde\\x8b\\xe9\\x73\\xe2\\x24\\xe8\\x1b\\x9e\\x63\\x64\\x0e\\xd2\\x92\\xf4\\x4b\\x3c\\x9f\\xd5\\x3c\\x55\\x2d\\x91\\xcf\\xf2\\x30\\x6f\\x2d\\x95\\x65\\x0f\\x1b\\x24\\x97\\xdd\\xad\\x18\\xf9\\x81\\x16\\xd3\\x5f\\x92\\x82\\x28\\x6d\\x8e\\x80\\xb9\\x1f\\xf7\\xf1\\xfb\\xed\\xcc\\x81\\x91\\xf6\\xa2\\x42\\xec\\x96\\x34\\x0d\\x26\\xbe\\xe6\\x8f\\x8d\\x1c\\xdc\\x39\\x6d\\x4e\\xa9\\x39\\x63\\x0e\\xae\\x41\\xb2\\x67\\xe7\\xb0\\x16\\x1d\\xf0\\xd6\\x73\\xf3\\xfe\\x74\\x62\\x0d\\x53\\x77\\x6d\\x8f\\xad\\x39\\xc0\\xd5\\x5c\\x7b\\xc3\\x6b\\x84\\x5d\\x49\\xf1\\x0b\\xb6\\x6e\\x19\\xab\\xa9\\xd3\\x40\\x97\\x5f\\x60\\xac\\x3b\\x33\\x49\\xe2\\xc7\\x15\\xb8\\x1f\\xb3\\xd2\\xbc\\xba\\x37\\x9e\\x7f\\xf3\\x27\\x70\\x9d\\xa3\\xec\\x91\\x5c\\xe0\\x1c\\xd8\\xf9\\xc8\\x2e\\x56\\x59\\x74\\x3a\\xd2\\x5b\\x06\\x17\\xda\\x44\\x7c\\x3d\\x17\\x48\\x6b\\xdb\\x41\\xbd\\xf8\\x99\\xa1\\xb5\\xdc\\x2d\\x66\\xf1\\xc4\\xe1\\x70\\x03\\x1c\\x01\\xf0\\x67\\x97\\x1a\\x70\\x14\\xc7\\xe1\\xe8\\x08\\xb2\\x23\\x2b\\xa8\\x79\\x61\\xb7\\xe4\\x7a\\xb3\\x60\\xb7\\x28\\xcd\\x79\\xb8\\x02\\xf6\\x64\\x46\\x35\\x80\\xbb\\x25\\x85\\xef\\x91\\x94\\x60\\x3c\\x52\\x50\\xe0\\xd2\\x3a\\x70\\x88\\x55\\x3f\\x7e\\x81\\x57\\x96\\xb1\\x84\\x9c\\x1f\\x85\\x8c\\xa4\\xd8\\xb3\\xd8\\x20\\x16\\x30\\x4a\\x25\\xf6\\x94\\x02\\x8c\\xed\\xa5\\x44\\x4e\\x83\\xbd\\x5d\\x9f\\xbf\\x4d\\x34\\xac\\x6a\\xb5\\x6d\\x3a\\xb5\\x87\\x8f\\xe3\\x49\\xbb\\x27\\xa6\\x24\\x23\\x45\\x32\\x78\\xf2\\x0d\\xe2\\x64\\xd3\\x7d\\xd8\\xac\\x65\\x7b\\x7c\\xbe\\x4f\\x62\\xb4\\x4f\\x0a\\xcb\\xc1\\xa5\\xb6\\xc8\\xc1\\xb9\\xed\\x4d\\xf5\\x29\\x6e\\xd4\\xe0\\x8a\\x23\\x31\\x7f\\x11\\x50\\x50\\x5f\\x68\\x49\\x87\\x93\\xf9\\x70\\x32\\x3f\\x88\\x39\\x39\\x9e\\x88\\x53\\x30\\xdc\\x6b\\xf7\\x65\\xb7\\xb9\\xd1\\x12\\xfe\\x77\\x1c\\x4e\\x54\\xd7\\x2d\\x60\\x5d\\x73\\xf4\\xc1\\x38\\x74\\x74\\xfb\\xd1\\xd6\\x00\\x7e\\x05\\x1a\\x3a\\xa5\\x99\\x77\\x3f\\x66\\xf5\\x15\\x22\\x39\\x97\\x34\\x48\\x95\\x52\\xd4\\xd0\\x4d\\x55\\xc4\\x98\\x75\\xc6\\xda\\x33\\x2c\\x6c\\x1a\\x91\\xd5\\xc6\\xa7\\xea\\x4b\\x47\\x70\\xd4\\x22\\xea\\x23\\x5b\\xa8\\xf9\\x39\\x86\\x6c\\x19\\xa8\\x8f\\x40\\x63\\xc7\\x76\\x1d\\x38\\x70\\x40\\x18\\xb1\\x6f\\x9f\\x3e\\xf6\\x8d\\x37\\xc4\\xf0\\x1b\\x6f\\x30\\x7e\\xba\\x41\\x2a\\x97\\x9e\\x33\\x72\\x73\\x53\\xe2\\xb9\\xb9\\x24\\x5b\\xfe\\xcf\\x72\\x73\\x69\\x98\\x9b\\x7b\\xda\\x22\\xf9\\x14\\x7f\\x3c\\x39\\xa7\\xd9\\x58\\x67\\x47\\x72\\x7a\\x4e\\xcb\\xa9\\x66\\xc9\\x39\\xcd\\x6c\\x8b\\x24\\x98\\xc6\\x48\\xcf\\x71\\x14\\x36\\xa7\\xe7\\xfc\\x61\\xae\\x76\\x7c\\xcd\\x03\\x2d\\x4b\\x0b\\x11\\x95\\x5d\\x26\\x57\\x0d\\xba\\x65\\xca\\xa8\\x31\\x80\\xcf\\xf0\\xe5\\xe5\\x03\\x6f\\xb9\\x72\\xdc\\xe4\\xc6\\x0e\\x65\\x32\\x3d\\x3f\\xa7\\x5f\\xf1\\x9a\\x3b\\x9f\\x4a\\xef\\x12\\x58\\xb3\\xbe\\x30\\x5f\\xe6\\xa8\\x4d\\xf3\\x6e\\x7c\\x6f\\xd0\\x77\\x6b\\x10\\xbd\\x8a\\x6b\\xc3\\x9b\\xe7\\xfe\\xbc\\x71\\xf4\\xa6\\x6a\\xe1\\x01\\x97\\xfb\\xcb\\x9d\\xfa\\xf5\\x0e\\x3b\\x20\\x7a\\xd8\\x9a\\x20\\xcb\\x5b\\xb0\\x99\\x39\\xc0\\x3f\\x1e\\x92\\x8e\\x33\\x15\\xdb\\x99\\x9a\\x93\\x71\\xe6\\xa9\\x39\\x99\\xf1\\x8e\\x23\\xaf\\x2f\\x82\\xe6\\x6d\\xbd\\x92\\xe6\\x4f\\xe7\\x3d\\xfc\\x7f\\x3e\\x42\\x87\\x89\\xe9\\x56\\x73\\x74\\xae\\x63\\xa9\\xbb\\xd3\\x86\\xe9\\x48\\xff\\x49\\xe4\\xee\\xf8\\xba\\x5f\\xff\\xbf\\xaf\\x1b\\x53\\x67\\xf5\\x8a\\xd7\\xc7\\xd7\\xcb\\x1e\\x21\\xe5\\x70\\x6b\\x69\\x2c\\x9d\\x71\\xc6\\x75\\xb3\\x1c\\x5f\\xeb\\xf9\\x3f\\x63\\x79\\x74\\xf9\\xb4\\x95\\x8b\\x3f\\x27\\xe5\\x8a\\xf8\\xda\\x7f\\x81\\xb5\\x67\\x93\\x69\\xed\\xae\\x3d\\xe7\\xcc\\x6b\\xcf\\x6d\\x85\\xf3\\x06\\xc0\\x79\\x66\\x76\\x02\\xe9\\xaa\\x43\\xd1\\xd2\\x33\\xfe\\x14\\x88\\x84\\xb8\\x6e\\x05\\x88\\x51\\x6b\\xdd\\x06\\x09\\x72\\x9a\\x73\\x83\\x1c\\x8e\\xa7\\x01\\x0e\\x3f\\x68\\xc4\\x05\\xad\\x21\\xf1\\xa1\\x11\\x99\\x11\\xd6\\xbc\\x58\\xbe\\x1f\\x6a\\x06\\x2c\\x3b\\x01\\x98\\x17\\x43\\x30\\x7e\\x47\\x2b\\x08\\xd5\\x2c\\x3c\\x9d\\xee\\x60\\x45\\xff\\x59\\x8e\\x64\\xa0\\x51\\x31\\xa5\\xa3\\x4f\\xa1\\xc8\\x67\\x01\\x1a\\x4f\\x1e\\xb6\\x82\\x6c\\x3c\\xa6\\x0f\\x4f\\x07\\x2b\\x60\\xe4\\x0f\\xd9\\x9c\\x20\\xe0\\x2b\\x1f\\xf8\\x47\\x3d\\x4f\\x9f\\x14\\x94\\x95\\x98\\x14\\x84\\x69\\x57\\x19\\x0b\\x6c\\x39\\x96\\xcf\\x7a\\x66\\x10\\x33\\xf7\\xdb\\x1d\\x1c\\x64\\x38\\x01\\xa7\\x8d\\x0f\\x92\\x1e\\x4d\\xe2\\x9f\\x7b\\xf4\\x71\\x52\\xd8\\x98\\xed\\x3a\\x22\\x69\\x26\\x5d\\xd2\\x38\\x3a\\x95\\x26\\x4f\\xa4\\xd3\\x04\\x77\\x28\\xd4\\x7a\\x1e\\x1d\\x7b\\x16\\x33\\x9f\\xae\\x6b\\x4c\\xa2\\xd3\\xe4\\xec\\xf8\\xf8\\xa9\\xd6\\xf3\\x75\\x5b\\xcd\\xa2\\xbb\\xa7\\xb1\\xf6\\xee\\x09\\x6d\\x8c\\xa2\\x33\\x3f\\x1b\\xdb\\xd9\\x7f\\x60\\xfb\\xb3\\xe8\\x44\\x03\\xbf\\x4f\\xb3\\x6c\\x72\\x0e\\x76\\xc5\\xfb\\x91\\x4b\\xb2\\xc2\\x5a\\x1a\\x70\\x49\\x66\\xe8\\x34\\x84\\xe7\\xe2\\x38\\xb1\\x78\\xe6\\xd8\\x84\\x38\\x47\\x27\\x53\\x36\\x19\\x9e\\x67\\x26\\xf0\\x04\\x10\\x23\\x0f\\xc3\\x0c\\x69\\x60\\xd7\\xda\\x14\\x8a\\xb6\\x7e\\x26\\x50\\x41\\x62\\xd9\\xf9\\xb3\\x27\\x4c\\xbc\\xfa\\xb2\\x3d\\xda\\xe8\\x3a\\xce\\x4a\\x68\\x83\\x34\\x7f\\xe7\\xf5\\x22\\x38\\x2b\\xe5\\x07\\xf3\\x05\\xec\\xb9\\x7f\\xc5\\x64\\x19\\xef\\x37\\x63\\x93\\x82\\x13\\x8f\\xff\\xc3\\xa7\\xca\\xb3\\xa7\\x0b\\xf1\\xda\\x0f\\xf0\\xb4\\xed\\x29\\x3e\\x89\\x67\\x87\\xa9\\x5a\\x92\\x78\\x0e\\xa0\\xf1\\xf8\\xbf\\x54\\xa6\\xcf\\xa2\\xa9\\xb9\\x6c\\xd0\\xb0\\xd5\\x5a\\xa1\\xba\\x42\\x70\\xe0\\xb4\\x56\\x30\\x5f\\x08\\xeb\\xdc\\x35\\x9f\\xc4\\xa6\\xe0\\xa8\\xf8\\x10\\x43\\x56\\x3e\\x97\\x1b\\x01\\x35\\xa3\\x18\\xdd\\xa9\\xc6\\xe3\\x1a\\x9b\\x4b\\x4c\\x03\\xc6\\x53\\x1f\\x92\\x87\\xf1\\x4d\\xa1\\xb5\\xc7\\x06\\xac\\xbb\\x40\\xbc\\x3d\\x51\\x74\\x3a\\xed\\xf2\\x25\\xfd\\x8e\\xe9\\x87\\x1a\\x5f\\x79\\xbc\\xc7\\x8d\\x5d\\x7b\\xdc\\xd8\\xfd\\xf1\\xfd\\x42\\x6f\\x5a\\x4d\\xad\\xf4\\x7c\\x87\\xd5\\x28\\x45\\xb5\\xd9\\xe9\\xf9\\xd4\\x7a\\xe4\\x6b\\xab\\x55\\x5a\\x64\\xb1\\x7f\\xf5\\xbe\\x61\\x9f\\xc9\\x7f\\x48\\x43\\x49\\x01\\xa9\\x26\\x11\\xb2\\x9e\\x44\\xf3\\xd1\\xa3\\xc9\\x0c\\x63\\x24\\x45\\xf5\\x84\\x98\\x56\\x05\\x09\\x80\\x0f\\x40\\x54\\xeb\\x42\\x0d\\xa1\\xd4\\x7c\\x84\\x3d\\xd4\\xfc\\x24\\xed\\x42\\x3b\\xab\\x00\\x42\\x2f\\xc5\\xe5\\xc6\\xac\\x03\\x86\\x0f\\xc3\\x46\\xd6\\x19\\x1f\\xa1\\x5d\\x56\\x88\\x33\\x9b\\xf2\\x59\\x7f\\x82\\x66\\xce\\x81\\xd7\\xb0\\xbb\\x3e\\xd5\\xe6\\xc9\\xe4\\xc2\\xdb\\x10\\xdb\\x25\\xf9\\x00\\xbf\\x1f\\xd1\\xa2\\xa5\\xc1\\x77\\xb4\\xca\\x50\\x62\\x2c\\x21\\xd7\\xbc\\xed\\xc7\\x5d\\x5b\\x19\\xe0\\xc5\\xf1\\xf8\\x03\\x6a\\xe0\\x25\\x07\\x7b\\xf7\\x79\\x79\\x46\\xab\\x08\\xc4\\xd2\\x37\\xfa\\xf4\\x3e\\xb0\\x28\\xd9\\x32\\x17\\xfd\\xf1\\x88\\x0c\\x53\\xc5\\x33\\x27\\x8c\\xbf\\x3a\\x39\\x20\\x31\\x75\\xdc\\xb8\\xa9\\xc9\\x96\\xfa\\xe4\\xe6\\x98\\x1b\\xaf\\x5d\\x70\\x30\\x5f\\xdf\\x45\\x2e\\x6e\\x59\\xbd\\x80\\x71\\x04\\x67\\x58\\xb3\\xd9\\xf0\\x41\\x9e\\xac\\x54\\x1b\\xbd\\x7f\\x2e\\x1d\\xcd\\xfc\\xa9\\x54\\x38\\x84\\x1d\\x1f\\xd8\\xe2\\x82\\x1d\\xe1\\x3e\\xf3\\x58\\x7b\\xd1\\x60\\xf6\\xe6\\xfa\\x86\\x5f\\x59\\xa1\\x71\\x52\\x75\\x43\\x9d\\x51\\x6b\\x4c\\xc9\\x2e\\xe9\\x6b\\x51\\x31\\xfd\\x00\\xeb\\xaa\\x60\\xcf\\x9b\\x36\\x85\\xf1\\x71\\xcf\\xac\\xf1\\x98\\x05\\x37\\x1a\\x4c\\xac\\xe5\\x16\\xe3\\x1b\\x7c\\x44\\x9b\\x81\\x6c\\x43\\xb5\\xec\\xe2\\xba\\x44\\xfa\\x3a\\x51\\x6e\\x0d\\xd7\\x5c\\x2e\\x7d\\x21\\xf6\\x30\\xfd\\x06\\xba\\xe3\\x02\\xc2\\x66\\x1d\\x83\\xd5\\xee\\x92\\x9d\\xb0\\xad\\x45\\x53\\x7c\\xf4\\x68\\x83\\x87\\xdb\\xe7\\x1e\\xa6\\x1d\\x1a\\x6c\\xdc\\x2c\\x67\\x23\\xfa\\x3c\\x58\\x3e\\xca\\x64\\x97\\xcb\\xc9\\x1c\\x7e\\x4d\\x94\\x8d\\xf6\\xa5\\xb6\\xac\\xf0\\xe5\\xad\\x3d\\xd4\\x13\\x2d\\x1d\\xd2\\xe4\\x19\\x11\\xa4\\xc5\\x04\\x88\\xff\\xcb\\x67\\x8f\\x0b\\x2b\\xa4\\x6f\\xc5\\x42\\xf8\\xcc\\x7f\\xda\\xdc\\x89\\xe6\\x21\\x06\\x8f\\x4b\\x3d\\x85\\x15\\x5b\\x71\\x36\\xff\\x1a\\x61\\x85\\xa9\\xf1\\x4f\\xbf\\xbf\\xc6\\xd4\\xc5\\xf8\\xfe\\x30\\xf1\\x24\\xbd\\x90\\x3d\\x6f\\x3d\\xf1\\x0c\\x6e\\x4b\\xf3\\x33\\xb8\\x4d\\xc6\\x33\\xb8\\x4d\\x94\\x73\\x01\\xfe\\xb5\\x27\\x2c\\xfa\\x86\\xdd\\x3f\\xbe\\xbb\\x78\\xf2\\x59\\x7a\\xa5\\x7e\\x77\\xd4\\x78\\x6e\\xbb\\x18\\x3b\\xc3\\x75\\xda\\x7d\\x66\\x7b\\xf7\\xc6\\xfb\\xe1\\x0f\\x47\\xbe\\xf6\\xb2\\xfe\\x88\\x71\\x9d\\x53\\x94\\x5e\\x48\\x8e\\x9d\\xf5\\x33\\xc1\\xfd\\x9e\\xf8\\x75\\x4e\\x51\\xf3\\x2f\\x9f\\xe9\\xdf\\x02\\xab\\x03\\x4c\\xc2\\x16\\xb6\\x16\\x8c\\x46\\x21\\xb7\\xc9\\x61\\x63\\x41\\x60\\xe2\\x33\\x63\\x9f\\xc3\\xa6\\x9a\\x38\\xdf\\xdb\\x8d\\xa7\\x14\\x19\\x60\\x62\\x2b\\xb5\\x68\\x3c\\xb5\\x36\\x01\\x72\\x38\\x01\\xf8\\xb2\\x24\\xe0\\x0d\\x14\\xe0\\x3d\\x63\\xc2\\x03\\x7f\\x7a\\x4f\\xde\\x8c\\xc3\\xee\\x69\\x33\\xee\\x69\\x80\\x82\\xf7\\x94\\xe3\\x0f\\x6c\\x8a\\xa3\\x27\\x9c\\x00\\xee\\xe7\\x24\\x44\\x19\\xe8\\x82\\x7b\\x9e\\x52\\x84\\x5b\\xe9\\xff\\xb3\\x7b\\x72\\x54\\x36\\xdf\\xf3\\x3d\\xf8\\xf9\\x89\\x0e\\x78\\xe5\\x59\\x5d\\xa3\\x43\\xf6\\xc2\\x6f\\x56\\x0b\\x24\\xf8\\x85\\x52\\xf1\\x0b\\xf0\\x15\\xc1\\x97\\xb2\\x07\\x1b\\x24\\x46\\x1f\\xe3\\x85\\x55\\x47\\xc1\\x9e\\xb3\\xb0\\x21\\x02\\xc6\\x0b\\xd6\\x49\\x9d\\xd6\\xd7\\xbd\\x72\\xd6\\x98\\xb1\\xb3\\x67\\x8d\\x1d\\x3b\\x4b\\xf8\\xa4\\xfb\\xa8\\x59\\xb3\\x46\\x75\\xbf\\x74\\xe6\\xd5\\x4c\\x7e\\xed\\x00\\xf9\\xd5\\xc8\\x9e\\xc7\\x8e\\xfe\\xda\\x00\\xa3\\x87\\x42\\xb2\\x84\\x59\\xf5\\xbd\\x66\\xb2\\x86\\x42\\x49\\x4f\\x67\\x77\\x24\\xdb\\xb7\\xad\\xc3\\x89\\xcd\\x4f\\x44\\x33\\x04\\x15\\x7f\\x6e\\xfb\\xef\\x8d\\x9f\\x35\\x1e\\x66\\xff\\x10\\x9e\\x19\\x64\\x33\\xc0\\x83\\x7d\\xe2\\x01\\x42\\x55\\x73\\x5c\\x14\\xd9\\xf8\\x73\\x30\\xf0\\x3a\\x26\\xc2\\x07\\xef\\xf3\\x47\\x52\\x8b\\xb4\\x70\\x86\\x31\\x77\\x46\\xc8\\x89\\x8f\\x9b\\x61\\x75\\x9e\\x9b\\x05\\x4f\\xcb\\xeb\\xa8\\x42\\xc8\\xb8\\x54\\xf3\\x75\\x28\\x5e\\xc7\\x68\\x47\\x1f\\x75\\x7a\\xfb\\x39\\xdf\\x03\\x17\\x80\\x4d\\xfc\\x3e\\x7b\\xd6\\xf8\\x1f\\x24\\x5a\\x4a\\xf8\\xa3\\x1d\\x59\\xa7\\x83\\x6a\\x0f\\x63\\xac\\x08\\x74\\x78\\x03\\xa1\\xa5\\x36\\x27\\xb3\\x8d\\x71\\x3c\\x5c\\x16\\xdc\\x4a\\x62\\x27\\xfc\\x61\\xd6\\x5d\\xe2\\x0b\\xd5\\xa7\\x94\\xda\\x70\\x5e\\x5c\\x45\\x50\\x15\\xc0\\xdc\\xc4\\x47\\x41\\x60\\x1a\\xd2\\x9b\\x03\\x18\\xcc\\x10\\xd0\\x1c\\xc8\\xc8\\xb2\\x62\\x0f\\x7a\\x54\\xc8\\xc0\\x77\\x02\\x76\\x0d\\x48\\x21\\xb4\\x91\\x90\\x47\\x3a\\x26\\x3d\\xf8\\xda\\x89\\x0f\\xbe\\x76\\x1a\\x0f\\xbe\\xfe\\xf5\\x8b\\x97\\x2f\\xe7\\xcf\\x90\\x49\\x61\\x0f\\xbe\\x76\\xe2\\x83\\x61\\xf6\\xfe\\x7b\\xd8\\xfe\\x6f\\xf0\\xc1\\xd7\\xaa\\xdd\\x55\\xef\\xb0\\x3b\\x3d\\x60\\x67\\xb8\\xea\\x53\\x5d\\x29\\x9e\\x8a\\x28\\xbc\\x4d\\x7a\\x5a\\x32\\x9c\\x63\\x4f\\x4b\\x76\\xa4\\xe2\\x80\\x50\\xbb\\x23\\xd5\\x95\\xf4\\xb4\\xe4\\x7c\\x96\\xfe\\xe4\\x63\\xe7\\x0b\\x71\\xf4\\x7c\\x8b\\x27\\x45\\x1b\\x23\\xcb\\xcc\\x72\\xf3\\x68\\x57\\x52\\x7b\\xc1\\xfa\\xf5\\xeb\\x69\\xd6\\xb7\\xdd\\xae\\xef\\xeb\\xe9\\x3c\\xbb\\xcb\\xfa\\x5d\\xf4\\x47\\xdd\\x0b\\x3f\\x59\\x82\\xb4\\x6b\\x43\\x64\\x56\\x8d\\xa7\\xcb\\x82\\x1e\\xdf\\xea\\x5f\\xd1\\x2f\\xb6\\xae\\xd8\\x9a\\xfa\\x3f\\xb4\\xd0\\x95\\x7a\\x9f\\xcb\\xf3\\xf6\\x6e\\x05\\xde\\x9a\\x56\\xbd\\xa5\\x28\\xdb\\x52\\x5d\\x34\\xf0\\x3e\\xb7\\x89\\x27\\x8b\\x9b\\xa4\\x71\\xec\\xf9\\x44\\x7e\\x9c\\x86\\xca\\x9a\\x76\\xac\\xce\\x70\\x18\\x67\\x30\\x78\\x19\\x43\\xc4\\xe7\\xac\\xe0\\xf3\\xcb\\x2d\\xa9\\x9e\\x50\\x28\\xc4\\x66\\xc2\\xc8\\xc0\\x33\\x4c\\xb1\\xb4\\xfd\\xe4\\x22\\x14\\x33\\xc0\\x01\\x0d\\x7e\\xae\\x8a\\xfc\\xac\\x7f\\xa7\\x21\\xb5\\x79\\x6e\\x8c\\x0b\\xdd\\x11\\x9b\\xd3\\x08\\x85\\x05\\xd8\\x84\\x7d\\xaa\\x84\\xc1\\xc6\\xc4\\xd9\\xc7\\xa5\\x62\\xa1\\x68\\x56\\x26\\xd3\\xc5\\x77\\x8e\\xa1\\x3d\\xae\\xdb\\x21\\x3f\\x70\\xf5\\x15\\xf2\\xdd\\xe1\\x7b\\x65\\xd3\\x98\\x8b\\x2e\\xd2\\x23\\xf4\\x75\\x3d\\x22\\x64\\xe8\\x37\\xd2\\xdb\\x62\\xdf\\xd2\\x91\\x82\\xfe\\x28\\x9d\\x2c\\xe8\\x7c\\x3e\\x0b\\x06\\x77\\xba\\x48\\x5d\\x60\\x2f\\xd5\\xf2\\x7d\\xd4\\x40\\x6d\\xa8\\x64\\x93\\x8f\\x8d\\xe1\\x14\\x38\\xf7\\x03\\xde\\x19\\x2f\\x86\\xa6\\xe8\\xa4\\x04\\x14\\xbc\\xc0\\x89\\x83\\x1c\\x3f\\xd9\\xb0\\x41\\xdf\\x67\\xcf\\x1b\\xc8\\x22\\xdf\\xf2\\x27\\x0e\\xa8\\xe9\\x3c\\xd6\\xac\\x29\\x19\\xe1\\xc4\\x63\\x07\\x6c\\x41\\x4c\\x2c\\x38\\xc2\\xac\\xfb\\xd2\\xcc\\x3b\\x56\\xfe\\xfc\\xf9\\x03\\xc6\\x68\\x90\\x7a\\x97\\x35\\x2b\\xa5\\x82\\x9b\\xb0\\x41\\x8c\\xd5\\xa3\\xc3\\x16\\xe7\\x44\\x9b\\x15\\x39\\xd1\\x6a\\xe3\\x9c\\xf8\\xe3\\x90\\x57\\xb3\\x39\\x27\\xda\\x5c\\xaa\\x63\\xbf\\x6a\\x75\\xe1\\x23\\x8b\\xfe\\xf5\\xf2\\x2b\\x63\\x18\\x27\\x9a\\x5d\\xf5\\x16\\xb3\\xd5\\x83\\xad\\x8d\\xc0\\x67\\xf8\\xdc\\x6e\\x78\\x9b\\xc4\\x89\\x70\\x8e\\x71\\xa2\\xc5\\x8e\\x9c\\x68\\xb6\\xd8\\x1d\\x89\\x51\\xb5\\xe9\\x3e\\x3e\\x73\\xbf\\xfd\\x07\\x20\\x00\\x79\\x94\\xec\\x9d\\xef\\xbf\\xd0\\x6f\\xc9\\xa8\\x82\\xda\\xf9\\xbd\\xae\\x9f\\xfc\\xc1\\x07\\x8d\\xc2\\x79\\x07\\xc4\\xc7\\xd6\\x5f\\xff\\xf4\\xc1\\xbc\\xdc\\xfb\\x7d\\xb9\\x53\\x66\\x5c\\xcf\\x9e\\x83\\x70\\x72\\x14\\xcf\\x94\\x08\\xf8\\xbc\\x06\\xa9\\xd4\\xc0\\xdf\\xb5\\x2d\\xf1\\x97\\xf4\\xd0\\x06\\x30\\x87\\x32\\xc2\\xf5\\x5e\\xab\\x0c\\x58\\x70\\x1a\\x0f\\xb6\\x3b\\x3b\\xec\\xa5\\xf3\\xe4\\x06\\xf7\\x70\\x7d\\xc6\\x34\\x85\\xc4\\x23\\x1d\\xce\\x0c\\x4b\\xeb\\x07\\x3a\\x08\\xb7\\xb4\\xf5\\x4c\\x87\\x93\\xa3\\xd8\\x48\\x7b\\xe0\\x28\\x80\\x45\\xde\\xcc\\x60\\x09\\x92\\x30\\x0d\\x71\\x68\\xb4\\xca\\x6a\\x63\\xae\\x7d\\xbd\\x92\\x51\\xd6\\xa9\\xc8\\xcf\\x80\\x8a\\x7a\\xd2\\x2b\\x60\\xa7\\xe0\\x43\\xe7\\x80\\x2d\\x8a\\xc3\\xe8\\xd8\\xab\\x79\\xbc\\x1a\\xe8\\xec\\x00\\xc3\\x49\\x6f\\x99\\x21\\xad\\x92\\xcd\\xfb\\x8b\\x56\\x56\\xe1\\x67\\x95\\x15\\xf0\\xb5\\xaa\\x4a\\x3c\\xac\\xc2\\xd9\\x3d\\x95\\xac\\x48\\xa0\\xde\\x15\\x08\\x03\\xde\\xaa\\xed\\xbc\\x50\\xc8\\xce\\x0a\\x85\\xe2\\xdc\\x53\\x10\\x40\\xee\\x09\\x14\\xb4\\xe4\\x9e\\x14\\x0c\\xea\\x16\\xed\\x37\\x61\\xed\\x4c\\x5e\\x12\\xfb\\xe4\\xb9\\xea\\xf3\\xf3\\x02\\xc0\\x3e\\x45\\xae\\xfa\\xc2\\xa2\\x02\\x60\\x1f\\x78\\x9b\\xc4\\x3e\\x70\\x0e\\xd9\\x27\\x9a\\x5f\\x58\\xc4\\x66\\x1d\\xe7\\xf1\\x03\\xce\\x40\\x55\\x71\\xf4\\x6b\\xd5\\x95\\xcc\\xa1\\x02\\x32\\x14\\x9c\\xd5\\x93\\x35\\x02\\xff\\x05\\x91\\xa8\\xde\\x26\\x07\\xb6\\xa6\\x5a\\xbb\\x2c\\x69\\xd0\\xf1\\xfb\\x38\\x1d\\xc9\\xee\\xd6\\x74\\x8c\\x02\\x1d\\xc3\\xe1\\x16\\x64\\x04\\x1a\\x16\\x70\\x1a\\xe6\\x86\\x34\\xab\\xa9\\x49\\x0b\\x74\\x0a\\xfd\\xff\\x40\\x4c\\x7c\\x64\\x91\\x41\\xbf\\x56\\xd8\\x64\\x53\\x5b\\xc9\\xff\\x1b\\x0c\\x0a\\x99\\x67\\xc5\\xf7\\xed\\x6c\\x84\\xff\\x0f\\xcd\\x46\\xfa\\xda\\x00\\x00\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\x60\\x00\\xe2\\x1d\\x66\\xdf\\xfe\\xc7\\xf3\\xdb\\x7c\\x65\\x90\\xe7\\x60\\x00\\x81\\xf3\\xf5\\x73\\xce\\xc2\\xe8\\xff\\xcb\\xfe\\x09\\xb2\\x27\\xb2\\xf7\\x00\\xb9\\x1c\\x0c\\x4c\\x20\\x51\\x00\\x85\\x4d\\x0d\\xd3\\x00\\x00\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\xe0\\x28\\xff\\xbb\\x16\\x48\\x32\\xfc\\x5f\\xf6\\x7f\\x0d\\x7b\\x22\\x03\\x50\\x04\\x05\\xbc\\x02\\x00\\x95\\x51\\x06\\xd6\\x00\\x78\\xda\\x6d\\x93\\x4b\\x48\\x54\\x51\\x18\\xc7\\xff\\x73\\xce\\x77\\xee\\x0d\\xa2\\xd2\\xb0\\x16\\x66\\x11\\x56\\xf4\\x00\\xcd\\x36\\x39\\x24\\x36\\xa2\\x66\\xb6\\xd0\\xc4\\x36\\xb3\\x32\\x74\\x06\\x47\\xd4\\x1e\\x13\\x92\\x42\\x41\\x6a\\x42\\x3e\\xa6\\xb4\\x17\\x24\\x14\\x31\\x4a\\x0f\\xb5\\x50\\x62\\x2c\\x6d\\x21\\x44\\x2f\\xa2\\x68\\x13\\xb4\\x28\\x68\\x51\\x9b\\x20\\x89\\x24\\x5c\\x99\\x4d\\xff\\x7b\\x9d\\x62\\x0c\\x17\\x3f\\xfe\\xdf\\x39\\xdf\\xf9\\xce\\x39\\xf7\\xfb\\xdf\\xa3\\xa6\\x51\\xbc\\x0c\\x80\\x67\\x7e\\x01\\xb5\\x0e\\x23\\xea\\x3a\\x2a\\xe4\\x17\\x4a\\xa4\\x0d\\x27\\xcc\\x07\\xd4\\x31\\x2e\\xf0\\x84\\x50\\xa1\\xee\\xa0\\x43\\x8d\\xc2\\xd2\\x4d\\xc8\\x90\\x6e\\x94\\x7b\\xae\\x20\\x47\\xed\\xc2\\x26\\xb5\\x19\\x51\\x5d\\x89\\x14\\x69\\x47\\x98\\x35\\x8f\\x49\\x35\\x09\\x92\\x5c\\x72\\x83\\x74\\x90\\x32\\x52\\x4b\\x0e\\x29\\x83\\xa8\\x5a\\x81\\x80\\xa4\\x60\\x3f\\xc7\\xd7\\x24\\x07\\x9d\\xfa\\x2d\\xf2\\xed\\xed\\x3c\\x2f\\x1b\\x69\\x66\\x3d\\x62\\x26\\x15\\x27\\xcd\\x3e\\xc4\\xe4\\x3e\\x19\\xe2\\xb8\\x09\\x2d\\x66\\x1c\\x31\\x55\\x84\\x29\\xa9\\x47\\xa1\\xd9\\xc2\\xf9\\x4a\\xc4\\x6c\\x9b\\xb9\\x71\\x37\\x1f\\x36\\x1b\\x13\\x5a\\xc6\\xdc\\x3c\\xcf\\x1a\\x43\\xa6\\xa9\\xc7\\x65\\xb3\\x0a\\x6b\\xed\\x54\\xec\\xa6\\x16\\xca\\x67\\xa4\\xc9\\x2b\\x54\\xab\\x6d\\xe8\\xd5\\xe5\\xd8\\x4a\\x5d\\xae\\xfd\\xc8\\xd7\\x83\\x10\\xd5\\x86\\x4a\\xa9\\x45\\xbd\\x44\\xd0\\x2b\\x3e\\x7e\\x43\\x04\\x35\\x92\\x87\\x80\\x7a\\x0a\\x2f\\xe3\\xa0\\x33\\xaf\\x04\\x37\\xd5\\xea\\xf8\\x94\\xa4\\xa3\\xcf\\x89\\xad\\xdf\\x5c\\x1b\\x71\\xa9\\x4e\\x68\\x8d\\x9a\\xa2\\xee\\xc4\\x11\\xf5\\x0c\\x99\\x1c\\xf7\\x88\\x85\\x6c\\x6b\\x25\\xb2\\x1c\\x25\\xe9\\xa4\\x4a\\x4d\\xc0\\xe7\\x99\\xc3\\x28\\x75\\x8d\\x39\\x86\\x56\\xb7\\xff\\x73\\xe8\\x93\\x1a\\x34\\xc8\\x30\\x4a\\xcc\\x18\\xfb\\xfe\\x11\\x1b\\x3c\\x3f\\x71\\x51\\xbe\\xa1\\x4a\\xcf\\x63\\xd8\\x2a\\x86\\x5f\\x5f\\x45\\x8b\\x7e\\xc1\\x7b\\x85\\x71\\xc6\\xe9\\xbd\\x3b\\xf7\\x10\\xa7\\xd4\\x1c\\x5a\\xe5\\x00\\x02\\x3a\\x88\\x66\\xdd\\x88\\xe3\\xea\\x02\\xce\\xf2\\xec\\x7e\\xfd\\x1d\\x3e\\x95\\x81\\x28\\xf7\\x6f\\x56\\x59\\x38\\xac\\x6f\\xb9\\xf5\\x47\\xad\\x3c\\x4c\\x58\\xf7\\xc8\\x2c\\x5a\\xf5\\x6c\\xa2\\xef\\x4b\\x60\\xb7\\xc7\\xa7\\x1d\\x2f\\x5c\\x1f\\x92\\x50\\x45\\xf1\\x4f\\x8e\\x17\\xd4\\x19\\xf2\\xda\\x04\\xb0\\xe3\\x9f\\x0f\\xff\\x21\\xa5\\xf0\\xbb\\xb1\\xe3\\x45\\x12\\xae\\x17\\x93\\x18\\x94\\xe7\\xe8\\x72\\xfb\\xbe\\x04\\xd6\\x13\\xec\\x71\\xbd\\xa0\\x0f\\xc9\\x28\\x1d\\x9f\\x54\\x1a\\xfd\\xd4\\x37\\xe4\\xb6\\x3c\\x40\\x69\\x92\\x0f\\x8b\\xb9\\xc4\\xff\\x6c\\x21\\xee\\x59\\x84\\xe3\\xc5\\x00\\xfa\\x1d\\xb5\\xef\\xa2\\xce\\xde\\xcb\\x35\\xbc\\x93\\x7e\\x87\\x11\\x72\\x8e\\x7d\\x82\\x1d\\x01\\xfe\\xaa\\xea\\xa0\\x47\\x5f\\x48\\xe1\\x02\\x98\\xa1\\xb6\\x53\\x1b\\x98\\x73\\xde\\x41\\x02\\xd3\\x89\\x21\\xeb\\x34\\xce\\x7b\\x06\\x50\\xe1\\x12\\xe5\\xdb\\xf9\\x4a\\x7e\\x90\\xf7\\xe4\\x11\\xba\\x4c\\x90\\x9e\\xb0\\x56\\x85\\xd0\\x48\\xfc\\xce\\xbe\\x52\\x80\\x83\\x46\\x10\\x12\\x2f\\x63\\xe7\\x8d\\xbd\\x84\\xd7\\xce\\x25\\xdd\\xf0\\xfe\\x01\\x18\\x6a\\xd4\\xaa\\x00\\x00\\x00\\x78\\xda\\x63\\x60\\x60\\xd0\\x81\\xc2\\x08\\x86\\x09\\x8c\\x25\\x4c\\x0c\\x4c\\x73\\x98\\x2d\\x98\\xe3\\x98\\x7b\\x98\\x77\\x31\\xbf\\x61\\xd1\\x63\\x09\\x62\\x29\\x60\\x99\\xc0\\xb2\\x82\\xe5\\x0b\\xab\\x1c\\x6b\\x0b\\x1b\\x17\\x5b\\x18\\xdb\\x1b\\xf6\\x24\\xf6\\x3d\\x1c\\x2e\\x1c\\xbb\\x38\\x1e\\x71\\xf2\\x70\\xaa\\x70\\xba\\x71\\xc6\\x70\\x1e\\xe1\\x9a\\xc2\\x75\\x8c\\x5b\\x87\\x7b\\x12\\xf7\\x05\\x1e\\x1e\\x1e\\x27\\x9e\\x2d\\x3c\\x6f\\x78\\xb9\\x78\\xfd\\x78\\x7b\\x78\\x37\\xf1\\x71\\xf0\\xb9\\xf0\\x4d\\xe3\\xbb\\xc5\\x6f\\xc7\\xbf\\x4c\\x40\\x4d\\x20\\x4c\\x60\\x92\\xc0\\x2e\\x41\\x3f\\xc1\\x06\\xc1\\x0d\\x82\\xf7\\x84\\xb8\\x84\\x14\\x84\\x82\\x84\\x4a\\x84\\xfa\\x84\\xd6\\x09\\x9b\\x08\\xcf\\x12\\xfe\\x27\\x92\\x21\\x72\\x4e\\x54\\x41\\x74\\x9e\\xe8\\x33\\x31\\x01\\x31\\x1f\\xb1\\x0e\\xb1\\x45\\xe2\\x7c\\xe2\\x61\\xe2\\x8b\\x24\\x58\\x24\\xb2\\x24\\x96\\x48\\x2a\\x49\\x56\\x48\\x1e\\x91\\xfc\\x20\\x15\\x26\\xd5\\x26\\x75\\x42\\xea\\x9b\\x74\\x80\\x74\\x8e\\xf4\\x11\\x19\\x09\\x20\\xb4\\x93\\x59\\x23\\xab\\x24\\xbb\\x4a\\x8e\\x4f\\xce\\x44\\xee\\x8d\\xbc\\x84\\xfc\\x01\\x05\\x1b\\x85\\x18\\x85\\x16\\x85\\x45\\x8a\\x51\\x8a\\x65\\x8a\\x87\\x94\\xf8\\x94\\xd2\\x94\\x5e\\x28\\xf3\\x29\\x27\\x29\\x4f\\x53\\xde\\xa2\\xfc\\x41\\x45\\x4c\\x25\\x46\\xa5\\x4e\\xe5\\x97\\x6a\\x9f\\x5a\\x94\\xda\\x21\\xb5\\x7f\\xea\\x56\\xea\\x55\\xea\\x1f\\x34\\x7c\\x34\\x0e\\x68\\x6a\\x68\\xee\\xd0\\x62\\xd2\\xf2\\xd0\\x9a\\xa6\\xf5\\x4e\\x5b\\x4a\\xdb\\x4d\\xbb\\x4c\\x7b\\x83\\x8e\\x80\\x4e\\x97\\xce\\x33\\x5d\\x17\\xdd\\x25\\x7a\\x06\\x7a\\x0b\\xf4\\x0e\\xe9\\x7b\\xe8\\x4f\\xd0\\xbf\\x61\\xa0\\x64\\x50\\x65\\xb0\\xcd\\x90\\xc9\\xb0\\xc2\\x88\\xcf\\x68\\x89\\xb1\\x93\\x09\\x83\\xc9\\x0a\\xd3\\x0c\\x33\\x05\\xb3\\x55\\xe6\\x72\\xe6\\x13\\x2c\\xb8\\x2c\\x7a\\x2c\\xb6\\x59\\x3c\\xb2\\x14\\xb2\\xf4\\xb1\\xbc\\x60\\xe5\\x67\\xb5\\xc2\\x9a\\xc5\\x3a\\xc3\\xfa\\x93\\x4d\\x82\\xcd\\x04\\x5b\\x21\\xdb\\x3c\\xdb\\x33\\x76\\x06\\x76\\xb3\\xec\\xde\\xd8\\x7b\\xd9\\xef\\x70\\xb0\\x70\\xb8\\xe1\\xa8\\xe2\\xe8\\xe7\\x38\\x0d\\x07\\x5c\\xe2\\xb8\\xc9\\xf1\\x80\\xe3\\x0d\\xc7\\x0f\\x4e\\x22\\x4e\\x16\\x4e\\x51\\x4e\\x53\\x9c\\xce\\x39\\x73\\x38\\x5b\\x38\\x17\\x00\\xe1\\x14\\xe7\\x5d\\xce\\xbb\\x5c\\xca\\x5c\\xee\\xb9\\xb2\\xb9\\x2e\\x73\\xe3\\x71\\xfb\\xe0\\x3e\\x01\\x00\\x72\\x51\\x8e\\xd4\\x00\\x01\\x00\\x00\\x00\\xea\\x00\\x46\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x01\\x00\\x02\\x00\\x16\\x00\\x00\\x01\\x00\\x01\\x57\\x00\\x00\\x00\\x00\\x78\\xda\\x7d\\x52\\xcb\\x4e\\xc2\\x50\\x10\\x3d\\x05\\xd4\\x10\\x91\\x18\\x63\\x5c\\xb1\\xe8\\x8a\\x15\\x94\\x82\\xe8\\xa2\\x1a\\xe3\\x23\\x62\\x34\\xc4\\x18\\x34\\xca\\xc2\\x4d\\x41\\x04\\xa2\\x80\\x29\\x55\\xe3\\x3f\\xf8\\x21\\x7e\\x89\\xd1\\xad\\xf1\\x43\\xfc\\x04\\x4f\\xa7\\x23\\xd2\\x2e\\xc8\\xcd\\x4c\\xcf\\x3c\\xef\\xb9\\x33\\x05\\xb0\\x8c\\x77\\x24\\x61\\xa4\\xd2\\x00\\x76\\x28\\x21\\x36\\x90\\xa1\\x15\\xe2\\x04\\xb2\\x38\\x51\\x9c\\x44\\x15\\x4d\\xc5\\x29\\xe4\\xf0\\xaa\\x78\\x0e\\x05\\xbc\\x29\\x9e\\xa7\\xff\\x5b\\xf1\\x02\\x76\\xf1\\xa3\\x38\\x8d\\x8c\\x61\\x2b\\x5e\\xc4\\xaa\\xb1\\xad\\x38\\x83\\xbc\\x71\\xa6\\x78\\x09\\xd7\\xc6\\x93\\xe2\\x2c\\x2e\\x8c\\x2f\\xc5\\x2b\\xc8\\x25\\xf2\\x8a\\x3f\\xb0\\x96\\xd8\\x57\\xfc\\x09\\x3b\\xd1\\x44\\x0d\\x23\\x0c\\xe1\\xc3\\xc4\\x0d\\x5c\\x7e\\x5d\\xa2\\x36\\x7d\\x0f\\x78\\x81\\x87\\x3e\\xba\\xe8\\x49\\xf4\\x88\\xbe\\x11\\xad\\x7b\\x74\\x68\\x55\\x60\\xa3\\x4c\\xdd\\xa0\\xaf\\x45\\xf1\\x29\\x0d\\x46\\xba\\x78\\x64\\x86\\xcb\\xca\\xe9\\x7c\\x27\\x92\\x67\\xc6\\x32\\x1d\\xed\\xb6\\x3e\\x33\\xeb\\x92\\x96\\x87\\x31\\x19\\x05\\x7c\\x4d\\xe6\\x5b\\x14\\x5b\\x2a\\xab\\x94\\xad\\x09\\xab\\x68\\x9f\\x62\\xac\\x4f\\xf4\\x8e\\x3e\\x3b\\x9a\\xf2\\x66\\x9f\\x31\\x97\\x33\\xe8\\x60\\x20\\x79\\x77\\xf4\\x8d\\x70\\x1b\\x7b\\xb9\\x15\\xb1\\xa2\\x91\\x60\\x6a\\x03\\x1c\\x70\\x5e\\x9e\\xf4\\xf5\\xa9\\x5d\\xe1\\x1a\\xde\\x19\\xf0\\xf7\\xe9\\x0f\\xf8\\xd7\\x19\\x6b\\xd3\\x33\\xa4\\xdd\\xe1\\xad\\x26\\xf9\\x0d\\xe5\\x76\\x4f\\xb8\\xf4\\x64\\xca\\x7b\\xdc\\x82\\xcb\\xbc\\xd0\\x8a\\xd6\\x14\\xe8\\x89\\xcf\\xa4\\x42\\x16\\xb6\\xec\\xcb\\x67\\xa5\\x83\\x12\\xcf\\xb3\\x1c\\x8b\\x7d\\xfe\\x7b\\x59\\xcc\\xf7\\xc8\\xbb\\x44\\xe6\\xd3\\x3d\\xc7\\xf4\\xd4\\x71\\xcc\\x37\\x1c\\xe2\\x14\\xe7\\xd4\\x45\\xed\\x39\\x6b\\x33\\x57\\xb4\\x5a\\x9c\\xd4\\xdf\\x7f\\x54\\x96\\x8a\\x9a\\x4c\\x21\\x7c\\x83\\x27\\xdc\\x36\\xa8\\x83\\xfd\\x38\\xd4\\x15\\xd1\\x9b\\x93\\x9d\\x55\\x7f\\x01\\x3d\\xf4\\x7c\\x3e\\x00\\x00\\x00\\x78\\xda\\x6d\\xd0\\x47\\x4c\\x93\\x71\\x18\\xc7\\xf1\\xef\\x03\\xa5\\x85\\xb2\\xf7\\x06\\xf7\\x1e\\xef\\xfb\\xb6\\x65\\xb8\\x5b\\xe0\\x75\\xef\\xbd\\x45\\x81\\xb6\\x88\\x80\\xc5\\xaa\\xb8\\x8d\\xe0\\xd6\\x68\\x4c\\xbc\\x69\\x5c\\x17\\x35\\xee\\x19\\x8d\\x7a\\x50\\xe3\\x5e\\x71\\x44\\x3d\\x78\\x76\\xc7\\x83\\x7a\\xd5\\x42\\xff\\xde\\x7c\\x2e\\x9f\\x3c\\x4f\\xf2\\x3c\\x79\\xf2\\x23\\x82\\xf6\\xfa\\x53\\x4b\\x15\\xff\\xab\\xcf\\x20\\x11\\x12\\x49\\x24\\x16\\xa2\\xb0\\x62\\x23\\x9a\\x18\\xec\\xc4\\x12\\x47\\x3c\\x09\\x24\\x92\\x44\\x32\\x29\\xa4\\x92\\x46\\x3a\\x19\\x64\\x92\\x45\\x36\\x39\\xe4\\x92\\x47\\x3e\\x05\\x14\\xd2\\x81\\x8e\\x74\\xa2\\x33\\x5d\\xe8\\x4a\\x37\\xba\\xd3\\x83\\x9e\\xf4\\xa2\\x37\\x7d\\xe8\\x4b\\x3f\\xfa\\xa3\\xa1\\x63\\xe0\\xc0\\x89\\x8b\\x22\\x8a\\x29\\xa1\\x94\\x01\\x0c\\x64\\x10\\x83\\x19\\xc2\\x50\\x86\\xe1\\xc6\\x43\\x19\\xe5\\x54\\x60\\x32\\x9c\\x11\\x8c\\x64\\x14\\xa3\\x19\\xc3\\x58\\xc6\\x31\\x9e\\x09\\x4c\\x64\\x12\\x93\\x99\\xc2\\x54\\xa6\\x31\\x9d\\x19\\xcc\\x64\\x16\\xb3\\x99\\xc3\\x5c\\xe6\\x31\\x9f\\x05\\x54\\x8a\\x85\\xa3\\xb4\\xd0\\xca\\x0d\\xf6\\xf3\\x91\\xcd\\xec\\x66\\x07\\x07\\x38\\xce\\x31\\x89\\x62\\x3b\\xef\\xd9\\xc4\\x3e\\xb1\\x8a\\x8d\\x5d\\x12\\xcd\\x56\\x6e\\xf3\\x41\\x62\\x38\\xc8\\x09\\x7e\\xf1\\x93\\xdf\\x1c\\xe1\\x14\\x0f\\xb8\\xc7\\x69\\x16\\xb2\\x88\\x3d\\xa1\\xa4\\x1e\\x51\\xcd\\x7d\\x1e\\xf2\\x8c\\xc7\\x3c\\xe1\\x29\\x9f\\xa8\\xe1\\x25\\xcf\\x79\\xc1\\x19\\xbc\\xfc\\x60\\x2f\\x6f\\x78\\xc5\\x6b\\x7c\\x7c\\xe1\\x1b\\xdb\\xa8\\xc5\\xcf\\x62\\x96\\x50\\x47\\x3d\\x87\\x68\\x60\\x29\\x8d\\x04\\x68\\x22\\xc8\\x32\\x96\\xb3\\x22\\x94\\xf2\\x4a\\x56\\xd1\\xcc\\x6a\\xd6\\xb2\\x86\\xab\\x1c\\x66\\x3d\\xeb\\xd8\\xc0\\x46\\xbe\\xf2\\x9d\\x6b\\x9c\\xe5\\x1c\\xd7\\x79\\xcb\\x3b\\xb1\\x4b\\xac\\xc4\\x49\\xbc\\x24\\x48\\xa2\\x24\\x49\\xb2\\xa4\\x48\\xaa\\xa4\\x49\\xba\\x64\\x48\\x26\\xe7\\xb9\\xc0\\x65\\xae\\x70\\x87\\x8b\\x5c\\xe2\\x2e\\x5b\\x38\\x29\\x59\\xdc\\xe4\\x96\\x64\\x4b\\x0e\\x3b\\x25\\x57\\xf2\\x24\\x5f\\x0a\\xa4\\xd0\\xea\\xad\\x6b\\x6e\\xf4\\xe9\\xb6\\x60\\xbd\\x5f\\xd3\\xb4\\xf2\\xb0\\x6e\\x4d\\xa9\\x7a\\x8f\\xa1\\x74\\x28\\x5d\\xca\\xd2\\x36\\x8d\\xd0\\xa2\\x52\\x57\\x1a\\x4a\\x87\\xd2\\xa9\\x74\\x29\\x8b\\x94\\xc5\\xca\\x12\\xe5\\xbf\\x7b\\xee\\xb0\\xba\\xba\\xab\\xeb\\xf6\\x1a\\xbf\\x37\\x18\\xa8\\xae\\xaa\\x6c\\xf2\\x85\\x47\\x86\\x19\\xd6\\x65\\x5a\\x2a\\x82\\x81\\x86\\xf6\\xc6\\x65\\x96\\xb5\\x69\\x7a\\xc2\\x7f\\x84\\x34\\x94\\x0e\\xa5\\xf3\\x2f\\x0f\\x26\\x9e\\xe4\\x00\\x00\\x78\\xda\\x3d\\xcd\\x2b\\x0e\\xc2\\x40\\x14\\x85\\xe1\\x0e\\xd3\\x27\\x7d\\x97\\x2a\\x12\\xd2\\x69\\x10\\x88\\x61\\x03\\x24\\x48\\x5a\\x53\\x43\\x50\\x9d\\x84\\x45\\x20\\x08\\x1a\\x83\\x03\\xd6\\x72\\x8b\\x62\\x77\\x70\\x02\\xd3\\x71\\xe7\\x3b\\xe6\\x7f\\xb3\\xcf\\x8d\\xd8\\xc3\\xea\\xc8\\xdf\\xf7\\x03\\x63\\x4f\\x35\\xb4\\xae\\xec\\x6b\\xca\\x54\\x47\\xe5\\x01\\xe3\\xaa\\x16\\xe4\\xca\\x63\\x6f\\x11\\x17\\x0d\\x71\\xb9\\x23\\x5b\\x34\\x2f\\x7e\\x9a\\xc8\\x1f\\x1c\\xc0\\x1e\\xe1\\x02\\xce\\x59\\xc3\\x03\\xdc\\xad\\x86\\x0f\\x78\\x6b\\x8d\\x00\\xf0\\x85\\xc6\\x14\\x08\\xaa\\x3f\\x18\\x85\\xba\\x11\\xe1\\x0d\\x37\\x13\\x39\\xf0\\xf6\\x02\\xc6\\x60\\x34\\x37\\x4c\\xc0\\xf8\\x6e\\x98\\x82\\xc9\\xd2\\x30\\x03\\xd3\\xda\\x30\\x07\\x33\\x61\\x58\\x80\\x79\\x65\\x38\\x03\\x8b\\xd5\\x48\\x45\\xa5\\xfc\\x02\\xfc\\xb9\\x4d\\x56\\x00\\x00\\x00\\x01\\x53\\x59\\xec\\x4e\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\x7d\\x3f\\x4c\\xf6\\xc0\\x61\\x00\\x00\")\n\nfunc fontsRobotoRegularWebfontWoffBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoRegularWebfontWoff,\n\t\t\"fonts/roboto-regular-webfont.woff\",\n\t)\n}\n\nfunc fontsRobotoRegularWebfontWoff() (*asset, error) {\n\tbytes, err := fontsRobotoRegularWebfontWoffBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/roboto-regular-webfont.woff\", size: 25024, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoslabBoldWebfontEot = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x74\\x90\\x53\\x70\\x1d\\x0e\\xd4\\xed\\x4f\\x92\\x13\\xeb\\xc4\\x27\\xb6\\x6d\\x5b\\x27\\x6a\\x6c\\x9b\\x8d\\x1a\\x27\\x6d\\x6c\\xdb\\xb6\\x6d\\x1b\\x8d\\xed\\xc6\\x8d\\x1b\\x36\\x6a\\x92\\x3b\\xf3\\x9f\\xef\\xe1\\x9b\\x7b\\xe7\\xae\\xa7\\xdf\\x9e\\x35\\x7b\\xed\\x59\\x9b\\xc4\\x0c\\x00\\x18\\x30\\x01\\x00\\xa0\\x01\\xd0\\x00\\x20\\xe0\\x7f\\x0b\\x0a\\xd0\\x03\\x0d\\x00\\x00\\x01\\x8a\\x2a\\x9f\\xd0\\x80\\x3d\\x7d\\x32\\x80\\x0a\\xd9\\xff\\x38\\xf9\\x50\\x00\\x32\\x00\\x00\\x4a\\xb9\\x93\\x16\\x7a\\x1b\\xf0\\xff\\x08\\x17\\xa0\\x06\\x70\\x02\\x98\\x01\\x9c\\x00\\x6e\\x00\\x27\\x00\\x19\\x40\\x1d\\xe0\\x00\\x30\\x05\\x98\\x01\\x00\\x00\\x04\\x80\\x04\\xc0\\x09\\xe0\\x00\\xb0\\x00\\x00\\x00\\x15\\x00\\x2d\\x80\\x25\\xc0\\x15\\xf0\\x0d\\x60\\x0b\\x70\\x02\\x38\\x02\\xc8\\x00\\xec\\x00\\x16\\x00\\x3b\\x80\\x0d\\xc0\\x06\\xe0\\x00\\xf0\\x00\\x38\\x01\\x82\\x00\\x32\\x00\\x07\\x80\\x0d\\xc0\\xfe\\x3f\\xec\\x06\\x70\\x03\\x58\\x01\\x4c\\x01\\xee\\xff\\xe5\\xda\\x00\\x6c\\x01\\x8e\\x00\\x37\\x00\\x19\\x80\\x0e\\xe0\\x01\\x60\\x03\\xb0\\x00\\xf8\\x01\\x5c\\x00\\x96\\xff\\x36\\x98\\x01\\xec\\x00\\x73\\x00\\x2f\\x80\\x0b\\x40\\x0f\\x20\\x03\\x30\\x03\\x1c\\x00\\x64\\x00\\xbe\\xff\\xc8\\xf5\\xbf\\x3b\\x1c\\xff\\xb1\\xec\\xff\\xe4\\xb3\\xfd\\x37\\x79\\xfd\\xe7\\x70\\xfd\\xc7\\x9e\\x00\\x32\\x00\\x05\\x80\\xe2\\x3f\\xd6\\x06\\x00\\x00\\x64\\xff\\x9f\\x46\\x64\\xff\\xab\\x0f\\x00\\x20\\xa1\\x2e\\xab\\xf2\\x7f\\xff\\x02\\x06\\x10\\xb2\\x0d\\xe0\\x7f\\x05\\x08\\x00\\x00\\x5c\\x8e\\x98\\x33\\x67\\x51\\x13\\x5e\\x7a\\xda\\x93\\x36\\xfa\\x2e\\xf2\\xfe\\x5e\\x14\\xe6\\x5d\\xae\\x4c\\xd6\\x4c\\xd2\\x4f\\x34\\x4f\\xb0\\x92\\x41\\xdb\\x04\\x23\\x7d\\x51\\x7f\\x1f\\xfe\\xa5\\x20\\xd4\\x8b\\xe5\\x7d\\xae\\x57\\x0c\\xe0\\xeb\\x82\\xfb\\x51\\x21\\x6b\\x2a\\x36\\x0e\\x2a\\x35\\x38\\x6d\\x19\\xd2\\xe3\\x8a\\x32\\x4a\\x5d\\xa6\\x46\\x59\\x04\\xd8\\xc4\\xd6\\x85\\xf9\\x3c\\x22\\xc6\\xff\\xce\\x59\\xfa\\xa4\\x2b\\x46\\xe6\\x4f\\x35\\xce\\x38\\x32\\x83\\x60\\x4b\\xa6\\xcf\\x6d\\x8d\\x3e\\x18\\xfa\\xcc\\x66\\xd6\\x6f\\x35\\x5d\\x8e\\x32\\x17\\x2b\\x78\\x3b\\xeb\\x7d\\xd2\\xbc\\x02\\x0f\\xa3\\x6e\\x51\\x8b\\xf5\\x28\\x87\\xb4\\xf8\\xaf\\x5c\\x0f\\x03\\xeb\\x26\\x68\\x4e\\xa3\\x62\\x1a\\xbe\\x20\\x6b\\xea\\x80\\xf5\\x0c\\xf8\\x87\\x60\\x60\\xd8\\x94\\xbf\\x45\\xb6\\x2b\\xb9\\x6a\\x11\\x93\\x9e\\xb8\\x8a\\x7f\\x9b\\xeb\\xb3\\xad\\xe1\\x5a\\x10\\xea\\x45\\x64\\xca\\xfd\\x51\\x6d\\x51\\xda\\xdf\\x34\\x41\\x2b\\x2f\\x12\\x08\\xa5\\x3f\\x89\\x3e\\x84\\x05\\xca\\x9c\\x3a\\x5e\\x5f\\x7b\\xd4\\x8d\\xda\\x5d\\xf8\\x27\\x3c\\x62\\x23\\x61\\x6a\\x37\\xc3\\xc5\\x23\\x17\\x76\\xa3\\xc8\\xc0\\x20\\x16\\x67\\xb6\\x21\\xd7\\x4c\\xe3\\x1a\\xd3\\xcd\\x89\\x8c\\x0c\\x85\\x8f\\x7f\\xeb\\xb7\\x1d\\x41\\x47\\x6b\\x9c\\x98\\x44\\xa8\\x2c\\xa5\\x7c\\x7a\\x35\\x5a\\xcc\\xb9\\xf6\\xd5\\xd7\\x45\\x9e\\x18\\x51\\x7f\\xf6\\xc7\\x78\\x39\\x87\\xb7\\xf0\\xc7\\x2f\\x58\\x67\\xd3\\x73\\xe2\\xd4\\x74\\x2c\\x01\\x8f\\x4a\\x1d\\x8f\\xc8\\xe4\\xd2\\x1f\\x2c\\x88\\xe4\\x54\\xc9\\x7f\\x16\\xc3\\x31\\xc1\\xc6\\x37\\xc5\\xf5\\x08\\x15\\x96\\x3d\\xf2\\x24\\xb3\\x78\\xce\\x43\\x12\\x09\\xa4\\x97\\x20\\xdd\\xaa\\xb9\\x2f\\xb3\\x7b\\x5a\\x8e\\xf0\\xab\\x75\\xc0\\xcc\\xce\\x7d\\xb4\\xa8\\xc3\\x16\\xd2\\x9c\\x89\\xea\\xd5\\xa8\\x71\\x12\\xfa\\x78\\xaa\\x9d\\x63\\xf4\\x75\\x36\\x1e\\xab\\x57\\xd7\\x49\\x39\\x09\\xbf\\x10\\x19\\x76\\xc4\\xb2\\xda\\x15\\x8d\\x0c\\xbc\\xc5\\x1f\\x70\\x02\\x16\\xe5\\xab\\x32\\x89\\x50\\x74\\x4f\\xe6\\x9a\\xf0\\xa7\\x5c\\x09\\xbe\\x68\\x5c\\xf5\\x2d\\x31\\x93\\xe9\\x44\\x0a\\xfa\\x31\\xaf\\x70\\xaf\\xe4\\x89\\x4b\\xd8\\x77\\xe6\\x5d\\xf0\\xbe\\x52\\xf8\\xa2\\xae\\x01\\x04\\x76\\xf2\\x08\\xf4\\xe4\\xbe\\x12\\x73\\x6d\\x5f\\x33\\x1c\\x5d\\xe2\\x5c\\x86\\x5c\\x4c\\x8e\\x51\\x46\\x21\\x2a\\x72\\xc7\\x3e\\x9c\\xc7\\xb3\\x09\\xbe\\x8d\\x81\\x50\\x2e\\x51\\xa8\\x19\\x08\\x19\\xd7\\x60\\xf0\\x34\\x50\\x0b\\x44\\x1f\\x98\\xde\\xb0\\xda\\xec\\x6f\\xe9\\x3a\\x18\\x37\\x66\\x0f\\x95\\x41\\xc1\\x42\\x11\\x50\\x93\\x17\\x09\\xb6\\x60\\xa1\\x8d\\x92\\xf6\\xd2\\xf3\\xb1\\xed\\x1c\\x19\\x8a\\x40\\xdb\\x91\\x74\\x67\\xe4\\xaa\\x11\\xe8\\xe7\\xc0\\xaf\\xcf\\xf5\\x39\\xbe\\x58\\xb5\\xb1\\xf0\\x57\\x1b\\xe8\\xd4\\x42\\x41\\xbb\\x41\\x2a\\xf5\\xd6\\x34\\x25\\x18\\xb1\\x41\\x4b\\xc1\\x50\\x3c\\x3a\\x2d\\x2a\\x69\\xe2\\x4f\\x13\\xa9\\x39\\x69\\x3f\\xce\\xc5\\x75\\x97\\x5b\\x17\\xed\\x2a\\x88\\x31\\x46\\xa8\\x33\\x0b\\x58\\x43\\x54\\x4b\\xe7\\xb8\\x6f\\xd8\\x31\\xd3\\x8c\\x2c\\x23\\x1c\\x22\\x12\\xda\\x45\\x4c\\xc2\\x86\\x1d\\xa0\\xd4\\xe5\\x9f\\x56\\x4e\\x78\\x9a\\x63\\xfb\\x17\\x1c\\x86\\xeb\\x34\\x36\\x97\\x75\\x88\\x45\\x30\\xc1\\x48\\x75\\x18\\x61\\xf0\\x82\\x25\\xc0\\xd9\\x41\\x9a\\xae\\x2f\\x15\\xf1\\x37\\xc1\\x0f\\x25\\x81\\xcc\\x12\\x05\\x85\\x13\\x46\\x40\\x14\\x0f\\xcf\\x6d\\xbb\\x6c\\x2b\\xfc\\x9b\\xcf\\x22\\xa8\\x7a\\x10\\x33\\xc0\\x82\\x9c\\x1c\\xd3\\x6c\\xab\\x72\\xf7\\x36\\x83\\x18\\x19\\x24\\x80\\xd4\\x70\\x8a\\xeb\\x17\\x71\\xcc\\x37\\x91\\xcd\\x5f\\x4b\\xd9\\x91\\xc8\\x45\\xe1\\x0b\\x99\\xc0\\xa4\\x5f\\xb1\\x8a\\xde\\x0d\\xf9\\xf6\\xc3\\x23\\x8d\\xc1\\xa0\\xbd\\x54\\x09\\x0d\\x0f\\xba\\x48\\xb0\\x52\\x93\\x1a\\x89\\xa1\\xc1\\xde\\x74\\x7b\\xdf\\x01\\xb6\\xf8\\x56\\xe4\\xe1\\xef\\xe1\\xf7\\x7f\\x72\\x26\\x82\\x40\\x8f\\x2e\\x8a\\x9e\\xa3\\xe8\\x8e\\xed\\x10\\x3e\\x19\\x0b\\xb0\\xa5\\x95\\xb8\\xc9\\x66\\xe5\\x59\\xc6\\x60\\x54\\x66\\x4c\\x87\\x62\\x66\\x0e\\xa9\\x2b\\x8d\\x0d\\xe9\\xb4\\xe2\\xb4\\x7d\\xe1\\x9f\\xe0\\xf8\\x02\\x62\\xd0\\x19\\xdc\\x11\\xa3\\x18\\x2a\\x29\\x97\\x0b\\x33\\x69\\x0c\\xe6\\xdf\\x8c\\x96\\x99\\xb2\\x5a\\x5e\\x7f\\xdc\\xbc\\x96\\xf7\\x3f\\x8b\\x11\\x24\\xac\\xaa\\xcb\\xa8\\xcc\\xb6\\xf5\\x8a\\x8f\\x9c\\xf7\\x8c\\x32\\x55\\x30\\xb3\\xe9\\x6e\\xb5\\x03\\xc3\\x67\\xfb\\x60\\xf0\\x67\\xd7\\xd5\\x24\\x85\\x2c\\xd7\\xc3\\x1c\\x4f\\x5a\\xfc\\xfd\\xa2\\x99\\x9d\\x2e\\x8e\\xed\\xb0\\x4f\\x0d\\xa5\\x30\\x17\\xba\\x45\\x01\\xba\\xc1\\x2c\\x16\\xb1\\x1c\\x18\\x31\\x90\\xfd\\x8d\\x11\\xc8\\x03\\x35\\x98\\x48\\x39\\xca\\xad\\x68\\x57\\x44\\x66\\x37\\x22\\xe4\\x4e\\x3d\\xc1\\xce\\x8a\\x6a\\x89\\x66\\x08\\x78\\x31\\xa6\\x82\\x9d\\xee\\xc0\\x34\\x8e\\xea\\x86\\x93\\x80\\x28\\xb0\\xb8\\xc8\\xe7\\x20\\x9c\\xdd\\x93\\x2b\\x52\\x41\\x8a\\xa7\\x47\\xd9\\x1e\\x93\\x38\\xc5\\x68\\x04\\x8f\\x62\\x81\\x08\\xb6\\x28\\x1f\\x0f\\xe4\\x34\\x7c\\xef\\x04\\x74\\x3e\\x4c\\x3e\\x48\\x64\\xae\\x4c\\x94\\x65\\x18\\xb7\\x08\\xec\\xcd\\x81\\x68\\x45\\x49\\x4c\\x7b\\xe6\\x19\\x29\\x51\\x1d\\xec\\x1b\\x5f\\x53\\x22\\x8f\\x24\\x75\\x90\\xc4\\x3a\\x02\\xa5\\x33\\x15\\x58\\x8d\\xed\\x59\\x2b\\x7a\\x55\\xe9\\xfa\\x8a\\x1e\\x30\\xcf\\xb1\\xe6\\x51\\x39\\xd8\\xdd\\xc5\\x6c\\x17\\xa2\\xa3\\x3e\\x70\\xc0\\x6d\\xf5\\xe6\\x18\\xd1\\x76\\x57\\x3d\\x81\\x7a\\xda\\xcc\\x0f\\x48\\xae\\x9d\\x8e\\x05\\x58\\xa9\\xdd\\x43\\xaf\\x2e\\x7d\\x0b\\xa2\\x8e\\xbc\\x9b\\xac\\x3b\\x56\\x5b\\x0a\\x4f\\xba\\x6d\\x97\\x2f\\x35\\x1b\\x1e\\x39\\x5c\\xd9\\x2c\\xda\\x61\\xdf\\x2c\\x67\\xf6\\x73\\x36\\xec\\x9c\\x67\\x6d\\x5a\\x95\\x3a\\x67\\x70\\xab\\xdb\\xd9\\x8b\\x56\\xaf\\xa6\\x6d\\x3a\\xb8\\x4f\\x38\\xb7\\x69\\x72\\xc6\\x7c\\x43\\x97\\x42\\xe6\\x5c\\xdc\\xf6\\x39\\x77\\xb8\\xf6\\xd9\\x0d\\x95\\xc0\\x8a\\xda\\xda\\x32\\x58\\x38\\x5b\\xc5\\x50\\x51\\x99\\xc5\\x50\\x51\\x59\\xe6\\x03\\xa6\\x65\\x1d\\x7b\\x20\\x5b\\x1b\\xcf\\x04\\x1b\\xd0\\x1f\\xb2\\x79\\x88\\x67\\x02\\x1d\\x13\\xe3\\xef\\x76\\xcc\\x76\\xc9\\x42\\x23\\xb1\\xc2\\x1e\\x6d\\x10\\xdd\\x1c\\x0e\\x15\\x12\\xd7\\xcd\\xa2\\x58\\xb1\\x21\\x2a\\x15\\x92\\x68\\x61\\x49\\x5f\\x84\\x8d\\x6d\\x42\\xee\\x89\\x26\\xc6\\x9e\\x35\\x43\\x91\\x3d\\xca\\xb1\\x86\\xa2\\x49\\x4e\\x55\\xb6\\x60\\x4e\\x55\\xd6\\xce\\xac\\xa6\\xd2\\xda\\xb7\\x71\\x45\\x58\\xf0\\x6e\\x10\\xd8\\xff\\x59\\xf4\\x2e\\x78\\xd7\\x4f\\x84\\x3a\\x00\\xca\\xfd\\x5c\\x27\\xe7\\x90\\x18\\x8b\\x48\\x20\\xb7\\x29\\xdc\\x1d\\xd0\\x10\\xe6\\xc8\\x41\\x0c\\x30\\xae\\x2d\\x1e\\xb9\\x38\\x11\\xfc\\xa5\\x56\\x49\\xc3\\xee\\xea\\x97\\x73\\xf6\\xe1\\x73\\x76\\xe9\\x05\\x07\\x9c\\x07\\xf0\\x4b\\xd7\\x6f\\x71\\x04\\xd5\\x2f\\xa5\\x8b\\x6b\\x5f\\x1f\\xcf\\xaa\\xbf\\x65\\x7e\\x4b\\x79\\xde\\xf8\\x96\\xf2\\x9c\\x53\\x39\\xe5\\xe7\\xc9\\x60\\x96\\x4f\\x34\\x95\\x51\\x7e\\x37\\x95\\x52\\x7e\\x73\\x2c\\xaf\\x7a\\x58\\xac\\x96\\xe2\\x15\\xb1\\x5c\\x4a\\x02\\x9a\\x6e\\x55\\x5d\\x22\\xbc\\x81\\x3d\\x74\\x83\\x4d\\xae\\xee\\x46\\xcb\\xcd\\x15\\x6c\\xd6\\x9a\\x7c\\x49\\x3e\\x51\\xbe\\xcc\\xcb\\x2c\\xf5\\xdc\\x97\\xfe\\x93\\x9a\\x90\\xa9\\x92\\xab\\xb1\\x59\\xed\\xf9\\xfb\\xe2\\x4e\\x52\\xe2\\x5e\\xfa\\xd4\\x66\\x7d\\xa1\\xb3\\x7a\\xfb\\x1f\\x75\\x29\\x9d\\x9b\\x93\\xdf\\x3c\\x62\\xe5\\xa1\\x2c\\x90\\x4b\\x48\\x81\\x4b\\x91\\x4b\\x89\\x4b\\x85\\xeb\\x8b\\x3d\\xaa\\x3b\\xcb\\xa8\\x40\\x03\\x45\\x73\\x1a\\x14\\x77\\x5a\\x01\\x59\\xb6\\x2b\\xc2\\xec\\xdf\\x80\\x3e\\x73\\x5e\\xed\\xe0\\x50\\x47\\xec\\x94\\xcc\\xab\\x81\\x34\\x36\\xce\\xe7\\x5f\\xcf\\xf0\\xb7\\xd0\\x46\\x40\\x09\\x10\\x24\\x62\\xf1\\xd6\\x19\\xf3\\x76\\x00\\x58\\x76\\x60\\xf2\\x26\\x38\\x88\\x08\\xf7\\x51\\x6c\\x17\\x46\\xb7\\xb1\\x8b\\x44\\x33\\x03\\xb7\\x07\\xf9\\x9b\\x11\\xd5\\x38\\xa9\\x83\\x79\\x13\\x82\\x62\\xf3\\x1d\\x74\\x88\\xd5\\x4a\\xbd\\x97\\x1b\\x6b\\xf0\\x42\\xb7\\x1a\\x76\\x4a\\xf6\\xa3\\x64\\x02\\xed\\xe0\\x63\\xf4\\xd4\\xbe\\x73\\x00\\x52\\x03\\x24\\x33\\x85\\xf5\\xe6\\xce\\x22\\xb5\\x51\\x9a\\x4f\\x4f\\x71\\xd2\\x83\\xc9\\x9b\\xcb\\x92\\x1f\\xe5\\xad\\x84\\xeb\\x4e\\xda\\xdc\\x1a\\x0a\\xf3\\x0f\\x58\\xd7\\xf1\\x72\\xfb\\x42\\x0c\\xbd\\x19\\x60\\xe7\\x33\\xe6\\x26\\x88\\x1a\\x81\\xb4\\xfc\\x56\\x40\\x54\\x34\\x11\\x79\\x49\\xd0\\x85\\xca\\x8d\\x30\\x49\\xe1\\x59\\x68\\xb7\\x20\\x3b\\x2d\\xbe\\x19\\x87\\xab\\xcc\\xd4\\xe5\\x9c\\x60\\x2d\\x23\\xc7\\xaf\\x4e\\x61\\x53\\x2e\\x8d\\x33\\x79\\x56\\x05\\x1c\\x66\\x5a\\x00\\x93\\x0b\\x07\\xd0\\x16\\xde\\xc2\\x9d\\x60\\xf9\\x37\\xfc\\xc0\\x0d\\x11\\x2d\\xf3\\xca\\x9a\\x0c\\x08\\xb5\\x79\\x09\\x3e\\x1c\\x14\\xa8\\x48\\x8a\\x63\\x6a\\xcf\\x67\\x31\\x8f\\x1d\\x95\\x71\\xc7\\x77\\xe2\\xa0\\x3a\\x8f\\xc5\\x0e\\x41\\x9e\\xb8\\x6f\\x0d\\x0c\\x2d\\xae\\x50\\xb3\\xd5\\x02\\xb3\\x0b\\x9a\\xee\\x8b\\x85\\x88\\xa1\\x43\\xaa\\x04\\x86\\x9c\\xf5\\x2b\\x98\\xd8\\x09\\x16\\x4b\\x03\\xf9\\x62\\x6f\\x0e\\x2a\\xbb\\x74\\x2a\\xb2\\x8c\\xdd\\xe7\\x23\\xd4\\xb2\\xb1\\x05\\x47\\x05\\xf6\\x9d\\xbf\\x45\\xa2\\xd9\\x06\\xee\\x6c\\x40\\x13\\xd7\\x85\\x6a\\x96\\x0d\\x66\\x06\\x2f\\xa1\\x6f\\x22\\x90\\x1b\\xec\\x71\\xd2\\x72\\x4c\\x1e\\xa7\\xd1\\x61\\x07\\xf1\\x00\\xde\\x43\\x63\\x62\\x0f\\x97\\x69\\xc8\\x70\\x5c\\x64\\x76\\xd1\\xb5\\xde\\xd1\\x19\\xc2\\x3d\\x8c\\xfc\\x55\\xf4\\x91\\xd5\\x1e\\xa1\\x67\\xa0\\x11\\x53\\xe8\\x0c\\xc2\\xb0\\xf9\\xf5\\x5e\\x47\\x4c\\x35\\x98\\x00\\x34\\x83\\x84\\xc3\\xd1\\x0a\\xec\\x57\\xdb\\x2a\\xc1\\x75\\xdb\\x55\\x6f\\x40\\xfa\\x1c\\x0e\\x6a\\x7d\\x74\\x1b\\x44\\x05\\x43\\x94\\x67\\x41\\xec\\xb0\\xa0\\xaa\\x96\\x43\\xf9\\xd2\\xd7\\x12\\x55\\x9e\\x09\\xa6\\xc6\\xa5\\x50\\x7b\\x82\\xca\\x37\\xa4\\xc0\\x42\\x42\\xfc\\x73\\x9d\\x8c\\xaa\\x49\\xd1\\x23\\x45\\xd9\\xc4\\x93\\x94\\x4b\\x40\\xec\\xc0\\x81\\x9c\\x5a\\x19\\x06\\xf9\\xb4\\x32\\xd1\\x0c\\xfd\\x10\\x57\\xa6\\xad\\x96\\x29\\x7d\\x6c\\x17\\x99\\x66\\x72\\x80\\x58\\x04\\xc6\\x58\\x0c\\x4f\\xa7\\x9d\\x6d\\x88\\x64\\x98\\x69\\x57\\x54\\x98\\x27\\x19\\xfd\\x0e\\x48\\x21\\x3b\\x9f\\x29\\xbe\\x4c\\x44\\x90\\x28\\x07\\xa3\\xc8\\x82\\x57\\x92\\x0d\\x4a\\x95\\x0d\\xa1\\x98\\x5b\\xe2\\xab\\x06\\x86\\x6a\\x33\\xca\\xd0\\xb5\\x58\\x15\\x47\\x94\\xe6\\x34\\x9d\\x93\\xfb\\xfd\\x3c\\xd8\\xcd\\x39\\x0d\\xb1\\x83\\xe6\\x5a\\x37\\x51\\x72\\x1f\\x3b\\x11\\x67\\x5d\\xb1\\x78\\x3c\\x5c\\x7e\\x28\\x30\\x7b\\xcc\\x52\\x54\\x8e\\xfa\\xeb\\x0d\\xf4\\xe3\\xe6\\x67\\x6a\\x40\\x6e\\x54\\xe6\\x8c\\x9e\\xc0\\xe3\\x02\\x9d\\x9d\\xf4\\x53\\xeb\\x31\\xb2\\xf6\\x96\\x14\\x46\\x7f\\xa5\\x97\\x23\\xe3\\xf9\\x0f\\x68\\x42\\x65\\xf5\\x05\\x4d\\x4b\\xe1\\x38\\x54\\xf5\\x24\\x2f\\x05\\x18\\xd9\\x7d\\x8f\\xbc\\xb3\\xcc\\x18\\x71\\x27\\xa7\\x0a\\x97\\x8d\\x21\\x6f\\x39\\x95\\x6f\\x9d\\x41\\x19\\xc6\\x35\\x73\\x11\\x1c\\xaf\\xb3\\x8e\\xa0\\xbe\\x13\\x22\\x40\\x32\\x50\\xbf\\x6e\\xb9\\x9e\\xe0\\x72\\x0f\\xc3\\x20\\xb2\\x6e\\x24\\x47\\xcb\\x7c\\x0c\\x2b\\x5e\\x46\\x3e\\xb1\\xe3\\x67\\xe6\\x19\\xf8\\x93\\xc5\\x3a\\x21\\xaf\\xf3\\x9b\\x10\\x70\\x56\\x5a\\xf1\\x06\\x59\\xb2\\x63\\x32\\x5d\\x8f\\x2e\\x68\\x2a\\xe3\\x5c\\x88\\xe5\\xa8\\x7e\\xdf\\x62\\x5a\\xd3\\x02\\x8e\\x69\\x54\\xc8\\xc9\\xc5\\x8a\\x0b\\xcb\\xcf\\x64\\xda\\x86\\xc2\\xeb\\xba\\x6e\\x97\\xcd\\x8a\\xaa\\xbc\\x31\\x5a\\x8a\\x58\\xcc\\x20\\x33\\x95\\xce\\x43\\x63\\xa2\\x4d\\xe0\\xd2\\x6c\\xbd\\x8e\\xf7\\xa6\\xfb\\x57\\xa7\\xca\\x8e\\xe3\\x94\\x0c\\x94\\x4e\\x1a\\x6b\\xa8\\xb3\\xce\\xfb\\x14\\xa4\\x1c\\xb7\\x03\\x42\\x72\\x46\\x15\\x10\\xa8\\x7f\\x76\\x06\\xad\\x9c\\xd8\\x96\\x98\\x92\\x72\\xf2\\x30\\x05\\x5b\\x5e\\xa6\\xb9\\xfa\\xa3\\xee\\xe9\\x70\\x5f\\xb6\\xe1\\x06\\x59\\xf7\\x98\\x95\\x1e\\xaa\\xf0\\x28\\xe8\\xfb\\x6c\\x1e\\xf6\\x57\\xb4\\x2a\\x25\\xc7\\x7b\\x3c\\xea\\xcc\\xca\\x54\\xb5\\x58\\x94\\xea\\xc1\\x61\\x06\\xb5\\x42\\x81\\x62\\x98\\x90\\x98\\x76\\x05\\x84\\x6b\\xb7\\xb6\\x44\\xcf\\x1c\\xdb\\xca\\xe7\\xe3\\xa0\\xe4\\xdb\\x0a\\x7d\\x4d\\x8b\\x7c\\x1d\\x39\\x51\\x1b\\xa5\\xc1\\x0e\\x34\\x3a\\x6c\\xa1\\x2d\\xe8\\xd0\\x56\\x48\\x81\\x2a\\x2f\\x36\\x42\\x19\\x45\\x78\\xc9\\xb4\\x66\\x5f\\x47\\x35\\xcb\\x2d\\x69\\xf1\\x05\\x45\\xb4\\xd1\\x93\\xe9\\x6b\\xc3\\x44\\xb4\\x59\\x25\\xdc\\x93\\x76\\xe2\\x5b\\x56\\x3e\\x69\\x0b\\x38\\xc4\\x16\\x6b\\x02\\x2e\\xc2\\x44\\xc8\\x26\\x65\\x3e\\x96\\x9e\\xbe\\xb1\\x14\\x56\\x5d\\xe2\\x87\\xf5\\x5c\\x1f\\x03\\x39\\xf0\\x94\\x66\\x24\\x19\\xb7\\x06\\x89\\x54\\x47\\xca\\x89\\x64\\x9a\\x4e\\xf6\\x2a\\x0a\\x6a\\x64\\xac\\x60\\xd2\\x90\\x86\\x32\\xb3\\x2e\\xa1\\xc2\\x9d\\xaf\\x4e\\x67\\x61\\xc6\\xb4\\x95\\x68\\x90\\x83\\x32\\x75\\x15\\xd5\\x0a\\x81\\xd4\\xdf\\x01\\x16\\xcc\\x15\\xe4\\x16\\x2c\\xc5\\xbc\\xb7\\x98\\xd5\\x60\\xc3\\xad\\xc3\\x85\\x2b\\xd9\\x14\\xbd\\xb7\\xc8\\x53\\x4c\\x20\\xf4\\x4a\\xa0\\x54\\x2f\\xe9\\xd2\\x24\\x53\\xaf\\xa7\\x4b\\xbc\\xc3\\x6c\\x24\\xa1\\x98\\xd0\\x4a\\x4b\\xab\\xa6\\x94\\x88\\x19\\x5a\\x0c\\x3e\\x13\\xb2\\x56\\x33\\xe1\\x2f\\xaa\\x6a\\xc4\\x25\\xc5\\x28\\xa0\\x2c\\x43\\x42\\x78\\x25\\x8b\\x53\\x73\\x92\\x9a\\xe8\\xa2\\x37\\x69\\x68\\x91\\x86\\xfb\\x32\\x6d\\x79\\xd7\\x0c\\x6a\\xc4\\x02\\xf9\\x17\\xa9\\x20\\x57\\x94\\xd0\\x2a\\x56\\x5c\\x90\\x63\\x29\\xd9\\xd3\\xe1\\x54\\x48\\x0c\\xcd\\x33\\x95\\xf8\\x82\\x34\\xc6\\x68\\xdc\\x37\\x88\\x1d\\x6a\\x68\\xd3\\x8c\\x17\\x04\\x18\\xc1\\x8c\\x2c\\xa2\\x6c\\xd3\\xb4\\xe9\\x19\\x16\\x25\\x07\\xf7\\x35\\x92\\xed\\xa1\\x9d\\xd2\\xa9\\xdc\\x0e\\x63\\xf6\\x53\\x43\\x12\\xc7\\xb3\\x2c\\xcc\\xce\\xdb\\x62\\xf5\\x74\\xdf\\x02\\x91\\xbf\\x23\\x9a\\xdc\\xb9\\x10\\xdc\\xf3\\x09\\xe6\\x5a\\xb5\\x7d\\x48\\x80\\x49\\x98\\x1b\\x00\\xf3\\x2d\\xeb\\xfb\\xf3\\x78\\xeb\\xe0\\x18\\x35\\x13\\x2c\\xed\\x26\\x41\\x53\\x28\\xfe\\x73\\x1a\\x4e\\xd8\\xd0\\x68\\xf1\\x19\\x27\\xbc\\x1d\\x96\\xd8\\xc4\\x18\\xc4\\x03\\xa5\\x69\\x13\\x57\\xca\\x17\\x70\\xc7\\x73\\xee\\x1e\\x1d\\xdd\\x62\\xda\\x2c\\x37\\xaa\\x45\\x69\\xe4\\x40\\x84\\x78\\xa9\\x04\\x82\\x81\\x9b\\x27\\x7e\\xee\\xcb\\x20\\x4d\\x15\\xe3\\x29\\xf2\\xa8\\x00\\xf6\\xad\\x4e\\xec\\xcb\\x94\\xce\\xba\\x22\\xbc\\xd7\\x47\\x28\\x22\\x5c\\x93\\x1e\\xd9\\x3c\\xa8\\x00\\xee\\x31\\x45\\xc6\\x45\\x2d\\x3f\\x72\\x04\\xdb\\x32\\x52\\x71\\x4a\\x7a\\x5d\\xcf\\x42\\x1b\\x25\\x64\\x1e\\xd9\\x39\\xe3\\xfc\\xc0\\x1a\\x0e\\x6a\\xc6\\x3e\\xa1\\x53\\x62\\x12\\x6b\\x42\\xc4\\x29\\x8e\\xc5\\x99\\xf3\\x37\\x3c\\xd1\\x8e\\xcc\\xd1\\x34\\x44\\xad\\xa5\\x41\\x7a\\xfa\\xdb\\x22\\x3a\\xd9\\xa6\\xa8\\x04\\x81\\x9a\\x8a\\x37\\xe1\\x23\\x63\\x96\\x6d\\x51\\x58\\xb9\\xc2\\xa4\\x93\\xe6\\x79\\x7f\\x2f\\xfb\\x93\\x1d\\x1f\\x65\\x09\\xe6\\xe7\\x5d\\x48\\x23\\x35\\x4f\\xab\\x0a\\x06\\xae\\x49\\x24\\x25\\x56\\xf0\\xc7\\xef\\xcc\\xad\\x6e\\x65\\xe1\\x8f\\xaa\\xe4\\x23\\xb2\\x66\\x2b\\x43\\xc3\\x8c\\xf3\\x71\\x9a\\x3a\\x0a\\x6c\\x09\\x77\\xa3\\x8e\\xda\\x21\\xe7\\x46\\x3c\\x82\\xe2\\x71\\x27\\x5e\\x22\\x92\\xf7\\xba\\x31\\xf4\\xa2\\xf3\\x5e\\x7b\\x1f\\xc3\\x13\\x98\\xb6\\x17\\xde\\xc4\\xa1\\xbd\\x76\\x9b\\x53\\xa3\\x72\\xd3\\xe8\\x50\\x9c\\x63\\xb3\\x3d\\xb0\\x54\\x93\\xa9\\x65\\x40\\x15\\x09\\x93\\xf4\\x11\\xd1\\x70\\x30\\x2d\\x1d\\xdc\\xde\\xc2\\xbb\\xd5\\xa4\\x61\\x32\\xd7\\xcb\\xc2\\xac\\x91\\x89\\x20\\x14\\x99\\x8b\\xd4\\x02\\xab\\x0f\\xf1\\x41\\x4b\\x64\\xa6\\x18\\x2f\\x57\\x27\\xb6\\x11\\x94\\xe2\\xb6\\xfc\\x69\\x4c\\x8f\\xb6\\xd8\\x01\\x7b\\xf2\\xf7\\x4d\\x11\\xc4\\xba\\x46\\x26\\x40\\x0a\\x38\\xb0\\x79\\x6b\\x44\\xb4\\xe5\\xf6\\xaf\\xf9\\x6f\\x7a\\x22\\x68\\x34\\x59\\x89\\x0f\\x98\\xdf\\x72\\xbd\\x66\\x70\\x4c\\xf2\\xbb\\xab\\x7b\\x3f\\x99\\xc9\\x7f\\x73\\xe0\\x2a\\x5b\\x25\\xdd\\x39\\x78\\xfc\\xda\\x5e\\x48\\x26\\xf7\\x8a\\x93\\x4c\\xfe\\x48\\x22\\x3c\\x83\\xfc\\xf8\\xd5\\x90\\x4e\\xab\\xf6\\xbd\\x92\\x91\\x3b\\x4a\\x96\\xbb\\xb1\\x0f\\xb6\\xff\\xf8\\x1c\\x73\\x71\\xd9\\xfe\\xa3\\xcc\\x03\\x9d\\xa6\\x43\\x54\\x37\\x6a\\x6f\\x98\\xa7\\x38\\x9a\\x35\\x11\\x0e\\x33\\x32\\x91\\x70\\x0f\\x6b\\x20\\x18\\x73\\x9b\\x36\\x64\\x8b\\xae\\x85\\x8b\\x7e\\x6f\\x3e\\xef\\x85\\xc6\\x28\\x09\\xc2\\x61\\x72\\xd5\\xf6\\x38\\xb1\\x78\\x72\\xba\\x6a\\xdd\\x4a\\x9a\\x55\\xec\\x0c\\x0a\\xac\\x82\\x83\\xb3\\x99\\x51\\xe7\\x26\\xcf\\x9e\\xfc\\x18\\xfd\\x57\\xb5\\xbe\\x57\\x21\\x34\\x18\\x28\\x65\\x19\\xe0\\x22\\x0f\\x28\\x1c\\xd4\\xac\\x85\\xb8\\x31\\x06\\x72\\xd8\\x48\\x8b\\xdb\\xeb\\x60\\xcf\\xed\\x3a\\x58\\x35\\xf3\\x73\\xd1\\x79\\x9d\\xe5\\x99\\xb2\\x0d\\xbd\\x5a\\x61\\xab\\xe4\\xf4\\x4f\\x25\\x54\\x14\\xc1\\xc8\\xdc\\x54\\x22\\x18\\x72\\x2d\\x60\\x75\\x20\\x5d\\xdf\\x98\\x30\\x4a\\xfa\\x8b\\x5d\\x4c\\x5d\\x31\\x6a\\xac\\x60\\x1e\\xcc\\xa0\\xbb\\xf4\\x0e\\x19\\xd1\\x78\\x89\\x31\\x05\\xae\\x87\\x78\\xaf\\x65\\x56\\xfd\\x74\\x1d\\xd1\\x39\\x92\\x47\\xa9\\x0a\\x54\\x62\\x6b\\x73\\x9d\\xef\\xb0\\xb5\\x84\\x55\\xe1\\xe1\\x71\\x66\\x78\\xcd\\xa6\\x13\\x47\\x14\\x60\\x72\\xe5\\x50\\xf5\\x11\\x33\\x15\\x70\\x24\\xab\\x5b\\xf8\\xad\\x96\\x3d\\xf2\\xe3\\x47\\x2b\\x88\\x69\\x81\\x34\\x5c\\xbd\\xcc\\x9d\\xe5\\x0e\\x35\\x85\\x9a\\x4b\\xdd\\x26\\x49\\x7d\\x60\\x23\\x56\\x0a\\xc1\\x67\\x14\\xe0\\xb8\\x20\\xad\\xb3\\xed\\x64\\x00\\x6d\\x1e\\x48\\x15\\x30\\x5a\\x79\\xb1\\x98\\xe7\\x8f\\x73\\xa3\\xe6\\x71\\x23\\x36\\x9d\\x16\\x81\\x52\\x44\\x1f\\x88\\x98\\x0d\\x7a\\xae\\x2f\\x4e\\x9c\\x9d\\x06\\xc3\\xc7\\x5a\\x6c\\x72\\xf7\\x5f\\x7e\\x13\\xe8\\x84\\x3e\\x22\\x2c\\x77\\x3f\\x0b\\x6a\\xe7\\x05\\x07\\x3a\\x93\\xc3\\x4d\\x62\\x58\\xe7\\x5b\\xf1\\x0c\\xe3\\xa4\\x69\\x08\\xd4\\x49\\x9b\\x95\\xd7\\x2d\\x1c\\xa3\\xcc\\xf8\\x10\\xd8\\x0d\\x2d\\x29\\xee\\xf7\\xca\\x11\\xa5\\x23\\xa9\\x47\\x96\\x3b\\x7f\\x4e\\x44\\xe6\\x2a\\x67\\x6c\\xc3\\x54\\x92\\x82\\x45\\xa2\\x13\\x22\\x6e\\xa5\\xce\\x9a\\x0f\\xf7\\x52\\xe1\\x93\\x64\\x5b\\x60\\x0f\\x0b\\x82\\xbf\\x9c\\x88\\xe8\\xcf\\xfe\\x44\\x2c\\x70\\x8e\\x61\\x76\\xa1\\xf0\\x28\\xcb\\xc6\\x18\\x54\\xe9\\xf2\\xc6\\xe8\\x93\\x0b\\xb5\\x9b\\xaa\\x1e\\x54\\x9f\\x0a\\x1f\\x71\\xd1\\x10\\x4e\\x26\\x49\\x9d\\x24\\x46\\xb9\\x34\\x0f\\xa0\\xa6\\x66\\xc5\\x93\\xc8\\xc7\\x20\\x77\\xa4\\x8b\\x08\\x3d\\xc3\\x21\\x26\\x1a\\xbd\\x95\\x0d\\x28\\x51\\x54\\x41\\xb9\\x52\\x17\\xd3\\xa2\\x90\\x40\\xc0\\x16\\x19\\xcd\\x34\\x90\\xb4\\x69\\x41\\xa9\\xeb\\x45\\x3e\\x54\\x23\\xd7\\x62\\xa3\\xba\\x94\\xc3\\x5a\\xa6\\x22\\x3c\\x42\\xbf\\x97\\xb2\\x99\\x6a\\x64\\x85\\x09\\x92\\xa4\\x93\\x38\\x87\\x4d\\x62\\xc4\\x09\\x45\\x3f\\xa2\\x9c\\x24\\x3a\\x70\\xa3\\xec\\x70\\xd1\\xc2\\x87\\xe6\\x57\\xb7\\xd2\\x24\\xa1\\x46\\x38\\x14\\xb4\\x0c\\xee\\x49\\x59\\x08\\x54\\xac\\x5f\\x70\\x0c\\x90\\xc0\\xd5\\x61\\x47\\x8d\\xd4\\x0b\\x4d\\xd1\\x4a\\x14\\x5b\\xdd\\x1c\\x41\\x61\\x03\\x11\\x51\\x80\\x7e\\xba\\xf6\\x01\\x42\\x50\\xca\\x76\\xed\\x4f\\xce\\x11\\x1e\\x78\\x4b\\x15\\x13\\xc3\\xd7\\x7b\\x3e\\x43\\x15\\x6d\\x5e\\xe9\\x84\\x47\\xc4\\x83\\x46\\xfe\\x14\\x22\\x06\\xc6\\x0f\\x87\\xc5\\x6a\\x67\\x3c\\x76\\x45\\x7c\\xe2\\x34\\x02\\xbe\\x2a\\xca\\xa2\\x5a\\xaa\\xce\\xbd\\x50\\xa2\\xf5\\x64\\x21\\xd2\\x47\\xa9\\x46\\x26\\xb6\\x90\\x2a\\xab\\x70\\x1f\\x24\\x6e\\xe8\\x57\\x51\\xd6\\x4f\\x02\\xe9\\xa2\\x75\\x42\\x4c\\xb4\\xe2\\x3a\\x5e\\x42\\xd6\\x29\\x4c\\x95\\x7c\\xb6\\x95\\x8a\\x09\\xb0\\x8e\\x1c\\xee\\x90\\xc6\\xe1\\x08\\xe4\\x9a\\x53\\x20\\x20\\x9e\\x64\\x04\\x79\\x4a\\x06\\xb6\\xb3\\x0a\\xb3\\x2e\\xa2\\x40\\x02\\x40\\xf4\\x0a\\xc6\\x10\\x5c\\x50\\x69\\xf3\\x0e\\xb2\\x2d\\x1c\\x5d\\xdb\\x66\\xf8\\x3c\\x1e\\xa1\\x7a\\xe8\\xf5\\x40\\x2e\\x44\\xee\\x77\\xf8\\x9c\\xa1\\xdb\\x6b\\x65\\x10\\x6d\\xbe\\x69\\x71\\x19\\x97\\xb2\\xb7\\x7d\\x65\\x24\\xe5\\xd0\\x74\\x75\\x4e\\x2a\\x97\\xdc\\xdc\\xa6\\x54\\xa5\\x30\\x39\\xbd\\x88\\x70\\xa8\\xcc\\xf7\\xac\\x33\\x84\\xf4\\x31\\xb5\\xe1\\xa2\\x02\\xfc\\xdf\\x0f\\xb5\\x37\\x57\\x02\\x02\\x34\\xbd\\xfd\\x24\\x7f\\xf3\\x6b\\x1c\\xd7\\xe7\\xab\\xda\\xe8\\xeb\\x09\\xac\\x43\\x2c\\xea\\x12\\xde\\x25\\xa4\\xf8\\x6e\\xc6\\x2a\\x05\\x22\\xea\\x08\\x10\\x6d\\x6c\\x12\\xdb\\xe1\\x10\\xe2\\xd7\\x46\\x15\\x9a\\xb8\\x81\\x29\\x7f\\x5e\\xe9\\xc5\\x62\\xe3\\x88\\x18\\xd2\\xde\\x09\\xe2\\x57\\x3f\\x5f\\x76\\x10\\xca\\xa7\\x29\\x16\\x0a\\xa6\\xf1\\x2a\\xee\\xd0\\xf0\\x64\\x39\\x3e\\x95\\xd2\\xa1\\xa6\\xe7\\x0c\\x3e\\x72\\x3f\\x4c\\xea\\xe2\\x9f\\x15\\x96\\x89\\x22\\xa3\\x8e\\xac\\x30\\x0c\\x5b\\x24\\xac\\x17\\x3e\\x89\\xe1\\xdf\\x27\\x89\\xce\\x47\\x8c\\x60\\xcc\\x8d\\xb5\\x40\\xa7\\x88\\x3a\\xd7\\x24\\x56\\xe7\\x0a\\x0d\\xa6\\x32\\x52\\x30\\x9d\\x0e\\x98\\xc8\\x73\\x4d\\x25\\xec\\xf8\\x64\\xb5\\xff\\xf0\\xa3\\x66\\xaa\\x21\\x0d\\x8f\\x85\\xab\\x61\\x0b\\x68\\x19\\x9b\\xea\\x47\\xb6\\xf7\\x83\\x25\\x6a\\xf8\\xe3\\x6e\\x6f\\x9f\\x3f\\x92\\xc5\\xb8\\xdf\\xfe\\xbc\\x0d\\x0c\\xfd\\xfb\\x55\\xae\\x62\\x8b\\x40\\xf6\\xc0\\xe2\\xa9\\x1d\\x56\\xd8\\xe7\\x44\\xa7\\x6b\\x21\\x0e\\xd5\\xb2\\xe7\\xbc\\x67\\x56\\x08\\x58\\x30\\xb2\\x12\\xc9\\x4d\\x6a\\xc6\\x94\\x38\\x5c\\x89\\x1c\\x97\\xbe\\x13\\x86\\xfa\\xc7\\x79\\xfb\\x73\\x85\\x4d\\x66\\xaf\\x75\\x12\\xd8\\xa1\\xf4\\x4e\\x17\\xf7\\x50\\xa1\\x91\\x2d\\x88\\xdb\\x80\\xce\\x09\\x8a\\x48\\x44\\xea\\x83\\xc7\\x1b\\x92\\xf3\\xdb\\xa7\\xd0\\x50\\x21\\x0e\\x19\\x1b\\x10\\x82\\x75\\x34\\xc5\\x36\\x4e\\x48\\x6a\\x64\\x8f\\xce\\x1d\\xc2\\x04\\x47\\x21\\x15\\xfc\\x16\\x21\\x3f\\x80\\xef\\xe2\\x5c\\x9f\\x0e\\xbc\\x97\\xa7\\x15\\x63\\xa2\\x95\\x87\\x02\\x44\\xc1\\x0b\\x7f\\xe1\\xa1\\xcb\\x46\\xfd\\x46\\x0f\\x35\\x23\\xcf\\x82\\x42\\x48\\xa8\\xfa\\xb0\\xbf\\x72\\x53\\x8c\\xa4\\x09\\x13\\x97\\x65\\xa1\\x81\\x2e\\x93\\x2f\\x73\\x13\\xce\\xe9\\xa0\\xd2\\x65\\xa9\\x00\\x6d\\x01\\x6a\\x25\\x4e\\x5e\\xc6\\x71\\xe5\\xee\\xfe\\x79\\x2a\\x95\\xd4\\x49\\x29\\x3f\\x83\\xa0\\x69\\x96\\xad\\x61\\xa5\\xb4\\x28\\xcb\\x5a\\x3c\\x5d\\xea\\x54\\x33\\xcb\\x98\\x9d\\x3c\\xfe\\x53\\x9c\\xa1\\x30\\xe8\\xd8\\x94\\x1f\\xe7\\x92\\xaa\\xe7\\x4d\\xe5\\x8b\\x54\\x46\\x43\\x35\\x40\\x65\\xc2\\x19\\xc6\\xb1\\x1f\\x15\\x85\\xb6\\xa1\\xb6\\xb7\\x62\\x8b\\x06\\xb8\\x2f\\x2f\\xd0\\xaa\\x4f\\x1d\\xac\\x83\\x2f\\xcd\\x43\\x97\\xc5\\xa3\\x81\\x9a\\xfc\\xc0\\x10\\xa2\\xd8\\xe9\\x73\\x85\\x87\\x82\\x2b\\x85\\x66\\x4b\\x7a\\x94\\xf0\\xc7\\x77\\x42\\xd2\\x52\\xcd\\x77\\xfc\\x76\\x32\\xe5\\xd7\\x52\\x30\\x0a\\xd3\\x12\\xf9\\xb9\\x7b\\x87\\x31\\x5d\\x48\\x19\\x0c\\x22\\x14\\x3e\\x4f\\xf2\\x43\\x01\\xec\\x97\\xed\\xa9\\x43\\x12\\x27\\xd2\\xd3\\xc7\\xb7\\xb6\\xf7\\x02\\xb5\\x36\\x48\\x47\\x75\\x23\\xc4\\xe7\\xef\\xe7\\xfa\\x8f\\x62\\x04\\x7b\\xfc\\x8b\\x27\\xa7\\x56\\x8c\\x86\\xe8\\xc5\\xdb\\xb1\\x1b\\x34\\x78\\x8f\\xb7\\x16\\xb2\\xdf\\xb1\\x91\\xa8\\x66\\x89\\x32\\x8c\\xe5\\x8c\\xb0\\xe0\\x51\\x96\\xdd\\x65\\x03\\xbe\\xaf\\xf5\\x8e\\x54\\x06\\xa7\\xbb\\x64\\xcc\\x89\\xdc\\xe7\\x0a\\x74\\x4c\\xbd\\x44\\xc0\\x6a\\x00\\xee\\xdc\\x53\\xd7\\x8c\\x1c\\x34\\x81\\x1f\\x2f\\x39\\x36\\xc6\\x40\\x96\\x7f\\x4c\\x6f\\xa5\\x89\\x2d\\x76\\x0a\\x07\\xbb\\x1c\\x58\\x08\\xda\\xa9\\x09\\x64\\x32\\x6d\\x96\\xc3\\x15\\xcb\\xa4\\x9b\\x2a\\xd4\\xbe\\x88\\xce\\x38\\x27\\x05\\x1d\\x8c\\xf2\\xbb\\x24\\x11\\xf3\\x54\\x2a\\x98\\x8d\\x0a\\xe3\\x74\\xae\\x89\\x43\\x58\\x2b\\x7e\\x14\\xa8\\x45\\x63\\x6e\\xf1\\x2b\\x20\\x24\\x9a\\x7c\\x2b\\x32\\xc8\\x1c\\xcd\\xa3\\x0c\\x48\\xc5\\x6a\\x8d\\x62\\xe9\\x70\\xbd\\xb5\\x15\\x96\\x2b\\xcc\\x71\\xa9\\x11\\xef\\x44\\x55\\x10\\xa7\\x5b\\x0b\\xd1\\xd3\\x9b\\x68\\x20\\x5f\\xb2\\x1a\\xf3\\x22\\xe1\\xf1\\xc0\\xb3\\x5b\\x9d\\x27\\x7e\\xb5\\x04\\xfb\\xc5\\x18\\xea\\x37\\x4f\\x76\\x2c\\x8c\\x46\\xe9\\x90\\x6d\\xa4\\x4c\\xe4\\x55\\xc3\\x77\\x9d\\x68\\x31\\x9c\\x74\\x91\\xd9\\xf4\\x67\\x38\\x61\\xfc\\x3a\\x3f\\xcf\\x9a\\x09\\x19\\xfc\\x01\\x42\\xab\\x1c\\x0c\\x31\\xed\\x2d\\x08\\x6b\\xd4\\x88\\x3d\\xd3\\x2c\\xf4\\xd6\\xf7\\x67\\x60\\xcb\\xcb\\xd5\\x66\\xca\\xdc\\xee\\x59\\x3c\\xf7\\x08\\x34\\x2a\\xda\\x4a\\x50\\x90\\x9b\\x1f\\x6d\\xd5\\xdd\\xa2\\x99\\x57\\xb9\\x4a\\xc1\\x0e\\xe3\\x28\\xf8\\x42\\x24\\xc6\\x4b\\xf2\\x25\\x84\\x5d\\xee\\xfe\\x7c\\x98\\x41\\x6c\\x03\\x83\\x2f\\x97\\x0d\\x75\\xc4\\x47\\x25\\x78\\x1b\\xba\\x98\\x0f\\x73\\xe8\\xde\\x2c\\xc6\\x37\\x9b\\x9f\\xc0\\x73\\x40\\xb3\\x95\\xe7\\x20\\x6c\\xa1\\x65\\x85\\x79\\x36\\xc6\\xd3\\xce\\x1e\\xeb\\xaa\\x07\\xf8\\xc7\\x53\\x04\\xe0\\x98\\x57\\x10\\x7e\\xd3\\x86\\x84\\x7f\\x89\\x14\\x46\\x71\\x70\\x93\\x12\\x76\\xf3\\x3d\\x41\\x66\\x2e\\x58\\x79\\x0f\\xaf\\x3b\\x8d\\x50\\x5c\\x72\\xf8\\x67\\x92\\x0b\\x91\\xd0\\x7e\\xe6\\x30\\x91\\x8d\\x36\\x86\\x6d\\x9a\\x2a\\x84\\x84\\xbd\\x9a\\x8e\\x12\\x5b\\x0b\\xd2\\x2e\\xdb\\x58\\x7b\\x6a\\x4a\\x23\\xd6\\x18\\x1a\\x52\\xb9\\xef\\x9c\\x37\\x27\\x25\\xb6\\x15\\xc9\\x5b\\xc8\\xfb\\xbe\\xd2\\xe5\\xc5\\x8d\\x90\\xc7\\xfd\\x32\\x60\\xec\\x2a\\xc8\\x04\\xc1\\x1e\\x84\\x8d\\x2c\\xb9\\xcb\\x32\\x32\\x85\\xdc\\xd8\\x3e\\xa4\\x60\\xd4\\xac\\x06\\xb7\\xd4\\x51\\x94\\x3d\\xd8\\xb7\\x92\\xd8\\xd7\\xf3\\x77\\x2f\\x25\\xb8\\x9b\\xd3\\x47\\x83\\x87\\x55\\xa6\\x96\\xd4\\xb3\\x5b\\x73\\x5b\\x79\\xb2\\x0e\\xf1\\xbf\\x1a\\xcf\\xf0\\x6a\\x27\\x6b\\x5b\\x19\\xbb\\x3a\\x06\\x61\\x47\\x84\\x1e\\xc4\\x9d\\xe2\\x3e\\xa3\\x9d\\xa3\\x46\\xbf\\xe8\\x98\\x2d\\xa6\\xa2\\x13\\x14\\x75\\x2c\\x4c\\xa3\\xeb\\xad\\xb6\\x38\\x6e\\x2b\\x54\\x47\\xae\\xfd\\x92\\x0c\\x61\\x02\\xe6\\xaf\\xb7\\x2c\\xdb\\x5e\\xae\\xab\\xf0\\xcd\\xdc\\x6f\\xb8\\xfc\\x51\\xbc\\x87\\xad\\xf7\\x79\\x8f\\x56\\xa7\\xcd\\x3b\\xc6\\xe3\\x7e\\x13\\x7d\\xff\\x74\\x20\\xef\\x07\\x1e\\x50\\xf9\\x8e\\xc0\\xb8\\x6d\\x11\\x28\\x6d\\x39\\x77\\x6b\\x72\\x17\\xb0\\xdd\\x91\\x58\\x32\\xe7\\xec\\x50\\xe0\\x96\\x67\\x1c\\xb1\\xdf\\xae\\xb7\\x08\\x89\\x4a\\xf0\\x84\\x39\\x96\\x02\\x13\\x06\\xe4\\xf1\\xcf\\x14\\x2e\\x8d\\x8f\\xa5\\xd8\\x68\\x04\\x49\\xa1\\x94\\xc2\\x78\\x58\\xb2\\x2a\\xd2\\x69\\x17\\xef\\x82\\x98\\x39\\x28\\xc7\\x47\\xaa\\xbf\\xe8\\x23\\xc2\\xfc\\xa9\\x54\\x3d\\x4e\\xfc\\xde\\x90\\xc3\\xf2\\x1c\\x4b\\x1d\\xc9\\x2e\\x1d\\x0b\\x3d\\x48\\xdc\\xf3\\x10\\x19\\xa7\\x49\\x97\\x4c\\x39\\xb1\\x2b\\xac\\x13\\xff\\x94\\xdd\\x45\\x60\\xf4\\x03\\x43\\x09\\xa7\\x65\\x75\\xb2\\xc2\\xb8\\x6a\\xbc\\x0d\\x9a\\xe1\\x4d\\x9d\\xba\\x11\\x13\\xdf\\xe0\\xe5\\xef\\xf8\\xf2\\xb7\\xc0\\xe9\\xa2\\xba\\xde\\x78\\x64\\x08\\x41\\xf4\\x57\\x67\\xa1\\x4e\\x31\\x5d\\x59\\xc2\\x4f\\x01\\xfb\\xcc\\x58\\x59\\x50\\xb6\\x2f\\xba\\x32\\x66\\xc6\\xc5\\x2a\\x4a\\x19\\xea\\xb9\\x2e\\x1f\\x54\\xf2\\xad\\xa2\\xe9\\x4b\\x44\\xdf\\x34\\xf9\\xe1\\x45\\x48\\x71\\x25\\x4e\\xc6\\x0c\\x4d\\xcf\\x39\\x31\\xff\\x3b\\xf6\\xf4\\x9c\\xf7\\xf9\\x9d\\x8d\\xa3\\x34\\xcd\\xdf\\x9a\\xf3\\xe3\\xc8\\xa6\\xd5\\x06\\x32\\x70\\x87\\x30\\x3a\\x6b\\xf2\\x9d\\xb9\\x6a\\x34\\xa7\\x69\\xc9\\xe1\\x3d\\xc9\\xdd\\xad\\x8d\\x54\\xd9\\xd1\\xe0\\x30\\x1e\\x2b\\x0c\\xbf\\xe2\\xbf\\x6e\\x87\\xf6\\x7c\\x0f\\x04\\x6c\\xbb\\x0b\\x6e\\xdf\\x46\\xf8\\x96\\xe6\\xba\\x96\\x1a\\xfa\\x1d\\xcc\\x70\\x69\\xc7\\xc5\\xb4\\xba\\x18\\x07\\xc3\\x30\\x7c\\x7f\\x1a\\x38\\x15\\xab\\x61\\x26\\xfb\\xe8\\xef\\xf8\\x43\\x22\\x09\\x71\\xa3\\x1c\\xdc\\xe5\\xa8\\x7e\\x84\\x72\\x97\\xe0\\x01\\xc5\\x6e\\x0a\\xe2\\xec\\x8b\\x10\\x26\\x4b\\x21\\x2a\\xca\\xbc\\x7d\\x95\\xea\\xc9\\xcc\\x7d\\x12\\x59\\x58\\xe0\\xaf\\x92\\xdc\\xa6\\xda\\xd4\\x6c\\x2d\\x0b\\xdf\\x9f\\x6d\\xf2\\xf2\\x99\\xdf\\xae\\x1d\\x18\\xdf\\xa8\\x33\\x54\\xde\\xf9\\x85\\xf2\\x16\\xcc\\xa5\\x30\\xea\\x80\\xbe\\xd9\\x70\\x18\\x75\\x50\\x53\\x43\\x6e\\xaf\\x3b\\xa6\\x89\\xce\\xba\\x3c\\xd9\\x37\\x90\\xd5\\x08\\xc2\\x7b\\xc4\\x4a\\x99\\xf2\\xb8\\xdb\\xcc\\x02\\x73\\x63\\x02\\xa4\\xb4\\xcf\\xbf\\xc2\\x48\\x45\\x5f\\x46\\x6b\\x00\\x57\\x3f\\xd4\\xc3\\x7a\\x6e\\xdb\\xeb\\xed\\xf8\\xee\\xbe\\xa1\\x27\\x75\\xd3\\x1b\\x27\\x1a\\x8a\\x72\\x01\\x29\\x63\\x03\\xc5\\x55\\xf6\\x84\\x3d\\xc5\\x92\\xb5\\x75\\xb9\\x2e\\x7d\\x8b\\x1a\\x25\\x20\\xf7\\x37\\x4b\\x28\\x8e\\xae\\x7c\\xd6\\x3b\\x24\\x1b\\x95\\x98\\xfa\\x3c\\x0e\\xe4\\x20\\xf3\\x36\\xc7\\xd1\\x05\\x50\\x4c\\x5e\\x76\\xf1\\xa2\\xfb\\x33\\x24\\x7e\\xbd\\x40\\xfe\\xa1\\x61\\x56\\x0c\\x93\\x42\\x9e\\x1d\\xeb\\x71\\x9d\\xa5\\x5b\\x37\\xbe\\xbf\\xeb\\x25\\x2b\\x29\\x01\\x7d\\xec\\xcc\\x79\\x5e\\xa9\\x22\\x3c\\xab\\xcb\\x35\\xe0\\xed\\xec\\xa0\\x7f\\xa1\\x74\\x09\\x24\\xf0\\x35\\x61\\x86\\xe8\\x86\\x0d\\x18\\x87\\xee\\xfd\\x75\\x99\\x86\\x3f\\xfc\\x32\\x5d\\x70\\xad\\x83\\x5b\\xc6\\x94\\x8c\\xf6\\x59\\x4b\\x24\\x85\\x5e\\x6b\\x80\\x94\\xb2\\x03\\x8e\\x0d\\xbb\\x7e\\x17\\x3e\\xa0\\xd8\\xc3\\x93\\x7c\\xc7\\x6c\\x59\\xa4\\xbd\\x64\\xc4\\x75\\x51\\xfc\\xe8\\x4b\\x45\\xf2\\x23\\xab\\xc7\\x4e\\x1b\\xc7\\x36\\xbd\\xe5\\xa1\\xb7\\x9e\\x6e\\x20\\x1e\\x57\\x8b\\xe4\\x0a\\xee\\x69\\xe4\\xf4\\x6f\\x3a\\xb6\\x2e\\x33\\xee\\xc8\\x11\\x66\\x38\\x71\\xc8\\x7e\\x49\\x53\\x91\\x9d\\x41\\xf2\\x1e\\x00\\x09\\x16\\x07\\x1e\\x4b\\x60\\x0d\\x13\\xa7\\xcc\\x2c\\xe3\\xbb\\x21\\x14\\x03\\x98\\xdf\\x4c\\x17\\x9a\\x19\\x31\\xac\\x27\\x79\\x11\\x67\\x99\\xdc\\xf5\\x82\\x93\\x98\\x11\\x99\\x05\\xef\\x4f\\x62\\x21\\xc1\\xaf\\x16\\x73\\x58\\xee\\x67\\x32\\x15\\x71\\x27\\x1f\\x85\\xec\\xe9\\xc4\\xe8\\x0a\\xa0\\x79\\xc8\\x82\\xb3\\xdd\\x7b\\x13\\x81\\x55\\xb1\\xd3\\x19\\xe2\\x3f\\x86\\x63\\xb4\\xcf\\x9d\\xe9\\xec\\x4c\\xba\\xcd\\xd9\\xab\\xec\\x40\\x0e\\x9d\\x7f\\xf9\\x4a\\x7e\\xa4\\xc2\\x32\\x12\\x3f\\xcd\\x82\\x88\\x83\\xfc\\x1d\\xc2\\x7f\\x4b\\xe6\\x0a\\x8d\\xec\\x37\\x58\\x9e\\x28\\xb6\\xf4\\xbb\\x8c\\x37\\x20\\x12\\x28\\x7c\\x76\\x95\\x57\\xe5\\x27\\xb5\\x45\\x82\\xa7\\x51\\xcf\\x71\\xb0\\x14\\x38\\xff\\x98\\xb7\\x7c\\xd6\\x56\\x58\\x8c\\x87\\xe9\\xa3\\x7c\\xeb\\xc2\\xb6\\xf5\\x8f\\x2b\\x9d\\x92\\xb4\\x39\\xa6\\xa5\\x09\\x28\\x73\\x6e\\xf1\\x9f\\x3f\\x98\\x59\\xe8\\x91\\x35\\x6b\\xf7\\xd6\\x9e\\x5b\\x5d\\xa8\\x46\\x6d\\x6c\\x32\\x7e\\x9a\\x44\\xba\\xa4\\x70\\x1b\\xc7\\xe9\\xa4\\xa5\\xc0\\x7b\\x9b\\xaa\\x44\\xd6\\x7a\\x80\\x75\\x6e\\x55\\x62\\xee\\x9d\\x17\\x0d\\x80\\x5c\\x29\\xa3\\x04\\xdc\\x2c\\x69\\x1a\\x7c\\x1d\\xd6\\xb2\\x61\\x19\\x59\\x69\\x8b\\x24\\x80\\xae\\x13\\xd0\\x2d\\x92\\x16\\x49\\x14\\x24\\x5c\\x91\\x23\\x08\\xbc\\xd0\\x54\\x24\\xcd\\x5f\\x08\\xa0\\x83\\xcb\\x8a\\x1c\\x98\\xa2\\x88\\xfd\\x9b\\x7d\\x16\\x44\\x5e\\x10\\x21\\xf3\\x5d\\xd1\\x40\\xca\\xfc\\x48\\xda\\x28\\x24\\x56\\xfa\\x75\\xb4\\xc5\\xcb\\x20\\xc9\\x44\\x26\\x37\\xbd\\x5f\\x68\\x6d\\x51\\xe5\\xef\\xcd\\x6d\\xcf\\x99\\x00\\x1b\\x2f\\xbd\\x17\\x6e\\xd0\\xd8\\x44\\x19\\xaf\\xba\\xd5\\xe1\\x94\\x94\\xc7\\x2f\\x33\\x62\\x6b\\xba\\x91\\xe7\\x43\\x8f\\x9f\\x65\\xeb\\x3f\\xbf\\xf7\\x5e\\xf3\\x57\\xd2\\x32\\x10\\xa5\\x96\\x99\\xf6\\x2b\\xf7\\x66\\x72\\xbb\\x93\\xa2\\xae\\xf0\\x94\\x2b\\x95\\xb9\\xa3\\xb6\\x2c\\xe2\\xa1\\x21\\x8b\\x2a\\x98\\x40\\xa3\\x5b\\x60\\x9f\\x29\\xc0\\x24\\xcc\\x64\\xf8\\x30\\x7a\\x60\\xff\\x91\\x68\\xe7\\x86\\x77\\x27\\x93\\x09\\x75\\xd3\\x2a\\x8f\\x8d\\x77\\xad\\xd1\\x74\\x77\\x21\\xc7\\x38\\x2d\\x9d\\xcb\\xac\\x52\\xd5\\x9c\\x21\\x1e\\xa1\\x30\\x4a\\xff\\xaa\\xa6\\xc8\\x9f\\x1c\\x64\\x4b\\x14\\xc8\\xc6\\x76\\x2d\\xe1\\xfd\\xad\\x70\\x14\\xb7\\xd8\\xad\\x52\\x94\\xfd\\xe0\\x4a\\xa3\\x02\\x27\\x2c\\xab\\xa5\\xd4\\x2a\\x5f\\x94\\x7f\\x84\\xc8\\x20\\x9c\\x03\\xa9\\x3e\\x39\\x39\\x0c\\x13\\x15\\x4b\\x95\\x11\\xbb\\x8c\\x37\\x74\\x0b\\x45\\xfd\\x1b\\xa7\\xe4\\x80\\xd1\\x5c\\xce\\x4d\\x75\\x62\\xe3\\x2c\\x33\\x44\\xaf\\x9e\\x32\\xb5\\xb2\\xe3\\x0e\\x9a\\x6f\\x86\\x2d\\x4d\\xae\\x2d\\x8c\\x86\\x04\\xe1\\xb8\\xc3\\x12\\x23\\xff\\x3a\\x68\\xdf\\xe4\\xf8\\x8f\\x65\\x7d\\xc9\\x02\\x05\\x2c\\xcb\\x3a\\x8d\\xab\\x02\\x3e\\xd8\\x24\\x99\\x50\\x4e\\xa2\\x89\\x9c\\xf9\\x95\\x44\\x47\\x17\\x5a\\x9e\\xe6\\x22\\x45\\x8c\\xe0\\x2d\\xf1\\x2a\\x4f\\xd5\\x94\\x49\\xef\\xb3\\x9f\\x86\\x05\\x9d\\xb1\\x7e\\x62\\xc3\\xdf\\x18\\xb7\\x96\\xe1\\xef\\x8f\\x46\\x45\\x4c\\x1b\\x01\\x85\\x52\\x15\\x33\\x43\\x01\\xe5\\x90\\xbc\\xd4\\xe7\\x9e\\x05\\xff\\x44\\x58\\x6a\\x36\\x44\\x6b\\x03\\xb2\\xa5\\x1b\\xa6\\x87\\xb9\\x48\\xd5\\xf9\\xf7\\x7e\\xcd\\x43\\x99\\xf9\\x92\\xe0\\xf0\\xeb\\x0c\\x11\\xf2\\x28\\x2b\\x75\\x83\\x62\\x65\\xf6\\x12\\xba\\x2a\\xa4\\x00\\x2a\\x8c\\x56\\x44\\x57\\xfd\\x1e\\xf1\\xb3\\x87\\x16\\x6d\\xe4\\xdd\\x9f\\x89\\x88\\x66\\x43\\x61\\x7e\\x86\\x49\\x4e\\x67\\x21\\x47\\x5f\\xe1\\x24\\xf1\\x8f\\x5c\\x62\\xe1\\x50\\xe4\\x96\\x51\\x18\\x9b\\xe5\\x97\\x27\\xe9\\x7e\\xca\\x35\\x76\\xec\\xac\\x25\\x71\\xf1\\xd8\\xbf\\xaa\\x8d\\xf4\\x24\\xa7\\xba\\xba\\x9f\\x60\\x53\\xf5\\x9a\\x2f\\xf2\\xc7\\x6a\\x40\\x89\\xe6\\x94\\x4c\\x76\\xbd\\xf6\\x07\\x57\\x0c\\xa0\\x56\\x38\\x27\\xb5\\x84\\xb7\\x0e\\xbd\\x0f\\x7a\\x67\\x80\\x0a\\x31\\x0f\\xe3\\x0c\\x5d\\x9c\\x4f\\xd2\\x22\\x24\\x7f\\xca\\x8e\\xe7\\x22\\x65\\x4d\\x13\\x1a\\x61\\x18\\x3c\\x42\\x9b\\xd9\\xa7\\x5a\\xd1\\xcd\\x79\\xe2\\x63\\x47\\x4c\\xf6\\xeb\\x2d\\x20\\x90\\xde\\x69\\x0e\\x8a\\xa8\\xd3\\x16\\x25\\x45\\x72\\xa0\\xd5\\xb3\\x13\\xb5\\xf0\\xe8\\xa2\\xfd\\xf3\\x48\\xe2\\x69\\xfb\\xf3\\x85\\xc4\\x83\\x02\\x63\\x34\\xb1\\x87\\xf9\\x3d\\xfd\\xb0\\x55\\x31\\x7a\\x35\\xa3\\xb6\\xce\\x6a\\xe7\\xaf\\x27\\xf2\\xf4\\x44\\x4d\\x5a\\xb1\\xfd\\x83\\xa6\\xe4\\xd5\\xf9\\x8a\\xb4\\x46\\x90\\x32\\xe8\\x96\\xe9\\x34\\x6e\\xe4\\x4a\\xdc\\xcd\\x26\\x7e\\x29\\xaf\\xe0\\x4f\\xd4\\x43\\xca\\x3b\\x2c\\x71\\x06\\xb8\\x82\\x98\\x6f\\x19\\x8a\\x5f\\x69\\x63\\xbd\\xc8\\x3d\\xa4\\x81\\xdc\\x4a\\xa8\\xeb\\x8b\\x0d\\x21\\xbf\\xe2\\xf5\\x77\\x65\\x24\\xfc\\x43\\x54\\xee\\xe9\\xf9\\x86\\xd4\\x86\\xca\\x80\\x1d\\xbf\\x68\\x9c\\x10\\xcd\\xa4\\x89\\x58\\x2f\\x65\\x6b\\x38\\x13\\x1a\\xb5\\x92\\x82\\xe3\\x25\\x04\\x5c\\x4c\\x80\\x22\\xe9\\xa8\\x90\\x49\\xa5\\xec\\x36\\x2d\\xfb\\x04\\x6b\\xb1\\x00\\xcc\\x8b\\x6d\\xe2\\x12\\x92\\x23\\xc1\\xc3\\xa5\\xd9\\xef\\xf8\\xfe\\xa8\\x60\\x77\\x04\\x69\\x4e\\x6c\\x6a\\xf9\\x9f\\x12\\xe7\\xc3\\xb7\\x06\\x08\\xe8\\xd5\\xc6\\x01\\x40\\x00\\x79\\xba\\x89\\x8c\\x0a\\xbc\\x77\\x66\\x35\\x80\\x46\\x45\\x49\\x38\\x7a\\xf8\\x5f\\x3f\\x3d\\xd4\\xcb\\x02\\x91\\x7e\\x10\\xab\\x92\\x1e\\x55\\xbc\\x09\\xe5\\x40\\x03\\x53\\x3b\\x10\\xcf\\x3b\\xfe\\x74\\x55\\xfb\\x0f\\x67\\x79\\xc6\\xd2\\x03\\x06\\x42\\x90\\xb4\\xd5\\x3a\\x23\\xfb\\xb9\\xa3\\xd4\\xce\\x78\\x2e\\x47\\x2f\\xea\\xc5\\x0c\\xe8\\x67\\xb3\\xf2\\x17\\x8d\\xe9\\xcb\\xae\\xf0\\xfc\\x3f\\x36\\xdc\\x43\\xcb\\x0a\\x93\\x59\\x13\\x30\\xa8\\x81\\xe5\\xc0\\x07\\x0f\\x22\\x4a\\xf6\\x2a\\x1c\\x67\\x94\\x2e\\x8b\\xda\\xeb\\x65\\x38\\x86\\x46\\x56\\x78\\x7d\\xbd\\xa7\\x42\\x1b\\xb0\\x8b\\x30\\xb3\\xd2\\xe4\\x6d\\xb6\\x07\\xd7\\x49\\xf3\\x2b\\x5d\\x99\\x70\\xe9\\xf4\\x50\\x0c\\x35\\x8c\\x72\\xd1\\xcb\\x65\\x0b\\x0a\\x19\\x74\\xf3\\xf4\\x5f\\xcd\\xc0\\x90\\xb2\\x43\\x76\\x22\\xdc\\xe4\\xc8\\xea\\xec\\xca\\x6e\\x04\\xc3\\x76\\x24\\xf1\\x2c\\x48\\x4c\\xca\\x94\\xb9\\xc4\\xfd\\x56\\xb0\\xb2\\xf1\\xf4\\x30\\xf7\\x02\\x3a\\xa6\\x6f\\x33\\xab\\x31\\xa4\\x1f\\xc0\\x7d\\xcd\\x3d\\xf9\\xc3\\x48\\x7b\\x1a\\x71\\xd7\\x3a\\xc0\\x26\\x15\\x9f\\x2d\\x97\\xda\\x44\\x1f\\x63\\xb8\\x3e\\x4b\\x5d\\x1f\\x4f\\xc0\\xd1\\xb6\\x41\\x45\\x53\\xfc\\x49\\x7f\\x7e\\xc8\\x44\\xec\\x5c\\x07\\x62\\x4d\\xca\\x0b\\xa0\\x3c\\xe9\\x1b\\xf8\\x21\\x77\\x24\\xe2\\x23\\x30\\xd0\\x12\\x05\\x9e\\x54\\x5e\\x0f\\x56\\xb8\\xe6\\xc6\\x1d\\xb0\\xd3\\x29\\x10\\x4a\\xb1\\xd1\\xfc\\x0d\\x5f\\xf7\\xfd\\x5f\\x05\\x91\\x65\\xbb\\x69\\x96\\x21\\xff\\xf6\\xd0\\x76\\xb8\\xce\\xd7\\x7d\\x8e\\x6e\\x90\\x9c\\xdb\\x14\\x76\\x29\\x84\\x45\\x33\\x4c\\xe6\\x89\\x3d\\x4a\\x80\\x98\\x8b\\x70\\xb2\\x4b\\x57\\xed\\xb9\\xc0\\x32\\x89\\xd4\\x2b\\x01\\xef\\xf6\\xa2\\x36\\xfe\\x2a\\xa9\\xdb\\xab\\x4b\\x43\\x65\\x37\\x8b\\xb3\\x1c\\x3c\\xe8\\x41\\x68\\x2f\\x60\\x72\\x71\\xca\\xd9\\x97\\x4f\\x89\\x63\\x66\\xff\\x2f\\xcb\\xef\\xe3\\xc7\\x2a\\x62\\x78\\x12\\x35\\xcc\\xe6\\x42\\xe7\\x93\\x40\\x9e\\xb4\\xa6\\x9b\\x95\\xd4\\x16\\x42\\x84\\xcc\\xb1\\xfb\\x9b\\x8e\\xd7\\x67\\x56\\x75\\xde\\xd3\\xc8\\xe3\\x75\\x89\\x6b\\x00\\x27\\x11\\x97\\x23\\x4b\\x5b\\xa2\\xd2\\x48\\xdc\\xb3\\x08\\x0a\\x7c\\xc0\\x3a\\x81\\xdf\\x88\\x65\\x7f\\xcc\\xe4\\xa8\\x67\\x6e\\x1e\\xab\\x48\\xc4\\x53\\x51\\x88\\x9c\\xb9\\x72\\xf9\\xda\\xa4\\xda\\x96\\x27\\xc6\\xcf\\x21\\x0d\\xf1\\xe3\\xfd\\x38\\xb5\\x58\\x72\\x5a\\xae\\xc8\\x04\\xbc\\x7b\\x92\\x88\\x0e\\xf3\\xad\\xf4\\xa2\\x4c\\x1b\\x84\\x6a\\xe2\\x5b\\xe0\\x59\\x0d\\x9a\\xe8\\x7c\\x5e\\x0a\\x8b\\x3f\\x70\\xf3\\x17\\x7a\\x03\\x3a\\x50\\xee\\x96\\x2d\\x85\\x39\\xf0\\xac\\x96\\xe7\\xb1\\xc9\\xce\\xc1\\xc6\\x79\\xe0\\xc8\\xa0\\xf3\\x62\\xb9\\xe0\\x00\\x5a\\x77\\x7b\\x7b\\x50\\x99\\xd3\\x8e\\x9e\\x67\\x5c\\xde\\xf3\\x17\\x49\\x2c\\x1b\\xac\\x5d\\xbc\\x21\\xe2\\x37\\x03\\x09\\x59\\x68\\xb4\\x03\\xee\\x3a\\x30\\xc9\\xdb\\x90\\x35\\x8f\\x90\\x53\\x67\\xbf\\x13\\x91\\x9a\\x14\\xe1\\x0c\\xea\\x01\\x10\\xe1\\x54\\x1e\\x6e\\x22\\x52\\xe4\\x9a\\x96\\x56\\x45\\x7c\\x27\\x33\\xbd\\xbd\\xa3\\x04\\x1c\\xd8\\xaf\\x00\\x95\\x08\\x3b\\x51\\x8c\\x36\\xef\\x25\\xb1\\x67\\x97\\x8e\\x4a\\x2d\\x2f\\x6e\\x86\\x43\\xda\\xf4\\xa1\\xd3\\xd6\\xd8\\xb9\\xf4\\x0b\\x79\\x2f\\x91\\xf6\\x5a\\xdb\\x72\\xbc\\x7c\\x69\\x8e\\x92\\x28\\x40\\x06\\x09\\xac\\x80\\xf0\\x87\\x28\\x37\\x75\\x18\\x7c\\x71\\x39\\xc8\\x0c\\x1f\\x3b\\x21\\xfc\\x96\\x66\\x46\\xb5\\x5f\\x5f\\x3e\\x9d\\xbd\\xb7\\xc2\\x9f\\xe0\\x6e\\x40\\x1a\\x99\\xa4\\xd1\\x3e\\x17\\x73\\x86\\xb1\\x59\\x31\\xdc\\x81\\xec\\x84\\x00\\x63\\x30\\x0c\\x33\\x9a\\x57\\x7b\\x87\\x64\\x4b\\x04\\xca\\x73\\x75\\x28\\x09\\xbe\\xc7\\x49\\x65\\xd3\\x04\\x40\\xd6\\x98\\x2a\\xdf\\x06\\x16\\x24\\x85\\xa5\\xba\\xd5\\x5c\\x17\\xca\\x3f\\xb4\\xe4\\x42\\x09\\xa8\\xca\\x4b\\xd1\\x59\\x71\\x03\\x68\\x22\\x9d\\xf8\\xb6\\xd3\\x28\\xc1\\x66\\xd7\\xd8\\x32\\x0e\\x91\\x32\\x0e\\x54\\xb5\\x8c\\x85\\xe4\\x21\\xa2\\x92\\xd2\\x6e\\x2a\\xfa\\x68\\x77\\xb3\\x5e\\x7a\\x64\\x81\\x62\\x9e\\xc3\\xa1\\x31\\x26\\xb1\\xca\\x55\\xc8\\x23\\xbc\\x12\\x20\\xda\\x28\\x19\\xee\\x88\\x6e\\x39\\x01\\x16\\xbb\\x26\\xdd\\x70\\x09\\x6f\\x91\\x35\\x7e\\x67\\x2e\\x75\\x0a\\x36\\xee\\x58\\x5d\\x73\\x2c\\x64\\xff\\x41\\x14\\xbe\\x77\\xb6\\x4c\\x4d\\x77\\x76\\x2d\\xcf\\x12\\xa2\\x49\\xfc\\xa2\\xe1\\x4c\\x24\\x57\\xdc\\x75\\x09\\xb8\\xee\\xec\\xef\\x10\\x99\\x6e\\x27\\x56\\xf3\\xcc\\xf2\\x08\\xae\\x45\\x04\\x82\\xc3\\xea\\xdb\\x8d\\xd4\\x96\\x91\\x32\\x60\\xa5\\x08\\x88\\xac\\x4c\\x8f\\xc4\\x15\\x25\\x46\\x04\\xea\\xed\\x37\\x1e\\xd6\\xad\\x48\\x93\\xdc\\xb1\\xa3\\x64\\xad\\x84\\xc6\\xf6\\x3b\\x36\\x14\\x76\\x8a\\x46\\x28\\xa1\\x4e\\xc8\\x79\\x89\\x28\\x39\\x04\\x03\\x71\\xb5\\xd2\\xf6\\xf7\\xf3\\xdc\\xeb\\x0c\\xd7\\x15\\xdf\\x9e\\xeb\\x3a\\x35\\x76\\x8c\\xc6\\x8e\\xdc\\xd3\\x55\\xea\\xa0\\x72\\x29\\xe0\\x9c\\x96\\xee\\x27\\x17\\x23\\x73\\x91\\xd2\\x05\\x72\\xf6\\x8e\\x0e\\x76\\x99\\xad\\x50\\x6e\\xbe\\x7c\\x22\\x83\\x83\\xf3\\x69\\xe7\\x70\\x23\\xee\\x6b\\x76\\xd6\\xca\\x66\\xae\\xde\\x0d\\x02\\xa6\\xe5\\x30\\xb1\\x2c\\xad\\xd2\\x0f\\x09\\x65\\xb8\\xa6\\x2e\\x71\\x5b\\x59\\x9f\\xd4\\x6a\\x32\\x3d\\x35\\xb8\\x59\\xa9\\x8a\\xb1\\x16\\x2f\\xd0\\x41\\x0d\\xfe\\x88\\x91\\x2c\\x8f\\xce\\xaf\\x25\\xd3\\xce\\xc8\\xab\\x0b\\xeb\\x85\\xca\\x98\\x99\\x8e\\x96\\xe5\\xc3\\x08\\xad\\x2a\\x21\\x1b\\xee\\xb4\\x34\\xdf\\x0f\\xad\\x89\\x15\\x95\\xa6\\x6e\\x23\\xb5\\xe2\\x02\\x94\\x8d\\x45\\x52\\x17\\xa5\\xc5\\x42\\x5d\\x68\\x24\\x6b\\x78\\x04\\x9f\\x24\\x0a\\xd1\\x11\\x41\\x83\\x8e\\x80\\xab\\xdc\\x64\\x1d\\x1e\\x79\\x8b\\x1e\\x2a\\x0b\\x25\\x64\\x1e\\x6f\\xd6\\x5f\\x2a\\x55\\x8e\\xb9\\x6d\\x24\\xb2\\xa6\\x9e\\xa1\\x65\\x1d\\xbc\\xdf\\xbf\\x48\\x60\\x1f\\xa8\\xd2\\xfc\\xa0\\x27\\x6f\\x11\\x78\\x60\\x19\\x95\\x2b\\x88\\x1b\\xa7\\xee\\xd7\\xe3\\xbe\\xdd\\x69\\x45\\x4a\\xd7\\x4a\\x00\\xc7\\x90\\x6a\\xe4\\xb7\\xae\\x29\\xd3\\xad\\xc3\\xac\\x26\\x13\\xd4\\x10\\x63\\x6a\\x25\\x58\\x76\\x83\\x03\\x0e\\xd5\\xec\\x7a\\x0e\\xd9\\x8c\\x16\\x0e\\x79\\x71\\x57\\xca\\x3f\\x3b\\xe5\\xbe\\xba\\x1a\\x98\\x56\\x50\\x19\\x5d\\xf1\\xd9\\x75\\xb5\\x62\\x7d\\x8d\\x42\\xf6\\xde\\xc8\\xc8\\x86\\x73\\x50\\xb1\\x1c\\xd8\\x86\\xd2\\x1f\\x67\\x9c\\xd1\\x39\\x3f\\x92\\x68\\xc7\\xd7\\x1b\\x71\\xe2\\x1a\\xd0\\xc1\\xf0\\x2b\\xc2\\x06\\x95\\x3a\\x7c\\xd5\\xd4\\xaa\\x0e\\x9b\\xec\\x71\\x4c\\x58\\xbd\\x00\\x86\\x0c\\x11\\x8b\\x58\\x80\\xe4\\x7e\\x93\\x2c\\x22\\xd4\\xb4\\xb9\\xc5\\xc4\\x89\\x0f\\x26\\x5b\\x22\\x27\\xba\\x70\\xd3\\xa5\\x52\\x76\\xe2\\x0a\\xa9\\x23\\xf5\\x3b\\xb9\\x6f\\xeb\\xaf\\xc3\\xaa\\x5e\\x34\\xa1\\xa7\\x27\\x96\\xa3\\x16\\x15\\x32\\x07\\xd0\\x19\\x0b\\x95\\x78\\xd5\\x32\\x39\\x9e\\xb3\\xa0\\x19\\xef\\x12\\x24\\xd3\\x73\\x27\\xe2\\x01\\x39\\x13\\xea\\x4f\\xdc\\xf5\\xed\\x63\\x60\\x5c\\x48\\xa4\\x10\\x39\\xdc\\x21\\x12\\x21\\xba\\x84\\x7b\\x52\\xd4\\xbe\\x7e\\x3c\\x67\\x54\\x75\\xbd\\x4e\\x56\\xcc\\xec\\x89\\x0b\\x28\\x92\\xff\\x08\\xc0\\xba\\xf4\\x7d\\x47\\x54\\x8d\\x25\\xf3\\xe3\\x73\\xb2\\x16\\x4f\\xee\\x15\\x7a\\x60\\x31\\x0d\\x8e\\xb1\\x81\\x2c\\x3c\\x44\\xc5\\x88\\x72\\x89\\xab\\xdb\\xfd\\x7c\\x92\\xbb\\x0c\\x66\\xce\\x68\\x04\\x90\\x09\\x14\\x0d\\xe4\\x96\\x46\\xc1\\xfb\\xde\\x65\\xc7\\x8d\\xff\\x9b\\x3a\\x2d\\x4c\\xd6\\xa1\\x85\\x30\\xf6\\x6f\\x73\\xc1\\xdc\\x7a\\xf2\\xce\\x8b\\xaa\\x3b\\xec\\xa7\\x50\\xa9\\x55\\xf7\\x72\\xf8\\x6d\\x26\\x2a\\x59\\x5c\\xe3\\x91\\x35\\x99\\x5d\\x43\\x91\\x14\\x28\\x0e\\xd8\\x0f\\xfe\\x1f\\x52\\x90\\x32\\x56\\xae\\xf5\\x7a\\x58\\xd6\\xc8\\x0c\\xab\\xdf\\xac\\x1d\\xbf\\x18\\x1e\\x29\\xd3\\xbb\\xee\\x34\\x43\\x2b\\xb2\\x79\\xc2\\x24\\x17\\xd5\\xec\\x08\\xfe\\x6d\\x4b\\xd8\\x0d\\xfc\\x71\\xde\\x02\\x85\\x6c\\x48\\xfb\\xcc\\xac\\x15\\x9a\\xc0\\x10\\x39\\x4a\\x1e\\xa6\\xec\\xd1\\xa7\\x05\\x93\\x1e\\x4a\\x4d\\xf0\\x88\\x58\\x6c\\xb5\\x7a\\x19\\x2b\\x42\\xc1\\xe0\\xb4\\x06\\xac\\x4f\\x88\\xae\\x7b\\x60\\x24\\x9a\\x3d\\xec\\x88\\x7d\\x8c\\x03\\x8b\\xc0\\x83\\x0a\\x80\\xdc\\x9a\\x2f\\x09\\x9a\\xea\\x46\\xb9\\xd1\\x03\\x26\\xbb\\xa3\\x19\\x15\\xe2\\xc3\\xfb\\xf7\\x27\\x52\\xae\\xbe\\xf2\\x5e\\x36\\x70\\x2a\\x6c\\x8c\\x10\\xd8\\x3d\\x46\\x1a\\xaa\\x14\\x0b\\x14\\x00\\x51\\x31\\xc3\\x17\\x8d\\x6b\\xf2\\xe7\\x36\\x80\\x59\\xc9\\xe8\\xb1\\x4f\\xf0\\xf9\\x3c\\x43\\x9a\\x98\\xc9\\xc6\\x60\\x79\\x3f\\x1d\\xe4\\x26\\xe4\\xd1\\x4b\\xde\\xcd\\x0d\\xad\\xd1\\x74\\xfa\\xbb\\x29\\xd2\\x79\\x79\\xbe\\xf4\\xac\\x40\\x21\\xb6\\x5b\\x7e\\x0f\\xf2\\x41\\x24\\xb5\\x19\\xcb\\x5b\\xdd\\xf6\\x81\\x34\\xc2\\x4e\\xa5\\xa1\\x70\\x9a\\xe5\\x3d\\x37\\x4f\\x62\\x02\\x35\\x8f\\xad\\x06\\xfc\\x2d\\xff\\x9e\\x9c\\xce\\x77\\xd4\\x7c\\x44\\x98\\x09\\xa7\\xd9\\x67\\xa4\\x65\\x0d\\x61\\x9a\\xd9\\xf2\\xbe\\x05\\x45\\x6b\\x6a\\x98\\x52\\xc2\\x8e\\x3a\\xe6\\x9c\\x82\\xb6\\xac\\x22\\x39\\x7c\\xe9\\x2a\\xee\\xfd\\x7b\\x09\\xbf\\x20\\x4e\\x5d\\xf3\\xdf\\x79\\x8a\\x0e\\x00\\xc4\\x28\\x65\\xa1\\xab\\x24\\x1b\\x59\\xc6\\x04\\x5c\\xfe\\x02\\x89\\xf4\\x6e\\x93\\x99\\x88\\x92\\xbf\\x89\\xbb\\xfc\\xe2\\xbe\\xd1\\x72\\x26\\x46\\x87\\x38\\xfd\\x64\\x0f\\x31\\x6f\\x92\\x75\\x27\\xa6\\x34\\x03\\x1a\\x34\\x97\\x1e\\x63\\xff\\xde\\x95\\x08\\x7f\\x21\\xb8\\x0f\\x94\\xe4\\x53\\xb9\\xe8\\x9f\\xe4\\x74\\x92\\xfe\\x28\\x3e\\x47\\xad\\x5d\\xc4\\x7d\\x55\\x97\\x22\\x17\\xe1\\x15\\xe1\\x0f\\xcd\\x17\\xd4\\x4b\\xab\\xf8\\x9d\\x86\\x2a\\x51\\xa9\\xf5\\xbb\\x26\\x96\\x12\\x88\\xcf\\x3e\\x52\\xf7\\x05\\x3a\\x42\\x74\\x77\\xe6\\x52\\x5f\\x2c\\xeb\\x88\\x3c\\x02\\xcb\\xbb\\x3b\\xa0\\xd4\\xce\\x5d\\x53\\xab\\x57\\x0a\\xab\\x4c\\x0c\\x9d\\xf1\\xf5\\x66\\x2e\\x63\\x26\\x56\\x9f\\x95\\x6a\\xb9\\xfe\\x3b\\xf7\\x3a\\x79\\x6a\\xa7\\x83\\xab\\xcb\\x0a\\x0a\\x9a\\xc9\\xd2\\xbb\\x79\\x8f\\x07\\xcd\\x3f\\xb9\\x58\\xc8\\x9d\\xe9\\x1e\\x04\\xd8\\x15\\x35\\x6f\\x9a\\x66\\x71\\xd0\\x9a\\x0e\\x9b\\xd7\\x78\\xd3\\xd4\\xd7\\x41\\xf9\\xae\\x4d\\x7b\\x12\\x15\\x51\\x3f\\xfe\\xc3\\xf0\\x83\\x71\\x31\\x5a\\xb8\\xf6\\x78\\x95\\x35\\xf5\\x54\\x57\\x05\\xc9\\xdd\\x35\\x40\\xa2\\xa0\\xc0\\x92\\x4f\\xf0\\x8b\\xf8\\x4d\\x39\\x46\\x07\\x9a\\xde\\x14\\xd2\\x7b\\x64\\xd9\\x16\\x08\\xad\\x99\\x77\\x51\\xbf\\x42\\xd9\\x7a\\x59\\xd0\\x66\\x83\\x90\\x6a\\x5d\\x72\\x1a\\x05\\x4f\\x74\\x38\\x05\\x03\\xd5\\x71\\x21\\x16\\x48\\x47\\x38\\x34\\x1d\\x4b\\xb3\\x69\\x24\\xd6\\xf0\\x42\\xb3\\x00\\xee\\x05\\x22\\x3d\\x63\\x15\\x50\\x0a\\xd7\\xc2\\x9f\\x3f\\x69\\x3f\\xc6\\xf1\\x0f\\x94\\xe5\\xa6\\x3c\\x89\\x79\\x2a\\xbe\\x4b\\xfb\\x47\\x3b\\x53\\x7f\\x6f\\x6c\\x78\\xdf\\x48\\x33\\xf7\\x26\\x9c\\x43\\x8c\\xb9\\xeb\\x2e\\x52\\x82\\x1a\\x7d\\x28\\xc2\\xcf\\x90\\x6f\\xe7\\x65\\x47\\x8e\\xa1\\xbf\\x87\\x4a\\x47\\x20\\xdb\\x82\\x50\\xd6\\xc8\\x4c\\x30\\x85\\xab\\x55\\x6c\\x97\\x33\\x9c\\xdc\\x28\\x14\\xe4\\x71\\xc0\\x96\\x72\\x0f\\xa9\\xfd\\x74\\xa1\\xda\\xd9\\xb2\\x6c\\xe5\\x8a\\x42\\x0c\\x88\\x50\\x84\\xa6\\xce\\x12\\x34\\x72\\xc3\\x34\\x1b\\x24\\x5f\\x60\\x3b\\xc3\\x10\\xbc\\xfe\\x71\\xa9\\x38\\x7d\\xd7\\xa4\\x56\\x84\\xfa\\xaa\\xb6\\x80\\x95\\x68\\x4b\\xc7\\x11\\xa3\\xeb\\xb6\\x37\\xa2\\xf5\\xe8\\x80\\x8b\\xf8\\x0d\\xda\\x87\\x9f\\x04\\xe0\\x8d\\x27\\x82\\xc3\\x34\\x22\\x50\\x9b\\xa0\\x58\\xfa\\xa4\\x4f\\x21\\x31\\xb4\\x78\\xa0\\xf0\\x78\\x04\\x08\\xca\\x6d\\x99\\x74\\x81\\x49\\x04\\x51\\xa0\\x6a\\xff\\xd1\\xc4\\x0f\\xad\\x2a\\x0b\\x98\\xd0\\x27\\x71\\x5a\\xab\\xd7\\xc7\\x80\\x86\\x02\\x61\\x11\\xd4\\x85\\x43\\x3b\\xf3\\xf2\\x09\\xbc\\x18\\x26\\x04\\xc9\\xcd\\x0e\\x8e\\x6c\\x59\\xb2\\xf3\\x6c\\x3e\\x3b\\x4f\\x63\\x5f\\x76\\x3f\\x1d\\x16\\x61\\x8f\\x54\\x79\\x8d\\x2a\\x99\\x4d\\xb1\\xef\\xe1\\x72\\x50\\xf3\\x35\\x92\\x61\\x48\\x38\\x83\\x0f\\x0e\\xe8\\xed\\x95\\xe7\\xd7\\x06\\x13\\x38\\x9f\\xc5\\x4e\\x39\\x8b\\x9a\\x48\\x09\\xb9\\xa3\\xf1\\xde\\x84\\x61\\x69\\x61\\xc6\\x38\\x12\\x7f\\x51\\x78\\x5e\\xde\\xf9\\xe0\\xd3\\xf7\\xaa\\x1b\\x60\\xf4\\x7b\\xc1\\x27\\x60\\xd7\\xc2\\x85\\x98\\x5b\\x9c\\xba\\x15\\x2d\\x9a\\x1d\\xb6\\x88\\x2a\\xb1\\x37\\x37\\xc1\\xf8\\xad\\x8c\\x85\\x9b\\x29\\x56\\xfb\\x1f\\x77\\x81\\x05\\x67\\x92\\x42\\x0f\\x98\\x13\\x03\\xbc\\x2a\\xb0\\x3a\\x64\\x33\\x41\\xa1\\x7a\\x22\\x2a\\xf4\\xb5\\xf0\\x9c\\x28\\x97\\x6b\\xa2\\xf7\\xa4\\xea\\x32\\x45\\x38\\x43\\x0a\\xab\\x3b\\x0c\\x89\\xb5\\x81\\x6f\\xa5\\x8f\\x9d\\x11\\x06\\x18\\xe6\\x45\\xfb\\x5f\\x51\\xd3\\xb1\\x62\\xcc\\x34\\x8b\\x6e\\x74\\x44\\xbb\\x4e\\x07\\xde\\x1e\\xb2\\x6a\\x59\\x29\\x33\\x83\\xe8\\x56\\xa4\\x42\\xc1\\x19\\x1c\\xe2\\x21\\x28\\x92\\xd0\\x9a\\x34\\x21\\x4d\\xe7\\x98\\x77\\xfd\\xa5\\xce\\x26\\x0d\\x9b\\x94\\xa8\\x87\\x18\\x6f\\xff\\x0e\\x6e\\x4a\\xca\\x92\\x22\\xc9\\x6b\\x52\\x26\\x55\\x5f\\xff\\x3a\\x96\\x74\\x85\\xcf\\xb5\\x3c\\x1d\\xfe\\x9b\\x30\\x80\\xe5\\xa7\\x51\\x4b\\xd4\\xe7\\x44\\x8f\\x1c\\xef\\x85\\x9a\\x6f\\x94\\xaf\\x47\\x5e\\x65\\x21\\x7f\\xec\\xc3\\xe6\\x26\\x2f\\xe9\\x16\\x1b\\x53\\xde\\x99\\x91\\xb6\\x72\\x62\\x67\\x90\\x15\\x48\\x03\\x42\\x97\\x1f\\x66\\x8a\\xd9\\xe9\\xc6\\x5f\\x82\\x09\\xf4\\xea\\xe3\\x4d\\x33\\xcc\\x0a\\xff\\xad\\x05\\xd9\\x07\\xb3\\x83\\x5e\\xba\\xbd\\xa4\\x6e\\x59\\xb9\\xd5\\x22\\xe9\\x4a\\x71\\xeb\\xb9\\x4c\\x6d\\x71\\x74\\x15\\xa2\\x72\\x40\\xb3\\x5f\\xd3\\x11\\x5e\\x35\\x22\\xa3\\xc9\\x48\\xe8\\x86\\x29\\xd2\\xd4\\xc9\\x1f\\x97\\x39\\x38\\xc4\\x1f\\x0e\\xbe\\x7b\\xb7\\x25\\x3c\\x34\\x58\\x22\\x95\\xe4\\x95\\x02\\x2d\\x20\\xec\\x92\\x07\\x5e\\x0c\\x37\\x7c\\x58\\x2a\\xe8\\x02\\x03\\x24\\xb7\\x8c\\xb3\\x7f\\xb1\\xe3\\x92\\x03\\xd8\\xe9\\x4c\\x08\\xe8\\x66\\x71\\x04\\xad\\x56\\x69\\xfe\\x32\\x82\\xa2\\xb4\\x04\\xe0\\xdd\\x48\\x1d\\x36\\x72\\x31\\xb5\\xcf\\x73\\xd3\\xbe\\x4d\\x1d\\xb5\\x17\\x75\\xe0\\x9b\\x6e\\xc2\\x0a\\xe6\\x32\\x5e\\x2a\\x61\\x35\\x21\\x7d\\x9d\\xa0\\xcb\\x7a\\x43\\xa4\\x94\\x5c\\xd4\\xff\\x40\\xff\\xb7\\xb0\\x53\\x40\\xbf\\xc0\\xaf\\x90\\xf1\\x31\\xe4\\xf7\\x97\\xf8\\x1e\\x03\\xfd\\x2d\\x09\\xef\\x5b\\x67\\xec\\x4c\\xe0\\x77\\xa9\\x6b\\xf1\\x43\\x43\\xa8\\x23\\xc6\\x05\\x30\\x0f\\x77\\x82\\x45\\xeb\\xf5\\x58\\x65\\x46\\x11\\xd1\\x22\\x2b\\xae\\xa4\\x55\\xf1\\x78\\x1f\\x6b\\x38\\x9b\\xc7\\x06\\xeb\\x98\\xb6\\x25\\x20\\x70\\xc5\\x44\\x73\\x76\\xcb\\x60\\x26\\x7f\\x64\\xaa\\x3e\\xf0\\x41\\x53\\x36\\x37\\x52\\x3a\\x54\\xf5\\x9e\\xec\\xc7\\x5a\\x03\\x2c\\xd3\\xb6\\x6e\\xe6\\xcb\\x0e\\x18\\xda\\x41\\x5a\\x65\\x6c\\x92\\x28\\x6c\\xe0\\x71\\x1e\\x13\\x62\\xfa\\x3b\\x61\\xb8\\x44\\xce\\x52\\xd8\\xc3\\x46\\xe9\\x51\\xeb\\x24\\x6e\\xed\\xbc\\x1c\\xf5\\x13\\xd7\\x22\\x37\\x5c\\x3a\\x77\\xa6\\xf1\\x54\\xb2\\xe6\\xaf\\xce\\x3a\\x3b\\xd5\\xba\\x9f\\x59\\xfd\\x02\\xd9\\x83\\x55\\xab\\xd0\\x53\\x3d\\xab\\x62\\xfd\\xd3\\xef\\x34\\x84\\x51\\xb0\\x8e\\x07\\xb5\\xbf\\x8c\\x68\\xba\\xb7\\x75\\xf2\\x96\\x3d\\x36\\x7e\\x84\\x1f\\xd4\\x57\\x5d\\x8f\\x84\\x86\\xb3\\xd2\\xa9\\x67\\x78\\x9c\\xc1\\x5d\\x4f\\xb0\\x22\\x29\\x86\\xd6\\x30\\x6f\\x5d\\x7f\\xc9\\xe9\\x9a\\xfa\\x09\\x53\\xd8\\x96\\x89\\x0f\\x6e\\x69\\x55\\x55\\x7e\\x86\\x9a\\xec\\x5d\\x98\\x14\\x26\\x93\\x0c\\x76\\x53\\x4c\\x5b\\x15\\x36\\x2a\\x0a\\xba\\x4c\\x1b\\x47\\x89\\x58\\x7b\\x5f\\xaf\\x6e\\x31\\xb9\\x0a\\x00\\x7b\\x23\\x9f\\x6a\\xc5\\xbf\\xbb\\x5c\\x07\\x57\\x12\\x61\\xb3\\x19\\x9f\\x92\\x6a\\x99\\x03\\x75\\xb2\\x23\\x3f\\xea\\xa4\\xe3\\x68\\xb3\\x26\\x3a\\x88\\x33\\xfc\\x4f\\xbd\\x3a\\x4a\\x96\\xb4\\x90\\xe4\\x09\\x6a\\x3d\\xfe\\xd7\\xb9\\x3f\\xb2\\x48\\xac\\xb1\\xa5\\x74\\x3e\\x74\\xa4\\xf5\\x6c\\x5b\\xea\\x0b\\x7e\\x04\\x9d\\x91\\x36\\xde\\x20\\x5a\\x96\\x76\\x99\\xbb\\x6d\\x89\\x91\\x2f\\x24\\xe1\\x10\\xbd\\xe5\\x0d\\x21\\xa2\\xf7\\x84\\x78\\xac\\x04\\xdc\\x5b\\xeb\\x44\\xbe\\x5b\\xee\\x2a\\x88\\xdd\\x6c\\x79\\x14\\xa2\\xd0\\xa1\\x8f\\x7e\\x6e\\x77\\xe9\\xb3\\x0f\\x3d\\x76\\xdc\\xd6\\xbe\\x39\\x3d\\xb9\\x86\\x0d\\x1a\\xac\\xa2\\x1d\\x0d\\xdb\\x29\\xc2\\x13\\x29\\xfb\\x98\\x44\\xc1\\x5a\\xbe\\x29\\x95\\x17\\x16\\x39\\xd7\\x3b\\xb5\\x7c\\xad\\x26\\xde\\xbf\\x9c\\xa4\\xb4\\xea\\xf3\\xce\\xcd\\x30\\x4c\\x39\\x04\\x76\\x12\\x17\\xb1\\xe6\\xa8\\x88\\x8c\\x2f\\x8c\\x11\\xbf\\x01\\x59\\xcb\\xd7\\x7f\\xd5\\x43\\x23\\x82\\xe7\\x49\\xa0\\xa1\\x62\\xaf\\xf4\\xdc\\x10\\x85\\x43\\x7f\\x9e\\x2c\\x81\\x90\\x8c\\xeb\\x9f\\x13\\xd8\\x45\\x2a\\x1f\\x59\\x31\\x6e\\xf6\\xc8\\x36\\x42\\x04\\xca\\xb6\\x9b\\x19\\x4d\\x40\\xec\\x77\\x41\\x32\\xdf\\x96\\x5c\\x40\\xbf\\x49\\xb0\\x32\\xd1\\x18\\x83\\x05\\x4f\\xfc\\x49\\xd0\\x5b\\x22\\xaa\\x76\\x34\\x44\\x0b\\x16\\x02\\xf4\\xff\\xd4\\xbe\\xbd\\x65\\xd1\\x9b\\x2a\\xf8\\x47\\xc5\\xcf\\x8b\\x00\\xa1\\x81\\x11\\x89\\xbe\\x5c\\xbd\\x92\\x12\\x34\\x09\\x7a\\x47\\x28\\x85\\x65\\x44\\x5f\\x2f\\x54\\x4a\\x89\\x1f\\xb8\\x5a\\x68\\x8e\\x39\\x41\\xf3\\x70\\xf1\\x00\\xf5\\x52\\x8f\\xc6\\x29\\xad\\xc2\\x4e\\x76\\x45\\x58\\x2f\\xd2\\xd7\\x35\\xf9\\x76\\xa5\\xb7\\x94\\xc2\\x4b\\x70\\x97\\xa2\\x85\\x71\\x24\\xfc\\x6b\\x03\\x9c\\x08\\xc7\\xa7\\x7e\\x94\\x1c\\x96\\x0d\\xf5\\x88\\xc3\\x24\\x0a\\xdc\\x9a\\x09\\xe8\\xe7\\xee\\x84\\xb4\\x36\\xd4\\x78\\xa8\\x8f\\x80\\xec\\x7a\\x0a\\x2d\\xdb\\xfd\\x11\\x35\\x2d\\xd5\\x32\\xb4\\x13\\xf5\\x17\\x38\\x0f\\xf3\\x9e\\x54\\xd7\\x83\\x9c\\x59\\xe1\\x9c\\x40\\x68\\x2b\\x13\\xfc\\x50\\x7d\\x18\\x2f\\xcd\\x38\\xaa\\x3d\\x47\\x1c\\x09\\x0f\\x8a\\x10\\x65\\xaf\\x20\\x6b\\xf8\\xec\\x14\\xd8\\x19\\x68\\x11\\x03\\x2a\\xfc\\x88\\x8b\\x91\\x48\\x1e\\x19\\x81\\x19\\xd5\\x19\\x97\\xc1\\xf2\\x46\\x6b\\x5c\\x26\\x6c\\xf5\\x84\\x84\\xbe\\x87\\x90\\x2a\\x21\\x69\\x45\\xe2\\xfc\\x9a\\x82\\xb3\\x09\\x62\\xae\\x30\\x53\\xe7\\xbd\\x9e\\x85\\x9a\\xf7\\x0c\\x0a\\xd0\\x70\\x81\\xbe\\x3c\\xbe\\xde\\x4b\\x72\\x12\\xea\\x82\\x53\\xeb\\x6d\\xad\\xea\\x8b\\xc6\\x8b\\x64\\x80\\x0f\\x05\\xc9\\xe6\\xdc\\x58\\x28\\xaf\\x12\\xf2\\x01\\x05\\x03\\xe7\\xdf\\x25\\x23\\xc4\\x3a\\x84\\x07\\x97\\x02\\xfe\\x82\\x77\\x7a\\x0e\\x83\\x69\\x16\\xcd\\x09\\xef\\x77\\x4e\\x18\\x79\\x1a\\xb2\\xc6\\xef\\x74\\xd1\\x58\\x8a\\xc9\\x52\\x7b\\x3e\\xae\\x37\\x09\\x36\\xc0\\x4c\\x6b\\xcf\\x1d\\xc5\\xc3\\x76\\x21\\xa1\\x9b\\xc5\\x15\\xd1\\x28\\x68\\x8e\\xae\\x72\\x20\\x1a\\xda\\x26\\x59\\x04\\xa0\\x9d\\x89\\x06\\x91\\xb5\\x19\\x56\\x00\\x38\\xed\\xf7\\x07\\x16\\xe3\\x16\\x47\\x88\\x0c\\x2e\\x0d\\x2b\\xc1\\xba\\x53\\x6f\\xd2\\xcf\\x51\\x97\\x50\\xad\\x2e\\x6c\\x97\\xcc\\xc0\\xdb\\xec\\xbe\\x50\\x70\\x0a\\x75\\x83\\x9c\\x71\\x3d\\xda\\xbd\\x42\\x31\\x42\\x35\\xe4\\x85\\x76\\x77\\xd5\\xa0\\x19\\x75\\x1a\\x3e\\x37\\xcc\\x71\\x27\\x63\\x5d\\x58\\x6c\\x49\\x5e\\x92\\xe9\\xbe\\xc8\\x54\\xba\\x31\\x0a\\x8b\\x8b\\xcf\\x5d\\x08\\xa1\\x44\\x66\\xfd\\x5c\\x7d\\x5e\\x4f\\x55\\x5f\\x91\\xd8\\xb2\\xf8\\x45\\x52\\x54\\x1a\\xfb\\x6c\\x25\\x98\\x32\\xa1\\x68\\xc4\\x8d\\x5d\\xfa\\x1d\\x22\\xff\\x9e\\x4c\\xa1\\x00\\x8b\\x76\\x17\\x76\\x49\\xef\\xbe\\x41\\xfe\\xd0\\xe8\\xe0\\x33\\x19\\xfd\\xa0\\x3f\\xc0\\x6f\\xdd\\xb6\\x9f\\x1c\\x1b\\x28\\x8b\\x76\\x09\\x15\\x65\\x89\\x68\\x33\\x03\\xe5\\x45\\x08\\xff\\xf3\\x00\\xfb\\xcb\\x6f\\xda\\x70\\xe1\\xb6\\x36\\xdf\\x75\\x74\\xa4\\xe0\\x1c\\x56\\xd8\\x00\\x71\\xcf\\x1f\\x66\\xdf\\xaa\\x0f\\x22\\x8d\\x83\\x07\\xbb\\x61\\x84\\x0c\\x5d\\x10\\x05\\xb8\\x10\\xbb\\xfa\\x3c\\xe6\\xe8\\xb4\\x9f\\xfd\\x4c\\x8d\\xaa\\x68\\xcd\\xf8\\x4d\\xb0\\x88\\x67\\xe7\\xd9\\xb0\\xe0\\x20\\xd1\\x48\\xaf\\xea\\xa7\\x60\\x9c\\xec\\xdc\\x39\\x2b\\x2c\\x0a\\xe1\\x48\\xd5\\x31\\x92\\x09\\x40\\xdd\\x8e\\x63\\x08\\x91\\xee\\x26\\x91\\x43\\xae\\x92\\x39\\xab\\x29\\x11\\x6b\\x92\\xbf\\x3c\\xf9\\x0b\\x37\\xff\\x89\\xe9\\x3c\\xef\\xc3\\xe4\\x20\\x0f\\xf2\\x9d\\xeb\\xf9\\xdb\\x93\\xf0\\x81\\xa9\\x78\\xf7\\x71\\x4c\\x96\\xa4\\x78\\x8b\\x74\\x67\\x05\\x8d\\xd9\\xc2\\x37\\x25\\x9e\\x4e\\x93\\xd4\\x29\\xf8\\xb8\\xe7\\xe1\\x70\\xf1\\x48\\xe9\\x97\\x62\\xaf\\xe0\\xea\\xbf\\xa5\\x37\\xf4\\x83\\xbe\\x1c\\x22\\x4c\\x50\\x68\\xdd\\x6d\\x8c\\xef\\xe8\\x7e\\x22\\xff\\x6e\\xae\\x45\\x79\\x48\\xfe\\x5d\\xde\\x04\\x40\\xf9\\x2f\\x4e\\x86\\xd4\\xb4\\xec\\x9d\\x02\\xb5\\x2d\\x06\\x11\\x8c\\x11\\xa9\\x58\\xd7\\x63\\x3a\\x8f\\xf5\\x25\\x94\\x79\\xd6\\x1b\\x70\\x60\\x03\\x31\\x53\\x9a\\x97\\x08\\x8a\\xc6\\x64\\x21\\x0b\\x35\\xf4\\xea\\xa1\\x41\\x32\\xf2\\x11\\xe1\\xb5\\x13\\xc1\\x0b\\x6a\\x44\\xcf\\x6a\\x77\\x31\\xfd\\x08\\x0c\\x7d\\x5d\\x3d\\xaa\\x2b\\x2a\\x86\\xfd\\x98\\x53\\x04\\x3e\\x5b\\x78\\xb0\\x6a\\x7a\\x38\\xd9\\x9d\\x54\\xa5\\xb3\\x03\\xde\\xbe\\x09\\x7d\\x59\\xbb\\xf2\\x3e\\x6c\\xe2\\x67\\xa7\\xed\\xf3\\x76\\x8d\\x6e\\xa6\\xb4\\x78\\x57\\xad\\x5c\\x38\\x36\\x13\\x38\\x81\\xd1\\xcd\\x2f\\xd9\\xfb\\xc7\\xb0\\x0c\\x36\\x84\\x47\\xea\\x92\\xaa\\x7b\\x30\\xd2\\xcc\\xe4\\x96\\x26\\x3f\\x18\\xd1\\x4b\\x65\\xc2\\x8f\\x27\\x4f\\xe7\\x19\\xdb\\x27\\x29\\x2b\\x94\\x71\\xec\\x1d\\xd3\\xb5\\x6f\\x51\\x36\\x53\\x33\\x4c\\x18\\x1d\\x7b\\x8f\\xfa\\x1e\\xb5\\xf7\\x6b\\x2f\\xc3\\x23\\x94\\x3e\\xf2\\x8c\\xb9\\xa1\\xf8\\x3e\\x7e\\xb6\\xa9\\x6b\\x28\\x82\\xa8\\x0f\\x72\\x21\\x3a\\x84\\x7f\\xc2\\xb4\\xf4\\x7e\\x1e\\xb3\\x67\\x44\\xd5\\x34\\xff\\x95\\x48\\x10\\x9b\\x63\\xc3\\x72\\xf8\\xc9\\x3d\\xe5\\x33\\xdd\\x4f\\x51\\x2e\\xc1\\x62\\x92\\x0b\\x5f\\x7c\\x90\\x77\\x53\\xbd\\xcb\\xe0\\x64\\x62\\xdc\\x07\\xe3\\x7c\\x35\\x23\\x12\\x34\\xac\\x2b\\x76\\x55\\xb0\\x3a\\xff\\xf6\\x1d\\xbd\\x35\\xf4\\x30\\x11\\x15\\xff\\x16\\x9c\\x0b\\x6d\\x00\\x1a\\x10\\x71\\x6a\\x35\\xfe\\x03\\x6e\\x76\\x7a\\x06\\x38\\xc1\\xaf\\x8e\\x4a\\x45\\xfd\\x4c\\xcd\\xd0\\xcb\\x1e\\x8f\\xf2\\xa2\\xd6\\x1e\\xf9\\xe3\\x0c\\xfa\\xba\\xd4\\xe1\\x8c\\xaf\\x49\\x49\\x1a\\xbc\\x6a\\x2d\\x77\\x03\\xd4\\x9c\\xbb\\xdd\\x0f\\xb0\\x11\\xd3\\x29\\x2b\\x81\\x30\\x11\\x13\\x61\\xa2\\x07\\xe6\\x37\\x43\\xad\\x3a\\x31\\x79\\x8c\\x3b\\xe6\\x5a\\x5f\\x5d\\x62\\xe5\\xd4\\x79\\x12\\x40\\x54\\x50\\x7b\\x4b\\x52\\xfb\\xe8\\x95\\xcd\\x2a\\xaf\\xf8\\x91\\x2f\\xa5\\x49\\x7d\\x15\\xba\\xcc\\x26\\x2a\\xbb\\x42\\x5f\\xaa\\xee\\xdb\\xf2\\x6f\\x70\\x8f\\x2c\\xae\\x4d\\x2b\\x29\\x42\\x6f\\x70\\x73\\x38\\xea\\xc2\\xe2\\x2b\\x44\\xf0\\xde\\x2e\\xc5\\x6e\\x5f\\x6b\\x1d\\x4f\\x43\\x97\\xc9\\xbc\\x3c\\xb5\\x1c\\xb9\\x43\\x09\\x8a\\xa8\\x14\\x9a\\x7d\\xfd\\x75\\x7a\\x18\\xec\\xc8\\x2f\\xce\\xb4\\xb0\\xd8\\x63\\xd7\\xf8\\x84\\x90\\xb5\\x4d\\xe2\\xbc\\xf3\\x80\\x4a\\xa2\\x36\\x35\\x9f\\x03\\x5a\\x5c\\x4a\\xe4\\x56\\xe0\\x00\\x8f\\xbe\\x14\\x87\\x1c\\xed\\xb4\\xa2\\x90\\x70\\x14\\x98\\x35\\x32\\xd7\\x8a\\xfa\\x0e\\x48\\x4a\\x53\\xa2\\xc4\\x25\\x16\\xf6\\x12\\xde\\x22\\xd5\\xeb\\x05\\xbf\\x84\\x58\\x22\\xee\\xf2\\xab\\x79\\x93\\x4c\\x90\\xa3\\xe7\\xf0\\x1c\\xb4\\xe5\\xcc\\x98\\x1c\\x6c\\x7c\\x71\\x2f\\xd5\\xcf\\x98\\x54\\x61\\x85\\x5a\\x7b\\x2b\\x57\\xcb\\x4f\\x82\\x95\\x39\\x8a\\xbc\\x05\\x12\\x74\\xc2\\xb4\\x91\\xa9\\xcb\\xd5\\xc8\\xc5\\xa4\\xd1\\xad\\xa4\\x8f\\x0c\\xbc\\x97\\xab\\xe6\\xae\\xca\\xa0\\xb2\\xbd\\x24\\xde\\xbc\\xc0\\xb2\\x24\\x27\\x77\\xd8\\x83\\x46\\x30\\x8b\\x24\\x4b\\xba\\x38\\xc9\\x5a\\x1e\\x7d\\x25\\x61\\xbb\\xed\\x22\\x2d\\x3e\\x51\\xc4\\xf7\\xeb\\xa1\\xdf\\xaa\\x38\\x92\\x05\\xf6\\xa5\\x41\\x89\\x76\\x2e\\x26\\x4f\\x44\\xd2\\x27\\x3a\\x7c\\x7e\\x6d\\x2f\\x27\\x3b\\x3f\\x86\\xba\\x61\\x48\\x4f\\x5d\\x1e\\xb1\\x5a\\xeb\\xcb\\xa0\\xad\\xca\\x4e\\x88\\x96\\x0d\\x20\\x2c\\x9d\\xa8\\x1b\\x58\\xf6\\x7c\\x9e\\x1f\\x83\\x6a\\xee\\x6f\\xe5\\x3d\\xaf\\x13\\xa0\\x61\\x4c\\x31\\xd9\\x8a\\x82\\x29\\xb7\\x35\\x6d\\xd2\\x6f\\x9f\\xdf\\x53\\xbe\\xf6\\x62\\x88\\x88\\xea\\x12\\xc0\\x98\\xc2\\xfd\\x83\\xd8\\xd9\\x23\\x21\\xdd\\x15\\x6e\\xf7\\xd9\\x15\\xeb\\x07\\xbe\\xbc\\x18\\x9b\\xe2\\xe9\\x6c\\x7e\\x21\\x21\\x81\\xfe\\xc0\\xbe\\xa4\\x88\\x3a\\xe6\\x91\\x23\\xf7\\x92\\x57\\x8d\\x90\\xe7\\x49\\x3a\\x41\\x72\\xe1\\x10\\x73\\x13\\x4a\\xce\\x19\\x49\\xf6\\xaa\\x6a\\x5f\\xd5\\x91\\xa3\\xa7\\x16\\xc8\\xe0\\x18\\x50\\x90\\xf7\\x90\\x65\\x2a\\x2a\\x8e\\xff\\x70\\x37\\x08\\x84\\x44\\x87\\x2e\\xbf\\xa7\\x80\\x40\\x39\\x9e\\xe8\\x79\\xde\\x36\\x42\\xa8\\x43\\x51\\x38\\x68\\x80\\x52\\xac\\x8b\\xdf\\xcc\\x43\\xe5\\x66\\x34\\xe1\\x56\\x61\\x17\\xa4\\x3b\\xef\\x99\\x52\\xe4\\x69\\x73\\xcc\\xb7\\x59\\xfb\\xf1\\x72\\xb2\\xce\\x30\\x47\\x7f\\xdd\\x51\\xf3\\xd3\\xaf\\xd5\\x8f\\x98\\x08\\x5c\\x21\\x5a\\x5d\\x10\\xda\\xf7\\x71\\x2d\\x73\\x28\\x76\\x54\\x35\\x4e\\x7b\\x3a\\xb4\\x08\\x94\\xf8\\xe9\\x52\\x74\\xec\\xc6\\x56\\x27\\xe1\\x26\\x0e\\xf3\\xdc\\x0c\\x3b\\x18\\x77\\x0a\\xc9\\x77\\x8a\\x37\\x47\\xc2\\xd6\\x79\\xa3\\xd5\\x89\\xd2\\x21\\x90\\x3f\\xf4\\xc0\\xf0\\xd4\\xe7\\xd5\\xab\\xf4\\xf9\\x29\\xe9\\x33\\xa5\\x63\\x8a\\x7f\\xc4\\xaf\\x56\\xc5\\x82\\x3c\\x1e\\x87\\xd1\\x48\\x31\\x76\\x9c\\xe0\\xd4\\xc8\\x51\\x85\\x21\\xf6\\x79\\x00\\xeb\\x22\\xca\\x82\\x78\\x2f\\xc8\\x1f\\x20\\xe3\\x85\\x48\\xc1\\x33\\xac\\xc8\\xc9\\x99\\xbe\\x8f\\xac\\xda\\x91\\xca\\xa8\\x7e\\x4b\\x44\\x9f\\x42\\x74\\x65\\xb4\\x6f\\xa8\\xb5\\x10\\x29\\xdd\\xa1\\x0a\\xf7\\xd2\\x88\\xb7\\x21\\x8d\\xe6\\x13\\x53\\x84\\xda\\xa1\\x3d\\xa8\\x5d\\x0a\\xb9\\x2a\\x2a\\x0a\\xba\\x4e\\x48\\x24\\xda\\xdd\\x41\\xd5\\x70\\x51\\xdd\\x17\\xc6\\xf4\\xe6\\xff\\xb0\\x23\\xea\\x66\\x30\\x67\\x85\\x0c\\xf6\\x0b\\x67\\xaa\\xf5\\x26\\x2c\\xac\\x0b\\x23\\x61\\x7d\\xf5\\x63\\x4a\\xc8\\x18\\x74\\x57\\xdd\\x08\\x6c\\x69\\xa5\\x2e\\x9f\\xff\\x5a\\x70\\xeb\\x87\\x4b\\x13\\x0f\\xf5\\xb0\\xae\\x06\\xa3\\xe0\\x07\\xe0\\x98\\x34\\xfd\\x99\\x49\\x46\\x4e\\x88\\xb8\\x08\\xc5\\x18\\xdf\\x28\\x22\\xfc\\x15\\x70\\x57\\xed\\x24\\xe1\\x72\\xf2\\xd4\\x21\\x55\\x94\\xc3\\x77\\x6d\\x68\\x40\\xee\\x17\\x18\\xce\\xcd\\x3d\\x89\\x05\\x4c\\x03\\xee\\x3e\\xcd\\x7b\\x99\\xa1\\x3f\\x0d\\xe0\\x56\\x6d\\xe9\\xc0\\x6a\\x12\\x92\\x7c\\x7a\\xc7\\x00\\xa9\\x5f\\xb6\\x03\\xcc\\xfc\\x83\\x8a\\xce\\xcc\\xee\\x32\\x1f\\x63\\x0a\\xf2\\xad\\x27\\xd4\\xae\\x51\\x64\\xa3\\x24\\x2b\\x5c\\x76\\xd6\\xaa\\xf9\\x52\\xc8\\x81\\xe5\\x9d\\xff\\x18\\xec\\xdc\\x63\\x05\\x8c\\x9a\\x33\\x22\\x48\\x4e\\x33\\x8b\\x73\\xe6\\x42\\xf8\\x02\\x87\\x22\\x58\\xd3\\xec\\xf9\\x60\\x64\\x0f\\xe6\\x8f\\xf4\\xc1\\xbd\\xbd\\xbe\\x4e\\x9f\\x06\\x96\\x67\\xf3\\x3c\\x8b\\xbd\\x09\\xcc\\x22\\xc7\\xfb\\x2e\\x2a\\x06\\x73\\xf1\\x71\\x5c\\x42\\xec\\x99\\xb1\\x0e\\x55\\xed\\x4d\\x2b\\x5f\\x2a\\x68\\x55\\x86\\x80\\x3e\\x3d\\x42\\x42\\xe1\\x94\\x11\\x71\\x1a\\x6c\\xbd\\x9b\\x35\\x64\\x1c\\xf4\\x68\\x24\\x21\\x7d\\x20\\x53\\x07\\x15\\xc1\\xf3\\xb6\\x90\\x88\\xd0\\xef\\xd4\\x51\\x72\\x26\\xff\\x3e\\x93\\x69\\xf1\\xb9\\x14\\xf7\\xb6\\x20\\x65\\x7d\\x07\\xba\\xd1\\xc6\\x60\\x01\\x9c\\xc6\\xc0\\xaf\\x3b\\x09\\x9a\\x2e\\x4a\\x9e\\x6b\\xbc\\x16\\x97\\xaa\\x2e\\x3e\\xc5\\x3c\\xe7\\x50\\x39\\xf5\\xae\\xc0\\x73\\x66\\x9a\\x4c\\x15\\x37\\x41\\xf0\\x96\\xe7\\xc4\\x11\\x0d\\xf8\\x48\\x7d\\xbf\\x84\\x32\\x5e\\xe6\\x15\\xd2\\x5a\\x9e\\x70\\x71\\x4d\\xb4\\x34\\x6e\\x7d\\x47\\x78\\x3f\\xb9\\x25\\xea\\xa7\\x4c\\x79\\x7e\\x7c\\x9b\\x01\\xd6\\xea\\xde\\x48\\xaa\\xa8\\x74\\xa9\\xd3\\x95\\x0b\\x48\\xf6\\xd6\\x1b\\x50\\x9b\\x29\\x5d\\xf5\\xe0\\x7a\\xb7\\xef\\x78\\x5f\\x7a\\xf6\\x93\\xe8\\xb5\\x20\\xfc\\xb7\\xe7\\x9e\\x2d\\xf9\\x98\\xff\\xc9\\x93\\xce\\xed\\xd9\\xcc\\xbc\\xee\\x3b\\xf2\\x83\\xac\\xf6\\x29\\xe1\\xaf\\xd5\\x76\\x69\\x5a\\x1e\\xff\\x39\\x4b\\x8f\\x44\\x82\\xe9\\x64\\xed\\xf3\\xae\\x69\\x3c\\x98\\xe1\\x60\\xbb\\xc9\\x2e\\xc0\\x60\\x4b\\x79\\xe3\\x5c\\xd4\\xc5\\x27\\xc3\\x4e\\xe5\\xd7\\x0a\\xea\\xc4\\xa6\\x67\\x6d\\xc3\\x9a\\x7d\\xa7\\x9d\\xac\\xd8\\x10\\xcb\\x1f\\x1d\\xec\\x3d\\x1d\\xd6\\x2f\\x8d\\x0e\\x51\\x6b\\x5e\\x82\\x6b\\xe0\\xdf\\xcc\\xaf\\x3f\\xc8\\x1e\\x86\\x9b\\xb6\\xe4\\xb0\\x37\\x90\\xc4\\x97\\x6b\\xd4\\xb8\\x77\\x09\\xf7\\x86\\x31\\xa7\\xd1\\x6a\\xe6\\xb0\\xec\\xbe\\xf2\\x02\\x9e\\x63\\xa3\\x96\\xfe\\xc6\\x52\\x0c\\x7a\\x52\\xbf\\x00\\xa9\\x52\\xa1\\x00\\x74\\xdc\\x71\\xd9\\xc9\\xb4\\xed\\x14\\x23\\x26\\x7b\\x84\\x9b\\xb3\\xae\\x46\\x67\\x96\\xa2\\xa8\\x86\\xb5\\xbe\\x1f\\xec\\x75\\x63\\x30\\x32\\xc1\\x4e\\xca\\x4e\\x6a\\x83\\x47\\x95\\xd0\\xc7\\x92\\x70\\x6b\\x76\\x40\\xe4\\x62\\xa5\\xf9\\x74\\x0c\\x5a\\xf9\\x37\\x00\\x61\\x02\\x89\\x89\\x05\\x02\\x63\\xef\\xa0\\x2a\\xa2\\x6d\\xfc\\x15\\x48\\xa8\\x73\\x09\\xe5\\x63\\x80\\x53\\x5a\\xa2\\x98\\x2e\\xbc\\x75\\x14\\x57\\xf5\\xbd\\x7a\\x80\\x2b\\x83\\xfa\\xd7\\xf7\\x44\\x0b\\x1f\\x7b\\xdd\\xc6\\x16\\x6d\\x1d\\x78\\xc1\\xfa\\x8e\\xde\\xd0\\x23\\xeb\\x4a\\x3b\\xb2\\xa4\\x43\\x32\\xd7\\xdb\\xa3\\x46\\x83\\xf2\\x95\\x98\\x5e\\x78\\xe1\\x1d\\x18\\x5d\\x7f\\x69\\x0f\\xb1\\x97\\xfa\\x53\\x85\\xd4\\xd7\\xb5\\x3f\\xd4\\x04\\x8a\\xba\\x7c\\x40\\x19\\xe1\\x51\\xc1\\x67\\x6a\\xc2\\x10\\xaa\\xae\\x34\\xfd\\x9e\\xa1\\xb9\\x91\\x29\\xc4\\xe3\\x11\\xcb\\x96\\x28\\x57\\x38\\xfe\\x84\\x0c\\x5d\\x90\\xe0\\x6a\\x53\\x37\\x90\\xf4\\x52\\x46\\x4e\\x6f\\xfb\\x90\\x86\\x4f\\x8a\\x82\\x23\\xe6\\xdc\\x34\\x40\\x42\\xf7\\x07\\xdf\\x10\\x6a\\xff\\x8b\\xfb\\x32\\xbb\\x1d\\xe9\\xa4\\x46\\x0f\\x7c\\x20\\x76\\x91\\xa0\\x98\\x07\\x39\\x52\\x97\\xcd\\x54\\x21\\xa1\\x7e\\x3a\\xf6\\xbd\\xab\\x49\\x05\\x54\\x83\\x67\\xc6\\xcc\\xba\\xed\\xbe\\x86\\xef\\xf7\\xc9\\xdd\\x83\\x8e\\xee\\xb2\\x4d\\x03\\x46\\xe5\\x66\\x83\\x77\\xb5\\x24\\x07\\x6c\\x5a\\x91\\x0e\\x1d\\x46\\x5e\\xfa\\xab\\xa9\\x11\\x5e\\x6a\\x41\\x56\\xd6\\x08\\x5d\\x5b\\x24\\xb2\\xf2\\x10\\x56\\xda\\x9d\\xb6\\x8c\\x6e\\xa7\\x05\\xb1\\x60\\xec\\x8a\\x26\\xb1\\x37\\x6a\\x21\\xe6\\x24\\x23\\x42\\x3e\\xa5\\x26\\xe5\\x89\\xc2\\x09\\x18\\xd5\\x84\\xd9\\x42\\xf2\\x99\\x4d\\x08\\x99\\x48\\x3f\\xda\\x51\\x00\\xae\\x33\\x5f\\x1c\\x34\\x84\\x86\\x64\\x13\\x17\\xe4\\x1f\\x1b\\x24\\xe0\\x59\\x7f\\x71\\x3f\\x41\\x68\\xc2\\x76\\xdf\\xd3\\xb8\\x7a\\xb2\\x3a\\x24\\xb2\\x48\\xb5\\xc9\\x1b\\x74\\x3b\\xb6\\x97\\x5d\\xfd\\xa4\\xf6\\xcc\\xc7\\x06\\xdf\\x38\\x34\\x28\\x10\\x26\\x89\\x6b\\x10\\x5b\\x08\\x37\\x8a\\x74\\x43\\x3d\\x2e\\xc9\\xac\\xc0\\x57\\xf4\\x39\\x09\\x83\\x63\\xed\\xd2\\x10\\x40\\xb1\\x0b\\x96\\xd3\\x71\\x14\\x63\\xbc\\x90\\xe8\\x34\\xc3\\x99\\x2d\\xc0\\xc2\\xd2\\xf4\\x17\\x1e\\x1b\\x36\\x07\\xd7\\x45\\xa2\\x67\\x11\\xe3\\x0c\\x15\\xc0\\xac\\xe9\\xb0\\x35\\x31\\xae\\x1f\\x9e\\xec\\x80\\x74\\x1e\\xe4\\x2c\\xec\\x03\\x11\\xa0\\x10\\x28\\x74\\x61\\x0d\\x80\\xda\\xeb\\xdb\\x65\\x2f\\x9d\\xa4\\xf1\\x04\\xcf\\xd9\\x13\\x1e\\x2d\\xb3\\x4a\\xd7\\x86\\x25\\xe5\\x58\\xc3\\x23\\x7f\\x05\\x97\\x6d\\x10\\x76\\xe2\\x4d\\xa8\\x18\\x7b\\x02\\x85\\x42\\x94\\xf6\\xac\\x15\\x41\\xaa\\xdb\\x40\\x48\\x94\\x00\\x39\\x74\\x73\\x2c\\x03\\x98\\x5c\\x76\\x00\\x29\\x76\\xb4\\x35\\xee\\x67\\xaa\\x4b\\xd4\\x18\\xd3\\xe6\\x28\\xf6\\x53\\x75\\xd5\\x4a\\x57\\x41\\x13\\xd7\\x9f\\x0f\\x15\\x29\\x90\\x33\\xdc\\x3f\\x01\\xa0\\x7e\\x1c\\xd3\\xaa\\x11\\xf9\\x01\\xcf\\x5c\\xf6\\xd8\\x00\\xea\\xda\\xd8\\xc3\\x0f\\xd9\\x5a\\x19\\x8c\\xf3\\x9e\\xbf\\x7e\\x98\\xb7\\x75\\x64\\xb4\\xae\\x24\\xd7\\x6d\\x2e\\x7b\\xe8\\x77\\x7f\\xcd\\x5c\\x97\\x1a\\x03\\x23\\xcd\\xc4\\x3d\\x03\\xb3\\x01\\xef\\xdb\\x35\\xe1\\x1f\\xe1\\x10\\x24\\x06\\xa6\\xba\\x95\\x5b\\xdf\\x6f\\x31\\x7a\\x80\\x51\\xa8\\x20\\xa2\\xcf\\xa7\\x3a\\x9b\\x7a\\xda\\x15\\x9c\\x23\\xeb\\xaf\\xbe\\x72\\x04\\x4a\\xd2\\xa6\\x5a\\x88\\xbf\\x1d\\xa1\\xdd\\x60\\x5a\\xf6\\xd5\\xc3\\x0d\\x64\\xe4\\xc9\\x55\\x80\\x07\\x08\\x06\\xfa\\x04\\x54\\x7b\\x79\\x79\\xea\\x50\\xf6\\xa9\\xa3\\x93\\x50\\x7b\\x5e\\x6f\\x44\\xf1\\x79\\x20\\xe0\\x13\\x6a\\xcb\\x46\\x1d\\xaa\\x57\\x08\\x7f\\x97\\x55\\x71\\x3f\\xec\\x87\\xe9\\x38\\x9c\\xb9\\x24\\x56\\x04\\x20\\x4d\\x65\\x51\\xd2\\x31\\x46\\x9a\\xa0\\x1e\\x44\\x16\\xd2\\x7e\\xba\\xd1\\x6c\\xce\\x70\\x6d\\x0a\\x11\\xeb\\x2e\\xe2\\x95\\x54\\x79\\xbd\\xae\\x9a\\x1d\\x17\\xdd\\x53\\x75\\x67\\xf1\\xf6\\x4a\\x22\\x65\\x80\\xf7\\x45\\xbc\\x21\\xc6\\x59\\xa3\\x8e\\xed\\x06\\x68\\xfd\\x1a\\x32\\x85\\x95\\x35\\x51\\x46\\x04\\x63\\x52\\x3c\\x06\\x94\\xf6\\x9a\\x3c\\x52\\x8f\\xff\\x6d\\x3d\\x37\\x73\\x19\\xcc\\x6d\\x92\\x6f\\x0a\\x24\\x26\\x97\\x0b\\xf9\\xab\\x35\\x95\\x57\\x17\\x86\\x32\\xd3\\xe8\\xa3\\x57\\x71\\xa9\\x55\\xdc\\xde\\x02\\x12\\x73\\x41\\xc4\\x44\\xa9\\x85\\x73\\xb3\\x0e\\xe9\\x28\\xab\\xca\\xb3\\x6a\\x8e\\x88\\xbb\\xcc\\x94\\xc2\\x16\\x12\\x4f\\xe0\\x11\\xa7\\x0b\\x36\\x89\\x95\\x02\\xc7\\xfb\\xc5\\xb1\\x1d\\x3a\\xc3\\xbd\\xc8\\xc0\\x4c\\xf2\\x2b\\x0d\\x26\\xc1\\xfa\\xc2\\xe0\\xa5\\x13\\xb0\\x6e\\xf3\\x25\\x5d\\x15\\x85\\x1d\\x39\\x4a\\xbc\\xaa\\x97\\x40\\xf5\\x9b\\xba\\x4a\\x46\\x1f\\x27\\x7d\\x5b\\x2f\\x9e\\x66\\xcd\\x71\\xed\\x19\\xa8\\xca\\x49\\xdd\\xdf\\xa5\\x5c\\x49\\xe5\\xc0\\x5b\\x81\\xd9\\x63\\xf3\\xe3\\x5c\\x20\\xb9\\x63\\x52\\x30\\x59\\x97\\x88\\xb8\\x25\\x67\\x32\\x55\\x30\\x54\\xa1\\xc3\\xf7\\x0d\\x67\\x44\\xce\\x41\\xa3\\x4a\\x48\\x5a\\x9f\\x9b\\x15\\x99\\x00\\x92\\xd1\\x1a\\xc8\\x0c\\x21\\xc1\\x4a\\x38\\xa0\\xf6\\x81\\xf7\\x7e\\xe7\\x50\\xd9\\xa1\\x78\\x44\\x6d\\x35\\x14\\x46\\xdc\\x4d\\x43\\xe4\\x9b\\x60\\x61\\xc9\\xbc\\x41\\x83\\x3d\\x72\\x99\\x7f\\xb2\\x51\\x17\\x89\\xf4\\x54\\x55\\x3f\\x11\\x82\\xc4\\x47\\xfa\\x59\\x0c\\x28\\xd0\\xca\\x2e\\xfd\\xa4\\x1c\\xd8\\x8b\\x99\\xfb\\x78\\x89\\x8e\\x17\\x57\\x02\\x23\\x3d\\x45\\xdb\\xad\\x53\\x3c\\xb6\\xd2\\xa1\\xd8\\xed\\x7d\\x3c\\x74\\xdb\\x85\\x7b\\x98\\x2a\\x8f\\x2b\\x0e\\x55\\x5e\\x4e\\xb5\\x6e\\xf8\\xbc\\x4c\\x29\\x1a\\x5c\\x5e\\x7e\\xfc\\x51\\x2e\\x5b\\x5a\\xd0\\x02\\x62\\x91\\x34\\x12\\x04\\x76\\x64\\xb7\\x3f\\x6b\\x3c\\xe1\\x26\\x9e\\xc2\\xef\\x0f\\xf8\\x67\\x3c\\x03\\x97\\xc4\\x7c\\x5e\\xb3\\x70\\x7d\\x83\\x2d\\x27\\x2b\\xb3\\xe7\\x50\\xcf\\xf1\\x4b\\x6b\\x38\\xb7\\xd7\\xba\\x7b\\xbf\\x13\\x20\\xbe\\x72\\x13\\xef\\xc8\\x51\\xd0\\xd9\\x08\\xe4\\x4a\\x59\\xfa\\xe7\\x8a\\x1d\\x75\\x84\\xc2\\xfb\\x4a\\x9b\\x8b\\xaa\\xfe\\xfa\\x7c\\xd5\\xe4\\xbc\\x29\\x49\\xb8\\x16\\x84\\x86\\xa5\\xed\\x8e\\x28\\x60\\x4d\\x1a\\x55\\xa2\\x3e\\xed\\xc2\\x85\\x02\\x10\\x5f\\xe9\\x7e\\x78\\x8a\\x56\\xbe\\x11\\x49\\x5c\\x68\\x85\\x8c\\x7d\\x9b\\xab\\x0f\\x86\\x69\\xd2\\x89\\x18\\x13\\x67\\xd1\\xe2\\x46\\x42\\x99\\x68\\x18\\x9a\\x60\\x86\\xd5\\xbd\\x3a\\x27\\xd5\\x79\\x3b\\x9c\\x8a\\x5a\\x2e\\x61\\x47\\xb5\\xce\\x8a\\x29\\xd2\\x1d\\xe5\\xc3\\x80\\xa4\\x9d\\xf2\\x4f\\x8c\\xd3\\x8d\\x9d\\x8f\\x80\\x67\\x14\\x48\\x42\\xd2\\x37\\x31\\xd9\\x0a\\x21\\xfb\\xa0\\x11\\x93\\x6f\\x94\\x32\\x5f\\x44\\xf6\\x83\\xa9\\x1c\\x5f\\x5c\\x23\\xf2\\xc7\\x1f\\xd1\\xc9\\x02\\x88\\xeb\\xe9\\xa4\\x68\\xae\\xb9\\x23\\xf0\\x89\\xe8\\xf7\\xc7\\x6e\\xc5\\x58\\xd9\\x91\\xce\\xc2\\x22\\xb7\\x6f\\x17\\x22\\x24\\xe0\\xc8\\x4a\\x0c\\x3a\\x12\\xe4\\x02\\xe3\\x70\\x30\\xba\\xeb\\xb0\\x70\\x10\\x0b\\xae\\x87\\x12\\x68\\xb0\\x40\\x11\\x2e\\xaa\\x37\\x09\\x19\\x01\\x26\\x70\\xeb\\x70\\x88\\x5f\\x89\\x59\\x87\\x70\\x6a\\x62\\xe7\\x40\\xed\\x79\\xc7\\x88\\x85\\xb0\\xa5\\x91\\x2c\\x2b\\xb0\\x91\\x74\\xe1\\x02\\xa9\\xec\\x3f\\x6d\\xfa\\xe9\\xe5\\x7b\\xf9\\x9a\\x92\\x96\\xe7\\x77\\x88\\xcf\\x60\\x17\\xa2\\x64\\x93\\xbe\\x0f\\xc2\\xc7\\x43\\x9d\\x63\\x3a\\xff\\x01\\x22\\x48\\xdb\\xd3\\x26\\xab\\xb7\\x81\\x55\\xd4\\xb3\\x84\\xd2\\xdb\\xf0\\x27\\x41\\x4b\\x1d\\x8f\\x07\\x06\\xc3\\xeb\\xd2\\xee\\x39\\x16\\x3c\\x07\\x24\\x1b\\xbf\\xad\\x64\\x50\\xe9\\xe8\\xec\\x9e\\x84\\xc5\\xcb\\x39\\x7d\\x9b\\x8f\\x96\\xbf\\x72\\x9e\\xe0\\x10\\xba\\x59\\xba\\xa4\\xa7\\x57\\xa6\\x98\\xf9\\xd3\\xed\\xea\\x30\\xd1\\xd1\\x19\\x2e\\x5e\\x96\\x06\\x24\\x5a\\xa7\\xde\\x4e\\x3c\\xa8\\x62\\xa8\\x84\\x22\\x80\\xe2\\x10\\x49\\xbb\\x33\\x18\\xc7\\x7e\\x28\\x26\\x26\\xb2\\x8d\\x7c\\xc3\\x48\\x90\\x51\\x45\\x6c\\x6d\\xaf\\x29\\x27\\xe4\\x68\\x83\\x4d\\xf4\\xbc\\x54\\xa0\\x4b\\x8b\\x8b\\xf3\\xe8\\x9b\\x06\\xcb\\xc8\\xb3\\x2e\\x05\\x59\\x32\\x93\\x20\\x2a\\x27\\xf3\\x56\\xd3\\xbe\\x3e\\x7c\\xff\\x6a\\xaa\\x6f\\xff\\x50\\x6d\\x32\\xd3\\x64\\xc0\\x45\\x9a\\xb9\\x1f\\x78\\xc7\\x7b\\x31\\x35\\x8d\\xca\\x49\\x01\\xe4\\x9d\\x2f\\x70\\x9f\\x6c\\x81\\xee\\xc1\\x0d\\xc1\\x8e\\x09\\xe8\\x7d\\x0c\\xbf\\x46\\x72\\x87\\x42\\x81\\xb4\\x5e\\xb9\\x30\\x44\\xa1\\x8d\\xac\\x37\\x40\\x0a\\x31\\x10\\x4c\\x49\\x26\\xc2\\xa5\\x67\\x5b\\xaa\\x66\\x53\\x92\\x2d\\x24\\x1f\\x0d\\xe9\\xe4\\xf0\\x7b\\x78\\x93\\x6c\\x00\\x03\\x83\\xc5\\x30\\x64\\xee\\xfb\\x7e\\xcb\\x53\\x6a\\x03\\x19\\x46\\xfc\\x2c\\xaa\\xb5\\x67\\x28\\x08\\xe0\\x07\\xf2\\xa6\\x09\\xfb\\x6f\\x63\\x09\\xad\\xf4\\x5f\\x80\\x8b\\x0a\\xe2\\x08\\xdf\\x4d\\x9e\\x06\\xa8\\x1b\\x94\\xfb\\xa0\\x57\\xb8\\xa3\\x85\\xc2\\xfa\\x83\\xcf\\x11\\x03\\x48\\x2d\\xc8\\xa2\\xc9\\xab\\x91\\x54\\x53\\x02\\xb6\\xb1\\x1a\\x83\\xc9\\x24\\x99\\x76\\xe2\\xff\\x41\\xbd\\xb3\\x6d\\xfa\\x21\\xbf\\x7a\\xb9\\x04\\xc0\\xae\\xe3\\xf9\\xe3\\xa0\\xa3\\x3f\\x6c\\x2f\\x29\\xbf\\x97\\x40\\xc9\\xb6\\x4d\\xbf\\xd7\\xdc\\xff\\x9a\\x36\\x42\\x11\\xe6\\x66\\xbe\\x79\\x94\\xb9\\x52\\xf6\\xfc\\x53\\x17\\xcc\\x25\\x8c\\x33\\xbd\\x7c\\xb1\\x70\\x88\\x2e\\xd7\\x41\\x2f\\xaf\\x33\\xde\\xbf\\x4a\\x0f\\xd7\\xf0\\x8c\\x04\\x26\\xde\\xdb\\xa4\\xb8\\x98\\x18\\xcc\\x11\\xbc\\x94\\xfa\\x4e\\xde\\x1a\\xf7\\x68\\x36\\xe4\\x61\\xbf\\xf2\\x2e\\x21\\xb8\\xcb\\x85\\xca\\x4f\\xd7\\xce\\xbe\\x1f\\x5e\\xa1\\x89\\xac\\x05\\xc0\\xcd\\x73\\x41\\x7d\\x97\\x0a\\x68\\x44\\x66\\x77\\xfe\\x1c\\xb3\\x64\\x9b\\xf9\\xea\\xaf\\x47\\x23\\xbd\\xe3\\xa3\\x42\\xe5\\xf9\\x5b\\x47\\xb7\\x5a\\x91\\x7c\\xde\\x13\\x69\\x1c\\xc2\\x35\\xcc\\xe9\\x80\\xbd\\x18\\xf3\\x78\\xb8\\x1a\\x64\\x13\\x94\\x60\\x0a\\xa3\\x88\\x05\\x9d\\x37\\x80\\x25\\x66\\x40\\xf1\\x36\\x09\\x65\\x86\\x64\\xa6\\xdb\\xa5\\xa6\\xb5\\x9c\\x72\\x27\\x87\\x34\\x8e\\x88\\xf2\\x29\\x53\\xf2\\xe5\\xdf\\x12\\x60\\x51\\x22\\x2e\\x2c\\xc7\\x65\\x02\\xf2\\x3c\\xbb\\x37\\x01\\x9c\\x8b\\xd9\\x76\\x9e\\x4a\\x99\\x6c\\x57\\xdc\\x3b\\xa1\\xe5\\x1a\\x8f\\xb4\\xba\\xe6\\x58\\x4a\\x3b\\xa1\\x73\\xf9\\x31\\xde\\xa0\\xf3\\xef\\x3b\\x3b\\xbb\\x37\\x24\\x9c\\x20\\x55\\x3c\\x9d\\xde\\x67\\xbb\\x8c\\x89\\x36\\xd4\\x10\\x18\\xb1\\xe0\\xa1\\x3b\\x94\\x3b\\xac\\x6d\\xdd\\xfb\\x0a\\x43\\x57\\x67\\xd8\\x57\\xfa\\x8f\\x85\\x37\\xc8\\x0a\\xbd\\x88\\x96\\x0c\\x63\\x73\\x47\\xec\\x0d\\xdf\\xa7\\x5d\\x4c\\xf3\\x15\\xc3\\x30\\x52\\xdb\\x20\\x6c\\xf3\\xef\\x93\\x20\\x28\\x05\\x31\\x08\\xd9\\xaa\\x40\\xd2\\x67\\x6b\\xdc\\x50\\x8b\\x7c\\x55\\xdf\\x78\\x43\\x57\\xcf\\x5a\\xa5\\x9f\\xbc\\x2b\\x7e\\x45\\x36\\x5b\\x22\\x00\\x7d\\x5b\\x99\\x25\\xa1\\x4d\\x98\\xcd\\x9f\\x93\\x70\\x27\\xfb\\x3a\\x5b\\x5c\\xbd\\x94\\xf0\\xa6\\x1a\\x98\\xdf\\x58\\x0e\\x85\\x23\\xca\\x27\\x05\\x17\\x04\\x75\\x51\\x02\\x8d\\xba\\xde\\x7a\\x8f\\xff\\x25\\xf0\\x8f\\x64\\xce\\xd3\\xdf\\x35\\xa7\\xaa\\xed\\xdb\\x4d\\x62\\x16\\x42\\xf8\\x72\\x8a\\xce\\x0c\\x1e\\x78\\x96\\xa4\\x60\\x38\\x76\\xd7\\xa3\\x2f\\x9a\\xc8\\xfb\\xfb\\x03\\xb3\\x6f\\x88\\xda\\x1b\\x73\\x7f\\x9d\\x3f\\xce\\x0f\\x69\\xfd\\xd1\\xb9\\xab\\xdb\\x72\\x96\\x89\\x64\\x65\\xcd\\xbb\\xf8\\x78\\x22\\x24\\xf1\\x9f\\x04\\xea\\x93\\x23\\x88\\x82\\x4b\\x26\\xe7\\x7e\\x23\\xc7\\x49\\x97\\x85\\x7e\\x1b\\x8b\\xd7\\x93\\x10\\x0b\\x0b\\xb5\\x8f\\xd2\\x8b\\xf4\\x74\\x54\\xf0\\xd9\\xe6\\x89\\xd1\\x23\\x75\\x44\\x96\\x8e\\x42\\xf8\\xeb\\xa8\\xcb\\x50\\x42\\x9b\\x21\\xd7\\x8c\\x2e\\x9e\\x47\\xc4\\x71\\x6f\\xb6\\x5c\\x12\\xa7\\x66\\xb0\\x7b\\x70\\x36\\xd3\\xa7\\x11\\x9d\\x17\\x93\\x21\\xee\\x7e\\xbe\\x22\\x97\\xc1\\x4f\\x8c\\x36\\x2d\\x8a\\x6c\\x8a\\xb9\\x6d\\x11\\x6c\\x52\\x79\\x0d\\x1f\\x7c\\x4f\\x9c\\xe6\\x86\\xed\\x90\\x44\\xff\\x73\\x78\\x18\\x0a\\xff\\x7b\\xf6\\x20\\x4b\\x84\\x4d\\x23\\xdc\\xc7\\xb7\\xcd\\x2c\\x57\\x16\\x9c\\x03\\xbe\\x70\\x40\\x5f\\x06\\xe1\\x88\\xc6\\xf6\\xbd\\xb6\\x60\\xda\\xb3\\x51\\x6d\\x23\\x4e\\x5d\\x27\\x23\\x16\\x05\\x72\\x9b\\xa5\\xf7\\x75\\x12\\xbc\\x5d\\x77\\x08\\xad\\x0a\\xb2\\x78\\xb0\\x93\\xca\\x63\\x34\\x46\\xb5\\x58\\xa0\\x60\\x2a\\xdf\\x9d\\x54\\xc1\\xaa\\x80\\xc2\\xe3\\x17\\xaa\\x67\\x61\\x38\\x1d\\xe7\\xa3\\x0f\\x36\\x1a\\x3e\\x80\\x9f\\x70\\x6f\\xef\\x02\\xfe\\xe9\\xc4\\x18\\xc2\\x4b\\x49\\x90\\x2e\\x87\\xb4\\x07\\x0e\\xb4\\x5b\\xaf\\xd3\\x3e\\x86\\xdd\\x37\\xa2\\x5b\\xb3\\x15\\xa4\\xec\\x6c\\x98\\x82\\x42\\x41\\xb9\\xc0\\x11\\x73\\x4d\\xb6\\xdd\\xe0\\xa5\\xd7\\x50\\xea\\xf3\\xec\\x1a\\x78\\x75\\x9c\\x28\\x12\\xa1\\xdc\\x85\\xe0\\xcb\\xbd\\xb4\\x72\\xf5\\x7c\\x74\\x65\\x2b\\x04\\xaa\\xdc\\x07\\x90\\xd0\\x1a\\xab\\x22\\xb8\\xad\\xf3\\x00\\x1c\\x64\\x5d\\x4f\\x2e\\xd6\\x64\\xdb\\x20\\x1d\\x5b\\x5c\\xdc\\x56\\xf6\\x71\\x22\\xad\\x04\\x88\\x91\\xc6\\x06\\x6f\\xb3\\xb5\\x29\\x0e\\x87\\x14\\x37\\x58\\x26\\xd9\\x07\\x3a\\x85\\x1c\\x65\\x84\\x7c\\x70\\x68\\xd0\\xab\\x3f\\x98\\x25\\x46\\xba\\x64\\x45\\x07\\x2d\\x8f\\x03\\x5b\\xa0\\x84\\xda\\xb8\\xa8\\x8f\\x5d\\xac\\x60\\x2f\\x8f\\x5f\\x96\\xc4\\xa8\\x32\\x50\\x32\\xe8\\xf9\\xaf\\x1c\\x8c\\x5d\\x1c\\x15\\x0c\\x74\\x32\\xc9\\x70\\x4b\\x05\\xfd\\xc8\\xc2\\x90\\x70\\x6c\\xb6\\x4f\\xe7\\xc9\\x45\\xe7\\x0b\\x25\\xe1\\x7d\\x69\\x64\\xcd\\xd7\\x8c\\x46\\xaf\\xfb\\xbb\\x89\\xbd\\x6c\\xfe\\xfe\\xe2\\xfd\\x4b\\x53\\x5b\\x10\\x59\\x4d\\xaf\\x2f\\xeb\\xb7\\xfa\\x13\\x4c\\x10\\x56\\xc5\\xb0\\xa0\\x8d\\xdf\\x1b\\xfb\\x85\\xb3\\x35\\x60\\xd5\\xab\\xe9\\xa4\\xd6\\x20\\x0f\\x56\\x30\\x40\\x4f\\x1d\\x01\\xf7\\x63\\x22\\x59\\x18\\xef\\x08\\x1d\\x35\\x1b\\x3d\\xce\\xdd\\xba\\x2b\\x4a\\x23\\x04\\x11\\x35\\xf8\\xa7\\xc3\\x47\\x77\\x29\\xd1\\x03\\x2a\\x92\\x44\\x62\\xc5\\x7c\\xb3\\x4d\\xc5\\x93\\x5a\\xab\\x6c\\xa9\\x3d\\x47\\x86\\x0d\\xf5\\x5d\\xf3\\xb6\\xf6\\xb4\\x96\\x10\\xf4\\x17\\xb6\\x21\\xda\\x41\\xae\\x0e\\x5a\\x0d\\x28\\x93\\x91\\xf8\\xb3\\x0b\\x78\\xdd\\x8e\\x10\\xf8\\x60\\x51\\x35\\xef\\xd1\\x47\\xb9\\x25\\xec\\x31\\x95\\x2d\\x26\\x70\\xf0\\x58\\xf8\\xcb\\xab\\x7b\\x7d\\xe0\\xa9\\xf5\\x26\\xb2\\xa4\\x2b\\xf0\\x9c\\xbb\\xbd\\x01\\xba\\xbc\\xce\\xf4\\x91\\xdb\\x83\\x34\\x02\\x11\\xdc\\xbc\\x9a\\x2c\\xe8\\x57\\xe4\\xef\\x66\\xea\\x04\\x2b\\xc3\\xbf\\x5a\\xde\\x93\\x5c\\x3d\\x5a\\xb3\\x56\\xa0\\x34\\x4b\\x2c\\x11\\x86\\xa2\\x41\\x38\\x96\\x90\\x4f\\x0d\\xcc\\x7d\\x17\\x8a\\x7d\\xbe\\xf2\\x72\\x1f\\xd4\\x0e\\x53\\x7b\\xd7\\x44\\x1c\\x19\\xf4\\xc4\\x39\\xc8\\x03\\xf3\\xfd\\xcb\\xd6\\xfc\\x5b\\x75\\x48\\xf5\\x4c\\xa1\\xad\\x58\\x99\\x11\\xa6\\x29\\xa6\\x4e\\xc8\\xe8\\x56\\xac\\x99\\x52\\xa4\\x99\\x31\\xc9\\x01\\xff\\x0d\\x91\\xb4\\xa6\\xa2\\x58\\x14\\xc7\\x3a\\x85\\xad\\xa9\\xfb\\x28\\x8b\\x77\\x9f\\xea\\xcb\\x17\\x9c\\x68\\xed\\x19\\xc5\\x94\\x36\\x74\\x9d\\x34\\x1f\\x65\\x8d\\x70\\xf1\\x14\\x6e\\xd3\\x23\\xf4\\x14\\x55\\x5d\\xaa\\x43\\x0b\\xb2\\x29\\xe5\\x4f\\x21\\x5a\\x2e\\x25\\x01\\xaf\\xa5\\xb4\\x1c\\x0b\\x51\\xf2\\x50\\xe8\\x0a\\x37\\x19\\x24\\x41\\x50\\x2a\\xd4\\x87\\xf8\\x35\\xb3\\xe5\\xaf\\x67\\xc9\\x3d\\xcf\\xf9\\x0b\\xe4\\xa4\\x20\\x4a\\x3f\\x0b\\xda\\xaf\\xb7\\x36\\x53\\x9c\\x30\\xc5\\x9d\\xd1\\x22\\x8f\\x13\\xe5\\xfc\\xce\\x1e\\xe6\\xef\\xb6\\x01\\xe6\\x57\\x36\\x9a\\x45\\x0d\\x1a\\x04\\xbe\\x03\\xfc\\x19\\x4e\\x4d\\xb1\\x6d\\x86\\xc2\\xae\\x04\\x22\\xd1\\xb9\\xd1\\x56\\x1e\\xcc\\xea\\xaf\\x74\\x6f\\xd2\\x0c\\xa7\\xac\\xf9\\x71\\xf2\\x53\\x93\\x52\\x99\\x4c\\xab\\x8c\\xb5\\x51\\xf1\\x6c\\xc6\\xd9\\x29\\x8d\\xae\\x2f\\xab\\xc5\\x96\\x85\\x3e\\x77\\x55\\x04\\xa5\\xe2\\x19\\xbd\\x97\\xaf\\x1b\\xc9\\x81\\xc7\\xcc\\x3f\\xdf\\x4c\\x0c\\xba\\xe3\\xbf\\x1b\\xc9\\xa4\\x37\\x0d\\x5d\\xa0\\x33\\x26\\x6f\\xd6\\xf2\\x5a\\x89\\x47\\xb3\\x4d\\x2f\\xd6\\xa1\\x6a\\x34\\xb5\\x32\\x5a\\xa1\\x1b\\x01\\x6f\\x53\\xa3\\xcc\\xf8\\x60\\x12\\xbe\\xe0\\x3e\\x53\\xac\\xa2\\x10\\xce\\x6f\\x8e\\x1a\\xb7\\xc0\\xa8\\x62\\x6c\\x73\\x29\\x6a\\x09\\x86\\xca\\x16\\xf4\\xf5\\x23\\x2a\\x15\\x21\\xbc\\x47\\x59\\x89\\x49\\x85\\x18\\xb1\\x8c\\x74\\x8c\\x57\\x64\\x9d\\x42\\x8a\\x70\\xc4\\xc3\\x25\\xa6\\xfa\\xb7\\x4f\\x24\\xc4\\x29\\xc9\\x79\\xe4\\x74\\x70\\x73\\x81\\xfc\\x09\\xf7\\xa9\\xea\\x78\\x67\\x09\\x12\\x67\\x95\\x51\\x0e\\x13\\x02\\xa5\\xe7\\x94\\x6d\\x8e\\x25\\xbc\\x8b\\xd2\\x66\\xb4\\x44\\x9f\\x9e\\xea\\x7f\\xc6\\x24\\x0a\\x17\\x2f\\x1b\\x9b\\xb2\\x53\\xc3\\x1a\\xde\\x4c\\xbc\\xe1\\xb9\\xd4\\xd9\\xf1\\xc6\\x03\\x00\\x00\\x28\\x18\\x28\\x13\\x00\\x23\\x41\\x2d\\xe7\\x75\\x36\\x6e\\x0c\\x79\\xe8\\xce\\xcc\\xaa\\x33\\xdf\\x74\\x50\\xa1\\xa2\\x0d\\x42\\xcd\\x3b\\x06\\x31\\xbe\\x14\\x46\\x55\\x84\\x0b\\x19\\x21\\xf0\\x12\\x1a\\x17\\x35\\x91\\x9f\\x3c\\x00\\xf4\\xe3\\x97\\x92\\xbc\\x2b\\xf0\\x4a\\x75\\x49\\xd5\\x10\\xb6\\x6d\\x93\\x6c\\xc7\\x7d\\x1e\\x58\\xb5\\x5f\\x5a\\xbb\\x11\\x4a\\xda\\xcb\\x68\\xad\\xa2\\x6f\\xe6\\xce\\xa6\\x39\\x60\\x8e\\xa1\\x52\\xd6\\xe9\\xa6\\x46\\xcd\\xcd\\xf4\\xf3\\x8b\\x6b\\x71\\x12\\x36\\x93\\xe2\\xb6\\x57\\xb9\\x98\\x59\\xac\\x6a\\xd4\\xe9\\x54\\x51\\x6b\\x27\\x96\\x93\\x98\\x09\\x67\\x6b\\x3b\\xb8\\x54\\x57\\xcf\\x76\\xb4\\x73\\x44\\x32\\x4c\\xfa\\x12\\xb4\\xc1\\x1a\\xe3\\x52\\xb9\\xb7\\x21\\x2a\\xee\\x56\\x6c\\xc7\\x1a\\x0c\\xe8\\xf9\\x6d\\x1e\\xd6\\x89\\xc8\\xb8\\x8d\\xb7\\x98\\xab\\x7d\\xb1\\x58\\xa4\\xf0\\x5b\\xec\\x7b\\x9d\\x83\\x76\\x8b\\x4e\\x5d\\x09\\x7a\\x99\\xf5\\x58\\x62\\x77\\xa0\\x7e\\x6c\\x7e\\xbc\\xe7\\x66\\x4b\\xcc\\x1b\\xf7\\x5f\\x8f\\x66\\x83\\x2b\\xac\\x63\\x0b\\x8d\\x46\\x80\\x4e\\x68\\x8f\\x1d\\xb3\\xa3\\x58\\x89\\xfd\\xb2\\x1a\\xfb\\x79\\x26\\xc3\\x40\\x6d\\xa0\\xdc\\xbe\\x54\\x80\\x19\\x0a\\x5d\\x80\\x18\\xcc\\xce\\x9a\\xfb\\x3d\\xec\\x6c\\x91\\xd6\\x5c\\x87\\xea\\xdb\\xf3\\x3f\\x4c\\x74\\x7a\\x17\\x64\\xd7\\x1d\\x62\\xb7\\xee\\x5e\\xf6\\x36\\x3c\\xdf\\xd9\\xc4\\x71\\xa2\\x5a\\xff\\x0f\\x39\\x8f\\xfa\\xd3\\x3a\\x0c\\xcc\\xc0\\xab\\xc1\\x0c\\xf2\\x61\\xf0\\x0b\\xcc\\xa3\\x68\\x5f\\x98\\x15\\xf5\\x84\\x13\\x21\\x7c\\x13\\x96\\x88\\x02\\x52\\x00\\x2e\\x85\\x35\\xa4\\x84\\xcc\\xae\\xfc\\x15\\xc9\\x5d\\x25\\x1c\\x6e\\xc6\\x9c\\xe1\\x1d\\xa9\\xed\\x5d\\x71\\x29\\x02\\xce\\x22\\x17\\x5c\\x12\\x76\\xa8\\x83\\xb2\\x1d\\x43\\xa3\\xc0\\x55\\xa9\\x42\\x55\\xd9\\x18\\xb0\\xdf\\xcc\\x37\\x32\\xbf\\xbc\\xab\\xa2\\x34\\x76\\x0c\\x24\\x6e\\x09\\x9a\\x28\\x69\\x2b\\x8c\\x7c\\x68\\xf0\\x1e\\xd7\\xc4\\x0f\\xc1\\xf0\\xa5\\x1e\\xd8\\x02\\x6b\\x44\\xbd\\xa3\\xbe\\x60\\x29\\x44\\xe0\\xf9\\xf1\\xf4\\x61\\x52\\x4d\\x59\\xed\\xef\\x68\\x98\\x16\\x8a\\xa0\\xd0\\xbb\\x14\\x52\\x19\\x75\\x44\\x4d\\xd1\\x49\\x5e\\x70\\xc9\\x2c\\x66\\xed\\x6d\\x90\\xe5\\x80\\xa0\\x9b\\x6d\\x70\\x52\\xe2\\xeb\\xf7\\x54\\x08\\x8e\\x79\\xf0\\x97\\xac\\xee\\x24\\x67\\x31\\xf1\\x39\\x33\\x42\\x52\\xb3\\x00\\x95\\xca\\x65\\x75\\xeb\\xa7\\x21\\xe6\\xd3\\xe3\\x19\\x0a\\xcb\\x64\\xc9\\x48\\xd1\\xdc\\x88\\xd2\\xd1\\xc7\\x0a\\x2c\\x52\\x9f\\x86\\x03\\xf3\\xdb\\x02\\xae\\x02\\xf1\\xf2\\x7c\\xbc\\x03\\x03\\x18\\x1a\\xa1\\xb5\\x57\\x76\\x1b\\x7a\\x55\\xee\\x92\\x05\\x55\\x8d\\x09\\xbb\\xf7\\x40\\x7a\\xf4\\x27\\x17\\xe1\\x23\\xc8\\x0c\\x05\\xf0\\xab\\xd5\\x35\\xd1\\xb7\\x92\\xb1\\xf6\\x4d\\x9e\\x92\\x17\\x8e\\x33\\xbe\\xaa\\x0b\\x2a\\x33\\x5b\\x6a\\xd9\\x26\\xf8\\xde\\x68\\x9c\\x2b\\xea\\x10\\xdb\\x01\\x69\\xd4\\x5b\\xfa\\xe1\\x8e\\x2c\\x7f\\x85\\x54\\xd5\\xbd\\xdb\\x35\\xb6\\x76\\x8c\\x21\\x9a\\x8e\\x09\\x9f\\xd2\\x86\\x1e\\x93\\x19\\x08\\xdb\\x8e\\x1b\\x37\\xd3\\x2c\\x43\\xb1\\x6a\\xa3\\x41\\xdf\\xb0\\x01\\x3d\\x14\\xfb\\x4e\\x66\\x67\\x7d\\x18\\x00\\xa7\\x9b\\xf5\\x70\\xc2\\x42\\xe1\\x9e\\x77\\xb0\\xce\\x1d\\xaa\\x55\\xa6\\x5b\\x57\\xd3\\x93\\x09\\x6f\\x5a\\xd2\\x9b\\x09\\x27\\x94\\x7b\\x02\\xf1\\x07\\xae\\x96\\x27\\x09\\x56\\x23\\x27\\xa2\\x6c\\x18\\x7b\\x70\\x28\\x19\\xa3\\x39\\x9a\\xbf\\x2c\\x81\\x2c\\xa0\\x49\\x82\\xb3\\xd6\\xce\\xf4\\xab\\xb0\\xca\\xe6\\x0e\\x31\\x35\\xac\\x88\\xca\\x4b\\x3f\\x04\\xf3\\x5c\\x9d\\x7c\\x66\\xbc\\x5b\\x35\\xe0\\x22\\x40\\x7b\\x45\\xf0\\xc6\\x3d\\xa0\\xef\\xf7\\x33\\x47\\x78\\x64\\xd4\\xe7\\xc1\\xe6\\xb5\\xb2\\x2b\\x6e\\xdc\\x91\\x74\\x9b\\x33\\xd6\\x4e\\x41\\x2d\\x10\\x76\\x86\\xf3\\xc0\\xc2\\xc8\\x92\\x1a\\x69\\x42\\x70\\x22\\x10\\x6c\\x26\\x15\\x5d\\xc7\\x8f\\x53\\x78\\x60\\x14\\x45\\xd0\\x62\\x46\\x62\\x02\\xbf\\x5d\\x00\\xfc\\xe1\\x37\\x68\\x22\\x15\\x90\\xf6\\x15\\x5b\\xba\\x9d\\x5d\\xa7\\x65\\x81\\xd0\\x7f\\x41\\x4c\\x3e\\x7b\\x00\\xde\\x03\\x81\\x12\\x61\\x61\\xed\\x6d\\x20\\x41\\xae\\x76\\xd0\\xdc\\xd2\\x78\\x62\\x80\\x56\\x94\\x30\\x96\\xe2\\x04\\x65\\x4c\\x66\\xc7\\x09\\x1a\\x63\\x37\\x2d\\x7d\\xd9\\x2f\\x0a\\x86\\xe1\\x5c\\x87\\x03\\x43\\xec\\x0b\\x79\\x08\\xd0\\xab\\x2b\\x68\\xbb\\xd4\\x9e\\x88\\x8c\\xac\\xf6\\x0a\\x5a\\xeb\\x5c\\x20\\xb2\\x27\\xeb\\x85\\x9f\\x59\\x88\\x4b\\xc4\\xe0\\xbb\\x85\\x8d\\xd7\\x4c\\x82\\x0c\\x49\\x72\\x77\\xb0\\x8d\\xea\\x78\\x97\\x47\\x3b\\x4d\\x3f\\x45\\x76\\x39\\xf1\\x6b\\x9b\\x9e\\xa3\\xeb\\x9e\\xe2\\x1b\\xe4\\x56\\xf2\\xe1\\xcf\\xf8\\xf5\\xee\\x3f\\xb0\\x75\\xdb\\x5b\\x29\\x58\\x92\\xda\\xa6\\x55\\x13\\x40\\x02\\x0e\\xaf\\xb1\\xad\\x32\\x40\\x88\\x4a\\x84\\x92\\x24\\x51\\x12\\xc7\\xa8\\x8e\\x19\\x3c\\x78\\xe6\\x62\\x28\\x36\\x91\\xf9\\x66\\xcf\\xdb\\x54\\x40\\x87\\x40\\x22\\x81\\x2c\\x2e\\x6e\\xa6\\x54\\x70\\x76\\x92\\x5e\\x4a\\xec\\xa9\\xb2\\xbe\\x6e\\xd5\\x80\\x24\\x88\\x37\\x55\\xb0\\xd8\\x17\\x7b\\x41\\xfa\\xbe\\xf8\\x6f\\x8c\\x0f\\x4f\\x41\\x3b\\x4b\\x2a\\x34\\xf8\\x4f\\x79\\x41\\xe1\\x3f\\x13\\x84\\x13\\xc1\\x80\\x42\\xd3\\xa6\\xd0\\x9c\\xf7\\x6e\\x19\\xd9\\xb6\\xbc\\xf0\\xb8\\x20\\x54\\xfa\\xde\\xa6\\x11\\xbe\\xc3\\xd9\\xe7\\x76\\x88\\xea\\x81\\xf1\\x78\\x67\\xe9\\x7a\\x84\\x2a\\x5c\\x99\\x33\\x32\\x55\\x07\\xb6\\x9a\\xc5\\x48\\x50\\x2f\\x9b\\x41\\xab\\xfd\\xfd\\x75\\x6b\\x46\\xb1\\x1d\\xd1\\x34\\x63\\xfe\\xfd\\xac\\x88\\x90\\x84\\x6a\\x70\\x37\\xe7\\xd5\\x4f\\x39\\xdd\\x67\\xe1\\xe1\\x16\\x25\\x0b\\x3e\\x3f\\x10\\xa0\\x58\\x4e\\x4d\\x6e\\x44\\x7a\\x68\\x6b\\x7e\\x7e\\xd3\\xbf\\x98\\xba\\x90\\x02\\x48\\xe7\\xf6\\xc9\\x20\\x27\\x1f\\x6d\\x64\\x02\\xf1\\x26\\xd6\\xda\\xd6\\x07\\xb5\\x0d\\xd2\\xb3\\xeb\\x8d\\x16\\xc2\\x2c\\x75\\x1d\\xb1\\x09\\x23\\x27\\x06\\xb8\\x2c\\x12\\x72\\xae\\x73\\x45\\x8b\\xb3\\x5b\\x68\\x12\\x53\\xc0\\xe0\\x27\\xaf\\xe8\\xdf\\x34\\xe5\\x53\\x65\\x5d\\xa4\\x04\\xd7\\x58\\xe0\\xab\\x3e\\xfa\\x1a\\x5a\\x5a\\x1b\\x68\\xb8\\x8b\\xc8\\x87\\x1e\\xa9\\x0e\\x46\\x5a\\x83\\x80\\x97\\x0c\\xb2\\x4f\\x66\\xf2\\x8e\\x0e\\x98\\xb9\\x42\\xb8\\x11\\x8b\\xd0\\xc5\\xcd\\xf9\\x36\\xe6\\x0e\\x0c\\xcb\\xc5\\xc5\\x8c\\xff\\xba\\xe8\\x0f\\xa5\\xb1\\x63\\x8f\\x94\\x64\\x55\\xdb\\x22\\xd1\\x26\\xa1\\x0b\\x68\\x86\\x7e\\x96\\x16\\xca\\xc0\\x1b\\xdc\\x3b\\xaa\\x4e\\x35\\xdd\\x18\\xa0\\x0a\\x02\\x9b\\x0c\\x61\\x59\\x58\\xa5\\xec\\x5d\\x8e\\x84\\x67\\xfc\\xbe\\xc6\\x43\\x34\\x90\\xa5\\x2c\\xd7\\x9c\\xb6\\xe1\\x42\\xf3\\x92\\x87\\x8b\\x79\\x2e\\x87\\x56\\x73\\x8b\\x18\\x6d\\xa2\\x69\\x1c\\xbc\\x16\\xa0\\xcb\\xf2\\xd0\\x09\\x57\\x0c\\xf5\\xbe\\x7b\\x4f\\xc9\\x7f\\x52\\x4e\\xb4\\x44\\xc4\\x56\\x2e\\xd1\\x22\\x2c\\xec\\x84\\x0a\\xba\\xfc\\xbc\\x55\\xc6\\xea\\x30\\xce\\x37\\xfd\\x94\\xaa\\x61\\xea\\xc8\\xbc\\x86\\x9f\\xa4\\xe0\\x06\\xae\\xae\\x66\\x33\\x63\\xe7\\x95\\xc6\\xa2\\x7f\\xb5\\x51\\xc9\\x1e\\x56\\x2b\\xfb\\x3f\\x00\\x9e\\x21\\x61\\xde\\xcc\\x01\\x9a\\x41\\x85\\xc9\\x6d\\x75\\xea\\x23\\x0e\\x98\\xcc\\x2c\\x58\\x88\\xd1\\x94\\xad\\x8c\\x1c\\x48\\x6e\\x41\\xbb\\x23\\x3a\\x80\\x69\\xd4\\xdb\\xd0\\x0b\\xf3\\x6d\\x63\\x4d\\xe4\\xf0\\x26\\x64\\x15\\x43\\xcb\\x82\\x93\\x22\\xb6\\x67\\x9a\\x10\\x67\\x75\\xbc\\x27\\x7c\\x75\\xde\\xcc\\x50\\x80\\x48\\xfa\\xa6\\x4d\\x08\\xfa\\x08\\x9a\\x36\\xec\\xc4\\x82\\x15\\x5b\\x0d\\x20\\xb2\\x38\\xb1\\x6a\\x89\\x77\\xb1\\x13\\x07\\xd4\\x94\\x3c\\x16\\xa2\\x17\\x61\\x95\\xe0\\xdb\\x79\\x6e\\xfb\\xbd\\x79\\x3d\\x14\\x51\\x15\\xcb\\xef\\x19\\x20\\x91\\x9d\\x72\\x82\\xb3\\x11\\xbc\\x55\\x38\\xee\\x40\\x36\\x5c\\x41\\x59\\x19\\x4f\\xe7\\xb1\\x4a\\x05\\x2a\\x8f\\x20\\x13\\x60\\x40\\x59\\xb5\\x48\\x1d\\xe8\\x71\\x46\\x22\\xac\\x91\\x33\\x88\\xb4\\x39\\x27\\xf1\\x7e\\xc5\\x99\\x68\\xef\\xc4\\xe6\\xcb\\xae\\x5f\\x04\\xd6\\x47\\x9d\\x8f\\xd2\\xee\\x76\\x87\\xc2\\xc9\\xdf\\xb0\\x32\\x56\\xc0\\x18\\x37\\xd9\\x94\\x34\\xed\\x36\\xb5\\x90\\x06\\x69\\x0d\\x51\\xe1\\x9d\\xcc\\x96\\xde\\x77\\x90\\x41\\x5c\\x61\\x8e\\x48\\x80\\xd9\\x07\\x4c\\x9a\\x78\\x7b\\x96\\x0e\\x86\\x6a\\x3f\\xba\\x9f\\xf0\\x41\\x78\\x8f\\x65\\x6d\\x02\\x9d\\x24\\x66\\x00\\x56\\x65\\x1f\\x28\\xbe\\x50\\x02\\x2f\\xc7\\x6c\\xa0\\x54\\xc5\\x8a\\xc3\\x07\\xb6\\x5a\\x93\\x64\\x0a\\xed\\x16\\x95\\x2e\\xa3\\x2e\\x10\\xfa\\x9d\\x2f\\x05\\xc6\\x30\\x97\\x3c\\x18\\x22\\xa0\\xde\\xd8\\x80\\x73\\xd8\\xcc\\xf0\\xc0\\xf8\\x3f\\x7b\\x59\\x62\\x61\\x2c\\x08\\xd4\\xb0\\x83\\xda\\xff\\x5d\\x5c\\x43\\x22\\x49\\xac\\x5e\\xf6\\xca\\xa0\\x31\\x12\\x0b\\x27\\xd8\\x52\\x86\\xb2\\x16\\x7e\\xda\\x38\\x6c\\x5a\\xa7\\xc9\\x18\\xc7\\x47\\x13\\x7a\\xbd\\x05\\x1c\\xdc\\x27\\x37\\x7c\\xd3\\x04\\x63\\xa4\\x9d\\xfb\\x36\\x7c\\x65\\x67\\x2b\\x8b\\xa7\\x36\\xeb\\x54\\x3e\\x04\\x59\\x4c\\xbe\\xdc\\xb6\\xbe\\xe1\\x09\\xdd\\xcd\\xb0\\xc3\\x32\\xe8\\xc0\\xf1\\x90\\xdc\\x70\\xf7\\x61\\xda\\x04\\xd8\\x23\\xe4\\x84\\x86\\x82\\xa2\\x7e\\x4d\\x38\\x3a\\xae\\xdb\\xa9\\x42\\x65\\xa8\\x81\\x80\\x7b\\xf2\\x81\\x4b\\x6e\\xd6\\x83\\xcd\\x94\\x84\\x3a\\xa7\\x59\\xcf\\x06\\x10\\x0c\\x9c\\x3c\\xb2\\xea\\xdb\\x17\\x19\\x33\\x7e\\x56\\xfa\\xcf\\x16\\x16\\xd8\\xb9\\x83\\x80\\xd5\\x02\\x03\\x31\\xba\\x42\\xc0\\x5f\\xc1\\x43\\x54\\x47\\x19\\x14\\x55\\xd7\\xb6\\xea\\x46\\x01\\xed\\x48\\x30\\x23\\xef\\x87\\xd0\\xee\\xf2\\x55\\x6c\\xb3\\xeb\\xab\\xc2\\xee\\x49\\x9a\\x6d\\x49\\x5e\\xf2\\x42\\x24\\xf4\\x58\\xd3\\xda\\x7e\\x6c\\x40\\x85\\x3b\\xe0\\xe6\\xe7\\xdb\\x44\\x95\\x4b\\x4f\\x4c\\x32\\x81\\x00\\x04\\xf2\\x4f\\x03\\x0c\\x61\\x8c\\x77\\x0f\\x1a\\x05\\xbb\\x26\\x1c\\xed\\xc5\\xb4\\x88\\xf6\\x0b\\xf5\\xb8\\x40\\x68\\xc9\\x81\\x6e\\xbc\\x1f\\x07\\x08\\x46\\xca\\x71\\x04\\x57\\x6b\\x9b\\xd3\\x22\\xf5\\x84\\x0b\\xc5\\x6e\\x4f\\x9e\\x53\\xf7\\x8c\\x1b\\xf0\\xe0\\xc3\\x40\\x3e\\x6e\\x20\\x94\\xc4\\x42\\xdf\\xbc\\x9f\\x2e\\x75\\xff\\x41\\xae\\x5a\\xe3\\x57\\x66\\xc4\\xb1\\x4b\\xc8\\x21\\x8e\\xd4\\x97\\xa2\\x10\\xe1\\x32\\xb8\\x68\\xd6\\x37\\x4a\\x87\\x04\\xc6\\xc0\\x11\\xa6\\xcc\\x87\\x21\\x75\\xd6\\xb5\\xbe\\x10\\xee\\xc9\\x49\\x1e\\x8c\\xd7\\xa4\\xbe\\x05\\xf8\\x30\\xad\\x55\\x03\\x1c\\x7f\\x0e\\xd0\\x23\\x67\\x84\\x18\\x86\\x3b\\xf7\\x14\\x2c\\x40\\x61\\x11\\xe4\\xde\\x46\\x9d\\x35\\x32\\xdc\\x5d\\x47\\x63\\x06\\x90\\xa1\\x40\\x79\\x71\\x3a\\x1f\\x06\\x40\\x16\\x44\\xd1\\xe6\\x81\\xe8\\xb4\\xac\\x4e\\x1d\\x2a\\x1d\\x98\\xef\\xca\\xaf\\xa0\\x29\\x23\\x5f\\x9d\\xb6\\xce\\xf9\\x98\\x0f\\x24\\x54\\x85\\xb0\\x07\\x96\\x1e\\xc7\\x6f\\xc0\\xe0\\xa5\\x02\\x8d\\x14\\xd4\\x85\\xe1\\x00\\xa0\\x8a\\x49\\x45\\xe0\\x7a\\x72\\x93\\xea\\xe1\\x42\\x3f\\x2a\\x23\\xcb\\x70\\x30\\x78\\x59\\x8b\\xe9\\x5d\\xd7\\x4e\\x9d\\x36\\x6c\\x0c\\xcb\\x35\\xc4\\x35\\xf0\\x2f\\x00\\x54\\xf2\\xe5\\x19\\x4a\\x9d\\xf7\\x0e\\x49\\x6c\\x86\\x99\\xd0\\xad\\x0f\\xaa\\xa1\\x7a\\x0d\\x68\\x78\\x0a\\x1a\\xb5\\x89\\xc5\\x42\\x1e\\x0b\\x02\\x48\\x7d\\x13\\x07\\x68\\x2d\\x8e\\x1a\\x85\\x69\\xa9\\xcb\\x4c\\xa0\\x47\\xac\\x0d\\x31\\xd8\\x29\\x6d\\x56\\x98\\xd8\\x70\\xd4\\xf4\\xf5\\x9b\\x92\\x4b\\x13\\x26\\xad\\x51\\x53\\x85\\x00\\x56\\x4b\\x73\\x5f\\x67\\xfd\\xa7\\xab\\x6b\\x57\\x4a\\x04\\x86\\x61\\xec\\x30\\x5b\\xe0\\x37\\x17\\xd9\\x00\\x5f\\x54\\xc3\\xa0\\x22\\x05\\xfc\\x74\\xfc\\x86\\xc8\\x32\\x03\\x11\\xf3\\x3d\\x2f\\x3f\\xd0\\x0f\\xe6\\x26\\xa3\\xf8\\x45\\x58\\x98\\xab\\x74\\x03\\x80\\x30\\xe4\\x1c\\xd6\\x1c\\x7a\\xf5\\x1b\\xac\\x20\\x4a\\x20\\x93\\xd8\\x2a\\x4d\\xac\\x20\\xe5\\x3f\\xef\\x44\\xd7\\xa0\\xe8\\x82\\x7a\\x84\\x0b\\xc9\\xdd\\x07\\xd5\\xc4\\xc0\\xa8\\x7c\\xb1\\xaa\\xb6\\x23\\x16\\x63\\x64\\xef\\xb1\\xa8\\x24\\x7e\\xb5\\x04\\xbb\\x13\\xa0\\x2a\\x19\\x81\\x91\\x04\\xda\\x0d\\x02\\x2b\\x5b\\x0b\\x00\\x93\\x0a\\x31\\x15\\x44\\xb0\\x91\\x7a\\x72\\x7f\\x3d\\x0d\\x6d\\x05\\x8c\\xc9\\xea\\xf1\\x2d\\xa9\\x8e\\xb1\\x65\\x03\\x67\\x6e\\xe6\\x6b\\x10\\x71\\x30\\xed\\x66\\x1c\\x9e\\x2d\\xe2\\xca\\x68\\xed\\xba\\x8b\\x0c\\x52\\x7f\\x8b\\xdb\\x01\\xf7\\x5a\\xcc\\x99\\x51\\x3b\\xa6\\xdf\\x4a\\xa9\\x70\\x18\\xfd\\x78\\xe2\\x08\\xc6\\x3c\\x3e\\xe8\\x52\\xe8\\x65\\x12\\x8f\\x35\\x94\\x03\\x0a\\xa4\\x23\\xab\\x90\\xb8\\xcc\\xc6\\x8b\\x3a\\x10\\x75\\x88\\x13\\xaf\\x64\\x1e\\x4c\\x70\\x84\\x03\\xc2\\xfb\\x80\\x18\\x38\\x3d\\x21\\xa4\\x41\\x21\\xf6\\x8e\\xa3\\x12\\x80\\xd6\\x6b\\x7c\\x83\\xf8\\x26\\x0c\\x47\\xc4\\x7d\\x24\\x42\\x46\\x99\\x04\\x0e\\x92\\xca\\xfa\\x31\\x0a\\x57\\x1c\\xda\\x0a\\x93\\x73\\x68\\x64\\x61\\x10\\x9b\\x31\\x8f\\x16\\x5c\\xfc\\xdc\\x46\\x02\\xe4\\x95\\x5d\\x39\\x87\\x01\\x35\\xb5\\x59\\x10\\xb1\\x11\\x65\\x6b\\xa2\\x08\\x70\\x61\\xbd\\x7d\\x25\\x5c\\xfb\\x7d\\x08\\xbe\\x82\\xe9\\x31\\xa5\\xa9\\x39\\xc1\\xd7\\xd2\\x2a\\x8f\\xe3\\x5f\\x38\\xbe\\x27\\x7e\\x09\\x22\\x2c\\x44\\xca\\x13\\x38\\x53\\x6d\\x4c\\x45\\x37\\x62\\x1b\\x97\\x50\\xa6\\x05\\x2d\\x7b\\xd9\\xe1\\xdb\\x80\\x7f\\xee\\x1b\\x3d\\x89\\x28\\xa3\\x2e\\x6d\\x90\\x31\\x82\\x1e\\x4d\\x8e\\xc4\\xa9\\x6f\\x5a\\x30\\x9b\\x3e\\x09\\x10\\x1c\\x69\\xbd\\x32\\xcb\\x8a\\x9b\\x02\\x58\\x1b\\xf3\\x49\\x12\\xea\\x81\\x14\\x00\\x49\\x92\\xa8\\xb0\\x47\\xef\\x20\\x99\\xed\\x9b\\x81\\x28\\xff\\x24\\x80\\xcc\\x7e\\xc8\\x21\\x45\\xe3\\x09\\x02\\x06\\xdf\\x40\\xdb\\xbb\\xc9\\x86\\x2f\\x03\\x6f\\x02\\x67\\xa0\\xc0\\xc8\\x76\\x3a\\x9e\\x1a\\x41\\x70\\xcb\\xf6\\x21\\x5d\\x7c\\xe7\\xe4\\x96\\x32\\x28\\x41\\x02\\x66\\xf1\\x74\\x75\\xcb\\x22\\x98\\x1d\\x8d\\x08\\x1c\\x7e\\x27\\xa0\\xc4\\xe2\\xbb\\xbf\\xd2\\xed\\x36\\xfe\\xbf\\x45\\x5e\\x59\\x6e\\xbf\\x05\\x48\\xa3\\x70\\x3c\\x5a\\xfb\\x09\\xc0\\xc9\\xd8\\xa7\\xd9\\xa4\\x68\\x55\\x26\\x40\\x5a\\xa7\\xbc\\x98\\x68\\xf1\\xc0\\x13\\x88\\xa9\\x01\\xb7\\xaa\\x5a\\x21\\x09\\xae\\x2c\\x1a\\x70\\x86\\x44\\x0c\\x0e\\x92\\x48\\x54\\x20\\x05\\x5d\\x90\\x32\\x09\\x16\\x59\\x9b\\x99\\x24\\xbd\\x5f\\xf2\\x34\\x49\\x73\\xaf\\xda\\xeb\\xd4\\x6a\\x15\\x14\\xe4\\xe8\\xb0\\xd5\\xbc\\xa5\\xc6\\xc1\\x55\\x94\\xd9\\x0a\\x0d\\x3a\\x3c\\x3a\\xe4\\xa3\\x87\\xae\\x5a\\xaa\\x6f\\x5d\\xc0\\x00\\x37\\xb5\\x68\\xb5\\xe5\\x9a\\x44\\x5e\\x5e\\x37\\x1b\\x1e\\x00\\x1f\\x7b\\xc9\\x08\\xe3\\x8c\\x9a\\x02\\x54\\xcd\\xe8\\x67\\x8b\\x05\\xb8\\x30\\x8a\\x07\\x05\\xdd\\x67\\x08\\xec\\xd1\\x89\\xd1\\x78\\x4c\\x09\\xd2\\xff\\xd2\\xad\\x0c\\x0d\\x64\\x7d\\xf2\\x43\\x0d\\x2b\\xf1\\x93\\x39\\xef\\x86\\x79\\x43\\x4d\\x90\\x60\\xed\\x19\\x33\\x0c\\x8d\\x81\\x5a\\x66\\x08\\xd9\\x72\\x80\\xac\\x4a\\xea\\x5e\\xcc\\x5d\\x44\\x48\\x08\\xe5\\xfb\\x4b\\x07\\x3d\\x11\\x8a\\xc1\\x29\\x45\\xd6\\x6f\\x6f\\x93\\x06\\x0d\\x73\\x06\\xce\\x11\\x85\\xc1\\xc9\\x92\\xbc\\x9f\\xa5\\xac\\xe5\\xa8\\x1d\\x80\\xd6\\xaa\\x1e\\x20\\xae\\x52\\x7c\\x0f\\xd6\\xe2\\x0a\\xea\\xef\\x21\\x88\\x4f\\x35\\xd9\\xa5\\x40\\xed\\xa9\\x47\\xae\\xb7\\x8d\\x79\\xef\\xc6\\xfd\\x1c\\x2d\\x19\\x04\\x50\\x9f\\x8d\\x69\\x76\\xf0\\x85\\x72\\x18\\xf7\\xde\\xbb\\x0e\\xde\\xff\\x0e\\x7c\\x88\\x90\\x50\\x42\\x72\\xc9\\x2e\\x04\\x84\\x5f\\xfc\\x4d\\x5e\\x26\\x84\\x08\\xff\\xc5\\x1a\\xe7\\xbd\\x0b\\x6a\\x14\\x04\\xba\\x40\\x7b\\xb1\\x46\\xba\\x21\\xc1\\xc5\\xa8\\xee\\x45\\x34\\x1d\\xb9\\x50\\x48\\xc3\\x23\\x7c\\x36\\x08\\xa9\\x62\\x4e\\x9b\\xaf\\xa3\\x2e\\x6c\\xc5\\xc5\\xff\\x9e\\xd8\\xf9\\xb6\\x28\\x24\\xc0\\xfc\\x14\\x4c\\x37\\x8c\\xbc\\xe6\\xbc\\xf7\\x08\\x3e\\xfa\\x39\\x0e\\xde\\x4f\\x91\\x50\\x3c\\x24\\xca\\x21\\x45\\x72\\xe8\\xab\\xf7\\xbd\\x0a\\x44\\xeb\\xac\\x40\\x53\\x1c\\xad\\xc7\\x5d\\x97\\xa1\\x68\\x0f\\x29\\x58\\xe0\\xce\\x1c\\xc8\\xc9\\x39\\x20\\x08\\xf1\\x1c\\xc6\\x4c\\xe3\\x53\\x80\\xb3\\x98\\x49\\x18\\xb3\\xab\\x50\\x99\\x50\\xdf\\x73\\x72\\x79\\xef\\x81\\xd1\\x64\\x3d\\xfa\\xea\\x34\\xfe\\xc6\\x82\\x9a\\x3e\\xa8\\x8a\\x10\\x52\\x20\\xbc\\x23\\x80\\xed\\x55\\x59\\xb2\\xee\\x34\\x2a\\x6d\\xe1\\x03\\x48\\x44\\xc4\\xcd\\xed\\xe5\\x3a\\x28\\x5e\\x06\\x8b\\xf7\\x14\\x27\\x4e\\x8b\\xf8\\x71\\x4f\\x4b\\xa1\\xf4\\xc8\\x39\\x99\\xc2\\x69\\xdf\\x74\\x65\\xde\\x50\\x4a\\xb1\\x8b\\x4c\\x5d\\x4b\\x5c\\xc7\\x05\\x6c\\x2c\\xa1\\x60\\x7a\\x78\\x48\\x49\\xd0\\xb0\\xcc\\x17\\x89\\x84\\x60\\x38\\xd1\\xb8\\x26\\x2f\\xae\\x5b\\x9a\\x85\\x61\\x78\\x25\\x56\\x46\\xd1\\x85\\x82\\xd2\\xd3\\x91\\xec\\xd2\\x76\\xc4\\xe1\\xf2\\xa0\\x49\\x5d\\xb9\\x95\\x12\\x50\\x32\\x68\\xce\\x51\\xd9\\xc5\\x3c\\x2d\\x9a\\x0f\\xd5\\x34\\x37\\x50\\x12\\xd4\\xf2\\x20\\xb1\\x4f\\xfa\\xf9\\x42\\xfd\\xcd\\x1d\\xd6\\x02\\x7d\\x05\\x3e\\x4c\\xd6\\x63\\xfd\\x50\\xe3\\x3f\\x67\\x01\\x31\\x35\\x92\\x12\\x91\\xb1\\xff\\x50\\xd9\\xec\\xcc\\xd7\\xb8\\x63\\x5f\\x0d\\x06\\x28\\xb8\\x5c\\x52\\x94\\x45\\x23\\xa0\\xa5\\xf4\\xf8\\x07\\x59\\xe7\\x71\\x93\\x32\\x4e\\x72\\x18\\xbd\\x99\\xcb\\x78\\x1b\\x0a\\x49\\x22\\xe8\\x71\\xa0\\x6b\\xc4\\x9c\\xd7\\x95\\xd7\\xc8\\x51\\x27\\xb3\\x94\\xf1\\xc8\\x64\\x82\\x01\\x45\\xe2\\x0a\\x08\\x54\\x5b\\xc8\\x15\\xa0\\x8d\\xfd\\xe3\\x62\\x16\\x9e\\x1f\\xbf\\x00\\x21\\xc3\\x28\\x6c\\xfa\\x9a\\x3b\\xe7\\xb1\\x06\\x8b\\x96\\x88\\x50\\x2d\\x1f\\x04\\xd5\\xb7\\xdd\\x2c\\x6c\\xf5\\x37\\x2c\\x5e\\xa3\\x94\\xbb\\xb3\\x3c\\x12\\x09\\xa7\\xa9\\x98\\x41\\x8e\\xd4\\x62\\x91\\xf8\\x04\\xe8\\xed\\xd0\\x9a\\x88\\x5b\\x49\\x08\\x19\\x31\\x67\\x58\\x04\\x4d\\x0a\\x31\\xf0\\x0f\\x50\\x0e\\x3c\\x46\\xba\\xf8\\x61\\x85\\xdd\\x3e\\x14\\x82\\x11\\xb9\\xc1\\xd1\\x81\\x06\\x36\\xec\\x83\\xde\\xc2\\xf8\\xcd\\x54\\x24\\x8a\\x3a\\x0b\\xd6\\xdb\\x30\\xae\\x1a\\x3a\\x2d\\xb5\\x85\\x19\\x4b\\xde\\x76\\x21\\x92\\x99\\x19\\xaa\\x17\\x65\\x55\\x7e\\xdc\\x62\\xcc\\x81\\xbc\\x55\\x34\\x34\\x1e\\x64\\x54\\x04\\x1c\\x47\\x15\\x64\\x3a\\x42\\xde\\x5e\\xec\\x89\\xca\\xb1\\xca\\x92\\x00\\xe6\\xb9\\xf3\\x86\\x41\\xbd\\x28\\x2e\\xb9\\xa8\\x10\\x49\\xd6\\x5a\\x26\\xcf\\x85\\xf0\\xa4\\xe1\\x89\\x4d\\x73\\xa4\\x94\\x9c\\x58\\x30\\xb6\\x51\\x5a\\x69\\x62\\x7f\\x46\\xc3\\x96\\x58\\x73\\x0b\\x8d\\x15\\x35\\x62\\xa5\\xe8\\x2f\\xea\\x22\\x61\\x8e\\x7c\\xc4\\xc2\\x5f\\xa3\\x27\\x60\\x9c\\xcf\\x59\\xf2\\xe3\\xf1\\xc2\\xc9\\xcd\\x1e\\x9c\\xd3\\xe4\\x97\\x87\\x24\\xcc\\xf5\\x58\\xa8\\x1f\\xaa\\xe9\\x01\\xb6\\x8f\\x4f\\x8a\\x0e\\xf1\\x2c\\x11\\x18\\x1e\\x79\\x2d\\xc9\\x6c\\xba\\xb4\\xbc\\x4c\\xed\\xf7\\x19\\x6c\\x38\\x0e\\x08\\x8a\\x97\\xd2\\x32\\x46\\xac\\x6f\\xa6\\xcc\\x83\\x10\\xd4\\x5c\\x8d\\x47\\xab\\x4c\\xa5\\x50\\xcc\\xa4\\x70\\xb1\\x8d\\x66\\xaa\\xf8\\x5e\\xbe\\x04\\x86\\x4c\\x5c\\x0b\\xd1\\x64\\x62\\xe2\\xd0\\xf1\\x5c\\x0c\\x04\\x93\\x68\\x92\\xc9\\xd0\\xce\\x4a\\x41\\x59\\x99\\x8b\\x1e\\x02\\xd1\\xc7\\xe7\\x21\\xe0\\xe6\\xa0\\xb7\\x4b\\xc9\\x28\\x99\\x9c\\x72\\xda\\xa8\\x0e\\x53\\xde\\x90\\x4f\\x20\\x76\\x56\\x68\\x6c\\x56\\x5f\\x18\\x75\\x49\\x3b\\x00\\xaf\\x06\\x95\\x09\\x30\\x96\\x99\\x9a\\xc6\\x9f\\x55\\x0f\\x23\\xce\\xbd\\xea\\x1a\\x64\\x48\\x56\\xb5\\x48\\x03\\x42\\xbd\\xd6\\x7b\\x04\\x67\\x56\\xd8\\x4c\\x78\\x55\\xb8\\x31\\xe8\\xf2\\x91\\x2d\\x5d\\x78\\x38\\x32\\x57\\xc0\\x91\\x05\\x52\\xea\\x44\\x28\\x19\\x11\\xb5\\x1f\\x26\\x17\\xc4\\xe8\\xcd\\x2a\\x5c\\xcb\\x2a\\xcf\\xa2\\xfc\\xaa\\xa8\\x2d\\x40\\x7e\\x21\\x4a\\x0d\\xd0\\x39\\xa4\\x19\\xfc\\xa7\\x13\\xb0\\xcf\\x3f\\x18\\x04\\xac\\x06\\x05\\x4a\\xee\\xe1\\xbf\\x3a\\x9d\\x26\\x03\\x8e\\x07\\x53\\xa4\\xfb\\xac\\x71\\x42\\x23\\x47\\xe2\\xb4\\xc8\\xe8\\xd4\\x43\\x4f\\xc7\\xa7\\x6c\\x18\\xf7\\xc3\\xea\\xc2\\x7e\\x83\\xc3\\x67\\xc4\\x02\\x29\\xa1\\x4f\\x1f\\x65\\x78\\x97\\x49\\x7b\\x38\\x97\\x76\\xd9\\x7d\\x4a\\xa6\\x04\\x5a\\xde\\x73\\x7f\\xcc\\x9b\\x2e\\x53\\x98\\x02\\xb2\\x77\\xb9\\x2b\\xec\\x4f\\x7d\\x62\\x3c\\x34\\xdf\\x40\\x6a\\xdc\\x44\\xe0\\x70\\x4d\\x63\\x3f\\xc3\\x99\\x90\\xb5\\x4b\\xe8\\x08\\xe6\\x41\\xe9\\x67\\xe7\\x8e\\xfa\\xc7\\x8a\\xfa\\xf1\\x1f\\x1f\\xe2\\x21\\xd2\\xdc\\x2a\\x61\\xd4\\xad\\x58\\x7d\\x9e\\xc0\\x87\\x6e\\xee\\x44\\x42\\xcf\\x30\\xa9\\x1c\\x70\\x36\\x26\\x07\\x72\\x99\\xcf\\x46\\xdc\\x22\\x77\\x01\\x0d\\x5c\\xb2\\x99\\x1f\\x4d\\x07\\x6e\\x5c\\x71\\xe6\\x87\\xc2\\x4e\\x7c\\x45\\x15\\xdc\\x7b\\xf0\\x14\\x63\\xfe\\x09\\x11\\x05\\xb7\\x77\\x04\\x09\\x29\\x84\\xf5\\x92\\x0e\\x6a\\xe4\\x8a\\x41\\x88\\xe1\\x27\\x18\\xf3\\x48\\x41\\xfe\\x72\\x44\\x16\\x33\\xbd\\x24\\xf8\\xd2\\x7e\\x54\\x92\\x71\\x05\\x88\\xc1\\xbe\\xba\\x3b\\x74\\x8e\\x0d\\xea\\xd9\\x91\\xfc\\x92\\x22\\x40\\xe6\\xae\\x9b\\x6a\\x79\\xcb\\xf3\\xe6\\x8a\\x17\\x02\\x57\\xfb\\x49\\xbe\\xd9\\x9f\\xf5\\x03\\x17\\x43\\x37\\xfb\\x52\\xa1\\xb2\\x71\\x9b\\xb1\\x1e\\xc9\\x98\\xfc\\xd0\\xb9\\x5e\\xad\\xcb\\x3a\\xea\\xef\\xfe\\xd6\\x0a\\xb0\\x30\\x90\\x90\\xab\\x06\\xca\\x80\\x85\\x0e\\xb7\\xda\\x01\\xd3\\x4e\\x9d\\xd4\\x02\\x91\\x41\\x84\\x5f\\x94\\xe5\\xc9\\x1d\\xf9\\x61\\xdf\\x84\\x92\\xa3\\xc4\\x77\\xf2\\x25\\xed\\x92\\xde\\xb7\\xc8\\xda\\x1c\\x2b\\x23\\x5d\\xf6\\x6e\\x85\\x7f\\x9a\\xb4\\x24\\x53\\x85\\xac\\x0f\\x0c\\xfb\\xea\\x03\\xfa\\x91\\x84\\x38\\x91\\xbc\\x5d\\xdb\\x39\\xe5\\x44\\xfa\\xe9\\x8a\\x6e\\xb7\\x1e\\x5d\\xc1\\xe3\\xef\\x84\\xca\\x59\\x64\\x36\\xf3\\x42\\x1d\\x8f\\x26\\x57\\x7a\\x41\\x71\\x8b\\x66\\x7a\\x16\\x8c\\x12\\x36\\x2a\\xc2\\x07\\x89\\x5e\\x6c\\x27\\x03\\x20\\x19\\xf4\\x94\\x8f\\x0b\\x1f\\xc2\\x94\\x46\\x97\\x87\\xad\\xfc\\x47\\x7c\\x15\\x07\\xe6\\x58\\x9b\\x98\\x41\\x3b\\x46\\x36\\xd7\\xe9\\xb4\\x01\\xfe\\xc2\\xc1\\xdd\\xa0\\x48\\x76\\xc4\\xf8\\xb6\\x26\\x2d\\x2a\\xb0\\x7e\\x5e\\x6b\\xd6\\x18\\x11\\x21\\xdb\\x18\\x44\\x25\\x83\\xc6\\x07\\x07\\x7b\\x78\\x93\\x40\\x00\\xe0\\xed\\x28\\x01\\x0f\\x44\\x6a\\x54\\x8c\\xd0\\xa9\\x4b\\xe9\\x90\\x81\\x25\\x78\\xef\\x0b\\xdc\\x2c\\xc0\\xc8\\x56\\x30\\xf4\\xe1\\x58\\x9f\\xa4\\xe8\\x12\\x09\\xcf\\xf0\\x55\\x46\\x4f\\x10\\x37\\x7c\\xb0\\x24\\x24\\xa2\\x12\\x00\\x31\\x3c\\x25\\x1f\\x99\\x20\\x8a\\xf7\\xb4\\x4d\\x7c\\xf0\\x9b\\x77\\x0f\\xa2\\x0e\\x5d\\x83\\x09\\x98\\x9c\\x08\\x3d\\xa6\\x6a\\x16\\x30\\x4e\\xb6\\x0c\\x9a\\x6a\\xf7\\x77\\xb7\\xc2\\x67\\x07\\x1f\\xb6\\x57\\x01\\x2d\\x8a\\xbe\\x3e\\x5b\\xa3\\x4c\\x3b\\x35\\x96\\x40\\xc1\\xd3\\xc8\\x2f\\xd0\\x6c\\x1b\\x3f\\xf9\\xa7\\x9d\\x0f\\xc0\\x72\\x0e\\x20\\x48\\x68\\xe2\\x07\\xcb\\x08\\x10\\x82\\xbf\\x06\\xb3\\x81\\x85\\xe2\\x07\\x00\\xc2\\x2f\\x90\\x38\\x60\\x1b\\x37\\x4a\\x52\\x5a\\x62\\x50\\x0f\\xf2\\x15\\x1a\\x96\\x89\\xe5\\x38\\x23\\xec\\x9c\\x0d\\xeb\\x00\\x4d\\x06\\x9f\\xd5\\x9b\\x7d\\x83\\x67\\xa1\\xdf\\x63\\x03\\xa0\\x48\\x02\\x9f\\xe7\\x48\\xda\\xc4\\x4a\\xe5\\x62\\xe0\\x04\\x82\\x04\\x77\\x66\\x33\\x73\\x70\\x02\\x23\\x00\\x57\\x16\\x28\\xbf\\x1b\\x52\\x18\\x2d\\xf0\\x00\\x8f\\x05\\x5c\\x64\\x16\\x39\\xb2\\x8e\\xb1\\x41\\x01\\x11\\x80\\x3b\\xfc\\x80\\x07\\x00\\x5b\\x03\\xe0\\x62\\xe6\\xa3\\xa1\\x80\\x0e\\xcc\\xd0\\xbe\\x22\\x5b\\x1c\\x31\\x95\\xc1\\xfc\\x13\\xf5\\xc7\\x73\\x30\\x0a\\xda\\x0e\\xe0\\x0f\\xb1\\x2a\\xb6\\xbf\\x00\\x1f\\x00\\x70\\x6a\\x18\\x34\\x90\\xb1\\x34\\x70\\x71\\x08\\x10\\x0a\\x48\\x0b\\x2d\\x73\\xc2\\xbb\\x6d\\x81\\xc2\\x83\\x78\\xf1\\x87\\x7a\\x0d\\x45\\x83\\x12\\x36\\x75\\x2b\\x58\\x17\\x76\\x8c\\xb5\\xaa\\x75\\x88\\xff\\x57\\xba\\x12\\x06\\x75\\x3f\\x24\\xb1\\x9d\\xe4\\x24\\x49\\xfa\\xe4\\xc2\\x6c\\xe9\\x54\\xac\\x8b\\xff\\xa3\\x20\\x0e\\x1b\\xc6\\x18\\x07\\xa9\\x2b\\x37\\xea\\x1d\\x85\\xfb\\xe8\\x1e\\xb2\\x48\\x09\\x1b\\xe0\\x8d\\x08\\xa2\\xec\\x58\\x84\\x49\\xe8\\x03\\x8b\\xdb\\x0c\\xf8\\x53\\xe0\\x0b\\xc5\\xa1\\x8b\\x8e\\xb0\\x00\\xee\\x2a\\x75\\xf5\\x01\\xde\\x50\\x0d\\xb5\\x3c\\x4a\\x1c\\xd9\\xaf\\xd0\\x08\\x4a\\xb2\\xf2\\x1a\\x93\\x30\\x67\\x53\\x7e\\x53\\xfd\\xc3\\x4b\\x4a\\x9c\\xc4\\xf2\\x68\\x38\\xb1\\xd0\\x3c\\xe9\\xa6\\x8e\\x4f\\x5f\\x84\\xe3\\x5f\\xd8\\x4a\\x9b\\x36\\x75\\x91\\xbd\\x00\\x17\\x9f\\x5f\\xb6\\x12\\xe0\\x03\\x50\\x46\\x52\\x60\\x81\\x20\\xc2\\x27\\xa8\\x85\\x2f\\x37\\x31\\x28\\x39\\x2c\\xf6\\x75\\xca\\x56\\x4e\\x6c\\x41\\x55\\xbb\\x76\\x59\\xbe\\x5e\\x0d\\xbc\\x66\\x69\\x7f\\x53\\xc6\\x3d\\xa2\\x58\\x09\\x9e\\xe1\\x89\\xc0\\x1a\\xde\\x40\\x78\\xf4\\x44\\x07\\x21\\xbf\\x0c\\xe0\\x7b\\xe3\\xcb\\x5e\\x7b\\x11\\x2f\\xa8\\x0b\\xef\\x0c\\x08\\xd4\\x07\\xdf\\x77\\x3c\\x45\\x2f\\x6b\\x4b\\xdf\\x09\\xdd\\x71\\x4d\\xe0\\x14\\x07\\x8a\\x83\\xf8\\xf5\\xd6\\xe7\\x1b\\x7b\\xa8\\xc4\\x0c\\x84\\x5e\\x20\\x9e\\x13\\x22\\x74\\x1a\\x58\\x3c\\x50\\x5f\\xa5\\xe0\\x94\\x2d\\x2c\\xaa\\x92\\x68\\x3d\\x9c\\x69\\xde\\x84\\x4d\\x38\\x57\\x16\\x42\\x78\\xa3\\x88\\x78\\xa0\\xde\\xc7\\x69\\xff\\x49\\x3a\\x68\\x6f\\x9e\\xb0\\x0c\\x03\\x03\\x8c\\xd6\\xeb\\x63\\x07\\x02\\x13\\xdb\\xf3\\x81\\x80\\x9a\\x15\\xcb\\x25\\x76\\x80\\x3a\\xf0\\x0e\\xcd\\xad\\x3b\\x9d\\xdc\\x6b\\x14\\x5a\\xbc\\x28\\xd0\\x0d\\xf5\\xab\\x65\\x80\\xfd\\x81\\x83\\x3b\\x04\\x8d\\x1e\\xa0\\xf6\\x19\\x8d\\x20\\x4a\\x27\\x9c\\xbf\\xf1\\xe7\\xde\\x09\\x21\\xaa\\x59\\x49\\x35\\x7b\\x7d\\xa0\\x2b\\x40\\x0c\\x38\\x22\\x66\\xb6\\x13\\x85\\x89\\x17\\x83\\x27\\xab\\x3a\\xb2\\xe7\\xbe\\x71\\xf3\\xe3\\xb0\\xba\\x54\\x94\\xd0\\x03\\x7d\\xaf\\x0e\\x82\\x09\\x95\\xeb\\xca\\x3f\\x64\\xe0\\x00\\x2a\\xbb\\xf0\\x8e\\xa6\\xee\\x42\\xb9\\x80\\xa9\\x76\\xd6\\x8f\\x62\\x4b\\xb6\\x6b\\xf1\\xda\\xe0\\x07\\x1e\\x46\\xd6\\xe8\\xb3\\xfd\\x35\\x9e\\x93\\xb0\\x91\\x58\\x1f\\x01\\x49\\x75\\x7a\\xb5\\x85\\x18\\xf9\\xe4\\xc1\\x0c\\x4f\\xa2\\x08\\xb2\\xd6\\xe0\\x39\\x25\\x7e\\xe4\\x81\\x17\\xff\\xb5\\x25\\x0c\\xff\\x8c\\x88\\x83\\x00\\xee\\x54\\xed\\xdc\\xf6\\x3e\\x8a\\x29\\x17\\x62\\xcc\\x3e\\x33\\xeb\\x97\\xe3\\x90\\x4a\\x65\\x17\\x65\\x33\\xbe\\x8b\\x9b\\x83\\xe5\\xc2\\x41\\x49\\x72\\x01\\xa3\\xe5\\x57\\x85\\x02\\x56\\x5b\\xc0\\x44\\xa2\\xb9\\x81\\xfe\\x49\\x98\\x7d\\x88\\x8e\\xb0\\x3c\\xf0\\x50\\x2e\\xac\\xb7\\xd6\\x7d\\x87\\x58\\x61\\xcf\\x5e\\x71\\xcf\\x86\\xa9\\x06\\xa3\\x28\\x07\\x43\\xb0\\x18\\x12\\x17\\x55\\x71\\x19\\x80\\x75\\x3c\\x6b\\xdd\\x18\\xe8\\x34\\xcd\\xe2\\xe5\\x1b\\x1b\\x8a\\x52\\x45\\x39\\xad\\xc3\\x08\\xf7\\x11\\x90\\x84\\x94\\xb2\\x6f\\x01\\xce\\xf3\\x12\\x43\\xb8\\x93\\x9a\\x62\\x3e\\xcd\\xb6\\x1a\\xed\\xa5\\xc4\\x82\\x90\\x86\\xd2\\x1b\\x2c\\x1f\\xb5\\x5f\\x86\\x24\\x04\\x00\\x38\\x5a\\xea\\xd2\\xd9\\x1d\\x29\\xce\\x95\\x02\\x01\\x66\\x57\\x8b\\xf9\\x92\\x1a\\xa1\\x1c\\xd4\\x18\\xcf\\x7a\\x56\\x0d\\xa5\\x2c\\x23\\xc5\\x60\\xcd\\xc8\\xde\\x70\\x70\\x9b\\x1f\\x0b\\xb1\\xe3\\xc0\\x54\\x59\\xc4\\x80\\x90\\x02\\xe0\\x18\\xe1\\x55\\x55\\x96\\x41\\xbf\\xc7\\x30\\xc2\\xaa\\x5f\\x6d\\x2a\\xcf\\xdb\\x23\\x59\\x6a\\x02\\xe5\\x21\\xc1\\x19\\x43\\x13\\xa0\\x99\\x43\\x1f\\x07\\xa3\\x2d\\x00\\x79\\x2d\\x37\\xcc\\x00\\x41\\x36\\xa3\\x00\\x5e\\x77\\x6b\\x6d\\x41\\xb0\\xac\\xdc\\x88\\xd5\\x69\\x71\\x42\\xe6\\x85\\xd5\\xc5\\xb6\\x96\\x41\\x83\\x1e\\x80\\x60\\x06\\x62\\x19\\xb0\\x1b\\x0a\\x8d\\xc2\\x08\\xdf\\x60\\xd7\\xbc\\x6e\\x88\\x57\\x4c\\x2d\\x31\\xdf\\x5e\\x50\\xec\\x39\\x28\\xd9\\xce\\x27\\x4f\\xb1\\x58\\xe5\\x64\\x6d\\x90\\x95\\xd5\\x40\\xfe\\x64\\x0f\\x18\\x25\\x10\\x10\\x57\\x74\\x88\\x6a\\xae\\x7d\\xba\\xb0\\x00\\x8e\\xb7\\x90\\xca\\x6f\\x87\\x36\\xc2\\xc7\\xad\\x1a\\x0b\\x50\\x0b\\x4d\\x3a\\x56\\x47\\x72\\x96\\x0b\\xe5\\xd5\\x58\\x97\\xbe\\xcc\\xae\\x14\\xbd\\x1e\\x74\\x68\\xb7\\x80\\xf5\\x18\\xd7\\x7f\\x04\\x41\\xf0\\xd6\\x05\\x2b\\xec\\xd0\\x4f\\x9f\\x2a\\xbd\\x97\\xdf\\x2b\\x97\\x7e\\x3e\\x15\\x7b\\x22\\x9a\\xf3\\x38\\x20\\x31\\x7a\\x37\\x87\\x4c\\x7e\\x36\\x4b\\xd6\\x7c\\x6b\\x91\\x66\\xe7\\x50\\x20\\xf4\\x9f\\x76\\x4a\\x5e\\x59\\x39\\xd5\\x87\\x65\\xce\\x13\\x12\\xb2\\x9c\\x1b\\x45\\x39\\x61\\x9a\\xa4\\x30\\x64\\x45\\x13\\xfa\\x59\\x57\\xfa\\x60\\x98\\x88\\xba\\xc4\\x5d\\x00\\xc7\\x7d\\x5b\\x02\\x81\\xa4\\xeb\\xcf\\x0c\\x4b\\x4c\\xb0\\x76\\xc3\\xf8\\xb8\\x08\\x31\\xfc\\x11\\xba\\x0b\\x7b\\x3d\\x03\\x9c\\x18\\xa3\\xf8\\xf7\\xb8\\xd7\\xee\\xa8\\xf7\\x55\\x35\\x13\\x59\\x63\\x97\\x74\\x7a\\xb1\\xe9\\xd7\\x5d\\xf3\\x3d\\xe8\\x15\\x42\\x5b\\xa0\\x2a\\x60\\xec\\xde\\x8c\\xe2\\xc1\\x5f\\xdd\\xf6\\x32\\xb2\\x18\\x34\\x5d\\xed\\x10\\x7f\\x70\\x6b\\x00\\x39\\xfe\\xf3\\x5d\\xc0\\xae\\xcf\\x49\\xe7\\x5c\\x83\\x73\\x4f\\x69\\x71\\xe0\\x7c\\xc9\\xde\\x6a\\x0f\\xbe\\x98\\xd2\\xa6\\xbd\\xfe\\x54\\xbd\\xfe\\x32\\xce\\x30\\xe1\\x5f\\x0d\\x79\\xb8\\xee\\x10\\x31\\x82\\x5f\\xee\\x20\\x11\\x3f\\xec\\x53\\xb6\\xc2\\x75\\xcb\\x29\\x2d\\xf4\\x4b\\x92\\x82\\x00\\x3e\\x3f\\xd6\\xcb\\x78\\x88\\xf1\\xe1\\xb3\\x04\\x44\\x84\\x03\\x7e\\xf5\\x17\\xe6\\x63\\xcf\\x94\\xe0\\x61\\xb1\\xf8\\xfa\\x5c\\x6d\\xfd\\xc1\\x38\\x41\\x97\\x42\\x41\\xf6\\x05\\x40\\x35\\x00\\xa6\\x64\\x47\\x56\\x04\\xd8\\x9f\\xd0\\xa1\\xc5\\x81\\x4b\\xf1\\x31\\x06\\xce\\x47\\x42\\xe4\\x5e\\x89\\x5b\\x2d\\x50\\x29\\xfb\\x97\\xf6\\xdf\\x09\\x1a\\x63\\x15\\xd0\\x46\\xcf\\x14\\x44\\x90\\x70\\x87\\xa6\\xcd\\x98\\x42\\x96\\x27\\x8f\\x25\\x12\\xc4\\xa5\\x59\\xc4\\xbb\\x7d\\xd6\\xd3\\x0e\\xa0\\x9c\\xdc\\x01\\x3c\\x7a\\x93\\xe7\\xee\\x65\\x0b\\xcc\\x21\\x6e\\x53\\x3f\\x0b\\xde\\xab\\x7c\\xb8\\x2a\\x11\\x9f\\xf2\\xc2\\x7f\\x07\\x93\\xe9\\xa5\\x78\\x08\\x8a\\x50\\x9d\\x83\\x54\\x6a\\x06\\xfc\\x1a\\xc6\\x96\\xd8\\x02\\xd8\\xa8\\x48\\xe4\\x5b\\x50\\xd1\\xe4\\xef\\x7c\\xc4\\x10\\x5f\\xba\\xe3\\xdb\\xb9\\x69\\x70\\x4c\\xd1\\x1b\\x50\\xcd\\x8d\\x00\\x6e\\x05\\xe6\\xc7\\xf0\\x6e\\xaf\\x60\\xea\\xaa\\xdc\\x24\\x0d\\x01\\x54\\x44\\xa7\\x88\\x30\\xe3\\x8a\\x7e\\x0c\\xd1\\x12\\xa5\\xd1\\x34\\xaf\\xca\\xf1\\xba\\x65\\x58\\x0d\\x4f\\x44\\xa4\\xf8\\x3c\\xfe\\x97\\xc3\\x68\\x34\\x90\\xa6\\xb5\\xf2\\x55\\x90\\xbe\\x48\\x3f\\xb0\\xb2\\x49\\x70\\x18\\xe8\\xac\\x74\\x4a\\x59\\xaf\\x61\\x84\\x0c\\x29\\x5a\\xe1\\x00\\xb8\\xcb\\x0f\\x8d\\x1c\\x7c\\x80\\xc4\\x41\\x3e\\xb9\\xed\\x60\\x0a\\x74\\xd2\\x9e\\xdb\\x97\\x43\\xe8\\x2b\\xb8\\x83\\x97\\x11\\x09\\x5d\\x2a\\xc4\\xa7\\x78\\xd5\\xfa\\xec\\x94\\xfb\\x7e\\x42\\x2d\\xb0\\x38\\x94\\x4d\\x95\\x6e\\x82\\x30\\x8d\\x0c\\x85\\x1e\\x0b\\x53\\x22\\x61\\x88\\xd9\\xcf\\xc1\\xf4\\x9b\\x88\\x0b\\x19\\x5e\\xe4\\xd5\\x65\\x28\\x68\\x0f\\x5c\\xef\\x86\\xbb\\xd0\\x86\\xba\\xdb\\x16\\x1f\\x8e\\x26\\x99\\x74\\x69\\xa6\\xe2\\x83\\xf4\\x79\\xa9\\x36\\xe1\\x0a\\x3f\\x36\\x08\\xf8\\xa7\\x70\\x88\\x62\\x1d\\xc6\\xce\\xeb\\xf1\\x97\\xd2\\xa8\\x72\\x1f\\x36\\x2c\\xb4\\x7e\\x10\\x66\\x90\\x3e\\xce\\xd9\\x45\\x29\\xaf\\x21\\x72\\x1c\\xf9\\x28\\x35\\x27\\x52\\xd2\\xb0\\x2d\\x23\\x63\\x5e\\x30\\x89\\x15\\x1f\\x80\\xd9\\xf7\\x0e\\x1f\\x20\\x21\\x0a\\x6e\\x37\\x8a\\x80\\x91\\x4e\\x5b\\x33\\x90\\xa9\\xe2\\x97\\xfa\\xb1\\xcb\\x6c\\x5e\\x0d\\xde\\x14\\xb1\\x06\\xee\\xc9\\x7c\\x41\\x1e\\xa9\\xfa\\x62\\x42\\x47\\x71\\x06\\xba\\x04\\x90\\x0c\\x26\\xfe\\x7f\\x41\\x26\\xf6\\x0d\\x93\\x48\\x64\\xe1\\x42\\xd1\\xe3\\x70\\x13\\x53\\x0e\\xfd\\x32\\x09\\x9e\\xec\\x4b\\xde\\xe5\\xe7\\x71\\x93\\xc3\\x82\\xc2\\xc7\\x4b\\x19\\x38\\xbc\\xfc\\xb9\\x3d\\xbd\\x23\\x94\\x02\\x51\\x47\\xbd\\x87\\x5d\\x08\\x87\\x5f\\xfc\\x43\\xad\\x08\\x90\\xe7\\x46\\x2c\\x39\\x46\\x23\\x11\\x70\\x86\\x73\\x2d\\x3c\\xdd\\x6b\\x1f\\x59\\x4d\\x38\\xa3\\xe2\\x08\\x3c\\xa0\\x40\\x00\\x0c\\x6e\\xf1\\x3a\\xce\\x14\\xfd\\x0b\\x75\\x39\\x83\\xb4\\x68\\x40\\x1a\\xf8\\xf2\\x1d\\x3a\\x4b\\x23\\x10\\xa5\\x4f\\xfe\\x45\\x3a\\x58\\xf1\\x8f\\x77\\x52\\x4d\\x81\\xc4\\x76\\x8d\\xae\\x4c\\xf2\\x54\\xe0\\xd8\\xa4\\xad\\x87\\xdf\\x6c\\x2e\\x49\\x4e\\x8e\\x05\\x73\\x13\\x56\\x1f\\x31\\x64\\xdf\\xce\\xb0\\xc9\\xd4\\x71\\x03\\x9e\\x55\\x84\\x8f\\xdc\\x52\\x0e\\x06\\xb5\\x3c\\x51\\xfe\\x44\\x53\\x6c\\xe7\\xb7\\x91\\x54\\x10\\x94\\x08\\xb8\\xa7\\x03\\xb2\\xee\\xb0\\x4d\\xdd\\x92\\xd0\\x6f\\x4b\\x53\\x19\\x4c\\x4d\\x0b\\x5a\\x59\\x1f\\x0b\\xb0\\xca\\x9e\\xcc\\x3f\\x2d\\xdc\\x33\\x02\\x25\\xb3\\x49\\x5e\\xcf\\x86\\xf1\\x07\\xdf\\xb0\\xaa\\xe8\\xd0\\x81\\xe7\\xfb\\x65\\x24\\xbc\\x7a\\x8c\\x88\\x6c\\x0d\\x80\\x66\\xbc\\x07\\xce\\x3a\\x8a\\x33\\x2a\\x91\\x71\\x2f\\x8c\\x77\\x8e\\x22\\x01\\x85\\x24\\xe1\\x9a\\x76\\x6f\\x88\\x29\\x3f\\x34\\xf5\\x37\\x59\\xfa\\xc5\\x29\\x92\\xa9\\x34\\x0b\\x7e\\x60\\xd4\\xa5\\xaa\\xd1\\x0a\\x90\\xf7\\x20\\xa2\\x66\\x7c\\x19\\xc7\\xde\\xce\\x22\\x11\\x68\\x7f\\xa0\\x74\\xb6\\x44\\x02\\x2f\\x7d\\x27\\x5f\\xf3\\x14\\x92\\x78\\xf8\\x79\\x3c\\xff\\xd8\\xb7\\x36\\xf5\\x97\\xe9\\x1c\\x52\\x71\\xf9\\xdd\\x99\\x6d\\xac\\xad\\x32\\x78\\x2b\\x52\\x67\\x82\\x93\\xdd\\x02\\x52\\x55\\x64\\xf2\\x93\\xc8\\x8c\\x24\\x16\\xab\\xe3\\x71\\x5c\\xdb\\x27\\x3a\\x5c\\x66\\x95\\xba\\x4a\\x58\\x3c\\x0e\\x1f\\x41\\xe1\\xf6\\x9c\\x81\\x22\\x4c\\x83\\xde\\xe5\\xf9\\x60\\x09\\x5a\\x71\\xed\\xc0\\xea\\x51\\x08\\xa3\\xf3\\xa6\\xcc\\x14\\x09\\x10\\xab\\x19\\xa0\\x99\\xd5\\x5a\\x30\\xb0\\x81\\x83\\xf8\\x03\\x5c\\x52\\x99\\x50\\xcb\\x0b\\x70\\x00\\xab\\x98\\x82\\xb4\\x04\\x42\\x00\\xe0\\x68\\xb4\\xfb\\x47\\x31\\x81\\x02\\xc8\\x5e\\x66\\x8c\\xc4\\x42\\x41\\xaa\\xf9\\x04\\xc6\\xd5\\xa2\\xef\\x3b\\xc8\\x83\\x35\\xd6\\x0d\\x00\\x10\\x04\\x5f\\x64\\x89\\x25\\x24\\x57\\x1d\\x3c\\xf4\\x83\\xc1\\x7d\\x18\\xf0\\x48\\x02\\x26\\x52\\xc7\\x23\\xd0\\x90\\x6d\\x0d\\x93\\x21\\x20\\xd9\\x98\\x00\\x39\\xe5\\xc8\\x13\\x95\\xbb\\x0b\\x9a\\x9a\\x42\\xd6\\x28\\x68\\x1d\\x55\\xb9\\x8c\\xf2\\x43\\x75\\xf1\\xb6\\x7a\\xe9\\xc2\\x1c\\xb3\\x2c\\x86\\xdd\\xe0\\x41\\x22\\x5e\\x79\\x39\\x75\\x27\\x0e\\x48\\xc2\\x67\\xf4\\xc9\\x0f\\xe1\\x35\\x12\\xc3\\x04\\xe8\\x97\\xdb\\x4a\\x9a\\x10\\xa0\\x99\\x95\\xc1\\xaa\\xb6\\x4e\\x12\\x44\\x6b\\x32\\xa4\\x61\\xad\\xae\\x19\\x2e\\x2d\\xce\\x0b\\xa1\\xac\\x92\\x50\\x81\\x29\\xde\\x58\\x8e\\xfc\\x88\\x74\\xf2\\x92\\x9a\\xa1\\xc0\\x3a\\x73\\x46\\x01\\xa1\\x51\\x60\\xe7\\xe4\\x8f\\x11\\xab\\x39\\x49\\xc8\\x36\\x56\\x1c\\x79\\xb1\\xed\\xe7\\xea\\x44\\x06\\x04\\x78\\x29\\xbb\\x2b\\x0f\\x81\\xe0\\x2f\\x27\\x38\\x49\\x18\\x93\\x86\\x1c\\x32\\xc1\\x60\\xa0\\x53\\x23\\x8d\\x37\\xe8\\x4a\\x29\\x27\\x22\\x34\\x12\\x60\\x30\\x6c\\xce\\x3b\\x43\\x3f\\xb1\\xe8\\xc9\\x83\\x87\\x15\\xaf\\xa2\\x9d\\x69\\x44\\x41\\x8b\\x94\\x24\\x2c\\x47\\x87\\x9e\\x55\\xd3\\x04\\xd4\\x22\\x11\\x1f\\xa6\\xc4\\x86\\xce\\x25\\xa2\\xa9\\x7a\\x3a\\xf4\\xab\\x22\\xa5\\x2e\\x6b\\x89\\x11\\x4f\\x07\\x76\\x52\\x9e\\xd8\\x31\\x82\\x9e\\xaf\\x63\\x4a\\x3e\\x22\\x8c\\xb1\\x09\\x38\\x26\\xbb\\x32\\x24\\x50\\x0e\\x76\\x86\\x74\\x31\\xa0\\xb1\\x21\\x01\\x06\\x86\\xa6\\x03\\xed\\x70\\x58\\xf5\\x87\\x07\\x65\\x43\\xfe\\xe6\\xb7\\xfc\\xf4\\x2c\\xd1\\x36\\x11\\x0c\\x0f\\x52\\x4c\\x04\\xf1\\x5f\\xc9\\xf2\\xdd\\xac\\x59\\x20\\x1a\\xdc\\x48\\x01\\xce\\x70\\xa1\\xa4\\xe0\\xc9\\xa4\\x34\\xff\\x37\\x20\\x95\\xb0\\x65\\x24\\xd8\\xfb\\x26\\x76\\x1c\\x62\\x00\\xec\\xed\\x48\\xe1\\x53\\x40\\x7d\\xc8\\xdc\\x40\\x29\\x95\\x04\\xa1\\xb0\\x0c\\x3a\\xc3\\x08\\x62\\xe7\\xc8\\xb6\\x9c\\x5f\\xdd\\x0c\\xac\\x92\\x53\\x6e\\x4b\\x93\\xba\\xc8\\xa1\\x62\\xe7\\x62\\x37\\x20\\x11\\x40\\x30\\x1c\\x92\\x0a\\xd0\\xdc\\x36\\x27\\x7f\\xe2\\xb3\\xa0\\x24\\xe3\\x39\\x4f\\xe4\\x0e\\x41\\x39\\x4c\\xc0\\x92\\x16\\x49\\x44\\xb4\\xe5\\x92\\x02\\x63\\xc0\\xb8\\xf9\\x56\\xa9\\x1a\\x01\\x38\\x9e\\x50\\x57\\xa3\\x7f\\xe0\\x8f\\xdc\\x30\\x67\\xfd\\x00\\x75\\x3c\\x9c\\x1f\\x44\\x62\\xd9\\xc5\\xe0\\x62\\xc3\\x93\\xc8\\x6e\\x5f\\x83\\xbf\\x56\\xb3\\x44\\x60\\x87\\xb2\\x18\\x06\\x1e\\xe2\\xc2\\x2e\\xd0\\x7a\\x1d\\xf2\\xec\\xf7\\x47\\x07\\x52\\x85\\xb0\\x9a\\x02\\x0b\\x12\\x8e\\x49\\x59\\x2b\\x51\\x3f\\xc0\\x16\\x88\\x27\\xea\\x86\\x7b\\x08\\x7f\\xe7\\x60\\x80\\x46\\xa7\\x0b\\x91\\x7e\\xca\\x49\\xfd\\x5b\\xa3\\x41\\x9f\\xac\\x00\\x7e\\xc2\\xf7\\x4c\\x4b\\xbc\\x48\\x99\\x2a\\x45\\x8c\\xe6\\x97\\x5e\\x11\\x12\\xe8\\x8a\\x1f\\x41\\x7d\\xf2\\x86\\x31\\xd5\\x0c\\x5e\\x88\\x74\\x6e\\x58\\x28\\x2a\\xda\\x11\\x94\\x81\\x8e\\x4b\\x8f\\x71\\x77\\x66\\x29\\x96\\x0e\\x5e\\x39\\x2d\\x52\\xe4\\xe7\\xf2\\xf5\\x1b\\x52\\xca\\xf3\\xf2\\x28\\xed\\x0e\\xb1\\xd0\\x0e\\x34\\x37\\xad\\xfd\\x29\\x05\\x84\\x74\\x9d\\x95\\xa8\\xdb\\x5b\\x43\\x6c\\x2c\\xb8\\xf1\\x32\\x4d\\xaa\\x28\\x59\\x72\\x61\\xb1\\x1c\\x10\\xb8\\xca\\x63\\xd8\\x17\\xcf\\xcd\\xa8\\x3e\\x6a\\x26\\x08\\xb3\\x66\\x78\\xe2\\x2d\\xfd\\x57\\x79\\x92\\x9d\\x64\\x6b\\xc1\\xdc\\x0c\\x8f\\x64\\xad\\xe5\\x19\\x32\\x12\\x16\\x1e\\x30\\x4d\\x26\\x09\\x04\\x28\\x62\\x93\\x9c\\x45\\xaf\\x35\\x69\\xc4\\xc7\\xac\\x4b\\xd1\\x2c\\xed\\x8c\\x33\\xe4\\x39\\xd2\\x45\\x42\\x5c\\xc3\\x86\\x72\\x51\\x77\\xa9\\x57\\xa1\\xbe\\xf0\\x29\\xe8\\x45\\xaa\\xf4\\x02\\x63\\xd0\\x04\\x57\\x58\\xa2\\x13\\x0f\\x6e\\x29\\x68\\x58\\x5d\\x35\\x04\\x0c\\x9d\\xa1\\xf8\\x0a\\xd5\\xc4\\x43\\x02\\x48\\xf4\\xe1\\xd1\\x08\\xf4\\x9e\\x1e\\xe1\\x57\\x03\\xb0\\x23\\xda\\xbf\\x20\\x25\\xa9\\xa0\\x5d\\x6c\\x1b\\x00\\xcf\\x32\\xde\\xdc\\x63\\x3e\\xd3\\xb8\\x20\\xb9\\xff\\x00\\x13\\x79\\x7b\\x39\\x2c\\x10\\xa8\\xed\\x70\\x4e\\xca\\x57\\x82\\x24\\x54\\xa8\\xfb\\xc0\\x23\\x79\\x76\\xab\\xc3\\xb9\\x9c\\xad\\x3e\\x66\\x6e\\x31\\x1b\\x63\\xf1\\x74\\x40\\xb1\\xa6\\xb4\\xfa\\xd7\\xda\\x9c\\x81\\x3c\\x93\\xf9\\x36\\xdd\\x29\\xb4\\x61\\x06\\x90\\xf9\\x4c\\x1e\\x6b\\x89\\xf4\\x08\\xc7\\xe7\\x06\\xa0\\x37\\x1d\\xfc\\xf9\\x02\\x9a\\xac\\x1c\\xda\\xd6\\x76\\x03\\x42\\x18\\xd8\\xe7\\x65\\xd1\\x4b\\x7a\\xcb\\x97\\x33\\xd7\\x11\\xc6\\x9b\\xf6\\xc4\\x52\\x21\\x53\\x64\\xc9\\xa2\\xcd\\x4e\\x5d\\x08\\x4f\\xe7\\xce\\x8a\\x46\\x57\\x4b\\xa2\\x73\\x21\\xc8\\x31\\x5c\\x18\\xc4\\xcd\\x4e\\x3c\\x73\\x3c\\x72\\xff\\xa6\\xc1\\x2f\\xc4\\x52\\xb5\\x24\\xd0\\x02\\x6b\\x44\\x77\\x7b\\xd5\\xc4\\xbf\\x0b\\x5b\\xdb\\x9d\\xbb\\x1a\\xc2\\x52\\x1f\\xb6\\x7c\\x02\\xd5\\xdc\\x4f\\xcd\\x71\\xae\\x83\\x26\\x5f\\xa7\\xbe\\x2b\\x31\\x93\\xde\\xf2\\xd6\\x1e\\xd4\\x87\\x0b\\x36\\x1a\\x82\\x0b\\xbb\\x78\\xed\\xa7\\x3f\\xfa\\x1d\\x8a\\xfb\\x29\\x2b\\xaa\\xe5\\xca\\x2c\\xdd\\x91\\xc5\\xc0\\xe0\\x58\\x76\\x76\\xb2\\x55\\x76\\xb0\\xa0\\x38\\x5b\\x72\\xd5\\x52\\xe3\\xa1\\x9b\\x8a\\xe7\\x0e\\xf1\\xe9\\xae\\x97\\xe4\\xaf\\x79\\xf9\\x7a\\x17\\x46\\x00\\x64\\x04\\x88\\x80\\xdd\\x38\\x17\\x91\\x92\\x77\\xaf\\xf7\\xa1\\x00\\xb9\\x74\\x37\\xd1\\x1b\\x3c\\xa7\\xbf\\xc7\\x91\\x3f\\x6c\\x81\\x15\\xfc\\xd1\\x3c\\x07\\x89\\x30\\xf3\\x1e\\x74\\x0f\\x63\\x38\\x85\\x2a\\x66\\xa0\\xe8\\x0a\\x02\\x8a\\x86\\x1c\\x27\\x9d\\xae\\xd3\\x00\\x9d\\x9a\\x61\\xd3\\x39\\x12\\x76\\x60\\xf9\\xea\\xd9\\x05\\x38\\x1a\\x60\\x23\\x86\\x19\\x24\\x78\\x10\\xd2\\x11\\xaf\\xb7\\x6a\\xc2\\x9b\\xd6\\x29\\x4e\\x65\\x95\\xc1\\x57\\x43\\x85\\x86\\xc5\\x56\\x2f\\x16\\x87\\xc4\\x5c\\x18\\xa3\\x9c\\x4a\\x9e\\x0c\\x57\\xdb\\xe2\\xb4\\x2b\\x8d\\x7d\\xee\\x0d\\x84\\x98\\xb2\\xb3\\x7b\\x7c\\x33\\x18\\xcb\\x5c\\x79\\x9e\\x52\\x42\\x46\\xcc\\x82\\x64\\x14\\xd6\\xed\\x61\\x40\\x60\\x1c\\xef\\x23\\x22\\xf7\\x13\\x86\\x88\\x0a\\x43\\x03\\xc1\\x69\\x79\\x8e\\xb8\\xf6\\x81\\x88\\x91\\xc5\\x89\\xe2\\x42\\x6c\\x93\\xed\\x5b\\x42\\xcd\\x5e\\xa4\\x94\\x6d\\x99\\x84\\xf7\\xd4\\x82\\x8b\\x7a\\x34\\x97\\x05\\x95\\x32\\x82\\x49\\x4b\\x6a\\x8f\\xf2\\x62\\x02\\xd7\\x3e\\xb1\\x38\\xe1\\xc2\\x30\\x25\\xc2\\xd3\\x16\\x69\\x9c\\x34\\x89\\xe3\\x51\\x86\\x47\\xc3\\xb0\\x85\\xb8\\x5a\\xe8\\x84\\xe9\\xa2\\x44\\xf9\\x8b\\x12\\x07\\xc4\\x02\\x71\\x2d\\x0a\\x4d\\x7a\\x06\\xb2\\x19\\x26\\xf4\\x4f\\xc3\\xa3\\xee\\xf6\\x40\\xd8\\x95\\xed\\xa4\\x93\\x55\\x90\\x06\\x88\\xbd\\x7c\\x24\\x48\\xa4\\xa4\\x0e\\x25\\x7b\\x60\\xc8\\x66\\xe8\\x12\\x78\\x59\\x85\\xb6\\x60\\x56\\xd4\\x0b\\xdc\\x95\\x6c\\x5c\\x0a\\x3b\\x49\\x25\\x98\\xe1\\xdc\\x42\\x87\\x2d\\x6b\\x54\\xa2\\xc7\\x9c\\xa2\\xf7\\x82\\x53\\x02\\xba\\xf2\\xc4\\xae\\xe1\\xa0\\xdb\\x41\\x75\\xfb\\xd8\\x43\\x2d\\x02\\x6b\\x97\\x3d\\xe1\\x44\\x00\\x0c\\x09\\x55\\x95\\x10\\xe3\\x4b\\x9c\\x03\\xfc\\x54\\x8c\\x3d\\x4b\\x38\\x22\\x70\\x87\\x10\\x9f\\xc0\\x42\\x34\\x18\\xda\\x70\\xa4\\xa9\\xc2\\x27\\x5b\\xfd\\xb4\\xac\\x87\\x08\\x61\\x31\\xb7\\x24\\x54\\xc2\\x32\\x09\\x24\\x29\\xfd\\xf9\\xe8\\xf9\\xd5\\x50\\x27\\xd7\\x4a\\x58\\x93\\x61\\xb7\\x26\\x2c\\xc0\\x48\\x6d\\x63\\x77\\xf0\\xe3\\x26\\xb5\\x80\\x8b\\x6e\\x62\\x7d\\x1f\\xc4\\x04\\x80\\xa0\\x71\\xfa\\x22\\x83\\xc5\\xab\\x2a\\xae\\x51\\x31\\x91\\x6a\\x3f\\x6e\\x1c\\x1d\\xa4\\x34\\xc1\\x75\\x6c\\x5d\\xce\\xae\\x16\\x26\\xcb\\x6f\\x9f\\xc8\\xc0\\x27\\xf8\\x3f\\x9d\\x11\\x7c\\x6f\\x75\\xe6\\xb9\\x29\\xa4\\x92\\xea\\x13\\xde\\x4a\\x57\\x23\\x9a\\x7e\\x80\\xf5\\x09\\x80\\x75\\x09\\xc0\\x97\\x03\\xc4\\x6c\\x46\\xca\\x90\\xba\\x58\\x48\\x9e\\x36\\x15\\x37\\xec\\x85\\x85\\xcc\\x05\\xfb\\xde\\x0c\\x52\\xf3\\x3e\\x90\\xf8\\xa6\\xab\\xc5\\x69\\xd1\\x88\\x48\\x37\\x9d\\x57\\x7e\\x4a\\x32\\x10\\x6e\\x19\\x5c\\x19\\x24\\x56\\x85\\xce\\x9a\\x1c\\xd5\\xb7\\xe9\\x0b\\x8c\\x52\\xf2\\x54\\x85\\xb2\\x39\\x28\\x0e\\x92\\xa4\\xc4\\xce\\x84\\x8a\\x97\\xd6\\x5f\\xc8\\x6f\\xaa\\x60\\xc0\\x25\\x53\\x2a\\xd9\\x01\\x20\\xb4\\xf9\\x73\\xac\\x28\\x60\\xe8\\x8c\\x94\\x58\\xbd\\x8c\\xd4\\x8e\\xe3\\xb0\\xf8\\x4c\\xab\\x26\\xc4\\x72\\x93\\x1d\\xe9\\x3e\\x31\\x91\\x63\\x0d\\x90\\x8f\\xb5\\xf3\\xd8\\x33\\x6b\\x81\\x10\\xad\\xd1\\x69\\xe5\\x8b\\x37\\x23\\xde\\xe4\\x2e\\x78\\x83\\x1f\\xa2\\x72\\xc1\\xf7\\x07\\x0c\\x01\\xd4\\xc0\\xc5\\x0a\\x4d\\xa5\\x85\\x40\\x68\\x95\\xa1\\x2b\\x71\\x82\\x17\\x84\\xb4\\x2a\\x3e\\xf7\\x55\\x02\\x86\\x3c\\xa8\\x96\\x9e\\x27\\xdc\\x8a\\xf2\\x8f\\x19\\xf1\\x44\\x30\\xed\\xc3\\x66\\xa3\\xf7\\xf6\\x24\\xb4\\x3c\\xcd\\x55\\x58\\x42\\xb4\\xa9\\x9e\\xd9\\x52\\xf9\\xb8\\xb3\\x1c\\xc3\\x62\\xf6\\xd5\\xcf\\xf5\\x3f\\x08\\x10\\xae\\xd1\\xbb\\xa6\\xd4\\x80\\x5b\\x8e\\x1b\\x08\\x50\\x7d\\xf5\\x3e\\xe9\\xd8\\x35\\x12\\x25\\x9c\\xa8\\x2c\\x87\\x93\\xaa\\xc2\\xf7\\xbe\\x5b\\x0e\\xba\\xa2\\x96\\x02\\x98\\x44\\xed\\xb7\\x18\\x48\\x1d\\x2d\\xb7\\x4b\\xc3\\xdb\\x13\\x74\\xad\\x85\\x09\\x39\\xfa\\xb7\\xea\\x1f\\x07\\xc4\\x89\\xa0\\xca\\x4b\\x8e\\x81\\x45\\x40\\x71\\x78\\xbe\\x5c\\x0e\\x9e\\x78\\xc9\\xd9\\xfd\\xd1\\x58\\x3c\\x48\\x1a\\xa1\\x78\\xdc\\xd9\\x1c\\xb1\\x12\\xca\\x02\\x0a\\x5e\\x5e\\xd7\\x86\\xf8\\x0f\\x53\\xe7\\x6c\\x79\\x09\\x49\\x64\\x40\\x7e\\x71\\x78\\x60\\x38\\xe8\\x59\\x10\\x62\\x56\\x38\\x19\\xc5\\x93\\xce\\x2d\\x89\\x48\\xe2\\x1b\\x83\\x68\\x7c\\x84\\x0a\\x5d\\x69\\x28\\x88\\x66\\x67\\x78\\x5b\\x80\\xe1\\x7a\\x42\\xf5\\xf6\\x14\\x74\\x44\\x03\\x35\\x8a\\x9c\\xc6\\x10\\x24\\x3e\\xe9\\x73\\x5d\\xe0\\xa6\\x8c\\xe6\\x2f\\x14\\xb3\\x04\\xf3\\xa4\\x88\\x06\\x54\\xcd\\x99\\x6d\\x6d\\xb2\\x51\\x95\\x27\\x70\\xb9\\x16\\x7c\\xbc\\x1c\\x29\\x1a\\x86\\x72\\xaf\\x6f\\x51\\xd9\\x88\\x2c\\xff\\x62\\x82\\x01\\xf7\\x25\\xac\\xd6\\xf6\\x89\\x09\\xa5\\x4f\\xcf\\x45\\x68\\x10\\xd7\\xb9\\x72\\x40\\x21\\x92\\xe5\\xf6\\x21\\x17\\x9d\\xc1\\x1c\\xe7\\x86\\xb6\\x8a\\x01\\x62\\xe0\\x97\\x50\\xf5\\x31\\xe7\\x00\\x83\\x4a\\xe0\\xfe\\x11\\x93\\x97\\xa2\\xfc\\x76\\x44\\xaf\\xfa\\x9c\\xb8\\x24\\xb2\\x9a\\xc4\\x48\\x68\\x14\\xe8\\x01\\x3d\\x3c\\x9a\\x05\\x3b\\xad\\x67\\x28\\x00\\xa4\\xb1\\xd0\\xa4\\x81\\xec\\xae\\x72\\xb5\\xa1\\xd8\\x6f\\x6a\\x3a\\x87\\xec\\x37\\xd3\\x3c\\x09\\x11\\x08\\x94\\x96\\x52\\xb4\\x94\\xa7\\x23\\x4b\\x11\\x70\\x9c\\x03\\x00\\x23\\x69\\xf4\\x38\\x43\\x2b\\x80\\xa4\\x75\\xb4\\xa5\\x01\\x1d\\xb4\\xcf\\xd5\\xe6\\xeb\\x92\\x11\\xbd\\x5a\\x41\\xf5\\x7b\\xc5\\x9e\\x5b\\xd9\\xe2\\x0a\\x50\\x55\\x89\\xe1\\x90\\xa0\\x83\\x5b\\x01\\x55\\x62\\x11\\x3a\\x33\\x6f\\xd8\\x3d\\x00\\x0c\\xb0\\x4f\\xa7\\x25\\xe3\\x48\\x32\\x3c\\x9e\\x57\\x94\\xca\\xef\\xc9\\xa1\\x21\\xf4\\x54\\xd5\\x7f\\x0f\\xba\\x75\\x55\\x93\\x1d\\xae\\x19\\x7b\\x6b\\x3b\\x10\\x38\\x14\\xeb\\x06\\x84\\x59\\x70\\xc0\\xf8\\x59\\xa4\\xba\\xd9\\x37\\xed\\xf9\\xb2\\xc4\\xc3\\x04\\x40\\x99\\x80\\x9b\\x6d\\x5d\\x69\\xbf\\x33\\x53\\x5d\\xae\\x5e\\x0e\\xcc\\x33\\x87\\x52\\x78\\x55\\xa0\\x31\\xd6\\xcc\\xd7\\xde\\x02\\x6a\\xb0\\xac\\xc3\\x81\\x8e\\xe6\\x2d\\x4c\\x4a\\x57\\xc6\\x83\\x90\\x61\\xed\\xf3\\x51\\x17\\xeb\\xa8\\x93\\x5f\\xdd\\x16\\xbf\\x26\\xe9\\xf0\\x74\\x14\\x62\\x7e\\xc1\\xb3\\xc4\\xc3\\x89\\xc1\\x24\\x11\\xf8\\x4e\\x62\\x65\\x39\\xac\\x80\\x66\\x01\\x8f\\x8e\\x98\\x2b\\x17\\xa7\\xdf\\x95\\x18\\x29\\xd5\\x08\\x4c\\xff\\x3c\\x5b\\x78\\xfc\\xf1\\x6b\\x8d\\x35\\x56\\x4b\\xb4\\xcd\\x28\\xf4\\xf3\\xe1\\xa3\\xeb\\xca\\xe3\\xdf\\x21\\xeb\\xc7\\x27\\x82\\xfe\\xc4\\x68\\xf9\\x81\\xeb\\xc3\\x84\\xfe\\x23\\x7a\\x14\\x34\\x06\\x70\\x3b\\xa6\\x96\\x16\\xe0\\x96\\xf6\\x13\\x5c\\xad\\x60\\x2a\\xfe\\x8b\\xa7\\xbd\\x24\\x6a\\x5c\\x87\\xf3\\xc0\\xb8\\xee\\xb2\\x20\\xc8\\x5d\\xba\\x75\\x44\\x1f\\x19\\x57\\xb1\\x11\\x07\\x00\\xbc\\xbb\\x51\\xad\\xc5\\x44\\x0b\\x5c\\x95\\x8f\\x34\\x13\\xda\\xe9\\x42\\x3e\\x22\\xb7\\xed\\xe9\\xe6\\xc2\\x27\\xe6\\x98\\x03\\xfc\\x0d\\x80\\xef\\xbb\\xd5\\x78\\x95\\x2f\\x06\\x6b\\x7d\\x6c\\x33\\x87\\x6a\\x79\\xaf\\xad\\x86\\x70\\x45\\x27\\xbd\\x40\\x06\\x55\\x89\\xc4\\x49\\xc7\\x3a\\x17\\x87\\x7e\\x46\\xf9\\xdb\\xd0\\x8d\\xad\\xd6\\xa0\\x55\\x06\\xc0\\x3a\\x14\\x00\\x11\\x90\\x63\\x91\\x81\\x82\\x23\\x6f\\xee\\x2f\\xa2\\x76\\x5e\\x1b\\x62\\xc6\\xc1\\xaf\\x2e\\x25\\xd1\\x24\\x4d\\xe1\\x72\\xa1\\x5b\\xec\\x7b\\x5b\\xf0\\xbc\\x3f\\xd2\\xb6\\x16\\xbe\\x8d\\x6d\\x3d\\x82\\xfe\\xed\\x17\\x90\\x23\\x96\\xef\\x15\\xa0\\xde\\x75\\xd5\\xd2\\xfd\\xb7\\x80\\x56\\x1b\\x14\\x25\\xfd\\xb0\\x07\\x44\\xf7\\x6e\\x29\\xed\\xe5\\x01\\x2e\\xe5\\x6c\\x38\\x9c\\xf7\\x12\\x61\\xb4\\xf1\\xae\\x5c\\xa8\\x0b\\x6d\\xd8\\x47\\x9d\\x65\\x62\\xc2\\x22\\x21\\x51\\x63\\x83\\x2c\\x23\\xfe\\xe4\\x95\\xf0\\x8a\\x94\\x0c\\xc9\\x08\\x97\\x1b\\x0a\\x68\\xd6\\x74\\xe9\\x36\\xdd\\xfc\\xcb\\xf6\\xd5\\x82\\x20\\x2a\\x47\\x97\\x42\\x27\\x6e\\x0f\\x77\\xac\\x75\\x84\\x63\\x98\\xae\\x52\\x84\\x7a\\xdc\\xa6\\xd5\\xcc\\x77\\x69\\xc9\\x57\\xe1\\x12\\x3b\\x99\\x12\\x64\\x54\\x7d\\x8e\\x08\\x0f\\x71\\x71\\x50\\xf3\\x1c\\x31\\x01\\x64\\x73\\x86\\xa4\\x35\\x56\\xf5\\x65\\x63\\x1f\\x1e\\xc8\\xcb\\x92\\x49\\xe2\\x8c\\x25\\x9e\\x27\\x43\\xc9\\x2a\\x8f\\x27\\x90\\xa6\\x25\\xea\\xe2\\x93\\xc6\\x5f\\x84\\x68\\x80\\xd5\\xd0\\x80\\xdd\\x9e\\x4d\\x12\\x4d\\x79\\x61\\x18\\x91\\x27\\x9e\\xc7\\x85\\x14\\x6d\\xc5\\x8d\\x3c\\x32\\xe1\\x1f\\x11\\x39\\x21\\xb4\\x8f\\x9b\\xd8\\xb9\\x68\\x46\\x70\\xaf\\x59\\x75\\xa0\\x93\\x81\\x68\\x46\\x56\\x50\\xc5\\x22\\xc4\\x23\\x0a\\xa7\\x0c\\x17\\x9c\\x30\\x34\\xc1\\x04\\xfc\\x24\\xfa\\xe0\\x45\\xb0\\xd0\\x7a\\xc2\\x31\\xe2\\xc4\\xcd\\x44\\xb2\\xfd\\xd6\\xa5\\xf8\\xa7\\x91\\xc6\\x4f\\x2f\\x92\\x10\\x05\\xf7\\xa9\\xdd\\x4b\\xf2\\x55\\x43\\x64\\xe5\\x2f\\xcd\\xd0\\xa4\\x19\\x54\\x7d\\x2a\\xe9\\x7e\\x80\\xda\\xdf\\x77\\x1c\\x16\\x91\\x87\\x43\\x56\\xd1\\x98\\x2b\\x43\\x8f\\xb5\\x04\\xe1\\xe2\\x9d\\xab\\x1b\\xda\\x1f\\xea\\x7e\\x0f\\xb6\\x96\\x10\\x44\\x19\\xe2\\x87\\x81\\x6e\\x31\\x42\\xf9\\x6d\\x29\\x76\\x34\\x5d\\xd6\\x01\\xa0\\xec\\xd8\\xe6\\xe3\\xc3\\x21\\x4d\\x6f\\xc6\\x84\\x41\\xd7\\xa6\\x21\\x8e\\x50\\x88\\x3d\\x39\\xeb\\xd7\\x4f\\x28\\x64\\x77\\x12\\x29\\x08\\x09\\x79\\x18\\x0f\\x63\\xf2\\x78\\x42\\x48\\xbe\\xd8\\x0a\\x87\\xe5\\xe0\\x93\\x96\\x0e\\x71\\x68\\x5b\\x43\\x89\\x08\\xe8\\x4c\\x66\\xce\\xb2\\x4f\\xc9\\x1c\\x66\\xf5\\x90\\x23\\x9e\\x0d\\x4d\\xa0\\xcc\\xcc\\xdd\\x44\\x88\\xaa\\xb2\\x2b\\x52\\x54\\x40\\xb2\\xe5\\x99\\x99\\xe8\\xf9\\x09\\x7a\\x98\\x86\\x43\\xcd\\x96\\x48\\x07\\xb9\\x65\\x44\\x56\\xcb\\x09\\x00\\x49\\xe4\\xfd\\x4e\\x29\\x11\\x35\\x44\\x2d\\x83\\x0f\\xcf\\xc5\\x48\\x12\\x85\\x01\\xb8\\x20\\xc3\\x70\\x2f\\x01\\xe3\\xd0\\xf4\\xd8\\x49\\x91\\x6f\\x1f\\x01\\x32\\xa3\\x53\\xed\\x90\\x7a\\xfd\\xd4\\x38\\x50\\x18\\xfb\\x43\\x84\\x42\\x3a\\xc5\\xdc\\x4d\\xaf\\xee\\x05\\x58\\xcb\\x12\\xc7\\x1f\\x99\\x80\\x8b\\xee\\x10\\x4f\\x25\\x47\\x40\\x54\\x7f\\x17\\xd6\\x6b\\xc4\\x87\\x81\\x49\\xcd\\x21\\x1e\\xa0\\x3f\\x51\\x52\\x0d\\x54\\x54\\xa4\\xb1\\x1a\\xfe\\x54\\x10\\x11\\xd4\\xeb\\x18\\xa9\\xb0\\xbe\\x2d\\xf4\\xb8\\x35\\x17\\x81\\x40\\xc7\\x0a\\x6d\\x04\\xa2\\x17\\x02\\x15\\x9c\\x4b\\x5a\\x8a\\x3d\\x0b\\x89\\x6e\\x4c\\xb3\\x22\\x11\\x9d\\x10\\x66\\xb9\\x91\\x3f\\x5f\\x12\\xe0\\x28\\x92\\x58\\xa5\\xff\\xdd\\x06\\xd0\\xa2\\x52\\xac\\xd5\\x22\\xa0\\x2c\\x2d\\xb2\\x17\\xd3\\x38\\x33\\x8d\\xf5\\xbc\\x9a\\xc5\\x99\\x36\\x90\\x7b\\xa4\\x8f\\xd3\\x57\\x3e\\x92\\x42\\xdb\\x17\\xe0\\xfb\\x72\\x7a\\xb6\\x2c\\x4a\\x51\\x8d\\x90\\xe2\\x05\\x06\\x1c\\x77\\x01\\xe1\\x2c\\x09\\x3d\\xb8\\x30\\x49\\xfc\\x5e\\x7d\\x83\\x03\\x24\\xb3\\x8c\\x5a\\x76\\x30\\x04\\xe1\\x36\\x3e\\x0c\\xc1\\xc6\\x07\\x00\\x16\\xd2\\x0b\\x8f\\x9d\\x12\\x78\\xa2\\x6c\\x6e\\x00\\xe0\\x52\\x1f\\xdb\\xe8\\x23\\x86\\xb7\\x7c\\x42\\x8a\\x43\\x84\\xc7\\x3f\\xcd\\x25\\x3d\\x76\\x43\\x54\\x1d\\x36\\x9b\\xa9\\x4d\\x9d\\x78\\x46\\xb0\\xc6\\x39\\x6c\\x01\\x3a\\x8a\\xf2\\x63\\x30\\xa3\\x0c\\xb6\\xdc\\x1c\\x97\\xce\\x89\\x5f\\xd7\\xd1\\xb5\\xdd\\xb2\\x1a\\x91\\x43\\xa7\\x5e\\x89\\x18\\x37\\x95\\x06\\xda\\x68\\xab\\xfc\\x4d\\x9b\\x0e\\x97\\x98\\xc0\\x45\\x35\\x91\\xab\\xaf\\x38\\x1f\\x08\\x83\\x61\\xa3\\x96\\x62\\x10\\xe7\\x8c\\xc8\\x89\\x00\\xcc\\x94\\x8a\\x66\\x79\\x5c\\x3a\\xf2\\x01\\xe1\\x84\\xbf\\x49\\x2b\\xa4\\x80\\x63\\x63\\xe4\\x15\\x79\\x95\\x07\\x83\\xa2\\x92\\x65\\xe0\\x24\\x0c\\x58\\x84\\xe7\\x0e\\x9c\\xeb\\xe9\\x4b\\x5b\\xd7\\xf6\\x1d\\x58\\x04\\xea\\xb6\\xb6\\x36\\x72\\x31\\xb4\\x70\\x1b\\xc3\\x8f\\xb5\\x7b\\xe4\\xe3\\xc5\\x00\\xf2\\x17\\xc4\\x98\\x3d\\x3d\\x43\\x70\\xc5\\xc6\\xeb\\x4f\\x11\\x99\\xde\\xd7\\xa9\\xec\\xd6\\xb7\\xb4\\x92\\x9a\\xc3\\x71\\x4b\\x1e\\x98\\xe5\\xb0\\xb3\\x68\\xcc\\xdf\\x94\\x4e\\x61\\x33\\x35\\x39\\x09\\xfd\\x73\\xc8\\x93\\xc0\\xac\\xf3\\x13\\x81\\x04\\xcc\\xc4\\x79\\x38\\x38\\xbc\\x86\\xe6\\x68\\x3c\\x6f\\xda\\x01\\x7f\\xb8\\xd4\\x48\\x98\\x3b\\x12\\x4a\\x40\\x5a\\x61\\x02\\x3e\\x64\\x98\\x80\\x09\\x79\\xfd\\x06\\xa7\\xd1\\x89\\x89\\x5c\\xff\\x26\\x4e\\x4d\\x62\\x60\\x22\\xba\\xb9\\x5f\\xbc\\x49\\x34\\xdc\\xa9\\xe4\\x44\\xea\\x2a\\x85\\xc1\\xc1\\xba\\x46\\x0a\\xd2\\xf7\\xc6\\xbd\\x5a\\x2a\\xdc\\x63\\xdc\\x64\\xc6\\xa2\\x31\\x31\\x91\\x2b\\x1f\\x15\\x41\\x23\\x66\\x64\\x08\\x32\\x16\\x6f\\x13\\x93\\x60\\xb8\\xf4\\x35\\xaf\\x87\\x33\\x0c\\xda\\x98\\xab\\xc8\\xf7\\x14\\x57\\x4e\\xb6\\x2e\\xa1\\x0c\\xb3\\xbf\\x1d\\x8a\\x25\\xeb\\xda\\x17\\x47\\xcb\\x88\\x40\\xf8\\xbf\\x10\\x85\\x4f\\x40\\x2c\\xc7\\x2e\\xa0\\x16\\x1b\\x42\\x70\\x00\\x8c\\xd4\\xd6\\xb4\\x2f\\x45\\x67\\x66\\x2e\\xa9\\x51\\x28\\x3b\\x7a\\xc1\\xf9\\x05\\x81\\x66\\x39\\xb3\\xb7\\x1d\\xd9\\xb8\\x17\\x2c\\xc7\\x39\\xc7\\xcc\\xae\\xe0\\x5a\\x1f\\x22\\x2f\\x9e\\x38\\x48\\xb2\\x01\\x14\\x34\\x20\\x44\\x59\\xde\\x3a\\xe8\\x2c\\x07\\x6d\\xf2\\x7d\\x48\\xbf\\x40\\xfa\\xe1\\xaa\\x50\\x1b\\x2e\\x1d\\x69\\x13\\xa9\\xa2\\x5d\\xc4\\x7d\\x06\\x2e\\x71\\x69\\x2a\\x09\\xe8\\x77\\x2f\\xbf\\x22\\x55\\xc2\\x0e\\x9c\\x9d\\x1c\\x78\\x41\\xe2\\x89\\xba\\xd2\\x39\\xc4\\x49\\x31\\x24\\xcb\\x1e\\x14\\xce\\xc9\\x53\\x72\\x4b\\xad\\x8a\\xae\\xeb\\x5d\\x75\\x91\\x89\\x62\\x87\\x45\\xfb\\x7b\\x21\\x33\\x62\\x54\\xc9\\xe9\\x70\\x3b\\xfe\\x13\\x01\\x15\\xcd\\x9b\\x6e\\xda\\xfa\\x88\\x67\\xf8\\xa5\\xeb\\x27\\x44\\xa0\\x58\\x12\\xe9\\xe5\\x4b\\x0b\\xc6\\x60\\x95\\xdd\\x98\\x8f\\xb7\\xb1\\x90\\xbd\\xbb\\xa5\\x6b\\x02\\x34\\xe6\\x55\\xc0\\xc4\\xca\\x7e\\x1c\\x5f\\x8e\\x25\\x56\\xd9\\xd4\\x0b\\x6c\\x14\\xa7\\x26\\x0f\\x61\\xf7\\xc4\\x7c\\x80\\x4b\\xa4\\x90\\xe4\\x2c\\x6e\\x9a\\x04\\xf1\\xed\\x2e\\xa7\\x41\\x46\\xda\\x97\\x33\\xc0\\xa5\\xf5\\x7c\\x67\\xc0\\x07\\x51\\xec\\xfb\\xea\\x2c\\xf8\\x31\\xc6\\x22\\x88\\x82\\xa9\\x08\\x31\\xd8\\x9b\\xa4\\xf6\\x77\\xd5\\x3d\\x3b\\x36\\xfa\\x06\\x84\\x1e\\xdf\\x4a\\xd0\\x64\\x96\\x5d\\x0d\\xcc\\x2f\\x0b\\x49\\xdf\\x32\\x2c\\x36\\x0e\\x41\\x68\\x10\\x95\\x21\\x6a\\xd6\\xe5\\x76\\x2b\\xa3\\xcd\\x17\\x61\\x24\\x12\\x85\\x42\\x99\\x4b\\x0b\\x3f\\x66\\xcd\\x55\\xad\\x55\\xd8\\x6d\\x32\\x04\\x19\\x42\\x97\\x61\\xa2\\xa8\\xce\\x08\\x4d\\x88\\xf7\\x8c\\xa6\\xc6\\xb6\\x1a\\x36\\x62\\x23\\xd4\\x93\\x0f\\x95\\x9c\\x4e\\xe4\\x8e\\x0f\\xd8\\x82\\x32\\x25\\xf9\\x43\\x20\\x80\\x48\\x64\\x10\\x09\\xc3\\x10\\xa0\\x13\\xd4\\x47\\x37\\xe8\\xdc\\x37\\x5f\\x0d\\xdd\\xad\\x86\\xbc\\xef\\xd1\\x9e\\xb7\\xa2\\x1d\\xc9\\x2d\\x10\\xc1\\xde\\x9b\\x7a\\xd1\\xa6\\x3f\\x21\\xaf\\xa9\\x57\\xaa\\x74\\xa2\\xd1\\xae\\x88\\x8b\\x99\\x1c\\xbd\\x58\\x90\\x18\\xc1\\xd6\\x8c\\xf4\\x1a\\xd8\\x76\\x66\\xae\\x03\\xcf\\x93\\x95\\xa1\\xd5\\xca\\x26\\x20\\x01\\x00\\x00\\xff\\xff\\xb5\\x8e\\x0e\\x07\\x1e\\x62\\x00\\x00\")\n\nfunc fontsRobotoslabBoldWebfontEotBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoslabBoldWebfontEot,\n\t\t\"fonts/robotoslab-bold-webfont.eot\",\n\t)\n}\n\nfunc fontsRobotoslabBoldWebfontEot() (*asset, error) {\n\tbytes, err := fontsRobotoslabBoldWebfontEotBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/robotoslab-bold-webfont.eot\", size: 25118, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoslabBoldWebfontSvg = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xbd\\xe9\\x7e\\x24\\xc7\\x91\\x27\\xf8\\x79\\xfa\\x29\\x7c\\x4a\\xbb\\xbd\\x17\\x1c\\x74\\x33\\xbf\\x47\\xa2\\x7a\\xd9\\x12\\x47\\x3b\\x92\\xd0\\xa4\\xba\\x29\\x52\\xd4\\xec\\xec\\x6c\\x1d\\x28\\x06\\x57\\xa1\\x2a\\x46\\x55\\x30\\x44\\x61\\x8f\\x67\\xdf\\x9f\\xfd\\xcd\\x23\\x91\\x80\\x67\\x24\\x12\\x28\\xf0\\x18\\x4a\\x5f\\xaa\\x02\\x19\\x1e\\x7e\\x9a\\xdb\\x7d\\xfc\\xec\\x9f\\xbe\\xf9\\xf3\\x68\\x96\\xcb\\x37\\x6f\\xbf\\x7c\\xfd\\xea\\xfd\\x27\\x74\\xee\\x9e\\x98\\xb7\\xf3\\xd3\\x57\\x2f\\x9e\\x8e\\xaf\\x5f\\x5d\\xbe\\xff\\xe4\\xd5\\xeb\\x27\\xff\\xf4\\xf3\\x7f\\xf8\\xd9\\xbf\\xff\\xe5\\x47\\xbf\\xf8\\xe4\\xf3\\x8f\\x3f\\x34\\x6f\\x97\\x2f\\xcc\\xc7\\xbf\\xff\\xe7\\xdf\\xfe\\xa7\\x5f\\x98\\x27\\xf6\\xbd\\xf7\\x3e\\xf3\\xbf\\x78\\xef\\xbd\\x5f\\x7e\\xf2\\x4b\\xf3\\x6f\\x9f\\xfe\\xca\\xd0\\x39\\xbd\\xf7\\xde\\x87\\xff\\xf2\\xc4\\x3c\\x19\\xe6\\xf9\\xab\\xff\\xf0\\xde\\x7b\\x7f\\xf9\\xcb\\x5f\\xce\\xff\\xe2\\xcf\\x5f\\xbf\\xf9\\xe2\\xbd\\x5f\\xbd\\x79\\xfa\\xd5\\xf0\\xe5\\xf3\\xb7\\xef\\xfd\\xdb\\xa7\\xbf\\x7a\\x4f\\x1a\\xfe\\xf2\\x93\\x5f\\xbe\\xf7\\x76\\xf9\\x82\\xe8\\xfc\\xc5\\xfc\\xe2\\x89\\xf9\\xf9\\x3f\\xfc\\x4c\\xba\\xfe\\xe6\\xcf\\xe3\\xab\\xb7\\xef\\x1f\\xf8\\x9e\\x9d\\x73\\xd2\\xfe\\xc9\\xcf\\xff\\xe1\\x67\\x7f\\xbe\\x9c\\x9f\\xbe\\x78\\x3a\\x3f\\xfd\\xf9\\xcf\\xde\\xdb\\x3d\\xfe\\xc3\\xcf\\x5e\\x5c\\xbe\\x7c\\xfb\\xf3\\x7f\\xf8\\xd9\\xcb\\xd7\\xaf\\x66\\xf3\\xe5\\x8b\\xf7\\x9f\\xbc\\x79\\xfd\\xec\\xf5\\xfc\\xfa\\xbf\\xbe\\x1d\\x9f\\x3e\\x7b\\xf6\\x7a\\x7c\\xf1\\xc4\\x0c\\xaf\\xdf\\x7c\\x79\\x65\\x9f\\xbe\\x58\\xec\\x37\\xef\\x3f\\xa1\\x90\\x09\\xa3\\x4a\\x7b\\xfb\\xf2\\xe9\\xf3\\x4b\\xf3\\xf5\\xab\\x2f\\xe7\\xb7\\xf6\\xab\\xcb\\x37\\xf6\\xf2\\xcf\\xef\\x3f\\x61\\x17\\xca\\x13\\xf3\\xf4\\xed\\xf3\\xcb\\x57\\xf3\\xfb\\x4f\\x28\\xf9\\xf2\\xc4\\xbc\\xb8\\x6c\\x7f\\xda\\x40\\xee\\x89\\x79\\x4f\\xe6\\xf2\\xe5\\xdb\\xb7\\x5f\\xbe\\xfa\\xc2\\x7e\\x31\\xfe\\xf5\\xab\\xe1\\xe6\\x10\\xd1\\xb1\\xb6\\xd1\\x77\\x5f\\xbf\\xfa\\xf2\\xf9\\xeb\\x17\\x97\\xef\\x3f\\xf9\\xc7\\x9f\\x7c\\xf3\\xf2\\x99\\xa3\\x9f\\xde\\x9e\\x91\\xf7\\xf9\\x89\\x79\\xf1\\xfe\\x93\\x0b\\x1f\\x4c\\xc9\\x79\\x61\\x17\\x07\\x4a\\xb4\\xe4\\x30\\x39\\xc3\\x2e\\x18\\xe2\\x70\\x1e\\x8d\\xa7\\x70\\x1e\\x67\\x1f\\xdd\\x79\\x34\\x44\\xee\\x3c\\x4e\\xb9\\x18\\x67\\x28\\x06\\x63\\x29\\x9e\\xc7\\x99\\x72\\x32\\x36\\x84\\xf3\\x38\\xda\\xc0\\xc6\\xb2\\x77\\x93\\xcd\\xde\\x30\\x1b\\x4b\\x9e\\xa5\\x87\\x30\\x5b\\xf2\\x49\\xbe\\xe7\\xc9\\x92\\x23\\xe3\\xe4\\x53\\x3a\\x8f\\xc6\\x86\\x34\\x5b\\x74\\x6d\\xc9\\xc7\\xc5\\xe6\\x30\\xa4\\x98\\x16\\x5b\\x72\\x1e\\x29\\x46\\x63\\xbd\\x5b\\x2c\\xe5\\x38\\xd8\\x58\\xca\\x42\\x39\\x8e\\x14\\xc8\\x78\\xb7\\xa4\\xcc\\x83\\xf5\\x29\\x2c\\x36\\x65\\xc6\\x8f\\xfb\\x4d\\xab\\x36\\x8d\\x69\\xd7\\x94\\x12\\x5d\\x1d\\xd9\\x1d\\xee\\x76\\x27\\x30\\xb5\\xdd\\xa9\\xc6\\xf5\\xdd\\xf9\\xa4\\xfb\\xe5\\xd3\\x12\\xb2\\xec\\x17\\x65\\x43\\x9e\\x8c\\xf7\\xd8\\xad\\x54\\x0d\\x51\\x3e\\x8f\\x53\\x49\\xb2\\x57\\xd9\\xad\\x7b\\x55\\xa3\\xee\\xd5\\x40\\x99\\x17\\x4b\\x9e\\xd2\\xed\\xc9\\xe7\\xb0\\xbf\\x4e\\x22\\xaa\\x93\\x8d\\xb2\\x75\\xc6\\x92\\xab\\x86\\xea\\x6c\\x89\\xb2\\xc9\\x93\\x25\\xf2\\xd8\\x49\\xe9\\x3d\\xca\\x3e\\x66\\x63\\x29\\xc5\\xc5\\x86\\x3c\\x70\\x70\\x8b\\x95\\x19\\x5a\\x3c\\x1d\\xdc\\xa4\\x1b\\x1b\\x72\\x63\\xf5\\x0a\\x8c\\x27\\xbe\\xdc\\xdf\\xca\\x17\\xb7\\xf7\\xf1\\x16\\x50\\xde\\xec\\x88\\xe3\\x56\\x3f\\xf5\\x76\\x3f\\xee\\x60\\x4b\\xf3\\xc4\\x9c\\x7c\\x07\\x5c\\xd7\\xe7\\x91\\xc6\\x4f\\xdd\\xa9\\x8d\\xff\\x7d\\xd7\\xae\\xdd\\x2a\\x22\\x01\\x1c\\x8e\\x69\\xe0\\xca\\x8b\\x95\\x07\\xcb\\x95\\xaf\\xf0\\x22\\x3a\\x5e\\x6a\\x0c\\xfa\\x4a\\x1e\\xf0\\x6a\\x6b\\x36\\xdc\\x81\\x67\\x2e\\xdc\\x46\\x09\\xce\\x90\\xf3\\x75\\x89\\x4c\\x03\\xbb\\xb4\\x58\\xce\\x3c\\xda\\x9c\\x8d\\xe5\\x50\\x07\\x4b\\x5c\\xaf\\x2e\\x42\\xca\\xfb\\x8d\\x62\\xdf\\xa8\\x1c\\x1e\\xfb\\x27\\xb7\\x6f\\x05\\xd5\\xb2\\xbb\\x15\\x81\\xdc\\x42\\xa9\\x0e\\x1c\\xd3\\x18\\xc9\\x70\\x75\\x83\\x65\\x4f\\x0b\\x65\\x1a\\x38\\xd1\\x98\\x83\\x09\\x94\\x06\\x2a\\x7e\\x14\\x7c\\x60\\xf1\\x47\\xe5\\x31\\xfb\\xf6\\x7b\\x18\\x6d\\x0e\\xfa\\x3b\\x33\\xe0\\x92\\x06\\xcb\\xd1\\x8d\\x36\\x92\\xb1\\xd2\\x1f\\x73\\x5a\\xac\\x8c\\x61\\x39\\xc6\\xd1\\x66\\x96\\xd6\\x6e\\xb0\\xd2\\x67\\x66\\xa3\\xcf\\x95\\x6f\\xbc\\x09\\xbb\\x37\\xcc\\xf9\\xea\\x22\\xe4\\x6a\\x62\\xae\\x18\\x79\\x9d\\x25\\x6d\\xed\\xf5\\x7f\\xd7\\xad\\x77\\x3d\\xcd\\x98\\x4d\\x08\\x75\\x64\\x13\\x07\\x2e\\x82\\x20\\x2d\\xf9\\x60\\x92\\x5c\\xca\\xca\\xb3\\xa0\\x06\\x1b\\xcb\\x54\\x05\\xb5\\x91\\xaf\\xe7\\xd1\\x84\\x72\\x1e\\x67\\xf9\\xc7\\x90\\x17\\xa4\\xe9\\x4c\\x21\\x41\\x77\\xf8\\x81\\x67\\x4b\\x51\\x5a\\xd5\\x38\\x59\\x66\\xc6\\x3b\\xcf\\xd5\\x50\\x71\\xe7\\x71\\xb6\\xe4\\xb2\\xe1\\xa2\\x9f\\x51\\x2a\\x86\\x5c\\x3e\\x8f\\x86\\xb3\\xa0\\x10\\x2e\\x15\\x98\\x34\\x9d\\xc7\\x85\\x29\\x0e\\x14\\xeb\\x62\\x99\\xca\\x44\\x39\\x1a\\xcb\\x49\\x9b\\x19\\x4b\\x32\\xd6\\x5c\\x65\\x06\\xd6\\x93\\x17\\xf4\\xec\\x8d\\x15\\x84\\x80\\xf9\\x13\\x15\\x63\\x83\\x8c\\x28\\x93\\xf1\\x6c\\x52\\x98\\x2c\\xb0\\x95\\x80\\x03\\x50\\xb3\\x8c\\x33\\xdb\\xc0\\x8a\\x9d\\x09\\xb3\\xb1\\xb9\\x18\\xc1\\x5f\\xd2\\x4a\\xfa\\xa7\\xe4\\xe5\\x8f\\x1a\\xcf\\xe3\\xc4\\x4c\\xc6\\x96\\x6c\\x3c\\x17\\x63\\xa9\\xa4\\x59\\x96\\x61\\x39\\x67\\x6c\\x97\\x80\\x80\\xae\\x43\\x7e\\x92\\x55\\x72\\x55\\xc4\\xcf\\xfe\\x3c\\x2e\\x96\\x6a\\x19\\x64\\x57\\x16\\xaa\\x82\\xdb\\x4a\\x36\\x54\\x05\\x5f\\x55\\x03\\x2a\\x22\\x58\\xaf\\x18\\xef\\xfd\\x79\\x3c\\x7c\\x76\\xff\\x7d\\x8f\\xc1\\xab\\x9e\\x9d\\xac\\xd2\\xd5\\xba\\x60\\x22\\xc4\\xd5\\x14\\x99\\x33\\x53\\x9c\\x19\\xf4\\xa9\\xa4\\x89\\xa2\\x9c\\x1c\\xfb\\x60\\x6c\\x91\\x4d\\x2e\\xde\\x58\\x16\\x8c\\xbd\\xd8\\x36\\x7d\\xae\\xc6\\xea\\xaf\\x61\\xb6\\xec\\x59\\x1a\\x4e\\x96\\xa2\\x93\\x1d\\x93\\x0f\\x4b\\x9c\\x6d\\x09\\x86\\x29\\x5c\\x5d\\x70\\xf0\\x18\\x52\\xbe\\x8c\\xc5\\x48\\xeb\\x2a\\x4b\\xae\\x6c\\xac\\x40\\xc7\\x14\\x85\\x84\\x56\\x67\\xe4\\x8f\\xd9\\xb3\\x91\\xb7\\x3a\\xbf\\x58\\x04\\x12\\x04\\x34\\x04\\x80\\x6c\\x15\\x2a\\x19\\x00\\x14\\xba\\x5b\\xfa\\xec\\x41\\x3c\\xa5\\x89\\x4c\\xf0\\xea\\xc2\\xbb\\x62\\x00\\xfa\\x44\\x86\\xc8\\x17\\x33\\x92\\xd0\\xe2\\x2c\\x97\\x86\\xc8\\x08\\xa9\\x28\\x57\\x17\\x39\\x44\\x01\\xab\\x75\\x23\\x8a\\xd1\\xf9\\xce\\xec\\xbd\\x6e\\x82\\xc3\\x26\\xe0\\x44\\xdb\\x36\\xe0\\xb8\\x84\\x03\\xd8\\x6d\\x84\\x77\\xeb\\x46\\xc4\\x83\\x1b\\x21\\x1b\\x2a\\xdf\\xda\\x12\\xb0\\xcb\\xe1\\x3c\\x5e\\x5d\\x54\\x5f\\x65\\x64\\xec\\x47\\x36\\x68\\xd4\\x76\\x64\\xb7\\xa8\\x29\\x45\\xd9\\x13\\x6f\\x7c\\x06\\x94\\x1b\\x72\\x6e\\xb7\\x29\\x59\\x36\\x05\\xbb\\x24\\x5b\\x82\\x0d\\x99\\x6c\\xc2\\x90\\x95\\xd6\\x1e\\xcc\\x6e\\x5f\\x72\\xdb\\x97\\x4d\\x84\\x9a\\x3a\\x7a\\xcf\\xb9\\x61\\xb6\\x10\\x8d\\xaf\\xdc\\x6e\\x48\\x8a\\x86\\x9d\\x07\\xe1\\x2e\\x86\\x72\\xc1\\xb0\\xc5\\x54\\x10\\x63\\x19\\x8b\\x52\\x99\\x2d\\x76\\x8c\\x22\\x6e\\x6b\\x96\\x93\\x2f\\x86\\x73\\xd2\\xbb\\x2a\\x88\\xf7\\x3c\\x4e\\x14\\xab\\xec\\x6d\\x2c\\xeb\\xb9\\xcd\\xb5\\x62\\x6f\\x7d\\xd1\\x7b\\x55\\xf5\\x3a\\x5a\\xca\\x42\\xe0\\x05\\x10\\x29\\xf0\\x68\\xab\\x37\\x36\\xa5\\x91\\x85\\xc7\\xf2\\xcc\\x93\\x4f\\x26\\x39\\x13\\x93\\x60\\x95\\x99\\x9d\\xa1\\x50\\x06\\xb9\\xfc\\x38\\x19\\x01\\x9d\\x60\\x2c\\x47\\x61\\xb8\\x9c\\x3c\\xb9\\x34\\xb2\\x2b\\x82\\xe6\\xc3\\x68\\x19\\xd7\\xdf\\x73\\x00\\xea\\x2f\\xd5\\x4c\\xb6\\x44\\x23\\xcc\\x85\\x05\\xee\\x28\\x7a\\xcd\\x64\\x48\\x16\\xde\\x45\\xb0\\x8a\\xec\\xb0\\x0f\\xd9\\x10\\xb8\\x40\\x5c\\x03\\x96\\xe9\\x5f\\x5d\\x78\\x9f\\x4d\\x70\\x80\\x89\\x52\\x4d\\xdc\\x61\\x1c\\x0a\\x41\\x0e\\x59\\x80\\x5c\\xd8\\x13\\x72\\x32\\x57\\xf9\\xdd\\x31\\xce\\x6d\\xb4\\xde\\x39\\xe3\\x43\\x19\\xad\\x5c\\x70\\xf2\\x13\\xd0\\x7d\\x28\\xc6\\x26\\x6c\\x49\\xf5\\x18\\x49\\x77\\x8a\\x64\\xa8\\xe0\\x83\\xb0\\x9e\\x00\\x9f\\xe0\\x0d\\xe3\\x90\\x8b\\x6c\\x62\\x52\\x54\\x24\\x90\\x32\\x96\\x64\\x62\\x9a\\x84\\x49\\x4b\\x06\\x28\\x30\\x87\\x99\\xa4\\xc7\\xe2\\x05\\x84\\x64\\x21\\x82\\x7d\\x4b\\x35\\x33\\xf0\\x95\\xf1\\x75\\xb2\\x00\\x3a\\xe9\\x40\\x7a\\xc6\\xcd\\x42\\x7f\\x65\\x0b\\xcb\\xfc\\x0f\\xb7\\xe0\\x26\\x84\\x86\\x64\\xc8\\xcb\\x51\\xbb\\xb2\\xc4\\xc8\\x03\\x55\\xc1\\xc9\\xa9\\x8e\\x56\\x78\\x33\\x2e\\x5e\\x09\\xf1\\xc1\\x1e\\xff\\xc7\\x5b\\x3d\\xa6\\x12\\xb5\\x47\\xd9\\xd5\\xec\\x16\\x16\\x58\\xf4\\x95\\x0d\\x45\\x36\\x29\\xc9\\xd5\\xf2\\x21\\x18\\x1f\\x85\\x8b\\x4c\\x63\\xf4\\xd8\\xf8\\x49\\x30\\xb4\\x42\\x11\\xb3\\x2c\\x95\\xd2\\x2c\\xe7\\x62\\xa3\\xb0\\xd3\\x9c\\x64\\xeb\\xbc\\xaf\\xa6\\xfd\\x24\\xb0\\xa9\\xcd\\x8a\\x9c\\x88\\x76\\xe2\\x07\\x2b\\xfd\\xd4\\x46\\x8e\\x74\\x10\\xa1\\x54\\x32\\x6e\\x3a\\x3c\\xfb\\xff\\xe9\\x36\\x63\\x42\\x8d\\x31\\x49\\x60\\x36\\xf3\\x24\\x10\\x53\\x8b\\x61\\xaa\\xc6\\x53\\x9e\\xab\\x33\\x31\\x96\\x05\\x13\\xf2\\x3e\\xc9\\x09\\x1b\\x9d\\x0f\\xa0\\xcd\\xcb\\x81\\x8d\\x31\\x18\\x0a\\x3c\\xa4\\x89\\xaa\\x20\\x64\\x67\\x7c\\x14\\xc4\\x19\\xeb\\x4c\\x82\\x1e\\x53\\xa2\\xc5\\x62\\x5b\\xac\\x17\\x4c\\xb4\\xfe\\xa8\\xc7\\x87\\x96\\xe5\\x3c\\x0e\\x76\\x63\\xca\\xff\\xf3\\xad\\x29\\x57\\x0a\\x3b\\x39\\x88\\x5c\\x8c\\x63\\xcc\\x86\\x72\\x1e\\xb9\\x66\\x10\\xa7\\xd1\\xca\\xc4\\x42\\x1e\\xa8\\x94\\xd1\\x62\\xd7\\xa2\\x1f\\xb9\\x92\\x21\\x76\\xa3\\x50\\x7e\\x2a\\x4e\\xa0\\x3a\\xc9\\x4d\\x18\\x59\\x60\\x89\\x53\\x1c\\x45\\xc4\\x11\\xcc\\xeb\\x46\\x5c\\x2f\\xae\\x78\\x90\\xcb\\x55\\x68\\xc4\\xae\\x52\\xbb\\x9e\\x9c\\x37\\xf8\\x91\\xff\\xe5\\x36\\x96\\x72\\x2b\\xff\\x15\\xaa\\x89\\x49\\xd8\\x4b\\x1e\\x7c\\xe2\\xc5\\xd7\\x30\\x70\\xce\\x8b\\x95\\x07\\x0f\\x8e\\x20\\x8a\\x80\\x24\\x4f\\x81\\x84\\xbd\\xcc\\x79\\xc1\\x83\\x4f\\x1b\\x63\\x9d\\x75\\x8c\\xac\\x6f\\xac\\x8f\\xc0\\x54\\x49\\x93\\xaf\\x26\\x3b\\xc1\\x3e\\x24\\x0c\\xc0\\xcc\\x64\\x28\\x29\\x13\\x52\\x06\\x4e\\x3c\\x5a\\x61\\xda\\x9c\\xf2\\x46\\x8e\\x15\\x07\\x08\\x99\\x48\\xb3\\xa5\\xa0\\x94\\xbe\\x6c\\xa0\\x64\\x7b\\x6b\\xec\\x42\\x71\\xbd\\x55\\x64\\x22\\xc9\\x25\\x88\\x43\\x14\\x69\\x4f\\x1e\\x6c\\x4c\\xe1\\x70\\x3f\\xe7\\xb7\\xd7\\xc0\\x2b\\x9b\\xcc\\xd7\\xcc\\x38\\xed\\x98\\xf1\\x0d\\x91\\xf0\\xbd\\xdb\\x30\\x1d\\xda\\xa6\\x5b\\x16\\x68\\xe3\\x38\\x46\\x01\\x95\\x58\\x68\\x60\\x4a\\x72\\x7b\\x20\\x0a\\x17\\xe1\\x5e\\x69\\x03\\xe8\\x5c\\xc7\\x59\\x66\\xa7\\x9d\\xd6\\x6c\\x62\\xca\\x8b\\x67\\x12\\x31\\xb2\\x14\\x65\\x77\\x4c\\x10\\xc2\\x30\\x7b\\x70\\x89\\x24\\x12\\xf2\\xc4\\x2c\\xdc\\x99\\xfe\\x62\\xf1\\xd3\\x4c\\x4a\\xab\\xd1\\x76\\xb1\\xda\\x85\\x15\\xa2\\xd3\\x24\\x6f\\x7d\\x33\\xeb\\x85\\x90\\x2b\\x5e\\x81\\xd6\\x59\\xd1\\x7a\\x22\\x83\\x5f\\x84\\xde\\x78\\x1d\\xf0\\xea\\xc2\\x97\\x62\\xa2\\xaf\\xca\\xb2\\x25\\xa3\\x52\\x3a\\xc7\\x34\\x37\\x81\\xbd\\xb8\\xa9\\x42\\xfe\\x0f\\xd5\\x14\\x37\\x0b\\x4b\\x1d\\xd3\\xe2\\x73\\x6d\\xc4\\xcf\\x46\\x36\\x1c\\x15\\x85\\x47\\x67\\xc0\\xc4\\xda\\x5a\\x55\\xe4\\x17\\x5a\\xe1\\x66\\x65\\xef\\x63\\x30\\x8b\\xf5\\x79\\x03\\x2b\\xd2\\xed\\x4b\\xea\\x1a\\x44\\x24\\x36\\x44\\x95\\x16\\x4a\\x79\\x8c\\xc1\\x99\\x5a\\x16\\x39\\x12\\x1a\\x39\\xa4\\x3d\\xf1\\x36\\x17\\x0f\\x31\\x5a\\x7e\\xf5\\x6e\\xa9\\x45\\x0e\\x3c\\x6c\\x0c\\xc6\\xdd\\xe1\\xf8\\x06\\x37\\x51\\x08\\x98\\xcb\\x93\\x8d\\x86\\x6a\\x16\\xe6\\x51\\xe8\\x86\\xec\\xfa\\xec\\x13\\x83\\x97\\x4f\\x38\\x9a\\x88\\xa3\\x11\\x38\\xa0\\x3c\\x83\\x59\\xf4\\xc4\\x4a\\x95\\x85\\x0f\\xc3\\x61\\x70\\x10\\xd6\\x51\\xaf\\x02\\x8b\\xd4\\xc2\\xb1\\x82\\x3a\\x8c\\xa0\\xcc\\x3e\\x97\\x91\\x58\\x6e\\xd7\\xc0\\xcc\\x8b\\xf5\\xa9\\x0c\\xb6\\xd6\\xb0\\x50\\xa5\\x31\\x64\\x32\\xd1\\xc5\\x49\\x6e\\x96\\x88\\xff\\x14\\x30\\x23\\x91\\x31\\xbc\\x9e\\xe2\\xe4\\xc0\\x96\\x84\\x1d\\xc0\\xac\\xd7\\x2e\\x82\\x6b\\xd9\\xa9\\x5d\\x00\\x31\\x09\\x60\\x11\\x95\\xb5\\x17\\xba\\x0f\\xb1\\xe0\\xf0\\xee\\xf8\\x6e\\x77\\x56\\x1c\\x2f\\xac\\x5c\\x75\\x23\\x9b\\x34\\x30\\x88\\xac\\x30\\xc0\\x49\\x59\\x11\\x81\\x4e\\xc1\\xc5\\x42\\xa6\\x26\\x1d\\x5c\\x45\\x9e\\x98\\x66\\x40\\x23\\x45\\x65\\xb2\\x62\\xc3\\x14\\xa4\\x73\\x22\\x30\\x01\\x32\\xcb\\xc1\\x52\\x0a\\x0b\\x53\\x1d\\x28\\x85\\x49\\xf8\\x19\\xd5\\x3a\\x49\\x8f\\xb3\\x1c\\x4c\\x54\\x91\\xa4\\x14\\x63\\xe5\\xcf\\x40\\xb2\\x62\\xf9\\x76\\xb2\\x85\\xcd\\xca\\x11\\x85\\x32\\x5b\\x20\\x69\\x16\\x10\\x10\\x61\\x94\\x4d\\x9a\\x6c\\x32\\x94\\x09\\x2a\\x1b\\x2e\\x3c\\x7b\\x11\\xa3\\x89\\xd6\\x3b\\x96\\x14\\x5d\\xb9\\x32\\x93\\xf2\\xaa\\xc2\\x5f\\x83\\x4b\\x93\\xbd\\x73\\xc0\\xf8\\x3a\\x59\\x88\\x46\\x60\\xf0\\x44\\xf8\\x91\\xb3\\x28\\xca\\x92\\x78\\x9e\\x55\\x34\\x62\\xe5\\x91\\x40\\x16\\x28\\x44\\x15\\xc7\\xc0\\x4c\\x79\\x05\\x0b\\xb0\\x56\\x93\\x65\\xe7\\x95\\xd9\\xc2\\xe6\\xb8\\x7c\\x7d\\x80\\xde\\x6d\\x0a\\x3d\\xa1\\x3b\\x9b\\xb8\\x12\\xb3\\x64\\x42\\xa5\\x31\\xb9\\x68\\x6a\\x8a\\x03\\xd7\\xb0\\xd8\\x4a\\x61\\x80\\x82\\x88\\x6a\\x18\\x54\\x55\\x44\\xc1\\xdf\\x52\\xb4\\x25\\xc7\\xfb\\xea\\x2e\\xb0\\x05\\xb1\\x06\\x91\\x31\\xaa\\x89\\x81\\x07\\xef\\xe3\\x12\\x39\\x8e\\x36\\x19\\x81\\x61\\x91\\xe0\\x37\\x48\\x4a\\xec\\xc9\\xd7\\xca\\x1d\\xac\\x90\\x13\\x47\\x2e\\x72\\x76\\xd8\\xdc\\xac\\x6c\\xa4\\x9c\\x6b\\x63\\x23\\x15\\x78\\x18\\x27\\x4f\\x26\\xfb\\x19\\x12\\x2b\\x70\\x0d\\x27\\xc5\\x35\\x0e\\xc2\\x74\\x34\\x39\\x4d\\x22\\x97\\x40\\x56\\xcb\\xba\\xcb\\xb3\\xd5\\x23\\x28\\xc2\\xfc\\x46\\x61\\xe0\\xc7\\x12\\x4c\\x21\\x1a\\x8a\\x2f\\x8b\\xf5\\x9e\\x07\\xa5\\xdd\\x9c\\x8c\\x48\\x9f\\x5e\\x2e\\x25\\xb4\\x64\\x3e\\x4d\\xd0\\xbf\\x09\\xeb\\x02\\x14\\x29\\xc3\\x31\\xb0\\x30\\x39\\xe3\\x8d\\x67\\x08\\xae\\x79\\x06\\xfc\\xfa\\x84\\xab\\x2e\\xaf\\x54\\x2c\\x96\\x63\\xac\\xb3\\xf5\\x8d\\x3d\\xf5\\xc2\\x6a\\x0b\\x00\\xe0\\x7c\\x21\\x1a\\x2a\\xd6\\x2d\\xc6\\x8b\\x14\\x71\\x78\\xf7\\x52\\x77\\xb6\\xa1\\x9d\\xad\\xf0\\x4c\\xa9\\x0a\\x39\\x13\\x2e\\x4a\\x24\\x64\\xac\\x33\\x00\\x28\\x03\\x43\\x53\\x9b\\xe5\\x72\\x94\\xb6\\x73\\x4a\\x31\\x40\\x30\\x40\\x3d\\x04\\x0c\\x9b\\x96\\x45\\xf8\\xef\\xd4\\xb4\\xb5\\x94\\x8c\\x57\\xcc\\xcd\\x82\\x65\\x80\\x36\\xbc\\xca\\x75\\x4e\\xd9\\xf1\\x38\\xdb\\xac\\x72\\x4b\\x71\\xa3\\x20\\xfb\\x49\\x18\\x11\\x6a\\xaa\\xe2\\xe2\\x66\\xdc\\x62\\xc3\\x75\\xa2\\x0a\\x94\\x28\\x4c\\x51\\xc3\\x06\\x22\\x87\\x7a\\xb9\\xd8\\xd8\\x2b\\xc6\\xfd\\x14\\xb9\\x2e\\x79\\x21\\x50\\x10\\x78\\xfc\\x64\\x59\\x07\\xf4\\x59\\x30\\x44\\xd2\\x4b\\x20\\xd4\\x50\\xae\\x80\\xb9\\xf0\\x85\\x4d\\xd4\\xdd\\x16\\x62\\x93\\x14\\xaf\\xa6\\x34\\x83\\x15\\x11\\xd9\\x61\\xaa\\xce\\x34\\x16\\xc5\\x40\\xa0\\x11\\x18\\x32\\x54\\x15\\x43\\xe2\\x96\\x46\\xf9\\x1b\\x5c\\x49\\x36\\x39\\x4e\\xb6\\xd0\\x0e\\x59\\xb0\\x70\\xcd\\xc5\\xd8\\x4c\\x8b\\xad\\x1b\\xcc\\x4a\\xde\\x54\\x12\\x41\\xd1\\x50\\xf2\\xe2\\x53\\x1d\\xc8\\x71\\x05\\xbb\\x32\\x41\\x3b\\x60\\x39\\x07\\x01\\x49\\x6c\\x5e\\x24\\xc2\\x1e\\xe3\\x39\\x0b\\xe7\\x84\\xd5\\x17\\x68\\x01\\x47\\x12\\xee\\xb7\\x4c\\x3e\\x18\\x2f\\x3c\\x56\\x48\\x26\\x16\\xa8\\x09\\x5c\\x36\\xa1\\x02\\x31\\x46\\x12\\xae\\x54\\xb8\\xcb\\x20\\xbc\\x1d\\x6f\\x60\\xee\\xd2\\x63\\xee\\xb8\\x77\\xff\\xca\\x2a\\xe4\\xca\\xd6\\xe1\\x84\\x67\\xd0\\x02\\xd5\\x60\\x4d\\xe0\\xe2\\x82\\xf0\\xc0\\xb1\\x0a\\xa2\\x84\\x82\\x99\\xaa\\xe0\\x79\\xe1\\xcb\\x89\\xb3\\xf1\\x22\\x78\\xcd\\xde\\x0b\\xc2\\x4a\\x78\\x92\\xe3\\xc6\\x23\\xb1\\x48\\xa3\\x4e\\x75\\x58\\xd0\\x5c\\x5b\\x61\\x24\\xa9\\x7a\\xe8\\xbe\\xa0\\x51\\x9a\\x04\\xe2\\x54\\x09\\x05\\x01\\xc4\\xcd\\x29\\x03\\xd6\\x14\\x61\\xf2\\x0a\\x21\\xe4\\x1a\\x13\\xd3\\x44\\x33\\xd5\\x99\\x81\\x11\\x07\\xb5\\x73\\x4a\\x39\\x7c\\x86\\xb9\\xc2\\x81\\x8d\\x89\\xd5\\x84\\x26\\x17\\x3b\\x08\\xcc\\x96\\x40\\x66\\x66\\x61\\x5c\\x54\\x3e\\x55\\x6d\\x5d\\xc8\\xa0\\x91\\x73\\x84\\x6a\\x2e\\x0a\\xb2\\x16\\x29\\x4a\\x69\\x52\\xcc\\x02\\x26\\x02\\xd2\\xb1\\x2a\\xc0\\x58\\x79\\x68\\xdd\\x5d\\x5d\\xf8\\x2a\\xb7\\x19\\x1f\\x41\\x2f\\x01\\x26\\x2b\\x34\\x7c\\x61\\x01\\xec\\x59\\x78\\x1f\\xbd\\x1f\\x60\\x8b\\x40\\x02\\xd0\\xa8\\xd1\\x2e\\xd5\\x09\\x06\\xd2\\x8b\\x17\\x5b\\xbb\\x49\\xe4\\x1e\\xe0\\x13\\xe0\\x90\\x08\\xd9\\xbc\\x69\\xde\\x02\\x6f\\xe1\\x8c\\xda\\xe3\\x8c\\x66\\xc6\\x48\\xde\\x54\\xcc\\x93\\x05\\xa8\\xe4\\x46\\x1a\\x9f\\xdd\\xb5\\x65\\x07\\x2c\\x04\\xb3\\x07\\xf9\\xe3\\xc6\\x28\\x08\\xbe\\x10\\xaa\\x46\\x60\\x2f\\x29\\x29\\x7b\\x09\\x91\\x0b\\x33\\x09\\xc1\\xcd\\xd6\\xd7\\xac\\xf8\\x25\\x4f\\x36\\xab\\x02\\xb1\\xed\\xa5\\xde\\x5e\\x19\\x0a\\x08\\xc7\\x8b\\xe8\\x4e\\x13\\xce\\x18\\x6a\\x51\\x95\\xc8\\x67\\xa8\\xaa\\x80\\x6e\\x84\\xb3\\x71\\x82\\xe0\\x0d\\x20\\x3e\\xb3\\x61\\xc1\\x27\\x22\\x03\\x43\\x39\\x92\\x3c\\x18\\x2c\\xd5\\x37\\x4a\\xdf\\x49\\x95\\x65\\x82\\x5d\\x03\\x00\\x82\\x9d\\xa1\\x86\\xc3\\x04\\x9b\\x01\\x1b\\x09\\x34\\xc4\\xb6\\x7a\\xf0\\x63\\x41\\x51\\x18\\xb9\\x99\\x02\\x08\\x44\\x2e\\x53\\x86\\xb2\\x82\\x55\\xcf\\x7a\\x1e\\xe7\\x22\\x4b\\xc8\\xfe\\x3c\\x2e\\x04\\x34\\x4b\\x09\\x56\\x16\\xc3\\xc1\\xab\\x48\\x5c\\x84\\xcd\\x00\\x23\\xdd\\x3a\\x29\\xc0\\x56\\x31\\x2a\\xd1\\xdf\\xd4\\x20\\xfc\\x87\\xdb\\x1a\\x84\\x18\\x77\\x58\\xfd\\x90\\x88\\x82\\xdf\\xf1\\x6f\\xe1\\x78\\xaa\\x08\\x73\\x5b\\xbd\\x15\\x62\\x13\\xe6\\x84\\xf5\\xbf\\x92\\x7f\\x1f\\x51\\xa4\\xbb\\xa8\\xee\\x3e\\x73\\xfb\\xc7\\x9f\\x7c\\xe3\\x9f\\x77\\xfa\\x37\\xb7\\x63\\x2a\\x8b\\x09\\x3e\\x2d\\xcc\\x79\\x2c\\x89\\x8c\\x4f\\xab\\x4d\\x23\\xe6\\x04\\x6e\\x6a\\xb1\\x69\\x6c\\xcf\\x1e\\xaf\\x0e\\x0f\\xf3\\x7e\\x77\\x15\\xd8\\xaf\\xc2\\xa0\\x37\\xde\\xf3\\xc2\\x5c\\x87\\x52\\xa5\\x7b\\xae\\x83\\x2d\\x35\\x5d\\xe1\\x55\\x4e\\xfe\\xc0\\xab\\xcd\\xa5\\x5c\\xf6\\x4b\\xf1\\xed\\xce\\x09\\xcf\\x2a\\x42\\x7a\\x76\\x63\\x2c\\x82\\x62\\xeb\\x22\\xe2\\x22\\x1e\\xd3\\xc2\\xa9\\x8e\\x25\\x0b\\x51\\xc4\\x12\\x79\\x83\\xdc\\xfc\\xd3\\x6d\\x49\\x68\\xd5\\x0f\\x41\\x5d\\x51\\x68\\xb2\\xde\\x50\\x65\\xb5\\x08\\x18\\xae\\x61\\xf6\\x40\\x84\\xe4\\x78\\x62\\x0e\\x90\\x4b\\x94\\x01\\x50\\x35\\x5c\\x63\\x8e\\x5c\\xd3\\x3b\\x0a\\x1a\\xb7\\x39\\xa8\\x2e\\x12\\x7a\\xb7\\xa4\\xe7\\x4a\\x93\\x4d\\xc2\\xd2\\x66\\x68\\x60\\x6c\\x55\\xfd\\x1f\\x10\\xb7\\x83\\xbc\\x50\\x69\\x12\\xf2\\xe4\\x8c\\xa0\\x2e\\xc3\\x2e\\xce\\x94\\xa0\\x12\\x8d\\x65\\x12\\x69\\xa5\\x18\\x8c\\x68\\x88\\x85\\x29\\x51\\xa9\\x64\\x15\\x52\\x8a\\xe2\\xc0\\x59\\x79\\x03\\x13\\x79\\xb2\\x39\\x28\\xba\\x8b\\x8a\\x58\\x76\\xd2\\x89\\x1c\\x80\\xc8\\x26\\x17\\xc2\\x73\\xc9\\x05\\x71\\x46\\xb9\\x59\\x8e\\x4e\\x66\\xb1\\x41\\xfb\\xfe\\xd7\\xdb\\xa7\\x52\\x5c\\xda\\xd1\\xbe\\x90\\xcb\\x44\\xc5\\x04\\xce\\x86\\x63\\x34\\xa9\\xc8\\xce\\x24\\x61\\xf1\\x04\\x73\\x4d\\xbe\\x08\\x1a\\x8a\\x50\\x84\\xca\\xcc\\x67\\xaa\\xce\\xd8\\x94\\x80\\x69\\x44\\x64\\xa3\\x02\\x2b\\x89\\xb0\\x29\\x49\\x08\\x13\\xc8\\x41\\x99\\x6c\\x56\\x7c\\xe0\\xa3\\x91\\x05\\x14\\xe1\\x8b\\xfc\\x64\\x85\\x93\\x2d\\x6a\\xbe\\x6d\\xf6\\x8e\\x79\\x95\\xc3\\x02\\x4d\\x96\\x02\\xf8\\x0f\\x26\\x20\\x4d\\x02\\x79\\x01\\x21\\x8b\\x13\\x47\\xc3\\x50\\x86\\x05\\x13\\x5c\\x9e\\xa1\\x1d\\x88\\x1e\\x64\\x53\\xd0\\x64\\x02\\xc3\\x02\\xf6\\x1d\\x1a\\x28\\x63\\xc3\\xd0\\xf8\\xba\\x98\\xfd\\x64\\x05\\x51\\xca\\xd7\\xd8\\x45\\xa1\\x7d\\xd0\\xa3\\x47\\x20\\xda\\x88\\x1e\\xc0\\x1b\\xb9\\x3a\\x67\\xc5\\x7b\\x69\\x12\\xa4\\x09\\x5e\\x0c\\xba\\xd2\\x08\\x56\\xdc\\x86\\x8c\\x73\\xad\\x50\\x0a\\x7b\\xc5\\xb4\\x41\\xe5\\x1c\\x26\\x59\\x0c\\xd4\\xa9\\x36\\x66\\x59\\x8d\\xec\\x8a\\x70\\x58\\x2a\\xea\\xc4\\xe4\\xe6\\xa0\\x7a\\x5d\\x76\\x71\\x2a\\x18\\x16\\xda\\x59\\x76\\x32\\x73\\x19\\xc4\\x8d\\xc2\\x7a\\x51\\xc8\\x93\\x15\\xda\\x00\\x6a\\x90\\x81\\x5d\\xa0\\xed\\x14\\x4e\\x40\\xc1\\x13\\xc3\\x57\\x90\\x98\\x24\\x64\\xde\\xb0\\x70\\xd9\\x98\\x97\\x49\\x85\\xaf\\x2e\\x32\\x93\\x09\\x94\\x84\\x75\\x51\\xc8\\x56\\x2d\\x32\\x55\\xe9\\x60\\xc6\\xbf\\xe8\\x73\\x8a\\xd8\\x40\\x68\\xf0\\x61\\xc6\\x2a\\xf2\\x54\\x13\\xae\\x04\\x1b\\xe9\\x3a\\xcd\\xf8\\x77\\x94\\xad\\xaf\\x49\\x98\\x38\\x93\\x57\\x5a\\x4d\\xb2\\x25\\x42\\xd5\\x26\\x2b\\x5c\\xad\\x8c\\x95\\xaa\\xb1\\x15\\x04\\x00\\x98\\xa9\\x6e\\x72\\xf5\\x1f\\x34\\x56\\x91\\x56\\xaf\\x02\\x17\\x0c\\xc5\\x31\\x88\\x58\\xc0\\x49\\x10\\x68\\x1d\\x43\\x50\\x41\\x22\\xe1\\xad\\xa5\\xd8\\x44\\xb3\\x50\\x53\\xfb\\x86\\x0c\\x95\\xd1\\xa6\\x60\\xd8\\xb9\\xc1\\x06\\x41\\x8f\\x09\\xfa\\x7e\\x87\\x97\\x96\\xca\\xf5\\x27\\x57\\x17\\x31\\x55\\x93\\x5c\\x19\\xbc\\x0f\\xa3\\x08\\xd5\\x26\\x92\\xdf\\x54\\x8f\\xfe\\x73\\xe7\\x27\\xb2\\x8a\\x94\\xb2\\x69\\x4d\\x34\\x8c\\x10\\x0d\\x5d\\x80\\x96\\x53\\xff\\xc8\\x69\\xa0\\x18\\x87\\x50\\x79\\xe2\\x28\\xf7\\x27\\x60\\x22\\xce\\xa9\\x28\\xc7\\x6a\\x0d\\xc3\\xec\\x14\\xf6\\x57\\x19\\x5a\\x29\\x26\\x09\\x6b\\x3c\\x41\\x89\\xcd\\x45\\xf8\\x73\\xbd\\x2a\\x6e\\x4e\\xb1\\xc1\\x99\\x32\\x85\\x75\\x35\\x74\\x10\\x76\\xdb\\x57\\x6a\\x66\\xc5\\xc1\\x66\\x92\\xb5\\x3a\\x11\\x66\\xc2\\xc0\\xa9\\xae\\xf7\\x24\\x67\\x03\\x7d\\xc8\\xaa\\xef\\x12\\x6a\\xee\\x32\\xa4\\x47\\x08\\x4e\\xb3\\xee\\x49\\x6a\\x58\\x6d\\xb1\\x81\\x9d\\x76\\x54\\x42\\x1a\\x44\\xaa\\xdb\\x31\\x26\\xce\\x84\\x32\\x27\\x2f\\x68\\x0f\\xbd\\x90\\x51\\x11\\x93\\x00\\x88\\x45\\x0d\\xbf\\x83\\x9c\\xc3\\x62\\x7d\\xd9\\x00\\x81\\x5f\\x74\\x3b\\xcc\\xab\\x95\\x99\\x4d\\x76\\x7e\\x09\\xb2\\x55\\x9e\\x32\\xae\\x78\\x64\\x9a\\x43\\x21\\x23\\x74\\x58\\xc0\\x4c\\x84\\x2a\\x01\\x63\\x82\\x0e\\x5f\\x36\\x49\\xf0\\xd2\\x62\\xb9\\xc8\\xc0\\x94\\x47\\xeb\\xc1\\xa0\\x4f\\x36\\x78\\x13\\x7c\\x63\\x99\\x4d\\x2a\\x73\\xe3\\xda\\x44\\x24\\xa1\\xaa\\x62\\x5d\\x6d\\xc6\\x5d\\x79\\xa9\\xb7\\xcc\\x27\\xb7\\xd8\\xa8\\x8a\\x44\\x91\\x02\\x85\\xec\\xfb\\x44\\xc0\\x3d\\x22\\xc9\\x36\\x8f\\x16\\x70\\x02\\x2c\\x52\\x1d\\xae\\x49\\x19\\x75\\xd0\\x81\\x29\\x63\\x2a\\xe0\\x8d\\x94\\x69\\x60\\xe5\\x60\\x31\\xcd\\xd9\\x7a\\x87\\xf3\\x84\\x86\\x65\\xb2\\x5c\\xbd\\x22\\x13\\x67\\xd8\\x09\\x26\\x29\\x59\\x16\\x7c\\x78\\xdf\\x7e\\xd9\\x59\\x78\\x89\\xee\\x01\\x99\\xd1\\xb9\\x89\\x13\\x20\\x33\\xb8\\x86\\x62\\x66\\xa8\\x2c\\x83\\x87\\xc1\\x90\\x83\\x2e\\x3b\\x95\\x66\\xae\\xc6\\xef\\xc2\\x75\\xeb\\x0d\\x87\\x4d\\x21\\xc6\\x6b\\x18\\x13\\x61\\x88\\x00\\xeb\\x1c\\x92\\x88\\x40\\x73\\xa9\\x86\\x73\\x5e\\x38\\x40\\x4a\\x12\\xa4\\x80\\x5f\\x04\\x89\\x69\\x8b\\x41\\x24\\xa0\\x45\\xae\\xc5\\x06\\xb9\\xff\\xb0\\x03\\x0e\\x57\\xee\\xb1\\xc8\\x5a\\x85\\x53\\xaf\\x15\\x52\\xe1\\x68\\xc9\\x1b\\xca\\x61\\xb0\\x41\\x58\\x0c\\x9f\\xd2\\x10\\x64\\x74\\x28\\xd1\\xf1\\x14\\x28\\x0d\\x21\\xbb\\xb1\\xb5\\x53\\xbd\\x23\\x0c\\xf1\\x14\\x37\\xf8\\xaa\\xff\\xd8\\x59\\x4e\\x53\\x3c\\x75\\x82\\xf0\\x55\\x38\\x30\\xbb\\x1c\\x17\\x1b\\x1c\\x0d\\x91\\xdc\\xaa\\xe2\\x97\\xa7\\x20\\xe8\\x2c\\xa6\\x1b\\xca\\x29\\x7f\\x78\\x56\\xbf\\xea\\xb1\\x56\\xe3\\xf6\\x42\\x36\\xa9\\xba\\x05\\xbc\\x87\\x07\\x49\\x60\\x88\\x58\\x3c\\x87\\xac\\x82\\x6f\\x9c\\x28\\x0b\\x16\\xf7\\xa4\\x12\\x39\\x58\\x61\\xdf\\x9c\\x28\\x14\\x32\\xaa\\x87\\x6e\\x1f\\xda\\x21\\xaa\\x71\\xb2\\xc1\\x19\\x68\\xfd\\x01\\xcd\\x31\\x34\\x75\\x37\\xba\\x83\\xe8\\x5c\\x95\\xa6\\xc3\\x84\\x04\\xc5\\xa4\\x93\\x65\\xa4\\xba\\xd8\\xc8\\xd7\\x77\\x2b\\x08\\xad\\x84\\xc3\\x98\\x73\\x4d\\x67\\x3f\\x15\\xd5\\xae\\x2b\\xc3\\x34\\x17\\x18\\x2a\\xe3\\xc2\\x21\\x8f\\x22\\x55\\x18\\x52\\xc7\\xb3\\xe8\\x68\\xb1\\x31\\xd6\\xc9\\x0a\\x07\\x09\\x2b\\xa3\\xcb\\xab\\xf6\\x69\\x86\\xf1\\x0e\\x6c\\x84\\x5c\\xb1\\xb8\\x5e\\x31\\x55\\x18\\x5b\\x2a\\x51\\x28\\xc0\\x16\\x85\\xfa\\xdf\\x6e\\x6f\\x65\\x72\\xa7\\x5e\\xb3\\x24\\x1c\\x39\\xe5\\x24\\x3f\\xb6\\x63\\x0b\\xec\\x86\\x58\\xc3\\x12\\xd8\\xe9\\xaf\\x3b\\x60\\x85\\xb0\\x20\\xff\\xdf\\xfe\\x04\\xdd\\x76\\xe7\\xbe\\xaf\\x94\\x0c\\x42\\xf5\\xa4\\xd7\\xfb\\x80\\xc8\\x7f\\xea\\x4c\\x95\\xab\\x81\\x2b\\xde\\xf4\\xf0\\x5b\\x97\\x95\\x8e\\x2c\\xeb\\xf0\\x1c\\x0f\\x0f\\xfc\\xeb\\xde\\x8b\\xaa\\xc9\\x3a\\xc2\\x28\\x52\\x6e\\x0a\\x74\\x15\\xb3\\x28\\xaa\\x12\\x34\\x65\\x48\\xc6\\x45\\x45\\xff\\xa9\\xa8\\x67\\x11\\x38\\x1d\\x68\\xb5\\xd2\\xaa\\xe4\\x5b\\x0a\\x94\\x41\\xd7\\xb3\\x0d\\x21\\x1f\\xda\\xd5\\xd2\\x28\\x28\\xd4\\x46\\x5e\\x85\\x00\\xaf\\x7a\\xe8\\x90\\x77\\x7e\\x38\\x37\\xad\\x43\\x24\\x0c\\x1d\\x5c\\x31\\xb2\\x32\\xbc\\x9e\\x68\\xd9\\x32\\x71\\xfd\\xa6\\x43\\xcf\\xe9\\x54\\xc6\\x21\\xd6\\xb8\\x4e\\x37\\x14\\x9d\\xae\\x2f\\x75\\x20\\xce\\x50\\x0f\\x07\\x97\\x47\\x5b\\x92\\x21\\xd6\\xd6\\x39\\xef\\x16\\x27\\x82\\xac\\x90\\x3c\\x79\\x08\\xb9\\x8c\\x41\\xc5\\xd4\\x38\\x42\\x37\\xc0\\x71\\xe7\\x55\\x99\\x31\\x81\\x2a\\x32\\xfe\\x68\\xd1\\x29\\xd3\\x60\\x29\\x09\\x12\\x74\\x7e\\xdc\\x8d\\xab\\xcd\\xeb\\xc6\\xdd\\xf8\\x6d\\x87\\xfc\\x9c\\xbb\\x07\\x76\\xe6\\xca\\x87\\x01\\x9e\\xd3\\x10\\x88\\xa0\\xfa\\x2b\\x7e\\x60\\xc6\\xac\\xf2\\x20\\x22\\xc3\\xc6\\x4c\\x2e\\x6e\\xcf\\xa4\\xae\\xee\\x4e\\x27\\xcd\\xc4\\x17\\x1a\\x7d\\x56\\xde\\xc9\\x0f\\x69\\xf4\\x59\\xa4\\xc9\\xec\\x87\\xe8\\xcb\\xbd\\xee\\x23\\x7a\\x65\\xae\\x23\\x17\\x93\\x82\\x1f\\x6d\\x32\\x34\\x5a\\x5f\\xc1\\xeb\\x65\\xa1\\x24\\x35\\x8d\\xd6\\x17\\x00\\x51\\x90\\xd7\\x96\\xa4\\xad\\x4d\\x1e\\xfa\\xd1\\x7a\\xea\\x2d\\xfa\\x97\\xdb\\x0b\\x8e\\xab\\x0f\\xe4\\xa9\\x5b\\x3f\\x46\\xe1\\x49\\x6a\\x71\\x63\\x32\\xb4\\xe4\\x7c\\xd2\\xb5\\xa1\\x26\\x66\\x92\\x08\\xee\\xc5\\xc8\\xd7\\x58\\xc3\\x62\\x73\\x0e\\xa7\\xce\\xfd\\xa3\\xee\\x6a\\xac\\x26\\xe5\\x94\\x4d\\xa6\\xdc\\x9c\\x3c\\xa8\\x18\\x2a\\x64\\x22\\x17\\xa1\\x4d\\x86\\xc9\\x4d\\x0c\\x71\\x27\\xe4\\x6b\\x8d\\x95\\xfa\\x64\\x45\\x2e\\x3b\\x1f\\x08\\xa8\\xd2\\x0b\\x4c\\xaf\\x55\\x24\\x93\\x0a\\x3e\\xf9\\x1a\\xf3\\x37\\x32\\x07\\x0e\\x95\\x20\\x6d\\x57\\x55\\x90\\x66\\x52\\xd3\\x94\\x77\\x46\\xbd\\xa8\\x54\\x23\\xc8\\xb9\\xa9\\x19\\x85\\x94\\x11\\x44\\x36\\xce\\xc5\\xe0\\xef\\x19\\x0e\\x5a\\xee\\x5c\\x28\\x12\\x94\\x89\\x09\\x32\\xa6\\x4f\\x79\\xb6\\xda\\x88\\xe4\\x61\\xed\\x60\\xf5\\x5a\\xf3\\x49\\xa6\\xbb\\x21\\xaa\\x7f\\xdc\\xf3\\xc3\\x27\\x73\\x14\\xc2\\xd7\\xf9\\x32\\x31\\xdc\\xcf\\x7c\\x6d\\x9e\\x89\\x45\\x0d\\x48\\x8a\\xe3\\x52\\xb3\\x38\\x40\\x74\\xd8\\xfd\\x28\\xa2\\x43\\x6b\\x9d\\x07\\xe1\\xce\\x16\\xeb\\xd9\\x1f\\x38\\x50\\x70\\x7b\\x39\\xfa\\x81\\x43\\x9a\\x08\\x7a\\x67\\x95\\x9b\\x53\\x82\\xd2\\x00\\xa6\\xcb\\x55\\xaa\\x10\\xce\\x16\\xbf\\xe4\\xe6\\xc4\\x84\\x86\\xf0\\x46\\xc1\\x10\\x21\\x6f\\x78\\xda\\xfe\\xae\\x87\\x90\\xfa\\x68\\x10\\xa2\\xea\\x0b\\xf5\\x04\\x0d\\x59\\x24\\xe6\\xd5\\xaa\\x3f\\x7a\\x48\\xca\\xd5\\x0b\\x73\\x01\\x2d\\x46\\x1d\\xad\\x0f\\xd5\\xb0\\x87\\xac\\x6d\\x6c\\x31\\x36\\xab\\x10\\xed\\xe7\\xf6\\x14\\xbf\\x7d\\xd0\\x32\\x8f\\x05\\x5b\\xff\\xda\\xed\\xeb\\xbd\\xd8\\xe9\\x50\\xeb\\xc4\\x41\\x08\\xa2\\x87\\x57\\x85\\xaa\\xd0\\x60\\x22\\xa4\\x66\\xc9\\x22\\xd9\\x41\\x18\\x34\\xaa\\xf0\\x79\\x70\\x73\\xf5\\x34\\xa9\\x0f\\x80\\x1c\\x57\\xbc\\xf6\\x96\\x05\\xd5\\xb6\\x2c\\xa2\\xee\\x62\\x11\\x67\\x61\\x43\\x81\\x9f\\xab\\xac\\x4a\\x04\\x4b\\x78\\x30\\x8e\\x3e\\x19\\xab\\x14\\x71\\xb0\\x14\\xa1\\x23\\xf2\\x6a\\x86\\x23\\x93\\xf3\\x6c\\xa3\\x7c\\x54\\x17\\xd8\\xdc\\xc1\\x59\\x2a\\x3b\\x90\\xd4\\x5e\\x06\\xa3\\x48\\x82\\xa1\\x88\\x05\\xc9\\xfa\\x72\\x13\\x51\\x99\\x3d\\xc0\\x2e\\x14\\x06\\x76\\xbc\\x03\\x6c\\x6f\\x22\\x43\\x50\\x8e\\x6e\\x56\\x21\\x6d\\xb5\\xc2\\xe1\\xec\\xd5\\xb1\\x0a\\x4a\\xd8\\x40\\x1b\\x12\\xcc\\xbf\\x75\\x34\\x32\\xf0\\xce\\xd5\\x85\\x5c\\xa6\\x49\\x65\\x72\\x8a\\xce\\xb0\\x5a\\xb6\\xe4\\x2f\\x82\\x5e\\x2a\\x95\\xd5\\x6a\\x18\\x69\\x86\\x77\\x29\\xf9\\x24\\x0c\\x38\\x84\\x5b\\x01\\xce\\x62\\xd8\\xb9\\x09\\xff\\xc3\\xdd\\x82\\x4c\\x68\\x16\\x60\\x2a\\xc2\\xad\\xa8\\xd5\\x44\\x77\\x5d\\xdd\\x20\\x54\\x83\\xb0\\xba\\x61\\xdb\\x1c\\x8c\\xde\\x05\\x62\\xc8\\xd0\\x3e\\xed\\x7c\\x08\\x27\\x96\\xa3\\x4d\\xd9\\xf8\\xf6\\x4d\\xce\\x73\\x33\\xc0\\x70\\x51\\xfd\\x45\\x01\\x47\\x2f\\x6c\\x47\\x85\\xfa\\x01\\x74\\x4e\\x06\\xce\\x6a\\xbe\\x87\\x0c\\x11\\xd5\\x35\\x56\\xbd\\x1c\\x16\\xef\\x82\\x19\\x98\\xe5\\xb2\\xa9\\x3b\\x80\\x30\\xe7\\x3e\\x19\\x6a\\xd6\\x40\\xd8\\x97\\x75\\x4a\\xac\\xae\\x04\\x30\\x61\\x42\\x4e\\x09\\xb5\\xa1\\x18\\x2f\\xdb\\x56\\x82\\x36\\x37\\xe4\\xa1\\x17\\x2b\\xd0\\x5a\\x4d\\x70\\x24\\xc9\\x72\\x15\\x2a\\x1b\\xca\\x45\\x1d\\x7a\\xb8\\x6c\\x48\\x70\\x9f\\x74\\xf8\\x36\\xaf\\x06\\x4c\\x80\\x53\\x59\\x7c\\x29\\x03\\x71\\x2d\\x02\\x3b\\x65\\x15\\xd6\\xa0\\x2d\\x19\\x44\\x3c\\x56\\x8e\\xa5\\xc3\\x95\\xe1\\x26\\x13\\x0d\\x7f\\x8b\\x94\\xf1\\xa5\\xd5\\x4f\\x79\\x83\\x3e\\xfe\\xbe\\xa3\\xed\\x21\\xef\\xe2\\x0c\\x88\\xcb\\x9d\\x1c\\x54\\x4e\\x70\\x0e\\xa5\\x10\\x4c\\x6e\\x36\\x0a\\xf8\\xca\\xab\\x44\\x07\\x5b\\x38\\x79\\x08\\xea\\x14\\x4d\\xa6\\x39\\x17\\xc3\\x94\\x96\\x9c\\xdc\\x5d\\xf2\\x4b\\xeb\\x99\\x61\\xda\\x4b\\x0d\\x95\\x95\\xd9\\x06\\x56\\x25\\x96\\xf7\\x93\\xe5\\x04\\x69\\x2f\\xc0\\x31\\x95\\xbc\\x9f\\x2d\\xe1\\xea\\xf8\\x5c\\x64\\x88\\xc3\\x6b\\xfe\\xb4\\x67\\x97\\xcb\\xb5\\x62\\x7f\\x5d\\x73\\xf4\\xbc\\xce\\x88\\x00\\x3d\\x23\\x0b\\xab\\x5b\\xb2\\x1f\\x49\\xfe\\x77\\x43\\x1a\\x29\\x9b\\x5c\\x46\\x81\\x81\\x92\\x05\\x85\\x91\\x33\\xdc\\x7d\\x0d\\x03\\xbf\\x08\\xb0\\x82\\x97\\x88\\x53\\x18\\xac\\x77\\x6e\\xb4\\xc1\\xc3\\x97\\x62\\x03\\x7d\\x7e\\xd6\\x71\\x99\\xb9\\xdd\\x65\\xae\\xfb\\x93\\xdc\\x1d\\x88\\xf7\\x02\\xc4\\x23\\xa5\\x6c\\x6c\\xae\\x65\\x54\\x76\\x2f\\x7b\\x53\\x6b\\x19\\x98\\xe2\\xc8\\x02\\xa7\\x15\\x6f\\x68\\xa4\\x94\\x8c\\xb4\\x52\\x78\\xf5\\xad\\xb3\\x9d\\x2c\\x00\\xc6\\x26\\x8e\\xa0\\x36\\x32\\x67\\x41\\x3d\\x99\\x46\\x81\\x2a\\x53\\x13\\x0d\\x36\\xe9\\xb3\\xc5\\x1f\\xfa\\x0a\\x5e\\x5a\\x69\\x83\\x69\\xfe\\x43\\xb7\\xe7\\x7e\\xdd\\x73\\xbf\\x52\\x03\\xf6\\x86\\xc3\\xe8\\x45\\x46\\xf6\\x71\\x84\\x23\\x42\\x64\\xd2\\x1d\\xe4\\xa8\\x53\\x8c\\x75\\x77\\x28\\xd0\\x47\\x8e\\x50\\xc4\\xf9\\x98\\x47\\x21\\x5a\\xf2\\x3f\\xcc\\x94\\xd4\\x56\\x94\\x68\\xff\\x14\\xb8\\xf5\\x6a\\xa5\\x5b\\x5f\\x85\\x6f\\xf3\\x61\\x04\\xbd\\xd8\\x93\\x57\\x1a\\x7f\\x4d\\x49\\x05\\x16\\x2f\\x74\\xb0\\xc8\\x83\\x52\\xbc\\x11\\x66\\x50\\xe2\\xb5\\xfd\\x96\\x57\\xe7\\xe7\\xdd\\x5d\\xdf\\x45\\xf0\\xa4\\xbd\\x03\\x8c\\x74\\x63\\x41\\xba\\x0e\\xe1\\x56\\x86\\x84\\x47\\x11\\xad\\x10\\x80\\x41\\xf9\\xf6\\x07\\x0c\\xbd\\xf3\\x08\\xc5\\xbc\\xcd\\x41\\x70\\x86\\xcb\\xc7\\xc5\\x77\\xcf\\x2c\\x88\\xbc\\x9a\\xec\\x37\\x10\\xc2\\x1f\\x3b\\x1a\\xc2\\xcd\\x7a\\x93\\x83\\x1c\\x54\\xe4\\x31\\x13\\xd4\\xb8\\x75\\xb0\\x21\\x09\\xfb\\xe2\\x8d\\xd2\\x4b\\x66\\x39\\x0e\\x13\\x1c\\x0d\\xe4\\x84\\xe7\\xa2\\x90\\x46\\x9b\\x49\\x35\\xa1\\x69\\x88\\x2e\\x8f\\x1c\\x8c\\xb4\\x65\\x99\\x87\\x1c\\x09\\xf4\\x09\\xe4\\xb6\\xdc\\x53\\xff\\xf3\\x6d\\xb7\\xd2\\x35\\x56\\x00\\xe6\\x71\\x8f\\x58\\x40\\xce\\x43\\xf0\\x7e\\xb1\\x4c\\x42\\xb3\\x83\\x6c\\x4f\\xac\\x71\\xc0\\x13\\x7e\\x0b\\x5b\\x6b\\xfd\\xdf\\x6f\\x3b\\xbf\\xae\\xfa\\x76\\x38\\x03\\xc6\\x34\\x70\\x29\\x63\\x72\\x65\\xe7\\x63\\x5a\\x36\\x78\\xc8\\xff\\x72\\x7b\\x9a\\x69\\xf5\\x4d\\x27\\xa8\\xd2\\x07\\x0a\\x7e\\xc1\\xac\\x84\\x9f\\x58\\x64\\x56\\xc1\\x87\\xc5\\x62\\xf2\\x56\\x1e\\x37\\xdd\\x57\\xff\\x8f\\xdb\\x73\\x2c\\x61\\x17\\x2d\\x91\\x45\\xf8\\xab\\xd5\\x64\\xce\\x03\\x13\\xe3\\xd9\\x66\\x70\\xd5\\x5e\\xee\\x4d\\x8a\\x26\\x90\\x1f\\x6d\\x31\\x3e\\xe0\\xca\\x66\\x61\\x43\\xe5\\x05\\x82\\xb6\\x3c\\xda\\x1d\\x1e\\xf6\\xbf\\xf6\\x0e\\x64\\xab\\x0b\\x14\\x1b\\x37\\x54\\x12\\x00\\x2b\\x69\\xb0\\xf2\\x44\\x65\\x63\\xf2\\xff\\xe7\\x6d\\x0f\\xfb\\xd5\\x2b\\x38\\x05\\x43\\x21\\x33\\xf4\\x2f\\x9e\\xdc\\x48\\x15\\x16\\x35\\x01\\x22\\xbf\\xd1\\xd7\\xd3\\xde\\xaa\\x1c\\x77\\x80\\xe9\\x1d\\x78\\x9b\\xc8\\x06\\xc8\\xc2\\xc7\\xd9\\xc7\\x62\\x8a\\x1f\\x28\\xd4\\x85\\x5c\\x9a\\x9c\\xc9\\xc5\\xd8\\x10\\x0d\\x31\\xad\\x5e\\xb7\\x93\\xd5\\xd0\\x19\\xe5\\x2f\\xc1\\xaf\\xb4\\x00\\x8c\\x16\\x20\\x41\\x00\\x6a\\x37\\x92\\xe1\\xe0\\xa6\\xe2\\x4c\\x84\\x96\\x40\\x48\\x3f\\xcd\\x0c\\x7b\\xa9\\xcf\\x13\\xc3\\xc5\\xd2\\xab\\xf7\\x19\\x02\\x4c\\x9a\\x29\\x15\\x71\\x64\\x8b\\x0d\\x41\\x19\\xf2\\x68\\x34\\xe2\\x26\\xcf\\x6a\\x80\\xe4\\x11\\x03\\xaf\\x88\\xc4\\xfb\\x2c\\x4c\\x94\\xe1\\x2c\\x34\\xd4\\xc4\\xe6\\x67\\x61\\xe0\\x30\\x63\\x23\\x37\\xf7\\xc7\\x36\\x4c\\x36\\xf3\\x6a\\xaa\\xc3\\x77\\x08\\x72\\xb1\\x1c\\x35\\xaa\\x0a\\xc1\\x3a\\x08\\xb5\\xf2\\x11\\x3e\\x39\\x29\\x9a\\xe6\\x15\\x2b\\x24\\x37\\xaa\\xd3\\xc4\\x2e\\x44\\x6d\\x4a\\xb0\\x2c\\xb0\\x70\\x85\\xe7\\x71\\x2e\\xc1\\x40\\xbd\\x45\\x09\\xf0\\x5a\\x27\\xab\\xb6\\x02\\x70\\xdf\\x1a\\xab\\x11\\x60\\x62\\x08\\x5b\\x8a\\xcc\\x67\\xdd\\x59\\x15\\x5a\\x1d\\xb9\\xd9\\x90\\x2f\\xa1\\x09\\xfe\\x69\\xb1\\xb1\\xfa\\x29\\x64\\x93\\xa2\\x21\\xf0\\x0c\\xb0\\x5b\\x41\\xa1\\xeb\\xe3\\x24\\xa2\\x91\\x08\\x5f\\xb0\\xc5\\xc1\\x8d\\x4e\\x6e\\x63\\xd0\\xb0\\xa8\\xe6\\x74\\x0d\\xab\\xa5\\xfc\\xec\\x4b\\x9e\\x85\\x0d\\x84\\xb7\\xe7\\x64\\x55\\x50\\x92\\x4b\\xe0\\xeb\\x1a\\xc5\\x06\\x8f\\xcf\\x51\\xf6\\x57\\x60\\x60\\x90\\x0d\\x5b\\xc8\\xc7\\x70\\x75\\x11\\x58\\xa0\\xa8\\x4c\\xb2\\xfd\\xd1\\x19\\x95\\x75\\x72\\x9a\\x89\\x54\\x72\\x48\\x93\\x06\\xfd\\x52\\x2c\\x46\\x24\\xbe\\x39\\x44\\x03\\x10\\x58\\x58\\x41\\x6f\\xf5\\x27\\xe2\\xe6\\x01\\x0c\\x57\\x5b\\x58\\x79\\x10\\xb8\\xd4\\x34\\x8c\\x16\\x3b\\x8c\\xe8\\xcb\\x02\\xdf\\x9e\\x10\\x37\\x50\\xdf\\xf3\\xee\\x06\\xe6\\x6b\\xb9\\x34\\x72\\x5c\\xbc\\xb0\\x47\\x2c\\x6c\\x1a\\x3c\\x65\\x7d\\xf5\\xb3\\x2f\\x1a\\x0f\\x15\\x60\\xce\\x93\\xb7\\x60\\x4d\\xd5\\xd6\\x42\\xe4\\xc6\\x00\\x76\\x5a\\x6e\\x59\\x1e\\x21\\x00\\xa5\\x3a\\xe1\\x48\\xaa\\xb1\\x31\\x18\\x8f\\x5b\\x90\\xbd\\x21\\x18\\xdc\\x89\\xd5\\x33\\x00\\x8c\\xc3\\xea\\x3d\\x2e\\x8c\\x8d\\x6f\\x3c\\x5f\\x84\\x97\\x1a\\xe2\\xd6\\x66\\x78\\xe4\\x96\\xb2\\x8b\\x52\\x67\\xf5\\x3d\\x9a\\x83\\xb0\\x05\\x74\\x1e\\x07\\x4e\\x61\\xf4\\xc6\\x0a\\x5d\\xd0\\xcf\\xd5\\x37\\x58\\xae\\x5c\\x0a\\x93\\xba\\x43\\x40\\xa4\\xf3\\x94\\x20\\x5e\\x4c\\x38\\x5b\\xb8\\x24\\x7a\\x43\\xd1\\x0b\\xc8\\x7b\\x92\\x85\\x1e\\xde\\xb1\\x2e\\xf2\\x9f\\xe9\\xda\\xe9\\x35\\x12\\xe9\\x49\\x71\\x14\\xfe\\x9f\\x04\\x33\\xce\\x02\\x2c\\x14\\x73\\xd3\\xf1\\xc2\\xa7\\x09\\x40\\x06\\x78\\x43\\x10\\x9c\\x2f\\xe5\\x80\\xf2\\x1c\\x01\\xe4\\x31\\x8e\\x14\\xdc\\x1e\\xad\\xf5\\x10\\xe6\\x05\\xbe\\x59\\x23\\xab\\xb2\\x1a\\x52\\x9b\\xab\\xf1\\x0a\\x13\\xd6\\xd7\\x6b\\x9f\\x54\\x52\\x17\\xb0\\x24\\xe0\\x09\\x98\\x2f\\x49\\xc5\\xf8\\x48\\xa4\\x7b\\xcc\\x46\\x95\\xc4\\xcc\\xd8\\x65\\xb5\\xd9\\x0a\\xec\\x4c\\x09\\x7e\\xd9\\x44\\x86\\xd3\\x9c\\xb3\\xc9\\x71\\x09\\xb1\\x9a\\xc9\\x7a\\x67\\x04\\x5d\\x40\\x43\\xb0\\x46\\xb5\\x8a\\xe8\\xc2\\xcd\\x1d\\x3d\\x9b\\x75\\xf7\\x45\\x90\\x0a\\xc2\\xfd\\x08\\xf3\\xb0\\x65\\xfc\\xbb\\xec\\x49\\x01\\xed\\x6d\\xab\\x5b\\x82\\x9b\\x04\\x43\\x92\\x30\\xe0\\xc6\\xd7\\x3c\\x91\\x97\\x6d\\x8d\\x08\\x1e\\x82\\xca\\x73\\x62\\x82\\xf9\\x34\\xa8\\xad\\x65\\x86\\x33\\xa8\\x8f\\x19\\xa4\\x7a\\xb0\\x49\\xf8\\x04\\x41\\x70\\x13\\xd0\\x4a\\x06\\xfa\\x01\\x53\\x31\\x93\\x7a\\x6a\\xa7\\x3a\\x55\\xd8\\x81\\x45\\x40\\x86\\xd4\\x16\\x9c\\x11\\x99\\x60\\xcc\\x15\\xf6\\x6c\\x75\\x60\\x40\\x34\\x55\\x56\\x9f\\xb0\\x2a\\x82\\xa0\\x2a\\xdb\\x93\\x7a\\x82\\x02\\x92\\x82\\x0a\\xd8\\xf2\\xbd\\x2f\\x24\\xa8\\xb1\\x9a\\x14\\x19\\x2e\\xb5\\x83\\x5f\\x03\\xa4\\xaa\\x57\\x4c\\x67\\xe0\\x44\\x37\\x6b\\x10\\x2e\\x70\\xb2\\xd9\\x79\\xad\\x42\\x95\\xca\\xb3\\x3a\\x57\\xa6\\x0d\\x98\\x7c\\x79\\xdb\\xf4\\x91\\x56\\xd5\\x69\\xbd\\x91\\xfa\\x81\\x18\\x66\\xed\\xc2\\x50\\x65\\x81\\x72\\xcc\\xc2\\x7c\\x0b\\x8a\\x9e\\x20\\x3f\\x69\\x6c\\x31\\x62\\x43\\xc3\\xea\\x55\\x3c\\x0a\\x55\\xb1\\x4c\\x59\\xae\\x8a\\x09\\x0d\\x03\\xe5\\xe6\\xc1\\xe3\\x61\\xa2\\x72\\xbb\\xe0\\x5f\\x0f\\xc7\\x68\\x85\\x46\\x81\\x60\\x76\\x22\\x17\\xac\\xc9\\x0a\\xe4\\xe9\\x40\\xb2\\x82\\x9b\\x49\\x11\\x8e\\x67\\x74\\xf8\\x62\\x33\\xd4\\xa6\\x50\\x77\\x01\\xcf\\xe3\\x7a\\x05\\x9b\\xf7\\xa7\\x3a\\x85\\x0a\\x91\\x83\\x4e\\x0a\\x61\\xd2\\xd0\\x4d\\x8c\\xf0\\x9b\\x4c\\x03\\xc7\\x20\\xb8\\x23\\xaa\\x58\\x88\\x3b\\xda\\x62\\x04\\xd4\\x85\\xd3\\xa7\\xe6\\xe5\\x03\\x8a\\xd9\\x02\\x11\\x72\\x30\\xac\\xd1\\x95\\xb9\\x41\\x4c\\x0c\\xb0\\x3c\\x66\\x5c\\x5d\\xb8\\x51\\xc1\\xa7\\x44\\x4d\\x3e\\x48\\x1d\\xa1\\x57\\x44\\xa6\\x92\\xe2\\x1c\\xbd\\xa1\\x42\\x4b\\xa6\\x49\\x23\\x25\\x35\\xa6\\xd7\\x58\\xb8\\xd3\\xca\\xe5\\x91\\xdb\\x4e\\x1a\\x67\\xb3\\xbb\\xce\\x30\\x05\\xea\\x22\\x7d\\x51\\x12\\x9c\\xfd\\x8d\\x3b\\x5d\\xae\\x6f\\x74\\x5a\\xef\\x33\\x46\\x85\\xe7\\x16\\x87\\xf3\\x38\\x83\\x06\\x81\\x12\\x87\\xec\\x26\\xcb\\xc5\\x84\\xa6\\xaf\\x32\\x39\\xad\\xdd\\x73\\xde\\xbf\\xd2\\xab\\xab\\x78\\xf3\\xb3\\x3c\\x76\\xad\\x87\\xde\\xdc\\xbd\\xda\\xc6\\x6e\\x90\\xe8\\xbc\\xd8\\x44\\x69\\x8a\\x64\\x32\\x3c\\xca\\x0c\\x28\\xe2\\x4c\\x29\\xc0\\xfd\\x6c\\x92\\x7d\\x75\\x86\\xd3\\x0a\\x58\\xe7\\x71\\xae\\xcd\\x11\\x1f\\x16\\xdc\\xe0\\xf3\\x2d\\x3c\\x19\\x63\\x4b\\x28\\xc2\\x6a\\x52\\xf4\\xbb\\xa8\\x02\\xe8\\x88\\xa1\\xef\\x9a\\x5b\\x1c\\x15\\x4c\\x70\\x36\\x35\\x30\\x56\\x52\\xcc\\xb3\\xe2\\x36\\x9b\\x78\\xb1\\xb1\\x24\\x74\\x74\\xa0\\xfb\\x35\\x8f\\xc7\\x56\\xf0\\xd1\\x97\\xb7\\xb9\\xd3\\xe4\\x76\\xaa\\x8f\\xea\\x52\\x5b\\x7f\\x69\\x39\\x51\\x6e\\x2e\\x61\\x95\\x12\\xd7\\x6b\\x41\\x57\\x17\\x54\\xa3\\x90\\x62\\x42\\xe0\\x8c\\x66\\x9e\\xa0\\x7a\\x24\\xbd\\xc4\\xff\\x75\\x5b\\x68\\xa8\\x8d\\xbe\\x5b\\x11\\xe5\\x83\\xf0\\x9d\\x02\\xbb\\x7e\\x12\\x39\\x29\\xc1\\xc3\\xb9\\xce\\x08\\xa6\\x9d\\xc0\\xed\\x69\\x80\\x3a\\x21\\x8c\\x1d\\xce\\x7e\\xb2\\xdd\\x95\\xd2\\x2d\\xdb\\x4a\\x59\\xe4\\x54\\xae\\xb5\\xd1\\x70\\x9d\\x61\\x0d\\xf5\\xe5\\x82\\x1f\\x60\\x7d\\x54\\x5f\\x38\\x40\\x57\\x98\\x35\\x20\\x98\\xbc\\xac\\x2a\\xc8\\xaa\\x44\\x68\\xc9\\xeb\\xaa\\xf2\\x91\\x55\\xfd\\xa9\\xd7\\x41\\xd6\\x0d\\xb0\\xaa\\x2e\\x0c\\x29\\x8e\\x94\\x8a\\x01\\x3f\\x82\\xfd\\xeb\\xb4\\x27\\x50\\xf8\\x09\\x43\\x0e\\x2e\\xac\\x40\\xa5\\x61\\x61\\xb2\\x83\\x5a\\xc6\\xaf\\x27\\xe2\\x54\\x8b\\x90\\x44\\x36\\x15\\x11\\x27\\x19\\x4e\\x65\\xb0\\xc4\\xf0\\x2f\\x29\\x0f\\x05\\x92\\xf1\\x36\\x90\\xac\\xde\\x0d\\x37\\x97\\x53\\x76\\x1c\\xc1\\xd1\\x94\\x32\\x5b\\xa3\\xfc\\xb9\\xd3\\xf6\\xac\\x51\\x77\\xbc\\x07\\x8b\\x9c\\x47\\xe5\\x6e\\xfd\\x14\\x59\\x04\\x1a\\x68\\x56\\x0d\\x58\\x8c\\x59\\xcd\\x00\\x81\\x81\\xbf\\xc0\\x19\\x40\\xe2\\x11\\x0e\\x96\\xd5\\x7f\\x28\\x3a\\x53\\x32\\xbc\\xbf\\xc9\\xa7\\x99\\x8a\\xe0\\x93\\x89\\x10\\xcb\\xcf\\xcd\\xe5\\x13\\xfe\\xfe\\xea\\x9a\\x04\\xf3\\x8d\\xf0\\xa7\\xee\\xf6\\xa2\\x62\\xbd\\x71\\x7d\\xe1\\xb2\\x04\\x3e\\x2e\\xc8\\xa0\\x22\\x5e\\x51\\x35\\xa1\\x4c\\x36\\xf1\\x1e\\xf5\\x81\\x6f\\x77\\x8b\\xc7\\xcb\\xcd\\x32\\x44\\xd5\\x90\\xfa\\x91\\xcf\\xa4\\x2d\\x16\\x1b\\x5d\\x32\\x23\\x90\\xff\\xf5\\x88\\x9c\\x9b\\x4e\\xa6\\xec\\x8f\\xe8\\x74\\xc4\\xa4\\xdc\\x3d\\x3b\\xa3\\x41\\x96\\x2a\\x0a\\x01\\xaa\\x05\\x59\\x28\\x47\\x0b\\x74\\x81\\x6c\\x17\\xb1\\x84\\xe3\\xb0\\x20\\x97\\xf9\\xe0\\x21\\xbd\\xea\\x31\\xa6\\xdb\\xc1\\xc2\\x8d\\x43\\x82\\x9f\\x7e\\x9c\\x62\\x30\\xc5\\x83\\x2b\\x22\\x16\\x26\\x3c\\x9b\\x90\\x26\\x02\\xdb\\xc6\\x60\\x7e\\x9d\\xd7\\xc4\\x14\\xb0\\x3a\\x67\\xda\\xc4\\x93\\x50\\x93\\x0a\\x11\\x10\\xe0\\xae\\x82\\x27\\x0d\\x35\\xd7\\x17\\x91\\x64\\x23\\x96\\xad\\x32\\x06\\x92\\x0f\\xe0\\x72\\xe7\\x6c\\x2c\\x7c\\xca\\x6d\\x2c\\xee\\xf6\\x8e\\xc6\\xa6\\x73\\x13\\x36\\xe8\\xc8\\x92\\x5f\\xf7\\x51\\x0d\\x65\\x17\\xd5\\x10\\xbd\\x6b\\x14\\x3d\\xc8\\x5d\\xd0\\xc0\\x7e\\x04\\xa3\\x00\\x8b\\x60\\x86\\x13\\x07\\xd8\\x07\\x5b\\x66\\x94\\x18\\x66\\x6d\\x68\\x7d\\xcd\\xd7\\x12\\x1c\\x48\\xf9\\xfa\\xb3\\x06\\xe8\\xa9\\x8e\\x57\\xe3\\x31\\x58\\x71\\x93\\xcf\\x1a\\xdc\\xa0\\x06\\xbe\\x36\\x5e\\xd6\\x98\\x93\\x28\\xb3\\x51\\xe2\\x5a\\xc0\\xfd\\x82\\xf7\\x9b\\x05\\xb7\\xd8\\x02\\xff\\x46\\x95\\xde\\x60\\x5d\\xa8\\x6e\\x06\\xbc\\xb3\\xcf\\x4d\\x7a\\x83\\xd3\\x8e\\x37\\xea\\x87\\x9d\\xb2\\x81\\x41\\x29\\x21\\x48\\x7e\\xb6\\xda\\x1d\\x04\\xce\\x2b\\x73\\x70\\x9b\\xbe\\xea\\x91\\x9e\\xdb\\x79\\x9b\\x5e\\x43\\x46\\x18\\xd5\\x23\\x38\\x4d\\xa1\\x98\\xac\\x21\\x98\\x08\\x75\\x14\\x7c\\x5d\\x56\\x45\\x02\\xae\\x6b\\xcc\\x1a\\xb6\\x15\\xc8\\x5f\\x6f\\x93\\x53\\xab\\x8b\\xf5\\x25\\x89\\xa0\\xeb\\x5a\\xfe\\x81\\x12\\x5b\\x5a\\xaf\\x26\\xbf\\xc9\\x52\\x2b\\x6b\\xe0\\x88\\xdf\\xbf\\xbc\\x69\\x25\\x5c\\x69\\x87\\x91\\x9c\\xc8\\x1b\\xa1\\x14\\xc3\\x35\\x43\\xf6\\x0d\\xc9\\xe8\\xde\\x67\\x37\\x43\\x5a\\x96\\x81\\x27\\x72\\xea\\x7b\\x18\\x91\\xd4\\x61\\x06\\x7b\\xc1\\xbc\\x93\\x7d\\x85\\x79\\x16\\x11\\x00\\x9e\\x8e\\xc9\\x54\\xc8\\xbc\\x1a\\x90\\xa2\\x76\\x00\\xce\\xeb\\x25\\xcc\\x59\\x40\\x7d\\x43\\xe9\\x3d\\x6d\\x06\\x55\\xde\\x29\\xc1\\x69\\x66\\xb4\\xa4\\xe2\\x2e\\x34\\xb4\\x44\\x23\\xcb\\xed\\x73\\x03\\x47\\xa1\\x12\\x1a\\xe1\\x75\\x73\\x33\\xc2\\xfe\\x66\\x78\\x72\\x8d\\xc7\\xbb\\x9e\\x78\\x6d\\xe1\\xbc\\xca\\xd1\\x38\\x0d\\x78\\x39\\x55\\x74\\xf3\\x3b\\xd1\\x2d\\xee\\x89\\x6e\\x7c\\x2d\\xba\\x89\\x84\\x2e\\x8c\\x5e\\x34\\x82\\xc4\\x96\\x50\\x44\\xe6\\xad\\x60\\x0e\\x95\\xcd\\x0b\\xc2\\x46\\xc2\\xd8\\xc4\\xe9\\xb6\\xe8\\x76\\xbe\\x13\\xde\\xaa\\x6a\\x43\\x0e\\xef\\xe9\\x9b\\xdb\\x0a\\xc4\\x55\\x02\\xc9\\xee\\x00\\xd2\\x2a\\x93\\x47\\x72\\x9a\\x5a\\x10\\x78\\x46\\xbe\\x9a\\x90\\x27\\x04\\x27\\x05\\x15\\x5e\\xcf\\x5b\\x4c\\x81\\x45\\xfe\\x0a\\x18\\xd6\\x52\\x33\\x19\\xf8\\xc9\\xa6\\xd0\\x38\\x35\\x63\\x39\\xce\\x70\\x8d\\xce\\xb4\\xd8\\xc8\\xa9\\xe3\\xa0\\xf8\\x24\\x0c\\xf4\\xb6\\x93\\x3e\\x57\\x90\\xa8\\xd9\\xe4\\x84\\x7c\\x3a\\xb0\\xe8\\xb1\\x61\\xcd\\x00\\x47\\x55\\xa5\\x26\\x42\\x44\\x31\\xd2\\xbc\\x08\\x33\\x3a\\x93\\x32\\x8d\\x25\\x8f\\x50\\x39\\xd4\\xd5\\x41\\x46\\x84\\x0b\\x78\\xd7\\xc3\\xac\\x09\\x44\\x15\\x44\\x42\\x74\\x38\\xdf\\x34\\x09\\x22\\x85\\xbc\\x27\\x98\\x1a\\x48\\x37\\xb4\\x98\\x23\\x58\\x91\\x2b\\x5c\\x7d\\x0b\\x22\\x67\\x73\\x8b\\xd4\\xc1\\x55\\x16\\xe2\\xc4\\x15\\x42\\x0c\\xf2\\xed\\x40\\xaf\\xb7\\x9a\\xae\\x43\\xda\\x45\\x5c\\x70\\xcb\\x14\\x00\\x5a\\x6e\\x6b\\xd3\\xbc\\xe0\\x4e\\xb3\\x46\\xbd\\xa7\\xe6\\x3b\\x08\\xed\\x98\\xc0\\xc5\\x68\\xbd\\xe1\\xe0\\x07\\x76\\x61\\x0c\\xaa\\x99\\x9b\\x84\\xa4\\x31\\x9b\\xbc\\x12\\xd4\\x0a\\x1d\\xc6\\x79\\x9c\\x0a\\xc2\\xe0\\x14\\x5d\\xf2\\x0c\\x48\\x2e\\xb2\\x6d\\x01\\x8e\\x5b\\x72\\x9d\\x5b\\x44\\xa7\\x3a\\x4f\\x7a\\x44\\xc6\\x23\\x4c\\x44\\xe3\\xc8\\xe0\\xe4\\x7f\\x24\\xac\\x6a\\xee\\x44\\xdc\\x55\\x43\\xbd\\x97\\xdd\\x30\\xd6\\x85\\x11\\x0c\\x4d\\x8b\\x95\\x07\\xaa\\x6b\\x96\\x3c\\x3c\\x45\\xf5\\x7b\\x4e\\xde\\xc0\\xf5\\xc0\\xcd\\xf0\\xab\\xcc\\x13\\x42\\x52\\x15\\x57\\x23\\xf4\\x5c\\xe6\\x2e\\x02\\x21\\xa4\\x5e\\xd2\\xd0\\x34\\x52\\x7d\\x68\\x23\\xf5\\x20\\x80\\x10\\x00\\x35\\xb3\\x54\\xb3\\x06\\xcb\\x2a\\x8b\\x06\\x1d\\x78\\x24\\x8a\\xb1\\x14\\x37\\x78\\xb1\\xaf\\x37\\x13\\x14\\x79\\xbf\\xbb\\x31\\xb4\\xf2\\xf8\\x29\\x36\\x5f\\x84\\x62\\x34\\xc2\\x57\\xf9\\x11\\x9c\\xb9\\x60\\x45\\xb9\\xec\\x38\\x00\\x52\\x9c\\x29\\xf2\\xbb\\x4c\\x28\\x85\\xf3\\xb8\\xc4\\xe2\\x95\\xc5\\x5d\\xb5\\x4b\\x5c\\xb4\\x57\\x48\\x1c\\x7e\\x9f\\xeb\\xf2\\x25\\x43\\x2b\\x4d\\x3e\\xab\\x36\\x38\\xa7\\x5d\\xbe\\x30\\xa2\\x2c\\x67\\x18\\x76\\x71\\x2d\\x2a\\xf6\\x33\\xf2\\x97\\x55\\x3d\\x43\\xe3\\x45\\xaa\\x5e\\x42\\xd8\\x50\\x37\\x2e\\x1d\\xea\\x4d\\xab\\x21\\x78\\x8f\\x84\\xd5\\x9d\\xf1\\x09\\x31\\xa2\\x75\\x14\\x24\\x67\\x83\\xb0\\x54\\x15\\x4e\\xe7\\x43\\x82\\xb4\\xee\\x14\\xd5\\x06\\xac\\xcf\\x85\\xd5\\x2a\\x7a\\xfd\\x3d\\xa0\\x13\\xf8\\x03\\x9e\\xda\\x30\\x22\\xd6\\x11\\x1e\\x55\\x65\\x2b\\x7c\\xed\\x2f\\x9d\\x7b\\xec\\xea\\xde\\xb0\\x2f\\xb0\\x55\\xb7\\x33\\xa8\\x01\\xf5\\x8e\\x98\\x6a\\xa8\\x51\\xa6\\xe6\\xd8\\xa4\\xea\\x07\\xb9\\xf8\\x2c\\x80\\x92\\xf0\\xb3\\x88\\x44\\xa1\\xe2\\x93\\xb4\\x1a\\x43\\xf7\\xfa\\x51\\xf7\\xa5\\xd1\\xc2\\x32\\x57\\x2a\\x0f\\x2d\\xa9\\x93\\x23\\x93\\x82\\x1a\\x56\\x70\\xdf\\xf1\\x07\\x07\\x28\\x01\\xb3\\x29\\x5b\\x12\\xd2\\x37\\xbd\\x53\\x2a\\xed\\xd8\\x48\\x77\\x1d\\x66\\x92\\x46\\xae\\xc1\\xf8\\x28\\xdd\\x97\\x60\\x7c\\xe0\\x11\\xc2\\x5b\\x33\\x04\\x86\\x92\\x91\\xa1\\x6f\\xb4\\x15\\x66\\x84\\x91\\x34\\x0e\\xa5\\x8c\\x94\\x48\\xee\\x6b\\x6b\\xcd\\x48\\x15\\x18\\xca\\x6a\\x38\\x05\\x46\\xca\\x23\\xfc\\x7a\\xac\\x74\\xca\\xd5\\x1b\\x2b\\xc3\\xe8\\x99\\xa6\\x5d\\xfc\\x4a\\x5c\\x28\\x95\\xb1\\x56\\xd8\\x41\\x21\\xa5\\x91\\x74\\x9a\\x11\\xbc\\x5e\\x47\\xf8\\x63\\xc8\\x79\\x8a\\x98\\x15\\xb6\\x5c\\x1e\\xfe\\xba\\xa9\\x94\\xe5\\xb4\\x3b\\xb4\\xe8\\x77\\x9b\\xcd\\x6a\\x6b\\x87\\x32\\x26\\x78\\x1e\\x09\\x41\\xa2\\x6a\\xcd\\x96\\xa1\\x23\\xad\\x16\\x61\\x77\\xfb\\x53\\x44\\xbd\\x08\\x4c\\x61\\x89\\x2e\\xfa\\x09\\x31\\x74\\xcd\\x5e\\xab\\x0c\\x68\\x4d\\xb3\\x6d\\x7e\\x27\\xb9\\x4e\\x16\\x9a\\x35\\x15\\x76\\x53\\xd3\\x2a\\x50\\x1e\\x7d\\x30\\x4c\\x7e\\x12\\x66\\x8d\\x0d\\x0b\\xbf\\x3d\\x03\\xbb\\xb6\\x50\\x55\\x62\\x98\\x50\\xe6\\xe4\\x8c\\xe0\\xc9\\xd1\\x7b\\x53\\x78\\x44\\x7e\\x81\\x4d\\xd8\\xbd\\xea\\xb5\\xf9\\xab\\x6a\\xac\\xe0\\xd0\\x79\\x8c\\x14\\x4d\\x2a\\x02\\x42\\x48\\x61\\x44\\x2d\\x31\\x14\\x73\\x40\\x58\\x7b\\x49\\xc8\\xc8\\x98\\x47\\x1b\\xe5\\xce\\xa4\\x4a\\x83\\x97\\x6b\\xb6\\xe6\\x2d\\xf1\\x2d\\x6f\\x49\\xa9\\x1b\\x78\\xed\\xff\\xee\\x24\\xd9\\xb0\\xbb\\x3d\\x91\\xca\\xc2\\x8e\\xd6\\x34\\x8a\\x61\\x75\\xad\\x0f\\x2d\\xbf\\xda\\x79\\x5c\\xd8\\xc1\\xe7\\x29\\x13\\x82\\xfb\\x0d\\x52\\x08\\xce\\xc8\\x27\\x68\\x80\\x7a\\xc6\\x16\\x9a\\x8d\\x5c\\x86\\xe0\\x0b\\x76\\xaa\\x6f\\x0d\\x22\\x57\\xad\\xa5\\x66\\x88\\xd3\\xce\\x14\\x59\\xc3\\xbf\\xa3\\x34\\x69\\x26\\xb6\\xa3\\x9a\\x2a\\xd4\\x72\\xa6\\xfd\\x92\\xd5\\xe0\\xa2\\x19\\x53\\xae\\x3f\\x47\\x7a\\xa8\\x5d\\xb7\\xf3\\xfe\\x80\\xa3\\xdd\\xc5\\x06\\x52\\x55\\xcf\\xee\\x75\\xb2\\xd1\\xcc\\xb6\\xad\\x81\\xda\\xb2\\x6a\\x5d\\xf5\\xbd\\xc8\\xbb\\xa5\\x1b\\xb0\\x41\\xef\\xfe\\x9f\\xdb\\x11\\xbe\\xbc\\xb3\\x49\\x8b\\xa0\\x90\\x71\\x9a\\x69\\xa0\\x0c\\x97\\x02\\x4e\\x83\\xdc\\xa7\\xc3\\x5d\\xfd\\xbf\\xdd\\x91\\xd0\\xb5\\xdd\\x98\\x1d\\x4f\\x72\\xef\\x49\\x68\\x87\\x26\\x00\\x9e\\x7d\\x0b\\x06\\x5c\\x4f\\xc3\\x05\\x13\\x92\\xa1\\x12\\xa0\\x10\\x27\\x8e\\x93\\x60\\x56\\x0d\\x86\\xc7\\xdf\\x60\\x57\\x92\\xfa\\xc2\\xad\\x1f\\x69\\xa0\\xe0\\x2e\\x26\\x61\\xed\\x5c\\x0e\\x50\\xce\\x0f\\xa9\\xbf\\x62\\x34\\x2c\\x02\\x24\\x8e\\x56\\x93\\x32\\x56\\x77\\xe3\\xe4\\x48\\x43\\x9c\\xd4\\x2a\\xe7\\x5b\\xca\\x10\\x79\\x4f\\x93\\xad\\x2d\\xaf\\x03\\x3a\\x9a\\xad\\x36\\x0c\\xd7\\x1f\\x0b\\x0a\\xd1\\x3e\\xe1\\x57\\x88\\x71\\x36\\xb6\\xe8\\xff\\xeb\\x5d\\x54\\xd7\\x60\\x62\\xe7\\x4c\\x08\\x48\\xa5\\x90\\x18\\x46\\x4f\\xc3\\xa0\\xbd\\xd0\\xab\\x6a\\x22\\x97\\xa9\\x34\\x9b\\x9d\\x6a\\x34\\xc0\\x85\\x2b\\x9b\\x25\\x32\\xa1\\x70\\x0f\\x41\\xb8\\x21\\xc1\\xdd\\x88\\x45\\x14\\x48\\x3a\\x8f\\x13\\x38\\x87\\x22\\x82\\xe4\\xec\\xb3\\x6c\\x23\\x28\\x87\\x30\\x24\\xb0\\x28\\x92\\x1a\\xba\\x70\\xd8\\x50\\xa3\\x35\\x8f\\x24\\x07\\xfd\\xc3\\x2a\\x8e\\xe5\\x55\\x1c\\x8b\\x2d\\xe0\\x11\\xf6\\x66\\x84\\xa4\\x16\\x93\\x82\\xc0\\xa0\\x61\\x07\\x62\\xee\\xf0\\x9b\\x8d\\x34\\x5b\\xe4\\x71\\xe0\\xed\\x8c\\xb4\\x4f\\xbb\\x74\\xd2\\x91\\x57\\xaf\\x05\\xaf\\x16\\x8e\\xa5\\x46\\x3f\\x70\\xf5\\x8b\\x95\\x07\\xcb\\xd5\\x5f\\xe1\\x9d\\x46\\x8a\\x67\\x7d\\x25\\x0f\\x78\\xb5\\x39\\x50\\x9f\\x99\\x79\\x97\\x44\\xa6\\xb8\\x3d\\x0b\\xa4\\xf3\\x86\\x34\\xaf\\x20\\xf2\\x2e\\xe6\\x15\\xd8\\xb8\\x0e\\x88\\xc6\\x63\\xaa\\x93\\x86\\x31\\x38\\x83\\x14\\x87\\x4d\\xdb\\x9e\\xd4\\x5a\\xfe\\x3d\\xdb\\x24\\x23\\x6c\\x92\\x93\\x57\\x17\\x36\\x4d\\xe3\\xa7\\xa9\\xb9\\x90\\x23\\x0a\\x1c\\xd6\\x62\\xd9\\x13\\x62\\x0b\\xcd\\x02\\xf7\\x5c\\x2a\\xc5\\xc8\\x41\\x71\\x01\\x46\\x01\\xf3\\x0f\\x90\\x32\\x48\\xb3\\xb2\\xbd\\xa7\\xbe\\xdb\\x53\\xca\\xd7\\x79\\x6e\\x63\\x29\\xc8\\xb7\\x46\\x31\\x8e\\x56\\xc8\\x2d\\x1c\\xbd\\xc9\\xa9\\x86\\xcf\\x78\\xef\\x66\\xcf\\xaa\\xeb\\x75\\x13\\x23\\x90\\xd8\\x6b\\x1e\\x32\\xd8\\x02\\x76\\xf2\\x7a\\x55\\x23\\xb7\\xb1\\xc8\\xbb\\x84\\xfc\\x54\\x09\\x92\\xfd\\x9a\\xeb\\x82\\x52\\x53\\x1a\\x35\\xfb\\x90\\xa0\\x9b\\x58\\x67\\xab\\xe1\\x76\\xc2\\x09\\xc0\\xc0\\x32\\x78\\xa4\\x30\\x64\\x61\\x3f\\x43\\x1a\\x91\\xa2\\xb5\\x65\\xa2\\x15\\x71\\xc9\\xc2\\x92\\x56\\x92\\x86\\x8a\\x87\\x5c\\x7b\\x62\\x54\\x6b\\x5e\\x10\\xaf\\xe7\\x26\\xec\\xb9\\x81\\xcb\\x42\\xd5\\x38\\xaf\\x35\\x8e\\xc6\\x8c\\x36\\x20\\x0b\\xd0\\xa6\\x15\\x4d\\xb6\\x2e\\xf4\\x89\\xc2\\xd7\\x5c\\x61\\x85\\x05\\xa9\\x8d\\x42\\x2b\\xc0\\x1e\\x87\\x6a\\x72\\x6a\\x22\\x34\\xb5\\x48\\x66\\x08\\x4f\\x72\\x5c\\x2d\\x7a\\x14\\xa1\\xae\\x5e\\x2f\\x3d\\x66\\x31\\x02\\x00\\x28\\x64\\x70\\xae\\x14\\x82\\x26\\x72\\xa5\\x10\\xa7\\x1c\\x84\\x7e\\x00\\xcb\\xc4\\x99\\x4a\\x34\\xde\\x4d\\x55\\x03\\xc1\\x9b\\x56\\x00\\xe6\\x10\\xc8\\x84\\x23\\xf2\\x83\\x85\\xb2\\xfb\\xba\\x45\\xd6\\x50\\xa4\\x09\\x36\\xe1\\x62\\x60\\xb2\\x54\\x4c\\x85\\xbc\\x2c\\x2d\\xbf\\x2f\\x64\\x18\\xe5\\x52\\x34\\x8d\\x6b\\x4b\\x52\\x95\\xbc\\xf4\\xea\\xc1\\x84\\x0a\\xef\\xd3\\xfa\\x35\\x23\\x32\\x6a\\x90\\x0f\\x93\\xaa\\xfa\\xa8\\xf5\\x6a\\x6c\\x15\\x1a\\xb6\\x6a\\x71\\xaf\\x13\\x90\\x55\\x6f\\x5a\\x3e\\xdf\\x94\\x4d\\x45\\x5e\\x62\\xf8\\xbe\\x91\\xe7\\xab\\x0b\\x2f\\xac\\xb1\\xe6\\x7f\\xa1\\x12\\x56\\x0f\\x59\\x0f\\xb8\\xda\\xa5\\x0b\\xce\\xd7\\xf6\\x9e\\x96\\x0b\\x39\\xcf\\xda\\x52\\xbd\\x4b\\x34\\x9b\\x4c\\xfb\\xc1\\xcd\\x76\\xd7\\xea\\x5a\\x26\\xd9\\x75\\x35\\xdb\\xdd\\x18\\x1b\\x7e\\x9a\\x72\\xea\\xb1\\x3f\\xf5\\x35\\x26\\x4e\\x4e\\xa9\\xf7\\x83\\x44\\x08\\xa9\\x1f\\x15\\xd1\\x50\\x11\\xee\\xbe\\x7a\\x13\\x10\\xb4\\x5d\\xae\\xed\\x0b\\x3b\\xb7\\xc9\\x04\\xb1\\x59\\xd8\\x61\\x78\\x3e\\xa7\\x81\\x43\\x10\\x3e\\x4b\\xf3\\xb5\\x22\\x0a\\x65\\xd0\\x07\\x38\\x6e\\xca\\x53\\xf1\\xb7\\x75\\x19\\x25\\xef\\xfb\\xb3\\x17\\x3f\\x58\\xef\\xeb\\x22\\x5f\\xe0\\x7f\\x5c\\x20\\xfc\\x20\\x18\\x27\\xeb\\x60\\x71\\xcb\\xe3\\x4b\\x96\\xdd\\x65\\xc9\\x8d\\x6b\\xc8\\x1c\\x69\\x4a\\x23\\xb7\\xe4\\x2a\\x9d\\xd1\\x62\\xe5\\xc1\\x72\\xa2\\x2b\\xbc\\x4b\\xb5\\x2c\\x39\\x96\\xf6\\x2a\\x16\\x7d\\xb5\\x39\\x50\\xee\\xd3\\xf1\\x86\\x36\\x12\\xfc\\x30\\x93\\xa6\\xca\\x09\\xd0\\xb2\\xcd\\x9a\\x9d\\x2a\\x4c\\x36\\x55\\xa4\\x75\\x55\\x25\\xbb\\xda\\x1f\\x94\\xc1\\x83\\x37\\x35\\xf8\\x44\\x56\\x6c\\xd3\\xf2\\xf1\\xfa\\x5c\\x56\\xed\\xc5\\xc4\\x01\\xb9\\x31\\x40\\x6d\\x89\\x66\\xb0\\x4d\\x5e\\xd8\\xfa\\x15\\x63\\x71\\xcb\\xcf\\xa3\\x5e\\xf0\\x41\\x3d\\xa1\\xe0\\xa6\\xad\\xce\\x50\\x44\\x8d\\x06\\xa8\\x43\\x15\\xf4\\xc1\\x31\\xed\\x58\\x3f\\xa0\\xa8\\x66\\xad\\x6f\\x81\\x03\\xac\\xe9\\x89\\xa1\\xb4\\xe1\\x00\\x7a\\x6f\\x7c\\x0a\\x2d\\x35\\x91\\x2a\\x0c\\x19\\xba\\xe1\\x96\\x4f\\x48\\x73\\x21\\x20\\xf5\\x10\\xeb\\x3c\\xa7\\x04\\x0a\\x6d\\x5a\\xb4\\xb6\\xba\\xb0\\x37\\xee\\x33\\xe5\\xa6\\xd6\\x01\\x2b\\xd3\\xf2\\x0c\\xe6\\x3c\\x5b\\xaf\\x3e\\xd1\\xe4\\xdc\\x84\\x8c\\xcd\\x48\\x9c\\x9a\\x4d\\xad\\x2b\\x63\\xe0\\x29\\x9f\\xc7\\x91\\x4d\\x1a\\x59\\xb0\\xd8\\xd4\\x94\\x67\\xed\\xea\\x47\\x9e\\x11\\xab\\x2f\\xc8\\x7b\\x67\\x95\\x4e\\xab\\xd9\\x6f\\x3f\\x05\\x93\\x6e\\x95\\xe6\\xae\\x53\\xad\\x51\\x55\\x65\\x65\\x88\\x26\\xc1\\xe9\\x9d\\x35\\x74\\x5c\\x6b\\x18\\x60\\xad\\x57\\x17\\x3e\\x67\\x13\\x13\\x63\\xd1\\x85\\x34\\xfc\\x91\\x59\\xbd\\xff\\xab\\x9f\\x34\\xce\\xb6\\xf9\\xec\\xb3\\x9b\\x5b\\x36\\x09\\x9a\\x7c\\x35\\x2c\\xe8\\x42\\xb3\\x33\\xc1\\xf9\\x1a\\x94\\x41\\xf8\\x3a\\xa4\\x89\\x84\\x94\\x45\\xa6\\x66\\xc4\\xeb\\x92\\xfa\\xfe\\x33\\xcd\\x36\\x45\\xc3\\x8c\\x18\\x02\\xb8\\x7f\\xea\\xa9\\x61\\x9b\\x31\\xc8\\x56\\xe0\\xbe\\x80\\x6a\\x39\\x92\\xee\\x45\\x30\\x37\\x47\\x5e\\xd8\\x05\\xb9\\x61\\xc2\\x69\\x42\\x90\\xca\\x57\\x17\\x69\\xfb\\xdd\\xe6\\x50\\x5d\\xc1\\x02\\x8a\\xe9\\xda\\x0b\\x36\\xb3\\x66\\x09\\x88\\x86\\x5d\\x36\\xd1\\xd3\\x8c\\xb0\\x74\\x4a\\x93\\x06\\xe7\\xc4\\x96\\x35\\x83\\xd2\\xcc\\x6a\\xfb\\x8a\\x88\\x21\\x50\\xc7\\x26\\x64\\x85\\x8e\\xde\\xcf\\x36\\x82\\xa7\\x84\\xf3\\x86\\xa6\\xd6\\xd0\\x6e\\xf2\\x6c\\xb5\\x5f\\x58\\x5f\\x53\\x1b\\xce\\x72\\x0a\\x8d\\x5c\\xda\\x80\\x9c\\x41\\x81\\x5a\\xbe\\x18\\xb7\\xbb\\x53\\x81\\x94\\xcc\\x69\\x7c\\x3d\\xec\\x81\\x2d\\xdd\\x15\\x23\\x81\\x53\\xfb\\x49\\x33\\x5a\\x69\\xdb\\xac\\x89\\x49\\x03\\x26\\x10\\x20\\x2a\\x67\\x85\\x4e\\x39\\x4c\\xb4\\xbd\\x32\\x17\\x81\\xc9\\xa4\\x54\\x17\\xa2\\x35\\xdb\\x28\\x42\\xb8\\xb8\\xb8\\x99\\x35\\xcd\\x9b\\xcb\\xbb\\x80\\xfc\\xa8\\xd2\\xf5\\xce\\x53\\x85\\xb9\\x5c\\xf3\\x23\\x04\\x8e\\xbd\\xaa\\xdc\\x47\\x4d\\xb5\\xe9\\x9b\\xe1\\x52\\x84\\x97\\x16\\x4c\\x60\\x53\\x95\\x1d\\x82\\xc8\\x07\\x5f\\x95\\x5d\\x8c\\xae\\xc6\\xdc\\xad\\x89\\x0a\\x81\\x6f\\x34\\xf3\\x1c\\x2e\\x23\\x6e\\x86\\xfa\\x11\\xf8\\x7c\\x1e\\x07\\x21\\xc5\\x70\\x2d\\x0a\\x6a\\x22\\xb1\\x25\\x34\\xbd\\xea\\xac\\xa1\\x05\\x9a\\x5a\\x5c\\xcd\\xa0\\x76\\x5d\\x4c\\x9a\\x6d\\x5b\\xe0\\x96\\xc9\\x47\\xc0\\xe4\\xe9\\x6d\\x30\\x29\\xab\\xce\\xac\\x06\\x53\\xd5\\xa3\\x87\\xc8\\x68\\xae\\x97\\x4c\\x33\\x43\\xf9\\x9a\\xdc\\x40\\x3e\\x2f\\xd0\\x78\\x26\\x81\\x80\\xba\\xb2\\x44\\xc0\\x4f\\x46\\xd3\\x6a\\x35\\xf3\\x09\\x40\\x24\\xa9\\x58\\x80\\xb0\\xc9\\x24\\x0b\\x1b\\x2d\\x69\\x26\\xcd\\x0a\\x6e\\x82\\x92\\x47\\x42\\x8a\\x14\\x27\\x82\\x9f\\xd3\\x2e\\xfa\\x62\\xce\\xed\\xee\\xc2\\x18\\x84\\xb0\\xa7\\x48\\x46\\x3d\\xbf\\x58\\x2e\\x3d\\xa4\\x53\\x91\\xd9\\x8d\\xfa\\x44\\xa2\\xc4\\xc0\\x6c\\x4b\\xb3\\xa5\\xc2\\x13\\x21\\xaf\\xe2\\x8e\\x16\\x0f\\x68\\xa9\\x6f\\xd5\\x18\\x82\\x5a\\x1b\\xca\\x32\\x24\\x32\\xb8\\xdf\\x24\\xb7\\x8e\\x53\\x35\\x95\\xc3\\x9a\\x37\\xbc\\xb6\\x8c\\x32\\xa5\\xa8\\x9e\\x56\\x25\\x2c\\x72\\x42\\x2f\\xe7\\x4c\\x26\\xc5\\x85\\x9c\\x47\\x75\\x97\\x5d\\x3e\\x22\\x52\\x83\\x20\\x0b\\xa8\\x62\\xf4\\x0d\\xe7\\x6b\\x39\\x89\\x67\\xb7\\x4f\\xa2\\xee\\x92\\x10\\x08\\x36\\xba\\xba\\x08\\x26\\xba\\xb4\\x50\\x45\\x54\\xb3\\xaf\\x6e\\xa0\\x22\\x74\\x18\\xce\\x3f\\xce\\x8d\\x78\\x40\\x7a\\x04\\xa4\\xd5\\xf2\\xb5\\xde\\xa7\\xfd\\xe6\\xb4\\x0e\\x24\\xdb\\x5a\\x83\\x00\\x84\\x86\\x25\\x1f\\x50\\xb3\\xa3\\x78\\xf8\\xc9\\xa8\\x88\\xb1\\x70\\x72\\x83\\x4d\\xfe\\x08\\x26\\xec\\x6a\\xbd\\x9c\\x90\\xb5\\x79\\x7d\\xb5\\xdd\\x6b\\x9f\\x4e\\xeb\\x6f\\x1d\\xe9\\x95\\x6a\\x3c\\xa5\\xa5\\x44\\x37\\x70\\xa1\\x5d\\xa9\\x0a\\xe1\\x4c\\xca\\x0c\\xf5\\x67\\x0d\\xad\\xd0\\x84\\x05\\x23\\xed\\x20\\x5e\\x89\\x50\\x20\\xb2\\xc7\\x14\\x55\\x4e\\x52\\x2c\\x08\\x0d\\x17\\xb7\\xe4\\x3a\\x10\\x2a\\x91\\xdd\\xce\\x06\\x32\\x6a\\x18\\xd5\\xac\\x7f\\xba\\x73\\x28\\xcb\\x81\\x10\\x44\\xe4\\xbd\\x52\\x16\\xc4\\x68\\xa2\\x75\\x86\\x02\\x6e\\x89\\xa1\\x11\\x5c\\xad\\x81\\xe0\\x76\\x6e\\x9e\\x3e\\xc8\\x77\\xc8\\xb2\\x9a\\x11\\xc4\\x28\\x34\\xd0\\x99\\x5c\\xf2\\x20\\xd7\\x0b\\x7c\\x38\\xac\\x75\\x6e\\x0e\\xd5\\x14\\xf8\\xc6\\xa3\\x3a\\x86\\xc8\\x45\\xa8\\x17\\x25\\xf7\\x55\\xee\\xa2\\x08\\xef\\xe1\\x08\\x97\\xfa\\xb2\\x07\\xef\\x35\\xc6\\x53\\xc4\\x7b\\xe2\\xca\\xe0\\x79\\xb3\\xa7\\xc6\\x52\\xe7\\xad\\x78\\x83\\x7f\\xfc\\xc9\\x37\\xcf\\xba\\xca\\x3f\\x39\\xac\\x60\\xed\\xa4\\xb7\\xa6\\xbd\\x62\\x83\\x84\\x1a\\x7e\\xd6\\x7c\\xf9\\x13\\x91\\x6b\\xa9\\x0b\\x6d\\xa1\\x19\\xc2\\x55\\x6d\\xea\\xc1\\xb0\\x0b\\xa1\\xad\\x2a\\xf8\\x40\\x1e\\x59\\x51\\x7e\\x2b\\xe2\\x04\\x41\\x29\\xd7\\x96\\x5f\\x95\\x2a\\x5f\\x5d\\x70\\xf4\\xeb\\x78\\x36\\x7a\\xa3\\xfa\\x62\\x94\\x3d\\x50\\x44\\x08\\xf5\\x6f\\xc9\\x06\\x71\\x06\\xa6\\xd4\\x19\\xbf\\xc0\\x6b\\x40\\x51\\x78\\xbe\\x56\\xeb\\xa8\\x8b\\xfe\\xea\\x79\\x79\\x24\\x35\\xdf\\xb3\\xbe\\x50\\x98\\x5b\\xdd\\x08\\x52\\x32\\x99\\xe2\\xc2\\x9e\\x07\\xef\\xfd\\xe2\\x93\\x1f\\x38\\x22\\xb1\\x8c\\x1f\\x3c\\x0b\\x4f\\xe3\\x59\\xa4\\x93\\xbc\\x58\\x5f\\xe0\\xd7\\x9e\\x16\\xaf\\x72\\x88\\xd7\\xba\\x47\\xb4\\x30\\x97\\xa1\\x20\\xea\\x84\\xcb\\x60\\x8b\\xdf\\xb0\\xc1\\xcb\\x4c\\x3a\\xd5\\x4f\\xb9\\x56\\xba\\x89\\xd4\\xc5\\x1e\\x69\\x9c\\x5d\\x52\\x5d\\x30\\x15\\x6a\\xc1\\x9c\\x39\\x4e\\x84\\x4b\\xc9\\xdc\\x52\\x7e\\x35\\x0a\\x44\\x2d\\x4b\\x35\\xef\\x72\\x50\\x29\\xa1\\xa1\\xc6\\x20\\x27\\x78\\xb3\\xc2\\xd4\\x52\\x91\\x95\\x3b\\x0d\\x1e\\x21\\x44\\x31\\x0e\\x36\\xb1\\x5f\\x28\\x46\\x84\\x4c\\x73\\xe4\\x29\\xa1\\xa8\\x04\\xbe\\x54\\x46\\x20\\xc3\\x56\\x8e\\x3b\\x0f\\xf3\\xa5\\x8c\\x90\\xae\\x65\\x68\\x46\\x3a\\x96\\x08\\xbd\\x9c\\x48\\xa8\\x1e\\xa2\\xa9\\xd0\\x33\\xc1\\xb8\\x47\\x4e\\xa4\\x53\\xd7\\x14\\xef\\x77\\x5a\\xfb\\x82\\x89\\xa6\\x81\\x5b\\x79\\x0c\\x36\\x2a\\x64\\x60\\xe0\\x16\\xe7\\xed\\xd7\\x8c\\x67\\x55\\x18\\xa3\\x59\\xe4\\xb3\\xb2\\x96\\xc4\\x88\\x08\\x28\\x86\\x2e\\x42\\xee\\x29\\xf1\\x42\\xde\\x0f\\x44\\x3c\\xc1\\x6f\\x0a\\x3d\\xc0\\x0f\\x14\\x0c\\x42\\x56\\xc1\\x06\\x8c\\x73\\x31\\x9a\\x3c\\xab\\x04\\xc3\\xea\\xfb\\xa3\\xbe\\x7b\\x55\\x9d\\x23\\x19\\xb8\\x16\\xc4\\xe4\\x3a\\xe5\\xb6\\x23\\x23\\x02\\x06\\x52\\x98\\xb0\\x30\\xef\\xf0\\xdd\\x6c\\x18\\xed\\x3a\\x1a\\x56\\xe1\\x75\\x0d\\xab\\x47\\x85\\x92\\x96\\x8f\\xc7\\x69\\x9d\\x17\\xf5\\xed\\xc4\\x6c\\x60\\x08\\x0a\\x2a\\x81\\x68\\xa8\\xe7\\xac\\x0e\\xd7\\x1a\\x51\\xac\\x4e\\x14\\xea\\x7e\\x03\\x45\\xf2\\xac\\x39\\xfd\\x44\\x44\\x98\\xa0\\xc1\\x80\\x75\\xb6\\x6a\\x5a\\x15\\x5b\\x8a\\xa6\\xa7\\xdb\\x3e\\x8d\\x4e\\x03\\x94\\xd6\\xb4\\xcc\\xb2\\x32\\x26\\x1e\\xa9\\x56\\xc3\\x29\\x0d\\xde\\x55\\xc0\\x50\\x13\\xeb\\x41\\x51\\xf9\\x18\\xc0\\xf7\\x6a\\x06\\xbf\\xc6\\xc1\\xc6\\x78\\x6d\\xf4\\x5d\\xd3\\x6c\\xa6\\xc6\\x8e\\x86\\xda\\x4a\\x32\\x21\\x51\\xde\\x9a\\xb2\\x5c\\x93\\xcf\\x6a\\x48\\x4d\\xd2\\x9c\\xa6\\xb9\\xc0\\x13\\x7f\\x89\\x48\\xed\\x79\\x23\\xf5\\xc5\\xea\\x5e\\xba\\x6f\\xec\\x0d\\xc4\\xa3\\x4d\\x02\\x2b\\x48\\x61\\x18\\xd6\\x70\\x04\\x75\\xe8\\x9a\\xd7\\xd4\\xb4\\xe0\\xa4\\xda\\xe1\\x57\\x39\\x08\\x40\\x7c\\x01\\x07\\x29\\x0c\\x45\\xd1\\xac\\x6a\\x74\\xac\\xc2\\xd9\\xb3\\xbe\\x20\\x0f\\xed\\x92\\xa2\\x05\\x53\\x4b\\x81\\x8e\\xf7\\x3a\\x03\\x7f\\xde\\xcb\\xc0\\xef\\xce\\xe3\\xe0\\x61\\xe7\\xe0\\x48\\x5d\\x36\\xf3\\x9b\\x91\\x87\\x14\\x05\\xe9\\x88\\x18\\xac\\xe1\\xda\\xda\\x05\\x37\\xe7\\x3d\\xed\\x1b\\x75\\x10\\x2a\\x0b\\x8a\\x89\\x6e\\x61\\x87\\xc8\\x63\\x68\\x6a\\xb6\\xe7\\xdf\\x69\\x30\\xe2\\xca\\xfa\\x21\\x25\\x7d\\x2a\\x60\\xa8\\xd4\\x73\\x15\\x70\\x70\\x6c\\x33\\x3a\\x19\\x33\\xae\\x2e\\x7e\\xd0\\x6c\\x79\\x44\\x92\\x53\\xe0\\x01\\x11\\xf1\\x50\\x9b\\xe6\\x09\\x7a\\x04\\x5a\\x33\\xdb\\xcd\\xb0\\x76\\x70\\x13\\xe5\\xf3\\x5a\\x26\\x09\\x8e\\x91\\xac\\x25\\x24\\x52\\x18\\x6d\\x36\\x94\\xa8\\x19\\x1a\\x08\\xb9\\xab\\x66\\xef\\x70\\x15\\x26\\x61\\x69\\x50\\x75\\x69\\x95\\xd7\\x1d\\x0a\\xef\\x6c\\xcf\\xba\\xaf\\xaf\\xe7\\xd3\\x8a\\xae\\xe5\\x66\\xd4\\xb8\\x50\\xac\\xa3\\xf7\\xd9\\xb0\\x5f\\x6c\\x21\\x1e\\x2c\\x93\\x5b\\x92\\x77\\x83\\xa5\\xad\\xf4\\xa7\\xd2\\x73\\x27\\xe1\\xec\\x4a\\xb6\\xa0\\x22\\xa2\\xe3\\xb8\\x10\\xf2\\x4d\\x50\\x28\\x22\\xd4\\x31\\xc4\\x2f\\x8e\\x0c\\xfd\\xe2\\xdc\\xdc\\x4a\\xf1\\x5c\\x9b\\x2f\\x19\\xa2\\x9e\\xf4\\x23\\xf5\\x9f\\x17\\x59\\x50\\xbf\\xb3\\x2c\\x02\\x5a\\xf3\\x80\\x59\\x23\\xda\\x7c\\x0b\\xa3\\x5a\\x25\\xb2\\x80\\xc2\\x44\\x5c\\x02\\x86\\x07\\x51\\x89\\x26\\xac\\x89\\x33\\xb5\\x02\\x44\\xbc\\x4e\\xc1\\xce\\x5a\\x49\\x63\\x0e\\x41\\xa5\\xcd\\x36\\x5f\\x39\\xce\\x26\\x25\\x02\\xfe\\x72\\xcb\\x85\\x5a\\xc2\\x5e\\x1e\\xfb\\x28\\xb2\\x47\\x0b\\x36\\xd7\\x49\\x6f\\x0b\\x83\\xcf\\x7a\\x11\\x24\\xfb\\xeb\\x60\\xc7\\x48\\xa3\\xa0\\x3a\\x5f\\xeb\\x08\\x9c\\x17\\x9c\\x8a\\x14\\xf0\\xc0\\xf6\\xf0\\x35\\xa8\\x9a\\x1d\\x49\\xfe\\x6a\\x62\\x88\\x7e\\x78\\x75\\x11\\xb2\\x7b\\x58\\x0f\\x9b\\x93\\xed\\x05\\x93\\xb0\\x53\\x30\\x52\\x36\\xee\\x0a\\xff\\x11\\xd7\\x70\\x07\\xe4\\x5c\\x88\\x24\\x84\\xda\\x82\\xad\\xfe\\xd9\\xe1\\xf2\\x67\\x2e\\x18\\x4e\\x71\\x0c\\xec\\x4d\\xf4\\x61\\x91\\xfb\\x43\\x8b\\x8d\\x2e\\x0e\\xe4\\x10\\xb0\\x8b\\x8c\\x4b\\xf2\\xe4\\xab\\x8c\\x40\\x0b\\x1e\\x02\\x21\\xff\\x72\\x35\\x5c\\x85\\xce\\x96\\x85\\x63\\x6e\\xd5\\x0f\\xc8\\x0b\\xd6\\xdd\\x5e\\x61\\x27\\x23\\x51\\x88\\xf9\\xfa\\x52\\xc8\\x0a\\xf5\\x6e\\xdc\\xbd\\x42\\x5f\\xee\\x5e\\x61\\xe1\\x60\\x62\\x4c\\x3f\\x4c\\xb6\\xc8\\x3c\\x36\\x5f\\xd4\\x8b\\x8a\\xc9\\xaf\\xc1\\xb8\\x5e\\xf6\\x36\\x57\\x53\\x6a\\xf8\\x51\\xb3\\x47\\xe6\\x00\\x7f\\xf4\\x5d\\xb0\\x47\\x17\\x21\\xa6\\x13\\xe0\\xb1\\xd2\\xc3\\x6f\\x1c\\x09\\x08\\xdf\\xff\\xca\\x75\\xe2\\x60\\x5d\\xe5\\xb7\\x80\\x38\\x25\\x35\\xc0\\xe6\\x60\\xd8\\xfb\\x19\\x65\\x26\\x8b\\x17\\xa0\\x0d\\x11\\x11\\xb5\\x8a\\xe5\\x49\\x03\\x4f\\xf8\\x1c\\xce\\x82\\x93\\xe5\\x35\\xee\\x58\\xd5\\x0b\\x6e\\x2f\\xd1\\x8e\\x2a\\xef\\x27\\x94\\x20\\x45\\x10\\x1e\\xb5\\xb4\\x52\\xea\\xf5\\xa0\\x2a\\xf4\\x96\\x76\\xd6\\xd6\\xd5\\x81\\x95\\x02\\xaf\\xc5\\x38\\xe2\\xea\\xd1\\xc3\\xc1\\x04\\x3f\\x47\\x64\\xff\\x18\\x5a\\x59\\xa0\\x34\\xc1\\xc3\\x8d\\x76\\xd4\\x80\\x95\\x0a\\xf9\\xf5\\xbc\\x49\\x73\\xf6\\x25\\x2d\\x87\\xe0\\xe5\\x2c\\x40\\x49\\x8c\\x77\\xe5\\xea\\x22\\x38\\x6f\\x8a\\x27\\xb3\\x70\\xa4\\x35\\x6b\\x36\\x1d\\xc9\\x9a\\xfd\\x8f\\x3f\\xf9\\xe6\\xb9\\x08\\xc0\\xdf\\x79\\x8a\\xe2\\x80\\x24\\xf7\\x3e\\x27\\x43\\x85\\xcb\\x46\\x44\\xfe\\xfd\\x12\\x19\\xcb\\x5a\\xe8\\xfb\\x5b\\x4b\\x8c\\xc8\\x9d\\xe4\\xee\\x14\\x07\\xee\\xbf\\x2a\\xfe\\x1e\\x4f\\x28\\x69\\xe5\\xb3\\x85\\xd5\\x56\\xc4\\xc1\\x0d\\x94\\xea\\xc8\\x05\\xc5\\x84\\xfd\\x62\\xd9\\xb7\\x34\\xc4\\x48\\xc9\\x14\\x10\\x08\\x86\\xf2\\x26\\x72\\x88\\xc4\\x0f\\x58\\xae\\xff\\x1e\\x97\\x1b\\x92\\xa0\\xe3\\xa0\\xc6\\x02\\x35\\x75\\x25\\xd5\\xfa\\xc3\\x5b\\xaf\\xee\\x72\\x89\\xb7\\x72\\xe6\\xfa\\x2e\\xaf\\xcf\\x93\\x17\\x04\\xaa\\xc9\\x80\\x78\\x86\\x5d\\x3d\\x57\\x15\\x51\\x82\\x22\\x84\\xd4\\x32\\x3a\\xd9\\x35\\x15\\xb5\\x7a\\x06\\xa5\\x8c\\x20\\xdf\\xac\\xd9\\xac\\xe0\\x39\\xa4\\x16\\x46\\xb5\\xeb\\x05\\xcd\\x85\\xae\\xa9\\xd0\\x35\\xff\\x02\\xab\\x2d\\x61\\xd5\\x90\\x3f\\x60\\x9f\\xc3\\xf7\\xb8\\xcf\\x3e\\x18\\x4a\\x8e\\x0e\\x99\\xce\\xb6\\xd6\\x71\\x51\\xb6\\x3f\\xda\\x5c\\x63\\xfc\\x1e\\x11\\x02\\x55\\x43\\x19\\xc7\\x5e\\xbc\\xd1\\x52\\x09\\xc8\\x09\\xa1\\xb0\\x83\\x6c\\xbd\\x2d\\xf9\\xaf\\xa6\\xd9\\x43\\x7e\\xc1\\x56\\x1b\\xbf\\xd1\\x8f\\x12\\xd6\\xf3\\xd6\\x9c\\xdd\\xad\\x65\\xd8\\x39\\xbb\\x45\\x36\\x31\\xcc\\x36\\xa1\\xc6\\xcb\\x8d\\xbd\\x33\\x37\\x37\\x2f\\xc9\\xe6\\xe9\\x6c\\x60\\x1b\\x29\\xca\\x2f\\x34\\x97\\xf7\\xf3\\x38\\x21\\xda\\x29\\x65\\xd5\\x1c\\x70\\x5a\\x79\\x1b\\xe4\\x72\\x4f\\x26\\xf3\\x6c\\xe5\\x65\\x99\\xac\\x66\\x47\\xd0\\x42\\xa7\\x1a\\xce\\xa9\\x7c\\xc6\\xf6\\x21\\x74\\xc2\\x3e\\xbb\\x55\\xcf\\x91\\x76\\x59\\xf9\\x7c\\x32\\xec\\xc6\\x94\\x8b\\x9c\\x0b\\x09\\xbf\\x90\\x17\\xeb\\x51\\x0b\\x9c\\xb5\\xfa\\x11\\x05\\x42\\x3d\\xcb\\x91\\x90\\x5b\\x39\\x0d\\x01\\x65\\x57\\x91\\xcc\\xa6\\xba\\x91\\xb2\\xb1\\x41\\xd6\\x5e\\x48\\x5d\\x82\\x68\\xaf\\xae\\x1e\\xb9\\xb8\\x46\\x7e\\x24\\xc3\\x05\\x69\\x4b\\x85\\x32\\x06\\xef\\x46\\x70\\xa1\\x94\\xe2\\x58\\x80\\xb7\\x76\\xc1\\x6a\\x74\\x75\\x91\\xbd\\x33\\xb1\\xf0\\xe0\\x5d\\x42\\xca\\xa1\\x18\\xc3\\x68\\xa3\\xd9\\x66\\x52\\x9f\\xf7\\xae\\x0d\\xfb\\xd9\\xde\\x05\\x2c\\xfe\\x9e\\xf3\\x5d\\x73\\xbe\\x5f\\x44\\x2d\\x0b\\x55\\x7e\\x88\\xda\\x8d\\xe7\\xbd\\xdd\\xff\\x7b\\x4c\\xcc\\x8e\\x21\\xaf\\x2e\\xd4\\xcd\\x71\\x93\\x5d\\xda\\x5c\\x4b\\xef\\x58\\xf0\\xfd\\xaf\\x25\\xa4\\x74\\x1a\\xbb\\xb4\\xb9\\xaa\\x4e\\x4b\\xf4\\x03\\x58\\x15\\xa3\\x8c\\xdd\\xbb\\xb0\\x4b\\x9b\\xcb\\xed\\x34\\x3d\\x3f\\x84\\xe5\\x86\\xb8\\x49\\xc6\\xf3\\xf6\\xbb\\xcd\\x35\\x76\\x0a\\xa2\\x5d\\xce\\x76\\x8b\\x54\\xd9\\x9c\\xb7\\x24\\x05\\xa7\\x2c\\xf8\\xb7\\x9b\\xd8\\x5d\\xa6\\xd8\\x69\\x78\\xbe\\x8d\\xb4\\xf2\\xe8\\xeb\\xea\\x82\\xc0\\x7c\\xc7\\xfa\\xf0\\x3b\\xd2\\xa9\\x4c\\xae\\x37\\x94\\xe5\\xfe\\x15\\xf7\\x0e\\x8c\\xfd\\x77\\xb6\\xe7\\x9d\\x88\\x7f\\xbd\\x8a\\x28\\xfc\\xba\\x73\\x87\\x00\\xf0\\xb1\\xa7\\x77\\x11\\x42\\xd8\\x1a\\x6c\\x6b\\xea\\x2f\\x3a\\xeb\\x32\\x85\\xb5\\x42\\x5f\\x48\\x26\\xa5\\xb8\\xc8\\xdd\\xa4\\x1a\\x17\\x70\\x22\\xfb\\xb9\\x49\\x63\\x7c\\x94\\xf2\\x25\\xfb\\x88\\x21\\x08\\xc0\\x50\\x15\\x61\\xc1\\xbf\\x6b\\x49\\x93\\x40\\x34\\x30\\xb8\\xa5\\x88\\x44\\x3e\\x61\\xb1\\x21\\x6c\\x33\\x46\\x2f\\x7a\\x3b\\xf3\\x0f\\x33\\xa1\\xfb\\x4a\\x9f\\x10\\x0c\\xf7\\x2d\\x49\\x82\\xe6\\x2e\\x51\\xf0\\x9d\\x24\\xc1\\xcd\\x23\\xe8\\x63\\x2b\\xf6\\xf3\\xd2\\xbb\\xab\\xbf\\xb5\\xec\\xf4\\xe6\\xc2\\x67\\x3e\\x46\\x56\\x36\\x77\\xb2\\x8f\\xa8\\xf8\\x5b\\xdf\\xc9\\x18\\xe9\\xdd\\x68\\xd5\\x8b\\x03\\xa1\\x16\\x7f\\xe3\\x7b\\xea\\x93\\x7b\\x47\\x1a\\xbd\\xb9\\xd9\\x07\\x22\\x1c\\x7e\\x28\\x9b\\x1d\\x60\\x11\\xf1\\xdf\\x95\\x0a\\xce\\x3c\\x1e\\xe2\\xfd\\x21\\x15\\xd9\\x90\\x43\\xee\\x9d\\x2c\\x7e\\x30\\x87\\xec\\xdd\\x26\\xdf\\xf6\\xed\\x6d\\xa2\\x39\\xb6\\x8b\\x17\\x65\\x7b\\x4e\\x9b\\x3b\\xdc\\x6b\\x7b\\xdc\\x9a\\xd5\\x3d\\x91\\xf1\\x99\\x46\\xef\\xaa\\xf1\\x88\\x0f\\x6f\\x0f\\x94\\x85\\xb1\\x08\\xa3\\x47\\x35\\x30\\x72\\x78\\x00\\xe9\\x41\\x79\\x9e\\x14\\xb4\\xa9\\x95\\xb6\\xbb\\x07\\xbb\\xff\\x52\\x9b\\xdb\\xb5\\x83\\xed\\xd9\\xf5\\x3a\\x8c\\xb0\\x3a\\x96\\x64\\x3e\\x7e\\xf2\\x2d\\x82\\x15\\x69\\x2e\\x77\\xd5\\xf9\\xfd\\x79\\x1c\\x45\\x6c\\x27\\x3f\\x50\\x10\\x19\\x12\\x25\\x44\\x0a\\x4d\\x9a\\x6d\\x1e\\x5a\\x52\\x64\\x35\\x87\\x26\\x33\\xb7\\x14\\x89\\x77\\x42\\x4a\\x73\\xbf\\xcf\\x65\\xcd\\x99\\x18\\xb5\\xd8\\x0a\\x72\\xb3\\x69\\x25\\x01\\x04\\xc6\\xf9\\x6a\\xd8\\xd7\\x09\\x69\\x77\\xc9\\x69\\xd0\\x20\\xcc\\xb1\\x65\\xb6\\xb8\\xae\\x9e\\xa3\\x5a\\x2c\\x1a\\xf8\\x48\\x23\\xb8\\xd9\\xc2\\x17\\x76\\x8e\\xdc\\x6a\\x37\\x6b\\x5c\\x7f\\xc8\\xde\\x14\\x62\\x94\\x3d\\x61\\x0f\\x87\\x0e\\x9f\\x66\\x8b\\x1c\\x34\\x13\\x7c\\xcb\\xa1\\x1a\\xdd\\x84\\x97\\x48\\xe0\\x94\\x27\\x28\\x96\\x22\\x5c\\x4f\\x64\\x8f\\xd6\\x24\\x1c\\x54\\xee\\x80\\x50\\xd8\\x61\\x39\\x18\\x76\\x69\\xb6\\xf0\\xb5\\x48\\x50\\x4b\\x6e\\x9f\\xe7\\x81\\x00\\x91\\xbd\\xba\\x09\\xee\\xea\\xc7\\x51\\x3d\\xe1\\x22\\xb0\\x7f\\x88\\x9a\\xeb\\x45\\xaf\\x10\\xfa\\x51\\x6e\\x4f\\x72\\xfc\\x6e\\x9a\\xb3\\x17\\xbd\\x2a\\xe9\\x47\\xb9\\x51\\x81\\xe8\\x34\\x65\\x9c\\xb9\\x3f\\xff\\xd4\\xbb\\x32\\xfd\\x28\\xb7\\xd0\\x17\\xda\\x54\\xf0\\x95\\x5b\\xef\\xcc\\x29\\x04\\xb3\\x77\\x90\\xda\\x2f\\x50\\x01\\x83\\xf3\\x0f\\xa3\\x4c\\xc5\\x45\\xf4\\xf9\\x1d\\xaf\\x59\\xef\\xaf\\xe4\\xf7\\x6a\\x92\\x1f\\x57\\x4b\\x85\\x50\\x0e\\x81\\x4b\\x0a\\x03\\x33\\x4d\\x1c\\x11\\xcb\\x5a\\x11\\x04\\x1f\\x66\\xb8\\xe2\\x78\\x8d\\x7b\\x42\\x4e\\xa0\\xf6\\x03\\x0a\\x16\\x69\\x9b\\xc1\\x32\\xd3\\x62\\x4b\\xaf\\xf1\\x00\\x25\\x8b\\x26\\x92\\x76\\x4d\\xc8\\xba\\xd6\\x0a\\x99\\xa1\\x4c\\x7a\\xab\\xf1\\x8e\\x78\\x4f\\x3c\\x27\\xb7\\xab\\x74\\x16\\x5b\\xbf\\x9b\\x09\\x9e\\x64\\x1f\\xfa\\x80\\x0d\\xcf\\x74\\x7d\\x57\\x6e\\x04\\x31\\xd7\\xd4\\x78\\x37\\xe2\\x6a\\x7c\\xa8\\x33\\xb2\\x79\\xb3\\x9f\\x08\\xf9\\xaf\\xb9\\x6a\\xa8\\xb9\\xe6\\x4b\\x6f\\xd9\\x30\\x5a\\x24\\x3b\\x69\\xb4\\x0f\\xe2\\xce\\x10\\x9b\\xeb\\x9b\\x2b\\x1b\\x5c\\xa6\\x92\\xd6\\x82\\xde\\x25\\x6d\\x69\\xb9\\x8a\\xcb\\xfa\\xb1\\x96\\x63\\xc0\\x4f\\x7e\\xb6\\x1e\\xb1\\xa8\\x61\\x97\\x85\\x2d\\xea\\x26\\xac\\xe9\\x8f\\x03\\x21\\x9f\\x33\\xfb\\xc9\\x6b\\xfe\\x33\\x75\\xa7\\x42\\x4a\\x35\\x4d\\xa5\\x6c\\x29\\xed\\xdc\\xb1\\xa9\\x1a\\x5f\\xe6\\xe0\\x0d\\x39\\x6f\\x5a\\xf8\\x0c\\x8a\\x61\\xe9\\x3c\\xf1\\xd8\\x72\\x93\\x56\\x87\\x98\\xff\\xea\\xe6\\x88\\x9c\\x31\\x6b\\xb0\\x0d\\xa4\\x20\\x0a\\xd7\\x59\\xd5\\x55\\x1a\\xc9\\x1a\\xae\\x27\\xdc\\x4b\\x52\\xdd\\xdf\\xca\\xed\\x2c\\xd2\\x2e\\x0f\\x47\\x0f\\xe6\\xb2\\x57\\x4e\\xee\\x57\\xb7\\x70\\x57\\x7f\\x03\\x35\\x2e\\xcc\\x81\\x22\\x17\\xf7\\xa9\\x71\\xc1\\x54\\x0d\\x45\\x17\\xb6\\xec\\x12\\xdf\\x75\\x0d\\x0c\\x39\\xd6\\x5e\\xd3\\xfa\\xf7\\x63\\xbd\\xe7\\xb1\\x7e\\x8b\\xc7\\x76\\xe1\\x45\\xc2\\x60\\x9f\\x1e\\x4c\\x58\\x2e\\x7b\\x3d\\xee\\xdf\\x0f\\xf8\\xbe\\xf7\\x16\\xb1\\x25\\x31\\xbf\\x83\\xf9\\xeb\\xfb\\xb8\\xda\\x07\\x32\\xf9\\xfc\\xfd\\xe4\\xef\\x77\\xf2\\x42\\xe9\\xc9\\xc3\\x3d\\xfc\\xbb\\x77\\xf1\\x7b\\x27\\xf5\\xa2\\xf9\\x5e\\x40\\xae\\x57\\xcb\\xff\\x1d\\xe4\\xee\\x0b\\x72\\x59\\x90\\x0d\\x92\\xd2\\xf6\\xda\\xce\\x6f\\x91\\xd2\\xa4\\xed\\x71\\x37\\x8f\\xbb\\x37\\x0c\\xfc\\xfd\\xb8\\xef\\xcd\\x3c\\xb0\\xa1\\x00\\x6f\\xb5\\xef\\xcc\\xf1\\xf3\\xdd\\xc0\\xc8\\x1c\\x87\\xa3\\x20\\x70\\xa4\\x0b\\xfa\\xae\\x7d\\x47\\x2f\\x7b\\x1b\\x46\\x5e\\x6b\\x11\\x66\\x6f\\xbc\\x86\\x01\\xc6\\x2a\\x70\\x6e\\x38\\xc4\\xd9\\x67\\x67\\x4a\\x1a\\xa8\\xd0\\x12\\xab\\x00\\x62\\x45\\xb2\\x03\\xc4\\xae\\xce\\x90\\xf0\\x34\\x07\\xdd\\x5a\\x4e\\x29\\xcb\\x91\\xb6\\x7c\\x95\\x56\\xd3\\x93\\x71\\xf1\\x70\\xf7\\x5d\\xa3\\x74\\x90\\xca\\x07\\x81\\x3f\\xbe\\xcc\\xde\\x6b\\xe2\\x94\\x09\\xf1\\x5c\\xf0\\xde\\xd4\\x22\\x13\\xc8\\x49\\x8c\\x14\\x0f\\x89\\x4c\\x04\\x04\\x9c\\x6b\\x88\\x49\\xcb\\xa6\\x84\\x9d\\x62\\x62\\xcd\\x9f\\x77\\xa3\\x24\\x55\\x59\\x84\\x22\\x0c\\x36\\x45\\xd7\\x4a\\x52\\x05\\x8d\\xd3\\x49\\xc9\\x68\\x25\\xe6\\x19\\x03\\x41\\xdf\\x3d\\x55\\x0c\\x8c\\x82\\x42\\xad\\x22\\xd5\\x98\\x55\\xee\\x43\\xf1\\x0b\\x3d\\x39\\x38\\x6e\\x60\\xcd\\x2c\\x83\\xa1\\x2a\\x3a\\x12\\xaf\\xed\\x12\\x7c\\x07\\xd7\\xb2\\xb2\\x9d\\xb7\\xea\\x3a\\x13\\x40\\x1e\\xee\\x24\\xaa\\x2f\\xd2\\xba\\x3a\\x96\\x35\\xb5\\x14\\xd2\\x5b\\x58\\xc2\\xe8\\x96\\x11\\x72\\xd4\\xf2\\xd4\\x3b\\x0d\\x91\\xcc\\xd7\\x9c\\xb3\\xe6\\x30\\xa8\\x46\\x73\\xa8\\x20\\x12\\x93\\x54\\xef\\xe4\\x5b\\x8a\\x0a\\x81\\x46\\x32\\x9a\\xc5\\xce\\x39\\xa4\\x9e\\x5a\\xb4\\xfe\\x75\\x16\\xac\\x56\\x1a\\x90\\xeb\\xc0\\x33\\xd2\\x7c\\xaa\\xef\\xe7\\xd5\\x05\\xb9\\x18\\x4c\\x0a\\x60\\x9a\\xe3\\xe0\\x13\\x2f\\xbc\\xcb\\xee\\x83\\x08\\xb8\\xd0\\xc2\\x7b\\x63\\xab\\x9e\\xb5\\xab\\xca\\x17\\xb8\\x39\\xd5\\x5a\\xb0\\x72\\xb2\\x9d\\xdb\\x90\\x77\\xc0\\xb6\\xb3\\x57\\x0b\\x4f\\xad\\x67\\xff\\x2d\\x57\\xc4\\x03\\x8c\\xc1\\xcf\\x16\\xd5\\xf0\\x90\\x72\\x75\\xad\\x82\\xd7\\xb2\\x78\\x6d\\xd4\\xc1\\xbb\\x08\\x30\\xfc\\xfc\\x30\\x3d\\x77\\x2f\\x0f\\x64\\xec\\xda\\x2b\\x1d\\xd7\\xce\\x4d\\x0b\\xc8\\xb9\\x56\\x40\\x8e\\xb5\\xa8\\xc7\\xec\\x91\\xbd\\x8d\\x62\\xfc\\x01\\x97\\x8e\\xa3\\x22\\x33\\x74\\x71\\x5b\\xe3\\xd0\\x95\\x96\\x33\\x47\\x6b\\xcb\\xdd\\xaf\\xb4\\x9c\\xec\\x70\\x6f\\x87\\xfa\\x51\\xed\\x30\\x62\\x9e\\xe4\\x66\\xde\\x19\\xc9\\xb5\\xbf\\xd7\\xe6\\x94\\x3a\\x7e\\xf7\\xdf\\xeb\\xde\\xa8\\xf5\\xa3\\xda\\x6b\\x02\\x92\\xc3\\xc6\\x9d\\x28\\x87\\x9b\\x03\\x82\\xf8\\xfd\\x8a\\x29\\xde\\xff\\x10\\x7a\\x83\\xd9\\x8f\\xeb\\x10\\xc0\\xe1\\xe4\\x72\\x58\\x3e\\x79\\x2c\\x74\\xd2\\x72\\x22\\x1e\\x1c\\x66\\x73\\xe7\\x3b\\x3b\\x5b\\x2a\\x6b\\x76\\x30\\x08\\x23\\xb2\\x92\\xb4\\x85\\x0a\\xf7\\x6b\\xcd\\x9c\\x5c\\x51\\x6f\\x73\\x2a\\x9d\\xe9\\xea\\x7a\\x2a\\x70\\x35\\x7e\\xd0\\x68\\x8a\\xce\\xd9\\x97\\x87\\x6b\\x03\\x3b\\x33\\xd3\\x6e\\x5e\\x16\\xa5\\x13\\xeb\\xbb\\xba\\x78\\x3f\\xee\\x36\\x76\\xd6\\xa0\\xeb\\xe9\\x7a\\x64\\xed\\xad\\x9b\\xce\\xdc\\x0f\\xdb\\xe1\\x90\\x36\\xbb\\xdd\\x9a\\xe4\\xcb\\xde\\x32\\xc2\\xb4\\x46\\xac\\x39\\x13\\x90\\x2f\\x00\\x56\\x2a\\xd4\\xe9\\x67\\x24\\xa7\\x69\\x89\\x25\\xa7\\x1c\\x21\\xda\\x79\\xc4\\xfd\\x23\\xed\\x7d\\xa2\\x31\\x98\\x30\\x59\\x76\\x26\\x23\\xa6\\xdf\\xa8\\x3f\\x89\\x26\\x90\\x46\\xce\\x52\\xb9\\x2e\\xa3\\xcd\\xc5\\x10\\xd2\\x08\\x23\\x4b\\xe1\\xa4\\xf9\\xf2\\x55\\x42\\x32\\x5a\\x04\\x08\\x17\\x1b\\x99\\x2d\\x2b\\x1b\\xa6\\x32\\x15\\xd8\\x8c\\x0d\\x89\\x30\\x1d\\x93\\x26\\x38\\x2f\\x61\\x64\\x27\\x5d\\x25\\x15\\x0c\\x90\\xba\\x51\\x9e\\x6a\\x41\\xde\\x32\\x24\\x63\\xa5\\xbc\\xba\\xb7\\xcc\\xc2\\xf6\\xfb\\x80\\xa2\\x6d\\x39\\xa9\\x4f\\x79\\x6e\\x71\\xee\\x72\\xcb\\xb5\\xae\\xa8\\x6f\\x71\\x64\\x49\\xb3\\xd8\\xf9\\xa2\\x69\\x65\\x57\\xdf\\x16\\xcd\\x2b\\x1b\\x8a\\xba\\xc1\\x51\\xdb\\x23\\x24\\xf9\\x4e\\x2d\\xe9\\x44\\x99\\x51\\x48\\xc1\\xd8\\x9c\\x27\\xe4\\xfb\\x30\\x6b\\x75\\x21\\xe1\\xec\\xd0\\x0a\\xf3\\x59\\x72\\x99\\xac\\x0f\\x46\\x4e\\x16\\x02\\x6c\\x4a\\x73\\x93\\x05\\x50\\x8f\\x8a\\x15\\xbf\\x20\\x0b\\xba\\xcd\\x75\\x56\\xb1\\xc8\\xb2\\xdb\\x4e\\xd5\\xf8\\xb2\\xb7\\x89\\xec\\x97\\xd1\\x73\\x57\\x3f\\x8a\\x62\\x7a\\x17\\xec\\xd3\\x5d\\xba\\x4d\\xf3\\x03\\x55\\x6e\\x6e\\x9e\\xdc\\x01\\x63\\xc7\\x5e\\x35\\x40\\xa1\\xbd\\x3f\\xa4\\x9a\\x80\\xcd\\x1e\\xb8\\x49\\x92\\xde\\xa9\\x66\\xa0\\xb9\\x57\\xd1\\xc0\\xcd\\x1d\\x3d\\x60\\x44\\xf8\\x01\\xef\\xe8\\x77\\x52\\x65\\xd1\\x60\\xc7\\x56\\xd3\\xdc\\xc3\\x89\\xf1\\xcb\\x03\\xda\\xf2\\x1f\\xf0\\xde\\x36\\x2b\\xd8\\xbb\\x70\\x08\\x77\\x1f\\x8f\\x79\\xac\\x2a\\x98\\x9b\\x9b\\x7e\\x40\\x67\\xfd\\x03\\xde\\xf4\\x66\\x80\\xe2\\xff\\x06\\x23\\x8b\\xbe\\xc3\\x92\\xa7\\x9b\\x87\\x7d\\x20\\x73\\xe0\\x0f\\xf9\\xb0\\xd5\\x04\\x73\\x90\\xa7\\x7d\\xc4\\xcd\\x34\\x77\\xec\\xe6\\x6a\\x0a\\xba\\x17\\x13\\xdc\\x2b\\x40\\x69\\x4d\\x44\\x1a\\x93\\x11\\x56\\x9b\\x39\\x0f\\xe4\\x34\\x18\\x00\\x99\\x9d\\xb8\\x5c\\x5d\\x04\\x16\\x80\\x0e\\x0b\\x7b\\xdf\\x12\\x20\\x7a\\xaf\\x09\\x10\\xf1\\xaa\\xca\\x77\\xdd\\xab\\xcd\\x49\\xf4\\xda\\x3c\\x5a\\x0b\\x23\\xe6\\x74\\xda\\x41\\x23\\xa9\\x15\\xca\\x2d\\xb5\\xa2\\x52\\xa8\\x7e\\x90\\xb2\\x21\\x9f\\x07\\x4a\\xac\\xd5\\xe9\\xd8\\xd1\\x84\\x5c\\x1e\\x99\\x5b\\xc9\\xd9\\x96\\xbf\\x57\\x55\\xcf\\x28\\xba\\x74\\x32\\x5c\\x44\\xb5\\xa6\\x38\\x32\\x65\\xb6\\x95\\x0c\\xfb\\xd1\\x66\\xcd\\x05\\x3f\\x58\\x19\\x92\\x5c\\x31\\xcc\\x04\\xe7\\xf7\\xac\\x7e\\xe9\\x86\\x90\\xeb\\xd7\\x06\\x21\\x3d\\xa4\\xba\\xf4\\xb2\\x02\\x48\\x8c\\x46\\x93\\x38\\x3b\\x32\\xb3\\x16\\x1c\\xcb\\x79\\x94\\x1f\\x46\\x8e\\xde\\x44\\x12\\xc6\\x38\\x99\\x60\\xac\\xf7\\x26\\xcf\\xc2\\x3e\\xfb\\xeb\\x92\\x15\\x07\\x41\\x22\\x08\\x8d\\x63\\x9a\\x84\\xab\\xac\\x26\\x34\\x63\\xd3\\x79\\x9c\\xd5\\xd6\\x14\\xee\\x02\\xbf\\xc4\\x5a\\x5c\\x49\\xeb\\x75\\x72\\x85\\x13\\xdc\\xb1\\x84\\x33\\x2f\\x7b\\xbd\\xe1\\x7e\\x91\\x4b\\xa4\\x85\\xf9\\x51\\x94\\xba\\xbc\\xe0\\xc8\\xc7\\xb8\\xc0\\xcd\\x0d\\xea\\x95\\x7d\\x3f\\xd2\\x0d\\x0a\\x9e\\x4e\\x63\\xb4\\x36\\x33\\x5f\\xbe\\xec\\x75\\x72\\x3f\\xd2\\xbd\\x62\\xad\\xa9\\x77\\x37\\x93\\x76\\x7f\\x37\\xf6\\x97\\xbd\\x1b\\xfb\\x8f\\x75\\x13\\x51\\xcf\\xec\\x30\\x1d\\xce\\xb7\\xde\\x9d\\xe2\\xc8\\xfe\\xb2\\x77\\x64\\xdf\\x2f\\x31\\xea\\xae\\x7e\\xb4\\x85\\x46\\x2f\\x02\\x05\\x24\\x63\\xef\\xee\\xae\\x39\\x59\\x4a\\xea\\x3d\\xe3\\x39\\x34\\x25\\xa0\\x0f\\x86\\x7c\\x09\\xd7\\x79\\xaa\\x63\\xa5\\x29\\x64\\x93\\x02\\x66\\xa6\\x1e\\x1f\\x50\\x35\\xb5\\x82\\xd7\\xdf\\x75\\xed\\x7a\\x94\\xb5\\x40\\xb2\\xa6\\x1f\\x42\\xed\\x7a\\xd9\\xcd\\xde\\xbf\\xfe\\x6f\\x05\\x14\\xa9\\x22\\x8b\\x5b\\x38\\x70\\xab\\xcd\\x45\\xda\\x7e\\xb9\\xb5\\x95\\x14\\x7b\\x6d\\x53\\xad\\xbb\\xac\\xd6\\xde\\xc4\\x9c\\x16\\xef\\x10\\x5f\\xaa\\x35\\x67\\x20\\x37\\xd1\\x8c\\xd4\\x1b\\x86\\x52\\x6a\\x98\\x4f\\x00\\x2f\\x01\\x4e\\x2d\\xc5\\xa1\\xfa\\xf4\\x28\\xa9\\x77\\xaa\\x2f\\x93\\xad\\xca\\x76\\x09\\xd8\\x28\\xc3\\x79\\x6d\\x7e\\xb1\\xd0\\x22\\xb2\\x0a\\x78\\x01\\x25\\xe8\\x09\\xba\\xd3\\xa4\\xb2\\x1e\\x34\\x1c\\x41\\x16\\xa1\\x21\\x0f\\x6c\\x50\\x96\\x28\\xe7\\x56\\x7b\\x6b\\x75\\xcc\\x40\\xb9\\x12\\x84\\x4c\\x6a\\x30\\x83\\xfc\\xb3\\x90\\x23\\x9a\\x6c\\xac\\x06\\x39\\x4f\\x53\\xfb\\x79\\x6e\\xf9\\x4f\\x31\\xb2\\x80\\x12\\xa2\\x76\\xc9\\xd8\\x56\\x5a\\x08\\x9e\\x05\\x11\\x37\\xcb\\x6d\\x33\\x3e\\x14\\x7b\\x9d\\x54\\xc9\\xcd\\xed\\xac\\xf2\\x69\\x6c\\x3e\\xa1\\x34\\x25\\x6b\\xe2\\x5b\\x0d\\xc5\\x68\\x1e\\x54\\xf2\\xd3\\x84\\xb0\\x50\\xa3\\x6a\\x64\\x72\\x75\\x26\\x78\\xb0\\xf8\\x72\\xa7\\x5d\\x2e\\x6f\\xdb\\xe5\\xfc\\x61\\xbb\\x9c\\xaf\\x6a\\x97\\x2b\\x6e\\xb5\\xcb\\xa5\\x9d\\x5d\\x6e\\xb5\\xca\\x15\\xb5\\xc9\\xa9\\x1e\\xdc\\x32\\xc2\\x4a\\xe0\\xe9\\xa5\\xfe\\x62\\xe4\\x14\\x21\\x20\\xcd\\xec\\x9a\\x78\\x16\\xc5\\x0d\\x5d\\x0b\\x35\\x39\\x45\\x75\\x56\\xc2\\x77\\x24\\xad\\x5f\\x10\\xaa\\x00\\x46\\x6e\\x3e\\x39\\xe0\\x56\\x1e\\xd7\\x08\\x4b\\xf9\\x40\\x4a\\xb6\\x1f\\x68\\xec\\x98\\xa7\\xb4\\x1d\\x36\\xb7\\xfd\\x6e\\x6b\\xe9\\xdc\\x67\\x50\\x2c\\xb5\\x59\\x2f\\xaa\\x6b\\x75\\xe6\\x1e\\x3b\\x45\\x04\\xf7\\x31\\x8e\\x35\\xba\\x15\\x15\\x16\\xe1\\x98\\xbe\\x1d\\x15\\xd6\\xf7\\x62\\x66\\x60\\xe7\\x3a\\x9b\\x5f\\xcd\\xee\\x48\\xf3\\xde\\xa2\\x54\\x03\\x1d\\x69\\xdf\\x51\\x96\\xe3\\xdd\\xf7\\x08\\xf1\\x78\\xf7\\x07\\xca\\x94\\xe4\\x23\\xcd\\x3b\\x95\\x69\\x28\\xf1\\x48\\xf3\\x0e\\xfe\\x50\\x0f\\x7b\\xb3\\x79\\xa7\\x39\\x3a\\xde\\xbc\\xbb\\xd8\\x1c\\xf8\\x48\\xf3\\x4e\\x8d\\xe0\\x4b\\x39\\xd2\\xfc\\x80\\x07\\xcd\\x91\\x9d\\xa1\\x0e\\x0c\\x4e\\x28\\x73\\x76\\xa4\\xbb\\x0e\\x4c\\xde\\xad\\xbb\\xbe\\x46\\xd2\\x3b\\x75\\xd7\\x43\\x99\\xcf\\x8d\\x75\\xa4\\x58\\x0c\\xd0\\x14\\x97\\x81\\x5c\\x89\\xad\\x82\\x93\\x3c\\x5e\\x5d\\x50\\x8a\\xf2\\xf2\\x58\\xd7\\xbd\\x25\\x24\\xd6\\x75\\xaa\\xbc\\xd7\\xb5\\xdf\\x15\\x87\\x92\\x47\\xe9\\x3a\\xdd\\xd5\\x75\\x07\\x2f\\xa1\\xac\\xd8\\x30\\x19\\x72\\xae\\x2e\\x5a\\x8b\\xab\\x56\\xa3\\x04\\x4d\\xc8\\xbd\\x77\\x5a\\x1c\\x61\\x04\\x55\\xcb\\x05\\x35\\x42\\xe1\\x8a\\xdc\\xb8\\x04\\xad\\x81\\xd0\\x8a\\xf9\\x27\\xa4\\x58\\xa3\\x2a\\xc8\\xf3\\x48\\x31\\x32\\x76\\xd4\\x41\\x63\\xc8\\xcd\\x35\\x28\\x56\\x43\\x2e\\xe6\\x49\\xd8\\x81\\x6a\\x12\\x9c\\x02\\x10\\xdb\\xad\\xf5\\x6a\\x17\\xaa\\x34\\x70\\xc0\\x30\\xb4\\xa6\\xab\\xd0\\x00\\x56\\xad\\xa9\\xa3\\x65\\x92\\x8b\\x3b\\x8a\\xb6\\xa8\\x03\\xef\\x48\\x6e\\xe7\\x9a\\x64\\x39\\x44\\x19\\x3f\\x3b\\x1d\\x3f\\xac\\xe3\\x27\\xd4\\x4a\\x97\\xf1\\x85\\x20\\x18\\xcb\\x5a\\x5b\\xa8\\xd6\\x35\\x84\\xb6\\x9e\\x3e\\x83\\x8e\\x4e\\xec\\xea\\x55\\x21\\x25\\xc8\\xb7\\x71\\x1e\\xbb\\x9e\\xaf\\x2e\\x82\\x2f\\xdf\\xf9\\x99\\xf7\\xa5\\x10\\xd7\\x92\\x69\\xd9\\x9b\\x9a\\xcb\\x95\\xfc\\xff\\x58\\x67\\x7f\\x11\\xe8\\xf1\\x3a\\x3b\\xb2\\xa8\\x4e\\x28\\x2f\\x6b\\xe2\\xe2\\x47\\x05\\xa4\\x8b\\x00\\xff\\x86\\x6f\\x1f\\x2e\\xb9\\xc3\\x95\\xd9\\xad\\x70\\xc9\\xce\\x64\\x4a\\x4b\\x55\\x77\\x0c\\x07\\xd5\\x94\\xa1\\x14\\x9a\\xaf\\x5d\\x0a\\x6b\\x7d\\x3f\\xd5\\x30\\x69\\x20\\x7c\\x4b\\x71\\x8c\\xe8\\xea\\xaa\\x5c\\xb5\\x08\\xc2\\xeb\\xef\\x7e\\x5e\\xfd\\xee\\x84\\x9d\\xd5\\x47\\x79\\x6a\\x7d\\x6f\\x73\\xb6\\xec\\xf8\\x40\\xa6\\xa6\\xb4\\x56\\x19\\x16\\xc9\\x79\\xe1\\xb5\\x08\\x98\\x3c\\x58\\x86\\xf0\\xeb\\xd5\\xf5\\x50\\x26\\x7a\\xf0\\xbd\\xcb\\xf1\\xe0\\x9b\\x23\\xf3\\xe8\\x54\\x09\\x47\\x49\\xab\\xef\\x4b\\x40\\xe5\\x76\\x0f\\x42\\x30\\x31\\xd0\\xbb\\x96\\x32\\x65\\xe7\\x7b\\xf4\\x96\\x57\\xaf\\x3b\\x7a\\xdc\\xf2\\x44\\xec\\x62\\xb7\\xfc\\xa3\\x5c\\xd1\\xa1\\x42\\xab\\x69\\x35\\x90\\x15\\x13\\x4a\\x5c\\x28\\xfa\\x81\\x42\\x5a\\x28\\xca\\xe0\\x78\\x68\\x3f\\xf8\\x49\\x8b\\x7a\\x2a\\x63\\xeb\\x51\\x47\\xd4\\xa3\\xd6\\x14\\x02\\x47\\x26\\x54\\x06\\x6e\\x2a\\xd5\\xb2\\x8b\\x71\\xf2\\xa3\\x85\\xda\\x86\\x2b\\x6c\\x4c\\x70\\xd6\\x87\\x40\\xa8\\xd5\\x47\\x54\\x77\\x54\\xb5\\xce\\xa4\\x3a\\x13\\x95\\xb8\\xf3\\x92\\x6a\\xf9\\x45\\x20\\xd9\\x0e\\x81\\x11\\x74\\xe2\\x07\\xdb\\x9e\\xdc\\xed\\x9f\\xd4\\x7f\\xcb\\xb3\\x69\\x1f\\x3a\\x94\\x4f\\x41\\x6f\\xb4\\x2a\\x0a\\x04\\xc6\\x21\\x69\\xbb\\xd4\\x26\\x61\\x46\\x9d\\x60\\x9e\\x6c\\x84\\x13\\x99\\x2a\\x8a\\x2d\\xa3\\x4c\\x89\\x88\\xbf\\x5a\\x1e\\x1c\\x27\\x92\\x5a\\x21\\xac\\x48\\xc6\\x27\\xbf\\x14\\xec\\xd1\\xf6\\x01\\x51\\x7f\\xa5\\x89\\x7d\\xdd\\x59\\x03\\xc9\\x47\\x5a\\xc8\\xc5\\xc1\\x57\\x59\\x89\\x8b\\x83\\x88\\x97\\x8b\\x0d\\x28\\x4e\\x1a\\xc2\\xa2\\x0f\\x9c\\xae\\x2e\\x62\\x88\\xa6\\x52\\x5c\\x62\\xa0\\x81\\x62\\x1d\\x21\\x24\\xfa\\xc4\\x43\\x1a\\x51\\xa5\\x34\\xf1\\x40\\x31\\x2c\\x56\\xde\\x0b\\xba\\x59\\xb8\\xa0\\x38\\x1e\\x8d\\xd2\\x2f\\xb2\\x44\\x0c\\x5a\\x1a\\x99\\x9c\\xe1\\x5a\\xd6\\x9c\\xa2\\x5c\\x33\\xda\\x6f\\x2f\\x22\\x1e\\x50\\xba\\xbb\\x95\\x7f\\x91\\xab\\x2c\\x7f\\x09\\xc7\\x85\\x4c\\xb4\\xc5\\x81\\xe5\\xda\\x4e\\xf2\\xf5\\xf2\\x59\\x2f\\x2a\\xb0\\xab\\x75\\xc7\\x82\\xb8\\x2b\\xf9\\xb7\\x20\\x0a\\x30\\x0e\\x94\\x68\\xd1\\xb2\\xd6\\x54\\x18\\xa5\\x90\\x11\\x37\\x37\\x73\\x8d\\xd0\\xad\\x4e\\xd0\\xd3\\xa9\\x4d\\x3c\\xee\\x6a\\x69\\x13\\x0a\\x42\\x71\\x5c\\x6b\\xe8\\x06\\x13\\x8c\\x45\\x59\\xe9\\x3c\\x5b\\x90\\x5b\\x3f\\x59\\xd5\\xc0\\x93\\x96\\xe1\\xf5\\x75\\xad\\x3d\\x4a\\xa4\\x95\\xb4\\x07\\x26\\xe1\\x21\\x1d\\x92\\xc5\\xc6\\xc5\\xa6\\xcc\\xb7\\xea\\x0f\\xc6\\x1c\\x6e\\x3a\\x6f\\xf2\\x60\\x29\\xd1\\xd5\\x45\\xae\\xe9\\xc6\\x02\\x32\\x14\\x70\\x2e\\x68\\x54\\x97\\xf1\\x48\\x8c\\xe1\\x71\\x91\\x34\\x57\\x7d\\x0b\\x7d\\x81\\x9c\\x8b\\x54\\x21\\x39\\x69\\xfc\\xd2\\x88\\x0a\\xfb\\xec\\xdd\\x64\\xb3\\x37\\xc8\\x5a\\xa6\\x9e\\xda\\x61\\xd6\\x4a\\x6e\\x86\\x78\\x02\\x5a\\xdf\\x65\\xfd\\xb0\\x21\\xcd\\x36\\x36\\xeb\\x68\\x5c\\x6c\\x0e\\x43\\x8a\\xa9\\xd9\\x2b\\x6e\\xd4\\x1e\\x8c\\xa5\\x74\\xf3\\xf7\\xc2\\x89\\x1f\\x58\\x6a\\xa9\\xfb\\xda\\x83\\xdd\\x52\\x8f\\x9c\\x72\\xc7\\x4f\\x33\\xe5\\xfc\\x63\\x3a\\xe5\\xc2\\x74\\xf2\\x02\\xcc\\x0f\\x72\\x05\\x14\\x63\\xda\\xb7\\x5e\\x08\\x12\\xf2\\x31\\x1e\\xff\\x9c\\x28\\xac\\xd8\\x62\\xf8\\xd3\\xe5\\x9b\\x57\\xe6\\x6b\\x52\\x44\\x21\\xb8\\xee\\x6b\\x7e\\xff\\xc9\\x5f\\x9e\\x98\\x3f\\xbd\\xff\\xc4\\x12\\x1d\\x6a\\x94\\x4f\\x69\\x54\\x5a\\xa3\\x9d\\x16\\x4d\\x9a\\x32\\xdf\\xd1\\x14\\xb9\\x9a\\xee\\x6e\\xf9\\xf9\\x29\\x8d\\x3e\\xd3\\x46\\xbe\\x1c\\x6b\\xf4\\x69\\xeb\\xc9\\x1d\\x6a\\xf4\\xf2\\x7a\\x62\\x78\\xfe\\xd3\\xfb\\x4f\\x7c\\xdf\\xdd\\x07\\xfb\\xbb\\x41\\xd9\\x6f\\xbc\\x9f\\xf5\\x3d\\xe5\\x8d\\xf7\\xff\\xf8\\x93\\x6f\\x7c\\x1b\\x84\\x62\\xb7\\xa5\\xbf\\xd8\\x35\\xca\\x6d\\x8b\\xfa\\x8e\\x5a\\x9b\\xff\\xa2\\xaf\\xbb\\xbd\\xb9\\xee\\x82\\xab\\x76\\xc1\\xe9\\x76\\x9b\\x5f\\xee\\xda\\x40\\xfd\\x87\\x05\\xdf\\x6e\\xf3\\xe1\\xfe\\x7a\\xfb\\x23\\xf8\\x8f\\xd7\\xc3\\x28\\x8f\\x29\\x9d\\xb8\\x70\\xac\\x19\\xc4\\x80\\x13\\x9a\\x3d\\x3d\\xa1\\x99\\xaa\\xf5\\x65\\x66\\xdd\\x1e\\xee\\x37\\x62\\x6d\\x14\\xba\\x73\\xbf\\x6e\\xf4\\xb2\\x9d\\x06\\x1f\\x19\\xed\\xe5\\x8b\\x13\\xda\\x3c\\xff\\xe9\\x9d\\x5b\\x05\\xcf\\x82\\xbb\\xda\\x3c\\x3d\\xa1\\x4d\\x3d\\xa1\\x4d\\xba\\x7b\\x83\\xe0\\xde\\x78\\x57\\x9b\\x70\\x42\\x9b\\x13\\x0e\\xe3\\x25\\xdf\\xdd\\xe6\\xf2\\xd9\\x09\\x6d\\x9e\\x9e\\xd0\\xa6\\x9e\\xd0\\xa6\\x9c\\xd0\\x26\\x9f\\xd0\\xa6\\xed\\xa1\\x3f\\x02\\x1b\\x97\\xe1\\x84\\x36\\xfe\\x84\\x36\\x7c\\x42\\x1b\\x3a\\xa1\\x8d\\xbb\\xbb\\xcd\\x8b\\x72\\xf7\\xdd\\x79\\x91\\x4e\\x68\\x13\\x4f\\x68\\x13\\x4e\\x68\\xe3\\x4f\\x68\\x73\\xc2\\x7d\\x7f\\x9e\\x4f\\x68\\xb3\\x9e\\xa9\\x3b\\xd6\\x28\\x9c\\xd2\\xc8\\x9f\\xd2\\x88\\x4f\\x69\\x44\\xa7\\x34\\x72\\x77\\x35\\xfa\\xeb\\x71\\x44\\xb6\\x1c\\x7f\\xfd\\xf5\\x71\\xb4\\xf3\\x66\\x83\\xde\\xb4\\xd7\\xd3\\xf1\\xcb\\xf4\\xfa\\xf8\\xeb\\x2f\\x8e\\xbf\\xbe\\x3c\\xfe\\xfa\\xc5\\xf1\\xd7\\xcf\\x8f\\xbf\\x7e\\x7a\\xfc\\xba\\x7c\\xb2\\xc5\\x5e\\xb4\\xf7\\xbf\\x3b\\x0e\\x71\\x1f\\x1d\\x7f\\xfd\\x6b\\x9d\\x9b\\xeb\\x58\\x92\\xf6\\xfe\\x57\\xc7\\x3f\\xff\\xc5\\xf1\\xd7\\x1f\\xdc\\x0d\\x55\\x7c\\x12\\xe1\\x7e\\xbe\\xd9\\xe8\\x37\\xfb\\xac\\x44\\xea\\x38\\x8d\\xdf\\xee\\xbf\\x8e\\x1d\\x6c\\xfd\\x4b\\x77\\x2d\\x89\\xbb\\xad\\xf8\\x97\\xee\\x5a\\x1e\\x6f\\xe4\\x4f\\x69\\xc4\\xa7\\x34\\xa2\\x53\\x1a\\xb9\\xbb\\x1a\\x7d\\xb0\\xf5\\xfe\\xa3\\x13\\x58\\xb5\\x8f\\xbb\\x36\\x5c\\x3b\\xb6\\xf1\\xe3\\x7d\\xfe\\xd4\\x52\\x77\\x48\\xbf\\xeb\\x19\\x79\\x1f\\xb7\\x1b\\xad\\x2c\\xfc\\x66\\x9b\\xcf\\x8f\\xbf\\x56\\xb6\\x9d\\xba\\xf5\\xfe\\x6e\\x9f\\x61\\xef\\xb7\\xe3\\x77\\xfb\\x17\\xae\\xdf\\x89\\x7f\\xed\\x17\\x41\\x3d\\x64\\xff\\x6b\\xb7\\x8a\\xed\\x46\\x9f\\xdf\\xf1\\x5e\\x27\\x5a\\xb7\\x5e\\xeb\\x44\\x63\\xf7\\xfa\\x93\\x6b\\xbe\\xa8\\xcd\\xb3\\x76\\x3b\\x75\\xdd\\xe6\\xb2\\x1d\\x6b\\xe9\\x4e\\xed\\x93\\xee\\xe8\\xa9\\xd4\\xed\\x46\\xcf\\x1a\\x83\\x45\\xa1\\xc3\\xd1\\xd7\\x8d\\x9e\\xee\\x1a\\x75\\xdb\\xff\\xc9\\xfe\\x55\\x0d\\x1d\\x8c\\x7d\\xb2\\x4f\\x06\\x52\\xb7\\xa0\\x4f\\x3b\\xe9\\xc6\\x52\\x37\\xd9\\x4f\\xf7\\xfb\\xf0\\xdd\\xc6\\x7d\\xba\\x2f\\xfd\\xd8\\x5e\\x3a\\xfa\\xb4\\x13\\x7f\\x0e\\xa0\\xe5\\xcf\\x0e\\x4c\\xa4\\xdb\\xda\\xcf\\x6e\\xd0\\xb4\\x8e\\x32\\x7c\\x76\\x73\\x22\\x1d\\xda\\xfa\\xac\\x9f\\x48\\x7f\\x19\\x3e\\xdf\\x97\\xa2\\x56\\xe6\\xe5\\x48\\xab\\x15\\x58\\x52\\x37\\xdb\\xcf\\x3b\\x60\\xe9\\x11\\xed\\xe7\\x1d\\xb0\\xd4\\x0e\\x0c\\x3e\\xef\\x60\\xa5\\x97\\x52\\x3f\\xef\\x40\\xa5\\x74\\xcb\\xff\\xfc\\x94\\xb3\\xfe\\x7c\\x1f\\x27\\xf5\\x5c\\xc5\\xe7\\xfb\\x27\\xd0\\x13\\xb0\\xf6\\xfa\\xe5\\xf1\\x19\\xac\\x07\\xd4\\xc1\\xf2\\xde\\xde\\x37\\x91\\x22\\x6c\\x4d\\xf0\\x38\\x34\\xed\\x35\\xda\\x09\\xc2\\xb7\\xdb\\xfc\\xf1\\x86\\x34\\xdd\\x41\\xed\\x7f\\xbe\\xc6\\x48\\xcf\\x7f\\xba\\x81\\x19\\xf7\\xda\\x3c\\x3b\\xa1\\xcd\\xd3\\x13\\xda\\xd4\\x3b\\xda\\xfc\\xfe\\xf8\\xeb\\x5f\\x6f\\xbc\\x7e\\xba\\x7f\\xac\\xa5\\xdb\\x8b\\xf6\\xfa\\x99\\x6e\\x55\\x77\\x6e\\x2f\\xf6\\xbf\\xee\\x01\\xfd\\xe5\\x01\\x1d\\xc0\\x91\\x46\\x3b\\x91\\xf2\\x58\\x9b\\xa7\\x27\\xb4\\xa9\\x27\\xb4\\x29\\x27\\xb4\\xc9\\x77\\xb7\\x39\\x72\\x63\\x5e\\xde\\xe0\\xa4\\xb7\\xfa\\xf8\\xe2\\xf8\\xeb\\xcb\\xe3\\xaf\\x5f\\x1c\\x7f\\xfd\\xfc\\xf8\\xeb\\xcd\\xfb\\xf6\\xb2\\xbf\\x4b\\x3d\\x5d\\xfc\\xd3\\x81\\xd3\\x3d\\xd2\\x68\\x77\\xba\\xc7\\xda\\x3c\\x3d\\xa1\\x4d\\x3d\\xa1\\x4d\\x39\\xa1\\x4d\\xbe\\xa3\\xcd\\x74\\xfc\\xf5\\x17\\xc7\\x5f\\x5f\\x1e\\x7f\\xfd\\xe2\\xf8\\xeb\\xe7\\x1b\\xaf\\xc7\\x6b\\xf2\\x92\\xb6\\xa6\\xbf\\xd7\\x26\\x9e\\xd0\\x26\\x9c\\xd0\\x66\\xf3\\x78\\xf7\\xda\\xf0\\x1d\\x6d\\x5e\\x6f\\xbc\\x7e\\xb3\\x8f\\x6e\\x0f\\x70\\x09\\x6f\\x6e\\x30\\xc3\\x3d\\x2c\\xbf\\xd9\\x27\\x2d\\x07\\x50\\xfe\\xdc\\x6d\\x59\\x8f\\xf2\\xe7\\x6e\\xcb\\x8e\\xb6\\x09\\x27\\xb4\\xf1\\x27\\xb4\\xe1\\x3b\\xda\\xbc\\xde\\x78\\xbd\\xdc\\x58\\x32\\x75\\xcc\\xc3\\x5f\\xf6\\x59\\x95\\x95\\xd7\\xec\\x77\\x6e\\xbf\\xd9\\xaa\\xf0\\xbd\\xab\\xd9\\xd3\\x53\\x9a\\x9d\\xd4\\xd7\\xf3\\xcd\\x46\\x7f\\xbd\\x63\\x79\\x82\\x76\\x9f\\xfd\\xb4\\x23\\xc3\\x07\\x2d\\x06\\x37\\x1a\\x6e\\x62\\xa0\\xdb\\x0d\\x37\\xd1\\xd0\\xed\\x86\\x9b\\xb8\\x68\\xbf\\xe1\\xef\\x4f\\x68\\xf3\\xeb\\xed\\x36\\x90\\x48\\xbf\\x3e\\x66\\xcf\\xd8\\x6f\\xb4\\x69\\xd4\\xd8\\x6f\\x74\\xdc\\xb2\\xb1\\x8a\\xca\\x77\\x8e\\x49\\xa7\\x8c\\x49\\x27\\x8f\\xc9\\xa7\\x8c\\xc9\\xa7\\x8c\\xc9\\x27\\x8f\\xe9\\x4f\\x19\\xd3\\x9f\\x32\\xa6\\x3f\\x79\\xcc\\x70\\xca\\x98\\xe1\\x94\\x31\\xc3\\xc9\\x63\\xc6\\x53\\xc6\\x8c\\xa7\\x8c\\x19\\x4f\\x1e\\x33\\xff\\xb4\\x63\\x93\\x0e\\x77\\xb9\\x36\\xdc\\xb2\\x93\\xdd\\xea\\x6c\\xdb\\x58\\xb6\\x96\\x6c\\xff\\xfa\\x88\\x35\\x6c\\x2d\\x85\\x7e\\x57\\x9b\\xa7\\x27\\xb4\\x79\\x76\\x77\\x9b\\x17\\x7b\\x77\\x6e\\x5b\\x2d\\xb4\\x2a\\xc4\\x4f\\x6a\\xe8\\x4f\\x6d\\x18\\x4e\\x6d\\x18\\x4f\\x6d\\x98\\x4e\\x6d\\xf8\\xe2\\xa7\\x27\\x89\\xcb\\xb7\\x9a\\x6e\\xcb\\xcc\\xb7\\x1a\\x6e\\x0b\\xce\\xb7\\x1a\\x6e\\x4b\\xcf\\xb7\\x1a\\x6e\\x8b\\xd0\\xb7\\x1a\\x6e\\xcb\\xd1\\xb7\\x1a\\x1e\\x11\\x0d\\xf6\\x5b\\x6e\\x49\\xd4\\xfb\\x6d\\xb6\\xc4\\xea\\xfd\\x36\\x5b\\xb2\\xf5\\x7e\\x9b\\x4d\\x86\\xff\\xf6\\x91\\x6d\\x4a\\xd9\\xb7\\x1b\\x6e\\x8b\\xda\\xb7\\x5b\\x6e\\x32\\x5f\\xab\\x91\\xeb\\x98\\x1c\\xba\\xdf\\x66\\x4b\\x18\\x5d\\x0d\\x6a\\x77\\xf5\\x43\\x27\\xf4\\xc3\\x27\\xf4\\xc3\\x27\\xf4\\xe3\\x4f\\xe8\\xc7\\x9f\\xd0\\x4f\\x38\\xa1\\x9f\\x70\\x42\\x3f\\xf1\\x84\\x7e\\xe2\\xdd\\xfd\\xbc\\xbc\\x09\\x74\\x87\\x79\\xb4\\x97\\x2f\\x4f\\x68\\xa4\\xba\\xdf\\xd3\\x30\\xc5\\x8d\\xb6\\x47\\x51\\xc5\\x8d\\x96\\x47\\x71\\xc5\\x8d\\x96\\x47\\x91\\xc5\\x8d\\x96\\x47\\xb1\\xc5\\x8d\\x96\\x47\\xd1\\xc5\\x8d\\x96\\xc7\\xf1\\xc5\\x75\\xd3\\x23\\x08\\xe3\\xba\\xd1\\x11\\x8c\\x71\\xdd\\xe8\\x08\\xca\\xb8\\x6e\\x74\\x0c\\x67\\xdc\\x3c\\xbd\\x63\\x48\\xe3\\x66\\xcb\\xa3\\x58\\xe3\\x66\\xd3\\x63\\x68\\xa3\\x05\\x81\\x7c\\x7d\\x97\\xe7\\x93\\x86\\x67\\x9c\\xd0\\xec\\xf9\\x69\\xcd\\x5e\\x1c\\x6b\\xf6\\x05\\xbd\\xff\\xe4\\x9f\\x9f\\x98\\x7f\\xf7\\x85\\x5a\\x1c\\xfe\\x5d\\xa7\\x80\\xd9\\x6f\\xf0\\xf9\\xd9\\xe7\\x4f\\x9f\\x7f\\x3d\\x5f\\x9e\\x7d\\xfe\\xe2\\xcb\\xcb\\x37\\x97\\x6f\\xbf\\x7c\\xab\\x5f\\xc4\\xb8\\xf5\\xc5\\x27\\xad\\xcb\\x7c\\xbb\\xc1\\x2f\\xcf\\x3e\\x3a\\xfb\\x70\\x1e\\xce\\x3e\\xfa\\xe2\\xcd\\xd3\\xe5\\xf2\\xec\\x23\\xed\\xf7\\xa3\\xe7\\x5f\\xbe\\x79\\xfe\\xf5\\x9f\\x5f\\x8e\\x97\\xdf\\x9c\\x7d\\x34\\x7f\\x39\\xbe\\xb8\\x3c\\xfb\\x68\\x6f\\xa8\\xfd\\x49\\xf2\\xa3\\xf5\\xb8\\xb5\\xaa\\xe0\\x1f\\x6d\\x88\\xc7\\xdf\\x86\\x0f\\xce\\x3e\\xd0\\x4f\\x3e\\xd0\\x4f\\x3e\\xd8\\xfb\\xe4\\x03\\xfd\\xe4\\x83\\xf5\\x93\\xb3\\x0f\\xde\\x7c\\xf9\\xea\\x0b\\x9d\\x42\\x72\\x8f\\x36\\x85\\x3f\\xb6\\x45\\x3d\\xde\\x36\\xfd\\x41\\x7b\\xf4\\x8f\\x37\\xc7\\xe7\\xaf\\xff\\xfc\\xe7\\xa7\\x67\\x5f\\x5d\\xbe\\xf9\\xf2\\xf5\\x8b\\xb3\\xe9\\xeb\\xd7\\xf3\\xe5\\xdb\\x2f\\x5f\\x7d\\x31\\x3e\\x7b\\xfa\\xf6\\x52\\xff\\x7c\\xf1\\x4c\\xff\\xb8\\x1c\\xc7\\x2f\\xbf\\xda\\x1d\\x3d\\xf5\\xe0\\xf5\\x8b\\xb3\\x5f\\x3c\\xbf\\x7c\\xf1\\xe5\\x38\\x3e\\xbd\\x75\\xa6\\xf5\\x76\\xcb\\x0f\\xcf\\x3e\\xd4\\x69\\x7e\\xa8\\xd3\\xfc\\x70\\x6f\\x9a\\x1f\\xde\\x9a\\xdf\\xeb\\xb3\\xd7\\xda\\xf6\\xb5\\xb6\\x7d\\xbd\\xd7\\xf6\\xb5\\x2e\\xe9\\xf5\\x4d\\xa8\\xa4\\x77\\x1a\\x6f\\x39\\xfb\\xeb\\xd9\\x5f\\xb5\\xd9\\x5f\\x6f\\xf6\\x7b\\x53\\x3c\\xb9\\x6f\\xbf\\x6d\\x33\\x6e\\xa1\\xc8\\xfb\\xf6\\xf2\\xf5\\xd9\\xd7\\xda\\xf6\\x6b\\x6d\\xfb\\xf5\\x5e\\xdb\\xaf\\x6f\\x6d\\x43\\x77\\x95\\xee\\x33\\xd0\\xf3\\xb3\\x17\\x67\\x97\\x67\\x5f\\x9c\\x4d\\x67\\xcf\\xdb\\xa1\\x9e\\x5d\\xea\\xc7\\x97\\xfa\\xf1\\xe5\\xde\\xc7\\x97\\xbb\\x7b\\xf4\\xfa\\x72\\xeb\\x0c\\x3e\\x79\\xf0\\x79\\xe6\\xcd\\xbe\\xb6\\xcf\\xaa\\x74\\xd0\\xb9\\x7e\\xf3\\x8b\\xb3\\x5f\\x9d\\x7d\\x74\\xf6\\xbb\\x1d\\xac\\xde\\xe3\\xc6\\x9c\\x7d\\xf4\\x76\\x7c\\xfa\\x76\\x38\\xfb\\xe8\\xc3\\x06\\x10\\x65\\x6b\\x90\\x86\\x82\\x2d\\x75\\x20\\xf3\\xc9\\x1d\\x28\\xf5\\xc8\\x27\\x9f\\xdc\\xd9\\xe2\\x1e\\xd0\\x91\\x3a\\x82\\xb4\\x76\\xf2\\xd9\\x3a\\xcc\\x66\\x8b\\x87\\x62\\x56\\x2a\\x1d\\xec\\x7f\\xf2\\x6e\\x58\\x88\\xe3\\xe6\\x11\\xbc\\x23\\x00\\x97\\x4d\\xa0\\xbb\\xda\\x22\\x13\\x6b\\x83\\x6f\\x1a\\xd8\\x76\\xf7\\x6f\\x6d\\xf0\\xe7\\xb3\\x57\\x67\\x5f\\x9d\\xbd\\xc2\\x4e\\xdd\\x35\\xda\\x7a\\x07\\x36\\xcf\\x7c\\xf8\\xeb\\x57\\xc3\\xe5\\xab\\xb3\\xaf\\x5f\\x7d\\xe9\\xdc\\x07\\xbf\\x3c\\xbb\\x7c\\xf5\\x42\\x40\\xf4\\xf2\\xcf\\xf2\\xdf\\x4a\\x53\\x37\\x2f\\xc3\\xbf\\xb5\\x83\\xd9\\xec\\xfd\\xe9\\xd9\\x53\\xdd\\xb4\\xa7\\xba\\x69\\x4f\\xf7\\x36\\xed\\xa9\\x1e\\xf5\\xd3\\xdd\\xde\\x3d\\xbd\\x3e\\xea\\xd2\\x91\\xbc\\xb5\\xc7\\x5f\\xaf\\x08\\xa2\\x1b\\xf3\\x37\\x0f\\xc6\\x10\\x3d\\xd7\\xf0\\x9b\\x3b\\x31\\x44\\xe8\\xce\\xef\\x37\\x8f\\x8f\\x21\\x76\\x31\\xe9\\xfd\\x28\\xf7\\xb8\\xab\\x3d\\xff\\xf0\\x9b\\xc7\\x01\\xf2\\x9e\\xa2\\xfd\\xe6\\x74\\xa8\\xf2\\x1d\\x13\\xfc\\xdb\\x3b\\x37\\x9d\\xfa\\xa5\\xfc\\xf6\\x5b\\xc0\\xcb\\x1d\\xe6\\xfa\\xed\\x2d\\xd6\\x38\\x6d\\xce\\xfd\\xf7\\x67\\xbf\\xd7\\x71\\x7f\\xaf\\xe3\\xfe\\x7e\\x6f\\xdc\\xdf\\xdf\\xa2\\x4b\\x9b\\x9d\\x6c\\x21\\x77\\xee\\x49\\xd9\\xfa\\xc9\\x8a\\xe4\\xf6\\x90\\x5f\\xc3\\x7c\\xe3\\xe5\\xcb\\x59\\x9f\\xde\\x7c\\xf9\\xc5\\x30\\xef\\xd0\\xe1\\xf5\\xef\\x2f\\x9e\\x8d\\x78\\xb5\\xf2\\x86\\x1d\\x4e\\xfc\\xed\\x2d\\x86\\xcc\\x6d\\x6e\\xd0\\x7d\\xf8\\x8b\\xcd\\xe5\\x37\\x0a\\x52\\xbb\\xb3\\xfe\\xf8\\xe1\\x3c\\xdd\\x66\\x5f\\xdb\\xc0\\x76\\x80\\x82\\x7d\\xfc\\x8e\\x14\\x8c\\x7d\\x77\\x63\\x3e\\xbe\\xc9\\xeb\\x6f\\x37\\x68\\xac\\x7b\\xec\\x84\\xcb\\x8f\\xdf\\x8d\\x06\\x06\\xd7\\x1d\\xc4\\xc7\\x8f\\xc4\\xc4\\x6d\\x6e\\xfa\\x43\\xc9\\x42\\x2f\\x59\\x7f\\x7c\\x8b\\x2c\\x94\\x6e\\x31\\xbf\\x3e\\x3b\\xf5\\x4e\\xbe\\x13\\x6f\\xe2\\x3a\\x7a\\xf0\\xe9\\x83\\xa1\\x35\\x74\\x40\\xf0\\xe9\\xdd\\xa8\\xb1\\xdb\\x9a\\x4f\\xbf\\x05\\x7a\\xd4\\x9d\\xe8\\xa7\\x0f\\x20\\x47\\x1d\\x7e\\xf9\\xf4\\x5d\\xaf\\x55\\x2f\\x14\\x7d\\xfa\\x8e\\x8c\\x61\\x7f\\xf7\\x3f\\x7d\\x9c\\x4b\\x11\\x3a\\x00\\xfd\\xf4\\x64\\x9a\\x49\\xb1\\x63\\x07\\x3e\\x7d\\xc7\\x1b\\xb5\\x0d\\x6a\\xbf\\x5e\\x77\\xa2\\x3b\\xf3\\x3f\\x3c\\x9c\\xd1\\xea\\x80\\xf4\\x0f\\x77\\x02\\xb6\\xdf\\xfc\\xe6\\x11\\x01\\xbb\\x57\\x88\\xfc\\xe1\\xb6\\x28\\xd6\\x9d\\xdb\\x1f\\x1e\\x00\\xfa\\x9b\\x6b\\x79\\x74\\x4e\\xec\\x0f\\xa7\\x43\\x55\\xcf\\x4a\\x1f\\x64\\x40\\x1e\\x76\\xe4\\xbd\\xa0\\xb8\\xd9\\xf9\\x11\\xd5\\x49\\x77\\x3c\\x9b\\x9d\\x3c\\x26\\x1f\\xd8\\x71\\x5b\\x9b\\xa3\\xee\\xa0\\xa4\\xc3\\x6d\\x9b\\x9f\\x6c\\x4b\\xf0\\xa7\\xf7\\xb1\\x13\\xe9\\x3b\\xbc\\xb0\\xf9\\xc9\\x3d\\xa0\\xd5\\x9f\\xbe\\xfe\\xcf\\xee\\x3f\\x91\\x07\\x23\\xfb\\x78\\x3a\\xb8\\xfe\\x61\\x9d\\x56\\x87\\xc3\\x36\\x3f\\x79\\x28\\xc1\\xe8\\xd1\\xd4\\xf6\\x10\\xef\\x76\\xd7\\xef\\x71\\xa3\\xae\\xb6\\xb0\\xdb\\xe6\\x17\\xdf\\x6c\\x89\\x8c\\x9b\\x5f\\x1c\\xd0\\x46\\x9c\\x3e\\xdc\\x6a\\xde\\x38\\x1d\\xe4\\x4f\\x90\\x2c\\xa9\\xd3\\x57\\x6c\\xf6\\xb6\\xa9\\xc0\\xd8\\xfc\\xe2\\xa1\\x84\\x36\\x9d\\xbe\\xa3\\x2b\\xe5\\x2d\\xdd\\xac\\x3e\\x7b\\x30\\x1a\\xee\\xc1\\xf3\\xb3\\xdb\\x38\\xa4\\x23\\x70\\x9f\\x3d\\x40\\xa8\\xeb\\x50\\xc6\\x67\\xef\\xca\\x58\\xe7\\xcd\\x99\\x3f\\xd4\\xf4\\xd0\\x9b\\x9d\\x3e\\x7b\\x9c\\x9b\\xb9\\xbd\\xc9\\x27\\x50\\xe1\\x5e\\x80\\xf8\\xec\\x1d\\x41\\xce\\x6f\\xae\\x73\\x95\\x96\\x42\\x77\\x5c\\x7f\\x7c\\x44\\xde\\xee\\x8f\\x77\\xd3\\xf5\\x8e\\x5c\\xfc\\xf1\\x5b\\x20\\xe3\\xdd\\x35\\xfa\\xe3\\x63\\x00\\xf6\\x1f\\x1f\\x89\\x73\\xeb\\xb6\\xed\\x41\\xc7\\x7d\\x87\\x70\\xd8\\x91\\x8c\\x07\\x0f\\xf2\\x78\\x8a\\xa6\\x5e\\xc1\\xfd\\xe0\\x49\\xdd\\x87\\xa9\\xe9\\x88\\xc3\\xf3\\xdd\\xc1\\x3d\\xfe\\x12\\xbb\\xc3\\x7d\\x76\\xf6\\xd5\\xd9\\x3c\\xbc\\x7e\\xf3\\xea\\x01\\x02\\xfd\\xed\\x6f\\x1f\\x6f\\x9e\\xbd\\xfd\\xe0\\xf6\\x58\\x57\\x5b\\x80\\x74\\xbb\\xe1\\x37\\xa7\\x36\\x1c\\xce\\xfe\\x74\\x36\\x6e\\xb1\\xf7\\x97\\xa7\\xdc\\xa1\\xbb\\xb7\\xb0\\x43\\x80\\xf7\\xe9\\xf7\\x11\\xc1\\xa0\\x23\\xad\\xc3\\x99\\xb0\\x4d\\x3b\\xa6\\xe9\\x81\\x4a\\xcd\\x6e\\xdb\\x0e\\x74\\xfb\\x78\\xab\\xa0\\xd4\\x21\\xd2\\x03\\xe3\\xbd\\xab\\xce\\xb0\\x5b\\xd3\\x3d\\xf7\\xe5\\xbe\\x88\\xf0\\x01\\xdd\\x3f\\xe2\\x96\\xf6\\x90\\xff\\x80\\xf9\\x5c\\x6d\\x31\\xb1\\x0f\\xe8\\xeb\\x9b\\x2d\\xaa\\xf4\\x80\\xbe\\x8e\\xde\\xf0\\x8d\\x33\\x7a\\xe0\\x4d\\xe8\\x8e\\xf5\\x48\\xf7\\x8f\\x77\\x7c\\xf6\\x3e\\xc3\\x3e\\x94\\x5b\\x4d\\x1d\\x99\\x3c\\x36\\xc8\\x63\\x6b\\xec\\x8f\\x8c\\xf5\\x60\\x25\\x7e\\xb7\\x6b\\x6f\\x1e\\xce\\x74\\x76\\x70\\xf5\\xe6\\x04\\xbb\\x4e\\x27\\x6d\\xbe\\x79\\x7c\\xd0\\xe8\\x2e\\xe3\\x9b\\x77\\x84\\x83\\xdc\\x9d\\xcd\\x9b\\x6f\\xcb\\xd7\\xe6\\xcd\\x3b\\x9e\\xf0\\xf6\\xa9\\xec\\xa1\\x84\\xd8\\x35\\x3a\\x95\\x8b\\x3b\\x7e\\xbc\\xbd\\x7a\\xe8\\x9b\\x87\\x1b\\x62\\xba\\x39\\x7e\\xf3\\x48\\x5c\\x7f\\xd7\\xf1\\xd5\\xc3\\x91\\x5f\\xb7\\xe0\\xab\\x47\\x02\\x8c\\xae\\xe3\\x47\\xba\\x1f\\x0f\\x5d\\x67\\x47\\x94\\x1e\\x71\\x3e\\x8f\\x77\\xf5\\x6b\\x87\\xb0\\x1f\\x71\\x9a\\x0f\\x56\\xa3\\xf4\\x10\\xf7\\x88\\xb3\\x7a\\x47\\x40\\x8b\\x1d\\x06\\x7a\\xc4\\xb9\\xf5\\xfa\\xc9\\x6f\\x75\\x2b\\x1a\\xb0\\xd6\\x4e\\xcc\\x7c\\xc4\\x31\\x1e\\x8a\\x97\\x7b\\x94\\xfb\\x10\\x62\\xf4\\xb8\\xb7\\x85\\xd7\\x5c\\xda\\xef\\xbd\\x7c\\xfd\\x6a\\x96\\xff\\x5f\\x5c\\xbe\\x7c\\xfb\\xf3\\x9f\\xbd\\xf7\\x76\\xf9\\xe2\\xe7\\xe6\\xff\\x0f\\x00\\x00\\xff\\xff\\x83\\x14\\xd5\\x4b\\x29\\x3a\\x01\\x00\")\n\nfunc fontsRobotoslabBoldWebfontSvgBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoslabBoldWebfontSvg,\n\t\t\"fonts/robotoslab-bold-webfont.svg\",\n\t)\n}\n\nfunc fontsRobotoslabBoldWebfontSvg() (*asset, error) {\n\tbytes, err := fontsRobotoslabBoldWebfontSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/robotoslab-bold-webfont.svg\", size: 80425, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoslabBoldWebfontTtf = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xa4\\x7d\\x09\\x78\\x13\\xd5\\xf6\\xf8\\xb9\\xb3\\x65\\x6f\\x33\\x59\\xdb\\xa6\\x4d\\x93\\xa6\\x1b\\x4c\\x4b\\x68\\xd2\\x85\\xb0\\x96\\x5d\\xf6\\x4d\\xa0\\x65\\x93\\x45\\x10\\x45\\x10\\x14\\x11\\x71\\x43\\x41\\x44\\x44\\x45\\x1f\\x88\\x4a\\x11\\xf1\\x09\\x82\\x88\\xdc\\x49\\x03\\xee\\x82\\x0a\\x8a\\x3b\\x2e\\xaf\\xe0\\x06\\x88\\xa2\\x84\\xa2\\xe2\\xfa\\xde\\x13\\x3a\\xf3\\xff\\xee\\x9d\\x49\\x69\\x4b\\x7d\\xef\\xfd\\xbe\\x3f\\xfd\\x4e\\x32\\xc9\\x4c\\x66\\xee\\xd9\\x97\\x7b\\xee\\x05\\x10\\x00\\x38\\x11\\x00\\x07\\x9d\\x07\\x0c\\xb8\\x74\\xd8\\xd4\\x9d\\x23\\xdf\\x03\\x40\\xdd\\x01\\x20\\x7b\\x60\\xbf\\xfe\\x03\\x98\\x7f\\xa1\\x23\\x00\\xa8\\x06\\x00\\x4a\\x06\\x8e\\x1c\\x31\\xe6\\xe8\\x76\\x7f\\x67\\x00\\xb4\\x1c\\xc0\\xf3\\xe9\\xc0\\x31\\x63\\xfb\\xc4\\xfb\\xef\\x7e\\x08\\x20\\x83\\x9c\\xaf\\x19\\x31\\x26\\x1c\\x79\\xf1\\x9a\\x82\\xd5\\x00\\x19\\x18\\x00\\xa6\\xce\\x98\\x3b\\x6d\\xfe\\x90\\xa1\\x4f\\x1e\\x02\\xc8\\xb4\\x03\\xa0\\x5f\\x66\\x2c\\x5a\\x18\\x48\\xdf\\xeb\\x18\\x02\\xe0\\xe3\\x00\\xa0\\xf3\\xac\\xf9\\x57\\xcc\\x1d\\x93\\x08\\x3f\\x05\\xe0\\x2b\\x07\\x60\\x66\\x5e\\x31\\xed\\xba\\xf9\\x00\\x60\\x07\\xc8\\xa9\\x03\\x00\\xe3\\x15\\x57\\xdf\\x38\\xeb\\x91\\x2f\\x97\\x56\\x01\\xe4\\x3c\\x09\\xf0\\x14\\x9e\\x3d\\x73\\xda\\xe5\\xc2\\xa4\\xe5\\xd3\\x00\\x0e\\x5c\\x0a\\x00\\x95\\xb3\\x67\\xcf\\x9c\\x66\\xbf\\x4f\\x78\\x1a\\xe0\\xc0\\x6a\\x00\\xc8\\x9f\\x3d\\x77\\xe1\\xe2\\x5f\\xc7\\x55\\xf4\\x06\\x38\\x80\\x01\\x58\\x7c\\xf5\\x35\\x33\\xa6\\x45\\x3f\\x32\\x4f\\x00\\x78\\x7b\\x2a\\x00\\xfa\\x7c\\xee\\xb4\\xc5\\xf3\\x19\\x13\\x8a\\x03\\xbc\\x4b\\xf0\\x0b\\xcc\\x9b\\x36\\x77\\xe6\\x0c\\xf1\\xbe\\x49\\x00\\xef\\x4e\\x02\\xe0\\x1c\\xf3\\xaf\\xb9\\x6e\\x61\\xad\\x78\\xab\\x0a\\xf0\\xe1\\x7c\\x00\\xe6\\xdf\\xf3\\xaf\\x9d\\x39\\xff\\xca\\x1f\\xbe\\x9c\\x02\\xf0\\xf1\\xd5\\x00\\xf0\\xc2\\x0d\\x33\\xa7\\xcf\\x3a\\x33\\x62\\x4c\\x2d\\xc0\\x27\\xc5\\x00\\x20\\x00\\x50\\xea\\xc1\\x7b\\x3d\\x9e\\xf8\\x90\\xbc\\xef\\x3f\\x2b\\x76\\x22\\xef\\x1f\\xde\\x56\\xf7\\x01\\x3d\\x93\\x46\\x46\\x45\\xbe\\x01\\x06\\x58\\x40\\xf0\\x3d\\x20\\x38\\x05\\x49\\x60\\xe0\\x34\\x34\\x02\\x02\\x8e\\x9e\\xd1\\xee\\x62\\x06\\x3f\\x94\\x00\\xea\\x37\\x60\\xe8\\xa5\\x60\\xa4\\x67\\x40\\x55\\xe9\\x19\\x34\\x67\\xe6\\xb5\\xf3\\xc0\\xa8\\x5f\\x47\\x7e\\x45\\x7e\\xc3\\x41\\x1a\\x3b\\xd2\\xb4\\xc8\\x72\\x09\\x20\\xe6\\x03\\x7a\\x7d\\x17\\x58\\x02\\x4b\\x60\\x29\\xac\\x80\\xb5\\xf0\\x04\\x6c\\x83\\x67\\xd1\\xe3\\x68\\x2b\\x7a\\x06\\x9e\\x40\\xef\\xa0\\x4f\\xd1\\x8f\\x8c\\x95\\xf1\\x33\\x9d\\x99\\xab\\x98\\xf9\\xcc\\x12\\x66\\x29\\xf3\\x22\\x73\\x90\\x39\\x08\\x2b\\x5a\\xfc\\xad\\x85\\x6d\\xfa\\xdf\\x13\\x17\\xfe\\x98\\xce\\xcc\\xfc\\x16\\x7f\\x07\\x99\\x83\\x4c\\x67\\xfa\\x1c\\xf2\\x87\\x60\\x12\\x58\\x00\\x81\\x4b\\x79\\x16\\x58\\xc8\\x57\\xaf\\x84\\x5a\\xf5\\x1e\\x98\\xa4\\x8e\\x01\\x16\\xd2\\xd4\\xef\\xa0\\x8f\\xfa\\x1b\\x4c\\x57\\x7f\\x02\\x04\\xab\\xd4\\x63\\xe4\\x6a\\xf5\\x34\\x74\\x07\\x51\\x39\\x04\\x4e\\xe5\\x10\\x14\\x2a\\x9f\\x42\\xb1\\x7a\\x04\\x4a\\xd4\\x23\\x10\\x56\\x3b\\x43\\xb9\\x7a\\x04\\x2a\\xd5\\x23\\x10\\x03\\x17\\x0c\\x50\\x8f\\xc2\\x25\\x6a\\x23\\x0c\\x52\\x1b\\x61\\xb0\\xda\\x08\\x43\\xd5\\x46\\xb8\\x54\\x6d\\x84\\x71\\x6a\\x23\\x8c\\x57\\xbf\\x83\\x09\\xea\\x69\\x98\\xa8\\x9e\\x82\\x29\\xea\\x29\\x58\\xae\\x7c\\x0a\\x77\\x2a\\x9f\\xc2\\x0a\\xe5\\x53\\xb8\\x4b\\xf9\\x14\\x56\\x2a\\x9f\\xc2\\xdd\\xca\\xa7\\x70\\x8f\\x7a\\x04\\x1e\\x52\\x8f\\xc0\\x7a\\xf5\\x08\\x3c\\xac\\x1e\\x81\\x47\\xd4\\x23\\xf0\\xa8\\x7a\\x04\\xea\\xd4\\x23\\xf0\\xa4\\x7a\\x14\\xb6\\xa8\\x47\\x61\\xab\\x7a\\x14\\x9e\\x52\\x8f\\xc2\\x36\\xf5\\x28\\x6c\\x57\\x8f\\xc2\\x0e\\xb5\\x11\\x9e\\x51\\x1b\\x61\\xa7\\xda\\x08\\xcf\\xaa\\x8d\\xb0\\x4b\\x6d\\x84\\x3d\\x6a\\x23\\x3c\\xa7\\x36\\xc2\\xf3\\x6a\\x23\\xbc\\xa0\\x36\\xc2\\x8b\\x6a\\x23\\xbc\\xa2\\x9e\\x86\\x57\\xd5\\xd3\\xb0\\x57\\x3d\\x0d\\xfb\\xd4\\xd3\\xf0\\x9a\\x7a\\x0a\\xde\\x50\\x4f\\xc1\\x7e\\xf5\\x08\\x1c\\x50\\x1b\\xe1\\x0b\\xe5\\x10\\x1c\\x55\\x0e\\xc1\\x71\\xe5\\x10\\xc5\\xfb\\x35\\xfa\\xfa\\x1e\\x18\\xa0\\x50\\x5d\\x0a\\xcb\\xd5\\xa5\\x70\\xa7\\xba\\x14\\x56\\xa8\\x4b\\xe1\\x2e\\x75\\x29\\xac\\x54\\x97\\xc2\\xdd\\xea\\x52\\x60\\xa0\\x16\\xd2\\x60\\x95\\x72\\x18\\x04\\x88\\xa9\\xc7\\xa0\\x9b\\xfa\\x2d\\x74\\x57\\x7f\\x84\\x9e\\xea\\x57\\xb0\\x59\\xfd\\x0a\\xde\\x54\\xbf\\x02\\x03\\x8c\\x57\\xf7\\xc2\\x24\\xf5\\x23\\xb8\\x46\\xbd\\x1a\\x6e\\x53\\xe7\\xc1\\x2a\\xb5\\x2f\\x3c\\xad\\x3e\\x03\\x2f\\xab\\x9b\\x89\\x54\\x80\\x0b\\xfa\\x80\\x08\\xe3\\xd5\\x13\\x30\\x1d\\x9c\\xf4\\x9b\\x10\\xf4\\x01\\x2b\\x8c\\x57\\x1b\\x61\\x3a\\xa4\\x41\\x1a\\x58\\xd4\\x13\\xf4\\xba\\x74\\xf5\\x43\\xe8\\x03\\x0e\\x18\\xa2\\x3e\\x0b\\xe3\\xd5\\x23\\x50\\xab\\x9e\\xa6\\xbf\\xb9\\x46\\x7d\\x16\\x6e\\x53\\xdf\\x87\\x55\\xea\\xe3\\xf0\\xb4\\xfa\\x1a\\xbc\\xac\\xee\\x83\\x63\\xea\\x27\\x14\\x87\\x93\\xc0\\xc0\\x40\\xf5\\x38\\xd4\\xaa\\x18\\x10\\xd4\\xaa\\xfb\\xe8\\x1d\\x23\\xf4\\x3e\\x97\\xa8\\xa7\\x60\\x90\\x7a\\x0a\\x06\\xab\\xa7\\x60\\xa8\\x7a\\x0a\\xc6\\xa9\\xa7\\xe8\\xfd\\x76\\xa8\\xa7\\xe0\\x19\\xf5\\x14\\xec\\x54\\x4f\\xc1\\xb3\\xea\\x29\\xd8\\xa5\\x9e\\x82\\x03\\xea\\x29\\x60\\x61\\x08\\xb8\\xa0\\x16\\x32\\x60\\x12\\x88\\x80\\x60\\x08\\xd8\\x00\\x41\\x17\\x30\\x80\\x15\\x5c\\x50\\x08\\xc5\\xd0\\x01\\x3a\\x82\\x04\\x9d\\xa1\\x0c\\xa2\\x50\\x0e\\x15\\x50\\x09\\x31\\xe8\\x06\\xdd\\xa1\\x27\\xf4\\x82\\x01\\x30\\x08\\x86\\xc0\\x78\\x98\\x08\\x53\\x60\\x39\\xdc\\x09\\x2b\\xe0\\x2e\\x58\\x09\\x77\\xc3\\x3d\\xb0\\x1a\\xee\\x85\\xfb\\xe0\\x7e\\x58\\x0b\\x0f\\xc1\\x7a\\x78\\x18\\x1e\\x81\\x47\\x61\\x33\\x3c\\x09\\x5b\\x60\\x2b\\x3c\\x05\\xdb\\x60\\x3b\\xbc\\x06\\x6f\\xc0\\x9b\\xf0\\x19\\x7c\\x0e\\x5f\\xc2\\x57\\x80\\x04\\x0f\\xd5\\x20\\x01\\x3c\\x50\\xc2\\x1d\\xe5\\xaf\\xe6\\xbf\\xe3\\xcf\\x03\\x0f\\xdd\\xc0\\x05\\xdd\\xa1\\x10\\x7a\\x82\\x07\\x36\\x83\\x07\\xde\\x04\\x0f\\x2a\\xa1\\xf2\\xdb\\x16\\x9c\\xed\\x00\\x91\\xef\\xb6\\x40\\xe4\\xbd\\x2d\\x94\\xb4\\x03\\x44\\x1f\\xda\\x02\\xd1\\x8f\\xb6\\x50\\xd9\\x0e\\x10\\xfd\\x69\\x0b\\x44\\x9f\\xda\\x02\\xd1\\xaf\\xb6\\x30\\xa8\\x1d\\x18\\xdc\\x0e\\x0c\\x6d\\x07\\x2e\\x6d\\x07\\xc6\\xb5\\x03\\x44\\x7f\\xdb\\x02\\xd1\\xe7\\xb6\\x40\\xf4\\xbb\\x2d\\x4c\\x69\\x07\\x88\\xfe\\xb7\\x85\\x3b\\xdb\\x81\\x15\\xed\\xc0\\x5d\\xed\\xc0\\xca\\x76\\xe0\\xee\\x76\\x80\\xd8\\x97\\xb6\\xf0\\x50\\x3b\\xb0\\xbe\\x1d\\x78\\xb8\\x1d\\x78\\xa4\\x1d\\x78\\xb4\\x1d\\xa8\\x6b\\x07\\x88\\x3d\\x6b\\x0b\\x5b\\xda\\x81\\xad\\xed\\xc0\\x53\\xed\\xc0\\xb6\\x76\\x60\\x7b\\x3b\\x40\\xec\\x65\\x5b\\x78\\xa6\\x1d\\xd8\\xd9\\x0e\\x3c\\xdb\\x0e\\xec\\x6a\\x07\\xf6\\xb4\\x03\\xcf\\xb5\\x03\\xcf\\xb7\\x03\\x2f\\xb4\\x03\\x2f\\xb6\\x03\\xc4\\x9e\\xb7\\x85\\x57\\xdb\\x81\\xbd\\xed\\xc0\\xbe\\x76\\x80\\xf8\\x83\\xb6\\xf0\\x46\\x3b\\x40\\xfc\\x45\\x5b\\x20\\xfe\\xa3\\x2d\\x10\\x7f\\xd2\\x16\\x8e\\xb6\\x03\\xc7\\xdb\\x81\\x10\\xf5\\x39\\x6d\\x61\\x79\\x3b\\x70\\x67\\x3b\\xb0\\xa2\\x1d\\xb8\\xab\\x1d\\x58\\xd9\\x0e\\xdc\\xdd\\x0e\\xf8\\xa9\\x67\\x6b\\x0b\\xc4\\xd3\\xb5\\x05\\xe2\\xf9\\xda\\x02\\xf1\\x84\\x6d\\x61\\x73\\x3b\\xf0\\x66\\x3b\\xc0\\x43\\x4c\\xfd\\x00\\xba\\xa9\\x5b\\xa1\\xa7\\x5a\\x07\\x9b\\xd5\\x3a\\x78\\x53\\xad\\x03\\x01\\xc2\\xea\\x8f\\xd0\\x55\\xfd\\x11\\x36\\xaa\\x3f\\xc2\\x63\\xea\\x8f\\xb0\\x49\\xfd\\x11\\x1e\\x57\\x7f\\x04\\x04\\x02\\xd8\\x40\\x82\\x28\\x54\\x42\\x15\\x54\\x03\\x42\\xaf\\xa7\\xbc\\x04\\xea\\x8c\\xa6\\xa0\\xc5\\xe8\\x41\\xb4\\x0d\\x06\\x50\\xef\\xd7\\x16\\x88\\x37\\x6c\\x0b\\xc4\\x3b\\xb6\\x85\\x41\\xed\\xc0\\xe0\\x76\\x60\\x68\\x3b\\x30\\xae\\x1d\\x20\\xde\\xb6\\x2d\\x10\\xef\\xdb\\x16\\x9e\\x69\\x07\\x76\\xb6\\x03\\xcf\\xb6\\x03\\xbb\\xda\\x81\\x03\\xed\\x80\\x05\\x2e\\x51\\xcf\\xc0\\x20\\xf5\\x0c\\x0c\\x56\\xcf\\xc0\\x50\\xf5\\x0c\\x8c\\x53\\xcf\\xc0\\x0e\\xf5\\x0c\\x3c\\xa3\\x9e\\x81\\x9d\\xea\\x19\\x78\\x56\\x3d\\x03\\xbb\\xd4\\x33\\x70\\x40\\x3d\\x03\\x02\\x5c\\xaa\\x9e\\x81\\x3d\\xea\\x19\\x78\\x4e\\x3d\\x03\\xcf\\xab\\x67\\xe0\\x05\\xf5\\x0c\\xbc\\xa8\\x9f\\x39\\x01\\x7b\\xd4\\x13\\xf0\\x9c\\x7a\\x02\\x9e\\x57\\x4f\\xc0\\x0b\\xea\\x09\\x78\\x51\\x3d\\x01\\x3c\\x88\\xea\\x72\\x70\\xaa\\xcb\\xe1\\x0b\\x75\\x39\\x1c\\x55\\x97\\xc3\\x71\\x75\\x39\\xe5\\xe8\\x19\\xe8\\xaa\\x9e\\x81\\x8d\\xea\\x19\\x78\\x4c\\x3d\\x03\\x9b\\xd4\\x33\\xf0\\xb8\\x7a\\x86\\x72\\x74\\x08\\x8c\\x84\\x51\\x50\\x0b\\x93\\x60\\x2a\\x30\\xe6\\x83\\x84\\xa3\\x46\\xa3\\x69\\x1e\\xe4\\x81\\x1f\\x00\\x44\\xf5\\x98\\xfa\\x9b\\xda\\x47\\xdd\\xaf\\x76\\x51\\xf7\\xab\\xa0\\x9c\\x52\\xaf\\x52\\x1f\\x50\\xfe\\xa9\\x5e\\xad\\xfe\\x06\\xff\\xf3\\x3f\\xf5\\x14\\x80\\xfa\\x36\\x80\\x7a\\xb2\\xf9\\x9b\\x5f\\xff\\xcb\\x4f\\xc4\\x0b\\xd7\\xb6\\xb8\\xcf\\xb7\\xe4\\xcc\\x7f\\x7d\\xda\\xd7\\xcd\\x47\\xa7\\x01\\xd4\\x7f\\xb4\\x7c\\x2e\\x80\\xba\\x5f\\x4d\\xaa\\x27\\xd4\\x15\\xff\\xf3\\xd8\\xbf\\xf9\\x5f\\xaf\\xa4\\x57\\xff\\xa0\\x7e\\xd7\\xe2\\xa3\\x4b\\xfd\\xe9\\xe2\\x2b\\xda\\xfd\\xdd\\xbb\\xea\\xcd\\xaa\\xac\\x3e\\xab\\x7e\\x4b\\xb2\\x3d\\x0d\\xd4\\xbd\\x00\\x90\\xae\\xde\\x0a\\xa0\\x0e\\x25\\xd7\\x28\\x8a\\xfa\\x94\\xba\\x5f\\xad\\x57\\x9f\\x52\\x13\\xca\\x59\\xf5\\xac\\xba\\x53\\xed\\x4e\\x7f\\xfb\\xa0\\x6a\\x55\\x67\\xa9\\xd3\\xd4\\x57\\xc0\\x00\\xa0\\x01\\xf9\\x15\\xf0\\x6a\\x3a\\x80\\x1a\\xa5\\xbf\\xad\\x54\\xc7\\xaa\\x2b\\xd4\\xab\\x00\\xd4\\x39\\x8a\\x5f\\xfd\\x48\\xbd\\xac\\xc5\\xb3\\xcf\\xb4\\x3b\\xa2\\x23\\x2d\\x8e\\x3f\\xf8\\x0b\\x6c\\xff\\xae\\x9e\\x54\\x8f\\xa8\\xeb\\x5a\\x7c\\x93\\xbc\\xe8\\x9a\\x66\\x7a\\xa8\\x9e\\x8b\\xce\\xdd\\xa9\\x7e\\xaf\\xfc\\x4b\\xdd\\xa3\\x24\\x95\\xf7\\xd4\\xa8\\xfa\\x0b\\xb9\\x63\\xfb\\x4f\\x6a\\xf5\\xab\\x6b\\xa8\\xfc\\xa4\\xb7\\x73\\xe6\\x29\\x00\\xd5\\xa5\\x7e\\xa9\\xbe\\xaf\\x5c\\xdd\\x5a\\xc2\\xd4\\xdf\\xd5\\x4b\\xfe\\x87\\x3b\\xd7\\xfd\\xd7\\x2b\\x3e\\x56\\x7f\\x6f\\x79\\x67\\x2a\\x91\\xda\\x11\\xcd\\x6b\\xd5\\x0e\\xea\\xa7\\xcd\\xdf\\xcc\\xa0\\xd7\\x4b\\xf4\\x83\\xa8\\x7e\\xa4\\x36\\xaa\\x5f\\xd3\\x3c\\x23\\x75\\xbe\\x51\\x3b\\xd3\\xe2\\x6e\\x17\\x68\\xd5\\xbd\\xcd\\x73\\xf7\\xaa\\x67\\xd4\\x6f\\xc0\\x01\\x40\\x41\\x54\\x3f\\x4b\\xfd\\x52\\x25\\x2f\\x36\\x35\\x53\\xdd\\xab\\x9e\\x50\\x93\\x2a\\x56\\xdf\\x54\\x4b\\xd4\\xb3\\xea\\x6b\\xca\\x89\\xe6\\xdf\\x7e\\xdd\\xea\\x56\\x69\\x17\\x24\\x50\\x1d\\x4b\\x5f\\x17\\xb4\\xd0\\x98\\x3a\\x00\\xf5\\x98\\x3a\\xe7\\xc2\\x18\\xd5\\x93\\x2d\\x25\\xfa\\x62\\xe9\\xd5\\xb1\\x68\\xfb\\xed\\x3b\\x6a\\x52\\x7d\\xa5\\x59\\x1e\\x52\\xe3\\x26\\x67\\x5e\\x02\\x50\\xbe\\x22\\x47\\xca\\x5c\\xb5\\x3f\\xfd\\xe6\\x51\\xf5\\x63\\xa5\\x09\\x40\\xdd\\xd5\\xea\\x0e\\x3f\\x37\\x1f\\xd5\\x03\\xa8\\xc7\\xdb\\x7b\\xca\\x7f\\xff\\xa7\\xbe\\xf0\\x7f\\xfe\\xc5\\xef\\xcd\\x47\\x4f\\x35\\x1f\\xfd\\xd2\\x7a\\x64\\x17\\xc6\\x06\\xad\\xf4\\xe7\\x82\\x64\\xa8\\x7b\\xfe\\x8f\\x4f\\xfd\\xa3\\xc5\\xf1\\x84\\xff\\x76\\xc5\\x45\\xe7\\x2e\\xd0\\x6a\\x65\\xf3\\xd1\\xd9\\x56\\x57\\x9c\\x6d\\xcd\\xa7\\xd4\\x98\\x5b\\x61\\xc2\\x37\\x9f\\x3d\\xdc\\x7c\\x54\\xdb\\x46\\x8f\\x7e\\x6e\\x75\\x0f\\x47\\xf3\\x07\\xa1\\x9d\\x51\\x8d\\x69\\x2d\\x2d\\xe4\\x99\\x17\\x2c\\x89\\x7a\\xf0\\xaf\\xf1\\xf9\\xcf\\xff\\x5a\\x5a\\xa6\\xbf\\xb8\\xa2\\x5d\\x8b\\x06\\x17\\x51\\xe5\\xff\\x76\\x45\\x2b\\x9b\\xb9\\xa9\\xd5\\x19\\x9d\\xea\\xea\\x01\\xed\\xe9\\xea\\x93\\xf0\\x1f\\xac\\xa6\\xf2\\x7f\\xf2\\x28\\xcd\\xcf\\x98\\x00\\xa0\\xee\\x54\\x03\\xe4\\xc9\\xea\\xf7\\x70\\x91\\xe6\\x11\\xff\\x7a\\xd1\\x6f\\xbe\\x01\\x50\\x77\\x37\\x7f\\xba\\xf1\\x2f\\xef\\xdd\\x56\\x87\\x19\\xe8\\x06\\x06\\x30\\x80\\x1f\\xac\\x60\\x05\\x3f\\x88\\x20\\x42\\x2e\\x38\\xc1\\x09\\xb9\\x50\\x04\\x45\\x80\\xa0\\x18\\x8a\\x81\\x83\\x0e\\xd0\\x01\\x58\\xe8\\x08\\x1d\\x81\\x87\\x52\\xe8\\x04\\x0c\\x84\\x21\\x0c\\x56\\xe8\\x0c\\x9d\\xc1\\x04\\x65\\x50\\x06\\x66\\x88\\x40\\x14\\x18\\x28\\x87\\x72\\x60\\xa1\\x02\\x2a\\xc0\\x02\\x31\\x88\\x81\\x00\\x5d\\xa1\\x2b\\x58\\xa1\\x1b\\x74\\x03\\x1b\\x74\\x87\\xee\\x60\\x87\\x1e\\xd0\\x03\\xd2\\xa0\\x27\\xf4\\x84\\x74\\xe8\\x05\\xbd\\x40\\x84\\x01\\x30\\x00\\x9c\\x30\\x10\\x06\\x82\\x1b\\x2e\\x81\\x4b\\xc0\\x05\\x83\\x61\\x30\\x78\\x60\\x18\\x0c\\x03\\x2f\\x8c\\x86\\x31\\xe0\\x85\\x4b\\xe1\\x52\\xc8\\x80\\xb1\\x30\\x16\\xdc\\x30\\x1e\\xc6\\x43\\x16\\x4c\\x80\\x09\\xe0\\x83\\x89\\x30\\x11\\x32\\x61\\x32\\x4c\\x86\\x6c\\x98\\x02\\x53\\x20\\x13\\x2e\\x83\\xcb\\x20\\x07\\xee\\x81\\x7b\\x80\\x83\\xd5\\x70\\x3f\\xf0\\xb0\\x06\\xfe\\x06\\x0c\\xac\\x85\\xb5\\xc0\\xc2\\x3a\\x58\\x07\\x0c\\x3c\\x04\\x8f\\x02\\x0b\\x1b\\xe1\\x71\\xb0\\xc2\\x66\\xd8\\x0c\\xe9\\xf0\\x24\\x6c\\x27\\x31\\x23\\xec\\x00\\x17\\x3c\\x03\\xbb\\xc0\\x03\\xbb\\x61\\x37\\x78\\x61\\x0f\\xbc\\x08\\x19\\xf0\\x0a\\xec\\x03\\x1f\\xbc\\x06\\xaf\\x41\\x26\\xbc\\x0e\\xaf\\x83\\x1b\\xde\\x80\\x37\\x20\\x13\\xde\\x84\\x37\\x21\\x9d\\xd6\\x53\\xfc\\xf0\\x05\\x7c\\x01\\xb9\\xb4\\xae\\xe2\\x87\\xa3\\x70\\x14\\x72\\xe1\\x38\\x1c\\x87\\x5c\\x60\\x20\\x46\\xa9\\x6c\\xa2\\x54\\x36\\x51\\x2a\\x3b\\xc1\\x01\\x0e\\xc8\\xa4\\xb4\\x76\\x42\\x21\\x14\\x82\\x9d\\xd2\\x9a\\x87\\x12\\x28\\x01\\x9e\\xd2\\x37\\x9b\\x52\\x93\\x87\\x4a\\xa8\\x04\\x1e\\xba\\x40\\x17\\xc8\\xa2\\x34\\x35\\x53\\x9a\\x1a\\x28\\x4d\\x05\\x4a\\x53\\x1b\\xa5\\xa9\\x83\\xd2\\xd4\\xd8\\x82\\xa6\\x3e\\xb8\\x04\\x06\\x83\\x0b\\x86\\xc2\\x50\\x70\\x51\\x6a\\xe6\\xd0\\x28\\x30\\xa7\\x05\\x4d\\x59\\x4a\\x53\\x2f\\x8c\\x83\\x71\\xe0\\x82\\x1a\\xa8\\x81\\x0c\\x4a\\x59\\x0b\\xa5\\x2c\\x47\\x29\\xeb\\xa1\\x94\\xe5\\x28\\x65\\xdd\\xb0\\x00\\x16\\x40\\x26\\x2c\\x87\\xbb\\xc1\\x4e\\xa9\\xcc\\x53\\x6a\\xf2\\x50\\x07\\x75\\xc0\\x53\\x9a\\x1a\\x28\\x4d\\x8d\\x94\\xa6\\x3e\\xd8\\x01\\xbb\\xc0\\xd5\\x82\\x9a\\x2c\\xa5\\xa6\\x85\\x52\\x93\\xa3\\x74\\xe4\\x60\\x3f\\xec\\x07\\x1e\\x0e\\xc0\\x01\\x70\\x51\\x9a\\x1a\\xe1\\x30\\x1c\\x81\\x4c\\x4a\\x59\\x13\\xa5\\xac\\x93\\x52\\xd6\\x44\\x29\\xeb\\xa4\\x94\\x75\\x02\\x03\\x19\\x94\\xb2\\x40\\x29\\x8b\\x28\\x65\\x19\\x4a\\x51\\x16\\x0a\\xa1\\x23\\x70\\x50\\x0a\\x15\\x60\\x82\\x18\\xf4\\x02\\x07\\x0c\\x80\\x4b\\x20\\x93\\x4a\\x56\\xb6\\x4e\\x8b\\xd1\\x30\\x16\\xfc\\x54\\x9a\\xf2\\x60\\x02\\x4c\\x84\\x10\\x4c\\x86\\xcb\\xa0\\x80\\xe2\\x56\\x0c\\xf7\\xc0\\xa3\\xd0\\x09\\x36\\xc2\\x66\\xe8\\x49\\x31\\xe9\\x4b\\x31\\x19\\x04\\xbb\\xe1\\x45\\x18\\x0e\\xaf\\xc0\\x1b\\x70\\x29\\x1d\\xeb\\x44\\xf8\\x0c\\x8e\\xc2\\x24\\x3a\\xa6\\xe9\\xff\\xad\\xa6\\x7d\\xf5\\x95\\x57\\x4c\\x6b\\x55\\xd3\\xe6\\xe8\\xbb\\x11\\x10\\x64\\xd1\\x77\\x06\\x04\\xb0\\xd2\\x5a\\xf9\\x28\\x38\\x05\\x0c\\x0c\\x07\\x44\\x2b\\x84\\x2c\\x37\\x84\\x79\\x19\\x78\\xe0\\xf8\\x47\\xf9\\x28\\x00\\xca\\xd5\\xde\\xd9\\x8f\\x60\\x16\\xd3\\x4a\\xa9\\x8f\\x03\\xa3\\x8e\\x84\\xc0\\x44\\x00\\x08\\x90\\xcf\\xf3\\x6f\\xbc\\xf6\\x3a\\x08\\x00\\x73\\x8e\\x13\\x66\\x29\\xb3\\x00\\x8c\\xd3\\x99\\xfb\\x02\\x80\\x36\\x8d\\x40\\x00\\x5c\\x57\\x1e\\xd3\\xeb\\xc8\\x2d\\x58\\x1d\\xb2\\xb5\\xea\\x3e\\x9c\\xa1\\xb5\\x7b\\xf2\\x99\\x83\\x43\\x00\\xd0\\x19\\x02\\xc0\\xd1\\x98\\x95\\x01\\x13\\xd8\\xe0\\x56\\x50\\xd1\\x18\\xb4\\x98\\x79\\x93\\xf9\\x32\\x60\\x0e\\xb8\\x02\\x59\\x01\\x7f\\x20\\x2f\\x50\\x18\\x08\\x07\\xba\\x06\\x2e\\x0b\\x3c\\x13\\xcc\\x2b\\x38\\x7f\\x8e\\x53\\x55\\xdd\\xd2\\x90\\x5f\\x04\\xe0\\x71\\x34\\x5a\\xff\\x05\\x04\\xec\\x81\\x8c\\x40\\xb6\\xfe\\x8b\\x58\\xf3\\x2f\\x10\\xa5\\x14\\x52\\xcf\\xa9\\xbf\\xab\\x27\\xd5\\xfd\\xea\\xb5\\xea\\x70\\x05\\x35\\x9d\\x39\\xfe\\xf6\\xf1\\xfd\\xc7\\x5f\\x3b\\xbe\\xef\\xf8\\x2b\\xc7\\x5f\\x3c\\x1e\\x3f\\xbe\\xfd\\xf8\\x9d\\xc7\\x63\\xc7\\xf6\\x7f\\xde\\xc8\\x7f\\xaf\\x8f\\xf6\\xff\\xf4\\x0f\\x09\\x84\\xe8\\xac\\x76\\x9c\\x9a\\x8d\\x68\\x75\\x01\\x00\\x2f\\x18\\x8c\\x26\\xb3\\xc5\\x6a\\x4b\\x4b\\xb7\\x8b\\x0e\\xa7\\xcb\\xed\\xf1\\x66\\x64\\x66\\xf9\\xb2\\x73\\xfc\\xb9\\x81\\x60\\x5e\\x28\\xbf\\xa0\\xb0\\xa8\\xb8\\x43\\x47\\xa9\\xa4\\xb4\\x53\\xb8\\x73\\x59\\x24\\x5a\\x5e\\x51\\x59\\xd5\\x25\\xd6\\xb5\\x5b\\xf7\\x1e\\x3d\\x7b\\x55\\xf7\\xee\\xd3\\xb7\\x5f\\xff\\x01\\x03\\x2f\\x19\\x34\\x78\\xc8\\xd0\\x61\\xc3\\x47\\x8c\\x1c\\x35\\x7a\\xcc\\xa5\\x63\\xc7\\x8d\\xaf\\xa9\\x9d\\x30\\x71\\xd2\\xe4\\x29\\x97\\x4d\\x9d\\x36\\x7d\\x06\\xac\\xbc\\xfb\\x9e\\x7b\\xd7\\x3d\\xfa\\xf8\\x96\\x27\\xb7\\x6e\\x7b\\x6a\\xfb\\x8e\\x9d\\xcf\\x3c\\xbb\\x4b\\xc6\\xf1\\xfa\\xdd\\xcf\\xed\\x79\\xfe\\xc5\\x17\\x5e\\x7d\\x65\\xef\\x3e\\x58\\x38\\xeb\\x8a\\x39\\xc7\\x96\\xfc\\xfd\\xda\\xb9\\xdf\\x2d\\xbe\\x1a\\x56\\xd5\\xc1\\xf5\\x00\\x57\\x6a\\xb6\\x7d\\xde\\xad\\xf0\\xf4\\xcb\\xcb\\x66\\xce\\x27\\xc7\\xd7\\xdc\\x76\\xfc\\xf2\\xe5\\x77\\x3d\\xb2\\xff\\xc0\\xe1\\x23\\x5f\\x7e\\xf5\\xd9\\xe7\\x2f\\xc1\\x1b\\x6f\\xc2\\xc9\\x13\\xdf\\x9c\\x4a\\xc2\\x4d\\x5f\\x1c\\x85\\x15\\xf7\\xdd\\x79\\xff\\xea\\x07\\x1e\\xfc\\xdb\\x9a\\xf5\\x0f\\xc3\\x43\\x8f\\x6d\\xda\\x08\\x6f\\x1d\\xbc\\x0e\\x00\\x6e\\xd6\\xd1\\xa4\\xfc\\xff\\x1a\\x30\\xca\\x47\\x5e\\x38\\x8e\\x8c\\xf0\\x19\\xf2\\xa3\\x7c\\x26\\x0c\\xbb\\xe1\\x1b\\x38\\x09\\x2f\\xc1\\x51\\x94\\x07\\xa7\\xe0\\x27\\x78\\x15\\xfa\\xf1\\x22\\x86\\x12\\x0c\\xce\\x21\\x78\\xe8\\xc8\\x1a\\x3c\\x78\\x51\\x2d\\x86\\x50\\xaf\\x0c\\x2c\\x48\\x35\\x3d\\x6a\\xe9\\x77\\xb7\\xd4\\x06\\x3e\\xc5\\xc8\\xd9\\x29\\xa3\\x14\\xa3\\x92\\xc0\\xe7\\xd8\\x2a\\x95\\x62\\xa6\\x64\\xc8\\xe8\\x9a\\xfe\\xa1\\xda\\x60\\x29\\x66\\x4b\\xae\\xcc\\x08\\xe0\\xea\\x91\\x35\\x41\\x5c\\x5d\\x5b\\x8a\\xb9\\x12\\xf2\\xd3\\x60\\x28\\xb8\\xa4\\xe6\\x2b\\xdf\\xfb\\xb5\\xbe\\x21\\xa3\\x6b\\x6a\\x9a\\x7c\\x3f\\xd4\\xfa\\x42\\x41\\xcc\\x4b\\x35\\x78\\xc0\\xa2\\x5a\\x7a\\xa2\\xb6\\x36\\xa3\\x14\\xf3\\x25\\xb6\\x49\\x13\\x4a\\xb1\\x50\\x22\\xe7\\xa1\\x95\\x23\\x6b\\x70\\x60\\xe5\\xa4\\x49\\x3e\\x0c\\xb5\\xa5\\xd8\\x50\\x22\\xe7\\xd3\\xaf\\xaa\\x9b\\xbf\\x32\\x96\\x38\\xc4\\x40\\x2c\\x5c\\x8a\\x4d\\x25\\x81\\x5b\\xc8\\x43\\xf6\\xfb\\xde\\xaf\\x0d\\x60\\xb6\\x60\\x50\\x28\\x80\\xb9\\xc2\\xc1\\x18\\x46\\xd6\\xac\\x9a\\xb9\\x6a\\x5a\\x80\\x1c\\x74\\xf1\\x05\\x83\\xb5\\xbe\\x55\\xf4\\xd3\\x68\\xed\\x13\\x79\\xa0\\x59\\x1b\\x9d\\xdd\\x67\\x0f\\xd6\\x96\\x62\\x4b\\x49\\xe0\\x63\\x8a\\x8e\\xb5\\x24\\x10\\xc6\\x06\\x69\\x52\\x4d\\x20\\x30\\x30\\x34\\x60\\xda\\x55\\x81\\x9a\\xc0\\xe5\\xd3\\xb5\\x5b\\x90\\xeb\\x6c\\xe4\\xc9\\x81\\x58\\x38\\xb0\\x2a\\x30\\x70\\xd5\\x80\\x69\\xa1\\x55\\x81\\x55\\x21\\xfa\\xb8\\x10\\xb9\\x39\\xae\\xee\\xe2\\x0b\\xd6\\xfa\\x42\\xe4\\x0b\\x5c\\x3d\\x93\\x7c\\xa8\\x2d\\xc5\\x69\\xf4\\x49\\x3d\\x1a\\x32\\x82\\x41\\x5f\\xa0\\x61\\xd5\\x90\\xd1\\x35\\x81\\x55\\xa1\\x41\\x01\\x0c\\x63\\xf5\\xb1\\x05\\xe9\\x65\\xe9\\x25\\xa1\\x40\\x83\\xfe\\xf0\\x50\\xa0\\x66\\xc8\\x18\\x5f\\x10\\xa3\\xda\\x9a\\x55\\x98\\x2b\\x1c\\x14\\x5a\\x15\\x0a\\xac\\x1a\\xb4\\x2a\\x34\\x8d\\xfc\\x40\\xfb\\x09\\x79\\x2b\\xc5\\x76\\xc2\\x06\\x87\\x54\\x8a\\x45\\x82\\x00\\x39\\x70\\xb4\\x41\\x60\\x15\\x79\\x0b\\x4d\\xbb\\x6a\\x6a\\x4b\\x4c\\xc8\\x4f\\x9d\\x25\\x81\\x55\\x81\\x55\\x77\\x11\\xb2\\x0d\\xbe\\x3c\\xb4\\xca\\x80\\x03\\x23\\x6b\\xba\\xfb\\xf6\\xd5\\x96\\x62\\x57\\x49\\x3d\\x54\\xa3\\xea\\x3e\\x7d\\xd0\\x90\\xe7\\xed\\x30\\x03\\xe8\\x2b\\xb9\\x78\\x6c\\x0d\\x79\\x1d\\x5d\\x13\\x9a\\x1e\\xc0\\x10\\xea\\xe3\\x9b\\x1e\\xc0\\x28\\xd4\\xa7\\x36\\x80\\xab\\x47\\xd7\\xc4\\x21\\x00\\x7d\\x67\\xf4\\x89\\xa3\\x00\\xea\\x3b\\xa3\\x0f\\x0e\\xcc\\xc0\\x99\\x33\\xb3\\x53\\xcf\\x72\\x97\\x60\\xd4\\x77\\x46\\x08\\x43\\xdf\\x19\\xa1\\x52\\x4d\\xfb\\x88\\x15\\x48\\x07\\x06\\xfa\\x01\\x30\\x97\\xf3\\x63\\x81\\x05\\x03\\x74\\x92\\x11\\x84\\xbb\\xc7\\x0d\\x9c\\xe7\\x87\\x88\\x2c\\xf0\\x5f\\x76\\x8f\\xb3\\x8c\\xe7\\x87\\x08\\xc8\\x2c\\xf9\\x9a\\x27\\x5f\\xc7\\x0d\\x82\\xf7\\x7c\\xf7\\x38\\x22\\xdf\\x47\\xc5\\xa0\\x58\\x10\\x14\\x83\\xfd\\x98\\x80\\x92\\x8f\\x1e\\x56\\x66\\xf3\\x63\\xff\\xdc\\xd1\\x8f\\x7b\\x9f\\x6a\\xfb\\x0d\\x00\\x68\\x03\\x8f\\xe9\\x7d\\x2b\\x21\\x0e\\x00\\x52\\x02\\xb1\\x50\\xcc\\x49\\x71\\x9e\\x01\\x09\\x61\\x63\\x18\\x43\\x03\\xe6\\x22\\x32\\xcb\\x27\\xb1\\x10\\x91\\x0d\\x7c\\x52\\x36\\x21\\x09\\x64\\x1e\\x89\\x0e\\xcc\\xc5\\x3a\\x97\\x91\\xfb\\x23\\x31\\x28\\xde\\x80\\xf2\\x95\\x2f\\x51\\x3e\\x02\\x15\\xd0\\x1f\\xec\\x8b\\xe7\\x07\\x90\\xfb\\xaf\\xe6\\xd2\\x99\\xc7\\x85\\x0c\\xe0\\xc0\\x04\\xdd\\x01\\x43\\x18\\xf3\\x51\\xf2\\x00\\x23\\x27\\x61\\x21\\x82\\xb0\\x99\\xdc\\x5e\\x66\\x4d\\xc9\\x04\\x67\\x02\\x0b\\x27\\x61\\xd6\\x2e\\xf3\\x48\\x92\\x8d\\xa6\\x64\\xc2\\x44\\xbf\\x91\\x2d\\x48\\x82\\xce\\x65\\x4e\\x31\\x2a\\x1a\\xa2\\xe4\\x65\\xf5\\x07\\xc3\\xde\\x7c\\x7f\\x18\\x97\\xce\\x98\\x94\\xb3\\xff\\xa6\\x2f\\xc0\\x40\\x11\\x00\\xb7\\x8c\\xc7\\xe0\\x83\\x5c\\x34\\x0b\\xe2\\x59\\x00\\x52\\xdc\\xed\\xc9\\x8c\\x46\\xa3\\x71\\x03\\x03\\x52\\xdc\\x68\\xb1\\x46\\xa3\\xd1\\x04\\xa0\\x2c\\x83\\x4d\\xaa\\x67\\xc4\\xec\\x9c\\x7c\\x6f\\x54\\x06\\x2e\\x59\\xef\\xf2\\x66\\xf8\\xf2\\xbd\\x91\\x04\\xcf\\xd1\\x53\\xac\\xdd\\x9f\\x4b\\x4e\\xf1\\x5c\\xb2\\x5e\\x30\\x99\\x6d\\xf9\\xde\\x08\\xc2\\x81\\x30\\xce\\x6a\\x48\\x64\\x6a\\x23\\xcc\\xb4\\xcb\\x1e\\x24\\x25\\xdc\\xf4\\x53\\xdc\\xed\\x31\\x4b\\xf5\\xd5\\x6e\\xa7\\x49\\xaa\\x37\\xba\\x3d\\x46\\x29\\x61\\xd0\\xae\\x32\\x84\\x13\\x46\\xed\\x0a\\x83\\x91\\x5c\\x61\\xe0\\x4c\\x12\\x76\\xdb\\x09\\x36\\x09\\xab\\x86\\x58\\x10\\x49\\xb8\\x32\\xeb\\xc5\\x5e\\xc6\\xdf\\x4e\\x83\\x5b\\x32\\xbf\\xd8\\xcb\\xf4\\xdb\\x59\\x72\\x80\\xb3\\xec\\xf5\\x4c\\x96\\xc1\\x29\\xd5\\xb3\\xf4\\x55\\x20\\xaf\\x38\\xd3\\x5e\\x6f\\xca\\x34\\x3a\\x25\\xec\\xb1\\xd7\\x9b\\x3d\\x16\\x27\\xb9\\x5b\\xbd\\xcd\\x6d\\x75\\x4a\\xf5\\x76\\xfa\\x2a\\xd2\\x57\\x17\\x79\\x25\\xd7\\x78\\xe9\\x35\\x99\\xf6\\xfa\\x0c\\xfa\\xab\\x2c\\x7b\\xbd\\x2f\\x75\\x9f\\xec\\xd4\\x7d\\x72\\xc8\\x35\\xf5\\xfe\\xd4\\x95\\xb9\\xe4\\x7b\\xb6\\xda\\xce\\xb0\\x04\\x73\\xbb\\x48\\x48\\x43\\xcc\\x7c\\xa7\\x36\\xff\\x70\\x75\\x16\\xe1\\x48\\x45\\xd0\\x19\\xaa\\x08\\x3a\\xa3\\x6c\\x94\\x80\\x3b\\x44\\x21\\xe4\\x24\\x50\\x15\\x75\\x86\\x8a\\x10\\x44\\xbf\\x47\\xfc\\xe0\\xe7\\x06\\xed\\x1b\\xf4\\xfc\\xe0\\x2f\\xff\\x8c\\x9e\\x50\\x2f\\x79\\xee\\x92\\x7d\\x97\\x3c\\x7f\\xc9\\x3f\\xf6\\x45\\xf7\\xa1\\x47\\xb7\\xa3\\xbc\\x1d\\xe8\\x71\\x65\\x2a\\x81\\x1d\\xca\\xd1\\xed\\xca\\x2c\\xf4\\x28\\x81\\xed\\x28\\x4f\\x93\\xfd\\x98\\xda\\x91\\x13\\x85\\x87\\xa1\\x14\\xee\\x07\\xdc\\x31\\x9c\\xe0\\x59\\x30\\x73\\x12\\xce\\x0e\\x27\\x1c\\xf4\\x08\\xe1\\x4e\\x61\\x9c\\xd6\\x20\\xe7\\xf2\\x49\\x0c\\x81\\x06\\x51\\x66\\xcc\\x49\\x9c\\x6b\\x97\\x45\\x24\\x25\\x5c\\x1a\\x17\\x3a\\x06\\x1a\\xc4\\x44\\x07\\xed\\xd8\\x65\\x97\\x8d\\x48\\xc2\\x99\\x11\\xb9\\x80\\x4f\\x62\\x6f\\x44\\x0e\\x23\\x49\\xce\\x4d\\x13\\x1d\\xd8\\x1a\\x93\\x3b\\x74\\x14\\x1d\\xf5\\x16\\x3e\\x3b\\x2f\\xdf\\x1b\\x03\\x99\\xef\\x28\\x3a\\xe4\\x62\\x29\\x16\\xc3\\xd9\\xe2\\x6e\\x40\\x69\\xde\\x8c\\x82\\x7c\\x6f\\x0c\\x3b\\x1c\\xb2\\xe8\\x8a\\xc5\\x3a\\x97\\x39\\xab\\x82\\x2e\\x4f\\x34\\x52\\x59\\x51\\x5e\\x58\\xd4\\x09\\x55\\x94\\x57\\x56\\x55\\x44\\xdd\\x7e\\x94\\x8e\\x82\\xe5\\x85\\xa1\\x3c\\xc1\\xed\\xf2\\x78\\xfd\\xc8\\xed\\x12\\x0c\\xee\\x50\\x45\\x27\\x14\\x63\\x50\\xf6\\xcd\\x53\\x26\\x4e\\x9b\\xbc\\xe0\\x68\\xc3\\xe1\\x3d\\x9b\\x76\\xbd\\xcd\\xb0\\xca\\xb7\\xd3\\xc7\\x8c\\x1b\\x5b\\x7b\\xc3\\x57\\x0d\\x87\\x9f\\xdb\\xf4\\xd2\\x6f\\xe8\\x35\\x7e\\xc5\\xc2\\x69\\xa3\\x47\\xcd\\x2a\\x19\\xf5\\xd6\\xee\\x6d\\x87\\x9d\\x87\\x3f\\xcf\\xfa\\xf9\\x35\\x7e\\xd1\\xd2\\x19\\xa3\\x87\\x4f\\x0b\\x8f\\x7f\\x33\\xbe\\xf3\\x23\\xe7\\x9b\\x07\\x9c\\xdf\\x00\\x0f\\x65\\xea\\x19\\x7e\\x06\\x7f\\x00\\x6c\\x44\\xd2\\xa1\\x14\\xba\\xc1\\x83\\x10\\x97\\x00\\x24\\xb9\\x8c\\x4b\\xc6\\x39\\x06\\x24\\x39\\x83\\x4b\\x26\\xba\\xe4\\x4b\\x9c\\x4d\\x92\\xbb\\x70\\xc9\\x84\\x68\\xa1\\x87\\x22\\x97\\x44\\xb8\\x3b\\xd1\\xb6\\x44\\x9a\\x09\\xc6\\x70\\x12\\x4e\\xb3\\xcb\\x2e\\x24\\x11\\x29\\x1d\\xcc\\x49\\xd8\\x68\\x97\\x03\\x48\\x4a\\x74\\xd2\\xce\\x75\\xb2\\xcb\\xe5\\x48\\x4a\\x14\\xd3\\x4f\\x72\\x0f\\x24\\xc9\\xae\\x34\\x42\\x20\\x2e\\x3b\\x37\\xdf\\x1b\\x93\\xcb\\x3b\\x89\\x8e\\xfa\\x9c\\x7c\\xc9\\x4f\\xa9\\xd5\\xa5\\x4c\\x74\\xe0\\xec\\x98\\x9c\\x21\\x8a\\x0e\\xec\\x27\\xe4\\xa9\\x28\\xaf\\x8c\\x46\\x3c\\x39\\xc8\\x25\\x84\\xf2\\x0a\\xab\\x28\\xa9\\x7a\\x20\\x8d\\x34\\x4e\\xe4\\x45\\x05\\xff\\xe1\\x7c\\xd9\\x53\\xeb\\xd6\\x6f\\xdd\\xba\\xee\\xa1\\x6d\\xaf\\x57\\x77\\xef\\x5a\\xdd\\xbb\\x5b\\xb7\\x5e\\xbd\\x99\\xb7\\xee\\x6b\\x8a\\xa1\\xa2\\x6d\\xeb\\x1e\\x7a\\x6a\\xeb\\xba\\x87\\xb6\\xbf\\xde\\xbf\\x4b\\xef\\x2e\\xd5\\xdd\\xba\\xf7\\xe2\\x86\\x0c\\xbb\\xfd\\x99\\x1d\\x77\\x0c\\xbb\\xfd\\xe9\\xa7\\x6f\\xef\\x3a\\x62\\x44\\xd7\\x61\\x5d\\x47\\x8d\\xea\\x7a\\x3e\\xc0\\x5d\\x3b\\xe4\\xdc\\x7d\\x3b\\x86\\x2d\\x7d\\x66\\xc7\\xed\\xc3\\xee\\x78\\x7a\\xc7\\xed\\xb1\\x51\\x43\\x7a\\x0d\\x8b\\x8d\\x1a\\x15\\x23\\x51\\x5d\\xa9\\xda\\xc8\\x5b\\xf9\\x03\\x10\\x84\\x12\\x88\\xc1\\x6a\\x88\\xfb\\x88\\xa5\\xc8\\x25\\x04\\x2c\\x60\\x93\\x71\\x13\\x21\\x60\\x15\\x9b\\x44\\xb8\\x2b\\x35\\x4c\\x79\\x7c\\x12\\xe7\\xd9\\x71\\x29\\x91\\x2e\\xc1\\x98\\xc4\\x42\\x58\\x2e\\x35\\x92\\xaf\\x08\\x79\\x64\\xab\\x21\\x89\\xad\\x94\\x8a\\xb2\\xdb\\x94\\x94\\xbb\\x21\\x49\\x2e\\x15\\x44\\x07\\x66\\x63\\xb8\\x5c\\x4c\\x98\\x72\\x0b\\x3a\\xd8\\x89\\xd8\\x58\\x1d\\x71\\x31\\xbb\\x38\\x16\\x8b\\x61\\x97\\x88\\x7d\\x31\\x90\\x0b\\x7c\\x94\\x60\\xb8\\x4a\\xdc\\x0d\\x82\\x35\\xa3\\x43\\xe7\\x7c\\x2f\\xa1\\x5a\\x79\\x65\\x15\\x15\\xa6\\x68\\xc4\\xe3\\x76\\x09\\xe9\\x08\\xf5\\x44\\x15\\x51\\x97\\x60\\xf0\\x1a\\x82\\x45\\x69\\x28\\x94\\x97\\x5f\\x40\\x29\\x55\\x85\\x0c\\x69\\xc8\\xe9\\xf2\\x78\\xab\\x7a\\xa2\\x0a\\x4a\\xb4\\xd2\\x3b\\xee\\xec\\xd7\\xf7\\xc8\\xee\\x4d\\x6f\\x4d\\x1f\\x3b\\x19\\xb9\\xf2\\x8b\\x3f\\xef\\x37\\xe0\\x10\\xa3\\xbc\\x3c\\x6c\\x6c\\xe2\\x8a\\xcf\\x15\\x05\\xe5\\xcf\\xab\\xad\\xb8\\xaa\\x4c\\xf9\\xd4\\x19\\x2d\\x98\\x26\\x49\\xe3\\xba\\x14\\x0d\\xea\\xd6\\x7b\\x00\\x5a\\xb9\\x68\\xc7\\xe4\\x49\\x0f\\x8f\\xd8\\xf9\\xe1\\x81\\xd5\\xd3\\x9f\\xe8\\xd1\\x47\\x79\\xb5\\xfb\\xea\\xe1\\xab\\x4e\\x4d\\xf8\\x8d\\xaf\\xad\\xaa\\x3a\\xf9\\x56\\xed\\x75\\x3e\\x1f\\x9a\\x64\\xeb\\x3c\\x91\\xb9\\x4b\\x9a\\x58\\xd5\\x25\\x7f\\x68\\x69\\x64\\xf8\\x78\\x40\\x70\\x0f\\x7b\\x16\\x8d\\xa6\\xf6\\xbc\\x98\\x58\\x73\\xdd\\x94\\x23\\xcc\\xa7\\xec\\x78\\x0b\\x5b\\x2e\\x0b\\xcd\\x96\\x9b\\xbd\\xe7\\xad\\x01\\xec\\x59\\xa6\\x58\\xf9\\x55\\x39\\x49\\x75\\xbb\\x56\\xe9\\xc9\\x2c\\x17\\x86\\xd2\\x0c\\x10\\x61\\x07\\xfd\\xb5\\xd9\\x98\\x94\\x9d\\xda\\x4f\\x2a\\xec\\x50\\x15\\xf5\\x0a\\x8c\\xe8\\xb6\\x3b\\xbc\\x86\\x50\\x21\\xd4\\xa2\\xce\\xfb\\x84\\x8a\\x65\\xf1\\xf8\\xb2\\x0a\\x61\\x9f\\x72\\x88\\xe9\\xea\\x41\\x2b\\x99\\xd0\\xa8\\x07\\xa7\\x2b\\x43\\x95\\x67\\xb3\\x94\\x9d\\xca\\xb0\\x99\\xf7\\x8f\\x62\\xf2\\xe8\\xbd\\x7b\\x28\\x3d\\x99\\x1b\\x5a\\xde\\x9b\\x6d\\x90\\x6d\\x17\\xee\\x5d\\xe9\\x10\\x2b\\xec\\x4c\\x51\\x55\\xd4\\x03\\xa2\\xdb\\x0e\\x86\\x50\\x8f\\xdb\\x13\\x7b\\x6e\\xab\\x14\\x5e\\x47\\xdd\\x95\\xfd\\xaf\\x0b\\xca\\xfb\\xd3\\xd1\\x1e\\x34\\x26\\x0b\\x8d\\x44\\x2f\\xcc\\xb8\\x6f\\x64\\xd3\\xc7\\xca\\x1d\\x1e\\xe5\\xf6\\xa6\\x4f\\x46\\xd2\\x7b\\xe7\\x31\\x7d\\xd9\\xeb\\x79\\x0c\\x69\\x20\\x42\\x9c\\xa5\\x1e\\x32\\x3d\\x2c\\xdb\\xb5\\x3b\\x57\\xf1\\x6c\\x94\\x2d\\xf0\\xf2\\x4e\\x83\\x05\\x15\\x39\\xf3\\x62\\xa8\\x83\\xe3\\x65\\x17\\x0a\\x75\\x51\\x3e\\x38\\xb8\\x7e\\xd7\\xce\\x87\\x0f\\x71\\xb9\\xf2\\x4d\\x68\\xa2\\xb2\\x69\\x71\\xa2\\x56\\xf9\\xe7\\x3c\\x94\\xa7\\x7c\\x7f\\x15\\xb2\\x6b\\xb6\\xae\\x0c\\x1e\\xe4\\xbc\\xdc\\x1e\\xb0\\xc0\\x58\\xea\\x25\\x0d\\xd4\\x4b\\x96\\x71\\x12\\xe6\\x23\\x71\\x40\\xc4\\x83\\x80\\xd9\\x24\\xc5\\x11\\x90\\x43\\xc4\\x9a\\x24\\x84\\xad\\x61\\x6c\\x6e\\xc0\\x4c\\x44\\x36\\x09\\x49\\xcc\\x45\\xe2\\x26\\x33\\x39\\x67\\x32\\x98\\xa4\\xb8\\xd9\\x44\\x0e\\xcd\\x60\\x92\\x64\\x9b\\x4e\\xd1\\xa0\\x18\\x14\\x83\\x6e\\xf2\\x5a\\x86\\xae\\x42\\x6e\\x74\\x85\\xf2\\x88\\xd2\\xc8\\x74\\x3e\\x8f\\x56\\x29\\x8b\\xce\\x2b\\xd3\\xd1\\x63\\x74\\x1c\\x5d\\x95\\xb5\\xe8\\x01\\xf8\\x15\\x4c\\x50\\x00\\xd8\\x14\\x4e\\x70\\x2c\\x18\\x08\\x7f\\xcd\\x94\\x8a\\x82\\x31\\x49\\x1c\\x98\\x2c\\xb0\\xa2\\x03\\x9b\\x62\\xe4\\xbe\\x3d\\x51\\x0f\\x14\\x34\\xb8\\x04\\x43\\xd7\\xa2\\x8e\\x48\\x40\\xd7\\x8d\\x51\\x4e\\x0c\\x58\\x37\\xe9\\xf3\\xf7\\x66\\x7d\\x3b\\x88\\xdc\\x6f\\x19\\x52\\x98\\xe7\\x98\\x63\\xc0\\x42\\x2e\\xc1\\x4b\\x46\\x6c\\x92\\x00\\xc2\\x5c\\x58\\x06\\x24\\xc9\\xac\\x35\\x49\\xfc\\xbd\\x36\\x42\\xf7\\x32\\xa6\\x1c\\x29\\x5f\\x7f\\x0d\\x08\\x6e\\x07\\x40\\x4f\\x22\\xa2\\xb1\\xe1\\xd6\\x51\\x49\\x8b\\x63\\x72\\x13\\x2a\\x75\\x7c\\x92\\x82\\x76\\x1f\\x12\\x8e\\xdc\\x8e\\x42\\x24\\x0c\\x01\\xa4\\x26\\xd5\\x65\\xcc\\x61\\x1a\\xdf\\x88\\x10\\x47\\x94\\x5f\\x5c\\x58\\xbf\\xd2\\x80\\xa2\\xc8\\xcb\\x78\\x8e\\x34\\x9d\\xbe\\x45\\x28\\xfd\\xf7\\x27\\x34\\x1e\\x9a\\xa6\\x36\\x72\\x5d\\x75\\xfb\\xda\\x15\\xe2\\x16\\x62\\x18\\x44\\x36\\x65\\x59\\xc9\\xc0\\xb3\\xe9\\x33\\xd3\\xf8\\xa4\\x6e\\x40\\x65\\x23\\x9f\\x94\\x73\\x74\\x0b\\x29\\x5b\\xb8\\x18\\x25\\x8b\\x68\\x87\\x68\\x04\\x32\\x91\\x1d\\x42\\x79\\x80\\x34\\x67\\x21\\x6a\\x16\\x6e\\x1a\\x32\\x7d\\x73\\x02\\x59\\x94\\x7f\\x9e\\xf8\\x56\\xf9\\x03\\x85\\xae\\xb8\\x7c\\xfa\\xac\\xd9\\xd3\\x67\\xcc\\x62\\xaa\\x50\\x6f\\x14\\x40\\xa5\\xca\\x27\\xca\\x71\\x65\\xaf\\x72\\x4c\\xf9\\x07\\x92\\x10\\x8f\\x1f\\x7f\\x1c\\xa3\\x9b\\x76\\x6e\\x7e\\xfc\\x59\\x4d\\x4e\\x7a\\x02\\xb0\\x23\\x79\\x0c\\x26\\x18\\x06\\x71\\x81\\x8c\\xce\\xc0\\x51\\xe6\\x33\\x64\\x80\\x88\\xb1\\x07\\xf6\\x85\\x49\\x58\\x43\\x39\\x66\\xa4\\xb4\\x89\\xb3\\x34\\x00\\x61\\x79\\x93\\x14\\x37\\xb2\\xe4\\xd0\\x48\\xe4\\x82\\x84\\x55\\x32\\x18\\xa8\\xb9\\x22\\xd4\\x2f\\x10\\xbd\\xee\\x60\\x45\\x95\\xd8\\x93\\xc9\\xfe\\xe3\\xfc\\xcf\\x7f\\x70\\x4f\\x3d\\x35\\xfd\\x5c\\x8e\\x7f\\xd7\\x2e\\x3f\\xfb\\x39\\x20\\x88\\x00\\x70\\x12\\x7f\\x00\\xb2\\xe1\\x7e\\x88\\xdb\\xc9\\x73\\x2d\\x6c\\x92\\x1e\\x24\\x6c\\x2c\\x58\\x39\\x89\\x2a\\x03\\xa1\\x50\\x3c\\x83\\x3e\\x23\\x23\\x9b\\x88\\x68\\x4e\\x18\\x67\\x37\\xc8\\x3e\\x73\\x12\\xfb\\xec\\xb2\\x9b\\x48\\x0e\\x9f\\x8c\\xbb\\x05\\x1a\\x32\\xd9\\x4d\\x12\\x16\\xec\\x38\\x8d\\xd8\\x56\\x9b\\x21\\x89\\x6d\\x61\\x39\\xcd\\x90\\x94\\xfd\\xc4\\x9a\\xfa\\x44\\x47\\x9c\\xb5\\x98\\x89\\xcd\\xb4\\x89\\xd8\\x1a\\x03\\xd9\\x62\\x17\\x1d\\x58\\xa4\\x1f\\xcd\\x31\\x9c\\xe1\\x88\\x0b\\xe0\\x8e\\x51\\x5f\\x5c\\x08\\xd1\\x08\\x47\\x9c\\x2d\\xf2\\x06\\xab\\xa2\\x62\\xb0\\x02\\xa5\\xec\\xa2\\x3b\\x18\\xe1\\x91\\xed\\xdb\\xaf\\x11\\xf3\\xc0\\x36\\xa5\\x89\\x41\\x4b\\xac\\x47\\xcf\\xfb\\xd1\\xe1\\x59\\xe3\\x66\\x4c\\x9c\\x79\\xa5\\xf2\\x2d\\xfb\\xd3\\x01\\x24\\x9e\\x7e\\x63\\xf9\\xf1\\x84\\x72\\x92\\x5f\\xa3\\xac\\xd9\\x8b\\xfe\\x7d\\xfd\\xe6\\xfe\\x93\\xae\\xbf\\xfb\\xda\\x54\\xfc\\xd1\\xc8\\x15\\xf3\\x07\\xa0\\x23\\x2c\\x81\\x78\\x31\\xc1\\x99\\x67\\x93\\x71\\xbe\\x98\\x8c\\x9e\\x47\\x26\\x29\\x9e\\x4d\\x50\\x76\\xb1\\xc9\\xb8\\x2b\\x9b\\x7c\\xe7\\xca\\x30\\x49\\x09\\x9b\\xb5\\x38\\xdb\\x26\\xc9\\x36\\x22\\x2a\\x12\\x65\\x01\\x89\\x36\\x44\\x82\\x64\\x2e\\x9f\\x8c\\x8b\\xb9\\xe4\\x4a\\xd1\\x6a\\x92\\xe4\\x12\\x12\\x7e\\x18\\x45\\x07\\xce\\x8b\\x81\\x6c\\xe5\\x45\\x87\\x0c\\x05\\x1a\\xbe\\x79\\x31\\xec\\x72\\xc8\\x99\\xb9\\x6d\\x42\\x0d\\x09\\x55\\x68\\x07\\x14\\xb5\\xa2\\xc2\\x7c\\x1d\\x6f\\x12\\x6a\\x70\\xa1\\xbc\\xfc\\x18\\x83\\x7c\\x8b\\x27\\xcd\\xbc\\xfe\\xba\\xf9\\x4f\\x3e\\x39\\xfb\\xf2\\xcb\\x2f\\x1b\\x3d\\x5f\\x39\\xc9\\x08\\xc8\\xf1\\xee\\x09\\x64\\x5b\\x7c\\xe5\\x8d\\xb7\\x29\\x5f\\x7d\\xf3\\xae\\xf2\\x15\\x5a\\x21\\x5c\\x3a\\x77\\xfe\\xd4\\xeb\\xe6\\x7c\\x31\\x77\\x5a\\xcd\\x55\\x53\\x87\\x0b\\x3b\\x8e\\x1e\\x39\\x78\\xd9\\x8e\\xce\\x52\\x7c\\xd1\\xc1\\x93\\x87\\x89\\x0e\\xe4\\x03\\x70\\x43\\xa9\\x8d\\x73\\xc2\\x74\\x88\\x9b\\x29\\xb7\\xb9\\x24\\x36\\x46\\xa8\\x06\\x25\\xd2\\xd2\\xcd\\xc8\\x26\\x61\\x36\\x2a\\xa7\\x71\\x49\\xcc\\x47\\x10\\x76\\x85\\xb1\\xb5\\x01\\xdb\\x69\\x76\\x80\\x99\\x48\\xdc\\x60\\xa5\\x21\\xaf\\xc9\\x24\\x11\\xd1\\xb4\\x1a\\xc8\\x27\\xab\\xd9\\x24\\x11\\x11\\x00\\x39\\x9d\\xc4\\x5c\\x10\\xc3\\x48\\xc4\\x0e\\x82\\x21\\x0a\\x8a\\x51\\x77\\xc8\\x4d\\xc5\\xaf\\x22\\x58\\x10\\x14\\x8b\\x0c\\xf9\\xcc\\x64\\x54\\xb8\\x65\\xcb\\x86\\xa6\\xad\\x75\\x4d\\xcf\\x22\\x16\\x8d\\x10\\x32\\x50\\x23\\x7b\\xe0\\xfc\\xbc\\xd7\\xef\\x27\\x22\\x79\\xff\\xeb\\x8c\\x8d\\xe9\\x48\\x78\\xd4\\x57\\x6d\\xe4\\xd2\\x79\\x0c\\x41\\x98\\x04\\x9a\\x1b\\x27\\x3c\\xb2\\x13\\xc6\\xb8\\xf5\\x83\\x84\\x93\\x05\\x1b\\x27\\x25\\x32\\x2d\\xb9\\x76\\x9b\\x24\\x67\\x12\\xce\\xe4\\x51\\xce\\x64\\xf3\\x49\\x39\\x84\\x24\\x39\\xdb\\x28\\x6a\\x91\\x1d\\xc8\\x16\\x5e\\x74\\x24\\x80\\x49\\x4b\\xcf\\x26\\x71\\x8e\\x33\\x57\\x74\\x60\\x0f\\xe5\\x42\\x41\\x8a\\x0b\\xa1\\x3c\\xc1\\x50\\xe0\\x0c\\x8a\\xa1\\xa2\\x20\\xdb\\x13\\x55\\x55\\x3a\\xdc\\x2e\\x26\\x94\\x97\\xdf\\x97\\x41\\x19\\xf3\\x6a\\x67\\x4d\\x9f\\x7d\\xc5\\x98\\x5a\\xa7\\xa2\\x5c\\xca\\x0e\\x48\\x64\\x29\\x8b\\x3b\\x74\\xb8\\xb6\\xff\\xc7\\xdf\\x35\\xfd\\x78\\x50\\x39\\x81\\x56\\xf0\\x69\\xd3\\xe6\\x3e\\xb8\\xf0\\xd6\\x87\\x7b\\x56\\x88\\xac\\xa4\\x24\\xa6\\x2b\\xd8\\x5f\\x84\\x58\\xe5\\xfc\\xa9\\x8f\\x95\\xd3\\x5f\\x00\\x03\\x13\\xd5\\x46\\x6e\\x38\\x7f\\x00\\xb2\\xa0\\x08\\xae\\x81\\x78\\x06\\xc1\\xc6\\x9f\\xb2\\x3d\\x16\\x36\\x99\\x70\\xe4\\x67\\x90\\x50\\xce\\x41\\x30\\x28\\xa6\\x66\\xc8\\x47\\xcc\\x50\\x84\\x28\\x57\\x90\\xa8\\x0d\\x9f\\x94\\x3b\\x20\\x49\\x0e\\xfa\\x68\\xac\\xe6\\xc8\\x20\\xd1\\x87\\x5b\\x94\\x8d\\x06\\x82\\x5a\\xbe\\x5f\\x74\\x60\\x77\\x0c\\x3b\\x44\\x39\\x2d\\x3d\\x16\\xc3\\x16\\x07\\x36\\xc6\\x30\\x27\\x62\\x43\\x4c\\x33\\x58\\xc1\\x88\\xc7\\x6b\\xe8\\x84\\x08\\x82\\xde\\x9e\\x28\\x1a\\x71\\xb8\\x5d\\x2d\\xac\\x97\\x86\\xf9\\x44\\x34\\x10\\xa1\\xd1\\xf7\\x0c\\x88\\xf6\\xba\\xaa\\xff\\x1d\\x1b\\x11\\x5b\\xb6\\x7e\\xf2\\x1b\\x47\\x95\\x1f\\x3f\\xfb\\x4e\\x39\\x8a\\x42\\xb7\\xcc\\x9e\\x30\\x77\\xde\\xa4\\x51\\xd7\\xe6\\x32\\x31\\x04\\xa8\\x02\\x8d\\xcf\\xf5\\xff\\xc3\\xe3\\x7d\\xf5\\x05\\x3e\\xda\\x55\\x69\\x3c\\xfc\\xa5\\x72\\x02\\xc5\\x50\\xda\\xce\\x17\\xb7\\x5c\\x7f\\xe3\\x43\\xe5\\xa5\\x29\\xbf\\x07\\x5c\\x25\\x95\\xb5\\x31\\x10\\x37\\x92\\x58\\x8c\\x88\\x18\\x51\\x1f\\x4d\\xd6\\x80\\x1a\\x17\\xe2\\x64\\xa9\\xd5\\x35\\x50\\xab\\x6b\\x44\\x12\\x91\\xb4\\x54\\x66\\xc5\\x9a\\x24\\xe2\\x81\\x65\\x23\\x91\\x2b\\x5b\\x0c\\x64\\x1b\\xa4\\xac\\x9a\\x18\\x74\\x9b\\x11\\x6b\\x08\\x56\\x65\\xa1\\xaa\\xa0\\xa1\\x8c\\xe3\\x4f\\xef\\x28\\x48\\x53\\xbe\\x4c\\xcb\\x3b\\xfe\\x46\\x93\\x6a\\xe1\\x7a\\xa1\\x05\\x5f\\x2b\\x3f\\x2a\\x85\\x8a\\xbc\\x76\\x2d\\xea\\xcd\\x64\\x7e\\xbd\\x86\\x78\\x1c\\x22\\x53\\x21\\xfe\\x00\\x78\\x21\\x04\\x61\\x58\\x05\\x71\\x37\\xe1\\x84\\x2f\\x15\\x1e\\x96\\xb2\\xc9\\x44\\x51\\xd0\\x6d\\xb2\\x49\\x72\\x11\\xe1\\x44\\x67\\x3a\\xb4\\x0c\\x92\\x1e\\x13\\x2d\\xcf\\xe7\\x93\\x38\\xc3\\x4e\\xcd\\x98\\x83\\x4f\\x62\\x87\\x1d\\x5b\\xc9\\xd7\\x1d\\xf9\\x24\\xee\\x18\\x96\\xad\\x7c\\x52\\x2e\\x43\\x92\\x9c\\xaf\\xc7\\x89\\x1d\\xc5\\x7a\\x93\\x2f\\xe8\\xd6\\xc2\\x44\\x9c\\x1e\\x03\\xca\\x3c\\xd9\\x01\\xb1\\x18\\x2e\\x12\\xe5\\x74\\x36\\x16\\xc3\\xa5\\x0e\\xd9\\x2a\\xc4\\x5a\\x47\\x88\\xad\\x14\\xbf\\xa5\\x6c\\x3a\\x5b\\x1c\\xf7\\xbd\\x73\\xe1\\xac\\x6b\\x95\\x43\\x87\\x10\\x2c\\x9c\\xb9\\x70\\x85\\xf2\\xe3\\x57\\x47\\x95\\x1f\\x50\\xfe\\xfc\\xc9\\x13\\x17\\x5c\\x37\\x71\\xe2\\xfc\\xbc\\x09\\xa3\\x46\\x4c\\x9c\\x3c\\x62\\x64\\x2d\\xba\\x6f\\xd1\\xee\\xb2\\xf0\\xb6\\xb9\\xaf\\xff\\xe3\\x1f\\xaf\\xcf\\xdd\\x16\\x2e\\xdb\\x73\\xfd\\x3b\\x9f\\x7d\\x76\\xf4\\xf2\\xeb\\x16\\xce\\x98\\xbe\\x68\\x11\\x93\\x33\\x71\\xce\\x9c\\x89\\x35\\x73\\xae\\xd4\\xaa\\x97\\xbd\\xd4\\x46\\x2e\\x47\\x97\\xd1\\xb9\\xba\\x6d\\x20\\xfe\\x91\\x5a\\xff\\x02\\x36\\x99\\xc8\\xf0\\x9b\\x59\\x9b\\xee\\x2a\\x2f\\xc8\\xa8\\x8f\\xba\\x4a\\x1c\\xd4\\xea\\x07\\x44\\x46\\x7d\\x20\\x3a\\x64\\x5b\\x1a\\x0d\\x8a\\xeb\\xcd\\x22\\x9b\\x41\\x53\\x09\\xd1\\x4c\\x59\\x88\\x33\\x44\\x9c\\x16\\xc3\\x7e\\x2a\\xaf\\x05\\x22\\x06\\x8a\\xfc\\x05\\x8f\\x5a\\x58\\x54\\xe5\\x47\\x34\\x69\\x20\\x71\\x31\\xa3\\xc7\\xc5\\x1a\\xd2\\xbd\\x90\\xfb\\xd3\\x63\\xc8\\xa3\\xbc\\xfb\\xeb\\xd0\\xcd\\xfd\\x82\\x7d\\x6f\\x1d\\x71\\xfd\\x9a\\xb2\\x95\\xc3\\xdf\\x3b\\x85\\xf2\\x67\\x4c\\x19\\x34\\x37\\x30\\x7f\\x6a\\xcd\\x35\\xec\\x2b\\x5f\\x21\\x49\\x79\\x5f\\x39\\xad\\xec\\x57\\x4e\\x2a\\x6f\\xe6\\xfa\\x3f\\xc9\\xf4\\xd6\\xd7\\x7b\\x7a\\xf5\\x46\\x96\\xc6\\xe5\\x75\\x55\\x9d\\xea\\x1e\\xdf\\xba\\x13\\x58\\x98\\x08\\x80\\x6e\\xe5\\x62\\xc0\\x02\\x07\\x46\\x12\\x0d\\xb4\\x8c\\x43\\x38\\x22\\xab\\x02\\x02\\x89\\xa4\\xa5\\x34\\x18\\x31\\xd1\\x4a\\x09\\xaf\\x55\\x4a\\x0c\\xf4\\x4d\\x36\\x37\\x87\\x24\\xc1\\x4c\\x14\\x14\\x27\\xa2\\x90\\xf2\\x95\\x16\\x9b\\xb0\\x31\\xa4\\xcd\\x65\\xb3\\x90\\xad\\xac\\x45\\xb7\\x70\\x31\\x5a\\x2f\\x4f\\x83\\x72\\x88\\x5b\\xc9\\x6d\\x2d\\xfa\\x6d\\xd3\\xc3\\x98\\x6b\\x90\\x0d\\xc6\\x24\\xb6\\x45\\xb0\\xc1\\x2e\\x5b\\xf8\\x24\\xb6\\xd0\\x90\\x53\\x36\\x70\\xa2\\x03\\x9b\\x63\\xf4\\x09\\xcd\\x71\\x18\\x2b\\x06\\xc5\\x6c\\x3d\\x16\\x1b\\x8d\\x42\\x17\\xc2\\x31\\x6e\\x8b\\x16\\x13\\x41\\x57\\xe8\\xcf\\xae\\xe7\\x78\\x30\\x00\\x38\\x2b\\x90\\xc8\\xbb\\x79\\xb1\\x2b\\x3b\\xb9\\x69\\x1f\\x53\\x8d\\x12\\xdf\\xa0\\x79\\xca\\xd9\\x0f\\x85\\x77\\x95\\xb3\\x1a\\xbf\\x6f\\x42\\x43\\xd9\\x73\\xec\\x71\\x5a\\x1f\\xca\\x4a\\x45\\x70\\x34\\x84\\x22\\x0c\\x36\\x86\\x69\\x2d\\x48\\x0b\\xde\\x50\\x45\\xd0\\x7d\\x13\\xbb\\xf4\\xfc\\x52\\x76\\x29\\x1a\\x7a\\xf2\\x24\\xda\\x75\\xf2\\xa4\\xa6\\xe3\\xb3\\xa1\\x3b\\xfb\\x21\\x7b\\x9e\\x3c\\xaf\\x4a\\x2c\\xa8\\x28\\x10\\x91\\x7b\\x36\\x33\\xa8\\xe9\\x39\\xf6\\x8a\\xee\\x28\\xed\\x23\\xe1\\x03\\x64\\x53\\x1e\\xfc\\x06\\x18\\xc8\\x03\\x60\\x3f\\xa2\\xb2\\xe5\\x87\\xd9\\x5a\\x66\\x96\\xc8\\x66\\xa1\\x6b\\x2a\\xb8\\xf0\\xb0\\xc9\\xb8\\x87\\x06\\x17\\x9e\\x2c\\x12\\x5c\\xe4\\x86\\xb1\\xaf\\x01\\xdb\\x22\\xb2\\x9f\\x4f\\x62\\x6b\\x04\\xfb\\xed\\x24\\xc4\\x27\\x21\\x06\\x49\\x65\\x65\\x3f\\x0d\\x22\\x44\\x0f\\x09\\x22\\x9c\\x34\\x6a\\x10\\x68\\xd0\\x2a\\x7b\\xb2\\x45\\x47\\x1c\\x04\\xab\\x1e\\x3e\\xa4\\xdc\\x68\\x1a\\x72\\x07\\x7b\\xa2\\xe6\\xa4\\xca\\x10\\x24\\x08\\xe5\\xb1\\x88\\x3d\\x74\\x1c\\xd4\\x75\\xf3\\x7b\\x14\\x2a\\x5f\\xa1\\x51\\x37\\x0e\\x1c\\x3b\\x6d\\xc2\\xe0\\x2b\\x90\\xf2\\x2d\\x0a\\xa2\\x42\\x2e\\xb6\\xef\\xbd\\x6f\\xde\\xb8\\xed\\xc8\\xa0\\xf0\\x65\\x63\\x56\\xdf\\x31\\xb9\\xeb\\x8a\\x31\\x93\\x66\\xd7\\x8c\\x3d\\xf7\\xfe\\x9f\\x7f\\x12\\xda\\xf5\\x55\\xba\\x09\\x6f\\xf0\\xab\\x20\\x0a\\x7d\\xe1\\x19\\x88\\x9b\\x08\\x3e\\x7e\\x0e\\x3a\\x70\\x52\\x3c\\x9d\\xe8\\x4d\\x15\\x97\\xc4\\x65\\x61\\xb9\\x23\\x97\\xc4\\xbd\\xc3\\xb2\\x9b\\x4b\\xe2\\xfc\\x70\\x82\\xe5\\xa0\\x9a\\xb0\\xbd\\x1f\\xd5\\x9d\\x22\\x53\\x12\\x17\\xd9\\xe5\\xae\\x44\\x61\\x4c\\x49\\xdd\\xce\\x27\\x04\\x2d\\xbd\\xea\\x8f\\x24\\xb9\\x88\\xa8\\x11\\x2a\\x8e\\xc5\\x70\\x57\\xb1\\xda\\xc4\\xa6\\xbb\\xf3\\xc5\\x8e\\x65\\x15\\xbd\\x89\\x3d\\xf1\\x39\\xe2\\xd6\\xd2\\x9e\\x04\\xfb\\xa0\\x98\\x30\\x65\\x64\\xf9\\x3b\\x91\\x6f\\x05\\x87\\x6c\\xc8\\x23\\xee\\xc0\\xd4\\x51\\x74\\xe0\\xd2\\x98\\x5c\\xe5\\xd7\\x2a\\x20\\xee\\xde\\xa2\\x43\\xce\\xcc\\xa2\\x34\\x71\\x40\\x30\\x00\\xac\\xc0\\x10\\x4d\\x23\\x1a\\x56\\x58\\x55\\xe9\\x88\\x12\\xef\\x10\\x65\\x05\\xaa\\x6a\\xda\\x05\\x0c\\x04\\x23\\x95\\x55\\xde\\x34\\x14\\x0a\\x00\\xd2\\x4e\\x94\\x57\\x56\\x38\\xa9\\x0b\\xe9\\xeb\\x40\\x9f\\xa3\\x3b\\xd1\\x32\\x54\\x67\\x37\\xfd\\xf8\\xc3\\xf0\\x6b\\x33\\x4a\\x96\\xd5\\xdc\\xbb\\xde\\x99\\xf9\\xe3\\xf6\\x85\\xab\\xc7\\xb2\\x7c\\xd4\\xd0\\x31\\xff\\xba\\x7b\\x8c\\x76\\xe5\\x43\\xe5\\x35\\xe5\\x90\\xb2\\x3e\\xdd\\x81\\x06\\xa2\\xc8\\xd8\\xdd\\xbd\\x0b\\xfb\\x7e\\x38\\x43\\x59\\xa8\\x8c\\x61\\x36\\x99\\x63\\xd5\\x5d\\x26\\xe6\\xa3\\x12\\x6f\\x38\\xe3\\x9a\\x85\\xe8\\x28\\xda\\xc1\\x20\\xc5\\xa7\\x4c\\xfa\\x5c\\xd9\\x5f\\x33\\x62\\xf4\\xe8\\x1f\\xf7\\x2b\\x28\\x52\\x5e\\xc9\\x35\\xbd\\x31\\x65\\xe0\\xe7\\x4f\\xa1\\xe9\\xe8\\x1e\\x65\\x9c\\xf2\\xa8\\xb2\\x51\\x99\\x55\\xec\\xff\\x5b\\xc7\\x30\\xfa\\x05\\x5d\\x77\\xdb\\xb2\\x8a\\x01\\x8c\\x91\\x41\\x67\\x0d\\xc6\\xd7\\x08\\x3f\\x3a\\x00\\xf0\\xeb\\x79\\x0c\\xe9\\xe0\\x84\\xde\\x9a\\x36\\x63\\x43\\x54\\x46\\x5c\\x32\\x2e\\x98\\xd2\\x22\\x91\\x08\\x15\\xb3\\x84\\xd5\\x0e\\xc4\\x82\\x59\\x89\\x80\\xbb\\xc2\\x5a\\xc8\\x62\\x45\\xa2\\x43\\x66\\xf8\\x58\\x4c\\x66\\x49\\x1c\\x4a\\xc2\\x96\\x68\\x45\\x15\\x0a\\x22\\x1a\\xb4\\x14\\x05\\x0d\\x5e\\xb7\\x33\\xc8\\x86\\x3a\\xcc\\x46\\x2f\\x21\\x09\\x3d\\x3f\\x5b\\xb1\\xcf\\xac\\x56\\x8a\\xab\\x67\\x06\\xd0\\xf0\\x27\\x85\\x5d\\xe9\\xdc\\x2f\\xe7\\xd2\\xd2\\x77\\xed\\x72\\x1c\\x3c\\xe8\\xd8\\xc5\\x4c\\x65\\x90\\xa6\\xf7\\x5d\\x00\\x78\\x37\\x8f\\xc1\\x09\\xd9\\x50\\x00\\x2b\\x21\\xee\\x04\\x3d\\x9e\\xa4\\x07\\x64\\x5c\\x06\\xdd\\xac\\x6a\\x07\\x1c\\x97\\x4c\\xe4\\x64\\x3b\\x0d\\x36\\x29\\x91\\xc3\\x42\\x84\\x88\\x49\\x61\\x18\\x33\\x0d\\xb2\\x8b\\x4f\\xe2\\x9c\\x08\\x76\\xd9\\xe5\\x0c\\x24\\xc9\\x76\\x3e\\x89\\xed\\x76\\x6c\\x26\\x6e\\x27\\xc8\\x27\\x71\\x30\\x2c\\x9b\\xf9\\xa4\\x5c\\x84\\x24\\xd9\\x9c\\xa1\\xbb\\x48\\x17\\x12\\x1d\\x98\\x89\\xe1\\x6c\\x11\\xdb\\x63\\x38\\x87\\x1a\\xdd\\x02\\xa2\\x24\\x14\\x31\\xb1\\xa8\\x22\\x1a\\x0c\\xb4\\xf0\\x31\\x05\\x41\\xcd\\xa7\\x04\\x2b\\x52\\xa1\\x68\\x97\\x0d\\x1b\\x36\\xa0\\x33\\x08\\xa1\\xc0\\x9c\\x59\\xcb\\x96\\x29\\x67\\x9a\\x94\\x5f\\x91\\x6d\\xe1\\x92\\xd9\\xf3\\x95\\xaf\\x3e\\xbe\\xfe\\xd6\\xdb\\x6e\\x3d\\xb8\\xcb\\xcf\\xb9\\xfd\\xf8\\xe0\\x5b\\x33\\x37\\x15\\x67\\x3f\\x7f\\xe3\\x47\\x87\\x8f\\xcf\\x9c\\x31\\x67\\xc1\\x3b\\x53\\x27\\xcd\\x9c\\x4a\\x6c\\x42\\xb9\\xda\\xc8\\x7d\\xcd\\x1f\\x80\\x5c\\xa8\\x81\\x78\\x4e\\x0a\\x6f\\x4e\\xf7\\xfd\\xb4\\xe2\\x0a\\x0d\\xb2\\x48\\x42\\x67\\x8a\\x14\\x36\\x45\\xe4\\x4c\\x13\\xb5\\xab\\x24\\xd2\\xc9\\x10\\x45\\x87\\xcc\\xe5\\x10\\x39\\x76\\xe5\\x88\\x0e\\x9c\\x45\\xe2\\xe6\\xb8\\x31\\x23\\x93\\x88\\x3b\\xe7\\xd0\\x42\\x9a\\x0a\\x12\\xd2\\x70\\x5e\\x31\\x54\\x44\\x24\\x92\\xc9\\x41\\x2e\\x47\\x34\\x52\\xd9\\x0b\\x45\\x45\\x81\\x0b\\x05\\xa0\\x1c\\x2d\\x44\\x45\\xdb\\x91\\xbd\\xf6\\x33\\xbf\\xb4\\xac\\xf6\\xd5\\xf7\\xdf\\x7b\\x71\\xdc\\xfd\\x45\\xfe\\xcf\\x6a\\x94\\x9f\\xb6\\x2b\\x5f\\x28\\xab\\x98\\xbd\\x65\\xa8\\x07\\x7a\\xf8\\xa6\\x99\\xca\\xf1\\xd7\\xa5\\x88\\x72\\xe6\\x68\\xf4\\xa8\\x72\\x3a\\x22\\xbd\\xae\\x1c\\x9f\\x75\\x23\\x7a\\x88\\xc8\\x13\\xe1\\x5f\\x09\\x8d\\x5d\\x32\\x60\\x34\\xc4\\xd3\\x08\\x16\\xe9\\x6c\\x52\\x3b\\x68\\xe6\\x5e\\x46\\x0b\\xee\\x21\\x9c\\x49\\xf9\\x95\\xce\\x27\\x71\\xba\\x66\\xad\\x2c\\x7c\\x52\\xce\\xa2\\x51\\xb1\\xc6\\x11\\x99\\xcb\\xd0\\x83\\x97\\x66\\x3e\\xd0\\x32\\x45\\xb0\\x48\\x2f\\x92\\xe9\\xa4\\xff\\x0d\\x59\\xd0\\x04\\x65\\xab\\xf2\\xfb\\xa1\\xd7\\x36\\xc6\\xe3\\x1b\\x5f\\xd3\\xc8\\xad\\xec\\x50\\x7e\\xff\\x59\\xf9\\x4d\\xd9\\x79\\xfc\\xd3\\x1d\\xbf\\x6e\\xff\\x54\\xb3\\xbf\\x5d\\x00\\xb8\\xe7\\x79\\x0c\\x2e\\xa8\\xd3\\xa4\\x5e\\xb6\\xb3\\x49\\xed\\x80\\x8c\\x92\\x7a\\x35\\x07\\x4b\\x6b\\xd5\\x82\\x1e\\x6a\\xd2\\x83\\x84\\xa9\\xc5\\x97\\x44\\xf6\\xac\\xe9\\x20\\xa4\\x34\\xc3\\x4d\\x11\\x21\\xa2\\x66\\x89\\xc4\\x19\\x3b\\xb1\\xca\\x0c\\x67\\x92\\x30\\x44\\xb0\\xdd\\x4e\\xbc\\x02\\x76\\x44\\x64\\xa3\\x21\\x89\\x9d\\x11\\xd9\\x83\\x24\\xd9\\xa4\\xe7\\x6f\\x46\\x91\\x7a\\x7d\\x90\\xed\\x3a\\xbe\\x82\\xa5\\x0d\\xbe\\x24\\xb2\\xd6\\x2a\\x15\\x55\\x51\\x91\\xe0\\xca\\x7e\\x73\\xdc\\xa6\\x74\\x42\\x3f\\x28\\x4e\\xd4\\x60\\x3b\\xaa\\x23\\xba\\xe0\\x59\\xe5\\xc1\\xaf\\x95\\xa9\\xcf\\x2a\\xd7\\x36\\xe3\\xb8\\x97\\xc7\\x20\\xc2\\x9d\\xd0\\x8c\\x1a\\xb6\\x47\\xe8\\x2c\\x86\\x6c\\x26\\x79\\x1b\\xc1\\xc8\\xa8\\x61\\xc4\\xa7\\x30\\x4a\\xb3\\x00\\x6f\\x93\\xe4\\x34\\x82\\x91\\xa3\\x99\\x35\\xe6\\x48\\x3c\\x9d\\x21\\x18\\xa5\\x8b\\x26\\xf2\\x6a\\x33\\x49\\x71\\x26\\x9d\\xa2\\x08\\x34\\xa5\\x21\\xcc\\xa3\\x41\\xa8\\x41\\xab\\x2a\\xc9\\x69\\x3a\\x32\\xbc\\xb9\\x15\\x32\\x17\\x70\\xf1\\xba\\xbb\\x6c\\xd8\\xc0\\xdd\\x75\\xdc\\xa6\\x14\\x20\\x45\\x61\\xea\\x2e\\x60\\x71\\xcd\\xd7\\xca\\x7c\\xff\\x2e\\x82\\x43\\x58\\x6d\\xe4\\x7e\\xa2\\xb5\\xc9\\xf9\\x7a\\x2e\\xd3\\x52\\x27\\x12\\x99\\x59\\xb9\\x5c\\x8b\\xfc\\xe5\\x82\\x7a\\x78\\x49\\x0a\\xc3\\x27\\xe3\\x5e\\x9a\\x85\\x7a\\x33\\x4d\\x12\\xcd\\x6a\\xbc\\xa2\\xe8\\x88\\xdb\\xb8\\xdc\\x18\\x2d\\x63\\xcb\\x66\\x9a\\x04\\xb8\\x72\\xb5\\x5a\\xad\\x2d\\x4b\\x6c\\x15\\xfe\\xb7\\xaf\\x2b\\x55\\x15\\x04\\x07\\xaa\\x2d\\x61\\x34\\x17\\x15\\xee\\x40\\xbe\\x29\\x47\\x3a\\x14\\x2f\\x1b\\xbb\\xf7\\xd3\\x43\\xfb\\x6b\\xe6\\xe6\\x1e\\x42\\xbf\\x0f\\x54\\xce\\x1e\\x52\\x3e\\x53\\xee\\x63\\xe2\\x11\\x34\\x10\\x3d\\x3a\\x77\\xb2\\xf2\\xc5\\x1b\\x79\\x1d\\x94\\xef\\xbe\\x2d\\x3f\\xaa\\xfc\\xd3\\xef\\xfa\\xa7\\xfd\\xfd\\xa6\\x8f\\x06\\x2c\\x40\\xf7\\x68\\x3c\\x12\\x8c\\x3c\\x86\\x1c\\xd8\\xac\\x5b\\x5f\\xb7\\x66\\x7d\\x5d\\xde\\x6c\\x62\\x7d\\x09\\x57\\xb0\\x2d\\x4a\\x18\\x13\\x37\\x58\\xc5\\x48\\x24\\x92\\xc8\\x32\\x51\\xfe\\x64\\x11\\x9c\\xfd\\x94\\x3f\\x24\\x9a\\x34\\x46\\xe2\\x3e\\xca\\x1f\\x9f\\xc1\\x24\\xe1\\xec\\x48\\x9c\\xf1\\xb5\\x94\\x3f\\x9f\\x66\\x31\\xcc\\x11\\xd9\\xc9\\x27\\xe3\\xce\\x0c\\x72\\xce\\x29\\x9a\\x24\\xec\\x8a\\xc4\\x33\\x9c\\xb4\\x38\\x61\\x35\\x49\\xd8\\x13\\x91\\x73\\x09\\xef\\xb2\\xa8\\x6d\\x77\\xc6\\x62\\x32\\x67\\x12\\x1d\\x32\\xeb\\x88\\x5d\\xe0\\x9f\\xdb\\x20\\x06\\xa9\\x50\\x46\\xdd\\x06\\xbd\\x3e\\xa2\\xf3\\x92\\x99\\x58\\xc7\\x8c\\xae\\xab\\x43\\xa1\\xba\\xba\\xba\\xa6\\x2d\\x75\\x4d\\xcf\\xea\\x2c\\xc5\\x7e\\x65\\x12\\x7a\\x92\\xbc\\x9f\\x6b\\x24\\xa9\\x2a\\x5a\\xa3\\xb1\\x17\\x10\\x54\\x01\\x30\\x0f\\xf2\\x18\\x2c\\x30\\xb0\\x85\\x8c\\x9a\\x23\\xcd\\xe2\\x88\\x0d\\x11\\x5a\\xd5\\x63\\x1a\\x64\\x13\\x4f\\xb2\\x8d\\x54\\x3d\\x8f\\x5c\\xc4\\x98\\x5a\\xe0\\xa8\\x57\\xf5\\x2e\\x8c\\xd2\\xeb\\xae\\xaa\\xab\\x63\\x26\\xd6\\x35\\x8f\\x82\\x3c\\x1d\\x10\\x84\\xd4\\x46\\xee\\x5e\\x1e\\x43\\x06\\xcc\\xd2\\xfd\\x0b\\xad\\x61\\x38\\x9b\\x6b\\x18\\x16\\xaa\\x1f\\x1c\\x49\\x23\\xa9\\x75\\xf2\\x36\\xd0\\x69\\x14\\x46\\x13\\x70\\x3b\\x9f\\x8c\\xdb\\x69\\x96\\x65\\x4f\\x33\\x49\\x71\\x23\\xd5\\x73\\x23\\xc9\\xe4\\xb3\\x48\\xc2\\xc5\\x88\\x0e\\xec\\x8c\\x81\\x6c\\xe6\\x45\\x87\\x9c\\xee\\x6d\\x55\\xaf\\x20\\x03\\x23\\x54\\x23\\x19\\x4a\\x51\\x61\\x45\\x79\\x88\\x41\\xd9\\xf3\\x26\\x8f\\x5a\\x50\\x87\\xf6\\xd6\\xd5\\x29\\x3f\\x7c\\xfc\\xed\\x9d\\x4b\\xd1\\x66\\xe1\\xba\\x2b\\x6f\\x99\\xcb\\x96\\x92\\x01\\x9f\\xff\\xe4\\x93\\x7f\\x5e\\x33\\xe7\\x3d\\x63\\xb3\\xcd\\xe2\\x1f\\xe1\\x31\\x64\\xc3\\xad\\xba\\xac\\xb8\\x34\\x59\\x71\\x7a\\x7c\\x17\\xcb\\x4a\\x3a\\x91\\x15\\x53\\x26\\x91\\x15\\x62\\xb4\\xca\\x38\\xad\\xf4\\xc4\\x34\\xc8\\x59\\x9a\\xb8\\x64\\x51\\x52\\x66\\x11\\x52\\xfa\\x22\\x71\\x26\\xab\\x25\\x29\\xfd\\x44\\x08\\x32\\xa9\\x10\\x38\\x62\\x31\\x6c\\x12\\x89\\x99\\xe2\\x1c\\x32\\x6b\\x6f\\x2d\\x08\\x51\\x44\\xdf\\x4d\\x9a\\xcf\\x47\\x21\\x5d\\x0e\\xc6\\xac\\xbd\\x0d\\x65\\x8c\\x63\\x7a\\x3f\\xa6\\x3c\\x8a\\x1e\\x7c\\xb0\\x69\\xef\\x04\\xe5\\xd4\\xdf\\xd7\\x36\\xcb\\xc2\\x4d\\x68\\xbd\\x15\\x63\\x9f\\x92\\xd7\\xf4\\x5a\\xe6\\xae\\x5d\\x56\\xb4\\x45\\x99\\x4b\\xf9\\x42\\xec\\xd5\\x6d\\x34\\x16\\xb9\\x4e\\x97\\x05\\xcb\\x45\\x36\\xd9\\xd6\\xda\\x58\\x61\\x53\\x04\\x61\\x3b\\xc5\\xca\\xc2\\x27\\xe3\\x16\\x8a\\x92\\xc5\\x44\\x6c\\x93\\xa5\\xa5\\x6d\\xb2\\xd8\\x89\\x74\\xd0\\x5a\\x9a\\x48\\x50\\xb3\\xa4\\x1c\\x8b\\x8d\\x48\\xb7\\x39\\xd6\\xc2\\xd4\\x12\\xfe\\xa4\\xac\\x2c\\xca\\xaf\\xab\\x43\\x1b\\xd2\\x8e\\x35\\x0b\\x90\\xf2\\x9c\\x72\\x65\\x8a\\x17\\x86\\x5a\\x1e\\x83\\x1f\\xb6\\xa5\\xfc\\x87\\x37\\xaa\\x71\\x23\\xdd\\x91\\xd3\\xcc\\x0d\\x33\\xe5\\x06\\xb6\\x46\\x68\\x64\\xce\\x68\\xe5\\x95\\x2c\\x63\\x32\\x45\\x7c\\x3f\\x19\\x69\\x56\\xcb\\x91\\x66\\x6b\\x2e\\x30\\x8d\\x68\\x69\\x5a\\xb3\\x96\\xa6\\xd9\\x65\\xb7\\x31\\x89\\xdd\\xe1\\x78\\x9a\\x9b\\x7c\\x99\\x66\\x31\\x49\\x38\\x3d\\x42\\x63\\xfa\\x6c\\x62\\xb6\\x32\\x49\\x3c\\x5f\\x6f\\x30\\x7b\\xb5\\xfa\\x86\\x03\\x7b\\x62\\x20\\x73\\x48\\x74\\xd4\\x1b\\x4d\\x9e\\x4c\\x3a\\x97\\x92\\x42\\x10\\x45\\x51\\x30\\xa5\\xb9\\x15\\xce\\x22\\x14\\x42\\x06\\xa7\\x9b\\xf2\\x6d\\x03\\xba\\x05\\x5d\\x27\\xa0\\x45\\x4c\\x16\\xd1\\xdf\\x0d\\xd9\\x82\\xb2\\x64\\xbf\\x72\\xb3\\x90\\xad\\x2b\\xd0\\xb9\\x0f\\xb9\\xb2\\x94\\x0a\\x9f\\x64\\x96\\xa1\\x73\\xef\\x70\\x11\\xd4\\x74\\xfb\\x49\\xaa\\xca\\x2d\\x6c\\x99\\x17\\xee\\xd2\\xe5\\x53\\xa4\\x14\\xc1\\x1e\\x9d\\x1a\\x56\\x4a\\x0d\\xd9\\x92\\x1e\\x89\\x20\\x9c\\x41\\xe9\\xe1\\xe6\\x93\\x71\\x37\\xa5\\x85\\xdb\\x4b\\x68\\xe1\\x6e\\x49\\x0b\\x37\\x75\\x9a\\xc4\\xa4\\xc7\\x45\\xaa\\xe9\\x62\\xba\\x49\\x8a\\x9b\\x44\\x6a\\x02\\x2c\\x26\\x49\\xce\\x44\\x92\\xec\\x26\\x0a\\x67\\xa0\\x32\\xea\\xd0\\x71\\x8e\\x1b\\xed\\xce\\x58\\x4b\\x9e\\xa2\\xaa\\x94\\xe6\\x05\\x91\\x41\\xd4\\x71\\xcd\\x67\\x86\\x0a\\x9a\\xe2\\x7d\\xd5\\x94\\x10\\x74\\x1c\\xcf\\x97\\x20\\x96\\xa7\\xac\\xf6\\xb3\\x9f\\xa2\\xf3\\x7f\\x6a\\xb8\\x31\\xd0\\x57\\x6d\\xe4\\xe7\\xfc\\x7f\\xd4\\xc0\\x39\\x8b\\x56\\x03\\x27\\x3e\\x45\\x0f\\x5e\\x02\\x40\\x1d\\x8a\\xa3\\x07\\x2a\\x67\\x42\\x79\\x8c\\xbb\\x2f\\xba\\x0a\\x15\\xa1\\x62\\x74\\x8d\\xf2\\xa0\\x72\\x44\\xf9\\x4c\\x59\\x87\\xf2\\x9f\\x7b\\xee\\x85\\x17\\x5f\\x7e\\xfe\\xf9\\xdd\\xcc\\xfb\\x1e\\xd4\\x13\\x3d\\xa9\\x4c\\x52\\x5e\\xf7\\x28\\xfb\\x94\\x29\\xe8\\x09\\x54\\xfd\\x9d\\xf2\\x3d\\xca\\xfc\\x2e\\xe3\\x04\\xca\\x52\\x4e\\x7d\\x0b\\xa9\\xd8\\xcb\\x48\\xfd\\x7d\\x16\\xdc\\xd8\\xda\\xe3\\xd3\\x60\\x2b\\xab\\x65\\xcc\\x9c\\xe6\\x00\\x43\\xca\\xcb\\xfb\\x9a\\xbd\\xbc\\xa3\\xa5\\x97\\xbf\\xd8\\xbf\\x93\\xa0\\x85\\x84\\xcd\\xd9\\x2d\\xfd\\x7b\\x16\\xd0\\x8c\\x9b\\xb8\\xcd\\x96\\x21\\x4b\\x04\\xdc\\x2e\\x4e\\x42\\xa2\\xd7\\xcd\\xb6\\x8c\\x8f\\x99\\xac\\x3f\\x51\\x50\\x39\\xf6\\xe7\\x1f\\x75\\x75\\x7f\\x2c\\xb9\\xe5\\x96\\x25\\x7f\\xe8\\x5e\\x5f\\x3d\\xf4\\x91\\xa2\\xbc\\xe2\\xdf\\xc5\\xfc\\x7c\\xe7\\x15\\x57\\xde\\xad\\xd3\\xdc\\xc1\\x6f\\xe4\\x0f\\x80\\x13\\x82\\x30\\x14\\xe2\\x22\\xc1\\xc7\\x9b\\xa2\\xb9\\xff\\x82\\xcb\\x27\\x91\\xbe\\xcb\\xae\\x59\\x5f\\xbd\\x7a\\x99\\xe5\\x12\\x1d\\xf1\\x34\\x4e\\x24\\x7e\\xde\\x28\\xca\\x16\\x1b\\xf1\\xf3\\xc4\\xf9\\x63\\x4b\\xac\\x05\\x17\\x5c\\x8c\\x81\\x37\\x14\\x68\\xb9\\x5a\\xfb\\xbc\\xb8\\xfb\\x26\\x54\\xf9\\x81\\xf2\\xf7\\xa2\\x11\\x45\\x7f\\xcd\\x91\\x57\\x95\\x37\\x67\\xbc\\xb6\\xa9\\xd1\\x68\\x6e\\x8f\\x2d\\x3a\\x5f\\x6a\\x78\\x0c\\x79\\x20\\xc1\\x06\\x5d\\x33\\x3c\\x54\\x33\\x64\\x77\\x30\\xa2\\x33\\x47\\x6a\\xc9\\x9c\\xdc\\x10\\x65\\x4e\\x2e\\xc1\\xb1\\x84\\x32\\x27\\xc0\\x27\\x71\\x28\\x12\\x0f\\x50\\xe6\\x04\\xf2\\x08\\x73\\x02\\x2d\\x99\\x13\\xa0\\xf8\\xe3\\xa2\\x08\\x0d\\x80\\xcc\\x91\\xb8\\x48\\xad\\x8a\\xe8\\x31\\x49\\x72\\x29\\xd1\\xa1\\x2c\\x3d\\xc9\\xc9\\x25\\xfa\\xc1\\xd8\\xb3\\x62\\xb1\\x98\\x2c\\xfd\\x05\\xe7\\xf4\\x24\\x27\\x07\\xb9\\x3c\\xb9\\xc8\\x1d\\xca\\x2b\\x24\\x31\\x76\\x51\\xa8\\x2d\\x2b\\xd1\\xaf\\xff\\x42\\x59\\x8b\\xae\\xbd\\x7d\\x41\\x61\\x49\\xfe\\xfa\\xfb\\x17\\x2e\\xb8\\xe2\\xa7\\xba\\xba\\x77\\x96\\x2c\\xb9\\x71\\xd1\\x87\\x1a\\x4f\\xbf\\x39\\x38\\xef\\x89\\x48\\xa1\\xbc\\x6c\\x70\\xe7\\x0a\\x9e\\xc7\\x8f\\x2e\\x19\\x73\\xd5\\x8d\\xac\\xb2\\xd4\\xbf\\x8b\\xed\\x34\\x7b\\xfa\\xf4\\xeb\\x35\\x9b\\x31\\x4d\\x6d\\xe4\\x36\\xf1\\xfb\\xa1\\x03\\x89\\xef\\x68\\x75\\x37\\x98\\xaa\\x9c\\xd1\\x90\\xba\\x23\\x2d\\x20\\xf9\\x22\\x44\\x3a\\xe5\\x1c\\x03\\x4d\\x11\\xf2\\xf5\\xb2\\xae\\x84\\x24\\x39\\x3d\\x47\\x74\\xc8\\x7e\\x92\\xeb\\xe7\\x8b\\x09\\xab\\x23\\x23\\x58\\xa4\\xd9\\xbf\\xb8\\xc9\\x29\\xc4\\x08\\xd3\\x83\\x24\\x75\\xf0\\xc5\\xb0\\x55\\xac\\x07\\x83\\x3b\\x9b\\x9c\\x65\\x1d\\x58\\xa0\\xc5\\xb3\\xfc\\xaa\\x0b\\xe1\\x5d\\x73\\x83\\x02\\x17\\xca\\xcb\\x2f\\x12\\xa3\\x5e\\x5a\\x4c\\xab\\x28\\x2f\\x2c\\x2a\\x41\\xd3\\x50\\xc9\\x37\\xdb\\x90\\x6b\\xca\\x17\\x85\\x85\\x0f\\x8e\\x5e\\xbc\\xec\\xee\\x6d\\x3f\\xff\\x5b\\x39\\xf2\\xcb\\x4e\\x25\\x39\\xf9\\x44\\x6e\\xc9\\xfa\\xc9\\x8b\\x6f\\xb9\\x61\\x9d\\xd2\\xa4\\xfc\\xc1\\x85\\xe5\\xaf\\xd9\\x59\\x63\\x95\\x86\\x83\\x19\\xf9\\x33\\x47\\x0e\\xbe\\xac\\xa2\\xef\\x97\\xf5\\x2f\\x1d\\x99\\x37\\x0d\\x75\\xfe\\x30\\x3f\\x3c\\x7d\\xf4\\xa5\\xb3\\x4a\\x87\\x7c\\x00\\xb4\\x6f\\x1a\\xf8\\xae\\xd4\\xcf\\xcd\\xbf\\x78\\x26\\x81\\x68\\x24\\xe6\\x23\\xcd\\x95\\x5e\\xda\\xff\\xa3\\x39\\x39\\x68\\x90\\xd3\\x35\\x0a\\x58\\x53\\xc5\\xde\\xe6\\x39\\x85\\x16\\x13\\x0a\\xd8\\x60\\x97\\x39\\x24\\xc9\\x6c\\xca\\xd9\\x81\\x45\\x74\\xc8\\x06\\x6b\\x4c\\x2b\\xfe\\xd2\\xf0\\x5b\\x0f\\xdb\\x0c\\xc5\\xbc\\xe3\\xb8\\x55\\xf9\\xad\\xae\\xe9\\xc9\\x3a\\xe5\\x77\\x2b\\x57\\x82\\x96\\x2b\\x37\\xff\\xfd\\x9c\\x42\\x2c\\x3c\\xc7\\xfc\\x1d\\x10\\x14\\xa9\\x8d\\xfc\\x0f\\xb4\\x87\\x68\\x31\\xc4\\xbd\\xa0\\xe7\\x0d\\x64\\x70\\xd8\\x4e\\x7b\\x85\\xe2\\x7c\\xba\\x23\\x42\\xec\\x79\\x76\\x18\\x67\\x35\\x68\\xa3\\xa2\\xa2\\x67\\xe0\\x4d\\x52\\x3c\\x8b\\x8e\\x2a\\x0b\\xb4\\x51\\x11\\x17\\xec\\xe2\\x93\\x71\\x97\\x8d\\x4e\\x0d\\x39\\x4c\\x52\\xdc\\xe6\\x22\\x87\\xb6\\x74\\x93\\x44\\x6d\\xa5\\xcd\\x20\\x3a\\xb0\\x37\\x06\\x32\\x98\\x45\\x87\\xec\\xf4\\xd1\\x31\\xeb\\x4e\\xf9\\x42\\x08\\x45\\x3e\\x10\\x05\\xae\\x10\\x8b\\xa8\\x8b\\xde\\x70\\xd7\\xdd\\x75\\x24\\xf8\\x54\\x5e\\x51\\xfe\\x54\\xce\\x29\\x7b\\x79\\xc0\\xd8\\xdf\\x64\\x5c\\x73\\xff\\x7d\\x0f\\x30\\xff\\xf2\\xd3\\xe3\\xdf\\x95\\x3f\\x90\\xf9\\x77\\xe6\\x5f\\x74\\xbe\\x1a\\x80\\xdf\\x40\\xed\\x64\\x89\\x36\\x6f\\xa7\\xe1\\x63\\xd1\\xf0\\x61\\xcd\\x36\\x8a\\x8f\\x23\\xac\\xa5\\x31\\x40\\x92\\x34\\x2a\\x2f\\xe4\\xc1\\xc8\\x1b\\xad\\xd2\\x62\\x1e\\x14\\x44\\x79\\x8c\\xeb\\x1a\\xc4\\x38\\x04\\x11\\xb1\\xf3\\x18\\xd7\\x12\\x65\\x8c\\xf2\\xa9\\x32\\x9a\\x3c\\xdc\\x75\\x7e\\xfd\\xc8\\xe1\\xec\\x1c\\x17\\xc6\\xf6\\x73\\x76\\xee\\x2c\\x20\\xc8\\x01\\x30\\x3c\\x44\\x7d\\xe3\\x52\\x88\\x7b\\x08\\x1d\\x1d\\xee\\x68\\x94\\x3e\\x38\\x6e\\x30\\xda\\xa2\\x51\\xfd\\xe1\\x34\\x6c\\x23\\xce\\x91\\xf8\\x36\\x5c\\x99\\xf5\\x62\\x8f\\x97\\x7e\\xca\\xa1\\x0d\\x50\\x86\\x4e\\x69\\x58\\xd8\\x27\\xbb\\xd2\\xfe\\xcd\\x63\\xf7\\xbe\\x17\\x5f\\x1f\\xf6\\x13\\xd0\\xef\\x1d\\x9d\\xd2\\xb0\\x73\\x9f\\x6c\\x4a\\xff\\x37\\x8f\\x8d\\xfb\\x58\\xa8\\x17\\x4c\\x4e\\x57\\xa7\\x4e\\x9d\\x3a\\xa1\\xe7\\x04\\x83\\xd1\\xe4\\x70\\xba\\xdc\\x17\\xf5\\x28\\xb9\\x0d\\x4e\\x2f\\x8a\\xa2\\x2a\\x67\\x0a\\x93\\x10\\x0a\\xa2\\x1c\\x26\\xe3\\xce\\xa7\\x04\\x24\\x1e\\x46\\x4e\\x61\\xeb\\x9d\\x8c\\x77\\xb1\\xf2\\x99\\xf2\\xb3\\xf2\\xbb\\xa0\\xfc\\xae\\xfc\\xac\\x1c\\x26\\x68\\x79\\xcf\\x9f\\x40\\xec\\x77\\xe7\\xb3\\x10\\xeb\\xf7\\x62\\x9c\\x7e\\x2e\\x9d\\x7d\\xed\\x7c\\x2f\\xee\\x67\\x42\\xd3\\x20\\x00\\x7f\\x33\\x95\\x93\\x71\\x6d\\x63\\xd3\\x2c\\x12\\x0d\\x09\\x7a\\x6c\\xca\\x73\\xc9\\xb8\\x51\\x47\\x32\\x3b\\x8c\\xf9\\x06\\x12\\x6d\\x1a\\xad\\x49\\x9c\\x15\\xa1\\x02\\x60\\xe4\\x45\\x47\\x3d\\xc3\\x9a\\x32\\xb5\\x9e\\x23\\x12\\x81\\x9a\\x33\\x74\\x57\\x6e\\xd2\\x08\\xef\\x6b\\x15\\x73\\x5a\\xc8\\xdb\\x4d\\xe8\\x76\\xe5\\xee\\x25\\x4c\\xf8\\x86\\xaf\\x4f\\x5c\\xcf\\x94\\x2d\\x51\\xee\\x46\\x77\\xdf\\xde\\xf4\\xc6\\xc2\\xd3\\x8d\\xd7\\xef\\xca\\x60\\xbc\\x8c\\x29\\x13\\x63\\x9b\\xb2\\x01\\xcd\\xb4\\x61\\x9c\\xd9\\xf4\\xcf\\xa6\\xd3\\x34\\xec\\x9c\\xaf\\xac\\xb1\\xd2\\x1c\\x33\\x1f\\x80\\x1f\\xc1\\x63\\x70\\xc3\\x65\\xba\\x97\\x71\\x70\\x49\\x9c\\xae\\xe9\\x20\\x36\\xe9\\x9c\\x31\\x5a\\xe8\\xa0\\x3d\\x61\\xec\\xa4\\x6e\\x3e\\x9e\\x46\\x13\\x86\\x34\\xbb\\x49\\x6a\\x11\\xa9\\xd1\\xc4\\x33\\xcd\\x29\\x3a\\x76\\xb3\\xbc\\x60\\x34\\x31\\x14\\x0d\\x70\\x88\\x0e\\xcc\\xa7\\x44\\xc8\\x19\\xd5\\xc9\\xae\\x6b\\x21\\xca\\x67\\x8a\\x6e\\x38\\x21\\x9c\\x58\\xc4\\x14\\xdd\\xac\\x2c\\x24\\x89\\x93\\x72\\x13\\xa1\\xb6\\xa8\\xe4\\xa1\\xa3\\x22\\xc6\\xae\\x26\\x97\\xf2\\x3e\\x4d\\x9b\\xfa\\x30\\x5f\\x91\\xf1\\x0e\\x06\\xe0\\x36\\xf1\\x18\\x6c\\xcd\\x71\\xb2\\x89\\x4d\\xc6\\x4d\\x90\\x0a\\x8b\\xb4\\xe2\\x04\\x4b\\xec\\xa8\\x90\\x9a\\xe5\\x46\\x38\\x2d\\x45\\x6d\\xce\\x90\\xc4\\x1c\\x6d\\xba\\x93\\xad\\x86\\xa4\\x9c\\x8e\\x24\\x99\\xe3\\xa9\\x8c\\x63\\x8b\\x28\\x33\\xa6\\x18\\xed\\xce\\x31\\x1a\\x6c\\xd4\\x7e\\x9a\\x88\\x8f\\x40\\x31\\xad\\xbd\\xc1\\x48\\x19\\x81\\x82\\x86\\x90\\x33\\xe8\\x46\\xc1\\xaa\\x28\\x3b\\x98\\x79\\x53\\x29\\xf3\\x1e\\xf3\\x70\\x9e\\xa6\\x2a\\x74\\x2e\\xe3\\xa8\\xe7\\x61\\xae\\x0a\\xa3\\x07\\x1e\\x3c\\xf7\\x3a\\x56\\xe6\\x03\\x82\\x7b\\x14\\xcc\\x74\\x17\\x36\\x80\\x01\\xaa\\x40\\x73\\xdc\\x0c\\x9b\\xc4\\x86\\xe6\\x5a\\x39\\x86\\x86\\x84\\xc1\\x0a\\x69\\x9c\\x84\\x99\\x88\\xcc\\xf3\\xc9\\xd4\\x27\\x36\\x92\\x2a\\xa3\\x8b\\x41\\x77\\x48\\x8c\\xba\\xef\\x41\\xf2\\xbd\\xf7\\x2a\\xd8\\xd0\\x78\\xe4\\xdf\\x07\\x8e\\x50\\xdf\\x61\\x55\\x97\\xb1\\xab\\x53\\x7d\\x0c\\xd0\\xba\\x8f\\xc1\\x19\\x44\\x41\\x2b\\x0a\\x30\\x53\\x95\\xe3\\x3c\\xa6\\x7d\\x0c\\x08\\x2c\\x0a\\x46\\xaf\\xd0\\xb1\\x54\\x6b\\x7d\\x2a\\x32\\xa7\\x8d\\x05\\xf4\\xb1\\x18\\x1a\\x30\\x1b\\x49\\x08\\xda\\x00\\x04\\xbb\\x8c\\xf8\\x24\\x46\\x61\\x2c\\xd8\\x53\\x83\\x32\\xa4\\x6a\\xfb\\xde\\xa8\\x18\\xaa\\x08\\x8a\\x41\\xcb\\xfd\\xf7\\xa3\\xb8\\x32\\x7c\\xb1\\xd0\\xed\\xc8\\xbf\\xdc\\xe4\\x19\\xa5\\xcc\\x67\\xec\\x78\\xda\\x8b\\xd0\\xdc\\x5b\\x61\\x0e\\xa7\\xda\\x35\\x51\\x14\\x85\\xd8\\xa2\\x90\\x81\\x2d\\x45\\xd2\\xa7\\x48\\xfa\\x7e\\x8b\\x51\\x30\\x3c\\xc1\\x7c\\xc6\\x1c\\x6e\\xea\\x80\\x36\\xe6\\xe5\\x29\\x33\\x34\\x9f\\x38\\x49\\x1d\\xc0\\x9e\\xa6\\xd5\\xd0\\x2c\\x9d\\xbf\\xac\\x9e\\xfe\\xb4\\x40\\x30\\x1a\\x74\\x07\\x27\\xb1\\xf7\\x9d\\xbf\\xf6\\x45\\xfa\\x9b\\x6a\\xee\\x65\\xa6\\x3b\\xff\\x26\\x70\\x90\\x0b\\xb4\\xef\\x21\\xc1\\xb1\\x90\\xdb\\xa2\\x0b\\xc9\\x9a\\x4c\\xb5\\x1e\\x55\\x05\\x9d\\xa1\\x6a\\x06\\x55\\xee\\x3f\\xc3\\xef\\x13\\x94\\x3f\\xb4\\x18\\x65\\xb0\\xda\\xc8\\xf5\\xe6\\x86\\x43\\x08\\x3a\\xc1\\x3d\\x10\\x0f\\x92\\xa7\\x16\\xb1\\x49\\xda\\x34\\x2a\\x67\\x72\\xc9\\xb8\\x88\\x40\\x92\\x8d\\x6c\\x32\\x6e\\xa4\\xe1\\xb7\\xd1\\x6a\\x92\\x12\\x25\\x6c\\x50\\xb4\\x49\\x72\\x09\\x97\\x44\\x38\\x4c\\x1f\\x93\\xaf\\xcd\\x3a\\xe4\\xdb\\x65\\x9b\\x29\\x89\\x6d\\x61\\x72\\xd4\\x11\\x91\\x08\\x85\\x7a\\xec\\xce\\x48\\x92\\x3b\\xe6\\x8b\\x8e\\xb8\\x45\\x0c\\x92\\xd0\\xcc\\x2d\\xca\\x3e\\x3f\\x91\\xb2\\xcc\\x2c\\xda\\x26\\x87\\x4b\\x44\\xd9\\x0d\\xb1\\x98\\x6c\\x24\\xd2\\xe6\\xd2\\xa6\\xf7\\xba\\xe9\\x93\\x0f\\xe9\\x28\\x54\\xd5\\x13\\x45\\x23\\x1e\\xb7\\x48\\xe3\\x92\\x60\\x27\\xa4\\x15\\xe2\\x53\\x53\\x5d\\xa1\\x3c\\x61\\xf0\\x6f\\x67\\xd6\\x4d\\xa8\\x89\\x0c\\xcf\\x70\\x7e\\x89\\x46\\x7e\\xb8\\xe4\\xed\\x73\\x88\\xad\\x55\\x76\\x59\\x1d\\x7c\\xf9\\xba\\xa9\\x9b\\x5e\\x42\\xa1\\x81\\xbd\\xfa\\x5c\\xed\\x5f\\x37\\x79\\x2a\\x2a\\x7d\\x78\\xeb\\x55\\xc3\\xc7\\x79\\xed\\x0b\\xcf\\x56\\x0e\\x3e\\xb0\\x47\\xe9\\x9d\\x59\\xe2\\xb2\\xee\\xf2\\xc5\\x72\\xba\\x0f\\xde\\xf9\\x78\\x55\\xcf\\x98\\xb4\\x65\\x3c\\xa5\\x8b\\x7a\\x5a\\x6d\\xe4\\xc6\\x0a\\x19\\x34\\x06\\xbd\\x0a\\xe2\\x0e\\xe2\\x2d\\x6c\\xa9\\x40\\x54\\x40\\x5a\\x20\\x4a\\xa7\\x80\\x38\\x2d\\x1e\\x75\\x68\\xf1\\x28\\x13\\x89\\x3b\\xa8\\x6b\\x73\\x10\\xdf\\xa7\\x47\\xa7\\x66\\x3d\\x3a\\x75\\x11\\x7b\\x60\\x8f\\xe1\\x2c\\x51\\x16\\x68\\x64\\x2a\\xd0\\x34\\xd4\\x1e\\x8b\\x61\\x10\\xb1\\x33\\xd6\\xb9\\x8c\\xad\\x08\\x8a\\x74\\xba\\x59\\xa4\\x33\\xe9\\x85\\x45\\x86\\x90\\x88\\xf4\\xe9\\x3d\\x6d\\x26\\xc6\\x83\\x5e\\x0d\\x2f\\x1b\\xfb\\xc1\\x91\\x23\\xef\\x5d\\xb6\\xba\\xb3\\xfb\\x3c\\x0a\\xf9\\x2e\\xeb\\xbf\\x60\\xc2\\xe4\\xf9\\xfd\\xa6\\xf8\\xf8\\xd9\\xb8\\x69\\x57\\xef\\x01\\xca\\xdb\\x4a\\x93\\xfb\\x17\\xe5\\xe8\\x88\\x21\\x77\\xf2\\x83\\xcf\\x9d\\x8e\\x94\\x6f\\x7a\\xd0\\xfd\\xd8\\x0b\\xb1\\x0a\\xd0\\x7b\\x04\\xd8\\x5f\\xb8\\xe1\\x10\\x84\\x41\\x2d\\xea\\x6a\\xae\\xdc\\x54\\xcf\\x46\\x9c\\x43\\xfa\\x94\\xb3\\x8d\\xa3\\x1e\\xda\\x44\\x6c\\x48\\x73\\x89\\x8d\\xa0\\x01\\xb2\\xcd\\xa5\\xc5\\x56\\xcd\\x05\\xb3\\x72\\x88\\x46\\x3c\\x5e\\xa7\\x1e\\x51\\xe5\\xe8\\xb3\\xe4\\x41\\xaf\\xcb\\xed\\x32\\x08\\x86\\x3c\\xe8\\x8b\\x6c\\xff\\x5e\\x76\\xa8\\x3f\\xf7\\x43\\x67\\x4f\\x75\\x87\\x9b\\x67\\x4d\\x59\\x34\\x7c\\x0a\\x32\\xb2\\x37\\xdd\\xf6\\xca\\x2f\\xca\\x9f\\x8c\\xcd\\xff\\x13\\x2a\\x1f\\x3e\\x50\\x39\\xb6\\xdd\\x99\\x99\\xb8\\xcf\\xff\\x80\\x3c\\x71\\xa8\\xc0\\xf3\\x75\\x57\\xcf\\x43\\x28\\x92\\xca\\xc1\\xb8\\xc7\\x84\\x0c\\xf0\\x40\\x3e\\x2c\\x81\\xb8\\x0b\\xf4\\x9c\\x86\\x4e\\x1c\\xa5\\x71\\x49\\x6d\\xcc\\x41\\x36\\x89\\x4d\\x61\\xd9\\x4c\\xf8\\x51\\x40\\xc7\\xeb\\xe5\\x93\\xd8\\x6b\\x27\\xee\\x05\\x1b\\x22\\xb2\\x8d\\x4f\\xc6\\x73\\x68\\x00\\x92\\x63\\x32\\x49\\x72\\x21\\x92\\xe4\\x1c\\x2f\\xc9\\xd0\\x5c\\xb4\\xd1\\x44\\xb6\\x8b\\x84\\x23\\x69\\xe9\\x5a\\x69\\x36\\x28\\x62\\x9b\\x5e\\x3d\\x27\\x19\\xa6\\x51\\xcb\\x1e\\xe8\\xc4\\x8f\\x56\\x98\\xf5\\xba\\xb5\\x46\\xc4\\xd4\\x84\\xab\\xa8\\x05\\x93\\x7d\\x8f\\xbe\\x3d\\xea\\x8e\\xb2\\xba\\x3a\\x94\\xbf\\x5a\\xb9\\xc1\\x13\\xbd\\xa7\\xf6\\xe0\\x57\\x28\\xff\\xb2\\xab\\xab\\xa7\\xf8\\xfd\\x93\\x7b\\xcd\\x99\\x8e\\x54\\x37\\x02\\xd4\\x75\\x60\\x6f\\xb4\\xdc\\x8f\\xff\\xdc\\xed\\xdf\\xb5\\x7c\\xc8\\x70\\x94\\x7f\\xf6\\xbe\\xbf\\x97\\x97\\xa1\\x77\\xcb\\x63\\xaf\\x3e\\xa2\\xe3\\xcb\\xfe\\x8b\\x1b\\x0e\\x99\\x90\\x07\\x63\\xf4\\xe8\\xcb\\xce\\x26\\xe3\\x3c\\x41\\x33\\xc0\\x26\\x13\\x3e\\xab\\x97\\xb7\\x49\\xb2\\x8f\\xa0\\x1a\\xa2\\x5d\\x45\\x66\\x73\\x32\\x9e\\x4d\\x5b\\xde\\xb2\\xc1\\x24\\xd1\\x48\\xd9\\x9c\\x4d\\x22\\x29\\xda\\xc8\\x61\\xf7\\x52\\xad\\xc2\\x56\\x4d\\xc8\\x9c\\x15\\x95\\x55\\x95\\xd1\\x48\\x34\\xe2\\xc8\\x41\\x41\\x03\\x95\\x2e\\x3a\\x71\\x95\\x07\\xc8\\x1b\\xd4\\x67\\xcb\\xd1\\xf2\\xe5\\x5f\\x22\\xe6\\x8b\\x5f\\x9a\\x96\\x30\\xc6\\xdb\\xe6\\x4e\\x5b\\x3a\\x74\\x44\\xdf\\x7f\\x2c\\x3b\\xad\\x9c\\x42\\x9d\\x58\\x34\\x6b\\x7c\\xcd\\xa8\\x29\\x48\\x29\\xfe\\xb9\\x6e\\x83\\xf2\\xaf\\xaf\\x37\\x09\\x73\\x56\\x15\\x75\\x4c\\x54\\x5c\\x82\\x4a\\xd0\\xf5\\x7c\\xd6\\xe4\\x6b\\x6e\\x26\\x72\\xd6\\x0d\\x80\\xb5\\x0a\\xa5\\xe0\\x83\\x39\\x7a\\x7c\\x9f\\xa9\\x15\\x04\\x10\\xd2\\xea\\x03\\xc0\\x26\\xb1\\x33\\x82\\x6d\\x61\\x59\\xd0\\xb3\\xe8\\x2c\\xda\\xbf\\xe7\\xe6\\x69\\xe2\\xea\\xce\\x6a\\x6e\\x25\\xd7\\x2a\\x04\\x59\\xee\\x54\\x44\\x59\\x5f\\x9d\\x95\\xa1\\x85\\x8d\\x20\\xdb\\x90\\x96\\xc9\\x08\\x22\\x36\\x69\\x21\\xa3\\xd6\\x33\\xaa\\xf7\\x6e\\xe4\\xa0\\xa8\\x3b\\xa4\\xbb\\xdb\\x6e\\x9b\\x3f\\x7e\\xb5\\x60\\x58\\xa7\\xcc\\x8c\\x52\\xff\\xc0\\x41\\x87\\x0f\\xdf\\xdb\\xf4\\xfa\\xbd\\xec\\xdc\\xf7\\x17\\xef\\x39\\x60\\x31\\x7f\\xc6\\x09\\xc3\\x07\\x2d\\x7e\\xbf\\x69\\x2a\\xf1\\xb6\\xcc\\xe3\\x84\\x07\\xa3\\x94\\x21\\x5c\\x1e\\x37\\x1c\\x72\\x40\\x22\\xd1\\xba\\x2f\\x95\\xa1\\x18\\x11\\xe8\\x3a\\x52\\xcc\\xd2\\x36\\x2d\\x97\\x9e\\xab\\x41\\x03\\x9d\\x7a\\xf5\\xd3\\x12\\x34\\xce\\x8f\\x50\\xa5\\x27\\x19\\x98\\x1f\\x44\\x07\\x15\\x2e\\xec\\x15\\xeb\\x39\\x97\\xcd\\x47\\x52\\x11\\x33\\x11\\x2c\\x90\\x7d\\x2e\\x2a\\x6d\\x72\\xb1\\x4d\\x74\\xe0\\x0c\\x92\\xb2\\xa6\\x2a\\xd0\\x54\\xd2\\xaa\\xa2\\xb4\\x62\\xd8\\xfe\\x0c\\xbf\\x2e\\x70\\xa3\\x8e\\xbd\\x3d\\x71\\x55\\x99\\x5b\\x51\\x7e\\x6d\\x1c\\xfd\\xfc\\xf0\\xca\\x01\\xab\\x87\\xcf\\xb9\\xaa\\xf3\\x1d\\x97\\xbe\\x75\\x0c\\xe5\\x4f\\xbd\\xba\\xef\\xe4\\xec\\xec\\xc9\\xbd\\xe7\\xcc\\xd0\\xc5\\x6e\\xd4\\x90\\x95\\xe7\\xbe\\x6b\\x50\\x4b\\x8b\\xde\\xf7\\x87\\xee\\x58\\x38\\xb0\\x47\\x35\\x2a\\xf8\\xe9\\xbe\\xbf\\x97\\x85\\x51\\x43\\x59\\x25\\x11\\x3d\\x40\\x10\\x00\\xe0\\xfe\\x29\\x64\\x40\\x0e\\xac\\xd5\\x56\\x0e\\x60\\x6b\\x94\\x08\\x5a\\xdc\\x92\\x96\\x41\\xe3\\x39\\x82\\xba\\xb3\\x85\\xe9\\xf3\\x53\\xf9\\xf3\\x6a\\xa6\\xef\\x42\\xd5\\x3d\\x9e\\xed\\x4d\\x49\\x63\\x7d\\x75\\x76\\x96\\x49\\x22\\x9a\\x98\\xae\\xd9\\xc2\\xb8\\x99\\xd6\\x17\\xcc\\x56\\x93\\x14\\x4f\\xa7\\x42\\x9b\\x6e\\x33\\x49\\x72\\x2e\\x49\\xeb\\xbc\\x34\\x20\\x01\\xd9\\xe9\\x23\\x11\\x60\\x76\\x8c\\xb2\\x96\\x8d\\x61\\x70\\xe0\\x1c\\x2d\\x90\\x12\\x75\\x5f\\xa0\\x71\\x55\\x33\\x8a\\xfa\\x87\\x00\\xda\\x1b\\x5d\\x3b\\xe1\\xe9\\xd7\\x56\\x37\\x7d\\x7c\\x6b\\x6d\\x4d\\x8f\\x89\\xb9\\xb7\\x36\\x7d\\x7c\\x2f\\xb1\\x8a\\x0f\\x0f\\x19\\xf3\\x75\\xa3\\x32\\x84\\x06\\x53\\xcf\\xdd\\x7a\\x65\\x49\\x71\\xd3\\x1e\\x9a\\xea\\xdc\\x42\\xed\\x4b\\x11\\x00\\x73\\x9d\\x90\\x41\\x57\\xa3\\xd5\\xb6\\xee\\x24\\x24\\xd2\\x4a\\xc2\\x40\\xea\\xcc\\x09\\xa7\\xd3\\xc2\\xd8\\xd8\\x80\\xcd\\x5a\\x63\\x83\\x35\\xd2\\x7e\\x3f\\x61\\x7d\\xb5\\x51\\x30\\x49\\x04\\xdd\\x56\\x5d\\x85\\x7a\\xfa\\x95\\x89\\x2a\\x82\\xee\\x22\\xb4\\x6f\\x75\\xd3\\x1b\\xf7\\xa2\\x7c\\x76\\x15\\x3e\\xff\\x37\\x2a\\x77\\x9b\\xd0\\x47\\x5f\\x7c\\x41\\x7c\\xcf\\x31\\x65\\x08\\x3a\\x23\\x64\\x80\\x08\\x6e\\xe8\\x03\\x71\\x33\\x19\\x83\\x89\\x44\\xa6\\x61\\x1a\\xb8\\x70\\x76\\xaa\\x3c\\x24\\x4f\\x21\\x23\\xf2\\xd0\\xf8\\xc5\\x11\\x91\\xad\\x7c\\x12\\xbb\\x5a\\xf6\\x9b\\x11\\x49\\x84\\xce\\x65\\xac\\x26\\x3d\\x34\\x83\\x12\\x69\\x97\\x39\\x09\\x47\\x83\\x69\\x9e\\x4e\\xbe\\x6e\\xbd\\xeb\\xd0\\xbe\\x77\\xea\\x3b\\xf4\\xdd\\x8b\\xf2\\x95\\x49\\xc7\\x04\\x61\\xcc\\x38\\x76\\xad\\x1f\\x9f\\x7b\\xec\\xd5\\x0f\\x8d\\xc2\\x99\\xcf\\x3e\\x83\\x66\\x99\\x78\\x51\\xc8\\x80\\x2c\\xb8\\x5a\\xb3\\x46\\x38\\x2d\\x2a\\x67\\x70\\xc9\\xb8\\xcd\\xee\\x26\\x32\\x61\\x20\\x03\\x14\\x68\\x51\\xb6\\x59\\x2c\\x7c\\x61\\x9c\\xd9\\xec\\x11\\x5d\\x99\\xd4\\xbd\\x78\\x4c\\x52\\x3c\\x93\\x3a\\xc7\\x4c\\x4a\\xa4\\x4c\\xaf\\x49\\xd2\\x4a\\x4a\\x42\\x86\\xe8\\x88\\xb3\\x8e\\xcc\\x58\\x2c\\xa6\\x11\\x2c\\x4b\\x27\\x58\\xb4\\x8a\\x86\\xcc\\xac\\x16\\xf3\\xb3\\x7a\\x63\\x1c\\x61\\x74\\xef\\x6d\\x97\\x31\\xae\\xa5\\x6f\\x20\\xf1\\x1a\\xc5\\xda\\x7d\\xeb\\x2d\\x3a\\xa7\\xcf\\x2f\\xfe\\xc1\\x86\\x71\\x8e\\xf2\\x9b\\x32\\xd3\\xbb\\x6b\\x97\\x19\\x59\\xff\\xd5\\xcc\\x67\\x8a\\x07\\x33\\x97\\xf2\\x79\\x70\\x2b\\x2e\\x37\\x0f\\xfa\\xbf\\xb4\\x89\\xea\\x6c\\x6d\\xdb\\x2c\\x1a\\x6c\\x96\\xbe\\x7d\\xc4\\xa8\\xf0\\xb3\\xa9\\x61\\xa7\\x4f\\xd5\\xf2\\xbf\\xd1\\xdc\\x70\\x88\\xc2\\x21\\x88\\x77\\xa6\\x39\\x46\\x5e\\x34\\x2a\\x97\\x71\\xc9\\x84\\xe8\\x0a\\xe6\\x77\\xca\\xf7\\x6a\\x3a\\x45\\xd4\\xac\\x03\\x9b\\xc4\\x99\\x17\\x64\\x0e\\xe1\\xf2\\x30\\x8e\\x34\\xc8\\xa5\\x7c\\x32\\x5e\\x1a\\x21\\x83\\x28\\x0d\\x9b\\xa4\\x78\\xa4\\x94\\x1c\\x46\\x3a\\x9b\\x24\\x5c\\x6a\\x97\\x0b\\x90\\x24\\x07\\xf8\\x64\\x3c\\x50\\xd0\\x5c\\x20\\x2a\\xa0\\x05\\xa2\\x82\\x90\\x49\\xc2\\x01\\xad\\xd1\\x94\\xce\\x5c\\x50\\xfb\\x69\\x27\\xb9\\xb7\\xdb\\x9e\\xb2\\xad\\x72\\x05\\x92\\xe4\\xd2\\x08\\x09\\x42\\x98\\x18\\x9d\\xf4\\x16\\x62\\x38\\xe0\\xc0\\x26\\x1a\\xa2\\x59\\x33\\x89\\xf3\\xe8\\x50\\x46\\xec\\x57\\x44\\x8b\\x51\\xa2\\x31\\x8c\\x1c\\x32\\x6b\\xd2\\xf2\\xf3\\x20\\x6d\\x8d\\xf3\\x78\\xdb\\xd1\\x48\\x57\\xfb\\x1a\\x9a\\x83\\x76\\x58\\xcb\\x37\\x5e\\x31\\x7b\\x6d\\x61\\xe4\\xf1\\xab\\x1f\\x7f\\xe1\\xde\\xa6\\x8f\\x6e\\x1d\\x39\\xa2\\xe7\\x44\\x1f\\xb3\\xa8\\xe9\\xe7\\x45\\x23\\x47\\x76\\xab\\xcd\\x21\\x8c\\x64\\x57\\xe1\\xfb\\x87\\x8f\\x9d\\x34\\x79\\xfc\\xf4\\xaf\\x4e\\x28\\x3d\\xa9\\xd6\\xbe\\x71\\xd3\\xd4\\xaa\\x32\\xa7\\x2f\\x4d\\x11\\xb4\\x8f\\x8b\\x67\\x94\\x76\\x68\\x7a\\x5e\\xd3\\x9b\\x94\\x8c\\xfe\\x41\\xed\\xf5\\xba\\xff\\x68\\xb7\\x5a\\x50\\xb7\\xd9\\x72\\xb5\\x63\\xb6\\xfe\\x67\\x83\\xe5\\xcd\\x4e\\x11\\x2f\\x5d\\x6c\\x63\\xb8\\x40\\xc4\\x39\\x84\\x5c\\x29\\x31\\x69\\x8f\\x4c\\xcd\\xa2\\xb3\\xc3\\x56\\xf9\\xd8\\xf4\\x27\\x9f\\x5f\\xdd\\xf4\\xf1\\x2d\\x35\\xb5\\x5d\\x27\\xe5\\x2e\\x6a\\xfa\\x7c\\x35\\xbb\\x0a\\x6f\\x18\\x33\\xe9\\x83\\x2f\\x95\\x0e\\x14\\xe7\\x86\\xb9\\x13\\xc3\\x52\\xd3\\xcb\\x29\\x9c\\xb5\\xfe\\xb3\\xee\\xdc\\xf0\\x8b\\x6b\\xd3\\xe8\\xff\\xd6\\x9f\\x4d\\xc3\\x37\\xc8\\x41\\xb4\\xc3\\xb1\\xa0\\xd5\\x0a\\x94\\x5e\\x28\\xfd\\xa7\\xb3\\x28\\x5d\\xf9\\xf9\\xc7\\x9f\\x95\\x9f\\x51\\xfe\\xec\\x85\\x0b\\xae\\xbc\\xea\\xda\\x6b\\x67\\x33\\x0e\\xf7\\x2f\\xa8\\x42\\x79\\xef\\x57\\xf7\\x6f\\xca\\xfb\\x28\\xfa\\xdb\\xda\\xfa\\xc4\\xdf\\xdc\\x6b\\xf6\\xec\\x59\\x43\\xed\\x69\\x07\\x65\\x2a\\xb7\\x8e\\x1b\\x0e\\x5e\\x28\\x80\\x15\\xa0\\x85\\xcd\\xbe\\x54\\xd8\\x9c\\xd7\\x82\\x07\\xb4\\xa5\\x84\\x4b\\x62\\x47\\x84\\x36\\x6f\\x78\\xb4\\x59\\xdc\\x8c\\x48\\x5c\\xa4\\x0b\\xc9\\x44\\xa7\\x49\\x8a\\x7b\\x68\\xda\\xe1\\x71\\x99\\x24\\x2c\\x6a\\x9d\\x84\\xa9\\xfe\\x0d\\xd1\\x93\\x22\\xbd\\x5f\\x94\\x6d\\x02\\x91\\x55\\x9b\\x5b\\x74\\xc8\\xa2\\x27\\x16\\xc3\\x3e\\x11\\xdb\\x63\\xb2\\x00\\x62\\x6b\\xf2\\x37\\xc7\\xd5\\xa9\\x1c\\xbc\\x55\\x6c\\xdd\\x01\\x6d\\x4b\\xeb\\xbc\\xa2\\xf6\\xed\\xa3\\x47\\xdf\\x1a\\xbb\\x3c\\x7c\\x2f\\xb1\\xcf\\x21\\xdf\\xe4\\x7e\\x57\\xcd\\x98\\x75\\x65\\x9f\\xc9\\x3e\\x76\\x15\\xbe\\x75\\xc0\\x50\\xe5\\x4d\\x15\\xdc\\x67\\x95\\x2f\\x7b\\xf5\\x50\\xde\\xf2\\x63\\xec\\xe7\\x7a\\x36\\xbd\\xd2\\xa9\\xf3\\xd6\\xfb\\xdc\\x8f\\xbc\\x5a\\x19\\xd1\\xe7\\x0c\\x94\\xa9\\x5c\\x1d\\x37\\x1c\\xdc\\x10\\x82\\xa5\\xfa\\x4c\\x63\\x66\\xab\\xd8\\x21\\xa0\\xc5\\x0e\\x69\\x5c\\x12\\x5b\\x22\\x08\\xe7\\x53\\x36\\x79\\xf8\\x24\\xf6\\x50\\x99\\xc3\\xd9\\x91\\xff\\x20\\x76\\x44\\xe5\\xd3\\x09\\xee\\x9c\\x33\\x16\\xc3\\x66\\x91\\x46\\x12\\x4e\\xc2\\x50\\x73\\x7a\\x2c\\x26\\x07\\x6c\\x5a\\x92\\x71\\x71\\x2c\\xa1\\xa1\\xdc\\x7e\\xd0\\x5a\\xb3\\xb2\\xcc\\xdb\\x44\\xcc\\x57\\xe7\\xdb\\x47\\xeb\\x21\\xeb\\xa4\\x9c\\x9c\\x89\\x17\\x42\\xd6\\xe1\\x97\\xdc\\xf1\\xe7\\x6f\\x04\\x61\\x54\\xd9\\xbd\\x07\\xca\\x3f\\x7b\\xff\\x96\\x70\\x27\\xf4\\x75\\xe7\\xf2\\xbd\\x8f\\x52\\xdb\\x3a\\x00\\x80\\x1d\\x40\\x71\\x9e\\xad\\x65\\x4b\\xb2\\x53\\x9b\\x81\\x10\\xf4\\xfe\\x3d\\x3f\\x27\\xb5\\xd0\\x3d\\x4f\\x18\\xbb\\xe8\\xcc\\x43\\x3c\\xdd\\xd5\\x3c\\xed\\xe0\\x4a\\x4f\\x95\\x07\\x69\\x35\\x25\\xdd\\xa5\\xf3\\x17\\x64\\x8b\\x53\\x0b\\x60\\x41\\xc4\\xee\\x8b\\x55\\xca\\xcb\\x16\\x5d\\x50\\xa5\\x01\\x68\\x87\\xad\\x70\\xf1\\x08\\x6f\\x54\\xcc\\x5d\\x5c\\x7d\\xa9\\x67\\x75\\xd3\\x7e\\xa2\\x47\\x8f\\x5d\\x3a\\xc5\\xc0\\x2b\\x7f\\xb0\\x91\\x4e\\x4d\\xbf\\xe8\\x0a\\x44\\x6b\\xd0\\xec\\xe7\\xdc\\x50\\xe8\\x00\\x77\\x69\\x31\\x6a\\x22\\xc8\\x41\\x39\\x27\\xc5\\x83\\x74\\x9a\\x3c\\x98\\x63\\x92\\xe2\\x2c\\x19\\xbe\\x55\\xfb\\xda\\x4a\\x3d\\x81\\xd5\\x48\\x32\\xa2\\x8e\\x5a\\x59\\x56\\xb8\\x50\\x98\\x36\\xeb\\x85\\x69\\x10\\x1d\\xf5\\xbe\\x6c\\x7f\\x31\\x09\\xf3\\xf2\\xc5\\xdd\\x6c\\x8b\\xe2\\x74\\xbd\\x60\\x72\\x1a\\x68\\x65\\xe8\\x42\\x75\\x5a\\x06\\x77\\xac\\x45\\x69\\xba\\xb2\\x65\\x22\\xd5\\xbc\\x76\\x2e\\x94\\x57\\x18\\x46\\x2d\\x4a\\xd3\\x9d\\xd0\\xb4\\xe3\\x1f\\xde\\xfa\\x75\\x35\\xbb\\x3f\\xd7\\x3f\\xb1\\x6a\\xd8\\x84\\x71\\xb7\\xbf\\xfd\\xfa\\xb9\\xf7\\x6f\\xf9\\x68\\x14\\xfb\\x5e\\x71\\xd6\\x84\\xb2\\xda\\xc9\\x53\\x6e\\xdd\\xfb\\x06\\xa3\\xae\\x3c\\xd0\\xaf\\x42\\xf9\\xf5\\xae\\x8c\\x40\\xff\\xf2\\xb2\\xde\\x99\\xc5\\x1b\\x56\\x3e\\xf8\\xc2\\xa0\\x7e\\xbf\\xde\\xeb\\x71\\x57\\x57\\x75\\x1e\\xe0\\x2b\\x7a\\x04\\x10\\x94\\xa8\\x8d\\xcc\\x07\\x7c\\x5f\\xf0\\xc2\\x54\\x5d\\x52\\xad\\xba\\x82\\x62\\x5e\\x0b\\xd2\\x0d\\x91\\xd4\\x42\\x1b\\x8e\\x20\\x9e\\x41\\xf4\\x94\\x2e\\xb4\\xe1\\xb5\\x85\\x36\\x9e\\xe6\\x85\\x36\\x1e\\x3a\\x57\\xe7\\x01\\x6d\\x82\\x0e\\x64\\xab\\x53\\x93\\x44\\x10\\x71\\xba\\x16\\x9c\\x8b\\xb4\\xbb\\x5d\\xab\\xe8\\x6a\\x29\\x47\\x61\\x85\\x58\\xb2\\x09\\x85\\x5e\\x7d\\xb5\\xbc\\xc4\\x5f\\x9a\\x9d\\x59\\x36\\xb5\\xcb\\xfa\\xbf\\xb3\\x73\\xdf\\x47\\x26\\xe5\\x9f\\xef\\x37\\x7d\\xd6\\xab\\x92\\x17\\x3e\\x49\\x4f\\xdf\\x9a\\x60\\x8a\\x01\\x41\\x50\\x6d\\xe4\\xde\\xe1\\xba\\x82\\x0f\\x6e\\xd4\\xb3\\x22\\x03\\x9b\\xd4\\x84\\x4d\\xe4\\xf4\\x41\\xdb\\x68\\xd5\\x8e\\x4e\\xbc\\x6a\\x85\\x69\\x8e\\x4f\\xc6\\xb3\\xb8\\xe6\\x6a\\x34\\x67\\x97\\xcd\\xba\\x47\\x34\\xdb\\x53\\xda\\x45\\x4d\\xa2\\x99\\xa3\\x25\\x68\\x6c\\x17\\xf5\\xac\\x49\\x74\\x68\\x42\\x67\\xa0\\x6d\\x61\\x40\\xf8\\xa5\\x15\\xa5\\xf5\\xf1\\xb7\\xce\\x03\\x0b\\x2b\\xc4\\xe0\\x0d\\x28\\x7f\\xc4\\xf0\\xfe\\x33\\x03\\x4b\\x97\\xa2\\xfc\\x65\\xca\\x2d\\xce\\xf2\\x47\\xa6\\xef\\x78\\x9d\\x5d\\x85\\x9b\\x16\\x2c\\xba\\xa2\\xb4\\x23\\x33\\xd0\\x4f\\x43\\xbd\\xbb\\x87\\x8e\\xfe\\xe2\\x7b\\xb4\\x57\\x8b\\xad\\x72\\x01\\xb8\\x05\\x5c\\xd7\\x96\\x35\\x69\\xf4\\xbf\\xd6\\xa4\\x9d\\xde\\xe8\\x85\\x4a\\x6e\\x2e\\x6a\\x9c\\x75\\xbf\\x53\\x70\\xdf\\x3b\\x1b\\x35\\x4e\\x51\\x5e\\x53\\x92\\xca\\x3e\\x76\\x15\\xc6\\x4e\\x25\\x7b\\xd6\\x2c\\xf4\\x8d\\x0b\\xe3\\xf4\\xf3\\x77\\xb2\\x37\\xd1\\x67\\x16\\x01\\x08\\xfd\\xb9\\xae\\xe0\\x85\\x4a\\xad\\x26\\x8d\\xc5\\xa8\\xa6\\x9b\\x06\\x5b\\xbb\\xf5\\x68\\x90\\xc1\\x23\\x3a\\xea\\x79\\xc1\\xe4\\xd4\\x56\\xe7\\xe9\\xe5\\xcc\\x68\\xaa\\xa4\\xc9\\x86\\xe8\\x5f\\x11\\x3a\\x7d\\xdd\\x2c\\xe1\\x9d\\xfd\\xef\\x09\\x33\\x17\\xa2\\xd3\\x73\\x4f\\xfc\\xf6\\xb6\\xf0\\xf6\\xaf\\xdf\\x90\\x61\\x78\\x14\\x91\\xd9\\xdd\\x34\\x08\\x9d\\xf5\\x62\\x9c\\x76\\x7e\\x39\\xb3\\xbc\\xe9\\x66\\xf6\\xe6\\x94\\xdf\\x5e\\x45\\x79\\xda\\xbb\\xfd\\xfa\\x31\\x6a\\xaf\\x7e\\xac\\x25\\x7f\\x3c\\x12\\x1d\\xbb\\x4d\\x66\\x8b\\x37\\xa3\\x79\\xa2\\x5b\\x2f\\x15\\x7b\\xab\\x5a\\x96\\x8a\\x8b\\x0c\\x5e\\x77\\x60\\x26\\x2a\\x54\\xbe\\x9d\\x89\\xbe\\x9f\\xf1\\xe4\\xe6\\x99\\x28\\x39\\x5d\\x39\\x8d\\x0a\\x66\\x29\\xe2\\x8c\\x6d\\x3b\\xc6\\xef\\xb2\\xa3\\xcb\\xd1\\x38\\x11\\x6f\\xb7\\x1e\\x3a\\x64\\xdd\\x8e\\x45\\xe5\\x69\\xa5\\xce\\xbe\\x6b\\x9b\\xf5\\xf3\\x2f\\x2c\\xdb\\x28\\xbd\\xb2\\x94\\x21\\xdc\\x26\\xae\\x2b\\xe4\\x10\\x7a\\x51\\xf6\\x98\\x75\\x2a\\x99\\xac\\x91\\x48\\x04\\x8b\\x61\\xcd\\xdb\\xfa\\xc3\\x5a\\x13\\x0d\\x5d\\xfb\\x49\\xad\\x95\\x6c\\xb0\\xc5\\x9a\\xe9\\x95\\x8b\\x74\\x66\\x51\\x71\\xd1\\x73\\xba\\x5e\\x08\\x65\\x31\\x8e\\x1b\\xd7\\xa6\\x0b\\x3b\\x96\\x30\\x8e\\x99\\xca\\xb5\\xe1\\x8d\\x8f\\x15\\xf4\\x2e\\xc9\\x4b\\xf3\\x5b\\x06\\x0d\\x77\\x07\\x95\\xed\\x84\\x7a\\x2e\\x65\\xe4\\x70\\x84\\x54\\xc2\\xc4\\x73\\xdf\\x5c\\xff\\x98\\xd5\\xf2\\x0f\\x86\\x1b\\x58\\x31\\x9a\\xb2\\x13\\x10\\xd4\\x00\\xb0\\x5f\\x70\\x5d\\xc1\\x06\\x8b\\x5b\\xd4\\x85\\x69\\xdb\\x84\\x45\\x5b\\x8f\\x44\\x3d\\x2f\\xab\\xbb\\xe0\\x04\\xaf\\xaf\\x23\\xa0\\x95\\x61\\x99\\x33\\x24\\xe3\\x1c\\x4f\\x54\\x81\\x33\\x6a\\x0a\\xa2\\x57\\x88\\xe3\\x16\\x9a\\x49\\x58\\x40\\x4b\\x65\\x64\\x0b\\x27\\x3a\\x68\\x99\\xf8\\x2f\\x8b\\xc3\\xa2\\x56\\x1c\\x16\\x6b\\x18\\x56\\xf9\\xa7\\xe5\\x38\\x3b\\xbd\\xe9\\xdf\\xa8\\x93\\xf5\\xd8\\x33\\xcc\\x33\\xf7\\xa3\\x05\\x4f\\x35\\x0d\\x5b\\xa3\\xac\\xa1\\xf2\\xa7\\x3c\\xcc\\xdc\\x28\\xf4\\x00\\x3f\\x44\\x53\\xeb\\x26\\x69\\xff\\xa6\\xd6\\xc3\\xcc\\x45\\x64\\x97\\x91\\x68\\x30\\x6d\\x72\\x70\\xf9\\xa8\\x0d\\x01\\x19\\x01\\x3d\\x20\\xc4\\xa4\\x0e\\x9b\\xda\\x8f\\x1c\\xd4\\x3c\\x61\\x49\\x32\\x7e\\x3a\\x5d\\x39\\x71\\xfc\\x96\\x37\\xba\\x8c\\xeb\\x3f\\x61\\xc2\\x84\\x09\\xfd\\xc7\\x75\\x79\\x63\\xcb\\x78\\x46\\x78\\x7b\\xee\\xcc\\x77\\x77\\xfc\\x54\\xb5\\x31\\x77\\xd3\\xa2\\x77\\x67\\x6f\\x2e\\x0d\\x6f\\x9e\\xf5\\xee\\xa2\\x4d\\xb9\\x8f\\x55\\x9d\\xdd\\xf1\\xee\\x8c\\x79\\x1a\\x0d\\x97\\x2b\\xbf\\xa0\\x28\\xad\\x29\\xe7\\x5d\\x58\\x1b\\x87\\xa1\\x21\\xc1\\xd2\\xfe\\x62\\xfd\\x2d\\x55\\x64\\x16\\xa3\\xe2\\xf2\\x5d\\xca\\x2f\\xc2\\xab\\xff\\xee\\x43\\xeb\\xcb\\x0f\\x33\\x93\\x52\\xf8\\x78\\xc3\\x09\\xcf\\x05\\x7c\\x58\\x9a\\x2b\\xfa\\x8c\\x24\\xc6\\xa1\\xf8\\xf8\\x58\\x51\\x4b\\xfd\\x3d\\x5e\\x51\\x6b\\xcd\\xf4\\xf6\\x44\\x14\\x1d\\x7d\\xf8\\x55\\x1a\\x3a\\x51\\x37\\xad\\xa3\\x09\\x06\\xcb\\xa5\\x03\\x26\\x4d\\x99\\x32\\x69\\xc0\\xa5\\x5d\\x5e\\xdf\\x3a\\x6e\\xe2\\xc4\\x71\\x5b\\x5f\\x7f\\x87\\xa2\\xf1\\x78\\x69\\xe9\\xe6\\x2b\\x09\\x1a\\x1b\\xab\\x7e\\xda\\xf1\\xee\\xcc\\xb9\\x6f\\xcf\\x9b\\xf1\\xee\\x8e\\xb3\\x55\\x04\\x97\\xcb\\xd1\\x12\\xee\\x55\\x36\\x06\\x99\\x30\\x0c\\xb0\\x27\\x4c\\x18\\x5f\\x6f\\x62\\x3d\\x46\\x5a\\x45\\x42\\x38\\x8b\\xba\\xae\\x4c\\x53\\x12\\x67\\x6a\\x33\\x8a\\x36\\x53\\x52\\xf6\\x11\\x9e\\x67\\xea\\xd5\\x48\\x90\\x3d\\x76\\xd1\\x21\\x43\\x66\\x2c\\x26\\xb3\\x26\\xd1\\x21\\x5b\\x6d\\xb1\\x0b\\xde\\x49\\xf3\\x42\\x5e\\xea\\x95\\x74\\x3f\\x75\\xf9\\xce\\xbb\\xc7\\xac\\x1f\\x52\\x36\\x54\\x8a\\x0e\\x7e\\x47\\xbe\\x6b\\xec\\x9a\\xe1\\x91\\xa1\\x25\\xe5\\x97\\xa0\\x7d\\x4f\\x1c\\xee\\xdb\\xa7\\xb4\\x68\\xf6\\x20\\xdf\\xe6\\x2f\\x7a\\x0d\\x28\\x29\\x9e\\x35\\x90\\xc6\\x47\\x77\\x28\\xab\\xd0\\x53\\x5c\\x57\\xda\\x47\\xdf\\x01\\x68\\x59\\x2b\\xc1\\xe9\\x1d\\xfe\\x6d\\xb7\\x58\\x60\\xf5\\x2d\\x16\\xb4\\x29\\x4c\\x24\\x06\\xc5\\x3b\\x50\\x81\\xf2\\x05\\x2a\\x50\\x56\\xb1\\x2f\\x9c\\x1f\\xc8\\xed\\x42\\x48\\x51\\x01\\xc1\\x48\\xd5\\xc2\\x01\\x5f\\x08\\xf9\\x70\\x25\\xe0\\x60\\x38\\xe1\\xd5\\xd6\\xc7\\xdb\\x53\\x2b\\xe5\\x53\\x35\\x41\\xbd\\x67\\x20\\xa8\\xd5\\xa6\\x03\\x26\\xf2\\x90\\x78\\x20\\x48\\x93\\x27\\xb3\\x5e\\x16\\x0c\\x04\\x49\\xc6\\xe3\\xa5\\xad\\x03\\xe4\\x30\\x37\\x2f\\x46\\xdc\\x42\\xdc\\x92\\x95\\x1d\\x8b\\xc5\\x30\\xef\\x90\\x39\\xb3\\xa6\\xd6\\xe5\\x0e\\x6d\\xb1\\x7b\\x3b\\xa5\\x4f\\x0f\\x5d\\xf0\\x5e\\xc8\\x8c\\x3c\\xf8\\xd2\\xc1\\x39\\xcf\\x74\\x6f\\x55\\xfa\\x34\\xb1\\xec\\x3b\\x8f\\x1d\\x7c\\xf9\\x2d\\xc6\\xe6\\x7f\\x17\\x85\\x8a\\x4f\\x7e\\x61\\x1e\\xd2\\xa3\\x55\\xf9\\x73\\xcd\\x27\\xde\\xef\\x1b\\xf3\\x51\\x48\\x5f\\x7b\\x07\\xc0\\x4d\\xe6\\x0f\\x40\\x3e\\x24\\x20\\xee\\x27\\xfa\\x9d\\xab\\x65\\x8a\\xe4\\x38\\xe1\\xd3\\x55\\x5c\\x9f\\x43\\x8e\\xa7\\x09\\xa9\\x46\\xa1\\x04\\x20\\xbf\\x60\\x93\\xb0\\x43\\x73\\xe4\\xae\\x08\\x25\\x02\\xd3\\x20\\x3b\\xf8\\x64\\x9c\\x71\\xa4\\xda\\x08\\xea\\xab\\x19\\xbf\\x49\\xc2\\x8c\\x1d\\x87\\x02\\x0d\\x22\\x09\\x43\\xe3\\x9e\\x50\\x73\\xd0\\xed\\xb0\\x53\\xd9\\xc8\\x36\\x24\\x71\\xb6\\xde\\x47\\x6d\\x31\\xd3\\x55\\x17\\x66\\x73\\x92\\x92\\xcb\\x13\\xd2\\xfa\\x90\\x2c\\xa2\\x2c\\xa4\\xc5\\x68\\x6d\\x2b\\x2b\\xa6\\xb7\\x89\\xe8\\x45\\xb9\\x22\\x2a\\x39\\xcd\\x5b\\x02\\x78\\x83\\xee\\xa0\\xd7\\x25\\x18\\xb4\\x25\\x8a\\xd1\\x9e\\xa8\\xa2\\x28\\xb6\\xc1\\xf8\\xf3\\x3b\\x87\\x7f\\xe0\\x18\\xe5\\x9b\\x49\\x03\\x06\\x8e\\x34\\xa3\\xcb\\x95\\xad\\x5c\\xf7\\x2e\\xe8\\x98\\xf5\\xd8\\x79\\x9f\\x39\\x1c\\xe6\\x98\\xa1\\x5f\\x37\\x7c\\x7c\\xf6\\xd8\\x73\\xc2\\xd4\\x89\\x8b\\xe6\\x34\\x7c\\x3d\\x76\\xf8\\x9a\\xd8\\x1a\\x65\\xcd\\x71\\xeb\\x96\\xda\\xe9\\x44\\xa6\\x46\\xab\\x27\\xf9\\x7e\\xdc\\xcf\\x74\\x95\\xd2\\x6d\\x7a\\x65\\xdb\\x17\\x8a\\x46\\xe5\\x22\\x2e\\x89\\x4b\\xc3\\xb2\\x8d\\xd3\\x56\\x27\\x71\\x0d\\x89\\x7c\\x6d\\x0b\\x04\\x6d\\x86\\x22\\xe1\\xd1\\x14\\x9b\\xae\\x43\\xe2\\x44\\x47\\x3d\\x32\\x98\\x42\\x24\\x5a\\xeb\\x28\\xd6\\x9b\\xed\\x74\\x0b\\x04\\xec\\x71\\xd4\\x8b\\xce\\x4c\\x1f\\x0d\\xdc\\x8a\\x72\\x45\\x47\\x7d\\x16\\x68\\x27\\x4a\\xc5\\x7a\\x64\\x70\\x12\\xe7\\x83\\x6d\\x8e\\x7a\\xa3\\xd9\\xee\\xa0\\x7e\\xa8\\x17\\xd2\\xf6\\x41\\x28\\xaa\\xd2\\xe3\\xd3\\x2a\\xaf\\x41\\xdb\\x02\\xc1\\x6b\\xd0\\x62\\x85\\x22\\x43\\xcb\\xa5\\x49\\xa3\\xef\\x2a\\x8b\\x76\\xa9\\x58\\x73\\xef\\x7d\\x83\\xf1\\xb4\\xa9\\xf1\\x21\\x0f\\xdc\\xb7\\x36\\xda\\x25\\x1a\\xbe\\xe7\\xbe\\xe5\\xc3\\x5e\\xb8\\x7c\\xe6\\xf3\\x43\\x6e\\x1f\\xf1\\xd3\\x8e\\xa7\\x7f\\xfa\\xe9\\xe9\\x1d\\x3f\\x2d\\xba\\x7b\\x68\\xfd\\xf4\\x99\\x2f\\x8c\\xf8\\xdb\\x9a\\x07\\xaa\\xba\\xf7\\xe8\\xb2\\xf6\\x81\\xf5\\xc3\\x9f\\xbb\\x7c\\x9a\\x3c\\xe4\\xde\\x07\\x56\\xf4\\xe8\\xd3\\xbb\\xc7\\x72\\x66\\xc9\\xf3\\xaa\\xf2\\xc2\\x73\\x8a\\xa2\\xc9\\x4d\\x07\\x00\\xbe\\x96\\xc7\\x10\\x82\\x47\\xda\\xd4\\x60\\x2f\\x9a\\xdf\\x4c\\x64\\xe7\\x64\\x20\\x1b\\x2d\\xcc\\x66\\x73\\x49\\xec\\x8c\\x24\\x02\\x41\\xfa\\x85\\x2d\\x2a\\x07\\xe8\\xa4\\x28\\xcd\\x52\\xb2\\x1a\\xb0\\xbf\\x6d\\x89\\x36\\x9d\\x08\\x49\\xa4\\x75\\x95\\x36\\x40\\x5b\\x51\\xf5\\x42\\x2d\\xc9\\x57\\xdc\\x59\\x6d\\x66\\x46\\x83\\xed\\xce\\x8c\\x46\\xdd\\x41\\xfa\\xa7\\x2f\\x7f\\xd4\\xfe\\x50\\x07\\x26\\xa3\\xdf\\x6b\\xc2\\x6b\\xfd\\x98\\x8c\\xad\\xca\\x99\\xdf\\x94\\x97\\x51\\x3f\\xe5\\xe5\\xd5\\x4d\\xbb\\x37\\x28\\x3b\\xd1\\x18\\x65\\x27\\xb2\\x28\\x67\\x78\\xc0\\xd8\\xa6\\x4c\\x41\\x4f\\xd8\\x30\\xf6\\x34\\x9d\\xdf\\x72\\xcb\\x93\\x63\\x48\\x94\\x3f\\xe6\\xc9\\x5b\\xb6\\x30\\xda\\x4e\\x4e\\x2b\\x94\\x5f\\xd0\\x3d\\xfa\\xde\\x2e\\x79\\x70\\xd1\\x7e\\x2e\\x46\\xcd\\xd8\\x18\\xdb\\x1a\\x9b\\x15\\x88\\x57\\xce\\x21\\x5e\\xf9\\x85\\xf5\\x9d\\x3f\\xc9\\x1e\\x64\\xfe\\x68\\x32\\x6b\\x39\\xde\\x58\\x25\\xca\\xad\\xe5\\x0f\\x40\\x14\\xfa\\xc3\\x3a\\xd0\\x16\\xc3\\x91\\xdc\\x5b\\xef\\x57\\x4b\\x33\\x49\\x38\\x14\\x96\\x25\\x62\\x6f\\x07\\xd0\\xa7\\x14\\x46\\xe4\\x72\\x3e\\x89\\x8b\\x23\\xda\\xca\\x38\\x62\\x87\\xca\\xed\\x72\\x27\\x24\\xe1\\xb4\\x08\\xed\\xf2\\xb1\\x46\\x70\\xc0\\x8e\\xb3\\xc8\\xc9\\x1e\\xe6\\x24\\xee\\x11\\x96\\xb3\\xcc\\x49\\x79\\x20\\xf1\\x81\\x02\\xb1\\xcb\\x91\\x58\\x0c\\x77\\x12\\xab\\xcd\\xa2\\xc9\\x1b\\x92\\xca\\x62\\x5d\\xab\\xfb\\x12\\xb9\\x0b\\x38\\xe4\\x0c\\xda\\xfa\\x2f\\x4a\\xa2\\x63\\x8f\\x60\\x0d\\x14\\x16\\x77\\xed\\xdb\\x6a\\x0b\\x85\\xfc\\x68\\x84\\xbb\\x78\\x33\\x8e\\x54\\xc7\\x4b\\x2f\\x54\\xd0\\x62\\xf7\\x8e\\x02\\x7a\\xde\\x4b\\x97\\xfd\\x14\\xd1\\x69\\xb6\\xb1\\x97\\x8e\\xec\\xdf\\x1f\\xf9\\x7e\\xf8\\x0d\\x39\\x78\\x46\\xf9\\xee\\xc6\\xab\\xaf\\x5d\\x70\\x0d\\xfe\\xe7\\xe9\\x4b\\x47\\xf4\\xeb\\xaf\\x7c\\xff\\xc3\\x29\\xe5\\x1d\\x9e\\x41\\x59\\x0f\\x5c\\x3d\\xe7\\x86\\x1b\\xb7\\xff\\x7e\\x1a\\xe5\\xcf\\x93\\xf3\\xfa\\x87\\x8a\\xa4\\x9b\\xb7\\x17\\xf7\\xcb\\x2d\\x2c\\x60\\x32\\x6a\\x56\\x95\\x46\\xee\\x9d\\xfe\\xcc\\x47\\x47\\x0f\\x0a\\x35\\xd7\\x8d\\xef\\x3b\\x64\\x58\\xe7\\xea\\x97\\x9e\\x99\\xb8\\x52\\x8a\\xde\\x3b\\x4d\\x3e\\xf8\\xd6\\xe7\\x02\\xba\\x6a\\xd2\\x98\\xbe\\x7d\\x47\\x45\\xaa\\x5f\\x7a\\x73\\xd4\\xe8\\x72\\xb3\\xcb\\xe2\\x19\\xdc\\x79\\xe0\\x84\\x72\\xb3\\xc7\\xe2\\x19\\x4c\\xe9\\xbc\\x86\\xfb\\x96\\xbd\\xff\\xc2\\x9e\\x3c\\x54\\x72\\xf5\\xc4\\x84\\xd3\\x1b\\x67\\xa0\\x79\\x46\\x99\\xf2\\x91\\xd5\\xba\\x60\\x0c\\x17\\x78\\x59\\x11\\x74\\x47\\x2b\\x82\\xee\\x35\\xc8\\x92\\x44\\x16\\xee\\xdb\\xf7\\xde\\x7b\\xef\\x3d\\x3a\\xcb\\x3a\\x58\\x6d\\xe4\\x1b\\xf8\\xfd\\x60\\x01\\x2f\\x54\\xc0\\x2e\\x7d\\x55\\x52\\x3a\\x07\\x69\\xfa\\x2a\\xab\\x84\\x9b\\x1e\\x27\\xa2\\x92\\x89\\xb5\\x49\\x89\\xa8\\x76\\x46\\x8a\\x12\\x16\\x4b\\x61\\x93\\x94\\xc8\\xce\\xa7\\x27\\xb2\\xb5\\x13\\xf9\\xb4\\x8c\\x94\\x1f\\x20\\x69\\x52\\x25\\x0d\\x1e\\xb4\\xcd\\x6d\\xb0\\x95\\x36\\x61\\x27\\x8a\\xb5\\x4f\\xc5\\x1a\\xdb\\x83\\x91\\x44\\x67\\xed\\x8b\\xdc\\x08\\xee\\x6c\\x97\\x1d\\x17\\x16\\x33\\x55\\x21\\x49\\xee\\x54\\x2c\\x3a\\xf6\\x98\\xd2\\xdd\\x6c\\x7e\\x76\\x94\\xaa\\x4c\\xbe\\x24\\x3a\\x76\\x0b\\x56\\x47\\x2e\\xe8\\x5b\\x64\\x68\\xbd\\x6c\\xf4\\xd5\\x49\\x57\\xd8\\x8b\\x74\\x81\\xbd\\xbe\\xe1\\x48\\x3a\\x0a\\x51\\x96\\xa7\\x3c\\x52\\xd4\\xeb\\x21\\x0e\\x7b\\x30\\x7a\\x0c\\x15\\xa3\\x22\\xb4\\x49\\x99\\xaa\\x7c\\xae\\x1c\\x51\\xa6\\x2f\\x41\\xe3\\x7f\\xff\\x0d\\x8d\\x57\\xb6\\xff\\xf6\\x87\\xf2\\xf4\\xd7\\xaf\\x3c\\xbe\\x51\\xe6\\x98\\xb5\\x13\\x26\\x4c\\xb9\\xfc\\xf2\\x29\\x13\\x6a\\xd7\\x32\\x1c\\xde\\xf8\\xf8\\x2b\\xcc\\x67\\xa8\\x1b\\xc2\\xca\\x48\\xe5\\x80\\xb2\\x5f\\x19\\x8e\\xe2\\xa8\\xbb\\xf2\\x2f\\x65\\x3d\\xba\\x12\\x19\\x91\\x81\\xee\\x9d\\xf0\\xca\\x0d\\x3b\\x1b\\x36\\xad\\x13\\xa6\\x8c\\x5d\\xb5\\x60\\xf1\\x75\\x77\\x8f\\x99\\x2a\\xac\\xdf\\xf8\\xa9\\xa6\\x27\\x53\\x98\\x04\\x73\\x8e\\x3f\\x00\\x01\\x90\\xe0\\x76\\xd0\\xd6\\x20\\x1b\\xe9\\xba\\x2f\\xec\\x0f\\x27\\xf2\\x29\\xe1\\x70\\x07\\xba\\xd4\\x2b\\x8d\\x78\\x69\\x3a\\x93\\x92\\x08\\x6a\\x84\\x09\\xda\\x69\\xa1\\x87\\xf3\\x45\\x22\\xfa\\x26\\x36\\x74\\x46\\x25\\x08\\x24\\x24\\x49\\xa3\\xab\\x42\\xe3\\x16\\xbb\\x9f\\xee\\x26\\xe2\\xc0\\x19\\xfa\\xba\\x5e\\xd9\\xeb\\x8b\\xc5\\x70\\x07\\x51\\x76\\xa5\\x66\\x94\\xe3\\x16\\xab\\xd6\\x17\\xda\\x62\\x56\\xd9\\x1d\\x46\\x85\\x95\\xfa\\xa4\\xb2\\x37\\x94\\x9a\\x52\\xae\\xba\\x30\\xa5\\x3c\\x65\\xfb\\x13\\x77\\x77\\x8b\\xf5\\xb9\\x64\\x0b\\x12\\x9e\\x5e\\xbd\\x62\\xa3\\x35\\x4d\\x36\\x9a\\xd9\\xe0\\x35\\xc3\\x6f\\xb8\\x63\\x57\\xd7\\x6e\\xd1\\xab\\xc5\\x95\\x83\\xc7\\xb0\\x0f\\x5f\\xb3\\x38\\xda\\xb3\\x77\\x79\\xd8\\x26\\x4c\\xbf\\xe3\\xbe\\x15\\xca\\x9b\\xd1\\x9a\\x8e\\xee\\x70\\x56\\xb8\\xc7\\x92\\x79\\x52\\x69\\xf7\\xd0\\x15\\xd5\\xda\\xda\\x26\\x0e\\x16\\xb2\\xd3\\xd9\\xbf\\xd1\\xfd\\x99\\xd3\\x00\\xaa\\xc4\\x0a\\x14\\x65\\x9d\\x21\\xa7\\xf6\\xc6\\xa1\\x8c\\x97\\xce\\x9e\\x7d\\xe9\\x3a\\xed\\x6d\\x21\\x5a\\xe1\\x44\\x2b\\x94\\xf9\\xca\\x82\\xe6\\x03\\x6a\\xcb\\xaf\\x45\\x8b\\xd8\\xdd\\x6c\\x01\\xf0\\xd0\\x19\\xf4\\x7a\\x75\\x6a\\x2b\\x0c\\x9a\\x96\\x0b\\x74\\x65\\x24\\x6b\\x4a\\xc6\\x39\\x5a\\xa5\\xe0\\x48\\xd4\\x6e\\x68\\xde\\xee\\x22\\x24\\x5e\\xcb\\xf6\\x3d\\xc8\\x2c\\xd9\\xa1\\x8c\\x42\\x1c\\xe1\\xcb\\x85\\xbd\\x28\\x38\\x28\\x6a\\xbd\\x1b\\x05\\x7f\\x61\\x37\\x0a\\x81\\xa4\\x33\\x34\\xf2\\xe6\\x74\\x5b\\x1d\\x5c\\xc6\\x94\\x37\\xbd\\x47\\x37\\xa6\\xa0\\xff\\xef\\x4e\\x4b\\x1d\\x8a\\x40\\x37\\xd8\\xfb\\xd7\\x5a\\x54\\x16\\xa5\\xca\\x52\\xa6\\x9d\\x29\\xa3\\x5a\\x54\\x96\\x61\\x92\\x70\\x71\\x24\\x91\\xd5\\x8d\\x9e\\xcb\\xd2\\xa5\\xa0\\x7b\\x3b\\xda\\x13\\xd1\\x3e\\x45\\x23\\x38\\x62\\x97\\x4b\\x90\\x84\\xab\\x22\\x29\\x57\\x9e\\x13\\x49\\xe9\\x56\\x7e\\x2b\\x3d\\xea\\x81\\x24\\xb9\\x24\\x22\\x3a\\xea\\xa9\\x1e\\xd1\\x7a\\x0c\\x0e\\xc4\\x40\\x2e\\x4b\\x17\\x1d\\x38\\x14\\xc3\\x51\\x31\\x21\\x58\\x1d\\x10\\x20\\xa7\\xba\\xe9\\x13\\x4c\\x7f\\xa1\\x55\\x48\\x0c\\xd2\\x9d\\x68\\x52\\xd9\\x86\\x3b\\xa4\\xc5\\xeb\\x12\\xca\\x44\\xa9\\xde\\xc8\\xff\\xac\\x5b\\xa8\\x00\\x65\\xae\\x7f\\xb6\\x6b\\x97\\xae\\x15\\x06\\xf3\\x06\\x13\\xd7\\x77\\xe8\\x63\\x2b\\x07\\x4e\\x1f\\x3e\\xed\\x8e\\xff\\xa6\\x5c\\x4d\\x93\\xd8\\xd1\\x2b\\x6f\\xed\\x3a\\x3e\\xd7\\x3f\\x77\\x70\\x97\\x0e\\xbd\\xdd\\x76\\xf7\\xa8\\x8e\\x95\\x03\\xfb\\x29\\xbb\\xd0\\xe1\\xee\\x5d\\x2e\\xe9\\x0a\\x08\\x1e\\xe4\\xad\\xec\\x5c\\x5e\\x06\\x16\\xfc\\xa0\\x9b\\x44\\x2e\\xd9\\x7c\\xd0\\xb2\\x39\\xa6\\x22\\xe8\\x7e\\x90\\xf9\\x82\\xb7\\x6e\\xd9\\x42\\x64\\xe0\\x2a\\xf6\\x49\\x66\\x05\\x7f\\x80\\xf2\\x6e\\x38\\xb4\\xe4\\x15\\x36\\x85\\x75\\x0e\\xd2\\x82\\x4f\\x2b\\x5e\\xb4\\xa0\\x6f\\x26\\x92\\x64\\x87\\x55\\x74\\xc8\\x26\\x96\\xb8\\x20\\x77\\xba\\xe8\\x90\\x05\\xb8\\x90\\x2a\\xb8\\x5b\\xec\\x69\\xa4\\x69\\xdd\\x55\\x8f\\xcf\\x9f\\xf7\\xd8\\xc6\\x6b\\x16\\x6c\\xfa\\xdb\\xa0\\xf2\\xf2\\x01\\x03\\xa3\\xe5\\x83\\xb8\\xfa\\xf9\\x4f\\x3c\\x31\\xff\\xda\\x8d\\x8f\\x2d\\xa8\\x18\\x38\\xa0\\xb2\\x72\\xf0\\x60\\xcd\\x6e\\xf4\\x01\\xc4\\x36\\xf0\\x7e\\xb0\\x40\\x3a\\x4c\\x84\\xb8\\x15\\xb4\\xae\\x04\\x6d\\x3b\\x18\\xba\\xee\\xf6\\xaf\\xf7\\x82\\xb1\\x37\\xef\\x05\\x63\\xfc\\x0f\\x7b\\xc1\\x88\\x17\\xed\\x05\\x83\\x2a\\x82\\xee\\x3e\\x68\\x18\\x02\\x34\\x50\\x79\\x41\\x05\\xe5\\x14\\xdb\\x87\\x79\\xf7\\x14\\x9a\\xa3\\xac\\x3b\\xa5\\xdc\\x8e\\x6e\\x6b\\xaa\\xfc\\xf6\\x5b\\xaa\\x8b\\x33\\x99\\x0d\\xcc\\x67\\xfc\\x5b\\x90\\x45\\xf2\\xab\\xb4\\x70\\xc2\\x42\\x97\\xa9\\x62\\x4f\\x6a\\xc1\\x6a\\xab\\x85\\xb9\\x3e\\xda\\x37\\x26\\x98\\x92\\x71\\x27\\x0d\\xcc\\x9d\\x69\\xa9\\x49\\x2f\\x4b\\x9a\\xe8\\xc0\\xe9\\x31\\xec\\x11\\x53\\x44\\x2b\\x6c\\xde\\xee\\x88\\x44\\xc8\\x15\\x05\\xcd\\x7b\\x77\\x84\\x66\\x0a\\xf2\\xda\\x35\\x1b\\xe7\\xdc\\x3c\\x97\\x41\\x13\\x9a\\x1e\\x40\\x95\\xdd\\x43\\xe1\\xb2\\xaa\\x2e\\x6f\\x73\\x6f\\x5d\\xf5\\xd0\\x1d\\x8b\\x46\\xdf\\x72\\xc5\\x64\\x61\\xc3\\x86\\xf3\\x91\\xbe\\x1d\\x8a\\x2a\\xba\\x87\\xb5\\x9a\\x00\\x73\\x3f\\xd3\\xc8\\xbf\\x09\\x1d\\x89\\xd5\\xcd\\x26\\x9c\\x75\\x69\\x63\\xbb\\xb0\\x3d\\x07\\x2e\\x0e\\x27\\x78\\xed\\xcb\\x0b\\xfb\\x78\\x60\\x6b\\x38\\x61\\xd3\\x39\\xaf\\x6f\\xd9\\x61\\x4a\\x12\\x0f\\x55\\x60\\x97\\x45\\x53\\x12\\x8b\\xe1\\xb8\\x48\\xa7\\x9a\\x44\\x9b\\xbe\\x6d\\x47\\xc1\\xff\\xb0\\x6d\\x47\\xb4\\xdd\\x6d\\x3b\\x42\\x45\\x29\\x84\\x0d\\xa9\\x2a\\x67\\x0d\\x73\\xb0\\x57\\xf7\\x2e\\xfd\\x06\\xf4\\x99\\x3f\\xbf\\x67\\xb7\\x2e\\x5d\\xa2\\x5d\\x0e\\x32\\x02\\x5e\\xb1\\x5e\\x1e\\xd8\\x63\\xe0\\x90\\xfa\\x47\\x1e\\x78\\x99\\xbd\\x45\\xe8\\x18\\xee\\x5c\\x12\\xa9\\xbc\\xb3\\xac\\x53\\x61\\xb4\\x24\\x57\\x98\\x79\\xd3\\x0d\\xf3\\xaa\\x26\\x66\\x66\\x5c\\xd6\\x6f\\xfe\\xcd\\xb7\\x00\\x82\\xd1\\xdc\\xcb\\xcc\\x48\\xda\\x0f\\xd5\\x01\\x9a\\x7b\\x69\\x2f\\xee\\x87\\x92\\x59\\xe2\\x43\\x18\\x6d\\x02\\xc4\\x87\\x82\\x5e\\x34\\xfa\\x2d\\x54\\xc1\\x28\\x67\\xb8\\x97\\x91\\x59\\x50\\xce\\x6b\\x6b\\x94\\x94\\xa9\\x7c\\x01\\xd7\\x15\\xb2\\x61\\xb5\\xde\\xbb\\x69\\x20\\x11\\x1e\\x6d\\xc7\\xb8\\xa8\\xde\\x88\\x7d\\x61\\xba\\xce\\xc6\\xa7\\xad\\xb3\\x61\\x23\\x71\\x1f\\x8d\\x8f\\x7d\\x60\\x92\\x70\\x96\\x56\\x75\\xa4\\xf5\\x6e\\xad\\x90\\x6f\\x27\\xc2\\xd8\\x5c\\xde\\xd7\\xe6\\x35\\xb2\\xe8\\x06\\x1b\\x38\\x5d\\x94\\x1d\\x4e\\xda\\xb6\\xe1\\x13\\x1d\\xb2\\x33\\x33\\x46\\x4b\\x90\\xe9\\xb4\\x04\\x99\\x7d\\x51\\x09\\xb2\\x45\\x05\\xb2\\x48\\x0c\\x8a\\x55\\x75\\x28\\x54\\x3b\\x61\\xe8\\xe5\\xd9\\x75\\x68\\xef\\xbd\\xca\\xe5\\x42\\xc9\\x82\\x7e\\xd1\\x71\\x21\\xe5\\x2b\\x76\\x15\\x6e\\x5a\\xbb\\x6e\\x4e\\x55\\x05\\x13\\xd1\\xaa\\x90\\xfd\\x4a\\x4a\\xdd\\x1e\\x65\\x30\\x6f\\xd5\\xf4\\xad\\x12\\x80\\x2b\\xa7\\xeb\\x37\\x1d\\x70\\x85\\xb6\\xfb\\x04\\x9d\\x73\\x16\\x22\\xd4\\x67\\x63\\x36\\x4a\\x97\\x73\\xd2\\xcd\\x44\\x1c\\xc4\\xa8\\x38\\xa9\\x59\\xe0\\xac\\x60\\xe0\\xb4\\xaa\\x2a\\x9f\\xc4\\xe6\\x70\\xdc\\x4c\\x4b\\xad\\x66\\xbd\\x92\\x94\\x6e\\x91\\x12\\x0e\\xcd\\x72\\x08\\x11\\xd9\\x45\\x97\\x76\\x9a\\x44\\x87\\xcc\\xeb\\x46\\x02\\xa2\\xa9\\xc9\\x53\\x62\\x62\\x2b\\xa2\\xee\\x4a\\xe2\\x81\\x6e\\xd8\\xd0\\xb4\\xa5\\x6e\\x4c\\x52\\x69\\x62\\x67\\x6c\\x60\\xbf\\xfc\\x10\\xf1\\xda\\xde\\x3b\\xa8\\x1b\\x62\\xd1\\xe1\\x0f\\x30\\xe5\\xcd\\x03\\x4c\\x17\\xb4\\x9b\\xed\\x0e\\xec\\x85\\xbd\\xb7\\x8a\\xb9\\xff\\xbc\\x19\\x12\\x89\\xe9\\x1f\\x40\\xf9\\x4c\\x17\\xc4\\x11\\x06\\x23\\x18\\xa3\\x54\\xa0\\x23\\x20\\x40\\x3a\\x74\\x07\\xbd\\x75\\x88\\xde\\x4a\\x17\\x7f\\x7b\\x18\\xdb\\xb4\\x6d\\x9e\\x44\\x24\\xe9\\xad\\x5a\\x74\\x36\\x02\\xcc\\x5a\\xd7\\x24\\xd2\\xda\\xe7\\xbd\\x55\\x51\\x5d\\x7e\\x8b\\xa8\\x68\\x8f\\xc9\\xfd\\xc2\\x52\\x3d\\xee\\xb9\\x6d\\x86\\x68\\xf7\\xea\\x95\\xf7\\xc5\\x2c\\xa3\\x47\\xce\\x59\\xba\\xb9\\x43\\xc7\\x0e\\x41\\xf2\\xcc\\x59\\xcc\\x23\\xe8\\x39\\xfe\\x00\\xf0\\xd0\\x51\\xeb\\xd7\\x6b\\x9e\\x7c\\xfe\\x8f\\x1e\\xbc\\x40\\x0c\\x89\\xb3\\xd0\\xa8\\x8f\\xf9\\xf4\\x4d\\xde\\xf3\\x9f\\x32\\x8b\\x28\\xcf\\xe6\\x32\\xf5\\x6c\\x9e\\xbe\\x36\\xa5\\x9f\\xd6\\x65\\x99\\xc8\\xd0\\x62\\x2b\\x4b\\x38\\x21\\xea\\x68\\x64\\xa7\\xf6\\xb9\\xb3\\xb4\\xda\\xe7\\x8e\\xd8\\xef\\x76\\x66\\x02\\xff\\x72\\x2f\\xba\\xb9\\x2f\\x3f\\xf6\\xd8\\x2b\\x2f\\x6f\\xdc\\xf4\\xca\\xae\\x9a\\xb1\\xa3\\x6b\\x6a\\xc7\\x5c\\x3a\\x9e\\x43\\xd7\\xaf\\x7d\\xe9\\xa5\\xb5\\xd7\\xaf\\x7b\\xe1\\x85\\x75\\x63\\xaf\\xb8\\x62\\xec\\xf5\\x63\\x66\\xcf\\x1e\\x43\\xe2\\x9d\\x6a\\x58\\xcf\\x6e\\x67\\xf7\\x80\\xa0\\xc7\\x3b\\x4e\\x36\\x8a\\xdc\\x28\\x14\\xd4\\xde\\xab\\x7f\\xfa\\xe9\\x25\\x94\\xa1\\x9c\\x7a\\x09\\x3d\\xa4\\x1f\\xad\\x47\\xf7\\xa3\\x35\\xca\\x12\\xa7\\xb2\\xa4\\xf9\\x80\\xee\\x48\\x7f\\x3d\\x00\\xbf\\x89\\xdf\\x4f\\x77\\x98\\x37\\x83\\x07\\x7c\\xb0\\x59\\xeb\\xfe\\xa2\\xb5\\x4d\\xcd\\x5f\\x79\\xbc\\x2e\\xd6\\x26\\xe1\\xf4\\x68\\xc2\\xa3\\x59\\x61\\x31\\x12\\xf7\\xd2\\x29\\x09\\x2f\\x31\\x50\\x0c\\x4b\\x37\\x81\\xa2\\x04\\xce\\xd6\\xca\\x9d\\xa6\\x64\\x9c\\xe7\\x9a\\xcd\\x1d\\xa7\\xcd\\x8b\\x5a\\x33\\x22\\x11\\xd9\\x69\\x4a\\x92\\x64\\x2c\\x27\\xd5\\x18\\x6b\\x8e\\x61\\x97\\xb8\\xdb\\x68\\xb2\\x78\\xbc\\x5a\\xf2\\xef\\x71\\x69\\xdf\\x7a\\x45\\xd9\\x62\\x88\\xc5\\x30\\x72\\x24\\x38\\x93\\x35\\x8b\\x76\\xf4\\x30\\x5a\\x93\\x58\\x54\\xa4\\xbc\\x62\\x91\\x17\\x15\\xa0\\x8a\\x28\\xdd\\xcc\\x27\\x54\\x11\\xac\\x8a\\x8a\\x45\\x86\\xeb\\xd1\\xa8\\x8f\\x39\\x6d\\x03\\xbf\\x3e\\xe8\\xa9\\x4f\\x66\\xce\\xfc\\x44\\x99\\xf5\\xce\\x21\\xc1\\xc6\\xa7\\x69\\x4c\\x3d\\x17\\xa7\\xdb\\xf5\\xad\\x65\\x3c\\x8c\\x62\\xd8\\x78\\xcf\\x3d\\x1b\\x11\\x62\\x5c\\xc0\\xc1\\x2c\\x00\\xfe\\x99\\x66\\x3a\\x14\\xc0\\x56\\x88\\x67\\x92\\x18\\x4b\\xc3\\xb8\\x05\\x31\\x82\\x69\\x99\\x24\\x8a\\x0a\\x6a\\x94\\xe0\\x22\\xf1\\x20\\xed\\x4f\\x0e\\x16\\xb4\\xa1\\x44\\xe1\\x5f\\x50\\x82\\x58\\x21\\xd1\\x94\\x8c\\xfb\\xe9\\x9c\\xab\\x3f\\xd3\\x24\\x69\\xf1\\x37\\x31\\xec\\x06\\x33\\x9d\\x68\\xdd\\x63\\x34\\x59\\xd3\\xdc\\x9e\\x02\\x6d\\x16\\xcb\\x23\\x3a\\xea\\x0d\\xa2\\x25\\x2b\\xdf\\x1b\\x93\\x51\\x26\\x09\\x04\\xc8\\x55\\xad\\x49\\xe1\\x44\\x5e\\x13\\xfa\\x6b\\xcf\\x46\\xa4\\xda\\xa4\\x11\\xe5\\xe5\\xf6\\x9d\\x5c\\x1b\\xf2\\xa0\\xe7\\xda\\xf7\\x79\\x3c\\x0c\\x02\\x10\\x26\\xf0\\x6f\\x11\\x7a\\x40\\x18\\xba\\x41\\x35\\x1c\\x81\\x78\\x2c\\x25\\x2f\\xb8\\x5b\\x18\\x57\\x46\\x13\\xdd\\x35\\xe2\\x94\\x47\\x48\\xd6\\x21\\x68\\x14\\x14\\x3a\\x10\\x7c\\x05\\xc6\\x24\\x61\\x5b\\x38\\x91\\xa6\\x85\\x40\\xee\\xf0\\xff\\xa3\\xed\\x4b\\xe0\\xdb\\xaa\\xae\\xbc\\xcf\\x7d\\x8b\\xf4\\x64\\xc9\\xb2\\xde\\xb3\\xb5\\x78\\xd1\\xee\\x25\\xb6\\x6c\\xcb\\x96\\xbc\\xc9\\x76\\x12\\x2f\\x89\\xb3\\x27\\x40\\x02\\x24\\x90\\x06\\x02\\x59\\x69\\xf6\\x04\\x08\\xcb\\x40\\x52\\xa0\\x6c\\x0d\\x93\\xa6\\x40\\xcb\\x32\\xb4\\x65\\x18\\x4a\\x69\\x0b\\xef\\x49\\x0a\\x74\\x28\\x94\\xf6\\x9b\\x32\\x13\\x82\\x4b\\x29\\xc3\\xa4\\xd0\\x12\\xa0\\x50\\x4a\\x55\\x28\\xa5\\x29\\xf0\\x51\\x42\\xe4\\xef\\x77\\xcf\\x7d\\x4f\\x96\\x6d\\xd9\\x31\\x9d\\x7e\\xc9\\x4f\\x79\\x4f\\x92\\xfd\\x72\\xcf\\xff\\xdc\\xe5\\x9c\\x7b\\xcf\\xf9\\x9f\\xb4\\x97\\x7d\\xed\\xf4\\xe2\\x46\\x47\\x39\\x5d\\xce\\xfb\\xa3\\xaa\\xe5\\x98\\x56\\x6b\\xc9\\xa8\\x81\\x98\\x5a\\xeb\\xd0\\x14\\x4b\\x46\\x55\\xa2\\x49\\xa5\\x16\\x63\\x3e\\xa9\\xdb\\x5f\\xeb\\xd0\\x12\\x24\\xa2\\xb5\\xce\\x8c\\xc5\\xb4\\x2e\\x4b\\x46\\x8d\\xc7\\xb4\\x01\\x12\\xd1\\x6a\\xe9\\xbc\\x17\\x8e\\x26\\x12\\x6a\\x42\\x3e\\xdc\\xd4\\xdc\\xd2\\xd3\\xdb\\x87\\x18\\xf6\\xf6\\xc8\\x8a\\xd6\\xd2\\xc8\\x3c\\x96\\xd9\\x7d\\x89\\x84\\x6a\\x52\\x52\\x91\\xd6\\x58\\x1c\\x77\\x95\\x64\\x8d\\xd4\\x26\\x12\\xaa\\x1d\\xcd\\x55\\xa7\\x9c\\xac\\x08\\x34\\xb3\\x04\\xb7\\xcf\\xb1\\xa6\\x5a\\x0a\\xf5\\xc5\\x05\\xa6\\xd3\\xac\\xb4\\xe4\\x5a\\xa6\\x94\\x9a\\xfc\\x9e\\xca\\x5f\\x33\\xd5\\xf2\\x7b\\x2a\\x55\\xa8\\xff\\x72\\xd0\\x94\\xbd\\x8c\\x7f\\x55\\xe8\\x46\\x2e\\x93\\x0d\\x90\\xac\\x22\\x6c\\xd7\\xb2\\x55\\x88\\xa8\\x9e\\x28\\x46\\x36\\x3a\\xf0\\xc0\\xd5\\x51\\xaa\\x33\\x99\\xc0\\x31\\xad\\x58\\xcc\\xa8\\xc5\\xb8\\xf5\\x48\\x57\\x0e\\x1f\\x63\\x91\\x09\\x90\\x88\\xc1\\x67\\xa4\\x56\\xca\\xaa\\x90\\x50\\x7d\\x4a\\xd2\\xea\\xf0\\x60\\xc0\\x7a\\xa5\\x03\\x99\\x4c\\x18\\x11\\x5a\\x67\\x5b\\x47\\xe7\\x2c\\xd2\\x1e\\xb4\\x13\\xb3\\x9d\\x38\\xd9\\x62\\x19\\x74\\xbb\\x84\\x70\\xa8\\x96\\x5a\\x79\\x4d\\xb7\\xef\\xec\\xad\\x23\\x61\\xee\\xcc\\xcb\\xe7\\x9f\\xbd\\xf6\\xfc\\x05\\x1b\\x78\\x52\\xc9\\x71\\xd9\\x53\\xcf\\xbf\\x99\\x25\\x1b\\x48\\x6d\\xe5\\x3f\\xbd\\xbc\\xa8\\xe9\\x82\\xb3\\x0f\\x5c\\xb7\\xba\\xfb\\xc6\\xb3\\xce\\xdb\\x74\\xce\\xd9\\xa6\\xa7\\x9f\\x7b\\x93\\x7f\\xe7\\xe4\\x49\\xb4\\x2a\\x40\\xfc\\xba\\xb9\\x01\\x4a\\xc0\\x01\\x4e\\x28\\x87\\xa1\\x82\\xdc\\x19\\x8e\\xdc\\x90\\xb4\\xb9\\x46\\x09\\x34\\x2a\\xa2\\x54\\x9e\\x31\\x04\\x1a\\x2e\\x8c\\xfb\\x9b\\x48\\xa0\\x11\\x24\\x9d\\xc1\\xd2\\x30\\x5f\\x88\\x46\\x23\\xeb\\x20\\xcb\\x30\\x8a\\x7b\\xd9\\x44\\x3e\\x0d\\x73\\xb5\\x29\\xfb\\xf1\\x67\\x7d\\x48\\xaa\\x61\\xb4\\x35\\x94\\x6b\\xeb\\x82\\x69\\xb7\\x55\\x95\\xa3\\x9f\\xb3\\xb9\\xa5\\x41\\x37\\x99\\xa4\\xb9\\x1c\\xc7\\x4c\\xab\\x57\\x27\\xb6\\xd7\\xe4\\x41\\x6b\\xeb\\xb3\\xf9\\x1c\\xc9\\xb5\\xb7\\x13\\xdb\\x5b\\x0e\\xde\\xd3\\x63\\x5b\\x31\\x8a\\xad\\x71\\xf6\\x96\\xd7\\xd8\\x0a\\x99\\xd9\\x4b\\x13\\x1b\\xdb\\x5e\\x13\\x17\\x9d\\xe1\\x3a\\xf3\\x64\\xf8\\x0e\\x92\\x8a\\xef\\x12\\xff\\x2b\\xf7\\xdc\\x6d\\x2e\\xd0\\xe4\\xa6\\x8a\\x0f\\xfe\\xea\\x3e\\x74\\xe8\\xb3\\x78\\x5e\\x9b\\x57\\x61\\x9b\\xab\\x61\\x06\\x3c\\x7c\\xba\\x36\\xd7\\xe4\\x30\\xf6\\x45\\x35\\xb7\\x90\\x49\\x05\\xdd\\x3e\\x29\\xa2\\x95\\xd1\\x79\\xb9\\x3e\\xaa\\xca\\xf9\\xfb\\xd3\\x15\\x24\\xa2\\x4a\\xb1\\x74\\x25\\xe3\\x4e\\xd6\\xed\\x49\\xb3\\x25\\xa2\\x35\\x90\\x88\\x56\\x2d\\xeb\\x07\\x33\\x6a\\x85\\xfc\\xb8\\xc0\\xdb\\x4b\\xca\\x7c\\x35\\xb5\\x8c\\xeb\\x46\\xb3\\x16\\xd1\\x11\\x91\\x87\\x45\\x8d\\xac\\xa8\\x75\\x74\\xfe\\x56\\xab\\x13\\xaa\\x5b\\x51\\xe5\\x82\\xb8\\xe0\\xea\\x3f\\x7a\\xb8\\x83\\x14\\xb5\\x93\\x40\\xd4\\x7a\\xf9\\x79\\x5d\\x4f\\xb7\\x85\\xe3\\xf7\\x5c\\x7e\\xfe\\x90\\xd6\\x56\\xdd\\x3a\\xa7\\x00\\x52\\x2b\\xd7\\xdc\\x7a\\x6e\\x5f\\xb4\\xe9\\xc2\\x1b\\xcf\\xed\\x6f\\xfa\\x2c\\x46\\x3b\\xa5\\xa8\\xe3\\x55\\x8c\\x78\\x95\\x81\\x07\\xaa\\xe0\\xa6\\xd3\\x21\\xe6\\xcc\\xeb\\x95\\x6a\\x79\\x5c\\x53\\xf8\\x8c\\x5a\\x11\\x43\\x63\\x5b\\x3e\\x86\\x67\\x85\\x65\\x0e\\x74\\x45\\xab\\x24\\xc6\\x98\\x58\\x26\\xcb\\xca\\x61\\xde\\x66\\x2f\\x29\\x46\\x2e\\xb1\\x72\\x59\\x73\\x7b\\x12\\x09\\xb5\\x4a\\x49\\x0b\\x92\\xb5\\xc8\\x85\\xd3\\x6e\\x1e\\x36\\x80\\xe7\\xfe\\x05\\xfb\\x49\\xd0\\x49\\xbb\\x08\\x75\\x9b\\x0b\\x61\\x50\\x43\\xac\\xc8\\x69\\xb3\\x9e\\x58\\xc7\\x49\\xde\\x3f\\x3c\\xfc\\x99\\x9f\\x23\\xe4\\x8d\\xe1\\xe1\\x9c\\xcc\\x77\\xa0\\xcc\\x55\\x10\\x80\\x46\\xf8\\xe6\\xe9\\x64\\xf6\\xe6\\x64\\xae\\xc8\\xed\\x92\\x35\\x44\\xa9\\x0f\\x87\\x36\\x5d\\x13\\x76\\x94\\x31\\xbb\\x64\\x69\\x37\\xb3\\xe9\\x9a\\x49\\x44\\x0b\\xca\\xb2\\x92\\xe2\\x4b\\xec\\x5e\\x2a\\x7e\\x9d\\x9c\\xaa\\xf0\\x07\\xca\\xe8\\xad\\x5b\\x49\\x09\\x16\\xc9\\x37\\x1e\\x00\\xaf\\xac\\xa8\\xfe\\x04\\x26\\x68\\x68\\x6e\\x39\\x31\\x79\\xd7\\x60\\xeb\\x09\\xed\\x12\\x7c\\x9e\\x4f\\x5f\\x08\\x9a\\xd7\\xae\\x3a\\x6f\\xe5\\x15\\x57\\xac\\x3c\\xff\\xca\\x18\\x05\\xe8\\xe2\\xae\\x86\\xfa\\xb6\\xb6\\xfa\\x86\\xae\\x71\\x30\\xfd\\x72\\xf9\\xce\\x9d\\xcb\\x57\\x6c\\xd9\\x72\\xf2\\x2d\\x8e\\x70\\x3b\\x22\\x9d\\x9d\\x91\\xc6\\xae\\x84\\xe1\\xff\\x83\\xf9\\x41\\x51\\xc5\\x79\\xe0\\x19\\x16\\x51\\xa4\\x42\\x1c\\x13\\x13\\x14\\x3d\\xbf\\x59\\x2b\\xf5\\xc4\\x62\\xf8\\x2e\\x5d\\x92\\x47\\xbb\\x29\\xe9\\x79\\xa4\\x69\\x13\\x7e\\x98\\x76\\x55\\x28\\x14\\x4b\\x17\\x9f\\x49\\x5b\\x6c\\x78\\x6b\\xe1\\x73\\xd1\\x7f\\x52\\x51\\x46\\x95\\x58\\x9c\\x9f\\xc3\\x9c\\x49\\x96\\x60\\x48\\x48\\x89\\x62\\x89\\xa8\\x0e\\x87\\x2a\\x22\\xd3\\xb1\\x19\\x99\\x8e\\x45\\x73\\x06\\xe3\\xfd\\xa4\\x2a\\x59\\x49\\x96\\x39\\x2b\\x13\\x18\\x99\\x9c\\xb4\\xd0\\x01\\x98\\x50\\x4b\\x14\\xd5\\x9e\\x50\\x45\\x59\\x2b\\xb2\\x62\\x18\\x1a\\xe6\\xda\\x96\\xb9\\x13\\x14\\x5d\\x45\\x66\\x3b\\x4b\\x88\\xa9\\x1c\\xae\\x0b\\x96\\x06\\x9d\\xc1\\x52\\x76\\xf4\\x95\\x63\\x4b\\xaa\\x1b\\xb8\\x89\\x7b\\x90\\xff\\xdb\\xeb\\xd6\\xec\\x9d\\x0e\\xf2\\xd7\\xac\\x4b\\x26\\xff\\x64\\x7b\\xed\\xe4\\xef\\x0e\\x99\\xb2\\x67\\x2d\\x5f\\xb1\\x93\\xc4\\xdc\\xe2\\xa3\\x65\\xc2\\x9f\\xb2\\xff\\x7c\\x20\\x7b\\xe8\\xad\\xec\\xa6\\x03\\xd9\\x83\\x8f\\x56\\x7d\\xfd\\xdf\\xec\\x8f\\x72\\x43\\x5c\\x03\\xc1\\x3d\\xc6\\xb6\\x6c\\x1c\\x39\\x84\\x00\\x02\\xd0\\x02\\x5f\\x65\\xe7\\x84\\xe9\\x10\\xdb\\x6b\\x43\\x0b\\x51\\x34\\x92\\x4c\\x1b\\xa2\\x5a\\x84\\xce\\x36\\xad\\x51\\x95\\x1c\\xd3\\x79\\xf9\\xb0\\xdb\\xd4\\x49\\x48\\xb0\\x55\\xce\\xf8\\x42\\x2a\\x2c\\x19\\x55\\x8a\\x69\\x31\\x12\\xd1\\x9a\\x15\\x59\\x49\\x05\\x43\\x0d\\x11\\xd6\\x9f\\x0e\\x8b\\x4e\\x9f\\xbd\\x1a\\x4f\\xc9\\xca\\x15\\xcd\\xea\\xa1\\x22\\xfb\\x22\\xf4\\x47\\xaa\\xeb\\x9a\\xa9\\x29\\x68\\x0f\\xc9\\x4a\\xd2\\x12\\x40\\x90\\xc4\\x9c\\x31\\x38\\x35\\x03\\x11\\x19\\xe7\\x45\\x9d\\x86\\x91\\x88\\x9c\\xcc\\xf3\\xb2\\xa6\\xa6\\x27\\x3a\\xf5\\xd1\\x18\\x27\\x8c\\x67\\x1c\\x40\\xe6\\x06\\x28\\x03\\x27\\x54\\xc0\\x23\\xa7\\xe3\\x01\\x72\\x22\\xbb\\xdd\\xb4\\xc9\\x80\\x2a\\x3f\\x07\\x19\\x50\\x15\\xed\\x77\\x9c\\xac\\x68\\x2e\\x37\\xb2\\x6d\\xa4\\x64\\x4f\\x39\\x35\\xa6\\x55\\x49\\xf9\\x5c\\xcc\\x40\\x41\\x4c\\xee\\x9a\\xc8\\x0f\\x74\\x72\\xdf\\x3b\\x68\\x2a\\x4c\\xe0\\x09\\x42\\x43\\x01\\x72\\x58\\x84\\x74\\x2c\\x1e\\xfd\\x87\\x62\\xa1\\xba\\xa2\\x7f\\x1f\\x1c\\xaa\\x8b\\x81\\xe1\\x9e\\x0c\\x0c\\xcb\\x94\\x60\\xa0\\x31\\x52\\x08\\x0c\\x72\\x37\\xb3\\x44\\x26\\xc0\\xa1\\xdb\\x21\\x39\\x3c\\x3a\\x11\\x0f\\x1f\\xa4\\xff\\xc1\\x7d\\xc3\\xff\\x39\\xc0\\x08\\xe8\\x60\\x24\\x5d\\x6e\\x3c\\xe1\\xb0\\xc8\\x69\\xd9\\x53\\x5e\\xe5\\x65\\x88\\xa4\\x8a\\xed\\x15\\xcc\\x29\\x9d\\x6e\\x0f\\x31\\x8c\\x9e\\x42\\xc0\\xfc\\xc6\\x30\\x78\\x26\\x22\\xa3\\x9b\\x3b\\xd4\\x9e\\x64\\xd8\\x14\\x23\\x36\\x74\\x5e\\x7e\\xee\\x1f\\xdd\\x5b\\xd4\\x8a\\xb8\\xe6\\xe6\\x33\\x6a\\x65\\xcc\\x60\\x38\\x72\\x88\\x19\\xcd\\x4a\\xa7\\xf9\\x09\\x60\\xb9\\x24\\xfc\\x8d\\xf1\\xb0\\xa5\\xbc\\x92\\x45\\x8a\\x68\\x15\\x12\\x5d\\x39\\x35\\xaf\\xc4\\x66\\x6d\\x0b\\xc7\\xb2\\xba\\xbc\\x13\\x08\\xb7\\xa6\\xee\\x49\\xc6\\xd1\\x61\\x21\\xcc\\x9e\\xc2\\xe3\\xc4\\x89\\x80\\xf5\\x1b\\xe7\\x8b\\x23\\x27\\x00\\xb8\\x43\\xe6\\x7a\\x10\\x40\\x04\\x19\\x56\\xe6\\xe5\\x1c\\x38\\x62\\x49\\x91\\x62\\x93\\x23\\x1c\\x2a\\xc6\\x20\\x3f\\x55\\xd2\\x63\\x62\\x25\\x23\\xd8\\x97\\xfe\\xa4\\x54\\x62\\x10\\x0d\\x51\\x57\\xa8\\x94\\x44\\xb4\\x12\\x89\\xae\\x2f\\x02\\x9f\\xc0\\x5d\\x1b\\x9e\\x8e\\x7d\\x92\\x4f\\x7f\\x64\\xc7\\x41\\x9f\\xcd\\xea\\x34\\x48\\xe6\\xb0\\x29\\xfb\\xf1\\xdf\\x7e\\x3b\\x86\\x0d\\x89\\x8e\\xfd\\x4e\\x00\\xee\\x7e\\x73\\x10\\xac\\x60\\x03\\x19\\x56\\x8d\\xe5\\x61\\xb2\\xe5\\xd6\\x0c\\x46\\xc6\\xa4\\x16\\x47\\x0d\\x5a\\xb0\\xd3\\xf1\\x31\\x95\\xea\\x88\\x6b\\x76\\x19\\x1b\\x98\\xdf\\xb4\\x20\\x6e\\xb6\\xea\\x0d\\x3b\\xf5\\x6f\\x5b\\xf3\\x07\\x24\\x6b\\x9a\\xc9\\xad\\x8f\\xc5\\x91\\xdf\\x03\\x70\\x47\\xcc\\x1d\\x20\\x81\\x05\\x9c\\xb4\\x7d\\x39\\xce\\x84\\xb2\\x18\\x9e\\x32\\x25\\x4b\\x38\\x96\\x01\\xa8\\xca\\x2c\\x43\\xdb\\x76\\x8c\\xd1\\x5c\\xd9\\xf2\\x69\\xae\\x6c\\x98\\xaf\\x6d\\xb3\\x63\\x53\\x31\\xb2\\xb8\\xd4\\x26\\x2b\\x29\\xce\\xc4\\x63\\x2c\\x6e\\x4b\\x2b\\x9f\\xf3\\x07\\xf2\\x5b\\x5a\\x61\\x8c\\x89\\x27\\xf4\\xd6\\x9a\\x1a\\xd9\\x50\\xf8\\xdb\\x4b\\x63\\x90\\x14\\x46\\x8e\\x00\\x70\\xff\\x65\\xb6\\xe1\\x59\\x1a\\xb5\\x6a\\xb7\\x01\\x6a\\x17\\x53\\x62\\x4a\\x62\\x8c\\x1d\\xb5\\x88\\xd3\\x37\\x54\\x6d\\x31\\x15\\xa2\\x48\\x90\\xc3\\xb3\\xc0\\x77\\x67\\xfe\\xc9\\xb5\\xd9\\xca\\x28\\x80\\xec\\xc8\\x9f\\x60\\xb7\\x21\\xdb\\x4f\\xd2\\x6c\\x37\\x52\\x7a\\x54\\x31\\x96\\x92\\xed\\x66\\xea\\x30\\x48\\x19\\xcd\\xc5\\xf2\\x7b\\xa8\\x99\\x9a\\xdf\\x72\\xfa\\x41\\x17\\xb1\\xfe\\xb7\\xde\\xee\\x63\\xc4\\x6a\\xea\\x1b\\x1e\\xfe\\xdb\\x4f\\xc6\\xa0\\xdc\\x47\\x3b\\x29\\x07\\xcd\\x00\\xe2\\x42\\xe4\\x44\\xf0\\xc3\\x95\\x7a\\xac\\xbe\\xc2\\x67\\xd8\\x4d\\x89\\xc0\\x46\\x2d\\x8b\\xde\\x37\\x86\\x2c\\x81\\x62\\x53\\x71\\x44\\xf5\\xc5\\xd3\\x84\\xed\\xa5\\x54\\xb1\\xaa\\x30\\x0e\\x3c\\x73\\xa1\\xf6\\x44\\x65\\x2c\\xa9\\xe0\\x78\\x55\\x7c\\x96\\x48\\xd2\\x81\\x91\\x46\\x0e\\x60\\xc1\\x44\\x06\\x95\\x4c\\x90\\x7a\\x6b\\x4a\\x49\\x2e\\xa8\\x2f\\x4e\\x9b\\xcf\\x18\\x72\\xea\\x49\\x7b\\xa7\\x4c\\x72\\x14\\x7f\\x72\\xdc\\x19\\x6e\\xfe\\x8f\\x7b\\xb8\\x7f\\x36\\x58\\xfe\\x4e\\xed\\xbc\\x87\\x54\\x33\\xa6\\xbf\\x63\\xc7\\xb8\\xbb\\xee\\x21\\x8f\\xe4\\x91\\xfd\\x3d\\xea\\x23\\xc3\\xd9\\x79\\xc8\\xf8\\x97\\x5d\\x7f\\x8f\\xc1\\x2d\\x69\\x92\\xcc\\xab\\xc0\\x0d\\x1e\\x68\\x84\\x77\\x26\\x70\\x14\\x79\\x8c\\xae\\x9e\\x4f\\x54\\xa4\\xd6\\x46\\x35\\xbf\\x90\\x49\\xd5\\xfb\\x6b\\xa5\\x88\\x56\\x45\\x0d\\xa6\\xa6\\xe9\\x30\\x17\\xa9\\x8d\\x81\\x63\\x72\\xae\\x3c\\x4e\\x34\\xdd\\xc8\\xee\\x4e\\x47\\x69\\x94\\x0a\\xcb\\x16\\x29\\x92\\x0e\\xb1\\x9f\\x0e\\x45\\xd3\\xe1\\x51\\x73\\xbe\\xb1\\x5c\\x56\\xb4\\x52\\x73\\x22\\xa1\\x86\\x64\\xad\\xaa\\x36\\x91\\x50\\xc3\\x8a\\x26\\x29\\x89\\xb1\\xac\\x47\\x5a\\xad\\x28\\x2b\\x6a\\x63\\x42\\xf5\\xcb\\x6a\\xf9\\x14\\x1c\\x48\\x05\\xdd\\xbc\\x42\\xc4\\x48\\xa7\\xfe\\x8d\\xac\\x1a\\xe7\\xe5\\x4d\\xc6\\x95\\x34\\xc6\\xd5\\xc3\\xbd\\x07\\xe4\\x4d\\x32\\xd7\\x03\\x80\\x1d\\xaa\\x20\\x08\\x8b\\xf4\\x33\\x3c\\x45\\x5f\\x2b\\xd8\\xd4\\x62\\xf0\\xf7\\x91\\x1c\\x0d\\xa4\\x93\\xce\\x1d\\x7a\\xba\\xb4\\xb3\\x44\\x56\\xd2\\xa2\\xcd\\x1b\\x08\\xe2\\x42\\x57\\xae\\x18\\x0e\\xbd\\x3c\\x05\\x9b\\x12\\x5a\\x42\\x53\\x50\\x2a\\x15\\xe3\\xdc\\x78\\x5a\\x62\\x25\\x61\\x16\\x35\\x90\\x0c\\x39\\x82\\x39\\x39\\x96\\x4e\\x26\\x87\\xea\\x8d\\xfe\\xa3\\x45\\xc1\\xa9\\x72\\x0a\\x51\\x7e\\xc2\\x26\\xcf\\xd3\\xca\\xc2\\xc7\\x8c\\x33\\x2d\\x43\\x9e\\x0e\\x5d\\x9e\\x1a\\x58\\x31\\xb9\\x5e\\x6a\\x0b\\x09\\x53\\xa7\\x0b\\x73\\x98\\x0a\\x13\\xc6\\x4a\\x40\\x16\\x59\\x0b\\x22\\x8b\\xee\\x34\\x15\\x64\\xcc\\xb6\\x53\\x48\\x46\\x8c\\xb9\\xf7\\xf4\\xb2\\xcd\\x1b\\xb5\\x4f\\x98\\x6c\\x2b\\x51\\xb6\\x10\\xb4\\xc0\\x5e\\x5d\\xb6\\xda\\x31\\xb2\\x35\\xf1\\x19\\xb5\\x0a\\xf3\\x8e\\x52\\x7e\\x67\\x95\\xa4\\x1f\\x67\\x31\\x67\\x28\\x2c\\x66\\x52\\x25\\x61\\x32\\x3a\\x10\\xc3\\x2c\\xf6\\x60\\xb4\\xda\\x55\\xbd\\x8e\\x03\\x75\\x8b\\x3c\\x21\\x59\\x39\\x6c\\x53\\xc4\\xaa\\xda\\x26\\xd4\\xaa\\xb3\\x0a\\x0f\\x74\\x27\\xca\\x5f\\x60\\xc0\\xf1\\xa7\\xa1\\x00\\x2b\\x1d\\x37\\xf2\\x6e\\x99\\x9c\\x12\\x4c\\x38\\x9a\\xbf\\xcf\\xf2\\xad\\xf1\\x44\\x54\\xa2\\x8e\\x8b\\x0d\\x71\\x51\\x20\\x00\\xd5\\xb0\\x4b\\x47\\xc6\\x35\\x06\\x19\\x2f\\x9f\\x51\\x4b\\xa2\\x6a\\x30\\x4e\\x2d\\x3a\\x35\\xc4\\xc2\\x45\\x09\\x2e\\xa9\\xa9\\x92\\x52\\x42\\xa1\\x92\\x32\\x6a\\x29\\xdb\\x6c\\xb1\\x88\\x99\\x54\\xb5\\xa5\\x5c\\x8a\\x68\\x41\\x09\\x69\\x75\\xab\\x25\\x16\\x0e\\x1a\\x24\\xb2\\x92\\x12\\x6d\\x2e\\x2f\\x62\\xe2\\x75\\xc9\\x8a\\x1a\\x28\\x80\\x09\\x5d\\xb4\\xc6\\x60\\x40\\x3f\\x99\\x88\\x83\\x99\\x58\\xdf\\xcf\\xf5\\x8a\\x5f\\x11\\x6b\\x01\\xf1\\x53\\xc3\\xc3\\x9f\\x1d\\x18\\xdb\\x29\\xce\\x1f\\x1e\\x06\\x02\\x33\\xe1\\x17\\xfc\\x5f\\x85\\x03\\x60\\x05\\x28\\xb5\\x90\\x4e\\x0b\\x71\\x5b\\x88\\xd9\\x42\\x66\\x92\\xf6\\xec\\x73\\xdf\\x23\\x2d\\xa4\\xe5\\x7b\\xd9\\xe7\\x48\\xfb\\xf7\\xb2\\x2f\\x64\\x5f\\x20\\xbb\\x49\\x0f\\xe9\\x79\\x20\\x7b\\x94\\x74\\x3c\\x90\\x7d\\x26\\xfb\\xcc\\x03\\xa4\\x23\\x7b\\x94\\xae\\x1d\\xf3\\x47\\xbe\\x2d\\xee\\x10\\xdf\\x87\\x72\\xa8\\x81\\x56\\xd8\\xa8\\xf3\\xc4\\xd4\\x1b\\x6c\\x64\\x21\\x3a\\x50\\x62\\xb8\\x82\\x57\\x88\\x19\\xb5\\x02\\x23\\x53\\xe8\\x0a\\xae\\xc5\\x49\\x84\\x31\\xa4\\x39\\x13\\x6a\\xa3\\x7c\\x58\\x12\\xca\\x64\\x3f\\x6e\\xcf\\xd9\\x15\\xad\\x08\\x83\\xe8\\xeb\\x65\\x59\\xd1\\xca\\xdc\\x6c\\x5a\\xf7\\xb5\\x22\\x59\\x2f\\x1e\\xb3\\x18\\x14\\xa4\\x2e\\x77\\x67\\xdc\\xec\\x52\\xbc\\xc4\\x01\\x41\\xa4\\x82\\xe8\\xac\\xe5\\x6a\\xca\\x5c\\x7e\\x42\\xd0\\x83\\x76\\x96\\xfa\\x08\\xc3\\xaf\\x36\\x4a\\xe6\\x53\\xe4\\x96\\x7f\\x63\\xce\\xc0\\xc1\\x4b\\xae\\xfc\\x32\\x45\\x6f\\xcd\\x43\\xf3\\x2e\\x38\\x78\\xeb\\x96\\x4b\\x49\\x75\\x28\\x6c\\x22\\xaf\\xd4\\xad\\x6e\\xfb\\xe1\\xe1\\x7b\\xea\\x37\\xf7\\xff\\xfb\\x13\\x2d\\xcd\\x26\\x1d\\xc5\\x9a\\xf0\\xce\\xc3\\xeb\\xb3\\xcf\\x3e\\x81\\x48\\x36\\x35\\xfe\\xeb\\x9f\\xd7\\x91\\x19\\xda\\xba\\xef\\xf6\\x10\\xbe\\xd1\\x4d\\x71\\xcc\\xb6\\x84\\xab\\x29\\xaa\\x3b\\x9e\\x9c\\x45\\x80\\x67\\x9c\\x50\\xe6\\x06\\xac\\xfe\\x19\\x84\\x5b\\xf4\\x98\\x52\\x83\\xab\\x91\\x9d\\x66\\xca\\xfa\\x8e\\x96\\xa3\\x14\\x53\\x35\\x42\\x78\\x20\\x2e\\x89\\x99\\xa4\\x84\\xb4\\xa4\\x92\\xc9\\x12\\x49\\x56\\xa2\\x79\\x5b\\x49\\x2c\\x58\\x69\\xcb\\xce\\x58\\xbd\\x92\\x4e\\xbb\\x91\\x95\\x6a\\x70\\x1d\\x3a\\x74\\xf2\\x56\\xa9\\x52\\x56\\x34\\xaf\\x2f\\x91\\x50\\xed\\x72\\xca\\xe3\\xd7\\xe7\\x50\\x62\\xa5\\xf0\\x55\\x25\\x58\\xdf\\x9a\\x9c\\x2a\\x0a\\x17\\x84\\xc2\\x7c\\x51\\x6f\\x33\\x36\\x94\\xc9\\x59\\xa3\\xb8\\x01\\x46\\x94\\x62\\xc8\\x1e\\xd2\\x65\\x3f\\x70\\x7a\\xd9\\x8d\\xf5\\xe0\\x7f\\x2f\\xbe\\x5d\\x92\\x95\\x94\\xc7\\xeb\\x0b\\xea\\x15\\x2c\\xfc\\x81\\xc4\\xe7\\x10\\x1f\\x9d\\xe1\\xc2\\xe2\\x93\\x6f\\xb0\\x05\\x64\\x0a\\x00\\x48\\x87\\xb1\\x74\\xe4\\x30\\xe8\\x44\\x0c\\x6a\\xe0\\x6b\\xd3\\xd1\\x7f\\xed\\xff\\x16\\x80\\xba\\x71\\xfa\\x4f\\x7b\\xfc\\xfa\\xb2\\xe3\\x54\\xf4\\x65\\x67\\xda\\x1d\\xc1\\x58\\x78\\x0a\\xa3\\xf1\\x8a\\xb1\\xe6\\x4c\\x05\\xc7\\x22\\x63\\xb5\\xa1\\xeb\\x0d\\xc3\\xa3\\x18\\xf1\\xa0\\xb3\\xea\\x37\\xa7\\xd5\\x2b\\xe8\\xfc\\xea\\x1b\\x9d\\x5f\\x75\\x78\\x46\\x31\\x49\\x79\\xa5\\x4a\\x29\\xa2\\x05\\xa4\\x8c\\x2a\\xc6\\x4e\\x0b\\x50\\xaa\\xda\\x69\\x2f\\x30\\x07\\x07\\x64\\x45\\xf3\\x58\\x3f\\x1f\\x3a\\xcc\\xd5\\x2d\\x0c\\xce\\x8f\\xd0\\xd9\\x9d\\x0a\\x99\\x0b\\x74\\xb7\\x17\\x78\\xc6\\xab\\x85\\x63\\xc5\\xc5\\xf8\\x3f\\xf2\\xf3\\x41\\x47\\x81\\x29\\x62\\xc0\\x08\\x2c\\x89\\xca\\x1d\\xc5\\x13\\xfa\\x29\\xb3\\x42\\xbd\\x7a\\x56\\xe8\\xe3\\x82\\xc9\\x6c\\x29\\xe2\\x3d\\x6c\\x03\\x84\\x94\\xca\\x8a\\x66\\x72\\xe9\\x12\\x16\\x20\\xda\\xb2\\xe0\\x18\\x28\\xc0\\xb6\\x45\\xae\\x1c\\x1d\\x00\\x05\\x59\\xb7\\x48\\x23\\xeb\\xfe\\x1c\\x0c\\x02\\x08\\x9f\\x22\\x57\\x98\\x6f\\x0c\\xab\\x76\\x59\\x1e\\x63\\xb1\\x14\\x4b\\x2b\\x2e\\xe4\\x68\\x56\\xf8\\x4c\\xba\\xc8\\x87\\xb7\\x45\\xa3\\xfb\\x3e\\xa5\\x62\\x46\\xb3\\xb8\\x62\\xb1\\x64\\x29\\xba\\x0f\\xa5\\x12\\xf3\\x4f\\xb9\\xd2\\xfc\\xad\\x8d\\x52\\x46\\x19\\x64\\x67\\x85\\x1b\\x40\\x53\\xf4\\x9d\\x0a\\x1f\\x5d\\x48\\xed\\x09\\x4d\\x18\\xc7\\xaa\\x1d\\x77\\x9a\\x9d\\x58\\xb4\\x41\\x88\\x10\\x67\\x1e\\x51\\xe3\\xe0\\xbd\\xf7\\x92\\x9f\\xdc\\x7b\\xef\\xf1\\x2c\\xa9\\xca\\xfe\\x2e\\x7b\\xfc\\xde\\x7b\\x8f\\x5f\\x75\\xd5\\x55\\x57\\x1d\\x37\\x7c\\xc0\\xbe\\x4f\\x8e\\x3c\\xfb\\xc9\\x0a\\xdf\\xa3\\x1c\\x77\\xed\\x05\\x17\\x7c\\x89\\xe5\\x0b\\xd0\\xfe\\x6c\\x32\\xd5\\x40\\x3d\\xdc\\xac\\xeb\\xac\\x3c\\x6f\\x67\\x47\\xad\\xd1\\xa9\\x5a\\x1a\\x50\\x98\\x7a\\x31\\x93\\xe4\\xea\\x73\\xbe\\x4f\\xbd\\x43\\x0b\\x51\\xab\\xa0\\x28\\xa3\\x5a\\xf4\\x2a\\x2f\\x7e\\x31\\xa3\\xfa\\xb1\\xca\\x4b\\xaa\\xca\\x12\\x92\\x30\\xfc\\x09\\x53\\x64\\xfd\\xf5\\xb2\\x92\\x32\\xb9\\x9c\\x38\\x8c\\x6d\\xb2\\xa6\\x20\\xcf\\x00\\x61\\x8b\\xa5\\x56\\x53\\x4e\\x9d\\x73\\x4b\\x89\\x2b\\x47\\x5e\\xdb\\x56\\xcd\\xce\\x1e\\x9c\\x65\\xc0\\x4e\\x20\\xf4\\xdc\\xb9\\xf6\\x36\\x68\\x6f\\x33\\x0e\\xbe\\xe5\\xba\\x7b\\x08\\xf7\\xfa\\xe1\\x3f\\x5d\\x42\\x22\\xbf\\x7f\\x65\\xc9\\x1d\\x35\\x1d\\xd5\\x5f\\xec\\x5d\\x7c\\x4e\\xf6\\xa5\\x6d\\xcb\\x86\\x16\\xaf\\x79\\xd4\\xc7\\xef\\x7b\\xf3\\xe3\\xa7\\xd5\\x2d\\xff\\x31\\xa7\\x2b\\xfb\\xf6\\x57\\x9e\\x7a\\xd2\\x57\\xf1\\xba\\x2b\\xb8\\xb8\\x7f\\x1e\\x29\\xbe\\xed\\xbc\\x23\\x8b\\xe6\\x9d\\x7b\\xe3\\xa5\\x27\\x1f\\x37\\xe2\\x59\\x85\\x7e\\xf1\\xf7\\x00\\x50\\x0d\\xf5\\xd0\\x06\\xdf\\x82\\x64\\x08\\x98\\xd5\\xc8\\x48\\x60\\x2a\\xf4\\x3d\\xae\\xa4\\x42\\x0c\\x02\\x36\\xf4\\x6f\\x2d\\xc5\\x96\\x48\\x3a\\x26\\x84\\x94\\xe2\\x88\\x16\\xa3\\x16\\x65\\x3b\\xda\\x4e\\x0d\\x22\\xd6\\x2a\\x69\\x70\\x68\\x76\\x4b\\x46\\xb5\\x47\\xe9\\x5d\\x0b\\xa1\\x7e\\xbc\\xe6\\x12\\x33\\x5a\\x07\\x89\\x68\\x0d\\x76\\x59\\xd1\\x6a\\xa8\\x5b\\xd7\\x22\\xa7\\x6d\\x4a\\xa8\\xae\\x9e\\x25\\x9d\\x24\\xab\\xfc\\x33\\xf0\\x64\\xbb\\x82\\xce\\x7f\\xd5\\xfe\\x44\\x42\\x8d\\xc9\\x49\\x17\\x69\\xa3\\xce\\x9e\\x45\\x40\\xb4\\x68\\x97\\x9f\\x06\\x53\\x16\\xae\\x81\\xfc\\x74\\xe9\\xb2\\xbe\\x8a\\xcb\\xe2\\x35\\xd3\\xe1\\xcc\\x12\\xe7\\x9b\\xb2\\x1f\\x7f\\xb6\\xda\\x60\\xce\\x32\\xf0\\x7b\\x0d\\xf1\\x8b\\x42\\x1b\\xdc\\xad\\xe3\\x37\\x63\\x5a\\xf8\\x35\\x31\\xfc\\x9a\\x46\\xf1\\xab\\x61\\xf8\\xd5\\xe4\\xf0\\xab\\x71\\xd0\\x3e\\x94\\x8f\\x5f\\xa4\\x06\\xcd\\xf0\\x50\\x4b\\x6b\\x1b\\x02\\x27\\xa7\\xaa\\xfc\\x31\\x16\\x33\\x3f\\x8a\\x5c\\x13\\x45\\x2e\\xfa\\xf9\\x91\\xcb\\xe3\\x18\\x43\\x77\\x6c\\xba\\x44\\x63\\x41\\x36\\xb3\\x4c\\x83\\x6f\\x8c\\xbf\\x80\\xcd\\x31\\x06\\x76\\x7f\\x45\\xec\\x9a\\xa0\\x0b\\xee\\xd7\\xb1\\x6b\\x9d\\x16\\x76\\x1d\\x0c\\xbb\\x0e\\x8a\\x5d\\x02\\xb1\\x6b\\x66\\xd8\\x35\\xe7\\xb0\\x63\\x95\\x4c\\x0d\\xec\\xba\\x49\\x44\\x6b\\xce\\xf5\\xbd\\x36\\x99\\x62\\x58\\x37\\xa3\\x51\\xcf\\x78\\xaa\\xf2\\xd7\\x47\\xc6\\x61\\xd8\\x41\\x31\\xec\\xfa\\x3b\\x7a\\x5f\\x6e\\x7f\\x6d\\xba\\x3d\\xf0\\x06\\x63\\x2d\\xee\\x98\\x4e\\x27\\x14\\xce\\xd4\\x8f\\xe4\\x97\\x8d\\xeb\\x87\\x26\\x27\\x62\\xd9\\x05\\x83\\xf0\\x1b\\x1d\\xcb\\xde\\x69\\x61\\xd9\\xcf\\xb0\\xec\\x17\\x32\\x6a\\x0c\\x4f\\xcb\\x52\\xed\\x91\\x98\\x14\\xd1\\x66\\x50\\x70\\xe7\\x20\\xb8\\x09\\x06\\x6e\\x22\\x07\\x6e\\xc2\\x91\\xae\\x61\\x6e\\x62\\x0d\\x7d\\xa3\\xcd\\xce\\x21\\x9d\\x8a\\xba\\x66\\x4b\\x58\\x4e\\x96\\x7e\\xdb\\x1c\\x4d\\x47\\x47\\x6b\\xd6\\xcc\\xae\\x91\\x95\\xb4\\x12\\x8a\\xb4\\x77\\x55\\xbb\\x13\\x5a\\x33\\x91\\x15\\xad\\x2a\\x36\\x76\\xd0\\xf7\\x53\\xd8\\x07\\xf3\\x60\\x57\\x15\\x59\\x2d\\x49\\x68\\x91\\x98\\xac\\xa8\\x35\\xd3\\x56\\x42\\xa1\\xc3\\xfd\\xe9\\xea\\x63\\xf7\\x38\\x6f\\xd4\\x39\\x2d\\xb5\\x5c\\x9d\\xef\\x97\\x2e\\x35\\x74\\x23\\xea\\xfd\\xfc\\x59\\xd4\\xcd\\x0c\\x88\\x43\\x27\\x3c\\xa7\\x6b\\xa7\\x71\\x5a\\xda\\x69\\x65\\xda\\x69\\xc5\\x35\\x49\\x6d\\x8b\\x53\\x07\\x5f\\x6d\\x8f\\x11\\xb5\\x2b\\xaa\\xd6\\x1c\\xd3\\x66\\x48\\x19\\x75\\x86\\x43\\xad\\xa7\\x6b\\x10\\x63\\x72\\xa4\\x8b\\x15\\x55\\x56\\x7d\\x4e\\x59\\x33\\x1c\\x5a\\x34\\xa7\\x1f\\xb5\\x8d\\xfe\\x68\\xa7\\x94\\xc1\\xc0\\xad\\x19\\x35\\xb2\\xa2\\xd9\\x42\\x38\\x24\\x92\\x16\\xa5\\x31\\x91\\x48\\xa8\\x9d\\x8a\\x56\\xe5\\x1f\\xab\\x95\\x56\\xaa\\x95\\xf8\\x04\\xad\\x4c\\x7b\\x48\\x50\\xf7\\x37\\x87\\x3e\\xf5\\x7d\\xa7\\xd6\\xc0\\x46\\x62\\x5d\\x96\\x03\\xbd\\x8b\\x58\\xa7\\x04\\x7e\\xfd\\xf0\\xf0\\x67\\x3d\\xfa\\xec\\x72\\x13\\xb5\\xca\\x74\\xcc\\x4d\\x67\\x22\\xe6\\x2d\\xd0\\x03\\xf3\\xe0\\x35\\x1d\\xf3\\xb6\\x69\\x61\\x9e\\x60\\x98\\x27\\x84\\x0c\\xed\\xc0\\xb3\\x59\\x44\\xc2\\xdc\\x68\\x7a\\x86\\x1e\\x91\\x30\\x1f\\x07\\x45\\x2b\\xc3\\xb9\\xd5\\xc0\\x39\\x55\\xd3\\x4a\\xa4\\x48\\xba\\x97\\xf5\\xfc\\x56\\x87\\xd6\\x39\\x0a\\xfa\\x40\\xe0\\x98\\x9c\\x8e\\xb0\\x91\\xb0\\x80\\x44\\xb4\\x5e\\xbb\\x81\\xfb\\x80\\x9c\\xb6\\x28\\xcd\\x6d\\xc8\\xa0\\x11\\x99\\x88\\x7c\\x82\\x22\\xdf\\x33\\x71\\x3c\\xcc\\x9d\\x2d\\x2b\\xa9\\x9a\\xc8\\x3c\\x96\\x1e\\x35\\x2d\\x35\\x8c\\x09\\x6b\\x18\\x55\\x47\\x7e\\x72\\xe6\\x69\\x26\\xfc\\x80\\x11\\xe8\\xc0\\x1b\\xda\\xd9\\x61\\x04\\x3b\\x4c\\xa9\\xa2\\x8f\\x8c\\xd0\\x87\\x11\\xa6\\x27\\xc1\\x63\\x84\\x3f\\xf0\\xb0\\x60\\xe4\\x5d\\xd3\\x43\\xc2\\x52\\x68\\x86\\x04\\x0c\\xc0\\x0f\\x20\\x59\\x0b\\x10\\x51\\x1b\\xe3\\x9a\\x9f\\xcf\\xe0\\xbd\\x16\\xe3\\x33\\x49\\x07\\x61\\x74\\xe2\\x12\\x9f\\x51\\xfb\\x62\\xe9\\x9e\\xca\\x5a\\x47\\x71\\x44\\xed\\x88\\x6b\\x3d\\x42\\x06\\x99\\xa3\\x07\\x71\\x5b\\x22\\x2a\\x66\\xd4\\xa8\\x83\\x2e\\x94\\xaa\\x10\\xd3\\xaa\\xc4\\x8c\\xda\\x8d\\xc5\\x06\\x7a\\x49\\x44\\x2b\\x2f\\xca\\x68\\x73\\x48\\x44\\x8b\\xe6\\x12\\xaa\\x3a\\xe4\\xa4\\xd5\\x81\\x5d\\xbe\\x4a\\xd1\\x4a\\xeb\\x13\\x09\\xb5\\x57\\x4e\\x55\\xba\\xd8\\xce\\x45\\xb9\\xa2\\x85\\xc2\\x54\\x17\\x3d\\xb5\\xb2\\x92\\x84\\x50\\x7d\\x1e\\xcb\\xba\\xea\\x50\\x18\\xb7\\x60\\x5e\\x86\\x55\\x0d\\x96\\xe5\\x64\\xf4\\x50\\xe3\\xa9\\x06\\x6b\\x27\\x2c\\xaf\\x39\\xee\\xc1\\x05\\xd9\\xbf\\x1e\\x3e\\x6b\\xe1\\x99\\xab\\xb3\\x6f\\x73\\x26\\x18\\x79\\x69\\xc3\\x43\\x3d\\x33\\xff\\xf5\\xe2\\x97\\x4e\\x9c\\xba\\x8c\\x13\\xae\\xbe\\x7a\\xf5\\xd5\\x4b\\x97\\xcc\\x3a\\x76\\xcd\\xfe\\x67\\x07\\x7b\\x9f\\xbb\\xf5\\x27\\xbf\\x24\\xd5\\xcb\\xcf\\xea\\xbe\\xa6\\x26\\x75\\xd1\\x56\\x4e\\xe3\\xc8\\x25\\x67\\x2f\\xbf\\x60\\x0d\\x99\\xf9\\xcd\\xef\\xf7\\x2c\\x3b\\x7f\\x51\\x97\\x62\\x3a\\xf8\\x64\\x67\\x5b\\x5b\\x67\\xf6\\x93\\x37\\xef\\x33\\xed\\xb8\\x61\\x46\\xfd\\x0f\\x5b\\x16\\x9c\\xb9\\x78\\xce\\xaa\\xc3\\x77\\xf5\\xcc\\x9d\\xd9\\xa0\\xae\\x24\\xb2\\x58\\xb5\\x66\\xfb\\x55\\xcc\\x67\\x19\\xcc\\xc6\\x91\\x17\\x13\\xc0\\x0f\\x51\\xf8\\x32\\xab\\xc3\\x94\\x0e\\xe6\\xc7\\x4f\\x10\\x23\\xc1\\x1a\\xc9\\x12\\xec\\x45\\xd4\\xea\\xc5\\x8a\\x65\\x98\\x58\\x3c\\x1a\\x4a\\xd1\\x44\\x22\\x5a\\xad\\xc4\\x4a\\x1b\\x36\\x29\\xb2\\x92\\x0a\\x04\\xeb\\x1b\\x28\\x7e\\xb5\\xf2\\xe3\\x45\\xa2\\xdd\\xe9\\xf5\\x84\\x59\\x65\\x75\\x6f\\x03\\xfd\\x32\\x8c\\xbb\\x87\\x9a\\x3d\\x28\\x2b\\x29\\xbf\\xd3\\x83\\x27\\xde\\xa3\\x41\\x13\\x93\\x31\\x6b\\xba\\x4c\\xe1\\xd0\\x84\\x98\\x89\\xc2\\x34\\x9b\\x42\\xf6\\xa9\\x13\\xd9\\x4f\\x49\\x7e\\x58\\x7a\\x41\\xce\\xcd\\x07\\x8e\\x93\\x58\\x76\\xd5\\x98\\x58\\x09\\x81\\x71\\x51\\x8a\\xef\\x00\\x80\\x1b\\xbd\\xfe\\x95\\x7a\\x05\\x48\\x7b\\x6e\\xe7\\x90\\xc2\\x12\\xe6\\x33\\x69\\x5f\\x91\\x93\\xfa\\x3b\\x3e\\x3d\\xc0\\xd8\\x8f\\xc1\\x35\\x49\\x3f\\xfa\\xb5\\x7e\\x62\\xb8\\xf2\\x7e\\x59\\xd1\\x64\\x3c\\xba\\xb0\\x3b\\xb1\\x78\\x98\\x5a\\x24\\xb3\\x68\\x34\\x2a\\xab\\x7b\\x22\\x25\\x25\\x33\\x5d\\x47\\x79\\x29\\x2d\\xaf\\x4f\\x24\\xa5\\xbc\\x0c\\x0d\\xd6\\x95\\x79\\xcc\\x94\\xa4\\x8b\\x8c\\xa5\\xa6\\x14\\x8e\\x9a\\xb2\\x1f\\x9f\\x7a\\x54\\xe7\\xa7\\x34\\xe4\\x7a\\x3d\\x27\\xd7\\xf9\\xff\\x7b\\xb9\\x52\\xb2\\xa2\\x1f\\xc9\\x4f\\x53\\x34\\x16\\x34\\x39\\xb5\\x68\\xa4\\x9e\\x19\\x92\\x6f\\x4f\\x25\\x1c\\xff\\x63\\x34\\x21\\x4f\\x3d\\xae\\x8b\\x97\\x93\\xef\\x43\\x94\\x2f\\x00\\xf5\\x93\\xc8\\x57\\xc7\\x67\\xd2\\x21\\x26\\x5f\\x48\\x60\\xae\\x5d\\x98\\xc9\\x17\\x46\\xf9\\xc2\\x54\\x3e\\xea\\xb2\\x49\\x61\\x94\\xaf\\xca\\xfb\\x79\\xe4\\x1b\\xb5\\xfb\\xa6\\x96\\xf1\\x12\\xc3\\xda\\x73\\x4c\\x29\\xe4\\x7f\\x33\\x2b\\xef\\xd4\\xfd\\x4c\\x4a\\x51\\x97\\xf1\\x28\\xca\\x58\\x89\\xb6\\xc4\\xed\\x05\\xa5\\x0c\\xf1\\x99\\xb4\\x97\\x49\\xe9\\x15\\x32\\xaa\\x27\\xaa\\xd6\\xc4\\xf1\\xc8\\xa6\\x36\\x86\\x31\\x97\\x9e\\x63\\xc8\\xd0\\x51\\xc9\\xd8\\xf4\\xa8\\xf9\\xe0\\xa3\\x06\\x01\\x85\\xc1\\x87\\x30\\xf8\\x88\\x1e\\x73\\x59\\xe9\\x91\\x95\\xc3\\x45\\x36\\x6b\\x35\\x0b\\xc3\\xa8\\x91\\x93\\x76\\x67\\x88\\xae\\x44\\xd2\\x8c\\x5c\\xbf\\x2e\\xb2\\x33\\x4e\\xcf\\x90\\x57\\x56\\xd4\\xea\\x29\\xe1\\x09\\x3a\\x73\\xc8\\xb0\\xdd\\xef\\x42\\xe8\\x2c\\x21\\xd6\\x06\\x03\\x17\\x89\\x58\\x0b\\x63\\xf3\\xce\\xf0\\xf0\\xa9\\xdb\\x10\\x17\\xae\\x78\\x78\\x18\\xb3\\xa5\\x81\\x3b\\x24\\xfe\\x01\\xf7\\xff\\x4b\\xe0\\x42\\x23\\x83\\x8e\\x9d\\xed\\x23\\x34\\x06\\x6b\\x23\\x26\\xba\\xd8\\x8f\\xe5\\xf8\\x9c\\xec\\xc6\\x91\\x64\\xd2\\x8e\\x07\\x95\\x76\\x93\\x45\\x3f\\x8a\\xc6\\x3c\\x18\\x0b\\x5d\\xa6\\x79\\x31\\xc7\\x5e\\x6c\\x29\\x61\\x1b\\x2f\\x38\\x4c\\x73\\x5c\\x88\\x66\\x1c\\x91\\xbf\\x64\\x24\\x97\\xe2\\x9b\\xa6\\xec\\xc7\\xd9\\xef\\xe7\\x78\\x2e\\xe9\\x7c\\x3b\\x04\\xc0\\x3d\\x2e\\xbe\\x81\\x75\\x3e\\x4b\\xe0\\x0b\\x90\\x34\\xd3\\xf6\\x49\\x02\\xcb\\xeb\\xc3\\x3d\\x22\\xc2\\xf6\\x1d\\xb0\\x7d\\x16\\x46\\xe4\\x24\\x60\\x8b\\x04\\x93\\x25\\x92\\xb4\\x60\\xe6\\x82\\x85\\x58\\xf4\\x30\\x04\\x6c\\x1c\\x16\\xad\\xb2\\x95\\xe0\\x76\\x82\\x24\\x2b\\x9a\\x60\\x31\\x76\\x85\\xf4\\x76\\xf1\\x74\\xc8\\x0d\\xb1\\x66\\xe9\\x23\\x2b\\x9f\\x80\\xf3\\x12\\x7d\\xb7\\x93\\x1f\\x39\\x09\\xc0\\x1d\\x17\\x3f\\xc2\\xd8\\x83\\x52\\x58\\xa3\\xd7\\xf9\\x96\\xb1\\x36\\x14\\x8b\\x3d\\xb0\\x12\\x16\\xbb\\x81\\x15\\x9f\\x15\\x8c\\x58\\x4f\\x16\\xa3\\xc1\\x54\\x5c\\x62\\x89\\x24\\x15\\xa4\\x1a\\x56\\x8a\\x68\\xfb\\x14\\x07\\x2b\\xf7\\xac\\x15\\x2b\\x79\\x81\\x07\\x5a\\x91\\x8c\\xb5\\x39\\xf2\\x03\\x10\\x46\\xd9\\x24\\x45\\x63\\x50\\xfc\\x42\\x6f\\xae\\xf0\\x2e\\xeb\\xff\\x27\\x9d\\x79\\x2d\\xa6\\x63\\x7d\\xe4\\x38\\x00\\xf7\\xaa\\xf8\\x1c\\xc6\\x1f\\xd8\\x41\\x81\\x2b\\x74\\x2e\\x40\\x1b\\x52\\x72\\x8e\\x56\\x67\\xd5\\x44\\x4c\\x70\\x52\\x4b\\x58\\xf0\\x81\\x23\\x86\\x59\\x5c\\xc5\\xfa\\xfe\\x6c\\xb1\\x11\\x65\\x92\\x2c\\xc6\\x4e\\x5f\\x2c\\xd2\\xa6\\x17\\x5b\\x2d\\x91\\x14\\x2f\\x15\\x4b\\x11\\x0d\\x24\\x64\\x7d\\xe5\\xa5\\x4c\\xaa\\x04\\x3f\\x50\\xa4\\x0c\\xcb\\xe9\\x12\\x6d\\x3a\\x0d\\x10\\x86\\x22\\x8c\\xca\\x40\\x7b\\x78\\x98\\x58\\xff\\xa0\\x4b\\xf0\\x67\\x62\\x15\\x46\\x86\\x87\\x4f\\x92\\x7c\\xc8\\xbf\\xc6\\xe2\\x10\\x7a\\x47\\xde\\x15\\xae\\x16\\xff\\x04\\x01\\x68\\x82\\x15\\x3a\\xcb\\x49\\x35\\x9f\\x51\\x23\\x48\\x5f\\x43\\xd4\\x66\\x34\\x66\\xb0\\x82\\x23\\x4b\\x0a\\xaf\\x14\\x33\\xd4\\x84\\xd7\\xea\\x82\\xb2\\x92\\xe6\\x6d\\xe6\\x32\\x1f\\xc6\\x3e\\xcb\\x9a\\x13\\x89\\x5b\\x22\\xd5\\xac\\xae\\x36\\x2f\\x6b\\x26\\xb3\\x91\\x6c\\x16\\x73\\xb9\\x3b\\x9b\\x49\\x9d\\xb9\\x8e\\xfe\\xdb\\xe9\\x23\\xee\\x4e\\xb7\\x7e\\xbe\\x92\\x47\\x7c\\x88\\x0b\\x6d\\x2f\\xb1\\xbd\\xb3\\xe8\\xa6\\x98\\x50\\xb6\\xb4\\xfd\\x9d\\xa5\\x3f\\x0e\\x2f\\xa8\\x59\\x7d\\xf6\\xbd\\x73\\x5e\\x58\\xa2\\x6d\\xdb\\x9b\\x7d\\xe6\\xdd\\xf7\\xb3\\x2f\\x91\\xf0\\xcd\\xbb\\x2e\\xbd\\x39\\xb4\\x7f\\xe5\\x15\\x37\\x90\\x97\\xde\\x24\\x72\\x63\\x9d\\xb0\\xe8\\x4b\\xed\\xfb\\x76\\x6e\\x2e\\xf5\\x17\\xff\\xda\\x39\\xd4\\xba\\x67\\xe7\\x45\\x97\\x66\\x9f\\x79\\x6a\\x71\\xf6\\xa3\\xec\\x0f\\x48\\xf9\\x0b\\xdb\\xef\\xfe\\xd5\\x77\\x96\\xce\\x68\\xbb\\x8f\\xd9\\x1a\\xc8\\x55\\x89\\xbe\\xa9\\x0f\\x62\\xf0\\x3f\\x8c\\x5d\\x58\\x2d\\x46\\xea\\x8d\\xa4\\xad\\xa4\\x3c\\x16\\xcb\\x1f\\xa2\\x65\\x7c\\x26\\x37\\x16\\xd4\\xc6\\xa8\\x56\\x23\\x64\\x52\\xd1\\x9a\\x46\\x49\\x9f\\xb2\\xe3\\x51\\xd5\\x8b\\x15\\x97\\x93\\x1e\\x4c\\x53\\xf1\\x54\\x58\\x22\\x49\\x2f\\xe6\\x53\\x78\\x2b\\x2d\\x91\\x94\\xdf\\xe3\\x95\\x72\\xc9\\xd3\\x1e\\x87\\xe6\\x20\\x11\\x75\\x46\\x8c\\x55\\xcd\\xc2\\x18\\x0d\\x6b\\xb1\\x25\\x92\\x74\\x60\\xd5\\x2c\\x87\\x1d\\x03\\x5f\\xd3\\xf5\\xcc\\x2a\\x6f\\x23\\x11\\xcd\\xe3\\x95\\x95\\x94\\xc0\\x87\\xa2\\xd5\\x48\\x8d\\x96\\x32\\x97\\xd5\\x34\\x62\\xe7\\x2d\\xab\\x92\\x15\\xcd\\xea\\x65\\xc9\\x89\\x42\\x42\\x6b\\xe4\\x64\\x45\\x8d\\x21\\x87\\xa8\\x5f\\x1f\\x73\\x53\\x10\\x5e\\x16\\xf2\\x46\\x0b\\x93\\x60\\x8e\\x0f\\x34\\x9f\\x8a\\x14\\x93\\x3c\\x34\\x36\\x0c\\x01\\x04\\xc6\\x91\\x89\\xf3\\xa0\\x1d\\xb9\\xdc\\x17\\xea\\x33\\xa1\\x7b\\xcc\\x0a\\xe1\\x1b\\x8d\\x43\\xc8\\x2b\\x2a\\x64\\x1c\\xde\\x97\\x51\\xaf\\xbc\\xc4\\x81\\x91\\xf6\\x29\\x9b\\x2c\\x2a\\x2c\\x6c\\x48\\xb7\\xce\\x0c\\xe2\\xcc\\xbc\\x3d\\xb6\\x82\\xec\\x99\\xf7\\xe2\\x94\\x78\\xd3\\x24\\x14\\x9a\\xc2\\xcf\\xa8\\x7d\\xd2\\x96\\x47\\xa4\\x69\\xb4\\xfd\\x8d\\x5c\\xec\\xc1\\xf2\\x09\\x67\\xf5\\x64\\x7a\\x31\\x14\\x36\\x51\\x3f\\x3d\\xb2\\x18\\xa7\\x47\\xf9\\x47\\xf5\\x93\\xb3\\x7f\\xe2\\x8e\\xd7\\x24\\x14\\xa0\\x11\\x3d\\xf8\\x60\\x32\\x26\\x50\\xee\\x51\\x7d\\x2e\\x35\\xe4\\xf8\\x08\\xe5\\x70\\x43\\x4d\\x4e\\x8e\\xca\\xf1\\xab\\xb4\\x11\\x73\\xe0\\x19\\x2d\\x1b\\x6e\\xc4\\x1c\\x78\\x72\\x3a\\xf0\\xc9\\x69\\x9b\\xac\\x38\\x45\\x94\\x47\\x67\\x38\\x9f\\xa8\\x8c\\xb1\\x5b\\x4e\\x05\\x15\\x72\\xd0\\x98\\x61\\xfb\\x26\\xd1\\x09\\xff\\x73\\xdd\\xe2\\xa8\\xcb\\xe7\\x37\\xd5\\xe5\\x31\\xb9\\x73\\x71\\x06\\xfb\\x26\\xc4\\x19\\x90\\x49\\xe2\\x0c\\x54\\x4f\\x34\\x2f\\xd4\\x40\\x0d\\x3b\\xd2\\x25\\x6c\\x60\\x96\\x44\\xd5\\x30\\x06\\x17\\xa8\\x1e\\x64\\x56\\xd4\\x23\\x0e\\x30\\xcc\\xa0\\x3e\\x2c\\x2b\\x8f\\xd9\\x14\\xb1\\xca\\x3f\\x36\\xce\\x40\\x53\\xfc\\x48\\xbc\\x34\\x51\\xf8\\x49\\xb7\\x7a\\x0a\\xe2\\x70\\xcd\\xb8\\x11\\x66\\x9d\\x0c\\x8e\\x4f\\xf2\\x46\\xd7\\xa9\\xda\\x7c\\x4c\\x44\\x5d\\xc7\\xcf\\xe5\\xc5\\x18\\xec\\x9e\\x10\\x63\\x40\\xa6\\x8e\\x31\\x50\\x4b\\x1d\\xaa\\x42\\x0d\\xaf\\x12\\x09\\xb9\\xae\\xc7\\x06\\x1b\\xa8\\x41\\x2c\\x28\\x6f\\x1c\\x70\\xd1\\x85\\xd4\\x26\\x16\\x08\\x32\\x18\\xdb\\x0b\\x8c\\x5d\\x16\\x43\\x70\\x6a\\x66\\x8d\\x11\\x7e\\x17\\xb1\\xae\\x32\\xe4\\x25\\x03\\xc4\\x3a\\x5e\\xe6\\xdf\\x0e\\x0f\\x9f\\x2a\\x1d\\xed\\xd4\\x2f\\x1b\\x67\\x5c\\x5d\\xf0\\x80\\xd0\\x2b\\x3c\\x86\\x96\\x96\\x15\\x9a\\x41\\x2f\\x03\\x6e\\x14\\x05\\x97\\xa2\\x2c\\xcb\\xc0\\x16\\x55\\x85\\x63\\xaa\\x84\\xa5\\xde\\xd5\\x22\\xa3\\x54\\xa5\\x51\\x21\\x9c\\xbe\\xba\\x04\\xe1\\xd4\\x56\\x52\\x9d\\x7d\\x95\\x54\\x73\\x33\\xdf\\x7a\\x2b\\xbb\\x31\\x93\\xe1\\xeb\\x33\\x19\\xfa\\x7f\\x2c\\x1e\\xd9\\x2d\\x2c\\x10\\x9e\\xd6\\x63\\x0f\\xd6\\xe7\\xc7\\x1e\\x90\\xcf\\x13\\x7b\\x60\\x96\\xcb\\x04\\x23\\xf6\\x40\\x95\\x26\\x44\\x1e\\xb4\\x8c\\x8d\\x3c\\xd0\\xd7\\xc9\\x38\\x63\\xba\\x00\\x56\\x84\\xa2\\x13\\xb9\\x81\\xfc\\x84\\xd5\\xb3\\x66\\x91\\x07\\x1d\\xac\\x3a\\xd8\\x62\\x52\\xf2\\xe7\\xa6\\x15\\xf5\\x83\\xf7\\x5f\\xb4\\x7e\\x6b\\xf6\\x2f\\xef\\xb7\\x5f\\x18\\x59\\x78\\xff\\x96\\x35\\x17\\x91\\xea\\x62\\xbb\\x78\\xca\\x11\\x92\\x77\\x6d\\xba\\x4e\\x69\\xaa\\xd8\\xb9\\xb9\\xac\\xd4\\xc4\\xc0\\x2d\\xb6\\xde\\xfc\\xec\\xfc\\xbf\\xdc\\x49\\x01\\x76\\x94\\x7c\\xfd\\xf8\\xfc\\xcc\\x57\\x3b\\x57\\xfb\\x09\\x27\\x08\\xa6\\xc7\\x0e\\x66\\x1f\\xb3\\x58\\xd2\\x5f\\x73\\xce\\xfa\\x62\\x35\\xf0\\x8c\\xef\\x13\\xe7\\x6e\\x3a\\xfb\\xdd\\xa0\\x9f\\xae\\x4a\\x46\\x4d\\x68\\xc5\\xd8\\xaf\\xa2\\xab\\xa3\\x6a\\x67\\xe1\\x7c\\xc5\\xb9\\xa0\\x03\\x51\\xcc\\x24\\x2b\\xc5\\xdc\\x49\\xb3\\xc8\\x78\\x0d\\x65\\xba\\xee\\xc9\\xc6\\xba\\x87\\x53\\xa4\\x98\\x3b\\x5e\\xb6\\xe6\\xc2\\x0b\\x54\\x0a\\x90\\x93\\xce\\x94\\x4a\\x29\\xc3\\x51\\xca\\xf9\\x3a\\x93\\x13\\x80\\xe2\\x12\\x50\\x98\\x05\\x74\\x1d\\xce\\xfe\\x93\\x71\\x81\\x72\\x97\\x19\\x71\\x06\\x4c\\xe6\\x37\\x74\\x99\\x6f\\xfd\\xff\\x29\\xb3\\xea\\xa5\\x12\\x27\\x3d\\x3e\\x2c\\xc9\\x22\\x2b\\xa9\\x32\\xa7\\x3f\\x80\\xe3\\x69\\x8c\\xcc\\x2a\\xc9\\xad\\x14\\x93\\x4b\\x8e\\xae\\x6c\\x61\\xc9\\x89\\x3b\\x67\\x67\\x17\\x94\\xdd\\x30\\xba\\x0d\\xd9\\x3f\\xd2\\xe3\\x0b\\x6e\\x9e\\xb6\\xec\\xb5\\xd3\\x97\\xbd\\x6e\\x9c\\xbe\\x47\\xc3\\x09\\x50\\xfe\\x60\\x68\\xa2\\xfc\\xa7\\xd3\\xb9\\xb1\\xd2\\x14\\x96\\x7e\\xa5\\xb1\\xc8\\x4c\\x2a\\xfe\\xb5\\x7a\\x48\\x81\\xa0\\xcb\\xff\\x5c\\x2e\\x9e\\xe0\\xc1\\x69\\x22\\x50\\x30\\xa8\\x60\\x02\\x1c\\x6a\\x80\\x4e\\xa0\\x5e\\x29\\xa3\\x7a\\xa3\\x2c\\xba\\xa0\\x10\\x42\\xaa\\xd5\\x31\\x6e\\xa6\\x0d\\xc8\\x8a\\x26\\x79\\xb0\\xd0\\xde\\xb8\\x21\\x41\\xa6\\x05\\x0f\\x0b\\x2b\\x28\\x8c\\x4e\\x37\\x86\\x15\\x4c\\x0a\\xcd\\xd7\\x46\\x63\\x0a\\x90\\x83\\x55\\xfc\\x25\\xda\\xcc\\x61\\xe8\\x02\\x06\\x81\\x55\\x0f\\x21\\x40\\x9a\\x5c\\x55\\x89\\x32\\x63\\xa8\\x3a\\x4a\\x1d\\x79\\xdd\\xc8\\xc1\\x76\\x26\\x25\\xbb\\x2f\\x91\\x17\\x20\\x30\\x09\\x15\\x2b\\x0b\\x14\\x98\\x9a\\x8f\\x95\\xf8\\x73\\xdd\\x79\\x72\\x5e\\x56\\xb2\\xc4\\x88\\x1b\\x08\\x65\\x2f\\x14\\x6e\\x33\\x79\\xd0\\xee\\xb9\\xa5\\x00\\x17\\xfa\\x28\\x05\\x7a\\x8e\\x08\\x22\\xc7\\x84\\xae\\x71\\x9e\\x58\\x21\\x2e\\x74\\xe4\\x6c\\x2c\\xc4\\x88\\xee\\xa3\\xf3\\x3a\\xab\\x2c\\x34\\x81\\x09\\x3d\\xc4\\xd2\\xa6\\x41\\x56\\xdd\\x79\\x75\\x34\\xa6\\xe6\\x43\\x0f\\x91\\xa7\\xa3\\x5f\\x3a\\x7b\\x12\\x3a\\x74\\x71\\x93\\x7a\\x4a\\xeb\\x9b\\x3b\\x9e\\x0f\\xdd\\x54\\x75\\xf2\\xf5\\x31\\x7c\\xe8\\x82\\xae\\xbb\\x27\\x51\\x77\\x21\\xa8\\x85\\x2b\\x21\\x19\\xe0\\x20\\xa2\\x56\\xe3\\x8e\\xb6\\x1a\\x8e\\x4d\\xa5\\xcc\\x3a\\xdc\\x72\\x0b\\x49\\x19\\x35\\xe4\\xc0\\xa9\\xab\\x56\\xca\\x68\\x33\\x48\\x44\\x0b\\xf9\\x65\\x25\\xa5\\xb8\\xca\\xd1\\x10\\x0c\\xcb\\x8f\\x09\\x66\\xa9\\xc8\\xca\\xe3\\xbe\\x4c\\xad\\xa2\\x5a\\x12\\x7f\\x87\\xfe\\x89\\xd1\\x5b\\xa7\\xee\\x02\\x03\\x46\\xaf\\x9d\\xa2\\x03\\x5c\\x86\\x5d\\x97\\x83\\x8d\\x23\\xef\\x9a\\x0f\\x8a\\xcf\\x40\\x25\\xd4\\xc3\\x77\\x74\\x16\\x19\\x99\\xcf\\x20\\x81\\x03\\xee\\xe7\\xd3\\x4f\\xd2\\xa5\\x2c\\x2b\\xc6\\xac\\x97\\xbf\\xc4\\x9b\\x74\\x11\\xfb\\x10\\xe3\\x0c\\x6b\\xf9\\x4c\\xba\\xd8\\x51\\x2e\\x14\\x23\\x0b\\x92\\x41\\x3f\\x5e\\x25\\x66\\xd4\\x2a\\x16\\x78\\x21\\x33\\x06\\x41\\x19\\x89\\x66\\xd4\\xd2\\x98\\x66\\x31\\x67\\xd4\\xb2\\x18\\x6e\\xde\\x85\\xa8\\xab\\x56\\x2e\\xd0\\x49\\x5e\\x56\\x5d\\x48\\xd0\\xa9\\xa0\\x2f\\x60\\xc7\\x9d\\x12\\xd9\\x85\\x04\\x3e\\x9a\\xb9\\x08\\x59\\xb1\\x5a\\x5a\\x4b\\x65\\x16\\x7d\\x38\\x2e\\x19\\x46\\x2f\\x97\\x9a\\x4f\\x1c\\xbf\\x91\\x2c\\x23\\xf6\\xb9\\xb7\\x2d\\xe3\\x1f\\xca\\xcf\\x8d\\xf9\\xec\\x9c\\xd5\\xfb\\x07\\xb3\\x27\\xb2\\x8f\\x92\\xf0\\x43\\xb7\\x77\\xef\\xee\\xea\\xd9\\x9d\\xb8\\xfd\\x41\\xae\\x8f\\xb4\\x10\\x0b\\x59\\x6c\\xb3\\xe4\\x25\\xcb\\x14\\x59\\xc9\\x62\\x62\\x79\\xec\\xc7\\x16\\x0b\\xff\\x57\\xc9\\xfa\\xd4\\x61\\x36\\xd6\\x57\\x8f\\xbc\\x6b\\xfa\\x48\\x58\\x8a\\xb6\\x75\\x02\\x7b\\x0b\\xf5\\x8f\\x2b\\xd8\\x39\\x5f\\x69\\x0c\\xad\\x1f\\xb5\\x28\\x8e\\x16\\x76\\x67\\x2c\\x1d\\x2b\\x09\\x08\\x46\\xd0\\x45\\x37\\xe2\\xc2\\x6c\\x6b\\x34\\x83\\x8a\\x8b\\x32\\x5a\\x0f\\x89\\x68\\xf1\\xb0\\xac\\xf4\\x59\\x84\\xa2\\x92\\xd2\\x8a\\x80\\xa3\\xbe\\x55\\x27\\x57\\x70\\xe1\\x5e\\x41\\x2d\\x9d\\xe2\\xdc\\x5e\\x56\\xc3\\xc1\\x95\\xd0\\x84\\x26\\x9d\\x9a\\xd7\\x30\\x86\\x26\\x3f\\xc0\\x18\\xe7\\x30\\xd5\\x18\\xdb\\x79\\xab\\x49\\xc9\\x9f\\x77\\xff\\x68\\xb0\\x4f\\xdb\\xf2\\x9b\\x13\\xa7\\xae\\xe0\\xa4\\x6b\\xb7\\xad\\xdd\\xb7\\xe8\\x8c\\x81\\x63\\xd7\\x5d\\xfa\\xd4\\xe0\\xc0\\x8f\\xf6\\x8c\\x2d\\xa6\\xf0\\x3e\\x47\\x36\\x9e\\xbb\\xf2\\xcc\\x35\\xcc\\x3c\\x5a\\x32\\x34\\x6f\\x71\\xfe\\xee\\xde\\xe2\\xf9\\xf3\\x17\\xe7\\x3b\\x56\\xeb\\x73\\x7b\\xd8\\x2c\\xce\\xaa\\x18\\xe3\\xac\\x2a\\xc0\\x07\\x0f\\x4f\\x37\\xd2\\x4a\\xad\\x8c\\x6b\\x1e\\xea\\x9e\\xb0\\xf2\\xd4\\x53\\xc5\\x5c\\xa5\\x2a\\x4a\\xca\\xa4\\x88\\xe6\\x96\\x32\\xaa\\x3b\\x8a\\x69\\x55\\x7c\\x2c\\xe9\\xc6\\x4c\\x74\\x37\\xb1\\x44\\x52\\x95\\xf8\\xb5\\x4f\\xca\\x30\\xb6\\x66\\x37\\xd2\\x7a\\x6a\\x95\\x15\\xb2\\x92\\x32\\x99\\x2d\\x45\\xd5\\xee\\x84\\xe6\\x2b\\x91\\x99\\xd9\\x79\\xda\\x40\\xad\\xdc\\xf8\\x2b\\x10\\xab\\xf5\\x2f\\xb9\\x08\\xb4\\xc2\\x91\\x5a\\x67\\x1b\\x6b\\x05\\x81\\xf3\\x84\\xdf\\xf1\\xbd\\xe2\\xfb\\x20\\x41\\x10\\x54\\x88\\xaa\\x62\\x3c\\xcd\\xe9\\x24\\x50\\x96\\x28\\x1d\\x1f\\xa0\\x71\\x90\\x53\\xb1\\xbe\\x7c\\x9f\\x67\\x2c\\xd4\\xc2\\xef\\x46\\x63\\xfc\\x08\\x6c\\x11\\x9e\\xe7\\x57\\x89\\x7f\\x83\\x52\\x58\\x06\\x58\\xac\\x4a\\xc8\\xa4\\x1c\\xa6\\x62\\x09\\x6b\\xf3\\xe1\\xd6\\x1f\\x1c\\x4b\\x97\\x32\\x27\\xae\\x14\\x73\\x3c\\xd2\\x45\\xcc\\x75\\x43\\x2f\\x9c\\x4a\\xcc\\xe3\\x84\\xec\\x28\\xc6\\x0d\\x29\\x8d\\x37\\x21\\x87\\x8c\\x41\\x91\\x36\\xd6\\x4b\\xdb\\x32\\xce\\x15\\x13\\x3e\\x19\\xbb\\xa1\\x41\\xf2\\x78\\xfb\\xd0\\xbb\\xb9\\x8e\\x6b\\x33\\xb8\\xf8\\xfe\\xde\\xef\\x38\\xb8\\x8f\\x5b\\x25\\xfc\\x86\\x9f\\x89\\xfb\\x87\\xfe\\x09\\x5c\\x80\\x05\\x38\\x00\\xef\\x13\\x66\\x9e\\x3c\\xca\\xad\\xfa\\x9d\\x5e\\xe7\\x78\\x1f\\xb7\\x4a\\x7c\\xec\\xf3\\xfc\\xfe\\x3e\\xb1\\xe3\\xd3\\x0f\\x8c\\xdf\\x27\\x70\\x21\\xff\\x17\\xf2\\x1d\\x53\\x17\\x58\\xa0\\x06\\xb9\\x9c\\x04\\x1e\\xcc\\x02\\x16\\x50\\xa4\\x83\\xd9\\x22\\x65\\xd0\\x4e\\xb1\\xb0\\x47\\xe8\\x34\\x45\\x8c\\xfd\\xfb\\xc2\\xcd\\x4b\\x0f\\xce\\xa8\\xe7\\xff\\xf2\\xd3\\x8b\\x5f\\x9d\\xb7\\x74\\xe8\\x8e\\x2f\\xfc\\x14\\x9f\\xd7\\xc3\\xbf\\x48\\xf6\\x63\\x9d\\x9f\\x1a\\x50\\x2d\\xf8\\x3c\\x49\\x7f\\x1e\\xcf\\x08\\x9d\\xe8\\xf3\\x90\\xbb\\xdc\\x82\\xcf\\x9b\\x45\\x66\\x92\\xb8\\xb3\\xcc\\x64\\xee\\xa9\\x6b\\xf8\\xe8\\x92\\xc5\\x42\\x70\\xee\\x1d\\x6b\\x9e\\x7e\\x7a\\xdd\\xf1\\x21\\xd6\\xbe\\xc1\\xec\\x53\\xe4\\x16\\xe2\\xcf\\x7f\\x9e\\x79\\xaa\\xe7\\x21\\xa3\\x77\\xdc\\x5c\\x66\\x32\\x0f\\xd6\\x35\\x7c\\x4c\\x2e\\x59\\xfc\\xd1\\xd0\\x1d\\xab\\x8f\\xbf\\x7a\\x31\\x7b\\x1e\\x0f\\xeb\\xf9\\xbf\\x70\\xa7\\x50\\xde\\x22\\x28\\x83\\x85\\xd8\\x47\\xad\\x71\\xfd\\xb1\\x48\\xb5\\xeb\\x34\\x24\\x57\\x2d\\xcc\\x48\\xd3\\xb3\\xbd\\x0c\\x10\\x54\\xab\\xac\\x8a\\x48\\x7a\\x59\\x92\\x00\\x4d\\x00\\xa3\\x4b\\xe5\\x80\\x09\\x07\\x73\\xb7\\xeb\\x11\\xa3\\x8f\\xc9\\x99\\xe3\\xb1\\xca\\x03\\x8d\\x87\\x05\\xfc\\x8b\\xdc\\x5b\\x26\\x0f\\xee\\xc7\\x97\\xc1\\x00\\x50\\xe1\\xca\\xe2\\x69\\x11\\xa1\\x33\\xda\\x24\\x1c\\xd3\\xcc\\x52\\x46\\x35\\xb3\\x98\\x54\\x59\\x6f\\x93\\x59\\x60\\xac\\x48\\x76\\x59\\xb5\\x52\\x3b\\x5a\\x2d\\x63\\x4a\\xca\\xa1\\xda\\x99\\xbb\\x5b\\x80\\xf8\\xfe\\x0c\\xff\\xe5\\x5f\\x5c\\x66\\xc0\\xbc\\x2c\\x1f\\x6f\\x8e\\xe2\\xcd\\xfd\\x06\\xf1\\x2e\\xa5\\x2d\\xb1\\x44\\xd5\\xd2\\x1c\\x3a\\xf6\\x18\\x0e\\x3a\\x86\\xbb\\x6a\\x62\\xb5\\x85\\x1d\\x52\\x06\\x87\\x9b\\xae\\x02\\xb5\\x58\\xa6\\xed\\xc1\\x13\\xe9\\x31\\xea\\xe8\\x1c\\xaf\\x98\\x9f\\x8e\\xd3\\xcf\\xd2\\x3c\\x45\\x11\\xd8\\x4b\\xde\\xe5\\x56\\x08\\x45\\x50\\x4c\\xfd\\x7b\\xab\\xd1\\x8f\\x72\\xdd\\xc9\\x8e\\x63\\x5f\\xb2\\x41\\xb9\\x10\\xd1\\x2f\\x58\\xf2\\x6b\\x3c\\x8f\\xd6\\xde\\xfd\\x5b\\xb6\\xed\\xdf\\xbf\\x75\\xeb\\x7e\\x6e\\xf8\\xbc\\x75\\xfb\\xae\\x5d\\x7f\\xde\\xfa\\xab\\xd9\\x19\\xdd\\xcd\\x00\\xe2\\x39\\x84\\x31\\x84\\x4a\\x60\\x83\\x33\\xf4\\xb8\\x52\\xd1\\x12\\x8f\\xeb\\x4c\\x66\\x9a\\xa9\\x48\\xdf\\x0c\\xd6\\x3f\\xc0\\xdd\\x7c\\xa2\\x16\\x1b\\xfc\\x66\\x2a\\xef\\xd0\\x44\\x56\\xd8\\x47\\x95\\x58\\x8e\\x99\\x4d\\xcc\\x50\\xfd\\xe0\\xa6\\x58\\x50\\xae\\x27\\x72\\x50\\xa6\\x37\\x37\\x93\\x70\\xf6\\x38\\x79\\x85\\x84\\x1f\\x21\\x61\\x02\\x23\\x60\\xbc\\x58\\x1f\\x6f\\x84\\xaf\\x93\\x11\\xe4\\xec\\x0a\\x02\\x51\\xcd\\x28\\x9a\\x88\\x32\\xa9\\x7c\\x4c\\x93\\xa8\\xdb\\x94\\x37\\xfe\\x90\\xb8\\xb4\\x91\\x31\\x96\\x72\\xde\\x7c\\x9e\\xd2\\x79\\xf0\\x75\\xae\\x62\\xec\\x73\\x54\\x2e\\xa6\\x3f\\x6a\\xf4\\x39\\x84\\x3e\\x47\\x27\\x06\\x9b\\x37\\x81\\x06\\x0c\\x08\\x74\\x8f\\xbc\\xcb\\xbf\\x21\\x3e\\x03\\x11\\xb8\\x0e\\x92\\x75\\xc0\\x6a\\xe6\\xb0\\x2c\\x4a\\x99\\xcf\\xa4\\x81\\xd4\\x15\\x15\\x47\\xd4\\xf2\\x78\\x1a\\x04\\x68\\x17\\x22\\x6a\\x65\\x2c\\x2d\\x0a\\xf8\\x99\\x3b\\x9e\\x16\\xd9\\x67\\xce\\x18\\xf2\\xc9\\x36\\x1c\\xd3\\x38\\x53\\x2c\\xa6\\x79\\xc5\\x8c\\x56\\x46\\x2d\\x6a\\x6f\\x83\\xb1\\x3b\\xae\\xba\\x62\\xc9\\x06\\xdc\\x36\\x6f\\x60\\x09\\x7c\\x5a\\x13\\x56\\xbb\\x08\\xa0\\x25\\xa4\\xc9\\x22\\xc6\\xdc\\xb2\\xba\\x82\\xe1\\xf6\\xb8\\x6e\\x0e\\x18\\xb5\\x05\\x83\\x3a\\x5b\\x75\\x5e\\x39\\x13\\x98\\x49\\xba\\x0f\\x1d\\x3a\\x44\\x9a\\x3e\\xec\\xdd\\x3d\\xc7\\xd9\\xbe\\xb3\\xeb\\xb2\\x1b\\xc9\\xf7\\xb3\\x2b\\xe8\\xeb\\xc6\\xbd\\xdd\\xdb\\xe3\\xce\\xc4\\x95\\xb3\\x3e\\xca\\xbe\\x48\\xde\\xbe\\xeb\\xce\\xbb\\x8a\\xdf\\x27\\x5e\\x47\\xc9\\xdb\\x8e\\xd2\\xfb\\x6e\\x29\\xb9\\xeb\\xce\\xbb\\xa4\\xeb\\x6f\\x93\\xe5\\xb7\\x4a\\x1c\\xc4\\xfe\\x3b\\x89\\x8d\\x83\\xc5\\xfc\\xd7\\x84\\x65\\xa2\\x0a\\x66\\x70\\xc3\\x21\\x9d\\x63\\x9a\\x14\\xc7\\xe3\\x69\\x09\\x7b\\x60\\x52\\x2c\\x29\\x8d\\xc5\\x62\\xf8\\xb9\\xf1\\x11\\xde\\x83\\xa0\\x57\\xd2\\x45\\xf2\\x4e\\xd3\\xb1\\xb4\\xc8\\x08\\x64\\x44\\x24\\xa0\\x14\\x79\\x4b\\x24\\x69\\x42\\xcf\\xd0\\x04\\xcc\\x51\\x96\\x72\\xf4\\x21\\xaa\\x1b\\x4f\\x08\\xf4\\x6d\\x49\\xdc\\x7b\\x73\\xb8\\x65\\x45\\x2b\\xc2\\x35\\x0c\\x24\\x59\\x49\\x59\\x6d\\x8a\\x33\\x57\\x05\\x24\\x2c\\x87\\x65\\x22\\x63\\x25\\x10\\x39\\x2c\\xd7\\xf1\\x61\\xde\\x2c\\x2f\\x26\\xb7\\xed\\x3b\\x48\\xce\\xfd\\xe6\\xe5\\xa6\\xbd\\x77\\xef\\x37\\x6d\\x5e\\xb0\\xcd\\x24\\xce\\xdb\\xbc\\x39\\xbb\\x94\\x24\\xb3\\x8b\\x39\\x6f\\xf6\\x4e\\x72\\xc9\\xa9\\xb7\\x48\\x05\\xc9\\xbe\\x4d\\x1a\\x48\\xf6\\x57\\x40\\xd0\\x49\\xe8\\x12\\xba\\x80\\x87\\x76\\xc8\\xf5\\x75\\xb3\\x1e\\x77\\xa1\\xdf\\xe7\\xca\\x31\\x20\\xe1\\xa0\\x7e\\xd1\\x89\\xfd\\x5a\\xe5\\xa0\\x4c\\x1f\\x70\\xf2\\x08\\xeb\\xcb\\x21\\x00\\x51\\x31\\x35\\x41\\x10\\xbe\\xcd\\x4e\\x92\\x54\\x67\\x5c\\xf3\\x0b\\x99\\x64\\x99\\xbb\\x8a\\x02\\x96\\x5f\\x82\\xb2\\x7c\\xb4\\x04\\x65\\x28\\xaa\\x06\\x30\\x85\\xb5\\x92\\xf1\\x9b\\x57\\x62\\x1d\\xb5\\x4a\\xaf\\x25\\x92\\x0c\\x60\\xf2\\x42\\x80\\xc2\\x55\\x89\\x19\\x61\\x2c\\xcd\\x18\\x4f\\x59\\x4a\\x9d\\x96\\x48\\xd2\\x83\\x31\\xdc\\x1e\\x97\\xbe\\xbd\\xe2\\xa9\\x94\\x15\\x2c\\x49\\xa5\\x96\\xca\\x7a\\xb6\\x0f\\xf8\\x65\\x3a\\x1f\\x9d\\xbe\\x62\\x65\\xae\\x48\\xbb\\x7e\\x0d\\x7d\\xfb\\x6f\\x6f\\x2e\\xfd\\xc6\\xba\\x86\\x05\\x97\\x2f\\x59\\xbf\\x9e\\x3b\\x78\\xcf\\xa9\\xf4\\x81\\xec\\xed\\x07\\x4e\\xa5\\xee\\xe5\\xb7\\xfe\\x7c\\xe1\\xf0\\x71\\xbf\\xf7\\xf7\\x2e\\xcf\\xea\\x55\\x0b\\xf5\\x03\\xb5\\x6f\\xe5\\x8a\\x58\\x62\\x9d\\x17\\xf1\\x0b\\xa6\\x26\\x08\\x51\\xcf\\x23\\x2f\\xe7\\x35\\xe9\\x28\\x0d\\x52\\x1c\\x44\\x8a\\x43\\x55\\x1c\\x8b\\x0a\\xfa\\x62\\xaa\\x27\\xca\\x82\\xd5\\xc3\\x51\\x95\\x3b\\xa6\\x9a\\x18\\x2b\\x79\\x65\\x2c\\x19\\xc0\\x68\\xf5\\x40\\x88\\x7a\\x9d\\x01\\x9f\\x25\\x92\\xe4\\x02\\x79\\xa5\\x03\\x04\\x56\\x66\\xae\\xcc\\xa0\\xb7\\x2c\\x18\\xb8\\x5f\\x4d\\x97\\xb0\\x00\\x0a\\xce\\x72\\x56\\xb5\\x92\\xb2\\x44\\x42\\xf3\\x88\\xcc\\x41\\x2b\\x62\\x69\\xf9\\x2c\\xda\\x1b\\xc7\\x19\\xc6\\x0d\\x19\\x15\\xab\\xc6\\x94\\xf2\\xac\\xbb\\xf7\\xa6\\x9b\\x88\\xe9\\xfd\\x73\\x1e\\xda\\xfe\\xfd\\x03\\xa7\\xfe\\xcf\\x81\\xce\\x2d\\xb3\\x77\\xee\\xfa\\xe0\\x83\\x03\\x54\\xe4\\x9f\\x47\\x5f\\x79\\xd7\\xef\\xfd\\xf4\\x55\\x2c\\xbe\\x77\\x81\\xcd\\xbe\\x63\\x6b\\x14\\x6b\\x7a\\xd2\\x19\\xb6\\x07\\x40\\xb2\\x99\\x9a\\x70\\x6f\\x65\\x16\\xe1\\x18\\x83\\x9e\\x16\\xeb\\x8e\\xc7\\xb5\\x0a\\x21\\x93\\x76\\xb7\\xb6\\x25\\x7a\\xab\\xdd\\x79\\x47\\xcf\\x49\\xc5\\xd7\\x1c\\x8f\\xe3\\x49\\x69\\xb2\\xcc\\xdb\\x41\\x0d\\xe7\\x06\\xba\\x4c\\x6b\\x61\\xac\\x89\\x44\\xfd\\x0b\\x3b\\x45\\x6b\\x36\\x16\\x2d\\xe1\\x59\\x4c\\x9b\\x1c\\x4b\\xba\\x2a\\x8d\\xd2\\x09\\xa9\\x3e\\x97\\xc7\\x12\\x49\\x56\\xba\\x72\\x99\\x1d\\x7d\\x95\\xe5\\x74\\xce\\x71\\x68\\x33\\x49\\x44\\xf5\\xc7\\xb4\\x2e\\x31\\xa3\\x36\\xc5\\x92\\x5d\\x33\\xe9\\x4f\\x74\\x75\\x5b\\x22\\xc9\\x99\\x5d\\xf4\\x76\\xa6\\xd7\\x12\\x51\\xbb\\x1c\\x58\\x9d\\xaf\\x45\\xcc\\x24\\x5b\\xda\\xe9\\xa7\\x2d\\x31\\x4b\\x24\\xd9\\xde\\x42\\x6f\\xdb\\xe3\\x96\\x88\\xd6\\x47\\x22\\xda\\x4c\\x97\\xac\\x24\\xcd\\x45\\x18\\x0d\\xd7\\xde\\x25\\x2b\\x5a\\x43\\x18\\xe3\\xc8\\xb5\\xba\\x5a\\x3c\\x04\\xaf\\x90\\x15\\xb5\\x25\\xa1\\x35\\x94\\x23\\xff\\x93\\x16\\xc6\\x2a\\x61\\xb5\\x46\\x32\\xc8\\xa4\\xb5\\x52\\x83\\xa7\\xed\\x95\\x05\\xaa\\xa9\\x72\\x7d\\x53\\xf4\\xd4\\x42\\x75\\x56\\xa7\\xec\\xbe\\x20\\xa0\\xce\\xd6\\xea\\x3a\\xeb\\x82\\x01\\x62\\xd5\\xb5\\xd6\\x36\\xcb\\xd0\\x5a\\xbc\\x63\\x66\\xdf\\x14\\x5a\\x6b\\xa1\\x5a\\xb3\\x47\\xd5\\xba\\xb8\\x66\\xc6\\x8d\\x06\\xda\\xc1\\xb5\\xda\\xee\\x58\\x4c\\x2d\\x72\\x68\\x09\\x6a\\xc0\\x0f\\xfe\\x3d\\xea\\xeb\\x64\\xea\\x8b\\x31\\xf5\\xc5\\x3a\\x8b\\xf4\\x82\\x8c\\xa9\\xbe\\x58\\x9b\\x25\\x92\\xec\\xc4\\x62\\x8d\\x9d\\x5e\\xfa\\x41\\x67\\xbb\\x25\\xa2\\xc6\\x1c\\x5a\\x3f\\x89\\x68\\xbd\\x62\\x26\\xd9\\xdb\\x4f\\xbf\\xeb\\x9d\\x65\\x89\\x24\\xfb\\x7b\\xe9\\x6d\\x7f\\x82\\xfe\\x58\\xff\\x6c\\x4b\\x04\\x43\\xf1\\x3a\\x5d\\x3a\\xd7\\xa2\\xd6\\x1f\\x93\\x15\\x2d\\x9c\\x53\\xa3\\xd6\\xdb\\x9f\\x48\\x68\\x45\\x54\\x91\\x03\\x9f\\x5f\\x7d\\xa3\\xdf\\x91\\xf6\\xa9\\x54\\xb8\\xaa\\xc0\\x67\\xb3\\x58\\x5d\\xcb\\xc9\\x94\\x58\\xe8\\x43\\x72\\x32\\xbf\\x06\\x26\\x9d\\x93\\xe1\\x55\\xae\\xee\\xdf\\x2f\\x28\\xe9\\xfd\\x08\\xfc\\xb8\\xba\\xc1\\x2f\\xae\\xbd\\xf7\\x79\\xe3\\x3a\\x72\\x24\\x1b\\x97\\xd6\\x9a\\xef\\x00\\x02\\x12\\x70\\x00\\xba\\x4d\\x02\\xd2\\x45\\xa7\\x76\\x01\\x48\\xfb\\x47\\x8e\\x8c\\x1c\\x95\\xd6\\xb2\\x95\\x22\\xef\\xcf\\x7b\\xdc\\x7b\\x30\\x87\\x3e\\x8d\\x7c\\x0c\\x00\\xbf\\xd5\\x7f\\xed\\x63\\x00\\x72\\x12\\x2e\\xe7\\xed\\xf0\\x15\\xe1\\x11\\xa8\\x13\\x96\\x43\\x42\\xbc\\x03\\x5a\\x85\\x2c\\x34\\x91\\x9f\\xc2\\xad\\xdc\\x0f\\x60\\x15\\x77\\x04\\x66\\xf2\\x87\\x20\\x24\\x2c\\x84\\x56\\xf2\\x7f\\xa1\\x9b\\x8f\\xc2\\x75\\x5c\\x11\\xec\\xe7\\xde\\x1b\\xc9\\x08\\x87\\x60\\x2d\\x7f\\x33\\xcc\\x12\\xb6\\x40\\x4c\\x58\\x09\\x09\\xe1\\x4b\\x50\\x2d\\xcc\\x81\\x41\\x61\\x2f\\x9c\\x2f\\x2c\\x87\\x56\\xe1\\x7c\\x18\\x14\\x2e\\x85\\xd9\\xe4\\xbf\\xe0\\x7c\\xf2\\x0c\\x54\\xf1\\x1f\\x42\\xb7\\x70\\x31\\x5c\\x25\\x98\\x61\\x13\\xff\\x0a\\x84\\xcc\\x76\\x18\\x14\\x9f\\x86\\x7a\\x71\\x21\\x74\\x89\\x51\\x68\\x13\\xaf\\x83\\x2e\\xb1\\x0a\\xba\\x84\\xbf\\x40\\x97\\xb8\\x00\\xa2\\xa6\\x7e\\xe8\\xe2\\x9e\\x85\\x4e\\xe1\\x21\\x08\\x8b\\x3f\\x84\\x2e\\x41\\x85\\x2e\\xf3\\xcd\\xd0\\x65\\x6a\\x86\\x2e\\xf1\\x21\\x18\\x14\\x9b\\xa0\\x4b\\xfc\\x2e\\x0c\\x8a\\xfb\\xa0\\x4b\\xf8\\x35\\xac\\x15\\xd7\\xc2\\x0c\\x93\\x15\\xea\\xc4\\x27\\x21\\x64\\x4e\\x83\\x57\\xbc\\x0f\\x82\\xe2\\x65\\x50\\x2d\\x1c\\x85\\x85\\xdc\\x00\\xdc\\xca\\x9f\\x03\\x36\\x2e\\x01\\x56\\x7e\\x0f\\x34\\x09\\x43\\xb0\\x9a\\xdb\\x06\\x7d\\xc2\\x7a\\x58\\x28\\xfc\\xcb\\xc8\\x1f\\x85\\x4e\\x18\\x14\\x9e\\x84\\x41\\x61\\x10\\x06\\xb9\\x4f\\xa1\\x47\\x38\\x04\\x67\\x8a\\x2e\\x08\\x70\\xb7\\x43\\x1d\\x77\\xee\\xc8\\xeb\\xc2\\x6f\\x21\\xc0\\x1d\\x80\\x80\\x79\\x27\\x78\\xc5\\x32\\x08\\x08\\x57\\xc3\\x6c\\xe1\\x65\\xa8\\x17\\xbe\\x04\\x83\\xfc\\x1a\\x18\\x12\\x7c\\xb0\\x96\\xfb\\x0c\\x1a\\x85\\x2c\\x04\\x85\\x7f\\x06\\xbf\\xe9\\x12\\xa8\\x13\\xbe\\x03\\x01\\xe1\\x49\\xa8\\x10\\x9a\\x61\\x25\\x77\\x1b\\xd4\\x91\\xef\\xc3\\xf5\\xdc\\xad\\x60\\x15\\x23\\xb0\\x8e\\x62\\xcf\\xd9\\xe0\\x4b\\xc2\\x1c\\x38\\x43\\xb8\\x0b\\x12\\xe2\\x37\\xe0\\x2c\\xf1\\x0a\\xa8\\xe7\\x08\\x7c\\x59\\xf8\\x0d\\x9c\\x2d\\x98\\xe1\\xa0\\xc9\\x07\\x0b\\xf9\\x8b\\x61\\x0d\\xff\\xef\\x20\\x08\\x0b\\x61\\x17\\xc5\\x1e\\x3f\\xfb\\x00\\x0e\\x71\\x19\\xb8\\x44\\x70\\xc0\\x00\\xdf\\x09\\xeb\\xf9\\x7e\\x58\\xc9\\x5d\\x0f\\x67\\x89\\x83\\xd0\\x29\\x6c\\x84\\x0e\\xae\\x1e\\xbe\\x4a\\x3e\\x84\\xe5\\x9c\\x07\\x36\\xf0\\x87\\x60\\x2b\\xff\\x73\\xe8\\x13\\x6f\\x80\\x4b\\x45\\x0d\\x36\\x98\\x2e\\x86\\x05\\xbc\\x06\\x4d\\x88\\x7b\\x81\\x97\\x79\\x04\\x06\\x50\\x17\\x55\\x4c\\x17\\xc6\\x8b\\x7b\\x76\\xe4\\x04\\xd5\\x05\\xf7\\xec\\xc8\\xef\\xb9\\x67\\x47\\x8e\\x88\\xdf\\x86\\xe6\\x9c\\x1e\\xc6\\xbd\\x84\\x46\\x98\\x29\\xee\\x85\\xf9\\x54\\x17\\xf9\\x2f\\xaa\\x0b\\xb1\\x02\\x06\\xc5\\x7a\\xa8\\x43\\xdc\\x0b\\xbc\\x4c\\x9f\\xc0\\x02\\xd4\\xc5\\xe0\\xd8\\x17\\xf7\\x08\\x98\\xb9\\x47\\x60\\x88\\x7b\\x64\\xe4\\x24\\xf7\\xc8\\xc8\\x71\\xe1\\xa7\\xd0\\x9b\\xd3\\xc3\\xf8\\xd7\\x56\\xe8\\x12\\xee\\x86\\xc5\\xa8\\x8b\\xfc\\x17\\xd5\\xc5\\x6b\\x10\\xa2\\x57\\xf3\\x30\\x6c\\x34\\x2f\\x87\\xd5\\xb4\\x4d\\xfc\\x95\\x70\\x1e\\xff\\x18\\x6c\\xe1\\x8f\\x02\\x98\\xef\\x00\\x30\\xae\\xdc\\x8d\\x00\\xe4\\x6d\\x00\\x32\\xc8\\x5e\\x70\\x02\\x80\\x5c\\x0f\\x00\\x5f\\x04\\xa0\\xba\\x30\\x5e\\xe2\\x6a\\xb8\\xcf\\xd4\\x03\\xfb\\xc8\\x1b\\x70\\x21\\xf9\\x15\\xf4\\x90\\x2c\\x0c\\xf2\\xfd\\xb0\\x9e\\x9f\\x0f\\x0b\\xf8\\x1e\\x18\\xe4\\x9e\\x86\\xbd\\xe2\\x61\\xb8\\x99\\xfe\\x2e\\xd7\\x0d\\x8d\\x5c\\x1f\\xcc\\xa3\\xcf\\x15\\xea\\xa0\\x5b\\xf8\\x15\\x2c\\x16\\xba\\x00\\xc4\\x04\\x84\\xc4\\x03\\x50\\x27\\xc5\\xa1\\x47\\xda\\x4f\\xe7\\x73\\x68\\xcc\\xfb\\xbb\\x1a\\x0e\\x92\\x2b\\x39\\x81\\x7b\\x80\\x9f\\xc3\\x6f\\xe2\\xef\\xe4\\x7f\\xc6\\x7f\\x20\\xb4\\x09\\xab\\x85\\xbd\\xc2\\xbd\\x42\\x5a\\x14\\xc4\\x3e\\xf1\\x09\\x53\\x87\\xe9\\x2b\\xa6\\x13\\xe6\\x2d\\xe6\\xc7\\xa4\\x39\\xd2\\x13\\xd2\\xfb\\x96\\x5a\\x4b\\xaf\\x65\\x8d\\x65\\x97\\xe5\\xd7\\x45\\xf7\\x17\\xfd\\xd1\\xba\\xc9\\x7a\\xd4\\xe6\\xb3\\x1d\\xb4\\x9d\\x28\\xbe\\xa8\\xf8\\x4d\\x7b\\x95\\x7d\\xaf\\xfd\\x0f\\x25\\xb3\\x4a\\x8e\\x38\\x3a\\x1c\\x37\\x39\\x3e\\x90\\x57\\xc8\\x6f\\x2a\\xab\\x95\\x64\\x69\\x55\\xe9\\x39\\xa5\\xff\\x59\\x56\\x5d\\x76\\x75\\xd9\\x8b\\x4e\\x70\\x7a\\x9c\\x0b\\x9d\\x5b\\x9c\\x5f\\x76\\x3e\\xe8\\x8a\\xb9\\xee\\x73\\x7d\\xe2\\xde\\xe1\\x7e\\xd1\\x13\\xf3\\x3c\\x52\\x3e\\xa3\\x7c\\x47\\xf9\\x0f\\x2b\\xaa\\x2a\\xce\\xa9\\x2c\\xaa\\xbc\\xbe\\xf2\\x85\\xaa\\x33\\xaa\\x8e\\x7a\\xab\\xbd\\x0f\\x7a\\x3f\\xf3\\x6d\\xf0\\x7d\\xcb\\xf7\\x7b\\x7f\\x97\\xff\\x26\\xff\\x1b\\x81\\x86\\xc0\\xfc\\xc0\\xc1\\xc0\\x1b\\x81\\x37\\x82\\x45\\xc1\\xbd\\xa1\\xa2\\xd0\\xed\\xe1\\x8a\\xf0\\x40\\xf8\\xe3\\xea\\xea\\xea\\x63\\x35\\x2b\\x6b\\xae\\xac\\xb9\\xbf\\xe6\\x3f\\x6b\\x6f\\xaa\\x7d\\xa0\\xf6\\x44\\x5d\\x5f\\xdd\\xa1\\x19\\xf6\\x19\\x6d\\x33\\x1e\\xae\\xe7\\xea\\xab\\xeb\\xd7\\xd4\\x5f\\x5f\\xff\\x42\\xfd\\x87\\x0d\\x7b\\x23\\xb6\\xc8\\xcb\\x8d\\xb3\\x1a\\x6f\\x6f\\x7c\\xaf\\x69\\xa8\\xe9\\xb5\\xe6\\x95\\xcd\\x27\\xa2\\xb7\\xb4\\x04\\x5a\\x1e\\x6c\\x6d\\x6e\\x7d\\x32\\xb6\\x22\\xf6\\x40\\xec\\xc3\\xf8\\xfc\\xf8\\x83\\x6d\\x9e\\xb6\\x17\\xdb\\x3b\\xda\\xef\\xeb\\xb0\\x75\\x7c\\xa3\\xb3\\xac\\xb3\\xa3\\xf3\\xc9\\xae\\xee\\xae\\x27\\x13\\x73\\x12\\x2f\\x74\\x77\\x77\\x7f\\xbf\\xa7\\xb9\\xe7\\xf9\\xde\\x2d\\x33\\x95\\x99\\x6f\\xcc\\xba\\x7b\\xf6\\x8e\\xbe\\x86\\xbe\\xc7\\xfa\\x43\\xfd\\x87\\x06\\x84\\x81\\x43\\x03\\x6f\\x0e\\xc6\\x06\\x6f\\x1a\\xfc\\xe3\\x9c\\x0b\\xe7\\xba\\xe6\\xee\\x99\\xfb\\xf2\\x50\\xdf\\xd0\\xd1\\x79\\x03\\xf3\\xf6\\xcc\\xfb\\x70\\xfe\\xb6\\xf9\\xef\\x2d\\xd8\\xb2\\xe0\\xd3\\x85\\xe7\\x2c\\x7c\\x79\\xd1\\x39\\x8b\\x3e\\x58\\x7c\\xfd\\x12\\xc7\\x92\\x8e\\x25\\xd7\\x4c\\xf2\\xf7\\x2b\\x4b\\xee\\x5e\\xf2\\xd0\\x92\\x23\\x4b\\xfe\\xb0\\xd4\\xb1\\xb4\\x6b\\xe9\\x85\\x4b\\x1f\\x5e\\xfa\\xc1\\xb2\\xb6\\x65\\xeb\\x96\\x3d\\xbc\\xec\\xe1\\x65\\xcf\\x2f\\x3b\\xb1\\xec\\xc4\\x19\\x7b\\xce\\xf8\\xc3\\x99\\x8e\\x33\\x6f\\x3f\\xab\\xe2\\xac\\x0f\\x97\\xbf\\xcc\\xe6\\x6b\\x78\\x0f\\xe6\\x83\\x08\\xcc\\x7b\\x21\\xc0\\x81\\x8b\\x7e\\x4c\\x36\\xe8\\xf3\\xb5\\x02\\xaf\\x01\\x0f\\x44\\xb0\\x00\\xc0\\x2c\\xdc\\x09\\xa1\\xf7\\x04\\x5c\\x30\\x4b\\xbf\\xe7\\x40\\x82\\x15\\xfa\\x3d\\x0f\\xcd\\xb0\\x5a\\xbf\\x17\\x20\\x00\\xb7\\xe8\\xf7\\x22\\x3c\\x04\\x0f\\xeb\\xf7\\x26\\xf0\\x91\\xb3\\xf4\\x7b\\x33\\x2c\\x24\\x3b\\xf4\\x7b\\x0b\\xd8\\xc8\\x13\\xfa\\xbd\\x15\\xca\\xc8\\x7f\\xea\\xf7\\x36\\xa8\\x25\\xbf\\xd6\\xef\\x8b\\x61\\x35\\x67\\xb4\\xc1\\x0e\\x2b\\x38\\xe3\\xff\\x72\\x80\\x8b\\x53\\xf5\\x7b\\x19\\x24\\xce\\xf8\\x5d\\x05\\x02\\xdc\\xf3\\xfa\\xfd\\x11\\x70\\x71\\xef\\xeb\\xf7\\xcf\\x42\\x0b\\x2f\\xc0\\x10\\x6c\\x87\\x6d\\xb0\\x07\\x02\\xb0\\x0e\\xd6\\xc2\\x1e\\x58\\x0b\\x01\\xb8\\x18\\xb6\\xc3\\x0e\\xb8\\x02\\x76\\xc1\\x66\\xd8\\x08\\x9b\\xf0\\xdb\\x79\\xb0\\x1d\\xb6\\xc3\\x46\\xd8\\x02\\xeb\\x21\\x00\\x31\\x68\\x81\\x56\\x88\\xc3\\x59\\xb0\\x1d\\x2e\\x82\\xed\\xb0\\x07\\xb6\\x43\\x00\\x96\\xc3\\x16\\x58\\x0b\\x17\\xc1\\x00\\x6c\\x87\\x2d\\xb0\\x6e\\xcc\\xef\\x74\\x4f\\xf2\\xb3\\xdd\\xa7\\x79\\x56\\x20\\xf7\\xb4\\x73\\x60\\x3d\\xec\\x82\\xdd\\xb0\\x19\\x5b\\x1c\\x80\\x56\\x68\\x86\\x56\\x68\\x81\\x16\\x88\\x41\\x07\\xc4\\xa1\\x27\\xaf\\x5d\\xf4\\x7e\\x0f\\xec\\x81\\x0d\\xb0\\x16\\x2e\\xc5\\x27\\x6e\\x82\\xcd\\xba\\x9c\\x33\\xe0\\x32\\x68\\xc1\\x1c\\x85\\x36\\x68\\xc6\\xdf\\x68\\x82\\x56\\xb8\\x18\\x3a\\xa1\\x0d\\xea\\x31\\x8e\\x6f\\x0b\\x04\\xa0\\x0b\\xef\\x76\\xe1\\xff\\x13\\xc3\\xfb\\x79\\xfa\\xf3\\x5b\\xf0\\xdd\\x5e\\xfc\\xa6\\x0d\\xef\\x2f\\x87\\x00\\x84\\x20\\x84\\xf7\\xe7\\x8e\\x91\\xc3\\x90\\xa2\\x29\\x27\\xc5\\x64\\x52\\x6e\\x86\\xdd\\x10\\x40\\xf4\\xf7\\xc0\\x2e\\x58\\x0b\\xeb\\x60\\x3d\\x6c\\x85\\xb5\\xb0\\x0b\\xbe\\x08\\x01\\xd8\\x0e\\x1b\\xc6\\xe9\\xa0\\x79\\xcc\\xbb\\xb1\\xdf\\x50\\xfd\\x6d\\x85\\x41\\xd8\\x84\\x1a\\xdc\\x0d\\x7b\\x60\\x33\\xac\\x45\\xcc\\xd8\\xff\\x4e\\x71\\xdc\\x03\\xbb\\x11\\xc7\\xc5\\xb0\\x19\\x2e\\x86\\xf5\\xb0\\x0d\\x76\\xc3\\x7a\\x58\\x07\\x01\\xb8\\x14\\xb6\\xe1\\xff\\xbe\\x0b\\xdb\\xb2\\x09\\xf5\\xdd\\x0f\\x3b\\x60\\x2d\\x5c\\xac\\xbf\\x1b\\xfb\\x3b\\x8d\\x10\\x98\\xa0\\x9b\\x18\\x34\\x43\\x0b\\xf6\\x9c\\x3d\\xb0\\x03\\xba\\x21\\x0a\\x51\\xb8\\x1c\\xff\\x36\\xc3\\xda\\xbc\\x67\\x35\\xc3\\x76\\xd8\\x05\\x1b\\x21\\x0a\\x5b\\xc6\\x3c\\x73\\x37\\x44\\x61\\x31\\x2c\\x80\\x41\\x98\\x0b\\x4b\\x61\\x39\\xcc\\x85\\x26\\xfd\\x99\\x53\\xf7\\xb8\\xd3\\xf5\\xa1\\x73\\x61\\x3d\\x5c\\x04\\x1b\\x72\\x7d\\xbe\\x15\\x9f\\x39\\x84\\x38\\x31\\x29\\x77\\x61\\xeb\\xdb\\x91\\x8d\\xb2\\x15\\xba\\xb1\\x77\\xd1\\x7f\\x3b\\x72\\xbd\\xab\\x0d\\x67\\x09\\xfc\\x33\\x72\\x09\\xac\\x83\\x42\\x7f\\xde\\x03\\x20\\x1c\\xe1\\x89\\x40\\x44\\xdc\\x25\\x13\\x91\\x53\\x5e\\xc2\\x9d\\x53\\x2b\\xd8\\xa0\\x18\\xec\\xc8\\xaa\\x2a\\x83\\x02\\xa5\\xc8\\x4b\\xe7\\x42\\x96\\xa7\\x72\\xa8\\x80\\x4a\\xa8\\x02\\x2f\\xf8\\xc0\\x0f\\x01\\x08\\x42\\x08\\xc2\\x50\\x0d\\x35\\x50\\x0b\\x75\\x30\\x03\\xea\\xa1\\x01\\x22\\xd0\\x08\\x4d\\xd0\\x0c\\x51\\x6c\\x4d\\x0c\\xe2\\xd0\\x06\\xed\\xd0\\x01\\x9d\\xd0\\x05\\x09\\xe8\\x86\\x1e\\xe8\\x85\\x99\\x30\\x0b\\x66\\x43\\x1f\\xf4\\xc3\\x00\\x0c\\xc2\\x1c\\x98\\x0b\\x43\\x30\\x0f\\xe6\\xc3\\x02\\x58\\x08\\x8b\\x60\\x31\\x2c\\x81\\xa5\\xb0\\x0c\\xce\\x80\\x33\\xe1\\x2c\\x58\\x0e\\x2b\\xe0\\x6c\\x38\\x07\\xce\\x85\\x95\\xb0\\x0a\\xce\\x83\\xf3\\x61\\x35\\x7c\\x01\\xd6\\xc0\\x05\\x70\\x21\\xac\\x25\\x26\\xf8\\x57\\xb8\\x1e\\x6e\\x80\\xa7\\xe0\\x4e\\xf8\\x03\\x7c\\x19\\x6e\\x83\\x5b\\xe1\\x5f\\xe0\\xbb\\xf0\\x00\\x31\\xc3\\x2d\\xf0\\x6b\\xb8\\x0e\\xbe\\x46\\x24\\x62\\x81\\x03\\xa4\\x08\\x6e\\x82\\xff\\x80\\xd7\\x88\\x15\\xee\\x83\\x87\\xe1\\x23\\xf8\\x10\\x3e\\x86\\xfb\\xe1\\x07\\xf0\\x2c\\xfc\\x17\\x3c\\x02\\x17\\xc1\\xc5\\x70\\x10\\xd6\\xc1\\x73\\xb0\\x1e\\x8e\\xc0\\x51\\xf8\\x05\\x0c\\xc3\\xcf\\xe1\\x79\\xc8\\xc0\\x06\\xf8\\x6f\\x78\\x01\\x7e\\x09\\x8f\\xc2\\x46\\xf8\\x00\\xbe\\x0a\\xc7\\xe0\\x25\\xf8\\x1f\\xd8\\x04\\xef\\xc2\\x9f\\xe0\\x66\\xb8\\x04\\x36\\xc3\\x17\\x61\\x2b\\x6c\\x81\\x6d\\xf0\\x2d\\xd8\\x0e\\x3b\\x51\\x47\\xbb\\x71\\x54\\x5f\\x06\\x97\\xc3\\x1f\\x61\\x2f\\x5c\\x09\\x57\\xc0\\x55\\xf0\\x4f\\x70\\x35\\xfc\\x10\\xbe\\x0d\\xd7\\xc2\\x35\\xb0\\x0f\\xf6\\xc3\\x7b\\xf0\\x3e\\x3c\\x01\\x2a\\x68\\xf0\\x23\\x78\\x19\\x5e\\x21\\x36\\x52\\x4c\\xec\\xa4\\x84\\x38\\x88\\x4c\\x14\\x52\\x4a\\xca\\x88\\x93\\xb8\\x88\\x9b\\x78\\x48\\x39\\x24\\x21\\x05\\x8f\\xc1\\xe3\\xf0\\x33\\x48\\xc3\\x61\\x78\\x06\\x6e\\x84\\xef\\x91\\x0a\\xf8\\x31\\x3c\\x4d\\x2a\\x49\\x15\\x7c\\x85\\x78\\x89\\x8f\\xf8\\x49\\x80\\x04\\x4d\\x1b\\xb7\\x5c\\xb1\\x63\\x53\\xab\\xf9\\xd2\\x6d\\x9b\\x5b\\x5a\\x5a\\xe6\\xe8\\xd7\\x98\\x7e\\x4d\\xb0\\x6b\\x7f\\x8b\\x7e\\xd5\\xbf\\x1f\\xd0\\xbf\\x1f\\x88\\xeb\\xd7\\x76\\xfd\\x8a\\x3f\\x1f\\x6b\\x69\\x69\\xd1\\xaf\\xad\\xfa\\x35\\xa6\\x5f\\xe3\\xfa\\xb5\\x4d\\xbf\\xb6\\xeb\\xd7\\x0e\\xfd\\xda\\xa9\\x5f\\xbb\\xf4\\xab\\xf1\\xbc\\x7e\\x76\\x6d\\xd5\\x9f\\xdb\\xda\\x5a\\xb4\\x61\\xf3\\xc6\\x4b\\x77\\xad\\x5f\\xb7\\x76\\xf7\\x26\\xf6\\x51\\x6c\\x88\\x5d\\xdb\\x87\\x84\\xb9\\x97\\xee\\xda\\x8e\\x6f\\xda\\x87\\x06\\xe9\\x75\\x68\\x80\\xb5\\x63\\x68\\x80\\xb5\\x63\\x68\\x80\\xb5\\x63\\x68\\xa0\\x85\\x76\\xfd\\x1f\\x92\\x91\\x1b\\x54\\x72\\x00\\x16\\xa9\\xd2\\x19\\x2b\\x35\\x42\\x6e\\x5b\\xa5\\x0d\\x99\\x22\\x2b\\x83\\xaa\\x63\\xd5\\x22\\xb5\\xec\\xac\\x95\\x41\\x75\\xdf\\x2a\\xaf\\x6a\\x8a\\xac\\x5e\\x09\\x2a\\x1f\\x98\\xab\\xf2\\x91\\x39\\xaa\\x10\\x98\\x9b\\xe4\\xdd\\x5c\\x84\\xbe\\x21\\xaa\\xa8\\x7f\\x5a\\x14\\x98\\x9b\\x14\\x53\\x5c\\x44\\xe3\\x87\\x2e\\x8b\\xcc\\x51\\x2d\\x81\\xb9\\xc9\\x22\\x25\\xf7\\x56\\x0a\\xcc\\x4d\\x5a\\x3c\\xb9\\xb7\\xe6\\xc0\\xdc\\xa4\\xd4\\x94\\x7b\\x6b\\x0a\\xcc\\x4d\\x9a\\x5d\\xb9\\xb7\\xd6\\xc0\\xdc\\x27\\x40\\xbc\\x76\\x04\\x72\\x9f\\xd8\\x02\\x73\\x93\\x56\\xc9\\x78\\xbb\\x4a\\x2d\\x8b\\xa0\\x93\\xb5\\x7c\\xd5\\x7b\\x4b\\x01\\xfe\\x5f\\x00\\x00\\x00\\xff\\xff\\xa9\\x05\\xe3\\xd8\\x30\\xd3\\x00\\x00\")\n\nfunc fontsRobotoslabBoldWebfontTtfBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoslabBoldWebfontTtf,\n\t\t\"fonts/robotoslab-bold-webfont.ttf\",\n\t)\n}\n\nfunc fontsRobotoslabBoldWebfontTtf() (*asset, error) {\n\tbytes, err := fontsRobotoslabBoldWebfontTtfBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/robotoslab-bold-webfont.ttf\", size: 54064, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _fontsRobotoslabBoldWebfontWoff = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x64\\xb7\\x43\\x70\\xe0\\xdf\\xdb\\xc5\\xf9\\x8d\\x6d\\x3b\\xdd\\xb1\\x6d\\xdb\\xb6\\x6d\\xdb\\xb6\\x8d\\x8e\\xd3\\xb1\\x6d\\xdb\\xb6\\xed\\x74\\x92\\x0e\\x3a\\x4e\\xa6\\x7e\\xef\\x7f\\xaa\\x66\\x31\\xb7\\xea\\x53\\xe7\\xdc\\xcd\\xb9\\x8b\\xfb\\x2c\\xce\\xe3\\xa1\\x20\\x2e\\x0e\\x80\\x00\\x00\\x00\\x38\\x6c\\x03\\x68\\xff\\xe9\\x12\\xe3\\xff\\xee\\xff\\xff\\x23\\x2e\\xae\\x2a\\x07\\x00\\x20\\xe5\\x00\\x00\\xe0\\xff\\x87\\x61\\x8d\\xe2\\xb4\\x84\\xa8\\x98\\x38\\x00\\x80\\x0c\\x03\\x00\\x40\\x05\\x00\\x00\\x2d\\xe8\\x0b\\xc8\\xba\\x84\\xa2\\x82\\x0a\\x00\\x80\\xdc\\x01\\x00\\x34\\x01\\x00\\x60\\x2e\\xef\\x56\\x10\\x32\\x4a\\xa8\\xa8\\x09\\x03\\x00\\x2c\\x32\\x00\\x00\\xd2\\x00\\x00\\x68\\x36\\x8a\\xb5\\xa4\\x2b\\xa8\\x30\\x30\\x03\\x00\\xac\\x2e\\x00\\x00\\xca\\x00\\x00\\x18\\x76\\x3a\\x90\\xc5\\x9a\\xd8\\x19\\x39\\x02\\x00\\x6c\\x3d\\x00\\x80\\xa4\\x00\\x00\\xc8\\xbd\\x8c\\x6c\\xf1\\xbc\\x89\\xbb\\x2b\\x31\\x00\\xc0\\x8b\\x02\\x00\\xc0\\xf8\\x1f\\x48\\x7d\\xa8\\x32\\xe6\\x8e\\x16\\x76\\x00\\x00\\xef\\x0a\\x00\\x20\\x0d\\x00\\x00\\x6a\\xa6\\xd2\\xcc\\x50\\x66\\x61\\xe4\\xe2\\x08\\x00\\x88\\x94\\x00\\x00\\x40\\xff\\xbf\\x20\\x5b\\xd8\\x7a\\x99\\x03\\x00\\x22\\x23\\x00\\x68\\x9a\\x03\\x40\\x59\\xfd\\xaf\\xed\\x40\\x0e\\x4b\\x33\\x23\\x53\\x00\\x30\\xcf\\x04\\x00\\x80\\x09\\x00\\x00\\x76\\x48\\xdd\\x50\\x23\\x4b\\x4b\\x33\\x23\\x00\\x30\\x9f\\x06\\x00\\x80\\x08\\x00\\x00\\x52\\xe4\\x78\\xc8\\x4a\\x4b\\x3b\\x57\\x4f\\x00\\x30\\xbf\\x06\\x00\\xd0\\x14\\x00\\x00\\xab\\x7f\\x50\\x67\\x13\\xb2\\x75\\x30\\x31\\x02\\x00\\xab\\x40\\x00\\x00\\x99\\x05\\x00\\x90\\x4d\\x96\\x05\\x58\\x6d\\x3b\\x23\\x4f\\x47\\x00\\xb0\\x51\\x04\\x00\\x80\\xf8\\x3f\\x40\\x61\\x40\\x1a\\xed\\x8d\\xec\\xcc\\x00\\xc0\\xc6\\x11\\x00\\x40\\x8e\\x00\\x00\\x1c\\xd5\\x04\\x25\\x5e\\xd7\\xd1\\xc1\\xc5\\x15\\x00\\xec\\x54\\x01\\x00\\xe4\\x1f\\x00\\x80\\xbe\\x6a\\xa1\\xf8\\x7f\\x3b\\x3a\\x9b\\x39\\x02\\x80\\x83\\x2c\\x00\\x00\\x91\\x00\\x00\\x74\\x58\\xfd\\xd9\\xd6\\xf7\\x30\\x33\\x36\\x07\\x00\\x87\\x65\\x00\\x00\\x20\\xff\\xe3\\x5a\\x41\\x45\\x0b\\x00\\xfe\\xf7\\x2b\\xd3\\x7c\\xbf\\xe7\\xfe\\xd3\\xe1\\x3b\\x14\\xfa\\xff\\x74\\x2e\\x20\\x67\\xd6\\x73\\xd3\\xc4\\xd0\\xd4\\xd0\\x70\\x1f\\xcc\\x18\\x03\\x12\\xd9\\xd0\\xd8\\xd0\\xdc\\xd0\\xd4\\x13\\x71\\x98\\x01\\x5b\\x1f\\xd4\\xab\\x0e\\x5b\\x1f\\x6c\\x83\\xd6\\x10\\x07\\x12\\x50\\x59\\x06\\x5f\\x00\\x00\\xc0\\x73\\x33\\x37\\xd3\\xcf\\x51\\x4d\\x02\\x67\\x34\\xdf\\xc5\\xde\\x9e\\x5f\\x52\\x52\\xf2\\x86\\x2c\\x11\\x14\\xab\\xac\\x06\\xc5\\x92\\xba\\xa2\\x10\\x45\\x1a\\x3c\\xc2\\x3a\\x2b\\xf4\\x7c\\x19\\x35\\xf8\\x07\\xab\\x1a\\x7e\\x2e\\x0a\\xb2\\xf6\\xb7\\x63\\xf3\\x91\\xe6\\xd7\\xb8\\x45\\x85\\x3a\\xcd\\x09\\x09\\x1a\\xad\\x90\\x64\\xff\\x69\\x91\\xbc\\x5d\\x20\\x65\\x18\\x2b\\x69\\x48\\x8b\\x58\\x05\\x67\\xb1\\xb2\\xb0\\xb7\\x8e\\x65\\x90\\x89\\x5c\\xdf\\xb2\\xc0\\x63\\x2f\\x7f\\x97\\xd4\\xcd\\xd8\\x44\\x29\\xc8\\x0d\\x4b\\x5f\\x8a\\xcb\\xdc\\x4d\\x6f\\xd7\\x7b\\x8e\\xc7\\x5c\\x1e\\x9e\\x26\\x50\\x4a\\x1c\\x88\\xaf\\x69\\x40\\x4d\\x4b\\x27\\xf2\\xf3\\xd0\\x13\\xe2\\xa7\\x22\\xd9\\xea\\xa8\\x43\\x40\\x00\\x4b\\x9d\\xd1\\x31\\xde\\x94\\xed\\x57\\x9c\\x48\\xe5\\xd9\\x57\\x31\\x11\\x29\\xd6\\x40\\xa3\\xc2\\xd5\\x5b\\xcc\\x5f\\xca\\x16\\x8c\\x96\\xf5\\x78\\x3f\\xce\\x48\\x44\\x9b\\xba\\x15\\xe3\\x16\\xa3\\xfc\\xa7\\x46\\xb7\\x55\\xef\\x39\\xf9\\x06\\x30\\xf7\\xda\\x9e\\x01\\xff\\x75\\xff\\xe5\\x5d\\x6b\\x8f\\xad\\xb2\\x6b\\x95\\x6a\\xbc\\x05\\xf7\\x56\\x9c\\x85\\xde\\xc8\\xf5\\xc3\\x03\\xca\\x86\\xb8\\xdc\\xaa\\x77\\xa5\\xc6\\x7a\\xc4\\x09\\xde\\x37\\x11\\x82\\xbb\\x7d\\xf7\\x57\\x7a\\x6a\\x53\\xbc\\xd5\\x09\\x6a\\x7f\\x99\\xb4\\x29\\xcd\\x1f\\x44\\x46\\x3d\\x1f\\x29\\x6c\\x84\\x19\\x31\\x95\\xad\\xba\\x62\\x20\\x8b\\x22\\x01\\x41\\x09\\xa6\\x11\\xb3\\xc6\\x79\\xf0\\xc4\\x11\\xb4\\xa9\\xba\\xb4\\x87\\x7b\\xbe\\x8d\\xe0\\xfe\\xe8\\x93\\xc4\\xd1\\xc7\\xb8\\xd1\\x52\\x30\\x54\\x64\\x66\\xc5\\x39\\xd5\\x46\\xc7\\x2d\\xb1\\xaa\\x54\\xb7\\xbf\\xa3\\x55\\x59\\xe4\\x11\\x2a\\xc8\\xdc\\x8a\\xf3\\x58\\x13\\xed\\x62\\x5b\\x42\\xae\\x49\\xbb\\xc6\\xed\\x17\\x25\\xb3\\xc6\\xfd\\x47\\x05\\x04\\xb5\\x25\\x69\\xb8\\x24\\x11\\x93\\x2c\\x70\\xfa\\xe2\\x9a\\x53\\x10\\x17\\xa5\\x3a\\xc7\\x8d\\x9c\\x43\\xf1\\xc9\\x76\\x8e\\xb1\\xdf\\x03\\x92\\xf0\\x29\\x28\\x24\\x91\\xc6\\x16\\x64\\xe4\\x99\\xdd\\x89\\xa6\\xe6\\x5c\\xfc\\x43\\x4c\\x23\\xcb\\xbd\\x9e\\xcf\\x8f\\x68\\x24\\x05\\x5b\\x6d\\xc5\\xd8\\x2a\\x7e\\xb4\\x14\\xc7\\x2f\\xa7\\x40\\x1a\\x17\\x81\\x56\\x78\\xf2\\xba\\x22\\xfe\\xd5\\x14\\x1e\\x4b\\x9f\\xdc\\xa2\\x4c\\x7c\\xae\\x97\\xa5\\x2f\\xf8\\xf5\\x98\\x02\\x3e\\xfb\\xcd\\x69\\x92\\x3b\\x80\\xb9\\x11\\x3a\\x66\\xca\\xd2\\xd3\\x83\\xd5\\x97\\xc4\\xfe\\x21\\x94\\xa5\\xa6\\x3e\\xdf\\x83\\x21\\x69\\x51\\x43\\xbc\\x3a\\x54\\x56\\xb7\\x3d\\x4a\\x43\\xd5\\xed\\x1c\\xa7\\xa1\\x5c\\x61\\x9a\\x5e\\xe1\\x6d\\x75\\x6f\\x91\\x6e\\x6a\\x58\\xe2\\x5a\\xef\\x1a\\xe8\\x71\\x5b\\x69\\xdf\\x14\\xb6\\x47\\x94\\xa2\\x81\\xe3\\xc5\\x40\\xf2\\xcc\\x78\\x0f\\xa3\\x9b\\xda\\x77\\xc9\\xa5\\x7b\\x48\\x79\\x9b\\xf2\\x63\\xd5\\x2f\\x7e\\x8f\\x46\\xf3\\xf7\\x4f\\x7f\\xf9\\x31\\xaa\\xdf\\x60\\x23\\xc5\\xa1\\xa9\\xc9\\xce\\xbf\\x0f\\xf9\\xa6\\xfa\\xec\\x8a\\x73\\x5d\\x13\\xe5\\x17\\x25\\x78\\x35\\x27\\x94\\x54\\x0d\\xc9\\x1f\\x28\\x73\\x17\\xd4\\x8d\\xa9\\x13\\x62\\xb8\\xc6\\xd0\\xf5\\xe7\\x46\\x79\\xa7\\xc7\\x40\\xb7\\x83\\x74\\xb7\\xc3\\x78\\x69\\x07\\x77\\xc6\\x2d\\xdc\\x69\\xcd\\x10\\xe9\\x86\\x9c\\xd1\\x7f\\x67\\xd2\\xad\\x16\\xa0\\xaa\\x95\\x8b\\x23\\xb0\\xb4\\x23\\x3e\\x59\\xf6\\xb3\\xf3\\x06\\xe5\\x1f\\x5a\\x78\\x26\\xe3\\xf4\\x80\\xf1\\x34\\xc0\\x75\\x2d\\x44\\x9a\\x5f\\x8f\\x81\\x34\\x17\\xa4\\xbd\\xfa\\x41\\xf3\\x9d\\x8b\\x09\\xe8\\x8f\\xed\\xfd\\x85\\xa4\\xef\\x8f\\x9e\\x5b\\xa6\\xa1\\x24\\xfc\\x35\\x1e\\x85\\xf7\\x68\\x7f\\xaf\\xff\\xef\\x0b\\x4b\\xff\\xdf\\xb1\\x85\\xc1\\xc6\\x35\\x5d\\xca\\x1f\\x96\\x8d\\x9f\\x4b\\x93\\x0b\\xaf\\x57\\xa3\\x16\\x82\\x27\\x6d\\x78\\x69\\xb7\\xf6\\xce\\xf0\\xe5\\x4f\\xfb\\xe2\\x35\\x48\\x1c\\xaf\\x90\\xcb\\x6f\\x4e\\x45\\xab\\x29\\x78\\x2d\\xbd\\xdb\\xe8\\x78\\x94\\x4c\\x8a\\xd6\\x05\\xd3\\x82\\x1d\\x20\\x2d\\xfe\\x3b\\xe5\\x4f\\xd7\\xe2\\x35\\x0e\\x1c\\x6a\\x90\\xcb\\x6f\\x1e\\x2a\\x26\\x05\\xab\\x82\\xb9\\x41\\xde\\x60\\x08\\x90\\xcb\\x0f\\x23\\x33\\x88\\x60\\x3c\\x08\\xd7\\xcc\\xf5\\x5b\\x82\\x45\\x41\\xe4\\x60\\x97\\x5e\\xa7\\xa7\\x81\\x41\\x98\\x60\\x35\\x90\\x88\\xb8\\x9c\\xa6\\x82\\x7c\\x0c\\x3b\\xcd\\x38\\x96\\x1c\\xf3\\x46\\x05\\x4b\\x82\\x19\\x41\\x43\\x90\\xf1\\xd8\\x9c\\xd6\\x05\\x5b\\x81\\xde\\x79\\x5d\\x5e\\x0b\\xfd\\x4e\\x60\\x14\\xf0\\xe5\\x9f\\xfd\\x72\\x75\\x20\\x2d\\x06\\xed\\x4a\\xef\\x11\\x78\\x2d\\xf9\\xed\\x38\\xac\\x8c\\xa6\\xfb\\xec\\x3d\\x67\\xed\\x15\\xec\\x8a\\xff\\xdf\\x33\\xa0\\xde\\x16\\x2e\\x45\\xee\\xdc\\x1c\\xd6\\x67\\x2e\\x45\\xee\\xc2\\x1c\\x33\\x90\\x6f\\x08\\x9e\\x1b\\x4b\\x56\\xe2\\xf6\\x46\\x55\\xe4\\xab\\xd6\\x87\\x2b\\xe4\\xfc\\x0f\\x58\\xcc\\x37\\x7c\\xa6\\x48\\xaf\\x18\\x5e\\xe1\\xd7\\x64\\x98\\x53\\xa5\\xce\\xcf\\x13\\x47\\xb5\\x0f\\x5e\\xbe\\x28\\xe9\\x4f\\x8b\\xeb\\xf4\\x46\\x27\\xda\\x6a\\xab\\x48\\x35\\x65\\xd5\\x21\\xdb\\x61\\xcb\\x37\\x67\\xe2\\x7f\\xc2\\xed\\x97\\x6f\\xce\\x4b\\xd7\\x05\\xa3\\x82\\x94\\xc1\\x4e\\x20\\x97\\xed\\xaf\\xc4\\xff\\xf4\\xda\\x6f\\xc2\\x37\\xe3\\x9d\\x33\\xce\\x5b\\x15\\xcc\\x09\\x32\\x5b\\x9c\\x3b\\x8a\\x23\\x5a\\xec\\x3b\\x0e\\x23\\x4a\\x9c\\xd7\\x7b\\x44\\xf4\\x70\\xc5\\xde\\x30\\x66\\x0d\\xad\\x22\\xda\\xf0\\xb8\\xb6\\xc4\\x8e\\xd1\\x3b\\x67\\xe2\\xff\\x90\\x90\\x7a\\xb6\\x94\\x4a\\x24\\x13\\x4a\\x07\\xd7\\x42\\x35\\xfd\\xcf\\xec\\x2e\\xb8\\x56\\x84\\x27\\xe4\\x50\\xfc\\x37\\x87\\x3c\\x97\\x77\\xf1\\xdc\\xdd\\x45\\x88\\xb7\\xe5\\x43\\xff\\x67\\xdf\\xe2\\x6b\\x87\\x3f\\x5f\\x70\\xf7\\xb8\\x56\\x0f\\xf0\\xea\\xcb\\x72\\x94\\x3d\\x58\\x99\\x98\\xac\\x58\\xec\\xcd\\xcc\\x83\\xff\\xd2\\x4f\\x4a\\x34\\x0a\\xcb\\x4f\\x1a\\x07\\xcf\\x77\\x35\\x0a\\xf9\\xa3\\xbc\\xb5\\xd9\\x1e\\x66\\x5f\\xbb\\x05\\x70\\x7a\\x8c\\x13\\x4d\\x94\\xdc\\xa5\\x21\\x51\\x58\\x25\\x13\\x56\\xe0\\x61\\x9c\\xd9\\xa9\\x31\\x5b\\x39\\x38\\x84\\xcf\\xd5\\x26\\xf7\\x89\\x3d\\x4f\\x3d\\xa4\\x38\\x8b\\x05\\x2b\\xfb\\xec\\x98\\x04\\xc0\\x71\\xdc\\x25\\x05\\x38\\xde\\xc6\\xfb\\x7e\\xf8\\xae\\x11\\x69\\x0c\\xad\\xdf\\x28\\xdc\\x9b\\xbc\\xd6\\xb8\\x3a\\x86\\x2f\\xbd\\xa8\\x0d\\xb5\\x69\\xdf\\xc5\\x3d\\x52\\xd0\\xd2\\xa9\\xb9\\x09\\xff\\xb0\\x3a\\x39\\xcf\\x3f\\xfb\\xeb\\x51\\x68\\x84\\x93\\xee\\x4e\\x35\\x6f\\x97\\x9f\\x8c\\xfe\\x1a\\xef\\xab\\x12\\xff\\x97\\x0f\\x85\\xa4\\x5c\\xfd\\x4e\\x1a\\x57\\xe6\\xc1\\x75\\xcb\\x57\\x8b\\xae\\xa5\\x31\\x68\\x8f\\x23\\x1c\\xd4\\x59\\x9c\\x30\\xfa\\x72\\x8b\\x29\\xde\\x92\\xf8\\xf2\\xe3\\x11\\xbc\\xe9\\xb3\\x45\\x37\\x19\\xc4\\x8b\\xfb\\x72\\x32\\xcd\\xc9\\x6d\\xd0\\x5f\\xf2\\xb4\\xbd\\x11\\xd7\\x8b\\xe2\\x91\\xe8\\x02\\x56\\x0f\\xa6\\xe7\\xa7\\xd7\\x7d\\x50\\xb4\\x27\\x01\\xa1\\xc3\\xc2\\x6b\\x8a\\x39\\xa5\\x15\\x99\\xbf\\x97\\x88\\x3e\\x82\\x5d\\xf4\\x0c\\xe3\\xab\\x66\\x74\\x2d\\x89\\xf3\\x52\\x31\\x9b\\xbe\\x49\\x31\\x92\\x1e\\x0e\\x97\\xb3\\x7b\\x17\\xff\\x6c\\x46\\xd3\\x01\\xcd\\xde\\xe2\\xd3\\x2d\\xf6\\xcc\\x19\\x8b\\xb3\\xdc\\xee\\x72\\x1f\\xcb\\xe8\\x64\\x5d\\x5c\\x2a\\x76\\x0f\\xb5\\xe3\\x93\\x8f\\x2e\\xbe\\xb9\\x31\\xa4\\x02\\x8b\\x6b\\xf3\\xda\\x98\\x76\\x34\\xb7\\x6c\\x1a\\xed\\x2a\\x34\\x73\\x53\\x7e\\x8a\\xff\\x84\\x91\\xfd\\x63\\x68\\xf0\\xd1\\x5a\\xc8\\x57\\xb1\\x38\\xb3\\xa2\\xfa\\xd5\\x11\\x89\\x12\\x4d\\x38\\xa2\\xe3\\x88\\x43\\x6c\\x6c\\x92\\xc7\\xcb\\x3d\\x85\\xd9\\xed\\x39\\xed\\xb6\\x86\\xc1\\xa9\\x66\\x7c\\xd8\\x83\\x91\\xed\\x76\\xe5\\xf1\\xf3\\xf4\\x28\\x1c\\x37\\x45\\x1f\\x85\\xc1\\xaa\\x06\\xee\\x49\\xcb\\xfc\\xf7\\x4b\\x1b\\x0b\\xf9\\xe0\\xfb\\x41\\xd3\\xd9\\x04\\xb2\\xfd\\x25\\x89\\x84\\x43\\xfb\\xc8\\xd8\\xc2\\x06\\xab\\xf7\\x3f\\xa1\\xeb\\xf1\\x9f\\x26\\x31\\x7a\\x02\\x49\\xd3\\x89\\xb5\\x78\\xd7\\x4f\\x06\\x4a\\x67\\x36\\x14\\x55\\x4c\\xb5\\xb4\\x87\\x6a\\x7e\\x2f\\xb6\\x9c\\xa5\\xa3\\x8e\\xd7\\x7e\\xb8\\x78\\x2e\\xd3\\xb2\\xdd\\x07\\x8b\\x2e\\x07\\x4d\\xb0\\x6b\\xdc\\xde\\x02\\xe4\\xe2\\xe2\\x2f\\x32\\xdd\\x46\\xaa\\x55\\xc6\\x4d\\x62\\x4f\\x38\\x5e\\xc9\\xe3\\x54\\xdb\\xc7\\x14\\x6f\\x13\\xac\\x42\\x08\\x16\\x83\\xc9\\x07\\x52\\x5b\\xf2\\x9a\\x24\\xa7\\xbf\\x5e\\x65\\x65\\x27\\xca\\xaf\\x16\\x39\\x16\\xbb\\xae\\xbf\\x8b\\xcb\\xcc\\xcf\\x6b\\xb2\\xb3\\xd8\\x9a\\x82\\x15\\x3e\\x14\\x2a\\xf2\\x4e\\x72\\xff\\xd2\\x28\\xfc\\xa9\\x2b\\xed\\x91\\xd1\\x87\\x0e\\x78\\x5f\\x08\\x6d\\xd8\\xb1\\x59\\x3f\\x65\\xf8\\x04\\xa7\\x0e\\x44\\xa7\\xee\\xa7\\x90\\xe3\\x3e\\xbd\\x9f\\x99\\x18\\x3b\\xb2\\xa0\\x84\\x7b\\x28\\xe7\\x9c\\x2e\\xe3\\xd5\\x14\\xf4\\x72\\xa2\\xe0\\x9f\\x72\\x87\\xab\\x40\\x3f\\x56\\x96\\x6a\\x8f\\xc9\\x1a\\xf4\\xe8\\xe3\\xd5\\x37\\x10\\xf5\\x72\\xe4\\x48\\x9b\\xde\\xdb\\x93\\xc9\\x64\\x78\\x56\\xa4\\xba\\xb6\\xa0\\xda\\xa3\\x82\\x2b\\xb7\\x7a\\x01\\x4d\\x8b\\x36\\x53\\xc5\\x4d\\x57\\xb9\\xf0\\xcd\\xa0\\x35\\xcd\\x7f\\x56\\x5a\\x52\\x12\\x7d\\x55\\x12\\x36\\x3b\\xa4\\x59\\x86\\xe7\\x0d\\x54\\xe3\\x4d\\x57\\x62\\x69\\xc8\\xca\\x8a\\x67\\x5b\\xa6\\xd3\\x94\\x99\\x11\\x26\\x4b\\x0b\\x83\\xaa\\xd8\\x28\\xff\\xdd\\x78\\x87\\xcc\\x06\\xb5\\x55\\xce\\xc9\\x1b\\x44\\xc1\\x75\\x9a\\x7f\\x94\\x81\\xbf\\xe5\\x3e\\x19\\x52\\x46\\x85\\xc7\\x33\\x3f\\xfe\\xc0\\xb7\\x3e\\xd5\\xc0\\xa6\\x62\\xb5\\x9e\\x20\\x72\\x99\\x9b\\x74\\x5f\\x84\\x90\\x7b\\xfd\\x09\\x61\\x0d\\xd9\\x39\\x3f\\xe3\\x9f\\x70\\x00\\xfe\\x7e\\x59\\xd8\\x78\\x87\\xca\\x46\\xd0\\xa3\\x8a\\xf9\\x56\\xc1\\xfa\\xf9\\x9d\\x0a\\xcc\\xaa\\xb8\\x3c\\x7d\\xab\\x81\\x62\\x17\\x9f\\x1a\\x47\\x66\\x4d\\xed\\xa6\\x5b\\x66\\xa4\\x34\\x4f\\x49\\x6d\\x9a\\x11\\xad\\xa9\\x42\\x6e\\xbd\\x37\\x37\\x56\\x58\\x6d\\xda\\x30\\x38\\x53\\xd6\\xfd\\xf3\\x68\\x75\\x5f\\x9a\\x6a\\xbb\\xf3\\x25\\xc4\\x52\\x69\\xb3\\x54\\x28\\xb3\\x54\\x40\\x6b\\x2e\\xfb\\xbb\\xb9\\x54\\xb1\\xb9\\x04\\xff\\xc7\\xca\\x38\\xb5\\xac\\xe9\\xdc\\x0c\\xe6\\x4c\\x45\\xfa\\xb5\\x25\\xdb\\xe5\\x51\\x67\\x3f\\x87\\x52\\x81\\x6f\\x73\\x09\\x87\\xb2\\xec\\xe3\\x85\\x9b\\x4d\\x85\\x27\\xbb\\x3a\\x37\\x6e\\x69\\xd6\\xdc\\xda\\xe2\\xa8\\xb9\\x69\\xe9\\x2f\\x74\\x5a\\x98\\x35\\xab\\xe3\\xf4\\xa4\\x59\\x9d\\xfb\\x52\\x0c\\xf9\\x64\\x15\\x9f\\xdc\\x7c\\x1e\\xb9\\xb5\\x82\\xc5\\xc2\\x82\\xbc\\x78\\x7c\\xfb\\xc5\\x82\\x3d\\xb9\\x0d\\xc7\\x51\\x73\\x82\\x13\\xa7\\x94\\xd7\\x82\\xc4\\x6b\\x4b\\x59\\x14\\x67\\x04\\xc8\\xbf\\xdf\\x39\\x72\\x8b\\xb3\\x6f\\xcd\\x4d\\x52\\x9b\\x5a\\xf9\\xee\\xab\\x12\\x16\\x16\\xd6\\x16\\x85\\xb9\\x2d\\xcd\\x4d\\xad\\xee\\xcb\\x22\\x12\\x58\\x8c\\x37\\xb9\\xd3\\xc3\\xa4\\xde\\xad\\x39\\x37\\xe8\\x8b\\x71\\xb4\\xb9\\x5a\\x4d\\x12\\x3d\\x9e\\x81\\x2c\\x48\\xe7\\xb6\\x9d\\x69\\x2c\\xb5\\xc7\\x0c\\xa3\\x50\\x5c\\x43\\x0a\\x57\\x1d\\x33\\x47\\xd3\\xb8\\xbf\\xae\\x7c\\x38\\x53\\xcc\\xbc\\xc9\\x9f\\x2f\\x7f\\xa1\\xbb\\x10\\xee\\xbc\\x50\\x9f\\xcd\\xcb\\x3c\\x2f\\x6b\\xd2\\x70\\x4d\\x0a\\xf5\\x6a\\x54\\x31\\xd5\\x7c\\x0b\\x78\\xd2\\xc6\\xde\\xfc\\x5f\\x3f\\xf8\\x5f\\x97\\x30\\x4e\\x34\\x99\\x37\\x32\\x74\\x75\\x7a\\x80\\x31\\xda\\x37\\x34\\x04\\x89\\x66\\xfc\\xf8\\x9e\\x03\\x92\\x8d\\xa6\\x27\\x64\\x15\\xc0\\xa3\\x99\\x04\\x3d\\x05\\xb9\\x30\\x19\\x67\\x40\\x86\\x95\\x0d\\xb3\\xa2\\x82\\xe2\\x82\\x22\\x0e\\xc8\\x12\\x11\\x4d\\x3d\\x41\\x48\\x3f\\x03\\x7f\\xc7\\xc2\\xef\\x02\\xee\\xf2\\xd0\\xfc\\xff\\xcb\\x32\\xff\\x6b\\xbe\\x39\\xd4\\x3f\\xd9\\x3f\\xc8\\x1d\\xb3\\x92\\x19\\x14\\xa4\\x44\\x28\\xcc\\x62\\x60\\x2a\\x69\\x62\\x2c\\x08\\x89\\x84\\x9d\\xf9\\x05\\xc5\\x48\\x29\\x0a\\xf6\\x0b\\x96\\xd8\\x5f\\xc8\\x4c\\x89\\x29\\x71\\xe4\\x31\\x3b\\x8c\\xee\\x8f\\x01\\x2e\\x18\\x98\\x04\\xaa\\x4a\\x3e\\x28\\xd8\\x91\\x6f\\x80\\x38\\x24\\x24\\x26\\xcd\\x2a\\x82\\xa1\\x9b\\x2c\\xf0\\x4b\\x03\\x71\\xf6\\x7f\\x99\\x86\\x86\\xe6\\x81\\x86\\x38\\x90\\xe2\\x90\\xc8\\x9e\\x60\\xc7\\x4c\\xc1\\xaf\\xb4\\xf0\\x58\\x81\\xcd\\x20\\x21\\xa0\\x89\\x64\\x80\\x29\\x13\\x93\\x23\\xf3\\x1d\\xf3\\x32\\xd3\\x87\\x05\\xbc\\x79\\xb5\\x21\\xf7\\xa8\\xab\\x44\\x90\\x8c\\x90\\xa8\\x90\\xb4\\x90\\xbc\\x90\\x94\\x90\\x9c\\x90\\xc1\\x80\\xf4\\x0f\\x7d\\xa3\\xb8\\xdf\\xc9\\x97\\xf9\\x7b\\xb4\\xdf\\xdf\\x21\\x33\\xc1\\xe7\\x8a\\x86\\x9a\\xfd\\xd8\\xe0\\x2b\\x03\\x05\\xc4\\x05\\xc4\\x85\\xc4\\x60\\x2b\\x46\\x30\\x6b\\x03\\xd0\\xcb\\x03\\xe3\\xfd\\x2f\\xdf\\xcf\\xdf\\x75\\xdf\\xf9\\x5f\\x02\\xf7\\x7d\\xe7\\x7d\\x7b\\x02\\xa3\\x7d\\x0e\\x84\\x39\\xbe\\x8e\\xc7\\x03\\x03\\x50\\x50\\x84\\xd7\\x7e\\xf5\\x57\\x03\\xa5\\x50\\x34\\x44\\xcd\\xfc\\xf5\\xdd\\x01\\xc7\\xab\\x36\\xab\\x67\\x8a\\x6b\\xc9\\xe0\\xd8\\x1b\\x81\\xd8\\xd7\\x5a\\xc4\\x33\\xa0\\xee\\x44\\x59\\xa0\\x90\\x90\\xea\\xec\\xee\\x88\\xf2\\xf4\\xf6\\x84\\xfa\\xfc\\xfe\\x20\\x42\\x3f\\x8c\\x50\\x94\\x98\\x9c\\x60\\xa4\\xa8\\xac\\x70\\xb4\\xb8\\xbc\\x20\\xc4\\xc8\\xcc\\x30\\xd4\\xd8\\xdc\\x10\\xe4\\xe8\\xec\\x08\\xf4\\xf8\\xfc\\xc0\\x44\\x48\\x4c\\xd0\\x54\\x58\\x5c\\xe0\\x64\\x68\\x6c\\xf0\\x74\\x78\\x7c\\xa0\\x24\\x28\\x2c\\xb0\\x34\\x38\\x3c\\x90\\x14\\x18\\x1c\\x88\\x0c\\x04\\xbe\\x03\\xfb\\x0b\\xf6\\x13\\xe7\\xeb\\xef\\x22\\xc7\\xcb\\xcf\\x33\\xd7\\xdb\\x5f\\x42\\x87\\x8b\\x4d\\xc3\\xe3\\x67\\x6f\\x76\\x2b\\x9a\\x30\\x69\\xf5\\x1a\\x6d\\x47\\xee\\xd3\\xaa\\xd6\\x6a\\xb5\\xda\\xfc\\x8f\\xc2\\xe5\\xb2\\xdb\\xec\\xf7\\x5a\\x4d\\xd6\\x66\\xfd\\x7c\\x9e\\x89\\x0c\\x29\\xa5\\x64\\xe6\\x7a\\x0d\\x5a\\xda\\x29\\x9f\\xb5\\xc4\\x10\\x45\\xd6\\xf0\\xc3\\x95\\x21\\xc3\\xa7\\xa5\\xeb\\xaf\\xee\\x2f\\xb1\\xd5\\xff\\x58\\xc9\\xd3\\x01\\x0d\\x0f\\x57\\x44\\xc5\\xcd\\xcd\\x73\\xbc\\xce\\x8f\\x6f\\x71\\x3c\\x1e\\x0e\\xbb\\x9b\\x33\\x8e\\x2f\\xd8\\x43\\x4b\\x12\\x09\\x06\\xdd\\xa6\\xe5\\xbd\\x7e\\x09\\x85\\x35\\x75\\x2d\\x7d\\x16\\x87\\xc5\\x13\\x68\\xa5\\x73\\x86\\x99\\xec\\x0e\\x5f\\xba\\xe1\\x47\\x14\\xd1\\x41\\x59\\xd6\\x81\\xd8\\x80\\xcd\\x69\\xdc\\x6f\\x00\\x00\\xc0\\xb9\\x21\\xea\\x81\\x03\\xa0\\x1e\\x84\\x14\\x04\\x0b\\xd8\\x07\\x81\\x06\\x36\\x40\\x08\\x41\\x48\\x41\\x19\\x80\\x16\\xe0\\x08\\x38\\x01\\xba\\x80\\x5d\\x90\\x9f\\xc0\\x39\\x70\\x0b\\xf4\\x02\\xa2\\x10\\x28\\x9e\\x9b\\x7a\\x4a\\x5d\\xf2\\x3a\\x42\\xc8\\x3b\\x08\\x48\\x60\\x41\\xc3\\xeb\\xc4\\x5c\\x9b\\xe8\\x4d\\xbf\\x12\\x47\\x7d\\x0a\\x21\\x60\\x86\\x57\\xe2\\x8c\\x4d\\x79\\xc2\\x4e\\xa0\\xad\\x38\\x9c\\x93\\x62\\x9c\\x40\\x88\\x04\\x83\\x44\\x11\\x36\\xeb\\x70\\x0a\\x0a\\x8b\\x25\\xb3\\x21\\x7f\\x60\\x49\\xfa\\x0a\\xf3\\xff\\x40\\x65\\xb1\\x89\\xfc\\xcd\\xca\\xc3\\xd3\\xe4\\x32\\xfb\\x8b\\x45\\x66\\x32\\xa9\\xd2\\xe3\\xc2\\x66\\x4e\\xe5\\x8c\\x34\\x71\\x70\\x07\\x72\\x86\\xfd\\x53\\x5e\\xb2\\xa5\\x09\\x78\\x2e\\xbe\\xba\\x8a\\x8b\\x6d\\x0e\\x81\\xd2\\xb6\\x35\\x7f\\x9c\\x74\\x7b\\xff\\x82\\x83\\xcc\\x5e\\x48\\xe5\\xb1\\x06\\x4e\\xf8\\x1c\\xa8\\x90\\x70\\xe4\\x78\\x82\\xb4\\x9b\\xcb\\xbe\\x16\\x3e\\x60\\xc3\\xdf\\x3f\\x88\\x1e\\x78\\xb0\\x9b\\x59\\x97\\x1e\\x97\\xb9\\x61\\x2e\\x7e\\x80\\x9f\\x66\\x3b\\xc9\\x84\\xdc\\xe2\\xcc\\x74\\x4e\\x21\\xbd\\x05\\xaf\\x1c\\x18\\x33\\x32\\x16\\x67\\x96\\x1e\\xd2\\x0b\\x94\\x2a\\x7f\\xb5\\xb1\\x9e\\x59\\x4f\\xd5\\xb7\\x24\\x2d\\x74\\x87\\xb0\\xa0\\xbc\\x4e\\xb0\\x0a\\xaa\\xd8\\xd8\\x81\\x67\\x7d\\x2d\\xff\\x58\\x79\\x70\\x42\\x97\\x49\\x9c\\x2a\\x6d\\x60\\xcf\\xcc\\x6c\\xfc\\x22\\x45\\x1b\\x08\\x9b\\x70\\x55\\x53\\x69\\x99\\x7e\\xd9\\x1c\\xd0\\x6b\\x6c\\x3a\\x37\\x0c\\xa1\\x9e\\x09\\x82\\x5a\\x1f\\x52\\xf7\\x82\\x27\\x44\\x44\\x22\\x47\\x5f\\x6c\\x23\\x9d\\xa4\\x45\\x40\\xf9\\x67\\x5c\\x35\\x0c\\x8d\\x92\\x82\\x0f\\xcb\\x75\\xb2\\x3d\\xf1\\x55\\x2c\\xf8\\x2a\\x89\\x3a\\xda\\x2d\\x25\\xcd\\x73\\x14\\xde\\x02\\x39\\x9a\\xb4\\xd6\\x5f\\xc0\\xae\\xd0\\xf4\\xcd\\x9b\\x2d\\x67\\xe7\\x40\\x30\\xf8\\xa2\\x85\\x3f\\xe0\\xd1\\x87\\x23\\xc3\\xfd\\x32\\x1e\\xbe\\x89\\x8d\\x62\\xcc\\x63\\x4c\\x15\\x08\\x23\\x2a\\x2c\\xae\\xf6\\x1a\\x8e\\x3b\\xd7\\x43\\x0b\\x79\\xac\\xfc\\x3e\\x27\\x98\\x1a\\x78\\xf2\\x37\\x21\\x20\\x17\\xba\\xf9\\x66\\x5d\\x94\\x37\\xa3\\xc5\\x0d\\x91\\x49\\x1d\\xda\\xdb\\x7f\\x6b\\xfb\\x7e\\x2a\\xba\\x4b\\xbd\\x63\\x36\\x46\\xd8\\xc3\\xa1\\xd2\\xba\\x7c\\x91\\x6a\\xe6\\x5d\\x7f\\xb6\\x77\\x0c\\x2c\\x8f\\x10\\x6e\\x48\\xc8\\x64\\x20\\x7b\\xee\\xfd\\x4b\\x3a\\xe8\\x8d\\x97\\xb6\\x96\\xd5\\x12\\x11\\x5c\\xc4\\x9b\\xc3\\xfb\\xfb\\x77\\xcb\\x65\\x64\\x55\\x37\\x16\\x7f\\x23\\xc5\\x52\\x5f\\x83\\x36\\xf0\\x7f\\xdb\\x07\\xc8\\xf7\\x37\\x80\\xe4\\xb9\\xd9\\xec\\x07\\xe5\\x8b\\x6e\\xf6\\xf6\\xdd\\xcd\\xd2\\xd4\\x33\\xbb\\x6a\\x9a\\x62\\xdb\\xb8\\xa1\\x9a\\x5c\\x6f\\xca\\x11\\xa6\\x58\\x0c\\xbb\\x08\\x21\\x7a\\xf1\\x13\\xd6\\x58\\x68\\x20\\x38\\x1a\\x43\\x69\\x8e\\xde\\xdb\\xd3\\x13\\x2a\\xda\\x7b\\xf5\\x88\\xd7\\x9c\\x3d\\xa6\\x27\\xa3\\xe9\\x40\\x6b\\x76\\x68\\xf7\\x89\\xd5\\xf9\\x9f\\x33\\xb5\\xe9\\x8b\\xc0\\xdc\\xc3\\xac\\x2d\\x3b\\x32\\x72\\x40\\xdf\\x9e\\x81\\x80\\x94\\x39\\x5c\\xd7\\xed\\xd2\\xd4\\x7b\\xf7\\x1e\\x8a\\xa8\\x51\\x33\\x71\\xa4\\x84\\x96\\x39\\x74\\xb2\\x21\\xda\\x9b\\x8d\\xac\\x24\\xc2\\xc4\\xe6\\xf1\\x38\\x96\\xd5\\x8c\\xb5\\x97\\x8f\\xa4\\x3a\\xea\\x81\\xf2\\x3c\\xa9\\xef\\x66\\xb0\\x82\\x85\\xdd\\xea\\xf9\\xec\\x0f\\xad\\xf0\\x39\\x8b\\xd4\\x50\\xe5\\x5c\\x45\\xd4\\xa2\\x11\\xd8\\x9e\\x68\\xbd\\x32\\x86\\x86\\xe9\\x17\\xb3\\x25\\xcb\\x57\\x08\\x10\\x7e\\x65\\x4e\\x39\\xe4\\x75\\xef\\x18\\xe9\\xfc\\x2d\\x72\\xd3\\x83\\x8e\\x70\\xfc\\x94\\x50\\xee\\x8e\\x1f\\x36\\x28\\x61\\x90\\xa5\\x9b\\x2a\\x95\\xf5\\x72\\x69\\x4b\\x59\\xa6\\x17\\xca\\x35\\x56\\x33\\xe6\\x17\\x8b\\xf8\\xd5\\x42\\xf3\\xb4\\xb2\\x30\\xe5\\xce\\x63\\x81\\xe6\\x1f\\xbe\\x90\\x02\\x65\\x0d\\xd4\\x9f\\x76\\xea\\x23\\xa1\\x7a\\xa0\\xef\\x4a\\x9d\\x01\\x67\\xd8\\x1f\\x1f\\x53\\x66\\xf9\\x9e\\x45\\x2d\\x92\\x89\\x10\\x11\\x8c\\xa2\\x8a\\x61\\xa9\\xd6\\x13\\xfb\\x58\\xeb\\x27\\x90\\x2f\\xac\\xa5\\xdc\\x7f\\x8f\\xd8\\x26\\x16\\xd2\\x52\\x08\\x82\\xe1\\xf2\\x52\\x3f\\xee\\x26\\x10\\xb2\\x08\\xf2\\x9c\\xe6\\x59\\xb2\\xe0\\x7a\\xed\\x04\\x5d\\x14\\x27\\x28\\x5b\\xe1\\xbf\\x3a\\x3f\\x88\\x52\\xbe\\xbe\\x06\\x49\\x5f\\x74\\x23\\xbe\\x9e\\xe6\\x1e\\xe1\\x7a\\xcb\\xd4\\x91\\x8f\\x57\\x04\\x25\\xa2\\x14\\x67\\x31\\xe1\\x36\\xb0\\xe7\\x93\\x10\\x24\\xa2\\x59\\x7e\\xc9\\xae\\x42\\xba\\x9a\\xfe\\xa1\\xe7\\xd0\\x3d\\x03\\xc7\\x6c\\xf2\\xc2\\xe5\\x16\\x2b\\x69\\xae\\xa6\\xce\\x5a\\x00\\xef\\xa8\\x62\\x41\\xa7\\xa3\\xae\\x88\\x2e\\x75\\xc1\\xfc\\xa5\\x9f\\xfc\\xf1\\xd7\\xd9\\x77\\x02\\x94\\x41\\x8b\\x40\\x1e\\xa9\\x7b\\x78\\x39\\x3a\\x15\\x77\\x2b\\x9d\\xe6\\x94\\x86\\xf6\\x9f\\x0d\\xca\\x6a\\x22\\xdc\\x12\\xc9\\x0b\\xaa\\x85\\xc8\\xd9\\x9d\\xe3\\xfc\\xc2\\xbc\\x15\\x92\\xc4\\x35\\x02\\x17\\x5e\\x40\\x06\\x5d\\x5a\\xd3\\x83\\xc7\\xfa\\xf5\\x0b\\x62\\xf6\\xb5\\xa5\\xe2\\x90\\x7f\\x31\\xf9\\xd9\\x69\\x28\\x99\\x66\\xc8\\x26\\x66\\x57\\x40\\xe6\\xe7\\xfb\\x5c\\x98\\x63\\xc8\\xc3\\x97\\x51\\xfc\\x6d\\xdf\\x28\\x1c\\xdb\\xe9\\x2d\\xba\\x49\\x2b\\x31\\x6d\\xb8\\xbf\\xce\\x5f\\x0e\\x5f\\xbb\\xb2\\xa2\\x75\\x44\\x2c\\x94\\x80\\x32\\x96\\x43\\xd8\\xc3\\x32\\x37\\xef\\x41\\x7b\\xcf\\x90\\x7c\\x7f\\x9a\\x47\\x9e\\xd0\\xbe\\xbf\\x7c\\x4a\\xde\\x48\\x1f\\x55\\x3f\\xdf\\x34\\xee\\x7e\\x91\\x9d\\x9e\\xa5\\x66\\xe5\\xab\\x84\\xdf\\x5e\\xc4\\x66\\xdf\\xd2\\x8e\\x9d\\x95\\x1c\\xf8\\x2b\\x09\\x4f\\x7e\\xc2\\x36\\x96\\x36\\xd3\\xea\\xef\\x06\\xb4\\x7d\\x2f\\x1f\\x30\\xa5\\x4a\\xda\\xfc\\xcc\\x0c\\xcd\\x8f\\x4d\\x1d\\xc8\\x77\\x4c\\xf6\\x4f\\x16\\xfa\\xb0\\x9a\\x03\\x4f\\x69\\x91\\x1d\\xf7\\x9d\\xa4\\x3d\\xba\\xc5\\x79\\x3e\\x6f\\xf7\\x19\\xeb\\xfb\\x94\\x39\\x1d\\xd2\\x83\\xda\\x71\\x99\\x2f\\x82\\xda\\xf1\\x99\\xef\\x23\\x9c\\xe1\\x9d\\xfc\\x72\\xa5\\xa8\\xda\\x1e\\xb6\\x5f\\xc6\\xda\\x9f\\x23\\xff\\xdc\\xe1\\x79\\x1a\\xb9\\x56\\x78\\x01\\x9b\\x0b\\xc1\\x85\\x95\\x3d\\x5f\\x5f\\x51\\x50\\xaf\\x5e\\x83\\x91\\x1b\\x54\\x0b\\xde\\x64\\x48\\x6b\\x92\\x0c\\x46\\xe3\\xd4\\xc9\\x9a\\x84\\x38\\x8f\\xae\\xf8\\x54\\xa9\\xf4\\xc8\\x56\\x47\\xcc\\xa2\\x52\\xb5\\x55\\x61\\x5d\\xd8\\x28\\x49\\x7f\\x67\\x83\\xd0\\xc4\\x3f\\x54\\x3e\\x87\\x52\\x38\\xbb\\x7c\\x75\\x1b\\xaf\\xdb\\x08\\x3a\\x1a\\xb1\\xaa\\xc1\\xfd\\x12\\x62\\xad\\x29\\x11\\x9c\\x9b\\xec\\x29\\x18\\xb9\\x41\\xac\\xe9\\xcd\\x47\\x3d\\x77\\xd5\\x92\\xa6\\xa9\\xfa\\x4d\\x50\\xb0\\x75\\x27\\x59\\x65\\x73\\x7e\\xae\\x28\\x93\\x46\\x07\\xfa\\x20\\x1e\\x53\\x79\\xe0\\xc5\\x86\\x3c\\x9f\\xaa\\x08\\x55\\xee\\x5b\\xcf\\x87\\x12\\x6d\\xba\\x68\\x57\\x43\\xc7\\xd6\\xf2\\xa9\\x65\\x23\\xa3\\xe3\\x63\\x43\\x8e\\x6f\\xc1\\x9f\\x6e\\x59\\x21\\xa5\\xae\\x3d\\x54\\x28\\xc9\\x3a\\x3b\\xf8\\xa3\\x8a\\x2e\\xc7\\xf6\\xcf\\x1c\\xb7\\xa8\\xba\\xf7\\xea\\x07\\x97\\xc4\\xb4\\xce\\xd7\\x4d\\xeb\\xda\\xcd\\x6e\\xfb\\xab\\x96\\xd2\\xa2\\x80\\x3e\\xe7\\xe7\\x3c\\x4e\\x93\\xbc\\x8f\\xc5\\x96\\xcd\\xb3\\xad\\xef\\xbe\\xcf\\xbf\\xcc\\x93\\xdf\\x2a\\xf1\\x99\\xec\\x6e\\x4e\\x47\\xcb\\x65\\x6d\\xdb\\x7f\\xb5\\xef\\x5a\\x38\\x4c\\xf6\\x78\\xcd\\xb5\\x9c\\x76\\x93\\x96\\xc8\\x89\\x92\\xb8\\xaf\\x6f\\x37\\xba\\xf4\\x11\\xbf\\x3e\\x2b\\xf6\\x25\\x82\\xc5\\x2c\\x77\\x9f\\x88\\xa6\\x92\\xd2\\xcb\\xc0\\x91\\xac\\xb9\\x1d\\xcd\\xeb\\x1d\\xe3\\x12\\xed\\x00\\xbb\\xb5\\xac\\x93\\xda\\x6a\\xf8\\xca\\x5a\\x8c\\x09\\xbd\\x8e\\x20\\x35\\x84\\xc6\\x32\\x21\\x3c\\xe8\\x8c\\xe8\\x18\\x7a\\x8c\\x8e\\x98\\x0a\\x91\\xf9\\x4d\\x67\\xfd\\x08\\x46\\x82\\x97\\x83\\x27\\x9b\\x1f\\xfb\\xe8\\x96\\x17\\x9e\\x9e\\xa6\\xcf\\x36\\x18\\x77\\xe5\\x02\\x01\\x35\\x7d\\x06\\x36\\x41\\x12\\x6e\\x8f\\x92\\x78\\xb0\\xb1\\xb0\\x5e\\x49\\x42\\xce\\x54\\xd8\\x12\\x11\\xab\\x8b\\x44\\x84\\xa9\\x6a\\x6c\\xc3\\x51\\x3a\\x60\\xd9\\x41\\x11\\x25\\x04\\xda\\x49\\xa0\\x01\\x47\\xe3\\x84\\xfb\\x92\\xe4\\x04\\x54\\x26\\x3f\\x6c\\x1a\\x1b\\x4b\\x73\\x35\\xd9\\x52\\x9d\\x56\\xc1\\xb5\\x52\\xd5\\x6e\\x8f\\x9e\\x4e\\xb7\\xea\\xf4\\x3c\\xb6\\xec\\xd6\\xbe\\x0e\\xe2\\xc7\\x22\\x90\\x70\\x58\\x7d\\x87\\xf7\\x07\\x86\\xc4\\x23\\x15\\x0c\\x36\\x76\\x06\\xac\\x6f\\xdb\\xff\\x21\\xb5\\x0d\\xc1\\x79\\xf0\\xfb\\xef\\xf7\\xa3\\x80\\x45\\x20\\x11\\x32\\xcb\\xe6\\x31\\x5a\\xad\\x18\\x70\\xe4\\x0a\\x58\\xad\\x18\\x7c\\x35\\x5a\\xcf\\xa7\\x52\\x85\\x90\\x23\\x64\\x71\\xbb\\xcd\\xcf\\xc2\\xbe\\x16\\xc3\\xf0\\xd4\\x6e\\xb3\\x5e\\x74\\xf7\\xd9\\x6b\\xb3\\x5d\\x7c\\xf4\\xd9\\x6a\\xaf\\x30\\xb9\\x0d\\xd6\\x4b\\x11\\xa8\\x94\\xb9\\x43\\xef\\x9f\\x64\\xb9\\xdb\\xb5\\xb5\\x07\\x05\\xc0\\x14\\x2a\\x9d\\x23\\xd3\\x63\\x35\\x92\\x9d\\x53\\x4d\\x26\\x05\\xad\\x28\\x6b\\xac\\x06\\xc1\\xdb\\x66\\x04\\xaa\\x85\\x8c\\x33\\xa9\\x05\\x97\\xaa\\xbe\\xad\\x90\\x2f\\xd3\\x57\\x11\\xe0\\x1b\\x4a\\xdb\\x34\\x1e\\xa9\\x8c\\x13\\xce\\xd8\\x5d\\x29\\xef\\x0c\\x8b\\xd1\\x5d\\x9f\\x2f\\x42\\x0e\\xed\\x91\\xd3\\xdc\\x09\\x5e\\x2a\\xea\\xa4\\xe6\\x14\\x75\\x77\\xee\\x26\\x58\\x1f\\x21\\x9a\\xa6\\x2d\\x76\\x22\\xce\\x97\\x26\\xfe\\x4e\\x07\\x86\\x2a\\x65\\x22\\x8d\\xac\\x79\\x28\\x33\\x56\\xf4\\x54\\x05\\x80\\x5d\\x08\\x5d\\x30\\xb6\\x9f\\x66\\xa0\\xab\\x81\\x37\\x2f\\xd8\\x3c\\x81\\x2d\\xe6\\x82\\x51\\xbf\\x5b\\x45\\x6b\\x32\\xc8\\x68\\xaa\\x2a\\xa3\\x54\\xfe\\x4c\\x9f\\x9a\\x09\\x29\\x36\\xb8\\x7b\\xe6\\x66\\xae\\xba\\x7e\\x85\\x15\\x49\\xf4\\xf4\\x9a\\x1d\\x2d\\xc1\\x59\\x4c\\x9b\\x14\\x56\\x76\\x72\\x48\\x24\\x78\\x49\\x2d\\x13\\xe5\\xb0\\x92\\x78\\x3c\\x66\\x77\\xce\\x56\\xca\\x67\\xae\\x78\\xdb\\x36\\x7d\\x59\\x33\\xaa\\xf8\\x89\\x8a\\x0c\\x15\\x82\\xd9\\x8c\\x21\\x10\\x32\\x85\\xeb\\x75\\x1b\\x2f\\x75\\x77\\xac\\xc9\\x75\\x5c\\x8d\\x94\\xd1\\x1b\\x78\\x3e\\xcc\\x27\\xbd\\x0d\\x89\\xd0\\xe7\\xfb\\x5e\\x58\\x34\\xf5\\xb5\\x4d\\x5b\\x3b\\x7c\\x1f\\x5f\\x68\\x51\\x64\\xa4\\xd6\\x77\\xe4\\x81\\xb8\\x0c\\xef\\xb1\\x4d\\x5b\\x11\\x69\\xb2\\x35\\x50\\xf1\\xbd\\x32\\xd6\\x4f\\x4c\\x15\\xd7\\x6d\\xb0\\xde\\x9f\\xb9\\x9d\\xcf\\x20\\x68\\xcc\\xaa\\xc6\\x5c\\x8c\\xc1\\xf9\\x76\\x98\\xcf\\xf8\\xd8\\x5f\\x34\\x96\\x8d\\x49\\x1a\\xc4\\xb8\\xbd\\x79\\xbc\\x51\\x98\\x6e\\x35\\x3d\\x82\\x0d\\xc3\\x55\\xa3\\x41\\x88\\x41\\xc3\\xca\\x22\\xcc\\xf7\\xb9\\x6f\\x76\\x35\\x13\\x7f\\x53\\xd4\\xf8\\x17\\xf2\\xa1\\xb5\\x44\\x4b\\xaf\\x13\\x45\\x6e\\x26\\xb3\\x0d\\xd2\\xb2\\xef\\x2b\\xd9\\x5c\\x5d\\xda\\xba\\xbb\\x55\\x3d\\x29\\x7d\\x92\\x39\\x29\\x86\\xea\\xd1\\x92\\x97\\xe9\\x37\\x29\\xe6\\x97\\x7f\\xd3\\x95\\xee\\x95\\x28\\x68\\xbb\\xae\\xa8\\x36\\x24\\xf3\\xfb\\x50\\xfa\\xfe\\xb3\\x0a\\xcb\\xa7\\xb3\\x5b\\xe2\\xe5\\xcb\\xdf\\xc1\\x54\\xd4\\xfe\\x34\\xb6\\xf3\\x21\\xff\\xd9\\x3f\\x06\\xd7\\x7a\\x3c\\xaf\\xd6\\xd1\\x35\\x67\\xd7\\xc4\\x3f\\x1b\\x7e\\xae\\xc0\\x6f\\xbf\\x62\\xa0\\x39\\x7e\\x63\\xbe\\x64\\x72\\x6d\\xe8\\xbe\\x97\\xa4\\x41\\xb8\\xfd\\x19\\xed\\xef\\x2f\\x6a\\xb0\\xf2\\x39\\x17\\x72\\xd1\\x44\\x33\\xa2\\xb4\\x58\\x81\\x6c\\xd1\\x7d\\x77\\x81\\xec\\xce\\x24\\xfc\\xa6\\x9c\\x95\\x1f\\xe0\\xdc\\x25\\x36\\x29\\xb9\\xa2\\x24\\x33\\x7f\\x6a\\xdc\\x32\\x30\\x89\\xa8\\x4e\\xe4\\xc9\\x38\\x9c\\x0c\\xf6\\x14\\xc0\\xdb\\x64\\xff\\xa0\\xb7\\xd6\\x43\\x9a\\x61\\x63\\xd1\\xc8\\xf5\\x36\\xba\\xe4\\xd2\\xf4\\xf8\\x9d\\xd7\\x4f\\xfd\\xa4\\x90\\x60\\xe6\\x7f\\x73\\x95\\x15\\x66\\x73\\x5c\\xee\\xdb\\xb6\\x8f\\x6a\\xae\\x98\\xda\\xac\\x94\\x6a\\x0b\\xa9\\xd2\\x5c\\xdc\\x04\\x3a\\x04\\xfd\\x93\\x93\\x00\\x41\\x8b\\x7c\\x9f\\x2c\\x05\\xff\\x6e\\xe4\\x26\\xf5\\x72\\xbb\\x34\\xda\\x6a\\xc6\\xe8\\x4f\\x30\\x74\\xae\\x1b\\xe7\\x5f\\xb6\\x08\\x84\\xdd\\x53\\xd7\\xfd\\x12\\x15\\x47\\x56\\x4b\\xc2\\x90\\xa2\\x44\\x10\\xca\\x28\\xc6\\x2f\\x7b\\xf3\\xb1\\x46\\x46\\x1e\\xed\\xef\\xa2\\x5e\\x3d\\xfc\\xfa\\x14\\xbd\\xca\\xba\\xf5\\x0a\\x06\\x53\\x8e\\x79\\x6e\\xc8\\x0b\\x9b\\x8d\\x95\\x41\\x0f\\xe4\\x9a\\x2a\\x88\\x95\\xa4\\xc9\\x89\\x44\\xec\\x02\\xdf\\xdc\\x61\\x31\\x46\\x10\\x78\\xc3\\x2c\\x35\\x50\\x08\\x77\\xd7\\xfd\\x33\\xc2\\xfe\\xf0\\xc6\\x50\\x84\\x66\\x57\\x45\\x3b\\x01\\x73\\x33\\x0a\\x85\\x35\\x01\\x7c\\x97\\x3f\\xdb\\x1c\\x6d\\xf4\\x5f\\x9e\\xf8\\xfe\\xbb\\xd6\\xa5\\x31\\xcf\\x91\\xb7\\x41\\x27\\x69\\x24\\x7a\\xb8\\x29\\x9d\\x77\\x11\\x15\\xce\\xd2\\x68\\xfb\\x29\\xa4\\x1e\\x58\\xa3\\x3e\\xbd\\x83\\x77\\xd6\\x0d\\x61\\x17\\x44\\xbe\\xc0\\xb7\\x3d\\xc6\\xc7\\x91\\x0e\\xb6\\xb6\\x6d\\xa5\\x87\\xba\\xb2\\x63\\x1c\\x91\\xb0\\x36\\x14\\x15\\xcc\\xd7\\xdd\\xdc\\x80\\xab\\x29\\x86\\x8c\\x31\\xee\\xcf\\x7a\\x3d\\xbd\\x2e\\xf5\\x98\\x3a\\x25\\x7f\\xb0\\x7b\\x63\\x52\\x86\\x17\\xf3\\x2f\\x79\\xbc\\xa9\\xfa\\x72\\x6c\\xaf\\x9e\\xf7\\x87\\xa6\\x1a\\x39\\x81\\xef\\x94\\xfb\\x42\\x12\\x77\\xbb\\x0c\\x28\\x9c\\x2f\\xb7\\xc4\\x44\\xb7\\x42\\x13\\x45\\xd2\\xa5\\xa6\\xc3\\x41\\x99\\x0b\\x9e\\x9e\\x7d\\xec\\x76\\xb0\\x95\\xeb\\xbb\\x15\\xb3\\xf0\\x88\\x65\\x5d\\x67\\xa8\\x06\\xb1\\xbf\\x70\\xbf\\x9a\\x15\\xe1\\x0f\\xe5\\xd4\\x61\\x63\\xa1\\xe0\\xc2\\x7c\\xda\\x49\\x32\\x8f\\x8a\\x90\\x7e\\xc9\\x7c\\xdf\\x46\\x10\\x5d\\x09\\x34\\x1e\\x2f\\x48\\xd0\\xe9\\x76\\x9b\\x1e\\x24\\xc5\\x8c\\xb8\\xb3\\x07\\xab\\xd5\\x93\\x7f\\xe6\\xbf\\xbd\\xbf\\x91\\xbc\\xf9\\xbc\\xf5\\x69\\x82\\x35\\x95\\x73\\xec\\x96\\x37\\xb2\\xdc\\x76\\x5e\\x8c\\xf6\\x39\\xf1\\x71\\x01\\x9a\\xce\\x8c\\xf3\\x47\\xc8\\xe4\\x30\\x5a\\x34\\xb5\\xb3\\xe4\\x29\\x77\\x62\\xba\\xc4\\x68\\x9f\\x18\\x09\\xa5\\x8c\\x35\\x3f\\xa2\\x36\\xa2\\x38\\xb4\\xa2\\x50\\x91\\x27\\x40\\xbd\\x8d\\x32\\xee\\x16\\xe3\\xbd\\x83\\xac\\xd2\\xc8\\xd7\\xc7\\xf5\\x7e\\x3c\\x57\\xa5\\x59\\x72\\x2e\\x6c\\xd6\\xe2\\x13\\xa7\\x7f\\xb5\\x3f\\x64\\x13\\x9d\\x6c\\x39\\x18\\xb4\\x17\\xd1\\xf6\\x7a\\xb9\\xe8\\x7a\\xa3\\xf5\\x72\\x20\\xbc\\xaa\\x81\\xdd\\x95\\xa0\\x1b\\x3b\\xad\\x26\\xec\\x5d\\x81\\xd6\\xee\\x8b\\xcd\\x92\\xc0\\xd8\\x23\\xc7\\x9a\\x3a\\x52\\xea\\x88\\xee\\x29\\xa9\\x46\\x53\\x6b\\xa7\\x2b\\xcb\\xb4\\x59\\x91\\x21\\x67\\xc8\\x7c\\x68\\x63\\xb3\\x41\\xad\\xa2\\xb5\\x2a\\x4f\\x1e\\x47\\x84\\x8e\\x5f\\x6a\\xf4\\x9c\\xeb\\xf0\\xed\\x4b\\xf1\\x51\\xcd\\xd8\\x5c\\x2d\\x1e\\x9e\\xcb\\x0d\\x08\\x99\\x93\\x65\\xa0\\xf9\\x95\\x4a\\x04\\xbd\\xd0\\x5a\\xd2\\x0b\\x54\\xab\\x16\\x46\\xcc\\x22\\xb6\\x50\\x02\\xc3\\x11\\x3c\\x94\\x98\\x6b\\x40\\x99\\x19\\x7c\\x2b\\x6d\\x96\\x25\\xd4\\x45\\x1b\\xf3\\x12\\x43\\x38\\x9a\\x15\\xdc\\x83\\xef\\x07\\x08\\x5a\\x5d\\xaf\\xc8\\x2d\\xe6\\x86\\xf4\\x73\\x17\\xcf\\xd1\\x75\\xcb\\x48\\x04\\x21\\x97\\xc5\\x02\\xd3\\xdb\\xd8\\xa2\\x86\\x02\\xd3\\xc9\\x03\\x05\\xbd\\xa7\\x40\\x59\\x80\\xb1\\x56\\x51\\x9d\\x57\\xe8\\xa7\\xef\\xa5\\x1c\\xd4\\x2c\\xdf\\x53\\x72\\xca\\xf4\\x87\\x49\\x97\\x2e\\x14\\xeb\\x33\\x9a\\x3a\\xec\\x06\\x77\\xf1\\x06\\xe8\\xb1\\xd6\\xa5\\xe3\\x13\\x26\\xe4\\x36\\xad\\x58\\xb2\\xc8\\x9d\\x6e\\x39\\x7a\\x3e\\x1c\\x06\\x57\\x20\\xde\\x4d\\xa7\\x32\\x74\\x1b\\xa1\\x6a\\x1a\\x24\\x2a\\x88\\x39\\x1e\\x2c\\x2a\\x8c\\x97\\xb4\\x3a\\xd5\\x98\\x07\\xb5\\x3d\\xb2\\x20\\x49\\x29\\x91\\x7b\\x41\\x25\\xea\\xb8\\x8b\\x8e\\xa0\\x57\\xa8\\xb5\\xbc\\x03\\x99\\x68\\x74\\xa0\\xba\\x6e\\xaf\\x4e\\xe5\\x02\\x70\\x10\\x48\\x1f\\xd9\\xbc\\x99\\x45\\x1d\\x62\\x2f\\xcb\\x66\\x0a\\x8d\\x94\\x68\\x91\\x9a\\xc3\\xef\\xb1\\x50\\x41\\xc1\\xd0\\x75\\x92\\x4e\\x26\\x41\\xe0\\xf6\\xd2\\x6c\\xf6\\x46\\xf1\\x3b\\x0d\\x22\\xef\\x3b\\xd1\\x4b\\x5e\\xe0\\x34\\xd6\\xe5\\xc9\\x83\\xdf\\x5b\\x3f\\x20\\x42\\xcf\\x94\\xcf\\xf4\\xa2\\x11\\x82\\x82\\xe8\\x79\\x75\\x91\\xc4\\x9c\\xb0\\xcb\\xb0\\xd1\\x6d\\xa9\\xab\\x4e\\xc0\\xe5\\xa5\\x14\\x04\\x61\\x03\\x63\\xce\\xf7\\x1e\\x77\\x53\\x10\\x63\\xdc\\xfb\\xe7\\x6b\\x7b\\x41\\xbd\\xe2\\x38\\xb7\\xd4\\x66\\x81\\xd9\\x3f\\x56\\x2d\\xc5\\xd9\\x2b\\x17\\x66\\x24\\xd3\\x4b\\x9c\\x19\\xb8\\x39\\x6d\\x62\\x01\\xc4\\x12\\xd5\\x67\\xf6\\x15\\x85\\x15\\x10\\xce\\xe2\\xea\\x19\\x39\\xaa\\x3a\\x30\\x52\\xf8\\xca\\x8b\\xd6\\x03\\x12\\x8e\\x76\\x06\\x55\\x10\\xa1\\x07\\xa3\\x59\\x32\\xd7\\x72\\x59\\x25\\x30\\xc9\\x1f\\x32\\x94\\x89\\x5c\\xe1\\x52\\x9f\\xda\\x68\\x8a\\x95\\xcb\\x9b\\x95\\xc3\\x5e\\xd5\\xa7\\xab\\x3a\\x6b\\x1e\\x7b\\xad\\x85\\xef\\x0e\\xb2\\xc6\\x2a\\xd5\\x62\\xb6\\x5d\\x8f\\xcb\\xb3\\x68\\x84\\x7d\\xb0\\x6a\\xf7\\x95\\x63\\x62\\x09\\xeb\\x48\\x66\\xac\\xb0\\xa6\\xc7\\x21\\x2d\\xe4\\xa1\\x1d\\xa0\\x48\\x47\\x94\\x24\\x02\\xb0\\xe4\\xb6\\xba\\xc7\\xc1\\xc9\\xfb\\x49\\x78\\xce\\x23\\xb5\\xce\\x02\\x92\\xa5\\xd8\\x64\\x2a\\x52\\xc9\\x54\\x10\\x53\\x72\\xc1\\xe8\\xd2\\x42\\xb0\\xa9\\x1b\\x41\\x59\\x41\\xf8\\xce\\xc1\\xe7\\x4f\\x69\\xc6\\x79\\x68\\xb4\\x11\\x69\\xe2\\x92\\xb0\\x2b\\xa5\\xe8\\x81\\xaf\\xad\\x97\\x86\\xc2\\x52\\xab\\xe4\\xc5\\x60\\x9a\\x3e\\x3a\\xc4\\xf8\\xa8\\x41\\xaf\\x45\\xa2\\xea\\xae\\x83\\xd5\\x23\\x70\\x19\\xf8\\x7c\\x7e\\xea\\x8a\\x6b\\x48\\x49\\xa3\\xc7\\xc6\\x6f\\x17\\x4f\\x4f\\x14\\x04\\x2f\\x93\\x7d\\x5d\\x7d\\xbe\\xe2\\xdf\\x89\\x7a\\xa6\\x7f\\x09\\x1b\\x1e\\xb3\\x54\\x66\\x3b\\x6e\\x02\\xd5\\xc5\\xac\\xe7\\x5d\\xe0\\xdc\\xd8\\xf4\\xa7\\x48\\xfd\\xce\\x2c\\xea\\xce\\xf3\\xfb\\x20\\x7c\\xf3\\xc1\\x9a\\x65\\x21\\xfd\\x62\\x84\\xd8\\x5c\\x7e\\x27\\xd2\\x09\\x5b\\x1f\\x96\\xde\\x82\\xb8\\x4c\\x41\\x54\\x46\\x33\\xa6\\xc1\\x11\\x43\\xb8\\x1d\\x87\\x4b\\xcf\\x23\\x94\\x2c\\xb4\\xa3\\x5a\\xb2\\x0b\\x2a\\xf0\\x7d\\xc8\\xa5\\x2a\\xd6\\x62\\x52\\x0e\\x5e\\x93\\x54\\x5b\\xba\\xe3\\x25\\xab\\x63\\x40\\x19\\x0f\\x26\\x8e\\x50\\x67\\xad\\x41\\x45\\x9f\\xc2\\x96\\xff\\x43\\x54\\x53\\x57\\xd5\\x81\\xf2\\xd0\\x8c\\x72\\x25\\xb5\\xbe\\x9a\\x4b\\xec\\x3f\\x07\\xa1\\x4d\\x81\\x9c\\x84\\xed\\xc6\\x2a\\xf3\\x45\\xc4\\x9b\\x5a\\x6f\\x9e\\x1a\\x35\\x0d\\x27\\xf0\\xd9\\x7f\\x5d\\x63\\xa9\\xf0\\xda\\xe9\\xa6\\xd8\\x5d\\xe9\\xf3\\x3d\\xda\\x7b\\xeb\\xa2\\xf5\\xfa\\x97\\xbc\\x21\\xa3\\x90\\xc9\\xf3\\x54\\xec\\xdc\\x10\\x02\\x53\\x9d\\x46\\xa0\\x4e\\xf8\\xad\\x41\\xfa\\x76\\xe7\\x97\\x3e\\x4d\\xec\\xf7\\x6e\\xe3\\x00\\x86\\xc4\\x9d\\xf9\\x5c\\xfb\\xee\\xc0\\xf7\\x14\\x2b\\xd0\\xcc\\xfa\\xcb\\x49\\x21\\x71\\x4b\\x72\\xad\\x14\\x4e\\x8b\\xe7\\xd4\\xb8\\xdc\\xd8\\x92\\x5f\\x77\\x0d\\xdc\\x99\\x1e\\xdb\\x74\\xe2\\x6a\\x73\\xfc\\x4a\\x18\\x37\\x21\\xcb\\x5c\\x5d\\x1d\\x19\\x9e\\x09\\xd4\\xc6\\x7d\\x99\\x06\\x49\\xf1\\x12\\x45\\xb6\\x0e\\x12\\x65\\x6e\\x82\\x54\\xe7\\x37\\xdf\\xe8\\x26\\x5a\\xab\\xf9\\xc6\\xfd\\x6b\\xa9\\x75\\xdd\\x57\\x6b\\xdb\\xfd\\x27\\x45\\xa7\\x47\\xc7\\xb1\\x91\\xed\\x2b\\xd4\\x5b\\x86\\x77\\x5c\\x6d\\x8d\\xde\\x94\\x78\\xe4\\x08\\x51\\xf5\\x40\\x64\\x08\\x77\\x1a\\x38\\x97\\x68\\x18\\xa9\\x68\\xbe\\x4c\\x98\\x2d\\x36\\x99\\x92\\x71\\x69\\x84\\x1c\\x71\\xd4\\xa6\\xe8\\x3a\\x48\\x72\\xb9\\x98\\x14\\x7c\\x41\\x09\\x86\\x91\\x57\\xac\\xba\\x3e\\x04\\x96\\x98\\xbf\\xb3\\x09\\x48\\x3b\\xfc\\x8b\\x1a\\x07\\xff\\x0e\\x52\\xed\\x7b\\x49\\xff\\x6c\\x57\\xb3\\xb9\\x67\\xc5\\xe4\\x38\\xda\\x3b\\x55\\x6e\\x7c\\xb2\\x68\\x66\\x59\\x54\\x25\\x12\\x66\\xc2\\xe0\\x12\\x28\\x28\\x74\\xb9\\xfa\\x82\\x2f\\xea\\x87\\x1d\\xac\\xa5\\xbd\\x8d\\xc4\\x2d\\x7c\\x43\\xc6\\x01\\xd6\\xa5\\x79\\xfd\\xbe\\xf7\\x72\\x58\\x19\\x2d\\xbf\\x54\\xc0\\x05\\x19\\x79\\x4e\\xe3\\x79\\x6a\\xcc\\x23\\xc3\\x9e\\x97\\xc6\\x77\\xb0\\x1a\\x5d\\x36\\x87\\xc5\\xeb\\x84\\xcb\\x29\\x6d\\x55\\x0e\\x9f\\xdb\\x64\\x8e\\x97\\x0a\\x62\\xde\\x48\\xad\\x6e\\x43\\x09\\x97\\xdb\\xd8\\xe2\\xd8\\xf7\\x53\\xdd\\x58\\xc6\\x6e\\x92\\x75\\xef\\xfb\\xf2\\xd9\\xae\\xe7\\xd1\\x4e\\x91\\x3c\\xff\\xc9\\x78\\x18\\x8d\\x7a\\xa4\\x99\\x4b\\x3c\\x8f\\xfd\\xec\\xf4\\x51\\x3c\\x0a\\x25\\x3f\\x22\\xd8\\x6e\\x2a\\x0e\\x77\\xe7\\xf2\\x1d\\x02\\x36\\xd1\\xc4\\xbb\\x08\\x64\\x2e\\x4d\\x34\\x0f\\x59\\x02\\x0a\\xb5\\x8f\\x6b\\x73\\xa8\\x70\\x49\\xd6\\xfe\\x27\\xd8\\xf2\\x02\\x6a\\x62\\xd2\\xe9\\x5f\\x65\\xe5\\xed\\x0b\\xd5\\xe2\\x9f\\xd4\\x64\\xe8\\x14\\x51\\x8a\\x74\\xca\\xaa\\x0e\\x11\\xb8\\x14\\x7e\\x35\\xea\\xfd\\x5a\\xc4\\x7f\\xf9\\x50\\x5a\\x4a\\x5b\\xf9\\x66\\xcb\\x2d\\xfb\\xbb\\x35\\x59\\xef\\x8d\\xe5\\x1f\\x19\\x31\\xfd\\x9f\\xf8\\x30\\x17\\xf2\\xbf\\xed\\x0f\\xe5\\x8a\\xd0\\x8a\\x66\\x7f\\x39\\x5f\\x66\\x9d\\xc6\\x50\\x38\\x7c\\xc6\\xaa\\x11\\x70\\x05\\x6c\\x2f\\x46\\x9b\\xc1\\x99\\xe7\\x51\\xf2\\x3d\\x22\\xda\\xcc\\x1b\\xcc\\x0b\\xac\\xe5\\x2f\\x0b\\x2c\\x7c\\xeb\\x13\\x7e\\x5b\\x38\\x35\\x37\\xb1\\x30\\xdb\\x82\\xbb\\xd8\\xf5\\x19\\x8a\\xf8\\x7c\\x23\\x70\\xec\\xba\\x63\\x9d\\x0f\\xe0\\x2b\\xce\\xbb\\x1c\\x23\\xb6\\x27\\x43\\xf0\\x98\\x83\\x85\\x79\\x45\\xc6\\x76\\x5a\\x9b\\xdd\\x85\\x8e\\x48\\x8a\\xe3\\x2f\\x53\\x35\\xdc\\xc9\\x47\\xc5\\x7d\\x59\\xce\\xfa\\x4a\\x27\\x53\\x42\\x72\\x70\\x44\\x90\\x0d\\x80\\xa8\\xd8\\xff\\x74\\x53\\x0c\\x0f\\x7e\\x53\\x87\\xe5\\x5a\\xdb\\xb8\\xe3\\x0b\\xde\\x07\\xe7\\xb1\\x44\\x69\\xb4\\xff\\xd0\\xcc\\xf8\\xdb\\x50\\xf0\\x7a\\xcf\\x3e\\x03\\xa9\\x16\\x41\\x51\\xb3\\xf9\\xb1\\x5f\\xd8\\xa9\\x8a\\x55\\x92\\x83\\xfc\\x16\\xa4\\x33\\x8b\\xf8\\x16\\xee\\x4b\\x48\\x3e\\x90\\x91\\x86\\xdb\\xb1\\xce\\xfa\\xd2\\xeb\\xcb\\x4d\\xbe\\x37\\xe9\\xf2\\xb3\\xe0\\x58\\xd0\\x2a\\xd7\\x16\\xc5\\x36\\x18\\xd9\\xd6\\x2c\\x9a\\xcc\\x56\\x09\\x52\\xea\\xa1\\x93\\x08\\x23\\xa2\\x69\\x5b\\xe2\\x1a\\xfc\\xf3\\x0a\\xab\\x66\\xee\\xca\\xc0\\xc5\\x2b\\x7f\\x82\\x5c\\x9a\\xa7\\xf8\\xb9\\x42\\x00\\x9d\\x85\\x85\\x53\\xba\\x50\\xb1\\xff\\x1f\\xfa\\x53\\xb0\\xe7\\xfd\\xe8\\xfe\\x99\\xec\\x45\\x77\\xee\\x99\\xd4\\x59\\x43\\x54\\xbe\\xef\\x20\\x7b\\xc0\\x3d\\x4c\\xdb\\x5f\\xb2\\x41\\xe4\\x0b\\x31\\x2b\\x0a\\x7f\\x83\\x2e\\x65\\x84\\x28\\x48\\x38\\x06\\x94\\x31\\xb7\\x3d\\x12\\x02\\xbe\\x50\\x2f\\x83\\xd6\\xaf\\x10\\xaf\\x47\\x1b\\xfe\\xe0\\xdb\\xe0\\x6b\\x3d\\xef\\x5f\\xae\\x34\\x88\\xdf\\xe1\\xd4\\x4d\\xba\\x15\\xa4\\xf0\\xcc\\x29\\x31\\xd0\\xe7\\x5a\\xa1\\xc9\\x31\\x92\\xf0\\x29\\x31\\xf7\\xa9\\xda\\x8d\\x08\\xed\\xbf\\x47\\x82\\xc8\\x6e\\x9a\\x71\\x9f\\x4d\\xa2\\x13\\xa8\\x20\\xd3\\x1b\\xb5\\x73\\x92\\xa1\\xc9\\x82\\xa5\\x44\\x13\\x1b\\x21\\x69\\xc8\\x6a\\xb4\\x8b\\xd1\\xf5\\x03\\x07\\xa7\\x24\\x89\\xa6\\x19\\x2f\\xcd\\x0e\\xc0\\x39\\x5d\\x59\\xbc\\xea\\xc9\\x12\\x0b\\xa4\\xa3\\xa4\\x18\\x7a\\x18\\xae\\x3b\\xdd\\x37\\xe6\\x71\\x91\\x77\\x96\\x59\\x46\\x67\\x39\\x8d\\xff\\xbd\\x14\\xfd\\xfa\\x62\\x92\\xa9\\xc7\\xed\\x38\\x5a\\xa8\\x21\\xe2\\x73\\xba\\xb9\\x3a\\x52\\x8e\\x50\\xe8\\xfb\\xf8\\xf0\\x0a\\xa1\\xcf\\xe2\\xf7\\x98\\x98\\xc6\\xe1\\xd1\\x7f\\x39\\xc1\\x3a\\xde\\xa1\\xf4\\xab\\x7f\\x82\\x99\\x2a\\x11\\x16\\xc7\\x26\\xfb\\x50\\x1b\\xe7\\x4e\\xcc\\x6b\\xa7\\x5d\\x06\\xe3\\xe3\\x6f\\xce\\x76\\x8f\\xcc\\x9b\\xa1\\xaa\\x21\\xfa\\xc0\\x49\\x5a\\x1c\\xbc\\x2b\\xa3\\x4e\\x4b\\x31\\x35\\xe2\\x8c\\xf6\\x63\\xdd\\x90\\xaf\\x29\\x92\\xa9\\x79\\xb2\\x09\\x99\\x37\\xc4\\xd7\\x0b\\xcf\\x9f\\xd3\\xf2\\xf2\\x72\\x23\\xe6\\xd5\\x89\\x31\\x1f\\x2e\\x68\\x57\\x85\\xa2\\x1a\\x22\\x48\\x66\\xd0\\x2d\\x79\\xb4\\xb1\\x27\\x08\\xfa\\x2a\\x26\\x4d\\x74\\xe3\\x20\\x08\\x5c\\xa6\\x28\\xc0\\xa6\\x8b\\x1e\\x79\\x3f\\x6a\\x5a\\x0d\\x34\\xaf\\x1a\\x76\\xdc\\x3f\\x87\\x9a\\x5c\\x5a\\x2e\\x6c\\x19\\xf3\\x82\\x22\\xe5\\x05\\xe5\\xaf\\xe0\\x14\\xe7\\x85\\x81\\x8e\\x82\\x15\\x6a\\x8c\\xb6\\xb4\\xb2\\x34\\x62\\x43\\x3e\\x65\\xc6\\x26\\x60\\x4e\\x4e\\x93\\x8d\\xeb\\x13\\x0a\\x4d\\x5c\\x58\\x25\\x0c\\xf3\\x50\\x85\\x8e\\xed\\x9b\\x5f\\x5c\\xc5\\x2d\\x46\\x66\\xa6\\xee\\xdf\\x35\\xc5\\x6a\\x5c\\xb1\\x0d\\xd9\\xfb\\x7b\\x82\\x95\\xa2\\x40\\x6d\\xad\\xcb\\xf7\\x10\\xed\\x36\\x70\\xc8\\x70\\xcb\\x7b\\x72\\x8f\\x93\\x4c\\x66\\x72\\xa5\\xe1\\x76\\x6f\\xe6\\xde\\xf7\\xf5\\xfb\\x2b\\xf3\\x2b\\xb9\\x77\\x16\\x2b\\xb0\\x3f\\x39\\xaf\\xc1\\x4c\\x74\\xa6\\x1c\\x2b\\x61\\x59\\x61\\xa1\\x2c\\x06\\x2f\\x97\\x60\\x08\\x6a\\xb6\\xc2\\x38\\x6e\\x41\\x75\\x21\\xaa\\xac\\xde\\x63\\x83\\x3c\\xe9\\x82\\xec\\x6d\\x9b\\xe3\\x89\\xc2\\x42\\xfe\\x17\\xfb\\x9f\\x29\\x0a\\xb7\\x74\\x7b\\xab\\x94\\xae\\xfc\\x4c\\x81\\x7f\\x33\\x5b\\x1b\\xc2\\xee\\xbf\\xfc\\xcb\\xbf\\x28\\x3e\\xbd\\xfd\\x9c\\xf4\\x3e\\x9e\\x3f\\x95\\xaf\\x75\\xdc\\xef\\x3b\\xaa\\x74\\xc6\\x22\\xdd\\x93\\xfc\\xec\\x9a\\x04\\xc2\\xef\\xcb\\xb1\\xc0\\xa7\\xb8\\x23\\xd9\\xf8\\xc7\\x6d\\xc4\\x1d\\x6d\\xc2\\xb9\\x65\\x4c\\x9c\\x35\\x56\\x2f\\xef\\x4a\\x97\\xac\\x94\\x9b\\x72\\xb6\\x18\\x0a\\xa0\\x5c\\x8a\\x82\\x23\\x94\\x79\\xcd\\x9c\\x58\\x0c\\xe3\\x2d\\x2f\\xce\\xe7\\x49\\xa7\\x45\\x98\\xec\\x26\\x9a\\x5b\\x43\\x60\\x15\\x17\\x95\\xb3\\xeb\\xc5\\x86\\x06\\x42\\x53\\xab\\x0d\\x06\\x09\\x03\\xab\\x3f\\x77\\xc9\\x3a\\x03\\x16\\x1c\\x7b\\xec\\x5f\\x7e\\xc3\\xb2\\xbf\\x62\\x5e\\x99\\xe7\\x7f\\xfc\\x41\\xac\\x73\\x78\\x38\\xed\\x67\\x99\\x03\\x67\\x8f\\x81\\x13\\x1d\\xfd\\xe3\\x4f\\x5c\\x4d\\x01\\x7f\\x05\\x23\\xac\\xae\\x47\\xa7\\x4b\\x6b\\x1a\\x12\\x9c\\xa4\\xb0\\x08\\x51\\x3b\\x65\\xde\\xae\\xe6\\xff\\x63\\x4a\\xaf\\xa3\\x71\\xb1\\x60\\x66\\x29\\x91\\x26\\x25\\x94\\xb5\\x52\\x4a\\x4e\\x1a\\xa3\\xcd\\xea\\x07\\x63\\x60\\x23\\xab\\x7b\\x7b\\xb4\\x20\\xc5\\xc7\\xdd\\xf8\\xad\\x46\\x2e\\xb6\\x3b\\xaa\\x63\\xae\\xa4\\x95\\x7c\\x7d\\x94\\xb6\\xe7\\x84\\x96\\x69\\xe8\\x38\\xb2\\xbb\\x83\\xd8\\xb5\\x43\\xc5\\x17\\x62\\x4b\\x6c\\x8e\\x3d\\x1b\\x2e\\x0c\\x4a\\xe9\\x72\\xab\\x39\\x2a\\x06\\x04\\x53\\x29\\xf7\\x80\\x89\\xf4\\xef\\x15\\x59\\x31\\xa8\\x5a\\x83\\xbe\\xbc\\xcf\\x08\\x26\\x75\\xa7\\xed\\xc3\\x95\\xaa\\xa7\\x6f\\xd7\\xab\\x3d\\xa6\\x39\\x2a\\x9a\\x0c\\xda\\xa5\\x3d\\xaf\\x93\\x65\\x97\\x59\\xbe\\xb3\\x5f\\x33\\x4e\\x5c\\xf8\\x1a\\xf9\\x5e\\xde\\x0b\\xa3\\x9d\\x8b\\x3e\\x73\\x9e\\xaf\\x2d\\xcf\\x58\\x04\\x5e\\xdb\\xf7\\x67\\x98\\xd3\\x7a\\xcd\\x80\\x9f\\x30\\xdc\\x70\\x12\\x52\\xff\\xea\\x54\\xd8\\x2f\\xe1\\xd6\\xe9\\x62\\x1d\\x76\\x63\\x01\\x37\\x5d\\xa1\\x4f\\x0c\\xd9\\xdc\\x28\\xca\\x95\\xa4\\xd5\\x68\\x82\\x63\\x0d\\xa6\\xa5\\x01\\xf5\\x14\\xf2\\x8c\\x42\\xc2\\x88\\xc9\\xc0\\x64\\xec\\xd3\\x19\\x2d\\x1f\\x25\\xa6\\xca\\x2e\\xfc\\x7d\\x2a\\x39\\x9a\\x52\\x56\\x67\\x74\\x66\\xb6\\x65\\xc9\\x86\\xd8\\x30\\xc1\\xa8\\xad\\xf0\\x86\\x58\\xe3\\x34\\x21\\x13\\x9d\\x75\\xaa\\xea\\x7f\\xf2\\xa7\\xf9\\x4f\\xe2\\xdd\\x46\\x4f\\xd5\\x11\\x06\\xeb\\xde\\xdf\\x85\\x1a\\x2b\\xa3\\x7b\\x99\\x15\\x01\\x6e\\x65\\x5f\\xe9\\xfe\\x15\\x2f\\x92\\x2c\\xed\\xcb\\x57\\xb3\\xba\\xc5\\x7d\\xdf\\x9e\\x22\\xda\\xdf\\x73\\x5d\\xbf\\x3c\\x9e\\xe6\\x96\\x10\\x12\\xae\\x6e\\x19\\xf8\\x43\\x3e\\x41\\x9e\\x60\\x4e\\xd6\\x24\\x3b\\x64\\x92\\x18\\xe5\\xc6\\xbd\\x93\\x60\\x89\\x14\\x0f\\xfe\\x90\\xf5\\xfc\\x06\\xbd\\x60\\x6a\\xc9\\x3c\\x3e\\x01\\xeb\\xf4\\xdd\\xd6\\x09\\xe2\\x59\\x33\\x4e\\xc5\\x70\\x89\\xb2\\x74\\x4e\\x4a\\xea\\x3e\\x3e\\x11\\xb4\\x8b\\x16\\xad\\x59\\x20\\x65\\xd1\\xfc\\xe6\\x73\\x69\\xd8\\x78\\xb3\\x7b\\x43\\x62\\xe0\\x73\\xf7\\x63\\xf7\\xf9\\x34\\xc9\\xd9\\x79\\x23\\xff\\x8c\\x70\\x78\\xbc\\x7d\\xea\\xda\\x0d\\x70\\x5b\\xf2\\xf0\\xe8\\x9d\\xfc\\x64\\xa8\\x56\\xe9\\xc5\\x5a\\xc5\\x41\\x65\\x77\\xac\\x59\\xfb\\xa8\\x27\\x1f\\xd0\\x25\\x13\\x6b\\x09\\x14\\xed\\xb1\\xae\\x4a\\xb2\\x5e\\x14\\x9b\\x55\\xba\\x23\\xbd\\xcc\\xdb\\xa2\\xd0\\x94\\x9b\\x82\\x46\\xfb\\x51\\x6e\\x4d\\x4f\\xc9\\xff\\x79\\x9e\\x26\\x66\\xeb\\x04\\x67\\x35\\xcf\\x17\\x0b\\x6b\\x4d\\x8c\\x10\\x65\\x91\\x81\\x2b\\x6b\\xd2\\xa5\\xeb\\x82\\xfd\\x94\\xad\\x57\\x58\\xce\\x20\\x08\\x1c\\x3d\\x6a\\xeb\\x75\\x2d\\xc4\\xfc\\x62\\xbb\\x55\\x15\\x64\\x8b\\x68\\x96\\x26\\xea\\xb9\\x5d\\x78\\x6f\\x62\\x78\\x24\\xde\\x3a\\xf5\\x5a\\x23\\x76\\x7d\\xdd\\x7b\\xb4\\xe1\\x9f\\xc7\\xfa\\x90\\x13\\xa0\\x52\\x38\\x22\\x11\\x2c\\xfa\\xa9\\x4b\\x79\\x2c\\x15\\x12\\x1d\\xea\\xce\\xc4\\x4a\\xb1\\x6a\\x27\\x99\\x94\\xab\\x62\\xca\\x44\\x75\\xdf\\x09\\x0e\\xa7\\x78\\x2c\\x16\\x0d\\xea\\xb5\\xc0\\xb9\\xa4\\x95\\x1f\\x89\\xfe\\x8a\\x0e\\xf5\\xf5\\x4f\\xb0\\x86\\xe2\\x2d\\x52\\x34\\x48\\x1a\\x17\\x9d\\x90\\xac\\x90\\x7d\\x57\\x6d\\xb1\\x1b\\x92\\x09\\xd3\\x82\\xc1\\xd8\\xdb\\x32\\x2a\\x3c\\x08\\xf5\\xd5\\x43\\x50\\x92\\x6d\\xc9\\xcd\\x49\\x04\\x09\\x83\\xc2\\xbf\\x80\\x21\\xc6\\x41\\x1c\\x57\\xd9\\x10\\xcd\\x40\\xc9\\xc1\\xf9\\x97\\xd2\\x14\\xfa\\xa6\\x68\\x2d\\xa7\\x3a\\x3d\\xd6\\x32\\x03\\xdf\\x29\\xca\\x08\\x2a\\xe4\\xe2\\x01\\xa5\\x5a\\xe1\\x82\\xb1\\x64\\x44\\x43\\x65\\x54\\x70\\x9c\\x29\\x9f\\xb3\\x17\\x54\\x4b\\x03\\x1b\\x05\\x06\\x48\\xa1\\xf3\\x6e\\xd5\\xd3\\x70\\xaa\\xfe\\x45\\xc0\\x5e\\xeb\\xe2\\x6e\\x34\\x6b\\x62\\x4b\\xf1\\xba\\xb2\\x7a\\x53\\x54\\xda\\x74\\x40\\x4f\\xaf\\xfd\\x53\\xac\\x84\\xbe\\xdf\\xc5\\xc4\\x2f\\x99\\x29\\x03\\x63\\x81\\xd8\\x95\\x3e\\x7f\\xa9\\x00\\x91\\x3e\\xe5\\xe9\\xd2\\x81\\x90\\x6f\\xab\\x0b\\xde\\xcf\\x1a\\x0a\\xea\\xab\\xa7\\x80\\x80\\xed\\xfb\\xda\\xaf\\x3d\\xcf\\xf3\\xbe\\x2f\\xac\\x4e\\x03\\xc2\\xa6\\x1c\\xbd\\x51\\x33\\xd3\\x96\\x90\\xd8\\xc9\\xd0\\x6c\\xf8\\x5b\\xbc\\xd3\\x5d\\x0e\\x74\\x3a\\xb1\\xdb\\x18\\x65\\x25\\x3e\\x1c\\x74\\x78\\xd5\\x44\\x58\\xde\\xb4\\x18\\x2e\\x49\\x7e\\xa6\\x62\\x2e\\xf9\\xfb\\x01\\x5b\\x54\\xd8\\x05\\xd4\\x64\\x85\\x28\\x84\\x61\\x25\\xd8\\x37\\x0d\\xe5\\xf2\\x00\\xb2\\x6d\\x13\\xce\\x25\\x6d\\xe4\\x76\\x54\\xda\\xc1\\xb5\\x60\\x62\\x29\\xb6\\xd4\\x59\\x4c\\x88\\x0a\\x2e\\x90\\xa7\\x36\\x5c\\x29\\x9b\\x13\\xca\\x2e\\xec\\xd7\\x7f\\xc4\\x2f\\xee\\x1b\\x20\\x1a\\xca\\x05\\x45\\x12\\xfe\\x46\\x78\\xa6\\x2a\\xe5\\xa9\\x38\\xed\\x87\\x9f\\x28\\x22\\xe9\\x87\\x39\\x08\\x87\\xcd\\x08\\x78\\x9a\\xce\\x43\\xe1\\x08\\x3b\\x6d\\xc2\\x69\\xd6\\x91\\xaa\\x71\\x57\\x2e\\x1b\\x74\\x2f\\x1e\\x63\\xee\\xb4\\x6a\\x1b\\xb8\\xf4\\xfa\\x05\\x7d\\x04\\x39\\xa3\\x6c\\x82\\x7d\\x32\\xd8\\x3a\\x05\\x45\\xb3\\xae\\xfa\\x04\\x03\\x5d\\x4a\\x1a\\x48\\xe3\\xae\\x9a\\xf5\\x9b\\x8c\\xef\\x5e\\x2f\\xe4\\x0b\\x4a\\x82\\x45\\x0b\\x2b\\x57\\x5a\\x66\\xac\\xdb\\xbd\\x46\\x60\\xd5\\x54\\x7d\\xb0\\x1f\\xee\\x2f\\xb3\\xa4\\xe7\\xcb\\x18\\x77\\xb9\\x62\\x83\\xc6\\x24\\xbd\\x8a\\x48\\x24\\x99\\xb7\\x46\\xed\\xe3\\xfc\\xa6\\xb4\\x24\\x13\\x3c\\x62\\x6d\\x0b\\xec\\xd1\\xe3\\x18\\xf8\\xd7\\x3c\\x57\\x65\\xd4\\x53\\xb7\\x23\\xff\\x50\\x36\\x3a\\x08\\x68\\x5e\\xb1\\x31\\x75\\x7f\\x52\\x2a\\x21\\x37\\x4f\\x46\\xed\\xc0\\x19\\x34\\x6b\\xf4\\x81\\x62\\x85\\xeb\\x0e\\xc1\\x96\\xb4\\x96\\xb6\\x90\\x51\\x35\\x2e\\xa2\\x9d\\xca\\xe9\\xf5\\x06\\xf1\\x35\\x1a\\x85\\x7c\\x8d\\xd0\\x10\\x19\\x78\\x12\\x76\\x4d\\x78\\xdf\\x33\\x59\\x30\\xa4\\x65\\x39\\x0e\\xf0\\x7c\\xbf\\xce\\x7d\\xe7\\x79\\x6e\\xab\\xfb\\xec\\x5a\\x68\\x7d\\x41\\x5f\\xd1\\x63\\xcc\\x32\\xb9\\x92\\x0d\\xbb\\x91\\x61\\x53\\x6d\\xa8\\x68\\xf8\\x96\\xd3\\xc4\\x1b\\x2f\\x63\\xb8\\x6a\\xcf\\x30\\x3b\\xf0\\x81\\x10\\x99\\xe8\\xea\\x19\\x0f\\x4f\\x62\\x37\\x36\\x82\\x6b\\xe2\\xd0\\x98\\x9a\\xe1\\xa7\\x15\\x64\\xa6\\x02\\xa2\\x75\\xdc\\xe8\\xae\\x2a\\xcc\\x94\\xc1\\x7d\\x6d\\x3f\\x4d\\xb1\\x3f\\xdd\\xee\\x32\\xe7\\x92\\xc3\\x09\\x65\\x0d\\x7c\\xe8\\x69\\xb8\\x55\\xf1\\x9d\\x42\\xbe\\x28\\xdc\\x67\\xd8\\x76\\x12\\xa6\\x57\\x05\\xde\\x1f\\x36\\xbb\\xe9\\x73\\x26\\x56\\x3b\\xd4\\x5a\\x44\\xeb\\xae\\xfd\\xab\\x3d\\x1f\\xcc\\x39\\xba\\xd4\\x0c\\xa4\\x9d\\x85\\x02\\xdc\\xe8\\x4f\\x7e\\x52\\xe0\\x75\\xee\\x6f\\x0e\\x51\\xf8\\x78\\xf3\\xd0\\x40\\x07\\xc9\\x3e\\xa1\\xa9\\x21\\xb3\\x0a\\x3a\\x4a\\x86\\x4e\\x05\\xf5\\x4e\\xa8\\x9d\\x67\\xeb\\xfa\\x2f\\x23\\x5e\\x96\\x50\\x49\\x66\\x4d\\xc1\\xd3\\x12\\x2e\\xdb\\x5b\\x48\\x04\\x55\\x89\\xbd\\x66\\xea\\xa7\\xab\\x05\\xb1\\xd7\\x3d\\xf7\\x66\\x68\\x10\\x7f\\x12\\x7e\\x62\\xab\\x60\\xb6\\x6a\\xd5\\xaf\\xb6\\x3b\\x46\\xe0\\x08\\xfc\\xc6\\xa1\\x47\\x30\\x28\\xa0\\x65\\x40\\xa0\\x90\\x02\\x43\\x75\\x9a\\x9c\\x16\\xdb\\xd5\\x8f\\xda\\xe8\\x92\\x3d\\x1d\\x73\\x2a\\x69\\x18\\x4c\\x4b\\xbf\\x47\\x3e\\x17\\xa3\\x79\\x3a\\xad\\x41\\x87\\xfd\\x60\\x54\\xe5\\x39\\x50\\x5d\\xc5\\x1b\\xa5\\xe8\\xa1\\xf7\\x5c\\xcc\\x28\\xcd\\xe9\\x45\\xdf\\x51\\x67\\x3a\\x7d\\xc8\\x65\\xb7\\x48\\x7d\\xe6\\xa8\\x17\\x21\\xb1\\x64\\x56\\xdc\\xb0\\xf2\\x10\\x8d\\xb6\\x62\\x18\\x21\\x4d\\x34\\xd3\\x1c\\x6c\\xde\\x5e\\x35\\xa4\\x4b\\xd5\\x6f\\x35\\xcc\\x3c\\x6e\\xcd\\xcb\\x9d\\x91\\x6f\\x6d\\xc4\\x30\\x86\\xff\\xe3\\xe1\\x57\\xa1\\x66\\xf0\\x5a\\xec\\x9f\\xde\\xb2\\xcc\\x58\\x40\\xc0\\x30\\x39\\x53\\x0a\\x13\\xf0\\xb3\\xd6\\x9c\\x27\\x2f\\x65\\xa9\\xda\\x67\\x85\\xc2\\x74\\x12\\xa2\\x97\\x96\\xfa\\x63\\x76\\x5e\\x21\\x8c\\x13\\x54\\x3f\\xcc\\x65\\x48\\x6e\\x7b\\x5e\\xb7\\x20\\x4b\\x96\\xee\\xa7\\x7f\\x68\\xc3\\xb3\\x54\\x37\\xb4\\x44\\x12\\xd6\\x81\\xb0\\x7e\\x28\\x95\\xe5\\x6f\\x99\\x39\\x6a\\xd3\\x8b\\x68\\xa4\\xdd\\x23\\xc5\\x71\\x08\\x00\\x4a\\x50\\x04\\xaf\\x99\\x11\\x37\\x27\\xce\\x95\\xd5\\x70\\x1e\\x9e\\x1d\\xe7\\x9a\\x32\\x95\\xca\\x86\\x83\\x8e\\x61\\xc0\\x36\\x5a\\xc8\\x26\\x8d\\x73\\x61\\x12\\xe1\\x36\\xf7\\x26\\x67\\xa5\\xc0\\xc9\\x82\\x24\\x85\\x96\\xf4\\xb2\\xfd\\x91\\x7a\\xeb\\x15\\xae\\x4c\\x6e\\xf8\\x2b\\xe2\\xa4\\xfd\\x5b\\x0c\\x49\\xd7\\xfd\\x2f\\x21\\xe7\\x28\\x3a\\x89\\x57\\xd0\\x1b\\x00\\x26\\x0d\\xa0\\x62\\x53\\x52\\x0f\\xdf\\x51\\xba\\xd3\\x56\\x99\\xb9\\x5d\\x8b\\x7e\\xe2\\x7e\\xba\\x41\\x13\\xad\\x35\\x56\\xfa\\xdc\\x74\\xdc\\x7e\\x41\\xdd\\xf6\\x78\\xc4\\xbc\\x08\\x87\\x12\\xf4\\xdb\\x2f\\x9c\\x5d\\x26\\x48\\x3c\\x4a\\x3c\\xbd\\x5e\\x9b\\xb3\\x7f\\xec\\xbd\\x95\\x55\\xbf\\xec\\x89\\x11\\x35\\x66\\x7e\\x6d\\x8c\\x05\\xff\\xf2\\xd9\\xa0\\xda\\x1d\\x0b\\x65\\xf1\\x96\\xf0\\x95\\x6e\\x35\\x0e\\xe3\\x6a\\xe2\\x20\\x5e\\x9f\\xa6\\x34\\x48\\x4e\\xb8\\x0f\\x1a\\xa4\\xec\\xb3\\xf0\\x1d\\x2b\\x86\\x58\\x3a\\x5d\\x1c\\x7c\\x21\\x44\\x2b\\x3f\\x1c\\xad\\xd7\\xca\\x6c\\x2c\\x86\\x90\\x4c\\xc6\\xc3\\x76\\xd4\\xa1\\x9e\\x4e\\x18\\x59\\x67\\xa0\\x2d\\xec\\x7b\\x9e\\x4a\\xc0\\x63\\xff\\x68\\xbf\\xbf\\x6e\\xd2\\xf8\\xb2\\x14\\xfd\\xd4\\x63\\xe8\\xa9\\xbe\\x42\\x1a\\xe1\\x88\\xd9\\xd3\\xf5\\x7c\\x64\\xca\\xc0\\xe6\\x45\\xd2\\xac\\x85\\xca\\x83\\xfa\\xf1\\xa6\\x80\\xde\\x08\\xbb\\x88\\xc6\\xe6\\x45\\x78\\x0b\\xf3\\x9a\\x79\\x21\\x92\\x45\\xc4\\xe2\\x19\\xef\\xc4\\x8f\\x09\\x4a\\x77\\x37\\x09\\x3b\\xea\\x35\\x5e\\xab\\x4b\\x18\\xfb\\x80\\xfd\\xa1\\xa6\\x21\\x11\\x84\\x2e\\xfc\\x7b\\xc6\\xb8\\xea\\xb4\\x45\\x7b\\xaf\\xb1\\xfd\\x58\\x76\\xf5\\x1f\\xd2\\xe7\\x5c\\x8b\\x8a\\xf5\\x33\\x7d\\x52\\xc4\\x53\\x1f\\xd1\\xeb\\xfa\\xe8\\x1f\\x77\\x0b\\x03\\x63\\xa6\\x63\\x66\\xb4\\x63\\x65\\x2a\\x56\\xe8\\x2b\\x84\\xa9\\xc8\\x44\\x33\\xcb\\x03\\xd1\\x4d\\x64\\x79\\x91\\x42\\xc7\\xc9\\x14\\xd2\\x1c\\xe7\\xe2\\x86\\xa4\\x50\\x15\\x10\\x56\\xf2\\xa5\\x0d\\x58\\x54\\x79\\x31\\x32\\xd8\\xb2\\xdf\\x8a\\x9c\\x18\\xa2\\x7d\\xda\\xd9\\xa5\\xe0\\xd0\\xc2\\x45\\xc2\\xfa\\x62\\x51\\x81\\x69\\xac\\x85\\x08\\x23\\xb1\\x3f\\xcb\\xf0\\xff\\x88\\x3c\\x8a\\xc8\\x6d\\x15\\xb2\\x5d\\x8b\\x39\\x8b\\x27\\x81\\xc1\\x28\\x14\\xe7\\x84\\x15\\x2e\\x8f\\xe0\\x77\\xb1\\x77\\x74\\x51\\x6e\\x78\\x08\\x34\\xac\\x47\\xa7\\xa8\\xd3\\xd5\\x59\\x55\\x6b\\x7b\\xac\\x50\\x4d\\x25\\x7c\\x59\\x0f\\x85\\x9f\\xa9\\xd7\\xf2\\x9a\\x8c\\xc4\\xe8\\x96\\x12\\xf1\\xb9\\x0c\\xce\\x5c\\xe0\\xda\\x3d\\xbd\\x80\\xd4\\x60\\xc6\\xbc\\x95\\xa5\\x2d\\x25\\xf0\\x89\\x2c\\xce\\xc5\\x38\\xa4\\xbf\\x31\\x68\\xb5\\xdf\\xa9\\xde\\xb0\\x38\\x3a\\x58\\x15\\x9d\\x48\\x95\\x8b\\x64\\xe0\\xec\\xec\\x84\\x6e\\x70\\x15\\xa5\\x76\\x12\\xb1\\x25\\x4a\\x2f\\x96\\xe7\\x6a\\xff\\x8a\\x93\\x0e\\xa5\\x2e\\xaa\\xd9\\x02\\x02\\xfc\\x14\\x2f\\x2c\\x9d\\xaa\\x9f\\xaa\\x52\\x73\\x78\\x14\\x53\\xcb\\x4f\\xbe\\x18\\xae\\xa0\\xb5\\x79\\x14\\xcf\\x61\\x68\\x09\\xa4\\xb9\\x55\\xdb\\x16\\xa9\\xd6\\x07\\xd7\\x07\\xd4\\x4b\\x02\\xad\\x4b\\x4e\\xb5\\xd4\\x7c\\x14\\xbc\\x33\\x88\\x14\\xfb\\x4f\\x8d\\x6a\\x92\\xa3\\x94\\x59\\x10\\x22\\x70\\x70\\x37\\x50\\xaa\\xff\\x16\\xf1\\x68\\x5a\\x7e\\xe9\\xb0\\xb1\\xad\\xc9\\xf2\\xf8\\x3d\\x91\\x79\\xf8\\x3e\\x34\\x7d\\xbd\\xb5\\x79\\x5c\\xe8\\x3d\\xf0\\xd3\\x3a\\xe8\\x72\\xdc\\x3e\\x36\\x29\\x74\\xa9\\xdf\\xae\\x06\\xa4\\xaa\\x6c\\x42\\x2d\\x1e\\xe2\\xbc\\xb5\\x5a\\x44\\x57\\x62\\x12\\xf0\\x7e\\xdd\\xad\\x2a\\x39\\x78\\xf0\\xdf\\xbd\\xc1\\x48\\xd4\\x83\\x30\\xa8\\x97\\x60\\xca\\xf3\\x98\\x3a\\x2d\\x85\\x06\\x10\\xcf\\xb8\\x15\\x20\\x85\\x50\\xce\\xd2\\x6d\\xb9\\x50\\x80\\xd0\\xa1\\x3e\\x73\\xcc\\xc8\\x33\\xcc\\x7c\\xdf\\x11\\x43\\x55\\xde\\x1c\\xe1\\x3b\\x66\\xcf\\xec\\x7e\\xe4\\x09\\x0f\\x84\\x83\\xb2\\x0f\\x9b\\x6e\\x8b\\xb3\\x86\\xe4\\x02\\x2b\\xa1\\xe6\\x2e\\x1e\\x77\\xa7\\x0c\\x25\\x7b\\xe2\\x9b\\xe6\\x55\\x4d\\xe0\\xbb\\x1e\\x57\\x7b\\x0e\\xe7\\xbd\\x66\\x21\\x5f\\x21\\x3a\\xf6\\xa6\\x58\\xe7\\x16\\x9f\\x5e\\x11\\xf1\\x84\\xfa\\x98\\xdf\\xf0\\x36\\x35\\x10\\x7d\\xcf\\x10\\x33\\xc8\\xb9\\xf4\\xa6\\x45\\xc1\\x4a\\x1c\\xfb\\x87\\xaa\\x02\\x33\\xb0\\x66\\x74\\xbd\\x82\\xb8\\x9f\\x5e\\x54\\xb3\\x60\\x7f\\xd5\\x92\\x2e\\x37\\x1c\\x1d\\xe8\\xc4\\xab\\xa2\\x61\\x7c\\xd5\\xb0\\x83\\x07\\x34\\x9b\\x7e\\x20\\xd9\\x21\\x40\\xec\\x23\\xe4\\x21\\xeb\\x7b\\xf7\\xd7\\xa5\\xd4\\x3d\\xee\\xef\\xe2\\xb1\\xf3\\x41\\x50\\xe2\\x36\\x1b\\xc2\\xd4\\x6c\\x40\\x4f\\xf2\\x51\\xa1\\xf3\\x0b\\x82\\x85\\x43\\xa1\\xff\\x5e\\xfb\\xbe\\x49\\x46\\xc8\\xf4\\xbd\\x44\\xba\\xe8\\x3b\\xe7\\x79\\x94\\xa0\\x05\\xe5\\xbc\\xb3\\x7f\\xcf\\xaa\\xaa\\xed\\xd6\\xfe\\xa0\\x92\\x5f\\x13\\x38\\x17\\x60\\x3e\\x43\\x3a\\x54\\x68\\x36\\x40\\xf8\\x30\\x50\\xf0\\x6f\\x4c\\xba\\xdd\\x72\\xf2\\xd6\\xcd\\x21\\x9c\\xb8\\xf8\\xe1\\x0d\\x4a\\xa5\\x3f\\x0a\\xad\\x59\\x9c\\xd4\\xbb\\x8f\\xd5\\x64\\x59\\x9a\\x7b\\xc6\\x4b\\x3b\\x40\\x3d\\x32\\x1f\\x25\\x0b\\xaf\\x89\\x41\\x9e\\x4b\\x1c\\xae\\x7e\\xb9\\xf4\\xa4\\xf1\\x64\\xf5\\x72\\x52\\x98\\x7b\\x85\\x98\\x47\\x4b\\x80\\xa5\\xac\\xf6\\x8d\\xd8\\xf7\\xc1\\xe6\\x4b\\x91\\xfa\\xd0\\x2a\\xa0\\x68\\xcb\\xab\\x30\\x2e\\x9e\\x98\\x10\\xe4\\x48\\x2e\\x62\\x90\\xd3\\xb2\\xc1\\xf7\\x2b\\xf6\\xef\\x49\\x6a\\xab\\x91\\xe3\\xf0\\x7a\\x78\\x8a\\xa2\\x08\\xd1\\x4b\\x65\\x2c\\x64\\x81\\xed\\x67\\x4f\\xe5\\x93\\x52\\x24\\xb9\\x80\\xce\\xf2\\x5d\\xd1\\xb3\\x00\\xff\\x05\\x4d\\x50\\x1e\\x52\\xff\\xc3\\x80\\x04\\x5b\\x04\\x52\\x5e\\x9b\\x00\\x35\\x4c\\xae\\xba\\x04\\x63\\x28\\x9a\\xd4\\x35\\x61\\xd5\\xcc\\x0d\\x34\\xb8\\xc8\\x01\\x9f\\x79\\xea\\x60\\xab\\x21\\xfa\\x62\\xe0\\xbf\\x02\\x29\\x29\\x54\\xff\\xc9\\xe1\\xdf\\x70\\x0e\\x6d\\xcc\\x27\\x6c\\x98\\xcd\\xbb\\xee\\x85\\xd8\\x7c\\x04\\xbc\\xbb\\x1c\\x6f\\x48\\xea\\x9f\\x50\\x2f\\x0f\\xb8\\xc9\\x18\\x3b\\xaf\\x3f\\x52\\xbe\\x7a\\x58\\x46\\x8b\\x3d\\x55\\xd5\\xfc\\x78\\x7c\\x17\\x4d\\x78\\x22\\x26\\xf6\\x88\\x15\\xd0\\xfa\\x97\\x9a\\x24\\x15\\x10\\x77\\xf8\\x38\\xe2\\x8c\\xd8\\x4d\\xd9\\x9c\\x55\\xe0\\x78\\xcd\\x38\\x22\\xc1\\xe3\\x1a\\x6c\\x87\\x6c\\x97\\x6e\\x6e\\x94\\x4d\\xac\\x94\\x01\\x1e\\xd3\\x99\\xdc\\xdf\\xc7\\x94\\xa7\\x2c\\x12\\x99\\x41\\xdc\\x31\\xb1\\x8a\\x37\\xfb\\xb1\\x0c\\x17\\x69\\x2e\\x9d\\x77\\x73\\xbf\\x6c\\xd3\\xfc\\x27\\xa4\\x99\\xdc\\x36\\xa1\\x88\\xf2\\xa8\\xd9\\xeb\\x96\\x19\\x8c\\x32\\xaa\\x2f\\xfd\\x0f\\x53\\xe7\\xda\\xf2\\x3b\\x3b\\x24\\x63\\xa3\\xe3\\x8d\\xd5\\x9e\\xce\\xaf\\x36\\x7e\\x26\\x54\\x62\\x7a\\x7c\\xb7\\xbd\\xbb\\x48\\xf3\\x64\\x5c\\xd8\\x6c\\xab\\x9a\\xa8\\x0f\\x6c\\x96\\xf5\\x6f\\x0e\\x0d\\x1e\\x88\\xa7\\xc2\\x04\\xf2\\xbd\\xb5\\x23\\x54\\x22\\x8a\\x30\\xbb\\x63\\xd1\\x71\\x27\\x2b\\x87\\xa0\\x9f\\x36\\xe9\\x53\\x63\\x77\\xfb\\xcf\\x1f\\xe6\\xc9\\xc6\\xc1\\x2a\\x38\\x28\\xc2\\xd8\\x26\\xd1\\xaa\\x77\\x89\\x90\\x32\\x87\\x02\\xe5\\x89\\x23\\xaa\\x85\\x86\\xa3\\x86\\x5d\\x46\\x61\\x89\\x91\\xcb\\x79\\xff\\x0a\\x9f\\x86\\x30\\x8c\\xff\\x68\\xbd\\x51\\x69\\x72\\x5e\\x58\\xfc\\x6c\\xc3\\xe8\\x49\\xee\\xa9\\x0a\\x64\\x76\\x8b\\x78\\xc4\\x2a\\xb7\\xc5\\xa5\\xea\\x0d\\xb9\\x22\\x40\\xf2\\xba\\x17\\xd7\\xac\\xa3\\xc8\\xa7\\xe0\\x71\\x24\\x12\\x67\\x5c\\xfa\\xb9\\x9b\\x93\\x38\\x9f\\xa0\\x3d\\xa3\\x67\\x5f\\xea\\x2d\\x67\\x3f\\xb5\\x2f\\x62\\x8a\\xdb\\x39\\x64\\x44\\x30\\x03\\x15\\x60\\x06\\x77\\xd1\\x7e\\xa9\\xcc\\xba\\xb0\\x20\\xb4\\xc4\\xe5\\x9e\\x1d\\xf1\\x51\\x06\\x66\\x02\\x7e\\xb5\\x7f\\x84\\xe0\\x8e\\x0a\\x2e\\xb3\\x9e\\x3c\\x20\\x9a\\x29\\x94\\x4e\\x1b\\x87\\xf5\\x5d\\xcb\\x21\\xb1\\x17\\x33\\x9e\\x74\\xe3\\xde\\x5a\\x74\\xbe\\x33\\xee\\xe6\\xdc\\x35\\x59\\xdb\\x6b\\x3e\\x76\\x54\\xd9\\x0b\\x6f\\x61\\xe2\\xaa\\x86\\x6f\\xac\\xc7\\xb0\\x5e\\xb0\\x78\\x14\\xa4\\x03\\xfe\\x6d\\x3e\\xf5\\x3c\\xe9\\xf4\\x6f\\xf2\\x14\\xb3\\x7b\\xff\\x64\\xb8\\xd9\\xbc\\xc1\\xf5\\x57\\x42\\x71\\xf3\\x86\\xb8\\x06\\xea\\x41\\x71\\x32\\x8c\\xc1\\x68\\x33\\x4d\\xed\\xbc\\xda\\xd6\\xbf\\xb5\\x00\\xff\\x4b\\xb7\\x68\\x82\\x1b\\xbd\\xaa\\x92\\xa9\\x19\\x2e\\xc8\\xc2\\x67\\x7c\\x11\\xc6\\x01\\x54\\x7b\\xf5\\x1f\\xf4\\xf3\\x7b\\x6d\\xe5\\xac\\x63\\xfd\\xe0\\x19\\xb5\\x8d\\x11\\x96\\x74\\x43\\xaf\\x39\\xd1\\xe4\\x0f\\x2d\\xd0\\xa3\\xda\\xb6\\x5b\\xfb\\x36\\x2e\\xea\\xbd\\x40\\x95\\x81\\x09\\xb2\\xb4\\x16\\x6c\\xed\\xb4\\xd8\\xc6\\xf4\\xae\\x3f\\x6b\\x11\\xa9\\x93\\xf7\\xb0\\xdb\\x8a\\x1a\\x6d\\x95\\x02\\xff\\x0e\\xf7\\xcb\\x53\\xfe\\xe0\\x0b\\x81\\xdc\\x21\\xde\\xa2\\x11\\x6b\\x4c\\x62\\x7e\\x8d\\x63\\xe9\\xb4\\x93\\x1c\\x63\\x47\\xb1\\x6a\\x76\\xb3\\x14\\x72\\x92\\x81\\x19\\x42\\xfe\\xae\\x75\\xdb\\xa6\\x3d\\xe6\\x1e\\xb2\\xc1\\x55\\xad\\xc5\\x9a\\x86\\xfa\\xa5\\xc4\\x7d\\x26\\xa7\\xc7\\x1a\\xf6\\x85\\xcb\\x65\\xf8\\x28\\xfc\\xab\\xb4\\xf8\\xab\\x8a\\xa0\\x21\\x39\\x8a\\xfc\\x74\\x5a\\xed\\xb6\\xd7\\xe2\\xe7\\xa3\\x43\\xf8\\x14\\x52\\xb4\\x08\\x6d\\x00\\x96\\x69\\xa1\\x6e\\x41\\x07\\x54\\x8e\\x32\\x15\\x43\\xa6\\xb0\\xb3\\xc7\\xaf\\x22\\x89\\x3f\\x51\\x86\\xce\\xed\\xe3\\x9b\\x79\\x1f\\x09\\x27\\x4a\\x55\\x5f\\x24\\x73\\x4a\\xa3\\x22\\xf8\\x84\\x3f\\x14\\x30\\x93\\x85\\x03\\x0e\\x98\\x7f\\x64\\xf7\\x3b\\xd4\\x40\\x20\\x0c\\x16\\x2a\\xd5\\x60\\xf7\\xea\\x1b\\x39\\x1a\\x45\\x58\\x5c\\xa7\\xfa\\x6f\\xed\\xc4\\x87\\xeb\\x16\\xa5\\x2a\\x12\\xcb\\x59\\x0d\\x93\\xeb\\x47\\xf7\\x96\\x46\\xdf\\x72\\xab\\x06\\xd5\\x79\\xec\\x3f\\x82\\xea\\x3f\\x99\\x64\\x16\\x2a\\x0e\\x13\\x02\\x9d\\xab\\x75\\xb0\\xa8\\xc8\\x19\\xc9\\xfd\\xcb\\xb4\\xd5\\x96\\x64\\x4e\\xcb\\x8d\\x87\\xd8\\x71\\x13\\x15\\x71\\xd1\\x98\\x98\\xc4\\x2c\\x0d\\x45\\xad\\x61\\x2f\\xff\\x76\\x0d\\x4d\\x1e\\x06\\xc6\\x92\\xff\\xb4\\x43\\xe0\\xc1\\xd0\\xa4\\x66\\x90\\xbe\\xb1\\xec\\x46\\x72\\xb4\\x75\\xee\\xf3\\x1d\\xf5\\x7d\\xcf\\xb5\\x34\\x59\\x94\\x52\\x60\\x41\\xec\\x99\\x43\\xf5\\xb5\\xdf\\x6f\\x10\\xc8\\x66\\x95\\x38\\xb8\\x43\\xd1\\xd2\\xad\\xd1\\xaf\\xbf\\x00\\x32\\xf1\\x04\\xec\\xf7\\x2f\\x2f\\x2d\\x0f\\x98\\xf5\\xa5\\x57\\xf6\\x3c\\xee\\xf7\\x85\\x4a\\xdf\\x54\\x06\\x6d\\x71\\x01\\x97\\xf6\\x7e\\xa2\\x4e\\x26\\xe3\\x3d\\x1d\\xc5\\x45\\xb6\\xe3\\x2f\\x5d\\xf6\\xb6\\x02\\x05\\x45\\x07\\xab\\x43\\x91\\x0c\\x5d\\xfc\\x50\\xbd\\xd3\\xf5\\x98\\x4a\\x88\\xde\\xd5\\x89\\x08\\x86\\xcd\\x77\\x99\\x51\\x94\\xf6\\x6e\\x46\\x3f\\xa5\\x75\\x04\\x99\\xe7\\x24\\xc0\\x78\\x89\\x30\\x96\\x36\\x80\\xb0\\x56\\x60\\x94\\x9f\\x84\\xc7\\x0d\\x77\\xc3\\x0a\\xfa\\x33\\xa8\\x4f\\x24\\x8e\\x2a\\x2b\\x8d\\x59\\x85\\x26\\xad\\x50\\x51\\x47\\x44\\x51\\x39\\x44\\xb0\\x15\\x7c\\x52\\x6c\\x6b\\x06\\xf6\\x4f\\xf1\\xda\\xf2\\x66\\x32\\x2c\\x4b\\xeb\\xf3\\x8b\\xbc\\x6c\\x28\\x5f\\x8e\\x36\\xdf\\x11\\x51\\x5d\\x5f\\xef\\xd3\\xdd\\x14\\x54\\xa8\\x47\\xa3\\xe9\\xc4\\x01\\x14\\x7d\\x3e\\x9f\\xc3\\xc6\\xf9\\x2b\\x59\\x3a\\x99\\xf5\\xf3\\x29\\x8a\\xc9\\xa3\\xc5\\xd3\\xcd\\x5d\\xdb\\x5b\\x97\\x0a\\xb9\\xae\\x25\\x4e\\xdf\\xd1\\x83\\xeb\\xd4\\xa8\\xcd\\x20\\xc7\\xf6\\xda\\x02\\x35\\x36\\x0b\\xe8\\x62\\x1b\\xf1\\x6d\\x28\\x63\\x6d\\x41\\x1d\\x26\\x35\\x87\\x05\\x7b\\x23\\x33\\x4b\\x6b\\x0e\\x1f\\xb3\\x98\\x25\\xd4\\x5b\\xa2\\x6f\\x0c\\xc2\\x04\\x32\\xab\\x42\\xe4\\x99\\xfa\\x6b\\x38\\x8e\\xbd\\x84\\xf8\\x6f\\x21\\x92\\x22\\x6a\\x16\\xf7\\x09\\xb4\\x05\\x45\\x4e\\xd3\\xa6\\x4d\\xea\\x30\\xa5\\xe9\\x87\\x87\\xcb\\x0c\\xc4\\xd4\\x3e\\x6c\\x64\\x1c\\xfd\\x80\\xd5\\xc3\\x57\\x1a\\xf2\\x39\\x0b\\xf7\\x8b\\x69\\x17\\xa2\\x37\\xf5\\x6f\\xb1\\xc7\\xe1\\x3e\\x63\\xba\\x94\\xb1\\xcb\\xdb\\x1d\\x1c\\xda\\x59\\x3d\\x9c\\x3e\\xed\\x6c\\x96\\x05\\xeb\\x06\\x5b\\xce\\x2f\\xf0\\xd1\\x45\\x73\\x04\\xf2\\x3d\\xa0\\x31\\x32\\x70\\x4c\\x9f\\xca\\x54\\x24\\x58\\x69\\x69\\x7e\\x34\\x09\\x4b\\x82\\x0f\\x67\\x8e\\x48\\x4d\\x02\\x76\\x8b\\x43\\xb6\\xa6\\xf4\\x49\\xdc\\xa9\\x79\\x25\\xe1\\x00\\x42\\xe7\\x84\\xd0\\x71\\xc7\\x2c\\x35\\x30\\x15\\x44\\x4e\\x1b\\x61\\xbc\\x88\\x36\\x1a\\x43\\x3b\\x12\\x52\\x8e\\xb5\\x2f\\x18\\xf5\\xef\\x9b\\xa7\\x0d\\x7b\\xe1\\x3e\\x7d\\xa0\\xad\\x7a\\xa6\\xbb\\x3e\\xdf\\xfc\\x28\\x92\\xc3\\x74\\x30\\x52\\x1d\\xdd\\xb6\\xa3\\x9a\\x27\\x33\\xd7\\xe5\\x8e\\x45\\x59\\xde\\x5e\\xb7\\x11\\x58\\x55\\xa7\\xae\\x00\\x5d\\x72\\x87\\xed\\x2a\\xcb\\x6d\\x7d\\xe5\\x50\\x02\\x11\\xbf\\x00\\x61\\x3e\\xc7\\x75\\x7b\\x98\\xad\\x46\\x26\\x8c\\xed\\xfc\\x3a\\xca\\x75\\x70\\xfb\\xdb\\x54\\xfa\\xcb\\x29\\x1c\\xb9\\xac\\xb9\\x9a\\x81\\xc1\\xeb\\x59\\xba\\xf9\\x3f\\x5f\\x99\\xb1\\xa1\\x00\\xd6\\xf3\\x34\\x7f\\x50\\x1c\\x0c\\x91\\x51\\xe6\\x9d\\xf1\\xde\\x7a\\x19\\x3b\\x21\\x66\\x9a\\xe2\\x5a\\xdd\\x28\\x9e\\xe8\\xdc\\x7e\\x54\\x52\\x36\\x29\\x15\\x31\\x79\\x0b\\x8d\\xd6\\x54\\xf1\\x5d\\x69\\xa7\\x3c\\x18\\x16\\x33\\x0b\\x2a\\x73\\x65\\xd6\\xf1\\x83\\x84\\x64\\x35\\x21\\x7a\\x59\\x69\\x4c\\x5b\\x3b\\x1b\\x87\\xa9\\x62\\xa1\\xa9\\xc9\\xfe\\x92\\x14\\xf7\\x85\\x51\\xb5\\x92\\xfe\\xdf\\x30\\x26\\x6d\\x39\\x7a\\x8e\\x03\\x5b\\xb2\\xbe\\x57\\x5b\\x37\\x69\\xbf\\x3f\\xb7\\x4b\\x24\\x72\\x38\\x9c\\x26\\xcb\\x03\\x6a\\xbe\\x74\\xbf\\x63\\x9f\\x32\\xd6\\x0f\\x87\\xcc\\xe5\\x73\\xe7\\x1e\\x3b\\x1d\\xd8\\xab\\xd7\\x02\\xde\\x0c\\x8b\\x9e\\xda\\x65\\x6c\\xde\\x4f\\xb4\\x91\\x8c\\xe3\\xae\\x55\\x65\\x6c\\x77\\xa3\\x2c\\x0a\\xf3\\x10\\x20\\x39\\x4e\\x5b\\xd9\\x85\\xf4\\x1d\\x73\\x92\\xf6\\xb0\\x1e\\xc2\\x01\\x93\\x6e\\x01\\xa0\\x57\\x03\\xa1\\xd4\\x69\\x7e\\xc2\\x5a\\x75\\x81\\x29\\x6b\\x0f\\x4e\\xa7\\xdc\\x11\\x61\\xec\\xbe\\xe8\\xb8\\x5b\\x04\\x19\\x2e\\x1b\\x87\\xec\\x83\\xfe\\xd0\\x8a\\xc4\\xf2\\xe7\\x51\\x5a\\xac\\x9a\\x12\\x01\\xaf\\xd9\\x31\\x4b\\xd1\\xe8\\xb5\\x38\\xce\\x54\\x68\\x8a\\x78\\x3b\\x81\\xef\\x12\\x0d\\x92\\x86\\xc2\\xa5\\x81\\xee\\x32\\x3a\\x11\\xcf\\x4d\\xcb\\x5a\\xed\\xb9\\xff\\x07\\xac\\xd5\\x05\\x5c\\xd9\\xde\\x67\\xea\\xd4\\x6b\\xb8\\x6d\\x2e\\xef\\xcd\\x23\\x56\\x27\\x96\\x61\\x33\\x86\\x83\\x28\\x8e\\xec\\x0a\\xc5\\x78\\x1a\\x71\\x08\\x73\\xf9\\x4e\\xfa\\xdf\\x4f\\x8d\\x4a\\xc5\\xeb\\x7a\\xdf\\x5a\\x07\\x37\\xd4\\x38\\xab\\xb0\\x58\\x6d\\x84\\x47\\x84\\x36\\xfd\\xa3\\xe5\\x60\\xf5\\xaa\\x45\\xd3\\x47\\xcd\\xa0\\x11\\x27\\x0d\\xd4\\x34\\x99\\x38\\xea\\x5c\\xe7\\x71\\x95\\xe0\\x92\\x48\\x34\\x0c\\x99\\x79\\x69\\xe1\\x62\\x3b\\x6d\\x82\\x17\\x90\\x16\\x68\\x19\\xf5\\x26\\x30\\xb9\\xac\\xd5\\xbc\\xc2\\x78\\xa3\\x3d\\x9e\\x8f\\xf0\\x41\\x39\\xbf\\xdb\\x0d\\xae\\x0c\\xf6\\x08\\xb7\\xcf\\xae\\x3f\\x4b\\x37\\xb9\\xdb\\xec\\xa7\\xf7\\x13\\x63\\x04\\x3c\\xfb\\x1f\\x22\\x79\\xfe\\x09\\x6a\\x74\\x9c\\xfe\\xcb\\xdd\\x8b\\x8b\\x5e\\x24\\xf1\\x3c\\x8b\\x8a\\x5d\\x15\\x68\\xf4\\xbb\\x7f\\x6f\\xed\\xba\\xb2\\xac\\x0d\\x22\\x29\\xe6\\x04\\xcc\\xae\\xe7\\x0f\\xaa\\xdf\\xaa\\x68\\xbe\\xb7\\x73\\x8c\\xb7\\xb2\\xb6\\x14\\x9f\\x04\\xed\\x31\\x12\\x4d\\x3e\\xb0\\x6c\\x6b\\x64\\x35\\xa7\\x14\\x10\\x0d\\x1f\\x20\\xd1\\xe9\\xae\\xee\\x31\\x95\\xf8\\x23\\x8a\\xa1\\xe0\\x74\\x0d\\x72\\x1e\\x19\\x26\\xf5\\x0c\\x14\\xd6\\xf8\\x74\\x70\\xd9\\x5a\\x50\\xfc\\xc7\\xfa\\xb1\\x82\\xc9\\xde\\xda\\x19\\xa6\\xb9\\x2b\\xfa\\xf6\\x43\\x15\\x93\\x9f\\x92\\x16\\x0f\\x6b\\x41\\xd9\\x0b\\xd8\\x0c\\x52\\x51\\x51\\x41\\xa4\\x81\\x69\\x40\\x86\\x47\\xb2\\x19\\xf5\\x65\\x2c\\x50\\x7b\\x14\\x8d\\x6a\\x24\\x12\\x42\\xb7\\x72\\x9b\\x0a\\x17\\x89\\x7a\\x9d\\xe4\\x57\\x4b\\xd3\\xf7\\xfd\\xfa\\xc9\\x4e\\x5d\\x0e\\x8b\\xcd\\xe9\\x3c\\xd7\\xc9\\x99\\x6b\\x9f\\x33\\x84\\xf7\\xc8\\x15\\xb9\\xec\\xb7\\x61\\x17\\x7f\\x50\\x72\\x85\\xcf\\x2c\\x57\\x69\\x43\\xed\\xbb\\x3d\\xb5\\xdb\\x2c\\xf9\\xb7\\x32\\x5c\\x9f\\x3c\\x64\\x16\\x41\\xa2\\xd6\\xcc\\x25\\x9f\\x54\\xe4\\x66\\xb4\\x15\\x31\\x84\\x4b\\x6a\\x33\\x56\\x44\\x49\\x7d\\x2e\\xbd\\xd2\\xf0\\x95\\x4f\\x1e\\xb2\\xbf\\x4e\\x10\\xf1\\x9e\\xbd\\x4a\\x98\\xf8\\xab\\x5a\\xac\\xcf\\x45\\xcb\\xf5\\xc2\\x54\\x57\\x7e\\x7b\\xb0\\x9a\\x54\\x46\\x25\\x4f\\x80\\x82\\x77\\x5b\\x52\\xcf\\xc7\\xaa\\x0e\\xb6\\xcf\\xee\\x12\\x45\\xfd\\x77\\xbf\\x37\\xfa\\xb8\\xac\\x84\\x70\\x49\\xa4\\x8d\\xa3\\xa1\\x79\\xd6\\xef\\x61\\x08\\x67\\x4e\\x56\\xc2\\x6a\\x15\\x47\\x31\\x94\\x49\\x03\\x50\\x2b\\xfc\\xb2\\x81\\x5a\\x7f\\x05\\xbb\\xc8\\x2c\\xe8\\x20\\x83\\xc3\\x4d\\x11\\x8c\\x54\\x61\\x95\\xd3\\xcc\\x78\\xf2\\xee\\xa4\\x2f\\xb2\\x10\\x09\\x5b\\xc3\\x04\\xfe\\x35\\x2d\\x81\\x4b\\x14\\xf5\\x92\\x39\\xbf\\x39\\xeb\\x5c\\xff\\xf2\\x66\\xf6\\xda\\x9b\\xf6\\x83\\x03\\xac\\x3f\\xab\\xdf\\xdd\\x7f\\xc3\\x13\\xd7\\xa2\\xde\\x8d\\xf8\\x98\\x0e\\x3c\\x6f\\xe2\\x54\\x1d\\x20\\x29\\xae\\x9a\\x08\\x03\\xb0\\xdd\\x06\\xc3\\xe1\\x9a\\x95\\x55\\xd8\\xeb\\x30\\xc9\\xa8\\x5a\\x38\\x89\\x50\\x44\\x46\\xd0\\xf5\\x7f\\xf6\\x17\\x1b\\xc3\\xc6\\x8f\\x0c\\x17\\x1b\\xd7\\xdb\\xec\\x2a\\x37\\x62\\x1e\\x78\\x0a\\x03\\x1e\\xb4\\x5c\\x43\\xc6\\x90\\x43\\xcc\\x7f\\x52\\x99\\x65\\x78\\xcf\\x32\\x62\\x07\\x38\\xd1\\x1f\\x23\\x79\\x10\\xb1\\x44\\xce\\xf8\\x06\\x52\\xd1\\xdc\\x9e\\x13\\xb7\\x66\\xd9\\x49\\x7b\\x1e\\x1e\\x19\\x88\\xd7\\x18\\x96\\xfa\\xd6\\xb0\\xc4\\x38\\x1c\\xdc\\x99\\x9f\\x15\\xbc\\xb8\\xd0\\x08\\x0e\\x95\\x93\\x1f\\x5e\\xf4\\x95\\x67\\x19\\xde\\x34\\x46\\x45\\x11\\x1a\\x3a\\xdf\\x30\\x69\\x68\\x2f\\x95\\x5c\\xa9\\xeb\\x61\\x5d\\xaf\\x1f\\x6b\\xba\\xbf\\xb2\\x21\\xfd\\x49\\x49\\xba\\x49\\x4d\\xa1\\x14\\xe3\\x94\\x60\\xd8\\x0c\\x58\\x08\\xc5\\xa1\\xc9\\x2a\\xdf\\x34\\xc4\\x3a\\xe4\\x0a\\x7f\\xad\\x84\\xa8\\xc6\\xf8\\xb8\\xc6\\x57\\xd0\\x51\\xb1\\xf5\\xc8\\xd9\\x04\\x3f\\xb1\\x96\\x38\\xa1\\xc8\\x51\\x69\\x2a\\x74\\xc2\\x30\\x2c\\x81\\xf5\\x17\\x67\\x7d\\x68\\xb3\\x61\\xcb\\x41\\x74\\x17\\xfe\\xe6\\xde\\x23\\xae\\x2c\\x85\\x54\\x72\\x43\\xdd\\x55\\x1c\\x80\\x92\\xb3\\x3a\\x0b\\xfe\\x28\\x23\\xb2\\xb9\\xad\\xdf\\x7b\\xac\\xd1\\xa6\\x89\\xbf\\x28\\x63\\x82\\x41\\xe1\\xb1\\x5c\\xc2\\x8b\\x0e\\x82\\xcd\\x81\\x1f\\x40\\x9f\\xd1\\x8b\\x1d\\x28\\xea\\xc5\\xf9\\xd4\\xc8\\x3a\\xa3\\xfc\\x85\\x98\\x36\\x90\\x4d\\xd0\\xcd\\xaf\\x30\\x6f\\xa9\\x4b\\xba\\x19\\x21\\x16\\xfe\\xd6\\x3a\\xcf\\xdc\\x3a\\xb1\\xe3\\xfc\\xb9\\x20\\xb3\\xba\\x5a\\xec\\xc0\\xfb\\x35\\xfa\\x5e\\x7b\\xee\\xff\\x9a\\x13\\x52\\x86\\xcf\\x58\\x26\\xaa\\xbb\\xf0\\x39\\x13\\x1d\\x82\\x44\\xc8\\x5b\\x05\\x0f\\x01\\xc3\\xee\\xb4\\x72\\x8c\\xe3\\x72\\x46\\xd0\\x7a\\x97\\x8b\\xf4\\x04\\x36\\x6e\\x9d\\xcf\\xe9\\x22\\xe4\\xe3\\x52\\x3f\\x5c\\xa5\\xf3\\x3a\\xb4\\x94\\x60\\x5b\\x79\\xdb\\x9b\\xb1\\x15\\x57\\x51\\x24\\x90\\xdc\\xd7\\xeb\\x9e\\xef\\x5f\\x15\\xd8\\xe5\\x35\\xb7\\x12\\xb1\\xb5\\xe9\\x10\\x81\\x41\\xc7\\xf6\\xeb\\x4c\\xc5\\xdd\\x45\\xb7\\xbf\\x96\\xd9\\x34\\xa3\\x82\\x7c\\xc1\\x8f\\xab\\x56\\x2e\\xaf\\x15\\x0f\\x73\\xd7\\x99\\xc1\\xb3\\xb6\\xc9\\x62\\x16\\x97\\xb5\\xcd\\x57\\xec\\x39\\x3b\\x03\\x0c\\x6f\\x55\\x21\\xff\\x3d\\xa1\\xed\\xc9\\xfb\\xb7\\xd7\\xd6\\x22\\x57\\x45\\xf8\\x0d\\x94\\x5c\\xd6\\xeb\\xc7\\x06\\x72\\x81\\x57\\xc2\\x2e\\xeb\\xbb\\xdd\\xc3\\x46\\x6a\\x2f\\x4c\\x62\\xcb\\x41\\xa8\\x89\\x5b\\x1d\\x1a\\xe5\\x50\\xe6\\x6d\\x55\\xdd\\x2f\\x85\\xef\\xd3\\x29\\x87\\x47\\x07\\xcd\\x95\\x64\\x95\\x74\\x22\\x97\\x6b\\x29\\x0a\\x3a\\x14\\xb0\\x03\\x07\\xad\\xaa\\xde\\xa7\\xae\\xbb\\xe7\\x37\\x38\\xda\\x87\\xcf\\xcd\\xd9\\xed\\xdb\\x21\\x9b\\x9b\\x5e\\x1f\\x84\\xd7\\x25\\x6f\\xbf\\x20\\x5f\\xba\\x6a\\x1a\\x6a\\x55\\x38\\x2c\\x18\\x5e\\x3b\\x7a\\xa6\\xa5\\xd3\\x49\\x50\\x9c\\x79\\xc9\\xa8\\xd8\\x1d\\x0b\\xdc\\xdd\\xc8\\x3b\\xbd\\xed\\xdf\\xae\\xea\\x85\\x21\\xa6\\xb0\\x96\\x96\\xec\\xc2\\x66\\x12\\xa4\\xe0\\xa0\\x4a\\x2f\\xa4\\x85\\x5c\\x7d\\x85\\xa2\\xb2\\xab\\x63\\x18\\x33\\x26\\x62\\x7a\\x4f\\xa1\\x4e\\x9e\\x6c\\xa0\\x0a\\x69\\xfb\\xb4\\x11\\xe6\\x18\\xa9\\xbb\\xd7\\x73\\x67\\x2b\\xe6\\x08\\xbb\\x34\\x6d\\xb5\\x16\\x1e\\x9e\\x50\\xba\\xac\\x57\\x1b\\x1e\\x7b\\x7e\\xde\\xa3\\x10\\x15\\x34\\xf3\\x02\\x14\\x32\\xa7\\x71\\xfc\\xff\\xc6\\x47\\xc6\\x62\\x73\\x34\\x40\\x0f\\x39\\x2d\\xa6\\x45\\x3f\\x6f\\xbb\\x42\\xef\\xd6\\xde\\xb6\\x86\\xc2\\x2f\\x15\\x4c\\x62\\xa4\\xf8\\x0b\\xde\\x0b\\xbf\\xc0\\xec\\xbb\\x98\\x3f\\xc6\\x22\\xb6\\x16\\x47\\xf3\\x40\\xe6\\xfb\\x40\\xce\\x91\\x44\\xd4\\xdc\\xf2\\x1a\\x96\\x34\\xb7\\x69\\x3c\\xca\\xf7\\x3b\\xc0\\xe2\\xe1\\xbb\\x02\\xff\\x51\\xa3\\xaa\\x80\\x5b\\x26\\x24\\xce\\x56\\x94\\x5c\\xf8\\x95\\x13\\x64\\x75\\x23\\x59\\x65\\x84\\x08\\x96\\xab\\x14\\xca\\xfe\\x8c\\x04\\x75\\x7b\\xeb\\x0f\\x50\\xf7\\xf4\\x4c\\x6a\\xb0\\xa0\\x1f\\x90\\xba\\xe1\\xb1\\xca\\xf5\\x72\\x72\\x69\\xc6\\xdb\\x59\\x0b\\x54\\x5b\\x8a\\x4d\\x75\\xb3\\xd7\\xda\\xc8\\xc9\\x4b\\x75\\xbb\\x17\\x3a\\xfb\\xbe\\xe7\\x43\\x9d\\xde\\x0c\\x87\\x0f\\x4b\\x7d\\xaa\\xd4\\x51\\xf9\\xdc\\x80\\x02\\xd3\\x26\\x7c\\x45\\x7b\\x5d\\x65\\x4a\\xbc\\x8d\\xfb\\x91\\x95\\x71\\x67\\x2d\\x05\\x77\\x4f\\x00\\x5d\\xc5\\xd4\\x87\\x95\\x81\\x07\\x6b\\x8b\\x14\\xac\\x1e\\xe9\\x4e\\xd8\\xd8\\xab\\xe8\\xbf\\xf5\\xe3\\x98\\x65\\x2b\\x64\\x59\\xee\\x6f\\x18\\xfc\\x2b\\x6c\\x16\\xcd\\x38\\x9a\\x26\\x63\\xc5\\x5d\\x1e\\x39\\x46\\x9a\\xb5\\x8f\\xac\\x15\\x7c\\xa6\\xf2\\xcc\\x85\\x4a\\x81\\x22\\x83\\x80\\xdf\\xcb\\x8f\\xa4\\xa9\\xae\\x7c\\x51\\x9e\\xce\\x83\\xc4\\x57\\xf6\\x98\\xaf\\xa2\\xd4\\x9b\\xbd\\xcf\\x1a\\x23\\xc1\\xe5\\x90\\xf4\\xdd\\x54\\x0a\\xd8\\xa7\\x76\\x87\\x30\\x2e\\x6b\\xfa\\x1f\\x70\\x74\\xf5\\xb3\\xe0\\x76\\x29\\x14\\x93\\x86\\x72\\xa8\\xf4\\x7b\\x33\\xf9\\xee\\x2a\\xa4\\x8e\\x5b\\x0d\\x3f\\x2f\\xc7\\xb6\\x1a\\x57\\xf3\\x46\\x9b\\x97\\x2c\\x65\\x43\\x26\\xdd\\xd2\\x53\\x47\\xaf\\x18\\x67\\xaa\\x94\\x5b\\x25\\x21\\x66\\xac\\x6c\\x17\\x36\\xca\\x59\\x96\\x97\\x72\\x57\\x1d\\x5d\\xfb\\xca\\xd8\\x76\\xd4\\x35\\x25\\x4f\\xe6\\x66\\x83\\x46\\x4b\\x35\\x85\\x6c\\x3a\\x05\\x78\\x0e\\x3f\\xb1\\xe6\\x5e\\x0d\\xdb\\x1f\\x4d\\xbd\\x7c\\xe5\\xdf\\x8b\\x37\\x22\\x6a\\xbd\\xff\\xfd\\x25\\x60\\xc8\\xf9\\xbc\\x57\\xb5\\xb2\\xd1\\xb3\\x75\\x7f\\xa8\\xf6\\x7a\\x98\\xf3\\x3a\\x86\\x71\\x5a\\x1b\\x51\\x88\\xb3\\x5f\\xe9\\x7b\\xd7\\x53\\x1a\\x09\\xa2\\x9b\\x21\\x89\\xbe\\x5a\\x35\\xf0\\x9d\\xf1\\x3b\\x12\\x0f\\xf0\\x10\\x23\\xe5\\xed\\xf6\\xeb\\xcf\\x4c\\xde\\x14\\x00\\x45\\xc2\\xf5\\xb0\\xc3\\xfa\\x36\\xc2\\x81\\x68\\xed\\xec\\x9f\\x57\\x6d\\x33\\x2a\\xa8\\x0c\\xa3\\xb8\\x68\\x6d\\xf6\\x9a\\x17\\x17\\x1f\\x8c\\x99\\x97\\xbf\\x28\\x88\\x0b\\x23\\x6a\\x8e\\x3a\\x46\\xda\\x14\\xb5\\xac\\xa3\\xff\\x79\\x87\\xc0\\x2d\\xe4\\x02\\xd5\\x41\\x1e\\xbc\\xec\\xcb\\xcb\\xa5\\x61\\xd9\\x99\\xeb\\xe1\\xea\\x35\\xa1\\xb4\\x54\\xc9\\x6a\\x6f\\x3a\\x11\\x41\\x64\\x6f\\x15\\xcb\\x91\\x86\\xc9\\xc1\\x80\\xdd\\x7e\\x33\\x97\\x98\\xce\\x12\\xf1\\xb5\\x87\\xd5\\xb9\\x87\\xbd\\x6a\\xde\\xf0\\xb5\\x74\\xd6\\x45\\x47\\xb1\\x6a\\x54\\x87\\xf2\\xb1\\xe3\\x72\\x4f\\x7c\\xe7\\x6e\\x81\\xad\\x96\\x84\\xb0\\x2a\\x3d\\x59\\x3a\\x3e\\xfa\\x9b\\x6f\\xb9\\xa5\\x28\\x4e\\x63\\x37\\x33\\x5d\\x68\\xcc\\xd8\\xb9\\x17\\x0f\\x61\\x22\\x65\\x29\\x32\\x52\\xbe\\xcf\\x4a\\xef\\x18\\x35\\x97\\xb9\\xa5\\x40\\xad\\xcf\\x58\\x55\\x4e\\x3a\\x90\\x26\\x37\\x6e\\x74\\x10\\x3c\\x15\\xcb\\x41\\x1a\\xef\\xea\\x56\\x0f\\x0a\\xf4\\x47\\xd4\\x92\\xe6\\x4a\\xea\\x04\\x14\\x7d\\x25\\xe7\\x2d\\xaf\\x7a\\x8b\\xb6\\x00\\xcf\\xfa\\xfd\\x58\\x58\\x36\\x21\\xd4\\x9f\\x2b\\xfd\\xde\\xc3\\xf3\\x52\\xff\\xc3\\x75\\xce\\x12\\xef\\x0c\\xd9\\x9c\\x7f\\xab\\x65\\xd7\\x28\\x79\\x3a\\x42\\x30\\xf4\\x0c\\x50\\x59\\xb0\\xde\\x8b\\xb6\\x01\\x3e\\x8b\\x03\\x96\\xa5\\x65\\x29\\x3a\\xb3\\xad\\x0c\\xbd\\xd4\\x96\\x08\\x06\\x0d\\xa1\\x76\\xf9\\x75\\x02\\xa5\\x1e\\x17\\x09\\x83\\x1c\\x55\\x42\\x3d\\xae\\x7f\\x8d\\xff\\x29\\x49\\xaa\\xf9\\xf1\\x30\\xa4\\xce\\x16\\xdf\\x86\\xfa\\xae\\x79\\x13\\xfb\\x5a\\xa0\\x2b\\x70\\x49\\xbc\\xf8\\xd3\\xb5\\xc9\\x65\\x97\\xcd\\xf9\\xb3\\xfa\\x32\\xbd\\x64\\xcb\\xc3\\x95\\x33\\x08\\xe4\\x5a\\x34\\xb3\\xb0\\x98\\xcb\\xa8\\x48\\x2f\\x7e\\xb7\\x5c\\x3f\\xa4\\x60\\xe9\\xe4\\xfb\\x38\\x57\\xb9\\x2d\\x50\\x5d\\x3f\\x94\\x10\\xf9\\x7f\\x57\\x3f\\x6d\\xdc\\xf2\\x0f\\x9a\\x89\\xba\\x8a\\x6d\\x2f\\xf2\\xc5\\xfb\\x11\\xa8\\xa9\\xdd\\xce\\xc2\\x0d\\xc3\\x75\\xce\\x25\\xcf\\x32\\x1f\\xfd\\x2b\\x21\\x5d\\x42\\xf1\\x7b\\x4e\\xd0\\x32\\xf8\\x34\\xd1\\xff\\x30\\xca\\xf0\\x8c\\x19\\xba\\x88\\xc6\\x3c\\xe1\\xe8\\x8c\\x53\\x77\\x6a\\xee\\xa9\\x57\\xd3\\xb5\\x89\\x09\\xa7\\xc1\\x6c\\xc0\\xfd\\x3c\\x12\\xbb\\x5e\\x22\\x71\\xe8\\xb0\\x42\\xb9\\xd2\\x2e\\x0f\\x98\\xad\\xc4\\xba\\x9a\\x4c\\xf2\\xb0\\xe5\\xb6\\x6d\\xca\\x27\\x18\\x41\\x54\\x5b\\xe6\\xd9\\x61\\xe8\\x39\\xee\\x55\\x51\\x7b\\xec\\x3b\\xc7\\xfb\\xc8\\xbe\\x75\\xec\\x7b\\x4d\\xbf\\x42\\x3c\\xd4\\x80\\xb7\\x1e\\x88\\xab\\x1f\\x65\\x3e\\xc6\\x8a\\x1a\\xb3\\x72\\x9c\\x38\\x08\\x87\\xa8\\x90\\x8e\\x96\\xd8\\xf2\\x8c\\x46\\x5a\\x98\\xdf\\x50\\xb8\\x57\\xc7\\x65\\x57\\x91\\xf3\\x4f\\x63\\x11\\xd1\\x2c\\xa6\\x17\\x97\\xe3\\x88\\x6d\\xc8\\xc4\\xe6\\x34\\xa9\\x99\\xeb\\xb4\\x2a\\xc1\\xd6\\x2c\\xce\\x4f\\xed\\xfc\\x0a\\xbf\\x44\\x89\\x4b\\xdb\\x6d\\xb7\\xd9\\x3e\\x76\\x14\\xee\\x43\\xeb\\xc0\\x5a\\x44\\xca\\x9b\\x5e\\xa7\\x47\\x3f\\x8c\\x4f\\x90\\xef\\x19\\xf8\\xf3\\x96\\x41\\x99\\x60\\x97\\x2b\\x7e\\x18\\xfa\\x34\\x03\\xbe\\xf7\\x8e\\x59\\x3d\\x17\\xe2\\xc3\\xf6\\xda\\xcb\\x18\\x27\\xd7\\xfe\\xe2\\x45\\x1a\\xdd\\x9d\\x8c\\x12\\xec\\x24\\x99\\x3d\\x8b\\xa2\\x68\\x81\\xbd\\x35\\xa8\\xb5\\x11\\x5c\\x4a\\xbc\\xd5\\x11\\x84\\x4d\\x70\\x58\\x1d\\x43\\x0d\\x93\\xd1\\x2f\\x83\\x23\\x89\\xe5\\x48\\x3b\\xdc\\x90\\x70\\x5a\\x3f\\x98\\x3d\\x34\\x29\\xab\\xb4\\xf8\\x7d\\xe5\\x6d\\xa0\\xbd\\xfe\\xc9\\x72\\x75\\xeb\\x7f\\x5b\\x77\\x68\\x50\\x67\\x3c\\xe5\\x70\\x9b\\xd7\\x2c\\x6e\\x20\\xf2\\x56\\x66\\x40\\x91\\x67\\x44\\x40\\x3d\\xfc\\x83\\x86\\x7d\\x56\\x6e\\xf1\\x83\\x3c\\xdf\\x28\\x7d\\x49\\x7b\\x3c\\x1e\\x53\\x56\\x04\\xb1\\x10\\xf5\\xfe\\x47\\xf0\\x28\\x78\\xa7\\xa0\\xb9\\x72\\x3f\\xf9\\x77\\x50\\x99\\x79\\x1c\\x82\\x4c\\xf5\\x8b\\x55\\x97\\xf3\\xac\\x51\\x1b\\x3f\\xd3\\xdd\\x3c\\x98\\xc5\\x50\\x00\\x14\\x21\\xf7\\x5d\\x94\\x0e\\x12\\x5a\\xcd\\x1c\\xbd\\xde\\xe3\\x47\\x69\\xdd\\x66\\x1d\\xc3\\x5e\\xfb\\xe1\\x2b\\x19\\x07\\x5b\\x89\\xbd\\xf6\\xc7\\x47\\x74\\xdc\\x09\\x47\\x73\\x40\\xcf\\xc5\\x2b\\x89\\xc2\\x3e\\x6f\\xb7\\xe0\\x77\\xba\\x59\\x79\\x99\\xee\\x86\\x0b\\x3b\\x62\\xf6\\x32\\xea\\x0c\\x16\\x5e\\xc0\\x34\\x79\\x53\\xb2\\x12\\xfd\\x7a\\x75\\x80\\x8d\\xdf\\xcb\\x59\\xd2\\xb2\\x41\\xaf\\x7c\\x8e\\xcd\\x22\\x9a\\xdc\\xc9\\x4f\\xbe\\x47\\x49\\x55\\x9a\\xf4\\x75\\xa6\\xb1\\x1f\\xde\\xd2\\xa4\\x61\\x19\\x5f\\x49\\xe5\\x83\\x12\\x2c\\x45\\x9c\\x35\\xf2\\x11\\x38\\x96\\xaf\\x7f\\x72\\x72\\x64\\x33\\xdf\\x2c\\xd5\\xb3\\xaf\\x12\\x99\\x5c\\xce\\xe6\\xf2\\x79\\x4e\\x13\\x83\\x12\\xf6\\xdc\\xcf\\x73\\xb8\\x22\\x76\\xff\\xbd\\xb8\\x88\\x8e\\xc6\\xc9\\xc9\\x71\\x10\\x84\\x98\\xea\\xee\\x7d\\xad\\x94\\x9e\\x61\\xd1\\xf9\\xfd\\x0b\\x25\\xc9\\xdf\\x7b\\x74\\xe3\\x59\\x74\\x46\\xd7\\xa1\\x12\\xa0\\x75\\x83\\x1e\\x19\\x24\\x05\\xf9\\x49\\x07\\xdb\\xbb\\xf4\\x43\\xec\\x7a\\x59\\xcc\\xd8\\x3a\\x56\\x18\\x0b\\x31\\x11\\xf3\\x81\\x40\\x2c\\xa1\\x48\\x86\\x46\\xe8\\x17\\x16\\xde\\x8e\\xa4\\x66\\x2e\\x51\\x82\\x21\\xc6\\x51\\x2c\\xc3\\x6c\\x50\\x07\\x1f\\x01\\xdf\\x42\\x94\\x44\\x21\\xa5\\x18\\x19\\x89\\x3c\\x81\\xdb\\x1a\\xd9\\xd2\\x9a\\x9c\\x65\\xde\\x7a\\x22\\xce\\x77\\xce\\xbf\\x2e\\x1c\\x1b\\xf2\\x32\\x0a\\xf6\\x56\\xfc\\x61\\xc2\\x9e\\xd7\\x16\\x25\\x92\\x6c\\xeb\\x8c\\x58\\x9a\\x8e\\x8b\\x1a\\x23\\x13\\xdc\\x2b\\xcc\\x84\\x92\\x8f\\x73\\xdf\\x4f\\x65\\x77\\x9e\\x73\\x9a\\xd9\\x85\\x35\\xb8\\xe5\\xd5\\xc1\\x5a\\x36\\xb9\\x97\\x5b\\xc4\\x06\\x62\\x1c\\x64\\x38\\x5f\\x38\\xb4\\x42\\x8c\\x59\\x8b\\x95\\x37\\x9d\\x3b\\x97\\x0a\\xd7\\xbd\\xd9\\x86\\x7b\\xf3\\xd1\\x47\\x3d\\xc1\\x87\\x81\\x2e\\xdd\\x46\\xc3\\x0a\\x94\\xca\\x50\\x13\\x70\\xb6\\xa4\\x49\\xb1\\xd7\\x57\\xcf\\x3e\\x2f\\xe5\\xdd\\x6b\\x18\\x5c\\x16\\x30\\x98\\xdd\\xec\\x5a\\xc7\\xfd\\x0c\\x53\\x1a\\x54\\x55\\x5e\\xae\\xb8\\x56\\x43\\x31\\x50\\x9a\\x3c\\xca\\x38\\xc4\\x7d\\x33\\x2f\\x33\\xa8\\xf0\\xb0\\x6a\\x1a\\xf5\\xe8\\x19\\x1b\\x38\\x53\\x7d\\x79\\xfb\\x55\\x3a\\x10\\xff\\xf5\\x9e\\x84\\x55\\x8b\\x50\\xc4\\xee\\xb5\\x48\\x28\\x81\\x87\\x7e\\x96\\xb1\\x4f\\x37\\xc9\\xba\\xd5\\x32\\x91\\xe4\\xbc\\xae\\x83\\x5f\\x50\\xf9\\x98\\x7c\\x7f\\xcf\\xb4\\x1a\\x6f\\x52\\xda\\x72\\xd0\\xc2\\xff\\x59\\x07\\xd4\\xbe\\x5a\\x3c\\x2e\\xfd\\x51\\xa3\\xb5\\xca\\xe9\\x01\\x23\\xe2\\x9a\\xbb\\x47\\x9f\\x4f\\x47\\x6b\\x74\\x6a\\xbe\\x75\\xd6\\xa7\\x3a\\x74\\xab\\x1d\\x66\\x74\\x32\\x41\\xe2\\xba\\x6a\\xc9\\x0a\\x11\\xe6\\x0a\\x1a\\xa9\\xc9\\x83\\x64\\xeb\\x07\\xf3\\xa2\\x94\\x93\\x45\\x6e\\x3b\\xd0\\xca\\xa9\\xc6\\x66\\x1c\\x83\\xde\\xf7\\xc0\\x87\\x37\\x78\\xac\\x92\\xca\\x49\\x0e\\x67\\x65\\xc5\\x93\\x3a\\x4d\\xb9\\x09\\xcc\\x77\\x2d\\x5a\\x5e\\x2d\\x49\\xc7\\x75\\x59\\xa6\\xa7\\xc8\\xed\\x74\\x14\\x1e\\x0d\\xb9\\x8e\\x26\\x7d\\xc5\\x4f\\x96\\x59\\xa8\\xf6\\x0c\\x1f\\x89\\x3a\\xe9\\x62\\x22\\x37\\x66\\x3d\\xb1\\x96\\x72\\xb9\\x4f\\x04\\x16\\x44\\x39\\x41\\xde\\x4c\\x8e\\x24\\xd0\\x59\\xa0\\xea\\x57\\x37\\xe3\\x9f\\xfe\\x39\\xe4\\xf9\\xfc\\x81\\xd3\\x5a\\x16\\xc8\\xe2\\x31\\xbf\\x1e\\x90\\x77\\x4f\\xf5\\xcf\\xe6\\x35\\x25\\xf6\\x99\\xfb\\xdc\\x9d\\x45\\xb5\\xa0\\x26\\x8b\\x41\\x13\\x58\\xff\\x37\\xb9\\x76\\xbb\\x63\\xa2\\xc7\\x68\\x31\\xe2\\xb4\\xc5\\x9f\\xc9\\xe4\\x25\\x07\\xd5\\x9e\\xf2\\xbc\\xd3\\x36\\xab\\x1d\\xc9\\xcd\\x66\\xb7\\x46\\x91\\xbe\\x70\\xcf\\xe1\\x2a\\x7d\\xa1\\x5b\\xd4\\xa4\\x97\\x1c\\x6a\\xa9\\x0e\\xb7\\x21\\xa8\\x22\\xfd\\x30\\xfe\\xe1\\x9a\\xdc\\x4d\\xa7\\x31\\xf2\\x03\\xf9\\x05\\x51\\x8c\\x7e\\x10\\x21\\x7b\\xf6\\x47\\x50\\xc8\\x95\\x29\\xbb\\x04\\x6a\\x53\\x8b\\xbf\\x74\\xd9\\x92\\x02\\x32\\xb4\\x35\\xe9\\x7c\\x05\\x78\\x8c\\x0c\\xa5\\x53\\x15\\x5d\\xc4\\xf3\\x30\\xf8\\x97\\x70\\x0a\\xa8\\x03\\x92\\xf1\\x9d\\x12\\x5f\\x90\\x7c\\xd7\\x12\\x51\\x01\\x27\\x6b\\xac\\x13\\x7e\\xe8\\xa6\\x3b\\x89\\x80\\x5d\\xc2\\x26\\x27\\xb8\\xf0\\xf2\\xa8\\x4b\\x98\\xb6\\xce\\xc1\\x42\\xb1\\x55\\x9f\\xcd\\x2c\\xbc\\xad\\x9e\\xcb\\x48\\xda\\xd1\\x0a\\x09\\xa6\\x29\\x85\\xae\\xdf\\xc9\\xe6\\x74\\xbf\\xec\\x65\\x23\\x0d\\x43\\xa6\\xeb\\x9e\\x52\\xcc\\x4d\\x6e\\xbd\\xf5\\xa4\\x46\\xf6\\xd7\\xfd\\x8a\\x46\\xc0\\xc6\\xe3\\x4a\\xb4\\x0c\\xb9\\x3b\\xbd\\xae\\xeb\\x5e\\xea\\x5e\\x5d\\x47\\xa7\\xdf\\xf8\\x7c\\x90\\x4d\\x9d\\x3e\\xc7\\x6b\\x5e\\x51\\xfc\\x3c\\xb9\\xae\\xd3\\x93\\x98\\x88\\x44\\x3c\\xb6\\x77\\x50\\xfb\\xfd\\xae\\xde\\x9b\\xdf\\xf3\\x39\\xf7\\x1a\\x5e\\xce\\xdf\\x31\\xad\\x96\\xe2\\xbb\\xb1\\x1d\\xef\\x7a\\x9f\\x6b\\x87\\x53\\xe9\\xa9\\xe8\\x3b\\xfc\\xa2\\xe4\\x05\\x69\\x33\\xdb\\xe9\\x53\\x6a\\xd4\\x47\\xf0\\xd0\\x5d\\xd8\\x4d\\xf4\\x12\\x6a\\xb2\\x56\\xb9\\xb8\\xdb\\xdd\\xdf\\x4f\\x85\\xc9\\xc5\\x3e\\x1e\\x56\\x34\\x96\\xe8\\x2b\\x96\\xcb\\xc6\\x3d\\xa8\\xf1\\x7f\\x5a\\x59\\xb2\\xce\\x5d\\x2c\\x58\\xd1\\xe4\\xe7\\xbf\\x47\\xff\\x4a\\x7c\\x09\\x54\\x61\\xc5\\x88\\x0b\\x98\\xfb\\xd9\\x36\\x6b\\xba\\x66\\x7f\\xe5\\xdf\\x3e\\x41\\x6d\\x58\\x7e\\x0e\\x4c\\x75\\xb5\\x55\\xaf\\xdd\\x1a\\x2f\\x1d\\x8c\\x95\\x7c\\x43\\xb5\\xc9\\xf1\\x71\\x12\\x9e\\x04\\xa9\\x16\\xf9\\x9c\\xd5\\x58\\xec\\x31\\x13\\x34\\x7d\\x5c\\xb4\\xe5\\xf8\\x55\\x51\\xa6\\xcc\\x75\\x40\\x7f\\xbc\\x9b\\x41\\xb6\\xc2\\x79\\xbe\\xec\\xfc\\xd5\\xbd\\xde\\xde\\x58\\xf7\\xf0\\x60\\xc7\\x62\\x8a\\xe9\\x05\\xf3\\xef\\x4d\\x93\\x76\\xf7\\xff\\xc9\\x47\\xf2\\xb5\\xfe\\xe7\\x98\\x6d\\x17\\x9e\\x8f\\xa4\\x0e\\x22\\x7b\\x1a\\x1a\\xca\\x78\\x2c\\x08\\x71\\xc8\\xe8\\x8f\\xdd\\x74\\x95\\x57\\x10\\xc8\\x04\\x3a\\xe2\\x33\\xa3\\x1b\\xbc\\x9f\\x8c\\x9c\\xb6\\x0d\\x48\\xef\\x4a\\xc9\\xeb\\x04\\xe7\\xa3\\x08\\x9d\\x7f\\x8d\\xc0\\xcb\\x0f\\x87\\xac\\x52\\xdf\\x6d\\xce\\xe9\\xa2\\xd1\\xbb\\x91\\x42\\x43\\x43\\x11\\x15\\x6d\\x78\\x78\\x5b\\xda\\x51\\x41\\x9a\\x37\\xb3\\xeb\\xfe\\x47\\x8d\\x70\\x1e\\x0c\\x09\\xd6\\x8d\\xf9\\x6d\\x26\\xcb\\x17\\xca\\xe5\\xae\\xe8\\x40\\x75\\xd1\\xa2\\x6f\\xe9\\x10\\xd4\\xf6\\xad\\xcb\\xda\\xf2\\x0a\\x3c\\xd6\\x4a\\xac\\x50\\x50\\xc2\\x8b\\x0d\\xb4\\xd8\\xa1\\x1c\\x4f\\x9c\\xd1\\x4a\\xb8\\x79\\x9e\\xca\\x8b\\x27\\x4a\\x82\\xf7\\x8a\\x12\\xbb\\x56\\x9c\\x08\\x7c\\xdf\\xfd\\xa0\\xea\\xe3\\x98\\x5b\\xad\\xfe\\x9f\\x97\\xdf\\xfc\\x47\\x2f\\x29\\xe9\\xf9\\xe5\\x5f\\xcf\\x0f\\x22\\xa5\\xb1\\xfc\\x8a\\xdf\\x8f\\x31\\x73\\x8f\\x67\\xb4\\x3f\\x63\\xf4\\xfc\\x3e\\x9c\\xca\\x72\\x9d\\xce\\x90\\xf2\\x9b\\x2a\\xd1\\x9a\\x27\\xc1\\x52\\x5a\\x10\\x2c\\x76\\xb4\\x38\\x3a\\xbb\\x4b\\xb5\\x69\\xb3\\xbc\\xac\\x54\\xde\\xa2\\xc3\\x02\\xfc\\x5e\\x77\\x2c\\xaa\\x59\\x14\\xf8\\x6d\\x97\\x43\\xa5\\xc0\\xc2\\x05\\xee\\xd6\\xb8\\xb0\\x38\\x4c\\x6b\\x39\\x85\\x7d\\x4e\\x2f\\x38\\x6a\\xae\\xd7\\x3b\\x96\\x24\\xe2\\xb2\\xb2\\x08\\xbf\\xfa\\xf7\\xca\\xe4\\x6d\\x9c\\xc2\\x75\\x93\\xfe\\x82\\x8d\\xce\\xda\\x3b\\x89\\xef\\x07\\xbf\\x74\\x8b\\x7f\\x69\\x76\\x56\\x42\\xa5\\x44\\xb0\\xae\\x51\\xca\\x9a\\x9a\\x38\\x8a\\x8f\\xdf\\x52\\xa6\\xe0\\x93\\xf1\\x43\\x98\\x5c\\x25\\x91\\x95\\xab\\x43\\xfa\\xaf\\x32\\x6a\\x60\\xb9\\x4c\\x10\\x39\\x84\\x7d\\x5b\\x66\\xb8\\x7d\\xd4\\xfe\\x49\\xb7\\x4b\\xa7\\x80\\xc0\\x32\\x1d\\xac\\x19\\x34\\x3f\\x52\\x4d\\x56\\x18\\xa5\\x33\\xf0\\xff\\x20\\x93\\x5d\\xeb\\x90\\x0d\\x11\\xb9\\xef\\x27\\xfa\\x92\\x16\\x81\\x14\\xdb\\x4e\\x04\\x85\\xd2\\xd1\\x16\\x63\\x48\\xbd\\xc7\\xaa\\x2c\\x8f\\x53\\x55\\x0b\\x32\\x53\\xc6\\x23\\x43\\xc2\\xdf\\x86\\x74\\x62\\x8a\\xe6\\x0c\\x86\\xe6\\xaf\\x3c\\x32\\x56\\x28\\x76\\x01\\x7b\\x41\\x3b\\xb1\\x72\\x0b\\x34\\x80\\x7b\\xc4\\x37\\xb7\\x8e\\x78\\x7a\\xae\\x03\\xf3\\xe2\\xf6\\x35\\xaa\\xa8\\x64\\x15\\x21\\x57\\x81\\x00\\xdd\\x35\\x76\\x83\\x9a\\x84\\x00\\xfb\\x19\\x32\\xd7\\xb8\\x70\\x4b\\x9c\\x5b\\xaf\\x71\\x1e\\xd8\\x03\\xc2\\x79\\x68\\x22\\x85\\xda\\x81\\x93\\xc4\\x8c\\x9c\\xd4\\xff\\x10\\x6b\\xc1\\x51\\xcf\\xad\\x3e\\xc5\\x7e\\x09\\xf7\\xc8\\xf1\\xb4\\xf6\\x14\\x46\\xb3\\x61\\x24\\xe0\\x3b\\x87\\xb8\\x74\\xfb\\xf1\\x25\\xf1\\xc9\\x40\\xc4\\xeb\\x7a\\xf4\\x94\\x45\\x5b\\x9b\\xcb\\xe7\\xf3\\xa5\\x24\\x31\\x93\\xcf\\x67\\x53\\x43\\x59\\xb5\\xb6\\xf7\\x92\\xf8\\x02\\x89\\x37\\xad\\xfa\\x69\\xf8\\x49\\xf5\\x29\\xe5\\xc7\\x3c\\xd5\\xf8\\xe3\\x4d\\xe1\\x8d\\xdb\\x1d\\xbe\\x89\\x05\\xcf\\x88\\x82\\xd7\\x75\\x53\\x6f\\x8b\\x5d\\xdf\\x26\\x57\\xe0\\x68\\xf1\\xa4\\x2c\\xdf\\x77\\xe2\\x11\\x62\\xd5\\x6d\\xad\\x6f\\xf2\\x8f\\x69\\x6f\\x26\\x9a\\x47\\x60\\xae\\x2a\\x34\\xc2\\x20\\x75\\x50\\xbe\\x50\\xeb\\x52\\x07\\x83\\x64\\x86\\x8b\\xda\\x30\\x67\\x4b\\x5e\\xbc\\xb7\\x17\\x93\\xf4\\x92\\xbc\\x34\\xfd\\x00\\x4e\\xca\\x9d\\x4a\\x91\\x04\\x3d\\x08\\xd4\\x88\\x90\\xad\\xa5\\x04\\x59\\x10\\x0f\\xb5\\x3d\\x43\\x2e\\xec\\x4c\\xe7\\x87\\x93\\x30\\xda\\xc0\\x27\\x9a\\x7f\\xad\\x46\\x4c\\x7a\\x3f\\xda\\x93\\xa1\\xc9\\x69\\x3c\\xb3\\x69\\xa3\\x2f\\x7d\\xb3\\xa1\\x06\\x57\\x8e\\x31\\x9b\\xdd\\x68\\xa9\\x33\\xab\\x95\\x3d\\x55\\xdb\\xb3\\x2d\\xd5\\x5c\\xdf\\xc3\\xa9\\x0c\\xa4\\x47\\x2c\\xef\\xb9\\xba\\xf9\\xe7\\xd4\\x09\\x96\\xde\\xed\\x3f\\x6b\\xf7\\xb2\\x54\\x4e\\xa7\\x7b\\xab\\x33\\x07\\x42\\x56\\x4e\\x97\\x6e\\xe7\\xbf\\x2f\\x17\\x8b\\x6e\\x14\\x79\\x79\\x5c\\x86\\xa2\\x32\\x93\\x26\\x7a\\x9e\\x5f\\x69\\x58\\x17\\x01\\x73\\xd3\\xd7\\x58\\xf2\\x23\\xca\\x22\\x1a\\x79\\xf3\\xf3\\xac\\xa4\\x5e\\x8f\\x8e\\xfe\\xad\\x52\\x98\\xf2\\x49\\x98\\xd2\\x7d\\x11\\x36\\xd9\\xfb\\x23\\x2e\\x01\\x35\\xb4\\x24\\x10\\x29\\x42\\x5f\\x12\\xe6\\x62\\x48\\xbe\\x9f\\x4f\\x60\\x14\\x0f\\x02\\x65\\xf5\\x31\\xc1\\xd7\\x3f\\xfd\\x7e\\xf5\\xf2\\x06\\x08\\xf5\\x7e\\x90\\xb6\\x0a\\x6f\\xfe\\x54\\x83\\xc3\\x34\\x0a\\x34\\x7c\\xac\\x92\\xa3\\x84\\xa7\\x9e\\xaa\\x71\\x65\\x56\\x76\\x16\\xa4\\x57\\xd0\\x83\\xc5\\x69\\x72\\xd7\\x21\\xbc\\xf9\\x59\\x91\\x43\\x1a\\xe7\\x2d\\xae\\xdb\\x21\\x95\\x3f\\x69\\x9a\\x2a\\x83\\x84\\x19\\x06\\xff\\x64\\xc8\\xc0\\x0a\\x2b\\x83\\x84\\x0b\\x21\\x8f\\x78\\x37\\xad\\xc3\\xee\\xeb\\x66\\xdc\\xb2\\xbe\\xd8\\x93\\x16\\x48\\xb5\\x2f\\xd0\\x91\\x81\\x50\\x12\\x36\\x30\\x48\\xe2\\xd3\\xf6\\xfb\\x14\\x1e\\x47\\x86\\x25\\xa0\\xe4\\x57\\x75\\x39\\x0e\\x28\\xf8\\xcb\\xb0\\xae\\x2d\\x63\\x0f\\x26\\x4b\\xb3\\xa1\\x24\\xd1\\x6a\\xca\\x69\\x02\\xb3\\x15\\xdb\\x1f\\x89\\x6e\\xa0\\x85\\xcf\\x2e\\xfc\\xbe\\xb1\\xd9\\x4a\\x47\\xad\\xe7\\x1a\\xba\\xc1\\x1b\\x77\\x09\\xb9\\x7e\\x22\\xbe\\x9c\\xa8\\x48\\x3d\\x30\\x9d\\xf5\\x88\\xdc\\xa1\\x51\\x64\\x86\\x92\\x8b\\x91\\xb2\\x10\\xd4\\x00\\xd7\\xd6\\x96\\xf1\\xcf\\x48\\x25\\x31\\x36\\x32\\x6a\\x9c\\x96\\x5d\\x68\\x0a\\xaf\\x81\\x83\\xe1\\xc8\\x74\\x4e\\xdc\\x76\\x9b\\x5d\\x83\\xb5\\x7a\\xf7\\x8d\\x43\\x08\\x24\\xa2\\x75\\x0b\\xd7\\x1a\\xcf\\xb1\\x12\\x9a\\x43\\xbb\\xe7\\xf5\\xe0\\x84\\x44\\xce\\xb7\\xcd\\xe8\\x0a\\x9f\\x46\\x96\\xfb\\x5f\\xae\\x10\\x44\\x9a\\x04\\x06\\x02\\x81\\x7a\\x7f\\xd1\\x75\\xa2\\xbc\\xcd\\x3a\\xbb\\x6b\\x4b\\x3f\\x16\\x1f\\xbb\\xf1\\xfe\\x10\\xc8\\x20\\x7b\\x5d\\x13\\x27\\x19\\x19\\xba\\x7d\\xa8\\x42\\x50\\x26\\xdd\\xdf\\xdb\\x69\\x7d\\x94\\xf8\\xf1\\x20\\x20\\xfa\\x24\\xbd\\x66\\x4e\\x7b\\xde\\x34\\x97\\xfd\\x0d\\x8b\\x74\\x87\\x62\\x86\\xd9\\x94\\x5d\\x13\\xc2\\x85\\xd5\\xc8\\x7f\\x86\\x2d\\xc6\\x7f\\x5b\\x72\\x68\\xa1\\xdf\\x61\\x8d\\xd5\\x83\\xd9\\xd7\\x73\\x46\\x84\\xfe\\xa0\\x84\\xb7\\x5d\\xa9\\x16\\x56\\xa8\\x40\\xa6\\xef\\x67\\x3d\\x54\\xf7\\xb8\\x8e\\x9b\\x92\\x6f\\x3f\\x78\\x43\\xcb\\x70\\xf8\\xf8\\x6c\\x4f\\x4f\\x67\\x32\\x61\\xa1\\x3b\\x3a\\x9e\\x35\\xe3\\xd8\\xeb\\xbe\\x2e\\xbe\\x72\\xd0\\xdc\\xe5\\x76\\x97\\xd5\\xd9\\x7a\\xf9\\x7f\\x00\\x7c\\x2f\\x83\\xd0\\xf1\\xdc\\x6f\\x40\\x5d\\x25\\x6d\\xb3\\xc4\\x61\\x6d\\x3e\\x61\\x8e\\x90\\x75\\x0b\\x7c\\x2a\\x81\\xc3\\xc1\\xd0\\xb9\\xdb\\xbd\\x63\\xc1\\xf8\\xf3\\x58\\x30\\xf6\\x7d\\x60\\xc1\\x28\\x7b\\x60\\xc1\\xe0\\xbe\\xdc\\x48\\x36\\x89\\x09\\x6c\\xac\\x7e\\xdf\\x2e\\x41\\xff\\x4c\\x1a\\x29\\x3e\\xff\\x19\\x3b\\x4e\\xbf\\xf6\\x33\\x7d\\x15\\x3b\\xb7\\xbb\\xed\\xe3\\x8f\\xc9\\x16\\x17\\x89\\xeb\\xc5\\x37\\x2c\\x4f\\x0b\\x31\\xac\\xaf\\xbc\\xa9\\x9c\\x8b\\x8e\\xa9\\x42\\xa5\\x65\\x1c\\x58\\xed\\x75\\x30\\xb7\\x84\\xe6\\xc6\\xac\\x60\\x98\\x41\\x4a\\xcc\\x83\\x5e\\x73\\xd3\\xcb\\x85\\x47\\xf4\\x7d\\x90\\x5e\\x2a\\x26\\xd3\\x6a\\xf2\\x70\\x47\\x98\\x21\\xb7\\x56\\xe7\\xb1\\x3b\\x92\\x8b\\xac\\xda\\xda\\x35\\xd7\\x1f\\x77\\xd6\\x52\\x91\\xcd\\xee\\xbe\\x9a\\xb5\\x0d\\x49\\xa6\\x9a\\xdb\\x07\\x3e\\x2b\\x3f\\x7d\\xec\\x1f\\xce\\x5f\\x31\\xed\\xec\\xa3\\xe7\\x59\\xd7\\xaf\\xdf\\x99\\x1e\\x55\\x5f\\xdb\\x3a\\x24\\xc5\\x7b\\x02\\xe2\\x55\\xe2\\x76\\xcb\\xdf\\x85\\x7e\\xe8\\x75\\x11\\x9b\\x23\\x17\\xe2\\x6b\\xeb\\x81\\xe7\\x50\\xeb\\xa0\\x38\\xe2\\x4f\\xf6\\xe0\\x78\\xa8\\xee\\x54\\xce\\x63\\x48\\xde\\x80\\xec\\x80\\x1a\\x09\\x22\\x54\\xb5\\x5f\\x53\\xe0\\x4a\\x49\\x65\\x15\\xda\\x6a\\x52\\x3c\\x06\\x6c\\x47\\xf5\\x7e\\xc0\\x76\\x64\\xfa\\x84\\xed\\x48\\xd6\\x9a\\x04\\xdb\\xcc\\x2e\\xe7\\x4c\\xf1\\x99\\x61\\x43\\x06\\x8e\\x1e\\x33\\x72\\xd9\\xb2\\x03\\x06\\x0f\\x1c\\x98\\x19\\xf8\\x8c\\x68\\x55\\x2f\\x5a\\xa7\\x8d\\x1d\\x3a\\x76\\x42\\xe7\\x1f\\xaf\\x7e\\x50\\x3a\\xdb\\xda\\x2f\\x35\\xa0\\x31\\xdd\\x76\\x61\\x73\\xff\\x9a\\x4c\\x63\\xb9\\x75\\xd1\\x99\\xa7\\x9d\\xd0\\x3e\\xa7\\xb8\\xe8\\xf0\\xd1\\xcb\\xce\\xc2\\xfd\\xb6\\x69\\xf2\\x83\\xe2\\xc1\\x34\\x0f\\x55\\x2f\\xe4\\x67\\x69\\xf7\\x9c\\x87\\xd2\\x24\\x8c\\x21\\x22\\xdf\\x00\\x29\\x61\\x89\\x28\\x9b\\xf6\\x34\\x6b\\x15\\xf5\\xff\\xc8\\x0f\\x32\\xa7\\x55\\xdf\\xc9\\xcf\\x28\\xe9\\x0b\\x2c\\xd5\\x50\\xa7\\x96\\x22\\x36\\x56\\xc4\\xec\\x37\\xd2\\xa0\\xa0\\x7f\\x8f\\x7e\\x23\\x08\\x9a\\xce\\xd9\\x94\\xf0\\x73\\x36\\x52\\x3a\\x5b\\x42\\xf9\\x71\\x09\\x76\\x1d\\x63\\xbc\\xeb\\x48\\xfd\\x6e\\xde\\xc8\\xc7\\xe9\\xc1\\x9e\\xf6\\x3e\\xdf\\xd7\\x88\\x11\\xc0\\x86\\xea\\x53\\xb4\\x40\\x90\\xc6\\x36\\x70\\x2b\\x29\\x08\\x45\\x38\\xb6\\x20\\x7d\\xd4\\x82\\x2c\\xdd\\xa3\\x05\\x59\\xd0\\x81\\xac\\x05\\x1d\\x6e\\xdf\\xc0\\x92\\xb3\\x66\\x4f\\x3c\\xaa\\x74\\x03\\x7b\\xe4\\x0a\\xfd\\x28\\x6b\\xe3\\xf2\\xd1\\x99\\x43\\x93\\xfa\\x3b\\xd8\\x85\\x5c\\x7b\\xed\\x71\\xed\\xad\\x62\\x9a\\x77\\x21\\x47\\x37\\x36\\x85\\x23\\xfa\\x78\\x8b\\x9b\\xdb\\x5b\\x1b\\x38\\xf3\\x16\\x3a\\xbf\\x19\\x10\\x8e\\xe6\\xe8\\x13\\xb4\\xe7\\x0c\\xd5\\x31\\xc6\\x6c\\x04\\x38\\xf1\\x99\\x60\\x22\\x01\\x74\\x2a\\x41\\x72\\x0b\\xb2\\x1b\\x21\\x91\\xa8\\xab\\x8a\\xe3\\xe7\\xa9\\xac\\x93\\x5a\\xad\\x4e\\xa3\\x93\\xe4\\x73\\x35\\xe4\\x02\\xdc\\x73\\x40\\x7a\\x1d\\xa2\\xa3\\x9d\\xd8\\x4f\\xb0\\x18\\x4e\\x42\\xc8\\x98\\x9b\\xa7\\xe8\\x62\\xa1\\x94\\x6e\\xc3\\x08\\x74\\xda\\xfa\\xee\\x5b\\x37\\x4c\\xef\\xd2\\xbb\\xa5\\x23\\xd7\\x4b\\x6f\\xbf\\xc8\\x2c\\x1c\\x7b\\x07\\xdc\\xa4\\xc4\\x5e\\xfb\\x87\\x4a\\xb2\\xb9\\x5a\\x1c\\xc8\\xb6\\x48\\x43\\x40\\xb8\\x79\\xec\\xad\\x3a\\x79\\xdf\\x60\\x48\\x98\\xd3\\x5f\\xcd\\xaa\\xe0\\x1f\\xca\\x28\\x60\\x26\\x4c\\xd7\\x5b\\xd9\\xeb\\x82\\x15\\x3c\\xcc\\x10\\xc1\\x18\\x1d\\xa2\\x8f\\x32\\xd4\\x1f\\xdc\\x88\\x87\\xc3\\x3c\\x29\\x78\\x92\\xde\\x93\\xdf\\x8d\\xc0\\x19\\x65\\xdc\\x28\\x65\\x7c\\x7c\\x3e\\xda\\x9e\\x31\\xf4\\xb7\\x96\\x54\\x7b\\x7a\\xf9\\x5b\\xae\\xe1\\x87\\xde\\x73\\x87\\x2d\\x33\\x64\\xf8\\xc5\\x57\\x76\\xb8\\xa6\\x1d\\x7c\\xdc\\x79\\x37\\xd5\\xf7\\xab\\x4f\\xe0\\x77\\x2e\\x16\\xff\\xc8\\xee\\x01\\x9f\\x6b\\x01\\xcb\\xa4\\x79\\xbd\\xfc\\xe6\\xf3\\x3e\\x23\\x78\\x35\\x44\\xf0\\xc5\\x6c\\xea\\x2b\\x16\\xdf\\xc6\\xe8\\xce\\x57\\xc5\\x15\\x24\\xb3\\xa5\\x62\\xa7\\x54\\x69\\x9c\\x4d\\x19\\xcd\\xa7\\x2c\\x73\\x45\\x3c\\xb7\\x72\\xa5\\x72\\x8a\\x41\\x46\\xa9\\x89\\x73\\xe7\\xea\\x85\\x73\\x87\\xfe\\xbb\\x8f\\x9d\\xc0\\xbd\\x62\\xd1\\x2d\\x7d\\xf0\\x86\\x1b\\x1e\\x7a\\xf0\\xfa\\x8d\\x0f\\x6d\\x9e\\x39\\x63\\xda\\xcc\\x59\\xd3\\x0f\\x39\\x4c\\x66\\xa7\\xae\\x7d\\xe0\\x81\\xb5\\xa7\\x5e\\x7b\\xdf\\x7d\\xd7\\xce\\x38\\xfa\\xe8\\x19\\xa7\\x4e\\x5f\\xb2\\x64\\x3a\\xe6\\x3b\\xc3\\x85\\x75\\xd2\\x9d\\xd2\\xdd\\xc0\\x59\\x9e\\xef\\x04\\xa5\\x0c\\x0b\\xb3\\x64\\x82\\xff\\x1d\\xfe\\xd5\\x57\\x0f\\xb0\\x22\\xfd\\xb3\\x07\\xd8\\x1f\\x8c\\xab\\x75\\xec\\x2a\\xb6\\x46\\x5f\\x19\\xd4\\x57\\xe6\\x2f\\x80\\x3e\\x8b\\x70\\x2a\\xfc\\xc2\\x33\\x02\\x02\\x7c\\x92\\x53\\x88\\x00\\x95\\x37\\xf1\\xe9\\x2f\\xea\\x6d\\xf2\\x78\\x15\\x89\\x86\\x20\\x71\\x50\\x7d\\x99\\x5c\\x84\\x7b\\x61\\x25\\x9d\\x8d\\xd2\\x96\\x44\\x14\\x1d\\x94\\x28\\x11\\x08\\x14\\x31\\xb8\\x94\\xb7\\x3b\\x81\\xc1\\x16\\x39\\xef\\xee\\x64\\xbe\\x2f\\xea\\x2e\\x4a\\xa7\\xb5\\xa0\\x03\\x4f\\xfe\\x11\\x57\\x68\\x30\\xd6\\x89\\x78\\x1c\\x5b\\xec\\x0e\\x57\\x24\\xca\\x8b\\xff\\x48\\x88\\x3f\\x1b\\x55\\x34\\x97\\xad\\x03\\x37\\xa2\\x72\\xb2\\xc3\\x1d\\xa3\\x89\\x1e\\x91\\x0f\\x89\\x65\\x14\\x92\\x95\\x84\\xc8\\x7e\\xa0\\xd0\\x04\\xe6\\x93\\x6c\\xc5\\x46\\x47\\xad\\xed\\x54\\x10\\xa0\\xcc\\x01\\xfc\\x46\\xb2\\xdb\\xff\\xb9\\x68\\xd1\\x3f\\xf5\\xc5\\xcf\\xbd\\x64\\xf5\\x58\\xbc\\x5c\\xa8\\x3b\\xb2\\x04\\xd7\\xb7\\x56\\x8c\\x88\\xba\\xed\\xfa\\xcb\\x2e\\xbb\\x9e\\x31\\x31\\x04\\x9e\\x6c\\x31\\xf0\\xe1\\xaf\\x79\\x3e\\x54\\x0b\\xb7\\x09\\xd9\\x62\\xcc\\xb1\\x38\\xc5\\x05\\xcc\\x48\\x78\\x8b\\x31\\x8b\\x4a\\x70\\x4e\\x40\\xe4\\x4b\\xd0\\x7c\\x72\\xa2\\x7a\\x37\\x4e\\xd4\\xec\\x85\\x13\\xe8\\x85\\xc0\\xc9\\x67\\xe3\\xb4\\xe7\\x1a\\xc7\\xc3\\xb3\\xb5\\x06\\x33\\x34\\x9b\\x93\\x36\\x5a\\xef\\xb6\\x3b\\xdc\\xde\\x70\\xa4\\x9a\\xef\\x62\\xe1\\xae\\x80\\x4d\\x71\\xc5\\x10\\x1f\\x88\\x61\\xf7\\xd0\\x81\\xef\\xea\\xcd\\x8a\\x20\\x8b\\x3a\\xd8\\xde\\x23\\x1b\\x6a\\xb5\\x83\\x33\\xe5\\xc1\\xbe\\x83\\xdc\\x6e\\xec\\x61\\xf7\\xf4\\x1d\\xf3\\x2c\\xc2\\x38\\x60\\xd0\\x6c\\x88\\xcb\\xc0\\x0f\\x21\\x05\\xb9\\xe8\\x70\\xe1\\x75\\x21\\xdb\\x61\\xea\\x8b\\x3a\\x38\\xa5\\xb6\\x65\\x72\\x43\\x38\\x73\\x5a\\xd2\\x58\\x75\\x58\\x39\\x07\\xad\\xf5\\x48\\xaf\\x55\\x04\\x2e\\x78\\x52\\x39\\x2f\\x4f\\x81\\xc2\\xa9\\x5c\\x19\\x7f\\x39\\x5c\\x46\\x8d\\x8e\\x62\\x0c\\xe7\\x23\\x52\\xaa\\x63\\x9b\\x56\\x03\\x9a\\x52\\x91\\x56\\x6b\\x20\\x1b\\x72\\xe0\\x24\\x4e\\x36\\x50\\x43\\x33\\x9f\\x58\\xf6\\xc3\\x93\\x1d\\xc0\\xb4\\xe6\\xa1\\xa0\\x51\\x03\\xe1\\xd5\\x4c\\x5a\\x1b\\x09\\x8f\\x6b\\xd0\\xef\\x25\\x53\\xc0\\x9e\\x0e\\x65\\x4b\\x53\\xff\\x01\\x83\\x87\\x0c\\x27\\x1e\\x0e\\x19\\x0c\\xcf\\x0f\\x68\\xe4\\x15\\xcb\\xb0\\xe1\\x38\\xf0\\x14\\xe8\\x6c\\x68\\x4e\\x67\\xa8\\xab\\xa4\\x68\\xac\\x06\\x9e\\xf2\\x52\\xba\\x1a\\x56\\xb2\\xb1\\x8a\\xfe\\xfc\\x80\\xdb\\x6f\\x88\\xa9\\x8e\\xbe\\x74\\x71\\x9c\\xf5\\x57\\x22\\x2d\\x3b\\x97\\x0b\\xa5\\xba\\x50\\x53\\xa5\\x73\\xf6\\x15\\x7e\\xbb\\x3b\\xfb\\xd2\\x5f\\x51\\x68\\xd2\\x57\\x48\\x6f\\x43\\x1c\\x45\\x2c\\x93\\xc5\\x90\\x8d\\x30\\xde\\xb5\\x44\\x40\\xbf\\xa2\\x14\\x4d\\x36\\xfa\\x69\\xc3\\xd5\\x1f\\x34\\x90\\x4c\\xc0\\x75\\x7b\\x20\\x9c\\x78\\xa8\\xf5\\x88\\x91\\x23\\xce\\x51\\x64\\xb0\\x81\\x6e\\xe0\\x19\\xe1\\x06\\xbf\\x8c\\xa8\\x38\\x50\\x00\\x16\\xd1\\xc0\\x7a\\x89\\x9f\\x90\\x4c\\x38\\x10\\x5a\\x7b\\x4b\\x1b\\x82\\x97\\x24\\xbc\\x88\\x0f\\x19\\xe6\\xc1\\x32\\x11\\x8d\\xe0\\x30\\x1d\\x66\\x79\\x4d\\x6b\\x97\\x0f\\xa9\\x65\\x49\\x71\\xea\\x69\\x07\\xcd\\x38\\x62\\xce\\xb8\\xc5\\x12\\x2b\\x11\\x45\\xbd\\xfb\\x1f\\x1f\\xea\\x6c\\x31\\xab\\x29\\x39\\xfb\\xf5\\x09\\x4d\\x87\\xcf\\xb8\\x62\\xf5\\xdc\\x41\\xbf\\x9b\\x36\\x7b\\xc9\\xa1\\x33\\xac\\x8f\\x3c\\xff\\xa1\\xf4\\xe9\\x8e\\x1d\\x94\\x55\\x08\\x96\\x75\\xb6\\x7e\\x10\\x33\\xfc\\x42\\x58\\x28\\x16\\xc6\\xf4\\x89\\x9d\\xe1\\xcf\\x9b\\xa4\\x3b\\xd2\\x03\\xa0\\x11\\x4b\\x21\\x3d\\xbd\\x00\\x34\\x22\\x34\\xf7\\xb7\\x27\\x80\\x46\\x82\\xe1\\xb4\\xb6\\xd4\\x17\\x8c\\x86\\xee\\x67\\x53\\x68\\x8a\\x7b\\xca\\x9e\\x78\\x1a\\xb6\\x2a\\xab\\xfe\\xe3\\xce\\xe1\\x04\\xaa\\x61\\xae\\xb5\\x32\\xbf\\xd6\\x71\\xfb\\xbd\\x56\\x48\\xf3\\x7e\\xe3\\x72\\x83\\x90\\x42\\xed\\x65\\xb9\\xa2\\xc8\\x53\\xab\\xb7\\xf7\\x5c\\xaf\\xb5\\x88\\xb2\\xad\\x9d\\x07\\xc1\\x8a\\xcd\\xf5\\xb6\\xd3\\x7a\\x8b\\x85\\xb2\\x5f\\xe7\\x6d\\xac\\x87\\xb7\\xe6\\xde\\x5b\\xc1\\x62\\x63\\x0a\\xcf\\x97\\xf6\\x5c\\x6c\\x6b\\x75\\xc6\\x02\\x96\\x62\\xdb\\x1b\\x7f\\x47\\xb1\\xd8\\x9d\\xac\\xfc\\x8d\\xf5\\x7f\\xb2\\xf5\\xb1\\xe4\\xa6\\xd8\\xd7\\xdf\\x45\\xaf\\xb9\\x66\\x67\\xa6\\x60\\xcd\\xb3\\x68\\xcd\\x55\\x90\\x8b\\xfc\\xe5\\xd7\\xd6\\x5c\\x9d\\xe7\\x31\\x2c\\x39\\x2a\\x77\\x75\\x26\\xa2\\x71\\x3b\\x84\\x61\\xf4\\xcb\\xf5\\x29\\x55\\x29\\xec\\x4f\\xe3\\xc9\\x3e\\x7b\\x3a\\x57\\xc2\\xb1\\x93\\x8d\\x7c\\x12\\xca\\x18\\x6c\\x5c\\x6b\\x55\\x8a\\xb1\\x31\\xa3\\xc6\\x94\\x7b\\x64\\xc9\\xeb\\x0b\\xc5\\xab\\x6b\\x38\\xd6\\x8d\\x86\\x68\\x81\\xbd\\x78\\x51\\x0d\\xbc\\xa8\\x45\\xff\\xad\\x56\\x41\\xf8\\xc2\\x99\\xd3\\xbe\\xf8\\x42\\xd1\\xbf\\x67\\x73\\x87\\x20\\x6a\\xf7\\xc2\\xa2\\xe6\\xd3\\x66\\x0f\\x7c\\xa4\\x25\\x99\\x59\\x7f\\xda\\x9c\\x31\\x5a\\x4b\\x55\\xf3\\xe8\\x3e\\x38\\x35\\x73\\xfe\\x65\\x87\\x0d\\x4f\\x35\\x2d\\xf8\\xdd\\x61\\x23\\x9a\\x76\\xa6\\x51\\x29\\x2d\\x06\\xbf\\x3c\\xc4\\xaf\\x90\\x50\\x04\\xb9\\xf5\\xc5\\xbf\\xc6\\xb1\\x70\\x81\\x56\\xaa\\xc5\\x19\\x84\\x7c\\x53\\x63\\x69\\x4a\\xb6\\x95\\x6d\\xb4\\x57\\x18\\xf2\\x53\\x29\\x5a\\x6a\\xe7\\x88\\x89\\x21\\x05\\x9b\\xcd\\x6e\\xaf\\xcf\\x43\\x58\\x62\\xc5\\x8a\\x16\\x2d\\x42\\xdc\\x07\\x88\\xd6\\x76\\x97\\x33\\x42\\x6e\\xb7\\x80\\x37\\x02\\xed\\xfb\\xf7\\xa9\\x27\\x89\\x30\\xaa\\x08\\x96\\xcd\\x7d\\xf1\\xa0\\x9a\\xb9\\x08\\xd3\\x66\\x11\\x73\\xed\\x46\\xf9\\x88\\xad\\x5b\\x77\\x96\\x8b\\x8c\\xbd\\xbf\\x75\\x6b\\x9e\\xe6\\x6b\\x89\\xe6\\x52\\xa1\\x42\\x68\\x14\\x36\\xfe\\x1a\\xcd\\x65\\x79\\x9a\\x63\\xf9\\x2e\\x59\\xbf\\x14\\xd6\\x70\\x94\\xd3\\x35\\x91\\xa2\\xf4\\xea\\x92\\xe5\\xa2\\x3c\\xa7\\xeb\\x8f\\x0d\\x32\\x60\\x40\\xa7\\xe4\\xf3\\x96\\x21\\xf9\\xb5\\x4a\\x67\\xac\\xbc\\x22\\x84\\x97\\xd1\\x40\\xa7\\xec\\xb0\\xc7\\x77\\x67\\x00\\x82\\xc6\\x94\\x77\\xd0\\x01\\x0d\\x2d\\xaa\\x74\\xec\\x5d\\x35\\x78\\x3c\\x41\\x95\\x90\\x0a\\x6a\\xfa\\xbe\\x58\\xf3\\xee\\x99\\xb3\\x67\\x9e\\x71\\xc6\\xcc\\x39\\x2b\\xd3\\xc8\\xa0\\x23\\x07\\xf6\\xab\\x6f\\x69\\xa9\\xef\\x37\\x70\\x37\\x36\\xbd\\x3c\\x7d\\xf9\\xf2\\xe9\\x87\\x1c\\x7f\\xfc\\x8e\\x8f\\x44\\x26\\x2e\\x6b\\x68\\x6f\\x6f\\x68\\x1c\\xd8\\x61\\xd6\\xff\\x82\\xed\\x36\\xa8\\x47\\xd0\\x0f\\x3c\\xc5\\x27\\x8a\\x54\\x21\\x43\\x07\\x13\\x02\\xc6\\xf9\\x66\\x2d\\x08\\x49\\x1b\\x3d\\xca\\xf9\\x0a\\x60\\x37\\xed\\xc6\\x39\\xd2\\x9c\\x95\\x9e\\xcc\\x45\\x62\\x01\\xe4\\x65\\x44\\xea\\xca\\x39\\xdc\\x74\\xe9\\x90\\xf2\\xd3\\x7f\\x76\\x67\\x17\\xa2\\x3d\\xe3\\xf6\\xb6\\xdf\\x06\\xc5\\x19\\x8d\\x84\\xf8\\x02\\x10\\xc6\\xfd\\x7e\\xd5\\x42\\x48\\xc7\\x36\\x42\\x3a\\xb6\\xd8\\xba\\x68\\xde\\xcf\\x8e\\x78\\x59\\xa1\\x70\\x49\\x07\\x4d\\x26\\x67\\x1d\\x68\\x80\\x50\\xb2\\x05\\x10\\xa2\\xcd\\xa2\\x68\\x4e\\x17\\x8d\\xa1\\xd1\\x59\\xdb\\x50\\x14\\xc7\\x59\\x25\\x9c\\x22\\x29\\x33\\x79\\x8a\\x87\\x30\\x83\\x90\\x01\\x05\\xf9\\xd6\\x57\\x1e\\x2d\\xa9\\x76\\xe4\\xc5\\xe2\\x6d\\xd2\\xcf\\xef\\xb9\\xf4\\x3f\\xf8\\xd9\\x77\\x7a\\x44\\x61\\x67\\xbb\\xdf\\xdd\\xf1\\xf1\\x35\\x56\\x7d\\xda\\xf4\\x43\\x96\\xb3\\x74\\xd4\\xb2\\x39\\x24\\x7f\\xa1\\x5f\\x75\\x85\\x7e\\xcd\\x47\\xfa\\x92\\x2b\\xf4\\x35\\x9b\\x4b\\xd7\\xdd\\xea\\xdd\\x2c\\x8e\\x11\\xfb\\x31\\xea\\x31\\xb6\\xe8\\x19\\xc2\\x10\\x12\\x40\\xbf\\x06\\x08\\x57\\xf3\\x7d\\xc2\\x5c\\x25\\xef\\xb5\\x51\\x86\\x68\\x31\\x0f\\x99\\xf6\\x4b\\x69\\x0d\\xe8\\x6d\\x9a\\x53\\x2a\\xdb\\x66\\xe0\\xf2\\x91\\xda\\xd4\\xda\\x09\\x60\\xab\\x98\\xe3\\x85\\xc4\\x1c\\x78\\x36\\x55\\x4b\\x63\\x2f\\x1a\\x68\\xe8\\x4c\\x54\\xf6\\x6b\\xe0\\xfa\\xb4\\xc5\\x12\\x8e\\x7b\\xab\\x68\\x97\\xac\\x18\\x7c\\x4d\\x11\\x92\\x1c\\x6f\\xc0\\xb7\\x54\\xd5\\x22\\xae\\x96\\xe6\\xad\\x04\\xfa\\x1d\\x15\\xc4\\x24\\x4b\\x3e\\x19\\xdc\\x37\\x02\\x11\\xdb\\xad\\x8a\\xfa\\x15\\x44\\x22\\xb6\\xa3\\xa0\\xca\\xda\\x37\\x3c\\x51\\xf7\\x0f\\xbd\\x8a\\x30\\x89\\x63\\x00\\x41\\x0c\\x0f\\x41\\x54\\x8c\\x09\\x7f\\xfb\\x35\\x1c\\xa0\\x30\\xa1\\xdb\\xed\\x37\\x18\\x50\\xc9\\x6f\\x00\\x03\\x2a\\x45\\xbd\\x13\\xc1\\xec\\x22\\x51\\x42\\xdb\\xe8\\x54\\x8a\\x8a\\x31\\x99\\x56\\xed\\x81\\xdf\\x84\\x0c\\x94\\xa0\\xc3\\x5d\\x7b\\xe2\\x03\\xed\\x38\\xef\\x53\\x4a\\x15\\xf6\\xc0\\x09\\xa2\\x44\\x41\\xc8\\xf3\\xa2\\xd2\\xe0\\xc5\\xe6\\xff\\x53\\x5e\\xa8\\x91\\xd4\\xff\\x8c\\x1d\\xd8\\x05\\x41\\x66\\x44\\xf7\\xc6\\x0c\\xc7\\x3e\\x99\\x41\\xc9\\x48\\x5f\\xcc\\x60\\x7f\\xe2\\x99\\xc8\\x1e\\xec\\x30\\xf2\\x90\\x3c\\x3f\\xda\\x89\\x1f\\x71\\xdc\\x6f\\xff\\x3f\\xd5\\x8d\\xf2\\xdf\\xc0\\x8c\\x0a\\x83\\x19\\xd9\\x48\\x94\\x76\\x38\\x1c\\x4a\\x0e\\xb4\\xa3\\xb4\\x8c\\x73\\xa4\\xd3\\xe3\\x8d\\xf1\\xa2\\x74\\x7f\\x35\\xc4\\x4c\\x7a\\xfa\\x62\\xcc\\x5b\\x66\\xc2\\xb3\\x27\\x67\\x8c\\x74\\x07\\xf3\\x49\\xce\\x1b\\x0f\\xf1\\x06\\xfd\\xf2\\xf3\\xff\\xd7\\xda\\xa2\\xc6\\x32\\x78\\xbe\\x4e\\x2d\\x49\\x9b\\x08\\x47\\xc0\\x2a\\x70\\x30\\xe9\\x3e\\x98\\x15\\xb1\\xd3\\xbf\\xd8\\x9d\\x6d\\x9d\\x65\\x76\\x07\\xa4\\x53\\x31\\x3b\\x46\\x4e\\xad\\xcc\\xce\\xbd\\xb6\\x43\\xe4\\xa7\\xba\\xca\\x94\\xdf\\xa6\\x49\\xe6\\xd6\\x61\\x5f\\x3c\\x7b\\x88\\xb6\\x13\\xf7\\x64\\xd8\\x08\\x73\\x7f\\x71\\xd7\\xb7\\x88\\x71\\x64\\xab\\x07\\xce\\x59\\x04\\x05\\xb1\\xdd\\xf2\\x67\\x0e\\x10\\x8b\\x0b\\x79\\x93\\x07\\x1c\\xf2\\xd0\\x90\\x1f\\xb6\\x5b\\xa9\\x47\\x68\\x37\\x87\\x7d\\xf1\\x9d\\x76\\x9f\\x09\\x34\\x84\\xa5\\x10\\x82\\xc4\\xf8\\xec\\x18\\x5f\\x64\\xa9\\x83\\xba\\x36\\x12\\xda\\x3e\\x2b\\x84\\x3f\\xf2\\x92\\xd1\\xeb\\xba\\x01\\x83\\x64\\x4b\\x82\\xb1\\xff\\xfc\\x41\\x2f\\x34\\x24\\xb4\\x7d\\xc4\\x60\\xba\\xd9\\x96\\x10\\x5c\\x82\\x1b\\xd6\\x37\\xab\\x37\\x0e\\x93\\x3b\\x1f\\x33\\x38\\x18\\x13\\x54\\xc6\\x26\\x2c\\xd8\\xaf\\xe1\\x31\\x05\\x0d\\x8e\\x6b\\x5e\\x85\\x16\\x58\\xb8\\xb4\\x04\\x35\\x5b\\x8d\\x85\\x75\\xdf\\xba\\xb4\\xd0\\x20\\xf9\\xd2\\xac\\x51\\xc3\\x16\\x77\\xfd\\x1b\\xd6\\xf7\\x8c\\xad\\x4d\\xb0\\x0b\\x0e\\xd0\\xb8\\x59\\x05\\x98\\x09\\xa1\\x34\\xed\\x32\\x65\\x7d\\x22\\x3f\\x01\\xa8\\x2a\\xfc\\x84\\xb6\\x7b\\x1b\\x87\\xb9\\x72\\x17\\xc2\\x5c\\xb9\\xe9\\xbc\\xb6\\xdb\\x4b\\x4b\\xa5\\xc9\\xe2\\xa0\\x1b\\x0f\\x9b\\x5b\\x25\\x9a\\xc5\\xc5\\x43\\x97\\x66\\x3d\\x50\\xb8\\xd2\\x98\\x69\\x13\\xf7\\x1b\\xab\\xb5\\x36\\x72\\x53\\xf8\\xf9\\xd5\\x5e\\x9c\\x94\\x77\\x3d\\x03\\xeb\\x7c\\xda\\xe6\\xa6\\xbd\\x34\\xcc\\x6a\\x4f\\x10\\x48\\xba\\x74\\x24\\xc6\\x97\\xe6\\xe8\\xa8\\x4e\\xd1\\x68\\xa8\\xba\\xf1\\xb8\\x09\\x01\\xe4\\x48\\x7c\\xf0\\x3d\\x5c\\xb8\\x73\\x6d\\x73\\x71\\x08\\x20\\x2f\\xe1\\x27\\x78\\xdd\\x84\\xf6\\x93\\xb5\\x79\\xf3\\x10\\xd2\\x96\\x74\\xa7\\xe2\\xb5\\x61\\xc1\\x00\\xaa\\x1d\\xe1\\xe7\\x7b\\x30\\x4d\\x2d\\x5c\\x39\\x3e\\x31\\x90\\xb9\\xfe\\x69\\xac\\x7b\\x1b\\x73\\x59\\x87\\x6f\\xdd\\xfa\\xf3\\xa3\\xbd\\xb8\\x3c\\x1c\\x95\\x54\\x14\\xfa\\x43\\x6e\\x3a\\x9e\\x30\\x11\\xca\\xf1\\x6c\\x25\\xcd\\xea\\x07\\xf0\\xf4\\x27\\x01\\xf8\\xc9\\xdc\\x6a\\xf9\\xf4\\xbe\\x69\\xb2\\x4c\\xf0\\xe0\\x54\\x51\\x3c\\x83\\x9d\\x52\\xec\\xa5\\x94\\xf2\\xbb\\xc2\\xf8\\x69\\xcf\\x05\\xf3\\x89\\x12\\x48\\xcb\\xc8\\x5e\\x03\\x88\\x73\\xe4\\xa7\\x49\\x23\\xbf\\xc0\\x87\\x89\\x4c\\x28\\x99\\x04\\x56\\x6b\\x01\\x5f\\x7e\\xa8\\x2f\\x83\\xcb\\xe7\\x08\\x39\\xf5\\x0c\\x27\\xf3\\xf3\\x10\\x7f\\xd8\\xb7\\xe8\\xff\\xc4\\x7a\\xf1\\x2a\\x13\\xe5\\xaf\\x7b\\xf9\\x7a\\x56\\xc5\\x91\\xfe\\xb6\\x6d\\x13\\xff\\xb8\\x9e\\xfd\\xad\\x00\\xec\\x6f\\x73\\x9c\\x6d\\xd5\\xc7\\x12\\xe2\\x9f\\xbe\\x68\\xbd\\x89\\x2d\\x69\\xb5\\x43\\x8d\\x16\\x85\\x7a\\xa3\\x51\\xf8\\x74\\x0f\\x8c\\xa2\\x22\\x53\\xd5\\x0b\\x81\\x8a\\xd4\\x1a\\xa8\\x28\\xa1\\x3c\\xab\\x2f\\xaf\\x01\\x6e\\x97\\x62\\xc2\\xd4\\xb4\\x3f\\xc8\\x45\\x6a\\x23\\xde\\x66\\xc5\\xbc\\x3d\\x4e\\x2a\\xd7\\xc8\\xaf\\x7e\\x0d\\xd2\\xa8\\x33\\xa9\\x80\\xdf\\xca\\x55\\xf2\\x77\\x57\\xa6\\x72\\xc9\\x9e\\x74\\xbe\\x11\\x3b\\x6b\\x41\\x6c\\x38\\x56\\x2a\\x5a\\x29\\xf6\\x83\\x92\\x01\\xcd\\x1e\\xe8\\xe8\\x8d\\x7a\\xa4\\xd5\\x60\\xcf\\xb2\\xb1\\x43\\x2d\\x57\\xd4\\xe2\\x7d\\x60\\x20\\xf5\\x59\\xe6\\xf5\\x05\\x8c\\xd4\\x7d\\x2b\\x9b\\xb5\\x5b\\x95\\xb7\\x37\\xac\\xa4\\x5e\\xa5\\x1e\\xf5\\x1e\\x08\\x37\\x09\\x7c\\x9f\\x20\\x78\\xa1\\xe6\\x49\\x08\\x13\\x8c\\x3d\\xbc\\x80\\x11\\x2b\\xb8\\x6b\\x31\\xf1\\xfb\\x58\\x1e\\x06\\x12\\x8f\\x2b\\x39\\x8c\\xe3\\xd2\\xb8\\x9f\\x98\\xb3\\xb8\\xcb\\x2a\\x12\\x14\\xe8\\x8a\\x03\\x66\\x41\\xaf\\xec\\x03\\x4d\\x89\\x32\\xa1\\x7d\\x40\\x2a\\x79\\xc8\\x37\\xfe\\x2a\\xb0\\x92\\x7c\\x00\\x26\\x48\\x26\\x1d\\x89\\x3c\\x1d\\x93\\xf7\\x46\\x07\\x94\\xa3\\xff\\xd7\\xa4\\x90\\xab\\xdc\\x07\\x29\\x8f\\x72\\xe7\\xf9\\xab\\xb4\\x48\\x69\\x73\\x4f\\xcb\\xa4\\xa7\\xcd\\xa0\\xa7\\x5a\\x38\\x64\\xef\\x72\\xa9\\xe9\\x8b\\x98\\x5a\\x83\\x98\\x2d\\x48\\x4c\\x92\\xee\\x04\\xe4\\x50\\xb4\\x04\\xa1\\xe8\\xee\\xa7\\x80\\x4c\\x6f\\xbb\\x0f\\xca\\x98\\xe9\\x7b\\x7f\\x9d\\xb6\\xb1\\x3d\\xf9\\x09\\xa7\\x6d\\x26\\xd1\\x56\\x09\\x55\\xd0\\xe9\\x06\\x6d\\x35\\xbd\\x68\\x6b\\x02\\x59\\x95\\xd2\\xb9\\xa3\\xce\\xf2\\x70\\xa9\\xdd\\xd8\\xce\\xe2\\xc5\\x50\\xd2\\xd2\\xd5\\xe9\\x4b\\xb2\\x1e\\x43\\x4c\\xf2\\xd9\\x83\\x9e\\xbb\\x5d\\xd5\\x1b\\x7c\\xc0\\xb2\\xa8\\x08\\xca\\x9c\\x2d\\xee\\x80\\xa5\\xb4\\xa6\\x89\\xa4\\x1a\\x2e\\xa5\\x0d\\xdd\\x3d\\xe9\\xef\\xc3\\xe0\\xa4\\x5f\\x81\\x00\\x0b\\xee\\x66\\x79\\x97\\xee\\x1d\\x12\\x4c\\x7e\\xae\\xb0\\xcf\\x72\\xe3\\xee\\x40\\x54\\x16\\x83\\x2f\\x6e\\xe2\\x4b\\x00\\xea\\xc3\\x2a\\xe1\\x24\\x83\\x33\\x91\\x5e\\x9c\\x29\\x93\\xf0\\x8c\\xa9\\x9a\\xc8\\x60\\x46\\xa7\\x56\\xf2\\x71\\x51\\x46\\x21\\xb5\\xd3\\x17\\x64\\xc8\\x2a\\x88\\x52\\x41\\xde\\x6c\\x01\\x26\\x74\\x56\\x39\\x8a\\xe1\\xc9\\x84\\x9d\\x60\\x75\\xab\\xec\\x7c\\x1c\\x34\\x81\\xe0\\x73\\x16\\x77\\xa4\\x8c\\x78\\x52\\x86\\x2d\\xc3\\x8a\\x3e\\x78\\x82\\x41\\xab\\x17\\x0f\\xf0\\x99\\x3d\\xf9\\x60\\x63\\xae\\x2f\\xf3\\x5a\\xf1\\x1a\\x73\\xf5\\x41\\x7e\\xe7\\xd6\\xad\\x3b\\xaf\\xe8\\xad\\x14\\x73\\x20\\xb8\\x31\\x61\\xa8\\xf0\\xa2\\xf4\\x9d\\x7c\\x05\\xe4\\x37\\x42\\xd0\\xc1\\xda\\x1d\\xb8\\x11\\x61\\x73\\x40\\xa5\\xd8\\xaa\\x3f\\xbf\\x89\\x0d\\x60\\x03\\x36\\xe9\\xcf\\xb3\\xd6\\x4d\\xfa\\x4b\\xfa\\x4b\\xec\\x64\\x36\\x98\\x0d\\xbe\\x45\\x7f\\x8e\\xb5\\xdd\\xa2\\x3f\\xa5\\x3f\\x75\\x0b\\x6b\\xd3\\x9f\\xc3\\xd8\\x71\\xd0\\xae\\x9b\\x2c\\xcb\\x2c\\x5f\\x42\\xbe\\x5b\\x2d\\x34\\xe3\\xce\\x28\\x6d\\xff\\xd6\\x9b\\x68\\x64\\x95\\x68\\x28\\x69\\x8a\\xe0\\xb8\\xeb\\x1b\\xa3\\xc9\\x14\\x8c\\xe0\\x5a\\x06\\xd1\\xc8\\x04\\x7e\\x97\\x81\\x46\\x65\\x8b\\x5d\\x0e\\x29\\xe5\\xd4\\x9e\\xf3\\x06\\x34\\x27\\x0d\\xd1\\xd7\\x63\\x03\\x0f\\x9b\\x04\\xe8\\xd6\\xe3\\xcd\\x04\\xd6\\x4b\\xdb\\x2c\\x26\\x04\\x29\\x1e\\xda\\xb2\\x45\\x02\\x65\\x0c\\x1e\\x10\\x14\\x44\\x7b\\x0d\\x1e\\xdc\\x2a\\x67\\x8c\\x2a\\xe8\\x70\\x10\\x27\\xb1\\x91\\x7f\\x35\\x29\\x76\\x10\\x72\\x6e\\xfa\\x75\\xa3\\x47\\xae\\x39\\x76\\xe5\\x45\\xc8\\xbd\\xf9\\x77\\x8c\\x3d\\x7c\\xcd\\x65\\xc7\\x9f\\xca\\xaa\\x2a\\x93\\x56\\xf6\\x46\\xed\\xdc\\x96\\x7b\\xb7\\xac\\xaf\\x3f\\x66\\xc4\\x7d\\xf7\\x0f\\xe8\\x6f\\x35\\xb8\\x58\\x9d\\x5c\\xbe\\x65\\x91\\xfe\\xec\\xfd\\xc4\\xc9\\xa6\\xc6\\x3f\\x7f\\x75\\x14\\xab\\xd3\\x8e\\xba\\x73\\x30\\x93\\x1a\\xa3\\xc8\\x47\\x7d\\x40\\xb2\\x0a\\xb9\\xba\\xec\\xc1\\x03\\x18\\xf0\\x82\\x30\\xa1\\xa0\\x6e\\x16\\xc8\\x13\\x5e\\x6a\\xcc\\x94\\x9a\\x58\\x8d\\x7c\\x37\\x53\\x31\\x3a\\x5a\\xfe\\x20\\x1d\\xd5\\xa8\\xa4\\x0d\\x71\\x3b\\x44\\x3d\\x3b\\xc1\\x92\\xe2\\x01\\xda\\x6c\\x09\\xa5\\xb7\\x25\\xb8\\xe9\\x64\\xf7\\x6b\\x5e\\x8e\\xea\\x95\\x0d\\x7b\\xcd\\x53\\xa9\\x26\\xd6\\xa1\\xdf\\x00\\x6f\\xb5\\xe3\\x3e\\x78\\x59\\x1c\\xf7\\x41\\x94\\xce\\xa2\\x72\\xc3\\x87\\x32\\x44\\xb7\\x0a\\x95\\x76\\x70\\xdd\\xda\\x3b\\x54\\x14\\x05\\x84\\xbe\\xf1\\xa2\\x3e\\xe1\\x68\\x28\\x7b\\x47\\x8d\\x12\\x47\\x72\\xa0\\x14\\x93\\xf6\\x4a\\x83\\xf6\\x2b\\x7e\\x9d\\x76\\x33\\x1e\\xfc\\xef\\xc9\\xf7\\x42\\xb6\\xdf\\x59\\x54\\x16\\x4f\\x18\\x77\\xb0\\x28\\xaf\\xe8\\xf8\\x0d\\xe4\\x53\\x31\\xdc\\x37\\xf9\\xec\\x3a\\x1e\\x40\\xf6\\xc1\\x00\\xd6\\x66\\x86\\x8e\\x3c\\x0f\\xda\\x89\\x07\\xd5\\xc2\\xef\\xf7\\x47\\xfe\\x35\\xff\\x5b\\x06\\xd4\\xee\\x26\\xff\\x1c\\xc8\\x9f\\x87\\x9d\\x70\\xc0\\x08\\x3b\\xfb\\xad\\x08\\x66\\xe0\\xe9\\x9b\\x1b\\x6f\\x98\\x31\\x67\\x5f\\xec\\x98\\x60\\x46\\x1b\\x8c\\x37\\x9c\\x1f\\x1e\\xe2\\x07\\x7a\\xd5\\x8d\\xfb\\xa5\\x15\\xe8\\x5f\\xe3\\x3d\\xfe\\xd5\\x60\\x4f\\x0f\\x4f\\xa0\\x82\\x2d\\x01\\xaf\\x5a\\x61\\xc7\\x11\\xa7\\x5f\\x65\\x50\\x67\\x55\\xd8\\xdb\\x87\\x0f\\xae\\x00\\x96\\x14\\xb9\\x7e\\x1b\\x77\\x78\\xa9\\xdb\\x37\\x73\\x1e\\xa0\\x62\\x77\\x5f\\x9c\\x39\\xdc\\x28\\x7b\\x41\\x4f\\x08\\x57\\x8b\\x6c\\x25\\xc2\\xf1\\x3f\\x0a\\xcf\\x83\\xf6\\x30\\xc6\\xc9\\x19\\x23\\xf3\\x43\\x54\\xd1\\x14\\xed\\xd0\\xef\\xf3\\x54\\x68\\x99\\x71\\x2a\\xf4\\x1e\\xd9\\x6a\\x73\\x38\\xa5\\x22\\xde\\x00\\x61\\x41\\x1c\\x3b\\x8b\\x18\\x14\\xf6\\x01\\xb4\\xe5\\x20\\x1b\\xe8\\x03\\x6d\\x8b\\xad\\xec\\x31\\x80\\x3e\\x51\\xb7\\x58\\x23\\x57\\x7f\\x51\\x18\\x05\\x02\\xff\\x85\\xb0\\xc2\\xe2\\xbd\\x50\\xb5\\x43\\x05\\x88\\xc5\\xf6\\x74\\x2e\\x10\\x21\\x8c\\x66\\xc8\\xa6\\x72\\xce\\x38\\x5d\\x3a\\x7b\\xfa\\x3e\\x41\\x3c\\xcb\\x12\\x49\\xa7\\xb3\\x41\\x2a\\x1f\\x82\\x76\\x5e\\x9f\\x8a\\xc1\\xc2\\xd6\\x46\\x90\\x43\\x06\\x79\\xf9\\x8d\\x1b\\xa0\\x44\\x32\\x3a\\x15\\x71\\x0c\\xa4\\xde\\x0e\\x4d\\xde\\x0d\\x55\\x1b\\xe4\\x19\\xa6\\x9b\\x36\\xc8\\x0d\\x2c\\x5c\\x00\\xd4\\x38\\x6a\\xc3\\x06\\xf6\\xe8\\x86\\x0d\\xef\\xe8\\xac\\x54\\xff\\x58\\x7f\\x07\\xae\\xce\\x84\\xff\\xde\\x31\\x6b\\xc0\\xe1\\x3f\\x3d\\xf3\\xec\\x4f\\x87\\xc4\\x37\\x8b\\xe2\\xb9\\x87\\x1f\\x7e\\x3e\\x3f\\x2f\\x80\\xfa\\x6c\\xb5\\x56\\x0b\\xf5\\xc2\\x25\\x86\\xcc\\x8a\\x0b\\x3a\\x3b\\xa0\\xac\\x1c\\xaa\\xa5\\x1f\\x11\\x53\\x8f\\x67\\x48\\xea\\xf3\\xb5\\x4f\\xbd\\x5f\\xab\\xc4\\xac\\xc0\\xd9\\xa5\\x3a\\x8c\\xbb\\xbc\\xe0\\xad\\x28\\xcb\\xe9\\x2e\\x2f\\x9d\\xa5\\x8e\\x4a\\x3b\\x8d\\x3f\\xd1\\x11\\xd9\\xf2\\x7a\\x70\\x68\\xd6\\x48\\x98\\xcc\\xd8\\xad\\x68\\x01\\xc2\\x19\\x60\\x3c\\x58\\x6a\\xd5\\xc5\\x58\\x9c\\x3b\\x7c\\x91\\x3c\\x78\\x2d\\x8e\\xb0\\xe3\\xde\\x43\\x38\\x24\\xf0\\x1d\\x08\\xe3\\xec\\x5c\\x6b\\x8b\\xd0\\xda\\x62\\x6e\\x7c\\x23\\x24\\xa0\\xf8\\xde\\x96\\x2f\\x8e\\x65\\x0d\\xff\\x7e\\x63\\xd2\\xb5\\xd5\\x6d\\x55\\xc7\\x0d\\x99\\x78\\xa8\\xfe\\xea\\x09\\x53\\xc6\\x4c\\x9c\\xbf\\x39\\x2e\\x9d\\xf7\\xe1\\x8f\\x8f\\xa8\\xc7\\x3f\\x31\\x7a\\xa0\\xfe\\xc9\\xe5\\x0f\\x3d\\x18\\x8f\\xbd\\x17\\x49\\x4c\\x1c\\x31\\x96\\x79\\xae\\x9c\\xfd\\xcc\\x84\\xb1\\x87\\xfd\\xee\\xd4\\x1d\\xf7\\x98\\xf3\\xac\\xf2\\x08\\xcb\\xbf\\xe1\\xba\\x0a\\xf8\\xd0\\x22\\xdc\\x28\\x64\\x2b\\x05\\x9e\\x35\\x72\\x10\\x98\\x98\\xd1\\xe3\\xca\\x06\\x98\\x09\\xc0\\x46\\xf5\\xad\\xc3\\xe3\\x68\\xc8\\xa5\\xe5\\xca\\x00\\xc8\\x3c\\x8d\\x19\\x65\\x2b\\xe5\\x4e\\x78\\xab\\x1b\\x4f\\x5a\\xed\\x07\\x66\\x8c\\xd3\\x25\\x29\\xbc\\x1a\\xc0\\xb0\\x8e\\xc7\\x83\\x36\\x5a\\x1b\\x02\\x63\\xe1\\x04\\x4e\\x35\\x96\\x75\\x03\\x10\\xca\\xb2\\xb2\\xb6\\x9e\\x1f\\x3a\\xc9\\x96\\x96\\xd7\\xd1\\xce\\x76\\x0c\\xfd\\x5f\\x55\\x39\\xbc\\x21\\xad\\x64\\x23\\xac\\x05\\x8b\\x3d\\x87\\x4c\\xdc\\x42\\x95\\xdf\\x0f\\xa4\\x2c\\x8a\\x81\\xd2\\xfe\\xc2\\x65\\x5d\\x4d\\x61\\xf1\\x9c\\xfd\\xc1\\xcc\\xb2\\x1c\\x84\\x1b\\xce\\x73\\x4d\\xe4\\x2c\\x93\\x7f\\xef\\x12\\xff\\x52\\xc0\\xbf\\x3f\\x19\\xfc\\xab\\xdb\\x2f\\xfe\\x35\\x71\\xfe\\x35\\xf5\\xf0\\xaf\\x9a\\xf3\\xaf\\x3a\\xcf\\x3f\\xb8\\x6a\\xe8\\xcd\\xbf\\x86\\x6a\\x4a\\xc3\\x2b\\x07\\x34\\xb7\\x10\\xe3\\x94\\xce\\xd2\\xf2\\x34\\x9f\\x99\\xef\\xe1\\x5c\\x13\\x72\\x2e\\xf5\\xdb\\x39\\x57\\x80\\x31\\x46\\xe5\\xd8\\xfe\\x02\\x8d\\x25\\xb8\\x67\\xd9\\x0f\\xbc\\x31\\xe9\\x70\\xee\\x63\\x4c\\xde\\x7d\\x47\\xbc\\x6b\\x12\\x06\\x0a\\x37\\x1b\\xbc\\x6b\\xde\\x2f\\xde\\xb5\\x71\\xde\\xb5\\x21\\xef\\x3a\\x88\\x77\\xfd\\x39\\xef\\xfa\\xe7\\x79\\xc7\\xef\\x64\\x6a\\xf2\\x0e\\x6f\\xa4\\xd2\\x3f\\xaf\\x7b\\x2d\\x0a\\xf2\\xb0\\xb6\\xae\\xd1\\x38\\xf1\\x54\\x5a\\x5e\\xdf\\xb0\\x1b\\x0f\\xdb\\x90\\x87\\x03\\xff\\x07\\xda\\x97\\xef\\xaf\\xed\\xaf\\x06\\x5e\\x68\\xc6\\xe2\\xb6\\xfd\\x51\\x42\\x79\\xaa\\xb1\\x25\\x3f\\x65\\x37\\x3d\\xb4\\x86\\x89\\x97\\x03\\xc1\\x7b\\xbf\\x65\\xf0\\x72\\xc8\\x7e\\xf1\\x72\\x04\\xe7\\xe5\\x08\\xf0\\x7a\\x69\\xda\\x2d\\xeb\\x6c\\x6d\\x48\\x83\\x07\\xab\\x43\\xe6\\x8e\\x26\\xe6\\x76\\x70\\xe6\\x76\\xe4\\x99\\xdb\\xe1\\xcf\\x55\\xf3\\x32\\xb1\\x1a\\x1f\\x68\\xc3\\xf2\\x9c\\xee\\x4c\\x45\\x86\\xd9\\xe9\\x76\\xb2\\xf8\\x6a\\xff\\x54\\x2e\\xd5\\x73\\xcf\\x9a\\x61\\xa0\\xbc\\xb9\\x40\\x65\\x43\\xeb\\x40\\xdc\\x38\\xeb\\x8f\\x9b\\xb2\\xa5\\xe9\\xde\\x46\\x3f\\x02\\xd9\\x3e\\xaa\\x80\\xed\\x6a\\x00\\xc7\\x41\\xb5\\x86\\x34\\x3c\\xaa\\xde\\x6f\\x21\\xf4\\xb5\\xb9\\xbf\\xbf\\xf2\\x38\\x79\\xb7\\x6a\\x34\\xbc\\x5f\\x62\\x39\\xab\\xb0\\x2e\\x9d\\x6c\\xca\\xc6\\x62\\xe8\\xf9\\xb3\\x24\\x9b\\x3a\\x21\\x23\\xb4\\xe3\\x4e\\x02\\x49\\xa7\\x71\\xbf\\xa4\\xd3\\xcc\\xa5\\xd3\\x4c\\x31\\x49\\x6d\\xc9\\x60\\x81\\xaf\\xb6\\x42\\x3a\\x35\\x10\\xdc\\xc3\\x36\\xad\\x0e\\x72\\xa1\\x3a\\xbf\\x5a\\x8f\\x31\\x88\\x23\\x39\\x62\\xb0\\x42\\x61\\xd5\\xe7\\x85\\x55\\xe7\\xc7\\x3b\\x1e\\x1b\\xf2\\x51\\x5b\\xf0\\xad\\xed\\x90\\x3b\\xe1\\xe0\\x56\\x5d\\x35\\xce\\x55\\x54\\x92\\x49\\xc0\\xb7\\x36\\xe2\\xde\\x4b\\x3b\\x48\\xa5\\xbc\\xb7\\x54\\x9a\\x51\\x2a\\x99\\x3d\\xa4\\xb2\\xdf\\x26\\x81\\xe5\\x6f\\x9e\\xfb\\x58\\xfb\\xee\\x5b\\x02\\x47\\x33\\xd7\\x94\\x3c\\xd3\\x07\\x32\\xd7\\x3e\\x19\\xbf\\x08\\x2a\\xe2\\xc1\\x86\\x77\\xb9\\x18\\xb3\\x32\\x83\\xe7\\xd6\\xa9\\xc4\\xf3\\x01\\xc2\\x60\\x61\\xac\\xf0\\xae\\xc1\\xf3\\x96\\xfd\\xe2\\x79\\x07\\xe7\\x79\\x07\\xf0\\x1c\\x14\\x78\\x18\\x9f\\x48\\x38\\x30\\x95\\xab\\x33\\x26\\x12\\x0e\\x22\\xa3\\x68\\xe6\\x7c\\x6e\\x36\\xf9\\xdc\\x59\\xdd\\x8c\\xcd\\x94\\x21\\x5c\\xf3\\xe1\\xe9\\xf6\\x1e\\xa6\\x8f\\xc4\\x3e\\x69\\x03\\xb7\\x84\\x71\\xc0\\xf7\\x21\\x5e\\x93\\xef\\x23\\x95\\x9c\\x23\\xd0\\xbf\\x85\\x10\\x34\\x1a\\xf6\\xe4\\x7c\\x07\\x72\\x7e\\xf0\\x9e\\xf6\\x70\\xe0\\x30\\x48\\x1c\\xaa\\x1b\\xc6\\xf2\\xe3\\x51\\xfb\\x25\\x86\\x5e\\x63\\x0d\\x3d\\xe2\\x28\\x3c\\x9c\\xf9\\x2b\\x0e\\xbf\\xc2\\x1c\\x74\\x90\\x4c\\xe9\\x2c\\x33\\x87\\x1d\\xf6\\x29\\xa2\\x1f\\xcc\\xd1\\x87\\x5d\\x5c\\x4e\\x72\\x91\\x39\\xfe\\x20\\x09\\xe3\\x76\\x6d\\xb7\\xde\\x21\\x4f\\x16\\xfa\\x0b\\x1d\\xc2\\x48\\xe1\\x2e\\x21\\x5b\\x83\\xfd\\xea\\xc6\\x0c\\x1e\\xfb\\xa5\\x6b\\x2d\\x8d\\x33\\x73\\x8c\\xc3\\x89\\xdb\\x41\\xf9\\x87\\xa7\\x73\\x83\\x4b\\x6a\\xfc\\x9e\\x06\\xb5\\x2d\\xa3\\x0d\\x96\\xbb\\x08\\x39\\x7a\\x14\\xb5\\x25\\x52\\xc0\\xea\\x94\\x1f\\x03\\x25\\x1e\\x74\\x2c\\x85\\x47\\x83\\xe8\\x66\\x03\\x43\\x80\\xe5\\xc5\\xce\\x2e\\x6d\\x34\\xfc\\x4d\\xe5\\x0f\\x54\\xb5\\xe1\\x81\\x2a\\x52\\xf9\\xd2\\x80\\x16\\xac\\x87\\xbf\\x43\\x94\\xce\\x92\\x08\\xef\\x5c\\x14\\x07\\xb4\\xca\\x24\\xca\\x62\\x70\\x0d\\x8e\\xda\\x55\\xd6\\x17\\xa0\\xac\\xab\\xfe\\x00\\xc7\\x16\\x2c\\x38\\x61\\x55\\x4d\\xb7\\xe5\\xe4\\xf0\\x50\\xbb\\x43\\x0d\\xd6\\xec\\x11\\x5e\\xf3\\xd8\\x83\\xe3\\xf4\\xef\\xb6\\x4c\\x1b\\x3f\\x75\\x2e\\xde\\xb0\\x53\\xd8\\xf5\\xea\\xe2\\x3b\\x06\\x0f\\xfd\\xf3\\x91\\xaf\\x7e\\xdb\\xbd\\x42\\x94\\xcf\\x3a\\x6b\\xee\\x59\\x93\\x27\\x1d\\xb0\\xed\\x9c\\x55\\xcf\\x8e\\x1a\\xf2\\xfc\\x65\\x8f\\xbe\\xcc\\xaa\\xa6\\x4f\\x1b\\x74\\x4e\\x75\\xe7\\xc2\\xa5\\xa2\\x26\\xb2\\x63\\x67\\x4c\\x3f\\x7c\\x3e\\x1b\\xba\\xf1\\xaf\\x83\\xa7\\xcc\\x99\\x30\\x30\\x60\\x5d\\xf3\\x60\\x7b\\x4b\\x4b\\xbb\\xfe\\xd3\\x87\\x37\\x58\\x97\\x5d\\x58\\x57\\x7f\\xef\\x80\\x71\\x53\\x27\\x8e\\x9e\\xb5\\xe5\\x8f\\x83\\x0f\\x1c\\xda\\x4f\\x9d\\xc9\\x14\\x4b\\xe9\\xfc\\x13\\xcf\\xe4\\x35\\xcb\\x28\\x3d\\x43\\xb8\\x98\\x82\\x50\\x0e\\x79\\xcb\\x45\\xfc\\x3e\\x4c\\x38\\x49\\xdb\\x33\\x3f\\xc1\\xcc\\x03\\xd6\\x04\\x96\\xe0\\xc5\\xfd\\xb8\\x7a\\xba\\x63\\x19\\x1d\\x2c\\xee\\x19\\xa5\\xc0\\x23\\x6a\\x35\\x76\\x7e\\x6b\\xc3\\x26\\x9c\\x9c\\xa8\\x48\\xd4\\xf7\\x43\\xfe\\xd5\\x28\\xf7\\x38\\x2d\\xde\\x70\\x59\\x51\\x92\\xdf\\x59\\xbd\\x0c\\xef\\xb3\\x5e\\x91\\xa4\\xee\\xa1\\xe6\\x4d\\xc0\\x83\\xf2\\x70\\x11\\xed\\x78\\xf7\\x0c\\x4d\\xec\\x0d\\x59\\x13\\x0f\\xf3\\xed\\x31\\x33\\xd1\\x37\\xcc\\xa6\\xac\\x23\\xcc\\x26\\x2b\\x1c\\x4b\\xef\\x13\\x73\\xf3\\x96\\x77\\x58\\x5a\\x9f\\xd5\\x6b\\x56\\x42\\xe6\\x58\\x94\\x96\\x4f\\x81\\x03\\x51\\xaa\\xfa\\x67\\x1a\\x77\\x80\\xf4\\xe6\\x3b\\x87\\xc8\\x96\\x24\\xd4\\x3b\\x71\\x67\\x18\\xeb\\x9d\\xb8\\x31\\x60\\x5c\\x4e\\xc3\\x35\\xd9\\x72\\xaa\\x6b\\xcb\\x99\\x59\\xca\\x97\\x23\\x40\\x13\\x6d\\x5d\\x78\\xc3\\x74\\xf3\\x30\\x04\\x30\\x52\\x4c\\x5a\\xa3\\x7b\\x42\\x52\\xf2\\xd4\\xb5\\x07\\x97\\xd2\\xf1\\xde\\x9e\\xa0\\x94\\x2b\\x28\\x61\\x9d\\x59\\x80\\x4c\\x09\\x2e\\xb2\\x37\\x34\\xa5\\xfc\\x1c\\x24\\xaa\\xdd\\x9b\\x0d\\x7c\\x4a\\x93\\xae\\xf7\\xf2\\x74\\xcd\\xf9\\xdf\\xd3\\xd5\\xa9\\x04\\x8c\\x2d\\xf9\\xfd\\x24\\x8d\\x0f\\x4d\\xee\\x9b\\x34\\x56\\xcf\\x13\\xc9\\x4f\\xf6\\x45\\x9c\\xf4\\x30\\xa5\\x90\\xdd\\xf7\\x18\\xe4\\xe5\\xe9\\xfb\\x9e\\xe8\\xab\\x80\\x4a\\xa6\\x6f\\xfa\\x6a\\x81\\xbe\\x4a\\x4e\\x5f\\xa5\\xcc\\x4b\\xbb\\x24\\xa7\\x2f\\x49\\xf4\\x25\\x91\\x3e\\x2c\\xd9\\xec\\x49\\xa2\\xaf\\xb4\\xec\\xb7\\xd0\\xd7\\x93\\xf7\\xed\\x9b\\xc6\\x63\\xcd\\x6c\\xcf\\xbf\\x4f\\x22\\xff\\xc9\\xb3\\xbc\\xee\\x9b\\x39\\x95\\x16\\x83\\xc6\\xe7\\x88\\xc6\\x12\\xca\\x25\\xd6\\xf6\\x49\\x65\\x25\\x50\\x59\\xc6\\xa9\\x2c\\x03\\xdf\\x58\\x04\\x59\\x42\\x86\\xb6\\x6c\\x6a\\xd2\\x34\\x73\\x59\\xb4\\x8d\\x10\\x3a\\x4a\\x38\\x9a\\x1e\\xa6\\x0f\\x71\\x4c\\x08\\x90\\x0d\\x71\\x62\\x43\\x9c\\x19\\x33\\x97\\x25\\x45\\x50\\x6a\\x38\\xdd\\xae\\x2a\\x3e\\x86\\x51\\xad\\x64\\xbd\\xe1\\x4a\\x8c\\x44\\xf6\\xba\\xbc\\x5e\\x3b\\xbd\\x1c\\xd3\\xb3\\x12\\xc7\\xea\\xaa\\xf6\\xc9\\x1e\\xc8\\x01\\x4c\\xce\\xf0\\xee\\x77\\x5f\\xdc\\x99\\xc4\\x5c\\xfd\\x4c\\xbe\\xd8\\x21\\xf0\\xf7\\xc9\\x9b\\x4f\\xb7\\x6e\\xed\\xbe\\x92\\xf8\\x22\\x7a\\x20\\xe0\\xe3\\x69\\x69\\xbc\\xbf\\xd2\\x67\\xd4\\xff\\xf7\\x21\\xb6\\x13\\x3f\\x41\\xc7\\xf7\\xf6\\x89\\x35\\x26\\x6a\\x23\\x1d\\x74\\xf1\\x6e\\xcb\\xe3\\x39\\x79\\xf3\\x70\\xe2\\x5e\\xda\\xa8\\xf4\\x5a\\x1d\\xc6\\x56\\x34\\x9d\\x83\\x71\\x60\\x98\\x96\\x2c\\x79\\xf4\\x62\\x87\\x8f\\x37\\x5e\\xc8\\x4c\\xf3\\x58\\x88\\x36\\xb2\\xc8\\x97\\x39\\xc8\\xa5\\xe5\\x43\\xb0\\x3d\\xfd\\xaf\\x79\\x9c\\x4b\\xf4\\xb7\\x63\\x60\\x7d\\xf7\\x58\\xde\\xa7\\xfb\\x7c\\xfa\\x84\\x79\\x42\\xd6\\x86\\xeb\\xb3\\xcb\\xfc\\x5c\\x1f\\xf5\\x88\\x18\\xef\\x3b\\xd0\\xfa\\x1c\\x1c\\xc8\\x49\\xa6\\x15\\xc9\\xd8\\x44\\x74\\xd0\\xc9\\x05\\x07\\x36\\xcc\\x68\\x0c\\x81\\x16\\x47\\x37\\xad\\x72\\xfb\\xa8\\x9d\\x80\\xf7\\x31\\x96\\x1d\\x66\\x57\\xc8\\x58\\x97\\x84\\x26\\x37\\x86\\x2f\\xcb\\xb0\\xac\\x42\\x00\\xce\\x63\\x8d\\x6e\\xa7\\xb4\\x6b\\x07\\xac\\xef\\x1d\\xcb\\x0f\\x34\\x7b\\x10\\x14\\xe6\\x1b\\xf7\\xf9\\x56\\xe8\\xde\\x50\\x7c\\xf6\\xc0\\xc5\\xf8\\xec\\x06\\xdd\\xf1\\x39\\x40\\x13\\xeb\\x59\\x4f\\xc0\\xbc\\xab\\x41\\x36\\x40\\x50\\xc3\\x01\\x27\\xae\\x2f\\xe0\\xe7\\xb7\\x7b\\xd6\\x3c\\x81\\x82\\xc1\\x03\\xcd\\xa9\\xd0\\xbd\\x39\\x0a\\x07\\x10\\x7a\\xd0\\x24\\x2d\\xa6\\x51\\xbc\\x68\\x2c\\x57\\xde\\xce\\xf5\\x7f\\x47\\xb8\\x60\\xc5\\x68\\xeb\\xbb\\xde\\x81\\xb5\\xbe\\x6d\\x79\\x9e\\xe6\\x0f\\x70\\x87\\xe7\\x0c\\x03\\x0b\\xd0\\x4d\\x90\\x9c\\x3d\\x77\\x67\\x45\\x10\\x25\\x1c\\x3e\\xf0\\xf1\\xe1\\x03\\x7f\\x9a\\x4e\\x71\\x79\\x8c\\xfe\\xac\\xc7\\x9c\\x32\\xc9\\x7a\\x48\\xe9\\x3d\\x16\\x5c\\xba\\x07\\xf7\\xa6\\x25\\xbb\\x07\\x8a\\x1f\\xc1\\x4e\\xa8\\xaf\\x92\\xbd\\xab\\xd3\\x47\\x4f\\x04\\x20\\xc8\\xd1\\x99\\x2e\\x8b\\xdb\\x80\\x01\\xa2\\x51\\x84\\x1e\\x1a\\x50\\xc3\\x93\\xcc\\xf5\\x99\\x41\\xc1\\x57\\xcc\\x25\\xef\\xda\\xba\\x15\\x32\\xa8\\x02\\x96\\xff\\x9e\\xcf\\x21\\x0c\\x81\\xfc\\xf4\\x2c\\xcb\\x17\\xe0\\xab\\x9a\\x70\\x4f\\x92\\x50\\x4e\\xaa\\x60\\x91\\x0d\\x04\\x5f\\xc3\\x20\\xe9\\xc4\\x64\\x86\\xee\\xe0\\xc8\\x0f\\x85\\x97\\x40\\x05\\x9b\\xc2\\xa1\\x45\\x88\\x9b\\x39\\xc9\\x6d\\x0b\\xc5\\x69\\xf6\\x59\\xd1\\xc2\\x04\\xdc\\xd2\\x50\\xc5\\xef\\xab\\x2d\\xe1\\x04\\xa7\\x79\\xd8\\x0c\\x77\\x54\\x20\\xf5\\xb3\\xd5\\xe2\\xef\\xf6\\x38\\x43\\x60\\x0e\\xbe\\xbf\\x52\\x00\\x7c\\x48\\x81\\x76\\x08\\x73\\x7f\\x3a\\xe1\\xe2\\xb4\\x1c\\x9a\\xdc\\xfa\\xe9\\xe4\\x87\\x93\\xe3\\xaa\\xe7\\xce\\xd8\\x30\\xfa\\xa5\\x49\\xda\\x09\\xa7\\xeb\\x4f\\x6d\\xff\\x52\\x7f\\x95\\x25\\x2f\\x39\\xe9\\xd4\\x4b\\x2a\\x57\\xcd\\x3c\\xe3\\x42\\xf6\\xea\\x87\\x4c\\x69\\xac\\x95\\x27\\x9c\\xdf\\x7a\\xde\\xf2\\x63\\x82\\xe5\\x9e\\x37\\xc3\\x63\\x9a\\x4f\\x59\\xbe\\xf0\\x54\\xfd\\xa9\\x87\\x26\\xea\\x3f\\xe8\\x77\\xb1\\xe2\\x97\\x4e\\xfc\\xd3\\x6b\\xb7\\x4f\\xae\\x6b\\xb9\\x81\\xe7\\x1a\\x84\\x55\\x49\\xb5\\x69\\x5c\\x48\\x0b\\xff\\xe2\\xe8\\xc2\\x78\\x92\\xb0\\x14\\x32\\x70\\xb7\\xaf\\x18\\x67\\x81\\x7b\\x4c\\x14\\xf1\\xb9\\x4d\\x5b\\x50\\x1b\\x53\\x5a\\x35\\x54\\xa3\\xa9\\xea\\x46\\xbb\\xe1\\xb2\\x33\\x29\\xb5\\x8c\\xee\\xb8\\x9c\\x2d\\xa2\\x63\\x2a\\x45\\x31\\x90\\x60\\x19\\x9d\\xa7\\x28\\x2b\\x01\\xd9\\x95\\x17\\x95\\xd9\\xf3\\x87\\xa7\\x8b\\xfc\\x78\\xaf\\x5c\\xb5\\x2e\\xcd\\xef\\x9a\\x45\\x33\\x1a\\x2e\\xbc\\xa3\\x9f\\xdf\\x65\\xde\\xd7\\x4c\\xf5\\xfb\\x73\\xf5\\x3c\\x2b\\x6f\\xc1\\x3d\\x4e\\xf0\\x62\\x9d\\xb2\\x54\\x99\\xaa\\x22\\x68\\xb4\\x4e\\x5b\\xa8\\xba\\x91\\x94\\x37\\x84\\xc0\\x97\\xae\\x32\\x7e\\x38\\x51\\xee\\xd0\\x1a\\x71\\xc4\\x2a\\x4d\\x18\\xa2\\xe5\\x86\\xcd\\xed\\x03\\xf0\\xb2\\xaf\\x6a\\xb4\\x6f\\x10\\xcc\\xdd\\x07\\xcd\\xf7\\x05\\x8a\\xc9\\xee\\xe8\\x3d\\x86\\x00\\xf6\\x40\\x18\\x99\\xe4\\x07\\xbd\\x84\\xe5\\x3e\\xde\\xf0\\x84\\xd1\\x5e\\x11\\x22\\xde\\x33\\x87\\x50\\x70\\x53\\x21\\x73\\xf3\\x1e\\xef\\x0f\\xaa\\xf9\\xfc\\x34\\x69\\xdf\\xe9\\x56\\x2c\\x01\\x3e\\x36\\x64\\x64\\x67\\x26\\x70\\x66\\x41\\x8f\\xad\\x4f\\xf4\\xcc\\x0d\\xe4\\x12\\x2f\\xde\\x0b\\x84\\xa6\\xfc\\x24\\xe6\\x27\\x2d\\x05\\x40\\x9a\\xe6\\xda\\xdf\\xcf\\xcf\\x1e\\x4c\\xdf\\x63\\xaf\\x9e\\xed\\xdf\\x0c\\x85\\xdb\\x62\\xec\\x1e\\x39\\xcc\\xdd\\xa3\\xc2\\xad\\xfa\\xbd\\xa3\\x7f\\x52\\xc7\\x6b\\x2f\\x10\\xa0\\x0d\\xc6\\xf0\\xc1\\xde\\x90\\x40\\xc5\\xcd\\x86\\x2f\\x35\\xe9\\xf8\\x81\\xe8\\x40\\x4c\\x50\\x93\\x8e\\x92\\xdd\\xa3\\xb4\\x39\\x73\\x50\\xd4\\x73\\xdb\\x70\\x73\\xe6\\xa0\\x28\\x2f\\x83\\xb8\\x92\\x03\\x77\\x13\\xb6\\x10\\x3d\\x06\\xc2\\xf9\\x9e\\xc2\\xe8\\xdd\\x72\\xea\\x53\\x20\\x6b\\x4c\\x0f\\x3b\\x7c\\x2f\\x32\\x91\\x5e\\x30\\x32\\x8e\\xda\\x42\\x7c\\x53\\x83\\x1e\\x6b\\x34\\x3f\\x67\\x70\\xde\\x1e\\x73\\x06\\x6c\\x2f\\x73\\x06\\x90\\x7b\\x14\\x8c\\x1a\\xa8\\x49\\x7f\\xce\\xc7\\x0d\\xd3\\x97\\xc2\\x51\\x83\\x7a\\xb0\\xcd\\x22\\x42\\x56\\x34\\x26\\x0e\\x68\\xcc\\xa0\\x1e\\x72\\xaf\\xbb\\x71\\xcc\\xa0\\xbc\\xf7\\x9c\\x81\\x16\\x28\\x27\\xe0\\xa5\\x3d\\x89\\xdf\\x6b\\xab\\xa7\\x4f\\x3e\\x9c\\xb3\\x9b\\x85\\xb9\\xf6\\xc6\\x8e\\x9f\\x0a\\xac\\xab\\xbb\\xa6\\x90\\x27\\x16\\x43\\xc6\\xcf\\x17\\xcc\\x18\\x9c\\xbc\\xc7\\x8c\\x01\\xdb\\xf7\\x8c\\x81\\x1a\\xf4\\xab\\x01\\x4c\\xbc\\x7c\\x76\\xc2\\xba\\xee\\x3d\\x6c\\xa0\\x26\\xe8\\x86\\xf2\\xe6\\x06\\x17\\x06\\x52\\xb7\\xa5\\x8f\\x21\\x83\\xde\\x5a\\x60\\x76\\x59\\x4c\\xc2\\x31\\xcd\\xea\\x45\\xfc\\x49\\xcc\\x35\\xcb\\xa4\\x97\\x8d\\x64\\xae\\xdd\\x69\\xfe\\x00\\x12\\xab\\x60\\x8f\\x52\\xbf\\x6e\\xee\\x71\\x0d\\x14\\x6e\\x91\\x87\\xc8\\x77\\x53\\xa6\\xe5\\x82\\x4a\\xdd\\xb8\\x0d\\xb8\\x79\\x53\\x70\\xbc\\x19\\x38\\xea\\xb3\\x1b\\x0f\\xf5\\xe2\\x18\\xbd\\x8d\\xee\\xce\\x65\\xdc\\xaa\\xd2\\xbc\\x43\\x38\\xfe\\x0c\\x94\\xe5\\xee\\xa5\\xac\\x4a\\x7f\\x9b\\x55\\x89\\x43\\x3f\\xfa\\x48\\x3f\\xba\\xab\\x4b\\xaa\\xef\\xea\\xc2\\xef\\x98\\xb8\\xeb\\x64\\x79\\x9c\\xfc\\x88\\x31\\x7b\\xb0\\xa8\\x70\\xf6\\x80\\xfd\\x96\\xd9\\x03\\xbc\\xef\\xa4\\x39\\x7b\\x00\\x61\\x7a\\xf7\\xc9\\x83\\x01\\xbd\\x27\\x0f\\x8c\\x38\\x99\\xe1\\x48\\x17\\x02\\xbf\\x09\\x45\\x3b\\x61\\x03\\x95\\x33\\x7e\\x3f\\x6b\\x3e\\x79\\xd0\\xc6\\xef\\x0e\\x36\\x11\\xd8\\xd9\\x74\\x48\\xfd\\xa8\\x9b\\x17\\x2e\\x5a\\x0a\\x3c\\x6d\\x5d\\xd0\\x30\\xfe\\xe6\\xe3\\xe7\\x2f\\x64\\x55\\x1e\\xaf\\xa5\\xdb\\x5f\\xa9\\x9c\\xb4\\x64\\x75\\xa0\\x29\\xb6\\xfc\\x98\\x50\\xd0\\xca\\x99\\xeb\\x71\\x5d\\xf2\\xec\\x41\\xdf\\xfc\\x01\\x19\\xec\\xf7\\xad\\x7b\\xe7\\xa0\\xae\\xab\\xdb\\xe7\\x96\\x33\\x51\\x96\\xad\\x77\\xaf\\xd1\\xef\\x76\\x38\\x80\\xd7\\x07\\x1c\\x57\\x05\\xf4\\x13\\xde\\x27\\xf9\\x6e\\xf4\\x7e\\x17\\x1a\\xbb\\xab\\x76\\xf3\\x9e\\xd0\\x01\\xb3\\x5f\\x85\\xd1\\x11\\x21\\xc9\\x99\\x31\\x48\\xcb\\x77\\xdd\\x2d\\xb8\\xab\\x6a\\xc9\\xef\\x34\\x5b\\x38\\xae\\x21\\x0e\\xe0\\xb9\\x14\\x33\\xee\\x91\\x8b\\xb4\\xe4\\xb7\\x97\\x5d\\xf9\\xf1\\x02\\x15\\x19\\x14\\x46\\x4f\\x19\\x08\\x72\\x3e\\xda\\xf3\\xb5\\xce\\xde\\x01\\x40\\x29\\x04\\xf4\\x8d\\x02\\x7a\\x14\\x79\\xff\\xbd\\x61\\x81\\x8a\\x2b\\xcc\\x39\\x03\\x4e\\xf3\\xfb\\x06\\xcd\\x97\\xfd\\xff\\xa4\\x19\\xd1\\xa9\\x5d\\x4a\\xb6\\x28\\x4e\\xb7\\x64\\x01\\x7b\\x0a\\x85\\xcb\\x2b\\xc8\\x9e\\x7a\\xd1\\x8c\\x70\\xbb\\xa5\\xbf\\x46\\x39\\x95\\xb2\\x7d\\x53\\xce\\xa2\\xf9\\x3c\\xbb\\x4f\\xda\\xcd\\xa4\\xdb\\xa4\\xfd\\x07\\x63\\xbe\\xe0\\x92\\xfd\\xa6\\xbd\\x66\\xff\\x69\\xaf\\xdd\\x4d\\xde\\x3d\\xe3\\x04\\x44\\x7f\\xa2\\x72\\x4f\\xfa\\x7f\\x4d\\xe6\\x66\\xa4\\xe9\\x9b\\xfa\\x99\\x66\\x90\\xd9\\x2b\\xf9\\xe7\\x1a\\x23\\x05\\xb2\\x41\\xff\\xf3\\xf9\\x79\\x82\\xdb\\xf6\\x93\\x03\\x7d\\x0e\\x15\\xec\\xc1\\x0e\\xb5\\x02\\x1d\\x68\\x99\\x1d\\x27\\x15\\xf9\\x74\\x41\\x5f\\x1c\\x52\\x5d\\xfe\\xdd\\x3c\\x2d\\x8e\\x12\\xd8\\x8b\\xe8\\x46\\x7b\\xbb\\x99\\x04\\xdb\\x2f\\xf6\\xf0\\xb1\\x82\\xbe\\xb9\\x33\\x88\\xc6\\x0a\\xf6\\xca\\x9a\\xdf\\xf7\\xcc\\x14\\x10\\x06\\xab\\xe5\\x65\\xca\\x99\\x93\\xe0\\x7d\\x39\\x0b\\x5c\\xc6\\x08\\x01\\xc1\\xe4\\x22\\x4a\\x2e\\x25\\x43\\x55\\x29\\x2c\\xe4\\x8d\\x24\\x87\\xd6\\x99\\xb5\\x7b\\xe3\\x1d\\x05\\x03\\x02\\x7b\\x81\\x62\\xe5\\x83\\x02\\xfb\\xc6\\x63\\x65\\xe5\\x79\\x75\\xde\\x3b\\x2e\\x2b\\x9b\\x64\\xce\\x0d\\x54\\xea\\x0b\\xe4\\x2b\\xad\\x45\\x94\\xf7\\x5c\\xda\\x07\\x16\\x7a\\x0f\\x04\\x7a\\x1e\\x08\\x22\\x8f\\x84\\xae\\x89\\x78\\xf2\\x61\\x4f\\x2c\\x74\\xc2\\x6c\\xec\\x0b\\x11\\x3d\\x8e\\x7e\\x9d\\xdf\\x59\\x68\\x0f\\x24\\xf4\\x4a\\x7e\\x6c\\x5a\\x50\\xd4\\x68\\xc1\\x7d\\x34\\xf6\\x8d\\x87\\x5e\\xc9\\x1e\\x49\\x9d\\x3f\\x63\\x2f\\x70\\xe8\\x78\\x5f\\x0d\\x6d\\xf8\\x81\\xbb\\xe3\\xa1\\x5b\\x4b\\x77\\xbc\\xd7\\x0b\\x0f\\x5d\\x36\\x64\\xf7\\x20\\xc9\\xae\\x52\\xa8\\xc1\\x39\\xf3\\x0a\\x1c\\x00\\xa9\\xa2\\x8e\\x36\\xde\\xde\\x72\\x1f\\xc2\\xac\\xa5\\x96\\x5b\\x25\\xe8\\x6b\\xa5\\x9f\\x5c\\x17\\xb6\\x56\\xeb\\xe0\\x6f\\x25\\xb6\\xdc\\x02\\x91\\x62\\x4a\\x04\\x93\\xca\\xdd\\xb2\\xcd\\xee\\x74\\x49\\xd4\\x97\\xa9\\x41\\xe0\\xc9\\xff\\x81\\xfc\\x99\\xa9\\xad\\xfb\\x56\\x81\\x91\\xa6\\xd6\\xee\\x43\\x01\\x56\\x90\\xea\\x8a\\xc2\\xd1\\xbb\\xb6\\xdb\\xd6\\x58\\x9e\\x12\\x4a\\x84\\x7a\\xe1\\x76\\x03\\x45\\x06\\x71\\x02\\x8b\\x0d\\x18\\x4f\\x7a\\x26\\x17\\xe4\\xa7\\x62\\x6c\\xc6\\xed\\x2f\\xe9\\x22\\xe7\\xe4\\x4f\\xd2\\x9c\\x21\\xa4\\x96\\x39\\x8f\\xbf\\x18\\xef\\x79\\xee\\xc9\\xdf\\x1e\\x93\\xba\\xf9\\xa5\\x7c\\xf0\\x42\\xe1\\x08\\x82\\x0a\\x01\\xcd\\xe0\\xf1\\x21\\x87\\x0d\\x87\\x53\\xa8\\x79\\x57\\x89\\xa5\\x5a\\xb1\\x8c\\x4e\\x5e\\xc1\\xa3\\x55\\x4e\\x6a\\xde\\x41\\x2d\\xe0\\xa5\\x4e\\x09\\xe2\\xe8\\xab\\x95\\x1d\\x90\\x00\\x10\\x2a\\x16\\x02\\xa5\\xf0\\xe9\\xc3\\xdd\\x0e\\xc3\\x18\\xb7\\x4b\\x2d\\x04\\x8e\\x3f\\x9a\\x4d\\x61\\xde\\x03\\xaf\\x9c\\x22\\xdd\\x51\\x78\\x36\\x66\\xe7\\xa1\\x73\\x57\\x8d\\xd2\\xbf\\xd5\\x37\\xb3\\xe4\\x1d\\x6b\\x07\\x9d\\x3c\\x70\\xf0\\xc9\\x1d\\x6b\\x6f\\x13\\x87\\xb3\\x01\\x60\\x60\\x13\\xdd\\x8e\\x82\\xc3\\x32\\x4e\\x17\\x9b\\xc8\\x1c\\x77\\x3f\\xec\\x70\\x48\\xdf\\xd9\\x5d\\x0f\\x6d\\xe1\\xb6\\x3e\\x77\\xd7\\x76\\xeb\\x0f\\xf2\\x64\\xca\\xad\\x3b\\x48\\x5b\\xb0\\x3e\\x8e\\xf1\\x7d\\xbe\\x60\\x9a\\xb2\\x1f\\x9c\\x1e\\xc2\\x0c\\xbb\\x3d\\x9d\\x4b\\xfb\\x2a\\x64\\x73\\xe8\\x62\\x10\\xf1\\x85\\xe7\\xd6\\x94\\x06\\x79\\x9c\\x5d\\xda\\x60\\xf8\\x9b\\x81\\x24\\x7a\\xb8\\x43\\x76\\xfa\\x82\\xb1\\x0a\\x7f\\x7d\\xb3\\x01\\xae\\x10\\xa1\\x5e\\x41\\x0d\\xba\\xb8\\x68\\x19\\xbf\\x87\\x43\\xa4\\x43\\x93\\x9b\\x0c\\x68\\x5e\\x33\\x19\\xda\\xfb\\x06\\xc6\\x6e\\x05\\x53\\xb5\\xd9\\xce\\x9b\\x0b\\x49\\xd1\\xc9\\x0f\\x8c\\x1a\\xae\\x1d\\xff\\xd6\\xb7\\xdd\\x67\\x88\\xf6\\x73\\x4f\\x38\\xe2\\xbc\\x09\\x07\\x8f\\xdc\\xb6\\xfa\\xd4\\x87\\x46\\x8d\\x7c\\xe0\\x94\\xde\\x37\\x53\\xf8\\x52\\x64\\x47\\x63\\x7b\\x8f\\xa7\\x47\\x93\\xc6\\x8c\\x9d\\x58\\xd8\\xdd\\x9b\\x78\\xd0\\x41\\x13\\x0b\\x0b\\xab\\x45\\xf9\\x1e\\x36\\x9f\\xb3\\xf2\\xd0\\x9c\\x15\\x62\\x2b\\xfc\\x65\\x7f\\x27\\xad\\xd4\\x92\\x0c\\x22\\x56\\xd3\\xc1\\x8d\\xf2\\x7d\\xcf\\x5c\\x75\\xc6\\x7c\\x21\\xa8\\x5d\\xa2\\x60\\x7f\\xd1\\x14\\x1d\\xab\\x92\\xd2\\xd9\\x28\\x9d\\x44\\x8f\\x62\\xef\\xad\\x84\\x5e\\x8e\\xdb\\xbb\\x38\\x5a\\x73\\x94\\x60\\x3d\\xb5\\x92\\x18\\x4e\\xf8\\xd8\\x1c\\x4e\\xdc\\xd9\\x88\\xfb\\x14\\x9e\\x76\\xfe\\xea\\xa0\\x56\\xde\\xfe\\xfa\\x98\\xd5\\xba\\x3e\\x3f\\x81\\xd6\\xf7\\xa4\\xd6\\x0c\\x33\\x56\\x30\\x61\\xb6\\xfc\\xb1\\x34\\xc4\\xf2\\xa5\\x60\\x87\\x0c\\x0a\\xfb\\x5d\\x96\\x4c\\x4e\\x34\\x40\\xa0\\x10\\xe5\\x07\\x43\\x83\\x28\\xe4\\x45\\x6c\\x84\\xef\\xd9\\x66\\xa0\\x96\\x3f\\xee\\x99\\xf1\\x63\\xc2\\xf1\\xf2\\x3f\\xa4\\x59\\x96\\x9f\\x85\\xa0\\x30\\x45\\xa0\\x9b\\x55\\x41\\x39\\xe7\\xb7\\x62\\xf7\\x4b\\x32\\x5a\\x7f\\xc2\\xb6\\x5c\\x90\\x17\\x71\\x41\\x3a\\xe3\\x91\\x73\\xf2\\xd2\\x8d\\xaa\\x70\\xa4\\x58\\x22\\x87\\xec\\xf7\\x50\\x43\\x4a\\x93\\xac\\x84\\x21\\x63\\x42\\xa4\\xf5\\xae\\xd2\\x8e\\xdf\\xad\\x14\\x93\\x7f\\xea\\xdd\\xd0\\x60\\x05\\xb8\\x7d\\x54\\xdd\\xac\\x16\\x5b\\x4c\\x2c\\xbe\\xff\\xe9\\x6b\\xa2\\x70\\x83\\x38\\x4b\\x7e\\x4b\\x1a\\x4a\\xfd\\xc3\\xf2\\x3d\\xb0\\x00\\xfb\\xc0\\x00\\xbc\\x41\\x1e\\xba\\xe3\\x39\\x71\\xd6\\xc7\\xc6\\x7d\\x8e\\xcf\\x13\\x67\\x59\\xee\\xfe\\x2d\\xff\\xfe\\x3c\\x4b\\xdb\\x2f\\x5f\\x9b\\xff\\x9e\\x09\\x0b\\xa4\\x6f\\xd8\\xed\\xd6\\x81\\x82\\x03\\x62\\x24\\x02\\x30\\xc9\\x12\\x82\\x4a\\xd1\\xed\\x78\\xc0\\x98\\x1d\\xa0\\x5b\\x98\\xa7\\x38\\xf8\\x47\\x18\\x30\\x45\\x1c\\xfd\\x7b\\xc1\\x31\\x93\\xd7\\xd4\\xd5\\x4b\\xdf\\x3c\\x76\\xe4\\xdb\\x63\\x27\\x8f\\xb9\\x76\\xde\\x63\\xf4\\x79\\x83\\xa5\\x57\\xd8\\x2a\\xba\\xcf\\x4f\\x35\\xe2\\x3a\\xe1\\xe7\\xd9\\x8d\\xcf\\x93\\x38\\xa0\\x13\\x7e\\x1e\\x61\\x97\\x3b\\xe8\\xf3\\x10\\x81\\x3b\\x83\\x90\\x29\\x83\\x6b\\xfb\\xfd\\x70\\xec\\x44\\x39\\x71\\xe0\\xb5\\xf3\\x1f\\x79\\xe4\\xa8\\x77\\xc6\\xf0\\xf5\\x8d\\xd2\\x1f\\x62\\x97\\xb2\\xf2\\xc2\\xcf\\xb3\\xed\\xeb\\xf3\\x08\\xd1\\x3b\\x63\\x83\\xcf\\x1b\\x55\\xdb\\xef\\x47\\x76\\xec\\xc4\\x1f\\xc6\\x5c\\x3b\\xf7\\x9d\\xb7\\x8f\\xe4\\x9f\\x27\\x09\\x8b\\xa4\\x6f\\xc4\\x6e\\xa2\\xd7\\x29\\x84\\x84\\xf1\\xa4\\xa3\\xae\\x8c\\xf1\\xb1\\x04\\xb5\\x1b\\x36\\x29\\x57\\x1d\\x3c\\x49\\x33\\x4e\\x7b\\x99\\x4c\\x80\\xcc\\x15\\xcc\\x0c\\x41\\x2f\\x7d\\x78\\x08\\x48\\x30\\x55\\x2a\\xcf\\x98\\x64\\x22\\x7f\\xb9\\x88\\x78\\xf4\\x23\\x9b\\xba\\x3b\\xaf\\x0a\\x98\\x26\\x09\\xe3\\xa4\\x57\\xc4\\x8f\\x80\\x67\\x02\\xad\\x69\\xa4\\x80\\xc4\\x85\\x32\\x08\\x9e\\x6d\\xef\\x59\\x93\\xbc\\x0d\\x61\\x55\\xf1\\x8e\\xbe\\x38\\x93\\xaa\\x18\\x6b\\xb2\\xc9\\x1c\\x15\\xc9\\xab\\xa8\\x2e\\xcc\\xa3\\xd5\\x10\\x17\\x52\\x9e\\xab\\xed\\xf9\\xab\\x71\\xc4\\xdf\\x27\\xe9\\xb7\\xf4\\xca\\x14\\x93\\xcd\\x53\\x0a\\xf9\\x8d\\xf7\\x4f\\x79\\x48\\x7c\\x8b\\xf8\\x1d\\xc4\\x95\\x38\\x52\\x6a\\x30\\xcf\\x1d\\x6f\\x9a\\x8c\\x8e\\xf3\\x1d\\xef\\xd5\\x89\\xf7\\x16\\xf6\\xc3\\x4a\\xc2\\x3d\\x22\\x40\\xfc\\x39\\xa7\\xb1\\x23\\xdd\\x4b\\x1c\\xed\\xbb\\x0b\\xe6\\xb1\\xdd\\xe4\\x33\\xb9\\x40\\x50\\x4c\\x38\\x9d\\x6d\\x17\\x0f\\x91\\x9d\\x82\\x07\\xeb\\x7b\\x97\\xa9\\x47\\x79\\x75\\xf2\\x92\\xed\\xdb\\xdd\\x42\\x31\\x3c\\xc9\\xff\\xd0\\x2d\\xbf\\x76\\xc7\\xd1\\x3a\\x7d\\xd5\\xf1\\x27\\xac\\x5a\\xb5\\x74\\xe9\\x2a\\x71\\xeb\\xec\\xa3\\xce\\x3b\\x77\\xd1\\xec\\x45\\x67\\xf1\\x3d\\xba\\x4b\\xc0\\x7f\\x1f\\xca\\x38\\x42\\xa8\\x5d\\x70\\x0b\\x07\\x1b\\x73\\xa5\\x16\\x47\\x26\\x63\\x20\\x99\\x69\\x56\\xa7\\xd1\\x0c\\x36\\x9e\\xa0\\x6e\\x3e\\xc3\\x3b\\x6c\\x72\\x7c\\x33\\x3c\\x34\\x68\\xe1\\x37\\xf6\\xc1\\x59\\x61\\x3c\\x63\\xe6\\x86\\x6c\\xd0\\xcb\\xef\\x15\\xaa\\x24\\x94\\x7a\\x84\\x31\\xc6\\x8b\\x4b\\x58\\x52\\x7f\\x87\\xbd\\xc1\\x92\\x7f\\x63\\x49\\x26\\x20\\x66\\x3a\\xff\\xe1\\x3a\\xde\\x28\\xac\\x63\\xbb\\x08\\xb3\\x2b\\x21\\x30\\xd5\\x46\\xa4\\x59\\x88\\x26\\xbc\\x23\\xab\\x1d\\xcb\\xa6\\x02\\xfb\\x23\\xe0\\xd2\\x46\\x8e\\x58\\x2a\\x96\\x15\\xe2\\x94\\x8e\\x15\\xd6\\x89\\xb1\\xde\\x9f\\xa3\\x8a\\x69\\xe3\\xa3\\x7a\\x3e\\x87\\xe1\\xe7\\x18\\xc0\\x60\\x63\\xf7\\x80\\x01\\x83\\xcf\\x19\\xb4\\x6b\\xbb\\xf4\\x3e\\xe4\\x4d\\x0d\\xc2\\x6a\\x21\\x5b\\x2b\\xf0\\x7b\\xe6\\xf0\\x53\\x94\\x90\\x3e\\xe5\\x04\\x56\\xeb\\xf4\\x34\\xa8\\xc5\\x99\\x1c\\xf0\\xae\\x15\\x16\\x59\\x02\\xdf\\x21\\xd3\\x73\\xd1\\x0c\\xa2\\x1a\\xe2\\x73\\xe1\\x34\\xe1\\xc9\\xf6\\xdb\\xa6\\x89\\xd6\\x74\\x5a\\xfb\\x7f\\x95\\x9d\\xcf\\x4f\\x13\\x41\\x14\\xc7\\x77\\xfa\\x3b\\x15\\xe8\\x2e\\xfd\\x41\\xb1\\x14\\x0a\\x9b\\xd0\\xa4\\x09\\x52\\xb6\\x94\\x6e\\x6b\\x5b\\xa8\\x31\\x31\\x10\\xf4\\x64\\x34\\x24\\x1a\\x63\\x22\\x07\\x8c\\x88\\x68\\x22\\xc4\\x93\\x26\\x26\\x10\\x13\\x08\\xa9\\x86\\x88\\x12\\x95\\x9b\\x07\\x0e\\xdd\\xca\\x1f\\xe1\\x41\\x2e\\x5e\\x8c\\x89\\x5e\\x44\\xbc\\x98\\x10\\x0e\\x7a\\x50\\x42\\xe3\\x7b\\x6f\\x76\\x97\\x9a\\x94\\x12\\x0e\\xdd\\xce\\xce\\xce\\x36\\xe9\\xbc\\xb7\\x3f\\x66\\xe6\\xbd\\xef\\x27\\x0c\\xfd\\xe2\\xc3\\x37\\xea\\x70\\xcc\\x98\\x1d\\xc7\\xec\\xbf\\x18\\x4d\\x9b\\xc7\\x78\\x02\\x1f\\x2e\\xde\\x0b\\x9a\\x10\\xa1\\x37\\x21\\x78\\xa9\\xa2\\x98\\x5b\\xce\\x15\\x94\\x91\\x2d\\x28\\x54\\xb3\\x05\\x3b\\x75\\xb5\\xea\\x2a\\x9c\\x89\\x90\\x63\\x99\\x62\\xb1\\xc8\\x7a\\x7e\\x65\\xef\\x9d\\xf5\\x27\\xa7\\xd5\\xfb\\x73\\x6c\\xbd\\x72\\x11\\x3f\\x73\\xb3\\x99\\xa9\\x84\\x3f\\xfd\\x20\\xff\\xbb\\xf2\\x91\\x6d\\xaf\\x2c\\xaf\\x34\\xee\\xb0\\xb0\\xe8\\xd9\\x16\\xbd\\xaf\\x9e\\x78\\x60\\xd7\\xf5\\x78\\x51\\x92\\xb6\\x3c\\x22\\x6b\\xfa\\xee\\xe2\\xd7\\xc1\\xa8\\xf5\\xa9\\x0d\\xf9\\xc4\\x4e\\x18\\x3d\\x14\\x75\\x8d\\x69\\xd6\\x08\\xbe\\xe1\\x22\\x0f\\x2c\\xdb\\x3d\\x18\\x52\\x4e\\xf5\\x46\\x15\\x95\\x05\\x9b\\x4e\\xd2\\x25\\xf1\\x4e\\x07\\x18\\x92\\x0b\\xc8\\xd8\\x49\\x80\\xd2\\x6e\\x45\\x52\\x30\\x8d\\x0c\\x1d\\x02\\x1f\\x28\\xbb\\x4c\\xf9\\x10\\x84\\x5e\\x89\\xb0\\xe7\\x39\\x10\\xf8\\x44\\x78\\xa4\\xe6\\xa6\\x67\\x98\\x80\\x99\\x08\\x27\\x1a\\x9a\\xfd\\x26\\x05\\x44\\x96\\x64\\x89\\x49\\x44\\x02\\x81\\x52\\xd4\\x2a\\x5b\\x9d\\xd2\\x28\\x5b\\x7c\\xb8\\xc4\\x2e\\xbf\\x9e\\x71\\xcc\\xbe\\x78\\xe4\\x98\\x18\\xbe\\xed\\xb0\\x9f\\x9b\\x98\\x40\\x69\\xd3\\xca\\xa8\\x25\\x5c\\x59\\x66\\x37\\xf7\\xb7\\xd8\\x49\\x56\\xd9\\x66\\x31\\x56\\xf9\\x24\\x30\\x1a\\x24\\xa8\\x36\\x15\\xae\\x83\\xa4\\x60\\xfa\\xba\\x53\\x8f\\xbb\\xd0\\xcb\\x26\\x8e\\x81\\x04\\x07\\xf5\\x2f\\x5d\\xd8\\xaf\\x0f\\xbc\\x1b\\x7f\\x60\\xef\\x3d\\xf7\\x65\\xe4\\x7c\\x37\\x3b\\x7a\\xc0\\x03\\xd7\\xf8\\x4a\\x52\\xc9\\x9f\\xc0\\x5c\\xce\\xb2\\xaf\\xa5\\x0d\\x3b\\xac\\x1a\\x41\\xd9\\x7a\\x80\\xa0\\xec\\xea\\x2d\\x45\\x28\\x85\\x35\\xc4\\xf5\\xcd\\x43\\xc4\\x51\\x0b\\x21\\x05\\x28\\x42\\xc9\\x0b\\x11\\xec\\xae\\x10\\x65\\x84\\xf1\\x34\\x63\\x5a\\x65\\xf1\\xfa\\xa1\\x41\\x90\\x62\\xb8\\x83\\x01\\x7d\\x7a\\x25\\x88\\x53\\x0c\\x88\\xa4\\x2a\\x79\\x25\\x3d\\xdb\\x47\\xc0\\xc9\\x5a\\x6f\\xfa\\x68\\x62\\xa5\\x09\\x69\\xd7\\xbf\\xbb\\xd6\\xfe\\x7c\\xbb\\xf0\\xfc\\x46\\x6c\\x78\\xe6\\xfc\\xf8\\xb8\\x65\\xe9\\xe5\\xfe\\xc6\\x42\\xe5\\xd9\\xc2\\xfe\\xbb\\x55\\xeb\\xe4\\xe6\\xc8\\x87\\xaf\\x1d\\xe1\\x1f\\x81\\xe0\\x95\\xb1\\x11\\x7d\\x41\\xed\\x8d\\x09\\xb1\\x24\\xce\\x8b\\xfd\\x2a\\xf4\\x43\\x17\\x8e\\x3c\\xaa\\x72\\x5e\\xcb\\xa2\\xb7\\x13\\xfb\\x01\\x27\\x64\\x4b\\x6d\\x09\\x82\\x0a\\xb6\\x2b\\xa8\\xc5\\x45\\xc1\\xea\\x32\\xc6\\x77\\x63\\xaa\\x79\\x84\\xa7\\xf2\\x46\\x2c\\x06\\x5a\\x0e\\xb6\\x98\\xd0\\x6b\\x89\\x54\\xa1\\x03\\x6c\\x1c\\x33\\xe7\\x33\\xe4\\x2d\\x6b\\x06\\xee\\x23\\x20\\xc9\\x17\\xa1\\x3f\\xce\\x73\\x56\\x35\\x8f\\x2f\\x9d\\xd6\\x82\\x76\\x3e\\x40\\x73\\xf3\\xb4\\x7c\\x1e\\xed\\x4d\\xd7\\x19\\xc5\\x0d\\x19\\xc4\\xaa\\xff\\x50\\x9e\\xd1\\xd5\\xf9\\x79\\xe6\\xd8\\xb9\\xf4\\x76\\x6a\\x1d\\x71\\x55\\xa9\\x5b\\x83\\xd3\\x77\\x77\\x77\\x17\\xf0\\x2f\\x6f\\xf6\\x7e\\xfe\\xd9\\x11\\xfe\\xfb\\x85\\xe0\\x7b\\xd7\\x1a\\x9a\\xee\\x4c\\xf6\\x12\\xd3\\x13\\xef\\xb0\\xa7\\x05\\xc1\\x85\\x3c\\x52\\x9c\\x5b\\xc9\\x33\\x0b\\x57\\xd0\\xd3\\x94\\x4c\\x22\\x81\\x71\\x6f\\x1b\\x2d\\x7d\\xfd\\xe9\\x2c\\xb2\\xf8\\xcc\\xe9\\x95\\x72\\x73\\xfb\\x29\\xa4\\xb3\\x33\\xc4\\xe3\\x86\\x07\\xf0\\xc5\\x39\\x86\\x8f\\x69\\x8c\\x09\\xc1\\x74\\x78\\x18\\x5f\\x34\\x61\\x6f\\x0d\\x12\\xb4\\xc4\\xca\\x63\\xda\\x24\\xa5\\x1c\\x08\\x19\\xe8\\x04\\xd8\\x22\\x50\\x37\\x14\\x30\\x33\\x3b\\x86\\x42\\xad\\x78\\xcf\\x11\\x51\\x98\\xb8\\xd4\\xa1\\x68\\x2a\\x9c\\xd2\\xa3\\x94\\xd5\\x1c\\xb6\\x50\\x33\\xd0\\x38\\xa7\\x62\\x31\\x07\\x3e\\x57\\x52\\x45\\xa2\\xf3\\xc5\\xa1\\x53\\xe3\\x49\\xac\\x8d\\x2b\\xd0\\x20\\x19\\xc7\\x62\\x32\\x01\\x9d\\x3a\\x04\\x47\\x73\\x30\\x76\\x2b\\x3b\\xdd\\x14\\x0d\\x97\\x54\\xa1\\x5f\\x63\\x32\\xc5\\x91\\x6b\\xd1\\x6e\\x5a\\x04\\x47\\x0d\\xac\\x78\\x5a\\x8b\\xb5\\x92\\xfe\\x93\\x26\\x13\\x25\\xac\\xdb\\x48\\x06\\x39\\x94\\x95\\xda\\x79\\xa4\\x57\\xd6\\xa0\\xa9\\x5a\\x86\\xea\\x78\\x6a\\x2d\\xce\\x6a\\x5d\\xf7\\x85\\x9b\\x18\\xda\\xec\\xba\\x6e\\x33\\x55\\x80\\x51\\xb7\\x6e\\xb5\\xfe\\xbc\\x61\\xb5\\xc4\\x40\\x6e\\xa8\\x8e\\xd5\\xe2\\x68\\x35\\x78\\x4c\\x47\\x13\\xa8\\xdc\\x5a\\x92\\x15\\x74\\x70\\xad\\x3b\\x03\\xb5\\x6e\\x11\\x63\\x19\\x29\\x48\\xee\\xf8\\xe6\\x4b\\x71\\xf3\\x29\\xdc\\x7c\\x4a\\xca\\x00\\x32\\xc2\\xb6\\x1f\\x4e\\x49\\x11\\xac\\x31\\x15\\xc6\\x8a\\x54\\x12\\x4e\\x51\\x44\\xad\\x80\\x11\\x8e\\x60\\xca\\x6c\\x01\\x8f\\x65\\xf3\\xd0\\xac\\x90\\xc5\\x62\\x21\\x8d\\xcd\\x0a\\x83\\x60\\x50\\x0c\\xc5\\x4b\\x05\\x74\\xad\\x45\\xad\\x80\\x58\\x46\\xd9\\x34\\xa3\\x96\\x2d\\x40\\xa5\\x1b\\x0d\\x79\\xe6\\xf8\\xe6\\x3b\\x38\\xc6\\x92\\xf5\\x4c\\x38\\x56\\xa3\\x2e\\xcf\\xb9\\x96\\x87\\x19\\xb1\\x56\\x25\\xdb\\x33\\x19\\x98\\xff\\x00\\x6c\\x25\\xfa\\xf7\\x00\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\x60\\x00\\xe2\\x3b\\x4c\\xea\\x3b\\xe3\\xf9\\x6d\\xbe\\x32\\xc8\\x73\\x30\\x80\\xc0\\xf9\\xfa\\x39\\xe7\\x60\\xf4\\xff\\x13\\xff\\x8c\\x39\\x12\\xd9\\xa7\\x02\\xd5\\x71\\x30\\x30\\x81\\x44\\x01\\x58\\x33\\x0c\\xff\\x00\\x00\\x00\\x78\\xda\\x63\\x60\\x64\\x60\\xe0\\x48\\xfa\\x5b\\x04\\x24\\x1b\\xff\\x9f\\xf8\\x7f\\x8a\\x23\\x91\\x01\\x28\\x82\\x02\\xde\\x00\\x00\\x9e\\x4a\\x07\\x4a\\x00\\x78\\xda\\x6d\\x93\\x6b\\x68\\x8e\\x61\\x18\\xc7\\x7f\\xcf\\x7d\\x5f\\xf7\\xfb\\x2c\\x5b\\xcb\\x07\\x49\\x1a\\x66\\xd4\\xeb\\xcd\\x0e\\x0d\\xd9\\xbb\\xbd\\x66\\x87\\x57\\x63\\x6f\\x3e\\x60\\x39\\x6e\\xc9\\x9a\\x6d\\x72\\x2a\\x72\\x98\\xc3\\x07\\xb6\\xa1\\x35\\x73\\x58\\x14\\x8a\\xf2\\x09\\xc5\\xa2\\x10\\xb5\\xd2\\x3e\\xc8\\x88\\xcf\\x4e\\x39\\x7d\\xa0\\xc8\\x07\\xd6\\x42\\x68\\xaf\\xeb\\x79\\xb5\\x85\\x3c\\xf5\\x7b\\xfe\\x77\\xf7\\xe1\\xea\\x7a\\xfe\\xff\\xfb\\x31\\x1f\\x99\\x97\\x06\\x78\\x5f\\xf4\\xf5\\x86\\xd4\\x13\\x8c\\xbd\\x1f\\xec\\xb4\\x99\\x1c\\x96\\x1e\\xc2\\x52\\x43\\xb1\\x3b\\x49\\xa1\\x0c\\x91\\xe7\\xf5\\xd1\\x69\\xae\\xb0\\xd2\\xf4\\x53\\x6a\\xbb\\xc9\\x91\\x04\\x85\\xde\\x57\\x4a\\x6c\\x01\\x6d\\x66\\x14\\xfb\\xcd\\xc7\\xe4\\x7b\\xe9\\xa6\\xde\\x76\\x30\\x57\\x36\\x32\\x43\\x56\\x50\\x2c\\xad\\x4c\\x95\\x79\\xc4\\xa5\\x85\\x5a\\xad\\x55\\x28\\xb5\\x3a\\xde\\x4e\\x99\\x77\\x8f\\x5a\\xef\\x2e\\x59\\x76\\x90\\x12\\x69\\x60\\x8f\\xf8\\xac\\xb3\\x4f\\xc9\\xf1\\x33\\x89\\xbb\\x3b\\x44\\x5c\\x82\\xa8\\x2b\\x60\\x96\\x6b\\x53\\xcd\\x22\\x2a\\x9f\\x55\\xab\\x29\\x08\\x55\\x10\\x35\\xf7\\x29\\x92\\x8b\\x4c\\x71\\xb7\\x74\\xfe\\x2a\\x51\\xbf\\x83\\x68\\x28\\x5f\\xd7\\x2f\\xea\\xd9\\x3c\\xd5\\x4b\\xaa\\xfb\\x74\\xed\\x19\\xf5\\xae\\x9e\\x69\\xa1\\x74\\xc2\\xae\\x57\\x6b\\x5f\\x67\\x82\\x3b\\xc7\\x64\\xb7\\x43\\x7b\\x7a\\x40\\xc2\\x54\\xd2\\x69\\x97\\x91\\x61\\x8a\\x49\\xb7\\xdb\\xc8\\x93\\x2a\\xea\\xcc\\x66\\xca\\xa5\\x91\\x84\\x9c\\x4d\\x7e\\x90\\x22\\xed\\xb5\\x57\\x89\\x13\\x37\\xdf\\x89\\xe9\\xb7\\x2d\\x76\\x63\\xc9\\x36\\x27\\x08\\x9b\\xe5\\xc9\\x57\\xf2\\x46\\xc7\\x5d\\x64\\xfb\\x5b\\xb4\\xee\\x18\\xb2\\x65\\x2f\\x65\\xf2\\x84\\x88\\x7e\\x73\\xdc\\xae\\xa6\\x4a\\x26\\x52\\x6f\\x7e\\x92\\xab\\xde\\x4d\\x96\\xa3\\x4c\\x0a\\xad\\x57\\x3f\\x2f\\xe8\\xbe\\x5e\\xc6\\x4b\\x3e\\x2b\\xcc\\x11\\xc2\\xde\\x65\\xda\\x4d\\x27\\xe9\\x6e\\x3a\\x6b\\x03\\xef\\x4d\\x06\\xad\\xea\\xd7\\x22\\x39\\xad\\xbe\\x9f\\x62\\x89\\xdb\\x45\\xc4\\x78\\x1c\\x94\\xe7\\x2c\\x55\\x8f\\x8e\\x85\\x26\\x92\\xb0\\x0d\\xac\\xb6\\xb7\\x11\\xf5\\x7f\\x6b\\xe0\\x7d\\x6a\\xee\\x13\\xdd\\xe6\\x3d\\xeb\\x65\\x34\\x95\\xb6\\x88\\x46\\x5b\\xa1\\xf5\\xdb\\xf5\\x7c\\x5c\\xbd\\x6a\\x66\\xb6\\x89\\x70\\xdc\\x1b\\xa4\\xc6\\x8c\\xa3\\x49\\xb3\\xdb\\x64\\x1f\\x51\\xee\\x0e\\xb0\\xdd\\x5d\\xa3\\x29\\xd4\\x40\\xb5\\xbd\\x46\\x5e\\xca\\xf7\\xff\\xe0\\x27\\xa9\\x4c\\x65\\x91\\xf5\\x3b\\x8b\\x61\\xcc\\xfd\\xe4\\x40\\x90\\x85\\xea\\x3b\\xa5\\xdf\\x9d\\x27\\x7f\\x24\\x87\\x7f\\x90\\x5c\\x4a\\x5d\\x0b\\x0b\\x82\\x2c\\xfe\\x24\\xc8\\xc2\\x8d\\xd7\\x3d\\x11\\xf5\\x26\\xf0\\xfd\\x3f\\x84\\xbe\\x51\\x9d\\xca\\x22\\xfe\\x37\\xa6\\x07\\x5f\\xa9\\x32\\x3d\\xc9\\x1f\\xca\\x0b\\xe9\\x63\\xce\\x48\\x0e\\xff\\xb2\\x49\\xef\\xc3\\x19\\x16\\xa6\\xb2\\xf8\\x93\\x20\\x8b\\x97\\x7a\\x97\\x55\\xfd\\x87\\x34\\xfb\\x35\\xd4\\x05\\x3d\\xd9\\xdd\\xac\\xb2\\x37\\xd9\\x68\\x1f\\x80\\x7f\\x12\\x86\\xd5\\x1c\\xd2\\xff\\xe3\\xad\\x12\\xff\\x0d\\x03\\xaa\\xed\\xaa\\x1b\\x74\\x8f\\x66\\x31\\x8c\\xab\\xe3\\x5c\\x28\\xc6\\x3e\\xef\\x35\\x6b\\xbc\\xc7\\xc4\\xbc\\x21\\xbd\\x13\\x15\\x9a\\xcb\\x02\\xf5\\x3a\\xa6\\xbd\\xdf\\xa1\\xc5\\xdd\\xa0\\x23\\x38\\x6b\\x4a\\xc8\\x35\\xe5\\xcc\\x0f\\xea\\x4a\\x58\\xff\\x87\\xc7\\xda\\x67\\x14\\x5c\\x31\\x39\\xae\\x8b\\x70\\xda\\x4c\\x62\\x69\\xfb\\x89\\xfd\\x02\\x8e\\x79\\xbf\\x05\\x00\\x78\\xda\\x63\\x60\\x60\\xd0\\x41\\x82\\x31\\x0c\\x13\\x18\\xab\\x98\\x58\\x98\\x96\\x30\\xbb\\x30\\x67\\x30\\x4f\\x63\\x3e\\xc2\\xfc\\x81\\xc5\\x84\\x25\\x86\\xa5\\x82\\x65\\x0e\\xcb\\x16\\x56\\x16\\x56\\x07\\xd6\\x5d\\x6c\\x66\\x6c\\x3d\\x6c\\x9f\\xd8\\x73\\xd8\\xb7\\x71\\xb8\\x70\\xec\\xe2\\x78\\xc7\\xa9\\xc6\\x69\\xc3\\x19\\xc7\\x59\\xc4\\x79\\x8b\\x6b\\x11\\xd7\\x2b\\xee\\x0c\\xee\\x53\\x3c\\x72\\x3c\\x13\\x78\\x3e\\xf1\\x26\\xf1\\x3e\\xe2\\x93\\xe1\\xab\\xe0\\x7b\\xc1\\x6f\\xc7\\x7f\\x42\\xc0\\x4c\\xa0\\x43\\xe0\\x83\\x60\\x88\\xe0\\x23\\xa1\\x18\\xa1\\x4d\\xc2\\x32\\xc2\\x61\\xc2\\xc7\\x44\\x54\\x44\\x6a\\x44\\x2e\\x89\\x32\\x88\\x4a\\x88\\x7a\\x89\\xe6\\x88\\xb6\\x89\\x2e\\x13\\x33\\x12\\x9b\\x27\\xf6\\x43\\xbc\\x40\\xfc\\x92\\x84\\x91\\xc4\\x3a\\x49\\x0d\\xc9\\x02\\xc9\\x1d\\x52\\x32\\x52\\x61\\xd2\\x5c\\xd2\\x2d\\xd2\\x17\\x64\\x02\\x64\\x4e\\xc9\\xaa\\xc8\\x2e\\x93\\xfd\\x23\\x97\\x26\\xb7\\x40\\xee\\x99\\xbc\\x85\\x7c\\x87\\xfc\\x03\\x05\\x2d\\x05\\x0f\\x85\\x09\\x0a\\x0f\\x14\\x1e\\x28\\x72\\x29\\x56\\x28\\x71\\x29\\x4d\\x51\\x96\\x52\\x76\\x52\\xfe\\xa6\\xa2\\xa2\\x72\\x4d\\x35\\x42\\xb5\\x4a\\x75\\x91\\xea\\x31\\xb5\\x0e\\xb5\\x25\\x6a\\x9f\\xd4\\x1d\\xd4\\x27\\x69\\xf0\\x69\\x98\\x68\\xac\\xd2\\x64\\xd2\\x54\\xd1\\x8c\\xd3\\x6c\\xd1\\xbc\\xa0\\xf9\\x45\\xab\\x42\\x9b\\x47\\xfb\\x86\\x8e\\x9d\\xce\\x14\\x9d\\x37\\xba\\x6e\\xba\\xf7\\xf4\\x22\\xf4\\x3e\\xe9\\x77\\x19\\x28\\x18\\x2c\\x33\\xd4\\x33\\xdc\\x63\\x14\\x62\\xb4\\xc4\\xe8\\x8b\\xb1\\x87\\xf1\\x32\\x13\\x09\\x93\\x4b\\xa6\\x66\\xa6\\xf3\\xcc\\x78\\xcc\\x66\\x98\\x8b\\x98\\x9b\\x99\\xef\\xb1\\xb0\\xb2\\xd8\\x63\\xe9\\x62\\x79\\xc1\\xca\\xca\\x6a\\x8d\\xb5\\x9e\\xf5\\x39\\x9b\\x1c\\x5b\\x21\\xdb\\x07\\x76\\xb3\\xec\\x0b\\x1c\\xb4\\x1c\\xb6\\x39\\x2a\\x39\\x4e\\x72\\x62\\x71\\x9a\\xe4\\xf4\\xc8\\xd9\\xc8\\xb9\\xc3\\xf9\\x95\\x4b\\x82\\xab\\x98\\x6b\\x89\\xeb\\x0d\\x37\\x07\\xb7\\x53\\xee\\x4e\\xee\\x25\\xee\\x5f\\x3c\\xf2\\x3c\\xde\\x78\\xe6\\x78\\xfe\\xf2\\x0a\\xf3\\xba\\xe1\\x1d\\xe6\\xfd\\xc1\\xa7\\xc5\\x57\\xc0\\xd7\\xcc\\xb7\\x0e\\x07\\xec\\xf1\\x9d\\xe5\\xbb\\xc2\\xf7\\x84\\xef\\x0b\\x3f\\x01\\x3f\\x0b\\xbf\\x04\\xbf\\x55\\x7e\\x1f\\xfc\\x4d\\xfc\\x53\\xfc\\x57\\x01\\xe1\\x39\\xff\\x4f\\xfe\\x9f\\x02\\x4a\\x02\\x5e\\x04\\x0a\\x04\\x4e\\x09\\x92\\x0a\\xfa\\x12\\x7c\\x03\\x00\\x96\\x1e\\x9a\\xe2\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\xec\\x00\\x48\\x00\\x05\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x01\\x00\\x02\\x00\\x16\\x00\\x00\\x01\\x00\\x01\\x66\\x00\\x00\\x00\\x00\\x78\\xda\\x85\\x92\\xcf\\x4e\\x14\\x41\\x10\\xc6\\xbf\\x99\\x5d\\x15\\x02\\x1a\\x21\\x86\\x23\\x99\\x78\\x30\\x9a\\xb8\\xc3\\xb0\\xac\\xa8\\x6b\\x62\\xa2\\x06\\x08\\x86\\x78\\x40\\x22\\x17\\x2e\\xc3\\xba\\xb0\\x1b\\x61\\x97\\x0c\\xa3\\xe8\\x2b\\xf8\\x24\\x86\\x93\\x67\\x1f\\xc0\\xe8\\x85\\x07\\xe0\\xe0\\x23\\xf8\\x0c\\xfe\\xba\\xa6\\x67\\xdd\\x31\\x41\\xd2\\xe9\\xee\\xaf\\xaa\\xba\\xbe\\xfa\\xd3\\x25\\x69\\x56\\xbf\\x54\\x53\\x50\\x9f\\x94\\xf4\\x94\\x5d\\xe0\\x40\\x73\\x48\\x05\\x0e\\x35\\xa1\\x2d\\x8f\\x6b\\x8a\\xb5\\xe3\\x71\\x5d\\x91\\x3e\\x7b\\x7c\\x45\\x5f\\x74\\xea\\xf1\\x55\\xcd\\x07\\x9b\\x1e\\x5f\\xd3\\xcb\\xe0\\xc8\\xe3\\x49\\x4d\\x07\\xdf\\x3c\\x9e\\xd2\\xad\\xe0\\xbb\\xc7\\xd3\\xba\\x13\\x9c\\x7b\\x7c\\x5d\\x3b\\x61\\x99\\xc3\\x0d\\x6d\\x85\\x65\\xac\\x9b\\x9a\\x0b\\xbf\\x7a\\x3c\\xa3\\x89\\xb0\\xf4\\x9d\\x55\\x14\\x9e\\x79\\xfc\\x83\\x37\\xbf\\x3d\\xfe\\xa9\\xa4\\x56\\xd7\\xaa\\x86\\x1a\\x28\\x27\\xcf\\xb7\\x4a\\xb9\\x53\\x50\\x07\\xdd\\x91\\x3e\\x29\\x53\\x5f\\xfb\\xea\\x99\\x75\\x0d\\xdd\\x10\\xe9\\x40\\x5d\\xa4\\xa6\\x12\\x2d\\x6a\\x49\\x9b\\xe8\\x76\\xd9\\x39\\x3b\\xd2\\x6b\\xac\\x29\\xf2\\x73\\xa4\\x03\\xf8\\xc6\\x7d\\xda\\x17\\xbc\\x6d\\x5f\\xc2\\x15\\x8d\\xd8\\xde\\xc0\\x92\\xe9\\x98\\x9c\\x5c\\xc6\\x11\\x3e\\x31\\x3b\\x61\\x35\\xb5\\x8c\\xff\\x93\\xb1\\xbc\\x1c\\xce\\x59\\x7b\\x70\\xbc\\x37\\xc6\\x1e\\x7e\\x45\\x9d\\x77\\xf5\\x81\\x57\\xb1\\x1e\\xab\\xc5\\xe9\\x3c\\x1a\\xf8\\x74\\xf4\\x10\\xf9\\x1e\\xf6\\x06\\xd1\\x22\\x3d\\x32\\x94\\x59\\x9c\\xa6\\xe1\\x35\\xcf\\x9f\\x98\\xf4\\xd1\\x2c\\x2d\\xc3\\x27\\x9c\\xb7\\x59\\x0e\\x6f\\x57\\xea\\x28\\xab\\x68\\x8c\\xaa\\xb8\\xa8\\xca\\x3e\\x95\\x45\\xd6\\xfd\\x9c\\xa8\\x29\\x2f\\xbb\\x3a\\xe4\\xce\\xf4\\x0e\\xdd\\x90\\x4a\\xaa\\x7f\\x10\\x57\\xa4\\xaa\\xc5\\xfd\\xdf\\xa1\\x5e\\x50\\x73\\x66\\xbc\\x39\\x67\\x6a\\x3d\\x2b\\xa2\\xbb\\x3e\\xe6\\xe8\\x5d\\x1f\\x37\\xb0\\x75\\xd0\\x0c\\x90\\xbb\\x44\\x8d\\xe8\\xd7\\xc0\\xa2\\x67\\x96\\x4b\\xcf\\xfe\\xfb\\x19\\xf3\\x90\\xf2\\xae\\x90\\xaa\\x3e\\xf7\\xd1\\xfc\\xfb\\x37\\x4d\\xb2\\x48\\x6c\\x72\\x72\\x3c\\xdb\\x5a\\x60\\x9d\\xd8\\x8a\\xe1\\xf9\\xcb\\x15\\xf3\\x3e\\x23\\xef\\x05\\x32\\x1f\\xe7\\x3c\\x46\\xb3\\xa1\\x75\\x6a\\x58\\xd1\\x2b\\xba\\xb4\\x42\\x07\\x0b\\xce\\xff\\x4f\\xdc\\x65\\x33\\xb4\\x0d\\xf7\\x2e\\xbd\\x2c\\x67\\x7e\\xd1\\x38\\x57\\xad\\x4f\\x45\\x95\\x99\\x65\\xff\\x80\\xd3\\x4d\\x52\\xdb\\xa6\\xcb\\x9d\\xcb\\xa3\\xe9\\x6a\\xfd\\x01\\x78\\x3b\\x95\\xca\\x00\\x78\\xda\\x6d\\xd1\\x47\\x6c\\x53\\x41\\x10\\x80\\xe1\\x7f\\x12\\xc7\\x4e\\x9c\\xde\\x7b\\xa3\\x77\\xfc\\x9e\\xed\\x14\\xba\\x9d\\xc4\\xf4\\xde\\x3b\\x81\\x24\\xb6\\x43\\x48\\x82\\x83\\x81\\xd0\\x02\\xa2\\x57\\x81\\x90\\xb8\\x81\\x48\\xe0\\x02\\x88\\x5e\\x05\\x02\\x0e\\x80\\xe8\\x4d\\x14\\x01\\x07\\xce\\x74\\x71\\x00\\xae\\x60\\xfc\\x96\\x1b\\x73\\xf9\\xb4\\x33\\xbb\\xa3\\xd1\\x2c\\x11\\x84\\xe3\\x77\\x3d\\x35\\xfc\\x2f\\xbe\\x80\\x44\\x48\\xa4\\x98\\x24\\x8a\\x48\\x4c\\x44\\x61\\xc6\\x42\\x34\\x31\\x58\\x89\\x25\\x8e\\x78\\x12\\x48\\x24\\x89\\x64\\x52\\x48\\x25\\x8d\\x74\\x32\\xc8\\x24\\x8b\\x6c\\x72\\xc8\\x25\\x8f\\x7c\\x0a\\x28\\xa4\\x88\\x62\\x3a\\xd1\\x99\\x2e\\x74\\xa5\\x1b\\xdd\\xe9\\x41\\x4f\\x7a\\xd1\\x9b\\x3e\\xf4\\xa5\\x1f\\xfd\\xb1\\xa1\\xa1\\x63\\xc7\\x81\\x93\\x12\\x4a\\x29\\xa3\\x9c\\x01\\x0c\\x64\\x10\\x83\\x19\\xc2\\x50\\x86\\xe1\\xc2\\x4d\\x05\\x95\\x54\\xe1\\x61\\x38\\x23\\x18\\xc9\\x28\\x46\\x33\\x86\\xb1\\x8c\\x63\\x3c\\x13\\x98\\xc8\\x24\\x26\\x33\\x85\\xa9\\x4c\\x63\\x3a\\x33\\x98\\xc9\\x2c\\x66\\x33\\x87\\xb9\\xcc\\x63\\x3e\\x0b\\xa8\\x16\\x33\\x47\\xd8\\xc4\\x66\\xae\\x73\\x80\\x0f\\x6c\\x61\\x0f\\x3b\\x39\\xc8\\x31\\x8e\\x8a\\x85\\x1d\\xbc\\x63\\x23\\xfb\\x25\\x5a\\x62\\xd8\\x2d\\x56\\xb6\\x71\\x8b\\xf7\\x12\\xcb\\x21\\x8e\\xf3\\x93\\x1f\\xfc\\xa2\\x83\\x93\\xdc\\xe7\\x2e\\xa7\\x58\\xc8\\x22\\xf6\\x86\\xb6\\xf5\\x90\\x5a\\xee\\xf1\\x80\\xa7\\x3c\\xe2\\x31\\x4f\\xf8\\x48\\x1d\\x2f\\x78\\xc6\\x73\\x4e\\xe3\\xe5\\x3b\\xfb\\x78\\xcd\\x4b\\x5e\\xe1\\xe3\\x33\\x5f\\xd9\\x4e\\x3d\\x7e\\x16\\xb3\\x84\\x06\\x1a\\x39\\x4c\\x13\\x4b\\x69\\x26\\x40\\x0b\\x41\\x96\\xb1\\x9c\\x15\\x7c\\x62\\x25\\xab\\x68\\x65\\x35\\x6b\\x59\\xc3\\x15\\xda\\x69\\x63\\x1d\\xeb\\xd9\\x10\\xfa\\x83\\x6f\\x5c\\xe5\\x0c\\x67\\xb9\\xc6\\x1b\\xde\\x4a\\x9c\\xc4\\x4b\\x82\\x24\\x4a\\x92\\x24\\x4b\\x8a\\xa4\\x4a\\x9a\\xa4\\x4b\\x86\\x64\\x4a\\x96\\x64\\x73\\x8e\\xf3\\x5c\\xe2\\x32\\xb7\\xb9\\xc0\\x45\\xee\\xb0\\x95\\x13\\x92\\xc3\\x0d\\x6e\\x4a\\xae\\xe4\\xb1\\x4b\\xf2\\xa5\\x40\\x0a\\xa5\\x48\\x8a\\xcd\\xde\\x86\\xd6\\x66\\x9f\\x66\\x09\\x36\\xfa\\x6d\\x36\\x5b\\xa5\\x52\\x57\\x96\\x1b\\xba\\x6c\\x4a\\x55\\x77\\xab\\xba\\xdb\\xae\\x74\\x2a\\xc3\\xf7\\xf5\\xd0\\x43\\xa5\\xa6\\xd4\\x95\\x76\\xa5\\x43\\xe9\\x54\\x96\\x28\\x4b\\x95\\x65\\xca\\x7f\\xfd\\x5c\\x86\\x9a\\xea\\xab\\x69\\xd6\\x3a\\xbf\\x37\\x18\\xa8\\xad\\xa9\\x6e\\xf1\\x19\\x29\\xdd\\x63\\xe8\\xf4\\x98\\xaa\\x82\\x81\\xa6\\xf0\\xc1\\xe9\\xa9\\xf8\\xab\\xc7\\x6d\\xcc\\x11\\x52\\x57\\xda\\x95\\x8e\\x3f\\x6b\\x51\\xa3\\x5a\\x00\\x00\\x78\\xda\\xdb\\xc1\\xf8\\xbf\\x75\\x03\\x63\\x2f\\x83\\xf7\\x06\\x8e\\x80\\x88\\x8d\\x8c\\x8c\\x7d\\x91\\x1b\\xdd\\xd8\\xb4\\x23\\x14\\x37\\x08\\x44\\x7a\\x6f\\x10\\x09\\x02\\x32\\x1a\\x22\\x65\\x37\\xb0\\x69\\xc7\\x44\\x30\\x6c\\x60\\x56\\x70\\xdd\\xc0\\xac\\xed\\xb2\\x81\\x45\\xc1\\x75\\x13\\xb3\\x38\\x93\\x36\\x88\\xc3\\xb8\\x81\\x15\\x2a\\xca\\x05\\x14\\x65\\xdd\\xcc\\xa4\\xbd\\x91\\xd9\\xad\\x0c\\xc8\\xe5\\x04\\x72\\xb9\\x84\\xe0\\x5c\\x0e\\x20\\x97\\x53\\x02\\xce\\x65\\x07\\x72\\x39\\x74\\xe1\\x5c\\x36\\x20\\x97\\x5d\\x0c\\xce\\xe5\\x56\\x70\\xdd\\xc5\\xc0\\x5a\\xff\\x9f\\x01\\x2e\\xc2\\x03\\x54\\xc0\\xcd\\x01\\xe3\\x46\\x6e\\x10\\xd1\\x06\\x00\\x33\\xcf\\x35\\x6c\\x00\\x01\\x53\\x59\\xec\\x4e\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\x51\\xd8\\x44\\x79\\xdc\\x6f\\x00\\x00\")\n\nfunc fontsRobotoslabBoldWebfontWoffBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_fontsRobotoslabBoldWebfontWoff,\n\t\t\"fonts/robotoslab-bold-webfont.woff\",\n\t)\n}\n\nfunc fontsRobotoslabBoldWebfontWoff() (*asset, error) {\n\tbytes, err := fontsRobotoslabBoldWebfontWoffBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"fonts/robotoslab-bold-webfont.woff\", size: 28636, mode: os.FileMode(509), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesBulletConnections2Png = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x53\\x4f\\x68\\xe4\\x54\\x18\\x7f\\x6d\\xd5\\x5d\\xbb\\xb6\\x07\\x17\\x0f\\x5d\\x70\\xf7\\x91\\x8a\\x56\\x71\\x26\\x79\\xf9\\x3b\\x89\\x93\\x69\\x33\\xc9\\x8c\\x33\\xb0\\xa9\\x43\\x3a\\xb0\\x23\\x08\\x6e\\x26\\x79\\x33\\x13\\xda\\xe4\\x65\\x93\\x57\\x27\\x2d\\x15\\x74\\x2f\\xce\\xaa\\x08\\x7a\\xf0\\x24\\x2c\\x42\\x2f\\x82\\x08\\x5e\\x44\\xfc\\xc3\\xba\\xb0\\x05\\xf7\\xe8\\xc5\\x83\\x17\\xa1\\x78\\x56\\x7a\\xf3\\x50\\x41\\x52\\x27\\xbb\\x22\\xa5\\x07\\x3f\\x78\\xf0\\xde\\xc7\\xef\\xf7\\xfb\\xfe\\xbc\\xef\\xbb\\xd5\\x59\\x7f\\x79\\x61\\xfe\\xd2\\x3c\\x00\\x60\\xa1\\xdd\\xb2\\x1c\\x00\\xc0\\x85\\xfc\\x9c\\x7f\\x0c\\x00\\xf0\\xd9\\xe7\\xe3\\x67\\x01\\x00\\x4b\\xb4\\xd1\\xa3\\x1b\\x64\\x40\\xc7\\x6e\\x82\\x81\\xe1\\x93\\x3e\\x86\\xed\\xd0\\x1d\\x62\\x07\\xbb\\xfe\\xce\\x8d\\xfb\\xb8\\x0a\\xc0\\xdc\\x28\\xe8\\xf6\\x68\\xcf\\xbe\\xaa\\x79\\x24\\x2c\\xbb\\x39\\xa6\\x9c\\x85\\x31\\xc8\\xad\\xba\\x9a\\xc5\\xae\\xb7\\x89\\x29\\xec\\xe3\\x61\\x10\\xe9\\xcc\\x1f\\xdf\\xde\\x61\\x60\\xe0\\xeb\\xcc\\x35\\xc9\\xe6\\xec\\xd8\\xc4\\xa3\\xa0\\xb5\\x9b\\xe0\\x8d\\xdd\\xf5\\xae\\xb7\\xbb\\xe9\\xa9\\x3e\\xb3\\x5a\\x83\\xd5\\x4c\\xcb\\xc2\\x38\\xc4\\xd4\\x85\\x59\\xb8\\x15\\xa5\\x5a\\xa6\\x33\\x27\\xba\\x5a\\x94\\x6a\\xb9\\x9b\\x65\\xe0\\x09\\x84\\x6e\\xea\\xcc\\x3f\\x49\\xf5\\xec\\x0e\\x34\\x49\\x82\\xa1\\x54\\x16\\x4a\\x1e\\x87\\x10\\x94\\xe5\\x32\\x12\\x25\\x59\\x46\\x2f\\x42\\x9e\\x43\\x3c\\xcb\\xf1\\x2c\\x27\\x97\\x90\\xa8\\x49\\xb2\\xc6\\x2b\\x70\\x6a\\x4c\\x0d\\x56\\x13\\x7f\\xa0\\x39\\x56\\x73\\x1a\\x2b\\xf1\\x07\\x3a\\x33\\xa2\\x34\\xd6\\x58\\x76\\x3c\\x1e\\x97\\xc7\\x42\\x99\\x24\\x43\\x16\\xa9\\xaa\\x9a\\x6b\\xf0\\x7c\\x29\\xf1\\x07\\xa5\\x74\\x27\\xa2\\x6e\\x56\\x8a\\xd2\\xe5\\x42\\xc1\\xc2\\xa9\\x97\\x04\\x31\\x0d\\x48\\x04\\xf3\\xb7\\xdb\\x27\\xdb\\x54\\x67\\x98\\xa2\\x84\\x30\\xb6\\xed\\x07\\xc2\\x51\\x3a\\x6d\\x94\\x47\\x42\\x36\\x73\\x63\\x16\\x95\\x39\\x36\\x0c\\xd9\\x02\\x9d\\x52\\x07\\x0f\\xce\\x46\\xa7\\xdd\\x9d\\x18\\xb3\\x0e\\x4e\\xc9\\x76\\xe2\\x61\\x07\\x0f\\x96\\xff\\x15\\xea\\x6c\\x6a\\x0e\\x8c\\x6d\\x5b\\x7b\\x25\\x09\\x86\\x41\\xe4\\x6e\\x59\\xc4\\xdb\\x0e\\x71\\x44\\xdb\\x96\\xce\\x64\\x61\\x5c\\xf6\\x03\\x5f\\x93\\x14\\x41\\x51\\x55\\x41\\xe0\\x11\\xcf\\xc9\\x15\\x84\\x2a\\x86\\x6c\\x35\\x24\\xb1\\xae\\xca\\x86\\x58\\x57\\x44\\xa1\\xd0\\x38\\x8d\\xab\\x58\\x82\\x82\\xd4\\x8a\\xa9\\x48\\x16\\x87\\x50\\x43\\xac\\x88\\x8a\\xda\\x90\\x45\\xb3\\x2e\\x5b\\xbc\\xc4\\x99\\x62\\xc1\\x6d\\x47\\x29\\x75\\x23\\x0f\\x17\\xdc\\xe0\\x21\\xb7\\x7e\\x26\\x57\\x33\\x13\\xec\\x52\\x92\\x74\\x09\\xd9\\x2a\\x26\\xa0\\x33\\x22\\x94\\xa4\\x23\\x12\\x43\\x73\\x43\\x86\\x2b\\xb6\\xeb\\x05\\x51\\xee\\x78\\x3e\\xff\\xa0\\x69\\xae\\x38\\x09\\xde\\xc0\\x7e\\x33\\x21\\x21\\x3c\\xe9\\xb0\\x16\\x9c\\x92\\x41\\x5d\\xae\\x88\\x8a\\xd1\\x34\\x11\\x3f\\xad\\x9c\\xe7\\x8d\\x86\\x29\\x1a\\x6a\\x03\\x19\\x92\\xd5\\xe4\\x98\\x29\\xd7\\xff\\x3f\\x5d\\x63\\x6b\\xb0\\xca\\xfe\\x67\\x5c\\x0a\\x97\\x63\\x35\\xf3\\xeb\\x83\\xe1\\xaf\\xc1\\x87\\xeb\\x83\\x23\\x5f\\x67\\x12\\x66\\xb5\\xe6\\xfe\\x3c\\xd9\\x03\\x00\\x7c\\xdc\\xb6\\x8c\\x6e\\xf6\\x4b\\xff\\xf8\\xaf\\xaf\\x6e\\xcf\\xcc\\xff\\xf6\\xf6\\xd7\\xb3\\x93\\xef\\xdf\\xea\\xcd\\x4e\\x5e\\x07\\x47\\x32\\xfc\\x1d\\x1c\\xbe\\x03\\x1f\\x7d\\xbf\\x73\\x70\\x79\\xed\\xbb\\xf9\\xc9\\xce\\x12\\x77\\x77\\x08\\x17\\xe7\\x0e\\x9f\\xbe\\xba\\x56\\x9f\\x99\\x5c\\x3b\\xec\\xfc\\x08\\x9e\\x3a\\xb7\\xb4\\x0f\\x9c\\xd7\\x1e\\xbf\\xb7\\xf7\\xc4\\x9f\\x33\\x2d\\x53\\x6d\\x7d\\xf9\\xdc\\xdc\\x8d\\x1f\\x2e\\xec\\xf7\\x3e\\x69\\x1d\\x3c\\x09\\x0f\\xd8\\x5b\\xdd\\xe3\\xd9\\xfd\\xec\\xa5\\x0f\\xdf\\xbd\\xfb\\xe9\\x4f\\x8b\\x0b\\x97\\xf7\\xc0\\x33\\xbf\\x2e\\x3a\\xc7\\xe0\\xd2\\x07\\xb7\\x8f\\x56\\x1e\\xb9\\xbf\\x7a\\xfd\\xe6\\xab\\x33\\xf7\\xbe\\x59\\xab\\x5e\\x9c\\x5c\\x99\\x3b\\x62\\x57\\xf4\\x8b\\x2f\\x2c\\x7e\\x34\\x04\\xe7\\x39\\x20\\x2c\\x5f\\xb9\\xf3\\xe6\\x7b\\xfd\\x73\\xf9\\xee\\xb7\\x1b\\xeb\\xd6\\x17\\xf5\\xeb\\x37\\xff\\x0e\\x00\\x00\\xff\\xff\\x46\\x0f\\x29\\x11\\x68\\x04\\x00\\x00\")\n\nfunc imagesBulletConnections2PngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesBulletConnections2Png,\n\t\t\"images/bullet-connections-2.png\",\n\t)\n}\n\nfunc imagesBulletConnections2Png() (*asset, error) {\n\tbytes, err := imagesBulletConnections2PngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/bullet-connections-2.png\", size: 1128, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesBulletConnectionsPng = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x53\\x4f\\x68\\xe4\\x54\\x18\\x7f\\x6d\\xfd\\xb3\\x76\\x6d\\x05\\x17\\x0f\\x5d\\xb4\\x3e\\xb2\\xa2\\x75\\x71\\x26\\x79\\x99\\x49\\x32\\x89\\x93\\x69\\xf3\\x6f\\x9c\\x91\\x4d\\x1d\\xd2\\x81\\x8e\\x20\\xb8\\x69\\xf2\\x66\\x26\\xb4\\xc9\\x4b\\x93\\x57\\x27\\x53\\xf6\\xa0\\x7b\\x71\\x76\\x11\\x41\\x05\\x4f\\x82\\x08\\x55\\x10\\x44\\xf0\\x26\\xba\\xa2\\x0b\\x5b\\x70\\x8f\\x5e\\xbd\\x08\\x55\\xf0\\xa6\\xf4\\xe6\\x61\\x0f\\x92\\x3a\\xd9\\x15\\x59\\x7a\\xf0\\x83\\x07\\xef\\x7d\\xfc\\x7e\\xbf\\xef\\xcf\\xfb\\xbe\\x6b\\x9d\\xf5\\x97\\x16\\xe6\\xcf\\xcf\\x03\\x00\\x16\\xda\\x2d\\xd3\\x01\\x00\\x9c\\xcd\\xcf\\x99\\x87\\x00\\x00\\x9f\\x7f\\x31\\x7a\\x16\\x00\\xb0\\x44\\xad\\x1e\\xdd\\x20\\x7d\\x3a\\x72\\x13\\x0c\\x34\\x9f\\x6c\\x61\\xd8\\x0e\\xdd\\x01\\x76\\xb0\\xeb\\x8f\\x77\\x6f\\xe3\\x3a\\x00\\x73\\xc3\\xa0\\xdb\\xa3\\x3d\\xfb\\x92\\xe2\\x91\\xb0\\xec\\xe6\\x98\\x72\\x16\\xc6\\x20\\xb7\\xfa\\x6a\\x16\\xbb\\xde\\x36\\xa6\\x70\\x0b\\x0f\\x82\\x48\\x65\\xfe\\xfc\\xf6\\x7b\\x06\\x06\\xbe\\xca\\x6c\\x0a\\x36\\x67\\xc7\\x06\\x1e\\x06\\xad\\xfd\\x04\\x6f\\xec\\xaf\\x77\\xbd\\xfd\\x6d\\x4f\\xf6\\x99\\xd5\\x06\\xac\\x67\\x4a\\x16\\xc6\\x21\\xa6\\x2e\\xcc\\xc2\\x9d\\x28\\x55\\x32\\x95\\x39\\xd1\\x55\\xa2\\x54\\xc9\\xdd\\x2c\\x03\\x4f\\x20\\x74\\x5b\\x65\\xfe\\x49\\xaa\\x67\\x77\\xa0\\x41\\x12\\x0c\\x85\\x72\\xa5\\xe4\\x71\\x08\\x41\\x51\\x2c\\xa3\\xaa\\x20\\x8a\\xe8\\x05\\xc8\\x73\\x88\\x67\\x39\\x9e\\xe5\\xc4\\x12\\xaa\\x2a\\x82\\xa8\\xf0\\x12\\x9c\\x1a\\xd3\\x80\\xf5\\xc4\\xef\\x2b\\x8e\\xd9\\x9c\\xc6\\x4a\\xfc\\xbe\\xca\\x0c\\x29\\x8d\\x15\\x96\\x1d\\x8d\\x46\\xe5\\x51\\xa5\\x4c\\x92\\x01\\x8b\\x64\\x59\\xce\\x35\\x78\\xbe\\x94\\xf8\\xfd\\x52\\x3a\\x8e\\xa8\\x9b\\x95\\xa2\\xf4\\x42\\xa1\\x60\\xe2\\xd4\\x4b\\x82\\x98\\x06\\x24\\x82\\xf9\\xdb\\xdd\\x22\\x7b\\x54\\x65\\x98\\xa2\\x84\\x30\\xb6\\xed\\xbb\\xc2\\x51\\x3a\\x6d\\x94\\x47\\x42\\x36\\x73\\x63\\x16\\x95\\x39\\x36\\x0c\\xd9\\x02\\x9d\\x52\\x07\\xf7\\x4f\\x47\\xa7\\xdd\\x71\\x8c\\x59\\x07\\xa7\\x64\\x2f\\xf1\\xb0\\x83\\xfb\\x17\\xfe\\x15\\xea\\x74\\x6a\\x0e\\x8c\\x6d\\x5b\\x79\\x25\\x09\\x06\\x41\\xe4\\xee\\x98\\xc4\\xdb\\x0b\\x71\\x44\\xdb\\xa6\\xca\\x64\\x61\\x5c\\xf6\\x03\\x5f\\x11\\xa4\\x8a\\x24\\xcb\\x95\\x0a\\x8f\\x78\\x4e\\xac\\x21\\x54\\xd3\\x44\\xd3\\x12\\xaa\\xba\\x2c\\x6a\\x55\\x5d\\xaa\\x56\\x0a\\x8d\\xfb\\x71\\x2d\\x59\\xe4\\x35\\xde\\x32\\x25\\xc1\\xa8\\x21\\x64\\x55\\x35\\x24\\x4b\\x16\\x92\\x74\\x5d\\xaf\\x34\\xf9\\x9a\\x26\\x15\\xdc\\x76\\x94\\x52\\x37\\xf2\\x70\\xc1\\x0d\\xee\\x71\\x8d\\x53\\xb9\\x8a\\x91\\x60\\x97\\x92\\xa4\\x4b\\xc8\\x4e\\x31\\x01\\x9d\\x21\\xa1\\x24\\x1d\\x92\\x18\\x1a\\x1b\\x22\\x5c\\xb1\\x5d\\x2f\\x88\\x72\\xc7\\xf3\\xf9\\x07\\x4d\\x73\\xc5\\x49\\xf0\\x06\\xf6\\x9b\\x09\\x09\\xe1\\x49\\x87\\x95\\xe0\\x3e\\x19\\xe8\\x52\\xad\\x2a\\x69\\x4d\\x03\\xf1\\xd3\\xca\\x79\\x5e\\xb3\\x8c\\xaa\\x26\\x5b\\x48\\x13\\xcc\\x26\\xc7\\x4c\\xb9\\xfe\\xff\\xe9\\x1a\\xdb\\x80\\x75\\xf6\\x3f\\xe3\\x52\\xb8\\x1c\\xb3\\x99\\x5f\\xef\\x0e\\x7f\\x03\\xde\\x5b\\x1f\\x1c\\xf9\\x2a\\x93\\x30\\xab\\x8d\\x97\\xa5\\x27\\x37\\x01\\x00\\x1f\\xb6\\x4d\\xad\\x9b\\xfd\\xbc\\x75\\x63\\xf7\\xe2\\x07\\x33\\xf3\\xbf\\xbd\\xf5\\xf5\\xec\\xe4\\xbb\\x37\\x7b\\xb3\\x93\\xd7\\xc1\\xb1\\x08\\xff\\x00\\x47\\x6f\\xc3\\x07\\xdf\\xe9\\x1c\\x2e\\xaf\\xdd\\x98\\x9f\\x8c\\x97\\xb8\\x9b\\x03\\xb8\\x38\\x77\\xf4\\xd4\\xa5\\x35\\x7d\\x66\\xb2\\x79\\xd4\\xf9\\x11\\x3c\\xf1\\xf0\\xd2\\x01\\x70\\x5e\\x7b\\xe4\\xd6\\x95\\x47\\xff\\x9a\\x69\\x19\\x72\\xeb\\xab\\xe7\\xe6\\x76\\x7f\\x38\\x7b\\xd0\\xfb\\xa8\\x75\\xf8\\x38\\x3c\\x64\\xaf\\x75\\xef\\xcc\\x1e\\x64\\x2f\\xbe\\x77\\xfd\\xe6\\x27\\x3f\\x2d\\x2e\\x2c\\x5f\\x01\\xcf\\xfc\\xb2\\xe8\\xdc\\x01\\xe7\\xdf\\xfd\\xf8\\x78\\xe5\\x81\\xdb\\xab\\x97\\xaf\\xbe\\x3a\\x73\\xeb\\x9b\\xb5\\xfa\\xb9\\xc9\\xd3\\x73\\xc7\\xec\\x8a\\x7a\\xee\\xe2\\xe2\\xfb\\x03\\x70\\x86\\x03\\x9f\\x3d\\xb6\\xfc\\x3b\\xf9\\xf5\\xfa\\xa7\\xf9\\xee\\xb7\\xad\\x75\\xf3\\x4b\\xfd\\xf2\\xd5\\xbf\\x03\\x00\\x00\\xff\\xff\\x17\\x95\\x74\\x91\\x68\\x04\\x00\\x00\")\n\nfunc imagesBulletConnectionsPngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesBulletConnectionsPng,\n\t\t\"images/bullet-connections.png\",\n\t)\n}\n\nfunc imagesBulletConnectionsPng() (*asset, error) {\n\tbytes, err := imagesBulletConnectionsPngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/bullet-connections.png\", size: 1128, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesBulletDevices2Png = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x53\\x5f\\x68\\x1c\\x45\\x18\\x9f\\xa2\\xc4\\xd8\\x52\\xf5\\xa9\\x92\\x52\\xc3\\xb0\\xd5\\x6a\\xa8\\x77\\xbb\\xb3\\xb7\\x7f\\x6e\\x97\\xbb\\x4b\\xf7\\x76\\xef\\xda\\x83\\x6e\\x9a\\x6e\\x8e\\x36\\x45\\x10\\x37\\xbb\\xb3\\xb9\\x25\\xd9\\x9d\\x75\\x76\\x92\\xdb\\x9c\\x60\\x43\\xa9\\x4a\\xa1\\x18\\xab\\xa0\\xf8\\x20\\xd6\\x27\\x2b\\x8a\\xaf\\x2d\\x14\\xda\\xbe\\xd6\\x82\\x20\\x12\\x02\\x2a\\x08\\xea\\x9b\\x42\\x35\\x2f\\x5a\\x04\\x91\\x8d\\xb7\\x51\\xa4\\xe4\\xa1\\x1f\\x0c\\xcc\\x7c\\xfc\\x7e\\xbf\\xef\\xcf\\x7c\\xdf\\x85\\xe9\\xa9\\xa3\\x7b\\x77\\xef\\xdf\\x0d\\x00\\xd8\\xdb\\x39\\x66\\x39\\x00\\x80\\x3d\\xf9\\x19\\x1d\\x01\\x00\\x7c\\xf2\\x59\\xff\\x10\\x00\\x60\\x8c\\xb5\\x66\\xd9\\x0c\\x09\\x58\\xdf\\xa5\\x18\\x18\\x3e\\x99\\xc3\\xb0\\x13\\xb9\\xf3\\xd8\\xc1\\xae\\xbf\\xf2\\xf2\\x6d\\x5c\\x03\\xe0\\xa1\\x5e\\xd8\\x9d\\x65\\xb3\\xf6\\x71\\xdd\\x23\\x51\\xd9\\xcd\\x31\\xe5\\x2c\\x4a\\x40\\x6e\\xb5\\xc9\\x2c\\x71\\xbd\\x05\\xcc\\xe0\\x1c\\x9e\\x0f\\xe3\\x3a\\x77\\xf7\\xfa\\x4d\\x0e\\x86\\x7e\\x9d\\x3b\\x2d\\xdb\\x82\\x9d\\x98\\xb8\\x17\\x1e\\x1b\\x50\\x3c\\x33\\x98\\xea\\x7a\\x83\\x05\\x4f\\xf3\\xb9\\xc9\\x06\\xac\\x65\\x7a\\x16\\x25\\x11\\x66\\x2e\\xcc\\xa2\\xc5\\x38\\xd5\\xb3\\x3a\\xb7\\xa5\\xab\\xc7\\xa9\\x9e\\xbb\\x79\\x0e\\x6e\\x41\\xd8\\x42\\x9d\\xfb\\x27\\xa9\\x59\\x7b\\x1a\\x9a\\x84\\x62\\x28\\x97\\x2b\\x25\\x4f\\x40\\x08\\x2a\\x4a\\x19\\x49\\xb2\\xa2\\xa0\\xe7\\xa1\\x28\\x20\\x91\\x17\\x44\\x5e\\x50\\x4a\\x48\\xd2\\x65\\x45\\x17\\x55\\x38\\x34\\xae\\x01\\x6b\\xd4\\x0f\\x74\\xc7\\x6a\\x0f\\x63\\x51\\x3f\\xa8\\x73\\x3d\\xc6\\x12\\x9d\\xe7\\xfb\\xfd\\x7e\\xb9\\x5f\\x29\\x13\\x3a\\xcf\\x23\\x4d\\xd3\\x72\\x0d\\x51\\x2c\\x51\\x3f\\x28\\xa5\\x2b\\x31\\x73\\xb3\\x52\\x9c\\x1e\\x2c\\x14\\x2c\\x9c\\x7a\\x34\\x4c\\x58\\x48\\x62\\x98\\xbf\\xdd\\x39\\xb2\\xc4\\xea\\x1c\\x57\\x94\\x10\\x25\\xb6\\xbd\\x2d\\x1c\\xa7\\xc3\\x46\\x79\\x24\\xe2\\x33\\x37\\xe1\\x51\\x59\\xe0\\xa3\\x88\\x2f\\xd0\\x29\\x73\\x70\\xb0\\x33\\x3a\\xed\\xae\\x24\\x98\\x77\\x70\\x4a\\x96\\xa8\\x87\\x1d\\x1c\\x1c\\xfc\\x4f\\xa8\\x9d\\xa9\\x39\\x30\\xb1\\x6d\\xfd\\x04\\x0d\\xe7\\xc3\\xd8\\x5d\\xb4\\x88\\xb7\\x14\\xe1\\x98\\x75\\xac\\x3a\\x97\\x45\\x49\\xd9\\x0f\\x7d\\x5d\\x56\\x2b\\xaa\\xa6\\x55\\x2a\\x22\\x12\\x05\\xa5\\x8a\\x50\\xd5\\x50\\xac\\x96\\x2c\\x35\\x35\\xc5\\x90\\x9a\\xaa\\x54\\x29\\x34\\xee\\xc7\\x55\\xad\\x8a\\x8a\\x34\\x4d\\x50\\x65\\x4b\\x40\\xa8\\x25\\x55\\x25\\x55\\x6b\\x29\\x92\\xd9\\x54\\x2c\\x51\\x16\\x4c\\xa9\\xe0\\x76\\xe2\\x94\\xb9\\xb1\\x87\\x0b\\x6e\\xb8\\xcd\\xad\\xb6\\x77\\xe4\\xea\\x26\\xc5\\x2e\\x23\\xb4\\x4b\\xc8\\x62\\x31\\x01\\xd3\\x3d\\xc2\\x48\\xda\\x23\\x09\\x34\\x67\\x14\\xf8\\x9c\\xed\\x7a\\x61\\x9c\\x3b\\x26\\xf2\\x0f\\x1a\\xe6\\x8a\\x69\\xb8\\x8c\\xfd\\x36\\x25\\x11\\xdc\\xea\\xb0\\x1e\\xde\\x27\\x83\\xa6\\x52\\x95\\x54\\xa3\\x6d\\x22\\x71\\x58\\xb9\\x28\\x1a\\x2d\\x53\\x32\\xb4\\x16\\x32\\x64\\xab\\x2d\\x70\\x43\\xae\\xff\\x20\\x5d\\xe3\\x1b\\xb0\\xc6\\xff\\x6f\\x5c\\x0a\\x97\\x63\\xb5\\xf3\\xeb\\xf6\\xf0\\x37\\xe0\\xbf\\xeb\\x83\\x63\\xbf\\xce\\x51\\x6e\\xb2\\xb1\\xfc\\xe4\\xb7\\xa7\\x00\\x00\\xef\\x76\\x2c\\xa3\\x9b\\x7d\\x73\\xf1\\x2d\\xf4\\xd8\\xb9\\x23\\x4f\\xb4\\x1e\\x19\\xfc\\x72\\x91\\xd1\\x5d\\x77\\x3f\\x3a\\x70\\xeb\\xd3\\xd1\\x67\\x57\\x0f\\x27\\x0f\\xdb\\x8b\\xeb\\x3f\\x5e\\x56\\xa6\\xbf\\x3e\\xf3\\xdb\\x8d\\xb1\\xc3\\x3f\\x04\\x67\\x37\\x97\\xdf\\x79\\x5f\\xbd\\x7e\\xfb\\xe9\\x9f\\x37\\xd6\\x6b\\x2f\\x5c\\xb9\\x7c\\xfe\\xc0\\xc8\\x35\\x63\\xcf\\x89\\x47\\x2f\\xdc\\x79\\xe5\\xda\\x91\\xe0\\xce\\xf1\\xe4\\xfc\\xd1\\x2f\\x4e\\xde\\xba\\xb7\\xd6\\x7b\\x71\\xc3\\x7c\\xed\\xa7\\xfd\\xa7\\xf6\\xbd\\x39\\x32\\xf5\\xf6\\xe3\\xfb\\xde\\x73\\x36\\x0f\\x39\\x5f\\x3e\\xb3\\x76\\x69\\x13\\xde\\x1b\\x9f\\x38\\x7b\\xf5\\xab\\x3f\\x06\\xcd\\x93\\x37\\x2f\\x7d\\xf7\\xe7\\xf8\\xc7\\xab\\x57\\x5e\\xfd\\xf0\\xaf\\x1b\\xab\\x4f\\xb1\\x5f\\x5f\\x5f\\xfb\\xfe\\x83\\x8d\\xf5\\xab\\x67\\x56\\x77\\x81\\x89\\xd3\\xe3\\x63\\xa3\\x6f\\xfc\\xbe\\x94\\xef\\x7e\\xa7\\x35\\x65\\x7d\\xde\\x7c\\xe9\\xdc\\xdf\\x01\\x00\\x00\\xff\\xff\\xe9\\xee\\x70\\x38\\x68\\x04\\x00\\x00\")\n\nfunc imagesBulletDevices2PngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesBulletDevices2Png,\n\t\t\"images/bullet-devices-2.png\",\n\t)\n}\n\nfunc imagesBulletDevices2Png() (*asset, error) {\n\tbytes, err := imagesBulletDevices2PngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/bullet-devices-2.png\", size: 1128, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesBulletDevicesPng = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x53\\x5d\\x68\\xe4\\x54\\x14\\xbe\\x8b\\xa5\\x4a\\x65\\x44\\x64\\x51\\x5c\\x54\\xae\\x59\\x94\\x5d\\x70\\x26\\xb9\\x99\\xfc\\x4c\\xc2\\x64\\xda\\xcc\\x24\\xe3\\x0e\\x98\\x5a\\xa6\\x03\\x1d\\xfc\\xc1\\xa6\\xc9\\x9d\\x99\\xd0\\x26\\x37\\x26\\x77\\x76\\x32\\x7d\\x10\\xec\\x22\\xa2\\x28\\x15\\x74\\x45\\x04\\x59\\x7d\\x11\\x16\\x56\\x61\\x41\\xf1\\xa1\\xe0\\x56\\xc5\\xb2\\x8a\\xb0\\xf4\\x51\\x85\\x55\\xea\\xcb\\xae\\x88\\x83\\x3f\\x58\\x17\\x7c\\x90\\xd4\\xc9\\xae\\x48\\xe9\\x83\\x07\\x2e\\xdc\\x7b\\xf8\\xbe\\xef\\xfc\\xdc\\x73\\x5e\\x98\\x9b\\x7d\\x38\\x37\\x75\\x64\\x0a\\x00\\x90\\x6b\\x9c\\x30\\x9a\\x00\\x80\\x5b\\xd3\\x73\\xcb\\x24\\x00\\xe0\\xec\\xb9\\xc1\\x83\\x00\\x80\\xbb\\xa9\\xd9\\xa6\\xf3\\xa4\\x43\\x07\\x76\\x84\\x81\\xee\\x92\\x25\\x0c\\x1b\\xbe\\xdd\\xc5\\x4d\\x6c\\xbb\\xc3\\xa7\\xbf\\xc0\\x65\\x00\\x6e\\xea\\x79\\xad\\x36\\x6d\\x5b\\x8f\\xa8\\x0e\\xf1\\x0b\\x76\\x8a\\x29\\x24\\x7e\\x08\\x52\\x2b\\x4f\\x27\\xa1\\xed\\x2c\\x63\\x0a\\x97\\x70\\xd7\\x0b\\x34\\x66\\xb4\\x71\\x81\\x81\\x9e\\xab\\x31\\x0b\\xa2\\xc5\\x59\\x61\\x0d\\xf7\\xbc\\x13\\xab\\x11\\x9e\\x5f\\x9d\\x6d\\x39\\xab\\xcb\\x8e\\xe2\\x32\\xd3\\x15\\x58\\x4e\\xd4\\xc4\\x0f\\x7d\\x4c\\x6d\\x98\\xf8\\x2b\\x41\\xac\\x26\\x1a\\xb3\\xa7\\xab\\x06\\xb1\\x9a\\xba\\x59\\x06\\xee\\x41\\xe8\\xb2\\xc6\\xfc\\x93\\x54\\xdb\\x9a\\x83\\x35\\x12\\x61\\x28\\x16\\x8a\\x79\\x87\\x43\\x08\\x4a\\x52\\x01\\x09\\xa2\\x24\\xa1\\x87\\x20\\xcf\\x21\\x9e\\xe5\\x78\\x96\\x93\\xf2\\x48\\x50\\x45\\x49\\xe5\\x65\\x38\\x36\\xa6\\x02\\xcb\\x91\\xdb\\x51\\x9b\\x46\\x7d\\x1c\\x2b\\x72\\x3b\\x1a\\xd3\\xa3\\x34\\x54\\x59\\x76\\x30\\x18\\x14\\x06\\xc5\\x02\\x89\\xba\\x2c\\x52\\x14\\x25\\xd5\\xe0\\xf9\\x7c\\xe4\\x76\\xf2\\xf1\\x30\\xa0\\x76\\x92\\x0f\\xe2\\xa3\\x99\\x82\\x81\\x63\\x27\\xf2\\x42\\xea\\x91\\x00\\xa6\\x6f\\x7b\\x89\\xf4\\xa9\\xc6\\x30\\x59\\x09\\x7e\\x68\\x59\\xd7\\x85\\x83\\x78\\xdc\\x28\\x87\\xf8\\x6c\\x62\\x87\\x2c\\x2a\\x70\\xac\\xef\\xb3\\x19\\x3a\\xa6\\x4d\\xdc\\x39\\x18\\x1d\\xb7\\x86\\x21\\x66\\x9b\\x38\\x26\\xfd\\xc8\\xc1\\x4d\\xdc\\x39\\xfa\\xaf\\x50\\x07\\x53\\x53\\x60\\x68\\x59\\xea\\xa3\\x91\\xd7\\xf5\\x02\\x7b\\xc5\\x20\\x4e\\xdf\\xc7\\x01\\x6d\\x18\\x1a\\x93\\xf8\\x61\\xc1\\xf5\\x5c\\x55\\x94\\x8b\\xb2\\xa2\\x14\\x8b\\x3c\\xe2\\x39\\xa9\\x84\\x50\\x49\\x97\\x0c\\x53\\x14\\xaa\\x8a\\xa4\\x0b\\x55\\x59\\x28\\x66\\x1a\\xfb\\x71\\x4d\\x45\\xe2\\x75\\xbe\\x2e\\xca\\x62\\xad\\x84\\x90\\x29\\xe8\\x48\\x91\\x4d\\x24\\x57\\xab\\xd5\\x62\\x9d\\x2f\\xe9\\x72\\xc6\\x6d\\x04\\x31\\xb5\\x03\\x07\\x67\\x5c\\xef\\x06\\x57\\x38\\x90\\xab\\xd6\\x22\\x6c\\x53\\x12\\xb5\\x08\\x59\\xc9\\x26\\x60\\xae\\x47\\x28\\x89\\x7b\\x24\\x84\\xb5\\x79\\x09\\x1e\\xb3\\x6c\\xc7\\x0b\\x52\\xc7\\xf1\\xf4\\x83\\xc6\\xb9\\xe2\\xc8\\x3b\\x89\\xdd\\x7a\\x44\\x7c\\xb8\\xd7\\x61\\xd5\\xdb\\x27\\x83\\xaa\\x5c\\x12\\x64\\xbd\\x5e\\x43\\xfc\\xb8\\x72\\x9e\\xd7\\xcd\\x9a\\xa0\\x2b\\x26\\xd2\\x45\\xa3\\xce\\x31\\x63\\xae\\xfb\\x7f\\xba\\xc6\\x56\\x60\\x99\\xfd\\xcf\\xb8\\x64\\xae\\xa6\\x51\\x4f\\xaf\\xd7\\x87\\xbf\\x02\\x6f\\xac\\x0f\\x0e\\x5c\\x8d\\x89\\x98\\xe9\\x4a\\x49\\x7f\\xe7\\x35\\x00\\xc0\\x9b\\x0d\\x43\\x6f\\x25\\xdf\\xbc\\xb4\\x7d\\x3e\\xb7\\x36\\x73\\xf8\\xf9\\x5f\\xee\\x72\\xae\\x7c\\x70\\x7a\\xea\\xc9\\x4d\\xed\\x95\\x43\\x6f\\x3c\\x9b\\xdb\\xbc\\x3c\\xb1\\xb0\\x38\\x71\\xef\\xcc\\xd7\\x9f\\x6d\\xdd\\xb1\\x74\\x4a\\x7c\\xeb\\xf4\\x77\\xd3\\x43\\x3a\\x39\\x7a\\xe0\\xc2\\x13\\xbf\\xfe\\xbc\\xf1\\xe3\\xeb\\xd7\\x7e\\x73\\x2b\\x8f\\xb7\\x2e\\xde\\xee\\x6c\\xe6\\xba\\xbf\\x4f\\xdd\\x79\\xdf\\xbb\\xc9\\xdb\\x33\\x6b\\x17\\x2f\\x7d\\xba\\x7b\\xf5\\xf0\\x28\\xfc\\xe4\\xcb\\x67\\xd6\\xff\\x58\\xe8\\xbf\\xb8\\xde\\xfe\\xf6\\xaf\\x2b\\xfa\\xd9\\x3f\\x17\\xed\\x57\\x8f\\x5f\\x9e\\xd8\\x3a\\xbf\\x33\\x58\\x2c\\x1f\\xfb\\xf8\\xe6\\xad\\xf7\\x76\\x8e\\xfc\\x70\\x66\\x6e\\xf7\\xc3\\x9d\\xdb\\xae\\x7d\\x75\\x6a\\x7b\\xb4\\x71\\x75\\xfe\\xb1\\x9f\\xb6\\xbf\\x7f\\x6e\\xfd\\xcc\\xcb\\xa3\\x3e\\x79\\xea\\xd0\\x24\\xd8\\xfd\\xfc\\x9e\\x4b\\x27\\x3f\\xba\\xff\\x5c\\xba\\xff\\x0d\\x73\\xd6\\x78\\xbf\\xba\\xb8\\xf6\\x77\\x00\\x00\\x00\\xff\\xff\\xc6\\xeb\\x34\\xbb\\x6c\\x04\\x00\\x00\")\n\nfunc imagesBulletDevicesPngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesBulletDevicesPng,\n\t\t\"images/bullet-devices.png\",\n\t)\n}\n\nfunc imagesBulletDevicesPng() (*asset, error) {\n\tbytes, err := imagesBulletDevicesPngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/bullet-devices.png\", size: 1132, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesDeletePng = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x00\\x3e\\x03\\xc1\\xfc\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a\\x00\\x00\\x00\\x0d\\x49\\x48\\x44\\x52\\x00\\x00\\x00\\x12\\x00\\x00\\x00\\x12\\x08\\x06\\x00\\x00\\x00\\x56\\xce\\x8e\\x57\\x00\\x00\\x03\\x05\\x49\\x44\\x41\\x54\\x38\\xcb\\x63\\x60\\xc0\\x01\\xba\\x7b\\x7a\\xac\\x03\\x83\\x83\\x6b\\x2d\\xac\\xac\\xe6\\x1b\\x99\\x98\\xcc\\x8f\\x8a\\x8e\\xee\\xe9\\xe9\\xed\\x75\\xaf\\xad\\xaf\\x67\\x66\\x20\\x06\\xcc\\x9e\\x33\\xc7\\xdf\\xda\\xc6\\x66\\xaf\\x90\\x88\\xc8\\x5f\\x06\\x26\\xa6\\xff\\x60\\xcc\\xcc\\xfc\\x1f\\x28\\xf5\\x5f\\x50\\x58\\xf8\\xbf\\xaa\\xba\\xfa\\xf1\\xaa\\x9a\\x9a\\x50\\xbc\\x86\\x74\\x76\\x75\\x75\\xf1\\xf0\\xf0\\x80\\x35\\x31\\xb2\\xb0\\xfc\\x67\\x61\\x67\\x47\\xc1\\x20\\x31\\x90\\x1c\\x07\\x27\\xe7\\xff\\xf4\\xcc\\xcc\\x55\\xdf\\xbf\\x7f\\xe7\\xc2\\x30\\x64\\xc2\\xa4\\x49\\xdd\\x20\\x45\\x60\\xdb\\x19\\x19\\xc1\\x2e\\xc1\\x65\\x10\\x8c\\xce\\x2f\\x2c\\x5c\\x8b\\x62\\xc8\\xc1\\x83\\x07\\xdd\\x39\\xb9\\xb9\\xe1\\x5e\\x70\\xf7\\xf4\\xdc\\xaf\\x6b\\x60\\x70\\x17\\xc4\\x86\\x19\\x02\\x32\\x5c\\x5e\\x49\\xe9\\xae\\xaf\\x9f\\xdf\\x7e\\x90\\x38\\x13\\xd4\\xb0\\x85\\x8b\\x16\\x65\\x82\\x0d\\x39\\x7a\\xec\\x18\\xa3\\x85\\xb5\\xf5\\x15\\xb0\\x4d\\x40\\xc5\\x7e\\x01\\x01\\x5b\\x40\\xe2\\x73\\xe6\\xce\\x55\\x51\\x52\\x51\\x79\\x01\\x76\\x25\\xd0\\x75\\xa2\\x12\\x12\\x2f\\xa2\\x63\\x63\\x55\\x40\\x72\\x31\\x71\\x71\\x87\\xc0\\xae\\x06\\xca\\xa9\\x69\\x6a\\xbe\\xbb\\x7e\\xe3\\x06\\x0f\\xc3\\xe6\\x2d\\x5b\\x8c\\xb9\\xf9\\xf8\\x7e\\x33\\xb1\\xb2\\x82\\x0d\\x0a\\x0a\\x09\\xd9\\x7b\\xf5\\xea\\x55\\x41\\x90\\x86\\x19\\x33\\x67\\x6a\\x2a\\x2a\\x2b\\xbf\\x01\\x06\\xfc\\x9b\\xd0\\x88\\x08\\x4d\\x90\\xd8\\xb7\\x6f\\xdf\\x04\\x23\\x22\\x23\\x4f\\x83\\xd4\\x32\\xb3\\xb1\\xfd\\x67\\x06\\xba\\xac\\xa6\\xae\\x2e\\x98\\xa1\\xa4\\xac\\xac\\x11\\x64\\x3a\\xdc\\x0b\\x40\\x5b\\xfc\\x03\\x02\\x8e\\x5d\\xbb\\x7a\\x55\\x04\\xa4\\x71\\xca\\xd4\\xa9\\xfa\\x11\\x51\\x51\\x3a\\x20\\xf6\\xcf\\x9f\\x3f\\x45\\x12\\x12\\x13\\x8f\\xa1\\x78\\x19\\xc8\\x8e\\x8a\\x89\\x99\\xc3\\x90\\x92\\x96\\xb6\\x0d\\x59\\x02\\x26\\xe9\\xed\\xeb\\x7b\\xf6\\xc2\\x85\\x0b\\x92\\xb0\\x70\\xfc\\xf8\\xf1\\xa3\\x64\\x64\\x74\\xf4\\x59\\x74\\xb5\\xa0\\xb0\\x12\\x93\\x94\\x5c\\xce\\x90\\x98\\x9c\\xbc\\x0f\\xc3\\x20\\xa0\\x0b\\x05\\x45\\x44\\x5e\\xe7\\xe4\\xe5\\xa9\\xc2\\x0c\\x5a\\xb5\\x66\\x8d\\xaa\\xac\\x82\\xc2\\x6b\\x6c\\x06\\xc9\\xc8\\xc9\\xad\\x63\\x00\\xc6\\x50\\x27\\x72\\x54\\x83\\x0c\\x11\\x97\\x92\\x7a\\x14\\x1c\\x1a\\xaa\\x07\\x32\\xe0\\xd9\\xb3\\x67\\x7c\\xe7\\xcf\\x9f\\xe7\\x03\\xb1\\xa7\\x4e\\x9b\\xa6\\x07\\x4c\\x90\\x8f\\x90\\x0d\\x63\\x04\\xea\\x05\\xa6\\xfc\\x85\\x0c\\x13\\x26\\x4e\\xf4\\x63\\xe3\\xe0\\x00\\x07\\x1c\\xc8\\x74\\x29\\x19\\x99\\xab\\xc0\\x00\\xd7\\x06\\x69\\xfc\\xfb\\xe7\\x8f\\x00\\xd0\\x3b\\x17\\x3c\\xbd\\xbd\\x2f\\xdc\\xb8\\x71\\x43\\x00\\x24\\x36\\x69\\xf2\\x64\\x6d\\x55\\x35\\xb5\\x7b\\x4c\\xc0\\xa4\\x02\\x0b\\x86\\xea\\xda\\xda\\x2a\\x86\\x9b\\x37\\x6f\\x72\\x29\\xa9\\xaa\\x82\\x9d\\x0c\\x72\\x4d\\x78\\x64\\xe4\\x7c\\x90\\x06\\x60\\xaa\\xe5\\x8b\\x4d\\x48\\x38\\x0d\\x16\\x07\\x62\\x60\\xfa\\x39\\x7d\\xed\\xda\\x35\\xb0\\xcb\\x32\\xb2\\xb2\\x36\\x81\\x93\\x0b\\xd0\\x30\\x21\\x51\\xd1\\x5f\\xeb\\xd6\\xaf\\x97\\x05\\xfb\\xbf\\xab\\xbb\\xbb\\x0e\\x9c\\xc8\\x80\\x49\\x80\\x0b\\x98\\x30\\xfb\\xfa\\xfb\\xa7\\x02\\xc3\\x07\\x1c\\x76\\x20\\x97\\xc2\\x6c\\x06\\xa6\\xa3\\x7d\\xd3\\xa6\\x4f\\x9f\\xca\\xc9\\xc5\\xf5\\x9f\\x19\\xa8\\x16\\x24\\x96\\x9e\\x91\\xb1\\x08\\x25\\x75\\x07\\x04\\x05\\x9d\\x86\\x19\\x06\\xce\\xa8\\xa0\\x24\\x01\\x35\\x04\\x39\\xfc\\x40\\x72\\x4c\\x50\\x43\\x8c\\x4c\\x4d\\x1f\\xbc\\x7e\\xfd\\x9a\\x0f\\xc5\\x20\\x60\\xa0\\xca\\x39\\xb9\\xba\\x5e\\x87\\xe5\\x25\\x66\\x34\\x43\\xd0\\xf3\\x1b\\x30\\xd0\\x9f\\xdd\\xba\\x7d\\xdb\\x02\\x6b\\xee\\x3f\\x7b\\xf6\\x2c\\x0f\\xb0\\xdc\\x59\\xc8\\xcd\\xc3\\xf3\\x15\\x6c\\x3b\\x10\\x83\\x34\\x82\\x35\\x43\\xb3\\x04\\x0f\\x1f\\xdf\\x5f\\x17\\x37\\xb7\\x35\\xad\\x6d\\x6d\\x22\\x04\\xcb\\xa4\\xfc\\x82\\x02\\xa5\\xd8\\xf8\\xf8\\x7a\\x1d\\x5d\\xdd\\xb5\\x72\\x8a\\x8a\\xfb\\x24\\x65\\x64\\xf6\\x19\\x9b\\x98\\x6c\\xf5\\xf0\\xf6\\x6e\\x2f\\x28\\x2a\\xd2\\xc6\\xa6\\x07\\x00\\x50\\xd8\\x60\\x02\\xfe\\x46\\x33\\x06\\x00\\x00\\x00\\x00\\x49\\x45\\x4e\\x44\\xae\\x42\\x60\\x82\\x01\\x00\\x00\\xff\\xff\\x3a\\x61\\xd7\\x35\\x3e\\x03\\x00\\x00\")\n\nfunc imagesDeletePngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesDeletePng,\n\t\t\"images/delete.png\",\n\t)\n}\n\nfunc imagesDeletePng() (*asset, error) {\n\tbytes, err := imagesDeletePngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/delete.png\", size: 830, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesDevicesImage2Png = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x94\\x7d\\x4c\\x13\\xf7\\x1f\\xc7\\xbf\\x3e\\xfc\\xea\\x0f\\x8d\\x82\\x3f\\x84\\xe4\\x47\\x50\\x2f\\x47\\x54\\x36\\x69\\xaf\\xd7\\x5e\\xaf\\xed\\xd9\\x03\\xfb\\x38\\x4b\\x2c\\xd4\\x52\\x27\\x51\\xa7\\x9e\\xed\\x95\\x56\\xbd\\xbb\\x72\\x77\\xac\\x0f\\x9a\\xa9\\x88\\x9d\\x86\\xf9\\x40\\x60\\xb8\\xc5\\x29\\x45\\x98\\xd3\\x66\\xa9\\x61\\x53\\xe7\\x22\\x88\\x0f\\x80\\x4f\\x73\\x1a\\x67\\x7c\\xda\\x50\\xe6\\x73\\x74\\x6a\\xa2\\x6e\\xc6\\x01\\x73\\xa9\\xa3\\xba\\x2c\\xc6\\x3f\\xf6\\xfd\\xeb\\xee\\x93\\xf7\\xeb\\xfd\\x79\\xb8\\xcf\\x7d\\xd7\\xda\\x8b\\xde\\x19\\x39\\x3c\\x6b\\x38\\x00\\x60\\xa4\\x75\\x9a\\xc9\\x01\\x00\\x18\\x0b\\x00\\xc8\\xfe\\xaf\\x04\\x00\\xb0\\xe5\\xf4\\xee\\x18\\x00\\xe0\\xff\\xa2\\xb9\\x54\\x2c\\xe1\\x3c\\x62\\x80\\xe2\\x69\\xa0\\x77\\x73\\x0b\\x69\\xc8\\xca\\x50\\x65\\xb4\\x83\\xa6\\xdc\\xa1\\xf2\\xe3\\xb4\\x0e\\x80\\x21\\x5e\\x9f\\xb3\\x54\\x2c\\xb5\\x4d\\x27\\x5c\\x1c\\x23\\xa3\\x12\\x1a\\x59\\x90\\xf1\\x83\\xc4\\xd1\\x15\\x04\\xfd\\x94\\x6b\\x31\\x2d\\x42\\x0b\\xe9\\x32\\x1f\\x4b\\xc2\\x0f\\xf7\\xb7\\xc3\\x90\\xcf\\x4d\\xc2\\xb3\\x54\\x36\\xb9\\xcd\\x6f\\xa4\\xbd\\xbe\\x69\\x61\\x9e\\x2e\\x09\\x17\\x39\\x5d\\xe1\\xc5\\x2e\\xad\\x1b\\x2e\\xc8\\x87\\x74\\x41\\x22\\xc8\\xf8\\x19\\x5a\\xa4\\xa0\\x20\\xb3\\x84\\x15\\x88\\x20\\x09\\xbf\\xf0\\x25\\x58\\x81\\x48\\x84\\x11\\x18\\x7a\\x21\\x11\\x17\\x93\\xf0\\x5f\\x45\\x95\\xda\\xec\\x90\\x91\\xe3\\x69\\x48\\x25\\x53\\x4a\\x5d\\x72\\x14\\x85\\x70\\x5c\\x86\\x62\\x2a\\x1c\\x47\\xf3\\x20\\x85\\x1c\\x55\\x20\\x72\\x05\\x22\\xc7\\xa5\\x28\\x46\\xa8\\x70\\x42\\xa1\\x86\\x06\\x0e\\x9c\\x0f\\xe9\\x78\\xb7\\x87\\x70\\x98\\x2c\\x03\\xb9\\x78\\xb7\\x87\\x84\\xbd\\xa2\\xe8\\x27\\x10\\x24\\x10\\x08\\xc8\\x02\\x4a\\x19\\xc7\\x97\\x21\\xa8\\x56\\xab\\x4d\\x78\\x28\\x14\\x52\\xde\\xed\\x91\\x0a\\x21\\x56\\xa4\\x82\\x52\\x56\\xc8\\x49\\x3a\\x98\\x68\\xc1\\xc5\\xfb\\xfc\\xa2\\x8f\\x63\\xa1\\xc4\\x3b\\xb5\\x90\\xab\\x10\\x49\\x18\\x4e\\xb6\\xc0\\xf8\\x6d\\xb6\\x97\\xc6\\xac\\x30\\x30\\x28\\x17\\xc7\\x20\\x41\\xca\\x8f\\xa0\\x32\\x39\\xc2\\x30\\x48\\x52\\x2d\\x88\\x0e\\xda\\xf3\\x66\\xb5\\xe0\\x0c\\xf9\\x69\\xc4\\x41\\x0b\\x5c\\x05\\xef\\xa2\\x1d\\xb4\\x27\\xe7\\x6f\\xa9\\xde\\x8c\\x26\\x84\\x7e\\x9b\\x8d\\x28\\xe6\\x7d\\x65\\x3e\\x96\\x5a\\x62\\xe2\\x5c\\x15\\x0c\\xcd\\x8a\\x56\\x13\\x09\\x07\\x19\\xbf\\xcc\\xed\\x73\\x13\\x2a\\xb5\\x52\\xad\\xd5\\x2a\\x95\\x0a\\x54\\x21\\xc7\\x35\\x28\\xaa\\xd1\\xe3\\x26\\xb3\\x0a\\x33\\x68\\x71\\x3d\\x66\\x50\\x63\\xca\\xa4\\xc7\\xeb\\x58\\xb5\\x49\\xa5\\xb1\\x28\\x0d\\x2a\\xb5\\xca\\x24\\x47\\x51\\x33\\xa6\\xc1\\xd4\\x5a\\x33\\x8e\\x19\\x0d\\xb8\\x49\\xa1\\x92\\x1b\\xb1\\x24\\x6b\\x65\\x05\\x91\\x62\\x5d\\x74\\x92\\xf5\\xbd\\x62\\xb1\\x37\\xb2\\x84\\x91\\xa7\\x29\\x91\\xe3\\x9d\\x1c\\xb7\\x24\\xb9\\x01\\x76\\x2f\\x27\\x72\\x82\\x97\\xf3\\x43\\xc6\\x12\\x1c\\xca\\xb5\\x51\\x2e\\x1f\\x9b\\x08\\xbc\\x95\\xf8\\x40\\x03\\xb5\\xd2\\xbc\\xef\\x7d\\xda\\x6d\\xe1\\x39\\x06\\x7a\\x31\\x61\\xc2\\xf7\\x9a\\x0a\\x0c\\xb8\\x06\\x53\\xeb\\x2d\\x46\\x54\\x31\\xd0\\xb9\\x42\\xa1\\x37\\x1b\\x31\\xbd\\xd6\\x8c\\xea\\x55\\x26\\x8b\\x1c\\x1e\\x60\\xdd\\xff\\x66\\x6a\\x48\\x3e\\xa4\\x43\\xfe\\xb1\\x2e\\xc9\\x90\\xc3\\x64\\x49\\x3c\\xbe\\x5c\\xfe\\x7c\\xe8\\xd5\\xef\\x43\\xb3\\x6e\\x12\\xe6\\xe1\\x82\\xfc\\xda\\x53\\xbf\\xef\\x03\\x60\\x30\\x6a\\x35\\xe9\\x9d\\xc1\\xcb\\xad\\xf5\\xf3\\x73\\x8d\\x33\\xb2\\x8f\\xee\\x62\\x0a\\xbf\\x0c\\x41\\x8b\\x72\\x53\\x6b\\x27\\xd0\\x8d\\xad\\x6b\\xce\\x9d\\xff\\xee\\x24\\xab\\xfb\\xe5\\xbd\\xd0\\xd3\\xc2\\xc2\\xc2\\x79\\xe4\\xa3\\x8e\\xa6\\x49\\x78\\x6a\\x73\\x5e\\x68\\xc6\\xbc\\x5b\\xc5\\xf5\\x13\\xc7\\x55\\xed\\x1c\\x99\\x9a\\x79\\xb6\\xf9\\x5e\\xef\\xc9\\xe2\\xee\\x78\\xf7\\x7e\\xe5\\xd8\\x29\\xbf\\xde\\x0f\\x7c\\xf3\\xb8\\xad\\xfd\\x34\\xf9\\xe3\\xc3\\xbe\\x07\\x3b\\xcf\\x60\\xb6\\xc6\\xd1\\xd5\\x9d\\x97\\xd3\\x3c\\xd1\\xd1\\x3b\\xc6\\x85\\xab\\xf6\\x36\\x86\\x66\\xce\\x44\\x32\\xd6\\x36\\x55\\x46\\xc1\\xa8\\xeb\\xe1\\xb1\\x31\\x59\\x4f\\x68\\x55\\x17\\xb8\\x52\\x23\\x59\\x67\\x69\\x92\\xae\\xb9\\xbd\\xf1\\x87\\xc3\\x4f\\x07\\x57\\x80\\x65\\x93\\x87\\x2c\\x5a\\x35\\xb1\\x1a\\x64\\x6c\\x6d\\xa8\\xdb\\xe3\\xa8\\x94\\x0c\\x6d\\x1b\\xf4\\xa9\\x7d\\x53\\xf4\\xc2\\x84\\xf4\\x30\\x7c\\x87\\xac\\x49\\xd9\\x12\\xe1\\xcd\\xcb\\xb4\\xbf\\x1d\\x5f\\xb9\\x0d\\xde\\xc9\\xf7\\xdb\\xcf\\x77\\x18\\xaf\\xf6\\x5e\\x9a\\xc4\\x35\\xf0\\x82\\xd7\\x1c\\x6d\\xbb\\x18\\xdf\\xdc\\xbe\\x22\\x32\\xa8\\xb5\\xfe\\x4a\\xf6\\x07\\x92\\x83\\x6c\\x55\\xce\\x8e\\xd1\\x27\\xa6\\x92\\x60\\x7b\\xc6\\xf1\\x23\\xdb\\x9f\\x83\\x83\\xe4\\x61\\x78\\xf9\\xdc\\xbe\\xd4\\x1e\\x24\\x77\\x03\\x69\\xcc\\x1b\\xf1\\x24\\x72\\x9d\\xd1\\x36\\x86\\xd6\\x8f\\xbf\\x59\\x85\\x0b\\xe2\\xa6\\x74\\xa2\\xa3\\xe5\\x79\\x7b\\xb4\\x4b\\x7a\\x5d\\xaf\\x59\\x91\\x05\\xc5\\x7e\\x62\\x9d\\xfe\\xbd\\xe7\\x9a\\x8f\\x19\\xe7\\xb0\\xc3\\xef\\x5e\\x63\\x33\\x3f\\x7c\\xb7\\xe6\\x5e\\xe7\\xc5\\x6c\\x49\\x1a\\x1e\\x25\\xba\\xfb\\x53\\xbc\\x69\\xb7\\x2e\\xfc\\x6f\\xc5\\x93\\x9e\\x5e\\x7b\\x2d\\x75\\xf7\\xc1\\xd2\\x59\\xb1\\xb5\\x0d\\xb5\\x47\\x34\\x07\\x4a\\x23\\x6f\\x8f\\xb8\\xd1\\x28\\xcb\\x88\\x68\\x11\\xd0\\x3c\\x2c\\xbf\\x4a\\x37\\xb1\\x7e\\xd8\\xec\\xb6\\xee\\xdb\\x8f\\x57\\x97\\xb7\\x48\\x2e\\xd9\\x3e\\xaa\\x8b\\xaa\\x3f\\x2e\\x64\\xc2\\x6d\\x57\\x5a\\xff\\x73\\xa6\\xb3\\x2c\\x26\\xab\\xbe\\x1d\\x5b\\x19\\xbb\\xb3\\x8f\\x8f\\x54\\x17\\xad\\x9c\\xbf\\x3e\\xeb\\x8f\\xbc\\xdd\\xd5\\x33\\x0b\\xee\\x2d\\xd8\\xd3\\x57\\xd9\\xd0\\x94\\xb3\\x6e\\xea\\x56\\x4c\\xbf\\xa7\\x60\\x4c\\x4f\\x7a\\xc3\\xe6\\xcf\\x22\\x59\\x69\\x59\\xa3\\xe2\\xb2\\x9a\\x92\\x43\\x53\\x76\\x1b\\x26\\xaf\\x8e\\x8b\\xf6\\xd4\\x5d\\x75\\x77\\xb7\\x15\\x42\\xc5\\xdf\\x1f\\xba\\xa9\\x9b\\xdd\\xf1\\xc9\\xcf\\x81\\x45\\x5f\\x1d\\x9c\\xfb\\xa8\\x77\\xd6\\x7a\\x69\\x79\\xbc\\x0b\\xfe\\xf6\\xda\\xb9\\xec\\xcc\\x68\\xf1\\x88\\x74\\x66\\xd3\\xc6\\x14\\xfb\\xf3\\xc8\\xb6\\x67\\x69\\xbd\\xa7\\x24\\xe5\\x99\\x77\\x6e\\x4c\\x5d\\x5a\\x7e\\x78\\xe8\\xf4\\x7e\\xf5\\xe0\\xd3\\x2d\\xc7\\x96\\x77\\x1e\\x58\\x63\\xbd\\xba\\xbd\\x2f\\xbd\\xe3\\xeb\\x96\\x50\\x46\\xe3\\x86\\xcd\\x43\\xfa\\x8f\\x3a\\xe7\\x7e\\x61\\x4f\\x13\\xe6\\x7c\\x3e\\x26\\xa5\\x77\\xd5\\xb2\\xf6\\xae\\x67\\xb9\\xdc\\x78\\xa1\\x0e\\x19\\x24\\x01\\x67\\x27\\xec\\xbf\\x1f\\x77\\x9d\\xb8\\x91\\xb8\\x96\\xad\\xe6\\x22\\x53\\xdc\\xb0\\xa0\\xf2\\xcf\\x00\\x00\\x00\\xff\\xff\\xd3\\x5d\\x7b\\x19\\x03\\x06\\x00\\x00\")\n\nfunc imagesDevicesImage2PngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesDevicesImage2Png,\n\t\t\"images/devices-image-2.png\",\n\t)\n}\n\nfunc imagesDevicesImage2Png() (*asset, error) {\n\tbytes, err := imagesDevicesImage2PngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/devices-image-2.png\", size: 1539, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesDevicesImagePng = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x94\\x7d\\x50\\x14\\xf5\\x1f\\xc7\\xbf\\xa0\\xde\\x29\\xfe\\x44\\x7e\\x02\\xfe\\x94\\xdf\\xd9\\xad\\xeb\\x53\\x66\\x77\\x7b\\xbb\\xf7\\xb0\\x77\\x1b\\x07\\xec\\x3d\\xc1\\xa5\\xe7\\xc1\\x71\\x0c\\x94\\x66\\x2d\\x77\\x0b\\xb7\\xc2\\x3e\\xb8\\xbb\\x74\\x0b\\x93\\x0f\\x63\\x2a\\x3e\\x65\\xa6\\xd2\\x58\\x60\\xc3\\x99\\xcc\\x50\\x96\\xcd\\x14\\x14\\x1a\\xa6\\xa1\\x96\\x98\\x24\\x3a\\x4e\\x53\\xce\\xe8\\x8c\\x63\\x6a\\xe1\\x63\\x88\\x89\\x0d\\x3a\\xcd\\x19\\xa7\\x4d\\xe3\\xf8\\x47\\xdf\\xbf\\x76\\x3f\\xf3\\x7e\\xbd\\x3f\\x0f\\xfb\\xd9\\xef\\xba\\xc2\\xf9\\xf9\\xe3\\x52\\xb2\\x52\\x00\\x00\\xe3\\xbc\\x05\\xae\\x00\\x00\\x60\\x0a\\x00\\x40\\x33\\x5a\\x05\\x00\\xd8\\x71\\xa2\\xed\\x43\\x00\\xc0\\x64\\xd9\\x5d\\x26\\x17\\xf3\\x15\\x72\\x94\\x12\\x69\\x40\\x86\\xf9\\x72\\x1a\\xf2\\xb2\\x54\\x25\\x1d\\xa0\\xa9\\x70\\xed\\x92\\x6e\\x3a\\x1b\\x80\\x11\\x11\\x26\\x58\\x26\\x97\\xf9\\xe6\\x11\\x21\\x9e\\xd5\\x53\\x71\\x8d\\x5e\\x61\\x05\\x10\\x3f\\xd9\\xb9\\x8a\\x40\\x85\\xaa\\x68\\x19\\x2a\\xa7\\x2b\\x19\\xce\\x0e\\xdf\\xf8\\xf2\\x00\\x0c\\x31\\x61\\x3b\\x5c\\x6a\\xf6\\x19\\x7c\\x82\\x93\\x8e\\x30\\x05\\x75\\x22\\x5d\\x5c\\x37\\x3f\\x18\\xaa\\xab\\x0a\\xd9\\xc2\\x70\\x6e\\x0e\\x94\\xad\\x10\\x0a\\x2b\\xb0\\xb4\\x4c\\x41\\x0a\\x5b\\xcd\\x49\\x84\\x62\\x87\\x1f\\xf8\\x12\\x9c\\x44\\xc4\\xc3\\x08\\x0c\\x3d\\x90\\xc8\\x55\\x76\\xf8\\xaf\\xa2\\xca\\x7c\\x85\\x90\\x93\\x17\\x69\\xc8\\xac\\x37\\xea\\x42\\x06\\x14\\x85\\x2c\\x16\\x3d\\x6a\\x32\\x5b\\x2c\\xe8\\xb3\\x10\\x66\\x40\\x31\\xc4\\x80\\x21\\x06\\x8b\\x0e\\x35\\x11\\x66\\x0b\\x81\\xe1\\xd0\\xf0\\x81\\x73\\xa0\\x6c\\x31\\x5c\\x41\\x04\\x5c\\x9e\\xe1\\x5c\\x62\\xb8\\xc2\\x0e\\x47\\x64\\x59\\x20\\x10\\x24\\x1a\\x8d\\xea\\xa3\\x46\\x3d\\x2f\\x56\\x22\\xa8\\xcd\\x66\\x8b\\x7b\\x60\\x98\\x4e\\x0c\\x57\\xe8\\xa4\\x5a\\x4e\\xa6\\x14\\x1d\\x27\\x4d\\x4b\\x38\\xb8\\x68\\x29\\x24\\x32\\x82\\xcc\\xf0\\x1c\\x14\\x7f\\xa7\\xca\\xf9\\x1a\\xd9\\x0e\\xc3\\x89\\x16\\x58\\xc1\\xe7\\x7b\\x68\\xcc\\x49\\xc3\\x83\\x0a\\xf1\\x2c\\xa2\\x50\\x02\\x82\\xea\\x0d\\x08\\xcb\\x22\\x09\\xb5\\x24\\x07\\xe8\\x8a\\x27\\xab\\xa5\\x60\\xad\\x40\\x23\\x01\\x5a\\xe2\\x6b\\xc4\\x10\\x1d\\xa0\\x2b\\xa6\\xfd\\x2d\\xd5\\x93\\xd1\\xb8\\x50\\xf0\\xf9\\x08\\xbf\\xc8\\x54\\x32\\x1c\\x55\\xed\\xe2\\x43\\x35\\x2c\\xcd\\xc9\\x5e\\x97\\x1d\\x56\\x58\\x41\\x1f\\x66\\xc2\\x84\\x19\\x37\\xe2\\x36\\x9b\\xd1\\x88\\xa1\\x98\\xc1\\x62\\x45\\x51\\x2b\\x69\\x71\\xb9\\xcd\\x26\\x87\\xcd\\x42\\x9a\\x1c\\xb8\\xc9\\x98\\xf0\\x78\\x1c\\xeb\\x26\\x0d\\x2e\\x17\\x66\\xf2\\xe0\\x66\\xa7\\x15\\x45\\xdd\\x26\\x12\\xb5\\xe1\\x6e\\x14\\x77\\x38\\x1c\\x46\\x0f\\x66\\x25\\xf1\\x04\\xeb\\xe5\\x24\\x99\\xe2\\x42\\x74\\x82\\x65\\x1e\\xb1\\xee\\x27\\xb2\\x84\\x53\\xa4\\x29\\x99\\x17\\x83\\x3c\\x5f\\x9d\\xd8\\x80\\xc2\\x08\\x2f\\xf3\\x52\\x84\\x17\\x20\\x67\\xb1\\x05\\x7a\\xda\\x47\\x85\\x18\\x2e\\x1e\\x98\\x1d\\xff\\x40\\xc3\\xb5\\xd2\\x22\\xf3\\x2a\\x1d\\xf6\\x88\\x3c\\x0b\\x3d\\x98\\x30\\xc1\\x3c\\xa6\\x02\\x07\\x6e\\x35\\xe1\\xa4\\xc7\\x89\\x62\\xc3\\x9d\\x63\\x18\\xe9\\x76\\x9a\\x48\\x9b\\x1b\\x25\\xcd\\x2e\\x8f\\x01\\x1e\\x66\\xc3\\xff\\x66\\x6a\\x48\\x0e\\x94\\x8d\\xfc\\x63\\x5d\\x12\\xa1\\x80\\xcb\\x13\\x7f\\x7c\\xb8\\xfc\\x39\\xd0\\xa3\\xdf\\x87\\xe6\\xc2\\x76\\x58\\x84\\x73\\x73\\xc6\\x8f\\x69\\xad\\x01\\x20\\x79\\x86\\xd7\\x45\\x06\\x95\\x33\\x9d\\x6f\\xf7\\xcc\\x4d\\x2e\\xca\\x38\\x92\\x8f\\xae\\x4d\\x5b\\x90\\x31\\xa6\\xa5\\xb7\\x2b\\x0d\\x1e\\xbd\\x78\\x2a\\x99\\xf1\\xd6\\xce\\x76\\x34\\x45\\xd4\\x76\\x44\\x17\\x8c\\xfc\\xef\\xaa\\x05\\xa5\\x45\\xbb\\x87\\xc6\\xa6\\xe0\\x4b\\xf3\\x26\\xb2\\x2b\\x2d\\x0d\\x45\\xae\\xc0\\x86\\xa3\\xff\\x69\\x7b\\x71\\x7a\\x66\\xd1\\x61\\x59\\xbf\\x90\\xda\\xae\\xb9\\x3c\\x19\\xd1\\x6a\\xae\\x5b\\x6f\\x1c\\xbf\\xd7\\xb3\\xf1\\xce\\xd9\\xda\\x89\\x25\\x25\\x99\\x59\\xd7\\xf7\\x57\\xff\\xaf\\x2b\\xdb\\x94\\xda\\xee\\xf0\\xf7\\x4e\\x6c\\xdb\\xf6\\xff\\xdb\\x8b\\xe6\\x4c\\xa8\\x5f\\xdd\\x0c\\xd6\\x08\\x9d\\xa9\\xe6\\x92\\x9b\\x9d\\xce\\x62\\x70\\xa3\\xe0\\xf5\\x7d\\xa7\\x4a\\xb9\\xc3\\x73\\x8f\\x2e\\x3a\\x72\\x27\\xa5\\x66\\x44\\xd3\\xd6\\xa4\\x76\\x07\\x9a\\xde\\xdc\\x75\\x0b\\x7d\\xc1\\xff\\x7c\\xef\\x8a\\x66\\x1c\\x4a\\xef\\x4b\\x1b\\x20\\xc2\\x0e\\xe3\\xca\\x73\\x1b\\xe7\\xfd\\xa2\\x09\\x62\\xbf\\x35\\xfc\\x38\\x4b\\xbd\\x7e\\xfd\\xae\\x63\\xb7\\x9d\\xee\\x11\\xe3\\x77\\xdc\\xf9\\xcc\\x7f\\x8e\\xb8\\x78\\xa9\\x77\\x5d\\x5e\\xd5\\xc9\\xdd\\xef\\x9c\\x70\\x4c\\x05\\x7c\\x0b\\x5e\\xdf\\x0f\\x3a\\xa6\\x9c\\x1f\\x29\\x3a\\x46\\xb5\\x6a\\x0f\\x76\\xc2\\xb5\\x65\\xed\\xb9\\x40\\xc9\\x2b\\xb8\\x79\\xe2\\xf0\\x72\\xb0\\x9c\\xac\\xbd\\x7a\\xa5\\xfc\\xa5\\xe6\\xe8\\x45\\xf5\\x27\\xb3\\x06\\xb6\\x5e\\x28\\xb5\\xc7\\xf4\\x9b\\xae\\xdd\\x5e\\xb5\\x49\\xd0\\x0c\\x21\\xad\\xcb\\xba\\x95\\xb4\\xd4\\x98\\x65\\xed\\x33\\x5f\\x8c\\xcf\\x5c\\xf8\\x91\\x79\\x76\\x7f\\xef\\x96\\xc6\\xd5\\x75\\x7b\\x1b\\x5b\\x62\\xd3\\xc5\\xfd\\x7d\\x8d\\x87\\xd2\\xba\\x54\\xa7\\x77\\xee\\xbd\\x3f\\x29\\x6b\\xcd\\xdd\\x8f\\x55\\xd0\\xd9\\xc1\\xa4\\xd3\\xb1\\xc6\\x7d\\xf5\\x33\\x37\\x5f\\xe9\\xe8\\x94\\xb6\\x7f\\xbd\\xae\\xa4\\x35\\xe6\\x78\\xaa\\x2f\\x40\\x6d\\xcf\\x1d\\xb5\\x42\\x3e\\x94\\xbf\\xf9\\xdb\\x83\\xfd\\x05\\x7e\\xff\\x73\\xf5\\x86\\xd4\\xc0\\xcc\\xbb\\x9f\\xc7\\x7e\\xed\\xbf\\x82\\x02\\x62\\x50\\xa5\\x9e\\x27\\xea\\xd2\\x07\\x34\\x6a\\x7b\\x32\\xbf\\x29\\xeb\\x7e\\x72\\xdb\\xd8\\xc1\\x0d\\xaa\\x1f\\x8e\\x6b\\x07\\xdd\\x67\\x4e\\x8d\\xfe\\xb9\\x3b\\x3d\\x78\\xcf\\x99\\x94\\x73\\xeb\\xab\\xee\\x3d\\xbb\\x93\\x62\\xd4\\x85\\xbe\\x09\\x3f\\x65\\xbe\\x96\\x57\\x35\\xb0\\xab\\xf7\\x0d\\x55\\xdf\\xf9\\x59\\x2d\\xfb\\x22\\x19\\x47\\x8b\\x3f\\x5d\\x62\\xf3\\xbf\\x3b\\x69\\xec\\x90\\x6f\\x7f\\xab\\x21\\xff\\x72\\x40\\xe9\\x99\\xd3\\xf4\\x1d\\xb3\\x65\\x8e\\xaf\\x67\\x6a\\xea\\xd2\\x52\\xf4\\xa4\\x38\\xd9\\x08\\x16\\x1f\\x28\\x34\\xe5\\x7e\\xb3\\xec\\x7d\\xb2\\xc9\\x7a\\x4d\\x13\\xd1\\x79\\xc6\\x1d\\x3c\\xbd\\x7c\\xda\\xcd\\xa6\\xf5\\x43\\xa5\\x57\\x37\\x4c\\x1a\\x60\\x8f\\x69\\x67\\xbc\\xd7\\xd0\\xe3\\x1d\\xa9\\xc5\\xd5\\x7f\\xbc\\xf9\\x41\\xc7\\xf7\\xcd\\xd0\\x25\\x4b\\xd5\\xec\\x09\\xbf\\xab\\xef\\xd6\\x35\\xdc\\x2a\\x5a\\xa4\\x95\\xb6\\x69\\x93\\x54\\x40\\xfd\\xf2\\x81\\x8d\\x99\\xb1\\x72\\x29\\x7e\\x15\\x7b\\xdd\\xf3\\x5d\\x7b\\x1c\\xaf\\xac\\xfc\\x33\\x00\\x00\\xff\\xff\\xcb\\xa3\\xb9\\x1c\\xf7\\x05\\x00\\x00\")\n\nfunc imagesDevicesImagePngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesDevicesImagePng,\n\t\t\"images/devices-image.png\",\n\t)\n}\n\nfunc imagesDevicesImagePng() (*asset, error) {\n\tbytes, err := imagesDevicesImagePngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/devices-image.png\", size: 1527, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesLogoRobeauxPng = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x97\\x79\\x38\\xd4\\x7b\\xdf\\xc7\\xc7\\x12\\x42\\x8b\\xb5\\x10\\xc6\\x58\\x42\\xcc\\x66\\x16\\x33\\xcc\\x88\\x19\\x44\\x33\\xb6\\xec\\x5b\\xc6\\xcc\\x60\\x30\\x4b\\x33\\x83\\xa1\\x30\\x1c\\x4b\\x3a\\x5a\\x2d\\x15\\x59\\x8a\\x88\\xa4\\xa4\\x4d\\x84\\x53\\x96\\x8c\\x0a\\x09\\x27\\xca\\x92\\x24\\xa7\\xa2\\x11\\x11\\xe2\\xb9\\x3a\\x4f\\xdd\\xf7\\x73\\x3d\\xd7\\x7d\\x9d\\x3f\\xee\\xef\\x5f\\xbf\\xdf\\xe7\\x7a\\xbf\\xde\\x9f\\xe5\\xf7\\xf9\\xfd\\xf1\\xcd\\x72\\x73\\x71\\xdc\\x22\\xaf\\x29\\x0f\\x00\\x00\\xb6\\x38\\xed\\x23\\x7a\\x00\\x00\\x80\\xcb\\x00\\x00\\xc0\\x58\\x4e\\x06\\x00\\x00\\x94\\x6c\\xc2\\xbe\\x02\\x00\\x00\\x1a\\x7c\\x7b\\x5f\\xfe\\x01\\x76\\x18\\x3f\\x8e\\xc2\\xa5\\x03\\x6c\\x69\\xec\\x50\\x3a\\xd0\\x89\\x49\\x09\\xa7\\x7b\\xd0\\x29\\xb4\\xf8\\x43\\x5d\\x74\\x6b\\x00\\x40\\x2a\\x82\\xe1\\xe9\\xcb\\xf7\\x25\\x93\\xb0\\x54\\x36\\x13\\x4c\\xf9\\xa1\\x01\\x0b\\x98\\x1c\\xc0\\x8f\\x63\\x6d\\x23\\xe0\\x50\\xa8\\x51\\x74\\x3e\\x30\\x94\\x1e\\xce\\x60\\xe1\\x40\\x73\\x8d\\x2d\\x20\\x20\\x83\\x86\\x03\\xf9\\x20\\xc9\\x50\\x32\\x87\\x40\\x8f\\x60\\xec\\x4b\\xe0\\xd2\\x0f\\x24\\xb8\\x78\\x52\\x13\\xa2\\xa8\\x18\\x1a\\xc8\\x06\\x0f\\xb4\\x16\\x60\\x05\\x4c\\x0e\\x93\\xce\\xa7\\x00\\x05\\xcc\\x68\\x16\\x0f\\x2b\\xc0\\x81\\xfe\\xf6\\xc5\\xb2\\x78\\xd8\\x1f\\x61\\x08\\x08\\xf8\\xb7\\x84\\x1f\\x85\\x03\\xfd\\x6f\\x51\\xbe\\x64\\x37\\x20\\x81\\xcd\\xa5\\x03\\x91\\x60\\x0b\\x73\\x2a\\x14\\x06\\x03\\xa2\\x50\\x60\\x18\\x02\\x89\\x42\\xc1\\xcc\\x80\\x70\\x28\\x0c\\x0e\\x81\\xc2\\x21\\x50\\x94\\x39\\x0c\\x81\\x45\\xa2\\xb0\\x70\\x34\\xf0\\xe7\\x01\\xe1\\x81\\xd6\\x5c\\x5a\\x18\\xd6\\x83\\xe8\\xf0\\x33\\x17\\x97\\x16\\x86\\x03\\x45\\xf0\\xf9\\x1c\\x2c\\x04\\x12\\x17\\x17\\x07\\x8e\\xb3\\x00\\xb3\\xb9\\xe1\\x10\\x18\\x06\\x83\\xf9\\xe1\\x01\\x87\\x9b\\x73\\x69\\x61\\xe6\\xbc\\x78\\x16\\x9f\\x22\\x30\\x67\\xf1\\xf4\\x7f\\x39\\x10\\xe9\\x3c\\x2a\\x97\\xc1\\xe1\\x33\\xd8\\x2c\\xe0\\x8f\\x77\\x4a\\x28\\x3b\\x86\\x8f\\x03\\x81\\x7e\\xb5\\xc0\\xe4\\x90\\xc9\\xff\\x32\\x66\\xf1\\x7e\\x0e\\x8a\\xca\\x66\\x42\\x04\\x14\\x0e\\x04\\x06\\x86\\x42\\x98\\x4c\\xc8\\x2f\\x35\\x8f\\xef\\x41\\x0f\\xfb\\x67\\x35\\xcf\\x33\\x9e\\x43\\x87\\x78\\xd0\\x79\\xec\\x18\\x2e\\x95\\xee\\x41\\x0f\\xd3\\xff\\x3f\\xa9\\xfe\\x19\\xfd\\x21\\xe4\\x90\\xc9\\x58\\x57\\x2e\\x23\\x9c\\xc1\\xa2\\x44\\x13\\xd9\\xd4\\x18\\x26\\x9d\\xc5\\x77\\x22\\xe2\\x40\\x02\\x26\\x07\\x4c\\x63\\xd0\\xb0\\x48\\xb4\\x05\\x1a\\x83\\xb1\\xb0\\x80\\xc3\\xe0\\x50\\x94\\x25\\x0c\\x66\\x69\\x8b\\x22\\xda\\x23\\x11\\x76\\x18\\x94\\x2d\\xc2\\x0e\\x8d\\xb0\\xf8\\xe5\\xf1\\x9f\\x58\\xa8\\x03\\x8a\\x88\\x46\\xc3\\x2d\\x91\\x0e\\xb6\\x68\\x18\\xcc\\x1e\\x61\\x8b\\x20\\xa0\\x6c\\xd1\\x68\\x18\\xc6\\xd6\\xde\\xce\\x12\\x66\\x09\\xfd\\xc5\\x3a\\xb1\\x78\\x7c\\x0a\\x8b\\x4a\\xff\\xc5\\x32\\xfe\\xcd\\xa2\\xff\\x91\\xc5\\x12\\xb8\\x74\\x0a\\x9f\\xcd\\xf5\\x64\\xb3\\xa3\\x7f\\x6d\\x80\\x5b\\x04\\x9b\\xcf\\xe6\\x45\\xb0\\x39\\x40\\xc2\\x01\\x14\\xd0\\x98\\x4c\\xa1\\x32\\x58\\x3f\\x02\\x26\\x3f\\x3e\\xd0\\xcf\\x5a\\xe9\\x5c\\x46\\x2c\\x9d\\xe6\\xc0\\x65\\x33\\x81\\x7f\\x4f\\x18\\xcb\\xf8\\x0f\\x15\\xd8\\xa1\\x2d\\x11\\x68\\x5b\\x07\\x02\\x0c\\xfe\\xb3\\x73\\x38\\xdc\\xd6\\x9e\\x80\\xb0\\xc5\\xd8\\xc3\\x6c\\x91\\x44\\x07\\x28\\xe8\\x27\\x4b\\xfb\\x6f\\xa6\\x06\\xc1\\x03\\xad\\x21\\xff\\x6f\\x5d\\x7e\\x85\\x3c\\x88\\x0e\\x3f\\x1e\\xff\\xb5\\xfc\\x78\\xe0\\xbf\\x7f\\x1f\\x3a\\x8b\\x86\\x03\\x71\\x41\\x36\\xf8\\x2d\\xcf\\x03\\x5e\\x01\\x00\\x0a\\xa7\\x9c\\x88\\xb6\\x9e\\x82\\xe1\\x8f\\x81\\x0a\\xa7\\x3c\\xdb\\xd5\\x8a\\x52\\xd4\\xd4\\xdc\\x50\\xc0\\x4b\\x12\\x69\\xc6\\x44\\xa0\\x31\\x30\\xf9\\x62\\xea\\x1e\\x79\\x3d\\xf9\\x4d\\x67\\x8e\\xea\\x6e\\x57\\x56\\xa9\\xba\\x92\\x45\\x34\\xd4\\x85\\xa5\\x52\\x94\\x6c\\x73\\x6e\\xca\\x69\\x7a\\x8a\\xa4\\xc9\\x7a\\x32\\x76\\xbd\\x11\\xd0\\x3d\\x0e\\x40\\x13\\x83\\x8c\\xc7\\xa0\\x8d\\x93\\x42\\xa1\\xed\\x43\\xb6\\x6d\\x7e\\x50\\x73\\x0e\\xaf\\xe8\\xcb\\x67\\xee\\xa7\\xa5\\xf3\\xf4\\xb0\\x63\\xa6\\xa3\\xd7\\xb0\\x48\\xf6\\xfd\\xd5\\xd8\\xa5\\xc3\\x89\\x95\\xab\\xeb\\xa3\\xaa\\xe5\\x1e\\x55\\x44\\xf8\\x79\\x92\\x67\\x5e\\x6b\\xb2\\x06\\x3e\\x41\\x22\\x28\\x45\\x7d\\xaf\\x4a\\x29\\xd8\\x2d\\xa4\\x40\\x47\\xe2\\x2b\\xa0\\x30\\x45\\xad\\xb5\\xb1\\x35\\x30\\xfb\\xfb\\x18\\x91\\x04\\x33\\x71\\xf6\\xb6\\x37\\xfe\\xe3\\xc0\\x16\\x5d\\xb4\\xd4\\x92\\x44\\x90\\xe7\\x40\\xb0\\xfc\\x6b\\x56\\xe9\\xab\\x1b\\x03\\x32\\x60\\x40\\x81\\x64\\x4c\\x53\\xad\\xf0\\x5b\\x2b\\xf1\\xc9\\xc4\\x53\\x01\\x26\\x74\\x5e\\xda\\xac\\xff\\xeb\\xb5\\x14\\xc3\\x2a\\x84\\x97\\x64\\xb2\\x24\\x4b\\x56\\x33\\xfc\\x66\\xa3\\x24\\x21\\x65\\x28\\xa5\\xec\\xe3\\x55\\x83\\x1c\\x7c\\xe8\\xb1\\xf4\\xe7\\x51\\x23\\xdb\\x2c\\xe5\\x76\\xc9\\x16\\xcb\\x80\\x9f\\x3d\\x5c\\x7e\\x2a\\xd4\\x50\\x7d\\x52\\xb4\\x77\\x5a\\xe0\\x15\\x7a\\x31\\x7b\\xb8\\x16\\xcd\\xc9\\x4e\\xed\\xc7\\xc9\\x7e\\xb9\\x97\\x25\\xd9\\xa2\\x7b\\x0f\\x1e\\x7c\\xde\\xd7\\xf8\\xd1\\x30\\x42\\x5a\\x24\\x0c\\xba\\x59\\x3f\\xc5\\x01\\xbf\\xae\\x52\\x8e\\x96\\x8c\\xec\\xb8\\xaa\\xa2\\x40\\x77\\x2b\\x64\\x58\\x07\\xff\\x3e\\x0f\\x2d\\xb1\\xc2\\x0c\\x42\\xde\\x0c\\x64\\xa5\\x3f\\xbf\\xde\\x2c\\xc1\\xd9\\x29\\xd0\\x77\\xfd\\x52\\x25\\x53\\xb3\\x29\\x16\\x80\\x7c\\xa3\\x86\\xfd\\x72\\xc5\\x3f\\x0d\\x25\\x25\\xac\\x17\\xda\\xec\\x9c\\xc0\\x9c\\xf5\\x5e\\x62\\xa7\\xd4\\xb5\\x1e\\xf7\\x88\\xad\\x56\\x71\\x36\\xca\\xe9\\xc4\\x0c\\xa6\\xef\\x75\\x6f\\x22\\x8a\\x5d\\x66\\xaa\\x93\\x8f\\x0f\\xc6\\x5e\\xec\\xfb\\x8e\\xaa\\x6c\\xde\\xb7\\x2a\\xcc\\xf2\\xaa\\x13\\xcd\\xac\\x2e\\xd4\\x8e\\xd4\\xb5\\x38\\x89\\xe5\\xdb\\xed\\x66\\xaa\\x77\\x4c\\x86\\x5d\\x5e\\x19\\xcd\\x55\\xe7\\x6e\\xef\\x3a\\xb4\\x61\\xdd\\x6b\\xaf\\x50\\xe8\\xba\\xf1\\xa6\\x75\\xae\\x5b\\xbf\\x51\\xa3\\x5b\\x5e\\xc8\\x15\\x67\\x16\\x3f\\x4c\\xbc\\x4d\\xb6\\x2f\\x23\\xb4\\xaa\\x87\\xa8\\xe3\\x00\\x5d\\x66\\xf8\\x91\\xca\\x17\\x96\\xf4\\xba\\x5b\\xf6\\x65\\xa9\\xa7\\x32\\x13\\x94\\xf0\\x7f\\x49\\x60\\x87\\xe7\\xa9\\xe3\\x4d\\xa7\\x92\\xa6\\xee\\x6d\\xe8\\xd4\\x69\\x7f\\x6f\\xfa\\xad\\x67\\x03\\x10\\xa0\\x3c\\xe3\\x56\\xf6\\x62\\x3f\\xbf\\x52\\x9f\\x23\\x35\\xee\\xb7\\x10\\x27\\x69\\xd3\\xa9\\x04\\xde\\xba\\x48\\xbf\\xc7\\x82\\xd8\\x3d\\xd5\\xc7\\xf9\\x18\\x24\\x44\\x51\\x43\\x81\\x37\\xe4\\xa8\\x49\\x0a\\x54\\xd6\\xc9\\xf6\\x49\\x84\\xaa\\x73\\x2f\\x7d\\x2d\\xf0\\xba\\xa8\\xb9\\x78\\x62\\x27\\x37\\x77\\xcc\\x21\\xcd\\x7d\\x77\\xcc\\x03\\xf0\\xe9\\x13\\x95\\xbf\\xdf\\x38\\x92\\xdb\\x19\\xce\\x45\\x7e\\xbe\\xf3\\x71\\x7e\\xfb\\x93\\xef\\x75\\x47\\x2f\\x24\\xd9\\xcd\\x7c\\x0a\\xf1\\x37\\x6e\\xa6\\x0d\\xef\\x6b\\x6a\\x94\\x5c\\xe6\\x66\\x50\\xf7\\x83\\x3a\\x1a\\x2a\\x5a\\x14\\x06\\x16\\xc3\\x92\\x50\\x3d\\x67\\xdc\\xd6\\xbb\\x3f\\x2e\\xeb\\x14\\x3d\\xd5\\x6e\\xac\\x34\\x8d\\xda\\x6c\\x2d\\xbd\\x66\\xa6\\x7e\\xba\\xdf\\xd5\\x18\\xa7\\xf7\\xb2\\x4a\\x64\\xfa\\xcd\\xc4\\x51\\x1c\\xd4\\xaa\\x57\\xaa\\x9e\\x1e\\x6d\\xdd\\x6b\\x55\\xde\\xd3\\xd2\\xa5\\x44\\xd6\\x03\\x57\\xba\\x59\\xcb\\x06\\x86\\xbe\\x48\\xd5\\x8e\\xac\\x7c\\x2a\\x63\\xde\\xf1\\x0c\\x6d\\xb4\\xd7\\xeb\\xb4\\x74\\x8e\\x8f\\x67\\x1f\\x27\\xf7\\xb8\\x64\\x4f\\x9d\\x2f\\xc9\\x05\\x72\\x71\\x21\\x8d\\x98\\xad\\xdd\\x50\\x5b\\x1b\\xeb\\x70\\x48\\x0d\\xa7\\xc0\\x07\\x74\\x48\\x2a\\xd7\\xeb\\x74\\x16\\x5d\\xcf\\x71\\x4d\\x9e\\x93\\x38\\xd9\\x25\\x96\\xdb\\xb5\\xc9\\x48\\x72\\xe8\\xe6\\xf5\\xe4\\x63\\xbf\\x1f\\xf3\\x5e\\x57\\x5a\\x24\\x18\\x3f\\xe9\\xfc\\x4d\\xf8\\xf9\\xbb\\x12\\x35\\x59\\xf6\\xec\\x98\\xdb\\xe4\\x1d\\xc9\\x7c\\xab\\x85\\x8f\\xa0\\x6a\\xb5\\x51\\x13\\xb8\\xee\\x9a\\x15\\x1c\\x2a\\xac\\x6d\\xed\\x5c\\x14\\x2e\\x18\\xca\\xf4\\xca\\xb6\\x4a\\x2e\\x88\\x19\\xd2\\xdb\\xec\\xd1\\xa5\\xb2\\xbd\\x47\\x3f\\xd4\\xed\\x4f\\xe2\\xcc\\x93\\xfe\\x48\\x06\\xa6\\x6d\\x58\\xcf\\x07\\x77\\xad\\xe6\\x84\\xaf\\x6d\\xfb\\x6c\\xfe\\xb5\\xc9\\xd4\\xd9\\x08\\x55\\x7a\\x44\\x4b\\x54\\xeb\\x1e\\x74\\xc4\\xfb\\x5d\\xb8\\x6f\\xf5\\x6d\\x53\\x42\\xa3\\x47\\x7f\\x49\\x2f\\x3c\\x77\\x0e\\x79\\xe4\\xa6\\x46\\x50\\xf5\\x31\\xd1\\x91\\x6b\\x6c\\xa3\\x83\\x35\\x95\\x53\\xc6\\x7e\\xb8\\xcb\\xa2\\x33\\x17\\xe4\\x49\\xe3\\x8b\\xfb\\x56\\xcc\\xa2\\x24\\x79\\x29\\x12\\x12\\xf9\\xb5\\x2f\\xae\\xd1\\xd6\\x9a\\xd0\\x9d\\x33\\x4f\\x9a\\x2b\\xaa\\x63\\x79\\x6f\\x29\\x9f\\x13\\x34\\x7a\\xf5\\x15\\x06\\x97\\x0e\\x28\\x09\\x3a\\x34\\x8b\\xa3\\xb2\\x87\\x28\\xea\\xaf\\xa9\\xf9\\xe5\\xd1\\x46\\xbd\\x06\\x8f\\x57\\x64\\xfc\\x01\\xbf\\x1f\\x29\\x3e\\xfe\\xe2\\xa4\\x64\\xf5\\xea\\x93\\x4f\\xfe\\x21\\x5e\\xad\\xf5\\x6a\\xeb\\x87\\x13\\x05\\xed\\x85\\xb0\\x0c\\x66\\xe0\\x82\\x0e\\xc7\\xe4\\x73\\x95\\xa9\\x96\\xed\\x68\\xae\\xf9\\x17\\x0d\\x6a\\x73\\x24\\xba\\x84\\x9e\\xa3\\xb8\\xb1\\x3f\\xa3\\x12\\x3b\\xe4\\xd3\\x0f\\xad\\x74\\x9b\\x37\\xda\\x7a\\x25\\xe3\\x78\\xb6\\xdb\\xe8\\xb6\\xa3\\xb0\\x1b\\x7d\\x9f\\x1f\\x18\\x77\\xa9\\x4a\\x6c\\x7b\\x76\\xf5\\x70\\xc7\\xe7\\xa7\\x61\\x25\\xfe\\xc6\\x23\\x55\\x73\\x5a\\x5f\\x0c\\x72\\x2d\\x14\\x5d\\x0f\\xe7\\xdf\\x9d\\xde\\x66\\x92\\x5d\\x4e\\x96\\xd5\\xbd\\x58\\x43\\xcb\\x35\\xcd\\x0e\\xce\\x9b\\x66\\xbf\\x8b\\x91\\xcd\\xa1\\x5c\\xea\\x25\\x3e\\x3a\\x8c\\x82\\x42\\x24\\xc7\\x1c\\xce\\x02\\x8a\\x2f\\xb9\\x0d\\x7a\\x6a\\x15\\x3a\\x06\\xa9\\xf5\\x6c\\x23\\xbd\\x8e\\xf2\\x98\\x9d\\x26\\xd4\\x90\\x71\\x7d\\x65\\x52\\x5b\\xaf\\x1e\\x41\\x02\\x1b\\x3b\\x81\\xf2\\x87\\x24\\x62\\x7a\\x33\\x24\\x3e\\x8c\\x9e\\x92\\x21\\xe9\\xde\\x62\\x3f\\xca\\x72\\xba\\xb3\\xd2\\x29\\x7a\\x6e\\x03\\x0b\\x8f\\x09\\x42\\x6f\\x5b\\xf7\\xc7\\x24\\xad\\x5c\\x05\\xf5\\xe5\\xf9\\xb8\\x17\\x2d\\x5b\\x04\\xf9\\xae\\xc4\\xe7\\x02\\xd8\\x86\\x2e\\x2e\\x61\\xf9\\x28\\x90\\xe7\\xe2\\x11\\x45\\x53\\x57\\x47\\x1b\\xb3\\xda\\xdd\\x5f\\xeb\\x46\\x6e\\x7d\\x70\\xbc\\x5b\\x88\\x86\\x60\\x22\\x4b\\xd0\\x51\\x86\\x4d\\x2a\\x42\\xf7\\x56\\x44\\x3d\\x5e\\x9f\\xac\\x3e\\x14\\x41\\x6d\\xdb\\x6c\\xbe\\xa9\\x02\\x00\\x01\\x14\\xfa\\x7e\\xcd\\xdb\\x75\\x85\\x28\\x2b\\x86\\x49\\xf7\\x82\\x1f\\x38\\x29\\x1a\\x76\\x17\\xa8\\x5f\\x9d\\xc7\\xdd\\x72\\x7f\\xfe\\x8c\\x37\\xbe\\x2b\\x44\\xee\\x64\\xf4\\xa1\\xb0\\x1d\\x9a\\x9b\\xc1\\x08\\xab\\xa9\\xe0\\x59\\x62\\xb0\\xe7\\xb4\\xce\\x6c\\x2c\\x1a\\xea\\x37\\x74\\xd2\\x79\\xe7\\x09\\xd5\\xcc\\xc5\\x58\\xf9\\x85\\xb1\\x97\\x3e\\xe7\\x5f\\x9a\\x8c\\xf8\\x77\\xd6\\x9b\\xa1\\xa0\\x9a\\x82\\x5c\\x74\\x5e\\x97\\xcb\\xb7\\x1d\\xa5\\x2d\\x52\\x77\\x01\\xae\\x05\\x39\\x13\\x6d\\xee\\x8f\\xa8\\xae\\xfd\\x7b\\x5a\\xbf\\x45\\x5e\\xb8\\x4f\\xf2\\x1e\\x5c\\xb8\\x47\\xad\\x7c\\xb1\\x14\\x5b\\xf7\\xe6\\xfa\\x1f\\xd4\\x80\\x7e\\x30\\x64\\xb6\\xc7\\x20\\xf2\\x9a\\x91\\x22\\xef\\x55\\x14\\x55\\x06\\x60\\x9d\\xe0\\x87\\xbb\\x2e\\xef\\x05\\xae\\x4a\\xf9\\xae\\xed\\xf8\\x3e\\xa2\\xd3\\xda\\x35\\xbe\\xd2\\x33\\x66\\x92\\x6c\\x73\\x86\\x6f\\xf1\\x32\\x37\\x31\\xc0\\x42\\x6e\\xbd\\xda\\xd4\\xfe\\x7a\\xa4\\x32\\x28\\xd7\\x24\\x69\\x0e\\xa0\\x28\\xd3\\xe6\\xc1\\x2c\\xbb\\x99\\x95\\x1a\\xa1\\x39\\xb2\\x75\\x37\\x5b\\xd6\\x71\\xcc\\xdb\\x78\\x49\\xbc\\x1a\\xe8\\xf5\\xd5\\x21\\x1f\\x84\\x05\\xaf\\x94\\x9c\\xdd\\xc4\\x3e\\x71\\x3b\\x86\\xbb\\x0b\\xdb\\xa1\\x5c\\xb4\\x42\\x18\\x98\\x55\\x59\\xbf\\x77\\xcd\\x0d\\x2c\\xde\\x0f\\x3f\\xf4\\xfe\\xa0\\xfd\\x47\\x1f\\x85\\x81\\x39\\xa9\\xd9\\x25\\xf0\\x00\\xcb\\xa6\\x5b\\xa6\\x10\\x3f\\xb7\\x65\\xbc\\x24\\x8f\\x70\\x51\\x55\\x2d\\xb4\\xa1\\x7a\\xec\\xda\\xa8\\xe5\\xf6\\x02\\x8a\\x95\\xca\\x2e\\xd8\\xfd\\x9e\\x7c\\x39\\xbb\\x99\\xd3\\x8a\\x5f\\xc1\\x71\\x05\\xe1\\x42\\x47\\x90\\x59\\xc2\\xa6\\xf8\\xfc\\xd5\\x17\\x01\\x17\\xcd\\xa6\\x97\\x13\\x52\\xee\\xbc\\xdb\\x67\\xec\\x23\\x75\\x90\\xaa\\xbb\\x85\\xf4\\xda\\x55\\xaa\\x43\\x8b\\x31\\x8c\\xe2\\xc9\\x4d\\x7d\\x92\\x58\\x3b\\x78\\x5b\\x52\\x3a\\x90\\x2e\\xda\\x3a\\x4f\\x3c\\xf4\\xc7\\xec\\xc2\\x96\\x5c\\x58\\xc1\\x1b\\xcd\\x21\\xf9\\x9d\\x2d\\xc6\\x3e\\x76\\x55\\x83\\x93\\x47\\x27\\xe3\\xd9\\x77\\xff\\x3a\\x51\\x59\\xf9\\x3e\\xa8\\xf2\\x1c\\xf8\\xb7\\x2b\\x2f\\xb0\\xa7\\x93\\xe2\\xa3\\x2b\\xde\\x5b\\x28\\xea\\x65\\xf4\\x61\\xde\\x32\\xb4\\x0f\\x65\\xeb\\xf7\\xba\\x12\\xa7\\xfb\\x31\\xf9\\x2d\\x5d\\x37\\xe5\\x0d\\x12\\x0a\\x76\\xe9\\xf9\\x84\\xd4\\xe4\\x6d\\x0d\\x6f\\xee\\x1d\\x06\\xac\\xab\\xbd\\x3b\\x2c\\xe5\\x58\\x38\\x20\\xb1\\x32\\x84\\x3d\\xe0\\xd9\\xa3\\x74\\xe5\\x54\\x08\\x41\\x5b\\xf7\\x05\\xf7\\xd6\\x40\\xc2\\xe7\\xd8\\x6c\\x77\\x1d\\xe8\\xc6\\x6d\\x4c\\x6c\\x43\\x9e\\x47\\xe6\\x6d\\x84\\x4c\\x4c\\x63\\x50\\x92\\xb3\\x5f\\x76\\x73\\x6b\\x12\\xe2\\x5c\\xa5\\x45\\x2a\\x1c\\x28\\x6e\\xcc\\xf3\\xa8\\x53\\xcb\\xe4\\xc5\\x65\\xea\\x7a\\xae\\x25\\x2d\\xba\\x4e\\x74\\x10\\x97\\x0a\\x8b\\x9a\\x49\\x49\\xe7\\xf4\\x56\\x55\\xb1\\x9f\\x5c\\xad\\xb3\\x89\\x2b\\x4c\\xd2\\xc9\\xb6\\x71\\x7f\\x93\\x43\\x71\\x5e\\xde\\x94\\x15\\x4b\\x9b\\xd2\\xe4\\x3d\\x7b\\xa7\\x94\\x86\\xdf\\x17\\xb5\\x0d\\x6a\\xf3\\x77\\x9e\\x93\\x9d\\x79\\x74\\xdc\\xae\\xf3\\xe5\\x68\\x19\\xf6\\x92\\x87\\x70\\x0d\\xce\\x59\\xe3\\x2f\\x94\\x45\\x6a\\x7f\\xd8\\x94\\xed\\xb3\\xe7\\xed\\x5b\\xe5\\x98\\x88\\x53\\x65\\xce\\x2e\\x69\\x8c\\x73\\x3e\\x53\\x4e\\x76\\x59\\x92\\x0d\\x7d\\x2f\\xc3\\x60\\x27\\xfa\\x30\\x85\\x47\\x97\\x81\\xd6\\x57\\x0f\\x4b\\x00\\xef\\xf7\\x7c\\x38\\x81\\x1a\\x80\\x6f\\x17\\xc9\\x0f\\x21\\xdf\\xdd\\xaf\\x3b\\x06\\x4f\\x94\\x6b\\xa2\\xff\\xa5\\x87\\xdb\\x2b\\xbb\\x4c\\x8e\\x74\\x1f\\x55\\x3d\\x9b\\x9e\\xb0\\x23\\x51\\xa1\\xf3\\xeb\\x3c\\xd1\\x30\\xfe\\xad\\x7d\\xc9\\xfa\\xea\\x95\\xa8\\xf8\\xd8\\xda\\xf8\\xad\\xb4\\xf1\\x56\\x7b\\xa9\\x27\\x4b\\x8b\\x1f\\x09\\x69\\x8f\\xbb\\x03\\x35\\x4f\\x36\\xa8\\x85\\x8f\\xbb\\x2f\\x3f\\x5e\\x2b\\xbd\\x0f\\xdb\\x37\\x71\\x49\\x2b\\x51\\x14\\xd7\\xd7\\x55\\x12\\x22\\x6c\\x43\\x9e\\xd8\\xc9\\xfa\\x64\\x77\\x61\\xbd\\x5f\\xb9\\xa4\\xc5\\x9f\\xe9\\xea\\xbf\\xf9\\xca\\xab\\xe4\\x33\\x2e\\x33\\xfd\\x7d\\x04\\xa1\\x60\\xe1\\xf7\\x6f\\x0f\\x10\\x79\\x36\\x05\\x04\\xc2\\x04\\x26\\xfe\\xc6\\xa5\\xb6\\xe9\\x87\\xae\\x4e\\x36\\xc3\\xa0\\x4c\\x09\\x1f\\xc7\\xdb\\xf1\\x03\\xbe\\x2d\\x63\\xfc\\x05\\x5e\\x91\\x58\\xbf\\x79\\x92\\x9a\\xa8\\x5b\\x3f\\x08\\x19\\xb9\\x5d\\xde\\x7e\\xed\\xc0\\x86\\xbc\\xdf\\xdd\\xb6\\x9d\\x72\\x4f\\x13\\x67\\x97\\x94\\x5d\\x77\\x78\\xd3\\x3f\\x69\\x2f\\x79\\xbf\\xb7\\x58\\xc7\\xeb\\x16\\x71\\x4f\\x34\\x6c\\x04\\x67\\xdc\\xcd\\x88\\x77\\x00\\x13\\xa6\\x25\\x0e\\x6c\\xa4\\x36\\x40\\x2e\\x16\\x5f\\xb4\\x9b\\x39\\xb7\\x7c\\xc6\\x5a\\x7e\\xea\\x63\\xf4\\xb2\\x76\\x99\\x65\\x8f\\x7b\\xf0\\xd8\\xc4\\x78\\xe2\\xfe\\x06\\xda\\xfd\\xf3\\xd8\\x3a\\xcd\\x92\\xbc\\x05\\x54\\xe8\\x31\\x42\\xca\\x9c\\xda\\xb8\\xf2\\xfc\\x25\\x9b\\x47\\xef\\x95\\x0b\\x89\\x04\\x97\\x7e\\x55\\x64\\x8b\\x6d\\x85\\x0b\\xd7\\x4f\\x77\\x7a\\xe4\\xb2\\xf6\\x4e\\xc3\\xc2\\x27\\x11\\xd9\\x96\\x73\\x56\\x05\\xab\\x01\\xd1\\xcb\\xe8\\xbe\\xf4\\xdd\\x4d\\x41\\x29\\x99\\x89\\x20\\x9c\\xfe\\x91\\x0e\\x1b\\xe2\\x6f\\xde\\x66\\xab\\xab\\x47\\x50\\x57\\xbf\\x0d\\xf7\\x38\\xeb\\x9c\\xc4\\x57\\x4c\\xbc\\x1a\\xb6\\xbe\\xcb\\xdc\\xed\\x79\\x4e\\x31\\x8d\\x4b\\xd2\\x49\\x9f\\x77\\xfc\\xa6\\xec\\x7c\\x87\\x39\\x7b\\xf4\\x4f\\xd2\\x92\\x72\\x92\\x89\\xb4\\x3b\\xe3\\xa6\\x2b\\x71\\x3a\\x82\\xb8\\xbe\\x65\\x58\\xb6\\x5b\\x85\\x1a\\x26\\x33\\x39\\x47\\xb5\\x7e\\x39\\x39\\x27\\x2a\\x42\\x67\\x9b\\x26\\xa6\\xdd\\x04\\x02\\x11\\x91\\x2a\\x8d\\x4c\\xa2\\x63\\xa0\\xad\\xee\\xb9\\xd8\\xef\\x52\\xb4\\x48\\x87\\x0a\\x3b\\x13\\x97\\xc1\\x50\\xdd\\x7a\\x7c\\x80\\x81\\x02\\x1a\\xac\\xf5\\x72\\xec\\x7c\\x86\\x86\\x7b\\x32\\x32\\x08\\x5c\\x50\\xec\\x96\\x2a\\x8e\\x78\\xfc\\x46\\xc4\\x8b\\x27\\x75\\xd6\\x1e\\x77\\xab\\x95\\xd0\\x51\\x6c\\xd8\\x48\\xaf\\xf5\\x71\\x12\\x10\\xf1\\x9f\\x54\\xe2\\x86\\xf8\\xad\\x8b\\xbf\\xe5\\x17\\x69\\xfd\\xa9\\x02\\x5f\\xb2\\x7a\\xa2\\xb5\\x49\\xff\\xd6\\x33\\x39\\xb3\\xc5\\x09\\xdc\\xb3\\xd5\\x0b\\xe3\\xdb\\x45\\x07\\x31\\xe9\\xb3\\xb4\\x8d\\x29\\xf9\\x0f\\xa8\\xee\\xe5\\x96\\xb4\\x65\\x51\\x2a\\x49\\x70\\xe3\\xe4\\x1b\\x7f\\xb5\\xea\\xd2\\xfd\\x0c\\xc9\\x77\\x37\\x4d\\xf7\\x53\\x08\\x2f\\xcd\\x93\\xaa\\x8e\\x39\\xf7\\x2e\\x2d\\x6c\\x2f\\x6e\\x46\\x38\\x20\\x70\\x92\\xcd\\xe6\\x35\\x67\\xdd\\x5e\\xc5\\x69\\xdc\\xf9\\xa2\\x68\\xb5\\xf9\\xf4\\xb1\\xad\\xdf\\xac\\x6e\\x8d\\x84\\xac\\xe4\\xb4\\x85\\xb9\\xca\\x06\\x1c\\x4f\\xf0\\xbb\\xc7\\x52\\xac\\x8c\\xa9\\x10\\xeb\\x4d\\x20\\xe3\\x3f\\x4d\\xd2\\x9f\\xc1\\xd4\\xa0\\x2d\\xde\\xbb\\x5a\\x8e\\xfa\\xd9\\x21\\xcf\\xdf\\x36\\xf4\\x73\\xf8\\x22\\x3c\\x5b\\x73\\xd8\\x5e\\x7c\\xec\\xf0\\x7b\\x56\\x06\\x2c\\xa0\\x4f\\x90\\xf3\\x31\\xa1\\x0b\\x56\\xd4\\x56\\x53\\xbc\\x3b\\x4f\\x8b\\x81\\x15\\x39\\xf3\\xf1\\xd2\\xf8\\x8c\\x33\\x2d\\xb0\\xa1\\x9a\\xdc\\xa5\\x07\\x69\\xd8\\x89\\xed\\xa8\\x83\\x52\\x24\\xba\\xba\\x2f\\x52\\x0d\\xb5\\xbe\\x79\\x78\\xf6\\x56\\x02\\x04\\x9f\\xb4\\xd3\\x64\\xff\\xe3\\xe9\\x8e\\xd9\\x77\\x84\\xc5\\xa4\\x07\\x0f\\xae\\xf4\\xd4\\x54\\x3d\\xac\\xbd\\xe7\\x05\\x52\\x6d\\xdd\\x5b\\xe1\\x19\\x9f\\x25\\x7b\\xd7\\x30\\x54\\x84\\xa1\\x7f\\x09\\x2a\\x0f\\x24\\x81\\x23\\x1b\\xe7\\xbe\\xc8\\x5d\\xd1\\x0d\\x81\\x2e\\x94\\x15\\x43\\x33\\x21\\xa9\\xda\\x53\\xa7\\xef\\x66\\xb0\\xed\\x45\\xe2\\xd8\\xfa\\xc1\\xf8\\x5d\\xf7\\x8b\\xde\\xa3\\xbe\\x87\\xd6\\x61\\xea\\x93\\x61\\xa7\\x93\\xbc\\x10\\xd2\\x61\\xd3\\x14\\x7c\\x49\\xba\\xee\\x64\\x5e\\x56\\x3a\\xbc\\x86\\x6c\\x9e\\xa7\\xfd\\x42\\x34\\x88\\x2e\\xb8\\xfb\\x6e\\x85\\xd4\\x41\\x5c\\xad\\x17\\xb2\\xf0\\x1d\\x0e\\x97\\xcf\\xba\\x6d\\xef\\x3f\\xef\\xe4\\xbe\\xae\\xa7\\xff\\xc7\\xb9\\xaa\\xb6\\x8c\\x76\\xf1\\x0a\\x7e\\x43\\xad\\xec\\x32\\x0a\\x04\\xa4\\xed\\x4f\\x09\\x48\\x49\\x05\\x50\\x6a\\xb6\\xec\\xab\\x2d\\x4d\\x93\\xeb\\xd4\\xd8\\x7d\\x5d\\xb0\\xb6\\xc3\\xe8\\x79\\x7c\\xa6\\xa1\\xf8\\xf9\\x85\\x06\\xd5\\x97\\x2b\\x0e\\x8d\\xdd\\x2a\\x33\\xc9\\xaf\\x1f\\xec\\x53\\xeb\\xd6\\x4a\\xb5\\x3f\\x3e\\x16\\x7c\\x95\\x5a\\x53\\x28\\x51\\xf7\\xe6\\xed\\x5c\\x59\\xf2\\x53\\x78\\x9f\\x92\\xa1\\xdf\\x64\\x71\\xdb\\xb4\\x78\\x6c\\x53\\xc0\\xe1\\x60\\xb0\\x7a\\x53\\x9a\\xfe\\x88\\x71\\x92\\xd2\\x9f\\xb3\\xe7\\xfa\\x77\\x8b\\xe7\\xdb\\xac\\xe8\\x7f\\xb2\\x4c\\xfc\\x0c\\x8a\\x94\\x77\\xb7\\x54\\x0c\\x9f\\xb7\\x2a\\xac\\xa8\\x10\\x5a\\x9e\\x9a\\x62\\xb6\\xeb\\xb4\\x79\\xb5\\x3e\\xca\\x82\\x18\\x19\\x04\\x86\\x48\\x7b\\x8c\\x1a\\x7d\\x54\\x56\\xa0\\x99\\xe5\\x66\\x29\\x4a\\xf3\\xf6\\xf4\\x66\\xa6\\x1a\\x25\\xb5\\x3b\\x97\\x54\\x9c\\x59\\x2e\\x3d\\x48\\x56\\xd3\\xee\\x83\\x54\\x11\\x3c\\xa5\\x9c\\xb8\\xef\\x8f\\x36\\xb3\\x25\\x62\\xdb\\xbb\\x95\\x15\\xe8\\xef\\xc2\\x93\\xe0\\x0d\\xdb\\x4f\\x2d\\x95\\xb7\\xe3\\xca\\x0f\\x2a\\xe4\\x0d\\x41\\x74\\x49\\xe5\\x45\\x57\\x37\\x5c\\xca\\x2d\\x0e\\xca\\x44\\x37\\xd6\\xb6\\xaf\\xbe\\xb2\\x2d\\x29\\x15\\x26\\x18\\x34\\xb2\\x13\\x17\\x90\\x9e\\xbb\\x6e\\x88\\xb9\\x6d\\xb9\\xa7\\x5d\\x34\\x42\\xc9\\xd7\\xcb\\x5b\\xc9\\x99\\x00\\x9d\\xad\\x8c\\x3d\\x1d\\xcf\\x39\\xa5\\xe6\\xc3\\xa3\\x9a\\x10\\x5b\\x52\\xfe\\x3a\\xa4\\x15\\xb0\\x55\\x45\\xf0\\xdc\\x61\\xec\\x09\\xee\\xc7\\xad\\xd7\\xc9\\xde\\x85\\x58\\x6b\\x17\\x92\\xfa\\x3f\\x01\\x00\\x00\\xff\\xff\\x57\\x39\\x99\\xdd\\x62\\x0f\\x00\\x00\")\n\nfunc imagesLogoRobeauxPngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesLogoRobeauxPng,\n\t\t\"images/logo-robeaux.png\",\n\t)\n}\n\nfunc imagesLogoRobeauxPng() (*asset, error) {\n\tbytes, err := imagesLogoRobeauxPngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/logo-robeaux.png\", size: 3938, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _imagesRobotsIcon_03Png = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x9c\\x55\\x7b\\x54\\x13\\x67\\xfa\\x1e\\x8b\\x3f\\xe4\\x26\\xd6\\xcb\\x8f\\x85\\x8a\\xee\\x34\\x28\\x8b\\x96\\x24\\x33\\xb9\\x0c\\x66\\x36\\x09\\x04\\x92\\x41\\x90\\xc4\\x18\\xb2\\x35\\x2b\\x6b\\x35\\x97\\x09\\x19\\x93\\xc9\\x4c\\x93\\x01\\x42\\xa8\\x8a\\xa1\\xb8\\xe0\\x8a\\x5a\\xad\\x59\\x84\\xc5\\x53\\xa4\\x58\\x56\\xa1\\x45\\xb9\\xb8\\xdc\\x2c\\x15\\x05\\xb5\\x54\\x4b\\xd5\\xca\\x2a\\x02\\xae\\x97\\x56\\xdd\\x1a\\x51\\x7a\\x55\\xdc\\x3d\\x71\\xc1\\xdd\\xb3\\xa7\\xc7\\x3f\\xf6\\x3d\\xe7\\x3b\\xe7\\xfb\\xde\\xf3\\x3c\\xcf\\x7b\\xf9\\xde\\xef\\x7c\\xa5\\x6a\\x55\\xea\\xcc\\x90\\x57\\x42\\x00\\x00\\x98\\x99\\xb6\\x5c\\xae\\x01\\x00\\x60\\x91\\x7f\\x05\\x05\\x02\\x00\\x70\\x1d\\x28\\x2f\\x07\\x00\\x20\\x8a\\x51\\xe8\\x98\\x4c\\xca\\xcc\\xe4\\xe9\\x1d\\x38\\x20\\x33\\x51\\x06\\x1c\\x4c\\x23\\xf5\\xd9\\xb8\\x06\\xd7\\x9b\\xf2\\xdf\\x3c\\x83\\x8b\\x01\\x20\\xc0\\x42\\x68\\x75\\x8c\\x4e\\x99\\x81\\x1a\\x29\\x92\\xa3\\xf7\\x63\\x38\\x2e\\x92\\x06\\xfc\\x26\\x4e\\x74\\xd1\\x7a\\xa3\\x15\\x67\\x40\\x03\\x9e\\x4d\\xd8\\x25\\x2c\\x5f\\xc7\\xc7\\x2c\\x90\\x30\\x49\\x58\\xab\\x85\\x4a\\x48\\x49\\xa7\\xe0\\x16\\x62\\xb9\\xdb\\x81\\x67\\xba\\x55\\x5a\\xa3\\xdb\\x6a\\x14\\x99\\x58\\x89\\x52\\x50\\xec\\x42\\x5d\\x24\\x4d\\xe2\\x8c\\x1e\\x74\\x91\\x36\\xbb\\x13\\x75\\x49\\x58\\xcf\\x74\\x51\\xbb\\x13\\xf5\\xbb\\xb9\\x2c\\xf0\\x19\\x84\\xb1\\x4a\\x58\\xff\\x4a\\x4a\\xa7\\x54\\x83\\x29\\x94\\x03\\x07\\x85\\x1c\\x3e\\xdb\\x08\\xc1\\x30\\x88\\x20\\x1c\\x58\\x20\\x44\\x10\\x38\\x1e\\xe4\\x41\\x30\\x8f\\x0b\\xf1\\xb8\\x10\\xc2\\x86\\x05\\xa8\\x10\\x41\\x79\\x09\\xe0\\xa4\\xb1\\xa4\\xa0\\xd8\\x61\\x32\\xa3\\x1a\\x39\\x36\\x19\\xcb\\x61\\x32\\x4b\\x58\\x16\\x86\\xa1\\x51\\x2e\\x37\\x2f\\x2f\\x8f\\x93\\xc7\\xe7\\x50\\x8e\\x6c\\x2e\\x2c\\x12\\x89\\xfc\\x1a\\x3c\\x1e\\xdb\\x61\\x32\\xb3\\x9d\\xf9\\x76\\x46\\xef\\x62\\xdb\\x9d\\x31\\x53\\x0a\\x72\\xdc\\x69\\x74\\x10\\x34\\x43\\x50\\x76\\xd0\\x7f\\xd6\\x1b\\xa8\\x1c\\x46\\xc2\\x62\\x4d\\x95\\x40\\xd2\\x4a\\xe5\\x73\\x61\\xbb\\x73\\xb2\\x51\\x46\\x8a\\xe4\\xba\\xf4\\x34\\x17\\xe6\\x40\\x5c\\x92\\xe4\\x4e\\xa1\\x9d\\x8c\\x06\\x37\\xbf\\x18\\xed\\xd4\\xe6\\xd3\\x38\\x57\\x83\\x3b\\xa9\\x1c\\x87\\x11\\xd7\\xe0\\xe6\\x98\\xff\\x08\\xf5\\x62\\xaa\\x1f\\x48\\x2b\\x95\\xe8\\x4a\\x07\\x91\\x4d\\xd8\\xf5\\x36\\x39\\x65\\xcc\\x21\\x71\\x3b\\x93\\x26\\x97\\xb0\\x5c\\x24\\xcd\\x31\\x11\\x26\\x54\\x98\\xc0\\x4f\\x10\\x89\\xf8\\x7c\\x1e\\xcc\\x83\\x90\\x65\\x30\\xbc\\x4c\\x86\\xc8\\x15\\x42\\x41\\xb2\\x08\\x91\\x09\\x92\\x13\\x04\\xfc\\x29\\x8d\\x9f\\xe3\\x42\\x50\\x42\\x32\\x8c\\x09\\x20\\x04\\x16\\x62\\x30\\xac\\x10\\x24\\x63\\x02\\x0c\\x53\\x60\\x0a\\x19\\x7f\\x19\\x22\\xc7\\x60\\x64\\x8a\\x9b\\x66\\x77\\x32\\x7a\\xbb\\x11\\x9f\\xe2\\x12\\xcf\\xb9\\x7c\\xec\\x85\\x5c\\x34\\xc5\\x81\\xeb\\x19\\xca\\xa1\\xa5\\x28\\xdb\\xd4\\x04\\xa8\\x2d\\x14\\x43\\x39\\x2d\\x14\\x0d\\xa6\\x64\\x22\\x60\\x9c\\x52\\x6f\\x24\\xec\\x7e\\xc7\\x12\\xff\\x05\\x4d\\xe6\\x8a\\x3b\\x88\\x5c\\xdc\\x84\\x39\\x28\\x12\\x7c\\xd6\\x61\\x94\\xf8\\x99\\x0c\\x92\\x05\\xcb\\x04\\x09\\x32\\x2c\\x05\\xe6\\x4d\\x56\\xce\\xe3\\xc9\\x14\\x29\\x02\\x99\\x48\\x01\\xcb\\x84\\x72\\x0c\\x62\\x4d\\x72\\x4d\\xff\\x4b\\xd7\\xb8\\x52\\x50\\xcc\\xfd\\xaf\\x71\\x99\\x72\\x69\\xe4\\x98\\x7f\\xfb\\x7c\\xf8\\xa5\\xe0\\xbf\\x9f\\x0f\\x6e\\x37\\x49\\x58\\x0e\\x56\\xa2\\x54\\x3d\\x64\\x91\\x02\\x40\\x40\\x67\\x9a\\x5c\\xa6\\x75\\x5d\\xa9\\x2f\\xdf\\x6c\\x29\\x5b\\x15\\xd9\\xe7\\xbb\\x06\\xf5\\xb4\\x1a\\xde\\x2d\\x17\\x5e\\x0f\\xdf\\xb3\\x35\\xf2\\xd6\\x8e\\x2f\\xd2\\xd3\\x93\\x5f\\xbb\\xdd\\x17\\x5b\\x9a\\xe8\\x5d\\x37\\x73\\xf1\\xd8\\x8c\\xc5\\x4b\\x62\\x32\\xae\\xff\\x92\\xad\\xa9\\x88\\x8f\\x35\\x7a\\x37\\x7b\\x05\\xc4\\x3b\\x96\\x4d\\x48\\xe5\\xab\\xd6\\x9a\\xb2\\xa8\\x4a\\x5f\\xdb\\xf1\\x8f\\xf6\\x17\\xb8\\x7d\\x1b\\x47\\x9c\\x23\\x05\\x77\\x2f\\x14\\xf8\\x1e\\xef\\x77\\x0e\\xfb\\x0a\\xce\\x3d\\xfa\\xd3\\x23\\x71\\x5f\\x22\\x04\\x8d\\x3e\\x7a\\x3c\\x21\\x2d\\x3a\\xb0\\xf4\\xfc\\xb4\\xff\\x03\\x67\\x99\\x8a\\x06\\xc0\\x99\\xe3\\x85\\x9c\\x07\\x73\\x04\\x5b\\x50\\x7a\\xd6\\x13\\xfa\\x5a\\xc7\\x9c\\x9b\\x47\\xc3\\x02\\x3a\\xba\\x5f\\xbb\\xd4\\x5f\\xe8\\x1b\\x8d\\x3f\\xbd\\xed\\x8f\\xa0\\x90\\x35\\x3f\\xa9\\xc3\\x95\\xf6\\xab\\xbf\\x84\\xb4\\x6e\\x79\\x0b\\x9a\\xbd\\xfd\\xa5\\x7d\\xeb\\x23\\x74\\xa1\\xaa\\xa2\\xcb\\x07\\x3e\\xe3\\xaa\\xc3\\x35\\x9d\\x41\\x1a\\x6e\\xdb\\x12\\x74\\xe3\\xb4\\xf4\\xa4\\xa3\\x9f\\x8c\\xdf\\x6e\\xda\\xb9\\xe9\\xbb\\xb1\\x85\\xfd\\x65\\x0a\\xb5\\xb7\\x7c\\xbf\\xbd\\x31\\x20\\xec\\xe1\\xa9\\x37\\x22\\x06\\x5a\\xb5\\x9b\\x13\\x65\\xd5\\xa5\\xa0\\x70\\x9c\\x6d\\xab\\x47\\xcf\\x8c\\x9d\\xfa\\x60\\x3b\\xb0\\x7a\\xd0\\x47\\xa9\\x6f\\x62\\xbb\\x1e\\x7a\\xcd\\xc8\\x86\\xe9\\x77\\xb6\\x72\\x7f\\x53\\x13\\x09\\x34\\xfd\\xa8\\xcf\\xbd\\xe0\\xda\\x3d\\xf1\\xbd\\xe7\\xbd\\x3d\\xef\\x59\\xeb\\x87\\x32\\xf2\\x72\\xb3\\x78\\xdd\\xa2\\xcf\\xab\\xf3\\xff\\xba\\x60\\x97\\x25\\xe6\\xd0\\xee\\xf3\\x59\\x3d\\xd2\\x35\\x73\\x9b\\x2b\\xf6\\x5e\\x6c\\x87\\x2f\\x24\\xf5\\x87\\xb4\\x1f\\xbb\\xff\\xf0\\x6e\\x4d\\xaf\\xc2\\xc2\\x9f\\x2e\\x36\\x77\\xad\\xc8\\xf5\\x68\\x8b\\x8f\\xd5\\x37\\x9e\\x4f\\xea\\x4f\\x0e\\xef\\x9a\\x77\\xc0\\x5b\\xe2\\x86\\x86\\xab\\x1b\\x8e\\x7e\\x26\\x75\\x8f\\x8a\\xd7\\xaa\\x83\\x7f\\x9d\\x69\\x4d\\xdd\\xbd\\x02\\x4e\\x63\\x8c\\x6d\\xf1\\xf1\\x48\\x73\\x5b\\xa6\\x2d\\xab\\x21\\x74\\xc3\\xcd\\xa2\\x86\\xc0\\x2a\\x32\\xc2\\xf0\\x2e\\x7b\\xfb\\x9b\\x03\\xe6\\xfa\\xd6\\x0d\\xd9\\xf4\\xdb\\x8f\\x53\\x54\\x49\\xb2\\x69\\x47\\x86\\xdf\\x8f\\x0c\\x3a\\x14\\xe1\\x19\\x7a\\xab\\x64\\xce\\x93\\xe8\\xbf\\x0f\\xdc\\x5f\\x7d\\x64\\x67\\x57\\x70\\xe7\\xaa\\x6e\\x2b\\xbb\\xec\\x02\\x19\\x5c\\x32\\x72\\x6c\\xc1\\xdd\\x83\\xce\\xa6\\xaa\\x43\\x2d\\x4d\\xd3\\x8b\\x19\\x9d\\x27\\xe2\\x81\\x7b\\x84\\x7e\\x5a\\xdb\\x90\\xd3\\x01\\x3d\\x8d\\xbe\\x9e\\x74\\x54\\xdc\\xc8\\xe8\\x3c\\x07\\xc7\\xae\\x98\\xe2\\xbe\\xae\\xf9\\x41\\xd2\\x53\\x9c\\xfa\\xdb\\xda\\xb5\\x05\\x5f\\x9e\\xf8\\xd6\\x5a\\x87\\xa7\\x7c\\x69\\xf0\\x12\\x71\\x5f\\x97\\x37\\x56\\x57\\xc4\\x7d\\xab\\xf9\\x64\\xc6\\xaa\\xbc\\x7d\\xca\\xaa\\xd4\\xea\\xec\\x79\\x17\\xfb\\xb6\\x11\\x81\\x86\\x83\\x85\\x08\\x39\\x21\\x0a\\x9b\\x63\\x3b\\x79\\xb1\\x04\\xa5\\xba\\xd7\\x57\\x3e\\xbd\\xdb\\x19\\x54\\xb1\\x08\\x59\\x57\\xf5\\xc1\\x28\\x30\\xf8\\xd2\\x8e\\xa2\\x95\\x7f\\xdb\\xe7\\xf8\\xe6\\xd6\\xec\\x9f\\xc2\\xe6\\x9a\\x50\\xfc\\xec\\xc2\\x73\\x45\\x89\\x5b\\x07\\x8c\\xcd\\x0b\\x40\\xdb\\xd9\\x8a\\x41\\x30\\xf2\\x14\\xbe\\xb3\\xf0\\xf7\\xa3\\xc1\\x75\\xc0\\x1e\\x22\\xf4\\x1a\\xe7\\xed\\x3a\\x36\\x51\\xdb\\x93\\xba\\x69\\xaf\\xa7\\x3e\\xb2\\x56\\x70\\x62\\xbc\\x19\\x2b\\xd9\\x7b\\x09\\x39\\x92\\x96\\x91\\x1a\\xa5\\x9b\\xa1\\x2a\\x0c\\x1d\\x8d\\xd3\\x6d\\xb8\\x71\\x3b\\xf7\\x9d\\x13\\x1f\\x2b\\xab\\x3c\\xe9\\xf9\\x37\\xda\\x95\\xb7\\x02\\xa5\\x1d\\x41\\xb1\\xf4\\xe2\\x91\\x33\\xc0\\xbd\\xd0\\x7f\\x24\\xde\\xe8\\xd2\\x7d\\xea\\x3e\\x5e\\x33\\x4c\\xdc\\x3b\\x7d\\x6b\\x22\\xb0\\x17\\x3a\\xab\\x9e\\xf5\\xc5\\x8a\\xb3\\x3f\\xd6\\x0f\\xe6\\x60\\xb3\\xdb\\x86\\x7e\\xa0\\x8c\\xe1\\x95\\xd6\\x57\\x7d\\x0b\\x0c\\x66\\xbd\\xf2\\xf2\\xd2\\xde\\x24\\xef\\xe1\\x82\\x25\\x51\\xfd\\xcb\\x93\\x2b\\x0f\\xff\\x8e\\x7f\\xee\\xc1\\x9a\\xd8\\xdb\\x9d\\x29\\x27\\x07\\xc9\\xb0\\xba\\x35\\x71\\xc3\\xdb\\x72\\xda\\xc5\\x21\\x4b\\x6f\\x94\\x8c\\x84\\x14\\xf3\\xc2\\xa7\\xad\\xe1\\x35\\xac\\xdb\\xb9\\xf1\\xd2\\xbc\\xae\\x9a\\xab\\x2b\\xbf\\x07\\x63\\x53\\xb7\\xab\\xde\\x68\\x7e\\xb9\\x35\\xb5\\xb3\\x4e\\x67\\x0a\\x6e\\xc9\\x78\\xb9\\x81\\x6e\\x19\\x2a\\x8a\\x8c\\x3a\\xf1\\x3a\\x16\\xfa\\xf0\\xb0\\xcd\\xf3\\x84\\x45\\x72\\x7f\\x0a\\xfc\\xee\\xaa\\x6d\\x6e\\xec\\x57\\x01\\xaf\\xef\\x1a\\x89\\xf0\\x66\\x44\\xbe\\x2f\\x2b\\x8d\\x6e\\x19\\xfa\\xfc\\xc3\\xe8\\x82\\xb1\\xd0\\x59\\xdf\\xe0\\xe6\\x7b\\xe5\\x71\\x66\\xa2\\xd4\\x90\\x1b\\x3d\\xf7\\xd4\\xa7\\x07\\x4b\\x0f\\xac\\x5d\\xda\\x60\\x33\\x77\\xf4\\x69\\xd1\\xd3\\x8b\\xba\\x5f\\x89\\xaa\\xd1\\xa2\\x57\\xf4\\x3d\\xbd\\x91\\xe1\\xf3\\x0f\\xb5\\xf4\\x6c\\x15\\x7f\\xd4\\x07\\xa7\\x9f\\xfc\\x2a\\xa8\\x0f\\x96\\x71\\x2a\\x62\\xda\\x5a\\xe2\\xe6\\x67\\xf5\\x8c\\x63\\x0b\\xfb\\xc6\\xe1\\x62\\x55\\xd9\\xe5\\x2d\\x97\\xe8\\xc6\\xac\\x82\\xd2\\xab\\x01\\x87\\x43\\x8e\\x5d\\xfd\\x43\\x62\\x6f\\x8c\\x24\\xe7\\x78\\xd3\\xf4\\xfe\\x5f\\xa4\\xba\\xff\\x2c\\x36\\xdf\\xb9\\xb8\\x63\\xfc\\x7e\\x45\\xf4\\x9d\\x89\\xff\\x5f\\x0f\\x28\\x43\\xdb\\xf7\\x2d\\xda\\x52\\xab\\xf2\\xff\\x90\\x69\\x0a\\x95\\xfc\\xc3\\xe4\\xf5\\x9e\\x7f\\x06\\x00\\x00\\xff\\xff\\x8a\\xe5\\xd7\\x55\\x8e\\x07\\x00\\x00\")\n\nfunc imagesRobotsIcon_03PngBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_imagesRobotsIcon_03Png,\n\t\t\"images/robots-icon_03.png\",\n\t)\n}\n\nfunc imagesRobotsIcon_03Png() (*asset, error) {\n\tbytes, err := imagesRobotsIcon_03PngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"images/robots-icon_03.png\", size: 1934, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _indexHtml = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x34\\x8f\\x41\\x72\\xc3\\x20\\x0c\\x45\\xf7\\x3e\\x85\\xaa\\x7d\\xa3\\x6d\\x17\\xc0\\x21\\x7a\\x03\\x02\\x4a\\x51\\x4a\\x6c\\x0f\\x52\\x32\\xf5\\xed\\x3b\\x1e\\x91\\x15\\xff\\xf1\\x67\\xf4\\xa4\\xf0\\x51\\xb7\\x62\\xc7\\xce\\xd0\\xec\\xd1\\xd3\\x12\\xce\\x07\\x7a\\x5e\\x7f\\x22\\xf2\\x8a\\x69\\x01\\x08\\x8d\\x73\\x3d\\x03\\x40\\x78\\xb0\\x65\\x28\\x2d\\x0f\\x65\\x8b\\xf8\\xb4\\xdb\\xe7\\x17\\xa6\\xc5\\x3b\\x13\\xeb\\x9c\\xbe\\xb7\\x2b\\xe7\\xe7\\x5f\\x20\\xc7\\xd9\\x75\\x59\\x7f\\x61\\x70\\x8f\\xa8\\x76\\x74\\xd6\\xc6\\x6c\\x08\\x6d\\xf0\\x2d\\x22\\x15\\x55\\xca\\xfb\\xde\\xa5\\x64\\x93\\x6d\\xbd\\x14\\x55\\x17\\x93\\x9b\\xcf\\x78\\xdd\\xea\\x31\\x77\\xa8\\xf2\\x02\\xa9\\x11\\x87\\x9b\\x70\\x7e\\x53\\x95\\xd7\\x5b\\xa7\\x65\\xc8\\x6e\\xa0\\xa3\\x44\\xa4\\xbb\\x92\\xf3\\xe5\\xae\\x98\\xc2\\x04\\x17\\xf8\\xd8\\x40\\x7e\\xfc\\x7f\\x00\\x00\\x00\\xff\\xff\\x96\\xf5\\xb6\\x39\\x0d\\x01\\x00\\x00\")\n\nfunc indexHtmlBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_indexHtml,\n\t\t\"index.html\",\n\t)\n}\n\nfunc indexHtml() (*asset, error) {\n\tbytes, err := indexHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"index.html\", size: 269, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _jsKeep = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x01\\x00\\x00\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\")\n\nfunc jsKeepBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_jsKeep,\n\t\t\"js/.keep\",\n\t)\n}\n\nfunc jsKeep() (*asset, error) {\n\tbytes, err := jsKeepBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"js/.keep\", size: 0, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _jsScriptJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xfd\\xfb\\x73\\xdb\\x38\\xb6\\x20\\x8e\\xff\\xbe\\x7f\\x85\\xc4\\x3b\\x97\\x4d\\xb4\\x10\\xda\\x4a\\x3a\\xfd\\xa0\\x82\\x71\\xa5\\x6d\\xf7\\x74\\x6a\\xe2\\x38\\x6b\\x3b\\xdd\\x7b\\xbf\\x6a\\x8d\\x07\\x26\\x21\\x0b\\x1b\\x8a\\xe0\\x80\\xa0\\x1d\\x8f\\xc4\\xff\\xfd\\x5b\\x78\\x91\\xe0\\x43\\xb2\\xdd\\xb7\\xf7\\xee\\x7e\\xea\\x4e\\xa5\\x2a\\x16\\xf1\\xc6\\x01\\x70\\x70\\x70\\x9e\\xe3\\x65\\x99\\xc5\\x82\\xb2\\x6c\\x44\\x02\\x01\\x33\\xc8\\xc1\\xa6\\x4e\\x61\\x01\\x85\\x05\\xd8\\xd0\\x65\\x30\\xce\\xe6\\x74\\xa1\\x7f\\x09\\xf5\\xeb\\x0e\\xf3\\x51\\x89\\x3c\\x5b\\xd4\\x43\\x48\\x3c\\xe4\\x84\\x2d\\x47\\x9c\\xfc\\xa3\\xa4\\x9c\\xf8\\xbe\\xf9\\x31\\x93\\x75\\x0a\\xdf\\x2f\\x01\\x27\\xa2\\xe4\\xd9\\xa8\\x0c\\x28\\x1c\\x1f\\x02\\x99\\x8e\\x6d\\x1a\\x36\\x69\\xb2\\xd5\\x18\\x65\\xe4\\x7e\\x74\\xca\\x39\\xe3\\x81\\x77\\x8c\\xb3\\x8c\\x89\\xd1\\x92\\x66\\xc9\\x68\\xcd\\x92\\x32\\x25\\xa3\\xaf\\xbc\\x09\\x9d\\x78\\x5f\\x79\\x60\\x26\\x56\\x9c\\xdd\\x8f\\xe2\\x30\\x66\\x09\\x41\\xde\\xd9\\xf9\\xc9\\xa7\\xf7\\xa7\\xd7\\x1f\\xce\\xaf\\xae\\x7f\\x3a\\xff\\xf4\\xe1\\xc4\\x83\\x71\\x25\\xdb\\x4b\\x91\\x1c\\x3b\\xda\\x90\\x2f\\x39\\xe3\\xa2\\x88\\x36\\x55\\x35\\x93\\x73\\x98\\x1f\\x2e\\xc2\\x18\\xa7\\x69\\x90\\x86\\x26\\x0b\\xda\\xd9\\x04\\x44\\x4f\\x30\\x43\\xaa\\xe0\\x74\\x31\\x27\\x8b\\x99\\x19\\x2a\\x0b\\xb2\\xed\\x96\\x80\\x0a\\xa6\\xb0\\xa9\\x48\\xa0\\x06\\x5d\\x65\\x0a\\xc9\\x1e\\x6d\\x66\\xb5\\x64\\x3c\\x90\\xad\\xe1\\xa7\\x80\\x0b\\x52\\x74\\x38\\xa3\\x6f\\x78\\x98\\x92\\xec\\x56\\xac\\x66\\x74\\x32\\x01\\x2c\\xe0\\x12\\xe6\\xf5\\x08\\xaa\\x60\\x33\\x8d\\xe6\\xcd\\x60\\x65\\xe7\\xce\\xaa\\xf1\\x00\\x6c\\x34\\x68\\x1c\\x40\\x16\\x44\\x5c\\xd1\\x35\\x61\\xa5\\x18\\xad\\x70\\x31\\x92\\x40\\xbd\\x21\\x24\\x1b\\x25\\x64\\x49\\x33\\x92\\x78\\xa0\\x72\\x56\\x7d\\xa0\\x7e\\x9c\\x12\\xcc\\x9f\\xda\\x02\\x96\\x00\\xa4\\xcb\\x20\\x47\\x08\\x35\\x1d\\xdb\\xc5\\x6e\\x52\\x02\\x02\\xf5\\x46\\x50\\x25\\xf9\\x76\\x3b\\xce\\x81\\xef\\xf7\\x6b\\xe4\\x4e\\x2b\\xb0\\x5b\\x5d\\xf0\\x87\\x8d\\x2d\\xa7\\x52\\xaa\\x18\\x8b\\x78\\x15\\x08\\xb0\\x71\\xb3\\xf4\\x5a\\x67\\x65\\x9a\\xc2\\x76\\xa1\\x76\\x01\\xb1\\xa2\\x85\\x2e\\x50\\x35\\xf3\\xa1\\x66\\x3e\\x09\\x42\\xc8\\x05\\x84\\x1d\\x9f\\x9b\\x16\\x10\\x3d\\x23\\x59\\x96\\x6d\\xb7\\xe3\\x04\\xf8\\xfe\\x50\\x9d\\xa4\\xd5\\x12\\xec\\x36\\xe1\\x0c\\x3d\\x09\\xc8\\xf0\\x9c\\x12\\x77\\x4e\\xfd\\x19\\x25\\xee\\x8c\\x5a\\xf3\\x29\\x02\\xb0\\xb9\\xf3\\xfd\\x95\\xef\\x07\\x77\\x68\\x3c\\x85\\x2b\\xb3\\xdb\\x8e\\xd6\\x68\\x15\\xc6\\x2c\\x8b\\xb1\\x08\\xd6\\x20\\x7a\\x40\\x2f\\xa6\\x70\\x6d\\xf2\\x7c\\xbf\\x0c\\x80\\xb3\\xc6\\x65\\xa0\\xd1\\xc1\\x9d\\x3e\\x2a\\x04\\xe1\\xa0\\x00\\xb3\\x3b\\x34\\x3e\\x9c\\xd9\\x0d\\x2f\\x90\\xad\\x3c\\x13\\x33\\xb0\\x91\\xc9\\x2b\\xb4\\x86\\x6b\\x34\\x5f\\xcc\\x26\\x93\\x87\\x37\\x62\\x06\\x56\\xbe\\xbf\\x9a\\x3f\\x2c\\x42\\x5e\\x66\\x01\\x98\\xa9\\x0e\\x9b\\x5a\\xd5\\x0a\\xa9\\xb9\\xa9\\x31\\xca\\x35\\x70\\xa6\\x10\\xcb\\x6d\\x2f\\xf7\\x29\\x2d\\xc2\\x65\\x99\\x21\\x02\\xd5\\x4f\\xcc\\x39\\x7e\\x40\\xa2\\x29\\x97\\x06\\x60\\xa3\\xd0\\x40\\x0e\\x13\\xb8\\x44\\xc2\\x9e\\x4a\\xb4\\xa9\\x66\\x35\\xea\\x0b\\x34\\x58\\xf3\\xa1\\x03\\xda\\x6c\\xb7\\xa3\\xe6\\x67\\xc4\\x0d\\xb4\\x09\\xd8\\xe4\\x88\\x57\\xb2\\x76\\x32\\x54\\xdb\\x5d\\xd6\\x23\\xf7\\x23\\x62\\x4d\\x0b\\x09\\x62\\x55\\x15\\x68\\xec\\xb7\\x52\\xe0\\xd1\\x53\\x96\\xe0\\x98\\x2d\\xc3\\x8c\\x7c\\x11\\x57\\x34\\xfe\\x8c\\xba\\xe8\\x49\\x28\\x4c\\xf9\\x56\\x4e\\x39\\xc0\\xfc\\xb6\\x5c\\x93\\x4c\\x14\\x06\\x76\\x2f\\xa6\\x1a\\xc3\\x76\\x92\\xff\\x3c\\x05\\x76\\x75\\x32\\x34\\x9d\\x65\\x6f\\xba\\x05\\x66\\xd9\\x64\\x02\\xc4\\x3c\\x7b\\x31\\x5d\\xa0\\x3a\\x6f\\x9e\\x2d\\x66\\xeb\\x30\\x2f\\x8b\\x55\\x20\\x7b\\xd4\\xb0\\x07\\x70\\x3a\\x46\\xf5\\x5a\\x6d\\xb7\\x77\\xdb\\x2d\\x0e\\x4a\\x50\\xc1\\x38\\xcc\\x39\\x13\\x4c\\x42\\x40\\xae\\x2b\\x72\\xa1\\x6c\\x96\\x2b\\xc4\\x79\\x9e\\x3e\\xe8\\x9d\\xdb\\xac\\x1b\\xa8\\xe0\\x32\\x14\\x54\\xa4\\x04\\x79\\x37\\x9c\\xdd\\x17\\x84\\x7b\\x70\\x19\\x9a\\x9f\\x68\\x7c\\x08\\x97\\x21\\xc9\\xee\\xd0\\x46\\x96\\xc3\\xfc\\xf6\\x4e\\x42\\x6a\\x19\\xde\\x11\\x5e\\x50\\x96\\x21\\xcf\\x6b\\x3e\\x0a\\x5d\\x88\\x65\\x28\\x95\\x65\\x93\\xe4\\x3d\\x2d\\x04\\xc9\\x08\\x57\\xdf\\x2c\\x8b\\x89\\xfe\\xb1\\x5c\\xaa\\xbf\\x9c\\xac\\xd9\\x1d\\x69\\x95\\xd1\\x49\\x6f\\xd3\\xd4\\xa6\\x16\\x2a\\x99\\xac\\xa9\\x50\\x3f\\x6e\\x68\\x96\\xd0\\xec\\xb6\\xb5\\x28\\x3d\\xac\\x99\\x73\\x16\\x93\\xa2\\xb0\\x85\\x47\\x54\\xe3\\xcd\\xa2\\xcc\\xe5\\x26\\x54\\x48\\x13\\x2e\\xc3\\xf8\\x3e\\x71\\x81\\xa4\\x8f\\xaf\\x77\\xe0\\xa9\\xbc\\x55\\x42\\xf9\\xd3\\x3a\\x51\\x45\\x77\\x74\\x51\\xae\\x71\\xf1\\xb9\\xdf\\xc9\\xe8\\xb0\\xaa\\xe0\\xa6\\x5a\\xc0\\x97\\xfd\\xfb\\xc4\\x2b\\x0b\\x32\\x2a\\x04\\xa7\\xb1\\xf0\\x66\\xad\\xcb\\xa5\\x6a\\x4e\\x11\\xd7\\xd5\\x5f\\x3d\\x52\\x5d\\xee\\x37\\x8e\\x48\\xe0\\x71\\x82\\x63\\x71\\x90\\xd2\\x9b\\x03\\x9a\\xdd\\x61\\x4e\\x71\\x26\\x3c\\x00\\x59\\x3b\\xeb\\xf4\\x0b\\x89\\x4b\\xd9\\xd6\\x69\\x76\\x47\\x39\\xcb\\xe4\\x1e\\xf4\\x40\\x18\\xe3\\xec\\x53\\x41\\x4e\\xce\\xcf\\x20\\x46\\x1b\\xbd\\xeb\\xa2\\x29\\xbc\\xc1\\xf1\\xe7\\xc8\\x9d\\x58\\xc0\\xa0\\x25\\x1b\\xe4\\x10\\x7e\\xa6\\x85\\x60\\xfc\\x21\\x94\\xe5\\x46\\xf7\\x54\\xac\\xe4\\x05\\x86\\x47\\x27\\xe7\\x67\\x1e\\x80\\xd8\\x9e\\x16\\x34\\x85\\xf7\\x34\\x4b\\xd8\\x7d\\xb8\\x72\\xca\\x07\\x40\\xd2\\x0a\\xf5\\x64\\x71\\x05\\x37\\x8f\\x0d\\x33\\xfa\\xf6\\x10\\x0e\\xce\\x32\\x9a\\x7e\\xf7\\xba\\x5a\\xc0\\x6f\\x9e\\x0e\\x68\\x93\\x2d\\x61\\xc7\\x10\\x09\\xe3\\x15\\x4d\\x93\\x0b\\x56\\x0a\\x52\\xc8\\x93\\xcd\\xea\\x83\\x8c\\x61\\x09\\x63\\x74\\x08\\x53\\xc4\\xec\\x21\\x8e\\xdf\\xa4\\xb3\\xc9\\x24\\x06\\x74\\x19\\x94\\x88\\xcd\\xe3\\x05\\x1c\\x97\\x21\\x2d\\x4e\\xc8\\x12\\x97\\xa9\\xf0\\x7d\\xf5\\xf5\\x81\\x89\\x9f\\x58\\x99\\x25\\xbe\\x1f\\x60\\xc4\\x83\\x52\\x75\\x07\\x6a\\x92\\x2c\\xe4\\xaa\\xaf\\xb0\\xcc\\x8a\\x15\\x5d\\xca\\x4b\\x09\\x62\\xb5\\x90\\x39\\x22\\x61\\xa2\\x5b\\x52\\xc3\\x91\\xa3\\xc9\\x7d\\x3f\\x58\\x22\\x1a\\x92\\x2f\\x82\\xe3\\x58\\x7c\\xc4\\x1c\\xaf\\x8b\\x20\\x0f\\x73\\x2c\\x56\\x12\\x57\\xd8\\x56\\xe5\\xb6\\x2d\\x02\\x01\\x97\\x30\\x83\\x73\\x02\\xf3\\x85\\xc6\\x7a\\x09\\x22\\x61\\x66\\x86\\x53\\xb7\\x99\\x0c\\xb6\\x99\\x3c\\xd6\\x66\\x62\\xda\\xec\\x57\\x25\\xb6\\xaa\\xa5\\xa4\\x96\\x47\\xed\\xba\\x0b\\x10\\x49\\x94\\x54\\x69\\x90\\xbb\\xeb\\xa4\\xef\\xba\\x80\\x8c\\x68\\x56\\x08\\x9c\\xc5\\x12\\xb7\\x0b\\x00\\x9a\\xb3\\x78\\xf5\\x90\\x93\\x36\\xcd\\x2a\\x2f\\xdf\\x11\\x1e\\xc5\\x29\\x2e\\x8a\\x11\\x2e\\x46\\x78\\x54\\x5f\\x0f\\xa0\\x82\\xd8\\x3d\\x8c\\x0e\\x09\\xae\\xfa\\x6a\\x50\\xf4\\xe1\\x2c\\x7b\\x23\\x5c\\xd4\\xbc\\xd1\\x47\\x49\\x48\\x94\\xcc\\x43\\x92\\x95\\x6b\\xc2\\xf1\\x4d\\x4a\\x90\\xfb\\xb1\\xdd\\x8e\\xa7\\x90\\xcb\\x9b\\x7c\\x49\\x6f\\x4b\\x9d\\x3f\\x3e\\x84\\xde\\x1d\\x4e\\x4b\\xe2\\xd1\\x6c\\xc4\\x7d\\x3f\\xe0\\xe1\\x3d\\xa7\\xc2\\xe4\\x01\\x78\\x7e\\xf3\\xbf\\x49\\x2c\\x42\\x4d\\xcd\\x7d\\xe4\\x2c\\x27\\x5c\\x3c\\x04\\x04\\xf2\\xf0\\x33\\x79\\x90\\xa4\\xad\\xa5\\x6d\\xeb\\x71\\x9b\\xd7\\x82\\x5d\\x05\\xdf\\x27\\x81\\x68\\x50\\x3f\\xcc\\x00\\xe4\\x2a\\x0d\\x72\\x00\\x85\\xbc\\xe0\\x20\\x95\\xe7\\x3c\\x3c\\xf8\\x88\\xc5\\xea\\x93\\xa0\\x69\\xe1\\x01\\x58\\xec\\x80\\x83\\x6a\\x1c\\x62\\xb0\\x61\\x96\\x80\\xd1\\x17\\x85\\x5c\\xc1\\x0c\\xaf\\x09\\x12\\xf6\\x5b\\x2e\\x2d\\xca\\xf4\\xd7\\x3f\\x4a\\xc2\\x1f\\x10\\xd7\\x1f\\x7a\\xff\\x22\\x5c\\xd5\\x8f\\x0c\\x02\\xd5\\x8d\\x33\\xdf\\x7c\\x26\\x0f\\x91\\x27\\x1f\\x15\\x67\\xf2\\x0e\\xf6\\xa0\\x02\\x4c\\xd4\\x5e\\xf0\\x66\\x11\\x68\\x68\\xf0\\xc6\\xff\\x94\\xcd\\x07\\x42\\x22\\xac\\x7a\\x6f\\xd5\\x69\\x58\\x13\\x2b\\x05\\x3a\\x84\\x25\\x22\\xf5\\x9a\\x95\\x69\\x8a\\x10\\xf6\\xfd\\xe2\\x4d\\x39\\x9b\\x4c\\x0a\\x20\\x8f\\x1a\\x99\\x17\\x0b\\x98\\x41\\x56\\x6f\\x44\\x5c\\x55\\x0b\\x00\\x89\\x24\\x02\\x1a\\x74\\x53\\x48\\x74\\xe3\\x42\\x2b\\xfa\\xb6\\x5a\\xc0\\xd7\\x4f\\x45\\xb5\\xe1\\x81\\x5c\\x45\\xb9\\x2f\\x0b\\x85\\x62\\x37\\x31\\xcb\\x84\\x24\\x25\\x64\\x4a\\xb4\\x51\\xd0\\xe1\\x11\\xd7\\x60\\xe2\\x21\\x2d\\x2e\\xf4\\x0b\\x24\\xa9\\xe0\\x1a\\x7f\\x26\\xb2\\xdb\\xa8\\xdb\\x93\\x19\\xae\\x02\\xaf\\x69\\xce\\xd6\\xb7\\x75\\x4c\\x51\\xdd\\xc8\\xcf\\x9c\\x2c\\x9f\\xdb\\x88\\xac\\x53\\x37\\x22\\x38\\xce\\x0a\\x2a\\x6b\\x5f\\xb1\\x5e\\x43\\x43\\x2d\\xb8\\x15\\xea\\x56\\x38\\xc9\\x53\\x1c\\x93\\x5f\\xe9\\xc0\\x94\\x86\\x1a\\x71\\xca\\xd7\\x6d\\xdc\\xb2\\x1f\\xbb\\x37\\xcd\\xee\\x79\\xe8\\xc2\\x9d\\xeb\\x83\\x99\\xf5\\xac\\x57\\x25\\xfa\\xae\\x5a\\xc0\\x6f\\x9f\\x71\\x21\\x38\\x58\\x68\\x54\\x02\\x4b\\x04\\xce\\x17\\x30\\x43\\xc4\\x0e\\x3a\\x70\\x9f\\xb1\\x0e\\xb8\\xb3\\x23\\x79\\x3a\\x15\\x09\\x07\\xa0\\x17\\xcc\\xff\\x76\\x70\\xf4\\x6f\\x8b\\x09\\xf0\\x40\\xe4\\x7d\\xed\\x21\\x84\\x48\\x9d\\xef\\x15\\x79\\x8a\\xe5\\xb5\\xec\\x05\\xe1\\xd7\\x47\\xaa\\xc4\\x6f\\xbf\\x79\\x13\\x52\\x81\\x59\\x39\\x27\\x0b\\xb4\\x59\\xcb\\x43\\x43\\x78\\x24\\xf1\\xde\\x05\\xb9\\x3d\\xfd\\x92\\x07\\xde\\xdf\\xbc\\x49\\x36\\xf1\\xfe\\xe4\\x41\\x8f\\x7a\\x00\\xaa\\x53\\xf9\\x01\\xaf\\x49\\x11\\x89\\x1a\\x71\\xc8\\xca\\x06\\xb5\\xee\\xa4\\x04\\xb0\\xcc\\x62\\x0a\\x15\\xbd\\xc0\\x45\\x41\\x6f\\x33\\xcf\\xa0\\x8d\\x7f\\x68\\x6c\\x71\\x10\\x05\\x73\\xfc\\xe2\\x9f\\x6f\\x5f\\xfc\\xff\\xae\\xff\\xb4\\x30\\xbf\\x0e\\x5f\\xfc\\x70\\xfd\\xa7\\xc5\\xd7\\x60\\x3b\\xff\\x3a\\x0c\\xc0\\x6f\\xf3\\xdf\\x16\\xbf\\xfd\\x36\\xd9\\x6e\\xaa\\xbf\\xfd\\x69\\x71\\x70\\x0b\\x4b\\x49\\x0a\\xc6\\x68\\x43\\x8b\\xb7\\x37\\x05\\x4b\\x4b\\xe1\\x1e\\x74\\x87\\xda\\x92\\x30\\x08\\xe3\\x15\\xe6\\x6f\\x45\\x70\\x08\\x2a\\xf8\\xbf\\x19\\xcd\\x3a\\x28\\xc1\\x4c\\xa4\\x81\\xf5\\xc1\\x6f\\x07\\x5f\\xff\\xe9\\x00\\x7a\\x07\\x1e\\x98\\x88\\x0a\\xba\\xd7\\x8d\\x9e\\x7d\\xbf\\x27\\xb5\\x8e\\x61\\x03\\xa0\\x76\\xad\\xa2\\xd3\\xa3\\x46\\x40\\xb2\\x0a\\x64\\x28\\x0b\\x0d\\xe4\\x25\\xae\\x71\\x9a\\x80\\x14\\x09\\x9d\\x15\\x30\\x45\\xf5\\x8f\\x69\\x7d\\x37\\x96\\x69\\xaa\\x50\\x82\\x7a\\xf0\\xd4\\x57\\xfb\\x92\\xf1\\x53\\x1c\\xaf\\x82\\x76\\x67\\x85\\x5c\\x5d\\x3a\\x17\\x93\\xe9\\xa2\\x02\\xb0\\xa8\\x20\\xcd\\xe4\\x42\\x0c\\x0e\\x4c\\x20\\xb1\\xdd\\x6e\\xaa\\x99\\xbd\\xa6\\xfa\\xa0\\xd9\\xb5\\x50\\x47\\x8b\\xaf\\xe7\\x47\\x8b\\x23\\xb9\\x5a\\x72\\x79\\xea\\x66\\x15\\xb6\\x97\\x4f\\x16\\x84\\xb7\\x5b\\xb3\\x07\\xa1\\x77\\x24\\xd7\\x05\\x87\\x45\\x4a\\x63\\x12\\xbc\\x98\\x02\\x5b\\xc4\\xa4\\x1c\\xc2\\x17\\x53\\x00\\x35\\x92\\x15\\x73\\xbc\\x30\\xf3\\xf6\\xbc\\x8a\\xa4\\x05\\x19\\x31\\xf5\\xc4\\x18\\xab\\x2c\\xf8\\xd5\\x19\\x2d\\x0a\\x49\\x85\\x7b\\xff\\x5e\\x78\\x23\\x05\\x3e\\x22\\x08\\x1f\\x2d\\x19\\x1f\\xc9\\x6b\\x45\\xa5\\x7f\\x05\\x31\\x24\\x9a\\x80\\xa0\\x66\\x52\\x66\\x2c\\x48\\xa1\\x71\\xf5\\xda\\x0a\\x69\\xa1\\x5f\\x5d\\xaa\\xcb\\xa3\\x80\\xaa\\x0e\\xe6\\xd9\\x64\\xb2\\x80\\xb6\\x4b\\xda\\xf4\\xa7\\xea\\x8f\\xfe\\x6d\\xf4\\xef\\x45\\xb7\\xaf\\x0c\\x12\\x00\\x22\\x5d\\x1d\\xd2\\x0a\\xb8\\x1b\\xeb\\xb7\\x83\\xdf\\x8e\\xb6\\xf2\\xbf\\xdf\\x0e\\xd4\\x9f\\x83\\x5b\\xb5\\xcf\\xea\\xfd\\xa2\\x2e\\x9e\\xa8\\xff\\x26\\x24\\x66\\x2b\\x1c\\xfc\\x76\\x14\\x84\\x5f\\x83\\x3f\\x1d\\xd4\\xb7\\x8c\\xf0\\x7d\\x2a\\xb7\\x4d\\x41\\x02\\x31\\x9f\\x2e\\x40\\x05\\xdd\\x7b\\x6d\\x68\\xaf\\xba\\x3b\\xdd\\xb4\\x06\\x3d\\xcf\\x54\\xec\\xd6\\x6a\\xf6\\x6b\\xdc\\xbe\\x1c\\x09\\x98\\x65\\xbe\\x1f\\x08\\x24\\x8e\\x70\\x90\\x41\\x01\\xa2\\x0c\\x98\\x7b\\x8a\\x86\\x12\\xcf\\x65\\xb7\\x74\\xf9\\x10\\x08\\xb8\\x51\\xcf\\xc0\\x9f\\x18\\x5f\\x63\\x11\\x79\\x37\\x1c\\xc7\\x9f\\x89\\x28\\xbc\\xaa\\x9e\\x01\\x3f\\x8a\\xdb\\x77\\x31\\x01\\x13\\xef\\xc8\\x9b\\xf0\\xa8\\x97\\xde\\x42\\xbd\\xb1\\x44\\xbd\\x6d\\xb4\\x12\\xbd\\x7a\\x0d\\xff\\x51\\x44\\xaf\\xbe\\xdd\\x4b\\xae\\x7f\\xf7\\xfc\\x87\\x8d\\x21\\xa4\\x6a\\xec\\xd5\\x60\\x3b\\x0f\\x84\\x35\\xf2\\xd7\\x98\\x2e\\x3c\\x50\\xd4\\xae\\xc2\\x71\\x3c\\xd8\\x54\\x90\\xc1\\xcd\\x12\\xa7\\xc5\\x43\\xef\\x9a\\xa2\\xcb\\x80\\xcc\\xc5\\xc2\\xa5\\x79\\x0d\\xb9\\xf9\\x46\\x62\\xde\\xaf\\xfe\\x3c\\x2a\\x56\\xac\\x4c\\x13\\xf5\\xf8\\x5b\\xe1\\x3b\\x32\\xc2\\x23\\xef\\xab\\x89\\x98\\x7c\\xe5\\x8d\\x72\\xce\\xf2\\xaf\\xe4\\x35\\x28\\xfb\\x8a\\x58\\x68\\x69\\xd8\\xf3\\x65\\x80\\x01\\x34\\x84\\x00\\x93\\xef\\xf2\\xb8\\x72\\x09\\x10\\xaa\\x2f\\x2c\\x3d\\xc4\\xe8\\x07\\xa8\\x26\\x11\\x4d\\x7f\\x78\\x0d\\x77\\x4e\\x37\\xfa\\x56\\xd2\\x28\\xdf\\x3f\\xfb\\x91\\xa3\\x2e\\x51\\xc1\\x2c\\x1b\\xc7\\x50\\x75\\xc2\\xa5\\xea\\xb2\\xfe\\xb3\\xf3\\x87\\xa7\\xac\\x0e\\xfc\\x17\\x25\\xff\\x7f\\x88\\x92\\xdf\\xbd\\xe7\\x8b\\xdd\\x37\\x7c\\xd9\\xce\\xba\\xc7\\x3c\\xa3\\xd9\\xad\\x07\\x60\\xdc\\x7f\\x1c\\xa4\\xfb\\x1f\\x07\\x90\\xc2\\x02\\x96\\x30\\xed\\x3d\\x12\\xda\\x0f\\x04\\xb1\\xb2\\xcf\\x83\\xe6\\xca\\x6c\\x50\\x54\\x73\\x59\\x07\\x75\\x79\\xd3\\x0c\\xbd\\xcd\\x18\\x27\\x97\\x31\\x67\\x69\\xfa\\x23\\x59\\xe1\\x3b\\xca\\x38\\x1a\\x8f\\xcd\\xf3\\xa2\\x7e\\x4e\\xa3\\xf1\\x18\\xdb\\x24\\xfb\\xa6\\x46\\xe3\\x31\\xd5\\x69\\x2c\\x3b\\xcd\\x04\\xe1\\xa8\\xb0\\x9f\\xef\\x09\\xbe\\x23\\xa8\\xd4\\x9f\\x2b\\x9c\\x25\\x29\\xe1\\x28\\x75\\x1f\\x29\\xe6\\x7d\\x82\\xf3\\x9c\\x64\\xc9\\xb1\\x7c\\xf6\\xf7\\x5e\\x28\\xf2\\xb6\\x0e\\x84\\xbb\\x87\\x09\\xf4\\xd4\\x49\\x0e\\x9d\\x6a\\xa3\\x75\\x59\\x68\\x2e\\x08\\x1e\\xdd\\xe1\\x94\\x26\\x23\\x8b\\x6e\\x34\\xd1\\xda\\x70\\x14\\xb6\\xdb\\xa0\\x9b\\x84\\xe6\\x8b\\x7e\\x39\\x4d\\x21\\x0a\\x50\\x55\\x50\\x0f\\x52\\xb0\\x4b\\x85\\xc0\\x7b\\x23\\xb4\\x6c\\x61\\xef\\x8d\\xee\\x73\\xe6\\x92\\xcb\\x72\\x81\\x7c\\x3f\\x20\\x13\\xf4\\xd5\\x48\\x2d\\x96\\x44\\x55\\x36\\x63\\xf2\\x95\\xf7\\x15\\x80\\x2a\\x4f\\x2d\\x9e\\xcd\\x93\\x1f\\x93\\xaf\\xbc\\x3f\\x7f\\x55\\x55\\x0b\\x0b\\xa3\\x98\\x13\\x2c\\x88\\xee\\xa1\\x07\\x23\\x85\\x0f\\xf4\\xfd\\x52\\x73\\x64\\x03\\x43\\xb8\\x00\\x75\\x21\\x6d\\x64\\x9b\\x91\\xa8\\xf4\\x75\\xc4\\x10\\x9f\\xb1\\xa3\\x32\\x30\\xe4\\x84\\xdc\\x2e\\x24\\xd3\\x3c\\x8e\\xed\\xb6\\xf5\\x89\\x10\\x62\\xd0\\xfb\\x0f\\x56\\xba\\x58\\x57\\xc2\\xd9\\x29\\xa3\\x98\\x4d\\x23\\x67\\x80\\x72\\xb5\\x68\\x42\\x46\\x38\\x63\\x62\\x45\\xf8\\x48\\x2d\\xd7\\x57\\xc5\\x48\\x81\\x57\\x21\\x99\\x1b\\x1c\\x7f\\x9e\\x8d\\xa8\\x18\\xd1\\x62\\xa4\\x37\\x5f\\xe2\\x81\\x88\\xb5\\x87\\x32\\xd3\\xb2\\x24\\xa1\\x60\\xa5\\x48\\x3f\\x39\\x89\\xed\\x16\\xcf\\xc6\\x54\\x0e\\xb3\\xde\\x97\\xfa\\xc3\\xee\\xc8\\x23\\x8a\\xd8\\x11\\x53\\x65\\x23\\xef\\xc0\\x8b\\xe2\\xb0\\x21\\x88\\x03\\x0a\\x8e\\x98\\xef\\x17\\x01\\x95\\x13\\x33\\xed\\x1d\\x9a\\xdf\\xf6\\x78\\x18\\xdc\\x05\\xbf\\x92\\xd3\\x8e\\x35\\x66\\xcc\\x48\\x21\\x1a\\x7a\\xc6\\x4e\\x50\\xfe\\x9e\\x8d\\xc4\\xca\\x82\\xc3\\x0a\\xb9\\x8a\\xd1\\xa7\\x8b\\xf7\\x0d\\xe1\\x55\\x7c\\x05\\x29\\xd4\\xbd\\x49\\x1a\\x88\\x1d\\xc5\\xa1\\xa4\\xb9\\x03\\x9d\\x04\\x29\\x90\\xe3\\x9c\\x50\\x28\\x5a\\xbc\\xaa\\xf1\\xc1\\x6f\\x5f\\xff\\xe9\\x20\\x14\\xa4\\x10\\x01\\x95\\xab\\x48\\x27\\xc8\\xfb\\xda\\xd3\\x2b\\x98\\x2a\\x8e\\x38\\x09\\x24\\x6a\\x10\\x83\\xe7\\x17\\x3a\\x00\\x6a\\xb5\\x0c\\x85\\x3d\\xaa\\xea\\x97\\x3a\\xa5\\x50\\xd8\\x03\\xaa\\xc8\\x6a\\xe6\\xfb\\x41\\xda\\x54\\x3f\\x0a\\x0a\\xb3\\x55\\x58\\x8b\\x1f\\x06\\xbd\\x7f\\x2f\\x46\\x6b\\xfc\\xd0\\x5c\\xc5\\x6b\\xc6\\xc9\\x48\\xac\\x70\\x36\\x62\\x19\\x19\\x99\\xb2\\x7a\\xfd\\x3d\\xc8\\x00\\x6c\\xd7\\x47\\x29\\x88\\xd2\\x36\\x7f\\xae\\xe9\\xa8\\xc5\\x25\\x7b\\xac\\x27\\x25\\x3a\\x95\\xa5\\x5b\\x7d\\xb5\\x9a\\x40\\xa9\\x4c\\x72\\x70\\x46\\x90\\x02\\x00\\x07\\x24\\x19\\x86\\x13\\x99\\x23\\x3e\\xe3\\x28\\x85\\x99\\x91\\x9d\\xc2\\x14\\x40\\x8e\\x72\\x8b\\xbe\\xd2\\x1a\\x31\\xe8\\x8d\\x7f\\xe2\\xcc\\x6b\\x08\\x89\\xd5\\x74\\xa6\\x73\\x4e\\x02\\x2a\\x29\\x21\\x01\\x37\\x35\\xa4\\xa3\\xf1\\x61\\x05\\x40\\xa7\\xe9\\x0f\\xee\\x34\\x7e\\x47\\xdb\\xb6\\xfe\\x60\\xe3\\x17\\x24\\xa1\\x9c\\xc4\\xe2\\xd9\\xed\\x6a\\x84\\x62\\x8e\\x90\\x08\\x97\\x9c\\xad\\xb7\\x5b\\xef\\x6b\\x0f\\x9a\\xcd\\xe5\\x12\\x76\\xea\\xd2\\x95\\x24\\xb6\\xee\\x2b\\x10\\xa1\\x60\\x50\\x18\\xe2\\x67\\xbb\\xcd\\xa0\\xd0\\xa4\\xcf\\x76\\x2b\\x2f\\x6d\\x39\\xc6\\x3e\\x93\\x28\\xed\\x33\\x89\\xf6\\x52\\x67\\xbb\\xa9\\x5d\\x38\\x70\\x2b\\x47\\xd3\\x1f\\xbe\\xa9\\x16\\x70\\x7a\\xf8\\x2c\\x82\\xce\\xe8\\x09\\x18\\x5a\\x75\\x7c\\x28\\xcf\\x0e\\x69\\x38\\x77\\xc8\\xa0\\x2c\\xf9\\x61\\xcb\\x4c\\xcd\\x43\\x92\\x18\\xae\\x1d\\xe4\\xc8\\x30\\x53\\x0a\\x73\\x71\\x8c\\xb3\\x70\\x49\\x53\\x41\\x78\\xd0\\x7f\\xa7\\xbc\\x98\\x8e\\x11\\xe2\\x21\\xcd\\x12\\xf2\\xe5\\x7c\\x29\\x89\\x7f\\x10\\x16\\x6c\\x4d\\x06\\x8a\\x8e\\xc8\\x20\\x5a\\xa8\\xc0\\x93\\x38\\x13\\xcf\\x90\\x51\\x18\\x5e\\xe7\\x2d\\x11\\xbf\\x2a\\xc1\\x82\\xee\\xef\\x23\\xd3\\xcc\\x29\\x45\\x23\\x6d\\x0a\\x81\\x05\\x8d\\x8b\\x68\\xc3\\x49\\xcc\\x78\\xd2\\x2e\\x12\\xb5\\x85\\x3e\\xb4\\x08\\x0b\\x95\\x6f\\x04\\x1a\\xf6\\xc6\\x6e\\x25\\xa2\\x4d\\x65\\xee\\xec\\x56\\xb2\\x7a\\xd7\\x07\\xa0\\x82\\xb7\\x44\\xec\\xe9\\xc4\\xbd\\xa1\\xff\\x33\\x7d\\x6d\\xb7\\x8a\\x8b\\x5e\\xc1\\x98\\xad\\x73\\x96\\x91\\x4c\\xfc\\x4a\\xd3\\xf4\\x8c\\x95\\x99\\x70\\xe9\\x03\\x66\\x2f\\x5a\\xc3\\x40\\x2b\\x04\\x2f\\x63\\xc1\\x78\\x58\\x8f\\xd2\\xae\\x4e\\x00\\xb6\\x5b\\xdc\\x92\\xea\\xe8\\x2e\\x47\\x37\\xa6\\x40\\x57\\xb0\\xe3\\x74\\x7d\\x42\\x93\\x5e\\xcf\\xaa\\xc7\\xeb\\x32\\x4f\\xb0\\x30\\xfb\\x20\\xe8\\x54\\xf9\\xa4\\xf2\\xba\\x3c\\x8f\\x7e\\x35\\x01\\x2a\\xd8\\x4a\\x69\\x01\\x94\\x2e\\x03\\x6e\\x20\\x27\\xb0\\x20\\xf2\\xb1\\x6f\\x1e\\xe9\\x4f\\x99\\xf3\\x4c\\xf8\\xbe\\x08\\xdd\\xc6\\xed\\xaa\\x05\\xbb\\xab\\xb7\\x8b\\xa8\\x6e\\x5d\\x92\\x56\\x27\\x60\\x35\\x42\\x50\\xb5\\xde\\xc8\\x86\\xdd\\xbc\\x6b\\xc3\\x46\\x2f\\x5b\\x18\\xe2\\x77\\x09\\xbf\\xa6\\x03\\x6a\\x2b\\x7f\\x38\\xf3\\xfa\\x96\\x88\\x36\\xef\\x7a\\x3f\\xa7\\x96\\x88\\xe3\\x92\\x4b\\x2a\\x45\\x31\\xaf\\x41\\x5d\\x5f\\x62\\xa7\\xdf\\xd5\\x86\\xac\\x58\\xb7\\xd3\\xe6\\x9c\\x3d\\xb9\\x15\\x25\\xae\\xd2\\x6d\\x74\\xb8\\x2c\\x4f\\x6c\\x42\\x73\\x41\\x74\\x0b\\x9a\\x72\\x7f\\x76\\x13\\xba\\x9a\\x6c\\x83\\x16\\x6f\\x63\\x41\\xef\\xc8\\x73\\x38\\xf9\\xb6\\x8e\\xe5\\x9f\\x3f\\xce\\x08\\x9f\\x3e\\x43\\x06\\xdd\\x1c\\x47\\xf5\\x42\\xb0\\xca\\x1f\\x37\\x8c\\x8b\\x0b\\x82\\x0b\\x96\\xa1\\x46\\xb5\\x80\\x13\\xc1\\x1f\\x90\\x50\\x32\\x78\\x75\\x2a\\x1c\\x54\\x1f\\x1e\\x1c\\xcb\\xe7\\x53\\x9a\\x62\\x83\\x94\\x2d\\x57\\xc6\\x5e\\xff\\x60\\xc6\\x1d\\x6d\\x06\\xd5\\x41\\x4b\\x18\\xef\\x60\\x30\\xa7\\x77\\xf9\\xb6\\xe8\\x0e\\x88\\x6c\\xb7\\xde\\xdb\\x1f\\xcf\\x2f\\xae\\x24\\x76\\x72\\x1b\\xb5\\xd7\\x3f\\x1a\\x94\\x4c\\xa8\\x26\\x94\\xd6\\x05\\x36\\xe9\\x9d\\xea\\xb1\\x9a\\x40\\x4f\\xc9\\xa2\\xa9\\xc7\\x54\\x05\\x49\\x88\\x74\\x7a\\x90\\xd4\\x87\\x90\\xdd\\x97\\xb1\\x73\\x53\\x0a\\xc8\\x21\\xab\\x97\\xb6\\x4e\\x36\\xbc\\xd9\\xed\\x96\\xb8\\xb3\\x02\\x22\\xc0\\x60\\xa6\\x58\\xad\\x12\\xd7\\x59\\xba\\x19\\x28\\x25\\x25\\xfb\\x25\\x29\\x9d\\x39\\x5b\\x40\\x01\\x60\\x9d\\x66\\x1e\\x13\\x6f\\x5e\\xf9\\xbe\\x08\\x40\\xa3\\x0a\\x23\\xe4\\xe5\\xad\\xda\\x93\\xc9\\x15\\xe4\\x20\\x50\\xc3\\x17\\xac\\x37\\x78\\x39\\x4a\\x3b\\xfc\\x0b\\x7a\\xbb\\x12\\xee\\x1c\\x7e\\xe7\\x0c\\x98\\x7d\\x03\\xa8\\x19\\xd4\\x5f\\x9a\\x56\\x93\\x13\\xa8\\x93\\xec\\x04\\xbe\\x79\\x64\\x02\\x4c\\x4d\\xa0\\xcd\\xb9\\xea\\x6e\\xbb\\xe8\\x25\\x74\\xf7\\x5c\\xf4\\xbd\\x3c\\x0d\\x4f\\x53\\xa9\\xd8\\x7c\\xfc\\x74\\xf9\\x73\\xe4\\xc9\\x57\\xb9\\x07\\x2f\\x4e\\x3f\\xbe\\x7f\\x7b\\x7c\\x1a\\x79\\x86\\x69\\xeb\\xc1\\x8f\\xe7\\x1f\\x23\\x2f\\x67\\xb9\\xe7\\x1e\\x3f\\xc3\\x3c\\x9b\\x3e\\xa6\\x8a\\xd0\\x20\\xe3\\xf0\\x40\\xdf\\x18\\xc5\\xc1\\x7b\\x16\\xab\\x31\\xbf\\xd5\\xdf\\x1a\\x37\\x0f\\x5d\\x51\\x9d\\xab\\xb3\\xb8\\xa7\\x46\\x39\\x2d\\xc6\\x05\\x19\\xf1\\x50\\x8d\\xdb\\xfc\\xb6\\xe3\\x36\\x1a\\x18\\xfa\\x6e\\xbf\\x62\\xc1\\x21\\x3c\\x04\\xb3\\x1b\\x4e\\xf0\\xe7\\x99\\xad\\x75\\xfe\\x31\\x22\\x47\\xdd\\x72\\x24\\xfc\\x02\\x49\\xf8\\x00\\x06\\x1b\\xa8\\x06\\x50\\xcf\\xee\\xf9\\x44\\xd3\\x57\\x12\\x34\\x4f\\x13\\xb2\\x3e\\x32\\x71\\xb0\\x19\\x1e\\xcf\\xc0\\x52\\x3c\\x26\\x04\\xd4\\xfd\\xfd\\x1f\\x65\\x63\\xb2\\xff\\x8e\\x6c\\x4c\\xdc\\x87\\x69\\xf3\\xf4\\x1d\\xdb\\xa7\\xaf\\xf0\\x7d\\x2d\\xd3\\x41\\x62\\x18\\xc0\\x97\\x65\\x4e\\xf8\\x88\\x7c\\xc9\\x39\\x29\\x0a\\x09\\x36\\xc5\\x77\\x23\\x54\\xb1\\x79\\x6e\\x88\\x92\\xc2\\x8d\\x18\\x77\\x20\\x0e\\xd5\\xdb\\xdc\\x9b\\xd8\\x1e\\xc0\\x8c\\x34\\x23\\x45\\x66\\xea\\xfa\\x7d\\x19\\x28\\x32\\xb0\\x99\\xc6\\xc6\\xa1\\xfb\\xa2\\x8d\\x7e\\x9e\\x12\\xd8\\xc0\\x3a\\x1a\\x4f\\xa1\\x05\\x64\\x34\\x3e\\x84\\x2e\\xd0\\xe5\\x5b\\x57\\x52\\xed\\xbe\\x1f\\x90\\xf0\\xfa\\x5a\\x35\\x7a\\x7d\\x8d\\x24\\x15\\x4b\\x1d\\x31\\x85\\xab\\x95\\x41\\x9c\\xdd\\x20\\x94\\x7e\\x95\\x62\\xb5\\x0a\\x2d\\x75\\x1b\\x23\\xe2\\xfb\\xc4\\xa8\\xf3\\xa9\\x8c\\x5a\\x69\\x10\\x34\\x2c\\x4d\\x01\\x09\\x80\\x2c\\x10\\x96\\x6b\\xc7\\x49\\x96\\x10\\x3e\\xc0\\x32\\x74\\x09\\x8a\\x9c\\xb3\\xdc\\xf0\\x1e\\x39\\xc9\\xd4\\xdb\\x57\\x54\\x01\\x0d\\x8f\\x2d\\x99\\xde\\xd5\\x95\\xa8\\xc5\\x13\\xf2\\x44\\x3d\\x4d\\x70\\xf3\\x5f\\x75\\xa2\\xfe\\xbb\\x6f\\x2e\\x6c\\xae\\x11\\x97\\xa8\\xa7\\x8e\\x00\\xec\\x67\\xcd\\x65\\xb3\\x92\\x83\\x46\\x2c\\x56\\xfe\\x91\\x1b\\x91\\xe9\\x8d\\x28\\xaa\\xa0\\x00\\xb3\\x52\\x6d\\x30\\x35\\x18\\xb4\\x51\\xc4\\x3e\\x36\\xb2\\x48\\xa8\\x78\\x38\\x38\\x54\\x82\\x38\\x68\\x37\\x60\\x9d\\x60\\x38\\x82\\xf2\\xbb\\xcc\\xe2\\xd6\\xd3\\xa3\\xb4\\x7c\\x3c\\x39\\xcf\\x02\\x6d\\x6c\\x51\\xea\\x52\\x00\\xa5\\xb9\\x82\\x5c\\xf2\\x17\\x36\\x62\\xb6\\x97\\x53\\xd8\\x85\\x4a\\xf4\\xf2\\xa5\\xdc\\xd2\\xcf\\x91\\xaa\\x35\\x0a\\x9e\\x4a\\xad\\xe1\\xa6\\x14\\x82\\x65\\xae\\x8a\\x7f\\x5d\\x62\\x3c\\x0e\\x48\\xb8\\x26\\x02\\xff\\x95\\x3c\\x28\\xda\\x28\\x15\\xe6\\x57\\x2c\\x78\\x6a\\x7e\\x2a\\x0d\\xc0\\xbf\\x92\\x07\\x4d\\x3a\\x0f\\x60\\xcd\\x3f\\xf2\\xdc\\xd0\\xff\\x8e\\x37\\x51\\xf1\\x2f\\x64\\x61\\x91\\x45\\xe9\\xde\\x44\\xf1\\x7e\\x41\\x63\\x3a\\x80\\x58\\xf2\\xdd\\x38\\x03\\x3f\\x1b\\x67\\x14\\x1a\\x67\\xd0\\xe6\\xf2\\xd2\\x87\\xfa\\x38\\xa5\\xf1\\xe7\\xbe\\xe2\\xa0\\xe1\\xef\\xc0\\x0c\\x8d\\x0f\\x67\\xce\\x35\\xc6\\x32\\x55\\x41\\x6b\\x41\\xf4\\x92\\x03\\x02\\x00\\x1c\\xcb\\x43\\xe9\\xfb\\x5c\\xfd\\x1f\\x8c\\xa7\\x72\\x91\\x7d\\x7f\\x7c\\x38\\x46\\x8d\\xbe\\xed\\x47\\x4e\\xee\\x48\\x26\\x48\\xb2\\xdd\\x06\\x19\\x1a\\x4f\\x01\\x94\\x8b\\xa5\\xd2\\x0c\\xab\\x3c\\x00\\x30\\xf3\\xfd\\x47\\x35\\xe3\\x9c\\x31\\x08\\x06\\x9d\\x2f\\xcd\\x7c\\x76\\x53\\x14\\x0b\\xda\\x61\\x90\\xdf\\x12\\xf1\\x33\\x27\\xcb\\x47\\x6e\\xef\\x5d\\x8a\\x7d\\xcf\\xee\\xd8\\xed\\xf7\\x58\\x22\\x8c\\x0f\\x78\\xdd\\x67\\xf7\\x5b\\x69\\xa3\\x4b\\x39\\xd8\\xc2\\x2d\\xc9\\xe3\\x2d\\x11\\x9a\\x31\\x71\\x29\\xe4\\x8e\\x06\\x5a\\x0a\\xe9\\xc9\\x03\\xd0\\x54\\xc5\\xaa\\x44\\xdd\\x1b\\x80\\xc4\\x1d\\x85\\x53\\xff\\x79\\x40\\xa8\\x79\\x22\\xbf\\x1f\\x08\\x3b\\x29\\x27\\x3d\\xfd\\x58\\x49\\x21\\xea\\xda\\x70\\xb3\\xe2\\x64\\x19\\xd9\\x89\\xab\\x05\\x00\\xb0\\x06\\x4c\\x9d\\x51\\xcf\\x34\\x00\\xd0\\x6c\\xc9\\xc8\\x11\\x4f\\xab\\x04\\x97\\x7f\\x02\\x1a\\x75\\x2f\\x6c\\x80\\xf1\\x90\\x12\\xb3\\xed\\x86\\x20\\x1c\\x16\\xb2\\x00\\x6a\\x15\\x07\\xb0\\x0c\\x4f\\xce\\xcf\\x42\\xc5\\xd7\\xe8\\x13\\x7c\\xc0\\x52\\x7c\\xa5\\x4b\\xf1\\xe5\\xa1\\xcb\\x08\\x44\\x96\\x11\\x98\\x0e\\x31\\x02\\x73\\xf7\\x86\\xef\\x2c\\x69\\x94\\x9a\\xcb\\xde\\xa9\\x01\\x05\\x8b\\xd2\\x90\\x65\\xe4\\x7c\\x29\\x2b\\x05\\x73\\x5b\\x06\\x9a\\xe6\\x17\\xc0\\x2d\\xad\\xd7\\x4a\\xd6\\x50\\x38\\x09\\xaa\\x95\\x6a\\x3e\\x9d\\x99\\x36\\x89\\x16\\xb8\\xa9\\x56\\xb6\\x81\\x79\\x87\\x60\\xe8\\x8e\\xd2\\xd3\\x09\\x9e\\xb3\\x66\\x9e\\xe7\\x12\\x13\\xf9\\x10\\x31\\xf1\\x64\\x3d\\x9d\\xe9\\x93\\x14\\x68\\xfe\\x45\\x25\\xff\\x8b\\x4a\\xfe\\xff\\x0c\\x95\\xfc\\xf2\\x31\\x51\\xe5\\xbf\\xb6\\xf4\\xff\\x4b\\x5b\\xfa\\x8f\\xe6\\x35\\x34\\x9b\\x97\\x82\\x59\\xe1\\x6e\\x5e\\xb3\\x5d\\xcd\\xe6\\x5d\\x72\\xb6\\x6e\\xbe\\x04\\x6b\\x7e\\x3b\\x1b\\x57\\x6e\\xe4\\x0a\\x16\\x9d\\xed\\xea\\xee\\xd2\\xe2\\xb1\\x5d\\x2a\\x77\\xe4\\xd3\\x84\\x5e\\xff\\x62\\xee\\xfd\\x8b\\xb9\\xf7\\x5f\\xc5\\xdc\\xdb\\xaf\\x9c\\xd9\\x39\\xae\\xf1\\xe0\\x0d\\x94\\xfe\\x5f\\xe2\\x10\\x16\\xc1\\x78\\xaa\\xd4\\x9e\\x48\\x4a\\x54\\x23\\x23\\xcc\\x89\\x52\\xab\\xd7\\x14\\xe0\\xa8\\x86\\x88\\x66\\x74\\x64\\xe9\\xc3\\x08\\x67\\x89\\xab\\xa7\\x77\\x43\\x46\\xba\\x79\\x92\\x78\\xb0\\x27\\x49\\x57\\x5a\\x29\\x83\\xdc\\xc6\\xb4\\x77\\x17\\x96\\xad\\xbb\\xb0\\xec\\xa2\\x90\\x52\\xdd\\x7d\\x70\\x48\\xdf\\x24\\x2a\\xc3\\x1b\\xc6\\xd2\\x0a\\xa6\\x3b\\x2e\\xc3\\xd8\\x45\\x33\\xe9\\x3e\\x34\\xe3\\xdc\\x7f\\xc3\\x94\\x5f\\x4f\\x0c\\xff\\xf2\\x31\\x49\\xeb\\xbf\\x30\\xd2\\xbf\\x30\\xd2\\x7f\\x39\\x46\\x0a\\x0f\\x8e\\xf5\\xd3\\xee\\x57\\x8e\\xf3\\x5c\\x21\\x99\\x72\\x3f\\xf3\\x27\\x1e\\xc0\\x56\\x29\\xf2\\xae\\xaf\\xb9\\x73\\x2e\\xae\\xaf\\xbd\\x7d\\x1c\\xa1\\x3f\\x02\\x59\\xc9\\x17\\xb4\\xa4\\x7f\\xcd\\xf8\\x77\\x32\\x05\\xf4\\x6b\\xf5\\x84\\xe4\\x62\\x15\\xf5\\xf9\\x03\\x2a\\x7d\\x32\\xad\\x1a\\x4d\\xc4\\xae\\x0a\\xd3\\x40\\xc3\\xae\\x4a\\x92\\xc2\\x06\\x35\\xbe\\x0a\\x8c\\xf2\\xc3\\xb2\\x98\\xa7\\x0b\\x30\\xd8\\xa8\\x56\\x72\\xfa\\x43\\x5b\\xfd\\x95\\xa6\\xe9\\xa7\\x6c\\xfd\\xfc\\xd1\\x4a\\xe8\\x37\\xed\\x0d\\x96\\x19\\xe2\\xb6\\x0d\\xb1\\x59\\x0a\\xa3\\xf2\\x52\\x57\\x7c\\x2b\\x14\\x6c\\x03\\xcb\\x9e\\xb8\\xa8\\xc1\\x1d\\x00\\xe5\\x19\\xa5\\xe1\\xed\\x34\\x59\\xcf\\x61\\xed\\xa8\\x0a\\x1d\\x0d\\xd2\\xe3\\x5a\\x69\\xde\\x22\\xe8\\x5d\\xcc\\x42\\xb4\\x43\\x0f\\x47\\x55\\xde\\x37\\x76\\xa5\\x94\\x6c\\x34\\x50\\x7a\\x06\\x7f\\x19\\x2a\\x83\\x4d\\x05\\xc9\\x76\\xeb\\xf2\\x83\\x38\\x59\\x46\\xa9\\x65\\x5d\\x3c\\x4d\\x0b\\xc9\\x30\\x36\\x9e\\xa6\\x6f\\x54\\x73\\x86\\xa8\\x41\\x27\\xa7\\xfa\\x9a\\x0e\\x6a\\x4d\\x6a\\xa5\\x0c\\xf4\\x34\\x6e\\x96\\xee\\x72\\x18\\x9a\\x41\\xc3\\x83\\x3a\\xea\\xf6\\x55\\x40\\xe3\\x12\\x27\\xea\\xe6\\x78\\x45\\xcc\\x69\\x2e\\x3c\\x68\\xb6\\xdb\\xc0\\x2d\\x3f\\xc8\\x61\\xd2\\x67\\x36\\x0e\\xb3\\x72\\x7d\\xd3\\xe2\\x32\\x59\\xeb\\xa9\\x78\\x98\\x01\\x15\\x3b\\x68\\xe1\\x49\\xed\\x3d\\xca\\xdb\\xe9\\xa3\\xc9\\x68\\xfa\\xed\\xd3\\x39\\x3e\\x2f\\x07\\xd4\\x4a\\x1a\\xbd\\x99\\xc7\\x34\\xae\\xea\\x7b\\x79\\x44\\xb3\\x91\\x00\\x74\\xa9\\x96\\xb5\\x38\\xbf\\xcf\\xea\\x0b\\x33\\x03\\xbe\\x4f\\xe6\\xd9\\x42\\xde\\x5e\\xf3\\x6c\\xd1\\xe8\\xf7\\x5a\\x65\\xe0\\x96\\x10\\x4a\\x69\\xf2\\x30\\x88\\x21\\x75\\xf4\\x73\\x7b\\x9a\\xbb\\x74\\x19\\x90\\x71\\xb3\\xc7\\xc7\\xd3\\xda\\xc3\\x50\\x01\\x4b\\x24\\x5c\\x4b\\x58\\xed\\x07\\xa3\\x1c\\xf0\\x83\\x51\\xa0\\x72\\x1e\\x2f\\x20\\x9b\\x17\\x72\\x6c\\xd9\\xbc\\xe8\\x8d\\x6d\\xc4\\x03\\x39\\x10\\xdf\\xe7\\x01\\x85\\x18\\x54\\x6d\\x87\\x56\\xad\\xf9\\x43\\x8e\\x0e\\x21\\x6b\\xac\\xfc\\xf9\\x1b\\x36\\x9b\\x4c\\x38\\xc8\\x10\\x99\\xf3\\x05\\xcc\\xac\\x81\\x4b\\x62\\x8f\\xe7\\x5c\\x27\\x2d\\xb4\\xf5\\xc4\\x1e\\x95\\x7d\\xb5\\x3d\\x94\\x4d\\x4c\\x62\\x6d\\x44\\x35\\x49\\x0a\\xeb\\x36\\x50\\x06\\x60\\xe6\\x1a\\xe5\\xf8\\x3e\\x0e\\x5a\\x09\\x50\\x80\\x96\\xf3\\xaa\\x96\\xed\\xf2\\x6e\\xc5\\x68\\xab\\x9d\\xed\\xce\\xbc\\xd8\\xb5\\xf2\\xda\\xec\\x27\\x90\\x6b\\x0d\\xc6\\x08\\x99\\x4f\\xb5\\xe6\\xfb\\x16\\xbd\\xfc\\x83\\xdb\\x8b\\xe5\\x0c\\x08\\x22\\xdb\\xed\\xa6\\x82\\x37\\x5a\\x76\\x42\\xcc\\x29\\x2b\\x22\\x62\\x2c\\x7b\\x94\\x91\\x3c\\x97\\xeb\\x65\\xf4\\x7d\\xb6\\xdb\\x77\\x92\\x7c\\x30\\xaa\\x39\\x96\\x2a\\xdf\\x6e\\x2f\\xe1\\x5a\\xbe\\xf0\\x3f\\xcb\\xff\\xde\\x6b\\x25\\xc2\\xb7\\xea\\xcf\\xac\\x6b\\x48\\xa4\\x69\\x48\\xed\\xab\\x2e\\xe0\\x00\\x40\\xee\\xd2\\xc6\\xa7\\x47\\x79\\x30\\x5e\\x6e\\xb7\\x9e\\x20\\x85\\x32\\x1d\\xce\\x42\\x92\\xdd\\x85\\x1f\\xce\\x4f\\x4e\\xaf\\x4f\\x3f\\xfc\\x32\\x68\\x3b\\x84\\x47\\x5a\\x1f\\x7c\\x64\\x07\\x29\\x61\\xa3\\x14\\x9a\\x47\\xa4\\x51\\xb2\\x1d\\xdd\\x90\\x18\\xcb\\xe2\\x62\\x45\\xec\\x9b\\xe7\\x9e\\xa6\\xa9\\x7d\\xda\\x7c\\x26\\xb9\\x90\\x15\\x8b\\x87\\x2c\\xd6\\x26\\x48\\xb2\\x60\\xac\\xd1\\xf4\\xe8\\xd3\\xc5\\x7b\\x0f\\x44\\x49\\xb0\\x94\\x24\\x32\\x42\\x88\\x87\\x19\\x21\\x49\\x71\\x72\\x7e\\xa6\\x87\\x14\\x37\\x2a\\xd6\\xff\\x5e\\x74\\xb4\\xaa\\x25\\x1d\\xcb\\xc7\\x08\\x3d\\x6c\\xb7\\x57\\x01\\xd8\\x6e\\x03\\x8e\\x6e\\x35\\x78\\x3f\\xa1\\xd4\\xe2\\x69\\x49\\xed\\x07\\x9b\\x84\\x16\\x79\\x8a\\x1f\\x34\\xc3\\x5a\\xed\\x49\\xee\\xc1\\x5a\\xdb\\x9d\\x16\\x17\\x65\\x96\\xd1\\xec\\x56\\xd2\\x8e\\x5a\\x7f\\xf1\\x23\\x51\\x0e\\x92\\xae\\x6a\\x19\\x95\\x7b\\x1b\\xbc\\xf7\\xfd\\xe0\\xbd\\x51\\x74\\x0c\\x80\\x59\\x17\\x50\\x69\\x9f\\x69\\x6f\\xd3\\xb4\\xaf\\xe0\\xfa\\x29\\xdc\\xd1\\x6c\\x00\\xe0\\x27\\xb5\\xcf\\xad\\x91\\xdb\\xa6\\x82\\x9f\\xac\\xa7\\x90\\xf9\\xa2\\x82\\x38\\x49\\xba\\xcd\\x11\\xb0\\xa9\\x37\\xd6\\x85\\x12\\xd5\\x49\\x74\\xd0\\x6a\\x06\\xd4\\x8d\\x28\\x03\\x39\\x43\\x40\\xda\\x34\\x49\\x63\\x58\\x1f\\x14\\x03\\x8d\\x7f\\x0a\\xdb\\x13\\x51\\x63\\xac\\xc7\\x11\\x10\\xd5\\x38\\x59\\x72\\x52\\x28\\xfd\\x64\\x65\\xdd\\x3d\\xa4\\xb7\\x7f\\x1e\\xd6\\x1e\\x4d\\xda\\x5d\\xef\\x74\\xe7\\xa1\\xde\\x52\\x92\\x88\\xf8\\xe0\\x1a\\x83\\x11\\x00\\x38\\x22\\x4a\\x27\\xd2\\x3a\\x1f\\x72\\xb7\\xf6\\xc9\\x11\\x89\\x5a\\x93\\x9f\\x93\\xc5\\x2c\\x09\\x58\\xab\\x0c\\xfc\\xca\\xf5\\xdc\\x88\\x07\\xd0\\x1a\\x01\\x90\\x1b\\x5b\\x33\\x4b\\x59\\x7f\\x08\\x6b\\xb3\\x72\\x39\\x22\\xc7\\xf9\\x40\\xa0\\x94\\x2f\\xf7\\x7a\\x15\\xd1\\x23\\xfd\\xd4\\xf5\\x43\\x52\\xe3\\x76\\x84\\xd0\\xdd\\x91\\xf7\\x6f\\xde\\x84\\x45\\xec\\x11\\xbf\\x22\\xbb\\x9a\\x7a\\x7f\\x54\\xbb\\x06\\x09\\x18\\x88\\xb8\\x36\\x86\\x64\\x8f\\x38\\x18\\x69\\xea\\xf4\\x5a\\xdc\\xe7\\x56\\xe4\\xac\\xf6\\xd8\\xb6\\xdd\\xca\\xc1\\xdf\\x1e\\x05\\x3c\\xcc\\x59\\x1e\\x00\\x38\\x3e\\x04\\x51\\x90\\x2b\\x46\\x88\\x75\\x34\\x32\\xba\\xc7\\xb5\\xc9\\xa0\\x8b\\x21\\x38\\xd1\\x0e\\xc1\\x2c\\xa6\\x30\\xde\\xad\\x3c\\x00\\xc7\\x53\\x50\\x19\\x4e\\xc5\\xdb\\x1b\\xc6\\x45\\x44\\x42\\x96\\xa9\\x5f\\xdb\\x6d\\xe7\\xf2\\x6d\\x63\\x36\\xd0\\x73\\x40\\xf6\\x29\\xd3\\xed\\x24\\x23\\xa5\\x58\\x4b\\x92\\x51\\x03\\xde\\xf1\\x48\\xeb\\xd9\\x46\\x23\\x6f\\x42\\xc0\\xac\\xb5\\x93\\x3e\\x6e\\xb7\\x6d\\x8e\\xc2\\xf5\\xd1\\x30\\xb0\\x42\\xc1\\x20\\xb1\\xc2\\x51\\x62\\x25\\xd2\\x91\\x81\\x47\\x3d\\x0f\\x35\\x1c\\x35\\x0f\\xf5\\xab\\x3d\\x0f\\x3d\\x6a\\x62\\xcb\\x5a\\xc5\\xcf\\xe3\\x15\\xce\\x6e\\x49\\xe7\\x3c\\x4a\\xf4\\xa5\\x15\\x7a\\xb5\\x29\\x22\\x09\\x25\\xce\\x07\\x15\\xb4\\x19\\x2d\\x2b\\xae\\xbd\\xe8\\xc6\\xf0\\x52\\xd6\\xba\\x21\\xed\\x23\\x08\\xa1\\x4c\\x1e\\x3a\\x89\\x4b\\xc9\\x76\\x8b\\xc1\\x86\\xfb\\x7e\\x86\\x10\\x5a\\x29\\xad\\x58\\xdf\\x97\\xc7\\xbd\\x6f\\x0f\\x14\\x70\\xe3\\x96\\x42\\xed\\x4c\\xad\\x6e\\x3c\\xcb\\x1b\\x6f\\x13\\x1f\\xcc\\x22\\x8f\\xb4\\x93\\x90\\xa2\\xb1\\xcb\\x0c\\x47\\x67\\xf8\\x33\\x19\\x15\\x25\\x27\\xa3\\x07\\x56\\x6a\\xb2\\x43\\x9b\\xe5\\x1a\\x0b\\xdb\\x7f\\x2f\\xbc\\x3f\\x8f\\x24\\x61\\x70\\xaf\\xb7\\x4c\\x26\\xcb\\x19\\x96\\x5a\\xf1\\x15\\x24\\xf2\\xb4\\xea\\x91\\x53\\xdf\\x0f\\x28\\xda\\x98\\x7b\\xb5\\x50\\xae\\xc7\\xd6\\x06\\xd9\\x6c\\xb7\\xf3\\x05\\x4c\\xd5\\x5c\\xb5\\x05\\xdb\\xa6\\x82\\x09\\x5a\\x5b\\x23\\xb6\\x4d\\x05\\x97\\x88\\xba\\x65\\xef\\x10\\x75\\xcb\\x3e\\x20\\xda\\x94\\x9d\\xc5\\xd6\\x29\\x65\\x50\\xa0\\x78\\xb7\\xed\\xd7\\x98\\x05\\x4b\\x48\\x60\\x0a\\xef\\x60\\x02\\x1f\\x40\\xa5\\xa4\\x61\\x7b\\x8b\\xc7\\xad\\xe2\\x20\\x0a\\x24\\xe6\\x97\\xb5\\xf4\\x9c\\x6e\\xd5\\x9d\\xfe\\x45\\xa1\\x78\\xe7\\x5c\\x6b\\xf9\\xf7\\x27\\x48\\x00\\x98\\xbd\\x47\\xb7\\xaa\\xe8\\x29\\x12\\xc6\\x0f\\x89\\x1d\\xec\\x0b\\x6b\\x26\\x0b\\x66\\x5f\\x94\\xce\\x7d\\x70\\x0b\\x0b\\x78\\xda\\x78\\x39\\xd1\\x5c\\x1f\\xb1\\xdd\\xde\\xb6\\xb4\\xd0\\xcd\\xa1\\x7f\\xab\\xad\\x2a\\x3f\\x41\\x01\\x6f\\x65\\x0b\\x82\\x05\\xb7\\xb0\\x84\\x77\\xf0\\xa1\\xd5\\x82\\x5b\\xcc\\x98\\x1c\\x12\\xa8\\x55\\x9a\\xa3\\x0c\\x5a\\xdb\\xba\\x88\\xd6\\x66\\x76\\xd0\\xd0\\x43\\x4b\\xfb\\xf4\\xbb\\x33\\xaf\\xba\\x87\\x0a\\xa8\\x7f\\x15\\xe4\\x65\\xdb\\x18\\x2c\\x09\\xc6\\x9f\\xc2\\xfa\\xa6\\x86\\xe6\\x16\\x97\\xd8\\x04\\xa7\\x9c\\xe0\\xe4\\x61\\xc4\\x75\\x96\\x07\\xe0\\x5b\\xd4\\x65\\x8a\\x09\\xb9\\x8b\\x9d\\x53\\x19\\x08\\x79\\x6f\\x23\\x94\\xc9\\xab\\x5c\\xd3\\x55\\x99\\x0b\\x80\\x23\\x5b\\xfa\\xad\\xb6\\x5b\\x68\\x01\\x27\\x22\\x76\\xbe\\x9f\\xe0\\x67\\xc4\\x95\\x05\\x44\\x0b\\x25\\x49\\x5a\\x44\\xde\\x98\\xfa\\x30\\x5b\\x87\\x8d\\xbe\\x3f\\x90\\x18\\xd8\\x8e\\xda\\x08\\x40\\xde\\xb1\\xf5\\x64\\x15\\x3f\\xb0\\x75\\xe7\\x9a\\x9f\\x6d\\x12\\xa3\\xc6\\x12\\x7d\\x2b\\x22\\xf3\\xbe\\x84\\x85\\x60\\xf9\\x53\\xe9\\x12\\x6e\\x5c\\x4e\\xf6\\x27\\x31\\x94\\xfe\\xb4\\x79\\x4c\\x95\\x01\\x90\\x2d\\x32\\x70\\xcb\\x70\\xc7\\x26\\xb0\\xe6\\x4d\\xf7\\x8b\\xc5\\x8d\\x21\\x91\\x61\\x48\\x0c\\xb0\\x31\\xd6\\x6d\\x83\\xcd\\x91\\xf0\\x7d\\x31\\x27\\x8b\\x0a\\xee\\x62\\xc8\\x74\\xb0\\xa8\\x2c\\x8c\\x32\\xd5\\x93\\x03\\xcc\\x81\\xd1\\x68\\x64\\xda\\x2d\\xb8\\xc3\\x60\\x6b\\x5d\\x1f\\x82\\x76\\x85\\x1d\\x96\\x59\\x16\\x79\\xb9\\x85\\x77\\x99\\x60\\x19\\xcc\\xe6\\x16\\xdd\\x69\\x6b\\x65\\x81\\xf3\\xb8\\x35\\x55\\x87\\x16\\x3b\\x92\\x4f\\x32\\x3d\\x89\\x88\\x06\\xeb\\x86\\xae\\xf3\\xfd\\x22\\x58\\xd7\\x1a\\x43\\x92\\x3c\\x35\\x77\\xcb\\x76\\x5b\\x06\\x66\\x68\\x8a\\xc6\\xa8\\xe0\\x9a\\x7e\\xa1\\x59\\x11\\xcd\\x8f\\x17\\xb0\\x16\\x61\\x44\\x9b\\x5a\\x66\\x7f\\x6f\\x45\\x9d\\x3d\\x76\\x45\\xe4\\xb2\\x2b\\xee\\x77\\xb3\\x3f\\xee\\x77\\x18\\xe2\\xb9\\x6c\\xd1\\xfd\\xfc\\xd0\\xa9\\x6d\\xea\\x53\\xa5\\x6a\\xbe\\xcb\\xa8\\xa0\\x38\\x55\\x3a\\x44\\x43\\xe0\\x44\\x9f\\x3b\\xe6\\xa5\\x17\\x24\\x26\\xf4\\x4e\\x71\\xee\\x8b\\x1e\\xcf\\xb1\\x20\\x42\\x6b\\x23\\xad\\xd1\\x67\\xd0\\xa9\\x68\\xd8\\x95\\xed\\x63\\x2a\\x0f\\xae\\x3e\\xf8\\x59\\x42\\x78\\x9f\\x35\\xf5\\xa9\\xc7\\xa0\\x3b\\x74\\x18\\x52\\x69\\x87\\xed\\x44\\x6a\\xe6\\x57\\xc3\\x8b\\x33\\xae\\x26\\x1b\\x8e\\xd9\\xc0\\x33\\xc0\\x5a\\x43\\x4b\\x64\\xea\\x3c\\x08\\x4c\\x2a\\x80\\x9f\\x8c\\x83\\x73\\x87\\x95\\x9e\\xef\\x72\\xaf\\x92\\xec\\x96\\xfa\\x2d\\x9f\\x69\\xda\\xbc\\xd2\\xec\\xfa\\xdd\\x36\\x41\\x6b\\x5d\\xc0\\x5a\\xe7\\x16\\x07\\xef\\xd6\\x54\\x82\\xff\\x47\\xed\\xc9\\xd7\\x22\\x1a\\x0f\\xc0\\x3b\\x5d\\xd2\\xbe\\x78\\x8b\\x83\\x9f\\x71\\xb1\\xb2\\x0d\\x7a\\x00\\x3e\\xf4\\xf2\\x35\\x01\\xeb\\x14\\xb9\\xed\\x16\\xb9\\xd0\\xc8\\xda\\x29\\x72\\xda\\x2d\\x72\\xa9\\x9e\\xa2\\x4e\\x89\\x63\\x5d\\xe2\\xd2\\xb5\\x64\\xf6\\x00\\xbc\\xd0\\xc9\\x8e\\xa1\\x7f\\xf1\\x13\\x67\\xeb\\x0b\\x09\\xab\\x63\\x73\\x7c\\x3c\\x00\\x6f\\x74\\x31\\xb9\\xf9\\xdb\\x19\\x5f\\x74\\x46\\x83\\xe7\\x3d\\x00\\xef\\xfb\\xf6\\xad\\xd7\\x5d\\xab\\x43\\x78\\xa6\\x53\\x9a\\x91\\x7c\\x1c\\x34\\x57\\x3c\\xd7\\xa9\\xda\\x8b\\x25\\x80\\x27\\x6d\\xcd\\x8a\\x2b\\xfd\\x69\\x5c\\x01\\x17\\x4d\\x63\\x1f\\xfa\\xae\\x76\\xde\\xa1\\xe5\\xd1\\x5d\\xe4\\x1d\\x78\\xf0\\x12\\x2d\\x8f\\xd6\\x6a\\x73\\xb6\\x1c\\x68\\x01\\xd7\\x9b\\x78\\xe0\\x5d\\x1b\\xaf\\xc3\\x9e\\xbc\\x8d\\x77\\x58\\xb4\\xd9\\x0e\\xa3\\x57\\xb0\\x1e\\x64\\xf4\\x0d\\xec\\xb9\\x2b\\x18\\x10\\x6c\\x36\\xb6\\x70\\xd0\\xf5\\x40\\xd5\\x5b\\xa2\\x68\\x7a\\x08\\xdb\\x00\\x8e\\xa6\\xaa\\xef\\x3d\\x06\\x5e\\xf0\\x29\\x5b\\x33\\x9a\\xaa\\x81\\xee\\x5f\\xf9\\xe8\\xa5\\x2a\\xd4\\x5d\\xf7\\xe8\\xa5\\x9a\\xc4\\x8e\\x4d\\x1d\\xbd\\xfc\\x1e\\xee\\xdd\\xd2\\xd1\\xcb\\x1f\\xe0\\xde\\x0d\\x1d\\xbd\\x3a\\x84\\xfb\\xb6\\x73\\xf4\\x4a\\x69\\x47\\x75\\xd7\\x3d\\x7a\\xf5\\x0d\\xb4\\xcb\\x26\\xf1\\xed\\x10\\xcf\\xf8\\xf9\\x66\\xdd\\x7b\\xdc\\x46\\xbc\\x7c\\xbe\\xb3\\x63\\xc5\\xc9\\xf3\\x3e\\x65\\x9f\\x33\\x76\\x9f\\x35\\x92\\x9f\\x9a\\xe1\\xcb\\x77\\x73\\x9e\\x39\\xb0\\x2f\\x77\\x31\\xe7\\x8b\\x20\\x83\\x1c\\x12\\x30\\x6b\\xb1\\x25\\x14\\x29\\xea\\xfb\\xb1\\x7c\\x3a\\xb3\\x70\\x4d\\x8a\\x02\\xdf\\xb6\\xbc\\xca\\xb3\\x86\\x9a\\xd1\\xd2\\x13\\x00\\x33\\x54\\x8b\\x2e\\x66\\x8d\\xa8\\x37\\xa8\\xbd\\xc5\\xa0\\x2c\\xbc\\xa7\\x69\\x7a\\xe5\\x30\\x14\\x1a\\x07\\x32\\xbd\\x4c\\xb9\\x87\\x00\\x14\\xfd\\x50\\x09\\x45\\x48\\x8b\\x5f\\x70\\x4a\\x93\\xfa\\xce\\x00\\x8d\\x43\\x3f\\x2d\\x4f\\xd6\\x43\\x12\\x2d\\x85\\x01\\xa5\\xff\\x2d\\x6f\\x93\\x9a\\xe8\\x6a\\x94\\x14\\x7c\\x9f\\x07\\x22\\x74\\x58\\x71\\xd0\\xc9\\x84\\x19\\x80\\x02\\x21\\x94\\x1e\\x2d\\xc3\\xbe\\xab\\x96\\x80\\x05\\x19\\x00\\x91\\x2c\\x90\\xd7\\x05\\x5a\\x0e\\x57\\x9c\\x12\\x49\\x5d\\xc2\\x1e\\x5b\\x93\\xb9\\x6c\\x79\\x48\\x91\\x69\\xd0\\xb9\\x48\\xb3\\x5a\\xd5\\xd7\\xf7\\x69\\x90\\x39\\x8a\\xbf\\xa0\\x1b\\x7a\\xc1\\xb2\\x70\\xed\\x24\\x8b\\xd0\\x9e\\xb5\\xda\\x93\\x25\\x69\\x05\\xef\\x08\\x08\\x92\\x80\\x05\\x4a\\x94\\x5d\\x16\\x2b\\xe5\\x12\\x04\\x8a\\x4a\\x7b\\xc2\\x74\\xae\\xcb\\xa7\\x48\\x98\\x87\\x6e\\xd3\\xd4\\x5c\\x0c\\x76\\x87\\x16\\x07\\x2d\\x4f\\x37\\xe6\\x1e\\x6e\\x15\\x68\\xfb\\xab\\x31\\x17\\x72\\xab\\x84\\x83\\xff\\x97\\x2d\\x4c\\xbe\\xc7\\x27\\xdf\\x9e\\x41\\x44\\xd3\\xef\\xe0\\xbe\\x21\\x44\\xd3\\x6e\\xf5\\x06\\xed\\xbe\\x3c\\x7c\\xa2\\x4c\\x69\\xdf\\xf1\\x7f\\xcc\\x8a\\xd6\\x39\\xfe\\x35\\x61\\xc7\\x82\\xc6\\xd1\\xc7\\x2d\\x11\\x35\\xe3\\xda\\x38\\xfc\\xc8\\x0d\\x33\\xa4\\xe7\\xc9\\x7d\\xf3\\xc5\\x5a\\xff\\xe6\\xf8\\x96\\xfc\\xaf\\xf3\\xe5\\xb2\\x20\\x62\\xbb\\x4d\\x58\\xac\\xc4\\xf7\\xa1\\xfd\\x61\\x8e\\x97\\x61\\xfc\\xbf\\x27\\x4b\\x01\\x1f\\xdc\\x9a\\xff\\xf1\\xc4\\x9a\\x57\\x2c\\xaf\\xfe\\x60\\x97\\x31\\x1d\\xbb\\xe0\\xff\\xac\\xb3\\x8d\\x97\\x8f\\x19\\x15\\x67\\xa1\\xbb\\x5d\\x1e\\xdb\\xd0\\x59\\xf8\\x9e\\x66\\x9f\\x7b\\xa5\\x64\\xa2\\xca\\x6d\\xed\\xad\\x47\\x37\\x7f\\x16\\xda\\xbd\\xb6\\xef\\x14\\x64\\xe1\\x70\\x6b\\x4d\\x2b\\xfa\\x29\\x65\\x64\\xc2\\xc3\\xe5\\x1a\\x9d\\x35\\xd3\\x9c\\x2d\\xdd\\xa9\\x0d\\xb3\\xd0\\xbd\\xa7\\x1f\\x21\\x4c\\xb3\\xb0\\x73\\x6d\\x3f\\x4e\\xa8\\xca\\x39\\xb7\\x2e\\xf2\\xc7\\x09\\xd7\\x2c\\x6c\\x5f\\xed\\x8f\\xd2\\xb1\\x59\\x78\\x45\\x0a\\xb1\\xab\\xb8\\x9b\\xa7\\x0a\\x0f\\x13\\x3f\\x4f\\xa6\\xde\\xb3\\xf0\\xd2\\x1c\\x86\\x2b\\x96\\xef\\xaa\\x3d\\x50\\xc4\\x85\\x5f\\x97\\xd0\\xcd\\xc2\\x0f\\xf8\\x8e\\xde\\x3a\\xe3\\x6f\\xbe\\x6b\\x88\\x98\\x2d\\xa1\\x6d\\x70\\x94\\x34\\xb4\\xb9\\x68\\x5a\\x98\\xd3\\xcd\\xa8\\x8b\\xf5\\xb7\\x7d\\xbb\\xb4\\x9b\\x5f\\x57\\x1a\\xd8\\xdf\\xed\\x5a\\xad\\x02\\xcd\\x90\\x5a\\xdb\\xbc\\x33\\x2a\\x93\\xd7\\x1e\\x7f\\x9f\\xce\\x7c\\xda\\x23\\xc4\\x36\\xd2\\x2b\\xad\\xc1\\xcd\\x4b\\xd3\\x0e\\x2f\\x33\\x9b\\xac\\xef\\x92\\x36\\x99\\xee\\x40\\x3b\\x7a\\xdd\\x23\\xbe\\x15\\xc0\\xa3\\xe9\\xf4\\x39\\x34\\xf4\\xfe\\xad\\x10\\x4d\\x5f\\x3f\\xef\\x12\\x53\\x18\\x27\\x9a\\x7e\\xff\\x9f\\xb9\\xdb\\x86\\xd0\\x89\\xb1\\x29\\xd8\\x85\\x3e\\xa2\\x97\\x2f\\x61\\x17\\xae\\xd1\\xcb\\x57\\x4f\\x7e\\x24\\xfc\\xdf\\x7e\\x0d\\xec\\xc0\\x02\\xd1\\x2b\\x35\\xad\\x66\\x53\\x44\\xaf\\x5e\\xc9\\xcb\\xe3\\x31\\xfb\\xf9\\x41\\x63\\x63\\xcd\\x80\\x22\\xdb\\x2d\\xee\\x53\\xb3\\x83\\xc6\\xc7\\xaa\\xf6\\x76\\xdb\\x76\\xaa\\x4d\\x80\\xef\\x93\\x90\\xdc\\x11\\x2e\\x89\\x7a\\x63\\x71\\xdc\\xd0\\x6c\\x1d\\x6f\\x1e\\xae\\xd5\\xff\\xcb\\xe7\\x99\\x48\\x13\\x84\\x50\\x61\\x64\\x2e\\x81\\xd5\\x19\\x99\\xa0\\xa9\\xd5\\x19\\xd0\\x9c\\xf5\\xbc\\xcf\\xdd\\x95\\xf4\\x78\\x44\\xaa\\x59\\x3c\\xe0\\x48\\x1d\\x6c\\x0c\\xb7\\x3a\\x87\\xa2\\xa5\\x43\\xc2\\x6a\\xe6\\x51\\xbf\\xc5\\xd9\\x0e\\x2f\\xf4\\xdb\\x6d\\x90\\xd7\\x12\\x31\\xef\\xc0\\x9b\\x10\\x2d\\xb8\\x73\\x9e\\x0f\\xea\\xf5\\xc0\\x02\\x60\\x1b\\xa7\\x33\\xaa\\xf9\\xeb\\x3c\\x20\\xdb\\x6d\\x11\\x7e\\x3c\\xff\\x08\\x34\\xa5\\x42\\x8d\\x9e\\xe5\\x3e\\xce\\x8d\\x55\\x00\\x6f\\xf0\\x71\\x8c\\x94\\x50\\x67\\x3c\\x85\\x39\\xda\\xf4\\xd8\\xe9\\x2d\\x36\\x70\\x6c\\x69\\x6d\\xc8\\x02\\x00\\xd3\\xed\\x36\\x30\\x84\\x15\\x4e\\x92\\xd3\\x3b\\x92\\x09\\x5b\\xeb\\x68\\x47\\x7a\\xe0\\xad\\x70\\xb1\\x8a\\x55\\x0f\\x1e\\xc4\\x72\\xaa\\x96\\x36\\xc3\\x42\\xe0\\x78\\xa5\\x4a\\x07\\x1e\\xcb\\x5a\\xe5\\x24\\x39\\x3e\\x3e\\x54\\xdc\\xba\\x3e\\xa3\\xbc\\x3d\\xc2\\x01\\x49\\x52\\xa3\\x1b\\x23\\xc6\\x08\\x91\\x0a\\xc0\\x43\\x84\\x50\\x5c\\x87\\x3d\\xb3\\x93\\xd0\\x8d\\x0f\\xce\\x63\\x20\\x6b\\xcf\\x54\\x9c\\xd2\\xc3\\x53\\x99\\x82\\x0a\\x4a\\x48\\xb6\\x7d\\xc9\\x99\\xad\\x6a\\xe3\\x14\\xd9\\xf3\\x2c\\x9f\\xc1\\x2b\\x44\\x6a\\x19\\x74\\xaf\\x92\\xf1\\xae\\xd3\\xab\\x67\\xb7\\x55\\x37\\xdd\\xb2\\xcb\\x27\\xdd\\x8c\\x82\\x60\\x1e\\xaf\\x26\\xde\\xbf\\xc9\\x6d\\x58\\xc1\\xbc\\x2d\\xda\\x50\\xe3\\x3b\\xff\\x08\\x4b\\x1b\\x39\\xe9\\x71\\x3e\\x7e\\x42\\x62\\x96\\x90\\x4f\\x17\\xef\\x7a\\x63\\x58\\x71\\xb2\\x0c\\x8b\\x3c\\xa5\\x22\\xf0\\xfe\\xcd\\x03\\xf3\\xe9\\x62\\xbb\\x55\\x7e\\xe7\\xad\\xbb\\xe1\\x7e\\x6b\\xde\\x1b\\x17\\xaf\\xfe\\xd9\\x6b\\xf9\\xd9\\xb1\\xaa\\x74\\xad\\xab\\xee\\x31\\x2f\\x40\\x2f\\x1f\\xb3\\x8e\\x6c\\x63\\x13\\x17\\x67\\xc4\\xbb\\x71\\x46\\xb1\\x0f\\x67\\xc4\\x3d\\x9c\\x21\\x1b\\x66\\x34\\x19\\x69\\x33\\x70\\xe5\\xbe\\x4f\\xbe\\xeb\\xb1\\x3e\\xd7\\x35\\x6e\\xdc\\x7b\\xa8\\x69\\xef\\x50\\x1b\\x89\\xe7\\x78\\x0a\\xe3\\xc7\\x0e\\x75\\x51\\x1f\\xea\\xf2\\xf7\\x1c\\xe8\\x9c\\xe5\\x85\\xb6\\x94\\x66\\x7b\\x8e\\xb3\\x53\\x4a\\xe2\\xa0\\xa7\\x1d\\xe6\\x02\\x15\\x4f\\x3c\\xcc\\x45\\xef\\x30\\xef\\x9a\\xc0\\xe0\\x49\\xde\\x31\\x87\\xce\\x39\\xee\\xce\\x61\\xf0\\x14\\x77\\x82\\x8c\\xc9\\x7c\\x2d\\x98\\x30\\x52\\xdc\\x0a\\x7a\\x9e\\xf2\\x37\\xd0\\xdc\\x46\\x50\\xad\\xf6\\xa7\\xcb\\x9f\\xc1\\xf0\\x19\\xef\\x34\\x69\\x8a\\x0c\\xb6\\x2a\\x5b\\x32\\xe8\\xc0\\x1c\\x60\\xaa\\x4e\\xeb\\x7f\\xe6\\xa8\\x3e\\x82\\x2e\\x1e\\x3b\\xb3\\x6d\\x6a\\xa7\\x73\\x6c\\xe3\\xdf\\x73\\x6c\\x5f\\x3d\\xcd\\x02\\xd4\\x7d\\x76\\x38\\x6f\\x22\\xd6\\x3b\\x2b\\x18\\x6d\\x76\\x2d\\x63\\x5a\\xbf\\xb3\\xf6\\x2e\\x4d\\x0f\\xe5\\x5a\\xf4\\xc9\\x06\\xa1\\xdf\\x15\\x27\\xef\\x05\\x60\\x87\\x1a\\xec\\x00\\x10\\x0f\\x01\\x70\\x88\\xc4\\x94\\x70\\x7b\\xcc\\x4e\\xb1\\xc5\\xae\\xa1\\x4a\\xfd\\xc8\\x51\\x19\\x5c\\xb3\\x84\\x2e\\x1f\\xfa\\x4a\\x8c\\x1e\\xf8\\x57\\x38\\xb5\\xff\\x9a\\x20\\x0c\\x2e\\xeb\\x69\\x67\\x58\\xb5\\xc1\\x80\\x6a\\x48\\x0c\\x84\\x1f\\x68\\x6f\\xc2\\xc7\\x9c\\x75\\x61\\xc7\\x00\\x62\\x4f\\x4c\\x00\\x5d\\xe7\\xab\\x37\\xed\\x37\\xca\\x6e\\x3f\\xff\\xc6\\xdf\\x75\\xe1\\x38\\xbc\\x94\\x87\\x11\\x71\\x58\\xb4\\x5c\\x68\\xaa\\x73\\xd5\\x49\\xcd\\x59\\x8e\\x78\\xd7\\x58\\x77\\x0f\\xc3\\xec\\xd5\\xbf\\xcc\\xe2\\xfe\\x6f\\x99\\xc5\\xed\\xdc\\xc7\\xf4\\x51\\xe2\\xa6\\xe8\\x21\\xec\\x72\\xf7\\xde\\xe7\\xf5\\xde\\xff\\x1f\\xda\\xbf\\x89\\xe1\\x41\\x09\\xa5\\x8e\\xa6\\x92\\xd2\\x3a\\xdc\\xab\\x4d\\x31\\xc6\\x48\\x16\\x6b\\x2a\\xa0\\x07\\x8e\\xc5\\x79\\x7d\\x62\\xac\\x2a\\xb5\\x27\\x31\\x7a\\x7f\\xd7\\x8f\\xa7\\x5d\\xfb\\xa6\\x56\\x93\\x43\\xc6\\xae\\x66\\x89\\x91\\x3b\\x58\\x1b\\x1c\\xb9\\x6e\\x2b\\x63\\x82\\x2e\\x1f\\x8e\\xcd\\x13\\xa2\\x6f\\x64\\xd4\\x84\\x63\\x36\\xde\\xe9\\xad\\xd7\\x97\\x21\\xfa\\x14\\x66\\xe8\\x10\\x72\\xd4\\x06\\x45\\xbd\\xd3\\xde\\xf0\\xd9\\x64\\x92\\x81\\x76\\xee\\x3c\\x5b\\x38\\xb2\\x61\\x27\\x36\\x48\\x8f\\xb0\\xdc\\x69\\xc1\\xd5\\xf4\\x64\\xa5\\x35\\x8d\\x89\\x50\\x9f\\x0a\\x7c\\xbc\\x99\\xee\\xf8\\x1f\\x25\\x13\\xeb\\xfe\\xb4\\x27\\xd5\\x1d\\xed\\xbb\\x64\\x5b\\x60\\x11\\xe8\\xf0\\xf6\\x30\\x79\\xee\\xda\\x04\\xd4\\x90\\x71\\xcd\\xdc\\x8c\\x9b\\xd6\\x7e\\x77\\xda\\x51\\x55\\x67\\xc9\\x5b\\xf7\\xad\\xa9\\xdc\\xd2\\xee\\x57\\x1a\\x9f\\x4a\\xe7\\x3f\\x63\\x8e\\xaa\\xaf\\xdb\\xd4\\x7c\\xa0\\xdd\\x17\\xd3\\x85\\x75\\xa1\\xdc\\x1d\\x70\\x4d\\x2d\\xd6\\xf0\\x61\\xf9\\x2e\\xc3\\xbe\\x1a\\x3a\\x4a\\x49\\xf9\\xf9\\xb0\\x51\\x8c\\x0a\\xf8\\x3b\\x2e\\x9f\\xfd\\x53\\x7b\\xfa\\xb5\\xe4\\xbd\\x71\\x59\\x63\\x92\\x94\\xea\\xc7\\x5b\\x28\\x9f\\x4d\\x92\\xee\\x15\\xd2\\xbc\\x7a\\xcc\\xcd\\x6f\\x5f\\x44\\x3e\\x10\\x9b\\x43\\xf8\\x7e\\x90\\x21\\x01\\x85\\xb6\\x8c\\x30\\x17\\x15\\x0b\\x6a\\x33\\x18\\x68\\xa9\\x31\\x15\\xeb\\xc6\\xf2\\xde\\x54\\xd4\\x75\\x89\\x8f\\x5d\\x87\\xd8\\x6d\\xc6\\x71\\x57\\x26\\xd5\\x67\\x80\\xca\\x49\\x3c\\x43\\xce\\x6f\\xd9\\x54\\x99\\x66\\x33\\x33\\x1e\\x96\\x05\\xe1\\x6f\\x6f\\x49\\x26\\xcc\\xb8\\x82\\x17\\x53\\xc5\\x04\\xb3\\xd1\\x1c\\xbc\\xb7\\x59\\xc2\\xe5\\x13\\xf8\\x65\\xe8\\x01\\xdf\\xdf\\x95\\xfb\\x4d\\x78\\xe8\\x81\\xed\\xb6\\x9b\\x7d\\xc6\\x6e\\x68\\x4a\\x46\\x97\\x78\\x89\\x39\\xd5\\x05\\xc6\\xad\\x02\\xc7\\x2b\\xce\\xd6\\x64\\x28\\x47\\xbb\\xc1\\x2f\\x46\\x1f\\x57\\x2c\\x23\\x1e\\x00\\xcd\\xeb\\xd1\\xec\\x31\\xdf\\xf7\\xea\\x07\\x9c\\xbc\\x3e\\xdb\\xb9\\x60\\x20\\x4c\\xf6\\x33\\x24\\xa2\\x5a\\x2d\\xc0\\x70\\x54\\x87\\x29\\x8a\\x96\\x30\\xd6\\xe2\\x85\\x1b\\xa2\\x48\\x0c\\x92\\x18\\x44\\x60\\x6c\\xc1\\xcb\\x4c\\x5f\\xe1\\x89\\x57\\xaf\\xbf\\xae\\x2e\\x91\\x6d\\x33\\xd0\\x56\\x93\\xae\\x02\\x7d\\xdb\\xfc\\x8d\\x41\\xac\\x83\\x52\\x52\\x34\\x9d\\xd1\\x7e\\x10\\x79\\x2a\\x49\\x92\\xcc\\x09\\x20\\x4f\\x17\\x90\\xd9\\xc6\\x3f\\x93\\x87\\x22\\x30\\x9d\\x67\\x00\\x34\\xc6\\x7c\\xe8\\x70\\x56\\xbc\\xa9\\x63\\x58\\x17\\x93\\x09\\xc0\\x73\\x36\\x2f\\x16\\x0b\\x94\\xe9\\xbf\\x55\\x13\\x2e\\x57\\xc3\\x73\\x40\\xc4\\xd9\\xcc\\x45\\x0b\\xbf\\xe8\\xcd\\x81\\x15\\x74\\xa8\\xdf\\xd1\\xab\\xef\\x64\\xcd\\x01\\xfe\\xb6\\xf3\\x2e\\xac\\x83\\x12\\xd6\\x2f\\xc2\\x03\\x15\\x37\\xb1\\x75\\x20\\x36\\x75\\xa9\\x88\\x43\\x95\\x1d\\xb1\\x4a\\xf7\\xa4\\x0b\\x47\\xaf\\x14\\x6f\\xbf\\x69\\x2c\\x7a\\xa5\\x1e\\x5a\\x03\\x5c\\x6a\\xa7\\xef\\xd2\\x68\\x64\\x31\\xb4\\x49\\x48\\x4a\\xd7\\x54\\x10\\x1e\\x79\\xbe\\x07\\x13\\xa5\\x28\\xf9\\x1a\\xaa\\x20\\x89\\xef\\x65\\x46\\xf4\\xf2\\x10\\xd6\\xe1\\x94\\x74\\xca\\x94\\xbc\\xaa\\x66\\x4c\\x47\\x79\\xfc\\x45\\xa2\\xb9\\xae\\x63\\xc9\\x86\\x88\\xdc\\x54\\xca\\x84\\x51\\xb3\\xd9\\x24\\x89\\x67\\x3a\\xb3\\x21\\x68\\xea\\x46\\x11\\x42\\xd3\\x83\\xc3\\x23\\xcd\\x87\\x8a\\xba\\xb9\\x92\\x7e\\x3b\\x84\\xb4\\x09\\x3e\\x8e\\xdf\\xd0\\xd9\\x64\\x82\\xf5\\xa4\\x0a\\xc4\\xe6\\x78\\x01\\x4b\\xa4\\x0e\\x66\\xd1\\x9c\\xae\\x05\\xf2\\xc0\\x91\\xf3\\x8d\\x3c\\x10\\x75\\xb2\\x27\\xd3\\x19\\x5d\\x6a\\x74\\x50\\x82\\x6c\\xce\\x43\\xcd\\x85\\x08\\x0a\\xb0\\x40\\x9e\\xd7\\x18\\x28\\xc5\\xa8\\xc9\\xaa\\xe3\\x82\\x96\\x00\\xc0\\xb4\\x9f\\x51\\x4e\\xa6\\xda\\x6e\\xda\\x6c\\xc6\\xe6\\xb9\\xd0\\x51\\x27\\x8a\\x01\\x88\\x59\\x26\\x68\\x56\\x92\\x59\\xd6\\xcf\\x3c\\xca\\xe6\\xf1\\x02\\xcd\\x17\\x92\\x9a\\x8e\\xb1\\x08\\xe4\\x27\\xb0\\x1f\\x29\\x88\\x54\\x76\\x5a\\x53\\xc7\\x59\\x05\\xcd\\xa2\\xe8\\x7e\\x7b\\xce\\xfe\\xe5\\x3b\\xc2\\x9a\\x93\\x5a\\x6b\\x00\\x61\\x59\\x15\\xda\\xff\\xaa\\xa2\\x94\\x37\\x95\\x1c\\xbc\\x37\\x5f\\x78\\x08\\x21\\x0e\\xb0\\xa4\\x52\\x31\\xc2\\xb6\\xe7\\x56\\x27\\xd6\\xca\\xa8\\x81\\x14\\x45\\xde\\x5c\\x55\\x9c\\x1f\\x2e\\x7c\\xdf\\xd3\\x8d\\xcc\\x79\\x73\\x59\\x1e\\x71\\x03\\x27\\xf9\\x50\\xb0\\xa9\\x20\\xe2\\xb0\\x40\\xaa\\xe1\\x77\\x99\\x08\\x28\\x9c\\x1e\\x4a\\x2a\\xdb\\xf3\\x26\\xc5\\x6c\\x4c\\x8b\\x0f\\xf8\\x43\\x50\\x00\\xdf\\xe7\\x63\\x65\\x1e\\x52\\x22\\xf5\\xa7\\xf8\\x33\\x3a\\xf4\\xfd\\xe2\\x0d\\xca\\xc2\\x66\\xc3\\x1e\\x05\\x7a\\xc0\\xf3\\x62\\x81\\x06\\x87\\x1a\\xe1\\x39\\x1d\\xce\\x6a\\xce\\xbe\\x85\\xe4\\x5f\\xc9\\x43\\x31\\x04\\x47\\x62\\x8f\\xd3\\xc1\\xdf\\x82\\xf9\\xdf\\x7e\\x9b\\xff\\xb6\\x58\\x7c\\x0d\\x0e\\x20\\x46\\x07\\xc1\\x6f\\x73\\x9b\\xf0\\xdb\\x02\\x1c\\xdc\\x42\\x2a\\xdf\\x47\\x5f\\x48\\x1c\\x10\\x1d\\x37\\xf7\\xb1\\x4d\\x41\\xe7\\xd3\\x05\\xb0\\x1b\\x7b\\xbe\\x98\\xc9\\x6f\\xdf\\x37\\x54\\xab\\xca\\xac\\xb1\\x59\\x29\\x1f\\x69\\xda\\x8d\\x47\\x40\\x11\\xb6\\xdd\\x00\\xdf\\x2f\\xdf\\x64\\xa1\\x3a\\xcb\\x33\\x30\\x99\\x94\\xf0\\x29\\x7d\\x3a\\x61\\x58\\xe7\\xdb\\xdf\\x16\\x07\\xb7\\xd0\\xf3\\x00\\xd8\\x6e\\x5b\\x3d\\x5b\\xcb\\xfb\\x7a\\x40\\xde\\xdc\\x9b\\x10\\xb3\\x9e\\x54\\x1f\\x2d\\x30\\xf1\\x16\\x12\\xb7\\xb4\\x00\\x5c\\x98\\x10\\x1d\\xae\\xf1\\x79\\xef\\x95\\xeb\\x29\\xd1\\x94\\x0e\\xed\\xa3\\x7f\\x69\\x7c\\x20\\x7f\\x9b\\x0d\\xbb\\xa9\\x66\\x26\\xba\\x1e\\x74\\xd0\\x09\\xea\\x59\\xce\\x3a\\x99\\xdb\\xad\\xd6\\x19\\x57\\x41\\xa4\\x9d\\x74\\x70\\xe4\\x7c\\x44\\xac\\x85\\x9c\\x14\\xec\\x90\\xa7\\x95\\xd1\\xdb\\xad\\xe6\\x62\\x75\\x64\\xfe\\xaa\\x4a\\xb9\\x58\\x41\\xe1\\xec\\xbf\\xa1\\x5a\\xce\\xee\\x74\\x3f\\x22\\xe6\\x7c\\xf4\\x51\\xe2\\x40\\x43\\xed\\x12\\x47\\xdd\\x84\\x88\\x75\\x12\\x66\\x0d\\x2a\\xee\\x81\\x88\\x1c\\xb5\\x70\\xb8\\x5a\\x85\\x88\\xa8\\xf3\\x0f\\x69\\xeb\\x22\\xcd\\x80\\x09\\x39\\x4f\\xeb\\x8b\\xd3\\x44\\x9a\\x37\\xb8\\x91\\xce\\x8b\\x05\\x4c\\x91\\x73\\x68\\x82\\x18\\x4a\\xf4\\x04\\x05\\x98\\x61\\xc4\\xc3\\x35\\xe1\\xb7\\x24\\xc0\\x30\\xad\\xcf\\x18\\x0f\\x63\\xb6\\xce\\x71\\x2c\\x02\\x0c\\xcc\\x8d\\xa6\\x6f\\xa5\\xe8\\x9b\\x43\\x79\\x81\\x0d\\x08\\x46\\x9e\\x72\\x81\\x29\\x78\\x7e\\xe4\\x64\\x49\\xbf\\xfc\\x45\\xbe\\xcb\\x24\\xf9\\x57\\x44\\x1b\\x1b\\xe7\\x77\\x47\\xb0\\xed\\x89\\x44\\x76\\x15\\xa4\\x59\\x42\\x63\\xb2\\xa7\\x90\\x37\\x11\\x72\\x73\\x2b\\x4e\\x2c\\xc1\\x62\\x47\\xc1\\xaa\\x92\\xd7\\x63\\x7d\\x25\\x0f\\xe1\\x0f\\xb9\\x23\\x7f\\x2c\\x97\\x4b\\xc2\\xb5\\xf9\\x05\\x09\\xed\\xcb\\x21\\x00\\x51\\xdb\\x14\\x16\\x0b\\x62\\x0a\\xbc\\xbb\\x3c\\xaf\\xcb\\xd8\\x23\\xa2\\x2c\\x86\\x3d\\x0f\\xc0\\xfe\\xf2\\x6e\\xb7\\xbd\\x0d\\x24\\xd3\\x6e\\x18\\x4b\\x09\\x76\\x28\\x7b\\x7b\\xb4\\xe6\\x24\\x33\\x0c\\x78\\xc7\\x15\\x0b\\x98\\x78\\xc8\\x9b\\x0c\\xe4\\x10\\xb0\\x30\\x51\\x22\\x25\\x8e\\x5a\\x06\\xbd\\x93\\x3a\\xc2\\xf5\\xe6\\x6b\\xef\\x26\\xf2\\x94\\xdd\\x34\\xc3\\xa8\\x2b\\xb1\\x3f\\x72\\x6e\\xa0\\x26\\xa2\\x33\\x91\\xbb\\x2c\\x0b\\x04\\x8c\\x81\\x46\\xee\\x3b\\x0b\\x09\\xb5\\x80\\xb1\\x5c\\x40\\x65\\xb3\\xd2\\x20\\xfb\\x5d\\x28\\xa9\\x1d\\x80\\xbc\\x9e\\xa1\\x83\\x36\\x8e\\x1c\\xb4\\x11\\xb9\\xf4\\x0d\\x37\\x60\\x31\\x11\\xa1\\x1b\\xcf\\x4b\\x0e\\x7a\\xab\\x03\\x89\\x6b\\x40\\xce\\x30\\x32\\xc8\\x41\\x47\\xa7\\x1e\\xd1\\x6c\\x64\\x10\\x44\\x77\\x43\\x1f\\xb5\\x0a\\x46\\x9e\\xd9\\xb8\\xf2\\x81\\x20\\x91\\x82\\xf9\\x3c\\xaa\\xd3\\x15\\x1f\\x80\\x60\\xe1\\x35\\x45\\x9d\\xc5\\xd9\\xd1\\x89\\xa4\\xa9\\x8a\\xee\\xca\\x95\\xe8\\x10\\xc6\\xb5\\xb0\\x6b\\x56\\xbe\\x89\\x67\\x93\\x49\\xa9\\x57\\x2e\\x45\\xc5\\xbc\\x5c\\xcc\\x38\\xe2\\xc3\\x6b\\x90\\x2e\\x60\\x0a\\x29\\x70\\x50\\x80\\x8a\\xc5\\x99\\x0d\\x9d\\xff\\x6f\\x06\\x24\\x2c\\xe6\\x96\\xbf\\x62\\x3d\\xfa\\xa6\\xc5\\x80\\xb2\\xfc\\x25\\xd2\\x65\\x29\\x35\\x42\\xce\\x79\\xb6\\xf0\\x7d\\xe5\\xf8\\x41\\xfd\\x6e\\x34\\x9b\\x2b\\x98\\x69\\x5c\\x35\\xc0\\x82\\xad\\xfd\\xdf\\x90\\xc1\\x85\\xad\\xb3\\x7b\\xfb\\x96\\xd8\\x88\\xb6\\x11\\x99\\x8b\\x05\\x1a\\x1f\\xc2\\xe1\\x16\\xea\\x93\\x43\\xd0\\x9c\\xd4\\x54\\x9f\\x00\\xb3\\xbe\\xee\\xca\\xb8\\x13\\x23\\x5e\\x7b\\x0e\\xe8\\x00\\x48\\x92\\x02\\x8d\\x56\\x7b\\x6b\\x25\\x85\\x44\\x9d\\x87\\xf2\\x85\\x65\\x81\\xc4\\xde\\xe0\\xd9\\x64\\xc2\\x80\\xa1\\xe1\\xf8\\x9c\\xc9\\xd5\\x17\\x73\\xba\\x98\\x91\\x39\\x5d\\x1c\\xc9\\xff\\x90\\x01\\x4e\\x20\\x3f\\x60\\x21\\xe7\\x43\\x17\\xa8\\xa8\\x6a\\xc4\\x07\\x33\\x43\\x0b\\xb7\\xd6\\x46\\x45\\x6a\\xea\\xc8\\xf8\\x1c\\x44\\xe2\\x10\\x1e\\x13\\x49\\x75\\x8c\\x3c\\x60\\x83\\x1d\\xb5\\x90\\x2a\\xcc\\xec\\x95\\x31\\x40\\x39\\x3c\\x7e\\xcc\\x46\\x44\\x53\\x0e\\xf3\\x85\\x21\\x79\\x85\\x13\\xcc\\x51\\x3f\\x02\\xc6\\x92\\xdc\\xb5\\x5b\\x61\\xce\\xd5\\x01\\xae\\x95\\xbb\\x61\\x77\\x15\\x9a\\x4d\\xc7\\x34\\x85\\x2c\\x5f\\x28\\xa4\\xfb\\x42\\x71\\x36\\x1d\\x5e\\xf8\\x3e\\x33\\xcd\\xcd\\x71\\xb3\\xeb\\x98\\xd1\\x19\\x6f\\x1f\\x35\\xb5\\x72\\xba\\xd1\\x62\\xf0\\xd9\\x53\\x22\\x79\\x44\\x67\\x64\\x5e\\xca\\x85\\xb1\\xb7\\xa9\\xfc\\x84\\x02\\xb4\\xd6\\xc4\\x52\\x3f\\xa8\\x6f\\xab\\xec\\xcd\\x35\\xe4\\x46\\xba\\x84\\xa2\\xd6\\x7b\\xd4\\xa2\\xbd\\x9b\\x34\\x0b\\x96\\x00\\xdd\\xa6\\xbe\\xbf\\x06\\xda\\x1c\\x19\\x9a\\x94\\xf8\\x7e\\x33\\x7b\\xdf\\x57\\x51\\x20\\x1c\\x4f\\x6f\\xbe\\xdf\\xfa\\xac\\x5b\\xdc\\x95\\x2e\\x41\\x6e\\x1e\\xe5\\xdf\\x3c\\x23\\xc8\\xdf\\x92\\xc5\\x65\\xf1\\x81\\x25\\xc4\\x06\\xf9\\x7b\\x2c\\x68\\xa3\\xf1\\xcf\\x5e\\x0a\\xf6\\x93\\xac\\xaa\\x4c\\x1c\\x0c\\x3b\\xfb\\xe4\\xfc\\x4c\\xb6\\x14\\x80\\xc1\\x60\\x73\\x4d\\x4f\\xd1\\xf4\\xb5\\x7c\\x85\\x7f\\xf3\\x9c\\x70\\x73\\x16\\x7a\\x41\\x2b\\x2a\\x46\\x13\\x2a\\xc3\\xc4\\xcf\\x90\\x87\\xbf\\x29\\xa2\\x3c\\xc9\\xa5\\x3a\\x6c\\x46\\x5b\\xa3\\xc3\\x44\\xc3\\x22\\x26\\x1a\\xd6\\xc7\\x50\\xb0\\x5c\\x1d\\x3a\\xad\\xdc\\x7e\\x29\\x30\\x17\\x51\\xed\\xd5\\x23\\xee\\xe4\\xcc\\x06\\x2b\\x9d\\x66\\xc9\\x60\\x95\\xd3\\x2c\\x19\\xae\\x60\\x42\\x5c\\x0e\\xd5\\xd1\\x59\\x55\\xcf\\xff\\x51\\x8d\\x02\\x11\\x52\\xad\\xfd\\x95\\x3c\\x9c\\xb0\\xfb\\xcc\\xf7\\xd5\\xc1\\x38\\x96\\xb8\\x05\\xa1\\xe3\\x9e\\xeb\\xa1\\xa1\\xe9\\xfe\\x95\\x3c\\x7c\\xca\\x4d\\xe7\\xea\\x70\\x9f\\xd6\\x27\\xbe\\x6e\\x0c\\xcc\\x5a\\xe5\\x65\\x57\\x51\\x6d\\xe6\\x62\\xca\\x8c\\x11\\x3a\\x6e\\x17\\xfb\\xc8\\x49\\x51\\x44\\x4d\\xd2\\x19\\x2b\\x0b\\xa2\\xea\\x36\\x69\\x3f\\xa6\\x25\\x8f\\xac\\x33\\xa1\\x99\\x31\\xa8\\x89\\x1a\\x31\\x4d\\x3d\\x83\\xa2\\xd1\\xec\\x21\\x61\\x42\\x04\\xa6\\xa9\\xd5\\xd5\\x33\\x58\\xcd\\x65\\xc2\\x7a\\x09\\x16\\xd8\\x5e\\xf4\\xf2\\xb7\\xb6\\xf1\\xac\\x5b\\x2b\\x9b\\xc0\\x7b\\x0a\\x49\\xc0\\x58\\x62\\xb1\\x8b\\xa3\\x12\\xc9\\x6d\\x11\\x5d\\x1d\\x49\\x80\\x71\\x79\\x5f\\x94\\xa8\\xbb\\x88\\x20\\xc2\\x3b\\x32\\xd5\\xa6\\x00\\x70\\x5c\\xb6\\x7c\\xc0\\xdd\\xfb\\x7e\\x70\\xb5\\xdd\\x96\\x63\\x34\\x50\\xfa\\x48\\x3e\\xd2\\xbb\\x3d\\xf8\\xfe\\x95\\xef\\x07\\x31\\xba\\x52\\xa7\\x09\\x0b\\x1c\\x00\\x10\\x5d\\xa1\\xb5\\xfc\\xfc\\x28\\x09\\xd3\\x24\\x10\\xc0\\xc6\\xd9\\xbe\\x73\\x52\\x4b\\x35\\x25\\x39\\x95\\x18\\xa4\\x6a\\xde\\x28\\x6e\\x78\\x0e\\x39\\x2a\\x02\\x0e\\xec\\x5b\\x38\\x57\\x31\\xb4\\x55\\x99\\xbc\\x46\\x84\\xcb\\x10\\xc7\\x71\\xb9\\x2e\\x53\\x2c\\xc8\\xd5\\x3d\\xfb\\xb8\\xc2\\x05\\x39\\x31\\xd6\\xf5\\xa4\\x08\\x52\\x00\\xd3\\x96\\xc7\\xa7\\x5d\\x9b\\x6a\\xf8\\x38\\xc8\\x1b\\x75\\x68\\x8b\\xd4\\x5b\\xe9\\x7e\\x45\\xe3\\xd5\\x18\\xa1\\xeb\\x23\\x39\\xc8\\x28\\x38\\x91\\x64\\xc0\\x99\\x5b\\xe7\\x8a\\x7c\\x11\\xef\\xb2\\xbc\\x14\\x91\\x26\\x37\\xf5\\xea\\xd6\\xf6\\x60\\x08\\xa1\\x33\\xdf\\x3f\\xd1\\xd5\\xb3\\xce\\x7e\\x1a\\x69\\x3b\\xdf\\x7a\\xfc\\x69\\x7d\\x31\\x5e\\x69\\x76\\x85\\x3d\\x4d\\xed\\xd1\\x6f\\xb7\\xfa\\xf4\\xe8\\xad\\x92\\xb9\\xab\\x32\\x6b\\x6c\\xca\\x49\\x4a\\x70\\x41\\x82\\x2b\\x00\\xaf\\x8c\\x57\\x85\\xca\\xed\\x75\\x08\\x48\\x1f\\x71\\xd1\\x1c\\x7b\\xb5\\x55\\x1e\\x85\\x8d\\xef\\x8f\\x79\\x20\\xc0\\x91\\xb9\\x69\\x96\\x9c\\xad\\x8f\\x57\\x98\\xcb\\xf3\\x17\\x98\\x22\\xfa\\xd5\\xf3\\x28\\x6a\\xba\\xd7\\x30\\x32\\xf0\\xdb\\x0f\\xa8\\xbc\\x7d\\x5a\\x98\\xe2\\xd0\\x04\\x0c\\x7d\\x39\\x8a\\xd5\\x49\\x88\\x52\\xf5\\x07\\xf4\\x5c\\x1f\\x62\\xf4\\xe0\\xec\\xce\\xf3\\xf0\\x86\\x2c\\x19\\x27\\x6a\\xfd\\xf4\\x4e\\xb5\\xaf\\x0b\\xbd\\x0f\\x19\\x7c\\x64\\xff\\x61\\x00\\xb1\\x22\\x03\\x8c\\xc9\\x96\\x52\\xf9\\x3a\\x66\\xea\\x1d\\x28\\x8a\\xc6\\x5a\\x4b\\xa5\\x7f\\xe4\\x2c\\xc7\\x4a\\xb2\\x21\\x73\\x8c\\xa9\\xf4\\xb0\\xe9\\x8f\\xb5\\x93\\xfe\\xc9\\x84\\xfe\\x6f\\x5f\\x01\\xca\\xb2\\xc1\\xd8\\x47\\x5f\\x3e\\x64\\x62\\x45\\x04\\x8d\\x5d\\xa8\\xde\\xe9\\x46\\x1e\\x3a\\x45\\xd4\\x3c\\x6d\\xa6\\x31\\x8e\\xfe\\x4c\\x1e\\xce\\x97\\xca\\x10\\x7a\\xfe\\x03\\x9c\\xbe\\x82\\x2f\\xbf\\x83\\xaf\\x5e\\x2e\\xe0\\x31\\x7a\\xf9\\xf2\\x07\\x78\\x81\\x56\\x8d\\x11\\x92\\xef\\x7b\\xbd\\x3e\\x6a\\xd1\\x06\\xbc\\xd1\\xbe\\xd0\\xda\\xe5\\xad\\x81\\xd4\\x99\\xbc\\x5d\\x69\\x36\\xb2\\xdf\\xbe\\x1f\\xdc\\xa0\\x9e\\x19\\xd5\\x99\\x42\\xec\\x12\\x9a\\x5f\\x3a\\xfd\\xca\\x43\\xd6\\xe9\\xd0\\xf7\\xc7\\x37\\xbe\\x3f\\xee\\x99\\xdf\\x1b\\x49\\x0b\\xcb\\x09\\xc7\\xbb\\xf0\\x31\\xf1\\xfd\\x01\\x51\\x19\\x09\\xef\\x08\\x2f\\x28\\xcb\\x7c\\xbf\\x66\\x68\\xd6\\x69\\x01\\x80\\xd3\\x43\\xf0\\x06\\x4d\\x5f\\x56\\x01\\x80\\xf7\\xed\\xf1\\x05\\xe3\\x8b\\xed\\xf6\\xc6\\xf7\\x6f\\xfe\\xfc\\xbd\\xef\\xdf\\xbc\\x41\\xd3\\x29\\x80\\xd7\\xe8\\xd5\\x4b\\x78\\x86\\x86\\xce\\xc5\\x35\\x80\\x1f\\x51\\x22\\x4f\\xc2\\x7b\\x72\\x47\\x52\\x6d\\x74\\x79\\x8e\\x36\\xce\\x66\\x8c\\x36\\xb9\\xdc\\x69\\xc9\\x05\\xb9\\xa5\\x85\\xd0\\x1e\\xab\\x95\\x1b\\xc3\\x68\\x73\\x53\\xde\\xdc\\xa4\\x24\\x89\\x6e\\x83\\x0d\\xcb\\x7e\\x74\\xaa\\xa8\\x33\\x02\\x60\\x8c\\x73\\x51\\xf2\\x81\\x02\\xc7\\x3a\\xc3\\x94\\xab\\x60\\x42\\x72\\x92\\x25\\x24\\x8b\\x29\\x29\\xa2\\xf9\\xc0\\xc9\\x84\\xad\\x83\\x0f\\xdb\\xe8\\x0e\\x36\\x18\\x63\\x61\\xdc\\x26\\x34\\x47\\xfa\\x89\\xa3\\xef\\x20\\x82\\xc1\\x09\\xb4\\xcb\\x3c\\x61\\x0e\\xf2\\x02\\x87\\xfb\\x66\\x23\\x2f\\xfc\\xa1\\xa9\\x29\\xba\\x03\\xb6\\x09\\x83\\xf6\\xd4\\x34\\xf5\\xf5\\xfc\\xc9\\xe9\\x7a\\x8f\\x4d\\x4f\\x95\\xfa\\xbd\\x13\\x54\\x95\\xff\\x80\\x29\\x1a\\xd2\\xef\\xf9\\x73\\x34\\x15\\x1f\\x9b\\xa4\\x2e\\xf6\\x7b\\x67\\xa9\\x6b\\xff\\xce\\x69\\x56\\xf0\\x04\\x8d\\xa7\\xf6\\x36\\xfc\\x80\\x36\\x2a\\x38\\x96\\x76\\x66\\x72\\x0e\\xc9\\x17\\xc1\\x71\\xac\\xb1\\x4c\\xd1\\x71\\xc0\\xd2\\x28\\x2d\\xcd\\x1b\\x3a\\x0d\\x36\\x97\\xd0\\xa2\\xf5\\xac\\xf8\\xa0\\x9f\\x15\\x9d\\xab\\x20\\x7a\\xad\\x6c\\x7d\\x7a\\x17\\x41\\xf4\\x5a\\x19\\xf1\\xec\\xb6\\xe3\\xdc\\x73\\x09\\x44\\xdf\\x2a\\xfb\\x9d\\xdd\\x57\\x40\\x34\\x7d\\xf5\\x0a\\xee\\xb8\\x01\\xa2\\xe9\\x2b\\x65\\x3f\\xa5\\x2f\\x80\\x68\\xfa\\xfd\\x54\\x3e\\x7d\\x9e\\xa7\\x74\\xe0\\x70\\x59\\x45\\x63\\x9a\\x12\\x0a\\xf6\\x29\\xcf\\x09\\x3f\\x96\\xf4\\x07\\x98\\x88\\xb0\\x28\\x6f\\x34\\x43\\x29\\x98\\x5a\\x95\\xcf\\xcd\\x0d\\xfb\\xf2\\x53\\x4a\\xbe\\x44\\xe3\\x43\\x68\\x7e\\xfe\\x85\\xb3\\x32\\xd7\\x7e\\xc2\\xd3\\x72\\x9d\\x1d\\xab\\x57\\xde\\xf8\\x10\\x2e\\x4d\\xb1\\xa5\\x2e\\x73\\x6f\\x7f\\x6b\\xef\\x67\\x77\\xc4\\x7e\\x5f\\xae\\x38\\xcd\\x3e\\xdb\\xaf\\x0f\\xe4\\x16\\xd7\\xb9\\x2c\\x13\\xbf\\x12\\x7a\\xbb\\x52\\xed\\xa5\\x34\\x23\\xc7\\x29\\x5e\\xe7\\xf6\\xe3\\xe7\\x3a\\x8b\\xe5\\x38\\xa6\\xe2\\x41\\xfd\\xe4\\x09\\xe1\\xfa\\x47\\xbe\\xc2\\x59\\x21\\x7f\\xde\\xd3\\x84\\xdd\\xab\\x5f\\xff\\x7c\\x27\\x5f\\x24\\xea\\x17\\x63\\x6b\\xd5\\x07\\x4d\\xd3\\xf3\\xa6\\x7a\\x21\\x38\\xfb\\x4c\\x4e\\x70\\xb1\\x62\\xca\\x6a\\xb8\\x49\\xeb\\x15\\xfa\\x95\\x26\\x62\\x15\\x8d\\x0f\\x2b\\x88\\xd1\\xdc\\xfb\\x95\\xdc\\x7c\\xa6\\xc2\\x83\\xde\\xba\\xf0\\xa0\\x77\\xc6\\xfe\\xe9\\x41\\xef\\xdc\\x5b\\xcc\\x5c\\x2e\\x03\\x03\\x83\\x96\\x02\\xb8\\x9f\\x2a\\xc0\\x86\\xcd\\xb9\\x72\\x4b\\xbe\\x40\\x6c\\x4e\\x16\\x15\\xa8\\xac\\xaf\\xb8\\x8d\\xdc\\x53\\xb7\\x9c\\x95\\x12\\x61\\x37\\xbf\\xdf\\xad\\xf1\\xad\\x82\\x5a\\x93\\x54\\x07\\x30\\x6e\\xa5\\x5e\\x68\\x66\\x7a\\x2b\\xed\\x98\\xa5\\x8c\\xab\\xb9\\xdc\\x68\\x00\\x6e\\xf4\\x5f\\x3b\\x47\\x93\\xac\\x63\\x5f\\xd5\\x9f\\xdd\\x5a\\x3f\\x32\\x21\\xd8\\xda\\xd6\\xd5\\x5f\\x9d\\x16\\x74\\x62\\xa7\\x1d\\x9d\\xd8\\x6d\\xed\\x3d\\x59\\x0a\\xdb\\x96\\xfc\\xdd\\x69\\x49\\x26\\x75\\xda\\x91\\x49\\xdd\\x56\\x54\\x1c\\x71\\xdb\\x8c\\xfa\\xe8\\xb4\\xa3\\xd2\\x3a\\x0d\\xa9\\xb4\\x6e\\x4b\\x57\\x2c\\xb7\\xed\\x5c\\xb1\\xbc\\xd3\\xca\\x15\\xcb\\x3b\\x6d\\x5c\\x49\\x0c\\x68\\x5b\\x90\\x3b\\x39\\xda\\xc8\\xff\\xeb\\x52\\xf2\\xe3\\x17\\xad\\x3a\\xd4\\xdf\\xeb\\xaa\\x24\\xfd\\x27\\xe9\\x6f\\x75\\x99\\xf3\\x13\\x5e\\xd3\\xf4\\x41\\xb9\\xe2\\x87\\x05\\xda\\xd0\\xe2\\x53\\x46\\x45\\x4a\\x8a\\xe2\\x83\\x12\\x40\\x44\\x0c\\x16\\x2b\\xc6\\xc5\\x0a\\x67\\x89\\x95\\x39\\x9e\\x7e\\xc9\\x71\\x26\\x09\\xa2\\x22\\xa2\\x55\\x27\\xca\\xae\\xc4\\x1f\\x4f\\x8f\\x1c\\x7e\\x70\\x7c\\x79\\x69\\x5b\\x6d\\x74\\x29\\x76\\x90\\xc3\\x18\\x05\\x5a\\x05\\x09\\xaf\\x49\\x4a\\xff\\xa9\\x83\\xa7\\xa9\\x70\\x7f\\x00\\xaa\\x8c\\x04\\x67\\xb7\\x84\\xb3\\xb2\\x50\\x39\\x4a\\x34\\xe6\\x81\\x3a\\xa0\\xd0\\xea\\x21\\x5f\\x91\\x0c\\x8b\\x56\\x3d\\xa3\\x06\\xb2\\x26\\x6b\\xa6\\x5a\\x94\\x08\\xea\\x3c\\x4b\\xb5\\x9e\\xa8\\xee\\xae\\xf1\\xea\\x50\\x0c\\xf9\\x45\\xa6\\xca\\x79\\x04\\x80\\x31\\xf2\\xe2\\xa2\\xf8\\x29\\x65\\x58\\x78\\x33\\xe6\\x52\\x86\\xb5\\xf0\\x61\\xb7\\xcf\\x00\\x39\\xa2\\xd0\\x56\\x57\\xaf\\x6c\\x4f\\xa5\\xe9\\xe6\\xec\\xa3\\x7a\\xa3\\x95\\xab\\xce\\x30\\xff\\x5c\\xe6\\x3f\\x31\\x7d\\x82\\x8a\\x01\\x57\\x6b\\x5e\\x23\\x22\\x50\\x5e\\x82\\x09\\x90\\x0f\\xc9\\xbe\\x2f\\xee\\x5a\\x2e\\x37\\xcf\\x16\\xe6\\x05\\xce\\x7d\\x3f\\x10\\x13\\x54\\x06\\x19\\x98\\x78\\x91\\x07\\xc5\\x04\\xe1\\x40\\xde\\x6f\\x13\\x6f\\xe6\\xd5\\x2f\\x72\\xa1\\x59\\xb4\\xca\\x77\\x9b\\x82\\xf3\\xd0\\x68\\xe4\\xd5\\xa0\\x1f\\xa7\\x26\\xc0\\x5f\\x3d\\x28\\xb6\\xdb\\x4d\\x0b\\x03\\x96\\x8d\\x8d\\x03\\x06\\xc5\\x9c\\x2d\\x14\\xe7\\xc0\\x5b\\x2a\\x48\\x20\\x84\\x98\\xef\\x07\\x0c\\xc5\\x00\\x52\\x90\\xcd\\xd9\\x02\\xd1\\x86\\x95\\x50\\x20\\x1e\\xee\\xd9\\xac\\x73\\xa6\\xb8\\xc2\\x05\\xa8\\x65\\xf0\\xca\\x11\\x32\\xc8\\xe6\\x65\\xad\\x30\\x32\\x52\\x6d\\x7a\\x5e\\xd5\\x8e\\x0b\\x9f\\x1a\\x27\\x46\\xce\\x6e\\x8d\\xbe\\x79\\xf5\\xd8\\x9d\\xdd\\xdf\\xa8\\xd1\\xf4\\x1b\\xa5\\xf3\\x33\\xb4\\x53\\xa3\\xe9\\x6b\\xd5\\xe2\\xc0\\x3e\\x8d\\xa6\\xdf\\xa9\\xac\\xfe\\x36\\x8d\\xa6\\xdf\\xab\\x9c\\x8e\\x6f\\x8d\\x6f\\x9e\\xe5\\x5b\\x43\\xeb\\x5b\\xc6\\x86\\xc2\\x28\\x34\\x6d\\x64\\x12\\xb5\\x73\\x36\\x9d\\xe6\\xea\\x01\\xea\\xd7\\xb3\\xf2\\xe7\\x6c\\x5d\\x59\\x84\\x3d\\xff\\x28\\xe6\\xe4\\x39\\x1a\\xdb\\x33\\x1c\\x70\\x37\\x7a\\x08\\xc9\\xfe\\x51\\x92\\x92\\x74\\x76\\x4d\\x77\\x40\\x9d\\xef\\x46\\x1b\\xbb\\x19\\x5f\\xfb\\xd3\\x2d\\x61\\x6b\\x75\\xd4\\x72\\x6d\\x51\\x2b\\xe0\\xa9\\xa0\\x56\\x38\\x7d\\x9b\\xa6\\x3b\\x42\\x0d\\x34\\x4d\\x41\\xd1\\xe9\\x6f\\xa6\\xf5\\x4a\\x68\\x60\\x65\\x08\\x4a\\xd4\\x68\\xd4\\x75\\xba\\x03\\xd9\\x09\\x5f\\x47\\xe2\\xdf\\x13\\x82\\x65\\x93\\x09\\x20\\x8d\\x2a\\xb5\\x92\\x7c\\xd5\\x9d\\x1d\\x42\\x51\\xff\\xac\\x2a\\xc8\\x49\\x41\\xfa\\xbc\\xf1\\xa7\\x2c\\x30\\x4c\\x48\\x1d\\xcc\\xa5\\x5b\\x5f\\xb5\\x1a\\x80\\xaa\\x02\\x90\\x85\\x38\\x49\\xe4\\x0e\\xa0\\xd9\\xed\\x15\\x0b\\x38\\x80\\x3d\\x3d\\xd0\\x01\\x4f\\x30\\xed\\x4d\\x13\\x7d\\xab\\x28\\xcf\\x9e\\xca\\xeb\\x37\\x8f\\xf9\\x25\\x19\\x62\\xbc\\x7b\\x97\\xa7\\xef\\x4f\\x8f\\xaf\\xb4\\x79\\x74\\xc6\\x12\\x75\\x6c\\xb6\\x5b\\xef\\xdd\\x87\\x8f\\x9f\\x3a\\xa9\\xf2\\xd9\\x4f\\x53\\xa2\\x13\\xe5\\x26\\x1c\\x74\\xef\\xf4\\xa5\\xc5\\x21\\xd2\\xf6\\xb7\\xf0\\x0a\\x12\\x30\\x3b\\xde\\xcf\\x0c\\x12\\x00\\xde\\x84\\x37\\xea\\xc3\\x04\\x50\\x29\\x02\\xdc\\x72\\xb8\\xaf\\x5c\\x3a\\x9d\\x86\\x66\\xe7\\xeb\\xb7\\x86\\xdc\\x96\\xa7\\xa1\\x71\\xbe\\xa5\\x92\\xfe\\xa7\\xcc\\x0c\\xfa\\x7e\\xfa\\x4f\\x10\\x81\\x57\\x48\\xc0\\x93\\xae\\x8d\\xa4\\xb5\\x11\\x66\\x2d\\xef\\xfc\\x60\\x73\\xe2\\xfb\\xc1\\x89\\xe2\\x4d\\x0f\\x16\\x86\\x27\\x7a\\x37\\x5c\\x19\\xaf\\xe9\\x5d\\x66\\x74\\x87\\x07\\xa9\\xbd\\x88\\xd6\\x5a\\x6b\\x6d\\xae\\xab\\xf6\\xd0\\x65\\x8a\\x2a\\x01\\xcc\\x51\\x50\\x04\\x3a\\x3a\\x72\\x06\\x40\\x54\\xe7\\xc9\\x77\\x9d\\xef\\x17\\xee\\xf4\\xd2\\xf6\\xf4\\x3e\\x20\\x12\\x2a\\x35\\x6c\\xf8\\xce\\xca\\xb4\\x6e\\x89\\x70\\x2e\\x8a\\x13\\xa2\\x63\\x75\\x30\\xde\\x96\\x4c\\x39\\xc8\\xc5\\x18\\xae\\xec\\x32\\x52\\x39\\xb1\\x05\\xe0\\x7b\\xd0\\x07\\x67\\x6e\\x8a\\x59\\x48\\x25\\xc0\\xe5\\x3c\\x6a\\xb0\\x26\\x24\\x25\\x82\\x8c\\x4e\\xcc\\x48\\x7b\\x50\\xee\\xb7\\xd1\\x86\\x36\\xfc\\xa0\\xff\\xbc\\xeb\\xc2\\x3e\\x31\\xea\\xbd\\x66\\x80\\x6a\\xab\\xda\\xc6\\x54\\xc4\\xe1\\x5a\\xe6\\x50\\xf0\\xd8\\x12\\x11\\xaa\\xec\\x4c\\x8c\\x11\\xfa\\xe0\\xfb\\xc1\\x07\\x24\\x20\\xd3\\x62\\xb7\\xba\\xd9\\xe5\\xd0\\x92\\xaa\\xd7\\xe0\\xc0\\x8a\\xae\\x76\\xad\\x68\\x1e\\x00\\x98\\x0e\\xaf\\x68\\xee\\xae\\xe8\\xda\\xe9\\xad\\xe9\\xee\\x92\\xa4\\x44\\xe5\\xeb\\xad\\xb4\\xdd\\xba\\xd2\\xa2\\x4f\\x79\\xfb\\x5b\\xbe\\xd9\\x81\\xef\\x9f\\xf8\\xbe\\x81\\xb1\\x9c\\x9c\\x1d\\xeb\\x07\\x64\\x01\\x7f\\xd5\\x74\\x7a\\xe7\\xe0\\x84\\xc1\\xc3\\x1f\\x78\\xf1\\x8a\\xc4\\x9f\\x6f\\xd8\\x97\\x06\\x03\\x6c\\xb7\\x1e\\xc7\\x09\\x65\\x4d\\x8a\\x33\\x8d\\x87\\xc1\\x73\\x90\\xd2\\xf8\\x73\\x03\\x34\\xed\\x17\\x7a\\x98\\xf9\\x7b\\xea\\x32\\x7f\\xd3\\xf2\\x96\\x66\\x3f\\x97\\x37\\x8d\\x4b\\xc9\\x01\\xa6\\xf0\\xc5\\x5e\\x2a\\xf8\\xc6\\x3a\\x83\\xc4\\xb1\\x30\\x08\\xa6\\xf1\\x24\\x59\\xbf\\xf1\\x2d\\x83\\xf7\\xde\\xba\\x9e\\x54\\x09\\x97\\xda\\xe5\\x1f\\x49\\x1a\\xa7\\x92\\xb4\\xa8\\xb9\\x79\\x66\\x23\\x35\\xee\\x25\\x2d\\x5b\\xf8\\x23\\xba\\xed\\x33\\x2a\\xf5\\xa6\\x7e\\x02\\x93\\xe8\\x4c\\x71\\x7f\\x74\\xe9\\x2e\\x67\\xc8\\xc9\\x7b\\x1e\\x3b\\x48\\x23\\xe4\\x66\\x2d\\x60\\xb3\\x43\\x61\\xb3\\xad\\x87\\x99\\x44\\x96\\x2d\\xd4\\xd9\\x8a\\x9a\\x39\\xb4\\xf3\\x78\\xc2\\x4b\\x34\\x9e\\xce\\x2e\\x5a\\x2c\\xdf\\x4b\\x74\\x2f\\xf7\\x93\\x3a\\xdd\\x2a\\x2a\\x7b\\xb0\\x93\\xdb\\x0d\\x06\\x5c\\x86\\xc9\\x32\\x7f\\xfe\\xde\\xc8\\xcc\\x3e\\xf7\\x9b\\xff\\x2c\\x9b\\xa7\\x72\\x22\\xbf\\xbb\\xf5\\x1f\\x4c\\xeb\\xef\\xd1\\x66\\xd0\\xe8\\x6c\\xf4\\x4e\\xe2\\xd5\\xc6\\x3e\\x0b\\x28\\x92\\xbe\\xf5\\xa4\\xf8\\x80\\x3c\\x6f\\x42\\xe0\\xbb\\xb0\\x70\\x0b\\xea\\xc0\\x58\\x6f\\x9f\\xc3\\x40\\x33\\x0a\\x2a\\x18\\x52\\xe5\\xde\\x5e\\x49\\x8c\\x8e\\x30\\x2a\\x23\\x8a\\xe2\\xe8\\x5a\\x7e\\x7e\\x3e\\xc2\\x68\\x19\\x05\\x18\\xad\\x21\\x45\\x2b\\x10\\xdd\\x69\\xed\\x18\\x8c\\x1e\\x00\\xac\\x15\\xc6\\xb1\\x8d\\xb7\\xa0\\x68\\x79\\xa3\\xbd\\x34\\x78\\x5f\\x17\\x90\\xd5\\xc2\\x9c\\x47\\xae\\x6d\\x25\\x43\\xac\\xa8\\xef\\x53\\xab\\x4f\\xec\\x92\\xff\\x6f\\x1f\\xe7\\xe6\\xd5\\x27\\x3b\\x7a\\xfd\\xed\\xef\\xe5\\xf1\\xb5\\xce\\x74\\x34\\xd5\\x6e\\x42\\x3b\\x47\\x3a\\x9a\\xbe\\x7a\\x0d\\x87\\x4e\\x74\\x34\\xfd\\xee\\x5b\\x38\\x7c\\xa0\\xa3\\xe9\\x77\\xdf\\xf7\\xb9\\x7c\\x8f\\xb9\\xf0\\xd1\\x4f\\xc3\\x43\\xa5\\x78\\x61\\xfc\\x51\\xe1\\x58\\x5c\\x30\\x26\\x34\\xdf\\xab\\xbf\\x97\\xf8\\x64\\xd2\\xd3\\xad\\x90\\x3d\\x3d\\xc7\\xed\\x8e\\xb9\\x73\\x42\\x9a\\x15\\x84\\x0b\\x2d\\xb9\\x08\\x04\\x24\\xda\\xff\\xe3\\x07\\x96\\x90\\x62\\x9e\\x2d\\xf4\\xf3\\x13\\xb8\\x0f\\x92\\x13\\xf5\\xa4\\x6a\\xde\\x22\\x6a\\xb4\\x67\\x65\\x2a\\xa8\\x72\\xb5\\xa4\\xc1\\xda\\x89\\x31\\x5c\\x10\\x21\\x81\\xa5\\x3c\\x50\\x67\\x4e\\xa4\\xc1\\x76\\xcc\\xd3\\x4d\\xfd\\x5a\\x4b\\x1f\\x2e\\xb4\\xbe\\x93\\x1c\\xc7\\xaf\\x54\\xac\\xf4\\x53\\x3c\\x62\\xe1\\x63\\x45\\xa0\\xb6\\x74\\x73\\x7a\\x8b\\x28\\x34\\xf4\\x9e\\x59\\xf1\\x68\\x97\\x35\\x4d\\xa9\\xf1\\x4f\\xac\\xff\\xa4\\xe8\\x70\\x96\\xbe\\xa9\\xdf\\x06\\xe9\\x64\\x22\\xdf\\xd1\\x19\\x52\\x3a\\x7a\\x99\\xba\\xbd\\x10\\x42\\x38\\x3c\\x3b\\xff\\xe5\\xf4\\xfa\\xf4\\x7f\\xbd\\xbb\\xbc\\x7a\\xf7\\xe1\\x2f\\xdb\\xad\\x93\\x73\\x71\\xaa\\xf2\\x3e\\x9c\\x9f\\x9c\\x02\\x23\\x82\\xcf\\x94\\x70\\x4a\\xad\\x2b\\x4c\\x50\\x16\\xe6\\x98\\x93\\x4c\\xc8\\x29\\xb8\\x70\\xcf\\x17\\x70\\x59\\x67\\xbe\\x3b\\x99\\x15\\x41\\x22\\xe1\\x53\\x2a\\x95\\xee\\x72\\xbe\\x5c\\x20\\xf9\\x9f\\x7a\\x7b\\xc9\\x1f\\xf3\\x7c\\x81\\x12\\x18\\xa3\\x58\\xa5\\x18\\xef\\x3f\\x89\\x5e\\xb4\\x15\\xea\\xc0\\x2c\\x4b\\x08\\xd7\\xa0\\x0a\\x84\\xd1\\x15\\xb0\\x10\\x58\\xa3\\xc3\\xd9\\xfa\\x8d\\xf5\\xb8\\x33\\x5b\\x4f\\x26\\x20\\x9e\\xaf\\x17\\xee\\x20\\xad\\x19\\x28\\x4d\\x93\\x40\\xe6\\x35\\xba\\x73\\x77\\xe8\\x70\\x76\\xd7\\x80\\xeb\\x6e\\x32\\x01\\x46\\xea\\x2d\\x41\\x76\\x67\\x41\\x66\\x24\\xe0\\x38\\x7c\\xf7\\xe1\\xf2\\xf4\\xe2\\xea\\xfa\\xec\\xed\\xc5\\x5f\\x3f\\x7d\\x8c\\x78\\xe0\\xc2\\x02\\xae\\xe6\\x59\\xb8\\x56\\x83\\x54\\xa0\\x52\\x95\\x99\\xfa\\x09\\x66\\x37\\x9c\\xe0\\xcf\\x33\\xd3\\x4a\\x0b\\xf8\\xdd\\x56\\xca\\x79\\x03\\xc3\\xc5\\xdc\\x01\\xfd\\xee\\xf6\\xae\\x4e\\xff\\xd7\\xd5\\xf5\\xf1\\xf9\\x87\\xab\\xd3\\x0f\\x57\\x11\\x6d\\x37\\x97\\x85\\xa2\\xd9\\x55\\x9d\\x7a\\xce\\x52\\x47\\x6d\\x8e\\x86\\x36\\x54\\xb4\\xa7\\x26\\x7a\\x3d\\x85\\xfb\\xcf\\x4c\\x34\\xd5\\x8e\\x93\\xbb\\xde\\x7d\\x7b\\x87\\x28\\x9a\\x7e\\xaf\\xf4\\xa7\\x9e\\xe3\\x1d\\xa7\\x11\\x22\\x04\\xc4\\x17\\x40\\x05\\x19\\x73\\x8e\\x76\\xdb\\x69\\xe6\\xe6\\xec\\xd3\\xe5\\xd5\\xf5\\xa7\\xcb\\xd3\\xeb\\xb7\\x57\\x57\\x17\\xef\\x7e\\xfc\\x74\\x75\\x1a\\x4d\\x61\\x9d\\xf8\\xf1\\xe2\\xfc\\xe3\\xe9\\xc5\\xd5\\x7f\\x44\\x2f\\xe1\\xcf\\x6f\\x2f\\xaf\\x2f\\xdf\\x9d\\x9c\\x5e\\x9f\\xfe\\xf4\\xd3\\xe9\\xf1\\xd5\\x65\\xf4\\x8d\\x4a\\xfa\\xf1\\xfc\\xfc\\xfd\\xe9\\xdb\\x0f\\xd7\\xbf\\xbc\\x7d\\xff\\xe9\\x34\\xfa\\x5e\\xa5\\x7d\\xf8\\x74\\x76\\x7a\\xf1\\xee\\xd8\\xa4\\x4d\\xbf\\x55\\x89\\x1f\\xcf\\x2f\\xdf\\x5d\\xbd\\x93\\xf0\\x6b\\xe5\\x7e\\xa3\\xab\\x9c\\xff\\x72\\x7a\\xf1\\xfe\\xfc\\xed\\xc9\\xe9\\x49\\xa7\\xc5\\x6f\\xbf\\x81\\x3a\\x38\\xd1\\xc9\\xf9\\x99\\x7d\\x6d\\x1c\\x2b\\xa3\\xfa\\x01\\x56\\x1d\\x09\\x4d\\x11\\x4a\\x74\\x94\\x93\\x0c\\x91\\xf0\\xe4\\xfc\\xec\\xad\\x10\\x9c\\xde\\x94\\x42\\x91\\xad\\x3a\\x87\\xea\\x9c\\x8f\\xce\\x43\\x40\\x67\\x94\\x3a\\xe3\\xac\\x14\\x8a\\xfe\\x3a\\x23\\x62\\xc5\\x12\\x95\\x35\\x23\\x21\\x2d\\x8e\\xcb\\x42\\xb0\\x75\\xdd\\xa0\\xef\\x17\\xe1\\x75\\x2f\\xf5\\x27\\x33\\x32\\xcb\\x26\\xe9\\xd7\\x6b\\xce\\x54\\xac\\xd9\\x77\\x1b\\x16\\x8c\\x8b\\x90\\x16\\x97\\x02\\x67\\x09\\xe6\\x89\\x1c\\xd0\\x80\\x99\\x14\\xec\\x96\\x99\\xc7\\x0b\\x34\\x3e\\x34\\x3c\\xcd\\x38\\x14\\xec\\x3d\\xbb\\xb7\\x82\\x22\\x75\\xa9\\xeb\\xbb\\xbc\\x28\\xe8\\x4d\\x4a\\x5a\\x15\\xd3\\x05\\x8a\\xe1\\x80\\xb5\\x55\\x8d\\xc6\\xe6\\xf1\\x62\\xb6\\xbb\\x7a\\x2e\\xab\\xab\\xec\\x16\\x74\\xe5\\x78\\xf2\\x4a\\x71\\xff\\x86\\x33\\x53\\xd3\\xa6\\x03\\x78\\x99\\x4c\\x07\\xcc\\xbe\\xe8\\x3c\\x5e\\x44\\x31\\x2c\\x07\\xb2\\x54\\x1b\\xed\\x35\\x92\\xad\\x94\\xb2\\xc6\\x8e\\xbc\\x5a\\x65\\x25\\x41\\x42\\x4f\\x6d\\x5d\\x16\\xe2\\x53\\x41\\xea\\x21\\xca\\x52\\x3c\\x48\\x20\\x0e\\xfb\\xa7\\x42\\x42\\xde\\x94\\xb7\\xe3\\x18\\x28\\x6e\\xcf\\x8b\\x2c\\xbd\\xc2\\xc5\\x25\\x4d\\xc8\\xe9\\x72\\x49\\x62\\x51\\x34\\x85\\xbb\\x07\\xc9\\x94\\xfd\\x51\\x9b\\x23\\x28\\xf6\\x65\\xbb\\x70\\xeb\\x40\\x98\\xd2\\x1f\\xca\\x35\\xe1\\x34\\x1e\\x28\\xdd\\x3a\\x5e\\xa6\\xb4\\x15\\xec\\xed\\xae\\x35\\x7c\\x3a\\x4d\\xf5\\xf3\\x3b\\xc2\\x53\\x86\\x13\\x92\\xec\\x1e\\xe4\\xae\\x03\\x0c\\xa0\\xda\\xd8\\x03\\xa0\\xde\\x6e\\xc7\\x43\\x20\\x95\\x15\\x86\\xd2\\x55\\xf1\\x1e\\x4c\\x55\\xf3\\xe3\\x21\\x00\\x4e\\x4c\\x72\\x67\\xce\\x36\\x79\\xe7\\x9c\\xde\\xa0\\xa9\\x32\\xcf\\xa2\\x68\\xa3\\x64\\x38\\xef\\x4e\\x9a\\x4d\\x70\\xfd\\xe1\\xed\\xd9\\x69\\xa4\\x34\\x0f\\x5f\\x28\\x43\\x73\\x9a\\x78\\xb0\\x7d\\x1e\\xa3\\x8d\\x72\\xc6\\x36\\x74\\x64\\x4c\\x56\\xeb\\x44\\xd8\\xe2\\xce\\x69\\x30\\x49\\xed\\x0d\\x2c\\x13\\xbb\\x30\\x74\\xd2\\x6c\\x7d\\x99\\xd4\\x86\\x91\\x49\\x71\\x27\\x69\\x92\\x5c\\xc0\\x98\\xa4\\xa1\\x7d\\x62\\xb2\\x86\\xe1\\x25\\x33\\xf7\\xa0\\xbf\\x68\\xbe\\x80\\xbd\\xdc\\x1d\\xfe\\x32\\x0e\\x67\\xe2\\xcd\\x7e\\x5c\\x6a\\xa8\\x0e\\x31\\x99\\x68\\x36\\xc8\\x21\\xdc\\x5b\\x7e\\x2e\\x16\\x40\\xc5\\xd7\\xb3\\x71\\x2c\\x6b\\x95\\x53\\x09\\x5e\\xe3\\xf8\\xd4\\xca\\x5b\\x6a\\x00\\x0e\\x48\\x5c\\x20\\x47\\x74\\x4e\\x6a\\x87\\xe8\\x7c\\xbb\\x0d\\xe4\\x37\\xe2\\x68\\x53\\x01\\xa8\\xcc\\x53\\x64\\x5a\\xd6\\x88\\xa4\\x3a\\x11\\x49\\x00\\xe4\\x73\\xb1\\x40\\x99\\x1c\\x91\\xfa\\x59\\x99\\x3b\\x8d\\xb2\\x2c\\xc2\\x5d\\xa1\\xdf\\x10\\x1f\\xf7\\xf5\\x63\\x7e\\xb6\\x76\\x68\\x11\\x98\\x88\\xa8\\xdb\\x2d\\xeb\\x9d\\x10\\xb2\\xf0\\xfd\\xb1\\xcd\\x69\\x1d\\x12\\x99\\xa3\\x2d\\x4d\\xe5\\x53\\x98\\xed\\x44\\x20\\xb2\\x9c\\x78\\x33\\x35\\x45\\x76\\x1c\\x28\\xd5\\xcd\\xb4\\x4b\\x84\\x38\\x37\\x6f\\xf3\\xc8\\xf8\\x47\\xc9\\x44\\xb3\\xbb\\xed\\xca\\x18\\x47\\xb7\\xea\\x9d\\xd1\\x95\\x21\\x76\\x65\\x78\\xef\\x4e\\x86\\x62\\x35\\xb2\\xb0\\x77\\x86\\x95\\x31\\x17\\x56\\x1a\\xfc\\x9d\\x26\\x76\\x6c\\x04\\xba\\x0c\\xd8\\x23\\xb7\\x33\\x01\\xbe\\xdf\\x2d\\x33\\x27\\x0b\\x6d\\xe6\\xa6\\xd5\\x4b\\x5b\\x76\\x4e\\x19\\x62\\xfd\\x0b\\xb2\\xd9\\x66\\x43\\x2b\\xf6\\x04\\x50\\x2b\\xbb\\xac\\xa3\\x2c\\xca\\xcc\\x14\\x1b\\x0b\\x08\\xd6\\xa7\\x42\\x02\\x02\\x8e\\xcc\\x16\\x39\\xf2\\xbc\\x88\\xd4\\x75\\xa2\\x9e\\x40\\x72\\x10\\x2e\\x86\\x93\\xf7\\x18\\x64\\xc4\\x10\\x64\\xc4\\xc2\\x70\\x30\\x34\\x18\\x3a\\xf7\\xb5\\x50\\xd2\\x45\\x0c\\xb0\\x0a\\x57\\xa5\\xa5\\x89\\x9a\\xcf\\x01\\x33\\xa0\\x7d\\xe2\\x68\\x86\\x71\\x77\\x7c\\x0a\\xd0\\x75\\x79\\xd6\\xbf\\x78\\xc4\\x02\\x90\\xb0\\x70\\xe0\\x1e\\x0c\\x2c\\x83\\x58\\x40\\xcf\\x9b\\x64\\x2d\\x6b\\x6e\\xd6\\x23\\x5b\\xc4\\x62\\xc6\\xba\\x57\\x92\\x58\\xf8\\xbe\\xe7\\x4d\\x94\\x41\\x10\\x92\\x6d\\x6c\\xb7\\x81\\x36\\x19\\x02\\x95\\x26\\x8b\\x86\\xd6\\xc1\\x0d\\x29\\x75\\x64\\x5f\\x60\\x6e\\x76\\xd4\\x19\\xb3\\xd0\\xe3\\x53\\xac\\xbd\\x21\\x30\\x3c\\x7f\\xfb\\xee\\x5d\\xa4\\x6c\\xcf\\x22\\x65\\x40\\x76\\xa2\\xe5\\xf2\\x8f\\x43\\xbe\\x3b\\xb5\\x41\\xe0\\x3b\\x70\\xe7\\x83\\x70\\x87\\x66\\xd7\\xec\\xc0\\xe2\\x41\\xc3\\xa4\\x86\\x1c\\xec\\x59\\x24\\xbe\\x90\\x8f\\x78\\xb5\\x44\\x7c\\x81\\xf0\\x63\\x4b\\x34\\xb4\\x32\\x55\\x35\\x10\\x32\\xc2\\xc5\\x6f\\xd1\\x37\\x8a\\x57\\xb5\\x1f\\xbb\\x45\\xd3\\xef\\xbf\\x1b\\x10\\x3d\\xbf\\x7e\\x86\\x9f\\x40\\x37\\xba\\xb4\\xa3\\x1f\\x06\\x1d\\x2f\\x2b\\xca\\xa2\\xcc\\x41\\xc3\\x3b\\x75\\x43\\x1c\\xef\\x34\\x8a\\x5b\\xf1\\x13\\x67\\x6b\\x8d\\x22\\x1b\\x7e\\x0f\\x59\\xe7\\xe2\\xe1\\xa7\\xda\\x9f\\x9a\\x65\\xf7\\xc8\\x6d\\xa2\\x4a\\xfe\\xca\\x71\\x5e\\x7b\\x39\\x6e\\x3d\\x3b\\xe3\\x0e\\x17\\xa8\\x61\\x57\\xb4\\xd0\\x77\\x19\\x38\\x9a\\x1f\\xcd\\x83\\x49\\x40\\xe5\\x4e\\x23\\x46\\x87\\xb3\\xb8\\xe1\\x45\\xc4\\x93\\x09\\x28\\x95\\x7d\\x2b\\x80\\x02\\xf1\\xfa\\x57\\x11\\x08\\x70\\x24\\x22\\xef\\x6b\\x0f\\x66\\xf6\\x12\\x56\\x2c\\x14\\xf9\\x43\\x92\\xb0\\xb2\\xa0\\x79\\x3e\\xcd\\x17\\x30\\x47\\x87\\xaa\\x23\\x75\\xab\\x67\\x8a\\x19\\xd4\\x3f\\x28\\xfa\\x4c\\x24\\x70\\xa9\\x5a\\x53\\xe5\\x13\\x59\\x7e\\x29\\xcb\\x2f\\xbb\\xe5\\x13\\x53\\x7e\\x85\\x96\\xf3\\x64\\x31\\x93\\xff\\xa1\\x55\\x63\\xeb\\xf7\\xb7\\xe0\\xcd\\xfc\\x6f\\xa3\\xdf\\x0e\\xfe\\xbc\\x98\\x80\\x03\\xf8\\xd5\\x9f\\xa6\\x23\\x45\\x5e\\x6a\\x00\\xbd\\x50\\x4b\\x87\\xbc\\xaf\\x26\\xc9\\xe4\\x2b\\x6f\\xf4\\x15\\xa8\\x1a\\x3e\\x0e\\x0e\\x96\\xda\\x6e\\xd4\\x93\\x6b\\x02\\xa0\\x66\\xce\\xac\\x2d\\x40\\x26\\x93\\x3b\\xdd\\xef\\x03\\x5a\\xcf\\xef\\x16\\xb3\\x07\\x39\\x2e\\xe7\\xdd\\xda\\xfe\\x0e\\xbc\\x5e\\xaf\\x8a\\x4d\\x9e\\xa0\\xc9\\x43\\xeb\\x84\\x0e\\x16\\x84\\x0f\\xbd\\x83\\x31\\x58\\xac\\x0c\\xc6\\xe9\\x00\\x78\\x60\\x2a\\x61\\xf2\\x00\\xf3\\x89\\xa2\\xbd\\xcd\\x2e\\x2e\\x83\\x1c\\x21\\x94\\xd6\\x82\\xff\\x32\\x48\\x1b\\x7d\\x80\\xda\\x7d\\x07\\x4c\\x2b\\xf8\\x28\\x4b\\xb1\\x8d\\x0c\\xdb\\xfb\\x0a\\x96\\x81\\x90\\xff\\x79\\x2b\\xb1\\x4e\\x3d\\xe5\\x95\\x48\\xe0\\x5b\\x85\\x21\\x5b\\x8f\\x69\\x60\\x2e\\x6d\\x1c\\x08\\x48\\xc1\\xfc\\x70\\x31\\x23\\x6d\\xa6\\x99\\xea\\x58\\x73\\xcd\\x32\\xc5\\xd0\\xef\\x39\\x57\\xdd\\xaf\\xdf\\x32\\x78\\xda\\xa2\\xe9\\x6b\\xc5\\x29\\x6a\\x1f\\xb6\\x68\\xaa\\xb9\\xe5\\xed\\xb3\\x16\\x4d\\x77\\x68\\x01\\xbc\\x7e\\x9a\\xb3\\xc5\\x96\\x98\\x8a\\xa1\\x39\\x0f\\x36\\x17\\xa4\\xc8\\x99\\x3c\\x9e\\x0e\\x5f\\xde\\xca\\x9d\\x78\\xb0\\xb9\\xa4\\xeb\\x3c\\x25\\xc3\\x79\\x57\\x38\\x1f\\xce\\x50\\x91\\x9c\\x54\\xc4\\xa6\\xe1\\x7c\\x2d\\x40\\xda\\xd1\\xa1\\x92\\x32\\x0d\\xe7\\x39\\x8a\\xf9\\xc3\\x05\\xde\\x66\\x38\\x7d\\x10\\x34\\x2e\\x86\\xb3\\xb5\\xf7\\x2a\\xed\\xbc\\x4a\\x89\\xc1\\xfa\\xc5\\x16\\x7d\\x5b\\xc7\\x96\\x18\\xe0\\xf5\\x63\\xca\\xbe\\x0e\\xa0\\x7b\\xb2\\x4d\\xb6\\x53\\x86\\x89\\x3b\\xf2\\x48\\xa5\\x82\\x6d\\x85\\x92\\xd4\\xe5\\xd0\\xb3\\xd2\\xe5\\xbc\\xdb\\xb5\\x2c\\x11\\xef\\x88\\x1c\\x63\\x44\\xe5\\xa9\\xfe\\x89\\xf2\\x42\\xa8\\x9a\\x27\\xe7\\x67\\x30\\x45\\x9b\\xb5\\x6a\\x59\\x2e\\x50\\xb4\\xe1\\x1d\\x29\\x64\\x54\\x04\\x1b\\x96\\x9d\\x35\\x25\\x0c\\xe8\\xda\\xb2\\xc5\\xb2\\xd6\\x11\\x3f\\x2f\\x05\\x74\\xbe\\xee\\x08\\x5f\\x54\\x50\\x75\\xa0\\x16\\x7f\\x6f\\x07\\xba\\xc4\\xef\\xe8\\xa0\\x82\\x39\\x9a\\x6b\\xe3\\xac\\x32\\x4d\\x17\\x30\\x69\\xc9\\xd4\\xd2\\x47\\x95\\xd2\\x8d\\x5c\\xba\\xdd\\xac\\xf2\\xd4\\xc9\\x49\\x8a\\x05\\x49\\xae\\x30\\xbf\\x25\\x62\\xbb\\xe5\\x8a\\xd3\\x6c\\x9e\\x78\\x6d\\xb3\\x28\\xd9\\xc6\\xb8\\xd5\\x46\\x29\\x7c\\xbf\\x93\\x74\\x47\\x78\\xcf\\x96\\xaa\\xd0\\x76\\xd6\\xda\\xe0\\x46\\xd2\\xf1\\xa0\\x40\\xa2\\x21\\x85\\x12\\x24\\x42\\x76\\x9f\\x11\\x7e\\x62\\xde\\x99\\xb3\\x02\\x25\\x47\\x89\\x8d\\x51\\xf6\\x0b\\x25\\xf7\\xdb\\x6d\\x62\\x90\\x92\\x76\\xa8\\x66\\xdc\\x67\\xab\\x3b\\x7f\\x09\\x57\\xb3\\xfe\\xf4\\x4a\\x71\\x14\\x2c\\x91\\x80\\x2b\\x14\\x0f\\x4d\\x52\\x30\\x3b\\xc5\\xed\\xb6\\x00\\x51\\xb0\\x44\\x05\\x5c\\x21\\x01\\xe0\\x12\\x21\\xb4\\xea\\xcd\\x60\\x8d\\x96\\x47\\x6a\\x67\\xbd\\x3b\\x09\\x96\\x20\\xf2\\x3c\\x78\\x87\\x56\\x75\\xca\\x4a\\xa5\\x3c\\x20\\xec\\xc8\\x17\\xd3\\xb0\\xd9\\x12\\x70\\x2d\\xa9\\xb5\\x07\\x2d\\x5c\\xf1\\x54\\x7a\\x2a\\xd3\\x3d\\xf8\\x10\\x0a\\x35\\x24\\xb4\\x54\\x57\\x8d\\x33\\x48\\xb4\\x32\\x81\\xa4\\x07\\x1a\\x55\\xdb\\x14\\xde\\x39\\x56\\x68\\xb7\\x6e\\xdb\\x44\\x66\\x7b\\xf0\\xd6\\xb6\\xbd\\x82\\xb7\\x9d\\xb6\\x97\\x90\\x39\\x92\\xce\\x06\\x71\\x39\\xb2\\xce\\x07\\x78\\x0b\\xd7\\xf0\\x0e\\xc0\\x7c\\x7e\\xa8\\xee\\xb0\\xf9\\x74\\x81\\x6e\\x61\\xde\\x42\\xff\\xc9\\xef\\x31\\x60\\x70\\x4e\\x74\\x34\\xd5\\xa1\\x17\\x87\\x30\\x40\\x34\\x7d\\xf5\\x43\\x4f\\x1e\\xf9\\xfa\\x19\\x5a\\xc3\\x9f\\xc9\\xc3\\x19\\xe5\\x5c\\x45\\x0a\\x62\\x88\\x07\\xb5\\xae\\x81\\x16\\x94\\x59\\xed\\x02\\x73\\x18\\xb1\\x2c\\x61\\xad\\x7a\\xb5\\xea\\x9b\\xd5\\x20\\x68\\x3e\\x25\\xf6\\x6c\\xbe\\xfa\\x36\\x49\\x70\\xc8\\x06\\x7b\\x20\\xc3\\x31\\x81\\xd1\\x39\\x4a\\xbd\\xee\\x8c\\x64\\xa5\\x93\\x96\\x3f\\x34\\x1f\\x65\\xd3\\xcc\\x09\\x2b\\x6f\\x52\\xd2\\x1e\\xca\\x09\\xc7\\xb7\\xad\\x0f\\x77\\x40\\xfa\\xdb\\x22\\xb6\\x3a\\xe5\\x0b\\x15\\xad\\x84\\x06\\x35\\xd9\\x14\\x79\\x96\\x5b\\x09\\xed\\xf9\\x9c\\x70\\x96\\xd7\\x1f\\x3a\\x6c\\xbe\\xfd\\x52\\x2a\\x16\\xf5\\x57\\x63\\x74\\x06\\x1d\\x23\\x6c\\xe7\\x5b\\x9b\\x8b\\x3a\\x09\\x9f\\x9a\\x86\\xdf\\x33\\xdc\\x4c\\xa5\\x31\\xc3\\x6e\\xa5\\x9c\\x31\\x67\\xe4\\xf6\\xf8\\x77\\x12\\xdc\\xb9\\xa8\\x14\\xa7\\x0f\\x6d\\xcd\\x6a\\xbf\\x2e\\x94\\x62\\xa4\\xfd\\xd2\\xe1\\x86\\x9a\\xcf\\xb6\\x3a\\x48\\x93\\x5e\\xde\\xac\\x1d\\x80\\x36\\xb6\\xbe\\x75\\x0a\\x2b\\xe3\\x95\\x8e\\x6f\\xda\\x4e\\x73\\x97\\x4a\\x25\\xb4\\x66\\xa3\\x52\\xda\\x70\\xff\\x75\\x45\\x4c\\x1b\\x95\\xbc\\x25\\x37\\xad\\x1b\\x30\\xc2\\xd0\\x1e\\x39\\xca\\x32\\xa5\\xc0\\x50\\x44\\xac\\xea\\xbf\\xe4\\x9a\\xd3\\x11\\x4d\\xbf\\x3f\\x94\\x47\\x6b\\x40\\x1b\\xd8\\x39\\x4d\\xdd\\x57\\x11\\x43\\x1b\\xed\\x1a\\x77\\x57\\x08\\x6a\\xd2\\x8f\\x8f\\x10\\xf4\\xd3\\x94\\xa7\\xe7\\xf1\\x14\\xc0\\x8d\\x26\\xb4\\x5d\\x85\\x01\\x32\\x18\\x49\\xc1\\x54\\xa8\\x2a\\x10\\x11\\x57\\x1f\\x4f\\xb5\\xde\\x56\\xcf\\xf3\\x26\\x72\\x40\\xc3\\x4d\\x77\\xb4\\xf0\\x74\\x51\\xd9\\xa8\\x7e\\xf0\\x57\\x16\\x41\\xfc\\x11\\xd3\\x3b\\x7c\\xee\\xf4\\x0e\\xd5\\x48\\x6c\\x1d\\xae\\xb4\\x75\\x25\\x4d\\x41\\xb8\\x61\\x0c\\xb8\\xed\\x0c\\x79\\xaa\\xe8\\x93\\xd5\\x72\\x85\\x1f\\x53\\x9a\\xed\\x52\\x71\\x9a\\x46\\x34\\x5a\\x5b\\x0f\\x5d\\x52\\x4e\\x65\\xda\\xd0\\xbf\\xd8\\x86\\x73\\xb6\\x97\\xca\\xbb\\x4c\\xb0\\x86\\x8a\\x33\\xe6\\x46\\x6f\\xeb\\xec\\x64\\xa7\\x1e\\x45\\xd5\\xe8\\x30\\xb8\\x8f\\xe6\\xc6\\x27\\x9f\\x40\\x4c\\x39\\xc2\\x2b\\x45\\x7d\\x5f\\xc1\\x0c\\xa9\\x80\\x07\\x7a\\x4c\\x67\\x2c\\x29\\x53\\xf2\\x13\\xd3\\xc4\\x7d\\x40\\xc0\\x2c\\xf3\\xfd\\xac\\x5b\\xc7\\xf7\\x03\\x81\\x7a\\xa9\\x00\\xf6\\x1a\\x27\\xc5\\xbb\\xec\\x9c\\x27\\x44\\xf3\\x3a\\x21\\x09\\x69\\xf1\\x91\\xf0\\x42\\x2d\\x98\\x08\\xc0\\x76\\xdb\\x56\\x2d\\xb5\\xe6\\xf4\\x4a\\xf5\\x29\\xd7\\x53\\x49\\xd0\\xa6\\x61\\x8c\\x9b\\x9f\\xda\\x37\\x09\\x0b\\xeb\\x8c\\xd0\\x49\\x37\\x7c\\xf4\\x77\\xc6\\x4d\\x98\\x8e\\x1f\\xd6\\x62\\x22\\xe4\\x88\\x98\\x18\\xe7\\xc3\\x45\\xea\\x8d\\x9a\\x5b\\xa6\\xbc\\xb3\\x6a\\x6a\\x3a\\x11\\x0f\\x87\\x33\\xfa\\xe5\\x8b\\x1f\\xb5\\x04\\x67\\xa0\\x86\\xc9\\xaa\\xa0\\x22\\x47\\xe5\\x4f\\x0b\\x37\\x2d\\xcd\\x2e\\x22\\x1e\\xee\\xca\\x82\\x5d\\x4a\\x59\\xaf\\x9c\\xac\\xb2\\x23\\x07\\xe6\\xa5\\x18\\x88\\xe3\\xa2\\xf7\\x72\\x11\\x8c\\xb3\\xed\\x76\\xc0\\x5e\\x3b\\x03\\x30\\x28\\x15\\x7f\\x44\\xfd\\x41\\x9b\\x0a\\x80\\x39\\x59\\xa0\\x4c\\x41\\x70\\xb0\\x3d\\xcb\\x1e\\x94\\xe5\\x9d\\x90\\xbd\\xd9\\x9c\\x2c\\x2c\\x6b\\xf2\\xf1\\x7a\\x99\\xef\\x1b\\xed\\x5f\\xb7\\xde\\xdb\\x34\\xb5\\x55\\x8b\\x61\\x99\\xd1\\x88\\x66\\xa3\\x12\\x98\\xaa\\xb2\\x25\\x55\\xfb\\x31\\xb5\\xb9\\xda\\xdf\\x17\\x2c\\x10\\x0f\\x73\\xbd\\x3a\\x43\\xfe\\xbc\\x4a\\xeb\\xeb\\xdf\\xf8\\xf3\\xa2\\xcb\\x20\\xb5\\xc2\\xf1\\x34\\x6c\\x75\\x53\\xb7\\x3e\\xcb\\x7d\\x3f\\xa0\\x08\\x07\\x14\\xe6\\xa0\\xe1\\x65\\xd0\\x0a\\xb6\\x54\\xd4\\x5b\\xf3\\x21\\xca\\x46\\x09\\x07\\x31\\x24\\x00\\x54\\xb0\\xa7\\xb8\\xde\\xb7\\xa0\\x88\\x67\\xe6\\xec\\xd3\\x80\\xc0\\x14\\xc0\\x22\\x18\\xc7\\xa0\\x82\\xd7\\xd7\\x79\\xc9\\x6f\\x5b\\xe5\\x25\\xa2\\x90\\x19\\xce\\xfa\\xfd\\x88\\xb3\\xcf\\x03\\xfb\\xbf\\xdc\\x49\\xb1\\x76\\xd0\\x5b\\xf4\\xfa\\x3b\\x38\\x84\\xdc\\xa2\\xd7\\xdf\\xc3\\x3e\\x6a\\x8b\\xa6\\xdf\\x28\\xc5\\x96\\x01\\xcc\\x16\\x4d\\x35\\xe7\\xa3\\xcf\\xaf\\x78\\x46\\x40\\x3c\\x1d\\xd0\\xb9\\x56\\x6f\\x22\\x7a\\x4f\\xd8\\xb8\\xd2\\x73\\xb2\\x80\\x99\\xe3\\x09\\x57\\x3b\\xb8\\xa2\\x41\\xf6\\xe7\\x17\\x53\\x00\\xc7\\xb1\\x5d\\xfe\\x79\\xb6\\x00\\x1b\\x1a\\x88\\xf6\\xaa\\x02\\xe8\\x16\\x40\\xa2\\xf6\\x97\\xd5\\x3c\\x29\\x6b\\xae\\x24\\x56\\x62\\x40\\x40\\x03\\x16\\xf0\\x39\\x5e\\x40\\x01\\xb1\\x5c\\xff\\x96\\x3d\\x84\\x11\\x98\\x04\\xe3\\x78\\xe7\\x51\\x1f\\x30\\x2b\\x83\\xbb\\x4b\\x2b\\xbf\\x6d\\xb5\\xe3\\xda\\x1d\\xca\\xc3\\x4a\\x3f\\xd4\\xf1\\xd1\\x65\\x06\\xba\\x0c\\xf8\\x2e\\x73\\xb1\\x42\\x79\\x3d\\x9b\\x61\\xeb\\xac\\xb4\\x2b\\x41\\x1d\\x93\\x1e\\xde\\xf1\\xfd\\x00\\x07\\xfd\\x64\\x55\\x5f\\xdd\\xd3\\x6d\\xf7\\x46\\x35\\x1c\\x76\\xe0\\xaf\\x39\\x59\\xc8\\x79\\xef\\xce\\x45\\x62\\x20\\xfb\\xc4\\x61\\x14\\xa8\\x32\\xce\\x42\\xcd\\xb3\\x45\\xe8\\x32\\x12\\x74\\x94\\xbe\\xfe\\xcd\\x6a\\xec\\x79\\xcc\\x05\\xbb\\x31\\xcb\\x1f\\xcd\\x17\\xbb\\x11\\xf7\\xa6\\xda\\x89\\xa0\\x07\\xb2\\xdc\\x41\\xca\\xfc\\x1d\\x97\\x4e\\xeb\\x4e\\x0f\\xc6\\x85\\x1c\\x99\\x76\\xbc\\xd6\\xb8\\x23\\x53\\xde\\x66\\xad\\x2f\\x32\\xc8\\x03\\x30\\xd0\\x9a\\xbd\\x92\\xfa\\xca\\x52\\xe3\\xe9\\x73\\xec\\x1a\\x99\\xb6\\x6b\\xec\\xe9\\xe2\\x64\\xc0\\xf7\\x4b\\xb9\\x0f\\x11\\x62\\xdb\\x6d\\x40\\x83\\xb1\\xfc\\x02\\x50\\xa5\\x31\\x28\\x54\\x7c\\x31\\xe1\\xfb\\xdc\\x44\\xa9\\x1b\\x22\\x3d\\x06\\x35\\xb9\\x92\\x16\\x94\\x35\\x67\\xa4\\x0b\\x4b\\xcb\\x7f\\xd8\\xbd\\x53\\xfa\\x75\\x8c\\xba\\x6b\\x7b\\xee\\x62\\xd7\\xe1\\xd1\\x66\\x95\\x3b\\x32\\x77\\xdb\\x80\\xee\\x1b\\xd0\\x8e\\xc6\\xe6\\xd9\\x62\\xa1\\x8f\\xaa\\xd5\\x33\\x68\\x79\\x17\\x82\\xd7\\xca\\x64\\xcc\\x5d\\xd9\\x56\\xf4\\x92\\xb6\\xcd\\x9b\\x41\\x83\\xbd\\xd5\\x22\\xa0\\xbe\\x6a\\x25\\x6e\\x9c\\xd5\\xf8\\xad\\xb6\\x78\\x33\\xe1\\x38\\x77\\xe3\\x9c\\x0e\\xe0\\x40\\xcf\\xe8\\x34\\x6b\\xfa\\x50\\x21\\x72\\x1e\\x81\\xc8\\xac\\x83\\x98\\x06\\xb0\\x52\\xdd\\x9e\\x44\\x4b\\x43\\x7c\\xf5\\xfe\\x0d\\xf2\\xbc\\xe0\\xa4\\x8e\\xaf\\xb5\\xbb\\xb0\\x79\\xf8\\x6a\\xfb\\x19\\x95\\x62\\x9f\\xa0\\xdd\\x24\\xfd\\x52\\x1d\\x8e\\xb7\\xda\\x6e\\x4e\\x3e\\x57\\xbb\\xb5\\x65\\x5a\\xc7\\x96\\x6d\\xb0\\xae\\x7c\\xca\\x77\\xeb\\xaa\\xc7\\x6e\\xcf\\xa2\\xcd\\x9a\\x08\\x5f\\xdb\\xe3\\x53\\x93\\x50\\xca\\x06\\xb2\\x4e\\x7e\\x77\\xa2\\xee\\x85\\xb6\\x2b\\xc7\\x0c\\x80\\xc6\\x93\\xe3\\xe1\\x8c\\xbd\\xc9\\xea\\x58\\x7e\\x63\\x45\\xce\\x37\\x2f\\xe6\\x4b\\xc1\\xf2\\x9c\\x24\\x01\\x98\\xb1\\xc9\\x04\\x88\\x80\\xc0\\x6c\\xce\\x16\\x90\\x2b\\x13\\x63\\x6d\\xfb\\xeb\\xfb\\x2a\\x19\\xf2\\x96\\x0d\\x5d\\xad\\x93\\x6e\\xe2\\xa8\\x18\\x4e\\xdb\\x3a\\x54\\xf4\\xbc\\x7c\\x9c\\x28\\xc7\\x82\\x99\\x0d\\xac\\x21\\xb4\\x02\\x40\\xfd\\x9a\\x6c\\x57\\xd3\\xc1\\x57\\x3b\\x76\\x76\\xca\\x74\\x54\\x3f\\x41\\xfa\\x60\\xd0\\x55\\xda\\x90\\x40\\x6d\\xcf\\x71\\xb1\\x8b\\x86\\x06\\x00\\x99\\x3d\\x0a\\x48\\xe1\\xf8\\xc4\\xe4\\xe8\\x70\\xc6\\xeb\\x00\\x52\\xfb\\x20\\xc9\\xb5\\xf6\\xb9\\x98\\xf3\\x85\\x82\\x27\\x5f\\x34\\x7c\\xe5\\x39\\x5f\\x54\\x56\\xb4\\x2e\\x0c\\x64\\x9b\\xdc\\x99\\x8b\\x29\\x5c\\x2b\\x40\\x3b\\x0f\\xe5\\x74\\xbd\\x86\\x61\\x6f\\xee\\x7b\\x20\\x25\\x5a\\x3e\\xc2\\x9e\\x07\\x97\\x55\\xd0\\x73\\xcf\\x5a\\x2f\\xeb\\x91\\x9e\\x82\\xf6\\x64\\xd6\\x1f\\xd9\\xe3\\xeb\\xe5\\x2e\\x7b\\xd2\\x9c\\x1c\\x49\\x9c\\xf4\\x5b\\xd1\\x0c\\xf0\\x1d\\x82\\x97\\x55\\x9f\\x0a\\x58\\xa3\\x8d\\x7e\\x77\\x6a\\x2a\\xdb\\x79\\x88\\xba\\x57\\x95\\xd9\\xb4\\x88\\x54\\x15\\xbc\\x43\\xcb\\x8e\\x8c\\xe5\\x01\\x6d\\x68\\x71\\x9a\\x25\\xb4\\x58\\x45\\x1c\\xd2\\x42\\x1e\\x76\\xf9\\x9b\\x69\\x8d\\x41\\x2e\\xe4\\x07\\x86\\xf5\\x2b\\x9a\\x93\\x58\\x58\\x5c\\x1b\\xe5\\xb0\\xf3\\xba\\x8e\\x8a\\x6e\\x4a\\xfd\\xde\\x8e\\xca\\x9d\\x59\\x72\\x73\\xbd\\x15\\x57\\xbc\\x24\\x51\\x0a\\x57\\xb8\\x68\\x0a\\x44\\x89\\xa3\\x83\\xb6\\x86\\x65\\x41\\x34\\x8a\\xd3\\xcf\\x93\\xf1\\xd4\\xc5\\xb2\\x0f\\xfb\\xd8\\xd7\\x7d\\xdc\\xfb\\x3c\\x65\\xf5\\x86\\x7f\\x26\\x3a\\x77\\xfe\\x9e\\x9b\\xd2\\xee\\x98\\x3b\\xe5\\x95\\x6e\\x80\\xc8\\xd6\\x38\\x4c\\x1c\\xad\\x43\\xcb\\xcd\\x5e\\x87\\x96\\x95\\xad\\xe3\\xa9\\xe8\\xe7\\x1a\\xf6\\xfd\\x20\\x1b\\xda\\x76\\xcb\\xc1\\x64\\x88\\x01\\xcc\\xda\\x7b\\xb1\\x55\\xf0\\xdd\\x49\\xa1\\x1e\\x71\\x6d\\x9c\\x4e\\x7c\\xbf\\x4b\\xcf\\xec\\x9a\\x9b\\xef\\x27\\x0e\\xa7\\xa3\\xc7\\xb7\\x08\\x40\\x28\\x38\\xbe\\x23\\xbc\\xa8\\xed\\xae\\x82\\xa6\\xe9\\x33\\xcc\\x3f\\x13\\x0e\\x19\\x24\\x5d\\x53\\x67\\xa3\\xa8\\xa5\\xf8\\x3b\\x9d\\x81\\xf4\\x68\\x2a\\xb3\\x1a\\x8f\\x16\\x84\\x0c\\x69\\xf0\\xcf\\xd8\\x33\\x81\\xc8\\x9e\\x06\\xc4\\x8e\\x67\\xd0\\x21\\x28\\xf6\\x9f\\x21\\xb4\\x0f\\x0f\\x8d\\x41\\xda\\xd6\\xd8\\x60\\xb3\\x0a\\x08\\xc4\\xa0\\x67\\x74\\x0d\\x39\\xd8\\x3c\\x75\\x09\\x1a\\x81\\x50\\x90\\x41\\x0e\\x29\\x24\\x2d\\xdb\\xf4\\xd4\\x76\\x53\\x68\\xa5\\x9b\\x7c\\x07\\xfe\\x49\\x76\\x18\\xb5\\x2e\\x77\\xf0\\x0a\\x57\\x7b\\x78\\x85\\x6b\\x94\\x87\\x3d\\xc6\\x36\\xbc\\x43\\x49\\xe8\\x70\\x00\\x24\\x6a\\xda\\x67\\xc0\\x17\\x95\\xb0\\xc9\\x6e\\x23\\x26\\x25\\x44\\xdd\\x2f\\x12\\x8b\\xe2\\x27\\xe3\\x8e\\x61\\x6b\\xbf\\xe7\\x71\\x10\\xaa\\x05\\xfc\\xf6\\x69\\x51\\x68\\xc7\\x81\\xd7\\x44\\x66\\xaa\\x99\\x5e\\x5a\\x42\\xba\\xdd\\x8e\\x8d\\x9f\\x43\\xab\\xc4\\xdb\\x4f\\x69\\xab\\xf5\\x6a\\x27\\xca\\x56\\x8d\\x24\\xe2\\x50\\xff\\xfe\\x95\\xc9\\x3d\\x57\\x44\\x4e\\x57\\xb5\\x2f\\x6e\\x9d\\x67\\x0a\\xb6\\xd8\\xd9\\x45\\xc4\\x7d\\x7f\\x1c\\x8c\\x77\\x44\\x4c\\xf6\\xfd\\x71\\x3f\\x96\\x33\\x30\\x0d\\xfd\\x42\\xc9\\xbd\\x84\\xb5\\x6a\\xc2\\x96\\x2b\\x62\\x4e\\x48\\x06\\x69\\xf1\\x2e\\xd3\\xbd\\x46\\x63\\x3e\\x60\\x4d\\xf8\\xed\\xf3\\xf4\\xcb\\xb4\\x97\\x0b\\xce\\x98\\xa8\\x63\\xd8\\x15\\xf2\\x26\\xbb\\x22\\x5f\\x8c\\x13\\x8f\\x5b\\x6d\\xbf\\x54\\xc7\\x9d\\x5b\\x1a\\x37\\x19\\xaa\\xc4\\x7f\\xc6\\xed\\xc9\\x6d\\xcb\\x30\\xea\\x6d\\x1c\\x93\\xa2\\x60\\xbc\\xef\\x03\\xc5\\x94\\x1b\\x08\\x38\\x57\\x47\\xde\\x6c\\x66\\x71\\xd4\\xfc\\xd4\\xd6\\xef\\x51\\x93\\x30\\xa7\\x01\\x58\\x68\\x55\\x71\\x2c\\x70\\x2b\\xfa\\xfa\\x32\\xe8\\x4f\\x0e\\xb8\\x41\\xf2\\x5a\\x39\\x6a\\xf7\\x29\\xd8\\xa2\\x0e\\xc8\\xa0\\xc4\\xb2\\x26\\xdc\\x20\\xeb\\xc2\\x0f\\x37\\x41\\x9e\\x24\\x29\\x49\\xd0\\xe1\\x8c\\xbc\\xe1\\x9a\\xb5\\x2a\\x1f\\xdb\\xf2\\xf9\\x46\\x26\\x13\\xeb\\x7b\\x8c\\xbf\\xd0\\x1e\\x81\\x04\\x9a\\xce\\xc4\\x1b\\x44\\x65\\x41\\xfe\\x42\\xe8\\xa2\\xf8\\x85\\x58\\x28\\xbd\\x79\\xad\\x66\\x80\\xc4\\x9f\\xa7\\x47\\xd3\\x17\\xc2\\xc8\\x70\\x66\\x3b\\x87\\x8e\\x98\\x89\\x68\\x23\\x71\\xd8\\xc0\\x8a\\xfe\\xc1\\xee\\x4b\\x76\\xac\\x71\\x34\\xfd\\x4e\\x9d\\xf2\\x27\\x69\\x31\\xc1\\x7d\\x1a\\xe6\\x3b\\xf4\\x1d\\x29\\x72\\xc5\\x0b\\x7d\\xdb\\x1f\\x58\\x0c\\x17\\xb0\\xd6\\x3e\\xb0\\x6c\\xe5\\xf7\\x6c\\x76\\x60\\xdc\\xcb\\x77\\x0d\\x80\\x54\\xc0\\x98\\x76\\x76\\xcb\\x0a\\x07\\xe6\\xbd\\xfc\\x61\\x73\\x1d\\x98\\xf4\\x0a\\xee\\x32\\xcb\\x51\\xda\\xd5\\x8e\\x16\\xdc\\x46\\x13\\xc8\\x35\\xaa\\x53\\x8a\\x5d\\xf2\\x97\\xba\\x46\\x66\\x1c\\x2d\\x7d\\x5f\\x69\\x36\\xfe\\x44\\xb0\\x24\\xa2\\xda\\x5f\\x81\\xb7\\x12\\x22\\x8f\\x0e\\x0e\\xee\\xef\\xef\\xc3\\xfb\\x57\\x21\\xe3\\xb7\\x07\\x57\\x17\\x07\\x97\\xbf\\xfc\\x65\\x3a\\x3d\\x58\\xea\\x32\\xff\\xf6\\x23\\x2e\\x68\\x7c\\xa9\\xc4\\x3f\\x25\\x27\\x1e\\xf4\\xa6\\xe1\\xd4\\xb3\\x06\\xac\\x9b\\xbe\\x99\\x88\\x76\\xc4\\xef\\x7a\\xdf\\x27\\x85\\x08\\x6f\\x68\\x96\\x04\\x07\\x7f\\x0b\\x12\\x2c\\xf0\\x56\\x12\\x9e\\xe0\\xc5\\x1c\\xbf\\xf8\\xe7\\xf5\\x42\\xfe\\xff\\x5b\\x72\\x1d\\xfe\\xf6\\x62\\xf1\\xf5\\x9f\\x0e\\x00\\x6c\\x2c\\x01\\x23\\x79\\xd9\\x91\\xdc\\x10\\xf3\\xfa\\xf7\\xf1\\x0a\\xf3\\x5a\\x7c\\x8d\\xd5\\x4e\\xfb\\x2b\\x79\\xb0\\x9f\\x8a\\x28\\xd6\\xbf\\xd3\\x94\\xdd\\xff\\x54\\xa6\\xe9\\xa5\\x42\\xa8\\x11\\xdd\\x96\\x3a\\xed\\x8a\\xe3\\xac\\x50\\xaa\\x36\\xf1\\x43\\x44\\x21\\x4e\\x6d\\x5b\\xc5\\x43\\x16\\xcb\\x0b\\xb4\\x14\\xec\\x98\\x49\\x28\\x5a\\x91\\xb9\\x4c\\xf9\\x98\\xe2\\x87\\xa8\\x84\\x31\\x49\\xd3\\x8f\\x38\\x49\\x68\\x66\\xd4\\x11\\x64\\xc2\\x65\\x8e\\xe3\\x26\\x61\\x85\\xf9\\x25\\x11\\x11\\x85\\xca\\xc3\\x06\\x49\\xa2\\x62\\x5b\\x42\\x15\\xc8\\xf8\\xdd\\x89\\x4c\\x95\\xbf\\xb4\\xac\\xe9\\x88\\x46\\x05\\x8c\\x59\\x5a\\x44\\x74\\x9b\\xcb\\x1f\\x97\\x39\\x36\\xa3\\x8f\\x8d\\x75\\xb4\\xfb\\x71\\x9a\\xe8\\x88\\xc3\\x4e\\xa2\\x51\\xa9\\xa0\\xea\\x8b\\xcb\\x96\\x54\\x67\\x8c\\xf1\\xc4\\xa8\\x1b\\xc4\\x9c\\x15\\xc5\\x39\\xa7\\x56\\x15\\x0e\\xd6\\x0e\\xd7\\xa1\\xb2\\x6a\\xa5\\x6b\\x12\\x51\\x98\\x90\\xa5\\x7a\\x8d\\x24\\xd4\\xe8\\x10\\x24\\xb4\\xc0\\x8a\\xf8\\x96\\x60\\x4b\\xd8\\x7d\\x96\\x32\\x9c\\x44\\x09\\x4c\\x38\\xbe\\xbd\\x6d\\x06\\x41\\xb2\\x58\\x3e\\x99\\xf4\\xc7\\x92\\xf1\\x75\\x44\\xd5\\x1f\\x1d\\xd8\\xd3\\x7c\\x9c\\x9a\\x42\\xfa\\xcb\\x58\\x45\\xe9\\x8f\\x0f\\xec\\x17\\x9c\\x52\\xa5\\x2a\\x52\\xaa\\x04\\xcd\\x1d\\x90\\xb9\\x1c\\xaf\\xc9\\x8f\\xda\\x71\\x22\\x85\\x2b\\x82\\x13\\x79\\xd7\\xaa\\x7e\\x56\\xda\\x71\\x1f\\x85\\x2b\\x9a\\x24\\x66\\x65\\x57\\xf4\\x76\\x65\\x72\\x39\\x59\\x36\\xbf\\xde\\x63\\xbb\\x2e\\x2b\\xb1\\x4e\\x7f\\xb2\\x1a\\x1c\\x72\\xd3\\x9f\\xfe\\xa3\\xa4\\x77\\xe6\\x99\\x18\\xdb\\x5d\\x43\\x93\\xa8\\x80\\x29\\xbe\\xb1\\x3a\\x0c\\x69\\x5d\\x3f\\xa5\\x85\\xec\\x33\\x65\\x2c\\x57\\x40\\x4e\\xd9\\xbd\\xce\\x58\\xe3\\x8c\\x2e\\x89\\xca\\x5c\\x63\\x2e\\x09\\x22\\x3d\\x3e\\x93\\x29\\x53\\xb4\\x63\\x43\\x93\\xf0\\xa5\\xfe\\xa1\\x23\\xbd\\xca\\x7a\\x24\\xa1\\xd8\\xfe\\xd5\\xbe\\x3f\\x75\\x19\\x0d\\x2b\\xfd\\xdb\\x2e\\xe0\\xba\\x4c\\x05\\xcd\\x53\\xa2\\x46\\xb1\\x2e\\x85\\xd9\\x61\\x99\\xdc\\x52\\x5a\\x7f\\xce\\x05\\x2a\\xcb\\x49\\xa6\\xfe\\x08\\xba\\x2e\\xd7\\xba\\x40\\x8e\\x85\\x20\\xdc\\x34\\xa7\\x94\\x5f\\x57\\x2c\\x4d\\xac\\xfa\\x48\\xce\\x8a\\x5a\\x95\\x26\\xe7\\x24\\xad\\xd5\\x53\\x94\\x73\\x18\\x67\\x74\\x9c\\xe0\\xe4\\x3c\\x4b\\x1f\\x54\\xf7\\xdc\\x42\\x8c\\x93\\x7f\\x94\\x94\\x93\\x24\\x2a\\x21\\x67\\xa9\\x5c\\x75\\xce\\xee\\xf5\\x0e\\xe7\\xec\\xbe\\xd9\\xe1\\x05\\xce\\x92\\x1b\\x66\\x80\\x51\\xc4\\xcc\\xee\\x22\\xf5\\x53\\xd6\\x2e\\x94\\x5e\\x4a\\x7d\\xae\\x0a\\x82\\xd7\\x29\\x29\\x0a\\xb5\\xdc\\x85\\x52\\x52\\x31\\x33\\x2f\\x56\\xb8\\xae\\x4c\\xff\\x49\\x54\\x57\\xf2\\x47\\x11\\x51\\x58\\xc8\\xfe\\x72\\x58\\xe4\\x24\\x4d\\x8f\\xe5\\x79\\x34\\xe5\\x78\\x5c\\xff\\x38\\x61\\x71\\x54\\xc8\\x1f\\xfa\\xd4\\xaa\\x3b\\x3e\\x4a\\x61\\x21\\x88\\x99\\xa7\\x72\\xda\\x67\\x94\\x53\\xf0\\x8d\\xf6\\xfa\\x60\\xbe\\xd4\\x66\\xd5\\xbf\\xa9\\xa8\\x0b\\xd5\\x27\\xa2\\x2c\\xc8\\x19\\x36\\xad\\x68\\x2a\\xa5\\xd8\\xc6\\xf0\\x5e\\xed\\x06\\x0a\\xef\\xd7\\x2c\\x91\\xf0\\x51\\x08\\x07\\xe7\\x54\\xe0\\x54\\x0e\\xbf\\x46\\x39\\xc7\\x8c\\x4b\\x02\\xde\\x6c\\x4c\\x41\\xd6\\x12\\x31\\x46\\x54\\xfd\\xbc\\x54\\x00\\x93\\xa0\\x90\\x5f\\xe6\\x78\\xc9\\x9f\\x0a\\xc7\\xc8\\x1f\\x17\\x64\\xa9\\x7d\\x2b\\x68\\xab\\x12\\x3d\\x9e\\x4c\\x03\\x4e\\x1d\\x60\\x5a\\xc1\\x9e\\x81\\xb5\\x45\\xb8\\x16\\xc9\\x7a\\xfa\\xf3\\x45\\xac\\xbf\\x3d\\x07\\x7b\\x79\\xea\\xa7\\x57\\x9f\\x2b\\x6f\\xc9\\xb8\\xe7\\x1c\\x2c\\x75\\xb1\\xbc\\x90\\x9b\\xe1\\xce\\x53\\x3d\\xb5\\x0c\\xb6\\xa3\\x4d\\x67\\xd6\\x9e\\xfc\\x8e\\xeb\\x6f\\xaf\\x8d\\x86\\x75\\xae\\xf9\\xf2\\x5a\\xd0\\x31\\x59\\xea\\x43\\xe7\\x68\\xdd\\x2c\\x95\\xae\\xe2\\x99\\x78\\x0d\\x02\\x57\\x89\\x79\\x8a\\x1f\\xbc\\x1a\\x75\\x79\\x2a\\x32\\x98\\x0a\\x78\\xfc\\x3f\\x6a\\x8c\\xe1\\xc9\\x5f\\xf2\\xec\\x7b\\xee\\xae\\xd7\\xee\\x91\\x6e\\xe5\\x6f\\xcf\\xdd\\x52\\x9e\\xfa\\xad\\xd0\\xbd\\x67\\x77\\x94\\x57\\xf0\\x38\\x61\\xb1\\x67\\x37\\x96\\xfc\\x96\\x10\\x6c\\x31\\xc1\\x57\\x3b\\x6d\\x4e\\x76\\xe9\\x9b\\x4b\\x6a\\xea\\x39\\x7e\\x89\\xc1\\x26\\xb6\\xd1\\x71\\x4d\\x54\\x18\\x73\\x2b\\xbd\\xa7\\xd9\\x67\\x1b\\x60\\xc8\\x66\\xa9\\x2d\\x2a\\x33\\xba\\x91\\x58\\x54\\x10\\xdb\\x6e\\x43\\xaa\\xb4\\xef\\xb7\\x13\\xad\\xda\\x58\\x97\\x91\\x32\\xd8\\x82\\x19\\xca\\x13\\xda\\xa0\\xf5\\x1b\\xa6\\x33\\xd2\\x50\\xa2\\x1b\\x52\\x08\\x13\\x1f\\x9b\\x18\\x8d\\x50\\x5d\\x00\\x74\\xf8\\x10\\x4e\\x03\\x0e\\x14\\x76\\x35\\x61\\x8a\\x68\\x3a\\xa7\\x74\\x74\\xb5\\xe5\\x5a\\x59\\x0f\\x2a\\x71\\x9f\\x03\\x99\\xa2\\xcd\\x4d\\x29\\x84\\x76\\x11\\x6c\\xbd\\x6c\\xc9\\xdf\\xd4\\x7a\\x13\\x36\\xf7\\xd6\\xf8\\x50\\x6f\\x2e\\xf5\\x83\\x58\\xc7\\xc8\\x5a\\xcd\\x6e\\x7c\\x58\\xc1\\x1c\\x6d\\xce\\xe8\\x17\\x9a\\x45\\x9b\\xdc\\xf6\\x18\\x6d\\xba\\x41\\xd0\\x5d\\x95\\xad\\x31\\x51\\x2a\\x20\\xe9\\x5c\\x7b\\xef\\x5a\\x6c\\xb7\\x24\\x74\\x3c\\x8c\\x85\\x16\\x61\\xcb\\xdf\\xf6\\x82\\x37\\xd1\\x38\\xc8\\xfd\\xc8\\x84\\x4b\\xfe\\x0f\\x56\\x8e\\x72\\xce\\xee\\x68\\x42\\x92\\x11\\x1e\\xfd\\x5d\\x75\\xf8\\x77\\x99\\x94\\x8f\\x04\\x1b\\xe1\\x91\\xbc\\xa6\\x47\\x4b\\x4a\\x52\\x1d\\x3b\\x99\\x95\\x62\\x84\\xb3\\xd1\\xdf\\x6d\\x47\\x7f\\x1f\\xad\\x14\\xb7\\x85\\x87\\xa3\\xab\\x15\\x2d\\x46\\xf7\\x34\\x4d\\x47\\x5c\\x59\\x0a\\x8d\\xf0\\x48\\x0e\\xe1\\x05\\xcb\\xd2\\x07\\xdd\\x42\\x38\\x7a\\xb7\\x54\\xb1\\xd9\\x75\\x7b\\xc5\\x8a\\x95\\x69\\x32\\xba\\x21\\xa3\\x75\\xa9\\x90\\xd4\\x48\\xee\\xeb\\xbf\\x27\\x8e\\xad\\xd8\\xdf\\xc3\\xd1\\xb9\\x58\\x11\\x7e\\x4f\\x0b\\x02\\x47\\x05\\x11\\x23\\x42\\xe5\\xb7\\x3b\\x00\\xc6\\x47\\x7f\\xb7\\x73\\xfd\\x7b\\xe8\\x81\\xaa\\x26\\xc5\\xf6\\xc2\\xed\\x0f\\x00\\x96\\xe9\\xe7\\xff\\x09\\x70\\x1d\\x9b\\xb1\\xfc\\x2e\\x80\\xd5\\xea\\x9f\\x65\\x28\\x61\\x56\\xa9\\xe7\\xf4\\x2f\\x9d\\xbd\\xe7\\xa8\\x0a\\x76\\x8e\\xe5\\x51\\x20\\xf1\\x06\\xec\\xa5\\x9b\\x73\\x19\\xb5\\x32\\x54\\xdb\\xc7\\xbd\\x15\\xea\\xb5\\xee\\x9c\\xd9\\xa3\\x00\\xbb\\xed\\xbb\\xa7\\xb9\\xd3\\x83\\xc9\\x52\\x7d\\x9c\\xdb\\x49\\x3d\\x63\\x0a\\xb4\\xd7\\x94\\xd3\\x7f\\xd1\\x64\\x5a\\x80\\xb5\\xf0\\x7b\\xae\\xf1\\x7b\\x07\\x6b\\x44\\xd3\\xe9\\xf7\\x83\\xfc\\xf7\\x6f\\x9f\\x11\\x21\\x9e\\x34\\xea\\x95\\x41\\xcb\\x32\\x50\\x75\\x66\\x8c\\x13\\x15\\xb7\\xe9\\x74\\x4d\\x85\\x70\\x5d\\x42\\xfd\\x01\\x2a\\x8c\\x82\\xe3\\xfc\\x47\\xcd\\x9e\\xef\\xea\\x01\\xa8\\xa8\\x43\\x9a\\xcd\\x42\\x0b\\x25\\x65\\x21\\x49\\x63\\x83\\xd5\\x0b\\x43\\x36\\x2b\\x1a\\x89\\x21\\x0b\\xbb\\xed\\x5a\\x1f\\x67\\x9a\\x81\\x91\\xb2\\x18\\xa7\\x6d\\xee\\x1b\\xc2\\xc1\\xce\\x3c\\xc8\\x81\\x89\\xe7\\x90\\x29\\xb3\\x8a\\x34\\xfd\\x94\\xad\\x07\\xe3\\xa5\\x0d\\xd5\\xf6\\x7d\\xba\\xbf\\xe9\\x01\\x37\\x42\\x3b\\x61\\x1f\\x7d\\x77\\xf8\\x07\\x69\\x58\\x7d\\xfb\\x98\\x4b\\xe3\\x27\\x18\\x2a\\x75\\x35\\x9d\\x71\\xcf\\xca\\x88\\xb6\\x8c\\x6f\\xf4\\x53\\xef\\x69\\xf6\\x37\\xb8\\x2d\\xe6\\xae\\x83\\x31\\x9a\\x5b\\x75\\x46\\x7d\\x7f\\x4c\\x43\\x96\\xc5\\x29\\x8d\\x3f\\xfb\\x7e\\x50\\xff\\x46\\x0c\\xb4\\x5d\\x33\\xd1\\x7d\\xfc\\xe7\\x41\\xf5\\xdf\\x6f\\x9f\\xe3\\x33\\xd7\\x18\\x57\\x1b\\xd2\\x03\\x88\\x15\\x67\\xf7\\x23\\x89\\xda\\xe5\\x9c\\x0d\\x7a\\x6f\\xb1\\xbf\\x46\\x7a\\x06\\xa3\\x18\\x67\\x19\\x13\\x12\\xeb\\xca\\xba\\x12\\x77\\x36\\x0c\\x63\\xe0\\xf8\\x2e\\xae\\x23\\x58\\x42\\xde\\x8f\\x47\\xd8\\xd6\\x94\\x80\\x0c\\x4d\\x67\\xec\\x0d\\xe6\\xb7\\x8a\\x87\\x53\\xeb\\x32\\x32\\xab\\xc7\\x88\\x51\\x9d\\x67\\xdc\\x77\\x67\\xca\\x4d\\x39\\xb6\\xf0\\x35\\x9d\\xe1\\x66\\x00\\xc5\\x88\\x66\\x23\\x0a\\xb8\\xd6\\x32\\xa2\\xb0\\x50\\x86\\xea\\xf3\\x62\\xa1\\x82\\xd3\\x02\\x27\\xe6\\x7a\\x9b\\xeb\\x27\\xe1\\xf8\\x34\\x9f\\x78\\x3d\\xc4\\xc0\\x50\\x5f\\x1d\\x48\\x1e\\x21\\xad\\x02\\x64\\x23\\x02\\x7f\\x64\\xac\\x36\\x0d\\x35\\x5a\\x0f\\x9d\\xcc\\x9c\\xe5\\x4d\\xf8\\x2e\\xe3\\x6c\\x31\\x83\\x04\\x38\\x61\\xbb\\xc8\\xfd\\x48\\x28\\x27\\x10\\x18\\x0d\\x29\\xa7\\xda\\x5e\\xb3\\xdd\\xbd\\x72\\x94\\xed\\xe9\\x35\\xd3\\xbd\\x72\\x25\\x18\\x82\\xdc\\xed\\x57\\x77\\x54\\x41\\xda\\x8b\\x8a\\x6c\\x84\\xa1\\xa6\\x6f\\xbe\\xbb\\x6f\\x86\\xf8\\x9e\\xbe\\xcd\\x92\\x31\\x68\\x94\\xf0\\x98\\xdb\\xbb\\x95\\xbc\\x56\\xb0\\x1b\\xd5\\x1d\\xf2\\xda\\xb5\\x64\\x3d\\x06\\xbc\\x7b\\x0c\\x14\\xe1\\x3d\\x63\\xc0\\x76\\xdb\\x34\\x4d\\x43\\xea\\x8e\\x03\\x3b\\x9d\\x56\\xb0\\xdc\\xb5\\xf2\\x3c\\x68\\x85\\x82\\x56\\xaa\\x1d\\x8d\\x73\\x6d\\x25\\x17\\xac\\xbf\\x02\\x00\\x07\\x77\\xc9\\x1b\\x11\\xe6\\x8c\\xa5\\x97\\xf4\\x9f\\xc4\\xf7\\xbb\\x5b\\x45\\x3b\\x33\\xaf\\x60\\x8c\\x58\\x4b\\x9f\\xde\\x51\\xa9\\x69\\xd6\\xd4\\xad\\x8a\\xe6\\x0b\\x98\\x35\\x96\\x67\\x48\\x6c\\xb7\\x31\\xcc\\xea\\x9e\\xb6\\xdb\\xa0\\xf9\\x40\\xd3\\x43\\x00\\x33\\xab\\xf8\\x8e\\x4a\\x98\\x29\\xea\\xdc\\x65\\x9f\\x47\\x29\\x64\\x19\\x79\\x6b\\x4e\\xa9\\x6a\\x93\\x47\\x0c\\x8a\\x7b\\xd6\\x49\\xc3\\x50\\xac\\x38\\xe9\\x96\\xa4\\x70\\x49\\xef\\xba\\x89\\xc5\\x00\\x2d\\xd1\\xbf\\x10\\x1e\\x53\\x98\\x1a\\xb6\\x79\\xf8\\x54\\x87\\x1f\\x6f\\xa8\\x06\\x65\\x02\\xcd\\x49\\xd6\\xf1\\x1e\\x59\\x07\\xba\\xed\\xd8\\xac\\x5a\\xf1\\x4f\\xd1\\x2a\\xab\\xb8\\x92\\x8d\\xf7\\x00\\x9d\\xaa\\x55\\x7f\\xce\\xef\\x33\\x45\\x87\\xc4\\x4e\\x56\\xe3\\x6d\\x37\\x35\\x4e\\x62\\xdc\\x64\\xc3\\xc8\\x52\\x16\\x6e\\x4d\\xe6\\xc9\\xf9\\x99\\x07\\x00\\xcc\\x51\\x2b\\x49\\x0b\\x20\\x9a\\xa1\\x26\\x6e\\xb6\\x26\\x89\\xdf\\x59\\x0e\\x7b\\x23\\xa3\\x55\\xd9\\x6d\\x39\\xb1\\xa3\\x59\\xd2\\xb2\\xcd\\x5d\\xbb\\x6f\\x40\\xc2\\x97\\x4d\\xe0\\xb9\\xde\\xb3\\xf0\\xc1\\x49\\xbf\\x20\\x31\\xcb\\x62\\x9a\\xaa\\xa9\\xdf\\x3a\\x19\\x97\\x84\\xdf\\x11\\xae\\x9d\\x28\\x68\\xaf\\x38\\xa7\\xc3\\x82\\x34\\xe3\\x23\\x79\\x49\\xb3\\xc4\\xd0\\x4d\\x8d\\x7b\\x64\\xf9\\x38\\x50\\xeb\\xe6\\x81\\x99\\x95\\x7e\\x07\\x9a\\xa0\\xba\\x41\\x71\\x5b\\xf0\\x09\\xbf\\xd4\\x29\\x3f\\x61\\x79\\xe2\\x1e\\xe0\\xbd\\x4c\\x49\\x59\\x56\\x17\\xb9\\x46\\xeb\\x70\\x4d\\x70\\xa1\\x64\\x03\\x6a\\x98\\x1e\\xf4\\xf4\\x7b\\xc4\\x83\\xab\\x50\\xff\\x02\\xf0\\x0c\\x6d\\xec\\x6e\\x89\\x36\\x6b\\x9c\\x47\\x2c\\x5c\\xe3\\x1c\\x1a\\x4a\\x26\\x62\\x36\\xfc\\x0e\\x8c\\x8d\\x11\\x88\\xfa\\x0b\\xe5\\x68\\xa3\\x8b\\x0a\\xd6\\xeb\\x14\\x61\\x78\\x72\\x7e\\x16\\xa5\\xb0\\x86\\x5e\\x74\\x07\\x69\\x46\\x05\\x55\\x6c\\x20\\x57\\xb3\\xa5\\x45\\xb4\\x87\\x6d\\xb5\\x17\\x44\\xac\\x3b\\x20\\xb5\\x29\\x23\\x1a\\x3a\\x5f\\xb0\\x05\\x84\\xe8\\x06\\xba\\x13\\x8e\\xee\\x61\\x0b\\x22\\xd1\\x17\\xeb\\x57\\x48\\x3d\\xbd\\x87\\x5e\\x0a\\x92\\xa8\\x34\\xd6\\x30\\x6f\\xb3\\x44\\xaf\\x5f\\x33\\xa1\\x55\\xb8\\x27\\x77\\x5f\\xcd\\x1f\\x1f\\xde\\x9d\\xec\\xaf\\x2d\\x4b\\x40\\x67\\x17\\x44\\xc7\\x50\\xaf\\x47\\x74\\x6d\\x7e\\x5c\\x99\\x30\\xc7\\xd1\\x6d\\xd8\\x4e\\x70\\xf2\\xb1\\xa0\\xb1\\xf1\\xae\\xe0\\x96\\x6a\\x92\\x61\\xa9\\xc9\\xe4\\xba\\xdf\\xb7\\x4a\\xb3\\x2f\\x5a\\x85\\xc3\\x19\\x90\\x16\\xea\\x9c\\x5a\\x88\\xc6\\x61\\x3b\\x01\\xca\\x77\\xaf\\x41\\x0c\\x51\\x11\\x3a\\x5f\\xf0\\xfa\\xba\\xc8\\xe5\\xc3\\x33\\x3a\\xad\\x66\\x43\\x72\\xf7\\xeb\\xeb\\x8b\\xd3\\xb7\\xc7\\x57\\xd7\\x27\\xa7\\xbf\\x5c\\x9d\\x9f\\xbf\\xbf\\xbc\\xfe\\xcb\\xfb\\xf3\\x1f\\xdf\\xbe\\xbf\\xfe\\xf9\\xfc\\xfc\\xaf\\xd7\\xd7\\x83\\xa1\\x0b\\xf7\\x57\\x31\\x27\\xc4\\xf7\\x9f\\x54\\x2c\\xd8\\xb8\\x98\\x2b\\x2a\\x61\\x07\\x51\\x44\\x4b\\xa8\\x75\\xcb\\x56\\xb0\\x39\\xe5\\xd1\\x03\\x6c\\xa1\\xa2\\x28\\xaf\\xc0\\xec\\xcc\\x06\\x4f\\x44\\xde\\x61\\x38\\x7d\\x15\\xbe\\xf2\\x1c\\x61\\xeb\\x59\\xcf\\x64\\xa3\\x65\\x97\\xb1\\xcf\\xf7\\xc4\\xa0\\x80\\xb6\\x8d\\xcc\\xa3\\xef\\x5e\\xc2\\x36\\xca\\x8e\\x74\\x18\\x95\\x0e\\x72\\x8f\\xbe\\xfb\\x06\\x76\\xd1\\x78\\xa4\\x3d\\x26\\xf7\\x91\\x78\\xf4\\x5d\\x63\\xe9\\x2c\\xd1\\x71\\xf4\\xfd\\x21\\xdc\\x89\\x8b\\xa3\\x1f\\x1a\\xb7\\xaa\\x3d\\x4c\\x1c\\xfd\\xd0\\x74\\x5b\\x7b\\x6a\\xfe\\xe1\\xbb\\x6e\\x5a\\x73\\x13\\x44\\x3f\\x34\\x63\\xea\\x22\\xee\\x68\\x7a\\xf8\\xed\\x0e\\x0b\\xec\\x06\\x6d\\x47\\xd3\\xe9\\x6b\\xb8\\xfb\\x59\\xde\\x45\\xda\\xd1\\xf4\\x65\\x33\\xfc\\x2e\\xce\\x8e\\xa6\\x2f\\xd5\\xf0\\x5d\\xdc\\x1c\\x4d\\xb5\\x9d\\x4d\\x83\\x9a\\xa3\\xe9\\xf7\\xea\\x7d\\xf2\\x98\\x7e\\x9d\\x73\\x55\\xb7\\x91\\x3d\\x53\\x7e\\xcb\\xed\\xb1\\x1f\\x70\\x39\\x6d\\xbc\\x96\\x0f\\x85\\xf4\\xee\\x8c\\xac\\x5a\\xc0\\xef\\x9e\\xe3\\x93\\xae\\xee\\xe3\\x91\\x37\\x8c\\xb1\\x66\\x80\\x6b\\xa0\\x9c\\x32\\xad\\x17\\x68\\x39\\x99\\xc0\\x7c\\x2e\\x7f\\x2a\\x83\\x34\\xfb\\xbb\\xe5\\xc6\\xa8\\xfb\\x42\\xc5\\x3b\\x34\\xaa\\xe8\\x3e\\xa3\\x4d\\x97\\x00\\x71\\x9f\\xdd\\x0a\\x85\\x37\\xa4\\x88\\x55\\xb7\\x39\\x23\\x72\\x9a\\x0e\\xf7\\xb6\\x7b\\xdf\\xa6\\x3b\\xa3\\x05\\xe4\\x68\\x53\\xc1\\x04\\x8d\\xa7\\x70\\x89\\x0e\\xe1\\x0a\\xd5\\xf6\\xf4\\xde\\x4d\\x5a\\x72\\xcf\\xb1\\xa8\\xb7\\xfe\\xf0\\x1b\\xab\\x7a\\x4f\\x3d\\x73\\xbd\\x01\\xc3\\x7a\\xcf\\x09\\x3a\\x49\\xb2\\xa4\\x5b\\x44\\x1b\\x47\\xbb\\x85\\x94\\x8c\\xaa\\x5b\\xcc\\x98\\xdc\\xbb\\xe5\\xb4\\xb7\\x6d\\xaf\\x6b\\x81\\xef\\x19\\xd9\\xf1\\x9a\\x64\\xa5\\x57\\x9b\\xe2\\x7b\\x31\\xcb\\x1f\\x3c\\x6b\\x8c\\xef\\xc5\\xa5\\xee\\xc1\\xb5\\xc6\\xf7\\x92\\x9b\\xb4\\x99\\x85\\xb2\\xc9\\xf7\\x12\\x8e\\x6f\\x3d\\xd7\\x2a\\x5f\\xa5\\xd8\\x69\\x34\\xa6\\xf9\\x26\\x59\\x39\\x6e\\x70\\x2d\\xf4\\x75\\xfa\\x17\\x2a\\xbc\\xb6\\x9d\\xbe\\x4a\\x37\\x4e\\x24\\x5c\\x73\\x7d\\x95\\xce\\xee\\x9c\\x66\\x0c\\x7c\\x64\\x7a\\x03\\x18\\x65\\xbb\\xef\\x25\\x9c\\xe5\\x5e\\x63\\xaf\\xef\\x19\\x79\\x50\\x6d\\xb2\\x6f\\xc2\\x0a\\xb8\\x56\\xfb\\xde\\x67\\xf2\\x90\\xb0\\xfb\\xcc\\x6b\\x99\\xee\\xcb\\xd4\\x5c\\xfe\\xf2\\x1a\\x03\\x7e\\x99\\x56\\xea\\xe6\\x1b\\xb3\\x7d\\xed\\xa0\\xa2\\x6e\\xa0\\xb1\\xde\\xd7\\x19\\x6b\\x66\\xe6\\x53\\x1b\\xf1\\xeb\\x74\\x66\\x46\\xd1\\x98\\xf2\\x9b\\x74\\x3b\\x51\\x6b\\xd1\\xaf\\x93\\x4d\\xb7\\xda\\xac\\xdf\\xcb\\xe5\\x1f\\xcf\\xb1\\xe5\\xf7\\xb4\\xec\\xd4\\x1b\\xb2\\xe7\\xf7\\x0a\\x9b\\xe0\\xec\\xd0\\xc6\\x9a\\xdf\\x13\\xf6\\xa7\\xd7\\x35\\xea\\xf7\\x84\\xfc\\x88\\xd5\\x87\\xd7\\xb2\\xee\\xd7\\x39\\x76\\xcd\\x1b\\x1b\\x7f\\x9d\\x5e\\xcf\\xd9\\x31\\xf5\\xd7\\x39\\xcd\\x72\\x69\\x93\\x7f\\xef\\x5e\\xfe\\xf1\\x2a\\xb8\\x46\\xde\\xb5\\x72\\xd3\\x5a\\x73\\xdc\\xde\\x9d\\x78\\x13\\x4d\\xca\\x04\\x67\\x58\\xac\\x42\\x8e\\xb3\\x84\\xad\\x03\\x00\\x8c\\x9e\\xd3\\x4b\\x49\\x8c\\xc7\\xc1\\xa6\\x82\\x05\\xdc\\x34\\x98\\xa0\\x36\\x61\\x75\\xd4\\xc1\\x1d\\x13\\xe5\\x81\\x82\\x2d\\xfb\\xce\\xb0\\x20\\x42\\xdf\\x2d\\x57\\x86\\x3f\\x16\\xdc\\x85\\xab\\x56\\x02\\x80\\x77\\x61\\xbf\\x19\\xa5\\x59\\x5e\\x10\\x71\\x9a\\x69\\x35\\x8a\\xd6\\xf3\\x78\\xa0\\xbc\\xef\\x0f\\xa5\\x86\\x4d\\x0b\\xea\\x91\\x4b\\x8b\\x5e\\x7b\\xb5\\x0c\\x23\\x18\\x0f\\xb5\\xb0\\xdd\\x0e\\x26\\x87\\x75\\x4b\\x01\\x00\\x15\\xd4\\x7e\\x0e\\xae\\xd8\\x2e\\xdf\\xfb\\x48\\x28\\xcd\\xeb\\x4c\\xa2\\x5a\\xfa\\x98\\xf1\\x9e\\xd2\\xa9\\xea\\x3a\\x2d\\x3a\\x84\\x79\\x63\\xa2\\x1b\\xbf\\xc9\\x95\\xd7\\x37\\xe3\\x1b\\xa7\\x98\\xc7\\x8b\\x19\\xee\\x7b\\x17\\xf3\\x7d\\x3c\\x4f\\x16\\xdb\\x6d\\x90\\x58\\xc7\\x37\\x6a\\x97\\x1c\\xa5\\x81\\xd9\\x27\\xe0\\x68\\x70\\x6e\\x3d\\x26\\x72\\x53\\x17\\x9a\\x9a\\x30\\x03\\x51\\x1a\\xe8\\xb3\\xf4\\xfb\\xdb\\x72\\xaa\\xcb\\x06\\x9f\\xdf\\xc0\\xc9\\xf9\\x99\\x3a\\xd7\\x97\\xe6\\xb8\\x66\\x20\\xaa\\xe7\\xaa\\xd3\\xe4\\x64\\xed\\x61\\x1e\\x1f\\xee\\x19\\xa4\\x89\\x1b\\xe3\\x76\\xa2\\x5b\\x80\\x75\\xfd\\xe7\\x0d\\xb1\\x5b\\x7b\\xb0\\xea\\xaf\\xef\\x3e\\x9c\\x9c\\xff\\x7a\\xfd\\xf3\\xdb\\x0f\\x27\\xef\\x4f\\x9d\\xc1\\x2b\\x74\\xbb\\xdd\\xd6\\xdf\\xf2\\x8e\\x3c\\x0a\\xd2\\xc0\\x22\\x60\\x39\\x95\\xe0\\x39\\x73\\xd1\\x21\\x6d\\x6c\\xf5\\x6c\\xf8\\xd0\\xed\\xaa\\xac\\x02\\xe6\\x98\\x1b\\x3a\\x03\\x6a\\xe5\\x55\\x43\\x92\\x38\\xf0\\xfd\\xdd\\xe3\\xe8\\x03\\xc5\\x1d\\x06\\xcd\\xf6\\x0f\\xa4\\x5f\\x5b\\x8f\\x43\\x55\\x56\\xf8\\x3e\\x03\\x00\\xe2\\x79\\x9d\\xb5\\x40\\xe3\\x43\\xfb\\xad\\x3a\\x92\\x09\\x20\\x5a\\x0d\\x9d\\x8c\\xa7\\xf5\\x9a\\xc0\\xd5\\x3c\\x59\\xc8\\x51\\xca\\x93\\xa4\\x0c\\x3a\\x2b\\xb8\\x57\\x76\\xe3\\xf8\\xff\\x78\\x5a\\x17\\x96\\x1b\\xd9\\x03\\xfd\\xb3\\x9b\\x6d\\x2f\\x9c\\x6d\\x97\\x64\\x45\\xc9\\xcd\\x01\\x51\\xf2\\xc7\\x33\\x96\\x51\\xc1\\xd4\\x23\\xb7\\xad\\xd9\\x3b\\x4e\\xac\\x91\\x7d\\x19\\x72\\xb2\\xe4\\xa4\\x58\\x39\\xd5\\x8a\\xd9\\x60\\xc7\\x6b\\xdd\\x9a\\x53\\x30\\x20\\x40\\x52\\x78\\x87\\xd5\\x1e\\x87\\x0f\\xf8\\xf9\\x0e\\x1f\\xf0\\x93\\x1c\\x3e\\xe0\\xd0\\xf9\\x6a\\xb9\\x6e\\xc0\\x2d\\x33\\x80\\x8e\\x7f\\x06\\x1c\\xb6\\x13\\x86\\xfc\\x30\\xd8\\x32\\x6e\\x62\\xcb\\x01\\xea\\xdd\\xef\\x8d\\xee\\x33\\xe8\\x64\\x60\\xf7\\xc3\\xb4\\x4f\\xa1\\x47\\xd3\\x43\\xf5\\xc2\\xea\\x12\\xe8\\xd1\\xf4\\x9b\\x6f\\x76\\x06\\xf9\\x91\\xef\\x98\\xc7\\x74\\xe0\\x9d\\xf7\\x54\\x9f\\x15\\x67\\x9e\\x20\\xcb\\x14\\x0b\\x41\\xb2\\x3e\\xef\\x53\\x33\\x8b\\x05\\xb5\\x21\\x7f\\x06\\xd8\\xa0\\x5a\\x00\\xaf\\x09\\xef\\x5e\\x99\\x02\\x6d\\x9c\\x26\\x6a\\x6e\\xd9\\xb0\\xd0\\x80\\x05\\x4e\\x60\\x09\\xba\\xdb\\xd0\\x9f\\x3a\\x86\\xfe\\x54\\x5e\\xb5\\x38\\x28\\x94\\x99\\x0c\\x98\\xc9\\x04\\x54\\x56\\xb5\\x0d\\xb2\\x89\\xb5\\xb3\\xa3\\x63\\x68\\x62\\x46\\x95\\x88\\x99\\x48\\x33\\xe3\\xd2\\xf7\\xc7\\xa4\\xe7\\x18\\x2e\\x56\\xc3\\x8a\\xb5\\x59\\x32\\x5d\\x06\\x03\\x31\\x1d\\xac\\xaf\\x0d\\xe2\\xfb\\x64\\x1e\\x2f\\x60\\x8e\\x52\\xdf\\x4f\\xc3\\x6b\\x63\\xf1\\x69\\xd9\\x40\\x89\\x0a\\xf2\\xa0\\xdd\\x38\\xe4\\x30\\x01\\x80\\x87\\x9c\\xc4\\x84\\xde\\x91\\x1a\\x6c\\x41\\x0a\\x13\\x35\\x36\\x58\\xea\\x88\\x13\\xca\\x85\\x5e\\xea\\xfb\\xbc\\xc7\\x7b\\x0a\\x52\\x18\\x6b\\x3e\\xe7\\x12\\xe1\\x20\\x31\\x40\\x50\\xd5\\x96\\x55\\x55\\x8f\\x99\\x80\\xf1\\x40\\x34\\x8e\\xed\\xb6\\xf4\\xfd\\x81\\x99\\x6c\\xb7\\x03\\x1d\\x29\\x87\\xb4\\xb3\\xda\\xd9\\x46\\xcd\\x1e\\xeb\\x03\\xb6\\xe3\\xe1\\x84\\xd4\\x22\\x08\\xe5\\x63\\xa5\\xdf\\x72\\xd6\\x11\\x79\\x16\\x8e\\x18\\x79\\x80\\x03\\xd1\\xdd\\xaa\\xd1\\xf4\\xb5\\x51\\x24\\xd8\\xb5\\x53\\xa3\\xa9\\x66\\xea\\xec\\xd9\\xa8\\xd1\\xf4\\x87\\xa9\\x3c\\x4b\\x8f\\xe9\\xe8\\x77\\x65\\xa7\\x4a\\x36\\x6e\\xb8\\xbc\\x56\\x10\\x6b\\x6d\\x4b\\x4c\\xb2\\x79\\x73\\x22\\xd1\\x33\\xf3\\x83\\xbc\\xf6\\x4d\\x30\\x63\\xdd\\x56\\x8c\\xf8\\xab\\xd3\\x0a\\x14\\x2d\\x7b\\x41\\xec\\x1a\\xc7\\x19\\x19\\xae\\x65\\xd0\\xce\\xb4\\x10\\x8c\\x3b\\x7e\\x05\\x95\\x16\\xc1\\x32\\x20\\x90\\x41\\x0c\\x60\\xe3\\xc3\\x08\\x0f\\xd9\\xdb\\xa9\\x39\\xac\\x71\\x7e\\x41\\x8a\\x32\\xad\\x0d\\x66\\xd6\\x38\\xaf\\xe7\\x29\\xea\\x24\\x3b\\xc7\\xac\\x67\\x2a\\xed\\xcc\\x51\\x99\\x84\\xd4\\x0d\\x42\\x8a\\xc6\\x3d\\x72\\x57\\x07\\x72\\xa3\\xf6\\x74\\x33\\xb7\\x3b\\x0b\\x90\\xa6\\x3b\\x05\\x8c\\x19\\x9e\\x67\\x0b\\x54\\x54\\xc3\\xc1\\x4a\\x07\\x81\\xc2\\xd1\\xa6\\x82\\x4c\\xbb\\x10\\x35\\x90\\xe1\\x5a\\xc3\\xc2\\x14\\x93\\x20\\x52\\x66\\x7e\\xb4\\x06\\x11\\x03\\x30\\x31\\xec\\xf4\\x80\\x0f\\x9b\\xdd\\xed\\x32\\x62\\x76\\xe2\\x19\\xc8\\x86\\x63\\x7d\\x48\\x5d\\x93\\xba\\xb6\\x21\\x91\\x2b\\xb2\\xf9\\x89\\xe3\\x5b\\x23\\x19\\x32\\xa2\\x1a\\x6b\\xbc\\xf7\\x36\\x4d\\x1d\\x6c\\xbd\\xea\\xc5\\x16\\xc8\\xc3\\x9e\\xd4\\x4d\\x9b\\xd7\\x0d\\x08\\xde\\x66\\x79\\xc7\\x08\\x06\\xae\\x64\\x03\\xad\\x34\\x0a\\xd7\\x1a\\xd1\\xdc\\xa1\\x8d\\x15\\x70\\x60\\xb8\\xc6\\x79\\x54\\x1a\\xf1\\x46\\x5a\\xf5\\xef\\xd1\\x01\\x2b\\x99\\xf6\\xbc\\xa2\\xe9\\xa1\\x62\\xc3\\x0e\\x4d\\x2b\\x9a\\xfe\\x30\\x14\\xcf\\xfa\\xbb\\xe7\\xa8\\x7e\\x36\\x12\\xd0\\xfb\\xbe\\x23\\xec\\xa3\\xfb\\xb9\\x58\\x68\\x13\\xee\\xb3\\x21\\x7f\\xf2\\xb7\\x41\\x86\\x10\\xba\\x09\\xcf\\x7f\\x39\\xbd\\xb8\\x78\\x77\\x72\\x7a\\xfd\\xe3\\xdb\\xcb\\x53\\x00\\x07\\x7d\\xcf\\xdb\\xb2\\x27\\xa7\\x3f\\xbd\\xfb\\x70\\x7a\\x7d\\xf6\\xf6\\xc3\\x7f\\x6c\\xb7\\xbd\\xa4\\xeb\\xb3\\xd3\\x8b\\xbf\\x9c\\x9e\\x74\\x4d\\x7e\\xb5\\x51\\x16\\xd8\\xdc\\x06\\x0d\\x2f\\xbf\\x66\\xff\\x0b\\x00\\x6f\\x83\\x71\\xd2\\x91\\x27\\xd4\\xc6\\xe8\\x99\\x56\\x19\\xd5\\xec\\xc8\\x59\\xcf\\x9d\\xc5\\x05\\xf0\\xfd\\xeb\\x70\\x2d\\x49\\x0c\\x75\\x24\\xcd\\x4f\\xf0\\xb4\\xf8\\xeb\\xbe\\xcf\\xc6\\x08\\x5d\\xd4\\x12\\x75\\xa3\\x77\\xc1\\x83\\x4c\\x1e\\x8f\\xeb\\x01\\x0f\\x3c\\xd7\\x73\\xb6\\x50\\xa6\\xa9\\x6e\\xec\\x81\\x1e\\xec\\x19\\x80\\x31\\xea\\xb9\\x26\\x67\\x00\\xa6\\x08\\xfb\\x3e\\x0e\\xaf\\x35\\xe3\\xe3\\x84\\x65\\xe2\\x47\\x9a\\x25\\x30\\x47\\x03\\x42\\x0e\\x0c\\x97\\x28\\xf7\\xfd\\x31\\xf5\\xfd\\x71\\xec\\xfb\\x63\\xe5\\xba\\x76\\x09\\x32\\x5b\\xfb\\x6d\\x29\\x98\\xac\\x7d\\x86\\x73\\x25\\xc8\\xee\\x27\\x2b\\x8e\\xec\\x50\\xc6\\x9c\\x2d\\x10\\x56\\x3e\\x21\\x10\\xae\\x63\\x02\\xc4\\xd6\\x11\\xfa\\xbd\\x04\\xc3\\x6d\\x40\\x7d\\x3f\\x58\\xed\\x58\\xe1\\xed\\xb6\\x97\\x03\\xe4\\x31\\x1d\\x2e\\x7d\\xa4\\x7a\\x2a\\x02\\xe5\\x84\\x02\\x83\\xa8\\x57\\x4e\\x69\\xad\\xb0\\x05\\x2a\\x6d\\x11\\x50\\x35\\x11\\xea\\x71\\xe5\\x3a\\x6a\\xc2\\xce\\x86\\xea\\xf8\\x3a\\xb1\\xba\\x19\\xf3\\x6c\\x31\\x1b\\x5a\\xef\\xc6\\x59\\x8e\\xaa\\x70\\x3d\\xbb\\x0d\\xc6\\x0c\\x98\\x8b\\x44\\x3b\\xd9\\x91\\x49\\x18\\x40\\x22\\x91\\x2e\\x77\\xbb\\x35\\x0e\\x3c\\x6e\\x03\\xe2\\xfb\\xc2\\xf7\\x3d\\xa6\\x48\\xdf\\x66\\xb1\\xc8\\x40\\x9a\\x00\\x4f\\xf2\\xc6\\x12\\xdc\\x06\\xda\\xd2\\x0f\\x21\\xe5\\xc5\\xc7\\x74\\xaf\\xe3\\x9e\\xd7\\xf2\\xc8\\xf6\\xcd\\xd3\\xa0\\xdc\\xb6\\xf3\\x31\\x79\\x5a\\x70\\x9e\\xa7\\x0f\\x3a\\x70\\x69\\xad\\x50\\x04\\x20\\x47\\x62\\x38\\x67\\x56\\xdf\\x23\\x59\\xed\\xdb\\xa6\\x49\\x6b\\xdc\\x20\\xcf\\x34\\xe8\\x36\\x95\\x1d\\x13\\x0d\\x98\\x7c\\x75\\xca\\x3f\\x1c\\x40\\xd6\\xbd\\xa2\\x86\\x86\\xb8\\x6b\\x70\\x3b\\x86\\x56\\x75\\x2e\\xa2\\x46\\x95\\x48\\xd9\\x99\\x35\\x4e\\x33\\xb2\\x8e\\x59\\x77\\x9b\\x42\\x1b\\x38\\x00\\xda\\x99\\x52\\x3f\\x7d\\x57\\x34\\x01\\xe5\\x3c\\xa3\\x7f\\x8c\\xc4\\x62\\x26\\xc9\\x3e\\x24\\x47\\xb7\\x0c\\x6f\\x4b\\xcc\\x95\\x77\\xf9\\x96\\x27\\xc5\\x84\\x16\\x79\\x8a\\x95\\x45\\xc4\\xc4\\x0b\\xbd\\x89\\x00\\xa0\\x72\\x6f\\xc7\\xde\\x9b\\x22\\x71\\x75\\x24\\x3a\\x5a\\x15\\x03\\x3a\\x15\\x6d\\x2d\\x07\\xa5\\xd4\\x66\\xf5\\x3e\\x56\\x03\\xea\\x0f\\x67\\x2a\\xec\\x83\\xab\\xe6\\xf0\\x9e\\x2e\\xc9\\xf1\\x43\\x9c\\x12\\xa5\\xeb\\x10\\xf4\\x95\\x1d\\xde\\xb3\\x58\\x3d\\x68\\x8b\\xd6\\x00\\xba\\xb9\\xca\\xe4\\xa3\\x55\\x42\\x93\\xa2\\xca\\x49\\x9e\\x1c\\xe6\\xc3\\xb0\\x20\\xe6\\xb6\\xaf\\x63\\x76\\xda\\x77\\x7d\\x7c\\xdc\\xf6\\x99\\x7e\\xd1\\x23\\x08\\x8e\\x83\\x8d\\x46\\xfd\\xc6\\xa7\\x2c\\x80\\x37\\xe8\\x34\\xd8\\x18\\x24\\x73\\xfe\\xe1\\xf8\\x54\\xb3\\x87\\x1d\\xac\\xa3\\x13\\x5a\\xb7\\x5f\\xaf\\x8c\\xc1\\x60\\xd6\\x51\\xed\\x17\\x34\\x5f\\xc0\\x7b\\x64\\xbb\\x6a\\x21\\x31\\x58\\x28\\xf9\\x7a\\x37\\xb5\\xd1\\xeb\\x6f\\xa7\\x1b\\xf9\\xcc\\x60\\x96\\x24\\x11\\x8e\\x77\\xe7\\x37\\xa1\\x55\\xe4\\x22\\x74\\x72\\xcd\\x88\\xb5\\x57\\x4d\\xa5\\x63\\x71\\x29\\xb0\\x20\\x3b\\x0b\\x1d\\x3b\\x9d\\x0d\\x17\\x32\\xfa\\x07\\x75\\x9e\\x04\\x66\\x5b\\xe7\\x56\\x0b\\xc8\\xbb\\xf3\\x33\\x05\\x4e\\x68\\xb2\\x37\\x5f\\x36\\x70\\xa1\\xdf\\x88\\x03\\xd3\\x81\\xfa\\x59\\x53\\x1f\\x10\\x23\\x01\\xdb\\x33\\x98\\x6e\\x89\\xde\\x68\\xf6\\x17\\x70\\x75\\x88\\xdb\\x45\\xcc\\x5b\\xbb\\x96\\xf9\\x77\\x28\\xa7\\x0a\\x5e\\xa3\\x8d\\x73\\xda\\x3b\\x8c\\x76\\xe2\\x62\\x02\\x24\\x2a\\x68\\xf6\\x50\\xbb\\x54\\xfb\\x5e\\x43\\x87\\xb3\\xac\\x76\\x4e\\x34\\xcb\\x26\\x13\\xa0\\xe8\\x29\\x79\\x33\\x54\\x03\\xbb\\xa4\\xdb\\x61\\xaf\\x04\\x7a\\x08\\x36\\x15\\x1c\\xc8\\x50\\xca\\x8e\\xf1\\xde\\xb6\\x86\\x9a\\xe9\\xb6\\xd0\\xdd\\x98\\xdd\\x46\\x3a\\xf9\\x47\\xbd\\x14\\x54\\x04\\xbd\\x34\\xa8\\xe2\\x2b\\x75\\x0b\\x8a\\xca\\x39\\x59\\xdd\\x7e\\xea\\x1c\\x3b\\xd2\\x3a\\x41\\x0d\\xd3\\x1e\\xd4\\x76\\x35\\x4d\\x59\\x54\\x15\\x3c\\x43\\x1b\\x13\\x2f\\x44\\x9f\\x9c\\x8e\\xc2\\x61\\x68\\x7c\\x85\\x5e\\x38\\x65\\x6c\\x9c\\x70\\x28\\x7c\\xbf\\x2e\\x70\\x6c\\x6c\\xf1\\x75\\xa6\\x52\\x27\\xb5\\xca\\xf2\\x7d\\xa7\\xa1\\x2b\\x39\\x43\\x2d\\xe1\\xaf\\x2f\\x7d\\x1d\\x96\\x60\\x6d\\xbd\\x6a\\xa5\\x0f\\xaa\\x36\\xcd\\x6e\\x2d\\x32\\x57\\xe2\\xa7\\x21\\x50\\xd7\\x63\\xb8\\x34\\xf9\\x4f\\x1c\\xa0\\x99\\xf7\\xde\\x26\\x2f\\x9c\\x32\\x4f\\x6b\\xb6\\x82\\x1f\\x91\\x33\\xe1\\x6a\\xf6\\x10\\x7c\\x74\\xbc\\x42\\x38\\x56\\xe4\\xf0\\x4c\\xd3\\x63\\xe7\\x36\\x10\\xb7\\x56\\xf5\\xea\\x2b\\x9e\\xb6\\xc7\\xa6\\x75\\xf8\\x7b\\xf7\\xb3\\xef\\x9b\\x48\\xef\\xb0\\xb1\\x0a\\xb3\\x2f\\xfd\\xd8\\xf2\\x2d\\xf4\\xa7\\xdc\\x12\\xa4\\x09\\x42\\xda\\x18\\x31\\xb8\\x38\\xf4\\x68\\x28\\x31\\x30\\x5e\\xb2\\x6e\\x83\\x1e\\x01\\x98\\xf9\\xfe\\xb8\\xe7\\xc3\\xad\\xd5\\x9f\\x7c\\x53\\xd6\\x93\\x47\\x19\\xb9\\x1f\\x7d\\x84\\xae\\xfa\\x85\\x43\\x48\\x20\\x01\\xbf\\x58\\x76\\x49\\xc0\\x34\\x05\\xa4\\x4d\\x51\\x01\\x80\\x2c\\x10\\x6a\\x15\\xba\\xc7\\xc4\\xf7\\x03\\x61\\x23\\x50\\x98\\x73\\xd3\\x2d\\x12\\x00\\xf9\\x00\\x73\\x3b\\x35\\xfa\\x7f\\x6d\\xe2\\xf5\\x1e\\x38\\x45\\x54\\x58\\xf2\\xa0\\x9d\\x80\\x0c\\x87\\xd2\\x6a\\x74\\xab\\x19\\x09\\x28\\xaa\\xbe\\x44\\xb6\\xaf\\x76\\xf7\\xa5\\x56\\xf2\\x6d\\xf1\\xca\\xce\\xf7\\x78\\xa8\\xd8\\xa7\\xd9\\xb4\\x4b\\x8b\\x69\\x50\\xf7\\xa8\\xa1\\x98\\xa2\\xe9\\xe1\\x61\\x4f\\xed\\xe8\\x4c\\xc5\\xee\\x39\\x6c\\x2a\\x34\\xf4\\x52\\x34\\x3d\\xfc\\xbe\\xa7\\x64\\xd4\\xa6\\x87\\xa2\\xe9\\xf4\\xdb\\x9d\\x45\\x54\\xf6\\x77\\x70\\x88\\x5e\\x8a\\xa6\\x2f\\xbf\\x1d\\x8e\\x41\\xdd\\x76\\x79\\xdf\\x8e\\x2d\\x31\\xc4\\x4e\\x78\\x8e\\xbd\\x51\\x7d\\x96\\x86\\x8f\\x4a\\xcf\\x04\\xa9\\x45\\xe1\\x35\\x3c\\xf5\\x9a\\x92\\x9b\\xb5\\x89\\xb4\\x19\\x77\\xdd\\xa3\\x12\\xa1\\xce\\x0f\\xea\\x62\\xe1\\xfe\\xdb\\x6a\\xd0\\x1d\\x36\\xa9\\x2d\\x5b\\x95\\xb7\\xf3\\x1a\\xdd\\xf5\\xf0\\x31\\xfb\\xff\\x73\\xf7\\xfe\\xdf\\x6d\\xe3\\x48\\xbe\\xe8\\xef\\xf7\\xaf\\xb0\\xf0\\xee\\xd5\\x90\\x6b\\x84\\x2d\\xe5\\x5b\\x27\\x50\\xd0\\x3e\\x69\\xdb\\xd9\\xce\\x9b\\x76\\x92\\xe3\\x38\\xdb\\x3b\\x57\\xa3\\x4d\\xc3\\x24\\x24\\x71\\x42\\x91\\x1c\\x92\\x72\\xa2\\x95\\xf4\\xbf\\xbf\\x83\\x02\\x40\\x02\\x24\\x28\\xcb\\xe9\\x99\\xb3\\x73\\xde\\x0f\\xb6\\x48\\x00\\xc4\\xd7\\x02\\x50\\x28\\x54\\x7d\\xea\\xc0\\x72\\x67\\xd4\\x67\\x9e\\x15\\x21\\x97\\x0d\\xb2\\x14\\xdd\\xeb\\xcf\\xdf\\x34\\x09\\xd4\\xaa\\xc2\\x7b\\x33\\xe7\\xbe\\x49\\xc6\\x85\\x21\\xf2\\x3d\\x6e\\x90\\xdb\\x83\\xf8\\x00\\x83\\x20\\xad\\x9e\\xf7\\xf6\\xe2\\x7d\\xce\\x8b\\x9a\\x71\\xcf\\x1c\\xca\\xce\\x8c\\x6e\\x15\\x9c\\xb5\\x16\\x4a\\x69\\xff\\xfc\\x85\\xe9\\xb1\\xfe\\x83\\x33\\x8d\\xde\\x2b\\x6c\\x67\\x5e\\xa0\\xe0\\x5a\\x04\\xf7\\xf9\\xfc\\x02\\x2d\\x57\\x25\\x2a\\x7f\\x7b\\xf1\\xa6\\xc8\\x56\\x86\\xde\\x23\\xb1\\xbb\\x1f\\x50\\xb3\\xdf\\x5e\\x78\\x2d\\xa7\\x5d\\xcc\\xe8\\xd4\\x76\\x73\\xc9\\x8b\\xa7\\x0e\\x0d\\x41\\xd1\\x91\\x0f\\x70\\x1e\\x60\\x5b\\xbd\\x0c\\xc6\\xa2\\xbb\\x7a\\xab\\xac\\x60\\x11\\xfa\\x7a\\x44\\x01\\x2d\\x38\\xfb\\xda\\xad\\xb5\\xd2\\xd7\\x1f\\x85\\x37\\xc8\\x7c\\xcc\\x82\\xbe\\x9a\\x50\\xde\\x1b\\x85\\x59\\xd0\\x5b\\x43\\xca\\xfb\\xe3\\x30\\x0b\\xdc\\x55\\x97\\xa2\\x39\\x17\\x6d\\x64\\x70\\xb9\\xea\\x18\\xae\\x8e\\x69\\xc3\\x8f\\x0f\\x40\\x13\\x37\\x01\\x2e\\xed\\x7b\\xa7\\xe0\\x33\\xb8\\x5e\\x52\\xe0\\xc1\\x52\\xda\\xa8\\x65\\x05\\x0b\\x0e\\x97\\xb8\\xd2\\xe1\\xba\\x96\\x71\\xa0\\x13\\x30\\x46\\x05\\x43\\x5b\\x65\\x89\\x2b\\x81\\x38\\x4e\\xb2\\xf9\\xc9\\xef\\xe8\\x34\\x3d\\x45\\xbf\\x07\\x68\\xaf\\x5d\\xc2\\x76\\x56\\xbe\\x7a\\xe3\\x71\\xfa\\x66\\x6c\\x99\\x49\\xc4\\xfd\\x66\\x12\\xa5\\xd3\\x4c\\x62\\x7d\\xb4\\x99\\x84\\x75\\xac\\xb7\\xad\\x2e\\xcc\\x73\\x7d\\x62\\x84\\xbf\\x63\\x95\\x79\\x1d\\x87\\x6c\\x23\\x0b\\x65\\xf4\\x10\\x39\\x8c\\x1e\\x4c\\x39\\xc0\\xfc\\x90\\xa0\\xa0\\x2b\\x0a\\x30\\x2f\\x65\\x6d\\xb9\\x84\\xa2\\x98\\x46\\x26\\xd1\\x96\\x0f\\xdc\\x19\\xf6\\x8c\\x32\\xae\\xb1\\xbd\\x30\\xa7\\xe8\\xe2\\x88\\xeb\\xda\\xcb\\x8e\\xd8\\x60\\xec\\xe3\\x73\\xba\\xad\\xd9\\x2c\\x6b\\xaa\\x49\\xae\\xd2\\x26\\xb4\\x1a\\x59\\xad\\xc8\\x32\\x50\\x8c\\x7f\\x7b\\xa1\\x90\\x58\\x21\\x54\\x1b\\x1f\\x99\\x61\\x39\\x4f\\xa3\\x38\\x5d\\xe8\\x0c\\xba\\x31\\xb0\\x63\\xc1\\x8e\\xe0\\x88\\x34\\x4f\\x19\\x62\\x11\\xb2\\x22\\x8d\\x2d\\xa9\\x89\\x93\\xe4\\xcc\\x9b\\x23\\xb3\\x99\\xab\\xde\\xcb\\x8d\\x20\\x58\\x2c\\x00\\x8f\\x94\\x8e\\x74\\x33\\x4a\\xad\\xf9\\xd6\\x29\\x52\\xef\\x73\\x0a\\x96\\x17\\xdb\\xb7\\x9d\\x9d\\x9b\\xef\\x56\\xa9\\xdd\\x22\\x2f\\x4f\\x4f\\xbb\\x3d\\xaa\\x2f\\xb2\\x54\\xc9\\x72\\x8d\\x69\\x0e\\x1c\\x9d\\xd9\\x0f\\xec\\x8a\\xaf\\x51\\xda\\xf4\\x07\\x6a\\x02\\xba\\x3f\\xd1\\x75\\x12\\x73\\x36\\x11\\x6b\\x44\\xdd\\x06\\x38\\x72\\xbc\\xc9\\x8a\\xfa\\x26\\xc2\\xf1\\xb9\\x98\\xd3\\xd2\\x42\\xae\\xc0\\x99\\x3f\\x89\\x15\\xc3\\x54\\xe0\\xb8\\xe6\\x96\\x32\\xb8\\x5e\\x9b\\x97\\xf4\\xae\\x4d\\x1b\\x31\\x5e\\x0b\\xee\\xc7\\x8b\\xb1\\x3c\\xee\\xc9\\xdb\\xc0\\x58\\x9e\\x09\\x26\\xb5\\x2c\\xb8\\x04\\xcb\\x59\\x79\\x50\\x90\\xbd\\xed\\xe3\\x4d\\x97\\x3b\\x2a\\x3b\\x87\\x8c\\x52\\x1f\\x32\\xfe\\xd1\\x04\\x06\\x35\\xcd\\x71\\x84\\x97\\x34\\xec\\x3f\\x94\\x4e\\x0e\\xc4\\x49\\x83\\xc1\\xaa\\xd8\\x6c\\x45\\x47\\xb5\\x25\\x48\\xd0\\xe0\\x6e\\xb0\\xd7\\xdb\\x1c\\xa3\\x87\\x6c\\x52\\x31\\x12\\x7a\\x6a\\x70\\x9a\\xa1\\xf1\\xc1\\xae\\x4c\\x7e\\x20\\x11\\x0f\\x00\\x48\\x29\\x32\\x25\\x61\\x5e\\x2a\\xd6\\x40\\x73\\x42\\x35\\xc9\\xea\\xab\\xfd\\xdc\\xdf\\xcf\\xe3\\x94\\x25\\xc9\\x66\\x7b\\xa8\\xcd\\xcb\\x7d\\xdf\\xc4\\x34\\x09\\xc3\\x71\\xb5\\xef\\x45\\xd8\\x49\\xbb\\x62\\xe4\\x7d\\xed\\xd1\\x2f\\x68\\xe9\\x1b\\xf4\\x94\\x05\\x46\\x9e\\x6a\\xf6\\xf1\\x62\\xc1\\xed\\xc6\\xe2\\xdc\\xaf\\x8f\\x6e\\xc6\\x10\\x68\\xd1\\xdd\\x70\\x08\\xdb\\x68\\xc3\\x4f\\x5d\\x73\\x16\\x6d\\x3c\\x5f\\x33\\xbf\\x9e\\xe3\\x1b\\x1c\\xfb\\x78\\xb5\\xef\\xd8\\x19\\x75\\x25\\x1f\\xf6\\xec\\x00\\x27\\x88\\x81\\x4b\\x1a\\x57\\xa3\\x65\\x37\\x5d\\xad\\x62\\x7a\\x88\\xaf\\x1b\\xdb\\x90\\x9f\\xbb\\x08\\xcf\\x39\\xa0\\xae\\x7c\\xf6\\xfb\\x79\\x57\\xd5\\xa3\\xa7\\xeb\\xfd\\x63\\x16\\xe6\\x7f\\xce\\x5e\\xe0\\x5c\\xb4\\xef\\xdd\\x97\\x1c\\x9b\\x44\\x7b\\xbb\\x5b\\x6b\\x5c\\x0a\\xee\\xef\\xf1\\x67\\x2d\\x85\\x7a\\x9b\\x56\\xbc\\x48\\x59\\xe2\\x74\\x26\\xe4\\x2a\\x75\\xb7\\x73\\x11\\xf8\\xc4\\x59\\xc1\\x52\\x1a\\x31\\x82\\xc9\\x9c\\x21\\x81\\x4a\\xf1\\xca\\xdb\\xee\\x71\\xaa\\x66\\x39\\x17\\xfc\\x85\\xa6\\x4b\\xe3\\xb4\\x06\\xe7\\xbd\\xcf\\x2b\\x56\\x7e\\xd1\\xb2\\xee\\xae\\x50\\x49\\x33\\x8f\\x48\\x7a\\xe7\\x36\\x6e\\xf2\\x7a\\x67\\xa1\\x56\\x78\\x34\\xa5\\x46\\xae\\x84\\x96\\xac\\x14\\x34\\xb1\\xd2\\xe6\\xdb\\x8a\\x6e\\xf7\\xb5\\xb4\\xa5\\x90\\xbe\\xad\\xab\\x69\\x31\\xa3\\x7c\\x5a\\xd4\\x60\\xda\\xd5\\x1e\\xb7\\x36\\x36\\x47\\x0b\\xd4\\x04\\x6f\\x5a\\x69\\x5c\\x92\\x89\\x0c\\xfa\\x96\\xbb\\xde\\xac\\xf4\\xb4\\xc4\\x8a\\x93\\x36\\x3f\\x52\\xab\\x82\\xb5\\x92\\x28\\x26\\x7b\\xeb\\xd8\\xa8\\x2a\\xeb\\x5a\\xac\\x23\\x82\\xf6\\xdb\\x3d\\xb0\\xf1\\x0a\\xe9\\xfc\\xe3\\x9e\\xcf\\xea\\x3b\\x40\\xdb\\x21\\x47\\x67\\x95\\x6b\\x11\\xa5\\xee\\x95\\x33\\x20\\x1f\\x0e\\x52\\xe6\\xa6\\x8b\\xdb\\x12\\x50\\xd3\\x32\\xf4\\x33\\x80\\xc4\\x7c\\x70\\x4a\\x9f\\x0d\\x74\\x73\\x25\\x2b\\x54\\x67\\x0f\\xcb\\x13\\x91\\xdb\\x99\\x0b\\x53\\x97\\x8d\\x31\\xac\\x50\\x1b\\xcf\\x25\\xf4\\x98\\xb2\\x19\\x9c\\x27\\xa6\\x6c\\xe6\\x55\\x98\\xe1\\x0c\\xa7\\xfe\\x3e\\x64\\x55\\xb8\\x04\\x57\\x34\\x94\\xef\\xe3\\xb9\\x17\\x9b\\xe6\\xf8\\x20\\xdf\\x12\\xe7\\x46\\xc9\\x6c\\x44\\x30\\x4f\\xf6\\xe0\\x8c\\xcf\\xd6\\xcb\\xeb\\xd1\\x5a\\x74\\x91\\x74\\xcd\\x69\\x29\\xaa\\x76\\x4f\\xd8\\x66\\xf9\\x68\\xdd\\x9c\\x78\\x15\\x2e\\x30\\x97\\x75\\xc7\\x39\\x2f\\xe6\\x59\\xb1\\x92\\x53\\xf5\\xed\\xfc\\x1d\\x17\\xdd\\xcf\\x8a\\x8d\\xd5\\xf9\\x12\\x09\\xc3\\x55\\xca\\x70\\x38\\xef\\x6a\\x18\\xca\\x09\\x7f\\xf4\\x7a\\x83\\xb9\\xbd\\xf0\\xf9\\x58\\x41\\x6f\\xd0\\x9e\\xb5\\x59\\x67\\xd3\\x5d\\x7a\\xfd\\xe1\\xd0\\xd9\\x62\\xee\\xdc\\xc9\\x0f\\x06\\x6a\\x2d\\x30\\xab\\x66\\x7b\\xfc\\x59\\x1c\\x5e\\xde\\xce\\x15\\x51\\x97\\x17\\xf1\\x7c\\xde\\xf1\\xde\\xc6\\x9d\\x0b\\x01\\x76\\xad\\x0f\\x55\\x17\\xce\\x24\\xf8\\xc2\\x37\\xa5\\x57\\xf9\\x41\\x99\\x15\\x82\\xf9\\x2a\\xa8\\x67\\x13\\x33\\x1e\\xf9\\x93\\xa2\\x76\\x3f\\x02\\x9e\\x31\\xb6\\xe0\\x03\\x63\\xdf\\xb9\\x23\\x3b\\x0c\\x5f\\x61\\xac\\x2f\\x31\\x65\\x7a\\x8d\\xc4\\x25\\x65\\x72\\x35\\x9f\\x54\\x03\\x4a\\x53\\xf0\\xd9\\xe6\\xe4\\xec\\x53\\x63\\xc8\\x4a\\xd7\\x69\\x21\\xd5\\x47\\x03\\x16\\xf4\\xde\\x37\\x0e\\x87\\x07\\x22\\xbd\\x12\\xc7\\x4a\\x13\\x69\\x7d\\x80\\xc7\\x14\\xa9\\x70\\x48\\xfb\\xa8\\x62\\xb7\\x1b\\xb0\\xc0\\x79\\x91\\xb9\\xdb\\xf5\\x44\\x78\\x25\\x5e\\xe3\\xd8\\x9f\\x84\\x67\\xde\\x31\\xdb\\x3c\\xcc\\xa1\\x76\\x16\\x29\\x86\\x4c\\xc4\\x54\\xf3\\x7d\\xe2\\x3c\\xc8\\xd4\\x47\\xb2\\xe6\\xd8\\xa2\\xfa\\x9e\\x96\\x98\\x29\\xde\\x7a\\x8d\\xeb\\xb1\\xa1\\xb1\\x6f\\x2c\\x92\\x46\\x17\\x1c\\xd8\\xf2\\xeb\\x31\\x2e\\xfa\\xe6\\x53\\x73\\x72\\xeb\\x32\\x3a\\x93\\x1a\\xd0\\xfb\\x18\\x2e\\xa8\\xcd\\x3f\\x0d\\x1a\\x05\\x16\\x75\\xbe\\x8a\\xe7\\x5e\\x36\\x1c\\x8e\\x29\\xa5\\x85\\xc6\\x4a\\xd1\\x6a\\x2f\\xd3\\xd1\\xac\\x59\\xa7\\x29\\xec\\x0b\\xd9\\x99\\x08\\x25\\xea\\x63\\x00\\xa3\\x3e\\x1b\\x93\\xd1\\x24\\x7e\\xa5\\xbf\\x9e\\xc4\\xda\\xca\\x49\\xea\\x6b\\x4f\\x56\\x1e\\xc3\\x8e\\xa5\\xbb\\x3c\\x2b\\x35\\xca\\x0d\\x93\\xdb\\x4d\\xa9\\x7d\\xb7\\x9d\\x30\\xd1\\xa7\\xce\\x31\\x74\\x4c\\x20\\x5c\\x03\\x02\\xb5\\xba\\x57\\x9c\\x21\\x25\\x13\\xb4\\xd6\\xa7\\x49\\x70\\x25\\xaf\\x17\\xe9\\xd6\\xd9\\x4a\\x16\\x30\\x1c\\x3a\\x83\\x3d\\xa9\\xf5\\xe9\\x5c\\xa0\\x68\\x6b\\xb9\\xa4\\x0c\\xeb\\x03\\x70\\x85\\xf5\\x79\\x2c\\x35\\x8e\\xc2\\x85\\x4a\\xbf\\x56\\x52\\x99\\x16\\x1b\\xec\\x81\\xbe\\xae\\x7d\\x84\\xd0\\x95\\xcb\\x1e\\x72\\xee\\x90\\x1f\\xc9\\xab\\xb1\\x18\\x68\\x3f\\xf4\\x31\\x10\\x6c\\x4f\\xc9\\x07\\x88\\xb6\\x7b\\x80\\x2a\\x68\\xda\\xbb\\x0f\\xf6\\x1e\\x23\\x7d\\xcc\\xee\\x3b\\x45\\x66\\xc0\\x33\\x2d\\xbc\\x02\\x33\\xdf\\x77\\x6c\\x66\\x8a\\x5e\\x7a\\x8e\\x6e\\x95\\x98\\xdb\\xa6\\x32\\x62\\x9b\\x5f\\xc7\\xa5\\xa8\\x77\\xf3\\x3e\\x71\\x1c\\x5c\\xd2\\xfe\\x23\\xca\\x7d\\x47\\x54\\x76\\xdf\\x11\\x75\\x7d\\xfc\\x11\\x35\\xbe\\xb7\\x9d\\xfa\\xcb\\x1e\\x49\\xb5\\x58\\x34\\xfd\\x3d\\x78\\x63\\xeb\\x93\\xc4\\xdb\\x23\\x9e\\xf5\\x4b\\xbd\\x15\\x02\\x54\\xef\\xb8\\xfd\\x26\\x81\\x1e\\x41\\x90\\xfb\\xbe\\xe8\\xf0\\x98\\xee\\xd3\\x2d\\xae\\xa8\\xbe\\x5f\\xf5\\x2c\\xc6\\xbc\\xaf\\x94\\x2e\\x63\\x8e\\x53\\xb1\\x53\\xca\\xde\\x9e\\xd4\\x4f\\xb4\\xb7\\xdf\\x0e\\x09\\xbf\\x30\\x87\\x79\\x67\\x64\\x01\\xac\\x67\\x75\\x0f\\xc9\\x3a\\x9b\\x6e\\x9c\\x9d\\x9b\\x5a\\xa5\\x46\\xf6\\xc0\\x97\\xab\\x26\\x6f\\x94\\x7a\\x21\\xad\\x76\\xbb\\xc1\\x58\\xfe\\x96\\x0e\\x15\\x60\\x5c\\xed\\xb1\\x74\\xaa\\x71\\xcd\\xe7\\xfd\\xb3\\x75\\xc1\\xab\\x0f\\xeb\\xdb\\x24\\x0e\\xf5\\x01\\xdd\\xf3\\x27\\x5e\\x2a\\xc5\\x6f\\x94\\xde\\x9d\\xa9\\xc7\\xed\\x9e\\xc8\\x27\\x5f\\xfa\\x9f\\x74\\x7c\\xb6\\xc7\\xd2\\xa5\\xb6\\x5d\\x9c\\xbf\\xd5\\x2e\\xf3\\x7a\\x4a\\x83\\x5c\\xc1\\xbf\\xad\\x62\\x92\\xfa\\x08\\xc1\\x31\\x4d\\x70\\xfb\\xac\\xa5\\x58\\xc8\\xfa\\xdd\\x3c\\x00\\x35\\xce\\xb8\\x0c\\x6d\\xa2\\xdd\\x0e\\xce\\x62\\x56\\x08\\x0f\\xd2\\x26\\x46\\x3e\\xca\\x83\\x51\\xa7\\xf6\\x0e\\xa8\\x09\\xbb\\xfc\\x3d\\xee\\x9f\\xff\\x52\\x31\\x6e\\x92\\x6b\\x3c\\x21\\x89\\xfc\\x5e\\x7a\\xe7\\x18\\x35\\x09\\xcb\\xd8\\x60\\x09\\x11\\xde\\xb6\\x24\\x42\\xc8\\x7e\\x47\\x1d\\x26\\x12\\xb5\\x02\\xd0\\x81\\xf9\\x82\\x7a\\xa3\\xd0\\x5e\\x2e\\x48\\xd7\\x1a\\x72\\xf7\\xdc\\xbc\\x9f\\xba\\x3e\\x5a\\xd5\\xc0\\x42\\x68\\xf9\\xf1\\xf9\\xf7\\xe1\\xa9\\x7c\\x37\\x0a\\xca\\xb1\\xea\\x08\\xed\\x5b\\x1e\\x32\\x1e\\x3f\\x39\\x02\\x22\\xe5\\xfb\\xb5\\x17\\xfa\\xd0\\x54\\xf4\\x05\\x0f\\x19\\x3f\\xfe\\x11\\xb7\\x2e\\x72\\xc8\\xf8\\xd9\\x33\\xf7\\x05\\xf8\\x3d\\xc6\\x4c\\xae\\x3b\\xf2\\x07\\x60\\xa4\\xb5\\xef\\x98\\x32\\xd7\\x1d\\x13\\xeb\\x5c\\x16\\x6d\\xd5\\xec\\x25\\x99\\x05\\x77\\xe4\\x58\\x96\\x70\\xe6\\x5c\\xa4\\x0b\\x60\\x29\\x31\\xf7\\x61\\x99\\x4d\\xa9\\x7b\\xd1\\x6c\\xb0\\x00\\xf7\\x96\\xf1\\x26\\x3b\\x40\\xa2\\xae\\x5e\\x6d\\x77\\xd0\\x71\\xc8\\x34\\x75\\x23\\xe5\\xcc\\xee\\x00\\x47\\xbe\\xf8\\x2e\\x60\\x99\\xcc\\xc6\\x24\\xf3\\x78\\x17\\xcf\\xb6\\xb9\\xfe\\x64\\xc7\\x5c\\x7f\\xae\\x58\\xae\\x87\\x4a\\xb0\\xe5\\xcc\\xdb\\x32\\x82\\x18\\xc2\\xec\\xf6\\xb6\\x20\\x48\\xfc\\x47\\x98\\x45\\x91\\x44\\xf6\\x50\\x0f\\x08\\xb3\\x82\\x8b\\x64\\x05\\x17\\x29\\x8b\\x2a\\x0e\\x13\\x2e\\x5e\\xe1\\x01\\x61\\x56\\xc6\\x91\\x78\\x17\\x3f\\x08\\xb3\\x75\\x14\\x67\\x04\\xc1\\x0f\\xc2\\xb7\\x04\\xdd\\x22\\x7c\\xcb\\x4a\\x4e\\x90\\xf8\\x8f\\xf0\\x6d\\x14\\x13\\x74\\x1b\\xc5\\xe2\\x29\\x13\\x4f\\x22\\x55\\xbc\\x20\\xe8\\x36\\x5e\\x20\\x7c\\x9b\\x64\\xe1\\x97\\xbf\\xaf\\xb3\\x4a\\xa4\\xaf\\x9f\\x11\\xbe\\xcd\\xa2\\x0d\\x41\\xe2\\x3f\\xc2\\xa2\\xa6\\xa2\\x9e\\x0a\\x4b\\x1c\\xc9\\x5f\\x84\\x43\\x96\\xde\\xb1\\x92\\x20\\xf9\\x2b\\xde\\x73\\xd0\\x0d\\x40\\xea\\x01\\xe1\\x30\\x06\\x18\\x98\\x58\\xe4\\x18\\x66\\x11\\x40\\xc2\\x44\\xf0\\x9c\\x88\\xc7\\x04\\x9e\\x16\\x12\\xd1\\x5e\\x3f\\x21\\xe9\\x17\\x04\\x89\\xff\\xf2\\x19\\xfc\\x5d\\x20\\xfd\\x84\\x70\\x14\\x11\\x14\\x45\\x08\\x47\\x3c\\x21\\x28\\xe2\\x09\\x82\\xdd\\x30\\x4e\\x4a\\xf1\\x06\\x0f\\x08\\x47\\xf3\\x94\\xa0\\x68\\x9e\\x22\\x1c\\xc5\\x2c\\xc9\\x16\\x04\\xc9\\x5f\\xf1\\x7e\\x27\\x5e\\xee\\x10\\x8e\\xc4\\xe7\\xe2\\x6b\\x91\\x7b\\x85\\x30\\x5f\\x11\\xc4\\x57\\xe2\\xf7\\x96\\x47\\xe2\\xf1\\x96\\x47\\x08\\x03\\xc0\\x35\\x78\\x20\\xd0\\x4f\\x22\\x6c\\x51\\x37\\xb6\\x79\\x86\\xf0\\x75\\xc1\\x21\\x0c\\xdc\\xd3\\xcc\\xb3\\x0c\\x00\\x67\\xe4\\x2f\\x92\\x7e\\x49\\x90\\xf8\\x8f\\xf0\\x72\\x4c\\xd0\\x72\\x8c\\xf0\\xf2\\x31\\x41\\xcb\\xc7\\x08\\x2f\\x9f\\x10\\xb4\\x7c\\x82\\xf0\\xf2\\x29\\x41\\xcb\\xa7\\x08\\x2f\\x9f\\x11\\xb4\\x7c\\x86\\xf0\\xf2\\x39\\x41\\xcb\\xe7\\x08\\x1c\\x8f\\x10\\x24\\xfe\\x23\\xe5\\x84\\x44\\xbe\\x01\\x1a\\x9e\\x78\\x2e\\xa4\\x07\\x04\\x82\\xc4\\x7f\\x84\\x63\\x82\\x62\\x84\\x63\\xf0\\x5e\\x42\\x90\\xfc\\x45\\x38\\x5e\\x2d\\x08\\x8a\\x57\\x0b\\x84\\x63\\x0b\\x76\\x26\\x4e\\x4b\\xf1\\x5c\\x22\\xfc\\xe5\\x36\\x22\\xe8\\xcb\\x6d\\x84\\xf0\\x17\\xbe\\x59\\x70\\x09\\x43\\xb3\\xe0\\x29\\x52\\xce\\x48\\x10\\xfc\\x20\\x9c\\xf0\\x05\\x4f\\x23\\x82\\xe4\\x2f\\xc2\\x49\\x4c\\x50\\x12\\x8b\\xdf\\xf4\\x8b\\x78\\x4a\\xbf\\x20\\xbc\\x62\\x71\\x4a\\x90\\xf8\\x8f\\xc0\\x4a\\x0d\\xad\\x58\\x2e\\x9e\\x8a\\x2f\\xe2\\xb1\\x10\\x29\\x00\\x05\\x48\\xc2\\xff\\x88\\xff\\x71\\x25\\x46\\x41\\x3f\\x89\\x30\\x41\\x0b\\xe2\\x3f\\x3c\\x03\\x1a\\x0d\\x87\\xbe\\x4c\\xd9\\x1d\\x41\\x29\\xbb\\x43\\x38\\xcd\\xca\\xb0\\x88\\xf3\\x8a\\x20\\xfd\\x84\\xb0\\x14\\xeb\\x12\\x2d\\xde\\xc5\\x82\\xe0\\x04\\xbd\\x65\\x79\\xa5\\xe8\\x4d\\x3f\\x41\\x18\\x8c\\x64\\xa6\\x46\\x31\\x5b\\x57\\xd0\\x35\\xf2\\x17\\xe1\\x9c\\xa0\\x1c\\xe1\\x9c\\x15\\x6c\\x45\\x10\\xfc\\x20\\x9c\\xc7\\xe0\\x81\\x88\\x20\\xf5\\x80\\x70\\x0e\\x6f\\xf2\\x29\\x5b\\xc8\\x09\\xad\\x9f\\x10\\xfe\\x3b\\x41\\x7f\\x47\\xb8\\xc8\\x09\\x2a\\x72\\x84\\x8b\\x8a\\xa0\\xa2\\x42\\xb8\\x58\\xdf\\x6e\\x08\\x12\\xff\\x11\\x2e\\x09\\x2a\\x11\\x2e\\xd9\\x2a\\x27\\x48\\xfc\\x47\\x58\\xb7\\x4a\\xb7\\xa9\\x54\\xba\\x37\\x48\\x3d\\x20\\xe5\\x7c\\x44\\x03\\xe9\\x20\\x5c\\xae\\x18\\x60\\xee\\x88\\x1f\\x84\\xcb\\x6c\\x5d\\x84\\x9c\\x20\\xf9\\x8b\\xa4\\x07\\x12\\x24\\xfe\\x23\\x5c\\x56\\x45\\x96\\x2e\\x08\\x92\\xbf\\x48\\x79\\x16\\x41\\xf0\\x83\\x70\\xb9\\xbe\\x25\\xa8\\x5c\\xdf\\x8a\\xa7\\xd5\\x8a\\x15\\x1b\\xf1\\x06\\x0f\\x22\\x44\\x54\\x10\\x60\\x7f\\xc0\\x79\\x07\\x82\\x1f\\x84\\x2b\\xb9\\x64\\x54\\x72\\xcd\\xa8\\x22\\x82\\xaa\\x08\\x61\\xb1\\xf5\\xc8\\xd5\\x4c\\x3f\\x21\\x5c\\x89\\xe9\\x40\\x10\\xfc\\x20\\x5c\\x2d\\x09\\xaa\\x96\\xe2\\x17\\x08\\xbc\\x92\\x14\\x5e\\xc5\\x82\\x6a\\xc5\\x7f\\xa4\\x1c\\x9a\\x20\\xf8\\x41\\xb8\\x2a\\x08\\xaa\\x0a\\xf1\\xcb\\xc2\\x2f\\xe2\\x91\\x85\\x5f\\x10\\x5e\\x13\\xb4\\x46\\x78\\x9d\\x10\\xb4\\x4e\\x10\\xbe\\x63\\x05\\x41\\x77\\xac\\x40\\xf8\\x2e\\x8e\\x78\\x46\\x10\\xfc\\x20\\xfc\\x55\\x2c\\x65\\x5f\\xc5\\x5a\\x16\\xc6\\x05\\x2c\\xaa\\xf2\\x17\\xe1\\x30\\x89\\xf3\\x0f\\x4c\\xd4\\x45\\x3f\\x89\\x55\\x65\\x0e\\x4b\\xca\\xbc\\x44\\x98\\x27\\x49\\x9c\\x8b\\x45\\x55\\x3d\\x20\\xbc\\x20\\x68\\x01\\xd4\\xce\\x81\\xda\\xb9\\x7c\\x66\\xc5\\xbf\\x17\\x2c\\x8a\\x81\\xc7\\xb3\\xdf\\x05\\xdd\\x97\\x40\\xf7\\xe5\\x17\\x41\\x4d\\xa2\\xac\\x1c\\xca\\xd1\\x4e\\x70\\x90\\x7a\\x40\\x38\\xcf\\x92\\xcd\\x42\\x8c\\xb4\\x7a\\x90\\x21\\xb2\\x2c\\xfd\\x24\\xfd\\x81\\xb0\\xa4\\x29\\xcf\\x7e\\x47\\x58\\x3a\\x25\\x91\\xde\\x48\\xca\\x2a\\x13\\xc3\\x56\\x65\\x82\\xae\\xee\\xc4\\xc0\\xdf\\x2d\\xe4\\xe8\\xc8\\x91\\x41\\xb8\\x92\\xe4\\x01\\x3f\\x68\\x8f\\x0b\\xbf\\x0b\\x80\\xfd\\x60\\x9e\\xb0\\xd9\\xfd\\xc8\\xf8\\xc5\\x63\\xb1\\x2d\\x3f\\x00\\x27\\xe1\\xb5\\x76\\xa0\\xa2\\xc1\\xd3\\x1c\\xb0\\xf2\\x35\\xbf\\xa5\\xd3\\x30\\x07\\x2a\\x6c\\xec\\xdc\\xbe\\xcb\\xae\\xf9\\xce\\x9a\\xc6\\x2d\\x06\\x40\\xef\\x75\\x3e\\x0e\\x69\\xe9\\x6d\\xb3\\x54\\xa2\\x8f\\x0d\\x46\\x38\\x4b\\x4d\\x38\\x32\\x08\\x68\\xa0\\xb7\\x9a\\x57\\x00\\x9f\\x6a\\x5e\\x3f\\xe5\\xf2\\x05\\xbe\\x52\\x30\\x23\\x9d\\xdc\\xac\\xf0\\x3a\\xd3\\x6e\\xa8\\xc8\\xbb\\x1b\\xfa\\x29\\x6f\\xc2\\xf6\\x60\\xcb\\x69\\x22\\x90\\x7a\\x96\\xed\\x07\\xd2\\x7a\\x89\\x3f\\xab\\x2d\\xbd\\x62\\x0b\\x19\\xf1\\xf3\\xa7\\x9b\\x9b\\xf7\\xef\\x90\\x36\\xff\\x98\\x16\\x38\\x9b\\x69\\x13\\x9b\\xce\\xa1\\xd1\\xb8\\x17\\x04\\x5b\\xb6\\x46\\x39\\xd7\\x1f\\x34\\xcf\\x5d\\xab\\x35\\x75\\x41\\x21\\x63\\xb5\\x67\\x8b\\xe1\\x30\\x04\\x1f\\x18\\x1e\\xd8\\xac\\x35\\x09\\xa6\\x95\\x01\\x7d\\xa0\\x6f\\x2a\\xb4\\x3b\\x04\\xa9\\xd7\\xe7\\xdb\\x9c\\x68\\x22\\xa9\\xb6\\x45\\x47\\xe4\\x69\\xc3\\xf5\\xbb\\xa9\\x88\\x3c\\x7f\\x79\\x00\\xa6\\xb2\\x45\\xff\\xb6\\xa2\\xb3\\x20\\xf1\\x87\\xc0\\x17\\x80\\x47\\x5a\\x75\\x8d\\xc3\\x4d\\x7d\\xd4\\x8f\\xbc\\x7a\\x9b\\xa6\\xbc\\xf8\\xe5\\xe6\\xea\\xd7\\xe1\\xd0\\xdb\\xd4\\xfe\\x6a\\xea\\xb6\\xba\\xb4\\x6c\\x0e\\x64\\x81\\x3e\\x7f\\x06\\xbe\\x00\\x4c\\x0d\\x7b\\x52\\xf9\\x22\\x53\\x5d\\x10\\x6c\\x05\\xbb\\x9d\\xa3\\x0c\\x88\\xf1\\xbb\\x1e\\x93\\x1b\\x98\\x81\\x28\\x98\\xc7\\x69\\x54\\x9f\\x37\\x59\\x9c\\xf2\\xe2\\x4d\\x56\\x80\\x7a\\x2c\\x88\\xb6\\xf5\\xf5\\x4a\\x16\\xa4\\x59\\xc4\\xc5\\x79\\x8d\\x52\\xfa\\xf5\\x2c\\x0b\\x40\\x41\\xf2\\x42\\x79\\x10\\x24\\xd9\\xe4\\xdc\\xab\\x30\\xf3\\xf7\\x12\\x40\\xa1\\x01\\xa4\\x01\\xd9\\x79\\x23\\x61\\x35\\x62\\x34\\x5c\\x8f\\xed\\xf4\\xe7\\x42\\x0a\\xb5\\xdf\\x63\\xee\\xef\\x76\\xde\\xc6\\xfb\\x00\\x8e\\x00\\x3d\\xee\\xfb\\xf8\\xfd\\x94\\x4b\\x3c\\x22\\xdb\\xc5\\x0f\\x78\\xd5\\x90\\x12\\x86\\x8a\\x2d\\x1a\\x85\\x3a\\x2d\\x0e\\x54\\xc3\\x60\\xa9\\x2a\\x14\\xfc\\x2e\\xce\\xd6\\xe5\\x47\\xd1\\x3f\\xe7\\x59\\xbe\\x39\\xa0\\x9a\\xb0\\x97\\xa2\\x78\\x58\\x82\\xce\\x3f\\x7e\\xd4\\x93\\xc2\\x52\\x86\\x5e\\xbb\\xbc\\x50\\x86\\x9d\\x40\\xeb\\x9b\\xe4\\x5e\\xd7\\x1b\\x4e\\x83\\x4e\\x9d\\xd4\\x52\\x13\\x8d\\x1c\\xca\\xd8\\xa6\\x15\\xe7\\xd5\\x3a\\xa9\\x62\\x85\\xf8\\x6c\\x69\\x4b\\x2a\\xed\\xcc\\x7b\\x54\\x25\\xcb\\x90\\xe5\\xdc\\xf0\\xd5\\xf9\\x26\\x2b\\x54\\x35\\xfa\\x54\\x27\\xbd\\x3e\\x30\\x4c\\xd3\\xea\\xd2\\xa5\\x3f\\x99\\xb4\\x50\\x89\\x7c\\x7c\\x4e\\x93\\x40\\x63\\xcd\\xe1\\x6b\\x9a\\xf4\\x62\\x22\\xdd\\xd2\\xad\\xd4\\xb3\\x10\\x4b\\x6c\\xba\\x5e\\xdd\\xf2\\x02\\x5c\\x22\\x7d\\xa3\\x0b\\x6f\\xdb\\xf8\\x63\\xdb\\xfb\\xf8\\x2b\\x1d\\xe3\\xcf\\x72\\xc8\\xaf\\xe8\\x16\\x98\\x9e\\xc1\\x48\\x1e\\xc5\\xc4\\x6f\\x01\\x4e\\x98\\xb2\\x44\\xfc\\xc8\\x13\\xc6\\x60\\x24\\x18\\x77\\x70\\xc7\\x04\\xb9\\x4b\\x8e\\x7c\\x30\\xd2\\x8c\\xf7\\x60\\x24\\x99\\xe9\\xc1\\x48\\xb2\\xc1\\x83\\x91\\x62\\x42\\x07\\x23\\xcd\\xdb\\x0d\\x46\\x8a\\x0f\\x1a\\x8c\\x80\\xb9\\x11\\x35\\xfb\\x40\\x7f\\xf8\\xaf\\x29\\x7b\\xf4\\xdf\\xaf\\x1f\\xfd\\xdf\\x99\\xfa\\x25\\x9f\\xff\\x1a\\xfc\\xf5\\xd1\\x5f\\xa3\\xd9\\xbf\\xfd\\xef\\x1f\\xf0\\x7b\\xba\\xdd\\xe3\\x0b\\xba\\xdd\\xb7\\x16\\xe4\\x49\\x6c\\xd9\\xfe\\xd5\\x7b\\x83\\x21\\xd0\\x8a\\x03\\x58\\x21\\x1f\\xa6\\x8a\\x7a\\xa4\\xf6\\xa5\\xa9\\x58\\x89\\x8b\\x43\\x1a\\x94\\xca\\xc6\\xfb\\x6a\\x5a\\x4f\\xcf\\xd9\\x19\\x42\\x04\\xbd\\xfa\\x01\\x9d\\xd6\\x41\\xa7\\xe8\\x27\\x64\\x3b\\xa5\\x95\\xbb\\xe0\\xfb\\x9c\\xa7\\x37\\x6c\\x21\\x25\\xe8\\xaf\\xd3\\xc8\\x58\\x3a\\x4a\\xaf\\xf2\\x4f\\xcd\\xb4\\x8a\\x30\\x65\\x5a\\x00\\x6e\\x39\\xcd\\xf6\\xf8\\x88\\x8c\\x7a\\x15\\x55\\x5c\\xed\\xc1\\x29\\x45\\xaf\\x8c\\x9a\\xdb\\x1a\\x26\\x6e\\x50\\x88\\xc2\\x6f\\xd0\\x20\\x0a\\xcb\\x0b\\x47\\x3c\\xf7\\xae\\x1d\\xa9\\x33\\xaf\\x73\\xe3\\x52\\x60\\x86\\xb9\\xba\\x94\\x29\\x28\\xa5\\xdf\\x86\\x43\\x8f\\x89\\x3f\\xda\\xb7\\x9c\\xc1\\x5d\\x63\\xa5\\xd7\\x7f\\xcc\\x68\\xa9\\x58\\x0b\\xd9\\x09\\x6f\\xb2\\x02\\xd2\\x96\\x1e\\xf3\\xb5\\x4b\\xe1\\xb0\\x9d\\xa2\\xa9\\x14\\x66\\xfe\\x24\\x16\\xbb\\xdf\\x29\\x45\\x27\\xe8\\x34\\x6e\\x1c\\x81\\x70\\x27\\x18\\xf8\\x59\\x2a\\xc6\\x94\\xa4\\xa7\\x22\\x75\\x27\\xdf\\xb7\\x17\\x9d\\x16\\xfa\\x22\\x7d\\x3d\\x5e\\xd6\\x60\\x3a\\x85\\xf4\\x08\\x4d\\x90\\x58\\x13\\xc4\\x9a\\x51\\x6b\\x55\\x54\\x6c\\x31\\x1c\\xc2\\xb9\\xae\\x15\\x54\\x9f\\x67\\xcc\\xf0\\xdd\\xce\\x4b\\x29\\xfa\\x6b\\x8a\\xfc\\x49\\xbf\\x5e\\x8a\\x1a\\xf6\\x8c\\x16\\x7d\\x1b\\x71\\x33\\xa0\\x59\\x8d\\xa0\\x33\\xa0\\x59\\x20\\xf7\\xf0\\xfa\\xae\\xf8\\x54\\x87\\xec\\xeb\\x9b\\x35\\x46\\x6f\\xa7\\x6a\\xa3\\x2e\\x6a\\x5e\\x61\\x76\\xd6\\x3c\\x2b\\x43\\x0e\\xaa\\xe8\\x45\\xfa\\x11\\x6b\\xa2\\x4d\\x52\\xaa\\x8b\\xb9\\xf3\\x98\\xdf\\x44\\xc4\\x0d\\xca\\x8e\\x24\\x5a\\x0b\\x83\\x4a\\x3a\\xea\\xf0\\x83\\xbf\\x65\\x71\\xea\\x21\\x64\\x7a\\x77\\xf9\\x23\\xba\\x3c\\x93\\x43\\x57\\xbc\\x6e\\xc5\\x9d\\xd4\\xbf\\x57\\xd1\\x23\\xd3\\x1a\\x47\\x7d\\xba\\xda\\xe6\\x8d\\x70\\xb3\\xe5\\xc6\\xbc\\xf4\\xaa\\x5a\\x93\\xaf\\x9d\\xa8\\xee\\x89\\x3a\\x09\\x38\\x26\\x71\\xe5\\xe2\\x14\\xca\\x8a\\x79\\x19\\x1f\\x20\\x1c\\x58\\x1f\\xd2\\x5a\\x41\\x6b\\x10\\xbb\\xe0\\x3a\\x3a\\x6a\\x5b\\xa9\\x2f\\x12\\xa7\\x62\\x9e\\x6b\\x3d\\x80\\x9e\\x69\\x0e\\xf9\\xc3\\xda\\x53\\xfa\\x1d\\xa6\\xbd\\xf0\\x61\\x85\\x60\\xbb\\xdd\\x76\\x8f\\xd9\\xb4\\x98\\x51\\x84\\xf4\\x85\\xa7\\x9b\\xff\\x91\\x18\\x29\\x9d\\x35\\x29\\xf5\\xcf\\x2e\\xbb\\x6b\\x52\\xea\\x13\\x6f\\x1d\\xc4\\xe5\\xc7\\x8a\\xa5\\x11\\x2b\\x22\\xb1\\x13\\x81\\x19\\xa7\\x08\\x6c\\x39\\x77\\x16\\x4d\\x1a\\x0e\\x3f\\xab\\xad\\x5d\\x67\\x0c\\x97\\xa2\\x8e\\x7c\\x9b\\x5e\\x53\\xc8\\x56\\x21\\x8d\\xa7\\xe9\\x0c\\x27\\x14\\xfa\\xe4\\xac\\xa7\\x09\\x84\\x2b\\x9c\\x16\\x67\\x2f\\x87\\x03\\x4a\\x93\\xa6\\x5f\\xe3\\xb9\\x17\\x9e\\x85\\x87\\x97\\xcf\\xd0\\x27\\x07\\xb9\\xc5\\x44\\xe2\\x82\\x40\\xff\\x27\\xfe\\x20\\xe9\\x0e\\xc0\\x6e\\x17\\x0e\\x87\\xa1\\x2b\\xbc\\x3b\\x30\\x75\\x56\\xa1\\xef\\xf8\\x62\\x38\\x4c\\xa6\\xc5\\x6c\\x40\\x69\\x38\\x2d\\x66\\xed\\x71\\x15\\x61\\x0a\\xe0\\x86\\xd1\\x70\\xd2\\x3b\\x8a\\x8e\\x9d\\x25\\xc5\\x21\\xae\\xbe\\x63\\x24\\xe5\\x0c\\xb9\\x67\\x24\\x71\\xe8\\xef\\x59\\x93\\x5a\\xee\\x38\\xee\\xb4\\xcc\\x9a\\x76\\xf7\\xe0\\x1e\\x1e\\x5c\\xa9\\xeb\\x45\\x95\\x1b\\x8b\\x2a\\x6f\\x2d\\xaa\\x47\\xaf\\xbd\\x07\\x8e\\x69\\xbd\\x51\\x6a\\xa5\\xc7\\x65\\xff\\xae\\x31\\x1c\\xf6\\x46\\xe9\\xaf\\xd7\\x6a\\xdd\\xcf\\xe4\\xba\\xdf\\xb4\\x00\\x87\\x7d\\x3b\\x82\\x98\\x21\\xf2\\x1b\\x79\\x37\\x3b\\xa0\\x31\\xce\\x75\\x62\\x1d\\x54\\x4e\\xe4\\xef\\x5a\\x7b\\x50\\x0d\\xcf\\xcc\\x95\\x59\\xaf\\x88\\xf2\\x3c\\x04\\x90\\xc7\\xc3\\xe1\\x20\\xb7\\xb4\\x10\\x8d\\x93\\x80\\xd8\\x37\\xb0\\xae\\x4e\\x36\\xa0\\x94\\x1d\\x48\\x79\\xca\\xa4\\x69\\xfb\\x80\\x96\\x67\\xf1\\x00\\x0c\\x52\\x34\\x6d\\xd4\\xcd\\x77\\x93\\x47\\xa9\\x3f\\x0c\\x6d\\x75\\x48\\x5d\\xdb\\x50\\x01\\xbf\\x1e\\x32\\x0e\\x90\\xdf\\xd9\\x30\\x8c\\x5e\\x73\\xe0\\x30\\x21\\x4e\\xbb\\xfc\\x09\\xce\\x7b\\xad\\x20\\x1d\\x89\\xdd\\xe7\\xc8\\x3d\\x5e\\xb6\\x6f\\xb5\\x63\\xec\\xe2\\xdd\\xff\\xf8\\x7d\\xf6\\xde\\xc7\\x2b\\x69\\xa7\\xa2\\x60\\x10\\xd4\\x71\\x00\\xcf\\xe5\\xaf\\x8f\\xe3\\xa0\\xb6\\x10\\xa5\\xca\\x42\\xd4\\xb4\\x78\\xb5\\xd8\\xe2\\x38\\xf8\\x99\\x85\\x5f\\x78\\x1a\\x99\\x29\\xe8\\x67\\x80\\x2b\\xef\\x48\\x1e\\xdd\\x47\\x64\\x22\\x41\\x59\\x1d\\x4e\\x8b\\xdd\\xc7\\x63\\xf2\\xec\\x1e\\x4f\\x25\\x07\\x1c\\x26\\xde\\x7b\\x5e\\x26\\x3f\\x3e\\x3b\\xe4\\xef\\xc3\\x38\\x2c\\x93\\xf1\\x78\\xec\\xbe\\xe4\\x3e\\x74\\x26\\x26\\xe3\\x67\\x3d\\x66\\xd8\\x4e\\x50\\xda\\x7b\\x4d\\xee\\x5f\\xdc\\x87\\xe0\\x77\\x84\\xfb\\xc6\\x5f\\x6b\\x7f\\x94\\x37\\x05\\xcb\\x5d\\x32\\xd8\\x3e\\x39\\xed\\x7d\\xde\\xbb\\x4c\\x2b\\xd3\\xb2\\x2d\\x94\\x85\\x0b\\x34\\x5f\\x6a\\x0d\\xde\\x2b\\xda\\x7c\\x03\\xb7\\x6d\\xb5\\x60\\xf3\\xcd\\xfb\\xeb\\xab\\x46\\xac\\xc9\\xdc\\x62\\xcd\\x5a\\xcc\\x68\\x48\\x32\\xf7\\x0e\\xac\\xa0\\xf6\\x42\\xd0\\xc1\\xa4\\x6e\\x79\\xb3\\x14\\x6f\\xd7\\xbc\\xe4\\x15\\x46\\xe0\\x66\\x19\\xa9\\x59\\x7d\\xcc\\x77\\x1f\\xc1\\x1d\\x33\\x46\\xd2\\x2d\\x33\\x6a\\xc9\\x3a\\xc3\\x43\\x90\\xc9\\xae\\x61\\x22\\xcf\\x9f\\xfe\\xa3\\xc4\\xa0\\x82\\x98\\xee\\xc1\\x6f\\xf8\\x5f\\x26\\x35\\xf5\\xc9\\xbb\\xb2\\x5a\\xb4\\xa5\\x57\\x52\\x2b\\x9a\\x1d\\x96\\x7c\\xc5\\x0e\\x69\\x55\\xd9\\x15\\x4a\\xad\\xbb\\x82\\x25\\x25\\x52\\x2b\\x8d\\xfd\\x52\\x3a\\xcf\\xee\\xd9\\x4c\\x09\\xfa\\xbd\\x27\\xe6\\xf7\\x93\\xd5\\xba\\x04\\x87\\x9c\\x25\\xaf\\x4e\\xd6\\x65\\x9c\\x2e\\x4e\\x7e\\x77\\xed\\x45\\xfe\\xef\\x41\\x7d\\xe7\\xf6\\x3b\\xfc\\x1e\\xf8\\xd4\\x60\\x71\\xc4\\x77\\xe0\\xf0\\xaf\\xcb\\x2a\\xf5\\xb0\\x35\\x00\\xb0\\x0a\\x0e\\x6e\\xb9\\x3f\\x59\\x7b\\x5d\\x86\\xb2\\xf2\\xf5\\x5e\\x9b\\x9e\\xb1\\xa0\\x54\\xbe\\x95\\xed\\x93\\x3a\\x6c\\xd9\\x1a\\xb6\\xdb\\x15\\x0f\\x1a\\x69\\x6d\\x36\\xfc\\x8f\\xd4\\xe8\\x50\\x61\\xc6\\xc9\\xae\\xe9\\x1a\\xe7\\x89\\xde\\x2a\\xaa\\x30\\x1b\\xa7\\x04\\x15\\x29\\x54\\xdd\\x31\\x42\\xf7\\x67\\x17\\x5a\\x1f\\x1b\\x6b\\xf6\\x71\\x9f\\x67\\x0e\\x66\\x46\\x66\\x78\\x0c\\x2a\\xc5\\x31\\xf9\\xdf\\x97\\x4f\\xb7\\x38\\x37\\x84\\x46\\xaf\\x2b\\x8e\\xd1\\x24\\x7d\\xc5\\x4d\\xd8\\x2f\\xc1\\xe0\\x07\\x39\\x13\\x0c\\xb4\\x28\\xca\\xac\\x50\\x13\\xf3\\xf6\\x42\\x54\\x4e\\xe9\\xe6\\xab\\x22\\x14\\xa6\\xd5\\xa4\\x6c\\xb3\\x32\\x79\\xc3\\xca\\x58\\xd0\\x19\\xd8\\x35\\x01\\x50\\x37\\x0c\\xb9\\xc8\\x12\\x75\\xc3\\x50\\x97\\x9e\\x50\\x3b\\x04\\x39\\xe9\\x04\\x39\\x02\\x51\\x0f\\x51\\x20\\x67\\x30\\x3a\\x6e\\xc4\\xd1\\x31\\xa9\\xd0\\x11\\xc3\\x89\\xee\\x4d\\x22\\x38\\xbd\\x8e\\xbb\\xcf\\xfb\\x58\\x30\\xc7\\x9a\\x4d\\x9e\\xbe\\xb8\\x97\\x19\\x3b\\xca\\x3f\\x9a\\x43\\xf3\\xce\\x5c\\xac\\xc9\\xf8\\xc5\\x0b\\xb1\\x09\\xfd\\x03\\x1c\\x52\\xff\\x0f\\x71\\x34\\x4a\\x3d\\xe7\\x58\\x9e\\xe6\\xad\\xd2\\xe6\\xa9\\xb9\\x9a\\xb7\\x6f\\xae\\x5f\\x5f\\x5d\\xfe\\x8f\\xf2\\x35\\xbf\\x66\\x2c\\xc2\\x28\\xc9\\x58\\xf4\\xaf\\xc6\\x9b\\x3c\\x00\\x4d\\xe7\\x5f\\x8d\\x2c\\x56\\x8b\\xe3\\x69\\x62\\xb5\\x30\\x09\\xe2\\xea\\xdf\\xff\\x65\\xa8\\xe1\\x78\\x1e\\x17\\xac\\x40\\x31\\xe2\\x52\\x1f\\xe3\\x5f\\x8b\\x8a\\x1e\\x80\\x00\\xa4\\xfa\\xa9\\xc6\\x51\\xf4\\xb4\\xbd\\xa5\\x81\\xde\\xe5\\x59\\xaa\\xa5\\x1d\\x5d\\x97\\xe3\\x98\\xdd\\x5f\\xe3\\xf4\\x0b\\x8f\\x80\\xa7\\xd1\\x68\\xba\\xe5\\x11\\x34\\xb9\\x76\\xd0\\x64\\x9f\\x27\\xe4\\x2e\\x53\\x9d\\x3b\\x71\\x71\\x22\\xf7\\x65\\xef\\xbc\\xcb\\x6e\\x2f\\xdb\\xae\\x7f\\x3d\\xa5\\x84\\xe8\\xe3\\x15\\xdd\\xee\\xf1\\x1d\\x5d\\x1f\\x43\\xee\\xca\\x31\\x5c\\x4d\\xf0\\xef\\x3e\\x7c\\xba\\x69\\x48\\x3e\\xab\\x85\\x13\\xe5\\xac\\x03\\x32\\xeb\\xb6\\x7a\\x50\\x6a\\x28\\x12\\x74\\x10\\xfa\\x54\\xdd\\x1f\\x6e\\x95\\x17\\x60\\xc0\\x62\\xe2\\x11\\xe9\\xa6\\x56\\x31\\xbb\\xdd\\x60\\xac\\x5d\\x06\\x43\\x06\\x4a\\xbe\\xc4\\xcf\\xd4\\x25\\xf1\\xbe\\x57\\x85\\x26\\x82\\xab\\xb5\\x66\\x1e\\x4e\\x78\\x2b\\x6f\\x29\\x1d\\xe6\\x56\\xfd\\x1a\\x24\\xc8\\x4a\\xf2\\x5a\\xd2\\x6d\\x90\\x34\\xa1\\xe6\\xc1\\x5d\\x9d\\x66\\x40\\xab\\xb3\\x4a\\xd6\\x1b\\xec\\xde\\x02\\xb3\\x92\\x13\\x83\\x7b\\x54\\x85\\xb5\\x10\\x3e\\x83\\xd0\\xa8\\x83\\x38\\x27\\xa4\\x8e\\xbc\\xd4\\xa7\\x98\\x07\\xda\\xc1\\x9f\\x12\\xa9\\x4a\\x27\\x75\\x32\\x08\\x2f\\xfb\\x34\\x77\\x0e\\xaf\\x3b\\xb2\\x93\\x00\\x01\\x47\\x4b\\xf2\\x1a\\x2f\\xa4\\x9e\\xef\\x4f\\x56\\x60\\x2b\\xb3\\x8c\\xcb\\xbd\\x1b\\x23\\xd7\\x3d\\xe4\\x66\\x1e\\xb8\\xaa\\xf3\\xe7\\xfe\\x44\\x59\\xd2\\xac\\xa6\\xd5\\x6c\\xef\\x82\\xe5\\x3d\\x20\\x43\\x36\\x33\\x9d\\x18\\x26\\xe1\\xba\\xc5\\xd0\\x4d\\xc3\\x61\\xdf\\x59\\x0b\\xa9\\x14\\x08\\x77\\xbf\\x12\\x04\\xa6\\xaf\\xbf\\x3b\\x03\\xae\\xa4\\xb4\\x07\\x72\\x06\\x82\\x40\\x18\\xa1\\x53\\xb8\\x90\\x32\\x07\\xc6\\x69\\xc1\\x05\\x45\\xbc\\x57\\xa3\\xa9\\x4b\\x19\\x0e\\xbd\\x8a\\x2a\\x47\\x20\\x95\\x44\\x11\\x04\\x3f\\x15\\x25\\xcb\\xbd\\xc2\\xc0\\x0a\\xca\\xcc\\x56\\xa7\\x6c\\x05\\x36\\xad\\xa0\\xa3\\x98\\x21\\x4a\\xcd\\xc8\\x6a\\x93\\x73\\x29\\x37\\x86\\xfb\\xce\\xc6\\xb6\\xb5\\x3b\\x46\\x25\\x65\\x93\\xd2\\x38\\x62\\x4c\\xfc\\x92\\x5a\\xef\\xfa\\x63\\xb1\\x99\\xfe\\x7d\\xcd\\x8b\\x8d\\x74\\x3a\\x99\\x15\\xaf\\x93\\x44\\xad\\x33\\xd3\\x14\\xd4\\x1b\\x4e\\xff\\xdf\\x8f\\xef\\xdf\\x05\\x52\\xb7\\x23\\x9e\\x6f\\x3c\\xe8\\x95\\xd3\\x3f\\xcd\\x40\\x84\\x4f\\x55\\x45\\x67\\x7f\\xf2\\xc1\\x65\\x60\\x44\\xd7\\x8d\\xcb\\xc0\\xa8\\x71\\x19\\xb8\\xac\\x1d\\x09\\x2d\\xa5\\x98\\x7a\\x29\\xd6\\xf8\\x15\\xa5\\x94\\xc1\\x83\\x4c\\x75\\x57\\x53\\xd6\\xd2\\x9f\\xcc\\xbd\\x3b\\xd9\\x41\\x1b\\xba\\x9a\\xde\\xcd\\x26\\x73\\x6f\\x63\\xf4\\xdf\\xc6\\xdf\\xd7\\x37\\xa6\\xd5\\xde\\xe5\\x15\\xcb\\xad\\xce\\x76\\x90\\xc7\\xee\\x6c\\x13\\xe4\\xf9\\x93\\xa3\\x04\\xa1\\x7f\\x44\\x31\\xae\\x8f\\xb1\\x6f\\x5b\\xda\\x74\\xb0\\xf6\\x5e\\x3c\\xc0\\x44\\xe6\\xe0\\x36\\x97\\x39\\xb6\\x39\\xe6\\xdc\\xe6\\xe2\\x8e\\xc6\\x10\\x6b\\x6f\\x51\\x4a\\x39\\xdc\\x17\\x34\\x98\\x1d\\xb1\\x3f\\xbd\\x57\\xca\\xe4\\xf5\\x06\\xf5\\xfe\\xc3\\xcd\\x5b\\x4b\\xa3\\x72\\xe6\\x42\\x27\\x37\\x01\\x88\\xfb\\x59\\xb6\\xd8\\x60\\xd9\\x8e\\x50\\x84\\x34\\x9d\\x39\\xfd\\x03\\x46\\xb6\\x2d\\x48\\xbe\\xcf\\x62\\xc7\\xe2\\x8c\\xda\\x76\\xf2\\x0a\\x90\\x62\\xeb\\x08\\xd4\\x58\\x5e\\x9c\\x96\\xee\\xb5\\x4e\\xdb\\x20\\x5a\\x8c\\x16\\xab\\xb1\\x4d\\x3b\\x0a\\x8a\\xa6\\x37\\xa2\\x69\\x35\\xb3\\x1c\\x8c\\x01\\xd4\\xc9\\x6a\\x9d\\x54\\x71\\x9e\\x70\\xe9\\xc5\\xcf\\xc6\\x2b\\x83\\x2f\\xea\\x4f\\xf8\\x57\\x09\\x59\\xe2\\xa1\\x9b\\x25\\x3f\\xf9\\x1d\\x9d\\x56\\xa7\\xe8\\xf7\\x13\\x31\\x0a\\x27\\xe5\\x3a\\xcf\\x93\\x98\\x47\\x27\\x55\\x76\\xf2\\x4a\\x6a\\xe6\\xff\\x54\\x0b\\xf7\\x58\\x7a\\xc2\\x44\\x76\\x27\\xf1\\xfc\\xe4\\x77\\x5d\\xdc\\xef\\x27\\x71\\x79\\x52\\x15\\x6b\\x1e\\x20\\x75\\xe3\\x1a\\xcf\\xbd\\x7f\\x4a\\xe9\\x27\\x65\\xc8\\x12\\xb1\\x22\\x89\\xbe\\xec\\xd6\\x61\\xce\\x92\\x12\\x2a\\xd1\\x76\\x64\\xa2\\x35\\x13\\x32\\x31\\x81\\xac\\x25\\x39\\x90\\x13\\xa3\\x94\\x1d\\x28\\xc9\\xb0\\xe9\\x46\\xb8\\x74\\x17\\x4c\\x5d\\x41\\x47\\x38\\xa3\\x35\\x48\\x7c\\xf1\\x2a\\x03\\x40\\x8e\\x74\\x8a\\xd0\\x69\\x35\\x2d\\x66\\x33\\x3a\\x18\\xc9\\xdb\\x6a\\x48\\xc8\\xda\\x09\\x95\\xd9\\x78\\xc7\\x5b\\x0d\\x9b\\x16\\x33\\xc9\\xe8\\xf8\\x13\\x78\\x96\\x4d\\xe6\\xd1\\x80\\xd2\\x78\\x38\\xf4\\xac\\x30\\x1a\\xfb\\x7b\\xa9\\x2a\\x23\\xeb\\x25\\xca\\xc6\\x3d\\x05\\xc6\\x73\\x23\\x6f\\x6a\\xb8\\x1d\\xb9\\xcb\\xe2\\xa8\\x95\\xed\\x60\\xe4\\x4f\\x74\\x06\\x50\\xe6\\xc8\\x8e\\x94\\x9e\\x34\\xe2\\x1e\\x56\\xbf\\xec\\xe5\\xe5\\xd7\\x47\\x2c\\x72\\xa1\\x63\\x91\\x4b\\x9c\\x8b\\xdc\\x03\\xf9\\xf6\\xa4\\xbd\\x02\\x2a\\x23\\x13\\x93\\x81\\x3f\\xb4\\x00\\x7e\\x54\\x36\\x29\\xf5\\x02\\xf8\\xf1\\xf2\\xd7\\xcb\\x73\\x83\\x45\\x8f\\x71\\xa9\\x58\\xf4\\xf5\\xcc\\x40\\xc9\\xdf\\x9a\\x1c\\x2e\\xc9\\xf0\\x9d\\xfc\\x7d\\x00\\xeb\\x5c\\xb3\\xad\\x87\\x18\\x51\\x93\\x3d\\xc6\\xf3\\xfb\\xb9\\x52\\xe7\\x12\\xed\\x5e\\xb4\\x8e\\xe2\\x65\\xfb\\x96\\xb4\\xb3\\x7a\\xfd\\x22\\x1d\\xde\\xd1\\xec\\x99\\x7a\\xa1\\xeb\\x89\\xf7\\xef\\x61\\x5b\\xb5\\x5e\\x62\\x4f\\x3d\\xaa\\x33\\xd7\\x32\\x0d\\xf8\\xc2\\x1a\\xa8\\xcc\\x27\\x83\\x66\\xc5\\x1c\\x50\\x53\\xd3\\x5f\\x87\\xd6\\xba\\xed\\x3d\\x95\\x3c\\xbb\\xa7\\x0d\\xa4\\x1b\\xaf\\xb3\\x3e\\x9b\\xce\\x08\\x42\\xfe\\x51\\x7c\\x6c\\xe9\\xe0\\x63\\xf5\\x52\\xea\\x64\\x67\\x9d\\x4d\\x1f\\xb5\\xb8\\x5c\\xdc\\xe2\\xcf\\x96\\x87\\xf8\\xb3\\xff\\x39\\x16\\xcc\\xe4\\xb7\\xf6\\x33\\xfc\\xf2\\x21\\x86\\xb1\\x2d\\xaf\\x7a\\xb0\\x0e\\x0e\\x87\\x15\\xa5\\xb4\\xb0\\x36\\x57\\x4d\\x4c\\x91\\x52\\xdc\\x0f\\x6a\\xcf\\xee\\x80\\xc8\\x26\\x17\\x8b\\x6b\\xe8\\x7d\\x1f\\x10\\x4a\\x2a\\xfe\\x4d\\xef\\x05\\x38\\xa3\\x69\\x10\\xad\\xf3\\x24\\x0e\\x41\\x2c\\x32\\xc9\\x82\\x55\\x76\\xc7\\x6f\\x32\\xd5\\x98\\x1b\\x05\\x0b\\x95\\x49\\x17\\xe4\\xd1\\x87\\x2c\\x4e\\x2b\\x0f\\x5d\\xa6\\x11\\xa8\\x87\\x16\\xe0\\xbd\\x78\\xa2\\xcd\\x09\\x8c\\x8c\\xf5\\xe9\\x1d\\x5c\\xbb\\x13\\x86\\x79\\x1a\\x11\\x76\\x5a\\xec\\x5b\\xa6\\x01\\xb2\\xe6\\x5f\\xe3\\x34\\xca\\xbe\\x0a\\x3a\\xa9\\xbd\\xd4\\x0f\\x87\\x8e\\x40\\x09\\x1d\\x37\\xa8\\x76\\xbb\\x91\\x38\\xc4\\x04\\x85\\x68\\xd4\\x39\\x00\\x3f\\xb6\\xdd\\x95\\x8a\\x96\\xb3\\x34\\x5c\\x66\\x85\\xd8\\x29\\x61\\xf7\\x93\\xaf\\xef\\xe7\\xf3\\x92\\x57\\x98\\xd1\\x2a\\x00\\x0f\\xcc\\x10\\x1d\\xeb\\x37\\x15\\xab\\x7c\\x20\\x40\\xa7\\xbd\\xae\\xbc\\x91\\xd8\\x0d\\x0a\\xcf\\xca\\xb1\\x95\\x9f\\x99\\x9b\\x95\\x97\\xd8\\x24\\xd6\\x67\\x23\\x52\\x06\\x55\\xa6\\x1c\\xd7\\xfb\\xba\\xf3\\x13\\x0d\\x58\\xa8\\x46\\x67\\x92\\xa8\\xb1\\x13\\xd9\\xa8\\x4b\\x8a\\x52\\x74\\x7f\\xa2\\xba\\xdf\\x83\\x63\\x7f\\xd1\\xd8\\x75\\x60\\x15\\xa0\\xca\\x92\\xe8\\xab\\xb4\\xf0\\x92\\x76\\xba\\xc4\\x4c\\x87\\x93\\x80\\xa7\\x91\\x19\\xc9\\xd3\\x48\\x57\\x37\\xa2\\xf9\\xd9\\x88\\x24\\x8e\\xea\\xce\\x69\\x74\\x1a\\xe2\\x65\\x43\\x68\\x16\\x69\\x4d\\x96\\x0a\\xaf\\xbf\\xa8\\xa4\\x6f\\xbc\\xa5\\xae\\x34\\xc3\\xb1\\x86\\x22\\x5d\\x06\\x61\\x96\\x24\\x2c\\x2f\\x79\\x64\\x53\\xc8\\xea\\x6c\\x4e\\x22\\xa0\\x92\\xd5\\x59\\x44\\xe6\\x5d\\xb7\\x6a\\x35\\x13\\xe4\\xa0\\x73\\xbb\\x22\\x16\\x3d\\xd7\\x50\\xb9\\x95\\x68\\xe3\\x99\\x27\\xe8\\x02\\x4a\\x14\\x33\\xc1\\x27\\xea\\xe5\\x27\\x23\\x96\\xa7\\x11\\x78\\x42\\x83\\x08\\x9f\\x58\\x5f\\x40\\xac\\x98\\x0d\\x3d\\x93\\x44\\x04\\xcb\\x1e\\x40\\xe1\\x92\\x15\\x2c\\x94\\xc6\\xb2\\x07\\xe7\\x4f\\xa6\\x3f\\x14\\x5d\\x65\\x7e\\x56\\x3c\\x52\\x1f\\x8a\\x56\\x7a\\x7e\\xc7\\xbd\\x5b\\x3c\\xf7\\x1c\\x73\\xa4\\x76\\xf6\\xe8\\x9a\\x3e\\xb8\\xa0\\x7c\\x9a\\x78\\xfe\\xac\\x99\\xfe\\x57\\xac\\x5a\\x06\\xab\\x38\\xf5\\xea\\x56\\x8a\\x73\\x5a\\xab\\xdb\\x32\\x62\\x24\\x83\\x0e\\x92\\x33\\x31\\x0d\\xf8\\xb7\\x8a\\xa7\\xd1\\x70\\x98\\xfd\\x54\\x43\\x4e\\xb1\\x09\\xa3\\x19\\xce\\x68\\xac\\xcc\\x6c\\x42\\x8f\\x8b\\x46\\xae\\xe1\\x41\\xea\\x32\\x97\\xc3\\xe1\\x5a\\x26\\xcf\\xfb\\xa8\\x29\\x6f\\xa8\\xa9\\x04\\x3b\\x25\\x5c\\x06\\x99\\x22\\xd1\\x54\\x21\\x8b\\xbe\\x4e\\x12\\x48\\x5e\\x7a\\x3e\\xce\\x7e\\x62\\x67\\x5e\\x1a\\xb0\\x28\\x92\\x39\\xe4\\x22\\x99\\xac\\x9d\\xb7\\x96\\x19\\xac\\x75\\x06\\x3e\\xf1\\x72\\x4d\\x9c\\xed\\x38\\x6c\\xe5\\xe1\\xef\\x25\\xfb\\xa8\\x98\\xc1\\xcb\\x6f\\x3c\\x5c\\x8b\\xae\\xb4\\x6d\\x75\\x14\\x1b\\xa8\\xee\\x5b\\xdf\\x64\\xc5\\xb9\\x1e\\x45\\x39\\xa9\\x1a\\xae\\x70\\xc1\\x2b\\xe3\\x02\\xf2\\x75\\x18\\xf2\\xb2\\xcc\\xa4\\x61\\xd0\\x3a\\x08\\x59\\xfa\\xa9\\xe4\\x17\\xef\\xaf\\x86\\x43\\x54\\xd3\\x36\\x8a\\xd3\\x13\\xdd\\x45\\xc3\\xe1\\xc0\\x43\\xe6\\x88\\x8a\\x48\\x39\\xd0\\x62\\xde\\x6e\\xc5\\x46\\x0b\\x05\\x96\\x24\\x3f\\xcb\\x08\\xc3\\xa5\\x19\\x10\\x93\\xd2\\xc4\\x6a\\x88\\x94\\x48\\xdf\\xd5\\x24\\xf2\\x1c\\x44\\x06\\xfd\\x0d\\x22\\xe3\\xe7\\x2f\\x70\\x7f\\x7b\\xc8\\xf8\\xc7\\x91\\xd8\\xee\\x1e\\x60\\x70\\xda\\x27\\x6c\\x77\\x22\\xea\\x3b\\x2d\\xa6\\x98\\xed\\xdc\\xc2\\xe1\\xa7\\xbb\\xcd\\x67\\x97\\xc7\\x18\\x43\\xad\\x2d\\x57\\x1f\\xfb\\x49\\xec\\xad\\x0d\\x2d\\xbc\\xef\\xc1\\x85\\x97\\x62\\x2f\\x51\\x9e\\x38\\x04\\x1d\\x46\\x8b\\x97\\x0a\\x8a\\x69\\xc4\\xbf\\xd1\\xd1\\x77\\xd8\\xf2\\x28\\x61\\xa0\\x56\\x7f\\x6c\\x4a\\x36\\xbc\\xf0\\x38\\xcd\\x3d\\x32\\x82\\x5e\\x95\\x39\\x4b\\x4f\\xd0\\x69\\xe1\\xb0\\xf6\\xe0\\x60\\xde\\x71\\x9a\\x9d\\xa2\\x57\\x3f\\x88\\x64\\x3f\\xa1\\x7b\\x0c\\x0c\\x60\\xb9\\xe2\\xb5\\xb5\\x46\\x0b\\x2a\\xbd\\xa7\\xbf\\x26\\xda\\x34\\xe4\\x94\\x4f\\xd2\\xfa\\xdb\\xa6\\x11\\x82\\x7d\\x6c\\xf7\\x68\\x8a\\x99\\x4b\\xb7\\xb1\\xab\\xf0\\xd1\\xa7\\xab\\xee\\xef\\x0f\\x2b\\x9d\\x66\\x0f\\x50\\x1b\\xdd\\x5b\\x77\\xf9\\x6b\\x39\\xe3\\xbe\\x53\\x3d\\xf2\\x58\\xf5\\x47\\x8b\\xf4\\xc9\\x8b\\xc7\\xc7\\xa8\\x36\\x8a\\xb9\\xfa\\x00\\xcb\\xd9\\xff\\x7f\\x5e\\xb1\\x35\\xc7\\xf2\\xdc\\xbd\\x5c\\x44\\xdd\\xeb\\xb4\\x79\\x47\\x76\\xd9\\xb9\\x5e\\xab\\x4d\\x95\\xc0\\xab\\xc5\\x31\\xb7\\x6b\\x37\\x0d\\x58\\x83\\x3e\\xbe\\xdf\\x5c\\xfe\\xe7\\xcd\\xeb\\xeb\\xcb\\xd7\\xff\\xe0\\x3b\\x36\\x8d\\x2b\\x66\\x9f\\xbc\\xf5\\x29\\x74\\x38\\xf4\\xa2\\xda\\x7f\\x38\\xb6\\x45\\x62\\x95\\x0f\\xb1\\x9a\\xdd\\x7f\\x45\\xc7\\x80\\x1d\\x3b\\x1d\\xcd\\x7c\\xcc\\x41\\xb6\\x23\\x15\\xdb\\x28\\x15\\xe7\\x50\\x0e\\xf6\\x10\\xc6\\x55\\x97\\x79\\xe6\\xb5\\xef\\xf9\\xa4\\xe4\\x01\\xa1\\x53\\xaf\\xb9\\xef\\xe2\\xfe\\x81\\xcb\\xbb\\xbc\\x47\\x02\\x51\\x57\\xbd\\xd7\\xe0\\xda\\x75\\xa1\\x67\\x8b\\x26\\x0e\\x4b\\x31\\x6a\\xc1\\x45\\xf7\\x5a\\xef\\x3e\\x01\\x40\\x47\\x25\\xcf\\xec\\x90\\xda\\xd8\\xab\\x68\\x03\\x45\\x37\\x57\\x5b\\xee\\x6b\\xa6\\xcc\\xbc\\x66\\x2a\\x00\\xe6\\xf0\\xbb\\xee\\x99\\x0e\\x9e\\xcf\\x93\\xef\\x3f\\x88\\xff\\x8b\\x5e\\x94\\x1c\\xbe\\x15\\x71\\x48\\xdd\\x5f\\x3e\\xc0\\x01\\xbb\\x5a\\x2c\\x0b\\xae\\xe8\\x23\\xfe\\x6f\\x7e\\x53\\xb0\\xb4\\x64\\x8a\\x8c\\x7b\\x3c\\xa6\\x19\\xf7\\x25\\x46\\xf2\\xfb\\x79\\x99\\x55\\x5e\\x6d\\xde\\x68\\x64\\x59\\xb1\\x14\\x6e\\x9b\\x72\\x49\\x89\\xc3\\x24\\x2b\\xad\\xf5\\x21\\x0a\\xe2\\xf2\\x67\\x56\\x85\\xcb\\x5a\\xd8\\x52\\xd2\\xc1\\x78\\xbf\\xc7\\xa1\\xf3\\xcb\\x2c\\x98\\x27\\xeb\\x72\\x09\\x5f\\x70\\x45\\xd7\\xa5\\x84\\x53\\xcd\\xfc\\x3d\\x4e\\xe8\\x34\\xc4\\xeb\\xd9\\x24\\xf6\\x0c\\xbf\\x69\\x98\\xa9\\x95\\x4a\\x30\\xa8\\x46\\x63\\x7e\\x2b\\x58\\x9e\\x5b\\x06\\xbb\\xb5\\xb0\\x23\\xd9\\xef\\xf5\\x61\\x36\\xe5\\x5f\\x4f\\x0a\\xc1\\xdd\\x76\\xea\\x49\\x06\\x63\\x7c\\x6b\\x55\\xe4\\x00\\x96\\xb4\\xa3\\x9d\\x13\\x67\\xdb\\x47\\x98\\x9d\\x29\\x6c\\x5b\\x9c\\xf9\\x24\\x0f\\x14\\xea\\xae\\xc7\\xb1\\xb6\\xa0\\x81\\x98\\xbd\\x83\\x99\\xee\\x27\\xd5\\x36\\x89\\x99\\x63\\x4a\\xc6\\x4f\\x9f\\xe0\\xce\\xd8\\x91\\xf1\\x33\\x20\\xb5\\x87\\x38\\xe7\\xab\\xfb\\x6f\\x69\\x6f\\x33\\x7a\\x1f\\xe1\\x41\\x95\\x7d\\x12\\x7d\\x7e\\xce\\x4a\\x90\\x06\\xf5\\xdd\\x71\\x89\\x4e\\x7f\\xaf\\x5b\\xdc\\xfa\\x67\\x2a\\x2c\\xed\\x2d\\x20\\x0a\\x7f\\x7b\\x13\\x98\\xe6\\x1b\\xca\\x20\\x45\\xce\\x3b\\x11\\x5e\\xe3\\x44\\x5c\\xf8\\x58\\x25\\xfd\\x90\\xac\\x17\\x71\\xfa\\xcb\\xfa\\x56\\x25\\x36\\x02\\xc1\\xfb\\x8f\\xb7\\xee\\x4d\\xaa\\xf1\\x0e\\x7f\\x81\\x25\\xce\\x7b\\xd7\\x9b\\x50\\xba\\x88\\x79\\x7b\\x4c\\x99\\xe5\\xcf\\xb0\\x19\\x7b\\xdb\\x8f\\xf1\\x2a\\x4f\\xb8\\x11\\x43\\x5e\\xe3\\xcb\\xb4\\xe2\\xc5\\xaf\\x9c\\xdd\\x59\\xe1\\x21\\x96\\x6b\\xa7\\x19\\x16\\xe3\\xab\\xec\\x36\\x4e\\xf8\\x47\\x36\\x67\\x45\\x0c\\xc0\\x32\\x66\\x74\\x84\\xe5\\x11\\xce\\x0c\\xfb\\x82\\x7f\\xe6\\xf3\\xac\\xe0\\xa0\\x5b\\x63\\x46\\xb0\\xbd\\xa8\\x78\\x0b\\xac\\x51\\xd5\\xfc\\xdf\\x45\\x6f\\xc6\\xa1\\xed\\x98\\xc8\\xdb\\xf4\\x7f\\x20\\x79\\x40\\x2b\\xf5\\x87\\xfe\\xd4\\x62\\x15\\x57\\xb3\\xd4\\x2b\\x44\\x32\\xf8\\x22\\x30\\x5c\\x74\\x7a\\xf3\\xfe\\xaf\\xed\\x72\\x78\\xe9\\x6d\\x15\\x88\\xdd\\x42\\x62\\xb1\\x5d\\x6a\\x80\\xb4\\x5b\\x00\\x61\\x38\\x57\\x18\\x0c\\xdf\\x34\\x26\\xd8\\x57\\x0d\\xb1\\xf5\\xb9\\x41\\xb2\\xba\\x92\\x30\\x6b\\x7f\\xf3\\x24\\xd0\\x9a\\x2f\\x91\\xd9\\xc4\\x2b\\x07\\x6d\\x37\\xc0\\xc1\\xfa\\x9b\\x27\\xc1\\xf3\\x7c\\xe8\\x39\\x63\\xd3\\x51\\x15\\x33\\x42\\xce\\xb3\\x74\\x1e\\x2f\\xbc\\xfc\\xd8\\x84\\x9f\\x80\\x88\\xc4\\x44\\x6d\\xb7\\xd6\\x0e\\xf4\\x1a\\x38\\x34\\xf1\\x85\\x5e\\x28\\xf5\\x84\\x50\\x38\\x98\\xe6\\x46\\xf0\\xb1\\x9b\\x4e\\xaf\\x4d\\x1f\\xab\\x82\\x55\\x7c\\xb1\\xf1\\xee\\x44\\x9a\\xeb\\x2c\\x93\\x27\\x42\\xdd\\xcd\\x52\\x6e\\x02\\x00\\x9b\\x3a\\xca\\x4b\\x1a\\x69\\xc2\\x99\\xd6\\x6c\\xb4\\x93\\x90\\x5f\\x9d\\xc1\\x30\\xca\\xed\\xa6\\x19\\x67\\x9c\\x95\\xea\\xa9\\x76\\x1a\\xf3\\xb0\\xe5\\x5d\\xcb\\x5d\\x4d\\xed\\x5f\\x6e\\xba\\x6e\\xb6\\xb2\\xce\\xf4\\x69\\xb6\\xb3\\xf3\\x24\\xe6\\x69\\x65\\xd7\\xd0\\x00\\x67\\x91\\xdc\\x5b\\x7b\\xc9\\x68\\xb8\\x7d\\xe7\\x84\\x6d\\xd8\\xfe\\x1e\\x71\\x8e\\x62\\xff\\x05\\x8f\\xd8\\x21\\x80\\xe6\\x18\\x70\\x68\\x82\\xb7\\xb0\\x5a\\xfa\\xce\\x29\\x4b\\xc7\\x39\\x65\\x75\\xb4\\xbc\\xe3\\xce\\x94\\x77\\xc8\\x9e\\x68\\x13\\x4c\\x83\\xe5\\xe2\\x92\\x8a\\x2c\\xec\\xa8\\x9f\\x35\\xda\\xd6\\xa5\\x1d\\xfe\\x46\\x1a\\x7c\\x9d\\xb7\\x7c\\x87\\x82\\x76\\xec\\xf5\\x41\\x87\\xa2\\xb7\\xad\\x58\\xad\\x67\\xfd\\xad\\x15\\xae\\x14\\x10\\xbf\\xda\\xc1\\x4a\\x89\\xc3\\xc7\\x9f\\xed\\xf0\\x8f\\xfa\\x2a\\xf4\\xca\\x0e\\xaf\\x8f\\x4d\\x3e\\xfe\\xd0\\x8d\\x31\\x1b\\xfe\\xde\\x79\\x16\\xbc\\x30\\x43\\xcd\\xdd\\x4a\\xcc\\x60\\x6a\\xfa\\x53\\x54\\x56\\x96\\xc8\\xc7\\xef\\xac\\x70\\x73\\x3b\\x12\\xed\\x7f\\xeb\\x50\\xe0\\xfc\\x48\\x1d\\x2e\\x0f\\x6d\\x0e\\xef\\x8b\\x4c\\xd2\\xd9\\x22\\x90\\x8f\\x7f\\xd5\\x51\\xc5\\x1d\\x2f\\x3a\\xd3\\xe2\\xb5\\x8a\\x6d\\x6f\\x5d\\xc8\\xc7\\x9f\\x54\\xd4\\x7f\\xfc\\xbb\\x8b\\xa4\\xff\\x26\\x63\\xd5\\xc9\\x75\\x9d\\x24\\x1f\\xd8\\xc2\\x74\\xff\\x68\\x70\\x3a\\xca\\xb2\\x94\\x64\\x7b\\xc9\\xf2\\xf4\\x4c\\x6e\\xf2\\x14\\x04\\x0f\\xdd\\xa9\\x4d\\x9e\\x02\\x53\\xe4\\x9c\\xd8\\xe4\\x29\\xf0\\x46\\x7d\\xd3\\x9a\\x3c\\x83\\x3c\\xdd\\x93\\x9a\\x3c\\x03\\x1e\\xea\\x90\\x38\\xd3\\x3d\\xa1\\xc9\\x73\\xc8\\xf5\\xe0\\x74\\x26\\xcf\\x9f\\xfd\\xa1\\x43\\xc7\\x03\\x64\\x37\\x6a\\x16\\x92\\x17\\xe3\\x83\\x12\\x1d\\x6b\\x72\\x92\\x17\\x4f\\x70\\xdf\\x2c\\x34\\xfd\\xdc\\x36\\x73\\x90\\xbc\\xb0\\x0a\\x15\\x93\\x99\\xbc\\x78\\x8e\\x3b\\x93\\x92\\xbc\\xf8\\x11\\x77\\xa7\\x24\\x79\\xf1\\x02\\x77\\x27\\x24\\x79\\xf1\\x12\\xf7\\x4e\\x3a\\xf2\\x72\\xdc\\x8e\\x84\\xb9\\x4a\\x5e\\x1a\\xcd\\xe9\\x59\\xc4\\xc8\\xcb\\x27\\xed\\x34\\xd2\\x40\\xe5\\xe5\\xb3\\xc3\\x60\\xd9\\xd6\\x24\\x26\\xe3\\xd1\\x63\\xdc\\x9d\\xc3\\x64\\x3c\\x7a\\xda\\x41\\xd0\\xd6\\x53\\x98\\x8c\\x47\\xcf\\x0f\\xa9\\xd3\\x39\\x27\\x30\\x19\\x3f\\x86\\x14\\xce\\xb9\\x46\\xc6\\x8f\\xa1\\xef\\xba\\x93\\x9b\\x8c\\x1f\\xbf\\xc4\\x7d\\x73\\x9b\\x8c\\x9f\\xc8\\x3c\\x3b\\x53\\x9b\\x8c\\x9f\\x40\\xcf\\xf6\\xcd\\x5d\\x32\\x7e\\x36\\x16\\xc7\\x88\\xfb\\xcc\\x73\\x9c\\xc7\\x08\\xb8\\xf5\\x99\\x27\\x59\\x56\\x78\\xe3\\xd1\\xe8\\xdf\\xb8\\xff\\xc3\\x78\\x34\\x72\\x68\\x76\\x01\\x5a\\x20\\xa8\\x49\\xed\\x76\\x23\\xff\\x34\\x35\\x77\\x7f\\x1b\\x41\\x2d\\xee\\x6e\\x5a\\x62\\x2c\\x5f\\xa7\\x2c\\xd9\\x94\\x71\\x5b\\xc0\\xa7\\x17\\xcd\\x75\\xd7\\x94\\x54\\xed\\xf0\\xea\\x70\\x26\\x06\\xed\\x5d\\xf6\\x55\\x5a\\x8e\\x7e\\x66\\x49\\x72\\x25\\x4d\\xd9\\x04\\x4d\\x94\\x64\\x3a\\xc3\\x52\\x90\\xfe\\xb1\\x62\\xe1\\x17\\x32\\x1d\\xcd\\xf0\\x67\\xb9\\x8c\\xf1\\x48\\x1c\\x22\\xe5\\x15\\xa4\\x71\\x0a\\x4a\\x82\\x3a\\x1e\\x30\\x33\\x34\\xb5\\x68\\xce\\x57\\x66\\xee\\x25\\xda\\x62\\xce\\xc7\\x49\\xd0\\x2e\\x55\\x49\\xc6\\xe8\\x08\\xaf\\x03\\x9e\\xb2\\xdb\\x84\\xab\\x58\\x3a\\x18\\xed\\x25\\x24\\xa8\\x51\\x62\\x27\\xcd\\x18\\x60\\xf8\\x7f\\x65\\x65\\x65\\x35\\xc5\\x71\\x54\\xee\\x94\\xbc\\xc7\\x79\\x11\\xa7\\xd5\\xe5\\xb7\\x30\\x59\\x97\\xf1\\x9d\\x2d\\xf6\\xe1\\x94\\xef\\x76\\xdd\\x6f\\x4c\\x45\\xf6\\xfa\\xc3\\x8f\\x12\\x76\\x16\\x0c\\x2e\\xb3\\xb4\\xcc\\x12\\x1e\\x00\\xde\\xac\\x57\\x05\\x2b\\x96\\x7b\\x5d\\xd7\\x67\\x5b\\x54\\x13\\xde\\x49\\x28\\x56\\xc1\\x93\\x14\\x56\\x1b\\xc3\\x95\\xa2\\x38\\x5d\\x61\\x74\\x93\\x55\\x2c\\x39\\x89\\x53\\x55\\xd0\\x49\\x15\\xaf\\xf8\\x89\\xb7\\x2a\\x7d\\x44\\x0a\\x8f\\x07\\x75\\x84\\x8f\\x51\\x5d\\x9b\\x13\\x18\\xc2\\x76\\x52\\xfe\\xcd\\x95\\x54\\xf9\\x6b\\x6e\\xa5\\x95\\xa1\\x3e\\x46\\x57\\x4d\\x4e\\x39\\x2f\\x6a\\x57\\x68\\xae\\x6c\\x7f\\x10\\x75\\x5f\\xa7\\x95\\x8f\\xd1\\xb5\\x91\\x69\\xcf\\x67\\xb2\\x84\\xe6\\x1b\\xbd\\xa0\\x94\\x44\\x05\\xed\\xf7\\xbe\\xaf\\xc6\\xe7\\x6d\\xfa\\x9d\\xe3\\x53\\x7f\\xf8\\x1d\\xe3\\x03\\x6e\\x06\\x4e\\x7e\\x3a\\x09\\x9b\\x05\\xa2\\x33\\x38\\x6f\\xfb\\x86\\x45\\xbc\\xf6\\xb4\\x09\\xeb\\x0a\\x24\\xd9\\xc2\\x53\\xc3\\x2b\\x61\\x84\\x31\\xd4\\x19\\x42\\x6e\\xe2\\x15\\xf7\\xb8\\x1f\\x54\\xd9\\x9b\\xf8\\x1b\\x8f\\xbc\\xc7\\xfe\\x29\\x3a\\x59\\x95\\xc8\\x07\\x5a\\x37\\x9b\\xab\\x5a\\x76\\xc5\\x72\\x97\\x83\\xbd\\x9e\\x5e\\xc0\\x83\\x91\\xff\\x87\\x1a\\xfe\\x1b\\x2b\\x2b\\x1e\\x99\\xad\\x96\\x6d\\x76\\x36\\x59\\x8d\\xa2\\xfc\\xe6\\x98\\x21\\xc4\\xf6\\x18\\x81\\x56\\xba\\xbb\\xcd\\x00\\x8d\\xf9\\x07\\x3b\\x14\\x2a\\x77\\xf1\\xfe\\xea\\xa1\\xc4\\x25\\xf6\\xf3\\xe3\\xc9\\x4a\\x7e\\xb8\\xdd\\xd7\\xb7\\x89\\x53\\x16\\xbc\\xbd\\xf8\\xfc\\xfa\\xe6\\xe6\\xfa\\xed\\xcf\\x9f\\x6e\\x2e\\x3f\\xbf\\x7b\\x7d\\x75\\x39\\xa3\\x3c\\x88\\x23\\x2c\\x5d\\x99\\x50\\xae\\x3c\\x9a\\x04\\xac\\x58\\x94\\xb4\\x65\\x07\\xc0\\x21\\xd4\\xc7\\xd5\\x3f\\x80\\xa4\\x3e\\x17\\x3c\\xcc\\x8a\\xe8\\xb7\\x22\\x76\\xf8\\xc8\\xd2\\x92\\xf5\\x6e\\x67\\x4c\\x7b\\x97\\xf2\\x47\\xe3\\x59\\xf0\\x55\\xe4\\x56\\x4e\\xb2\\x29\\x9f\\x51\\xf1\\x6f\\xb7\\x9b\\xce\\xb0\\x78\\x08\\xf2\\x75\\xb9\\xf4\\xb6\\xa2\\x6d\\xa4\\x92\\x08\\xda\\x29\\x16\\x8d\\x21\\x85\\xa0\\x15\\xb5\\x51\\x74\\xae\\x00\\x54\\xbf\\x19\\xcb\\x7a\\x0d\\x40\\x48\\xa7\\x33\\xcc\\xe8\\x08\\xc7\\x94\\x15\\x8b\\xb5\\x59\\x91\\x09\\x7b\\x15\\x4f\\xd8\\xe9\\xa9\\x5f\\xc8\\x52\\xeb\\xf8\\x29\\x9b\\x29\\x8f\\x4a\\x38\\xc7\\x11\\xd8\\x7c\\x28\\xd0\\xd4\\x77\\xfc\\xab\\xe0\\x26\\x1a\\xbe\\x40\\x3a\\xd4\\x41\\x0e\\x69\\x2e\\x44\\xf9\\xbd\\xbb\\x8b\\x6a\\x68\\xbd\\x40\\x92\\xed\\x1e\\xd7\\xeb\\x35\\x69\\x14\\xe7\\xb7\\x7b\\x0c\\x53\\xa5\\x14\\x4f\\xb2\\xdb\\xc4\\x93\\x71\\xe3\\x05\\xef\\x95\\x1e\\x45\\x32\\xda\\x8b\\xb3\\x75\\xe8\\x89\\x03\\x78\\x1a\\xb0\\x3c\\x4f\\x36\\xf2\\xd2\\xa1\\x70\\x6d\\xaf\\x87\\x87\\xa9\\xce\\x55\\xe4\\xf7\\x28\\xc2\\xb9\\xec\\x0b\\x79\\x6f\\xbb\\x62\\x0b\\xfe\\x36\\xad\\xb2\\x77\\x59\\xc4\\x75\\x3f\\x38\\x79\\x67\\x4a\\xa9\\xd4\\x46\\xef\\xab\\xd6\\x5a\\x65\\xdf\\x9b\\xb3\\x24\\xb3\\xb9\\x54\\x82\\x7c\\x7b\\xe1\\x15\\xd3\\xf1\\xcc\\x9f\\x24\\x81\\x49\\x9b\\xde\\x1c\\x57\\x78\\x8d\\x8b\\xe9\\x48\\x41\\x7e\\x1d\\x61\\x23\\x2e\\xf2\\x06\\xb7\\x73\\xc1\\x3c\\x2b\\x2e\\x59\\xb8\\x74\\xcf\\x4a\\xe5\\xa2\\x92\\x07\\xf3\\x22\\x5b\\x01\\x27\\x39\\x1c\\x7a\\x55\\xf3\\x66\\xc6\\x68\\x20\\x0a\\x31\\x41\\xb3\\x26\\xad\\x7a\\x6e\\x42\\xcd\\x74\\xcd\\x85\\xb2\\x4c\\xdb\\xbc\\xdb\\xb1\\xc6\\x37\\x2b\\xd0\\x22\\x68\\xf2\\x97\\xef\\x54\\x74\\xcc\\xd4\\x8a\\x9d\\xc1\\xa8\\x9b\\xfd\\xc4\\x6b\\x10\\x03\\xac\\x16\\x91\\x35\\xae\\xfc\\xbd\\x4f\\x5a\\xe9\\x44\\xbf\\x40\\x97\\xca\\x2b\\xcb\\xfa\\x1e\\x22\\x28\\x93\\x38\\xe4\\xf2\\x36\\xab\\xc0\\xe3\\xc6\\x9d\\x75\\xbe\\x17\\xd4\\xd1\\x9c\\xd4\\x6c\\x67\\x44\\xa2\\xda\\xbb\\x5d\\x1b\\xb1\\x69\\x40\\x69\\x35\\x1c\\x76\\x60\\x9a\\x54\\x70\\xbf\\x87\\xa1\\x81\\x31\\xb9\\x5a\\xe4\\xf4\\x7d\\x7e\\x85\\xdb\\x99\\x48\\xcb\\xa8\\x76\\x75\\x6b\\x82\\x21\\x1d\\x95\\x87\\x15\\x3d\\x50\\x5d\\xf1\\x1d\\xbe\\x73\\x66\\x87\\x37\\x62\\xf5\\x6c\\xf8\\x6a\\xbc\\x78\\xe8\\x6a\\x2a\\x1a\\xbc\\x3a\\xcb\\xbc\\x85\\xdc\\x54\\x4b\\xbc\\xc4\\x63\\x9f\\xdc\\x0d\\x87\\x1b\\xb9\\xc8\\x8c\\xfa\\x17\\x04\\x3d\\xf3\\x56\\xbe\\xf8\\x5c\\x56\\x1f\\x2f\\xf1\\x5a\\x42\\xaa\\x9e\\xc4\\x73\\xef\\x4e\\xce\\x83\\x4b\\xba\\x09\\xf2\\x2c\\xf7\\xfc\\xc9\\x66\\xba\\x69\\x8a\\x3e\\xa5\\x6b\\x2c\\xbe\\xac\\x97\\x31\\xf1\\xf1\\xa3\\x4b\\x1f\\x02\\xeb\\xe5\\x0c\\x72\\x94\\x46\\x21\\xdd\\x70\\x4d\\x3d\\x0b\\x13\\xb9\\xb7\\x9c\\x2e\\x67\\x8d\\x7f\\x1c\\x7d\\x6f\\xab\\x7c\\xa2\\x02\\xbe\\x36\\x71\\x8e\\xe8\\x67\\x88\\x3b\\x3b\\x10\\xd7\\xe4\\x43\\xd0\\x2b\\x31\\x7c\\x3f\\xa1\\x3d\\xce\\xf7\\xd6\\x35\\x54\\xd2\\xd1\\x30\\xd1\\x98\\x5c\\xbd\\x07\\x2e\\xf2\\xf2\\xe0\\x09\\xd7\\x42\\x82\\x68\\x1d\\xb6\\xc8\\xf8\\x05\\x68\\x8e\\x38\\x4c\\xfc\\xed\\xd3\\x64\\x8d\\x4f\\x4f\\x47\\xd8\\x81\\x5c\\xb2\\xad\\x4e\\x29\\x60\\x94\\xd4\\xab\\x76\\x63\\x84\\x67\\x2b\\x3a\\x37\\x19\\x4d\\x67\\xce\\x9c\\x60\\xe3\\xc4\\x19\\x64\\xd7\\xe0\\x2f\\x66\\x6a\\xdb\\xf6\\xf5\\xc3\\xb4\\x70\\x2f\\x9c\\x95\\xda\\xdc\\xe2\\x88\\x14\\x18\\xb6\\xf2\\x64\\x2a\\x97\\x9a\\xd9\\x6e\\xa7\\xd6\\x1c\\xd8\\xd3\\x25\\x9f\\xb2\\xf7\\xf7\\xbe\\xa3\\xaa\\xcc\\xaa\\x2a\\xd6\\x26\\x38\\x93\\xa2\\xa9\\x6c\\x6d\\x55\\x93\\x81\\x03\\x6f\\xcc\\xe8\\x1a\\xfc\\x3e\\x19\\xf4\\x98\\x19\\xa7\\xa0\\xda\\xb2\\x32\\x16\\xcd\\x61\\x7e\\x45\\x33\\x9b\\xe8\\xe2\\x99\\x76\\x0d\\x85\\x53\\x71\\x16\\x4f\\xe1\\x28\\xbe\\xb5\\xf8\\x5b\\x52\\x19\\xfb\\xf4\\x08\\x37\\x1b\\xf8\\x48\\x6f\\xd9\\x23\\xb9\\x63\\x93\\x91\\xa8\\x89\\x0c\\x9b\\xc6\\xb3\\xe1\\xd0\\x13\\xd9\\xa9\\x80\\x53\\x6a\\x44\\xf9\\x66\\x8d\\x8d\\xa4\\x75\\x98\\x48\\x6d\\x26\\xf0\\xcd\\x66\\x19\\x1f\\xd4\\x61\\xe2\\x03\\x33\\x81\\xf8\\x40\\x2e\\x0e\\x46\\x6a\\x08\\x10\\x29\\xeb\\x18\\x5f\\xe9\\x9a\\x4e\\xe5\\xa8\\x57\\xd2\\x3d\\xb8\\x5d\\x97\\x9f\\x68\\x38\\x1c\\x2a\\xf6\\x25\\x35\\x1d\\x1a\\x94\\xd2\\x8b\\xb1\\xad\\xae\\x56\\xab\\xc7\\xd5\\xdf\\x3f\\x32\\x4e\\x85\\x7b\\x1f\\x97\\x1d\\x15\\xe5\\x1a\\x9c\\x07\\x17\\x62\\xc8\\x33\\x3a\\x9a\\x64\\xcd\\x90\\x67\\x7a\\xc8\\x19\\x38\\xe7\\xce\\x66\\x38\\x91\\x83\\x1e\\x1b\\x83\\x1e\\x9b\\x83\\x5e\\x01\\x2a\\x68\\xe9\\xc5\\x7e\\x43\\x00\\xb9\\x84\\x26\\x55\\x6a\\xf0\\x6c\\x9a\\xcf\\x64\\xa6\\x11\\x8d\\x6d\\x8a\\xc8\\x67\\x93\\x94\\x46\\x12\\xd2\\xff\\x14\\x9d\\xfc\\x74\\x82\\x4e\\xa3\\x9a\\x46\\x8a\\x69\\x3a\\xa3\\x05\\x20\\x82\\xb6\\x68\\x24\\x95\\xac\\xab\\x41\\x09\\x46\\x95\\xa6\\xb9\\x18\\x82\\x02\\xa6\\x6a\\xbc\\xe2\\xa7\\xd4\\x8e\\x93\\x0e\\x5a\\x61\\x44\\x9a\\x84\\x6a\\xac\\x8c\\x18\\x65\\x91\\x35\\xd7\\x83\\x05\\xb8\\xb0\\x85\\x5f\\x67\\x0b\\xe3\\x34\\x97\\xe3\\x24\\x02\\xeb\\x71\\x9a\\x1f\\x1c\\x27\\xf1\\xe9\\x23\\x79\\x5e\\xdb\\xfb\\x78\\x6e\\xa9\\x4b\\x37\\x2c\\x11\\xb6\\x3d\\x58\\x73\\xbd\\x32\\xe0\\x42\\x0e\\x86\\x31\\xc6\\x98\\xbb\\x66\\x60\\x26\\x6b\\x6b\\x18\\x4a\\x0f\\xc6\\x38\\xa6\\xa3\\x49\\xdc\\x78\\xbb\\x8e\\xa5\\x09\\xdb\\x88\\x52\\x9a\\x8a\\xa9\\x19\\x0b\\x7e\\xe6\\xfd\\xdc\\xcb\\x7c\\x7f\\xcb\\xe8\\x60\\x34\\xb9\\x2d\\x38\\xfb\\xb2\\x1f\\xb0\\xe1\\x90\\xeb\\x7e\\xc9\\x66\\x3f\\x8d\\x04\\x43\\x34\\xcd\\xa4\\x43\\x84\\x7a\\x59\\x31\\xd4\\x8f\\xdb\\x3a\\x1f\\x21\\x1d\\x07\\x8f\\x41\\xe2\\xd5\\x65\\x3f\\x09\\x2a\\xb9\\x98\\x06\\x1a\\xa6\\x07\\xbf\\x7d\\xf7\\xf1\\xf2\\xfa\\xe6\\xf3\\xd5\\xeb\\xeb\\x3f\\x7f\\xfa\\xd0\\x89\\xbd\\x7a\\xff\\x1f\\x97\\x9f\\x2f\\xff\\xf3\\xed\\xc7\\x9b\\xb7\\xef\\xfe\\x9d\\xa0\\x55\\x76\\xc7\\x11\\xbe\\xbe\\x84\\xe0\\x77\\xef\\x2f\\x2e\\x09\\x92\\x2a\\xd7\\x08\\xdf\\x5c\\xfe\\xe7\\xcd\\xe7\\xf3\\xf7\\xef\\x6e\\x2e\\xdf\\xdd\\xc8\\x6c\\x0c\\x46\\x4f\\x83\\x2f\\xb9\\xa0\\xa1\\x4e\\x98\\x86\\x9c\\x3d\\x04\\x0c\\x65\\xa6\\xea\\x83\\x85\\x3a\\x01\\xd0\\xb6\\xb2\\x07\\x13\\xaa\\xd5\\xb2\\xe3\\xf0\\x9d\\x94\\x8f\\x57\\x89\\xef\\xe6\\x90\\x81\\x11\\x86\\x1d\\x32\\x07\\x12\\x63\\xeb\\xc8\\x4c\\x32\\x6c\\x1e\\x4c\\x49\\x61\\x6e\\xce\\x79\\x8f\\x8e\\x88\\xd8\\x42\\xef\\xc3\\x37\\x69\\x5b\\x5d\\x6b\\x47\\x92\\x2d\\xfd\\x68\\xd3\\x95\\x64\\xad\\x3e\\xd4\\xa6\\x9a\\xae\\xbd\\xf5\\xf6\\x0b\\xdf\\x90\\x81\\xd8\\x06\\xe6\\xd2\\x6f\\x4d\\x49\\xbb\\x8a\\x34\\x98\\x69\\x04\\x1a\\x38\\xc5\\x4b\\x35\\x90\\x2f\\x7c\\x43\\x95\\xff\\xf9\\x82\\xcf\\x6b\\x4f\\xe1\\xb0\\xea\\xd4\\x3e\\x9d\\x1b\\xbf\\xe1\\x8d\\xea\\x08\\x65\\xfb\\x49\\xd9\\xb0\\xe6\\x74\\xfb\\x39\\x2e\\x4d\\x41\\x3e\\x38\\x53\\xd0\\x17\\xd7\\x5a\\x21\\xd8\\xa5\\x3f\\xc7\\xf0\\x5a\\x4c\\xeb\\x50\\x01\\x38\\x53\\x6d\\x4f\\xac\\x74\\x18\\xfd\\x6d\\x62\\x1a\\x33\\x14\\x7c\\x2e\\x21\\x76\\xe1\\x11\\x87\\x66\\xdc\\x17\\xbe\\x91\\x71\\x08\\x9d\\xc2\\x1b\\xcc\\x79\\x26\\xfd\\x00\\x74\\x9c\\x00\\x30\\x7f\\x38\\xec\\xa2\\x7f\\x8b\\x50\\x6f\\x3d\\x65\\x33\\x5a\\x89\\xb3\\xf8\\x5e\\xaa\\x30\\xb5\\xcf\\xef\\x8f\\x1e\\x8b\\x1a\\x8e\\x29\\xa5\\xb9\\xbf\\xae\\xd5\\x2e\\x69\\x5a\\xf3\\xae\\xf9\\x4f\\xe3\\x66\\x85\\x89\\xa8\\x54\\xb9\\xcc\\x7d\\x3c\\xa7\\xa3\\xc9\\xfc\\x55\\x3e\\x99\\x9f\\x9e\\xfa\\xd1\\x74\\x3e\\x6b\\x72\\x9e\\xce\\x4f\\x1f\\xcf\\x26\\x46\\x66\\x91\\x38\\xd3\\x70\\xc0\\x34\\x56\\x5c\\x1f\\x68\\xec\\x28\\xe0\\x04\\x3b\\xb4\\x69\\xe8\\xd2\\xaf\\x3b\\x44\\xb4\\x42\\x37\\x66\\x09\\x8d\\x31\\x74\\x83\\x4a\\x8f\\xe3\\x10\\x27\\x62\\x73\\xd6\\x5b\\x4a\\xfd\\xb4\\xf6\\x9b\\x91\\x53\\x5a\\xb0\\xd4\\x65\\xfa\\x68\\x8d\\xad\\x54\\x21\\x93\\x4a\\x97\\x86\\x6e\\xba\\xa6\\x35\\xc8\\x31\\xc9\\x52\\xfe\\x3a\\x8d\\xd4\\x2c\\x86\\x9a\\x53\\x17\\x14\\x9f\\xaa\\xa0\\x64\\xd7\\xb8\\x18\\x49\\xcc\\x61\\xb8\\xb9\\xa2\\x4c\\xf1\\xa0\\xdd\\x1b\\x37\\x9a\\xf0\\x69\\x5d\\xc8\\x21\\x7a\\x2b\\xf0\\x9a\\x32\\xb9\\x53\\x28\\x98\\xfa\\x90\\xca\\x32\\x12\\x2a\\x4b\\xc9\\xa9\\x2e\\xc7\\xa2\\x43\\xd9\\xb1\\x03\\x45\\x85\\xc3\\xa1\\x97\\xc8\\x27\\x9c\\xd3\\xba\\x17\\x7d\\x6c\\xa4\\xfa\\xc2\\x37\\xc3\\xa1\\x17\\x52\\x4d\\x8e\\x06\\xa0\\xb8\\x83\\x1e\\x0b\\x27\\x3d\\x16\\x92\\x1e\\x8b\\x19\\xb8\\xaa\\x90\\xf4\\x18\\x1d\\xa0\\xc7\\xc8\\x4d\\x8f\\x91\\x49\\x8f\\x73\\x45\\x8f\\x91\\x8f\\x97\\x74\\x34\\x59\\xbe\\x8a\\x26\\xcb\\xd3\\x53\\x7f\\x2e\\x4e\\x3e\\x0d\\x3d\\x2e\\x5b\\xf4\\x38\\x6f\\x91\\x8f\\x1c\\x1d\\x41\\x43\\xb9\\x39\\x1c\\x92\\x78\\x6c\\x2f\\xcf\\xb4\\x2b\\xcf\\x1d\\x78\\x03\\xbe\\xdb\\x0d\\x78\\xd0\\x5a\\x36\\x7c\\x13\\xbe\\xb8\\xbc\\xdf\\x5f\\xef\\x71\\xee\\x78\\xdb\\xda\\x9f\\xf7\\x61\\x64\\xb4\\x31\\x17\\x16\\xf5\\xf8\\x2a\\x9d\\xe5\\x3a\\xa0\\x39\\xd4\\x81\\x09\\xbf\\x3a\\xd3\\xa3\\x13\\xc0\\xf3\\x39\\xa9\\x96\\xf5\\x4d\\xc6\\x0a\\x30\\x19\\x4f\\xb2\\xf9\\xc9\\xef\\xe8\\x94\\x9f\\xa2\\xdf\\x03\\xa4\\x3a\\x14\\x21\\xa7\\x35\\x28\\x4c\\x7d\\x97\\xd3\\xeb\\x78\\xee\\x35\\x9e\\xb1\\x2d\\xbf\\xd1\\x82\\x5a\\x1b\\xa9\\x82\\xe5\\x2a\\x3a\\x55\\xfe\\xa1\\x25\\x79\\x5a\\x56\\x9c\\x9d\\x36\\xd5\\x26\\xe0\\xc3\\xa1\\xa8\\x4f\\xfd\\x51\\x9b\\x5d\\xe6\\xc1\\xe7\\xb2\\xca\\x0a\\x50\\xb8\\x96\\x62\\x07\\x0d\\x68\\x0e\\xf3\\x69\\xb7\\xf3\\xba\\x29\\xe8\\x60\\x84\\xd7\\xde\\x9f\\xc4\\xc1\\xed\\x04\\x48\\x0b\\xce\\x43\\x1a\\xd6\\x21\\x2b\\x4e\\xe2\\x8a\\x17\\xac\\xca\\x8a\\x13\\xe9\\x1d\\xf8\\x64\\xc9\\xee\\xf8\\x09\\x3b\\x59\\xa7\\xf1\\xdf\\xd7\\xfc\\x04\\x7d\\xe1\\x1b\\x04\\x50\\x0d\\xc1\\x9f\\xc0\\x53\\x46\\xdb\\xaa\\x4e\\x0c\\xe5\\x57\\xed\\x9e\\x6a\\x38\\x5c\\x7b\\x08\\x24\\x6f\\x27\\xd2\\x0f\\x57\\x69\\xe5\\x9a\\x66\\xe9\\xa3\\x74\\xbd\\xe2\\x45\\x1c\\x9e\\x08\\x66\\xf2\\xa4\\xcc\\x4e\\xb2\\x22\\xe2\\x45\\x9c\\x2e\\x4e\\xe2\\xf2\\x24\\x2f\\x78\\xc9\\x8b\\x3b\\x1e\\x05\\xa8\\xe5\\x15\\x6b\\x6d\\x2b\\x80\\x33\\x4f\\x6c\\xca\\x1d\\xc9\\x4f\\x7a\\x96\\x12\\xe7\\x30\\xe0\\x92\\x16\\xbb\\x5d\\x8c\\xd7\\xf4\\x16\\x24\\xd0\\x9e\\xf8\\xa1\\xdb\\xbd\\xb4\\xc9\\x5b\\xb7\\xd7\\x80\\xd2\\xf7\\xb7\\xeb\\x69\\x09\\x20\\x0f\\x62\\xf0\\x87\\x43\\x2d\\x52\\x68\\x9e\\x06\\x94\\x1a\\x44\\x8a\\x4e\\xde\\x56\\x27\\x5f\\x59\\x79\\x92\\xb3\\xb2\\xe4\\xd1\\x09\\x53\\x7d\\x3d\\x2f\\xb2\\xd5\\x09\\x3a\\xcd\\x3c\\xfd\\x99\\x7f\\x8a\\x02\\xb4\\x37\\xc8\\x21\\xac\\x6d\\x7d\\x5a\\x08\\x1a\\xbe\\x7f\\x00\\xba\\x54\\xf5\\x03\\x1c\\xda\\x57\\x6d\\x17\\xef\\x62\\x09\\x8b\\x25\\xcc\\xad\\x5e\\x8e\\x3a\\x69\\xb8\\xef\\x3b\\x69\\xa5\\x5e\\xc0\\xb8\\x3e\\x6d\\x9f\\x37\\x4e\\xd0\\xc4\\x7f\\x10\\x49\\xf2\\xb4\\x2a\\x62\\x5e\\xd6\\x35\\x14\\x2c\\x45\\x26\\xc5\\x84\\xdc\\x9f\\x0c\\x3c\\x46\\xd7\\x41\\x0a\\xee\\xeb\\xfd\\x20\\xca\\x52\\x3e\\xf1\\x3b\\x15\\x60\\x0a\\x06\\x43\\x54\\x55\\x3d\\x9b\\x15\\xee\\xfa\\x71\\xd3\\x6e\\x30\\xee\\x02\\xfe\\xad\\x2a\\x58\\x58\\xbd\\x9d\\xbf\\x29\\xd8\\x42\\xb5\\xa6\\x3e\\x6d\\x24\\x3d\\xee\\x23\\x12\\x7f\\x38\\x2c\\xbd\\x04\\x87\\xd3\\x64\\x06\\xe8\\xad\\xcd\\x10\\x24\\x8d\\x7b\\x95\\xba\\x41\\xfd\\xbe\\x8c\\x98\\xf2\\x65\\x14\\x83\\xbb\\xe9\\x6b\\x0f\\xe9\\x7c\\x0c\\x09\\xa4\\xd8\\xfc\\x71\\x0c\\x1c\\x8d\\x97\\x62\\x26\\x5d\\xaa\\x84\\xac\\x0a\\x97\\x00\\x25\\x4f\\xb9\\x60\\x35\\xe2\\xfa\\x3a\\x34\\x9b\\x4b\\x7c\\x94\\xe1\\x70\\xe0\\xc5\\xc1\\x8a\\x97\\x25\\x5b\\x70\\x51\\x83\\x6f\\xbe\\xbf\\xfd\\x36\\xad\\x83\\x80\\x20\\xa5\\x07\\x18\\xab\\x01\\xb9\\xe5\\xbb\\x5f\\xee\\x13\\xc5\\x11\\xd3\\x03\\x8c\\xbc\\xb5\\x1c\\xcd\\x10\\x9a\\x75\\x1c\\xf1\\x1b\\x6b\\x9e\\xf9\\xbd\\xf6\\x23\\xc1\\x4f\\xd1\\x0e\\x9d\\x16\\xf0\\x3f\\x83\\x29\\xf5\\xd9\\xd5\\x6b\\x9f\\x05\\x63\\x24\\x5a\\x30\\x1c\\xa2\\x93\\x57\\xf0\\xc1\\xc9\\x0f\\x3f\\xa1\\x49\\x26\\xde\\x6f\\x96\\xfc\\x84\\x4b\\xda\\x80\\x89\\x24\\x79\\x9d\\xe8\\xe4\\x76\\x73\\x02\\x56\\x73\\x62\\xd6\\xd4\\x0d\\x8e\\xac\\x93\\x2c\\x17\\x34\\x79\\x56\\x09\\x16\\x80\\x08\\x3e\\x8c\\x0f\\x87\\xc0\\x9f\\x9e\\x8d\\x7f\\xe0\\x94\\x8e\\x7f\\xa8\\x08\\x17\\xaf\\xcd\\xe7\\x40\\xdd\\x00\\x00\\x23\\x67\\x40\\xbd\\x03\\xe8\\x19\\x91\\x15\\xf1\\x22\\x4e\\x59\\xf2\\x41\\x39\\xbc\\xe2\\x86\\x2b\\x9b\\xda\\xd5\\x55\\xea\\x77\\xe0\\x5d\\x80\\x79\\x70\\x32\\x1a\\x91\\x27\\xd8\\x09\\x9c\\x0a\\x9e\\x62\\xb7\\xf3\\x72\\xaf\\x00\\x57\\x3c\\x82\\xcf\\x80\\x30\\x13\\xfe\\x67\\xa9\\xaa\\xa7\\x97\\x76\\x90\\x5d\\xab\\x2a\\x5e\\x02\\xec\\x9d\\xa5\\x26\\xfc\\x26\\x2b\\x9a\\x59\\x0d\\x00\\x06\\xd6\\x0a\\x58\\x49\\x34\\x33\\xe9\\x1c\\x04\\x30\\x4b\\x86\\xc3\\xc4\\x4b\\xb1\\x11\\xa0\\x39\\x33\\x0c\\xa2\\xff\\xdc\\xc7\\xb0\\xcb\\x5e\\x18\\xfc\\xae\\x14\\x40\\xac\\x9c\\x5a\\x80\\xa6\\x56\\xa5\\x9e\\x91\\x2d\\x35\\xca\\xae\\x97\\xfb\\xc6\\x3f\\x9e\\x33\\x81\\xf4\\x94\\xaf\\x3c\\xe5\\x39\\x4e\\x6a\\xb6\\xca\\x65\\xdb\\x2d\\x7f\\xad\\x7a\\x29\\x0e\\xa0\\x6a\\x7b\\x7b\\x93\\x36\\xca\\x97\\xa6\\x3d\\xda\\x6d\\xf7\\x6c\\xb7\\xf7\\xf1\\x37\\x71\\x42\\xfa\\x4a\\x7f\\xf8\\xaf\\xbf\\x46\\xa7\\xff\\xfb\\x07\\xfc\\x59\\xbc\\x5e\\xd1\\x2d\\xe0\\xda\\xbd\\x4e\\xa3\\xdf\\x58\\x91\\xbe\\xc9\\x8a\\xab\\x75\\x25\\x68\\x14\\x7a\\x88\\xcc\\xb1\\xc5\\x9e\\xf7\\x98\\x2e\\xad\\x5a\\x4c\\xbc\\x21\\xa3\\xaf\\x39\\xc1\\xda\\x9e\\x89\\xd2\\x42\\x73\\x17\\x45\\x23\\x4e\\xa1\\x8f\\x27\\xd9\\xab\\xce\\x05\\x67\\x76\\x7a\\xea\\x87\\xc6\\xbd\\x66\\x36\\x33\\x8e\\x05\\x4b\\xaf\\xf0\\x71\\xb1\\xc7\\xd6\\x11\\xc3\\x81\\xae\\x72\\xf5\\xc0\\x23\\x86\\xc9\\xfb\\x77\\x1a\\xdc\\x5c\\xcb\\xae\\xac\\x43\\x82\\xbb\\xcd\\xf8\\xf8\\x76\\x15\\x72\\x46\\xb4\\x1a\\x67\\x0a\\x0e\\xae\\x0c\\x04\\x31\\x17\\x7b\\xda\\xab\\x00\\x57\\xd3\\x2f\\x19\\x8f\\x1a\\x15\\xba\\x36\\x7d\\x91\\xf1\\xb8\\x89\\x74\\x93\\x2e\\x19\\x8f\\x9f\\xf7\\x26\\x81\\xe8\\x1f\\x71\\x87\\x40\\xc9\\xf8\\x79\\x8f\\xcf\\x8c\\x36\\x3f\\xfd\\x00\\x0c\\x33\\xee\\x6f\\x13\\xe9\\x33\\xb4\\xc5\\xf5\\x2a\\xe9\\x91\\x88\\x6c\\x49\\xe2\\xd5\\x89\\x61\\x00\\x51\\xb0\\xd7\\xf5\\x62\\x00\\x77\\x95\\x79\\xaf\\x58\\xde\\x28\\x9b\\x99\\x33\\x2d\\x11\\x93\\x28\\xd7\\xea\\xb0\\xb6\\xf2\\xbf\\xed\\x6a\\xa5\\x83\\x2c\\x0c\\xe6\\x8c\\x11\\x35\\xd1\\xe6\\x26\\x91\\x71\\x4d\\xd9\\x01\\x30\\xa2\\x1d\\xa3\\xc7\\xb5\\x58\\xd2\\x34\\xd6\\xe8\\x70\\x58\\x88\\xc5\\xdf\\xb4\\x3b\\xc6\\xce\\xfc\\x0c\\x4c\\xce\\x7b\\xb3\\xcc\\x0e\\x66\\x29\\x4f\\x25\\xb4\\xab\\x8d\\x16\\x7a\\xb1\\x8f\\x63\\xcf\\xdf\\x4f\\xf4\\xc5\\xb7\\x35\\x07\\xe5\\xa1\\x71\\x0b\\x96\\x4e\\xf5\\x4c\\xc3\\xb5\\x7e\\x1d\\xc9\\x71\\x5c\\xbe\\x5b\\x27\\x49\\xdd\\x95\\x6f\\x2f\\x08\\xdb\\x77\\xcd\\x0b\\x7b\\x49\\xde\\x1c\\x37\\x32\\x1e\\xb9\\x41\\x0e\\xc7\\xa3\\xfb\\x70\\x78\\xe4\\x4c\\xdf\\x2e\\xd6\\xac\\x88\\x88\\x53\\xe0\\xcc\\xad\\x29\\x5a\\xec\\xf1\\x16\\x32\\xbe\\x0f\\xf1\\xc0\\x26\\xe5\\x4c\\xfb\\xd0\\x05\\x8d\\xce\\x52\\x82\\x88\\x28\\x74\\x7e\\x08\\x52\\xae\\x76\\x4d\\x1b\\x41\\xdb\\x82\\x09\\xc4\\x7c\\x5b\\x69\\xe4\\x79\\xa3\\x10\\x9d\\xdb\\xca\\x2e\\xcc\\xdf\\x16\\x5e\\xa6\\x19\\x4d\\x5d\\x94\\x8a\\xb2\\xed\\xd8\\x98\\x81\\xf3\\xdc\\x94\\x41\\xc0\\x42\\x7c\\x3c\\x7a\\x98\\x73\\x65\\xb9\\x08\\xe7\\x35\\xac\\x2b\\x4e\\x25\\x12\\x67\\xa3\\xda\\x0a\\x06\\xf4\\x92\\xbe\\xbc\\xca\\xc7\\x05\\xcd\\x7b\\x5d\\x17\\xa7\\xcd\\x65\\xbd\\xc8\\xe3\\x4d\\x5c\\x94\\x95\\xd6\\xd9\\xf0\\x8a\\xb6\\x3b\\x64\\x2d\\xa9\\x34\\x20\\xae\\xb5\\xc4\\x32\\x85\\xd5\\x0f\\x1a\\xa8\\x25\\x97\\xa0\\xd9\\x55\\x65\\x45\\x49\\xa7\\xed\\xb5\\xa3\\xb9\\x70\\x74\\x14\\xbb\\xf4\\xb8\\x99\\x9d\\xef\\xef\\x76\\x12\\x8c\\x43\\xb0\\x2d\\x93\\x74\\xe2\\xf3\\x26\\x6b\\x75\\xed\\x24\\x3a\\xa1\\xf0\\x52\\xe3\\x3a\\x81\\x8e\\x00\\xd5\\xaf\\x49\\xa8\\x77\\x8a\\x57\\x4c\\x5e\\x19\\x55\\x66\\xec\\x34\\x9b\\x29\\xdf\\x9e\\xba\\x5f\\x2b\\x7f\\xb7\\x43\\x68\\x72\\xa7\\x6d\\x93\\x35\\x11\\x78\\xdc\\x6a\\x3e\\xae\\x70\\x8c\\xed\\xea\\xee\\x5b\\x4e\\x97\\xb9\\xb7\\x52\\x80\\x32\\xbe\\x6f\\x7a\\x48\\x6e\\xdb\\x42\\x1c\\x85\\x85\\xf2\\x21\\xcb\\x12\\x1e\\xb9\\x30\\xf1\\xba\\x66\\x12\\xb9\\x43\\xe3\\x37\\x72\\x1a\\xc4\\xce\\xdd\\x12\\xed\\x65\\xcd\\x1f\\x49\\x14\\x72\\x56\\x2c\\x78\\xd5\\xd8\\xd2\\x2c\\x78\\xf5\\x29\\xbd\\xcd\\xd6\\x69\\xc4\\xa3\\x8f\\x61\\x91\\x25\\xc9\\x87\\xac\\x8c\\xa5\\xb1\\xc5\\x64\\xee\\x65\\x26\\x9c\\x47\\xc4\\xf5\\xd1\\xa0\\x8b\\xbc\\x6e\\x52\\x53\\x63\\x09\\x69\\x12\\x54\\x13\\xda\\x1e\\x4f\\x3a\\xda\\xef\\x7d\\x1c\\x06\\x2c\\x8a\\x44\\xd7\\xc4\\xe9\\xe2\\x26\\xf3\\x32\\x1c\\x06\\xd5\\xd7\\xec\\xb5\\x62\\x07\\xa0\\xcf\\x94\\x06\\xc7\\x1d\\xdd\\x7e\\x96\\x1a\\xc1\\xe0\\xaa\\xb8\\x35\\xb8\\xf2\\xa8\\xf2\\xdb\\xdb\\x77\\x17\\xef\\x7f\\xfb\\xfc\\xcb\\xeb\\x77\\x17\\xbf\\x5e\\x12\\x03\\x3f\\xe6\\x4c\\x0e\\xa3\\x4c\\x55\\xf2\\xea\\x97\\xbe\\xe5\\xc1\\xdf\\x76\\xe8\\x86\\xf2\\x3d\\x06\\x68\\x1c\\x59\\x76\\x2b\\xad\\xaa\\x12\\x1d\\x0c\\xf8\\x1e\\xc7\\x65\\x27\\x55\\xbd\\x3c\\x36\\x69\\xf7\\xb8\\x0d\\x3e\\xdf\\xc3\\x4c\\xa6\\x7a\\x86\\x17\\x67\\xa5\\x72\\x0f\\x0d\\x0e\\x67\\xee\\xe0\\x04\\x20\\x8e\\x9b\\xf0\\xb5\\xc5\\xc6\\x49\\x9c\\x3e\\x59\\x84\\xf2\\xbc\\x7f\\x7c\\x19\\xa1\\xfc\\xe0\\xe8\\x42\\x56\\x59\\x1a\\x57\\x59\\x21\\x49\\x48\\xe2\\x14\\x74\\x99\\xce\\xd8\\x66\\x33\\xeb\\x96\\xa8\\x95\\x01\\x95\\xf0\\x35\\x92\\xde\\x5f\\xcc\\x22\\xbb\\x70\\x29\\x4d\\x1f\\xea\\xd3\\x70\\x06\\xe7\\x59\\x98\\x5a\\x90\\x0a\\x0e\\xed\\x51\\x60\\x1b\\x41\\x7b\\x0c\\x84\\x4d\\xe2\\xc4\\x97\\x6c\\xb6\\x59\\x50\\xf0\\x84\\xb3\\x92\\x7b\\xa9\\x38\\x65\\xef\\xbb\\x98\\xc6\\x2d\\x33\\x89\\x67\\xcf\\xee\\xb3\\xa3\\x71\\x0a\\x54\\xcd\\x09\\x4f\\x9e\\x77\\x37\\xe4\\x63\\x4d\\x2a\\xda\\x86\\xd2\\xad\\x49\\x4d\\xc6\\xd2\\x14\\xe7\\xc0\\x9c\\x26\\xe3\\x1f\\xc7\\xb0\\x5d\\x1d\\xe7\\x63\\xcd\\x73\\xb1\\x82\\xed\\x43\\x94\\x64\\x62\\x5c\\xba\\xc8\\x7c\\x8f\\xd5\\xc6\\x7a\\x38\\xb6\\x91\\xef\\xb8\\xd3\\x59\\x20\\x0a\\x45\\x3f\\x97\\xd3\\xe2\\x9d\\xc7\\xa3\\xfb\\xec\\xc3\\xdd\\x18\\x4b\\xcd\\xcd\\xa1\\x83\\x9f\\x70\\x58\\x20\\xda\\x8b\\xfc\\xbd\\x7e\\x35\\x2c\\x76\\xd8\\x0d\\xa6\\xda\\xf2\\x8c\\x1f\\x1e\\x3c\\x01\\x27\\xfd\\x56\\x8c\\x79\\xd7\\x36\\xc4\\xdc\\x3c\\x4c\\xfb\\xb8\\xb9\\x73\\x53\\x59\\xd2\\x6d\\xc3\\xb9\\xb3\\xc6\\xd8\\x03\\x43\\xcb\\x88\\xe1\\x56\\x11\\x9b\\x45\\x93\\xc4\\x8e\\xd0\\x3d\\x4b\\x0a\\x23\\xbc\\x75\\x2e\\x28\\xcd\\x28\\xab\\xdf\\x49\\xd6\\x8e\\x52\\x5d\\x43\\x0c\\xf3\\x13\\xdc\\xea\\x18\\x12\\x1a\\x71\\xa2\\xed\\x24\\x37\\x02\\x1a\\x4b\\xdf\\xc8\\x08\\xad\\x91\\x12\\x9a\\x30\\x07\\x7f\\xed\\xd0\\x20\\xeb\\xf2\\x84\\xc7\\x7b\\x6e\\xec\\x37\\x88\\xb3\\x2d\\xe1\\x9e\\xdf\\x6f\\xf3\\xd6\\x22\\x2d\\xf2\\xf2\\xe5\\x91\\x07\\x5b\\x53\\x91\\xad\\x63\\x5d\\xf5\\xf8\\x49\\x1f\\x64\\xe7\\x78\\xf4\\x5d\\x96\\x53\\xcc\\xab\\x71\\xed\\xf4\\x83\\x9a\\xc8\\x98\\x77\\x21\\x3f\\x6a\\x23\\x3a\\x69\\x00\\xaa\\x66\\x60\\x28\\x59\\x60\\x00\\x95\\x6c\\x26\\x5d\\x8d\\x33\\xd9\\xcc\\xb9\\x05\\xaf\\x5e\\x87\\xc0\\x85\\x18\\x67\\xd9\\xed\\x92\\x95\\x75\\xa6\\xe7\\x2c\\x67\\xb7\\x71\\x12\\xb7\\xfc\\x5e\\x37\\xeb\\xcf\\x70\\xe8\\x29\\x2f\\x1e\\x94\\x52\\x0e\\x98\\x78\\xe2\\xe8\\xaf\\x5c\\xad\\xcb\\x40\\xc1\\x21\\xed\\x76\\x0d\\x16\\x91\\x95\\x72\\xb7\\x43\\x55\\xb1\\xe6\\x32\\x30\\x94\\xda\\x20\\x97\\x51\\x0c\\x86\\x03\\xd2\\xbe\\xa3\\xae\\xcc\\xdb\\x14\\xb4\\x08\\xe1\\xc0\\xd7\\x85\\xe6\\xf5\\x6a\\x44\\x20\\x68\\x29\\x07\\x19\\x3b\\xe1\\xb8\\x46\\xc4\\x03\\x6c\\x3e\\x02\\xd7\\x1c\\xce\\xf6\\x79\\xdc\\x3f\\x5b\\xdb\\xc0\\x87\\x0a\\xcf\\x17\\x50\\x84\\x40\\x26\\x5a\\x47\\xb9\\x40\\x79\\x3d\\x1f\\x84\\xa4\\x46\\xf1\\x62\\xad\\x0c\\xec\\x0a\\x4c\\xaa\\x01\\xe0\\xb1\\x16\\xe0\\x8b\\xda\\x3b\\x50\\x1d\\x11\\xbf\\x06\\x34\\xc3\\xba\\x3e\\x80\\x8f\\x19\\x7b\\xa9\\xdf\\xea\\x99\\x6e\\x6d\\xa4\\x4e\\xb0\\x8e\\x97\\x90\\x91\\xe0\\x7c\\xbc\\xa2\\x0a\\x39\\xd3\\xa8\\x18\\x44\\x03\\x88\\xa6\\x11\\x78\\x99\\x46\\xfb\\xe6\\x22\\xb7\\x83\\x9d\\x39\\x1c\\xba\\xc6\\x5d\\x33\\x1c\\xf7\\x61\\x6d\\x4e\\x52\\xa5\\x93\\xad\\xcf\\xf7\\xbe\\x94\\x58\\x7b\\x75\\xf5\\x1e\\xa5\\x3d\\xa8\\x98\\x8f\\x14\\xd2\\x92\\x62\\x90\\x7d\\xa8\\xb7\\x4a\\xdd\\x86\\xc2\\x6c\\xa7\\xdd\\xab\\xab\\x95\\x4a\\x72\\x44\\x0a\\xe3\\xd0\\x33\\xc4\\x7a\\xbb\\x9d\\x2a\\x7f\\x04\\xf9\\x8e\\xf6\\xc0\\xd5\\xba\\x3a\\xda\\xbc\\x6b\\xb0\\x70\\x3e\\x45\\xd7\\xd7\\xda\\x10\\xc5\\x70\\xe8\\x15\\x34\\xf5\\xb1\\x73\\x30\\xda\\x63\\x40\\x53\\x6c\\x8f\\x40\\x03\\xb3\\x59\\xe0\\x56\\x5b\\xbe\\x73\\x6c\\xc4\\xa1\\x51\\x0e\\xc5\\x0d\\xff\\x56\\xe9\\xe1\\x60\\x35\\xbe\\xaa\\x37\\x18\\xf9\\x98\\xf5\\x23\\x92\\xb2\\x7e\\xcc\\x51\\xd6\\x60\\x8e\\x4a\\xd5\\xe7\\xa0\\x34\\xfa\\x58\\x3a\\x0b\\xec\\xa0\\xda\\x75\\xd7\\x31\\xf2\\x12\\x76\\x00\\x6b\\x15\\x23\\x63\\xb9\\x99\\x34\\x8b\\x18\\x19\\x3f\\x7b\\x89\\x5d\\x6b\\x18\\x19\\x3f\\x97\\x6c\\xdc\\x7d\\x1e\\xc4\\x9c\\xeb\\xef\\xfc\\x94\\x37\\x08\\xb6\\x4f\\x9e\\x77\\x05\\x04\\x86\\x7b\\x1d\\x56\\xbc\\xae\\xbc\\x4a\\x50\\xee\\x7c\\xb7\\xab\\xa0\\xaf\\xe5\\xd8\\x38\\x05\\x89\\x08\\x46\\x63\\xb7\\xab\\xbf\\x1c\\xc1\\x97\\xa0\\xca\\x27\\x03\\x78\\xad\\x66\\xee\\x0f\\x28\\x9d\\x77\\x2e\\xbe\\x55\\xd1\\x52\\xeb\\x48\\xeb\\x06\\x72\\x7f\\x38\\xcc\\xbc\\x0a\\x37\\x34\\x6e\\x2b\\x30\\xea\\xfa\\x9e\\xf1\\xa0\\x5c\\xdf\\x96\\x55\\xe1\\x8d\\x44\\x5a\\x56\\xca\\x3d\\xec\\xfd\\xdc\\x9b\\xfb\\x3e\\x31\\x95\\x01\\xd6\\xf5\\x41\\x22\\xf2\\x18\\xe4\\xcf\\xc0\\xbb\\x67\\xe4\\xc9\\x7a\\xf8\\x98\\x9b\\x96\\x3e\\x0a\\x6d\\x11\\x17\\x75\\xf3\\x4f\\x97\\x52\\x3f\\x93\\x16\\x93\\xf4\\x55\\x55\\x43\\xec\\x0f\\x44\\x35\\x53\\x1f\\x6e\\x6e\\x1b\\x31\\x7a\\x5d\\x29\\xf3\\xa2\\x3b\\x34\\xa7\\x57\\x3d\\x05\\x74\\xfe\\xb8\\xaa\\xe7\\x80\\xd6\\x96\\xd4\\x0a\\x10\\xa8\\xb9\\x9c\\x02\\x0b\\xa8\\xd1\\x24\\x7e\\x45\\x53\\xad\\x58\\x29\\x86\\x30\\x56\\xfd\\x15\\xfb\\x7e\\x41\\xe3\\xe6\\xa2\\x57\\x0f\\x42\\xec\\x83\\x12\\x4d\\xfd\\xe6\\x83\\xce\\xe5\\x44\\xc9\\x35\\x9a\\xea\\x16\\x06\\x60\\x1c\\xf3\\x4a\\xdf\\x52\\xec\\x4d\\x6c\\xf5\\x37\\x30\\x9f\\x43\\x08\\x57\\x60\\x32\\x84\\x70\\x24\\x11\\x2d\\xe5\\x89\\x3d\\xa4\\xb1\\x18\\x3e\\x7f\\x12\\x79\\xe1\\x6e\\xa7\\xba\\xb8\\xb9\\xc8\\xa5\\x23\\x9c\\xd3\\xf0\\xac\\x24\\x6b\\xc1\\x86\\x4e\\x26\\x73\\x9a\\x7b\\x73\\x91\\x44\\x6a\\x64\\xc1\\x9d\\xf4\\x70\\x38\\x97\\xb4\\xc5\\xe4\\x53\\xb5\\xdb\\x79\\x4b\\x9a\\x7a\\x73\\x1c\\xe2\\xc2\\xf7\\xf1\\x60\\x4c\\x29\\x5d\\xee\\x76\\x10\\xa7\\x1a\\x14\\x79\\xc9\\xe9\\xe9\\xab\\x95\\x52\\xaa\\xcd\\x7b\\x38\\x5f\\x27\\x74\\x21\\x0a\\x10\\x5e\\xd2\\xb9\\x1e\\x8d\\x15\\x1d\\x8f\\x46\\xf8\\x8e\\x6e\\xdb\\xb0\\x30\\x17\\x8e\\xf3\\x7d\\xe1\\xe5\\x4e\\xf8\\x18\\x4f\\x6c\\x69\\x46\\x44\\xc7\\x5b\\xaa\\xa6\\xb6\\xd3\\x0a\\xb6\\x3e\\xa7\\x30\\xd0\\x96\\x9f\\x2b\\x35\\xb6\\xce\\x6c\\x93\\xd5\\xfe\\x69\\xdc\\xdc\\x77\\xea\\xb9\\x34\\xc7\\xe3\\x86\\x32\\x7f\\x7a\\x34\\x36\\xe7\\x4c\\xe5\\x93\\xda\\xbc\\xa0\\x96\\x1d\\xdc\\xf1\\xa2\\xe4\\x0d\\xae\\xc4\\x01\\x18\\x31\\x49\\xd1\\x13\\x36\\x80\\x6d\\x4e\\xd0\\x07\\x83\\x04\\x83\\x31\\x86\\x05\\x57\\xda\\xff\\x24\\x1e\\x93\\x77\\xf0\\x78\\x30\\xc2\\x83\\xb1\\xdf\\x14\\x72\\xf3\\x35\\xfb\\xb0\\x64\\x65\\xd7\\x10\\x50\\x6c\\x9a\\x89\\x87\\x10\\x96\\x45\\xca\\xef\\xb0\\x28\\x00\\x21\\x19\\x02\\x25\\x18\\x59\\xbd\\xd6\\x22\\xa6\\x4e\\x5e\\x9d\\x7c\\xf6\\xf8\\xb3\\x96\\x5e\\x9e\\x67\\xab\\x55\\x96\\xea\\x6f\\xdf\\x5e\\x90\\x10\\xe2\\xde\\xf1\\x6f\\xd5\\x05\\x2f\\x43\\x9e\\x46\\x0c\\xa4\\xee\\x6b\\x1c\\x97\\x4d\\xaa\\xf7\\x73\\x12\\xe3\\x8f\\x97\\x1f\\x5e\\x5f\\xbf\\xbe\\x79\\x7f\\x4d\\xe6\\x0e\\x31\\x42\\x0f\\x4f\\xed\\x10\\xbe\\x1f\\xa7\\xec\\xba\\x95\\x0a\\xc7\\xb6\\xfd\\x6a\\xf0\\xb9\\x90\\x42\\x85\\x8a\\x17\\x29\\x4b\\xb4\\x70\\x41\\xa9\\x71\\x02\\x45\\x39\\xd9\\xdb\\x9e\\xef\\xf6\\x78\\xc9\\x9c\\xfc\\x70\\xad\\x86\\xd7\\xff\\x65\\xc9\\xdb\\x22\\x9b\\xde\\xda\\x55\\xee\\xbb\\x82\\xe3\\x5c\\x2d\\x69\\x63\\xa2\\x64\\x03\\xd2\\x92\\x38\\x5d\\xe8\\x7c\\xa5\\x7c\\xaf\\x8e\\x56\\x37\\x3b\\xed\\x04\\xce\\xa2\\xef\\xbb\\x71\\x33\\x84\\x06\\x2c\\x4a\\x78\\xf1\\xe4\\x31\\x08\\x0c\\xb6\\xe7\\xbf\\x5c\\x9e\\xff\\xf9\\xe3\\xa7\\x2b\\xb0\\xf0\\x05\\xe3\\x5e\\x82\\x22\\x56\\xb1\\x47\\xd0\\xf0\\x47\\x70\\xa3\\x5c\\xae\\x57\\x08\\xb3\\x28\\x3a\\x57\\x2f\\x37\\x99\\x54\\xb4\\x76\\xb0\\xda\\x85\\xc1\\xb2\\xf1\\x40\\xe9\\x60\\x7b\\xe8\\x27\\x84\\xd1\\x09\\x3a\\xcd\\x82\\x6e\\x71\\xa7\\x7f\\xa2\\xe8\\x4f\\xa7\\xd5\\xe9\\x9f\\xd0\\x4f\\x7f\\x12\\x2b\\x0d\\x4b\\xaf\\xf9\\xba\\xe4\\x9d\\x12\\xc4\\x78\\xfc\\x2f\\xcd\\xd6\\x09\\xde\\x42\\x6b\\x95\\x7b\\xae\\x5c\\x1b\\x1d\\x50\\xc1\\xd2\\xe7\\xac\\x28\\xf9\\x5b\\x70\\x09\\x3d\\x1e\\xf9\\x58\\x54\\x52\\xec\\x4d\\xd6\\x20\\x66\\x92\\xe8\\x75\\xe7\\x90\\xf1\\x53\\xb8\\x22\\x19\\x3f\\xcc\\xc1\\x83\\xe9\\xd0\\xf9\\xc0\\xf6\\xa8\\xac\\x87\\x52\\xed\\x1b\\xa7\\x5e\\x0c\\x0b\\x6b\\x93\\x2b\\xfc\\xe6\\x7e\\xbd\\xee\\x54\\x25\\x7e\\xa6\\xb5\\xfb\\x9f\\xb3\\x47\\x63\\x92\\x3a\\x55\\x06\\x2f\\x4c\\x06\\x7a\\x38\\xfc\\xa5\\xbe\\x61\\x70\\x3a\\x6d\\x88\\x95\\x26\\x15\\xe8\\x15\\xbd\\x76\\xb8\\x11\\x57\\xdb\\xfe\\xeb\\x69\\x35\\x03\\xf4\\x66\\xb1\\xc2\\xbd\\xf3\\x06\\xa0\\xad\\xe1\\xfb\\x58\\x84\\x53\\xae\\x58\\x4c\\xf9\\x32\\xe9\\xda\\x52\\xc5\\xf6\\x21\\x95\\x5b\\x63\\xd9\\x7e\\xf7\\x7e\\x85\\xcb\\x90\\x0e\\x52\\xbe\\x02\\x9e\\x15\\x15\\x4e\\xe5\\x02\\xad\\x6e\\x8b\\x5f\\x4f\\xd3\\x19\\x70\\xea\\x66\\x1e\\xb8\\xd2\\x95\\xb3\\x78\\xa9\\xba\\x1a\\x9d\\xb6\\x0a\\xd6\\x2a\\xf1\\x5e\\x4f\\xf9\\x0c\\x73\\x7f\\xb7\\x83\\x27\\xfa\\x4b\\x73\\x95\\x25\\x36\\x35\\x40\\x9b\\xe6\\xd0\\x6c\\xf3\\x82\\x3a\\x6c\\xfa\\xf3\\x1a\\xee\\x5f\\xb9\\x6f\\xde\\xba\\xea\\x0e\\xb9\\x0c\\x3a\\xd7\\xa2\\x5e\\xe5\\x4b\\x6d\\x75\\x57\\xdf\\xcb\\xfa\\x54\\x33\\x5c\\xc9\\xfa\\x54\\xee\\xfa\\xe8\\x61\\xf0\\x5b\\x1c\\x8f\\xdc\\x74\\xfd\\xed\\x3b\\xc1\\x29\\xfa\\xb4\\x66\\x71\\x52\\x33\\x97\\xd6\\x05\\x5d\\x25\\xf5\\x3c\\x86\\xc3\\xf7\\x5e\\x8a\\xb9\\xa6\\xc4\\xc1\\x48\\xed\\xb5\\x83\\xb1\\xa5\\xe0\\x55\\xdf\\xd7\\xdb\\xdd\\x11\\x35\\xdd\\x21\\x22\\xb4\\xb7\\x8f\\x41\\x02\\x9c\\x95\\xce\\x73\\x3c\\xf9\\xb9\\xa3\\xff\\xf4\\xb3\\xbc\\x7b\\x39\\x0f\\x3a\\xbb\\xa3\\xc7\\x71\\xe4\\x2b\\x84\\x83\\x9f\\x75\\x87\\xaa\\xe4\\x95\\xa5\\xa6\\xd4\\xde\\xeb\\xbf\\x06\\xb6\\xd5\\x2b\\xa4\\x28\\xf0\\x07\\x7f\\x02\\x7a\\xc7\\xf5\\x8d\\xc9\\x60\\x84\\x7f\\x09\\x1c\\x26\\x38\\x1e\\x03\\x35\\xbc\\xa6\\x8c\\x55\\x1b\\x7d\\xe0\\x2a\\xe8\\x85\\x11\\x32\\x24\\xfd\\xe0\\xb2\\x5d\\x81\\x90\\x2e\\x25\\x06\\xa7\\x52\\xf1\\xc3\\x85\\x8f\\x0f\\xe5\\xa1\\x45\\xff\\x99\\x14\\x39\\xdd\\xb9\\xc4\\xc0\\x9b\\x7b\\x45\\xb3\\x96\\x6e\\x53\\xcb\\xc6\\xc4\\x21\\x3c\\xf7\\xf1\\xa5\\x43\\xa8\\xae\\x6c\\x8b\\xb3\\xd6\\x47\\x2d\\x41\\xb1\\x0d\\x33\\xd7\\xbd\\x2a\\xbc\\xee\\x55\\xd1\\x30\\xb1\\xe6\\xe4\\x6e\\xa0\\xf7\\x9f\\x16\\xe0\\x9c\\x92\\x11\\x7f\\x75\\xe1\\xb0\\x15\\x2d\\xb4\\x39\\x29\\x0b\\x84\\x4b\\xf8\\x16\\xde\\x5c\\x23\\x3e\\xfe\\x60\\x00\\xef\\xca\\x9b\\x91\\x06\\x61\\xae\\x25\\xc1\\xbb\\xa8\\xc5\\x75\\x35\\xb3\\xa4\\x7a\\xe7\\x6d\\x5a\\x4f\\xa7\\x06\\x6d\\x4e\\x2a\\x54\\x56\\xb1\\xe6\\xa5\\x4d\\xa9\\xf7\\xbb\\x2e\\x43\\xaf\\xd0\\xe6\\x2c\\xe7\\xec\\x35\\xde\\x9c\\x54\\x5c\\x96\\xb5\\xee\\x64\\xf6\\xa5\\xa3\\x35\\x76\\x1e\\xd4\\xcc\\x9e\\x8f\\x7f\\xa5\\x77\\x5d\\x50\\x0f\\xfc\\x9a\\x6e\\xf7\\xf8\\x93\\xf8\\xf7\\x37\\xf1\\xef\\x0d\\x9d\\xce\\xb0\\x9a\\x56\\xbf\\xd0\\xed\\x67\\xad\\x0d\\x5a\\xfe\\xbc\\x31\\x4f\\x12\\x9f\\xb0\\xbc\\x00\\xbb\\x92\\x77\\x69\\xad\\x1d\\xbb\\xf2\\x04\\xab\\x2a\\xad\\xba\\x2c\\xb8\\x0a\\x07\\x7e\\x87\\x9a\\xc9\\xbf\\x04\\x56\\x86\\x5e\\x8a\\x8d\\xc3\\xca\\xe7\\x5a\\xbf\\x42\\x77\\xb3\\xe4\\xcc\\xa0\\x34\\x5c\\x0c\\x87\\x75\\x82\\x73\\x96\\x24\\xb7\\x2c\\xfc\\x62\\xa4\\x28\\xfc\\xbd\\x8f\\x39\\xe0\\x88\\x2c\\xe2\\xb2\\x32\\x20\\xdf\\x5a\\xb5\\x7e\\xe7\\x55\\xc3\\x21\\x98\\x4f\\x54\\x20\\xa4\\xb9\\x01\\x39\\xe9\\x4b\\xeb\\xdd\\xf7\\xf1\\x26\\xe0\\x69\\xb9\\x2e\\xb8\\x71\\x7f\\xa8\\x2a\\x0d\\x5e\\x76\\xea\\x15\\xb6\\x29\\x4e\\x51\\x84\\xd7\\xd8\\xa8\\x7c\\x9a\\xa6\\x33\\xca\\x71\\x0a\\xb5\\x72\\xe1\\x7a\\xf4\\xdc\\x7b\\xde\\x28\\x2c\\x5f\\xc1\\xc4\\xfd\\x12\\x74\\x5b\\x04\\xfa\\xd5\\xba\\x90\\xab\\xf6\\x85\\xe2\\x0a\\x0e\\xc0\\x22\\x3b\\x5c\\x74\\x81\\xd8\\x55\\x41\\xef\\xbc\\x85\\x43\\x2d\\x5b\\x71\\x92\\x9f\\xa6\\x99\\x57\\xf9\\xb0\\xa0\\x17\\x7a\\x79\\x2d\\xda\\x86\\xee\\x22\\xf6\\xa3\\xc7\\x9a\\x95\\xfe\\xe4\\x97\\xc0\\x45\\x0c\\x5e\\x21\\xd7\\x3f\\xdf\\x69\\xdf\\xf0\\x4b\\xd0\\xf6\\xde\\xf0\\x1a\\x76\\x3c\\xc1\\xc7\\x48\\xd5\\x09\\x50\\x36\\x29\\x69\\x2c\\x58\\x9c\\xb8\\x94\\xa8\\x4e\\x3c\\x52\\x74\\xea\\xc5\\xe0\\x0c\\x7e\\x38\\x1c\\x14\\x38\\x94\\x7d\\xe5\\xea\\x67\\x68\\xf5\\xda\\x5d\\x83\\x06\\x3d\\x5d\\x41\\xa7\\x87\\x3e\\x0e\\xf7\\xb8\\x56\\x3b\\x06\\x1b\\x26\\x91\\xe9\\x7d\\xa3\\xb6\\x68\\x29\\x4f\\x71\\x63\\x90\\x7e\\x51\\x3a\\x58\\x5e\\x81\\xa5\\xab\\xbc\\xde\\xcc\\xc1\\xc0\\xd1\\x5d\\x40\\x2d\\x72\\x5c\\x70\\x3d\\x08\\x3f\\x6f\\xde\\x46\\x86\\xb6\\xcd\\x3b\\xaf\\xf0\\xf1\\x2f\\xc1\\x81\\xec\\xe5\\xae\\xe8\\x0b\\xba\\x68\\xd1\\xad\\x83\\xe1\\xcf\\x6c\\x16\\xd3\\xab\\xe8\\xf9\\x21\\x95\\x20\\x1f\\x57\\xbb\\x1d\\x24\\xea\\xc8\\x24\\x3c\\xdf\\xc7\\x7f\\x03\\x2e\\x0d\\x57\\x5d\\x87\\x1d\\x72\\xc8\\xad\\x0a\\xbc\\xf3\\xb8\\x9a\\xa5\\xbc\\x35\\x4b\\xb9\\x31\\x4b\\x27\\x4d\\x3d\\x71\\x4a\\x3f\\x09\\xde\\x55\\xeb\\x0f\\xa6\\xc3\\xa1\\xd7\\x25\\x2e\\x5d\\x5f\\xe0\\x7a\\x94\\x5d\\xeb\\x89\\xf8\\x4e\\x3f\\x8b\\x4a\\x8a\\x93\\x7b\\xb7\\x92\\xfa\\xd3\\xd6\\x72\\x22\\x8e\\x04\\x5f\\x3b\\xe5\\x88\\x0a\\xd9\\x4b\\x0a\\x74\\x5f\\xe7\\x7a\\xc9\\x9f\\x54\\x20\\x15\\x04\\xbb\\x95\\x89\\x5f\\x29\\x57\\x49\\xf0\\xea\\x19\\x51\\xfe\\x1e\\xf7\\xb0\\x72\\x8e\\x61\\x3b\\x30\\x48\\xd0\\x4f\\x7f\\x6b\\xfa\\xe9\\x24\\x35\\x32\\xd6\\x9c\\xa6\\x23\\xcb\\x7e\\x4e\\x92\\x1b\\x34\\x2e\\xd2\\xd4\\x5d\\x20\\xca\\x06\\x46\\x70\\x8f\\x3b\\xd3\\xb6\\x2d\\x32\\x1a\\x0f\\xac\\x71\\xad\\x39\\x47\\x5d\\x78\\xed\\x6b\\x5c\\x8f\\x2e\\x98\\xc5\\x98\\x32\\xa6\\x2f\\x20\\x4d\\xb0\\x34\\xbe\\xac\\x42\\x1a\\xd5\\x30\\x3e\\x81\\x8f\\x1b\\x47\\xd8\\xe2\\x8c\\x31\\x81\\x6a\\xb8\\x16\\x98\\xaa\\x5e\\xde\\xaa\\x89\\x18\\xc0\\xe6\\x3b\\x5b\\x2e\\xd5\\x69\\xbb\\xf3\\xd2\\xe2\\x8d\\xf2\\xa1\\x3a\\x07\\x4d\\x30\\xe9\\x83\\x3b\\x9d\\x8e\\x66\\x34\\x0b\\xe6\\x20\\xef\\x11\\x83\\x8d\\xb5\\x69\\x3a\\x1d\\x8b\\x73\\xa4\\xd6\\x31\\x33\\x2c\\x44\\x70\\x4c\\xd3\\x69\\x71\\x7a\\x3a\\x9b\\xc4\\x13\\x99\\x75\\x59\\xf7\\x52\\xec\\x4f\\xca\\xb3\\x8a\\x52\\x5a\\x9e\\x31\\x1a\\x93\\xf3\\xc0\\x96\\x0c\\x79\\x25\\x06\\x6f\\x20\\x75\\x19\\xa2\\x42\\xa9\\x54\\x78\\x8b\\x8d\\x4a\\xf8\\x3e\\x71\\x85\\xe2\\x98\\xc6\\x60\\x5e\\xf3\\x31\\xbe\\x4d\\xe2\\x74\\xb1\\x8f\\xe7\\x1e\\x6b\\xcc\\xd0\\x6a\\x14\\x45\\xb6\\x37\\x5e\\xde\\x79\\x52\\xaa\\xe5\\xb0\\x7b\\x6f\\xaf\\x74\\xf1\\xdc\\x3b\\x72\\x83\\x4e\\x35\\x5b\\xae\\x4f\\x33\\xb7\\x81\\x2d\\x5f\\x00\\x47\\x66\\xaa\\x6a\\xb5\\xd3\\x43\\xeb\\x00\\x7a\\xeb\\x14\\x2e\\x64\\xda\\x5f\\xd9\\x3d\\xe9\\xe4\\xf6\\x94\\x05\\xd9\\xba\\x92\\xfc\\xdb\\x24\\xb3\\xcf\\xa6\\xae\\xcf\\x30\\xf3\\x95\\x54\\xbb\\x00\\xb1\\xf8\\x44\\x0b\\x3b\\x05\\x57\\x51\\x3e\\x7a\\x3c\\xc2\\xe5\\xe9\\xe3\\x91\\x8f\\x63\\x67\\xf0\\xe4\\x9d\\xf7\\x72\\x60\\xf5\\xc3\\xbe\\x13\\x82\\xdf\\xaa\\x59\\x67\\x2f\\x02\\xd2\\xd8\\xfd\\xed\\x85\\xf4\\x33\\xf6\\xf6\\x82\\x94\\x58\\x39\\x0c\\x23\\x6b\\xfd\\xf4\\x06\\xd0\\xa5\\x94\\x34\\x2a\\xc4\\xf9\\xba\\x58\\xf0\\xb7\\x17\\x24\\xdf\\x4f\\xbe\\x69\\xec\\xcc\\x2b\\xb0\\x6c\\x2c\\xbd\\x5f\\x30\\x32\\x74\\x82\\xf0\\xb6\\x8f\\xc1\\xe9\\x45\\x34\\x73\\x52\\x83\\x13\\x99\\xcb\\xf2\\xca\\xf4\\xcb\\x61\\xcc\\x9c\\x7b\\x75\\x1b\\x1e\\xa2\\x90\\xdf\\x39\\x0b\\x91\\x97\\x2f\\x8e\\xd1\\x6c\\x38\\xa8\\x44\\xe5\\x52\\x79\\x76\\x1d\\x83\\xc8\\x78\\xf4\\xf2\\x90\\x3a\\x44\\x73\\x08\\x22\\xe3\\xc7\\x63\\xec\\x3a\\x03\\x91\\xf1\\xe3\\x7e\\x97\\x16\\xce\\x8b\\x3e\\xf3\\x58\\x44\\xc6\\xcf\\xb4\\xee\\xd6\\xa1\\xf3\\x0f\\x19\\x4b\\x2c\\xe5\\xfe\\xe3\\x0f\\x19\\xff\\xf8\\xd4\\x6d\\x59\\x60\\x1d\\x7e\\xc8\\x58\\xe2\\x14\\x1f\\x38\\xfb\\x90\\xb1\\xc4\\x25\\x6e\\x6b\\x55\\x8d\\x1f\\xa2\\xc7\\x2d\\xa3\\x97\\x0a\\x3b\\x48\\x63\\x94\\x11\\x8e\\x9b\\x95\\x5d\\x8a\\x6a\\x25\\xa2\\x50\\x60\\x21\\x71\\x60\\x03\\xf2\\x8c\\xac\\x64\\x1e\\x95\\xff\\x68\\x8c\\x0d\\x54\\x0d\\xf9\\x75\\x8d\\xd4\\xa6\\x32\\xcb\\xd4\\xcb\\xbe\\x7d\\xb9\\xf9\\xb0\\xda\\x58\\xc8\\x1f\\x56\\x6d\\x64\\xaa\\xfe\\x6a\\x54\\xee\\x3a\\x28\\xaf\\xe5\\xc7\\xd7\\xc0\\x80\\x19\\xf9\\xde\\xf2\\xc5\\x86\\xe9\\x77\\x2e\\x5a\\x8f\\xaf\\x82\\x09\\x6a\\x72\\xb8\\x0e\\x55\\xef\\x38\\xb4\\xea\\x50\\x7a\\xa2\\x02\\xb5\\x5f\\xf2\\x50\\xeb\\xf5\\xb7\\xa0\\xfc\\xbc\\x25\\x5e\\xf9\\x78\\xed\\xf9\\x96\\x7d\\x70\\xf3\\x29\\x1d\\xe1\\x55\\xa3\\x43\\x2c\\x2f\\x1a\\xef\\xd5\\xcf\\x33\\xd5\\xe5\\xae\\xd6\\x49\\x15\\x43\\xa1\\xb2\\x44\\xb0\\x91\\x6b\\xe9\\xcd\\x59\\x02\\x10\\x53\\x7b\\x0e\\xbe\\xb3\\x62\\xe7\\x74\\x84\\x97\\xe2\\xac\\xbf\\x12\\xff\\xee\\xe8\\x16\\xf0\\xcf\\xc9\\x56\\x72\\xab\\xaa\\x6d\\x7d\\xc7\\x8d\\xc0\\x98\\xd3\\x3a\\xad\\x4a\\x32\\x51\\xb8\\x74\\x8a\\x59\\xd2\\xb1\\xb4\\x50\\x2e\\x0c\\x25\\x18\\xa6\\x0d\\x84\\x55\\xf8\\xe2\\x3c\\xd9\\x16\\x7f\\xc6\\xbe\\x66\\x60\\x8a\\x69\\x3c\\xc3\\x6b\\xda\\x46\\xbc\\x3b\\x8d\\x71\\x48\\xf3\\xb6\\x70\\xaf\\xc4\\x6b\\x59\\x11\\xdb\\xeb\\x22\\xc3\\x99\\xa4\\xa2\\xd0\\xc7\\xec\\xf4\\x54\\xb3\\x68\\xd9\\x1e\\x77\\x3c\\x0a\\xda\\xec\\xe1\\xe9\\xa9\\x62\\x36\\x07\\x23\\x50\\xd3\\x55\\x97\\x11\\xce\\x56\\x4e\\xa2\\x9a\\xdf\\xd7\\xbd\\x62\\xd8\\x08\\x1c\\xb2\\xcf\\x94\\xf9\\x99\\x1f\\x2b\\x07\\x36\\xe9\\xb4\\x98\\xe1\\x42\\x75\\x6b\\x69\\xb9\\xe9\\x14\\x3c\\x7b\\x45\\x07\\xe3\\x5a\\x47\\x78\\xfe\\xe8\\x11\\x9e\\x8b\\x83\\xd6\\xd9\\xda\\xf3\\x49\\xe9\\x49\\x1f\\x88\\x12\\xd9\\xb0\\x6f\\x44\\x75\\xfb\\x0a\\xdd\\x3e\\x55\\x13\\xeb\\x2b\\x95\\x18\\x17\\xae\\xd2\\x0a\\xb3\\xb4\\xcf\\xf7\\x14\\x27\\x8b\\x72\\xf7\\x1e\\xce\\x68\\x14\\xb4\\x0a\\xd6\\x22\\x02\\xb8\\xa1\\x70\\x53\\x56\\x86\\xb3\\xdd\\xae\\x68\\x30\\xb9\\x46\\xb8\\x54\\x04\\x06\\xf6\\xd2\\x19\\x68\\x1a\\xf4\\xd9\\x4b\\xaf\\x69\\x31\\x1c\\x16\\x53\\x36\\xc3\\x21\\xcd\\xa6\\x6c\\x36\\x59\\x53\\x4a\\x43\\xe5\\xb7\\xbd\\x39\\x70\\xad\\x71\\x89\\x63\\xc1\\xe2\\xca\\xdb\\x1d\\xf6\\xcd\\x5b\\x9b\\xd4\\x25\\xe2\\xac\\x00\\x5a\\xfa\\xc4\\x5b\\x0f\\x87\\xde\\xa1\\x2f\\x7a\\xc7\\x7c\\x8d\\x59\\xed\\x3f\\xbd\\x1d\\xf9\\x5a\\xdd\\xcf\\x87\\x98\\xe1\\x12\\xba\\xc6\\xc7\\xe5\\xe9\\xe9\\xbe\\x6e\\x6f\\xe1\\x0f\\x3a\\x53\\x89\\xf9\\xbb\\x5d\\x36\\x1c\\x3a\\x7a\\x61\\xb7\\xeb\\xad\\x05\\xf4\\x0a\\x33\\xdd\\x68\\x76\\x06\\xd5\\x72\\x4b\\x78\\xcc\\x6c\\xe0\\xba\\x59\\x9d\\x51\\xd4\\xaa\\xf9\\xaa\\xc7\\xbb\\xf7\\xea\\x66\\xef\\xbd\\x4a\\x41\\x69\\xa4\\x8d\\x80\\x69\\xa5\\x01\\xcd\\x7c\\xe5\\x3d\\xab\\x93\\xa3\\xbf\\x2d\\xba\\x9f\\x57\\x76\\x06\\x20\\x0a\\x71\\x55\\xc8\\xdf\\xb2\\x7b\\xca\\xf6\\xe1\\x5a\\xb9\\x6f\\x49\\x89\\x1d\\x5f\\xd7\\x87\\xa0\\xee\\x50\\x1f\\xd0\\x62\\xe8\\xac\\x88\\x15\\x8e\\xbb\\x2b\\x22\\xc7\\x0c\\x3e\\x9a\\x58\\x75\\xd4\\x20\\x4f\\x46\\x17\\xc1\\xb9\\x43\\xcc\\xe1\\x0e\\x31\\xb4\\xe5\\xbb\\x12\\x28\\xaa\\x99\\x1f\\xdc\\xc7\\xad\\xcc\\x41\\x4d\\xb3\\x4f\\xbd\\xa0\\xbd\\x1d\\x91\\x1f\\xc7\\xc7\\xab\\x14\\xbb\\x37\\x42\\x32\\x1e\\x3f\\xee\\xe3\\x81\\x81\\x13\\xbc\\xcf\\xe8\\xcd\\xb8\\x2a\\xff\\xc2\\x37\\x57\\x71\\x51\\xc0\\x1d\\x47\\x46\\x0b\\x6f\\x6b\\x63\\xae\\x01\\xbb\\x60\\x03\\xad\\x41\\x90\\x09\\xb3\\x06\\x01\\x16\\xc4\\x9a\\xe4\\x2b\\xba\\x57\\xcf\\x4d\\x61\\x64\\xfc\\x62\\x04\\x55\\x7d\\x80\\x57\\x42\\x29\\x25\\x71\\xa0\\x3d\\x70\\x0b\\x5c\\x56\\xbe\\x4d\\xb4\\x82\\x0d\\xd8\\x48\\xa5\\x34\\x37\\xc5\\x3d\\x60\\xd9\\x9d\\x0e\\x87\\x5e\\x0e\\xc0\\x93\\x34\\x04\\xb9\\x5d\\xfb\\x86\\x59\\xa5\\x5e\\x7b\\x89\\x8f\\x53\\xfe\\xf5\\x24\\x69\\xf0\\x99\\x94\\x2b\\x39\\x97\\xae\\x1d\\x80\\x05\\x09\\x2a\\xe9\\xb9\\x10\\x36\\x31\\x27\\x22\\xd3\\x66\\xad\\x6d\\x21\\xb6\\xee\\x5e\\x97\\x58\\x88\\x61\\x38\\xa7\\xdb\\x3d\\x8e\\xe4\\xf3\\x5c\\x5b\\xf5\\x3a\\xbd\\xab\\x59\\x53\\x12\\xcc\\xa5\\xfa\\x3c\\xab\\x59\\x29\\xa3\\x26\\x65\\xdb\\x2f\\x9a\\x95\\xae\\xf4\\x72\\x29\\xe1\\x6a\\x3b\\x60\\xb3\\x52\\x85\\x94\\xef\\xf7\\x78\\x09\\x50\\x75\\x7d\\xf8\\x09\\xa4\\x50\\xcb\\x98\\xbe\\xd3\\x68\\xce\\xd0\\x59\\x1d\\x23\\xbb\\xef\\x4d\\x56\\x88\\xea\\x13\\x86\\xe3\\xd2\\x6a\\x07\\x89\\x0d\\xe3\\xdc\\xb9\\xc3\\x50\\xc0\\x69\\x0b\\xd4\\xd5\\xf9\\x19\\x3f\\xc0\\x4a\\xc5\\x1c\\xa4\\x8c\\x6e\\xd5\\x9d\\x02\\x1c\\xb0\\x1d\\xaa\\x3a\\x12\\x09\\xaa\\x21\\xe4\\x41\\x43\\xc8\\xac\\xaa\\x58\\xb8\\xbc\\xe6\\xf3\\x9e\\xf8\\x88\\xab\\x78\\x7f\\x0f\\xfa\\x2a\\xb5\\xf0\\xb8\\xbc\\xe6\\xf3\\x9b\\xac\\x8b\\xd5\\xee\\x65\\x81\\x59\\x1b\\x4f\\xec\\xa1\\x69\\x53\\x8c\\x92\\x92\\xa8\\xf5\\xcd\\xca\\xed\\x4d\\x91\\xad\\x8e\\xcd\\xcf\\x05\\x59\\x52\\xf0\\x79\\x29\\xa6\\x17\\xa5\\x4e\\x50\\xa7\\xe1\\x30\\x6d\\x5a\\xe3\\xb5\\x14\\x74\\xd5\\x7a\\xe1\\x18\\x94\\x87\\x58\\x36\\x58\\x70\\xf5\\xa9\\xb2\\x60\\xd8\\x5a\\x4e\\x4b\\xa4\\x2b\\x95\\xac\\xe0\\x91\\x0e\\x28\\xb0\\x2d\\xe4\\xe9\\x74\\xc1\\xbd\\xc0\\xf8\\xe9\\xde\\x20\\xc0\\xad\\xe5\\x7e\\xc5\\x22\\x86\\x2c\\xb0\\x4a\\x16\\xd3\\xa3\\xdd\\x07\\xd0\\xe4\\xfb\\x94\\x89\\x95\\xce\\x95\\x4b\\x69\\x6a\\xfc\\x00\\x90\\xc6\\xce\\x4e\\x20\\x16\\x39\\xa5\\xaf\\x25\\x41\\xc7\\xd4\\x8b\\xd8\\x8e\\xce\\x8d\\x90\\x23\\x57\\xfa\\x07\\x20\\x90\\x71\\x03\\x8d\\xb9\\xf2\\x0c\\x6d\\x56\\xc1\\xde\\xd2\\x6c\\xb7\\x5b\\x28\\x47\\xcd\\x80\\xdc\\x22\\xc1\\x80\\xe8\\x9d\\x60\\x69\\xb5\\x94\\xfa\\x4c\\xac\\xc2\\x00\\xe9\\xe3\\xa1\\x6b\\xfe\\xf7\\x75\\x5c\\xf0\\xe8\\x04\\x9d\\xc6\\xa7\\xe8\\xe4\\x77\\xc0\\xbd\\xf9\\x1d\\x30\\x6e\\xd2\\xac\\x3a\\x29\\x73\\x1e\\xc6\\xf3\\x98\\x03\\x2e\\xd7\\xef\\x00\\x75\\xf3\\x7b\\x80\\x94\\xf5\\x85\\x5e\\xb5\\x3d\\x5d\\x85\\xbd\\x56\\xd0\\x6a\\x4c\\x26\\x07\\x8d\\xe6\\x66\\x0a\\xb2\\x73\\x59\\x9c\\x9d\\x66\\xd4\\xdd\\x5f\\xba\\x4d\\xac\\x79\\x9d\\x69\\x0a\\xf7\\x8e\\x91\\xc7\\xfc\\x01\\x00\\xfa\\xeb\\x26\\x66\\x33\\x5c\\xd2\\xb9\\xc7\\x9a\\x12\\x9b\\x76\\xbe\\x4d\\x01\\x47\\xaa\\x69\\x66\\x2a\\x9a\\x99\\xcd\\x4f\\xc4\\xea\\x21\\xde\\x4b\\xf1\\x5e\\xae\\xf3\\x3c\\x11\\xad\\xad\\x32\\xdd\\x15\\xf8\\x84\\x7f\\xcb\\xc1\\x73\\x50\\x83\\xd4\\xe6\\x5b\\x82\\xfd\\x5a\\x83\\xb6\\xa3\\x58\\x75\\x7f\\x23\\x06\\x36\\xac\\x56\\x8d\\xde\\xa4\\x5b\\x13\\xfd\\xf3\\x5a\\xa3\\x51\\xd6\\x44\\x73\\xf4\\xc9\\x74\\x4d\\x47\\x93\\xf5\\x2b\\xa6\\xef\\x13\\xd6\\x1a\\xcb\\x2b\\xa4\\xdc\\x63\\x78\\x2d\\xb9\\xc7\\x78\\xee\\x85\\x1d\\x70\\x28\\xcd\\x60\\x84\\xf7\\x77\\x4d\\xdc\\xd7\\x35\\xa2\\x3f\\x3c\\xd1\\x33\\x46\\xe6\\xdc\\xd7\\x5d\\x06\\x3d\\x12\\x53\\xae\\x90\\xeb\\x16\\x07\\xbb\\x85\\x19\\xdd\\x72\\xb8\\x1b\\x6a\\xa7\\x3f\\x12\\x8a\\x2f\\x3e\\x76\\x80\\xcb\\xbe\\x56\\x34\\x40\\xc2\\xa2\\x29\\x4a\\xd7\\x9d\\xb7\\xa0\\x84\\x99\\x58\\xf9\\xa7\\xf1\\xcc\\x37\\xca\\x51\\x52\\x7f\\x68\\xe7\\xba\\xe3\\x48\\xe5\\x30\\x19\\x94\\x36\\x19\\x80\\x41\\x8a\\x08\\x60\\xf7\\x77\\x40\\x96\\x42\\xdb\\xd1\\xe9\\xfa\\x14\\x19\\x2d\\xb7\\x5b\\xbb\\xbe\\x9f\\x9c\\x71\\x2c\\xa9\\xd5\\x80\\x47\\x1b\\x50\\x1a\\x6b\\xd9\\x8d\\x68\\xd6\\x43\\x9a\\xa0\\x29\\x39\\x3e\\x8a\\x92\\x65\\x81\\x16\\x29\\x4b\\x64\\x75\\xd1\\xd7\\xed\\xd3\\xee\\xda\\xff\\x27\\x50\\x75\\x78\\x3f\\x3d\\x8c\\x26\\xac\\x21\\x04\\x26\\xe6\\x56\\x8d\\xa4\\xe4\\x8d\\x30\\x9f\\xb2\\x99\\x5f\\x7f\\x66\\x12\\xc6\\xbe\\x59\\x12\\x8e\\x5e\\x0b\\x1c\\x3d\\xd6\\x3b\\xb8\\xc9\\xbf\\xf2\\xe0\\xfe\\x2e\\x8b\\xfb\\xbd\\x33\\xb6\\x35\\xe4\\x1e\\x9f\\xae\\x61\\x2d\\x0d\\x65\\x40\\x42\\x43\\x6b\\x54\\x93\\xda\\xf5\\xcd\\xfe\\xfe\\x51\\x04\\x55\\xc6\\xf2\\x6b\\x5c\\x85\\x4b\\xaf\\x81\\xf6\\x0b\\x59\\xc9\\x51\\xba\\x5e\\xdd\\x8a\\x73\\x24\\xbc\\x28\\xf0\\x3a\\xf9\\xb2\\x4e\\x23\\x3e\\x8f\\x53\\x1e\\x21\\xa2\\xb5\\x24\\x27\\x10\\x71\\x9b\\x65\\x09\\x67\\x69\\x1d\\xcc\\x65\\xb0\\xea\\x40\\xe2\\x42\\x55\\xac\\xcf\\x69\\xfc\\x8e\\x17\\x1b\\x2f\\x37\\xd0\\xb6\\x28\\xdf\\xed\\x96\\x0e\\x95\\x9c\\xba\\x4c\\x4e\\x57\\x87\\xd1\\x07\\x2b\\xd9\\x6f\\x62\\x9d\\xcd\\xc1\\xbb\\x9f\\xa1\\x82\\x59\\xe7\\xa2\\x80\\x84\\x49\\xad\\xe7\\xe9\\x54\\xe7\\xd4\\x9d\\xa3\\x47\\xbd\\xdd\\x90\\x33\\x04\\x9b\\x0b\\x22\\xd6\\x99\\xee\\x9a\\x2f\\x2e\\xbf\\xe5\\x67\\x75\\x0f\\xb4\\xb5\\x3e\\x65\\xde\\x91\\xd2\\x44\\x6e\\x50\\x16\\xa9\\x52\\x61\\x35\\xf3\\xba\\x60\\x55\\x8d\\xaf\\x2a\\x8e\\xff\\x68\\xd2\\x4e\\x21\\x4b\\xd3\\x69\\x0a\\xbe\\xe0\\xdf\\x72\\x64\\x03\\xb1\\x2f\\x9d\\xc0\\x51\\x2b\\x37\\x66\\xdc\\xdd\\x01\\xcc\\x38\\x0d\\x09\\xb7\\x71\\xbb\\xed\\x5f\\x50\\xf4\\xea\\x15\\x4b\\xb3\\x74\\xb3\\xca\\xd6\\xe5\\x4f\\x3f\\x21\\x7c\\x69\\x82\\x2d\\xd5\\xbd\\xc0\\x1b\\x7d\\x38\\x31\\x4a\\xdd\\xe1\\x86\\x41\\x53\\xd7\\xda\\x77\\xd3\\xe2\\xf0\\xac\\xcb\\xe4\\xac\\xab\\x1c\\xb3\\x2c\\x6d\\x2d\\xa1\\x27\\x66\\x17\\xf4\\x6e\\x80\\xdc\\xdf\\x7b\\x3e\\x3e\\x3f\\xa6\\xea\\xf9\\x3f\\xbb\\xae\\xef\\xb2\\x88\\xdf\\x53\\xd1\\x6b\\xba\\x05\\x2a\\x24\\x99\\xa7\\xc8\\xd1\\xc7\\x62\\x4e\\x8a\\x77\\x3d\\x37\\x7d\\xd0\\x2f\\x14\\x21\\xf3\\x66\\xb8\\xe4\\x5c\\x17\\x81\\x6a\\xd6\\xfb\\x58\\xd2\\xa2\\x08\\xca\\xb4\\x52\\xa8\\x5c\\x04\\x44\\x90\\x5a\\x0e\\x7c\\xcc\\xd2\\x8d\\xd3\\xb8\\x6a\\x13\\x54\\x4b\\x56\\x5d\\xc3\\x6b\\x09\\xf3\\xd9\\x87\\x1a\\x42\\xad\\xde\\xcf\\x09\\xc3\\x0a\\x5d\\x92\\x5c\\x62\\x4d\\xc1\\x60\\xa3\\x93\\x66\\x11\\x27\\xe7\\xaa\\xf4\\xf7\\x73\\xb2\\xc6\\x59\\x2a\\x62\\x4a\\xf9\\x2b\\x48\\x90\\x84\\xb8\\x5c\\xb2\\x9c\\x13\\xcb\\x34\\xe4\\xfa\\x1e\\x60\\x2d\\x37\\x96\\xdc\\x61\\xb8\\x38\\x9b\\xaa\\xc9\\xf8\\x99\\xbc\\x5b\\x7d\\x00\\xdc\\x9b\\x12\\x19\\x26\\x0a\\x9d\\xa4\\xbc\\xc9\\x3e\\xac\\x2b\\x3a\\x9d\\x99\\x16\\xf4\\x36\\xd4\\x10\\xbb\\x4f\\x9d\\x79\\xe2\\x12\\x10\\x79\\x85\\x09\\x02\\xa4\\x74\\x42\\x3f\\xac\\x6b\\x58\\x94\\xce\\xf1\\xd4\\x51\\x2d\\x75\\xd9\\xd8\\x48\\x55\\x09\\xc7\\xe2\\xd8\\xf7\\x67\\xbe\\x21\\x15\\x3c\\x49\\xcc\\x98\\x14\\x7c\\x07\\x36\\x79\\x5b\\x4e\\x3d\\xf5\\xd2\\xcb\\xe9\\x68\\xc2\\x5f\\xb9\\x4a\\x51\\xfc\\x00\\xd7\\xbc\\x76\\x45\\x1d\\xa9\\xa6\\x7c\\x36\\x61\\x81\\x51\\x88\\x57\\x05\\xa6\\xc4\\x3a\\x50\\x15\\x53\\x4f\\x50\\x31\\x5f\\x9a\\xc7\\xf3\\xaa\\x83\\x7c\\xe4\\xac\\x01\\x1d\\xed\\xf1\\x01\\xb4\\x24\\xc8\\xc9\\xf3\\xf7\\x7b\\x1f\\x67\\x36\\xea\\x51\\x61\\x6a\\x5f\\x14\\x07\\xc4\\x48\\x7d\\x90\\x32\\x3d\\x2a\\x19\\x82\\xb6\\x1e\\x3f\\xc0\\xfe\\xa6\\xae\\x68\\x9c\\xc6\\x55\\xcc\\x92\\xf8\\xbf\\x2d\\x7f\\xfc\\xbe\\x76\\x6b\\x90\\x46\\xbc\\xb8\\xc9\\x3e\\x56\\xac\\x8a\\x43\\xa9\\x52\\x41\\x07\\x63\\x1d\\xa9\\x15\\x56\\xae\\x39\\x8b\\x36\\x16\\x3e\\x8f\\x54\\xb7\\x95\\x1e\\x0f\\x9a\\x71\\x00\\x3d\\x0a\\x89\\xb5\\xa7\\xb5\\xfb\\x4d\\x5a\\xd6\\x6a\\xc8\\x5a\\xe5\\x9c\\xb9\\x48\\x3c\\xbe\\x57\\x63\\xbf\\xb4\\xd4\\xe4\\xf3\\x75\\x65\\xa2\\x4b\\x58\\xce\\x74\\x5b\\x35\\x6b\\x80\\x58\\x6c\\x97\\xe4\\x89\\x5b\\xac\\x0a\\xf8\\x87\\xba\\xf3\\x48\\x19\\xf4\\xa0\\x3c\\xe0\\x30\\xc9\\x4a\\x11\\xdf\\x46\\x5f\\xd8\\xe3\\xc8\\xca\\xa1\\x73\\x41\\x14\\x07\\x35\\xc8\\x54\\xa3\\x58\\x1b\\x07\\x0d\\x40\\x95\\x37\\x18\\x83\\x92\\xb6\\x2c\\xc1\\xba\\x2d\\x31\\x53\\x01\\x71\\xcf\\xfb\\xca\\x72\\x8d\\x65\\x4d\\xc0\\xed\\xac\\x7b\\x92\\xa7\\x59\\x15\\xcf\\x37\\xaf\\x93\\x44\\xd0\\x3c\\x5e\\x1e\\x2c\\xaa\\x4d\\x0f\\xf7\\x95\\xd5\\x49\\x6f\\xae\\x1e\\x50\\xde\\x8a\\x4e\\x97\\x38\\xc7\\x11\\x9e\\xc3\\x9d\\xfc\\x82\\x57\\xc6\\xf8\\x29\\x01\\xb2\\xcb\\x79\\xf0\\xaa\\x51\\xea\\x6a\\xda\\xe2\\x48\\xe7\\x6a\\x32\\x7c\\xda\\x26\\xa0\\xbe\\x6f\\xdb\\x4d\\xe8\\x5b\\x3b\\x1a\\xb8\\x2a\\x57\\x91\\xbe\\x7b\\xda\\x81\\x54\\x68\\x6d\\x7f\\xd9\\x2e\\xb0\\x6f\\x2a\\xca\\x0b\\xa7\\x49\\x62\\xed\\x00\\x61\\x00\\x5a\\x0d\\xf8\\xce\\xc7\\xec\\xfe\\xc5\\xcb\\x9e\\xb4\\xe4\\xe9\\xb3\\x07\\x83\\x64\\xdd\\xa7\\x64\\xd6\\x9a\\xc3\\x64\\x3c\\x6a\\xf4\\xb6\\x3a\\x53\\x98\\x8c\\xc7\\xa0\\x3f\\x65\\xfb\\x24\\x7f\\xfa\\x04\\xd6\\xc7\\x07\\xe8\\x35\\x89\\xc1\\xa8\\x65\\xdb\\xa5\\x44\\xb8\\x75\\xf9\\xa7\\xeb\\xc2\\xd9\\x5c\\xf3\\x39\\xac\\x5d\\x87\\xad\\x80\\xb6\\xf6\\x75\\x63\\xfb\\xba\\x32\\x6b\\x70\\x2e\\x5a\\xf7\\x92\\x32\\xb6\\x11\\x13\\x76\\x29\\xd8\\xf3\\xb5\\x5d\\x87\\x44\\xa6\\x66\\x5d\\xe5\\xeb\\x96\\xf4\\xb8\\x96\\x9e\\x97\\x1e\\x07\\x7f\\x14\\x76\\x13\\x31\\xef\\x2a\\x64\\x83\\xa8\\x3f\\xe4\\x16\\x20\\x53\\xab\\x0d\\x4c\\x8b\\xe7\\x3a\\x39\\x82\\x5e\\x82\\x38\\x12\\x4b\\x9f\\x07\\xb4\\x86\\x2e\\xd7\\x47\\xe4\\x2c\\xb0\\xd5\\xd6\\xe6\\xa5\\x17\\xe3\\xca\\x9f\\x94\\xc3\\x61\\xab\\xb6\\xb1\\x0f\\xee\\x4d\\xec\\x9a\\x78\\xb2\\x78\\x5c\\x0e\\x87\\x47\\x74\\xd0\\x7e\\x8f\\x95\\x81\\x99\\x2c\\xee\\xed\\xfc\\x1d\\x0f\\x79\\x59\\x32\\x0b\\x57\\x59\\xda\\x38\\xf7\\x25\\x84\\x6b\\x07\\xbf\\x8b\\x25\\x7a\\xbf\\xe2\\xa3\\x20\\x17\\x32\\x7e\\xfc\\x18\\x08\\xf4\\x21\\x18\\xa3\\x2a\\xda\\x71\\x89\\x79\\xc6\\xbd\\xca\\x75\\x51\\xe2\\x13\\x98\\xcf\\xed\\xab\\x1e\\xaf\\xc2\\xdc\\x02\\xae\\xc8\\xee\\xc9\\x1c\\x36\\x77\\xc2\\x82\\xbe\\xbb\\x1e\\x9d\\xe1\\x5d\\xe3\\x07\\x1f\\x9a\\xaa\\xcd\\xe6\\x62\\xba\\xdd\\x4f\\x62\\x63\\x7a\\x39\\x1d\\xd9\\x80\\x7f\\x18\\xe5\\xc4\\x55\\x42\\x0d\\x61\\x8e\\x6b\\x42\\xd9\\xe3\\xb8\\x43\\x23\\xad\\x6c\\x6a\\x74\\x8e\\xda\\xcb\\x83\\x76\\x4d\\xb3\\xdb\\x41\\xe6\\x10\\x52\\xf0\\xb9\\xc8\\xab\\x21\\xaa\\x63\\x2a\\x93\\xb5\\x2b\\xd3\\x0c\\x7c\\x6c\\x0c\\xbc\\xd2\\x8b\\x1d\\x8f\\x81\\xf5\\x7f\\x7c\\x1c\\x24\\x9f\\xba\\xe7\\x39\\x77\\xe0\\x4b\\xb4\\xa6\\xad\\x0b\\x82\\x02\\xae\\x46\\xb3\\x2e\\x8c\\x45\\xa3\\xb2\\xd7\\xdc\\x28\\x15\\xae\\x4b\\xa2\\xc7\\xf7\\x5d\\x56\\xda\\xb7\\x2b\\xb9\\xc7\\xfa\\x0c\\x9f\\x2a\\x43\\xf3\\x2b\\x76\\xd9\\xb0\\xd4\\x77\\x2c\\x16\\x4b\\x28\\x78\\x9a\\xaa\\x36\\xf9\\x6c\\x31\\x45\\x05\\x4d\\x0c\\x63\\xae\\xa2\\xbd\\x38\\xa6\\xb8\\xc2\\xa1\\xe1\\xda\\xd0\\x61\\x88\\xef\\x65\\xfe\\x5e\\x66\\x50\\xeb\\x64\\x19\\x9b\\xa7\\x89\\x0b\\x9b\\xfd\\x93\\xda\\x37\\xea\\x69\\x9f\\x96\\xbc\\xe9\\x06\\xba\\x1b\\x77\\xb8\\xf2\\xed\\x29\\xd7\\x88\\x69\\xe2\\x83\\xa6\\xa5\\xe5\\x21\\x03\\x52\\x93\\x67\\xfe\\xc8\\x8b\\x3b\\x5e\\x48\\xab\\x0e\\xc1\\x14\\x58\\x8c\\x72\\xe8\\xb2\\x06\\x4d\\xee\\xb7\\xe7\\xcc\\x3b\\x77\\xdf\\x06\\x61\\x6e\\x9b\\x43\\x08\\x48\\x10\\x0a\\xec\\x3a\\x95\\x90\\x6c\\x7f\\x24\\x38\\xb6\\x1b\\x8b\\xf3\\x80\\xb6\\xf8\\x81\\x26\\x93\\xf1\\xe3\\x67\\x7d\\x8a\\xde\\x0f\\xd5\\xe0\\x86\\xc9\\xf7\\x30\\xb8\\xbd\\xef\\x3e\\xc2\\x71\\x37\\x2b\\xc9\\x8e\\x3c\\xc1\\xc5\\x7d\\x27\\x38\\xa7\\x34\\xa2\\x7d\\xac\\x8b\\x0f\\x1f\\xc1\\x4a\\xd7\\x11\\xac\\xd7\\x07\\xa4\\x53\\x80\\x98\\xfc\\x91\\xb3\\x4e\\xb8\\x6f\\x9d\\xec\\x1e\\x7a\\x80\\x09\\xc5\\xc1\\x6e\\x9a\\xe3\\x64\\x26\\x0e\\x5d\\x47\\x9f\\x46\\xa2\\x7f\\xb5\\xd3\\x08\\xfb\\xee\\xd3\\x48\\xfc\\x87\\x4e\\x23\\x6b\\xeb\\x34\\x52\\xaa\\xd3\\xc8\\xfc\\x28\\x51\\xca\\x1f\\x3f\\x8d\\x1c\\x7d\\xa2\\xe8\\x97\\xf1\\x3d\\x7e\\x18\\x68\\x1b\\x1f\\x50\\xca\\x82\\x5e\\xa0\\x9b\\xe1\\x30\\xd4\\xec\\xaa\\x64\\x75\\x2c\\x8d\\x30\\x05\\xe8\\x96\\xab\\x6b\\x8f\\xb8\\xf6\\x63\\xa5\\x2c\\xaa\\xd7\\x0a\\x58\\xa3\\x3e\\x30\\x9c\\xa5\\xd4\\x2a\\xae\\x0b\\x9c\\x23\\x91\\x35\\x52\\x52\\xdf\\xa6\\x99\\x1b\\xca\\xaf\\xf1\\x9c\\x9f\\x6f\\xc2\\xa4\\x3d\\x91\\x5b\\xc8\\x08\\xdf\\xe9\\x63\\xa2\\x85\\x2e\\xd0\\x2b\\x78\\xe9\\xa8\\x4a\\x45\\x5d\\xd7\\x2f\\x2d\\xdb\\xf6\\x16\\x2b\\x9f\\x3b\\x9d\\x3d\\xe9\\x5e\\xcb\\xd4\\xa5\\xca\\x20\\xdd\\xed\\x5a\\xfd\\xd5\\x1e\\x1e\\xeb\\x52\\x3a\\x0d\\x3e\\xe7\\x3c\\x8d\\xe2\\x74\\xa1\\x8b\\x2d\\xcf\\x1c\\x61\\xda\\xd0\\x85\\x38\\xe2\\xe8\\xb4\\x9a\\xe1\\xc2\\x4b\\xfd\\x3d\\xee\\xb1\\xce\\x3f\\xae\\x25\\xe2\\x1c\\xd7\\xa9\\x8b\\x23\\xac\\xae\\x8b\\x23\\x4e\\xd5\\x85\\x37\\x75\\x79\\x93\\x15\\xa1\\x22\\x43\\xb7\\x81\\x33\\x46\\xf3\\x26\\x09\\x92\\x6e\\x9c\\xab\\x3a\\x67\\xe3\\x73\\x3a\\x18\\xe1\\xc2\\xab\\xfc\\x26\\x6f\\xe5\\xda\\x52\\x6c\\x54\\x6d\\xd5\\xd9\\x7a\\x54\\xb0\\xf6\\x55\\x0b\\xa9\\x90\\x3f\\x49\\xc1\\xf6\\x52\\xe7\\x0f\\xa1\\x72\\x31\\x11\\x55\\x6f\\x22\\xcc\\xbc\\x65\\xc9\\xa9\\x51\\xf2\\x47\\x5e\\xdd\\x53\\x6a\\xa9\\x52\\x20\\x79\\xc5\\xe8\\x6f\\x9d\\x85\\xee\\x76\\x3d\\x75\\x99\\xf9\\xbe\\xee\\x67\\x39\\xb6\\x66\\xd1\\xca\\xe7\\xd0\\x81\\xa2\\x21\\x45\\x5d\\x74\\x2e\\x0a\\x69\\x10\\x58\\x7c\\x65\\x8c\\xd9\\x94\\xac\\x26\\xdc\\x6e\\x97\\xb6\\x0f\\xde\\x38\\xa6\\x89\\xb7\\xdd\\x63\\xa6\\x9c\\x44\\x55\\xfe\\xa4\\xf3\\x19\\x75\\x3b\\x1b\\xf5\\x98\\x38\\x6b\\xdb\\x95\\x37\\xe3\\xef\\x1d\\xb1\\x7f\\x58\\x23\\x1e\\x52\\xe5\\x4e\\x7f\\xb7\\xb0\\x30\\xba\\x20\\x66\\xad\\x9c\\x2b\\x49\\xff\\xd6\\xd9\\x3e\\xba\\xd7\\xb5\\xe6\\x43\\xcc\\x22\\x7b\\x2d\\x18\\x9b\\xa5\\x96\\x8c\\x47\\x2f\\x7a\\x2d\\x0f\\xef\\xf5\\x30\\x34\\x7e\\x7c\\x9f\\xee\\x9e\\x25\\xf7\\xba\\xf3\\x0e\\x80\\xea\\x0c\\x87\\xe7\\xd6\\xe6\\x73\\x1c\\x0f\\x1a\\xc5\\x85\\x61\\xdc\\x59\\xfe\\x2a\\xaf\\x50\\x1a\\x7f\\x11\\xa1\\xb9\\x6b\\x4b\\x3f\\x29\\x9a\\xbb\\xd4\\x5c\\x46\\xb7\\x2a\\xc7\\xe2\\x07\\xb5\\x6c\\xf3\\x00\\x39\\x08\\x9c\\xc2\\xf8\\xf8\\xbc\\x8d\\xf5\\xd1\\xc4\\xf7\\xe1\\x96\\x6a\\x85\\xfd\\xf7\\x45\\xc4\\x8b\\x47\\x95\\xf9\\xe6\\x74\\xba\\xce\\xdd\\x8d\\x9f\\xdc\\x79\\x15\\xa5\\x74\\x53\\x83\\x9c\\x6d\\xa4\\x7b\\xf7\\xb8\\xd1\\x3f\\x90\\xae\\x22\\x2b\\xd3\\x47\\xe4\\x66\\x9a\\xce\\xe0\\xd8\\xdb\\x59\\xa9\\x01\\x5b\\xc4\\xb1\\x80\\x4b\\x95\\xee\\x7e\\xb1\\x55\\x21\\xa5\\x67\\x9d\\x0e\\xf4\\x71\\xe6\\xdb\\xba\\x38\\x99\\xa9\\x8b\\xc3\\xed\\x21\\xab\\xc5\\x69\\xd9\\x94\\xcd\\xb0\\xd3\\xef\\xa0\\x79\\xb0\\x5e\\x2b\\x05\\x7c\\x31\\x04\\x83\\xf3\\x20\\x2e\\x7f\\x16\\xa3\\x10\\xa7\\x0b\\x35\\x0c\\xbe\\x89\\x43\\xd8\\x19\\xa3\\x35\\xe6\\xfe\\x64\\x23\\x97\\x53\\xee\\x80\\x5b\\xf5\\x5c\\x39\\xe2\\x45\\x5d\\x47\\x40\\xbf\\xb9\\xa4\\x03\\x69\\x4f\\x98\\xb8\\xcf\\x28\\xb9\\xeb\\x3c\\x13\\x1d\\x05\\x05\\x25\\x21\\x96\\x6c\\xbc\\x7d\\xcb\\x88\\x70\\xe9\\x3a\\xe0\\xac\\xdc\\xac\\xce\\x5d\\x97\\xd5\\xd9\\x74\\x58\\x9d\\xe9\\xcc\\xc7\\x8b\\xd6\\xb4\\xb9\\xa4\\x83\\x31\\x3e\\x97\\xe3\\x7f\\x7d\\xf0\\x38\\xe3\\x9e\\x9c\\x9a\\x32\\xfb\\x6e\\x65\\x9c\\x5f\\x0d\\x1a\\x8a\\x3e\\xf3\\x36\\x41\\x99\\x27\\x71\\xc8\\xbd\\xd1\\x81\\x45\\xc0\\xc7\\x5f\\x3d\\xdf\\x27\\x1b\\xc3\\x51\\x0c\\xbe\\x3d\\x58\\x5d\\x9b\\xf0\\xee\\xb9\\x3b\\xb2\\x13\\xdb\\xb7\\x54\\xdf\\xe8\\xf4\\x1a\\xdf\\xce\\x26\\x2b\\xcb\\x07\\xce\\x52\\x1d\\x37\\x8e\\x3f\\xb7\\x7d\\x3b\\x78\\x13\\x7c\\x60\\xe9\\x4b\\xec\\x53\\x92\\x55\\x57\\xdf\\xb5\\x30\\x4a\\x13\\x9a\\x23\\x10\\xcf\\x7a\\xd7\\xcc\\x43\\xcb\\xa9\\xb4\\x25\\x53\\x2b\\x45\\x9f\\x46\\xba\\xea\\x1e\\xbd\\xa0\\x48\\x84\\x9f\\xe6\\x72\\xc4\\x95\\xb1\\x4e\\xdb\\x9f\\x42\\x59\\x2b\\xee\\xf7\\x3e\\xce\\x5b\\x3e\\x82\\x24\\x5f\\xf0\\x95\\xb6\\x94\\x04\\x26\\x9a\\x60\\x76\\xbb\\x4b\\x89\\x35\\x52\\xaf\\xa4\\xea\\xee\\x34\\xb3\\x20\\xe4\\x6a\\xc1\\xbd\\x57\\x2a\\x08\\x39\\x71\\x9a\\xd4\\xdd\\xc5\\xfd\\x7d\\x3c\\xf7\\x2e\\xfd\\xad\\x98\\x34\\xca\\xdc\\x67\\x31\\x69\\xcf\\xa8\\xca\\xa4\\x1f\\x73\\xf0\\xfc\\xfd\\x7e\\x3f\\xf9\\x4a\\x23\\x8d\\xe9\\xe0\\x21\\x6b\\x9f\\xc6\\x68\\x9e\\xac\\xcb\\xe5\\xcf\\xd6\\x2a\\x86\\xf0\\x57\\xd9\\xb4\\xcf\\x5a\\xde\\xeb\\x1a\\x50\\x9b\\xc5\\xf6\\xf8\\x41\\xbc\\xbb\\xc6\\xc4\\x46\\x2f\\x7e\\x1f\\xab\\x82\\x55\\x7c\\xb1\\xe9\\x66\\x73\\xe7\\x36\\x7e\\xb2\\x57\\x5a\\x48\\xa6\\x35\\x7f\\x8c\\x54\\x8e\\xd5\\xf5\\x1c\\xc4\\xce\\x57\\x74\\xdb\\x5b\\x3b\\x29\\x7b\\xb6\\x0b\\x20\\x0c\\x5b\\x07\\x5b\\xb2\\xc6\\x8e\\xae\\x22\\x5f\\x0d\\x91\\xf5\\x67\\xcc\\x4a\\x96\\x93\\xd0\\xe1\\x21\\xf2\\x8f\\x1f\\xfd\\x7b\\xd9\\xb6\\xa3\\xf0\\x22\\x5c\\xf2\\x81\\x23\\x78\\xb3\\xe3\\x70\\x70\\x9d\\x1e\\x6c\\x0c\\x5f\\x2b\\xc1\\xd5\\xa7\\x8f\\x37\\x9f\\x3f\\x7d\\xbc\\x6c\\x80\\xea\\x30\\xa3\\x5b\\x95\\x3c\\xe6\\x25\\xd9\\x86\\x49\\x9c\\x7f\\x60\\xd5\\x92\\x64\\x38\\xfc\\x26\\xfe\\x6d\\x48\\x86\\x23\\xf1\\x27\\xde\\x22\\xf1\\x36\\x8f\\x93\\x44\\xfd\\xbc\\xcf\\x59\\x18\\x57\\x10\\x98\\xa5\\xd5\\x1b\\xb6\\x8a\\x13\\xfd\\xf2\\x51\\x2c\\xcb\\x19\\x9e\\x8b\\xcf\\xe6\\x22\\x70\\x51\\xb0\\x28\\xe6\\xa9\\x5c\\x2f\\x61\\xf5\\x68\\xc2\\x3e\\xa5\\x71\\x55\\x92\\x0c\\x60\\x05\\x78\\x71\\x99\\x46\\xf5\\xf3\\x55\\xdc\\x3c\\x03\\x48\\x3f\\xc9\\x70\\x06\\x38\\xfb\\xe2\\xa1\\x2e\\x3e\\x67\\x95\\x60\\xd5\\x95\\x49\\xa8\\xce\\x4e\\x85\\xd6\\xaf\\x59\\x9c\\xca\\x07\\xe5\\x76\\xfc\\x75\\x99\\x8b\\x39\\xc5\\xaa\\x38\\x23\\x19\\x2e\\xc4\\x9f\\xa8\\x6e\\x21\\x72\\x2c\\xf3\\x82\\xb3\\x48\\x1a\\xe5\\x88\\xd7\\x2a\\xcb\\xcf\\xb3\\x24\\x2b\\xd4\\x73\\xd3\\xf2\\xb2\\x2a\\xb2\\x2f\\xbc\\x7e\\xb8\\x60\\xe5\\x52\\x69\\xc8\\xa9\\x90\\x5f\\xe3\\x94\\x87\\x2c\\xaf\\xdf\\xdb\\x9f\\xfe\\x16\\x47\\xd0\\xdf\\x15\\xff\\x56\\xbd\\x4e\\xc3\\x25\\x94\\x51\\x19\\xbd\\x74\\xc7\\x8b\\x52\\x90\\x75\\x86\\xef\\x62\\xfe\\xf5\\xe7\\x4c\\xd4\\xf1\\xdb\\x58\\xfc\\x7b\\x2c\\xfe\\x91\\x0c\\x6f\\xc4\\xdb\\x46\\xbc\\x6d\\x48\\xb6\\xc7\\x17\\xef\\xaf\\x6a\\x40\\x1c\\x50\\x37\\x33\\xc6\\x15\\x89\\xa7\\x47\\x39\\xab\\x96\\xc8\\x1a\\x42\\x24\\x5e\\x1e\\xa9\\x1e\\x45\\xe6\\x78\\x22\\xf1\\xfc\\x68\\x0e\\x2f\\xa8\\x19\\x5b\\x19\\x5c\\xc6\\xff\\xcd\\x91\\x63\\x6c\\x51\\x27\\x08\\xb5\\x46\\x1b\\x59\\xaf\\xc8\\x18\\x7b\\x24\\x1f\\x1f\\xf1\\x34\\x42\\x06\\x19\\xe8\\xe0\\x55\\x5c\\x07\\x4b\\x8a\\xd0\\x11\\xe0\\x9a\\x02\\x39\\x69\\x01\\x39\\x02\\x91\\x4d\\x1f\\xc8\\x7c\\x43\\x4e\\x1a\\x41\\x8e\\x40\\x64\\x53\\x0a\\x32\\xdf\\x90\\x41\\x36\\x48\\x3c\\x3e\\x0a\\xc5\\x33\\xb2\\x28\\x48\\x46\\xd4\\x1d\\xdf\\xa6\\x22\\x24\\x03\\x1e\\x45\\x3a\\x04\\xb5\\xc8\\x4a\\x27\\x48\\xe4\\x3b\\x6a\\x51\\x99\\x8e\\x6e\\x15\\x20\\x89\\x4e\\x47\\x7e\\x15\\x6f\\xc8\\xa4\\x40\\xf0\\x69\\xf3\\x88\\xc1\\x0b\\xaa\\xe9\\x0e\\xa9\\x07\\xe4\\xf2\\x88\\xd9\\x82\\x07\\x82\\x75\\xeb\\x61\\x6e\\x6b\\x7b\\x1c\\xb9\\x0c\\x87\\xe5\\x21\\x4f\\x36\\xea\\x20\\xf0\\x10\\x5f\\x2f\\xf1\\x5c\\x39\\x9b\\xb3\\xd4\\xb1\\xf4\\x69\\xcc\\x11\\xd5\\x78\\xdc\\x91\\x5d\\x02\\xe8\\x28\\x55\\xd0\\xbc\\x60\\xf9\\x28\\x5d\\x80\\xd4\\x31\\xf2\\x15\\xd7\\xae\\x3c\\x48\\x15\\xd4\\xcf\\x32\\xb4\\xfe\\xc0\\x78\\xdb\\xef\\x9d\\xae\\x4e\\x8e\\x76\\x38\\xa3\\x6a\\x6a\\x79\\x9d\\x21\\x1d\\x2f\\x34\\x58\\x1a\\xd4\\x05\\xe2\\x07\\x57\\x59\\x4e\\xd2\\x00\\x9c\\xc5\\x01\\x4f\\x95\\xe3\\x84\\xcf\\x2b\\x23\\xe8\\x57\\x3e\\xaf\\xf6\\xed\\x6b\\xcf\\x78\\xee\\x2d\\xb4\\x72\\xc6\\x6a\\xb7\\x5b\\x0d\\x28\\x0d\\x3d\\xbf\\x63\\x80\\x53\\xd1\\xc2\\x5b\\x49\\x49\\xe9\\x66\\xb7\\x1b\\x44\\xde\\x06\\x9c\\x3a\\x6c\\x68\\x65\\x8a\\x9f\\x15\\x0b\\xb5\\x54\\xcd\\xc2\\x77\\x86\\x0b\\xea\\x54\\xba\\xa0\\x56\\xc4\\x81\\x70\\x1a\\x54\\xe0\\xeb\\x8e\\xae\\x70\\x1c\\xb0\\x30\\x5c\\xaf\\xd6\\x09\\xab\\x6a\\xcf\\x01\\x17\\xca\\x69\\x20\\x78\\x16\\xc2\\xa9\\x75\\xe1\\x09\\x0a\\x44\\xe7\\x99\\xbc\\x76\\x33\\x54\\x05\\xa5\\xef\\xae\\x22\\xcb\\xd9\\x82\\x55\\x59\\xd1\\xbe\\xee\\xec\\x53\\x11\\xfc\\xb8\\x49\\xab\\x25\\xaf\\xe2\\x10\\xbe\\x6f\\x64\\xd4\\x0e\\x7f\\x53\\xfa\\x8a\\x13\\xcc\\x87\\x21\\xbf\\x26\\x2e\\xaf\\x6d\\x22\\xdf\\x1b\\xde\\xd9\\xca\\x25\\x4b\\x92\\xec\\xeb\\xe5\\xdf\\xd7\\x2c\\x01\\x5c\\x19\\x66\\x79\\xd8\\x2c\\xf1\\x92\\x6e\\x65\\x97\\x90\\x6d\\x2e\\x1a\\x1e\\x5d\\x03\\xc0\\x64\\xd1\\x28\\x1a\\x93\\xed\\xad\\x74\\x2b\\x49\\x72\\x6f\\x9b\\xa5\\xb2\\x05\\xca\\x8c\\x12\\x2b\\xef\\x8e\\x56\\x9c\\x72\\x11\\xa9\\xb1\\x7a\\x70\\xc4\\x73\\x9e\\x46\\x3c\\x0d\\x05\\x7b\\x30\\x9d\\x8b\\x0a\\xfc\\x9c\\xac\\x0b\\x0c\\x4f\\xca\\x2c\\xf3\\x8a\\xa7\\x6b\\x19\\xf0\\x46\\x50\\xb1\\x7c\\xfc\\x33\\xdf\\x5c\\x64\\x5f\\x53\\xf9\\x72\\x95\\xad\\x4b\\xde\\x7a\\xfd\\x94\\xcb\\x97\\x66\\x5e\\x2f\\x05\\x01\\xcf\\x40\\x57\\x0f\\x18\\xc1\\x3b\\xf9\\xa3\\xee\\x8b\\x16\\xe2\\xb0\\x7a\\x49\\xb7\\x1c\\x7c\\x1d\\x8a\\xf6\\x93\\x25\\xb6\\x3c\\xf6\\x3a\\x20\\x70\\x95\\xe1\\x89\\xb2\\x38\\x39\\x69\\x2a\\x49\\xbc\\x44\\x3a\\x86\\xd5\\x2e\\xb9\\xaa\\x8e\\x4b\\xae\\xe1\\xd0\\x5b\\xd1\\x4a\\xd4\\x42\\x55\\xc1\\x9f\\x48\\x87\\x22\\x4d\\x56\\xa2\\x2b\\x88\\xab\\xb6\\x9d\\x94\\x75\\x0f\\x90\\x05\\x1d\\x8c\\x3a\\xd1\\x46\\x4f\\x92\\xd6\\x47\\x9f\\x72\\x65\\x38\\x72\\x02\\x3d\\x90\\x79\\x85\\x6f\\x7c\\xd8\\xea\\x3d\\xe3\\x63\\x35\\x00\\x76\\x48\\x93\\x99\\xc8\\xc7\\xb6\\x00\\xbe\\x34\\x9c\\x5d\\x36\\x33\\x84\\x3c\\x7b\\x8a\\x5d\\xf3\\x83\\x3c\\x7b\\x79\\x9f\\xf2\\x5d\\x6b\\x72\\x90\\xf1\\x93\\x67\\xbd\\x7e\\x8c\\xb0\\x7b\\x6a\\x90\\xf1\\x8f\\x20\\xd4\\x94\\x33\\x83\\x8c\\x5f\\x8c\\x71\\x7b\\x62\\x90\\xf1\\x4b\\x50\\x6c\\x7e\\x72\\x9c\\xc7\\x6a\\x00\\x8d\\xc9\\xb3\\xaf\\xde\\x63\\xfc\\xec\\x89\\xdf\\xab\\x05\\xd3\\x3d\\xc2\\xc3\\x87\\x21\\x8f\\x13\\x0f\\x9e\\x0a\\x96\\x46\\xd9\\xca\\xf3\\xff\\xad\\xe8\\xda\\x92\\x43\\x75\\xee\\xd3\\x23\\x34\\x78\\xf6\\xce\\xa2\\xd4\\x75\\x3c\\xf9\\xa9\\x8a\\x13\\xe3\\xba\\xdc\\xb1\\x5c\\xc5\\xad\\x15\\xe9\\x3c\\x89\\xf3\\xdb\\x8c\\x15\\x91\\x5e\\x9a\\xca\\x9e\\x25\\xab\\xbd\\x94\\xc1\\xfc\\x68\\xad\\x67\\x75\\xe4\\x9f\\xf9\\xc6\\xca\\x34\\x69\\xc5\\x03\\xc9\\xea\\xc8\\xbc\\x15\\x79\\x51\\xb0\\x85\\x8e\\x8b\\x5a\\x71\\x37\\xd9\\x5a\\xb9\\x79\\x6d\\xdc\\x50\\xd6\\x91\\x9f\\xde\\xea\\x98\\x65\\x2b\\xe6\\xb7\\x25\\xe7\\x89\\x8e\\x5c\\xd9\\x5e\\x8e\\xcf\\x97\\xac\\x38\\x97\\xb8\\xe2\\x4e\\x11\\x99\\xb5\\xe6\\x2e\\x3a\\x12\\xb3\\xc2\\x5e\\x6d\\x7d\\xb1\\xf8\\xdc\\x8a\\x09\\x7f\\xff\\x62\\xbb\\x11\\x0b\\x2a\\x2c\\x0e\\x83\\x91\\xb9\\xd0\\xd6\\xe1\\x7a\\x99\\x15\\xd1\\xfb\\x3d\\x0e\\x93\\x38\\xfc\\x72\\x6c\\xbe\\xe7\\x90\\xd8\\x91\\x31\\x44\\xb4\\x73\\x36\\x16\\x96\\x63\\xf3\\x37\\x3e\\x71\\x95\\xd2\\x44\\x77\\xca\\xca\\x37\\xc7\\x17\\x92\\x6f\\xdc\\xb9\\xe7\\x9b\\x76\\xb6\\xeb\\x63\\xf6\\x37\\xf9\\xf5\\xba\\x72\\x66\\xba\\xae\\x5a\\x79\\x46\\xd9\\xfa\\x36\\xe1\\xe7\\x0f\\xe9\\xf6\\x0b\\xe3\\x13\\x47\\x19\\x46\\x74\\xbb\\xac\\x82\\x2d\\x8e\\x2e\\x44\\xa4\\x75\\xe5\\x5e\\xb0\\x85\\x23\\x5b\\x71\\x5c\\x7a\\x40\\xce\\x22\\x79\\x4f\\xe6\\x97\\x69\\xe4\\xcc\\xbf\\xe2\\x47\\xd3\\xfb\\x45\\xfd\\x41\\x6f\\x19\\x15\\x6f\\x53\\x3e\\x94\\xf2\\x2d\\x3e\\x7a\\x84\\x2f\\x74\\xfa\\xbe\\x32\\xbe\\xc5\\x9d\\xb1\\x2e\\xd8\\x42\\x3a\\xad\\x7a\\x40\\x19\\xf2\\x83\\x9e\\x42\\x20\\xd2\\x51\\xca\\xfb\\xbb\\x87\\xf5\\x16\\xa4\\xef\\x29\\x43\\xc4\\x39\\x8a\\x90\\x47\\xde\\x07\\x94\\x21\\x3f\\xe8\\x29\\x04\\x22\\x3b\\xa5\\x64\\xf9\\xf1\\x05\\x64\\xb9\\x3b\\xef\\x2c\\x6f\\x65\\x0b\\x07\\x9c\\x63\\xf3\\x95\\x2c\\x9a\\x23\\x63\\x88\\x68\\xe5\\x1c\\x0b\\x86\\xe1\\xd8\\x9c\\x81\\xbb\\x70\\xe5\\x0c\\x11\\xad\\x9c\\xbf\\x28\\x16\\xea\\xc8\\xbc\\x35\\xc7\\xe5\\xc8\\x5d\\x45\\x75\\xf3\\xff\\x50\\xf0\\xf2\\xe8\\x6e\\xf9\\xb3\\x4e\\xef\\x2e\\x01\\xe2\\xba\\x45\\x7c\\x3a\\x7a\\x38\\x25\\x83\\xe8\\xce\\xfc\\x53\\x7b\\x40\\x93\\x8c\\x1d\\xbd\\xf8\\xfc\\x2a\\xd2\\x3a\\xf2\\x15\\xe1\\xad\\x6c\\x79\\x51\\x64\\x47\\x4f\\x22\\xb0\\x79\\x75\\x65\\x0c\\x11\\xad\\x9c\\x57\\x35\\x0b\\x7e\\x64\\xee\\x0d\\xcf\\xee\\x28\\xa1\\x8e\\x74\\x95\\x72\\x95\\x1d\\xbf\\xda\\x5c\\xd5\\x1f\\xf4\\x95\\x22\\x22\\x5d\\xa5\\xbc\\x3f\\x9e\\xec\\xaf\\x74\\xfa\\xbe\\x32\\xde\\x77\\x88\\x5f\\x16\\xf1\\x80\\x15\\xed\\xaa\\xfe\\xa0\\xb7\\x90\\xee\\x9a\\xb6\\x52\\x47\\x9c\\x87\\x94\\xe1\\xa6\\x51\\x15\\xd5\\xca\\x3f\\x67\\x65\\x75\\xf4\\x50\\x7c\\x80\\xc4\\x8e\\xbc\\x21\\xa2\\x95\\xb3\\x34\\x04\\x3d\\x32\\xe7\\x6b\\x48\\xec\\xc8\\x19\\x22\\x5a\\x39\\x4b\\x77\\x2d\\xc7\\x66\\x2d\\x9d\\xa5\\xb8\\xf2\\x96\\x31\\xed\\xcc\\xd7\\xb7\\xab\\xe3\\xb7\\xdb\\x8f\\x32\\xb5\\x2b\\x73\\x88\\x69\\x65\\x5e\\x09\\x26\\xfe\\x9c\\xa5\\x21\\x3f\\xba\\xfa\\x37\\xc6\\x27\\x8e\\x62\\x8c\\x68\\x57\\x59\\x0f\\x60\\x80\\x6e\\x74\\xfa\\xbe\\x52\\xba\\x2c\\x10\\x14\\xf1\\x90\\xb9\\x7c\\x53\\x7f\\xd0\\x57\\x88\\x63\\x2e\\x43\\x29\\x0f\\xda\\xd7\\x6f\\x9a\\x2f\\xfa\\xca\\x71\\xed\\xec\\x5f\\xc5\\x59\\xe9\\xd8\\x32\\xe0\\x60\\xe5\\xca\\x1e\\x22\\xec\\x9c\\xf7\\xf8\\x9c\\x6e\\xb5\\x38\\xe4\\x32\\x10\\x87\\x24\\x5c\\x65\\xb9\\xe4\\x95\\x2f\\x03\\x38\\xdd\\xe0\\x96\\x94\\xe3\\x32\\x30\\x8e\\x26\\x32\\x32\\xdf\\x40\\x68\\xbe\\x81\\xd7\\x75\\x25\\xde\\xd6\\x20\\x9c\\x34\\x79\\xef\\xcb\\xc0\\x60\\xde\\x21\\x52\\xf0\\xcc\\x97\\x81\\xe0\\x8e\\xf4\\xab\\x18\\x66\\x19\\x72\\x99\\x46\\x4d\\xa0\\xe0\\x4d\\x75\\x70\\xc5\\x8b\\x3a\\x42\\xf0\\x93\\x2a\\xfc\\x5b\\x5c\\xe9\\x60\\xc9\\x02\\xca\\x70\\x78\\xd6\\x11\\xb0\\xc6\\xc9\\x70\\xf1\\xa8\\x83\\xe5\\x80\\xc8\\x70\\x29\\x7b\\x86\\x88\\x2c\\x87\\xb0\\x2c\\x17\\xaf\\x72\\xc3\\xba\\x0c\\x60\\x97\\xc3\\xb5\\x30\\xea\\x52\\xca\\x7f\\x45\\x80\\x64\\x50\\x2e\\x03\\xe0\\x6a\\xb0\\x21\\xc7\\xb9\\x0c\\x14\\x3b\\xa2\\x02\\x25\\x27\\x00\\xa1\\xf0\\x88\\x6b\\x09\\x0f\\x84\\x7d\\x82\\xf2\\x60\\xe3\\xbd\\x0c\\xc4\\x5e\\x8d\\x2d\\x29\\xd4\\x65\\x50\\x6f\\x87\\x75\\x04\\x10\\xae\\x8a\\x10\\xcf\\x75\\xc4\\x7b\\xa8\\x91\\xde\\x73\\x9a\\x60\\xd9\\x0f\\xf5\\x46\\x81\\x0d\\x91\\x95\\x0a\\x96\\xb5\\x90\\xeb\\xea\\x65\\x00\\x8b\\xb1\\x08\\x90\\xcb\\xe1\\xa5\\xd4\\xcc\\x10\\x01\\x6a\\x11\\xbb\\x54\\xae\\xaa\\x20\\x48\\x2e\\x3d\\x97\\x81\\x5c\\xb1\\x44\\x90\\xb9\\x56\\x5c\\x06\\xc6\\x62\\x53\\x47\\xca\\x81\\xd7\\x4b\\x43\\x1d\\xac\\x5a\\x56\\xcf\\xe7\\x3a\\x42\\x8f\\x59\\x33\\x07\\x45\\x94\\xa4\\xfd\\xcb\\x00\\x26\\xcc\\xbe\\x56\\xb6\\xba\\x3e\\x89\\xd3\\x93\\x73\\xff\\x7c\\x7a\\x3d\\x0b\\x4c\\xb9\\x28\\x9d\\x5e\\xcf\\x40\\x9c\\x73\\x6b\\x49\\x27\\x2f\\x31\\xff\\xc6\\xc3\\x75\\x55\\xcb\\xa3\\x7b\\x20\\x9b\\xb3\\xa0\\x95\\x4e\\xe3\\x7d\\x83\\x33\\xe3\\x62\\x38\\xf4\\x78\\x50\\x8a\\x5e\\x54\\xe2\\x1e\\xa9\\x33\\xc7\\x83\\xbc\\x80\\xc2\\x2e\\x24\\xba\\x0c\\xb8\\x15\\xbe\\x4f\\x1c\\x2a\\xad\\x30\\xce\\xb5\\xe3\\xc0\\xac\\x23\\xab\\xdf\\x4c\\x5a\\x12\\xd3\\x45\\x50\\xd3\\x64\\xf3\\x0e\\x54\\xd5\\xbc\\x4a\\xa2\\x6e\\xde\\xe5\\xe8\\x36\\xef\\x6a\\x24\\x37\\xb4\\x34\\xe5\\x9e\\x8b\\xc0\\xa4\\x63\\xe5\\xde\\x7a\\x65\\xb8\\xe8\\x84\\x4a\\x59\\x49\\x1b\\x79\\xe6\\xa2\\x91\\x67\\x6e\\x68\\xd8\\xc9\\x16\\x16\\xa2\\xe6\\x55\\x4e\\xb2\\x0d\\x5d\\x77\\x12\\xca\\x25\\x25\\x9e\\x7b\\x8f\\x45\\x57\\x07\\xb7\\xeb\\xaa\\xca\\xd2\\x9e\\x0a\\x74\\x64\\xb4\\x10\\x6a\\x2e\\x4d\\x4d\\x68\\x33\\xd1\\x5a\\x61\\x40\\x89\\xad\\xb0\\xf7\\x56\\xe7\\x36\\x53\\xab\\x15\\x06\\x6d\\x4d\\x3a\\x4d\\x80\\xe5\\xcf\\x7e\\x15\\xb3\\xa0\\x1d\\x52\\x59\\x19\\xd6\\xcb\\x9e\\x1d\\x24\\x97\\x3c\\x3b\\xac\\x55\\x95\\x66\\xa5\\x33\\xc3\\x32\\x51\\xb7\\xbc\\x53\\x37\\x73\\xc2\\xb6\\x42\\xed\\x3a\\x36\\xb3\\xb4\\x15\\x26\\x8b\\xda\\xd0\\xa8\\x93\\xb7\\x5a\\x32\\x36\\x74\\xde\\x89\\x92\\xf3\\x77\\x43\\x97\\xdd\\xf1\\x16\\x9b\\x8c\\xf1\\x6a\\xf5\\xbc\\x5c\\xa6\\x36\\x34\\xde\\xdf\\x79\\x1b\\xa9\\x79\\x73\\x49\\x37\\xc6\\xe5\\x54\\x06\\xb3\\x48\\xdf\\x4a\\xb1\\xc3\\x57\\x4f\\x97\\x3e\\xbe\\xb4\\x24\\xc3\\xb7\\xf7\\xcb\\xd7\\x0d\\x51\\x2f\\x79\\xf6\\xe2\\x90\\xdc\\xbd\\x4f\\xcc\\x4b\\xc6\\x4f\\x1e\\x63\\xb7\\xcc\\x95\\x8c\\x9f\\x3c\\x3d\\x20\\x96\\x77\\xc9\\x7f\\xc9\\xf8\\xc9\\x73\\xdc\\x2f\\xfe\\x25\\xe3\\x27\\x2f\\x70\\x8f\\xf4\\x97\\x8c\\x9f\\xd8\\x15\\x35\\x04\\xbc\\x64\\xfc\\x74\\x84\\x5d\\xf2\\x5d\\x32\\x7e\\x3a\\xc6\\x3d\\xe2\\x5d\\x32\\x7e\\xfa\\x18\\xbb\\xa4\\xbb\\x64\\xfc\\xfc\\xb1\\x5b\\x8f\\xc6\\xbe\\x35\\x68\\x6b\\xd5\\x3c\\x79\\xb8\\x21\\x75\\x66\\xe8\\xb2\\x29\\x7d\\x34\\xc3\\xb0\\xad\\x23\\x59\\x67\\x14\\x14\\x2f\\xa0\\xc7\\x2e\\x58\\xc5\\x1c\\xe0\\xbc\\xc8\\x4a\\x00\\xf7\\xdd\\x67\\x3c\\xb0\\xbf\\x52\\x17\\xd2\\x56\\xe0\\x7e\\x3f\\xc9\\x02\\xb6\\x06\\xc0\\x21\\x50\\x52\\xf2\\x0a\\xcc\\x1c\\xb6\\x4e\\x8e\\xc1\\x86\\xb6\\x3f\\x04\\x08\\xfb\\x7b\\xdb\\x1e\\x89\\xca\\x4b\\x07\\xdb\\x7f\\xa8\\xae\\x0f\\x31\\x36\\x7e\\x50\\x5d\\xad\\xcb\\x0a\\x55\\x61\\xa9\\xb0\\xc2\\x8b\\xef\\xaa\\x78\\x8b\\xfe\\xa1\\xf6\\x0f\\x87\\x10\\x56\\x3a\\xa1\\x72\\x25\\x39\\xcf\\xd2\\x79\\xbc\\xd0\\xc6\\x98\\x3a\\xf4\\x0a\\x54\\x5e\\x68\\x25\\x43\\x53\\x06\\xd7\\x69\\xa2\\x5c\\x9a\\x4e\\x0c\\x47\\x10\\xb5\\x53\\xc2\\xac\\x08\\xc0\\x9a\\x61\\xce\\x42\\x5e\\xf3\\x33\\x59\\xbf\\x87\\x90\\xac\\x06\\x09\\x2d\\xa6\\xd9\\x0c\\x5c\\x64\\x4c\\xb3\\x19\\x65\\x67\\xcc\\x4b\\x7d\\x92\\x4e\\xb3\\x99\\xc2\\x12\\x57\\xd6\\xee\\x81\\xc2\\xb8\\xfb\\x20\\x79\\x12\\x1e\\x9d\\x75\\x83\\x08\\xf0\\x33\\x69\\x20\\x09\\x1f\\x00\\x95\\xa4\\xef\\x8d\\xb8\\xbc\\x68\\x25\\xa5\\xe5\\x59\\x6c\\xe2\\x7b\\xdd\\x14\\x6b\\x4e\\xac\\x90\\x37\\x2c\\x29\\x55\\x9f\\xc4\\xa5\\xc1\\x19\\x7d\\xac\\xb2\\x3c\\xe7\\x11\\xed\\x26\\xde\\xff\\xaf\\xfb\\x6c\\x50\\xdb\\x7a\\xd5\\xb1\\xdb\\x70\\xb4\\xb4\\x6f\\x99\\x6e\\x40\\x15\\x01\\xee\\xd1\\xb6\\xe0\\x2b\\x47\\x9a\\x2c\\x40\\x28\\x29\\xb5\\xf3\\x79\\x99\\xca\\x6e\\xc3\\x3b\\x50\\x32\\x85\\x05\\x5e\\xec\\x1d\\x4a\\xfb\\x11\\x0e\\x61\\xa5\\x02\\x3f\\x86\\xad\\x93\\xdd\\x26\\x3a\\xd7\\x78\\xc5\\x3f\\x56\\x6c\\x95\\xbb\\x5d\\xf8\\xd7\\xd1\\xbb\\xdd\\x05\\xab\\x78\\x90\\x66\\x5f\\x3d\\xb8\\xc3\\x6f\\x0d\\x84\\xb4\\xbf\\x14\\xbd\\x5a\\xea\\xd7\\xfd\\x84\\xd9\\x08\\x5f\\x36\\x77\\xd9\\x55\\x59\\x6e\\x8f\\xd8\\x60\\x34\\x31\\x3c\\x56\\x18\\x14\\x39\\x69\\x73\\xaa\\x67\\x5d\\xd6\\x95\\x70\\x93\\x2a\\x6a\\xf0\\x28\\x07\\x61\\x74\\xc8\\x62\\x8f\\x5b\\xbc\\x71\\x8f\\x0f\\x0d\\xbb\\x46\\xad\\x6f\\xce\\x1c\\x1c\\x36\\xe1\\x81\\xec\\xfe\\x9f\\x61\\x44\\xe8\\x60\\x74\\x2c\\xb9\\xc9\\x6a\\xe5\\xbc\\x28\\xe3\\xb2\\xdb\\x73\\x71\\xf9\\x41\\xc6\\x88\\xd9\\xea\\xf8\\xce\\x8c\\x77\\xd1\\xbc\\x5b\\x8f\\xdc\\x68\\xe9\\xe1\\x49\\xaf\\x10\\x2b\\x61\\x46\\x57\\x33\\xa9\\xac\\xe0\\x5a\\x70\\x1a\\xc3\\x9b\\xd6\\x9a\\xd3\\x44\\x58\\xcb\\x0e\\x98\\xe5\\xfa\\xd8\\x28\\x92\\xae\\x71\\x61\\xad\\x9e\\x6e\\xd0\\x0c\\xb1\\x46\\x17\\x54\\xcd\\x3d\\x79\\x17\\xef\\xa5\\x0d\\x25\\xfa\\x82\\x30\\xa5\\x0f\\x04\\x15\\x60\\xbe\\x50\\x2b\\xca\\x6c\\x3a\\xe5\\x98\\x1b\\x75\\x61\\xde\\x76\\x8f\\xd3\\x26\\x00\\x83\\xf1\\xa3\\x55\\xbb\\xd4\\x7a\\x6d\\x1b\\x12\\x73\\x9c\\x05\\xd5\\xb2\\xe0\\xfc\\x75\\xb1\\x00\\xfd\\x2b\\x58\\x42\\x0a\\x7f\\xdf\\xb1\\x38\\xee\\x49\\xf8\\xfd\\x90\\x6e\\x5d\\x03\\x62\\xdc\\x5d\\x7f\\xc8\\xf8\\xb9\\xdc\\x2d\\x1f\\x62\\x57\\xfc\\xa0\\xdd\\xb2\\xb9\\x84\\x67\\x74\\x5b\\x70\\xc1\\xf6\\x46\\x6a\\x59\\xfb\\x9e\\xbd\\xd2\\xe4\\xf9\\xa0\\xe2\\x0f\\x30\\x40\\xfb\\x1f\\x67\\x49\\x1e\\x82\\x2e\\xff\\xdd\\x9d\\xdc\\xa7\\xcc\\x10\\xdb\\x31\\x7f\\xe6\\x9b\\xee\\xae\\x74\\x95\\x45\\xf1\\x3c\\x06\\x15\\xd9\\x8a\\xcb\\xcd\\xe9\\x0b\\xdf\\x90\\x18\\x27\\x0a\\x87\\x52\\x6d\\x30\\x55\\x91\\xfc\\x99\\x6f\\xe4\\x4b\\xb9\\x8c\\xe7\\x55\\xfd\\xc6\\x92\\xe6\\x79\\xc5\\x2b\\x56\\xbf\\x14\\x3c\\xe7\\x4c\\xa1\\xf3\\x8b\\xdc\\xf4\\xe6\\xb4\\xe0\\x76\\xa9\\x62\\xf3\\x53\\x95\\x76\\x31\\xbe\\x5f\\xf8\\x26\\x17\\x47\\x7f\\x04\\x2e\\x1b\\xc4\\xf4\\x3d\\x63\\x1e\\xf7\\xc9\\x08\\x2e\\xad\\x0e\\x7c\\x15\\x65\\x5f\\xd3\\xe6\\xa3\\xdd\\x4e\\x84\\xad\\x73\\x23\\x1b\\x1e\\xe8\\x0c\\x46\\x7b\\xfc\\x75\\x19\\x5b\\x92\\x97\\x7b\\xcb\\x7f\\x70\\x11\\x0e\\x52\\x5a\\x1f\\x4b\\xf8\\x07\\x0f\\x34\\xe6\\x00\\x93\\xf1\\xf3\\x27\\xb8\\x77\\x7c\\xc9\\xf8\\xb9\\x3c\\xd2\\x3c\\x44\\xe1\\xf6\\x8f\\xd1\\xe5\\x7f\\xc4\\xfc\\xab\\x68\\xdf\\x15\\x17\\x59\\x97\\x5d\\xb2\\x6c\\x53\\x60\\x49\\xb7\\x65\\x58\\x70\\x9e\\xfe\\xa7\\xa2\\x36\\x78\\xf9\\x8b\\xa2\\xc3\\x24\\xe6\\x69\\xf5\\x9f\\xe6\\xcb\\x5f\\xbe\\x9f\\x42\\x3b\\x94\\x18\\x63\\x29\\xd9\\x71\\x98\\xa3\\x73\\x25\\xf4\\x51\\xa7\\x7a\\x04\\xf4\\x22\\xcf\\x61\\x15\\x79\\x4c\\x29\\xad\\xce\\x1e\\x93\\xa7\\xf0\\x3b\\x16\\xf4\\x24\\x53\\x97\\x7a\\x2a\\x98\\xab\\xa0\\x93\\x27\\xb3\\x92\\xec\\x76\\x1e\\x0f\\xe6\\x45\\xb6\\xd2\\x96\\xc3\\x82\\xa0\\xca\\x22\\x54\\xaf\\x67\\x3c\\xa8\\x32\\xad\\xb1\\x6b\\x25\\xf4\\xf7\\x38\\x67\\x0b\\xfe\\x9f\\x2e\\x42\\x86\\x08\\x7d\\x72\\x94\\xa9\\xe0\\x04\\x29\\x3a\\xf4\\xb4\\x06\\x25\\x90\\xe2\\x12\\xd0\\xe3\\x85\\xac\\xfe\\xd2\\x97\\xd5\\x5f\\xcc\\xac\\xfe\\x52\\x67\\xf5\\x97\\x76\\x56\\x37\\x59\\xee\\x22\\xfd\\xf2\\x21\\xa4\\xdf\\x26\\x22\\x32\\x7e\\xfa\\xf4\\x7e\\x2a\\x7f\\xfa\\x00\\x08\\xd3\\x7f\\xd0\\xea\\xdb\\x26\\xe6\\x98\\x6e\\x41\\x64\\xac\\x19\\x75\\xc9\\xee\\xdf\\x98\\x41\\x21\\x28\\x64\\x46\\x56\\x58\\x2f\\xc5\\x1e\\xa0\\xf2\\x0e\\x31\\x33\\x47\\xaf\\xc7\\xdf\\xb3\\xe0\\xf4\\xf4\\xee\\xc3\\x1d\\xbb\\x3e\\x78\\x1f\\x76\\x1f\\xa0\\x62\\xba\\xbd\\x8b\\xf9\\xd7\\xb6\\xa3\\x72\\x1e\\x88\\xd0\\x06\\xc7\\x5d\\xbc\\x29\\xc5\\x72\\xa6\\x20\\x38\\xe4\\x29\\x14\\x7c\\x8c\\x4b\\x61\\x09\\x00\\x9c\\xd7\\x3e\\xc4\\x35\\x3c\\x1b\\x00\\xb1\\x5d\\x28\\xfd\\x79\\x03\\xec\\x44\\x9f\\x66\\x04\\x39\\xee\\x76\\x5a\\x55\\xfe\\x37\\xc8\\x49\\x49\\x5f\\xc4\\x29\\xaa\\x62\\x71\\xe2\\x9e\\xe4\\x32\\x6e\\xb7\\x73\\x6e\\x06\\x07\\xc7\\xa6\\xa3\\x1a\\xeb\\xe2\\xe9\\x9e\\xfe\\xd3\\x24\\x55\\x1d\\x09\\x08\\x4f\\x2a\\xe6\\x5c\\x65\\x64\\x8c\\x5e\\x1b\\x54\\x3a\\x04\\x37\\x24\\x17\\x46\\xd4\\x23\\x1e\\x18\\x61\\x04\\x10\\x90\\x93\\x8a\\x39\\x57\\x1b\\x19\\x63\\x65\\xf9\\x17\\x33\\xcb\\xbf\\x38\\xb2\\xb4\\x12\\x38\\xe2\\xeb\\x12\\xff\\xaf\\x9c\\x3d\\xf0\\x7c\\xa5\\x9d\\xd9\\xfe\\x03\\xe4\\x39\\x4f\\x8f\\x03\\xe8\\x73\\xf9\\xe9\\xea\\x01\\x40\\xe8\\x9c\\x10\\xab\\xae\\x49\\xb1\\x3c\\xd9\\xb9\\xcd\\x8d\\x35\\xfe\\xc1\\x57\\xf9\\xfe\\x36\\x8d\\xab\\x0b\\x56\\xb1\\x33\\x57\\x60\\x6d\\x42\\x4d\\x5c\\xb1\\x74\\x3a\\x53\\xf8\\xa5\\x71\\xf9\\x36\\x35\\xcd\\x46\\x07\\xe3\\x3d\\x6e\\x07\\x92\\xc1\\x18\\xf7\\x18\\x40\\x2b\\x01\\x83\\x9d\\xbc\\xa3\\x52\\x3d\\x18\\x38\\x0b\\xeb\\xb3\\x2f\\xc6\\x19\\x66\\x38\\xc6\\x25\\x5e\\xfb\\xdb\\xc2\\x1b\\xa8\\xc3\\xb4\\xf5\\xa9\\xa7\\x50\\xf7\\x42\\x9c\\x18\\x1e\\x57\\x3b\\x8d\\x19\\xe1\\xb0\\x39\\xce\\xd7\\x43\\xf2\\x3a\\x49\\xbc\\x11\\x68\\x34\\xab\\xb9\\x63\\x15\\x29\\x3e\\x69\\x3c\\xb4\\x8a\\xcc\\xc1\\x41\\x46\\x5d\\x0a\\xd8\\x96\\xcb\\x2c\\xf6\\x21\\x53\\x57\\x68\\x7b\\x9e\\x94\\xfc\\xa4\\x13\\x5f\\xe7\\xd2\\xd7\\xd7\\xfb\\xda\\xc1\\x06\\xb6\\xea\\x67\\xfb\\xcf\\xd5\\x27\\x7a\\xda\\x47\\x35\\x38\\xa5\\x7c\\x92\\xbe\\xaa\\x11\\xd1\\x0d\\x94\\x08\\x70\\x97\\x54\\x57\\xbe\\x45\\x07\\xd3\\x74\\x46\\x59\\xf0\\xfe\\xe7\\x8f\\x97\\xd7\\xff\\x71\\x79\\xf1\\xf9\\xf2\\xfa\\xfa\\xfd\\xb5\\x93\\xc6\\x44\\xc2\\xc2\\xe8\\xc2\\x33\\xf3\\xa5\\x59\\x81\\x94\\x77\\x2b\\xdd\\x6c\\xed\\x70\\xd6\\x91\\x19\\xed\\x94\\xdb\\xf4\\xb0\\x3d\\x52\\xe9\\xe9\\xd8\\xec\\xe8\\xfd\\x5e\\x99\\xf7\\xb7\\x7b\\x49\\x79\\x23\\x75\\x10\\xca\\x1f\\xe8\\xbf\\x0c\\xc7\\xd2\\x89\\x8b\\x9a\\x98\\xdd\\x96\\x40\\xdf\\x66\\x82\\xca\\xca\\x41\\xb7\\x51\\xc3\\x61\\x2c\\x09\\xa2\\x7e\\x30\\x96\\xeb\\x52\\x2c\\x16\\x06\\xad\\xc5\\x73\\x2f\\x73\\xd0\\x59\\xa7\\x03\\x0e\\xce\\xf7\\xfd\\x5e\\x2c\\xef\\xd2\\x13\\x75\\x86\\xed\\xda\\x90\\xad\\xcb\\x9e\\xaf\\x0b\\x3c\\xf8\\xf4\\x38\\x17\\x85\\xdb\\x0e\\xc7\\x49\\x46\\xb8\\xcd\\x3a\\x92\\x11\\x2e\\xf8\\xbc\\xe0\\xe5\\x52\\x06\\x81\\xe0\\xcf\\xf6\\xf3\\x58\\x74\\x59\\x57\\xca\\x83\\x6f\\xb8\\xe8\\xf0\\xa1\\x94\\x07\\x9b\\xbd\\xcb\\x21\\xdd\\xd3\\x87\\x09\\xdf\\xa5\\xc7\\x37\\xcd\\x4d\\xf8\\xca\\xeb\\x1b\\x6f\\x33\\x12\\x6d\\xcf\\x2c\\xb8\\x68\\x05\\x55\\x8d\\xe5\\xda\\x70\\x58\\x9c\\x79\\x1c\\x80\\x48\\x02\\x96\\xe7\\xc9\\x46\\x42\\x8b\\x70\\x9f\\xa4\\x3a\\xdc\\x93\\xef\\xc5\\xd9\\x94\\xcf\\x82\\x30\\x4b\\x43\\x56\\x79\\x95\\x4f\\xa6\\x1c\\x57\\x96\\x17\\x07\\x37\\xf2\\x65\\xd1\\x3b\\x5a\\x0f\\x03\\x98\\x6b\\x66\\xc3\\x18\\xa7\\x74\\x84\\x0b\\x3a\\x9a\\x14\\x8d\\x73\\xa5\\xe2\\xf4\\xd4\\xaf\\xa8\\x57\\x9d\\xf2\\x40\\x1f\\xea\\x5f\\x57\\x5e\\xe1\\xfb\\xff\\x27\\xc3\\x29\\xf5\\xd2\\xd3\\xca\\xff\\x3f\\x59\\x8d\\x65\\xba\\x4b\\x5f\\xbd\\x1a\\x3f\\x57\\x95\\x7f\\xfe\\xec\\xd9\\xe3\\xb1\\x6b\\x70\\x1c\\x02\\x1f\\xbb\\x4e\\xc6\\x21\\x0a\\x00\\x9b\\xbc\\x0c\\xf7\\xa0\\xf7\\x56\\xd9\\x27\\x41\\xf6\\xe7\\xac\\xe4\\x9e\\xbf\\xd7\\xbc\\xce\\x0f\\x8f\\xbc\\xc0\\xff\\x61\\xe1\\x2a\\xfb\\x61\\xee\\x01\\x6b\\x9b\\xa9\\xa6\\x2a\\x0c\\xa3\\x55\\xf9\\x08\\xf9\\x16\\x5f\\x15\\xb2\\x15\\x17\\x0b\\x14\\x30\\x53\\x3f\\xfc\\xd7\\xa3\\x55\\xf9\\xe8\\x87\\xee\\x58\\xd5\\xa9\\xc8\\xf8\\xe9\\x8f\\x50\\x1b\\xc7\\xb1\\xbd\\x4d\\x99\\xa6\\x2f\\xcf\\x41\\xe5\\x0f\\x87\\x1e\\x17\\x4c\\xee\\x6e\\x37\\xc8\\x3c\\xb0\\x55\\xcb\\xbc\\xca\\x3f\\x83\\xc4\\x41\\xe3\\xc2\\x1f\\xa4\\xd8\\x59\\x5a\\xb1\\x38\\x2d\\xcf\\x9a\\x47\\x41\\x5f\\x83\\x81\\x78\\x5f\\x89\\xb4\\x9a\\x25\\xfe\\x90\\x95\\x71\\x05\\x00\\x4e\\x83\\x81\\x37\\x7e\\x3e\\xec\\x4d\\xe0\\x55\\xbe\\x6f\\xb7\\x5c\\xda\\x6e\\xbd\\x03\\x01\\x95\\x83\\x3a\\x9b\\x58\\x32\\xfe\\x11\\xf8\\xa8\\x67\\x8e\\x43\\x9c\\xab\\xd3\\x07\\x03\\x3e\\x1c\\x1a\\x8e\\x8b\\x34\\xc2\\x84\\xe9\\xb1\\xb4\\x09\\xf5\\x87\\x43\\x24\\x29\\x56\\x99\\x0e\\x0f\\x3c\\x54\\x72\\x89\\xe4\\x75\\xc7\\x12\\x08\\x14\\x69\\x94\\x13\\x1a\\xc3\\xd5\\x69\\x9a\\x45\\xe0\\xef\\x78\\x38\\xec\\xb8\\x90\\xda\\xed\\x90\\x58\\x9d\\x39\\x87\\xcf\\x77\\x3b\\x14\\x57\\x7c\\x25\\xb3\\x72\\xfb\\xf0\\x15\\xd5\\x3f\\xeb\\xf8\\x6f\\xe2\\x41\\x09\\x50\\x37\\x3e\\x01\\x39\\xd3\\x94\\xcf\\x4c\\xc3\\xd4\\x2a\\x7b\\x2d\\xfd\\xe9\\x74\\xbd\\x5b\\xea\\x28\\x32\\x7e\\x09\\x08\\xe0\\xcf\\x1e\\x72\\x42\\xd3\\x72\\x0e\\xa6\\x64\\xeb\\x6f\\x58\\x58\\x65\\x85\\xe9\\xfe\\x4e\\x63\\x44\\x4b\\x8e\\x78\\x5b\\xb1\\x05\\xf8\\xa5\\xe6\\xf6\\xa4\\xc2\\x51\\x5c\\xe6\\x09\\x93\\x3e\\xab\\x25\\x78\\xc9\\x9b\\x75\\x92\\x7c\\x60\\x8b\\x06\\xdc\\x1b\\x9d\\x72\\x1c\\xea\\x97\\xdf\\xe2\\x24\\x51\\xb8\\x91\\x26\\xeb\\x17\\x7b\\x83\\x31\\xe0\\xc2\\xa7\\x11\\x2f\\x5c\\xe8\\xa3\\x0a\\x0e\\x54\\xba\\x3c\\xde\\x77\\xa1\\xf3\\x5d\\x6e\\x6c\\x3a\\x08\\xc6\\x07\\xd7\\x4a\\x23\\x1b\\xf2\\xe3\\x93\\x3e\\xdc\\xb5\\xee\\x8a\\xfa\\xcc\\x71\\x0c\\x73\\x75\\x35\\x0f\\x56\\xb0\\x2d\\x27\\x0d\\xb8\\xf3\\x70\\x58\\x4d\\xc7\\xb3\\xa0\\xca\\x7e\\xcd\\xbe\\xd6\\xcb\\x54\\x1b\\x9f\\x53\\xee\\x2e\\xe1\\x64\\xed\\x0d\\x06\\xa1\\x64\\x64\\x33\\x2a\\xf2\\xc5\\x8c\\x66\\xc3\\x61\\xe9\\x49\\xf7\\x6b\\xcc\\xdf\\xa6\\x41\\x9c\\xa6\\xbc\\xf8\\xe5\\xe6\\xea\\x57\\xca\\xa6\\xe3\\xd9\\x29\\x3f\\x65\\xd3\\xc7\\xb3\\x9a\\xa5\\x49\\x28\\x9b\\x8e\\x66\\x93\\xe4\\xd1\\xa3\\x89\\x9f\\xd2\\x34\\x48\\x58\\x29\\x3d\\x83\\x4b\\x86\\xd4\\xfc\\x5c\\xba\\xae\\xce\\x29\\xc0\\xa1\\xa9\\x2e\\x28\\x7f\\xde\\xdc\\x48\\x2a\\xf0\\x50\\x19\\x16\\x71\\x2e\\xba\\x31\\x57\\x5b\\xc1\\x70\\xe8\\xad\\xc5\\x96\\x15\\x7b\\xb9\\x1f\\xcc\\xb3\\xe2\\x92\\x85\\x62\\x0b\\x6b\\xf8\\xa9\\x88\\xc6\\x5e\\x1a\\x80\\xdf\\x56\\x31\\xe3\\x4b\\x7f\\x62\\x54\\x60\\xe2\\xa7\\x96\\x7b\\x73\\x23\\xaa\\xee\\xad\\xc8\\x32\\xd8\\x06\\xdd\\x38\\xb0\\xdc\\x6f\\x9c\\x96\\xd7\\xe3\\x2c\\x29\\x17\\xa6\\xc7\\x9b\\x22\\x5b\\x5d\\xc5\\xdf\\x78\\x64\\x09\\xc3\\x25\\x96\\xb1\\x60\\xe8\\xfa\\x7c\\x5c\\xb3\\x20\\x64\\xe9\\xa7\\x92\\x5f\\xbc\\xbf\\x3a\\xab\\x6d\\xeb\\x65\\xbe\\xda\\x58\\x1e\\x45\\xf1\\x9d\\x72\\xd1\\x8a\\x13\\xfa\\xc3\\x7f\\xfd\\xb5\\xfc\\xb7\\x57\\xde\\x5f\\xbf\\x9e\\xfa\\x3f\\x74\\x27\\xab\\xb3\\xbe\\xe4\\x39\\xe8\\xbb\\x38\\x6b\\x4b\\xc6\\xcf\\x46\\xb8\\x53\\x59\\x32\\x7e\\xde\\x47\\x85\\x0f\\x53\\xdd\\x68\\xfc\\x04\\x4b\\x27\\x0a\\xbb\\x5d\\x17\\xae\\x47\\x04\\x82\\x0d\\xf4\\x19\\x42\\x24\\x2e\\xdf\\xb1\\x77\\x60\\x1b\\x3d\\x92\\x1b\\x4c\\xc7\\xdb\\xa3\\x58\\x41\\xd9\\x94\\xcf\\xce\\x10\\x3a\\xad\\x48\\xed\\xab\\xab\\xc9\\x6e\\x38\\xf4\\x2a\\x5a\\x05\\x55\\x11\\xaf\\x3c\\xdf\\xc7\\xd5\\x29\\xca\\xbf\\x21\\xdb\\x8b\\xcf\\xc7\\x8f\\x06\\x4a\\x0d\\xa3\\x59\\x10\\x97\\x9f\\xd2\\xb8\\x4a\\x78\\x59\\xbe\\x83\\xb5\\xb9\\x3b\\x6d\\xcd\\x6f\\x88\\x74\\xd6\\xf1\\xcc\\xc1\\x91\\x3a\\x77\\xee\\xee\\x3a\\xc3\\xf7\\x36\\x44\\xe1\\x3e\\x33\\xaf\\x5a\\xa9\\xbc\\xc5\\xb3\\xaf\\x5e\\x69\\x01\\xb8\\xf3\\x59\\xfb\\xce\\x56\\x84\\x8f\\x5a\\xe1\\xef\\x44\\x6f\\x17\\x0a\\x20\\xdb\\xfe\\x62\\x19\\x97\\xd4\\x8d\\xba\\xbc\\xb7\\x53\\xea\\x0b\\x44\\xea\\x92\\x39\\x99\\xee\\x04\\xb4\\xcd\\xf1\\xb3\\xfb\\xd8\\xdd\\xbb\\x7e\\xdf\\xcd\\xcf\\x1e\\xc6\\x2e\\x6a\\x1d\\x38\\xb1\\x8b\\xb9\\xf6\\x40\\x0f\\xa1\\x53\\xee\\xd7\\xdc\\x52\\x8c\\x0b\\xed\\xea\\x61\\x8b\\x86\\x88\\xa0\\x21\\x5b\\xe5\\x13\\x84\\xd1\\x4f\\xe2\\x79\\x51\\x89\\xc7\\x57\\xe2\\x31\\x11\\x8f\\x7f\\x42\\x7f\\x22\\x68\\xf8\\xf7\\x75\\x06\\xe1\\x7f\\x12\\xe1\\xff\\xcf\\xb7\\xc7\\x3f\\x4e\\xd0\\x1e\\xc7\\xf4\\x87\\xe9\\xf0\\xa7\\x57\\xe8\\x4f\\x33\\x8b\\xaf\\xab\\x7b\\xe0\\x21\\x97\\x88\\xad\\xa9\\xa1\\x30\\x8d\\x4b\\xd8\\xab\\x49\\x26\\xa8\\x5e\\x3c\\x02\\xde\\xb9\\x58\\xc8\\xc4\\x94\\xad\\xb1\\x0a\\xb9\\x4f\\xbc\\x58\\xe1\\x29\\x73\\x85\\x9f\\xde\\xe3\\x44\\x5d\\x46\\xfa\\x18\\x90\\x0a\\x61\\xfb\\xd3\\x53\\xe1\\x18\\xa4\\x40\\x0b\\x02\\xd9\\xde\\xf5\\x00\\x65\\xd8\\xb9\\xe7\\xe9\\x05\\x30\\x2e\\x15\\x47\\x66\\x9b\\x36\\xf7\\x6d\\x89\\x7d\\xd0\\x56\\xbd\\xe8\\xa3\\xb2\\x06\\x64\\x3c\\x1e\\xb9\\x15\\xf0\\x54\\xf9\\x64\\xfc\\xe3\\x8f\\x2e\\x0d\\xbc\\x67\\x0f\\xbf\\x46\\x55\\xd2\\x35\\x71\\x42\\xee\\x28\\x2d\\xa5\\xfe\\x24\\x1b\\x0e\\x6b\\x59\\xb0\\x57\\x4c\\xd3\\x19\\xad\\xda\\x3c\\x5a\\xed\\xfd\\xb3\\x3e\\xd7\\x71\\x25\\x4d\\xde\\xee\\x6b\\xd5\\x4e\\x8f\\xe3\\x42\\x9c\\xd3\\x2a\\x8b\\x45\\x2b\\xd8\\x1d\\x2f\\xe0\\xf4\\x0d\\x1b\\x56\\xc1\\xd3\\x43\\x5d\\xab\\xb9\\x37\\xc7\\x57\\x64\\xfc\\xf2\\x89\\xb3\\x43\\x1e\\x06\\x98\\x53\\x15\\x9b\\x2d\\x97\\xa6\\x03\\x9e\\x25\\x0b\\xe8\\x4e\\xef\\xe7\\xc7\\xa1\\x23\\xb4\\x93\\x38\\x98\\xd8\\x7a\\xcb\\xc7\\xa9\\x4f\\xf8\\x70\\x58\\x49\\xd1\\x45\\x8a\\xb9\\xef\\x5a\\x57\\x9e\\x3b\\x98\\x55\\x0b\\x4a\\x56\\x34\\x42\\x6f\\xfc\\x7a\\xfb\\x65\\x26\\x3e\\xc4\\x6e\\x57\\x87\\xdf\\x66\\xd1\\xa6\\x69\\x67\\xfb\\x2b\\x88\\x75\\xb5\\xfd\\x21\\xe2\\x73\\xc5\\xc4\\xe1\\x94\\xd6\\x77\\xbc\\xfa\\x6a\\x50\\x1f\\x7c\\xa5\\xd8\\x59\\xec\\x8e\\x9e\\x60\\xf6\\x74\\xb0\\x3f\\x1c\\x8e\\x9f\\x50\\x4a\\x53\\xd8\\xfe\\xc6\\x4f\\x7c\\x52\\xd1\\x14\\x57\\x3f\\xd1\\x27\\x8f\\x77\\x3b\\x88\\xa9\\xce\\x2a\\x32\\x72\\x55\\xf0\\x21\\x5b\\xba\\xba\\x13\\xf9\\xc2\\x37\\x35\\x6b\\x3f\\x85\\xd7\\xd9\\x6e\\x07\\xbf\\xe0\\xe8\\xf5\\x53\\x1a\\x47\\x3c\\xad\\xc0\\xd3\\x3c\\x1a\\x98\\xb7\\x21\\x7b\\x11\\xdd\\xbd\\xfc\\x36\\xd0\\x98\\x6b\\x46\\x4c\\x36\\xe7\\x0c\\x81\\xf6\\x38\\x22\\xd2\\xb7\\x06\\x5c\\x4b\\xea\\xbb\\x6a\\x2f\\xd5\\xee\\x42\\x8f\\xba\\x36\\x8f\\xa7\\x75\\xa7\\xce\\x76\\x3b\\xbb\\x92\\x04\\x21\\x93\\x43\\x70\\xe8\\x3d\\x30\\xba\\xbd\\x2c\\x43\\x82\\x2e\\xcb\\x90\\xe5\\x1c\\xe1\\x8f\\x39\\x0b\\xf9\\x2d\\x2b\\x08\\x3a\\x41\\x18\\xe4\\x4c\\xe8\\x75\\x51\\x64\\x5f\\xc5\\x23\\xc2\\x9f\\x72\\xf5\\xfa\\x29\\x47\\xf8\\x3a\\x5e\\x2c\\x75\\x34\\x3c\\x23\\x0c\\xda\\xf9\\x32\\x44\\x3c\\x22\\x7c\\xc1\\x13\\x82\\x2e\\x78\\xc2\\x2b\\x8e\\xf0\\x6f\\x71\\x4a\\xd0\\xfb\\x8f\\x08\\x83\\xba\\x3f\\x32\\x74\\xff\\x11\\x7e\\x9d\\xe7\\x65\\x2b\\x48\\x29\\xa3\\x23\\x25\\xaa\\xca\\xc2\\x2f\\x08\\x5f\\x65\\xff\\xfd\\xa1\\x88\\x53\\x00\\x93\\xf9\\x33\\xdf\\x10\\xbb\\xb9\\x62\\x2b\\xdb\\xbe\\x20\\xe8\\x67\\x16\\x7e\\x29\\x45\\x43\\x10\\x7e\\x49\\xd0\\x0d\\xbb\\x45\\x78\\xfc\\x98\\xa0\\xf3\\x84\\xb3\\x02\\xe1\\xf1\\x13\\xa2\\x7a\\x1f\\x8f\\x9f\\x13\\xf4\\x71\\x19\\x8b\\xa6\\x8d\\x7f\\x94\\xc5\\x17\\x59\\x82\\xf0\\xf8\\x05\\x41\\xaf\\x13\\x11\\xfa\\x92\\xa0\\x0f\\x6c\\x5d\\x72\\x84\\x1f\\x8f\\x08\\x3a\\x67\\x79\\x29\\x2b\\xf2\\xf8\\xc7\\xa6\\xcf\\x9e\\x3c\\x86\\xde\\x7a\\xf2\\x44\\xa4\\x5d\\x70\\xd1\\x37\\x4f\\x9e\\xca\\x67\\xd9\\x0b\\x4f\\x9e\\x89\\x12\\x23\\x84\\x9f\\x3c\\x27\\xe8\\x97\\x6c\\x25\\xbe\\xf9\\xd1\\xea\\xd8\\x27\\x2f\\x8c\\x8e\\x7d\\xf2\\xd2\\xee\\xd5\\xa7\\x23\\xab\\x4f\\x9f\\x3e\\x23\\xe8\\x6d\\x5a\\xf2\\x42\\x44\\x3d\\x6f\\xba\\x77\\x2c\\xda\\xf8\\x66\\x2c\\x1e\\x9e\\x10\\xf4\\xe6\\xb1\\x78\\x78\\x4a\\xd0\\x9b\\x27\\xe2\\xe1\\x19\\xf9\\xff\\xb8\\xfb\\xd6\\xed\\xb6\\x71\\x34\\xc1\\xff\\xf3\\x14\\x12\\xce\\x2c\\x8b\\x2c\\xc1\\xb2\\xe4\\xa4\\x73\\xa1\\x8c\\x78\\xd2\\xa9\\x64\\xaa\\xf6\\x54\\xaa\\x72\\x12\\xd7\\x6e\\xef\\x2a\\xea\\x1c\\x5a\\x82\\x6c\\x76\\x28\\x80\\x4d\\x42\\x76\\xbc\\x96\\xe6\\x31\\xf6\\xd7\\x3e\\xdd\\x3e\\xc9\\x1e\\x7c\\x1f\\x00\\x82\\x14\\x75\\xf3\\x56\\x9d\\x9e\\x99\\x3f\\x36\\x05\\xe2\\x4e\\xe0\\xbb\\x5f\\xc8\\xbb\\xa7\\xfa\\xe1\\x59\\x4c\\xde\\xfd\\x49\\x3f\\x3c\\x8f\\xc9\\xbb\\x67\\xfa\\xe1\\x45\\x4c\\xde\\x3d\\x27\\x90\\x21\\x95\\xbc\\x7b\\x41\\x20\\x9d\\x25\\x79\\xf7\\x92\\x40\\xde\\x36\\xf2\\x6e\\x38\\x20\\x90\\x20\\x8b\\xbc\\x1b\\xea\\xbe\\xcf\\x74\\xdf\\x43\\xdd\\xf9\\xd3\\xa7\\x31\\xf9\\x65\\xb9\\xc0\\xfd\\x18\\xea\\x59\\xf9\\x5f\\xea\\xec\\xec\\x69\\x4c\\xde\\x73\\x95\\x90\\x26\\x04\\xdb\\x66\\x9e\\x01\\xb7\\xf6\\xb8\\x24\\x48\\x95\\xa8\\x99\\x0a\\xa6\\x6a\\xf6\\x88\\x1a\\x25\\xf5\\x9b\\x7a\\xde\\xc8\\xcf\\xde\\x56\\x7b\\xa3\\x6f\\x28\\x82\\x6b\\x4d\\x7e\\xd9\\x3c\\xd3\\xdd\\x22\\x08\\xba\\x5d\\x31\\x2e\\xda\\x09\\xb2\\x4e\\x61\\xe9\\xaf\\xd7\\x99\\x8a\\x09\\x6a\\xa2\\x09\\x35\\xc7\\x28\\x26\\x46\\x03\\xad\\x0f\\xbc\\x4a\\x62\\x62\\xb4\\xd3\\x84\\xc2\\x91\\x8b\\x89\\xd5\\x49\\x93\\xb6\\x58\\x37\\xcf\\x8e\\xcb\\x48\\x63\\xb9\\x64\\x65\\x6c\\x22\\x7c\\x13\\x88\\xd5\\x0a\\xf5\\xad\\x16\\x04\\x01\\xd8\\x74\\xc2\\x99\\x0b\\x5f\\xb6\\x15\\xab\\x36\\x50\\x7a\\x1c\\x19\\x6b\\xa6\\x12\\x04\\xa1\\x0c\\x02\\x3e\\x96\\x1a\\x86\\x8e\\x93\\x09\\x26\\xcb\\xde\\x94\\x2f\\x79\\x50\\x14\\x41\\x55\\x4b\\x9d\\x4f\\xf7\\x8b\\x2b\\x99\\x05\\x01\\xfe\\xef\\xa7\\x8a\\x17\\x89\\x92\\x05\\x4d\\x18\\xf9\\x97\\x7f\\xb1\\xbf\\x48\\x1b\\xa6\\x3c\\x54\\x1e\\x9a\\x84\\xdd\\x6e\\x1a\\xd1\\xd9\\x26\\x5f\\xb6\\x5a\\x85\\x9c\\x91\\xef\\x35\\x01\\xd8\\xfa\\x32\\xf5\\x18\\x7f\\xf2\\x3d\\x00\\xe6\\x0b\\x72\\x9e\\xa5\\xe2\\x6b\\xe7\\x54\\x53\\xe2\\xe7\\xa4\\xc7\\x7b\\xe4\\xd5\\xf9\\x29\\xfe\\x27\\xb4\\x1c\\xf3\\x09\\xeb\\xa6\\xfd\\x79\\x5a\\x58\\x2e\\x1d\\xca\\x2e\\x66\\x63\\x3e\\xa9\\x92\\x7f\\xc8\\x9d\\xbc\\x7a\\xb2\\x49\\x9f\\xa6\\x4c\\x1e\\xc7\\x76\\x97\\xec\\x61\\x9a\\x16\\xd3\\x8c\\xc7\\xdd\\x01\\x75\\xd1\\x2c\\xbb\\x03\\x3a\\xe3\\xf3\\x52\\xff\\xe7\\x59\\x96\\xe6\\x25\\xbc\\xbe\\xd6\\x7f\\xb2\\x54\\x70\\xfb\\x3f\\x29\\xfe\\xd5\\x04\\x9b\\xd4\\x25\\xb9\\x69\\x99\\xcb\\xec\\xfe\\x5a\\x0a\\xfb\\x68\\x1b\\xe8\\x9a\\x49\\xe6\\x37\\x28\\xf8\\x14\\xfe\\x97\\x0a\\xa2\\x5d\\x60\\xe4\\xbc\\xee\\x60\\x4d\\x97\\x6c\\x3c\\xa4\\xdf\\x9d\\x63\\x0c\\xb6\\xce\\x62\\x99\\xa9\\x34\\xcf\\x38\\xc3\\x98\\x62\\xaf\\xbe\\xa3\\xe4\\xfc\\x14\\xdf\\xbd\\x22\\x13\\x3a\\xd5\\x95\\xc9\\x39\\xa0\\x83\\x57\\x9a\\xdd\\x39\\x35\\x8f\\x13\\x9a\\xb1\\xf1\\x13\\xf7\\xea\\x5c\\x69\\x3a\\xe6\\xd5\\xb9\\x2a\\x4c\\xad\\xe2\\xd5\\xf9\\xa9\\x29\\xab\\x9a\\xe4\\xd8\\x5b\\x79\\x7b\\x8d\\xb5\\xe0\\x61\\x42\\x67\\xec\\x81\\x7c\\x4f\\x62\\xfd\\xee\\xe2\\x7c\\x96\\xde\\xe2\\x4b\\x78\\x98\\xd0\\xa4\\xe0\\x09\\xbc\\x3a\\x5f\\x24\\x39\\xbe\\x81\\x87\\x09\\x9d\\xca\\x2c\\x1e\\x9f\\x6d\\x4c\\xc1\\x0e\\x3b\\x95\\xd9\\x75\\x21\\x97\\xa6\\x8d\\xfb\\xe5\\xaf\\x80\\x5f\\x73\\x31\\xc3\\xce\\xe7\\x29\\xcf\\x66\\x25\\x57\\x58\\xbb\\xfa\\x35\\xa1\\x79\\x52\\x24\\x0b\\xac\\x84\\xf2\\x5c\\xac\\x62\\x9f\\x27\\x54\\x15\\x2d\\xd3\\xc0\\x5d\\x68\\x6e\\x80\\xcc\\x15\\xcc\\x22\\x5e\\xea\\xc7\\x54\\x8a\\x78\\x09\\x8e\\xca\\xfa\\x69\\x4a\\xed\\x1c\\xe3\\x29\\x85\\x96\\xfa\\xff\\x5c\\x4a\\xa5\\xff\\xdf\\xf0\\x64\\xa6\\xff\\xcf\\xe2\\x8c\\xaa\\x9b\\x38\\xa3\\xe6\\x60\\xe5\\xd5\\xb9\\xca\\xf1\\x58\\xe5\\xee\\x54\\xe5\\xf4\\x3a\\xce\\xf1\\x4c\\xe5\\xcd\\x23\\x95\\xe3\\x89\\xca\\xdd\\x81\\xca\\xab\\xf3\\x94\\x37\\x8f\\x53\\x8e\\xa7\\x29\\xc7\\xc3\\x94\\xe3\\x59\\xca\\x5b\\xd0\\xce\\x2e\\x39\\xd2\\xa6\\x50\\xe8\\xd9\\x71\\xfa\\x0c\\x08\\x8f\\xcd\\x83\\x80\\x7b\\x17\\x7b\\x14\\x71\\x56\\xfb\\xed\\x24\\x0d\\x75\\x74\\x82\\x6d\\x47\\x86\\x0c\\x15\\xfc\\x9b\\xfa\\x94\\x5e\\x65\\xa9\\xb8\\xae\\x2c\\x74\\xbc\\xc2\\x91\\xee\\xb4\\x82\\xd9\\xeb\\x46\\xa2\\x85\\x4a\\xef\\x24\\xac\\xa4\\x73\\x40\\x53\\x36\\x18\\x09\\x1c\\x00\\x08\\x50\\x07\\xfe\\xa1\\x28\\x65\\x49\\x0f\\xc3\\x56\\x9a\\x68\\xae\\x46\\x2e\\x49\\x93\\x73\\xcd\\xf5\\xa5\\xaf\\x1c\\xad\\xfb\\x00\\xa9\\xde\\x85\\x0d\\x18\\xac\\x4e\\x92\\xf5\\x28\\x61\\xe9\\x5a\\x0f\\x25\\x21\\xb7\\xcb\\xba\\xae\\xf5\\x84\\x9d\\x3c\\x8e\\x05\\xb3\\x6b\\xbe\\xa8\\x34\\x08\\x8c\\x31\\x79\\xc1\\xfb\\x16\\xa8\\x79\\xf6\\x7c\\x6e\\x6f\\x7d\\xc8\\xf9\\xb2\\x05\\x15\\x3c\\x3f\\x2a\\x49\\xb7\\x21\\x00\\x92\\x20\\xf0\\x80\\x6a\\x10\\x84\\x09\\x23\\xde\\x36\\x69\\xae\\xc5\\x01\\xda\\xc6\\xe4\\x2e\\x6a\\x15\\x63\\x02\\x58\\xe2\\x92\\x7f\\x03\\xe8\\x7d\\x10\\x84\\x47\\x3f\\x82\\x43\\x0f\\x31\\xac\\xf1\\x38\\x2d\\x86\\xdd\\x68\\xc6\\x4c\\x80\\xd6\\x8b\\x87\\x6f\\xd6\\x33\\x0e\\x8c\\x1e\\x31\\x78\\xaa\\xc7\\x2c\\x36\\xd6\\x68\\x5c\\xcb\\x35\\x0d\\x4b\\xef\\xfd\\x96\\xff\\xe3\\xc0\\x96\\x97\\x32\\x5f\\xc7\\x0f\\xdf\\x62\\x5e\\xef\\x89\\x7b\\xaf\\x5b\\x08\\x92\\xe7\\x7b\\x95\\x06\\x2d\\x5a\\x4e\\x72\\xf2\\xcf\\x43\\x12\\x35\\xd4\\x05\\x46\\xa7\\x19\\x8e\\x5f\\x9f\\xfc\\xcf\\x49\\xbb\\x5a\\xf3\\xf9\\x71\\x8c\\x64\\xa5\\xd6\\x8c\\x7c\\xbd\\xe6\\x09\\x28\\x36\\xfd\\xcf\\x7e\\x73\\x9f\\xdf\\x70\\x81\\xa6\\x8f\\x09\\x3b\\xfd\\x6b\\xbb\\x5e\\xb3\\xaa\\x15\\x0f\\x9f\\x03\\x89\\xfc\\xfc\\x38\\x12\\xd9\\x70\\x92\\x2d\\x7a\\xbd\\x20\\x00\\xe9\\xd9\\x00\\xb2\\xb1\\x3a\\x7f\\x8f\\x20\\x68\\x8d\\x50\\x5f\\xf9\\x83\\xd4\\x93\\x63\\xee\\xad\\xde\\x4c\\x11\\xdc\\xae\\xa1\\xa9\\x0c\\x0e\\x35\\xe1\\xd8\\x1d\\xea\\xff\\x40\\x78\\xa5\\x7d\\xf0\\xd4\\x70\\x19\\x91\\x37\\x95\\x96\\xd6\\x03\\x9f\\x8f\\x04\\x53\\x1a\\x4e\\xf4\\xcd\\x32\\x9a\\x22\\x74\\x7c\\x71\\x51\\x1a\\x8a\\xc8\\x66\\x22\\xaa\\xf2\\x7c\\xca\\x28\\x2e\\x42\\xac\\x15\\x5d\\x08\\x7e\\x67\\x5a\\xe8\\x72\\xfd\\x2b\\x03\\x45\\xcf\\x46\\xb7\\x9a\\x27\\x37\\xaa\\x4f\\x2f\\x59\\xaf\\x60\\xd5\\x38\\x28\\xe8\\x7b\\x27\\xe1\\xf6\\x87\\x3c\\x8a\\xa7\\x61\\x77\\xe8\\x05\\xe2\\x75\\x1e\\x36\\x1a\\x58\\x0b\\x93\\xd9\\x06\\x93\\xca\\x0e\\xaa\\xdf\\x8b\\xe4\\xda\\x64\\xa2\\x10\\x1b\\xc9\\xe1\\x60\\x0d\\x65\\xaa\\xb8\\x9f\\xdc\\xd3\\xcf\\x12\\xf7\\x56\\x6f\\xa2\\xff\\xd2\\x0f\\xc4\\xfb\\x0b\\xb0\\x4d\\xfe\\xdb\\xdd\\x59\\x1f\\x7d\\xa2\\x33\\xdb\\x08\\xf1\\xe8\\x89\\xe1\\xd7\\xd1\\x68\\x19\\x66\\x9e\\x07\\x5c\\x62\\x93\\x7c\\x7c\\xd9\\x9a\\xa4\\x33\\x96\\xeb\\x88\\x6e\\x08\\xfc\\x76\\xa4\\x7c\\xda\\x5c\\x7a\\xfc\\xbc\\x92\\xa6\\x36\\x16\\x1e\\xbf\\xac\\x24\\xb0\\xcd\\x65\\xc7\\xc3\\xe1\\x81\\xb9\\x03\\x9e\\x1f\\xa6\\x13\\x68\\x98\\xda\\x15\\xd6\\xf2\\x0d\\x50\\x6e\\xd7\\x1c\\xdc\\xa5\\x3e\\xfa\\x78\\x11\\xc1\\xc0\\x76\\xc9\\xf4\\x59\\x83\\xf0\\x0f\\x21\\x79\\x9f\\x0a\\x90\\x6c\\x74\\xf8\\xb7\\x29\\xcf\\xf1\\xd6\\x4c\\xc1\\x52\\x67\\x36\\xea\\x2c\\xc1\\x0c\\x8e\\x77\\x84\\x14\\x27\\x0b\\x5b\\x71\\xc6\\x6f\\x3b\\xbc\\x42\\x0c\\x9d\\xb9\\x2c\\xa0\\xd2\\x7c\\x99\\x65\\x1d\\x88\\x90\\xd2\\x59\\xf0\\xb2\\x4c\\xae\\x79\\x27\\x11\\xb3\\x4e\\x32\\x9b\\x81\\xf1\\x41\\x92\\x75\\x6e\\x78\\x96\\xcf\\x97\\x59\\xc7\\x2c\\xb6\\xec\\x93\\x68\\xa4\\x0f\\x3c\\xcc\\x72\\xca\\xc6\\xde\\x02\\x34\\x75\\x3d\\x18\\xd5\\x66\\xfa\\x93\\xdd\\xb4\\xce\\x7f\\x4b\\x65\\x86\\xde\\x30\\x1d\\xd2\\x53\\x0e\\x06\\x9e\\xfe\\x97\\xf2\\xf4\\x9a\\x6e\\xea\\x68\\xa6\\xe3\\xac\\xd7\\x9b\\xac\\xa3\\x68\\xad\\x6e\\x0a\\x79\\xd7\\x59\\xf6\\xe7\\x45\\xb2\\xe0\\xe5\\xa5\\xfc\\x20\\x73\\x36\\xa4\\xcb\\x56\\x23\\xa4\\xe7\\xc7\\x79\\x64\\xe1\\x8e\\x7b\\x5a\\xc9\\xd5\\x4a\\x81\\x1d\\x43\\x32\\x43\\xb7\\x7b\\x9b\\x79\\xd2\\x47\\xe8\\x36\\x68\\x86\\x49\\x4d\\x22\\x18\\x91\\x82\\xf4\\x38\\x2d\\x98\\xe8\\x78\\xd5\\x20\\xea\\x47\\x61\\x53\\xae\\xef\\x64\\xbb\\x46\\x69\\xbf\\xe4\\xca\\xe5\\x11\\x08\\x05\\x25\\x38\\xc4\\x88\\x44\\xb4\\x68\\x63\\x7c\\xd3\\xb1\\x98\\x18\\x61\\x60\\xb7\\x08\\x02\\x19\\x04\\x68\\xaa\\x0b\\x6c\\x66\\x10\\x84\\x45\\x35\\x60\\xba\\xc8\\x71\\x30\\xd8\\x7c\\xcd\\xaa\\xbe\\xe3\\x89\\x82\\xb4\\x28\\x18\\xbb\\x04\\x2d\\x7a\\x09\\x25\\x4f\\xfa\\x03\\x12\\x45\\x14\\x85\\x17\\x92\\xee\\x54\\x0a\\x8f\\x92\\x1a\\xf9\\x23\\xb7\\x8d\\x17\\x04\\xfb\\x27\\x12\\x04\\x5d\\x8d\\x6c\\x0e\\x99\\x31\\xa1\\x44\\x4f\\xf1\\x38\\xe2\\xe7\\x40\\x5e\\xdf\\xd8\\xfb\\xb4\\xc9\\x22\\x34\\x39\\x7d\\xc1\\x3b\\xa9\\x01\\xd9\\xa6\\x24\\xde\\x44\\x3a\\x95\\xb9\\x0b\\x6b\\x33\\x77\\xd9\\x44\\x12\\xf0\\xf2\\x97\\x64\\xc1\\xf5\\x41\\xdf\\x3c\\xce\\x8f\\x32\\x9d\\x02\\x23\\x9e\\x9f\\x7e\\xf9\\xf0\\xdb\\x25\\x8a\\x83\\xed\\x10\\x41\\x20\\xc7\\x28\\x1c\\x9e\\xac\\x56\\xe4\\xf2\\xed\\x5f\\x2e\\x5f\\x7f\\x7c\\xfb\\xba\\x5e\\xc7\\x92\\x22\\x0f\\x90\\x3e\\x01\\x98\\xfe\\x04\\xe2\\xb4\\xc1\\x7f\\x95\\x2e\\xe0\\x99\\xd8\\x1f\\x27\\xe0\\x94\\x46\\x40\\x28\\xb0\\x48\\xd2\\x4c\\x3f\\x2c\\xa4\\x40\\xa6\\x1f\\x77\\x02\\xc5\\x00\\x65\\x79\\x27\\x8b\\x19\\xf2\\xfc\\xe2\\x1a\\x3a\\x29\\x79\\x52\\x4c\\x6f\\x90\\xc9\\xcf\\x3c\\x5e\\x9f\\xda\\x51\\x96\\x05\\x14\\xdf\\x71\\x0e\\x51\\x60\\xdb\\xae\\xfb\\x1e\\x63\\xae\\x1a\\xd9\\x15\\x04\\x4f\\xec\\x4a\\xf5\\xd7\\xa8\\x5b\\x54\\x6d\\xb7\\xa6\\x72\\x5a\\x35\\x3d\\xe0\\x8b\\xc3\\x54\\x3b\\x2d\\x16\\xe9\\x1b\\xde\\x50\\x54\\x80\\x12\\x2c\\xac\\x1d\\x2b\\xc4\\x67\\x41\\xd0\\x6d\\x2a\\x83\\xd0\\xe4\\xc3\\x38\\x14\\xf3\\xa6\\xc0\\x09\\x6c\\xd4\\xc4\\x58\\x4d\\x98\\x67\\x0e\\xd9\\x94\\x1e\\xb6\\x32\\xb3\\x2f\\x5a\\x38\\x83\\x26\\x96\\x32\\x13\\xf6\\x67\\x00\\xfc\\xe8\\xc6\\x24\\x2a\\xe3\\x4d\\x4f\\xd9\\xdb\\xf6\\xdd\\x5e\\x1c\\xef\\x64\\x81\\xa8\\xb1\\x19\\x43\\x09\\x14\\xec\\x2e\\x2f\\x1e\\xce\\xcd\\xb8\\x63\\x70\\x9a\\x44\\xa0\\x98\\x4c\\x26\\xac\\xd2\\x9b\\x8d\\x93\\x09\\x4d\\xa8\\xde\\xcf\\x9a\\xa8\\x56\\x5a\\xa7\\xe8\\x8a\\x40\\xad\\xaf\\xae\\x6d\\x11\\xc7\\x31\\x00\\x4d\\xbd\\xa7\\x6b\\x2a\\x3c\\xdb\\xca\\x0d\\x2d\\xeb\\x6a\\x15\\xaa\\xb1\\x98\\x30\\xdf\\x68\\x59\\x68\\x08\\xa8\\x11\\x40\\x0b\\xc4\\x78\\xf1\\x18\\x2e\\xa0\\x93\\x84\\xb2\\x25\\xa9\\x3e\\xe5\\x1b\\x06\\x61\\x95\\xf1\\xd7\\xa6\\xa0\\x71\\x8b\\xa6\\x7b\\xaf\\xa9\\xd7\\x8b\\x83\\xa8\\x26\\xba\\x93\\x2b\\x1e\\xd5\\xb9\\xf1\\xc2\\x26\\x16\\x31\\xde\\x0d\\xfa\\x76\\x59\\x69\\x77\\x7f\\x51\\x7e\\x68\\x29\\xbd\\xe3\\x57\\x5f\\x53\\xe5\\xbd\\xa9\\x61\\x99\\xd5\\xea\\x61\\xbd\\x1f\\xd3\\xbc\\x68\\xa1\\x3e\\x3c\\x80\\xe0\\x4d\\x86\\x44\\xa3\\x22\\x08\\x8a\\xbe\\x90\\x77\\xab\\x55\\x58\\xb0\\x1f\\x12\\xc5\\x9d\\x15\\x9a\\x2e\\xed\\x5f\\xa5\\x62\\x16\\x16\\x2d\\x3a\\x6e\\xbf\\x97\\x78\\xf8\\x02\\xb7\\xf0\\x31\\xa6\\x18\\xdf\\x91\\xef\\x7a\\x1a\\x2e\\xf6\\xbe\\x23\\xdf\\xf9\\x1f\\x9a\\x83\\xfa\\xea\\xb2\\x12\\x52\\xbc\\x93\\xc5\\x9f\\x0b\\x79\\x57\\xf2\\xa2\\xed\\x23\\xef\\xaa\\x1e\\x0f\\xff\\xf4\\x0c\\xe6\\x77\\x44\\x52\\xad\\x2d\\x62\\x0f\\xc9\\x4e\\xff\\x3a\\xee\\x7c\\x2e\\x3e\\x8b\\xcf\\xea\\xf3\\x7c\\x72\\xaa\\x79\\xe3\\xf3\\xb0\\x7b\\x72\\xb2\\xca\\x52\\xf1\\x75\\x25\\x24\\x1a\\xcf\\xad\\x16\\x5c\\x25\\x2b\\xf3\\x5c\\xaa\\xfb\\x8c\\x47\\x55\\xab\\xcf\\xa7\\xaf\\x26\\xa7\\x34\\x6d\\xc4\\x46\\xe0\\x9e\\xa0\\x5e\\x41\\xc2\\x1a\\xb2\\x14\\x33\\x3e\\x4f\\x05\\xa8\\x73\\x0d\\xa6\\x7e\\xff\\xe9\\x75\\x9e\\x07\\x01\\xfc\\x83\\x20\\x72\\xbf\\x89\\x32\\x99\\xf3\\x9f\\x35\\xfe\\xb3\\xf1\\x02\\x82\\x20\\x6c\\x76\\xbe\\xb3\\x7e\\xe8\\x91\\xbd\\xf5\\x59\\x44\\x10\\xde\\xc1\\x1d\\x69\\x3c\\x46\\xe5\\x1e\\x2a\\xb2\\xf4\\x35\\x0e\\x1d\\x4d\\x2a\\x31\\xc6\\xbc\\xc2\\x96\\xe9\\x01\\x1c\\xaf\\x44\\x86\\x41\\xe0\\xff\\xb2\\x34\\x3a\\x5a\\x0f\\x72\\xcc\\xd1\\xa7\\x78\\xa9\\x30\\x9b\\xc7\\x39\\x98\\xb1\\x8d\\x07\\x93\\x20\\x48\\x6c\\x71\\x7d\\x1d\\xe4\\xf3\\x72\\xce\\xe7\\x73\\xd2\\xb3\\xd6\\xfc\\x35\\x99\\x27\\x46\\xa8\\x99\\x55\\x9e\\x13\\x17\\xbc\\x6e\\xae\\x18\\xc5\\xa2\\x3f\\x03\\x25\\xe6\\x0f\\x89\\x4a\\xc2\\x01\\x1d\\x46\\x68\\x53\\xd9\\xdc\\xab\\xea\\x4c\\xa6\\x07\\x5c\\xd2\\x7d\\x42\\xc7\\x43\\xce\\xe2\\xfe\\x8b\\x62\\x01\\x24\\x58\\x44\\x9b\\xc9\\x02\\xf3\\xdd\\x3c\\x7c\\x9e\\x34\\x50\\x1f\\xbf\\xa2\\x06\\xc8\\x0e\\x15\\x2a\\xae\\x56\\x1b\\x9f\\x36\\x09\\x39\\x95\\x90\\xcf\\xbb\\x46\\x30\\xef\\xd9\\x21\\x7a\\xc0\\x8d\\xa6\\xcd\\x65\\xc5\\xc3\\x17\\x2f\\xf4\\xd6\\xbe\\x3c\\xce\\x59\\x18\\x8f\\x9f\\xe7\\x3e\\x6a\\xe2\\xda\\x08\\xc0\\xe8\\x62\\x3b\\xa5\\x21\\x34\\x62\\xef\\xb6\\x62\\x4b\\x3e\\x16\\x93\\x2e\\x03\\x87\\x21\\x8f\\x4f\\x73\\xfd\\x29\\xdd\\x5f\\x4b\\xc3\\x20\\xe8\\xb6\\x8c\\x52\\x75\\x60\\xe7\\xd7\\x82\\x71\\x5f\\x1e\\xe7\\xc3\\xeb\\x8c\\xa2\\xba\\x9a\\x51\\xb3\\xee\\x2f\\x36\\x40\\x8b\\xe1\\x0a\\x68\\xe1\\xb4\\xa0\\x00\\x8f\\x1c\\xdb\\xc0\\x84\\x2f\\x55\\x62\\x36\\x7c\\xa2\\x57\\xa1\\xa8\\x55\\x28\\xa0\\xb9\\x63\\x53\\x58\\xa1\\x6f\\xb8\\x42\\xc1\\xb9\\x32\\x02\\x31\\x30\\x13\\x81\\xdf\\xce\\xce\\x45\\x32\\xde\\xff\\x02\\x1e\\xbc\\x50\\x8e\\x8f\\xce\\x86\\xdd\\xba\\xcc\\x75\\x87\\xeb\\x7d\\xb6\\x6e\\x4d\\x09\\xc9\\xcb\\x83\\xcd\\xba\\x8d\\x2f\\x0c\\x38\\x09\\x6d\\x50\\xc3\\xc7\\x78\\x29\\x44\\x54\\x86\\x1b\\x4c\\x99\\xd2\\xa5\\xc6\\xe6\\x56\\x9d\\x0c\\xf1\\xa8\\xd1\\xe6\\x11\\x88\\x3c\\x7b\\x29\\x9c\\x42\\x45\\x1e\\x82\\x7f\\x81\\xa1\\x34\\x7d\\x7b\\xb0\\x4a\\xc7\\x62\\xfd\\x93\\x8c\\x7b\\x8f\\x02\\xbf\\x1e\\x31\\x2e\\x26\\x8c\\x8f\\x8b\\x49\\x45\\xa6\\x3f\\xde\\xed\\xe8\\xe5\\xa3\\x44\\xd0\\xb7\\x4d\\x3b\\x52\\x3f\\x9b\\xb6\\x3d\\x92\\x70\\x28\\x2e\\x52\\x63\\xfc\\x14\\xab\\xbe\\x92\\x68\\x92\\x14\\x3e\\x79\\x56\\xcf\\xe0\\xbd\\xc5\\x0a\\xf5\\x9e\\x16\\xf5\\x9c\\xdd\\x4e\\xe4\\xfc\\xcf\\xa4\\x97\\xd4\\x12\\x45\\x97\\x4e\\x10\\x96\\x18\\xd9\\x97\\xfb\\x7a\\x1b\\xd8\\x98\\x2d\\x83\\xc0\\x19\\x55\\xeb\\x9f\\x20\\x0d\\x46\\xd3\\x5f\\x34\\x35\\x64\\xfa\\x20\\x54\\xf7\\x61\\x59\\xbb\\x0f\\xcb\\xd5\\x6a\\xda\\x42\\xe9\\x3a\\x5f\\x92\\x84\\x72\\x6a\\xcc\\xb3\\x6f\\x34\\x71\\x44\\x07\\x51\\xac\\xb7\\x95\\xa2\\xac\\x27\\xa7\\xb7\\xf4\\x9e\\x5e\\xb3\\x81\\x9e\\xd7\\x06\\x8b\\x66\\x3f\\xfd\\x5b\\x36\\x18\\xbd\\xad\\xdc\\xb9\\xde\\xf6\\x7a\\x51\\xce\\xf8\\xf8\\xed\\x84\\xde\\xb2\\x90\\x80\\x85\\xd8\\x85\\xea\\x2d\\xe2\\x9b\\xa8\\x27\\xc3\\x9c\\xbe\\x8d\\xe8\\x3d\\x13\\xbd\\x6b\\x7a\\xdd\\x63\\x65\\x88\\x43\\xe8\\xad\\xa8\\xa4\\x6c\\x6f\\xd8\\xcc\\x38\\xdf\\xbf\\xc1\\x0d\\xfa\\x48\\xaf\\xd8\\x1b\\x7b\\xf8\\xa0\\x1c\\x84\\xf5\\x5c\\xa8\\x22\\xe5\\xa5\\x9b\\xc8\\x37\\x36\\x18\\x75\\xc3\\x8f\\xec\\x0a\\xb4\\x84\\x61\\x14\\xf5\\x67\\x52\\xf0\\x51\\x94\\xb3\\x8f\\xfd\\xdb\\x24\\x5b\\xf2\\xf6\\x09\\x7d\\xeb\\xf5\\x76\\x4d\\xa9\\x03\\x5a\\xc9\\xb6\\x7e\\x61\\x6e\\x77\\xb6\\xf3\\xd1\\x5d\\x10\\x84\\x39\\xbb\\x1b\\x0f\\x5b\\x16\\x9e\\x86\\x77\\xe3\\xc1\\x24\\xea\\x2d\\x60\\xc4\\xc1\\x96\\xf1\\xa2\\x35\\x22\\xfc\\x3a\\x10\\x5b\\x46\\x0f\\xf3\\x10\\x54\\x01\\x95\\xb6\\xd2\\xe4\\xee\\xcd\\xfa\\x26\\x2c\\xaf\\xde\\x17\\xbb\\x0d\\xef\\xf5\\xf5\\xfe\\x12\\x7d\\x69\\x02\\xf8\\xf7\\x11\\x4c\\xf0\\xcb\\xf8\\x7d\\xeb\\x04\\xdf\\x1f\\x30\\x3b\\x9b\\x2d\\xac\\x96\\x4b\\xbd\\x96\\xa0\\xd9\\xda\\x3b\\x0f\\x62\\x7d\\xcc\\x09\\xa1\\x83\\x2a\\x42\\xc0\\xb4\\x95\\xb3\\xca\\xbc\\xd2\\x77\\x45\\x72\\x5d\\xcf\\x5b\\x57\\x33\\x12\\xfe\\x31\\x11\\xb3\\x8c\\x97\\x55\\x8a\\xa7\\x6b\\xae\\x7e\\x32\\x66\\x2f\\xef\\x44\\x95\\xdc\\xc9\\x17\\x45\\xdc\\x6c\\x48\\xe6\\xf3\\xfe\\xa7\\xb7\\x1f\\x5e\\x7f\\x7c\\x7d\\xf9\\xeb\\xc7\\x88\\x2e\\x18\\x89\\x09\\xbd\\x65\\x0f\\x44\\x3f\\xb0\\x01\\xa1\\xa4\\xaf\\x1f\\x86\\x84\\x92\\x58\\x3f\\x9c\\x91\\x35\\xbd\\x67\\xa7\\x63\\xd6\\x8f\\xeb\\x76\\xe1\\xcb\\xed\\x4c\\x5f\\x7d\\x2d\\xf1\\x70\\xf0\\x64\\xc3\\xde\\xd9\\x2e\\x25\\x1e\\x0e\\x9e\\xd1\\x8d\\x95\\xc4\\x43\\x14\\xed\\xef\\x97\\xc1\\xbf\\x3c\\xcc\\x71\\xb6\\x35\\xda\\xa0\\x64\\xc5\\x26\\xbf\\xb5\\x19\\x11\\x0c\\x86\\x69\\x61\\x5a\\xab\\xa6\\xd0\\x7b\\x96\\x5e\\xe1\\x12\\x49\\x84\\x3d\\x55\\x05\\xf1\\x33\\xa4\\x97\\x5a\\xf8\\xc5\\x9a\\xb6\\xb9\\x61\\x0e\\x60\\xe2\\x45\\x3f\\xac\\x1d\\x34\\xb6\\x30\\x00\\x23\\x48\\x93\\x31\\x5e\\x92\\xce\\xbb\\x34\\xe3\\x13\\x12\\xd7\\xca\\xfe\\x9c\\xc9\\xab\\x66\\xd9\\x3b\\x59\\x2c\\x34\\x6d\\x3d\\x21\\xb1\\xa3\\xc0\\x4c\\x7c\\x8e\\xd8\\xe1\\xf8\\x56\\x68\\x0f\\xca\\x61\\x94\\x99\\xd4\\x60\\x79\\x6a\\x8c\\x66\\xbb\\x89\\x07\\x57\\xad\\xd1\\xf7\\xb8\\xf2\\x9a\\x32\\xd4\\x9d\\x41\\x36\\x63\\x31\\x09\\x02\\x85\\x1e\\xba\\x5c\\x4c\\xe5\\x8c\\xff\\xf6\\xf1\\xa7\\x4a\\x01\\x27\\xa2\\x1e\\x61\\xa4\\xd7\\xf2\\x86\\x03\\x9d\\xe7\\x5c\\xbf\\xfa\\x7f\\x93\\xa9\\x08\\x49\\x40\\xea\\xd8\\xc5\\xf3\\xb8\\xd5\\x68\\x86\\x3d\\xac\\x35\\x09\\x0f\\xe9\\xf0\\x15\\xd4\\x36\\xa6\\x10\\xd2\\x82\\xec\\xe4\\x3c\\x1d\\xf5\\x7a\\x49\\x24\\x98\\x1c\\x27\\x13\\xaa\\x98\\xb0\\x95\\x19\\x89\\x68\\x31\\x9e\\xf1\\x8d\\x99\\x68\\x46\\x28\\x9a\\xb0\\xd6\\x37\\xc3\\x89\\x27\\x6e\\xf2\\x21\\x85\\x13\\x05\\xa2\\x0e\\xc5\\xcd\\xe9\\xf4\\x73\\x71\\xf1\\x59\\x9c\\x42\\x98\\x96\\xf5\\x28\\xe9\\xe7\\x32\\x0f\\x2b\\x78\\x56\\xb2\\x01\\x5d\\x32\\xcb\\x35\\x8d\\xca\\xf3\\xe5\\xa8\\xd7\\x2b\\x23\\xc1\\x92\\x71\\x89\\x93\\x4d\\xc5\\x8c\\x7f\\xfb\\x75\\x1e\\x92\\x18\\x14\\x08\\xc2\\x78\\x43\\x0e\\xa8\\x6a\\x28\\xba\\xa9\\x64\\xf7\\xa1\\x7d\\xad\\x7a\\xc3\\x28\\xa2\\xa9\\xa6\\x50\\x9c\\x7b\\x71\\x5a\\xcd\\x77\\x5a\\x53\\xa0\\x9b\\x89\\x76\\xbe\\x1f\\x75\\xbe\\x3f\\x8d\\xfa\\x60\\xb3\\xe8\\xfb\\xd9\\x65\\x5e\\xed\\x45\\xd8\\xac\\xdf\\xf0\\x2d\\xb6\\x41\\x63\\x5c\\x25\\x06\\x95\\x60\\xe6\\xd8\\x31\\x95\\xd5\\xb3\\xdb\\x4b\\x50\\x7c\\x84\\x1c\\x26\\x1c\\x51\\xae\\x09\\x72\\x6f\\x06\\x39\\xf6\\xad\\x34\\x8d\\xf7\\xb0\\xb6\\xd9\\xee\\xff\\x6e\\xc3\\xbb\\x7e\\xbb\\x31\\x81\\x5b\\x0b\\xfe\\x77\\xfd\\x03\\x4b\\x35\\xbf\\xc5\\xc8\\x8f\\x6f\\x5f\\xff\\xa0\\x59\\x7f\\xfb\\x7a\\x01\\x39\\x86\\x35\\xd5\\x09\\xb4\\x81\\x69\\xde\\x2f\\x78\\x99\\x4b\\x51\\x02\\x06\\x5a\\xad\\x80\\x57\\xdb\\xfa\\x3e\\x5a\\xad\\x2a\\x6d\\x5e\\x5b\\x85\\x8b\\xcd\\x52\\xc8\\x1a\\xeb\\x42\\x40\\x96\\x2a\\x51\\x4b\\x70\\xee\\xad\\xcd\\xdb\\x2b\\x37\\xf5\\xb8\\xfa\\x04\\x45\\x55\\xb2\\xf1\\xd0\\xf5\\x8d\\x95\\x4d\\x14\\x93\\x1b\\x9e\\xcc\\xb8\\xd9\\x05\\x7c\\x2e\\xd9\\xb2\\xaa\\x7b\\xcd\\xd5\\xeb\\x2c\\xfb\\x68\\x66\\xf3\\x23\\x56\\x00\\x27\\xb3\\xaa\\xc1\\x98\\x98\\x54\\x9e\\x27\\x9a\\x64\\x23\\x13\\xe6\\xb7\\xae\\x37\\x0d\\xeb\\x55\\x23\\x37\\x5b\\x7c\\xdd\\x9c\\x2d\\xf6\\x6f\\x6a\\x5d\\xc9\\xd9\\xfd\\xb6\\xcf\\x82\\x1b\\x97\\x27\\x45\\xc9\\xff\\x2c\\x67\\xf7\\xa1\\xfb\\x8e\\x17\\xee\\x29\\xde\\xd8\\x5b\\x1b\\x26\\xc3\\x1e\\x96\\x59\\x33\\x4e\\xe6\\xe8\\xc6\\x8b\\xa9\\x61\\x22\\xb5\\xfc\\x7d\\xc9\\x8b\\x7b\\xe6\\x3d\\xaf\\x56\\x36\\x8a\\x0b\\x4e\\xc5\\x9e\\xad\\x65\\x91\\xd9\\x78\\xc1\\x66\\x8f\\xed\\x01\\xfc\\xd2\\xf8\\x2d\\x45\\x48\\x20\\xf9\\xb6\\x27\\x0a\\xc2\\xf8\\xa2\\xf8\\xe1\\x8d\\xb1\\x4f\\x71\\xff\\xa0\\x40\\xad\\x9a\\x87\\xc2\\x72\\x1b\\x1e\\xd5\\xee\\x6b\\x5c\\x3f\\xe8\\x8d\\x28\\x3a\\x69\\xd9\\x59\\x8a\\xe4\\x2a\\xe3\\x1d\\x25\\x3b\\xb0\\x39\\xa0\\xef\\xb5\\xeb\\x27\\x10\\xda\\x53\\x17\\xb3\\xee\\x80\\xf2\\xbe\\x2c\\xd2\\xeb\\x54\\x24\\x7a\\xda\\x02\\x16\\x7e\\x95\\x4c\\xbf\\x6a\\xc8\\x0e\\xf6\\xd2\\x7c\\xa1\\x61\\x9f\\x6b\\x8b\\x51\\x15\\x2a\\x3b\\x05\\x57\\x9d\\x2a\\xa0\\x46\\x95\\x39\\x66\\xaf\\xd8\\xd9\\x60\\xa0\\x01\\x3b\\xfe\\x3c\\x7f\\x32\\x18\\x6c\\x6b\\x85\\x58\\xb9\\x5a\\x86\\xf2\\x8e\\x35\\x78\\x2f\\x94\\xcb\\xe9\\x94\\x97\\xe5\\x7c\\x99\\x75\\x7e\\xbc\\xbc\\xfc\\xe0\\x2d\\x64\\x54\\x54\\xb3\\xe7\\xb4\\xfa\\xc4\\x4c\\x51\\x7b\\xde\\x99\\xed\\xae\\xb6\\xb8\\xd5\\xaa\\xa0\\x2a\\xf2\\x41\\xc6\\xdc\\x67\\x86\\xda\\x6c\\x92\\xc1\\xfc\\x63\\x16\\x92\\x7f\\x7d\\x7b\\x49\\x28\\x8f\\xfa\\x5c\\xcc\\x42\\x15\\xc5\\x43\\xc6\\x12\\xe3\\x40\\x58\\x5a\\x61\\x56\\xbd\\x66\\x8c\\x3f\\x75\\xf7\\x40\\xfa\\x41\\x6e\\x4d\\xbd\\xad\\x0a\\x84\\x45\\x90\\x4d\\xb3\\xe0\\xb3\\xe5\\x14\\x33\\x68\\x7a\\x3c\\x8f\\x1b\\xdc\\x98\\x62\\xe9\\x63\\xb3\\x5a\\x95\\x3c\\x9b\\x1b\\xc3\\xaa\\xd1\\x5c\\xdf\\xb5\\xbf\\xfc\\xf8\\xd1\\xf7\\x74\\xd4\\x28\\x38\\xec\\xde\\xf6\\xff\\xf2\\xfe\\xe7\\x1f\\x95\\xca\\x3f\\xf2\\xbf\\x2f\\x79\\xa9\\x56\\xab\\xdb\\xbe\\x0d\\x4a\\x19\\x04\\x64\\x9e\\x66\\x3c\\x26\\x8c\\x55\\x85\\xc8\\xe0\\x4e\\x65\\x16\\x04\\xb7\\x7d\\xcc\\x1c\\xfb\\x17\\xc4\\xf2\\x55\\xaa\\x08\\x7e\\xd7\\xa9\\xf7\\x3a\\xf2\\xd8\\x64\\xfd\\xb6\\xd6\\x2e\\x24\\xef\\xd3\\x69\\x21\\x4b\\x39\\x57\\x30\\x99\\xcb\\xcb\\x0f\\xc4\\xe7\\x97\\xf7\\xb4\\x2d\\xbf\\x2d\\xb2\\x33\\xdb\\xb0\\xff\\xac\\x3f\\x78\\x7c\\xe3\\x27\\xff\\x1f\\x8d\\x6b\\x0d\\x1d\\x65\\x84\\x69\\x3c\\x18\\x21\\xe0\\x7e\\x7b\\xd1\\xe6\\x3a\\x6a\\x1c\\x73\\xd7\\xdb\\x02\\x16\\x1a\\x23\\x88\\xf0\\xaf\\x9f\\xcb\\xef\\x57\\x9f\\xcb\\xef\\xff\\x39\\x3a\\xbd\\xa6\\x84\\x44\\xeb\\xd1\\xbc\\x5f\\xf2\\x02\\x63\\xf0\\xe0\\x9c\\x58\\x4a\\xe7\\x78\\x65\\x91\\xf6\\x63\\x90\\xfd\\xf9\\x3e\\xe7\\x25\\x7b\\xb8\\x51\\x8b\\x0c\\x13\\xc9\\x9f\\xea\\x47\\x42\\xff\\x56\\x4a\\x11\\x93\\x24\\xcf\\xb3\\x14\\xbf\\xec\\xa9\\x2e\\x21\\xf4\\x9b\\xae\\xe7\\x17\\x7f\\xd3\\xb5\\x97\\x45\\x86\\xc4\\xd5\\xac\\xf1\\xf2\\xe4\\xee\\xee\\xee\\x64\\x2e\\x8b\\xc5\\x49\\x55\\x85\\x50\\x08\\x18\\x75\\x48\\x45\\x02\\x25\\xb3\\x44\\x25\\xe4\\x90\\xfa\\x6b\\xea\\x2d\\x9a\\x3d\\x1c\\xd0\\x22\\x4e\\xe9\\xe6\\x22\\xe3\\xff\\xfa\\xe9\\xd7\\x5f\\xfa\\x28\\x02\\x48\\xe7\\xf7\\x6b\\xbb\\x6d\\x87\\xf5\\x58\\x6e\\xed\\x11\\x3a\\x59\\xd3\\xdc\\x93\\x02\\x5d\\xf3\\x56\\x8f\\x61\\x1f\\x41\\xf2\\x3a\\xc5\\x35\\xa9\\x77\\xd0\\x82\\xfe\\x36\\x35\\xaf\\x6c\\x07\\xc2\\x5d\\xad\\x08\\xc1\\xa0\\xd2\\x20\\xd6\\x9b\\x86\\x06\\x98\\x0a\\x96\\xe9\\x47\\x4b\\x33\\x16\\x9a\\xde\\x16\\x18\\x8a\\xba\\x98\\x30\\x70\\x5d\\xa9\\x4d\\xc4\\xe1\\xcf\\x96\\xe1\\xcd\\xfe\\x8d\\xdd\\x30\\x13\\x2f\\xd8\\x02\\x87\\xa4\\x39\\x08\\xf4\\x56\\xab\\x16\\x6d\\x76\\x74\\x01\\xc6\\x6d\\x80\\x6f\\x9b\\x6b\\x6f\\x12\\x2a\\xb5\\xc1\\x87\\x67\\x67\\x4f\\x8c\\x3d\\x0b\\x67\\x67\\x83\\xa7\\x91\\x61\\x23\\xf8\\xe9\\x70\\x30\\x58\\x0d\\x46\\x1e\\x55\\x64\\x11\\xaf\\x41\\x1a\\x7a\\x27\\x94\\x8d\\x39\\x36\\x97\\x6c\\xc8\\xec\\x4f\\xf9\\x95\\x9d\\xb9\\x1f\\x18\\x6d\\x13\\x10\\x0e\\x7b\\xea\\x4a\\x4b\\x5e\\xdc\\xf2\\x02\\x4b\\xff\\xe4\\x4a\\xc1\\x46\\x8a\\x85\\x4f\\x41\\x64\\xa8\\x8b\\xa3\\x20\\xc0\\xfd\\x90\\x88\\xb1\\x0c\\x91\\x90\\x4c\\xa7\\x3c\\x57\\x7c\\xc6\\xce\\x06\\x67\\xcc\\x4e\\x4b\\x48\\x2b\\xe1\\x3f\\x1b\\x3c\\x75\\xa5\\x57\\xc9\\xcc\\x40\\x50\\xf6\\x74\\x30\\x70\\xc5\\x4b\\x91\\x2c\\xd5\\x8d\\x2c\\xd2\\xff\\xc5\\x67\\xec\\xe9\\x60\\xe8\\xf5\\xa2\\x5e\\x43\\xef\\x1a\\xad\\xb3\\xa7\\x83\\x67\\xfe\\x9b\\x77\\x72\\x29\\x74\\xf5\\xaa\\xfb\\xb9\\x2c\\xae\\xd2\\xd9\\x8c\\x0b\\xf6\\x74\\xf0\\x84\\xb1\\xc6\\xc9\\x35\\xd3\\x66\\x1b\\x74\\x87\\xa5\\xae\\x28\\x04\\xd7\\x00\\xb2\\x06\\x1c\\x34\\x97\\x45\\x46\\x0b\\x46\\xa6\\x89\\x10\\x52\\x75\\x48\\x4f\\xf5\\x48\\x87\\xf4\\x44\\x8f\\x74\\x42\\xd2\\xf3\\x36\\xbf\\x47\\x22\\xa2\\xa9\\x75\\x87\\xca\\x0b\\x2f\\xfa\\x89\\x45\\xc7\\x55\\x75\\x2a\\x2d\\xed\\xa4\\xa8\\x04\\xc2\\x49\\x50\\xa9\\xaf\\xac\\x25\\x1e\\x59\\x4e\\x6f\\xc2\\x99\\x1f\\x93\\xdc\\xfb\\xd1\\x5f\\x96\\xbc\\xd5\\x65\\xdf\\xa3\\xdb\\xd6\\xb5\\x06\\x2a\\x5d\\x70\\xb9\\xdc\\x7e\\x6b\\xbf\\xd8\\x0a\\xbc\\xa5\\xf1\\x34\\xe3\\x49\\x71\\xd9\\xec\\x61\\x4b\\x07\\x03\\xea\\x57\\x0f\\xab\\x97\\x45\\xdb\\xbc\\x92\\x2b\\x59\\xa8\\x26\\x06\\xc7\\x13\\xa5\\xdf\\xf0\\x59\\xe4\\x0f\\x62\\xca\\x5c\\x64\\x3d\\x4d\\xda\\x42\\x99\\x3d\\x86\\xb5\\xa1\\x4d\\x19\\x52\\x71\\x50\\x8d\\xb4\\x4d\\xa1\\xac\\x01\\x33\\xa3\\xaa\\x00\\x3e\\xfe\\xa1\\xc1\\xb6\\x5b\\xca\\x1d\\x2c\\x2a\\x44\\xc5\\xdd\\x42\\x9f\\xb5\\xcd\\xd8\\x02\\x04\\xeb\\xd4\\xf1\\x98\\xdb\\x82\\xfa\\x84\\x96\\xa2\\x6c\\x87\\xaf\\xa8\\x15\\xdc\\x3d\\x04\\xf5\\x2b\\xb9\\x71\\x5a\\x46\\xb9\\xb6\\x20\\x78\\xfb\\x99\\xd8\\x0a\\xca\\x6b\\x27\\x4b\\x43\\x9d\\x6d\\x5d\\xe8\\xcd\\x22\\x06\\x08\\x9c\\x68\\xf8\\x44\\x2c\\xf2\\x1e\\xf3\\xc9\\x6a\\xc5\\x5b\\x8f\\x04\\x5c\\xf6\\xdd\\x5d\\x22\\x40\\x38\\xa4\\xb3\\xa5\\xba\\x69\\x4d\\x0a\\x70\\xa5\\x64\\x12\\xf2\\x1e\\x89\\x49\\x4f\\xd5\\x3e\\xa4\\x19\\xc0\\xc0\\x22\\xc0\\x86\\x84\\x92\\x3f\\x27\\x65\\x3a\\xd5\\x17\\xbf\\x6d\\x10\\x64\\x90\\x36\\x27\\x6c\\xe5\\xf1\\x5d\\xcf\\x50\\x2e\\xe4\\x2c\\x45\\x2b\\x13\\x03\\x48\\x91\\xa5\\x32\\x42\\xa0\\xb6\\xde\\xc1\\xbd\\xa9\\xb1\\x86\\xda\\x67\\x9a\\x1b\\x71\\xd6\\x6a\\x15\\xd6\\x0b\\x00\\x1a\\xdd\\xf6\\xad\\xb8\\xcb\\xf2\\x73\\xf6\\x75\\x3f\\xc9\\x73\\x4d\\xc9\\x43\\xb8\\xb8\\x96\\xad\\x53\\x2a\\x99\\xde\\x6c\\xf8\\xeb\\xff\\xde\\x43\\xd3\\xd6\\x2d\\x2d\\xb9\\x98\\xb5\\xa0\\xe4\\x04\\x6c\\xc2\\x5d\\xa8\\x52\\xcb\\x61\\xd7\\x4e\\x18\\xf2\\x62\\x41\\x90\\x98\\x29\\x69\\x3a\\xac\\xd2\\x52\\x14\\xde\\x55\\x86\\x57\\x4e\\x33\\xd5\\x6e\\xce\\x7e\\x11\\x8a\\xd5\\xca\\x51\\x00\\x21\\x90\\x76\\x64\\xff\\x1c\\x68\\x35\\x00\\x3b\\x80\\xfc\\x62\\x4c\\x5c\\x54\\x2d\\xbc\\xc7\\x1e\\x09\\x48\\x8f\\xc7\\x3c\\xf6\\x16\\xa3\\x69\\x9f\\xa8\\xc7\\xa3\\xd8\\x1b\\xc3\\x46\\x10\\xe8\\xaa\\xd5\\x4a\\x86\\x3c\\x82\\x2e\\xe2\\xc6\\xdc\\x81\\xa8\\xc3\\xa9\\x45\\x0d\\x08\\x6f\\xb8\\xc3\\xad\\xf9\\x33\\xfa\\x5f\\x6c\\x95\\x51\\x1b\\xa0\\xc5\\xfa\\x8d\\x3e\\x0b\\x59\\x96\\x3f\\xc8\\x45\\x92\\x8a\\x2d\\x38\\xd7\\x63\\xdf\\x7f\\x05\\x56\\x56\\xb3\\xef\\x1a\\xcd\\x26\\x59\\x26\\xef\\xf8\\xac\\x73\\x75\\xdf\\x79\\x0d\\xfc\\xef\\x89\\x71\\x22\\x3e\\x79\\xad\\xdf\\x9c\\x60\\x6d\\x12\\x8d\\x6a\\xa3\\x38\\xb4\\xe0\\x33\\xf2\\x6d\\x58\\x70\\x17\\x09\\x60\\xf1\\x18\\x55\\xfe\\xf4\\x4c\\x61\\x47\\xce\\x3b\\xe0\\xb7\\xba\\x28\\xc1\\x06\\x9d\\xeb\\x6f\\x17\\x8d\\x54\\xbf\\x8e\\x3d\\xab\\x09\\x34\\xf7\\xe4\\x2e\\x55\\x37\\x6f\\x0a\\x0e\\x3e\\xfa\\x49\\xb6\\x2d\\x48\\x4f\\xff\\x4b\\xb3\\x9e\\x59\\x59\\xbd\\xb3\\xf6\\x2b\\x62\\xdd\\xbf\\xad\\xb0\\xcf\\xb2\\xc9\\x61\\x44\\x13\\x5f\\x88\\x53\\x09\\x8d\\x69\\xda\\x58\\xba\\xa1\\x54\\xbc\\xdb\\x5d\\x9d\\xb4\\x51\\xfd\\x34\\x30\\x10\\x27\\x88\\xbe\\x14\\x05\\x4f\\x66\\xf7\\x9a\\xb8\\xe1\\x18\\x96\\xbc\\x81\\xd4\\x9f\\x62\\x5e\\xa6\\x64\\x76\\x8f\\xae\\xe7\\xb8\\xe7\\xc0\\x43\\x73\\x26\\x0c\\x55\\x54\\x89\\x78\\x38\\x1b\\xac\\x31\\x61\\x23\\x0a\\xd6\\x71\\x8b\\x67\\x72\\x59\\xf9\\x47\\xd7\\xbe\\x66\\x68\\x24\\x30\\x75\\xaa\\xa1\\x92\\x90\\x37\\x0f\\x63\\x08\\xe6\\x33\\x40\\x19\\x70\\x31\\x23\\xd1\\x1a\\xb9\\xda\\x65\\x6d\\x43\\x35\\xe2\\x53\\x49\\xf6\\x6a\\x00\\xb4\\x7e\\xce\\x8b\\xa9\\xa6\\x65\\x39\\xe4\\x3a\\xe5\\xb3\\x53\\xf3\\xfa\\xfb\\xe1\\x60\\x00\\xa6\\x26\\xd0\\x5b\\x5e\\xc8\\x6b\\x08\\x7b\\x81\\xc1\\x4a\\x00\\x0b\\x27\\xa5\\x35\\xa8\\x2f\\xbd\\x0a\\x60\\xbc\\xda\\x97\\xc2\\x16\\xb0\\x65\\x04\\xdb\\x21\\xfa\\xcb\\x5c\\x8f\\x60\\xf0\\xc3\\xce\\xd6\\x58\\xb3\\xde\\x89\\xc7\\xb2\\xa7\\xf3\\x30\\x0d\\x82\\xae\\x47\\x83\\x05\\x81\\x4f\\x91\\xb1\\x92\\x2b\\x7b\\x89\\xbd\\xcf\\x55\\x6d\\x36\\x1c\\x3c\\x4b\\x62\\xad\\x69\\x1a\\x45\\x34\\x01\\xb7\\xbf\\x0d\\x36\\x3d\\xb4\\x30\\x7e\\x59\\x64\\x3d\\xf6\\x6f\\xf6\\xb1\\x92\\xc9\\x5f\\x90\\xe8\\x42\\x03\\xb3\\x24\\x26\\x17\\xa4\\x97\\x44\\xfa\\xd0\\xe4\\x5c\\x84\\x9e\\x1c\\xd1\\x75\\x40\\xbb\\x03\\x0b\\x41\\x1b\\x37\\x01\\x56\\xbd\\x79\\x3b\\x22\\x0a\\x12\\x27\\x23\\x24\\xb5\\x72\\xeb\\x9a\\xe4\\xd4\\x15\\x36\\x91\\x72\\x19\\x04\\x5d\\x19\\x96\\x26\\x1d\\xd9\\xd4\\x5f\\xda\\x78\\x37\\x90\\x9f\\x8c\\xa6\\x41\\x10\\x96\\x6c\\xaa\\x5b\\x3b\\x13\\x88\\x0c\\x2c\\x6e\\x3c\\x59\\xae\\xb1\\x76\\xf1\\x08\\xb2\\x6c\\x12\\x04\\x42\\x13\\x1a\\x86\\x11\\x32\\xdd\\x67\\xb4\\x5e\\xa9\\x4e\\x97\\x58\\x69\\x24\\xb4\\x20\\x08\\xc5\\xa9\\x00\\x4c\\x19\\x3a\\x9a\\x5f\\x33\\x10\\xc8\\x5b\\xcd\\xe8\\xbc\\xc1\\xa7\\xd7\\xcc\\x9c\\x9d\\x88\\x6e\\xb4\\x5d\\xec\\xa7\\x37\\x9b\\x29\\x23\\x8d\\x8d\\xa8\\x0a\\x82\\x02\\x69\\x9d\\x50\\x45\\x54\\xe8\\x5f\\x7a\\x6c\\x11\\xd1\\x42\\x0f\\xac\\xa7\\xbd\\x7d\\x34\\xf8\\x14\\xc7\\x0f\\x57\\xa2\\xa8\\x71\\x73\\xb4\\x19\\xcf\\x5a\\x91\\xd5\\x3c\\x24\\x3f\\xbc\\xfd\\xf9\\xed\\xe5\\x5b\\x6f\\x30\\xdd\\xb5\\xe8\\xdb\\x9e\\x50\\x30\\xa2\\x5a\\x48\\x1b\\x37\\xd9\\x0f\\xaf\\x2f\\xdf\\xfc\\xf8\\x7b\\xce\\x36\\x97\\xe5\\x8e\\x2f\\xf1\\xe1\\xd7\\x4f\\x8f\\xf9\\x14\\xdb\\x47\\x5b\\xee\\x1a\\xec\\xb7\\xdf\\x71\\xac\\x4a\\xf7\\x3b\\x5f\\xd3\\x07\\x23\\xd8\\x8d\\x87\\x2f\\x9f\\x53\\x94\\xea\\xc6\\xc3\\x97\\xa8\\xf2\\xdd\\xeb\\x8c\\x92\\xce\\x43\\x27\\x5b\\x97\\xe1\\x46\\xd8\\xd3\\x5a\\x6e\\x31\\x2f\\x8b\\x5c\\xc4\\xc7\\x6a\\xc2\\xbc\\x82\\xb1\\x9a\\x54\\x6e\\xe5\\x9e\\x31\\x11\\xf5\\xea\\xf4\\xa5\\xf0\\x9b\\xf4\\x9b\\x6e\\x4f\\xbb\\x88\\x6d\\x8b\\xf8\\xca\\x06\\x59\\x54\\x82\\xb6\\x2d\\x6c\\x14\\x02\\x8b\\xb7\\x51\\xb4\\x5a\\x8d\\x27\\x91\\x0b\\xcc\\x8c\\x17\\xb7\\x3e\\xbd\\x29\\x6f\\xcc\\xc1\\xed\\x06\\x90\\x0a\\x7d\\x39\\x9f\\x87\\x1c\\x28\\x67\\x13\\xf2\\x19\\xb0\\xbe\\x13\\xc6\\xa3\\xb0\\x1d\\x55\\x5c\\xa3\\x23\\xa6\\x2f\\xfa\\x73\\xe1\\x44\\x46\\xc2\\x8c\\xb0\\x39\\xbd\\xf9\\xbc\\xb6\\x7d\\x68\\xbd\\xea\\x36\\x6f\\xf3\\xd5\\xeb\\x2c\\x73\\x28\\xac\\xe5\\xf5\\xae\\xbd\\xb7\\x81\\xdc\\xf7\\x4c\\x7c\\xb0\\xa9\\x89\\x88\\xb6\\xac\\xdb\\xa8\\xa0\\x46\\x6d\\xb4\\x6d\\x69\\xd3\\x56\\x0b\\xbf\\xb5\\x2e\\x69\\x51\\x75\\x44\\x6d\\x5c\\xb9\\xdf\\x13\\x8e\\xe3\\x18\\x0f\\x2a\\xd9\\x60\\x24\\xcf\\x85\\x55\\x60\\xcb\\x5e\\x2f\\x4a\\xe7\\x61\\x58\\x30\\x31\\x96\\x93\\x08\\xad\\xf2\\x0a\\xfd\\x05\\x18\\x53\\xd1\\x03\\xea\\xde\\xc1\\x57\\x7b\\x18\\x61\\x96\\xe1\\x75\\x2d\\x90\\xa3\\xbf\\x91\\xfa\\xe6\\xd5\\x48\\x97\\x03\\x36\\xcd\\x59\\x27\\xf8\\x46\\x7d\\x6e\\x91\\x74\\xe8\\x98\\x9c\\x8d\\xed\\x11\\xd1\\x83\\xa8\\xb4\\xeb\\x9e\\xb4\\x95\\x0d\\x40\\x61\\x6d\\x03\\x7a\\x9f\\xcb\\x51\\xaf\\x57\\x80\\xf1\\x9f\\x7f\\x4c\\x55\\xb4\\x7d\\x21\\x99\\x3b\\x27\\x5b\\xa5\\x12\\xbb\\x4f\\x42\\xfb\\x6d\\xab\\x0f\\xe2\\x93\\x54\\x2d\\xe3\\x98\\xa4\\x11\\x6e\\x2a\\x21\\x8f\\xcc\\x92\\xd6\\xd6\\xf8\\xb5\\xc5\\xb0\\xdf\\x03\\x85\\x4d\\x40\\x57\\xdb\\x1e\\xee\\x82\\x49\\xb0\\x27\\x6d\\xfa\\xb3\\x98\\x8f\\x8b\\x5e\\x6f\\x02\\xbb\\x17\\x25\\xce\\x87\\x07\\x72\\xfb\\x50\\xcd\\xa8\\xd2\\x5e\\xaf\\xf0\\x70\\x5b\\xe2\\x26\\xf5\\xb8\\xb0\\x12\\x41\\xc0\\xfb\\x5f\\xbe\\xf0\\xf2\\xbd\\x9c\\x2d\\x33\\x7e\\xc1\\xe3\\x07\\x6b\\x0a\\xc3\\xd7\\x6b\\xe3\\x1e\\x84\\x4a\\xb9\\xca\\x44\\x98\\x92\\xaa\\x05\\xa1\\x0f\\x60\\xf7\\x16\\x77\\x07\\x6b\\xeb\\xcb\\x01\\x5a\\x3d\\x30\\x01\\xa2\\x09\\x2b\\x42\\x69\\xbc\\xaf\\xa1\\xec\\xa4\\x90\\x4b\\xd4\\xfe\\x19\\x83\\x21\\x17\\xce\\xb9\\x3c\\x15\\xc9\\x6d\\x8a\\x59\\x2f\\xfb\\x60\\xde\\xb5\\x64\\x85\\x26\\x6d\\x8c\\xc1\\xd8\\x9c\\xab\\xe9\\x0d\\xbe\\xc8\\x58\\x11\\x4e\\xa3\\x91\\x4b\\xab\\xc3\\x12\\xfb\\x54\\x8f\\x34\\x5d\\x8b\\x28\\x9d\\xe4\\x39\\xa1\\xd7\\x5c\\xfd\\x84\\x59\\x1e\\x30\\xd5\\xd1\\x06\\x07\\xf6\\x80\\xd4\\x7d\\xdc\\x1d\\x52\\x48\\xe5\\xf7\\x00\\x79\\x1f\\xec\\x1c\\x7f\\x48\\x67\\xef\\x9b\\xf1\\xa6\\x2b\\xee\\x71\\x14\\x0e\\x68\\x66\\x67\\x12\\x55\\x24\\xb5\\x75\\xe5\\x72\\xcc\\x0b\\xd8\\x44\\x4c\\xa5\\x28\\x65\\xc6\\x51\\xc6\\x1e\\x92\\xd7\\xc2\\x78\\x24\\x83\\x4f\\x33\\x9f\\x75\\xee\\x6e\\xd2\\x8c\\x77\\x60\\xd5\\xa9\\xb8\\xee\\xc0\\x6c\\x08\\x55\\x9a\\xeb\\x35\\x3a\\x04\\x1e\\xba\\xd9\\x0e\\x70\\xb6\\xa2\\xff\\xfe\\xcd\\x87\\x75\\xb4\\x6e\\x8d\\x7f\\x8d\\x13\\x6d\\x6e\\x95\\x73\\xa7\\xb8\\x39\\x23\\x60\\x4c\\x4a\\x49\\xe7\\x67\\x99\\xcc\\x52\\x71\\x4d\\x3b\\x79\\xc6\\x93\\x92\\x77\\xee\\x92\\x54\\x75\\x48\\x43\\x4e\\xa6\\x27\\x60\\x78\\x21\\x90\\x6b\\x6d\\xeb\\x38\\xed\\x7f\\xd4\\x9f\\x1c\\x4d\\xdd\\x0a\\x8a\\x19\\x12\\xbd\\x2e\\xf4\\xef\\xb5\\xe6\\x2c\\xb6\\x4d\\x6c\\x96\\xde\\x9a\\x99\\x6d\\xab\\xb2\\xb4\\xe5\\x14\\x69\\x16\\x1e\\xad\\x6b\\x7e\\xf3\\xee\\xa0\\x98\\xf0\\xf8\\xdb\\x8e\\x5c\\x7c\\x36\\x00\\xf3\\x3a\\x77\\xd4\\xe2\\xb3\\x81\\xa6\\x65\\x92\\xa9\\x8a\\x87\\x2f\\xff\\x44\\xeb\\x47\\x38\\x3e\\x7b\\xb6\\x9e\\xd0\\xb3\\xc1\\x31\\xf6\\xff\\x1e\\x2a\\x57\\x0e\\xc5\\xa1\\x7d\\x0d\\xd8\\x1c\\x3b\\xdb\\x31\\x2f\\x86\\xb2\\xb3\\x59\\x0f\\x15\\xda\\x98\\xb2\\x6e\\xf7\\xdf\\xc6\\x18\\x03\\x8a\\x12\\x45\\x26\\x8e\\xcb\\x32\\xef\\xeb\\x02\\xdb\\x28\\xa2\\x9e\\x2d\\xf0\\x46\\x5f\\x3d\\xf3\\x10\\x51\\x3e\\x86\\x39\\x4c\\x98\\x29\\x59\\x7b\\x1a\\x5b\\x4d\\xcd\\x85\\xaa\\x6e\\x6a\\x24\\x6b\\x5a\\xdd\\x45\\x92\\x87\\x2d\\x40\\x3b\\xdd\\xf6\\x55\\x31\\xa6\\x12\\xa1\\x90\\x35\\x92\\x53\\x04\\x22\\x7c\\x4d\\x49\\x87\\x50\\xae\\xff\\xea\\x53\\xfc\\x28\\x00\\x94\\xf8\\x00\\x28\\x6d\\x55\\x94\\xec\\x84\\x7a\\x9a\\x97\\x05\\xe0\\x54\\x2e\\x73\\x5e\\x24\\xd7\\xe8\\x6b\\x57\\x01\\x9b\\xe6\\x92\\xda\\x80\\xcd\\x54\\x2e\\x16\\x89\\x98\\x9d\\x28\\x29\\xb3\\x43\\xa0\\x8e\\xa9\\x8f\\xf7\\x02\\x42\\xd3\\xf7\\x4d\\x51\\x39\\x1e\\x98\\xb8\\x56\\x65\\x3c\\x86\\xcd\\x22\\xc4\\xec\\x16\\x21\\x14\\xf2\\x41\\x5b\\x9e\\x76\\x3d\\xa1\\x05\\x2f\\x97\\x99\\x2a\\xe3\\xf1\\xc4\\x07\\x5b\\xff\\x3d\\xcd\\xb2\\x8f\\x18\\x7a\\x44\\x6f\\x62\\xd9\\x92\\xa5\\xd0\\xbb\\x90\\x66\\x60\\x8b\\xff\\xb1\\x10\\x67\\x40\\x0b\\xbf\\xcc\\x0c\\x36\\xf2\\x26\\xcd\\xc5\\x2c\\x97\\xa9\\x50\\xc6\\x32\\x1b\\x7f\\x40\\xb8\\x52\\x5e\\x5b\\x90\\x60\\x07\\xac\\x85\\x8d\\x27\\x51\\xcd\\xba\\x8b\\x87\\xd5\\x46\\xd9\\x3d\\x11\\x6e\\xcd\\x85\\x06\\x7b\\xd3\\x1b\\x29\\x4b\\xfe\\xc6\\xd4\\xda\\xa1\\x45\\x68\\xf4\\x67\\x83\\x05\\x9a\\xa3\\x1f\\xad\\x69\\x32\\x9b\\x7d\\x80\\x70\\x62\\xed\\x92\\x42\\x7f\\x5b\\x46\\x26\\xcf\\xca\\x9e\\x25\\x6d\\x2c\\xc6\\x2c\\x01\\x86\\x5b\\xe6\\xb3\\x44\\xf1\\xc6\\x88\\x4d\\xf3\\xac\\xa6\\x17\\x6d\\x61\\x3d\\x57\\x44\\x7d\\x3e\\x72\\xcc\\x27\\xc8\\x19\\xf9\\xab\\x02\\x71\\x41\\x63\\x6c\\xb9\\x8e\\xd6\\x1a\\x59\\x68\\x4a\\xbc\\x39\\xb8\\x7f\\x36\\x36\\x86\\x8e\\x1e\\xfe\\xc9\\x19\\x30\\xfa\\x43\\x5b\\xfa\\xef\\xd5\\x10\\x84\\x35\\x86\\x8a\\xe5\\x9a\\xa0\\x54\\x9b\\xc3\\x8b\\x75\\x04\\xe3\\x2f\\xc5\\xc6\\x27\\xf3\\x77\\x9b\\xee\\x3a\\xa0\\xf5\\x93\\xd7\\x23\\xa7\\xf6\\xa0\\x9d\\xb6\\x5a\\xcf\\x2a\\x30\\x79\\x0e\\x37\\x3e\\x62\\xa4\\xd1\\x77\\x09\\xbc\\x7a\\x14\\x8a\\x08\\x79\\x5e\\x89\\xd6\\x4e\\x47\\xa1\\x72\\x67\\xd8\\xc5\\xeb\\xf7\\x04\\x88\\xe3\\x2b\\x39\\xbb\\x1f\\xa1\\x48\\x48\\x9a\\x17\\x41\\x10\\x16\\xfd\\xa5\\x40\\x3b\\x4f\\x5b\\x18\\xd1\\xc2\\x6e\\xe4\\x9f\\x34\\xd3\\x0d\\xc6\\xb0\\xd4\\x47\\xfd\\xde\\xb1\\x07\\x84\\x6f\\x76\\xb4\\x9d\\x32\\xd9\\xc4\\xdc\\x58\\xbd\\x0e\\xb6\\x7d\\xdf\\xdd\\x7a\\x35\\x47\\xb4\\x8a\\xde\\x90\\x31\\x56\\xd0\\x92\\x25\\x1a\\x88\\xda\\x4b\\x42\\x97\\xcc\\xf2\\x73\\xf0\\x3b\\x14\\x9a\\x6e\\x43\\xd8\\xde\\xf7\\x8e\\xb6\\x86\\xdd\\x5f\\x21\\x9d\\xb0\\x01\\xf8\\xcd\\x97\\x50\\x4c\\x22\\xbc\\x39\\x1b\\x6f\\xd1\\x86\\x72\\x4d\\x33\\xb4\\x10\\xb4\\x34\\xf0\\x6a\\x15\\x66\\x1b\\x60\\xd9\\x61\\x9a\\x32\\x4f\\x34\\x9e\\x99\\x6a\\x30\\x6d\\xa0\\x73\\x26\\x4b\\x4e\\xa8\\x14\\x6f\\xb2\\x74\\xfa\\x35\\x5e\\xae\\x29\\xf9\\xbf\\xff\\xe7\\x7f\\x93\\x28\\xa2\\x5b\\x3b\\x01\\x22\\x04\\xd6\\x23\\xa8\\xd7\\x53\\x2a\\xf2\\xa5\\x22\\xeb\\xed\\xed\\xb0\\x02\\x7d\\x00\\x93\\xa7\\x1b\\x99\\x69\\x9a\\x0c\\x76\\x40\\x8f\\x0e\\x92\\xf2\\x78\\xaa\\xb1\\x2e\\x95\\xe2\\x9d\\x9c\\x2e\\xcb\\xb8\\x34\\x3b\\x03\\xb8\\x78\\xbd\\x63\\x46\\xad\\x3d\\xe3\\xf6\\xf9\\x7d\\xe3\\xcd\\xdf\\xec\\xdd\\xc0\\xb9\\xed\\xfd\\x63\\x60\\x49\\x42\\x1f\\xbc\\xce\\x20\\x6e\\x91\\xed\\x41\\xff\\x58\\x53\\x19\\x8e\\x2d\\x80\\xa3\\x8e\\x68\\x71\\x14\\xc7\\x24\\x8a\\x68\\x66\\xe8\\x51\\x3c\\xae\\x5b\\x74\\x1e\\xb5\\x9b\\xd2\\x20\\x26\\x3c\\x29\\xcc\\x01\\xdf\\x47\\xed\\xf8\\x1a\\x1a\\x18\\x18\\x5a\\x92\\x47\\x3b\\xc9\\x64\\x0f\\xb2\\x88\\x64\\xc1\\x57\\x2b\\x62\\x00\\x54\\x49\\x2c\\x30\\xc2\\xab\\x11\\x3a\\x46\\xd9\\x4c\\xbe\\x32\\xd5\\xde\\x33\\x59\\xff\\x40\\xfa\\xe4\\xc2\\x8e\\xf9\\x3b\\x1a\\x9d\\xef\\x3d\\xaa\\x5e\\xef\\xa0\\xb4\\xdc\\xd1\\xab\\xfb\\xd2\\x2d\\x33\\x82\\xef\\x62\\x31\\x5a\\x0b\\x0c\\x76\\x87\\x03\\x35\\x5f\\x3e\\xf6\\xd5\\x67\\xa3\\x85\\x9e\\xd9\\x7f\\xcb\\xbc\\x69\\xe0\\x1e\\x93\\x35\\x55\\x3b\\x5a\\x61\\xc6\\xe4\\x7a\\xc3\\x2b\\x25\\x3a\\x57\\x4a\\x9c\\x14\\x4b\\x51\\x5d\\x74\\xfc\\x4c\\x0e\\xd7\\xac\\x29\\xf9\\xb8\\x14\\x07\\x5c\\x7b\\xaf\\x5f\\xf3\\x91\\xc9\\x9a\\x42\\x78\\xc7\\x6d\\x5c\\x46\\xc5\\x33\\x54\\x44\\x64\\x3c\\x7c\\x89\\x0c\\xc3\\x3e\\xdf\\xd9\\x47\\x51\\xbd\\x85\\x4f\\xf5\\xca\\x47\\x50\\xbd\\x85\\x4f\\xe3\\xca\\x83\\x68\\x5c\\x21\\x38\\x0c\\x72\\x92\\x8a\\xb9\\x24\\x87\\xdc\\xa5\\xaa\\x0d\\x58\\x5a\\xe9\\xab\\x05\\x76\\x56\\x7a\\x07\\x9d\\x73\\x28\\xf8\\xfb\\x12\\xda\\x9c\\xc3\\xae\\xeb\\x63\\x7b\\x25\\xeb\\xed\\xcd\\x76\\x1d\\x13\\xd3\\x03\\xd1\\xfc\\x47\\xd5\\x5b\\x47\\x6f\\xe5\\xe1\\x68\\x45\\xaf\\x86\\x20\\x07\\xa3\\x80\\x83\\x39\\x62\\x09\\x98\\xe0\\xb7\\xdc\\x35\\x7f\\x1c\\xd0\\xb0\\xe8\\x84\\x0a\\x18\\xe2\\xa0\\x43\\x08\\xa7\\xee\\x11\\x39\\x0a\\x18\\x3a\\x6f\\x8c\\x9c\\x03\\x3e\\x42\\x8a\\x54\\x8a\\x8b\\x50\\xb1\\x5a\\x5a\\x04\\x33\\xd9\\x4b\\xfe\\x4d\\x7d\\xd4\\xf0\\x20\\xd4\\x93\\xd2\\xe4\\xc0\\xa5\\xcd\\x37\\x8e\\xf1\\xfe\\x0c\\x41\\x8a\\xc4\\xa0\\xee\\x2c\\x8c\\x22\\x1b\\x2b\\xf3\\x9a\\xab\\x4f\\x76\\x00\\xe0\\x19\\x1a\\x91\\x1f\\xaa\\x8e\\xb1\\xe9\\x2f\\x72\\xc6\\xbd\\x1e\\x5b\\x7a\\x09\\x23\\x4d\\xa1\\x60\\x3b\\x15\\x6d\\xe1\\x5d\\xb7\\x5e\\x7e\\x55\\xd4\\xbe\\x11\\xef\\x7f\\xd5\\xcf\\x3b\\x00\\xa9\\x9a\\xd5\\x3f\\xaa\\xc6\\xf3\\x6b\\x8a\\xde\\xc4\\x7b\\x5a\\x59\\x10\\x55\\xf8\\xd4\\x05\\x62\\xf3\\x1d\\x03\\x56\\xa2\\x11\\x60\\x9b\\x0d\\xb2\\x37\\xe7\\xe2\\x1f\\xc5\\x3c\\x1f\\xc9\\x2a\\xdb\\x93\\xbf\\x15\\x7c\\x38\\x33\\x7d\\x74\\x78\\xe8\\x91\\xd3\\x24\\x4f\\x4f\\x2b\\x34\\x0c\\x80\\x25\\x4f\\xd4\\x4d\\x9d\\x21\\xf8\\x5b\\x29\\x85\\xe6\\x21\\x1f\\xe0\\xab\\x69\\x54\\xa2\\x6e\\x08\\x05\\x0e\\xed\\xcd\\x87\\x0f\\x1f\\x4e\\x7e\\xfa\\xb5\\xf3\\x01\\x8a\\x0c\\x6e\\x5b\\x53\\x5b\\x73\\xba\\x2c\\x32\\x53\\x73\\xfa\\xdb\\xc7\\x9f\\x1d\\x3f\\xa7\\xcb\\x3b\\xa4\\x17\\xf2\\x9e\\x8a\\xbc\\xda\\x8e\\x2e\\xc0\\xbe\\xdd\\x4f\\x6c\\x25\\x1c\\xe2\\x33\\x26\\x17\\xb4\\x43\\xbc\\xd6\\x1c\\xa2\\xd1\\x99\\xb6\\x6f\\xcd\\x0f\\xdb\\x12\\x5f\\xfa\\xed\\x26\\x8f\\xa0\\x2d\\xf2\\x3c\\x3f\\x49\\xe5\\x49\\x05\\x61\\xb6\\x9f\\xc4\\xe4\\x2a\\xe3\\xde\\x81\\x2a\\x80\\x10\\x93\\x11\\x9e\\xa8\\x43\\x01\\xcd\\xa3\\xfc\\xf3\\xff\\xf1\\x82\\x68\\xb3\\x3f\\xbe\\xe8\\xf9\\x48\\x09\\xf3\\x8c\\xdf\\xa6\\x53\\x6e\\x90\\xe1\\x7e\\x99\\x8f\\x19\\x30\\xee\\x0e\\xd7\\x6b\\x5a\\xde\\xc8\\xbb\\x1f\\x4c\\x81\\x6f\\x8b\\x51\\x17\\x18\\xb8\\x26\\xbe\\xfc\\x14\\xcb\\x34\\x31\\x3b\\xdb\\xec\\xc0\\x19\\xd4\\xd6\\x2a\\x6f\\x84\\x14\\xe3\\xac\\x8d\\x53\\xf6\\xaf\\x17\\xb0\\x81\\x85\\xbc\\x92\\x1a\\x76\\x1f\\x56\\x1b\\xf7\\x43\\xd3\\xc7\\x0f\\x10\\xc0\\x9c\\x40\\xf3\\x12\\x63\\xff\\x9f\\xe2\\x5b\\xfd\\x4b\\xa1\\xe3\\x86\\xd7\\x01\\xbe\\xab\\xb2\\x25\\xed\\x97\\xfb\\x1e\\x46\\xca\\x1b\\x29\\x56\\x0d\\x72\\xe0\\x58\\x26\\x65\\xc6\\x02\\xa2\\x90\\x78\\x64\\xca\\xbe\\x29\\xb4\\x61\\x72\\xdd\\x1f\\x59\\x6f\\x95\\x56\\xa7\\xfd\\x9f\\x53\\xf1\\xb5\\x95\\x0c\\x31\\x6d\\xa9\\x92\\xae\\x1f\\xea\\x84\\x44\\xd4\\x16\\xed\\x90\\x95\\x6f\\x21\\x4a\\xea\\x14\\xb0\\x77\\xd6\\x34\\x19\\xbb\\x47\\xf2\\xde\\x4e\\xa5\\xec\\x99\\x01\\x80\\x90\\xc2\\x7a\\x4d\\x9a\\x66\\xe1\\x2e\\x18\\x52\\xbf\\x81\\xf1\\xd9\\xe0\\x6c\\xaf\\xe0\\x7d\\x9f\\xd3\\xfb\\x7f\\x10\\x3a\\x1a\\xa0\\xfc\\xc1\\x92\\x62\\x01\\x6d\\x08\\x75\\xfa\\xc9\\xf8\\x61\\x4d\\x11\\x51\\xa0\\xd4\\x17\\x45\\x26\\xd0\\xf5\\x86\\x4a\\xb8\\x82\\x24\\xc2\\x64\\x60\\x6d\\x08\\x3d\\xb1\\xd7\\x43\\x84\\x70\\x86\\x74\\xf7\\x75\\x41\\x76\\x46\\x56\\x4a\\xbc\\x21\\x98\\xc3\\x69\\xea\\x1b\\x0f\\x21\\x4e\\x30\\x6d\\x94\\x95\\x60\\xf2\\xbb\\x0e\\xe0\\xbf\\x4f\\x72\\x59\\x4c\\xb9\\xde\\x46\\xd9\\x97\\xc2\\xc4\\xe7\\xad\\xbe\\xc3\\x86\\x84\\x0a\\x3b\\x1d\\x55\\x22\\x34\\x5c\\x9b\\xb2\\x1a\\x31\\xd4\\x2f\\xed\\x15\\xa7\\x99\\x2d\\x04\\x21\\x32\\x04\\x95\\x94\\x4d\\x69\\xed\\xe6\\xce\\x0b\\x4f\\x78\\x6a\\x55\\xca\\x87\\xcb\\x4f\\xeb\\xe2\\x53\\xd7\\xeb\\x48\\x40\\x9a\\xee\\x4c\\x62\\x52\\x5c\\x34\\x2f\\x10\\x60\\x50\\xe0\\x2b\\xfe\\x1a\\x93\\xa8\\x7e\\x6f\\xfb\\x76\\xe6\\x36\\x7c\\xe5\\xf7\\x65\\xd8\\xf6\\xd5\\xa2\\x86\\x2c\\xb0\\x0a\\x23\\xba\\x93\\x3e\\x06\\x91\\x8b\\x4f\\xb4\\xda\\x0e\\x77\\xb1\\x32\\x9a\\xe4\\x45\\x57\\xdf\\x1d\\x3c\\x52\\x93\\x9a\\xc6\\x7d\\xae\\x60\\x59\\xd3\\xf4\\x04\\xcc\\x6d\\x6d\\xad\\x28\\x5a\\x7b\\x1e\\x38\\x87\\xc2\\x37\\xb7\\x19\\x27\\x26\\x91\\xf5\\x9e\\x65\\x20\\xbd\\xd4\\xda\\xc3\\xce\\x76\\x37\\x3c\\xb1\\x3b\\xb0\\xa3\\x92\\xee\\x59\\x66\\x9f\\xf2\\x44\\xc4\\xe4\\x4c\\x33\\x96\\xce\\x6c\\x81\\x44\\xbb\\xf6\\x4d\\xf3\\x63\\x6e\\x7f\\xa3\\xc8\\x81\\x87\\x5d\\x8a\\x0c\\x43\\x6a\\x6e\\x15\\xbc\\x1d\\x79\\x08\\xa0\\xbb\\x83\\x4e\\x00\\x42\\x92\\x3d\\xc7\\xc0\\xd4\\x44\\x5b\\xfe\\x03\\x3e\\x6c\\xcb\\x87\\x31\\x84\\xf6\\x1f\\xf0\\x55\\x0c\\xd5\\x7e\\xe8\\x27\\xe1\\xd1\\x51\\x62\\x47\\xcb\\x13\\x18\\xe0\\x5b\\x99\\xa5\\x38\\xb9\\x23\\xae\\x2c\\x7c\\xc4\\x71\\xf7\\x30\\xcf\\x8e\\x7d\\xf1\\x85\\x8e\\x87\\xf7\\x0d\\xe2\\xe9\\x0e\\x8e\\x70\\x08\\x48\\x68\\x15\\x67\\xe3\\x31\\xda\\x94\\x3e\\x02\\xf2\\xa9\\x8b\\x1e\\x2b\\xb4\\xb7\\xde\\x31\\x4d\\x27\\x03\\xaa\\x11\\x44\\x38\\xbf\\x35\\x25\\x1d\\xbc\\x61\\x1d\\x08\\xb7\\xad\\x89\\xca\\x03\\x59\\x9e\\x7d\\xc1\\x5c\\xff\\x51\\x94\\x08\\x4d\\x36\\xf9\\x9d\\x23\\xa9\\x93\\xca\\x42\\xa2\\x8d\\x43\\xdf\\x77\\xe4\\x44\\x72\\xbb\\xef\\x46\\xb5\\x49\\xf3\\xf6\\x82\\xde\\xc4\\xd0\\xd0\\x9a\\x50\\x3e\\x25\\x35\\xf4\\x23\\xaf\\xe5\\xce\\x73\\xb6\\xb8\\x26\\xf4\\xa1\\x2c\\xa6\\x31\\x39\\x4d\\x17\\xc9\\x35\\x2f\\x4f\\x75\\x93\\x93\\x42\\x5e\\xf1\\x64\\xf9\\xad\\x9f\\x8b\\x6b\\x42\\x93\\x4c\\xc5\\xe4\\x23\\x96\\x90\\x75\\x74\\x98\\x94\\x6d\\x0b\\x95\\xfa\\xa8\\xb4\\xc7\\xff\\x19\\xd8\\x61\\xe0\\xf6\\xfe\\x83\\x72\\xc3\\x1e\\x1c\\x86\\x65\\x50\\xb5\\xc9\\xc3\\xb6\\x04\\x66\\x32\\xb8\\x0c\\xd8\\xd9\\x63\\xd8\\x57\\x75\\x18\\x4a\\xb0\\x53\\xf1\\x04\\xe7\\x15\\xa7\\xaa\\xc9\\x6e\\x6e\\xb8\\xd9\\x92\\x4a\\x46\\x4e\\x77\\x4d\\xb5\\xf2\\x7a\\xdc\\xce\\xc9\\x19\\x91\\x7a\\x9d\\x08\\x93\\x77\\x28\\xac\\x52\\x3b\\x78\\xc0\\x4d\\xad\\x49\\x75\\x14\\xf6\\xf3\\xc5\\x4a\\xc6\\x92\\xb6\\xa9\\x72\\x74\\x27\\xf0\\x74\\x95\\x5e\\x83\\x9c\\x1d\\x4b\\x7e\\x5f\\x7e\\x58\\xfd\\x21\\xfc\\x70\\x8d\\xd9\\x5f\\x66\\x19\\x57\\x27\\xde\\x97\\xdb\\xd9\\x5e\\x15\\x52\\x83\\x24\\x14\\xca\\xbd\\xf1\\x1a\\x45\\xa8\\x06\\xb0\\xf6\\xc8\\x8f\\x98\\x82\\x39\\x2c\\x87\\x0f\\xff\\x83\\x69\\x10\\x19\\xf1\\xa0\\x19\\xfa\\x0f\\xe6\\xf3\\x8f\\x89\\xf3\\xad\\x49\\xd6\\xf6\\xfc\\x4e\\xa1\\x62\\x9c\\x72\\x06\\xd2\\x63\\x12\\xd1\\x70\\x40\\x65\\xff\\x9a\\xab\\x28\\xe4\\x7e\\x5c\\x2e\\x51\\xf7\\x45\\x50\\x55\\x2a\\xd4\\x2a\\x1a\\x46\\x88\\xd9\\xe1\\xa2\\x91\\x0a\\x8d\\x9c\\xe3\\x11\\xa6\\x6a\\xb4\\x02\\xa6\\x45\\x05\\x9f\\x6b\\x26\\x67\\xed\\x1b\\xd8\\xa2\\x50\\x7c\\x6c\\xc2\\x8c\\x7f\\x1c\\x8a\\x29\\xc2\\xd4\\x25\\x56\\x4a\\xf2\\x1c\\xb1\\xcc\\x94\\x15\\xe1\\xd2\\x85\\x82\\xbc\\x4d\\xf9\\x5d\\x69\\x60\\x18\\xbe\\xcf\\x59\\x11\\x66\\x2e\\xea\\xa3\\xf7\\x1e\\x5f\\xcf\\x59\\x11\\xce\\x22\\x7a\\xe3\\xbf\\xc6\\x13\\x8e\\xef\\x17\\xac\\x08\\x6f\\x22\\x7a\\xeb\\xbf\\x17\\x52\\x9d\\xcc\\xe5\\x52\\xcc\\xb0\\xca\\x3d\\x2b\\xc2\\xdb\\x88\\x5e\\xb3\\xb0\\x74\\x17\\xa2\\x66\\xbd\\xda\\x28\\x8e\\xe8\\x5b\\xe6\\x15\\xf1\\x59\\x5a\\xf0\\xa9\\xa2\\x6f\\xbc\\xc2\\x5f\\x4c\\x94\\x0a\\xa8\\xbf\\x03\\x83\\xda\\x1b\\x77\\x4d\\x8d\\xa0\\x01\\xec\\x95\\x11\\xe7\\x9c\\x12\\x7a\\x83\\x13\\x88\\xa7\\xd5\\x49\\xd8\\xdb\\x03\\xee\\x5d\\xd5\\x36\\x77\\x6d\\xb7\\x03\\x8b\\x7a\\x63\\x3b\\x01\\x83\\x49\\x62\\x53\\x68\\x3b\\x9c\\x1f\\x31\\x99\\x4a\\x9c\\xa9\\x3b\\xb4\\xc2\\xdf\\xd8\\x16\\xdb\\x2e\\x17\\xd5\\x1c\\xb7\\x4f\\xf2\\x2d\\x7d\\x98\\x17\\x72\\x01\\x1b\\xa3\\x29\\x40\\xb3\\xd0\\x1d\\xcb\\x7a\\x43\\x1f\\xec\\x08\\xf7\\xfe\\x08\\x5b\\x61\\x94\\x39\\x94\\xf1\\x10\\x73\\x64\\x35\\x4f\\x53\\x7c\\x36\\x1c\\xd0\\xf6\\x53\\x14\\x9f\\x0d\\x87\\x74\\xf3\\x7c\\xc6\\x67\\xc3\\x33\\xda\\x72\\xac\\xe3\\xb3\\xe1\\x93\\xbd\\x10\\xf0\\x0f\\xb0\\xed\\x7f\\xfc\\x7d\\x85\\xe2\\xd2\\xbf\\xb2\\xa3\\xea\\xb8\\x17\\x4b\\x11\\xba\\x33\\x4a\\x7d\\x9e\\xa5\\xfa\\x34\\x48\\xe9\\x84\\xdb\\xbe\\x15\\x37\\x56\\xdc\\x4e\\xfb\\x7b\\xcd\\x6d\\x68\\xd5\\x3f\\xdf\\xff\\x34\\x0b\\x89\\x21\\xd5\\x09\\x5a\\xf0\\x3c\\xd4\\xa6\\x14\\x9f\\x0d\\x5e\\xec\\xdb\\xce\\xe1\\x71\\x16\\xdb\\x7f\\x24\\xbc\\xf4\\xa8\\x3d\\x37\\x28\\xf7\\xcd\\x3e\\xc7\\x13\\x5a\\xb0\\xee\\x80\\x4a\\xd6\\x1d\\xd2\\xc4\\x2a\\xe4\\x55\\x71\\xef\\xfc\\x4a\\x52\\x4d\\xb1\\x8f\\x1b\\xc9\\xa0\\x27\\x61\\x34\\xea\\x86\\x05\\x0b\\x53\\x56\\xd6\\xe2\\x15\\xa3\\xe3\\x30\\x58\\xab\\xa6\\xd6\\xf0\\xbb\\xab\\x56\\x2b\\x4b\\x46\\x80\\x48\\x76\\xa4\\x87\\x8c\\x46\\x95\\x2b\\xb1\\xd4\\x53\\x48\\x18\\x5f\\xcf\\x53\\x91\\x64\\xd9\\xfd\\x83\\x9e\\x40\\xb7\\x08\\x82\\xb2\\x8f\\xbb\\x53\\x3d\\x85\\x91\\xab\\x94\\xce\\x43\\x19\\x61\\x22\\xb3\\xc4\\x45\\x0d\\x16\\xeb\\xa6\\x24\\xd4\\xda\\x54\\xd6\\x43\\x4b\\xfb\\x89\\x75\\xd2\\x79\\xd8\\x58\\x5f\\x27\\x15\\x26\\xd0\\x92\\x57\\x91\\x43\\x57\\x23\\x1c\\x51\\xf0\\xbb\\xce\\xe5\\x7d\\xce\\xbd\\x94\\x6c\\x59\\x3a\\xeb\\x24\\x4a\\xf1\\x45\\xae\\x3a\\x4a\\x76\\x66\\x1c\\x13\\x0d\\x2e\\x0b\\x4c\\x1b\\x07\\x7d\\x5f\\x65\\x55\\x30\\x27\\x12\\xad\\xd7\\xa1\\xcf\\x43\\x83\\x4a\\xbc\\x70\\xf6\\xe1\\x8d\\x5b\\x62\\xae\\x47\\x03\\xa5\\xd4\\x90\\x5a\\xcd\\xf7\\xc0\\x37\\xfa\\x6a\\x41\\x70\\xb5\\xba\\x95\\xa4\\xc6\\xc7\\x75\\x47\\x6b\\xda\\x11\\xd6\\x2e\\xd2\\x6f\\xa9\\x28\\xe3\\x71\\xd9\\x07\\x46\\x6a\\x42\\xe7\\xa9\\x98\\x21\\x69\\xb7\\xcd\\x32\\x1c\\xf9\\x0f\\xcd\\x7d\\x08\\x73\\x06\\x41\\x4f\\x66\\xc0\\x78\\x7f\\x9e\\x66\\x8a\\x17\\x6d\\xc2\\x63\\x54\\xaa\\x31\\xc6\\xf8\\x3a\\x1a\\x0f\\xc0\\x7f\\xac\\x88\\x1e\\x04\\x92\\x61\\xbb\\x39\\x14\\x64\\xa6\\x6a\\x9a\\xc2\\x96\\x6a\\x05\\x56\\x33\\xa7\\x6a\\x5c\\x50\\x31\\xd9\\xc3\\x4b\\x5d\\x73\\xf5\\xc1\\x98\\xee\\x59\\xe5\\x9f\\x59\\x65\\xb5\\x0f\\x18\\x68\\x44\\x86\\x8a\\x9e\\x41\\x44\\xd6\\xf1\\x60\\x42\\x13\\x26\\xc6\\xc3\\x09\\x2d\\xed\\x25\\xb4\\x01\\x59\\x2f\\xc2\\x92\\x15\\x95\\x96\\xdf\\x78\\x72\\x6d\\x53\\xb2\\x3b\\x24\\x6c\\x11\\x23\\x0e\\xd8\\xa9\\xec\\x06\\x6c\\x4f\\x71\\xd5\\x29\\xb5\\x4a\\x94\\x38\\x59\\x47\\x31\\x21\\xbb\\x6c\\xf9\\xb6\\x30\\x6d\\xfb\\xac\\x48\\x36\\x55\\x98\\x27\\xce\\xb2\\x61\\x4d\\xcb\\xad\\xad\\xe7\\x5b\\xd6\\x63\\xe5\\x96\\xfe\\xcc\\xa3\\x28\\x8a\\xb7\\xf5\\x53\\x21\\x0d\\x80\\xfe\\xbb\\x18\\x88\\x9d\\xb7\\x28\\x3e\\x1b\\x68\\xcc\\xbc\\xe3\\xf6\\xc4\\x67\\x83\\xa7\\xb4\\x79\\x51\\x01\\x6b\\xef\\xc3\\x1b\\xff\\x49\\x0c\\xf7\\xdc\\xc2\\x1f\\x23\\xd1\\xc3\\xc3\\x92\\xce\\xfc\\x6e\\x76\\x09\\x8f\\x87\\xce\\x9e\\xe4\\x17\\xa9\\x3a\\x40\\x0a\\xf7\\x8f\\xb0\\x26\\x19\\x1e\\x67\\xb6\\xf6\\xef\\x81\\xb7\\x69\\xc3\\x02\\x35\\x57\\xc6\\xda\\xd9\\xac\\x44\\x23\\xbe\\x6f\\xa3\\x09\\x7c\\x5f\\xab\\xe9\\x99\\x97\\xf4\\x4d\\xf8\\xfb\\x22\\xcc\\x6d\\xb8\\xfb\\xc6\\xa5\\xa8\\x99\\x66\\x62\\xf5\\x1b\\x56\\x84\\x73\\x13\\x75\\x75\\x1f\\x26\\xba\\x65\\x45\\xb8\\x78\\x94\\xc0\\xaf\\x42\\x2f\\xa9\\x8f\\x5e\\x3e\\xea\\x77\\x07\\x00\\x64\\x2b\\xe2\\xf2\\x0d\\x34\\x12\\x95\\x38\\xa7\\xfe\\xb6\\x58\\xe3\\x90\\xb5\\xcc\\x50\\xd4\\x07\\x63\\xa2\\xb5\\x85\\xb3\\x97\\x52\\x66\\x2d\\x68\\x6f\\x87\\x78\\x6f\\x03\\x7b\\x01\\x85\\xc2\\x9b\\x28\\x20\\x7a\\xb4\\x80\\x6d\\x3b\\x3b\\x75\\x5b\\x41\\x5b\\x87\\x26\\x78\\x0b\\x9a\\x00\\xbf\\x1a\\x6a\\x10\\x67\\x7b\\x18\\x56\\x8b\\xbb\\x9b\\x5a\\x5f\\xa4\\x3b\\x1f\\x60\\x71\\xf1\\x8e\\x5d\\xc0\\xf6\\x6d\\x35\\x0c\\xe6\\xde\\x2b\\xff\\x9c\\x55\\x8b\\x01\\x89\\x22\\x4a\\x35\\x4d\\xbf\\x95\\x83\\x17\\xfa\\xb3\\x7a\\xe2\\xb2\\xf6\\xf5\\x78\\x15\\xb6\\x39\\x23\\x6e\\x9b\\xc8\\x4d\\x7d\\x22\\x46\\xbc\\x5a\\x75\\x08\\x1e\\x5a\\xfb\\x44\\xb4\\xee\\x94\\x57\\x9a\\x38\\x7e\\x71\\xa4\\x88\\x74\\xc7\\x97\\xcf\\xaa\\x39\\x9a\\x4f\\x63\\xfd\\xc9\\xbc\\x73\\xac\\xaf\\xc2\\xa1\\x7e\\xb8\\xb6\\x8f\\xdf\\xf3\\x78\\xb6\\x7a\\x36\\x18\\x28\\x73\\x54\\xb3\\x4a\\x32\\x69\\x04\\x8b\\xf0\\x13\\x22\\xe7\\x1d\\x33\\xb6\\x2f\\x61\\x35\\x7b\\xe5\\x8a\\x74\\x67\\x9a\\x20\\x39\\xd0\\xa9\\xf8\\x77\\x25\\x48\\x5a\\xe0\\x73\\x7c\\x36\\x18\\x36\\xab\\x35\\x20\\x7e\\x7c\\x06\\x29\\x44\\x76\\xa0\\x8f\\xf8\\x0c\\xf3\\x88\\x1c\\x4f\\xda\\xfc\\xbb\\x37\\xda\\xdc\\x8d\\x35\\x51\\x42\\xf1\\x18\\x7c\\x55\\x12\\x8a\\xff\\x37\\x89\\xa0\\xb0\\x81\\x84\\x4c\\x48\\xae\\xaa\\xc0\\x20\\x1d\\x0c\\xe8\\x72\\x24\\xcc\\x29\\x5b\\x61\\x8e\\xbb\\xda\\xed\\xe0\\xe6\\x68\\x63\\x44\\x9c\\x20\\x28\\xe0\\xc1\\x05\\xd5\\x24\\x84\\x80\\xd2\\x3d\\x62\\xfa\\x7d\\xc7\\xcc\\x23\\xd3\\xd6\\xf4\\x61\\x4d\\xc7\\x67\\x83\\x97\\x93\\x68\\xf4\\x4f\\xff\\x2f\\x00\\x00\\xff\\xff\\x64\\xa9\\xce\\x6d\\xa0\\x27\\x03\\x00\")\n\nfunc jsScriptJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_jsScriptJs,\n\t\t\"js/script.js\",\n\t)\n}\n\nfunc jsScriptJs() (*asset, error) {\n\tbytes, err := jsScriptJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"js/script.js\", size: 206752, mode: os.FileMode(436), modTime: time.Unix(1492020681, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"asset %s not found\", name)\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"assetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"assetInfo %s not found\", name)\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"css/.keep\":                              cssKeep,\n\t\"css/application.css\":                    cssApplicationCss,\n\t\"css/application.css.map\":                cssApplicationCssMap,\n\t\"css/fonts.css\":                          cssFontsCss,\n\t\"fonts/inconsolata-bold-webfont.eot\":     fontsInconsolataBoldWebfontEot,\n\t\"fonts/inconsolata-bold-webfont.svg\":     fontsInconsolataBoldWebfontSvg,\n\t\"fonts/inconsolata-bold-webfont.ttf\":     fontsInconsolataBoldWebfontTtf,\n\t\"fonts/inconsolata-bold-webfont.woff\":    fontsInconsolataBoldWebfontWoff,\n\t\"fonts/inconsolata-regular-webfont.eot\":  fontsInconsolataRegularWebfontEot,\n\t\"fonts/inconsolata-regular-webfont.svg\":  fontsInconsolataRegularWebfontSvg,\n\t\"fonts/inconsolata-regular-webfont.ttf\":  fontsInconsolataRegularWebfontTtf,\n\t\"fonts/inconsolata-regular-webfont.woff\": fontsInconsolataRegularWebfontWoff,\n\t\"fonts/roboto-bold-webfont.eot\":          fontsRobotoBoldWebfontEot,\n\t\"fonts/roboto-bold-webfont.svg\":          fontsRobotoBoldWebfontSvg,\n\t\"fonts/roboto-bold-webfont.ttf\":          fontsRobotoBoldWebfontTtf,\n\t\"fonts/roboto-bold-webfont.woff\":         fontsRobotoBoldWebfontWoff,\n\t\"fonts/roboto-regular-webfont.eot\":       fontsRobotoRegularWebfontEot,\n\t\"fonts/roboto-regular-webfont.svg\":       fontsRobotoRegularWebfontSvg,\n\t\"fonts/roboto-regular-webfont.ttf\":       fontsRobotoRegularWebfontTtf,\n\t\"fonts/roboto-regular-webfont.woff\":      fontsRobotoRegularWebfontWoff,\n\t\"fonts/robotoslab-bold-webfont.eot\":      fontsRobotoslabBoldWebfontEot,\n\t\"fonts/robotoslab-bold-webfont.svg\":      fontsRobotoslabBoldWebfontSvg,\n\t\"fonts/robotoslab-bold-webfont.ttf\":      fontsRobotoslabBoldWebfontTtf,\n\t\"fonts/robotoslab-bold-webfont.woff\":     fontsRobotoslabBoldWebfontWoff,\n\t\"images/bullet-connections-2.png\":        imagesBulletConnections2Png,\n\t\"images/bullet-connections.png\":          imagesBulletConnectionsPng,\n\t\"images/bullet-devices-2.png\":            imagesBulletDevices2Png,\n\t\"images/bullet-devices.png\":              imagesBulletDevicesPng,\n\t\"images/delete.png\":                      imagesDeletePng,\n\t\"images/devices-image-2.png\":             imagesDevicesImage2Png,\n\t\"images/devices-image.png\":               imagesDevicesImagePng,\n\t\"images/logo-robeaux.png\":                imagesLogoRobeauxPng,\n\t\"images/robots-icon_03.png\":              imagesRobotsIcon_03Png,\n\t\"index.html\":                             indexHtml,\n\t\"js/.keep\":                               jsKeep,\n\t\"js/script.js\":                           jsScriptJs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//\n//\tdata/\n//\t  foo.txt\n//\t  img/\n//\t    a.png\n//\t    b.png\n//\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"}\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"}\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif len(name) != 0 {\n\t\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\t\tpathList := strings.Split(cannonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"css\": {nil, map[string]*bintree{\n\t\t\".keep\":               {cssKeep, map[string]*bintree{}},\n\t\t\"application.css\":     {cssApplicationCss, map[string]*bintree{}},\n\t\t\"application.css.map\": {cssApplicationCssMap, map[string]*bintree{}},\n\t\t\"fonts.css\":           {cssFontsCss, map[string]*bintree{}},\n\t}},\n\t\"fonts\": {nil, map[string]*bintree{\n\t\t\"inconsolata-bold-webfont.eot\":     {fontsInconsolataBoldWebfontEot, map[string]*bintree{}},\n\t\t\"inconsolata-bold-webfont.svg\":     {fontsInconsolataBoldWebfontSvg, map[string]*bintree{}},\n\t\t\"inconsolata-bold-webfont.ttf\":     {fontsInconsolataBoldWebfontTtf, map[string]*bintree{}},\n\t\t\"inconsolata-bold-webfont.woff\":    {fontsInconsolataBoldWebfontWoff, map[string]*bintree{}},\n\t\t\"inconsolata-regular-webfont.eot\":  {fontsInconsolataRegularWebfontEot, map[string]*bintree{}},\n\t\t\"inconsolata-regular-webfont.svg\":  {fontsInconsolataRegularWebfontSvg, map[string]*bintree{}},\n\t\t\"inconsolata-regular-webfont.ttf\":  {fontsInconsolataRegularWebfontTtf, map[string]*bintree{}},\n\t\t\"inconsolata-regular-webfont.woff\": {fontsInconsolataRegularWebfontWoff, map[string]*bintree{}},\n\t\t\"roboto-bold-webfont.eot\":          {fontsRobotoBoldWebfontEot, map[string]*bintree{}},\n\t\t\"roboto-bold-webfont.svg\":          {fontsRobotoBoldWebfontSvg, map[string]*bintree{}},\n\t\t\"roboto-bold-webfont.ttf\":          {fontsRobotoBoldWebfontTtf, map[string]*bintree{}},\n\t\t\"roboto-bold-webfont.woff\":         {fontsRobotoBoldWebfontWoff, map[string]*bintree{}},\n\t\t\"roboto-regular-webfont.eot\":       {fontsRobotoRegularWebfontEot, map[string]*bintree{}},\n\t\t\"roboto-regular-webfont.svg\":       {fontsRobotoRegularWebfontSvg, map[string]*bintree{}},\n\t\t\"roboto-regular-webfont.ttf\":       {fontsRobotoRegularWebfontTtf, map[string]*bintree{}},\n\t\t\"roboto-regular-webfont.woff\":      {fontsRobotoRegularWebfontWoff, map[string]*bintree{}},\n\t\t\"robotoslab-bold-webfont.eot\":      {fontsRobotoslabBoldWebfontEot, map[string]*bintree{}},\n\t\t\"robotoslab-bold-webfont.svg\":      {fontsRobotoslabBoldWebfontSvg, map[string]*bintree{}},\n\t\t\"robotoslab-bold-webfont.ttf\":      {fontsRobotoslabBoldWebfontTtf, map[string]*bintree{}},\n\t\t\"robotoslab-bold-webfont.woff\":     {fontsRobotoslabBoldWebfontWoff, map[string]*bintree{}},\n\t}},\n\t\"images\": {nil, map[string]*bintree{\n\t\t\"bullet-connections-2.png\": {imagesBulletConnections2Png, map[string]*bintree{}},\n\t\t\"bullet-connections.png\":   {imagesBulletConnectionsPng, map[string]*bintree{}},\n\t\t\"bullet-devices-2.png\":     {imagesBulletDevices2Png, map[string]*bintree{}},\n\t\t\"bullet-devices.png\":       {imagesBulletDevicesPng, map[string]*bintree{}},\n\t\t\"delete.png\":               {imagesDeletePng, map[string]*bintree{}},\n\t\t\"devices-image-2.png\":      {imagesDevicesImage2Png, map[string]*bintree{}},\n\t\t\"devices-image.png\":        {imagesDevicesImagePng, map[string]*bintree{}},\n\t\t\"logo-robeaux.png\":         {imagesLogoRobeauxPng, map[string]*bintree{}},\n\t\t\"robots-icon_03.png\":       {imagesRobotsIcon_03Png, map[string]*bintree{}},\n\t}},\n\t\"index.html\": {indexHtml, map[string]*bintree{}},\n\t\"js\": {nil, map[string]*bintree{\n\t\t\".keep\":     {jsKeep, map[string]*bintree{}},\n\t\t\"script.js\": {jsScriptJs, map[string]*bintree{}},\n\t}},\n}}\n\n// RestoreAsset restores an asset under the given directory\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0o755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// RestoreAssets restores an asset under the given directory recursively\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\treturn filepath.Join(append([]string{dir}, strings.Split(cannonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "appveyor.yml",
    "content": "version: \"{build}\"\n\nimage: Visual Studio 2019\n\nclone_folder: c:\\gopath\\src\\gobot.io\\x\\gobot\n\nenvironment:\n  PATH: C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin;%PATH%\n  GOPATH: c:\\gopath\n\nbefore_test:\n  - go version\n  - go env\n\nbuild_script:\n  - go test -v -cpu=2 .\n  - go test -v -cpu=2 ./drivers/aio/...\n  - go test -v -cpu=2 ./drivers/ble/.\n  - go test -v -cpu=2 ./drivers/ble/parrot/.\n  - go test -v -cpu=2 ./drivers/ble/sphero/.\n  - go test -v -cpu=2 ./drivers/serial/...\n  - go test -v -cpu=2 ./platforms/bleclient/...\n  - go test -v -cpu=2 ./platforms/dji/...\n  - go test -v -cpu=2 ./platforms/firmata/...\n  - go test -v -cpu=2 ./platforms/joystick/...\n  - go test -v -cpu=2 ./platforms/parrot/...\n  - go test -v -cpu=2 ./platforms/serialport/...\n  - cd ..\n"
  },
  {
    "path": "commander.go",
    "content": "package gobot\n\ntype commander struct {\n\tcommands map[string]func(map[string]interface{}) interface{}\n}\n\n// Commander is the interface which describes the behaviour for a Driver or Adaptor\n// which exposes API commands.\ntype Commander interface {\n\t// Command returns a command given a name. Returns nil if the command is not found.\n\tCommand(name string) (command func(map[string]interface{}) interface{})\n\t// Commands returns a map of commands.\n\tCommands() (commands map[string]func(map[string]interface{}) interface{})\n\t// AddCommand adds a command given a name.\n\tAddCommand(name string, command func(map[string]interface{}) interface{})\n}\n\n// NewCommander returns a new Commander.\nfunc NewCommander() Commander {\n\treturn &commander{\n\t\tcommands: make(map[string]func(map[string]interface{}) interface{}),\n\t}\n}\n\n// Command returns the command interface when passed a valid command name\nfunc (c *commander) Command(name string) func(map[string]interface{}) interface{} {\n\treturn c.commands[name]\n}\n\n// Commands returns the entire map of valid commands\nfunc (c *commander) Commands() map[string]func(map[string]interface{}) interface{} {\n\treturn c.commands\n}\n\n// AddCommand adds a new command, when passed a command name and the command interface.\nfunc (c *commander) AddCommand(name string, command func(map[string]interface{}) interface{}) {\n\tc.commands[name] = command\n}\n"
  },
  {
    "path": "commander_test.go",
    "content": "package gobot\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestCommander(t *testing.T) {\n\t// arrange\n\tc := NewCommander()\n\tc.AddCommand(\"test\", func(map[string]interface{}) interface{} {\n\t\treturn \"hi\"\n\t})\n\n\t// act && assert\n\tassert.Len(t, c.Commands(), 1)\n\tassert.NotNil(t, c.Command(\"test\"))\n\tassert.Nil(t, c.Command(\"booyeah\"))\n}\n"
  },
  {
    "path": "connection.go",
    "content": "package gobot\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n)\n\n// JSONConnection is a JSON representation of a Connection.\ntype JSONConnection struct {\n\tName    string `json:\"name\"`\n\tAdaptor string `json:\"adaptor\"`\n}\n\n// NewJSONConnection returns a JSONConnection given a Connection.\nfunc NewJSONConnection(connection Connection) *JSONConnection {\n\treturn &JSONConnection{\n\t\tName:    connection.Name(),\n\t\tAdaptor: reflect.TypeOf(connection).String(),\n\t}\n}\n\n// A Connection is an instance of an Adaptor\ntype Connection Adaptor\n\n// Connections represents a collection of Connection\ntype Connections []Connection\n\n// Len returns connections length\nfunc (c *Connections) Len() int {\n\treturn len(*c)\n}\n\n// Each enumerates through the Connections and calls specified callback function.\nfunc (c *Connections) Each(f func(Connection)) {\n\tfor _, connection := range *c {\n\t\tf(connection)\n\t}\n}\n\n// Start calls Connect on each Connection in c\nfunc (c *Connections) Start() error {\n\tlog.Printf(\"Starting %d connections...\", len(*c))\n\tvar err error\n\tfor _, connection := range *c {\n\t\tinfo := \"Starting connection \" + connection.Name()\n\n\t\tif porter, ok := connection.(Porter); ok {\n\t\t\tinfo = info + \" on port \" + porter.Port()\n\t\t}\n\n\t\tlog.Println(info + \"...\")\n\n\t\tif cerr := connection.Connect(); cerr != nil {\n\t\t\terr = multierror.Append(err, fmt.Errorf(\"'%s' connect error: %w\", connection.Name(), cerr))\n\t\t}\n\t}\n\treturn err\n}\n\n// Finalize calls Finalize on each Connection in c\nfunc (c *Connections) Finalize() error {\n\tlog.Printf(\"Finalize %d connections...\", len(*c))\n\tvar err error\n\tfor _, connection := range *c {\n\t\tif cerr := connection.Finalize(); cerr != nil {\n\t\t\terr = multierror.Append(err, fmt.Errorf(\"'%s' finalize error: %w\", connection.Name(), cerr))\n\t\t}\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "debug.go",
    "content": "package gobot\n\nimport \"fmt\"\n\nfunc Debuglnf(isDebug bool, format string, a ...interface{}) {\n\tif isDebug {\n\t\tmsg := fmt.Sprintf(format, a...)\n\t\tfmt.Printf(\"<Debug>: %s\\n\", msg)\n\t}\n}\n"
  },
  {
    "path": "device.go",
    "content": "package gobot\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n)\n\n// JSONDevice is a JSON representation of a Device.\ntype JSONDevice struct {\n\tName       string   `json:\"name\"`\n\tDriver     string   `json:\"driver\"`\n\tConnection string   `json:\"connection\"`\n\tCommands   []string `json:\"commands\"`\n}\n\n// NewJSONDevice returns a JSONDevice given a Device.\nfunc NewJSONDevice(device Device) *JSONDevice {\n\tjsonDevice := &JSONDevice{\n\t\tName:       device.Name(),\n\t\tDriver:     reflect.TypeOf(device).String(),\n\t\tCommands:   []string{},\n\t\tConnection: \"\",\n\t}\n\tif device.Connection() != nil {\n\t\tjsonDevice.Connection = device.Connection().Name()\n\t}\n\tif commander, ok := device.(Commander); ok {\n\t\tfor command := range commander.Commands() {\n\t\t\tjsonDevice.Commands = append(jsonDevice.Commands, command)\n\t\t}\n\t}\n\treturn jsonDevice\n}\n\n// A Device is an instnace of a Driver\ntype Device Driver\n\n// Devices represents a collection of Device\ntype Devices []Device\n\n// Len returns devices length\nfunc (d *Devices) Len() int {\n\treturn len(*d)\n}\n\n// Each enumerates through the Devices and calls specified callback function.\nfunc (d *Devices) Each(f func(Device)) {\n\tfor _, device := range *d {\n\t\tf(device)\n\t}\n}\n\n// Start calls Start on each Device in d\nfunc (d *Devices) Start() error {\n\tlog.Printf(\"Starting %d devices...\", d.Len())\n\tvar err error\n\tfor _, device := range *d {\n\t\tinfo := \"Starting device \" + device.Name()\n\n\t\tif pinner, ok := device.(Pinner); ok {\n\t\t\tinfo = info + \" on pin \" + pinner.Pin()\n\t\t}\n\n\t\tlog.Println(info + \"...\")\n\t\tif derr := device.Start(); derr != nil {\n\t\t\terr = multierror.Append(err, fmt.Errorf(\"'%s' start error: %w\", device.Name(), derr))\n\t\t}\n\t}\n\treturn err\n}\n\n// Halt calls Halt on each Device in d\nfunc (d *Devices) Halt() error {\n\tlog.Printf(\"Halt %d devices...\", d.Len())\n\tvar err error\n\tfor _, device := range *d {\n\t\tif derr := device.Halt(); derr != nil {\n\t\t\terr = multierror.Append(err, fmt.Errorf(\"'%s' halt error: %w\", device.Name(), derr))\n\t\t}\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "doc.go",
    "content": "// Copyright 2014-2018 The Hybrid Group. All rights reserved.\n\n/*\nPackage gobot is the primary entrypoint for Gobot (http://gobot.io), a framework for robotics, physical computing, and\nthe Internet of Things written using the Go programming language .\n\nIt provides a simple, yet powerful way to create solutions that incorporate multiple, different hardware devices at the\nsame time.\n\n# Classic Gobot\n\nHere is a \"Classic Gobot\" program that blinks an LED using an Arduino:\n\n\tpackage main\n\n\timport (\n\t    \"time\"\n\n\t    \"gobot.io/x/gobot/v2\"\n\t    \"gobot.io/x/gobot/v2/drivers/gpio\"\n\t    \"gobot.io/x/gobot/v2/platforms/firmata\"\n\t)\n\n\tfunc main() {\n\t    firmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n\t    led := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\t    work := func() {\n\t        gobot.Every(1*time.Second, func() {\n\t            if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t        })\n\t    }\n\n\t    robot := gobot.NewRobot(\"bot\",\n\t        []gobot.Connection{firmataAdaptor},\n\t        []gobot.Device{led},\n\t        work,\n\t    )\n\n\t    if err := robot.Start(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t}\n\n# Metal Gobot\n\nYou can also use Metal Gobot and pick and choose from the various Gobot packages to control hardware with nothing but\npure idiomatic Golang code. For example:\n\n\tpackage main\n\n\timport (\n\t    \"gobot.io/x/gobot/v2/drivers/gpio\"\n\t    \"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n\t    \"time\"\n\t)\n\n\tfunc main() {\n\t    e := edison.NewAdaptor()\n\t    if err := e.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\t    led := gpio.NewLedDriver(e, \"13\")\n\t    if err := led.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\t    for {\n\t        if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t        time.Sleep(1000 * time.Millisecond)\n\t    }\n\t}\n\n# Manager Gobot\n\nFinally, you can use Manager Gobot to add the complete Gobot API or control swarms of Robots:\n\n\t\tpackage main\n\n\t\timport (\n\t\t    \"fmt\"\n\t\t    \"time\"\n\n\t\t    \"gobot.io/x/gobot/v2\"\n\t  \t\t\"gobot.io/x/gobot/v2/api\"\n\t  \t\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n\t  \t\t\"gobot.io/x/gobot/v2/drivers/serial\"\n\t  \t\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n\t\t)\n\n\t\tfunc NewSwarmBot(port string) *gobot.Robot {\n\t\t    spheroAdaptor := serialport.NewAdaptor(port)\n\t\t    spheroDriver := sphero.NewSpheroDriver(spheroAdaptor, serial.WithName(\"Sphero\" + port))\n\n\t\t    work := func() {\n\t\t        spheroDriver.Stop()\n\n\t\t        _ = spheroDriver.On(sphero.CollisionEvent, func(data interface{}) {\n\t\t            fmt.Println(\"Collision Detected!\")\n\t\t        })\n\n\t\t        gobot.Every(1*time.Second, func() {\n\t\t            spheroDriver.Roll(100, uint16(gobot.Rand(360)))\n\t\t        })\n\t\t        gobot.Every(3*time.Second, func() {\n\t\t            spheroDriver.SetRGB(uint8(gobot.Rand(255)),\n\t\t                uint8(gobot.Rand(255)),\n\t\t                uint8(gobot.Rand(255)),\n\t\t            )\n\t\t        })\n\t\t    }\n\n\t\t    robot := gobot.NewRobot(\"sphero\",\n\t\t        []gobot.Connection{spheroAdaptor},\n\t\t        []gobot.Device{spheroDriver},\n\t\t        work,\n\t\t    )\n\n\t\t    return robot\n\t\t}\n\n\t\tfunc main() {\n\t\t    manager := gobot.NewManager()\n\t\t    api.NewAPI(manager).Start()\n\n\t\t    spheros := []string{\n\t\t        \"/dev/rfcomm0\",\n\t\t        \"/dev/rfcomm1\",\n\t\t        \"/dev/rfcomm2\",\n\t\t        \"/dev/rfcomm3\",\n\t\t    }\n\n\t\t    for _, port := range spheros {\n\t\t        manager.AddRobot(NewSwarmBot(port))\n\t\t    }\n\n\t\t    if err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\t\t}\n\nCopyright (c) 2013-2018 The Hybrid Group. Licensed under the Apache 2.0 license.\n*/\npackage gobot // import \"gobot.io/x/gobot/v2\"\n"
  },
  {
    "path": "driver.go",
    "content": "package gobot\n\n// Driver is the interface that describes a driver in gobot\ntype Driver interface {\n\t// Name returns the label for the Driver\n\tName() string\n\t// SetName sets the label for the Driver (deprecated, use WithName() instead).\n\t// Please use options [aio.WithName, ble.WithName, gpio.WithName, onewire.WithName or serial.WithName] instead.\n\tSetName(s string)\n\t// Start initiates the Driver\n\tStart() error\n\t// Halt terminates the Driver\n\tHalt() error\n\t// Connection returns the Connection associated with the Driver\n\tConnection() Connection\n}\n\n// Pinner is the interface that describes a driver's pin\ntype Pinner interface {\n\tPin() string\n}\n"
  },
  {
    "path": "drivers/aio/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/aio/README.md",
    "content": "# AIO\n\nThis package provides drivers for [Analog Input/Output (AIO)](https://en.wikipedia.org/wiki/Analog-to-digital_converter)\ndevices. It is normally used by connecting an adaptor such as [BeagleBone](https://gobot.io/documentation/platforms/beagleboard/beaglebone/)\nthat supports the needed interfaces for analog devices.\n\n## Getting Started\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices. The following AIO devices are currently supported:\n\n- Analog Actuator\n- Analog Sensor\n- Grove Light Sensor\n- Grove Piezo Vibration Sensor\n- Grove Rotary Dial\n- Grove Sound Sensor\n- Grove Temperature Sensor\n- Temperature Sensor (supports linear and NTC thermistor in normal and inverse mode)\n- Thermal Zone Temperature Sensor\n"
  },
  {
    "path": "drivers/aio/aio_driver.go",
    "content": "package aio\n\nimport (\n\t\"log\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// Error event\n\tError = \"error\"\n\t// Data event\n\tData = \"data\"\n\t// Value event\n\tValue = \"value\"\n\t// Vibration event\n\tVibration = \"vibration\"\n)\n\n// AnalogReader interface represents an Adaptor which has AnalogRead capabilities\ntype AnalogReader interface {\n\t// gobot.Adaptor\n\tAnalogRead(pin string) (val int, err error)\n}\n\n// AnalogWriter interface represents an Adaptor which has AnalogWrite capabilities\ntype AnalogWriter interface {\n\t// gobot.Adaptor\n\tAnalogWrite(pin string, val int) error\n}\n\n// optionApplier needs to be implemented by each configurable option type\ntype optionApplier interface {\n\tapply(cfg *configuration)\n}\n\n// configuration contains all changeable attributes of the driver.\ntype configuration struct {\n\tname string\n}\n\n// nameOption is the type for applying another name to the configuration\ntype nameOption string\n\n// Driver implements the interface gobot.Driver.\ntype driver struct {\n\tgobot.Commander\n\n\tdriverCfg  *configuration\n\tconnection interface{}\n\tafterStart func() error\n\tbeforeHalt func() error\n\tmutex      *sync.Mutex // e.g. used to prevent data race between cyclic and single shot write/read to values and scaler\n}\n\n// newDriver creates a new basic analog gobot driver.\nfunc newDriver(a interface{}, name string) *driver {\n\td := driver{\n\t\tdriverCfg:  &configuration{name: gobot.DefaultName(name)},\n\t\tconnection: a,\n\t\tafterStart: func() error { return nil },\n\t\tbeforeHalt: func() error { return nil },\n\t\tCommander:  gobot.NewCommander(),\n\t\tmutex:      &sync.Mutex{},\n\t}\n\n\treturn &d\n}\n\n// WithName is used to replace the default name of the driver.\nfunc WithName(name string) optionApplier {\n\treturn nameOption(name)\n}\n\n// Name returns the name of the driver.\nfunc (d *driver) Name() string {\n\treturn d.driverCfg.name\n}\n\n// SetName sets the name of the driver.\n// Deprecated: Please use option [aio.WithName] instead.\nfunc (d *driver) SetName(name string) {\n\tWithName(name).apply(d.driverCfg)\n}\n\n// Connection returns the gobot connection of the driver.\nfunc (d *driver) Connection() gobot.Connection {\n\tif d.connection == nil {\n\t\tlog.Printf(\"%s has no connection\\n\", d.driverCfg.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connection.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.driverCfg.name)\n\treturn nil\n}\n\n// Start initializes the driver.\nfunc (d *driver) Start() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do here for the driver\n\n\treturn d.afterStart()\n}\n\n// Halt halts the driver.\nfunc (d *driver) Halt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do after halt for the driver\n\n\treturn d.beforeHalt()\n}\n\n// apply change the name in the configuration.\nfunc (o nameOption) apply(c *configuration) {\n\tc.name = string(o)\n}\n"
  },
  {
    "path": "drivers/aio/aio_driver_test.go",
    "content": "package aio\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*driver)(nil)\n\nfunc initTestDriver() *driver {\n\ta := newAioTestAdaptor()\n\td := newDriver(a, \"AIO_BASIC\")\n\treturn d\n}\n\nfunc Test_newDriver(t *testing.T) {\n\t// arrange\n\tconst name = \"mybot\"\n\ta := newAioTestAdaptor()\n\t// act\n\td := newDriver(a, name)\n\t// assert\n\tassert.IsType(t, &driver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), name))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n}\n\nfunc Test_applyWithName(t *testing.T) {\n\t// arrange\n\tconst name = \"mybot\"\n\tcfg := configuration{name: \"oldname\"}\n\t// act\n\tWithName(name).apply(&cfg)\n\t// assert\n\tassert.Equal(t, name, cfg.name)\n}\n\nfunc TestStart(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Start())\n\t// arrange after start function\n\td.afterStart = func() error { return fmt.Errorf(\"after start error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Start(), \"after start error\")\n}\n\nfunc TestHalt(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Halt())\n\t// arrange after start function\n\td.beforeHalt = func() error { return fmt.Errorf(\"before halt error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Halt(), \"before halt error\")\n}\n"
  },
  {
    "path": "drivers/aio/analog_actuator_driver.go",
    "content": "package aio\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// actuatorOptionApplier needs to be implemented by each configurable option type\ntype actuatorOptionApplier interface {\n\tapply(cfg *actuatorConfiguration)\n}\n\n// actuatorConfiguration contains all changeable attributes of the driver.\ntype actuatorConfiguration struct {\n\tscale func(input float64) (value int)\n}\n\n// actuatorScaleOption is the type for applying another scaler to the configuration\ntype actuatorScaleOption struct {\n\tscaler func(input float64) (value int)\n}\n\n// AnalogActuatorDriver represents an analog actuator\ntype AnalogActuatorDriver struct {\n\t*driver\n\n\tpin          string\n\tactuatorCfg  *actuatorConfiguration\n\tlastValue    float64\n\tlastRawValue int\n}\n\n// NewAnalogActuatorDriver returns a new driver for analog actuator, given by an AnalogWriter and pin.\n// The driver supports customizable scaling from given float64 value to written int.\n// The default scaling is 1:1. An adjustable linear scaler is provided by the driver.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithActuatorScaler\"\n//\n// Adds the following API Commands:\n//\n//\t\"Write\"    - See AnalogActuator.Write\n//\t\"WriteRaw\" - See AnalogActuator.WriteRaw\nfunc NewAnalogActuatorDriver(a AnalogWriter, pin string, opts ...interface{}) *AnalogActuatorDriver {\n\td := &AnalogActuatorDriver{\n\t\tdriver:      newDriver(a, \"AnalogActuator\"),\n\t\tpin:         pin,\n\t\tactuatorCfg: &actuatorConfiguration{scale: func(input float64) int { return int(input) }},\n\t}\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase actuatorOptionApplier:\n\t\t\to.apply(d.actuatorCfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Write\", func(params map[string]interface{}) interface{} {\n\t\tval, err := strconv.ParseFloat(params[\"val\"].(string), 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn d.Write(val)\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"WriteRaw\", func(params map[string]interface{}) interface{} {\n\t\tval, _ := strconv.Atoi(params[\"val\"].(string))\n\t\treturn d.WriteRaw(val)\n\t})\n\n\treturn d\n}\n\n// WithActuatorScaler substitute the default 1:1 return value function by a new scaling function\nfunc WithActuatorScaler(scaler func(input float64) (value int)) actuatorOptionApplier {\n\treturn actuatorScaleOption{scaler: scaler}\n}\n\n// SetScaler substitute the default 1:1 return value function by a new scaling function\n// If the scaler is not changed after initialization, prefer to use [aio.WithActuatorScaler] instead.\nfunc (a *AnalogActuatorDriver) SetScaler(scaler func(float64) int) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tWithActuatorScaler(scaler).apply(a.actuatorCfg)\n}\n\n// Pin returns the drivers pin\nfunc (a *AnalogActuatorDriver) Pin() string { return a.pin }\n\n// Write writes the given value to the actuator\nfunc (a *AnalogActuatorDriver) Write(val float64) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\trawValue := a.actuatorCfg.scale(val)\n\tif err := a.WriteRaw(rawValue); err != nil {\n\t\treturn err\n\t}\n\ta.lastValue = val\n\treturn nil\n}\n\n// RawWrite write the given raw value to the actuator\n// Deprecated: Please use [aio.WriteRaw] instead.\nfunc (a *AnalogActuatorDriver) RawWrite(val int) error {\n\treturn a.WriteRaw(val)\n}\n\n// WriteRaw write the given raw value to the actuator\nfunc (a *AnalogActuatorDriver) WriteRaw(val int) error {\n\twriter, ok := a.connection.(AnalogWriter)\n\tif !ok {\n\t\treturn fmt.Errorf(\"'AnalogWrite' is not supported by the platform '%s'\", a.Connection().Name())\n\t}\n\tif err := writer.AnalogWrite(a.Pin(), val); err != nil {\n\t\treturn err\n\t}\n\ta.lastRawValue = val\n\treturn nil\n}\n\n// Value returns the last written value\nfunc (a *AnalogActuatorDriver) Value() float64 {\n\treturn a.lastValue\n}\n\n// RawValue returns the last written raw value\nfunc (a *AnalogActuatorDriver) RawValue() int {\n\treturn a.lastRawValue\n}\n\nfunc (o actuatorScaleOption) String() string {\n\treturn \"scaler option for analog actuators\"\n}\n\nfunc (o actuatorScaleOption) apply(cfg *actuatorConfiguration) {\n\tcfg.scale = o.scaler\n}\n\n// AnalogActuatorLinearScaler creates a linear scaler function from the given values.\nfunc AnalogActuatorLinearScaler(fromMin, fromMax float64, toMin, toMax int) func(input float64) (value int) {\n\tm := float64(toMax-toMin) / (fromMax - fromMin)\n\tn := float64(toMin) - m*fromMin\n\treturn func(input float64) int {\n\t\tif input <= fromMin {\n\t\t\treturn toMin\n\t\t}\n\t\tif input >= fromMax {\n\t\t\treturn toMax\n\t\t}\n\t\treturn int(input*m + n)\n\t}\n}\n"
  },
  {
    "path": "drivers/aio/analog_actuator_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage aio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestNewAnalogActuatorDriver(t *testing.T) {\n\t// arrange\n\tconst pin = \"47\"\n\ta := newAioTestAdaptor()\n\t// act\n\td := NewAnalogActuatorDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &AnalogActuatorDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"AnalogActuator\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: actuator attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\trequire.NotNil(t, d.actuatorCfg)\n\tassert.NotNil(t, d.actuatorCfg.scale)\n}\n\nfunc TestNewAnalogActuatorDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tmyName := \"relay 1\"\n\tmyScaler := func(input float64) int { return int(2 * input) }\n\tpanicFunc := func() {\n\t\tNewAnalogActuatorDriver(newAioTestAdaptor(), \"1\", WithName(\"crazy\"), WithSensorCyclicRead(10*time.Millisecond))\n\t}\n\t// act\n\td := NewAnalogActuatorDriver(newAioTestAdaptor(), \"1\", WithName(myName), WithActuatorScaler(myScaler))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.Equal(t, 3, d.actuatorCfg.scale(1.5))\n\tassert.PanicsWithValue(t, \"'read interval option for analog sensors' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestAnalogActuatorWriteRaw(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinputVal         int\n\t\tsimulateWriteErr bool\n\t\twantWritten      int\n\t\twantErr          string\n\t}{\n\t\t\"write_raw\":   {inputVal: 100, wantWritten: 100},\n\t\t\"error_write\": {inputVal: 12345, wantWritten: 12345, simulateWriteErr: true, wantErr: \"write error\"},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst pin = \"47\"\n\t\t\ta := newAioTestAdaptor()\n\t\t\td := NewAnalogActuatorDriver(a, pin)\n\t\t\ta.simulateWriteError = tc.simulateWriteErr\n\t\t\ta.written = nil // reset previous writes\n\t\t\t// act\n\t\t\terr := d.WriteRaw(tc.inputVal)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t\tassert.Empty(t, a.written)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Len(t, a.written, 1)\n\t\t\t\tassert.Equal(t, pin, a.written[0].pin)\n\t\t\t\tassert.Equal(t, tc.wantWritten, a.written[0].val)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAnalogActuatorWriteRaw_AnalogWriteNotSupported(t *testing.T) {\n\t// arrange\n\td := NewAnalogActuatorDriver(newAioTestAdaptor(), \"1\")\n\td.connection = &aioTestBareAdaptor{}\n\t// act & assert\n\trequire.EqualError(t, d.WriteRaw(3), \"'AnalogWrite' is not supported by the platform 'bare'\")\n}\n\nfunc TestAnalogActuatorWrite_SetScaler(t *testing.T) {\n\ttests := map[string]struct {\n\t\tfromMin     float64\n\t\tfromMax     float64\n\t\tinput       float64\n\t\twantWritten int\n\t}{\n\t\t\"byte_range_min\":           {fromMin: 0, fromMax: 255, input: 0, wantWritten: 0},\n\t\t\"byte_range_max\":           {fromMin: 0, fromMax: 255, input: 255, wantWritten: 255},\n\t\t\"signed_percent_range_min\": {fromMin: -100, fromMax: 100, input: -100, wantWritten: 0},\n\t\t\"signed_percent_range_mid\": {fromMin: -100, fromMax: 100, input: 0, wantWritten: 127},\n\t\t\"signed_percent_range_max\": {fromMin: -100, fromMax: 100, input: 100, wantWritten: 255},\n\t\t\"voltage_range_min\":        {fromMin: 0, fromMax: 5.1, input: 0, wantWritten: 0},\n\t\t\"voltage_range_nearmin\":    {fromMin: 0, fromMax: 5.1, input: 0.02, wantWritten: 1},\n\t\t\"voltage_range_mid\":        {fromMin: 0, fromMax: 5.1, input: 2.55, wantWritten: 127},\n\t\t\"voltage_range_nearmax\":    {fromMin: 0, fromMax: 5.1, input: 5.08, wantWritten: 254},\n\t\t\"voltage_range_max\":        {fromMin: 0, fromMax: 5.1, input: 5.1, wantWritten: 255},\n\t\t\"upscale\":                  {fromMin: 0, fromMax: 24, input: 12, wantWritten: 127},\n\t\t\"below_min\":                {fromMin: -10, fromMax: 10, input: -11, wantWritten: 0},\n\t\t\"exceed_max\":               {fromMin: 0, fromMax: 20, input: 21, wantWritten: 255},\n\t}\n\n\tconst pin = \"7\"\n\ta := newAioTestAdaptor()\n\td := NewAnalogActuatorDriver(a, pin)\n\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td.SetScaler(AnalogActuatorLinearScaler(tc.fromMin, tc.fromMax, 0, 255))\n\t\t\ta.written = nil // reset previous writes\n\t\t\t// act\n\t\t\terr := d.Write(tc.input)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, pin, a.written[0].pin)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written[0].val)\n\t\t})\n\t}\n}\n\nfunc TestAnalogActuatorCommands_WithActuatorScaler(t *testing.T) {\n\t// arrange\n\tconst pin = \"8\"\n\ta := newAioTestAdaptor()\n\td := NewAnalogActuatorDriver(a, pin, WithActuatorScaler(func(input float64) int { return int((input + 3) / 2.5) }))\n\ta.written = nil // reset previous writes\n\t// act & assert: WriteRaw\n\terr := d.Command(\"WriteRaw\")(map[string]interface{}{\"val\": \"100\"})\n\tassert.Nil(t, err)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, pin, a.written[0].pin)\n\tassert.Equal(t, 100, a.written[0].val)\n\tassert.Equal(t, 100, d.RawValue())\n\tassert.InDelta(t, 0.0, d.Value(), 0.0)\n\t// act & assert: Write\n\terr = d.Command(\"Write\")(map[string]interface{}{\"val\": \"247.0\"})\n\tassert.Nil(t, err)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, pin, a.written[1].pin)\n\tassert.Equal(t, 100, a.written[1].val)\n\tassert.Equal(t, 100, d.RawValue())\n\tassert.InDelta(t, 247.0, d.Value(), 0.0)\n\t// arrange & act & assert: Write with error\n\ta.simulateWriteError = true\n\terr = d.Command(\"Write\")(map[string]interface{}{\"val\": \"247.0\"})\n\trequire.EqualError(t, err.(error), \"write error\")\n}\n"
  },
  {
    "path": "drivers/aio/analog_sensor_driver.go",
    "content": "package aio\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// sensorOptionApplier needs to be implemented by each configurable option type\ntype sensorOptionApplier interface {\n\tapply(cfg *sensorConfiguration)\n}\n\n// sensorConfiguration contains all changeable attributes of the driver.\ntype sensorConfiguration struct {\n\treadInterval time.Duration\n\tscale        func(input int) (value float64)\n}\n\n// sensorReadIntervalOption is the type for applying another read interval to the configuration\ntype sensorReadIntervalOption time.Duration\n\n// sensorScaleOption is the type for applying another scaler to the configuration\ntype sensorScaleOption struct {\n\tscaler func(input int) (value float64)\n}\n\n// AnalogSensorDriver represents an analog sensor\ntype AnalogSensorDriver struct {\n\t*driver\n\tgobot.Eventer\n\n\tsensorCfg    *sensorConfiguration\n\tpin          string\n\thalt         chan struct{}\n\tlastRawValue int\n\tlastValue    float64\n\tanalogRead   func() (int, float64, error)\n}\n\n// NewAnalogSensorDriver returns a new driver for analog sensors, given an AnalogReader and pin.\n// The driver supports cyclic reading and customizable scaling from read int value to returned float64.\n// The default scaling is 1:1. An adjustable linear scaler is provided by the driver.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithSensorCyclicRead\"\n//\t\"WithSensorScaler\"\n//\n// Adds the following API Commands:\n//\n//\t\"Read\"    - See AnalogDriverSensor.Read\n//\t\"ReadRaw\" - See AnalogDriverSensor.ReadRaw\nfunc NewAnalogSensorDriver(a AnalogReader, pin string, opts ...interface{}) *AnalogSensorDriver {\n\td := &AnalogSensorDriver{\n\t\tdriver:    newDriver(a, \"AnalogSensor\"),\n\t\tsensorCfg: &sensorConfiguration{scale: func(input int) float64 { return float64(input) }},\n\t\tpin:       pin,\n\t\tEventer:   gobot.NewEventer(), // needed early due to grove vibration sensor driver\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\td.analogRead = d.analogSensorRead\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase sensorOptionApplier:\n\t\t\to.apply(d.sensorCfg)\n\t\tcase time.Duration:\n\t\t\t// TODO this is only for backward compatibility and will be removed after version 2.x\n\t\t\td.sensorCfg.readInterval = o\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\td.AddCommand(\"Read\", func(_ map[string]interface{}) interface{} {\n\t\tval, err := d.Read()\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\td.AddCommand(\"ReadRaw\", func(_ map[string]interface{}) interface{} {\n\t\tval, err := d.ReadRaw()\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\treturn d\n}\n\n// WithSensorCyclicRead add a asynchronous cyclic reading functionality to the sensor with the given read interval.\nfunc WithSensorCyclicRead(interval time.Duration) sensorOptionApplier {\n\treturn sensorReadIntervalOption(interval)\n}\n\n// WithSensorScaler substitute the default 1:1 return value function by a new scaling function\nfunc WithSensorScaler(scaler func(input int) (value float64)) sensorOptionApplier {\n\treturn sensorScaleOption{scaler: scaler}\n}\n\n// SetScaler substitute the default 1:1 return value function by a new scaling function\n// If the scaler is not changed after initialization, prefer to use [aio.WithSensorScaler] instead.\nfunc (a *AnalogSensorDriver) SetScaler(scaler func(int) float64) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tWithSensorScaler(scaler).apply(a.sensorCfg)\n}\n\n// Pin returns the AnalogSensorDrivers pin\nfunc (a *AnalogSensorDriver) Pin() string { return a.pin }\n\n// Read returns the current reading from the sensor, scaled by the current scaler\nfunc (a *AnalogSensorDriver) Read() (float64, error) {\n\t_, value, err := a.analogRead()\n\treturn value, err\n}\n\n// ReadRaw returns the current reading from the sensor without scaling\nfunc (a *AnalogSensorDriver) ReadRaw() (int, error) {\n\trawValue, _, err := a.analogRead()\n\treturn rawValue, err\n}\n\n// Value returns the last read value from the sensor\nfunc (a *AnalogSensorDriver) Value() float64 {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.lastValue\n}\n\n// RawValue returns the last read raw value from the sensor\nfunc (a *AnalogSensorDriver) RawValue() int {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.lastRawValue\n}\n\n// initialize the AnalogSensorDriver and if the cyclic reading is active, reads the sensor at the given interval.\n// Emits the Events:\n//\n//\tData int - Event is emitted on change and represents the current raw reading from the sensor.\n//\tValue float64 - Event is emitted on change and represents the current reading from the sensor.\n//\tError error - Event is emitted on error reading from the sensor.\nfunc (a *AnalogSensorDriver) initialize() error {\n\tif a.sensorCfg.readInterval == 0 {\n\t\t// cyclic reading deactivated\n\t\treturn nil\n\t}\n\n\ta.AddEvent(Data)\n\ta.AddEvent(Value)\n\ta.AddEvent(Error)\n\n\t// A small buffer is needed to prevent mutex-channel-deadlock between Halt() and analogRead().\n\t// This can happen, if the shutdown is in progress (mutex passed) and the go routine is calling\n\t// the analogRead() in between, before the halt can be evaluated by the select statement.\n\t// In this case the mutex of analogRead() blocks the reading of the halt channel and, without a small buffer,\n\t// the writing to halt is blocked because there is no immediate read from channel.\n\t// Please note, that this is special behavior caused by the first read is done immediately before the select\n\t// statement.\n\ta.halt = make(chan struct{}, 1)\n\n\toldRawValue := 0\n\toldValue := 0.0\n\tgo func() {\n\t\ttimer := time.NewTimer(a.sensorCfg.readInterval)\n\t\ttimer.Stop()\n\n\t\tfor {\n\t\t\t// please note, that this ensures the first read is done immediately, but has drawbacks, see notes above\n\t\t\trawValue, value, err := a.analogRead()\n\t\t\tif err != nil {\n\t\t\t\ta.Publish(a.Event(Error), err)\n\t\t\t} else {\n\t\t\t\tif rawValue != oldRawValue && rawValue != -1 {\n\t\t\t\t\ta.Publish(a.Event(Data), rawValue)\n\t\t\t\t\toldRawValue = rawValue\n\t\t\t\t}\n\t\t\t\tif value != oldValue && value != -1 {\n\t\t\t\t\ta.Publish(a.Event(Value), value)\n\t\t\t\t\toldValue = value\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttimer.Reset(a.sensorCfg.readInterval) // ensure that after each read is a wait, independent of duration of read\n\t\t\tselect {\n\t\t\tcase <-timer.C:\n\t\t\tcase <-a.halt:\n\t\t\t\ttimer.Stop()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\treturn nil\n}\n\n// shutdown stops polling the analog sensor for new information\nfunc (a *AnalogSensorDriver) shutdown() error {\n\tif a.sensorCfg.readInterval == 0 || a.halt == nil {\n\t\t// cyclic reading deactivated\n\t\treturn nil\n\t}\n\tclose(a.halt) // broadcast halt, also to the test\n\treturn nil\n}\n\n// analogSensorRead performs an reading from the sensor, sets the internal attributes and returns\n// the raw and scaled value\nfunc (a *AnalogSensorDriver) analogSensorRead() (int, float64, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treader, ok := a.connection.(AnalogReader)\n\tif !ok {\n\t\treturn 0, 0, fmt.Errorf(\"'AnalogRead' is not supported by the platform '%s'\", a.Connection().Name())\n\t}\n\n\trawValue, err := reader.AnalogRead(a.Pin())\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\ta.lastRawValue = rawValue\n\ta.lastValue = a.sensorCfg.scale(a.lastRawValue)\n\treturn a.lastRawValue, a.lastValue, nil\n}\n\nfunc (o sensorReadIntervalOption) String() string {\n\treturn \"read interval option for analog sensors\"\n}\n\nfunc (o sensorScaleOption) String() string {\n\treturn \"scaler option for analog sensors\"\n}\n\nfunc (o sensorReadIntervalOption) apply(cfg *sensorConfiguration) {\n\tcfg.readInterval = time.Duration(o)\n}\n\nfunc (o sensorScaleOption) apply(cfg *sensorConfiguration) {\n\tcfg.scale = o.scaler\n}\n\n// AnalogSensorLinearScaler creates a linear scaler function from the given values.\nfunc AnalogSensorLinearScaler(fromMin, fromMax int, toMin, toMax float64) func(int) float64 {\n\tm := (toMax - toMin) / float64(fromMax-fromMin)\n\tn := toMin - m*float64(fromMin)\n\treturn func(input int) float64 {\n\t\tif input <= fromMin {\n\t\t\treturn toMin\n\t\t}\n\t\tif input >= fromMax {\n\t\t\treturn toMax\n\t\t}\n\t\treturn float64(input)*m + n\n\t}\n}\n"
  },
  {
    "path": "drivers/aio/analog_sensor_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage aio\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*AnalogSensorDriver)(nil)\n\nfunc TestNewAnalogSensorDriver(t *testing.T) {\n\t// arrange\n\tconst pin = \"5\"\n\ta := newAioTestAdaptor()\n\t// act\n\td := NewAnalogSensorDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &AnalogSensorDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"AnalogSensor\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n}\n\nfunc TestNewAnalogSensorDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"voltage 1\"\n\t\tcycReadDur = 10 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewAnalogSensorDriver(newAioTestAdaptor(), \"1\", WithName(\"crazy\"), WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewAnalogSensorDriver(newAioTestAdaptor(), \"1\", WithName(myName), WithSensorCyclicRead(cycReadDur))\n\t// assert\n\tassert.Equal(t, cycReadDur, d.sensorCfg.readInterval)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestAnalogSensor_WithSensorScaler(t *testing.T) {\n\t// arrange\n\tmyScaler := func(input int) float64 { return float64(input) / 2 }\n\tcfg := sensorConfiguration{}\n\t// act\n\tWithSensorScaler(myScaler).apply(&cfg)\n\t// assert\n\tassert.InDelta(t, 1.5, cfg.scale(3), 0.0)\n}\n\nfunc TestAnalogSensorDriverReadRaw(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimulateReadErr bool\n\t\twantVal         int\n\t\twantErr         string\n\t}{\n\t\t\"read_raw\":   {wantVal: analogReadReturnValue},\n\t\t\"error_read\": {wantVal: 0, simulateReadErr: true, wantErr: \"read error\"},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst pin = \"47\"\n\t\t\ta := newAioTestAdaptor()\n\t\t\td := NewAnalogSensorDriver(a, pin)\n\t\t\ta.simulateReadError = tc.simulateReadErr\n\t\t\ta.written = nil // reset previous writes\n\t\t\t// act\n\t\t\tgot, err := d.ReadRaw()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t\tassert.Empty(t, a.written)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantVal, got)\n\t\t})\n\t}\n}\n\nfunc TestAnalogSensorDriverReadRaw_AnalogWriteNotSupported(t *testing.T) {\n\t// arrange\n\td := NewAnalogSensorDriver(newAioTestAdaptor(), \"1\")\n\td.connection = &aioTestBareAdaptor{}\n\t// act & assert\n\tgot, err := d.ReadRaw()\n\trequire.EqualError(t, err, \"'AnalogRead' is not supported by the platform 'bare'\")\n\tassert.Equal(t, 0, got)\n}\n\nfunc TestAnalogSensorRead_SetScaler(t *testing.T) {\n\t// the input scales per default from 0...255\n\ttests := map[string]struct {\n\t\ttoMin float64\n\t\ttoMax float64\n\t\tinput int\n\t\twant  float64\n\t}{\n\t\t\"single_byte_range_min\":   {toMin: 0, toMax: 255, input: 0, want: 0},\n\t\t\"single_byte_range_max\":   {toMin: 0, toMax: 255, input: 255, want: 255},\n\t\t\"single_below_min\":        {toMin: 3, toMax: 121, input: -1, want: 3},\n\t\t\"single_is_max\":           {toMin: 5, toMax: 6, input: 255, want: 6},\n\t\t\"single_upscale\":          {toMin: 337, toMax: 5337, input: 127, want: 2827.196078431373},\n\t\t\"grd_int_range_min\":       {toMin: -180, toMax: 180, input: 0, want: -180},\n\t\t\"grd_int_range_minus_one\": {toMin: -180, toMax: 180, input: 127, want: -0.7058823529411598},\n\t\t\"grd_int_range_max\":       {toMin: -180, toMax: 180, input: 255, want: 180},\n\t\t\"upscale\":                 {toMin: -10, toMax: 1234, input: 255, want: 1234},\n\t}\n\ta := newAioTestAdaptor()\n\td := NewAnalogSensorDriver(a, \"7\")\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td.SetScaler(AnalogSensorLinearScaler(0, 255, tc.toMin, tc.toMax))\n\t\t\ta.analogReadFunc = func() (int, error) {\n\t\t\t\treturn tc.input, nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.Read()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.InDelta(t, tc.want, got, 1.0e-14)\n\t\t})\n\t}\n}\n\nfunc TestAnalogSensor_WithSensorCyclicRead(t *testing.T) {\n\t// arrange\n\ta := newAioTestAdaptor()\n\td := NewAnalogSensorDriver(a, \"1\", WithSensorCyclicRead(10*time.Millisecond))\n\td.SetScaler(func(input int) float64 { return float64(input * input) })\n\tsemData := make(chan bool)\n\tsemDone := make(chan bool)\n\tnextVal := make(chan int)\n\treadTimeout := time.Second\n\ta.analogReadFunc = func() (int, error) {\n\t\tval := 100\n\t\tvar err error\n\t\tselect {\n\t\tcase val = <-nextVal:\n\t\t\tif val < 0 {\n\t\t\t\terr = fmt.Errorf(\"analog read error\")\n\t\t\t}\n\t\t\treturn val, err\n\t\tdefault:\n\t\t\treturn val, nil\n\t\t}\n\t}\n\n\t// arrange: expect raw value to be received\n\t_ = d.Once(Data, func(data interface{}) { // we can't use d.Event(Data) here, because not registered yet\n\t\tassert.Equal(t, 100, data.(int))\n\t\tsemData <- true\n\t})\n\n\t// arrange: expect scaled value to be received\n\t_ = d.Once(Value, func(value interface{}) { // we can't use d.Event(Value) here, because not registered yet\n\t\tassert.InDelta(t, 10000.0, value.(float64), 0.0)\n\t\t<-semData // wait for data is finished\n\t\tsemDone <- true\n\t\tnextVal <- -1 // arrange: error in read function\n\t})\n\n\t// wait some time to ensure the cyclic go routine is working\n\ttime.Sleep(15 * time.Millisecond)\n\n\t// act (start cyclic reading)\n\trequire.NoError(t, d.Start())\n\n\t// assert: both events within timeout\n\tselect {\n\tcase <-semDone:\n\tcase <-time.After(readTimeout):\n\t\trequire.Fail(t, \"AnalogSensor Event \\\"Data\\\" was not published\")\n\t}\n\n\t// arrange: for error to be received\n\t_ = d.Once(d.Event(Error), func(err interface{}) {\n\t\tassert.Equal(t, \"analog read error\", err.(error).Error())\n\t\tsemDone <- true\n\t})\n\n\t// assert: error\n\tselect {\n\tcase <-semDone:\n\tcase <-time.After(readTimeout):\n\t\trequire.Fail(t, \"AnalogSensor Event \\\"Error\\\" was not published\")\n\t}\n\n\t// arrange: for halt message\n\t_ = d.Once(d.Event(Data), func(data interface{}) {\n\t\tsemData <- true\n\t})\n\n\t_ = d.Once(d.Event(Value), func(value interface{}) {\n\t\tsemDone <- true\n\t})\n\n\t// act: send the halt message\n\trequire.NoError(t, d.Halt())\n\n\t// assert: no event\n\tselect {\n\tcase <-semData:\n\t\trequire.Fail(t, \"AnalogSensor Event for data should not published\")\n\tcase <-semDone:\n\t\trequire.Fail(t, \"AnalogSensor Event for value should not published\")\n\tcase <-time.After(100 * time.Millisecond):\n\t}\n}\n\nfunc TestAnalogSensorHalt_WithSensorCyclicRead(t *testing.T) {\n\t// arrange\n\td := NewAnalogSensorDriver(newAioTestAdaptor(), \"1\", WithSensorCyclicRead(10*time.Millisecond))\n\trequire.NoError(t, d.Start())\n\ttimeout := 2 * d.sensorCfg.readInterval\n\twg := sync.WaitGroup{}\n\twg.Add(1)\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tselect {\n\t\tcase <-d.halt: // wait until halt is broadcasted by close the channel\n\t\tcase <-time.After(timeout): // otherwise run into the timeout\n\t\t\tassert.Fail(t, fmt.Sprintf(\"halt was not received within %s\", timeout))\n\t\t}\n\t}()\n\t// act & assert\n\trequire.NoError(t, d.Halt())\n\twg.Wait() // wait until the go function was really finished\n}\n\nfunc TestAnalogSensorCommands_WithSensorScaler(t *testing.T) {\n\t// arrange\n\ta := newAioTestAdaptor()\n\td := NewAnalogSensorDriver(a, \"42\", WithSensorScaler(func(input int) float64 { return 2.5*float64(input) - 3 }))\n\tvar readReturn int\n\ta.analogReadFunc = func() (int, error) {\n\t\treadReturn += 100\n\t\treturn readReturn, nil\n\t}\n\t// act & assert: ReadRaw\n\tret := d.Command(\"ReadRaw\")(nil).(map[string]interface{})\n\tassert.Equal(t, 100, ret[\"val\"].(int))\n\tassert.Nil(t, ret[\"err\"])\n\tassert.Equal(t, 100, d.RawValue())\n\tassert.InDelta(t, 247.0, d.Value(), 0.0)\n\t// act & assert: Read\n\tret = d.Command(\"Read\")(nil).(map[string]interface{})\n\tassert.InDelta(t, 497.0, ret[\"val\"].(float64), 0.0)\n\tassert.Nil(t, ret[\"err\"])\n\tassert.Equal(t, 200, d.RawValue())\n\tassert.InDelta(t, 497.0, d.Value(), 0.0)\n}\n"
  },
  {
    "path": "drivers/aio/doc.go",
    "content": "/*\nPackage aio provides Gobot drivers for Analog Input/Output devices.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFor further information refer to aio README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/aio/README.md\n*/\npackage aio // import \"gobot.io/x/gobot/v2/drivers/aio\"\n"
  },
  {
    "path": "drivers/aio/grove_drivers.go",
    "content": "package aio\n\nimport \"gobot.io/x/gobot/v2\"\n\n// GroveRotaryDriver represents an analog rotary dial with a Grove connector\ntype GroveRotaryDriver struct {\n\t*AnalogSensorDriver\n}\n\n// NewGroveRotaryDriver returns a new driver for grove rotary dial, given an AnalogReader and pin.\n//\n// Supported options: see [aio.NewAnalogSensorDriver]\n// Adds the following API Commands: see [aio.NewAnalogSensorDriver]\nfunc NewGroveRotaryDriver(a AnalogReader, pin string, opts ...interface{}) *GroveRotaryDriver {\n\td := GroveRotaryDriver{\n\t\tAnalogSensorDriver: NewAnalogSensorDriver(a, pin, opts...),\n\t}\n\td.driverCfg.name = gobot.DefaultName(\"GroveRotary\")\n\n\treturn &d\n}\n\n// GroveLightSensorDriver represents an analog light sensor\n// with a Grove connector\ntype GroveLightSensorDriver struct {\n\t*AnalogSensorDriver\n}\n\n// NewGroveLightSensorDriver returns a new driver for grove light sensor, given an AnalogReader and pin.\n//\n// Supported options: see [aio.NewAnalogSensorDriver]\n// Adds the following API Commands: see [aio.NewAnalogSensorDriver]\nfunc NewGroveLightSensorDriver(a AnalogReader, pin string, opts ...interface{}) *GroveLightSensorDriver {\n\td := GroveLightSensorDriver{\n\t\tAnalogSensorDriver: NewAnalogSensorDriver(a, pin, opts...),\n\t}\n\td.driverCfg.name = gobot.DefaultName(\"GroveLightSensor\")\n\n\treturn &d\n}\n\n// GrovePiezoVibrationSensorDriver represents an analog vibration sensor with a Grove connector\ntype GrovePiezoVibrationSensorDriver struct {\n\t*AnalogSensorDriver\n}\n\n// NewGrovePiezoVibrationSensorDriver returns a new driver for grove piezo vibration sensor, given an AnalogReader\n// and pin.\n//\n// Supported options: see [aio.NewAnalogSensorDriver]\n// Adds the following API Commands: see [aio.NewAnalogSensorDriver]\nfunc NewGrovePiezoVibrationSensorDriver(\n\ta AnalogReader,\n\tpin string,\n\topts ...interface{},\n) *GrovePiezoVibrationSensorDriver {\n\td := &GrovePiezoVibrationSensorDriver{\n\t\tAnalogSensorDriver: NewAnalogSensorDriver(a, pin, opts...),\n\t}\n\td.driverCfg.name = gobot.DefaultName(\"GrovePiezoVibrationSensor\")\n\n\td.AddEvent(Vibration)\n\n\tif err := d.On(d.Event(Data), func(data interface{}) {\n\t\tif data.(int) > 1000 { //nolint:forcetypeassert // no error return value, so there is no better way\n\t\t\td.Publish(d.Event(Vibration), data)\n\t\t}\n\t}); err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn d\n}\n\n// GroveSoundSensorDriver represents a analog sound sensor with a Grove connector\ntype GroveSoundSensorDriver struct {\n\t*AnalogSensorDriver\n}\n\n// NewGroveSoundSensorDriver returns a new driver for grove sound sensor, given an AnalogReader and pin.\n//\n// Supported options: see [aio.NewAnalogSensorDriver]\n// Adds the following API Commands: see [aio.NewAnalogSensorDriver]\nfunc NewGroveSoundSensorDriver(a AnalogReader, pin string, opts ...interface{}) *GroveSoundSensorDriver {\n\td := GroveSoundSensorDriver{\n\t\tAnalogSensorDriver: NewAnalogSensorDriver(a, pin, opts...),\n\t}\n\td.driverCfg.name = gobot.DefaultName(\"GroveSoundSensor\")\n\n\treturn &d\n}\n"
  },
  {
    "path": "drivers/aio/grove_drivers_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage aio\n\nimport (\n\t\"errors\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype groveDriverTestDriverAndEventer interface {\n\tgobot.Driver\n\tgobot.Eventer\n}\n\nfunc TestNewGroveRotaryDriver(t *testing.T) {\n\t// arrange\n\ta := newAioTestAdaptor()\n\tpin := \"456\"\n\t// act\n\td := NewGroveRotaryDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &GroveRotaryDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GroveRotary\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n}\n\nfunc TestNewGroveLightSensorDriver(t *testing.T) {\n\t// arrange\n\ta := newAioTestAdaptor()\n\tpin := \"456\"\n\t// act\n\td := NewGroveLightSensorDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &GroveLightSensorDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GroveLightSensor\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n}\n\nfunc TestNewGrovePiezoVibrationSensorDriver(t *testing.T) {\n\t// arrange\n\ta := newAioTestAdaptor()\n\tpin := \"456\"\n\t// act\n\td := NewGrovePiezoVibrationSensorDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &GrovePiezoVibrationSensorDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GrovePiezoVibrationSensor\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n}\n\nfunc TestNewGroveSoundSensorDriver(t *testing.T) {\n\t// arrange\n\ta := newAioTestAdaptor()\n\tpin := \"456\"\n\t// act\n\td := NewGroveSoundSensorDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &GroveSoundSensorDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GroveSoundSensor\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n}\n\nfunc TestGroveDriverHalt_WithSensorCyclicRead(t *testing.T) {\n\t// arrange\n\ttestAdaptor := newAioTestAdaptor()\n\tpin := \"456\"\n\n\tdrivers := []groveDriverTestDriverAndEventer{\n\t\tNewGroveSoundSensorDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t\tNewGroveLightSensorDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t\tNewGrovePiezoVibrationSensorDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t\tNewGroveRotaryDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t}\n\n\tfor _, driver := range drivers {\n\t\tvar callCount int32\n\t\ttestAdaptor.analogReadFunc = func() (int, error) {\n\t\t\tatomic.AddInt32(&callCount, 1)\n\t\t\treturn 42, nil\n\t\t}\n\n\t\t// Start the driver and allow for multiple digital reads\n\t\t_ = driver.Start()\n\t\ttime.Sleep(20 * time.Millisecond)\n\n\t\t_ = driver.Halt()\n\t\tlastCallCount := atomic.LoadInt32(&callCount)\n\t\t// If driver was not halted, digital reads would still continue\n\t\ttime.Sleep(20 * time.Millisecond)\n\t\t// note: if a reading is already in progress, it will be finished before halt have an impact\n\t\tif atomic.LoadInt32(&callCount) > lastCallCount+1 {\n\t\t\trequire.Fail(t, \"AnalogRead was called more than once after driver was halted\")\n\t\t}\n\t}\n}\n\nfunc TestGroveDriverWithSensorCyclicReadPublishesError(t *testing.T) {\n\t// arrange\n\ttestAdaptor := newAioTestAdaptor()\n\tpin := \"456\"\n\n\tdrivers := []groveDriverTestDriverAndEventer{\n\t\tNewGroveSoundSensorDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t\tNewGroveLightSensorDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t\tNewGrovePiezoVibrationSensorDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t\tNewGroveRotaryDriver(testAdaptor, pin, WithSensorCyclicRead(10*time.Millisecond)),\n\t}\n\n\tfor _, driver := range drivers {\n\t\tsem := make(chan struct{}, 1)\n\t\t// send error\n\t\ttestAdaptor.analogReadFunc = func() (int, error) {\n\t\t\treturn 0, errors.New(\"read error\")\n\t\t}\n\n\t\trequire.NoError(t, driver.Start())\n\n\t\t// expect error\n\t\t_ = driver.Once(driver.Event(Error), func(data interface{}) {\n\t\t\tassert.Equal(t, \"read error\", data.(error).Error())\n\t\t\tclose(sem)\n\t\t})\n\n\t\tselect {\n\t\tcase <-sem:\n\t\tcase <-time.After(time.Second):\n\t\t\trequire.Fail(t, groveGetType(driver)+\" Event \\\"Error\\\" was not published\")\n\t\t}\n\n\t\t// Cleanup\n\t\t_ = driver.Halt()\n\t}\n}\n\nfunc groveGetType(driver interface{}) string {\n\td := reflect.TypeOf(driver)\n\n\tif d.Kind() == reflect.Ptr {\n\t\treturn d.Elem().Name()\n\t}\n\n\treturn d.Name()\n}\n"
  },
  {
    "path": "drivers/aio/grove_temperature_sensor_driver.go",
    "content": "package aio\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// GroveTemperatureSensorDriver represents a temperature sensor\n// The temperature is reported in degree Celsius\ntype GroveTemperatureSensorDriver struct {\n\t*TemperatureSensorDriver\n}\n\n// NewGroveTemperatureSensorDriver returns a new driver for grove temperature sensor, given an AnalogReader and pin.\n//\n// Supported options: see [aio.NewAnalogSensorDriver]\n// Adds the following API Commands: see [aio.NewAnalogSensorDriver]\nfunc NewGroveTemperatureSensorDriver(a AnalogReader, pin string, opts ...interface{}) *GroveTemperatureSensorDriver {\n\tt := NewTemperatureSensorDriver(a, pin, opts...)\n\tntc := TemperatureSensorNtcConf{TC0: 25, R0: 10000.0, B: 3975} // Ohm, R25=10k\n\tt.SetNtcScaler(1023, 10000, false, ntc)                        // Ohm, reference value: 1023, series R: 10k\n\n\td := &GroveTemperatureSensorDriver{\n\t\tTemperatureSensorDriver: t,\n\t}\n\td.driverCfg.name = gobot.DefaultName(\"GroveTemperatureSensor\")\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase sensorOptionApplier:\n\t\t\to.apply(d.sensorCfg)\n\t\tcase time.Duration:\n\t\t\t// TODO this is only for backward compatibility and will be removed after version 2.x\n\t\t\td.sensorCfg.readInterval = o\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// Temperature returns the last read temperature from the sensor.\nfunc (t *TemperatureSensorDriver) Temperature() float64 {\n\treturn t.Value()\n}\n"
  },
  {
    "path": "drivers/aio/grove_temperature_sensor_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage aio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*GroveTemperatureSensorDriver)(nil)\n\nfunc TestNewGroveTemperatureSensorDriver(t *testing.T) {\n\t// arrange\n\tconst pin = \"123\"\n\ta := newAioTestAdaptor()\n\t// act\n\td := NewGroveTemperatureSensorDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &GroveTemperatureSensorDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GroveTemperatureSensor\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n}\n\nfunc TestNewGroveTemperatureSensorDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"inlet temperature\"\n\t\tcycReadDur = 10 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewGroveTemperatureSensorDriver(newAioTestAdaptor(), \"1\", WithName(\"crazy\"),\n\t\t\tWithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewGroveTemperatureSensorDriver(newAioTestAdaptor(), \"1\", WithName(myName), WithSensorCyclicRead(cycReadDur))\n\t// assert\n\tassert.Equal(t, cycReadDur, d.sensorCfg.readInterval)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestGroveTemperatureSensorRead_scaler(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinput int\n\t\twant  float64\n\t}{\n\t\t\"min\":           {input: 0, want: -273.15},\n\t\t\"nearMin\":       {input: 1, want: -76.96736464322436},\n\t\t\"T-25C\":         {input: 65, want: -25.064097201780044},\n\t\t\"T0C\":           {input: 233, want: -0.014379114122164083},\n\t\t\"T25C\":          {input: 511, want: 24.956285721537938},\n\t\t\"585\":           {input: 585, want: 31.61532462352477},\n\t\t\"nearMax\":       {input: 1022, want: 347.6819764792606},\n\t\t\"max\":           {input: 1023, want: 347.77682140097613},\n\t\t\"biggerThanMax\": {input: 5000, want: 347.77682140097613},\n\t}\n\ta := newAioTestAdaptor()\n\td := NewGroveTemperatureSensorDriver(a, \"54\")\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta.analogReadFunc = func() (int, error) {\n\t\t\t\treturn tc.input, nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.Read()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.InDelta(t, tc.want, got, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestGroveTemperatureSensor_publishesTemperatureInCelsius(t *testing.T) {\n\t// arrange\n\tsem := make(chan bool)\n\ta := newAioTestAdaptor()\n\td := NewGroveTemperatureSensorDriver(a, \"1\", WithSensorCyclicRead(10*time.Millisecond))\n\n\t// 584: 31.52208881030674, 585: 31.61532462352477\n\tlastRawValue := 584\n\ta.analogReadFunc = func() (int, error) {\n\t\t// ensure a changed value on each read, otherwise no event will be published\n\t\tlastRawValue++\n\t\tif lastRawValue > 585 {\n\t\t\tlastRawValue = 584\n\t\t}\n\t\treturn lastRawValue, nil\n\t}\n\n\t// act: start cyclic reading\n\trequire.NoError(t, d.Start())\n\n\t// wait some time to ensure the cyclic go routine is working\n\ttime.Sleep(15 * time.Millisecond)\n\n\tvar eventValue float64\n\t_ = d.Once(d.Event(Value), func(data interface{}) {\n\t\teventValue = data.(float64)\n\t\tsem <- true\n\t})\n\n\t// assert: value was published and is in expected delta\n\tselect {\n\tcase <-sem:\n\t\trequire.NoError(t, d.Halt())\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Grove Temperature Sensor Event \\\"Value\\\" was not published\")\n\t}\n\n\tassert.InDelta(t, eventValue, d.Temperature(), 0.0)\n\tassert.InDelta(t, 31.61532462352477, d.Temperature(), 31.61532462352477-31.52208881030674)\n}\n"
  },
  {
    "path": "drivers/aio/helpers_test.go",
    "content": "package aio\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\nconst analogReadReturnValue = 99\n\ntype aioTestBareAdaptor struct{}\n\nfunc (t *aioTestBareAdaptor) Connect() error   { return nil }\nfunc (t *aioTestBareAdaptor) Finalize() error  { return nil }\nfunc (t *aioTestBareAdaptor) Name() string     { return \"bare\" }\nfunc (t *aioTestBareAdaptor) SetName(n string) {}\n\ntype aioTestWritten struct {\n\tpin string\n\tval int\n}\n\ntype aioTestAdaptor struct {\n\tname               string\n\twritten            []aioTestWritten\n\tsimulateWriteError bool\n\tsimulateReadError  bool\n\tport               string\n\tmtx                sync.Mutex\n\tanalogReadFunc     func() (val int, err error)\n\tanalogWriteFunc    func(val int) error\n}\n\nfunc newAioTestAdaptor() *aioTestAdaptor {\n\tt := aioTestAdaptor{\n\t\tname: \"aio_test_adaptor\",\n\t\tport: \"/dev/null\",\n\t\tanalogReadFunc: func() (int, error) {\n\t\t\treturn analogReadReturnValue, nil\n\t\t},\n\t\tanalogWriteFunc: func(val int) error {\n\t\t\treturn nil\n\t\t},\n\t}\n\n\treturn &t\n}\n\n// AnalogRead capabilities (interface AnalogReader)\nfunc (t *aioTestAdaptor) AnalogRead(pin string) (int, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\n\tif t.simulateReadError {\n\t\treturn 0, fmt.Errorf(\"read error\")\n\t}\n\n\treturn t.analogReadFunc()\n}\n\n// AnalogWrite capabilities (interface AnalogWriter)\nfunc (t *aioTestAdaptor) AnalogWrite(pin string, val int) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\n\tif t.simulateWriteError {\n\t\treturn fmt.Errorf(\"write error\")\n\t}\n\n\tw := aioTestWritten{pin: pin, val: val}\n\tt.written = append(t.written, w)\n\treturn t.analogWriteFunc(val)\n}\n\nfunc (t *aioTestAdaptor) Connect() error   { return nil }\nfunc (t *aioTestAdaptor) Finalize() error  { return nil }\nfunc (t *aioTestAdaptor) Name() string     { return t.name }\nfunc (t *aioTestAdaptor) SetName(n string) { t.name = n }\nfunc (t *aioTestAdaptor) Port() string     { return t.port }\n"
  },
  {
    "path": "drivers/aio/temperature_sensor_driver.go",
    "content": "package aio\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst kelvinOffset = 273.15\n\n// TemperatureSensorNtcConf contains all attributes to calculate key parameters of a NTC thermistor.\ntype TemperatureSensorNtcConf struct {\n\tTC0 int     // °C\n\tR0  float64 // same unit as resistance of NTC (Ohm is recommended)\n\tB   float64 // 2000..5000K\n\tTC1 int     // used if B is not given, °C\n\tR1  float64 // used if B is not given, same unit as R0 needed\n\tt0  float64\n\tr   float64\n}\n\n// TemperatureSensorDriver represents an Analog Sensor\ntype TemperatureSensorDriver struct {\n\t*AnalogSensorDriver\n}\n\n// NewTemperatureSensorDriver is a driver for analog temperature sensors, given an AnalogReader and pin.\n// Linear scaling and NTC scaling is supported.\n//\n// Supported options: see [aio.NewAnalogSensorDriver]\n// Adds the following API Commands: see [aio.NewAnalogSensorDriver]\nfunc NewTemperatureSensorDriver(a AnalogReader, pin string, opts ...interface{}) *TemperatureSensorDriver {\n\td := &TemperatureSensorDriver{AnalogSensorDriver: NewAnalogSensorDriver(a, pin)}\n\td.driverCfg.name = gobot.DefaultName(\"TemperatureSensor\")\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase sensorOptionApplier:\n\t\t\to.apply(d.sensorCfg)\n\t\tcase time.Duration:\n\t\t\t// TODO this is only for backward compatibility and will be removed after version 2.x\n\t\t\td.sensorCfg.readInterval = o\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// SetNtcScaler sets a function for typical NTC scaling the read value.\n// The read value is related to the voltage over the thermistor in an series connection to a resistor.\n// If the thermistor is connected to ground, the reverse flag must be set to true.\n// This means the voltage decreases when temperature gets higher.\n// Currently no negative values for voltage are supported.\n// If the scaler is not changed after initialization, prefer to use [aio.WithSensorScaler] instead.\nfunc (t *TemperatureSensorDriver) SetNtcScaler(vRef uint, rOhm uint, reverse bool, ntc TemperatureSensorNtcConf) {\n\tt.SetScaler(TemperatureSensorNtcScaler(vRef, rOhm, reverse, ntc))\n}\n\n// SetLinearScaler sets a function for linear scaling the read value.\n// This can be applied for some silicon based PTC sensors or e.g. PT100,\n// and in a small temperature range also for NTC.\n// If the scaler is not changed after initialization, prefer to use [aio.WithSensorScaler] instead.\nfunc (t *TemperatureSensorDriver) SetLinearScaler(fromMin, fromMax int, toMin, toMax float64) {\n\tt.SetScaler(AnalogSensorLinearScaler(fromMin, fromMax, toMin, toMax))\n}\n\n// TemperatureSensorNtcScaler creates a function for typical NTC scaling the read value.\n// The read value is related to the voltage over the thermistor in an series connection to a resistor.\n// If the thermistor is connected to ground, the reverse flag must be set to true.\n// This means the voltage decreases when temperature gets higher.\n// Currently no negative values for voltage are supported.\nfunc TemperatureSensorNtcScaler(\n\tvRef uint,\n\trOhm uint,\n\treverse bool,\n\tntc TemperatureSensorNtcConf,\n) func(input int) (value float64) {\n\tntc.initialize()\n\treturn (func(input int) float64 {\n\t\tif input < 0 {\n\t\t\tinput = 0\n\t\t}\n\t\trTherm := temperaturSensorGetResistance(uint(input), vRef, rOhm, reverse) //nolint:gosec // checked before\n\t\ttemp := ntc.getTemp(rTherm)\n\t\treturn temp\n\t})\n}\n\n// getResistance calculates the value of the series thermistor by given value\n// and reference value (e.g. the voltage value over the complete series circuit)\n// The unit of the returned thermistor value equals the given series resistor unit.\nfunc temperaturSensorGetResistance(value uint, vRef uint, rSeries uint, reverse bool) float64 {\n\tif value > vRef {\n\t\tvalue = vRef\n\t}\n\tvalDiff := vRef - value\n\tif reverse {\n\t\t//        rSeries  thermistor\n\t\t// vRef o--|==|--o--|=/=|----| GND\n\t\t//               |-> value <-|\n\t\tif value == 0 {\n\t\t\t// prevent jump to -273.15\n\t\t\tvalue = 1\n\t\t}\n\t\treturn float64(rSeries*value) / float64(valDiff)\n\t}\n\n\t//      thermistor  rSeries\n\t// vRef o--|=/=|--o--|==|-----| GND\n\t//                |-> value <-|\n\tif valDiff == 0 {\n\t\t// prevent jump to -273.15\n\t\tvalDiff = 1\n\t}\n\treturn float64(rSeries*valDiff) / float64(value)\n}\n\n// getTemp calculates the temperature from the given resistance of the NTC resistor\nfunc (n *TemperatureSensorNtcConf) getTemp(rntc float64) float64 {\n\t// 1/T = 1/T0 + 1/B * ln(R/R0)\n\t//\n\t// B/T = B/T0 + ln(R/R0) = k, B/T0 = r\n\t// T = B/k, Tc = T - 273\n\n\tk := n.r + math.Log(rntc/n.R0)\n\treturn n.B/k - kelvinOffset\n}\n\n// initialize is used to calculate some constants for the NTC algorithm.\n// If B is unknown (given as 0), the function needs a second pair to calculate\n// B from the both pairs (R1, TC1), (R0, TC0)\nfunc (n *TemperatureSensorNtcConf) initialize() {\n\tn.t0 = float64(n.TC0) + kelvinOffset\n\tif n.B <= 0 {\n\t\t// B=[ln(R0)-ln(R1)]/(1/T0-1/T1)\n\t\tT1 := float64(n.TC1) + kelvinOffset\n\t\tn.B = (1/n.t0 - 1/T1)\n\t\tn.B = (math.Log(n.R0) - math.Log(n.R1)) / n.B // 2000K...5000K\n\t}\n\tn.r = n.B / n.t0\n}\n"
  },
  {
    "path": "drivers/aio/temperature_sensor_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage aio\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestNewTemperatureSensorDriver(t *testing.T) {\n\t// arrange\n\tconst pin = \"123\"\n\ta := newAioTestAdaptor()\n\t// act\n\td := NewTemperatureSensorDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &TemperatureSensorDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"TemperatureSensor\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n}\n\nfunc TestNewTemperatureSensorDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"outlet temperature\"\n\t\tcycReadDur = 10 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewTemperatureSensorDriver(newAioTestAdaptor(), \"1\", WithName(\"crazy\"),\n\t\t\tWithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewTemperatureSensorDriver(newAioTestAdaptor(), \"1\", WithName(myName), WithSensorCyclicRead(cycReadDur))\n\t// assert\n\tassert.Equal(t, cycReadDur, d.sensorCfg.readInterval)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestTemperatureSensorRead_NtcScaler(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinput int\n\t\twant  float64\n\t}{\n\t\t\"smaller_than_min\": {input: -1, want: 457.720219684306},\n\t\t\"min\":              {input: 0, want: 457.720219684306},\n\t\t\"near_min\":         {input: 1, want: 457.18923673420545},\n\t\t\"mid_range\":        {input: 127, want: 87.9784401845593},\n\t\t\"T25C\":             {input: 232, want: 24.805280460718336},\n\t\t\"T0C\":              {input: 248, want: -0.9858175109026774},\n\t\t\"T-25C\":            {input: 253, want: -22.92863536929451},\n\t\t\"near_max\":         {input: 254, want: -33.51081663999781},\n\t\t\"max\":              {input: 255, want: -273.15},\n\t\t\"bigger_than_max\":  {input: 256, want: -273.15},\n\t}\n\ta := newAioTestAdaptor()\n\td := NewTemperatureSensorDriver(a, \"4\")\n\tntc1 := TemperatureSensorNtcConf{TC0: 25, R0: 10000.0, B: 3950} // Ohm, R25=10k, B=3950\n\td.SetNtcScaler(255, 1000, true, ntc1)                           // Ohm, reference value: 3300, series R: 1k\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta.analogReadFunc = func() (int, error) {\n\t\t\t\treturn tc.input, nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.Read()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.InDelta(t, tc.want, got, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestTemperatureSensorDriver_LinearScaler(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinput int\n\t\twant  float64\n\t}{\n\t\t\"smaller_than_min\": {input: -129, want: -40},\n\t\t\"min\":              {input: -128, want: -40},\n\t\t\"near_min\":         {input: -127, want: -39.450980392156865},\n\t\t\"T-25C\":            {input: -101, want: -25.17647058823529},\n\t\t\"T0C\":              {input: -55, want: 0.07843137254902288},\n\t\t\"T25C\":             {input: -10, want: 24.7843137254902},\n\t\t\"mid_range\":        {input: 0, want: 30.274509803921575},\n\t\t\"near_max\":         {input: 126, want: 99.45098039215688},\n\t\t\"max\":              {input: 127, want: 100},\n\t\t\"bigger_than_max\":  {input: 128, want: 100},\n\t}\n\ta := newAioTestAdaptor()\n\td := NewTemperatureSensorDriver(a, \"4\")\n\td.SetLinearScaler(-128, 127, -40, 100)\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta.analogReadFunc = func() (int, error) {\n\t\t\t\treturn tc.input, nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.Read()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.InDelta(t, tc.want, got, 1.0e-14)\n\t\t})\n\t}\n}\n\nfunc TestTemperatureSensorWithSensorCyclicRead_PublishesTemperatureInCelsius(t *testing.T) {\n\t// arrange\n\tsem := make(chan bool)\n\ta := newAioTestAdaptor()\n\td := NewTemperatureSensorDriver(a, \"1\", WithSensorCyclicRead(10*time.Millisecond))\n\tntc := TemperatureSensorNtcConf{TC0: 25, R0: 10000.0, B: 3975} // Ohm, R25=10k\n\td.SetNtcScaler(1023, 10000, false, ntc)                        // Ohm, reference value: 1023, series R: 10k\n\n\t// 584: 31.52208881030674, 585: 31.61532462352477\n\tlastRawValue := 585\n\ta.analogReadFunc = func() (int, error) {\n\t\t// ensure a changed value on each read, otherwise no event will be published\n\t\tlastRawValue++\n\t\tif lastRawValue > 585 {\n\t\t\tlastRawValue = 584\n\t\t}\n\t\treturn lastRawValue, nil\n\t}\n\n\t// act: start cyclic reading\n\trequire.NoError(t, d.Start())\n\n\t// wait some time to ensure the cyclic go routine is working\n\ttime.Sleep(15 * time.Millisecond)\n\n\tvar eventValue float64\n\t_ = d.Once(d.Event(Value), func(data interface{}) {\n\t\teventValue = data.(float64)\n\t\tsem <- true\n\t})\n\n\t// assert: value was published and is in expected delta\n\tselect {\n\tcase <-sem:\n\t\trequire.NoError(t, d.Halt())\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Grove Temperature Sensor Event \\\"Value\\\" was not published\")\n\t}\n\n\tassert.InDelta(t, eventValue, d.Temperature(), 0.0)\n\tassert.InDelta(t, 31.61532462352477, d.Value(), 31.61532462352477-31.52208881030674)\n}\n\nfunc TestTemperatureSensorWithSensorCyclicRead_PublishesError(t *testing.T) {\n\t// arrange\n\tsem := make(chan bool)\n\ta := newAioTestAdaptor()\n\td := NewTemperatureSensorDriver(a, \"1\", WithSensorCyclicRead(10*time.Millisecond))\n\n\t// send error\n\ta.analogReadFunc = func() (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\trequire.NoError(t, d.Start())\n\n\t// expect error\n\t_ = d.Once(d.Event(Error), func(data interface{}) {\n\t\tassert.Equal(t, \"read error\", data.(error).Error())\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \" Temperature Sensor Event \\\"Error\\\" was not published\")\n\t}\n}\n\nfunc TestTemperatureSensorHalt_WithSensorCyclicRead(t *testing.T) {\n\t// arrange\n\td := NewTemperatureSensorDriver(newAioTestAdaptor(), \"1\", WithSensorCyclicRead(10*time.Millisecond))\n\trequire.NoError(t, d.Start())\n\terrChan := make(chan error, 1)\n\t// act & assert\n\tgo func() {\n\t\terrChan <- d.Halt()\n\t}()\n\n\t// test that the halt is not blocked by any deadlock with mutex and/or channel\n\tselect {\n\tcase err := <-errChan:\n\t\trequire.NoError(t, err)\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Temperature Sensor was not halted\")\n\t}\n}\n\nfunc TestTempDriver_initialize(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinput TemperatureSensorNtcConf\n\t\twant  TemperatureSensorNtcConf\n\t}{\n\t\t\"B_low_tc0\": {\n\t\t\tinput: TemperatureSensorNtcConf{TC0: -13, B: 2601.5},\n\t\t\twant:  TemperatureSensorNtcConf{TC0: -13, B: 2601.5, t0: 260.15, r: 10},\n\t\t},\n\t\t\"B_low_tc0_B\": {\n\t\t\tinput: TemperatureSensorNtcConf{TC0: -13, B: 5203},\n\t\t\twant:  TemperatureSensorNtcConf{TC0: -13, B: 5203, t0: 260.15, r: 20},\n\t\t},\n\t\t\"B_mid_tc0\": {\n\t\t\tinput: TemperatureSensorNtcConf{TC0: 25, B: 3950},\n\t\t\twant:  TemperatureSensorNtcConf{TC0: 25, B: 3950, t0: 298.15, r: 13.248364916988095},\n\t\t},\n\t\t\"B_mid_tc0_r0_no_change\": {\n\t\t\tinput: TemperatureSensorNtcConf{TC0: 25, R0: 1234.5, B: 3950},\n\t\t\twant:  TemperatureSensorNtcConf{TC0: 25, R0: 1234.5, B: 3950, t0: 298.15, r: 13.248364916988095},\n\t\t},\n\t\t\"B_high_tc0\": {\n\t\t\tinput: TemperatureSensorNtcConf{TC0: 100, B: 3731.5},\n\t\t\twant:  TemperatureSensorNtcConf{TC0: 100, B: 3731.5, t0: 373.15, r: 10},\n\t\t},\n\t\t\"T1_low\": {\n\t\t\tinput: TemperatureSensorNtcConf{TC0: 25, R0: 2500.0, TC1: -13, R1: 10000},\n\t\t\twant: TemperatureSensorNtcConf{\n\t\t\t\tTC0: 25, R0: 2500.0, TC1: -13, R1: 10000, B: 2829.6355560320544, t0: 298.15, r: 9.490644159087891,\n\t\t\t},\n\t\t},\n\t\t\"T1_high\": {\n\t\t\tinput: TemperatureSensorNtcConf{TC0: 25, R0: 2500.0, TC1: 100, R1: 371},\n\t\t\twant: TemperatureSensorNtcConf{\n\t\t\t\tTC0: 25, R0: 2500.0, TC1: 100, R1: 371, B: 2830.087381913779, t0: 298.15, r: 9.49215959052081,\n\t\t\t},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tntc := tc.input\n\t\t\t// act\n\t\t\tntc.initialize()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, ntc)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/aio/thermalzone_driver.go",
    "content": "package aio\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// thermalZoneOptionApplier needs to be implemented by each configurable option type\ntype thermalZoneOptionApplier interface {\n\tapply(cfg *thermalZoneConfiguration)\n}\n\n// thermalZoneConfiguration contains all changeable attributes of the driver.\ntype thermalZoneConfiguration struct {\n\tscaleUnit func(float64) float64\n}\n\n// thermalZoneUnitscalerOption is the type for applying another unit scaler to the configuration\ntype thermalZoneUnitscalerOption struct {\n\tunitscaler func(float64) float64\n}\n\n// ThermalZoneDriver represents an driver for reading the system thermal zone temperature\ntype ThermalZoneDriver struct {\n\t*AnalogSensorDriver\n\n\tthermalZoneCfg *thermalZoneConfiguration\n}\n\n// NewThermalZoneDriver is a driver for reading the system thermal zone temperature, given an AnalogReader and zone id.\n//\n// Supported options: see also [aio.NewAnalogSensorDriver]\n//\n//\t\"WithFahrenheit()\"\n//\n// Adds the following API Commands: see [aio.NewAnalogSensorDriver]\nfunc NewThermalZoneDriver(a AnalogReader, zoneID string, opts ...interface{}) *ThermalZoneDriver {\n\tdegreeScaler := func(input int) float64 { return float64(input) / 1000 }\n\td := ThermalZoneDriver{\n\t\tAnalogSensorDriver: NewAnalogSensorDriver(a, zoneID, WithSensorScaler(degreeScaler)),\n\t\tthermalZoneCfg: &thermalZoneConfiguration{\n\t\t\tscaleUnit: func(input float64) float64 { return input }, // 1:1 in °C\n\t\t},\n\t}\n\td.driverCfg.name = gobot.DefaultName(\"ThermalZone\")\n\td.analogRead = d.thermalZoneRead\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase sensorOptionApplier:\n\t\t\to.apply(d.sensorCfg)\n\t\tcase thermalZoneOptionApplier:\n\t\t\to.apply(d.thermalZoneCfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn &d\n}\n\n// WithFahrenheit substitute the default 1:1 °C scaler by a scaler for °F\nfunc WithFahrenheit() thermalZoneOptionApplier {\n\t// (1°C × 9/5) + 32 = 33,8°F\n\tunitscaler := func(input float64) float64 { return input*9.0/5.0 + 32.0 }\n\treturn thermalZoneUnitscalerOption{unitscaler: unitscaler}\n}\n\n// thermalZoneRead overrides and extends the analogSensorRead() function to add the unit scaler\nfunc (d *ThermalZoneDriver) thermalZoneRead() (int, float64, error) {\n\tif _, _, err := d.analogSensorRead(); err != nil {\n\t\treturn 0, 0, err\n\t}\n\t// apply unit scaler on value\n\td.lastValue = d.thermalZoneCfg.scaleUnit(d.lastValue)\n\treturn d.lastRawValue, d.lastValue, nil\n}\n\nfunc (o thermalZoneUnitscalerOption) apply(cfg *thermalZoneConfiguration) {\n\tcfg.scaleUnit = o.unitscaler\n}\n"
  },
  {
    "path": "drivers/aio/thermalzone_driver_test.go",
    "content": "package aio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestNewThermalZoneDriver(t *testing.T) {\n\t// arrange\n\tconst pin = \"thermal_zone0\"\n\ta := newAioTestAdaptor()\n\t// act\n\td := NewThermalZoneDriver(a, pin)\n\t// assert: driver attributes\n\tassert.IsType(t, &ThermalZoneDriver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"ThermalZone\"))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: sensor attributes\n\tassert.Equal(t, pin, d.Pin())\n\tassert.InDelta(t, 0.0, d.lastValue, 0, 0)\n\tassert.Equal(t, 0, d.lastRawValue)\n\tassert.Nil(t, d.halt) // will be created on initialize, if cyclic reading is on\n\tassert.NotNil(t, d.Eventer)\n\trequire.NotNil(t, d.sensorCfg)\n\tassert.Equal(t, time.Duration(0), d.sensorCfg.readInterval)\n\tassert.NotNil(t, d.sensorCfg.scale)\n\t// assert: thermal zone attributes\n\trequire.NotNil(t, d.thermalZoneCfg)\n\trequire.NotNil(t, d.thermalZoneCfg.scaleUnit)\n\tassert.InDelta(t, 1.0, d.thermalZoneCfg.scaleUnit(1), 0.0)\n}\n\nfunc TestNewThermalZoneDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"outlet temperature\"\n\t\tcycReadDur = 10 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewThermalZoneDriver(newAioTestAdaptor(), \"1\", WithName(\"crazy\"),\n\t\t\tWithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewThermalZoneDriver(newAioTestAdaptor(), \"1\",\n\t\tWithName(myName),\n\t\tWithSensorCyclicRead(cycReadDur),\n\t\tWithFahrenheit())\n\t// assert\n\tassert.Equal(t, cycReadDur, d.sensorCfg.readInterval)\n\tassert.InDelta(t, 33.8, d.thermalZoneCfg.scaleUnit(1), 0.0) // (1°C × 9/5) + 32 = 33,8°F\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestThermalZoneWithSensorCyclicRead_PublishesTemperatureInFahrenheit(t *testing.T) {\n\t// arrange\n\tsem := make(chan bool)\n\ta := newAioTestAdaptor()\n\td := NewThermalZoneDriver(a, \"1\", WithSensorCyclicRead(10*time.Millisecond), WithFahrenheit())\n\ta.analogReadFunc = func() (int, error) {\n\t\treturn -100000, nil // -100.000 °C\n\t}\n\t// act: start cyclic reading\n\trequire.NoError(t, d.Start())\n\t// assert\n\t_ = d.Once(d.Event(Value), func(data interface{}) {\n\t\t//nolint:forcetypeassert // ok here\n\t\tassert.InDelta(t, -148.0, data.(float64), 0.0)\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \" Temperature Sensor Event \\\"Data\\\" was not published\")\n\t}\n\n\tassert.InDelta(t, -148.0, d.Value(), 0.0)\n}\n"
  },
  {
    "path": "drivers/ble/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/ble/README.md",
    "content": "# BLE\n\nThis package provides drivers for [Bluetooth LE (BLE)](http://en.wikipedia.org/wiki/Bluetooth_low_energy)\ndevices. It is normally used by connecting an [BLE client adaptor](https://github.com/hybridgroup/gobot/tree/release/platforms/bleclient)\nthat supports the needed interfaces for BLE devices.\n\n## Getting Started\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md) and the README files\nin the subfolders.\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices. The following BLE devices are currently supported:\n\n- Battery Service\n- Device Information Service\n- Generic Access Service\n- Microbit: Accelerometer\n- Microbit: Button\n- Microbit: IO Pin\n- Microbit: LED\n- Microbit: Magnetometer\n- Microbit: Temperature\n- Serial Port over BLE\n- Sphero: BB8\n- Sphero: Ollie\n- Sphero: SPRK+\n"
  },
  {
    "path": "drivers/ble/battery_driver.go",
    "content": "package ble\n\nimport (\n\t\"bytes\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst batteryCharaShort = \"2a19\"\n\n// BatteryDriver represents the battery service for a BLE peripheral\ntype BatteryDriver struct {\n\t*Driver\n\tgobot.Eventer\n}\n\n// NewBatteryDriver creates a new driver\nfunc NewBatteryDriver(a gobot.BLEConnector, opts ...OptionApplier) *BatteryDriver {\n\td := &BatteryDriver{\n\t\tDriver:  NewDriver(a, \"Battery\", nil, nil, opts...),\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\treturn d\n}\n\n// GetBatteryLevel reads and returns the current battery level\nfunc (d *BatteryDriver) GetBatteryLevel() (uint8, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(batteryCharaShort)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tbuf := bytes.NewBuffer(c)\n\tval, _ := buf.ReadByte()\n\tlevel := val\n\treturn level, nil\n}\n"
  },
  {
    "path": "drivers/ble/battery_driver_test.go",
    "content": "package ble\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*BatteryDriver)(nil)\n\nfunc TestNewBatteryDriver(t *testing.T) {\n\t// arrange\n\td := NewBatteryDriver(testutil.NewBleTestAdaptor())\n\t// act & assert\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Battery\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewBatteryDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewBatteryDriver(a, WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestBatteryDriverRead(t *testing.T) {\n\t// arrange\n\ta := testutil.NewBleTestAdaptor()\n\td := NewBatteryDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\tif cUUID == \"2a19\" {\n\t\t\treturn []byte{20}, nil\n\t\t}\n\n\t\treturn nil, nil\n\t})\n\t// act\n\tlevel, err := d.GetBatteryLevel()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint8(20), level)\n}\n"
  },
  {
    "path": "drivers/ble/ble_driver.go",
    "content": "package ble\n\nimport (\n\t\"log\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// OptionApplier needs to be implemented by each configurable option type\ntype OptionApplier interface {\n\tapply(cfg *configuration)\n}\n\n// configuration contains all changeable attributes of the driver.\ntype configuration struct {\n\tname string\n}\n\n// nameOption is the type for applying another name to the configuration\ntype nameOption string\n\n// Driver implements the interface gobot.Driver.\ntype Driver struct {\n\tgobot.Commander\n\n\tconnection interface{}\n\tdriverCfg  *configuration\n\tafterStart func() error\n\tbeforeHalt func() error\n\tmutex      *sync.Mutex\n}\n\n// NewDriver creates a new basic BLE gobot driver.\nfunc NewDriver(\n\ta interface{}, name string,\n\tafterStart func() error, beforeHalt func() error,\n\topts ...OptionApplier,\n) *Driver {\n\tif afterStart == nil {\n\t\tafterStart = func() error { return nil }\n\t}\n\n\tif beforeHalt == nil {\n\t\tbeforeHalt = func() error { return nil }\n\t}\n\n\td := Driver{\n\t\tdriverCfg:  &configuration{name: gobot.DefaultName(name)},\n\t\tconnection: a,\n\t\tafterStart: afterStart,\n\t\tbeforeHalt: beforeHalt,\n\t\tCommander:  gobot.NewCommander(),\n\t\tmutex:      &sync.Mutex{},\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(d.driverCfg)\n\t}\n\n\treturn &d\n}\n\n// WithName is used to replace the default name of the driver.\nfunc WithName(name string) OptionApplier {\n\treturn nameOption(name)\n}\n\n// Name returns the name of the driver.\nfunc (d *Driver) Name() string {\n\treturn d.driverCfg.name\n}\n\n// SetName sets the name of the driver.\n// Deprecated: Please use option [ble.WithName] instead.\nfunc (d *Driver) SetName(name string) {\n\tWithName(name).apply(d.driverCfg)\n}\n\n// Connection returns the gobot connection of the driver.\nfunc (d *Driver) Connection() gobot.Connection {\n\tif d.connection == nil {\n\t\tlog.Printf(\"%s has no connection\\n\", d.driverCfg.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connection.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.driverCfg.name)\n\treturn nil\n}\n\n// Start initializes the driver.\nfunc (d *Driver) Start() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do here for the driver\n\n\treturn d.afterStart()\n}\n\n// Halt halts the driver.\nfunc (d *Driver) Halt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do after halt for the driver\n\n\treturn d.beforeHalt()\n}\n\n// Adaptor returns the BLE adaptor\nfunc (d *Driver) Adaptor() gobot.BLEConnector {\n\tif d.connection == nil {\n\t\tlog.Printf(\"%s has no connection\\n\", d.driverCfg.name)\n\t\treturn nil\n\t}\n\n\tif a, ok := d.connection.(gobot.BLEConnector); ok {\n\t\treturn a\n\t}\n\n\tlog.Printf(\"%s has no BLE connector\\n\", d.driverCfg.name)\n\treturn nil\n}\n\nfunc (d *Driver) Mutex() *sync.Mutex {\n\treturn d.mutex\n}\n\n// apply change the name in the configuration.\nfunc (o nameOption) apply(c *configuration) {\n\tc.name = string(o)\n}\n"
  },
  {
    "path": "drivers/ble/ble_driver_test.go",
    "content": "package ble\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestDriver() *Driver {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewDriver(a, \"BLE_BASIC\", nil, nil)\n\treturn d\n}\n\nfunc TestNewDriver(t *testing.T) {\n\t// arrange\n\tconst name = \"mybot\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewDriver(a, name, nil, nil)\n\t// assert\n\tassert.IsType(t, &Driver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), name))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n}\n\nfunc TestNewDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tname    = \"mybot\"\n\t\tnewName = \"overwrite mybot\"\n\t)\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewDriver(a, name, nil, nil, WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc Test_applyWithName(t *testing.T) {\n\t// arrange\n\tconst name = \"mybot\"\n\tcfg := configuration{name: \"oldname\"}\n\t// act\n\tWithName(name).apply(&cfg)\n\t// assert\n\tassert.Equal(t, name, cfg.name)\n}\n\nfunc TestStart(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Start())\n\t// arrange after start function\n\td.afterStart = func() error { return fmt.Errorf(\"after start error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Start(), \"after start error\")\n}\n\nfunc TestHalt(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Halt())\n\t// arrange after start function\n\td.beforeHalt = func() error { return fmt.Errorf(\"before halt error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Halt(), \"before halt error\")\n}\n\nfunc TestAdaptor(t *testing.T) {\n\twrongConnectorType := struct {\n\t\ta uint32\n\t}{}\n\t// arrange\n\ta := testutil.NewBleTestAdaptor()\n\td := NewDriver(a, \"BLE_BASIC\", nil, nil)\n\t// act, assert\n\tassert.Equal(t, a, d.Adaptor())\n\t// arrange wrong connector type\n\td.connection = wrongConnectorType\n\t// act, assert\n\tassert.Nil(t, d.Adaptor())\n}\n"
  },
  {
    "path": "drivers/ble/device_information_driver.go",
    "content": "package ble\n\nimport (\n\t\"bytes\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\tdeviceInformationModelNumberCharaShort      = \"2a24\"\n\tdeviceInformationFirmwareRevisionCharaShort = \"2a26\"\n\tdeviceInformationHardwareRevisionCharaShort = \"2a27\"\n\tdeviceInformationManufacturerNameCharaShort = \"2a29\"\n\tdeviceInformationPnPIdCharaShort            = \"2a50\"\n)\n\n// DeviceInformationDriver represents the device information service for a BLE peripheral\ntype DeviceInformationDriver struct {\n\t*Driver\n\tgobot.Eventer\n}\n\n// NewDeviceInformationDriver creates a new driver\nfunc NewDeviceInformationDriver(a gobot.BLEConnector, opts ...OptionApplier) *DeviceInformationDriver {\n\tn := &DeviceInformationDriver{\n\t\tDriver:  NewDriver(a, \"DeviceInformation\", nil, nil, opts...),\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\treturn n\n}\n\n// GetModelNumber returns the model number for the BLE Peripheral\nfunc (d *DeviceInformationDriver) GetModelNumber() (string, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(deviceInformationModelNumberCharaShort)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tbuf := bytes.NewBuffer(c)\n\tmodel := buf.String()\n\treturn model, nil\n}\n\n// GetFirmwareRevision returns the firmware revision for the BLE Peripheral\nfunc (d *DeviceInformationDriver) GetFirmwareRevision() (string, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(deviceInformationFirmwareRevisionCharaShort)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tbuf := bytes.NewBuffer(c)\n\tval := buf.String()\n\treturn val, nil\n}\n\n// GetHardwareRevision returns the hardware revision for the BLE Peripheral\nfunc (d *DeviceInformationDriver) GetHardwareRevision() (string, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(deviceInformationHardwareRevisionCharaShort)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tbuf := bytes.NewBuffer(c)\n\tval := buf.String()\n\treturn val, nil\n}\n\n// GetManufacturerName returns the manufacturer name for the BLE Peripheral\nfunc (d *DeviceInformationDriver) GetManufacturerName() (string, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(deviceInformationManufacturerNameCharaShort)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tbuf := bytes.NewBuffer(c)\n\tval := buf.String()\n\treturn val, nil\n}\n\n// GetPnPId returns the PnP ID for the BLE Peripheral\nfunc (d *DeviceInformationDriver) GetPnPId() (string, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(deviceInformationPnPIdCharaShort)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tbuf := bytes.NewBuffer(c)\n\tval := buf.String()\n\treturn val, nil\n}\n"
  },
  {
    "path": "drivers/ble/device_information_driver_test.go",
    "content": "package ble\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*DeviceInformationDriver)(nil)\n\nfunc TestNewDeviceInformationDriver(t *testing.T) {\n\t// arrange\n\td := NewDeviceInformationDriver(testutil.NewBleTestAdaptor())\n\t// act & assert\n\tassert.True(t, strings.HasPrefix(d.Name(), \"DeviceInformation\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewDeviceInformationDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewDeviceInformationDriver(a, WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestDeviceInformationGetModelNumber(t *testing.T) {\n\t// arrange\n\td := NewDeviceInformationDriver(testutil.NewBleTestAdaptor())\n\t// act\n\tmodelNo, err := d.GetModelNumber()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"2a24\", modelNo)\n}\n\nfunc TestDeviceInformationGetFirmwareRevision(t *testing.T) {\n\t// arrange\n\td := NewDeviceInformationDriver(testutil.NewBleTestAdaptor())\n\t// act\n\tfwRev, err := d.GetFirmwareRevision()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"2a26\", fwRev)\n}\n\nfunc TestDeviceInformationGetHardwareRevision(t *testing.T) {\n\t// arrange\n\td := NewDeviceInformationDriver(testutil.NewBleTestAdaptor())\n\t// act\n\thwRev, err := d.GetHardwareRevision()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"2a27\", hwRev)\n}\n\nfunc TestDeviceInformationGetManufacturerName(t *testing.T) {\n\t// arrange\n\td := NewDeviceInformationDriver(testutil.NewBleTestAdaptor())\n\t// act\n\tmanuName, err := d.GetManufacturerName()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"2a29\", manuName)\n}\n\nfunc TestDeviceInformationGetPnPId(t *testing.T) {\n\t// arrange\n\td := NewDeviceInformationDriver(testutil.NewBleTestAdaptor())\n\t// act\n\tpid, err := d.GetPnPId()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"2a50\", pid)\n}\n"
  },
  {
    "path": "drivers/ble/doc.go",
    "content": "/*\nPackage ble provides the Gobot drivers for several Bluetooth LE Services.\n\nFor more information refer to the README:\nhttps://github.com/hybridgroup/gobot/blob/release/drivers/ble/README.md\n*/\npackage ble // import \"gobot.io/x/gobot/v2/drivers/ble\"\n"
  },
  {
    "path": "drivers/ble/generic_access_driver.go",
    "content": "package ble\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\tgenericAccessDeviceNameCharaShort = \"2a00\"\n\tgenericAccessAppearanceCharaShort = \"2a01\"\n)\n\n// GenericAccessDriver represents the Generic Access Service for a BLE Peripheral\ntype GenericAccessDriver struct {\n\t*Driver\n\tgobot.Eventer\n}\n\n// NewGenericAccessDriver creates a GenericAccessDriver\nfunc NewGenericAccessDriver(a gobot.BLEConnector, opts ...OptionApplier) *GenericAccessDriver {\n\td := &GenericAccessDriver{\n\t\tDriver:  NewDriver(a, \"GenericAccess\", nil, nil, opts...),\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\treturn d\n}\n\n// GetDeviceName returns the device name for the BLE Peripheral\nfunc (d *GenericAccessDriver) GetDeviceName() (string, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(genericAccessDeviceNameCharaShort)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tbuf := bytes.NewBuffer(c)\n\tval := buf.String()\n\treturn val, nil\n}\n\n// GetAppearance returns the appearance string for the BLE Peripheral\nfunc (d *GenericAccessDriver) GetAppearance() (string, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(genericAccessAppearanceCharaShort)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tbuf := bytes.NewBuffer(c)\n\n\tvar val uint16\n\tif err := binary.Read(buf, binary.LittleEndian, &val); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn appearances[val], nil\n}\n\nvar appearances = map[uint16]string{\n\t0:    \"Unknown\",\n\t1024: \"Generic Glucose Meter\",\n\t1088: \"Generic: Running Walking Sensor\",\n\t1089: \"Running Walking Sensor: In-Shoe\",\n\t1090: \"Running Walking Sensor: On-Shoe\",\n\t1091: \"Running Walking Sensor: On-Hip\",\n\t1152: \"Generic: Cycling\",\n\t1153: \"Cycling: Cycling Computer\",\n\t1154: \"Cycling: Speed Sensor\",\n\t1155: \"Cycling: Cadence Sensor\",\n\t1156: \"Cycling: Power Sensor\",\n\t1157: \"Cycling: Speed and Cadence Sensor\",\n\t128:  \"Generic Computer\",\n\t192:  \"Generic Watch\",\n\t193:  \"Watch: Sports Watch\",\n\t256:  \"Generic Clock\",\n\t3136: \"Generic: Pulse Oximeter\",\n\t3137: \"Fingertip Pulse\",\n\t3138: \"Wrist Worn\",\n\t320:  \"Generic Display\",\n\t3200: \"Generic: Weight Scale\",\n\t384:  \"Generic Remote Control\",\n\t448:  \"Generic Eye-glasses\",\n\t512:  \"Generic Tag\",\n\t5184: \"Generic: Outdoor Sports Activity\",\n\t5185: \"Location Display Device\",\n\t5186: \"Location and Navigation Display Device\",\n\t5187: \"Location Pod\",\n\t5188: \"Location and Navigation Pod\",\n\t576:  \"Generic Keyring\",\n\t64:   \"Generic Phone\",\n\t640:  \"Generic Media Player\",\n\t704:  \"Generic Barcode Scanner\",\n\t768:  \"Generic Thermometer\",\n\t769:  \"Thermometer: Ear\",\n\t832:  \"Generic Heart rate Sensor\",\n\t833:  \"Heart Rate Sensor: Heart Rate Belt\",\n\t896:  \"Generic Blood Pressure\",\n\t897:  \"Blood Pressure: Arm Blood\",\n\t898:  \"Blood Pressure: Wrist Blood\",\n\t960:  \"Human Interface Device (HID)\",\n\t961:  \"Keyboard\",\n\t962:  \"Mouse\",\n\t963:  \"Joystick\",\n\t964:  \"Gamepad\",\n\t965:  \"Digitizer Tablet\",\n\t966:  \"Card Reader\",\n\t967:  \"Digital Pen\",\n\t968:  \"Barcode Scanner\",\n}\n"
  },
  {
    "path": "drivers/ble/generic_access_driver_test.go",
    "content": "package ble\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*GenericAccessDriver)(nil)\n\nfunc TestNewGenericAccessDriver(t *testing.T) {\n\t// arrange\n\td := NewGenericAccessDriver(testutil.NewBleTestAdaptor())\n\t// act\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GenericAccess\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewGenericAccessDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewGenericAccessDriver(a, WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestGenericAccessDriverGetDeviceName(t *testing.T) {\n\t// arrange\n\td := NewGenericAccessDriver(testutil.NewBleTestAdaptor())\n\t// act\n\tdevName, err := d.GetDeviceName()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"2a00\", devName)\n}\n\nfunc TestGenericAccessDriverGetAppearance(t *testing.T) {\n\t// arrange\n\ta := testutil.NewBleTestAdaptor()\n\td := NewGenericAccessDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\tif cUUID == \"2a01\" {\n\t\t\treturn []byte{128, 0}, nil\n\t\t}\n\t\treturn nil, nil\n\t})\n\t// act\n\tapp, err := d.GetAppearance()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"Generic Computer\", app)\n}\n"
  },
  {
    "path": "drivers/ble/microbit/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/ble/microbit/accelerometer_driver.go",
    "content": "package microbit\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n)\n\nconst (\n\t// accelerometerService = \"e95d0753251d470aa062fa1922dfa9a8\"\n\taccelerometerChara = \"e95dca4b251d470aa062fa1922dfa9a8\"\n\n\tAccelerometerEvent = \"accelerometer\"\n)\n\n// AccelerometerDriver is the Gobot driver for the Microbit's built-in accelerometer\ntype AccelerometerDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n}\n\ntype AccelerometerData struct {\n\tX float32\n\tY float32\n\tZ float32\n}\n\n// NewAccelerometerDriver creates a  AccelerometerDriver\nfunc NewAccelerometerDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *AccelerometerDriver {\n\td := &AccelerometerDriver{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\td.Driver = ble.NewDriver(a, \"Microbit Accelerometer\", d.initialize, nil, opts...)\n\n\td.AddEvent(AccelerometerEvent)\n\n\treturn d\n}\n\n// initialize tells driver to get ready to do work\nfunc (d *AccelerometerDriver) initialize() error {\n\t// subscribe to accelerometer notifications\n\treturn d.Adaptor().Subscribe(accelerometerChara, func(data []byte) {\n\t\ta := struct{ x, y, z int16 }{x: 0, y: 0, z: 0}\n\n\t\tbuf := bytes.NewBuffer(data)\n\t\tif err := binary.Read(buf, binary.LittleEndian, &a.x); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif err := binary.Read(buf, binary.LittleEndian, &a.y); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif err := binary.Read(buf, binary.LittleEndian, &a.z); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tresult := &AccelerometerData{\n\t\t\tX: float32(a.x) / 1000.0,\n\t\t\tY: float32(a.y) / 1000.0,\n\t\t\tZ: float32(a.z) / 1000.0,\n\t\t}\n\n\t\td.Publish(d.Event(AccelerometerEvent), result)\n\t})\n}\n"
  },
  {
    "path": "drivers/ble/microbit/accelerometer_driver_test.go",
    "content": "//nolint:forcetypeassert,dupl // ok here\npackage microbit\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*AccelerometerDriver)(nil)\n\nfunc TestNewAccelerometerDriver(t *testing.T) {\n\td := NewAccelerometerDriver(testutil.NewBleTestAdaptor())\n\tassert.IsType(t, &AccelerometerDriver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Microbit Accelerometer\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewAccelerometerDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewAccelerometerDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestAccelerometerStartAndHalt(t *testing.T) {\n\td := NewAccelerometerDriver(testutil.NewBleTestAdaptor())\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestAccelerometerReadData(t *testing.T) {\n\tsem := make(chan bool)\n\ta := testutil.NewBleTestAdaptor()\n\td := NewAccelerometerDriver(a)\n\trequire.NoError(t, d.Start())\n\n\terr := d.On(\"accelerometer\", func(data interface{}) {\n\t\tassert.InDelta(t, float32(8.738), data.(*AccelerometerData).X, 0.0)\n\t\tassert.InDelta(t, float32(8.995), data.(*AccelerometerData).Y, 0.0)\n\t\tassert.InDelta(t, float32(9.252), data.(*AccelerometerData).Z, 0.0)\n\t\tsem <- true\n\t})\n\n\trequire.NoError(t, err)\n\n\ta.SendTestDataToSubscriber([]byte{0x22, 0x22, 0x23, 0x23, 0x24, 0x24})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Microbit Event \\\"Accelerometer\\\" was not published\")\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/microbit/button_driver.go",
    "content": "package microbit\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n)\n\nconst (\n\t// buttonService = \"e95d9882251d470aa062fa1922dfa9a8\"\n\tbuttonAChara = \"e95dda90251d470aa062fa1922dfa9a8\"\n\tbuttonBChara = \"e95dda91251d470aa062fa1922dfa9a8\"\n\n\tButtonAEvent = \"buttonA\"\n\tButtonBEvent = \"buttonB\"\n)\n\n// ButtonDriver is the Gobot driver for the Microbit's built-in buttons\ntype ButtonDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n}\n\n// NewButtonDriver creates a new driver\nfunc NewButtonDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *ButtonDriver {\n\td := &ButtonDriver{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\td.Driver = ble.NewDriver(a, \"Microbit Button\", d.initialize, nil, opts...)\n\n\td.AddEvent(ButtonAEvent)\n\td.AddEvent(ButtonBEvent)\n\n\treturn d\n}\n\n// initialize tells driver to get ready to do work\nfunc (d *ButtonDriver) initialize() error {\n\t// subscribe to button A notifications\n\tif err := d.Adaptor().Subscribe(buttonAChara, func(data []byte) {\n\t\td.Publish(d.Event(ButtonAEvent), data)\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\t// subscribe to button B notifications\n\treturn d.Adaptor().Subscribe(buttonBChara, func(data []byte) {\n\t\td.Publish(d.Event(ButtonBEvent), data)\n\t})\n}\n"
  },
  {
    "path": "drivers/ble/microbit/button_driver_test.go",
    "content": "package microbit\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*ButtonDriver)(nil)\n\nfunc TestNewButtonDriver(t *testing.T) {\n\td := NewButtonDriver(testutil.NewBleTestAdaptor())\n\tassert.IsType(t, &ButtonDriver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Microbit Button\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewButtonDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewButtonDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestButtonStartAndHalt(t *testing.T) {\n\td := NewButtonDriver(testutil.NewBleTestAdaptor())\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestButtonReadData(t *testing.T) {\n\tsem := make(chan bool)\n\ta := testutil.NewBleTestAdaptor()\n\td := NewButtonDriver(a)\n\trequire.NoError(t, d.Start())\n\n\terr := d.On(\"buttonB\", func(data interface{}) {\n\t\tsem <- true\n\t})\n\trequire.NoError(t, err)\n\n\ta.SendTestDataToSubscriber([]byte{1})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Microbit Event \\\"ButtonB\\\" was not published\")\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/microbit/doc.go",
    "content": "/*\nPackage microbit contains the Gobot drivers for the Microbit platform.\n\nFor more information refer to the microbit README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/microbit/README.md\n*/\npackage microbit // import \"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n"
  },
  {
    "path": "drivers/ble/microbit/io_pin_driver.go",
    "content": "package microbit\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/common/bit\"\n)\n\nconst (\n\t// ioPinService = \"e95d127b251d470aa062fa1922dfa9a8\"\n\tpinDataChara     = \"e95d8d00251d470aa062fa1922dfa9a8\"\n\tpinADConfigChara = \"e95d5899251d470aa062fa1922dfa9a8\"\n\tpinIOConfigChara = \"e95db9fe251d470aa062fa1922dfa9a8\"\n)\n\n// IOPinDriver is the Gobot driver for the Microbit's built-in digital and analog I/O\ntype IOPinDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n\n\tadMask int\n\tioMask int\n}\n\n// pinData has the read data for a specific digital pin\ntype pinData struct {\n\tpin   uint8\n\tvalue uint8\n}\n\n// NewIOPinDriver creates a new driver\nfunc NewIOPinDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *IOPinDriver {\n\td := &IOPinDriver{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\td.Driver = ble.NewDriver(a, \"Microbit IO Pins\", d.initialize, nil, opts...)\n\n\treturn d\n}\n\n// initialize tells driver to get ready to do work\nfunc (d *IOPinDriver) initialize() error {\n\tif _, err := d.ReadPinADConfig(); err != nil {\n\t\treturn err\n\t}\n\t_, err := d.ReadPinIOConfig()\n\treturn err\n}\n\n// WritePinData writes the pin data for a single pin\nfunc (d *IOPinDriver) WritePinData(pin string, data byte) error {\n\ti, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbuf := []byte{byte(i), data}\n\terr = d.Adaptor().WriteCharacteristic(pinDataChara, buf)\n\treturn err\n}\n\n// ReadPinADConfig reads and returns the pin A/D config mask for all pins\nfunc (d *IOPinDriver) ReadPinADConfig() (int, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(pinADConfigChara)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tvar result byte\n\tfor i := 0; i < 4; i++ {\n\t\tresult |= c[i] << uint(i) //nolint:gosec // ok here\n\t}\n\n\td.adMask = int(result)\n\treturn int(result), nil\n}\n\n// WritePinADConfig writes the pin A/D config mask for all pins\nfunc (d *IOPinDriver) WritePinADConfig(config int) error {\n\td.adMask = config\n\tdata := &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(data, binary.LittleEndian, uint32(config)); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.Adaptor().WriteCharacteristic(pinADConfigChara, data.Bytes())\n}\n\n// ReadPinIOConfig reads and returns the pin IO config mask for all pins\nfunc (d *IOPinDriver) ReadPinIOConfig() (int, error) {\n\tc, err := d.Adaptor().ReadCharacteristic(pinIOConfigChara)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar result byte\n\tfor i := 0; i < 4; i++ {\n\t\tresult |= c[i] << uint(i) //nolint:gosec // ok here\n\t}\n\n\td.ioMask = int(result)\n\treturn int(result), nil\n}\n\n// WritePinIOConfig writes the pin I/O config mask for all pins\nfunc (d *IOPinDriver) WritePinIOConfig(config int) error {\n\td.ioMask = config\n\tdata := &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(data, binary.LittleEndian, uint32(config)); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.Adaptor().WriteCharacteristic(pinIOConfigChara, data.Bytes())\n}\n\n// DigitalRead reads from a pin\nfunc (d *IOPinDriver) DigitalRead(pin string) (int, error) {\n\tp, err := validatedPin(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif err := d.ensureDigital(p); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.ensureInput(p); err != nil {\n\t\treturn 0, err\n\t}\n\n\tpins, err := d.readAllPinData()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(pins[p].value), nil\n}\n\n// DigitalWrite writes to a pin\nfunc (d *IOPinDriver) DigitalWrite(pin string, level byte) error {\n\tp, err := validatedPin(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.ensureDigital(p); err != nil {\n\t\treturn err\n\t}\n\tif err := d.ensureOutput(p); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.WritePinData(pin, level)\n}\n\n// AnalogRead reads from a pin\nfunc (d *IOPinDriver) AnalogRead(pin string) (int, error) {\n\tp, err := validatedPin(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif err := d.ensureAnalog(p); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.ensureInput(p); err != nil {\n\t\treturn 0, err\n\t}\n\n\tpins, err := d.readAllPinData()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(pins[p].value), nil\n}\n\nfunc (d *IOPinDriver) ensureDigital(pin int) error {\n\t//nolint:gosec // TODO: fix later\n\tif bit.IsSet(d.adMask, uint8(pin)) {\n\t\treturn d.WritePinADConfig(bit.Clear(d.adMask, uint8(pin)))\n\t}\n\n\treturn nil\n}\n\nfunc (d *IOPinDriver) ensureAnalog(pin int) error {\n\t//nolint:gosec // TODO: fix later\n\tif !bit.IsSet(d.adMask, uint8(pin)) {\n\t\treturn d.WritePinADConfig(bit.Set(d.adMask, uint8(pin)))\n\t}\n\n\treturn nil\n}\n\nfunc (d *IOPinDriver) ensureInput(pin int) error {\n\t//nolint:gosec // TODO: fix later\n\tif !bit.IsSet(d.ioMask, uint8(pin)) {\n\t\treturn d.WritePinIOConfig(bit.Set(d.ioMask, uint8(pin)))\n\t}\n\n\treturn nil\n}\n\nfunc (d *IOPinDriver) ensureOutput(pin int) error {\n\t//nolint:gosec // TODO: fix later\n\tif bit.IsSet(d.ioMask, uint8(pin)) {\n\t\treturn d.WritePinIOConfig(bit.Clear(d.ioMask, uint8(pin))) //nolint:gosec // TODO: fix later\n\t}\n\n\treturn nil\n}\n\nfunc (d *IOPinDriver) readAllPinData() ([]pinData, error) {\n\tc, _ := d.Adaptor().ReadCharacteristic(pinDataChara)\n\tbuf := bytes.NewBuffer(c)\n\tpinsData := make([]pinData, buf.Len()/2)\n\n\tfor i := 0; i < buf.Len()/2; i++ {\n\t\tpin, err := buf.ReadByte()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvalue, err := buf.ReadByte()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tpinData := pinData{\n\t\t\tpin:   pin,\n\t\t\tvalue: value,\n\t\t}\n\t\tpinsData[i] = pinData\n\t}\n\n\treturn pinsData, nil\n}\n\nfunc validatedPin(pin string) (int, error) {\n\ti, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif i < 0 || i > 2 {\n\t\treturn 0, errors.New(\"invalid pin\")\n\t}\n\n\treturn i, nil\n}\n"
  },
  {
    "path": "drivers/ble/microbit/io_pin_driver_test.go",
    "content": "package microbit\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n)\n\n// the MicrobitIOPinDriver is a Driver\nvar _ gobot.Driver = (*IOPinDriver)(nil)\n\n// that supports the DigitalReader, DigitalWriter, & AnalogReader interfaces\nvar (\n\t_ gpio.DigitalReader = (*IOPinDriver)(nil)\n\t_ gpio.DigitalWriter = (*IOPinDriver)(nil)\n\t_ aio.AnalogReader   = (*IOPinDriver)(nil)\n)\n\nfunc TestNewIOPinDriver(t *testing.T) {\n\td := NewIOPinDriver(testutil.NewBleTestAdaptor())\n\tassert.IsType(t, &IOPinDriver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Microbit IO Pin\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewIOPinDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewIOPinDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestIOPinStartAndHalt(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\treturn []byte{0, 1, 1, 0}, nil\n\t})\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestIOPinStartError(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\treturn nil, errors.New(\"read error\")\n\t})\n\trequire.ErrorContains(t, d.Start(), \"read error\")\n}\n\nfunc TestIOPinDigitalRead(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\treturn []byte{0, 1, 1, 0, 2, 1}, nil\n\t})\n\n\tval, err := d.DigitalRead(\"0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, val)\n\n\tval, err = d.DigitalRead(\"1\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, val)\n}\n\nfunc TestIOPinDigitalReadInvalidPin(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\n\t_, err := d.DigitalRead(\"A3\")\n\trequire.Error(t, err)\n\n\t_, err = d.DigitalRead(\"6\")\n\trequire.ErrorContains(t, err, \"invalid pin\")\n}\n\nfunc TestIOPinDigitalWrite(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\n\t// TODO: a better test\n\trequire.NoError(t, d.DigitalWrite(\"0\", 1))\n}\n\nfunc TestIOPinDigitalWriteInvalidPin(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\n\trequire.Error(t, d.DigitalWrite(\"A3\", 1))\n\trequire.ErrorContains(t, d.DigitalWrite(\"6\", 1), \"invalid pin\")\n}\n\nfunc TestIOPinAnalogRead(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\treturn []byte{0, 0, 1, 128, 2, 1}, nil\n\t})\n\n\tval, err := d.AnalogRead(\"0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, val)\n\n\tval, err = d.AnalogRead(\"1\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 128, val)\n}\n\nfunc TestIOPinAnalogReadInvalidPin(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\n\t_, err := d.AnalogRead(\"A3\")\n\trequire.Error(t, err)\n\n\t_, err = d.AnalogRead(\"6\")\n\trequire.ErrorContains(t, err, \"invalid pin\")\n}\n\nfunc TestIOPinDigitalAnalogRead(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\treturn []byte{0, 0, 1, 128, 2, 1}, nil\n\t})\n\n\tval, err := d.DigitalRead(\"0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, val)\n\n\tval, err = d.AnalogRead(\"0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, val)\n}\n\nfunc TestIOPinDigitalWriteAnalogRead(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\treturn []byte{0, 0, 1, 128, 2, 1}, nil\n\t})\n\n\trequire.NoError(t, d.DigitalWrite(\"1\", 0))\n\n\tval, err := d.AnalogRead(\"1\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 128, val)\n}\n\nfunc TestIOPinAnalogReadDigitalWrite(t *testing.T) {\n\ta := testutil.NewBleTestAdaptor()\n\td := NewIOPinDriver(a)\n\ta.SetReadCharacteristicTestFunc(func(cUUID string) ([]byte, error) {\n\t\treturn []byte{0, 0, 1, 128, 2, 1}, nil\n\t})\n\n\tval, err := d.AnalogRead(\"1\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 128, val)\n\n\trequire.NoError(t, d.DigitalWrite(\"1\", 0))\n}\n"
  },
  {
    "path": "drivers/ble/microbit/led_driver.go",
    "content": "package microbit\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n)\n\nconst (\n\t// ledService = \"e95dd91d251d470aa062fa1922dfa9a8\"\n\tledMatrixStateChara    = \"e95d7b77251d470aa062fa1922dfa9a8\"\n\tledTextChara           = \"e95d93ee251d470aa062fa1922dfa9a8\"\n\tledScrollingDelayChara = \"e95d0d2d251d470aa062fa1922dfa9a8\"\n)\n\n// LEDDriver is the Gobot driver for the Microbit's LED array\ntype LEDDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n}\n\n// NewLEDDriver creates a Microbit LEDDriver\nfunc NewLEDDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *LEDDriver {\n\td := &LEDDriver{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\td.Driver = ble.NewDriver(a, \"Microbit LED\", nil, nil, opts...)\n\n\treturn d\n}\n\n// ReadMatrix read the current LED matrix state\nfunc (b *LEDDriver) ReadMatrix() ([]byte, error) {\n\treturn b.Adaptor().ReadCharacteristic(ledMatrixStateChara)\n}\n\n// WriteMatrix writes an array of 5 bytes to set the LED matrix\nfunc (b *LEDDriver) WriteMatrix(data []byte) error {\n\treturn b.Adaptor().WriteCharacteristic(ledMatrixStateChara, data)\n}\n\n// WriteText writes a text message to the Microbit LED matrix\nfunc (b *LEDDriver) WriteText(msg string) error {\n\treturn b.Adaptor().WriteCharacteristic(ledTextChara, []byte(msg))\n}\n\nfunc (b *LEDDriver) ReadScrollingDelay() (uint16, error) {\n\treturn 0, nil\n}\n\nfunc (b *LEDDriver) WriteScrollingDelay(delay uint16) error {\n\tbuf := []byte{byte(delay)}\n\treturn b.Adaptor().WriteCharacteristic(ledScrollingDelayChara, buf)\n}\n\n// Blank clears the LEDs on the Microbit\nfunc (b *LEDDriver) Blank() error {\n\tbuf := []byte{0x00, 0x00, 0x00, 0x00, 0x00}\n\treturn b.WriteMatrix(buf)\n}\n\n// Solid turns on all of the Microbit LEDs\nfunc (b *LEDDriver) Solid() error {\n\tbuf := []byte{0x1F, 0x1F, 0x1F, 0x1F, 0x1F}\n\treturn b.WriteMatrix(buf)\n}\n\n// UpRightArrow displays an arrow pointing upwards and to the right on the Microbit LEDs\nfunc (b *LEDDriver) UpRightArrow() error {\n\tbuf := []byte{0x0F, 0x03, 0x05, 0x09, 0x10}\n\treturn b.WriteMatrix(buf)\n}\n\n// UpLeftArrow displays an arrow pointing upwards and to the left on the Microbit LEDs\nfunc (b *LEDDriver) UpLeftArrow() error {\n\tbuf := []byte{0x1E, 0x18, 0x14, 0x12, 0x01}\n\treturn b.WriteMatrix(buf)\n}\n\n// DownRightArrow displays an arrow pointing down and to the right on the Microbit LEDs\nfunc (b *LEDDriver) DownRightArrow() error {\n\tbuf := []byte{0x10, 0x09, 0x05, 0x03, 0x0F}\n\treturn b.WriteMatrix(buf)\n}\n\n// DownLeftArrow displays an arrow pointing down and to the left on the Microbit LEDs\nfunc (b *LEDDriver) DownLeftArrow() error {\n\tbuf := []byte{0x01, 0x12, 0x14, 0x18, 0x1E}\n\treturn b.WriteMatrix(buf)\n}\n\n// Dimond displays a dimond on the Microbit LEDs\nfunc (b *LEDDriver) Dimond() error {\n\tbuf := []byte{0x04, 0x0A, 0x11, 0x0A, 0x04}\n\treturn b.WriteMatrix(buf)\n}\n\n// Smile displays a smile on the Microbit LEDs\nfunc (b *LEDDriver) Smile() error {\n\tbuf := []byte{0x0A, 0x0A, 0x00, 0x11, 0x0E}\n\treturn b.WriteMatrix(buf)\n}\n\n// Wink displays a wink on the Microbit LEDs\nfunc (b *LEDDriver) Wink() error {\n\tbuf := []byte{0x08, 0x0B, 0x00, 0x11, 0x0E}\n\treturn b.WriteMatrix(buf)\n}\n"
  },
  {
    "path": "drivers/ble/microbit/led_driver_test.go",
    "content": "package microbit\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*LEDDriver)(nil)\n\nfunc initTestLEDDriver() *LEDDriver {\n\td := NewLEDDriver(testutil.NewBleTestAdaptor())\n\treturn d\n}\n\nfunc TestNewLEDDriver(t *testing.T) {\n\td := NewLEDDriver(testutil.NewBleTestAdaptor())\n\tassert.IsType(t, &LEDDriver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Microbit LED\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewLEDDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewLEDDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestLEDWriteMatrix(t *testing.T) {\n\td := initTestLEDDriver()\n\trequire.NoError(t, d.WriteMatrix([]byte{0x01, 0x02}))\n}\n\nfunc TestLEDWriteText(t *testing.T) {\n\td := initTestLEDDriver()\n\trequire.NoError(t, d.WriteText(\"Hello\"))\n}\n\nfunc TestLEDCommands(t *testing.T) {\n\td := initTestLEDDriver()\n\trequire.NoError(t, d.Blank())\n\trequire.NoError(t, d.Solid())\n\trequire.NoError(t, d.UpRightArrow())\n\trequire.NoError(t, d.UpLeftArrow())\n\trequire.NoError(t, d.DownRightArrow())\n\trequire.NoError(t, d.DownLeftArrow())\n\trequire.NoError(t, d.Dimond())\n\trequire.NoError(t, d.Smile())\n\trequire.NoError(t, d.Wink())\n}\n"
  },
  {
    "path": "drivers/ble/microbit/magnetometer_driver.go",
    "content": "package microbit\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n)\n\nconst (\n\t// magnetometerService = \"e95df2d8251d470aa062fa1922dfa9a8\"\n\tmagnetometerChara = \"e95dfb11251d470aa062fa1922dfa9a8\"\n\n\tMagnetometerEvent = \"magnetometer\"\n)\n\n// MagnetometerDriver is the Gobot driver for the Microbit's built-in magnetometer\ntype MagnetometerDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n}\n\ntype MagnetometerData struct {\n\tX float32\n\tY float32\n\tZ float32\n}\n\n// NewMagnetometerDriver creates a Microbit MagnetometerDriver\nfunc NewMagnetometerDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *MagnetometerDriver {\n\td := &MagnetometerDriver{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\td.Driver = ble.NewDriver(a, \"Microbit Magnetometer\", d.initialize, nil, opts...)\n\n\td.AddEvent(MagnetometerEvent)\n\n\treturn d\n}\n\n// initialize tells driver to get ready to do work\nfunc (d *MagnetometerDriver) initialize() error {\n\t// subscribe to magnetometer notifications\n\treturn d.Adaptor().Subscribe(magnetometerChara, func(data []byte) {\n\t\ta := struct{ x, y, z int16 }{x: 0, y: 0, z: 0}\n\n\t\tbuf := bytes.NewBuffer(data)\n\t\tif err := binary.Read(buf, binary.LittleEndian, &a.x); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif err := binary.Read(buf, binary.LittleEndian, &a.y); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif err := binary.Read(buf, binary.LittleEndian, &a.z); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tresult := &MagnetometerData{\n\t\t\tX: float32(a.x) / 1000.0,\n\t\t\tY: float32(a.y) / 1000.0,\n\t\t\tZ: float32(a.z) / 1000.0,\n\t\t}\n\n\t\td.Publish(d.Event(MagnetometerEvent), result)\n\t})\n}\n"
  },
  {
    "path": "drivers/ble/microbit/magnetometer_driver_test.go",
    "content": "//nolint:forcetypeassert,dupl // ok here\npackage microbit\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*MagnetometerDriver)(nil)\n\nfunc initTestMagnetometerDriver() *MagnetometerDriver {\n\td := NewMagnetometerDriver(testutil.NewBleTestAdaptor())\n\treturn d\n}\n\nfunc TestMagnetometerDriver(t *testing.T) {\n\td := NewMagnetometerDriver(testutil.NewBleTestAdaptor())\n\tassert.IsType(t, &MagnetometerDriver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Microbit Magnetometer\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewMagnetometerDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewMagnetometerDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestMagnetometerStartAndHalt(t *testing.T) {\n\td := initTestMagnetometerDriver()\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMagnetometerReadData(t *testing.T) {\n\tsem := make(chan bool)\n\ta := testutil.NewBleTestAdaptor()\n\td := NewMagnetometerDriver(a)\n\trequire.NoError(t, d.Start())\n\terr := d.On(\"magnetometer\", func(data interface{}) {\n\t\tassert.InDelta(t, float32(8.738), data.(*MagnetometerData).X, 0.0)\n\t\tassert.InDelta(t, float32(8.995), data.(*MagnetometerData).Y, 0.0)\n\t\tassert.InDelta(t, float32(9.252), data.(*MagnetometerData).Z, 0.0)\n\t\tsem <- true\n\t})\n\trequire.NoError(t, err)\n\n\ta.SendTestDataToSubscriber([]byte{0x22, 0x22, 0x23, 0x23, 0x24, 0x24})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Microbit Event \\\"Magnetometer\\\" was not published\")\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/microbit/temperature_driver.go",
    "content": "package microbit\n\nimport (\n\t\"bytes\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n)\n\nconst (\n\t// temperatureService = \"e95d6100251d470aa062fa1922dfa9a8\"\n\ttemperatureChara = \"e95d9250251d470aa062fa1922dfa9a8\"\n\n\tTemperatureEvent = \"temperature\"\n)\n\n// TemperatureDriver is the Gobot driver for the Microbit's built-in thermometer\ntype TemperatureDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n}\n\n// NewTemperatureDriver creates a Microbit TemperatureDriver\nfunc NewTemperatureDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *TemperatureDriver {\n\td := &TemperatureDriver{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\td.Driver = ble.NewDriver(a, \"Microbit Temperature\", d.initialize, nil, opts...)\n\n\td.AddEvent(TemperatureEvent)\n\n\treturn d\n}\n\n// initialize tells driver to get ready to do work\nfunc (d *TemperatureDriver) initialize() error {\n\t// subscribe to temperature notifications\n\treturn d.Adaptor().Subscribe(temperatureChara, func(data []byte) {\n\t\tvar l int8\n\t\tbuf := bytes.NewBuffer(data)\n\t\tval, _ := buf.ReadByte()\n\t\tl = int8(val)\n\n\t\td.Publish(d.Event(TemperatureEvent), l)\n\t})\n}\n"
  },
  {
    "path": "drivers/ble/microbit/temperature_driver_test.go",
    "content": "package microbit\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*TemperatureDriver)(nil)\n\nfunc initTestTemperatureDriver() *TemperatureDriver {\n\td := NewTemperatureDriver(testutil.NewBleTestAdaptor())\n\treturn d\n}\n\nfunc TestNewTemperatureDriver(t *testing.T) {\n\td := NewTemperatureDriver(testutil.NewBleTestAdaptor())\n\tassert.IsType(t, &TemperatureDriver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Microbit Temperature\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewTemperatureDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewTemperatureDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestTemperatureStartAndHalt(t *testing.T) {\n\td := initTestTemperatureDriver()\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestTemperatureReadData(t *testing.T) {\n\tsem := make(chan bool)\n\ta := testutil.NewBleTestAdaptor()\n\td := NewTemperatureDriver(a)\n\trequire.NoError(t, d.Start())\n\terr := d.On(\"temperature\", func(data interface{}) {\n\t\tassert.Equal(t, int8(0x22), data)\n\t\tsem <- true\n\t})\n\trequire.NoError(t, err)\n\n\ta.SendTestDataToSubscriber([]byte{0x22})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Microbit Event \\\"Temperature\\\" was not published\")\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/parrot/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/ble/parrot/doc.go",
    "content": "/*\nPackage parrot contains the Gobot driver for the Parrot Minidrone platform.\n\nFor more information refer to the minidrone README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/parrot/minidrone/README.md\n*/\npackage parrot // import \"gobot.io/x/gobot/v2/drivers/ble/parrot\"\n"
  },
  {
    "path": "drivers/ble/parrot/minidrone_driver.go",
    "content": "package parrot\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"math\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n)\n\nconst (\n\t// droneCommandService      = \"9a66fa000800919111e4012d1540cb8e\"\n\t// droneNotificationService = \"9a66fb000800919111e4012d1540cb8e\"\n\n\t// send characteristics\n\tpcmdChara     = \"9a66fa0a0800919111e4012d1540cb8e\"\n\tcommandChara  = \"9a66fa0b0800919111e4012d1540cb8e\"\n\tpriorityChara = \"9a66fa0c0800919111e4012d1540cb8e\"\n\n\t// receive characteristics\n\tflightStatusChara = \"9a66fb0e0800919111e4012d1540cb8e\"\n\tbatteryChara      = \"9a66fb0f0800919111e4012d1540cb8e\"\n\n\t// piloting states\n\tflatTrimChanged    = 0\n\tflyingStateChanged = 1\n\n\t// flying states\n\tflyingStateLanded    = 0\n\tflyingStateTakeoff   = 1\n\tflyingStateHovering  = 2\n\tflyingStateFlying    = 3\n\tflyingStateLanding   = 4\n\tflyingStateEmergency = 5\n\tflyingStateRolling   = 6\n\n\tBatteryEvent        = \"battery\"\n\tFlightStatusEvent   = \"flightstatus\"\n\tTakeoffEvent        = \"takeoff\"\n\tHoveringEvent       = \"hovering\"\n\tFlyingEvent         = \"flying\"\n\tLandingEvent        = \"landing\"\n\tLandedEvent         = \"landed\"\n\tEmergencyEvent      = \"emergency\"\n\tRollingEvent        = \"rolling\"\n\tFlatTrimChangeEvent = \"flattrimchange\"\n\n\t// modes for LightControl\n\tLightFixed      = 0\n\tLightBlinked    = 1\n\tLightOscillated = 3\n\n\t// modes for ClawControl\n\tClawOpen   = 0\n\tClawClosed = 1\n)\n\n// MinidroneDriver is the Gobot interface to the Parrot Minidrone\ntype MinidroneDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n\n\tstepsfa0a uint16\n\tstepsfa0b uint16\n\tpcmdMutex sync.Mutex\n\tflying    bool\n\tPcmd      Pcmd\n}\n\n// Pcmd is the Parrot Command structure for flight control\ntype Pcmd struct {\n\tFlag  int\n\tRoll  int\n\tPitch int\n\tYaw   int\n\tGaz   int\n\tPsi   float32\n}\n\n// NewMinidroneDriver creates a Parrot Minidrone Driver\nfunc NewMinidroneDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *MinidroneDriver {\n\td := &MinidroneDriver{\n\t\tPcmd: Pcmd{\n\t\t\tFlag:  0,\n\t\t\tRoll:  0,\n\t\t\tPitch: 0,\n\t\t\tYaw:   0,\n\t\t\tGaz:   0,\n\t\t\tPsi:   0,\n\t\t},\n\t\tEventer: gobot.NewEventer(),\n\t}\n\td.Driver = ble.NewDriver(a, \"Minidrone\", d.initialize, d.shutdown, opts...)\n\n\td.AddEvent(BatteryEvent)\n\td.AddEvent(FlightStatusEvent)\n\td.AddEvent(TakeoffEvent)\n\td.AddEvent(FlyingEvent)\n\td.AddEvent(HoveringEvent)\n\td.AddEvent(LandingEvent)\n\td.AddEvent(LandedEvent)\n\td.AddEvent(EmergencyEvent)\n\td.AddEvent(RollingEvent)\n\n\treturn d\n}\n\n// GenerateAllStates sets up all the default states aka settings on the drone\nfunc (d *MinidroneDriver) GenerateAllStates() error {\n\td.stepsfa0b++\n\tbuf := []byte{\n\t\t0x04, byte(d.stepsfa0b), 0x00, 0x04, 0x01, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2D, 0x31, 0x30, 0x2D, 0x32, 0x38, 0x00,\n\t}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// TakeOff tells the Minidrone to takeoff\nfunc (d *MinidroneDriver) TakeOff() error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x00, 0x01, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// Land tells the Minidrone to land\nfunc (d *MinidroneDriver) Land() error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x00, 0x03, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// FlatTrim calibrates the Minidrone to use its current position as being level\nfunc (d *MinidroneDriver) FlatTrim() error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x00, 0x00, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// Emergency sets the Minidrone into emergency mode\nfunc (d *MinidroneDriver) Emergency() error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x00, 0x04, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(priorityChara, buf)\n}\n\n// TakePicture tells the Minidrone to take a picture\nfunc (d *MinidroneDriver) TakePicture() error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x06, 0x01, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// StartPcmd starts the continuous Pcmd communication with the Minidrone\nfunc (d *MinidroneDriver) StartPcmd() {\n\tgo func() {\n\t\t// wait a little bit so that there is enough time to get some ACKs\n\t\ttime.Sleep(500 * time.Millisecond)\n\t\tfor {\n\t\t\terr := d.Adaptor().WriteCharacteristic(pcmdChara, d.generatePcmd().Bytes())\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"pcmd write error:\", err)\n\t\t\t}\n\t\t\ttime.Sleep(50 * time.Millisecond)\n\t\t}\n\t}()\n}\n\n// Up tells the drone to ascend. Pass in an int from 0-100.\nfunc (d *MinidroneDriver) Up(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Gaz = validatePitch(val)\n\treturn nil\n}\n\n// Down tells the drone to descend. Pass in an int from 0-100.\nfunc (d *MinidroneDriver) Down(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Gaz = validatePitch(val) * -1\n\treturn nil\n}\n\n// Forward tells the drone to go forward. Pass in an int from 0-100.\nfunc (d *MinidroneDriver) Forward(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Pitch = validatePitch(val)\n\treturn nil\n}\n\n// Backward tells drone to go in reverse. Pass in an int from 0-100.\nfunc (d *MinidroneDriver) Backward(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Pitch = validatePitch(val) * -1\n\treturn nil\n}\n\n// Right tells drone to go right. Pass in an int from 0-100.\nfunc (d *MinidroneDriver) Right(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Roll = validatePitch(val)\n\treturn nil\n}\n\n// Left tells drone to go left. Pass in an int from 0-100.\nfunc (d *MinidroneDriver) Left(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Roll = validatePitch(val) * -1\n\treturn nil\n}\n\n// Clockwise tells drone to rotate in a clockwise directiod. Pass in an int from 0-100.\nfunc (d *MinidroneDriver) Clockwise(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Yaw = validatePitch(val)\n\treturn nil\n}\n\n// CounterClockwise tells drone to rotate in a counter-clockwise directiod.\n// Pass in an int from 0-100.\nfunc (d *MinidroneDriver) CounterClockwise(val int) error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd.Flag = 1\n\td.Pcmd.Yaw = validatePitch(val) * -1\n\treturn nil\n}\n\n// Stop tells the drone to stop moving in any direction and simply hover in place\nfunc (d *MinidroneDriver) Stop() error {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\n\td.Pcmd = Pcmd{\n\t\tFlag:  0,\n\t\tRoll:  0,\n\t\tPitch: 0,\n\t\tYaw:   0,\n\t\tGaz:   0,\n\t\tPsi:   0,\n\t}\n\n\treturn nil\n}\n\n// StartRecording is not supported by the Parrot Minidrone\nfunc (d *MinidroneDriver) StartRecording() error {\n\treturn nil\n}\n\n// StopRecording is not supported by the Parrot Minidrone\nfunc (d *MinidroneDriver) StopRecording() error {\n\treturn nil\n}\n\n// HullProtection is not supported by the Parrot Minidrone\nfunc (d *MinidroneDriver) HullProtection(protect bool) error {\n\treturn nil\n}\n\n// Outdoor mode is not supported by the Parrot Minidrone\nfunc (d *MinidroneDriver) Outdoor(outdoor bool) error {\n\treturn nil\n}\n\n// FrontFlip tells the drone to perform a front flip\nfunc (d *MinidroneDriver) FrontFlip() error {\n\treturn d.Adaptor().WriteCharacteristic(commandChara, d.generateAnimation(0).Bytes())\n}\n\n// BackFlip tells the drone to perform a backflip\nfunc (d *MinidroneDriver) BackFlip() error {\n\treturn d.Adaptor().WriteCharacteristic(commandChara, d.generateAnimation(1).Bytes())\n}\n\n// RightFlip tells the drone to perform a flip to the right\nfunc (d *MinidroneDriver) RightFlip() error {\n\treturn d.Adaptor().WriteCharacteristic(commandChara, d.generateAnimation(2).Bytes())\n}\n\n// LeftFlip tells the drone to perform a flip to the left\nfunc (d *MinidroneDriver) LeftFlip() error {\n\treturn d.Adaptor().WriteCharacteristic(commandChara, d.generateAnimation(3).Bytes())\n}\n\n// LightControl controls lights on those Minidrone models which\n// have the correct hardware, such as the Maclane, Blaze, & Swat.\n// Params:\n//\n//\tid - always 0\n//\tmode - either LightFixed, LightBlinked, or LightOscillated\n//\tintensity - Light intensity from 0 (OFF) to 100 (Max intensity).\n//\t\t\t\tOnly used in LightFixed mode.\nfunc (d *MinidroneDriver) LightControl(id uint8, mode uint8, intensity uint8) error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x10, 0x00, id, mode, intensity, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// ClawControl controls the claw on the Parrot Mambo\n// Params:\n//\n//\tid - always 0\n//\tmode - either ClawOpen or ClawClosed\nfunc (d *MinidroneDriver) ClawControl(id uint8, mode uint8) error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x10, 0x01, id, mode, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// GunControl fires the gun on the Parrot Mambo\n// Params:\n//\n//\tid - always 0\nfunc (d *MinidroneDriver) GunControl(id uint8) error {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x10, 0x02, id, 0x00}\n\treturn d.Adaptor().WriteCharacteristic(commandChara, buf)\n}\n\n// initialize tells driver to get ready to do work\nfunc (d *MinidroneDriver) initialize() error {\n\td.Adaptor().WithoutResponses(true)\n\n\tif err := d.GenerateAllStates(); err != nil {\n\t\treturn err\n\t}\n\n\t// subscribe to battery notifications\n\tif err := d.Adaptor().Subscribe(batteryChara, func(data []byte) {\n\t\td.Publish(d.Event(BatteryEvent), data[len(data)-1])\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\t// subscribe to flying status notifications\n\tif err := d.Adaptor().Subscribe(flightStatusChara, func(data []byte) {\n\t\td.processFlightStatus(data)\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.FlatTrim(); err != nil {\n\t\treturn err\n\t}\n\n\td.StartPcmd()\n\n\treturn d.FlatTrim()\n}\n\n// shutdown stops minidrone driver (void)\nfunc (d *MinidroneDriver) shutdown() error {\n\terr := d.Land()\n\ttime.Sleep(500 * time.Millisecond)\n\treturn err\n}\n\nfunc (d *MinidroneDriver) generateAnimation(direction int8) *bytes.Buffer {\n\td.stepsfa0b++\n\tbuf := []byte{0x02, byte(d.stepsfa0b) & 0xff, 0x02, 0x04, 0x00, 0x00, byte(direction), 0x00, 0x00, 0x00}\n\treturn bytes.NewBuffer(buf)\n}\n\nfunc (d *MinidroneDriver) generatePcmd() *bytes.Buffer {\n\td.pcmdMutex.Lock()\n\tdefer d.pcmdMutex.Unlock()\n\td.stepsfa0a++\n\tpcmd := d.Pcmd\n\n\tcmd := &bytes.Buffer{}\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(2)); err != nil {\n\t\tpanic(err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(d.stepsfa0a)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(2)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(0)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(2)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(0)); err != nil {\n\t\tpanic(err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(pcmd.Flag)); err != nil {\n\t\tpanic(err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(pcmd.Roll)); err != nil {\n\t\tpanic(err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(pcmd.Pitch)); err != nil {\n\t\tpanic(err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(pcmd.Yaw)); err != nil {\n\t\tpanic(err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(cmd, binary.LittleEndian, int8(pcmd.Gaz)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(cmd, binary.LittleEndian, pcmd.Psi); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(cmd, binary.LittleEndian, int16(0)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(cmd, binary.LittleEndian, int16(0)); err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn cmd\n}\n\nfunc (d *MinidroneDriver) processFlightStatus(data []byte) {\n\tif len(data) < 5 {\n\t\t// ignore, just a sync\n\t\treturn\n\t}\n\n\td.Publish(FlightStatusEvent, data[4])\n\n\tswitch data[4] {\n\tcase flatTrimChanged:\n\t\td.Publish(FlatTrimChangeEvent, true)\n\n\tcase flyingStateChanged:\n\t\tswitch data[6] {\n\t\tcase flyingStateLanded:\n\t\t\tif d.flying {\n\t\t\t\td.flying = false\n\t\t\t\td.Publish(LandedEvent, true)\n\t\t\t}\n\t\tcase flyingStateTakeoff:\n\t\t\td.Publish(TakeoffEvent, true)\n\t\tcase flyingStateHovering:\n\t\t\tif !d.flying {\n\t\t\t\td.flying = true\n\t\t\t\td.Publish(HoveringEvent, true)\n\t\t\t}\n\t\tcase flyingStateFlying:\n\t\t\tif !d.flying {\n\t\t\t\td.flying = true\n\t\t\t\td.Publish(FlyingEvent, true)\n\t\t\t}\n\t\tcase flyingStateLanding:\n\t\t\td.Publish(LandingEvent, true)\n\t\tcase flyingStateEmergency:\n\t\t\td.Publish(EmergencyEvent, true)\n\t\tcase flyingStateRolling:\n\t\t\td.Publish(RollingEvent, true)\n\t\t}\n\t}\n}\n\n// ValidatePitch helps validate pitch values such as those created by\n// a joystick to values between 0-100 that are required as\n// params to Parrot Minidrone PCMDs\nfunc ValidatePitch(data float64, offset float64) int {\n\tvalue := math.Abs(data) / offset\n\tif value >= 0.1 {\n\t\tif value <= 1.0 {\n\t\t\treturn int((float64(int(value*100)) / 100) * 100)\n\t\t}\n\t\treturn 100\n\t}\n\treturn 0\n}\n\nfunc validatePitch(val int) int {\n\tif val > 100 {\n\t\treturn 100\n\t} else if val < 0 {\n\t\treturn 0\n\t}\n\n\treturn val\n}\n"
  },
  {
    "path": "drivers/ble/parrot/minidrone_driver_test.go",
    "content": "package parrot\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*MinidroneDriver)(nil)\n\nfunc initTestMinidroneDriver() *MinidroneDriver {\n\td := NewMinidroneDriver(testutil.NewBleTestAdaptor())\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d\n}\n\nfunc TestNewMinidroneDriver(t *testing.T) {\n\td := NewMinidroneDriver(testutil.NewBleTestAdaptor())\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Minidrone\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewMinidroneDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewMinidroneDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestMinidroneHalt(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMinidroneTakeoff(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.TakeOff())\n}\n\nfunc TestMinidroneEmergency(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Emergency())\n}\n\nfunc TestMinidroneTakePicture(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.TakePicture())\n}\n\nfunc TestMinidroneUp(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Up(25))\n}\n\nfunc TestMinidroneUpTooFar(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Up(125))\n\trequire.NoError(t, d.Up(-50))\n}\n\nfunc TestMinidroneDown(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Down(25))\n}\n\nfunc TestMinidroneForward(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Forward(25))\n}\n\nfunc TestMinidroneBackward(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Backward(25))\n}\n\nfunc TestMinidroneRight(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Right(25))\n}\n\nfunc TestMinidroneLeft(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Left(25))\n}\n\nfunc TestMinidroneClockwise(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Clockwise(25))\n}\n\nfunc TestMinidroneCounterClockwise(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.CounterClockwise(25))\n}\n\nfunc TestMinidroneStop(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.Stop())\n}\n\nfunc TestMinidroneStartStopRecording(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.StartRecording())\n\trequire.NoError(t, d.StopRecording())\n}\n\nfunc TestMinidroneHullProtectionOutdoor(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.HullProtection(true))\n\trequire.NoError(t, d.Outdoor(true))\n}\n\nfunc TestMinidroneHullFlips(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.FrontFlip())\n\trequire.NoError(t, d.BackFlip())\n\trequire.NoError(t, d.RightFlip())\n\trequire.NoError(t, d.LeftFlip())\n}\n\nfunc TestMinidroneLightControl(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.LightControl(0, LightBlinked, 25))\n}\n\nfunc TestMinidroneClawControl(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.ClawControl(0, ClawOpen))\n}\n\nfunc TestMinidroneGunControl(t *testing.T) {\n\td := initTestMinidroneDriver()\n\trequire.NoError(t, d.GunControl(0))\n}\n\nfunc TestMinidroneProcessFlightData(t *testing.T) {\n\td := initTestMinidroneDriver()\n\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00})\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x00})\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00})\n\tassert.False(t, d.flying)\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01})\n\tassert.False(t, d.flying)\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02})\n\tassert.True(t, d.flying)\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03})\n\tassert.True(t, d.flying)\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04})\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05})\n\td.processFlightStatus([]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06})\n\n\trequire.NoError(t, d.Stop())\n}\n\nfunc TestMinidroneValidatePitchWhenEqualOffset(t *testing.T) {\n\tassert.Equal(t, 100, ValidatePitch(32767.0, 32767.0))\n}\n\nfunc TestMinidroneValidatePitchWhenTiny(t *testing.T) {\n\tassert.Equal(t, 0, ValidatePitch(1.1, 32767.0))\n}\n\nfunc TestMinidroneValidatePitchWhenCentered(t *testing.T) {\n\tassert.Equal(t, 50, ValidatePitch(16383.5, 32767.0))\n}\n"
  },
  {
    "path": "drivers/ble/serial_port.go",
    "content": "package ble\n\nimport (\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// SerialPortDriver is a implementation of serial over Bluetooth LE\n// Inspired by https://github.com/monteslu/ble-serial by @monteslu\ntype SerialPortDriver struct {\n\t*Driver\n\n\trid string\n\ttid string\n\t// buffer of responseData and mutex to protect it\n\tresponseData  []byte\n\tresponseMutex sync.Mutex\n}\n\n// NewSerialPortDriver returns a new serial over Bluetooth LE connection\nfunc NewSerialPortDriver(a gobot.BLEConnector, rid string, tid string, opts ...OptionApplier) *SerialPortDriver {\n\td := &SerialPortDriver{\n\t\tDriver: NewDriver(a, \"BleSerial\", nil, nil, opts...),\n\t\trid:    rid,\n\t\ttid:    tid,\n\t}\n\n\treturn d\n}\n\n// Open opens a connection to a BLE serial device\nfunc (p *SerialPortDriver) Open() error {\n\tif err := p.Adaptor().Connect(); err != nil {\n\t\treturn err\n\t}\n\n\t// subscribe to response notifications\n\treturn p.Adaptor().Subscribe(p.rid, func(data []byte) {\n\t\tp.responseMutex.Lock()\n\t\tdefer p.responseMutex.Unlock()\n\t\tp.responseData = append(p.responseData, data...)\n\t})\n}\n\n// Read reads bytes from BLE serial port connection\nfunc (p *SerialPortDriver) Read(b []byte) (int, error) {\n\tp.responseMutex.Lock()\n\tdefer p.responseMutex.Unlock()\n\n\tif len(p.responseData) == 0 {\n\t\treturn 0, nil\n\t}\n\n\tn := len(b)\n\tif len(p.responseData) < n {\n\t\tn = len(p.responseData)\n\t}\n\tcopy(b, p.responseData[:n])\n\n\tif len(p.responseData) > n {\n\t\tp.responseData = p.responseData[n:]\n\t} else {\n\t\tp.responseData = nil\n\t}\n\n\treturn n, nil\n}\n\n// Write writes to the BLE serial port connection\nfunc (p *SerialPortDriver) Write(b []byte) (int, error) {\n\terr := p.Adaptor().WriteCharacteristic(p.tid, b)\n\tn := len(b)\n\treturn n, err\n}\n\n// Close closes the BLE serial port connection\nfunc (p *SerialPortDriver) Close() error {\n\treturn p.Adaptor().Disconnect()\n}\n\n// Address returns the BLE address\nfunc (p *SerialPortDriver) Address() string {\n\treturn p.Adaptor().Address()\n}\n"
  },
  {
    "path": "drivers/ble/serial_port_test.go",
    "content": "package ble\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*SerialPortDriver)(nil)\n\nvar _ io.ReadWriteCloser = (*SerialPortDriver)(nil)\n\nfunc TestNewSerialPortDriver(t *testing.T) {\n\td := NewSerialPortDriver(testutil.NewBleTestAdaptor(), \"123\", \"456\")\n\tassert.Equal(t, \"01:02:03:0A:0B:0C\", d.Address())\n}\n\nfunc TestNewSerialPortDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewSerialPortDriver(a, \"123\", \"456\", WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestSerialPortOpen(t *testing.T) {\n\tconst receiveCharacteristicUUID = \"123\"\n\ttests := map[string]struct {\n\t\tsimConnectErr   bool\n\t\tsimSubscribeErr bool\n\t\twantErr         string\n\t}{\n\t\t\"open_ok\": {},\n\t\t\"error_connect\": {\n\t\t\tsimConnectErr: true,\n\t\t\twantErr:       \"connect error\",\n\t\t},\n\t\t\"error_subscribe\": {\n\t\t\tsimSubscribeErr: true,\n\t\t\twantErr:         \"subscribe error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := testutil.NewBleTestAdaptor()\n\t\t\ta.SetSimulateConnectError(tc.simConnectErr)\n\t\t\ta.SetSimulateSubscribeError(tc.simSubscribeErr)\n\t\t\td := NewSerialPortDriver(a, receiveCharacteristicUUID, \"456\")\n\t\t\t// act\n\t\t\terr := d.Open()\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\ta.SendTestDataToSubscriber([]byte{3, 5, 7})\n\t\t\t\tassert.Equal(t, []byte{3, 5, 7}, d.responseData)\n\t\t\t\tassert.Equal(t, receiveCharacteristicUUID, a.SubscribeCharaUUID())\n\t\t\t} else {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSerialPortRead(t *testing.T) {\n\ttests := map[string]struct {\n\t\tavailableData  []byte\n\t\treadDataBuffer []byte\n\t\twantCount      int\n\t\twantData       []byte\n\t\twantRemaining  []byte\n\t}{\n\t\t\"no_data\": {\n\t\t\tavailableData:  []byte{},\n\t\t\treadDataBuffer: []byte{0, 0, 0},\n\t\t\twantCount:      0,\n\t\t\twantData:       []byte{0, 0, 0},\n\t\t\twantRemaining:  nil,\n\t\t},\n\t\t\"read_all\": {\n\t\t\tavailableData:  []byte{1, 2, 3},\n\t\t\treadDataBuffer: []byte{0, 0, 0},\n\t\t\twantCount:      3,\n\t\t\twantData:       []byte{1, 2, 3},\n\t\t\twantRemaining:  nil,\n\t\t},\n\t\t\"read_smaller\": {\n\t\t\tavailableData:  []byte{4, 6, 7},\n\t\t\treadDataBuffer: []byte{0, 0},\n\t\t\twantCount:      2,\n\t\t\twantData:       []byte{4, 6},\n\t\t\twantRemaining:  []byte{7},\n\t\t},\n\t\t\"read_bigger\": {\n\t\t\tavailableData:  []byte{7, 8},\n\t\t\treadDataBuffer: []byte{0, 0, 0},\n\t\t\twantCount:      2,\n\t\t\twantData:       []byte{7, 8, 0},\n\t\t\twantRemaining:  nil,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := NewSerialPortDriver(testutil.NewBleTestAdaptor(), \"123\", \"456\")\n\t\t\td.responseData = append(d.responseData, tc.availableData...)\n\t\t\t// act\n\t\t\tgotCount, err := d.Read(tc.readDataBuffer)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantCount, gotCount)\n\t\t\tassert.Equal(t, tc.wantData, tc.readDataBuffer)\n\t\t\tassert.Equal(t, tc.wantRemaining, d.responseData)\n\t\t})\n\t}\n}\n\nfunc TestSerialPortWrite(t *testing.T) {\n\tconst transmitCharacteristicUUID = \"456\"\n\ttests := map[string]struct {\n\t\twriteData []byte\n\t\tsimError  bool\n\t\twantCount int\n\t\twantData  []byte\n\t\twantErr   string\n\t}{\n\t\t\"write_ok\": {\n\t\t\twriteData: []byte{1, 2, 3},\n\t\t\twantCount: 3,\n\t\t\twantData:  []byte{1, 2, 3},\n\t\t},\n\t\t\"error_write\": {\n\t\t\twriteData: []byte{1, 2, 3},\n\t\t\tsimError:  true,\n\t\t\twantCount: 3,\n\t\t\twantData:  []byte{1, 2, 3},\n\t\t\twantErr:   \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := testutil.NewBleTestAdaptor()\n\t\t\tvar gotUUID string\n\t\t\tvar gotData []byte\n\t\t\ta.SetWriteCharacteristicTestFunc(func(cUUID string, data []byte) error {\n\t\t\t\tgotUUID = cUUID\n\t\t\t\tgotData = append(gotData, data...)\n\t\t\t\tif tc.simError {\n\t\t\t\t\treturn fmt.Errorf(\"write error\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t})\n\t\t\td := NewSerialPortDriver(a, \"123\", transmitCharacteristicUUID)\n\n\t\t\t// act\n\t\t\tgotCount, err := d.Write(tc.writeData)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantCount, gotCount)\n\t\t\tassert.Equal(t, transmitCharacteristicUUID, gotUUID)\n\t\t\tassert.Equal(t, tc.wantData, gotData)\n\t\t})\n\t}\n}\n\nfunc TestSerialPortClose(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimDisconnectErr bool\n\t\twantErr          string\n\t}{\n\t\t\"close_ok\": {},\n\t\t\"error_close\": {\n\t\t\tsimDisconnectErr: true,\n\t\t\twantErr:          \"disconnect error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := testutil.NewBleTestAdaptor()\n\t\t\ta.SetSimulateDisconnectError(tc.simDisconnectErr)\n\t\t\td := NewSerialPortDriver(a, \"123\", \"456\")\n\t\t\t// act\n\t\t\terr := d.Close()\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/sphero/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/ble/sphero/doc.go",
    "content": "/*\nPackage sphero provides the Gobot drivers for the Sphero BLE based platforms.\n\nFor further information refer to sphero readme files:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/sphero/bb8/README.md\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/sphero/ollie/README.md\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/sphero/sprkplus/README.md\n*/\npackage sphero // import \"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n"
  },
  {
    "path": "drivers/ble/sphero/sphero_bb8_driver.go",
    "content": "package sphero\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n)\n\n// BB8Driver represents a Sphero BB-8\ntype BB8Driver struct {\n\t*OllieDriver\n}\n\n// NewBB8Driver creates a driver for a Sphero BB-8\nfunc NewBB8Driver(a gobot.BLEConnector, opts ...ble.OptionApplier) *BB8Driver {\n\treturn &BB8Driver{OllieDriver: newOllieBaseDriver(a, \"BB8\", bb8DefaultCollisionConfig(), opts...)}\n}\n\n// bb8DefaultCollisionConfig returns a CollisionConfig with sensible collision defaults\nfunc bb8DefaultCollisionConfig() spherocommon.CollisionConfig {\n\treturn spherocommon.CollisionConfig{\n\t\tMethod: 0x01,\n\t\tXt:     0x20,\n\t\tYt:     0x20,\n\t\tXs:     0x20,\n\t\tYs:     0x20,\n\t\tDead:   0x01,\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/sphero/sphero_bb8_driver_test.go",
    "content": "package sphero\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*BB8Driver)(nil)\n\nfunc TestNewBB8Driver(t *testing.T) {\n\td := NewBB8Driver(testutil.NewBleTestAdaptor())\n\tassert.NotNil(t, d.OllieDriver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"BB8\"))\n\tassert.NotNil(t, d.OllieDriver)\n\tassert.Equal(t, d.defaultCollisionConfig, bb8DefaultCollisionConfig())\n}\n\nfunc TestNewBB8DriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewBB8Driver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n"
  },
  {
    "path": "drivers/ble/sphero/sphero_ollie_driver.go",
    "content": "package sphero\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n)\n\n// MotorModes is used to configure the motor\ntype MotorModes uint8\n\n// MotorModes required for SetRawMotorValues command\nconst (\n\tOff MotorModes = iota\n\tForward\n\tReverse\n\tBrake\n\tIgnore\n)\n\nconst (\n\t// spheroBLEService    = \"22bb746f2bb075542d6f726568705327\"\n\t// robotControlService = \"22bb746f2ba075542d6f726568705327\"\n\n\twakeChara     = \"22bb746f2bbf75542d6f726568705327\"\n\ttxPowerChara  = \"22bb746f2bb275542d6f726568705327\"\n\tantiDosChara  = \"22bb746f2bbd75542d6f726568705327\"\n\tcommandsChara = \"22bb746f2ba175542d6f726568705327\"\n\tresponseChara = \"22bb746f2ba675542d6f726568705327\"\n\n\t// packet header size\n\tpacketHeaderSize = 5\n\n\t// Response packet max size\n\tresponsePacketMaxSize = 20\n\n\t// Collision packet data size: The number of bytes following the DLEN field through the end of the packet\n\tcollisionDataSize = 17\n\n\t// Full size of the collision response\n\tcollisionResponseSize = packetHeaderSize + collisionDataSize\n)\n\n// packet describes head, body and checksum for a data package to be sent\ntype packet struct {\n\theader   []uint8\n\tbody     []uint8\n\tchecksum uint8\n}\n\n// Point2D represents a coordinate in 2-Dimensional space, exposed because used in a callback\ntype Point2D struct {\n\tX int16\n\tY int16\n}\n\n// OllieDriver is the Gobot driver for the Sphero Ollie robot\ntype OllieDriver struct {\n\t*ble.Driver\n\tgobot.Eventer\n\n\tdefaultCollisionConfig spherocommon.CollisionConfig\n\tseq                    uint8\n\tcollisionResponse      []uint8\n\tpacketChannel          chan *packet\n\tasyncBuffer            []byte\n\tasyncMessage           []byte\n\tlocatorCallback        func(p Point2D)\n\tpowerstateCallback     func(p spherocommon.PowerStatePacket)\n}\n\n// NewOllieDriver creates a driver for a Sphero Ollie\nfunc NewOllieDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *OllieDriver {\n\treturn newOllieBaseDriver(a, \"Ollie\", ollieDefaultCollisionConfig(), opts...)\n}\n\nfunc newOllieBaseDriver(\n\ta gobot.BLEConnector, name string,\n\tdcc spherocommon.CollisionConfig, opts ...ble.OptionApplier,\n) *OllieDriver {\n\td := &OllieDriver{\n\t\tdefaultCollisionConfig: dcc,\n\t\tEventer:                gobot.NewEventer(),\n\t\tpacketChannel:          make(chan *packet, 1024),\n\t}\n\td.Driver = ble.NewDriver(a, name, d.initialize, d.shutdown, opts...)\n\n\td.AddEvent(spherocommon.ErrorEvent)\n\td.AddEvent(spherocommon.CollisionEvent)\n\n\treturn d\n}\n\n// SetTXPower sets transmit level\nfunc (d *OllieDriver) SetTXPower(level int) error {\n\tbuf := []byte{byte(level)}\n\n\tif err := d.Adaptor().WriteCharacteristic(txPowerChara, buf); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Wake wakes Ollie up so we can play\nfunc (d *OllieDriver) Wake() error {\n\tbuf := []byte{0x01}\n\n\tif err := d.Adaptor().WriteCharacteristic(wakeChara, buf); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// ConfigureCollisionDetection configures the sensitivity of the detection.\nfunc (d *OllieDriver) ConfigureCollisionDetection(cc spherocommon.CollisionConfig) {\n\td.sendCraftPacket([]uint8{cc.Method, cc.Xt, cc.Yt, cc.Xs, cc.Ys, cc.Dead}, 0x02, 0x12)\n}\n\n// GetLocatorData calls the passed function with the data from the locator\nfunc (d *OllieDriver) GetLocatorData(f func(p Point2D)) {\n\t// CID 0x15 is the code for the locator request\n\td.sendCraftPacket([]uint8{}, 0x02, 0x15)\n\td.locatorCallback = f\n}\n\n// GetPowerState calls the passed function with the Power State information from the sphero\nfunc (d *OllieDriver) GetPowerState(f func(p spherocommon.PowerStatePacket)) {\n\t// CID 0x20 is the code for the power state\n\td.sendCraftPacket([]uint8{}, 0x00, 0x20)\n\td.powerstateCallback = f\n}\n\n// SetRGB sets the Ollie to the given r, g, and b values\nfunc (d *OllieDriver) SetRGB(r uint8, g uint8, b uint8) {\n\td.sendCraftPacket([]uint8{r, g, b, 0x01}, 0x02, 0x20)\n}\n\n// Roll tells the Ollie to roll\nfunc (d *OllieDriver) Roll(speed uint8, heading uint16) {\n\t//nolint:gosec // TODO: fix later\n\td.sendCraftPacket([]uint8{speed, uint8(heading >> 8), uint8(heading & 0xFF), 0x01}, 0x02, 0x30)\n}\n\n// Boost executes the boost macro from within the SSB which takes a 1 byte parameter which is\n// either 01h to begin boosting or 00h to stop.\nfunc (d *OllieDriver) Boost(state bool) {\n\ts := uint8(0x01)\n\tif !state {\n\t\ts = 0x00\n\t}\n\td.sendCraftPacket([]uint8{s}, 0x02, 0x31)\n}\n\n// SetStabilization enables or disables the built-in auto stabilizing features of the Ollie\nfunc (d *OllieDriver) SetStabilization(state bool) {\n\ts := uint8(0x01)\n\tif !state {\n\t\ts = 0x00\n\t}\n\td.sendCraftPacket([]uint8{s}, 0x02, 0x02)\n}\n\n// SetRotationRate allows you to control the rotation rate that Sphero will use to meet new heading commands. A value\n// of 255 jumps to the maximum (currently 400 degrees/sec). A value of zero doesn't make much sense so it's interpreted\n// as 1, the minimum.\nfunc (d *OllieDriver) SetRotationRate(speed uint8) {\n\td.sendCraftPacket([]uint8{speed}, 0x02, 0x03)\n}\n\n// SetRawMotorValues allows you to take over one or both of the motor output values, instead of having the stabilization\n// system control them. Each motor (left and right) requires a mode and a power value from 0-255.\nfunc (d *OllieDriver) SetRawMotorValues(lmode MotorModes, lpower uint8, rmode MotorModes, rpower uint8) {\n\td.sendCraftPacket([]uint8{uint8(lmode), lpower, uint8(rmode), rpower}, 0x02, 0x33)\n}\n\n// SetBackLEDBrightness allows you to control the brightness of the back(tail) LED.\nfunc (d *OllieDriver) SetBackLEDBrightness(value uint8) {\n\td.sendCraftPacket([]uint8{value}, 0x02, 0x21)\n}\n\n// Stop tells the Ollie to stop\nfunc (d *OllieDriver) Stop() {\n\td.Roll(0, 0)\n}\n\n// Sleep says Go to sleep\nfunc (d *OllieDriver) Sleep() {\n\td.sendCraftPacket([]uint8{0x00, 0x00, 0x00, 0x00, 0x00}, 0x00, 0x22)\n}\n\n// SetDataStreamingConfig passes the config to the sphero to stream sensor data\nfunc (d *OllieDriver) SetDataStreamingConfig(dsc spherocommon.DataStreamingConfig) error {\n\tbuf := new(bytes.Buffer)\n\tif err := binary.Write(buf, binary.BigEndian, dsc); err != nil {\n\t\treturn err\n\t}\n\td.sendCraftPacket(buf.Bytes(), 0x02, 0x11)\n\treturn nil\n}\n\n// initialize tells driver to get ready to do work\nfunc (d *OllieDriver) initialize() error {\n\tif err := d.antiDOSOff(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.SetTXPower(7); err != nil {\n\t\treturn err\n\t}\n\tif err := d.Wake(); err != nil {\n\t\treturn err\n\t}\n\n\t// subscribe to Sphero response notifications\n\tif err := d.Adaptor().Subscribe(responseChara, d.handleResponses); err != nil {\n\t\treturn err\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\tpacket := <-d.packetChannel\n\t\t\terr := d.writeCommand(packet)\n\t\t\tif err != nil {\n\t\t\t\td.Publish(d.Event(spherocommon.ErrorEvent), err)\n\t\t\t}\n\t\t}\n\t}()\n\n\td.ConfigureCollisionDetection(d.defaultCollisionConfig)\n\td.enableStopOnDisconnect()\n\n\treturn nil\n}\n\n// antiDOSOff turns off Anti-DOS code so we can control Ollie\nfunc (d *OllieDriver) antiDOSOff() error {\n\tstr := \"011i3\"\n\tbuf := &bytes.Buffer{}\n\tbuf.WriteString(str)\n\n\tif err := d.Adaptor().WriteCharacteristic(antiDosChara, buf.Bytes()); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (d *OllieDriver) writeCommand(packet *packet) error {\n\td.Mutex().Lock()\n\tdefer d.Mutex().Unlock()\n\n\tbuf := append(packet.header, packet.body...)\n\tbuf = append(buf, packet.checksum)\n\tif err := d.Adaptor().WriteCharacteristic(commandsChara, buf); err != nil {\n\t\tfmt.Println(\"async send command error:\", err)\n\t\treturn err\n\t}\n\n\td.seq++\n\treturn nil\n}\n\n// enableStopOnDisconnect auto-sends a Stop command after losing the connection\nfunc (d *OllieDriver) enableStopOnDisconnect() {\n\td.sendCraftPacket([]uint8{0x00, 0x00, 0x00, 0x01}, 0x02, 0x37)\n}\n\n// shutdown stops Ollie driver (void)\nfunc (d *OllieDriver) shutdown() error {\n\td.Sleep()\n\ttime.Sleep(750 * time.Microsecond)\n\treturn nil\n}\n\n// handleResponses handles responses returned from Ollie\nfunc (d *OllieDriver) handleResponses(data []byte) {\n\t// since packets can only be 20 bytes long, we have to puzzle them together\n\tnewMessage := false\n\n\t// append message parts to existing\n\tif len(data) > 0 && data[0] != 0xFF {\n\t\td.asyncBuffer = append(d.asyncBuffer, data...)\n\t}\n\n\t// clear message when new one begins (first byte is always 0xFF)\n\tif len(data) > 0 && data[0] == 0xFF {\n\t\td.asyncMessage = d.asyncBuffer\n\t\td.asyncBuffer = data\n\t\tnewMessage = true\n\t}\n\n\tparts := d.asyncMessage\n\t// 3 is the id of data streaming, located at index 2 byte\n\tif newMessage && len(parts) > 2 && parts[2] == 3 {\n\t\td.handleDataStreaming(parts)\n\t}\n\n\t// index 1 is the type of the message, 0xFF being a direct response, 0xFE an asynchronous message\n\tif len(data) > 4 && data[1] == 0xFF && data[0] == 0xFF {\n\t\t// locator request\n\t\tif data[4] == 0x0B && len(data) == 16 {\n\t\t\td.handleLocatorDetected(data)\n\t\t}\n\n\t\tif data[4] == 0x09 {\n\t\t\td.handlePowerStateDetected(data)\n\t\t}\n\t}\n\n\td.handleCollisionDetected(data)\n}\n\nfunc (d *OllieDriver) handleDataStreaming(data []byte) {\n\t// ensure data is the right length:\n\tif len(data) != 88 {\n\t\treturn\n\t}\n\n\t// data packet is the same as for the normal sphero, since the same communication api is used\n\t// only difference in communication is that the \"newer\" spheros use BLE for communications\n\tvar dataPacket spherocommon.DataStreamingPacket\n\tbuffer := bytes.NewBuffer(data[5:]) // skip header\n\tif err := binary.Read(buffer, binary.BigEndian, &dataPacket); err != nil {\n\t\tpanic(err)\n\t}\n\n\td.Publish(spherocommon.SensorDataEvent, dataPacket)\n}\n\nfunc (d *OllieDriver) handleLocatorDetected(data []uint8) {\n\tif d.locatorCallback == nil {\n\t\treturn\n\t}\n\n\t// read the unsigned raw values\n\tux := binary.BigEndian.Uint16(data[5:7])\n\tuy := binary.BigEndian.Uint16(data[7:9])\n\n\t// convert to signed values\n\tvar x, y int16\n\n\tif ux > 32255 {\n\t\tx = int16(ux - 65535) //nolint:gosec // ok here\n\t} else {\n\t\tx = int16(ux)\n\t}\n\n\tif uy > 32255 {\n\t\ty = int16(uy - 65535) //nolint:gosec // ok here\n\t} else {\n\t\ty = int16(uy)\n\t}\n\n\td.locatorCallback(Point2D{X: x, Y: y})\n}\n\nfunc (d *OllieDriver) handlePowerStateDetected(data []uint8) {\n\tvar dataPacket spherocommon.PowerStatePacket\n\tbuffer := bytes.NewBuffer(data[5:]) // skip header\n\tif err := binary.Read(buffer, binary.BigEndian, &dataPacket); err != nil {\n\t\tpanic(err)\n\t}\n\n\td.powerstateCallback(dataPacket)\n}\n\nfunc (d *OllieDriver) handleCollisionDetected(data []uint8) {\n\tswitch len(data) {\n\tcase responsePacketMaxSize:\n\t\t// Check if this is the header of collision response. (i.e. first part of data)\n\t\t// Collision response is 22 bytes long. (individual packet size is maxed at 20)\n\t\tif data[1] == 0xFE && data[2] == 0x07 && len(d.collisionResponse) == 0 {\n\t\t\t// response code 7 is for a detected collision\n\t\t\td.collisionResponse = append(d.collisionResponse, data...)\n\t\t}\n\tcase collisionResponseSize - responsePacketMaxSize:\n\t\t// if this is the remaining part of the collision response,\n\t\t// then make sure the header and first part of data is already received\n\t\tif len(d.collisionResponse) == responsePacketMaxSize {\n\t\t\td.collisionResponse = append(d.collisionResponse, data...)\n\t\t}\n\tdefault:\n\t\treturn // not collision event\n\t}\n\n\t// check expected sizes\n\tif len(d.collisionResponse) != collisionResponseSize || d.collisionResponse[4] != collisionDataSize {\n\t\treturn\n\t}\n\n\t// confirm checksum\n\tsize := len(d.collisionResponse)\n\tchk := d.collisionResponse[size-1] // last byte is checksum\n\tif chk != spherocommon.CalculateChecksum(d.collisionResponse[2:size-1]) {\n\t\treturn\n\t}\n\n\tvar collision spherocommon.CollisionPacket\n\tbuffer := bytes.NewBuffer(d.collisionResponse[5:]) // skip header\n\tif err := binary.Read(buffer, binary.BigEndian, &collision); err != nil {\n\t\tpanic(err)\n\t}\n\td.collisionResponse = nil // clear the current response\n\n\td.Publish(spherocommon.CollisionEvent, collision)\n}\n\nfunc (d *OllieDriver) sendCraftPacket(body []uint8, did byte, cid byte) {\n\td.packetChannel <- d.craftPacket(body, did, cid)\n}\n\nfunc (d *OllieDriver) craftPacket(body []uint8, did byte, cid byte) *packet {\n\tdlen := len(body) + 1\n\thdr := []uint8{0xFF, 0xFF, did, cid, d.seq, uint8(dlen)} //nolint:gosec // TODO: fix later\n\tbuf := append(hdr, body...)\n\n\tpacket := &packet{\n\t\tbody:     body,\n\t\theader:   hdr,\n\t\tchecksum: spherocommon.CalculateChecksum(buf[2:]),\n\t}\n\n\treturn packet\n}\n\n// ollieDefaultCollisionConfig returns a CollisionConfig with sensible collision defaults\nfunc ollieDefaultCollisionConfig() spherocommon.CollisionConfig {\n\treturn spherocommon.CollisionConfig{\n\t\tMethod: 0x01,\n\t\tXt:     0x20,\n\t\tYt:     0x20,\n\t\tXs:     0x20,\n\t\tYs:     0x20,\n\t\tDead:   0x60,\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/sphero/sphero_ollie_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage sphero\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n)\n\nvar _ gobot.Driver = (*OllieDriver)(nil)\n\nfunc initTestOllieDriver() *OllieDriver {\n\td := NewOllieDriver(testutil.NewBleTestAdaptor())\n\treturn d\n}\n\nfunc TestNewOllieDriver(t *testing.T) {\n\td := NewOllieDriver(testutil.NewBleTestAdaptor())\n\tassert.NotNil(t, d.Driver)\n\tassert.NotNil(t, d.Eventer)\n\tassert.Equal(t, d.defaultCollisionConfig, ollieDefaultCollisionConfig())\n\tassert.NotNil(t, d.packetChannel)\n}\n\nfunc TestNewOllieDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewOllieDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestOllieStartAndHalt(t *testing.T) {\n\td := initTestOllieDriver()\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestLocatorData(t *testing.T) {\n\td := initTestOllieDriver()\n\n\ttables := []struct {\n\t\tx1 byte\n\t\tx2 byte\n\t\ty1 byte\n\t\ty2 byte\n\t\tx  int16\n\t\ty  int16\n\t}{\n\t\t{0x00, 0x05, 0x00, 0x05, 5, 5},\n\t\t{0x00, 0x00, 0x00, 0x00, 0, 0},\n\t\t{0x00, 0x0A, 0x00, 0xF0, 10, 240},\n\t\t{0x01, 0x00, 0x01, 0x00, 256, 256},\n\t\t{0xFF, 0xFE, 0xFF, 0xFE, -1, -1},\n\t}\n\n\tfor _, point := range tables {\n\t\t// 0x0B is the locator ID\n\t\tpacket := []byte{\n\t\t\t0xFF, 0xFF, 0x00, 0x00, 0x0B, point.x1, point.x2, point.y1, point.y2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t}\n\n\t\td.GetLocatorData(func(p Point2D) {\n\t\t\tassert.Equal(t, point.y, p.Y)\n\t\t})\n\t\td.handleResponses(packet)\n\t}\n}\n\nfunc TestDataStreaming(t *testing.T) {\n\td := initTestOllieDriver()\n\n\terr := d.SetDataStreamingConfig(spherocommon.DefaultDataStreamingConfig())\n\trequire.NoError(t, err)\n\n\tresponseChan := make(chan bool)\n\terr = d.On(\"sensordata\", func(data interface{}) {\n\t\tcont := data.(spherocommon.DataStreamingPacket)\n\t\t// fmt.Printf(\"got streaming packet: %+v \\n\", cont)\n\t\tassert.Equal(t, int16(10), cont.RawAccX)\n\t\tresponseChan <- true\n\t})\n\trequire.NoError(t, err)\n\n\t// example data packet\n\tp1 := []string{\n\t\t\"FFFE030053000A003900FAFFFE0007FFFF000000\",\n\t\t\"000000000000000000FFECFFFB00010000004B01\",\n\t\t\"BD1034FFFF000300000000000000000000000000\",\n\t\t\"0000002701FDE500560000000000000065000000\",\n\t\t\"0000000000000071\",\n\t}\n\n\tfor _, elem := range p1 {\n\t\tvar bytes []byte\n\t\tfor i := 0; i < len([]rune(elem)); i += 2 {\n\t\t\ta := []rune(elem)[i : i+2]\n\t\t\tb, err := strconv.ParseUint(string(a), 16, 16)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tc := uint16(b)\n\t\t\tbytes = append(bytes, byte(c))\n\t\t}\n\t\td.handleResponses(bytes)\n\t}\n\n\t// send empty packet to indicate start of next message\n\td.handleResponses([]byte{0xFF})\n\tselect {\n\tcase <-responseChan:\n\tcase <-time.After(10 * time.Millisecond):\n\t\tt.Error(\"no response received\")\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/sphero/sphero_sprkplus_driver.go",
    "content": "package sphero\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n)\n\n// SPRKPlusDriver represents a Sphero SPRK+\ntype SPRKPlusDriver struct {\n\t*OllieDriver\n}\n\n// NewSPRKPlusDriver creates a driver for a Sphero SPRK+\nfunc NewSPRKPlusDriver(a gobot.BLEConnector, opts ...ble.OptionApplier) *SPRKPlusDriver {\n\treturn &SPRKPlusDriver{OllieDriver: newOllieBaseDriver(a, \"SPRKPlus\", sprkplusDefaultCollisionConfig(), opts...)}\n}\n\n// sprkplusDefaultCollisionConfig returns a CollisionConfig with sensible collision defaults\nfunc sprkplusDefaultCollisionConfig() spherocommon.CollisionConfig {\n\treturn spherocommon.CollisionConfig{\n\t\tMethod: 0x01,\n\t\tXt:     0x20,\n\t\tYt:     0x20,\n\t\tXs:     0x20,\n\t\tYs:     0x20,\n\t\tDead:   0x01,\n\t}\n}\n"
  },
  {
    "path": "drivers/ble/sphero/sphero_sprkplus_driver_test.go",
    "content": "package sphero\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/testutil\"\n)\n\nvar _ gobot.Driver = (*SPRKPlusDriver)(nil)\n\nfunc TestNewSPRKPlusDriver(t *testing.T) {\n\td := NewSPRKPlusDriver(testutil.NewBleTestAdaptor())\n\tassert.NotNil(t, d.OllieDriver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"SPRK\"))\n\tassert.NotNil(t, d.OllieDriver)\n\tassert.Equal(t, d.defaultCollisionConfig, sprkplusDefaultCollisionConfig())\n}\n\nfunc TestNewSPRKPlusDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewBleTestAdaptor()\n\t// act\n\td := NewSPRKPlusDriver(a, ble.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n"
  },
  {
    "path": "drivers/ble/testutil/testutil.go",
    "content": "package testutil\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.BLEConnector = (*bleTestClientAdaptor)(nil)\n\ntype bleTestClientAdaptor struct {\n\tname             string\n\taddress          string\n\tmtx              sync.Mutex\n\twithoutResponses bool\n\n\tsimulateConnectErr      bool\n\tsimulateSubscribeErr    bool\n\tsimulateDisconnectErr   bool\n\treadCharacteristicFunc  func(string) ([]byte, error)\n\twriteCharacteristicFunc func(string, []byte) error\n\tsubscribeFunc           func([]byte)\n\tsubscribeCharaUUID      string\n}\n\nfunc NewBleTestAdaptor() *bleTestClientAdaptor {\n\treturn &bleTestClientAdaptor{\n\t\taddress: \"01:02:03:0A:0B:0C\",\n\t\treadCharacteristicFunc: func(cUUID string) ([]byte, error) {\n\t\t\treturn []byte(cUUID), nil\n\t\t},\n\t\twriteCharacteristicFunc: func(cUUID string, data []byte) error {\n\t\t\treturn nil\n\t\t},\n\t}\n}\n\nfunc (t *bleTestClientAdaptor) SubscribeCharaUUID() string {\n\treturn t.subscribeCharaUUID\n}\n\nfunc (t *bleTestClientAdaptor) SetReadCharacteristicTestFunc(f func(cUUID string) (data []byte, err error)) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tt.readCharacteristicFunc = f\n}\n\nfunc (t *bleTestClientAdaptor) SetWriteCharacteristicTestFunc(f func(cUUID string, data []byte) error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tt.writeCharacteristicFunc = f\n}\n\nfunc (t *bleTestClientAdaptor) SetSimulateConnectError(val bool) {\n\tt.simulateConnectErr = val\n}\n\nfunc (t *bleTestClientAdaptor) SetSimulateSubscribeError(val bool) {\n\tt.simulateSubscribeErr = val\n}\n\nfunc (t *bleTestClientAdaptor) SetSimulateDisconnectError(val bool) {\n\tt.simulateDisconnectErr = val\n}\n\nfunc (t *bleTestClientAdaptor) SendTestDataToSubscriber(data []byte) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tt.subscribeFunc(data)\n}\n\nfunc (t *bleTestClientAdaptor) Connect() error {\n\tif t.simulateConnectErr {\n\t\treturn fmt.Errorf(\"connect error\")\n\t}\n\treturn nil\n}\n\nfunc (t *bleTestClientAdaptor) Reconnect() error { return nil }\n\nfunc (t *bleTestClientAdaptor) Disconnect() error {\n\tif t.simulateDisconnectErr {\n\t\treturn fmt.Errorf(\"disconnect error\")\n\t}\n\treturn nil\n}\n\nfunc (t *bleTestClientAdaptor) Finalize() error           { return nil }\nfunc (t *bleTestClientAdaptor) Name() string              { return t.name }\nfunc (t *bleTestClientAdaptor) SetName(n string)          { t.name = n }\nfunc (t *bleTestClientAdaptor) Address() string           { return t.address }\nfunc (t *bleTestClientAdaptor) WithoutResponses(use bool) { t.withoutResponses = use }\n\nfunc (t *bleTestClientAdaptor) ReadCharacteristic(cUUID string) ([]byte, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.readCharacteristicFunc(cUUID)\n}\n\nfunc (t *bleTestClientAdaptor) WriteCharacteristic(cUUID string, data []byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.writeCharacteristicFunc(cUUID, data)\n}\n\nfunc (t *bleTestClientAdaptor) Subscribe(cUUID string, f func(data []byte)) error {\n\tif t.simulateSubscribeErr {\n\t\treturn fmt.Errorf(\"subscribe error\")\n\t}\n\tt.subscribeCharaUUID = cUUID\n\tt.subscribeFunc = f\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/common/bit/bit.go",
    "content": "package bit\n\n// Set is used to set a bit in the given integer at a given position to 1.\nfunc Set(n int, pos uint8) int {\n\tn |= (1 << pos)\n\treturn n\n}\n\n// Clear is used to set a bit in the given integer at a given position to 0.\nfunc Clear(n int, pos uint8) int {\n\tmask := ^int(1 << pos)\n\tn &= mask\n\treturn n\n}\n\n// IsSet tests if the bit at the given position is set in the given integer.\nfunc IsSet(n int, pos uint8) bool {\n\tval := n & (1 << uint(pos))\n\treturn (val > 0)\n}\n"
  },
  {
    "path": "drivers/common/bit/bit_test.go",
    "content": "package bit\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestSet(t *testing.T) {\n\tconst (\n\t\toldVal = 1\n\t\tbitPos = 7\n\t\twant   = 129\n\t)\n\trequire.False(t, IsSet(oldVal, bitPos))\n\n\tgot := Set(1, 7)\n\tassert.Equal(t, want, got)\n\tassert.True(t, IsSet(got, bitPos))\n}\n\nfunc TestClear(t *testing.T) {\n\tconst (\n\t\toldVal     = 128\n\t\tbitPos     = 7\n\t\twant   int = 0\n\t)\n\trequire.True(t, IsSet(oldVal, bitPos))\n\n\tgot := Clear(128, 7)\n\tassert.Equal(t, want, got)\n\tassert.False(t, IsSet(got, bitPos))\n}\n"
  },
  {
    "path": "drivers/common/mfrc522/mfrc522_connectionwrapper.go",
    "content": "package mfrc522\n\nimport \"fmt\"\n\nfunc (d *MFRC522Common) readByteData(reg uint8) (uint8, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"not connected\")\n\t}\n\treturn d.connection.ReadByteData(reg)\n}\n\nfunc (d *MFRC522Common) writeByteData(reg uint8, data uint8) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"not connected\")\n\t}\n\treturn d.connection.WriteByteData(reg, data)\n}\n\nfunc (d *MFRC522Common) setRegisterBitMask(reg uint8, mask uint8) error {\n\tval, err := d.readByteData(reg)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(reg, val|mask); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (d *MFRC522Common) clearRegisterBitMask(reg uint8, mask uint8) error {\n\tval, err := d.readByteData(reg)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(reg, val&^mask); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/common/mfrc522/mfrc522_pcd.go",
    "content": "package mfrc522\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// PCD: proximity coupling device (reader unit)\n// PICC: proximity integrated circuit card (the card or chip)\n\nconst (\n\tpcdDebug = false\n\tinitTime = 50 * time.Millisecond\n\t// at least 5 ms are needed after switch on, see AN10834\n\tantennaOnTime = 10 * time.Millisecond\n)\n\ntype busConnection interface {\n\tReadByteData(reg byte) (byte, error)\n\tWriteByteData(reg byte, data byte) error\n}\n\nvar versions = map[uint8]string{\n\t0x12: \"Counterfeit\", 0x88: \"FM17522\", 0x89: \"FM17522E\",\n\t0x90: \"MFRC522 0.0\", 0x91: \"MFRC522 1.0\", 0x92: \"MFRC522 2.0\", 0xB2: \"FM17522 1\",\n}\n\n// MFRC522Common is the Gobot Driver for MFRC522 RFID.\n// datasheet:\n// https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf\n//\n// reference implementations:\n// * https://github.com/OSSLibraries/ArduinoRegMFRC522v2\n// * https://github.com/jdevelop/golang-rpi-extras\n// * https://github.com/pimylifeup/MFRC522-python\n// * https://periph.io/device/mf-rc522/\ntype MFRC522Common struct {\n\tconnection      busConnection\n\tfirstCardAccess bool\n}\n\n// NewMFRC522Common creates a new Gobot Driver for MFRC522 RFID with specified bus connection\n// The device supports SPI, I2C and UART (not implemented yet at gobot system level).\n//\n// Params:\n//\n//\tc BusConnection - the bus connection to use with this driver\nfunc NewMFRC522Common() *MFRC522Common {\n\td := &MFRC522Common{}\n\treturn d\n}\n\n// Initialize sets the connection and initializes the driver.\nfunc (d *MFRC522Common) Initialize(c busConnection) error {\n\td.connection = c\n\n\tif err := d.softReset(); err != nil {\n\t\treturn err\n\t}\n\n\tinitSequence := [][]byte{\n\t\t{regTxMode, rxtxModeRegReset},\n\t\t{regRxMode, rxtxModeRegReset},\n\t\t{regModWidth, modWidthRegReset},\n\t\t{regTMode, tModeRegTAutoBit | 0x0F}, // timer starts automatically at the end of the transmission\n\t\t{regTPrescaler, 0xFF},\n\t\t{regTReloadL, tReloadRegValue25ms & 0xFF},\n\t\t{regTReloadH, tReloadRegValue25ms >> 8},\n\t\t{regTxASK, txASKRegForce100ASKBit},\n\t\t{regMode, modeRegTxWaitRFBit | modeRegPolMFinBit | modeRegCRCPreset6363},\n\t}\n\tfor _, init := range initSequence {\n\t\tif err := d.writeByteData(init[0], init[1]); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif err := d.switchAntenna(true); err != nil {\n\t\treturn err\n\t}\n\tif err := d.setAntennaGain(rfcCfgRegRxGain38dB); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// PrintReaderVersion gets and prints the reader (pcd) version.\nfunc (d *MFRC522Common) PrintReaderVersion() error {\n\tversion, err := d.getVersion()\n\tif err != nil {\n\t\treturn err\n\t}\n\tfmt.Printf(\"PCD version: '%s' (0x%X)\\n\", versions[version], version)\n\treturn nil\n}\n\nfunc (d *MFRC522Common) getVersion() (uint8, error) {\n\treturn d.readByteData(regVersion)\n}\n\nfunc (d *MFRC522Common) switchAntenna(targetState bool) error {\n\tval, err := d.readByteData(regTxControl)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmaskForOn := uint8(txControlRegTx2RFEn1outputBit | txControlRegTx1RFEn1outputBit)\n\tcurrentState := val&maskForOn == maskForOn\n\n\tif targetState == currentState {\n\t\treturn nil\n\t}\n\n\tif targetState {\n\t\tval = val | maskForOn\n\t} else {\n\t\tval = val & ^maskForOn\n\t}\n\n\tif err := d.writeByteData(regTxControl, val); err != nil {\n\t\treturn err\n\t}\n\n\tif targetState {\n\t\ttime.Sleep(antennaOnTime)\n\t}\n\n\treturn nil\n}\n\nfunc (d *MFRC522Common) setAntennaGain(val uint8) error {\n\treturn d.writeByteData(regRFCfg, val)\n}\n\nfunc (d *MFRC522Common) softReset() error {\n\tif err := d.writeByteData(regCommand, commandRegSoftReset); err != nil {\n\t\treturn err\n\t}\n\n\t// The datasheet does not mention how long the SoftReset command takes to complete. According to section 8.8.2 of the\n\t// datasheet the oscillator start-up time is the start up time of the crystal + 37.74 us.\n\t// TODO: this can be done better by wait until the power down bit is cleared\n\ttime.Sleep(initTime)\n\tval, err := d.readByteData(regCommand)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif val&commandRegPowerDownBit > 1 {\n\t\treturn fmt.Errorf(\"initialization takes longer than %s\", initTime)\n\t}\n\treturn nil\n}\n\nfunc (d *MFRC522Common) stopCrypto1() error {\n\treturn d.clearRegisterBitMask(regStatus2, status2RegMFCrypto1OnBit)\n}\n\nfunc (d *MFRC522Common) communicateWithPICC(command uint8, sendData []byte, backData []byte, txLastBits uint8,\n\tcheckCRC bool,\n) error {\n\tirqEn := 0x00\n\twaitIRq := uint8(0x00)\n\tswitch command {\n\tcase commandRegMFAuthent:\n\t\tirqEn = comIEnRegIdleIEnBit | comIEnRegErrIEnBit\n\t\twaitIRq = comIrqRegIdleIRqBit\n\tcase commandRegTransceive:\n\t\tirqEn = comIEnRegTimerIEnBit | comIEnRegErrIEnBit | comIEnRegLoAlertIEnBit\n\t\tirqEn = irqEn | comIEnRegIdleIEnBit | comIEnRegRxIEnBit | comIEnRegTxIEnBit\n\t\twaitIRq = uint8(comIrqRegIdleIRqBit | comIrqRegRxIRqBit)\n\t}\n\n\t// TODO: this is not used at the moment (propagation of IRQ pin)\n\t//nolint:gosec // TODO: fix later\n\tif err := d.writeByteData(regComIEn, uint8(irqEn|comIEnRegIRqInv)); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regComIrq, comIrqRegClearAll); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regFIFOLevel, fifoLevelRegFlushBufferBit); err != nil {\n\t\treturn err\n\t}\n\t// stop any active command\n\tif err := d.writeByteData(regCommand, commandRegIdle); err != nil {\n\t\treturn err\n\t}\n\t// prepare and start communication\n\tif err := d.writeFifo(sendData); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regBitFraming, txLastBits); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regCommand, command); err != nil {\n\t\treturn err\n\t}\n\tif command == commandRegTransceive {\n\t\tif err := d.setRegisterBitMask(regBitFraming, bitFramingRegStartSendBit); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Wait for the command to complete. On initialization the TAuto flag in TMode register is set. This means the timer\n\t// automatically starts when the PCD stops transmitting.\n\tconst maxTries = 5\n\ti := 0\n\tfor ; i < maxTries; i++ {\n\t\tirqs, err := d.readByteData(regComIrq)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif irqs&waitIRq > 0 {\n\t\t\t// One of the interrupts that signal success has been set.\n\t\t\tbreak\n\t\t}\n\t\tif irqs&comIrqRegTimerIRqBit == comIrqRegTimerIRqBit {\n\t\t\treturn fmt.Errorf(\"the timer interrupt occurred\")\n\t\t}\n\t\ttime.Sleep(time.Millisecond)\n\t}\n\n\tif err := d.clearRegisterBitMask(regBitFraming, bitFramingRegStartSendBit); err != nil {\n\t\treturn err\n\t}\n\n\tif i >= maxTries {\n\t\treturn fmt.Errorf(\"no data available after %d tries\", maxTries)\n\t}\n\n\terrorRegValue, err := d.readByteData(regError)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// stop if any errors except collisions were detected.\n\tif err := d.getFirstError(errorRegValue &^ errorRegCollErrBit); err != nil {\n\t\treturn err\n\t}\n\n\tbackLen := len(backData)\n\tvar rxLastBits uint8\n\tif backLen > 0 {\n\t\trxLastBits, err = d.readFifo(backData)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif pcdDebug {\n\t\t\tfmt.Printf(\"rxLastBits: 0x%02x\\n\", rxLastBits)\n\t\t}\n\t}\n\n\tif err := d.getFirstError(errorRegValue & errorRegCollErrBit); err != nil {\n\t\treturn err\n\t}\n\n\tif backLen > 2 && checkCRC {\n\t\t// the last 2 bytes of data contains the CRC\n\t\tif backLen == 3 && rxLastBits == 0x04 {\n\t\t\treturn fmt.Errorf(\"CRC: MIFARE Classic NAK is not OK\")\n\t\t}\n\t\tif backLen < 4 || backLen == 4 && rxLastBits != 0 {\n\t\t\treturn fmt.Errorf(\"CRC: at least the 2 byte CRCRegA value and all 8 bits of the last byte must be received\")\n\t\t}\n\n\t\tcrcResult := []byte{0x00, 0x00}\n\t\tcrcData := backData[:backLen-2]\n\t\tdataCrc := backData[backLen-2:]\n\t\terr := d.calculateCRC(crcData, crcResult)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif dataCrc[0] != crcResult[0] || dataCrc[1] != crcResult[1] {\n\t\t\treturn fmt.Errorf(\"CRC: values not match %v - %v\", crcResult, dataCrc)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// 16 bit CRC will be calculated for the given data\nfunc (d *MFRC522Common) calculateCRC(data []byte, result []byte) error {\n\t// Stop any active command.\n\tif err := d.writeByteData(regCommand, commandRegIdle); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regDivIrq, divIrqRegCRCIRqBit); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regFIFOLevel, fifoLevelRegFlushBufferBit); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeFifo(data); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regCommand, commandRegCalcCRC); err != nil {\n\t\treturn err\n\t}\n\n\tconst maxTries = 3\n\tfor i := 0; i < maxTries; i++ {\n\t\tirqs, err := d.readByteData(regDivIrq)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif irqs&divIrqRegCRCIRqBit == divIrqRegCRCIRqBit {\n\t\t\tif err := d.writeByteData(regCommand, commandRegIdle); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tresult[0], err = d.readByteData(regCRCResultL)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tresult[1], err = d.readByteData(regCRCResultH)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\ttime.Sleep(time.Millisecond)\n\t}\n\n\treturn fmt.Errorf(\"no CRC available after %d tries\", maxTries)\n}\n\nfunc (d *MFRC522Common) writeFifo(fifoData []byte) error {\n\t// the register command is always the same, the pointer in FIFO is incremented automatically after each write\n\tfor _, b := range fifoData {\n\t\tif err := d.writeByteData(regFIFOData, b); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (d *MFRC522Common) readFifo(backData []byte) (uint8, error) {\n\tn, err := d.readByteData(regFIFOLevel) // Number of bytes in the FIFO\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif n > uint8(len(backData)) {\n\t\treturn 0, fmt.Errorf(\"more data in FIFO (%d) than expected (%d)\", n, len(backData))\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif n < uint8(len(backData)) {\n\t\treturn 0, fmt.Errorf(\"less data in FIFO (%d) than expected (%d)\", n, len(backData))\n\t}\n\n\t// the register command is always the same, the pointer in FIFO is incremented automatically after each read\n\tfor i := 0; i < int(n); i++ {\n\t\tbyteVal, err := d.readByteData(regFIFOData)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tbackData[i] = byteVal\n\t}\n\n\trxLastBits, err := d.readByteData(regControl)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn rxLastBits & controlRegRxLastBits, nil\n}\n\nfunc (d *MFRC522Common) getFirstError(errorRegValue uint8) error {\n\tif errorRegValue == 0 {\n\t\treturn nil\n\t}\n\n\tif errorRegValue&errorRegProtocolErrBit == errorRegProtocolErrBit {\n\t\treturn fmt.Errorf(\"a protocol error occurred\")\n\t}\n\tif errorRegValue&errorRegParityErrBit == errorRegParityErrBit {\n\t\treturn fmt.Errorf(\"a parity error occurred\")\n\t}\n\tif errorRegValue&errorRegCRCErrBit == errorRegCRCErrBit {\n\t\treturn fmt.Errorf(\"a CRC error occurred\")\n\t}\n\tif errorRegValue&errorRegCollErrBit == errorRegCollErrBit {\n\t\treturn fmt.Errorf(\"a collision error occurred\")\n\t}\n\tif errorRegValue&errorRegBufferOvflBit == errorRegBufferOvflBit {\n\t\treturn fmt.Errorf(\"a buffer overflow error occurred\")\n\t}\n\tif errorRegValue&errorRegTempErrBit == errorRegTempErrBit {\n\t\treturn fmt.Errorf(\"a temperature error occurred\")\n\t}\n\tif errorRegValue&errorRegWrErrBit == errorRegWrErrBit {\n\t\treturn fmt.Errorf(\"a temperature error occurred\")\n\t}\n\treturn fmt.Errorf(\"an unknown error occurred\")\n}\n"
  },
  {
    "path": "drivers/common/mfrc522/mfrc522_pcd_register.go",
    "content": "//nolint:lll // ok here\npackage mfrc522\n\n// Page 0: Command and status\nconst (\n\t//              0x00     // reserved for future use\n\tregCommand = 0x01 // starts and stops command execution\n\t// ------------ values --------------------\n\t// commands, see chapter 10.3, table 149 of the datasheet (only 4 lower bits are used for writing)\n\tcommandRegIdle             = 0x00 // no action, cancels current command execution\n\tcommandRegMem              = 0x01 // stores 25 bytes into the internal buffer\n\tcommandRegGenerateRandomID = 0x02 // generates a 10-byte random ID number\n\tcommandRegCalcCRC          = 0x03 // activates the CRC coprocessor or performs a self-test\n\tcommandRegTransmit         = 0x04 // transmits data from the FIFO buffer\n\t// 0x05, 0x06 not used\n\t// commandRegNoCmdChange = 0x07 // no command change, can be used to modify the Command register bits without\n\t// commandRegReceive     = 0x08 // activates the receiver circuits\n\t// 0x09..0x0B not used\n\tcommandRegTransceive = 0x0C // transmits data from FIFO buffer to antenna and automatically activates the receiver after transmission\n\t// 0x0D reserved\n\tcommandRegMFAuthent = 0x0E // performs the MIFARE standard authentication as a reader\n\tcommandRegSoftReset = 0x0F // resets the MFRC522\n\t// starts the wake up procedure during which this bit is read as a logic 1; it is read as a logic 0 when the\n\t// is ready; Remark: The PowerDown bit cannot be set when the SoftReset command is activated\n\tcommandRegPowerDownBit = 0x10 // Soft power-down mode entered, if 1\n\tcommandRegRcvOffBit    = 0x20 // analog part of the receiver is switched off, if 1\n\t// commandRegReserved67 = 0xC0\n)\n\nconst (\n\tregComIEn = 0x02 // enable and disable the passing of interrupt requests to IRQ pin\n\t// ------------ values --------------------\n\tcomIEnRegReset         = 0x80 // see table 25 of data sheet\n\tcomIEnRegTimerIEnBit   = 0x01 // bit 0: allows the timer interrupt request (TimerIRq bit) to be propagated\n\tcomIEnRegErrIEnBit     = 0x02 // bit 1: allows the error interrupt request (ErrIRq bit) to be propagated\n\tcomIEnRegLoAlertIEnBit = 0x04 // bit 2: allows the low alert interrupt request (LoAlertIRq bit) to be propagated\n\tcomIEnRegHiAlertIEnBit = 0x08 // bit 3: allows the high alert interrupt request (HiAlertIRq bit) to be propagated\n\tcomIEnRegIdleIEnBit    = 0x10 // bit 4: allows the idle interrupt request (IdleIRq bit) to be propagated\n\tcomIEnRegRxIEnBit      = 0x20 // bit 5: allows the receiver interrupt request (RxIRq bit) to be propagated\n\tcomIEnRegTxIEnBit      = 0x40 // bit 6: allows the transmitter interrupt request (TxIRq bit) to be propagated\n\t// 1: signal on pin IRQ is inverted with respect to the Status1 register’s IRq bit\n\t// 0: signal on pin IRQ is equal to the IRq bit; in combination with the DivIEn register’s IRqPushPull bit, the\n\t// default value of logic 1 ensures that the output level on pin IRQ is 3-state\n\tcomIEnRegIRqInv = 0x80 // bit 7: see above\n)\n\nconst (\n// ------------ unused commands --------------------\n// regDivIEn = 0x03 // enable and disable the passing of interrupt requests to IRQ pin\n)\n\nconst (\n\tregComIrq = 0x04 // interrupt request bits for communication\n\t// ------------ values --------------------\n\tcomIrqRegReset         = 0x14 // see table 29 of data sheet\n\tcomIrqRegClearAll      = 0x7F // all bits are set to clear, except the Set1Bit (0 indicates the reset)\n\tcomIrqRegTimerIRqBit   = 0x01 // bit 0: the timer decrements the timer value in register TCounterVal to zero, if 1\n\tcomIrqRegErrIRq1anyBit = 0x02 // bit 1: error bit in the Error register is set, if 1\n\t// Status1 register’s LoAlert bit is set in opposition to the LoAlert bit, the LoAlertIRq bit stores this event and\n\t// can only be reset as indicated by the Set1 bit in this register\n\t// comIrqRegLoAlertIRqBit = 0x04 // bit 2: if 1, see above\n\t// the Status1 register’s HiAlert bit is set in opposition to the HiAlert bit, the HiAlertIRq bit stores this event\n\t// and can only be reset as indicated by the Set1 bit in this register\n\t// comIrqRegHiAlertIRqBit = 0x08 // bit 3: if 1, see above\n\t// If a command terminates, for example, when the Command register changes its value from any command to Idle command.\n\t// If an unknown command is started, the Command register Command[3:0] value changes to the idle state and the\n\t// IdleIRq bit is set. The microcontroller starting the Idle command does not set the IdleIRq bit.\n\tcomIrqRegIdleIRqBit = 0x10 // bit 4: if 1, see above\n\t// receiver has detected the end of a valid data stream, if the RxMode register’s RxNoErr bit is set to logic 1,\n\t// the RxIRq bit is only set to logic 1 when data bytes are available in the FIFO\n\tcomIrqRegRxIRqBit = 0x20 // bit 5: if 1, see above\n\tcomIrqRegTxIRqBit = 0x40 // bit 6: set to 1, immediately after the last bit of the transmitted data was sent out\n\t// 1: indicates that the marked bits in the register are set\n\t// 0: indicates that the marked bits in the register are cleared\n\t// comIrqRegSet1Bit = 0x80 // bit 7: see above\n)\n\nconst (\n\tregDivIrq = 0x05 // diverse interrupt request bits\n\t// ------------ values --------------------\n\t// divIrqRegReset = 0x00 // see table 31 of data sheet\n\t// divIrqRegReserved01 = 0x03\n\tdivIrqRegCRCIRqBit = 0x04 // bit 2: the CalcCRC command is active and all data is processed\n\t// divIrqRegReservedBit3 = 0x08\n\t// this interrupt is set when either a rising or falling signal edge is detected\n\t// divIrqRegMfinActIRqBit = 0x10 // bit 4: MFIN is active; see above\n\t// divIrqRegReserved56 = 0x60\n\t// 1: indicates that the marked bits in the register are set\n\t// 0: indicates that the marked bits in the register are cleared\n\t// divIrqRegSet2Bit = 0x80 // bit 7: see above\n)\n\nconst (\n\tregError = 0x06 // error bits showing the error status of the last command executed\n\t// ------------ values --------------------\n\t// errorRegReset = 0x00 // see table 33 of data sheet\n\t// set to logic 1 if the SOF is incorrect automatically cleared during receiver start-up phase bit is only valid for\n\t// 106 kBd; during the MFAuthent command, the ProtocolErr bit is set to logic 1 if the number of bytes received in one\n\t// data stream is incorrect\n\terrorRegProtocolErrBit = 0x01 // bit 0: see above\n\t// automatically cleared during receiver start-up phase; only valid for ISO/IEC 14443 A/MIFARE communication at 106 kBd\n\terrorRegParityErrBit = 0x02 // bit 1: parity check failed, see above\n\t// the RxMode register’s RxCRCEn bit is set and the CRC calculation fails automatically; cleared to logic 0 during\n\t// receiver start-up phase\n\terrorRegCRCErrBit = 0x04 // bit 2: see above\n\t// cleared automatically at receiver start-up phase; only valid during the bitwise anticollision at 106 kBd; always\n\t// set to logic 0 during communication protocols at 212 kBd, 424 kBd and 848 kBd\n\terrorRegCollErrBit = 0x08 // bit 3: a bit-collision is detected, see above\n\t// the host or a MFRC522’s internal state machine (e.g. receiver) tries to write data to the FIFO buffer even though\n\t// it is already full\n\terrorRegBufferOvflBit = 0x10 // bit 4: FIFO is full, see above\n\t// errorRegReservedBit5 = 0x20\n\t// the antenna drivers are automatically switched off\n\terrorRegTempErrBit = 0x40 // bit 6: internal temperature sensor detects overheating, see above\n\t// data is written into the FIFO buffer by the host during the MFAuthent command or if data is written into the FIFO\n\t// buffer by the host during the time between sending the last bit on the RF interface and receiving the last bit on\n\t// the RF interface\n\terrorRegWrErrBit = 0x80 // bit 7: see above\n)\n\nconst (\n// ------------ unused commands --------------------\n// regStatus1 = 0x07 // communication status bits\n)\n\nconst (\n\tregStatus2 = 0x08 // receiver and transmitter status bits\n\t// ------------ values --------------------\n\t// status2RegReset = 0x00 // see table 37 of data sheet\n\t// bit 0..2 shows the state of the transmitter and receiver state machines\n\t// status2RegModemStateIdle = 0x00 // idle\n\t// status2RegModemStateWait = 0x01 // wait for the BitFraming register’s StartSend bit\n\t// the minimum time for TxWait is defined by the TxWait register\n\t// status2RegModemStateTxWait       = 0x02 // wait until RF field is present if the TMode register’s TxWaitRF bit is set to logic 1\n\t// status2RegModemStateTransmitting = 0x03\n\t// the minimum time for RxWait is defined by the RxWait register\n\t// status2RegModemStateRxWait      = 0x04 // wait until RF field is present if the TMode register’s TxWaitRF bit is set to logic 1\n\t// status2RegModemStateWaitForData = 0x05\n\t// status2RegModemStateReceiving   = 0x06\n\t// all data communication with the card is encrypted; can only be set to logic 1 by a successful execution of the\n\t// MFAuthent command; only valid in Read/Write mode for MIFARE standard cards; this bit is cleared by software\n\tstatus2RegMFCrypto1OnBit = 0x08 // bit 3: indicates that the MIFARE Crypto1 unit is switched on and, see above\n\t// status2RegReserved45 = 0x30\n\t// 1: the I2C-bus input filter is set to the High-speed mode independent of the I2C-bus protocol\n\t// 0: the I2C-bus input filter is set to the I2C-bus protocol used\n\t// status2RegI2cForceHSBit     = 0x40 // I2C-bus input filter settings, see above\n\t// status2RegTempSensClear1Bit = 0x80 // clears the temperature error if the temperature is below the alarm limit of 125C\n)\n\nconst (\n\tregFIFOData = 0x09 // input and output of 64 byte FIFO buffer\n)\n\nconst (\n\tregFIFOLevel = 0x0A // number of bytes stored in the FIFO buffer\n\t// ------------ values --------------------\n\t// fifoLevelRegReset = 0x00 // see table 41 of data sheet\n\t// indicates the number of bytes stored in the FIFO buffer writing to the FIFOData register increments and reading\n\t// decrements the FIFOLevel value\n\t// fifoLevelRegValue = 0x7F // bit 0..6: see above\n\t// immediately clears the internal FIFO buffer’s read and write pointer and Error register’s BufferOvfl bit reading\n\t// this bit always returns 0\n\tfifoLevelRegFlushBufferBit = 0x80 // bit 7: see above\n)\n\nconst (\n// ------------ unused commands --------------------\n// regWaterLevel = 0x0B // level for FIFO underflow and overflow warning\n)\n\nconst (\n\tregControl = 0x0C // miscellaneous control registers\n\t// ------------ values --------------------\n\t// controlRegReset = 0x10 // see table 45 of data sheet\n\t// indicates the number of valid bits in the last received byte\n\t// if this value is 000b, the whole byte is valid\n\tcontrolRegRxLastBits = 0x07 // bit 0..2: see above\n\t// controlRegReserved3to5 = 0x38\n\t// controlRegTStartNowBit = 0x40 // bit 6: timer starts immediately, if 1; reading always returns logic 0\n\t// controlRegTStopNow     = 0x80 // bit 7: timer stops immediately, if 1; reading always returns logic 0\n)\n\nconst (\n\tregBitFraming = 0x0D // adjustments for bit-oriented frames\n\t// ------------ values --------------------\n\tbitFramingRegReset = 0x00 // see table 47 of data sheet\n\t// used for transmission of bit oriented frames: defines the number of bits of the last byte that will be transmitted\n\t// 000b indicates that all bits of the last byte will be transmitted\n\tbitFramingRegTxLastBits = 0x07 // bit 0..2: see above\n\t// bitFramingRegReservedBit3 = 0x08\n\t// used for reception of bit-oriented frames: defines the bit position for the first bit received to be stored in the\n\t// FIFO buffer,  example:\n\t// 0: LSB of the received bit is stored at bit position 0, the second received bit is stored at bit position 1\n\t// 1: LSB of the received bit is stored at bit position 1, the second received bit is stored at bit position 2\n\t// 7: LSB of the received bit is stored at bit position 7, the second received bit is stored in the next byte that\n\t// follows at bit position 0\n\t// These bits are only to be used for bitwise anticollision at 106 kBd, for all other modes they are set to 0\n\t// bitFramingRegRxAlign = 0x70 // bit 4..6: see above\n\t// starts the transmission of data, only valid in combination with the Transceive command\n\tbitFramingRegStartSendBit = 0x80 // bit 7: see above\n)\n\nconst (\n\tregColl = 0x0E // bit position of the first bit-collision detected on the RF interface\n\t// 4 to 0 CollPos[4:0]-\n\t// shows the bit position of the first detected collision in a received frame only data bits are interpreted example:\n\t// 00: indicates a bit-collision in the 32nd bit\n\t// 01: indicates a bit-collision in the 1st bit\n\t// 08: indicates a bit-collision in the 8th bit\n\t// These bits will only be interpreted if the CollPosNotValid bit is set to logic 0\n\t// collRegCollPos = 0x1F // bit 0..4: read-only, see above\n\t// no collision detected or the position of the collision is out of the range of CollPos[4:0], if set to 1\n\t// collRegCollPosNotValidBit = 0x20 // bit 5: read-only, see above\n\t// collRegReservedBit6       = 0x40\n\t// all received bits will be cleared after a collision only used during bitwise anticollision at 106 kBd, otherwise it\n\t// is set to logic 1\n\tcollRegValuesAfterCollBit = 0x80 // bit 7: see above\n)\n\n//              0x0F     // reserved for future use\n// Page 1: Command\n//               0x10     // reserved for future use\n\nconst (\n\tregMode = 0x11 // defines general modes for transmitting and receiving\n\t// ------------ values --------------------\n\t// modeRegReset = 0x3F // see table 55 of data sheet\n\t// bit 0..1: defines the preset value for the CRC coprocessor for the CalcCRC command; Remark: during any\n\t// communication, the preset values are selected automatically according to the definition of bits in the rxModeReg\n\t// and TxMode registers\n\tmodeRegCRCPreset0000 = 0x00 // 0x0000\n\tmodeRegCRCPreset6363 = 0x01 // 0x6363\n\tmodeRegCRCPresetA671 = 0x10 // 0xA671\n\tmodeRegCRCPresetFFFF = 0x11 // 0xFFFF\n\t// modeRegReservedBit2 = 0x04\n\t// defines the polarity of pin MFIN; Remark: the internal envelope signal is encoded active LOW, changing this bit\n\t// generates a MFinActIRq event\n\tmodeRegPolMFinBit = 0x08 // bit 3: polarity of pin MFIN is active HIGH, is set to 1\n\t// modeRegReservedBit4 = 0x10\n\tmodeRegTxWaitRFBit = 0x20 // bit 5: transmitter can only be started if an RF field is generated, if set to 1\n\t// modeRegReservedBit6 = 0x40\n\t// CRC coprocessor calculates the CRC with MSB first 0 in the CRCResult register the values for the CRCResultMSB[7:0]\n\t// bits and the CRCResultLSB[7:0] bits are bit reversed; Remark: during RF communication this bit is ignored\n\t// modeRegMSBFirstBit = 0x80 // bit 7: see above, if set to 1\n)\n\nconst (\n\tregTxMode = 0x12 // defines transmission data rate and framing\n\tregRxMode = 0x13 // defines reception data rate and framing\n\t// ------------ values --------------------\n\trxtxModeRegReset = 0x00\n\t// txModeRegReserved  = 0x07 // bit 0..2 reserved for TX\n\t// rxModeRegReserved  = 0x03 // bit 0,1 reserved for RX\n\t// 0: receiver is deactivated after receiving a data frame\n\t// 1: able to receive more than one data frame; only valid for data rates above 106 kBd in order to handle the\n\t// polling command; after setting this bit the Receive and Transceive commands will not terminate automatically.\n\t// Multiple reception can only be deactivated by writing any command (except the Receive command) to the commandReg\n\t// register, or by the host clearing the bit if set to logic 1, an error byte is added to the FIFO buffer at the\n\t// end of a received data stream which is a copy of the Error register value. For the  version 2.0 the\n\t// CRC status is reflected in the signal CRCOk, which indicates the actual status of the CRC coprocessor. For the\n\t//  version 1.0 the CRC status is reflected in the signal CRCErr.\n//\trxModeRegRxMultipleBit = 0x04\n// an invalid received data stream (less than 4 bits received) will be ignored and the receiver remains active\n// rxModeRegRxNoErrBit = 0x08 // bit 3\n// txModeRegInvModBit  = 0x08 // bit 3: modulation of transmitted data is inverted, if 1\n// bit 4..6: defines the bit rate during data transmission; the  handles transfer speeds up to 848 kBd\n// rxtxModeRegSpeed106kBd = 0x00 //106 kBd\n// rxtxModeRegSpeed212kBd = 0x10 //212 kBd\n// rxtxModeRegSpeed424kBd = 0x20 //424 kBd\n// rxtxModeRegSpeed848kBd = 0x30 //848 kBd\n// rxtxModeRegSpeedRes1   = 0x40 //reserved\n// rxtxModeRegSpeedRes2   = 0x50 //reserved\n// rxtxModeRegSpeedRes3   = 0x60 //reserved\n// rxtxModeRegSpeedRes4   = 0x70 //reserved\n// RX: enables the CRC calculation during reception\n// TX: enables CRC generation during data transmission\n// rxtxModeRegTxCRCEnBit = 0x80 // bit 7: can only be set to logic 0 at 106 kBd\n)\n\nconst (\n\tregTxControl = 0x14 // controls the logical behavior of the antenna driver pins TX1 and TX2\n\t// ------------ values --------------------\n\t// regtxControlRegReset = 0x80 // see table 61 of data sheet\n\t// signal on pin TX1 delivers the 13.56 MHz energy carrier modulated by the transmission data\n\ttxControlRegTx1RFEn1outputBit = 0x01 // bit 0: see above\n\t// signal on pin TX2 delivers the 13.56 MHz energy carrier modulated by the transmission data\n\ttxControlRegTx2RFEn1outputBit = 0x02 // bit 1: see above\n\t// txControlRegReservedBit2 = 0x04\n\t// signal on pin TX2 continuously delivers the unmodulated 13.56 MHz energy carrier0Tx2CW bit is enabled to modulate\n\t// the 13.56 MHz energy carrier\n\t// txControlRegTx2CW1outputBit = 0x08 // bit 3: see above\n\t// txControlRegInvTx1RFOffBit  = 0x10 // bit 4: output signal on pin TX1 inverted if driver TX1 is disabled, if 1\n\t// txControlRegInvTx2RFOffBit  = 0x20 // bit 5: output signal on pin TX2 inverted if driver TX2 is disabled, if 1\n\t// txControlRegInvTx1RFOnBit   = 0x40 // bit 6: output signal on pin TX1 inverted if driver TX1 is enabled, if 1\n\t// txControlRegInvTx2RFOnBit   = 0x80 // bit 7: output signal on pin TX2 inverted if driver TX2 is enabled, if 1\n)\n\nconst (\n\tregTxASK = 0x15 // controls the setting of the transmission modulation\n\t// ------------ values --------------------\n\t// txASKRegReset = 0x00 // see table 63 of data sheet\n\t// txASKRegReserved = 0x3F // bit 0..5\n\ttxASKRegForce100ASKBit = 0x40 // bit 6: forces a 100 % ASK modulation independent of the ModGsP register\n\t// txASKRegReservedBit7 = 0x80\n)\n\nconst (\n\t// regTxSel       = 0x16 // selects the internal sources for the antenna driver\n\t// regRxSel       = 0x17 // selects internal receiver settings\n\t// regRxThreshold = 0x18 // selects thresholds for the bit decoder\n\t// regDemod       = 0x19 // defines demodulator settings\n\t//               0x1A     // reserved for future use\n\t//               0x1B     // reserved for future use\n\t// regMfTx = 0x1C // controls some MIFARE communication transmit parameters\n\t// regMfRx = 0x1D // controls some MIFARE communication receive parameters\n\t//               0x1E     // reserved for future use\n\t// regSerialSpeed = 0x1F // selects the speed of the serial UART interface\n\n\t// Page 2: Configuration\n\t//               0x20 // reserved for future use\n\tregCRCResultH = 0x21 // shows the MSB and LSB values of the CRC calculation\n\tregCRCResultL = 0x22\n\t//               0x23 // reserved for future use\n)\n\nconst (\n\tregModWidth = 0x24\n\t// ------------ values --------------------\n\tmodWidthRegReset = 0x26 // see table 93 of data sheet\n)\n\n//               0x25        // reserved for future use\n\nconst (\n\tregRFCfg = 0x26 // configures the receiver gain\n\t// ------------ values --------------------\n\t// rfcCfgRegReset = 0x48 // see table 97 of data sheet\n\t// rfcCfgRegReserved03 = 0x07\n\t// bit 4..6: defines the receiver’s signal voltage gain factor\n\trfcCfgRegRxGain18dB  = 0x00\n\trfcCfgRegRxGain23dB  = 0x10\n\trfcCfgRegRxGain018dB = 0x20\n\trfcCfgRegRxGain023dB = 0x30\n\trfcCfgRegRxGain33dB  = 0x40\n\trfcCfgRegRxGain38dB  = 0x50\n\trfcCfgRegRxGain43dB  = 0x60\n\trfcCfgRegRxGain48dB  = 0x70\n\t// rfcCfgRegReserved7 = 0x80\n)\n\nconst (\n// ------------ unused commands --------------------\n// regGsN    = 0x27 // selects the conductance of the antenna driver pins TX1 and TX2 for modulation\n// regCWGsP  = 0x28 // defines the conductance of the p-driver output during periods of no modulation\n// regModGsP = 0x29 // defines the conductance of the p-driver output during periods of modulation\n)\n\nconst (\n\tregTMode      = 0x2A // defines settings for the internal timer\n\tregTPrescaler = 0x2B // the lower 8 bits of the TPrescaler value. The 4 high bits are in tModeReg.\n\t// ------------ values --------------------\n\t// tModeRegReset      = 0x00 // see table 105 of data sheet\n\t// tPrescalerRegReset = 0x00 // see table 107 of data sheet\n\t// timer starts automatically at the end of the transmission in all communication modes at all speeds; if the\n\t// RxMode register’s RxMultiple bit is not set, the timer stops immediately after receiving the 5th bit (1 start\n\t// bit, 4 data bits); if the RxMultiple bit is set to logic 1 the timer never stops, in which case the timer can be\n\t// stopped by setting the Control register’s TStopNow bit to logic 1\n\ttModeRegTAutoBit = 0x80 // bit 7: see above\n\t// bit 6,5: indicates that the timer is not influenced by the protocol; internal timer is running in\n\t// gated mode; Remark: in gated mode, the Status1 register’s TRunning bit is logic 1 when the timer is enabled by\n\t// the TMode register’s TGated bits; this bit does not influence the gating signal\n\t// tModeRegTGatedNon  = 0x00 // non-gated mode\n\t// tModeRegTGatedMFIN = 0x20 // gated by pin MFIN\n\t// tModeRegTGatedAUX1 = 0x40 // gated by pin AUX1\n\t// 1: timer automatically restarts its count-down from the 16-bit timer reload value instead of counting down to zero\n\t// 0: timer decrements to 0 and the ComIrq register’s TimerIRq bit is set to logic 1\n\t// tModeRegTAutoRestartBit = 0x10 // bit 4, see above\n\t// defines the higher 4 bits of the TPrescaler value; The following formula is used to calculate the timer\n\t// frequency if the Demod register’s TPrescalEven bit in Demot register’s set to logic 0:\n\t// ftimer = 13.56 MHz / (2*TPreScaler+1); TPreScaler = [tPrescalerRegHi:tPrescalerRegLo]\n\t// TPrescaler value on 12 bits) (Default TPrescalEven bit is logic 0)\n\t// The following formula is used to calculate the timer frequency if the Demod register’s TPrescalEven bit is set\n\t// to logic 1: ftimer = 13.56 MHz / (2*TPreScaler+2).\n\t// tModeRegtPrescalerRegValue25us  = 0x0A9 // 169  => fRegtimer=40kHz, timer period of 25μs.\n\t// tModeRegtPrescalerRegValue38us  = 0x0FF // 255  => fRegtimer=26kHz, timer period of 38μs.\n\t// tModeRegtPrescalerRegValue500us = 0xD3E // 3390 => fRegtimer= 2kHz, timer period of 500us.\n\t// tModeRegtPrescalerRegValue604us = 0xFFF // 4095 => fRegtimer=1.65kHz, timer period of 604us.\n)\n\nconst (\n\t// defines the 16-bit timer reload value; on a start event, the timer loads the timer reload value changing this\n\t// register affects the timer only at the next start event\n\tregTReloadH = 0x2C\n\tregTReloadL = 0x2D\n\t// ------------ values --------------------\n\ttReloadRegReset      = 0x0000 // see table 109, 111\n\ttReloadRegValue25ms  = 0x03E8 // 1000,  25ms before timeout\n\ttReloadRegValue833ms = 0x001E //   30, 833ms before timeout\n)\n\nconst (\n\t// ------------ unused commands --------------------\n\t// regTCounterValueH = 0x2E // shows the 16-bit timer value\n\t// regTCounterValueL = 0x2F\n\n\t// Page 3: Test Registers\n\t//               0x30      // reserved for future use\n\tregTestSel1     = 0x31 // general test signal configuration\n\tregTestSel2     = 0x32 // general test signal configuration\n\tregTestPinEn    = 0x33 // enables pin output driver on pins D1 to D7\n\tregTestPinValue = 0x34 // defines the values for D1 to D7 when it is used as an I/O bus\n\tregTestBus      = 0x35 // shows the status of the internal test bus\n\tregAutoTest     = 0x36 // controls the digital self-test\n\tregVersion      = 0x37 // shows the software version\n\tregAnalogTest   = 0x38 // controls the pins AUX1 and AUX2\n\tregTestDAC1     = 0x39 // defines the test value for TestDAC1\n\tregTestDAC2     = 0x3A // defines the test value for TestDAC2\n\tregTestADC      = 0x3B // shows the value of ADC I and Q channels\n\t//               0x3C      // reserved for production tests\n\t//               0x3D      // reserved for production tests\n\t//               0x3E      // reserved for production tests\n\t//               0x3F      // reserved for production tests\n)\n"
  },
  {
    "path": "drivers/common/mfrc522/mfrc522_pcd_test.go",
    "content": "package mfrc522\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\ntype busConnMock struct {\n\twritten []byte\n\treadIdx int\n\tsimRead []byte\n\tfifoIdx int\n\tsimFifo []byte\n}\n\nfunc (c *busConnMock) ReadByteData(reg uint8) (uint8, error) {\n\tc.written = append(c.written, reg)\n\n\tswitch reg {\n\tcase regFIFOLevel:\n\t\treturn uint8(len(c.simFifo)), nil //nolint:gosec // ok for test\n\tcase regFIFOData:\n\t\tc.fifoIdx++\n\t\treturn c.simFifo[c.fifoIdx-1], nil\n\tdefault:\n\t\tif len(c.simRead) > 0 {\n\t\t\tc.readIdx++\n\t\t\treturn c.simRead[c.readIdx-1], nil\n\t\t}\n\t\treturn 0, nil\n\t}\n}\n\nfunc (c *busConnMock) WriteByteData(reg uint8, data byte) error {\n\tc.written = append(c.written, reg)\n\tc.written = append(c.written, data)\n\treturn nil\n}\n\nfunc initTestMFRC522CommonWithStubbedConnector() (*MFRC522Common, *busConnMock) {\n\tc := &busConnMock{}\n\td := NewMFRC522Common()\n\td.connection = c\n\treturn d, c\n}\n\nfunc TestNewMFRC522Common(t *testing.T) {\n\t// act\n\td := NewMFRC522Common()\n\t// assert\n\tassert.NotNil(t, d)\n}\n\nfunc TestInitialize(t *testing.T) {\n\t// arrange\n\twantSoftReset := []byte{0x01, 0x0F, 0x01}\n\twantInit := []byte{\n\t\t0x12, 0x00, 0x13, 0x00, 0x24, 0x26, 0x2A, 0x8F, 0x2B, 0xFF, 0x2D, 0xE8, 0x2C, 0x03, 0x15, 0x40, 0x11, 0x29,\n\t}\n\twantAntennaOn := []byte{0x14, 0x14, 0x03}\n\twantGain := []byte{0x26, 0x50}\n\tc := &busConnMock{}\n\td := NewMFRC522Common()\n\t// act\n\terr := d.Initialize(c)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, c, d.connection)\n\tassert.Equal(t, wantSoftReset, c.written[:3])\n\tassert.Equal(t, wantInit, c.written[3:21])\n\tassert.Equal(t, wantAntennaOn, c.written[21:24])\n\tassert.Equal(t, wantGain, c.written[24:])\n}\n\nfunc Test_getVersion(t *testing.T) {\n\t// arrange\n\td, c := initTestMFRC522CommonWithStubbedConnector()\n\twantWritten := []byte{0x37}\n\tconst want = uint8(5)\n\tc.simRead = []byte{want}\n\t// act\n\tgot, err := d.getVersion()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, want, got)\n\tassert.Equal(t, wantWritten, c.written)\n}\n\nfunc Test_switchAntenna(t *testing.T) {\n\ttests := map[string]struct {\n\t\ttarget      bool\n\t\tsimRead     byte\n\t\twantWritten []byte\n\t}{\n\t\t\"switch_on\": {\n\t\t\ttarget:      true,\n\t\t\tsimRead:     0xFD,\n\t\t\twantWritten: []byte{0x14, 0x14, 0xFF},\n\t\t},\n\t\t\"is_already_on\": {\n\t\t\ttarget:      true,\n\t\t\tsimRead:     0x03,\n\t\t\twantWritten: []byte{0x14},\n\t\t},\n\t\t\"switch_off\": {\n\t\t\ttarget:      false,\n\t\t\tsimRead:     0x03,\n\t\t\twantWritten: []byte{0x14, 0x14, 0x00},\n\t\t},\n\t\t\"is_already_off\": {\n\t\t\ttarget:      false,\n\t\t\tsimRead:     0xFD,\n\t\t\twantWritten: []byte{0x14},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, c := initTestMFRC522CommonWithStubbedConnector()\n\t\t\tc.simRead = []byte{tc.simRead}\n\t\t\t// act\n\t\t\terr := d.switchAntenna(tc.target)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantWritten, c.written)\n\t\t})\n\t}\n}\n\nfunc Test_stopCrypto1(t *testing.T) {\n\t// arrange\n\td, c := initTestMFRC522CommonWithStubbedConnector()\n\tc.simRead = []byte{0xFF}\n\twantWritten := []byte{0x08, 0x08, 0xF7}\n\t// act\n\terr := d.stopCrypto1()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantWritten, c.written)\n}\n\nfunc Test_communicateWithPICC(t *testing.T) {\n\t// arrange\n\td, c := initTestMFRC522CommonWithStubbedConnector()\n\tdataToFifo := []byte{0xF1, 0xF2}\n\twrittenPrepare := []byte{0x02, 0xF7, 0x04, 0x7F, 0x0A, 0x80, 0x01, 0x00}\n\twrittenWriteFifo := []byte{0x09, 0xF1, 0x09, 0xF2}\n\twrittenTransceive := []byte{0x0D, 0x00, 0x01, 0x0C}\n\twrittenBitFramingStart := []byte{0x0D, 0x0D, 0x80}\n\twrittenWaitAndFinish := []byte{0x04, 0x0D, 0x0D, 0x7F, 0x06}\n\twrittenReadFifo := []byte{0x0A, 0x09, 0x09, 0x0C}\n\t// read: bit framing register set, simulate calculation done, bit framing register clear, simulate no error,\n\t// simulate control register 0x00\n\tc.simRead = []byte{0x00, 0x30, 0xFF, 0x00, 0x00}\n\tc.simFifo = []byte{0x11, 0x22}\n\n\tbackData := []byte{0x00, 0x00}\n\t// act\n\t// transceive, all 8 bits, no CRC\n\terr := d.communicateWithPICC(0x0C, dataToFifo, backData, 0x00, false)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, writtenPrepare, c.written[:8])\n\tassert.Equal(t, writtenWriteFifo, c.written[8:12])\n\tassert.Equal(t, writtenTransceive, c.written[12:16])\n\tassert.Equal(t, writtenBitFramingStart, c.written[16:19])\n\tassert.Equal(t, writtenWaitAndFinish, c.written[19:24])\n\tassert.Equal(t, writtenReadFifo, c.written[24:])\n\tassert.Equal(t, []byte{0x11, 0x22}, backData)\n}\n\nfunc Test_calculateCRC(t *testing.T) {\n\t// arrange\n\td, c := initTestMFRC522CommonWithStubbedConnector()\n\tdataToFifo := []byte{0x02, 0x03}\n\twrittenPrepare := []byte{0x01, 0x00, 0x05, 0x04, 0x0A, 0x80}\n\twrittenFifo := []byte{0x09, 0x02, 0x09, 0x03}\n\twrittenCalc := []byte{0x01, 0x03, 0x05, 0x01, 0x00}\n\twrittenGetResult := []byte{0x22, 0x21}\n\tc.simRead = []byte{0x04, 0x11, 0x22} // calculation done, crcL, crcH\n\tgotCrcBack := []byte{0x00, 0x00}\n\t// act\n\terr := d.calculateCRC(dataToFifo, gotCrcBack)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, writtenPrepare, c.written[:6])\n\tassert.Equal(t, writtenFifo, c.written[6:10])\n\tassert.Equal(t, writtenCalc, c.written[10:15])\n\tassert.Equal(t, writtenGetResult, c.written[15:])\n\tassert.Equal(t, []byte{0x11, 0x22}, gotCrcBack)\n}\n\nfunc Test_writeFifo(t *testing.T) {\n\t// arrange\n\td, c := initTestMFRC522CommonWithStubbedConnector()\n\tdataToFifo := []byte{0x11, 0x22, 0x33}\n\twantWritten := []byte{0x09, 0x11, 0x09, 0x22, 0x09, 0x33}\n\t// act\n\terr := d.writeFifo(dataToFifo)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantWritten, c.written)\n}\n\nfunc Test_readFifo(t *testing.T) {\n\t// arrange\n\td, c := initTestMFRC522CommonWithStubbedConnector()\n\tc.simFifo = []byte{0x30, 0x20, 0x10}\n\twantWritten := []byte{0x0A, 0x09, 0x09, 0x09, 0x0C}\n\tbackData := []byte{0x00, 0x00, 0x00}\n\t// act\n\t_, err := d.readFifo(backData)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantWritten, c.written)\n\tassert.Equal(t, c.simFifo, backData)\n}\n"
  },
  {
    "path": "drivers/common/mfrc522/mfrc522_picc.go",
    "content": "//nolint:lll // ok here\npackage mfrc522\n\nimport (\n\t\"fmt\"\n)\n\nconst piccDebug = false\n\n// Commands sent to the PICC, used by the PCD to for communication with several PICCs (ISO 14443-3, Type A, section 6.4)\nconst (\n\t// Activation\n\tpiccCommandRequestA = 0x26 // REQuest command type A, 7 bit frame, invites PICCs in state IDLE to go to READY\n\tpiccCommandWakeUpA  = 0x52 // Wake-UP command type A, 7 bit frame, invites PICCs in state IDLE and HALT to go to READY\n\t// Anticollision and SAK\n\tpiccCommandCascadeLevel1 = 0x93 // Select cascade level 1\n\tpiccCommandCascadeLevel2 = 0x95 // Select cascade Level 2\n\tpiccCommandCascadeLevel3 = 0x97 // Select cascade Level 3\n\tpiccCascadeTag           = 0x88 // Cascade tag is used during anti collision\n\tpiccUIDNotComplete       = 0x04 // used on SAK call\n\t// Halt\n\tpiccCommandHLTA = 0x50 // Halt command, Type A. Instructs an active PICC to go to state HALT.\n\tpiccCommandRATS = 0xE0 // Request command for Answer To Reset.\n\t// The commands used for MIFARE Classic (from http://www.mouser.com/ds/2/302/MF1S503x-89574.pdf, Section 9)\n\t// Use MFAuthent to authenticate access to a sector, then use these commands to read/write/modify the blocks on\n\t// the sector. The read/write commands can also be used for MIFARE Ultralight.\n\tpiccCommandMFRegAUTHRegKEYRegA = 0x60 // Perform authentication with Key A\n\tpiccCommandMFRegAUTHRegKEYRegB = 0x61 // Perform authentication with Key B\n\t// Reads one 16 byte block from the authenticated sector of the PICC. Also used for MIFARE Ultralight.\n\tpiccCommandMFRegREAD = 0x30\n\t// Writes one 16 byte block to the authenticated sector of the PICC. Called \"COMPATIBILITY WRITE\" for MIFARE Ultralight.\n\tpiccCommandMFRegWRITE     = 0xA0\n\tpiccWriteAck              = 0x0A // MIFARE Classic: 4 bit ACK, we use any other value as NAK (data sheet: 0h to 9h, Bh to Fh)\n\tpiccCommandMFRegDECREMENT = 0xC0 // Decrements the contents of a block and stores the result in the internal data register.\n\tpiccCommandMFRegINCREMENT = 0xC1 // Increments the contents of a block and stores the result in the internal data register.\n\tpiccCommandMFRegRESTORE   = 0xC2 // Reads the contents of a block into the internal data register.\n\tpiccCommandMFRegTRANSFER  = 0xB0 // Writes the contents of the internal data register to a block.\n\t// The commands used for MIFARE Ultralight (from http://www.nxp.com/documents/dataRegsheet/MF0ICU1.pdf, Section 8.6)\n\t// The piccCommandMFRegREAD and piccCommandMFRegWRITE can also be used for MIFARE Ultralight.\n\t// piccCommandULRegWRITE = 0xA2 // Writes one 4 byte page to the PICC.\n)\n\nconst piccReadWriteAuthBlock = uint8(11)\n\nvar (\n\tpiccKey                = []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}\n\tpiccUserBlockAddresses = []byte{8, 9, 10}\n)\n\nvar piccCardFromSak = map[uint8]string{\n\t0x08: \"Classic 1K, Plus 2K-SE-1K(SL1)\", 0x18: \"Classic 4K, Plus 4K(SL1)\",\n\t0x10: \"Plus 2K(SL2)\", 0x11: \"Plus 4K(SL2)\", 0x20: \"Plus 2K-SE-1K(SL3), Plus 4K(SL3)\",\n}\n\n// IsCardPresent is used to poll for a card in range. After an successful request, the card is halted.\nfunc (d *MFRC522Common) IsCardPresent() error {\n\td.firstCardAccess = true\n\n\tif err := d.writeByteData(regTxMode, rxtxModeRegReset); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regRxMode, rxtxModeRegReset); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(regModWidth, modWidthRegReset); err != nil {\n\t\treturn err\n\t}\n\n\tanswer := []byte{0x00, 0x00} // also called ATQA\n\tif err := d.piccRequest(piccCommandWakeUpA, answer); err != nil {\n\t\treturn err\n\t}\n\n\tif piccDebug {\n\t\tfmt.Printf(\"Card found: %v\\n\\n\", answer)\n\t}\n\tif err := d.piccHalt(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ReadText reads a card with the dedicated workflow: REQA, Activate, Perform Transaction, Halt/Deselect.\n// see \"Card Polling\" in https://www.nxp.com/docs/en/application-note/AN10834.pdf.\n// and return the result as text string.\n// TODO: make this more usable, e.g. by given length of text\nfunc (d *MFRC522Common) ReadText() (string, error) {\n\tanswer := []byte{0x00, 0x00}\n\tif err := d.piccRequest(piccCommandWakeUpA, answer); err != nil {\n\t\treturn \"\", err\n\t}\n\n\tuid, err := d.piccActivate()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif piccDebug {\n\t\tfmt.Printf(\"uid: %v\\n\", uid)\n\t}\n\n\tif err := d.piccAuthenticate(piccReadWriteAuthBlock, piccKey, uid); err != nil {\n\t\tif piccDebug {\n\t\t\tfmt.Println(\"authenticate failed for address\", piccReadWriteAuthBlock)\n\t\t}\n\t\treturn \"\", err\n\t}\n\n\tvar content []byte\n\tfor _, block := range piccUserBlockAddresses {\n\t\tblockData, err := d.piccRead(block)\n\t\tif err != nil {\n\t\t\tif piccDebug {\n\t\t\t\tfmt.Println(\"read failed at block\", block)\n\t\t\t}\n\t\t\treturn \"\", err\n\t\t}\n\t\tcontent = append(content, blockData...)\n\t}\n\tif piccDebug {\n\t\tfmt.Println(\"content:\", string(content), len(content))\n\t}\n\n\tif err := d.piccHalt(); err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(content), d.stopCrypto1()\n}\n\n// WriteText writes the given string to the card. All old values will be overwritten.\nfunc (d *MFRC522Common) WriteText(text string) error {\n\tanswer := []byte{0x00, 0x00}\n\tif err := d.piccRequest(piccCommandWakeUpA, answer); err != nil {\n\t\treturn err\n\t}\n\n\tuid, err := d.piccActivate()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif piccDebug {\n\t\tfmt.Printf(\"uid: %v\\n\", uid)\n\t}\n\n\tif err := d.piccAuthenticate(piccReadWriteAuthBlock, piccKey, uid); err != nil {\n\t\tif piccDebug {\n\t\t\tfmt.Println(\"authenticate failed for address\", piccReadWriteAuthBlock)\n\t\t}\n\t\treturn err\n\t}\n\n\t// prepare data with text and trailing zero's\n\ttextData := append([]byte(text), make([]byte, len(piccUserBlockAddresses)*16)...)\n\n\tfor i, blockNum := range piccUserBlockAddresses {\n\t\tblockData := textData[i*16 : (i+1)*16]\n\t\terr := d.piccWrite(blockNum, blockData)\n\t\tif err != nil {\n\t\t\tif piccDebug {\n\t\t\t\tfmt.Println(\"write failed at block\", blockNum)\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif err := d.piccHalt(); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.stopCrypto1()\n}\n\nfunc (d *MFRC522Common) piccHalt() error {\n\tif piccDebug {\n\t\tfmt.Println(\"-halt-\")\n\t}\n\thaltCommand := []byte{piccCommandHLTA, 0x00}\n\tcrcResult := []byte{0x00, 0x00}\n\tif err := d.calculateCRC(haltCommand, crcResult); err != nil {\n\t\treturn err\n\t}\n\thaltCommand = append(haltCommand, crcResult...)\n\n\ttxLastBits := uint8(0x00) // we use all 8 bits\n\tif err := d.communicateWithPICC(commandRegTransceive, haltCommand, []byte{}, txLastBits, false); err != nil {\n\t\t// an error is the sign for successful halt\n\t\tif piccDebug {\n\t\t\tfmt.Println(\"this is not treated as error:\", err)\n\t\t}\n\t\treturn nil\n\t}\n\n\treturn fmt.Errorf(\"something went wrong with halt\")\n}\n\nfunc (d *MFRC522Common) piccWrite(block uint8, blockData []byte) error {\n\tif piccDebug {\n\t\tfmt.Println(\"-write-\")\n\t\tfmt.Println(\"blockData:\", string(blockData), len(blockData))\n\t}\n\tif len(blockData) != 16 {\n\t\treturn fmt.Errorf(\"the block to write needs to be exactly 16 bytes long, but has %d bytes\", len(blockData))\n\t}\n\t// MIFARE Classic protocol requires two steps to perform a write.\n\t// Step 1: Tell the PICC we want to write to block blockAddr.\n\twriteDataCommand := []byte{piccCommandMFRegWRITE, block}\n\tcrcResult := []byte{0x00, 0x00}\n\tif err := d.calculateCRC(writeDataCommand, crcResult); err != nil {\n\t\treturn err\n\t}\n\twriteDataCommand = append(writeDataCommand, crcResult...)\n\n\ttxLastBits := uint8(0x00) // we use all 8 bits\n\tbackData := make([]byte, 1)\n\tif err := d.communicateWithPICC(commandRegTransceive, writeDataCommand, backData, txLastBits, false); err != nil {\n\t\treturn err\n\t}\n\tif backData[0]&piccWriteAck != piccWriteAck {\n\t\treturn fmt.Errorf(\"preparation of write on MIFARE classic failed (%v)\", backData)\n\t}\n\tif piccDebug {\n\t\tfmt.Println(\"backData\", string(backData))\n\t}\n\n\t// Step 2: Transfer the data\n\tif err := d.calculateCRC(blockData, crcResult); err != nil {\n\t\treturn err\n\t}\n\n\tvar writeData []byte\n\twriteData = append(writeData, blockData...)\n\twriteData = append(writeData, crcResult...)\n\tif err := d.communicateWithPICC(commandRegTransceive, writeData, []byte{}, txLastBits, false); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (d *MFRC522Common) piccRead(block uint8) ([]byte, error) {\n\tif piccDebug {\n\t\tfmt.Println(\"-read-\")\n\t}\n\treadDataCommand := []byte{piccCommandMFRegREAD, block}\n\tcrcResult := []byte{0x00, 0x00}\n\tif err := d.calculateCRC(readDataCommand, crcResult); err != nil {\n\t\treturn nil, err\n\t}\n\treadDataCommand = append(readDataCommand, crcResult...)\n\n\ttxLastBits := uint8(0x00)    // we use all 8 bits\n\tbackData := make([]byte, 18) // 16 data byte and 2 byte CRC\n\tif err := d.communicateWithPICC(commandRegTransceive, readDataCommand, backData, txLastBits, true); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn backData[:16], nil\n}\n\nfunc (d *MFRC522Common) piccAuthenticate(address uint8, key []byte, uid []byte) error {\n\tif piccDebug {\n\t\tfmt.Println(\"-authenticate-\")\n\t}\n\n\tbuf := []byte{piccCommandMFRegAUTHRegKEYRegA, address}\n\tbuf = append(buf, key...)\n\tbuf = append(buf, uid...)\n\n\tif err := d.communicateWithPICC(commandRegMFAuthent, buf, []byte{}, 0, false); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// activate a card with the dedicated workflow: Anticollision and optional Request for \"Answer To Select\" (RATS) and\n// \"Protocol Parameter Selection\" (PPS).\n// see \"Card Activation\" in https://www.nxp.com/docs/en/application-note/AN10834.pdf.\n// note: the card needs to be in ready state, e.g. by a request or wake up is done before\nfunc (d *MFRC522Common) piccActivate() ([]byte, error) {\n\tif err := d.clearRegisterBitMask(regColl, collRegValuesAfterCollBit); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := d.writeByteData(regBitFraming, bitFramingRegReset); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// start cascade level 1 (0x93) for return:\n\t// * one size UID (4 byte): UID0..3 and one byte BCC or\n\t// * cascade tag (0x88) and UID0..2 and BCC\n\t// in the latter case the UID is incomplete and the next cascade level needs to be started.\n\t// cascade level 2 (0x95) return:\n\t// * double size UID (7 byte): UID3..6 and one byte BCC or\n\t// * cascade tag (0x88) and UID3..5 and BCC\n\t// cascade level 3 (0x97) return:\n\t// * triple size UID (10 byte): UID6..9\n\t// after each anticollision check (request of next UID) the SAK needs to be done (same level command)\n\t// BCC: Block Check Character\n\t// SAK: Select Acknowledge\n\n\tvar uid []byte\n\tvar sak uint8\n\n\tfor cascadeLevel := 1; cascadeLevel < 3; cascadeLevel++ {\n\t\tvar piccCommand uint8\n\t\tswitch cascadeLevel {\n\t\tcase 1:\n\t\t\tpiccCommand = piccCommandCascadeLevel1\n\t\tcase 2:\n\t\t\tpiccCommand = piccCommandCascadeLevel2\n\t\tcase 3:\n\t\t\tpiccCommand = piccCommandCascadeLevel3\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"unknown cascade level %d\", cascadeLevel)\n\t\t}\n\n\t\tif piccDebug {\n\t\t\tfmt.Println(\"-anti collision-\")\n\t\t}\n\n\t\ttxLastBits := uint8(0x00) // we use all 8 bits\n\t\tnumValidBits := uint8(4 * 8)\n\t\tsendForAnticol := []byte{piccCommand, numValidBits}\n\t\tbackData := []byte{0x00, 0x00, 0x00, 0x00, 0x00} // 4 bytes CT/UID and BCC\n\t\tif err := d.communicateWithPICC(commandRegTransceive, sendForAnticol, backData, txLastBits, false); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// TODO: no real anticollision check yet\n\n\t\t// check BCC\n\t\tbcc := byte(0)\n\t\tfor _, v := range backData[:4] {\n\t\t\tbcc = bcc ^ v\n\t\t}\n\t\tif bcc != backData[4] {\n\t\t\treturn nil, fmt.Errorf(\"BCC mismatch, expected %02x actual %02x\", bcc, backData[4])\n\t\t}\n\n\t\tif backData[0] == piccCascadeTag {\n\t\t\tuid = append(uid, backData[1:3]...)\n\t\t\tif piccDebug {\n\t\t\t\tfmt.Printf(\"next cascade is needed after SAK, uid: %v\", uid)\n\t\t\t}\n\t\t} else {\n\t\t\tuid = append(uid, backData[:4]...)\n\t\t\tif piccDebug {\n\t\t\t\tfmt.Printf(\"backData: %v, uid: %v\\n\", backData, uid)\n\t\t\t}\n\t\t}\n\n\t\tif piccDebug {\n\t\t\tfmt.Println(\"-select acknowledge-\")\n\t\t}\n\t\tsendCommand := []byte{piccCommand}\n\t\tsendCommand = append(sendCommand, 0x70)        // 7 bytes\n\t\tsendCommand = append(sendCommand, backData...) // uid including BCC\n\t\tcrcResult := []byte{0x00, 0x00}\n\t\tif err := d.calculateCRC(sendCommand, crcResult); err != nil {\n\t\t\treturn uid, err\n\t\t}\n\t\tsendCommand = append(sendCommand, crcResult...)\n\t\tsakData := []byte{0x00, 0x00, 0x00}\n\t\tif err := d.communicateWithPICC(commandRegTransceive, sendCommand, sakData, txLastBits, false); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tbcc = byte(0)\n\t\tfor _, v := range sakData[:2] {\n\t\t\tbcc = bcc ^ v\n\t\t}\n\t\tif piccDebug {\n\t\t\tfmt.Printf(\"sak data: %v\\n\", sakData)\n\t\t}\n\t\tif sakData[0] != piccUIDNotComplete {\n\t\t\tsak = sakData[0]\n\t\t\tbreak\n\t\t}\n\t\tif piccDebug {\n\t\t\tfmt.Printf(\"next cascade called, SAK: %v\\n\", sakData[0])\n\t\t}\n\t}\n\n\tif piccDebug || d.firstCardAccess {\n\t\td.firstCardAccess = false\n\t\tfmt.Printf(\"card '%s' selected\\n\", piccCardFromSak[sak])\n\t}\n\treturn uid, nil\n}\n\nfunc (d *MFRC522Common) piccRequest(reqMode uint8, answer []byte) error {\n\tif len(answer) < 2 {\n\t\treturn fmt.Errorf(\"at least 2 bytes room needed for the answer\")\n\t}\n\n\tif err := d.clearRegisterBitMask(regColl, collRegValuesAfterCollBit); err != nil {\n\t\treturn err\n\t}\n\n\t// for request A and wake up the short frame format is used - transmit only 7 bits of the last (and only) byte.\n\ttxLastBits := uint8(0x07 & bitFramingRegTxLastBits)\n\tif err := d.communicateWithPICC(commandRegTransceive, []byte{reqMode}, answer, txLastBits, false); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/common/spherocommon/spherocommon.go",
    "content": "package spherocommon\n\nconst (\n\t// ErrorEvent event when error encountered\n\tErrorEvent = \"error\"\n\n\t// SensorDataEvent event when sensor data is received\n\tSensorDataEvent = \"sensordata\"\n\n\t// CollisionEvent event when collision is detected\n\tCollisionEvent = \"collision\"\n)\n\n// DefaultDataStreamingConfig returns a config with a sampling rate of 40hz, 1 sample frame per package,\n// unlimited streaming, and will stream all available sensor information\nfunc DefaultDataStreamingConfig() DataStreamingConfig {\n\treturn DataStreamingConfig{\n\t\tN:     10,\n\t\tM:     1,\n\t\tMask:  4294967295,\n\t\tPcnt:  0,\n\t\tMask2: 4294967295,\n\t}\n}\n\n// CalculateChecksum calculates the checksum for Sphero packets\nfunc CalculateChecksum(buf []byte) byte {\n\tvar calculatedChecksum uint16\n\tfor i := range buf {\n\t\tcalculatedChecksum += uint16(buf[i])\n\t}\n\treturn uint8(^(calculatedChecksum % 256)) //nolint:gosec // TODO: fix later\n}\n"
  },
  {
    "path": "drivers/common/spherocommon/spherocommon_packets.go",
    "content": "package spherocommon\n\n// LocatorConfig provides configuration for the Location api.\n// For more information refer to the api specification of \"Orbotix Communication API\"\n// see also: http://wiki.mark-toma.com/view/Sphero_API_Tutorial\n// The current (X,Y) coordinates of Sphero on the ground plane in centimeters.\ntype LocatorConfig struct {\n\t// Determines whether calibrate commands automatically correct the yaw tare value\n\tFlags uint8\n\t// Controls how the X-plane is aligned with Sphero’s heading coordinate system.\n\tX int16\n\t// Controls how the Y-plane is aligned with Sphero’s heading coordinate system.\n\tY int16\n\t// Controls how the X,Y-plane is aligned with Sphero’s heading coordinate system.\n\tYawTare int16\n}\n\n// CollisionConfig provides configuration for the collision detection alogorithm.\n// For more information refer to the api specification of \"Orbotix Communication API\"\n// see also: http://wiki.mark-toma.com/view/Sphero_API_Tutorial\ntype CollisionConfig struct {\n\t// Detection method type to use. Methods 01h and 02h are supported as\n\t// of FW ver 1.42. Use 00h to completely disable this service.\n\tMethod uint8\n\t// An 8-bit settable threshold for the X (left/right) axes of Sphero.\n\t// A value of 00h disables the contribution of that axis.\n\tXt uint8\n\t// An 8-bit settable threshold for the Y (front/back) axes of Sphero.\n\t// A value of 00h disables the contribution of that axis.\n\tYt uint8\n\t// An 8-bit settable speed value for the X axes. This setting is ranged\n\t// by the speed, then added to Xt to generate the final threshold value.\n\tXs uint8\n\t// An 8-bit settable speed value for the Y axes. This setting is ranged\n\t// by the speed, then added to Yt to generate the final threshold value.\n\tYs uint8\n\t// An 8-bit post-collision dead time to prevent retriggering; specified\n\t// in 10ms increments.\n\tDead uint8\n}\n\n// DataStreamingConfig provides configuration for Sensor Data Streaming.\n// For more information refer to the api specification of \"Orbotix Communication API\"\n// see also: http://wiki.mark-toma.com/view/Sphero_API_Tutorial\ntype DataStreamingConfig struct {\n\t// Divisor of the maximum sensor sampling rate\n\tN uint16\n\t// Number of sample frames emitted per packet\n\tM uint16\n\t// Bitwise selector of data sources to stream\n\tMask uint32\n\t// Packet count 1-255 (or 0 for unlimited streaming)\n\tPcnt uint8\n\t// Bitwise selector of more data sources to stream (optional)\n\tMask2 uint32\n}\n\n// PowerStatePacket contains all data relevant to the power state of the sphero\ntype PowerStatePacket struct {\n\t// record Version Code\n\tRecVer uint8\n\t// High-Level State of the Battery; 1=charging, 2=battery ok, 3=battery low, 4=battery critical\n\tPowerState uint8\n\t// Battery Voltage, scaled in 100th of a Volt, 0x02EF would be 7.51 volts\n\tBattVoltage uint16\n\t// Number of charges in the total lifetime of the sphero\n\tNumCharges uint16\n\t// Seconds awake since last charge\n\tTimeSinceChg uint16\n}\n\n// CollisionPacket represents the response from a Collision event\ntype CollisionPacket struct {\n\t// Normalized impact components (direction of the collision event):\n\tX, Y, Z int16\n\t// Thresholds exceeded by X (1h) and/or Y (2h) axis (bitmask):\n\tAxis byte\n\t// Power that cross threshold Xt + Xs:\n\tXMagnitude, YMagnitude int16\n\t// Sphero's speed when impact detected:\n\tSpeed uint8\n\t// Millisecond timer\n\tTimestamp uint32\n}\n\n// DataStreamingPacket represents the response from a Data Streaming event\ntype DataStreamingPacket struct {\n\t// 8000 0000h\taccelerometer axis X, raw\t-2048 to 2047\t4mG\n\tRawAccX int16\n\t// 4000 0000h\taccelerometer axis Y, raw\t-2048 to 2047\t4mG\n\tRawAccY int16\n\t// 2000 0000h\taccelerometer axis Z, raw\t-2048 to 2047\t4mG\n\tRawAccZ int16\n\t// 1000 0000h\tgyro axis X, raw\t-32768 to 32767\t0.068 degrees\n\tRawGyroX int16\n\t// 0800 0000h\tgyro axis Y, raw\t-32768 to 32767\t0.068 degrees\n\tRawGyroY int16\n\t// 0400 0000h\tgyro axis Z, raw\t-32768 to 32767\t0.068 degrees\n\tRawGyroZ int16\n\t// 0200 0000h\tReserved\n\tRsrv1 int16\n\t// 0100 0000h\tReserved\n\tRsrv2 int16\n\t// 0080 0000h\tReserved\n\tRsrv3 int16\n\t// 0040 0000h\tright motor back EMF, raw\t-32768 to 32767\t22.5 cm\n\tRawRMotorBack int16\n\t// 0020 0000h\tleft motor back EMF, raw\t-32768 to 32767\t22.5 cm\n\tRawLMotorBack int16\n\t// 0010 0000h\tleft motor, PWM, raw\t-2048 to 2047\tduty cycle\n\tRawLMotor int16\n\t// 0008 0000h\tright motor, PWM raw\t-2048 to 2047\tduty cycle\n\tRawRMotor int16\n\t// 0004 0000h\tIMU pitch angle, filtered\t-179 to 180\tdegrees\n\tFiltPitch int16\n\t// 0002 0000h\tIMU roll angle, filtered\t-179 to 180\tdegrees\n\tFiltRoll int16\n\t// 0001 0000h\tIMU yaw angle, filtered\t-179 to 180\tdegrees\n\tFiltYaw int16\n\t// 0000 8000h\taccelerometer axis X, filtered\t-32768 to 32767\t1/4096 G\n\tFiltAccX int16\n\t// 0000 4000h\taccelerometer axis Y, filtered\t-32768 to 32767\t1/4096 G\n\tFiltAccY int16\n\t// 0000 2000h\taccelerometer axis Z, filtered\t-32768 to 32767\t1/4096 G\n\tFiltAccZ int16\n\t// 0000 1000h\tgyro axis X, filtered\t-20000 to 20000\t0.1 dps\n\tFiltGyroX int16\n\t// 0000 0800h\tgyro axis Y, filtered\t-20000 to 20000\t0.1 dps\n\tFiltGyroY int16\n\t// 0000 0400h\tgyro axis Z, filtered\t-20000 to 20000\t0.1 dps\n\tFiltGyroZ int16\n\t// 0000 0200h\tReserved\n\tRsrv4 int16\n\t// 0000 0100h\tReserved\n\tRsrv5 int16\n\t// 0000 0080h\tReserved\n\tRsrv6 int16\n\t// 0000 0040h\tright motor back EMF, filtered\t-32768 to 32767\t22.5 cm\n\tFiltRMotorBack int16\n\t// 0000 0020h\tleft motor back EMF, filtered\t-32768 to 32767\t22.5 cm\n\tFiltLMotorBack int16\n\t// 0000 0010h\tReserved 1\n\tRsrv7 int16\n\t// 0000 0008h\tReserved 2\n\tRsrv8 int16\n\t// 0000 0004h\tReserved 3\n\tRsrv9 int16\n\t// 0000 0002h\tReserved 4\n\tRsrv10 int16\n\t// 0000 0001h\tReserved 5\n\tRsrv11 int16\n\t// 8000 0000h\tQuaternion Q0\t-10000 to 10000\t1/10000 Q\n\tQuat0 int16\n\t// 4000 0000h\tQuaternion Q1\t-10000 to 10000\t1/10000 Q\n\tQuat1 int16\n\t// 2000 0000h\tQuaternion Q2\t-10000 to 10000\t1/10000 Q\n\tQuat2 int16\n\t// 1000 0000h\tQuaternion Q3\t-10000 to 10000\t1/10000 Q\n\tQuat3 int16\n\t// 0800 0000h\tOdometer X\t-32768 to 32767\tcm\n\tOdomX int16\n\t// 0400 0000h\tOdometer Y\t-32768 to 32767\tcm\n\tOdomY int16\n\t// 0200 0000h\tAccelOne\t0 to 8000\t1 mG\n\tAccelOne int16\n\t// 0100 0000h\tVelocity X\t-32768 to 32767\tmm/s\n\tVeloX int16\n\t// 0080 0000h\tVelocity Y\t-32768 to 32767\tmm/s\n\tVeloY int16\n}\n"
  },
  {
    "path": "drivers/common/spherocommon/spherocommon_test.go",
    "content": "package spherocommon\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestCalculateChecksum(t *testing.T) {\n\ttests := []struct {\n\t\tdata     []byte\n\t\tchecksum byte\n\t}{\n\t\t{[]byte{0x00}, 0xff},\n\t\t{[]byte{0xf0, 0x0f}, 0x00},\n\t}\n\n\tfor _, tt := range tests {\n\t\tactual := CalculateChecksum(tt.data)\n\t\tif actual != tt.checksum {\n\t\t\trequire.Fail(t, fmt.Sprintf(\"Expected %x, got %x for data %x.\", tt.checksum, actual, tt.data))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/gpio/README.md",
    "content": "# GPIO\n\nThis package provides drivers for [General Purpose Input/Output (GPIO)](https://en.wikipedia.org/wiki/General_Purpose_Input/Output)\ndevices. It is normally used by connecting an adaptor such as [Raspberry Pi](https://gobot.io/documentation/platforms/raspi/)\nthat supports the needed interfaces for GPIO devices.\n\n## Getting Started\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices. The following GPIO devices are currently supported:\n\n- AIP1640 LED Dot Matrix/7 Segment Controller\n- Button\n- Buzzer\n- Direct Pin\n- EasyDriver\n- Grove Button (by using driver for Button)\n- Grove Buzzer (by using driver for Buzzer)\n- Grove LED (by using driver for LED)\n- Grove Magnetic Switch (by using driver for Button)\n- Grove Relay (by using driver for Relay)\n- Grove Touch Sensor (by using driver for Button)\n- HC-SR04 Ultrasonic Ranging Module\n- HD44780 LCD controller\n- LED\n- Makey Button (by using driver for Button)\n- MAX7219 LED Dot Matrix\n- Motor\n- Proximity Infra Red (PIR) Motion Sensor\n- Relay\n- RGB LED\n- Servo\n- Stepper Motor\n- TM1638 LED Controller\n"
  },
  {
    "path": "drivers/gpio/aip1640_driver.go",
    "content": "package gpio\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Commands of the driver\nconst (\n\tAIP1640DataCmd  = 0x40\n\tAIP1640DispCtrl = 0x88\n\tAIP1640AddrCmd  = 0xC0\n\n\tAIP1640FixedAddr = 0x04\n)\n\n// AIP1640Driver is the gobot driver for the AIP1640 LED driver used in the WEMOS D1 mini Matrix LED Shield.\n// It has some similarities with the TM16xx LED drivers\n//\n// Datasheet CN: https://datasheet.lcsc.com/szlcsc/AiP1640_C82650.pdf\n//\n// Library ported from: https://github.com/wemos/WEMOS_Matrix_LED_Shield_Arduino_Library\ntype AIP1640Driver struct {\n\t*driver\n\n\tpinClock  *DirectPinDriver\n\tpinData   *DirectPinDriver\n\tintensity byte\n\tbuffer    [8]byte\n}\n\n// NewAIP1640Driver return a new driver for AIP1640 LED driver given a gobot.Connection and the clock,\n// data and strobe pins.\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc NewAIP1640Driver(a gobot.Connection, clockPin string, dataPin string, opts ...interface{}) *AIP1640Driver {\n\td := &AIP1640Driver{\n\t\tdriver:    newDriver(a, \"AIP1640\", opts...),\n\t\tpinClock:  NewDirectPinDriver(a, clockPin),\n\t\tpinData:   NewDirectPinDriver(a, dataPin),\n\t\tintensity: 7,\n\t}\n\td.afterStart = d.initialize\n\n\t/* TODO : Add commands */\n\n\treturn d\n}\n\n// SetIntensity changes the intensity (from 1 to 7) of the display\nfunc (d *AIP1640Driver) SetIntensity(level byte) {\n\tif level >= 7 {\n\t\tlevel = 7\n\t}\n\td.intensity = level\n}\n\n// Display sends the buffer to the display (ie. turns on/off the corresponding LEDs)\nfunc (d *AIP1640Driver) Display() error {\n\tfor i := 0; i < 8; i++ {\n\t\tif err := d.sendData(byte(i), d.buffer[i]); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := d.pinData.Off(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := d.pinClock.Off(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(1 * time.Millisecond)\n\t\tif err := d.pinClock.On(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := d.pinData.On(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn d.sendCommand(AIP1640DispCtrl | d.intensity)\n}\n\n// Clear empties the buffer (turns off all the LEDs)\nfunc (d *AIP1640Driver) Clear() {\n\tfor i := 0; i < 8; i++ {\n\t\td.buffer[i] = 0x00\n\t}\n}\n\n// DrawPixel turns on or off a specific in the buffer\nfunc (d *AIP1640Driver) DrawPixel(x, y byte, enabled bool) {\n\tif x >= 8 || y >= 8 {\n\t\treturn\n\t}\n\ty = 7 - y\n\tif enabled {\n\t\td.buffer[y] |= 1 << x\n\t} else {\n\t\td.buffer[y] &^= 1 << x\n\t}\n}\n\n// DrawRow sets any given row of LEDs in the buffer\nfunc (d *AIP1640Driver) DrawRow(row, data byte) {\n\tif row >= 8 {\n\t\treturn\n\t}\n\td.buffer[7-row] = data\n}\n\n// DrawMatrix sets the whole buffer\nfunc (d *AIP1640Driver) DrawMatrix(data [8]byte) {\n\tfor i := 0; i < 8; i++ {\n\t\td.buffer[7-i] = data[i]\n\t}\n}\n\n// initialize initializes the tm1638, it uses a SPI-like communication protocol\nfunc (d *AIP1640Driver) initialize() error {\n\tif err := d.pinData.On(); err != nil {\n\t\treturn err\n\t}\n\treturn d.pinClock.On()\n}\n\n// sendCommand is an auxiliary function to send commands to the AIP1640Driver module\nfunc (d *AIP1640Driver) sendCommand(cmd byte) error {\n\tif err := d.pinData.Off(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.send(cmd); err != nil {\n\t\treturn err\n\t}\n\treturn d.pinData.On()\n}\n\n// sendData is an auxiliary function to send data to the AIP1640Driver module\nfunc (d *AIP1640Driver) sendData(address byte, data byte) error {\n\tif err := d.sendCommand(AIP1640DataCmd | AIP1640FixedAddr); err != nil {\n\t\treturn err\n\t}\n\tif err := d.pinData.Off(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.send(AIP1640AddrCmd | address); err != nil {\n\t\treturn err\n\t}\n\tif err := d.send(data); err != nil {\n\t\treturn err\n\t}\n\treturn d.pinData.On()\n}\n\n// send writes data on the module\nfunc (d *AIP1640Driver) send(data byte) error {\n\tfor i := 0; i < 8; i++ {\n\t\tif err := d.pinClock.Off(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif (data & 1) > 0 {\n\t\t\tif err := d.pinData.On(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif err := d.pinData.Off(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdata >>= 1\n\n\t\tif err := d.pinClock.On(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/gpio/aip1640_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*AIP1640Driver)(nil)\n\nfunc initTestAIP1640Driver() *AIP1640Driver {\n\td, _ := initTestAIP1640DriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initTestAIP1640DriverWithStubbedAdaptor() (*AIP1640Driver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\treturn NewAIP1640Driver(a, \"1\", \"2\"), a\n}\n\nfunc TestNewAIP1640Driver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewAIP1640Driver(a, \"1\", \"2\")\n\t// assert\n\tassert.IsType(t, &AIP1640Driver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"AIP1640\"))\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.NotNil(t, d.pinClock)\n\tassert.NotNil(t, d.pinData)\n\tassert.Equal(t, uint8(7), d.intensity)\n}\n\nfunc TestNewAIP1640Driver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"count up\"\n\t\tcycReadDur = 30 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewAIP1640Driver(newGpioTestAdaptor(), \"1\", \"2\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewAIP1640Driver(newGpioTestAdaptor(), \"1\", \"2\", WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestAIP1640Start(t *testing.T) {\n\td := initTestAIP1640Driver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestAIP1640DrawPixel(t *testing.T) {\n\td := initTestAIP1640Driver()\n\td.DrawPixel(2, 3, true)\n\td.DrawPixel(0, 3, true)\n\tassert.Equal(t, uint8(5), d.buffer[7-3])\n}\n\nfunc TestAIP1640DrawRow(t *testing.T) {\n\td := initTestAIP1640Driver()\n\td.DrawRow(4, 0x3C)\n\tassert.Equal(t, uint8(0x3C), d.buffer[7-4])\n}\n\nfunc TestAIP1640DrawMatrix(t *testing.T) {\n\td := initTestAIP1640Driver()\n\tdrawing := [8]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}\n\td.DrawMatrix(drawing)\n\tassert.Equal(t, [8]byte{0xEF, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01}, d.buffer)\n}\n\nfunc TestAIP1640Clear(t *testing.T) {\n\td := initTestAIP1640Driver()\n\tdrawing := [8]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}\n\td.DrawMatrix(drawing)\n\tassert.Equal(t, [8]byte{0xEF, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01}, d.buffer)\n\td.Clear()\n\tassert.Equal(t, [8]byte{}, d.buffer)\n}\n\nfunc TestAIP1640SetIntensity(t *testing.T) {\n\td := initTestAIP1640Driver()\n\td.SetIntensity(3)\n\tassert.Equal(t, uint8(3), d.intensity)\n}\n\nfunc TestAIP1640SetIntensityHigherThan7(t *testing.T) {\n\td := initTestAIP1640Driver()\n\td.SetIntensity(19)\n\tassert.Equal(t, uint8(7), d.intensity)\n}\n"
  },
  {
    "path": "drivers/gpio/button_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// buttonOptionApplier needs to be implemented by each configurable option type\ntype buttonOptionApplier interface {\n\tapply(cfg *buttonConfiguration)\n}\n\n// buttonConfiguration contains all changeable attributes of the driver.\ntype buttonConfiguration struct {\n\treadInterval time.Duration\n\tdefaultState int\n}\n\n// buttonReadIntervalOption is the type for applying another read interval to the configuration\ntype buttonReadIntervalOption time.Duration\n\n// buttonDefaultStateOption is the type for applying another default state to the configuration\ntype buttonDefaultStateOption int\n\n// ButtonDriver Represents a digital Button\ntype ButtonDriver struct {\n\t*driver\n\tgobot.Eventer\n\n\tbuttonCfg *buttonConfiguration\n\tactive    bool\n\thalt      chan struct{}\n}\n\n// NewButtonDriver returns a driver for a button with a polling interval for changed state of 10 milliseconds,\n// given a DigitalReader and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithButtonPollInterval\"\nfunc NewButtonDriver(a DigitalReader, pin string, opts ...interface{}) *ButtonDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &ButtonDriver{\n\t\tdriver:    newDriver(a.(gobot.Connection), \"Button\", withPin(pin)),\n\t\tbuttonCfg: &buttonConfiguration{readInterval: 10 * time.Millisecond, defaultState: 0},\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase buttonOptionApplier:\n\t\t\to.apply(d.buttonCfg)\n\t\tcase time.Duration:\n\t\t\t// TODO this is only for backward compatibility and will be removed after version 2.x\n\t\t\td.buttonCfg.readInterval = o\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// WithButtonPollInterval change the asynchronous cyclic reading interval from default 10ms to the given value.\nfunc WithButtonPollInterval(interval time.Duration) buttonOptionApplier {\n\treturn buttonReadIntervalOption(interval)\n}\n\n// WithButtonDefaultState change the default state from default 0 to the given value.\nfunc WithButtonDefaultState(s int) buttonOptionApplier {\n\treturn buttonDefaultStateOption(s)\n}\n\n// Active gets the current state\nfunc (d *ButtonDriver) Active() bool {\n\t// ensure that read and write can not interfere\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.active\n}\n\n// SetDefaultState for the next start.\n// Deprecated: Please use option [gpio.WithButtonDefaultState] instead.\nfunc (d *ButtonDriver) SetDefaultState(s int) {\n\t// ensure that read and write can not interfere\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tWithButtonDefaultState(s).apply(d.buttonCfg)\n}\n\n// initialize the ButtonDriver and polls the state of the button at the given interval.\n//\n// Emits the Events:\n//\n//\tPush int - On button push\n//\tRelease int - On button release\n//\tError error - On button error\nfunc (d *ButtonDriver) initialize() error {\n\tif d.buttonCfg.readInterval == 0 {\n\t\treturn fmt.Errorf(\"the read interval for button needs to be greater than zero\")\n\t}\n\n\td.Eventer = gobot.NewEventer()\n\td.AddEvent(ButtonPush)\n\td.AddEvent(ButtonRelease)\n\td.AddEvent(Error)\n\n\td.halt = make(chan struct{})\n\n\tstate := d.buttonCfg.defaultState\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-time.After(d.buttonCfg.readInterval):\n\t\t\t\tnewValue, err := d.digitalRead(d.driverCfg.pin)\n\t\t\t\tif err != nil {\n\t\t\t\t\td.Publish(Error, err)\n\t\t\t\t} else if newValue != state && newValue != -1 {\n\t\t\t\t\tstate = newValue\n\t\t\t\t\td.update(newValue)\n\t\t\t\t}\n\t\t\tcase <-d.halt:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\treturn nil\n}\n\nfunc (d *ButtonDriver) shutdown() error {\n\tif d.buttonCfg.readInterval == 0 || d.halt == nil {\n\t\t// cyclic reading deactivated\n\t\treturn nil\n\t}\n\n\tclose(d.halt) // broadcast halt, also to the test\n\treturn nil\n}\n\nfunc (d *ButtonDriver) update(newValue int) {\n\t// ensure that read and write can not interfere\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif newValue != d.buttonCfg.defaultState {\n\t\td.active = true\n\t\td.Publish(ButtonPush, newValue)\n\t} else {\n\t\td.active = false\n\t\td.Publish(ButtonRelease, newValue)\n\t}\n}\n\nfunc (o buttonReadIntervalOption) String() string {\n\treturn \"read interval option for buttons\"\n}\n\nfunc (o buttonDefaultStateOption) String() string {\n\treturn \"default state option for buttons\"\n}\n\nfunc (o buttonReadIntervalOption) apply(cfg *buttonConfiguration) {\n\tcfg.readInterval = time.Duration(o)\n}\n\nfunc (o buttonDefaultStateOption) apply(cfg *buttonConfiguration) {\n\tcfg.defaultState = int(o)\n}\n"
  },
  {
    "path": "drivers/gpio/button_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*ButtonDriver)(nil)\n\nconst buttonTestDelay = 250\n\nfunc initTestButtonDriverWithStubbedAdaptor() (*ButtonDriver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\td := NewButtonDriver(a, \"1\")\n\treturn d, a\n}\n\nfunc TestNewButtonDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewButtonDriver(a, \"1\")\n\t// assert\n\tassert.IsType(t, &ButtonDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"Button\"))\n\tassert.Equal(t, \"1\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.False(t, d.active)\n\tassert.Nil(t, d.Eventer) // will be created on initialize\n\tassert.Nil(t, d.halt)    // will be created on initialize\n\trequire.NotNil(t, d.buttonCfg)\n\tassert.Equal(t, 0, d.buttonCfg.defaultState)\n\tassert.Equal(t, 10*time.Millisecond, d.buttonCfg.readInterval)\n}\n\nfunc TestNewButtonDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"count up\"\n\t\tcycReadDur = 30 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewButtonDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"), aio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewButtonDriver(newGpioTestAdaptor(), \"1\", WithName(myName), WithButtonPollInterval(cycReadDur))\n\t// assert\n\tassert.Equal(t, cycReadDur, d.buttonCfg.readInterval)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestButton_WithButtonDefaultState(t *testing.T) {\n\t// arrange\n\tconst myDefaultState = 5 // only for test, usually it would be 0 or 1\n\tcfg := buttonConfiguration{}\n\t// act\n\tWithButtonDefaultState(myDefaultState).apply(&cfg)\n\t// assert\n\tassert.Equal(t, myDefaultState, cfg.defaultState)\n}\n\nfunc TestButtonStart(t *testing.T) {\n\t// arrange\n\tsem := make(chan bool)\n\tnextVal := make(chan int, 1)\n\td, a := initTestButtonDriverWithStubbedAdaptor()\n\n\ta.digitalReadFunc = func(string) (int, error) {\n\t\tval := 1\n\t\tvar err error\n\t\tselect {\n\t\tcase val = <-nextVal:\n\t\t\tif val < 0 {\n\t\t\t\terr = fmt.Errorf(\"digital read error\")\n\t\t\t}\n\t\t\treturn val, err\n\t\tdefault:\n\t\t\treturn val, err\n\t\t}\n\t}\n\n\t// act: start cyclic reading\n\terr := d.Start()\n\n\t_ = d.Once(ButtonPush, func(data interface{}) {\n\t\tassert.True(t, d.Active())\n\t\tnextVal <- 0\n\t\tsem <- true\n\t})\n\n\t// assert & rearrange\n\trequire.NoError(t, err)\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(buttonTestDelay * time.Millisecond):\n\t\tassert.Fail(t, \"Button Event \\\"Push\\\" was not published\")\n\t}\n\n\t_ = d.Once(ButtonRelease, func(data interface{}) {\n\t\tassert.False(t, d.Active())\n\t\tnextVal <- -1\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(buttonTestDelay * time.Millisecond):\n\t\tassert.Fail(t, \"Button Event \\\"Release\\\" was not published\")\n\t}\n\n\t_ = d.Once(Error, func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(buttonTestDelay * time.Millisecond):\n\t\tassert.Fail(t, \"Button Event \\\"Error\\\" was not published\")\n\t}\n\n\t_ = d.Once(ButtonPush, func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\trequire.NoError(t, d.Halt())\n\tnextVal <- 1\n\n\tselect {\n\tcase <-sem:\n\t\tassert.Fail(t, \"Button Event \\\"Press\\\" should not published\")\n\tcase <-time.After(buttonTestDelay * time.Millisecond):\n\t}\n}\n\nfunc TestButtonStart_WithDefaultState(t *testing.T) {\n\t// arrange\n\tsem := make(chan bool)\n\tnextVal := make(chan int, 1)\n\ta := newGpioTestAdaptor()\n\td := NewButtonDriver(a, \"1\", WithButtonDefaultState(1))\n\n\ta.digitalReadFunc = func(string) (int, error) {\n\t\tval := 0\n\t\tselect {\n\t\tcase val = <-nextVal:\n\t\t\treturn val, nil\n\t\tdefault:\n\t\t\treturn val, nil\n\t\t}\n\t}\n\n\t// act: start cyclic reading\n\trequire.NoError(t, d.Start())\n\t_ = d.Once(ButtonPush, func(data interface{}) {\n\t\tassert.True(t, d.Active())\n\t\tnextVal <- 1\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(buttonTestDelay * time.Millisecond):\n\t\tassert.Fail(t, \"Button Event \\\"Push\\\" was not published\")\n\t}\n\n\t_ = d.Once(ButtonRelease, func(data interface{}) {\n\t\tassert.False(t, d.Active())\n\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(buttonTestDelay * time.Millisecond):\n\t\tassert.Fail(t, \"Button Event \\\"Release\\\" was not published\")\n\t}\n}\n\nfunc TestButtonHalt(t *testing.T) {\n\t// arrange\n\td, _ := initTestButtonDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.Start())\n\ttimeout := 2 * d.buttonCfg.readInterval\n\twg := sync.WaitGroup{}\n\twg.Add(1)\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tselect {\n\t\tcase <-d.halt: // wait until halt is broadcasted by close the channel\n\t\tcase <-time.After(timeout): // otherwise run into the timeout\n\t\t\tassert.Fail(t, fmt.Sprintf(\"halt was not received within %s\", timeout))\n\t\t}\n\t}()\n\t// act & assert\n\trequire.NoError(t, d.Halt())\n\twg.Wait() // wait until the go function was really finished\n}\n\nfunc TestButtonActive(t *testing.T) {\n\ttests := map[string]struct {\n\t\twant bool\n\t}{\n\t\t\"active_true\":  {want: true},\n\t\t\"active_false\": {want: false},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := ButtonDriver{driver: newDriver(nil, \"Button\")} // just for mutex\n\t\t\td.active = tc.want\n\t\t\t// act & assert\n\t\t\tassert.Equal(t, tc.want, d.Active())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/buzzer_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Some useful divider\nconst (\n\tWhole   = 4\n\tHalf    = 2\n\tQuarter = 1\n\tEighth  = 0.500\n)\n\n// Some items of the musical scale\nconst (\n\tRest = 0\n\tC0   = 16.35\n\tDb0  = 17.32\n\tD0   = 18.35\n\tEb0  = 19.45\n\tE0   = 20.60\n\tF0   = 21.83\n\tGb0  = 23.12\n\tG0   = 24.50\n\tAb0  = 25.96\n\tA0   = 27.50\n\tBb0  = 29.14\n\tB0   = 30.87\n\tC1   = 32.70\n\tDb1  = 34.65\n\tD1   = 36.71\n\tEb1  = 38.89\n\tE1   = 41.20\n\tF1   = 43.65\n\tGb1  = 46.25\n\tG1   = 49.00\n\tAb1  = 51.91\n\tA1   = 55.00\n\tBb1  = 58.27\n\tB1   = 61.74\n\tC2   = 65.41\n\tDb2  = 69.30\n\tD2   = 73.42\n\tEb2  = 77.78\n\tE2   = 82.41\n\tF2   = 87.31\n\tGb2  = 92.50\n\tG2   = 98.00\n\tAb2  = 103.83\n\tA2   = 110.00\n\tBb2  = 116.54\n\tB2   = 123.47\n\tC3   = 130.81\n\tDb3  = 138.59\n\tD3   = 146.83\n\tEb3  = 155.56\n\tE3   = 164.81\n\tF3   = 174.61\n\tGb3  = 185.00\n\tG3   = 196.00\n\tAb3  = 207.65\n\tA3   = 220.00\n\tBb3  = 233.08\n\tB3   = 246.94\n\tC4   = 261.63\n\tDb4  = 277.18\n\tD4   = 293.66\n\tEb4  = 311.13\n\tE4   = 329.63\n\tF4   = 349.23\n\tGb4  = 369.99\n\tG4   = 392.00\n\tAb4  = 415.30\n\tA4   = 440.00\n\tBb4  = 466.16\n\tB4   = 493.88\n\tC5   = 523.25\n\tDb5  = 554.37\n\tD5   = 587.33\n\tEb5  = 622.25\n\tE5   = 659.25\n\tF5   = 698.46\n\tGb5  = 739.99\n\tG5   = 783.99\n\tAb5  = 830.61\n\tA5   = 880.00\n\tBb5  = 932.33\n\tB5   = 987.77\n\tC6   = 1046.50\n\tDb6  = 1108.73\n\tD6   = 1174.66\n\tEb6  = 1244.51\n\tE6   = 1318.51\n\tF6   = 1396.91\n\tGb6  = 1479.98\n\tG6   = 1567.98\n\tAb6  = 1661.22\n\tA6   = 1760.00\n\tBb6  = 1864.66\n\tB6   = 1975.53\n\tC7   = 2093.00\n\tDb7  = 2217.46\n\tD7   = 2349.32\n\tEb7  = 2489.02\n\tE7   = 2637.02\n\tF7   = 2793.83\n\tGb7  = 2959.96\n\tG7   = 3135.96\n\tAb7  = 3322.44\n\tA7   = 3520.00\n\tBb7  = 3729.31\n\tB7   = 3951.07\n\tC8   = 4186.01\n\tDb8  = 4434.92\n\tD8   = 4698.63\n\tEb8  = 4978.03\n\tE8   = 5274.04\n\tF8   = 5587.65\n\tGb8  = 5919.91\n\tG8   = 6271.93\n\tAb8  = 6644.88\n\tA8   = 7040.00\n\tBb8  = 7458.62\n\tB8   = 7902.13\n)\n\n// BuzzerDriver represents a digital buzzer\ntype BuzzerDriver struct {\n\t*driver\n\n\thigh bool\n\tbpm  float64\n}\n\n// NewBuzzerDriver return a new BuzzerDriver given a DigitalWriter and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc NewBuzzerDriver(a DigitalWriter, pin string, opts ...interface{}) *BuzzerDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &BuzzerDriver{\n\t\tdriver: newDriver(a.(gobot.Connection), \"Buzzer\", withPin(pin)),\n\t\tbpm:    96.0,\n\t}\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// SetBPM change the bpm value.\nfunc (d *BuzzerDriver) SetBPM(val float64) {\n\td.bpm = val\n}\n\n// BPM gets the current bpm value.\nfunc (d *BuzzerDriver) BPM() float64 {\n\treturn d.bpm\n}\n\n// State return true if the buzzer is on and false if the buzzer is off\nfunc (d *BuzzerDriver) State() bool {\n\treturn d.high\n}\n\n// On sets the buzzer to a high state.\nfunc (d *BuzzerDriver) On() error {\n\tif err := d.digitalWrite(d.driverCfg.pin, 1); err != nil {\n\t\treturn err\n\t}\n\td.high = true\n\treturn nil\n}\n\n// Off sets the buzzer to a low state.\nfunc (d *BuzzerDriver) Off() error {\n\tif err := d.digitalWrite(d.driverCfg.pin, 0); err != nil {\n\t\treturn err\n\t}\n\td.high = false\n\treturn nil\n}\n\n// Toggle sets the buzzer to the opposite of it's current state\nfunc (d *BuzzerDriver) Toggle() error {\n\tif d.State() {\n\t\treturn d.Off()\n\t}\n\treturn d.On()\n}\n\n// Tone is to make a sound with the given frequency\nfunc (d *BuzzerDriver) Tone(hz, duration float64) error {\n\t// calculation based off https://www.arduino.cc/en/Tutorial/Melody\n\ttone := (1.0 / (2.0 * hz)) * 1000000.0\n\n\ttempo := ((60 / d.bpm) * (duration * 1000))\n\n\tfor i := 0.0; i < tempo*1000; i += tone * 2.0 {\n\t\tif err := d.On(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(time.Duration(tone) * time.Microsecond)\n\n\t\tif err := d.Off(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(time.Duration(tone) * time.Microsecond)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/gpio/buzzer_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*BuzzerDriver)(nil)\n\nfunc initTestBuzzerDriver(conn DigitalWriter) *BuzzerDriver {\n\treturn NewBuzzerDriver(conn, \"1\")\n}\n\nfunc TestNewBuzzerDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewBuzzerDriver(a, \"10\")\n\t// assert\n\tassert.IsType(t, &BuzzerDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"Buzzer\"))\n\tassert.Equal(t, \"10\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.False(t, d.high)\n\tassert.InDelta(t, 96, d.bpm, 0.0)\n}\n\nfunc TestNewBuzzerDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"song player\"\n\t)\n\tpanicFunc := func() {\n\t\tNewBuzzerDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewBuzzerDriver(newGpioTestAdaptor(), \"1\", WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestBuzzerToggle(t *testing.T) {\n\td := initTestBuzzerDriver(newGpioTestAdaptor())\n\trequire.NoError(t, d.Off())\n\trequire.NoError(t, d.Toggle())\n\tassert.True(t, d.State())\n\trequire.NoError(t, d.Toggle())\n\tassert.False(t, d.State())\n}\n\nfunc TestBuzzerTone(t *testing.T) {\n\td := initTestBuzzerDriver(newGpioTestAdaptor())\n\trequire.NoError(t, d.Tone(100, 0.01))\n}\n\nfunc TestBuzzerOnError(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := initTestBuzzerDriver(a)\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\n\trequire.EqualError(t, d.On(), \"write error\")\n}\n\nfunc TestBuzzerOffError(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := initTestBuzzerDriver(a)\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\n\trequire.EqualError(t, d.Off(), \"write error\")\n}\n\nfunc TestBuzzerToneError(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := initTestBuzzerDriver(a)\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\n\trequire.EqualError(t, d.Tone(100, 0.01), \"write error\")\n}\n"
  },
  {
    "path": "drivers/gpio/direct_pin_driver.go",
    "content": "package gpio\n\nimport (\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// DirectPinDriver represents a GPIO pin\ntype DirectPinDriver struct {\n\t*driver\n}\n\n// NewDirectPinDriver return a new DirectPinDriver given a Connection and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\n// Adds the following API Commands:\n//\n//\t\"DigitalRead\" - See DirectPinDriver.DigitalRead\n//\t\"DigitalWrite\" - See DirectPinDriver.DigitalWrite\n//\t\"PwmWrite\" - See DirectPinDriver.PwmWrite\n//\t\"ServoWrite\" - See DirectPinDriver.ServoWrite\nfunc NewDirectPinDriver(a gobot.Connection, pin string, opts ...interface{}) *DirectPinDriver {\n\td := &DirectPinDriver{\n\t\tdriver: newDriver(a, \"DirectPin\", append(opts, withPin(pin))...),\n\t}\n\n\td.AddCommand(\"DigitalRead\", func(_ map[string]interface{}) interface{} {\n\t\tval, err := d.DigitalRead()\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"DigitalWrite\", func(params map[string]interface{}) interface{} {\n\t\tlevel, _ := strconv.Atoi(params[\"level\"].(string))\n\t\treturn d.DigitalWrite(byte(level))\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"PwmWrite\", func(params map[string]interface{}) interface{} {\n\t\tlevel, _ := strconv.Atoi(params[\"level\"].(string))\n\t\treturn d.PwmWrite(byte(level))\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ServoWrite\", func(params map[string]interface{}) interface{} {\n\t\tlevel, _ := strconv.Atoi(params[\"level\"].(string))\n\t\treturn d.ServoWrite(byte(level))\n\t})\n\n\treturn d\n}\n\n// Off turn off pin\nfunc (d *DirectPinDriver) Off() error {\n\treturn d.digitalWrite(d.driverCfg.pin, byte(0))\n}\n\n// On turn on pin\nfunc (d *DirectPinDriver) On() error {\n\treturn d.digitalWrite(d.driverCfg.pin, byte(1))\n}\n\n// DigitalRead returns the current digital state of the pin\nfunc (d *DirectPinDriver) DigitalRead() (int, error) {\n\treturn d.digitalRead(d.driverCfg.pin)\n}\n\n// DigitalWrite writes to the pin. Acceptable values are 1 or 0\nfunc (d *DirectPinDriver) DigitalWrite(level byte) error {\n\treturn d.digitalWrite(d.driverCfg.pin, level)\n}\n\n// PwmWrite writes the 0-254 value to the specified pin\nfunc (d *DirectPinDriver) PwmWrite(level byte) error {\n\treturn d.pwmWrite(d.driverCfg.pin, level)\n}\n\n// ServoWrite writes value to the specified pin\nfunc (d *DirectPinDriver) ServoWrite(level byte) error {\n\treturn d.servoWrite(d.driverCfg.pin, level)\n}\n"
  },
  {
    "path": "drivers/gpio/direct_pin_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage gpio\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*DirectPinDriver)(nil)\n\nfunc initTestDirectPinDriver() *DirectPinDriver {\n\ta := newGpioTestAdaptor()\n\ta.digitalReadFunc = func(string) (int, error) {\n\t\treturn 1, nil\n\t}\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\ta.servoWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\treturn NewDirectPinDriver(a, \"1\")\n}\n\nfunc TestNewDirectPinDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewDirectPinDriver(a, \"10\")\n\t// assert\n\tassert.IsType(t, &DirectPinDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"DirectPin\"))\n\tassert.Equal(t, \"10\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n}\n\nfunc TestNewDirectPinDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"count up\"\n\t)\n\tpanicFunc := func() {\n\t\tNewDirectPinDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewDirectPinDriver(newGpioTestAdaptor(), \"1\", WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestDirectPin_Commands(t *testing.T) {\n\tvar ret map[string]interface{}\n\tvar err interface{}\n\n\td := initTestDirectPinDriver()\n\tret = d.Command(\"DigitalRead\")(nil).(map[string]interface{})\n\n\tassert.Equal(t, 1, ret[\"val\"].(int))\n\tassert.Nil(t, ret[\"err\"])\n\n\terr = d.Command(\"DigitalWrite\")(map[string]interface{}{\"level\": \"1\"})\n\trequire.EqualError(t, err.(error), \"write error\")\n\n\terr = d.Command(\"PwmWrite\")(map[string]interface{}{\"level\": \"1\"})\n\trequire.EqualError(t, err.(error), \"write error\")\n\n\terr = d.Command(\"ServoWrite\")(map[string]interface{}{\"level\": \"1\"})\n\trequire.EqualError(t, err.(error), \"write error\")\n}\n\nfunc TestDirectPinOff(t *testing.T) {\n\td := initTestDirectPinDriver()\n\trequire.Error(t, d.Off())\n\n\ta := newGpioTestAdaptor()\n\td = NewDirectPinDriver(a, \"1\")\n\trequire.NoError(t, d.Off())\n}\n\nfunc TestDirectPinOffNotSupported(t *testing.T) {\n\ta := &gpioTestBareAdaptor{}\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.EqualError(t, d.Off(), \"DigitalWrite is not supported by this platform\")\n}\n\nfunc TestDirectPinOn(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.NoError(t, d.On())\n}\n\nfunc TestDirectPinOnError(t *testing.T) {\n\td := initTestDirectPinDriver()\n\trequire.Error(t, d.On())\n}\n\nfunc TestDirectPinOnNotSupported(t *testing.T) {\n\ta := &gpioTestBareAdaptor{}\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.EqualError(t, d.On(), \"DigitalWrite is not supported by this platform\")\n}\n\nfunc TestDirectPinDigitalWrite(t *testing.T) {\n\tadaptor := newGpioTestAdaptor()\n\td := NewDirectPinDriver(adaptor, \"1\")\n\trequire.NoError(t, d.DigitalWrite(1))\n}\n\nfunc TestDirectPinDigitalWriteNotSupported(t *testing.T) {\n\ta := &gpioTestBareAdaptor{}\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.EqualError(t, d.DigitalWrite(1), \"DigitalWrite is not supported by this platform\")\n}\n\nfunc TestDirectPinDigitalWriteError(t *testing.T) {\n\td := initTestDirectPinDriver()\n\trequire.Error(t, d.DigitalWrite(1))\n}\n\nfunc TestDirectPinDigitalRead(t *testing.T) {\n\td := initTestDirectPinDriver()\n\tret, err := d.DigitalRead()\n\tassert.Equal(t, 1, ret)\n\trequire.NoError(t, err)\n}\n\nfunc TestDirectPinDigitalReadNotSupported(t *testing.T) {\n\ta := &gpioTestBareAdaptor{}\n\td := NewDirectPinDriver(a, \"1\")\n\t_, e := d.DigitalRead()\n\trequire.EqualError(t, e, \"DigitalRead is not supported by this platform\")\n}\n\nfunc TestDirectPinPwmWrite(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.NoError(t, d.PwmWrite(1))\n}\n\nfunc TestDirectPinPwmWriteNotSupported(t *testing.T) {\n\ta := &gpioTestBareAdaptor{}\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.EqualError(t, d.PwmWrite(1), \"PwmWrite is not supported by this platform\")\n}\n\nfunc TestDirectPinPwmWriteError(t *testing.T) {\n\td := initTestDirectPinDriver()\n\trequire.Error(t, d.PwmWrite(1))\n}\n\nfunc TestDirectPinServoWrite(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.NoError(t, d.ServoWrite(1))\n}\n\nfunc TestDirectPinServoWriteNotSupported(t *testing.T) {\n\ta := &gpioTestBareAdaptor{}\n\td := NewDirectPinDriver(a, \"1\")\n\trequire.EqualError(t, d.ServoWrite(1), \"ServoWrite is not supported by this platform\")\n}\n\nfunc TestDirectPinServoWriteError(t *testing.T) {\n\td := initTestDirectPinDriver()\n\trequire.Error(t, d.ServoWrite(1))\n}\n"
  },
  {
    "path": "drivers/gpio/doc.go",
    "content": "/*\nPackage gpio provides Gobot drivers for General Purpose Input/Output devices.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFor further information refer to gpio README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/gpio/README.md\n*/\npackage gpio // import \"gobot.io/x/gobot/v2/drivers/gpio\"\n"
  },
  {
    "path": "drivers/gpio/easy_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst easyDriverDebug = false\n\n// easyOptionApplier needs to be implemented by each configurable option type\ntype easyOptionApplier interface {\n\tapply(cfg *easyConfiguration)\n}\n\n// easyConfiguration contains all changeable attributes of the driver.\ntype easyConfiguration struct {\n\tdirPin   string\n\tenPin    string\n\tsleepPin string\n}\n\n// easyDirPinOption is the type for applying a pin for change direction\ntype easyDirPinOption string\n\n// easyEnPinOption is the type for applying a pin for device disabling/enabling\ntype easyEnPinOption string\n\n// easySleepPinOption is the type for applying a pin for setting device to sleep/wake\ntype easySleepPinOption string\n\n// EasyDriver is an driver for stepper hardware board from SparkFun (https://www.sparkfun.com/products/12779)\n// This should also work for the BigEasyDriver (untested). It is basically a wrapper for the common StepperDriver{}\n// with the specific additions for the board, e.g. direction, enable and sleep outputs.\ntype EasyDriver struct {\n\t*StepperDriver\n\n\teasyCfg      *easyConfiguration\n\tstepPin      string\n\tanglePerStep float32\n\tsleeping     bool\n}\n\n// NewEasyDriver returns a new driver\n// TODO: Support selecting phase input instead of hard-wiring MS1 and MS2 to board truth table\n// A - DigitalWriter\n// anglePerStep - Step angle of motor\n// stepPin - Pin corresponding to step input on EasyDriver\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithEasyDirectionPin\"\n//\t\"WithEasyEnablePin\"\n//\t\"WithEasySleepPin\"\nfunc NewEasyDriver(a DigitalWriter, anglePerStep float32, stepPin string, opts ...interface{}) *EasyDriver {\n\tif anglePerStep <= 0 {\n\t\tpanic(\"angle per step needs to be greater than zero\")\n\t}\n\n\tif stepPin == \"\" {\n\t\tpanic(\"step pin is mandatory for easy driver\")\n\t}\n\n\tstepper := NewStepperDriver(a, [4]string{}, nil, 1)\n\tstepper.driverCfg.name = gobot.DefaultName(\"EasyDriver\")\n\tstepper.stepperDebug = easyDriverDebug\n\tstepper.haltIfRunning = false\n\tstepper.stepsPerRev = 360.0 / anglePerStep\n\td := &EasyDriver{\n\t\tStepperDriver: stepper,\n\t\teasyCfg:       &easyConfiguration{},\n\t\tstepPin:       stepPin,\n\t\tanglePerStep:  anglePerStep,\n\t}\n\td.stepFunc = d.onePinStepping\n\td.sleepFunc = d.sleepWithSleepPin\n\td.beforeHalt = d.shutdown\n\n\t// 1/4 of max speed. Not too fast, not too slow\n\td.speedRpm = d.MaxSpeed() / 4\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase easyOptionApplier:\n\t\t\to.apply(d.easyCfg)\n\t\tdefault:\n\t\t\toNames := []string{\"WithEasyDirectionPin\", \"WithEasyEnablePin\", \"WithEasySleepPin\"}\n\t\t\tmsg := fmt.Sprintf(\"'%s' can not be applied on '%s', consider to use one of the options instead: %s\",\n\t\t\t\topt, d.driverCfg.name, strings.Join(oNames, \", \"))\n\t\t\tpanic(msg)\n\t\t}\n\t}\n\n\treturn d\n}\n\n// WithEasyDirectionPin configure a pin for change the moving direction.\nfunc WithEasyDirectionPin(pin string) easyOptionApplier {\n\treturn easyDirPinOption(pin)\n}\n\n// WithEasyEnablePin configure a pin for disabling/enabling the driver.\nfunc WithEasyEnablePin(pin string) easyOptionApplier {\n\treturn easyEnPinOption(pin)\n}\n\n// WithEasySleepPin configure a pin for sleep/wake the driver.\nfunc WithEasySleepPin(pin string) easyOptionApplier {\n\treturn easySleepPinOption(pin)\n}\n\n// SetDirection sets the direction to be moving.\nfunc (d *EasyDriver) SetDirection(direction string) error {\n\tif d.easyCfg.dirPin == \"\" {\n\t\treturn fmt.Errorf(\"dirPin is not set for '%s'\", d.driverCfg.name)\n\t}\n\n\tdirection = strings.ToLower(direction)\n\tif direction != StepperDriverForward && direction != StepperDriverBackward {\n\t\treturn fmt.Errorf(\"invalid direction '%s'. Value should be '%s' or '%s'\",\n\t\t\tdirection, StepperDriverForward, StepperDriverBackward)\n\t}\n\n\twriteVal := byte(0) // low is forward\n\tif direction == StepperDriverBackward {\n\t\twriteVal = 1 // high is backward\n\t}\n\n\tif err := d.digitalWrite(d.easyCfg.dirPin, writeVal); err != nil {\n\t\treturn err\n\t}\n\n\t// ensure that write of variable can not interfere with read in step()\n\td.valueMutex.Lock()\n\tdefer d.valueMutex.Unlock()\n\td.direction = direction\n\n\treturn nil\n}\n\n// Enable enables all motor output\nfunc (d *EasyDriver) Enable() error {\n\tif d.easyCfg.enPin == \"\" {\n\t\td.disabled = false\n\t\treturn fmt.Errorf(\"enPin is not set - board '%s' is enabled by default\", d.driverCfg.name)\n\t}\n\n\t// enPin is active low\n\tif err := d.digitalWrite(d.easyCfg.enPin, 0); err != nil {\n\t\treturn err\n\t}\n\n\td.disabled = false\n\treturn nil\n}\n\n// Disable disables all motor output\nfunc (d *EasyDriver) Disable() error {\n\tif d.easyCfg.enPin == \"\" {\n\t\treturn fmt.Errorf(\"enPin is not set for '%s'\", d.driverCfg.name)\n\t}\n\n\t_ = d.stopIfRunning() // drop step errors\n\n\t// enPin is active low\n\tif err := d.digitalWrite(d.easyCfg.enPin, 1); err != nil {\n\t\treturn err\n\t}\n\td.disabled = true\n\n\treturn nil\n}\n\n// IsEnabled returns a bool stating whether motor is enabled\nfunc (d *EasyDriver) IsEnabled() bool {\n\treturn !d.disabled\n}\n\n// Wake wakes up the driver\nfunc (d *EasyDriver) Wake() error {\n\tif d.easyCfg.sleepPin == \"\" {\n\t\treturn fmt.Errorf(\"sleepPin is not set for '%s'\", d.driverCfg.name)\n\t}\n\n\t// sleepPin is active low\n\tif err := d.digitalWrite(d.easyCfg.sleepPin, 1); err != nil {\n\t\treturn err\n\t}\n\n\td.sleeping = false\n\n\t// we need to wait 1ms after sleeping before doing a step to charge the step pump (according to data sheet)\n\ttime.Sleep(1 * time.Millisecond)\n\n\treturn nil\n}\n\n// IsSleeping returns a bool stating whether motor is sleeping\nfunc (d *EasyDriver) IsSleeping() bool {\n\treturn d.sleeping\n}\n\nfunc (d *EasyDriver) onePinStepping() error {\n\t// ensure that read and write of variables (direction, stepNum) can not interfere\n\td.valueMutex.Lock()\n\tdefer d.valueMutex.Unlock()\n\n\t// a valid steps occurs for a low to high transition\n\tif err := d.digitalWrite(d.stepPin, 0); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(d.getDelayPerStep())\n\tif err := d.digitalWrite(d.stepPin, 1); err != nil {\n\t\treturn err\n\t}\n\n\tif d.direction == StepperDriverForward {\n\t\td.stepNum++\n\t} else {\n\t\td.stepNum--\n\t}\n\n\treturn nil\n}\n\n// sleepWithSleepPin puts the driver to sleep and disables all motor output.  Low power mode.\nfunc (d *EasyDriver) sleepWithSleepPin() error {\n\tif d.easyCfg.sleepPin == \"\" {\n\t\treturn fmt.Errorf(\"sleepPin is not set for '%s'\", d.driverCfg.name)\n\t}\n\n\t_ = d.stopIfRunning() // drop step errors\n\n\t// sleepPin is active low\n\tif err := d.digitalWrite(d.easyCfg.sleepPin, 0); err != nil {\n\t\treturn err\n\t}\n\td.sleeping = true\n\n\treturn nil\n}\n\nfunc (o easyDirPinOption) String() string {\n\treturn \"direction pin option easy driver\"\n}\n\nfunc (o easyEnPinOption) String() string {\n\treturn \"enable pin option easy driver\"\n}\n\nfunc (o easySleepPinOption) String() string {\n\treturn \"sleep pin option easy driver\"\n}\n\nfunc (o easyDirPinOption) apply(cfg *easyConfiguration) {\n\tcfg.dirPin = string(o)\n}\n\nfunc (o easyEnPinOption) apply(cfg *easyConfiguration) {\n\tcfg.enPin = string(o)\n}\n\nfunc (o easySleepPinOption) apply(cfg *easyConfiguration) {\n\tcfg.sleepPin = string(o)\n}\n"
  },
  {
    "path": "drivers/gpio/easy_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nfunc initTestEasyDriverWithStubbedAdaptor() (*EasyDriver, *gpioTestAdaptor) {\n\tconst anglePerStep = 0.5 // use non int step angle to check int math\n\n\ta := newGpioTestAdaptor()\n\td := NewEasyDriver(a, anglePerStep, \"1\")\n\treturn d, a\n}\n\nfunc TestNewEasyDriver(t *testing.T) {\n\t// arrange\n\tconst anglePerStep = 0.5 // use non int step angle to check int math\n\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewEasyDriver(a, anglePerStep, \"1\")\n\t// assert\n\tassert.IsType(t, &EasyDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"EasyDriver\"))\n\tassert.Equal(t, a, d.connection)\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.Equal(t, \"1\", d.stepPin)\n\tassert.InDelta(t, float32(anglePerStep), d.anglePerStep, 0.0)\n\tassert.Equal(t, uint(14), d.speedRpm)\n\tassert.Equal(t, \"forward\", d.direction)\n\tassert.Equal(t, 0, d.stepNum)\n\tassert.False(t, d.disabled)\n\tassert.False(t, d.sleeping)\n\tassert.Nil(t, d.stopAsynchRunFunc)\n\trequire.NotNil(t, d.easyCfg)\n\tassert.Empty(t, d.easyCfg.dirPin)\n\tassert.Empty(t, d.easyCfg.enPin)\n\tassert.Empty(t, d.easyCfg.sleepPin)\n}\n\nfunc TestNewEasyDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"front wheel\"\n\t\tdirPin = \"2\"\n\t)\n\tpanicFunc := func() {\n\t\tNewEasyDriver(newGpioTestAdaptor(), 0.1, \"1\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewEasyDriver(newGpioTestAdaptor(), 0.2, \"1\", WithName(myName), WithEasyDirectionPin(dirPin))\n\t// assert\n\tassert.Equal(t, dirPin, d.easyCfg.dirPin)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy', \"+\n\t\t\"consider to use one of the options instead: WithEasyDirectionPin, WithEasyEnablePin, WithEasySleepPin\", panicFunc)\n}\n\nfunc TestEasy_WithEasyEnablePin(t *testing.T) {\n\t// arrange\n\tconst myEnablePin = \"3\"\n\tcfg := easyConfiguration{}\n\t// act\n\tWithEasyEnablePin(myEnablePin).apply(&cfg)\n\t// assert\n\tassert.Equal(t, myEnablePin, cfg.enPin)\n}\n\nfunc TestEasy_WithEasySleepPin(t *testing.T) {\n\t// arrange\n\tconst mySleepPin = \"4\"\n\tcfg := easyConfiguration{}\n\t// act\n\tWithEasySleepPin(mySleepPin).apply(&cfg)\n\t// assert\n\tassert.Equal(t, mySleepPin, cfg.sleepPin)\n}\n\nfunc TestEasyMoveDeg_IsMoving(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinputDeg               int\n\t\tsimulateDisabled       bool\n\t\tsimulateAlreadyRunning bool\n\t\tsimulateWriteErr       bool\n\t\twantWrites             int\n\t\twantSteps              int\n\t\twantMoving             bool\n\t\twantErr                string\n\t}{\n\t\t\"move_one\": {\n\t\t\tinputDeg:   1,\n\t\t\twantWrites: 4,\n\t\t\twantSteps:  2,\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"move_more\": {\n\t\t\tinputDeg:   20,\n\t\t\twantWrites: 80,\n\t\t\twantSteps:  40,\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"error_disabled\": {\n\t\t\tsimulateDisabled: true,\n\t\t\twantMoving:       false,\n\t\t\twantErr:          \"is disabled\",\n\t\t},\n\t\t\"error_already_running\": {\n\t\t\tsimulateAlreadyRunning: true,\n\t\t\twantMoving:             true,\n\t\t\twantErr:                \"already running or moving\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tinputDeg:         1,\n\t\t\tsimulateWriteErr: true,\n\t\t\twantWrites:       0,\n\t\t\twantMoving:       false,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestEasyDriverWithStubbedAdaptor()\n\t\t\tdefer func() {\n\t\t\t\t// for cleanup dangling channels\n\t\t\t\tif d.stopAsynchRunFunc != nil {\n\t\t\t\t\terr := d.stopAsynchRunFunc(true)\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t}\n\t\t\t}()\n\t\t\t// arrange: different behavior\n\t\t\td.disabled = tc.simulateDisabled\n\t\t\tif tc.simulateAlreadyRunning {\n\t\t\t\td.stopAsynchRunFunc = func(bool) error { return nil }\n\t\t\t}\n\t\t\t// arrange: writes\n\t\t\ta.written = nil // reset writes of Start()\n\t\t\ta.simulateWriteError = tc.simulateWriteErr\n\t\t\t// act\n\t\t\terr := d.MoveDeg(tc.inputDeg)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantSteps, d.stepNum)\n\t\t\tassert.Len(t, a.written, tc.wantWrites)\n\t\t\tassert.Equal(t, tc.wantMoving, d.IsMoving())\n\t\t})\n\t}\n}\n\nfunc TestEasyRun_IsMoving(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimulateDisabled       bool\n\t\tsimulateAlreadyRunning bool\n\t\tsimulateWriteErr       bool\n\t\twantMoving             bool\n\t\twantErr                string\n\t}{\n\t\t\"run\": {\n\t\t\twantMoving: true,\n\t\t},\n\t\t\"error_disabled\": {\n\t\t\tsimulateDisabled: true,\n\t\t\twantMoving:       false,\n\t\t\twantErr:          \"is disabled\",\n\t\t},\n\t\t\"write_error_skipped\": {\n\t\t\tsimulateWriteErr: true,\n\t\t\twantMoving:       true,\n\t\t},\n\t\t\"error_already_running\": {\n\t\t\tsimulateAlreadyRunning: true,\n\t\t\twantMoving:             true,\n\t\t\twantErr:                \"already running or moving\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestEasyDriverWithStubbedAdaptor()\n\t\t\td.skipStepErrors = true\n\t\t\td.disabled = tc.simulateDisabled\n\t\t\tif tc.simulateAlreadyRunning {\n\t\t\t\td.stopAsynchRunFunc = func(bool) error { return nil }\n\t\t\t}\n\t\t\tsimWriteErr := tc.simulateWriteErr // to prevent data race in write function (go-called)\n\t\t\ta.digitalWriteFunc = func(string, byte) error {\n\t\t\t\tif simWriteErr {\n\t\t\t\t\tsimWriteErr = false // to prevent to much output\n\t\t\t\t\treturn fmt.Errorf(\"write error\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.Run()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantMoving, d.IsMoving())\n\t\t})\n\t}\n}\n\nfunc TestEasyStop_IsMoving(t *testing.T) {\n\t// arrange\n\td, _ := initTestEasyDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.Run())\n\trequire.True(t, d.IsMoving())\n\t// act\n\terr := d.Stop()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.False(t, d.IsMoving())\n}\n\nfunc TestEasyDriverHalt_IsMoving(t *testing.T) {\n\t// arrange\n\td, _ := initTestEasyDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.Run())\n\trequire.True(t, d.IsMoving())\n\t// act\n\terr := d.Halt()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.False(t, d.IsMoving())\n}\n\nfunc TestEasySetDirection(t *testing.T) {\n\tconst anglePerStep = 0.5 // use non int step angle to check int math\n\n\ttests := map[string]struct {\n\t\tinput            string\n\t\tdirPin           string\n\t\tsimulateWriteErr bool\n\t\twantVal          string\n\t\twantWritten      byte\n\t\twantErr          string\n\t}{\n\t\t\"forward\": {\n\t\t\tinput:       \"forward\",\n\t\t\tdirPin:      \"10\",\n\t\t\twantWritten: 0,\n\t\t\twantVal:     \"forward\",\n\t\t},\n\t\t\"backward\": {\n\t\t\tinput:       \"backward\",\n\t\t\tdirPin:      \"11\",\n\t\t\twantWritten: 1,\n\t\t\twantVal:     \"backward\",\n\t\t},\n\t\t\"unknown\": {\n\t\t\tinput:       \"unknown\",\n\t\t\tdirPin:      \"12\",\n\t\t\twantWritten: 0xFF,\n\t\t\twantVal:     \"forward\",\n\t\t\twantErr:     \"invalid direction 'unknown'\",\n\t\t},\n\t\t\"error_no_pin\": {\n\t\t\tinput:       \"forward\",\n\t\t\tdirPin:      \"\",\n\t\t\twantWritten: 0xFF,\n\t\t\twantVal:     \"forward\",\n\t\t\twantErr:     \"dirPin is not set\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tinput:            \"backward\",\n\t\t\tdirPin:           \"13\",\n\t\t\tsimulateWriteErr: true,\n\t\t\twantWritten:      0xFF,\n\t\t\twantVal:          \"forward\",\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newGpioTestAdaptor()\n\t\t\td := NewEasyDriver(a, anglePerStep, \"1\", WithEasyDirectionPin(tc.dirPin))\n\t\t\ta.written = nil // reset writes of Start()\n\t\t\ta.simulateWriteError = tc.simulateWriteErr\n\t\t\trequire.Equal(t, \"forward\", d.direction)\n\t\t\t// act\n\t\t\terr := d.SetDirection(tc.input)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, tc.dirPin, a.written[0].pin)\n\t\t\t\tassert.Equal(t, tc.wantWritten, a.written[0].val)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantVal, d.direction)\n\t\t})\n\t}\n}\n\nfunc TestEasyMaxSpeed(t *testing.T) {\n\tconst delayForMaxSpeed = 1428 * time.Microsecond // 1/700Hz\n\n\ttests := map[string]struct {\n\t\tanglePerStep float32\n\t\twant         uint\n\t}{\n\t\t\"maxspeed_for_20spr\": {\n\t\t\tanglePerStep: 360.0 / 20.0,\n\t\t\twant:         2100,\n\t\t},\n\t\t\"maxspeed_for_36spr\": {\n\t\t\tanglePerStep: 360.0 / 36.0,\n\t\t\twant:         1166,\n\t\t},\n\t\t\"maxspeed_for_50spr\": {\n\t\t\tanglePerStep: 360.0 / 50.0,\n\t\t\twant:         840,\n\t\t},\n\t\t\"maxspeed_for_100spr\": {\n\t\t\tanglePerStep: 360.0 / 100.0,\n\t\t\twant:         420,\n\t\t},\n\t\t\"maxspeed_for_400spr\": {\n\t\t\tanglePerStep: 360.0 / 400.0,\n\t\t\twant:         105,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, _ := initTestEasyDriverWithStubbedAdaptor()\n\t\t\td.anglePerStep = tc.anglePerStep\n\t\t\td.stepsPerRev = 360.0 / tc.anglePerStep\n\t\t\t// act\n\t\t\tgot := d.MaxSpeed()\n\t\t\td.speedRpm = got\n\t\t\tgot2 := d.getDelayPerStep()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, delayForMaxSpeed.Microseconds()/10, got2.Microseconds()/10)\n\t\t})\n\t}\n}\n\nfunc TestEasySetSpeed(t *testing.T) {\n\tconst (\n\t\tanglePerStep = 10\n\t\tmaxRpm       = 1166\n\t)\n\n\ttests := map[string]struct {\n\t\tinput   uint\n\t\twant    uint\n\t\twantErr string\n\t}{\n\t\t\"below_minimum\": {\n\t\t\tinput:   0,\n\t\t\twant:    0,\n\t\t\twantErr: \"RPM (0) cannot be a zero or negative value\",\n\t\t},\n\t\t\"minimum\": {\n\t\t\tinput: 1,\n\t\t\twant:  1,\n\t\t},\n\t\t\"maximum\": {\n\t\t\tinput: maxRpm,\n\t\t\twant:  maxRpm,\n\t\t},\n\t\t\"above_maximum\": {\n\t\t\tinput:   maxRpm + 1,\n\t\t\twant:    maxRpm,\n\t\t\twantErr: \"cannot be greater then maximal value 1166\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, _ := initTestEasyDriverWithStubbedAdaptor()\n\t\t\td.speedRpm = 0\n\t\t\td.anglePerStep = anglePerStep\n\t\t\td.stepsPerRev = 360.0 / anglePerStep\n\t\t\t// act\n\t\t\terr := d.SetSpeed(tc.input)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.want, d.speedRpm)\n\t\t})\n\t}\n}\n\nfunc TestEasy_onePinStepping(t *testing.T) {\n\ttests := map[string]struct {\n\t\tcountCallsForth  int\n\t\tcountCallsBack   int\n\t\tsimulateWriteErr bool\n\t\twantSteps        int\n\t\twantWritten      []gpioTestWritten\n\t\twantErr          string\n\t}{\n\t\t\"single\": {\n\t\t\tcountCallsForth: 1,\n\t\t\twantSteps:       1,\n\t\t\twantWritten: []gpioTestWritten{\n\t\t\t\t{pin: \"1\", val: 0x00},\n\t\t\t\t{pin: \"1\", val: 0x01},\n\t\t\t},\n\t\t},\n\t\t\"many\": {\n\t\t\tcountCallsForth: 4,\n\t\t\twantSteps:       4,\n\t\t\twantWritten: []gpioTestWritten{\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t},\n\t\t},\n\t\t\"forth_and_back\": {\n\t\t\tcountCallsForth: 5,\n\t\t\tcountCallsBack:  3,\n\t\t\twantSteps:       2,\n\t\t\twantWritten: []gpioTestWritten{\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t},\n\t\t},\n\t\t\"reverse\": {\n\t\t\tcountCallsBack: 3,\n\t\t\twantSteps:      -3,\n\t\t\twantWritten: []gpioTestWritten{\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t\t{pin: \"1\", val: 0x0},\n\t\t\t\t{pin: \"1\", val: 0x1},\n\t\t\t},\n\t\t},\n\t\t\"error_write\": {\n\t\t\tsimulateWriteErr: true,\n\t\t\tcountCallsBack:   2,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestEasyDriverWithStubbedAdaptor()\n\t\t\ta.written = nil // reset writes of Start()\n\t\t\ta.simulateWriteError = tc.simulateWriteErr\n\t\t\tvar errs []string\n\t\t\t// act\n\t\t\tfor i := 0; i < tc.countCallsForth; i++ {\n\t\t\t\tif err := d.onePinStepping(); err != nil {\n\t\t\t\t\terrs = append(errs, err.Error())\n\t\t\t\t}\n\t\t\t}\n\t\t\td.direction = \"backward\"\n\t\t\tfor i := 0; i < tc.countCallsBack; i++ {\n\t\t\t\tif err := d.onePinStepping(); err != nil {\n\t\t\t\t\terrs = append(errs, err.Error())\n\t\t\t\t}\n\t\t\t}\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\tassert.Contains(t, strings.Join(errs, \",\"), tc.wantErr)\n\t\t\t} else {\n\t\t\t\tassert.Nil(t, errs)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantSteps, d.stepNum)\n\t\t\tassert.Equal(t, tc.wantSteps, d.CurrentStep())\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestEasyEnable_IsEnabled(t *testing.T) {\n\tconst anglePerStep = 0.5 // use non int step angle to check int math\n\n\ttests := map[string]struct {\n\t\tenPin            string\n\t\tsimulateWriteErr bool\n\t\twantWrites       int\n\t\twantEnabled      bool\n\t\twantErr          string\n\t}{\n\t\t\"basic\": {\n\t\t\tenPin:       \"10\",\n\t\t\twantWrites:  1,\n\t\t\twantEnabled: true,\n\t\t},\n\t\t\"with_run\": {\n\t\t\tenPin:       \"11\",\n\t\t\twantWrites:  1,\n\t\t\twantEnabled: true,\n\t\t},\n\t\t\"error_no_pin\": {\n\t\t\tenPin:       \"\",\n\t\t\twantWrites:  0,\n\t\t\twantEnabled: true, // is enabled by default\n\t\t\twantErr:     \"enPin is not set\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tenPin:            \"12\",\n\t\t\tsimulateWriteErr: true,\n\t\t\twantWrites:       0,\n\t\t\twantEnabled:      false,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newGpioTestAdaptor()\n\t\t\td := NewEasyDriver(a, anglePerStep, \"1\", WithEasyEnablePin(tc.enPin))\n\t\t\ta.written = nil // reset writes of Start()\n\t\t\ta.simulateWriteError = tc.simulateWriteErr\n\t\t\td.disabled = true\n\t\t\trequire.False(t, d.IsEnabled())\n\t\t\t// act\n\t\t\terr := d.Enable()\n\t\t\t// assert\n\t\t\tassert.Len(t, a.written, tc.wantWrites)\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, tc.enPin, a.written[0].pin)\n\t\t\t\tassert.Equal(t, byte(0), a.written[0].val) // enable pin is active low\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantEnabled, d.IsEnabled())\n\t\t})\n\t}\n}\n\nfunc TestEasyDisable_IsEnabled(t *testing.T) {\n\tconst anglePerStep = 0.5 // use non int step angle to check int math\n\n\ttests := map[string]struct {\n\t\tenPin            string\n\t\trunBefore        bool\n\t\tsimulateWriteErr bool\n\t\twantWrites       int\n\t\twantEnabled      bool\n\t\twantErr          string\n\t}{\n\t\t\"basic\": {\n\t\t\tenPin:       \"10\",\n\t\t\twantWrites:  1,\n\t\t\twantEnabled: false,\n\t\t},\n\t\t\"with_run\": {\n\t\t\tenPin:       \"10\",\n\t\t\trunBefore:   true,\n\t\t\twantWrites:  1,\n\t\t\twantEnabled: false,\n\t\t},\n\t\t\"error_no_pin\": {\n\t\t\tenPin:       \"\",\n\t\t\twantWrites:  0,\n\t\t\twantEnabled: true, // is enabled by default\n\t\t\twantErr:     \"enPin is not set\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tenPin:            \"12\",\n\t\t\tsimulateWriteErr: true,\n\t\t\twantWrites:       1,\n\t\t\twantEnabled:      true,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newGpioTestAdaptor()\n\t\t\td := NewEasyDriver(a, anglePerStep, \"1\", WithEasyEnablePin(tc.enPin))\n\t\t\tvar numCallsWrite int\n\t\t\tvar writtenPin string\n\t\t\twrittenValue := byte(0xFF)\n\t\t\ta.digitalWriteFunc = func(pin string, val byte) error {\n\t\t\t\tif pin == d.stepPin {\n\t\t\t\t\t// we do not consider call of step()\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tnumCallsWrite++\n\t\t\t\twrittenPin = pin\n\t\t\t\twrittenValue = val\n\t\t\t\tif tc.simulateWriteErr {\n\t\t\t\t\treturn fmt.Errorf(\"write error\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif tc.runBefore {\n\t\t\t\trequire.NoError(t, d.Run())\n\t\t\t\trequire.True(t, d.IsMoving())\n\t\t\t\ttime.Sleep(time.Millisecond)\n\t\t\t}\n\t\t\td.disabled = false\n\t\t\trequire.True(t, d.IsEnabled())\n\t\t\t// act\n\t\t\terr := d.Disable()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, byte(1), writtenValue) // enable pin is active low\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantEnabled, d.IsEnabled())\n\t\t\tassert.False(t, d.IsMoving())\n\t\t\tassert.Equal(t, tc.wantWrites, numCallsWrite)\n\t\t\tassert.Equal(t, tc.enPin, writtenPin)\n\t\t})\n\t}\n}\n\nfunc TestEasySleep_IsSleeping(t *testing.T) {\n\tconst anglePerStep = 0.5 // use non int step angle to check int math\n\n\ttests := map[string]struct {\n\t\tsleepPin         string\n\t\trunBefore        bool\n\t\tsimulateWriteErr bool\n\t\twantWrites       int\n\t\twantSleep        bool\n\t\twantErr          string\n\t}{\n\t\t\"basic\": {\n\t\t\tsleepPin:   \"10\",\n\t\t\twantWrites: 1,\n\t\t\twantSleep:  true,\n\t\t},\n\t\t\"with_run\": {\n\t\t\tsleepPin:   \"11\",\n\t\t\trunBefore:  true,\n\t\t\twantWrites: 1,\n\t\t\twantSleep:  true,\n\t\t},\n\t\t\"error_no_pin\": {\n\t\t\tsleepPin:   \"\",\n\t\t\twantSleep:  false,\n\t\t\twantWrites: 0,\n\t\t\twantErr:    \"sleepPin is not set\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tsleepPin:         \"12\",\n\t\t\tsimulateWriteErr: true,\n\t\t\twantWrites:       1,\n\t\t\twantSleep:        false,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newGpioTestAdaptor()\n\t\t\td := NewEasyDriver(a, anglePerStep, \"1\", WithEasySleepPin(tc.sleepPin))\n\t\t\td.sleeping = false\n\t\t\trequire.False(t, d.IsSleeping())\n\t\t\t// arrange: writes\n\t\t\tvar numCallsWrite int\n\t\t\tvar writtenPin string\n\t\t\twrittenValue := byte(0xFF)\n\t\t\ta.digitalWriteFunc = func(pin string, val byte) error {\n\t\t\t\tif pin == d.stepPin {\n\t\t\t\t\t// we do not consider call of step()\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tnumCallsWrite++\n\t\t\t\twrittenPin = pin\n\t\t\t\twrittenValue = val\n\t\t\t\tif tc.simulateWriteErr {\n\t\t\t\t\treturn fmt.Errorf(\"write error\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif tc.runBefore {\n\t\t\t\trequire.NoError(t, d.Run())\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.Sleep()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, byte(0), writtenValue) // sleep pin is active low\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantSleep, d.IsSleeping())\n\t\t\tassert.Equal(t, tc.wantWrites, numCallsWrite)\n\t\t\tassert.Equal(t, tc.sleepPin, writtenPin)\n\t\t})\n\t}\n}\n\nfunc TestEasyWake_IsSleeping(t *testing.T) {\n\tconst anglePerStep = 0.5 // use non int step angle to check int math\n\n\ttests := map[string]struct {\n\t\tsleepPin         string\n\t\tsimulateWriteErr bool\n\t\twantWrites       int\n\t\twantSleep        bool\n\t\twantErr          string\n\t}{\n\t\t\"basic\": {\n\t\t\tsleepPin:   \"10\",\n\t\t\twantWrites: 1,\n\t\t\twantSleep:  false,\n\t\t},\n\t\t\"error_no_pin\": {\n\t\t\tsleepPin:   \"\",\n\t\t\twantWrites: 0,\n\t\t\twantSleep:  true,\n\t\t\twantErr:    \"sleepPin is not set\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tsleepPin:         \"12\",\n\t\t\tsimulateWriteErr: true,\n\t\t\twantWrites:       1,\n\t\t\twantSleep:        true,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newGpioTestAdaptor()\n\t\t\td := NewEasyDriver(a, anglePerStep, \"1\", WithEasySleepPin(tc.sleepPin))\n\t\t\td.sleeping = true\n\t\t\trequire.True(t, d.IsSleeping())\n\t\t\t// arrange: writes\n\t\t\tvar numCallsWrite int\n\t\t\tvar writtenPin string\n\t\t\twrittenValue := byte(0xFF)\n\t\t\ta.digitalWriteFunc = func(pin string, val byte) error {\n\t\t\t\tif pin == d.stepPin {\n\t\t\t\t\t// we do not consider call of step()\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tnumCallsWrite++\n\t\t\t\twrittenPin = pin\n\t\t\t\twrittenValue = val\n\t\t\t\tif tc.simulateWriteErr {\n\t\t\t\t\treturn fmt.Errorf(\"write error\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.Wake()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, byte(1), writtenValue) // sleep pin is active low\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantSleep, d.IsSleeping())\n\t\t\tassert.Equal(t, tc.wantWrites, numCallsWrite)\n\t\t\tassert.Equal(t, tc.sleepPin, writtenPin)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/gpio_driver.go",
    "content": "package gpio\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar (\n\t// ErrServoWriteUnsupported is the error resulting when a driver attempts to use\n\t// hardware capabilities which a connection does not support\n\tErrServoWriteUnsupported = errors.New(\"ServoWrite is not supported by this platform\")\n\t// ErrPwmWriteUnsupported is the error resulting when a driver attempts to use\n\t// hardware capabilities which a connection does not support\n\tErrPwmWriteUnsupported = errors.New(\"PwmWrite is not supported by this platform\")\n\t// ErrDigitalWriteUnsupported is the error resulting when a driver attempts to use\n\t// hardware capabilities which a connection does not support\n\tErrDigitalWriteUnsupported = errors.New(\"DigitalWrite is not supported by this platform\")\n\t// ErrDigitalReadUnsupported is the error resulting when a driver attempts to use\n\t// hardware capabilities which a connection does not support\n\tErrDigitalReadUnsupported = errors.New(\"DigitalRead is not supported by this platform\")\n)\n\nconst (\n\t// Error event\n\tError = \"error\"\n\t// ButtonRelease event\n\tButtonRelease = \"release\"\n\t// ButtonPush event\n\tButtonPush = \"push\"\n\t// MotionDetected event\n\tMotionDetected = \"motion-detected\"\n\t// MotionStopped event\n\tMotionStopped = \"motion-stopped\"\n)\n\n// PwmWriter interface represents an Adaptor which has Pwm capabilities\ntype PwmWriter interface {\n\tPwmWrite(pin string, val byte) error\n}\n\n// ServoWriter interface represents an Adaptor which has Servo capabilities\ntype ServoWriter interface {\n\tServoWrite(pin string, val byte) error\n}\n\n// DigitalWriter interface represents an Adaptor which has DigitalWrite capabilities\ntype DigitalWriter interface {\n\tDigitalWrite(pin string, val byte) error\n}\n\n// DigitalReader interface represents an Adaptor which has DigitalRead capabilities\ntype DigitalReader interface {\n\tDigitalRead(pin string) (val int, err error)\n}\n\n// optionApplier needs to be implemented by each configurable option type\ntype optionApplier interface {\n\tapply(cfg *configuration)\n}\n\n// configuration contains all changeable attributes of the driver.\ntype configuration struct {\n\tname string\n\tpin  string\n}\n\n// nameOption is the type for applying another name to the configuration\ntype nameOption string\n\n// pinOption is the type for applying a pin to the configuration\ntype pinOption string\n\n// Driver implements the interface gobot.Driver.\ntype driver struct {\n\tgobot.Commander\n\n\tdriverCfg  *configuration\n\tconnection gobot.Adaptor\n\tafterStart func() error\n\tbeforeHalt func() error\n\tmutex      *sync.Mutex // mutex often needed to ensure that write-read sequences are not interrupted\n}\n\n// newDriver creates a new generic and basic gpio gobot driver.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"withPin\"\nfunc newDriver(a gobot.Adaptor, name string, opts ...interface{}) *driver {\n\td := &driver{\n\t\tdriverCfg:  &configuration{name: gobot.DefaultName(name)},\n\t\tconnection: a,\n\t\tafterStart: func() error { return nil },\n\t\tbeforeHalt: func() error { return nil },\n\t\tCommander:  gobot.NewCommander(),\n\t\tmutex:      &sync.Mutex{},\n\t}\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// WithName is used to replace the default name of the driver.\nfunc WithName(name string) optionApplier {\n\treturn nameOption(name)\n}\n\n// withPin is used to add a pin to the driver. Only one pin can be linked.\n// This option is not available outside gpio package.\nfunc withPin(pin string) optionApplier {\n\treturn pinOption(pin)\n}\n\n// Name returns the name of the gpio device.\nfunc (d *driver) Name() string {\n\treturn d.driverCfg.name\n}\n\n// SetName sets the name of the gpio device.\n// Deprecated: Please use option [gpio.WithName] instead.\nfunc (d *driver) SetName(name string) {\n\tWithName(name).apply(d.driverCfg)\n}\n\n// Pin returns the pin associated with the driver.\nfunc (d *driver) Pin() string {\n\treturn d.driverCfg.pin\n}\n\n// Connection returns the gobot connection of the gpio device.\nfunc (d *driver) Connection() gobot.Connection {\n\tif d.connection == nil {\n\t\tlog.Printf(\"%s has no connection\\n\", d.driverCfg.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connection.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.driverCfg.name)\n\treturn nil\n}\n\n// Start initializes the gpio device.\nfunc (d *driver) Start() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do here for the driver\n\n\treturn d.afterStart()\n}\n\n// Halt halts the gpio device.\nfunc (d *driver) Halt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do after halt for the driver\n\n\treturn d.beforeHalt()\n}\n\n// digitalRead is a helper function with check that the connection implements DigitalReader\nfunc (d *driver) digitalRead(pin string) (int, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"%s has no connection\", d.driverCfg.name)\n\t}\n\n\tif reader, ok := d.connection.(DigitalReader); ok {\n\t\treturn reader.DigitalRead(pin)\n\t}\n\n\treturn 0, ErrDigitalReadUnsupported\n}\n\n// digitalWrite is a helper function with check that the connection implements DigitalWriter\nfunc (d *driver) digitalWrite(pin string, val byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"%s has no connection\", d.driverCfg.name)\n\t}\n\n\tif writer, ok := d.connection.(DigitalWriter); ok {\n\t\treturn writer.DigitalWrite(pin, val)\n\t}\n\n\treturn ErrDigitalWriteUnsupported\n}\n\n// pwmWrite is a helper function with check that the connection implements PwmWriter\nfunc (d *driver) pwmWrite(pin string, level byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"%s has no connection\", d.driverCfg.name)\n\t}\n\n\tif writer, ok := d.connection.(PwmWriter); ok {\n\t\treturn writer.PwmWrite(pin, level)\n\t}\n\n\treturn ErrPwmWriteUnsupported\n}\n\n// servoWrite is a helper function with check that the connection implements ServoWriter\nfunc (d *driver) servoWrite(pin string, level byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"%s has no connection\", d.driverCfg.name)\n\t}\n\n\tif writer, ok := d.connection.(ServoWriter); ok {\n\t\treturn writer.ServoWrite(pin, level)\n\t}\n\n\treturn ErrServoWriteUnsupported\n}\n\nfunc (o nameOption) String() string {\n\treturn \"name option for digital drivers\"\n}\n\nfunc (o pinOption) String() string {\n\treturn \"pin option for digital drivers\"\n}\n\n// apply change the name in the configuration.\nfunc (o nameOption) apply(c *configuration) {\n\tc.name = string(o)\n}\n\n// apply change the pins list of the configuration.\nfunc (o pinOption) apply(c *configuration) {\n\tc.pin = string(o)\n}\n"
  },
  {
    "path": "drivers/gpio/gpio_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*driver)(nil)\n\nfunc initTestDriverWithStubbedAdaptor() (*driver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\td := newDriver(a, \"GPIO_BASIC\")\n\treturn d, a\n}\n\nfunc initTestDriver() *driver {\n\td, _ := initTestDriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc TestNewDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := newDriver(a, \"GPIO_BASIC\")\n\t// assert\n\tassert.IsType(t, &driver{}, d)\n\tassert.Contains(t, d.driverCfg.name, \"GPIO_BASIC\")\n\tassert.Equal(t, a, d.connection)\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n}\n\nfunc Test_applyWithName(t *testing.T) {\n\t// arrange\n\tconst name = \"mybot\"\n\tcfg := configuration{name: \"oldname\"}\n\t// act\n\tWithName(name).apply(&cfg)\n\t// assert\n\tassert.Equal(t, name, cfg.name)\n}\n\nfunc Test_applywithPin(t *testing.T) {\n\t// arrange\n\tconst pin = \"36\"\n\tcfg := configuration{pin: \"oldpin\"}\n\t// act\n\twithPin(pin).apply(&cfg)\n\t// assert\n\tassert.Equal(t, pin, cfg.pin)\n}\n\nfunc TestConnection(t *testing.T) {\n\t// arrange\n\td, a := initTestDriverWithStubbedAdaptor()\n\t// act, assert\n\tassert.Equal(t, a, d.Connection())\n}\n\nfunc TestStart(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Start())\n\t// arrange after start function\n\td.afterStart = func() error { return fmt.Errorf(\"after start error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Start(), \"after start error\")\n}\n\nfunc TestHalt(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Halt())\n\t// arrange after start function\n\td.beforeHalt = func() error { return fmt.Errorf(\"before halt error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Halt(), \"before halt error\")\n}\n"
  },
  {
    "path": "drivers/gpio/grove_drivers.go",
    "content": "package gpio\n\n// GroveRelayDriver represents a Relay with a Grove connector\ntype GroveRelayDriver struct {\n\t*RelayDriver\n}\n\n// NewGroveRelayDriver return a new GroveRelayDriver given a DigitalWriter and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\n// Adds the following API Commands:\n//\n//\t\"Toggle\" - See RelayDriver.Toggle\n//\t\"On\" - See RelayDriver.On\n//\t\"Off\" - See RelayDriver.Off\n//\n// Deprecated: Please use [gpio.NewRelayDriver] instead. Development will be discontinued.\nfunc NewGroveRelayDriver(a DigitalWriter, pin string) *GroveRelayDriver {\n\treturn &GroveRelayDriver{\n\t\tRelayDriver: NewRelayDriver(a, pin),\n\t}\n}\n\n// GroveLedDriver represents an LED with a Grove connector\ntype GroveLedDriver struct {\n\t*LedDriver\n}\n\n// NewGroveLedDriver return a new driver for Grove Led given a DigitalWriter and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\n// Adds the following API Commands:\n//\n//\t\"Brightness\" - See LedDriver.Brightness\n//\t\"Toggle\" - See LedDriver.Toggle\n//\t\"On\" - See LedDriver.On\n//\t\"Off\" - See LedDriver.Off\n//\n// Deprecated: Please use [gpio.NewLedDriver] instead. Development will be discontinued.\nfunc NewGroveLedDriver(a DigitalWriter, pin string) *GroveLedDriver {\n\treturn &GroveLedDriver{\n\t\tLedDriver: NewLedDriver(a, pin),\n\t}\n}\n\n// GroveBuzzerDriver represents a buzzer with a Grove connector\ntype GroveBuzzerDriver struct {\n\t*BuzzerDriver\n}\n\n// NewGroveBuzzerDriver return a new driver for Grove buzzer given a DigitalWriter and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\n// Deprecated: Please use [gpio.NewBuzzerDriver] instead. Development will be discontinued.\nfunc NewGroveBuzzerDriver(a DigitalWriter, pin string, opts ...interface{}) *GroveBuzzerDriver {\n\treturn &GroveBuzzerDriver{\n\t\tBuzzerDriver: NewBuzzerDriver(a, pin, opts...),\n\t}\n}\n\n// GroveButtonDriver represents a button sensor with a Grove connector\ntype GroveButtonDriver struct {\n\t*ButtonDriver\n}\n\n// NewGroveButtonDriver returns a new driver for Grove button with a polling interval of 10 milliseconds given\n// a DigitalReader and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithButtonPollInterval\"\n//\n// Deprecated: Please use [gpio.NewButtonDriver] instead. Development will be discontinued.\nfunc NewGroveButtonDriver(a DigitalReader, pin string, opts ...interface{}) *GroveButtonDriver {\n\treturn &GroveButtonDriver{\n\t\tButtonDriver: NewButtonDriver(a, pin, opts...),\n\t}\n}\n\n// GroveTouchDriver represents a touch button sensor\n// with a Grove connector\ntype GroveTouchDriver struct {\n\t*ButtonDriver\n}\n\n// NewGroveTouchDriver returns a new driver for Grove touch sensor with a polling interval of 10 milliseconds given\n// a DigitalReader and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithButtonPollInterval\"\n//\n// Deprecated: Please use [gpio.NewButtonDriver] instead. Development will be discontinued.\nfunc NewGroveTouchDriver(a DigitalReader, pin string, opts ...interface{}) *GroveTouchDriver {\n\treturn &GroveTouchDriver{\n\t\tButtonDriver: NewButtonDriver(a, pin, opts...),\n\t}\n}\n\n// GroveMagneticSwitchDriver represent a magnetic switch sensor with a Grove connector\ntype GroveMagneticSwitchDriver struct {\n\t*ButtonDriver\n}\n\n// NewGroveMagneticSwitchDriver returns a new driver for Grove magnetic switch sensor with a polling interval of\n// 10 milliseconds given a DigitalReader, name and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithButtonPollInterval\"\n//\n// Deprecated: Please use [gpio.NewButtonDriver] instead. Development will be discontinued.\nfunc NewGroveMagneticSwitchDriver(a DigitalReader, pin string, opts ...interface{}) *GroveMagneticSwitchDriver {\n\treturn &GroveMagneticSwitchDriver{\n\t\tButtonDriver: NewButtonDriver(a, pin, opts...),\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/grove_drivers_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage gpio\n\nimport (\n\t\"errors\"\n\t\"reflect\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype DriverAndPinner interface {\n\tgobot.Driver\n\tgobot.Pinner\n}\n\ntype DriverAndEventer interface {\n\tgobot.Driver\n\tgobot.Eventer\n}\n\nfunc TestDriverDefaults(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\tpin := \"456\"\n\n\tdrivers := []DriverAndPinner{\n\t\tNewGroveTouchDriver(a, pin),\n\t\tNewGroveButtonDriver(a, pin),\n\t\tNewGroveBuzzerDriver(a, pin),\n\t\tNewGroveLedDriver(a, pin),\n\t\tNewGroveRelayDriver(a, pin),\n\t\tNewGroveMagneticSwitchDriver(a, pin),\n\t}\n\n\tfor _, driver := range drivers {\n\t\tassert.Equal(t, a, driver.Connection())\n\t\tassert.Equal(t, pin, driver.Pin())\n\t}\n}\n\nfunc TestDigitalDriverHalt(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\tpin := \"456\"\n\n\tdrivers := []DriverAndEventer{\n\t\tNewGroveTouchDriver(a, pin),\n\t\tNewGroveButtonDriver(a, pin),\n\t\tNewGroveMagneticSwitchDriver(a, pin),\n\t}\n\n\tfor _, driver := range drivers {\n\n\t\tvar callCount int32\n\t\ta.digitalReadFunc = func(string) (int, error) {\n\t\t\tatomic.AddInt32(&callCount, 1)\n\t\t\treturn 42, nil\n\t\t}\n\n\t\t// Start the driver and allow for multiple digital reads\n\t\t_ = driver.Start()\n\t\ttime.Sleep(20 * time.Millisecond)\n\n\t\t_ = driver.Halt()\n\t\tlastCallCount := atomic.LoadInt32(&callCount)\n\t\t// If driver was not halted, digital reads would still continue\n\t\ttime.Sleep(20 * time.Millisecond)\n\t\t// note: if a reading is already in progress, it will be finished before halt have an impact\n\t\tif atomic.LoadInt32(&callCount) > lastCallCount+1 {\n\t\t\trequire.Fail(t, \"DigitalRead was called more than once after driver was halted\")\n\t\t}\n\t}\n}\n\nfunc TestDriverPublishesError(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\tpin := \"456\"\n\n\tdrivers := []DriverAndEventer{\n\t\tNewGroveTouchDriver(a, pin),\n\t\tNewGroveButtonDriver(a, pin),\n\t\tNewGroveMagneticSwitchDriver(a, pin),\n\t}\n\n\tfor _, driver := range drivers {\n\t\tsem := make(chan struct{}, 1)\n\t\t// send error\n\t\treturnErr := func(string) (int, error) {\n\t\t\treturn 0, errors.New(\"read error\")\n\t\t}\n\t\ta.digitalReadFunc = returnErr\n\n\t\trequire.NoError(t, driver.Start())\n\n\t\t// expect error\n\t\t_ = driver.Once(driver.Event(Error), func(data interface{}) {\n\t\t\tassert.Equal(t, \"read error\", data.(error).Error())\n\t\t\tclose(sem)\n\t\t})\n\n\t\tselect {\n\t\tcase <-sem:\n\t\tcase <-time.After(time.Second):\n\t\t\trequire.Fail(t, getType(driver)+\" Event \\\"Error\\\" was not published\")\n\t\t}\n\n\t\t// Cleanup\n\t\t_ = driver.Halt()\n\t}\n}\n\nfunc getType(driver interface{}) string {\n\td := reflect.TypeOf(driver)\n\n\tif d.Kind() == reflect.Ptr {\n\t\treturn d.Elem().Name()\n\t}\n\n\treturn d.Name()\n}\n"
  },
  {
    "path": "drivers/gpio/hcsr04_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\thcsr04SoundSpeed = 343 // in [m/s]\n\t// the device can measure 2 cm .. 4 m, this means sweep distances between 4 cm and 8 m\n\t// this cause pulse duration between 0.12 ms and 24 ms (at 34.3 cm/ms, ~0.03 ms/cm, ~3 ms/m)\n\t// so we use 60 ms as a limit for timeout and 100 ms for duration between 2 consecutive measurements\n\thcsr04StartTransmitTimeout time.Duration = 100 * time.Millisecond // unfortunately takes sometimes longer than 60 ms\n\thcsr04ReceiveTimeout       time.Duration = 60 * time.Millisecond\n\thcsr04EmitTriggerDuration  time.Duration = 10 * time.Microsecond // according to specification\n\thcsr04MonitorUpdate        time.Duration = 200 * time.Millisecond\n\t// the resolution of the device is ~3 mm, which relates to 10 us (343 mm/ms = 0.343 mm/us)\n\t// the poll interval increases the reading interval to this value and adds around 3 mm inaccuracy\n\t// it takes only an effect for fast systems, because reading inputs is typically much slower, e.g. 30-50 us on raspi\n\t// so, using the internal edge detection with \"cdev\" is more precise\n\thcsr04PollInputIntervall time.Duration = 10 * time.Microsecond\n)\n\n// hcsr04OptionApplier needs to be implemented by each configurable option type\ntype hcsr04OptionApplier interface {\n\tapply(cfg *hcsr04Configuration)\n}\n\n// hcsr04Configuration contains all changeable attributes of the driver.\ntype hcsr04Configuration struct {\n\tuseEdgePolling bool\n}\n\n// hcsr04UseEdgePollingOption is the type for applying to use discrete edge polling instead pin edge detection\n// by \"cdev\" from the go-gpiocdev package.\ntype hcsr04UseEdgePollingOption bool\n\n// HCSR04Driver is a driver for ultrasonic range measurement.\ntype HCSR04Driver struct {\n\t*driver\n\n\thcsr04Cfg                    *hcsr04Configuration\n\ttriggerPinID                 string\n\techoPinID                    string\n\tmeasureMutex                 *sync.Mutex // to ensure that only one measurement is done at a time\n\ttriggerPin                   gobot.DigitalPinner\n\techoPin                      gobot.DigitalPinner\n\tlastMeasureMicroSec          int64 // ~120 .. 24000 us\n\tdistanceMonitorStopChan      chan struct{}\n\tdistanceMonitorStopWaitGroup *sync.WaitGroup\n\tdelayMicroSecChan            chan int64    // channel for event handler return value\n\tpollQuitChan                 chan struct{} // channel for quit the continuous polling\n}\n\n// NewHCSR04Driver creates a new instance of the driver for HC-SR04 (same as SEN-US01).\n//\n// Datasheet: https://www.makershop.de/download/HCSR04-datasheet-version-1.pdf\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc NewHCSR04Driver(a gobot.Adaptor, triggerPinID, echoPinID string, opts ...interface{}) *HCSR04Driver {\n\td := HCSR04Driver{\n\t\tdriver:       newDriver(a, \"HCSR04\"),\n\t\thcsr04Cfg:    &hcsr04Configuration{},\n\t\ttriggerPinID: triggerPinID,\n\t\techoPinID:    echoPinID,\n\t\tmeasureMutex: &sync.Mutex{},\n\t}\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase hcsr04OptionApplier:\n\t\t\to.apply(d.hcsr04Cfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\td.afterStart = func() error {\n\t\ttpin, err := a.(gobot.DigitalPinnerProvider).DigitalPin(triggerPinID) //nolint:forcetypeassert // ok here\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error on get trigger pin: %v\", err)\n\t\t}\n\t\tif err := tpin.ApplyOptions(system.WithPinDirectionOutput(0)); err != nil {\n\t\t\treturn fmt.Errorf(\"error on apply output for trigger pin: %v\", err)\n\t\t}\n\t\td.triggerPin = tpin\n\n\t\t// pins are inputs by default\n\t\tepin, err := a.(gobot.DigitalPinnerProvider).DigitalPin(echoPinID) //nolint:forcetypeassert // ok here\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error on get echo pin: %v\", err)\n\t\t}\n\n\t\tepinOptions := []func(gobot.DigitalPinOptioner) bool{system.WithPinEventOnBothEdges(d.createEventHandler())}\n\t\tif d.hcsr04Cfg.useEdgePolling {\n\t\t\td.pollQuitChan = make(chan struct{})\n\t\t\tepinOptions = append(epinOptions, system.WithPinPollForEdgeDetection(hcsr04PollInputIntervall, d.pollQuitChan))\n\t\t}\n\t\tif err := epin.ApplyOptions(epinOptions...); err != nil {\n\t\t\treturn fmt.Errorf(\"error on apply options for echo pin: %v\", err)\n\t\t}\n\t\td.echoPin = epin\n\n\t\td.delayMicroSecChan = make(chan int64)\n\n\t\treturn nil\n\t}\n\n\td.beforeHalt = func() error {\n\t\tif d.hcsr04Cfg.useEdgePolling {\n\t\t\tclose(d.pollQuitChan)\n\t\t}\n\n\t\tif err := d.stopDistanceMonitor(); err != nil {\n\t\t\tfmt.Printf(\"no need to stop distance monitoring: %v\\n\", err)\n\t\t}\n\n\t\t// note: Unexport() of all pins will be done on adaptor.Finalize()\n\n\t\tclose(d.delayMicroSecChan)\n\n\t\treturn nil\n\t}\n\n\treturn &d\n}\n\n// WithHCSR04UseEdgePolling use discrete edge polling instead pin edge detection by \"cdev\" from the go-gpiocdev package.\nfunc WithHCSR04UseEdgePolling() hcsr04OptionApplier {\n\treturn hcsr04UseEdgePollingOption(true)\n}\n\n// MeasureDistance retrieves the distance in front of sensor in meters and returns the measure. It is not designed\n// to work in a fast loop! For this specific usage, use StartDistanceMonitor() associated with Distance() instead.\nfunc (d *HCSR04Driver) MeasureDistance() (float64, error) {\n\terr := d.measureDistance()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.Distance(), nil\n}\n\n// Distance returns the last distance measured in meter, it does not trigger a distance measurement\nfunc (d *HCSR04Driver) Distance() float64 {\n\tdistMm := d.lastMeasureMicroSec * hcsr04SoundSpeed / 1000 / 2\n\treturn float64(distMm) / 1000.0\n}\n\n// StartDistanceMonitor starts continuous measurement. The current value can be read by Distance()\nfunc (d *HCSR04Driver) StartDistanceMonitor() error {\n\t// ensure that start and stop can not interfere\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif d.distanceMonitorStopChan != nil {\n\t\treturn fmt.Errorf(\"distance monitor already started for '%s'\", d.driverCfg.name)\n\t}\n\n\td.distanceMonitorStopChan = make(chan struct{})\n\td.distanceMonitorStopWaitGroup = &sync.WaitGroup{}\n\td.distanceMonitorStopWaitGroup.Add(1)\n\n\tgo func(name string) {\n\t\tdefer d.distanceMonitorStopWaitGroup.Done()\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-d.distanceMonitorStopChan:\n\t\t\t\td.distanceMonitorStopChan = nil\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\tif err := d.measureDistance(); err != nil {\n\t\t\t\t\tfmt.Printf(\"continuous measure distance skipped for '%s': %v\\n\", name, err)\n\t\t\t\t}\n\t\t\t\ttime.Sleep(hcsr04MonitorUpdate)\n\t\t\t}\n\t\t}\n\t}(d.driverCfg.name)\n\n\treturn nil\n}\n\n// StopDistanceMonitor stop the monitor process\nfunc (d *HCSR04Driver) StopDistanceMonitor() error {\n\t// ensure that start and stop can not interfere\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.stopDistanceMonitor()\n}\n\nfunc (d *HCSR04Driver) createEventHandler() func(int, time.Duration, string, uint32, uint32) {\n\tvar startTimestamp time.Duration\n\treturn func(offset int, t time.Duration, et string, sn uint32, lsn uint32) {\n\t\tswitch et {\n\t\tcase system.DigitalPinEventRisingEdge:\n\t\t\tstartTimestamp = t\n\t\tcase system.DigitalPinEventFallingEdge:\n\t\t\t// unfortunately there is an additional falling edge at each start trigger, so we need to filter this\n\t\t\t// we use the start duration value for filtering\n\t\t\tif startTimestamp == 0 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\td.delayMicroSecChan <- (t - startTimestamp).Microseconds()\n\t\t\tstartTimestamp = 0\n\t\t}\n\t}\n}\n\nfunc (d *HCSR04Driver) stopDistanceMonitor() error {\n\tif d.distanceMonitorStopChan == nil {\n\t\treturn fmt.Errorf(\"distance monitor is not yet started for '%s'\", d.driverCfg.name)\n\t}\n\n\td.distanceMonitorStopChan <- struct{}{}\n\td.distanceMonitorStopWaitGroup.Wait()\n\n\treturn nil\n}\n\nfunc (d *HCSR04Driver) measureDistance() error {\n\td.measureMutex.Lock()\n\tdefer d.measureMutex.Unlock()\n\n\tif err := d.emitTrigger(); err != nil {\n\t\treturn err\n\t}\n\n\t// stop the loop if the measure is done or the timeout is elapsed\n\ttimeout := hcsr04StartTransmitTimeout + hcsr04ReceiveTimeout\n\tselect {\n\tcase <-time.After(timeout):\n\t\treturn fmt.Errorf(\"timeout %s reached while waiting for value with echo pin %s\", timeout, d.echoPinID)\n\tcase d.lastMeasureMicroSec = <-d.delayMicroSecChan:\n\t}\n\n\treturn nil\n}\n\nfunc (d *HCSR04Driver) emitTrigger() error {\n\tif err := d.triggerPin.Write(1); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(hcsr04EmitTriggerDuration)\n\treturn d.triggerPin.Write(0)\n}\n\nfunc (o hcsr04UseEdgePollingOption) String() string {\n\treturn \"hcsr04 use edge polling option\"\n}\n\nfunc (o hcsr04UseEdgePollingOption) apply(cfg *hcsr04Configuration) {\n\tcfg.useEdgePolling = bool(o)\n}\n"
  },
  {
    "path": "drivers/gpio/hcsr04_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc initTestHCSR04DriverWithStubbedAdaptor(triggerPinID string, echoPinID string) (*HCSR04Driver, *digitalPinMock) {\n\ta := newGpioTestAdaptor()\n\ttpin := a.addDigitalPin(triggerPinID)\n\t_ = a.addDigitalPin(echoPinID)\n\td := NewHCSR04Driver(a, triggerPinID, echoPinID)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, tpin\n}\n\nfunc TestNewHCSR04Driver(t *testing.T) {\n\t// arrange\n\tconst (\n\t\ttriggerPinID = \"3\"\n\t\techoPinID    = \"4\"\n\t)\n\ta := newGpioTestAdaptor()\n\ttpin := a.addDigitalPin(triggerPinID)\n\tepin := a.addDigitalPin(echoPinID)\n\t// act\n\td := NewHCSR04Driver(a, triggerPinID, echoPinID)\n\t// assert\n\tassert.IsType(t, &HCSR04Driver{}, d)\n\t// assert: gpio.driver attributes\n\tassert.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"HCSR04\"))\n\tassert.Equal(t, a, d.connection)\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.False(t, d.hcsr04Cfg.useEdgePolling)\n\tassert.Equal(t, triggerPinID, d.triggerPinID)\n\tassert.Equal(t, echoPinID, d.echoPinID)\n\tassert.NotNil(t, d.measureMutex)\n\tassert.Equal(t, tpin, d.triggerPin)\n\tassert.Equal(t, epin, d.echoPin)\n}\n\nfunc TestNewHCSR04Driver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"count up\"\n\t\tcycReadDur = 30 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewHCSR04Driver(newGpioTestAdaptor(), \"1\", \"2\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewHCSR04Driver(newGpioTestAdaptor(), \"1\", \"2\", WithName(myName), WithHCSR04UseEdgePolling())\n\t// assert\n\tassert.True(t, d.hcsr04Cfg.useEdgePolling)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestHCSR04MeasureDistance(t *testing.T) {\n\ttests := map[string]struct {\n\t\tmeasureMicroSec  int64\n\t\tsimulateWriteErr string\n\t\twantCallsWrite   int\n\t\twantVal          float64\n\t\twantErr          string\n\t}{\n\t\t\"measure_ok\": {\n\t\t\tmeasureMicroSec: 5831,\n\t\t\twantCallsWrite:  2,\n\t\t\twantVal:         1.0,\n\t\t},\n\t\t\"error_timeout\": {\n\t\t\tmeasureMicroSec: 170000, // > 160 ms\n\t\t\twantCallsWrite:  2,\n\t\t\twantErr:         \"timeout 160ms reached\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tmeasureMicroSec:  5831,\n\t\t\tsimulateWriteErr: \"write error\",\n\t\t\twantCallsWrite:   1,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, tpin := initTestHCSR04DriverWithStubbedAdaptor(\"3\", \"4\")\n\t\t\t// arrange sensor and event handler simulation\n\t\t\twaitForTriggerChan := make(chan struct{})\n\t\t\tloopWg := sync.WaitGroup{}\n\t\t\tdefer func() {\n\t\t\t\tclose(waitForTriggerChan)\n\t\t\t\tloopWg.Wait()\n\t\t\t}()\n\t\t\tloopWg.Add(1)\n\t\t\tgo func() {\n\t\t\t\t<-waitForTriggerChan\n\t\t\t\tm := tc.measureMicroSec // to prevent data race together with wait group\n\t\t\t\tloopWg.Done()\n\t\t\t\ttime.Sleep(time.Duration(m) * time.Microsecond)\n\t\t\t\td.delayMicroSecChan <- m\n\t\t\t}()\n\t\t\t// arrange writes\n\t\t\tnumCallsWrite := 0\n\t\t\tvar oldVal int\n\t\t\ttpin.writeFunc = func(val int) error {\n\t\t\t\tnumCallsWrite++\n\t\t\t\tif val == 0 && oldVal == 1 {\n\t\t\t\t\t// falling edge detected\n\t\t\t\t\twaitForTriggerChan <- struct{}{}\n\t\t\t\t}\n\t\t\t\toldVal = val\n\t\t\t\tvar err error\n\t\t\t\tif tc.simulateWriteErr != \"\" {\n\t\t\t\t\terr = errors.New(tc.simulateWriteErr)\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.MeasureDistance()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantCallsWrite, numCallsWrite)\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.InDelta(t, tc.wantVal, got, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestHCSR04Distance(t *testing.T) {\n\ttests := map[string]struct {\n\t\tmeasureMicroSec  int64\n\t\tsimulateWriteErr string\n\t\twantVal          float64\n\t\twantErr          string\n\t}{\n\t\t\"distance_0mm\": {\n\t\t\tmeasureMicroSec: 0, // no validity test yet\n\t\t\twantVal:         0.0,\n\t\t},\n\t\t\"distance_2cm\": {\n\t\t\tmeasureMicroSec: 117, // 117us ~ 0.12ms => ~2cm\n\t\t\twantVal:         0.02,\n\t\t},\n\t\t\"distance_4m\": {\n\t\t\tmeasureMicroSec: 23324, // 23324us ~ 24ms => ~4m\n\t\t\twantVal:         4.0,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := HCSR04Driver{lastMeasureMicroSec: tc.measureMicroSec}\n\t\t\t// act\n\t\t\tgot := d.Distance()\n\t\t\t// assert\n\t\t\tassert.InDelta(t, tc.wantVal, got, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestHCSR04StartDistanceMonitor(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimulateIsStarted bool\n\t\tsimulateWriteErr  bool\n\t\twantErr           string\n\t}{\n\t\t\"start_ok\": {},\n\t\t\"start_ok_measure_error\": {\n\t\t\tsimulateWriteErr: true,\n\t\t},\n\t\t\"error_already_started\": {\n\t\t\tsimulateIsStarted: true,\n\t\t\twantErr:           \"already started for 'HCSR04-\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, tpin := initTestHCSR04DriverWithStubbedAdaptor(\"3\", \"4\")\n\t\t\tdefer func() {\n\t\t\t\tif d.distanceMonitorStopChan != nil {\n\t\t\t\t\tclose(d.distanceMonitorStopChan)\n\t\t\t\t}\n\t\t\t\tif d.distanceMonitorStopWaitGroup != nil {\n\t\t\t\t\td.distanceMonitorStopWaitGroup.Wait()\n\t\t\t\t}\n\t\t\t}()\n\t\t\tif tc.simulateIsStarted {\n\t\t\t\td.distanceMonitorStopChan = make(chan struct{})\n\t\t\t}\n\t\t\ttpin.writeFunc = func(val int) error {\n\t\t\t\tif tc.simulateWriteErr {\n\t\t\t\t\treturn fmt.Errorf(\"write error\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.StartDistanceMonitor()\n\t\t\ttime.Sleep(1 * time.Millisecond) // < 160 ms\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.NotNil(t, d.distanceMonitorStopChan)\n\t\t\t\tassert.NotNil(t, d.distanceMonitorStopWaitGroup)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHCSR04StopDistanceMonitor(t *testing.T) {\n\ttests := map[string]struct {\n\t\tstart   bool\n\t\twantErr string\n\t}{\n\t\t\"stop_ok\": {\n\t\t\tstart: true,\n\t\t},\n\t\t\"error_not_started\": {\n\t\t\twantErr: \"not yet started for 'HCSR04-\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, _ := initTestHCSR04DriverWithStubbedAdaptor(\"3\", \"4\")\n\t\t\tdefer func() {\n\t\t\t\tif d.distanceMonitorStopChan != nil {\n\t\t\t\t\tclose(d.distanceMonitorStopChan)\n\t\t\t\t}\n\t\t\t\tif d.distanceMonitorStopWaitGroup != nil {\n\t\t\t\t\td.distanceMonitorStopWaitGroup.Wait()\n\t\t\t\t}\n\t\t\t}()\n\t\t\tif tc.start {\n\t\t\t\terr := d.StartDistanceMonitor()\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.StopDistanceMonitor()\n\t\t\ttime.Sleep(1 * time.Millisecond) // < 160 ms\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Nil(t, d.distanceMonitorStopChan)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHCSR04_createEventHandler(t *testing.T) {\n\ttype eventCall struct {\n\t\ttimeStamp time.Duration\n\t\teventType string\n\t}\n\ttests := map[string]struct {\n\t\tcalls []eventCall\n\t\twants []int64\n\t}{\n\t\t\"only_rising\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 1 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 2 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t},\n\t\t},\n\t\t\"only_falling\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 2 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t\t{timeStamp: 3 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t},\n\t\t},\n\t\t\"event_normal\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 1 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 10 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t},\n\t\t\twants: []int64{9},\n\t\t},\n\t\t\"event_falling_before\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 1 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t\t{timeStamp: 2 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 10 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t},\n\t\t\twants: []int64{8},\n\t\t},\n\t\t\"event_falling_after\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 1 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 10 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t\t{timeStamp: 12 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t},\n\t\t\twants: []int64{9},\n\t\t},\n\t\t\"event_rising_before\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 1 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 5 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 10 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t},\n\t\t\twants: []int64{5},\n\t\t},\n\t\t\"event_rising_after\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 1 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 10 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t\t{timeStamp: 12 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t},\n\t\t\twants: []int64{9},\n\t\t},\n\t\t\"event_multiple\": {\n\t\t\tcalls: []eventCall{\n\t\t\t\t{timeStamp: 1 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 10 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t\t{timeStamp: 11 * time.Microsecond, eventType: system.DigitalPinEventRisingEdge},\n\t\t\t\t{timeStamp: 13 * time.Microsecond, eventType: system.DigitalPinEventFallingEdge},\n\t\t\t},\n\t\t\twants: []int64{9, 2},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := HCSR04Driver{delayMicroSecChan: make(chan int64, len(tc.wants))}\n\t\t\t// act\n\t\t\teh := d.createEventHandler()\n\t\t\tfor _, call := range tc.calls {\n\t\t\t\teh(0, call.timeStamp, call.eventType, 0, 0)\n\t\t\t}\n\t\t\t// assert\n\t\t\tfor _, want := range tc.wants {\n\t\t\t\tgot := <-d.delayMicroSecChan\n\t\t\t\tassert.Equal(t, want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/hd44780_driver.go",
    "content": "package gpio\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Commands for the driver\nconst (\n\tHD44780_CLEARDISPLAY        = 0x01\n\tHD44780_RETURNHOME          = 0x02\n\tHD44780_ENTRYMODESET        = 0x04\n\tHD44780_DISPLAYCONTROL      = 0x08\n\tHD44780_CURSORSHIFT         = 0x10\n\tHD44780_FUNCTIONSET         = 0x20\n\tHD44780_SETCGRAMADDR        = 0x40\n\tHD44780_SETDDRAMADDR        = 0x80\n\tHD44780_ENTRYRIGHT          = 0x00\n\tHD44780_ENTRYLEFT           = 0x02\n\tHD44780_ENTRYSHIFTINCREMENT = 0x01\n\tHD44780_ENTRYSHIFTDECREMENT = 0x00\n\tHD44780_DISPLAYON           = 0x04\n\tHD44780_DISPLAYOFF          = 0x00\n\tHD44780_CURSORON            = 0x02\n\tHD44780_CURSOROFF           = 0x00\n\tHD44780_BLINKON             = 0x01\n\tHD44780_BLINKOFF            = 0x00\n\tHD44780_DISPLAYMOVE         = 0x08\n\tHD44780_CURSORMOVE          = 0x00\n\tHD44780_MOVERIGHT           = 0x04\n\tHD44780_MOVELEFT            = 0x00\n\tHD44780_1LINE               = 0x00\n\tHD44780_2LINE               = 0x08\n\tHD44780_5x8DOTS             = 0x00\n\tHD44780_5x10DOTS            = 0x04\n\tHD44780_4BITBUS             = 0x00\n\tHD44780_8BITBUS             = 0x10\n)\n\n// Some useful constants for the driver\nconst (\n\tHD44780_2NDLINEOFFSET = 0x40\n)\n\n// HD44780BusMode is the data bus mode\ntype HD44780BusMode int\n\n// Bus modes of the driver\nconst (\n\tHD44780_4BITMODE HD44780BusMode = iota + 1\n\tHD44780_8BITMODE\n)\n\n// HD44780DataPin are the data bit pins\ntype HD44780DataPin struct {\n\tD0 string // not used if 4Bit mode\n\tD1 string // not used if 4Bit mode\n\tD2 string // not used if 4Bit mode\n\tD3 string // not used if 4Bit mode\n\tD4 string\n\tD5 string\n\tD6 string\n\tD7 string\n}\n\n// hd44780OptionApplier needs to be implemented by each configurable option type\ntype hd44780OptionApplier interface {\n\tapply(cfg *hd44780Configuration)\n}\n\n// hd44780Configuration contains all changeable attributes of the driver\ntype hd44780Configuration struct {\n\tpinRW string\n}\n\n// hd44780PinRWOption is the type for applying a R/W pin to the configuration\ntype hd44780PinRWOption string\n\n// HD44780Driver is the gobot driver for the HD44780 LCD controller\n// Datasheet: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf\ntype HD44780Driver struct {\n\t*driver\n\n\thd44780Cfg  *hd44780Configuration\n\tcols        int\n\trows        int\n\trowOffsets  [4]int\n\tbusMode     HD44780BusMode\n\tpinRS       *DirectPinDriver\n\tpinEN       *DirectPinDriver\n\tpinRW       *DirectPinDriver\n\tpinDataBits []*DirectPinDriver\n\tdisplayCtrl int\n\tdisplayFunc int\n\tdisplayMode int\n}\n\n// NewHD44780Driver return a new HD44780Driver\n// a: gobot.Connection\n// cols: lcd columns\n// rows: lcd rows\n// busMode: 4Bit or 8Bit\n// pinRS: register select pin\n// pinEN: clock enable pin\n// pinDataBits: databit pins\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc NewHD44780Driver(\n\ta gobot.Connection,\n\tcols int,\n\trows int,\n\tbusMode HD44780BusMode,\n\tpinRS string,\n\tpinEN string,\n\tpinDataBits HD44780DataPin,\n\topts ...interface{},\n) *HD44780Driver {\n\td := &HD44780Driver{\n\t\tdriver:     newDriver(a, \"HD44780\"),\n\t\thd44780Cfg: &hd44780Configuration{},\n\t\tcols:       cols,\n\t\trows:       rows,\n\t\tbusMode:    busMode,\n\t\tpinRS:      NewDirectPinDriver(a, pinRS),\n\t\tpinEN:      NewDirectPinDriver(a, pinEN),\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase hd44780OptionApplier:\n\t\t\to.apply(d.hd44780Cfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\tif d.busMode == HD44780_4BITMODE {\n\t\td.pinDataBits = make([]*DirectPinDriver, 4)\n\t\td.pinDataBits[0] = NewDirectPinDriver(a, pinDataBits.D4)\n\t\td.pinDataBits[1] = NewDirectPinDriver(a, pinDataBits.D5)\n\t\td.pinDataBits[2] = NewDirectPinDriver(a, pinDataBits.D6)\n\t\td.pinDataBits[3] = NewDirectPinDriver(a, pinDataBits.D7)\n\t} else {\n\t\td.pinDataBits = make([]*DirectPinDriver, 8)\n\t\td.pinDataBits[0] = NewDirectPinDriver(a, pinDataBits.D0)\n\t\td.pinDataBits[1] = NewDirectPinDriver(a, pinDataBits.D1)\n\t\td.pinDataBits[2] = NewDirectPinDriver(a, pinDataBits.D2)\n\t\td.pinDataBits[3] = NewDirectPinDriver(a, pinDataBits.D3)\n\t\td.pinDataBits[4] = NewDirectPinDriver(a, pinDataBits.D4)\n\t\td.pinDataBits[5] = NewDirectPinDriver(a, pinDataBits.D5)\n\t\td.pinDataBits[6] = NewDirectPinDriver(a, pinDataBits.D6)\n\t\td.pinDataBits[7] = NewDirectPinDriver(a, pinDataBits.D7)\n\t}\n\n\tif d.hd44780Cfg.pinRW != \"\" {\n\t\td.pinRW = NewDirectPinDriver(d.connection, d.hd44780Cfg.pinRW)\n\t}\n\n\td.rowOffsets[0] = 0x00\n\td.rowOffsets[1] = HD44780_2NDLINEOFFSET\n\td.rowOffsets[2] = 0x00 + cols\n\td.rowOffsets[3] = HD44780_2NDLINEOFFSET + cols\n\n\t/* TODO : Add commands */\n\n\treturn d\n}\n\n// WithHD44780RWPin sets the RW pin for next initializing.\nfunc WithHD44780RWPin(pin string) hd44780OptionApplier {\n\treturn hd44780PinRWOption(pin)\n}\n\n// initialize initializes the HD44780 LCD controller\n// refer to page 45/46 of Hitachi HD44780 datasheet\nfunc (d *HD44780Driver) initialize() error {\n\tfor _, bitPin := range d.pinDataBits {\n\t\tif bitPin.Pin() == \"\" {\n\t\t\treturn errors.New(\"initialization error\")\n\t\t}\n\t}\n\n\ttime.Sleep(50 * time.Millisecond)\n\n\tif err := d.activateWriteMode(); err != nil {\n\t\treturn err\n\t}\n\n\t// for initialization refer to documentation, page 45 and 46\n\tif d.busMode == HD44780_4BITMODE {\n\t\tif err := d.writeDataPins(0x03); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\tif err := d.writeDataPins(0x03); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(100 * time.Microsecond)\n\t\tif err := d.writeDataPins(0x03); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// no additional delay is necessary now\n\t\tif err := d.writeDataPins(0x02); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif err := d.sendCommand(0x30); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\tif err := d.sendCommand(0x30); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(100 * time.Microsecond)\n\t\tif err := d.sendCommand(0x30); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// no additional delay is necessary now\n\t}\n\n\tif d.busMode == HD44780_4BITMODE {\n\t\td.displayFunc |= HD44780_4BITBUS\n\t} else {\n\t\td.displayFunc |= HD44780_8BITBUS\n\t}\n\n\tif d.rows > 1 {\n\t\td.displayFunc |= HD44780_2LINE\n\t} else {\n\t\td.displayFunc |= HD44780_1LINE\n\t}\n\n\td.displayFunc |= HD44780_5x8DOTS\n\td.displayCtrl = HD44780_DISPLAYON | HD44780_BLINKOFF | HD44780_CURSOROFF\n\td.displayMode = HD44780_ENTRYLEFT | HD44780_ENTRYSHIFTDECREMENT\n\n\tif err := d.sendCommand(HD44780_FUNCTIONSET | d.displayFunc); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.sendCommand(HD44780_DISPLAYCONTROL | d.displayCtrl); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.clear(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.sendCommand(HD44780_ENTRYMODESET | d.displayMode); err != nil {\n\t\treturn err\n\t}\n\n\t// see documentation, page 45, 46: the busy flag can't be checked before\n\treturn nil\n}\n\n// Write output text to the display\nfunc (d *HD44780Driver) Write(message string) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tcol := 0\n\tif (d.displayMode & HD44780_ENTRYLEFT) == 0 {\n\t\tcol = d.cols - 1\n\t}\n\n\trow := 0\n\tfor _, c := range message {\n\t\tif c == '\\n' {\n\t\t\trow++\n\t\t\tif err := d.setCursor(col, row); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif err := d.writeChar(int(c)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Clear clear the display\nfunc (d *HD44780Driver) Clear() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.clear()\n}\n\n// Home return cursor to home\nfunc (d *HD44780Driver) Home() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.sendCommand(HD44780_RETURNHOME); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(2 * time.Millisecond)\n\n\treturn nil\n}\n\n// SetCursor move the cursor to the specified position\nfunc (d *HD44780Driver) SetCursor(col int, row int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.setCursor(col, row)\n}\n\n// Display turn the display on and off\nfunc (d *HD44780Driver) Display(on bool) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif on {\n\t\td.displayCtrl |= HD44780_DISPLAYON\n\t} else {\n\t\td.displayCtrl &= ^HD44780_DISPLAYON\n\t}\n\n\treturn d.sendCommand(HD44780_DISPLAYCONTROL | d.displayCtrl)\n}\n\n// Cursor turn the cursor on and off\nfunc (d *HD44780Driver) Cursor(on bool) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif on {\n\t\td.displayCtrl |= HD44780_CURSORON\n\t} else {\n\t\td.displayCtrl &= ^HD44780_CURSORON\n\t}\n\n\treturn d.sendCommand(HD44780_DISPLAYCONTROL | d.displayCtrl)\n}\n\n// Blink turn the blink on and off\nfunc (d *HD44780Driver) Blink(on bool) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif on {\n\t\td.displayCtrl |= HD44780_BLINKON\n\t} else {\n\t\td.displayCtrl &= ^HD44780_BLINKON\n\t}\n\n\treturn d.sendCommand(HD44780_DISPLAYCONTROL | d.displayCtrl)\n}\n\n// ScrollLeft scroll text left\nfunc (d *HD44780Driver) ScrollLeft() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.sendCommand(HD44780_CURSORSHIFT | HD44780_DISPLAYMOVE | HD44780_MOVELEFT)\n}\n\n// ScrollRight scroll text right\nfunc (d *HD44780Driver) ScrollRight() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.sendCommand(HD44780_CURSORSHIFT | HD44780_DISPLAYMOVE | HD44780_MOVERIGHT)\n}\n\n// LeftToRight display text from left to right\nfunc (d *HD44780Driver) LeftToRight() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.displayMode |= HD44780_ENTRYLEFT\n\treturn d.sendCommand(HD44780_ENTRYMODESET | d.displayMode)\n}\n\n// RightToLeft display text from right to left\nfunc (d *HD44780Driver) RightToLeft() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.displayMode &= ^HD44780_ENTRYLEFT\n\treturn d.sendCommand(HD44780_ENTRYMODESET | d.displayMode)\n}\n\n// SendCommand send control command\nfunc (d *HD44780Driver) SendCommand(data int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.sendCommand(data)\n}\n\n// WriteChar output a character to the display\nfunc (d *HD44780Driver) WriteChar(data int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeChar(data)\n}\n\n// CreateChar create custom character\nfunc (d *HD44780Driver) CreateChar(pos int, charMap [8]byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif pos > 7 {\n\t\treturn errors.New(\"can't set a custom character at a position greater than 7\")\n\t}\n\n\tif err := d.sendCommand(HD44780_SETCGRAMADDR | (pos << 3)); err != nil {\n\t\treturn err\n\t}\n\n\tfor i := range charMap {\n\t\tif err := d.writeChar(int(charMap[i])); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (d *HD44780Driver) sendCommand(data int) error {\n\tif err := d.activateWriteMode(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.pinRS.Off(); err != nil {\n\t\treturn err\n\t}\n\tif d.busMode == HD44780_4BITMODE {\n\t\tif err := d.writeDataPins(data >> 4); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn d.writeDataPins(data)\n}\n\nfunc (d *HD44780Driver) writeChar(data int) error {\n\tif err := d.activateWriteMode(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.pinRS.On(); err != nil {\n\t\treturn err\n\t}\n\tif d.busMode == HD44780_4BITMODE {\n\t\tif err := d.writeDataPins(data >> 4); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn d.writeDataPins(data)\n}\n\nfunc (d *HD44780Driver) clear() error {\n\tif err := d.sendCommand(HD44780_CLEARDISPLAY); err != nil {\n\t\treturn err\n\t}\n\n\t// clear is time consuming, see documentation for JHD1313\n\t// for lower clock speed it takes more time\n\ttime.Sleep(4 * time.Millisecond)\n\n\treturn nil\n}\n\nfunc (d *HD44780Driver) setCursor(col int, row int) error {\n\tif col < 0 || row < 0 || col >= d.cols || row >= d.rows {\n\t\treturn fmt.Errorf(\"invalid position value (%d, %d), range (%d, %d)\", col, row, d.cols-1, d.rows-1)\n\t}\n\n\treturn d.sendCommand(HD44780_SETDDRAMADDR | col + d.rowOffsets[row])\n}\n\nfunc (d *HD44780Driver) writeDataPins(data int) error {\n\tfor i, pin := range d.pinDataBits {\n\t\tif ((data >> i) & 0x01) == 0x01 {\n\t\t\tif err := pin.On(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif err := pin.Off(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn d.fallingEdge()\n}\n\n// fallingEdge creates falling edge to trigger data transmission\nfunc (d *HD44780Driver) fallingEdge() error {\n\tif err := d.pinEN.On(); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(1 * time.Microsecond)\n\n\tif err := d.pinEN.Off(); err != nil {\n\t\treturn err\n\t}\n\t// fastest write operation at 190kHz mode takes 53 us\n\ttime.Sleep(60 * time.Microsecond)\n\n\treturn nil\n}\n\nfunc (d *HD44780Driver) activateWriteMode() error {\n\tif d.pinRW == nil {\n\t\treturn nil\n\t}\n\treturn d.pinRW.Off()\n}\n\nfunc (o hd44780PinRWOption) String() string {\n\treturn \"hd44780 RW pin option\"\n}\n\nfunc (o hd44780PinRWOption) apply(cfg *hd44780Configuration) {\n\tcfg.pinRW = string(o)\n}\n"
  },
  {
    "path": "drivers/gpio/hd44780_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*HD44780Driver)(nil)\n\nfunc initTestHD44780Driver() *HD44780Driver {\n\td, _ := initTestHD44780Driver4BitModeWithStubbedAdaptor()\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d\n}\n\nfunc initTestHD44780Driver4BitModeWithStubbedAdaptor() (*HD44780Driver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\tdataPins := HD44780DataPin{\n\t\tD4: \"22\",\n\t\tD5: \"18\",\n\t\tD6: \"16\",\n\t\tD7: \"12\",\n\t}\n\n\treturn NewHD44780Driver(a, 2, 16, HD44780_4BITMODE, \"13\", \"15\", dataPins), a\n}\n\nfunc initTestHD44780Driver8BitModeWithStubbedAdaptor() (*HD44780Driver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\tdataPins := HD44780DataPin{\n\t\tD0: \"31\",\n\t\tD1: \"33\",\n\t\tD2: \"35\",\n\t\tD3: \"37\",\n\t\tD4: \"22\",\n\t\tD5: \"18\",\n\t\tD6: \"16\",\n\t\tD7: \"12\",\n\t}\n\n\treturn NewHD44780Driver(a, 2, 16, HD44780_8BITMODE, \"13\", \"15\", dataPins), a\n}\n\nfunc TestNewHD44780Driver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\tdataPins := HD44780DataPin{\n\t\tD4: \"22\",\n\t\tD5: \"18\",\n\t\tD6: \"16\",\n\t\tD7: \"12\",\n\t}\n\t// act\n\td := NewHD44780Driver(a, 16, 2, HD44780_4BITMODE, \"13\", \"15\", dataPins)\n\t// assert\n\tassert.IsType(t, &HD44780Driver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"HD44780\"))\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.Empty(t, d.hd44780Cfg.pinRW)\n\tassert.Equal(t, 16, d.cols)\n\tassert.Equal(t, 2, d.rows)\n\tassert.Equal(t, HD44780_4BITMODE, d.busMode)\n\tassert.NotNil(t, d.pinRS)\n\tassert.NotNil(t, d.pinEN)\n\tassert.Nil(t, d.pinRW) // will be set optionally\n\tassert.NotNil(t, d.pinRS)\n\tassert.Equal(t, [4]int{0, 64, 16, 80}, d.rowOffsets)\n\tassert.Len(t, d.pinDataBits, 4)\n\tfor _, b := range d.pinDataBits {\n\t\tassert.NotNil(t, b)\n\t}\n\tassert.Equal(t, 0, d.displayCtrl)\n\tassert.Equal(t, 0, d.displayFunc)\n\tassert.Equal(t, 0, d.displayMode)\n}\n\nfunc TestNewHD44780Driver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"LCD output\"\n\t\tpinRW  = \"3\"\n\t)\n\tdataPins := HD44780DataPin{\n\t\tD4: \"22\",\n\t\tD5: \"18\",\n\t\tD6: \"16\",\n\t\tD7: \"12\",\n\t}\n\tpanicFunc := func() {\n\t\tNewHD44780Driver(newGpioTestAdaptor(), 16, 2, HD44780_4BITMODE, \"1\", \"2\", dataPins, WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewHD44780Driver(newGpioTestAdaptor(), 16, 2, HD44780_4BITMODE, \"1\", \"2\", dataPins, WithName(myName),\n\t\tWithHD44780RWPin(pinRW))\n\t// assert\n\tassert.Equal(t, pinRW, d.hd44780Cfg.pinRW)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestHD44780Start(t *testing.T) {\n\t// arrange\n\td, _ := initTestHD44780Driver4BitModeWithStubbedAdaptor()\n\t// act & assert: tests also initialize()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestHD44780StartError(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\n\tvar pins HD44780DataPin\n\tvar d *HD44780Driver\n\n\tpins = HD44780DataPin{\n\t\tD4: \"22\",\n\t\tD5: \"18\",\n\t\tD6: \"16\",\n\t\tD7: \"\",\n\t}\n\td = NewHD44780Driver(a, 2, 16, HD44780_4BITMODE, \"13\", \"15\", pins)\n\trequire.EqualError(t, d.Start(), \"initialization error\")\n\n\tpins = HD44780DataPin{\n\t\tD0: \"31\",\n\t\tD1: \"33\",\n\t\tD2: \"35\",\n\t\tD3: \"37\",\n\t\tD4: \"22\",\n\t\tD5: \"18\",\n\t\tD6: \"16\",\n\t\tD7: \"\",\n\t}\n\td = NewHD44780Driver(a, 2, 16, HD44780_8BITMODE, \"13\", \"15\", pins)\n\trequire.EqualError(t, d.Start(), \"initialization error\")\n}\n\nfunc TestHD44780Write(t *testing.T) {\n\tvar d *HD44780Driver\n\n\td, _ = initTestHD44780Driver4BitModeWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Write(\"hello gobot\"))\n\n\td, _ = initTestHD44780Driver8BitModeWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Write(\"hello gobot\"))\n}\n\nfunc TestHD44780WriteError(t *testing.T) {\n\tvar d *HD44780Driver\n\tvar a *gpioTestAdaptor\n\n\td, a = initTestHD44780Driver4BitModeWithStubbedAdaptor()\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\t_ = d.Start()\n\trequire.EqualError(t, d.Write(\"hello gobot\"), \"write error\")\n\n\td, a = initTestHD44780Driver8BitModeWithStubbedAdaptor()\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\t_ = d.Start()\n\trequire.EqualError(t, d.Write(\"hello gobot\"), \"write error\")\n}\n\nfunc TestHD44780Clear(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Clear())\n}\n\nfunc TestHD44780Home(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Home())\n}\n\nfunc TestHD44780SetCursor(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.SetCursor(0, 3))\n}\n\nfunc TestHD44780SetCursorInvalid(t *testing.T) {\n\td := initTestHD44780Driver()\n\n\trequire.EqualError(t, d.SetCursor(-1, 3), \"invalid position value (-1, 3), range (1, 15)\")\n\trequire.EqualError(t, d.SetCursor(2, 3), \"invalid position value (2, 3), range (1, 15)\")\n\trequire.EqualError(t, d.SetCursor(0, -1), \"invalid position value (0, -1), range (1, 15)\")\n\trequire.EqualError(t, d.SetCursor(0, 16), \"invalid position value (0, 16), range (1, 15)\")\n}\n\nfunc TestHD44780DisplayOn(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Display(true))\n}\n\nfunc TestHD44780DisplayOff(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Display(false))\n}\n\nfunc TestHD44780CursorOn(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Cursor(true))\n}\n\nfunc TestHD44780CursorOff(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Cursor(false))\n}\n\nfunc TestHD44780BlinkOn(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Blink(true))\n}\n\nfunc TestHD44780BlinkOff(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.Blink(false))\n}\n\nfunc TestHD44780ScrollLeft(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.ScrollLeft())\n}\n\nfunc TestHD44780ScrollRight(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.ScrollRight())\n}\n\nfunc TestHD44780LeftToRight(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.LeftToRight())\n}\n\nfunc TestHD44780RightToLeft(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.RightToLeft())\n}\n\nfunc TestHD44780SendCommand(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.SendCommand(0x33))\n}\n\nfunc TestHD44780WriteChar(t *testing.T) {\n\td := initTestHD44780Driver()\n\trequire.NoError(t, d.WriteChar(0x41))\n}\n\nfunc TestHD44780CreateChar(t *testing.T) {\n\td := initTestHD44780Driver()\n\tcharMap := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}\n\trequire.NoError(t, d.CreateChar(0, charMap))\n}\n\nfunc TestHD44780CreateCharError(t *testing.T) {\n\td := initTestHD44780Driver()\n\tcharMap := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}\n\trequire.EqualError(t, d.CreateChar(8, charMap), \"can't set a custom character at a position greater than 7\")\n}\n"
  },
  {
    "path": "drivers/gpio/helpers_test.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype gpioTestBareAdaptor struct{}\n\nfunc (t *gpioTestBareAdaptor) Connect() error   { return nil }\nfunc (t *gpioTestBareAdaptor) Finalize() error  { return nil }\nfunc (t *gpioTestBareAdaptor) Name() string     { return \"\" }\nfunc (t *gpioTestBareAdaptor) SetName(n string) {}\n\ntype digitalPinMock struct {\n\twriteFunc func(val int) error\n}\n\ntype gpioTestWritten struct {\n\tpin string\n\tval byte\n}\n\ntype gpioTestAdaptor struct {\n\tname               string\n\tpinMap             map[string]gobot.DigitalPinner\n\tport               string\n\twritten            []gpioTestWritten\n\tsimulateWriteError bool\n\tmtx                sync.Mutex\n\tdigitalReadFunc    func(ping string) (val int, err error)\n\tdigitalWriteFunc   func(pin string, val byte) error\n\tpwmWriteFunc       func(pin string, val byte) error\n\tservoWriteFunc     func(pin string, val byte) error\n}\n\nfunc newGpioTestAdaptor() *gpioTestAdaptor {\n\tt := gpioTestAdaptor{\n\t\tname:   \"gpio_test_adaptor\",\n\t\tpinMap: make(map[string]gobot.DigitalPinner),\n\t\tport:   \"/dev/null\",\n\t\tdigitalWriteFunc: func(pin string, val byte) error {\n\t\t\treturn nil\n\t\t},\n\t\tservoWriteFunc: func(pin string, val byte) error {\n\t\t\treturn nil\n\t\t},\n\t\tpwmWriteFunc: func(pin string, val byte) error {\n\t\t\treturn nil\n\t\t},\n\t\tdigitalReadFunc: func(pin string) (int, error) {\n\t\t\treturn 1, nil\n\t\t},\n\t}\n\n\treturn &t\n}\n\n// DigitalRead capabilities (interface DigitalReader)\nfunc (t *gpioTestAdaptor) DigitalRead(pin string) (int, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.digitalReadFunc(pin)\n}\n\n// DigitalWrite capabilities (interface DigitalWriter)\nfunc (t *gpioTestAdaptor) DigitalWrite(pin string, val byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tif t.simulateWriteError {\n\t\treturn fmt.Errorf(\"write error\")\n\t}\n\tw := gpioTestWritten{pin: pin, val: val}\n\tt.written = append(t.written, w)\n\treturn t.digitalWriteFunc(pin, val)\n}\n\n// PwmWrite capabilities (interface PwmWriter)\nfunc (t *gpioTestAdaptor) PwmWrite(pin string, val byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.pwmWriteFunc(pin, val)\n}\n\n// ServoWrite capabilities (interface ServoWriter)\nfunc (t *gpioTestAdaptor) ServoWrite(pin string, val byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.servoWriteFunc(pin, val)\n}\n\nfunc (t *gpioTestAdaptor) Connect() error   { return nil }\nfunc (t *gpioTestAdaptor) Finalize() error  { return nil }\nfunc (t *gpioTestAdaptor) Name() string     { return t.name }\nfunc (t *gpioTestAdaptor) SetName(n string) { t.name = n }\nfunc (t *gpioTestAdaptor) Port() string     { return t.port }\n\n// DigitalPin (interface DigitalPinnerProvider) return a pin object\nfunc (t *gpioTestAdaptor) DigitalPin(id string) (gobot.DigitalPinner, error) {\n\tif pin, ok := t.pinMap[id]; ok {\n\t\treturn pin, nil\n\t}\n\treturn nil, fmt.Errorf(\"pin '%s' not found in '%s'\", id, t.name)\n}\n\n// ApplyOptions (interface DigitalPinOptionApplier by DigitalPinner) apply all given options to the pin immediately\nfunc (d *digitalPinMock) ApplyOptions(options ...func(gobot.DigitalPinOptioner) bool) error {\n\treturn nil\n}\n\n// Export (interface DigitalPinner) exports the pin for use by the adaptor\nfunc (d *digitalPinMock) Export() error {\n\treturn nil\n}\n\n// Unexport (interface DigitalPinner) releases the pin from the adaptor, so it is free for the operating system\nfunc (d *digitalPinMock) Unexport() error {\n\treturn nil\n}\n\n// Read (interface DigitalPinner) reads the current value of the pin\nfunc (d *digitalPinMock) Read() (int, error) {\n\treturn 0, nil\n}\n\n// Write (interface DigitalPinner) writes to the pin\nfunc (d *digitalPinMock) Write(b int) error {\n\treturn d.writeFunc(b)\n}\n\nfunc (t *gpioTestAdaptor) addDigitalPin(id string) *digitalPinMock {\n\tdpm := &digitalPinMock{\n\t\twriteFunc: func(val int) error { return nil },\n\t}\n\tt.pinMap[id] = dpm\n\treturn dpm\n}\n"
  },
  {
    "path": "drivers/gpio/led_driver.go",
    "content": "package gpio\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// LedDriver represents a digital Led\ntype LedDriver struct {\n\t*driver\n\n\thigh bool\n}\n\n// NewLedDriver return a new LedDriver given a DigitalWriter and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\n// Adds the following API Commands:\n//\n//\t\"Brightness\" - See LedDriver.Brightness\n//\t\"Toggle\" - See LedDriver.Toggle\n//\t\"On\" - See LedDriver.On\n//\t\"Off\" - See LedDriver.Off\nfunc NewLedDriver(a DigitalWriter, pin string, opts ...interface{}) *LedDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &LedDriver{\n\t\tdriver: newDriver(a.(gobot.Connection), \"LED\", append(opts, withPin(pin))...),\n\t}\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Brightness\", func(params map[string]interface{}) interface{} {\n\t\tlevel := byte(params[\"level\"].(float64))\n\t\treturn d.Brightness(level)\n\t})\n\n\td.AddCommand(\"Toggle\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Toggle()\n\t})\n\n\td.AddCommand(\"On\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.On()\n\t})\n\n\td.AddCommand(\"Off\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Off()\n\t})\n\n\treturn d\n}\n\n// State return true if the led is On and false if the led is Off\nfunc (d *LedDriver) State() bool {\n\treturn d.high\n}\n\n// On sets the led to a high state.\nfunc (d *LedDriver) On() error {\n\tif err := d.digitalWrite(d.driverCfg.pin, 1); err != nil {\n\t\treturn err\n\t}\n\td.high = true\n\treturn nil\n}\n\n// Off sets the led to a low state.\nfunc (d *LedDriver) Off() error {\n\tif err := d.digitalWrite(d.driverCfg.pin, 0); err != nil {\n\t\treturn err\n\t}\n\td.high = false\n\treturn nil\n}\n\n// Toggle sets the led to the opposite of it's current state\nfunc (d *LedDriver) Toggle() error {\n\tif d.State() {\n\t\treturn d.Off()\n\t}\n\treturn d.On()\n}\n\n// Brightness sets the led to the specified level of brightness\nfunc (d *LedDriver) Brightness(level byte) error {\n\treturn d.pwmWrite(d.driverCfg.pin, level)\n}\n"
  },
  {
    "path": "drivers/gpio/led_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage gpio\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*LedDriver)(nil)\n\nfunc initTestLedDriver() *LedDriver {\n\ta := newGpioTestAdaptor()\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn nil\n\t}\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn nil\n\t}\n\treturn NewLedDriver(a, \"1\")\n}\n\nfunc TestNewLedDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewLedDriver(a, \"10\")\n\t// assert\n\tassert.IsType(t, &LedDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"LED\"))\n\tassert.Equal(t, \"10\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.False(t, d.high)\n}\n\nfunc TestNewLedDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"back light\"\n\t)\n\tpanicFunc := func() {\n\t\tNewLedDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"), aio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewLedDriver(newGpioTestAdaptor(), \"1\", WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestLed_Commands(t *testing.T) {\n\tvar err interface{}\n\ta := newGpioTestAdaptor()\n\td := NewLedDriver(a, \"1\")\n\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"pwm error\")\n\t}\n\n\terr = d.Command(\"Toggle\")(nil)\n\trequire.EqualError(t, err.(error), \"write error\")\n\n\terr = d.Command(\"On\")(nil)\n\trequire.EqualError(t, err.(error), \"write error\")\n\n\terr = d.Command(\"Off\")(nil)\n\trequire.EqualError(t, err.(error), \"write error\")\n\n\terr = d.Command(\"Brightness\")(map[string]interface{}{\"level\": 100.0})\n\trequire.EqualError(t, err.(error), \"pwm error\")\n}\n\nfunc TestLedToggle(t *testing.T) {\n\td := initTestLedDriver()\n\trequire.NoError(t, d.Off())\n\trequire.NoError(t, d.Toggle())\n\tassert.True(t, d.State())\n\trequire.NoError(t, d.Toggle())\n\tassert.False(t, d.State())\n}\n\nfunc TestLedBrightness(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := NewLedDriver(a, \"1\")\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"pwm error\")\n\t}\n\trequire.EqualError(t, d.Brightness(150), \"pwm error\")\n}\n"
  },
  {
    "path": "drivers/gpio/max7219_driver.go",
    "content": "package gpio\n\nimport (\n\t\"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Access and command constants for the driver\nconst (\n\tMAX7219Digit0 = 0x01\n\tMAX7219Digit1 = 0x02\n\tMAX7219Digit2 = 0x03\n\tMAX7219Digit3 = 0x04\n\tMAX7219Digit4 = 0x05\n\tMAX7219Digit5 = 0x06\n\tMAX7219Digit6 = 0x07\n\tMAX7219Digit7 = 0x08\n\n\tMAX7219DecodeMode  = 0x09\n\tMAX7219Intensity   = 0x0a\n\tMAX7219ScanLimit   = 0x0b\n\tMAX7219Shutdown    = 0x0c\n\tMAX7219DisplayTest = 0x0f\n)\n\n// MAX7219Driver is the gobot driver for the MAX7219 LED driver\n//\n// Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf\ntype MAX7219Driver struct {\n\t*driver\n\n\tpinClock *DirectPinDriver\n\tpinData  *DirectPinDriver\n\tpinCS    *DirectPinDriver\n\tcount    uint\n}\n\n// NewMAX7219Driver return a new MAX7219Driver given a gobot.Connection, pins and how many chips are chained\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc NewMAX7219Driver(\n\ta gobot.Connection,\n\tclockPin, dataPin, csPin string,\n\tcount uint,\n\topts ...interface{},\n) *MAX7219Driver {\n\td := &MAX7219Driver{\n\t\tdriver:   newDriver(a, \"MAX7219\", opts...),\n\t\tpinClock: NewDirectPinDriver(a, clockPin),\n\t\tpinData:  NewDirectPinDriver(a, dataPin),\n\t\tpinCS:    NewDirectPinDriver(a, csPin),\n\t\tcount:    count,\n\t}\n\td.afterStart = d.initialize\n\n\t/* TODO : Add commands */\n\n\treturn d\n}\n\n// SetIntensity changes the intensity (from 1 to 7) of the display\nfunc (d *MAX7219Driver) SetIntensity(level byte) error {\n\tif level > 15 {\n\t\tlevel = 15\n\t}\n\treturn d.All(MAX7219Intensity, level)\n}\n\n// ClearAll turns off all LEDs of all modules\nfunc (d *MAX7219Driver) ClearAll() error {\n\tvar err error\n\tfor i := 1; i <= 8; i++ {\n\t\tif e := d.All(byte(i), 0); e != nil {\n\t\t\terr = multierror.Append(err, e)\n\t\t}\n\t}\n\n\treturn err\n}\n\n// ClearOne turns off all LEDs of the given module\nfunc (d *MAX7219Driver) ClearOne(which uint) error {\n\tvar err error\n\tfor i := 1; i <= 8; i++ {\n\t\tif e := d.One(which, byte(i), 0); e != nil {\n\t\t\terr = multierror.Append(err, e)\n\t\t}\n\t}\n\n\treturn err\n}\n\n// All sends the same data to all the modules\nfunc (d *MAX7219Driver) All(address byte, data byte) error {\n\tif err := d.pinCS.Off(); err != nil {\n\t\treturn err\n\t}\n\tvar c uint\n\tfor c = 0; c < d.count; c++ {\n\t\tif err := d.send(address); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := d.send(data); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn d.pinCS.On()\n}\n\n// One sends data to a specific module\nfunc (d *MAX7219Driver) One(which uint, address byte, data byte) error {\n\tif err := d.pinCS.Off(); err != nil {\n\t\treturn err\n\t}\n\tvar c uint\n\tfor c = 0; c < d.count; c++ {\n\t\tif c == which {\n\t\t\tif err := d.send(address); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := d.send(data); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif err := d.send(0); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := d.send(0); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn d.pinCS.On()\n}\n\n// initialize initializes the max7219, it uses a SPI-like communication protocol\nfunc (d *MAX7219Driver) initialize() error {\n\tif err := d.pinData.On(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.pinClock.On(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.pinCS.On(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.All(MAX7219ScanLimit, 0x07); err != nil {\n\t\treturn err\n\t}\n\tif err := d.All(MAX7219DecodeMode, 0x00); err != nil {\n\t\treturn err\n\t}\n\tif err := d.All(MAX7219Shutdown, 0x01); err != nil {\n\t\treturn err\n\t}\n\tif err := d.All(MAX7219DisplayTest, 0x00); err != nil {\n\t\treturn err\n\t}\n\tif err := d.ClearAll(); err != nil {\n\t\treturn err\n\t}\n\treturn d.All(MAX7219Intensity, 0x0f)\n}\n\n// send writes data on the module\nfunc (d *MAX7219Driver) send(data byte) error {\n\tvar i byte\n\tfor i = 8; i > 0; i-- {\n\t\tmask := byte(0x01 << (i - 1))\n\n\t\tif err := d.pinClock.Off(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif data&mask > 0 {\n\t\t\tif err := d.pinData.On(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif err := d.pinData.Off(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := d.pinClock.On(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/gpio/max7219_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*MAX7219Driver)(nil)\n\nfunc initTestMAX7219Driver() *MAX7219Driver {\n\td, _ := initTestMAX7219DriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initTestMAX7219DriverWithStubbedAdaptor() (*MAX7219Driver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\treturn NewMAX7219Driver(a, \"1\", \"2\", \"3\", 1), a\n}\n\nfunc TestNewMAX7219Driver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewMAX7219Driver(a, \"1\", \"2\", \"3\", 4)\n\t// assert\n\tassert.IsType(t, &MAX7219Driver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"MAX7219\"))\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.NotNil(t, d.pinClock)\n\tassert.NotNil(t, d.pinData)\n\tassert.NotNil(t, d.pinCS)\n\tassert.Equal(t, uint(4), d.count)\n}\n\nfunc TestNewMAX7219Driver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"light chain 5\"\n\t)\n\tpanicFunc := func() {\n\t\tNewMAX7219Driver(newGpioTestAdaptor(), \"1\", \"2\", \"3\", 4, WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewMAX7219Driver(newGpioTestAdaptor(), \"1\", \"2\", \"3\", 4, WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestMAX7219Start(t *testing.T) {\n\t// arrange\n\td := initTestMAX7219Driver()\n\t// act & assert: tests also initialize()\n\trequire.NoError(t, d.Start())\n}\n"
  },
  {
    "path": "drivers/gpio/motor_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// motorOptionApplier needs to be implemented by each configurable option type\ntype motorOptionApplier interface {\n\tapply(cfg *motorConfiguration)\n}\n\n// motorConfiguration contains all changeable attributes of the driver.\ntype motorConfiguration struct {\n\tmodeIsAnalog bool\n\tdirectionPin string\n\tforwardPin   string\n\tbackwardPin  string\n}\n\n// motorModeIsAnalogOption is the type for applying analog mode to the configuration\ntype motorModeIsAnalogOption bool\n\n// motorDirectionPinOption is the type for applying a direction pin to the configuration\ntype motorDirectionPinOption string\n\n// motorForwardPinOption is the type for applying a forward pin to the configuration\ntype motorForwardPinOption string\n\n// motorBackwardPinOption is the type for applying a backward pin to the configuration\ntype motorBackwardPinOption string\n\n// MotorDriver Represents a Motor\ntype MotorDriver struct {\n\t*driver\n\n\tmotorCfg         *motorConfiguration\n\tcurrentState     byte\n\tcurrentSpeed     byte\n\tcurrentDirection string\n}\n\n// NewMotorDriver return a new MotorDriver given a DigitalWriter and pin. This defaults to digital mode and just switch\n// on and off in forward direction. Optional pins can be given, depending on your hardware. So the direction can be\n// changed with one pin or by using separated forward and backward pins.\n//\n// If the given pin supports the PwmWriter the motor can be used/switched to analog mode by writing once to SetSpeed()\n// or by calling SetAnalogMode(). The optional pins can be used for direction control.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithMotorAnalog\"\n//\t\"WithMotorDirectionPin\"\n//\t\"WithMotorForwardPin\"\n//\t\"WithMotorBackwardPin\"\nfunc NewMotorDriver(a DigitalWriter, speedPin string, opts ...interface{}) *MotorDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &MotorDriver{\n\t\tdriver:           newDriver(a.(gobot.Connection), \"Motor\", withPin(speedPin)),\n\t\tmotorCfg:         &motorConfiguration{},\n\t\tcurrentDirection: \"forward\",\n\t}\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase motorOptionApplier:\n\t\t\to.apply(d.motorCfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// WithMotorAnalog change the default mode \"digital\" to analog for the motor.\nfunc WithMotorAnalog() motorOptionApplier {\n\treturn motorModeIsAnalogOption(true)\n}\n\n// WithMotorDirectionPin introduces a pin for change the direction of the motor.\nfunc WithMotorDirectionPin(pin string) motorOptionApplier {\n\treturn motorDirectionPinOption(pin)\n}\n\n// WithMotorForwardPin introduces a pin for setting the direction to forward.\nfunc WithMotorForwardPin(pin string) motorOptionApplier {\n\treturn motorForwardPinOption(pin)\n}\n\n// WithMotorBackwardPin introduces a pin for setting the direction to backward.\nfunc WithMotorBackwardPin(pin string) motorOptionApplier {\n\treturn motorBackwardPinOption(pin)\n}\n\n// Off turns the motor off or sets the motor to a 0 speed.\nfunc (d *MotorDriver) Off() error {\n\tif d.IsDigital() {\n\t\treturn d.changeState(0)\n\t}\n\n\treturn d.SetSpeed(0)\n}\n\n// On turns the motor on or sets the motor to a maximum speed.\nfunc (d *MotorDriver) On() error {\n\tif d.IsDigital() {\n\t\treturn d.changeState(1)\n\t}\n\n\tif d.currentSpeed == 0 {\n\t\td.currentSpeed = 255\n\t}\n\n\treturn d.SetSpeed(d.currentSpeed)\n}\n\n// RunMin sets the motor to the minimum speed.\nfunc (d *MotorDriver) RunMin() error {\n\treturn d.Off()\n}\n\n// RunMax sets the motor to the maximum speed.\nfunc (d *MotorDriver) RunMax() error {\n\treturn d.SetSpeed(255)\n}\n\n// Toggle sets the motor to the opposite of it's current state.\nfunc (d *MotorDriver) Toggle() error {\n\tif d.IsOn() {\n\t\treturn d.Off()\n\t}\n\n\treturn d.On()\n}\n\n// SetSpeed change the speed of the motor, without change the direction.\nfunc (d *MotorDriver) SetSpeed(value byte) error {\n\tif writer, ok := d.connection.(PwmWriter); ok {\n\t\tWithMotorAnalog().apply(d.motorCfg)\n\t\td.currentSpeed = value\n\t\treturn writer.PwmWrite(d.driverCfg.pin, value)\n\t}\n\treturn ErrPwmWriteUnsupported\n}\n\n// Forward runs the motor forward with the specified speed.\nfunc (d *MotorDriver) Forward(speed byte) error {\n\tif err := d.SetDirection(\"forward\"); err != nil {\n\t\treturn err\n\t}\n\tif err := d.SetSpeed(speed); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Backward runs the motor backward with the specified speed.\nfunc (d *MotorDriver) Backward(speed byte) error {\n\tif err := d.SetDirection(\"backward\"); err != nil {\n\t\treturn err\n\t}\n\tif err := d.SetSpeed(speed); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Direction sets the direction pin to the specified direction.\nfunc (d *MotorDriver) SetDirection(direction string) error {\n\td.currentDirection = direction\n\tif d.motorCfg.directionPin != \"\" {\n\t\tvar level byte\n\t\tif direction == \"forward\" {\n\t\t\tlevel = 1\n\t\t} else {\n\t\t\tlevel = 0\n\t\t}\n\t\treturn d.digitalWrite(d.motorCfg.directionPin, level)\n\t}\n\n\tvar forwardLevel, backwardLevel byte\n\tswitch direction {\n\tcase \"forward\":\n\t\tforwardLevel = 1\n\t\tbackwardLevel = 0\n\tcase \"backward\":\n\t\tforwardLevel = 0\n\t\tbackwardLevel = 1\n\tcase \"none\":\n\t\tforwardLevel = 0\n\t\tbackwardLevel = 0\n\t}\n\n\tif d.motorCfg.forwardPin != \"\" {\n\t\tif err := d.digitalWrite(d.motorCfg.forwardPin, forwardLevel); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif d.motorCfg.backwardPin != \"\" {\n\t\treturn d.digitalWrite(d.motorCfg.backwardPin, backwardLevel)\n\t}\n\n\treturn nil\n}\n\n// IsAnalog returns true if the motor is in analog mode.\nfunc (d *MotorDriver) IsAnalog() bool {\n\treturn d.motorCfg.modeIsAnalog\n}\n\n// IsDigital returns true if the motor is in digital mode.\nfunc (d *MotorDriver) IsDigital() bool {\n\treturn !d.motorCfg.modeIsAnalog\n}\n\n// IsOn returns true if the motor is on.\nfunc (d *MotorDriver) IsOn() bool {\n\tif d.IsDigital() {\n\t\treturn d.currentState == 1\n\t}\n\treturn d.currentSpeed > 0\n}\n\n// IsOff returns true if the motor is off.\nfunc (d *MotorDriver) IsOff() bool {\n\treturn !d.IsOn()\n}\n\n// Direction returns the current direction (\"forward\" or \"backward\") of the motor.\nfunc (d *MotorDriver) Direction() string {\n\treturn d.currentDirection\n}\n\n// Speed returns the current speed of the motor.\nfunc (d *MotorDriver) Speed() byte {\n\treturn d.currentSpeed\n}\n\nfunc (d *MotorDriver) changeState(state byte) error {\n\td.currentState = state\n\tif state == 1 {\n\t\td.currentSpeed = 255\n\t} else {\n\t\td.currentSpeed = 0\n\t}\n\n\tif d.motorCfg.forwardPin == \"\" {\n\t\treturn d.digitalWrite(d.driverCfg.pin, state)\n\t}\n\n\tif state != 1 {\n\t\treturn d.SetDirection(\"none\")\n\t}\n\n\tif err := d.SetDirection(d.currentDirection); err != nil {\n\t\treturn err\n\t}\n\tif d.driverCfg.pin != \"\" {\n\t\tif err := d.SetSpeed(d.currentSpeed); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (o motorModeIsAnalogOption) String() string {\n\treturn \"motor mode (analog, digital) option\"\n}\n\nfunc (o motorDirectionPinOption) String() string {\n\treturn \"direction pin option for motors\"\n}\n\nfunc (o motorForwardPinOption) String() string {\n\treturn \"forward pin option for motors\"\n}\n\nfunc (o motorBackwardPinOption) String() string {\n\treturn \"backward pin option for motors\"\n}\n\nfunc (o motorModeIsAnalogOption) apply(cfg *motorConfiguration) {\n\tcfg.modeIsAnalog = bool(o)\n}\n\nfunc (o motorDirectionPinOption) apply(cfg *motorConfiguration) {\n\tcfg.directionPin = string(o)\n}\n\nfunc (o motorForwardPinOption) apply(cfg *motorConfiguration) {\n\tcfg.forwardPin = string(o)\n}\n\nfunc (o motorBackwardPinOption) apply(cfg *motorConfiguration) {\n\tcfg.backwardPin = string(o)\n}\n"
  },
  {
    "path": "drivers/gpio/motor_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*MotorDriver)(nil)\n\nfunc initTestMotorDriver() *MotorDriver {\n\treturn NewMotorDriver(newGpioTestAdaptor(), \"1\")\n}\n\nfunc TestMotorDriver(t *testing.T) {\n\td := NewMotorDriver(newGpioTestAdaptor(), \"1\")\n\tassert.NotNil(t, d.Connection())\n}\n\nfunc TestNewMotorDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewMotorDriver(a, \"10\")\n\t// assert\n\tassert.IsType(t, &MotorDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"Motor\"))\n\tassert.Equal(t, \"10\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.Empty(t, d.motorCfg.directionPin)\n\tassert.Empty(t, d.motorCfg.forwardPin)\n\tassert.Empty(t, d.motorCfg.backwardPin)\n\tassert.False(t, d.motorCfg.modeIsAnalog)\n\tassert.Equal(t, uint8(0), d.currentState)\n\tassert.Equal(t, uint8(0), d.currentSpeed)\n\tassert.Equal(t, \"forward\", d.currentDirection)\n}\n\nfunc TestNewMotorDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"move analog\"\n\t)\n\tpanicFunc := func() {\n\t\tNewMotorDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"), aio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewMotorDriver(newGpioTestAdaptor(), \"1\", WithName(myName), WithMotorAnalog())\n\t// assert\n\tassert.True(t, d.motorCfg.modeIsAnalog)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestMotor_WithMotorDirectionPin(t *testing.T) {\n\t// arrange\n\tconst myPin = \"8\"\n\tcfg := motorConfiguration{directionPin: \"old_pin\"}\n\t// act\n\tWithMotorDirectionPin(myPin).apply(&cfg)\n\t// assert\n\tassert.Equal(t, myPin, cfg.directionPin)\n}\n\nfunc TestMotor_WithMotorForwardPin(t *testing.T) {\n\t// arrange\n\tconst myPin = \"3\"\n\tcfg := motorConfiguration{directionPin: \"old_pin\"}\n\t// act\n\tWithMotorForwardPin(myPin).apply(&cfg)\n\t// assert\n\tassert.Equal(t, myPin, cfg.forwardPin)\n}\n\nfunc TestMotor_WithMotorBackwardPin(t *testing.T) {\n\t// arrange\n\tconst myPin = \"6\"\n\tcfg := motorConfiguration{directionPin: \"old_pin\"}\n\t// act\n\tWithMotorBackwardPin(myPin).apply(&cfg)\n\t// assert\n\tassert.Equal(t, myPin, cfg.backwardPin)\n}\n\nfunc TestMotorIsOn(t *testing.T) {\n\td := initTestMotorDriver()\n\td.motorCfg.modeIsAnalog = false\n\td.currentState = 1\n\tassert.True(t, d.IsDigital())\n\tassert.True(t, d.IsOn())\n\td.motorCfg.modeIsAnalog = true\n\td.currentSpeed = 100\n\tassert.False(t, d.IsDigital())\n\tassert.True(t, d.IsOn())\n}\n\nfunc TestMotorIsOff(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.Off())\n\tassert.True(t, d.IsOff())\n}\n\nfunc TestMotorOn(t *testing.T) {\n\td := initTestMotorDriver()\n\td.motorCfg.modeIsAnalog = false\n\tassert.True(t, d.IsDigital())\n\trequire.NoError(t, d.On())\n\tassert.Equal(t, uint8(1), d.currentState)\n\td.motorCfg.modeIsAnalog = true\n\td.currentSpeed = 0\n\tassert.False(t, d.IsDigital())\n\trequire.NoError(t, d.On())\n\tassert.Equal(t, uint8(255), d.currentSpeed)\n}\n\nfunc TestMotorOff(t *testing.T) {\n\td := initTestMotorDriver()\n\td.motorCfg.modeIsAnalog = false\n\tassert.True(t, d.IsDigital())\n\trequire.NoError(t, d.Off())\n\tassert.Equal(t, uint8(0), d.currentState)\n\td.motorCfg.modeIsAnalog = true\n\td.currentSpeed = 100\n\tassert.False(t, d.IsDigital())\n\trequire.NoError(t, d.Off())\n\tassert.Equal(t, uint8(0), d.currentSpeed)\n}\n\nfunc TestMotorToggle(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.Off())\n\trequire.NoError(t, d.Toggle())\n\tassert.True(t, d.IsOn())\n\trequire.NoError(t, d.Toggle())\n\tassert.False(t, d.IsOn())\n}\n\nfunc TestMotorRunMin(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.RunMin())\n}\n\nfunc TestMotorRunMax(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.RunMax())\n}\n\nfunc TestMotorSetSpeed(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.SetSpeed(100))\n}\n\nfunc TestMotorForward(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.Forward(100))\n\tassert.Equal(t, uint8(100), d.currentSpeed)\n\tassert.Equal(t, \"forward\", d.currentDirection)\n}\n\nfunc TestMotorBackward(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.Backward(100))\n\tassert.Equal(t, uint8(100), d.currentSpeed)\n\tassert.Equal(t, \"backward\", d.currentDirection)\n}\n\nfunc TestMotorSetDirection(t *testing.T) {\n\td := initTestMotorDriver()\n\trequire.NoError(t, d.SetDirection(\"none\"))\n\td.motorCfg.directionPin = \"2\"\n\trequire.NoError(t, d.SetDirection(\"forward\"))\n\trequire.NoError(t, d.SetDirection(\"backward\"))\n}\n\nfunc TestMotorDigital(t *testing.T) {\n\td := initTestMotorDriver()\n\td.driverCfg.pin = \"\" // Disable speed\n\td.motorCfg.modeIsAnalog = false\n\td.motorCfg.forwardPin = \"2\"\n\td.motorCfg.backwardPin = \"3\"\n\n\trequire.NoError(t, d.On())\n\tassert.Equal(t, uint8(1), d.currentState)\n\trequire.NoError(t, d.Off())\n\tassert.Equal(t, uint8(0), d.currentState)\n}\n"
  },
  {
    "path": "drivers/gpio/pir_motion_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// pirMotionOptionApplier needs to be implemented by each configurable option type\ntype pirMotionOptionApplier interface {\n\tapply(cfg *pirMotionConfiguration)\n}\n\n// pirMotionConfiguration contains all changeable attributes of the driver.\ntype pirMotionConfiguration struct {\n\treadInterval time.Duration\n}\n\n// pirMotionReadIntervalOption is the type for applying another read interval to the configuration\ntype pirMotionReadIntervalOption time.Duration\n\n// PIRMotionDriver represents a digital Proximity Infra Red (PIR) motion detecter\n//\n// Supported options:\n//\n//\t\"WithName\"\ntype PIRMotionDriver struct {\n\t*driver\n\tgobot.Eventer\n\n\tpirMotionCfg *pirMotionConfiguration\n\tactive       bool\n\thalt         chan struct{}\n}\n\n// NewPIRMotionDriver returns a new driver for  PIR motion sensor with a polling interval of 10 Milliseconds,\n// given a DigitalReader and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithButtonPollInterval\"\nfunc NewPIRMotionDriver(a DigitalReader, pin string, opts ...interface{}) *PIRMotionDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &PIRMotionDriver{\n\t\tdriver:       newDriver(a.(gobot.Connection), \"PIRMotion\", withPin(pin)),\n\t\tpirMotionCfg: &pirMotionConfiguration{readInterval: 10 * time.Millisecond},\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase pirMotionOptionApplier:\n\t\t\to.apply(d.pirMotionCfg)\n\t\tcase time.Duration:\n\t\t\t// TODO this is only for backward compatibility and will be removed after version 2.x\n\t\t\td.pirMotionCfg.readInterval = o\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// WithPIRMotionPollInterval change the asynchronous cyclic reading interval from default 10ms to the given value.\nfunc WithPIRMotionPollInterval(interval time.Duration) pirMotionOptionApplier {\n\treturn pirMotionReadIntervalOption(interval)\n}\n\n// Active gets the current state\nfunc (d *PIRMotionDriver) Active() bool {\n\t// ensure that read and write can not interfere\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.active\n}\n\n// initialize the PIRMotionDriver and polls the state of the sensor at the given interval.\n//\n// Emits the Events:\n//\n//\tMotionDetected - On motion detected\n//\tMotionStopped int - On motion stopped\n//\tError error - On pirMotion error\n//\n// The PIRMotionDriver will send the MotionDetected event over and over,\n// just as long as motion is still being detected.\n// It will only send the MotionStopped event once, however, until\n// motion starts being detected again\nfunc (d *PIRMotionDriver) initialize() error {\n\tif d.pirMotionCfg.readInterval == 0 {\n\t\treturn fmt.Errorf(\"the read interval for pirMotion needs to be greater than zero\")\n\t}\n\n\td.Eventer = gobot.NewEventer()\n\td.AddEvent(MotionDetected)\n\td.AddEvent(MotionStopped)\n\td.AddEvent(Error)\n\n\td.halt = make(chan struct{})\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-time.After(d.pirMotionCfg.readInterval):\n\t\t\t\tnewValue, err := d.digitalRead(d.driverCfg.pin)\n\t\t\t\tif err != nil {\n\t\t\t\t\td.Publish(Error, err)\n\t\t\t\t}\n\t\t\t\td.update(newValue)\n\t\t\tcase <-d.halt:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\treturn nil\n}\n\n// shutdown stops polling\nfunc (d *PIRMotionDriver) shutdown() error {\n\tif d.pirMotionCfg.readInterval == 0 || d.halt == nil {\n\t\t// cyclic reading deactivated\n\t\treturn nil\n\t}\n\n\tclose(d.halt) // broadcast halt, also to the test\n\treturn nil\n}\n\nfunc (d *PIRMotionDriver) update(newValue int) {\n\t// ensure that read and write can not interfere\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tswitch newValue {\n\tcase 1:\n\t\tif !d.active {\n\t\t\td.active = true\n\t\t\td.Publish(MotionDetected, newValue)\n\t\t}\n\tcase 0:\n\t\tif d.active {\n\t\t\td.active = false\n\t\t\td.Publish(MotionStopped, newValue)\n\t\t}\n\t}\n}\n\nfunc (o pirMotionReadIntervalOption) String() string {\n\treturn \"read interval option for PIR motion sensor\"\n}\n\nfunc (o pirMotionReadIntervalOption) apply(cfg *pirMotionConfiguration) {\n\tcfg.readInterval = time.Duration(o)\n}\n"
  },
  {
    "path": "drivers/gpio/pir_motion_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*PIRMotionDriver)(nil)\n\nconst motionTestDelay = 150\n\nfunc initTestPIRMotionDriverWithStubbedAdaptor() (*PIRMotionDriver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\td := NewPIRMotionDriver(a, \"1\")\n\treturn d, a\n}\n\nfunc TestNewPIRMotionDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewPIRMotionDriver(a, \"1\")\n\t// assert\n\tassert.IsType(t, &PIRMotionDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"PIRMotion\"))\n\tassert.Equal(t, \"1\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.False(t, d.active)\n\tassert.Equal(t, 10*time.Millisecond, d.pirMotionCfg.readInterval)\n\tassert.Nil(t, d.Eventer) // will be created on initialize\n\tassert.Nil(t, d.halt)    // will be created on initialize\n}\n\nfunc TestNewPIRMotionDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName     = \"voltage 1\"\n\t\tcycReadDur = 30 * time.Millisecond\n\t)\n\tpanicFunc := func() {\n\t\tNewPIRMotionDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewPIRMotionDriver(newGpioTestAdaptor(), \"1\", WithName(myName), WithPIRMotionPollInterval(cycReadDur))\n\t// assert\n\tassert.Equal(t, cycReadDur, d.pirMotionCfg.readInterval)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestPIRMotionStart(t *testing.T) {\n\t// arrange\n\tsem := make(chan bool)\n\tnextVal := make(chan int, 1)\n\ta := newGpioTestAdaptor()\n\td := NewPIRMotionDriver(a, \"1\")\n\n\ta.digitalReadFunc = func(string) (int, error) {\n\t\tval := 1\n\t\tvar err error\n\t\tselect {\n\t\tcase val = <-nextVal:\n\t\t\tif val < 0 {\n\t\t\t\terr = fmt.Errorf(\"digital read error\")\n\t\t\t}\n\t\t\treturn val, err\n\t\tdefault:\n\t\t\treturn val, err\n\t\t}\n\t}\n\n\t// act: start cyclic reading\n\terr := d.Start()\n\n\t_ = d.Once(MotionDetected, func(data interface{}) {\n\t\tassert.True(t, d.active)\n\t\tnextVal <- 0\n\t\tsem <- true\n\t})\n\n\t// assert & rearrange\n\trequire.NoError(t, err)\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(motionTestDelay * time.Millisecond):\n\t\trequire.Fail(t, \"PIRMotionDriver Event \\\"MotionDetected\\\" was not published\")\n\t}\n\n\t_ = d.Once(MotionStopped, func(data interface{}) {\n\t\tassert.False(t, d.active)\n\t\tnextVal <- -1\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(motionTestDelay * time.Millisecond):\n\t\trequire.Fail(t, \"PIRMotionDriver Event \\\"MotionStopped\\\" was not published\")\n\t}\n\n\t_ = d.Once(Error, func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(motionTestDelay * time.Millisecond):\n\t\trequire.Fail(t, \"PIRMotionDriver Event \\\"Error\\\" was not published\")\n\t}\n\n\t_ = d.Once(MotionDetected, func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\trequire.NoError(t, d.Halt())\n\tnextVal <- 1\n\n\tselect {\n\tcase <-sem:\n\t\trequire.Fail(t, \"PIRMotion Event \\\"MotionDetected\\\" should not published\")\n\tcase <-time.After(motionTestDelay * time.Millisecond):\n\t}\n}\n\nfunc TestPIRMotionHalt(t *testing.T) {\n\t// arrange\n\td, _ := initTestPIRMotionDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.Start())\n\ttimeout := 2 * d.pirMotionCfg.readInterval\n\twg := sync.WaitGroup{}\n\twg.Add(1)\n\tgo func() {\n\t\tdefer wg.Done()\n\t\tselect {\n\t\tcase <-d.halt: // wait until halt is broadcasted by close the channel\n\t\tcase <-time.After(timeout): // otherwise run into the timeout\n\t\t\tassert.Fail(t, fmt.Sprintf(\"halt was not received within %s\", timeout))\n\t\t}\n\t}()\n\t// act & assert\n\trequire.NoError(t, d.Halt())\n\twg.Wait() // wait until the go function was really finished\n}\n\nfunc TestPIRMotionActive(t *testing.T) {\n\ttests := map[string]struct {\n\t\twant bool\n\t}{\n\t\t\"active_true\":  {want: true},\n\t\t\"active_false\": {want: false},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := PIRMotionDriver{driver: newDriver(nil, \"PIRMotion\")} // just for mutex\n\t\t\td.active = tc.want\n\t\t\t// act & assert\n\t\t\tassert.Equal(t, tc.want, d.Active())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/relay_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// relayOptionApplier needs to be implemented by each configurable option type\ntype relayOptionApplier interface {\n\tapply(cfg *relayConfiguration)\n}\n\n// relayConfiguration contains all changeable attributes of the driver.\ntype relayConfiguration struct {\n\tinverted bool\n}\n\n// relayInvertedOption is the type for applying inverted behavior to the configuration\ntype relayInvertedOption bool\n\n// RelayDriver represents a digital relay\ntype RelayDriver struct {\n\t*driver\n\n\trelayCfg *relayConfiguration\n\thigh     bool\n}\n\n// NewRelayDriver return a new RelayDriver given a DigitalWriter and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\t\"WithRelayInverted\"\n//\n// Adds the following API Commands:\n//\n//\t\"Toggle\" - See RelayDriver.Toggle\n//\t\"On\" - See RelayDriver.On\n//\t\"Off\" - See RelayDriver.Off\nfunc NewRelayDriver(a DigitalWriter, pin string, opts ...interface{}) *RelayDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &RelayDriver{\n\t\tdriver:   newDriver(a.(gobot.Connection), \"Relay\", withPin(pin)),\n\t\trelayCfg: &relayConfiguration{},\n\t}\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase relayOptionApplier:\n\t\t\to.apply(d.relayCfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\td.AddCommand(\"Toggle\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Toggle()\n\t})\n\n\td.AddCommand(\"On\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.On()\n\t})\n\n\td.AddCommand(\"Off\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Off()\n\t})\n\n\treturn d\n}\n\n// WithRelayInverted change the relay action to inverted.\nfunc WithRelayInverted() relayOptionApplier {\n\treturn relayInvertedOption(true)\n}\n\n// State return true if the relay is On and false if the relay is Off\nfunc (d *RelayDriver) State() bool {\n\tif d.relayCfg.inverted {\n\t\treturn !d.high\n\t}\n\treturn d.high\n}\n\n// On sets the relay to a high state.\nfunc (d *RelayDriver) On() error {\n\tnewValue := byte(1)\n\tif d.relayCfg.inverted {\n\t\tnewValue = 0\n\t}\n\tif err := d.digitalWrite(d.driverCfg.pin, newValue); err != nil {\n\t\treturn err\n\t}\n\n\td.high = !d.relayCfg.inverted\n\n\treturn nil\n}\n\n// Off sets the relay to a low state.\nfunc (d *RelayDriver) Off() error {\n\tnewValue := byte(0)\n\tif d.relayCfg.inverted {\n\t\tnewValue = 1\n\t}\n\tif err := d.digitalWrite(d.driverCfg.pin, newValue); err != nil {\n\t\treturn err\n\t}\n\n\td.high = d.relayCfg.inverted\n\n\treturn nil\n}\n\n// Toggle sets the relay to the opposite of it's current state\nfunc (d *RelayDriver) Toggle() error {\n\tif d.State() {\n\t\treturn d.Off()\n\t}\n\n\treturn d.On()\n}\n\n// IsInverted returns true if the relay acts inverted\nfunc (d *RelayDriver) IsInverted() bool {\n\treturn d.relayCfg.inverted\n}\n\nfunc (o relayInvertedOption) String() string {\n\treturn \"relay acts inverted option\"\n}\n\nfunc (o relayInvertedOption) apply(cfg *relayConfiguration) {\n\tcfg.inverted = bool(o)\n}\n"
  },
  {
    "path": "drivers/gpio/relay_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*RelayDriver)(nil)\n\n// Helper to return low/high value for testing\nfunc (l *RelayDriver) High() bool { return l.high }\n\nfunc initTestRelayDriver() (*RelayDriver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn nil\n\t}\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn nil\n\t}\n\treturn NewRelayDriver(a, \"1\"), a\n}\n\nfunc TestNewRelayDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewRelayDriver(a, \"10\")\n\t// assert\n\tassert.IsType(t, &RelayDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"Relay\"))\n\tassert.Equal(t, \"10\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.False(t, d.relayCfg.inverted)\n\tassert.False(t, d.high)\n}\n\nfunc TestNewRelayDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"switch alarm relay\"\n\t)\n\tpanicFunc := func() {\n\t\tNewRelayDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"), aio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewRelayDriver(newGpioTestAdaptor(), \"1\", WithName(myName), WithRelayInverted())\n\t// assert\n\tassert.True(t, d.relayCfg.inverted)\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestRelayToggle(t *testing.T) {\n\td, a := initTestRelayDriver()\n\tvar lastVal byte\n\ta.digitalWriteFunc = func(pin string, val byte) error {\n\t\tlastVal = val\n\t\treturn nil\n\t}\n\n\t_ = d.Off()\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(0), lastVal)\n\t_ = d.Toggle()\n\tassert.True(t, d.State())\n\tassert.Equal(t, byte(1), lastVal)\n\t_ = d.Toggle()\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(0), lastVal)\n}\n\nfunc TestRelayToggleInverted(t *testing.T) {\n\td, a := initTestRelayDriver()\n\tvar lastVal byte\n\ta.digitalWriteFunc = func(pin string, val byte) error {\n\t\tlastVal = val\n\t\treturn nil\n\t}\n\n\tWithRelayInverted().apply(d.relayCfg)\n\t_ = d.Off()\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(1), lastVal)\n\t_ = d.Toggle()\n\tassert.True(t, d.State())\n\tassert.Equal(t, byte(0), lastVal)\n\t_ = d.Toggle()\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(1), lastVal)\n}\n\nfunc TestRelay_Commands(t *testing.T) {\n\td, a := initTestRelayDriver()\n\tvar lastVal byte\n\ta.digitalWriteFunc = func(pin string, val byte) error {\n\t\tlastVal = val\n\t\treturn nil\n\t}\n\n\tassert.Nil(t, d.Command(\"Off\")(nil))\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(0), lastVal)\n\n\tassert.Nil(t, d.Command(\"On\")(nil))\n\tassert.True(t, d.State())\n\tassert.Equal(t, byte(1), lastVal)\n\n\tassert.Nil(t, d.Command(\"Toggle\")(nil))\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(0), lastVal)\n}\n\nfunc TestRelay_CommandsInverted(t *testing.T) {\n\td, a := initTestRelayDriver()\n\tvar lastVal byte\n\ta.digitalWriteFunc = func(pin string, val byte) error {\n\t\tlastVal = val\n\t\treturn nil\n\t}\n\tWithRelayInverted().apply(d.relayCfg)\n\n\tassert.Nil(t, d.Command(\"Off\")(nil))\n\tassert.True(t, d.High())\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(1), lastVal)\n\n\tassert.Nil(t, d.Command(\"On\")(nil))\n\tassert.False(t, d.High())\n\tassert.True(t, d.State())\n\tassert.Equal(t, byte(0), lastVal)\n\n\tassert.Nil(t, d.Command(\"Toggle\")(nil))\n\tassert.True(t, d.High())\n\tassert.False(t, d.State())\n\tassert.Equal(t, byte(1), lastVal)\n}\n"
  },
  {
    "path": "drivers/gpio/rgb_led_driver.go",
    "content": "package gpio\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// RgbLedDriver represents a digital RGB Led\ntype RgbLedDriver struct {\n\t*driver\n\n\tpinRed     string\n\tredColor   byte\n\tpinGreen   string\n\tgreenColor byte\n\tpinBlue    string\n\tblueColor  byte\n\thigh       bool\n}\n\n// NewRgbLedDriver return a new RgbLedDriver given a PwmWriter and 3 pins: redPin, greenPin, and bluePin\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\n// Adds the following API Commands:\n//\n//\t\"SetRGB\" - See RgbLedDriver.SetRGB\n//\t\"Toggle\" - See RgbLedDriver.Toggle\n//\t\"On\" - See RgbLedDriver.On\n//\t\"Off\" - See RgbLedDriver.Off\nfunc NewRgbLedDriver(a PwmWriter, redPin string, greenPin string, bluePin string, opts ...interface{}) *RgbLedDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &RgbLedDriver{\n\t\tdriver:   newDriver(a.(gobot.Connection), \"RGBLED\", opts...),\n\t\tpinRed:   redPin,\n\t\tpinGreen: greenPin,\n\t\tpinBlue:  bluePin,\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetRGB\", func(params map[string]interface{}) interface{} {\n\t\tr := byte(params[\"r\"].(int))\n\t\tg := byte(params[\"g\"].(int))\n\t\tb := byte(params[\"b\"].(int))\n\t\treturn d.SetRGB(r, g, b)\n\t})\n\n\td.AddCommand(\"Toggle\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Toggle()\n\t})\n\n\td.AddCommand(\"On\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.On()\n\t})\n\n\td.AddCommand(\"Off\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Off()\n\t})\n\n\treturn d\n}\n\n// Pin returns the RgbLedDrivers pins\nfunc (d *RgbLedDriver) Pin() string {\n\treturn \"r=\" + d.pinRed + \", g=\" + d.pinGreen + \", b=\" + d.pinBlue\n}\n\n// RedPin returns the RgbLedDrivers redPin\nfunc (d *RgbLedDriver) RedPin() string { return d.pinRed }\n\n// GreenPin returns the RgbLedDrivers redPin\nfunc (d *RgbLedDriver) GreenPin() string { return d.pinGreen }\n\n// BluePin returns the RgbLedDrivers bluePin\nfunc (d *RgbLedDriver) BluePin() string { return d.pinBlue }\n\n// State return true if the led is On and false if the led is Off\nfunc (d *RgbLedDriver) State() bool {\n\treturn d.high\n}\n\n// On sets the led's pins to their various states\nfunc (d *RgbLedDriver) On() error {\n\tif err := d.SetLevel(d.pinRed, d.redColor); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.SetLevel(d.pinGreen, d.greenColor); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.SetLevel(d.pinBlue, d.blueColor); err != nil {\n\t\treturn err\n\t}\n\n\td.high = true\n\treturn nil\n}\n\n// Off sets the led to black.\nfunc (d *RgbLedDriver) Off() error {\n\tif err := d.SetLevel(d.pinRed, 0); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.SetLevel(d.pinGreen, 0); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.SetLevel(d.pinBlue, 0); err != nil {\n\t\treturn err\n\t}\n\n\td.high = false\n\treturn nil\n}\n\n// Toggle sets the led to the opposite of it's current state\nfunc (d *RgbLedDriver) Toggle() error {\n\tif d.State() {\n\t\treturn d.Off()\n\t}\n\n\treturn d.On()\n}\n\n// SetLevel sets the led to the specified color level\nfunc (d *RgbLedDriver) SetLevel(pin string, level byte) error {\n\treturn d.pwmWrite(pin, level)\n}\n\n// SetRGB sets the Red Green Blue value of the LED.\nfunc (d *RgbLedDriver) SetRGB(r, g, b byte) error {\n\td.redColor = r\n\td.greenColor = g\n\td.blueColor = b\n\n\treturn d.On()\n}\n"
  },
  {
    "path": "drivers/gpio/rgb_led_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage gpio\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*RgbLedDriver)(nil)\n\nfunc initTestRgbLedDriver() *RgbLedDriver {\n\ta := newGpioTestAdaptor()\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn nil\n\t}\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn nil\n\t}\n\treturn NewRgbLedDriver(a, \"1\", \"2\", \"3\")\n}\n\nfunc TestNewRgbLedDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewRgbLedDriver(a, \"10\", \"20\", \"30\")\n\t// assert\n\tassert.IsType(t, &RgbLedDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"RGBLED\"))\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.Equal(t, \"10\", d.RedPin())\n\tassert.Equal(t, \"20\", d.GreenPin())\n\tassert.Equal(t, \"30\", d.BluePin())\n\tassert.Equal(t, \"r=10, g=20, b=30\", d.Pin())\n\tassert.Equal(t, uint8(0), d.redColor)\n\tassert.Equal(t, uint8(0), d.greenColor)\n\tassert.Equal(t, uint8(0), d.blueColor)\n\tassert.False(t, d.high)\n}\n\nfunc TestNewRgbLedDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"colored light\"\n\t)\n\tpanicFunc := func() {\n\t\tNewRgbLedDriver(newGpioTestAdaptor(), \"1\", \"2\", \"3\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewRgbLedDriver(newGpioTestAdaptor(), \"1\", \"2\", \"3\", WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestRgbLed_Commands(t *testing.T) {\n\tvar err interface{}\n\n\ta := newGpioTestAdaptor()\n\td := NewRgbLedDriver(a, \"1\", \"2\", \"3\")\n\n\ta.digitalWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"write error\")\n\t}\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"pwm error\")\n\t}\n\n\terr = d.Command(\"Toggle\")(nil)\n\trequire.EqualError(t, err.(error), \"pwm error\")\n\n\terr = d.Command(\"On\")(nil)\n\trequire.EqualError(t, err.(error), \"pwm error\")\n\n\terr = d.Command(\"Off\")(nil)\n\trequire.EqualError(t, err.(error), \"pwm error\")\n\n\terr = d.Command(\"SetRGB\")(map[string]interface{}{\"r\": 0xff, \"g\": 0xff, \"b\": 0xff})\n\trequire.EqualError(t, err.(error), \"pwm error\")\n}\n\nfunc TestRgbLedDriverToggle(t *testing.T) {\n\td := initTestRgbLedDriver()\n\t_ = d.Off()\n\t_ = d.Toggle()\n\tassert.True(t, d.State())\n\t_ = d.Toggle()\n\tassert.False(t, d.State())\n}\n\nfunc TestRgbLedSetLevel(t *testing.T) {\n\ta := newGpioTestAdaptor()\n\td := NewRgbLedDriver(a, \"1\", \"2\", \"3\")\n\trequire.NoError(t, d.SetLevel(\"1\", 150))\n\n\td = NewRgbLedDriver(a, \"1\", \"2\", \"3\")\n\ta.pwmWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"pwm error\")\n\t}\n\trequire.EqualError(t, d.SetLevel(\"1\", 150), \"pwm error\")\n}\n"
  },
  {
    "path": "drivers/gpio/servo_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// ServoDriver Represents a Servo\ntype ServoDriver struct {\n\t*driver\n\n\tcurrentAngle byte\n}\n\n// NewServoDriver returns a new ServoDriver given a ServoWriter and pin.\n//\n// Supported options:\n//\n//\t\"WithName\"\n//\n// Adds the following API Commands:\n//\n//\t\"Move\" - See ServoDriver.Move\n//\t\"Min\" - See ServoDriver.ToMin\n//\t\"Center\" - See ServoDriver.ToCenter\n//\t\"Max\" - See ServoDriver.ToMax\nfunc NewServoDriver(a ServoWriter, pin string, opts ...interface{}) *ServoDriver {\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &ServoDriver{\n\t\tdriver: newDriver(a.(gobot.Connection), \"Servo\", append(opts, withPin(pin))...),\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Move\", func(params map[string]interface{}) interface{} {\n\t\tangle := byte(params[\"angle\"].(float64))\n\t\treturn d.Move(angle)\n\t})\n\td.AddCommand(\"ToMin\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.ToMin()\n\t})\n\td.AddCommand(\"ToCenter\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.ToCenter()\n\t})\n\td.AddCommand(\"ToMax\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.ToMax()\n\t})\n\n\treturn d\n}\n\n// Move sets the servo to the specified angle. Acceptable angles are 0-180\nfunc (d *ServoDriver) Move(angle uint8) error {\n\tif angle > 180 {\n\t\treturn fmt.Errorf(\"servo angle (%d) must be between 0-180\", angle)\n\t}\n\td.currentAngle = angle\n\treturn d.servoWrite(d.driverCfg.pin, angle)\n}\n\n// Min sets the servo to it's minimum position\nfunc (d *ServoDriver) ToMin() error {\n\treturn d.Move(0)\n}\n\n// Center sets the servo to it's center position\nfunc (d *ServoDriver) ToCenter() error {\n\treturn d.Move(90)\n}\n\n// Max sets the servo to its maximum position\nfunc (d *ServoDriver) ToMax() error {\n\treturn d.Move(180)\n}\n\n// Angle returns the current angle\nfunc (d *ServoDriver) Angle() uint8 {\n\treturn d.currentAngle\n}\n"
  },
  {
    "path": "drivers/gpio/servo_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage gpio\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*ServoDriver)(nil)\n\nfunc initTestServoDriver() *ServoDriver {\n\treturn NewServoDriver(newGpioTestAdaptor(), \"1\")\n}\n\nfunc TestNewServoDriver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewServoDriver(a, \"10\")\n\t// assert\n\tassert.IsType(t, &ServoDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"Servo\"))\n\tassert.Equal(t, \"10\", d.driverCfg.pin)\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.Equal(t, uint8(0), d.currentAngle)\n}\n\nfunc TestNewServoDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"left wheel\"\n\t)\n\tpanicFunc := func() {\n\t\tNewServoDriver(newGpioTestAdaptor(), \"1\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewServoDriver(newGpioTestAdaptor(), \"1\", WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestServo_Commands(t *testing.T) {\n\tvar err interface{}\n\n\ta := newGpioTestAdaptor()\n\td := NewServoDriver(a, \"1\")\n\n\ta.servoWriteFunc = func(string, byte) error {\n\t\treturn errors.New(\"pwm error\")\n\t}\n\n\terr = d.Command(\"ToMin\")(nil)\n\trequire.EqualError(t, err.(error), \"pwm error\")\n\n\terr = d.Command(\"ToCenter\")(nil)\n\trequire.EqualError(t, err.(error), \"pwm error\")\n\n\terr = d.Command(\"ToMax\")(nil)\n\trequire.EqualError(t, err.(error), \"pwm error\")\n\n\terr = d.Command(\"Move\")(map[string]interface{}{\"angle\": 100.0})\n\trequire.EqualError(t, err.(error), \"pwm error\")\n}\n\nfunc TestServoMove(t *testing.T) {\n\td := initTestServoDriver()\n\t_ = d.Move(100)\n\tassert.Equal(t, uint8(100), d.currentAngle)\n\terr := d.Move(200)\n\trequire.EqualError(t, err, \"servo angle (200) must be between 0-180\")\n}\n\nfunc TestServoMin(t *testing.T) {\n\td := initTestServoDriver()\n\t_ = d.ToMin()\n\tassert.Equal(t, uint8(0), d.currentAngle)\n\tassert.Equal(t, d.currentAngle, d.Angle())\n}\n\nfunc TestServoMax(t *testing.T) {\n\td := initTestServoDriver()\n\t_ = d.ToMax()\n\tassert.Equal(t, uint8(180), d.currentAngle)\n}\n\nfunc TestServoCenter(t *testing.T) {\n\td := initTestServoDriver()\n\t_ = d.ToCenter()\n\tassert.Equal(t, uint8(90), d.currentAngle)\n}\n"
  },
  {
    "path": "drivers/gpio/stepper_driver.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"math\"\n\t\"os\"\n\t\"os/signal\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\tstepperDriverDebug = false\n\n\t// StepperDriverForward is to set the stepper to run in forward direction (e.g. turn clock wise)\n\tStepperDriverForward = \"forward\"\n\t// StepperDriverBackward is to set the stepper to run in backward direction (e.g. turn counter clock wise)\n\tStepperDriverBackward = \"backward\"\n)\n\ntype phase [][4]byte\n\n// StepperModes to decide on Phase and Stepping\nvar StepperModes = struct {\n\tSinglePhaseStepping phase\n\tDualPhaseStepping   phase\n\tHalfStepping        phase\n}{\n\t// 1 cycle = 4 steps with lesser torque\n\tSinglePhaseStepping: phase{\n\t\t{1, 0, 0, 0},\n\t\t{0, 1, 0, 0},\n\t\t{0, 0, 1, 0},\n\t\t{0, 0, 0, 1},\n\t},\n\t// 1 cycle = 4 steps with higher torque and current\n\tDualPhaseStepping: phase{\n\t\t{1, 0, 0, 1},\n\t\t{1, 1, 0, 0},\n\t\t{0, 1, 1, 0},\n\t\t{0, 0, 1, 1},\n\t},\n\t// 1 cycle = 8 steps with lesser torque than full stepping\n\tHalfStepping: phase{\n\t\t{1, 0, 0, 1},\n\t\t{1, 0, 0, 0},\n\t\t{1, 1, 0, 0},\n\t\t{0, 1, 0, 0},\n\t\t{0, 1, 1, 0},\n\t\t{0, 0, 1, 0},\n\t\t{0, 0, 1, 1},\n\t\t{0, 0, 0, 1},\n\t},\n}\n\n// StepperDriver is a common driver for stepper motors. It supports 3 different stepping modes.\ntype StepperDriver struct {\n\t*driver\n\n\tpins        [4]string\n\tphase       phase\n\tstepsPerRev float32\n\n\tstepperDebug   bool\n\tspeedRpm       uint\n\tdirection      string\n\tskipStepErrors bool\n\thaltIfRunning  bool // stop automatically if run is called\n\tdisabled       bool\n\tvalueMutex     *sync.Mutex // to ensure that read and write of values do not interfere\n\n\tstepFunc          func() error\n\tsleepFunc         func() error\n\tstepNum           int\n\tstopAsynchRunFunc func(bool) error\n}\n\n// NewStepperDriver returns a new StepperDriver given a DigitalWriter\n// Pins - To which the stepper is connected\n// Phase - Defined by StepperModes {SinglePhaseStepping, DualPhaseStepping, HalfStepping}\n// Steps - No of steps per revolution of Stepper motor\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc NewStepperDriver(\n\ta DigitalWriter,\n\tpins [4]string,\n\tphase phase,\n\tstepsPerRev uint,\n\topts ...interface{},\n) *StepperDriver {\n\tif stepsPerRev <= 0 {\n\t\tpanic(\"steps per revolution needs to be greater than zero\")\n\t}\n\t//nolint:forcetypeassert // no error return value, so there is no better way\n\td := &StepperDriver{\n\t\tdriver:         newDriver(a.(gobot.Connection), \"Stepper\", opts...),\n\t\tpins:           pins,\n\t\tphase:          phase,\n\t\tstepsPerRev:    float32(stepsPerRev),\n\t\tstepperDebug:   stepperDriverDebug,\n\t\tskipStepErrors: false,\n\t\thaltIfRunning:  true,\n\t\tdirection:      StepperDriverForward,\n\t\tstepNum:        0,\n\t\tspeedRpm:       1,\n\t\tvalueMutex:     &sync.Mutex{},\n\t}\n\td.speedRpm = d.MaxSpeed()\n\td.stepFunc = d.phasedStepping\n\td.sleepFunc = d.sleepOuputs\n\td.beforeHalt = d.shutdown\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"MoveDeg\", func(params map[string]interface{}) interface{} {\n\t\tdegs, _ := strconv.Atoi(params[\"degs\"].(string))\n\t\treturn d.MoveDeg(degs)\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Move\", func(params map[string]interface{}) interface{} {\n\t\tsteps, _ := strconv.Atoi(params[\"steps\"].(string))\n\t\treturn d.Move(steps)\n\t})\n\td.AddCommand(\"Step\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Move(1)\n\t})\n\td.AddCommand(\"Run\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Run()\n\t})\n\td.AddCommand(\"Sleep\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Sleep()\n\t})\n\td.AddCommand(\"Stop\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Stop()\n\t})\n\td.AddCommand(\"Halt\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Halt()\n\t})\n\n\treturn d\n}\n\n// Move moves the motor for given number of steps.\nfunc (d *StepperDriver) Move(stepsToMove int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.stepAsynch(float64(stepsToMove)); err != nil {\n\t\t// something went wrong with preparation\n\t\treturn err\n\t}\n\n\terr := d.stopAsynchRunFunc(false) // wait to finish with err or nil\n\td.stopAsynchRunFunc = nil\n\n\treturn err\n}\n\n// MoveDeg moves the motor given number of degrees at current speed. Negative values cause to move backward.\nfunc (d *StepperDriver) MoveDeg(degs int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tstepsToMove := float64(degs) * float64(d.stepsPerRev) / 360\n\n\tif err := d.stepAsynch(stepsToMove); err != nil {\n\t\t// something went wrong with preparation\n\t\treturn err\n\t}\n\n\terr := d.stopAsynchRunFunc(false) // wait to finish with err or nil\n\td.stopAsynchRunFunc = nil\n\n\treturn err\n}\n\n// Run runs the stepper continuously. Stop needs to be done with call Stop().\nfunc (d *StepperDriver) Run() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.stepAsynch(float64(math.MaxInt) + 1)\n}\n\n// IsMoving returns a bool stating whether motor is currently in motion\nfunc (d *StepperDriver) IsMoving() bool {\n\treturn d.stopAsynchRunFunc != nil\n}\n\n// Stop running the stepper\nfunc (d *StepperDriver) Stop() error {\n\tif d.stopAsynchRunFunc == nil {\n\t\treturn fmt.Errorf(\"'%s' is not yet started\", d.driverCfg.name)\n\t}\n\n\terr := d.stopAsynchRunFunc(true)\n\td.stopAsynchRunFunc = nil\n\n\treturn err\n}\n\n// Sleep release all pins to the same output level, so no current is consumed anymore.\nfunc (d *StepperDriver) Sleep() error {\n\treturn d.sleepFunc()\n}\n\n// SetDirection sets the direction in which motor should be moving, default is forward.\n// Changing the direction affects the next step, also for asynchronous running.\nfunc (d *StepperDriver) SetDirection(direction string) error {\n\tdirection = strings.ToLower(direction)\n\tif direction != StepperDriverForward && direction != StepperDriverBackward {\n\t\treturn fmt.Errorf(\"invalid direction '%s'. Value should be '%s' or '%s'\",\n\t\t\tdirection, StepperDriverForward, StepperDriverBackward)\n\t}\n\n\t// ensure that write of variable can not interfere with read in step()\n\td.valueMutex.Lock()\n\tdefer d.valueMutex.Unlock()\n\td.direction = direction\n\n\treturn nil\n}\n\n// MaxSpeed gives the max RPM of motor\n// max. speed is limited by:\n// * motor friction, inertia and inductance, load inertia\n// * full step rate is normally below 1000 per second (1kHz), typically not more than ~400 per second\n// * mostly not more than 1000-2000rpm (20-40 revolutions per second) are possible\n// * higher values can be achieved only by ramp-up the velocity\n// * duration of GPIO write (PI1 can reach up to 70kHz, typically 20kHz, so this is most likely not the limiting factor)\n// * the hardware driver, to force the high current transitions for the max. speed\n// * there are CNC steppers with 1000..20.000 steps per revolution, which works with faster step rates (e.g. 200kHz)\nfunc (d *StepperDriver) MaxSpeed() uint {\n\tconst maxStepsPerSecond = 700 // a typical value for a normal, lightly loaded motor\n\treturn uint(float32(60*maxStepsPerSecond) / d.stepsPerRev)\n}\n\n// SetSpeed sets the rpm for the next move or run. A valid value is between 1 and MaxSpeed().\n// The run needs to be stopped and called again after set this value.\nfunc (d *StepperDriver) SetSpeed(rpm uint) error {\n\tvar err error\n\tif rpm <= 0 {\n\t\trpm = 0\n\t\terr = fmt.Errorf(\"RPM (%d) cannot be a zero or negative value\", rpm)\n\t}\n\n\tmaxRpm := d.MaxSpeed()\n\tif rpm > maxRpm {\n\t\trpm = maxRpm\n\t\terr = fmt.Errorf(\"RPM (%d) cannot be greater then maximal value %d\", rpm, maxRpm)\n\t}\n\n\td.valueMutex.Lock()\n\tdefer d.valueMutex.Unlock()\n\td.speedRpm = rpm\n\n\treturn err\n}\n\n// CurrentStep gives the current step of motor\nfunc (d *StepperDriver) CurrentStep() int {\n\t// ensure that read can not interfere with write in step()\n\td.valueMutex.Lock()\n\tdefer d.valueMutex.Unlock()\n\n\treturn d.stepNum\n}\n\n// SetHaltIfRunning with the given value. Normally a call of Run() returns an error if already running. If set this\n// to true, the next call of Run() cause a automatic stop before.\nfunc (d *StepperDriver) SetHaltIfRunning(val bool) {\n\td.haltIfRunning = val\n}\n\n// shutdown the driver\nfunc (d *StepperDriver) shutdown() error {\n\t// stops the continuous motion of the stepper, if running\n\treturn d.stopIfRunning()\n}\n\nfunc (d *StepperDriver) stepAsynch(stepsToMove float64) error {\n\tif d.disabled {\n\t\treturn fmt.Errorf(\"'%s' is disabled and can not be running or moving\", d.driverCfg.name)\n\t}\n\n\t// if running, return error or stop automatically\n\tif d.stopAsynchRunFunc != nil {\n\t\tif !d.haltIfRunning {\n\t\t\treturn fmt.Errorf(\"'%s' already running or moving\", d.driverCfg.name)\n\t\t}\n\t\td.debug(\"stop former run forcefully\")\n\t\tif err := d.stopAsynchRunFunc(true); err != nil {\n\t\t\td.stopAsynchRunFunc = nil\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// prepare stepping behavior\n\tstepsLeft := uint64(math.Abs(stepsToMove))\n\tif stepsLeft == 0 {\n\t\treturn fmt.Errorf(\"no steps to do for '%s'\", d.driverCfg.name)\n\t}\n\n\t// t [min] = steps [st] / (steps_per_revolution [st/u] * speed [u/min]) or\n\t// t [min] = steps [st] * delay_per_step [min/st], use safety factor 2 and a small offset of 100 ms\n\t// prepare this timeout outside of stop function to prevent data race with stepsLeft\n\t//nolint:gosec // TODO: fix later\n\tstopTimeout := time.Duration(2*stepsLeft)*d.getDelayPerStep() + 100*time.Millisecond\n\tendlessMovement := false\n\n\tif stepsLeft > math.MaxInt {\n\t\tstopTimeout = 100 * time.Millisecond\n\t\tendlessMovement = true\n\t} else {\n\t\td.direction = \"forward\"\n\t\tif stepsToMove < 0 {\n\t\t\td.direction = \"backward\"\n\t\t}\n\t}\n\n\t// prepare new asynchronous stepping\n\tonceDoneChan := make(chan struct{})\n\trunStopChan := make(chan struct{})\n\trunErrChan := make(chan error)\n\n\tsigChan := make(chan os.Signal, 1)\n\tsignal.Notify(sigChan, os.Interrupt)\n\n\td.stopAsynchRunFunc = func(forceStop bool) error {\n\t\tdefer func() {\n\t\t\td.debug(\"RUN: cleanup stop channel\")\n\t\t\tif runStopChan != nil {\n\t\t\t\tclose(runStopChan)\n\t\t\t}\n\t\t\trunStopChan = nil\n\t\t\td.debug(\"STOP: cleanup err channel\")\n\t\t\tif runErrChan != nil {\n\t\t\t\tclose(runErrChan)\n\t\t\t}\n\t\t\trunErrChan = nil\n\t\t\td.debug(\"STOP: cleanup done\")\n\t\t}()\n\n\t\td.debug(\"STOP: wait for once done\")\n\t\t<-onceDoneChan // wait for the first step was called\n\n\t\t// send stop for endless movement or a forceful stop happen\n\t\tif endlessMovement || forceStop {\n\t\t\td.debug(\"STOP: send stop channel\")\n\t\t\trunStopChan <- struct{}{}\n\t\t}\n\n\t\tif !endlessMovement && forceStop {\n\t\t\t// do not wait if an normal movement was stopped forcefully\n\t\t\tlog.Printf(\"'%s' was forcefully stopped\\n\", d.driverCfg.name)\n\t\t\treturn nil\n\t\t}\n\n\t\t// wait for go routine is finished and cleanup\n\t\td.debug(fmt.Sprintf(\"STOP: wait %s for err channel\", stopTimeout))\n\t\tselect {\n\t\tcase err := <-runErrChan:\n\t\t\treturn err\n\t\tcase <-time.After(stopTimeout):\n\t\t\treturn fmt.Errorf(\"'%s' was not finished in %s\", d.driverCfg.name, stopTimeout)\n\t\t}\n\t}\n\n\td.debug(fmt.Sprintf(\"going to start go routine - endless=%t, steps=%d\", endlessMovement, stepsLeft))\n\tgo func(name string) {\n\t\tvar err error\n\t\tvar onceDone bool\n\t\tdefer func() {\n\t\t\t// some cases here:\n\t\t\t// * stop by stop channel: error should be send as nil\n\t\t\t// * count of steps reached: error should be send as nil\n\t\t\t// * write error occurred\n\t\t\t//    * for Run(): caller needs to send stop channel and read the error\n\t\t\t//    * for Move(): caller waits for the error, but don't send stop channel\n\t\t\t//\n\t\t\td.debug(fmt.Sprintf(\"RUN: write '%v' to err channel\", err))\n\t\t\trunErrChan <- err\n\t\t}()\n\t\tfor stepsLeft > 0 {\n\t\t\tselect {\n\t\t\tcase <-sigChan:\n\t\t\t\td.debug(\"RUN: OS signal received\")\n\t\t\t\terr = fmt.Errorf(\"OS signal received\")\n\t\t\t\treturn\n\t\t\tcase <-runStopChan:\n\t\t\t\td.debug(\"RUN: stop channel received\")\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\tif err == nil {\n\t\t\t\t\terr = d.stepFunc()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tif d.skipStepErrors {\n\t\t\t\t\t\t\tfmt.Printf(\"step skipped for '%s': %v\\n\", name, err)\n\t\t\t\t\t\t\terr = nil\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\td.debug(\"RUN: write error occurred\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif !onceDone {\n\t\t\t\t\t\tclose(onceDoneChan) // to inform that we are ready for stop now\n\t\t\t\t\t\tonceDone = true\n\t\t\t\t\t\td.debug(\"RUN: once done\")\n\t\t\t\t\t}\n\t\t\t\t\tif !endlessMovement {\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstepsLeft--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}(d.driverCfg.name)\n\n\treturn nil\n}\n\n// getDelayPerStep gives the delay per step\n// formula: delay_per_step [min] = 1/(steps_per_revolution * speed [rpm])\nfunc (d *StepperDriver) getDelayPerStep() time.Duration {\n\t// considering a max. speed of 1000 rpm and max. 1000 steps per revolution, a microsecond resolution is needed\n\t// if the motor or application needs bigger values, switch to nanosecond is needed\n\treturn time.Duration(60*1000*1000/(d.stepsPerRev*float32(d.speedRpm))) * time.Microsecond\n}\n\n// phasedStepping moves the motor one step with the configured speed and direction. The speed can be adjusted\n// by SetSpeed() and the direction can be changed by SetDirection() asynchronously.\nfunc (d *StepperDriver) phasedStepping() error {\n\t// ensure that read and write of variables (direction, stepNum) can not interfere\n\td.valueMutex.Lock()\n\tdefer d.valueMutex.Unlock()\n\n\toldStepNum := d.stepNum\n\n\tif d.direction == StepperDriverForward {\n\t\td.stepNum++\n\t} else {\n\t\td.stepNum--\n\t}\n\n\tif d.stepNum >= int(d.stepsPerRev) {\n\t\td.stepNum = 0\n\t} else if d.stepNum < 0 {\n\t\td.stepNum = int(d.stepsPerRev) - 1\n\t}\n\n\tr := int(math.Abs(float64(d.stepNum))) % len(d.phase)\n\n\tfor i, v := range d.phase[r] {\n\t\tif err := d.digitalWrite(d.pins[i], v); err != nil {\n\t\t\td.stepNum = oldStepNum\n\t\t\treturn err\n\t\t}\n\t}\n\n\tdelay := d.getDelayPerStep()\n\ttime.Sleep(delay)\n\n\treturn nil\n}\n\nfunc (d *StepperDriver) sleepOuputs() error {\n\tfor _, pin := range d.pins {\n\t\tif err := d.digitalWrite(pin, 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// stopIfRunning stop the stepper if moving or running\nfunc (d *StepperDriver) stopIfRunning() error {\n\t// stops the continuous motion of the stepper, if running\n\tif d.stopAsynchRunFunc == nil {\n\t\treturn nil\n\t}\n\n\terr := d.stopAsynchRunFunc(true)\n\td.stopAsynchRunFunc = nil\n\n\treturn err\n}\n\nfunc (d *StepperDriver) debug(text string) {\n\tif d.stepperDebug {\n\t\tfmt.Println(text)\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/stepper_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nfunc initTestStepperDriverWithStubbedAdaptor() (*StepperDriver, *gpioTestAdaptor) {\n\tconst stepsPerRev = 32\n\n\ta := newGpioTestAdaptor()\n\td := NewStepperDriver(a, [4]string{\"7\", \"11\", \"13\", \"15\"}, StepperModes.DualPhaseStepping, stepsPerRev)\n\treturn d, a\n}\n\nfunc TestNewStepperDriver(t *testing.T) {\n\t// arrange\n\tconst stepsPerRev = 32\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewStepperDriver(a, [4]string{\"7\", \"11\", \"13\", \"15\"}, StepperModes.DualPhaseStepping, stepsPerRev)\n\t// assert\n\tassert.IsType(t, &StepperDriver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"Stepper\"))\n\tassert.Equal(t, a, d.connection)\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.Equal(t, \"forward\", d.direction)\n\tassert.Equal(t, StepperModes.DualPhaseStepping, d.phase)\n\tassert.InDelta(t, float32(stepsPerRev), d.stepsPerRev, 0.0)\n\tassert.Equal(t, 0, d.stepNum)\n\tassert.Nil(t, d.stopAsynchRunFunc)\n}\n\nfunc TestNewStepperDriver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"left wheel\"\n\t)\n\tpanicFunc := func() {\n\t\tNewStepperDriver(newGpioTestAdaptor(), [4]string{\"7\", \"11\", \"13\", \"15\"}, StepperModes.DualPhaseStepping,\n\t\t\t32, WithName(\"crazy\"), aio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewStepperDriver(newGpioTestAdaptor(), [4]string{\"7\", \"11\", \"13\", \"15\"}, StepperModes.DualPhaseStepping,\n\t\t32, WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestStepperMove_IsMoving(t *testing.T) {\n\tconst stepsPerRev = 32\n\n\ttests := map[string]struct {\n\t\tinputSteps             int\n\t\tnoAutoStopIfRunning    bool\n\t\tsimulateAlreadyRunning bool\n\t\tsimulateWriteErr       bool\n\t\twantWrites             int\n\t\twantSteps              int\n\t\twantMoving             bool\n\t\twantErr                string\n\t}{\n\t\t\"move_forward\": {\n\t\t\tinputSteps: 2,\n\t\t\twantWrites: 8,\n\t\t\twantSteps:  2,\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"move_more_forward\": {\n\t\t\tinputSteps: 10,\n\t\t\twantWrites: 40,\n\t\t\twantSteps:  10,\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"move_forward_full_revolution\": {\n\t\t\tinputSteps: stepsPerRev,\n\t\t\twantWrites: 128,\n\t\t\twantSteps:  0, // will be reset after each revision\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"move_backward\": {\n\t\t\tinputSteps: -2,\n\t\t\twantWrites: 8,\n\t\t\twantSteps:  stepsPerRev - 2,\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"move_more_backward\": {\n\t\t\tinputSteps: -10,\n\t\t\twantWrites: 40,\n\t\t\twantSteps:  stepsPerRev - 10,\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"move_backward_full_revolution\": {\n\t\t\tinputSteps: -stepsPerRev,\n\t\t\twantWrites: 128,\n\t\t\twantSteps:  0, // will be reset after each revision\n\t\t\twantMoving: false,\n\t\t},\n\t\t\"already_running_autostop\": {\n\t\t\tinputSteps:             3,\n\t\t\tsimulateAlreadyRunning: true,\n\t\t\twantWrites:             12,\n\t\t\twantSteps:              3,\n\t\t\twantMoving:             false,\n\t\t},\n\t\t\"error_already_running\": {\n\t\t\tnoAutoStopIfRunning:    true,\n\t\t\tsimulateAlreadyRunning: true,\n\t\t\twantMoving:             true,\n\t\t\twantErr:                \"already running or moving\",\n\t\t},\n\t\t\"error_no_steps\": {\n\t\t\tinputSteps: 0,\n\t\t\twantWrites: 0,\n\t\t\twantSteps:  0,\n\t\t\twantMoving: false,\n\t\t\twantErr:    \"no steps to do\",\n\t\t},\n\t\t\"error_write\": {\n\t\t\tinputSteps:       1,\n\t\t\tsimulateWriteErr: true,\n\t\t\twantWrites:       0,\n\t\t\twantMoving:       false,\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestStepperDriverWithStubbedAdaptor()\n\t\t\tdefer func() {\n\t\t\t\t// for cleanup dangling channels\n\t\t\t\tif d.stopAsynchRunFunc != nil {\n\t\t\t\t\terr := d.stopAsynchRunFunc(true)\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t}\n\t\t\t}()\n\t\t\t// arrange: different behavior\n\t\t\td.haltIfRunning = !tc.noAutoStopIfRunning\n\t\t\tif tc.simulateAlreadyRunning {\n\t\t\t\td.stopAsynchRunFunc = func(bool) error { log.Println(\"former run stopped\"); return nil }\n\t\t\t}\n\t\t\t// arrange: writes\n\t\t\ta.written = nil // reset writes of Start()\n\t\t\ta.simulateWriteError = tc.simulateWriteErr\n\t\t\t// act\n\t\t\terr := d.Move(tc.inputSteps)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantSteps, d.stepNum)\n\t\t\tassert.Len(t, a.written, tc.wantWrites)\n\t\t\tassert.Equal(t, tc.wantMoving, d.IsMoving())\n\t\t})\n\t}\n}\n\nfunc TestStepperRun_IsMoving(t *testing.T) {\n\ttests := map[string]struct {\n\t\tnoAutoStopIfRunning    bool\n\t\tsimulateAlreadyRunning bool\n\t\tsimulateWriteErr       bool\n\t\twantMoving             bool\n\t\twantErr                string\n\t}{\n\t\t\"run\": {\n\t\t\twantMoving: true,\n\t\t},\n\t\t\"error_write\": {\n\t\t\tsimulateWriteErr: true,\n\t\t\twantMoving:       true,\n\t\t},\n\t\t\"error_already_running\": {\n\t\t\tnoAutoStopIfRunning:    true,\n\t\t\tsimulateAlreadyRunning: true,\n\t\t\twantMoving:             true,\n\t\t\twantErr:                \"already running or moving\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestStepperDriverWithStubbedAdaptor()\n\t\t\tdefer func() {\n\t\t\t\t// for cleanup dangling channels\n\t\t\t\tif d.stopAsynchRunFunc != nil {\n\t\t\t\t\terr := d.stopAsynchRunFunc(true)\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t}\n\t\t\t}()\n\t\t\t// arrange: different behavior\n\t\t\twriteChan := make(chan struct{})\n\t\t\tif tc.noAutoStopIfRunning {\n\t\t\t\t// in this case no write should be called\n\t\t\t\tclose(writeChan)\n\t\t\t\twriteChan = nil\n\t\t\t\td.haltIfRunning = false\n\t\t\t} else {\n\t\t\t\td.haltIfRunning = true\n\t\t\t}\n\t\t\tif tc.simulateAlreadyRunning {\n\t\t\t\td.stopAsynchRunFunc = func(bool) error { return nil }\n\t\t\t}\n\t\t\t// arrange: writes\n\t\t\tsimWriteErr := tc.simulateWriteErr // to prevent data race in write function (go-called)\n\t\t\tvar firstWriteDone bool\n\t\t\ta.digitalWriteFunc = func(string, byte) error {\n\t\t\t\tif firstWriteDone {\n\t\t\t\t\treturn nil // to prevent to much output and write to channel\n\t\t\t\t}\n\t\t\t\twriteChan <- struct{}{}\n\t\t\t\tfirstWriteDone = true\n\t\t\t\tif simWriteErr {\n\t\t\t\t\treturn fmt.Errorf(\"write error\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.Run()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantMoving, d.IsMoving())\n\t\t\tif writeChan != nil {\n\t\t\t\t// wait until the first write was called and a little bit longer\n\t\t\t\t<-writeChan\n\t\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t\t\tvar asynchErr error\n\t\t\t\tif d.stopAsynchRunFunc != nil {\n\t\t\t\t\tasynchErr = d.stopAsynchRunFunc(false)\n\t\t\t\t\td.stopAsynchRunFunc = nil\n\t\t\t\t}\n\t\t\t\tif tc.simulateWriteErr {\n\t\t\t\t\trequire.Error(t, asynchErr)\n\t\t\t\t} else {\n\t\t\t\t\trequire.NoError(t, asynchErr)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestStepperStop_IsMoving(t *testing.T) {\n\ttests := map[string]struct {\n\t\trunning bool\n\t\twantErr string\n\t}{\n\t\t\"stop_running\": {\n\t\t\trunning: true,\n\t\t},\n\t\t\"errro_not_started\": {\n\t\t\trunning: false,\n\t\t\twantErr: \"is not yet started\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, _ := initTestStepperDriverWithStubbedAdaptor()\n\t\t\tif tc.running {\n\t\t\t\trequire.NoError(t, d.Run())\n\t\t\t\trequire.True(t, d.IsMoving())\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.Stop()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.False(t, d.IsMoving())\n\t\t})\n\t}\n}\n\nfunc TestStepperHalt_IsMoving(t *testing.T) {\n\ttests := map[string]struct {\n\t\trunning bool\n\t}{\n\t\t\"halt_running\": {\n\t\t\trunning: true,\n\t\t},\n\t\t\"halt_not_started\": {\n\t\t\trunning: false,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, _ := initTestStepperDriverWithStubbedAdaptor()\n\t\t\tif tc.running {\n\t\t\t\trequire.NoError(t, d.Run())\n\t\t\t\trequire.True(t, d.IsMoving())\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.Halt()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.False(t, d.IsMoving())\n\t\t})\n\t}\n}\n\nfunc TestStepperSetDirection(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinput   string\n\t\twantVal string\n\t\twantErr string\n\t}{\n\t\t\"direction_forward\": {\n\t\t\tinput:   \"forward\",\n\t\t\twantVal: \"forward\",\n\t\t},\n\t\t\"direction_backward\": {\n\t\t\tinput:   \"backward\",\n\t\t\twantVal: \"backward\",\n\t\t},\n\t\t\"error_invalid_direction\": {\n\t\t\tinput:   \"reverse\",\n\t\t\twantVal: \"forward\",\n\t\t\twantErr: \"invalid direction 'reverse'\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, _ := initTestStepperDriverWithStubbedAdaptor()\n\t\t\trequire.Equal(t, \"forward\", d.direction)\n\t\t\t// act\n\t\t\terr := d.SetDirection(tc.input)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantVal, d.direction)\n\t\t})\n\t}\n}\n\nfunc TestStepperMaxSpeed(t *testing.T) {\n\tconst delayForMaxSpeed = 1428 * time.Microsecond // 1/700Hz\n\n\ttests := map[string]struct {\n\t\tstepsPerRev float32\n\t\twant        uint\n\t}{\n\t\t\"maxspeed_for_20spr\": {\n\t\t\tstepsPerRev: 20,\n\t\t\twant:        2100,\n\t\t},\n\t\t\"maxspeed_for_50spr\": {\n\t\t\tstepsPerRev: 50,\n\t\t\twant:        840,\n\t\t},\n\t\t\"maxspeed_for_100spr\": {\n\t\t\tstepsPerRev: 100,\n\t\t\twant:        420,\n\t\t},\n\t\t\"maxspeed_for_400spr\": {\n\t\t\tstepsPerRev: 400,\n\t\t\twant:        105,\n\t\t},\n\t\t\"maxspeed_for_1000spr\": {\n\t\t\tstepsPerRev: 1000,\n\t\t\twant:        42,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := StepperDriver{stepsPerRev: tc.stepsPerRev}\n\t\t\t// act\n\t\t\tgot := d.MaxSpeed()\n\t\t\td.speedRpm = got\n\t\t\tgot2 := d.getDelayPerStep()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, delayForMaxSpeed, got2)\n\t\t})\n\t}\n}\n\nfunc TestStepperSetSpeed(t *testing.T) {\n\tconst maxRpm = 1166\n\n\ttests := map[string]struct {\n\t\tinput   uint\n\t\twant    uint\n\t\twantErr string\n\t}{\n\t\t\"below_minimum\": {\n\t\t\tinput:   0,\n\t\t\twant:    0,\n\t\t\twantErr: \"RPM (0) cannot be a zero or negative value\",\n\t\t},\n\t\t\"minimum\": {\n\t\t\tinput: 1,\n\t\t\twant:  1,\n\t\t},\n\t\t\"maximum\": {\n\t\t\tinput: maxRpm,\n\t\t\twant:  maxRpm,\n\t\t},\n\t\t\"above_maximum\": {\n\t\t\tinput:   maxRpm + 1,\n\t\t\twant:    maxRpm,\n\t\t\twantErr: \"cannot be greater then maximal value 1166\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, _ := initTestStepperDriverWithStubbedAdaptor()\n\t\t\td.stepsPerRev = 36\n\t\t\t// act\n\t\t\terr := d.SetSpeed(tc.input)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.want, d.speedRpm)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/tm1638_driver.go",
    "content": "package gpio\n\nimport (\n\t\"math\"\n\t\"strings\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Colors of the display\nconst (\n\tTM1638None = iota\n\tTM1638Red\n\tTM1638Green\n)\n\n// Commands of the driver\nconst (\n\tTM1638DataCmd  = 0x40\n\tTM1638DispCtrl = 0x80\n\tTM1638AddrCmd  = 0xC0\n\n\tTM1638WriteDisp = 0x00\n\tTM1638ReadKeys  = 0x02\n\tTM1638FixedAddr = 0x04\n)\n\n// TM1638Driver is the driver for modules based on the TM1638, which has 8 7-segment displays, 8 LEDs and 8 buttons.\n// Buttons are not supported yet by this driver.\n//\n// Datasheet EN: https://retrocip.cz/files/tm1638.pdf\n// Datasheet CN: http://www.datasheetspdf.com/pdf/775356/TitanMicro/TM1638/1\n//\n// Ported from the Arduino driver https://github.com/rjbatista/tm1638-library\ntype TM1638Driver struct {\n\t*driver\n\n\tpinClock  *DirectPinDriver\n\tpinData   *DirectPinDriver\n\tpinStrobe *DirectPinDriver\n\tfonts     map[string]byte\n}\n\n// NewTM1638Driver return a new TM1638Driver given a gobot.Connection and the clock, data and strobe pins\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc NewTM1638Driver(a gobot.Connection, clockPin, dataPin, strobePin string, opts ...interface{}) *TM1638Driver {\n\td := &TM1638Driver{\n\t\tdriver:    newDriver(a, \"TM1638\", opts...),\n\t\tpinClock:  NewDirectPinDriver(a, clockPin),\n\t\tpinData:   NewDirectPinDriver(a, dataPin),\n\t\tpinStrobe: NewDirectPinDriver(a, strobePin),\n\t\tfonts:     NewTM1638Fonts(),\n\t}\n\td.afterStart = d.initialize\n\n\t/* TODO : Add commands */\n\n\treturn d\n}\n\n// SetLED changes the color (TM1638None, TM1638Red, TM1638Green) of the specific LED\nfunc (d *TM1638Driver) SetLED(color byte, pos byte) error {\n\tif pos > 7 {\n\t\treturn nil\n\t}\n\treturn d.sendData((pos<<1)+1, color)\n}\n\n// SetDisplay cuts and sends a byte array to the display (without dots)\nfunc (d *TM1638Driver) SetDisplay(data []byte) error {\n\tminLength := int(math.Min(8, float64(len(data))))\n\tfor i := 0; i < minLength; i++ {\n\t\tif err := d.SendChar(byte(i), data[i], false); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetDisplayText cuts and sends a string to the display (without dots)\nfunc (d *TM1638Driver) SetDisplayText(text string) error {\n\tdata := d.fromStringToByteArray(text)\n\tminLength := int(math.Min(8, float64(len(data))))\n\tfor i := 0; i < minLength; i++ {\n\t\tif err := d.SendChar(byte(i), data[i], false); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// SendChar sends one byte to the specific position in the display\nfunc (d *TM1638Driver) SendChar(pos byte, data byte, dot bool) error {\n\tif pos > 7 {\n\t\treturn nil\n\t}\n\tvar dotData byte\n\tif dot {\n\t\tdotData = TM1638DispCtrl\n\t}\n\treturn d.sendData(pos<<1, data|(dotData))\n}\n\n// AddFonts adds new custom fonts or modify the representation of existing ones\nfunc (d *TM1638Driver) AddFonts(fonts map[string]byte) {\n\tfor k, v := range fonts {\n\t\td.fonts[k] = v\n\t}\n}\n\n// ClearFonts removes all the fonts from the driver\nfunc (d *TM1638Driver) ClearFonts() {\n\td.fonts = make(map[string]byte)\n}\n\n// initialize initializes the tm1638, it uses a SPI-like communication protocol\nfunc (d *TM1638Driver) initialize() error {\n\tif err := d.pinStrobe.On(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.pinClock.On(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.sendCommand(TM1638DataCmd); err != nil {\n\t\treturn err\n\t}\n\tif err := d.sendCommand(TM1638DispCtrl | 8 | 7); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.pinStrobe.Off(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.send(TM1638AddrCmd); err != nil {\n\t\treturn err\n\t}\n\tfor i := 0; i < 16; i++ {\n\t\tif err := d.send(TM1638WriteDisp); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn d.pinStrobe.On()\n}\n\n// fromStringToByteArray translates a string to a byte array with the corresponding representation\n// for the 7-segment LCD, return and empty character if the font is not available\nfunc (d *TM1638Driver) fromStringToByteArray(str string) []byte {\n\tchars := strings.Split(str, \"\")\n\tdata := make([]byte, len(chars))\n\n\tfor index, char := range chars {\n\t\tif val, ok := d.fonts[char]; ok {\n\t\t\tdata[index] = val\n\t\t}\n\t}\n\treturn data\n}\n\n// sendData is an auxiliary function to send data to the TM1638 module\nfunc (d *TM1638Driver) sendData(address byte, data byte) error {\n\tif err := d.sendCommand(TM1638DataCmd | TM1638FixedAddr); err != nil {\n\t\treturn err\n\t}\n\tif err := d.pinStrobe.Off(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.send(TM1638AddrCmd | address); err != nil {\n\t\treturn err\n\t}\n\tif err := d.send(data); err != nil {\n\t\treturn err\n\t}\n\treturn d.pinStrobe.On()\n}\n\n// sendCommand is an auxiliary function to send commands to the TM1638 module\nfunc (d *TM1638Driver) sendCommand(cmd byte) error {\n\tif err := d.pinStrobe.Off(); err != nil {\n\t\treturn err\n\t}\n\tif err := d.send(cmd); err != nil {\n\t\treturn err\n\t}\n\treturn d.pinStrobe.On()\n}\n\n// send writes data on the module\nfunc (d *TM1638Driver) send(data byte) error {\n\tfor i := 0; i < 8; i++ {\n\t\tif err := d.pinClock.Off(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif (data & 1) > 0 {\n\t\t\tif err := d.pinData.On(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif err := d.pinData.Off(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdata >>= 1\n\n\t\tif err := d.pinClock.On(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// NewTM1638Fonts returns a map with fonts and their corresponding byte for proper representation on the 7-segment LCD\nfunc NewTM1638Fonts() map[string]byte {\n\treturn map[string]byte{\n\t\t\" \":  0x00,\n\t\t\"!\":  0x86,\n\t\t\"'\":  0x22,\n\t\t\"#\":  0x7E,\n\t\t\"$\":  0x6D,\n\t\t\"%\":  0x00,\n\t\t\"&\":  0x00,\n\t\t\"\\\"\": 0x02,\n\t\t\"(\":  0x30,\n\t\t\")\":  0x06,\n\t\t\"*\":  0x63,\n\t\t\"+\":  0x00,\n\t\t\",\":  0x04,\n\t\t\"-\":  0x40,\n\t\t\".\":  0x80,\n\t\t\"/\":  0x52,\n\t\t\"0\":  0x3F,\n\t\t\"1\":  0x06,\n\t\t\"2\":  0x5B,\n\t\t\"3\":  0x4F,\n\t\t\"4\":  0x66,\n\t\t\"5\":  0x6D,\n\t\t\"6\":  0x7D,\n\t\t\"7\":  0x27,\n\t\t\"8\":  0x7F,\n\t\t\"9\":  0x6F,\n\t\t\":\":  0x00,\n\t\t\";\":  0x00,\n\t\t\"<\":  0x00,\n\t\t\"=\":  0x48,\n\t\t\">\":  0x00,\n\t\t\"?\":  0x53,\n\t\t\"@\":  0x5F,\n\t\t\"A\":  0x77,\n\t\t\"B\":  0x7F,\n\t\t\"C\":  0x39,\n\t\t\"D\":  0x3F,\n\t\t\"E\":  0x79,\n\t\t\"F\":  0x71,\n\t\t\"G\":  0x3D,\n\t\t\"H\":  0x76,\n\t\t\"I\":  0x06,\n\t\t\"J\":  0x1F,\n\t\t\"K\":  0x69,\n\t\t\"L\":  0x38,\n\t\t\"M\":  0x15,\n\t\t\"N\":  0x37,\n\t\t\"O\":  0x3F,\n\t\t\"P\":  0x73,\n\t\t\"Q\":  0x67,\n\t\t\"R\":  0x31,\n\t\t\"S\":  0x6D,\n\t\t\"T\":  0x78,\n\t\t\"U\":  0x3E,\n\t\t\"V\":  0x2A,\n\t\t\"W\":  0x1D,\n\t\t\"X\":  0x76,\n\t\t\"Y\":  0x6E,\n\t\t\"Z\":  0x5B,\n\t\t\"[\":  0x39,\n\t\t\"\\\\\": 0x64, // (this can't be the last char on a line, even in comment or it'll concat)\n\t\t\"]\":  0x0F,\n\t\t\"^\":  0x00,\n\t\t\"_\":  0x08,\n\t\t\"`\":  0x20,\n\t\t\"a\":  0x5F,\n\t\t\"b\":  0x7C,\n\t\t\"c\":  0x58,\n\t\t\"d\":  0x5E,\n\t\t\"e\":  0x7B,\n\t\t\"f\":  0x31,\n\t\t\"g\":  0x6F,\n\t\t\"h\":  0x74,\n\t\t\"i\":  0x04,\n\t\t\"j\":  0x0E,\n\t\t\"k\":  0x75,\n\t\t\"l\":  0x30,\n\t\t\"m\":  0x55,\n\t\t\"n\":  0x54,\n\t\t\"o\":  0x5C,\n\t\t\"p\":  0x73,\n\t\t\"q\":  0x67,\n\t\t\"r\":  0x50,\n\t\t\"s\":  0x6D,\n\t\t\"t\":  0x78,\n\t\t\"u\":  0x1C,\n\t\t\"v\":  0x2A,\n\t\t\"w\":  0x1D,\n\t\t\"x\":  0x76,\n\t\t\"y\":  0x6E,\n\t\t\"z\":  0x47,\n\t\t\"{\":  0x46,\n\t\t\"|\":  0x06,\n\t\t\"}\":  0x70,\n\t\t\"~\":  0x01,\n\t}\n}\n"
  },
  {
    "path": "drivers/gpio/tm1638_driver_test.go",
    "content": "package gpio\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\nvar _ gobot.Driver = (*TM1638Driver)(nil)\n\nfunc initTestTM1638Driver() *TM1638Driver {\n\td, _ := initTestTM1638DriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initTestTM1638DriverWithStubbedAdaptor() (*TM1638Driver, *gpioTestAdaptor) {\n\ta := newGpioTestAdaptor()\n\treturn NewTM1638Driver(a, \"1\", \"2\", \"3\"), a\n}\n\nfunc TestNewTM1638Driver(t *testing.T) {\n\t// arrange\n\ta := newGpioTestAdaptor()\n\t// act\n\td := NewTM1638Driver(a, \"10\", \"20\", \"30\")\n\t// assert\n\tassert.IsType(t, &TM1638Driver{}, d)\n\t// assert: gpio.driver attributes\n\trequire.NotNil(t, d.driver)\n\tassert.True(t, strings.HasPrefix(d.driverCfg.name, \"TM1638\"))\n\tassert.Equal(t, a, d.connection)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n\t// assert: driver specific attributes\n\tassert.NotNil(t, d.pinClock)\n\tassert.NotNil(t, d.pinData)\n\tassert.NotNil(t, d.pinStrobe)\n\tassert.NotNil(t, d.fonts)\n}\n\nfunc TestNewTM1638Driver_options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option, least one\n\t// option of this driver and one of another driver (which should lead to panic). Further tests for options can also\n\t// be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tmyName = \"show rotation count\"\n\t)\n\tpanicFunc := func() {\n\t\tNewTM1638Driver(newGpioTestAdaptor(), \"1\", \"2\", \"3\", WithName(\"crazy\"),\n\t\t\taio.WithActuatorScaler(func(float64) int { return 0 }))\n\t}\n\t// act\n\td := NewTM1638Driver(newGpioTestAdaptor(), \"1\", \"2\", \"3\", WithName(myName))\n\t// assert\n\tassert.Equal(t, myName, d.Name())\n\tassert.PanicsWithValue(t, \"'scaler option for analog actuators' can not be applied on 'crazy'\", panicFunc)\n}\n\nfunc TestTM1638Start(t *testing.T) {\n\t// arrange\n\td := initTestTM1638Driver()\n\t// act & assert: tests also initialize()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestTM1638FromStringToByteArray(t *testing.T) {\n\td := initTestTM1638Driver()\n\tdata := d.fromStringToByteArray(\"Hello World\")\n\tassert.Equal(t, []byte{0x76, 0x7B, 0x30, 0x30, 0x5C, 0x00, 0x1D, 0x5C, 0x50, 0x30, 0x5E}, data)\n}\n\nfunc TestTM1638AddFonts(t *testing.T) {\n\td := initTestTM1638Driver()\n\td.AddFonts(map[string]byte{\"µ\": 0x1C, \"ß\": 0x7F})\n\tdata := d.fromStringToByteArray(\"µß\")\n\tassert.Equal(t, []byte{0x1C, 0x7F}, data)\n}\n\nfunc TestTM1638ClearFonts(t *testing.T) {\n\td := initTestTM1638Driver()\n\td.ClearFonts()\n\tdata := d.fromStringToByteArray(\"Hello World\")\n\tassert.Equal(t, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, data)\n}\n"
  },
  {
    "path": "drivers/i2c/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/i2c/README.md",
    "content": "# I2C\n\nThis package provides drivers for [i2c](https://en.wikipedia.org/wiki/I%C2%B2C)devices. It must be used along with an\nadaptor such as [Tinker Board](https://gobot.io/documentation/platforms/asus/tinkerboard/) that supports the needed\ninterfaces for i2c devices.\n\n## Getting Started\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices. The following i2c devices are currently supported:\n\n- Adafruit 1109 2x16 RGB-LCD with 5 keys\n- Adafruit 2327 16-Channel PWM/Servo HAT Hat\n- Adafruit 2348 DC and Stepper Motor Hat\n- ADS1015 Analog to Digital Converter\n- ADS1115 Analog to Digital Converter\n- ADXL345 Digital Accelerometer\n- BH1750 Digital Luminosity/Lux/Light Sensor\n- BlinkM LED\n- BME280 Barometric Pressure/Temperature/Altitude/Humidity Sensor\n- BMP180 Barometric Pressure/Temperature/Altitude Sensor\n- BMP280 Barometric Pressure/Temperature/Altitude Sensor\n- BMP388 Barometric Pressure/Temperature/Altitude Sensor\n- DRV2605L Haptic Controller\n- Generic driver for read and write values to/from register address\n- Grove Digital Accelerometer\n- GrovePi Expansion Board\n- Grove RGB LCD\n- HMC6352 Compass\n- HMC5883L 3-Axis Digital Compass\n- INA3221 Voltage Monitor\n- JHD1313M1 LCD Display w/RGB Backlight\n- L3GD20H 3-Axis Gyroscope\n- LIDAR-Lite\n- MCP23017 Port Expander\n- MMA7660 3-Axis Accelerometer\n- MPL115A2 Barometric Pressure/Temperature\n- MPU6050 Accelerometer/Gyroscope\n- PCA9501 8-bit I/O port with interrupt, 2-kbit EEPROM\n- PCA953x LED Dimmer for PCA9530 (2-bit), PCA9533 (4-bit), PCA9531 (8-bit), PCA9532 (16-bit)\n- PCA9685 16-channel 12-bit PWM/Servo Driver\n- PCF8583 clock and calendar or event counter, 240 x 8-bit RAM\n- PCF8591 8-bit 4xA/D & 1xD/A converter\n- SHT2x Temperature/Humidity\n- SHT3x-D Temperature/Humidity\n- SSD1306 OLED Display Controller\n- TSL2561 Digital Luminosity/Lux/Light Sensor\n- Wii Nunchuck Controller\n- YL-40 Brightness/Temperature sensor, Potentiometer, analog input, analog output Driver\n\nMore drivers are coming soon...\n\n## Using A Different Bus or Address\n\nYou can set a different I2C address or I2C bus than the default when initializing your I2C drivers by using optional\nparameters. Here is an example:\n\n```go\nblinkm := i2c.NewBlinkMDriver(e, i2c.WithBus(0), i2c.WithAddress(0x09))\n```\n"
  },
  {
    "path": "drivers/i2c/adafruit1109_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n)\n\nconst adafruit1109Debug = false\n\ntype adafruit1109PortPin struct {\n\tport string\n\tpin  uint8\n}\n\n// Adafruit1109Driver is a driver for the 2x16 LCD display with RGB backlit and 5 keys from adafruit, designed for Pi.\n// The display is driven by the HD44780, and all is connected by i2c port expander MCP23017.\n// https://www.adafruit.com/product/1109\n//\n// Have to implement DigitalWriter, DigitalReader interface\ntype Adafruit1109Driver struct {\n\t*MCP23017Driver\n\t*gpio.HD44780Driver\n\n\tname       string\n\tredPin     adafruit1109PortPin\n\tgreenPin   adafruit1109PortPin\n\tbluePin    adafruit1109PortPin\n\tselectPin  adafruit1109PortPin\n\tupPin      adafruit1109PortPin\n\tdownPin    adafruit1109PortPin\n\tleftPin    adafruit1109PortPin\n\trightPin   adafruit1109PortPin\n\trwPin      adafruit1109PortPin\n\trsPin      adafruit1109PortPin\n\tenPin      adafruit1109PortPin\n\tdataPinD4  adafruit1109PortPin\n\tdataPinD5  adafruit1109PortPin\n\tdataPinD6  adafruit1109PortPin\n\tdataPinD7  adafruit1109PortPin\n\tmcpStarted bool\n}\n\n// NewAdafruit1109Driver creates is a new driver for the 2x16 LCD display with RGB backlit and 5 keys.\n//\n// Because HD44780 and MCP23017 are already implemented in gobot, this is a wrapper for using existing implementation.\n// So, for the documentation of the parameters, have a look at this drivers.\n//\n// Tests are done with a Tinkerboard.\nfunc NewAdafruit1109Driver(a Connector, options ...func(Config)) *Adafruit1109Driver {\n\toptions = append(options, WithMCP23017AutoIODirOff(1))\n\tmcp := NewMCP23017Driver(a, options...)\n\td := &Adafruit1109Driver{\n\t\tname:           gobot.DefaultName(\"Adafruit1109\"),\n\t\tMCP23017Driver: mcp,\n\t\tredPin:         adafruit1109PortPin{\"A\", 6},\n\t\tgreenPin:       adafruit1109PortPin{\"A\", 7},\n\t\tbluePin:        adafruit1109PortPin{\"B\", 0},\n\t\tselectPin:      adafruit1109PortPin{\"A\", 0},\n\t\tupPin:          adafruit1109PortPin{\"A\", 3},\n\t\tdownPin:        adafruit1109PortPin{\"A\", 2},\n\t\tleftPin:        adafruit1109PortPin{\"A\", 4},\n\t\trightPin:       adafruit1109PortPin{\"A\", 1},\n\t\trwPin:          adafruit1109PortPin{\"B\", 6},\n\t\trsPin:          adafruit1109PortPin{\"B\", 7},\n\t\tenPin:          adafruit1109PortPin{\"B\", 5},\n\t\tdataPinD4:      adafruit1109PortPin{\"B\", 4},\n\t\tdataPinD5:      adafruit1109PortPin{\"B\", 3},\n\t\tdataPinD6:      adafruit1109PortPin{\"B\", 2},\n\t\tdataPinD7:      adafruit1109PortPin{\"B\", 1},\n\t}\n\t// mapping for HD44780 to MCP23017 port and IO, 4-Bit data\n\tdataPins := gpio.HD44780DataPin{\n\t\tD4: d.dataPinD4.String(),\n\t\tD5: d.dataPinD5.String(),\n\t\tD6: d.dataPinD6.String(),\n\t\tD7: d.dataPinD7.String(),\n\t}\n\n\t// rwPin := \"B_6\" not mapped in HD44780 driver\n\t// at test initialization, there seems rows and columns be switched\n\t// but inside the driver the row is used as row and col as column\n\trows := 2\n\tcolumns := 16\n\tlcd := gpio.NewHD44780Driver(d, columns, rows, gpio.HD44780_4BITMODE, d.rsPin.String(), d.enPin.String(), dataPins,\n\t\tgpio.WithHD44780RWPin(d.rwPin.String()))\n\n\td.HD44780Driver = lcd\n\treturn d\n}\n\n// Connect implements the adaptor.Connector interface.\n// Haven't found any adaptor which implements this with more content.\nfunc (d *Adafruit1109Driver) Connect() error { return nil }\n\n// Finalize implements the adaptor.Connector interface.\n// Haven't found any adaptor which implements this with more content.\nfunc (d *Adafruit1109Driver) Finalize() error { return nil }\n\n// Name implements the gobot.Device interface\nfunc (d *Adafruit1109Driver) Name() string {\n\treturn fmt.Sprintf(\"%s_%s_%s\", d.name, d.MCP23017Driver.Name(), d.HD44780Driver.Name())\n}\n\n// SetName implements the gobot.Device interface.\nfunc (d *Adafruit1109Driver) SetName(n string) { d.name = n }\n\n// Connection implements the gobot.Device interface.\nfunc (d *Adafruit1109Driver) Connection() gobot.Connection { return d.MCP23017Driver.Connection() }\n\n// Start implements the gobot.Device interface.\nfunc (d *Adafruit1109Driver) Start() error {\n\td.debuglnf(\"## MCP.Start ##\")\n\n\tif err := d.MCP23017Driver.Start(); err != nil {\n\t\treturn err\n\t}\n\n\td.mcpStarted = true\n\n\t// set all to output (inputs will be set by initButton)\n\tfor pin := uint8(0); pin <= 7; pin++ {\n\t\tif err := d.SetPinMode(pin, \"A\", 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := d.SetPinMode(pin, \"B\", 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// button pins are inputs, has inverse logic and needs pull up\n\tif err := d.adafruit1109InitButton(d.selectPin); err != nil {\n\t\treturn err\n\t}\n\tif err := d.adafruit1109InitButton(d.upPin); err != nil {\n\t\treturn err\n\t}\n\tif err := d.adafruit1109InitButton(d.downPin); err != nil {\n\t\treturn err\n\t}\n\tif err := d.adafruit1109InitButton(d.leftPin); err != nil {\n\t\treturn err\n\t}\n\tif err := d.adafruit1109InitButton(d.rightPin); err != nil {\n\t\treturn err\n\t}\n\n\t// lets start with neutral background\n\tif err := d.SetRGB(true, true, true); err != nil {\n\t\treturn err\n\t}\n\t// set rw pin to write\n\tif err := d.writePin(d.rwPin, 0x00); err != nil {\n\t\treturn err\n\t}\n\n\td.debuglnf(\"## HD.Start ##\")\n\n\treturn d.HD44780Driver.Start()\n}\n\n// Halt implements the gobot.Device interface.\nfunc (d *Adafruit1109Driver) Halt() error {\n\t// we try halt on each device, not stopping on the first error\n\tvar errors []string\n\n\td.debuglnf(\"## HD.Halt ##\")\n\n\tif err := d.HD44780Driver.Halt(); err != nil {\n\t\terrors = append(errors, err.Error())\n\t}\n\n\td.debuglnf(\"## HD.Halt done ##: %v\", errors)\n\n\tif d.mcpStarted {\n\t\td.debuglnf(\"## MCP.Halt ##\")\n\n\t\t// switch off the background light\n\t\tif err := d.SetRGB(false, false, false); err != nil {\n\t\t\terrors = append(errors, err.Error())\n\t\t}\n\n\t\t// must be after HD44780Driver\n\t\tif err := d.MCP23017Driver.Halt(); err != nil {\n\t\t\terrors = append(errors, err.Error())\n\t\t}\n\t}\n\n\td.mcpStarted = false\n\n\tif len(errors) > 0 {\n\t\treturn fmt.Errorf(\"'Halt' the driver %s\", strings.Join(errors, \", \"))\n\t}\n\n\td.debuglnf(\"## AD.Halt done without errors ##\")\n\n\treturn nil\n}\n\n// DigitalWrite implements the DigitalWriter interface\n// This is called by HD44780 driver to set one gpio output. We redirect the call to the i2c driver MCP23017.\n// The given id is the same as defined in dataPins and has the syntax \"<port>_<pin>\".\nfunc (d *Adafruit1109Driver) DigitalWrite(id string, val byte) error {\n\tportio := adafruit1109ParseID(id)\n\treturn d.writePin(portio, val)\n}\n\n// DigitalRead implements the DigitalReader interface\n// This is called by HD44780 driver to read one gpio input. We redirect the call to the i2c driver MCP23017.\n// The given id is the same as defined in dataPins and has the syntax \"<port>_<pin>\".\nfunc (d *Adafruit1109Driver) DigitalRead(id string) (int, error) {\n\tportio := adafruit1109ParseID(id)\n\tuval, err := d.readPin(portio)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn int(uval), err\n}\n\n// SetRGB sets the Red Green Blue value of backlit.\n// The MCP23017 variant don't support PWM and have inverted logic\nfunc (d *Adafruit1109Driver) SetRGB(r, g, b bool) error {\n\td.debuglnf(\"## SetRGB %t, %t, %t ##\", r, g, b)\n\n\trio := d.redPin\n\tgio := d.greenPin\n\tbio := d.bluePin\n\trval := uint8(0x1)\n\tgval := uint8(0x1)\n\tbval := uint8(0x1)\n\tif r {\n\t\trval = 0x00\n\t}\n\tif g {\n\t\tgval = 0x00\n\t}\n\tif b {\n\t\tbval = 0x00\n\t}\n\n\tif err := d.writePin(rio, rval); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.writePin(gio, gval); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.writePin(bio, bval); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// SelectButton reads the state of the \"select\" button (1=pressed).\nfunc (d *Adafruit1109Driver) SelectButton() (uint8, error) {\n\treturn d.readPin(d.selectPin)\n}\n\n// UpButton reads the state of the \"up\" button (1=pressed).\nfunc (d *Adafruit1109Driver) UpButton() (uint8, error) {\n\treturn d.readPin(d.upPin)\n}\n\n// DownButton reads the state of the \"down\" button (1=pressed).\nfunc (d *Adafruit1109Driver) DownButton() (uint8, error) {\n\treturn d.readPin(d.downPin)\n}\n\n// LeftButton reads the state of the \"left\" button (1=pressed).\nfunc (d *Adafruit1109Driver) LeftButton() (uint8, error) {\n\treturn d.readPin(d.leftPin)\n}\n\n// RightButton reads the state of the \"right\" button (1=pressed).\nfunc (d *Adafruit1109Driver) RightButton() (uint8, error) {\n\treturn d.readPin(d.rightPin)\n}\n\nfunc (d *Adafruit1109Driver) writePin(ap adafruit1109PortPin, val uint8) error {\n\treturn d.WriteGPIO(ap.pin, ap.port, val)\n}\n\nfunc (d *Adafruit1109Driver) readPin(ap adafruit1109PortPin) (uint8, error) {\n\treturn d.ReadGPIO(ap.pin, ap.port)\n}\n\nfunc (ap *adafruit1109PortPin) String() string {\n\treturn fmt.Sprintf(\"%s_%d\", ap.port, ap.pin)\n}\n\nfunc adafruit1109ParseID(id string) adafruit1109PortPin {\n\titems := strings.Split(id, \"_\")\n\tio := uint8(0)\n\tif io64, err := strconv.ParseUint(items[1], 10, 32); err == nil {\n\t\tio = uint8(io64) //nolint:gosec // TODO: fix later\n\t}\n\treturn adafruit1109PortPin{port: items[0], pin: io}\n}\n\nfunc (d *Adafruit1109Driver) adafruit1109InitButton(p adafruit1109PortPin) error {\n\t// make an input\n\tif err := d.SetPinMode(p.pin, p.port, 1); err != nil {\n\t\treturn err\n\t}\n\t// add pull up resistors\n\tif err := d.SetPullUp(p.pin, p.port, 1); err != nil {\n\t\treturn err\n\t}\n\t// invert polarity\n\tif err := d.SetGPIOPolarity(p.pin, p.port, 1); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (d *Adafruit1109Driver) debuglnf(format string, p ...interface{}) {\n\tgobot.Debuglnf(adafruit1109Debug, format, p...)\n}\n"
  },
  {
    "path": "drivers/i2c/adafruit1109_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Adafruit1109Driver)(nil)\n\nfunc initTestAdafruit1109WithStubbedAdaptor() (*Adafruit1109Driver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewAdafruit1109Driver(adaptor), adaptor\n}\n\nfunc TestNewAdafruit1109Driver(t *testing.T) {\n\tvar di interface{} = NewAdafruit1109Driver(newI2cTestAdaptor())\n\td, ok := di.(*Adafruit1109Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewAdafruit1109Driver() should have returned a *Adafruit1109Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.NotNil(t, d.Connection())\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Adafruit1109\"))\n\tassert.Contains(t, d.Name(), \"MCP23017\")\n\tassert.Contains(t, d.Name(), \"HD44780\")\n\tassert.NotNil(t, d.MCP23017Driver)\n\tassert.NotNil(t, d.HD44780Driver)\n\tassert.NotNil(t, d.redPin)\n\tassert.NotNil(t, d.greenPin)\n\tassert.NotNil(t, d.bluePin)\n\tassert.NotNil(t, d.selectPin)\n\tassert.NotNil(t, d.upPin)\n\tassert.NotNil(t, d.downPin)\n\tassert.NotNil(t, d.leftPin)\n\tassert.NotNil(t, d.rightPin)\n\tassert.NotNil(t, d.rwPin)\n\tassert.NotNil(t, d.rsPin)\n\tassert.NotNil(t, d.enPin)\n\tassert.NotNil(t, d.dataPinD4)\n\tassert.NotNil(t, d.dataPinD5)\n\tassert.NotNil(t, d.dataPinD6)\n\tassert.NotNil(t, d.dataPinD7)\n}\n\nfunc TestAdafruit1109Connect(t *testing.T) {\n\td, _ := initTestAdafruit1109WithStubbedAdaptor()\n\trequire.NoError(t, d.Connect())\n}\n\nfunc TestAdafruit1109Finalize(t *testing.T) {\n\td, _ := initTestAdafruit1109WithStubbedAdaptor()\n\trequire.NoError(t, d.Finalize())\n}\n\nfunc TestAdafruit1109SetName(t *testing.T) {\n\td, _ := initTestAdafruit1109WithStubbedAdaptor()\n\td.SetName(\"foo\")\n\tassert.Equal(t, \"foo\", d.name)\n}\n\nfunc TestAdafruit1109Start(t *testing.T) {\n\td, _ := initTestAdafruit1109WithStubbedAdaptor()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestAdafruit1109StartWriteErr(t *testing.T) {\n\td, adaptor := initTestAdafruit1109WithStubbedAdaptor()\n\tadaptor.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\trequire.ErrorContains(t, d.Start(), \"write error\")\n}\n\nfunc TestAdafruit1109StartReadErr(t *testing.T) {\n\td, adaptor := initTestAdafruit1109WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\trequire.ErrorContains(t, d.Start(), \"MCP write-read: MCP write-ReadByteData(reg=0): read error\")\n}\n\nfunc TestAdafruit1109Halt(t *testing.T) {\n\td, _ := initTestAdafruit1109WithStubbedAdaptor()\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestAdafruit1109DigitalRead(t *testing.T) {\n\ttests := map[string]struct {\n\t\tread    uint8\n\t\twantReg uint8\n\t}{\n\t\t\"A_0\": {read: 0x01, wantReg: 0x12},\n\t\t\"A_1\": {read: 0x02, wantReg: 0x12},\n\t\t\"A_2\": {read: 0x04, wantReg: 0x12},\n\t\t\"A_3\": {read: 0x08, wantReg: 0x12},\n\t\t\"A_4\": {read: 0x10, wantReg: 0x12},\n\t\t\"A_5\": {read: 0x20, wantReg: 0x12},\n\t\t\"A_6\": {read: 0x40, wantReg: 0x12},\n\t\t\"A_7\": {read: 0x80, wantReg: 0x12},\n\t\t\"B_0\": {read: 0x01, wantReg: 0x13},\n\t\t\"B_1\": {read: 0x02, wantReg: 0x13},\n\t\t\"B_2\": {read: 0x04, wantReg: 0x13},\n\t\t\"B_3\": {read: 0x08, wantReg: 0x13},\n\t\t\"B_4\": {read: 0x10, wantReg: 0x13},\n\t\t\"B_5\": {read: 0x20, wantReg: 0x13},\n\t\t\"B_6\": {read: 0x40, wantReg: 0x13},\n\t\t\"B_7\": {read: 0x80, wantReg: 0x13},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestAdafruit1109WithStubbedAdaptor()\n\t\t\t_ = d.Start()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\t// arrange reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.DigitalRead(name)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, tc.wantReg, a.written[0])\n\t\t\tassert.Equal(t, 1, got)\n\t\t})\n\t}\n}\n\nfunc TestAdafruit1109SelectButton(t *testing.T) {\n\ttests := map[string]struct {\n\t\tread uint8\n\t\twant uint8\n\t}{\n\t\t\"A0_not_pressed\": {read: 0xFE, want: 0},\n\t\t\"A0_pressed\":     {read: 0x01, want: 1},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestAdafruit1109WithStubbedAdaptor()\n\t\t\t_ = d.Start()\n\t\t\t// arrange reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.SelectButton()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestAdafruit1109UpButton(t *testing.T) {\n\ttests := map[string]struct {\n\t\tread uint8\n\t\twant uint8\n\t}{\n\t\t\"A3_not_pressed\": {read: 0xF7, want: 0},\n\t\t\"A3_pressed\":     {read: 0x08, want: 1},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestAdafruit1109WithStubbedAdaptor()\n\t\t\t_ = d.Start()\n\t\t\t// arrange reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.UpButton()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestAdafruit1109DownButton(t *testing.T) {\n\ttests := map[string]struct {\n\t\tread uint8\n\t\twant uint8\n\t}{\n\t\t\"A2_not_pressed\": {read: 0xFB, want: 0},\n\t\t\"A2_pressed\":     {read: 0x04, want: 1},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestAdafruit1109WithStubbedAdaptor()\n\t\t\t_ = d.Start()\n\t\t\t// arrange reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.DownButton()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestAdafruit1109LeftButton(t *testing.T) {\n\ttests := map[string]struct {\n\t\tread uint8\n\t\twant uint8\n\t}{\n\t\t\"A4_not_pressed\": {read: 0xEF, want: 0},\n\t\t\"A4_pressed\":     {read: 0x10, want: 1},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestAdafruit1109WithStubbedAdaptor()\n\t\t\t_ = d.Start()\n\t\t\t// arrange reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.LeftButton()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestAdafruit1109RightButton(t *testing.T) {\n\ttests := map[string]struct {\n\t\tread uint8\n\t\twant uint8\n\t}{\n\t\t\"A1_not_pressed\": {read: 0xFD, want: 0},\n\t\t\"A1_pressed\":     {read: 0x02, want: 1},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestAdafruit1109WithStubbedAdaptor()\n\t\t\t_ = d.Start()\n\t\t\t// arrange reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.RightButton()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestAdafruit1109_parseID(t *testing.T) {\n\t// arrange\n\tports := []string{\"A\", \"B\"}\n\tfor _, port := range ports {\n\t\tfor pin := uint8(0); pin <= 7; pin++ {\n\t\t\tid := fmt.Sprintf(\"%s_%d\", port, pin)\n\t\t\tt.Run(id, func(t *testing.T) {\n\t\t\t\t// act\n\t\t\t\tgot := adafruit1109ParseID(id)\n\t\t\t\t// assert\n\t\t\t\tassert.Equal(t, adafruit1109PortPin{port, pin}, got)\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/adafruit2327_driver.go",
    "content": "package i2c\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Adafruit2327Driver is a driver for Adafruit 16-Channel PWM/Servo HAT & Bonnet - a Raspberry Pi add-on, based on\n// PCA9685. This driver just wraps the PCA9685Driver.\n// Stacking 62 of them is possible (addresses 0x40..0x7E), for controlling up to 992 servos.\n// datasheet:\n// https://cdn-learn.adafruit.com/downloads/pdf/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi.pdf\ntype Adafruit2327Driver struct {\n\t*PCA9685Driver\n}\n\n// NewAdafruit2327Driver initializes a new driver for PWM servos.\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\t    bus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewAdafruit2327Driver(c Connector, options ...func(Config)) *Adafruit2327Driver {\n\tpca := NewPCA9685Driver(c, options...) // the default address of the driver is already 0x40\n\tpca.SetName(gobot.DefaultName(\"Adafruit2327ServoHat\"))\n\td := &Adafruit2327Driver{\n\t\tPCA9685Driver: pca,\n\t}\n\n\t// TODO: add API funcs\n\treturn d\n}\n\n// SetServoMotorFreq sets the frequency for the currently addressed PWM Servo HAT.\nfunc (d *Adafruit2327Driver) SetServoMotorFreq(freq float64) error {\n\treturn d.SetPWMFreq(float32(freq))\n}\n\n// SetServoMotorPulse is a convenience function to specify the 'tick' value,\n// between 0-4095, when the signal will turn on, and when it will turn off.\nfunc (d *Adafruit2327Driver) SetServoMotorPulse(channel byte, on, off int32) error {\n\treturn d.SetPWM(int(channel), uint16(on), uint16(off)) //nolint:gosec // TODO: fix later\n}\n"
  },
  {
    "path": "drivers/i2c/adafruit2327_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation implements the gobot.Driver interface\nvar _ gobot.Driver = (*Adafruit2327Driver)(nil)\n\nfunc initTestAdafruit2327WithStubbedAdaptor() (*Adafruit2327Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewAdafruit2327Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewAdafruit2327Driver(t *testing.T) {\n\t// arrange & act\n\td := NewAdafruit2327Driver(newI2cTestAdaptor())\n\t// assert\n\tassert.IsType(t, &Adafruit2327Driver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Adafruit2327ServoHat\"))\n\tassert.Equal(t, 0x40, d.defaultAddress)\n}\n\nfunc TestAdafruit2327Halt(t *testing.T) {\n\t// arrange\n\td := NewAdafruit2327Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestAdafruit2327Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\t// arrange & act\n\td := NewAdafruit2327Driver(newI2cTestAdaptor(), WithBus(2))\n\t// assert\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestAdafruit2327SetServoMotorFreq(t *testing.T) {\n\t// arrange\n\td, a := initTestAdafruit2327WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst freq = 60.0\n\t// act\n\terr := d.SetServoMotorFreq(freq)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 9) // detailed test, see \"TestPCA9685SetPWMFreq\"\n}\n\nfunc TestAdafruit2327SetServoMotorFreqError(t *testing.T) {\n\t// arrange\n\td, a := initTestAdafruit2327WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\tconst freq = 60.0\n\t// act & assert\n\trequire.ErrorContains(t, d.SetServoMotorFreq(freq), \"write error\")\n}\n\nfunc TestAdafruit2327SetServoMotorPulse(t *testing.T) {\n\t// arrange\n\td, a := initTestAdafruit2327WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tchannel byte  = 7\n\t\ton      int32 = 1234\n\t\toff     int32 = 4321\n\t)\n\t// act\n\terr := d.SetServoMotorPulse(channel, on, off)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 8) // detailed test, see \"TestPCA9685SetPWM\"\n}\n\nfunc TestAdafruit2327SetServoMotorPulseError(t *testing.T) {\n\t// arrange\n\td, a := initTestAdafruit2327WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\tconst (\n\t\tchannel byte  = 7\n\t\ton      int32 = 1234\n\t\toff     int32 = 4321\n\t)\n\t// act & assert\n\trequire.ErrorContains(t, d.SetServoMotorPulse(channel, on, off), \"write error\")\n}\n"
  },
  {
    "path": "drivers/i2c/adafruit2348_driver.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"log\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst adafruit2348Debug = false // Set this to true to see debug output\n\nconst (\n\tadafruit2348MotorHatDefaultAddress = 0x60\n\tadafruit2348StepperMicrosteps      = 8\n)\n\n// Adafruit2348Direction declares a type for specification of the motor direction\ntype Adafruit2348Direction int\n\n// Adafruit2348StepStyle declares a type for specification of the stepper motor rotation\ntype Adafruit2348StepStyle int\n\n// constants for running the motor in different direction or release\nconst (\n\tAdafruit2348Forward  Adafruit2348Direction = iota // 0\n\tAdafruit2348Backward                              // 1\n\tAdafruit2348Release                               // 2\n)\n\n// constants for running the stepper motor in different modes\nconst (\n\tAdafruit2348Single     Adafruit2348StepStyle = iota // 0\n\tAdafruit2348Double                                  // 1\n\tAdafruit2348Interleave                              // 2\n\tAdafruit2348Microstep                               // 3\n)\n\ntype adafruit2348DCMotor struct {\n\tpwmPin, in1Pin, in2Pin byte\n}\n\ntype adafruit2348StepperMotor struct {\n\tpwmPinA, pwmPinB      byte\n\tain1, ain2            byte\n\tbin1, bin2            byte\n\tsecPerStep            float64\n\tcurrentStep, revSteps int\n}\n\n// Adafruit2348Driver is a driver for Adafruit DC and Stepper Motor HAT - a Raspberry Pi add-on, based on PCA9685.\n// The HAT can drive up to 4 DC or 2 stepper motors with full PWM speed and direction control over I2C.\n// This driver wraps the PCA9685Driver.\n// Stacking 32 of them is possible (addresses 0x60..0x80), for controlling up to 64 stepper motors or 128 DC motors.\n// datasheet:\n// https://cdn-learn.adafruit.com/downloads/pdf/adafruit2348-dc-and-stepper-motor-hat-for-raspberry-pi.pdf\ntype Adafruit2348Driver struct {\n\t*PCA9685Driver\n\n\tdcMotors              []adafruit2348DCMotor\n\tstepperMotors         []adafruit2348StepperMotor\n\tstepperMicrostepCurve []int\n\tstep2coils            map[int][]int32\n\tstepperSpeedMutex     *sync.Mutex\n}\n\n// NewAdafruit2348Driver initializes a new driver for DC and stepper motors.\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\t    bus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewAdafruit2348Driver(c Connector, options ...func(Config)) *Adafruit2348Driver {\n\tvar dc []adafruit2348DCMotor\n\tvar st []adafruit2348StepperMotor\n\tfor i := 0; i < 4; i++ {\n\t\tswitch i {\n\t\tcase 0:\n\t\t\tdc = append(dc, adafruit2348DCMotor{pwmPin: 8, in1Pin: 10, in2Pin: 9})\n\t\t\tst = append(st, adafruit2348StepperMotor{\n\t\t\t\tpwmPinA: 8, pwmPinB: 13,\n\t\t\t\tain1: 10, ain2: 9, bin1: 11, bin2: 12, revSteps: 200, secPerStep: 0.1,\n\t\t\t})\n\t\tcase 1:\n\t\t\tdc = append(dc, adafruit2348DCMotor{pwmPin: 13, in1Pin: 11, in2Pin: 12})\n\t\t\tst = append(st, adafruit2348StepperMotor{\n\t\t\t\tpwmPinA: 2, pwmPinB: 7,\n\t\t\t\tain1: 4, ain2: 3, bin1: 5, bin2: 6, revSteps: 200, secPerStep: 0.1,\n\t\t\t})\n\t\tcase 2:\n\t\t\tdc = append(dc, adafruit2348DCMotor{pwmPin: 2, in1Pin: 4, in2Pin: 3})\n\t\tcase 3:\n\t\t\tdc = append(dc, adafruit2348DCMotor{pwmPin: 7, in1Pin: 5, in2Pin: 6})\n\t\t}\n\t}\n\n\t// external given address must be able to override the default one\n\to := append([]func(Config){WithAddress(adafruit2348MotorHatDefaultAddress)}, options...)\n\tpca := NewPCA9685Driver(c, o...)\n\tpca.SetName(gobot.DefaultName(\"Adafruit2348MotorHat\"))\n\td := &Adafruit2348Driver{\n\t\tPCA9685Driver:         pca,\n\t\tdcMotors:              dc,\n\t\tstepperMotors:         st,\n\t\tstepperMicrostepCurve: []int{0, 50, 98, 142, 180, 212, 236, 250, 255},\n\t\tstep2coils: map[int][]int32{\n\t\t\t0: {1, 0, 0, 0},\n\t\t\t1: {1, 1, 0, 0},\n\t\t\t2: {0, 1, 0, 0},\n\t\t\t3: {0, 1, 1, 0},\n\t\t\t4: {0, 0, 1, 0},\n\t\t\t5: {0, 0, 1, 1},\n\t\t\t6: {0, 0, 0, 1},\n\t\t\t7: {1, 0, 0, 1},\n\t\t},\n\t\tstepperSpeedMutex: &sync.Mutex{},\n\t}\n\n\t// TODO: add API funcs\n\treturn d\n}\n\n// SetDCMotorSpeed will set the appropriate pins to run the specified DC motor for the given speed.\nfunc (d *Adafruit2348Driver) SetDCMotorSpeed(dcMotor int, speed int32) error {\n\treturn d.SetPWM(int(d.dcMotors[dcMotor].pwmPin), 0, uint16(speed*16)) //nolint:gosec // TODO: fix later\n}\n\n// RunDCMotor will set the appropriate pins to run the specified DC motor for the given direction.\nfunc (d *Adafruit2348Driver) RunDCMotor(dcMotor int, dir Adafruit2348Direction) error {\n\tswitch dir {\n\tcase Adafruit2348Forward:\n\t\tif err := d.setPin(d.dcMotors[dcMotor].in2Pin, 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := d.setPin(d.dcMotors[dcMotor].in1Pin, 1); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase Adafruit2348Backward:\n\t\tif err := d.setPin(d.dcMotors[dcMotor].in1Pin, 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := d.setPin(d.dcMotors[dcMotor].in2Pin, 1); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase Adafruit2348Release:\n\t\tif err := d.setPin(d.dcMotors[dcMotor].in1Pin, 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := d.setPin(d.dcMotors[dcMotor].in2Pin, 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetStepperMotorSpeed sets the seconds-per-step for the given stepper motor. It is applied in the next cycle.\nfunc (d *Adafruit2348Driver) SetStepperMotorSpeed(stepperMotor int, rpm int) error {\n\td.stepperSpeedMutex.Lock()\n\tdefer d.stepperSpeedMutex.Unlock()\n\n\trevSteps := d.stepperMotors[stepperMotor].revSteps\n\td.stepperMotors[stepperMotor].secPerStep = 60.0 / float64(revSteps*rpm)\n\treturn nil\n}\n\n// Step will rotate the stepper motor the given number of steps, in the given direction and step style.\nfunc (d *Adafruit2348Driver) Step(motor, steps int, dir Adafruit2348Direction, style Adafruit2348StepStyle) error {\n\td.stepperSpeedMutex.Lock()\n\tdefer d.stepperSpeedMutex.Unlock()\n\n\tsecPerStep := d.stepperMotors[motor].secPerStep\n\tvar latestStep int\n\tvar err error\n\tif style == Adafruit2348Interleave {\n\t\tsecPerStep = secPerStep / 2.0\n\t}\n\tif style == Adafruit2348Microstep {\n\t\tsecPerStep /= float64(adafruit2348StepperMicrosteps)\n\t\tsteps *= adafruit2348StepperMicrosteps\n\t}\n\tif adafruit2348Debug {\n\t\tlog.Printf(\"[adafruit2348_driver] %f seconds per step\", secPerStep)\n\t}\n\tfor i := 0; i < steps; i++ {\n\t\tif latestStep, err = d.oneStep(motor, dir, style); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttime.Sleep(time.Duration(secPerStep) * time.Second)\n\t}\n\t// As documented in the Adafruit python driver:\n\t// This is an edge case, if we are in between full steps, keep going to end on a full step\n\tif style == Adafruit2348Microstep {\n\t\tfor latestStep != 0 && latestStep != adafruit2348StepperMicrosteps {\n\t\t\tif latestStep, err = d.oneStep(motor, dir, style); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\ttime.Sleep(time.Duration(secPerStep) * time.Second)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (d *Adafruit2348Driver) oneStep(motor int, dir Adafruit2348Direction, style Adafruit2348StepStyle) (int, error) {\n\tpwmA := 255\n\tpwmB := 255\n\n\t// Determine the stepping procedure\n\tswitch style {\n\tcase Adafruit2348Single:\n\t\tif (d.stepperMotors[motor].currentStep / (adafruit2348StepperMicrosteps / 2) % 2) != 0 {\n\t\t\t// we're at an odd step\n\t\t\tif dir == Adafruit2348Forward {\n\t\t\t\td.stepperMotors[motor].currentStep += adafruit2348StepperMicrosteps / 2\n\t\t\t} else {\n\t\t\t\td.stepperMotors[motor].currentStep -= adafruit2348StepperMicrosteps / 2\n\t\t\t}\n\t\t} else {\n\t\t\t// go to next even step\n\t\t\tif dir == Adafruit2348Forward {\n\t\t\t\td.stepperMotors[motor].currentStep += adafruit2348StepperMicrosteps\n\t\t\t} else {\n\t\t\t\td.stepperMotors[motor].currentStep -= adafruit2348StepperMicrosteps\n\t\t\t}\n\t\t}\n\tcase Adafruit2348Double:\n\t\tif (d.stepperMotors[motor].currentStep / (adafruit2348StepperMicrosteps / 2) % 2) == 0 {\n\t\t\t// we're at an even step, weird\n\t\t\tif dir == Adafruit2348Forward {\n\t\t\t\td.stepperMotors[motor].currentStep += adafruit2348StepperMicrosteps / 2\n\t\t\t} else {\n\t\t\t\td.stepperMotors[motor].currentStep -= adafruit2348StepperMicrosteps / 2\n\t\t\t}\n\t\t} else {\n\t\t\t// go to next odd step\n\t\t\tif dir == Adafruit2348Forward {\n\t\t\t\td.stepperMotors[motor].currentStep += adafruit2348StepperMicrosteps\n\t\t\t} else {\n\t\t\t\td.stepperMotors[motor].currentStep -= adafruit2348StepperMicrosteps\n\t\t\t}\n\t\t}\n\tcase Adafruit2348Interleave:\n\t\tif dir == Adafruit2348Forward {\n\t\t\td.stepperMotors[motor].currentStep += adafruit2348StepperMicrosteps / 2\n\t\t} else {\n\t\t\td.stepperMotors[motor].currentStep -= adafruit2348StepperMicrosteps / 2\n\t\t}\n\tcase Adafruit2348Microstep:\n\t\tif dir == Adafruit2348Forward {\n\t\t\td.stepperMotors[motor].currentStep++\n\t\t} else {\n\t\t\td.stepperMotors[motor].currentStep--\n\t\t}\n\t\t// go to next step and wrap around\n\t\td.stepperMotors[motor].currentStep += adafruit2348StepperMicrosteps * 4\n\t\td.stepperMotors[motor].currentStep %= adafruit2348StepperMicrosteps * 4\n\n\t\tpwmA = 0\n\t\tpwmB = 0\n\t\tcurrStep := d.stepperMotors[motor].currentStep\n\t\tswitch {\n\t\tcase currStep >= 0 && currStep < adafruit2348StepperMicrosteps:\n\t\t\tpwmA = d.stepperMicrostepCurve[adafruit2348StepperMicrosteps-currStep]\n\t\t\tpwmB = d.stepperMicrostepCurve[currStep]\n\t\tcase currStep >= adafruit2348StepperMicrosteps && currStep < adafruit2348StepperMicrosteps*2:\n\t\t\tpwmA = d.stepperMicrostepCurve[currStep-adafruit2348StepperMicrosteps]\n\t\t\tpwmB = d.stepperMicrostepCurve[adafruit2348StepperMicrosteps*2-currStep]\n\t\tcase currStep >= adafruit2348StepperMicrosteps*2 && currStep < adafruit2348StepperMicrosteps*3:\n\t\t\tpwmA = d.stepperMicrostepCurve[adafruit2348StepperMicrosteps*3-currStep]\n\t\t\tpwmB = d.stepperMicrostepCurve[currStep-adafruit2348StepperMicrosteps*2]\n\t\tcase currStep >= adafruit2348StepperMicrosteps*3 && currStep < adafruit2348StepperMicrosteps*4:\n\t\t\tpwmA = d.stepperMicrostepCurve[currStep-adafruit2348StepperMicrosteps*3]\n\t\t\tpwmB = d.stepperMicrostepCurve[adafruit2348StepperMicrosteps*4-currStep]\n\t\t}\n\t} // switch\n\n\t// go to next 'step' and wrap around\n\td.stepperMotors[motor].currentStep += adafruit2348StepperMicrosteps * 4\n\td.stepperMotors[motor].currentStep %= adafruit2348StepperMicrosteps * 4\n\n\t// only really used for microstepping, otherwise always on!\n\t//nolint:gosec // TODO: fix later\n\tif err := d.SetPWM(int(d.stepperMotors[motor].pwmPinA), 0, uint16(pwmA*16)); err != nil {\n\t\treturn 0, err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := d.SetPWM(int(d.stepperMotors[motor].pwmPinB), 0, uint16(pwmB*16)); err != nil {\n\t\treturn 0, err\n\t}\n\tvar coils []int32\n\tcurrStep := d.stepperMotors[motor].currentStep\n\tif style == Adafruit2348Microstep {\n\t\tswitch {\n\t\tcase currStep >= 0 && currStep < adafruit2348StepperMicrosteps:\n\t\t\tcoils = []int32{1, 1, 0, 0}\n\t\tcase currStep >= adafruit2348StepperMicrosteps && currStep < adafruit2348StepperMicrosteps*2:\n\t\t\tcoils = []int32{0, 1, 1, 0}\n\t\tcase currStep >= adafruit2348StepperMicrosteps*2 && currStep < adafruit2348StepperMicrosteps*3:\n\t\t\tcoils = []int32{0, 0, 1, 1}\n\t\tcase currStep >= adafruit2348StepperMicrosteps*3 && currStep < adafruit2348StepperMicrosteps*4:\n\t\t\tcoils = []int32{1, 0, 0, 1}\n\t\t}\n\t} else {\n\t\t// step-2-coils is initialized in init()\n\t\tcoils = d.step2coils[(currStep / (adafruit2348StepperMicrosteps / 2))]\n\t}\n\tif adafruit2348Debug {\n\t\tlog.Printf(\"[adafruit2348_driver] currStep: %d, index into step2coils: %d\\n\",\n\t\t\tcurrStep, (currStep / (adafruit2348StepperMicrosteps / 2)))\n\t\tlog.Printf(\"[adafruit2348_driver] coils state = %v\", coils)\n\t}\n\tif err := d.setPin(d.stepperMotors[motor].ain2, coils[0]); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.setPin(d.stepperMotors[motor].bin1, coils[1]); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.setPin(d.stepperMotors[motor].ain1, coils[2]); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.setPin(d.stepperMotors[motor].bin2, coils[3]); err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.stepperMotors[motor].currentStep, nil\n}\n\nfunc (d *Adafruit2348Driver) setPin(pin byte, value int32) error {\n\tif value == 0 {\n\t\treturn d.SetPWM(int(pin), 0, 4096)\n\t}\n\tif value == 1 {\n\t\treturn d.SetPWM(int(pin), 4096, 0)\n\t}\n\treturn errors.New(\"invalid pin\")\n}\n"
  },
  {
    "path": "drivers/i2c/adafruit2348_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation implements the gobot.Driver interface\nvar _ gobot.Driver = (*Adafruit2348Driver)(nil)\n\nfunc initTestAdafruit2348WithStubbedAdaptor() (*Adafruit2348Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewAdafruit2348Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewAdafruit2348Driver(t *testing.T) {\n\t// arrange & act\n\td := NewAdafruit2348Driver(newI2cTestAdaptor())\n\t// assert\n\tassert.IsType(t, &Adafruit2348Driver{}, d)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Adafruit2348MotorHat\"))\n\tassert.Equal(t, 0x40, d.defaultAddress)                        // the default address of PCA9685 driver\n\tassert.Equal(t, 0x60, d.GetAddressOrDefault(d.defaultAddress)) // the really used address\n}\n\nfunc TestAdafruit2348Halt(t *testing.T) {\n\t// arrange\n\td := NewAdafruit2348Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestAdafruit2348Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\t// arrange & act\n\td := NewAdafruit2348Driver(newI2cTestAdaptor(), WithBus(2), WithAddress(0x45))\n\t// assert\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, 0x45, d.GetAddressOrDefault(2))\n}\n\nfunc TestAdafruit2348SetDCMotorSpeed(t *testing.T) {\n\t// arrange\n\td, a := initTestAdafruit2348WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tdcMotor = 1\n\t\tspeed   = 255\n\t)\n\t// act\n\terr := d.SetDCMotorSpeed(dcMotor, speed)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 8) // detailed test, see \"TestPCA9685SetPWM\"\n}\n\nfunc TestAdafruit2348SetDCMotorSpeedError(t *testing.T) {\n\t// arrange\n\td, a := initTestAdafruit2348WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, d.SetDCMotorSpeed(1, 255), \"write error\")\n}\n\nfunc TestAdafruit2348RunDCMotor(t *testing.T) {\n\t// arrange\n\td, _ := initTestAdafruit2348WithStubbedAdaptor()\n\tconst dcMotor = 1\n\t// act & assert\n\trequire.NoError(t, d.RunDCMotor(dcMotor, Adafruit2348Forward))\n\trequire.NoError(t, d.RunDCMotor(dcMotor, Adafruit2348Backward))\n\trequire.NoError(t, d.RunDCMotor(dcMotor, Adafruit2348Release))\n}\n\nfunc TestAdafruit2348RunDCMotorError(t *testing.T) {\n\t// arrange\n\td, a := initTestAdafruit2348WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\tconst dcMotor = 1\n\t// act & assert\n\trequire.ErrorContains(t, d.RunDCMotor(dcMotor, Adafruit2348Forward), \"write error\")\n\trequire.ErrorContains(t, d.RunDCMotor(dcMotor, Adafruit2348Backward), \"write error\")\n\trequire.ErrorContains(t, d.RunDCMotor(dcMotor, Adafruit2348Release), \"write error\")\n}\n\nfunc TestAdafruit2348SetStepperMotorSpeed(t *testing.T) {\n\t// arrange\n\td, _ := initTestAdafruit2348WithStubbedAdaptor()\n\tconst (\n\t\tstepperMotor = 1\n\t\trpm          = 30\n\t)\n\t// act & assert\n\trequire.NoError(t, d.SetStepperMotorSpeed(stepperMotor, rpm))\n\tassert.InDelta(t, 0.01, d.stepperMotors[stepperMotor].secPerStep, 0.0) // 60/(revSteps*rpm), revSteps=200\n}\n\nfunc TestAdafruit2348StepperSingleStep(t *testing.T) {\n\t// arrange\n\td, _ := initTestAdafruit2348WithStubbedAdaptor()\n\tconst (\n\t\tstepperMotor = 0\n\t\tsteps        = 50\n\t\tback         = 1\n\t\tsingle       = 0\n\t)\n\t// act\n\terr := d.Step(stepperMotor, steps, back, single)\n\t// assert\n\trequire.NoError(t, err)\n}\n\nfunc TestAdafruit2348StepperDoubleStep(t *testing.T) {\n\t// arrange\n\td, _ := initTestAdafruit2348WithStubbedAdaptor()\n\tconst (\n\t\tstepperMotor = 0\n\t\tsteps        = 50\n\t\tback         = 1\n\t\tdouble       = 1\n\t)\n\t// act\n\terr := d.Step(stepperMotor, steps, back, double)\n\t// assert\n\trequire.NoError(t, err)\n}\n\nfunc TestAdafruit2348StepperInterleaveStep(t *testing.T) {\n\t// arrange\n\td, _ := initTestAdafruit2348WithStubbedAdaptor()\n\tconst (\n\t\tstepperMotor = 0\n\t\tsteps        = 50\n\t\tback         = 1\n\t\tinterleave   = 2\n\t)\n\t// act\n\terr := d.Step(stepperMotor, steps, back, interleave)\n\t// assert\n\trequire.NoError(t, err)\n}\n\nfunc TestAdafruit2348StepperMicroStep(t *testing.T) {\n\t// arrange\n\td, _ := initTestAdafruit2348WithStubbedAdaptor()\n\tconst (\n\t\tstepperMotor = 0\n\t\tsteps        = 50\n\t\tback         = 1\n\t\tmicro        = 3\n\t)\n\t// act\n\terr := d.Step(stepperMotor, steps, back, micro)\n\t// assert\n\trequire.NoError(t, err)\n}\n"
  },
  {
    "path": "drivers/i2c/ads1x15_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"math\"\n\t\"sort\"\n\t\"strconv\"\n\t\"time\"\n)\n\nconst ads1x15DefaultAddress = 0x48\n\nconst (\n\tads1x15Debug          = false\n\tads1x15WaitMaxCount   = 200\n\tads1x15FullScaleValue = 0x7FFF // same as 32768, 1<<15 or 64\n)\n\nconst (\n\t// Address pointer registers\n\tads1x15PointerConversion    = 0x00\n\tads1x15PointerConfig        = 0x01\n\tads1x15PointerLowThreshold  = 0x02\n\tads1x15PointerHighThreshold = 0x03\n\n\t// Values for config register\n\tads1x15ConfigCompQueDisable = 0x0003\n\tads1x15ConfigCompLatching   = 0x0004\n\tads1x15ConfigCompActiveHigh = 0x0008\n\tads1x15ConfigCompWindow     = 0x0010\n\n\tads1x15ConfigModeContinuous = 0x0000\n\tads1x15ConfigModeSingle     = 0x0100 // single shot mode\n\tads1x15ConfigOsSingle       = 0x8000 // write: set to start a single-conversion, read: wait for finished\n\tads1x15ConfigMuxOffset      = 12\n\tads1x15ConfigPgaOffset      = 9\n)\n\ntype ads1x15ChanCfg struct {\n\tgain     int\n\tdataRate int\n}\n\n// ADS1x15Driver is the Gobot driver for the ADS1015/ADS1115 ADC\n// datasheet:\n// https://www.ti.com/lit/gpn/ads1115\n//\n// reference implementations:\n// * https://github.com/adafruit/Adafruit_Python_ADS1x15\n// * https://github.com/Wh1teRabbitHU/ADS1115-Driver\ntype ADS1x15Driver struct {\n\t*Driver\n\n\tdataRates        map[int]uint16\n\tchannelCfgs      map[int]*ads1x15ChanCfg\n\twaitOnlyOneCycle bool\n}\n\nvar ads1x15FullScaleRange = map[int]float64{\n\t0: 6.144,\n\t1: 4.096,\n\t2: 2.048,\n\t3: 1.024,\n\t4: 0.512,\n\t5: 0.256,\n\t6: 0.256,\n\t7: 0.256,\n}\n\n// NewADS1015Driver creates a new driver for the ADS1015 (12-bit ADC)\nfunc NewADS1015Driver(a Connector, options ...func(Config)) *ADS1x15Driver {\n\tdataRates := map[int]uint16{\n\t\t128:  0x0000,\n\t\t250:  0x0020,\n\t\t490:  0x0040,\n\t\t920:  0x0060,\n\t\t1600: 0x0080,\n\t\t2400: 0x00A0,\n\t\t3300: 0x00C0,\n\t}\n\tdefaultDataRate := 1600\n\n\treturn newADS1x15Driver(a, \"ADS1015\", dataRates, defaultDataRate, options...)\n}\n\n// NewADS1115Driver creates a new driver for the ADS1115 (16-bit ADC)\nfunc NewADS1115Driver(a Connector, options ...func(Config)) *ADS1x15Driver {\n\tdataRates := map[int]uint16{\n\t\t8:   0x0000,\n\t\t16:  0x0020,\n\t\t32:  0x0040,\n\t\t64:  0x0060,\n\t\t128: 0x0080,\n\t\t250: 0x00A0,\n\t\t475: 0x00C0,\n\t\t860: 0x00E0,\n\t}\n\tdefaultDataRate := 128\n\n\treturn newADS1x15Driver(a, \"ADS1115\", dataRates, defaultDataRate, options...)\n}\n\nfunc newADS1x15Driver(c Connector, name string, drs map[int]uint16, ddr int, options ...func(Config)) *ADS1x15Driver {\n\tccs := map[int]*ads1x15ChanCfg{0: {1, ddr}, 1: {1, ddr}, 2: {1, ddr}, 3: {1, ddr}}\n\td := &ADS1x15Driver{\n\t\tDriver:      NewDriver(c, name, ads1x15DefaultAddress),\n\t\tdataRates:   drs,\n\t\tchannelCfgs: ccs,\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ReadDifferenceWithDefaults\", func(params map[string]interface{}) interface{} {\n\t\tchannel := params[\"channel\"].(int)\n\t\tval, err := d.ReadDifferenceWithDefaults(channel)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ReadDifference\", func(params map[string]interface{}) interface{} {\n\t\tchannel := params[\"channel\"].(int)\n\t\tgain := params[\"gain\"].(int)\n\t\tdataRate := params[\"dataRate\"].(int)\n\t\tval, err := d.ReadDifference(channel, gain, dataRate)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ReadWithDefaults\", func(params map[string]interface{}) interface{} {\n\t\tchannel := params[\"channel\"].(int)\n\t\tval, err := d.ReadWithDefaults(channel)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Read\", func(params map[string]interface{}) interface{} {\n\t\tchannel := params[\"channel\"].(int)\n\t\tgain := params[\"gain\"].(int)\n\t\tdataRate := params[\"dataRate\"].(int)\n\t\tval, err := d.Read(channel, gain, dataRate)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"AnalogRead\", func(params map[string]interface{}) interface{} {\n\t\tpin := params[\"pin\"].(string)\n\t\tval, err := d.AnalogRead(pin)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\treturn d\n}\n\n// WithADS1x15BestGainForVoltage option sets the ADS1x15Driver best gain for all channels.\nfunc WithADS1x15BestGainForVoltage(voltage float64) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*ADS1x15Driver)\n\t\tif ok {\n\t\t\t// validate the given value\n\t\t\tbestGain, err := ads1x15BestGainForVoltage(voltage)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tWithADS1x15Gain(bestGain)(d)\n\t\t} else if ads1x15Debug {\n\t\t\tlog.Printf(\"Trying to set best gain for voltage for non-ADS1x15Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADS1x15ChannelBestGainForVoltage option sets the ADS1x15Driver best gain for one channel.\nfunc WithADS1x15ChannelBestGainForVoltage(channel int, voltage float64) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*ADS1x15Driver)\n\t\tif ok {\n\t\t\t// validate the given value\n\t\t\tbestGain, err := ads1x15BestGainForVoltage(voltage)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tWithADS1x15ChannelGain(channel, bestGain)(d)\n\t\t} else if ads1x15Debug {\n\t\t\tlog.Printf(\"Trying to set channel best gain for voltage for non-ADS1x15Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADS1x15Gain option sets the ADS1x15Driver gain for all channels.\n// Valid gain settings are any of the PGA values (0..7).\nfunc WithADS1x15Gain(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*ADS1x15Driver)\n\t\tif ok {\n\t\t\t// validate the given value\n\t\t\tif _, err := ads1x15GetFullScaleRange(val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.setChannelGains(val)\n\t\t} else if ads1x15Debug {\n\t\t\tlog.Printf(\"Trying to set gain for non-ADS1x15Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADS1x15ChannelGain option sets the ADS1x15Driver gain for one channel.\n// Valid gain settings are any of the PGA values (0..7).\nfunc WithADS1x15ChannelGain(channel int, val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*ADS1x15Driver)\n\t\tif ok {\n\t\t\t// validate the given value\n\t\t\tif _, err := ads1x15GetFullScaleRange(val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tif err := d.checkChannel(channel); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.channelCfgs[channel].gain = val\n\t\t} else if ads1x15Debug {\n\t\t\tlog.Printf(\"Trying to set channel gain for non-ADS1x15Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADS1x15DataRate option sets the ADS1x15Driver data rate for all channels.\n// Valid gain settings are any of the DR values in SPS.\nfunc WithADS1x15DataRate(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*ADS1x15Driver)\n\t\tif ok {\n\t\t\t// validate the given value\n\t\t\tif _, err := ads1x15GetDataRateBits(d.dataRates, val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.setChannelDataRates(val)\n\t\t} else if ads1x15Debug {\n\t\t\tlog.Printf(\"Trying to set data rate for non-ADS1x15Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADS1x15ChannelDataRate option sets the ADS1x15Driver data rate for one channel.\n// Valid gain settings are any of the DR values in SPS.\nfunc WithADS1x15ChannelDataRate(channel int, val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*ADS1x15Driver)\n\t\tif ok {\n\t\t\t// validate the given values\n\t\t\tif _, err := ads1x15GetDataRateBits(d.dataRates, val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tif err := d.checkChannel(channel); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.channelCfgs[channel].dataRate = val\n\t\t} else if ads1x15Debug {\n\t\t\tlog.Printf(\"Trying to set channel data rate for non-ADS1x15Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADS1x15WaitSingleCycle option sets the ADS1x15Driver to wait only a single cycle for conversion. According to the\n// specification, chapter \"Output Data Rate and Conversion Time\", the device normally finishes the conversion within one\n// cycle (after wake up). The cycle time depends on configured data rate and will be calculated. For unknown reasons\n// some devices do not work with this setting. So the default behavior for single shot mode is to wait for a conversion\n// is finished by reading the configuration register bit 15. Activating this option will switch off this behavior and\n// will possibly create faster response. But, if multiple inputs are used and some inputs calculates the same result,\n// most likely the device is not working with this option.\nfunc WithADS1x15WaitSingleCycle() func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*ADS1x15Driver)\n\t\tif ok {\n\t\t\td.waitOnlyOneCycle = true\n\t\t} else if ads1x15Debug {\n\t\t\tlog.Printf(\"Trying to set wait single cycle for non-ADS1x15Driver %v\", c)\n\t\t}\n\t}\n}\n\n// ReadDifferenceWithDefaults reads the difference in V between 2 inputs. It uses the default gain and data rate\n// diff can be:\n// * 0: Channel 0 - channel 1\n// * 1: Channel 0 - channel 3\n// * 2: Channel 1 - channel 3\n// * 3: Channel 2 - channel 3\nfunc (d *ADS1x15Driver) ReadDifferenceWithDefaults(diff int) (float64, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.checkChannel(diff); err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.readVoltage(diff, 0, d.channelCfgs[diff].gain, d.channelCfgs[diff].dataRate)\n}\n\n// ReadDifference reads the difference in V between 2 inputs.\n// diff can be:\n// * 0: Channel 0 - channel 1\n// * 1: Channel 0 - channel 3\n// * 2: Channel 1 - channel 3\n// * 3: Channel 2 - channel 3\nfunc (d *ADS1x15Driver) ReadDifference(diff int, gain int, dataRate int) (float64, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.checkChannel(diff); err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.readVoltage(diff, 0, gain, dataRate)\n}\n\n// ReadWithDefaults reads the voltage at the specified channel (between 0 and 3).\n// Default values are used for the gain and data rate. The result is in V.\nfunc (d *ADS1x15Driver) ReadWithDefaults(channel int) (float64, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.checkChannel(channel); err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.readVoltage(channel, 0x04, d.channelCfgs[channel].gain, d.channelCfgs[channel].dataRate)\n}\n\n// Read reads the voltage at the specified channel (between 0 and 3). The result is in V.\nfunc (d *ADS1x15Driver) Read(channel int, gain int, dataRate int) (float64, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.checkChannel(channel); err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.readVoltage(channel, 0x04, gain, dataRate)\n}\n\n// AnalogRead returns value from analog reading of specified pin using the default values.\nfunc (d *ADS1x15Driver) AnalogRead(pin string) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tvar channel int\n\tvar channelOffset int\n\n\t// Check for the ADC is used in difference mode\n\tswitch pin {\n\tcase \"0-1\":\n\t\tchannel = 0\n\tcase \"0-3\":\n\t\tchannel = 1\n\tcase \"1-3\":\n\t\tchannel = 2\n\tcase \"2-3\":\n\t\tchannel = 3\n\tdefault:\n\t\t// read the voltage at a specific pin, compared to the ground\n\t\tvar err error\n\t\tchannel, err = strconv.Atoi(pin)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tchannelOffset = 0x04\n\t}\n\n\tif err := d.checkChannel(channel); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn d.rawRead(channel, channelOffset, d.channelCfgs[channel].gain, d.channelCfgs[channel].dataRate)\n}\n\nfunc (d *ADS1x15Driver) readVoltage(channel int, channelOffset int, gain int, dataRate int) (float64, error) {\n\tfsr, err := ads1x15GetFullScaleRange(gain)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\trawValue, err := d.rawRead(channel, channelOffset, gain, dataRate)\n\n\t// Calculate return value in V\n\tvalue := float64(rawValue) / float64(1<<15) * fsr\n\n\treturn value, err\n}\n\nfunc (d *ADS1x15Driver) rawRead(channel int, channelOffset int, gain int, dataRate int) (int, error) {\n\t// Validate the passed in data rate (differs between ADS1015 and ADS1115).\n\tdataRateBits, err := ads1x15GetDataRateBits(d.dataRates, dataRate)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar config uint16\n\t// Go out of power-down mode for conversion.\n\tconfig = ads1x15ConfigOsSingle\n\n\t// Specify mux value.\n\tmux := channel + channelOffset\n\tconfig |= uint16((mux & 0x07) << ads1x15ConfigMuxOffset) //nolint:gosec // TODO: fix later\n\n\t// Set the programmable gain amplifier bits.\n\tconfig |= uint16(gain) << ads1x15ConfigPgaOffset //nolint:gosec // TODO: fix later\n\n\t// Set the mode (continuous or single shot).\n\tconfig |= ads1x15ConfigModeSingle\n\n\t// Set the data rate.\n\tconfig |= dataRateBits\n\n\t// Disable comparator mode.\n\tconfig |= ads1x15ConfigCompQueDisable\n\n\t// Send the config value to start the ADC conversion.\n\tif err := d.writeWordBigEndian(ads1x15PointerConfig, config); err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Wait for the ADC sample to finish based on the sample rate plus a\n\t// small offset to be sure (0.1 millisecond).\n\tdelay := time.Duration(1000000/dataRate+100) * time.Microsecond\n\tif err := d.waitForConversionFinished(delay); err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Retrieve the result.\n\tudata, err := d.readWordBigEndian(ads1x15PointerConversion)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Handle negative values as two's complement\n\treturn int(twosComplement16Bit(udata)), nil\n}\n\nfunc (d *ADS1x15Driver) checkChannel(channel int) error {\n\tif channel < 0 || channel > 3 {\n\t\treturn fmt.Errorf(\"invalid channel (%d), must be between 0 and 3\", channel)\n\t}\n\treturn nil\n}\n\nfunc (d *ADS1x15Driver) waitForConversionFinished(delay time.Duration) error {\n\tstart := time.Now()\n\n\tfor i := 0; i < ads1x15WaitMaxCount; i++ {\n\t\tif i == ads1x15WaitMaxCount-1 {\n\t\t\t// most likely the last try will also not finish, so we stop with an error\n\t\t\treturn fmt.Errorf(\"the conversion is not finished within %s\", time.Since(start))\n\t\t}\n\n\t\tdata, err := d.readWordBigEndian(ads1x15PointerConfig)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif ads1x15Debug {\n\t\t\tlog.Printf(\"ADS1x15Driver: config register state: 0x%X\\n\", data)\n\t\t}\n\t\t// the highest bit 15: 0-device perform a conversion, 1-no conversion in progress\n\t\tif data&ads1x15ConfigOsSingle > 0 {\n\t\t\tbreak\n\t\t}\n\t\ttime.Sleep(delay)\n\t\tif d.waitOnlyOneCycle {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif ads1x15Debug {\n\t\telapsed := time.Since(start)\n\t\tlog.Printf(\"conversion takes %s\", elapsed)\n\t}\n\n\treturn nil\n}\n\nfunc (d *ADS1x15Driver) writeWordBigEndian(reg uint8, val uint16) error {\n\treturn d.writeWordData(reg, swapBytes(val))\n}\n\nfunc (d *ADS1x15Driver) readWordBigEndian(reg uint8) (uint16, error) {\n\tdata, err := d.readWordData(reg)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn swapBytes(data), err\n}\n\nfunc (d *ADS1x15Driver) setChannelDataRates(ddr int) {\n\tfor i := 0; i <= 3; i++ {\n\t\td.channelCfgs[i].dataRate = ddr\n\t}\n}\n\nfunc (d *ADS1x15Driver) setChannelGains(gain int) {\n\tfor i := 0; i <= 3; i++ {\n\t\td.channelCfgs[i].gain = gain\n\t}\n}\n\nfunc ads1x15GetFullScaleRange(gain int) (float64, error) {\n\tif fsr, ok := ads1x15FullScaleRange[gain]; ok {\n\t\treturn fsr, nil\n\t}\n\n\tkeys := []int{}\n\tfor k := range ads1x15FullScaleRange {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Ints(keys)\n\n\treturn 0, fmt.Errorf(\"gain (%d) must be one of: %d\", gain, keys)\n}\n\nfunc ads1x15GetDataRateBits(dataRates map[int]uint16, dataRate int) (uint16, error) {\n\tif bits, ok := dataRates[dataRate]; ok {\n\t\treturn bits, nil\n\t}\n\n\tkeys := []int{}\n\tfor k := range dataRates {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Ints(keys)\n\n\treturn 0, fmt.Errorf(\"invalid data rate (%d). Accepted values: %d\", dataRate, keys)\n}\n\n// ads1x15BestGainForVoltage returns the gain the most adapted to read up to the specified difference of potential.\nfunc ads1x15BestGainForVoltage(voltage float64) (int, error) {\n\tvar maximum float64\n\tdifference := math.MaxFloat64\n\tcurrentBestGain := -1\n\n\tfor key, fsr := range ads1x15FullScaleRange {\n\t\tmaximum = math.Max(maximum, fsr)\n\t\tnewDiff := fsr - voltage\n\t\tif newDiff >= 0 && newDiff < difference {\n\t\t\tdifference = newDiff\n\t\t\tcurrentBestGain = key\n\t\t}\n\t}\n\n\tif currentBestGain < 0 {\n\t\treturn 0, fmt.Errorf(\"the maximum voltage which can be read is %f\", maximum)\n\t}\n\n\treturn currentBestGain, nil\n}\n"
  },
  {
    "path": "drivers/i2c/ads1x15_driver_1015_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc initTestADS1015DriverWithStubbedAdaptor() (*ADS1x15Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewADS1015Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewADS1015Driver(t *testing.T) {\n\tvar di interface{} = NewADS1015Driver(newI2cTestAdaptor())\n\td, ok := di.(*ADS1x15Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewADS1015Driver() should have returned a *ADS1x15Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"ADS1015\"))\n\tfor i := 0; i <= 3; i++ {\n\t\tassert.Equal(t, 1, d.channelCfgs[i].gain)\n\t\tassert.Equal(t, 1600, d.channelCfgs[i].dataRate)\n\t}\n}\n\nfunc TestADS1015Halt(t *testing.T) {\n\t// arrange\n\td := NewADS1015Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestADS1015Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewADS1015Driver(newI2cTestAdaptor(), WithBus(2), WithADS1x15Gain(2), WithADS1x15DataRate(920))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tfor i := 0; i <= 3; i++ {\n\t\tassert.Equal(t, 2, d.channelCfgs[i].gain)\n\t\tassert.Equal(t, 920, d.channelCfgs[i].dataRate)\n\t}\n}\n\nfunc TestADS1015WithADS1x15BestGainForVoltage(t *testing.T) {\n\td, _ := initTestADS1015DriverWithStubbedAdaptor()\n\tWithADS1x15BestGainForVoltage(1.01)(d)\n\tfor i := 0; i <= 3; i++ {\n\t\tassert.Equal(t, 3, d.channelCfgs[i].gain)\n\t}\n}\n\nfunc TestADS1015WithADS1x15ChannelBestGainForVoltage(t *testing.T) {\n\td, _ := initTestADS1015DriverWithStubbedAdaptor()\n\tWithADS1x15ChannelBestGainForVoltage(0, 1.0)(d)\n\tWithADS1x15ChannelBestGainForVoltage(1, 2.5)(d)\n\tWithADS1x15ChannelBestGainForVoltage(2, 3.3)(d)\n\tWithADS1x15ChannelBestGainForVoltage(3, 5.0)(d)\n\tassert.Equal(t, 3, d.channelCfgs[0].gain)\n\tassert.Equal(t, 1, d.channelCfgs[1].gain)\n\tassert.Equal(t, 1, d.channelCfgs[2].gain)\n\tassert.Equal(t, 0, d.channelCfgs[3].gain)\n}\n\nfunc TestADS1015AnalogRead(t *testing.T) {\n\td, a := initTestADS1015DriverWithStubbedAdaptor()\n\tWithADS1x15WaitSingleCycle()(d)\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x7F, 0xFF})\n\t\treturn 2, nil\n\t}\n\n\tval, err := d.AnalogRead(\"0\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"1\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"2\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"0-1\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"0-3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"1-3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"2-3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\t_, err = d.AnalogRead(\"3-2\")\n\trequire.Error(t, err)\n}\n\nfunc TestADS1x15AnalogReadError(t *testing.T) {\n\td, a := initTestADS1015DriverWithStubbedAdaptor()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_, err := d.AnalogRead(\"0\")\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestADS1x15AnalogReadInvalidPin(t *testing.T) {\n\td, _ := initTestADS1015DriverWithStubbedAdaptor()\n\n\t_, err := d.AnalogRead(\"99\")\n\trequire.ErrorContains(t, err, \"invalid channel (99), must be between 0 and 3\")\n}\n\nfunc TestADS1x15AnalogReadWriteError(t *testing.T) {\n\td, a := initTestADS1015DriverWithStubbedAdaptor()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\t_, err := d.AnalogRead(\"0\")\n\trequire.ErrorContains(t, err, \"write error\")\n\n\t_, err = d.AnalogRead(\"0-1\")\n\trequire.ErrorContains(t, err, \"write error\")\n\n\t_, err = d.AnalogRead(\"2-3\")\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestADS1x15ReadInvalidChannel(t *testing.T) {\n\td, _ := initTestADS1015DriverWithStubbedAdaptor()\n\n\t_, err := d.Read(9, 1, 1600)\n\trequire.ErrorContains(t, err, \"invalid channel (9), must be between 0 and 3\")\n}\n\nfunc TestADS1x15ReadInvalidGain(t *testing.T) {\n\td, _ := initTestADS1015DriverWithStubbedAdaptor()\n\n\t_, err := d.Read(0, 8, 1600)\n\trequire.ErrorContains(t, err, \"gain (8) must be one of: [0 1 2 3 4 5 6 7]\")\n}\n\nfunc TestADS1x15ReadInvalidDataRate(t *testing.T) {\n\td, _ := initTestADS1015DriverWithStubbedAdaptor()\n\n\t_, err := d.Read(0, 1, 321)\n\trequire.ErrorContains(t, err, \"invalid data rate (321). Accepted values: [128 250 490 920 1600 2400 3300]\")\n}\n\nfunc TestADS1x15ReadDifferenceInvalidChannel(t *testing.T) {\n\td, _ := initTestADS1015DriverWithStubbedAdaptor()\n\n\t_, err := d.ReadDifference(9, 1, 1600)\n\trequire.ErrorContains(t, err, \"invalid channel (9), must be between 0 and 3\")\n}\n\nfunc TestADS1015_rawRead(t *testing.T) {\n\t// sequence to read:\n\t// * prepare config register content (mode, input, gain, data rate, comparator)\n\t// * write config register (16 bit, MSByte first)\n\t// * read config register (16 bit, MSByte first) and wait for bit 15 is set\n\t// * read conversion register (16 bit, MSByte first) for the value\n\t// * apply two's complement converter, relates to one digit resolution (1/2^15), voltage multiplier\n\ttests := map[string]struct {\n\t\tinput      []uint8\n\t\tgain       int\n\t\tdataRate   int\n\t\twant       int\n\t\twantConfig []uint8\n\t}{\n\t\t\"+FS\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       0,\n\t\t\tdataRate:   128,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x91, 0x03},\n\t\t},\n\t\t\"+1\": {\n\t\t\tinput:      []uint8{0x00, 0x01},\n\t\t\tgain:       0,\n\t\t\tdataRate:   250,\n\t\t\twant:       1,\n\t\t\twantConfig: []uint8{0x91, 0x23},\n\t\t},\n\t\t\"+-0\": {\n\t\t\tinput:      []uint8{0x00, 0x00},\n\t\t\tgain:       0,\n\t\t\tdataRate:   490,\n\t\t\twant:       0,\n\t\t\twantConfig: []uint8{0x91, 0x43},\n\t\t},\n\t\t\"-1\": {\n\t\t\tinput:      []uint8{0xFF, 0xFF},\n\t\t\tgain:       0,\n\t\t\tdataRate:   920,\n\t\t\twant:       -1,\n\t\t\twantConfig: []uint8{0x91, 0x63},\n\t\t},\n\t\t\"-FS\": {\n\t\t\tinput:      []uint8{0x80, 0x00},\n\t\t\tgain:       0,\n\t\t\tdataRate:   1600,\n\t\t\twant:       -(1 << 15),\n\t\t\twantConfig: []uint8{0x91, 0x83},\n\t\t},\n\t\t\"+FS gain 1\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       1,\n\t\t\tdataRate:   2400,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x93, 0xA3},\n\t\t},\n\t\t\"+FS gain 3\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       3,\n\t\t\tdataRate:   3300,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x97, 0xC3},\n\t\t},\n\t\t\"+FS gain 5\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       5,\n\t\t\tdataRate:   2400,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x9B, 0xA3},\n\t\t},\n\t\t\"+FS gain 7\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       7,\n\t\t\tdataRate:   1600,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x9F, 0x83},\n\t\t},\n\t}\n\td, a := initTestADS1015DriverWithStubbedAdaptor()\n\t// arrange\n\tchannel := 0\n\tchannelOffset := 1\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\t// arrange reads\n\t\t\tconversion := []uint8{0x00, 0x00}   // a conversion is in progress\n\t\t\tnoConversion := []uint8{0x80, 0x00} // no conversion in progress\n\t\t\treturnRead := [3][]uint8{conversion, noConversion, tc.input}\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tretRead := returnRead[numCallsRead-1]\n\t\t\t\tcopy(b, retRead)\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.rawRead(channel, channelOffset, tc.gain, tc.dataRate)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, 3, numCallsRead)\n\t\t\tassert.Len(t, a.written, 6)\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConfig), a.written[0])\n\t\t\tassert.Equal(t, tc.wantConfig[0], a.written[1])            // MSByte: OS, MUX, PGA, MODE\n\t\t\tassert.Equal(t, tc.wantConfig[1], a.written[2])            // LSByte: DR, COMP_*\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConfig), a.written[3]) // first check for no conversion\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConfig), a.written[4]) // second check for no conversion\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConversion), a.written[5])\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/ads1x15_driver_1115_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc initTestADS1115DriverWithStubbedAdaptor() (*ADS1x15Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewADS1115Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewADS1115Driver(t *testing.T) {\n\tvar di interface{} = NewADS1115Driver(newI2cTestAdaptor())\n\td, ok := di.(*ADS1x15Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewADS1115Driver() should have returned a *ADS1x15Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"ADS1115\"))\n\tfor i := 0; i <= 3; i++ {\n\t\tassert.Equal(t, 1, d.channelCfgs[i].gain)\n\t\tassert.Equal(t, 128, d.channelCfgs[i].dataRate)\n\t}\n}\n\nfunc TestADS1115Halt(t *testing.T) {\n\t// arrange\n\td := NewADS1115Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestADS1115Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewADS1115Driver(newI2cTestAdaptor(), WithBus(2), WithADS1x15Gain(2), WithADS1x15DataRate(860))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tfor i := 0; i <= 3; i++ {\n\t\tassert.Equal(t, 2, d.channelCfgs[i].gain)\n\t\tassert.Equal(t, 860, d.channelCfgs[i].dataRate)\n\t}\n}\n\nfunc TestADS1115WithADS1x15BestGainForVoltage(t *testing.T) {\n\td, _ := initTestADS1115DriverWithStubbedAdaptor()\n\tWithADS1x15BestGainForVoltage(1.01)(d)\n\tfor i := 0; i <= 3; i++ {\n\t\tassert.Equal(t, 3, d.channelCfgs[i].gain)\n\t}\n}\n\nfunc TestADS1115WithADS1x15ChannelBestGainForVoltage(t *testing.T) {\n\td, _ := initTestADS1115DriverWithStubbedAdaptor()\n\tWithADS1x15ChannelBestGainForVoltage(0, 1.0)(d)\n\tWithADS1x15ChannelBestGainForVoltage(1, 2.5)(d)\n\tWithADS1x15ChannelBestGainForVoltage(2, 3.3)(d)\n\tWithADS1x15ChannelBestGainForVoltage(3, 5.0)(d)\n\tassert.Equal(t, 3, d.channelCfgs[0].gain)\n\tassert.Equal(t, 1, d.channelCfgs[1].gain)\n\tassert.Equal(t, 1, d.channelCfgs[2].gain)\n\tassert.Equal(t, 0, d.channelCfgs[3].gain)\n}\n\nfunc TestADS1115AnalogRead(t *testing.T) {\n\td, a := initTestADS1115DriverWithStubbedAdaptor()\n\tWithADS1x15WaitSingleCycle()(d)\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x7F, 0xFF})\n\t\treturn 2, nil\n\t}\n\n\tval, err := d.AnalogRead(\"0\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"1\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"2\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"0-1\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"0-3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"1-3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\tval, err = d.AnalogRead(\"2-3\")\n\tassert.Equal(t, 32767, val)\n\trequire.NoError(t, err)\n\n\t_, err = d.AnalogRead(\"3-2\")\n\trequire.Error(t, err)\n}\n\nfunc TestADS1115AnalogReadError(t *testing.T) {\n\td, a := initTestADS1115DriverWithStubbedAdaptor()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_, err := d.AnalogRead(\"0\")\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestADS1115AnalogReadInvalidPin(t *testing.T) {\n\td, _ := initTestADS1115DriverWithStubbedAdaptor()\n\n\t_, err := d.AnalogRead(\"98\")\n\trequire.ErrorContains(t, err, \"invalid channel (98), must be between 0 and 3\")\n}\n\nfunc TestADS1115AnalogReadWriteError(t *testing.T) {\n\td, a := initTestADS1115DriverWithStubbedAdaptor()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\t_, err := d.AnalogRead(\"0\")\n\trequire.ErrorContains(t, err, \"write error\")\n\n\t_, err = d.AnalogRead(\"0-1\")\n\trequire.ErrorContains(t, err, \"write error\")\n\n\t_, err = d.AnalogRead(\"2-3\")\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestADS1115ReadInvalidChannel(t *testing.T) {\n\td, _ := initTestADS1115DriverWithStubbedAdaptor()\n\n\t_, err := d.Read(7, 1, 1600)\n\trequire.ErrorContains(t, err, \"invalid channel (7), must be between 0 and 3\")\n}\n\nfunc TestADS1115ReadInvalidGain(t *testing.T) {\n\td, _ := initTestADS1115DriverWithStubbedAdaptor()\n\n\t_, err := d.Read(0, 21, 1600)\n\trequire.ErrorContains(t, err, \"gain (21) must be one of: [0 1 2 3 4 5 6 7]\")\n}\n\nfunc TestADS1115ReadInvalidDataRate(t *testing.T) {\n\td, _ := initTestADS1115DriverWithStubbedAdaptor()\n\n\t_, err := d.Read(0, 1, 678)\n\trequire.ErrorContains(t, err, \"invalid data rate (678). Accepted values: [8 16 32 64 128 250 475 860]\")\n}\n\nfunc TestADS1115ReadDifferenceInvalidChannel(t *testing.T) {\n\td, _ := initTestADS1115DriverWithStubbedAdaptor()\n\n\t_, err := d.ReadDifference(5, 1, 1600)\n\trequire.ErrorContains(t, err, \"invalid channel (5), must be between 0 and 3\")\n}\n\nfunc TestADS1115_rawRead(t *testing.T) {\n\t// sequence to read:\n\t// * prepare config register content (mode, input, gain, data rate, comparator)\n\t// * write config register (16 bit, MSByte first)\n\t// * read config register (16 bit, MSByte first) and wait for bit 15 is set\n\t// * read conversion register (16 bit, MSByte first) for the value\n\t// * apply two's complement converter, relates to one digit resolution (1/2^15), voltage multiplier\n\ttests := map[string]struct {\n\t\tinput      []uint8\n\t\tgain       int\n\t\tdataRate   int\n\t\twant       int\n\t\twantConfig []uint8\n\t}{\n\t\t\"+FS\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       0,\n\t\t\tdataRate:   8,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x91, 0x03},\n\t\t},\n\t\t\"+1\": {\n\t\t\tinput:      []uint8{0x00, 0x01},\n\t\t\tgain:       0,\n\t\t\tdataRate:   16,\n\t\t\twant:       1,\n\t\t\twantConfig: []uint8{0x91, 0x23},\n\t\t},\n\t\t\"+-0\": {\n\t\t\tinput:      []uint8{0x00, 0x00},\n\t\t\tgain:       0,\n\t\t\tdataRate:   32,\n\t\t\twant:       0,\n\t\t\twantConfig: []uint8{0x91, 0x43},\n\t\t},\n\t\t\"-1\": {\n\t\t\tinput:      []uint8{0xFF, 0xFF},\n\t\t\tgain:       0,\n\t\t\tdataRate:   64,\n\t\t\twant:       -1,\n\t\t\twantConfig: []uint8{0x91, 0x63},\n\t\t},\n\t\t\"-FS\": {\n\t\t\tinput:      []uint8{0x80, 0x00},\n\t\t\tgain:       0,\n\t\t\tdataRate:   128,\n\t\t\twant:       -(1 << 15),\n\t\t\twantConfig: []uint8{0x91, 0x83},\n\t\t},\n\t\t\"+FS gain 1\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       1,\n\t\t\tdataRate:   250,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x93, 0xA3},\n\t\t},\n\t\t\"+FS gain 3\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       3,\n\t\t\tdataRate:   475,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x97, 0xC3},\n\t\t},\n\t\t\"+FS gain 5\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       5,\n\t\t\tdataRate:   860,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x9B, 0xE3},\n\t\t},\n\t\t\"+FS gain 7\": {\n\t\t\tinput:      []uint8{0x7F, 0xFF},\n\t\t\tgain:       7,\n\t\t\tdataRate:   128,\n\t\t\twant:       (1<<15 - 1),\n\t\t\twantConfig: []uint8{0x9F, 0x83},\n\t\t},\n\t}\n\td, a := initTestADS1115DriverWithStubbedAdaptor()\n\t// arrange\n\tchannel := 0\n\tchannelOffset := 1\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\t// arrange reads\n\t\t\tconversion := []uint8{0x00, 0x00}   // a conversion is in progress\n\t\t\tnoConversion := []uint8{0x80, 0x00} // no conversion in progress\n\t\t\treturnRead := [3][]uint8{conversion, noConversion, tc.input}\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tretRead := returnRead[numCallsRead-1]\n\t\t\t\tcopy(b, retRead)\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.rawRead(channel, channelOffset, tc.gain, tc.dataRate)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, 3, numCallsRead)\n\t\t\tassert.Len(t, a.written, 6)\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConfig), a.written[0])\n\t\t\tassert.Equal(t, tc.wantConfig[0], a.written[1])            // MSByte: OS, MUX, PGA, MODE\n\t\t\tassert.Equal(t, tc.wantConfig[1], a.written[2])            // LSByte: DR, COMP_*\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConfig), a.written[3]) // first check for no conversion\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConfig), a.written[4]) // second check for no conversion\n\t\t\tassert.Equal(t, uint8(ads1x15PointerConversion), a.written[5])\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/ads1x15_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage i2c\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*ADS1x15Driver)(nil)\n\n// that supports the AnalogReader interface\nvar _ aio.AnalogReader = (*ADS1x15Driver)(nil)\n\nfunc initTestADS1x15DriverWithStubbedAdaptor() (*ADS1x15Driver, *i2cTestAdaptor) { //nolint:unparam // keep for tests\n\ta := newI2cTestAdaptor()\n\tconst defaultDataRate = 3\n\tdataRates := map[int]uint16{defaultDataRate: 0x0003}\n\td := newADS1x15Driver(a, \"ADS1x15\", dataRates, defaultDataRate)\n\tnoConversion := []uint8{0x80, 0x00} // no conversion in progress\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, noConversion)\n\t\treturn 2, nil\n\t}\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nvar ads1x15TestChannel = map[string]interface{}{\n\t\"channel\": int(2),\n}\n\nvar ads1x15TestChannelGainDataRate = map[string]interface{}{\n\t\"channel\":  int(1),\n\t\"gain\":     int(2),\n\t\"dataRate\": int(3),\n}\n\nfunc TestADS1x15CommandsReadDifferenceWithDefaults(t *testing.T) {\n\t// arrange\n\td, _ := initTestADS1x15DriverWithStubbedAdaptor()\n\t// act\n\tresult := d.Command(\"ReadDifferenceWithDefaults\")(ads1x15TestChannel)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.InDelta(t, -4.096, result.(map[string]interface{})[\"val\"], 0.0)\n}\n\nfunc TestADS1x15CommandsReadDifference(t *testing.T) {\n\t// arrange\n\td, _ := initTestADS1x15DriverWithStubbedAdaptor()\n\t// act\n\tresult := d.Command(\"ReadDifference\")(ads1x15TestChannelGainDataRate)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.InDelta(t, -2.048, result.(map[string]interface{})[\"val\"], 0.0)\n}\n\nfunc TestADS1x15CommandsReadWithDefaults(t *testing.T) {\n\t// arrange\n\td, _ := initTestADS1x15DriverWithStubbedAdaptor()\n\t// act\n\tresult := d.Command(\"ReadWithDefaults\")(ads1x15TestChannel)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.InDelta(t, -4.096, result.(map[string]interface{})[\"val\"], 0.0)\n}\n\nfunc TestADS1x15CommandsRead(t *testing.T) {\n\t// arrange\n\td, _ := initTestADS1x15DriverWithStubbedAdaptor()\n\t// act\n\tresult := d.Command(\"Read\")(ads1x15TestChannelGainDataRate)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.InDelta(t, -2.048, result.(map[string]interface{})[\"val\"], 0.0)\n}\n\nfunc TestADS1x15CommandsAnalogRead(t *testing.T) {\n\t// arrange\n\td, _ := initTestADS1x15DriverWithStubbedAdaptor()\n\tads1x15TestPin := map[string]interface{}{\n\t\t\"pin\": string(\"2\"),\n\t}\n\t// act\n\tresult := d.Command(\"AnalogRead\")(ads1x15TestPin)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.Equal(t, -32768, result.(map[string]interface{})[\"val\"])\n}\n\nfunc TestADS1x15_ads1x15BestGainForVoltage(t *testing.T) {\n\tg, _ := ads1x15BestGainForVoltage(1.5)\n\tassert.Equal(t, 2, g)\n\n\t_, err := ads1x15BestGainForVoltage(20.0)\n\trequire.ErrorContains(t, err, \"the maximum voltage which can be read is 6.144000\")\n}\n"
  },
  {
    "path": "drivers/i2c/adxl345_driver.go",
    "content": "package i2c\n\nimport (\n\t\"encoding/binary\"\n\t\"log\"\n)\n\nconst adxl345Debug = false\n\n// ADXL345 supports 2 addresses, which can be changed by the address pin, there is no internal pull-up/down resistor!\n// pin to GND: 0x53, pin to VDD: 0x1D\nconst (\n\tADXL345AddressPullUp  = 0x1D // can be used by WithAddress()\n\tadxl345DefaultAddress = 0x53\n)\n\ntype (\n\tADXL345RateConfig    uint8\n\tADXL345FsRangeConfig uint8\n)\n\nconst (\n\t// registers are named according to the datasheet\n\tadxl345Reg_DEVID          = 0x00 // R,     11100101,   Device ID\n\tadxl345Reg_THRESH_TAP     = 0x1D // R/W,   00000000,   Tap threshold\n\tadxl345Reg_OFSX           = 0x1E // R/W,   00000000,   X-axis offset\n\tadxl345Reg_OFSY           = 0x1F // R/W,   00000000,   Y-axis offset\n\tadxl345Reg_OFSZ           = 0x20 // R/W,   00000000,   Z-axis offset\n\tadxl345Reg_DUR            = 0x21 // R/W,   00000000,   Tap duration\n\tadxl345Reg_LATENT         = 0x22 // R/W,   00000000,   Tap latency\n\tadxl345Reg_WINDOW         = 0x23 // R/W,   00000000,   Tap window\n\tadxl345Reg_THRESH_ACT     = 0x24 // R/W,   00000000,   Activity threshold\n\tadxl345Reg_THRESH_INACT   = 0x25 // R/W,   00000000,   Inactivity threshold\n\tadxl345Reg_TIME_INACT     = 0x26 // R/W,   00000000,   Inactivity time\n\tadxl345Reg_ACT_INACT_CTL  = 0x27 // R/W,   00000000,   Axis enable control for activity and inactivity detection\n\tadxl345Reg_THRESH_FF      = 0x28 // R/W,   00000000,   Free-fall threshold\n\tadxl345Reg_TIME_FF        = 0x29 // R/W,   00000000,   Free-fall time\n\tadxl345Reg_TAP_AXES       = 0x2A // R/W,   00000000,   Axis control for single tap/double tap\n\tadxl345Reg_ACT_TAP_STATUS = 0x2B // R,     00000000,   Source of single tap/double tap\n\tadxl345Reg_BW_RATE        = 0x2C // R/W,   00001010,   Data rate and power mode control\n\tadxl345Reg_POWER_CTL      = 0x2D // R/W,   00000000,   Power-saving features control\n\tadxl345Reg_INT_ENABLE     = 0x2E // R/W,   00000000,   Interrupt enable control\n\tadxl345Reg_INT_MAP        = 0x2F // R/W,   00000000,   Interrupt mapping control\n\tadxl345Reg_INT_SOUCE      = 0x30 // R,     00000010,   Source of interrupts\n\tadxl345Reg_DATA_FORMAT    = 0x31 // R/W,   00000000,   Data format control (FS range, justify, full resolution)\n\tadxl345Reg_DATAX0         = 0x32 // R,     00000000,   X-Axis Data 0 (LSByte)\n\tadxl345Reg_DATAX1         = 0x33 // R,     00000000,   X-Axis Data 1 (MSByte)\n\tadxl345Reg_DATAY0         = 0x34 // R,     00000000,   Y-Axis Data 0\n\tadxl345Reg_DATAY1         = 0x35 // R,     00000000,   Y-Axis Data 1\n\tadxl345Reg_DATAZ0         = 0x36 // R,     00000000,   Z-Axis Data 0\n\tadxl345Reg_DATAZ1         = 0x37 // R,     00000000,   Z-Axis Data 1\n\tadxl345Reg_FIFO_CTL       = 0x38 // R/W,   00000000,   FIFO control\n\tadxl345Reg_FIFO_STATUS    = 0x39 // R,     00000000,   FIFO status\n\n\tadxl345Rate_LowPowerBit = 0x10 // set the device to low power, but increase the noise by ~2.5x\n\n\tADXL345Rate_100mHZ   ADXL345RateConfig = 0x00 // 0.10 Hz\n\tADXL345Rate_200mHZ   ADXL345RateConfig = 0x01 // 0.20 Hz\n\tADXL345Rate_390mHZ   ADXL345RateConfig = 0x02 // 0.39 Hz\n\tADXL345Rate_780mHZ   ADXL345RateConfig = 0x03 // 0.78 Hz\n\tADXL345Rate_1560mHZ  ADXL345RateConfig = 0x04 // 1.56 Hz\n\tADXL345Rate_3130mHZ  ADXL345RateConfig = 0x05 // 3.13 Hz\n\tADXL345Rate_6250mHZ  ADXL345RateConfig = 0x06 // 6.25 Hz\n\tADXL345Rate_12500mHZ ADXL345RateConfig = 0x07 // 12.5 Hz\n\tADXL345Rate_25HZ     ADXL345RateConfig = 0x08 // 25 Hz\n\tADXL345Rate_50HZ     ADXL345RateConfig = 0x09 // 50 Hz\n\tADXL345Rate_100HZ    ADXL345RateConfig = 0x0A // 100 Hz\n\tADXL345Rate_200HZ    ADXL345RateConfig = 0x0B // 200 Hz\n\tADXL345Rate_400HZ    ADXL345RateConfig = 0x0C // 400 Hz\n\tADXL345Rate_800HZ    ADXL345RateConfig = 0x0D // 800 Hz\n\tADXL345Rate_1600HZ   ADXL345RateConfig = 0x0E // 1600 Hz\n\tADXL345Rate_3200HZ   ADXL345RateConfig = 0x0F // 3200 Hz\n\n\tADXL345FsRange_2G  ADXL345FsRangeConfig = 0x00 // +-2 g\n\tADXL345FsRange_4G  ADXL345FsRangeConfig = 0x01 // +-4 g\n\tADXL345FsRange_8G  ADXL345FsRangeConfig = 0x02 // +-8 g\n\tADXL345FsRange_16G ADXL345FsRangeConfig = 0x03 // +-16 g)\n)\n\n// ADXL345Driver is the gobot driver for the digital accelerometer ADXL345\n//\n// Datasheet EN: http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf\n// Datasheet JP: http://www.analog.com/media/jp/technical-documentation/data-sheets/ADXL345_jp.pdf\n//\n// Ported from the Arduino driver https://github.com/jakalada/Arduino-ADXL345\ntype ADXL345Driver struct {\n\t*Driver\n\n\tpowerCtl   adxl345PowerCtl\n\tdataFormat adxl345DataFormat\n\tbwRate     adxl345BwRate\n}\n\n// Internal structure for the power configuration\ntype adxl345PowerCtl struct {\n\tlink      uint8\n\tautoSleep uint8\n\tmeasure   uint8\n\tsleep     uint8\n\twakeUp    uint8\n}\n\n// Internal structure for the sensor's data format configuration\ntype adxl345DataFormat struct {\n\tselfTest       uint8\n\tspi            uint8\n\tintInvert      uint8\n\tfullRes        uint8\n\tjustify        uint8\n\tfullScaleRange ADXL345FsRangeConfig\n}\n\n// Internal structure for the sampling rate configuration\ntype adxl345BwRate struct {\n\tlowPower bool\n\trate     ADXL345RateConfig\n}\n\n// NewADXL345Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewADXL345Driver(c Connector, options ...func(Config)) *ADXL345Driver {\n\td := &ADXL345Driver{\n\t\tDriver: NewDriver(c, \"ADXL345\", adxl345DefaultAddress),\n\t\tpowerCtl: adxl345PowerCtl{\n\t\t\tmeasure: 1,\n\t\t},\n\t\tdataFormat: adxl345DataFormat{\n\t\t\tfullScaleRange: ADXL345FsRange_2G,\n\t\t},\n\t\tbwRate: adxl345BwRate{\n\t\t\tlowPower: true,\n\t\t\trate:     ADXL345Rate_100HZ,\n\t\t},\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: add commands for API\n\treturn d\n}\n\n// WithADXL345LowPowerMode option modifies the low power mode.\nfunc WithADXL345LowPowerMode(val bool) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*ADXL345Driver); ok {\n\t\t\td.bwRate.lowPower = val\n\t\t} else if adxl345Debug {\n\t\t\tlog.Printf(\"Trying to modify low power mode for non-ADXL345Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADXL345DataOutputRate option sets the data output rate.\n// Valid settings are of type \"ADXL345RateConfig\"\nfunc WithADXL345DataOutputRate(val ADXL345RateConfig) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*ADXL345Driver); ok {\n\t\t\td.bwRate.rate = val\n\t\t} else if adxl345Debug {\n\t\t\tlog.Printf(\"Trying to set data output rate for non-ADXL345Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithADXL345FullScaleRange option sets the full scale range.\n// Valid settings are of type \"ADXL345FsRangeConfig\"\nfunc WithADXL345FullScaleRange(val ADXL345FsRangeConfig) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*ADXL345Driver); ok {\n\t\t\td.dataFormat.fullScaleRange = val\n\t\t} else if adxl345Debug {\n\t\t\tlog.Printf(\"Trying to set full scale range for non-ADXL345Driver %v\", c)\n\t\t}\n\t}\n}\n\n// UseLowPower change the current rate of the sensor\nfunc (d *ADXL345Driver) UseLowPower(lowPower bool) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.bwRate.lowPower = lowPower\n\treturn d.writeByteData(adxl345Reg_BW_RATE, d.bwRate.toByte())\n}\n\n// SetRate change the current rate of the sensor immediately\nfunc (d *ADXL345Driver) SetRate(rate ADXL345RateConfig) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.bwRate.rate = rate\n\treturn d.writeByteData(adxl345Reg_BW_RATE, d.bwRate.toByte())\n}\n\n// SetRange change the current range of the sensor immediately\nfunc (d *ADXL345Driver) SetRange(fullScaleRange ADXL345FsRangeConfig) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.dataFormat.fullScaleRange = fullScaleRange\n\treturn d.writeByteData(adxl345Reg_DATA_FORMAT, d.dataFormat.toByte())\n}\n\n// XYZ returns the adjusted x, y and z axis, unit [g]\nfunc (d *ADXL345Driver) XYZ() (float64, float64, float64, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\txr, yr, zr, err := d.readRawData()\n\tif err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\n\treturn d.dataFormat.convertToG(xr), d.dataFormat.convertToG(yr), d.dataFormat.convertToG(zr), nil\n}\n\n// RawXYZ returns the raw x,y and z axis\nfunc (d *ADXL345Driver) RawXYZ() (int16, int16, int16, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.readRawData()\n}\n\nfunc (d *ADXL345Driver) readRawData() (int16, int16, int16, error) {\n\tbuf := []byte{0, 0, 0, 0, 0, 0}\n\tif err := d.readBlockData(adxl345Reg_DATAX0, buf); err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\n\trx := int16(binary.LittleEndian.Uint16(buf[0:2])) //nolint:gosec // TODO: fix later\n\try := int16(binary.LittleEndian.Uint16(buf[2:4])) //nolint:gosec // TODO: fix later\n\trz := int16(binary.LittleEndian.Uint16(buf[4:6])) //nolint:gosec // TODO: fix later\n\treturn rx, ry, rz, nil\n}\n\nfunc (d *ADXL345Driver) initialize() error {\n\tif err := d.writeByteData(adxl345Reg_BW_RATE, d.bwRate.toByte()); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(adxl345Reg_POWER_CTL, d.powerCtl.toByte()); err != nil {\n\t\treturn err\n\t}\n\tif err := d.writeByteData(adxl345Reg_DATA_FORMAT, d.dataFormat.toByte()); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (d *ADXL345Driver) shutdown() error {\n\tif d.connection == nil {\n\t\treturn nil\n\t}\n\n\td.powerCtl.measure = 0\n\treturn d.writeByteData(adxl345Reg_POWER_CTL, d.powerCtl.toByte())\n}\n\n// convertToG converts the given raw value by range configuration to the unit [g]\nfunc (d *adxl345DataFormat) convertToG(rawValue int16) float64 {\n\tswitch d.fullScaleRange {\n\tcase ADXL345FsRange_2G:\n\t\treturn float64(rawValue) * 2 / 512\n\tcase ADXL345FsRange_4G:\n\t\treturn float64(rawValue) * 4 / 512\n\tcase ADXL345FsRange_8G:\n\t\treturn float64(rawValue) * 8 / 512\n\tcase ADXL345FsRange_16G:\n\t\treturn float64(rawValue) * 16 / 512\n\tdefault:\n\t\treturn 0\n\t}\n}\n\n// toByte returns a byte from the powerCtl configuration\nfunc (p *adxl345PowerCtl) toByte() uint8 {\n\tbits := p.wakeUp\n\tbits = bits | (p.sleep << 2)\n\tbits = bits | (p.measure << 3)\n\tbits = bits | (p.autoSleep << 4)\n\treturn bits | (p.link << 5)\n}\n\n// toByte returns a byte from the dataFormat configuration\nfunc (d *adxl345DataFormat) toByte() uint8 {\n\tbits := uint8(d.fullScaleRange)\n\tbits = bits | (d.justify << 2)\n\tbits = bits | (d.fullRes << 3)\n\tbits = bits | (d.intInvert << 5)\n\tbits = bits | (d.spi << 6)\n\treturn bits | (d.selfTest << 7)\n}\n\n// toByte returns a byte from the bwRate configuration\nfunc (b *adxl345BwRate) toByte() uint8 {\n\tbits := uint8(b.rate)\n\tif b.lowPower {\n\t\tbits = bits | adxl345Rate_LowPowerBit\n\t}\n\treturn bits\n}\n"
  },
  {
    "path": "drivers/i2c/adxl345_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*ADXL345Driver)(nil)\n\nfunc initTestADXL345WithStubbedAdaptor() (*ADXL345Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewADXL345Driver(a)\n\treturn d, a\n}\n\nfunc TestNewADXL345Driver(t *testing.T) {\n\tvar di interface{} = NewADXL345Driver(newI2cTestAdaptor())\n\td, ok := di.(*ADXL345Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewADXL345Driver() should have returned a *ADXL345Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"ADXL345\"))\n\tassert.Equal(t, 0x53, d.defaultAddress)\n\tassert.Equal(t, uint8(1), d.powerCtl.measure)\n\tassert.Equal(t, ADXL345FsRangeConfig(0x00), d.dataFormat.fullScaleRange)\n\tassert.Equal(t, ADXL345RateConfig(0x0A), d.bwRate.rate)\n\tassert.True(t, d.bwRate.lowPower)\n}\n\nfunc TestADXL345Halt(t *testing.T) {\n\t// arrange\n\td := NewADXL345Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestADXL345Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewADXL345Driver(newI2cTestAdaptor(), WithBus(2), WithADXL345LowPowerMode(false))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.False(t, d.bwRate.lowPower)\n}\n\nfunc TestADXL345WithADXL345DataOutputRate(t *testing.T) {\n\t// arrange\n\td, a := initTestADXL345WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tsetVal = ADXL345RateConfig(0x0E) // 1.6kHz\n\t)\n\t// act\n\tWithADXL345DataOutputRate(setVal)(d)\n\t// assert\n\tassert.Equal(t, setVal, d.bwRate.rate)\n\tassert.Empty(t, a.written)\n}\n\nfunc TestADXL345WithADXL345FullScaleRange(t *testing.T) {\n\t// arrange\n\td, a := initTestADXL345WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tsetVal = ADXL345FsRangeConfig(0x02) // +-8 g\n\t)\n\t// act\n\tWithADXL345FullScaleRange(setVal)(d)\n\t// assert\n\tassert.Equal(t, setVal, d.dataFormat.fullScaleRange)\n\tassert.Empty(t, a.written)\n}\n\nfunc TestADXL345UseLowPower(t *testing.T) {\n\t// sequence to set low power:\n\t// * set value in data rate structure\n\t// * write the data rate register (0x2C)\n\td, a := initTestADXL345WithStubbedAdaptor()\n\t_ = d.Start()\n\ta.written = []byte{} // reset writes of former test\n\tsetVal := !d.bwRate.lowPower\n\tconst (\n\t\twantReg = uint8(0x2C)\n\t\twantVal = uint8(0x0A) // only 100 Hz left over\n\t)\n\t// act\n\terr := d.UseLowPower(setVal)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, setVal, d.bwRate.lowPower)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, wantReg, a.written[0])\n\tassert.Equal(t, wantVal, a.written[1])\n}\n\nfunc TestADXL345SetRate(t *testing.T) {\n\t// sequence to set rate:\n\t// * set value in data rate structure\n\t// * write the data rate register (0x2C)\n\td, a := initTestADXL345WithStubbedAdaptor()\n\t_ = d.Start()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tsetVal  = ADXL345RateConfig(0x0F) // 3.2kHz\n\t\twantReg = uint8(0x2C)\n\t\twantVal = uint8(0x1F) // also low power bit\n\t)\n\t// act\n\terr := d.SetRate(setVal)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, setVal, d.bwRate.rate)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, wantReg, a.written[0])\n\tassert.Equal(t, wantVal, a.written[1])\n}\n\nfunc TestADXL345SetRange(t *testing.T) {\n\t// sequence to set range:\n\t// * set value in data format structure\n\t// * write the data format register (0x31)\n\td, a := initTestADXL345WithStubbedAdaptor()\n\t_ = d.Start()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tsetVal  = ADXL345FsRangeConfig(0x03) // +/- 16 g\n\t\twantReg = uint8(0x31)\n\t\twantVal = uint8(0x03)\n\t)\n\t// act\n\terr := d.SetRange(setVal)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, setVal, d.dataFormat.fullScaleRange)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, wantReg, a.written[0])\n\tassert.Equal(t, wantVal, a.written[1])\n}\n\nfunc TestADXL345RawXYZ(t *testing.T) {\n\t// sequence to read:\n\t// * prepare read, see test of initialize()\n\t// * read data output registers (0x32, 3 x 16 bit, LSByte first)\n\t// * apply two's complement converter\n\t//\n\t// arrange\n\ttests := map[string]struct {\n\t\tinputX []uint8\n\t\tinputY []uint8\n\t\tinputZ []uint8\n\t\twantX  int16\n\t\twantY  int16\n\t\twantZ  int16\n\t}{\n\t\t\"+FS_0_-FS\": {\n\t\t\tinputX: []uint8{0xFF, 0x07},\n\t\t\tinputY: []uint8{0x00, 0x00},\n\t\t\tinputZ: []uint8{0x00, 0xF8},\n\t\t\twantX:  (1<<11 - 1),\n\t\t\twantY:  0,\n\t\t\twantZ:  -(1 << 11),\n\t\t},\n\t\t\"-4096_-1_+1\": {\n\t\t\tinputX: []uint8{0x00, 0xF0},\n\t\t\tinputY: []uint8{0xFF, 0xFF},\n\t\t\tinputZ: []uint8{0x01, 0x00},\n\t\t\twantX:  -4096,\n\t\t\twantY:  -1,\n\t\t\twantZ:  1,\n\t\t},\n\t}\n\td, a := initTestADXL345WithStubbedAdaptor()\n\t_ = d.Start()\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\ta.written = []byte{} // reset writes of former test and start\n\t\t\t// arrange reads\n\t\t\treturnRead := append(append(tc.inputX, tc.inputY...), tc.inputZ...)\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tcopy(b, returnRead)\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgotX, gotY, gotZ, err := d.RawXYZ()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantX, gotX)\n\t\t\tassert.Equal(t, tc.wantY, gotY)\n\t\t\tassert.Equal(t, tc.wantZ, gotZ)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, uint8(0x32), a.written[0])\n\t\t})\n\t}\n}\n\nfunc TestADXL345RawXYZError(t *testing.T) {\n\t// arrange\n\td, a := initTestADXL345WithStubbedAdaptor()\n\t_ = d.Start()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\t// act\n\tx, y, z, err := d.RawXYZ()\n\t// assert\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.Equal(t, int16(0), x)\n\tassert.Equal(t, int16(0), y)\n\tassert.Equal(t, int16(0), z)\n}\n\nfunc TestADXL345XYZ(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tinputX []uint8\n\t\tinputY []uint8\n\t\tinputZ []uint8\n\t\twantX  float64\n\t\twantY  float64\n\t\twantZ  float64\n\t}{\n\t\t\"null_value\": {\n\t\t\tinputX: []uint8{0, 0},\n\t\t\tinputY: []uint8{0, 0},\n\t\t\tinputZ: []uint8{0, 0},\n\t\t\twantX:  0,\n\t\t\twantY:  0,\n\t\t\twantZ:  0,\n\t\t},\n\t\t\"some_value\": {\n\t\t\tinputX: []uint8{218, 0},\n\t\t\tinputY: []uint8{251, 255},\n\t\t\tinputZ: []uint8{100, 0},\n\t\t\twantX:  0.8515625,\n\t\t\twantY:  -0.01953125,\n\t\t\twantZ:  0.390625,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestADXL345WithStubbedAdaptor()\n\t\t\t_ = d.Start()\n\t\t\ta.written = []byte{} // reset writes of former test and start\n\t\t\t// arrange reads\n\t\t\treturnRead := append(append(tc.inputX, tc.inputY...), tc.inputZ...)\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tcopy(b, returnRead)\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tx, y, z, _ := d.XYZ()\n\t\t\t// assert\n\t\t\tassert.InDelta(t, tc.wantX, x, 0.0)\n\t\t\tassert.InDelta(t, tc.wantY, y, 0.0)\n\t\t\tassert.InDelta(t, tc.wantZ, z, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestADXL345XYZError(t *testing.T) {\n\t// arrange\n\td, a := initTestADXL345WithStubbedAdaptor()\n\t_ = d.Start()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\t// act\n\tx, y, z, err := d.XYZ()\n\t// assert\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, 0.0, x, 0.0)\n\tassert.InDelta(t, 0.0, y, 0.0)\n\tassert.InDelta(t, 0.0, z, 0.0)\n}\n\nfunc TestADXL345_initialize(t *testing.T) {\n\t// sequence to prepare read in initialize():\n\t// * prepare rate register content (data output rate, low power mode)\n\t// * prepare power control register content (wake up, sleep, measure, auto sleep, link)\n\t// * prepare data format register (fullScaleRange, justify, fullRes, intInvert, spi, selfTest)\n\t// * write 3 registers\n\t// arrange\n\td, a := initTestADXL345WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\twantRateReg      = uint8(0x2C)\n\t\twantRateRegVal   = uint8(0x1A) // 100HZ and low power\n\t\twantPwrReg       = uint8(0x2D)\n\t\twantPwrRegVal    = uint8(0x08) // measurement on\n\t\twantFormatReg    = uint8(0x31)\n\t\twantFormatRegVal = uint8(0x00) // FS to +/-2 g\n\t)\n\t// act, assert - initialize() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 6)\n\tassert.Equal(t, wantRateReg, a.written[0])\n\tassert.Equal(t, wantRateRegVal, a.written[1])\n\tassert.Equal(t, wantPwrReg, a.written[2])\n\tassert.Equal(t, wantPwrRegVal, a.written[3])\n\tassert.Equal(t, wantFormatReg, a.written[4])\n\tassert.Equal(t, wantFormatRegVal, a.written[5])\n}\n\nfunc TestADXL345_shutdown(t *testing.T) {\n\t// sequence to prepare read in shutdown():\n\t// * reset the measurement bit in structure\n\t// * write the power control register (0x2D)\n\td, a := initTestADXL345WithStubbedAdaptor()\n\t_ = d.Start()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\twantReg = uint8(0x2D)\n\t\twantVal = uint8(0x00)\n\t)\n\t// act, assert - shutdown() must be called on Halt()\n\terr := d.Halt()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, wantReg, a.written[0])\n\tassert.Equal(t, wantVal, a.written[1])\n}\n"
  },
  {
    "path": "drivers/i2c/bh1750_driver.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"time\"\n)\n\nconst bh1750DefaultAddress = 0x23\n\nconst (\n\tBH1750_POWER_DOWN                 = 0x00\n\tBH1750_POWER_ON                   = 0x01\n\tBH1750_RESET                      = 0x07\n\tBH1750_CONTINUOUS_HIGH_RES_MODE   = 0x10\n\tBH1750_CONTINUOUS_HIGH_RES_MODE_2 = 0x11\n\tBH1750_CONTINUOUS_LOW_RES_MODE    = 0x13\n\tBH1750_ONE_TIME_HIGH_RES_MODE     = 0x20\n\tBH1750_ONE_TIME_HIGH_RES_MODE_2   = 0x21\n\tBH1750_ONE_TIME_LOW_RES_MODE      = 0x23\n)\n\n// BH1750Driver is a driver for the BH1750 digital Ambient Light Sensor IC for I²C bus interface.\ntype BH1750Driver struct {\n\t*Driver\n\n\tmode byte\n}\n\n// NewBH1750Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewBH1750Driver(c Connector, options ...func(Config)) *BH1750Driver {\n\td := &BH1750Driver{\n\t\tDriver: NewDriver(c, \"BH1750\", bh1750DefaultAddress),\n\t\tmode:   BH1750_CONTINUOUS_HIGH_RES_MODE,\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: add commands for API\n\treturn d\n}\n\n// RawSensorData returns the raw value from the bh1750\nfunc (d *BH1750Driver) RawSensorData() (int, error) {\n\tbuf := []byte{0, 0}\n\tbytesRead, err := d.read(buf)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif bytesRead != 2 {\n\t\treturn 0, errors.New(\"wrong number of bytes read\")\n\t}\n\n\tlevel := int(buf[0])<<8 | int(buf[1])\n\n\treturn level, nil\n}\n\n// Lux returns the adjusted value from the bh1750\nfunc (d *BH1750Driver) Lux() (int, error) {\n\trawLux, err := d.RawSensorData()\n\tlux := int(float64(rawLux) / 1.2)\n\n\treturn lux, err\n}\n\nfunc (d *BH1750Driver) initialize() error {\n\terr := d.writeByte(d.mode)\n\ttime.Sleep(10 * time.Microsecond)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/bh1750_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*BH1750Driver)(nil)\n\nfunc initTestBH1750DriverWithStubbedAdaptor() (*BH1750Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewBH1750Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewBH1750Driver(t *testing.T) {\n\tvar di interface{} = NewBH1750Driver(newI2cTestAdaptor())\n\td, ok := di.(*BH1750Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewBH1750Driver() should have returned a *BH1750Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"BH1750\"))\n\tassert.Equal(t, 0x23, d.defaultAddress)\n}\n\nfunc TestBH1750Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewBH1750Driver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestBH1750Start(t *testing.T) {\n\td := NewBH1750Driver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestBH1750Halt(t *testing.T) {\n\td := NewBH1750Driver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestBH1750NullLux(t *testing.T) {\n\td, _ := initTestBH1750DriverWithStubbedAdaptor()\n\tlux, _ := d.Lux()\n\tassert.Equal(t, 0, lux)\n}\n\nfunc TestBH1750Lux(t *testing.T) {\n\td, a := initTestBH1750DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{0x05, 0xb0})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\n\tlux, _ := d.Lux()\n\tassert.Equal(t, 1213, lux)\n}\n\nfunc TestBH1750NullRawSensorData(t *testing.T) {\n\td, _ := initTestBH1750DriverWithStubbedAdaptor()\n\tlevel, _ := d.RawSensorData()\n\tassert.Equal(t, 0, level)\n}\n\nfunc TestBH1750RawSensorData(t *testing.T) {\n\td, a := initTestBH1750DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{0x05, 0xb0})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\n\tlevel, _ := d.RawSensorData()\n\tassert.Equal(t, 1456, level)\n}\n\nfunc TestBH1750LuxError(t *testing.T) {\n\td, a := initTestBH1750DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"wrong number of bytes read\")\n\t}\n\n\t_, err := d.Lux()\n\trequire.ErrorContains(t, err, \"wrong number of bytes read\")\n}\n\nfunc TestBH1750RawSensorDataError(t *testing.T) {\n\td, a := initTestBH1750DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"wrong number of bytes read\")\n\t}\n\n\t_, err := d.RawSensorData()\n\trequire.ErrorContains(t, err, \"wrong number of bytes read\")\n}\n"
  },
  {
    "path": "drivers/i2c/blinkm_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n)\n\nconst blinkmDefaultAddress = 0x09\n\n// BlinkMDriver is a Gobot Driver for a BlinkM LED\ntype BlinkMDriver struct {\n\t*Driver\n}\n\n// NewBlinkMDriver creates a new BlinkMDriver.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewBlinkMDriver(c Connector, options ...func(Config)) *BlinkMDriver {\n\tb := &BlinkMDriver{\n\t\tDriver: NewDriver(c, \"BlinkM\", blinkmDefaultAddress),\n\t}\n\tb.afterStart = b.initialize\n\n\tfor _, option := range options {\n\t\toption(b)\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\tb.AddCommand(\"Rgb\", func(params map[string]interface{}) interface{} {\n\t\tred := byte(params[\"red\"].(float64))\n\t\tgreen := byte(params[\"green\"].(float64))\n\t\tblue := byte(params[\"blue\"].(float64))\n\t\treturn b.Rgb(red, green, blue)\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\tb.AddCommand(\"Fade\", func(params map[string]interface{}) interface{} {\n\t\tred := byte(params[\"red\"].(float64))\n\t\tgreen := byte(params[\"green\"].(float64))\n\t\tblue := byte(params[\"blue\"].(float64))\n\t\treturn b.Fade(red, green, blue)\n\t})\n\n\tb.AddCommand(\"FirmwareVersion\", func(_ map[string]interface{}) interface{} {\n\t\tversion, err := b.FirmwareVersion()\n\t\treturn map[string]interface{}{\"version\": version, \"err\": err}\n\t})\n\n\tb.AddCommand(\"Color\", func(_ map[string]interface{}) interface{} {\n\t\tcolor, err := b.Color()\n\t\treturn map[string]interface{}{\"color\": color, \"err\": err}\n\t})\n\n\treturn b\n}\n\n// Rgb sets color using r,g,b params\nfunc (b *BlinkMDriver) Rgb(red byte, green byte, blue byte) error {\n\tif _, err := b.connection.Write([]byte(\"n\")); err != nil {\n\t\treturn err\n\t}\n\t_, err := b.connection.Write([]byte{red, green, blue})\n\treturn err\n}\n\n// Fade removes color using r,g,b params\nfunc (b *BlinkMDriver) Fade(red byte, green byte, blue byte) error {\n\tif _, err := b.connection.Write([]byte(\"c\")); err != nil {\n\t\treturn err\n\t}\n\t_, err := b.connection.Write([]byte{red, green, blue})\n\treturn err\n}\n\n// FirmwareVersion returns version with MAYOR.minor format\nfunc (b *BlinkMDriver) FirmwareVersion() (string, error) {\n\tif _, err := b.connection.Write([]byte(\"Z\")); err != nil {\n\t\treturn \"\", err\n\t}\n\tdata := []byte{0, 0}\n\tread, err := b.connection.Read(data)\n\tif read != 2 || err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fmt.Sprintf(\"%v.%v\", data[0], data[1]), nil\n}\n\n// Color returns an array with current rgb color\nfunc (b *BlinkMDriver) Color() ([]byte, error) {\n\tif _, err := b.connection.Write([]byte(\"g\")); err != nil {\n\t\treturn []byte{}, err\n\t}\n\tdata := []byte{0, 0, 0}\n\tread, err := b.connection.Read(data)\n\tif read != 3 || err != nil {\n\t\treturn []byte{}, err\n\t}\n\treturn []byte{data[0], data[1], data[2]}, nil\n}\n\nfunc (b *BlinkMDriver) initialize() error {\n\tif _, err := b.connection.Write([]byte(\"o\")); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/blinkm_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*BlinkMDriver)(nil)\n\nfunc initTestBlinkMDriverWithStubbedAdaptor() (*BlinkMDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewBlinkMDriver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewBlinkMDriver(t *testing.T) {\n\tvar di interface{} = NewBlinkMDriver(newI2cTestAdaptor())\n\td, ok := di.(*BlinkMDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewBlinkMDriver() should have returned a *BlinkMDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"BlinkM\"))\n\tassert.Equal(t, 0x09, d.defaultAddress)\n}\n\nfunc TestBlinkMOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewBlinkMDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestBlinkMStart(t *testing.T) {\n\td := NewBlinkMDriver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestBlinkMHalt(t *testing.T) {\n\td := NewBlinkMDriver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\n// Commands\nfunc TestNewBlinkMDriverCommands_Rgb(t *testing.T) {\n\td, _ := initTestBlinkMDriverWithStubbedAdaptor()\n\n\tresult := d.Command(\"Rgb\")(rgb)\n\tassert.Nil(t, result)\n}\n\nfunc TestNewBlinkMDriverCommands_Fade(t *testing.T) {\n\td, _ := initTestBlinkMDriverWithStubbedAdaptor()\n\n\tresult := d.Command(\"Fade\")(rgb)\n\tassert.Nil(t, result)\n}\n\nfunc TestNewBlinkMDriverCommands_FirmwareVersion(t *testing.T) {\n\td, a := initTestBlinkMDriverWithStubbedAdaptor()\n\tparam := make(map[string]interface{})\n\t// When len(data) is 2\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99, 1})\n\t\treturn 2, nil\n\t}\n\n\tresult := d.Command(\"FirmwareVersion\")(param)\n\n\tversion, _ := d.FirmwareVersion()\n\tassert.Equal(t, version, result.(map[string]interface{})[\"version\"].(string))\n\n\t// When len(data) is not 2\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99})\n\t\treturn 1, nil\n\t}\n\tresult = d.Command(\"FirmwareVersion\")(param)\n\n\tversion, _ = d.FirmwareVersion()\n\tassert.Equal(t, version, result.(map[string]interface{})[\"version\"].(string))\n}\n\nfunc TestNewBlinkMDriverCommands_Color(t *testing.T) {\n\td, _ := initTestBlinkMDriverWithStubbedAdaptor()\n\tparam := make(map[string]interface{})\n\n\tresult := d.Command(\"Color\")(param)\n\n\tcolor, _ := d.Color()\n\tassert.Equal(t, color, result.(map[string]interface{})[\"color\"].([]byte))\n}\n\nfunc TestBlinkMFirmwareVersion(t *testing.T) {\n\td, a := initTestBlinkMDriverWithStubbedAdaptor()\n\t// when len(data) is 2\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99, 1})\n\t\treturn 2, nil\n\t}\n\n\tversion, _ := d.FirmwareVersion()\n\tassert.Equal(t, \"99.1\", version)\n\n\t// when len(data) is not 2\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99})\n\t\treturn 1, nil\n\t}\n\n\tversion, _ = d.FirmwareVersion()\n\tassert.Empty(t, version)\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\t_, err := d.FirmwareVersion()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestBlinkMColor(t *testing.T) {\n\td, a := initTestBlinkMDriverWithStubbedAdaptor()\n\t// when len(data) is 3\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99, 1, 2})\n\t\treturn 3, nil\n\t}\n\n\tcolor, _ := d.Color()\n\tassert.Equal(t, []byte{99, 1, 2}, color)\n\n\t// when len(data) is not 3\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99})\n\t\treturn 1, nil\n\t}\n\n\tcolor, _ = d.Color()\n\tassert.Equal(t, []byte{}, color)\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\t_, err := d.Color()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestBlinkMFade(t *testing.T) {\n\td, a := initTestBlinkMDriverWithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\terr := d.Fade(100, 100, 100)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestBlinkMRGB(t *testing.T) {\n\td, a := initTestBlinkMDriverWithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\terr := d.Rgb(100, 100, 100)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n"
  },
  {
    "path": "drivers/i2c/bme280_driver.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"log\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst bme280Debug = true\n\ntype BME280HumidityOversampling uint8\n\nconst (\n\tbme280RegCalibDigH1      = 0xA1\n\tbme280RegCalibDigH2LSB   = 0xE1\n\tbme280RegControlHumidity = 0xF2\n\tbme280RegHumidityMSB     = 0xFD\n\n\t// bits 0, 1, 3 of control humidity register\n\tBME280CtrlHumidityNoMeasurement  BME280HumidityOversampling = 0x00 // no measurement (value will be 0x08 0x00 0x00)\n\tBME280CtrlHumidityOversampling1  BME280HumidityOversampling = 0x01\n\tBME280CtrlHumidityOversampling2  BME280HumidityOversampling = 0x02\n\tBME280CtrlHumidityOversampling4  BME280HumidityOversampling = 0x03\n\tBME280CtrlHumidityOversampling8  BME280HumidityOversampling = 0x04\n\tBME280CtrlHumidityOversampling16 BME280HumidityOversampling = 0x05 // same as 0x06, 0x07\n)\n\ntype bmeHumidityCalibrationCoefficients struct {\n\th1 uint8\n\th2 int16\n\th3 uint8\n\th4 int16\n\th5 int16\n\th6 int8\n}\n\n// BME280Driver is a driver for the BME280 temperature/humidity sensor.\n// It implements all of the same functions as the BMP280Driver, but also\n// adds the Humidity() function by reading the BME280's humidity sensor.\n// For details on the BMP280Driver please see:\n//\n//\thttps://godoc.org/gobot.io/x/gobot/v2/drivers/i2c#BMP280Driver\ntype BME280Driver struct {\n\t*BMP280Driver\n\n\thumCalCoeffs    *bmeHumidityCalibrationCoefficients\n\tctrlHumOversamp BME280HumidityOversampling\n}\n\n// NewBME280Driver creates a new driver with specified i2c interface.\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewBME280Driver(c Connector, options ...func(Config)) *BME280Driver {\n\td := &BME280Driver{\n\t\tBMP280Driver:    NewBMP280Driver(c),\n\t\thumCalCoeffs:    &bmeHumidityCalibrationCoefficients{},\n\t\tctrlHumOversamp: BME280CtrlHumidityOversampling16,\n\t}\n\td.name = gobot.DefaultName(\"BME280\")\n\td.afterStart = d.initializationBME280\n\n\t// this loop is for options of this class, all options of base class BMP280Driver\n\t// must be added in this class for usage\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: expose commands to API\n\treturn d\n}\n\n// WithBME280PressureOversampling option sets the oversampling for pressure.\n// Valid settings are of type \"BMP280PressureOversampling\"\nfunc WithBME280PressureOversampling(val BMP280PressureOversampling) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BME280Driver); ok {\n\t\t\td.ctrlPressOversamp = val\n\t\t} else if bme280Debug {\n\t\t\tlog.Printf(\"Trying to set pressure oversampling for non-BME280Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithBME280TemperatureOversampling option sets oversampling for temperature.\n// Valid settings are of type \"BMP280TemperatureOversampling\"\nfunc WithBME280TemperatureOversampling(val BMP280TemperatureOversampling) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BME280Driver); ok {\n\t\t\td.ctrlTempOversamp = val\n\t\t} else if bme280Debug {\n\t\t\tlog.Printf(\"Trying to set temperature oversampling for non-BME280Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithBME280IIRFilter option sets the count of IIR filter coefficients.\n// Valid settings are of type \"BMP280IIRFilter\"\nfunc WithBME280IIRFilter(val BMP280IIRFilter) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BME280Driver); ok {\n\t\t\td.confFilter = val\n\t\t} else if bme280Debug {\n\t\t\tlog.Printf(\"Trying to set IIR filter for non-BME280Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithBME280HumidityOversampling option sets the oversampling for humidity.\n// Valid settings are of type \"BME280HumidityOversampling\"\nfunc WithBME280HumidityOversampling(val BME280HumidityOversampling) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BME280Driver); ok {\n\t\t\td.ctrlHumOversamp = val\n\t\t} else if bme280Debug {\n\t\t\tlog.Printf(\"Trying to set humidity oversampling for non-BME280Driver %v\", c)\n\t\t}\n\t}\n}\n\n// Humidity returns the current humidity in percentage of relative humidity\nfunc (d *BME280Driver) Humidity() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\trawH, err := d.rawHumidity()\n\tif err != nil {\n\t\treturn 0.0, err\n\t}\n\thumidity := d.calculateHumidity(rawH)\n\treturn humidity, nil\n}\n\nfunc (d *BME280Driver) initializationBME280() error {\n\t// call the initialization routine of base class BMP280Driver, which do:\n\t// * initializes temperature and pressure calibration coefficients\n\t// * set the control register\n\t// * set the configuration register\n\tif err := d.initialization(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.initHumidity(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// read the humidity calibration coefficients.\nfunc (d *BME280Driver) initHumidity() error {\n\thch1, err := d.readByteData(bme280RegCalibDigH1)\n\tif err != nil {\n\t\treturn err\n\t}\n\tbuf := bytes.NewBuffer([]byte{hch1})\n\tif err := binary.Read(buf, binary.BigEndian, &d.humCalCoeffs.h1); err != nil {\n\t\treturn err\n\t}\n\n\tcoefficients := make([]byte, 7)\n\tif err = d.readBlockData(bme280RegCalibDigH2LSB, coefficients); err != nil {\n\t\treturn err\n\t}\n\tbuf = bytes.NewBuffer(coefficients)\n\n\t// H4 and H5 laid out strangely on the bme280\n\tvar addrE4 byte\n\tvar addrE5 byte\n\tvar addrE6 byte\n\t// E1 ...\n\tif err := binary.Read(buf, binary.LittleEndian, &d.humCalCoeffs.h2); err != nil {\n\t\treturn err\n\t}\n\t// E3\n\tif err := binary.Read(buf, binary.BigEndian, &d.humCalCoeffs.h3); err != nil {\n\t\treturn err\n\t}\n\t// E4\n\tif err := binary.Read(buf, binary.BigEndian, &addrE4); err != nil {\n\t\treturn err\n\t}\n\t// E5\n\tif err := binary.Read(buf, binary.BigEndian, &addrE5); err != nil {\n\t\treturn err\n\t}\n\t// E6\n\tif err := binary.Read(buf, binary.BigEndian, &addrE6); err != nil {\n\t\treturn err\n\t}\n\t// ... E7\n\tif err := binary.Read(buf, binary.BigEndian, &d.humCalCoeffs.h6); err != nil {\n\t\treturn err\n\t}\n\n\td.humCalCoeffs.h4 = 0 + (int16(addrE4) << 4) | (int16(addrE5 & 0x0F))\n\td.humCalCoeffs.h5 = 0 + (int16(addrE6) << 4) | (int16(addrE5) >> 4)\n\n\t// The 'ctrl_hum' register (0xF2) sets the humidity data acquisition options of\n\t// the device. Changes to this register only become effective after a write\n\t// operation to 'ctrl_meas' (0xF4). So we read the current value in, then write it back\n\tif err := d.writeByteData(bme280RegControlHumidity, uint8(d.ctrlHumOversamp)); err != nil {\n\t\treturn err\n\t}\n\n\tcmr, err := d.readByteData(bmp280RegCtrl)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn d.writeByteData(bmp280RegCtrl, cmr)\n}\n\nfunc (d *BME280Driver) rawHumidity() (uint32, error) {\n\tret := make([]byte, 2)\n\tif err := d.readBlockData(bme280RegHumidityMSB, ret); err != nil {\n\t\treturn 0, err\n\t}\n\tif ret[0] == 0x80 && ret[1] == 0x00 {\n\t\treturn 0, errors.New(\"Humidity disabled\")\n\t}\n\tbuf := bytes.NewBuffer(ret)\n\tvar rawH uint16\n\tif err := binary.Read(buf, binary.BigEndian, &rawH); err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint32(rawH), nil\n}\n\n// Adapted from https://github.com/BoschSensortec/BME280_driver/blob/master/bme280.c\n// function bme280_compensate_humidity_double(s32 v_uncom_humidity_s32)\nfunc (d *BME280Driver) calculateHumidity(rawH uint32) float32 {\n\tvar rawT int32\n\tvar err error\n\tvar h float32\n\n\trawT, err = d.rawTemp()\n\tif err != nil {\n\t\treturn 0\n\t}\n\n\t_, tFine := d.calculateTemp(rawT)\n\th = float32(tFine) - 76800\n\n\tif h == 0 {\n\t\treturn 0 // TODO err is 'invalid data' from Bosch - include errors or not?\n\t}\n\n\tx := float32(rawH) - (float32(d.humCalCoeffs.h4)*64.0 +\n\t\t(float32(d.humCalCoeffs.h5) / 16384.0 * h))\n\n\ty := float32(d.humCalCoeffs.h2) / 65536.0 *\n\t\t(1.0 + float32(d.humCalCoeffs.h6)/67108864.0*h*\n\t\t\t(1.0+float32(d.humCalCoeffs.h3)/67108864.0*h))\n\n\th = x * y\n\th = h * (1 - float32(d.humCalCoeffs.h1)*h/524288)\n\treturn h\n}\n"
  },
  {
    "path": "drivers/i2c/bme280_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*BME280Driver)(nil)\n\nfunc initTestBME280WithStubbedAdaptor() (*BME280Driver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewBME280Driver(adaptor), adaptor\n}\n\nfunc TestNewBME280Driver(t *testing.T) {\n\tvar di interface{} = NewBME280Driver(newI2cTestAdaptor())\n\td, ok := di.(*BME280Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewBME280Driver() should have returned a *BME280Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"BME280\"))\n\tassert.Equal(t, 0x77, d.defaultAddress)\n\tassert.Equal(t, uint8(0x03), d.ctrlPwrMode)\n\tassert.Equal(t, BMP280PressureOversampling(0x05), d.ctrlPressOversamp)\n\tassert.Equal(t, BMP280TemperatureOversampling(0x01), d.ctrlTempOversamp)\n\tassert.Equal(t, BME280HumidityOversampling(0x05), d.ctrlHumOversamp)\n\tassert.Equal(t, BMP280IIRFilter(0x00), d.confFilter)\n\tassert.NotNil(t, d.calCoeffs)\n}\n\nfunc TestBME280Halt(t *testing.T) {\n\t// arrange\n\td := NewBME280Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestBME280Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewBME280Driver(newI2cTestAdaptor(), WithBus(2),\n\t\tWithBME280PressureOversampling(0x01),\n\t\tWithBME280TemperatureOversampling(0x02),\n\t\tWithBME280IIRFilter(0x03),\n\t\tWithBME280HumidityOversampling(0x04))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, BMP280PressureOversampling(0x01), d.ctrlPressOversamp)\n\tassert.Equal(t, BMP280TemperatureOversampling(0x02), d.ctrlTempOversamp)\n\tassert.Equal(t, BMP280IIRFilter(0x03), d.confFilter)\n\tassert.Equal(t, BME280HumidityOversampling(0x04), d.ctrlHumOversamp)\n}\n\nfunc TestBME280Measurements(t *testing.T) {\n\tbme280, adaptor := initTestBME280WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values produced by dumping data from actual sensor\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegCalib00:\n\t\t\tbuf.Write([]byte{\n\t\t\t\t126, 109, 214, 102, 50, 0, 54, 149, 220, 213, 208, 11, 64, 30, 166, 255, 249, 255, 172, 38, 10, 216, 189, 16,\n\t\t\t})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH1:\n\t\t\tbuf.Write([]byte{75})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegTempData:\n\t\t\tbuf.Write([]byte{129, 0, 0})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH2LSB:\n\t\t\tbuf.Write([]byte{112, 1, 0, 19, 1, 0, 30})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegHumidityMSB:\n\t\t\tbuf.Write([]byte{111, 83})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = bme280.Start()\n\thum, err := bme280.Humidity()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(51.20179), hum, 0.0)\n}\n\nfunc TestBME280InitH1Error(t *testing.T) {\n\tbme280, adaptor := initTestBME280WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values produced by dumping data from actual sensor\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegCalib00:\n\t\t\tbuf.Write([]byte{\n\t\t\t\t126, 109, 214, 102, 50, 0, 54, 149, 220, 213, 208, 11, 64, 30, 166, 255, 249, 255, 172, 38, 10, 216, 189, 16,\n\t\t\t})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH1:\n\t\t\treturn 0, errors.New(\"h1 read error\")\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH2LSB:\n\t\t\tbuf.Write([]byte{112, 1, 0, 19, 1, 0, 30})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\n\trequire.ErrorContains(t, bme280.Start(), \"h1 read error\")\n}\n\nfunc TestBME280InitH2Error(t *testing.T) {\n\tbme280, adaptor := initTestBME280WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values produced by dumping data from actual sensor\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegCalib00:\n\t\t\tbuf.Write([]byte{\n\t\t\t\t126, 109, 214, 102, 50, 0, 54, 149, 220, 213, 208, 11, 64, 30, 166, 255, 249, 255, 172, 38, 10, 216, 189, 16,\n\t\t\t})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH1:\n\t\t\tbuf.Write([]byte{75})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH2LSB:\n\t\t\treturn 0, errors.New(\"h2 read error\")\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\n\trequire.ErrorContains(t, bme280.Start(), \"h2 read error\")\n}\n\nfunc TestBME280HumidityWriteError(t *testing.T) {\n\tbme280, adaptor := initTestBME280WithStubbedAdaptor()\n\t_ = bme280.Start()\n\n\tadaptor.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\thum, err := bme280.Humidity()\n\trequire.ErrorContains(t, err, \"write error\")\n\tassert.InDelta(t, float32(0.0), hum, 0.0)\n}\n\nfunc TestBME280HumidityReadError(t *testing.T) {\n\tbme280, adaptor := initTestBME280WithStubbedAdaptor()\n\t_ = bme280.Start()\n\n\tadaptor.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\thum, err := bme280.Humidity()\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, float32(0.0), hum, 0.0)\n}\n\nfunc TestBME280HumidityNotEnabled(t *testing.T) {\n\tbme280, adaptor := initTestBME280WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values produced by dumping data from actual sensor\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegCalib00:\n\t\t\tbuf.Write([]byte{\n\t\t\t\t126, 109, 214, 102, 50, 0, 54, 149, 220, 213, 208, 11, 64, 30, 166, 255, 249, 255, 172, 38, 10, 216, 189, 16,\n\t\t\t})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH1:\n\t\t\tbuf.Write([]byte{75})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegTempData:\n\t\t\tbuf.Write([]byte{129, 0, 0})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegCalibDigH2LSB:\n\t\t\tbuf.Write([]byte{112, 1, 0, 19, 1, 0, 30})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bme280RegHumidityMSB:\n\t\t\tbuf.Write([]byte{0x80, 0x00})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = bme280.Start()\n\thum, err := bme280.Humidity()\n\trequire.ErrorContains(t, err, \"Humidity disabled\")\n\tassert.InDelta(t, float32(0.0), hum, 0.0)\n}\n\nfunc TestBME280_initializationBME280(t *testing.T) {\n\tbme280, adaptor := initTestBME280WithStubbedAdaptor()\n\treadCallCounter := 0\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\treadCallCounter++\n\t\tif readCallCounter == 1 {\n\t\t\t// Simulate returning 24 bytes for the coefficients (register bmp280RegCalib00)\n\t\t\treturn 24, nil\n\t\t}\n\t\tif readCallCounter == 2 {\n\t\t\t// Simulate returning a single byte for the hc.h1 value (register bme280RegCalibDigH1)\n\t\t\treturn 1, nil\n\t\t}\n\t\tif readCallCounter == 3 {\n\t\t\t// Simulate returning 7 bytes for the coefficients (register bme280RegCalibDigH2LSB)\n\t\t\treturn 7, nil\n\t\t}\n\t\tif readCallCounter == 4 {\n\t\t\t// Simulate returning 1 byte for the cmr (register bmp280RegControl)\n\t\t\treturn 1, nil\n\t\t}\n\t\treturn 0, nil\n\t}\n\trequire.NoError(t, bme280.Start())\n}\n"
  },
  {
    "path": "drivers/i2c/bmp180_driver.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"log\"\n\t\"time\"\n)\n\nconst bmp180Debug = false\n\n// the default address is applicable for SDO to VDD, for SDO to GND it will be 0x76\nconst bmp180DefaultAddress = 0x77\n\nconst (\n\tbmp180RegisterAC1MSB  = 0xAA // 11 x 16 bit calibration data (AC1..AC6, B1, B2, MB, MC, MD)\n\tbmp180RegisterCtl     = 0xF4 // control the value to read\n\tbmp180RegisterDataMSB = 0xF6 // 16 bit data (temperature or pressure)\n\n\tbmp180CtlTemp     = 0x2E\n\tbmp180CtlPressure = 0x34\n)\n\nconst (\n\t// BMP180UltraLowPower is the lowest oversampling mode of the pressure measurement.\n\tBMP180UltraLowPower BMP180OversamplingMode = iota\n\t// BMP180Standard is the standard oversampling mode of the pressure measurement.\n\tBMP180Standard\n\t// BMP180HighResolution is a high oversampling mode of the pressure measurement.\n\tBMP180HighResolution\n\t// BMP180UltraHighResolution is the highest oversampling mode of the pressure measurement.\n\tBMP180UltraHighResolution\n)\n\n// BMP180OversamplingMode is the oversampling ratio of the pressure measurement.\ntype BMP180OversamplingMode uint\n\ntype bmp180CalibrationCoefficients struct {\n\tac1 int16\n\tac2 int16\n\tac3 int16\n\tac4 uint16\n\tac5 uint16\n\tac6 uint16\n\tb1  int16\n\tb2  int16\n\tmb  int16\n\tmc  int16\n\tmd  int16\n}\n\n// BMP180Driver is the gobot driver for the Bosch pressure and temperature sensor BMP180.\n// Device datasheet: https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf\ntype BMP180Driver struct {\n\t*Driver\n\n\toversampling BMP180OversamplingMode\n\tcalCoeffs    *bmp180CalibrationCoefficients\n}\n\n// NewBMP180Driver creates a new driver with the i2c interface for the BMP180 device.\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewBMP180Driver(c Connector, options ...func(Config)) *BMP180Driver {\n\td := &BMP180Driver{\n\t\tDriver:       NewDriver(c, \"BMP180\", bmp180DefaultAddress),\n\t\toversampling: BMP180UltraLowPower,\n\t\tcalCoeffs:    &bmp180CalibrationCoefficients{},\n\t}\n\td.afterStart = d.initialization\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: expose commands to API\n\treturn d\n}\n\n// WithBMP180OversamplingMode option sets oversampling mode.\n// Valid settings are of type \"BMP180OversamplingMode\"\nfunc WithBMP180OversamplingMode(val BMP180OversamplingMode) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BMP180Driver); ok {\n\t\t\td.oversampling = val\n\t\t} else if bmp180Debug {\n\t\t\tlog.Printf(\"Trying to set oversampling mode for non-BMP180Driver %v\", c)\n\t\t}\n\t}\n}\n\n// Temperature returns the current temperature, in celsius degrees.\nfunc (d *BMP180Driver) Temperature() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\trawTemp, err := d.rawTemp()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.calculateTemp(rawTemp), nil\n}\n\n// Pressure returns the current pressure, in pascals.\nfunc (d *BMP180Driver) Pressure() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\trawTemp, err := d.rawTemp()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\trawPressure, err := d.rawPressure(d.oversampling)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.calculatePressure(rawTemp, rawPressure, d.oversampling), nil\n}\n\nfunc (d *BMP180Driver) initialization() error {\n\t// read the 11 calibration coefficients.\n\tcoefficients := make([]byte, 22)\n\tif err := d.readBlockData(bmp180RegisterAC1MSB, coefficients); err != nil {\n\t\treturn err\n\t}\n\tbuf := bytes.NewBuffer(coefficients)\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.ac1); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.ac2); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.ac3); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.ac4); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.ac5); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.ac6); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.b1); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.b2); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.mb); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &d.calCoeffs.mc); err != nil {\n\t\treturn err\n\t}\n\treturn binary.Read(buf, binary.BigEndian, &d.calCoeffs.md)\n}\n\nfunc (d *BMP180Driver) rawTemp() (int16, error) {\n\tif _, err := d.write([]byte{bmp180RegisterCtl, bmp180CtlTemp}); err != nil {\n\t\treturn 0, err\n\t}\n\ttime.Sleep(5 * time.Millisecond)\n\tret := make([]byte, 2)\n\terr := d.readBlockData(bmp180RegisterDataMSB, ret)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tbuf := bytes.NewBuffer(ret)\n\tvar rawTemp int16\n\tif err := binary.Read(buf, binary.BigEndian, &rawTemp); err != nil {\n\t\treturn 0, err\n\t}\n\treturn rawTemp, nil\n}\n\nfunc (d *BMP180Driver) calculateTemp(rawTemp int16) float32 {\n\tb5 := d.calculateB5(rawTemp)\n\tt := (b5 + 8) >> 4\n\treturn float32(t) / 10\n}\n\nfunc (d *BMP180Driver) calculateB5(rawTemp int16) int32 {\n\tx1 := (int32(rawTemp) - int32(d.calCoeffs.ac6)) * int32(d.calCoeffs.ac5) >> 15\n\tx2 := int32(d.calCoeffs.mc) << 11 / (x1 + int32(d.calCoeffs.md))\n\treturn x1 + x2\n}\n\nfunc (d *BMP180Driver) rawPressure(oversampling BMP180OversamplingMode) (int32, error) {\n\tif _, err := d.write([]byte{bmp180RegisterCtl, bmp180CtlPressure + byte(oversampling<<6)}); err != nil {\n\t\treturn 0, err\n\t}\n\ttime.Sleep(bmp180PauseForReading(oversampling))\n\tret := make([]byte, 3)\n\tif err := d.readBlockData(bmp180RegisterDataMSB, ret); err != nil {\n\t\treturn 0, err\n\t}\n\trawPressure := (int32(ret[0])<<16 + int32(ret[1])<<8 + int32(ret[2])) >> (8 - uint(oversampling))\n\treturn rawPressure, nil\n}\n\nfunc (d *BMP180Driver) calculatePressure(\n\trawTemp int16,\n\trawPressure int32,\n\toversampling BMP180OversamplingMode,\n) float32 {\n\tb5 := d.calculateB5(rawTemp)\n\tb6 := b5 - 4000\n\tx1 := (int32(d.calCoeffs.b2) * (b6 * b6 >> 12)) >> 11\n\tx2 := (int32(d.calCoeffs.ac2) * b6) >> 11\n\tx3 := x1 + x2\n\tb3 := (((int32(d.calCoeffs.ac1)*4 + x3) << uint(oversampling)) + 2) >> 2\n\tx1 = (int32(d.calCoeffs.ac3) * b6) >> 13\n\tx2 = (int32(d.calCoeffs.b1) * ((b6 * b6) >> 12)) >> 16\n\tx3 = ((x1 + x2) + 2) >> 2\n\tb4 := (uint32(d.calCoeffs.ac4) * uint32(x3+32768)) >> 15       //nolint:gosec // TODO: fix later\n\tb7 := (uint32(rawPressure-b3) * (50000 >> uint(oversampling))) //nolint:gosec // TODO: fix later\n\tvar p int32\n\tif b7 < 0x80000000 {\n\t\tp = int32((b7 << 1) / b4) //nolint:gosec // TODO: fix later\n\t} else {\n\t\tp = int32((b7 / b4) << 1) //nolint:gosec // TODO: fix later\n\t}\n\tx1 = (p >> 8) * (p >> 8)\n\tx1 = (x1 * 3038) >> 16\n\tx2 = (-7357 * p) >> 16\n\treturn float32(p + ((x1 + x2 + 3791) >> 4))\n}\n\nfunc bmp180PauseForReading(oversampling BMP180OversamplingMode) time.Duration {\n\tvar d time.Duration\n\tswitch oversampling {\n\tcase BMP180UltraLowPower:\n\t\td = 5 * time.Millisecond\n\tcase BMP180Standard:\n\t\td = 8 * time.Millisecond\n\tcase BMP180HighResolution:\n\t\td = 14 * time.Millisecond\n\tcase BMP180UltraHighResolution:\n\t\td = 26 * time.Millisecond\n\t}\n\treturn d\n}\n"
  },
  {
    "path": "drivers/i2c/bmp180_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*BMP180Driver)(nil)\n\nfunc initTestBMP180WithStubbedAdaptor() (*BMP180Driver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewBMP180Driver(adaptor), adaptor\n}\n\nfunc TestNewBMP180Driver(t *testing.T) {\n\t// Does it return a pointer to an instance of BMP180Driver?\n\tvar di interface{} = NewBMP180Driver(newI2cTestAdaptor())\n\td, ok := di.(*BMP180Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewBMP180Driver() should have returned a *BMP180Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"BMP180\"))\n\tassert.Equal(t, 0x77, d.defaultAddress)\n\tassert.Equal(t, BMP180OversamplingMode(0x00), d.oversampling)\n\tassert.NotNil(t, d.calCoeffs)\n}\n\nfunc TestBMP180Halt(t *testing.T) {\n\t// arrange\n\td := NewBMP180Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestBMP180Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewBMP180Driver(newI2cTestAdaptor(), WithBus(2), WithBMP180OversamplingMode(0x01))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, BMP180OversamplingMode(0x01), d.oversampling)\n}\n\nfunc TestBMP180Measurements(t *testing.T) {\n\tbmp180, adaptor := initTestBMP180WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values from the datasheet example.\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp180RegisterAC1MSB:\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(408))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-72))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-14383))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(32741))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(32757))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(23153))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(6190))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(4))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-32768))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-8711))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(2868))\n\t\tcase adaptor.written[len(adaptor.written)-2] == bmp180CtlTemp &&\n\t\t\tadaptor.written[len(adaptor.written)-1] == bmp180RegisterDataMSB:\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(27898))\n\t\tcase adaptor.written[len(adaptor.written)-2] == bmp180CtlPressure &&\n\t\t\tadaptor.written[len(adaptor.written)-1] == bmp180RegisterDataMSB:\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(23843))\n\t\t\t// XLSB, not used in this test.\n\t\t\tbuf.WriteByte(0)\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = bmp180.Start()\n\ttemp, err := bmp180.Temperature()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(15.0), temp, 0.0)\n\tpressure, err := bmp180.Pressure()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(69964), pressure, 0.0)\n}\n\nfunc TestBMP180TemperatureError(t *testing.T) {\n\tbmp180, adaptor := initTestBMP180WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values from the datasheet example.\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp180RegisterAC1MSB:\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(408))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-72))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-14383))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(32741))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(32757))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(23153))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(6190))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(4))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-32768))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-8711))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(2868))\n\t\tcase adaptor.written[len(adaptor.written)-2] == bmp180CtlTemp &&\n\t\t\tadaptor.written[len(adaptor.written)-1] == bmp180RegisterDataMSB:\n\t\t\treturn 0, errors.New(\"temp error\")\n\t\tcase adaptor.written[len(adaptor.written)-2] == bmp180CtlPressure &&\n\t\t\tadaptor.written[len(adaptor.written)-1] == bmp180RegisterDataMSB:\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(23843))\n\t\t\t// XLSB, not used in this test.\n\t\t\tbuf.WriteByte(0)\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = bmp180.Start()\n\t_, err := bmp180.Temperature()\n\trequire.ErrorContains(t, err, \"temp error\")\n}\n\nfunc TestBMP180PressureError(t *testing.T) {\n\tbmp180, adaptor := initTestBMP180WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values from the datasheet example.\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp180RegisterAC1MSB:\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(408))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-72))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-14383))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(32741))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(32757))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, uint16(23153))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(6190))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(4))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-32768))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(-8711))\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(2868))\n\t\tcase adaptor.written[len(adaptor.written)-2] == bmp180CtlTemp &&\n\t\t\tadaptor.written[len(adaptor.written)-1] == bmp180RegisterDataMSB:\n\t\t\t_ = binary.Write(buf, binary.BigEndian, int16(27898))\n\t\tcase adaptor.written[len(adaptor.written)-2] == bmp180CtlPressure &&\n\t\t\tadaptor.written[len(adaptor.written)-1] == bmp180RegisterDataMSB:\n\t\t\treturn 0, errors.New(\"press error\")\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = bmp180.Start()\n\t_, err := bmp180.Pressure()\n\trequire.ErrorContains(t, err, \"press error\")\n}\n\nfunc TestBMP180PressureWriteError(t *testing.T) {\n\tbmp180, adaptor := initTestBMP180WithStubbedAdaptor()\n\t_ = bmp180.Start()\n\n\tadaptor.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\t_, err := bmp180.Pressure()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestBMP180_initialization(t *testing.T) {\n\t// sequence to read in initialization():\n\t// * read 22 bytes (11 x 16 bit calibration data), starting from AC1 register (0xAA)\n\t// * fill calibration struct with data (MSByte read first)\n\t// arrange\n\td, a := initTestBMP180WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\t// Values from the datasheet example.\n\tac1 := []uint8{0x01, 0x98}\n\tac2 := []uint8{0xFF, 0xB8}\n\tac3 := []uint8{0xC7, 0xD1}\n\tac4 := []uint8{0x7F, 0xE5}\n\tac5 := []uint8{0x7F, 0xF5}\n\tac6 := []uint8{0x5A, 0x71}\n\tb1 := []uint8{0x18, 0x2E}\n\tb2 := []uint8{0x00, 0x04}\n\tmb := []uint8{0x80, 0x00}\n\tmc := []uint8{0xDD, 0xF9}\n\tmd := []uint8{0x0B, 0x34}\n\treturnRead := append(append(append(append(append(ac1, ac2...), ac3...), ac4...), ac5...), ac6...)\n\treturnRead = append(append(append(append(append(returnRead, b1...), b2...), mb...), mc...), md...)\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tcopy(b, returnRead)\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialization() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(0xAA), a.written[0])\n\tassert.Equal(t, int16(408), d.calCoeffs.ac1)\n\tassert.Equal(t, int16(-72), d.calCoeffs.ac2)\n\tassert.Equal(t, int16(-14383), d.calCoeffs.ac3)\n\tassert.Equal(t, uint16(32741), d.calCoeffs.ac4)\n\tassert.Equal(t, uint16(32757), d.calCoeffs.ac5)\n\tassert.Equal(t, uint16(23153), d.calCoeffs.ac6)\n\tassert.Equal(t, int16(6190), d.calCoeffs.b1)\n\tassert.Equal(t, int16(4), d.calCoeffs.b2)\n\tassert.Equal(t, int16(-32768), d.calCoeffs.mb)\n\tassert.Equal(t, int16(-8711), d.calCoeffs.mc)\n\tassert.Equal(t, int16(2868), d.calCoeffs.md)\n}\n\nfunc TestBMP180_bmp180PauseForReading(t *testing.T) {\n\tassert.Equal(t, 5*time.Millisecond, bmp180PauseForReading(BMP180UltraLowPower))\n\tassert.Equal(t, 8*time.Millisecond, bmp180PauseForReading(BMP180Standard))\n\tassert.Equal(t, 14*time.Millisecond, bmp180PauseForReading(BMP180HighResolution))\n\tassert.Equal(t, 26*time.Millisecond, bmp180PauseForReading(BMP180UltraHighResolution))\n}\n"
  },
  {
    "path": "drivers/i2c/bmp280_driver.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"log\"\n\t\"math\"\n)\n\nconst bmp280Debug = true\n\n// the default address is applicable for SDO to VDD, for SDO to GND it will be 0x76\n// this is also true for bme280 (which using this address as well)\nconst bmp280DefaultAddress = 0x77\n\ntype (\n\tBMP280PressureOversampling    uint8\n\tBMP280TemperatureOversampling uint8\n\tBMP280IIRFilter               uint8\n)\n\nconst (\n\tbmp280RegCalib00      = 0x88 // 12 x 16 bit calibration data (T1..T3, P1..P9)\n\tbmp280RegCtrl         = 0xF4 // data acquisition options (oversampling of temperature and pressure, power mode)\n\tbmp280RegConf         = 0xF5 // rate, IIR-filter and interface options (SPI)\n\tbmp280RegPressureData = 0xF7\n\tbmp280RegTempData     = 0xFA\n\n\t// bits 0, 1 of control register\n\tbmp280CtrlPwrSleepMode   = 0x00\n\tbmp280CtrlPwrForcedMode  = 0x01\n\tbmp280CtrlPwrForcedMode2 = 0x02 // same function as 0x01\n\tbmp280CtrlPwrNormalMode  = 0x03\n\n\t// bits 2, 3, 4 of control register (will be shifted on write)\n\tBMP280CtrlPressNoMeasurement  BMP280PressureOversampling = 0x00 // no measurement (value will be 0x08 0x00 0x00)\n\tBMP280CtrlPressOversampling1  BMP280PressureOversampling = 0x01 // resolution 16 bit\n\tBMP280CtrlPressOversampling2  BMP280PressureOversampling = 0x02 // resolution 17 bit\n\tBMP280CtrlPressOversampling4  BMP280PressureOversampling = 0x03 // resolution 18 bit\n\tBMP280CtrlPressOversampling8  BMP280PressureOversampling = 0x04 // resolution 19 bit\n\tBMP280CtrlPressOversampling16 BMP280PressureOversampling = 0x05 // resolution 20 bit (same as 0x06, 0x07)\n\n\t// bits 5, 6, 7 of control register (will be shifted on write)\n\tBMP280CtrlTempNoMeasurement  BMP280TemperatureOversampling = 0x00 // no measurement (value will be 0x08 0x00 0x00)\n\tBMP280CtrlTempOversampling1  BMP280TemperatureOversampling = 0x01 // resolution 16 bit\n\tBMP280CtrlTempOversampling2  BMP280TemperatureOversampling = 0x02 // resolution 17 bit\n\tBMP280CtrlTempOversampling4  BMP280TemperatureOversampling = 0x03 // resolution 18 bit\n\tBMP280CtrlTempOversampling8  BMP280TemperatureOversampling = 0x04 // resolution 19 bit\n\tBMP280CtrlTempOversampling16 BMP280TemperatureOversampling = 0x05 // resolution 20 bit\n\n\t// bit 0 of config register\n\tbmp280ConfSPIBit = 0x01 // if set, SPI is used\n\n\t// bits 2, 3, 4 of config register (bit 1 is unused, will be shifted on write)\n\tbmp280ConfStandBy0005 = 0x00 //\t0.5 ms\n\tbmp280ConfStandBy0625 = 0x01 //\t62.5 ms\n\tbmp280ConfStandBy0125 = 0x02 //\t125 ms\n\tbmp280ConfStandBy0250 = 0x03 //\t250 ms\n\tbmp280ConfStandBy0500 = 0x04 //\t500 ms\n\tbmp280ConfStandBy1000 = 0x05 //\t1000 ms\n\tbmp280ConfStandBy2000 = 0x06 //\t2000 ms\n\tbmp280ConfStandBy4000 = 0x07 //\t4000 ms\n\n\t// bits 5, 6, 7 of config register\n\tBMP280ConfFilterOff BMP280IIRFilter = 0x00\n\tBMP280ConfFilter2   BMP280IIRFilter = 0x01\n\tBMP280ConfFilter4   BMP280IIRFilter = 0x02\n\tBMP280ConfFilter8   BMP280IIRFilter = 0x03\n\tBMP280ConfFilter16  BMP280IIRFilter = 0x04\n\n\tbmp280SeaLevelPressure = 1013.25\n)\n\ntype bmp280CalibrationCoefficients struct {\n\tt1 uint16\n\tt2 int16\n\tt3 int16\n\tp1 uint16\n\tp2 int16\n\tp3 int16\n\tp4 int16\n\tp5 int16\n\tp6 int16\n\tp7 int16\n\tp8 int16\n\tp9 int16\n}\n\n// BMP280Driver is a driver for the BMP280 temperature/pressure sensor\ntype BMP280Driver struct {\n\t*Driver\n\n\tcalCoeffs         *bmp280CalibrationCoefficients\n\tctrlPwrMode       uint8\n\tctrlPressOversamp BMP280PressureOversampling\n\tctrlTempOversamp  BMP280TemperatureOversampling\n\tconfFilter        BMP280IIRFilter\n}\n\n// NewBMP280Driver creates a new driver with specified i2c interface.\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewBMP280Driver(c Connector, options ...func(Config)) *BMP280Driver {\n\td := &BMP280Driver{\n\t\tDriver:            NewDriver(c, \"BMP280\", bmp280DefaultAddress),\n\t\tcalCoeffs:         &bmp280CalibrationCoefficients{},\n\t\tctrlPwrMode:       bmp280CtrlPwrNormalMode,\n\t\tctrlPressOversamp: BMP280CtrlPressOversampling16,\n\t\tctrlTempOversamp:  BMP280CtrlTempOversampling1,\n\t\tconfFilter:        BMP280ConfFilterOff,\n\t}\n\td.afterStart = d.initialization\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: expose commands to API\n\treturn d\n}\n\n// WithBMP280PressureOversampling option sets the oversampling for pressure.\n// Valid settings are of type \"BMP280PressureOversampling\"\nfunc WithBMP280PressureOversampling(val BMP280PressureOversampling) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BMP280Driver); ok {\n\t\t\td.ctrlPressOversamp = val\n\t\t} else if bmp280Debug {\n\t\t\tlog.Printf(\"Trying to set pressure oversampling for non-BMP280Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithBMP280TemperatureOversampling option sets oversampling for temperature.\n// Valid settings are of type \"BMP280TemperatureOversampling\"\nfunc WithBMP280TemperatureOversampling(val BMP280TemperatureOversampling) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BMP280Driver); ok {\n\t\t\td.ctrlTempOversamp = val\n\t\t} else if bmp280Debug {\n\t\t\tlog.Printf(\"Trying to set temperature oversampling for non-BMP280Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithBMP280IIRFilter option sets the count of IIR filter coefficients.\n// Valid settings are of type \"BMP280IIRFilter\"\nfunc WithBMP280IIRFilter(val BMP280IIRFilter) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BMP280Driver); ok {\n\t\t\td.confFilter = val\n\t\t} else if bmp280Debug {\n\t\t\tlog.Printf(\"Trying to set IIR filter for non-BMP280Driver %v\", c)\n\t\t}\n\t}\n}\n\n// Temperature returns the current temperature, in celsius degrees.\nfunc (d *BMP280Driver) Temperature() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\trawT, err := d.rawTemp()\n\tif err != nil {\n\t\treturn 0.0, err\n\t}\n\ttemp, _ := d.calculateTemp(rawT)\n\treturn temp, nil\n}\n\n// Pressure returns the current barometric pressure, in Pa\nfunc (d *BMP280Driver) Pressure() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\trawT, err := d.rawTemp()\n\tif err != nil {\n\t\treturn 0.0, err\n\t}\n\n\trawP, err := d.rawPressure()\n\tif err != nil {\n\t\treturn 0.0, err\n\t}\n\t_, tFine := d.calculateTemp(rawT)\n\treturn d.calculatePress(rawP, tFine), nil\n}\n\n// Altitude returns the current altitude in meters based on the\n// current barometric pressure and estimated pressure at sea level.\n// Calculation is based on code from Adafruit BME280 library\n//\n//\thttps://github.com/adafruit/Adafruit_BME280_Library\nfunc (d *BMP280Driver) Altitude() (float32, error) {\n\tatmP, err := d.Pressure()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tatmP /= 100.0\n\talt := float32(44330.0 * (1.0 - math.Pow(float64(atmP/bmp280SeaLevelPressure), 0.1903)))\n\n\treturn alt, nil\n}\n\n// initialization reads the calibration coefficients.\nfunc (d *BMP280Driver) initialization() error {\n\tcoefficients := make([]byte, 24)\n\tif err := d.readBlockData(bmp280RegCalib00, coefficients); err != nil {\n\t\treturn err\n\t}\n\tbuf := bytes.NewBuffer(coefficients)\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.t1); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.t2); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.t3); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p1); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p2); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p3); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p4); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p5); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p6); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p7); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p8); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &d.calCoeffs.p9); err != nil {\n\t\treturn err\n\t}\n\n\tctrlReg := d.ctrlPwrMode | uint8(d.ctrlPressOversamp)<<2 | uint8(d.ctrlTempOversamp)<<5\n\tif err := d.writeByteData(bmp280RegCtrl, ctrlReg); err != nil {\n\t\treturn err\n\t}\n\n\tconfReg := uint8(bmp280ConfStandBy0005)<<2 | uint8(d.confFilter)<<5\n\treturn d.writeByteData(bmp280RegConf, confReg & ^uint8(bmp280ConfSPIBit))\n}\n\nfunc (d *BMP280Driver) rawTemp() (int32, error) {\n\tvar tp0, tp1, tp2 byte\n\n\tdata := make([]byte, 3)\n\tif err := d.readBlockData(bmp280RegTempData, data); err != nil {\n\t\treturn 0, err\n\t}\n\tbuf := bytes.NewBuffer(data)\n\tif err := binary.Read(buf, binary.LittleEndian, &tp0); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &tp1); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &tp2); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn ((int32(tp2) >> 4) | (int32(tp1) << 4) | (int32(tp0) << 12)), nil\n}\n\nfunc (d *BMP280Driver) rawPressure() (int32, error) {\n\tvar tp0, tp1, tp2 byte\n\n\tdata := make([]byte, 3)\n\tif err := d.readBlockData(bmp280RegPressureData, data); err != nil {\n\t\treturn 0, err\n\t}\n\tbuf := bytes.NewBuffer(data)\n\tif err := binary.Read(buf, binary.LittleEndian, &tp0); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &tp1); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &tp2); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn ((int32(tp2) >> 4) | (int32(tp1) << 4) | (int32(tp0) << 12)), nil\n}\n\nfunc (d *BMP280Driver) calculateTemp(rawTemp int32) (float32, int32) {\n\ttcvar1 := ((float32(rawTemp) / 16384.0) - (float32(d.calCoeffs.t1) / 1024.0)) * float32(d.calCoeffs.t2)\n\ttcvar2 := (((float32(rawTemp) / 131072.0) - (float32(d.calCoeffs.t1) / 8192.0)) * ((float32(rawTemp) / 131072.0) -\n\t\tfloat32(d.calCoeffs.t1)/8192.0)) * float32(d.calCoeffs.t3)\n\ttemperatureComp := (tcvar1 + tcvar2) / 5120.0\n\n\ttFine := int32(tcvar1 + tcvar2)\n\treturn temperatureComp, tFine\n}\n\nfunc (d *BMP280Driver) calculatePress(rawPress int32, tFine int32) float32 {\n\tvar var1, var2, p int64\n\n\tvar1 = int64(tFine) - 128000\n\tvar2 = var1 * var1 * int64(d.calCoeffs.p6)\n\tvar2 = var2 + ((var1 * int64(d.calCoeffs.p5)) << 17)\n\tvar2 = var2 + (int64(d.calCoeffs.p4) << 35)\n\tvar1 = (var1 * var1 * int64(d.calCoeffs.p3) >> 8) +\n\t\t((var1 * int64(d.calCoeffs.p2)) << 12)\n\tvar1 = ((int64(1) << 47) + var1) * (int64(d.calCoeffs.p1)) >> 33\n\n\tif var1 == 0 {\n\t\treturn 0 // avoid exception caused by division by zero\n\t}\n\tp = 1048576 - int64(rawPress)\n\tp = (((p << 31) - var2) * 3125) / var1\n\tvar1 = (int64(d.calCoeffs.p9) * (p >> 13) * (p >> 13)) >> 25\n\tvar2 = (int64(d.calCoeffs.p8) * p) >> 19\n\n\tp = ((p + var1 + var2) >> 8) + (int64(d.calCoeffs.p7) << 4)\n\treturn float32(p) / 256\n}\n"
  },
  {
    "path": "drivers/i2c/bmp280_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*BMP280Driver)(nil)\n\nfunc initTestBMP280WithStubbedAdaptor() (*BMP280Driver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewBMP280Driver(adaptor), adaptor\n}\n\nfunc TestNewBMP280Driver(t *testing.T) {\n\tvar di interface{} = NewBMP280Driver(newI2cTestAdaptor())\n\td, ok := di.(*BMP280Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewBMP280Driver() should have returned a *BMP280Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"BMP280\"))\n\tassert.Equal(t, 0x77, d.defaultAddress)\n\tassert.Equal(t, uint8(0x03), d.ctrlPwrMode)\n\tassert.Equal(t, BMP280PressureOversampling(0x05), d.ctrlPressOversamp)\n\tassert.Equal(t, BMP280TemperatureOversampling(0x01), d.ctrlTempOversamp)\n\tassert.Equal(t, BMP280IIRFilter(0x00), d.confFilter)\n\tassert.NotNil(t, d.calCoeffs)\n}\n\nfunc TestBMP280Halt(t *testing.T) {\n\t// arrange\n\td := NewBMP280Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestBMP280Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewBMP280Driver(newI2cTestAdaptor(), WithBus(2), WithBMP280PressureOversampling(0x04))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, BMP280PressureOversampling(0x04), d.ctrlPressOversamp)\n}\n\nfunc TestWithBMP280TemperatureOversampling(t *testing.T) {\n\t// arrange\n\td, a := initTestBMP280WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tsetVal = BMP280TemperatureOversampling(0x04) // 8 x\n\t)\n\t// act\n\tWithBMP280TemperatureOversampling(setVal)(d)\n\t// assert\n\tassert.Equal(t, setVal, d.ctrlTempOversamp)\n\tassert.Empty(t, a.written)\n}\n\nfunc TestWithBMP280IIRFilter(t *testing.T) {\n\t// arrange\n\td, a := initTestBMP280WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\tsetVal = BMP280IIRFilter(0x02) // 4 x\n\t)\n\t// act\n\tWithBMP280IIRFilter(setVal)(d)\n\t// assert\n\tassert.Equal(t, setVal, d.confFilter)\n\tassert.Empty(t, a.written)\n}\n\nfunc TestBMP280Measurements(t *testing.T) {\n\td, adaptor := initTestBMP280WithStubbedAdaptor()\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values produced by dumping data from actual sensor\n\t\tswitch {\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegCalib00:\n\t\t\tbuf.Write([]byte{\n\t\t\t\t126, 109, 214, 102, 50, 0, 54, 149, 220, 213, 208, 11, 64, 30, 166, 255, 249, 255, 172, 38, 10, 216, 189, 16,\n\t\t\t})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegTempData:\n\t\t\tbuf.Write([]byte{128, 243, 0})\n\t\tcase adaptor.written[len(adaptor.written)-1] == bmp280RegPressureData:\n\t\t\tbuf.Write([]byte{77, 23, 48})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = d.Start()\n\ttemp, err := d.Temperature()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(25.014637), temp, 0.0)\n\tpressure, err := d.Pressure()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(99545.414), pressure, 0.0)\n\talt, err := d.Altitude()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(149.22713), alt, 0.0)\n}\n\nfunc TestBMP280TemperatureWriteError(t *testing.T) {\n\td, adaptor := initTestBMP280WithStubbedAdaptor()\n\t_ = d.Start()\n\n\tadaptor.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\ttemp, err := d.Temperature()\n\trequire.ErrorContains(t, err, \"write error\")\n\tassert.InDelta(t, float32(0.0), temp, 0.0)\n}\n\nfunc TestBMP280TemperatureReadError(t *testing.T) {\n\td, adaptor := initTestBMP280WithStubbedAdaptor()\n\t_ = d.Start()\n\n\tadaptor.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\ttemp, err := d.Temperature()\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, float32(0.0), temp, 0.0)\n}\n\nfunc TestBMP280PressureWriteError(t *testing.T) {\n\td, adaptor := initTestBMP280WithStubbedAdaptor()\n\t_ = d.Start()\n\n\tadaptor.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\tpress, err := d.Pressure()\n\trequire.ErrorContains(t, err, \"write error\")\n\tassert.InDelta(t, float32(0.0), press, 0.0)\n}\n\nfunc TestBMP280PressureReadError(t *testing.T) {\n\td, adaptor := initTestBMP280WithStubbedAdaptor()\n\t_ = d.Start()\n\n\tadaptor.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\tpress, err := d.Pressure()\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, float32(0.0), press, 0.0)\n}\n\nfunc TestBMP280_initialization(t *testing.T) {\n\t// sequence to read and write in initialization():\n\t// * read 24 bytes (12 x 16 bit calibration data), starting from TC1 register (0x88)\n\t// * fill calibration struct with data (LSByte read first)\n\t// * prepare the content of control register\n\t// * write the control register (0xF4)\n\t// * prepare the content of config register\n\t// * write the config register (0xF5)\n\t// arrange\n\td, a := initTestBMP280WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\twantCalibReg   = uint8(0x88)\n\t\twantCtrlReg    = uint8(0xF4)\n\t\twantCtrlRegVal = uint8(0x37) // normal power mode, 16 x pressure and 1 x temperature oversampling\n\t\twantConfReg    = uint8(0xF5)\n\t\twantConfRegVal = uint8(0x00) // no SPI, no filter, smallest standby (unused, because normal power mode)\n\t)\n\t// Values from the datasheet example.\n\tt1 := []uint8{0x70, 0x6B}\n\tt2 := []uint8{0x43, 0x67}\n\tt3 := []uint8{0x18, 0xFC}\n\tp1 := []uint8{0x7D, 0x8E}\n\tp2 := []uint8{0x43, 0xD6}\n\tp3 := []uint8{0xD0, 0x0B}\n\tp4 := []uint8{0x27, 0x0B}\n\tp5 := []uint8{0x8C, 0x00}\n\tp6 := []uint8{0xF9, 0xFF}\n\tp7 := []uint8{0x8C, 0x3C}\n\tp8 := []uint8{0xF8, 0xC6}\n\tp9 := []uint8{0x70, 0x17}\n\treturnRead := append(append(append(append(append(append(t1, t2...), t3...), p1...), p2...), p3...), p4...)\n\treturnRead = append(append(append(append(append(returnRead, p5...), p6...), p7...), p8...), p9...)\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tcopy(b, returnRead)\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialization() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Len(t, a.written, 5)\n\tassert.Equal(t, wantCalibReg, a.written[0])\n\tassert.Equal(t, wantCtrlReg, a.written[1])\n\tassert.Equal(t, wantCtrlRegVal, a.written[2])\n\tassert.Equal(t, wantConfReg, a.written[3])\n\tassert.Equal(t, wantConfRegVal, a.written[4])\n\tassert.Equal(t, uint16(27504), d.calCoeffs.t1)\n\tassert.Equal(t, int16(26435), d.calCoeffs.t2)\n\tassert.Equal(t, int16(-1000), d.calCoeffs.t3)\n\tassert.Equal(t, uint16(36477), d.calCoeffs.p1)\n\tassert.Equal(t, int16(-10685), d.calCoeffs.p2)\n\tassert.Equal(t, int16(3024), d.calCoeffs.p3)\n\tassert.Equal(t, int16(2855), d.calCoeffs.p4)\n\tassert.Equal(t, int16(140), d.calCoeffs.p5)\n\tassert.Equal(t, int16(-7), d.calCoeffs.p6)\n\tassert.Equal(t, int16(15500), d.calCoeffs.p7)\n\tassert.Equal(t, int16(-14600), d.calCoeffs.p8)\n\tassert.Equal(t, int16(6000), d.calCoeffs.p9)\n}\n"
  },
  {
    "path": "drivers/i2c/bmp388_driver.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"log\"\n\t\"math\"\n)\n\nconst bmp388Debug = false\n\n// the default address is applicable for SDO to VDD, for SDO to GND it will be 0x76\nconst bmp388DefaultAddress = 0x77\n\n// BMP388Accuracy accuracy type\ntype (\n\tBMP388Accuracy  uint8\n\tBMP388IIRFilter uint8\n)\n\nconst (\n\tbmp388ChipID = 0x50\n\n\tbmp388RegChipID       = 0x00\n\tbmp388RegStatus       = 0x03\n\tbmp388RegPressureData = 0x04 // XLSB, 0x05 LSByte, 0x06 MSByte\n\tbmp388RegTempData     = 0x07 // XLSB, 0x08 LSByte, 0x09 MSByte\n\tbmp388RegPWRCTRL      = 0x1B // enable/disable pressure and temperature measurement, mode\n\tbmp388RegOSR          = 0x1C // Oversampling Rates\n\tbmp388RegODR          = 0x1D // Output Data Rates\n\tbmp388RegConf         = 0x1F // config filter for IIR coefficients\n\tbmp388RegCalib00      = 0x31\n\tbmp388RegCMD          = 0x7E\n\n\t// bits 0, 1 of control register\n\tbmp388PWRCTRLPressEnableBit = 0x01\n\tbmp388PWRCTRLTempEnableBit  = 0x02\n\n\t// bits 4, 5 of control register (will be shifted on write)\n\tbmp388PWRCTRLSleep  = 0x00\n\tbmp388PWRCTRLForced = 0x01 // same as 0x02\n\tbmp388PWRCTRLNormal = 0x03\n\n\t// bits 1, 2 ,3 of config filter IIR filter coefficients (will be shifted on write)\n\tbmp388ConfFilterCoef0   BMP388IIRFilter = 0 // bypass-mode\n\tbmp388ConfFilterCoef1   BMP388IIRFilter = 1\n\tbmp388ConfFilterCoef3   BMP388IIRFilter = 2\n\tbmp388ConfFilterCoef7   BMP388IIRFilter = 3\n\tbmp388ConfFilterCoef15  BMP388IIRFilter = 4\n\tbmp388ConfFilterCoef31  BMP388IIRFilter = 5\n\tbmp388ConfFilterCoef63  BMP388IIRFilter = 6\n\tbmp388ConfFilterCoef127 BMP388IIRFilter = 7\n\n\t// oversampling rate, a single value is used (could be different for pressure and temperature)\n\tBMP388AccuracyUltraLow  BMP388Accuracy = 0 // x1 sample\n\tBMP388AccuracyLow       BMP388Accuracy = 1 // x2 samples\n\tBMP388AccuracyStandard  BMP388Accuracy = 2 // x4 samples\n\tBMP388AccuracyHigh      BMP388Accuracy = 3 // x8 samples\n\tBMP388AccuracyUltraHigh BMP388Accuracy = 4 // x16 samples\n\tBMP388AccuracyHighest   BMP388Accuracy = 5 // x32 samples\n\n\tbmp388CMDReserved        = 0x00 // reserved, no command\n\tbmp388CMDExtModeEnMiddle = 0x34\n\tbmp388CMDFifoFlush       = 0xB0 // clears all data in the FIFO, does not change FIFO_CONFIG registers\n\tbmp388CMDSoftReset       = 0xB6 // triggers a reset, all user configuration settings are overwritten with defaults\n\n\tbmp388SeaLevelPressure = 1013.25\n)\n\ntype bmp388CalibrationCoefficients struct {\n\tt1  float32\n\tt2  float32\n\tt3  float32\n\tp1  float32\n\tp2  float32\n\tp3  float32\n\tp4  float32\n\tp5  float32\n\tp6  float32\n\tp7  float32\n\tp8  float32\n\tp9  float32\n\tp10 float32\n\tp11 float32\n}\n\n// BMP388Driver is a driver for the BMP388 temperature/pressure sensor\ntype BMP388Driver struct {\n\t*Driver\n\n\tcalCoeffs   *bmp388CalibrationCoefficients\n\tctrlPwrMode uint8\n\tconfFilter  BMP388IIRFilter\n}\n\n// NewBMP388Driver creates a new driver with specified i2c interface.\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewBMP388Driver(c Connector, options ...func(Config)) *BMP388Driver {\n\td := &BMP388Driver{\n\t\tDriver:      NewDriver(c, \"BMP388\", bmp388DefaultAddress),\n\t\tcalCoeffs:   &bmp388CalibrationCoefficients{},\n\t\tctrlPwrMode: bmp388PWRCTRLForced,\n\t\tconfFilter:  bmp388ConfFilterCoef0,\n\t}\n\td.afterStart = d.initialization\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: expose commands to API\n\treturn d\n}\n\n// WithBMP388IIRFilter option sets count of IIR filter coefficients.\n// Valid settings are of type \"BMP388IIRFilter\"\nfunc WithBMP388IIRFilter(val BMP388IIRFilter) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*BMP388Driver); ok {\n\t\t\td.confFilter = val\n\t\t} else if bmp388Debug {\n\t\t\tlog.Printf(\"Trying to set IIR filter for non-BMP388Driver %v\", c)\n\t\t}\n\t}\n}\n\n// Temperature returns the current temperature, in celsius degrees.\nfunc (d *BMP388Driver) Temperature(accuracy BMP388Accuracy) (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tmode := d.ctrlPwrMode<<4 | bmp388PWRCTRLPressEnableBit | bmp388PWRCTRLTempEnableBit\n\tif err := d.writeByteData(bmp388RegPWRCTRL, mode); err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Set Accuracy for temperature\n\tif err := d.writeByteData(bmp388RegOSR, uint8(accuracy<<3)); err != nil {\n\t\treturn 0, err\n\t}\n\n\trawT, err := d.rawTemp()\n\tif err != nil {\n\t\treturn 0.0, err\n\t}\n\n\ttemp := d.calculateTemp(rawT)\n\n\treturn temp, nil\n}\n\n// Pressure returns the current barometric pressure, in Pa\nfunc (d *BMP388Driver) Pressure(accuracy BMP388Accuracy) (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tmode := d.ctrlPwrMode<<4 | bmp388PWRCTRLPressEnableBit | bmp388PWRCTRLTempEnableBit\n\tif err := d.writeByteData(bmp388RegPWRCTRL, mode); err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Set Standard Accuracy for pressure\n\tif err := d.writeByteData(bmp388RegOSR, uint8(accuracy)); err != nil {\n\t\treturn 0, err\n\t}\n\n\trawT, err := d.rawTemp()\n\tif err != nil {\n\t\treturn 0.0, err\n\t}\n\n\trawP, err := d.rawPressure()\n\tif err != nil {\n\t\treturn 0.0, err\n\t}\n\ttLin := d.calculateTemp(rawT)\n\n\treturn d.calculatePress(rawP, float64(tLin)), nil\n}\n\n// Altitude returns the current altitude in meters based on the\n// current barometric pressure and estimated pressure at sea level.\n// https://www.weather.gov/media/epz/wxcalc/pressureAltitude.pdf\nfunc (d *BMP388Driver) Altitude(accuracy BMP388Accuracy) (float32, error) {\n\tatmP, err := d.Pressure(accuracy)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tatmP /= 100.0\n\talt := float32(44307.0 * (1.0 - math.Pow(float64(atmP/bmp388SeaLevelPressure), 0.190284)))\n\n\treturn alt, nil\n}\n\n// initialization reads the calibration coefficients.\nfunc (d *BMP388Driver) initialization() error {\n\tchipID, err := d.readByteData(bmp388RegChipID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif bmp388ChipID != chipID {\n\t\treturn fmt.Errorf(\"incorrect BMP388 chip ID '0%x' Expected 0x%x\", chipID, bmp388ChipID)\n\t}\n\n\tvar (\n\t\tt1  uint16\n\t\tt2  uint16\n\t\tt3  int8\n\t\tp1  int16\n\t\tp2  int16\n\t\tp3  int8\n\t\tp4  int8\n\t\tp5  uint16\n\t\tp6  uint16\n\t\tp7  int8\n\t\tp8  int8\n\t\tp9  int16\n\t\tp10 int8\n\t\tp11 int8\n\t)\n\n\tcoefficients := make([]byte, 24)\n\tif err = d.readBlockData(bmp388RegCalib00, coefficients); err != nil {\n\t\treturn err\n\t}\n\tbuf := bytes.NewBuffer(coefficients)\n\n\tif err := binary.Read(buf, binary.LittleEndian, &t1); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &t2); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &t3); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p1); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p2); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p3); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p4); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p5); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p6); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p7); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p8); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p9); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p10); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &p11); err != nil {\n\t\treturn err\n\t}\n\n\td.calCoeffs.t1 = float32(float64(t1) / math.Pow(2, -8))\n\td.calCoeffs.t2 = float32(float64(t2) / math.Pow(2, 30))\n\td.calCoeffs.t3 = float32(float64(t3) / math.Pow(2, 48))\n\td.calCoeffs.p1 = float32((float64(p1) - math.Pow(2, 14)) / math.Pow(2, 20))\n\td.calCoeffs.p2 = float32((float64(p2) - math.Pow(2, 14)) / math.Pow(2, 29))\n\td.calCoeffs.p3 = float32(float64(p3) / math.Pow(2, 32))\n\td.calCoeffs.p4 = float32(float64(p4) / math.Pow(2, 37))\n\td.calCoeffs.p5 = float32(float64(p5) / math.Pow(2, -3))\n\td.calCoeffs.p6 = float32(float64(p6) / math.Pow(2, 6))\n\td.calCoeffs.p7 = float32(float64(p7) / math.Pow(2, 8))\n\td.calCoeffs.p8 = float32(float64(p8) / math.Pow(2, 15))\n\td.calCoeffs.p9 = float32(float64(p9) / math.Pow(2, 48))\n\td.calCoeffs.p10 = float32(float64(p10) / math.Pow(2, 48))\n\td.calCoeffs.p11 = float32(float64(p11) / math.Pow(2, 65))\n\n\tif err := d.writeByteData(bmp388RegCMD, bmp388CMDSoftReset); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.writeByteData(bmp388RegConf, uint8(d.confFilter)<<1)\n}\n\nfunc (d *BMP388Driver) rawTemp() (int32, error) {\n\tvar tp0, tp1, tp2 byte\n\n\tdata := make([]byte, 3)\n\tif err := d.readBlockData(bmp388RegTempData, data); err != nil {\n\t\treturn 0, err\n\t}\n\tbuf := bytes.NewBuffer(data)\n\t// XLSB\n\tif err := binary.Read(buf, binary.LittleEndian, &tp0); err != nil {\n\t\treturn 0, err\n\t}\n\t// LSB\n\tif err := binary.Read(buf, binary.LittleEndian, &tp1); err != nil {\n\t\treturn 0, err\n\t}\n\t// MSB\n\tif err := binary.Read(buf, binary.LittleEndian, &tp2); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn ((int32(tp2) << 16) | (int32(tp1) << 8) | int32(tp0)), nil\n}\n\nfunc (d *BMP388Driver) rawPressure() (int32, error) {\n\tvar tp0, tp1, tp2 byte\n\n\tdata := make([]byte, 3)\n\tif err := d.readBlockData(bmp388RegPressureData, data); err != nil {\n\t\treturn 0, err\n\t}\n\tbuf := bytes.NewBuffer(data)\n\t// XLSB\n\tif err := binary.Read(buf, binary.LittleEndian, &tp0); err != nil {\n\t\treturn 0, err\n\t}\n\t// LSB\n\tif err := binary.Read(buf, binary.LittleEndian, &tp1); err != nil {\n\t\treturn 0, err\n\t}\n\t// MSB\n\tif err := binary.Read(buf, binary.LittleEndian, &tp2); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn ((int32(tp2) << 16) | (int32(tp1) << 8) | int32(tp0)), nil\n}\n\nfunc (d *BMP388Driver) calculateTemp(rawTemp int32) float32 {\n\t// datasheet, sec 9.2 Temperature compensation\n\tpd1 := float32(rawTemp) - d.calCoeffs.t1\n\tpd2 := pd1 * d.calCoeffs.t2\n\n\ttemperatureComp := pd2 + (pd1*pd1)*d.calCoeffs.t3\n\n\treturn temperatureComp\n}\n\nfunc (d *BMP388Driver) calculatePress(rawPress int32, tLin float64) float32 {\n\tpd1 := float64(d.calCoeffs.p6) * tLin\n\tpd2 := float64(d.calCoeffs.p7) * tLin * tLin\n\tpd3 := float64(d.calCoeffs.p8) * tLin * tLin * tLin\n\tpo1 := float64(d.calCoeffs.p5) + pd1 + pd2 + pd3\n\n\tpd1 = float64(d.calCoeffs.p2) * tLin\n\tpd2 = float64(d.calCoeffs.p3) * tLin * tLin\n\tpd3 = float64(d.calCoeffs.p4) * tLin * tLin * tLin\n\tpo2 := float64(rawPress) * (float64(d.calCoeffs.p1) + pd1 + pd2 + pd3)\n\n\tpd1 = math.Pow(float64(rawPress), 2)\n\tpd2 = float64(d.calCoeffs.p9) + float64(d.calCoeffs.p10)*tLin\n\tpd3 = pd1 * pd2\n\tpd4 := pd3 + math.Pow(float64(rawPress), 3)*float64(d.calCoeffs.p11)\n\n\tpressure := po1 + po2 + pd4\n\n\treturn float32(pressure)\n}\n"
  },
  {
    "path": "drivers/i2c/bmp388_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*BMP388Driver)(nil)\n\nfunc initTestBMP388WithStubbedAdaptor() (*BMP388Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\n\treadCallCounter := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treadCallCounter++\n\t\tif readCallCounter == 1 {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\t// Simulate returning of 0x50 for the\n\t\t\t// ReadByteData(bmp388RegChipID) call in initialisation()\n\t\t\t_ = binary.Write(buf, binary.LittleEndian, uint8(0x50))\n\t\t\tcopy(b, buf.Bytes())\n\t\t\treturn buf.Len(), nil\n\t\t}\n\t\tif readCallCounter == 2 {\n\t\t\t// Simulate returning 24 bytes for the coefficients (register bmp388RegCalib00)\n\t\t\treturn 24, nil\n\t\t}\n\t\treturn 0, nil\n\t}\n\treturn NewBMP388Driver(a), a\n}\n\nfunc TestNewBMP388Driver(t *testing.T) {\n\tvar di interface{} = NewBMP388Driver(newI2cTestAdaptor())\n\td, ok := di.(*BMP388Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewBMP388Driver() should have returned a *BMP388Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"BMP388\"))\n\tassert.Equal(t, 0x77, d.defaultAddress)\n\tassert.Equal(t, uint8(0x01), d.ctrlPwrMode)          // forced mode\n\tassert.Equal(t, BMP388IIRFilter(0x00), d.confFilter) // filter off\n\tassert.NotNil(t, d.calCoeffs)\n}\n\nfunc TestBMP388Halt(t *testing.T) {\n\t// arrange\n\td, _ := initTestBMP388WithStubbedAdaptor()\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestBMP388Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewBMP388Driver(newI2cTestAdaptor(), WithBus(2), WithBMP388IIRFilter(BMP388IIRFilter(0x03)))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, BMP388IIRFilter(0x03), d.confFilter)\n}\n\nfunc TestBMP388Measurements(t *testing.T) {\n\td, a := initTestBMP388WithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tlastWritten := a.written[len(a.written)-1]\n\t\tswitch lastWritten {\n\t\tcase bmp388RegChipID:\n\t\t\t// Simulate returning of 0x50 for the\n\t\t\t// ReadByteData(bmp388RegChipID) call in initialisation()\n\t\t\t_ = binary.Write(buf, binary.LittleEndian, uint8(0x50))\n\t\tcase bmp388RegCalib00:\n\t\t\t// Values produced by dumping data from actual sensor\n\t\t\tbuf.Write([]byte{\n\t\t\t\t36, 107, 156, 73, 246, 104, 255, 189, 245, 35, 0, 151, 101, 184, 122, 243, 246, 211, 64, 14, 196, 0, 0, 0,\n\t\t\t})\n\t\tcase bmp388RegTempData:\n\t\t\tbuf.Write([]byte{0, 28, 127})\n\t\tcase bmp388RegPressureData:\n\t\t\tbuf.Write([]byte{0, 66, 113})\n\t\t}\n\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = d.Start()\n\ttemp, err := d.Temperature(2)\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(22.906143), temp, 0.0)\n\tpressure, err := d.Pressure(2)\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(98874.85), pressure, 0.0)\n\talt, err := d.Altitude(2)\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(205.89395), alt, 0.0)\n}\n\nfunc TestBMP388TemperatureWriteError(t *testing.T) {\n\td, a := initTestBMP388WithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\ttemp, err := d.Temperature(2)\n\trequire.ErrorContains(t, err, \"write error\")\n\tassert.InDelta(t, float32(0.0), temp, 0.0)\n}\n\nfunc TestBMP388TemperatureReadError(t *testing.T) {\n\td, a := initTestBMP388WithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\ttemp, err := d.Temperature(2)\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, float32(0.0), temp, 0.0)\n}\n\nfunc TestBMP388PressureWriteError(t *testing.T) {\n\td, a := initTestBMP388WithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\tpress, err := d.Pressure(2)\n\trequire.ErrorContains(t, err, \"write error\")\n\tassert.InDelta(t, float32(0.0), press, 0.0)\n}\n\nfunc TestBMP388PressureReadError(t *testing.T) {\n\td, a := initTestBMP388WithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\tpress, err := d.Pressure(2)\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, float32(0.0), press, 0.0)\n}\n\nfunc TestBMP388_initialization(t *testing.T) {\n\t// sequence to read and write in initialization():\n\t// * read chip ID register (0x00) and compare\n\t// * read 24 bytes (12 x 16 bit calibration data), starting from TC1 register (0x31)\n\t// * fill calibration struct with data (LSByte read first)\n\t// * perform a soft reset by command register (0x7E)\n\t// * prepare the content of config register\n\t// * write the config register (0x1F)\n\t// arrange\n\td, a := initTestBMP388WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\twantChipIDReg     = uint8(0x00)\n\t\twantCalibReg      = uint8(0x31)\n\t\twantCommandReg    = uint8(0x7E)\n\t\twantCommandRegVal = uint8(0xB6) // soft reset\n\t\twantConfReg       = uint8(0x1F)\n\t\twantConfRegVal    = uint8(0x00) // no filter\n\t)\n\t// Values produced by dumping data from actual sensor\n\treturnRead := []byte{\n\t\t36, 107, 156, 73, 246, 104, 255, 189, 245, 35, 0, 151, 101, 184, 122, 243, 246, 211, 64, 14, 196, 0, 0, 0,\n\t}\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\tb[0] = 0x50\n\t\t} else {\n\t\t\tcopy(b, returnRead)\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialization() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.Len(t, a.written, 6)\n\tassert.Equal(t, wantChipIDReg, a.written[0])\n\tassert.Equal(t, wantCalibReg, a.written[1])\n\tassert.Equal(t, wantCommandReg, a.written[2])\n\tassert.Equal(t, wantCommandRegVal, a.written[3])\n\tassert.Equal(t, wantConfReg, a.written[4])\n\tassert.Equal(t, wantConfRegVal, a.written[5])\n\tassert.InDelta(t, float32(7.021568e+06), d.calCoeffs.t1, 0.0)\n\tassert.InDelta(t, float32(1.7549843e-05), d.calCoeffs.t2, 0.0)\n\tassert.InDelta(t, float32(-3.5527137e-14), d.calCoeffs.t3, 0.0)\n\tassert.InDelta(t, float32(-0.015769958), d.calCoeffs.p1, 0.0)\n\tassert.InDelta(t, float32(-3.5410747e-05), d.calCoeffs.p2, 0.0)\n\tassert.InDelta(t, float32(8.1490725e-09), d.calCoeffs.p3, 0.0)\n\tassert.InDelta(t, float32(0), d.calCoeffs.p4, 0.0)\n\tassert.InDelta(t, float32(208056), d.calCoeffs.p5, 0.0)\n\tassert.InDelta(t, float32(490.875), d.calCoeffs.p6, 0.0)\n\tassert.InDelta(t, float32(-0.05078125), d.calCoeffs.p7, 0.0)\n\tassert.InDelta(t, float32(-0.00030517578), d.calCoeffs.p8, 0.0)\n\tassert.InDelta(t, float32(5.8957283e-11), d.calCoeffs.p9, 0.0)\n}\n"
  },
  {
    "path": "drivers/i2c/ccs811_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"time\"\n)\n\n// CCS811DriveMode type\ntype CCS811DriveMode uint8\n\n// Operating modes which dictate how often measurements are being made. If 0x00 is used as an operating mode,\n// measurements will be disabled\nconst (\n\tCCS811DriveModeIdle  CCS811DriveMode = 0x00\n\tCCS811DriveMode1Sec  CCS811DriveMode = 0x01\n\tCCS811DriveMode10Sec CCS811DriveMode = 0x02\n\tCCS811DriveMode60Sec CCS811DriveMode = 0x03\n\tCCS811DriveMode250MS CCS811DriveMode = 0x04\n)\n\nconst (\n\n\t// the default I2C address for the ccs811 applies for ADDR to GND, for ADDR to VDD it will be 0x5B\n\tccs811DefaultAddress = 0x5A\n\n\t// Registers, all definitions have been taken from the datasheet\n\t// Single byte read only register which indicates if a device is active, if new data is available or if an error\n\t// occurred.\n\tccs811RegStatus = 0x00\n\t// This is Single byte register, which is used to enable sensor drive mode and interrupts.\n\tccs811RegMeasMode = 0x01\n\t// This multi-byte read only register contains the calculated eCO2 (ppm) and eTVOC (ppb) values followed by the\n\t// STATUS register, ERROR_ID register and the RAW_DATA register.\n\tccs811RegAlgResultData = 0x02\n\t// Two byte read only register which contains the latest readings from the sensor.\n\t// ccs811RegRawData = 0x03\n\t// A multi-byte register that can be written with the current Humidity and Temperature values if known.\n\t// ccs811RegEnvData = 0x05\n\t// Register that holds the NTC value used for temperature calculations\n\tccs811RegNtc = 0x06\n\t// Asserting the SW_RESET will restart the CCS811 in Boot mode to enable new application firmware to be downloaded.\n\tccs811RegSwReset = 0xFF\n\t// Single byte read only register which holds the HW ID which is 0x81 for this family of CCS81x devices.\n\tccs811RegHwID = 0x20\n\t// Single byte read only register that contains the hardware version. The value is 0x1X\n\tccs811RegHwVersion = 0x21\n\t// Two byte read only register which contain the version of the firmware bootloader stored in the CCS811 in the\n\t// format Major.Minor.Trivial\n\tccs811RegFwBootVersion = 0x23\n\t// Two byte read only register which contain the version of the firmware application stored in the CCS811 in the\n\t// format Major.Minor.Trivial\n\tccs811RegFwAppVersion = 0x24\n\t// To change the mode of the CCS811 from Boot mode to running the application, a single byte write of 0xF4\n\t// is required.\n\tccs811RegAppStart = 0xF4\n\n\t// Constants\n\t// The hardware ID code\n\tccs811HwIDCode = 0x81\n)\n\n// The sequence of bytes needed to do a software reset\nvar ccs811SwResetSequence = []byte{0x11, 0xE5, 0x72, 0x8A}\n\n// CCS811Status represents the current status of the device defined by the ccs811RegStatus.\n// The following definitions were taken from\n// https://ams.com/documents/20143/36005/CCS811_DS000459_6-00.pdf/c7091525-c7e5-37ac-eedb-b6c6828b0dcf#page=15\ntype CCS811Status struct {\n\t// There is some sort of error on the i2c bus or there is an error with the internal sensor\n\tHasError byte\n\t// A new data sample is ready in ccs811RegAlgResultData\n\tDataReady byte\n\t// Valid application firmware loaded\n\tAppValid byte\n\t// Firmware is in application mode. CCS811 is ready to take sensor measurements\n\tFwMode byte\n}\n\n// NewCCS811Status returns a new instance of the package ccs811 status definition\nfunc NewCCS811Status(data uint8) *CCS811Status {\n\treturn &CCS811Status{\n\t\tHasError:  data & 0x01,\n\t\tDataReady: (data >> 3) & 0x01,\n\t\tAppValid:  (data >> 4) & 0x01,\n\t\tFwMode:    (data >> 7) & 0x01,\n\t}\n}\n\n// CCS811MeasMode represents the current measurement configuration.\n// The following definitions were taken from the bit fields of the ccs811RegMeasMode defined in\n// https://ams.com/documents/20143/36005/CCS811_DS000459_6-00.pdf/c7091525-c7e5-37ac-eedb-b6c6828b0dcf#page=16\ntype CCS811MeasMode struct {\n\t// If intThresh is 1 a data measurement will only be taken when the sensor value meets the threshold constraint.\n\t// The threshold value is set in the threshold register (0x10)\n\tintThresh uint8\n\t// If intDataRdy is 1, the nINT signal (pin 3 of the device) will be driven low when new data is available.\n\tintDataRdy uint8\n\t// driveMode represents the sampling rate of the sensor. If the value is 0, the measurement process is idle.\n\tdriveMode CCS811DriveMode\n}\n\n// NewCCS811MeasMode returns a new instance of the measurement mode configuration. This represents the desired initial\n// state of the measurement mode register.\nfunc NewCCS811MeasMode() *CCS811MeasMode {\n\treturn &CCS811MeasMode{\n\t\t// Disable this by default as this library does not contain the functionality to use the internal interrupt feature.\n\t\tintThresh:  0x00,\n\t\tintDataRdy: 0x00,\n\t\tdriveMode:  CCS811DriveMode1Sec,\n\t}\n}\n\n// GetMeasMode returns the measurement mode\nfunc (mm *CCS811MeasMode) GetMeasMode() byte {\n\treturn (mm.intThresh << 2) | (mm.intDataRdy << 3) | uint8((mm.driveMode << 4))\n}\n\n// CCS811Driver is the Gobot driver for the CCS811 (air quality sensor) Adafruit breakout board\ntype CCS811Driver struct {\n\t*Driver\n\n\tmeasMode           *CCS811MeasMode\n\tntcResistanceValue uint32\n}\n\n// NewCCS811Driver creates a new driver for the CCS811 (air quality sensor)\nfunc NewCCS811Driver(c Connector, options ...func(Config)) *CCS811Driver {\n\td := &CCS811Driver{\n\t\tDriver:   NewDriver(c, \"CCS811\", ccs811DefaultAddress),\n\t\tmeasMode: NewCCS811MeasMode(),\n\t\t// Recommended resistance value is 100,000\n\t\tntcResistanceValue: 100000,\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// WithCCS811MeasMode sets the sampling rate of the device\nfunc WithCCS811MeasMode(mode CCS811DriveMode) func(Config) {\n\treturn func(c Config) {\n\t\td, _ := c.(*CCS811Driver)\n\t\td.measMode.driveMode = mode\n\t}\n}\n\n// WithCCS811NTCResistance sets reistor value used in the temperature calculations.\n// This resistor must be placed between pin 4 and pin 8 of the chip\nfunc WithCCS811NTCResistance(val uint32) func(Config) {\n\treturn func(c Config) {\n\t\td, _ := c.(*CCS811Driver)\n\t\td.ntcResistanceValue = val\n\t}\n}\n\n// GetHardwareVersion returns the hardware version of the device in the form of 0x1X\nfunc (d *CCS811Driver) GetHardwareVersion() (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tv, err := d.readByteData(ccs811RegHwVersion)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn v, nil\n}\n\n// GetFirmwareBootVersion returns the bootloader version\nfunc (d *CCS811Driver) GetFirmwareBootVersion() (uint16, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tv, err := d.readWordData(ccs811RegFwBootVersion)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn v, nil\n}\n\n// GetFirmwareAppVersion returns the app code version\nfunc (d *CCS811Driver) GetFirmwareAppVersion() (uint16, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tv, err := d.readWordData(ccs811RegFwAppVersion)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn v, nil\n}\n\n// GetStatus returns the current status of the device\nfunc (d *CCS811Driver) GetStatus() (*CCS811Status, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\ts, err := d.readByteData(ccs811RegStatus)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcs := NewCCS811Status(s)\n\treturn cs, nil\n}\n\n// GetTemperature returns the device temperature in celsius.\n// If you do not have an NTC resistor installed, this function should not be called\nfunc (d *CCS811Driver) GetTemperature() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tbuf := make([]byte, 4)\n\terr := d.readBlockData(ccs811RegNtc, buf)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvref := ((uint16(buf[0]) << 8) | uint16(buf[1]))\n\tvrntc := ((uint16(buf[2]) << 8) | uint16(buf[3]))\n\trntc := (float32(vrntc) * float32(d.ntcResistanceValue) / float32(vref))\n\n\tntcTemp := float32(math.Log(float64(rntc / 10000.0)))\n\tntcTemp /= 3380.0\n\tntcTemp += 1.0 / (25 + 273.15)\n\tntcTemp = 1.0 / ntcTemp\n\tntcTemp -= 273.15\n\n\treturn ntcTemp, nil\n}\n\n// GetGasData returns the data for the gas sensor.\n// eco2 is returned in ppm and tvoc is returned in ppb\nfunc (d *CCS811Driver) GetGasData() (uint16, uint16, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tdata := make([]byte, 4)\n\terr := d.readBlockData(ccs811RegAlgResultData, data)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Bit masks defined by\n\t// https://ams.com/documents/20143/36005/CCS811_AN000369_2-00.pdf/25d0db9a-92b9-fa7f-362c-a7a4d1e292be#page=14\n\teco2 := (uint16(data[0]) << 8) | uint16(data[1])\n\ttvoC := (uint16(data[2]) << 8) | uint16(data[3])\n\n\treturn eco2, tvoC, nil\n}\n\n// HasData returns true if the device has not errored and temperature/gas data is available\nfunc (d *CCS811Driver) HasData() (bool, error) {\n\ts, err := d.GetStatus()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tif (s.DataReady != 0x01) || (s.HasError == 0x01) {\n\t\treturn false, nil\n\t}\n\n\treturn true, nil\n}\n\n// EnableExternalInterrupt enables the external output hardware interrupt pin 3.\nfunc (d *CCS811Driver) EnableExternalInterrupt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.measMode.intDataRdy = 1\n\treturn d.writeByteData(ccs811RegMeasMode, d.measMode.GetMeasMode())\n}\n\n// DisableExternalInterrupt disables the external output hardware interrupt pin 3.\nfunc (d *CCS811Driver) DisableExternalInterrupt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.measMode.intDataRdy = 0\n\treturn d.writeByteData(ccs811RegMeasMode, d.measMode.GetMeasMode())\n}\n\nfunc (d *CCS811Driver) initialize() error {\n\tdeviceID, err := d.readByteData(ccs811RegHwID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to get the device id from ccs811RegHwID with error: %s\", err.Error())\n\t}\n\n\t// Verify that the connected device is the CCS811 sensor\n\tif deviceID != ccs811HwIDCode {\n\t\treturn fmt.Errorf(\"the fetched device id %d is not the known id %d with error\", deviceID, ccs811HwIDCode)\n\t}\n\n\tif err := d.resetDevice(); err != nil {\n\t\treturn fmt.Errorf(\"was not able to reset the device with error: %s\", err.Error())\n\t}\n\n\t// Required sleep to allow device to switch states\n\ttime.Sleep(100 * time.Millisecond)\n\n\tif err := d.startApp(); err != nil {\n\t\treturn fmt.Errorf(\"failed to start app code with error: %s\", err.Error())\n\t}\n\n\tif err := d.updateMeasMode(); err != nil {\n\t\treturn fmt.Errorf(\"failed to update the measMode register with error: %s\", err.Error())\n\t}\n\n\treturn nil\n}\n\n// ResetDevice does a software reset of the device. After this operation is done,\n// the user must start the app code before the sensor can take any measurements\nfunc (d *CCS811Driver) resetDevice() error {\n\treturn d.writeBlockData(ccs811RegSwReset, ccs811SwResetSequence)\n}\n\n// startApp starts the app code in the device. This operation has to be done after a\n// software reset to start taking sensor measurements.\nfunc (d *CCS811Driver) startApp() error {\n\t// Write without data is needed to start the app code\n\t_, err := d.write([]byte{ccs811RegAppStart})\n\treturn err\n}\n\n// updateMeasMode writes the current value of measMode to the measurement mode register.\nfunc (d *CCS811Driver) updateMeasMode() error {\n\treturn d.writeByteData(ccs811RegMeasMode, d.measMode.GetMeasMode())\n}\n"
  },
  {
    "path": "drivers/i2c/ccs811_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*CCS811Driver)(nil)\n\nfunc initTestCCS811WithStubbedAdaptor() (*CCS811Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\t// mandatory for a successful start\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tb[0] = ccs811HwIDCode\n\t\treturn len(b), nil\n\t}\n\treturn NewCCS811Driver(a), a\n}\n\nfunc TestNewCCS811Driver(t *testing.T) {\n\tvar di interface{} = NewCCS811Driver(newI2cTestAdaptor())\n\td, ok := di.(*CCS811Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewCCS811Driver() should have returned a *CCS811Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"CCS811\"))\n\tassert.Equal(t, 0x5A, d.defaultAddress)\n\tassert.NotNil(t, d.measMode)\n\tassert.Equal(t, uint32(100000), d.ntcResistanceValue)\n}\n\nfunc TestCCS811Halt(t *testing.T) {\n\t// arrange\n\td, _ := initTestCCS811WithStubbedAdaptor()\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestCCS811Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewCCS811Driver(newI2cTestAdaptor(), WithBus(2), WithAddress(0xFF), WithCCS811NTCResistance(0xFF))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, 0xFF, d.GetAddressOrDefault(0x5a))\n\tassert.Equal(t, uint32(0xFF), d.ntcResistanceValue)\n}\n\nfunc TestCCS811WithCCS811MeasMode(t *testing.T) {\n\td := NewCCS811Driver(newI2cTestAdaptor(), WithCCS811MeasMode(CCS811DriveMode10Sec))\n\tassert.Equal(t, CCS811DriveMode10Sec, d.measMode.driveMode)\n}\n\nfunc TestCCS811GetGasData(t *testing.T) {\n\ttests := map[string]struct {\n\t\treadReturn func([]byte) (int, error)\n\t\teco2       uint16\n\t\ttvoc       uint16\n\t\terr        error\n\t}{\n\t\t\"ideal values taken from the bus\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{1, 156, 0, 86})\n\t\t\t\treturn 4, nil\n\t\t\t},\n\t\t\teco2: 412,\n\t\t\ttvoc: 86,\n\t\t\terr:  nil,\n\t\t},\n\t\t\"max values possible taken from the bus\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{255, 255, 255, 255})\n\t\t\t\treturn 4, nil\n\t\t\t},\n\t\t\teco2: 65535,\n\t\t\ttvoc: 65535,\n\t\t\terr:  nil,\n\t\t},\n\t\t\"error when the i2c operation fails\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{255, 255, 255, 255})\n\t\t\t\treturn 4, errors.New(\"Error\")\n\t\t\t},\n\t\t\teco2: 0,\n\t\t\ttvoc: 0,\n\t\t\terr:  errors.New(\"Error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestCCS811WithStubbedAdaptor()\n\t\t\t// Create stub function as it is needed by read submethod in driver code\n\t\t\ta.i2cWriteImpl = func([]byte) (int, error) { return 0, nil }\n\t\t\trequire.NoError(t, d.Start())\n\t\t\ta.i2cReadImpl = tc.readReturn\n\t\t\t// act\n\t\t\teco2, tvoc, err := d.GetGasData()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.eco2, eco2)\n\t\t\tassert.Equal(t, tc.tvoc, tvoc)\n\t\t\tassert.Equal(t, tc.err, err)\n\t\t})\n\t}\n}\n\nfunc TestCCS811GetTemperature(t *testing.T) {\n\ttests := map[string]struct {\n\t\treadReturn func([]byte) (int, error)\n\t\ttemp       float32\n\t\terr        error\n\t}{\n\t\t\"ideal values taken from the bus\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{10, 197, 0, 248})\n\t\t\t\treturn 4, nil\n\t\t\t},\n\t\t\ttemp: 27.811005,\n\t\t\terr:  nil,\n\t\t},\n\t\t\"without bus values overflowing\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{129, 197, 10, 248})\n\t\t\t\treturn 4, nil\n\t\t\t},\n\t\t\ttemp: 29.48822,\n\t\t\terr:  nil,\n\t\t},\n\t\t\"negative temperature\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{255, 255, 255, 255})\n\t\t\t\treturn 4, nil\n\t\t\t},\n\t\t\ttemp: -25.334152,\n\t\t\terr:  nil,\n\t\t},\n\t\t\"error if the i2c bus errors\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{129, 197, 0, 248})\n\t\t\t\treturn 4, errors.New(\"Error\")\n\t\t\t},\n\t\t\ttemp: 0,\n\t\t\terr:  errors.New(\"Error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestCCS811WithStubbedAdaptor()\n\t\t\t// Create stub function as it is needed by read submethod in driver code\n\t\t\ta.i2cWriteImpl = func([]byte) (int, error) { return 0, nil }\n\t\t\trequire.NoError(t, d.Start())\n\t\t\ta.i2cReadImpl = tc.readReturn\n\t\t\t// act\n\t\t\ttemp, err := d.GetTemperature()\n\t\t\t// assert\n\t\t\tassert.InDelta(t, tc.temp, temp, 0.0)\n\t\t\tassert.Equal(t, tc.err, err)\n\t\t})\n\t}\n}\n\nfunc TestCCS811HasData(t *testing.T) {\n\ttests := map[string]struct {\n\t\treadReturn func([]byte) (int, error)\n\t\tresult     bool\n\t\terr        error\n\t}{\n\t\t\"true for HasError=0 and DataRdy=1\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{0x08})\n\t\t\t\treturn 1, nil\n\t\t\t},\n\t\t\tresult: true,\n\t\t\terr:    nil,\n\t\t},\n\t\t\"false for HasError=1 and DataRdy=1\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{0x09})\n\t\t\t\treturn 1, nil\n\t\t\t},\n\t\t\tresult: false,\n\t\t\terr:    nil,\n\t\t},\n\t\t\"false for HasError=1 and DataRdy=0\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{0x01})\n\t\t\t\treturn 1, nil\n\t\t\t},\n\t\t\tresult: false,\n\t\t\terr:    nil,\n\t\t},\n\t\t\"false for HasError=0 and DataRdy=0\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{0x00})\n\t\t\t\treturn 1, nil\n\t\t\t},\n\t\t\tresult: false,\n\t\t\terr:    nil,\n\t\t},\n\t\t\"error when the i2c read operation fails\": {\n\t\t\treadReturn: func(b []byte) (int, error) {\n\t\t\t\tcopy(b, []byte{0x00})\n\t\t\t\treturn 1, errors.New(\"Error\")\n\t\t\t},\n\t\t\tresult: false,\n\t\t\terr:    errors.New(\"Error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestCCS811WithStubbedAdaptor()\n\t\t\t// Create stub function as it is needed by read submethod in driver code\n\t\t\ta.i2cWriteImpl = func([]byte) (int, error) { return 0, nil }\n\t\t\trequire.NoError(t, d.Start())\n\t\t\ta.i2cReadImpl = tc.readReturn\n\t\t\t// act\n\t\t\tresult, err := d.HasData()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.result, result)\n\t\t\tassert.Equal(t, tc.err, err)\n\t\t})\n\t}\n}\n\nfunc TestCCS811_initialize(t *testing.T) {\n\t// sequence for initialization the device on Start()\n\t// * write hardware ID register (0x20)\n\t// * read the ID\n\t// * prepare software reset register content: a sequence of four bytes must\n\t//   be written to this register in a single I²C sequence: 0x11, 0xE5, 0x72, 0x8A\n\t// * write software reset register content (0xFF)\n\t// * write application start register (0xF4)\n\t// * prepare measurement mode register content\n\t//  * INT_THRESH = 0 (normal mode)\n\t//  * INT_DATARDY = 0 (disable interrupt mode)\n\t//  * DRIVE_MODE = 0x01 (constant power, value every 1 sec)\n\t// * write measure mode register content (0x01)\n\t//\n\t// arrange\n\td, a := initTestCCS811WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\tconst (\n\t\twantChipIDReg    = uint8(0x20)\n\t\twantChipIDRegVal = uint8(0x20)\n\t\twantResetReg     = uint8(0xFF)\n\t\twantAppStartReg  = uint8(0xF4)\n\t\twantMeasReg      = uint8(0x01)\n\t\twantMeasRegVal   = uint8(0x10)\n\t)\n\twantResetRegSequence := []byte{0x11, 0xE5, 0x72, 0x8A}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\t// chip ID\n\t\tb[0] = 0x81\n\t\treturn len(b), nil\n\t}\n\t// arrange, act - initialize() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Len(t, a.written, 9)\n\tassert.Equal(t, wantChipIDReg, a.written[0])\n\tassert.Equal(t, wantResetReg, a.written[1])\n\tassert.Equal(t, wantResetRegSequence, a.written[2:6])\n\tassert.Equal(t, wantAppStartReg, a.written[6])\n\tassert.Equal(t, wantMeasReg, a.written[7])\n\tassert.Equal(t, wantMeasRegVal, a.written[8])\n}\n"
  },
  {
    "path": "drivers/i2c/doc.go",
    "content": "/*\nPackage i2c provides Gobot drivers for i2c devices.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFor further information refer to i2c README:\nhttps://github.com/hybridgroup/gobot/blob/release/drivers/i2c/README.md\n*/\npackage i2c // import \"gobot.io/x/gobot/v2/drivers/i2c\"\n"
  },
  {
    "path": "drivers/i2c/drv2605l_driver.go",
    "content": "package i2c\n\n// DRV2605Mode - operating mode\ntype DRV2605Mode uint8\n\n// Operating modes, for use in SetMode()\nconst (\n\tDRV2605ModeIntTrig     DRV2605Mode = 0x00\n\tDRV2605ModeExtTrigEdge DRV2605Mode = 0x01\n\tDRV2605ModeExtTrigLvl  DRV2605Mode = 0x02\n\tDRV2605ModePWMAnalog   DRV2605Mode = 0x03\n\tDRV2605ModeAudioVibe   DRV2605Mode = 0x04\n\tDRV2605ModeRealtime    DRV2605Mode = 0x05\n\tDRV2605ModeDiagnose    DRV2605Mode = 0x06\n\tDRV2605ModeAutocal     DRV2605Mode = 0x07\n)\n\nconst (\n\tdrv2605DefaultAddress = 0x5A\n\n\tdrv2605RegStatus = 0x00\n\tdrv2605RegMode   = 0x01\n\n\tdrv2605Standby = 0x40\n\n\tdrv2605RegRTPin    = 0x02\n\tdrv2605RegLibrary  = 0x03\n\tdrv2605RegWaveSeq1 = 0x04\n\tdrv2605RegWaveSeq2 = 0x05\n\tdrv2605RegWaveSeq3 = 0x06\n\tdrv2605RegWaveSeq4 = 0x07\n\tdrv2605RegWaveSeq5 = 0x08\n\tdrv2605RegWaveSeq6 = 0x09\n\tdrv2605RegWaveSeq7 = 0x0A\n\tdrv2605RegWaveSeq8 = 0x0B\n\n\tdrv2605RegGo            = 0x0C\n\tdrv2605RegOverdrive     = 0x0D\n\tdrv2605RegSustainPos    = 0x0E\n\tdrv2605RegSustainNeg    = 0x0F\n\tdrv2605RegBreak         = 0x10\n\tdrv2605RegAudioCtrl     = 0x11\n\tdrv2605RegAudioMinLevel = 0x12\n\tdrv2605RegAudioMaxLevel = 0x13\n\tdrv2605RegAudioMinDrive = 0x14\n\tdrv2605RegAudioMaxDrive = 0x15\n\tdrv2605RegRatedV        = 0x16\n\tdrv2605RegClampV        = 0x17\n\tdrv2605RegAutocalComp   = 0x18\n\tdrv2605RegAutocalEmp    = 0x19\n\tdrv2605RegFeedback      = 0x1A\n\tdrv2605RegControl1      = 0x1B\n\tdrv2605RegControl2      = 0x1C\n\tdrv2605RegControl3      = 0x1D\n\tdrv2605RegControl4      = 0x1E\n\tdrv2605RegVBat          = 0x21\n\tdrv2605RegLRAResoPeriod = 0x22\n)\n\n// DRV2605LDriver is the gobot driver for the TI/Adafruit DRV2605L Haptic Controller\n//\n// Device datasheet: http://www.ti.com/lit/ds/symlink/drv2605l.pdf\n//\n// Inspired by the Adafruit Python driver by Sean Mealin.\n//\n// Basic use:\n//\n//\thaptic := i2c.NewDRV2605Driver(adaptor)\n//\thaptic.SetSequence([]byte{1, 13})\n//\thaptic.Go()\ntype DRV2605LDriver struct {\n\t*Driver\n}\n\n// NewDRV2605LDriver creates a new driver for the DRV2605L device.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewDRV2605LDriver(c Connector, options ...func(Config)) *DRV2605LDriver {\n\td := &DRV2605LDriver{\n\t\tDriver: NewDriver(c, \"DRV2605L\", drv2605DefaultAddress),\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// SetMode sets the device in one of the eight modes as described in the\n// datasheet. Defaults to mode 0, internal trig.\nfunc (d *DRV2605LDriver) SetMode(newMode DRV2605Mode) error {\n\tmode, err := d.readByteData(drv2605RegMode)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// clear mode bits (lower three bits)\n\tmode &= 0xf8\n\t// set new mode bits\n\tmode |= uint8(newMode)\n\n\terr = d.writeByteData(drv2605RegMode, mode)\n\n\treturn err\n}\n\n// SetStandbyMode controls device low power mode\nfunc (d *DRV2605LDriver) SetStandbyMode(standby bool) error {\n\tmodeVal, err := d.readByteData(drv2605RegMode)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif standby {\n\t\tmodeVal |= drv2605Standby\n\t} else {\n\t\tmodeVal &= 0xFF ^ drv2605Standby\n\t}\n\n\terr = d.writeByteData(drv2605RegMode, modeVal)\n\n\treturn err\n}\n\n// SelectLibrary selects which waveform library to play from, 1-7.\n// See datasheet for more info.\nfunc (d *DRV2605LDriver) SelectLibrary(library uint8) error {\n\treturn d.writeByteData(drv2605RegLibrary, library&0x7)\n}\n\n// GetPauseWaveform returns a special waveform ID used in SetSequence() to encode\n// pauses between waveforms. Time is specified in tens of milliseconds\n// ranging from 0ms (delayTime10MS = 0) to 1270ms (delayTime10MS = 127).\n// Times out of range are clipped to fit.\nfunc (d *DRV2605LDriver) GetPauseWaveform(delayTime10MS uint8) uint8 {\n\tif delayTime10MS > 127 {\n\t\tdelayTime10MS = 127\n\t}\n\n\treturn delayTime10MS | 0x80\n}\n\n// SetSequence sets the sequence of waveforms to be played by the sequencer,\n// specified by waveform id as described in the datasheet.\n// The sequencer can play at most 8 waveforms in sequence, longer\n// sequences will be truncated.\n// A waveform id of zero marks the end of the sequence.\n// Pauses can be encoded using GetPauseWaveform().\nfunc (d *DRV2605LDriver) SetSequence(waveforms []uint8) error {\n\tif len(waveforms) < 8 {\n\t\twaveforms = append(waveforms, 0)\n\t}\n\tif len(waveforms) > 8 {\n\t\twaveforms = waveforms[0:8]\n\t}\n\tfor i, w := range waveforms {\n\t\t//nolint:gosec // TODO: fix later\n\t\tif err := d.writeByteData(uint8(drv2605RegWaveSeq1+i), w); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Go plays the current sequence of waveforms.\nfunc (d *DRV2605LDriver) Go() error {\n\treturn d.writeByteData(drv2605RegGo, 1)\n}\n\nfunc (d *DRV2605LDriver) writeByteRegisters(regValPairs []struct{ reg, val uint8 }) error {\n\tfor _, rv := range regValPairs {\n\t\tif err := d.writeByteData(rv.reg, rv.val); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (d *DRV2605LDriver) initialize() error {\n\tfeedback, err := d.readByteData(drv2605RegFeedback)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcontrol, err := d.readByteData(drv2605RegControl3)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn d.writeByteRegisters([]struct{ reg, val uint8 }{\n\t\t// leave standby, enter \"internal trig\" mode\n\t\t{drv2605RegMode, 0},\n\t\t// turn off real-time play\n\t\t{drv2605RegRTPin, 0},\n\t\t// init wave sequencer with \"strong click\"\n\t\t{drv2605RegWaveSeq1, 1},\n\t\t{drv2605RegWaveSeq1, 0},\n\t\t// no physical parameter tweaks\n\t\t{drv2605RegSustainPos, 0},\n\t\t{drv2605RegSustainNeg, 0},\n\t\t{drv2605RegBreak, 0},\n\t\t// set up ERM open loop\n\t\t{drv2605RegFeedback, feedback & 0x7f},\n\t\t{drv2605RegControl3, control | 0x20},\n\t})\n}\n\nfunc (d *DRV2605LDriver) shutdown() error {\n\tif d.connection != nil {\n\t\t// stop playback\n\t\tif err := d.writeByteData(drv2605RegGo, 0); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// enter standby\n\t\treturn d.SetStandbyMode(true)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/drv2605l_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*DRV2605LDriver)(nil)\n\nfunc initTestDRV2605LDriverWithStubbedAdaptor() (*DRV2605LDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\t// Prime adapter reader to make \"Start()\" call happy\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t_ = binary.Write(buf, binary.LittleEndian, uint8(42))\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\td := NewDRV2605LDriver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewDRV2605LDriver(t *testing.T) {\n\tvar di interface{} = NewDRV2605LDriver(newI2cTestAdaptor())\n\td, ok := di.(*DRV2605LDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewDRV2605LDriver() should have returned a *DRV2605LDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"DRV2605L\"))\n\tassert.Equal(t, 0x5a, d.defaultAddress)\n}\n\nfunc TestDRV2605LOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewDRV2605LDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestDRV2605LStart(t *testing.T) {\n\td := NewDRV2605LDriver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestDRV2605LHaltIdempotent(t *testing.T) {\n\t// arrange\n\td := NewDRV2605LDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestDRV2605LHalt(t *testing.T) {\n\t// arrange\n\twriteStopPlaybackData := []byte{drv2605RegGo, 0}\n\t// single-byte-read starts with a write operation to set the register for reading\n\t// see section 8.5.3.5 of data sheet\n\treadCurrentStandbyModeData := byte(drv2605RegMode)\n\twriteNewStandbyModeData := []byte{drv2605RegMode, 42 | drv2605Standby}\n\td, a := initTestDRV2605LDriverWithStubbedAdaptor()\n\ta.written = []byte{}\n\t// act\n\trequire.NoError(t, d.Halt())\n\t// assert\n\tassert.Equal(t, append(append(writeStopPlaybackData, readCurrentStandbyModeData), writeNewStandbyModeData...),\n\t\ta.written)\n}\n\nfunc TestDRV2605LGetPause(t *testing.T) {\n\td, _ := initTestDRV2605LDriverWithStubbedAdaptor()\n\tassert.Equal(t, uint8(0x80), d.GetPauseWaveform(0))\n\tassert.Equal(t, uint8(0x81), d.GetPauseWaveform(1))\n\tassert.Equal(t, d.GetPauseWaveform(127), d.GetPauseWaveform(128))\n}\n\nfunc TestDRV2605LSequenceTermination(t *testing.T) {\n\td, a := initTestDRV2605LDriverWithStubbedAdaptor()\n\ta.written = []byte{}\n\trequire.NoError(t, d.SetSequence([]byte{1, 2}))\n\tassert.Equal(t, []byte{\n\t\tdrv2605RegWaveSeq1, 1,\n\t\tdrv2605RegWaveSeq2, 2,\n\t\tdrv2605RegWaveSeq3, 0,\n\t}, a.written)\n}\n\nfunc TestDRV2605LSequenceTruncation(t *testing.T) {\n\td, a := initTestDRV2605LDriverWithStubbedAdaptor()\n\ta.written = []byte{}\n\trequire.NoError(t, d.SetSequence([]byte{1, 2, 3, 4, 5, 6, 7, 8, 99, 100}))\n\tassert.Equal(t, []byte{\n\t\tdrv2605RegWaveSeq1, 1,\n\t\tdrv2605RegWaveSeq2, 2,\n\t\tdrv2605RegWaveSeq3, 3,\n\t\tdrv2605RegWaveSeq4, 4,\n\t\tdrv2605RegWaveSeq5, 5,\n\t\tdrv2605RegWaveSeq6, 6,\n\t\tdrv2605RegWaveSeq7, 7,\n\t\tdrv2605RegWaveSeq8, 8,\n\t}, a.written)\n}\n\nfunc TestDRV2605LSetMode(t *testing.T) {\n\td, _ := initTestDRV2605LDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.SetMode(DRV2605ModeIntTrig))\n}\n\nfunc TestDRV2605LSetModeReadError(t *testing.T) {\n\td, a := initTestDRV2605LDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\trequire.ErrorContains(t, d.SetMode(DRV2605ModeIntTrig), \"read error\")\n}\n\nfunc TestDRV2605LSetStandbyMode(t *testing.T) {\n\td, _ := initTestDRV2605LDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.SetStandbyMode(true))\n}\n\nfunc TestDRV2605LSetStandbyModeReadError(t *testing.T) {\n\td, a := initTestDRV2605LDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\trequire.ErrorContains(t, d.SetStandbyMode(true), \"read error\")\n}\n\nfunc TestDRV2605LSelectLibrary(t *testing.T) {\n\td, _ := initTestDRV2605LDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.SelectLibrary(1))\n}\n\nfunc TestDRV2605LGo(t *testing.T) {\n\td, _ := initTestDRV2605LDriverWithStubbedAdaptor()\n\trequire.NoError(t, d.Go())\n}\n"
  },
  {
    "path": "drivers/i2c/generic_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// GenericDriver implements the interface gobot.Driver.\ntype GenericDriver struct {\n\t*Driver\n}\n\n// NewGenericDriver creates a new generic i2c gobot driver, which just forwards all connection functions.\nfunc NewGenericDriver(c Connector, name string, address int, options ...func(Config)) *GenericDriver {\n\treturn &GenericDriver{Driver: NewDriver(c, name, address, options...)}\n}\n\n// WriteByte writes one byte to the i2c device.\nfunc (d *GenericDriver) WriteByte(val byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeByte(val)\n}\n\n// WriteByteData writes the given byte value to the given register of an i2c device.\nfunc (d *GenericDriver) WriteByteData(reg uint8, val byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeByteData(reg, val)\n}\n\n// WriteWordData writes the given 16 bit value to the given register of an i2c device.\nfunc (d *GenericDriver) WriteWordData(reg uint8, val uint16) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeWordData(reg, val)\n}\n\n// WriteBlockData writes the given buffer to the given register of an i2c device.\nfunc (d *GenericDriver) WriteBlockData(reg uint8, data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeBlockData(reg, data)\n}\n\n// WriteData writes the given buffer to the given register of an i2c device.\n// It uses plain write to prevent WriteBlockData(), which is sometimes not supported by adaptor.\nfunc (d *GenericDriver) WriteData(reg uint8, data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tbuf := make([]byte, len(data)+1)\n\tcopy(buf[1:], data)\n\tbuf[0] = reg\n\n\treturn d.writeAndCheckCount(buf)\n}\n\n// Write writes the given buffer to the i2c device.\nfunc (d *GenericDriver) Write(data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeAndCheckCount(data)\n}\n\n// ReadByte reads a byte from the current register of an i2c device.\nfunc (d *GenericDriver) ReadByte() (byte, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.readByte()\n}\n\n// ReadByteData reads a byte from the given register of an i2c device.\nfunc (d *GenericDriver) ReadByteData(reg uint8) (byte, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.readByteData(reg)\n}\n\n// ReadWordData reads a 16 bit value starting from the given register of an i2c device.\nfunc (d *GenericDriver) ReadWordData(reg uint8) (uint16, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.readWordData(reg)\n}\n\n// ReadBlockData fills the given buffer with reads starting from the given register of an i2c device.\nfunc (d *GenericDriver) ReadBlockData(reg uint8, data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.readBlockData(reg, data)\n}\n\n// ReadData fills the given buffer with reads from the given register of an i2c device.\n// It uses plain read to prevent ReadBlockData(), which is sometimes not supported by adaptor.\nfunc (d *GenericDriver) ReadData(reg uint8, data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.writeByte(reg); err != nil {\n\t\treturn err\n\t}\n\n\t// write process needs some time, so wait at least 5ms before read a value\n\t// when decreasing to much, the check below will fail\n\ttime.Sleep(10 * time.Millisecond)\n\n\treturn d.readAndCheckCount(data)\n}\n\n// Read fills the given buffer with reads of an i2c device.\nfunc (d *GenericDriver) Read(data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.readAndCheckCount(data)\n}\n\nfunc (d *GenericDriver) writeAndCheckCount(data []byte) error {\n\tn, err := d.write(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif n != len(data) {\n\t\treturn fmt.Errorf(\"written count (%d) differ from expected (%d)\", n, len(data))\n\t}\n\treturn nil\n}\n\nfunc (d *GenericDriver) readAndCheckCount(data []byte) error {\n\tn, err := d.read(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif n != len(data) {\n\t\treturn fmt.Errorf(\"read count (%d) differ from expected (%d)\", n, len(data))\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/generic_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*GenericDriver)(nil)\n\nfunc TestNewGenericDriver(t *testing.T) {\n\t// arrange\n\ta := newI2cTestAdaptor()\n\t// act\n\tvar di interface{} = NewGenericDriver(a, \"GenericI2C\", 0x17)\n\t// assert\n\td, ok := di.(*GenericDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewGenericDriver() should have returned a *GenericDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GenericI2C\"))\n}\n"
  },
  {
    "path": "drivers/i2c/grove_drivers.go",
    "content": "package i2c\n\n// GroveLcdDriver is a driver for the Jhd1313m1 LCD display which has two i2c addreses,\n// one belongs to a controller and the other controls solely the backlight.\n// This module was tested with the Seed Grove LCD RGB Backlight v2.0 display which requires 5V to operate.\n// http://www.seeedstudio.com/wiki/Grove_-_LCD_RGB_Backlight\ntype GroveLcdDriver struct {\n\t*JHD1313M1Driver\n}\n\n// GroveAccelerometerDriver is a driver for the MMA7660 accelerometer\ntype GroveAccelerometerDriver struct {\n\t*MMA7660Driver\n}\n\n// NewGroveLcdDriver creates a new driver with specified i2c interface.\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewGroveLcdDriver(a Connector, options ...func(Config)) *GroveLcdDriver {\n\tlcd := &GroveLcdDriver{\n\t\tJHD1313M1Driver: NewJHD1313M1Driver(a),\n\t}\n\n\tfor _, option := range options {\n\t\toption(lcd)\n\t}\n\n\treturn lcd\n}\n\n// NewGroveAccelerometerDriver creates a new driver with specified i2c interface\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewGroveAccelerometerDriver(a Connector, options ...func(Config)) *GroveAccelerometerDriver {\n\tmma := &GroveAccelerometerDriver{\n\t\tMMA7660Driver: NewMMA7660Driver(a),\n\t}\n\n\tfor _, option := range options {\n\t\toption(mma)\n\t}\n\n\treturn mma\n}\n"
  },
  {
    "path": "drivers/i2c/grove_drivers_test.go",
    "content": "package i2c\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar (\n\t_ gobot.Driver = (*GroveLcdDriver)(nil)\n\t_ gobot.Driver = (*GroveAccelerometerDriver)(nil)\n)\n\nfunc initTestGroveLcdDriver() *GroveLcdDriver {\n\td, _ := initGroveLcdDriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initGroveLcdDriverWithStubbedAdaptor() (*GroveLcdDriver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewGroveLcdDriver(adaptor), adaptor\n}\n\nfunc initTestGroveAccelerometerDriver() *GroveAccelerometerDriver {\n\td, _ := initGroveAccelerometerDriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initGroveAccelerometerDriverWithStubbedAdaptor() (*GroveAccelerometerDriver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewGroveAccelerometerDriver(adaptor), adaptor\n}\n\nfunc TestGroveLcdDriverName(t *testing.T) {\n\tg := initTestGroveLcdDriver()\n\tassert.NotNil(t, g.Connection())\n\tassert.True(t, strings.HasPrefix(g.Name(), \"JHD1313M1\"))\n}\n\nfunc TestLcdDriverWithAddress(t *testing.T) {\n\tadaptor := newI2cTestAdaptor()\n\tg := NewGroveLcdDriver(adaptor, WithAddress(0x66))\n\tassert.Equal(t, 0x66, g.GetAddressOrDefault(0x33))\n}\n\nfunc TestGroveAccelerometerDriverName(t *testing.T) {\n\tg := initTestGroveAccelerometerDriver()\n\tassert.NotNil(t, g.Connection())\n\tassert.True(t, strings.HasPrefix(g.Name(), \"MMA7660\"))\n}\n\nfunc TestGroveAccelerometerDriverWithAddress(t *testing.T) {\n\tadaptor := newI2cTestAdaptor()\n\tg := NewGroveAccelerometerDriver(adaptor, WithAddress(0x66))\n\tassert.Equal(t, 0x66, g.GetAddressOrDefault(0x33))\n}\n"
  },
  {
    "path": "drivers/i2c/grovepi_driver.go",
    "content": "package i2c\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"math\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// default is for grovepi4 installer\nconst grovePiDefaultAddress = 0x04\n\n// commands, see:\n// * https://www.dexterindustries.com/GrovePi/programming/grovepi-protocol-adding-custom-sensors/\n// * https://github.com/DexterInd/GrovePi/tree/1.3.0/Script/multi_grovepi_installer/grovepi4.py\nconst (\n\tcommandReadDigital         = 1\n\tcommandWriteDigital        = 2\n\tcommandReadAnalog          = 3\n\tcommandWriteAnalog         = 4\n\tcommandSetPinMode          = 5\n\tcommandReadUltrasonic      = 7\n\tcommandReadFirmwareVersion = 8\n\tcommandReadDHT             = 40\n)\n\n// GrovePiDriver is a driver for the GrovePi+ for I²C bus interface.\n// https://www.dexterindustries.com/grovepi/\n//\n// To use this driver with the GrovePi, it must be running the firmware >= 1.4.0 and the system version >=3.\n// https://github.com/DexterInd/GrovePi/tree/1.3.0/README.md\ntype GrovePiDriver struct {\n\t*Driver\n\n\tpins map[int]string\n}\n\n// NewGrovePiDriver creates a new driver with specified i2c interface\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewGrovePiDriver(c Connector, options ...func(Config)) *GrovePiDriver {\n\td := &GrovePiDriver{\n\t\tDriver: NewDriver(c, \"GrovePi\", grovePiDefaultAddress),\n\t\tpins:   make(map[int]string),\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: add commands for API\n\treturn d\n}\n\n// Connect is here to implement the Adaptor interface.\nfunc (d *GrovePiDriver) Connect() error {\n\treturn nil\n}\n\n// Finalize is here to implement the Adaptor interface.\nfunc (d *GrovePiDriver) Finalize() error {\n\treturn nil\n}\n\n// AnalogRead returns value from analog pin implementing the AnalogReader interface.\nfunc (d *GrovePiDriver) AnalogRead(pin string) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tpinNum, err := d.preparePin(pin, \"input\")\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tbuf := []byte{commandReadAnalog, byte(pinNum), 0, 0}\n\tif _, err := d.write(buf); err != nil {\n\t\treturn 0, err\n\t}\n\n\ttime.Sleep(2 * time.Millisecond)\n\n\tdata := make([]byte, 3)\n\tif err = d.readForCommand(commandReadAnalog, data); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(data[1])*256 + int(data[2]), nil\n}\n\n// DigitalRead performs a read on a digital pin.\nfunc (d *GrovePiDriver) DigitalRead(pin string) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tpinNum, err := d.preparePin(pin, \"input\")\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tbuf := []byte{commandReadDigital, byte(pinNum), 0, 0}\n\tif _, err := d.write(buf); err != nil {\n\t\treturn 0, err\n\t}\n\n\ttime.Sleep(2 * time.Millisecond)\n\n\tdata := make([]byte, 2)\n\tif err = d.readForCommand(commandReadDigital, data); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(data[1]), nil\n}\n\n// UltrasonicRead performs a read on an ultrasonic pin with duration >=2 millisecond.\nfunc (d *GrovePiDriver) UltrasonicRead(pin string, duration int) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif duration < 2 {\n\t\tduration = 2\n\t}\n\n\tpinNum, err := d.preparePin(pin, \"input\")\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tbuf := []byte{commandReadUltrasonic, byte(pinNum), 0, 0}\n\tif _, err = d.write(buf); err != nil {\n\t\treturn 0, err\n\t}\n\n\ttime.Sleep(time.Duration(duration) * time.Millisecond)\n\n\tdata := make([]byte, 3)\n\tif err := d.readForCommand(commandReadUltrasonic, data); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(data[1])*255 + int(data[2]), nil\n}\n\n// FirmwareVersionRead returns the GrovePi firmware version.\nfunc (d *GrovePiDriver) FirmwareVersionRead() (string, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tbuf := []byte{commandReadFirmwareVersion, 0, 0, 0}\n\tif _, err := d.write(buf); err != nil {\n\t\treturn \"\", err\n\t}\n\n\ttime.Sleep(2 * time.Millisecond)\n\n\tdata := make([]byte, 4)\n\tif err := d.readForCommand(commandReadFirmwareVersion, data); err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn fmt.Sprintf(\"%v.%v.%v\", data[1], data[2], data[3]), nil\n}\n\n// DHTRead performs a read temperature and humidity sensors with duration >=2 millisecond.\n// DHT11 (blue): sensorType=0\n// DHT22 (white): sensorTyp=1\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *GrovePiDriver) DHTRead(pin string, sensorType byte, duration int) (temp float32, hum float32, err error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif duration < 2 {\n\t\tduration = 2\n\t}\n\n\tpinNum, err := d.preparePin(pin, \"input\")\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\tbuf := []byte{commandReadDHT, byte(pinNum), sensorType, 0}\n\tif _, err = d.write(buf); err != nil {\n\t\treturn 0, 0, err\n\t}\n\ttime.Sleep(time.Duration(duration) * time.Millisecond)\n\n\tdata := make([]byte, 9)\n\tif err = d.readForCommand(commandReadDHT, data); err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\ttemp = float32Of4BytesLittleEndian(data[1:5])\n\tif temp > 150 {\n\t\ttemp = 150\n\t}\n\tif temp < -100 {\n\t\ttemp = -100\n\t}\n\n\thum = float32Of4BytesLittleEndian(data[5:9])\n\tif hum > 100 {\n\t\thum = 100\n\t}\n\tif hum < 0 {\n\t\thum = 0\n\t}\n\n\treturn temp, hum, err\n}\n\n// DigitalWrite writes a value to a specific digital pin implementing the DigitalWriter interface.\nfunc (d *GrovePiDriver) DigitalWrite(pin string, val byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tpinNum, err := d.preparePin(pin, \"output\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbuf := []byte{commandWriteDigital, byte(pinNum), val, 0}\n\tif _, err := d.write(buf); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(2 * time.Millisecond)\n\n\t_, err = d.readByte()\n\treturn err\n}\n\n// AnalogWrite writes PWM aka analog to the GrovePi analog pin implementing the AnalogWriter interface.\nfunc (d *GrovePiDriver) AnalogWrite(pin string, val int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tpinNum, err := d.preparePin(pin, \"output\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbuf := []byte{commandWriteAnalog, byte(pinNum), byte(val), 0}\n\tif _, err := d.write(buf); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(2 * time.Millisecond)\n\n\t_, err = d.readByte()\n\treturn err\n}\n\n// SetPinMode sets the pin mode to input or output.\nfunc (d *GrovePiDriver) SetPinMode(pin byte, mode string) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.setPinMode(pin, mode)\n}\n\nfunc getPin(pin string) string {\n\tif len(pin) > 1 {\n\t\tif strings.ToUpper(pin[0:1]) == \"A\" || strings.ToUpper(pin[0:1]) == \"D\" {\n\t\t\treturn pin[1:]\n\t\t}\n\t}\n\n\treturn pin\n}\n\nfunc (d *GrovePiDriver) setPinMode(pin byte, mode string) error {\n\tvar b []byte\n\tif mode == \"output\" {\n\t\tb = []byte{commandSetPinMode, pin, 1, 0}\n\t} else {\n\t\tb = []byte{commandSetPinMode, pin, 0, 0}\n\t}\n\tif _, err := d.write(b); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(2 * time.Millisecond)\n\n\t_, err := d.readByte()\n\treturn err\n}\n\nfunc (d *GrovePiDriver) ensurePinMode(pinNum int, mode string) error {\n\tif dir, ok := d.pins[pinNum]; !ok || dir != mode {\n\t\tif err := d.setPinMode(byte(pinNum), mode); err != nil {\n\t\t\treturn err\n\t\t}\n\t\td.pins[pinNum] = mode\n\t}\n\treturn nil\n}\n\nfunc (d *GrovePiDriver) preparePin(pin string, mode string) (int, error) {\n\tpin = getPin(pin)\n\tpinNum, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\tif err := d.ensurePinMode(pinNum, mode); err != nil {\n\t\treturn -1, err\n\t}\n\n\treturn pinNum, nil\n}\n\nfunc (d *GrovePiDriver) readForCommand(command byte, data []byte) error {\n\tcnt, err := d.read(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(data) != cnt {\n\t\treturn fmt.Errorf(\"read count mismatch (%d should be %d)\", cnt, len(data))\n\t}\n\tif data[0] != command {\n\t\treturn fmt.Errorf(\"answer (%d) was not for command (%d)\", data[0], command)\n\t}\n\treturn nil\n}\n\nfunc float32Of4BytesLittleEndian(bytes []byte) float32 {\n\tbits := binary.LittleEndian.Uint32(bytes)\n\tfloat := math.Float32frombits(bits)\n\treturn float\n}\n"
  },
  {
    "path": "drivers/i2c/grovepi_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*GrovePiDriver)(nil)\n\n// must implement the DigitalReader interface\nvar _ gpio.DigitalReader = (*GrovePiDriver)(nil)\n\n// must implement the DigitalWriter interface\nvar _ gpio.DigitalWriter = (*GrovePiDriver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*GrovePiDriver)(nil)\n\n// must implement the AnalogWriter interface\nvar _ aio.AnalogWriter = (*GrovePiDriver)(nil)\n\n// must implement the Adaptor interface\nvar _ gobot.Adaptor = (*GrovePiDriver)(nil)\n\nfunc initGrovePiDriverWithStubbedAdaptor() (*GrovePiDriver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewGrovePiDriver(adaptor), adaptor\n}\n\nfunc TestNewGrovePiDriver(t *testing.T) {\n\tvar di interface{} = NewGrovePiDriver(newI2cTestAdaptor())\n\td, ok := di.(*GrovePiDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewGrovePiDriver() should have returned a *GrovePiDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"GrovePi\"))\n\tassert.Equal(t, 0x04, d.defaultAddress)\n\tassert.NotNil(t, d.pins)\n}\n\nfunc TestGrovePiOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewGrovePiDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestGrovePiSomeRead(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tusedPin          int\n\t\twantWritten      []uint8\n\t\tsimResponse      [][]uint8\n\t\twantErr          error\n\t\twantCallsRead    int\n\t\twantResult       int\n\t\twantResultF1     float32\n\t\twantResultF2     float32\n\t\twantResultString string\n\t}{\n\t\t\"DigitalRead\": {\n\t\t\tusedPin:       2,\n\t\t\twantWritten:   []uint8{commandSetPinMode, 2, 0, 0, commandReadDigital, 2, 0, 0},\n\t\t\tsimResponse:   [][]uint8{{0}, {commandReadDigital, 3}},\n\t\t\twantCallsRead: 2,\n\t\t\twantResult:    3,\n\t\t},\n\t\t\"AnalogRead\": {\n\t\t\tusedPin:     3,\n\t\t\twantWritten: []uint8{commandSetPinMode, 3, 0, 0, commandReadAnalog, 3, 0, 0},\n\t\t\tsimResponse: [][]uint8{{0}, {commandReadAnalog, 4, 5}},\n\t\t\twantResult:  1029,\n\t\t},\n\t\t\"UltrasonicRead\": {\n\t\t\tusedPin:     4,\n\t\t\twantWritten: []uint8{commandSetPinMode, 4, 0, 0, commandReadUltrasonic, 4, 0, 0},\n\t\t\tsimResponse: [][]uint8{{0}, {commandReadUltrasonic, 5, 6}},\n\t\t\twantResult:  1281,\n\t\t},\n\t\t\"FirmwareVersionRead\": {\n\t\t\twantWritten:      []uint8{commandReadFirmwareVersion, 0, 0, 0},\n\t\t\tsimResponse:      [][]uint8{{commandReadFirmwareVersion, 7, 8, 9}},\n\t\t\twantResultString: \"7.8.9\",\n\t\t},\n\t\t\"DHTRead\": {\n\t\t\tusedPin:      5,\n\t\t\twantWritten:  []uint8{commandSetPinMode, 5, 0, 0, commandReadDHT, 5, 1, 0},\n\t\t\tsimResponse:  [][]uint8{{0}, {commandReadDHT, 164, 112, 69, 193, 20, 174, 54, 66}},\n\t\t\twantResultF1: -12.34,\n\t\t\twantResultF2: 45.67,\n\t\t},\n\t\t\"DigitalRead_error_wrong_return_cmd\": {\n\t\t\tusedPin:     15,\n\t\t\twantWritten: []uint8{commandSetPinMode, 15, 0, 0, commandReadDigital, 15, 0, 0},\n\t\t\tsimResponse: [][]uint8{{0}, {0, 2}},\n\t\t\twantErr:     fmt.Errorf(\"answer (0) was not for command (1)\"),\n\t\t},\n\t\t\"AnalogRead_error_wrong_return_cmd\": {\n\t\t\tusedPin:     16,\n\t\t\twantWritten: []uint8{commandSetPinMode, 16, 0, 0, commandReadAnalog, 16, 0, 0},\n\t\t\tsimResponse: [][]uint8{{0}, {0, 3, 4}},\n\t\t\twantErr:     fmt.Errorf(\"answer (0) was not for command (3)\"),\n\t\t},\n\t\t\"UltrasonicRead_error_wrong_return_cmd\": {\n\t\t\tusedPin:     17,\n\t\t\twantWritten: []uint8{commandSetPinMode, 17, 0, 0, commandReadUltrasonic, 17, 0, 0},\n\t\t\tsimResponse: [][]uint8{{0}, {0, 5, 6}},\n\t\t\twantErr:     fmt.Errorf(\"answer (0) was not for command (7)\"),\n\t\t},\n\t\t\"FirmwareVersionRead_error_wrong_return_cmd\": {\n\t\t\twantWritten: []uint8{commandReadFirmwareVersion, 0, 0, 0},\n\t\t\tsimResponse: [][]uint8{{0, 7, 8, 9}},\n\t\t\twantErr:     fmt.Errorf(\"answer (0) was not for command (8)\"),\n\t\t},\n\t\t\"DHTRead_error_wrong_return_cmd\": {\n\t\t\tusedPin:     18,\n\t\t\twantWritten: []uint8{commandSetPinMode, 18, 0, 0, commandReadDHT, 18, 1, 0},\n\t\t\tsimResponse: [][]uint8{{0}, {0, 164, 112, 69, 193, 20, 174, 54, 66}},\n\t\t\twantErr:     fmt.Errorf(\"answer (0) was not for command (40)\"),\n\t\t},\n\t\t\"DigitalRead_error_wrong_data_count\": {\n\t\t\tusedPin:     28,\n\t\t\twantWritten: []uint8{commandSetPinMode, 28, 0, 0, commandReadDigital, 28, 0, 0},\n\t\t\tsimResponse: [][]uint8{{0}, {commandReadDigital, 2, 3}},\n\t\t\twantErr:     fmt.Errorf(\"read count mismatch (3 should be 2)\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tg, a := initGrovePiDriverWithStubbedAdaptor()\n\t\t\t_ = g.Start()\n\t\t\ta.written = []byte{} // reset writes of former test and start\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(bytes []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tcopy(bytes, tc.simResponse[numCallsRead-1])\n\t\t\t\treturn len(tc.simResponse[numCallsRead-1]), nil\n\t\t\t}\n\t\t\tvar got int\n\t\t\tvar gotF1, gotF2 float32\n\t\t\tvar gotString string\n\t\t\tvar err error\n\t\t\t// act\n\t\t\tswitch {\n\t\t\tcase strings.Contains(name, \"DigitalRead\"):\n\t\t\t\tgot, err = g.DigitalRead(strconv.Itoa(tc.usedPin))\n\t\t\tcase strings.Contains(name, \"AnalogRead\"):\n\t\t\t\tgot, err = g.AnalogRead(strconv.Itoa(tc.usedPin))\n\t\t\tcase strings.Contains(name, \"UltrasonicRead\"):\n\t\t\t\tgot, err = g.UltrasonicRead(strconv.Itoa(tc.usedPin), 2)\n\t\t\tcase strings.Contains(name, \"FirmwareVersionRead\"):\n\t\t\t\tgotString, err = g.FirmwareVersionRead()\n\t\t\tcase strings.Contains(name, \"DHTRead\"):\n\t\t\t\tgotF1, gotF2, err = g.DHTRead(strconv.Itoa(tc.usedPin), 1, 2)\n\t\t\tdefault:\n\t\t\t\trequire.Fail(t, \"unknown command \"+name)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t\tassert.Len(t, tc.simResponse, numCallsRead)\n\t\t\tassert.Equal(t, tc.wantResult, got)\n\t\t\tassert.InDelta(t, tc.wantResultF1, gotF1, 0.0)\n\t\t\tassert.InDelta(t, tc.wantResultF2, gotF2, 0.0)\n\t\t\tassert.Equal(t, tc.wantResultString, gotString)\n\t\t})\n\t}\n}\n\nfunc TestGrovePiSomeWrite(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tusedPin     int\n\t\tusedValue   int\n\t\twantWritten []uint8\n\t\tsimResponse []uint8\n\t}{\n\t\t\"DigitalWrite\": {\n\t\t\tusedPin:     2,\n\t\t\tusedValue:   3,\n\t\t\twantWritten: []uint8{commandSetPinMode, 2, 1, 0, commandWriteDigital, 2, 3, 0},\n\t\t\tsimResponse: []uint8{4},\n\t\t},\n\t\t\"AnalogWrite\": {\n\t\t\tusedPin:     5,\n\t\t\tusedValue:   6,\n\t\t\twantWritten: []uint8{commandSetPinMode, 5, 1, 0, commandWriteAnalog, 5, 6, 0},\n\t\t\tsimResponse: []uint8{7},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tg, a := initGrovePiDriverWithStubbedAdaptor()\n\t\t\t_ = g.Start()\n\t\t\ta.written = []byte{} // reset writes of former test and start\n\t\t\ta.i2cReadImpl = func(bytes []byte) (int, error) {\n\t\t\t\tcopy(bytes, tc.simResponse)\n\t\t\t\treturn len(bytes), nil\n\t\t\t}\n\t\t\tvar err error\n\t\t\t// act\n\t\t\tswitch name {\n\t\t\tcase \"DigitalWrite\":\n\t\t\t\terr = g.DigitalWrite(strconv.Itoa(tc.usedPin), byte(tc.usedValue))\n\t\t\tcase \"AnalogWrite\":\n\t\t\t\terr = g.AnalogWrite(strconv.Itoa(tc.usedPin), tc.usedValue)\n\t\t\tdefault:\n\t\t\t\trequire.Fail(t, \"unknown command \"+name)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestGrovePi_getPin(t *testing.T) {\n\tassert.Equal(t, \"1\", getPin(\"a1\"))\n\tassert.Equal(t, \"16\", getPin(\"A16\"))\n\tassert.Equal(t, \"3\", getPin(\"D3\"))\n\tassert.Equal(t, \"22\", getPin(\"d22\"))\n\tassert.Equal(t, \"22\", getPin(\"22\"))\n}\n"
  },
  {
    "path": "drivers/i2c/helpers_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n)\n\nvar rgb = map[string]interface{}{\n\t\"red\":   1.0,\n\t\"green\": 1.0,\n\t\"blue\":  1.0,\n}\n\ntype i2cTestAdaptor struct {\n\tname          string\n\tbus           int\n\taddress       int\n\twritten       []byte\n\tmtx           sync.Mutex\n\ti2cConnectErr bool\n\ti2cReadImpl   func([]byte) (int, error)\n\ti2cWriteImpl  func([]byte) (int, error)\n}\n\nfunc (t *i2cTestAdaptor) Testi2cConnectErr(val bool) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tt.i2cConnectErr = val\n}\n\nfunc (t *i2cTestAdaptor) Testi2cReadImpl(f func([]byte) (int, error)) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tt.i2cReadImpl = f\n}\n\nfunc (t *i2cTestAdaptor) Testi2cWriteImpl(f func([]byte) (int, error)) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tt.i2cWriteImpl = f\n}\n\nfunc (t *i2cTestAdaptor) Read(b []byte) (int, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.i2cReadImpl(b)\n}\n\nfunc (t *i2cTestAdaptor) Write(b []byte) (int, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tt.written = append(t.written, b...)\n\treturn t.i2cWriteImpl(b)\n}\n\nfunc (t *i2cTestAdaptor) Close() error {\n\treturn nil\n}\n\nfunc (t *i2cTestAdaptor) ReadByte() (byte, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tbytes := []byte{0}\n\tif err := t.readBytes(bytes); err != nil {\n\t\treturn 0, err\n\t}\n\tval := bytes[0]\n\n\treturn val, nil\n}\n\nfunc (t *i2cTestAdaptor) ReadByteData(reg uint8) (uint8, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tif err := t.writeBytes([]byte{reg}); err != nil {\n\t\treturn 0, err\n\t}\n\tbytes := []byte{0}\n\tif err := t.readBytes(bytes); err != nil {\n\t\treturn 0, err\n\t}\n\tval := bytes[0]\n\n\treturn val, nil\n}\n\nfunc (t *i2cTestAdaptor) ReadWordData(reg uint8) (uint16, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tif err := t.writeBytes([]byte{reg}); err != nil {\n\t\treturn 0, err\n\t}\n\tbytes := []byte{0, 0}\n\tbytesRead, err := t.i2cReadImpl(bytes)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif bytesRead != 2 {\n\t\treturn 0, fmt.Errorf(\"buffer underrun\")\n\t}\n\tlow, high := bytes[0], bytes[1]\n\n\treturn (uint16(high) << 8) | uint16(low), nil\n}\n\nfunc (t *i2cTestAdaptor) ReadBlockData(reg uint8, b []byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tif err := t.writeBytes([]byte{reg}); err != nil {\n\t\treturn err\n\t}\n\n\treturn t.readBytes(b)\n}\n\nfunc (t *i2cTestAdaptor) WriteByte(val byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.writeBytes([]byte{val})\n}\n\nfunc (t *i2cTestAdaptor) WriteByteData(reg uint8, val uint8) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tbytes := []byte{reg, val}\n\n\treturn t.writeBytes(bytes)\n}\n\nfunc (t *i2cTestAdaptor) WriteWordData(reg uint8, val uint16) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tlow := uint8(val & 0xff)         //nolint:gosec // ok here\n\thigh := uint8((val >> 8) & 0xff) //nolint:gosec // ok here\n\tbytes := []byte{reg, low, high}\n\n\treturn t.writeBytes(bytes)\n}\n\nfunc (t *i2cTestAdaptor) WriteBlockData(reg uint8, b []byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tif len(b) > 32 {\n\t\tb = b[:32]\n\t}\n\tbuf := make([]byte, len(b)+1)\n\tcopy(buf[1:], b)\n\tbuf[0] = reg\n\n\treturn t.writeBytes(buf)\n}\n\nfunc (t *i2cTestAdaptor) WriteBytes(b []byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\tif len(b) > 32 {\n\t\tb = b[:32]\n\t}\n\n\treturn t.writeBytes(b)\n}\n\nfunc (t *i2cTestAdaptor) GetI2cConnection(address int, bus int) (Connection, error) {\n\tif t.i2cConnectErr {\n\t\treturn nil, errors.New(\"invalid i2c connection\")\n\t}\n\tt.bus = bus\n\tt.address = address\n\n\treturn t, nil\n}\n\nfunc (t *i2cTestAdaptor) DefaultI2cBus() int {\n\treturn 0\n}\n\nfunc (t *i2cTestAdaptor) Name() string     { return t.name }\nfunc (t *i2cTestAdaptor) SetName(n string) { t.name = n }\nfunc (t *i2cTestAdaptor) Connect() error   { return nil }\nfunc (t *i2cTestAdaptor) Finalize() error  { return nil }\n\nfunc newI2cTestAdaptor() *i2cTestAdaptor {\n\treturn &i2cTestAdaptor{\n\t\ti2cConnectErr: false,\n\t\ti2cReadImpl: func(b []byte) (int, error) {\n\t\t\treturn len(b), nil\n\t\t},\n\t\ti2cWriteImpl: func(b []byte) (int, error) {\n\t\t\treturn len(b), nil\n\t\t},\n\t}\n}\n\nfunc (t *i2cTestAdaptor) readBytes(b []byte) error {\n\tn, err := t.i2cReadImpl(b)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif n != len(b) {\n\t\treturn fmt.Errorf(\"read %v bytes from device by i2c helpers, expected %v\", n, len(b))\n\t}\n\n\treturn nil\n}\n\nfunc (t *i2cTestAdaptor) writeBytes(b []byte) error {\n\tt.written = append(t.written, b...)\n\t// evaluation of count can be done in test\n\t_, err := t.i2cWriteImpl(b)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/hmc5883l_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"math\"\n\t\"sort\"\n)\n\nconst (\n\thmc5883lDebug          = false\n\thmc5883lDefaultAddress = 0x1E // default I2C Address\n)\n\nconst (\n\thmc5883lRegA      = 0x00 // Address of Configuration register A\n\thmc5883lRegB      = 0x01 // Address of Configuration register B\n\thmc5883lRegMode   = 0x02 // Address of node register\n\thmc5883lAxisX     = 0x03 // Address of X-axis MSB data register\n\thmc5883lAxisZ     = 0x05 // Address of Z-axis MSB data register\n\thmc5883lAxisY     = 0x07 // Address of Y-axis MSB data register\n\thmc5883lRegStatus = 0x09 // Address of status register\n\thmc5883lRegIdA    = 0x0A // Address of identification register A\n\thmc5883lRegIdB    = 0x0B // Address of identification register B\n\thmc5883lRegIdC    = 0x0C // Address of identification register C\n\n\thmc5883lRegA_SamplesAvg1      = 0x00 // no samples averaged\n\thmc5883lRegA_SamplesAvg2      = 0x01 // 2 samples averaged\n\thmc5883lRegA_SamplesAvg4      = 0x02 // 4 samples averaged\n\thmc5883lRegA_SamplesAvg8      = 0x03 // 8 samples averaged\n\thmc5883lRegA_OutputRate750    = 0x00 // data output rate 0.75 Hz\n\thmc5883lRegA_OutputRate1500   = 0x01 // data output rate 1.5 Hz\n\thmc5883lRegA_OutputRate3000   = 0x02 // data output rate 3.0 Hz\n\thmc5883lRegA_OutputRate7500   = 0x03 // data output rate 7.5 Hz\n\thmc5883lRegA_OutputRate15000  = 0x04 // data output rate 15.0 Hz\n\thmc5883lRegA_OutputRate30000  = 0x05 // data output rate 30.0 Hz\n\thmc5883lRegA_OutputRate75000  = 0x06 // data output rate 75.0 Hz\n\thmc5883lRegA_MeasNormal       = 0x00 // normal measurement configuration\n\thmc5883lRegA_MeasPositiveBias = 0x01 // positive bias for X, Y, Z\n\thmc5883lRegA_MeasNegativeBias = 0x02 // negative bias for X, Y, Z\n\n\thmc5883lRegB_Gain1370 = 0x00 // gain is 1370 Gauss\n\thmc5883lRegB_Gain1090 = 0x01 // gain is 1090 Gauss\n\thmc5883lRegB_Gain820  = 0x02 // gain is 820 Gauss\n\thmc5883lRegB_Gain660  = 0x03 // gain is 660 Gauss\n\thmc5883lRegB_Gain440  = 0x04 // gain is 440 Gauss\n\thmc5883lRegB_Gain390  = 0x05 // gain is 390 Gauss\n\thmc5883lRegB_Gain330  = 0x06 // gain is 330 Gauss\n\thmc5883lRegB_Gain230  = 0x07 // gain is 230 Gauss\n\n\thmc5883lRegM_Continuous = 0x00 // continuous measurement mode\n\thmc5883lRegM_Single     = 0x01 // return to idle after a single measurement\n\thmc5883lRegM_Idle       = 0x10 // idle mode\n)\n\n// HMC5883LDriver is a Gobot Driver for a HMC5883 I2C 3 axis digital compass.\n//\n// This driver was tested with Tinkerboard & Digispark adaptor and a HMC5883L breakout board GY-273,\n// available from various distributors.\n//\n// datasheet:\n// http://www.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf\n//\n// reference implementations:\n// * https://github.com/gvalkov/micropython-esp8266-hmc5883l\n// * https://github.com/adafruit/Adafruit_HMC5883_Unified\ntype HMC5883LDriver struct {\n\t*Driver\n\n\tsamplesAvg      uint8\n\toutputRate      uint32 // in mHz\n\tapplyBias       int8\n\tmeasurementMode int\n\tgain            float64 // in 1/Gauss\n}\n\nvar hmc5883lSamplesAvgBits = map[uint8]int{\n\t1: hmc5883lRegA_SamplesAvg1,\n\t2: hmc5883lRegA_SamplesAvg2,\n\t4: hmc5883lRegA_SamplesAvg4,\n\t8: hmc5883lRegA_SamplesAvg8,\n}\n\nvar hmc5883lOutputRateBits = map[uint32]int{\n\t750:   hmc5883lRegA_OutputRate750,\n\t1500:  hmc5883lRegA_OutputRate1500,\n\t3000:  hmc5883lRegA_OutputRate3000,\n\t7500:  hmc5883lRegA_OutputRate7500,\n\t15000: hmc5883lRegA_OutputRate15000,\n\t30000: hmc5883lRegA_OutputRate30000,\n\t75000: hmc5883lRegA_OutputRate75000,\n}\n\nvar hmc5883lMeasurementFlowBits = map[int8]int{\n\t0:  hmc5883lRegA_MeasNormal,\n\t1:  hmc5883lRegA_MeasPositiveBias,\n\t-1: hmc5883lRegA_MeasNegativeBias,\n}\n\nvar hmc5883lGainBits = map[float64]int{\n\t1370.0: hmc5883lRegB_Gain1370,\n\t1090.0: hmc5883lRegB_Gain1090,\n\t820.0:  hmc5883lRegB_Gain820,\n\t660.0:  hmc5883lRegB_Gain660,\n\t440.0:  hmc5883lRegB_Gain440,\n\t390.0:  hmc5883lRegB_Gain390,\n\t330.0:  hmc5883lRegB_Gain330,\n\t230.0:  hmc5883lRegB_Gain230,\n}\n\n// NewHMC5883LDriver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t\t\ti2c.WithBus(int):\tbus to use with this driver\n//\t\t\ti2c.WithAddress(int):\taddress to use with this driver\n//\t   i2c.WithHMC5883LSamplesAveraged(int)\n//\t   i2c.WithHMC5883LDataOutputRate(int)\n//\t   i2c.WithHMC5883LMeasurementFlow(int)\n//\t   i2c.WithHMC5883LGain(int)\nfunc NewHMC5883LDriver(c Connector, options ...func(Config)) *HMC5883LDriver {\n\td := &HMC5883LDriver{\n\t\tDriver:          NewDriver(c, \"HMC5883L\", hmc5883lDefaultAddress),\n\t\tsamplesAvg:      8,\n\t\toutputRate:      15000,\n\t\tapplyBias:       0,\n\t\tmeasurementMode: hmc5883lRegM_Continuous,\n\t\tgain:            390,\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// WithHMC5883LSamplesAveraged option sets the number of samples averaged per measurement.\n// Valid settings are 1, 2, 4, 8.\nfunc WithHMC5883LSamplesAveraged(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*HMC5883LDriver)\n\t\tif ok {\n\t\t\tif err := hmc5883lValidateSamplesAveraged(val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.samplesAvg = uint8(val) //nolint:gosec // TODO: fix later\n\t\t} else if hmc5883lDebug {\n\t\t\tlog.Printf(\"Trying to set samples averaged for non-HMC5883LDriver %v\", c)\n\t\t}\n\t}\n}\n\n// WithHMC5883LDataOutputRate option sets the data output rate in mHz.\n// Valid settings are 750, 1500, 3000, 7500, 15000, 30000, 75000.\nfunc WithHMC5883LDataOutputRate(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*HMC5883LDriver)\n\t\tif ok {\n\t\t\tif err := hmc5883lValidateOutputRate(val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.outputRate = uint32(val) //nolint:gosec // TODO: fix later\n\t\t} else if hmc5883lDebug {\n\t\t\tlog.Printf(\"Trying to set data output rate for non-HMC5883LDriver %v\", c)\n\t\t}\n\t}\n}\n\n// WithHMC5883LApplyBias option sets to apply a measurement bias.\n// Valid settings are -1 (negative bias), 0 (normal), 1 (positive bias).\nfunc WithHMC5883LApplyBias(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*HMC5883LDriver)\n\t\tif ok {\n\t\t\tif err := hmc5883lValidateApplyBias(val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.applyBias = int8(val) //nolint:gosec // TODO: fix later\n\t\t} else if hmc5883lDebug {\n\t\t\tlog.Printf(\"Trying to set measurement flow for non-HMC5883LDriver %v\", c)\n\t\t}\n\t}\n}\n\n// WithHMC5883LGain option sets the gain.\n// Valid settings are 1370, 1090, 820, 660, 440, 390, 330 230 in 1/Gauss.\nfunc WithHMC5883LGain(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*HMC5883LDriver)\n\t\tif ok {\n\t\t\tif err := hmc5883lValidateGain(val); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\td.gain = float64(val)\n\t\t} else if hmc5883lDebug {\n\t\t\tlog.Printf(\"Trying to set gain for non-HMC5883LDriver %v\", c)\n\t\t}\n\t}\n}\n\n// Read reads the values X, Y, Z in Gauss\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *HMC5883LDriver) Read() (x float64, y float64, z float64, err error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\txr, yr, zr, err := d.readRawData()\n\tif err != nil {\n\t\treturn\n\t}\n\treturn float64(xr) / d.gain, float64(yr) / d.gain, float64(zr) / d.gain, nil\n}\n\n// Heading returns the current heading in radians\nfunc (d *HMC5883LDriver) Heading() (float64, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tx, y, _, err := d.readRawData()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\theading := math.Atan2(float64(y), float64(x))\n\tif heading > 2*math.Pi {\n\t\theading -= 2 * math.Pi\n\t}\n\tif heading < 0 {\n\t\theading += 2 * math.Pi\n\t}\n\treturn heading, nil\n}\n\n// readRawData reads the raw values from the X, Y, and Z registers\n//\n//nolint:nonamedreturns // sufficient here\nfunc (d *HMC5883LDriver) readRawData() (x int16, y int16, z int16, err error) {\n\t// read the data, starting from the initial register\n\tdata := make([]byte, 6)\n\tif err = d.readBlockData(hmc5883lAxisX, data); err != nil {\n\t\treturn\n\t}\n\n\tunsignedX := (uint16(data[0]) << 8) | uint16(data[1])\n\tunsignedZ := (uint16(data[2]) << 8) | uint16(data[3])\n\tunsignedY := (uint16(data[4]) << 8) | uint16(data[5])\n\n\treturn twosComplement16Bit(unsignedX), twosComplement16Bit(unsignedY), twosComplement16Bit(unsignedZ), nil\n}\n\nfunc (d *HMC5883LDriver) initialize() error {\n\tregA := hmc5883lMeasurementFlowBits[d.applyBias]\n\tregA |= hmc5883lOutputRateBits[d.outputRate] << 2\n\tregA |= hmc5883lSamplesAvgBits[d.samplesAvg] << 5\n\t//nolint:gosec // TODO: fix later\n\tif err := d.writeByteData(hmc5883lRegA, uint8(regA)); err != nil {\n\t\treturn err\n\t}\n\tregB := hmc5883lGainBits[d.gain] << 5\n\t//nolint:gosec // TODO: fix later\n\tif err := d.writeByteData(hmc5883lRegB, uint8(regB)); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\treturn d.writeByteData(hmc5883lRegMode, uint8(d.measurementMode))\n}\n\nfunc hmc5883lValidateSamplesAveraged(samplesAvg int) error {\n\t//nolint:gosec // TODO: fix later\n\tif _, ok := hmc5883lSamplesAvgBits[uint8(samplesAvg)]; ok {\n\t\treturn nil\n\t}\n\n\tkeys := []int{}\n\tfor k := range hmc5883lSamplesAvgBits {\n\t\tkeys = append(keys, int(k))\n\t}\n\tsort.Ints(keys)\n\n\treturn fmt.Errorf(\"samples averaged must be one of: %d\", keys)\n}\n\nfunc hmc5883lValidateOutputRate(outputRate int) error {\n\t//nolint:gosec // TODO: fix later\n\tif _, ok := hmc5883lOutputRateBits[uint32(outputRate)]; ok {\n\t\treturn nil\n\t}\n\n\tkeys := []int{}\n\tfor k := range hmc5883lOutputRateBits {\n\t\tkeys = append(keys, int(k))\n\t}\n\tsort.Ints(keys)\n\n\treturn fmt.Errorf(\"data output rate must be one of: %d\", keys)\n}\n\nfunc hmc5883lValidateApplyBias(applyBias int) error {\n\t//nolint:gosec // TODO: fix later\n\tif _, ok := hmc5883lMeasurementFlowBits[int8(applyBias)]; ok {\n\t\treturn nil\n\t}\n\n\tkeys := []int{}\n\tfor k := range hmc5883lMeasurementFlowBits {\n\t\tkeys = append(keys, int(k))\n\t}\n\tsort.Ints(keys)\n\n\treturn fmt.Errorf(\"apply measurement bias must be one of: %d\", keys)\n}\n\nfunc hmc5883lValidateGain(gain int) error {\n\tif _, ok := hmc5883lGainBits[float64(gain)]; ok {\n\t\treturn nil\n\t}\n\n\tkeys := []int{}\n\tfor k := range hmc5883lGainBits {\n\t\tkeys = append(keys, int(k))\n\t}\n\tsort.Ints(keys)\n\n\treturn fmt.Errorf(\"gain must be one of: %d\", keys)\n}\n"
  },
  {
    "path": "drivers/i2c/hmc5883l_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*HMC5883LDriver)(nil)\n\nfunc initTestHMC5883LWithStubbedAdaptor() (*HMC5883LDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\treturn NewHMC5883LDriver(a), a\n}\n\nfunc TestNewHMC5883LDriver(t *testing.T) {\n\tvar di interface{} = NewHMC5883LDriver(newI2cTestAdaptor())\n\td, ok := di.(*HMC5883LDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewHMC5883LDriver() should have returned a *HMC5883LDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.name, \"HMC5883L\"))\n\tassert.Equal(t, 0x1E, d.defaultAddress)\n\tassert.Equal(t, uint8(8), d.samplesAvg)\n\tassert.Equal(t, uint32(15000), d.outputRate)\n\tassert.Equal(t, int8(0), d.applyBias)\n\tassert.Equal(t, 0, d.measurementMode)\n\tassert.InDelta(t, 390.0, d.gain, 0.0)\n}\n\nfunc TestHMC5883LHalt(t *testing.T) {\n\t// arrange\n\td := NewHMC5883LDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestHMC5883LOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewHMC5883LDriver(newI2cTestAdaptor(), WithBus(2), WithHMC5883LSamplesAveraged(4))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, uint8(4), d.samplesAvg)\n}\n\nfunc TestHMC5883LWithHMC5883LDataOutputRate(t *testing.T) {\n\td := NewHMC5883LDriver(newI2cTestAdaptor())\n\tWithHMC5883LDataOutputRate(7500)(d)\n\tassert.Equal(t, uint32(7500), d.outputRate)\n}\n\nfunc TestHMC5883LWithHMC5883LApplyBias(t *testing.T) {\n\td := NewHMC5883LDriver(newI2cTestAdaptor())\n\tWithHMC5883LApplyBias(-1)(d)\n\tassert.Equal(t, int8(-1), d.applyBias)\n}\n\nfunc TestHMC5883LWithHMC5883LGain(t *testing.T) {\n\td := NewHMC5883LDriver(newI2cTestAdaptor())\n\tWithHMC5883LGain(230)(d)\n\tassert.InDelta(t, 230.0, d.gain, 0.0)\n}\n\nfunc TestHMC5883LRead(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tinputX []uint8\n\t\tinputY []uint8\n\t\tinputZ []uint8\n\t\tgain   float64\n\t\twantX  float64\n\t\twantY  float64\n\t\twantZ  float64\n\t}{\n\t\t\"+FS_0_-FS_resolution_0.73mG\": {\n\t\t\tinputX: []uint8{0x07, 0xFF},\n\t\t\tinputY: []uint8{0x00, 0x00},\n\t\t\tinputZ: []uint8{0xF8, 0x00},\n\t\t\tgain:   1370,\n\t\t\twantX:  2047.0 / 1370,\n\t\t\twantY:  0,\n\t\t\twantZ:  -2048.0 / 1370,\n\t\t},\n\t\t\"+1_-4096_-1_resolution_0.73mG\": {\n\t\t\tinputX: []uint8{0x00, 0x01},\n\t\t\tinputY: []uint8{0xF0, 0x00},\n\t\t\tinputZ: []uint8{0xFF, 0xFF},\n\t\t\tgain:   1370,\n\t\t\twantX:  1.0 / 1370,\n\t\t\twantY:  -4096.0 / 1370,\n\t\t\twantZ:  -1.0 / 1370,\n\t\t},\n\t\t\"+FS_0_-FS_resolution_4.35mG\": {\n\t\t\tinputX: []uint8{0x07, 0xFF},\n\t\t\tinputY: []uint8{0x00, 0x00},\n\t\t\tinputZ: []uint8{0xF8, 0x00},\n\t\t\tgain:   230,\n\t\t\twantX:  2047.0 / 230,\n\t\t\twantY:  0,\n\t\t\twantZ:  -2048.0 / 230,\n\t\t},\n\t\t\"-1_+1_-4096_resolution_4.35mG\": {\n\t\t\tinputX: []uint8{0xFF, 0xFF},\n\t\t\tinputY: []uint8{0x00, 0x01},\n\t\t\tinputZ: []uint8{0xF0, 0x00},\n\t\t\tgain:   230,\n\t\t\twantX:  -1.0 / 230,\n\t\t\twantY:  1.0 / 230,\n\t\t\twantZ:  -4096.0 / 230,\n\t\t},\n\t}\n\ta := newI2cTestAdaptor()\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\td := NewHMC5883LDriver(a, WithHMC5883LGain(int(tc.gain)))\n\t\t\t_ = d.Start()\n\t\t\t// arrange reads\n\t\t\treturnRead := append(append(tc.inputX, tc.inputZ...), tc.inputY...)\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tcopy(b, returnRead)\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgotX, gotY, gotZ, err := d.Read()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.InDelta(t, tc.wantX, gotX, 0.0)\n\t\t\tassert.InDelta(t, tc.wantY, gotY, 0.0)\n\t\t\tassert.InDelta(t, tc.wantZ, gotZ, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestHMC5883L_readRawData(t *testing.T) {\n\t// sequence to read:\n\t// * prepare read, see test of Start()\n\t// * read data output registers (3 x 16 bit, MSByte first)\n\t// * apply two's complement converter\n\t//\n\t// arrange\n\ttests := map[string]struct {\n\t\tinputX []uint8\n\t\tinputY []uint8\n\t\tinputZ []uint8\n\t\twantX  int16\n\t\twantY  int16\n\t\twantZ  int16\n\t}{\n\t\t\"+FS_0_-FS\": {\n\t\t\tinputX: []uint8{0x07, 0xFF},\n\t\t\tinputY: []uint8{0x00, 0x00},\n\t\t\tinputZ: []uint8{0xF8, 0x00},\n\t\t\twantX:  (1<<11 - 1),\n\t\t\twantY:  0,\n\t\t\twantZ:  -(1 << 11),\n\t\t},\n\t\t\"-4096_-1_+1\": {\n\t\t\tinputX: []uint8{0xF0, 0x00},\n\t\t\tinputY: []uint8{0xFF, 0xFF},\n\t\t\tinputZ: []uint8{0x00, 0x01},\n\t\t\twantX:  -4096,\n\t\t\twantY:  -1,\n\t\t\twantZ:  1,\n\t\t},\n\t}\n\td, a := initTestHMC5883LWithStubbedAdaptor()\n\t_ = d.Start()\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\ta.written = []byte{} // reset writes of former test and start\n\t\t\t// arrange reads\n\t\t\treturnRead := append(append(tc.inputX, tc.inputZ...), tc.inputY...)\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tcopy(b, returnRead)\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgotX, gotY, gotZ, err := d.readRawData()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantX, gotX)\n\t\t\tassert.Equal(t, tc.wantY, gotY)\n\t\t\tassert.Equal(t, tc.wantZ, gotZ)\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, uint8(hmc5883lAxisX), a.written[0])\n\t\t})\n\t}\n}\n\nfunc TestHMC5883L_initialize(t *testing.T) {\n\t// sequence to prepare read in Start():\n\t// * prepare config register A content (samples averaged, data output rate, measurement mode)\n\t// * prepare config register B content (gain)\n\t// * prepare mode register (continuous/single/idle)\n\t// * write registers A, B, mode\n\t// arrange\n\td, a := initTestHMC5883LWithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\twantRegA := uint8(0x70)\n\twantRegB := uint8(0xA0)\n\twantRegM := uint8(0x00)\n\t// act, assert - initialize() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 6)\n\tassert.Equal(t, uint8(hmc5883lRegA), a.written[0])\n\tassert.Equal(t, wantRegA, a.written[1])\n\tassert.Equal(t, uint8(hmc5883lRegB), a.written[2])\n\tassert.Equal(t, wantRegB, a.written[3])\n\tassert.Equal(t, uint8(hmc5883lRegMode), a.written[4])\n\tassert.Equal(t, wantRegM, a.written[5])\n}\n"
  },
  {
    "path": "drivers/i2c/hmc6352_driver.go",
    "content": "package i2c\n\nconst hmc6352DefaultAddress = 0x21\n\n// HMC6352Driver is a Driver for a HMC6352 digital compass\ntype HMC6352Driver struct {\n\t*Driver\n}\n\n// NewHMC6352Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewHMC6352Driver(c Connector, options ...func(Config)) *HMC6352Driver {\n\td := &HMC6352Driver{\n\t\tDriver: NewDriver(c, \"HMC6352\", hmc6352DefaultAddress),\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// Heading returns the current heading\nfunc (d *HMC6352Driver) Heading() (uint16, error) {\n\tif _, err := d.write([]byte(\"A\")); err != nil {\n\t\treturn 0, err\n\t}\n\tbuf := []byte{0, 0}\n\tbytesRead, err := d.read(buf)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif bytesRead == 2 {\n\t\theading := (uint16(buf[1]) + uint16(buf[0])*256) / 10\n\t\treturn heading, nil\n\t}\n\n\treturn 0, ErrNotEnoughBytes\n}\n\nfunc (d *HMC6352Driver) initialize() error {\n\tif _, err := d.write([]byte(\"A\")); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/hmc6352_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*HMC6352Driver)(nil)\n\nfunc initTestHMC6352DriverWithStubbedAdaptor() (*HMC6352Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewHMC6352Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewHMC6352Driver(t *testing.T) {\n\tvar di interface{} = NewHMC6352Driver(newI2cTestAdaptor())\n\td, ok := di.(*HMC6352Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewHMC6352Driver() should have returned a *HMC6352Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"HMC6352\"))\n\tassert.Equal(t, 0x21, d.defaultAddress)\n}\n\nfunc TestHMC6352Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewHMC6352Driver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestHMC6352Start(t *testing.T) {\n\td := NewHMC6352Driver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestHMC6352Halt(t *testing.T) {\n\t// arrange\n\td := NewHMC6352Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestHMC6352Heading(t *testing.T) {\n\t// when len(data) is 2\n\td, a := initTestHMC6352DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99, 1})\n\t\treturn 2, nil\n\t}\n\n\theading, _ := d.Heading()\n\tassert.Equal(t, uint16(2534), heading)\n\n\t// when len(data) is not 2\n\td, a = initTestHMC6352DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{99})\n\t\treturn 1, nil\n\t}\n\n\theading, err := d.Heading()\n\tassert.Equal(t, uint16(0), heading)\n\tassert.Equal(t, ErrNotEnoughBytes, err)\n\n\t// when read error\n\td, a = initTestHMC6352DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\theading, err = d.Heading()\n\tassert.Equal(t, uint16(0), heading)\n\trequire.ErrorContains(t, err, \"read error\")\n\n\t// when write error\n\td, a = initTestHMC6352DriverWithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\theading, err = d.Heading()\n\tassert.Equal(t, uint16(0), heading)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n"
  },
  {
    "path": "drivers/i2c/i2c_config.go",
    "content": "package i2c\n\ntype i2cConfig struct {\n\tbus     int\n\taddress int\n}\n\n// NewConfig returns a new I2c Config.\nfunc NewConfig() Config {\n\treturn &i2cConfig{bus: BusNotInitialized, address: AddressNotInitialized}\n}\n\n// WithBus sets which bus to use as a optional param.\nfunc WithBus(bus int) func(Config) {\n\treturn func(i Config) {\n\t\ti.SetBus(bus)\n\t}\n}\n\n// WithAddress sets which address to use as a optional param.\nfunc WithAddress(address int) func(Config) {\n\treturn func(i Config) {\n\t\ti.SetAddress(address)\n\t}\n}\n\n// SetBus sets preferred bus to use.\nfunc (i *i2cConfig) SetBus(bus int) {\n\ti.bus = bus\n}\n\n// GetBusOrDefault returns which bus to use, either the one set using WithBus(),\n// or the default value which is passed in as the one param.\nfunc (i *i2cConfig) GetBusOrDefault(d int) int {\n\tif i.bus == BusNotInitialized {\n\t\treturn d\n\t}\n\n\treturn i.bus\n}\n\n// SetAddress sets which address to use.\nfunc (i *i2cConfig) SetAddress(address int) {\n\ti.address = address\n}\n\n// GetAddressOrDefault returns which address to use, either\n// the one set using WithBus(), or the default value which\n// is passed in as the param.\nfunc (i *i2cConfig) GetAddressOrDefault(a int) int {\n\tif i.address == AddressNotInitialized {\n\t\treturn a\n\t}\n\n\treturn i.address\n}\n"
  },
  {
    "path": "drivers/i2c/i2c_config_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage i2c\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestNewConfig(t *testing.T) {\n\t// arrange, act\n\tci := NewConfig()\n\t// assert\n\tc, ok := ci.(*i2cConfig)\n\tif !ok {\n\t\trequire.Fail(t, \"NewConfig() should have returned a *i2cConfig\")\n\t}\n\tassert.Equal(t, BusNotInitialized, c.bus)\n\tassert.Equal(t, AddressNotInitialized, c.address)\n}\n\nfunc TestWithBus(t *testing.T) {\n\t// arrange\n\tc := NewConfig()\n\t// act\n\tc.SetBus(0x23)\n\t// assert\n\tassert.Equal(t, 0x23, c.(*i2cConfig).bus)\n}\n\nfunc TestWithAddress(t *testing.T) {\n\t// arrange\n\tc := NewConfig()\n\t// act\n\tc.SetAddress(0x24)\n\t// assert\n\tassert.Equal(t, 0x24, c.(*i2cConfig).address)\n}\n\nfunc TestGetBusOrDefaultWithBusOption(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinit int\n\t\tbus  int\n\t\twant int\n\t}{\n\t\t\"not_initialized\": {init: -1, bus: 0x25, want: 0x25},\n\t\t\"initialized\":     {init: 0x26, bus: 0x27, want: 0x26},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tc := NewConfig()\n\t\t\t// act\n\t\t\tWithBus(tc.init)(c)\n\t\t\tgot := c.GetBusOrDefault(tc.bus)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestGetAddressOrDefaultWithAddressOption(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinit    int\n\t\taddress int\n\t\twant    int\n\t}{\n\t\t\"not_initialized\": {init: -1, address: 0x28, want: 0x28},\n\t\t\"initialized\":     {init: 0x29, address: 0x2A, want: 0x29},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tc := NewConfig()\n\t\t\t// act\n\t\t\tWithAddress(tc.init)(c)\n\t\t\tgot := c.GetAddressOrDefault(tc.address)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/i2c_connection.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// Error event\n\tError = \"error\"\n)\n\nconst (\n\t// BusNotInitialized is the initial value for a bus\n\tBusNotInitialized = -1\n\n\t// AddressNotInitialized is the initial value for an address\n\tAddressNotInitialized = -1\n)\n\nvar (\n\t// ErrNotEnoughBytes is used when the count of read bytes was too small\n\tErrNotEnoughBytes = fmt.Errorf(\"not enough bytes read\")\n\t// ErrNotReady is used when the device is not ready\n\tErrNotReady = fmt.Errorf(\"device is not ready\")\n)\n\ntype bitState uint8\n\nconst (\n\tclearBit bitState = 0x00\n\tsetBit   bitState = 0x01\n)\n\n// Connection is a connection to an I2C device with a specified address\n// on a specific bus. Used as an alternative to the I2c interface.\n// Implements I2cOperations to talk to the device, wrapping the\n// calls in SetAddress to always target the specified device.\n// Provided by an Adaptor by implementing the I2cConnector interface.\ntype Connection gobot.I2cOperations\n\ntype i2cConnection struct {\n\tbus     gobot.I2cSystemDevicer\n\taddress int\n}\n\n// NewConnection creates and returns a new connection to a specific i2c device on a bus and address.\nfunc NewConnection(bus gobot.I2cSystemDevicer, address int) *i2cConnection {\n\treturn &i2cConnection{bus: bus, address: address}\n}\n\n// Read data from an i2c device.\nfunc (c *i2cConnection) Read(data []byte) (int, error) {\n\treturn c.bus.Read(c.address, data)\n}\n\n// Write data to an i2c device.\nfunc (c *i2cConnection) Write(data []byte) (int, error) {\n\treturn c.bus.Write(c.address, data)\n}\n\n// Close connection to i2c device. The bus was created by adaptor and will be closed there.\nfunc (c *i2cConnection) Close() error {\n\treturn nil\n}\n\n// ReadByte reads a single byte from the i2c device.\nfunc (c *i2cConnection) ReadByte() (byte, error) {\n\treturn c.bus.ReadByte(c.address)\n}\n\n// ReadByteData reads a byte value for a register on the i2c device.\nfunc (c *i2cConnection) ReadByteData(reg uint8) (uint8, error) {\n\treturn c.bus.ReadByteData(c.address, reg)\n}\n\n// ReadWordData reads a word value for a register on the i2c device.\nfunc (c *i2cConnection) ReadWordData(reg uint8) (uint16, error) {\n\treturn c.bus.ReadWordData(c.address, reg)\n}\n\n// ReadBlockData reads a block of bytes from a register on the i2c device.\nfunc (c *i2cConnection) ReadBlockData(reg uint8, b []byte) error {\n\treturn c.bus.ReadBlockData(c.address, reg, b)\n}\n\n// WriteByte writes a single byte to the i2c device.\nfunc (c *i2cConnection) WriteByte(val byte) error {\n\treturn c.bus.WriteByte(c.address, val)\n}\n\n// WriteByteData writes a byte value to a register on the i2c device.\nfunc (c *i2cConnection) WriteByteData(reg uint8, val uint8) error {\n\treturn c.bus.WriteByteData(c.address, reg, val)\n}\n\n// WriteWordData writes a word value to a register on the i2c device.\nfunc (c *i2cConnection) WriteWordData(reg uint8, val uint16) error {\n\treturn c.bus.WriteWordData(c.address, reg, val)\n}\n\n// WriteBlockData writes a block of bytes to a register on the i2c device.\nfunc (c *i2cConnection) WriteBlockData(reg uint8, b []byte) error {\n\treturn c.bus.WriteBlockData(c.address, reg, b)\n}\n\n// WriteBytes writes a block of bytes to the current register on the i2c device.\nfunc (c *i2cConnection) WriteBytes(b []byte) error {\n\treturn c.bus.WriteBytes(c.address, b)\n}\n\nfunc twosComplement16Bit(uValue uint16) int16 {\n\tresult := int32(uValue)\n\tif result&0x8000 != 0 {\n\t\tresult -= 1 << 16\n\t}\n\treturn int16(result) //nolint:gosec // ok here\n}\n\nfunc swapBytes(value uint16) uint16 {\n\treturn (value << 8) | (value >> 8)\n}\n"
  },
  {
    "path": "drivers/i2c/i2c_connection_test.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage i2c\n\nimport (\n\t\"testing\"\n\t\"unsafe\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst dev = \"/dev/i2c-1\"\n\nfunc getSyscallFuncImpl(\n\terrorMask byte,\n) func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err system.SyscallErrno) {\n\t// bit 0: error on function query\n\t// bit 1: error on set address\n\t// bit 2: error on command\n\t//nolint:nonamedreturns // is sufficient here\n\treturn func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err system.SyscallErrno) {\n\t\t// function query\n\t\tif (trap == system.Syscall_SYS_IOCTL) && (a2 == system.I2C_FUNCS) {\n\t\t\tif errorMask&0x01 == 0x01 {\n\t\t\t\treturn 0, 0, 1\n\t\t\t}\n\n\t\t\tfuncPtr := (*uint64)(a3)\n\t\t\t*funcPtr = system.I2C_FUNC_SMBUS_READ_BYTE | system.I2C_FUNC_SMBUS_READ_BYTE_DATA |\n\t\t\t\tsystem.I2C_FUNC_SMBUS_READ_WORD_DATA |\n\t\t\t\tsystem.I2C_FUNC_SMBUS_WRITE_BYTE | system.I2C_FUNC_SMBUS_WRITE_BYTE_DATA |\n\t\t\t\tsystem.I2C_FUNC_SMBUS_WRITE_WORD_DATA\n\t\t}\n\t\t// set address\n\t\tif (trap == system.Syscall_SYS_IOCTL) && (a2 == system.I2C_TARGET) {\n\t\t\tif errorMask&0x02 == 0x02 {\n\t\t\t\treturn 0, 0, 1\n\t\t\t}\n\t\t}\n\t\t// command\n\t\tif (trap == system.Syscall_SYS_IOCTL) && (a2 == system.I2C_SMBUS) {\n\t\t\tif errorMask&0x04 == 0x04 {\n\t\t\t\treturn 0, 0, 1\n\t\t\t}\n\t\t}\n\t\t// Let all operations succeed\n\t\treturn 0, 0, 0\n\t}\n}\n\nfunc initI2CDevice() gobot.I2cSystemDevicer {\n\ta := system.NewAccesser()\n\ta.UseMockFilesystem([]string{dev})\n\tmsc := a.UseMockSyscall()\n\tmsc.Impl = getSyscallFuncImpl(0x00)\n\n\td, _ := a.NewI2cDevice(dev)\n\treturn d\n}\n\nfunc initI2CDeviceAddressError() gobot.I2cSystemDevicer {\n\ta := system.NewAccesser()\n\ta.UseMockFilesystem([]string{dev})\n\tmsc := a.UseMockSyscall()\n\tmsc.Impl = getSyscallFuncImpl(0x02)\n\n\td, _ := a.NewI2cDevice(dev)\n\treturn d\n}\n\nfunc TestI2CAddress(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x66)\n\tassert.Equal(t, 0x66, c.address)\n}\n\nfunc TestI2CClose(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\trequire.NoError(t, c.Close())\n}\n\nfunc TestI2CRead(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\ti, _ := c.Read([]byte{})\n\tassert.Equal(t, 0, i)\n}\n\nfunc TestI2CReadAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\t_, err := c.Read([]byte{})\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CWrite(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\ti, _ := c.Write([]byte{0x01})\n\tassert.Equal(t, 1, i)\n}\n\nfunc TestI2CWriteAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\t_, err := c.Write([]byte{0x01})\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CReadByte(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\tv, _ := c.ReadByte()\n\tassert.Equal(t, uint8(0xFC), v)\n}\n\nfunc TestI2CReadByteAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\t_, err := c.ReadByte()\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CReadByteData(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\tv, _ := c.ReadByteData(0x01)\n\tassert.Equal(t, uint8(0xFD), v)\n}\n\nfunc TestI2CReadByteDataAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\t_, err := c.ReadByteData(0x01)\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CReadWordData(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\tv, _ := c.ReadWordData(0x01)\n\tassert.Equal(t, uint16(0xFFFE), v)\n}\n\nfunc TestI2CReadWordDataAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\t_, err := c.ReadWordData(0x01)\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CWriteByte(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\terr := c.WriteByte(0x01)\n\trequire.NoError(t, err)\n}\n\nfunc TestI2CWriteByteAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\terr := c.WriteByte(0x01)\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CWriteByteData(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\terr := c.WriteByteData(0x01, 0x01)\n\trequire.NoError(t, err)\n}\n\nfunc TestI2CWriteByteDataAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\terr := c.WriteByteData(0x01, 0x01)\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CWriteWordData(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\terr := c.WriteWordData(0x01, 0x01)\n\trequire.NoError(t, err)\n}\n\nfunc TestI2CWriteWordDataAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\terr := c.WriteWordData(0x01, 0x01)\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n\nfunc TestI2CWriteBlockData(t *testing.T) {\n\tc := NewConnection(initI2CDevice(), 0x06)\n\terr := c.WriteBlockData(0x01, []byte{0x01, 0x02})\n\trequire.NoError(t, err)\n}\n\nfunc TestI2CWriteBlockDataAddressError(t *testing.T) {\n\tc := NewConnection(initI2CDeviceAddressError(), 0x06)\n\terr := c.WriteBlockData(0x01, []byte{0x01, 0x02})\n\trequire.ErrorContains(t, err, \"Setting address failed with syscall.Errno operation not permitted\")\n}\n"
  },
  {
    "path": "drivers/i2c/i2c_driver.go",
    "content": "package i2c\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"log\"\n\t\"strconv\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Config is the interface to set and get I2C device related parameters.\ntype Config interface {\n\t// SetBus sets which bus to use\n\tSetBus(bus int)\n\n\t// GetBusOrDefault gets which bus to use\n\tGetBusOrDefault(def int) int\n\n\t// SetAddress sets which address to use\n\tSetAddress(address int)\n\n\t// GetAddressOrDefault gets which address to use\n\tGetAddressOrDefault(def int) int\n}\n\n// Connector lets adaptors (platforms) provide the interface for Drivers to get access to the I2C buses on platforms\n// that support I2C. The \"I2C\" specifier is part of the name to differentiate to SPI at platform level.\ntype Connector interface {\n\t// GetI2cConnection creates and returns a connection to device at the specified address\n\t// and bus. Bus numbering starts at index 0, the range of valid buses is\n\t// platform specific.\n\tGetI2cConnection(address int, busNr int) (device Connection, err error)\n\n\t// DefaultI2cBus returns the default I2C bus index\n\tDefaultI2cBus() int\n}\n\n// Driver implements the interface gobot.Driver.\ntype Driver struct {\n\tConfig\n\tgobot.Commander\n\n\tname           string\n\tdefaultAddress int\n\tconnector      Connector\n\tconnection     Connection\n\tafterStart     func() error\n\tbeforeHalt     func() error\n\tmutex          *sync.Mutex // mutex often needed to ensure that write-read sequences are not interrupted\n}\n\n// NewDriver creates a new generic and basic i2c gobot driver.\nfunc NewDriver(c Connector, name string, address int, options ...func(Config)) *Driver {\n\td := &Driver{\n\t\tname:           gobot.DefaultName(name),\n\t\tdefaultAddress: address,\n\t\tconnector:      c,\n\t\tafterStart:     func() error { return nil },\n\t\tbeforeHalt:     func() error { return nil },\n\t\tConfig:         NewConfig(),\n\t\tCommander:      gobot.NewCommander(),\n\t\tmutex:          &sync.Mutex{},\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// Name returns the name of the i2c device.\nfunc (d *Driver) Name() string {\n\treturn d.name\n}\n\n// SetName sets the name of the i2c device.\nfunc (d *Driver) SetName(name string) {\n\td.name = name\n}\n\n// Connection returns the gobot connection of the i2c device.\nfunc (d *Driver) Connection() gobot.Connection {\n\tif d.connector == nil {\n\t\tlog.Printf(\"%s has no connector\\n\", d.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connector.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.name)\n\treturn nil\n}\n\n// Start initializes the i2c device.\nfunc (d *Driver) Start() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif d.connector == nil {\n\t\treturn fmt.Errorf(\"%s has no connector\", d.name)\n\t}\n\n\tvar err error\n\tbus := d.GetBusOrDefault(d.connector.DefaultI2cBus())\n\taddress := d.GetAddressOrDefault(d.defaultAddress)\n\n\tif d.connection, err = d.connector.GetI2cConnection(address, bus); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.afterStart()\n}\n\n// Halt halts the i2c device.\nfunc (d *Driver) Halt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.beforeHalt(); err != nil {\n\t\treturn err\n\t}\n\n\td.connection = nil\n\n\treturn nil\n}\n\n// Write implements a simple write mechanism, starting from the given register of an i2c device.\nfunc (d *Driver) Write(pin string, val int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\tregister, err := driverParseRegister(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif val > 0xFFFF {\n\t\tbuf := make([]byte, 4)\n\t\tbinary.LittleEndian.PutUint32(buf, uint32(val)) //nolint:gosec // ok here\n\t\treturn d.connection.WriteBlockData(register, buf)\n\t}\n\tif val > 0xFF {\n\t\treturn d.connection.WriteWordData(register, uint16(val))\n\t}\n\treturn d.connection.WriteByteData(register, uint8(val)) //nolint:gosec // ok here\n}\n\n// Read implements a simple read mechanism from the given register of an i2c device.\nfunc (d *Driver) Read(pin string) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\tregister, err := driverParseRegister(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tval, err := d.connection.ReadByteData(register)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(val), nil\n}\n\nfunc (d *Driver) write(data []byte) (int, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.Write(data)\n}\n\nfunc (d *Driver) writeByte(val byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteByte(val)\n}\n\nfunc (d *Driver) writeByteData(reg uint8, val byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteByteData(reg, val)\n}\n\nfunc (d *Driver) writeWordData(reg uint8, val uint16) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteWordData(reg, val)\n}\n\nfunc (d *Driver) writeBlockData(reg uint8, data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteBlockData(reg, data)\n}\n\nfunc (d *Driver) read(data []byte) (int, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.Read(data)\n}\n\nfunc (d *Driver) readByte() (byte, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.ReadByte()\n}\n\nfunc (d *Driver) readByteData(reg uint8) (byte, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.ReadByteData(reg)\n}\n\nfunc (d *Driver) readWordData(reg uint8) (uint16, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.ReadWordData(reg)\n}\n\nfunc (d *Driver) readBlockData(reg uint8, data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"i2c driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.ReadBlockData(reg, data)\n}\n\nfunc driverParseRegister(pin string) (uint8, error) {\n\tregister, err := strconv.ParseUint(pin, 10, 8)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"could not parse the register from given pin '%s'\", pin)\n\t}\n\treturn uint8(register), nil\n}\n"
  },
  {
    "path": "drivers/i2c/i2c_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initDriverWithStubbedAdaptor() (*Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewDriver(a, \"I2C_BASIC\", 0x15)\n\treturn d, a\n}\n\nfunc initTestDriver() *Driver {\n\td, _ := initDriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc TestNewDriver(t *testing.T) {\n\t// arrange\n\ta := newI2cTestAdaptor()\n\t// act\n\tvar di interface{} = NewDriver(a, \"I2C_BASIC\", 0x15)\n\t// assert\n\td, ok := di.(*Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewDriver() should have returned a *Driver\")\n\t}\n\tassert.Contains(t, d.name, \"I2C_BASIC\")\n\tassert.Equal(t, 0x15, d.defaultAddress)\n\tassert.Equal(t, a, d.connector)\n\tassert.Nil(t, d.connection)\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Config)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n}\n\nfunc TestSetName(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act\n\td.SetName(\"TESTME\")\n\t// assert\n\tassert.Equal(t, \"TESTME\", d.Name())\n}\n\nfunc TestConnection(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\tassert.NotNil(t, d.Connection())\n}\n\nfunc TestStart(t *testing.T) {\n\t// arrange\n\td, a := initDriverWithStubbedAdaptor()\n\t// act, assert\n\trequire.NoError(t, d.Start())\n\tassert.Equal(t, 0x15, a.address)\n}\n\nfunc TestStartConnectError(t *testing.T) {\n\t// arrange\n\td, a := initDriverWithStubbedAdaptor()\n\ta.Testi2cConnectErr(true)\n\t// act, assert\n\trequire.ErrorContains(t, d.Start(), \"invalid i2c connection\")\n}\n\nfunc TestHalt(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestWrite(t *testing.T) {\n\t// arrange\n\tconst (\n\t\taddress     = \"82\"\n\t\twantAddress = uint8(0x52)\n\t\tvalue       = 0x25\n\t)\n\td, a := initDriverWithStubbedAdaptor()\n\t_ = d.Start()\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// act\n\terr := d.Write(address, value)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Equal(t, wantAddress, a.written[0])\n\tassert.Equal(t, uint8(value), a.written[1])\n}\n\nfunc TestRead(t *testing.T) {\n\t// arrange\n\tconst (\n\t\taddress     = \"83\"\n\t\twantAddress = uint8(0x53)\n\t\twant        = uint8(0x44)\n\t)\n\td, a := initDriverWithStubbedAdaptor()\n\t_ = d.Start()\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// prepare all reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[0] = want\n\t\treturn len(b), nil\n\t}\n\t// act\n\tval, err := d.Read(address)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, int(want), val)\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Equal(t, wantAddress, a.written[0])\n\tassert.Equal(t, 1, numCallsRead)\n}\n"
  },
  {
    "path": "drivers/i2c/ina3221_driver.go",
    "content": "package i2c\n\n// INA3221Driver is a driver for the Texas Instruments INA3221 device. The INA3221 is a three-channel\n// current and bus voltage monitor with an I2C and SMBUS compatible interface.\n//\n// INA3221 data sheet and specifications can be found at http://www.td.com/product/INA3221\n//\n// This module was tested with SwitchDoc Labs INA3221 breakout board found at http://www.switchdoc.com/\n\n// INA3221Channel type that defines which INA3221 channel to read from.\ntype INA3221Channel uint8\n\nconst (\n\tina3221DefaultAddress             = 0x40 // 1000000 (A0+A1=GND)\n\tina3221Read               uint8   = 0x01\n\tina3221RegConfig          uint8   = 0x00   // CONFIG REGISTER (R/W)\n\tina3221ConfigReset        uint16  = 0x8000 // Reset Bit\n\tina3221ConfigEnableChan1  uint16  = 0x4000 // Enable INA3221 Channel 1\n\tina3221ConfigEnableChan2  uint16  = 0x2000 // Enable INA3221 Channel 2\n\tina3221ConfigEnableChan3  uint16  = 0x1000 // Enable INA3221 Channel 3\n\tina3221ConfigAvg2         uint16  = 0x0800 // AVG Samples Bit 2 - See table 3 spec\n\tina3221ConfigAvg1         uint16  = 0x0400 // AVG Samples Bit 1 - See table 3 spec\n\tina3221ConfigAvg0         uint16  = 0x0200 // AVG Samples Bit 0 - See table 3 spec\n\tina3221ConfigVBusCT2      uint16  = 0x0100 // VBUS bit 2 Conversion time - See table 4 spec\n\tina3221ConfigVBusCT1      uint16  = 0x0080 // VBUS bit 1 Conversion time - See table 4 spec\n\tina3221ConfigVBusCT0      uint16  = 0x0040 // VBUS bit 0 Conversion time - See table 4 spec\n\tina3221ConfigVShCT2       uint16  = 0x0020 // Vshunt bit 2 Conversion time - See table 5 spec\n\tina3221ConfigVShCT1       uint16  = 0x0010 // Vshunt bit 1 Conversion time - See table 5 spec\n\tina3221ConfigVShCT0       uint16  = 0x0008 // Vshunt bit 0 Conversion time - See table 5 spec\n\tina3221ConfigMode2        uint16  = 0x0004 // Operating Mode bit 2 - See table 6 spec\n\tina3221ConfigMode1        uint16  = 0x0002 // Operating Mode bit 1 - See table 6 spec\n\tina3221ConfigMode0        uint16  = 0x0001 // Operating Mode bit 0 - See table 6 spec\n\tina3221RegShuntVoltage1   uint8   = 0x01   // SHUNT VOLTAGE REGISTER (R)\n\tina3221RegBusVoltage1     uint8   = 0x02   // BUS VOLTAGE REGISTER (R)\n\tina3221ShuntResistorValue float64 = 0.1    // default shunt resistor value of 0.1 Ohm\n\n\tINA3221Channel1 INA3221Channel = 1\n\tINA3221Channel2 INA3221Channel = 2\n\tINA3221Channel3 INA3221Channel = 3\n)\n\n// INA3221Driver is a driver for the INA3221 three-channel current and bus voltage monitoring device.\ntype INA3221Driver struct {\n\t*Driver\n}\n\n// NewINA3221Driver creates a new driver with the specified i2c interface.\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\t\tbus to use with this driver\n//\ti2c.WithAddress(int):\t\taddress to use with this driver\nfunc NewINA3221Driver(c Connector, options ...func(Config)) *INA3221Driver {\n\td := &INA3221Driver{\n\t\tDriver: NewDriver(c, \"INA3221\", ina3221DefaultAddress),\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// GetBusVoltage gets the bus voltage in Volts\nfunc (d *INA3221Driver) GetBusVoltage(channel INA3221Channel) (float64, error) {\n\tvalue, err := d.getBusVoltageRaw(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn float64(value) * .001, nil\n}\n\n// GetShuntVoltage Gets the shunt voltage in mV\nfunc (d *INA3221Driver) GetShuntVoltage(channel INA3221Channel) (float64, error) {\n\tvalue, err := d.getShuntVoltageRaw(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn float64(value) * float64(.005), nil\n}\n\n// GetCurrent gets the current value in mA, taking into account the config settings and current LSB\nfunc (d *INA3221Driver) GetCurrent(channel INA3221Channel) (float64, error) {\n\tvalue, err := d.GetShuntVoltage(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tma := value / ina3221ShuntResistorValue\n\treturn ma, nil\n}\n\n// GetLoadVoltage gets the load voltage in mV\nfunc (d *INA3221Driver) GetLoadVoltage(channel INA3221Channel) (float64, error) {\n\tbv, err := d.GetBusVoltage(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tsv, err := d.GetShuntVoltage(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn bv + (sv / 1000.0), nil\n}\n\n// getBusVoltageRaw gets the raw bus voltage (16-bit signed integer, so +-32767)\nfunc (d *INA3221Driver) getBusVoltageRaw(channel INA3221Channel) (int16, error) {\n\tval, err := d.readWordFromRegister(ina3221RegBusVoltage1 + (uint8(channel)-1)*2)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvalue := int32(val)\n\tif value > 0x7FFF {\n\t\tvalue -= 0x10000\n\t}\n\n\treturn int16(value), nil //nolint:gosec // TODO: fix later\n}\n\n// getShuntVoltageRaw gets the raw shunt voltage (16-bit signed integer, so +-32767)\nfunc (d *INA3221Driver) getShuntVoltageRaw(channel INA3221Channel) (int16, error) {\n\tval, err := d.readWordFromRegister(ina3221RegShuntVoltage1 + (uint8(channel)-1)*2)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvalue := int32(val)\n\tif value > 0x7FFF {\n\t\tvalue -= 0x10000\n\t}\n\n\treturn int16(value), nil //nolint:gosec // TODO: fix later\n}\n\n// reads word from supplied register address\nfunc (d *INA3221Driver) readWordFromRegister(reg uint8) (uint16, error) {\n\tval, err := d.readWordData(reg)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn ((val & 0x00FF) << 8) | ((val & 0xFF00) >> 8), nil\n}\n\n// initialize initializes the INA3221 device\nfunc (d *INA3221Driver) initialize() error {\n\tconfig := ina3221ConfigEnableChan1 |\n\t\tina3221ConfigEnableChan2 |\n\t\tina3221ConfigEnableChan3 |\n\t\tina3221ConfigAvg1 |\n\t\tina3221ConfigVBusCT2 |\n\t\tina3221ConfigVShCT2 |\n\t\tina3221ConfigMode2 |\n\t\tina3221ConfigMode1 |\n\t\tina3221ConfigMode0\n\n\treturn d.writeBlockData(ina3221RegConfig, []byte{byte(config >> 8), byte(config & 0x00FF)})\n}\n"
  },
  {
    "path": "drivers/i2c/ina3221_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*INA3221Driver)(nil)\n\nfunc initTestINA3221DriverWithStubbedAdaptor() (*INA3221Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewINA3221Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewINA3221Driver(t *testing.T) {\n\tvar di interface{} = NewINA3221Driver(newI2cTestAdaptor())\n\td, ok := di.(*INA3221Driver)\n\tif !ok {\n\t\tt.Error(\"NewINA3221Driver() should return a *INA3221Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"INA3221\"))\n\tassert.Equal(t, 0x40, d.defaultAddress)\n}\n\nfunc TestINA3221Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewINA3221Driver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestINA3221Start(t *testing.T) {\n\td := NewINA3221Driver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestINA3221Halt(t *testing.T) {\n\t// arrange\n\td := NewINA3221Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestINA3221GetBusVoltage(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t// bus voltage sensor values from 12V battery\n\t\tcopy(b, []byte{0x36, 0x68})\n\t\treturn 2, nil\n\t}\n\n\tv, err := d.GetBusVoltage(INA3221Channel1)\n\tassert.InDelta(t, float64(13.928), v, 0.0)\n\trequire.NoError(t, err)\n}\n\nfunc TestINA3221GetBusVoltageReadError(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_, err := d.GetBusVoltage(INA3221Channel1)\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestINA3221GetShuntVoltage(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t// shunt voltage sensor values from 12V battery\n\t\tcopy(b, []byte{0x05, 0xD8})\n\t\treturn 2, nil\n\t}\n\n\tv, err := d.GetShuntVoltage(INA3221Channel1)\n\tassert.InDelta(t, float64(7.48), v, 0.0)\n\trequire.NoError(t, err)\n}\n\nfunc TestINA3221GetShuntVoltageReadError(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_, err := d.GetShuntVoltage(INA3221Channel1)\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestINA3221GetCurrent(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t// shunt voltage sensor values from 12V battery\n\t\tcopy(b, []byte{0x05, 0x0D8})\n\t\treturn 2, nil\n\t}\n\n\tv, err := d.GetCurrent(INA3221Channel1)\n\tassert.InDelta(t, float64(74.8), v, 0.0)\n\trequire.NoError(t, err)\n}\n\nfunc TestINA3221CurrentReadError(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_, err := d.GetCurrent(INA3221Channel1)\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestINA3221GetLoadVoltage(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ti := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t// TODO: return test data as read from actual sensor\n\t\tcopy(b, []byte{0x36, 0x68, 0x05, 0xd8}[i:i+2])\n\t\ti += 2\n\t\treturn 2, nil\n\t}\n\n\tv, err := d.GetLoadVoltage(INA3221Channel2)\n\tassert.InDelta(t, float64(13.935480), v, 0.0)\n\trequire.NoError(t, err)\n}\n\nfunc TestINA3221GetLoadVoltageReadError(t *testing.T) {\n\td, a := initTestINA3221DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_, err := d.GetLoadVoltage(INA3221Channel2)\n\trequire.ErrorContains(t, err, \"read error\")\n}\n"
  },
  {
    "path": "drivers/i2c/jhd1313m1_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\tREG_RED   = 0x04\n\tREG_GREEN = 0x03\n\tREG_BLUE  = 0x02\n\n\tLCD_CLEARDISPLAY        = 0x01\n\tLCD_RETURNHOME          = 0x02\n\tLCD_ENTRYMODESET        = 0x04\n\tLCD_DISPLAYCONTROL      = 0x08\n\tLCD_CURSORSHIFT         = 0x10\n\tLCD_FUNCTIONSET         = 0x20\n\tLCD_SETCGRAMADDR        = 0x40\n\tLCD_SETDDRAMADDR        = 0x80\n\tLCD_ENTRYRIGHT          = 0x00\n\tLCD_ENTRYLEFT           = 0x02\n\tLCD_ENTRYSHIFTINCREMENT = 0x01\n\tLCD_ENTRYSHIFTDECREMENT = 0x00\n\tLCD_DISPLAYON           = 0x04\n\tLCD_DISPLAYOFF          = 0x00\n\tLCD_CURSORON            = 0x02\n\tLCD_CURSOROFF           = 0x00\n\tLCD_BLINKON             = 0x01\n\tLCD_BLINKOFF            = 0x00\n\tLCD_DISPLAYMOVE         = 0x08\n\tLCD_CURSORMOVE          = 0x00\n\tLCD_MOVERIGHT           = 0x04\n\tLCD_MOVELEFT            = 0x00\n\tLCD_2LINE               = 0x08\n\tLCD_CMD                 = 0x80\n\tLCD_DATA                = 0x40\n\n\tLCD_2NDLINEOFFSET = 0x40\n)\n\n// CustomLCDChars is a map of CGRAM characters that can be loaded\n// into a LCD screen to display custom characters. Some LCD screens such\n// as the Grove screen (jhd1313m1) isn't loaded with latin 1 characters.\n// It's up to the developer to load the set up to 8 custom characters and\n// update the input text so the character is swapped by a byte reflecting\n// the position of the custom character to use.\n// See SetCustomChar\nvar CustomLCDChars = map[string][8]byte{\n\t\"é\":       {130, 132, 142, 145, 159, 144, 142, 128},\n\t\"è\":       {136, 132, 142, 145, 159, 144, 142, 128},\n\t\"ê\":       {132, 138, 142, 145, 159, 144, 142, 128},\n\t\"à\":       {136, 134, 128, 142, 145, 147, 141, 128},\n\t\"â\":       {132, 138, 128, 142, 145, 147, 141, 128},\n\t\"á\":       {2, 4, 14, 1, 15, 17, 15, 0},\n\t\"î\":       {132, 138, 128, 140, 132, 132, 142, 128},\n\t\"í\":       {2, 4, 12, 4, 4, 4, 14, 0},\n\t\"û\":       {132, 138, 128, 145, 145, 147, 141, 128},\n\t\"ù\":       {136, 134, 128, 145, 145, 147, 141, 128},\n\t\"ñ\":       {14, 0, 22, 25, 17, 17, 17, 0},\n\t\"ó\":       {2, 4, 14, 17, 17, 17, 14, 0},\n\t\"heart\":   {0, 10, 31, 31, 31, 14, 4, 0},\n\t\"smiley\":  {0, 0, 10, 0, 0, 17, 14, 0},\n\t\"frowney\": {0, 0, 10, 0, 0, 0, 14, 17},\n}\n\n//nolint:staticcheck // prefix of the driver preferred for unexposed error\nvar jhd1313m1ErrInvalidPosition = fmt.Errorf(\"invalid position value\")\n\n// JHD1313M1Driver is a driver for the Jhd1313m1 LCD display which has two i2c addreses,\n// one belongs to a controller and the other controls solely the backlight.\n// This module was tested with the Seed Grove LCD RGB Backlight v2.0 display which requires 5V to operate.\n// http://www.seeedstudio.com/wiki/Grove_-_LCD_RGB_Backlight\ntype JHD1313M1Driver struct {\n\tConfig\n\tgobot.Commander\n\n\tname          string\n\tconnector     Connector\n\tlcdAddress    int\n\tlcdConnection Connection\n\trgbAddress    int\n\trgbConnection Connection\n}\n\n// NewJHD1313M1Driver creates a new driver with specified i2c interface.\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\nfunc NewJHD1313M1Driver(a Connector, options ...func(Config)) *JHD1313M1Driver {\n\td := &JHD1313M1Driver{\n\t\tname:       gobot.DefaultName(\"JHD1313M1\"),\n\t\tconnector:  a,\n\t\tConfig:     NewConfig(),\n\t\tCommander:  gobot.NewCommander(),\n\t\tlcdAddress: 0x3E,\n\t\trgbAddress: 0x62,\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetRGB\", func(params map[string]interface{}) interface{} {\n\t\tr, _ := strconv.Atoi(params[\"r\"].(string))\n\t\tg, _ := strconv.Atoi(params[\"g\"].(string))\n\t\tb, _ := strconv.Atoi(params[\"b\"].(string))\n\t\treturn d.SetRGB(r, g, b)\n\t})\n\td.AddCommand(\"Clear\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Clear()\n\t})\n\td.AddCommand(\"Home\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.Home()\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Write\", func(params map[string]interface{}) interface{} {\n\t\tmsg := params[\"msg\"].(string)\n\t\treturn d.Write(msg)\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetPosition\", func(params map[string]interface{}) interface{} {\n\t\tpos, _ := strconv.Atoi(params[\"pos\"].(string))\n\t\treturn d.SetPosition(pos)\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Scroll\", func(params map[string]interface{}) interface{} {\n\t\tlr, _ := strconv.ParseBool(params[\"lr\"].(string))\n\t\treturn d.Scroll(lr)\n\t})\n\n\treturn d\n}\n\n// Name returns the name the JHD1313M1 Driver was given when created.\nfunc (d *JHD1313M1Driver) Name() string { return d.name }\n\n// SetName sets the name for the JHD1313M1 Driver.\nfunc (d *JHD1313M1Driver) SetName(n string) { d.name = n }\n\n// Connection returns the gobot connection to the device.\nfunc (d *JHD1313M1Driver) Connection() gobot.Connection {\n\tif d.connector == nil {\n\t\tlog.Printf(\"%s has no connector\\n\", d.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connector.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.name)\n\treturn nil\n}\n\n// Start starts the backlit and the screen and initializes the states.\nfunc (d *JHD1313M1Driver) Start() error {\n\tif d.connector == nil {\n\t\treturn fmt.Errorf(\"%s has no connector\", d.name)\n\t}\n\n\tbus := d.GetBusOrDefault(d.connector.DefaultI2cBus())\n\n\tvar err error\n\tif d.lcdConnection, err = d.connector.GetI2cConnection(d.lcdAddress, bus); err != nil {\n\t\treturn err\n\t}\n\n\tif d.rgbConnection, err = d.connector.GetI2cConnection(d.rgbAddress, bus); err != nil {\n\t\treturn err\n\t}\n\n\t// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!\n\t// according to datasheet, we need at least 40ms after power rises above 2.7V\n\t// before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50\n\ttime.Sleep(50 * time.Millisecond)\n\n\t// this is according to the hitachi HD44780 datasheet\n\t// page 45 figure 23\n\t// Send function set command sequence\n\tinit_payload := []byte{LCD_CMD, LCD_FUNCTIONSET | LCD_2LINE}\n\tif _, err := d.lcdConnection.Write(init_payload); err != nil {\n\t\treturn err\n\t}\n\n\t// wait more than 4.1ms\n\ttime.Sleep(4500 * time.Microsecond)\n\t// second try\n\tif _, err := d.lcdConnection.Write(init_payload); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(150 * time.Microsecond)\n\t// third go\n\tif _, err := d.lcdConnection.Write(init_payload); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.lcdConnection.Write([]byte{LCD_CMD, LCD_DISPLAYCONTROL | LCD_DISPLAYON}); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(100 * time.Microsecond)\n\tif err := d.Clear(); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.lcdConnection.Write([]byte{\n\t\tLCD_CMD, LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT,\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.setReg(0, 0); err != nil {\n\t\treturn err\n\t}\n\tif err := d.setReg(1, 0); err != nil {\n\t\treturn err\n\t}\n\tif err := d.setReg(0x08, 0xAA); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.SetRGB(255, 255, 255)\n}\n\n// SetRGB sets the Red Green Blue value of backlit.\nfunc (d *JHD1313M1Driver) SetRGB(r, g, b int) error {\n\tif err := d.setReg(REG_RED, r); err != nil {\n\t\treturn err\n\t}\n\tif err := d.setReg(REG_GREEN, g); err != nil {\n\t\treturn err\n\t}\n\treturn d.setReg(REG_BLUE, b)\n}\n\n// Clear clears the text on the lCD display.\nfunc (d *JHD1313M1Driver) Clear() error {\n\treturn d.command([]byte{LCD_CLEARDISPLAY})\n}\n\n// Home sets the cursor to the origin position on the display.\nfunc (d *JHD1313M1Driver) Home() error {\n\terr := d.command([]byte{LCD_RETURNHOME})\n\t// This wait fixes a race condition when calling home and clear back to back.\n\ttime.Sleep(2 * time.Millisecond)\n\treturn err\n}\n\n// Write displays the passed message on the screen.\nfunc (d *JHD1313M1Driver) Write(message string) error {\n\t// This wait fixes an odd bug where the clear function doesn't always work properly.\n\ttime.Sleep(1 * time.Millisecond)\n\tfor _, val := range message {\n\t\tif val == '\\n' {\n\t\t\tif err := d.SetPosition(16); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif _, err := d.lcdConnection.Write([]byte{LCD_DATA, byte(val)}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetPosition sets the cursor and the data display to pos.\n// 0..15 are the positions in the first display line.\n// 16..32 are the positions in the second display line.\nfunc (d *JHD1313M1Driver) SetPosition(pos int) error {\n\tif pos < 0 || pos > 31 {\n\t\treturn jhd1313m1ErrInvalidPosition\n\t}\n\toffset := byte(pos)\n\tif pos >= 16 {\n\t\toffset -= 16\n\t\toffset |= LCD_2NDLINEOFFSET\n\t}\n\n\treturn d.command([]byte{LCD_SETDDRAMADDR | offset})\n}\n\n// Scroll sets the scrolling direction for the display, either left to right, or\n// right to left.\nfunc (d *JHD1313M1Driver) Scroll(lr bool) error {\n\tif lr {\n\t\t_, err := d.lcdConnection.Write([]byte{LCD_CMD, LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT})\n\t\treturn err\n\t}\n\n\t_, err := d.lcdConnection.Write([]byte{LCD_CMD, LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT})\n\treturn err\n}\n\n// Halt is a noop function.\nfunc (d *JHD1313M1Driver) Halt() error { return nil }\n\n// SetCustomChar sets one of the 8 CGRAM locations with a custom character.\n// The custom character can be used by writing a byte of value 0 to 7.\n// When you are using LCD as 5x8 dots in function set then you can define a total of 8 user defined patterns\n// (1 Byte for each row and 8 rows for each pattern).\n// Use http://www.8051projects.net/lcd-interfacing/lcd-custom-character.php to create your own\n// characters.\n// To use a custom character, write byte value of the custom character position as a string after\n// having setup the custom character.\nfunc (d *JHD1313M1Driver) SetCustomChar(pos int, charMap [8]byte) error {\n\tif pos > 7 {\n\t\treturn fmt.Errorf(\"can't set a custom character at a position greater than 7\")\n\t}\n\tlocation := uint8(pos) //nolint:gosec // checked before\n\tif err := d.command([]byte{LCD_SETCGRAMADDR | (location << 3)}); err != nil {\n\t\treturn err\n\t}\n\t_, err := d.lcdConnection.Write(append([]byte{LCD_DATA}, charMap[:]...))\n\treturn err\n}\n\nfunc (d *JHD1313M1Driver) setReg(command int, data int) error {\n\t_, err := d.rgbConnection.Write([]byte{byte(command), byte(data)})\n\treturn err\n}\n\nfunc (d *JHD1313M1Driver) command(buf []byte) error {\n\t_, err := d.lcdConnection.Write(append([]byte{LCD_CMD}, buf...))\n\treturn err\n}\n"
  },
  {
    "path": "drivers/i2c/jhd1313m1_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*JHD1313M1Driver)(nil)\n\n// --------- HELPERS\nfunc initTestJHD1313M1Driver() *JHD1313M1Driver {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initTestJHD1313M1DriverWithStubbedAdaptor() (*JHD1313M1Driver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\treturn NewJHD1313M1Driver(adaptor), adaptor\n}\n\n// --------- TESTS\n\nfunc TestNewJHD1313M1Driver(t *testing.T) {\n\t// Does it return a pointer to an instance of JHD1313M1Driver?\n\tvar mpl interface{} = NewJHD1313M1Driver(newI2cTestAdaptor())\n\t_, ok := mpl.(*JHD1313M1Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewJHD1313M1Driver() should have returned a *JHD1313M1Driver\")\n\t}\n}\n\n// Methods\nfunc TestJHD1313M1Driver(t *testing.T) {\n\tjhd := initTestJHD1313M1Driver()\n\n\tassert.NotNil(t, jhd.Connection())\n\tassert.True(t, strings.HasPrefix(jhd.Name(), \"JHD1313M1\"))\n}\n\nfunc TestJHD1313MDriverSetName(t *testing.T) {\n\td := initTestJHD1313M1Driver()\n\td.SetName(\"TESTME\")\n\tassert.Equal(t, \"TESTME\", d.Name())\n}\n\nfunc TestJHD1313MDriverOptions(t *testing.T) {\n\td := NewJHD1313M1Driver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestJHD1313MDriverStart(t *testing.T) {\n\td := initTestJHD1313M1Driver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestJHD1313MStartConnectError(t *testing.T) {\n\td, adaptor := initTestJHD1313M1DriverWithStubbedAdaptor()\n\tadaptor.Testi2cConnectErr(true)\n\trequire.ErrorContains(t, d.Start(), \"invalid i2c connection\")\n}\n\nfunc TestJHD1313MDriverStartWriteError(t *testing.T) {\n\td, adaptor := initTestJHD1313M1DriverWithStubbedAdaptor()\n\tadaptor.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\trequire.ErrorContains(t, d.Start(), \"write error\")\n}\n\nfunc TestJHD1313MDriverHalt(t *testing.T) {\n\t// arrange\n\td := initTestJHD1313M1Driver()\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestJHD1313MDriverSetRgb(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.SetRGB(0x00, 0x00, 0x00))\n}\n\nfunc TestJHD1313MDriverSetRgbError(t *testing.T) {\n\td, a := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\trequire.ErrorContains(t, d.SetRGB(0x00, 0x00, 0x00), \"write error\")\n}\n\nfunc TestJHD1313MDriverClear(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Clear())\n}\n\nfunc TestJHD1313MDriverClearError(t *testing.T) {\n\td, a := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\trequire.ErrorContains(t, d.Clear(), \"write error\")\n}\n\nfunc TestJHD1313MDriverHome(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Home())\n}\n\nfunc TestJHD1313MDriverWrite(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Write(\"Hello\"))\n}\n\nfunc TestJHD1313MDriverWriteError(t *testing.T) {\n\td, a := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\trequire.ErrorContains(t, d.Write(\"Hello\"), \"write error\")\n}\n\nfunc TestJHD1313MDriverWriteTwoLines(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Write(\"Hello\\nthere\"))\n}\n\nfunc TestJHD1313MDriverWriteTwoLinesError(t *testing.T) {\n\td, a := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\trequire.ErrorContains(t, d.Write(\"Hello\\nthere\"), \"write error\")\n}\n\nfunc TestJHD1313MDriverSetPosition(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.SetPosition(2))\n}\n\nfunc TestJHD1313MDriverSetSecondLinePosition(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.SetPosition(18))\n}\n\nfunc TestJHD1313MDriverSetPositionInvalid(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\tassert.Equal(t, jhd1313m1ErrInvalidPosition, d.SetPosition(-1))\n\tassert.Equal(t, jhd1313m1ErrInvalidPosition, d.SetPosition(32))\n}\n\nfunc TestJHD1313MDriverScroll(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Scroll(true))\n}\n\nfunc TestJHD1313MDriverReverseScroll(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\trequire.NoError(t, d.Scroll(false))\n}\n\nfunc TestJHD1313MDriverSetCustomChar(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\tdata := [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}\n\t_ = d.Start()\n\trequire.NoError(t, d.SetCustomChar(0, data))\n}\n\nfunc TestJHD1313MDriverSetCustomCharError(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\tdata := [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}\n\t_ = d.Start()\n\trequire.ErrorContains(t, d.SetCustomChar(10, data), \"can't set a custom character at a position greater than 7\")\n}\n\nfunc TestJHD1313MDriverSetCustomCharWriteError(t *testing.T) {\n\td, a := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\tdata := [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}\n\trequire.ErrorContains(t, d.SetCustomChar(0, data), \"write error\")\n}\n\nfunc TestJHD1313MDriverCommands(t *testing.T) {\n\td, _ := initTestJHD1313M1DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\terr := d.Command(\"SetRGB\")(map[string]interface{}{\"r\": \"1\", \"g\": \"1\", \"b\": \"1\"})\n\tassert.Nil(t, err)\n\n\terr = d.Command(\"Clear\")(map[string]interface{}{})\n\tassert.Nil(t, err)\n\n\terr = d.Command(\"Home\")(map[string]interface{}{})\n\tassert.Nil(t, err)\n\n\terr = d.Command(\"Write\")(map[string]interface{}{\"msg\": \"Hello\"})\n\tassert.Nil(t, err)\n\n\terr = d.Command(\"SetPosition\")(map[string]interface{}{\"pos\": \"1\"})\n\tassert.Nil(t, err)\n\n\terr = d.Command(\"Scroll\")(map[string]interface{}{\"lr\": \"true\"})\n\tassert.Nil(t, err)\n}\n"
  },
  {
    "path": "drivers/i2c/l3gd20h_driver.go",
    "content": "//nolint:lll // ok here\npackage i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"log\"\n)\n\nconst (\n\tl3gd20hDebug          = false\n\tl3gd20hDefaultAddress = 0x6B\n)\n\nconst (\n\tl3gd20hReg_Ctl1    = 0x20 // output data rate selection, bandwidth selection, power mode, axis X/Y/Z enable\n\tl3gd20hReg_Ctl4    = 0x23 // block data update, big/little-endian, full scale, level sensitive latch, self test, serial interface mode\n\tl3gd20hReg_OutXLSB = 0x28 // X-axis angular rate data, LSB\n\n\tl3gd20hCtl1_NormalModeBit = 0x08\n\tl3gd20hCtl1_EnableZBit    = 0x04\n\tl3gd20hCtl1_EnableYBit    = 0x02\n\tl3gd20hCtl1_EnableXBit    = 0x01\n\n\tl3gd20hCtl4_FullScaleRangeBits = 0x30\n)\n\n// L3GD20HScale is for configurable full scale range.\ntype L3GD20HScale byte\n\nconst (\n\t// L3GD20HScale250dps is the +/-250 degrees-per-second full scale range (+/-245 from datasheet, but can hold around +/-286).\n\tL3GD20HScale250dps L3GD20HScale = 0x00\n\t// L3GD20HScale500dps is the +/-500 degrees-per-second full scale range.\n\tL3GD20HScale500dps L3GD20HScale = 0x10\n\t// L3GD20HScale2001dps is the +/-2000 degrees-per-second full scale range by using 0x20 setting.\n\tL3GD20HScale2001dps L3GD20HScale = 0x20\n\t// L3GD20HScale2000dps is the +/-2000 degrees-per-second full scale range.\n\tL3GD20HScale2000dps L3GD20HScale = 0x30\n)\n\n// l3gdhSensibility in °/s, see the mechanical characteristics in the datasheet\nvar l3gdhSensibility = map[L3GD20HScale]float32{\n\tL3GD20HScale250dps:  0.00875,\n\tL3GD20HScale500dps:  0.0175,\n\tL3GD20HScale2001dps: 0.07,\n\tL3GD20HScale2000dps: 0.07,\n}\n\n// L3GD20HDriver is the gobot driver for the Adafruit Triple-Axis Gyroscope L3GD20H.\n// Device datasheet: http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/DM00036465.pdf\ntype L3GD20HDriver struct {\n\t*Driver\n\n\tscale L3GD20HScale\n}\n\n// NewL3GD20HDriver creates a new Gobot driver for the\n// L3GD20H I2C Triple-Axis Gyroscope.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewL3GD20HDriver(c Connector, options ...func(Config)) *L3GD20HDriver {\n\td := &L3GD20HDriver{\n\t\tDriver: NewDriver(c, \"L3GD20H\", l3gd20hDefaultAddress, options...),\n\t\tscale:  L3GD20HScale250dps,\n\t}\n\td.afterStart = d.initialize\n\n\t// TODO: add commands to API\n\treturn d\n}\n\n// WithL3GD20HFullScaleRange option sets the full scale range for the gyroscope.\n// Valid settings are of type \"L3GD20HScale\"\nfunc WithL3GD20HFullScaleRange(val L3GD20HScale) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*L3GD20HDriver)\n\t\tif ok {\n\t\t\td.scale = val\n\t\t} else if l3gd20hDebug {\n\t\t\tlog.Printf(\"Trying to set full scale range of gyroscope for non-L3GD20HDriver %v\", c)\n\t\t}\n\t}\n}\n\n// SetScale sets the full scale range of the device (deprecated, use WithL3GD20HFullScaleRange() instead).\nfunc (d *L3GD20HDriver) SetScale(s L3GD20HScale) {\n\td.scale = s\n}\n\n// Scale returns the full scale range (deprecated, use FullScaleRange() instead).\nfunc (d *L3GD20HDriver) Scale() L3GD20HScale {\n\treturn d.scale\n}\n\n// FullScaleRange returns the full scale range of the device.\nfunc (d *L3GD20HDriver) FullScaleRange() (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tval, err := d.readByteData(l3gd20hReg_Ctl4)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn val & l3gd20hCtl4_FullScaleRangeBits, nil\n}\n\n// XYZ returns the current change in degrees per second, for the 3 axis.\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *L3GD20HDriver) XYZ() (x float32, y float32, z float32, err error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tmeasurements := make([]byte, 6)\n\treg := l3gd20hReg_OutXLSB | 0x80 // set auto-increment bit\n\tif err := d.readBlockData(uint8(reg), measurements); err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\n\tvar rawX int16\n\tvar rawY int16\n\tvar rawZ int16\n\tbuf := bytes.NewBuffer(measurements)\n\tif err := binary.Read(buf, binary.LittleEndian, &rawX); err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &rawY); err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &rawZ); err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\n\tsensitivity := l3gdhSensibility[d.scale]\n\n\treturn float32(rawX) * sensitivity, float32(rawY) * sensitivity, float32(rawZ) * sensitivity, nil\n}\n\nfunc (d *L3GD20HDriver) initialize() error {\n\t// reset the gyroscope.\n\tif err := d.writeByteData(l3gd20hReg_Ctl1, 0x00); err != nil {\n\t\treturn err\n\t}\n\t// Enable Z, Y and X axis.\n\tctl1 := l3gd20hCtl1_NormalModeBit | l3gd20hCtl1_EnableZBit | l3gd20hCtl1_EnableYBit | l3gd20hCtl1_EnableXBit\n\tif err := d.writeByteData(l3gd20hReg_Ctl1, uint8(ctl1)); err != nil {\n\t\treturn err\n\t}\n\t// Set the sensitivity scale.\n\tif err := d.writeByteData(l3gd20hReg_Ctl4, byte(d.scale)); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/l3gd20h_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*HMC6352Driver)(nil)\n\nfunc initL3GD20HDriver() *L3GD20HDriver {\n\td, _ := initL3GD20HWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initL3GD20HWithStubbedAdaptor() (*L3GD20HDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewL3GD20HDriver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewL3GD20HDriver(t *testing.T) {\n\tvar di interface{} = NewL3GD20HDriver(newI2cTestAdaptor())\n\td, ok := di.(*L3GD20HDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewL3GD20HDriver() should have returned a *L3GD20HDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"L3GD20H\"))\n\tassert.Equal(t, 0x6b, d.defaultAddress)\n\tassert.Equal(t, L3GD20HScale250dps, d.Scale())\n}\n\nfunc TestL3GD20HHalt(t *testing.T) {\n\t// arrange\n\td := NewL3GD20HDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestL3GD20HOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option.\n\t// Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewL3GD20HDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestL3GD20HWithL3GD20HFullScaleRange(t *testing.T) {\n\ttests := map[string]struct {\n\t\tscale L3GD20HScale\n\t\twant  uint8\n\t}{\n\t\t\"250dps\": {\n\t\t\tscale: L3GD20HScale250dps,\n\t\t\twant:  0x00,\n\t\t},\n\t\t\"500dps\": {\n\t\t\tscale: L3GD20HScale500dps,\n\t\t\twant:  0x10,\n\t\t},\n\t\t\"2001dps\": {\n\t\t\tscale: L3GD20HScale2001dps,\n\t\t\twant:  0x20,\n\t\t},\n\t\t\"2000dps\": {\n\t\t\tscale: L3GD20HScale2000dps,\n\t\t\twant:  0x30,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := initL3GD20HDriver()\n\t\t\t// act\n\t\t\tWithL3GD20HFullScaleRange(tc.scale)(d)\n\t\t\t// assert\n\t\t\tassert.Equal(t, L3GD20HScale(tc.want), d.scale)\n\t\t})\n\t}\n}\n\nfunc TestL3GD20HScale(t *testing.T) {\n\ttests := map[string]struct {\n\t\tscale L3GD20HScale\n\t\twant  uint8\n\t}{\n\t\t\"250dps\": {\n\t\t\tscale: L3GD20HScale250dps,\n\t\t\twant:  0x00,\n\t\t},\n\t\t\"500dps\": {\n\t\t\tscale: L3GD20HScale500dps,\n\t\t\twant:  0x10,\n\t\t},\n\t\t\"2001dps\": {\n\t\t\tscale: L3GD20HScale2001dps,\n\t\t\twant:  0x20,\n\t\t},\n\t\t\"2000dps\": {\n\t\t\tscale: L3GD20HScale2000dps,\n\t\t\twant:  0x30,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := initL3GD20HDriver()\n\t\t\t// act\n\t\t\td.SetScale(tc.scale)\n\t\t\t// assert\n\t\t\tassert.Equal(t, L3GD20HScale(tc.want), d.scale)\n\t\t})\n\t}\n}\n\nfunc TestL3GD20HFullScaleRange(t *testing.T) {\n\t// sequence to read full scale range\n\t// * write control register 4 (0x23)\n\t// * read content and filter FS bits (bit 4, bit 5)\n\t//\n\t// arrange\n\td, a := initL3GD20HWithStubbedAdaptor()\n\ta.written = []byte{} // reset values from Start() and previous tests\n\treadValue := uint8(0x10)\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tb[0] = readValue\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.FullScaleRange()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(0x23), a.written[0])\n\tassert.Equal(t, readValue, got)\n}\n\nfunc TestL3GD20HMeasurement(t *testing.T) {\n\t// sequence for measurement\n\t// note: big endian transfer is configured (LSB in lower address, transferred first)\n\t//\n\t// * write X-axis angular rate data LSB register (0x28) with auto increment bit set (0xA8)\n\t// * read 3 x 2 bytes X, Y, Z data, big-endian (LSB, MSB)\n\t// * scale values by configured range (sensitivity = 1/gain)\n\t//\n\t// data table according to data sheet AN4506 example in table 7, supplemented with FS limit values\n\tsensitivity := float32(0.00875) // FS=245 dps\n\ttests := map[string]struct {\n\t\tgyroData []byte\n\t\twantX    float32\n\t\twantY    float32\n\t\twantZ    float32\n\t}{\n\t\t\"245_200_100dps\": {\n\t\t\tgyroData: []byte{0x60, 0x6D, 0x49, 0x59, 0xA4, 0x2C},\n\t\t\twantX:    245,\n\t\t\twantY:    199.99875,\n\t\t\twantZ:    99.995,\n\t\t},\n\t\t\"-100_-200_-245dps\": {\n\t\t\tgyroData: []byte{0x5C, 0xD3, 0xB7, 0xA6, 0xA0, 0x92},\n\t\t\twantX:    -99.995,\n\t\t\twantY:    -199.99875,\n\t\t\twantZ:    -245,\n\t\t},\n\t\t\"1_0_-1\": {\n\t\t\tgyroData: []byte{0x72, 0x00, 0x00, 0x00, 0x8D, 0xFF},\n\t\t\twantX:    0.9975,\n\t\t\twantY:    0,\n\t\t\twantZ:    -1.00625,\n\t\t},\n\t\t\"raw_range_int16_-32768_0_+32767\": {\n\t\t\tgyroData: []byte{0x00, 0x80, 0x00, 0x00, 0xFF, 0x7F},\n\t\t\twantX:    -286.72,\n\t\t\twantY:    0,\n\t\t\twantZ:    286.71124,\n\t\t},\n\t\t\"raw_8_5_-3\": {\n\t\t\tgyroData: []byte{0x08, 0x00, 0x05, 0x00, 0xFD, 0xFF},\n\t\t\twantX:    float32(8) * sensitivity,\n\t\t\twantY:    float32(5) * sensitivity,\n\t\t\twantZ:    float32(-3) * sensitivity,\n\t\t},\n\t}\n\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initL3GD20HWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset values from Start() and previous tests\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tcopy(b, tc.gyroData)\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tx, y, z, err := d.XYZ()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, uint8(0xA8), a.written[0])\n\t\t\tassert.InDelta(t, tc.wantX, x, 0.0)\n\t\t\tassert.InDelta(t, tc.wantY, y, 0.0)\n\t\t\tassert.InDelta(t, tc.wantZ, z, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestL3GD20HMeasurementError(t *testing.T) {\n\td, a := initL3GD20HWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_ = d.Start()\n\tx, y, z, err := d.XYZ()\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, 0.0, x, 0.0)\n\tassert.InDelta(t, 0.0, y, 0.0)\n\tassert.InDelta(t, 0.0, z, 0.0)\n}\n\nfunc TestL3GD20HMeasurementWriteError(t *testing.T) {\n\td, a := initL3GD20HWithStubbedAdaptor()\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\tx, y, z, err := d.XYZ()\n\trequire.ErrorContains(t, err, \"write error\")\n\tassert.InDelta(t, 0.0, x, 0.0)\n\tassert.InDelta(t, 0.0, y, 0.0)\n\tassert.InDelta(t, 0.0, z, 0.0)\n}\n\nfunc TestL3GD20H_initialize(t *testing.T) {\n\t// sequence for initialization the device on Start()\n\t// * write control register 1 (0x20)\n\t// * write reset (0x00)\n\t// * write control register 1 (0x20)\n\t// * prepare register content:\n\t//  * output data rate for no Low_ODR=100Hz (DR=0x00)\n\t//  * bandwidth for no Low_ODR=12.5Hz (BW=0x00)\n\t//  * normal mode and enable all axes (PD=1, X/Y/Z=1)\n\t// * write register content (0x0F)\n\t// * write control register 4 (0x23)\n\t// * prepare register content\n\t//  * continuous block data update (BDU=0x00)\n\t//  * use big endian transfer (LSB in lower address, transferred first) (BLE=0x00)\n\t//  * set full scale selection to configured scale (default=245dps, FS=0x00)\n\t//  * normal self test (ST=0x00)\n\t//  * SPI mode to 4 wire (SIM=0x00)\n\t// * write register content (0x00)\n\t//\n\t// all other registers currently untouched\n\t//\n\t// arrange, act - initialize() must be called on Start()\n\t_, a := initL3GD20HWithStubbedAdaptor()\n\t// assert\n\tassert.Len(t, a.written, 6)\n\tassert.Equal(t, uint8(0x20), a.written[0])\n\tassert.Equal(t, uint8(0x00), a.written[1])\n\tassert.Equal(t, uint8(0x20), a.written[2])\n\tassert.Equal(t, uint8(0x0F), a.written[3])\n\tassert.Equal(t, uint8(0x23), a.written[4])\n\tassert.Equal(t, uint8(0x00), a.written[5])\n}\n"
  },
  {
    "path": "drivers/i2c/lidarlite_driver.go",
    "content": "package i2c\n\nimport (\n\t\"time\"\n)\n\nconst lidarliteDefaultAddress = 0x62\n\n// LIDARLiteDriver is the Gobot driver for the LIDARLite I2C LIDAR device.\ntype LIDARLiteDriver struct {\n\t*Driver\n}\n\n// NewLIDARLiteDriver creates a new driver for the LIDARLite I2C LIDAR device.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewLIDARLiteDriver(c Connector, options ...func(Config)) *LIDARLiteDriver {\n\td := &LIDARLiteDriver{\n\t\tDriver: NewDriver(c, \"LIDARLite\", lidarliteDefaultAddress),\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: add commands to API\n\treturn d\n}\n\n// Distance returns the current distance in cm\nfunc (d *LIDARLiteDriver) Distance() (int, error) {\n\tif _, err := d.write([]byte{0x00, 0x04}); err != nil {\n\t\treturn 0, err\n\t}\n\ttime.Sleep(20 * time.Millisecond)\n\n\tif _, err := d.write([]byte{0x0F}); err != nil {\n\t\treturn 0, err\n\t}\n\n\tupper := []byte{0}\n\tbytesRead, err := d.read(upper)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif bytesRead != 1 {\n\t\treturn 0, ErrNotEnoughBytes\n\t}\n\n\tif _, err := d.write([]byte{0x10}); err != nil {\n\t\treturn 0, err\n\t}\n\n\tlower := []byte{0}\n\tbytesRead, err = d.read(lower)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif bytesRead != 1 {\n\t\treturn 0, ErrNotEnoughBytes\n\t}\n\n\tdistance := ((int(upper[0]) & 0xff) << 8) | (int(lower[0]) & 0xff)\n\n\treturn distance, nil\n}\n"
  },
  {
    "path": "drivers/i2c/lidarlite_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*LIDARLiteDriver)(nil)\n\nfunc initTestLIDARLiteDriverWithStubbedAdaptor() (*LIDARLiteDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewLIDARLiteDriver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewLIDARLiteDriver(t *testing.T) {\n\tvar di interface{} = NewLIDARLiteDriver(newI2cTestAdaptor())\n\td, ok := di.(*LIDARLiteDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewLIDARLiteDriver() should have returned a *LIDARLiteDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"LIDARLite\"))\n\tassert.Equal(t, 0x62, d.defaultAddress)\n}\n\nfunc TestLIDARLiteDriverOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewLIDARLiteDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestLIDARLiteDriverStart(t *testing.T) {\n\td := NewLIDARLiteDriver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestLIDARLiteDriverHalt(t *testing.T) {\n\t// arrange\n\td := NewLIDARLiteDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestLIDARLiteDriverDistance(t *testing.T) {\n\t// when everything is happy\n\td, a := initTestLIDARLiteDriverWithStubbedAdaptor()\n\tfirst := true\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tif first {\n\t\t\tfirst = false\n\t\t\tcopy(b, []byte{99})\n\t\t\treturn 1, nil\n\t\t}\n\t\tcopy(b, []byte{1})\n\t\treturn 1, nil\n\t}\n\n\tdistance, err := d.Distance()\n\n\trequire.NoError(t, err)\n\tassert.Equal(t, int(25345), distance)\n\n\t// when insufficient bytes have been read\n\td, a = initTestLIDARLiteDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, nil\n\t}\n\n\tdistance, err = d.Distance()\n\tassert.Equal(t, int(0), distance)\n\tassert.Equal(t, ErrNotEnoughBytes, err)\n\n\t// when read error\n\td, a = initTestLIDARLiteDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\tdistance, err = d.Distance()\n\tassert.Equal(t, int(0), distance)\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestLIDARLiteDriverDistanceError1(t *testing.T) {\n\td, a := initTestLIDARLiteDriverWithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\tdistance, err := d.Distance()\n\tassert.Equal(t, int(0), distance)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestLIDARLiteDriverDistanceError2(t *testing.T) {\n\td, a := initTestLIDARLiteDriverWithStubbedAdaptor()\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\tif b[0] == 0x0f {\n\t\t\treturn 0, errors.New(\"write error\")\n\t\t}\n\t\treturn len(b), nil\n\t}\n\n\tdistance, err := d.Distance()\n\tassert.Equal(t, int(0), distance)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestLIDARLiteDriverDistanceError3(t *testing.T) {\n\td, a := initTestLIDARLiteDriverWithStubbedAdaptor()\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\tif b[0] == 0x10 {\n\t\t\treturn 0, errors.New(\"write error\")\n\t\t}\n\t\treturn len(b), nil\n\t}\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{0x03})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\n\tdistance, err := d.Distance()\n\tassert.Equal(t, int(0), distance)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n"
  },
  {
    "path": "drivers/i2c/mcp23017_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/common/bit\"\n)\n\n// default address for device when a2/a1/a0 pins are all tied to ground\n// please consider special handling for MCP23S17\nconst mcp23017DefaultAddress = 0x20\n\nconst mcp23017Debug = false // toggle debugging information\n\n// port contains all the registers for the device.\ntype port struct {\n\tIODIR   uint8 // I/O direction register: 0=output / 1=input\n\tIPOL    uint8 // input polarity register: 0=normal polarity / 1=inversed\n\tGPINTEN uint8 // interrupt on change control register: 0=disabled / 1=enabled\n\tDEFVAL  uint8 // default compare register for interrupt on change\n\t// interrupt control register: bit set to 0= use defval bit value to compare pin value/ bit set to 1= pin value\n\t// compared to previous pin value\n\tINTCON uint8\n\tIOCON  uint8 // configuration register\n\tGPPU   uint8 // pull-up resistor configuration register: 0=enabled / 1=disabled\n\tINTF   uint8 // interrupt flag register: 0=no interrupt / 1=pin caused interrupt\n\tINTCAP uint8 // interrupt capture register, captures pin values during interrupt: 0=logic low / 1=logic high\n\tGPIO   uint8 // port register, reading from this register reads the port\n\tOLAT   uint8 // output latch register, write modifies the pins: 0=logic low / 1=logic high\n}\n\n// A bank is made up of PortA and PortB pins.\n// Port B pins are on the left side of the chip (starting with pin 1), while port A pins are on the right side.\ntype bank struct {\n\tportA port\n\tportB port\n}\n\n// mcp23017Config contains the device configuration for the IOCON register.\n// These fields should only be set with values 0 or 1.\ntype mcp23017Config struct {\n\tbank   uint8\n\tmirror uint8\n\tseqop  uint8\n\tdisslw uint8\n\thaen   uint8\n\todr    uint8\n\tintpol uint8\n}\n\ntype mcp23017Behavior struct {\n\tforceRefresh bool\n\tautoIODirOff bool\n}\n\n// MCP23017Driver contains the driver configuration parameters.\ntype MCP23017Driver struct {\n\t*Driver\n\tgobot.Eventer\n\n\tmcpConf  mcp23017Config\n\tmcpBehav mcp23017Behavior\n}\n\n// NewMCP23017Driver creates a new Gobot Driver to the MCP23017 i2c port expander.\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\n//\ti2c.WithMCP23017Bank(int):\tMCP23017 bank to use with this driver\n//\ti2c.WithMCP23017Mirror(int):\tMCP23017 mirror to use with this driver\n//\ti2c.WithMCP23017Seqop(int):\tMCP23017 seqop to use with this driver\n//\ti2c.WithMCP23017Disslw(int):\tMCP23017 disslw to use with this driver\n//\ti2c.WithMCP23017Haen(int):\tMCP23017 haen to use with this driver\n//\ti2c.WithMCP23017Odr(int):\tMCP23017 odr to use with this driver\n//\ti2c.WithMCP23017Intpol(int):\tMCP23017 intpol to use with this driver\nfunc NewMCP23017Driver(c Connector, options ...func(Config)) *MCP23017Driver {\n\td := &MCP23017Driver{\n\t\tDriver:  NewDriver(c, \"MCP23017\", mcp23017DefaultAddress),\n\t\tmcpConf: mcp23017Config{},\n\t\tEventer: gobot.NewEventer(),\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"WriteGPIO\", func(params map[string]interface{}) interface{} {\n\t\tpin := params[\"pin\"].(uint8)\n\t\tport := params[\"port\"].(string)\n\t\tval := params[\"val\"].(uint8)\n\t\terr := d.WriteGPIO(pin, port, val)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ReadGPIO\", func(params map[string]interface{}) interface{} {\n\t\tpin := params[\"pin\"].(uint8)\n\t\tport := params[\"port\"].(string)\n\t\tval, err := d.ReadGPIO(pin, port)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\treturn d\n}\n\n// WithMCP23017Bank option sets the MCP23017Driver bank option\nfunc WithMCP23017Bank(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpConf.bank = val\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"trying to set bank for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017Mirror option sets the MCP23017Driver mirror option\nfunc WithMCP23017Mirror(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpConf.mirror = val\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set mirror for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017Seqop option sets the MCP23017Driver seqop option\nfunc WithMCP23017Seqop(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpConf.seqop = val\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set seqop for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017Disslw option sets the MCP23017Driver disslw option\nfunc WithMCP23017Disslw(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpConf.disslw = val\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set disslw for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017Haen option sets the MCP23017Driver haen option\n// This feature is only available for MCP23S17, because address pins are always enabled on the MCP23017.\nfunc WithMCP23017Haen(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpConf.haen = val\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set haen for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017Odr option sets the MCP23017Driver odr option\nfunc WithMCP23017Odr(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpConf.odr = val\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set odr for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017Intpol option sets the MCP23017Driver intpol option\nfunc WithMCP23017Intpol(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpConf.intpol = val\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set intpol for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017ForceRefresh option modifies the MCP23017Driver forceRefresh option\n// Setting to true (1) will force refresh operation to register, although there is no change.\n// Normally this is not needed, so default is off (0).\n// When there is something flaky, there is a small chance to stabilize by setting this flag to true.\n// However, setting this flag to true slows down each IO operation up to 100%.\nfunc WithMCP23017ForceRefresh(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpBehav.forceRefresh = val > 0\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set forceRefresh for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMCP23017AutoIODirOff option modifies the MCP23017Driver autoIODirOff option\n// Set IO direction at each read or write operation ensures the correct direction, which is the default setting.\n// Most hardware is configured statically, so this can avoided by setting the direction using SetPinMode(),\n// e.g. in the start up sequence. If this way is taken, the automatic set of direction at each call can\n// be safely deactivated with this flag (set to true, 1).\n// This will speedup each WriteGPIO by 50% and each ReadGPIO by 60%.\nfunc WithMCP23017AutoIODirOff(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*MCP23017Driver)\n\t\tif ok {\n\t\t\td.mcpBehav.autoIODirOff = val > 0\n\t\t} else if mcp23017Debug {\n\t\t\tlog.Printf(\"Trying to set autoIODirOff for non-MCP23017Driver %v\", c)\n\t\t}\n\t}\n}\n\n// SetPinMode set pin mode of a given pin immediately, based on the value:\n// val = 0 output\n// val = 1 input\nfunc (d *MCP23017Driver) SetPinMode(pin uint8, portStr string, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tselectedPort := d.getPort(portStr)\n\t// Set IODIR register bit for given pin to an output/input.\n\treturn d.writePin(selectedPort.IODIR, pin, bitState(val))\n}\n\n// SetPullUp sets the pull up state of a given pin immediately, based on the value:\n// val = 1 pull up enabled.\n// val = 0 pull up disabled.\nfunc (d *MCP23017Driver) SetPullUp(pin uint8, portStr string, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tselectedPort := d.getPort(portStr)\n\treturn d.writePin(selectedPort.GPPU, pin, bitState(val))\n}\n\n// SetGPIOPolarity will change a given pin's polarity immediately, based on the value:\n// val = 1 opposite logic state of the input pin.\n// val = 0 same logic state of the input pin.\nfunc (d *MCP23017Driver) SetGPIOPolarity(pin uint8, portStr string, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tselectedPort := d.getPort(portStr)\n\treturn d.writePin(selectedPort.IPOL, pin, bitState(val))\n}\n\n// WriteGPIO writes a value to a gpio pin (0-7) and a port (A or B).\nfunc (d *MCP23017Driver) WriteGPIO(pin uint8, portStr string, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tselectedPort := d.getPort(portStr)\n\tif !d.mcpBehav.autoIODirOff {\n\t\t// Set IODIR register bit for given pin to an output by clearing bit.\n\t\t// can't call SetPinMode() because mutex will cause deadlock\n\t\tif err := d.writePin(selectedPort.IODIR, pin, clearBit); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t// write value to OLAT register bit\n\treturn d.writePin(selectedPort.OLAT, pin, bitState(val))\n}\n\n// ReadGPIO reads a value from a given gpio pin (0-7) and a port (A or B).\nfunc (d *MCP23017Driver) ReadGPIO(pin uint8, portStr string) (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tselectedPort := d.getPort(portStr)\n\tif !d.mcpBehav.autoIODirOff {\n\t\t// Set IODIR register bit for given pin to an input by set bit.\n\t\t// can't call SetPinMode() because mutex will cause deadlock\n\t\tif err := d.writePin(selectedPort.IODIR, pin, setBit); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\tval, err := d.readReg(selectedPort.GPIO)\n\tif err != nil {\n\t\treturn val, err\n\t}\n\tval = 1 << pin & val\n\tif val > 1 {\n\t\tval = 1\n\t}\n\treturn val, nil\n}\n\nfunc (d *MCP23017Driver) initialize() error {\n\t// Set IOCON register with MCP23017 configuration.\n\tioconReg := d.getPort(\"A\").IOCON // IOCON address is the same for Port A or B.\n\tioconVal := d.mcpConf.getUint8Value()\n\n\t_, err := d.write([]uint8{ioconReg, ioconVal})\n\treturn err\n}\n\n// write gets the value of the passed in register, and then sets the bit specified\n// by the pin to the given state.\nfunc (d *MCP23017Driver) writePin(reg uint8, pin uint8, state bitState) error {\n\tvalOrg, err := d.readReg(reg)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"MCP write-read: %v\", err)\n\t}\n\n\tvar val uint8\n\tif state == clearBit {\n\t\tval = uint8(bit.Clear(int(valOrg), pin)) //nolint:gosec // TODO: fix later\n\t} else {\n\t\tval = uint8(bit.Set(int(valOrg), pin)) //nolint:gosec // TODO: fix later\n\t}\n\n\tif val != valOrg || d.mcpBehav.forceRefresh {\n\t\tif mcp23017Debug {\n\t\t\tlog.Printf(\"write done: MCP forceRefresh: %t, address: 0x%X, register: 0x%X, name: %s, value: 0x%X\\n\",\n\t\t\t\td.mcpBehav.forceRefresh, d.GetAddressOrDefault(mcp23017DefaultAddress), reg, d.getRegName(reg), val)\n\t\t}\n\t\tif err := d.writeByteData(reg, val); err != nil {\n\t\t\treturn fmt.Errorf(\"MCP write-WriteByteData(reg=%d,val=%d): %v\", reg, val, err)\n\t\t}\n\t} else if mcp23017Debug {\n\t\tlog.Printf(\"write skipped: MCP forceRefresh: %t, address: 0x%X, register: 0x%X, name: %s, value: 0x%X\\n\",\n\t\t\td.mcpBehav.forceRefresh, d.GetAddressOrDefault(mcp23017DefaultAddress), reg, d.getRegName(reg), val)\n\t}\n\treturn nil\n}\n\n// read get the data from a given register\n// it is mainly a wrapper to create additional debug messages, when activated\nfunc (d *MCP23017Driver) readReg(reg uint8) (uint8, error) {\n\tval, err := d.readByteData(reg)\n\tif err != nil {\n\t\treturn val, fmt.Errorf(\"MCP write-ReadByteData(reg=%d): %v\", reg, err)\n\t}\n\tif mcp23017Debug {\n\t\tlog.Printf(\"reading done: MCP autoIODirOff: %t, address: 0x%X, register:0x%X, name: %s, value: 0x%X\\n\",\n\t\t\td.mcpBehav.autoIODirOff, d.GetAddressOrDefault(mcp23017DefaultAddress), reg, d.getRegName(reg), val)\n\t}\n\treturn val, nil\n}\n\n// getPort return the port (A or B) given a string and the bank.\n// Port A is the default if an incorrect or no port is specified.\nfunc (d *MCP23017Driver) getPort(portStr string) port {\n\tportStr = strings.ToUpper(portStr)\n\tswitch portStr {\n\tcase \"A\":\n\t\treturn mcp23017GetBank(d.mcpConf.bank).portA\n\tcase \"B\":\n\t\treturn mcp23017GetBank(d.mcpConf.bank).portB\n\tdefault:\n\t\treturn mcp23017GetBank(d.mcpConf.bank).portA\n\t}\n}\n\n// getRegName returns the name of the given register related to the configured bank\n// and can be used to write nice debug messages\nfunc (d *MCP23017Driver) getRegName(reg uint8) string {\n\tb := mcp23017GetBank(d.mcpConf.bank)\n\tportStr := \"A\"\n\tregStr := \"unknown\"\n\n\tfor i := 1; i <= 2; i++ {\n\t\tif regStr == \"unknown\" {\n\t\t\tp := b.portA\n\t\t\tif i == 2 {\n\t\t\t\tp = b.portB\n\t\t\t\tportStr = \"B\"\n\t\t\t}\n\t\t\tswitch reg {\n\t\t\tcase p.IODIR:\n\t\t\t\tregStr = \"IODIR\"\n\t\t\tcase p.IPOL:\n\t\t\t\tregStr = \"IPOL\"\n\t\t\tcase p.GPINTEN:\n\t\t\t\tregStr = \"GPINTEN\"\n\t\t\tcase p.DEFVAL:\n\t\t\t\tregStr = \"DEFVAL\"\n\t\t\tcase p.INTCON:\n\t\t\t\tregStr = \"INTCON\"\n\t\t\tcase p.IOCON:\n\t\t\t\tregStr = \"IOCON\"\n\t\t\tcase p.GPPU:\n\t\t\t\tregStr = \"GPPU\"\n\t\t\tcase p.INTF:\n\t\t\t\tregStr = \"INTF\"\n\t\t\tcase p.INTCAP:\n\t\t\t\tregStr = \"INTCAP\"\n\t\t\tcase p.GPIO:\n\t\t\t\tregStr = \"GPIO\"\n\t\t\tcase p.OLAT:\n\t\t\t\tregStr = \"OLAT\"\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fmt.Sprintf(\"%s_%s\", regStr, portStr)\n}\n\n// getUint8Value returns the configuration data as a packed value.\nfunc (dc *mcp23017Config) getUint8Value() uint8 {\n\treturn dc.bank<<7 | dc.mirror<<6 | dc.seqop<<5 | dc.disslw<<4 | dc.haen<<3 | dc.odr<<2 | dc.intpol<<1\n}\n\n// mcp23017GetBank returns a bank's PortA and PortB registers given a bank number (0/1).\nfunc mcp23017GetBank(bnk uint8) bank {\n\tif bnk == 0 {\n\t\treturn bank{\n\t\t\tportA: port{0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14},\n\t\t\tportB: port{0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x11, 0x13, 0x15},\n\t\t}\n\t}\n\treturn bank{\n\t\tportA: port{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A},\n\t\tportB: port{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A},\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/mcp23017_driver_test.go",
    "content": "//nolint:forcetypeassert,gosec // ok here\npackage i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP23017Driver)(nil)\n\nvar pinValPort = map[string]interface{}{\n\t\"pin\":  uint8(7),\n\t\"val\":  uint8(0),\n\t\"port\": \"A\",\n}\n\nvar pinPort = map[string]interface{}{\n\t\"pin\":  uint8(7),\n\t\"port\": \"A\",\n}\n\nfunc initTestMCP23017(b uint8) *MCP23017Driver {\n\t// create the driver without starting it\n\ta := newI2cTestAdaptor()\n\td := NewMCP23017Driver(a, WithMCP23017Bank(b))\n\treturn d\n}\n\nfunc initTestMCP23017WithStubbedAdaptor(b uint8) (*MCP23017Driver, *i2cTestAdaptor) { //nolint:unparam // keep for tests\n\t// create the driver, ready to use for tests\n\ta := newI2cTestAdaptor()\n\td := NewMCP23017Driver(a, WithMCP23017Bank(b))\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP23017Driver(t *testing.T) {\n\tvar di interface{} = NewMCP23017Driver(newI2cTestAdaptor())\n\td, ok := di.(*MCP23017Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP23017Driver() should have returned a *MCP23017Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP23017\"))\n\tassert.Equal(t, 0x20, d.defaultAddress)\n\tassert.NotNil(t, d.mcpConf)\n\tassert.NotNil(t, d.mcpBehav)\n}\n\nfunc TestMCP23017Halt(t *testing.T) {\n\td := NewMCP23017Driver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestWithMCP23017Bank(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017Bank(1))\n\tassert.Equal(t, uint8(1), b.mcpConf.bank)\n}\n\nfunc TestWithMCP23017Mirror(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017Mirror(1))\n\tassert.Equal(t, uint8(1), b.mcpConf.mirror)\n}\n\nfunc TestWithMCP23017Seqop(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017Seqop(1))\n\tassert.Equal(t, uint8(1), b.mcpConf.seqop)\n}\n\nfunc TestWithMCP23017Disslw(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017Disslw(1))\n\tassert.Equal(t, uint8(1), b.mcpConf.disslw)\n}\n\nfunc TestWithMCP23017Haen(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017Haen(1))\n\tassert.Equal(t, uint8(1), b.mcpConf.haen)\n}\n\nfunc TestWithMCP23017Odr(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017Odr(1))\n\tassert.Equal(t, uint8(1), b.mcpConf.odr)\n}\n\nfunc TestWithMCP23017Intpol(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017Intpol(1))\n\tassert.Equal(t, uint8(1), b.mcpConf.intpol)\n}\n\nfunc TestWithMCP23017ForceRefresh(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017ForceRefresh(1))\n\tassert.True(t, b.mcpBehav.forceRefresh)\n}\n\nfunc TestWithMCP23017AutoIODirOff(t *testing.T) {\n\tb := NewMCP23017Driver(newI2cTestAdaptor(), WithMCP23017AutoIODirOff(1))\n\tassert.True(t, b.mcpBehav.autoIODirOff)\n}\n\nfunc TestMCP23017CommandsWriteGPIO(t *testing.T) {\n\t// arrange\n\td, _ := initTestMCP23017WithStubbedAdaptor(0)\n\t// act\n\tresult := d.Command(\"WriteGPIO\")(pinValPort)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestMCP23017CommandsReadGPIO(t *testing.T) {\n\t// arrange\n\td, _ := initTestMCP23017WithStubbedAdaptor(0)\n\t// act\n\tresult := d.Command(\"ReadGPIO\")(pinPort)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestMCP23017WriteGPIO(t *testing.T) {\n\t// sequence to write (we force the refresh by preset with inverse bit state):\n\t// * read current state of IODIR (write reg, read val) => see also SetPinMode()\n\t// * set IODIR of pin to input (manipulate val, write reg, write val) => see also SetPinMode()\n\t// * read current state of OLAT (write reg, read val)\n\t// * write OLAT (manipulate val, write reg, write val)\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\ttestPort := \"A\"\n\t\ttestPin := uint8(7)\n\t\twantReg1 := uint8(0x00)             // IODIRA\n\t\twantReg2 := uint8(0x14)             // OLATA\n\t\treturnRead := []uint8{0xFF, 0xFF}   // emulate all IO's are inputs, emulate bit is on\n\t\twantReg1Val := returnRead[0] & 0x7F // IODIRA: bit 7 reset, all other untouched\n\t\twantReg2Val := returnRead[1] & 0x7F // OLATA: bit 7 reset, all other untouched\n\t\tif bitState == 1 {\n\t\t\treturnRead[1] = 0x7F               // emulate bit is off\n\t\t\twantReg2Val = returnRead[1] | 0x80 // OLATA: bit 7 set, all other untouched\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead[numCallsRead-1]\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\terr := d.WriteGPIO(testPin, testPort, uint8(bitState))\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Len(t, a.written, 6)\n\t\tassert.Equal(t, wantReg1, a.written[0])\n\t\tassert.Equal(t, wantReg1, a.written[1])\n\t\tassert.Equal(t, wantReg1Val, a.written[2])\n\t\tassert.Equal(t, wantReg2, a.written[3])\n\t\tassert.Equal(t, wantReg2, a.written[4])\n\t\tassert.Equal(t, wantReg2Val, a.written[5])\n\t\tassert.Equal(t, 2, numCallsRead)\n\t}\n}\n\nfunc TestMCP23017WriteGPIONoRefresh(t *testing.T) {\n\t// sequence to write with take advantage of refresh optimization (see forceRefresh):\n\t// * read current state of IODIR (write reg, read val) => by SetPinMode()\n\t// * read current state of OLAT (write reg, read val)\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\ttestPort := \"B\"\n\t\ttestPin := uint8(3)\n\t\twantReg1 := uint8(0x01)           // IODIRB\n\t\twantReg2 := uint8(0x15)           // OLATB\n\t\treturnRead := []uint8{0xF7, 0xF7} // emulate all IO's are inputs except pin 3, emulate bit is already off\n\t\tif bitState == 1 {\n\t\t\treturnRead[1] = 0x08 // emulate bit is already on\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead[numCallsRead-1]\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\terr := d.WriteGPIO(testPin, testPort, uint8(bitState))\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Len(t, a.written, 2)\n\t\tassert.Equal(t, wantReg1, a.written[0])\n\t\tassert.Equal(t, wantReg2, a.written[1])\n\t\tassert.Equal(t, 2, numCallsRead)\n\t}\n}\n\nfunc TestMCP23017WriteGPIONoAutoDir(t *testing.T) {\n\t// sequence to write with suppressed automatic setting of IODIR:\n\t// * read current state of OLAT (write reg, read val)\n\t// * write OLAT (manipulate val, write reg, write val)\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\td.mcpBehav.autoIODirOff = true\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\ttestPort := \"A\"\n\t\ttestPin := uint8(7)\n\t\twantReg := uint8(0x14)          // OLATA\n\t\treturnRead := uint8(0xFF)       // emulate bit is on\n\t\twantRegVal := returnRead & 0x7F // OLATA: bit 7 reset, all other untouched\n\t\tif bitState == 1 {\n\t\t\treturnRead = 0x7F              // emulate bit is off\n\t\t\twantRegVal = returnRead | 0x80 // OLATA: bit 7 set, all other untouched\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\terr := d.WriteGPIO(testPin, testPort, uint8(bitState))\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Len(t, a.written, 3)\n\t\tassert.Equal(t, wantReg, a.written[0])\n\t\tassert.Equal(t, wantReg, a.written[1])\n\t\tassert.Equal(t, wantRegVal, a.written[2])\n\t\tassert.Equal(t, 1, numCallsRead)\n\t}\n}\n\nfunc TestMCP23017CommandsWriteGPIOErrIODIR(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act\n\terr := d.WriteGPIO(7, \"A\", 0)\n\t// assert\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=0): write error\")\n}\n\nfunc TestMCP23017CommandsWriteGPIOErrOLAT(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tnumCalls := 1\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tif numCalls == 2 {\n\t\t\treturn 0, errors.New(\"write error\")\n\t\t}\n\t\tnumCalls++\n\t\treturn 0, nil\n\t}\n\t// act\n\terr := d.WriteGPIO(7, \"A\", 0)\n\t// assert\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=20): write error\")\n}\n\nfunc TestMCP23017ReadGPIO(t *testing.T) {\n\t// sequence to read:\n\t// * read current state of IODIR (write reg, read val) => see also SetPinMode()\n\t// * set IODIR of pin to input (manipulate val, write reg, write val) => see also SetPinMode()\n\t// * read GPIO (write reg, read val)\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\ttestPort := \"A\"\n\t\ttestPin := uint8(7)\n\t\twantReg1 := uint8(0x00)             // IODIRA\n\t\twantReg2 := uint8(0x12)             // GPIOA\n\t\treturnRead := []uint8{0x00, 0x7F}   // emulate all IO's are outputs, emulate bit is off\n\t\twantReg1Val := returnRead[0] | 0x80 // IODIRA: bit 7 set, all other untouched\n\t\tif bitState == 1 {\n\t\t\treturnRead[1] = 0xFF // emulate bit is set\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead[numCallsRead-1]\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\tval, err := d.ReadGPIO(testPin, testPort)\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Equal(t, 2, numCallsRead)\n\t\tassert.Len(t, a.written, 4)\n\t\tassert.Equal(t, wantReg1, a.written[0])\n\t\tassert.Equal(t, wantReg1, a.written[1])\n\t\tassert.Equal(t, wantReg1Val, a.written[2])\n\t\tassert.Equal(t, wantReg2, a.written[3])\n\t\tassert.Equal(t, uint8(bitState), val)\n\t}\n}\n\nfunc TestMCP23017ReadGPIONoRefresh(t *testing.T) {\n\t// sequence to read with take advantage of refresh optimization (see forceRefresh):\n\t// * read current state of IODIR (write reg, read val) => by SetPinMode()\n\t// * read GPIO (write reg, read val)\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\ttestPort := \"A\"\n\t\ttestPin := uint8(7)\n\t\twantReg1 := uint8(0x00)           // IODIRA\n\t\twantReg2 := uint8(0x12)           // GPIOA\n\t\treturnRead := []uint8{0x80, 0x7F} // emulate all IO's are outputs except pin 7, emulate bit is off\n\t\tif bitState == 1 {\n\t\t\treturnRead[1] = 0xFF // emulate bit is set\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead[numCallsRead-1]\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\tval, err := d.ReadGPIO(testPin, testPort)\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Equal(t, 2, numCallsRead)\n\t\tassert.Len(t, a.written, 2)\n\t\tassert.Equal(t, wantReg1, a.written[0])\n\t\tassert.Equal(t, wantReg2, a.written[1])\n\t\tassert.Equal(t, uint8(bitState), val)\n\t}\n}\n\nfunc TestMCP23017ReadGPIONoAutoDir(t *testing.T) {\n\t// sequence to read with suppressed automatic setting of IODIR:\n\t// * read GPIO (write reg, read val)\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\td.mcpBehav.autoIODirOff = true\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\ttestPort := \"A\"\n\t\ttestPin := uint8(7)\n\t\twantReg2 := uint8(0x12)   // GPIOA\n\t\treturnRead := uint8(0x7F) // emulate bit is off\n\t\tif bitState == 1 {\n\t\t\treturnRead = 0xFF // emulate bit is set\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\tval, err := d.ReadGPIO(testPin, testPort)\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Equal(t, 1, numCallsRead)\n\t\tassert.Len(t, a.written, 1)\n\t\tassert.Equal(t, wantReg2, a.written[0])\n\t\tassert.Equal(t, uint8(bitState), val)\n\t}\n}\n\nfunc TestMCP23017ReadGPIOErr(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\t// arrange reads\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), errors.New(\"read error\")\n\t}\n\t// act\n\t_, err := d.ReadGPIO(7, \"A\")\n\t// assert\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=0): read error\")\n}\n\nfunc TestMCP23017SetPinMode(t *testing.T) {\n\t// sequence for setting pin direction:\n\t// * read current state of IODIR (write reg, read val)\n\t// * set IODIR of pin to input or output (manipulate val, write reg, write val)\n\t// TODO: can be optimized by not writing, when value is already fine\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\ttestPort := \"A\"\n\t\ttestPin := uint8(7)\n\t\twantReg := uint8(0x00)          // IODIRA\n\t\treturnRead := uint8(0xFF)       // emulate all ports are inputs\n\t\twantRegVal := returnRead & 0x7F // bit 7 reset, all other untouched\n\t\tif bitState == 1 {\n\t\t\treturnRead = 0x00              // emulate all ports are outputs\n\t\t\twantRegVal = returnRead | 0x80 // bit 7 set, all other untouched\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\terr := d.SetPinMode(testPin, testPort, uint8(bitState))\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Len(t, a.written, 3)\n\t\tassert.Equal(t, wantReg, a.written[0])\n\t\tassert.Equal(t, wantReg, a.written[1])\n\t\tassert.Equal(t, wantRegVal, a.written[2])\n\t\tassert.Equal(t, 1, numCallsRead)\n\t}\n}\n\nfunc TestMCP23017SetPinModeErr(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act\n\terr := d.SetPinMode(7, \"A\", 0)\n\t// assert\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=0): write error\")\n}\n\nfunc TestMCP23017SetPullUp(t *testing.T) {\n\t// sequence for setting input pin pull up:\n\t// * read current state of GPPU (write reg, read val)\n\t// * set GPPU of pin to target state (manipulate val, write reg, write val)\n\t// TODO: can be optimized by not writing, when value is already fine\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start()\n\t\t// arrange some values\n\t\ttestPort := \"A\"\n\t\twantReg := uint8(0x0C) // GPPUA\n\t\ttestPin := uint8(5)\n\t\treturnRead := uint8(0xFF)       // emulate all I's with pull up\n\t\twantSetVal := returnRead & 0xDF // bit 5 cleared, all other unchanged\n\t\tif bitState == 1 {\n\t\t\treturnRead = uint8(0x00)       // emulate all I's without pull up\n\t\t\twantSetVal = returnRead | 0x20 // bit 5 set, all other unchanged\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\terr := d.SetPullUp(testPin, testPort, uint8(bitState))\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Len(t, a.written, 3)\n\t\tassert.Equal(t, wantReg, a.written[0])\n\t\tassert.Equal(t, wantReg, a.written[1])\n\t\tassert.Equal(t, wantSetVal, a.written[2])\n\t\tassert.Equal(t, 1, numCallsRead)\n\t}\n}\n\nfunc TestMCP23017SetPullUpErr(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act\n\terr := d.SetPullUp(7, \"A\", 0)\n\t// assert\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=12): write error\")\n}\n\nfunc TestMCP23017SetGPIOPolarity(t *testing.T) {\n\t// sequence for setting input pin polarity:\n\t// * read current state of IPOL (write reg, read val)\n\t// * set IPOL of pin to target state (manipulate val, write reg, write val)\n\t// TODO: can be optimized by not writing, when value is already fine\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start()\n\t\t// arrange some values\n\t\ttestPort := \"B\"\n\t\twantReg := uint8(0x03) // IPOLB\n\t\ttestPin := uint8(6)\n\t\treturnRead := uint8(0xFF)       // emulate all I's negotiated\n\t\twantSetVal := returnRead & 0xBF // bit 6 cleared, all other unchanged\n\t\tif bitState == 1 {\n\t\t\treturnRead = uint8(0x00)       // emulate all I's not negotiated\n\t\t\twantSetVal = returnRead | 0x40 // bit 6 set, all other unchanged\n\t\t}\n\t\t// arrange reads\n\t\tnumCallsRead := 0\n\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\tnumCallsRead++\n\t\t\tb[len(b)-1] = returnRead\n\t\t\treturn len(b), nil\n\t\t}\n\t\t// act\n\t\terr := d.SetGPIOPolarity(testPin, testPort, uint8(bitState))\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Len(t, a.written, 3)\n\t\tassert.Equal(t, wantReg, a.written[0])\n\t\tassert.Equal(t, wantReg, a.written[1])\n\t\tassert.Equal(t, wantSetVal, a.written[2])\n\t\tassert.Equal(t, 1, numCallsRead)\n\t}\n}\n\nfunc TestMCP23017SetGPIOPolarityErr(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act\n\terr := d.SetGPIOPolarity(7, \"A\", 0)\n\t// assert\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=2): write error\")\n}\n\nfunc TestMCP23017_write(t *testing.T) {\n\t// clear bit\n\td, _ := initTestMCP23017WithStubbedAdaptor(0)\n\tport := d.getPort(\"A\")\n\terr := d.writePin(port.IODIR, uint8(7), 0)\n\trequire.NoError(t, err)\n\n\t// set bit\n\td, _ = initTestMCP23017WithStubbedAdaptor(0)\n\tport = d.getPort(\"B\")\n\terr = d.writePin(port.IODIR, uint8(7), 1)\n\trequire.NoError(t, err)\n\n\t// write error\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\terr = d.writePin(port.IODIR, uint8(7), 0)\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=1): write error\")\n\n\t// read error\n\td, a = initTestMCP23017WithStubbedAdaptor(0)\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), errors.New(\"read error\")\n\t}\n\terr = d.writePin(port.IODIR, uint8(7), 0)\n\trequire.ErrorContains(t, err, \"MCP write-read: MCP write-ReadByteData(reg=1): read error\")\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\terr = d.writePin(port.IODIR, uint8(7), 1)\n\trequire.NoError(t, err)\n}\n\nfunc TestMCP23017_read(t *testing.T) {\n\t// read\n\td, a := initTestMCP23017WithStubbedAdaptor(0)\n\tport := d.getPort(\"A\")\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{255})\n\t\treturn 1, nil\n\t}\n\tval, _ := d.readReg(port.IODIR)\n\tassert.Equal(t, uint8(255), val)\n\n\t// read error\n\td, a = initTestMCP23017WithStubbedAdaptor(0)\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), errors.New(\"read error\")\n\t}\n\n\tval, err := d.readReg(port.IODIR)\n\tassert.Equal(t, uint8(0), val)\n\trequire.ErrorContains(t, err, \"MCP write-ReadByteData(reg=0): read error\")\n\n\t// read\n\td, a = initTestMCP23017WithStubbedAdaptor(0)\n\tport = d.getPort(\"A\")\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{255})\n\t\treturn 1, nil\n\t}\n\tval, _ = d.readReg(port.IODIR)\n\tassert.Equal(t, uint8(255), val)\n}\n\nfunc TestMCP23017_getPort(t *testing.T) {\n\t// port A\n\td := initTestMCP23017(0)\n\twantPort := mcp23017GetBank(0).portA\n\tgotPort := d.getPort(\"A\")\n\tassert.Equal(t, wantPort, gotPort)\n\n\t// port B\n\td = initTestMCP23017(0)\n\twantPort = mcp23017GetBank(0).portB\n\tgotPort = d.getPort(\"B\")\n\tassert.Equal(t, wantPort, gotPort)\n\n\t// default\n\td = initTestMCP23017(0)\n\twantPort = mcp23017GetBank(0).portA\n\tgotPort = d.getPort(\"\")\n\tassert.Equal(t, wantPort, gotPort)\n\n\t// port A bank 1\n\td = initTestMCP23017(1)\n\twantPort = mcp23017GetBank(1).portA\n\tgotPort = d.getPort(\"\")\n\tassert.Equal(t, wantPort, gotPort)\n}\n"
  },
  {
    "path": "drivers/i2c/mfrc522_driver.go",
    "content": "package i2c\n\nimport (\n\t\"gobot.io/x/gobot/v2/drivers/common/mfrc522\"\n)\n\nconst mfrc522DefaultAddress = 0x00\n\n// MFRC522Driver is a wrapper for i2c bus usage. Please refer to the mfrc522.MFRC522Common package\n// for implementation details.\ntype MFRC522Driver struct {\n\t*Driver\n\t*mfrc522.MFRC522Common\n}\n\n// NewMFRC522Driver creates a new Gobot Driver for MFRC522 RFID with i2c connection\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewMFRC522Driver(c Connector, options ...func(Config)) *MFRC522Driver {\n\td := &MFRC522Driver{\n\t\tDriver: NewDriver(c, \"MFRC522\", mfrc522DefaultAddress),\n\t}\n\td.MFRC522Common = mfrc522.NewMFRC522Common()\n\td.afterStart = d.initialize\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\nfunc (d *MFRC522Driver) initialize() error {\n\treturn d.Initialize(d.connection)\n}\n"
  },
  {
    "path": "drivers/i2c/mma7660_driver.go",
    "content": "package i2c\n\nconst mma7660DefaultAddress = 0x4c\n\nconst (\n\tMMA7660_X              = 0x00\n\tMMA7660_Y              = 0x01\n\tMMA7660_Z              = 0x02\n\tMMA7660_TILT           = 0x03\n\tMMA7660_SRST           = 0x04\n\tMMA7660_SPCNT          = 0x05\n\tMMA7660_INTSU          = 0x06\n\tMMA7660_MODE           = 0x07\n\tMMA7660_STAND_BY       = 0x00\n\tMMA7660_ACTIVE         = 0x01\n\tMMA7660_SR             = 0x08\n\tMMA7660_AUTO_SLEEP_120 = 0x00\n\tMMA7660_AUTO_SLEEP_64  = 0x01\n\tMMA7660_AUTO_SLEEP_32  = 0x02\n\tMMA7660_AUTO_SLEEP_16  = 0x03\n\tMMA7660_AUTO_SLEEP_8   = 0x04\n\tMMA7660_AUTO_SLEEP_4   = 0x05\n\tMMA7660_AUTO_SLEEP_2   = 0x06\n\tMMA7660_AUTO_SLEEP_1   = 0x07\n\tMMA7660_PDET           = 0x09\n\tMMA7660_PD             = 0x0A\n)\n\ntype MMA7660Driver struct {\n\t*Driver\n}\n\n// NewMMA7660Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewMMA7660Driver(c Connector, options ...func(Config)) *MMA7660Driver {\n\td := &MMA7660Driver{\n\t\tDriver: NewDriver(c, \"MMA7660\", mma7660DefaultAddress),\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: add commands for API\n\treturn d\n}\n\n// Acceleration returns the acceleration of the provided x, y, z\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *MMA7660Driver) Acceleration(x, y, z float64) (ax, ay, az float64) {\n\treturn x / 21.0, y / 21.0, z / 21.0\n}\n\n// XYZ returns the raw x,y and z axis from the mma7660\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *MMA7660Driver) XYZ() (x float64, y float64, z float64, err error) {\n\tbuf := []byte{0, 0, 0}\n\tbytesRead, err := d.read(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif bytesRead != 3 {\n\t\terr = ErrNotEnoughBytes\n\t\treturn\n\t}\n\n\tfor _, val := range buf {\n\t\tif ((val >> 6) & 0x01) == 1 {\n\t\t\terr = ErrNotReady\n\t\t\treturn\n\t\t}\n\t}\n\n\tx = float64((int8(buf[0]) << 2)) / 4.0\n\ty = float64((int8(buf[1]) << 2)) / 4.0\n\tz = float64((int8(buf[2]) << 2)) / 4.0\n\n\treturn\n}\n\nfunc (d *MMA7660Driver) initialize() error {\n\tif _, err := d.write([]byte{MMA7660_MODE, MMA7660_STAND_BY}); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.write([]byte{MMA7660_SR, MMA7660_AUTO_SLEEP_32}); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.write([]byte{MMA7660_MODE, MMA7660_ACTIVE}); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/mma7660_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MMA7660Driver)(nil)\n\nfunc initTestMMA7660DriverWithStubbedAdaptor() (*MMA7660Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewMMA7660Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMMA7660Driver(t *testing.T) {\n\tvar di interface{} = NewMMA7660Driver(newI2cTestAdaptor())\n\td, ok := di.(*MMA7660Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMMA7660Driver() should have returned a *MMA7660Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MMA7660\"))\n\tassert.Equal(t, 0x4c, d.defaultAddress)\n}\n\nfunc TestMMA7660Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewMMA7660Driver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestMMA7660Start(t *testing.T) {\n\td := NewMMA7660Driver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestMMA7660Halt(t *testing.T) {\n\t// arrange\n\td := NewMMA7660Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMMA7660Acceleration(t *testing.T) {\n\td, _ := initTestMMA7660DriverWithStubbedAdaptor()\n\tx, y, z := d.Acceleration(21.0, 21.0, 21.0)\n\tassert.InDelta(t, 1.0, x, 0.0)\n\tassert.InDelta(t, 1.0, y, 0.0)\n\tassert.InDelta(t, 1.0, z, 0.0)\n}\n\nfunc TestMMA7660NullXYZ(t *testing.T) {\n\td, _ := initTestMMA7660DriverWithStubbedAdaptor()\n\n\tx, y, z, _ := d.XYZ()\n\tassert.InDelta(t, 0.0, x, 0.0)\n\tassert.InDelta(t, 0.0, y, 0.0)\n\tassert.InDelta(t, 0.0, z, 0.0)\n}\n\nfunc TestMMA7660XYZ(t *testing.T) {\n\td, a := initTestMMA7660DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{0x11, 0x12, 0x13})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\n\tx, y, z, _ := d.XYZ()\n\tassert.InDelta(t, 17.0, x, 0.0)\n\tassert.InDelta(t, 18.0, y, 0.0)\n\tassert.InDelta(t, 19.0, z, 0.0)\n}\n\nfunc TestMMA7660XYZError(t *testing.T) {\n\td, a := initTestMMA7660DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\tx, y, z, err := d.XYZ()\n\trequire.ErrorContains(t, err, \"read error\")\n\tassert.InDelta(t, 0.0, x, 0.0)\n\tassert.InDelta(t, 0.0, y, 0.0)\n\tassert.InDelta(t, 0.0, z, 0.0)\n}\n\nfunc TestMMA7660XYZNotReady(t *testing.T) {\n\td, a := initTestMMA7660DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{0x40, 0x40, 0x40})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\n\tx, y, z, err := d.XYZ()\n\tassert.Equal(t, ErrNotReady, err)\n\tassert.InDelta(t, 0.0, x, 0.0)\n\tassert.InDelta(t, 0.0, y, 0.0)\n\tassert.InDelta(t, 0.0, z, 0.0)\n}\n"
  },
  {
    "path": "drivers/i2c/mpl115a2_driver.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst mpl115a2DefaultAddress = 0x60\n\nconst (\n\tmpl115A2Reg_PressureMSB = 0x00 // first ADC register\n\tmpl115A2Reg_PressureLSB = 0x01\n\tmpl115A2Reg_TempMSB     = 0x02\n\tmpl115A2Reg_TempLSB     = 0x03\n\n\tmpl115A2Reg_A0_MSB  = 0x04 // first coefficient register\n\tmpl115A2Reg_A0_LSB  = 0x05\n\tmpl115A2Reg_B1_MSB  = 0x06\n\tmpl115A2Reg_B1_LSB  = 0x07\n\tmpl115A2Reg_B2_MSB  = 0x08\n\tmpl115A2Reg_B2_LSB  = 0x09\n\tmpl115A2Reg_C12_MSB = 0x0A\n\tmpl115A2Reg_C12_LSB = 0x0B\n\n\tmpl115A2Reg_StartConversion = 0x12\n)\n\n// MPL115A2Driver is a Gobot Driver for the MPL115A2 I2C digital pressure/temperature sensor.\n// datasheet:\n// https://www.nxp.com/docs/en/data-sheet/MPL115A2.pdf\n//\n// reference implementations:\n// * https://github.com/adafruit/Adafruit_MPL115A2\ntype MPL115A2Driver struct {\n\t*Driver\n\tgobot.Eventer\n\n\ta0  float32\n\tb1  float32\n\tb2  float32\n\tc12 float32\n}\n\n// NewMPL115A2Driver creates a new Gobot Driver for an MPL115A2\n// I2C Pressure/Temperature sensor.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewMPL115A2Driver(c Connector, options ...func(Config)) *MPL115A2Driver {\n\td := &MPL115A2Driver{\n\t\tDriver:  NewDriver(c, \"MPL115A2\", mpl115a2DefaultAddress),\n\t\tEventer: gobot.NewEventer(),\n\t}\n\td.afterStart = d.initialization\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: add commands to API\n\td.AddEvent(Error)\n\n\treturn d\n}\n\n// Pressure fetches the latest data from the MPL115A2, and returns the pressure in kPa\nfunc (d *MPL115A2Driver) Pressure() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tp, _, err := d.getData()\n\treturn p, err\n}\n\n// Temperature fetches the latest data from the MPL115A2, and returns the temperature in °C\nfunc (d *MPL115A2Driver) Temperature() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t_, t, err := d.getData()\n\treturn t, err\n}\n\nfunc (d *MPL115A2Driver) initialization() error {\n\tdata := make([]byte, 8)\n\tif err := d.readBlockData(mpl115A2Reg_A0_MSB, data); err != nil {\n\t\treturn err\n\t}\n\n\tvar coA0 int16\n\tvar coB1 int16\n\tvar coB2 int16\n\tvar coC12 int16\n\n\tbuf := bytes.NewBuffer(data)\n\tif err := binary.Read(buf, binary.BigEndian, &coA0); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &coB1); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &coB2); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &coC12); err != nil {\n\t\treturn err\n\t}\n\n\tcoC12 = coC12 >> 2\n\n\td.a0 = float32(coA0) / 8.0\n\td.b1 = float32(coB1) / 8192.0\n\td.b2 = float32(coB2) / 16384.0\n\td.c12 = float32(coC12) / 4194304.0\n\n\treturn nil\n}\n\n// getData fetches the latest data from the MPL115A2\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *MPL115A2Driver) getData() (p, t float32, err error) {\n\tvar temperature uint16\n\tvar pressure uint16\n\tvar pressureComp float32\n\n\tif err = d.writeByteData(mpl115A2Reg_StartConversion, 0); err != nil {\n\t\treturn 0, 0, err\n\t}\n\ttime.Sleep(5 * time.Millisecond)\n\n\tdata := []byte{0, 0, 0, 0}\n\tif err = d.readBlockData(mpl115A2Reg_PressureMSB, data); err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\tbuf := bytes.NewBuffer(data)\n\tif err := binary.Read(buf, binary.BigEndian, &pressure); err != nil {\n\t\treturn 0, 0, err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &temperature); err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\ttemperature = temperature >> 6\n\tpressure = pressure >> 6\n\n\tpressureComp = d.a0 + (d.b1+d.c12*float32(temperature))*float32(pressure) + d.b2*float32(temperature)\n\tp = (65.0/1023.0)*pressureComp + 50.0\n\tt = ((float32(temperature) - 498.0) / -5.35) + 25.0\n\n\treturn p, t, err\n}\n"
  },
  {
    "path": "drivers/i2c/mpl115a2_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MPL115A2Driver)(nil)\n\nfunc initTestMPL115A2DriverWithStubbedAdaptor() (*MPL115A2Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\treturn NewMPL115A2Driver(a), a\n}\n\nfunc TestNewMPL115A2Driver(t *testing.T) {\n\tvar di interface{} = NewMPL115A2Driver(newI2cTestAdaptor())\n\td, ok := di.(*MPL115A2Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMPL115A2Driver() should have returned a *MPL115A2Driver\")\n\t}\n\tassert.NotNil(t, d.Connection())\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MPL115A2\"))\n\tassert.Equal(t, 0x60, d.defaultAddress)\n}\n\nfunc TestMPL115A2Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewMPL115A2Driver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestMPL115A2Halt(t *testing.T) {\n\t// arrange\n\td := NewMPL115A2Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMPL115A2ReadData(t *testing.T) {\n\t// sequence for read data\n\t// * retrieve the coefficients for temperature compensation of pressure - see test for Start()\n\t// * write start conversion register address (0x12)\n\t// * write start value - 0x00\n\t// * wait at least 3 ms according to data sheet (tc - conversion time)\n\t// * write pressure MSB register address (0x00)\n\t// * read pressure (16 bit, order MSB-LSB)\n\t// * read temperature (16 bit, order MSB-LSB)\n\t// * calculate temperature compensated pressure in kPa according to data sheet\n\t//   * shift the temperature value right for 6 bits (resolution is 10 bit)\n\t//   * shift the pressure value right for 6 bits (resolution is 10 bit)\n\t// * calculate temperature in °C according to this implementation:\n\t//   https://github.com/adafruit/Adafruit_MPL115A2/tree/2.0.2/Adafruit_MPL115A2.cpp\n\t//\n\t// arrange\n\td, a := initTestMPL115A2DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\ta.written = []byte{}\n\t// arrange coefficients according the example from data sheet\n\td.a0 = 2009.75\n\td.b1 = -2.37585\n\td.b2 = -0.92047\n\td.c12 = 0.00079\n\treadReturnP := []byte{0x66, 0x80, 0x7E, 0xC0} // use example from data sheet\n\treadReturnT := []byte{0x00, 0x00, 0x7E, 0xC0} // use example from data sheet\n\treadCallCounter := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treadCallCounter++\n\t\tif readCallCounter == 1 {\n\t\t\tcopy(b, readReturnP)\n\t\t}\n\t\tif readCallCounter == 2 {\n\t\t\tcopy(b, readReturnT)\n\t\t}\n\t\treturn len(b), nil\n\t}\n\n\t// act\n\tpress, errP := d.Pressure()\n\ttemp, errT := d.Temperature()\n\t// assert\n\trequire.NoError(t, errP)\n\trequire.NoError(t, errT)\n\tassert.Equal(t, 2, readCallCounter)\n\tassert.Len(t, a.written, 6)\n\tassert.Equal(t, uint8(0x12), a.written[0])\n\tassert.Equal(t, uint8(0x00), a.written[1])\n\tassert.Equal(t, uint8(0x00), a.written[2])\n\tassert.Equal(t, uint8(0x12), a.written[3])\n\tassert.Equal(t, uint8(0x00), a.written[4])\n\tassert.Equal(t, uint8(0x00), a.written[5])\n\tassert.InDelta(t, float32(96.585915), press, 1.0e-5)\n\tassert.InDelta(t, float32(23.317757), temp, 0.0)\n}\n\nfunc TestMPL115A2ReadDataError(t *testing.T) {\n\td, a := initTestMPL115A2DriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t_, err := d.Pressure()\n\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestMPL115A2_initialization(t *testing.T) {\n\t// sequence for initialization the device on Start(), which calculates\n\t// the coefficients for temperature compensation of pressure\n\t// * write coefficient A0 MSB register address (0x04)\n\t// * read all 4 coefficients (16 bit, order MSB-LSB)\n\t// * write signal path reset register address (0x68)\n\t// * calculate A0, B1, B2, C12 according to data sheet\n\t//\n\t// arrange\n\td, a := initTestMPL115A2DriverWithStubbedAdaptor()\n\treadCallCounter := 0\n\treadReturn := []byte{0x3E, 0xCE, 0xB3, 0xF9, 0xC5, 0x17, 0x33, 0xC8} // use example from data sheet\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treadCallCounter++\n\t\tcopy(b, readReturn)\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialization() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, readCallCounter)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(0x04), a.written[0])\n\tassert.InDelta(t, float32(2009.75), d.a0, 0.0)\n\tassert.InDelta(t, float32(-2.3758545), d.b1, 0.0)\n\tassert.InDelta(t, float32(-0.9204712), d.b2, 0.0)\n\tassert.InDelta(t, float32(0.0007901192), d.c12, 0.0)\n}\n"
  },
  {
    "path": "drivers/i2c/mpu6050_driver.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n)\n\nconst (\n\tmpu6050Debug                = false\n\tmpu6050DefaultAddress       = 0x68\n\tmpu6050EarthStandardGravity = 9.80665 // [m/s²] standard gravity (pole: 9.834,  equator: 9.764)\n)\n\ntype (\n\tMPU6050DlpfConfig      uint8\n\tMPU6050FrameSyncConfig uint8\n\tMPU6050GyroFsConfig    uint8\n\tMPU6050AccelFsConfig   uint8\n\tMPU6050Pwr1ClockConfig uint8\n)\n\nconst (\n\tmpu6050Reg_GeneralConfig   = 0x1A // external frame synchronization and digital low pass filter\n\tmpu6050Reg_GyroConfig      = 0x1B // self test and full scale range\n\tmpu6050Reg_AccelConfig     = 0x1C // self test and full scale range\n\tmpu6050Reg_AccelXoutH      = 0x3B // first data register\n\tmpu6050Reg_SignalPathReset = 0x68\n\tmpu6050Reg_PwrMgmt1        = 0x6B\n\n\tMPU6050General_Dlpf260Hz MPU6050DlpfConfig = 0x00\n\tMPU6050General_Dlpf184Hz MPU6050DlpfConfig = 0x01\n\tMPU6050General_Dlpf94Hz  MPU6050DlpfConfig = 0x02\n\tMPU6050General_Dlpf44Hz  MPU6050DlpfConfig = 0x03\n\tMPU6050General_Dlpf21Hz  MPU6050DlpfConfig = 0x04\n\tMPU6050General_Dlpf10Hz  MPU6050DlpfConfig = 0x05\n\tMPU6050General_Dlpf5Hz   MPU6050DlpfConfig = 0x06\n\n\tMPU6050General_FrameSyncDisabled MPU6050FrameSyncConfig = 0x00\n\tMPU6050General_FrameSyncTemp     MPU6050FrameSyncConfig = 0x01\n\tMPU6050General_FrameSyncGyroX    MPU6050FrameSyncConfig = 0x02\n\tMPU6050General_FrameSyncGyroY    MPU6050FrameSyncConfig = 0x03\n\tMPU6050General_FrameSyncGyroZ    MPU6050FrameSyncConfig = 0x04\n\tMPU6050General_FrameSyncAccelX   MPU6050FrameSyncConfig = 0x05\n\tMPU6050General_FrameSyncAccelY   MPU6050FrameSyncConfig = 0x06\n\tMPU6050General_FrameSyncAccelZ   MPU6050FrameSyncConfig = 0x07\n\n\tMPU6050Gyro_FsSel250dps  MPU6050GyroFsConfig = 0x00 // +/- 250 °/s\n\tMPU6050Gyro_FsSel500dps  MPU6050GyroFsConfig = 0x01 // +/- 500 °/s\n\tMPU6050Gyro_FsSel1000dps MPU6050GyroFsConfig = 0x02 // +/- 1000 °/s\n\tMPU6050Gyro_FsSel2000dps MPU6050GyroFsConfig = 0x03 // +/- 2000 °/s\n\n\tMPU6050Accel_AFsSel2g  MPU6050AccelFsConfig = 0x00 // +/- 2 g\n\tMPU6050Accel_AFsSel4g  MPU6050AccelFsConfig = 0x01 // +/- 4 g\n\tMPU6050Accel_AFsSel8g  MPU6050AccelFsConfig = 0x02 // +/- 8 g\n\tMPU6050Accel_AFsSel16g MPU6050AccelFsConfig = 0x03 // +/- 16 g\n\n\tmpu6050SignalReset_TempBit  = 0x01\n\tmpu6050SignalReset_AccelBit = 0x02\n\tmpu6050SignalReset_GyroBit  = 0x04\n\n\tMPU6050Pwr1_ClockIntern8G  MPU6050Pwr1ClockConfig = 0x00 // internal 8GHz\n\tMPU6050Pwr1_ClockPllXGyro  MPU6050Pwr1ClockConfig = 0x01 // PLL with X axis gyroscope reference\n\tMPU6050Pwr1_ClockPllYGyro  MPU6050Pwr1ClockConfig = 0x02 // PLL with Y axis gyroscope reference\n\tMPU6050Pwr1_ClockPllZGyro  MPU6050Pwr1ClockConfig = 0x03 // PLL with Z axis gyroscope reference\n\tMPU6050Pwr1_ClockPllExt32K MPU6050Pwr1ClockConfig = 0x04 // PLL with external 32.768kHz reference\n\tMPU6050Pwr1_ClockPllExt19M MPU6050Pwr1ClockConfig = 0x05 // PLL with external 19.2MHz reference\n\tMPU6050Pwr1_ClockStop      MPU6050Pwr1ClockConfig = 0x07 // Stops the clock and keeps the timing generator in reset\n\n\tmpu6050Pwr1_SleepOnBit     = 0x40 // put into low power sleep mode\n\tmpu6050Pwr1_DeviceResetBit = 0x80\n)\n\ntype MPU6050ThreeDData struct {\n\tX float64\n\tY float64\n\tZ float64\n}\n\n// MPU6050Driver is a Gobot Driver for an MPU6050 I2C Accelerometer/Gyroscope/Temperature sensor.\n//\n// This driver was tested with Tinkerboard & Digispark adaptor and a MPU6050 breakout board GY-521,\n// available from various distributors.\n//\n// datasheet:\n// https://product.tdk.com/system/files/dam/doc/product/sensor/mortion-inertial/imu/data_sheet/mpu-6000-datasheet1.pdf\n//\n// reference implementations:\n// * https://github.com/adafruit/Adafruit_CircuitPython_MPU6050\n// * https://github.com/ElectronicCats/mpu6050\ntype MPU6050Driver struct {\n\t*Driver\n\n\tAccelerometer MPU6050ThreeDData\n\tGyroscope     MPU6050ThreeDData\n\tTemperature   float64\n\tdlpf          MPU6050DlpfConfig\n\tframeSync     MPU6050FrameSyncConfig\n\taccelFs       MPU6050AccelFsConfig\n\tgyroFs        MPU6050GyroFsConfig\n\tclock         MPU6050Pwr1ClockConfig\n\tgravity       float64 // set to 1.0 leads to [g]\n}\n\n// mpu6050AccelGain in 1/g\nvar mpu6050AccelGain = map[MPU6050AccelFsConfig]uint16{\n\tMPU6050Accel_AFsSel2g:  16384,\n\tMPU6050Accel_AFsSel4g:  8192,\n\tMPU6050Accel_AFsSel8g:  4096,\n\tMPU6050Accel_AFsSel16g: 2028,\n}\n\n// mpu6050GyroGain in s/°\nvar mpu6050GyroGain = map[MPU6050GyroFsConfig]float64{\n\tMPU6050Gyro_FsSel250dps:  131.0,\n\tMPU6050Gyro_FsSel500dps:  65.5,\n\tMPU6050Gyro_FsSel1000dps: 32.8,\n\tMPU6050Gyro_FsSel2000dps: 16.4,\n}\n\n// NewMPU6050Driver creates a new Gobot Driver for an MPU6050 I2C Accelerometer/Gyroscope/Temperature sensor.\n//\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewMPU6050Driver(a Connector, options ...func(Config)) *MPU6050Driver {\n\td := &MPU6050Driver{\n\t\tDriver:    NewDriver(a, \"MPU6050\", mpu6050DefaultAddress),\n\t\tdlpf:      MPU6050General_Dlpf260Hz,\n\t\tframeSync: MPU6050General_FrameSyncDisabled,\n\t\taccelFs:   MPU6050Accel_AFsSel2g,\n\t\tgyroFs:    MPU6050Gyro_FsSel250dps,\n\t\tclock:     MPU6050Pwr1_ClockPllXGyro,\n\t\tgravity:   mpu6050EarthStandardGravity,\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: add commands to API\n\treturn d\n}\n\n// WithMPU6050DigitalFilter option sets the digital low pass filter bandwidth frequency.\n// Valid settings are of type \"MPU6050DlpfConfig\"\nfunc WithMPU6050DigitalFilter(val MPU6050DlpfConfig) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*MPU6050Driver); ok {\n\t\t\td.dlpf = val\n\t\t} else if mpu6050Debug {\n\t\t\tlog.Printf(\"Trying to set digital low pass filter for non-MPU6050Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMPU6050FrameSync option sets the external frame synchronization.\n// Valid settings are of type \"MPU6050FrameSyncConfig\"\nfunc WithMPU6050FrameSync(val MPU6050FrameSyncConfig) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*MPU6050Driver); ok {\n\t\t\td.frameSync = val\n\t\t} else if mpu6050Debug {\n\t\t\tlog.Printf(\"Trying to set external frame synchronization for non-MPU6050Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMPU6050AccelFullScaleRange option sets the full scale range for the accelerometer.\n// Valid settings are of type \"MPU6050AccelFsConfig\"\nfunc WithMPU6050AccelFullScaleRange(val MPU6050AccelFsConfig) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*MPU6050Driver); ok {\n\t\t\td.accelFs = val\n\t\t} else if mpu6050Debug {\n\t\t\tlog.Printf(\"Trying to set full scale range of accelerometer for non-MPU6050Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMPU6050GyroFullScaleRange option sets the full scale range for the gyroscope.\n// Valid settings are of type \"MPU6050GyroFsConfig\"\nfunc WithMPU6050GyroFullScaleRange(val MPU6050GyroFsConfig) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*MPU6050Driver); ok {\n\t\t\td.gyroFs = val\n\t\t} else if mpu6050Debug {\n\t\t\tlog.Printf(\"Trying to set full scale range of gyroscope for non-MPU6050Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMPU6050ClockSource option sets the clock source.\n// Valid settings are of type \"MPU6050Pwr1ClockConfig\"\nfunc WithMPU6050ClockSource(val MPU6050Pwr1ClockConfig) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*MPU6050Driver); ok {\n\t\t\td.clock = val\n\t\t} else if mpu6050Debug {\n\t\t\tlog.Printf(\"Trying to set clock source for non-MPU6050Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithMPU6050Gravity option sets the gravity in [m/s²/g].\n// Useful settings are \"1.0\" (to use unit \"g\") or a value between 9.834 (pole) and 9.764 (equator)\nfunc WithMPU6050Gravity(val float64) func(Config) {\n\treturn func(c Config) {\n\t\tif d, ok := c.(*MPU6050Driver); ok {\n\t\t\td.gravity = val\n\t\t} else if mpu6050Debug {\n\t\t\tlog.Printf(\"Trying to set gravity for non-MPU6050Driver %v\", c)\n\t\t}\n\t}\n}\n\n// GetData fetches the latest data from the MPU6050\nfunc (d *MPU6050Driver) GetData() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tdata := make([]byte, 14)\n\tif err := d.readBlockData(mpu6050Reg_AccelXoutH, data); err != nil {\n\t\treturn err\n\t}\n\n\tvar accel struct {\n\t\tX int16\n\t\tY int16\n\t\tZ int16\n\t}\n\tvar temp int16\n\tvar gyro struct {\n\t\tX int16\n\t\tY int16\n\t\tZ int16\n\t}\n\n\tbuf := bytes.NewBuffer(data)\n\tif err := binary.Read(buf, binary.BigEndian, &accel); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &temp); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Read(buf, binary.BigEndian, &gyro); err != nil {\n\t\treturn err\n\t}\n\n\tag := float64(mpu6050AccelGain[d.accelFs]) / d.gravity\n\td.Accelerometer.X = float64(accel.X) / ag\n\td.Accelerometer.Y = float64(accel.Y) / ag\n\td.Accelerometer.Z = float64(accel.Z) / ag\n\n\td.Temperature = float64(temp)/340 + 36.53\n\n\tgg := mpu6050GyroGain[d.gyroFs]\n\td.Gyroscope.X = float64(gyro.X) / gg\n\td.Gyroscope.Y = float64(gyro.Y) / gg\n\td.Gyroscope.Z = float64(gyro.Z) / gg\n\n\treturn nil\n}\n\nfunc (d *MPU6050Driver) waitForReset() error {\n\twait := 100 * time.Millisecond\n\tstart := time.Now()\n\tfor {\n\t\tif time.Since(start) > wait {\n\t\t\treturn fmt.Errorf(\"timeout on wait for reset is done\")\n\t\t}\n\t\tif val, err := d.readByteData(mpu6050Reg_PwrMgmt1); (val&mpu6050Pwr1_DeviceResetBit == 0) && (err == nil) {\n\t\t\treturn nil\n\t\t}\n\t\ttime.Sleep(wait / 10)\n\t}\n}\n\nfunc (d *MPU6050Driver) initialize() error {\n\t// reset device and wait for reset is finished\n\tif err := d.writeByteData(mpu6050Reg_PwrMgmt1, mpu6050Pwr1_DeviceResetBit); err != nil {\n\t\treturn err\n\t}\n\tif err := d.waitForReset(); err != nil {\n\t\treturn err\n\t}\n\n\t// reset signal path register\n\treset := uint8(mpu6050SignalReset_TempBit | mpu6050SignalReset_AccelBit | mpu6050SignalReset_GyroBit)\n\tif err := d.writeByteData(mpu6050Reg_SignalPathReset, reset); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// configure digital filter bandwidth and external frame synchronization (bits 3...5 are used)\n\tgeneralConf := uint8(d.dlpf) | uint8(d.frameSync)<<3\n\tif err := d.writeByteData(mpu6050Reg_GeneralConfig, generalConf); err != nil {\n\t\treturn err\n\t}\n\n\t// set full scale range of gyroscope (bits 3 and 4 are used)\n\tif err := d.writeByteData(mpu6050Reg_GyroConfig, uint8(d.gyroFs)<<3); err != nil {\n\t\treturn err\n\t}\n\n\t// set full scale range of accelerometer (bits 3 and 4 are used)\n\tif err := d.writeByteData(mpu6050Reg_AccelConfig, uint8(d.accelFs)<<3); err != nil {\n\t\treturn err\n\t}\n\n\t// set clock source and reset sleep\n\tpwr1 := uint8(d.clock) & ^uint8(mpu6050Pwr1_SleepOnBit)\n\n\treturn d.writeByteData(mpu6050Reg_PwrMgmt1, pwr1)\n}\n"
  },
  {
    "path": "drivers/i2c/mpu6050_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MPU6050Driver)(nil)\n\nfunc initTestMPU6050WithStubbedAdaptor() (*MPU6050Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewMPU6050Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMPU6050Driver(t *testing.T) {\n\tvar di interface{} = NewMPU6050Driver(newI2cTestAdaptor())\n\td, ok := di.(*MPU6050Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMPU6050Driver() should have returned a *MPU6050Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.name, \"MPU6050\"))\n\tassert.Equal(t, 0x68, d.defaultAddress)\n\tassert.Equal(t, MPU6050DlpfConfig(0x00), d.dlpf)\n\tassert.Equal(t, MPU6050FrameSyncConfig(0x00), d.frameSync)\n\tassert.Equal(t, MPU6050AccelFsConfig(0x00), d.accelFs)\n\tassert.Equal(t, MPU6050GyroFsConfig(0x00), d.gyroFs)\n\tassert.Equal(t, MPU6050Pwr1ClockConfig(0x01), d.clock)\n\tassert.InDelta(t, 9.80665, d.gravity, 0.0)\n}\n\nfunc TestMPU6050Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewMPU6050Driver(newI2cTestAdaptor(), WithBus(2), WithMPU6050DigitalFilter(0x06))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, MPU6050DlpfConfig(0x06), d.dlpf)\n}\n\nfunc TestMPU6050Halt(t *testing.T) {\n\t// arrange\n\td := NewMPU6050Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestWithMPU6050FrameSync(t *testing.T) {\n\td := NewMPU6050Driver(newI2cTestAdaptor(), WithMPU6050FrameSync(0x07))\n\tassert.Equal(t, MPU6050FrameSyncConfig(0x07), d.frameSync)\n}\n\nfunc TestWithMPU6050AccelFullScaleRange(t *testing.T) {\n\td := NewMPU6050Driver(newI2cTestAdaptor(), WithMPU6050AccelFullScaleRange(0x02))\n\tassert.Equal(t, MPU6050AccelFsConfig(0x02), d.accelFs)\n}\n\nfunc TestWithMPU6050GyroFullScaleRange(t *testing.T) {\n\td := NewMPU6050Driver(newI2cTestAdaptor(), WithMPU6050GyroFullScaleRange(0x03))\n\tassert.Equal(t, MPU6050GyroFsConfig(0x03), d.gyroFs)\n}\n\nfunc TestWithMPU6050ClockSource(t *testing.T) {\n\td := NewMPU6050Driver(newI2cTestAdaptor(), WithMPU6050ClockSource(0x05))\n\tassert.Equal(t, MPU6050Pwr1ClockConfig(0x05), d.clock)\n}\n\nfunc TestWithMPU6050Gravity(t *testing.T) {\n\td := NewMPU6050Driver(newI2cTestAdaptor(), WithMPU6050Gravity(1.0))\n\tassert.InDelta(t, 1.0, d.gravity, 0.0)\n}\n\nfunc TestMPU6050GetData(t *testing.T) {\n\t// sequence to read values\n\t// * reset device and prepare config registers, see test for Start()\n\t// * write first data register address (0x3B)\n\t// * read 3 x 2 bytes acceleration.X, Y, Z data, little-endian (MSB, LSB)\n\t// * read 2 bytes temperature data, little-endian (MSB, LSB)\n\t// * read 3 x 2 bytes gyroscope.X, Y, Z data, little-endian (MSB, LSB)\n\t// * scale\n\t//    Acceleration: raw value / gain * standard gravity [m/s²]\n\t//    Temperature:  raw value / 340 + 36.53 [°C]\n\t//    Gyroscope:    raw value / gain [°/s]\n\n\t// arrange\n\td, adaptor := initTestMPU6050WithStubbedAdaptor()\n\t_ = d.Start()\n\n\taccData := []byte{0x00, 0x01, 0x02, 0x04, 0x08, 0x16}\n\ttempData := []byte{0x32, 0x64}\n\tgyroData := []byte{0x16, 0x08, 0x04, 0x02, 0x01, 0x00}\n\n\twantAccel := MPU6050ThreeDData{\n\t\tX: 0x0001 / 16384.0 * d.gravity,\n\t\tY: 0x0204 / 16384.0 * d.gravity,\n\t\tZ: 0x0816 / 16384.0 * d.gravity,\n\t}\n\twantGyro := MPU6050ThreeDData{\n\t\tX: 0x1608 / 131.0,\n\t\tY: 0x0402 / 131.0,\n\t\tZ: 0x0100 / 131.0,\n\t}\n\twantTemp := float64(0x3264)/340 + 36.53\n\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, append(append(accData, tempData...), gyroData...))\n\t\treturn len(b), nil\n\t}\n\t// act\n\t_ = d.GetData()\n\t// assert\n\tassert.Equal(t, wantAccel, d.Accelerometer)\n\tassert.Equal(t, wantGyro, d.Gyroscope)\n\tassert.InDelta(t, wantTemp, d.Temperature, 0.0)\n}\n\nfunc TestMPU6050GetDataReadError(t *testing.T) {\n\td, adaptor := initTestMPU6050WithStubbedAdaptor()\n\t_ = d.Start()\n\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\trequire.ErrorContains(t, d.GetData(), \"read error\")\n}\n\nfunc TestMPU6050GetDataWriteError(t *testing.T) {\n\td, adaptor := initTestMPU6050WithStubbedAdaptor()\n\t_ = d.Start()\n\n\tadaptor.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\trequire.ErrorContains(t, d.GetData(), \"write error\")\n}\n\nfunc TestMPU6050_initialize(t *testing.T) {\n\t// sequence for initialization the device on Start()\n\t//          reset (according to data sheet)\n\t// * write power management 1 register address (0x6B)\n\t// * set device reset bit - write 0x80\n\t// * read device reset bit until it becomes false (timeout 100 ms)\n\t//   * write power management 1 register address (0x6B)\n\t//   * read value\n\t//   * wait some time before retry\n\t// * write signal path reset register address (0x68)\n\t// * reset all sensors - write 0x07\n\t// * wait 100 ms\n\t//               config\n\t// * write general config register address (0x1A)\n\t// * disable external sync and set filter bandwidth to 260 HZ - write 0x00\n\t// * write gyroscope config register address (0x1B)\n\t// * set full scale to 250 °/s - write 0x00\n\t// * write accelerometer config register address (0x1C)\n\t// * set full scale to 2 g - write 0x00\n\t// * write power management 1 register address (0x6B)\n\t// * set clock source to PLL with X and switch off sleep bit - write 0x01\n\t// arrange\n\ta := newI2cTestAdaptor()\n\td := NewMPU6050Driver(a)\n\treadCallCounter := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treadCallCounter++\n\t\t// emulate ready\n\t\tb[0] = 0x00\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialize() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, readCallCounter)\n\tassert.Len(t, a.written, 13)\n\tassert.Equal(t, uint8(0x6B), a.written[0])\n\tassert.Equal(t, uint8(0x80), a.written[1])\n\tassert.Equal(t, uint8(0x6B), a.written[2])\n\tassert.Equal(t, uint8(0x68), a.written[3])\n\tassert.Equal(t, uint8(0x07), a.written[4])\n\tassert.Equal(t, uint8(0x1A), a.written[5])\n\tassert.Equal(t, uint8(0x00), a.written[6])\n\tassert.Equal(t, uint8(0x1B), a.written[7])\n\tassert.Equal(t, uint8(0x00), a.written[8])\n\tassert.Equal(t, uint8(0x1C), a.written[9])\n\tassert.Equal(t, uint8(0x00), a.written[10])\n\tassert.Equal(t, uint8(0x6B), a.written[11])\n\tassert.Equal(t, uint8(0x01), a.written[12])\n}\n"
  },
  {
    "path": "drivers/i2c/pca9501_driver.go",
    "content": "package i2c\n\nimport \"gobot.io/x/gobot/v2/drivers/common/bit\"\n\n// PCA9501 supports addresses from 0x00 to 0x7F\n// 0x00 - 0x3F: GPIO, 0x40 - 0x7F: EEPROM\n//\n// 0 EE A5 A4 A3 A2 A1 A0|rd\n// Lowest bit (rd) is mapped to switch between write(0)/read(1), it is not part of the \"real\" address.\n// Highest bit (EE) is mapped to switch between GPIO(0)/EEPROM(1).\n//\n// The EEPROM address will be generated from GPIO address in this driver.\nconst pca9501DefaultAddress = 0x3F // this applies, if all 6 address pins left open (have pull up resistors)\n\n// PCA9501Driver is a Gobot Driver for the PCA9501 8-bit GPIO & 2-kbit EEPROM with 6 address program pins.\n// 2-kbit EEPROM has 256 byte, means addresses between 0x00-0xFF\n//\n// please refer to data sheet: https://www.nxp.com/docs/en/data-sheet/PCA9501.pdf\n//\n// PCA9501 is the replacement for PCF8574, so this driver should also work for PCF8574 except EEPROM calls\ntype PCA9501Driver struct {\n\t*Driver\n\n\tconnectionMem Connection\n}\n\n// NewPCA9501Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\ta Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewPCA9501Driver(a Connector, options ...func(Config)) *PCA9501Driver {\n\td := &PCA9501Driver{\n\t\tDriver: NewDriver(a, \"PCA9501\", pca9501DefaultAddress, options...),\n\t}\n\td.afterStart = d.initialize\n\n\t// API commands\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"WriteGPIO\", func(params map[string]interface{}) interface{} {\n\t\tpin := params[\"pin\"].(uint8)\n\t\tval := params[\"val\"].(uint8)\n\t\terr := d.WriteGPIO(pin, val)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ReadGPIO\", func(params map[string]interface{}) interface{} {\n\t\tpin := params[\"pin\"].(uint8)\n\t\tval, err := d.ReadGPIO(pin)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"WriteEEPROM\", func(params map[string]interface{}) interface{} {\n\t\taddress := params[\"address\"].(uint8)\n\t\tval := params[\"val\"].(uint8)\n\t\terr := d.WriteEEPROM(address, val)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ReadEEPROM\", func(params map[string]interface{}) interface{} {\n\t\taddress := params[\"address\"].(uint8)\n\t\tval, err := d.ReadEEPROM(address)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\n\treturn d\n}\n\n// WriteGPIO writes a value to a gpio pin (0-7)\nfunc (d *PCA9501Driver) WriteGPIO(pin uint8, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// read current value of CTRL register, 0 is output, 1 is no output\n\tiodir, err := d.readByte()\n\tif err != nil {\n\t\treturn err\n\t}\n\t// set pin as output by clearing bit\n\tiodirVal := bit.Clear(int(iodir), pin)\n\t// write CTRL register\n\terr = d.writeByte(uint8(iodirVal)) //nolint:gosec // TODO: fix later\n\tif err != nil {\n\t\treturn err\n\t}\n\t// read current value of port\n\tcVal, err := d.readByte()\n\tif err != nil {\n\t\treturn err\n\t}\n\t// set or reset the bit in value\n\tvar nVal int\n\tif val == 0 {\n\t\tnVal = bit.Clear(int(cVal), pin)\n\t} else {\n\t\tnVal = bit.Set(int(cVal), pin)\n\t}\n\t// write new value to port\n\terr = d.writeByte(uint8(nVal)) //nolint:gosec // TODO: fix later\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ReadGPIO reads a value from a given gpio pin (0-7)\nfunc (d *PCA9501Driver) ReadGPIO(pin uint8) (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// read current value of CTRL register, 0 is no input, 1 is an input\n\tiodir, err := d.readByte()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\t// set pin as input by setting bit\n\tiodirVal := bit.Set(int(iodir), pin)\n\t// write CTRL register\n\terr = d.writeByte(uint8(iodirVal)) //nolint:gosec // TODO: fix later\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\t// read port and create return bit\n\tval, err := d.readByte()\n\tif err != nil {\n\t\treturn val, err\n\t}\n\tval = 1 << pin & val\n\tif val > 1 {\n\t\tval = 1\n\t}\n\treturn val, nil\n}\n\n// ReadEEPROM reads a value from a given address (0x00-0xFF)\n// Note: only this sequence for memory read is supported: \"STARTW-DATA1-STARTR-DATA2-STOP\"\n// DATA1: EEPROM address, DATA2: read value\nfunc (d *PCA9501Driver) ReadEEPROM(address uint8) (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.connectionMem.ReadByteData(address)\n}\n\n// WriteEEPROM writes a value to a given address in memory (0x00-0xFF)\nfunc (d *PCA9501Driver) WriteEEPROM(address uint8, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.connectionMem.WriteByteData(address, val)\n}\n\nfunc (d *PCA9501Driver) initialize() error {\n\t// initialize the EEPROM connection\n\tbus := d.GetBusOrDefault(d.connector.DefaultI2cBus())\n\taddressMem := d.GetAddressOrDefault(pca9501DefaultAddress) | 0x40\n\tvar err error\n\td.connectionMem, err = d.connector.GetI2cConnection(addressMem, bus)\n\treturn err\n}\n"
  },
  {
    "path": "drivers/i2c/pca9501_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*PCA9501Driver)(nil)\n\nvar (\n\tpinVal = map[string]interface{}{\n\t\t\"pin\": uint8(7),\n\t\t\"val\": uint8(0),\n\t}\n\tpin = map[string]interface{}{\n\t\t\"pin\": uint8(7),\n\t}\n\taddressVal = map[string]interface{}{\n\t\t\"address\": uint8(15),\n\t\t\"val\":     uint8(7),\n\t}\n\taddress = map[string]interface{}{\n\t\t\"address\": uint8(15),\n\t}\n)\n\nfunc initPCA9501WithStubbedAdaptor() (*PCA9501Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewPCA9501Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewPCA9501Driver(t *testing.T) {\n\t// arrange, act\n\tvar di interface{} = NewPCA9501Driver(newI2cTestAdaptor())\n\t// assert\n\td, ok := di.(*PCA9501Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewPCA9501Driver() should have returned a *PCA9501Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"PCA9501\"))\n\tassert.Equal(t, 0x3f, d.defaultAddress)\n}\n\nfunc TestPCA9501Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewPCA9501Driver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestPCA9501Halt(t *testing.T) {\n\t// arrange\n\td := NewPCA9501Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestPCA9501CommandsWriteGPIO(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, nil\n\t}\n\t// act\n\tresult := d.Command(\"WriteGPIO\")(pinVal)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestPCA9501CommandsReadGPIO(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// act\n\tresult := d.Command(\"ReadGPIO\")(pin)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestPCA9501CommandsWriteEEPROM(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, nil\n\t}\n\t// act\n\tresult := d.Command(\"WriteEEPROM\")(addressVal)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestPCA9501CommandsReadEEPROM(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, nil\n\t}\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// act\n\tresult := d.Command(\"ReadEEPROM\")(address)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestPCA9501WriteGPIO(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsetVal          uint8\n\t\tioDirAllInput   uint8\n\t\tioStateAllInput uint8\n\t\tpin             uint8\n\t\twantPin         uint8\n\t\twantState       uint8\n\t}{\n\t\t\"clear_bit\": {\n\t\t\tsetVal:          0,\n\t\t\tioDirAllInput:   0xF1,\n\t\t\tioStateAllInput: 0xF2,\n\t\t\tpin:             6,\n\t\t\twantPin:         0xB1,\n\t\t\twantState:       0xB2,\n\t\t},\n\t\t\"set_bit\": {\n\t\t\tsetVal:          2,\n\t\t\tioDirAllInput:   0x1F,\n\t\t\tioStateAllInput: 0x20,\n\t\t\tpin:             3,\n\t\t\twantPin:         0x17,\n\t\t\twantState:       0x28,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA9501WithStubbedAdaptor()\n\t\t\t// prepare all reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tif numCallsRead == 1 {\n\t\t\t\t\t// first call read current io direction of all pins\n\t\t\t\t\tb[0] = tc.ioDirAllInput\n\t\t\t\t}\n\t\t\t\tif numCallsRead == 2 {\n\t\t\t\t\t// second call read current state of all pins\n\t\t\t\t\tb[0] = tc.ioStateAllInput\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.WriteGPIO(tc.pin, tc.setVal)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, 2, numCallsRead)\n\t\t\tassert.Len(t, a.written, 2)\n\t\t\tassert.Equal(t, tc.wantPin, a.written[0])\n\t\t\tassert.Equal(t, tc.wantState, a.written[1])\n\t\t})\n\t}\n}\n\nfunc TestPCA9501WriteGPIOErrorAtWriteDirection(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\twantErr := errors.New(\"write error\")\n\t// prepare all reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\treturn len(b), nil\n\t}\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\tif numCallsWrite == 1 {\n\t\t\t// first call writes the CTRL register for port direction\n\t\t\treturn 0, wantErr\n\t\t}\n\t\treturn 0, nil\n\t}\n\t// act\n\terr := d.WriteGPIO(7, 0)\n\t// assert\n\tassert.Equal(t, wantErr, err)\n\tassert.Less(t, numCallsRead, 2)\n\tassert.Equal(t, 1, numCallsWrite)\n}\n\nfunc TestPCA9501WriteGPIOErrorAtWriteValue(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\twantErr := errors.New(\"write error\")\n\t// prepare all reads\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\tif numCallsWrite == 2 {\n\t\t\t// second call writes the value to IO port\n\t\t\treturn 0, wantErr\n\t\t}\n\t\treturn 0, nil\n\t}\n\t// act\n\terr := d.WriteGPIO(7, 0)\n\t// assert\n\tassert.Equal(t, wantErr, err)\n\tassert.Equal(t, 2, numCallsWrite)\n}\n\nfunc TestPCA9501ReadGPIO(t *testing.T) {\n\ttests := map[string]struct {\n\t\tctrlState uint8\n\t\twant      uint8\n\t}{\n\t\t\"pin_is_set\":     {ctrlState: 0x80, want: 1},\n\t\t\"pin_is_not_set\": {ctrlState: 0x7F, want: 0},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst (\n\t\t\t\tpin           = uint8(7)\n\t\t\t\twantCtrlState = uint8(0x80)\n\t\t\t)\n\t\t\td, a := initPCA9501WithStubbedAdaptor()\n\t\t\t// prepare all reads\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tif numCallsRead == 1 {\n\t\t\t\t\t// current state of io\n\t\t\t\t\tb[0] = 0x00\n\t\t\t\t}\n\t\t\t\tif numCallsRead == 2 {\n\t\t\t\t\tb[0] = tc.ctrlState\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.ReadGPIO(pin)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, 2, numCallsRead)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, wantCtrlState, a.written[0])\n\t\t})\n\t}\n}\n\nfunc TestPCA9501ReadGPIOErrorAtReadDirection(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\twantErr := errors.New(\"read error\")\n\t// prepare all reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\t// first read gets the CTRL register for pin direction\n\t\t\treturn 0, wantErr\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// act\n\t_, err := d.ReadGPIO(1)\n\t// assert\n\tassert.Equal(t, wantErr, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Equal(t, 0, numCallsWrite)\n}\n\nfunc TestPCA9501ReadGPIOErrorAtReadValue(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\twantErr := errors.New(\"read error\")\n\t// prepare all reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 2 {\n\t\t\t// second read gets the value from IO port\n\t\t\treturn 0, wantErr\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// act\n\t_, err := d.ReadGPIO(2)\n\t// assert\n\tassert.Equal(t, wantErr, err)\n\tassert.Equal(t, 1, numCallsWrite)\n}\n\nfunc TestPCA9501WriteEEPROM(t *testing.T) {\n\t// arrange\n\tconst (\n\t\taddressEEPROM = uint8(0x52)\n\t\twant          = uint8(0x25)\n\t)\n\td, a := initPCA9501WithStubbedAdaptor()\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// act\n\terr := d.WriteEEPROM(addressEEPROM, want)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Equal(t, addressEEPROM, a.written[0])\n\tassert.Equal(t, want, a.written[1])\n}\n\nfunc TestPCA9501ReadEEPROM(t *testing.T) {\n\t// arrange\n\tconst (\n\t\taddressEEPROM = uint8(51)\n\t\twant          = uint8(0x44)\n\t)\n\td, a := initPCA9501WithStubbedAdaptor()\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// prepare all reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[0] = want\n\t\treturn len(b), nil\n\t}\n\t// act\n\tval, err := d.ReadEEPROM(addressEEPROM)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, want, val)\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Equal(t, addressEEPROM, a.written[0])\n\tassert.Equal(t, 1, numCallsRead)\n}\n\nfunc TestPCA9501ReadEEPROMErrorWhileWriteAddress(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\twantErr := errors.New(\"error while write\")\n\t// prepare all writes\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, wantErr\n\t}\n\t// prepare all reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\treturn len(b), nil\n\t}\n\t// act\n\t_, err := d.ReadEEPROM(15)\n\t// assert\n\tassert.Equal(t, wantErr, err)\n\tassert.Equal(t, 0, numCallsRead)\n}\n\nfunc TestPCA9501ReadEEPROMErrorWhileReadValue(t *testing.T) {\n\t// arrange\n\td, a := initPCA9501WithStubbedAdaptor()\n\twantErr := errors.New(\"error while read\")\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// prepare all reads\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn len(b), wantErr\n\t}\n\t// act\n\t_, err := d.ReadEEPROM(15)\n\t// assert\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Equal(t, wantErr, err)\n}\n\nfunc TestPCA9501_initialize(t *testing.T) {\n\t// arrange\n\tconst want = 0x7f\n\td, a := initPCA9501WithStubbedAdaptor()\n\t// act\n\terr := d.initialize()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, want, a.address)\n}\n"
  },
  {
    "path": "drivers/i2c/pca953x_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n)\n\n// pca953xDefaultAddress is set to variant PCA9533/2\nconst (\n\tpca953xDebug          = false\n\tpca953xDefaultAddress = 0x63\n)\n\ntype pca953xRegister uint8\n\n// PCA953xGPIOMode is used to set the mode while write GPIO\ntype PCA953xGPIOMode uint8\n\nconst (\n\tpca953xRegInp  pca953xRegister = 0x00 // input register\n\tpca953xRegPsc0 pca953xRegister = 0x01 // r,   frequency prescaler 0\n\tpca953xRegPwm0 pca953xRegister = 0x02 // r/w, PWM register 0\n\tpca953xRegPsc1 pca953xRegister = 0x03 // r/w, frequency prescaler 1\n\tpca953xRegPwm1 pca953xRegister = 0x04 // r/w, PWM register 1\n\tpca953xRegLs0  pca953xRegister = 0x05 // r/w, LED selector 0\n\tpca953xRegLs1  pca953xRegister = 0x06 // r/w, LED selector 1 (only in PCA9531, PCA9532)\n\n\tpca953xAiMask = 0x10 // autoincrement bit\n\n\t// PCA953xModeHighImpedance set the GPIO to high (LED off)\n\tPCA953xModeHighImpedance PCA953xGPIOMode = 0x00\n\t// PCA953xModeLowImpedance set the GPIO to low (LED on)\n\tPCA953xModeLowImpedance PCA953xGPIOMode = 0x01\n\t// PCA953xModePwm0 set the GPIO to PWM (PWM0 & PSC0)\n\tPCA953xModePwm0 PCA953xGPIOMode = 0x02\n\t// PCA953xModePwm1 set the GPIO to PWM (PWM1 & PSC1)\n\tPCA953xModePwm1 PCA953xGPIOMode = 0x03\n)\n\nvar (\n\terrToSmallPeriod    = fmt.Errorf(\"given Period to small, must be at least 1/152s (~6.58ms) or 152Hz\")\n\terrToBigPeriod      = fmt.Errorf(\"given Period to high, must be max. 256/152s (~1.68s) or 152/256Hz (~0.6Hz)\")\n\terrToSmallDutyCycle = fmt.Errorf(\"given Duty Cycle to small, must be at least 0%%\")\n\terrToBigDutyCycle   = fmt.Errorf(\"given Duty Cycle to high, must be max. 100%%\")\n)\n\n// PCA953xDriver is a Gobot Driver for LED Dimmer PCA9530 (2-bit), PCA9533 (4-bit), PCA9531 (8-bit), PCA9532 (16-bit)\n// Although this is designed for LED's it can be used as a GPIO (read, write, pwm).\n// The names of the public functions reflect this.\n//\n// please refer to data sheet: https://www.nxp.com/docs/en/data-sheet/PCA9533.pdf\n//\n// Address range:\n// * PCA9530   0x60-0x61 (96-97 dec)\n// * PCA9531   0x60-0x67 (96-103 dec)\n// * PCA9532   0x60-0x67 (96-103 dec)\n// * PCA9533/1 0x62      (98 dec)\n// * PCA9533/2 0x63      (99 dec)\n//\n// each new command must start by setting the register and the AI flag\n// 0 0 0 AI | 0 R2 R1 R0\n// AI=1 means auto incrementing for R0-R2, which enable reading/writing all registers sequentially\n// when AI=1 and reading, then R!=0\n// this means: do not start with reading input register, writing input register is recognized but has no effect\n// => when AI=1 in general start with R>0\ntype PCA953xDriver struct {\n\t*Driver\n}\n\n// NewPCA953xDriver creates a new driver with specified i2c interface\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewPCA953xDriver(c Connector, options ...func(Config)) *PCA953xDriver {\n\td := &PCA953xDriver{\n\t\tDriver: NewDriver(c, \"PCA953x\", pca953xDefaultAddress),\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// TODO: API commands\n\treturn d\n}\n\n// SetLED sets the mode (LED off, on, PWM0, PWM1) for the LED output (index 0-7)\nfunc (d *PCA953xDriver) SetLED(idx uint8, mode PCA953xGPIOMode) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeLED(idx, mode)\n}\n\n// WriteGPIO writes a value to a gpio output (index 0-7)\nfunc (d *PCA953xDriver) WriteGPIO(idx uint8, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tmode := PCA953xModeLowImpedance\n\tif val > 0 {\n\t\tmode = PCA953xModeHighImpedance\n\t}\n\n\treturn d.writeLED(idx, mode)\n}\n\n// ReadGPIO reads a gpio input (index 0-7) to a value\nfunc (d *PCA953xDriver) ReadGPIO(idx uint8) (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// read input register\n\tval, err := d.readRegister(pca953xRegInp)\n\t// create return bit\n\tif err != nil {\n\t\treturn val, err\n\t}\n\tval = 1 << idx & val\n\tif val > 1 {\n\t\tval = 1\n\t}\n\treturn val, nil\n}\n\n// WritePeriod set the content of the frequency prescaler of the given index (0,1) with the given value in seconds\nfunc (d *PCA953xDriver) WritePeriod(idx uint8, valSec float32) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// period is valid in range ~6.58ms..1.68s\n\tval, err := pca953xCalcPsc(valSec)\n\tif err != nil && pca953xDebug {\n\t\tfmt.Println(err, \"value limited!\")\n\t}\n\tregPsc := pca953xRegPsc0\n\tif idx > 0 {\n\t\tregPsc = pca953xRegPsc1\n\t}\n\treturn d.writeRegister(regPsc, val)\n}\n\n// ReadPeriod reads the frequency prescaler in seconds of the given index (0,1)\nfunc (d *PCA953xDriver) ReadPeriod(idx uint8) (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tregPsc := pca953xRegPsc0\n\tif idx > 0 {\n\t\tregPsc = pca953xRegPsc1\n\t}\n\tpsc, err := d.readRegister(regPsc)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\treturn pca953xCalcPeriod(psc), nil\n}\n\n// WriteFrequency set the content of the frequency prescaler of the given index (0,1) with the given value in Hz\nfunc (d *PCA953xDriver) WriteFrequency(idx uint8, valHz float32) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// frequency is valid in range ~0.6..152Hz\n\tval, err := pca953xCalcPsc(1 / valHz)\n\tif err != nil && pca953xDebug {\n\t\tfmt.Println(err, \"value limited!\")\n\t}\n\tregPsc := pca953xRegPsc0\n\tif idx > 0 {\n\t\tregPsc = pca953xRegPsc1\n\t}\n\treturn d.writeRegister(regPsc, val)\n}\n\n// ReadFrequency read the frequency prescaler in Hz of the given index (0,1)\nfunc (d *PCA953xDriver) ReadFrequency(idx uint8) (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tregPsc := pca953xRegPsc0\n\tif idx > 0 {\n\t\tregPsc = pca953xRegPsc1\n\t}\n\tpsc, err := d.readRegister(regPsc)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\t// valHz = 1/valSec\n\treturn 1 / pca953xCalcPeriod(psc), nil\n}\n\n// WriteDutyCyclePercent set the PWM duty cycle of the given index (0,1) with the given value in percent\nfunc (d *PCA953xDriver) WriteDutyCyclePercent(idx uint8, valPercent float32) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tval, err := pca953xCalcPwm(valPercent)\n\tif err != nil && pca953xDebug {\n\t\tfmt.Println(err, \"value limited!\")\n\t}\n\tregPwm := pca953xRegPwm0\n\tif idx > 0 {\n\t\tregPwm = pca953xRegPwm1\n\t}\n\treturn d.writeRegister(regPwm, val)\n}\n\n// ReadDutyCyclePercent get the PWM duty cycle in percent of the given index (0,1)\nfunc (d *PCA953xDriver) ReadDutyCyclePercent(idx uint8) (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tregPwm := pca953xRegPwm0\n\tif idx > 0 {\n\t\tregPwm = pca953xRegPwm1\n\t}\n\tpwm, err := d.readRegister(regPwm)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\t// PWM=0..255\n\treturn pca953xCalcDutyCyclePercent(pwm), nil\n}\n\nfunc (d *PCA953xDriver) writeLED(idx uint8, mode PCA953xGPIOMode) error {\n\t// prepare\n\tregLs := pca953xRegLs0\n\tif idx > 3 {\n\t\tregLs = pca953xRegLs1\n\t\tidx = idx - 4\n\t}\n\tregLsShift := idx * 2\n\t// read old value\n\tregLsVal, err := d.readRegister(regLs)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// reset 2 bits at LED position\n\tregLsVal &= ^uint8(0x03 << regLsShift)\n\t// set 2 bits according to mode at LED position\n\tregLsVal |= uint8(mode) << regLsShift\n\t// write new value\n\treturn d.writeRegister(regLs, regLsVal)\n}\n\nfunc (d *PCA953xDriver) writeRegister(regAddress pca953xRegister, val uint8) error {\n\t// ensure AI bit is not set\n\tregAddress = regAddress &^ pca953xAiMask\n\t// write content of requested register\n\treturn d.writeByteData(uint8(regAddress), val)\n}\n\nfunc (d *PCA953xDriver) readRegister(regAddress pca953xRegister) (uint8, error) {\n\t// ensure AI bit is not set\n\tregAddress = regAddress &^ pca953xAiMask\n\treturn d.readByteData(uint8(regAddress))\n}\n\nfunc pca953xCalcPsc(valSec float32) (uint8, error) {\n\t// valSec = (PSC+1)/152; (PSC=0..255)\n\tpsc := 152*valSec - 1\n\tif psc < 0 {\n\t\treturn 0, errToSmallPeriod\n\t}\n\tif psc > 255 {\n\t\treturn 255, errToBigPeriod\n\t}\n\t// add 0.5 for better rounding experience\n\treturn uint8(psc + 0.5), nil\n}\n\nfunc pca953xCalcPeriod(psc uint8) float32 {\n\treturn (float32(psc) + 1) / 152\n}\n\nfunc pca953xCalcPwm(valPercent float32) (uint8, error) {\n\t// valPercent = PWM/256*(256/255*100); (PWM=0..255)\n\tpwm := 255 * valPercent / 100\n\tif pwm < 0 {\n\t\treturn 0, errToSmallDutyCycle\n\t}\n\tif pwm > 255 {\n\t\treturn 255, errToBigDutyCycle\n\t}\n\t// add 0.5 for better rounding experience\n\treturn uint8(pwm + 0.5), nil\n}\n\nfunc pca953xCalcDutyCyclePercent(pwm uint8) float32 {\n\treturn 100 * float32(pwm) / 255\n}\n"
  },
  {
    "path": "drivers/i2c/pca953x_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*PCA953xDriver)(nil)\n\nfunc initPCA953xTestDriverWithStubbedAdaptor() (*PCA953xDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewPCA953xDriver(a)\n\t_ = d.Start()\n\treturn d, a\n}\n\nfunc TestNewPCA953xDriver(t *testing.T) {\n\t// arrange, act\n\tvar di interface{} = NewPCA953xDriver(newI2cTestAdaptor())\n\t// assert\n\td, ok := di.(*PCA953xDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewPCA953xDriver() should have returned a *PCA953xDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"PCA953x\"))\n\tassert.Equal(t, 0x63, d.defaultAddress)\n}\n\nfunc TestPCA953xHalt(t *testing.T) {\n\t// arrange\n\td := NewPCA953xDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestPCA953xWriteGPIO(t *testing.T) {\n\t// sequence to write:\n\t// * choose LED select register according to the given GPIO index (0x05 for 0..3, 0x06 for 4..7)\n\t// * read current state of LED select register (write reg, read val)\n\t// * modify 2 bits according to given index of GPIO\n\t// * write the new state to the LED select register (write reg, write val)\n\ttests := map[string]struct {\n\t\tidx         uint8\n\t\tls0State    uint8\n\t\tls1State    uint8\n\t\tval         uint8\n\t\twantWritten []uint8\n\t\twantErr     error\n\t}{\n\t\t\"out_0_0\": {\n\t\t\tidx:         0,\n\t\t\tls0State:    0xFE,\n\t\t\tls1State:    0xAF,\n\t\t\tval:         0,\n\t\t\twantWritten: []byte{0x05, 0x05, 0xFD}, // set lowest bits to \"01\" for ls0\n\t\t},\n\t\t\"out_0_1\": {\n\t\t\tidx:         0,\n\t\t\tls0State:    0xFF,\n\t\t\tls1State:    0xAF,\n\t\t\tval:         1,\n\t\t\twantWritten: []byte{0x05, 0x05, 0xFC}, // set lowest bits to \"00\" for ls0\n\t\t},\n\t\t\"out_5_0\": {\n\t\t\tidx:         5,\n\t\t\tls0State:    0xAF,\n\t\t\tls1State:    0xFB,\n\t\t\tval:         0,\n\t\t\twantWritten: []byte{0x06, 0x06, 0xF7}, // set bit 2,3 to \"01\" for ls1\n\t\t},\n\t\t\"out_5_1\": {\n\t\t\tidx:         5,\n\t\t\tls0State:    0xAF,\n\t\t\tls1State:    0xFF,\n\t\t\tval:         1,\n\t\t\twantWritten: []byte{0x06, 0x06, 0xF3}, // set bit 2,3 to \"00\" for ls1\n\t\t},\n\t\t\"read_error\": {\n\t\t\tidx:         3,\n\t\t\twantWritten: []byte{0x05},\n\t\t\twantErr:     fmt.Errorf(\"a read error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tif a.written[0] == 0x05 {\n\t\t\t\t\tb[0] = tc.ls0State\n\t\t\t\t}\n\t\t\t\tif a.written[0] == 0x06 {\n\t\t\t\t\tb[0] = tc.ls1State\n\t\t\t\t}\n\t\t\t\treturn 1, tc.wantErr\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.WriteGPIO(tc.idx, tc.val)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestPCA953xReadGPIO(t *testing.T) {\n\t// sequence to read:\n\t// * read current state of INPUT register (write reg 0x00, read val)\n\t// * convert bit position to output value\n\ttests := map[string]struct {\n\t\tidx     uint8\n\t\twant    uint8\n\t\twantErr error\n\t}{\n\t\t\"in_0_0\": {\n\t\t\tidx:  0,\n\t\t\twant: 0,\n\t\t},\n\t\t\"in_0_1\": {\n\t\t\tidx:  0,\n\t\t\twant: 1,\n\t\t},\n\t\t\"in_2_0\": {\n\t\t\tidx:  2,\n\t\t\twant: 0,\n\t\t},\n\t\t\"in_2_1\": {\n\t\t\tidx:  2,\n\t\t\twant: 1,\n\t\t},\n\t\t\"in_7_0\": {\n\t\t\tidx:  7,\n\t\t\twant: 0,\n\t\t},\n\t\t\"in_7_1\": {\n\t\t\tidx:  7,\n\t\t\twant: 1,\n\t\t},\n\t\t\"read_error\": {\n\t\t\tidx:     2,\n\t\t\twant:    0,\n\t\t\twantErr: fmt.Errorf(\"a read error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst wantReg = uint8(0x00) // input register\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\tbits := tc.want << tc.idx\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tb[0] = bits\n\t\t\t\treturn 1, tc.wantErr\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.ReadGPIO(tc.idx)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, wantReg, a.written[0])\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestPCA953xWritePeriod(t *testing.T) {\n\t// sequence to write:\n\t// * calculate PSC value (0..255) from given value in seconds, valid values are 0.00658 ... 1.68 [s]\n\t// * choose PSC0 (0x01) or PSC1 (0x03) frequency prescaler register by the given index\n\t// * write the value to the register (write reg, write val)\n\ttests := map[string]struct {\n\t\tidx         uint8\n\t\tval         float32\n\t\twantWritten []uint8\n\t}{\n\t\t\"write_ok_psc0\": {\n\t\t\tidx:         0,\n\t\t\tval:         1,\n\t\t\twantWritten: []byte{0x01, 151},\n\t\t},\n\t\t\"write_ok_psc1\": {\n\t\t\tidx:         2,\n\t\t\tval:         0.5,\n\t\t\twantWritten: []byte{0x03, 75},\n\t\t},\n\t\t\"write_limited_noerror\": {\n\t\t\tidx:         0,\n\t\t\tval:         2,\n\t\t\twantWritten: []byte{0x01, 255},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\t// act\n\t\t\terr := d.WritePeriod(tc.idx, tc.val)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestPCA953xReadPeriod(t *testing.T) {\n\t// sequence to write:\n\t// * choose PSC0 (0x01) or PSC1 (0x03) frequency prescaler register by the given index\n\t// * read the value from the register (write reg, write val)\n\t// * calculate value in seconds from PSC value\n\ttests := map[string]struct {\n\t\tidx         uint8\n\t\tval         uint8\n\t\twant        float32\n\t\twantWritten []uint8\n\t\twantErr     error\n\t}{\n\t\t\"read_ok_psc0\": {\n\t\t\tidx:         0,\n\t\t\tval:         151,\n\t\t\twant:        1,\n\t\t\twantWritten: []byte{0x01},\n\t\t},\n\t\t\"read_ok_psc1\": {\n\t\t\tidx:         1,\n\t\t\tval:         75,\n\t\t\twant:        0.5,\n\t\t\twantWritten: []byte{0x03},\n\t\t},\n\t\t\"read_error\": {\n\t\t\tidx:         5,\n\t\t\tval:         75,\n\t\t\twant:        -1,\n\t\t\twantWritten: []byte{0x03},\n\t\t\twantErr:     fmt.Errorf(\"read psc error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tb[0] = tc.val\n\t\t\t\treturn 1, tc.wantErr\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.ReadPeriod(tc.idx)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.InDelta(t, tc.want, got, 0.0)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestPCA953xWriteFrequency(t *testing.T) {\n\t// sequence to write:\n\t// * calculate PSC value (0..255) from given value in Hz, valid values are 0.6 ... 152 [Hz]\n\t// * choose PSC0 (0x01) or PSC1 (0x03) frequency prescaler register by the given index\n\t// * write the value to the register (write reg, write val)\n\ttests := map[string]struct {\n\t\tidx         uint8\n\t\tval         float32\n\t\twantWritten []uint8\n\t}{\n\t\t\"write_ok_psc0\": {\n\t\t\tidx:         0,\n\t\t\tval:         1,\n\t\t\twantWritten: []byte{0x01, 151},\n\t\t},\n\t\t\"write_ok_psc1\": {\n\t\t\tidx:         5,\n\t\t\tval:         2,\n\t\t\twantWritten: []byte{0x03, 75},\n\t\t},\n\t\t\"write_limited_noerror\": {\n\t\t\tidx:         0,\n\t\t\tval:         153,\n\t\t\twantWritten: []byte{0x01, 0},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\t// act\n\t\t\terr := d.WriteFrequency(tc.idx, tc.val)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestPCA953xReadFrequency(t *testing.T) {\n\t// sequence to write:\n\t// * choose PSC0 (0x01) or PSC1 (0x03) frequency prescaler register by the given index\n\t// * read the value from the register (write reg, write val)\n\t// * calculate value in Hz from PSC value\n\ttests := map[string]struct {\n\t\tidx         uint8\n\t\tval         uint8\n\t\twant        float32\n\t\twantWritten []uint8\n\t\twantErr     error\n\t}{\n\t\t\"read_ok_psc0\": {\n\t\t\tidx:         0,\n\t\t\tval:         75,\n\t\t\twant:        2,\n\t\t\twantWritten: []byte{0x01},\n\t\t},\n\t\t\"read_ok_psc1\": {\n\t\t\tidx:         1,\n\t\t\tval:         151,\n\t\t\twant:        1,\n\t\t\twantWritten: []byte{0x03},\n\t\t},\n\t\t\"read_error\": {\n\t\t\tidx:         3,\n\t\t\tval:         75,\n\t\t\twant:        -1,\n\t\t\twantWritten: []byte{0x03},\n\t\t\twantErr:     fmt.Errorf(\"read psc error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tb[0] = tc.val\n\t\t\t\treturn 1, tc.wantErr\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.ReadFrequency(tc.idx)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.InDelta(t, tc.want, got, 0.0)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestPCA953xWriteDutyCyclePercent(t *testing.T) {\n\t// sequence to write:\n\t// * calculate PWM value (0..255) from given value in percent, valid values are 0 ... 100 [%]\n\t// * choose PWM0 (0x02) or PWM1 (0x04) pwm register by the given index\n\t// * write the value to the register (write reg, write val)\n\ttests := map[string]struct {\n\t\tidx         uint8\n\t\tval         float32\n\t\twantWritten []uint8\n\t}{\n\t\t\"write_ok_pwm0\": {\n\t\t\tidx:         0,\n\t\t\tval:         10,\n\t\t\twantWritten: []byte{0x02, 26},\n\t\t},\n\t\t\"write_ok_pwm1\": {\n\t\t\tidx:         5,\n\t\t\tval:         50,\n\t\t\twantWritten: []byte{0x04, 128},\n\t\t},\n\t\t\"write_limited_noerror\": {\n\t\t\tidx:         1,\n\t\t\tval:         101,\n\t\t\twantWritten: []byte{0x04, 255},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\t// act\n\t\t\terr := d.WriteDutyCyclePercent(tc.idx, tc.val)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestPCA953xReadDutyCyclePercent(t *testing.T) {\n\t// sequence to write:\n\t// * choose PWM0 (0x02) or PWM1 (0x04) pwm register by the given index\n\t// * read the value from the register (write reg, write val)\n\t// * calculate value percent from PWM value\n\ttests := map[string]struct {\n\t\tidx         uint8\n\t\tval         uint8\n\t\twant        float32\n\t\twantWritten []uint8\n\t\twantErr     error\n\t}{\n\t\t\"read_ok_psc0\": {\n\t\t\tidx:         0,\n\t\t\tval:         128,\n\t\t\twant:        50.19608,\n\t\t\twantWritten: []byte{0x02},\n\t\t},\n\t\t\"read_ok_psc1\": {\n\t\t\tidx:         1,\n\t\t\tval:         26,\n\t\t\twant:        10.196078,\n\t\t\twantWritten: []byte{0x04},\n\t\t},\n\t\t\"read_error\": {\n\t\t\tidx:         0,\n\t\t\tval:         75,\n\t\t\twant:        -1,\n\t\t\twantWritten: []byte{0x02},\n\t\t\twantErr:     fmt.Errorf(\"read psc error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tb[0] = tc.val\n\t\t\t\treturn 1, tc.wantErr\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.ReadDutyCyclePercent(tc.idx)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.InDelta(t, tc.want, got, 0.0)\n\t\t\tassert.Equal(t, tc.wantWritten, a.written)\n\t\t})\n\t}\n}\n\nfunc TestPCA953x_readRegister(t *testing.T) {\n\t// arrange\n\tconst (\n\t\twantRegAddress    = pca953xRegister(0x03)\n\t\twantReadByteCount = 1\n\t\twantRegVal        = uint8(0x04)\n\t)\n\treadByteCount := 0\n\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// prepare all reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\treadByteCount = len(b)\n\t\tb[0] = wantRegVal\n\t\treturn readByteCount, nil\n\t}\n\t// act\n\tval, err := d.readRegister(wantRegAddress)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Equal(t, wantRegVal, val)\n\tassert.Equal(t, wantReadByteCount, readByteCount)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(wantRegAddress), a.written[0])\n}\n\nfunc TestPCA953x_writeRegister(t *testing.T) {\n\t// arrange\n\tconst (\n\t\twantRegAddress = pca953xRegister(0x03)\n\t\twantRegVal     = uint8(0x97)\n\t\twantByteCount  = 2\n\t)\n\td, a := initPCA953xTestDriverWithStubbedAdaptor()\n\t// prepare all writes\n\tnumCallsWrite := 0\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\tnumCallsWrite++\n\t\treturn 0, nil\n\t}\n\t// act\n\terr := d.writeRegister(wantRegAddress, wantRegVal)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Equal(t, 1, numCallsWrite)\n\tassert.Len(t, a.written, wantByteCount)\n\tassert.Equal(t, uint8(wantRegAddress), a.written[0])\n\tassert.Equal(t, wantRegVal, a.written[1])\n}\n\nfunc TestPCA953x_pca953xCalcPsc(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tperiod  float32\n\t\twant    uint8\n\t\twantErr error\n\t}{\n\t\t\"error_to_small\": {period: 0.0065, want: 0, wantErr: errToSmallPeriod},\n\t\t\"minimum\":        {period: 0.0066, want: 0, wantErr: nil},\n\t\t\"one\":            {period: 1, want: 151, wantErr: nil},\n\t\t\"maximum\":        {period: 1.684, want: 255, wantErr: nil},\n\t\t\"error_to_big5\":  {period: 1.685, want: 255, wantErr: errToBigPeriod},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// act\n\t\t\tval, err := pca953xCalcPsc(tc.period)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, val)\n\t\t})\n\t}\n}\n\nfunc TestPCA953x_pca953xCalcPeriod(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tpsc  uint8\n\t\twant float32\n\t}{\n\t\t\"minimum\":  {psc: 0, want: 0.0066},\n\t\t\"one\":      {psc: 1, want: 0.0132},\n\t\t\"one_want\": {psc: 151, want: 1},\n\t\t\"maximum\":  {psc: 255, want: 1.6842},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// act\n\t\t\tval := pca953xCalcPeriod(tc.psc)\n\t\t\t// assert\n\t\t\tassert.InDelta(t, tc.want, float32(math.Round(float64(val)*10000)/10000), 0.0)\n\t\t})\n\t}\n}\n\nfunc TestPCA953x_pca953xCalcPwm(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tpercent float32\n\t\twant    uint8\n\t\twantErr error\n\t}{\n\t\t\"error_to_small\": {percent: -0.1, want: 0, wantErr: errToSmallDutyCycle},\n\t\t\"zero\":           {percent: 0, want: 0, wantErr: nil},\n\t\t\"below_medium\":   {percent: 49.9, want: 127, wantErr: nil},\n\t\t\"medium\":         {percent: 50, want: 128, wantErr: nil},\n\t\t\"maximum\":        {percent: 100, want: 255, wantErr: nil},\n\t\t\"error_to_big\":   {percent: 100.1, want: 255, wantErr: errToBigDutyCycle},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// act\n\t\t\tval, err := pca953xCalcPwm(tc.percent)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, val)\n\t\t})\n\t}\n}\n\nfunc TestPCA953x_pca953xCalcDutyCyclePercent(t *testing.T) {\n\t// arrange\n\ttests := map[string]struct {\n\t\tpwm  uint8\n\t\twant float32\n\t}{\n\t\t\"minimum\":      {pwm: 0, want: 0},\n\t\t\"below_medium\": {pwm: 127, want: 49.8},\n\t\t\"medium\":       {pwm: 128, want: 50.2},\n\t\t\"maximum\":      {pwm: 255, want: 100},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// act\n\t\t\tval := pca953xCalcDutyCyclePercent(tc.pwm)\n\t\t\t// assert\n\t\t\tassert.InDelta(t, tc.want, float32(math.Round(float64(val)*10)/10), 0.0)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/pca9685_driver.go",
    "content": "package i2c\n\nimport (\n\t\"strconv\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst pca9685DefaultAddress = 0x40\n\nconst (\n\tpca9685Mode1Reg      = 0x00\n\tpca9685Mode2Reg      = 0x01\n\tpca9685Subadr1Reg    = 0x02\n\tpca9685Subadr2Reg    = 0x03\n\tpca9685Subadr3Reg    = 0x04\n\tpca9685Led0OnLReg    = 0x06\n\tpca9685Led0OnHReg    = 0x07\n\tpca9685Led0OffLReg   = 0x08\n\tpca9685Led0OffHReg   = 0x09\n\tpca9685AllLedOnLReg  = 0xFA\n\tpca9685AllLedOnHReg  = 0xFB\n\tpca9685AllLedOffLReg = 0xFC\n\tpca9685AllLedOffHReg = 0xFD\n\tpca9685PrescaleReg   = 0xFE\n\n\tpca9685Mode1RegRestartBit    = 0x80 // bit 7 - 0: restart disabled (default)\n\tpca9685Mode1RegSleepBit      = 0x10 // bit 4 - 0: normal, 1: low power (default)\n\tpca9685Mode1RegAllCallBit    = 0x01 // bit 0 - 0: no response to all-call, 1: respond to all-call (default)\n\tpca9685Mode2RegInvertBit     = 0x10 // bit 4 - 0: outputs not inverted (default), 1: outputs inverted\n\tpca9685Mode2RegOutdrvBit     = 0x04 // bit 2 - 0: open-drain, 1: totem-pole (default)\n\tpca9685AllLedOffHRegShutDown = 0x10 // bit 4 - 1: orderly shut down\n)\n\n// PCA9685Driver is a Gobot Driver for the PCA9685 16-channel 12-bit PWM/Servo controller.\n//\n// For example, here is the Adafruit board that uses this chip:\n// https://www.adafruit.com/product/815\ntype PCA9685Driver struct {\n\t*Driver\n}\n\n// NewPCA9685Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewPCA9685Driver(c Connector, options ...func(Config)) *PCA9685Driver {\n\td := &PCA9685Driver{\n\t\tDriver: NewDriver(c, \"PCA9685\", pca9685DefaultAddress),\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"PwmWrite\", func(params map[string]interface{}) interface{} {\n\t\tpin := params[\"pin\"].(string)\n\t\tval, _ := strconv.Atoi(params[\"val\"].(string))\n\t\treturn d.PwmWrite(pin, byte(val))\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ServoWrite\", func(params map[string]interface{}) interface{} {\n\t\tpin := params[\"pin\"].(string)\n\t\tval, _ := strconv.Atoi(params[\"val\"].(string))\n\t\treturn d.ServoWrite(pin, byte(val))\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetPWM\", func(params map[string]interface{}) interface{} {\n\t\tchannel, _ := strconv.Atoi(params[\"channel\"].(string))\n\t\ton, _ := strconv.Atoi(params[\"on\"].(string))\n\t\toff, _ := strconv.Atoi(params[\"off\"].(string))\n\t\treturn d.SetPWM(channel, uint16(on), uint16(off)) //nolint:gosec // TODO: fix later\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetPWMFreq\", func(params map[string]interface{}) interface{} {\n\t\tfreq, _ := strconv.ParseFloat(params[\"freq\"].(string), 32)\n\t\treturn d.SetPWMFreq(float32(freq))\n\t})\n\n\treturn d\n}\n\n// SetPWM sets a specific channel to a pwm value from 0-4095.\n// Params:\n//\n//\tchannel int - the channel to send the pulse\n//\ton uint16 - the time to start the pulse\n//\toff uint16 - the time to stop the pulse\n//\n// Most typically you set \"on\" to a zero value, and then set \"off\" to your desired duty.\nfunc (d *PCA9685Driver) SetPWM(channel int, on uint16, off uint16) error {\n\tif _, err := d.write([]byte{byte(pca9685Led0OnLReg + 4*channel), byte(on) & 0xFF}); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.write([]byte{byte(pca9685Led0OnHReg + 4*channel), byte(on >> 8)}); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.write([]byte{byte(pca9685Led0OffLReg + 4*channel), byte(off) & 0xFF}); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.write([]byte{byte(pca9685Led0OffHReg + 4*channel), byte(off >> 8)})\n\treturn err\n}\n\n// SetAllPWM sets all channels to a pwm value from 0-4095.\n// Params:\n//\n//\ton uint16 - the time to start the pulse\n//\toff uint16 - the time to stop the pulse\n//\n// Most typically you set \"on\" to a zero value, and then set \"off\" to your desired duty.\nfunc (d *PCA9685Driver) SetAllPWM(on uint16, off uint16) error {\n\tif _, err := d.write([]byte{byte(pca9685AllLedOnLReg), byte(on) & 0xFF}); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.write([]byte{byte(pca9685AllLedOnHReg), byte(on >> 8)}); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := d.write([]byte{byte(pca9685AllLedOffLReg), byte(off) & 0xFF}); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.write([]byte{byte(pca9685AllLedOffHReg), byte(off >> 8)})\n\treturn err\n}\n\n// SetPWMFreq sets the PWM frequency in Hz between 24Hz and 1526Hz, the default is 200Hz.\nfunc (d *PCA9685Driver) SetPWMFreq(freq float32) error {\n\t// internal IC oscillator frequency is 25 MHz\n\tvar prescalevel float32 = 25000000\n\t// find frequency of PWM waveform\n\tprescalevel /= 4096\n\t// ratio between desired frequency and maximum\n\tprescalevel /= freq\n\tprescalevel--\n\t// round value to nearest whole\n\tprescale := byte(prescalevel + 0.5)\n\n\tif _, err := d.write([]byte{byte(pca9685Mode1Reg)}); err != nil {\n\t\treturn err\n\t}\n\toldmode, err := d.readByte()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// put oscillator in sleep mode, clear the restart bit 7 here to prevent unneeded restart\n\tsleepMode := (oldmode &^ pca9685Mode1RegRestartBit) | pca9685Mode1RegSleepBit\n\tif _, err := d.write([]byte{byte(pca9685Mode1Reg), sleepMode}); err != nil {\n\t\treturn err\n\t}\n\t// write prescaler value\n\tif _, err := d.write([]byte{byte(pca9685PrescaleReg), prescale}); err != nil {\n\t\treturn err\n\t}\n\t// put back to old settings, ensure no sleep\n\tnoSleepMode := oldmode &^ pca9685Mode1RegSleepBit\n\tif _, err := d.write([]byte{byte(pca9685Mode1Reg), noSleepMode}); err != nil {\n\t\treturn err\n\t}\n\n\t// wait >500us according to data sheet\n\ttime.Sleep(5 * time.Millisecond)\n\n\t// initiate a restart\n\trestartMode := oldmode | pca9685Mode1RegRestartBit\n\t_, err = d.write([]byte{byte(pca9685Mode1Reg), restartMode})\n\treturn err\n}\n\n// PwmWrite writes a PWM signal to the specified channel aka \"pin\".\n// Value values are from 0-255, to conform to the PwmWriter interface.\n// If you need finer control, please look at SetPWM().\nfunc (d *PCA9685Driver) PwmWrite(pin string, val byte) error {\n\ti, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\tv := gobot.ToScale(gobot.FromScale(float64(val), 0, 255), 0, 4095)\n\treturn d.SetPWM(i, 0, uint16(v))\n}\n\n// ServoWrite writes a servo signal to the specified channel aka \"pin\".\n// Valid values are from 0-180, to conform to the ServoWriter interface.\n// If you need finer control, please look at SetPWM().\nfunc (d *PCA9685Driver) ServoWrite(pin string, val byte) error {\n\ti, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\tv := gobot.ToScale(gobot.FromScale(float64(val), 0, 180), 200, 500)\n\treturn d.SetPWM(i, 0, uint16(v))\n}\n\n// initialize the driver according to the data sheet section \"7.3.1.1 Restart mode\"\n// * ensure the sleep bit is unset\n// * wait > 500us\n// * write a logic 1 to bit 7 (RESTART) of register \"MODE1\"\nfunc (d *PCA9685Driver) initialize() error {\n\tif err := d.SetAllPWM(0, 0); err != nil {\n\t\treturn err\n\t}\n\n\t// set not inverted (default), outputs change on stop (default), OE reaction to 0 (default), totem-pole (default)\n\tif _, err := d.write([]byte{pca9685Mode2Reg, pca9685Mode2RegOutdrvBit}); err != nil {\n\t\treturn err\n\t}\n\t// reset of sleep bit together with set of no restart (default), internal clock (default), no AI (default),\n\t// no response to sub address 1, 2 or 3 (default), activate response to all-call (default)\n\tif _, err := d.write([]byte{pca9685Mode1Reg, pca9685Mode1RegAllCallBit}); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(5 * time.Millisecond)\n\n\t// initiate the restart\n\tif _, err := d.write([]byte{byte(pca9685Mode1Reg)}); err != nil {\n\t\treturn err\n\t}\n\toldmode, err := d.readByte()\n\tif err != nil {\n\t\treturn err\n\t}\n\toldmode = oldmode | byte(pca9685Mode1RegRestartBit)\n\n\tif _, err := d.write([]byte{pca9685Mode1Reg, oldmode}); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(5 * time.Millisecond)\n\n\treturn nil\n}\n\nfunc (d *PCA9685Driver) shutdown() error {\n\tif d.connection == nil {\n\t\treturn nil\n\t}\n\n\t_, err := d.write([]byte{pca9685AllLedOffHReg, pca9685AllLedOffHRegShutDown})\n\treturn err\n}\n"
  },
  {
    "path": "drivers/i2c/pca9685_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*PCA9685Driver)(nil)\n\n// and also the PwmWriter and ServoWriter interfaces\nvar (\n\t_ gpio.PwmWriter   = (*PCA9685Driver)(nil)\n\t_ gpio.ServoWriter = (*PCA9685Driver)(nil)\n)\n\nfunc initTestPCA9685WithStubbedAdaptor() (*PCA9685Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewPCA9685Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewPCA9685Driver(t *testing.T) {\n\t// arrange & act\n\td := NewPCA9685Driver(newI2cTestAdaptor())\n\t// assert\n\tassert.IsType(t, &PCA9685Driver{}, d)\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"PCA9685\"))\n\tassert.Equal(t, 0x40, d.defaultAddress)\n}\n\nfunc TestPCA9685Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\t// arrange & act\n\td := NewPCA9685Driver(newI2cTestAdaptor(), WithBus(2))\n\t// assert\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestPCA9685Start(t *testing.T) {\n\t// arrange\n\ta := newI2cTestAdaptor()\n\td := NewPCA9685Driver(a)\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x01})\n\t\treturn 1, nil\n\t}\n\t// act & assert\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestPCA9685StartError(t *testing.T) {\n\t// arrange\n\ta := newI2cTestAdaptor()\n\td := NewPCA9685Driver(a)\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, d.Start(), \"write error\")\n}\n\nfunc TestPCA9685Halt(t *testing.T) {\n\t// arrange\n\td, a := initTestPCA9685WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\t// act\n\terr := d.Halt()\n\t// assert\n\trequire.NoError(t, err)\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, []byte{0xFD, 0x10}, a.written)\n}\n\nfunc TestPCA9685HaltError(t *testing.T) {\n\t// arrange\n\td, a := initTestPCA9685WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, d.Halt(), \"write error\")\n}\n\nfunc TestPCA9685HaltIdempotent(t *testing.T) {\n\t// arrange\n\td := NewPCA9685Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestPCA9685SetPWM(t *testing.T) {\n\t// sequence to set PWM for PCA9685:\n\t// * set LEDn ON-time register (n=0: 0x06, 0x07, n=1: 0x0A, 0x0B ... n=14: 0x3E, 0x3F, n=15: 0x42, 0x43)\n\t// * set LEDn OFF-time register (n=0: 0x08, 0x09, n=1: 0x0C, 0x0D ... n=14: 0x40, 0x41, n=15: 0x44, 0x45)\n\ttests := map[string]struct {\n\t\tpin                     int\n\t\tonCounts                uint16\n\t\toffCounts               uint16\n\t\twantLedOnTimeOffTimeSet []uint8\n\t}{\n\t\t\"example1_datasheet\": {\n\t\t\tpin:                     0,\n\t\t\tonCounts:                409,\n\t\t\toffCounts:               1228,\n\t\t\twantLedOnTimeOffTimeSet: []uint8{0x06, 0x99, 0x07, 0x01, 0x08, 0xCC, 0x09, 0x04},\n\t\t},\n\t\t\"example2_datasheet\": {\n\t\t\tpin:                     4,\n\t\t\tonCounts:                3685,\n\t\t\toffCounts:               3275,\n\t\t\twantLedOnTimeOffTimeSet: []uint8{0x16, 0x65, 0x17, 0x0E, 0x18, 0xCB, 0x19, 0x0C},\n\t\t},\n\t}\n\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestPCA9685WithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of former test\n\t\t\t// act\n\t\t\terr := d.SetPWM(tc.pin, tc.onCounts, tc.offCounts)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Len(t, a.written, 8)\n\t\t\tfor writeIdx, wantVal := range tc.wantLedOnTimeOffTimeSet {\n\t\t\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d differs\", writeIdx)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPCA9685SetPWMError(t *testing.T) {\n\t// arrange\n\td, a := initTestPCA9685WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, d.SetPWM(0, 0, 256), \"write error\")\n}\n\nfunc TestPCA9685SetAllPWM(t *testing.T) {\n\t// sequence to set PWM for PCA9685:\n\t// * set LEDn ON-time register (n=0: 0x06, 0x07, n=1: 0x0A, 0x0B ... n=14: 0x3E, 0x3F, n=15: 0x42, 0x43)\n\t// * set LEDn OFF-time register (n=0: 0x08, 0x09, n=1: 0x0C, 0x0D ... n=14: 0x40, 0x41, n=15: 0x44, 0x45)\n\ttests := map[string]struct {\n\t\tpin                     byte\n\t\tonCounts                uint16\n\t\toffCounts               uint16\n\t\twantLedOnTimeOffTimeSet []uint8\n\t}{\n\t\t\"example1_datasheet\": {\n\t\t\tonCounts:                409,\n\t\t\toffCounts:               1228,\n\t\t\twantLedOnTimeOffTimeSet: []uint8{0xFA, 0x99, 0xFB, 0x01, 0xFC, 0xCC, 0xFD, 0x04},\n\t\t},\n\t\t\"example2_datasheet\": {\n\t\t\tonCounts:                3685,\n\t\t\toffCounts:               3275,\n\t\t\twantLedOnTimeOffTimeSet: []uint8{0xFA, 0x65, 0xFB, 0x0E, 0xFC, 0xCB, 0xFD, 0x0C},\n\t\t},\n\t\t\"own_example\": {\n\t\t\tonCounts:                1234,\n\t\t\toffCounts:               4321,\n\t\t\twantLedOnTimeOffTimeSet: []uint8{0xFA, 0xD2, 0xFB, 0x04, 0xFC, 0xE1, 0xFD, 0x10},\n\t\t},\n\t}\n\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestPCA9685WithStubbedAdaptor()\n\t\t\ta.written = []byte{} // reset writes of former test\n\t\t\t// act\n\t\t\terr := d.SetAllPWM(tc.onCounts, tc.offCounts)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Len(t, a.written, 8)\n\t\t\tfor writeIdx, wantVal := range tc.wantLedOnTimeOffTimeSet {\n\t\t\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d differs\", writeIdx)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPCA9685SetAllPWMError(t *testing.T) {\n\t// arrange\n\td, a := initTestPCA9685WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, d.SetAllPWM(0, 256), \"write error\")\n}\n\nfunc TestPCA9685SetPWMFreq(t *testing.T) {\n\t// sequence to set PWM frequency prescaler for PCA9685 (can only be set in sleep mode):\n\t// * read MODE1 register (0x00)\n\t// * prepare MODE1 register with sleep mode set (bit 4 - 0x10, no stopping of PWM channels done before)\n\t// * write MODE1 register\n\t// * write the prescaler value to PRE_SCALE register (0xFE)\n\t// * prepare MIODE1 register with sleep mode bit reset\n\t// * write MODE1 register\n\t// * wait > 500us\n\t// * prepare the MODE1 register with set of reset bit\n\t// * write MODE1 register\n\tconst readMode1Val = 0x0F // to check for only sleep mode bit (0x10) or reset bit (0x80) will be set\n\tvar (\n\t\twantMode1SleepSequence   = []uint8{0x00, 0x1F}\n\t\twantMode1NoSleepSequence = []uint8{0x00, readMode1Val}\n\t\twantMode1ResetSequence   = []uint8{0x00, 0x8F}\n\t)\n\ttests := map[string]struct {\n\t\tfreq                  float32\n\t\twantPrescalerSequence []uint8\n\t}{\n\t\t\"example_datasheet\": {\n\t\t\tfreq:                  200,\n\t\t\twantPrescalerSequence: []uint8{0xFE, 0x1E},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestPCA9685WithStubbedAdaptor()\n\t\t\t// arrange read for MODE1 register\n\t\t\tnumCallsRead := 0\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\tb[0] = readMode1Val\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\ta.written = []byte{} // reset writes of former test\n\t\t\t// act\n\t\t\terr := d.SetPWMFreq(tc.freq)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Len(t, a.written, 9)\n\t\t\tvar writeIdx int\n\t\t\t// for read old mode:\n\t\t\tassert.Equal(t, wantMode1SleepSequence[0], a.written[writeIdx], \"index %d differs\", writeIdx)\n\t\t\twriteIdx++\n\t\t\tfor idx, wantVal := range wantMode1SleepSequence {\n\t\t\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\t\t\twriteIdx++\n\t\t\t}\n\t\t\tfor idx, wantVal := range tc.wantPrescalerSequence {\n\t\t\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\t\t\twriteIdx++\n\t\t\t}\n\t\t\tfor idx, wantVal := range wantMode1NoSleepSequence {\n\t\t\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\t\t\twriteIdx++\n\t\t\t}\n\t\t\tfor idx, wantVal := range wantMode1ResetSequence {\n\t\t\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\t\t\twriteIdx++\n\t\t\t}\n\t\t\tassert.Equal(t, 1, numCallsRead)\n\t\t})\n\t}\n}\n\nfunc TestPCA9685SetPWMFreqReadError(t *testing.T) {\n\t// arrange\n\td, a := initTestPCA9685WithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, d.SetPWMFreq(60), \"read error\")\n}\n\nfunc TestPCA9685SetPWMFreqWriteError(t *testing.T) {\n\t// arrange\n\td, a := initTestPCA9685WithStubbedAdaptor()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, d.SetPWMFreq(60), \"write error\")\n}\n\nfunc TestPCA9685Commands(t *testing.T) {\n\t// arrange\n\td, _ := initTestPCA9685WithStubbedAdaptor()\n\t// act & assert\n\tassert.Nil(t, d.Command(\"PwmWrite\")(map[string]interface{}{\"pin\": \"1\", \"val\": \"1\"}))\n\tassert.Nil(t, d.Command(\"ServoWrite\")(map[string]interface{}{\"pin\": \"1\", \"val\": \"1\"}))\n\tassert.Nil(t, d.Command(\"SetPWM\")(map[string]interface{}{\"channel\": \"1\", \"on\": \"0\", \"off\": \"1024\"}))\n\tassert.Nil(t, d.Command(\"SetPWMFreq\")(map[string]interface{}{\"freq\": \"60\"}))\n}\n\nfunc TestPCA9685_initialize(t *testing.T) {\n\t// sequence to reset the PCA9685 in initialize():\n\t// * set all LED ON-time and OFF-time registers (0xFA..0xFD for 16 channels, each for low and high byte)\n\t// * set MODE2 register (0x01) to defaults: not inverted, outputs change on stop, OE reaction to 0, totem-pole\n\t// * set MODE1 register (0x00) to defaults, except sleep: no restart, internal clock, no AI, no sleep (not default),\n\t//   no response to sub address 1, 2 or 3, activate response to all-call\n\t// * wait > 500us, read back the MODE1 register\n\t// * prepare the MODE1 register with set of reset bit\n\t// * write MODE1 register\n\t// arrange\n\td, a := initTestPCA9685WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of former test\n\twantAllLedOnTimeOffTimeSequence := []uint8{0xFA, 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00}\n\twantMode2RegSetDefaultsSequence := []uint8{0x01, 0x04}\n\twantMode1RegSetDefaultsNoSleepSequence := []uint8{0x00, 0x01}\n\twantMode1RegResetSequence := []uint8{0x00, 0x81}\n\t// arrange read for MODE1 register\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[0] = wantMode1RegSetDefaultsNoSleepSequence[1]\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialize() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 15)\n\tvar writeIdx int\n\tfor idx, wantVal := range wantAllLedOnTimeOffTimeSequence {\n\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\twriteIdx++\n\t}\n\tfor idx, wantVal := range wantMode2RegSetDefaultsSequence {\n\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\twriteIdx++\n\t}\n\tfor idx, wantVal := range wantMode1RegSetDefaultsNoSleepSequence {\n\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\twriteIdx++\n\t}\n\t// for read old mode:\n\tassert.Equal(t, wantMode1RegSetDefaultsNoSleepSequence[0], a.written[writeIdx], \"index %d differs\", writeIdx)\n\twriteIdx++\n\tfor idx, wantVal := range wantMode1RegResetSequence {\n\t\tassert.Equal(t, wantVal, a.written[writeIdx], \"index %d (%d) differs\", writeIdx, idx)\n\t\twriteIdx++\n\t}\n\tassert.Equal(t, 1, numCallsRead)\n}\n"
  },
  {
    "path": "drivers/i2c/pcf8583_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n)\n\nconst (\n\tpcf8583Debug = false\n\n\t// PCF8583 supports addresses 0x50 and 0x51\n\t// The default address applies when the address pin is grounded.\n\tpcf8583DefaultAddress = 0x50\n\n\t// default is 0x10, when set to 0 also some free or unused RAM can be accessed\n\tpcf8583RamOffset = 0x10\n)\n\n// PCF8583Control is used to specify control and status register content\ntype PCF8583Control uint8\n\nconst (\n\t// registers are named according to the datasheet\n\tpcf8583Reg_CTRL         = iota // 0x00\n\tpcf8583Reg_SUBSEC_D0D1         // 0x01\n\tpcf8583Reg_SEC_D2D3            // 0x02\n\tpcf8583Reg_MIN_D4D5            // 0x03\n\tpcf8583Reg_HOUR                // 0x04\n\tpcf8583Reg_YEARDATE            // 0x05\n\tpcf8583Reg_WEEKDAYMONTH        // 0x06\n\tpcf8583Reg_TIMER               // 0x07\n\tpcf8583Reg_ALARMCTRL           // 0x08, offset for all alarm registers 0x09 ... 0xF\n\n\tpcf8583CtrlTimerFlag     PCF8583Control = 0x01 // 50% duty factor, seconds flag if alarm enable bit is 0\n\tpcf8583CtrlAlarmFlag     PCF8583Control = 0x02 // 50% duty factor, minutes flag if alarm enable bit is 0\n\tpcf8583CtrlAlarmEnable   PCF8583Control = 0x04 // if enabled, memory 08h is alarm control register\n\tpcf8583CtrlMask          PCF8583Control = 0x08 // 0: read 05h, 06h unmasked, 1: read date and month count directly\n\tPCF8583CtrlModeClock50   PCF8583Control = 0x10 // clock mode with 50 Hz\n\tPCF8583CtrlModeCounter   PCF8583Control = 0x20 // event counter mode\n\tPCF8583CtrlModeTest      PCF8583Control = 0x30 // test mode\n\tpcf8583CtrlHoldLastCount PCF8583Control = 0x40 // 0: count, 1: store and hold count in capture latches\n\tpcf8583CtrlStopCounting  PCF8583Control = 0x80 // 0: count, 1: stop counting, reset divider\n)\n\n// PCF8583Driver is a driver for the PCF8583 clock and calendar chip & 240 x 8-bit bit RAM with 1 address program pin.\n// please refer to data sheet: https://www.nxp.com/docs/en/data-sheet/PCF8583.pdf\n//\n// 0 1 0 1 0 0 0 A0|rd\n// Lowest bit (rd) is mapped to switch between write(0)/read(1), it is not part of the \"real\" address.\n//\n// # PCF8583 is mainly compatible to PCF8593, so this driver should also work for PCF8593 except RAM calls\n//\n// This driver was tested with Tinkerboard.\ntype PCF8583Driver struct {\n\t*Driver\n\n\tmode       PCF8583Control // clock 32.768kHz (default), clock 50Hz, event counter\n\tyearOffset int\n\tramOffset  byte\n}\n\n// NewPCF8583Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\n//\ti2c.WithPCF8583Mode(PCF8583Control): mode of this driver\nfunc NewPCF8583Driver(c Connector, options ...func(Config)) *PCF8583Driver {\n\td := &PCF8583Driver{\n\t\tDriver:    NewDriver(c, \"PCF8583\", pcf8583DefaultAddress),\n\t\tramOffset: pcf8583RamOffset,\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\t// API commands\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"WriteTime\", func(params map[string]interface{}) interface{} {\n\t\tval := params[\"val\"].(time.Time)\n\t\terr := d.WriteTime(val)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"ReadTime\", func(_ map[string]interface{}) interface{} {\n\t\tval, err := d.ReadTime()\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"WriteCounter\", func(params map[string]interface{}) interface{} {\n\t\tval := params[\"val\"].(int32)\n\t\terr := d.WriteCounter(val)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"ReadCounter\", func(_ map[string]interface{}) interface{} {\n\t\tval, err := d.ReadCounter()\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"WriteRAM\", func(params map[string]interface{}) interface{} {\n\t\taddress := params[\"address\"].(uint8)\n\t\tval := params[\"val\"].(uint8)\n\t\terr := d.WriteRAM(address, val)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ReadRAM\", func(params map[string]interface{}) interface{} {\n\t\taddress := params[\"address\"].(uint8)\n\t\tval, err := d.ReadRAM(address)\n\t\treturn map[string]interface{}{\"val\": val, \"err\": err}\n\t})\n\treturn d\n}\n\n// WithPCF8583Mode is used to change the mode between 32.678kHz clock, 50Hz clock, event counter\n// Valid settings are of type \"PCF8583Control\"\nfunc WithPCF8583Mode(mode PCF8583Control) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*PCF8583Driver)\n\t\tif ok {\n\t\t\tif !mode.isClockMode() && !mode.isCounterMode() {\n\t\t\t\tpanic(fmt.Sprintf(\"%s: mode 0x%02x is not supported\", d.name, mode))\n\t\t\t}\n\t\t\td.mode = mode\n\t\t} else if pcf8583Debug {\n\t\t\tlog.Printf(\"trying to set mode for non-PCF8583Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WriteTime setup the clock registers with the given time\nfunc (d *PCF8583Driver) WriteTime(val time.Time) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// according to chapter 7.11 of the product data sheet, the stop counting flag of the control/status register\n\t// must be set before, so we read the control byte before and only set/reset the stop\n\tctrlRegVal, err := d.readByteData(uint8(pcf8583Reg_CTRL))\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !PCF8583Control(ctrlRegVal).isClockMode() {\n\t\treturn fmt.Errorf(\"%s: can't write time because the device is in wrong mode 0x%02x\", d.name, ctrlRegVal)\n\t}\n\tyear, month, day := val.Date()\n\terr = d.writeBlockData(uint8(pcf8583Reg_CTRL),\n\t\t[]byte{\n\t\t\tctrlRegVal | uint8(pcf8583CtrlStopCounting),\n\t\t\t// sub seconds in 1/10th seconds\n\t\t\tpcf8583encodeBcd(uint8(val.Nanosecond() / 1000000 / 10)), //nolint:gosec // TODO: fix later\n\t\t\tpcf8583encodeBcd(uint8(val.Second())),                    //nolint:gosec // TODO: fix later\n\t\t\tpcf8583encodeBcd(uint8(val.Minute())),                    //nolint:gosec // TODO: fix later\n\t\t\tpcf8583encodeBcd(uint8(val.Hour())),                      //nolint:gosec // TODO: fix later\n\t\t\t// year, date (we keep the year counter zero and set the offset)\n\t\t\tpcf8583encodeBcd(uint8(day)), //nolint:gosec // TODO: fix later\n\t\t\t// month, weekday (not BCD): Sunday = 0, Monday = 1 ...\n\t\t\tuint8(val.Weekday())<<5 | pcf8583encodeBcd(uint8(month)), //nolint:gosec // TODO: fix later\n\t\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\td.yearOffset = year\n\treturn d.run(ctrlRegVal)\n}\n\n// ReadTime reads the clock and returns the value\nfunc (d *PCF8583Driver) ReadTime() (time.Time, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// according to chapter 7.1 of the product data sheet, the setting of \"hold last count\" flag\n\t// is not needed when reading with auto increment\n\tctrlRegVal, err := d.readByteData(uint8(pcf8583Reg_CTRL))\n\tif err != nil {\n\t\treturn time.Time{}, err\n\t}\n\tif !PCF8583Control(ctrlRegVal).isClockMode() {\n\t\treturn time.Time{}, fmt.Errorf(\"%s: can't read time because the device is in wrong mode 0x%02x\", d.name, ctrlRegVal)\n\t}\n\t// auto increment feature is used\n\tclockDataSize := 6\n\tdata := make([]byte, clockDataSize)\n\tread, err := d.read(data)\n\tif err != nil {\n\t\treturn time.Time{}, err\n\t}\n\tif read != clockDataSize {\n\t\treturn time.Time{}, fmt.Errorf(\"%s: %d bytes read, but %d expected\", d.name, read, clockDataSize)\n\t}\n\tnanos := int(pcf8583decodeBcd(data[0])) * 1000000 * 10 // sub seconds in 1/10th seconds\n\tseconds := int(pcf8583decodeBcd(data[1]))\n\tminutes := int(pcf8583decodeBcd(data[2]))\n\thours := int(pcf8583decodeBcd(data[3]))\n\t// year, date (the device can only count 4 years)\n\tyear := int(data[4]>>6) + d.yearOffset        // use the first two bits, no BCD\n\tdate := int(pcf8583decodeBcd(data[4] & 0x3F)) // remove the year-bits for date\n\t// weekday (not used here), month\n\tmonth := time.Month(pcf8583decodeBcd(data[5] & 0x1F)) // remove the weekday-bits\n\treturn time.Date(year, month, date, hours, minutes, seconds, nanos, time.UTC), nil\n}\n\n// WriteCounter writes the counter registers\nfunc (d *PCF8583Driver) WriteCounter(val int32) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// we don't care of negative values here\n\t// according to chapter 7.11 of the product data sheet, the stop counting flag of the control/status register\n\t// must be set before, so we read the control byte before and only set/reset the stop\n\tctrlRegVal, err := d.readByteData(uint8(pcf8583Reg_CTRL))\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !PCF8583Control(ctrlRegVal).isCounterMode() {\n\t\treturn fmt.Errorf(\"%s: can't write counter because the device is in wrong mode 0x%02x\", d.name, ctrlRegVal)\n\t}\n\terr = d.writeBlockData(uint8(pcf8583Reg_CTRL),\n\t\t[]byte{\n\t\t\tctrlRegVal | uint8(pcf8583CtrlStopCounting), // stop\n\t\t\t//nolint:gosec // TODO: fix later\n\t\t\tpcf8583encodeBcd(uint8(val % 100)), // 2 lowest digits\n\t\t\t//nolint:gosec // TODO: fix later\n\t\t\tpcf8583encodeBcd(uint8((val / 100) % 100)), // 2 middle digits\n\t\t\t//nolint:gosec // TODO: fix later\n\t\t\tpcf8583encodeBcd(uint8((val / 10000) % 100)), // 2 highest digits\n\t\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn d.run(ctrlRegVal)\n}\n\n// ReadCounter reads the counter registers\nfunc (d *PCF8583Driver) ReadCounter() (int32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// according to chapter 7.1 of the product data sheet, the setting of \"hold last count\" flag\n\t// is not needed when reading with auto increment\n\tctrlRegVal, err := d.readByteData(uint8(pcf8583Reg_CTRL))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif !PCF8583Control(ctrlRegVal).isCounterMode() {\n\t\treturn 0, fmt.Errorf(\"%s: can't read counter because the device is in wrong mode 0x%02x\", d.name, ctrlRegVal)\n\t}\n\t// auto increment feature is used\n\tcounterDataSize := 3\n\tdata := make([]byte, counterDataSize)\n\tread, err := d.read(data)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif read != counterDataSize {\n\t\treturn 0, fmt.Errorf(\"%s: %d bytes read, but %d expected\", d.name, read, counterDataSize)\n\t}\n\treturn int32(pcf8583decodeBcd(data[0])) +\n\t\tint32(pcf8583decodeBcd(data[1]))*100 +\n\t\tint32(pcf8583decodeBcd(data[2]))*10000, nil\n}\n\n// WriteRAM writes a value to a given address in memory (0x00-0xFF)\nfunc (d *PCF8583Driver) WriteRAM(address uint8, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\trealAddress := uint16(address) + uint16(d.ramOffset)\n\tif realAddress > 0xFF {\n\t\treturn fmt.Errorf(\"%s: RAM address overflow %d\", d.name, realAddress)\n\t}\n\treturn d.writeByteData(uint8(realAddress), val)\n}\n\n// ReadRAM reads a value from a given address (0x00-0xFF)\nfunc (d *PCF8583Driver) ReadRAM(address uint8) (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\trealAddress := uint16(address) + uint16(d.ramOffset)\n\tif realAddress > 0xFF {\n\t\treturn 0, fmt.Errorf(\"%s: RAM address overflow %d\", d.name, realAddress)\n\t}\n\treturn d.readByteData(uint8(realAddress))\n}\n\nfunc (d *PCF8583Driver) run(ctrlRegVal uint8) error {\n\tctrlRegVal = ctrlRegVal & ^uint8(pcf8583CtrlStopCounting) // reset stop bit\n\treturn d.writeByteData(uint8(pcf8583Reg_CTRL), ctrlRegVal)\n}\n\nfunc (d *PCF8583Driver) initialize() error {\n\t// switch to configured mode\n\tctrlRegVal, err := d.readByteData(uint8(pcf8583Reg_CTRL))\n\tif err != nil {\n\t\treturn err\n\t}\n\tif d.mode.isModeDiffer(PCF8583Control(ctrlRegVal)) {\n\t\tctrlRegVal = ctrlRegVal&^uint8(PCF8583CtrlModeTest) | uint8(d.mode)\n\t\tif err = d.writeByteData(uint8(pcf8583Reg_CTRL), ctrlRegVal); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif pcf8583Debug {\n\t\t\tif PCF8583Control(ctrlRegVal).isCounterMode() {\n\t\t\t\tlog.Printf(\"%s switched to counter mode 0x%02x\", d.name, ctrlRegVal)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"%s switched to clock mode 0x%02x\", d.name, ctrlRegVal)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (c PCF8583Control) isClockMode() bool {\n\treturn uint8(c)&uint8(PCF8583CtrlModeCounter) == 0\n}\n\nfunc (c PCF8583Control) isCounterMode() bool {\n\tcounterModeSet := (uint8(c) & uint8(PCF8583CtrlModeCounter)) != 0\n\tclockMode50Set := (uint8(c) & uint8(PCF8583CtrlModeClock50)) != 0\n\treturn counterModeSet && !clockMode50Set\n}\n\nfunc (c PCF8583Control) isModeDiffer(mode PCF8583Control) bool {\n\treturn uint8(c)&uint8(PCF8583CtrlModeTest) != uint8(mode)&uint8(PCF8583CtrlModeTest)\n}\n\nfunc pcf8583encodeBcd(val byte) byte {\n\t// decimal 12 => 0x12\n\tif val > 99 {\n\t\tval = 99\n\t\tif pcf8583Debug {\n\t\t\tlog.Printf(\"PCF8583 BCD value (%d) exceeds limit of 99, now limited.\", val)\n\t\t}\n\t}\n\thi, lo := val/10, val%10\n\treturn hi<<4 | lo\n}\n\nfunc pcf8583decodeBcd(bcd byte) byte {\n\t// 0x12 => decimal 12\n\thi, lo := bcd>>4, bcd&0x0f\n\tif hi > 9 {\n\t\thi = 9\n\t\tif pcf8583Debug {\n\t\t\tlog.Printf(\"PCF8583 BCD value (%02x) exceeds limit 0x99 on most significant digit, now limited\", bcd)\n\t\t}\n\t}\n\tif lo > 9 {\n\t\tlo = 9\n\t\tif pcf8583Debug {\n\t\t\tlog.Printf(\"PCF8583 BCD value (%02x) exceeds limit 0x99 on least significant digit, now limited\", bcd)\n\t\t}\n\t}\n\treturn 10*hi + lo\n}\n"
  },
  {
    "path": "drivers/i2c/pcf8583_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage i2c\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*PCF8583Driver)(nil)\n\nfunc initTestPCF8583WithStubbedAdaptor() (*PCF8583Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewPCF8583Driver(a)\n\t_ = d.Start()\n\treturn d, a\n}\n\nfunc TestNewPCF8583Driver(t *testing.T) {\n\tvar di interface{} = NewPCF8583Driver(newI2cTestAdaptor())\n\td, ok := di.(*PCF8583Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewPCF8583Driver() should have returned a *PCF8583Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.name, \"PCF8583\"))\n\tassert.Equal(t, 0x50, d.defaultAddress)\n\tassert.Equal(t, PCF8583Control(0x00), d.mode)\n\tassert.Equal(t, 0, d.yearOffset)\n\tassert.Equal(t, uint8(0x10), d.ramOffset)\n}\n\nfunc TestPCF8583Halt(t *testing.T) {\n\t// arrange\n\td := NewPCF8583Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestPCF8583Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewPCF8583Driver(newI2cTestAdaptor(), WithBus(2), WithPCF8583Mode(PCF8583CtrlModeClock50))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, PCF8583CtrlModeClock50, d.mode)\n}\n\nfunc TestPCF8583CommandsWriteTime(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\treadCtrlState := uint8(0x10) // clock 50Hz\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\tresult := d.Command(\"WriteTime\")(map[string]interface{}{\"val\": time.Now()})\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestPCF8583CommandsReadTime(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\td.yearOffset = 2019\n\tconst millis = 550 * time.Millisecond // 0.55 sec = 550 ms\n\twant := time.Date(2021, time.December, 24, 18, 0, 0, int(millis), time.UTC)\n\treg0Val := uint8(0x00) // clock mode 32.768 kHz\n\treg1Val := uint8(0x55) // BCD: 1/10 and 1/100 sec (55)\n\treg2Val := uint8(0x00) // BCD: 10 and 1 sec (00)\n\treg3Val := uint8(0x00) // BCD: 10 and 1 min (00)\n\treg4Val := uint8(0x18) // BCD: 10 and 1 hour (18)\n\treg5Val := uint8(0xA4) // year (2) and BCD: date (24)\n\treg6Val := uint8(0xB2) // weekday 5, bit 5 and bit 7 (0xA0) and BCD: month (0x12)\n\treturnRead := [2][]uint8{\n\t\t{reg0Val},\n\t\t{reg1Val, reg2Val, reg3Val, reg4Val, reg5Val, reg6Val},\n\t}\n\t// arrange reads\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\trr := returnRead[numCallsRead-1]\n\t\tfor i := 0; i < len(b); i++ {\n\t\t\tb[i] = rr[i]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tresult := d.Command(\"ReadTime\")(map[string]interface{}{})\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.Equal(t, want, result.(map[string]interface{})[\"val\"])\n}\n\nfunc TestPCF8583CommandsWriteCounter(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\treadCtrlState := uint8(0x20) // counter\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\tresult := d.Command(\"WriteCounter\")(map[string]interface{}{\"val\": int32(123456)})\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestPCF8583CommandsReadCounter(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\twant := int32(123456)\n\treg0Val := uint8(0x20) // counter mode\n\treg1Val := uint8(0x56) // BCD: 56\n\treg2Val := uint8(0x34) // BCD: 34\n\treg3Val := uint8(0x12) // BCD: 12\n\treturnRead := [2][]uint8{\n\t\t{reg0Val},\n\t\t{reg1Val, reg2Val, reg3Val},\n\t}\n\t// arrange reads\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\trr := returnRead[numCallsRead-1]\n\t\tfor i := 0; i < len(b); i++ {\n\t\t\tb[i] = rr[i]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tresult := d.Command(\"ReadCounter\")(map[string]interface{}{})\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.Equal(t, want, result.(map[string]interface{})[\"val\"])\n}\n\nfunc TestPCF8583CommandsWriteRAM(t *testing.T) {\n\t// arrange\n\td, _ := initTestPCF8583WithStubbedAdaptor()\n\taddressValue := map[string]interface{}{\n\t\t\"address\": uint8(0x12),\n\t\t\"val\":     uint8(0x45),\n\t}\n\t// act\n\tresult := d.Command(\"WriteRAM\")(addressValue)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestPCF8583CommandsReadRAM(t *testing.T) {\n\t// arrange\n\td, _ := initTestPCF8583WithStubbedAdaptor()\n\taddress := map[string]interface{}{\n\t\t\"address\": uint8(0x34),\n\t}\n\t// act\n\tresult := d.Command(\"ReadRAM\")(address)\n\t// assert\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n\tassert.Equal(t, uint8(0), result.(map[string]interface{})[\"val\"])\n}\n\nfunc TestPCF8583WriteTime(t *testing.T) {\n\t// sequence to write the time:\n\t// * read control register for get current state and ensure an clock mode is set\n\t// * write the control register (stop counting)\n\t// * create the values for date registers (default is 24h mode)\n\t// * write the clock and calendar registers with auto increment\n\t// * write the control register (start counting)\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{}                  // reset writes of Start() and former test\n\treadCtrlState := uint8(0x07)          // 32.768kHz clock mode\n\tconst millis = 210 * time.Millisecond // 0.21 sec = 210 ms\n\tinitDate := time.Date(2022, time.December, 16, 15, 14, 13, int(millis), time.UTC)\n\twantCtrlStop := uint8(0x87)  // stop counting bit is set\n\twantReg1Val := uint8(0x21)   // BCD: 1/10 and 1/100 sec (21)\n\twantReg2Val := uint8(0x13)   // BCD: 10 and 1 sec (13)\n\twantReg3Val := uint8(0x14)   // BCD: 10 and 1 min (14)\n\twantReg4Val := uint8(0x15)   // BCD: 10 and 1 hour (15)\n\twantReg5Val := uint8(0x16)   // year (0) and BCD: date (16)\n\twantReg6Val := uint8(0xB2)   // weekday 5, bit 5 and bit 7 (0xA0) and BCD: month (0x12)\n\twantCrtlStart := uint8(0x07) // stop counting bit is reset\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\terr := d.WriteTime(initDate)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, initDate.Year(), d.yearOffset)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Len(t, a.written, 11)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[1])\n\tassert.Equal(t, wantCtrlStop, a.written[2])\n\tassert.Equal(t, wantReg1Val, a.written[3])\n\tassert.Equal(t, wantReg2Val, a.written[4])\n\tassert.Equal(t, wantReg3Val, a.written[5])\n\tassert.Equal(t, wantReg4Val, a.written[6])\n\tassert.Equal(t, wantReg5Val, a.written[7])\n\tassert.Equal(t, wantReg6Val, a.written[8])\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[9])\n\tassert.Equal(t, wantCrtlStart, a.written[10])\n}\n\nfunc TestPCF8583WriteTimeNoTimeModeFails(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{}         // reset writes of Start() and former test\n\treadCtrlState := uint8(0x30) // test mode\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\terr := d.WriteTime(time.Now())\n\t// assert\n\trequire.Error(t, err)\n\trequire.ErrorContains(t, err, \"wrong mode 0x30\")\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, 1, numCallsRead)\n}\n\nfunc TestPCF8583ReadTime(t *testing.T) {\n\t// sequence to read the time:\n\t// * read the control register to determine mask flag and ensure an clock mode is set\n\t// * read the clock and calendar registers with auto increment\n\t// * create the value out of registers content\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\td.yearOffset = 2020\n\tconst millis = 210 * time.Millisecond // 0.21 sec = 210 ms\n\twant := time.Date(2022, time.December, 16, 15, 14, 13, int(millis), time.UTC)\n\treg0Val := uint8(0x10) // clock mode 50Hz\n\treg1Val := uint8(0x21) // BCD: 1/10 and 1/100 sec (21)\n\treg2Val := uint8(0x13) // BCD: 10 and 1 sec (13)\n\treg3Val := uint8(0x14) // BCD: 10 and 1 min (14)\n\treg4Val := uint8(0x15) // BCD: 10 and 1 hour (15)\n\treg5Val := uint8(0x96) // year (2) and BCD: date (16)\n\treg6Val := uint8(0xB2) // weekday 5, bit 5 and bit 7 (0xA0) and BCD: month (0x12)\n\treturnRead := [2][]uint8{\n\t\t{reg0Val},\n\t\t{reg1Val, reg2Val, reg3Val, reg4Val, reg5Val, reg6Val},\n\t}\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\trr := returnRead[numCallsRead-1]\n\t\tfor i := 0; i < len(b); i++ {\n\t\t\tb[i] = rr[i]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.ReadTime()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.Equal(t, want, got)\n}\n\nfunc TestPCF8583ReadTimeNoTimeModeFails(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{}         // reset writes of Start() and former test\n\treadCtrlState := uint8(0x20) // counter mode\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.ReadTime()\n\t// assert\n\trequire.Error(t, err)\n\trequire.ErrorContains(t, err, \"wrong mode 0x20\")\n\tassert.Equal(t, time.Time{}, got)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, 1, numCallsRead)\n}\n\nfunc TestPCF8583WriteCounter(t *testing.T) {\n\t// sequence to write the counter:\n\t// * read control register for get current state and ensure the event counter mode is set\n\t// * write the control register (stop counting)\n\t// * create the values for counter registers\n\t// * write the counter registers\n\t// * write the control register (start counting)\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{}         // reset writes of Start() and former test\n\treadCtrlState := uint8(0x27) // counter mode\n\tinitCount := int32(654321)   // 6 digits used of 10 possible with int32\n\twantCtrlStop := uint8(0xA7)  // stop counting bit is set\n\twantReg1Val := uint8(0x21)   // BCD: 21\n\twantReg2Val := uint8(0x43)   // BCD: 43\n\twantReg3Val := uint8(0x65)   // BCD: 65\n\twantCtrlStart := uint8(0x27) // counter mode\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\terr := d.WriteCounter(initCount)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Len(t, a.written, 8)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[1])\n\tassert.Equal(t, wantCtrlStop, a.written[2])\n\tassert.Equal(t, wantReg1Val, a.written[3])\n\tassert.Equal(t, wantReg2Val, a.written[4])\n\tassert.Equal(t, wantReg3Val, a.written[5])\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[6])\n\tassert.Equal(t, wantCtrlStart, a.written[7])\n}\n\nfunc TestPCF8583WriteCounterNoCounterModeFails(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{}         // reset writes of Start() and former test\n\treadCtrlState := uint8(0x10) // 50Hz mode\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\terr := d.WriteCounter(123)\n\t// assert\n\trequire.Error(t, err)\n\trequire.ErrorContains(t, err, \"wrong mode 0x10\")\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, 1, numCallsRead)\n}\n\nfunc TestPCF8583ReadCounter(t *testing.T) {\n\t// sequence to read the counter:\n\t// * read the control register to ensure the event counter mode is set\n\t// * read the counter registers\n\t// * create the value out of registers content\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\twant := int32(654321)\n\treg0Val := uint8(0x20) // counter mode\n\treg1Val := uint8(0x21) // BCD: 21\n\treg2Val := uint8(0x43) // BCD: 43\n\treg3Val := uint8(0x65) // BCD: 65\n\treturnRead := [2][]uint8{\n\t\t{reg0Val},\n\t\t{reg1Val, reg2Val, reg3Val},\n\t}\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\trr := returnRead[numCallsRead-1]\n\t\tfor i := 0; i < len(b); i++ {\n\t\t\tb[i] = rr[i]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.ReadCounter()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.Equal(t, want, got)\n}\n\nfunc TestPCF8583ReadCounterNoCounterModeFails(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{}         // reset writes of Start() and former test\n\treadCtrlState := uint8(0x30) // test mode\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.ReadCounter()\n\t// assert\n\trequire.Error(t, err)\n\trequire.ErrorContains(t, err, \"wrong mode 0x30\")\n\tassert.Equal(t, int32(0), got)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, 1, numCallsRead)\n}\n\nfunc TestPCF8583WriteRam(t *testing.T) {\n\t// sequence to write the RAM:\n\t// * calculate the RAM address and check for valid range\n\t// * write the given value to the given RAM address\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\twantRAMAddress := uint8(0xFF)\n\twantRAMValue := uint8(0xEF)\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// act\n\terr := d.WriteRAM(wantRAMAddress-pcf8583RamOffset, wantRAMValue)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, wantRAMAddress, a.written[0])\n\tassert.Equal(t, wantRAMValue, a.written[1])\n}\n\nfunc TestPCF8583WriteRamAddressOverflowFails(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\t// act\n\terr := d.WriteRAM(uint8(0xF0), 15)\n\t// assert\n\trequire.Error(t, err)\n\trequire.ErrorContains(t, err, \"overflow 256\")\n\tassert.Empty(t, a.written)\n}\n\nfunc TestPCF8583ReadRam(t *testing.T) {\n\t// sequence to read the RAM:\n\t// * calculate the RAM address and check for valid range\n\t// * read the value from the given RAM address\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\twantRAMAddress := uint8(pcf8583RamOffset)\n\twant := uint8(0xAB)\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = want\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.ReadRAM(wantRAMAddress - pcf8583RamOffset)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, want, got)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, wantRAMAddress, a.written[0])\n\tassert.Equal(t, 1, numCallsRead)\n}\n\nfunc TestPCF8583ReadRamAddressOverflowFails(t *testing.T) {\n\t// arrange\n\td, a := initTestPCF8583WithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.ReadRAM(uint8(0xF0))\n\t// assert\n\trequire.Error(t, err)\n\trequire.ErrorContains(t, err, \"overflow 256\")\n\tassert.Equal(t, uint8(0), got)\n\tassert.Empty(t, a.written)\n\tassert.Equal(t, 0, numCallsRead)\n}\n\nfunc TestPCF8583_initializeNoModeSwitch(t *testing.T) {\n\t// arrange\n\ta := newI2cTestAdaptor()\n\td := NewPCF8583Driver(a)\n\ta.written = []byte{}         // reset writes of former tests\n\treadCtrlState := uint8(0x01) // 32.768kHz clock mode\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialize() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n}\n\nfunc TestPCF8583_initializeWithModeSwitch(t *testing.T) {\n\t// sequence to change mode:\n\t// * read control register for get current state\n\t// * reset old mode bits and set new mode bit\n\t// * write the control register\n\t// arrange\n\ta := newI2cTestAdaptor()\n\td := NewPCF8583Driver(a)\n\td.mode = PCF8583CtrlModeCounter\n\ta.written = []byte{}         // reset writes of former tests\n\treadCtrlState := uint8(0x02) // 32.768kHz clock mode\n\twantReg0Val := uint8(0x22)   // event counter mode\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tb[len(b)-1] = readCtrlState\n\t\treturn len(b), nil\n\t}\n\t// act, assert - initialize() must be called on Start()\n\terr := d.Start()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, numCallsRead)\n\tassert.Len(t, a.written, 3)\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[0])\n\tassert.Equal(t, uint8(pcf8583Reg_CTRL), a.written[1])\n\tassert.Equal(t, wantReg0Val, a.written[2])\n}\n"
  },
  {
    "path": "drivers/i2c/pcf8591_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\t\"time\"\n)\n\n// PCF8591 supports addresses from 0x48 to 0x4F\n// The default address applies when all address pins connected to ground.\nconst pcf8591DefaultAddress = 0x48\n\nconst (\n\tpcf8591Debug = false\n)\n\ntype (\n\tpcf8591Mode    uint8\n\tPCF8591Channel uint8\n)\n\nconst (\n\tpcf8591_CHAN0 PCF8591Channel = 0x00\n\tpcf8591_CHAN1 PCF8591Channel = 0x01\n\tpcf8591_CHAN2 PCF8591Channel = 0x02\n\tpcf8591_CHAN3 PCF8591Channel = 0x03\n)\n\nconst pcf8591_AION = 0x04 // auto increment, only relevant for ADC\n\nconst (\n\tpcf8591_ALLSINGLE pcf8591Mode = 0x00\n\tpcf8591_THREEDIFF pcf8591Mode = 0x10\n\tpcf8591_MIXED     pcf8591Mode = 0x20\n\tpcf8591_TWODIFF   pcf8591Mode = 0x30\n\tpcf8591_ANAON     pcf8591Mode = 0x40\n)\n\nconst pcf8591_ADMASK = 0x33 // channels and mode\n\ntype pcf8591ModeChan struct {\n\tmode    pcf8591Mode\n\tchannel PCF8591Channel\n}\n\n// modeMap is to define the relation between a given description and the mode and channel\n// beside the long form there are some short forms available without risk of confusion\n//\n// pure single mode\n// \"s.0\"...\"s.3\": read single value of input n => channel n\n// pure differential mode\n// \"d.0-1\": differential value between input 0 and 1 => channel 0\n// \"d.2-3\": differential value between input 2 and 3 => channel 1\n// mixed mode\n// \"m.0\": single value of input 0  => channel 0\n// \"m.1\": single value of input 1  => channel 1\n// \"m.2-3\": differential value between input 2 and 3 => channel 2\n// three differential inputs, related to input 3\n// \"t.0-3\": differential value between input 0 and 3 => channel 0\n// \"t.1-3\": differential value between input 1 and 3 => channel 1\n// \"t.2-3\": differential value between input 1 and 3 => channel 2\nvar pcf8591ModeMap = map[string]pcf8591ModeChan{\n\t\"s.0\":   {pcf8591_ALLSINGLE, pcf8591_CHAN0},\n\t\"0\":     {pcf8591_ALLSINGLE, pcf8591_CHAN0},\n\t\"s.1\":   {pcf8591_ALLSINGLE, pcf8591_CHAN1},\n\t\"1\":     {pcf8591_ALLSINGLE, pcf8591_CHAN1},\n\t\"s.2\":   {pcf8591_ALLSINGLE, pcf8591_CHAN2},\n\t\"2\":     {pcf8591_ALLSINGLE, pcf8591_CHAN2},\n\t\"s.3\":   {pcf8591_ALLSINGLE, pcf8591_CHAN3},\n\t\"3\":     {pcf8591_ALLSINGLE, pcf8591_CHAN3},\n\t\"d.0-1\": {pcf8591_TWODIFF, pcf8591_CHAN0},\n\t\"0-1\":   {pcf8591_TWODIFF, pcf8591_CHAN0},\n\t\"d.2-3\": {pcf8591_TWODIFF, pcf8591_CHAN1},\n\t\"m.0\":   {pcf8591_MIXED, pcf8591_CHAN0},\n\t\"m.1\":   {pcf8591_MIXED, pcf8591_CHAN1},\n\t\"m.2-3\": {pcf8591_MIXED, pcf8591_CHAN2},\n\t\"t.0-3\": {pcf8591_THREEDIFF, pcf8591_CHAN0},\n\t\"0-3\":   {pcf8591_THREEDIFF, pcf8591_CHAN0},\n\t\"t.1-3\": {pcf8591_THREEDIFF, pcf8591_CHAN1},\n\t\"1-3\":   {pcf8591_THREEDIFF, pcf8591_CHAN1},\n\t\"t.2-3\": {pcf8591_THREEDIFF, pcf8591_CHAN2},\n}\n\n// PCF8591Driver is a Gobot Driver for the PCF8591 8-bit 4xA/D & 1xD/A converter with i2c (100 kHz) and 3 address pins.\n// The analog inputs can be used as differential inputs in different ways.\n//\n// All values are linear scaled to 3.3V by default. This can be changed, see example \"tinkerboard_pcf8591.go\".\n//\n// Address specification:\n// 1 0 0 1 A2 A1 A0|rd\n// Lowest bit (rd) is mapped to switch between write(0)/read(1), it is not part of the \"real\" address.\n//\n// Example: A1,A2=1, others are 0\n// Address mask => 1001110|1 => real 7-bit address mask 0100 1110 = 0x4E\n//\n// For example, here is the Adafruit board that uses this chip:\n// https://www.adafruit.com/product/4648\n//\n// This driver was tested with Tinkerboard and the YL-40 driver.\ntype PCF8591Driver struct {\n\t*Driver\n\n\tlastCtrlByte        byte\n\tlastAnaOut          byte\n\tadditionalReadWrite uint8\n\tadditionalRead      uint8\n\tforceRefresh        bool\n\tLastRead            [][]byte // for debugging purposes\n}\n\n// NewPCF8591Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int): bus to use with this driver\n//\ti2c.WithAddress(int): address to use with this driver\n//\ti2c.WithPCF8591With400kbitStabilization(uint8, uint8): stabilize read in 400 kbit mode\nfunc NewPCF8591Driver(c Connector, options ...func(Config)) *PCF8591Driver {\n\td := &PCF8591Driver{\n\t\tDriver: NewDriver(c, \"PCF8591\", pcf8591DefaultAddress),\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// WithPCF8591With400kbitStabilization option sets the PCF8591 additionalReadWrite and additionalRead value\nfunc WithPCF8591With400kbitStabilization(additionalReadWrite, additionalRead int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*PCF8591Driver)\n\t\tif ok {\n\t\t\tif additionalReadWrite < 0 {\n\t\t\t\tadditionalReadWrite = 1 // works in most cases\n\t\t\t}\n\t\t\tif additionalRead < 0 {\n\t\t\t\tadditionalRead = 2 // works in most cases\n\t\t\t}\n\t\t\td.additionalReadWrite = uint8(additionalReadWrite) //nolint:gosec // checked before\n\t\t\td.additionalRead = uint8(additionalRead)           //nolint:gosec // checked before\n\t\t\tif pcf8591Debug {\n\t\t\t\tlog.Printf(\"400 kbit stabilization for PCF8591Driver set rw: %d, r: %d\", d.additionalReadWrite, d.additionalRead)\n\t\t\t}\n\t\t} else if pcf8591Debug {\n\t\t\tlog.Printf(\"trying to set 400 kbit stabilization for non-PCF8591Driver %v\", c)\n\t\t}\n\t}\n}\n\n// WithPCF8591ForceRefresh option modifies the PCF8591Driver forceRefresh option\n// Setting to true (1) will force refresh operation to register, although there is no change.\n// Normally this is not needed, so default is off (0).\n// When there is something flaky, there is a small chance to stabilize by setting this flag to true.\n// However, setting this flag to true slows down each IO operation up to 100%.\nfunc WithPCF8591ForceRefresh(val uint8) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*PCF8591Driver)\n\t\tif ok {\n\t\t\td.forceRefresh = val > 0\n\t\t} else if pcf8591Debug {\n\t\t\tlog.Printf(\"Trying to set forceRefresh for non-PCF8591Driver %v\", c)\n\t\t}\n\t}\n}\n\n// AnalogRead returns value from analog reading of given input description\n//\n// Vlsb = (Vref-Vagnd)/256, value = (Van+ - Van-)/Vlsb, Van-=Vagnd for single mode\n//\n// The first read contains the last converted value (usually the last read).\n// After the channel was switched this means the value of the previous read channel.\n// After power on, the first byte read will be 80h, because the read is one cycle behind.\n//\n// Important note for 440 kbit mode:\n// With a bus speed of 100 kBit/sec, the ADC conversion has ~80 us + ACK (time to transfer the previous value).\n// This time is the limit for A-D conversion (datasheet 90 us).\n// An i2c bus extender (LTC4311) don't fix it (it seems rather the opposite).\n//\n// This leads to following behavior:\n//   - the control byte is not written correctly\n//   - the transition process takes an additional cycle, very often\n//   - some circuits takes one cycle longer transition time in addition\n//   - reading more than one byte by Read([]byte), e.g. to calculate an average, is not sufficient,\n//     because some missing integration steps in each conversion (each byte value is a little bit lower than expected)\n//\n// So, for default, we drop the first three bytes to get the right value.\nfunc (d *PCF8591Driver) AnalogRead(description string) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tmc, err := PCF8591ParseModeChan(description)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// reset channel and mode\n\tctrlByte := d.lastCtrlByte & ^uint8(pcf8591_ADMASK)\n\t// set to current channel and mode, AI must be off, because we need reading twice\n\tctrlByte = ctrlByte | uint8(mc.mode) | uint8(mc.channel) & ^uint8(pcf8591_AION)\n\n\tvar uval byte\n\td.LastRead = make([][]byte, d.additionalReadWrite+1)\n\t// repeated write and read cycle to stabilize value in 400 kbit mode\n\tfor writeReadCycle := uint8(1); writeReadCycle <= d.additionalReadWrite+1; writeReadCycle++ {\n\t\tif err = d.writeCtrlByte(ctrlByte, d.forceRefresh || writeReadCycle > 1); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\t// initiate read but skip some bytes\n\t\tif err := d.readBuf(writeReadCycle, 1+d.additionalRead); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\t// additional relax time\n\t\ttime.Sleep(1 * time.Millisecond)\n\n\t\t// real used read\n\t\tif uval, err = d.readByte(); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\tif pcf8591Debug {\n\t\t\td.LastRead[writeReadCycle-1] = append(d.LastRead[writeReadCycle-1], uval)\n\t\t}\n\t}\n\n\t// prepare return value\n\tvalue := int(uval)\n\tif mc.pcf8591IsDiff() {\n\t\tif uval > 127 {\n\t\t\t// first bit is set, means negative\n\t\t\tvalue = int(uval) - 256\n\t\t}\n\t}\n\n\treturn value, nil\n}\n\n// AnalogWrite writes the given value to the analog output (DAC)\n// Vlsb = (Vref-Vagnd)/256, Vaout = Vagnd+Vlsb*value\n// implements the aio.AnalogWriter interface, pin is unused here\nfunc (d *PCF8591Driver) AnalogWrite(pin string, value int) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tbyteVal := byte(value)\n\n\tif d.lastAnaOut == byteVal {\n\t\tif pcf8591Debug {\n\t\t\tlog.Printf(\"write skipped because value unchanged: 0x%X\\n\", byteVal)\n\t\t}\n\t\treturn nil\n\t}\n\n\tctrlByte := d.lastCtrlByte | byte(pcf8591_ANAON)\n\tif err := d.writeByteData(ctrlByte, byteVal); err != nil {\n\t\treturn err\n\t}\n\n\td.lastCtrlByte = ctrlByte\n\td.lastAnaOut = byteVal\n\treturn nil\n}\n\n// AnalogOutputState enables or disables the analog output\n// Please note that in case of using the internal oscillator\n// and the auto increment mode the output should not switched off.\n// Otherwise conversion errors could occur.\nfunc (d *PCF8591Driver) AnalogOutputState(state bool) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.analogOutputState(state)\n}\n\n// PCF8591ParseModeChan is used to get a working combination between mode (single, mixed, 2 differential,\n// 3 differential) and the related channel to read from, parsed from the given description string.\nfunc PCF8591ParseModeChan(description string) (*pcf8591ModeChan, error) {\n\tmc, ok := pcf8591ModeMap[description]\n\tif !ok {\n\t\tdescriptions := []string{}\n\t\tfor k := range pcf8591ModeMap {\n\t\t\tdescriptions = append(descriptions, k)\n\t\t}\n\t\tds := strings.Join(descriptions, \", \")\n\t\treturn nil, fmt.Errorf(\"unknown description '%s' for read analog value, accepted values: %s\", description, ds)\n\t}\n\n\treturn &mc, nil\n}\n\nfunc (d *PCF8591Driver) writeCtrlByte(ctrlByte uint8, forceRefresh bool) error {\n\tif d.lastCtrlByte != ctrlByte || forceRefresh {\n\t\tif err := d.writeByte(ctrlByte); err != nil {\n\t\t\treturn err\n\t\t}\n\t\td.lastCtrlByte = ctrlByte\n\t} else if pcf8591Debug {\n\t\tlog.Printf(\"write skipped because control byte unchanged: 0x%X\\n\", ctrlByte)\n\t}\n\treturn nil\n}\n\nfunc (d *PCF8591Driver) readBuf(nr uint8, cntBytes uint8) error {\n\tbuf := make([]byte, cntBytes)\n\tcntRead, err := d.read(buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif cntRead != len(buf) {\n\t\treturn fmt.Errorf(\"not enough bytes (%d of %d) read\", cntRead, len(buf))\n\t}\n\tif pcf8591Debug {\n\t\td.LastRead[nr-1] = buf\n\t}\n\treturn nil\n}\n\nfunc (mc pcf8591ModeChan) pcf8591IsDiff() bool {\n\tswitch mc.mode {\n\tcase pcf8591_TWODIFF:\n\t\treturn true\n\tcase pcf8591_THREEDIFF:\n\t\treturn true\n\tcase pcf8591_MIXED:\n\t\treturn mc.channel == pcf8591_CHAN2\n\tdefault:\n\t\treturn false\n\t}\n}\n\nfunc (d *PCF8591Driver) initialize() error {\n\treturn d.analogOutputState(false)\n}\n\nfunc (d *PCF8591Driver) shutdown() error {\n\treturn d.analogOutputState(false)\n}\n\nfunc (d *PCF8591Driver) analogOutputState(state bool) error {\n\tvar ctrlByte uint8\n\tif state {\n\t\tctrlByte = d.lastCtrlByte | byte(pcf8591_ANAON)\n\t} else {\n\t\tctrlByte = d.lastCtrlByte & ^uint8(pcf8591_ANAON)\n\t}\n\n\tif err := d.writeCtrlByte(ctrlByte, d.forceRefresh); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/pcf8591_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*PCF8591Driver)(nil)\n\nfunc initTestPCF8591DriverWithStubbedAdaptor() (*PCF8591Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewPCF8591Driver(a, WithPCF8591With400kbitStabilization(0, 2))\n\td.lastCtrlByte = 0xFF // prevent skipping of write\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewPCF8591Driver(t *testing.T) {\n\tvar di interface{} = NewPCF8591Driver(newI2cTestAdaptor())\n\td, ok := di.(*PCF8591Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewPCF8591Driver() should have returned a *PCF8591Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"PCF8591\"))\n\tassert.Equal(t, 0x48, d.defaultAddress)\n}\n\nfunc TestPCF8591Start(t *testing.T) {\n\td := NewPCF8591Driver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestPCF8591Halt(t *testing.T) {\n\t// arrange\n\td := NewPCF8591Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestPCF8591WithPCF8591With400kbitStabilization(t *testing.T) {\n\td := NewPCF8591Driver(newI2cTestAdaptor(), WithPCF8591With400kbitStabilization(5, 6))\n\tassert.Equal(t, uint8(5), d.additionalReadWrite)\n\tassert.Equal(t, uint8(6), d.additionalRead)\n}\n\nfunc TestPCF8591AnalogReadSingle(t *testing.T) {\n\t// sequence to read the input channel:\n\t// * prepare value (with channel and mode) and write control register\n\t// * read 3 values to drop (see description in implementation)\n\t// * read the analog value\n\t//\n\t// arrange\n\td, a := initTestPCF8591DriverWithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\tdescription := \"s.1\"\n\td.lastCtrlByte = 0x00\n\tctrlByteOn := uint8(pcf8591_ALLSINGLE) | uint8(pcf8591_CHAN1)\n\treturnRead := []uint8{0x01, 0x02, 0x03, 0xFF}\n\twant := int(returnRead[3])\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\tb = returnRead[0:len(b)]\n\t\t}\n\t\tif numCallsRead == 2 {\n\t\t\tb[0] = returnRead[len(returnRead)-1]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.AnalogRead(description)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, ctrlByteOn, a.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.Equal(t, want, got)\n}\n\nfunc TestPCF8591AnalogReadDiff(t *testing.T) {\n\t// sequence to read the input channel:\n\t// * prepare value (with channel and mode) and write control register\n\t// * read 3 values to drop (see description in implementation)\n\t// * read the analog value\n\t// * convert to 8-bit two's complement (-127...128)\n\t//\n\t// arrange\n\td, a := initTestPCF8591DriverWithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\tdescription := \"m.2-3\"\n\td.lastCtrlByte = 0x00\n\tctrlByteOn := uint8(pcf8591_MIXED) | uint8(pcf8591_CHAN2)\n\t// some two' complements\n\t// 0x80 => -128\n\t// 0xFF => -1\n\t// 0x00 => 0\n\t// 0x7F => 127\n\treturnRead := []uint8{0x01, 0x02, 0x03, 0xFF}\n\twant := -1\n\t// arrange reads\n\tnumCallsRead := 0\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\tb = returnRead[0:len(b)]\n\t\t}\n\t\tif numCallsRead == 2 {\n\t\t\tb[0] = returnRead[len(returnRead)-1]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := d.AnalogRead(description)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, ctrlByteOn, a.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.Equal(t, want, got)\n}\n\nfunc TestPCF8591AnalogWrite(t *testing.T) {\n\t// sequence to write the output:\n\t// * create new value for the control register (ANAON)\n\t// * write the control register and value\n\t//\n\t// arrange\n\td, a := initTestPCF8591DriverWithStubbedAdaptor()\n\ta.written = []byte{} // reset writes of Start() and former test\n\td.lastCtrlByte = 0x00\n\td.lastAnaOut = 0x00\n\tctrlByteOn := uint8(pcf8591_ANAON)\n\twant := uint8(0x15)\n\t// arrange writes\n\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// act\n\terr := d.AnalogWrite(\"\", int(want))\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 2)\n\tassert.Equal(t, ctrlByteOn, a.written[0])\n\tassert.Equal(t, want, a.written[1])\n}\n\nfunc TestPCF8591AnalogOutputState(t *testing.T) {\n\t// sequence to set the state:\n\t// * create the new value (ctrlByte) for the control register (ANAON)\n\t// * write the register value\n\t//\n\t// arrange\n\td, a := initTestPCF8591DriverWithStubbedAdaptor()\n\tfor bitState := 0; bitState <= 1; bitState++ {\n\t\ta.written = []byte{} // reset writes of Start() and former test\n\t\t// arrange some values\n\t\td.lastCtrlByte = uint8(0x00)\n\t\twantCtrlByteVal := uint8(pcf8591_ANAON)\n\t\tif bitState == 0 {\n\t\t\td.lastCtrlByte = uint8(0xFF)\n\t\t\twantCtrlByteVal = uint8(0xFF & ^pcf8591_ANAON)\n\t\t}\n\t\t// act\n\t\terr := d.AnalogOutputState(bitState == 1)\n\t\t// assert\n\t\trequire.NoError(t, err)\n\t\tassert.Len(t, a.written, 1)\n\t\tassert.Equal(t, wantCtrlByteVal, a.written[0])\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/sht2x_driver.go",
    "content": "/*\n * Copyright (c) 2016-2017 Weston Schmidt <weston_schmidt@alumni.purdue.edu>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage i2c\n\n// SHT2xDriver is a driver for the SHT2x based devices.\n//\n// This module was tested with Sensirion SHT21 Breakout.\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/sigurn/crc8\"\n)\n\nconst sht2xDefaultAddress = 0x40\n\nconst (\n\t// SHT2xAccuracyLow is the faster, but lower accuracy sample setting\n\t//  0/1 = 8bit RH, 12bit Temp\n\tSHT2xAccuracyLow = byte(0x01)\n\n\t// SHT2xAccuracyMedium is the medium accuracy and speed sample setting\n\t//  1/0 = 10bit RH, 13bit Temp\n\tSHT2xAccuracyMedium = byte(0x80)\n\n\t// SHT2xAccuracyHigh is the high accuracy and slowest sample setting\n\t//  0/0 = 12bit RH, 14bit Temp\n\t//  Power on default is 0/0\n\tSHT2xAccuracyHigh = byte(0x00)\n\n\t// SHT2xTriggerTempMeasureHold is the command for measuring temperature in hold controller mode\n\tSHT2xTriggerTempMeasureHold = 0xe3\n\n\t// SHT2xTriggerHumdMeasureHold is the command for measuring humidity in hold controller mode\n\tSHT2xTriggerHumdMeasureHold = 0xe5\n\n\t// SHT2xTriggerTempMeasureNohold is the command for measuring humidity in no hold controller mode\n\tSHT2xTriggerTempMeasureNohold = 0xf3\n\n\t// SHT2xTriggerHumdMeasureNohold is the command for measuring humidity in no hold controller mode\n\tSHT2xTriggerHumdMeasureNohold = 0xf5\n\n\t// SHT2xWriteUserReg is the command for writing user register\n\tSHT2xWriteUserReg = 0xe6\n\n\t// SHT2xReadUserReg is the command for reading user register\n\tSHT2xReadUserReg = 0xe7\n\n\t// SHT2xReadUserReg is the command for reading user register\n\tSHT2xSoftReset = 0xfe\n)\n\n// SHT2xDriver is a Driver for a SHT2x humidity and temperature sensor\ntype SHT2xDriver struct {\n\t*Driver\n\n\tUnits    string\n\taccuracy byte\n\tcrcTable *crc8.Table\n}\n\n// NewSHT2xDriver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewSHT2xDriver(c Connector, options ...func(Config)) *SHT2xDriver {\n\t// From the document \"CRC Checksum Calculation -- For Safe Communication with SHT2x Sensors\":\n\tcrc8Params := crc8.Params{\n\t\tPoly:   0x31,\n\t\tInit:   0x00,\n\t\tRefIn:  false,\n\t\tRefOut: false,\n\t\tXorOut: 0x00,\n\t\tCheck:  0x00,\n\t\tName:   \"CRC-8/SENSIRION-SHT2x\",\n\t}\n\td := &SHT2xDriver{\n\t\tDriver:   NewDriver(c, \"SHT2x\", sht2xDefaultAddress),\n\t\tUnits:    \"C\",\n\t\tcrcTable: crc8.MakeTable(crc8Params),\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\nfunc (d *SHT2xDriver) Accuracy() byte { return d.accuracy }\n\n// SetAccuracy sets the accuracy of the sampling\nfunc (d *SHT2xDriver) SetAccuracy(acc byte) error {\n\td.accuracy = acc\n\n\tif d.connection != nil {\n\t\treturn d.sendAccuracy()\n\t}\n\n\treturn nil\n}\n\n// Reset does a software reset of the device\nfunc (d *SHT2xDriver) Reset() error {\n\tif err := d.writeByte(SHT2xSoftReset); err != nil {\n\t\treturn err\n\t}\n\n\ttime.Sleep(15 * time.Millisecond) // 15ms delay (from the datasheet 5.5)\n\n\treturn nil\n}\n\n// Temperature returns the current temperature, in celsius degrees.\nfunc (d *SHT2xDriver) Temperature() (float32, error) {\n\trawT, err := d.readSensor(SHT2xTriggerTempMeasureNohold)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// From the datasheet 6.2:\n\t// T[C] = -46.85 + 175.72 * St / 2^16\n\ttemp := -46.85 + 175.72/65536.0*float32(rawT)\n\n\treturn temp, nil\n}\n\n// Humidity returns the current humidity in percentage of relative humidity\nfunc (d *SHT2xDriver) Humidity() (float32, error) {\n\trawH, err := d.readSensor(SHT2xTriggerHumdMeasureNohold)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// From the datasheet 6.1:\n\t// RH = -6 + 125 * Srh / 2^16\n\thumidity := -6.0 + 125.0/65536.0*float32(rawH)\n\n\treturn humidity, nil\n}\n\n// sendCommandDelayGetResponse is a helper function to reduce duplicated code\nfunc (d *SHT2xDriver) readSensor(cmd byte) (uint16, error) {\n\tif err := d.writeByte(cmd); err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Hang out while measurement is taken. 85ms max, page 9 of datasheet.\n\ttime.Sleep(85 * time.Millisecond)\n\n\t// Comes back in three bytes, data(MSB) / data(LSB) / Checksum\n\tbuf := make([]byte, 3)\n\tcounter := 0\n\tfor {\n\t\tgot, err := d.read(buf)\n\t\tcounter++\n\t\tif counter > 50 {\n\t\t\treturn 0, err\n\t\t}\n\t\tif err == nil {\n\t\t\tif got != 3 {\n\t\t\t\treturn 0, ErrNotEnoughBytes\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\ttime.Sleep(1 * time.Millisecond)\n\t}\n\n\t// Store the result\n\tcrc := crc8.Checksum(buf[0:2], d.crcTable)\n\tif buf[2] != crc {\n\t\treturn 0, errors.New(\"invalid crc\")\n\t}\n\tread := uint16(buf[0])<<8 | uint16(buf[1])\n\tread &= 0xfffc // clear two low bits (status bits)\n\n\treturn read, nil\n}\n\nfunc (d *SHT2xDriver) initialize() error {\n\tif err := d.Reset(); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.sendAccuracy()\n}\n\nfunc (d *SHT2xDriver) sendAccuracy() error {\n\tif err := d.writeByte(SHT2xReadUserReg); err != nil {\n\t\treturn err\n\t}\n\tuserRegister, err := d.readByte()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tuserRegister &= 0x7e // Turn off the resolution bits\n\tacc := d.accuracy\n\tacc &= 0x81         // Turn off all other bits but resolution bits\n\tuserRegister |= acc // Mask in the requested resolution bits\n\n\t// Request a write to user register\n\tif _, err := d.write([]byte{SHT2xWriteUserReg, userRegister}); err != nil {\n\t\treturn err\n\t}\n\n\t_, err = d.readByte()\n\treturn err\n}\n"
  },
  {
    "path": "drivers/i2c/sht2x_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*SHT2xDriver)(nil)\n\nfunc initTestSHT2xDriverWithStubbedAdaptor() (*SHT2xDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewSHT2xDriver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewSHT2xDriver(t *testing.T) {\n\tvar di interface{} = NewSHT2xDriver(newI2cTestAdaptor())\n\td, ok := di.(*SHT2xDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewSHT2xDriver() should have returned a *SHT2xDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"SHT2x\"))\n\tassert.Equal(t, 0x40, d.defaultAddress)\n}\n\nfunc TestSHT2xOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\tb := NewSHT2xDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, b.GetBusOrDefault(1))\n}\n\nfunc TestSHT2xStart(t *testing.T) {\n\td := NewSHT2xDriver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestSHT2xHalt(t *testing.T) {\n\t// arrange\n\td := NewSHT2xDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestSHT2xReset(t *testing.T) {\n\td, a := initTestSHT2xDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\treturn 0, nil\n\t}\n\t_ = d.Start()\n\terr := d.Reset()\n\trequire.NoError(t, err)\n}\n\nfunc TestSHT2xMeasurements(t *testing.T) {\n\td, a := initTestSHT2xDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Values produced by dumping data from actual sensor\n\t\tif a.written[len(a.written)-1] == SHT2xTriggerTempMeasureNohold {\n\t\t\tbuf.Write([]byte{95, 168, 59})\n\t\t} else if a.written[len(a.written)-1] == SHT2xTriggerHumdMeasureNohold {\n\t\t\tbuf.Write([]byte{94, 202, 22})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = d.Start()\n\ttemp, err := d.Temperature()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(18.809052), temp, 1.0e-5)\n\thum, err := d.Humidity()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(40.279907), hum, 0.0)\n}\n\nfunc TestSHT2xAccuracy(t *testing.T) {\n\td, a := initTestSHT2xDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tswitch {\n\t\tcase a.written[len(a.written)-1] == SHT2xReadUserReg:\n\t\t\tbuf.Write([]byte{0x3a})\n\t\tcase a.written[len(a.written)-2] == SHT2xWriteUserReg:\n\t\t\tbuf.Write([]byte{a.written[len(a.written)-1]})\n\t\tdefault:\n\t\t\treturn 0, nil\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = d.Start()\n\t_ = d.SetAccuracy(SHT2xAccuracyLow)\n\tassert.Equal(t, SHT2xAccuracyLow, d.Accuracy())\n\terr := d.sendAccuracy()\n\trequire.NoError(t, err)\n}\n\nfunc TestSHT2xTemperatureCrcError(t *testing.T) {\n\td, a := initTestSHT2xDriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tif a.written[len(a.written)-1] == SHT2xTriggerTempMeasureNohold {\n\t\t\tbuf.Write([]byte{95, 168, 0})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\ttemp, err := d.Temperature()\n\trequire.ErrorContains(t, err, \"invalid crc\")\n\tassert.InDelta(t, float32(0.0), temp, 0.0)\n}\n\nfunc TestSHT2xHumidityCrcError(t *testing.T) {\n\td, a := initTestSHT2xDriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tif a.written[len(a.written)-1] == SHT2xTriggerHumdMeasureNohold {\n\t\t\tbuf.Write([]byte{94, 202, 0})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\thum, err := d.Humidity()\n\trequire.ErrorContains(t, err, \"invalid crc\")\n\tassert.InDelta(t, float32(0.0), hum, 0.0)\n}\n\nfunc TestSHT2xTemperatureLengthError(t *testing.T) {\n\td, a := initTestSHT2xDriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tif a.written[len(a.written)-1] == SHT2xTriggerTempMeasureNohold {\n\t\t\tbuf.Write([]byte{95, 168})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\ttemp, err := d.Temperature()\n\tassert.Equal(t, ErrNotEnoughBytes, err)\n\tassert.InDelta(t, float32(0.0), temp, 0.0)\n}\n\nfunc TestSHT2xHumidityLengthError(t *testing.T) {\n\td, a := initTestSHT2xDriverWithStubbedAdaptor()\n\t_ = d.Start()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tif a.written[len(a.written)-1] == SHT2xTriggerHumdMeasureNohold {\n\t\t\tbuf.Write([]byte{94, 202})\n\t\t}\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\thum, err := d.Humidity()\n\tassert.Equal(t, ErrNotEnoughBytes, err)\n\tassert.InDelta(t, float32(0.0), hum, 0.0)\n}\n"
  },
  {
    "path": "drivers/i2c/sht3x_driver.go",
    "content": "/*\n * Copyright (c) 2016-2017 Weston Schmidt <weston_schmidt@alumni.purdue.edu>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage i2c\n\n// SHT3xDriver is a driver for the SHT3x-D based devices.\n//\n// This module was tested with AdaFruit Sensiron SHT32-D Breakout.\n// https://www.adafruit.com/products/2857\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/sigurn/crc8\"\n)\n\n// SHT3xAddressA is the default address of device\nconst SHT3xAddressA = 0x44\n\n// SHT3xAddressB is the optional address of device\nconst SHT3xAddressB = 0x45\n\n// SHT3xAccuracyLow is the faster, but lower accuracy sample setting\nconst SHT3xAccuracyLow = 0x16\n\n// SHT3xAccuracyMedium is the medium accuracy and speed sample setting\nconst SHT3xAccuracyMedium = 0x0b\n\n// SHT3xAccuracyHigh is the high accuracy and slowest sample setting\nconst SHT3xAccuracyHigh = 0x00\n\nvar (\n\tcrc8Params = crc8.Params{\n\t\tPoly: 0x31, Init: 0xff, RefIn: false, RefOut: false, XorOut: 0x00, Check: 0xf7, Name: \"CRC-8/SENSIRON\",\n\t}\n\tErrInvalidAccuracy = errors.New(\"invalid accuracy\")\n\tErrInvalidCrc      = errors.New(\"invalid crc\")\n\tErrInvalidTemp     = errors.New(\"invalid temperature units\")\n)\n\n// SHT3xDriver is a Driver for a SHT3x humidity and temperature sensor\ntype SHT3xDriver struct {\n\t*Driver\n\n\tUnits    string\n\taccuracy byte\n\tdelay    time.Duration\n\tcrcTable *crc8.Table\n}\n\n// NewSHT3xDriver creates a new driver with specified i2c interface\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewSHT3xDriver(c Connector, options ...func(Config)) *SHT3xDriver {\n\td := &SHT3xDriver{\n\t\tDriver:   NewDriver(c, \"SHT3x\", SHT3xAddressA),\n\t\tUnits:    \"C\",\n\t\tcrcTable: crc8.MakeTable(crc8Params),\n\t}\n\tif err := d.SetAccuracy(SHT3xAccuracyHigh); err != nil {\n\t\tpanic(err)\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// Accuracy returns the accuracy of the sampling\nfunc (d *SHT3xDriver) Accuracy() byte { return d.accuracy }\n\n// SetAccuracy sets the accuracy of the sampling\nfunc (d *SHT3xDriver) SetAccuracy(a byte) error {\n\tswitch a {\n\tcase SHT3xAccuracyLow:\n\t\td.delay = 5 * time.Millisecond // Actual max is 4, wait 1 ms longer\n\tcase SHT3xAccuracyMedium:\n\t\td.delay = 7 * time.Millisecond // Actual max is 6, wait 1 ms longer\n\tcase SHT3xAccuracyHigh:\n\t\td.delay = 16 * time.Millisecond // Actual max is 15, wait 1 ms longer\n\tdefault:\n\t\treturn ErrInvalidAccuracy\n\t}\n\n\td.accuracy = a\n\n\treturn nil\n}\n\n// SerialNumber returns the serial number of the chip\nfunc (d *SHT3xDriver) SerialNumber() (uint32, error) {\n\tret, err := d.sendCommandDelayGetResponse([]byte{0x37, 0x80}, nil, 2)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tsn := (uint32(ret[0]) << 16) | uint32(ret[1])\n\n\treturn sn, nil\n}\n\n// Heater returns true if the heater is enabled\nfunc (d *SHT3xDriver) Heater() (bool, error) {\n\tsr, err := d.getStatusRegister()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tif sr&(1<<13) == 1<<13 {\n\t\treturn true, nil\n\t}\n\n\treturn false, nil\n}\n\n// SetHeater enables or disables the heater on the device\nfunc (d *SHT3xDriver) SetHeater(enabled bool) error {\n\tout := []byte{0x30, 0x66}\n\tif enabled {\n\t\tout[1] = 0x6d\n\t}\n\t_, err := d.write(out)\n\treturn err\n}\n\n// Sample returns the temperature in celsius and relative humidity for one sample\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *SHT3xDriver) Sample() (temp float32, rh float32, err error) {\n\tret, err := d.sendCommandDelayGetResponse([]byte{0x24, d.accuracy}, &d.delay, 2)\n\tif nil != err {\n\t\treturn\n\t}\n\n\t// From the datasheet:\n\t// RH = 100 * Srh / (2^16 - 1)\n\trhSample := uint64(ret[1])\n\trh = float32((uint64(1000000)*rhSample)/uint64(0xffff)) / 10000.0\n\n\ttempSample := uint64(ret[0])\n\tswitch d.Units {\n\tcase \"C\":\n\t\t// From the datasheet:\n\t\t// T[C] = -45 + 175 * (St / (2^16 - 1))\n\t\ttemp = float32((uint64(1750000)*tempSample)/uint64(0xffff)-uint64(450000)) / 10000.0\n\tcase \"F\":\n\t\t// From the datasheet:\n\t\t// T[F] = -49 + 315 * (St / (2^16 - 1))\n\t\ttemp = float32((uint64(3150000)*tempSample)/uint64(0xffff)-uint64(490000)) / 10000.0\n\tdefault:\n\t\terr = ErrInvalidTemp\n\t}\n\n\treturn\n}\n\n// getStatusRegister returns the device status register\nfunc (d *SHT3xDriver) getStatusRegister() (uint16, error) {\n\tret, err := d.sendCommandDelayGetResponse([]byte{0xf3, 0x2d}, nil, 1)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn ret[0], nil\n}\n\n// sendCommandDelayGetResponse is a helper function to reduce duplicated code\nfunc (d *SHT3xDriver) sendCommandDelayGetResponse(send []byte, delay *time.Duration, expect int) ([]uint16, error) {\n\tif _, err := d.write(send); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif nil != delay {\n\t\ttime.Sleep(*delay)\n\t}\n\n\tbuf := make([]byte, 3*expect)\n\tgot, err := d.read(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif got != (3 * expect) {\n\t\treturn nil, ErrNotEnoughBytes\n\t}\n\n\tread := make([]uint16, expect)\n\tfor i := 0; i < expect; i++ {\n\t\tcrc := crc8.Checksum(buf[i*3:i*3+2], d.crcTable)\n\t\tif buf[i*3+2] != crc {\n\t\t\treturn nil, ErrInvalidCrc\n\t\t}\n\t\tread[i] = uint16(buf[i*3])<<8 | uint16(buf[i*3+1])\n\t}\n\n\treturn read, nil\n}\n"
  },
  {
    "path": "drivers/i2c/sht3x_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*SHT3xDriver)(nil)\n\nfunc initTestSHT3xDriverWithStubbedAdaptor() (*SHT3xDriver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewSHT3xDriver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewSHT3xDriver(t *testing.T) {\n\tvar di interface{} = NewSHT3xDriver(newI2cTestAdaptor())\n\td, ok := di.(*SHT3xDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewSHT3xDriver() should have returned a *SHT3xDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"SHT3x\"))\n\tassert.Equal(t, 0x44, d.defaultAddress)\n}\n\nfunc TestSHT3xOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewSHT3xDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n\nfunc TestSHT3xStart(t *testing.T) {\n\td := NewSHT3xDriver(newI2cTestAdaptor())\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestSHT3xHalt(t *testing.T) {\n\t// arrange\n\td := NewSHT3xDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestSHT3xSampleNormal(t *testing.T) {\n\td, a := initTestSHT3xDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0xbe, 0xef, 0x92, 0xbe, 0xef, 0x92})\n\t\treturn 6, nil\n\t}\n\n\ttemp, rh, _ := d.Sample()\n\tassert.InDelta(t, float32(85.523003), temp, 0.0)\n\tassert.InDelta(t, float32(74.5845), rh, 0.0)\n\n\t// check the temp with the units in F\n\td.Units = \"F\"\n\ttemp, _, _ = d.Sample()\n\tassert.InDelta(t, float32(185.9414), temp, 0.0)\n}\n\nfunc TestSHT3xSampleBadCrc(t *testing.T) {\n\td, a := initTestSHT3xDriverWithStubbedAdaptor()\n\t// Check that the 1st crc failure is caught\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0xbe, 0xef, 0x00, 0xbe, 0xef, 0x92})\n\t\treturn 6, nil\n\t}\n\n\t_, _, err := d.Sample()\n\tassert.Equal(t, ErrInvalidCrc, err)\n\n\t// Check that the 2nd crc failure is caught\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0xbe, 0xef, 0x92, 0xbe, 0xef, 0x00})\n\t\treturn 6, nil\n\t}\n\n\t_, _, err = d.Sample()\n\tassert.Equal(t, ErrInvalidCrc, err)\n}\n\nfunc TestSHT3xSampleBadRead(t *testing.T) {\n\td, a := initTestSHT3xDriverWithStubbedAdaptor()\n\t// Check that the 1st crc failure is caught\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0xbe, 0xef, 0x00, 0xbe, 0xef})\n\t\treturn 5, nil\n\t}\n\n\t_, _, err := d.Sample()\n\tassert.Equal(t, ErrNotEnoughBytes, err)\n}\n\nfunc TestSHT3xSampleUnits(t *testing.T) {\n\td, a := initTestSHT3xDriverWithStubbedAdaptor()\n\t// Check that the 1st crc failure is caught\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0xbe, 0xef, 0x92, 0xbe, 0xef, 0x92})\n\t\treturn 6, nil\n\t}\n\n\td.Units = \"K\"\n\t_, _, err := d.Sample()\n\tassert.Equal(t, ErrInvalidTemp, err)\n}\n\n// Test internal sendCommandDelayGetResponse\nfunc TestSHT3xSCDGRIoFailures(t *testing.T) {\n\td, a := initTestSHT3xDriverWithStubbedAdaptor()\n\tinvalidRead := errors.New(\"read error\")\n\tinvalidWrite := errors.New(\"write error\")\n\n\t// Only send 5 bytes\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0xbe, 0xef, 0x92, 0xbe, 0xef})\n\t\treturn 5, nil\n\t}\n\n\t_, err := d.sendCommandDelayGetResponse(nil, nil, 2)\n\tassert.Equal(t, ErrNotEnoughBytes, err)\n\n\t// Don't read any bytes and return an error\n\ta.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, invalidRead\n\t}\n\n\t_, err = d.sendCommandDelayGetResponse(nil, nil, 1)\n\tassert.Equal(t, invalidRead, err)\n\n\t// Don't write any bytes and return an error\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 42, invalidWrite\n\t}\n\n\t_, err = d.sendCommandDelayGetResponse(nil, nil, 1)\n\tassert.Equal(t, invalidWrite, err)\n}\n\n// Test Heater and getStatusRegister\nfunc TestSHT3xHeater(t *testing.T) {\n\td, a := initTestSHT3xDriverWithStubbedAdaptor()\n\t// heater enabled\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x20, 0x00, 0x5d})\n\t\treturn 3, nil\n\t}\n\n\tstatus, err := d.Heater()\n\trequire.NoError(t, err)\n\tassert.True(t, status)\n\n\t// heater disabled\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x00, 0x00, 0x81})\n\t\treturn 3, nil\n\t}\n\n\tstatus, err = d.Heater()\n\trequire.NoError(t, err)\n\tassert.False(t, status)\n\n\t// heater crc failed\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x00, 0x00, 0x00})\n\t\treturn 3, nil\n\t}\n\n\t_, err = d.Heater()\n\tassert.Equal(t, ErrInvalidCrc, err)\n\n\t// heater read failed\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x00, 0x00})\n\t\treturn 2, nil\n\t}\n\n\t_, err = d.Heater()\n\trequire.Error(t, err)\n}\n\nfunc TestSHT3xSetHeater(t *testing.T) {\n\td, _ := initTestSHT3xDriverWithStubbedAdaptor()\n\t_ = d.SetHeater(false)\n\t_ = d.SetHeater(true)\n}\n\nfunc TestSHT3xSetAccuracy(t *testing.T) {\n\td, _ := initTestSHT3xDriverWithStubbedAdaptor()\n\n\tassert.Equal(t, byte(SHT3xAccuracyHigh), d.Accuracy())\n\n\terr := d.SetAccuracy(SHT3xAccuracyMedium)\n\trequire.NoError(t, err)\n\tassert.Equal(t, byte(SHT3xAccuracyMedium), d.Accuracy())\n\n\terr = d.SetAccuracy(SHT3xAccuracyLow)\n\trequire.NoError(t, err)\n\tassert.Equal(t, byte(SHT3xAccuracyLow), d.Accuracy())\n\n\terr = d.SetAccuracy(0xff)\n\tassert.Equal(t, ErrInvalidAccuracy, err)\n}\n\nfunc TestSHT3xSerialNumber(t *testing.T) {\n\td, a := initTestSHT3xDriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tcopy(b, []byte{0x20, 0x00, 0x5d, 0xbe, 0xef, 0x92})\n\t\treturn 6, nil\n\t}\n\n\tsn, err := d.SerialNumber()\n\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(0x2000beef), sn)\n}\n"
  },
  {
    "path": "drivers/i2c/ssd1306_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"image\"\n)\n\nconst ssd1306DefaultAddress = 0x3c\n\n// register addresses for the ssd1306\nconst (\n\t// default values\n\tssd1306Width        = 128\n\tssd1306Height       = 64\n\tssd1306ExternalVCC  = false\n\tssd1306SetStartLine = 0x40\n\t// fundamental commands\n\tssd1306SetComOutput0 = 0xC0\n\tssd1306SetComOutput1 = 0xC1\n\tssd1306SetComOutput2 = 0xC2\n\tssd1306SetComOutput3 = 0xC3\n\tssd1306SetComOutput4 = 0xC4\n\tssd1306SetComOutput5 = 0xC5\n\tssd1306SetComOutput6 = 0xC6\n\tssd1306SetComOutput7 = 0xC7\n\tssd1306SetComOutput8 = 0xC8\n\tssd1306SetContrast   = 0x81\n\t// scrolling commands\n\t// ssd1306ContinuousHScrollRight  = 0x26\n\t// ssd1306ContinuousHScrollLeft   = 0x27\n\t// ssd1306ContinuousVHScrollRight = 0x29\n\t// ssd1306ContinuousVHScrollLeft  = 0x2A\n\t// ssd1306StopScroll              = 0x2E\n\t// ssd1306StartScroll             = 0x2F\n\t// addressing settings commands\n\tssd1306SetMemoryAddressingMode = 0x20\n\tssd1306ColumnAddr              = 0x21\n\tssd1306PageAddr                = 0x22\n\t// hardware configuration commands\n\tssd1306SetSegmentRemap0     = 0xA0\n\tssd1306SetSegmentRemap127   = 0xA1\n\tssd1306DisplayOnResumeToRAM = 0xA4\n\tssd1306SetDisplayNormal     = 0xA6\n\tssd1306SetDisplayInverse    = 0xA7\n\tssd1306SetDisplayOff        = 0xAE\n\tssd1306SetDisplayOn         = 0xAF\n\t// timing and driving scheme commands\n\tssd1306SetDisplayClock      = 0xD5\n\tssd1306SetPrechargePeriod   = 0xD9\n\tssd1306SetVComDeselectLevel = 0xDB\n\tssd1306SetMultiplexRatio    = 0xA8\n\tssd1306SetComPins           = 0xDA\n\tssd1306SetDisplayOffset     = 0xD3\n\t// charge pump command\n\tssd1306ChargePumpSetting = 0x8D\n)\n\n// SSD1306Init contains the initialization settings for the ssd1306 display.\ntype SSD1306Init struct {\n\tdisplayClock         byte\n\tmultiplexRatio       byte\n\tdisplayOffset        byte\n\tstartLine            byte\n\tchargePumpSetting    byte\n\tmemoryAddressingMode byte\n\tcomPins              byte\n\tcontrast             byte\n\tprechargePeriod      byte\n\tvComDeselectLevel    byte\n}\n\n// GetSequence returns the initialization sequence for the ssd1306 display.\nfunc (i *SSD1306Init) GetSequence() []byte {\n\treturn []byte{\n\t\tssd1306SetDisplayNormal,\n\t\tssd1306SetDisplayOff,\n\t\tssd1306SetDisplayClock, i.displayClock,\n\t\tssd1306SetMultiplexRatio, i.multiplexRatio,\n\t\tssd1306SetDisplayOffset, i.displayOffset,\n\t\tssd1306SetStartLine | i.startLine,\n\t\tssd1306ChargePumpSetting, i.chargePumpSetting,\n\t\tssd1306SetMemoryAddressingMode, i.memoryAddressingMode,\n\t\tssd1306SetSegmentRemap0,\n\t\tssd1306SetComOutput0,\n\t\tssd1306SetComPins, i.comPins,\n\t\tssd1306SetContrast, i.contrast,\n\t\tssd1306SetPrechargePeriod, i.prechargePeriod,\n\t\tssd1306SetVComDeselectLevel, i.vComDeselectLevel,\n\t\tssd1306DisplayOnResumeToRAM,\n\t\tssd1306SetDisplayNormal,\n\t}\n}\n\n// 128x64 init sequence\nvar ssd1306Init128x64 = &SSD1306Init{\n\tdisplayClock:         0x80,\n\tmultiplexRatio:       0x3F,\n\tdisplayOffset:        0x00,\n\tstartLine:            0x00,\n\tchargePumpSetting:    0x14, // 0x10 if external vcc is set\n\tmemoryAddressingMode: 0x00,\n\tcomPins:              0x12,\n\tcontrast:             0xCF, // 0x9F if external vcc is set\n\tprechargePeriod:      0xF1, // 0x22 if external vcc is set\n\tvComDeselectLevel:    0x40,\n}\n\n// 128x32 init sequence\nvar ssd1306Init128x32 = &SSD1306Init{\n\tdisplayClock:         0x80,\n\tmultiplexRatio:       0x1F,\n\tdisplayOffset:        0x00,\n\tstartLine:            0x00,\n\tchargePumpSetting:    0x14, // 0x10 if external vcc is set\n\tmemoryAddressingMode: 0x00,\n\tcomPins:              0x02,\n\tcontrast:             0x8F, // 0x9F if external vcc is set\n\tprechargePeriod:      0xF1, // 0x22 if external vcc is set\n\tvComDeselectLevel:    0x40,\n}\n\n// 96x16 init sequence\nvar ssd1306Init96x16 = &SSD1306Init{\n\tdisplayClock:         0x60,\n\tmultiplexRatio:       0x0F,\n\tdisplayOffset:        0x00,\n\tstartLine:            0x00,\n\tchargePumpSetting:    0x14, // 0x10 if external vcc is set\n\tmemoryAddressingMode: 0x00,\n\tcomPins:              0x02,\n\tcontrast:             0x8F, // 0x9F if external vcc is set\n\tprechargePeriod:      0xF1, // 0x22 if external vcc is set\n\tvComDeselectLevel:    0x40,\n}\n\n// DisplayBuffer represents the display buffer intermediate memory.\ntype DisplayBuffer struct {\n\twidth, height, pageSize int\n\tbuffer                  []byte\n}\n\n// NewDisplayBuffer creates a new DisplayBuffer.\nfunc NewDisplayBuffer(width, height, pageSize int) *DisplayBuffer {\n\td := &DisplayBuffer{\n\t\twidth:    width,\n\t\theight:   height,\n\t\tpageSize: pageSize,\n\t}\n\td.buffer = make([]byte, d.Size())\n\treturn d\n}\n\n// Size returns the memory size of the display buffer.\nfunc (d *DisplayBuffer) Size() int {\n\treturn (d.width * d.height) / d.pageSize\n}\n\n// Clear the contents of the display buffer.\nfunc (d *DisplayBuffer) Clear() {\n\td.buffer = make([]byte, d.Size())\n}\n\n// SetPixel sets the x, y pixel with c color.\nfunc (d *DisplayBuffer) SetPixel(x, y, c int) {\n\tidx := x + (y/d.pageSize)*d.width\n\tbit := uint(y) % uint(d.pageSize) //nolint:gosec // TODO: fix later\n\tif c == 0 {\n\t\td.buffer[idx] &= ^(1 << bit)\n\t} else {\n\t\td.buffer[idx] |= (1 << bit)\n\t}\n}\n\n// Set sets the display buffer with the given buffer.\nfunc (d *DisplayBuffer) Set(buf []byte) {\n\td.buffer = buf\n}\n\n// SSD1306Driver is a Gobot Driver for a SSD1306 Display.\ntype SSD1306Driver struct {\n\t*Driver\n\n\tinitSequence  *SSD1306Init\n\tdisplayWidth  int\n\tdisplayHeight int\n\texternalVCC   bool\n\tpageSize      int\n\tbuffer        *DisplayBuffer\n}\n\n// NewSSD1306Driver creates a new SSD1306Driver.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\tWithBus(int):    \t\t\tbus to use with this driver\n//\tWithAddress(int):    \t\taddress to use with this driver\n//\tWithSSD1306DisplayWidth(int): \twidth of display (defaults to 128)\n//\tWithSSD1306DisplayHeight(int): \theight of display (defaults to 64)\n//\tWithSSD1306ExternalVCC:          set true when using an external OLED supply (defaults to false)\nfunc NewSSD1306Driver(c Connector, options ...func(Config)) *SSD1306Driver {\n\td := &SSD1306Driver{\n\t\tDriver:        NewDriver(c, \"SSD1306\", ssd1306DefaultAddress),\n\t\tdisplayHeight: ssd1306Height,\n\t\tdisplayWidth:  ssd1306Width,\n\t\texternalVCC:   ssd1306ExternalVCC,\n\t}\n\td.afterStart = d.initialize\n\n\t// set options\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\t// set page size\n\td.pageSize = 8\n\t// set display buffer\n\td.buffer = NewDisplayBuffer(d.displayWidth, d.displayHeight, d.pageSize)\n\t// add commands\n\td.AddCommand(\"Display\", func(_ map[string]interface{}) interface{} {\n\t\terr := d.Display()\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"On\", func(_ map[string]interface{}) interface{} {\n\t\terr := d.On()\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"Off\", func(_ map[string]interface{}) interface{} {\n\t\terr := d.Off()\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"Clear\", func(_ map[string]interface{}) interface{} {\n\t\td.Clear()\n\t\treturn map[string]interface{}{}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetContrast\", func(params map[string]interface{}) interface{} {\n\t\tcontrast := params[\"contrast\"].(byte)\n\t\terr := d.SetContrast(contrast)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Set\", func(params map[string]interface{}) interface{} {\n\t\tx := params[\"x\"].(int)\n\t\ty := params[\"y\"].(int)\n\t\tc := params[\"c\"].(int)\n\t\td.Set(x, y, c)\n\t\treturn nil\n\t})\n\treturn d\n}\n\n// WithSSD1306DisplayWidth option sets the SSD1306Driver DisplayWidth option.\nfunc WithSSD1306DisplayWidth(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.displayWidth = val\n\t\t}\n\t}\n}\n\n// WithSSD1306DisplayHeight option sets the SSD1306Driver DisplayHeight option.\nfunc WithSSD1306DisplayHeight(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.displayHeight = val\n\t\t}\n\t}\n}\n\n// WithSSD1306ExternalVCC option sets the SSD1306Driver ExternalVCC option.\nfunc WithSSD1306ExternalVCC(val bool) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.externalVCC = val\n\t\t}\n\t}\n}\n\n// Init initializes the ssd1306 display.\nfunc (d *SSD1306Driver) Init() error {\n\t// turn off screen\n\tif err := d.Off(); err != nil {\n\t\treturn err\n\t}\n\t// run through initialization commands\n\tif err := d.commands(d.initSequence.GetSequence()); err != nil {\n\t\treturn err\n\t}\n\tif err := d.commands([]byte{ssd1306ColumnAddr, 0, byte(d.buffer.width) - 1}); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.commands([]byte{ssd1306PageAddr, 0, (byte(d.buffer.height / d.pageSize)) - 1})\n}\n\n// On turns on the display.\nfunc (d *SSD1306Driver) On() error {\n\treturn d.command(ssd1306SetDisplayOn)\n}\n\n// Off turns off the display.\nfunc (d *SSD1306Driver) Off() error {\n\treturn d.command(ssd1306SetDisplayOff)\n}\n\n// Clear clears the display buffer.\nfunc (d *SSD1306Driver) Clear() {\n\td.buffer.Clear()\n}\n\n// Set sets a pixel in the buffer.\nfunc (d *SSD1306Driver) Set(x, y, c int) {\n\td.buffer.SetPixel(x, y, c)\n}\n\n// Reset clears display.\nfunc (d *SSD1306Driver) Reset() error {\n\tif err := d.Off(); err != nil {\n\t\treturn err\n\t}\n\td.Clear()\n\n\treturn d.On()\n}\n\n// SetContrast sets the display contrast.\nfunc (d *SSD1306Driver) SetContrast(contrast byte) error {\n\treturn d.commands([]byte{ssd1306SetContrast, contrast})\n}\n\n// Display sends the memory buffer to the display.\nfunc (d *SSD1306Driver) Display() error {\n\t_, err := d.write(append([]byte{0x40}, d.buffer.buffer...))\n\treturn err\n}\n\n// ShowImage takes a standard Go image and displays it in monochrome.\nfunc (d *SSD1306Driver) ShowImage(img image.Image) error {\n\tif img.Bounds().Dx() != d.displayWidth || img.Bounds().Dy() != d.displayHeight {\n\t\treturn fmt.Errorf(\"image must match display width and height: %dx%d\", d.displayWidth, d.displayHeight)\n\t}\n\td.Clear()\n\tfor y, w, h := 0, img.Bounds().Dx(), img.Bounds().Dy(); y < h; y++ {\n\t\tfor x := 0; x < w; x++ {\n\t\t\tc := img.At(x, y)\n\t\t\tif r, g, b, _ := c.RGBA(); r > 0 || g > 0 || b > 0 {\n\t\t\t\td.Set(x, y, 1)\n\t\t\t}\n\t\t}\n\t}\n\treturn d.Display()\n}\n\n// command sends a command to the ssd1306\nfunc (d *SSD1306Driver) command(b byte) error {\n\t_, err := d.write([]byte{0x80, b})\n\treturn err\n}\n\n// commands sends a command sequence to the ssd1306\nfunc (d *SSD1306Driver) commands(commands []byte) error {\n\tvar command []byte\n\tfor _, d := range commands {\n\t\tcommand = append(command, []byte{0x80, d}...)\n\t}\n\t_, err := d.write(command)\n\treturn err\n}\n\nfunc (d *SSD1306Driver) initialize() error {\n\t// check device size for supported resolutions\n\tswitch {\n\tcase d.displayWidth == 128 && d.displayHeight == 64:\n\t\td.initSequence = ssd1306Init128x64\n\tcase d.displayWidth == 128 && d.displayHeight == 32:\n\t\td.initSequence = ssd1306Init128x32\n\tcase d.displayWidth == 96 && d.displayHeight == 16:\n\t\td.initSequence = ssd1306Init96x16\n\tdefault:\n\t\treturn fmt.Errorf(\"%dx%d resolution is unsupported, supported resolutions: 128x64, 128x32, 96x16\",\n\t\t\td.displayWidth, d.displayHeight)\n\t}\n\t// check for external vcc\n\tif d.externalVCC {\n\t\td.initSequence.chargePumpSetting = 0x10\n\t\td.initSequence.contrast = 0x9F\n\t\td.initSequence.prechargePeriod = 0x22\n\t}\n\tif err := d.Init(); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.On()\n}\n"
  },
  {
    "path": "drivers/i2c/ssd1306_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage i2c\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*SSD1306Driver)(nil)\n\nfunc initTestSSD1306DriverWithStubbedAdaptor(\n\twidth, height int,\n\texternalVCC bool, //nolint:unparam // keep for tests\n) (*SSD1306Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewSSD1306Driver(a, WithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height),\n\t\tWithSSD1306ExternalVCC(externalVCC))\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewSSD1306Driver(t *testing.T) {\n\tvar di interface{} = NewSSD1306Driver(newI2cTestAdaptor())\n\td, ok := di.(*SSD1306Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"new should have returned a *SSD1306Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"SSD1306\"))\n\tassert.Equal(t, 0x3c, d.defaultAddress)\n}\n\nfunc TestSSD1306StartDefault(t *testing.T) {\n\tconst (\n\t\twidth       = 128\n\t\theight      = 64\n\t\texternalVCC = false\n\t)\n\td := NewSSD1306Driver(newI2cTestAdaptor(),\n\t\tWithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC))\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestSSD1306Start128x32(t *testing.T) {\n\tconst (\n\t\twidth       = 128\n\t\theight      = 32\n\t\texternalVCC = false\n\t)\n\td := NewSSD1306Driver(newI2cTestAdaptor(),\n\t\tWithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC))\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestSSD1306Start96x16(t *testing.T) {\n\tconst (\n\t\twidth       = 96\n\t\theight      = 16\n\t\texternalVCC = false\n\t)\n\td := NewSSD1306Driver(newI2cTestAdaptor(),\n\t\tWithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC))\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestSSD1306StartExternalVCC(t *testing.T) {\n\tconst (\n\t\twidth       = 128\n\t\theight      = 32\n\t\texternalVCC = true\n\t)\n\td := NewSSD1306Driver(newI2cTestAdaptor(),\n\t\tWithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC))\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestSSD1306StartSizeError(t *testing.T) {\n\tconst (\n\t\twidth       = 128\n\t\theight      = 54\n\t\texternalVCC = false\n\t)\n\td := NewSSD1306Driver(newI2cTestAdaptor(),\n\t\tWithSSD1306DisplayWidth(width), WithSSD1306DisplayHeight(height), WithSSD1306ExternalVCC(externalVCC))\n\trequire.ErrorContains(t, d.Start(), \"128x54 resolution is unsupported, supported resolutions: 128x64, 128x32, 96x16\")\n}\n\nfunc TestSSD1306Halt(t *testing.T) {\n\t// arrange\n\td := NewSSD1306Driver(newI2cTestAdaptor(), WithSSD1306DisplayWidth(128), WithSSD1306DisplayHeight(64),\n\t\tWithSSD1306ExternalVCC(false))\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestSSD1306Options(t *testing.T) {\n\ts := NewSSD1306Driver(newI2cTestAdaptor(), WithBus(2), WithSSD1306DisplayHeight(32), WithSSD1306DisplayWidth(128))\n\tassert.Equal(t, 2, s.GetBusOrDefault(1))\n\tassert.Equal(t, 32, s.displayHeight)\n\tassert.Equal(t, 128, s.displayWidth)\n}\n\nfunc TestSSD1306Display(t *testing.T) {\n\ts, _ := initTestSSD1306DriverWithStubbedAdaptor(96, 16, false)\n\t_ = s.Start()\n\trequire.NoError(t, s.Display())\n}\n\nfunc TestSSD1306ShowImage(t *testing.T) {\n\ts, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\t_ = s.Start()\n\timg := image.NewRGBA(image.Rect(0, 0, 640, 480))\n\trequire.ErrorContains(t, s.ShowImage(img), \"image must match display width and height: 128x64\")\n\n\timg = image.NewRGBA(image.Rect(0, 0, 128, 64))\n\trequire.NoError(t, s.ShowImage(img))\n}\n\nfunc TestSSD1306Command(t *testing.T) {\n\ts, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\t_ = s.Start()\n\n\ta.i2cWriteImpl = func(got []byte) (int, error) {\n\t\texpected := []byte{0x80, 0xFF}\n\t\tif !reflect.DeepEqual(got, expected) {\n\t\t\tt.Logf(\"sequence error, got %+v, expected %+v\", got, expected)\n\t\t\treturn 0, fmt.Errorf(\"oops\")\n\t\t}\n\t\treturn 0, nil\n\t}\n\terr := s.command(0xFF)\n\trequire.NoError(t, err)\n}\n\nfunc TestSSD1306Commands(t *testing.T) {\n\ts, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\t_ = s.Start()\n\n\ta.i2cWriteImpl = func(got []byte) (int, error) {\n\t\texpected := []byte{0x80, 0x00, 0x80, 0xFF}\n\t\tif !reflect.DeepEqual(got, expected) {\n\t\t\tt.Logf(\"sequence error, got %+v, expected %+v\", got, expected)\n\t\t\treturn 0, fmt.Errorf(\"oops\")\n\t\t}\n\t\treturn 0, nil\n\t}\n\terr := s.commands([]byte{0x00, 0xFF})\n\trequire.NoError(t, err)\n}\n\nfunc TestSSD1306On(t *testing.T) {\n\ts, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\t_ = s.Start()\n\n\ta.i2cWriteImpl = func(got []byte) (int, error) {\n\t\texpected := []byte{0x80, ssd1306SetDisplayOn}\n\t\tif !reflect.DeepEqual(got, expected) {\n\t\t\tt.Logf(\"sequence error, got %+v, expected %+v\", got, expected)\n\t\t\treturn 0, fmt.Errorf(\"oops\")\n\t\t}\n\t\treturn 0, nil\n\t}\n\terr := s.On()\n\trequire.NoError(t, err)\n}\n\nfunc TestSSD1306Off(t *testing.T) {\n\ts, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\t_ = s.Start()\n\n\ta.i2cWriteImpl = func(got []byte) (int, error) {\n\t\texpected := []byte{0x80, ssd1306SetDisplayOff}\n\t\tif !reflect.DeepEqual(got, expected) {\n\t\t\tt.Logf(\"sequence error, got %+v, expected %+v\", got, expected)\n\t\t\treturn 0, fmt.Errorf(\"oops\")\n\t\t}\n\t\treturn 0, nil\n\t}\n\terr := s.Off()\n\trequire.NoError(t, err)\n}\n\nfunc TestSSD1306Reset(t *testing.T) {\n\ts, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\t_ = s.Start()\n\n\ta.i2cWriteImpl = func(got []byte) (int, error) {\n\t\texpectedOff := []byte{0x80, ssd1306SetDisplayOff}\n\t\texpectedOn := []byte{0x80, ssd1306SetDisplayOn}\n\t\tif !reflect.DeepEqual(got, expectedOff) && !reflect.DeepEqual(got, expectedOn) {\n\t\t\tt.Logf(\"sequence error, got %+v, expected: %+v or %+v\", got, expectedOff, expectedOn)\n\t\t\treturn 0, fmt.Errorf(\"oops\")\n\t\t}\n\t\treturn 0, nil\n\t}\n\terr := s.Reset()\n\trequire.NoError(t, err)\n}\n\n// COMMANDS\n\nfunc TestSSD1306CommandsDisplay(t *testing.T) {\n\ts, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\tresult := s.Command(\"Display\")(map[string]interface{}{})\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestSSD1306CommandsOn(t *testing.T) {\n\ts, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\n\tresult := s.Command(\"On\")(map[string]interface{}{})\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestSSD1306CommandsOff(t *testing.T) {\n\ts, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\n\tresult := s.Command(\"Off\")(map[string]interface{}{})\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestSSD1306CommandsClear(t *testing.T) {\n\ts, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\n\tresult := s.Command(\"Clear\")(map[string]interface{}{})\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestSSD1306CommandsSetContrast(t *testing.T) {\n\ts, a := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\ta.i2cWriteImpl = func(got []byte) (int, error) {\n\t\texpected := []byte{0x80, ssd1306SetContrast, 0x80, 0x10}\n\t\tif !reflect.DeepEqual(got, expected) {\n\t\t\tt.Logf(\"sequence error, got %+v, expected %+v\", got, expected)\n\t\t\treturn 0, fmt.Errorf(\"oops\")\n\t\t}\n\t\treturn 0, nil\n\t}\n\n\tresult := s.Command(\"SetContrast\")(map[string]interface{}{\n\t\t\"contrast\": byte(0x10),\n\t})\n\tassert.Nil(t, result.(map[string]interface{})[\"err\"])\n}\n\nfunc TestSSD1306CommandsSet(t *testing.T) {\n\ts, _ := initTestSSD1306DriverWithStubbedAdaptor(128, 64, false)\n\n\tassert.Equal(t, byte(0), s.buffer.buffer[0])\n\ts.Command(\"Set\")(map[string]interface{}{\n\t\t\"x\": int(0),\n\t\t\"y\": int(0),\n\t\t\"c\": int(1),\n\t})\n\tassert.Equal(t, byte(1), s.buffer.buffer[0])\n}\n\nfunc TestDisplayBuffer(t *testing.T) {\n\twidth := 128\n\theight := 64\n\tsize := 1024 // (width*height) / 8\n\tdisplay := NewDisplayBuffer(width, height, 8)\n\n\trequire.Equal(t, size, display.Size())\n\trequire.Len(t, display.buffer, size)\n\n\tassert.Equal(t, byte(0), display.buffer[0])\n\tassert.Equal(t, byte(0), display.buffer[1])\n\n\tdisplay.SetPixel(0, 0, 1)\n\tdisplay.SetPixel(1, 0, 1)\n\tdisplay.SetPixel(2, 0, 1)\n\tdisplay.SetPixel(0, 1, 1)\n\tassert.Equal(t, byte(3), display.buffer[0])\n\tassert.Equal(t, byte(1), display.buffer[1])\n\n\tdisplay.SetPixel(0, 1, 0)\n\tassert.Equal(t, byte(1), display.buffer[0])\n\tassert.Equal(t, byte(1), display.buffer[1])\n}\n"
  },
  {
    "path": "drivers/i2c/th02_driver.go",
    "content": "/*\n * Copyright (c) 2018 Nick Potts <nick@the-potts.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage i2c\n\n// TH02Driver is a driver for the TH02-D based devices.\n//\n// This module was tested with a Grove \"Temperature&Humidity Sensor (High-Accuracy & Mini ) v1.0\"\n// from https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-High-Accuracy-Min-p-1921.htm\n// Datasheet is at http://www.hoperf.com/upload/sensor/TH02_V1.1.pdf\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n)\n\nconst (\n\tth02Debug          = false\n\tth02DefaultAddress = 0x40\n)\n\nconst (\n\tth02Reg_Status  = 0x00\n\tth02Reg_DataMSB = 0x01\n\tth02Reg_DataLSB = 0x02\n\tth02Reg_Config  = 0x03\n\tth02Reg_ID      = 0x11\n\n\t// th02Status_ReadyBit = 0x01 // D0 is /RDY\n\n\tth02Config_StartBit = 0x01 // D0 is START\n\tth02Config_HeatBit  = 0x02 // D1 is HEAT\n\tth02Config_TempBit  = 0x10 // D4 is TEMP (if not set read humidity)\n\tth02Config_FastBit  = 0x20 // D5 is FAST (if set use 18 ms, but lower accuracy T: 13 bit, H: 11 bit)\n)\n\n// Accuracy constants for the TH02 devices (deprecated, use WithFastMode() instead)\nconst (\n\tTH02HighAccuracy = 0 // High Accuracy (T: 14 bit, H: 12 bit), normal (35 ms)\n\tTH02LowAccuracy  = 1 // Lower Accuracy (T: 13 bit, H: 11 bit), fast (18 ms)\n)\n\n// TH02Driver is a Driver for a TH02 humidity and temperature sensor\ntype TH02Driver struct {\n\t*Driver\n\n\tUnits    string\n\theating  bool\n\tfastMode bool\n}\n\n// NewTH02Driver creates a new driver with specified i2c interface.\n// Defaults to:\n//   - Using high accuracy (lower speed) measurements cycles.\n//   - Emitting values in \"C\". If you want F, set Units to \"F\"\n//\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewTH02Driver(a Connector, options ...func(Config)) *TH02Driver {\n\td := &TH02Driver{\n\t\tDriver:   NewDriver(a, \"TH02\", th02DefaultAddress, options...),\n\t\tUnits:    \"C\",\n\t\theating:  false,\n\t\tfastMode: false,\n\t}\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// WithTH02FastMode option sets the fast mode (leads to lower accuracy).\n// Valid settings are <=0 (off), >0 (on).\nfunc WithTH02FastMode(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*TH02Driver)\n\t\tif ok {\n\t\t\td.fastMode = (val > 0)\n\t\t} else if th02Debug {\n\t\t\tlog.Printf(\"Trying to set fast mode for non-TH02Driver %v\", c)\n\t\t}\n\t}\n}\n\n// Accuracy returns the accuracy of the sampling (deprecated, use FastMode() instead)\nfunc (d *TH02Driver) Accuracy() byte {\n\tif d.fastMode {\n\t\treturn TH02LowAccuracy\n\t}\n\treturn TH02HighAccuracy\n}\n\n// SetAccuracy sets the accuracy of the sampling. (deprecated, use WithFastMode() instead)\n// It will only be used on the next measurement request.  Invalid value will use the default of High\nfunc (d *TH02Driver) SetAccuracy(a byte) {\n\td.fastMode = (a == TH02LowAccuracy)\n}\n\n// SerialNumber returns the serial number of the chip\nfunc (d *TH02Driver) SerialNumber() (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tret, err := d.readByteData(th02Reg_ID)\n\treturn ret >> 4, err\n}\n\n// FastMode returns true if the fast mode is enabled in the device\nfunc (d *TH02Driver) FastMode() (bool, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tcfg, err := d.readByteData(th02Reg_Config)\n\treturn (th02Config_FastBit & cfg) == th02Config_FastBit, err\n}\n\n// SetHeater sets the heater of the device to the given state.\nfunc (d *TH02Driver) SetHeater(state bool) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.heating = state\n\treturn d.writeByteData(th02Reg_Config, d.createConfig(false, false))\n}\n\n// Heater returns true if the heater is enabled in the device\nfunc (d *TH02Driver) Heater() (bool, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tcfg, err := d.readByteData(th02Reg_Config)\n\treturn (th02Config_HeatBit & cfg) == th02Config_HeatBit, err\n}\n\n// Sample returns the temperature in celsius and relative humidity for one sample\n//\n//nolint:nonamedreturns // is sufficient here\nfunc (d *TH02Driver) Sample() (temperature float32, relhumidity float32, _ error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// read humidity\n\tif err := d.writeByteData(th02Reg_Config, d.createConfig(true, false)); err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\trawrh, err := d.waitAndReadData()\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\trelhumidity = float32(rawrh>>4)/16.0 - 24.0\n\n\t// read temperature\n\tif err := d.writeByteData(th02Reg_Config, d.createConfig(true, true)); err != nil {\n\t\treturn 0, relhumidity, err\n\t}\n\trawt, err := d.waitAndReadData()\n\tif err != nil {\n\t\treturn 0, relhumidity, err\n\t}\n\ttemperature = float32(rawt>>2)/32.0 - 50.0\n\n\tif d.Units == \"F\" {\n\t\ttemperature = 9.0/5.0*temperature + 32.0\n\t}\n\n\treturn temperature, relhumidity, nil\n}\n\nfunc (d *TH02Driver) createConfig(measurement bool, readTemp bool) byte {\n\tcfg := byte(0x00)\n\tif measurement {\n\t\tcfg = cfg | th02Config_StartBit\n\t\tif readTemp {\n\t\t\tcfg = cfg | th02Config_TempBit\n\t\t}\n\t\tif d.fastMode {\n\t\t\tcfg = cfg | th02Config_FastBit\n\t\t}\n\t}\n\tif d.heating {\n\t\tcfg = cfg | th02Config_HeatBit\n\t}\n\treturn cfg\n}\n\nfunc (d *TH02Driver) waitAndReadData() (uint16, error) {\n\tif err := d.waitForReady(nil); err != nil {\n\t\treturn 0, err\n\t}\n\n\trcvd := make([]byte, 2)\n\terr := d.readBlockData(th02Reg_DataMSB, rcvd)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint16(rcvd[0])<<8 + uint16(rcvd[1]), nil\n}\n\n// waitForReady blocks for up to the passed duration (which defaults to 50mS if nil)\n// until the ~RDY bit is cleared, meaning a sample has been fully sampled and is ready for reading.\nfunc (d *TH02Driver) waitForReady(dur *time.Duration) error {\n\twait := 100 * time.Millisecond\n\tif dur != nil {\n\t\twait = *dur\n\t}\n\tstart := time.Now()\n\tfor {\n\t\tif time.Since(start) > wait {\n\t\t\treturn fmt.Errorf(\"timeout on \\\\RDY\")\n\t\t}\n\n\t\tif reg, err := d.readByteData(th02Reg_Status); (reg == 0) && (err == nil) {\n\t\t\treturn nil\n\t\t}\n\t\ttime.Sleep(wait / 10)\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/th02_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*TH02Driver)(nil)\n\nfunc initTestTH02DriverWithStubbedAdaptor() (*TH02Driver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\tdriver := NewTH02Driver(adaptor)\n\tif err := driver.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn driver, adaptor\n}\n\nfunc TestNewTH02Driver(t *testing.T) {\n\tvar di interface{} = NewTH02Driver(newI2cTestAdaptor())\n\td, ok := di.(*TH02Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewTH02Driver() should have returned a *NewTH02Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"TH02\"))\n\tassert.Equal(t, 0x40, d.defaultAddress)\n}\n\nfunc TestTH02Halt(t *testing.T) {\n\t// arrange\n\td := NewTH02Driver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestTH02Options(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common options.\n\t// Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewTH02Driver(newI2cTestAdaptor(), WithBus(2), WithAddress(0x42))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.Equal(t, 0x42, d.GetAddressOrDefault(0x33))\n}\n\nfunc TestTH02SetAccuracy(t *testing.T) {\n\tb := NewTH02Driver(newI2cTestAdaptor())\n\n\tif b.SetAccuracy(0x42); b.Accuracy() != TH02HighAccuracy {\n\t\tt.Error(\"Setting an invalid accuracy should resolve to TH02HighAccuracy\")\n\t}\n\n\tif b.SetAccuracy(TH02LowAccuracy); b.Accuracy() != TH02LowAccuracy {\n\t\tt.Error(\"Expected setting low accuracy to actually set to low accuracy\")\n\t}\n\n\tif acc := b.Accuracy(); acc != TH02LowAccuracy {\n\t\trequire.Fail(t, \"Accuracy() didn't return what was expected\")\n\t}\n}\n\nfunc TestTH02WithFastMode(t *testing.T) {\n\ttests := map[string]struct {\n\t\tvalue int\n\t\twant  bool\n\t}{\n\t\t\"fast_on_for >0\":  {value: 1, want: true},\n\t\t\"fast_off_for =0\": {value: 0, want: false},\n\t\t\"fast_off_for <0\": {value: -1, want: false},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td := NewTH02Driver(newI2cTestAdaptor())\n\t\t\t// act\n\t\t\tWithTH02FastMode(tc.value)(d)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, d.fastMode)\n\t\t})\n\t}\n}\n\nfunc TestTH02FastMode(t *testing.T) {\n\t// sequence to read the fast mode status\n\t// * write config register address (0x03)\n\t// * read register content\n\t// * if sixth bit (D5) is set, the fast mode is configured on, otherwise off\n\ttests := map[string]struct {\n\t\tread uint8\n\t\twant bool\n\t}{\n\t\t\"fast on\":  {read: 0x20, want: true},\n\t\t\"fast off\": {read: ^uint8(0x20), want: false},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestTH02DriverWithStubbedAdaptor()\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.FastMode()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, uint8(0x03), a.written[0])\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestTH02SetHeater(t *testing.T) {\n\t// sequence to set the heater status\n\t// * set the local heater state\n\t// * write config register address (0x03)\n\t// * prepare config value by set/reset the heater bit (0x02, D1)\n\t// * write the config value\n\ttests := map[string]struct {\n\t\theater bool\n\t\twant   uint8\n\t}{\n\t\t\"heater on\":  {heater: true, want: 0x02},\n\t\t\"heater off\": {heater: false, want: 0x00},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestTH02DriverWithStubbedAdaptor()\n\t\t\t// act\n\t\t\terr := d.SetHeater(tc.heater)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Equal(t, tc.heater, d.heating)\n\t\t\tassert.Len(t, a.written, 2)\n\t\t\tassert.Equal(t, uint8(0x03), a.written[0])\n\t\t\tassert.Equal(t, tc.want, a.written[1])\n\t\t})\n\t}\n}\n\nfunc TestTH02Heater(t *testing.T) {\n\t// sequence to read the heater status\n\t// * write config register address (0x03)\n\t// * read register content\n\t// * if second bit (D1) is set, the heater is configured on, otherwise off\n\ttests := map[string]struct {\n\t\tread uint8\n\t\twant bool\n\t}{\n\t\t\"heater on\":  {read: 0x02, want: true},\n\t\t\"heater off\": {read: ^uint8(0x02), want: false},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestTH02DriverWithStubbedAdaptor()\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tb[0] = tc.read\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := d.Heater()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.Len(t, a.written, 1)\n\t\t\tassert.Equal(t, uint8(0x03), a.written[0])\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestTH02SerialNumber(t *testing.T) {\n\t// sequence to read SN\n\t// * write identification register address (0x11)\n\t// * read register content\n\t// * use the higher nibble of byte\n\n\t// arrange\n\td, a := initTestTH02DriverWithStubbedAdaptor()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tb[0] = 0x4F\n\t\treturn len(b), nil\n\t}\n\twant := uint8(0x04)\n\t// act\n\tsn, err := d.SerialNumber()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, a.written, 1)\n\tassert.Equal(t, uint8(0x11), a.written[0])\n\tassert.Equal(t, want, sn)\n}\n\nfunc TestTH02Sample(t *testing.T) {\n\t// sequence to read values\n\t// * write config register address (0x03)\n\t// * prepare config bits (START, HEAT, TEMP, FAST)\n\t// * write config register with config\n\t// * write status register address (0x00)\n\t// * read until value is \"0\" (means ready)\n\t// * write data register MSB address (0x01)\n\t// * read 2 bytes little-endian (MSB, LSB)\n\t// * shift and scale\n\t//    RH: 4 bits shift right, RH[%]=RH/16-24\n\t//    T:  2 bits shift right, T[°C]=T/32-50\n\n\t// test table according to data sheet page 15, 17\n\t// operating range of the temperature sensor is -40..85 °C (F-grade 0..70 °C)\n\ttests := map[string]struct {\n\t\thData  uint16\n\t\ttData  uint16\n\t\twantRH float32\n\t\twantT  float32\n\t}{\n\t\t\"RH 0, T -40\": {\n\t\t\thData: 0x0180, wantRH: 0.0,\n\t\t\ttData: 0x0140, wantT: -40.0,\n\t\t},\n\t\t\"RH 10, T -20\": {\n\t\t\thData: 0x0220, wantRH: 10.0,\n\t\t\ttData: 0x03C0, wantT: -20.0,\n\t\t},\n\t\t\"RH 20, T -10\": {\n\t\t\thData: 0x02C0, wantRH: 20.0,\n\t\t\ttData: 0x0500, wantT: -10.0,\n\t\t},\n\t\t\"RH 30, T 0\": {\n\t\t\thData: 0x0360, wantRH: 30.0,\n\t\t\ttData: 0x0640, wantT: 0.0,\n\t\t},\n\t\t\"RH 40, T 10\": {\n\t\t\thData: 0x0400, wantRH: 40.0,\n\t\t\ttData: 0x0780, wantT: 10.0,\n\t\t},\n\t\t\"RH 50, T 20\": {\n\t\t\thData: 0x04A0, wantRH: 50.0,\n\t\t\ttData: 0x08C0, wantT: 20.0,\n\t\t},\n\t\t\"RH 60, T 30\": {\n\t\t\thData: 0x0540, wantRH: 60.0,\n\t\t\ttData: 0x0A00, wantT: 30.0,\n\t\t},\n\t\t\"RH 70, T 40\": {\n\t\t\thData: 0x05E0, wantRH: 70.0,\n\t\t\ttData: 0x0B40, wantT: 40.0,\n\t\t},\n\t\t\"RH 80, T 50\": {\n\t\t\thData: 0x0680, wantRH: 80.0,\n\t\t\ttData: 0x0C80, wantT: 50.0,\n\t\t},\n\t\t\"RH 90, T 60\": {\n\t\t\thData: 0x0720, wantRH: 90.0,\n\t\t\ttData: 0x0DC0, wantT: 60.0,\n\t\t},\n\t\t\"RH 100, T 70\": {\n\t\t\thData: 0x07C0, wantRH: 100.0,\n\t\t\ttData: 0x0F00, wantT: 70.0,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestTH02DriverWithStubbedAdaptor()\n\t\t\tvar reg uint8\n\t\t\tvar regVal uint8\n\t\t\ta.i2cWriteImpl = func(b []byte) (int, error) {\n\t\t\t\treg = b[0]\n\t\t\t\tif len(b) == 2 {\n\t\t\t\t\tregVal = b[1]\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\t\t\tswitch reg {\n\t\t\t\tcase 0x00:\n\t\t\t\t\t// status\n\t\t\t\t\tb[0] = 0\n\t\t\t\tcase 0x01:\n\t\t\t\t\t// data register MSB\n\t\t\t\t\tvar data uint16\n\t\t\t\t\tif (regVal & 0x10) == 0x10 {\n\t\t\t\t\t\t// temperature\n\t\t\t\t\t\tdata = tc.tData << 2 // data sheet values are after shift 2 bits\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// humidity\n\t\t\t\t\t\tdata = tc.hData << 4 // data sheet values are after shift 4 bits\n\t\t\t\t\t}\n\t\t\t\t\tb[0] = byte(data >> 8)   // first read MSB from register 0x01\n\t\t\t\t\tb[1] = byte(data & 0xFF) // second read LSB from register 0x02\n\t\t\t\tdefault:\n\t\t\t\t\tassert.Equal(t, \"only register 0 and 1 expected\", fmt.Sprintf(\"unexpected register %d\", reg))\n\t\t\t\t\treturn 0, nil\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t}\n\t\t\t// act\n\t\t\ttemp, rh, err := d.Sample()\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tassert.InDelta(t, tc.wantRH, rh, 0.0)\n\t\t\tassert.InDelta(t, tc.wantT, temp, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestTH02_readData(t *testing.T) {\n\td, a := initTestTH02DriverWithStubbedAdaptor()\n\n\tvar callCounter int\n\n\ttests := map[string]struct {\n\t\trd      func([]byte) (int, error)\n\t\twr      func([]byte) (int, error)\n\t\trtn     uint16\n\t\twantErr error\n\t}{\n\t\t\"example RH\": {\n\t\t\trd: func(b []byte) (int, error) {\n\t\t\t\tcallCounter++\n\t\t\t\tif callCounter == 1 {\n\t\t\t\t\t// read for ready\n\t\t\t\t\tb[0] = 0x00\n\t\t\t\t} else {\n\t\t\t\t\tcopy(b, []byte{0x07, 0xC0})\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t},\n\t\t\trtn: 1984,\n\t\t},\n\t\t\"example T\": {\n\t\t\trd: func(b []byte) (int, error) {\n\t\t\t\tcallCounter++\n\t\t\t\tif callCounter == 1 {\n\t\t\t\t\t// read for ready\n\t\t\t\t\tb[0] = 0x00\n\t\t\t\t} else {\n\t\t\t\t\tcopy(b, []byte{0x12, 0xC0})\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t},\n\t\t\trtn: 4800,\n\t\t},\n\t\t\"timeout - no wait for ready\": {\n\t\t\trd: func(b []byte) (int, error) {\n\t\t\t\ttime.Sleep(200 * time.Millisecond)\n\t\t\t\t// simulate not ready\n\t\t\t\tb[0] = 0x01\n\t\t\t\treturn len(b), nil\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"timeout on \\\\RDY\"),\n\t\t\trtn:     0,\n\t\t},\n\t\t\"unable to write status register\": {\n\t\t\trd: func(b []byte) (int, error) {\n\t\t\t\tcallCounter++\n\t\t\t\tif callCounter == 1 {\n\t\t\t\t\t// read for ready\n\t\t\t\t\tb[0] = 0x00\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t},\n\t\t\twr: func(b []byte) (int, error) {\n\t\t\t\treturn len(b), fmt.Errorf(\"an write error\")\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"timeout on \\\\RDY\"),\n\t\t\trtn:     0,\n\t\t},\n\t\t\"unable to write data register\": {\n\t\t\trd: func(b []byte) (int, error) {\n\t\t\t\tcallCounter++\n\t\t\t\tif callCounter == 1 {\n\t\t\t\t\t// read for ready\n\t\t\t\t\tb[0] = 0x00\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t},\n\t\t\twr: func(b []byte) (int, error) {\n\t\t\t\tif len(b) == 1 && b[0] == 0x00 {\n\t\t\t\t\t// register of ready check\n\t\t\t\t\treturn len(b), nil\n\t\t\t\t}\n\t\t\t\t// data register\n\t\t\t\treturn len(b), fmt.Errorf(\"nope\")\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"nope\"),\n\t\t\trtn:     0,\n\t\t},\n\t\t\"unable to read doesn't provide enough data\": {\n\t\t\trd: func(b []byte) (int, error) {\n\t\t\t\tcallCounter++\n\t\t\t\tif callCounter == 1 {\n\t\t\t\t\t// read for ready\n\t\t\t\t\tb[0] = 0x00\n\t\t\t\t} else {\n\t\t\t\t\tb = []byte{0x01}\n\t\t\t\t}\n\t\t\t\treturn len(b), nil\n\t\t\t},\n\t\t\twantErr: fmt.Errorf(\"read 1 bytes from device by i2c helpers, expected 2\"),\n\t\t\trtn:     0,\n\t\t},\n\t}\n\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta.i2cReadImpl = tc.rd\n\t\t\tif tc.wr != nil {\n\t\t\t\toldwr := a.i2cWriteImpl\n\t\t\t\ta.i2cWriteImpl = tc.wr\n\t\t\t\tdefer func() { a.i2cWriteImpl = oldwr }()\n\t\t\t}\n\t\t\tcallCounter = 0\n\t\t\t// act\n\t\t\tgot, err := d.waitAndReadData()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.rtn, got)\n\t\t})\n\t}\n}\n\nfunc TestTH02_waitForReadyFailOnTimeout(t *testing.T) {\n\td, a := initTestTH02DriverWithStubbedAdaptor()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\ttime.Sleep(50 * time.Millisecond)\n\t\tb[0] = 0x01\n\t\treturn len(b), nil\n\t}\n\n\ttimeout := 10 * time.Microsecond\n\tif err := d.waitForReady(&timeout); err == nil {\n\t\tt.Error(\"Expected a timeout error\")\n\t}\n}\n\nfunc TestTH02_waitForReadyFailOnReadError(t *testing.T) {\n\td, a := initTestTH02DriverWithStubbedAdaptor()\n\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\ttime.Sleep(50 * time.Millisecond)\n\t\tb[0] = 0x00\n\t\twrongLength := 2\n\t\treturn wrongLength, nil\n\t}\n\n\ttimeout := 10 * time.Microsecond\n\tif err := d.waitForReady(&timeout); err == nil {\n\t\tt.Error(\"Expected a timeout error\")\n\t}\n}\n\nfunc TestTH02_createConfig(t *testing.T) {\n\td := &TH02Driver{}\n\n\ttests := map[string]struct {\n\t\tmeas     bool\n\t\tfast     bool\n\t\treadTemp bool\n\t\theating  bool\n\t\twant     byte\n\t}{\n\t\t\"meas, no fast, RH, no heating\":    {meas: true, fast: false, readTemp: false, heating: false, want: 0x01},\n\t\t\"meas, no fast, RH, heating\":       {meas: true, fast: false, readTemp: false, heating: true, want: 0x03},\n\t\t\"meas, no fast, TE, no heating\":    {meas: true, fast: false, readTemp: true, heating: false, want: 0x11},\n\t\t\"meas, no fast, TE, heating\":       {meas: true, fast: false, readTemp: true, heating: true, want: 0x13},\n\t\t\"meas, fast, RH, no heating\":       {meas: true, fast: true, readTemp: false, heating: false, want: 0x21},\n\t\t\"meas, fast, RH, heating\":          {meas: true, fast: true, readTemp: false, heating: true, want: 0x23},\n\t\t\"meas, fast, TE, no heating\":       {meas: true, fast: true, readTemp: true, heating: false, want: 0x31},\n\t\t\"meas, fast, TE, heating\":          {meas: true, fast: true, readTemp: true, heating: true, want: 0x33},\n\t\t\"no meas, no fast, RH, no heating\": {meas: false, fast: false, readTemp: false, heating: false, want: 0x00},\n\t\t\"no meas, no fast, RH, heating\":    {meas: false, fast: false, readTemp: false, heating: true, want: 0x02},\n\t\t\"no meas, no fast, TE, no heating\": {meas: false, fast: false, readTemp: true, heating: false, want: 0x00},\n\t\t\"no meas, no fast, TE, heating\":    {meas: false, fast: false, readTemp: true, heating: true, want: 0x02},\n\t\t\"no meas, fast, RH, no heating\":    {meas: false, fast: true, readTemp: false, heating: false, want: 0x00},\n\t\t\"no meas, fast, RH, heating\":       {meas: false, fast: true, readTemp: false, heating: true, want: 0x02},\n\t\t\"no meas, fast, TE, no heating\":    {meas: false, fast: true, readTemp: true, heating: false, want: 0x00},\n\t\t\"no meas, fast, TE, heating\":       {meas: false, fast: true, readTemp: true, heating: true, want: 0x02},\n\t}\n\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\td.fastMode = tc.fast\n\t\t\td.heating = tc.heating\n\t\t\tgot := d.createConfig(tc.meas, tc.readTemp)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/i2c/tsl2561_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nconst (\n\t// TSL2561AddressLow - the address of the device when address pin is low\n\tTSL2561AddressLow = 0x29\n\t// TSL2561AddressFloat - the address of the device when address pin is floating\n\tTSL2561AddressFloat = 0x39\n\t// TSL2561AddressHigh - the address of the device when address pin is high\n\tTSL2561AddressHigh = 0x49\n\n\ttsl2561CommandBit = 0x80 // Must be 1\n\ttsl2561ClearBit   = 0x40 // Clears any pending interrupt (write 1 to clear)\n\ttsl2561WordBit    = 0x20 // 1 = read/write word (rather than byte)\n\ttsl2561BlockBit   = 0x10 // 1 = using block read/write\n\n\ttsl2561ControlPowerOn  = 0x03\n\ttsl2561ControlPowerOff = 0x00\n\n\ttsl2561LuxLuxScale     = 14     // Scale by 2^14\n\ttsl2561LuxRatioScale   = 9      // Scale ratio by 2^9\n\ttsl2561LuxChScale      = 10     // Scale channel values by 2^10\n\ttsl2561LuxCHScaleTInt0 = 0x7517 // 322/11 * 2^tsl2561LUXCHSCALE\n\ttsl2561LuxChScaleTInt1 = 0x0FE7 // 322/81 * 2^tsl2561LUXCHSCALE\n\n\t// T, FN and CL package values\n\ttsl2561LuxK1T = 0x0040 // 0.125 * 2^RATIO_SCALE\n\ttsl2561LuxB1T = 0x01f2 // 0.0304 * 2^LUX_SCALE\n\ttsl2561LuxM1T = 0x01be // 0.0272 * 2^LUX_SCALE\n\ttsl2561LuxK2T = 0x0080 // 0.250 * 2^RATIO_SCALE\n\ttsl2561LuxB2T = 0x0214 // 0.0325 * 2^LUX_SCALE\n\ttsl2561LuxM2T = 0x02d1 // 0.0440 * 2^LUX_SCALE\n\ttsl2561LuxK3T = 0x00c0 // 0.375 * 2^RATIO_SCALE\n\ttsl2561LuxB3T = 0x023f // 0.0351 * 2^LUX_SCALE\n\ttsl2561LuxM3T = 0x037b // 0.0544 * 2^LUX_SCALE\n\ttsl2561LuxK4T = 0x0100 // 0.50 * 2^RATIO_SCALE\n\ttsl2561LuxB4T = 0x0270 // 0.0381 * 2^LUX_SCALE\n\ttsl2561LuxM4T = 0x03fe // 0.0624 * 2^LUX_SCALE\n\ttsl2561LuxK5T = 0x0138 // 0.61 * 2^RATIO_SCALE\n\ttsl2561LuxB5T = 0x016f // 0.0224 * 2^LUX_SCALE\n\ttsl2561LuxM5T = 0x01fc // 0.0310 * 2^LUX_SCALE\n\ttsl2561LuxK6T = 0x019a // 0.80 * 2^RATIO_SCALE\n\ttsl2561LuxB6T = 0x00d2 // 0.0128 * 2^LUX_SCALE\n\ttsl2561LuxM6T = 0x00fb // 0.0153 * 2^LUX_SCALE\n\ttsl2561LuxK7T = 0x029a // 1.3 * 2^RATIO_SCALE\n\ttsl2561LuxB7T = 0x0018 // 0.00146 * 2^LUX_SCALE\n\ttsl2561LuxM7T = 0x0012 // 0.00112 * 2^LUX_SCALE\n\ttsl2561LuxK8T = 0x029a // 1.3 * 2^RATIO_SCALE\n\ttsl2561LuxB8T = 0x0000 // 0.000 * 2^LUX_SCALE\n\ttsl2561LuxM8T = 0x0000 // 0.000 * 2^LUX_SCALE\n\n\t// Auto-gain thresholds\n\ttsl2561AgcTHi13MS  = 4850 // Max value at Ti 13ms = 5047\n\ttsl2561AgcTLo13MS  = 100\n\ttsl2561AgcTHi101MS = 36000 // Max value at Ti 101ms = 37177\n\ttsl2561AgcTLo101MS = 200\n\ttsl2561AgcTHi402MS = 63000 // Max value at Ti 402ms = 65535\n\ttsl2561AgcTLo402MS = 500\n\n\t// Clipping thresholds\n\ttsl2561Clipping13MS  = 4900\n\ttsl2561Clipping101MS = 37000\n\ttsl2561Clipping402MS = 65000\n)\n\nconst (\n\ttsl2561RegisterControl         = 0x00\n\ttsl2561RegisterTiming          = 0x01\n\ttsl2561RegisterThreshholdLLow  = 0x02\n\ttsl2561RegisterThreshholdLHigh = 0x03\n\ttsl2561RegisterThreshholdHLow  = 0x04\n\ttsl2561RegisterThreshholdHHigh = 0x05\n\ttsl2561RegisterInterrupt       = 0x06\n\ttsl2561RegisterCRC             = 0x08\n\ttsl2561RegisterID              = 0x0A\n\ttsl2561RegisterChan0Low        = 0x0C\n\ttsl2561RegisterChan0High       = 0x0D\n\ttsl2561RegisterChan1Low        = 0x0E\n\ttsl2561RegisterChan1High       = 0x0F\n)\n\n// TSL2561IntegrationTime is the type of all valid integration time settings\ntype TSL2561IntegrationTime int\n\nconst (\n\t// TSL2561IntegrationTime13MS integration time 13ms\n\tTSL2561IntegrationTime13MS TSL2561IntegrationTime = iota // 13.7ms\n\t// TSL2561IntegrationTime101MS integration time 101ms\n\tTSL2561IntegrationTime101MS // 101ms\n\t// TSL2561IntegrationTime402MS integration time 402ms\n\tTSL2561IntegrationTime402MS // 402ms\n)\n\n// TSL2561Gain is the type of all valid gain settings\ntype TSL2561Gain int\n\nconst (\n\t// TSL2561Gain1X gain == 1x\n\tTSL2561Gain1X TSL2561Gain = 0x00 // No gain\n\t// TSL2561Gain16X gain == 16x\n\tTSL2561Gain16X = 0x10 // 16x gain\n)\n\n// TSL2561Driver is the gobot driver for the Adafruit Digital Luminosity/Lux/Light Sensor\n//\n// Datasheet: http://www.adafruit.com/datasheets/TSL2561.pdf\n//\n// Ported from the Adafruit driver at https://github.com/adafruit/Adafruit_TSL2561 by\n// K. Townsend\ntype TSL2561Driver struct {\n\t*Driver\n\n\tautoGain        bool\n\tgain            TSL2561Gain\n\tintegrationTime TSL2561IntegrationTime\n}\n\n// NewTSL2561Driver creates a new driver for the TSL2561 device.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\t\tbus to use with this driver\n//\ti2c.WithAddress(int):\t\taddress to use with this driver\n//\ti2c.WithTSL2561Gain1X:\t\tsets the gain to 1X\n//\ti2c.WithTSL2561Gain16X:\t\tsets the gain to 16X\n//\ti2c.WithTSL2561AutoGain:\tturns on auto gain\n//\ti2c.WithTSL2561IntegrationTime13MS:\tsets integration time to 13ms\n//\ti2c.WithTSL2561IntegrationTime101MS: \tsets integration time to 101ms\n//\ti2c.WithTSL2561IntegrationTime402MS: \tsets integration time to 402ms\nfunc NewTSL2561Driver(c Connector, options ...func(Config)) *TSL2561Driver {\n\td := &TSL2561Driver{\n\t\tDriver:          NewDriver(c, \"TSL2561\", TSL2561AddressFloat),\n\t\tintegrationTime: TSL2561IntegrationTime402MS,\n\t\tgain:            TSL2561Gain1X,\n\t\tautoGain:        false,\n\t}\n\td.afterStart = d.initialize\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// WithTSL2561Gain1X option sets the TSL2561Driver gain to 1X\nfunc WithTSL2561Gain1X(c Config) {\n\td, ok := c.(*TSL2561Driver)\n\tif ok {\n\t\td.gain = TSL2561Gain1X\n\t\treturn\n\t}\n\t// TODO: return errors.New(\"Trying to set Gain for non-TSL2561Driver\")\n}\n\n// WithTSL2561Gain16X option sets the TSL2561Driver gain to 16X\nfunc WithTSL2561Gain16X(c Config) {\n\td, ok := c.(*TSL2561Driver)\n\tif ok {\n\t\td.gain = TSL2561Gain16X\n\t\treturn\n\t}\n\t// TODO: return errors.New(\"Trying to set Gain for non-TSL2561Driver\")\n}\n\n// WithTSL2561AutoGain option turns on TSL2561Driver auto gain\nfunc WithTSL2561AutoGain(c Config) {\n\td, ok := c.(*TSL2561Driver)\n\tif ok {\n\t\td.autoGain = true\n\t\treturn\n\t}\n\t// TODO: return errors.New(\"Trying to set Auto Gain for non-TSL2561Driver\")\n}\n\nfunc withTSL2561IntegrationTime(iTime TSL2561IntegrationTime) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*TSL2561Driver)\n\t\tif ok {\n\t\t\td.integrationTime = iTime\n\t\t\treturn\n\t\t}\n\t\t// TODO: return errors.New(\"Trying to set integration time for non-TSL2561Driver\")\n\t}\n}\n\n// WithTSL2561IntegrationTime13MS option sets the TSL2561Driver integration time\n// to 13ms\nfunc WithTSL2561IntegrationTime13MS(c Config) {\n\twithTSL2561IntegrationTime(TSL2561IntegrationTime13MS)(c)\n}\n\n// WithTSL2561IntegrationTime101MS option sets the TSL2561Driver integration time\n// to 101ms\nfunc WithTSL2561IntegrationTime101MS(c Config) {\n\twithTSL2561IntegrationTime(TSL2561IntegrationTime101MS)(c)\n}\n\n// WithTSL2561IntegrationTime402MS option sets the TSL2561Driver integration time\n// to 402ms\nfunc WithTSL2561IntegrationTime402MS(c Config) {\n\twithTSL2561IntegrationTime(TSL2561IntegrationTime402MS)(c)\n}\n\n// SetIntegrationTime sets integrations time for the TSL2561\nfunc (d *TSL2561Driver) SetIntegrationTime(time TSL2561IntegrationTime) error {\n\tif err := d.enable(); err != nil {\n\t\treturn err\n\t}\n\n\ttimeGainVal := uint8(time) | uint8(d.gain) //nolint:gosec // TODO: fix later\n\tif err := d.writeByteData(tsl2561CommandBit|tsl2561RegisterTiming, timeGainVal); err != nil {\n\t\treturn err\n\t}\n\td.integrationTime = time\n\n\treturn d.disable()\n}\n\n// SetGain adjusts the TSL2561 gain (sensitivity to light)\nfunc (d *TSL2561Driver) SetGain(gain TSL2561Gain) error {\n\tif err := d.enable(); err != nil {\n\t\treturn err\n\t}\n\n\ttimeGainVal := uint8(d.integrationTime) | uint8(gain) //nolint:gosec // TODO: fix later\n\tif err := d.writeByteData(tsl2561CommandBit|tsl2561RegisterTiming, timeGainVal); err != nil {\n\t\treturn err\n\t}\n\td.gain = gain\n\n\treturn d.disable()\n}\n\n// GetLuminocity gets the broadband and IR only values from the TSL2561,\n// adjusting gain if auto-gain is enabled\nfunc (d *TSL2561Driver) GetLuminocity() (uint16, uint16, error) {\n\t// if auto gain disabled get a single reading and continue\n\tif !d.autoGain {\n\t\treturn d.getData()\n\t}\n\n\tagcCheck := false\n\thi, lo := d.getHiLo()\n\n\t// Read data until we find a valid range\n\tvar broadband uint16\n\tvar ir uint16\n\tvar err error\n\tvalid := false\n\tfor {\n\t\tbroadband, ir, err = d.getData()\n\t\tif err != nil {\n\t\t\treturn broadband, ir, err\n\t\t}\n\n\t\t// Run an auto-gain check if we haven't already done so\n\t\tif !agcCheck {\n\t\t\tswitch {\n\t\t\tcase (broadband < lo) && (d.gain == TSL2561Gain1X):\n\t\t\t\t// increase gain and try again\n\t\t\t\terr = d.SetGain(TSL2561Gain16X)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn broadband, ir, err\n\t\t\t\t}\n\t\t\t\tagcCheck = true\n\t\t\tcase (broadband > hi) && (d.gain == TSL2561Gain16X):\n\t\t\t\t// drop gain and try again\n\t\t\t\terr = d.SetGain(TSL2561Gain1X)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn broadband, ir, err\n\t\t\t\t}\n\t\t\t\tagcCheck = true\n\t\t\tdefault:\n\t\t\t\t// Reading is either valid, or we're already at the chips\n\t\t\t\t// limits\n\t\t\t\tvalid = true\n\t\t\t}\n\t\t} else {\n\t\t\t// If we've already adjusted the gain once, just return the new results.\n\t\t\t// This avoids endless loops where a value is at one extreme pre-gain,\n\t\t\t// and the other extreme post-gain\n\t\t\tvalid = true\n\t\t}\n\n\t\tif valid {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn broadband, ir, err\n}\n\n// CalculateLux converts raw sensor values to the standard SI Lux equivalent.\n// Returns 65536 if the sensor is saturated.\nfunc (d *TSL2561Driver) CalculateLux(broadband uint16, ir uint16) uint32 {\n\tvar channel1 uint32\n\tvar channel0 uint32\n\n\t// Set cliplevel and scaling based on integration time\n\tclipThreshold, chScale := d.getClipScaling()\n\n\t// Saturated sensor\n\tif (broadband > clipThreshold) || (ir > clipThreshold) {\n\t\treturn 65536\n\t}\n\n\t// Adjust scale for gain\n\tif d.gain == TSL2561Gain1X {\n\t\tchScale = chScale * 16\n\t}\n\n\tchannel0 = (uint32(broadband) * chScale) >> tsl2561LuxChScale\n\tchannel1 = (uint32(ir) * chScale) >> tsl2561LuxChScale\n\n\t// Find the ratio of the channel values (channel1 / channel0)\n\tvar ratio1 uint32\n\tif channel0 != 0 {\n\t\tratio1 = (channel1 << (tsl2561LuxRatioScale + 1)) / channel0\n\t}\n\n\t// Round the ratio value\n\tratio := (ratio1 + 1) / 2\n\n\tb, m := d.getBM(ratio)\n\tvar temp uint32\n\tif (channel0 * b) > (channel1 * m) {\n\t\ttemp = (channel0 * b) - (channel1 * m)\n\t}\n\n\t// Round lsb (2^(LUX_SCALE+1))\n\ttemp += (1 << (tsl2561LuxLuxScale - 1))\n\n\t// Strip off fractional portion\n\tlux := temp >> tsl2561LuxLuxScale\n\n\treturn lux\n}\n\nfunc (d *TSL2561Driver) enable() error {\n\treturn d.writeByteData(uint8(tsl2561CommandBit|tsl2561RegisterControl), tsl2561ControlPowerOn)\n}\n\nfunc (d *TSL2561Driver) disable() error {\n\treturn d.writeByteData(uint8(tsl2561CommandBit|tsl2561RegisterControl), tsl2561ControlPowerOff)\n}\n\nfunc (d *TSL2561Driver) getData() (uint16, uint16, error) {\n\tif err := d.enable(); err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\td.waitForADC()\n\n\t// Reads a two byte value from channel 0 (visible + infrared)\n\tbroadband, err := d.readWordData(tsl2561CommandBit | tsl2561WordBit | tsl2561RegisterChan0Low)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Reads a two byte value from channel 1 (infrared)\n\tir, err := d.readWordData(tsl2561CommandBit | tsl2561WordBit | tsl2561RegisterChan1Low)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\terr = d.disable()\n\n\treturn broadband, ir, err\n}\n\n//nolint:nonamedreturns // is sufficient here\nfunc (d *TSL2561Driver) getHiLo() (hi, lo uint16) {\n\tswitch d.integrationTime {\n\tcase TSL2561IntegrationTime13MS:\n\t\thi = tsl2561AgcTHi13MS\n\t\tlo = tsl2561AgcTLo13MS\n\tcase TSL2561IntegrationTime101MS:\n\t\thi = tsl2561AgcTHi101MS\n\t\tlo = tsl2561AgcTLo101MS\n\tcase TSL2561IntegrationTime402MS:\n\t\thi = tsl2561AgcTHi402MS\n\t\tlo = tsl2561AgcTLo402MS\n\t}\n\treturn\n}\n\n//nolint:nonamedreturns // is sufficient here\nfunc (d *TSL2561Driver) getClipScaling() (clipThreshold uint16, chScale uint32) {\n\tswitch d.integrationTime {\n\tcase TSL2561IntegrationTime13MS:\n\t\tclipThreshold = tsl2561Clipping13MS\n\t\tchScale = tsl2561LuxCHScaleTInt0\n\tcase TSL2561IntegrationTime101MS:\n\t\tclipThreshold = tsl2561Clipping101MS\n\t\tchScale = tsl2561LuxChScaleTInt1\n\tcase TSL2561IntegrationTime402MS:\n\t\tclipThreshold = tsl2561Clipping402MS\n\t\tchScale = (1 << tsl2561LuxChScale)\n\t}\n\treturn\n}\n\n//nolint:nonamedreturns // is sufficient here\nfunc (d *TSL2561Driver) getBM(ratio uint32) (b uint32, m uint32) {\n\tswitch {\n\tcase ratio <= tsl2561LuxK1T:\n\t\tb = tsl2561LuxB1T\n\t\tm = tsl2561LuxM1T\n\tcase (ratio <= tsl2561LuxK2T):\n\t\tb = tsl2561LuxB2T\n\t\tm = tsl2561LuxM2T\n\tcase (ratio <= tsl2561LuxK3T):\n\t\tb = tsl2561LuxB3T\n\t\tm = tsl2561LuxM3T\n\tcase (ratio <= tsl2561LuxK4T):\n\t\tb = tsl2561LuxB4T\n\t\tm = tsl2561LuxM4T\n\tcase (ratio <= tsl2561LuxK5T):\n\t\tb = tsl2561LuxB5T\n\t\tm = tsl2561LuxM5T\n\tcase (ratio <= tsl2561LuxK6T):\n\t\tb = tsl2561LuxB6T\n\t\tm = tsl2561LuxM6T\n\tcase (ratio <= tsl2561LuxK7T):\n\t\tb = tsl2561LuxB7T\n\t\tm = tsl2561LuxM7T\n\tcase (ratio > tsl2561LuxK8T): // TODO: there is a gap here...\n\t\tb = tsl2561LuxB8T\n\t\tm = tsl2561LuxM8T\n\t}\n\treturn\n}\n\nfunc (d *TSL2561Driver) waitForADC() {\n\tswitch d.integrationTime {\n\tcase TSL2561IntegrationTime13MS:\n\t\ttime.Sleep(15 * time.Millisecond)\n\tcase TSL2561IntegrationTime101MS:\n\t\ttime.Sleep(120 * time.Millisecond)\n\tcase TSL2561IntegrationTime402MS:\n\t\ttime.Sleep(450 * time.Millisecond)\n\t}\n}\n\nfunc (d *TSL2561Driver) initialize() error {\n\tif err := d.enable(); err != nil {\n\t\treturn err\n\t}\n\n\tif initialized, err := d.readByteData(tsl2561RegisterID); err != nil {\n\t\treturn err\n\t} else if (initialized & 0x0A) == 0 {\n\t\treturn fmt.Errorf(\"TSL2561 device not found (0x%X)\", initialized)\n\t}\n\n\tif err := d.SetIntegrationTime(d.integrationTime); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.SetGain(d.gain); err != nil {\n\t\treturn err\n\t}\n\n\tif err := d.disable(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/tsl2561_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*TSL2561Driver)(nil)\n\nfunc initTestTSL2561DriverStarted() (*TSL2561Driver, *i2cTestAdaptor) {\n\td, a := initTestTSL2561Driver()\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc initTestTSL2561Driver() (*TSL2561Driver, *i2cTestAdaptor) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a, WithTSL2561IntegrationTime13MS) // to reduce sleep time to minimum\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\t// Mock device responding 0xA\n\t\t_ = binary.Write(buf, binary.LittleEndian, uint8(0x0A))\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\treturn d, a\n}\n\nfunc TestNewTSL2561Driver(t *testing.T) {\n\tvar di interface{} = NewTSL2561Driver(newI2cTestAdaptor())\n\td, ok := di.(*TSL2561Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewTSL2561Driver() should have returned a *TSL2561Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"TSL2561\"))\n\tassert.Equal(t, 0x39, d.defaultAddress)\n\tassert.False(t, d.autoGain)\n\tassert.Equal(t, TSL2561Gain(0), d.gain)\n\tassert.Equal(t, TSL2561IntegrationTime(2), d.integrationTime)\n}\n\nfunc TestTSL2561DriverOptions(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithBus() option and\n\t// least one of this driver. Further tests for options can also be done by call of \"WithOption(val)(d)\".\n\td := NewTSL2561Driver(newI2cTestAdaptor(), WithBus(2), WithTSL2561AutoGain)\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n\tassert.True(t, d.autoGain)\n}\n\nfunc TestTSL2561DriverStart(t *testing.T) {\n\t// arrange\n\td, _ := initTestTSL2561Driver()\n\t// act, assert\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestTSL2561DriverStartNotFound(t *testing.T) {\n\td, a := initTestTSL2561Driver()\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{1})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\trequire.ErrorContains(t, d.Start(), \"TSL2561 device not found (0x1)\")\n}\n\nfunc TestTSL2561DriverHalt(t *testing.T) {\n\t// arrange\n\td, _ := initTestTSL2561Driver()\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestTSL2561DriverValidOptions(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime101MS,\n\t\tWithAddress(TSL2561AddressLow),\n\t\tWithTSL2561AutoGain)\n\n\tassert.NotNil(t, d)\n\tassert.True(t, d.autoGain)\n\tassert.Equal(t, TSL2561IntegrationTime101MS, d.integrationTime)\n}\n\nfunc TestTSL2561DriverMoreOptions(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime101MS,\n\t\tWithAddress(TSL2561AddressLow),\n\t\tWithTSL2561Gain16X)\n\n\tassert.NotNil(t, d)\n\tassert.False(t, d.autoGain)\n\tassert.Equal(t, TSL2561Gain(TSL2561Gain16X), d.gain)\n}\n\nfunc TestTSL2561DriverEvenMoreOptions(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime13MS,\n\t\tWithAddress(TSL2561AddressLow),\n\t\tWithTSL2561Gain1X)\n\n\tassert.NotNil(t, d)\n\tassert.False(t, d.autoGain)\n\tassert.Equal(t, TSL2561Gain1X, d.gain)\n\tassert.Equal(t, TSL2561IntegrationTime13MS, d.integrationTime)\n}\n\nfunc TestTSL2561DriverYetEvenMoreOptions(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime402MS,\n\t\tWithAddress(TSL2561AddressLow),\n\t\tWithTSL2561AutoGain)\n\n\tassert.NotNil(t, d)\n\tassert.True(t, d.autoGain)\n\tassert.Equal(t, TSL2561IntegrationTime402MS, d.integrationTime)\n}\n\nfunc TestTSL2561DriverGetDataWriteError(t *testing.T) {\n\td, a := initTestTSL2561DriverStarted()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\n\t_, _, err := d.getData()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestTSL2561DriverGetDataReadError(t *testing.T) {\n\td, a := initTestTSL2561DriverStarted()\n\ta.i2cReadImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"read error\")\n\t}\n\n\t_, _, err := d.getData()\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestTSL2561DriverGetLuminocity(t *testing.T) {\n\td, a := initTestTSL2561DriverStarted()\n\t// TODO: obtain real sensor data here for testing\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{77, 48})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\tbb, ir, err := d.GetLuminocity()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint16(12365), bb)\n\tassert.Equal(t, uint16(12365), ir)\n\td.integrationTime = TSL2561IntegrationTime402MS\n\tassert.Equal(t, uint32(72), d.CalculateLux(bb, ir))\n}\n\nfunc TestTSL2561DriverGetLuminocityAutoGain(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime13MS, // to reduce sleep time to minimum\n\t\tWithAddress(TSL2561AddressLow),\n\t\tWithTSL2561AutoGain)\n\t// TODO: obtain real sensor data here for testing\n\ta.i2cReadImpl = func(b []byte) (int, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{77, 48})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil\n\t}\n\t_ = d.Start() // because we override start procedure\n\tbb, ir, err := d.GetLuminocity()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint16(12365), bb)\n\tassert.Equal(t, uint16(12365), ir)\n\td.integrationTime = TSL2561IntegrationTime402MS\n\tassert.Equal(t, uint32(72), d.CalculateLux(bb, ir))\n}\n\nfunc TestTSL2561SetIntegrationTimeError(t *testing.T) {\n\td, a := initTestTSL2561DriverStarted()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\trequire.ErrorContains(t, d.SetIntegrationTime(TSL2561IntegrationTime101MS), \"write error\")\n}\n\nfunc TestTSL2561SetGainError(t *testing.T) {\n\td, a := initTestTSL2561DriverStarted()\n\ta.i2cWriteImpl = func([]byte) (int, error) {\n\t\treturn 0, errors.New(\"write error\")\n\t}\n\trequire.ErrorContains(t, d.SetGain(TSL2561Gain16X), \"write error\")\n}\n\nfunc TestTSL2561getHiLo13MS(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime13MS,\n\t\tWithTSL2561AutoGain)\n\n\thi, lo := d.getHiLo()\n\tassert.Equal(t, uint16(tsl2561AgcTHi13MS), hi)\n\tassert.Equal(t, uint16(tsl2561AgcTLo13MS), lo)\n}\n\nfunc TestTSL2561getHiLo101MS(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime101MS,\n\t\tWithTSL2561AutoGain)\n\n\thi, lo := d.getHiLo()\n\tassert.Equal(t, uint16(tsl2561AgcTHi101MS), hi)\n\tassert.Equal(t, uint16(tsl2561AgcTLo101MS), lo)\n}\n\nfunc TestTSL2561getHiLo402MS(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime402MS,\n\t\tWithTSL2561AutoGain)\n\n\thi, lo := d.getHiLo()\n\tassert.Equal(t, uint16(tsl2561AgcTHi402MS), hi)\n\tassert.Equal(t, uint16(tsl2561AgcTLo402MS), lo)\n}\n\nfunc TestTSL2561getClipScaling13MS(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime13MS,\n\t\tWithTSL2561AutoGain)\n\n\tc, s := d.getClipScaling()\n\td.waitForADC()\n\tassert.Equal(t, uint16(tsl2561Clipping13MS), c)\n\tassert.Equal(t, uint32(tsl2561LuxCHScaleTInt0), s)\n}\n\nfunc TestTSL2561getClipScaling101MS(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime101MS,\n\t\tWithTSL2561AutoGain)\n\n\tc, s := d.getClipScaling()\n\td.waitForADC()\n\tassert.Equal(t, uint16(tsl2561Clipping101MS), c)\n\tassert.Equal(t, uint32(tsl2561LuxChScaleTInt1), s)\n}\n\nfunc TestTSL2561getClipScaling402MS(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime402MS,\n\t\tWithTSL2561AutoGain)\n\n\tc, s := d.getClipScaling()\n\td.waitForADC()\n\tassert.Equal(t, uint16(tsl2561Clipping402MS), c)\n\tassert.Equal(t, uint32(1<<tsl2561LuxChScale), s)\n}\n\nfunc TestTSL2561getBM(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewTSL2561Driver(a,\n\t\tWithTSL2561IntegrationTime13MS,\n\t\tWithTSL2561AutoGain)\n\n\tb, m := d.getBM(tsl2561LuxK1T)\n\tassert.Equal(t, uint32(tsl2561LuxB1T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM1T), m)\n\n\tb, m = d.getBM(tsl2561LuxK2T)\n\tassert.Equal(t, uint32(tsl2561LuxB2T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM2T), m)\n\n\tb, m = d.getBM(tsl2561LuxK3T)\n\tassert.Equal(t, uint32(tsl2561LuxB3T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM3T), m)\n\n\tb, m = d.getBM(tsl2561LuxK4T)\n\tassert.Equal(t, uint32(tsl2561LuxB4T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM4T), m)\n\n\tb, m = d.getBM(tsl2561LuxK5T)\n\tassert.Equal(t, uint32(tsl2561LuxB5T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM5T), m)\n\n\tb, m = d.getBM(tsl2561LuxK6T)\n\tassert.Equal(t, uint32(tsl2561LuxB6T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM6T), m)\n\n\tb, m = d.getBM(tsl2561LuxK7T)\n\tassert.Equal(t, uint32(tsl2561LuxB7T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM7T), m)\n\n\tb, m = d.getBM(tsl2561LuxK8T + 1)\n\tassert.Equal(t, uint32(tsl2561LuxB8T), b)\n\tassert.Equal(t, uint32(tsl2561LuxM8T), m)\n}\n"
  },
  {
    "path": "drivers/i2c/wiichuck_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// Joystick event when the Wiichuck joystick is moved\n\tJoystick = \"joystick\"\n\n\t// C event when the Wiichuck \"C\" button is pressed\n\tC = \"c\"\n\n\t// Z event when the Wiichuck \"C\" button is pressed\n\tZ = \"z\"\n)\n\nconst (\n\twiichuckDefaultAddress = 0x52\n\twiichuckStopTimeout    = 2 * time.Second\n)\n\n// WiichuckDriver contains the attributes for the i2c driver\ntype WiichuckDriver struct {\n\t*Driver\n\tgobot.Eventer\n\n\tinterval       time.Duration\n\tpauseTime      time.Duration\n\tmtx            sync.Mutex\n\tdoneChan       chan struct{}\n\treallyDoneChan chan struct{}\n\tjoystick       map[string]float64\n\tdata           map[string]float64\n}\n\n// NewWiichuckDriver creates a WiichuckDriver with specified i2c interface.\n//\n// Params:\n//\n//\tc Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\ti2c.WithBus(int):\tbus to use with this driver\n//\ti2c.WithAddress(int):\taddress to use with this driver\nfunc NewWiichuckDriver(c Connector, options ...func(Config)) *WiichuckDriver {\n\td := &WiichuckDriver{\n\t\tDriver:    NewDriver(c, \"Wiichuck\", wiichuckDefaultAddress),\n\t\tinterval:  10 * time.Millisecond,\n\t\tpauseTime: 1 * time.Millisecond,\n\t\tEventer:   gobot.NewEventer(),\n\t\tjoystick: map[string]float64{\n\t\t\t\"sy_origin\": -1,\n\t\t\t\"sx_origin\": -1,\n\t\t},\n\t\tdata: map[string]float64{\n\t\t\t\"sx\": 0,\n\t\t\t\"sy\": 0,\n\t\t\t\"z\":  0,\n\t\t\t\"c\":  0,\n\t\t},\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\td.AddEvent(Z)\n\td.AddEvent(C)\n\td.AddEvent(Joystick)\n\td.AddEvent(Error)\n\n\treturn d\n}\n\n// Joystick returns the current value for the joystick\nfunc (d *WiichuckDriver) Joystick() map[string]float64 {\n\tval := make(map[string]float64)\n\td.mtx.Lock()\n\tdefer d.mtx.Unlock()\n\tval[\"sx_origin\"] = d.joystick[\"sx_origin\"]\n\tval[\"sy_origin\"] = d.joystick[\"sy_origin\"]\n\treturn val\n}\n\n// update parses value to update buttons and joystick.\n// If value is encrypted, warning message is printed\nfunc (d *WiichuckDriver) update(value []byte) error {\n\tif d.isEncrypted(value) {\n\t\treturn fmt.Errorf(\"encrypted bytes\")\n\t}\n\n\td.parse(value)\n\td.adjustOrigins()\n\td.updateButtons()\n\td.updateJoystick()\n\treturn nil\n}\n\n// setJoystickDefaultValue sets default value if value is -1\nfunc (d *WiichuckDriver) setJoystickDefaultValue(joystickAxis string, defaultValue float64) {\n\td.mtx.Lock()\n\tdefer d.mtx.Unlock()\n\tif d.joystick[joystickAxis] == -1 {\n\t\td.joystick[joystickAxis] = defaultValue\n\t}\n}\n\n// calculateJoystickValue returns distance between axis and origin\nfunc (d *WiichuckDriver) calculateJoystickValue(axis float64, origin float64) float64 {\n\treturn axis - origin\n}\n\n// isEncrypted returns true if value is encrypted\nfunc (d *WiichuckDriver) isEncrypted(value []byte) bool {\n\tif value[0] == value[1] && value[2] == value[3] && value[4] == value[5] {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// decode removes encoding from `x` byte\nfunc (d *WiichuckDriver) decode(x byte) float64 {\n\treturn float64((x ^ 0x17) + 0x17)\n}\n\n// adjustOrigins sets sy_origin and sx_origin with values from data\nfunc (d *WiichuckDriver) adjustOrigins() {\n\td.setJoystickDefaultValue(\"sy_origin\", d.data[\"sy\"])\n\td.setJoystickDefaultValue(\"sx_origin\", d.data[\"sx\"])\n}\n\n// updateButtons publishes \"c\" and \"x\" events if present in data\nfunc (d *WiichuckDriver) updateButtons() {\n\tif d.data[\"c\"] == 0 {\n\t\td.Publish(d.Event(C), true)\n\t}\n\tif d.data[\"z\"] == 0 {\n\t\td.Publish(d.Event(Z), true)\n\t}\n}\n\n// updateJoystick publishes event with current x and y values for joystick\nfunc (d *WiichuckDriver) updateJoystick() {\n\tjoy := d.Joystick()\n\td.Publish(d.Event(Joystick), map[string]float64{\n\t\t\"x\": d.calculateJoystickValue(d.data[\"sx\"], joy[\"sx_origin\"]),\n\t\t\"y\": d.calculateJoystickValue(d.data[\"sy\"], joy[\"sy_origin\"]),\n\t})\n}\n\n// parse sets driver values based on parsed value\nfunc (d *WiichuckDriver) parse(value []byte) {\n\td.data[\"sx\"] = d.decode(value[0])\n\td.data[\"sy\"] = d.decode(value[1])\n\td.data[\"z\"] = float64(uint8(d.decode(value[5])) & 0x01)\n\td.data[\"c\"] = float64(uint8(d.decode(value[5])) & 0x02)\n}\n\n// reads from adaptor using specified interval to update with new value\nfunc (d *WiichuckDriver) initialize() error {\n\td.doneChan = make(chan struct{})\n\td.reallyDoneChan = make(chan struct{})\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-d.doneChan:\n\t\t\t\tif d.reallyDoneChan != nil {\n\t\t\t\t\tclose(d.reallyDoneChan)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\tif _, err := d.write([]byte{0x40, 0x00}); err != nil {\n\t\t\t\t\td.Publish(d.Event(Error), err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\ttime.Sleep(d.pauseTime)\n\t\t\t\tif _, err := d.write([]byte{0x00}); err != nil {\n\t\t\t\t\td.Publish(d.Event(Error), err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\ttime.Sleep(d.pauseTime)\n\t\t\t\tnewValue := make([]byte, 6)\n\t\t\t\tbytesRead, err := d.read(newValue)\n\t\t\t\tif err != nil {\n\t\t\t\t\td.Publish(d.Event(Error), err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif bytesRead == 6 {\n\t\t\t\t\tif err = d.update(newValue); err != nil {\n\t\t\t\t\t\td.Publish(d.Event(Error), err)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttime.Sleep(d.interval)\n\t\t\t}\n\t\t}\n\t}()\n\treturn nil\n}\n\nfunc (d *WiichuckDriver) shutdown() error {\n\tif d.doneChan != nil {\n\t\tclose(d.doneChan)\n\t\t// wait until go routine is really finished, so connection can be set to nil safely\n\t\tselect {\n\t\tcase <-time.After(wiichuckStopTimeout):\n\t\t\treturn fmt.Errorf(\"go routine not finished in %s\", wiichuckStopTimeout)\n\t\tcase <-d.reallyDoneChan:\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/i2c/wiichuck_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on i2c.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*WiichuckDriver)(nil)\n\nfunc initTestWiichuckDriverWithStubbedAdaptor() *WiichuckDriver {\n\td := NewWiichuckDriver(newI2cTestAdaptor())\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d\n}\n\nfunc TestNewWiichuckDriver(t *testing.T) {\n\tvar di interface{} = NewWiichuckDriver(newI2cTestAdaptor())\n\td, ok := di.(*WiichuckDriver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewWiichuckDriver() should have returned a *WiichuckDriver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Wiichuck\"))\n\tassert.Equal(t, 0x52, d.defaultAddress)\n\tassert.Equal(t, 10*time.Millisecond, d.interval)\n}\n\nfunc TestWiichuckDriverStart(t *testing.T) {\n\ta := newI2cTestAdaptor()\n\td := NewWiichuckDriver(a)\n\ta.Testi2cReadImpl(func(b []byte) (int, error) {\n\t\tcopy(b, []byte{1, 2, 3, 4, 5, 6})\n\t\treturn 6, nil\n\t})\n\tnumberOfCyclesForEvery := 3\n\td.interval = 1 * time.Millisecond\n\tsem := make(chan bool)\n\n\trequire.NoError(t, d.Start())\n\n\tgo func() {\n\t\tfor {\n\t\t\ttime.Sleep(time.Duration(numberOfCyclesForEvery) * time.Millisecond)\n\t\t\tj := d.Joystick()\n\t\t\tif (j[\"sy_origin\"] == float64(44)) &&\n\t\t\t\t(j[\"sx_origin\"] == float64(45)) {\n\t\t\t\tsem <- true\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"origin not read correctly\")\n\t}\n}\n\nfunc TestWiichuckDriverHalt(t *testing.T) {\n\t// arrange\n\td := NewWiichuckDriver(newI2cTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestWiichuckDriverCanParse(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\t// ------ When value is not encrypted\n\tdecryptedValue := []byte{1, 2, 3, 4, 5, 6}\n\t_ = d.update(decryptedValue)\n\n\t// - This should be done by WiichuckDriver.parse\n\tassert.InDelta(t, float64(45), d.data[\"sx\"], 0.0)\n\tassert.InDelta(t, float64(44), d.data[\"sy\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"z\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"c\"], 0.0)\n}\n\nfunc TestWiichuckDriverCanAdjustOrigins(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\t// ------ When value is not encrypted\n\tdecryptedValue := []byte{1, 2, 3, 4, 5, 6}\n\t_ = d.update(decryptedValue)\n\n\t// - This should be done by WiichuckDriver.adjustOrigins\n\tassert.InDelta(t, float64(45), d.Joystick()[\"sx_origin\"], 0.0)\n\tassert.InDelta(t, float64(44), d.Joystick()[\"sy_origin\"], 0.0)\n}\n\nfunc TestWiichuckDriverCButton(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\t// ------ When value is not encrypted\n\tdecryptedValue := []byte{1, 2, 3, 4, 5, 6}\n\t_ = d.update(decryptedValue)\n\n\t// - This should be done by WiichuckDriver.updateButtons\n\tdone := make(chan bool)\n\n\t_ = d.On(d.Event(C), func(data interface{}) {\n\t\tassert.Equal(t, true, data)\n\t\tdone <- true\n\t})\n\n\t_ = d.update(decryptedValue)\n\n\tselect {\n\tcase <-done:\n\tcase <-time.After(10 * time.Second):\n\t\trequire.Fail(t, \"Did not receive 'C' event\")\n\t}\n}\n\nfunc TestWiichuckDriverZButton(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\t// ------ When value is not encrypted\n\tdecryptedValue := []byte{1, 2, 3, 4, 5, 6}\n\t_ = d.update(decryptedValue)\n\n\tdone := make(chan bool)\n\n\t_ = d.On(d.Event(Z), func(data interface{}) {\n\t\tassert.Equal(t, true, data)\n\t\tdone <- true\n\t})\n\n\t_ = d.update(decryptedValue)\n\n\tselect {\n\tcase <-done:\n\tcase <-time.After(10 * time.Second):\n\t\trequire.Fail(t, \"Did not receive 'Z' event\")\n\t}\n}\n\nfunc TestWiichuckDriverUpdateJoystick(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\t// ------ When value is not encrypted\n\tdecryptedValue := []byte{1, 2, 3, 4, 5, 6}\n\n\t// - This should be done by WiichuckDriver.updateJoystick\n\texpectedData := map[string]float64{\n\t\t\"x\": float64(0),\n\t\t\"y\": float64(0),\n\t}\n\n\tdone := make(chan bool)\n\n\t_ = d.On(d.Event(Joystick), func(data interface{}) {\n\t\tassert.Equal(t, expectedData, data)\n\t\tdone <- true\n\t})\n\n\t_ = d.update(decryptedValue)\n\n\tselect {\n\tcase <-done:\n\tcase <-time.After(10 * time.Second):\n\t\trequire.Fail(t, \"Did not receive 'Joystick' event\")\n\t}\n}\n\nfunc TestWiichuckDriverEncrypted(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\tencryptedValue := []byte{1, 1, 2, 2, 3, 3}\n\n\t_ = d.update(encryptedValue)\n\n\tassert.InDelta(t, float64(0), d.data[\"sx\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"sy\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"z\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"c\"], 0.0)\n\n\tassert.InDelta(t, float64(-1), d.Joystick()[\"sx_origin\"], 0.0)\n\tassert.InDelta(t, float64(-1), d.Joystick()[\"sy_origin\"], 0.0)\n}\n\nfunc TestWiichuckDriverSetJoystickDefaultValue(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\tassert.InDelta(t, float64(-1), d.Joystick()[\"sy_origin\"], 0.0)\n\n\td.setJoystickDefaultValue(\"sy_origin\", float64(2))\n\n\tassert.InDelta(t, float64(2), d.Joystick()[\"sy_origin\"], 0.0)\n\n\t// when current default value is not -1 it keeps the current value\n\td.setJoystickDefaultValue(\"sy_origin\", float64(20))\n\n\tassert.InDelta(t, float64(2), d.Joystick()[\"sy_origin\"], 0.0)\n}\n\nfunc TestWiichuckDriverCalculateJoystickValue(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\tassert.InDelta(t, float64(15), d.calculateJoystickValue(float64(20), float64(5)), 0.0)\n\tassert.InDelta(t, float64(-1), d.calculateJoystickValue(float64(1), float64(2)), 0.0)\n\tassert.InDelta(t, float64(5), d.calculateJoystickValue(float64(10), float64(5)), 0.0)\n\tassert.InDelta(t, float64(-5), d.calculateJoystickValue(float64(5), float64(10)), 0.0)\n}\n\nfunc TestWiichuckDriverIsEncrypted(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\tencryptedValue := []byte{1, 1, 2, 2, 3, 3}\n\tassert.True(t, d.isEncrypted(encryptedValue))\n\n\tencryptedValue = []byte{42, 42, 24, 24, 30, 30}\n\tassert.True(t, d.isEncrypted(encryptedValue))\n\n\tdecryptedValue := []byte{1, 2, 3, 4, 5, 6}\n\tassert.False(t, d.isEncrypted(decryptedValue))\n\n\tdecryptedValue = []byte{1, 1, 2, 2, 5, 6}\n\tassert.False(t, d.isEncrypted(decryptedValue))\n\n\tdecryptedValue = []byte{1, 1, 2, 3, 3, 3}\n\tassert.False(t, d.isEncrypted(decryptedValue))\n}\n\nfunc TestWiichuckDriverDecode(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\tassert.InDelta(t, float64(46), d.decode(byte(0)), 0.0)\n\tassert.InDelta(t, float64(138), d.decode(byte(100)), 0.0)\n\tassert.InDelta(t, float64(246), d.decode(byte(200)), 0.0)\n\tassert.InDelta(t, float64(0), d.decode(byte(254)), 0.0)\n}\n\nfunc TestWiichuckDriverParse(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\tassert.InDelta(t, float64(0), d.data[\"sx\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"sy\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"z\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"c\"], 0.0)\n\n\t// First pass\n\td.parse([]byte{12, 23, 34, 45, 56, 67})\n\n\tassert.InDelta(t, float64(50), d.data[\"sx\"], 0.0)\n\tassert.InDelta(t, float64(23), d.data[\"sy\"], 0.0)\n\tassert.InDelta(t, float64(1), d.data[\"z\"], 0.0)\n\tassert.InDelta(t, float64(2), d.data[\"c\"], 0.0)\n\n\t// Second pass\n\td.parse([]byte{70, 81, 92, 103, 204, 205})\n\n\tassert.InDelta(t, float64(104), d.data[\"sx\"], 0.0)\n\tassert.InDelta(t, float64(93), d.data[\"sy\"], 0.0)\n\tassert.InDelta(t, float64(1), d.data[\"z\"], 0.0)\n\tassert.InDelta(t, float64(0), d.data[\"c\"], 0.0)\n}\n\nfunc TestWiichuckDriverAdjustOrigins(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\n\tassert.InDelta(t, float64(-1), d.Joystick()[\"sy_origin\"], 0.0)\n\tassert.InDelta(t, float64(-1), d.Joystick()[\"sx_origin\"], 0.0)\n\n\t// First pass\n\td.parse([]byte{1, 2, 3, 4, 5, 6})\n\td.adjustOrigins()\n\n\tassert.InDelta(t, float64(44), d.Joystick()[\"sy_origin\"], 0.0)\n\tassert.InDelta(t, float64(45), d.Joystick()[\"sx_origin\"], 0.0)\n\n\t// Second pass\n\td = initTestWiichuckDriverWithStubbedAdaptor()\n\n\td.parse([]byte{61, 72, 83, 94, 105, 206})\n\td.adjustOrigins()\n\n\tassert.InDelta(t, float64(118), d.Joystick()[\"sy_origin\"], 0.0)\n\tassert.InDelta(t, float64(65), d.Joystick()[\"sx_origin\"], 0.0)\n}\n\nfunc TestWiichuckDriverSetName(t *testing.T) {\n\td := initTestWiichuckDriverWithStubbedAdaptor()\n\td.SetName(\"TESTME\")\n\tassert.Equal(t, \"TESTME\", d.Name())\n}\n\nfunc TestWiichuckDriverOptions(t *testing.T) {\n\td := NewWiichuckDriver(newI2cTestAdaptor(), WithBus(2))\n\tassert.Equal(t, 2, d.GetBusOrDefault(1))\n}\n"
  },
  {
    "path": "drivers/i2c/yl40_driver.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// All address pins are connected to ground.\nconst yl40DefaultAddress = 0x48\n\nconst yl40Debug = false\n\n// YL40Pin wraps the underlying string type for type safety\ntype YL40Pin string\n\nconst (\n\t// YL40Bri for brightness sensor, high brightness - low raw value, scaled to 0..1000 (high brightness - high value)\n\tYL40Bri YL40Pin = \"brightness\"\n\t// YL40Temp for temperature sensor, high temperature - low raw value, scaled to °C\n\tYL40Temp YL40Pin = \"temperature\"\n\t// YL40AIN2 is wired to AOUT, scaled to voltage 3.3V\n\tYL40AIN2 YL40Pin = \"analog input AIN2\"\n\t// YL40Poti is adjustable resistor, turn clockwise will lower the raw value, scaled to -100..+100% (clockwise)\n\tYL40Poti YL40Pin = \"potentiometer\"\n\t// YL40AOUT is the analog output\n\tYL40AOUT YL40Pin = \"analog output\"\n)\n\nconst (\n\t// the LED light is visible above ~1.7V\n\tyl40LedDefaultVal = 1.7\n\t// default refresh rate, set to zero (cyclic reading deactivated)\n\tyl40DefaultRefresh = 0\n)\n\ntype yl40Sensor struct {\n\tinterval time.Duration\n\tscaler   func(input int) (value float64)\n}\n\ntype yl40Config struct {\n\tsensors    map[YL40Pin]*yl40Sensor\n\taOutScaler func(input float64) (value int)\n}\n\nvar yl40Pins = map[YL40Pin]string{\n\tYL40Bri:  \"s.0\",\n\tYL40Temp: \"s.1\",\n\tYL40AIN2: \"s.2\",\n\tYL40Poti: \"s.3\",\n\tYL40AOUT: \"aOut.0\",\n}\n\n// YL40Driver is a Gobot i2c bus driver for the YL-40 module with light dependent resistor (LDR), thermistor (NTC)\n// and an potentiometer, one additional analog input and one analog output with an connected LED.\n// The module is based on PCF8591 with 4xADC, 1xDAC. For detailed documentation refer to PCF8591Driver.\n//\n// All values are linear scaled to 3.3V by default. This can be changed, see example \"tinkerboard_yl40.go\".\n//\n// This driver was tested with Tinkerboard and this board with temperature & brightness sensor:\n// https://www.makershop.de/download/YL_40_yl40.pdf\ntype YL40Driver struct {\n\t*PCF8591Driver\n\n\tconf yl40Config\n\n\taBri  *aio.AnalogSensorDriver\n\taTemp *aio.TemperatureSensorDriver\n\taAIN2 *aio.AnalogSensorDriver\n\taPoti *aio.AnalogSensorDriver\n\taOut  *aio.AnalogActuatorDriver\n}\n\n// NewYL40Driver creates a new driver with specified i2c interface\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional parameters:\n//\n//\t refer to PCF8591Driver for i2c specific options\n//\t\trefer to TemperatureSensorDriver for temperature sensor specific options\n//\t\trefer to AnalogSensorDriver for analog input specific options\n//\t refer to AnalogActuatorDriver for analog output specific options\nfunc NewYL40Driver(a Connector, options ...func(Config)) *YL40Driver {\n\toptions = append(options, WithAddress(yl40DefaultAddress))\n\tpcf := NewPCF8591Driver(a, options...)\n\n\tntc := aio.TemperatureSensorNtcConf{TC0: 25, R0: 10000.0, B: 3950} // Ohm, R25=10k, B=3950\n\tdefTempScaler := aio.TemperatureSensorNtcScaler(255, 1000, true, ntc)\n\n\tdefConf := yl40Config{\n\t\tsensors: map[YL40Pin]*yl40Sensor{\n\t\t\tYL40Bri: {\n\t\t\t\tinterval: yl40DefaultRefresh,\n\t\t\t\tscaler:   aio.AnalogSensorLinearScaler(0, 255, 1000, 0),\n\t\t\t},\n\t\t\tYL40Temp: {\n\t\t\t\tinterval: yl40DefaultRefresh,\n\t\t\t\tscaler:   defTempScaler,\n\t\t\t},\n\t\t\tYL40AIN2: {\n\t\t\t\tinterval: yl40DefaultRefresh,\n\t\t\t\tscaler:   aio.AnalogSensorLinearScaler(0, 255, 0, 3.3),\n\t\t\t},\n\t\t\tYL40Poti: {\n\t\t\t\tinterval: yl40DefaultRefresh,\n\t\t\t\tscaler:   aio.AnalogSensorLinearScaler(0, 255, 100, -100),\n\t\t\t},\n\t\t},\n\t\taOutScaler: aio.AnalogActuatorLinearScaler(0, 3.3, 0, 255),\n\t}\n\n\ty := &YL40Driver{\n\t\tPCF8591Driver: pcf,\n\t\tconf:          defConf,\n\t}\n\n\ty.SetName(gobot.DefaultName(\"YL-40\"))\n\n\tfor _, option := range options {\n\t\toption(y)\n\t}\n\n\t// initialize analog drivers\n\ty.aBri = aio.NewAnalogSensorDriver(pcf, yl40Pins[YL40Bri],\n\t\taio.WithSensorCyclicRead(y.conf.sensors[YL40Bri].interval),\n\t\taio.WithSensorScaler(y.conf.sensors[YL40Bri].scaler))\n\ty.aTemp = aio.NewTemperatureSensorDriver(pcf, yl40Pins[YL40Temp],\n\t\taio.WithSensorCyclicRead(y.conf.sensors[YL40Temp].interval),\n\t\taio.WithSensorScaler(y.conf.sensors[YL40Temp].scaler))\n\ty.aAIN2 = aio.NewAnalogSensorDriver(pcf, yl40Pins[YL40AIN2],\n\t\taio.WithSensorCyclicRead(y.conf.sensors[YL40AIN2].interval),\n\t\taio.WithSensorScaler(y.conf.sensors[YL40AIN2].scaler))\n\ty.aPoti = aio.NewAnalogSensorDriver(pcf, yl40Pins[YL40Poti],\n\t\taio.WithSensorCyclicRead(y.conf.sensors[YL40Poti].interval),\n\t\taio.WithSensorScaler(y.conf.sensors[YL40Poti].scaler))\n\ty.aOut = aio.NewAnalogActuatorDriver(pcf, yl40Pins[YL40AOUT],\n\t\taio.WithActuatorScaler(y.conf.aOutScaler))\n\n\treturn y\n}\n\n// WithYL40Interval option sets the interval for refresh of given pin in YL40 driver\nfunc WithYL40Interval(pin YL40Pin, val time.Duration) func(Config) {\n\treturn func(c Config) {\n\t\ty, ok := c.(*YL40Driver)\n\t\tif ok {\n\t\t\tif sensor, ok := y.conf.sensors[pin]; ok {\n\t\t\t\tsensor.interval = val\n\t\t\t}\n\t\t} else if yl40Debug {\n\t\t\tlog.Printf(\"trying to set interval for '%s' refresh for non-YL40Driver %v\", pin, c)\n\t\t}\n\t}\n}\n\n// WithYL40InputScaler option sets the input scaler of given input pin in YL40 driver\nfunc WithYL40InputScaler(pin YL40Pin, scaler func(input int) (value float64)) func(Config) {\n\treturn func(c Config) {\n\t\ty, ok := c.(*YL40Driver)\n\t\tif ok {\n\t\t\tif sensor, ok := y.conf.sensors[pin]; ok {\n\t\t\t\tsensor.scaler = scaler\n\t\t\t}\n\t\t} else if yl40Debug {\n\t\t\tlog.Printf(\"trying to set input scaler for '%s' for non-YL40Driver %v\", pin, c)\n\t\t}\n\t}\n}\n\n// WithYL40OutputScaler option sets the output scaler in YL40 driver\nfunc WithYL40OutputScaler(scaler func(input float64) (value int)) func(Config) {\n\treturn func(c Config) {\n\t\ty, ok := c.(*YL40Driver)\n\t\tif ok {\n\t\t\ty.conf.aOutScaler = scaler\n\t\t} else if yl40Debug {\n\t\t\tlog.Printf(\"trying to set output scaler for '%s' for non-YL40Driver %v\", YL40AOUT, c)\n\t\t}\n\t}\n}\n\n// Start initializes the driver\nfunc (y *YL40Driver) Start() error {\n\t// must be the first one\n\tif err := y.PCF8591Driver.Start(); err != nil {\n\t\treturn err\n\t}\n\tif err := y.aBri.Start(); err != nil {\n\t\treturn err\n\t}\n\tif err := y.aTemp.Start(); err != nil {\n\t\treturn err\n\t}\n\tif err := y.aAIN2.Start(); err != nil {\n\t\treturn err\n\t}\n\tif err := y.aPoti.Start(); err != nil {\n\t\treturn err\n\t}\n\tif err := y.aOut.Start(); err != nil {\n\t\treturn err\n\t}\n\treturn y.Write(yl40LedDefaultVal)\n}\n\n// Halt stops the driver\nfunc (y *YL40Driver) Halt() error {\n\t// we try halt on each device, not stopping on the first error\n\tvar errors []string\n\tif err := y.aBri.Halt(); err != nil {\n\t\terrors = append(errors, err.Error())\n\t}\n\tif err := y.aTemp.Halt(); err != nil {\n\t\terrors = append(errors, err.Error())\n\t}\n\tif err := y.aAIN2.Halt(); err != nil {\n\t\terrors = append(errors, err.Error())\n\t}\n\tif err := y.aPoti.Halt(); err != nil {\n\t\terrors = append(errors, err.Error())\n\t}\n\tif err := y.aOut.Halt(); err != nil {\n\t\terrors = append(errors, err.Error())\n\t}\n\t// must be the last one\n\tif err := y.PCF8591Driver.Halt(); err != nil {\n\t\terrors = append(errors, err.Error())\n\t}\n\tif len(errors) > 0 {\n\t\treturn fmt.Errorf(\"'Halt' the driver %s\", strings.Join(errors, \", \"))\n\t}\n\treturn nil\n}\n\n// Read returns the current reading from the given pin of the driver\n// For the analog output pin the last written value is returned\nfunc (y *YL40Driver) Read(pin YL40Pin) (float64, error) {\n\tswitch pin {\n\tcase YL40Bri:\n\t\treturn y.aBri.Read()\n\tcase YL40Temp:\n\t\treturn y.aTemp.Read()\n\tcase YL40AIN2:\n\t\treturn y.aAIN2.Read()\n\tcase YL40Poti:\n\t\treturn y.aPoti.Read()\n\tcase YL40AOUT:\n\t\treturn y.aOut.Value(), nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"analog reading from pin '%s' not supported\", pin)\n\t}\n}\n\n// ReadBrightness returns the current reading from brightness pin of the driver\nfunc (y *YL40Driver) ReadBrightness() (float64, error) {\n\treturn y.Read(YL40Bri)\n}\n\n// ReadTemperature returns the current reading from temperature pin of the driver\nfunc (y *YL40Driver) ReadTemperature() (float64, error) {\n\treturn y.Read(YL40Temp)\n}\n\n// ReadAIN2 returns the current reading from analog input pin 2 pin of the driver\nfunc (y *YL40Driver) ReadAIN2() (float64, error) {\n\treturn y.Read(YL40AIN2)\n}\n\n// ReadPotentiometer returns the current reading from potentiometer pin of the driver\nfunc (y *YL40Driver) ReadPotentiometer() (float64, error) {\n\treturn y.Read(YL40Poti)\n}\n\n// Value returns the last read or written value from the given pin of the driver\nfunc (y *YL40Driver) Value(pin YL40Pin) (float64, error) {\n\tswitch pin {\n\tcase YL40Bri:\n\t\treturn y.aBri.Value(), nil\n\tcase YL40Temp:\n\t\treturn y.aTemp.Value(), nil\n\tcase YL40AIN2:\n\t\treturn y.aAIN2.Value(), nil\n\tcase YL40Poti:\n\t\treturn y.aPoti.Value(), nil\n\tcase YL40AOUT:\n\t\treturn y.aOut.Value(), nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"get analog value from pin '%s' not supported\", pin)\n\t}\n}\n\n// Brightness returns the last read brightness of the driver\nfunc (y *YL40Driver) Brightness() (float64, error) {\n\treturn y.Value(YL40Bri)\n}\n\n// Temperature returns the last read temperature of the driver\nfunc (y *YL40Driver) Temperature() (float64, error) {\n\treturn y.Value(YL40Temp)\n}\n\n// AIN2 returns the last read analog input value of the driver\nfunc (y *YL40Driver) AIN2() (float64, error) {\n\treturn y.Value(YL40AIN2)\n}\n\n// Potentiometer returns the last read potentiometer value of the driver\nfunc (y *YL40Driver) Potentiometer() (float64, error) {\n\treturn y.Value(YL40Poti)\n}\n\n// AOUT returns the last written value of the driver\nfunc (y *YL40Driver) AOUT() (float64, error) {\n\treturn y.Value(YL40AOUT)\n}\n\n// Write writes the given value to the analog output\nfunc (y *YL40Driver) Write(val float64) error {\n\treturn y.aOut.Write(val)\n}\n"
  },
  {
    "path": "drivers/i2c/yl40_driver_test.go",
    "content": "package i2c\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc initTestYL40DriverWithStubbedAdaptor() (*YL40Driver, *i2cTestAdaptor) {\n\tadaptor := newI2cTestAdaptor()\n\tyl := NewYL40Driver(adaptor, WithPCF8591With400kbitStabilization(0, 2))\n\tWithPCF8591ForceRefresh(1)(yl.PCF8591Driver)\n\t_ = yl.Start()\n\treturn yl, adaptor\n}\n\nfunc TestNewYL40Driver(t *testing.T) {\n\t// arrange, act\n\tyl := NewYL40Driver(newI2cTestAdaptor())\n\t// assert\n\tassert.NotNil(t, yl.PCF8591Driver)\n\tassert.Equal(t, time.Duration(0), yl.conf.sensors[YL40Bri].interval)\n\tassert.NotNil(t, yl.conf.sensors[YL40Bri].scaler)\n\tassert.Equal(t, time.Duration(0), yl.conf.sensors[YL40Temp].interval)\n\tassert.NotNil(t, yl.conf.sensors[YL40Temp].scaler)\n\tassert.Equal(t, time.Duration(0), yl.conf.sensors[YL40AIN2].interval)\n\tassert.NotNil(t, yl.conf.sensors[YL40AIN2].scaler)\n\tassert.Equal(t, time.Duration(0), yl.conf.sensors[YL40Poti].interval)\n\tassert.NotNil(t, yl.conf.sensors[YL40Poti].scaler)\n\tassert.NotNil(t, yl.conf.aOutScaler)\n\tassert.NotNil(t, yl.aBri)\n\tassert.NotNil(t, yl.aTemp)\n\tassert.NotNil(t, yl.aAIN2)\n\tassert.NotNil(t, yl.aPoti)\n\tassert.NotNil(t, yl.aOut)\n}\n\nfunc TestYL40DriverWithYL40Interval(t *testing.T) {\n\t// arrange, act\n\tyl := NewYL40Driver(newI2cTestAdaptor(),\n\t\tWithYL40Interval(YL40Bri, 100),\n\t\tWithYL40Interval(YL40Temp, 101),\n\t\tWithYL40Interval(YL40AIN2, 102),\n\t\tWithYL40Interval(YL40Poti, 103),\n\t)\n\t// assert\n\tassert.Equal(t, time.Duration(100), yl.conf.sensors[YL40Bri].interval)\n\tassert.Equal(t, time.Duration(101), yl.conf.sensors[YL40Temp].interval)\n\tassert.Equal(t, time.Duration(102), yl.conf.sensors[YL40AIN2].interval)\n\tassert.Equal(t, time.Duration(103), yl.conf.sensors[YL40Poti].interval)\n}\n\nfunc TestYL40DriverWithYL40InputScaler(t *testing.T) {\n\t// arrange\n\tyl := NewYL40Driver(newI2cTestAdaptor())\n\tf1 := func(input int) float64 { return 0.1 }\n\tf2 := func(input int) float64 { return 0.2 }\n\tf3 := func(input int) float64 { return 0.3 }\n\tf4 := func(input int) float64 { return 0.4 }\n\t// act\n\tWithYL40InputScaler(YL40Bri, f1)(yl)\n\tWithYL40InputScaler(YL40Temp, f2)(yl)\n\tWithYL40InputScaler(YL40AIN2, f3)(yl)\n\tWithYL40InputScaler(YL40Poti, f4)(yl)\n\t// assert\n\tassert.True(t, fEqual(yl.conf.sensors[YL40Bri].scaler, f1))\n\tassert.True(t, fEqual(yl.conf.sensors[YL40Temp].scaler, f2))\n\tassert.True(t, fEqual(yl.conf.sensors[YL40AIN2].scaler, f3))\n\tassert.True(t, fEqual(yl.conf.sensors[YL40Poti].scaler, f4))\n}\n\nfunc TestYL40DriverWithYL40WithYL40OutputScaler(t *testing.T) {\n\t// arrange\n\tyl := NewYL40Driver(newI2cTestAdaptor())\n\tfo := func(input float64) int { return 123 }\n\t// act\n\tWithYL40OutputScaler(fo)(yl)\n\t// assert\n\tassert.True(t, fEqual(yl.conf.aOutScaler, fo))\n}\n\nfunc TestYL40DriverReadBrightness(t *testing.T) {\n\t// sequence to read the input with PCF8591, see there tests\n\t// arrange\n\tyl, adaptor := initTestYL40DriverWithStubbedAdaptor()\n\tadaptor.written = []byte{} // reset writes of Start() and former test\n\t// ANAOUT was switched on by Start()\n\tctrlByteOn := uint8(pcf8591_ANAON) | uint8(pcf8591_ALLSINGLE) | uint8(pcf8591_CHAN0)\n\treturnRead := []uint8{0x01, 0x02, 0x03, 73}\n\t// scaler for brightness is 255..0 => 0..1000\n\twant := float64(255-returnRead[3]) * 1000 / 255\n\t// arrange reads\n\tnumCallsRead := 0\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\tb = returnRead[0:len(b)]\n\t\t}\n\t\tif numCallsRead == 2 {\n\t\t\tb[0] = returnRead[len(returnRead)-1]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := yl.ReadBrightness()\n\tgot2, err2 := yl.Brightness()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, adaptor.written, 1)\n\tassert.Equal(t, ctrlByteOn, adaptor.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.InDelta(t, want, got, 0.0)\n\trequire.NoError(t, err2)\n\tassert.InDelta(t, want, got2, 0.0)\n}\n\nfunc TestYL40DriverReadTemperature(t *testing.T) {\n\t// sequence to read the input with PCF8591, see there tests\n\t// arrange\n\tyl, adaptor := initTestYL40DriverWithStubbedAdaptor()\n\tadaptor.written = []byte{} // reset writes of Start() and former test\n\t// ANAOUT was switched on by Start()\n\tctrlByteOn := uint8(pcf8591_ANAON) | uint8(pcf8591_ALLSINGLE) | uint8(pcf8591_CHAN1)\n\treturnRead := []uint8{0x01, 0x02, 0x03, 232}\n\t// scaler for temperature is 255..0 => NTC °C, 232 relates to nearly 25°C\n\t// in TestTemperatureSensorDriverNtcScaling we have already used this NTC values\n\twant := 24.805280460718336\n\t// arrange reads\n\tnumCallsRead := 0\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\tb = returnRead[0:len(b)]\n\t\t}\n\t\tif numCallsRead == 2 {\n\t\t\tb[0] = returnRead[len(returnRead)-1]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := yl.ReadTemperature()\n\tgot2, err2 := yl.Temperature()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, adaptor.written, 1)\n\tassert.Equal(t, ctrlByteOn, adaptor.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.InDelta(t, want, got, 0.0)\n\trequire.NoError(t, err2)\n\tassert.InDelta(t, want, got2, 0.0)\n}\n\nfunc TestYL40DriverReadAIN2(t *testing.T) {\n\t// sequence to read the input with PCF8591, see there tests\n\t// arrange\n\tyl, adaptor := initTestYL40DriverWithStubbedAdaptor()\n\tadaptor.written = []byte{} // reset writes of Start() and former test\n\t// ANAOUT was switched on by Start()\n\tctrlByteOn := uint8(pcf8591_ANAON) | uint8(pcf8591_ALLSINGLE) | uint8(pcf8591_CHAN2)\n\treturnRead := []uint8{0x01, 0x02, 0x03, 72}\n\t// scaler for analog input 2 is 0..255 => 0..3.3\n\twant := float64(returnRead[3]) * 33 / 2550\n\t// arrange reads\n\tnumCallsRead := 0\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\tb = returnRead[0:len(b)]\n\t\t}\n\t\tif numCallsRead == 2 {\n\t\t\tb[0] = returnRead[len(returnRead)-1]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := yl.ReadAIN2()\n\tgot2, err2 := yl.AIN2()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, adaptor.written, 1)\n\tassert.Equal(t, ctrlByteOn, adaptor.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.InDelta(t, want, got, 0.0)\n\trequire.NoError(t, err2)\n\tassert.InDelta(t, want, got2, 0.0)\n}\n\nfunc TestYL40DriverReadPotentiometer(t *testing.T) {\n\t// sequence to read the input with PCF8591, see there tests\n\t// arrange\n\tyl, adaptor := initTestYL40DriverWithStubbedAdaptor()\n\tadaptor.written = []byte{} // reset writes of Start() and former test\n\t// ANAOUT was switched on by Start()\n\tctrlByteOn := uint8(pcf8591_ANAON) | uint8(pcf8591_ALLSINGLE) | uint8(pcf8591_CHAN3)\n\treturnRead := []uint8{0x01, 0x02, 0x03, 63}\n\t// scaler for potentiometer is 255..0 => -100..100\n\twant := float64(returnRead[3])*-200/255 + 100\n\t// arrange reads\n\tnumCallsRead := 0\n\tadaptor.i2cReadImpl = func(b []byte) (int, error) {\n\t\tnumCallsRead++\n\t\tif numCallsRead == 1 {\n\t\t\tb = returnRead[0:len(b)]\n\t\t}\n\t\tif numCallsRead == 2 {\n\t\t\tb[0] = returnRead[len(returnRead)-1]\n\t\t}\n\t\treturn len(b), nil\n\t}\n\t// act\n\tgot, err := yl.ReadPotentiometer()\n\tgot2, err2 := yl.Potentiometer()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, adaptor.written, 1)\n\tassert.Equal(t, ctrlByteOn, adaptor.written[0])\n\tassert.Equal(t, 2, numCallsRead)\n\tassert.InDelta(t, want, got, 0.0)\n\trequire.NoError(t, err2)\n\tassert.InDelta(t, want, got2, 0.0)\n}\n\nfunc TestYL40DriverAnalogWrite(t *testing.T) {\n\t// sequence to write the output of PCF8591, see there\n\t// arrange\n\tpcf, adaptor := initTestYL40DriverWithStubbedAdaptor()\n\tadaptor.written = []byte{} // reset writes of Start() and former test\n\tctrlByteOn := uint8(pcf8591_ANAON)\n\twant := uint8(175)\n\t// write is scaled by 0..3.3V => 0..255\n\twrite := float64(want) * 33 / 2550\n\t// arrange writes\n\tadaptor.i2cWriteImpl = func(b []byte) (int, error) {\n\t\treturn len(b), nil\n\t}\n\t// act\n\terr := pcf.Write(write)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, adaptor.written, 2)\n\tassert.Equal(t, ctrlByteOn, adaptor.written[0])\n\tassert.Equal(t, want, adaptor.written[1])\n}\n\nfunc TestYL40DriverStart(t *testing.T) {\n\tyl := NewYL40Driver(newI2cTestAdaptor())\n\trequire.NoError(t, yl.Start())\n}\n\nfunc TestYL40DriverHalt(t *testing.T) {\n\tyl := NewYL40Driver(newI2cTestAdaptor())\n\trequire.NoError(t, yl.Halt()) // must be idempotent\n\trequire.NoError(t, yl.Start())\n\trequire.NoError(t, yl.Halt())\n}\n\nfunc fEqual(want interface{}, got interface{}) bool {\n\treturn fmt.Sprintf(\"%v\", want) == fmt.Sprintf(\"%v\", got)\n}\n"
  },
  {
    "path": "drivers/onewire/README.md",
    "content": "# 1-wire\n\nThis package provides drivers for [1-wire](https://en.wikipedia.org/wiki/1-Wire) devices supported by Linux Kernel w1-gpio\ndrivers. It must be used along with an adaptor such as [Tinker Board](https://gobot.io/documentation/platforms/asus/tinkerboard/)\nthat supports the needed interfaces for 1-wire devices.\n\n## Getting Started\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices. The following 1-wire devices are currently supported:\n\n- DS18B20 Temperature Sensor\n"
  },
  {
    "path": "drivers/onewire/ds18b20_driver.go",
    "content": "package onewire\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"time\"\n)\n\nconst (\n\tds18b20DefaultResolution     = 12\n\tds18b20DefaultConversionTime = 750\n\n\ttemperatureCommand = \"temperature\"\n\textPowerCommand    = \"ext_power\"\n\tresolutionCommand  = \"resolution\"\n\tconvTimeCommand    = \"conv_time\"\n)\n\n// ds18b20OptionApplier needs to be implemented by each configurable option type\ntype ds18b20OptionApplier interface {\n\tapply(cfg *ds18b20Configuration)\n}\n\n// ds18b20Configuration contains all changeable attributes of the driver.\ntype ds18b20Configuration struct {\n\tscaleUnit      func(int) float32\n\tresolution     uint8\n\tconversionTime uint16\n}\n\n// ds18b20UnitscalerOption is the type for applying another unit scaler to the configuration\ntype ds18b20UnitscalerOption struct {\n\tunitscaler func(int) float32\n}\n\ntype ds18b20ResolutionOption uint8\n\ntype ds18b20ConversionTimeOption uint16\n\n// DS18B20Driver is a driver for the DS18B20 1-wire temperature sensor.\ntype DS18B20Driver struct {\n\t*driver\n\n\tds18b20Cfg *ds18b20Configuration\n}\n\n// NewDS18B20Driver creates a new Gobot Driver for DS18B20 one wire temperature sensor.\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver.\n//\tserial number int - the serial number of the device, without the family code\n//\n// Optional params:\n//\n// onewire.WithFahrenheit()\n// onewire.WithResolution(byte)\n// onewire.WithConversionTime(uint16)\nfunc NewDS18B20Driver(a connector, serialNumber uint64, opts ...interface{}) *DS18B20Driver {\n\td := &DS18B20Driver{\n\t\tdriver: newDriver(a, \"DS18B20\", 0x28, serialNumber),\n\t\tds18b20Cfg: &ds18b20Configuration{\n\t\t\tscaleUnit:      func(input int) float32 { return float32(input) / 1000 }, // 1000:1 in °C\n\t\t\tresolution:     ds18b20DefaultResolution,\n\t\t\tconversionTime: ds18b20DefaultConversionTime,\n\t\t},\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tcase ds18b20OptionApplier:\n\t\t\to.apply(d.ds18b20Cfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\treturn d\n}\n\n// WithFahrenheit substitute the default °C scaler by a scaler for °F\nfunc WithFahrenheit() ds18b20OptionApplier {\n\t// (1°C × 9/5) + 32 = 33,8°F\n\tunitscaler := func(input int) float32 { return float32(input)/1000*9.0/5.0 + 32.0 }\n\treturn ds18b20UnitscalerOption{unitscaler: unitscaler}\n}\n\n// WithResolution substitute the default 12 bit resolution by the given one (9, 10, 11). The device will adjust\n// the conversion time automatically. Each smaller resolution will decrease the conversion time by a factor of 2.\n// Note: some devices are fixed in 12 bit mode only and do not support this feature (I/O error or just ignore it).\n// WithConversionTime() is most likely supported.\nfunc WithResolution(resolution uint8) ds18b20OptionApplier {\n\treturn ds18b20ResolutionOption(resolution)\n}\n\n// WithConversionTime substitute the default 750 ms by the given one (93, 187, 375, 750).\n// Note: Devices will not adjust the resolution automatically. Some devices accept conversion time values different\n// from common specification. E.g. 10...1000, which leads to real conversion time of conversionTime+50ms. This needs\n// to be tested for your device and measured for your needs, e.g. by DebugConversionTime(0, 500, 5, true).\nfunc WithConversionTime(conversionTime uint16) ds18b20OptionApplier {\n\treturn ds18b20ConversionTimeOption(conversionTime)\n}\n\n// Temperature returns the current temperature, in celsius degrees, if the default unit scaler is used.\nfunc (d *DS18B20Driver) Temperature() (float32, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tval, err := d.readInteger(temperatureCommand)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn d.ds18b20Cfg.scaleUnit(val), nil\n}\n\n// Resolution returns the current resolution in bits (9, 10, 11, 12)\nfunc (d *DS18B20Driver) Resolution() (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tval, err := d.readInteger(resolutionCommand)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif val < 9 || val > 12 {\n\t\treturn 0, fmt.Errorf(\"the read value '%d' is out of range (9, 10, 11, 12)\", val)\n\t}\n\n\treturn uint8(val), nil\n}\n\n// IsExternalPowered returns whether the device is external or parasitic powered\nfunc (d *DS18B20Driver) IsExternalPowered() (bool, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tval, err := d.readInteger(extPowerCommand)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn val > 0, nil\n}\n\n// ConversionTime returns the conversion time in ms\nfunc (d *DS18B20Driver) ConversionTime() (uint16, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tval, err := d.readInteger(convTimeCommand)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif val < 0 || val > math.MaxUint16 {\n\t\treturn 0, fmt.Errorf(\"the read value '%d' is out of range (uint16)\", val)\n\t}\n\n\treturn uint16(val), nil\n}\n\n// DebugConversionTime try to set the conversion time and compare with real time to read temperature.\nfunc (d *DS18B20Driver) DebugConversionTime(start, end uint16, stepwide uint16, skipInvalid bool) {\n\tr, _ := d.Resolution()\n\tid, err := d.id()\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\treturn\n\t}\n\tfmt.Printf(\"\\n---- Conversion time check for '%s'@%dbit %d..%d +%d ----\\n\",\n\t\tid, r, start, end, stepwide)\n\tfmt.Println(\"|r1(err)\\t|w(err)\\t\\t|r2(err)\\t|T(err)\\t\\t|real\\t\\t|diff\\t\\t|\")\n\tfmt.Println(\"--------------------------------------------------------------------------------\")\n\tfor ct := start; ct < end; ct += stepwide {\n\t\tr1, e1 := d.ConversionTime()\n\t\tew := d.writeInteger(convTimeCommand, int(ct))\n\t\tr2, e2 := d.ConversionTime()\n\t\ttime.Sleep(100 * time.Millisecond) // relax the system\n\t\tstart := time.Now()\n\t\ttemp, err := d.Temperature()\n\t\tdur := time.Since(start)\n\t\tvalid := ct == r2\n\t\tif valid || !skipInvalid {\n\t\t\tdiff := dur - time.Duration(r2)*time.Millisecond\n\t\t\tfmt.Printf(\"|%d(%t)\\t|%d(%t)\\t|%d(%t)\\t|%v(%t)\\t|%s\\t|%s\\t|\\n\",\n\t\t\t\tr1, e1 != nil, ct, ew != nil, r2, e2 != nil, temp, err != nil, dur, diff)\n\t\t}\n\t}\n}\n\nfunc (d *DS18B20Driver) initialize() error {\n\tif d.ds18b20Cfg.resolution != ds18b20DefaultResolution {\n\t\tif err := d.writeInteger(resolutionCommand, int(d.ds18b20Cfg.resolution)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif d.ds18b20Cfg.conversionTime != ds18b20DefaultConversionTime {\n\t\treturn d.writeInteger(convTimeCommand, int(d.ds18b20Cfg.conversionTime))\n\t}\n\n\treturn nil\n}\n\nfunc (d *DS18B20Driver) shutdown() error {\n\tif d.connection == nil {\n\t\treturn nil\n\t}\n\n\tif d.ds18b20Cfg.resolution != ds18b20DefaultResolution {\n\t\tif err := d.writeInteger(resolutionCommand, ds18b20DefaultResolution); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif d.ds18b20Cfg.conversionTime != ds18b20DefaultConversionTime {\n\t\treturn d.writeInteger(convTimeCommand, int(ds18b20DefaultConversionTime))\n\t}\n\n\treturn nil\n}\n\nfunc (o ds18b20UnitscalerOption) apply(cfg *ds18b20Configuration) {\n\tcfg.scaleUnit = o.unitscaler\n}\n\nfunc (o ds18b20ResolutionOption) apply(cfg *ds18b20Configuration) {\n\tcfg.resolution = uint8(o)\n}\n\nfunc (o ds18b20ConversionTimeOption) apply(cfg *ds18b20Configuration) {\n\tcfg.conversionTime = uint16(o)\n}\n"
  },
  {
    "path": "drivers/onewire/ds18b20_driver_test.go",
    "content": "package onewire\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestNewDS18B20Driver(t *testing.T) {\n\t// arrange & act\n\ta := newOneWireTestAdaptor()\n\td := NewDS18B20Driver(a, 2345)\n\t// assert\n\tassert.IsType(t, &DS18B20Driver{}, d)\n\tassert.NotNil(t, d.driver)\n\tassert.NotNil(t, d.ds18b20Cfg)\n\tassert.Equal(t, uint8(12), d.ds18b20Cfg.resolution)\n\tassert.Equal(t, uint16(750), d.ds18b20Cfg.conversionTime)\n\tassert.InDelta(t, float32(1), d.ds18b20Cfg.scaleUnit(1000), 0.0)\n}\n\nfunc TestDS18B20Start(t *testing.T) {\n\ttests := map[string]struct {\n\t\tcfgResolution uint8\n\t\tcfgConvTime   uint16\n\t\tsimulateErr   bool\n\t\twantCommands  []string\n\t\twantErr       string\n\t}{\n\t\t\"start_ok\": {\n\t\t\tcfgResolution: 12,\n\t\t\tcfgConvTime:   750,\n\t\t},\n\t\t\"start_change_resolution\": {\n\t\t\tcfgResolution: 9,\n\t\t\tcfgConvTime:   750,\n\t\t\twantCommands:  []string{\"resolution\"},\n\t\t},\n\t\t\"start_change_conversiontime\": {\n\t\t\tcfgResolution: 12,\n\t\t\tcfgConvTime:   250,\n\t\t\twantCommands:  []string{\"conv_time\"},\n\t\t},\n\t\t\"start_change_all\": {\n\t\t\tcfgResolution: 8,\n\t\t\tcfgConvTime:   150,\n\t\t\twantCommands:  []string{\"resolution\", \"conv_time\"},\n\t\t},\n\t\t\"error_start\": {\n\t\t\tsimulateErr: true,\n\t\t\twantErr:     \"GetOneWireConnection error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newOneWireTestAdaptor()\n\t\t\td := NewDS18B20Driver(a, 987654321)\n\t\t\td.ds18b20Cfg.resolution = tc.cfgResolution\n\t\t\td.ds18b20Cfg.conversionTime = tc.cfgConvTime\n\t\t\ta.retErr = tc.simulateErr\n\t\t\t// act\n\t\t\terr := d.Start()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantCommands, a.sendCommands)\n\t\t})\n\t}\n}\n\nfunc TestDS18B20Halt(t *testing.T) {\n\ttests := map[string]struct {\n\t\tcfgResolution uint8\n\t\tcfgConvTime   uint16\n\t\tsimulateErr   bool\n\t\twantCommands  []string\n\t\twantErr       string\n\t}{\n\t\t\"start_ok\": {\n\t\t\tcfgResolution: 12,\n\t\t\tcfgConvTime:   750,\n\t\t},\n\t\t\"start_change_resolution\": {\n\t\t\tcfgResolution: 9,\n\t\t\tcfgConvTime:   750,\n\t\t\twantCommands:  []string{\"resolution\"},\n\t\t},\n\t\t\"start_change_conversiontime\": {\n\t\t\tcfgResolution: 12,\n\t\t\tcfgConvTime:   250,\n\t\t\twantCommands:  []string{\"conv_time\"},\n\t\t},\n\t\t\"start_change_all\": {\n\t\t\tcfgResolution: 8,\n\t\t\tcfgConvTime:   150,\n\t\t\twantCommands:  []string{\"resolution\", \"conv_time\"},\n\t\t},\n\t\t\"error_halt\": {\n\t\t\tcfgResolution: 8, // to force writing\n\t\t\tsimulateErr:   true,\n\t\t\twantCommands:  []string{\"resolution\"},\n\t\t\twantErr:       \"WriteInteger error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newOneWireTestAdaptor()\n\t\t\td := NewDS18B20Driver(a, 987654321)\n\t\t\trequire.NoError(t, d.Start())\n\t\t\td.ds18b20Cfg.resolution = tc.cfgResolution\n\t\t\td.ds18b20Cfg.conversionTime = tc.cfgConvTime\n\t\t\ta.retErr = tc.simulateErr\n\t\t\t// act\n\t\t\terr := d.Halt()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantCommands, a.sendCommands)\n\t\t})\n\t}\n}\n\nfunc TestDS18B20HaltIdempotent(t *testing.T) {\n\t// arrange\n\td := NewDS18B20Driver(newOneWireTestAdaptor(), 2345)\n\t// to trigger write calls:\n\td.ds18b20Cfg.resolution = ds18b20DefaultResolution + 1\n\td.ds18b20Cfg.conversionTime = ds18b20DefaultConversionTime + 2\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestDS18B20Temperature(t *testing.T) {\n\tconst readValue = 24500\n\ttests := map[string]struct {\n\t\tsimulateErr bool\n\t\twantVal     float32\n\t\twantErr     string\n\t}{\n\t\t\"read_ok\": {\n\t\t\twantVal: 24.5,\n\t\t},\n\t\t\"error_read\": {\n\t\t\tsimulateErr: true,\n\t\t\twantErr:     \"ReadInteger error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newOneWireTestAdaptor()\n\t\t\ta.lastValue = readValue\n\t\t\td := NewDS18B20Driver(a, 987654321)\n\t\t\trequire.NoError(t, d.Start())\n\t\t\ta.retErr = tc.simulateErr\n\t\t\t// act\n\t\t\tgot, err := d.Temperature()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, []string{\"temperature\"}, a.sendCommands)\n\t\t\tassert.InDelta(t, tc.wantVal, got, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestDS18B20Resolution(t *testing.T) {\n\ttests := map[string]struct {\n\t\treadValue   int\n\t\tsimulateErr bool\n\t\twantVal     float32\n\t\twantErr     string\n\t}{\n\t\t\"read_ok\": {\n\t\t\treadValue: 9,\n\t\t\twantVal:   9,\n\t\t},\n\t\t\"error_below_min\": {\n\t\t\treadValue: 8,\n\t\t\twantErr:   \"the read value '8' is out of range (9, 10, 11, 12)\",\n\t\t},\n\t\t\"error_above_max\": {\n\t\t\treadValue: 13,\n\t\t\twantErr:   \"the read value '13' is out of range (9, 10, 11, 12)\",\n\t\t},\n\t\t\"error_read\": {\n\t\t\tsimulateErr: true,\n\t\t\twantErr:     \"ReadInteger error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newOneWireTestAdaptor()\n\t\t\ta.lastValue = tc.readValue\n\t\t\td := NewDS18B20Driver(a, 987654321)\n\t\t\trequire.NoError(t, d.Start())\n\t\t\ta.retErr = tc.simulateErr\n\t\t\t// act\n\t\t\tgot, err := d.Resolution()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, []string{\"resolution\"}, a.sendCommands)\n\t\t\tassert.InDelta(t, tc.wantVal, got, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestDS18B20IsExternalPowered(t *testing.T) {\n\ttests := map[string]struct {\n\t\treadValue   int\n\t\tsimulateErr bool\n\t\twantVal     bool\n\t\twantErr     string\n\t}{\n\t\t\"read_true\": {\n\t\t\treadValue: 1,\n\t\t\twantVal:   true,\n\t\t},\n\t\t\"read_false\": {\n\t\t\treadValue: 0,\n\t\t\twantVal:   false,\n\t\t},\n\t\t\"error_read\": {\n\t\t\tsimulateErr: true,\n\t\t\twantErr:     \"ReadInteger error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newOneWireTestAdaptor()\n\t\t\ta.lastValue = tc.readValue\n\t\t\td := NewDS18B20Driver(a, 987654321)\n\t\t\trequire.NoError(t, d.Start())\n\t\t\ta.retErr = tc.simulateErr\n\t\t\t// act\n\t\t\tgot, err := d.IsExternalPowered()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, []string{\"ext_power\"}, a.sendCommands)\n\t\t\tassert.Equal(t, tc.wantVal, got)\n\t\t})\n\t}\n}\n\nfunc TestDS18B20ConversionTime(t *testing.T) {\n\ttests := map[string]struct {\n\t\treadValue   int\n\t\tsimulateErr bool\n\t\twantVal     float32\n\t\twantErr     string\n\t}{\n\t\t\"read_ok\": {\n\t\t\treadValue: 20,\n\t\t\twantVal:   20,\n\t\t},\n\t\t\"error_below_min\": {\n\t\t\treadValue: -1,\n\t\t\twantErr:   \"the read value '-1' is out of range (uint16)\",\n\t\t},\n\t\t\"error_above_max\": {\n\t\t\treadValue: 65536,\n\t\t\twantErr:   \"the read value '65536' is out of range (uint16)\",\n\t\t},\n\t\t\"error_read\": {\n\t\t\tsimulateErr: true,\n\t\t\twantErr:     \"ReadInteger error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := newOneWireTestAdaptor()\n\t\t\ta.lastValue = tc.readValue\n\t\t\td := NewDS18B20Driver(a, 987654321)\n\t\t\trequire.NoError(t, d.Start())\n\t\t\ta.retErr = tc.simulateErr\n\t\t\t// act\n\t\t\tgot, err := d.ConversionTime()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, []string{\"conv_time\"}, a.sendCommands)\n\t\t\tassert.InDelta(t, tc.wantVal, got, 0.0)\n\t\t})\n\t}\n}\n\nfunc TestDS18B20WithName(t *testing.T) {\n\t// This is a general test, that parent options are applied by using the WithName() option.\n\t// All other configuration options can also be tested by With..(val).apply(cfg).\n\t// arrange\n\tconst newName = \"new name\"\n\ta := newOneWireTestAdaptor()\n\t// act\n\td := NewDS18B20Driver(a, 2345, WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestDS18B20WithResolution(t *testing.T) {\n\t// This is a general test, that options are applied by using the WithResolution() option.\n\t// All other configuration options can also be tested by With..(val).apply(cfg).\n\t// arrange\n\tconst newValue = uint8(9)\n\ta := newOneWireTestAdaptor()\n\t// act\n\td := NewDS18B20Driver(a, 2345, WithResolution(newValue))\n\t// assert\n\tassert.Equal(t, newValue, d.ds18b20Cfg.resolution)\n}\n\nfunc TestDS18B20WithConversionTime(t *testing.T) {\n\t// arrange\n\tconst newValue = uint16(93)\n\tcfg := ds18b20Configuration{conversionTime: 15}\n\t// act\n\tWithConversionTime(newValue).apply(&cfg)\n\t// assert\n\tassert.Equal(t, newValue, cfg.conversionTime)\n}\n\nfunc TestDS18B20WithFahrenheit(t *testing.T) {\n\t// arrange\n\tcfg := ds18b20Configuration{}\n\t// act\n\tWithFahrenheit().apply(&cfg)\n\t// assert\n\tassert.InDelta(t, 33.8, cfg.scaleUnit(1000), 0.01)\n}\n"
  },
  {
    "path": "drivers/onewire/helpers_test.go",
    "content": "package onewire\n\nimport (\n\t\"errors\"\n\t\"sync\"\n)\n\ntype oneWireAdaptorMock struct {\n\tmtx          sync.Mutex\n\tfamilyCode   byte\n\tserialNumber uint64\n\tsendCommands []string\n\tlastValue    int\n\tretErr       bool\n}\n\nfunc newOneWireTestAdaptor() *oneWireAdaptorMock {\n\treturn &oneWireAdaptorMock{}\n}\n\nfunc (am *oneWireAdaptorMock) GetOneWireConnection(familyCode byte, serialNumber uint64) (Connection, error) {\n\tam.mtx.Lock()\n\tdefer am.mtx.Unlock()\n\n\tif am.retErr {\n\t\treturn nil, errors.New(\"GetOneWireConnection error\")\n\t}\n\tam.familyCode = familyCode\n\tam.serialNumber = serialNumber\n\n\treturn am, nil\n}\n\n// implementations of gobot.OneWireOperations\nfunc (am *oneWireAdaptorMock) ID() string { return \"\" }\n\nfunc (am *oneWireAdaptorMock) ReadData(command string, data []byte) error {\n\tam.sendCommands = append(am.sendCommands, command)\n\n\treturn nil\n}\n\nfunc (am *oneWireAdaptorMock) WriteData(command string, data []byte) error {\n\tam.sendCommands = append(am.sendCommands, command)\n\n\treturn nil\n}\n\nfunc (am *oneWireAdaptorMock) ReadInteger(command string) (int, error) {\n\tam.sendCommands = append(am.sendCommands, command)\n\tif am.retErr {\n\t\treturn 0, errors.New(\"ReadInteger error\")\n\t}\n\n\treturn am.lastValue, nil\n}\n\nfunc (am *oneWireAdaptorMock) WriteInteger(command string, val int) error {\n\tam.sendCommands = append(am.sendCommands, command)\n\tif am.retErr {\n\t\treturn errors.New(\"WriteInteger error\")\n\t}\n\n\treturn nil\n}\n\nfunc (am *oneWireAdaptorMock) Close() error { return nil }\n\n// implementations of gobot.Connection, respectively gobot.Adaptor\nfunc (am *oneWireAdaptorMock) Name() string        { return \"\" }\nfunc (am *oneWireAdaptorMock) SetName(name string) {}\nfunc (am *oneWireAdaptorMock) Connect() error      { return nil }\nfunc (am *oneWireAdaptorMock) Finalize() error     { return nil }\n\ntype oneWireSystemDeviceMock struct {\n\tid          string\n\tlastValue   int\n\tlastData    []byte\n\tretErr      error\n\tlastCommand string\n}\n\n//nolint:unparam // ok here\nfunc newOneWireTestSystemDevice(id string) *oneWireSystemDeviceMock {\n\treturn &oneWireSystemDeviceMock{id: id}\n}\n\nfunc (dm *oneWireSystemDeviceMock) ID() string { return dm.id }\n\nfunc (dm *oneWireSystemDeviceMock) ReadData(command string, data []byte) error {\n\tdm.lastCommand = command\n\tcopy(data, dm.lastData)\n\n\treturn dm.retErr\n}\n\nfunc (dm *oneWireSystemDeviceMock) WriteData(command string, data []byte) error {\n\tdm.lastCommand = command\n\tdm.lastData = make([]byte, len(data))\n\tcopy(dm.lastData, data)\n\n\treturn dm.retErr\n}\n\nfunc (dm *oneWireSystemDeviceMock) ReadInteger(command string) (int, error) {\n\tdm.lastCommand = command\n\n\treturn dm.lastValue, dm.retErr\n}\n\nfunc (dm *oneWireSystemDeviceMock) WriteInteger(command string, val int) error {\n\tdm.lastCommand = command\n\tdm.lastValue = val\n\n\treturn dm.retErr\n}\n\nfunc (dm *oneWireSystemDeviceMock) Close() error { return dm.retErr }\n"
  },
  {
    "path": "drivers/onewire/onewire_connection.go",
    "content": "package onewire\n\nimport (\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// onewireConnection is the common implementation of the 1-wire bus interface.\ntype onewireConnection struct {\n\tonewireSystem gobot.OneWireSystemDevicer\n\tmutex         *sync.Mutex\n}\n\n// NewConnection uses the given 1-wire system device and provides it as gobot.OneWireOperations.\nfunc NewConnection(onewireSystem gobot.OneWireSystemDevicer) *onewireConnection {\n\treturn &onewireConnection{onewireSystem: onewireSystem, mutex: &sync.Mutex{}}\n}\n\n// ID returns the device id in the form \"family code\"-\"serial number\". Implements gobot.OneWireOperations.\nfunc (d *onewireConnection) ID() string {\n\treturn d.onewireSystem.ID()\n}\n\n// ReadData reads the data according the command, e.g. from the specified file on sysfs bus.\n// Implements gobot.OneWireOperations.\nfunc (c *onewireConnection) ReadData(command string, data []byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.onewireSystem.ReadData(command, data)\n}\n\n// WriteData writes the data according the command, e.g. to the specified file on sysfs bus.\n// Implements gobot.OneWireOperations.\nfunc (c *onewireConnection) WriteData(command string, data []byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.onewireSystem.WriteData(command, data)\n}\n\n// ReadInteger reads the value according the command, e.g. to the specified file on sysfs bus.\n// Implements gobot.OneWireOperations.\nfunc (c *onewireConnection) ReadInteger(command string) (int, error) {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.onewireSystem.ReadInteger(command)\n}\n\n// WriteInteger writes the value according the command, e.g. to the specified file on sysfs bus.\n// Implements gobot.OneWireOperations.\nfunc (c *onewireConnection) WriteInteger(command string, val int) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.onewireSystem.WriteInteger(command, val)\n}\n\n// Close connection to underlying 1-wire device. Implements functions of onewire.Connection respectively\n// gobot.OneWireOperations.\nfunc (c *onewireConnection) Close() error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.onewireSystem.Close()\n}\n"
  },
  {
    "path": "drivers/onewire/onewire_connection_test.go",
    "content": "package onewire\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestNewConnection(t *testing.T) {\n\t// arrange & act\n\tc := NewConnection(newOneWireTestSystemDevice(\"id\"))\n\t// assert\n\tassert.IsType(t, &onewireConnection{}, c)\n\tassert.Equal(t, \"id\", c.ID())\n}\n\nfunc TestClose(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimulateErr bool\n\t\twantErr     string\n\t}{\n\t\t\"close_ok\": {},\n\t\t\"error_close\": {\n\t\t\twantErr: \"close error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tsysCon := newOneWireTestSystemDevice(\"id\")\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\tsysCon.retErr = errors.New(tc.wantErr)\n\t\t\t}\n\t\t\tc := NewConnection(sysCon)\n\t\t\t// act\n\t\t\terr := c.Close()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestReadData(t *testing.T) {\n\tdata := []byte{10, 11, 21, 32}\n\ttests := map[string]struct {\n\t\tdata     []byte\n\t\twantData []byte\n\t\twantErr  string\n\t}{\n\t\t\"read_ok\": {\n\t\t\t// only to test the parameter passing\n\t\t\tdata:     []byte{0, 0, 0},\n\t\t\twantData: []byte{10, 11, 21},\n\t\t},\n\t\t\"error_read\": {\n\t\t\tdata:     []byte{0, 0},\n\t\t\twantData: []byte{10, 11},\n\t\t\twantErr:  \"read error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst command = \"read data command\"\n\t\t\tsysCon := newOneWireTestSystemDevice(\"id\")\n\t\t\tsysCon.lastData = data\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\tsysCon.retErr = errors.New(tc.wantErr)\n\t\t\t}\n\t\t\tc := NewConnection(sysCon)\n\t\t\t// act\n\t\t\terr := c.ReadData(command, tc.data)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, command, sysCon.lastCommand)\n\t\t\tassert.Equal(t, tc.wantData, tc.data)\n\t\t})\n\t}\n}\n\nfunc TestWriteData(t *testing.T) {\n\ttests := map[string]struct {\n\t\tdata    []byte\n\t\twantErr string\n\t}{\n\t\t\"write_ok\": {\n\t\t\tdata: []byte{10, 11, 21},\n\t\t},\n\t\t\"error_write\": {\n\t\t\tdata:    []byte{11, 32},\n\t\t\twantErr: \"read error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst command = \"write data command\"\n\t\t\tsysCon := newOneWireTestSystemDevice(\"id\")\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\tsysCon.retErr = errors.New(tc.wantErr)\n\t\t\t}\n\t\t\tc := NewConnection(sysCon)\n\t\t\t// act\n\t\t\terr := c.WriteData(command, tc.data)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, command, sysCon.lastCommand)\n\t\t\tassert.Equal(t, tc.data, sysCon.lastData)\n\t\t})\n\t}\n}\n\nfunc TestReadInteger(t *testing.T) {\n\ttests := map[string]struct {\n\t\twantValue int\n\t\twantErr   string\n\t}{\n\t\t\"read_ok\": {\n\t\t\twantValue: 12,\n\t\t},\n\t\t\"error_read\": {\n\t\t\twantErr: \"read error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst command = \"read data command\"\n\t\t\tsysCon := newOneWireTestSystemDevice(\"id\")\n\t\t\tsysCon.lastValue = tc.wantValue\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\tsysCon.retErr = errors.New(tc.wantErr)\n\t\t\t}\n\t\t\tc := NewConnection(sysCon)\n\t\t\t// act\n\t\t\tgot, err := c.ReadInteger(command)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, command, sysCon.lastCommand)\n\t\t\tassert.Equal(t, tc.wantValue, got)\n\t\t})\n\t}\n}\n\nfunc TestWriteInteger(t *testing.T) {\n\ttests := map[string]struct {\n\t\tvalue   int\n\t\twantErr string\n\t}{\n\t\t\"write_ok\": {\n\t\t\tvalue: 21,\n\t\t},\n\t\t\"error_write\": {\n\t\t\twantErr: \"read error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst command = \"write data command\"\n\t\t\tsysCon := newOneWireTestSystemDevice(\"id\")\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\tsysCon.retErr = errors.New(tc.wantErr)\n\t\t\t}\n\t\t\tc := NewConnection(sysCon)\n\t\t\t// act\n\t\t\terr := c.WriteInteger(command, tc.value)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, command, sysCon.lastCommand)\n\t\t\tassert.Equal(t, tc.value, sysCon.lastValue)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "drivers/onewire/onewire_driver.go",
    "content": "package onewire\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// connector lets adaptors provide the drivers to get access to the 1-wire devices on platforms.\ntype connector interface {\n\t// GetOneWireConnection returns a connection to a 1-wire device with family code and serial number.\n\tGetOneWireConnection(familyCode byte, serialNumber uint64) (Connection, error)\n}\n\n// Connection is a connection to a 1-wire device with family code and serial number on a specific bus, provided by\n// an adaptor, usually just by calling the onewire package's GetOneWireConnection() function.\ntype Connection gobot.OneWireOperations\n\n// optionApplier needs to be implemented by each configurable option type\ntype optionApplier interface {\n\tapply(cfg *configuration)\n}\n\n// configuration contains all changeable attributes of the driver.\ntype configuration struct {\n\tname         string\n\tfamilyCode   byte\n\tserialNumber uint64\n}\n\n// nameOption is the type for applying another name to the configuration\ntype nameOption string\n\n// Driver implements the interface gobot.Driver.\ntype driver struct {\n\tgobot.Commander\n\n\tdriverCfg  *configuration\n\tconnector  connector\n\tconnection Connection\n\tafterStart func() error\n\tbeforeHalt func() error\n\tmutex      *sync.Mutex // mutex often needed to ensure that write-read sequences are not interrupted\n}\n\n// newDriver creates a new generic and basic 1-wire gobot driver.\n//\n// Supported options:\n//\n//\t\"WithName\"\nfunc newDriver(a connector, name string, familyCode byte, serialNumber uint64, opts ...interface{}) *driver {\n\td := &driver{\n\t\tdriverCfg:  &configuration{name: gobot.DefaultName(name), familyCode: familyCode, serialNumber: serialNumber},\n\t\tconnector:  a,\n\t\tafterStart: func() error { return nil },\n\t\tbeforeHalt: func() error { return nil },\n\t\tCommander:  gobot.NewCommander(),\n\t\tmutex:      &sync.Mutex{},\n\t}\n\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase optionApplier:\n\t\t\to.apply(d.driverCfg)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on '%s'\", opt, d.driverCfg.name))\n\t\t}\n\t}\n\n\treturn d\n}\n\n// WithName is used to replace the default name of the driver.\nfunc WithName(name string) optionApplier {\n\treturn nameOption(name)\n}\n\n// Name returns the name of the device.\nfunc (d *driver) Name() string {\n\treturn d.driverCfg.name\n}\n\n// SetName sets the name of the device (deprecated, use WithName() instead).\nfunc (d *driver) SetName(name string) {\n\td.driverCfg.name = name\n}\n\n// Connection returns the gobot connection of the device.\nfunc (d *driver) Connection() gobot.Connection {\n\tif d.connection == nil {\n\t\tlog.Printf(\"1-wire driver not started for '%s'\\n\", d.driverCfg.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connection.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.driverCfg.name)\n\treturn nil\n}\n\n// Start initializes the device.\nfunc (d *driver) Start() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif d.connector == nil {\n\t\treturn fmt.Errorf(\"%s has no connector\", d.driverCfg.name)\n\t}\n\n\tvar err error\n\td.connection, err = d.connector.GetOneWireConnection(d.driverCfg.familyCode, d.driverCfg.serialNumber)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn d.afterStart()\n}\n\n// Halt halts the device.\nfunc (d *driver) Halt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.beforeHalt(); err != nil {\n\t\treturn err\n\t}\n\n\t// the connection is also cached on adaptor side and will be closed on adaptor Finalize()\n\td.connection = nil\n\n\treturn nil\n}\n\nfunc (d *driver) id() (string, error) {\n\tif d.connection == nil {\n\t\treturn \"\", fmt.Errorf(\"1-wire driver not started for '%s'\", d.driverCfg.name)\n\t}\n\n\treturn d.connection.ID(), nil\n}\n\n//nolint:unused // ok for now\nfunc (d *driver) readData(command string, data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"1-wire driver not started for '%s'\", d.driverCfg.name)\n\t}\n\treturn d.connection.ReadData(command, data)\n}\n\n//nolint:unused // ok for now\nfunc (d *driver) writeData(command string, data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"1-wire driver not started for '%s'\", d.driverCfg.name)\n\t}\n\treturn d.connection.WriteData(command, data)\n}\n\nfunc (d *driver) readInteger(command string) (int, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"1-wire driver not started for '%s'\", d.driverCfg.name)\n\t}\n\treturn d.connection.ReadInteger(command)\n}\n\nfunc (d *driver) writeInteger(command string, val int) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"1-wire driver not started for '%s'\", d.driverCfg.name)\n\t}\n\treturn d.connection.WriteInteger(command, val)\n}\n\nfunc (o nameOption) String() string {\n\treturn \"name option for 1-wire drivers\"\n}\n\n// apply change the name in the configuration.\nfunc (o nameOption) apply(c *configuration) {\n\tc.name = string(o)\n}\n"
  },
  {
    "path": "drivers/onewire/onewire_driver_test.go",
    "content": "package onewire\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc initTestDriver() *driver {\n\td, _ := initDriverWithStubbedAdaptor()\n\treturn d\n}\n\nfunc initDriverWithStubbedAdaptor() (*driver, *oneWireAdaptorMock) {\n\ta := newOneWireTestAdaptor()\n\treturn newDriver(a, \"name\", 28, 9876), a\n}\n\nfunc Test_newDriver(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tfamilyCode   = 99\n\t\tserialNumber = 1234567890\n\t)\n\t// act\n\td := newDriver(newOneWireTestAdaptor(), \"name\", familyCode, serialNumber)\n\t// assert\n\tassert.IsType(t, &driver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.NotNil(t, d.connector)\n\tassert.NotNil(t, d.afterStart)\n\tassert.NotNil(t, d.beforeHalt)\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n}\n\nfunc TestConnection(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\trequire.NoError(t, d.Start())\n\t// act, assert\n\tassert.NotNil(t, d.Connection())\n}\n\nfunc TestStart(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestStartConnectError(t *testing.T) {\n\t// arrange\n\td, c := initDriverWithStubbedAdaptor()\n\tc.retErr = true\n\t// act, assert\n\trequire.ErrorContains(t, d.Start(), \"GetOneWireConnection error\")\n}\n\nfunc TestHalt(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestWithName(t *testing.T) {\n\t// This is a general test, that options are applied by using the WithName() option.\n\t// All other configuration options can also be tested by With..(val).apply(cfg).\n\t// arrange\n\tconst newName = \"new name\"\n\ta := newOneWireTestAdaptor()\n\t// act\n\td := newDriver(a, \"name\", 28, 9876, WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.driverCfg.name)\n\tassert.Equal(t, newName, d.Name())\n}\n"
  },
  {
    "path": "drivers/serial/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/serial/README.md",
    "content": "# Serial\n\nThis package provides drivers based on [Serial](https://en.wikipedia.org/wiki/Serial_port) communication ([UART](https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter)).\ndevices. It is normally used by connecting an adaptor such as [SerialPort](https://gobot.io/documentation/platforms/serialport/)\nthat supports the needed interfaces for serial devices.\n\n## Getting Started\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices. The following Serial devices are currently supported:\n\n- Sphero: Sphero\n- Neurosky: MindWave\n- MegaPi: MotorDriver\n"
  },
  {
    "path": "drivers/serial/doc.go",
    "content": "/*\nPackage serial provides Gobot drivers for Serial Port communication based devices.\n\nFor further information refer to readme:\nhttps://github.com/hybridgroup/gobot/blob/release/drivers/serial/README.md\n*/\npackage serial // import \"gobot.io/x/gobot/v2/drivers/serial\"\n"
  },
  {
    "path": "drivers/serial/megapi/motor_driver.go",
    "content": "package megapi\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"log\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial\"\n)\n\nvar _ gobot.Driver = (*MotorDriver)(nil)\n\ntype megapiMotorSerialAdaptor interface {\n\tgobot.Adaptor\n\tserial.SerialWriter\n}\n\n// MotorDriver represents a motor\ntype MotorDriver struct {\n\t*serial.Driver\n\n\tport              byte\n\thalted            bool\n\twriteBytesChannel chan []byte\n\tfinalizeChannel   chan struct{}\n\tsyncRoot          *sync.Mutex\n}\n\n// NewMotorDriver creates a new MotorDriver at the given port\nfunc NewMotorDriver(a megapiMotorSerialAdaptor, port byte, opts ...serial.OptionApplier) *MotorDriver {\n\td := &MotorDriver{\n\t\tport:              port,\n\t\thalted:            true,\n\t\tsyncRoot:          &sync.Mutex{},\n\t\twriteBytesChannel: make(chan []byte),\n\t\tfinalizeChannel:   make(chan struct{}),\n\t}\n\td.Driver = serial.NewDriver(a, \"MegaPiMotor\", d.initialize, d.shutdown, opts...)\n\n\treturn d\n}\n\n// Speed sets the motors speed to the specified value\nfunc (d *MotorDriver) Speed(speed int16) error {\n\td.syncRoot.Lock()\n\tdefer d.syncRoot.Unlock()\n\n\tif d.halted {\n\t\treturn nil\n\t}\n\treturn d.speedHelper(speed)\n}\n\n// initialize implements the Driver interface\nfunc (d *MotorDriver) initialize() error {\n\td.syncRoot.Lock()\n\tdefer d.syncRoot.Unlock()\n\n\t// sleeping is required to give the board a chance to reset after connection is done\n\ttime.Sleep(2 * time.Second)\n\n\t// kick off thread to send bytes to the board\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase bytes := <-d.writeBytesChannel:\n\t\t\t\tif _, err := d.adaptor().SerialWrite(bytes); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t\tcase <-d.finalizeChannel:\n\t\t\t\td.finalizeChannel <- struct{}{}\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t\t}\n\t\t}\n\t}()\n\n\td.halted = false\n\treturn d.speedHelper(0)\n}\n\n// Halt terminates the Driver interface\nfunc (d *MotorDriver) shutdown() error {\n\td.syncRoot.Lock()\n\tdefer d.syncRoot.Unlock()\n\n\td.finalizeChannel <- struct{}{}\n\t<-d.finalizeChannel\n\n\td.halted = true\n\treturn d.speedHelper(0)\n}\n\n// there is some sort of bug on the hardware such that you cannot\n// send the exact same speed to 2 different motors consecutively\n// hence we ensure we always alternate speeds\nfunc (d *MotorDriver) speedHelper(speed int16) error {\n\tif err := d.sendSpeed(speed - 1); err != nil {\n\t\treturn err\n\t}\n\treturn d.sendSpeed(speed)\n}\n\n// sendSpeed sets the motors speed to the specified value\nfunc (d *MotorDriver) sendSpeed(speed int16) error {\n\tbufOut := new(bytes.Buffer)\n\n\t// byte sequence: 0xff, 0x55, id, action, device, port\n\tbufOut.Write([]byte{0xff, 0x55, 0x6, 0x0, 0x2, 0xa, d.port})\n\tif err := binary.Write(bufOut, binary.LittleEndian, speed); err != nil {\n\t\treturn err\n\t}\n\tbufOut.Write([]byte{0xa})\n\td.writeBytesChannel <- bufOut.Bytes()\n\n\treturn nil\n}\n\nfunc (d *MotorDriver) adaptor() megapiMotorSerialAdaptor {\n\tif a, ok := d.Connection().(megapiMotorSerialAdaptor); ok {\n\t\treturn a\n\t}\n\n\tlog.Printf(\"%s has no MegaPi serial connector\\n\", d.Name())\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/serial/neurosky/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/serial/neurosky/mindwave_driver.go",
    "content": "package neurosky\n\nimport (\n\t\"bytes\"\n\t\"log\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial\"\n)\n\ntype mindWaveSerialAdaptor interface {\n\tgobot.Adaptor\n\tserial.SerialReader\n}\n\nconst (\n\t// mindWaveBTSync is the sync code\n\tmindWaveBTSync byte = 0xAA\n\t// mindWaveCodeEx Extended code\n\tmindWaveCodeEx byte = 0x55\n\t// mindWaveCodeSignalQuality POOR_SIGNAL quality 0-255\n\tmindWaveCodeSignalQuality byte = 0x02\n\t// mindWaveCodeAttention ATTENTION eSense 0-100\n\tmindWaveCodeAttention byte = 0x04\n\t// mindWaveCodeMeditation MEDITATION eSense 0-100\n\tmindWaveCodeMeditation byte = 0x05\n\t// mindWaveCodeBlink BLINK strength 0-255\n\tmindWaveCodeBlink byte = 0x16\n\t// mindWaveCodeWave RAW wave value: 2-byte big-endian 2s-complement\n\tmindWaveCodeWave byte = 0x80\n\t// mindWaveCodeAsicEEG ASIC EEG POWER 8 3-byte big-endian integers\n\tmindWaveCodeAsicEEG byte = 0x83\n\n\tExtendedEvent   = \"extended\"\n\tSignalEvent     = \"signal\"\n\tAttentionEvent  = \"attention\"\n\tMeditationEvent = \"meditation\"\n\tBlinkEvent      = \"blink\"\n\tWaveEvent       = \"wave\"\n\tEEGEvent        = \"eeg\"\n\tErrorEvent      = \"error\"\n)\n\n// MindWaveDriver is the Gobot driver for the Neurosky MindWave Sensor\ntype MindWaveDriver struct {\n\t*serial.Driver\n\tgobot.Eventer\n}\n\n// MindWaveEEGData is the EEG raw data returned from the sensor\ntype MindWaveEEGData struct {\n\tDelta    int\n\tTheta    int\n\tLoAlpha  int\n\tHiAlpha  int\n\tLoBeta   int\n\tHiBeta   int\n\tLoGamma  int\n\tMidGamma int\n}\n\n// NewMindWaveDriver creates a driver for Neurosky MindWave\n// and adds the following events:\n//\n//\textended - user's current extended level\n//\tsignal - shows signal strength\n//\tattention - user's current attention level\n//\tmeditation - user's current meditation level\n//\tblink - user's current blink level\n//\twave - shows wave data\n//\teeg - showing eeg data\nfunc NewMindWaveDriver(a mindWaveSerialAdaptor, opts ...serial.OptionApplier) *MindWaveDriver {\n\td := &MindWaveDriver{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\td.Driver = serial.NewDriver(a, \"MindWave\", d.initialize, nil, opts...)\n\n\td.AddEvent(ExtendedEvent)\n\td.AddEvent(SignalEvent)\n\td.AddEvent(AttentionEvent)\n\td.AddEvent(MeditationEvent)\n\td.AddEvent(BlinkEvent)\n\td.AddEvent(WaveEvent)\n\td.AddEvent(EEGEvent)\n\td.AddEvent(ErrorEvent)\n\n\treturn d\n}\n\n// initialize creates a go routine to listen from serial port and parse buffer readings\n// TODO: stop the go routine gracefully on Halt()\nfunc (d *MindWaveDriver) initialize() error {\n\tgo func() {\n\t\tfor {\n\t\t\tbuff := make([]byte, 1024)\n\t\t\t_, err := d.adaptor().SerialRead(buff)\n\t\t\tif err != nil {\n\t\t\t\td.Publish(d.Event(\"error\"), err)\n\t\t\t} else {\n\t\t\t\tif err := d.parse(bytes.NewBuffer(buff)); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\treturn nil\n}\n\n// parse converts bytes buffer into packets until no more data is present\nfunc (d *MindWaveDriver) parse(buf *bytes.Buffer) error {\n\tfor buf.Len() > 2 {\n\t\tb1, _ := buf.ReadByte()\n\t\tb2, _ := buf.ReadByte()\n\t\tif b1 == mindWaveBTSync && b2 == mindWaveBTSync {\n\t\t\tlength, _ := buf.ReadByte()\n\t\t\tpayload := make([]byte, length)\n\t\t\tif _, err := buf.Read(payload); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// checksum, _ := buf.ReadByte()\n\t\t\tbuf.Next(1)\n\t\t\tif err := d.parsePacket(bytes.NewBuffer(payload)); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// parsePacket publishes event according to data parsed\nfunc (d *MindWaveDriver) parsePacket(buf *bytes.Buffer) error {\n\tfor buf.Len() > 0 {\n\t\tb, _ := buf.ReadByte()\n\t\tswitch b {\n\t\tcase mindWaveCodeEx:\n\t\t\td.Publish(d.Event(ExtendedEvent), nil)\n\t\tcase mindWaveCodeSignalQuality:\n\t\t\tret, _ := buf.ReadByte()\n\t\t\td.Publish(d.Event(SignalEvent), ret)\n\t\tcase mindWaveCodeAttention:\n\t\t\tret, _ := buf.ReadByte()\n\t\t\td.Publish(d.Event(AttentionEvent), ret)\n\t\tcase mindWaveCodeMeditation:\n\t\t\tret, _ := buf.ReadByte()\n\t\t\td.Publish(d.Event(MeditationEvent), ret)\n\t\tcase mindWaveCodeBlink:\n\t\t\tret, _ := buf.ReadByte()\n\t\t\td.Publish(d.Event(BlinkEvent), ret)\n\t\tcase mindWaveCodeWave:\n\t\t\tbuf.Next(1)\n\t\t\tret := make([]byte, 2)\n\t\t\tif _, err := buf.Read(ret); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\td.Publish(d.Event(WaveEvent), int16(ret[0])<<8|int16(ret[1]))\n\t\tcase mindWaveCodeAsicEEG:\n\t\t\tret := make([]byte, 25)\n\t\t\ti, _ := buf.Read(ret)\n\t\t\tif i == 25 {\n\t\t\t\td.Publish(d.Event(EEGEvent), d.parseEEG(ret))\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// parseEEG returns data converted into EEG map\nfunc (d *MindWaveDriver) parseEEG(data []byte) MindWaveEEGData {\n\treturn MindWaveEEGData{\n\t\tDelta:    d.parse3ByteInteger(data[0:3]),\n\t\tTheta:    d.parse3ByteInteger(data[3:6]),\n\t\tLoAlpha:  d.parse3ByteInteger(data[6:9]),\n\t\tHiAlpha:  d.parse3ByteInteger(data[9:12]),\n\t\tLoBeta:   d.parse3ByteInteger(data[12:15]),\n\t\tHiBeta:   d.parse3ByteInteger(data[15:18]),\n\t\tLoGamma:  d.parse3ByteInteger(data[18:21]),\n\t\tMidGamma: d.parse3ByteInteger(data[21:25]),\n\t}\n}\n\nfunc (d *MindWaveDriver) parse3ByteInteger(data []byte) int {\n\treturn ((int(data[0]) << 16) |\n\t\t(((1 << 16) - 1) & (int(data[1]) << 8)) |\n\t\t(((1 << 8) - 1) & int(data[2])))\n}\n\nfunc (d *MindWaveDriver) adaptor() mindWaveSerialAdaptor {\n\tif a, ok := d.Connection().(mindWaveSerialAdaptor); ok {\n\t\treturn a\n\t}\n\n\tlog.Printf(\"%s has no Neurosky serial connector\\n\", d.Name())\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/serial/neurosky/mindwave_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage neurosky\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/testutil\"\n)\n\nvar _ gobot.Driver = (*MindWaveDriver)(nil)\n\nfunc initTestNeuroskyDriver() *MindWaveDriver {\n\ta := testutil.NewSerialTestAdaptor()\n\t_ = a.Connect()\n\treturn NewMindWaveDriver(a)\n}\n\nfunc TestNeuroskyDriver(t *testing.T) {\n\td := initTestNeuroskyDriver()\n\tassert.NotNil(t, d.Connection())\n}\n\nfunc TestNeuroskyDriverName(t *testing.T) {\n\td := initTestNeuroskyDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MindWave\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestNeuroskyDriverStart(t *testing.T) {\n\tsem := make(chan bool)\n\n\ta := testutil.NewSerialTestAdaptor()\n\t_ = a.Connect()\n\ta.SetSimulateReadError(true)\n\n\td := NewMindWaveDriver(a)\n\te := errors.New(\"read error\")\n\t_ = d.Once(d.Event(ErrorEvent), func(data interface{}) {\n\t\tassert.Equal(t, e, data.(error))\n\t\tsem <- true\n\t})\n\n\trequire.NoError(t, d.Start())\n\ttime.Sleep(50 * time.Millisecond)\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\t{\n\t\t\trequire.Fail(t, \"error was not emitted\")\n\t\t}\n\n\t}\n}\n\nfunc TestNeuroskyDriverHalt(t *testing.T) {\n\td := initTestNeuroskyDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestNeuroskyDriverParse(t *testing.T) {\n\tsem := make(chan bool)\n\td := initTestNeuroskyDriver()\n\n\t// mindWaveCodeEx\n\tgo func() {\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\t_ = d.parse(bytes.NewBuffer([]byte{0xAA, 0xAA, 1, 0x55, 0x00}))\n\t}()\n\n\t_ = d.On(d.Event(ExtendedEvent), func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Event \\\"extended\\\" was not published\")\n\t}\n\n\t// mindWaveCodeSignalQuality\n\tgo func() {\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\t_ = d.parse(bytes.NewBuffer([]byte{0xAA, 0xAA, 2, 0x02, 100, 0x00}))\n\t}()\n\n\t_ = d.On(d.Event(SignalEvent), func(data interface{}) {\n\t\tassert.Equal(t, byte(100), data.(byte))\n\t\tsem <- true\n\t})\n\n\t<-sem\n\n\t// mindWaveCodeAttention\n\tgo func() {\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\t_ = d.parse(bytes.NewBuffer([]byte{0xAA, 0xAA, 2, 0x04, 40, 0x00}))\n\t}()\n\n\t_ = d.On(d.Event(AttentionEvent), func(data interface{}) {\n\t\tassert.Equal(t, byte(40), data.(byte))\n\t\tsem <- true\n\t})\n\n\t<-sem\n\n\t// mindWaveCodeMeditation\n\tgo func() {\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\t_ = d.parse(bytes.NewBuffer([]byte{0xAA, 0xAA, 2, 0x05, 60, 0x00}))\n\t}()\n\n\t_ = d.On(d.Event(MeditationEvent), func(data interface{}) {\n\t\tassert.Equal(t, byte(60), data.(byte))\n\t\tsem <- true\n\t})\n\n\t<-sem\n\n\t// mindWaveCodeBlink\n\tgo func() {\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\t_ = d.parse(bytes.NewBuffer([]byte{0xAA, 0xAA, 2, 0x16, 150, 0x00}))\n\t}()\n\n\t_ = d.On(d.Event(BlinkEvent), func(data interface{}) {\n\t\tassert.Equal(t, byte(150), data.(byte))\n\t\tsem <- true\n\t})\n\n\t<-sem\n\n\t// mindWaveCodeWave\n\tgo func() {\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\t_ = d.parse(bytes.NewBuffer([]byte{0xAA, 0xAA, 4, 0x80, 0x00, 0x40, 0x11, 0x00}))\n\t}()\n\n\t_ = d.On(d.Event(WaveEvent), func(data interface{}) {\n\t\tassert.Equal(t, int16(16401), data.(int16))\n\t\tsem <- true\n\t})\n\n\t<-sem\n\n\t// mindWaveCodeAsicEEG\n\tgo func() {\n\t\ttime.Sleep(5 * time.Millisecond)\n\t\t_ = d.parse(bytes.NewBuffer([]byte{\n\t\t\t0xAA, 0xAA, 30, 0x83, 24, 1, 121, 89, 0,\n\t\t\t97, 26, 0, 30, 189, 0, 57, 1, 0, 62, 160, 0, 31, 127, 0, 18, 207, 0, 13,\n\t\t\t108, 0x00,\n\t\t}))\n\t}()\n\n\t_ = d.On(d.Event(EEGEvent), func(data interface{}) {\n\t\tassert.Equal(t,\n\t\t\tMindWaveEEGData{\n\t\t\t\tDelta:    1573241,\n\t\t\t\tTheta:    5832801,\n\t\t\t\tLoAlpha:  1703966,\n\t\t\t\tHiAlpha:  12386361,\n\t\t\t\tLoBeta:   65598,\n\t\t\t\tHiBeta:   10485791,\n\t\t\t\tLoGamma:  8323090,\n\t\t\t\tMidGamma: 13565965,\n\t\t\t},\n\t\t\tdata.(MindWaveEEGData))\n\t\tsem <- true\n\t})\n\t<-sem\n}\n"
  },
  {
    "path": "drivers/serial/serial_driver.go",
    "content": "package serial\n\nimport (\n\t\"log\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype SerialReader interface {\n\tSerialRead(b []byte) (n int, err error)\n}\n\ntype SerialWriter interface {\n\tSerialWrite(b []byte) (n int, err error)\n}\n\n// OptionApplier needs to be implemented by each configurable option type\ntype OptionApplier interface {\n\tapply(cfg *configuration)\n}\n\n// configuration contains all changeable attributes of the driver.\ntype configuration struct {\n\tname string\n}\n\n// nameOption is the type for applying another name to the configuration\ntype nameOption string\n\n// Driver implements the interface gobot.Driver.\ntype Driver struct {\n\tgobot.Commander\n\n\tconnection interface{}\n\tdriverCfg  *configuration\n\tafterStart func() error\n\tbeforeHalt func() error\n\tmutex      *sync.Mutex\n}\n\n// NewDriver creates a new basic serial gobot driver.\nfunc NewDriver(a interface{}, name string,\n\tafterStart func() error, beforeHalt func() error,\n\topts ...OptionApplier,\n) *Driver {\n\tif afterStart == nil {\n\t\tafterStart = func() error { return nil }\n\t}\n\n\tif beforeHalt == nil {\n\t\tbeforeHalt = func() error { return nil }\n\t}\n\td := Driver{\n\t\tCommander:  gobot.NewCommander(),\n\t\tconnection: a,\n\t\tdriverCfg:  &configuration{name: gobot.DefaultName(name)},\n\t\tafterStart: afterStart,\n\t\tbeforeHalt: beforeHalt,\n\t\tmutex:      &sync.Mutex{},\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(d.driverCfg)\n\t}\n\n\treturn &d\n}\n\n// WithName is used to replace the default name of the driver.\nfunc WithName(name string) OptionApplier {\n\treturn nameOption(name)\n}\n\n// Name returns the name of the driver.\nfunc (d *Driver) Name() string {\n\treturn d.driverCfg.name\n}\n\n// SetName sets the name of the driver.\n// Deprecated: Please use option [serial.WithName] instead.\nfunc (d *Driver) SetName(name string) {\n\tWithName(name).apply(d.driverCfg)\n}\n\n// Connection returns the gobot connection of the driver.\nfunc (d *Driver) Connection() gobot.Connection {\n\tif d.connection == nil {\n\t\tlog.Printf(\"%s has no connection\\n\", d.driverCfg.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connection.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.driverCfg.name)\n\treturn nil\n}\n\n// Start initializes the driver.\nfunc (d *Driver) Start() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do here for the driver\n\n\treturn d.afterStart()\n}\n\n// Halt halts the driver.\nfunc (d *Driver) Halt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\t// currently there is nothing to do after halt for the driver\n\n\treturn d.beforeHalt()\n}\n\nfunc (d *Driver) Mutex() *sync.Mutex {\n\treturn d.mutex\n}\n\n// apply change the name in the configuration.\nfunc (o nameOption) apply(c *configuration) {\n\tc.name = string(o)\n}\n"
  },
  {
    "path": "drivers/serial/serial_driver_test.go",
    "content": "package serial\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/testutil\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestDriver() *Driver {\n\ta := testutil.NewSerialTestAdaptor()\n\td := NewDriver(a, \"SERIAL_BASIC\", nil, nil)\n\treturn d\n}\n\nfunc TestNewDriver(t *testing.T) {\n\t// arrange\n\tconst name = \"mybot\"\n\ta := testutil.NewSerialTestAdaptor()\n\t// act\n\td := NewDriver(a, name, nil, nil)\n\t// assert\n\tassert.IsType(t, &Driver{}, d)\n\tassert.NotNil(t, d.driverCfg)\n\tassert.True(t, strings.HasPrefix(d.Name(), name))\n\tassert.Equal(t, a, d.Connection())\n\trequire.NoError(t, d.afterStart())\n\trequire.NoError(t, d.beforeHalt())\n\tassert.NotNil(t, d.Commander)\n\tassert.NotNil(t, d.mutex)\n}\n\nfunc Test_newDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst (\n\t\tname    = \"mybot\"\n\t\tnewName = \"overwrite mybot\"\n\t)\n\ta := testutil.NewSerialTestAdaptor()\n\t// act\n\td := NewDriver(a, name, nil, nil, WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc Test_applyWithName(t *testing.T) {\n\t// arrange\n\tconst name = \"mybot\"\n\tcfg := configuration{name: \"oldname\"}\n\t// act\n\tWithName(name).apply(&cfg)\n\t// assert\n\tassert.Equal(t, name, cfg.name)\n}\n\nfunc TestStart(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Start())\n\t// arrange after start function\n\td.afterStart = func() error { return fmt.Errorf(\"after start error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Start(), \"after start error\")\n}\n\nfunc TestHalt(t *testing.T) {\n\t// arrange\n\td := initTestDriver()\n\t// act, assert\n\trequire.NoError(t, d.Halt())\n\t// arrange after start function\n\td.beforeHalt = func() error { return fmt.Errorf(\"before halt error\") }\n\t// act, assert\n\trequire.EqualError(t, d.Halt(), \"before halt error\")\n}\n"
  },
  {
    "path": "drivers/serial/sphero/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "drivers/serial/sphero/sphero_driver.go",
    "content": "package sphero\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n\t\"gobot.io/x/gobot/v2/drivers/serial\"\n)\n\ntype spheroSerialAdaptor interface {\n\tgobot.Adaptor\n\tserial.SerialReader\n\tserial.SerialWriter\n\n\tIsConnected() bool\n}\n\ntype packet struct {\n\theader   []uint8\n\tbody     []uint8\n\tchecksum uint8\n}\n\n// SpheroDriver Represents a Sphero 2.0\ntype SpheroDriver struct {\n\t*serial.Driver\n\tgobot.Eventer\n\n\tseq              uint8\n\tasyncResponse    [][]uint8\n\tsyncResponse     [][]uint8\n\tpacketChannel    chan *packet\n\tresponseChannel  chan []uint8\n\toriginalColor    []uint8 // Only used for calibration.\n\tshutdownWaitTime time.Duration\n}\n\n// NewSpheroDriver returns a new SpheroDriver given a Sphero Adaptor.\n//\n// Adds the following API Commands:\n//\n//\t\"ConfigureLocator\" - See SpheroDriver.ConfigureLocator\n//\t\"Roll\" - See SpheroDriver.Roll\n//\t\"Stop\" - See SpheroDriver.Stop\n//\t\"GetRGB\" - See SpheroDriver.GetRGB\n//\t\"ReadLocator\" - See SpheroDriver.ReadLocator\n//\t\"SetBackLED\" - See SpheroDriver.SetBackLED\n//\t\"SetHeading\" - See SpheroDriver.SetHeading\n//\t\"SetStabilization\" - See SpheroDriver.SetStabilization\n//\t\"SetDataStreaming\" - See SpheroDriver.SetDataStreaming\n//\t\"SetRotationRate\" - See SpheroDriver.SetRotationRate\nfunc NewSpheroDriver(a spheroSerialAdaptor, opts ...serial.OptionApplier) *SpheroDriver {\n\td := &SpheroDriver{\n\t\tEventer:          gobot.NewEventer(),\n\t\tpacketChannel:    make(chan *packet, 1024),\n\t\tresponseChannel:  make(chan []uint8, 1024),\n\t\tshutdownWaitTime: 1 * time.Second,\n\t}\n\td.Driver = serial.NewDriver(a, \"Sphero\", d.initialize, d.shutdown, opts...)\n\n\td.AddEvent(spherocommon.ErrorEvent)\n\td.AddEvent(spherocommon.CollisionEvent)\n\td.AddEvent(spherocommon.SensorDataEvent)\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetRGB\", func(params map[string]interface{}) interface{} {\n\t\tr := uint8(params[\"r\"].(float64))\n\t\tg := uint8(params[\"g\"].(float64))\n\t\tb := uint8(params[\"b\"].(float64))\n\t\td.SetRGB(r, g, b)\n\t\treturn nil\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Roll\", func(params map[string]interface{}) interface{} {\n\t\tspeed := uint8(params[\"speed\"].(float64))\n\t\theading := uint16(params[\"heading\"].(float64))\n\t\td.Roll(speed, heading)\n\t\treturn nil\n\t})\n\n\td.AddCommand(\"Stop\", func(_ map[string]interface{}) interface{} {\n\t\td.Stop()\n\t\treturn nil\n\t})\n\n\td.AddCommand(\"GetRGB\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.GetRGB()\n\t})\n\n\td.AddCommand(\"ReadLocator\", func(_ map[string]interface{}) interface{} {\n\t\treturn d.ReadLocator()\n\t})\n\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetBackLED\", func(params map[string]interface{}) interface{} {\n\t\tlevel := uint8(params[\"level\"].(float64))\n\t\td.SetBackLED(level)\n\t\treturn nil\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetRotationRate\", func(params map[string]interface{}) interface{} {\n\t\tlevel := uint8(params[\"level\"].(float64))\n\t\td.SetRotationRate(level)\n\t\treturn nil\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetHeading\", func(params map[string]interface{}) interface{} {\n\t\theading := uint16(params[\"heading\"].(float64))\n\t\td.SetHeading(heading)\n\t\treturn nil\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetStabilization\", func(params map[string]interface{}) interface{} {\n\t\ton := params[\"enable\"].(bool)\n\t\td.SetStabilization(on)\n\t\treturn nil\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetDataStreaming\", func(params map[string]interface{}) interface{} {\n\t\tN := uint16(params[\"N\"].(float64))\n\t\tM := uint16(params[\"M\"].(float64))\n\t\tMask := uint32(params[\"Mask\"].(float64))\n\t\tPcnt := uint8(params[\"Pcnt\"].(float64))\n\t\tMask2 := uint32(params[\"Mask2\"].(float64))\n\n\t\td.SetDataStreaming(spherocommon.DataStreamingConfig{N: N, M: M, Mask2: Mask2, Pcnt: Pcnt, Mask: Mask})\n\t\treturn nil\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"ConfigureLocator\", func(params map[string]interface{}) interface{} {\n\t\tFlags := uint8(params[\"Flags\"].(float64))\n\t\tX := int16(params[\"X\"].(float64))\n\t\tY := int16(params[\"Y\"].(float64))\n\t\tYawTare := int16(params[\"YawTare\"].(float64))\n\n\t\td.ConfigureLocator(spherocommon.LocatorConfig{Flags: Flags, X: X, Y: Y, YawTare: YawTare})\n\t\treturn nil\n\t})\n\n\treturn d\n}\n\n// SetRGB sets the Sphero to the given r, g, and b values\nfunc (d *SpheroDriver) SetRGB(r uint8, g uint8, b uint8) {\n\td.sendCraftPacket([]uint8{r, g, b, 0x01}, 0x20)\n}\n\n// GetRGB returns the current r, g, b value of the Sphero\nfunc (d *SpheroDriver) GetRGB() []uint8 {\n\tbuf := d.getSyncResponse(d.craftPacket([]uint8{}, 0x22))\n\tif len(buf) == 9 {\n\t\treturn []uint8{buf[5], buf[6], buf[7]}\n\t}\n\treturn []uint8{}\n}\n\n// ReadLocator reads Sphero's current position (X,Y), component velocities and SOG (speed over ground).\nfunc (d *SpheroDriver) ReadLocator() []int16 {\n\tbuf := d.getSyncResponse(d.craftPacket([]uint8{}, 0x15))\n\tif len(buf) == 16 {\n\t\tvals := make([]int16, 5)\n\t\t_ = binary.Read(bytes.NewReader(buf[5:15]), binary.BigEndian, &vals)\n\t\treturn vals\n\t}\n\treturn []int16{}\n}\n\n// SetBackLED sets the Sphero Back LED to the specified brightness\nfunc (d *SpheroDriver) SetBackLED(level uint8) {\n\td.sendCraftPacket([]uint8{level}, 0x21)\n}\n\n// SetRotationRate sets the Sphero rotation rate\n// A value of 255 jumps to the maximum (currently 400 degrees/sec).\nfunc (d *SpheroDriver) SetRotationRate(level uint8) {\n\td.sendCraftPacket([]uint8{level}, 0x03)\n}\n\n// SetHeading sets the heading of the Sphero\nfunc (d *SpheroDriver) SetHeading(heading uint16) {\n\t//nolint:gosec // TODO: fix later\n\td.sendCraftPacket([]uint8{uint8(heading >> 8), uint8(heading & 0xFF)}, 0x01)\n}\n\n// SetStabilization enables or disables the built-in auto stabilizing features of the Sphero\nfunc (d *SpheroDriver) SetStabilization(on bool) {\n\tb := uint8(0x01)\n\tif !on {\n\t\tb = 0x00\n\t}\n\td.sendCraftPacket([]uint8{b}, 0x02)\n}\n\n// Roll sends a roll command to the Sphero gives a speed and heading\nfunc (d *SpheroDriver) Roll(speed uint8, heading uint16) {\n\t//nolint:gosec // TODO: fix later\n\td.sendCraftPacket([]uint8{speed, uint8(heading >> 8), uint8(heading & 0xFF), 0x01}, 0x30)\n}\n\n// ConfigureLocator configures and enables the Locator\nfunc (d *SpheroDriver) ConfigureLocator(lc spherocommon.LocatorConfig) {\n\tbuf := new(bytes.Buffer)\n\tif err := binary.Write(buf, binary.BigEndian, lc); err != nil {\n\t\tpanic(err)\n\t}\n\n\td.sendCraftPacket(buf.Bytes(), 0x13)\n}\n\n// SetDataStreaming enables sensor data streaming\nfunc (d *SpheroDriver) SetDataStreaming(dsc spherocommon.DataStreamingConfig) {\n\tbuf := new(bytes.Buffer)\n\tif err := binary.Write(buf, binary.BigEndian, dsc); err != nil {\n\t\tpanic(err)\n\t}\n\n\td.sendCraftPacket(buf.Bytes(), 0x11)\n}\n\n// Stop sets the Sphero to a roll speed of 0\nfunc (d *SpheroDriver) Stop() {\n\td.Roll(0, 0)\n}\n\n// ConfigureCollisionDetection configures the sensitivity of the detection.\nfunc (d *SpheroDriver) ConfigureCollisionDetection(cc spherocommon.CollisionConfig) {\n\td.sendCraftPacket([]uint8{cc.Method, cc.Xt, cc.Yt, cc.Xs, cc.Ys, cc.Dead}, 0x12)\n}\n\n// SetCalibration sets up Sphero for manual heading calibration.\n// It does this by turning on the tail light (so you can tell where it's\n// facing) and disabling stabilization (so you can adjust the heading).\n//\n// When done, call FinishCalibration to set the new heading, and re-enable\n// stabilization.\nfunc (d *SpheroDriver) StartCalibration() {\n\td.originalColor = d.GetRGB()\n\td.SetRGB(0, 0, 0)\n\td.SetBackLED(127)\n\td.SetStabilization(false)\n}\n\n// FinishCalibration ends Sphero's calibration mode, by setting\n// the new heading as current, and re-enabling normal defaults. This is a NOP\n// in case StartCalibration was not called.\nfunc (d *SpheroDriver) FinishCalibration() {\n\tif d.originalColor == nil {\n\t\t// Piggybacking on the original color being set to know if we are\n\t\t// calibrating or not.\n\t\treturn\n\t}\n\n\td.SetHeading(0)\n\td.SetRGB(d.originalColor[0], d.originalColor[1], d.originalColor[2])\n\td.SetBackLED(0)\n\td.SetStabilization(true)\n\td.originalColor = nil\n}\n\n// initialize starts the SpheroDriver and enables Collision Detection.\n// Returns true on successful start.\n//\n// Emits the Events:\n//\n//\tCollision  spherocommon.CollisionPacket - On Collision Detected\n//\tSensorData spherocommon.DataStreamingPacket - On Data Streaming event\n//\tError      error- On error while processing asynchronous response\n//\n// TODO: stop the go routines gracefully on shutdown()\nfunc (d *SpheroDriver) initialize() error {\n\tgo func() {\n\t\tfor {\n\t\t\tpacket := <-d.packetChannel\n\t\t\terr := d.write(packet)\n\t\t\tif err != nil {\n\t\t\t\td.Publish(spherocommon.ErrorEvent, err)\n\t\t\t}\n\t\t}\n\t}()\n\n\tgo func() {\n\t\tfor {\n\t\t\tresponse := <-d.responseChannel\n\t\t\td.syncResponse = append(d.syncResponse, response)\n\t\t}\n\t}()\n\n\tgo func() {\n\t\tfor {\n\t\t\theader := d.readHeader()\n\t\t\tif len(header) > 0 {\n\t\t\t\tbody := d.readBody(header[4])\n\t\t\t\tdata := append(header, body...)\n\t\t\t\tchecksum := data[len(data)-1]\n\t\t\t\tif checksum != spherocommon.CalculateChecksum(data[2:len(data)-1]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tswitch header[1] {\n\t\t\t\tcase 0xFE:\n\t\t\t\t\td.asyncResponse = append(d.asyncResponse, data)\n\t\t\t\tcase 0xFF:\n\t\t\t\t\td.responseChannel <- data\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\tgo func() {\n\t\tfor {\n\t\t\tvar evt []uint8\n\t\t\tfor len(d.asyncResponse) != 0 {\n\t\t\t\tevt, d.asyncResponse = d.asyncResponse[len(d.asyncResponse)-1], d.asyncResponse[:len(d.asyncResponse)-1]\n\t\t\t\tswitch evt[2] {\n\t\t\t\tcase 0x07:\n\t\t\t\t\td.handleCollisionDetected(evt)\n\t\t\t\tcase 0x03:\n\t\t\t\t\td.handleDataStreaming(evt)\n\t\t\t\t}\n\t\t\t}\n\t\t\ttime.Sleep(100 * time.Millisecond)\n\t\t}\n\t}()\n\n\td.ConfigureCollisionDetection(spheroDefaultCollisionConfig())\n\td.enableStopOnDisconnect()\n\n\treturn nil\n}\n\n// shutdown halts the SpheroDriver and sends a SpheroDriver.Stop command to the Sphero.\nfunc (d *SpheroDriver) shutdown() error {\n\tif d.adaptor().IsConnected() {\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\td.Stop()\n\t\t})\n\t\ttime.Sleep(d.shutdownWaitTime)\n\t}\n\treturn nil\n}\n\nfunc (d *SpheroDriver) enableStopOnDisconnect() {\n\td.sendCraftPacket([]uint8{0x00, 0x00, 0x00, 0x01}, 0x37)\n}\n\nfunc (d *SpheroDriver) handleCollisionDetected(data []uint8) {\n\t// ensure data is the right length:\n\tif len(data) != 22 || data[4] != 17 {\n\t\treturn\n\t}\n\tvar collision spherocommon.CollisionPacket\n\tbuffer := bytes.NewBuffer(data[5:]) // skip header\n\tif err := binary.Read(buffer, binary.BigEndian, &collision); err != nil {\n\t\tpanic(err)\n\t}\n\td.Publish(spherocommon.CollisionEvent, collision)\n}\n\nfunc (d *SpheroDriver) handleDataStreaming(data []uint8) {\n\t// ensure data is the right length:\n\tif len(data) != 90 {\n\t\treturn\n\t}\n\tvar dataPacket spherocommon.DataStreamingPacket\n\tbuffer := bytes.NewBuffer(data[5:]) // skip header\n\tif err := binary.Read(buffer, binary.BigEndian, &dataPacket); err != nil {\n\t\tpanic(err)\n\t}\n\td.Publish(spherocommon.SensorDataEvent, dataPacket)\n}\n\nfunc (d *SpheroDriver) getSyncResponse(packet *packet) []byte {\n\td.packetChannel <- packet\n\tfor i := 0; i < 500; i++ {\n\t\tfor key := range d.syncResponse {\n\t\t\tif d.syncResponse[key][3] == packet.header[4] && len(d.syncResponse[key]) > 6 {\n\t\t\t\tvar response []byte\n\t\t\t\tresponse, d.syncResponse = d.syncResponse[len(d.syncResponse)-1], d.syncResponse[:len(d.syncResponse)-1]\n\t\t\t\treturn response\n\t\t\t}\n\t\t}\n\t\ttime.Sleep(100 * time.Microsecond)\n\t}\n\n\treturn []byte{}\n}\n\nfunc (d *SpheroDriver) sendCraftPacket(body []uint8, cid byte) {\n\td.packetChannel <- d.craftPacket(body, cid)\n}\n\nfunc (d *SpheroDriver) craftPacket(body []uint8, cid byte) *packet {\n\tdlen := len(body) + 1\n\tdid := uint8(0x02)\n\thdr := []uint8{0xFF, 0xFF, did, cid, d.seq, uint8(dlen)} //nolint:gosec // TODO: fix later\n\tbuf := append(hdr, body...)\n\n\tpacket := &packet{\n\t\tbody:     body,\n\t\theader:   hdr,\n\t\tchecksum: spherocommon.CalculateChecksum(buf[2:]),\n\t}\n\n\treturn packet\n}\n\nfunc (d *SpheroDriver) write(packet *packet) error {\n\td.Mutex().Lock()\n\tdefer d.Mutex().Unlock()\n\n\tbuf := append(packet.header, packet.body...)\n\tbuf = append(buf, packet.checksum)\n\tlength, err := d.adaptor().SerialWrite(buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif length != len(buf) {\n\t\treturn errors.New(\"not enough bytes written\")\n\t}\n\td.seq++\n\treturn nil\n}\n\nfunc (d *SpheroDriver) readHeader() []uint8 {\n\treturn d.readNextChunk(5)\n}\n\nfunc (d *SpheroDriver) readBody(length uint8) []uint8 {\n\treturn d.readNextChunk(int(length))\n}\n\nfunc (d *SpheroDriver) readNextChunk(length int) []uint8 {\n\tread := make([]uint8, length)\n\tbytesRead := 0\n\n\tfor bytesRead < length {\n\t\ttime.Sleep(1 * time.Millisecond)\n\t\tn, err := d.adaptor().SerialRead(read[bytesRead:])\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\tbytesRead += n\n\t}\n\treturn read\n}\n\nfunc (d *SpheroDriver) adaptor() spheroSerialAdaptor {\n\tif a, ok := d.Connection().(spheroSerialAdaptor); ok {\n\t\treturn a\n\t}\n\n\tlog.Printf(\"%s has no Sphero serial connector\\n\", d.Name())\n\treturn nil\n}\n\n// spheroDefaultCollisionConfig returns a CollisionConfig with sensible collision defaults\nfunc spheroDefaultCollisionConfig() spherocommon.CollisionConfig {\n\treturn spherocommon.CollisionConfig{\n\t\tMethod: 0x01,\n\t\tXt:     0x80,\n\t\tYt:     0x80,\n\t\tXs:     0x80,\n\t\tYs:     0x80,\n\t\tDead:   0x60,\n\t}\n}\n\n// spheroDefaultLocatorConfig returns a LocatorConfig with defaults\nfunc spheroDefaultLocatorConfig() spherocommon.LocatorConfig {\n\treturn spherocommon.LocatorConfig{\n\t\tFlags:   0x01,\n\t\tX:       0x00,\n\t\tY:       0x00,\n\t\tYawTare: 0x00,\n\t}\n}\n"
  },
  {
    "path": "drivers/serial/sphero/sphero_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage sphero\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n\t\"gobot.io/x/gobot/v2/drivers/serial\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/testutil\"\n)\n\nvar _ gobot.Driver = (*SpheroDriver)(nil)\n\nfunc initTestSpheroDriver() *SpheroDriver {\n\ta := testutil.NewSerialTestAdaptor()\n\td := NewSpheroDriver(a)\n\td.shutdownWaitTime = 0 // to speed up the tests\n\treturn d\n}\n\nfunc TestNewSpheroDriver(t *testing.T) {\n\td := initTestSpheroDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Sphero\"))\n\tassert.NotNil(t, d.Eventer)\n}\n\nfunc TestNewSpheroDriverWithName(t *testing.T) {\n\t// This is a general test, that options are applied in constructor by using the common WithName() option.\tFurther\n\t// tests for options can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange\n\tconst newName = \"new name\"\n\ta := testutil.NewSerialTestAdaptor()\n\t// act\n\td := NewSpheroDriver(a, serial.WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, d.Name())\n}\n\nfunc TestSpheroCommands(t *testing.T) {\n\td := initTestSpheroDriver()\n\tvar ret interface{}\n\n\tret = d.Command(\"SetRGB\")(\n\t\tmap[string]interface{}{\"r\": 100.0, \"g\": 100.0, \"b\": 100.0},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"Roll\")(\n\t\tmap[string]interface{}{\"speed\": 100.0, \"heading\": 100.0},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"SetBackLED\")(\n\t\tmap[string]interface{}{\"level\": 100.0},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"ConfigureLocator\")(\n\t\tmap[string]interface{}{\"Flags\": 1.0, \"X\": 100.0, \"Y\": 100.0, \"YawTare\": 100.0},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"SetHeading\")(\n\t\tmap[string]interface{}{\"heading\": 100.0},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"SetRotationRate\")(\n\t\tmap[string]interface{}{\"level\": 100.0},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"SetStabilization\")(\n\t\tmap[string]interface{}{\"enable\": true},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"SetStabilization\")(\n\t\tmap[string]interface{}{\"enable\": false},\n\t)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"Stop\")(nil)\n\tassert.Nil(t, ret)\n\n\tret = d.Command(\"GetRGB\")(nil)\n\tassert.Equal(t, []byte{}, ret.([]byte))\n\n\tret = d.Command(\"ReadLocator\")(nil)\n\tassert.Equal(t, []int16{}, ret)\n}\n\nfunc TestSpheroStart(t *testing.T) {\n\td := initTestSpheroDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestSpheroHalt(t *testing.T) {\n\ta := testutil.NewSerialTestAdaptor()\n\t_ = a.Connect()\n\td := NewSpheroDriver(a)\n\td.shutdownWaitTime = 0 // to speed up the tests\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestSpheroSetDataStreaming(t *testing.T) {\n\td := initTestSpheroDriver()\n\td.SetDataStreaming(spherocommon.DefaultDataStreamingConfig())\n\n\tdata := <-d.packetChannel\n\n\tbuf := new(bytes.Buffer)\n\t_ = binary.Write(buf, binary.BigEndian, spherocommon.DefaultDataStreamingConfig())\n\n\tassert.Equal(t, buf.Bytes(), data.body)\n\n\tret := d.Command(\"SetDataStreaming\")(\n\t\tmap[string]interface{}{\n\t\t\t\"N\":     100.0,\n\t\t\t\"M\":     200.0,\n\t\t\t\"Mask\":  300.0,\n\t\t\t\"Pcnt\":  255.0,\n\t\t\t\"Mask2\": 400.0,\n\t\t},\n\t)\n\tassert.Nil(t, ret)\n\tdata = <-d.packetChannel\n\n\tdconfig := spherocommon.DataStreamingConfig{N: 100, M: 200, Mask: 300, Pcnt: 255, Mask2: 400}\n\tbuf = new(bytes.Buffer)\n\t_ = binary.Write(buf, binary.BigEndian, dconfig)\n\n\tassert.Equal(t, buf.Bytes(), data.body)\n}\n\nfunc TestSpheroConfigureLocator(t *testing.T) {\n\td := initTestSpheroDriver()\n\td.ConfigureLocator(spheroDefaultLocatorConfig())\n\tdata := <-d.packetChannel\n\n\tbuf := new(bytes.Buffer)\n\t_ = binary.Write(buf, binary.BigEndian, spheroDefaultLocatorConfig())\n\n\tassert.Equal(t, buf.Bytes(), data.body)\n\n\tret := d.Command(\"ConfigureLocator\")(\n\t\tmap[string]interface{}{\n\t\t\t\"Flags\":   1.0,\n\t\t\t\"X\":       100.0,\n\t\t\t\"Y\":       100.0,\n\t\t\t\"YawTare\": 0.0,\n\t\t},\n\t)\n\tassert.Nil(t, ret)\n\tdata = <-d.packetChannel\n\n\tlconfig := spherocommon.LocatorConfig{Flags: 1, X: 100, Y: 100, YawTare: 0}\n\tbuf = new(bytes.Buffer)\n\t_ = binary.Write(buf, binary.BigEndian, lconfig)\n\n\tassert.Equal(t, buf.Bytes(), data.body)\n}\n"
  },
  {
    "path": "drivers/serial/testutil/testutil.go",
    "content": "package testutil\n\nimport \"fmt\"\n\ntype serialTestAdaptor struct {\n\tisConnected bool\n\tname        string\n\n\tsimulateConnectErr bool\n\tsimulateReadErr    bool\n\tsimulateWriteErr   bool\n}\n\nfunc NewSerialTestAdaptor() *serialTestAdaptor {\n\treturn &serialTestAdaptor{}\n}\n\nfunc (t *serialTestAdaptor) SetSimulateConnectError(val bool) {\n\tt.simulateConnectErr = val\n}\n\nfunc (t *serialTestAdaptor) SetSimulateReadError(val bool) {\n\tt.simulateReadErr = val\n}\n\nfunc (t *serialTestAdaptor) SetSimulateWriteError(val bool) {\n\tt.simulateWriteErr = val\n}\n\nfunc (t *serialTestAdaptor) IsConnected() bool {\n\treturn t.isConnected\n}\n\nfunc (t *serialTestAdaptor) SerialRead(b []byte) (int, error) {\n\tif t.simulateReadErr {\n\t\treturn 0, fmt.Errorf(\"read error\")\n\t}\n\n\treturn len(b), nil\n}\n\nfunc (t *serialTestAdaptor) SerialWrite(b []byte) (int, error) {\n\tif t.simulateWriteErr {\n\t\treturn 0, fmt.Errorf(\"write error\")\n\t}\n\n\treturn len(b), nil\n}\n\n// gobot.Adaptor interfaces\nfunc (t *serialTestAdaptor) Connect() error {\n\tif t.simulateConnectErr {\n\t\treturn fmt.Errorf(\"connect error\")\n\t}\n\n\tt.isConnected = true\n\treturn nil\n}\n\nfunc (t *serialTestAdaptor) Finalize() error  { return nil }\nfunc (t *serialTestAdaptor) Name() string     { return t.name }\nfunc (t *serialTestAdaptor) SetName(n string) { t.name = n }\n"
  },
  {
    "path": "drivers/spi/README.md",
    "content": "# SPI\n\nThis package provides drivers for [SPI](https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus) devices.\n\n## Getting Started\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## Hardware Support\n\nGobot has a extensible system for connecting to hardware devices.\n\nThe following SPI Devices are currently supported:\n\n- APA102 Programmable LEDs\n- MCP3002 Analog/Digital Converter\n- MCP3004 Analog/Digital Converter\n- MCP3008 Analog/Digital Converter\n- MCP3202 Analog/Digital Converter\n- MCP3204 Analog/Digital Converter\n- MCP3208 Analog/Digital Converter\n- MCP3304 Analog/Digital Converter\n- MFRC522 RFID Card Reader\n- SSD1306 OLED Display Controller\n- GoPiGo3 Robot\n\nThe following SPI system drivers are currently supported:\n\n- SPI by `/dev/spidevX.Y` with the awesome [periph.io](https://periph.io/) which currently only works on Linux systems\n- SPI via GPIO's\n"
  },
  {
    "path": "drivers/spi/apa102.go",
    "content": "package spi\n\nimport (\n\t\"image/color\"\n\t\"math\"\n)\n\n// APA102Driver is a driver for the APA102 programmable RGB LEDs.\ntype APA102Driver struct {\n\t*Driver\n\n\tvals       []color.RGBA\n\tbrightness uint8\n}\n\n// NewAPA102Driver creates a new Gobot Driver for APA102 RGB LEDs.\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver.\n//\tcount int - how many LEDs are in the array controlled by this driver.\n//\tbright - the default brightness to apply for all LEDs (must be between 0 and 31).\n//\n// Optional params:\n//\n//\tspi.WithBusNumber(int):  bus to use with this driver.\n//\tspi.WithChipNumber(int): chip to use with this driver.\n//\tspi.WithMode(int):    \t mode to use with this driver.\n//\tspi.WithBitCount(int):   number of bits to use with this driver.\n//\tspi.WithSpeed(int64):    speed in Hz to use with this driver.\nfunc NewAPA102Driver(a Connector, count int, bright uint8, options ...func(Config)) *APA102Driver {\n\td := &APA102Driver{\n\t\tDriver:     NewDriver(a, \"APA102\"),\n\t\tvals:       make([]color.RGBA, count),\n\t\tbrightness: uint8(math.Min(float64(bright), 31)),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// SetRGBA sets the ith LED's color to the given RGBA value.\n// A subsequent call to Draw is required to transmit values\n// to the LED strip.\nfunc (d *APA102Driver) SetRGBA(i int, v color.RGBA) {\n\td.vals[i] = v\n}\n\n// SetBrightness sets the ith LED's brightness to the given value.\n// Must be between 0 and 31.\nfunc (d *APA102Driver) SetBrightness(i uint8) {\n\td.brightness = uint8(math.Min(float64(i), 31))\n}\n\n// Brightness return driver brightness value.\nfunc (d *APA102Driver) Brightness() uint8 {\n\treturn d.brightness\n}\n\n// Draw displays the RGBA values set on the actual LED strip.\nfunc (d *APA102Driver) Draw() error {\n\t// TODO(jbd): dotstar allows other RGBA alignments, support those layouts.\n\tn := len(d.vals)\n\n\ttx := make([]byte, 4*(n+1)+(n/2+1))\n\ttx[0] = 0x00\n\ttx[1] = 0x00\n\ttx[2] = 0x00\n\ttx[3] = 0x00\n\n\tfor i, c := range d.vals {\n\t\tj := (i + 1) * 4\n\t\tif c.A != 0 {\n\t\t\ttx[j] = 0xe0 + byte(math.Min(float64(c.A), 31))\n\t\t} else {\n\t\t\ttx[j] = 0xe0 + d.brightness\n\t\t}\n\t\ttx[j+1] = c.B\n\t\ttx[j+2] = c.G\n\t\ttx[j+3] = c.R\n\t}\n\n\t// end frame with at least n/2 0xff vals\n\tfor i := (n + 1) * 4; i < len(tx); i++ {\n\t\ttx[i] = 0xff\n\t}\n\n\treturn d.writeBytes(tx)\n}\n"
  },
  {
    "path": "drivers/spi/apa102_test.go",
    "content": "package spi\n\nimport (\n\t\"image/color\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*APA102Driver)(nil)\n\nfunc initTestAPA102DriverWithStubbedAdaptor() *APA102Driver {\n\ta := newSpiTestAdaptor()\n\td := NewAPA102Driver(a, 10, 31)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d\n}\n\nfunc TestNewAPA102Driver(t *testing.T) {\n\tvar di interface{} = NewAPA102Driver(newSpiTestAdaptor(), 10, 31)\n\td, ok := di.(*APA102Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewAPA102Driver() should have returned a *APA102Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"APA102\"))\n}\n\nfunc TestAPA102Halt(t *testing.T) {\n\t// arrange\n\td := NewAPA102Driver(newSpiTestAdaptor(), 10, 31)\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestDriverLEDs(t *testing.T) {\n\td := initTestAPA102DriverWithStubbedAdaptor()\n\n\td.SetRGBA(0, color.RGBA{255, 255, 255, 15})\n\td.SetRGBA(1, color.RGBA{255, 255, 255, 15})\n\td.SetRGBA(2, color.RGBA{255, 255, 255, 15})\n\td.SetRGBA(3, color.RGBA{255, 255, 255, 15})\n\n\trequire.NoError(t, d.Draw())\n}\n"
  },
  {
    "path": "drivers/spi/doc.go",
    "content": "/*\nPackage spi provides Gobot drivers for spi devices.\nUses periph.io for spi\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFor further information refer to spi README:\nhttps://github.com/hybridgroup/gobot/blob/release/drivers/spi/README.md\n*/\npackage spi // import \"gobot.io/x/gobot/v2/drivers/spi\"\n"
  },
  {
    "path": "drivers/spi/helpers_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this SpiBusAdaptor fulfills all the required interfaces\nvar (\n\t_ Connector        = (*spiTestAdaptor)(nil)\n\t_ gobot.Connection = (*spiTestAdaptor)(nil)\n)\n\ntype spiTestAdaptor struct {\n\tsys *system.Accesser\n\t// busNum        int\n\tspiConnectErr bool\n\tspi           *system.MockSpiAccess\n\tconnection    Connection\n}\n\nfunc newSpiTestAdaptor() *spiTestAdaptor {\n\tsys := system.NewAccesser()\n\tspi := sys.UseMockSpi()\n\ta := &spiTestAdaptor{\n\t\tsys: sys,\n\t\tspi: spi,\n\t}\n\treturn a\n}\n\n// spi.Connector interfaces\nfunc (a *spiTestAdaptor) GetSpiConnection(busNum, chipNum, mode, bits int, maxSpeed int64) (Connection, error) {\n\tif a.spiConnectErr {\n\t\treturn nil, fmt.Errorf(\"invalid SPI connection in helper\")\n\t}\n\t// a.busNum = busNum\n\tsysdev, err := a.sys.NewSpiDevice(busNum, chipNum, mode, bits, maxSpeed)\n\ta.connection = NewConnection(sysdev)\n\treturn a.connection, err\n}\n\nfunc (a *spiTestAdaptor) SpiDefaultBusNumber() int  { return 0 }\nfunc (a *spiTestAdaptor) SpiDefaultChipNumber() int { return 0 }\nfunc (a *spiTestAdaptor) SpiDefaultMode() int       { return 0 }\nfunc (a *spiTestAdaptor) SpiDefaultBitCount() int   { return 0 }\nfunc (a *spiTestAdaptor) SpiDefaultMaxSpeed() int64 { return 0 }\n\n// gobot.Connection interfaces\nfunc (a *spiTestAdaptor) Connect() error  { return nil }\nfunc (a *spiTestAdaptor) Finalize() error { return nil }\nfunc (a *spiTestAdaptor) Name() string    { return \"board name\" }\nfunc (a *spiTestAdaptor) SetName(string)  {}\n"
  },
  {
    "path": "drivers/spi/mcp3002.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// MCP3002DriverMaxChannel is the number of channels of this A/D converter.\nconst MCP3002DriverMaxChannel = 2\n\n// MCP3002Driver is a driver for the MCP3002 A/D converter.\ntype MCP3002Driver struct {\n\t*Driver\n}\n\n// NewMCP3002Driver creates a new Gobot Driver for MCP3002 A/D converter\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMCP3002Driver(a Connector, options ...func(Config)) *MCP3002Driver {\n\td := &MCP3002Driver{\n\t\tDriver: NewDriver(a, \"MCP3002\"),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Read reads the current analog data for the desired channel.\nfunc (d *MCP3002Driver) Read(channel int) (int, error) {\n\tif channel < 0 || channel > MCP3002DriverMaxChannel-1 {\n\t\treturn 0, fmt.Errorf(\"invalid channel '%d' for read\", channel)\n\t}\n\n\ttx := make([]byte, 2)\n\ttx[0] = 0x68 + (byte(channel) << 4)\n\ttx[1] = 0x00\n\n\trx := make([]byte, 2)\n\n\tif err := d.readCommandData(tx, rx); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int((rx[0]&0x3))<<8 + int(rx[1]), nil\n}\n\n// AnalogRead returns value from analog reading of specified pin\nfunc (d *MCP3002Driver) AnalogRead(pin string) (int, error) {\n\tchannel, _ := strconv.Atoi(pin)\n\treturn d.Read(channel)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3002_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP3002Driver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*MCP3002Driver)(nil)\n\nfunc initTestMCP3002DriverWithStubbedAdaptor() (*MCP3002Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMCP3002Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP3002Driver(t *testing.T) {\n\tvar di interface{} = NewMCP3002Driver(newSpiTestAdaptor())\n\td, ok := di.(*MCP3002Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP3002Driver() should have returned a *MCP3002Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP3002\"))\n}\n\nfunc TestMCP3002Halt(t *testing.T) {\n\t// arrange\n\td := NewMCP3002Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMCP3002Read(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanNum     int\n\t\tsimRead     []byte\n\t\twant        int\n\t\twantWritten []byte\n\t\twantErr     error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tchanNum: -1,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '-1' for read\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tchanNum:     0,\n\t\t\tsimRead:     []byte{0xFF, 0xFF},\n\t\t\twantWritten: []byte{0x68, 0x00},\n\t\t\twant:        0x3FF,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tchanNum:     1,\n\t\t\tsimRead:     []byte{0xF2, 0x22},\n\t\t\twantWritten: []byte{0x78, 0x00},\n\t\t\twant:        0x222,\n\t\t},\n\t\t\"number_2_error\": {\n\t\t\tchanNum: 2,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '2' for read\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestMCP3002DriverWithStubbedAdaptor()\n\t\t\ta.spi.SetSimRead(tc.simRead)\n\t\t\t// act\n\t\t\tgot, err := d.Read(tc.chanNum)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.wantWritten, a.spi.Written())\n\t\t})\n\t}\n}\n\nfunc TestMCP3002ReadWithError(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP3002DriverWithStubbedAdaptor()\n\ta.spi.SetReadError(true)\n\t// act\n\tgot, err := d.Read(0)\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI read in mock\")\n\tassert.Equal(t, 0, got)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3004.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// MCP3004DriverMaxChannel is the number of channels of this A/D converter.\nconst MCP3004DriverMaxChannel = 4\n\n// MCP3004Driver is a driver for the MCP3008 A/D converter.\ntype MCP3004Driver struct {\n\t*Driver\n}\n\n// NewMCP3004Driver creates a new Gobot Driver for MCP3004 A/D converter\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMCP3004Driver(a Connector, options ...func(Config)) *MCP3004Driver {\n\td := &MCP3004Driver{\n\t\tDriver: NewDriver(a, \"MCP3004\"),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Read reads the current analog data for the desired channel.\nfunc (d *MCP3004Driver) Read(channel int) (int, error) {\n\tif channel < 0 || channel > MCP3004DriverMaxChannel-1 {\n\t\treturn 0, fmt.Errorf(\"invalid channel '%d' for read\", channel)\n\t}\n\n\ttx := make([]byte, 3)\n\ttx[0] = 0x01\n\ttx[1] = byte(8+channel) << 4\n\ttx[2] = 0x00\n\n\trx := make([]byte, 3)\n\n\tif err := d.readCommandData(tx, rx); err != nil || len(rx) != 3 {\n\t\treturn 0, err\n\t}\n\n\tresult := int((rx[1]&0x3))<<8 + int(rx[2])\n\n\treturn result, nil\n}\n\n// AnalogRead returns value from analog reading of specified pin\nfunc (d *MCP3004Driver) AnalogRead(pin string) (int, error) {\n\tchannel, _ := strconv.Atoi(pin)\n\treturn d.Read(channel)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3004_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP3004Driver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*MCP3004Driver)(nil)\n\nfunc initTestMCP3004DriverWithStubbedAdaptor() (*MCP3004Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMCP3004Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP3004Driver(t *testing.T) {\n\tvar di interface{} = NewMCP3004Driver(newSpiTestAdaptor())\n\td, ok := di.(*MCP3004Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP3004Driver() should have returned a *MCP3004Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP3004\"))\n}\n\nfunc TestMCP3004Halt(t *testing.T) {\n\t// arrange\n\td := NewMCP3004Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMCP3004Read(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanNum     int\n\t\tsimRead     []byte\n\t\twant        int\n\t\twantWritten []byte\n\t\twantErr     error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tchanNum: -1,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '-1' for read\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tchanNum:     0,\n\t\t\tsimRead:     []byte{0xFF, 0xFF, 0xFF},\n\t\t\twantWritten: []byte{0x01, 0x80, 0x00},\n\t\t\twant:        0x03FF,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tchanNum:     1,\n\t\t\tsimRead:     []byte{0xFF, 0xF1, 0xFF},\n\t\t\twantWritten: []byte{0x01, 0x90, 0x00},\n\t\t\twant:        0x01FF,\n\t\t},\n\t\t\"number_3_ok\": {\n\t\t\tchanNum:     3,\n\t\t\tsimRead:     []byte{0xFF, 0xF2, 0x11},\n\t\t\twantWritten: []byte{0x01, 0xB0, 0x00},\n\t\t\twant:        0x0211,\n\t\t},\n\t\t\"number_4_error\": {\n\t\t\tchanNum: 4,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '4' for read\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestMCP3004DriverWithStubbedAdaptor()\n\t\t\ta.spi.SetSimRead(tc.simRead)\n\t\t\t// act\n\t\t\tgot, err := d.Read(tc.chanNum)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.wantWritten, a.spi.Written())\n\t\t})\n\t}\n}\n\nfunc TestMCP3004ReadWithError(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP3004DriverWithStubbedAdaptor()\n\ta.spi.SetReadError(true)\n\t// act\n\tgot, err := d.Read(0)\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI read in mock\")\n\tassert.Equal(t, 0, got)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3008.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// MCP3008DriverMaxChannel is the number of channels of this A/D converter.\nconst MCP3008DriverMaxChannel = 8\n\n// MCP3008Driver is a driver for the MCP3008 A/D converter.\ntype MCP3008Driver struct {\n\t*Driver\n}\n\n// NewMCP3008Driver creates a new Gobot Driver for MCP3008Driver A/D converter\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMCP3008Driver(a Connector, options ...func(Config)) *MCP3008Driver {\n\td := &MCP3008Driver{\n\t\tDriver: NewDriver(a, \"MCP3008\"),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Read reads the current analog data for the desired channel.\nfunc (d *MCP3008Driver) Read(channel int) (int, error) {\n\tif channel < 0 || channel > MCP3008DriverMaxChannel-1 {\n\t\treturn 0, fmt.Errorf(\"invalid channel '%d' for read\", channel)\n\t}\n\n\ttx := make([]byte, 3)\n\ttx[0] = 0x01\n\ttx[1] = byte(8+channel) << 4\n\ttx[2] = 0x00\n\n\trx := make([]byte, 3)\n\n\tif err := d.readCommandData(tx, rx); err != nil || len(rx) != 3 {\n\t\treturn 0, err\n\t}\n\n\tresult := int((rx[1]&0x3))<<8 + int(rx[2])\n\n\treturn result, nil\n}\n\n// AnalogRead returns value from analog reading of specified pin\nfunc (d *MCP3008Driver) AnalogRead(pin string) (int, error) {\n\tchannel, _ := strconv.Atoi(pin)\n\treturn d.Read(channel)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3008_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP3008Driver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*MCP3008Driver)(nil)\n\nfunc initTestMCP3008DriverWithStubbedAdaptor() (*MCP3008Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMCP3008Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP3008Driver(t *testing.T) {\n\tvar di interface{} = NewMCP3008Driver(newSpiTestAdaptor())\n\td, ok := di.(*MCP3008Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP3008Driver() should have returned a *MCP3008Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP3008\"))\n}\n\nfunc TestMCP3008Halt(t *testing.T) {\n\t// arrange\n\td := NewMCP3008Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMCP3008Read(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanNum     int\n\t\tsimRead     []byte\n\t\twant        int\n\t\twantWritten []byte\n\t\twantErr     error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tchanNum: -1,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '-1' for read\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tchanNum:     0,\n\t\t\tsimRead:     []byte{0xFF, 0xFF, 0xFF},\n\t\t\twantWritten: []byte{0x01, 0x80, 0x00},\n\t\t\twant:        0x03FF,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tchanNum:     1,\n\t\t\tsimRead:     []byte{0xFF, 0xF1, 0xFF},\n\t\t\twantWritten: []byte{0x01, 0x90, 0x00},\n\t\t\twant:        0x01FF,\n\t\t},\n\t\t\"number_7_ok\": {\n\t\t\tchanNum:     7,\n\t\t\tsimRead:     []byte{0xFF, 0xF2, 0x11},\n\t\t\twantWritten: []byte{0x01, 0xF0, 0x00},\n\t\t\twant:        0x0211,\n\t\t},\n\t\t\"number_8_error\": {\n\t\t\tchanNum: 8,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '8' for read\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestMCP3008DriverWithStubbedAdaptor()\n\t\t\ta.spi.SetSimRead(tc.simRead)\n\t\t\t// act\n\t\t\tgot, err := d.Read(tc.chanNum)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.wantWritten, a.spi.Written())\n\t\t})\n\t}\n}\n\nfunc TestMCP3008ReadWithError(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP3008DriverWithStubbedAdaptor()\n\ta.spi.SetReadError(true)\n\t// act\n\tgot, err := d.Read(0)\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI read in mock\")\n\tassert.Equal(t, 0, got)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3202.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// MCP3202DriverMaxChannel is the number of channels of this A/D converter.\nconst MCP3202DriverMaxChannel = 2\n\n// MCP3202Driver is a driver for the MCP3202 A/D converter.\ntype MCP3202Driver struct {\n\t*Driver\n}\n\n// NewMCP3202Driver creates a new Gobot Driver for MCP3202Driver A/D converter\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMCP3202Driver(a Connector, options ...func(Config)) *MCP3202Driver {\n\td := &MCP3202Driver{\n\t\tDriver: NewDriver(a, \"MCP3202\"),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Read reads the current analog data for the desired channel.\nfunc (d *MCP3202Driver) Read(channel int) (int, error) {\n\tif channel < 0 || channel > MCP3202DriverMaxChannel-1 {\n\t\treturn 0, fmt.Errorf(\"invalid channel '%d' for read\", channel)\n\t}\n\n\ttx := make([]byte, 3)\n\ttx[0] = 0x01\n\ttx[1] = 0xa0 + byte(channel)<<6\n\ttx[2] = 0x00\n\n\trx := make([]byte, 3)\n\n\tif err := d.readCommandData(tx, rx); err != nil || len(rx) != 3 {\n\t\treturn 0, err\n\t}\n\n\tresult := int((rx[1]&0xf))<<8 + int(rx[2])\n\n\treturn result, nil\n}\n\n// AnalogRead returns value from analog reading of specified pin, scaled to 0-1023 value.\nfunc (d *MCP3202Driver) AnalogRead(pin string) (int, error) {\n\tchannel, _ := strconv.Atoi(pin)\n\tvalue, err := d.Read(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(gobot.ToScale(gobot.FromScale(float64(value), 0, 4095), 0, 1023)), err\n}\n"
  },
  {
    "path": "drivers/spi/mcp3202_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP3202Driver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*MCP3202Driver)(nil)\n\nfunc initTestMCP3202DriverWithStubbedAdaptor() (*MCP3202Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMCP3202Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP3202Driver(t *testing.T) {\n\tvar di interface{} = NewMCP3202Driver(newSpiTestAdaptor())\n\td, ok := di.(*MCP3202Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP3202Driver() should have returned a *MCP3202Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP3202\"))\n}\n\nfunc TestMCP3202Halt(t *testing.T) {\n\t// arrange\n\td := NewMCP3202Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMCP3202Read(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanNum     int\n\t\tsimRead     []byte\n\t\twant        int\n\t\twantWritten []byte\n\t\twantErr     error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tchanNum: -1,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '-1' for read\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tchanNum:     0,\n\t\t\tsimRead:     []byte{0xFF, 0xFF, 0xFF},\n\t\t\twantWritten: []byte{0x01, 0xA0, 0x00},\n\t\t\twant:        0x0FFF,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tchanNum:     1,\n\t\t\tsimRead:     []byte{0xFF, 0xFE, 0xFF},\n\t\t\twantWritten: []byte{0x01, 0xE0, 0x00},\n\t\t\twant:        0x0EFF,\n\t\t},\n\t\t\"number_2_error\": {\n\t\t\tchanNum: 2,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '2' for read\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestMCP3202DriverWithStubbedAdaptor()\n\t\t\ta.spi.SetSimRead(tc.simRead)\n\t\t\t// act\n\t\t\tgot, err := d.Read(tc.chanNum)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.wantWritten, a.spi.Written())\n\t\t})\n\t}\n}\n\nfunc TestMCP3202ReadWithError(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP3202DriverWithStubbedAdaptor()\n\ta.spi.SetReadError(true)\n\t// act\n\tgot, err := d.Read(0)\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI read in mock\")\n\tassert.Equal(t, 0, got)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3204.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// MCP3204DriverMaxChannel is the number of channels of this A/D converter.\nconst MCP3204DriverMaxChannel = 4\n\n// MCP3204Driver is a driver for the MCP3204 A/D converter.\ntype MCP3204Driver struct {\n\t*Driver\n}\n\n// NewMCP3204Driver creates a new Gobot Driver for MCP3204Driver A/D converter\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMCP3204Driver(a Connector, options ...func(Config)) *MCP3204Driver {\n\td := &MCP3204Driver{\n\t\tDriver: NewDriver(a, \"MCP3204\"),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Read reads the current analog data for the desired channel.\nfunc (d *MCP3204Driver) Read(channel int) (int, error) {\n\tif channel < 0 || channel > MCP3204DriverMaxChannel-1 {\n\t\treturn 0, fmt.Errorf(\"invalid channel '%d' for read\", channel)\n\t}\n\n\ttx := make([]byte, 3)\n\ttx[0] = 0x06 + (byte(channel) >> 2)\n\ttx[1] = (byte(channel) & 0x03) << 6\n\ttx[2] = 0x00\n\n\trx := make([]byte, 3)\n\n\tif err := d.readCommandData(tx, rx); err != nil || len(rx) != 3 {\n\t\treturn 0, err\n\t}\n\n\tresult := int((rx[1]&0xf))<<8 + int(rx[2])\n\n\treturn result, nil\n}\n\n// AnalogRead returns value from analog reading of specified pin, scaled to 0-1023 value.\nfunc (d *MCP3204Driver) AnalogRead(pin string) (int, error) {\n\tchannel, _ := strconv.Atoi(pin)\n\tvalue, err := d.Read(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(gobot.ToScale(gobot.FromScale(float64(value), 0, 4095), 0, 1023)), err\n}\n"
  },
  {
    "path": "drivers/spi/mcp3204_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP3204Driver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*MCP3204Driver)(nil)\n\nfunc initTestMCP3204DriverWithStubbedAdaptor() (*MCP3204Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMCP3204Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP3204Driver(t *testing.T) {\n\tvar di interface{} = NewMCP3204Driver(newSpiTestAdaptor())\n\td, ok := di.(*MCP3204Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP3204Driver() should have returned a *MCP3204Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP3204\"))\n}\n\nfunc TestMCP3204Halt(t *testing.T) {\n\t// arrange\n\td := NewMCP3204Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMCP3204Read(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanNum     int\n\t\tsimRead     []byte\n\t\twant        int\n\t\twantWritten []byte\n\t\twantErr     error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tchanNum: -1,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '-1' for read\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tchanNum:     0,\n\t\t\tsimRead:     []byte{0xFF, 0xFF, 0xFF},\n\t\t\twantWritten: []byte{0x06, 0x00, 0x00},\n\t\t\twant:        0x0FFF,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tchanNum:     1,\n\t\t\tsimRead:     []byte{0xFF, 0xFE, 0xFF},\n\t\t\twantWritten: []byte{0x06, 0x40, 0x00},\n\t\t\twant:        0x0EFF,\n\t\t},\n\t\t\"number_3_ok\": {\n\t\t\tchanNum:     3,\n\t\t\tsimRead:     []byte{0xFF, 0xF3, 0x21},\n\t\t\twantWritten: []byte{0x06, 0xC0, 0x00},\n\t\t\twant:        0x0321,\n\t\t},\n\t\t\"number_4_error\": {\n\t\t\tchanNum: 4,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '4' for read\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestMCP3204DriverWithStubbedAdaptor()\n\t\t\ta.spi.SetSimRead(tc.simRead)\n\t\t\t// act\n\t\t\tgot, err := d.Read(tc.chanNum)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.wantWritten, a.spi.Written())\n\t\t})\n\t}\n}\n\nfunc TestMCP3204ReadWithError(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP3204DriverWithStubbedAdaptor()\n\ta.spi.SetReadError(true)\n\t// act\n\tgot, err := d.Read(0)\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI read in mock\")\n\tassert.Equal(t, 0, got)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3208.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// MCP3208DriverMaxChannel is the number of channels of this A/D converter.\nconst MCP3208DriverMaxChannel = 8\n\n// MCP3208Driver is a driver for the MCP3208 A/D converter.\ntype MCP3208Driver struct {\n\t*Driver\n}\n\n// NewMCP3208Driver creates a new Gobot Driver for MCP3208Driver A/D converter\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMCP3208Driver(a Connector, options ...func(Config)) *MCP3208Driver {\n\td := &MCP3208Driver{\n\t\tDriver: NewDriver(a, \"MCP3208\"),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Read reads the current analog data for the desired channel.\nfunc (d *MCP3208Driver) Read(channel int) (int, error) {\n\tif channel < 0 || channel > MCP3208DriverMaxChannel-1 {\n\t\treturn 0, fmt.Errorf(\"invalid channel '%d' for read\", channel)\n\t}\n\n\ttx := make([]byte, 3)\n\ttx[0] = 0x06 + (byte(channel) >> 2)\n\ttx[1] = (byte(channel) & 0x03) << 6\n\ttx[2] = 0x00\n\n\trx := make([]byte, 3)\n\n\tif err := d.readCommandData(tx, rx); err != nil || len(rx) != 3 {\n\t\treturn 0, err\n\t}\n\n\tresult := int((rx[1]&0xf))<<8 + int(rx[2])\n\n\treturn result, nil\n}\n\n// AnalogRead returns value from analog reading of specified pin, scaled to 0-1023 value.\nfunc (d *MCP3208Driver) AnalogRead(pin string) (int, error) {\n\tchannel, _ := strconv.Atoi(pin)\n\tvalue, err := d.Read(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(gobot.ToScale(gobot.FromScale(float64(value), 0, 4095), 0, 1023)), err\n}\n"
  },
  {
    "path": "drivers/spi/mcp3208_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP3208Driver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*MCP3208Driver)(nil)\n\nfunc initTestMCP3208DriverWithStubbedAdaptor() (*MCP3208Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMCP3208Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP3208Driver(t *testing.T) {\n\tvar di interface{} = NewMCP3208Driver(newSpiTestAdaptor())\n\td, ok := di.(*MCP3208Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP3208Driver() should have returned a *MCP3208Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP3208\"))\n}\n\nfunc TestMCP3208Halt(t *testing.T) {\n\t// arrange\n\td := NewMCP3208Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMCP3208Read(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanNum     int\n\t\tsimRead     []byte\n\t\twant        int\n\t\twantWritten []byte\n\t\twantErr     error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tchanNum: -1,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '-1' for read\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tchanNum:     0,\n\t\t\tsimRead:     []byte{0xFF, 0xFF, 0xFF},\n\t\t\twantWritten: []byte{0x06, 0x00, 0x00},\n\t\t\twant:        0x0FFF,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tchanNum:     1,\n\t\t\tsimRead:     []byte{0xFF, 0xFE, 0xFF},\n\t\t\twantWritten: []byte{0x06, 0x40, 0x00},\n\t\t\twant:        0x0EFF,\n\t\t},\n\t\t\"number_7_ok\": {\n\t\t\tchanNum:     7,\n\t\t\tsimRead:     []byte{0xFF, 0xF7, 0x65},\n\t\t\twantWritten: []byte{0x07, 0xC0, 0x00},\n\t\t\twant:        0x0765,\n\t\t},\n\t\t\"number_8_error\": {\n\t\t\tchanNum: 8,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '8' for read\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestMCP3208DriverWithStubbedAdaptor()\n\t\t\ta.spi.SetSimRead(tc.simRead)\n\t\t\t// act\n\t\t\tgot, err := d.Read(tc.chanNum)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.wantWritten, a.spi.Written())\n\t\t})\n\t}\n}\n\nfunc TestMCP3208ReadWithError(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP3208DriverWithStubbedAdaptor()\n\ta.spi.SetReadError(true)\n\t// act\n\tgot, err := d.Read(0)\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI read in mock\")\n\tassert.Equal(t, 0, got)\n}\n"
  },
  {
    "path": "drivers/spi/mcp3304.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// MCP3304DriverMaxChannel is the number of channels of this A/D converter.\nconst MCP3304DriverMaxChannel = 8\n\n// MCP3304Driver is a driver for the MCP3304 A/D converter.\ntype MCP3304Driver struct {\n\t*Driver\n}\n\n// NewMCP3304Driver creates a new Gobot Driver for MCP3304Driver A/D converter\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMCP3304Driver(a Connector, options ...func(Config)) *MCP3304Driver {\n\td := &MCP3304Driver{\n\t\tDriver: NewDriver(a, \"MCP3304\"),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Read reads the current analog data for the desired channel.\nfunc (d *MCP3304Driver) Read(channel int) (int, error) {\n\tif channel < 0 || channel > MCP3304DriverMaxChannel-1 {\n\t\treturn 0, fmt.Errorf(\"invalid channel '%d' for read\", channel)\n\t}\n\n\ttx := make([]byte, 3)\n\ttx[0] = 0x0c + (byte(channel) >> 1)\n\ttx[1] = (byte(channel) & 0x01) << 7\n\ttx[2] = 0x00\n\n\trx := make([]byte, 3)\n\n\tif err := d.readCommandData(tx, rx); err != nil || len(rx) != 3 {\n\t\treturn 0, err\n\t}\n\n\tresult := int((rx[1]&0xf))<<8 + int(rx[2])\n\n\treturn result, nil\n}\n\n// AnalogRead returns value from analog reading of specified pin, scaled to 0-1023 value.\nfunc (d *MCP3304Driver) AnalogRead(pin string) (int, error) {\n\tchannel, _ := strconv.Atoi(pin)\n\tvalue, err := d.Read(channel)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn int(gobot.ToScale(gobot.FromScale(float64(value), 0, 4095), 0, 1023)), err\n}\n"
  },
  {
    "path": "drivers/spi/mcp3304_test.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MCP3304Driver)(nil)\n\n// must implement the AnalogReader interface\nvar _ aio.AnalogReader = (*MCP3304Driver)(nil)\n\nfunc initTestMCP3304DriverWithStubbedAdaptor() (*MCP3304Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMCP3304Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewMCP3304Driver(t *testing.T) {\n\tvar di interface{} = NewMCP3304Driver(newSpiTestAdaptor())\n\td, ok := di.(*MCP3304Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMCP3304Driver() should have returned a *MCP3304Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MCP3304\"))\n}\n\nfunc TestMCP3304Halt(t *testing.T) {\n\t// arrange\n\td := NewMCP3304Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMCP3304Read(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanNum     int\n\t\tsimRead     []byte\n\t\twant        int\n\t\twantWritten []byte\n\t\twantErr     error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tchanNum: -1,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '-1' for read\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tchanNum:     0,\n\t\t\tsimRead:     []byte{0xFF, 0xFF, 0xFF},\n\t\t\twantWritten: []byte{0x0C, 0x00, 0x00},\n\t\t\twant:        0x0FFF,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tchanNum:     1,\n\t\t\tsimRead:     []byte{0xFF, 0xFE, 0xFF},\n\t\t\twantWritten: []byte{0x0C, 0x80, 0x00},\n\t\t\twant:        0x0EFF,\n\t\t},\n\t\t\"number_7_ok\": {\n\t\t\tchanNum:     7,\n\t\t\tsimRead:     []byte{0xFF, 0xF7, 0x65},\n\t\t\twantWritten: []byte{0x0F, 0x80, 0x00},\n\t\t\twant:        0x0765,\n\t\t},\n\t\t\"number_8_error\": {\n\t\t\tchanNum: 8,\n\t\t\twantErr: fmt.Errorf(\"invalid channel '8' for read\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, a := initTestMCP3304DriverWithStubbedAdaptor()\n\t\t\ta.spi.SetSimRead(tc.simRead)\n\t\t\t// act\n\t\t\tgot, err := d.Read(tc.chanNum)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.wantWritten, a.spi.Written())\n\t\t})\n\t}\n}\n\nfunc TestMCP3304ReadWithError(t *testing.T) {\n\t// arrange\n\td, a := initTestMCP3304DriverWithStubbedAdaptor()\n\ta.spi.SetReadError(true)\n\t// act\n\tgot, err := d.Read(0)\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI read in mock\")\n\tassert.Equal(t, 0, got)\n}\n"
  },
  {
    "path": "drivers/spi/mfrc522_driver.go",
    "content": "package spi\n\nimport (\n\t\"gobot.io/x/gobot/v2/drivers/common/mfrc522\"\n)\n\n// MFRC522Driver is a wrapper for SPI bus usage. Please refer to the mfrc522.MFRC522Common package\n// for implementation details.\ntype MFRC522Driver struct {\n\t*Driver\n\t*mfrc522.MFRC522Common\n}\n\n// NewMFRC522Driver creates a new Gobot Driver for MFRC522 RFID with SPI connection\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewMFRC522Driver(a Connector, options ...func(Config)) *MFRC522Driver {\n\td := &MFRC522Driver{\n\t\tDriver: NewDriver(a, \"MFRC522\"),\n\t}\n\td.MFRC522Common = mfrc522.NewMFRC522Common()\n\td.afterStart = d.initialize\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\nfunc (d *MFRC522Driver) initialize() error {\n\twrapper := &conWrapper{origCon: d.connection}\n\treturn d.Initialize(wrapper)\n}\n\n// this is necessary due to special behavior of shift bytes and set first bit\ntype conWrapper struct {\n\torigCon Connection\n}\n\nfunc (w *conWrapper) ReadByteData(reg uint8) (uint8, error) {\n\t// MSBit=1 for reading, LSBit not used for first byte (address/register)\n\treturn w.origCon.ReadByteData(0x80 | (reg << 1))\n}\n\nfunc (w *conWrapper) WriteByteData(reg uint8, val uint8) error {\n\t// LSBit not used for first byte (address/register)\n\treturn w.origCon.WriteByteData(reg<<1, val)\n}\n"
  },
  {
    "path": "drivers/spi/mfrc522_driver_test.go",
    "content": "package spi\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*MFRC522Driver)(nil)\n\nfunc initTestMFRC522DriverWithStubbedAdaptor() (*MFRC522Driver, *spiTestAdaptor) {\n\ta := newSpiTestAdaptor()\n\td := NewMFRC522Driver(a)\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\t// reset the written bytes during Start()\n\ta.spi.Reset()\n\treturn d, a\n}\n\nfunc TestNewMFRC522Driver(t *testing.T) {\n\tvar di interface{} = NewMFRC522Driver(newSpiTestAdaptor())\n\td, ok := di.(*MFRC522Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewMFRC522Driver() should have returned a *MFRC522Driver\")\n\t}\n\tassert.NotNil(t, d.Driver)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MFRC522\"))\n}\n\nfunc TestMFRC522Halt(t *testing.T) {\n\t// arrange\n\td := NewMFRC522Driver(newSpiTestAdaptor())\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMFRC522WriteByteData(t *testing.T) {\n\t// arrange\n\td, a := initTestMFRC522DriverWithStubbedAdaptor()\n\t// act\n\terr := d.connection.WriteByteData(0x00, 0x00)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte{0x00, 0x00}, a.spi.Written())\n}\n"
  },
  {
    "path": "drivers/spi/spi_config.go",
    "content": "package spi\n\ntype spiConfig struct {\n\tbus   int\n\tchip  int\n\tmode  int\n\tbits  int\n\tspeed int64\n}\n\n// NewConfig returns a new SPI Config.\nfunc NewConfig() Config {\n\treturn &spiConfig{\n\t\tbus:   NotInitialized,\n\t\tchip:  NotInitialized,\n\t\tmode:  NotInitialized,\n\t\tbits:  NotInitialized,\n\t\tspeed: NotInitialized,\n\t}\n}\n\n// WithBusNumber sets which bus to use as a optional param.\nfunc WithBusNumber(busNum int) func(Config) {\n\treturn func(s Config) {\n\t\ts.SetBusNumber(busNum)\n\t}\n}\n\n// WithChipNumber sets which chip to use as a optional param.\nfunc WithChipNumber(chipNum int) func(Config) {\n\treturn func(s Config) {\n\t\ts.SetChipNumber(chipNum)\n\t}\n}\n\n// WithMode sets which mode to use as a optional param.\nfunc WithMode(mode int) func(Config) {\n\treturn func(s Config) {\n\t\ts.SetMode(mode)\n\t}\n}\n\n// WithBitCount sets how many bits to use as a optional param.\nfunc WithBitCount(bitCount int) func(Config) {\n\treturn func(s Config) {\n\t\ts.SetBitCount(bitCount)\n\t}\n}\n\n// WithSpeed sets what speed to use as a optional param.\nfunc WithSpeed(speed int64) func(Config) {\n\treturn func(s Config) {\n\t\ts.SetSpeed(speed)\n\t}\n}\n\n// SetBusNumber sets preferred bus to use.\nfunc (s *spiConfig) SetBusNumber(bus int) {\n\ts.bus = bus\n}\n\n// GetBusNumberOrDefault returns which bus to use, either the one set using WithBus(),\n// or the default value which is passed in as the one param.\nfunc (s *spiConfig) GetBusNumberOrDefault(d int) int {\n\tif s.bus == NotInitialized {\n\t\treturn d\n\t}\n\treturn s.bus\n}\n\n// SetChipNumber sets preferred chip to use.\nfunc (s *spiConfig) SetChipNumber(chip int) {\n\ts.chip = chip\n}\n\n// GetChipNumberOrDefault returns which chip to use, either the one set using WithChip(),\n// or the default value which is passed in as the one param.\nfunc (s *spiConfig) GetChipNumberOrDefault(d int) int {\n\tif s.chip == NotInitialized {\n\t\treturn d\n\t}\n\treturn s.chip\n}\n\n// SetMode sets SPI mode to use.\nfunc (s *spiConfig) SetMode(mode int) {\n\ts.mode = mode\n}\n\n// GetModeOrDefault returns which mode to use, either the one set using WithChip(),\n// or the default value which is passed in as the one param.\nfunc (s *spiConfig) GetModeOrDefault(d int) int {\n\tif s.mode == NotInitialized {\n\t\treturn d\n\t}\n\treturn s.mode\n}\n\n// SetBitCount sets how many SPI bits to use.\nfunc (s *spiConfig) SetBitCount(bits int) {\n\ts.bits = bits\n}\n\n// GetBitCountOrDefault returns how many to use, either the one set using WithBits(),\n// or the default value which is passed in as the one param.\nfunc (s *spiConfig) GetBitCountOrDefault(d int) int {\n\tif s.bits == NotInitialized {\n\t\treturn d\n\t}\n\treturn s.bits\n}\n\n// SetSpeed sets which SPI speed to use.\nfunc (s *spiConfig) SetSpeed(speed int64) {\n\ts.speed = speed\n}\n\n// GetSpeedOrDefault returns what speed to use, either the one set using WithSpeed(),\n// or the default value which is passed in as the one param.\nfunc (s *spiConfig) GetSpeedOrDefault(d int64) int64 {\n\tif s.speed == NotInitialized {\n\t\treturn d\n\t}\n\treturn s.speed\n}\n"
  },
  {
    "path": "drivers/spi/spi_connection.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\tspiDebugByte  = false\n\tspiDebugBlock = false\n)\n\n// spiConnection is the common implementation of the SPI bus interface.\ntype spiConnection struct {\n\tspiSystem gobot.SpiSystemDevicer\n\tmutex     sync.Mutex\n}\n\n// NewConnection uses the given SPI system device and provides it as gobot.SpiOperations\n// and Implements gobot.BusOperations.\nfunc NewConnection(spiSystem gobot.SpiSystemDevicer) *spiConnection {\n\treturn &spiConnection{spiSystem: spiSystem}\n}\n\n// Close connection to underlying SPI device.\nfunc (c *spiConnection) Close() error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.spiSystem.Close()\n}\n\n// ReadCommandData uses the SPI device TX to send/receive data. Implements gobot.SpiOperations\n// On write command, the first byte normally contains the address and mode.\n// On read data, the return value is most likely one byte behind the command.\n// The length of command and data needs to be the same (except data is nil).\nfunc (c *spiConnection) ReadCommandData(command []byte, data []byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.txRxAndCheckReadLength(command, data)\n}\n\n// ReadByteData reads a byte from the given register of SPI device. Implements gobot.BusOperations.\nfunc (c *spiConnection) ReadByteData(reg uint8) (uint8, error) {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\tbuf := []byte{0x0}\n\tif err := c.readAlignedBlockData(reg, buf); err != nil {\n\t\treturn 0, err\n\t}\n\n\tif spiDebugByte {\n\t\tfmt.Printf(\"ReadByteData: register 0x%02X/0x%02X : 0x%02X %dd\\n\", reg, reg&0x7F>>1, buf[0], buf[0])\n\t}\n\treturn buf[0], nil\n}\n\n// ReadBlockData fills the given buffer with reads starting from the given register of SPI device.\n// Implements gobot.BusOperations.\nfunc (c *spiConnection) ReadBlockData(reg uint8, data []byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\tif err := c.readAlignedBlockData(reg, data); err != nil {\n\t\treturn err\n\t}\n\n\tif spiDebugBlock {\n\t\tfmt.Printf(\"ReadBlockData: register 0x%02X/0x%02X : %v\\n\", reg, reg&0x7F>>1, data)\n\t}\n\treturn nil\n}\n\n// WriteByte writes the given byte value to the current register of SPI device. Implements gobot.BusOperations.\nfunc (c *spiConnection) WriteByte(val byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.writeBytes([]byte{val})\n}\n\n// WriteByteData writes the given byte value to the given register of SPI device. Implements gobot.BusOperations.\nfunc (c *spiConnection) WriteByteData(reg byte, data byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.writeBytes([]byte{reg, data})\n}\n\n// WriteBlockData writes the given data starting from the given register of SPI device. Implements gobot.BusOperations.\nfunc (c *spiConnection) WriteBlockData(reg byte, data []byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\tbuf := make([]byte, len(data)+1)\n\tcopy(buf[1:], data)\n\tbuf[0] = reg\n\treturn c.writeBytes(buf)\n}\n\n// WriteBytes writes the given data starting from the current register of bus device. Implements gobot.BusOperations.\nfunc (c *spiConnection) WriteBytes(data []byte) error {\n\tc.mutex.Lock()\n\tdefer c.mutex.Unlock()\n\n\treturn c.writeBytes(data)\n}\n\nfunc (c *spiConnection) readAlignedBlockData(reg uint8, data []byte) error {\n\t// length of TX needs to equal length of RX\n\t// the read value is one cycle behind the write, so for n bytes to read, we need n+1 bytes (to read and write)\n\tbuflen := len(data) + 1\n\twriteBuf := make([]byte, buflen)\n\treadBuf := make([]byte, buflen)\n\twriteBuf[0] = reg\n\tif err := c.txRxAndCheckReadLength(writeBuf, readBuf); err != nil {\n\t\treturn err\n\t}\n\tcopy(data, readBuf[1:])\n\treturn nil\n}\n\nfunc (c *spiConnection) writeBytes(data []byte) error {\n\treturn c.txRxAndCheckReadLength(data, nil)\n}\n\nfunc (c *spiConnection) txRxAndCheckReadLength(tx []byte, rx []byte) error {\n\tdataLen := len(rx)\n\tif err := c.spiSystem.TxRx(tx, rx); err != nil {\n\t\treturn err\n\t}\n\tif len(rx) != dataLen {\n\t\treturn fmt.Errorf(\"read length (%d) differ to expected (%d)\", len(rx), dataLen)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "drivers/spi/spi_connection_test.go",
    "content": "package spi\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nvar _ gobot.SpiOperations = (*spiConnection)(nil)\n\nfunc initTestConnectionWithMockedSystem() (Connection, *system.MockSpiAccess) {\n\ta := system.NewAccesser()\n\tsysdev := a.UseMockSpi()\n\tconst (\n\t\tbusNum   = 15\n\t\tchipNum  = 14\n\t\tmode     = 13\n\t\tbits     = 12\n\t\tmaxSpeed = int64(11)\n\t)\n\td, err := a.NewSpiDevice(busNum, chipNum, mode, bits, maxSpeed)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tc := NewConnection(d)\n\treturn c, sysdev\n}\n\nfunc TestReadCommandData(t *testing.T) {\n\t// arrange\n\tcommand := []byte{0x11, 0x12}\n\twant := []byte{0x31, 0x32}\n\tc, sysdev := initTestConnectionWithMockedSystem()\n\tsysdev.SetSimRead(want)\n\t// act\n\tgot := []byte{0x01, 0x02}\n\terr := c.ReadCommandData(command, got)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, command, sysdev.Written())\n\tassert.Equal(t, want, got)\n}\n\nfunc TestReadByteData(t *testing.T) {\n\t// arrange\n\tconst (\n\t\treg  = 0x15\n\t\twant = uint8(0x41)\n\t)\n\tc, sysdev := initTestConnectionWithMockedSystem()\n\tsysdev.SetSimRead([]byte{0x00, want}) // the answer is one cycle behind\n\t// act\n\tgot, err := c.ReadByteData(reg)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte{reg, 0x00}, sysdev.Written()) // for read register we need n+1 bytes\n\tassert.Equal(t, want, got)\n}\n\nfunc TestReadBlockData(t *testing.T) {\n\t// arrange\n\tconst (\n\t\treg = 0x16\n\t)\n\twant := []byte{42, 24, 56, 65}\n\tc, sysdev := initTestConnectionWithMockedSystem()\n\tsysdev.SetSimRead(append([]byte{0x00}, want...)) // the answer is one cycle behind\n\t// act\n\tgot := make([]byte, 4)\n\terr := c.ReadBlockData(reg, got)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte{reg, 0x00, 0x00, 0x00, 0x00}, sysdev.Written()) // for read registers we need n+1 bytes\n\tassert.Equal(t, want, got)\n}\n\nfunc TestWriteByte(t *testing.T) {\n\t// arrange\n\tconst want = 0x02\n\tc, sysdev := initTestConnectionWithMockedSystem()\n\t// act\n\terr := c.WriteByte(want)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte{want}, sysdev.Written())\n}\n\nfunc TestWriteByteData(t *testing.T) {\n\t// arrange\n\tconst (\n\t\treg = 0x22\n\t\tval = 0x33\n\t)\n\tc, sysdev := initTestConnectionWithMockedSystem()\n\t// act\n\terr := c.WriteByteData(reg, val)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte{reg, val}, sysdev.Written())\n}\n\nfunc TestWriteBlockData(t *testing.T) {\n\t// arrange\n\tconst reg = 0x33\n\tdata := []byte{0x22, 0x11}\n\tc, sysdev := initTestConnectionWithMockedSystem()\n\t// act\n\terr := c.WriteBlockData(reg, data)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, append([]byte{reg}, data...), sysdev.Written())\n}\n\nfunc TestWriteBytes(t *testing.T) {\n\t// arrange\n\twant := []byte{0x03}\n\tc, sysdev := initTestConnectionWithMockedSystem()\n\t// act\n\terr := c.WriteBytes(want)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, want, sysdev.Written())\n}\n"
  },
  {
    "path": "drivers/spi/spi_driver.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// NotInitialized is the initial value for a bus/chip\n\tNotInitialized = -1\n)\n\n// Connector lets adaptors provide the interface for Drivers\n// to get access to the SPI buses on platforms that support SPI.\ntype Connector interface {\n\t// GetSpiConnection returns a connection to a SPI device at the specified bus and chip.\n\t// Bus numbering starts at index 0, the range of valid buses is\n\t// platform specific. Same with chip numbering.\n\tGetSpiConnection(busNum, chip, mode, bits int, maxSpeed int64) (device Connection, err error)\n\n\t// SpiDefaultBusNumber returns the default SPI bus index\n\tSpiDefaultBusNumber() int\n\n\t// SpiDefaultChipNumber returns the default SPI chip index\n\tSpiDefaultChipNumber() int\n\n\t// DefaultMode returns the default SPI mode (0/1/2/3)\n\tSpiDefaultMode() int\n\n\t// SpiDefaultBitCount returns the default SPI number of bits (8)\n\tSpiDefaultBitCount() int\n\n\t// SpiDefaultMaxSpeed returns the max SPI speed\n\tSpiDefaultMaxSpeed() int64\n}\n\n// Connection is a connection to a SPI device with a specific bus/chip.\n// Provided by an Adaptor, usually just by calling the spi package's GetSpiConnection() function.\ntype Connection gobot.SpiOperations\n\n// Config is the interface which describes how a Driver can specify\n// optional SPI params such as which SPI bus it wants to use.\ntype Config interface {\n\t// SetBusNumber sets which bus to use\n\tSetBusNumber(bus int)\n\n\t// GetBusNumberOrDefault gets which bus to use\n\tGetBusNumberOrDefault(def int) int\n\n\t// SetChipNumber sets which chip to use\n\tSetChipNumber(chip int)\n\n\t// GetChipNumberOrDefault gets which chip to use\n\tGetChipNumberOrDefault(def int) int\n\n\t// SetMode sets which mode to use\n\tSetMode(mode int)\n\n\t// GetModeOrDefault gets which mode to use\n\tGetModeOrDefault(def int) int\n\n\t// SetUsedBits sets how many bits to use\n\tSetBitCount(count int)\n\n\t// GetBitCountOrDefault gets how many bits to use\n\tGetBitCountOrDefault(def int) int\n\n\t// SetSpeed sets which speed to use (in Hz)\n\tSetSpeed(speed int64)\n\n\t// GetSpeedOrDefault gets which speed to use (in Hz)\n\tGetSpeedOrDefault(def int64) int64\n}\n\n// Driver implements the interface gobot.Driver for SPI devices.\ntype Driver struct {\n\tConfig\n\tgobot.Commander\n\n\tname       string\n\tconnector  Connector\n\tconnection Connection\n\tafterStart func() error\n\tbeforeHalt func() error\n\tmutex      sync.Mutex\n}\n\n// NewDriver creates a new generic and basic SPI gobot driver.\nfunc NewDriver(a Connector, name string, options ...func(Config)) *Driver {\n\td := &Driver{\n\t\tname:       gobot.DefaultName(name),\n\t\tconnector:  a,\n\t\tafterStart: func() error { return nil },\n\t\tbeforeHalt: func() error { return nil },\n\t\tConfig:     NewConfig(),\n\t\tCommander:  gobot.NewCommander(),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Name returns the name of the SPI device.\nfunc (d *Driver) Name() string { return d.name }\n\n// SetName sets the name of the SPI device.\nfunc (d *Driver) SetName(n string) { d.name = n }\n\n// Connection returns the gobot connection of the SPI device.\nfunc (d *Driver) Connection() gobot.Connection {\n\tif d.connector == nil {\n\t\tlog.Printf(\"%s has no connector\\n\", d.name)\n\t\treturn nil\n\t}\n\n\tif conn, ok := d.connector.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.name)\n\treturn nil\n}\n\n// Start initializes the driver.\nfunc (d *Driver) Start() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif d.connector == nil {\n\t\treturn fmt.Errorf(\"%s has no connector\", d.name)\n\t}\n\n\tbus := d.GetBusNumberOrDefault(d.connector.SpiDefaultBusNumber())\n\tchip := d.GetChipNumberOrDefault(d.connector.SpiDefaultChipNumber())\n\tmode := d.GetModeOrDefault(d.connector.SpiDefaultMode())\n\tbits := d.GetBitCountOrDefault(d.connector.SpiDefaultBitCount())\n\tmaxSpeed := d.GetSpeedOrDefault(d.connector.SpiDefaultMaxSpeed())\n\n\tvar err error\n\td.connection, err = d.connector.GetSpiConnection(bus, chip, mode, bits, maxSpeed)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn d.afterStart()\n}\n\n// Halt stops the driver.\nfunc (d *Driver) Halt() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.beforeHalt(); err != nil {\n\t\treturn err\n\t}\n\n\td.connection = nil\n\n\t// currently there is nothing to do here for the driver, the connection is cached on adaptor side\n\t// and will be closed on adaptor Finalize()\n\treturn nil\n}\n\nfunc (d *Driver) readCommandData(command []byte, data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"spi driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.ReadCommandData(command, data)\n}\n\n//nolint:unused // ok for now\nfunc (d *Driver) readByteData(reg uint8) (uint8, error) {\n\tif d.connection == nil {\n\t\treturn 0, fmt.Errorf(\"spi driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.ReadByteData(reg)\n}\n\n//nolint:unused // ok for now\nfunc (d *Driver) readBlockData(reg uint8, data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"spi driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.ReadBlockData(reg, data)\n}\n\nfunc (d *Driver) writeByte(val byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"spi driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteByte(val)\n}\n\n//nolint:unused // ok for now\nfunc (d *Driver) writeByteData(reg byte, data byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"spi driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteByteData(reg, data)\n}\n\nfunc (d *Driver) writeBlockData(reg byte, data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"spi driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteBlockData(reg, data)\n}\n\nfunc (d *Driver) writeBytes(data []byte) error {\n\tif d.connection == nil {\n\t\treturn fmt.Errorf(\"spi driver not started for '%s'\", d.name)\n\t}\n\n\treturn d.connection.WriteBytes(data)\n}\n"
  },
  {
    "path": "drivers/spi/spi_driver_test.go",
    "content": "package spi\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestDriverWithStubbedAdaptor() (*Driver, *spiTestAdaptor) { //nolint:unparam // keep for further tests\n\ta := newSpiTestAdaptor()\n\td := NewDriver(a, \"SPI_BASIC\")\n\tif err := d.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn d, a\n}\n\nfunc TestNewDriver(t *testing.T) {\n\tvar di interface{} = NewDriver(newSpiTestAdaptor(), \"SPI_BASIC\")\n\td, ok := di.(*Driver)\n\tif !ok {\n\t\trequire.Fail(t, \"NewDriver() should have returned a *Driver\")\n\t}\n\tassert.True(t, strings.HasPrefix(d.Name(), \"SPI_BASIC\"))\n}\n\nfunc TestStart(t *testing.T) {\n\td := NewDriver(newSpiTestAdaptor(), \"SPI_BASIC\")\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestHalt(t *testing.T) {\n\t// arrange\n\td := NewDriver(newSpiTestAdaptor(), \"SPI_BASIC\")\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestSetName(t *testing.T) {\n\t// arrange\n\td, _ := initTestDriverWithStubbedAdaptor()\n\t// act\n\td.SetName(\"TESTME\")\n\t// assert\n\tassert.Equal(t, \"TESTME\", d.Name())\n}\n\nfunc TestConnection(t *testing.T) {\n\td, _ := initTestDriverWithStubbedAdaptor()\n\tassert.NotNil(t, d.Connection())\n}\n"
  },
  {
    "path": "drivers/spi/ssd1306_driver.go",
    "content": "package spi\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n)\n\nconst (\n\t// default values\n\tssd1306Width        = 128\n\tssd1306Height       = 64\n\tssd1306DcPin        = \"16\" // for raspberry pi\n\tssd1306RstPin       = \"18\" // for raspberry pi\n\tssd1306ExternalVcc  = false\n\tssd1306SetStartLine = 0x40\n\t// fundamental commands\n\tssd1306SetContrast          = 0x81\n\tssd1306DisplayOnResumeToRAM = 0xA4\n\tssd1306DisplayOnResume      = 0xA5\n\tssd1306SetDisplayNormal     = 0xA6\n\tssd1306SetDisplayInverse    = 0xA7\n\tssd1306SetDisplayOff        = 0xAE\n\tssd1306SetDisplayOn         = 0xAF\n\t// scrolling commands\n\tssd1306RightHorizontalScroll            = 0x26\n\tssd1306LeftHorizontalScroll             = 0x27\n\tssd1306VerticalAndRightHorizontalScroll = 0x29\n\tssd1306VerticalAndLeftHorizontalScroll  = 0x2A\n\tssd1306DeactivateScroll                 = 0x2E\n\tssd1306ActivateScroll                   = 0x2F\n\tssd1306SetVerticalScrollArea            = 0xA3\n\t// addressing settings commands\n\tssd1306SetMemoryAddressingMode = 0x20\n\tssd1306ColumnAddr              = 0x21\n\tssd1306PageAddr                = 0x22\n\t// hardware configuration commands\n\tssd1306SetSegmentRemap0   = 0xA0\n\tssd1306SetSegmentRemap127 = 0xA1\n\tssd1306SetMultiplexRatio  = 0xA8\n\tssd1306ComScanInc         = 0xC0\n\tssd1306ComScanDec         = 0xC8\n\tssd1306SetDisplayOffset   = 0xD3\n\tssd1306SetComPins         = 0xDA\n\t// timing and driving scheme commands\n\tssd1306SetDisplayClock      = 0xD5\n\tssd1306SetPrechargePeriod   = 0xD9\n\tssd1306SetVComDeselectLevel = 0xDB\n\tssd1306NOOP                 = 0xE3\n\t// charge pump command\n\tssd1306ChargePumpSetting = 0x8D\n)\n\n// DisplayBuffer represents the display buffer intermediate memory\ntype DisplayBuffer struct {\n\twidth, height, pageSize int\n\tbuffer                  []byte\n}\n\n// NewDisplayBuffer creates a new DisplayBuffer\nfunc NewDisplayBuffer(width, height, pageSize int) *DisplayBuffer {\n\td := &DisplayBuffer{\n\t\twidth:    width,\n\t\theight:   height,\n\t\tpageSize: pageSize,\n\t}\n\td.buffer = make([]byte, d.Size())\n\treturn d\n}\n\n// Size returns the memory size of the display buffer\nfunc (d *DisplayBuffer) Size() int {\n\treturn (d.width * d.height) / d.pageSize\n}\n\n// Clear the contents of the display buffer\nfunc (d *DisplayBuffer) Clear() {\n\td.buffer = make([]byte, d.Size())\n}\n\n// SetPixel sets the x, y pixel with c color\nfunc (d *DisplayBuffer) SetPixel(x, y, c int) {\n\tidx := x + (y/d.pageSize)*d.width\n\tbit := uint(y) % uint(d.pageSize) //nolint:gosec // TODO: fix later\n\tif c == 0 {\n\t\td.buffer[idx] &= ^(1 << bit)\n\t} else {\n\t\td.buffer[idx] |= (1 << bit)\n\t}\n}\n\n// Set sets the display buffer with the given buffer\nfunc (d *DisplayBuffer) Set(buf []byte) {\n\td.buffer = buf\n}\n\n// SSD1306Driver is a Gobot Driver for a SSD1306 Display\ntype SSD1306Driver struct {\n\t*Driver\n\n\tdcDriver      *gpio.DirectPinDriver\n\trstDriver     *gpio.DirectPinDriver\n\tpageSize      int\n\tDisplayWidth  int\n\tDisplayHeight int\n\tDCPin         string\n\tRSTPin        string\n\tExternalVcc   bool\n\tbuffer        *DisplayBuffer\n}\n\n// NewSSD1306Driver creates a new SSD1306Driver.\n//\n// Params:\n//\n//\tconn Connector - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\n//\t spi.WithDisplayWidth(int): \twidth of display (defaults to 128)\n//\t spi.WithDisplayHeight(int): height of display (defaults to 64)\n//\t spi.WithDCPin(string): \t\tgpio pin number connected to dc pin on display (defaults to \"16\")\n//\t spi.WithRstPin(string): \tgpio pin number connected to rst pin on display (defaults to \"18\")\n//\t spi.WithExternalVCC(bool): \tset to true if using external vcc (defaults to false)\nfunc NewSSD1306Driver(a gobot.Adaptor, options ...func(Config)) *SSD1306Driver {\n\t// cast adaptor to spi connector since we also need the adaptor for gpio\n\tb, ok := a.(Connector)\n\tif !ok {\n\t\tpanic(\"unable to get gobot connector for ssd1306\")\n\t}\n\td := &SSD1306Driver{\n\t\tDriver:        NewDriver(b, \"SSD1306\"),\n\t\tDisplayWidth:  ssd1306Width,\n\t\tDisplayHeight: ssd1306Height,\n\t\tDCPin:         ssd1306DcPin,\n\t\tRSTPin:        ssd1306RstPin,\n\t\tExternalVcc:   ssd1306ExternalVcc,\n\t}\n\td.afterStart = d.initialize\n\td.beforeHalt = d.shutdown\n\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\td.dcDriver = gpio.NewDirectPinDriver(a, d.DCPin)\n\td.rstDriver = gpio.NewDirectPinDriver(a, d.RSTPin)\n\td.pageSize = d.DisplayHeight / 8\n\td.buffer = NewDisplayBuffer(d.DisplayWidth, d.DisplayHeight, d.pageSize)\n\td.AddCommand(\"Display\", func(_ map[string]interface{}) interface{} {\n\t\terr := d.Display()\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"On\", func(_ map[string]interface{}) interface{} {\n\t\terr := d.On()\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"Off\", func(_ map[string]interface{}) interface{} {\n\t\terr := d.Off()\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\td.AddCommand(\"Clear\", func(_ map[string]interface{}) interface{} {\n\t\terr := d.Clear()\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"SetContrast\", func(params map[string]interface{}) interface{} {\n\t\tcontrast := params[\"contrast\"].(byte)\n\t\terr := d.SetContrast(contrast)\n\t\treturn map[string]interface{}{\"err\": err}\n\t})\n\t//nolint:forcetypeassert // ok here\n\td.AddCommand(\"Set\", func(params map[string]interface{}) interface{} {\n\t\tx := params[\"x\"].(int)\n\t\ty := params[\"y\"].(int)\n\t\tc := params[\"c\"].(int)\n\t\td.Set(x, y, c)\n\t\treturn nil\n\t})\n\treturn d\n}\n\n// WithDisplayWidth option sets the SSD1306Driver DisplayWidth option.\nfunc WithDisplayWidth(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.DisplayWidth = val\n\t\t} else {\n\t\t\tpanic(\"unable to set display width for ssd1306\")\n\t\t}\n\t}\n}\n\n// WithDisplayHeight option sets the SSD1306Driver DisplayHeight option.\nfunc WithDisplayHeight(val int) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.DisplayHeight = val\n\t\t} else {\n\t\t\tpanic(\"unable to set display height for ssd1306\")\n\t\t}\n\t}\n}\n\n// WithDCPin option sets the SSD1306Driver DC Pin option.\nfunc WithDCPin(val string) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.DCPin = val\n\t\t} else {\n\t\t\tpanic(\"unable to set dc pin for ssd1306\")\n\t\t}\n\t}\n}\n\n// WithRstPin option sets the SSD1306Driver RST pin option.\nfunc WithRstPin(val string) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.RSTPin = val\n\t\t} else {\n\t\t\tpanic(\"unable to set rst pin for ssd1306\")\n\t\t}\n\t}\n}\n\n// WithExternalVCC option sets the SSD1306Driver external vcc option.\nfunc WithExternalVCC(val bool) func(Config) {\n\treturn func(c Config) {\n\t\td, ok := c.(*SSD1306Driver)\n\t\tif ok {\n\t\t\td.ExternalVcc = val\n\t\t} else {\n\t\t\tpanic(\"unable to set rst pin for ssd1306\")\n\t\t}\n\t}\n}\n\n// On turns on the display.\nfunc (d *SSD1306Driver) On() error {\n\treturn d.command(ssd1306SetDisplayOn)\n}\n\n// Off turns off the display.\nfunc (d *SSD1306Driver) Off() error {\n\treturn d.command(ssd1306SetDisplayOff)\n}\n\n// Clear clears the display buffer.\nfunc (d *SSD1306Driver) Clear() error {\n\td.buffer.Clear()\n\treturn nil\n}\n\n// Set sets a pixel in the display buffer.\nfunc (d *SSD1306Driver) Set(x, y, c int) {\n\td.buffer.SetPixel(x, y, c)\n}\n\n// Reset re-initializes the device to a clean state.\nfunc (d *SSD1306Driver) Reset() error {\n\tif err := d.rstDriver.DigitalWrite(1); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tif err := d.rstDriver.DigitalWrite(0); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tif err := d.rstDriver.DigitalWrite(1); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// SetBufferAndDisplay sets the display buffer with the given buffer and displays the image.\nfunc (d *SSD1306Driver) SetBufferAndDisplay(buf []byte) error {\n\td.buffer.Set(buf)\n\treturn d.Display()\n}\n\n// SetContrast sets the display contrast (0-255).\nfunc (d *SSD1306Driver) SetContrast(contrast byte) error {\n\tif err := d.command(ssd1306SetContrast); err != nil {\n\t\treturn err\n\t}\n\treturn d.command(contrast)\n}\n\n// Display sends the memory buffer to the display.\nfunc (d *SSD1306Driver) Display() error {\n\tif err := d.command(ssd1306ColumnAddr); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(0); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := d.command(uint8(d.DisplayWidth) - 1); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306PageAddr); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(0); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := d.command(uint8(d.pageSize) - 1); err != nil {\n\t\treturn err\n\t}\n\tif err := d.dcDriver.DigitalWrite(1); err != nil {\n\t\treturn err\n\t}\n\treturn d.writeBlockData(0x40, d.buffer.buffer)\n}\n\n// ShowImage takes a standard Go image and shows it on the display in monochrome.\nfunc (d *SSD1306Driver) ShowImage(img image.Image) error {\n\tif img.Bounds().Dx() != d.DisplayWidth || img.Bounds().Dy() != d.DisplayHeight {\n\t\treturn fmt.Errorf(\"image must match the display width and height\")\n\t}\n\n\tif err := d.Clear(); err != nil {\n\t\treturn err\n\t}\n\tfor y, w, h := 0, img.Bounds().Dx(), img.Bounds().Dy(); y < h; y++ {\n\t\tfor x := 0; x < w; x++ {\n\t\t\tc := img.At(x, y)\n\t\t\tif r, g, b, _ := c.RGBA(); r > 0 || g > 0 || b > 0 {\n\t\t\t\td.Set(x, y, 1)\n\t\t\t}\n\t\t}\n\t}\n\treturn d.Display()\n}\n\n// command sends a unique command\nfunc (d *SSD1306Driver) command(b byte) error {\n\tif err := d.dcDriver.DigitalWrite(0); err != nil {\n\t\treturn err\n\t}\n\treturn d.writeByte(b)\n}\n\n// initialize configures the ssd1306 based on the options passed in when the driver was created\nfunc (d *SSD1306Driver) initialize() error {\n\tif err := d.command(ssd1306SetDisplayOff); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306SetDisplayClock); err != nil {\n\t\treturn err\n\t}\n\tif d.DisplayHeight == 16 {\n\t\tif err := d.command(0x60); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif err := d.command(0x80); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := d.command(ssd1306SetMultiplexRatio); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := d.command(uint8(d.DisplayHeight) - 1); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306SetDisplayOffset); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(0x0); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306SetStartLine); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(0x0); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306ChargePumpSetting); err != nil {\n\t\treturn err\n\t}\n\tif d.ExternalVcc {\n\t\tif err := d.command(0x10); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif err := d.command(0x14); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := d.command(ssd1306SetMemoryAddressingMode); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(0x00); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306SetSegmentRemap0); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(0x01); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306ComScanInc); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306SetComPins); err != nil {\n\t\treturn err\n\t}\n\tif d.DisplayHeight == 64 {\n\t\tif err := d.command(0x12); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif err := d.command(0x02); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := d.command(ssd1306SetContrast); err != nil {\n\t\treturn err\n\t}\n\tif d.DisplayHeight == 64 {\n\t\tif d.ExternalVcc {\n\t\t\tif err := d.command(0x9F); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif err := d.command(0xCF); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif err := d.command(0x8F); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := d.command(ssd1306SetPrechargePeriod); err != nil {\n\t\treturn err\n\t}\n\tif d.ExternalVcc {\n\t\tif err := d.command(0x22); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif err := d.command(0xF1); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := d.command(ssd1306SetVComDeselectLevel); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(0x40); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306DisplayOnResumeToRAM); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306SetDisplayNormal); err != nil {\n\t\treturn err\n\t}\n\tif err := d.command(ssd1306DeactivateScroll); err != nil {\n\t\treturn err\n\t}\n\treturn d.command(ssd1306SetDisplayOn)\n}\n\nfunc (d *SSD1306Driver) shutdown() error {\n\tif d.connection == nil {\n\t\t// not started yet\n\t\treturn nil\n\t}\n\n\tif err := d.Reset(); err != nil {\n\t\treturn err\n\t}\n\treturn d.Off()\n}\n"
  },
  {
    "path": "drivers/spi/ssd1306_driver_test.go",
    "content": "package spi\n\nimport (\n\t\"image\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// this ensures that the implementation is based on spi.Driver, which implements the gobot.Driver\n// and tests all implementations, so no further tests needed here for gobot.Driver interface\nvar _ gobot.Driver = (*SSD1306Driver)(nil)\n\nfunc initTestSSDDriver() *SSD1306Driver {\n\treturn NewSSD1306Driver(newGpioTestAdaptor())\n}\n\nfunc TestDriverSSDStart(t *testing.T) {\n\td := initTestSSDDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestDriverSSDHalt(t *testing.T) {\n\t// arrange\n\td := initTestSSDDriver()\n\t// act, assert\n\trequire.NoError(t, d.Halt()) // must be idempotent\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestDriverSSDDisplay(t *testing.T) {\n\td := initTestSSDDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.Display())\n}\n\nfunc TestSSD1306DriverShowImage(t *testing.T) {\n\td := initTestSSDDriver()\n\t_ = d.Start()\n\timg := image.NewRGBA(image.Rect(0, 0, 640, 480))\n\trequire.ErrorContains(t, d.ShowImage(img), \"image must match the display width and height\")\n\n\timg = image.NewRGBA(image.Rect(0, 0, 128, 64))\n\trequire.NoError(t, d.ShowImage(img))\n}\n\ntype gpioTestAdaptor struct {\n\tConnector\n\n\tname string\n\tport string\n\tmtx  sync.Mutex\n\n\tdigitalWriteFunc func() error\n\tservoWriteFunc   func() error\n\tpwmWriteFunc     func() error\n\tanalogReadFunc   func() (val int, err error)\n\tdigitalReadFunc  func() (val int, err error)\n}\n\nfunc (t *gpioTestAdaptor) ServoWrite(string, byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.servoWriteFunc()\n}\n\nfunc (t *gpioTestAdaptor) PwmWrite(string, byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.pwmWriteFunc()\n}\n\nfunc (t *gpioTestAdaptor) AnalogRead(string) (int, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.analogReadFunc()\n}\n\nfunc (t *gpioTestAdaptor) DigitalRead(string) (int, error) {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.digitalReadFunc()\n}\n\nfunc (t *gpioTestAdaptor) DigitalWrite(string, byte) error {\n\tt.mtx.Lock()\n\tdefer t.mtx.Unlock()\n\treturn t.digitalWriteFunc()\n}\nfunc (t *gpioTestAdaptor) Connect() error   { return nil }\nfunc (t *gpioTestAdaptor) Finalize() error  { return nil }\nfunc (t *gpioTestAdaptor) Name() string     { return t.name }\nfunc (t *gpioTestAdaptor) SetName(n string) { t.name = n }\nfunc (t *gpioTestAdaptor) Port() string     { return t.port }\n\nfunc newGpioTestAdaptor() *gpioTestAdaptor {\n\ta := newSpiTestAdaptor()\n\treturn &gpioTestAdaptor{\n\t\tport: \"/dev/null\",\n\t\tdigitalWriteFunc: func() error {\n\t\t\treturn nil\n\t\t},\n\t\tservoWriteFunc: func() error {\n\t\t\treturn nil\n\t\t},\n\t\tpwmWriteFunc: func() error {\n\t\t\treturn nil\n\t\t},\n\t\tanalogReadFunc: func() (int, error) {\n\t\t\treturn 99, nil\n\t\t},\n\t\tdigitalReadFunc: func() (int, error) {\n\t\t\treturn 1, nil\n\t\t},\n\t\tConnector: a,\n\t}\n}\n"
  },
  {
    "path": "event.go",
    "content": "package gobot\n\n// Event represents when something asynchronous happens in a Driver\n// or Adaptor\ntype Event struct {\n\tName string\n\tData interface{}\n}\n\n// NewEvent returns a new Event and its associated data.\nfunc NewEvent(name string, data interface{}) *Event {\n\treturn &Event{Name: name, Data: data}\n}\n"
  },
  {
    "path": "eventer.go",
    "content": "package gobot\n\nimport \"sync\"\n\ntype eventChannel chan *Event\n\ntype eventer struct {\n\t// map of valid Event names\n\teventnames map[string]string\n\n\t// new events get put in to the event channel\n\tin eventChannel\n\n\t// map of out channels used by subscribers\n\touts map[eventChannel]eventChannel\n\n\t// mutex to protect the eventChannel map\n\teventsMutex sync.Mutex\n}\n\nconst eventChanBufferSize = 10\n\n// Eventer is the interface which describes how a Driver or Adaptor\n// handles events.\ntype Eventer interface {\n\t// Events returns the map of valid Event names.\n\tEvents() (eventnames map[string]string)\n\n\t// Event returns an Event string from map of valid Event names.\n\t// Mostly used to validate that an Event name is valid.\n\tEvent(name string) string\n\n\t// AddEvent registers a new Event name.\n\tAddEvent(name string)\n\n\t// DeleteEvent removes a previously registered Event name.\n\tDeleteEvent(name string)\n\n\t// Publish new events to any subscriber\n\tPublish(name string, data interface{})\n\n\t// Subscribe to events\n\tSubscribe() (events eventChannel)\n\n\t// Unsubscribe from an event channel\n\tUnsubscribe(events eventChannel)\n\n\t// Event handler\n\tOn(name string, f func(s interface{})) error\n\n\t// Event handler, only executes one time\n\tOnce(name string, f func(s interface{})) error\n}\n\n// NewEventer returns a new Eventer.\nfunc NewEventer() Eventer {\n\tevtr := &eventer{\n\t\teventnames: make(map[string]string),\n\t\tin:         make(eventChannel, eventChanBufferSize),\n\t\touts:       make(map[eventChannel]eventChannel),\n\t}\n\n\t// goroutine to cascade \"in\" events to all \"out\" event channels\n\tgo func() {\n\t\tfor {\n\t\t\tevt := <-evtr.in\n\t\t\tevtr.eventsMutex.Lock()\n\t\t\tfor _, out := range evtr.outs {\n\t\t\t\tout <- evt\n\t\t\t}\n\t\t\tevtr.eventsMutex.Unlock()\n\t\t}\n\t}()\n\n\treturn evtr\n}\n\n// Events returns the map of valid Event names.\nfunc (e *eventer) Events() map[string]string {\n\treturn e.eventnames\n}\n\n// Event returns an Event string from map of valid Event names.\n// Mostly used to validate that an Event name is valid.\nfunc (e *eventer) Event(name string) string {\n\treturn e.eventnames[name]\n}\n\n// AddEvent registers a new Event name.\nfunc (e *eventer) AddEvent(name string) {\n\te.eventnames[name] = name\n}\n\n// DeleteEvent removes a previously registered Event name.\nfunc (e *eventer) DeleteEvent(name string) {\n\tdelete(e.eventnames, name)\n}\n\n// Publish new events to anyone that is subscribed\nfunc (e *eventer) Publish(name string, data interface{}) {\n\tevt := NewEvent(name, data)\n\te.in <- evt\n}\n\n// Subscribe to any events from this eventer\nfunc (e *eventer) Subscribe() eventChannel {\n\te.eventsMutex.Lock()\n\tdefer e.eventsMutex.Unlock()\n\tout := make(eventChannel, eventChanBufferSize)\n\te.outs[out] = out\n\treturn out\n}\n\n// Unsubscribe from the event channel\nfunc (e *eventer) Unsubscribe(events eventChannel) {\n\te.eventsMutex.Lock()\n\tdefer e.eventsMutex.Unlock()\n\tdelete(e.outs, events)\n}\n\n// On executes the event handler f when e is Published to.\nfunc (e *eventer) On(n string, f func(s interface{})) error {\n\tout := e.Subscribe()\n\tgo func() {\n\t\tfor {\n\t\t\tevt := <-out\n\t\t\tif evt.Name == n {\n\t\t\t\tf(evt.Data)\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil\n}\n\n// Once is similar to On except that it only executes f one time.\nfunc (e *eventer) Once(n string, f func(s interface{})) error {\n\tout := e.Subscribe()\n\tgo func() {\n\tProcessEvents:\n\t\tfor evt := range out {\n\t\t\tif evt.Name == n {\n\t\t\t\tf(evt.Data)\n\t\t\t\te.Unsubscribe(out)\n\t\t\t\tbreak ProcessEvents\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil\n}\n"
  },
  {
    "path": "eventer_test.go",
    "content": "package gobot\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestEventerAddEvent(t *testing.T) {\n\te := NewEventer()\n\te.AddEvent(\"test\")\n\n\tif _, ok := e.Events()[\"test\"]; !ok {\n\t\trequire.Fail(t, \"Could not add event to list of Event names\")\n\t}\n\tassert.Equal(t, \"test\", e.Event(\"test\"))\n\tassert.Empty(t, e.Event(\"unknown\"))\n}\n\nfunc TestEventerDeleteEvent(t *testing.T) {\n\te := NewEventer()\n\te.AddEvent(\"test1\")\n\te.DeleteEvent(\"test1\")\n\n\tif _, ok := e.Events()[\"test1\"]; ok {\n\t\trequire.Fail(t, \"Could not add delete event from list of Event names\")\n\t}\n}\n\nfunc TestEventerOn(t *testing.T) {\n\te := NewEventer()\n\n\tsem := make(chan bool)\n\t_ = e.On(\"test\", func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\t// wait some time to ensure the eventer go routine is working\n\ttime.Sleep(10 * time.Millisecond)\n\n\te.Publish(\"test\", true)\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(10 * time.Millisecond):\n\t\trequire.Fail(t, \"On was not called\")\n\t}\n}\n\nfunc TestEventerOnce(t *testing.T) {\n\te := NewEventer()\n\n\tsem := make(chan bool)\n\t_ = e.Once(\"test\", func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\t// wait some time to ensure the eventer go routine is working\n\ttime.Sleep(10 * time.Millisecond)\n\n\te.Publish(\"test\", true)\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(10 * time.Millisecond):\n\t\trequire.Fail(t, \"Once was not called\")\n\t}\n\n\te.Publish(\"test\", true)\n\n\tselect {\n\tcase <-sem:\n\t\trequire.Fail(t, \"Once was called twice\")\n\tcase <-time.After(10 * time.Millisecond):\n\t}\n}\n"
  },
  {
    "path": "examples/ardrone.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/ardrone\"\n)\n\nfunc main() {\n\tardroneAdaptor := ardrone.NewAdaptor()\n\tdrone := ardrone.NewDriver(ardroneAdaptor)\n\n\twork := func() {\n\t\t_ = drone.On(ardrone.Flying, func(data interface{}) {\n\t\t\tgobot.After(3*time.Second, func() {\n\t\t\t\tdrone.Land()\n\t\t\t})\n\t\t})\n\t\tdrone.TakeOff()\n\t}\n\n\trobot := gobot.NewRobot(\"drone\",\n\t\t[]gobot.Connection{ardroneAdaptor},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/ardrone_face_tracking.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"math\"\n\t\"path\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/opencv\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/ardrone\"\n\t\"gocv.io/x/gocv\"\n)\n\nfunc main() {\n\truntime.GOMAXPROCS(runtime.NumCPU())\n\n\t_, currentfile, _, _ := runtime.Caller(0)\n\tcascade := path.Join(path.Dir(currentfile), \"haarcascade_frontalface_alt.xml\")\n\twindow := opencv.NewWindowDriver()\n\tcamera := opencv.NewCameraDriver(\"tcp://192.168.1.1:5555\")\n\tardroneAdaptor := ardrone.NewAdaptor()\n\tdrone := ardrone.NewDriver(ardroneAdaptor)\n\n\twork := func() {\n\t\tdetect := false\n\t\tdrone.TakeOff()\n\t\tvar img gocv.Mat\n\t\tcamera.On(opencv.Frame, func(data interface{}) {\n\t\t\timg = data.(gocv.Mat)\n\t\t\tif !detect {\n\t\t\t\twindow.IMShow(img)\n\t\t\t\twindow.WaitKey(1)\n\t\t\t}\n\t\t})\n\t\t_ = drone.On(ardrone.Flying, func(data interface{}) {\n\t\t\tgobot.After(1*time.Second, func() { drone.Up(0.2) })\n\t\t\tgobot.After(2*time.Second, func() { drone.Hover() })\n\t\t\tgobot.After(5*time.Second, func() {\n\t\t\t\tdetect = true\n\t\t\t\tgobot.Every(300*time.Millisecond, func() {\n\t\t\t\t\tdrone.Hover()\n\t\t\t\t\ti := img\n\t\t\t\t\tfaces := opencv.DetectObjects(cascade, i)\n\t\t\t\t\tbiggest := 0\n\t\t\t\t\tvar face image.Rectangle\n\t\t\t\t\tfor _, f := range faces {\n\t\t\t\t\t\tif f.Width() > biggest {\n\t\t\t\t\t\t\tbiggest = f.Width()\n\t\t\t\t\t\t\tface = f\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif face != nil {\n\t\t\t\t\t\topencv.DrawRectangles(i, []img.Rectangle{face}, 0, 255, 0, 5)\n\t\t\t\t\t\tcenterX := float64(img.Size()).X * 0.5\n\t\t\t\t\t\tturn := -(float64(face.Min.X - centerX)) / centerX\n\t\t\t\t\t\tfmt.Println(\"turning:\", turn)\n\t\t\t\t\t\tif turn < 0 {\n\t\t\t\t\t\t\tdrone.Clockwise(math.Abs(turn * 0.4))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdrone.CounterClockwise(math.Abs(turn * 0.4))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\twindow.IMShow(i)\n\t\t\t\t\twindow.WaitKey(1)\n\t\t\t\t})\n\t\t\t\tgobot.After(20*time.Second, func() { drone.Land() })\n\t\t\t})\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"face\",\n\t\t[]gobot.Connection{ardroneAdaptor},\n\t\t[]gobot.Device{window, camera, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/ardrone_ps3.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/ardrone\"\n)\n\ntype pair struct {\n\tx float64\n\ty float64\n}\n\nvar leftX, leftY, rightX, rightY atomic.Value\n\nconst offset = 32767.0\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, \"dualshock3\")\n\n\tardroneAdaptor := ardrone.NewAdaptor()\n\tdrone := ardrone.NewDriver(ardroneAdaptor)\n\n\tleftX.Store(float64(0.0))\n\tleftY.Store(float64(0.0))\n\trightX.Store(float64(0.0))\n\trightY.Store(float64(0.0))\n\n\twork := func() {\n\t\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\t\tdrone.TakeOff()\n\t\t})\n\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tdrone.Hover()\n\t\t})\n\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tdrone.Land()\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftY.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightY.Store(val)\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\tleftStick := getLeftStick()\n\n\t\t\tswitch {\n\t\t\tcase leftStick.y < -10:\n\t\t\t\tdrone.Forward(ardrone.ValidatePitch(leftStick.y, offset))\n\t\t\tcase leftStick.y > 10:\n\t\t\t\tdrone.Backward(ardrone.ValidatePitch(leftStick.y, offset))\n\t\t\tdefault:\n\t\t\t\tdrone.Forward(0)\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase leftStick.x > 10:\n\t\t\t\tdrone.Right(ardrone.ValidatePitch(leftStick.x, offset))\n\t\t\tcase leftStick.x < -10:\n\t\t\t\tdrone.Left(ardrone.ValidatePitch(leftStick.x, offset))\n\t\t\tdefault:\n\t\t\t\tdrone.Right(0)\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\trightStick := getRightStick()\n\n\t\t\tswitch {\n\t\t\tcase rightStick.y < -10:\n\t\t\t\tdrone.Up(ardrone.ValidatePitch(rightStick.y, offset))\n\t\t\tcase rightStick.y > 10:\n\t\t\t\tdrone.Down(ardrone.ValidatePitch(rightStick.y, offset))\n\t\t\tdefault:\n\t\t\t\tdrone.Up(0)\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase rightStick.x > 20:\n\t\t\t\tdrone.Clockwise(ardrone.ValidatePitch(rightStick.x, offset))\n\t\t\tcase rightStick.x < -20:\n\t\t\t\tdrone.CounterClockwise(ardrone.ValidatePitch(rightStick.x, offset))\n\t\t\tdefault:\n\t\t\t\tdrone.Clockwise(0)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ardrone\",\n\t\t[]gobot.Connection{joystickAdaptor, ardroneAdaptor},\n\t\t[]gobot.Device{stick, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc getLeftStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = leftX.Load().(float64)\n\ts.y = leftY.Load().(float64)\n\treturn s\n}\n\nfunc getRightStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = rightX.Load().(float64)\n\ts.y = rightY.Load().(float64)\n\treturn s\n}\n"
  },
  {
    "path": "examples/audio.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/audio\"\n)\n\nfunc main() {\n\te := audio.NewAdaptor()\n\tlaser := audio.NewDriver(e, \"./examples/laser.mp3\")\n\n\twork := func() {\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tlaser.Play()\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"soundBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{laser},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/batty.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n)\n\nfunc main() {\n\tgbot := gobot.NewManager()\n\n\tapi.NewAPI(gbot).Start()\n\n\tgbot.AddCommand(\"echo\", func(params map[string]interface{}) interface{} {\n\t\treturn params[\"a\"]\n\t})\n\n\tloopback := NewLoopbackAdaptor(\"/dev/null\")\n\tping := NewPingDriver(loopback, \"1\")\n\n\twork := func() {\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tfmt.Println(ping.Ping())\n\t\t})\n\t}\n\tr := gobot.NewRobot(\"TestBot\",\n\t\t[]gobot.Connection{loopback},\n\t\t[]gobot.Device{ping},\n\t\twork,\n\t)\n\n\tr.AddCommand(\"hello\", func(params map[string]interface{}) interface{} {\n\t\treturn fmt.Sprintf(\"Hello, %v!\", params[\"greeting\"])\n\t})\n\n\tgbot.AddRobot(r)\n\tif err := gbot.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n}\n\nvar _ gobot.Adaptor = (*loopbackAdaptor)(nil)\n\ntype loopbackAdaptor struct {\n\tname string\n\tport string\n}\n\nfunc (t *loopbackAdaptor) Finalize() error  { return nil }\nfunc (t *loopbackAdaptor) Connect() error   { return nil }\nfunc (t *loopbackAdaptor) Name() string     { return t.name }\nfunc (t *loopbackAdaptor) SetName(n string) { t.name = n }\nfunc (t *loopbackAdaptor) Port() string     { return t.port }\n\nfunc NewLoopbackAdaptor(port string) *loopbackAdaptor {\n\treturn &loopbackAdaptor{\n\t\tname: \"Loopback\",\n\t\tport: port,\n\t}\n}\n\nvar _ gobot.Driver = (*pingDriver)(nil)\n\ntype pingDriver struct {\n\tgobot.Eventer\n\tgobot.Commander\n\n\tname       string\n\tpin        string\n\tconnection gobot.Connection\n}\n\nfunc (t *pingDriver) Start() error                 { return nil }\nfunc (t *pingDriver) Halt() error                  { return nil }\nfunc (t *pingDriver) Name() string                 { return t.name }\nfunc (t *pingDriver) SetName(n string)             { t.name = n }\nfunc (t *pingDriver) Pin() string                  { return t.pin }\nfunc (t *pingDriver) Connection() gobot.Connection { return t.connection }\n\nfunc NewPingDriver(adaptor *loopbackAdaptor, pin string) *pingDriver {\n\tt := &pingDriver{\n\t\tname:       \"Ping\",\n\t\tconnection: adaptor,\n\t\tpin:        pin,\n\t\tEventer:    gobot.NewEventer(),\n\t\tCommander:  gobot.NewCommander(),\n\t}\n\n\tt.AddEvent(\"ping\")\n\n\tt.AddCommand(\"ping\", func(params map[string]interface{}) interface{} {\n\t\treturn t.Ping()\n\t})\n\n\treturn t\n}\n\nfunc (t *pingDriver) Ping() string {\n\tt.Publish(t.Event(\"ping\"), \"ping\")\n\treturn \"pong\"\n}\n"
  },
  {
    "path": "examples/beaglebone_basic_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\t// Use Gobot to control BeagleBone's digital pins directly\n\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\tgpioPin := gpio.NewDirectPinDriver(beagleboneAdaptor, \"P9_12\")\n\n\t// Initialize the internal representation of the pinout\n\tif err := beagleboneAdaptor.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\t// Cast to byte because we are returning an int from a function\n\t// and not passing in an int literal.\n\tif err := gpioPin.DigitalWrite(byte(myStateFunction())); err != nil {\n\t\tfmt.Println(err)\n\t}\n}\n\n// myStateFunction determines what the GPIO state should be\nfunc myStateFunction() int {\n\treturn 1\n}\n"
  },
  {
    "path": "examples/beaglebone_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\tled := gpio.NewLedDriver(beagleboneAdaptor, \"P9_12\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{beagleboneAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/beaglebone_blink_usr_led.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\tled := gpio.NewLedDriver(beagleboneAdaptor, \"usr1\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{beagleboneAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/beaglebone_blinkm.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\tblinkm := i2c.NewBlinkMDriver(beagleboneAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := byte(gobot.Rand(255))\n\t\t\tg := byte(gobot.Rand(255))\n\t\t\tb := byte(gobot.Rand(255))\n\t\t\tif err := blinkm.Rgb(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tcolor, err := blinkm.Color()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"color %v\\n\", color)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkmBot\",\n\t\t[]gobot.Connection{beagleboneAdaptor},\n\t\t[]gobot.Device{blinkm},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/beaglebone_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\tbutton := gpio.NewButtonDriver(beagleboneAdaptor, \"P8_09\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tfmt.Println(\"button pressed\")\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"button released\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{beagleboneAdaptor},\n\t\t[]gobot.Device{button},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/beaglebone_grove_accelerometer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\tboard := beaglebone.NewAdaptor()\n\taccel := i2c.NewGroveAccelerometerDriver(board)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tif x, y, z, err := accel.XYZ(); err == nil {\n\t\t\t\tfmt.Println(x, y, z)\n\t\t\t\tfmt.Println(accel.Acceleration(x, y, z))\n\t\t\t} else {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"accelBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{accel},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/beaglebone_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\tled := gpio.NewLedDriver(beagleboneAdaptor, \"P9_14\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(5)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{beagleboneAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/beaglebone_led_brightness_with_analog_input.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\tsensor := aio.NewAnalogSensorDriver(beagleboneAdaptor, \"P9_33\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\tled := gpio.NewLedDriver(beagleboneAdaptor, \"P9_14\")\n\n\twork := func() {\n\t\t_ = sensor.On(sensor.Event(\"data\"), func(data interface{}) {\n\t\t\tbrightness := uint8(\n\t\t\t\tgobot.ToScale(gobot.FromScale(float64(data.(int)), 0, 1024), 0, 255),\n\t\t\t)\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t\tfmt.Println(\"brightness\", brightness)\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{beagleboneAdaptor},\n\t\t[]gobot.Device{sensor, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/beaglepocket_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/pocketbeagle\"\n)\n\n// Wiring\n// PWR  Pocket: P1.14, P2.23 (+3.3V, VCC); P1.15, P1.16, P1.22, P2.15, P2.21 (GND)\n// GPIO Pocket: header pin P1.34 is input, pin P1.35 is normal output, pin P1.36 is inverted output\n// Button: the input pin is wired with a button to GND, an external pull up resistor is needed (e.g. 2kOhm to VCC)\n// LED's: the output pins are wired to the cathode of the LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed the state changes\n// note: you can also use user LEDs, e.g. \"usr0\", \"usr3\"\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"P1_34\"\n\t\toutPinNum         = \"P1_35\"\n\t\toutPinInvertedNum = \"P1_36\"\n\t)\n\n\tboard := pocketbeagle.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum))\n\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t\tif level == 1 {\n\t\t\t\t\tlevel = 0\n\t\t\t\t} else {\n\t\t\t\t\tlevel = 1\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bebop.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/bebop\"\n)\n\nfunc main() {\n\tbebopAdaptor := bebop.NewAdaptor()\n\tdrone := bebop.NewDriver(bebopAdaptor)\n\n\twork := func() {\n\t\t_ = drone.On(bebop.Flying, func(data interface{}) {\n\t\t\tgobot.After(10*time.Second, func() {\n\t\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tif err := drone.HullProtection(true); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tdrone.TakeOff()\n\t}\n\n\trobot := gobot.NewRobot(\"drone\",\n\t\t[]gobot.Connection{bebopAdaptor},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bebop.sdp",
    "content": "c=IN IP4 192.168.42.1\nm=video 55004 RTP/AVP 96\na=rtpmap:96 H264/90000\n"
  },
  {
    "path": "examples/bebop_ps3.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/bebop\"\n)\n\ntype pair struct {\n\tx float64\n\ty float64\n}\n\nvar leftX, leftY, rightX, rightY atomic.Value\n\nconst offset = 32767.0\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, \"dualshock3\")\n\n\tbebopAdaptor := bebop.NewAdaptor()\n\tdrone := bebop.NewDriver(bebopAdaptor)\n\n\twork := func() {\n\t\tleftX.Store(float64(0.0))\n\t\tleftY.Store(float64(0.0))\n\t\trightX.Store(float64(0.0))\n\t\trightY.Store(float64(0.0))\n\n\t\trecording := false\n\n\t\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\t\tif recording {\n\t\t\t\tif err := drone.StopRecording(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := drone.StartRecording(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t\trecording = !recording\n\t\t})\n\n\t\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\t\tif err := drone.HullProtection(true); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tdrone.TakeOff()\n\t\t})\n\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tif err := drone.Stop(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftY.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightY.Store(val)\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\tleftStick := getLeftStick()\n\n\t\t\tswitch {\n\t\t\tcase leftStick.y < -10:\n\t\t\t\tif err := drone.Forward(bebop.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.y > 10:\n\t\t\t\tif err := drone.Backward(bebop.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Forward(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase leftStick.x > 10:\n\t\t\t\tif err := drone.Right(bebop.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.x < -10:\n\t\t\t\tif err := drone.Left(bebop.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Right(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\trightStick := getRightStick()\n\t\t\tswitch {\n\t\t\tcase rightStick.y < -10:\n\t\t\t\tif err := drone.Up(bebop.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.y > 10:\n\t\t\t\tif err := drone.Down(bebop.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Up(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase rightStick.x > 20:\n\t\t\t\tif err := drone.Clockwise(bebop.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.x < -20:\n\t\t\t\tif err := drone.CounterClockwise(bebop.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Clockwise(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bebop\",\n\t\t[]gobot.Connection{joystickAdaptor, bebopAdaptor},\n\t\t[]gobot.Device{stick, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc getLeftStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = leftX.Load().(float64)\n\ts.y = leftY.Load().(float64)\n\treturn s\n}\n\nfunc getRightStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = rightX.Load().(float64)\n\ts.y = rightY.Load().(float64)\n\treturn s\n}\n"
  },
  {
    "path": "examples/bebop_ps3_video.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nThis example will connect to the Parrot Bebop allowing you to control\nit using a PS3 controller.\n\nIt also streams the drone video to a webpage via ffserver.\n\nThis requires you to have both ffmpeg and ffserver installed\non your computer.\n\nIn order to run this example you will first need to start ffserver with:\n\n\t$ ffserver -f ff.conf\n\nthen in a separate terminal run this program:\n\n\t$ go run bebop_ps3_video.go\n\nYou can view the video feed by navigating to\nhttp://localhost:8090/bebop.mjpeg in a web browser.\n*NOTE* firefox works best for viewing the video feed.\n*/\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os/exec\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/bebop\"\n)\n\ntype pair struct {\n\tx float64\n\ty float64\n}\n\nvar leftX, leftY, rightX, rightY atomic.Value\n\nconst offset = 32767.0\n\nfunc ffmpeg() (io.WriteCloser, io.ReadCloser, error) {\n\tffmpeg := exec.Command(\"ffmpeg\", \"-i\", \"pipe:0\", \"http://localhost:8090/bebop.ffm\")\n\n\tstderr, err := ffmpeg.StderrPipe()\n\tif err != nil {\n\t\treturn nil, stderr, err\n\t}\n\n\tstdin, err := ffmpeg.StdinPipe()\n\tif err != nil {\n\t\treturn stdin, stderr, err\n\t}\n\n\tif err := ffmpeg.Start(); err != nil {\n\t\treturn stdin, stderr, err\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\tbuf, err := io.ReadAll(stderr)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif len(buf) > 0 {\n\t\t\t\tfmt.Println(string(buf))\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn stdin, stderr, nil\n}\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, \"dualshock3\")\n\n\tbebopAdaptor := bebop.NewAdaptor()\n\tdrone := bebop.NewDriver(bebopAdaptor)\n\n\twork := func() {\n\t\tif err := drone.VideoEnable(true); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tvideo, _, _ := ffmpeg()\n\n\t\tgo func() {\n\t\t\tfor {\n\t\t\t\tif _, err := video.Write(<-drone.Video()); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\n\t\tleftX.Store(float64(0.0))\n\t\tleftY.Store(float64(0.0))\n\t\trightX.Store(float64(0.0))\n\t\trightY.Store(float64(0.0))\n\n\t\trecording := false\n\n\t\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\t\tif recording {\n\t\t\t\tif err := drone.StopRecording(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := drone.StartRecording(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t\trecording = !recording\n\t\t})\n\n\t\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\t\tif err := drone.HullProtection(true); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tdrone.TakeOff()\n\t\t})\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tif err := drone.Stop(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftY.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightY.Store(val)\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\tleftStick := getLeftStick()\n\n\t\t\tswitch {\n\t\t\tcase leftStick.y < -10:\n\t\t\t\tif err := drone.Forward(bebop.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.y > 10:\n\t\t\t\tif err := drone.Backward(bebop.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Forward(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase leftStick.x > 10:\n\t\t\t\tif err := drone.Right(bebop.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.x < -10:\n\t\t\t\tif err := drone.Left(bebop.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Right(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\trightStick := getRightStick()\n\t\t\tswitch {\n\t\t\tcase rightStick.y < -10:\n\t\t\t\tif err := drone.Up(bebop.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.y > 10:\n\t\t\t\tif err := drone.Down(bebop.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Up(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase rightStick.x > 20:\n\t\t\t\tif err := drone.Clockwise(bebop.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.x < -20:\n\t\t\t\tif err := drone.CounterClockwise(bebop.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Clockwise(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bebop\",\n\t\t[]gobot.Connection{joystickAdaptor, bebopAdaptor},\n\t\t[]gobot.Device{stick, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc getLeftStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = leftX.Load().(float64)\n\ts.y = leftY.Load().(float64)\n\treturn s\n}\n\nfunc getRightStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = rightX.Load().(float64)\n\ts.y = rightY.Load().(float64)\n\treturn s\n}\n"
  },
  {
    "path": "examples/bebop_rtp_video.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nThis example will connect to the Parrot Bebop and streams the drone video\nvia the RTP protocol.\n\nIn order to run this example you will first need to connect to the drone with:\n\n\t$ go run bebop_ps3_video.go\n\nthen in a separate terminal run this program:\n\n\t$ mplayer examples/bebop.sdp\n\nYou can view the video feed by navigating to\nhttp://localhost:8090/bebop.mjpeg in a web browser.\n*NOTE* firefox works best for viewing the video feed.\n*/\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/bebop\"\n)\n\nfunc main() {\n\tbebopAdaptor := bebop.NewAdaptor()\n\tdrone := bebop.NewDriver(bebopAdaptor)\n\n\twork := func() {\n\t\tif err := drone.VideoEnable(true); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"drone\",\n\t\t[]gobot.Connection{bebopAdaptor},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_battery.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/ble_battery.go BB-1234\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1], bleclient.WithScanTimeout(30*time.Second))\n\tbattery := ble.NewBatteryDriver(bleAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tlevel, err := battery.GetBatteryLevel()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Println(\"Battery level:\", level)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bleBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{battery},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_bb8-collision.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/bb8-collision.go BB-1234\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tbb := sphero.NewBB8Driver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = bb.On(\"collision\", func(data interface{}) {\n\t\t\tfmt.Printf(\"collision detected = %+v \\n\", data)\n\t\t\tbb.SetRGB(255, 0, 0)\n\t\t})\n\n\t\tbb.SetRGB(0, 255, 0)\n\t\tbb.Roll(80, 0)\n\t}\n\n\trobot := gobot.NewRobot(\"bb8\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{bb},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_bb8.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/bb8.go BB-1234\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tbb8 := sphero.NewBB8Driver(bleAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := uint8(gobot.Rand(255))\n\t\t\tg := uint8(gobot.Rand(255))\n\t\t\tb := uint8(gobot.Rand(255))\n\t\t\tbb8.SetRGB(r, g, b)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bbBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{bb8},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_device_info.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/ble_device_info.go BB-1234\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1], bleclient.WithScanTimeout(30*time.Second), bleclient.WithDebug())\n\tinfo := ble.NewDeviceInformationDriver(bleAdaptor)\n\n\twork := func() {\n\t\tmodelNo, err := info.GetModelNumber()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Model number:\", modelNo)\n\n\t\tfwRev, err := info.GetFirmwareRevision()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Firmware rev:\", fwRev)\n\n\t\thwRev, err := info.GetHardwareRevision()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Hardware rev:\", hwRev)\n\n\t\tmanuName, err := info.GetManufacturerName()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Manufacturer name:\", manuName)\n\n\t\tpid, err := info.GetPnPId()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"PnPId:\", pid)\n\t}\n\n\trobot := gobot.NewRobot(\"bleBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{info},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_firmata_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the BLE address or BLE name as first param:\n\n\tgo run examples/ble_firmata_blink.go FIRMATA\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewBLEAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_firmata_curie_imu.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the BLE address or BLE name as first param:\n\n\tgo run examples/ble_firmata_curie_imu.go FIRMATA\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/curie\"\n)\n\nfunc main() {\n\tvar bleAdaptor interface{} = firmata.NewBLEAdaptor(os.Args[1])\n\tfirmataAdaptor := bleAdaptor.(*firmata.Adaptor)\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\timu := curie.NewIMUDriver(firmataAdaptor)\n\n\twork := func() {\n\t\t_ = imu.On(\"Accelerometer\", func(data interface{}) {\n\t\t\tlog.Println(\"Accelerometer\", data)\n\t\t})\n\n\t\t_ = imu.On(\"Gyroscope\", func(data interface{}) {\n\t\t\tlog.Println(\"Gyroscope\", data)\n\t\t})\n\n\t\t_ = imu.On(\"Temperature\", func(data interface{}) {\n\t\t\tlog.Println(\"Temperature\", data)\n\t\t})\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := imu.ReadAccelerometer(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := imu.ReadGyroscope(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := imu.ReadTemperature(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led, imu},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_generic_access.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/ble_generic_access.go BB-1234\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1], bleclient.WithScanTimeout(30*time.Second), bleclient.WithDebug())\n\taccess := ble.NewGenericAccessDriver(bleAdaptor)\n\n\twork := func() {\n\t\tdevName, err := access.GetDeviceName()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Device name:\", devName)\n\n\t\tappearance, err := access.GetAppearance()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Appearance:\", appearance)\n\t}\n\n\trobot := gobot.NewRobot(\"bleBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{access},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_accelerometer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example uses the Microbit's built-in accelerometer.\n You run the Go program on your computer and communicate\n wirelessly with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_accelerometer.go \"BBC micro:bit [yowza]\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tubit := microbit.NewAccelerometerDriver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = ubit.On(microbit.AccelerometerEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"Accelerometer\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ubit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example requires that you wire an external LED to\n pin number 0 on the Microbit, as this example is intended\n to demonstrate the Microbit IOPinDriver.\n\n You then run the Go program on your computer and communicate\n wirelessly with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_blink.go \"BBC micro:bit [yowza]\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\n\tubit := microbit.NewIOPinDriver(bleAdaptor)\n\tled := gpio.NewLedDriver(ubit, \"0\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ubit, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_buttons.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example uses the Microbit's built-in buttons. You run\n the Go program on your computer and communicate wirelessly\n with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_buttons_led.go \"BBC micro:bit [yowza]\"\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tubit := microbit.NewButtonDriver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = ubit.On(microbit.ButtonAEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"button A\", data)\n\t\t})\n\n\t\t_ = ubit.On(microbit.ButtonBEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"button B\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ubit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_buttons_leds.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example uses the Microbit's built-in buttons and\n built-in LED matrix. You run the Go program on your computer and\n communicate wirelessly with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_buttons_led.go \"BBC micro:bit [yowza]\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tbuttons := microbit.NewButtonDriver(bleAdaptor)\n\tleds := microbit.NewLEDDriver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = buttons.On(microbit.ButtonAEvent, func(data interface{}) {\n\t\t\tif data.([]byte)[0] == 1 {\n\t\t\t\tif err := leds.UpLeftArrow(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err := leds.Blank(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = buttons.On(microbit.ButtonBEvent, func(data interface{}) {\n\t\t\tif data.([]byte)[0] == 1 {\n\t\t\t\tif err := leds.UpRightArrow(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err := leds.Blank(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{buttons, leds},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_io_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example requires that you wire an external button to\n pin number 0 on the Microbit, and also wire an external LED to\n pin number 1 on the Microbit. This example is intended\n to demonstrate using Gobot GPIO drivers with the Microbit.\n\n You run the Go program on your computer and communicate\n wirelessly with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_io_button.go \"BBC micro:bit [yowza]\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\n\tubit := microbit.NewIOPinDriver(bleAdaptor)\n\tbutton := gpio.NewButtonDriver(ubit, \"0\")\n\tled := gpio.NewLedDriver(ubit, \"1\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ubit, button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_led.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example uses the Microbit's built-in LED matrix.\n You run the Go program on your computer and communicate\n wirelessly with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_led.go \"BBC micro:bit [yowza]\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tubit := microbit.NewLEDDriver(bleAdaptor)\n\n\twork := func() {\n\t\tif err := ubit.Blank(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tgobot.After(1*time.Second, func() {\n\t\t\tif err := ubit.WriteText(\"Hello\"); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.After(7*time.Second, func() {\n\t\t\tif err := ubit.Smile(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ubit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_magnetometer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example uses the Microbit's built-in magnetometer.\n You run the Go program on your computer and communicate\n wirelessly with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_magnetometer.go \"BBC micro:bit [yowza]\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tubit := microbit.NewMagnetometerDriver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = ubit.On(microbit.MagnetometerEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"Magnetometer\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"magnetoBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ubit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_microbit_temperature.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a BBC Microbit microcontroller that has\n been flashed with the firmware from @sandeepmistry\n\n More info:\n https://gobot.io/documentation/platforms/microbit/#how-to-install\n\n This example uses the Microbit's built-in thermometer.\n You run the Go program on your computer and communicate\n wirelessly with the Microbit.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/microbit_temperature.go \"BBC micro:bit [yowza]\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tubit := microbit.NewTemperatureDriver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = ubit.On(microbit.TemperatureEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"Temperature\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"thermoBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ubit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_minidrone.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/minidrone.go \"Mambo_1234\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/parrot\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tdrone := parrot.NewMinidroneDriver(bleAdaptor)\n\n\twork := func() {\n\t\tif err := drone.TakeOff(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"minidrone\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_minidrone_events.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/minidrone_events.go \"Mambo_1234\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/parrot\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tdrone := parrot.NewMinidroneDriver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = drone.On(parrot.BatteryEvent, func(data interface{}) {\n\t\t\tfmt.Printf(\"battery: %d\\n\", data)\n\t\t})\n\n\t\t_ = drone.On(parrot.FlightStatusEvent, func(data interface{}) {\n\t\t\tfmt.Printf(\"flight status: %d\\n\", data)\n\t\t})\n\n\t\t_ = drone.On(parrot.TakeoffEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"taking off...\")\n\t\t})\n\n\t\t_ = drone.On(parrot.HoveringEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"hovering!\")\n\t\t\tgobot.After(5*time.Second, func() {\n\t\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\t_ = drone.On(parrot.LandingEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"landing...\")\n\t\t})\n\n\t\t_ = drone.On(parrot.LandedEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"landed.\")\n\t\t})\n\n\t\ttime.Sleep(1000 * time.Millisecond)\n\t\tif err := drone.TakeOff(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"minidrone\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_minidrone_mambo_ps3.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a PS3 or compatible controller, along with\n one of the Parrot Mambo drones to run this example.\n\n You run the Go program on your computer and communicate\n wirelessly with the Mambo.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/minidrone_mambo_ps3.go \"Mambo_1234\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/parrot\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\ntype pair struct {\n\tx float64\n\ty float64\n}\n\nvar leftX, leftY, rightX, rightY atomic.Value\n\nconst offset = 32767.0\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor,\n\t\t\"./platforms/joystick/configs/dualshock3.json\",\n\t)\n\n\tdroneAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tdrone := parrot.NewMinidroneDriver(droneAdaptor)\n\n\twork := func() {\n\t\tleftX.Store(float64(0.0))\n\t\tleftY.Store(float64(0.0))\n\t\trightX.Store(float64(0.0))\n\t\trightY.Store(float64(0.0))\n\n\t\tclawOpen := false\n\n\t\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\t\tif clawOpen {\n\t\t\t\tif err := drone.ClawControl(0, parrot.ClawClosed); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tclawOpen = false\n\t\t\t} else {\n\t\t\t\tif err := drone.ClawControl(0, parrot.ClawOpen); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tclawOpen = true\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.R2Press, func(data interface{}) {\n\t\t\tif clawOpen {\n\t\t\t\tif err := drone.ClawControl(0, parrot.ClawClosed); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tclawOpen = false\n\t\t\t} else {\n\t\t\t\tif err := drone.ClawControl(0, parrot.ClawOpen); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tclawOpen = true\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tif err := drone.HullProtection(true); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := drone.TakeOff(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftY.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightY.Store(val)\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\trightStick := getRightStick()\n\n\t\t\tswitch {\n\t\t\tcase rightStick.y < -10:\n\t\t\t\tif err := drone.Forward(parrot.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.y > 10:\n\t\t\t\tif err := drone.Backward(parrot.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Forward(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase rightStick.x > 10:\n\t\t\t\tif err := drone.Right(parrot.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.x < -10:\n\t\t\t\tif err := drone.Left(parrot.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Right(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\tleftStick := getLeftStick()\n\t\t\tswitch {\n\t\t\tcase leftStick.y < -10:\n\t\t\t\tif err := drone.Up(parrot.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.y > 10:\n\t\t\t\tif err := drone.Down(parrot.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Up(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase leftStick.x > 20:\n\t\t\t\tif err := drone.Clockwise(parrot.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.x < -20:\n\t\t\t\tif err := drone.CounterClockwise(parrot.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Clockwise(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"minidrone\",\n\t\t[]gobot.Connection{joystickAdaptor, droneAdaptor},\n\t\t[]gobot.Device{stick, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc getLeftStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = leftX.Load().(float64)\n\ts.y = leftY.Load().(float64)\n\treturn s\n}\n\nfunc getRightStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = rightX.Load().(float64)\n\ts.y = rightY.Load().(float64)\n\treturn s\n}\n"
  },
  {
    "path": "examples/bleclient_minidrone_ps3.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a PS3 or compatible controller, along with\n any of the Parrot Minidrone drones to run this example.\n\n You run the Go program on your computer and communicate\n wirelessly with the Parrot Minidrone.\n\n How to run\n Pass the Bluetooth name or address as first param:\n\n\tgo run examples/minidrone_ps3.go \"Travis_1234\"\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/parrot\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\ntype pair struct {\n\tx float64\n\ty float64\n}\n\nvar leftX, leftY, rightX, rightY atomic.Value\n\nconst offset = 32767.0\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, \"dualshock3\")\n\n\tdroneAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tdrone := parrot.NewMinidroneDriver(droneAdaptor)\n\n\twork := func() {\n\t\tleftX.Store(float64(0.0))\n\t\tleftY.Store(float64(0.0))\n\t\trightX.Store(float64(0.0))\n\t\trightY.Store(float64(0.0))\n\n\t\trecording := false\n\n\t\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\t\tif recording {\n\t\t\t\tif err := drone.StopRecording(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := drone.StartRecording(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t\trecording = !recording\n\t\t})\n\n\t\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\t\tif err := drone.Stop(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tif err := drone.HullProtection(true); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := drone.TakeOff(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftY.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightY.Store(val)\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\trightStick := getRightStick()\n\n\t\t\tswitch {\n\t\t\tcase rightStick.y < -10:\n\t\t\t\tif err := drone.Forward(parrot.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.y > 10:\n\t\t\t\tif err := drone.Backward(parrot.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Forward(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase rightStick.x > 10:\n\t\t\t\tif err := drone.Right(parrot.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.x < -10:\n\t\t\t\tif err := drone.Left(parrot.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Right(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\tleftStick := getLeftStick()\n\t\t\tswitch {\n\t\t\tcase leftStick.y < -10:\n\t\t\t\tif err := drone.Up(parrot.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.y > 10:\n\t\t\t\tif err := drone.Down(parrot.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Up(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase leftStick.x > 20:\n\t\t\t\tif err := drone.Clockwise(parrot.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.x < -20:\n\t\t\t\tif err := drone.CounterClockwise(parrot.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Clockwise(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"minidrone\",\n\t\t[]gobot.Connection{joystickAdaptor, droneAdaptor},\n\t\t[]gobot.Device{stick, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc getLeftStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = leftX.Load().(float64)\n\ts.y = leftY.Load().(float64)\n\treturn s\n}\n\nfunc getRightStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = rightX.Load().(float64)\n\ts.y = rightY.Load().(float64)\n\treturn s\n}\n"
  },
  {
    "path": "examples/bleclient_multiple_generic.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/ble_multiple_generic.go BB-1234 BB-1235\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc NewSwarmBot(port string) *gobot.Robot {\n\tbleAdaptor := bleclient.NewAdaptor(port)\n\taccess := ble.NewGenericAccessDriver(bleAdaptor)\n\n\twork := func() {\n\t\tdevName, err := access.GetDeviceName()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Device name:\", devName)\n\n\t\tappearance, err := access.GetAppearance()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Appearance:\", appearance)\n\t}\n\n\trobot := gobot.NewRobot(\"bot \"+port,\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{access},\n\t\twork,\n\t)\n\n\treturn robot\n}\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\tfor _, port := range os.Args[1:] {\n\t\tbot := NewSwarmBot(port)\n\t\tmanager.AddRobot(bot)\n\t}\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_multiple_info.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/ble_multiple_info.go BB-1234 BB-1235\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc NewSwarmBot(port string) *gobot.Robot {\n\tbleAdaptor := bleclient.NewAdaptor(port)\n\tinfo := ble.NewDeviceInformationDriver(bleAdaptor)\n\n\twork := func() {\n\t\tmodelNo, err := info.GetModelNumber()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Model number:\", modelNo)\n\n\t\tfwRev, err := info.GetFirmwareRevision()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Firmware rev:\", fwRev)\n\n\t\thwRev, err := info.GetHardwareRevision()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Hardware rev:\", hwRev)\n\n\t\tmanuName, err := info.GetManufacturerName()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"Manufacturer name:\", manuName)\n\n\t\tpid, err := info.GetPnPId()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tfmt.Println(\"PnPId:\", pid)\n\t}\n\n\trobot := gobot.NewRobot(\"bot \"+port,\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{info},\n\t\twork,\n\t)\n\n\treturn robot\n}\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\tfor _, port := range os.Args[1:] {\n\t\tbot := NewSwarmBot(port)\n\t\tmanager.AddRobot(bot)\n\t}\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_ollie.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tollie := sphero.NewOllieDriver(bleAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := uint8(gobot.Rand(255))\n\t\t\tg := uint8(gobot.Rand(255))\n\t\t\tb := uint8(gobot.Rand(255))\n\t\t\tollie.SetRGB(r, g, b)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ollieBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ollie},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_ollie_boost.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tollieBot := sphero.NewOllieDriver(bleAdaptor)\n\n\twork := func() {\n\t\thead := uint16(90)\n\t\tollieBot.SetRGB(255, 0, 0)\n\t\tollieBot.Boost(true)\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tollieBot.Roll(0, head)\n\t\t\ttime.Sleep(1 * time.Second)\n\t\t\thead += 90\n\t\t\thead = head % 360\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ollieBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ollieBot},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_ollie_crazy.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tollieBot := sphero.NewOllieDriver(bleAdaptor)\n\n\twork := func() {\n\t\tollieBot.SetRGB(255, 0, 255)\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\t// Ollie performs 'crazy-ollie' trick\n\t\t\tollieBot.SetRawMotorValues(sphero.Forward, uint8(255), sphero.Forward, uint8(255))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ollieBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ollieBot},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_ollie_mqtt.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n\t\"gobot.io/x/gobot/v2/platforms/mqtt\"\n)\n\nconst (\n\tFRENTE    = 0\n\tDERECHA   = 90\n\tATRAS     = 180\n\tIZQUIERDA = 270\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tollie := sphero.NewOllieDriver(bleAdaptor)\n\n\tmqttAdaptor := mqtt.NewAdaptor(\"tcp://iot.eclipse.org:1883\", \"ollie\")\n\n\twork := func() {\n\t\tollie.SetRGB(255, 0, 255)\n\n\t\t_ = mqttAdaptor.On(\"sensors/dial\", func(msg mqtt.Message) {\n\t\t\tval, _ := strconv.Atoi(string(msg.Payload()))\n\n\t\t\tif val > 2000 {\n\t\t\t\tollie.SetRGB(0, 255, 0)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif val > 1000 {\n\t\t\t\tollie.SetRGB(255, 255, 0)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tollie.SetRGB(255, 0, 0)\n\t\t})\n\n\t\t_ = mqttAdaptor.On(\"rover/frente\", func(msg mqtt.Message) {\n\t\t\tollie.Roll(40, FRENTE)\n\t\t\tgobot.After(1*time.Second, func() {\n\t\t\t\tollie.Stop()\n\t\t\t})\n\t\t})\n\n\t\t_ = mqttAdaptor.On(\"rover/derecha\", func(msg mqtt.Message) {\n\t\t\tollie.Roll(40, DERECHA)\n\t\t\tgobot.After(1*time.Second, func() {\n\t\t\t\tollie.Stop()\n\t\t\t})\n\t\t})\n\n\t\t_ = mqttAdaptor.On(\"rover/atras\", func(msg mqtt.Message) {\n\t\t\tollie.Roll(40, ATRAS)\n\t\t\tgobot.After(1*time.Second, func() {\n\t\t\t\tollie.Stop()\n\t\t\t})\n\t\t})\n\n\t\t_ = mqttAdaptor.On(\"rover/izquierda\", func(msg mqtt.Message) {\n\t\t\tollie.Roll(40, IZQUIERDA)\n\t\t\tgobot.After(1*time.Second, func() {\n\t\t\t\tollie.Stop()\n\t\t\t})\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ollieBot\",\n\t\t[]gobot.Connection{bleAdaptor, mqttAdaptor},\n\t\t[]gobot.Device{ollie},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_ollie_multiple.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the BLE address or BLE name as first param:\n\n go run examples/ollie_multiple.go 2B-1234 2B-5678\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc NewSwarmBot(port string) *gobot.Robot {\n\tbleAdaptor := bleclient.NewAdaptor(port)\n\tollieDriver := sphero.NewOllieDriver(bleAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tollieDriver.SetRGB(uint8(gobot.Rand(255)),\n\t\t\t\tuint8(gobot.Rand(255)),\n\t\t\t\tuint8(gobot.Rand(255)),\n\t\t\t)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ollie \"+port,\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ollieDriver},\n\t\twork,\n\t)\n\n\treturn robot\n}\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\tfor _, port := range os.Args[1:] {\n\t\tbot := NewSwarmBot(port)\n\t\tmanager.AddRobot(bot)\n\t}\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_ollie_roll.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tollie := sphero.NewOllieDriver(bleAdaptor)\n\n\twork := func() {\n\t\tollie.SetRGB(255, 0, 255)\n\t\tgobot.Every(3*time.Second, func() {\n\t\t\tollie.Roll(40, uint16(gobot.Rand(360)))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ollieBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ollie},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_ollie_spin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tollieBot := sphero.NewOllieDriver(bleAdaptor)\n\n\twork := func() {\n\t\tollieBot.SetRGB(255, 0, 255)\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\t// Ollie performs 360 spin trick\n\t\t\tollieBot.SetRawMotorValues(sphero.Forward, uint8(255), sphero.Reverse, uint8(255))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ollieBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ollieBot},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_sprkplus.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/sprkplus.go SK-1234\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tsprk := sphero.NewSPRKPlusDriver(bleAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := uint8(gobot.Rand(255))\n\t\t\tg := uint8(gobot.Rand(255))\n\t\t\tb := uint8(gobot.Rand(255))\n\t\t\tsprk.SetRGB(r, g, b)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sprkBot\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{sprk},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/bleclient_sprkplus_collision.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass the Bluetooth address or name as the first param:\n\n\tgo run examples/bb8-collision.go BB-1234\n\n NOTE: sudo is required to use BLE in Linux\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n\tbleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\tball := sphero.NewSPRKPlusDriver(bleAdaptor)\n\n\twork := func() {\n\t\t_ = ball.On(\"collision\", func(data interface{}) {\n\t\t\tfmt.Printf(\"collision detected = %+v \\n\", data)\n\t\t\tball.SetRGB(255, 0, 0)\n\t\t})\n\n\t\tball.SetRGB(0, 255, 0)\n\t\tball.Roll(80, 0)\n\t}\n\n\trobot := gobot.NewRobot(\"sprkplus\",\n\t\t[]gobot.Connection{bleAdaptor},\n\t\t[]gobot.Device{ball},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tchipAdaptor := chip.NewAdaptor()\n\tled := gpio.NewLedDriver(chipAdaptor, \"XIO-P6\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{chipAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_blinkm.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\ta := chip.NewAdaptor()\n\tblinkm := i2c.NewBlinkMDriver(a)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := byte(gobot.Rand(255))\n\t\t\tg := byte(gobot.Rand(255))\n\t\t\tb := byte(gobot.Rand(255))\n\t\t\tif err := blinkm.Rgb(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tcolor, err := blinkm.Color()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"color %v\\n\", color)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkmBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{blinkm},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tchipAdaptor := chip.NewAdaptor()\n\tbutton := gpio.NewButtonDriver(chipAdaptor, \"XIO-P0\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tfmt.Println(\"button pressed\")\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"button released\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{chipAdaptor},\n\t\t[]gobot.Device{button},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_button_led.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tchipAdaptor := chip.NewAdaptor()\n\tbutton := gpio.NewButtonDriver(chipAdaptor, \"XIO-P6\")\n\tled := gpio.NewLedDriver(chipAdaptor, \"XIO-P7\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{chipAdaptor},\n\t\t[]gobot.Device{button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_drv2605l.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tboard := chip.NewAdaptor()\n\thaptic := i2c.NewDRV2605LDriver(board)\n\n\twork := func() {\n\t\tgobot.Every(3*time.Second, func() {\n\t\t\tpause := haptic.GetPauseWaveform(50)\n\t\t\tif err := haptic.SetSequence([]byte{1, pause, 1, pause, 1}); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := haptic.Go(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"DRV2605LBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{haptic},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_grove_accelerometer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tboard := chip.NewAdaptor()\n\taccel := i2c.NewGroveAccelerometerDriver(board)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tif x, y, z, err := accel.XYZ(); err == nil {\n\t\t\t\tfmt.Println(x, y, z)\n\t\t\t\tfmt.Println(accel.Acceleration(x, y, z))\n\t\t\t} else {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"accelBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{accel},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_grove_lcd.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tboard := chip.NewAdaptor()\n\tscreen := i2c.NewGroveLcdDriver(board)\n\n\twork := func() {\n\t\tif err := screen.Write(\"hello\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tif err := screen.SetRGB(255, 0, 0); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := screen.Clear(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.Home(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.SetRGB(0, 255, 0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// set a custom character in the first position\n\t\t\tif err := screen.SetCustomChar(0, i2c.CustomLCDChars[\"smiley\"]); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// add the custom character at the end of the string\n\t\t\tif err := screen.Write(\"goodbye\\nhave a nice day \" + string(byte(0))); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t\tif err := screen.Scroll(false); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tif err := screen.Home(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1 * time.Second)\n\t\tif err := screen.SetRGB(0, 0, 255); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"screenBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{screen},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_mpu6050.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tboard := chip.NewAdaptor()\n\tmpu6050 := i2c.NewMPU6050Driver(board)\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := mpu6050.GetData(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tfmt.Println(\"Accelerometer\", mpu6050.Accelerometer)\n\t\t\tfmt.Println(\"Gyroscope\", mpu6050.Gyroscope)\n\t\t\tfmt.Println(\"Temperature\", mpu6050.Temperature)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mpu6050Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{mpu6050},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_tsl2561.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tboard := chip.NewAdaptor()\n\tluxSensor := i2c.NewTSL2561Driver(board, i2c.WithTSL2561Gain16X)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tbroadband, ir, err := luxSensor.GetLuminocity()\n\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"Err:\", err)\n\t\t\t} else {\n\t\t\t\tlight := luxSensor.CalculateLux(broadband, ir)\n\t\t\t\tfmt.Printf(\"BB: %v, IR: %v, Lux: %v\\n\", broadband, ir, light)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"tsl2561Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{luxSensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/chip_wiichuck.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/chip\"\n)\n\nfunc main() {\n\tchipAdaptor := chip.NewAdaptor()\n\twiichuck := i2c.NewWiichuckDriver(chipAdaptor)\n\n\twork := func() {\n\t\t_ = wiichuck.On(wiichuck.Event(\"joystick\"), func(data interface{}) {\n\t\t\tfmt.Println(\"joystick\", data)\n\t\t})\n\n\t\t_ = wiichuck.On(wiichuck.Event(\"c\"), func(data interface{}) {\n\t\t\tfmt.Println(\"c\")\n\t\t})\n\n\t\t_ = wiichuck.On(wiichuck.Event(\"z\"), func(data interface{}) {\n\t\t\tfmt.Println(\"z\")\n\t\t})\n\t\t_ = wiichuck.On(wiichuck.Event(\"error\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Wiichuck error:\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"chuck\",\n\t\t[]gobot.Connection{chipAdaptor},\n\t\t[]gobot.Device{wiichuck},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_api.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\tdigisparkAdaptor := digispark.NewAdaptor()\n\tled := gpio.NewLedDriver(digisparkAdaptor, \"0\")\n\n\trobot := gobot.NewRobot(\"digispark\",\n\t\t[]gobot.Connection{digisparkAdaptor},\n\t\t[]gobot.Device{led},\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\nfunc main() {\n\tdigisparkAdaptor := digispark.NewAdaptor()\n\tled := gpio.NewLedDriver(digisparkAdaptor, \"0\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{digisparkAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_blinkm.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\nfunc main() {\n\tboard := digispark.NewAdaptor()\n\tblinkm := i2c.NewBlinkMDriver(board)\n\n\twork := func() {\n\t\tgobot.Every(3*time.Second, func() {\n\t\t\tr := byte(gobot.Rand(255))\n\t\t\tg := byte(gobot.Rand(255))\n\t\t\tb := byte(gobot.Rand(255))\n\t\t\tif err := blinkm.Rgb(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tcolor, err := blinkm.Color()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"color %v\\n\", color)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{blinkm},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_driver.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\n// This is an example for using the generic I2C driver to write and read values\n// to an i2c device. It is suitable for simple devices, e.g. EEPROM.\n// The example was tested with the EEPROM part of PCA9501.\n//\n// Procedure:\n// * write value to register (EEPROM address)\n// * read value back from register (EEPROM address) and check for differences\nfunc main() {\n\tconst (\n\t\tdefaultAddress = 0x7F\n\t\tmyAddress      = 0x44 // needs to be adjusted for your configuration\n\t)\n\tboard := digispark.NewAdaptor()\n\tdrv := i2c.NewDriver(board, \"PCA9501-EEPROM\", defaultAddress, i2c.WithAddress(myAddress))\n\tvar eepromAddr uint8 = 0x00\n\tvar register string\n\tvar valWr uint8 = 0xFF\n\tvar valRd int\n\tvar err error\n\n\twork := func() {\n\t\tgobot.Every(50*time.Millisecond, func() {\n\t\t\t// write a value 0-255 to EEPROM address 255-0\n\t\t\teepromAddr--\n\t\t\tvalWr++\n\t\t\tregister = strconv.Itoa(int(eepromAddr))\n\t\t\terr = drv.Write(register, int(valWr))\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"err write:\", err)\n\t\t\t}\n\n\t\t\t// write process needs some time, so wait at least 5ms before read a value\n\t\t\t// when decreasing to much, the check below will fail\n\t\t\ttime.Sleep(5 * time.Millisecond)\n\n\t\t\t// read value back and check for unexpected differences\n\t\t\tvalRd, err = drv.Read(register)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"err read:\", err)\n\t\t\t}\n\t\t\tif int(valWr) != valRd {\n\t\t\t\tfmt.Printf(\"addr: %d wr: %d differ rd: %d\\n\", eepromAddr, valWr, valRd)\n\t\t\t}\n\n\t\t\tif eepromAddr%10 == 0 {\n\t\t\t\tfmt.Printf(\"addr: %d, wr: %d rd: %d\\n\", eepromAddr, valWr, valRd)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"simpleDriverI2c\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{drv},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\nfunc main() {\n\tdigisparkAdaptor := digispark.NewAdaptor()\n\tled := gpio.NewLedDriver(digisparkAdaptor, \"0\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{digisparkAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_mpl115a2.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\nfunc main() {\n\tboard := digispark.NewAdaptor()\n\tmpl115a2 := i2c.NewMPL115A2Driver(board)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tpress, _ := mpl115a2.Pressure()\n\t\t\tfmt.Println(\"Pressure\", press)\n\n\t\t\ttemp, _ := mpl115a2.Temperature()\n\t\t\tfmt.Println(\"Temperature\", temp)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mpl115Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{mpl115a2},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_pca9501.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\n// Program use EEPROM with GPIO to rotate pins, get best experience, when\n// add LED's between +5V and each pin with an resistor of ~180 Ohm.\n//\n// Procedure:\n// * write value to EEPROM\n// * read value back from EEPROM and check for differences\n// * use read value to set GPIO\nfunc main() {\n\tboard := digispark.NewAdaptor()\n\tpca := i2c.NewPCA9501Driver(board, i2c.WithAddress(0x04))\n\tvar addressMem uint8 = 0x00\n\tvar valMemW uint8 = 0xFF\n\tvar valMemR uint8\n\tvar pin uint8 = 0\n\tvar newPin uint8 = 0\n\tvar pinState uint8 = 0\n\tvar err error\n\n\twork := func() {\n\t\tgobot.Every(50*time.Millisecond, func() {\n\t\t\t// write a value 0-255 to EEPROM address 255-0\n\t\t\taddressMem--\n\t\t\tvalMemW++\n\t\t\terr = pca.WriteEEPROM(addressMem, valMemW)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"err MEMw:\", err)\n\t\t\t}\n\n\t\t\t// write process needs some time, so wait at least 5ms before read a value\n\t\t\t// when decreasing to much, the check below will fail\n\t\t\ttime.Sleep(5 * time.Millisecond)\n\n\t\t\t// read value back and check for unexpected differences\n\t\t\tvalMemR, err = pca.ReadEEPROM(addressMem)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"err MEMr:\", err)\n\t\t\t}\n\t\t\tif valMemW != valMemR {\n\t\t\t\tfmt.Printf(\"addr: %d valMemW: %d differ valMemR: %d\\n\", addressMem, valMemW, valMemR)\n\t\t\t}\n\t\t\t// convert it to a pin 0-7\n\t\t\tnewPin = valMemR % 8\n\t\t\t// write only when something has changed\n\t\t\tif newPin != pin {\n\t\t\t\tpin = newPin\n\t\t\t\tfmt.Println(\"set Pin:\", pin, \"to:\", pinState)\n\t\t\t\terr = pca.WriteGPIO(pin, pinState)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"err GPIO:\", err)\n\t\t\t\t}\n\t\t\t\t// when all LED's are on switch off\n\t\t\t\tif pin >= 7 {\n\t\t\t\t\tif pinState == 0 {\n\t\t\t\t\t\tpinState = 1\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpinState = 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"rotatePinsI2c\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{pca},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/digispark_servo.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\nfunc main() {\n\tdigisparkAdaptor := digispark.NewAdaptor()\n\tservo := gpio.NewServoDriver(digisparkAdaptor, \"0\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\ti := uint8(gobot.Rand(180))\n\t\t\tfmt.Println(\"Turning\", i)\n\t\t\tif err := servo.Move(i); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"servoBot\",\n\t\t[]gobot.Connection{digisparkAdaptor},\n\t\t[]gobot.Device{servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/dragonboard_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/dragonboard\"\n)\n\nfunc main() {\n\tdragonAdaptor := dragonboard.NewAdaptor()\n\tbutton := gpio.NewButtonDriver(dragonAdaptor, \"GPIO_A\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tfmt.Println(\"button pressed\")\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"button released\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{dragonAdaptor},\n\t\t[]gobot.Device{button},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nconst boardType = \"arduino\" // \"sparkfun\" for a Sparkfun Edison board with the GPIO block\n\nfunc main() {\n\te := edison.NewAdaptor(boardType)\n\tled := gpio.NewLedDriver(e, \"13\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_blink_without_all_gobot_framework.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\n// Example of a simple led toggle without the initialization of\n// the entire gobot framework.\n// This might be useful if you want to use gobot as another\n// golang library to interact with sensors and other devices.\nfunc main() {\n\te := edison.NewAdaptor()\n\tif err := e.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tled := gpio.NewLedDriver(e, \"13\")\n\tif err := led.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tfor {\n\t\tif err := led.Toggle(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1000 * time.Millisecond)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_blinkm.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\te := edison.NewAdaptor()\n\tblinkm := i2c.NewBlinkMDriver(e)\n\n\twork := func() {\n\t\tgobot.Every(3*time.Second, func() {\n\t\t\tr := byte(gobot.Rand(255))\n\t\t\tg := byte(gobot.Rand(255))\n\t\t\tb := byte(gobot.Rand(255))\n\t\t\tif err := blinkm.Rgb(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tcolor, err := blinkm.Color()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"color %v\\n\", color)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkmBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{blinkm},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_bme280.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\ta := edison.NewAdaptor()\n\tbme280 := i2c.NewBME280Driver(a, i2c.WithAddress(0x76))\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tt, e := bme280.Temperature()\n\t\t\tfmt.Println(\"Temperature\", t)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\tp, e := bme280.Pressure()\n\t\t\tfmt.Println(\"Pressure\", p)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\ta, e := bme280.Altitude()\n\t\t\tfmt.Println(\"Altitude\", a)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\th, e := bme280.Humidity()\n\t\t\tfmt.Println(\"Humidity\", h)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bme280bot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{bme280},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\te := edison.NewAdaptor()\n\n\tbutton := gpio.NewButtonDriver(e, \"5\")\n\tled := gpio.NewLedDriver(e, \"13\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led, button},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_button_led.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\te := edison.NewAdaptor()\n\n\tbutton := gpio.NewButtonDriver(e, \"2\")\n\tled := gpio.NewLedDriver(e, \"4\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led, button},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_button_led_api.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\te := edison.NewAdaptor()\n\n\tbutton := gpio.NewButtonDriver(e, \"2\")\n\tled := gpio.NewLedDriver(e, \"4\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led, button},\n\t\twork,\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_accelerometer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\taccel := i2c.NewGroveAccelerometerDriver(board)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tif x, y, z, err := accel.XYZ(); err == nil {\n\t\t\t\tfmt.Println(x, y, z)\n\t\t\t\tfmt.Println(accel.Acceleration(x, y, z))\n\t\t\t} else {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"accelBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{accel},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_buzzer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\tbuzzer := gpio.NewBuzzerDriver(board, \"3\")\n\n\twork := func() {\n\t\ttype note struct {\n\t\t\ttone     float64\n\t\t\tduration float64\n\t\t}\n\n\t\tsong := []note{\n\t\t\t{gpio.C4, gpio.Quarter},\n\t\t\t{gpio.C4, gpio.Quarter},\n\t\t\t{gpio.G4, gpio.Quarter},\n\t\t\t{gpio.G4, gpio.Quarter},\n\t\t\t{gpio.A4, gpio.Quarter},\n\t\t\t{gpio.A4, gpio.Quarter},\n\t\t\t{gpio.G4, gpio.Half},\n\t\t\t{gpio.F4, gpio.Quarter},\n\t\t\t{gpio.F4, gpio.Quarter},\n\t\t\t{gpio.E4, gpio.Quarter},\n\t\t\t{gpio.E4, gpio.Quarter},\n\t\t\t{gpio.D4, gpio.Quarter},\n\t\t\t{gpio.D4, gpio.Quarter},\n\t\t\t{gpio.C4, gpio.Half},\n\t\t}\n\n\t\tfor _, val := range song {\n\t\t\tif err := buzzer.Tone(val.tone, val.duration); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{buzzer},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_lcd.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\tscreen := i2c.NewGroveLcdDriver(board)\n\n\twork := func() {\n\t\tif err := screen.Write(\"hello\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tif err := screen.SetRGB(255, 0, 0); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := screen.Clear(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.Home(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.SetRGB(0, 255, 0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// set a custom character in the first position\n\t\t\tif err := screen.SetCustomChar(0, i2c.CustomLCDChars[\"smiley\"]); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// add the custom character at the end of the string\n\t\t\tif err := screen.Write(\"goodbye\\nhave a nice day \" + string(byte(0))); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t\tif err := screen.Scroll(false); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tif err := screen.Home(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1 * time.Second)\n\t\tif err := screen.SetRGB(0, 0, 255); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"screenBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{screen},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_light_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\tsensor := aio.NewGroveLightSensorDriver(board, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(sensor.Event(\"data\"), func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_piezo_vibration.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\tsensor := aio.NewGrovePiezoVibrationSensorDriver(board, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Vibration, func(data interface{}) {\n\t\t\tfmt.Println(\"got one!\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_rotary_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\tsensor := aio.NewGroveRotaryDriver(board, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_sound_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\tsensor := aio.NewGroveSoundSensorDriver(board, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_grove_temperature_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor()\n\tsensor := aio.NewGroveTemperatureSensorDriver(board, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tfmt.Println(\"current temp (c): \", sensor.Temperature())\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\te := edison.NewAdaptor()\n\tled := gpio.NewLedDriver(e, \"3\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_led_brightness_with_analog_input.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\te := edison.NewAdaptor()\n\tsensor := aio.NewAnalogSensorDriver(e, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\tled := gpio.NewLedDriver(e, \"3\")\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tbrightness := uint8(\n\t\t\t\tgobot.ToScale(gobot.FromScale(float64(data.(int)), 0, 4096), 0, 255),\n\t\t\t)\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t\tfmt.Println(\"brightness\", brightness)\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{sensor, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/edison_miniboard_grove_accelerometer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tboard := edison.NewAdaptor(\"miniboard\")\n\n\taccel := i2c.NewGroveAccelerometerDriver(board)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tif x, y, z, err := accel.XYZ(); err == nil {\n\t\t\t\tfmt.Println(x, y, z)\n\t\t\t\tfmt.Println(accel.Acceleration(x, y, z))\n\t\t\t} else {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"accelBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{accel},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/every_done.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nfunc main() {\n\trobot := gobot.NewRobot(\n\t\t\"hello\",\n\t\tfunc() {\n\t\t\tdone := gobot.Every(750*time.Millisecond, func() {\n\t\t\t\tfmt.Println(\"Greetings human\")\n\t\t\t})\n\n\t\t\tgobot.After(5*time.Second, func() {\n\t\t\t\tdone.Stop()\n\t\t\t\tfmt.Println(\"We're done here\")\n\t\t\t})\n\t\t},\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_adxl345.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_adxl345.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tadxl345 := i2c.NewADXL345Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tx, y, z, _ := adxl345.XYZ()\n\n\t\t\tfmt.Printf(\"x: %.7f | y: %.7f | z: %.7f \\n\", x, y, z)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"adxl345Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{adxl345},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_aip1640.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_aip1640.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\t// In the WEMOS D1 Mini LED Matrix Shield clockPin = 14, dataPin = 13\n\taip1640 := gpio.NewAIP1640Driver(firmataAdaptor, \"14\", \"13\")\n\n\tsmiles := [3][8]byte{\n\t\t{0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C}, // happy :)\n\t\t{0x3C, 0x42, 0xA5, 0x81, 0xBD, 0x81, 0x42, 0x3C}, // normal :|\n\t\t{0x3C, 0x42, 0xA5, 0x81, 0x99, 0xA5, 0x42, 0x3C}, // sad  :(\n\t}\n\n\ts := 0\n\twork := func() {\n\t\taip1640.Clear()\n\t\tgobot.Every(600*time.Millisecond, func() {\n\t\t\taip1640.DrawMatrix(smiles[s])\n\t\t\tif err := aip1640.Display(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\ts++\n\t\t\tif s > 2 {\n\t\t\t\ts = 0\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"aip1640Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{aip1640},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_blink.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_blink_api.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\ta := api.NewAPI(manager)\n\ta.Start()\n\n\tfirmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_blink_metal.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\n// Example of a simple led toggle without the initialization of\n// the entire gobot framework.\n// This might be useful if you want to use gobot as another\n// golang library to interact with sensors and other devices.\nfunc main() {\n\tf := firmata.NewAdaptor(\"/dev/ttyACM0\")\n\tif err := f.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tled := gpio.NewLedDriver(f, \"13\")\n\tif err := led.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tfor {\n\t\tif err := led.Toggle(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1000 * time.Millisecond)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_blink_robot.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_blinkm.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_blinkm.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tblinkm := i2c.NewBlinkMDriver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(3*time.Second, func() {\n\t\t\tr := byte(gobot.Rand(255))\n\t\t\tg := byte(gobot.Rand(255))\n\t\t\tb := byte(gobot.Rand(255))\n\t\t\tif err := blinkm.Rgb(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tcolor, err := blinkm.Color()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"color %v\\n\", color)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkmBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{blinkm},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_bme280.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tbme280 := i2c.NewBME280Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tt, _ := bme280.Temperature()\n\t\t\tfmt.Println(\"Temperature\", t)\n\n\t\t\tp, _ := bme280.Pressure()\n\t\t\tfmt.Println(\"Pressure\", p)\n\n\t\t\ta, _ := bme280.Altitude()\n\t\t\tfmt.Println(\"Altitude\", a)\n\n\t\t\th, _ := bme280.Humidity()\n\t\t\tfmt.Println(\"Humidity\", h)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bme280bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{bme280},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_bmp180.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tbmp180 := i2c.NewBMP180Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tt, _ := bmp180.Temperature()\n\t\t\tfmt.Println(\"Temperature\", t)\n\n\t\t\tp, _ := bmp180.Pressure()\n\t\t\tfmt.Println(\"Pressure\", p)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bmp180bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{bmp180},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_bmp280.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tbmp280 := i2c.NewBMP280Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tt, _ := bmp280.Temperature()\n\t\t\tfmt.Println(\"Temperature\", t)\n\n\t\t\tp, _ := bmp280.Pressure()\n\t\t\tfmt.Println(\"Pressure\", p)\n\n\t\t\ta, _ := bmp280.Altitude()\n\t\t\tfmt.Println(\"Altitude\", a)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bmp280bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{bmp280},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_button.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\n\tbutton := gpio.NewButtonDriver(firmataAdaptor, \"2\")\n\tled := gpio.NewLedDriver(firmataAdaptor, \"3\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_buzzer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_buzzer.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tbuzzer := gpio.NewBuzzerDriver(firmataAdaptor, \"3\")\n\n\twork := func() {\n\t\ttype note struct {\n\t\t\ttone     float64\n\t\t\tduration float64\n\t\t}\n\n\t\tsong := []note{\n\t\t\t{gpio.C4, gpio.Quarter},\n\t\t\t{gpio.C4, gpio.Quarter},\n\t\t\t{gpio.G4, gpio.Quarter},\n\t\t\t{gpio.G4, gpio.Quarter},\n\t\t\t{gpio.A4, gpio.Quarter},\n\t\t\t{gpio.A4, gpio.Quarter},\n\t\t\t{gpio.G4, gpio.Half},\n\t\t\t{gpio.F4, gpio.Quarter},\n\t\t\t{gpio.F4, gpio.Quarter},\n\t\t\t{gpio.E4, gpio.Quarter},\n\t\t\t{gpio.E4, gpio.Quarter},\n\t\t\t{gpio.D4, gpio.Quarter},\n\t\t\t{gpio.D4, gpio.Quarter},\n\t\t\t{gpio.C4, gpio.Half},\n\t\t}\n\n\t\tfor _, val := range song {\n\t\t\tif err := buzzer.Tone(val.tone, val.duration); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{buzzer},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_cat_toy.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_cat_toy.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/leap\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tservo1 := gpio.NewServoDriver(firmataAdaptor, \"5\")\n\tservo2 := gpio.NewServoDriver(firmataAdaptor, \"3\")\n\n\tleapAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n\tleapDriver := leap.NewDriver(leapAdaptor)\n\n\twork := func() {\n\t\tx := 90.0\n\t\tz := 90.0\n\t\t_ = leapDriver.On(leap.MessageEvent, func(data interface{}) {\n\t\t\tif len(data.(leap.Frame).Hands) > 0 {\n\t\t\t\thand := data.(leap.Frame).Hands[0]\n\t\t\t\tx = gobot.ToScale(gobot.FromScale(hand.X(), -300, 300), 30, 150)\n\t\t\t\tz = gobot.ToScale(gobot.FromScale(hand.Z(), -300, 300), 30, 150)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\tif err := servo1.Move(uint8(x)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := servo2.Move(uint8(z)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Println(\"Current Angle: \", servo1.Angle(), \",\", servo2.Angle())\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{firmataAdaptor, leapAdaptor},\n\t\t[]gobot.Device{servo1, servo2, leapDriver},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_curie_imu.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_curie_imu.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/curie\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\timu := curie.NewIMUDriver(firmataAdaptor)\n\n\twork := func() {\n\t\t_ = imu.On(\"Accelerometer\", func(data interface{}) {\n\t\t\tlog.Println(\"Accelerometer\", data)\n\t\t})\n\n\t\t_ = imu.On(\"Gyroscope\", func(data interface{}) {\n\t\t\tlog.Println(\"Gyroscope\", data)\n\t\t})\n\n\t\t_ = imu.On(\"Temperature\", func(data interface{}) {\n\t\t\tlog.Println(\"Temperature\", data)\n\t\t})\n\n\t\t_ = imu.On(\"Motion\", func(data interface{}) {\n\t\t\tlog.Println(\"Motion\", data)\n\t\t})\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := imu.ReadAccelerometer(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := imu.ReadGyroscope(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := imu.ReadTemperature(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := imu.ReadMotion(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"curieBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{imu, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_curie_imu_shock_detect.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_curie_imu_shock_detect.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/curie\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\timu := curie.NewIMUDriver(firmataAdaptor)\n\n\twork := func() {\n\t\t_ = imu.On(\"Shock\", func(data interface{}) {\n\t\t\tlog.Println(\"Shock\", data)\n\t\t})\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\tif err := imu.EnableShockDetection(true); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"curieBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{imu, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_curie_imu_step_counter.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_curie_imu_step_counter.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/curie\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\timu := curie.NewIMUDriver(firmataAdaptor)\n\n\twork := func() {\n\t\t_ = imu.On(\"Steps\", func(data interface{}) {\n\t\t\tlog.Println(\"Steps\", data)\n\t\t})\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\tif err := imu.EnableStepCounter(true); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"curieBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{imu, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_curie_imu_tap_detect.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_curie_imu_tap_detect.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/curie\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\timu := curie.NewIMUDriver(firmataAdaptor)\n\n\twork := func() {\n\t\t_ = imu.On(\"Tap\", func(data interface{}) {\n\t\t\tlog.Println(\"Tap\", data)\n\t\t})\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\tif err := imu.EnableTapDetection(true); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"curieBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{imu, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_direct_pin.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tpin := gpio.NewDirectPinDriver(firmataAdaptor, \"13\")\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := pin.DigitalWrite(level); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif level == 1 {\n\t\t\t\tlevel = 0\n\t\t\t} else {\n\t\t\t\tlevel = 1\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{pin},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_gpio_max7219.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n This examples requires you to daisy-chain 4 led matrices based on MAX7219.\n It will turn on one led at a time, from the first led at the first matrix to the last led of the last matrix.\n\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_gpio_max7219.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tmaxim := gpio.NewMAX7219Driver(firmataAdaptor, \"11\", \"10\", \"9\", 4)\n\n\tvar digit byte = 1 // digit address goes from 0x01 (MAX7219Digit0) to 0x08 (MAX7219Digit8)\n\tvar bits byte = 1\n\tvar module uint\n\tcount := 0\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := maxim.ClearAll(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := maxim.One(module, digit, bits); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbits = bits << 1\n\n\t\t\tcount++\n\t\t\tif count > 7 {\n\t\t\t\tcount = 0\n\t\t\t\tdigit++\n\t\t\t\tbits = 1\n\t\t\t\tif digit > 8 {\n\t\t\t\t\tdigit = 1\n\t\t\t\t\tmodule++\n\t\t\t\t\tif module >= 4 {\n\t\t\t\t\t\tmodule = 0\n\t\t\t\t\t\tcount = 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"Max7219Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{maxim},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_grove_lcd.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tboard := firmata.NewAdaptor(os.Args[1])\n\tscreen := i2c.NewGroveLcdDriver(board)\n\n\twork := func() {\n\t\tif err := screen.Write(\"hello\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tif err := screen.SetRGB(255, 0, 0); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := screen.Clear(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.Home(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.SetRGB(0, 255, 0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// set a custom character in the first position\n\t\t\tif err := screen.SetCustomChar(0, i2c.CustomLCDChars[\"smiley\"]); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// add the custom character at the end of the string\n\t\t\tif err := screen.Write(\"goodbye\\nhave a nice day \" + string(byte(0))); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t\tif err := screen.Scroll(false); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tif err := screen.Home(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1 * time.Second)\n\t\tif err := screen.SetRGB(0, 0, 255); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"screenBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{screen},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_grove_sound_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tboard := firmata.NewAdaptor(os.Args[1])\n\tsensor := aio.NewGroveSoundSensorDriver(board, \"3\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_hmc6352.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_hmc6352.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\thmc6352 := i2c.NewHMC6352Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\theading, _ := hmc6352.Heading()\n\t\t\tfmt.Println(\"Heading\", heading)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"hmc6352Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{hmc6352},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_integration.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_integration.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tled1 := gpio.NewLedDriver(firmataAdaptor, \"3\")\n\tled2 := gpio.NewLedDriver(firmataAdaptor, \"4\")\n\tbutton := gpio.NewButtonDriver(firmataAdaptor, \"2\")\n\tsensor := aio.NewAnalogSensorDriver(firmataAdaptor, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led1.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tif err := led2.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tif err := led2.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tif err := led2.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led1, led2, button, sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_led_brightness.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"3\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_led_brightness_with_analog_input.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_led_brightness_with_analog_input.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tsensor := aio.NewAnalogSensorDriver(firmataAdaptor, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\tled := gpio.NewLedDriver(firmataAdaptor, \"3\")\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tbrightness := uint8(\n\t\t\t\tgobot.ToScale(gobot.FromScale(float64(data.(int)), 0, 1024), 0, 255),\n\t\t\t)\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t\tfmt.Println(\"brightness\", brightness)\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{sensor, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_lidarlite.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_lidarlite.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tlidar := i2c.NewLIDARLiteDriver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tdistance, _ := lidar.Distance()\n\t\t\tfmt.Println(\"Distance\", distance)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"lidarbot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{lidar},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_metal_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n// TO RUN:\n//\n//\tfirmata_metal_button <PORT>\n//\n// EXAMPLE:\n//\n//\tgo run ./examples/firmata_metal_button /dev/ttyACM0\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tf := firmata.NewAdaptor(os.Args[1])\n\tif err := f.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tled := gpio.NewLedDriver(f, \"2\")\n\tif err := led.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := led.Off(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tbutton := gpio.NewButtonDriver(f, \"3\")\n\tif err := button.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tbuttonEvents := button.Subscribe()\n\tfor event := range buttonEvents {\n\t\tfmt.Println(\"Event:\", event.Name, event.Data)\n\t\tif event.Name == gpio.ButtonPush {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_mma7660.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_mma7660.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tmma7660 := i2c.NewMMA7660Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tif x, y, z, err := mma7660.XYZ(); err == nil {\n\t\t\t\tfmt.Println(x, y, z)\n\t\t\t\tfmt.Println(mma7660.Acceleration(x, y, z))\n\t\t\t} else {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mma76602Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{mma7660},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_motor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_motor.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tmotor := gpio.NewMotorDriver(firmataAdaptor, \"3\")\n\n\twork := func() {\n\t\tspeed := byte(0)\n\t\tfadeAmount := byte(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := motor.SetSpeed(speed); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tspeed = speed + fadeAmount\n\t\t\tif speed == 0 || speed == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"motorBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{motor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_mpl115a2.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_mpl115a2.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tmpl115a2 := i2c.NewMPL115A2Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tpress, _ := mpl115a2.Pressure()\n\t\t\tfmt.Println(\"Pressure\", press)\n\n\t\t\ttemp, _ := mpl115a2.Temperature()\n\t\t\tfmt.Println(\"Temperature\", temp)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mpl115a2Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{mpl115a2},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_mpu6050.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_mpu6050.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tmpu6050 := i2c.NewMPU6050Driver(firmataAdaptor)\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := mpu6050.GetData(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tfmt.Println(\"Accelerometer\", mpu6050.Accelerometer)\n\t\t\tfmt.Println(\"Gyroscope\", mpu6050.Gyroscope)\n\t\t\tfmt.Println(\"Temperature\", mpu6050.Temperature)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mpu6050Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{mpu6050},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_pca9685.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_pca9685.go /dev/ttyACM0\n*/\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tpca9685 := i2c.NewPCA9685Driver(firmataAdaptor)\n\tservo := gpio.NewServoDriver(pca9685, \"15\")\n\n\twork := func() {\n\t\tif err := pca9685.SetPWMFreq(60); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tfor i := 10; i < 150; i += 10 {\n\t\t\tfmt.Println(\"Turning\", i)\n\t\t\tif err := servo.Move(uint8(i)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\ttime.Sleep(1 * time.Second)\n\t\t}\n\n\t\tfor i := 150; i > 10; i -= 10 {\n\t\t\tfmt.Println(\"Turning\", i)\n\t\t\tif err := servo.Move(uint8(i)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\ttime.Sleep(1 * time.Second)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"servoBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{pca9685, servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_pir_motion.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_pir_motion.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\n\tsensor := gpio.NewPIRMotionDriver(firmataAdaptor, \"5\")\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\twork := func() {\n\t\t_ = sensor.On(gpio.MotionDetected, func(data interface{}) {\n\t\t\tfmt.Println(gpio.MotionDetected)\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = sensor.On(gpio.MotionStopped, func(data interface{}) {\n\t\t\tfmt.Println(gpio.MotionStopped)\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"motionBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{sensor, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_rgb_led.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_rgb_led.go /dev/ttyACM0\n*/\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tboard := firmata.NewAdaptor(os.Args[1])\n\tled := gpio.NewRgbLedDriver(board, \"3\", \"5\", \"6\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := uint8(gobot.Rand(255))\n\t\t\tg := uint8(gobot.Rand(255))\n\t\t\tb := uint8(gobot.Rand(255))\n\t\t\tif err := led.SetRGB(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"rgbBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_servo.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_servo.go /dev/ttyACM0\n*/\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tservo := gpio.NewServoDriver(firmataAdaptor, \"3\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\ti := uint8(gobot.Rand(180))\n\t\t\tfmt.Println(\"Turning\", i)\n\t\t\tif err := servo.Move(i); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"servoBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_ssd1306.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\twidth := 128\n\theight := 64\n\tr := firmata.NewAdaptor(os.Args[1])\n\toled := i2c.NewSSD1306Driver(r, i2c.WithAddress(0x3c),\n\t\ti2c.WithSSD1306DisplayWidth(width), i2c.WithSSD1306DisplayHeight(height))\n\n\tstage := false\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tfmt.Println(\"displaying\")\n\t\t\toled.Clear()\n\t\t\tif stage {\n\t\t\t\tfor x := 0; x < width; x += 5 {\n\t\t\t\t\tfor y := 0; y < height; y++ {\n\t\t\t\t\t\toled.Set(x, y, 1)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstage = !stage\n\t\t\tif err := oled.Display(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ssd1306Robot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{oled},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_temp36.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_temp36.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tval, err := firmataAdaptor.AnalogRead(\"0\")\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvoltage := (float64(val) * 5) / 1024 // if using 3.3V replace 5 with 3.3\n\t\t\ttempC := (voltage - 0.5) * 100\n\t\t\ttempF := (tempC * 9 / 5) + 32\n\n\t\t\tfmt.Printf(\"%.2f°C\\n\", tempC)\n\t\t\tfmt.Printf(\"%.2f°F\\n\", tempF)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_tm1638.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_tm1638.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\n\t// Even thought the modules are connected among them, they are independent (not chained)\n\tmodules := make([]*gpio.TM1638Driver, 4)\n\tmodules[0] = gpio.NewTM1638Driver(firmataAdaptor, \"9\", \"8\", \"7\")\n\tmodules[1] = gpio.NewTM1638Driver(firmataAdaptor, \"9\", \"8\", \"6\")\n\tmodules[2] = gpio.NewTM1638Driver(firmataAdaptor, \"9\", \"8\", \"5\")\n\tmodules[3] = gpio.NewTM1638Driver(firmataAdaptor, \"9\", \"8\", \"4\")\n\n\tvar ledInt byte\n\tvar color byte\n\tvar offset int\n\n\t// Repeat and concat strings until long enough that with scroll it still shows text\n\tconst showText = \"  HELLO WORLD    -    gobot.io    -    TM1638  \"\n\ttext := showText\n\tfor len(text)-len(showText) < len(modules)*8 {\n\t\ttext += showText\n\t}\n\n\twork := func() {\n\t\tgobot.Every(400*time.Millisecond, func() {\n\t\t\t// Enable and change the color of the LEDs\n\t\t\tif err := modules[0].SetLED(color, ledInt); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := modules[1].SetLED(color, ledInt); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := modules[2].SetLED(color, ledInt); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := modules[3].SetLED(color, ledInt); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tledInt++\n\t\t\tif ledInt > 7 {\n\t\t\t\tledInt = 0\n\t\t\t\tcolor++\n\t\t\t\tif color > 2 {\n\t\t\t\t\tcolor = 0\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Scroll the text\n\t\t\tfor i := 0; i < 4; i++ {\n\t\t\t\tif err := modules[i].SetDisplayText(text[offset+8*i : offset+8*i+8]); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t\toffset++\n\t\t\tif offset >= len(showText) {\n\t\t\t\toffset = 0\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"tm1638Bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{modules[0], modules[1], modules[2], modules[3]},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_travis.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_travis.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\ntype TravisResponse struct {\n\tID                  int    `json:\"id\"`\n\tSlug                string `json:\"slug\"`\n\tDescription         string `json:\"description\"`\n\tPublicKey           string `json:\"public_key\"`\n\tLastBuildID         int    `json:\"last_build_id\"`\n\tLastBuildNumber     string `json:\"last_build_number\"`\n\tLastBuildStatus     int    `json:\"last_build_status\"`\n\tLastBuildResult     int    `json:\"last_build_result\"`\n\tLastBuildDuration   int    `json:\"last_build_duration\"`\n\tLastBuildLanguage   string `json:\"last_build_language\"`\n\tLastBuildStartedAt  string `json:\"last_build_started_at\"`\n\tLastBuildFinishedAt string `json:\"last_build_finished_at\"`\n}\n\nfunc turnOn(robot *gobot.Robot, device string) {\n\tif err := robot.Device(device).(*gpio.LedDriver).On(); err != nil {\n\t\tfmt.Println(err)\n\t}\n}\n\nfunc resetLeds(robot *gobot.Robot) {\n\tif err := robot.Device(\"red\").(*gpio.LedDriver).Off(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := robot.Device(\"green\").(*gpio.LedDriver).Off(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := robot.Device(\"blue\").(*gpio.LedDriver).Off(); err != nil {\n\t\tfmt.Println(err)\n\t}\n}\n\nfunc checkTravis(robot *gobot.Robot) {\n\tresetLeds(robot)\n\tuser := \"hybridgroup\"\n\tname := \"gobot\"\n\t// name := \"broken-arrow\"\n\tfmt.Printf(\"Checking repo %s/%s\\n\", user, name)\n\tturnOn(robot, \"blue\")\n\tresp, err := http.Get(fmt.Sprintf(\"https://api.travis-ci.org/repos/%s/%s.json\", user, name))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer resp.Body.Close()\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tvar travis TravisResponse\n\tif err := json.Unmarshal(body, &travis); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tresetLeds(robot)\n\tif travis.LastBuildStatus == 0 {\n\t\tturnOn(robot, \"green\")\n\t} else {\n\t\tturnOn(robot, \"red\")\n\t}\n}\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\tred := gpio.NewLedDriver(firmataAdaptor, \"7\", gpio.WithName(\"red\"))\n\tgreen := gpio.NewLedDriver(firmataAdaptor, \"6\", gpio.WithName(\"green\"))\n\tblue := gpio.NewLedDriver(firmataAdaptor, \"5\", gpio.WithName(\"blue\"))\n\n\twork := func() {\n\t\tcheckTravis(manager.Robot(\"travis\"))\n\t\tgobot.Every(10*time.Second, func() {\n\t\t\tcheckTravis(manager.Robot(\"travis\"))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"travis\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{red, green, blue},\n\t\twork,\n\t)\n\n\tmanager.AddRobot(robot)\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/firmata_wiichuck.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n Pass serial port to use as the first param:\n\n\tgo run examples/firmata_wiichuck.go /dev/ttyACM0\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(os.Args[1])\n\twiichuck := i2c.NewWiichuckDriver(firmataAdaptor)\n\n\twork := func() {\n\t\t_ = wiichuck.On(wiichuck.Event(\"joystick\"), func(data interface{}) {\n\t\t\tfmt.Println(\"joystick\", data)\n\t\t})\n\n\t\t_ = wiichuck.On(wiichuck.Event(\"c\"), func(data interface{}) {\n\t\t\tfmt.Println(\"c\")\n\t\t})\n\n\t\t_ = wiichuck.On(wiichuck.Event(\"z\"), func(data interface{}) {\n\t\t\tfmt.Println(\"z\")\n\t\t})\n\n\t\t_ = wiichuck.On(wiichuck.Event(\"error\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Wiichuck error:\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"chuck\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{wiichuck},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/gopigo3.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/dexter/gopigo3\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\traspiAdaptor := raspi.NewAdaptor()\n\tgpg3 := gopigo3.NewDriver(raspiAdaptor)\n\n\twork := func() {\n\t\ton := uint8(0xFF)\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\terr := gpg3.SetLED(gopigo3.LED_EYE_RIGHT, 0x00, 0x00, on)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\terr = gpg3.SetLED(gopigo3.LED_EYE_LEFT, ^on, 0x00, 0x00)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\ton = ^on\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"gopigo3eyeleds\",\n\t\t[]gobot.Connection{raspiAdaptor},\n\t\t[]gobot.Device{gpg3},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/gopigo3_grove_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/dexter/gopigo3\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\traspiAdaptor := raspi.NewAdaptor()\n\tgpg3 := gopigo3.NewDriver(raspiAdaptor)\n\tled := gpio.NewLedDriver(gpg3, \"AD_1_1\")\n\tbutton := gpio.NewButtonDriver(gpg3, \"AD_2_1\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tfmt.Println(\"On!\")\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"Off!\")\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"gopigo3button\",\n\t\t[]gobot.Connection{raspiAdaptor},\n\t\t[]gobot.Device{gpg3, button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/gopigo3_grove_lcd.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/dexter/gopigo3\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\traspiAdaptor := raspi.NewAdaptor()\n\tgpg3 := gopigo3.NewDriver(raspiAdaptor)\n\tscreen := i2c.NewGroveLcdDriver(raspiAdaptor)\n\n\twork := func() {\n\t\tmanufacturerName, _ := gpg3.GetManufacturerName()\n\t\tboardName, _ := gpg3.GetBoardName()\n\t\thardwareVersion, _ := gpg3.GetHardwareVersion()\n\t\tif err := screen.Write(manufacturerName[0:15]); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := screen.SetPosition(16); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := screen.Write(boardName + \" \" + hardwareVersion); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := screen.SetRGB(0, 0, 255); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := screen.Home(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"gopigo3lcd\",\n\t\t[]gobot.Connection{raspiAdaptor},\n\t\t[]gobot.Device{gpg3, screen},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/gopigo3_grove_light_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/dexter/gopigo3\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\traspiAdaptor := raspi.NewAdaptor()\n\tgpg3 := gopigo3.NewDriver(raspiAdaptor)\n\tsensor := aio.NewGroveLightSensorDriver(gpg3, \"AD_1_1\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(sensor.Event(\"data\"), func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"gopigo3sensor\",\n\t\t[]gobot.Connection{raspiAdaptor},\n\t\t[]gobot.Device{gpg3, sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/gopigo3_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/dexter/gopigo3\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\traspiAdaptor := raspi.NewAdaptor()\n\tgpg3 := gopigo3.NewDriver(raspiAdaptor)\n\tled := gpio.NewLedDriver(gpg3, \"AD_1_1\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"gopigo3pwm\",\n\t\t[]gobot.Connection{raspiAdaptor},\n\t\t[]gobot.Device{gpg3, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/gopigo3_servo.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/dexter/gopigo3\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\traspiAdaptor := raspi.NewAdaptor()\n\tgpg3 := gopigo3.NewDriver(raspiAdaptor)\n\tservo := gpio.NewServoDriver(gpg3, \"SERVO_1\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\ti := uint8(gobot.Rand(180))\n\t\t\tfmt.Println(\"Turning\", i)\n\t\t\tif err := servo.Move(i); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"gopigo3servo\",\n\t\t[]gobot.Connection{raspiAdaptor},\n\t\t[]gobot.Device{gpg3, servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/haarcascade_frontalface_alt.xml",
    "content": "<?xml version=\"1.0\"?>\n<!--\n    Stump-based 20x20 gentle adaboost frontal face detector.\n    Created by Rainer Lienhart.\n\n////////////////////////////////////////////////////////////////////////////////////////\n\n  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.\n\n  By downloading, copying, installing or using the software you agree to this license.\n  If you do not agree to this license, do not download, install,\n  copy or use the software.\n\n\n                        Intel License Agreement\n                For Open Source Computer Vision Library\n\n Copyright (C) 2000, Intel Corporation, all rights reserved.\n Third party copyrights are property of their respective owners.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n   * Redistribution's of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n\n   * Redistribution's in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation\n     and/or other materials provided with the distribution.\n\n   * The name of Intel Corporation may not be used to endorse or promote products\n     derived from this software without specific prior written permission.\n\n This software is provided by the copyright holders and contributors \"as is\" and\n any express or implied warranties, including, but not limited to, the implied\n warranties of merchantability and fitness for a particular purpose are disclaimed.\n In no event shall the Intel Corporation or contributors be liable for any direct,\n indirect, incidental, special, exemplary, or consequential damages\n (including, but not limited to, procurement of substitute goods or services;\n loss of use, data, or profits; or business interruption) however caused\n and on any theory of liability, whether in contract, strict liability,\n or tort (including negligence or otherwise) arising in any way out of\n the use of this software, even if advised of the possibility of such damage.\n-->\n<opencv_storage>\n<haarcascade_frontalface_alt type_id=\"opencv-haar-classifier\">\n  <size>20 20</size>\n  <stages>\n    <_>\n      <!-- stage 0 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 14 4 -1.</_>\n                <_>3 9 14 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0141958743333817e-003</threshold>\n            <left_val>0.0337941907346249</left_val>\n            <right_val>0.8378106951713562</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 4 -1.</_>\n                <_>7 2 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0151513395830989</threshold>\n            <left_val>0.1514132022857666</left_val>\n            <right_val>0.7488812208175659</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 15 9 -1.</_>\n                <_>1 10 15 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2109931819140911e-003</threshold>\n            <left_val>0.0900492817163467</left_val>\n            <right_val>0.6374819874763489</right_val></_></_></trees>\n      <stage_threshold>0.8226894140243530</stage_threshold>\n      <parent>-1</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 1 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 6 -1.</_>\n                <_>5 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6227109590545297e-003</threshold>\n            <left_val>0.0693085864186287</left_val>\n            <right_val>0.7110946178436279</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 3 -1.</_>\n                <_>9 5 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2906649392098188e-003</threshold>\n            <left_val>0.1795803010463715</left_val>\n            <right_val>0.6668692231178284</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 12 9 -1.</_>\n                <_>4 3 12 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0025708042085171e-003</threshold>\n            <left_val>0.1693672984838486</left_val>\n            <right_val>0.6554006934165955</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 10 8 -1.</_>\n                <_>6 13 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9659894108772278e-003</threshold>\n            <left_val>0.5866332054138184</left_val>\n            <right_val>0.0914145186543465</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 14 8 -1.</_>\n                <_>3 10 14 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5227010957896709e-003</threshold>\n            <left_val>0.1413166970014572</left_val>\n            <right_val>0.6031895875930786</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 6 10 -1.</_>\n                <_>14 1 3 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0366676896810532</threshold>\n            <left_val>0.3675672113895416</left_val>\n            <right_val>0.7920318245887756</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 5 12 -1.</_>\n                <_>7 12 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3361474573612213e-003</threshold>\n            <left_val>0.6161385774612427</left_val>\n            <right_val>0.2088509947061539</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 3 -1.</_>\n                <_>7 1 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6961314082145691e-003</threshold>\n            <left_val>0.2836230993270874</left_val>\n            <right_val>0.6360273957252502</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 17 2 -1.</_>\n                <_>1 9 17 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1488880263641477e-003</threshold>\n            <left_val>0.2223580926656723</left_val>\n            <right_val>0.5800700783729553</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 6 4 2 -1.</_>\n                <_>16 7 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1484689787030220e-003</threshold>\n            <left_val>0.2406464070081711</left_val>\n            <right_val>0.5787054896354675</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 17 2 2 -1.</_>\n                <_>5 18 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1219060290604830e-003</threshold>\n            <left_val>0.5559654831886292</left_val>\n            <right_val>0.1362237036228180</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 12 -1.</_>\n                <_>14 2 3 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0939491465687752</threshold>\n            <left_val>0.8502737283706665</left_val>\n            <right_val>0.4717740118503571</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 4 12 -1.</_>\n                <_>4 0 2 6 2.</_>\n                <_>6 6 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3777789426967502e-003</threshold>\n            <left_val>0.5993673801422119</left_val>\n            <right_val>0.2834529876708984</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 18 8 -1.</_>\n                <_>8 11 6 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0730631574988365</threshold>\n            <left_val>0.4341886043548584</left_val>\n            <right_val>0.7060034275054932</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 2 -1.</_>\n                <_>5 8 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6767389974556863e-004</threshold>\n            <left_val>0.3027887940406799</left_val>\n            <right_val>0.6051574945449829</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 5 3 -1.</_>\n                <_>15 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0479710809886456e-003</threshold>\n            <left_val>0.1798433959484100</left_val>\n            <right_val>0.5675256848335266</right_val></_></_></trees>\n      <stage_threshold>6.9566087722778320</stage_threshold>\n      <parent>0</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 2 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 10 9 -1.</_>\n                <_>5 6 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0165106896311045</threshold>\n            <left_val>0.6644225120544434</left_val>\n            <right_val>0.1424857974052429</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 14 -1.</_>\n                <_>9 11 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7052499353885651e-003</threshold>\n            <left_val>0.6325352191925049</left_val>\n            <right_val>0.1288477033376694</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 5 4 12 -1.</_>\n                <_>3 9 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8069869149476290e-003</threshold>\n            <left_val>0.1240288019180298</left_val>\n            <right_val>0.6193193197250366</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 5 -1.</_>\n                <_>8 5 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5402400167658925e-003</threshold>\n            <left_val>0.1432143002748489</left_val>\n            <right_val>0.5670015811920166</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 8 -1.</_>\n                <_>5 10 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.6386279175058007e-004</threshold>\n            <left_val>0.1657433062791824</left_val>\n            <right_val>0.5905207991600037</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 6 9 -1.</_>\n                <_>8 3 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9253729842603207e-003</threshold>\n            <left_val>0.2695507109165192</left_val>\n            <right_val>0.5738824009895325</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 8 -1.</_>\n                <_>9 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0214841030538082e-003</threshold>\n            <left_val>0.1893538981676102</left_val>\n            <right_val>0.5782774090766907</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 20 6 -1.</_>\n                <_>0 9 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6365420781075954e-003</threshold>\n            <left_val>0.2309329062700272</left_val>\n            <right_val>0.5695425868034363</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 17 -1.</_>\n                <_>9 0 2 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5127769438549876e-003</threshold>\n            <left_val>0.2759602069854736</left_val>\n            <right_val>0.5956642031669617</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 4 -1.</_>\n                <_>11 0 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0101574398577213</threshold>\n            <left_val>0.1732538044452667</left_val>\n            <right_val>0.5522047281265259</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 6 4 -1.</_>\n                <_>7 1 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0119536602869630</threshold>\n            <left_val>0.1339409947395325</left_val>\n            <right_val>0.5559014081954956</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 6 16 -1.</_>\n                <_>14 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8859491944313049e-003</threshold>\n            <left_val>0.3628703951835632</left_val>\n            <right_val>0.6188849210739136</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 18 8 -1.</_>\n                <_>0 5 9 4 2.</_>\n                <_>9 9 9 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0801329165697098</threshold>\n            <left_val>0.0912110507488251</left_val>\n            <right_val>0.5475944876670837</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 10 4 -1.</_>\n                <_>13 15 5 2 2.</_>\n                <_>8 17 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0643280111253262e-003</threshold>\n            <left_val>0.3715142905712128</left_val>\n            <right_val>0.5711399912834168</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 4 8 -1.</_>\n                <_>3 1 2 4 2.</_>\n                <_>5 5 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3419450260698795e-003</threshold>\n            <left_val>0.5953313708305359</left_val>\n            <right_val>0.3318097889423370</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 14 10 -1.</_>\n                <_>10 6 7 5 2.</_>\n                <_>3 11 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0546011403203011</threshold>\n            <left_val>0.1844065934419632</left_val>\n            <right_val>0.5602846145629883</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 6 16 -1.</_>\n                <_>4 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9071690514683723e-003</threshold>\n            <left_val>0.3594244122505188</left_val>\n            <right_val>0.6131715178489685</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 18 20 2 -1.</_>\n                <_>0 19 20 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4718717951327562e-004</threshold>\n            <left_val>0.5994353294372559</left_val>\n            <right_val>0.3459562957286835</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3013808317482471e-003</threshold>\n            <left_val>0.4172652065753937</left_val>\n            <right_val>0.6990845203399658</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5017572119832039e-003</threshold>\n            <left_val>0.4509715139865875</left_val>\n            <right_val>0.7801457047462463</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 9 6 -1.</_>\n                <_>0 14 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0241385009139776</threshold>\n            <left_val>0.5438212752342224</left_val>\n            <right_val>0.1319826990365982</right_val></_></_></trees>\n      <stage_threshold>9.4985427856445313</stage_threshold>\n      <parent>1</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 3 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 3 4 -1.</_>\n                <_>5 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9212230108678341e-003</threshold>\n            <left_val>0.1415266990661621</left_val>\n            <right_val>0.6199870705604553</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 16 -1.</_>\n                <_>9 11 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2748669541906565e-004</threshold>\n            <left_val>0.6191074252128601</left_val>\n            <right_val>0.1884928941726685</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 13 8 -1.</_>\n                <_>3 10 13 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1409931620582938e-004</threshold>\n            <left_val>0.1487396955490112</left_val>\n            <right_val>0.5857927799224854</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 8 2 -1.</_>\n                <_>12 3 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1878609918057919e-003</threshold>\n            <left_val>0.2746909856796265</left_val>\n            <right_val>0.6359239816665649</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 12 -1.</_>\n                <_>8 12 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1015717908740044e-003</threshold>\n            <left_val>0.5870851278305054</left_val>\n            <right_val>0.2175628989934921</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 8 6 -1.</_>\n                <_>15 3 4 3 2.</_>\n                <_>11 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1448440384119749e-003</threshold>\n            <left_val>0.5880944728851318</left_val>\n            <right_val>0.2979590892791748</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 19 -1.</_>\n                <_>9 1 2 19 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8977119363844395e-003</threshold>\n            <left_val>0.2373327016830444</left_val>\n            <right_val>0.5876647233963013</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 4 -1.</_>\n                <_>11 0 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0216106791049242</threshold>\n            <left_val>0.1220654994249344</left_val>\n            <right_val>0.5194202065467835</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 9 3 -1.</_>\n                <_>6 1 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6299318782985210e-003</threshold>\n            <left_val>0.2631230950355530</left_val>\n            <right_val>0.5817409157752991</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 10 4 -1.</_>\n                <_>13 15 5 2 2.</_>\n                <_>8 17 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9393711853772402e-004</threshold>\n            <left_val>0.3638620078563690</left_val>\n            <right_val>0.5698544979095459</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 6 10 -1.</_>\n                <_>3 3 3 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0538786612451077</threshold>\n            <left_val>0.4303531050682068</left_val>\n            <right_val>0.7559366226196289</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 15 15 -1.</_>\n                <_>3 9 15 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8887349870055914e-003</threshold>\n            <left_val>0.2122603058815002</left_val>\n            <right_val>0.5613427162170410</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 8 6 -1.</_>\n                <_>6 7 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3635339457541704e-003</threshold>\n            <left_val>0.5631849169731140</left_val>\n            <right_val>0.2642767131328583</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 10 -1.</_>\n                <_>10 4 6 5 2.</_>\n                <_>4 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0240177996456623</threshold>\n            <left_val>0.5797107815742493</left_val>\n            <right_val>0.2751705944538117</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 4 4 -1.</_>\n                <_>8 4 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0543030404951423e-004</threshold>\n            <left_val>0.2705242037773132</left_val>\n            <right_val>0.5752568840980530</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 2 -1.</_>\n                <_>15 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4790197433903813e-004</threshold>\n            <left_val>0.5435624718666077</left_val>\n            <right_val>0.2334876954555512</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 2 2 -1.</_>\n                <_>3 12 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4091329649090767e-003</threshold>\n            <left_val>0.5319424867630005</left_val>\n            <right_val>0.2063155025243759</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 11 1 3 -1.</_>\n                <_>16 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4642629539594054e-003</threshold>\n            <left_val>0.5418980717658997</left_val>\n            <right_val>0.3068861067295075</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 6 4 -1.</_>\n                <_>3 15 3 2 2.</_>\n                <_>6 17 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6352549428120255e-003</threshold>\n            <left_val>0.3695372939109802</left_val>\n            <right_val>0.6112868189811707</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 8 2 -1.</_>\n                <_>6 8 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3172752056270838e-004</threshold>\n            <left_val>0.3565036952495575</left_val>\n            <right_val>0.6025236248970032</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 1 3 -1.</_>\n                <_>3 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0998890977352858e-003</threshold>\n            <left_val>0.1913982033729553</left_val>\n            <right_val>0.5362827181816101</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 12 2 -1.</_>\n                <_>6 1 12 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4213981861248612e-004</threshold>\n            <left_val>0.3835555016994476</left_val>\n            <right_val>0.5529310107231140</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2655049581080675e-003</threshold>\n            <left_val>0.4312896132469177</left_val>\n            <right_val>0.7101895809173584</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 6 2 -1.</_>\n                <_>7 16 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9134991867467761e-004</threshold>\n            <left_val>0.3984830975532532</left_val>\n            <right_val>0.6391963958740234</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 4 6 -1.</_>\n                <_>0 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0152841797098517</threshold>\n            <left_val>0.2366732954978943</left_val>\n            <right_val>0.5433713793754578</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 12 2 -1.</_>\n                <_>8 12 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8381411470472813e-003</threshold>\n            <left_val>0.5817500948905945</left_val>\n            <right_val>0.3239189088344574</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 1 9 -1.</_>\n                <_>6 6 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1093179071322083e-004</threshold>\n            <left_val>0.5540593862533569</left_val>\n            <right_val>0.2911868989467621</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 17 3 2 -1.</_>\n                <_>11 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1275060288608074e-003</threshold>\n            <left_val>0.1775255054235458</left_val>\n            <right_val>0.5196629166603088</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4576259097084403e-004</threshold>\n            <left_val>0.3024170100688934</left_val>\n            <right_val>0.5533593893051148</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 4 -1.</_>\n                <_>9 6 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0226465407758951</threshold>\n            <left_val>0.4414930939674377</left_val>\n            <right_val>0.6975377202033997</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 3 2 -1.</_>\n                <_>8 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8804960418492556e-003</threshold>\n            <left_val>0.2791394889354706</left_val>\n            <right_val>0.5497952103614807</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 17 3 3 -1.</_>\n                <_>11 17 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0889107882976532e-003</threshold>\n            <left_val>0.5263199210166931</left_val>\n            <right_val>0.2385547012090683</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 3 2 -1.</_>\n                <_>8 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7318050377070904e-003</threshold>\n            <left_val>0.4319379031658173</left_val>\n            <right_val>0.6983600854873657</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 6 2 -1.</_>\n                <_>11 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8482700735330582e-003</threshold>\n            <left_val>0.3082042932510376</left_val>\n            <right_val>0.5390920042991638</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 14 4 -1.</_>\n                <_>3 13 14 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5062530110299122e-005</threshold>\n            <left_val>0.5521922111511231</left_val>\n            <right_val>0.3120366036891937</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 18 4 -1.</_>\n                <_>10 10 9 2 2.</_>\n                <_>1 12 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0294755697250366</threshold>\n            <left_val>0.5401322841644287</left_val>\n            <right_val>0.1770603060722351</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 3 3 -1.</_>\n                <_>0 11 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1387329846620560e-003</threshold>\n            <left_val>0.5178617835044861</left_val>\n            <right_val>0.1211019009351730</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 6 6 -1.</_>\n                <_>11 1 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0209429506212473</threshold>\n            <left_val>0.5290294289588928</left_val>\n            <right_val>0.3311221897602081</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 6 -1.</_>\n                <_>9 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.5665529370307922e-003</threshold>\n            <left_val>0.7471994161605835</left_val>\n            <right_val>0.4451968967914581</right_val></_></_></trees>\n      <stage_threshold>18.4129695892333980</stage_threshold>\n      <parent>2</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 4 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 9 -1.</_>\n                <_>1 3 18 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8206960996612906e-004</threshold>\n            <left_val>0.2064086049795151</left_val>\n            <right_val>0.6076732277870178</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 10 2 6 -1.</_>\n                <_>12 13 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6790600493550301e-003</threshold>\n            <left_val>0.5851997137069702</left_val>\n            <right_val>0.1255383938550949</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 19 8 -1.</_>\n                <_>0 9 19 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9827912375330925e-004</threshold>\n            <left_val>0.0940184295177460</left_val>\n            <right_val>0.5728961229324341</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 9 -1.</_>\n                <_>9 0 2 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8959012171253562e-004</threshold>\n            <left_val>0.1781987994909287</left_val>\n            <right_val>0.5694308876991272</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 6 1 -1.</_>\n                <_>7 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8560499195009470e-003</threshold>\n            <left_val>0.1638399064540863</left_val>\n            <right_val>0.5788664817810059</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 1 -1.</_>\n                <_>13 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8122469559311867e-003</threshold>\n            <left_val>0.2085440009832382</left_val>\n            <right_val>0.5508564710617065</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 4 6 -1.</_>\n                <_>5 13 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5896620461717248e-003</threshold>\n            <left_val>0.5702760815620422</left_val>\n            <right_val>0.1857215017080307</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 1 -1.</_>\n                <_>13 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0100783398374915</threshold>\n            <left_val>0.5116943120956421</left_val>\n            <right_val>0.2189770042896271</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 6 -1.</_>\n                <_>4 6 12 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0635263025760651</threshold>\n            <left_val>0.7131379842758179</left_val>\n            <right_val>0.4043813049793243</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 6 -1.</_>\n                <_>15 14 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1031491756439209e-003</threshold>\n            <left_val>0.2567181885242462</left_val>\n            <right_val>0.5463973283767700</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 2 -1.</_>\n                <_>10 3 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4035000242292881e-003</threshold>\n            <left_val>0.1700665950775147</left_val>\n            <right_val>0.5590974092483521</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 3 1 -1.</_>\n                <_>10 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5226360410451889e-003</threshold>\n            <left_val>0.5410556793212891</left_val>\n            <right_val>0.2619054019451141</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 4 14 -1.</_>\n                <_>3 1 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0179974399507046</threshold>\n            <left_val>0.3732436895370483</left_val>\n            <right_val>0.6535220742225647</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 4 4 -1.</_>\n                <_>11 0 2 2 2.</_>\n                <_>9 2 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4538191072642803e-003</threshold>\n            <left_val>0.2626481950283051</left_val>\n            <right_val>0.5537446141242981</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 1 14 -1.</_>\n                <_>7 12 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0118807600811124</threshold>\n            <left_val>0.2003753930330277</left_val>\n            <right_val>0.5544745922088623</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 0 1 4 -1.</_>\n                <_>19 2 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2713660253211856e-003</threshold>\n            <left_val>0.5591902732849121</left_val>\n            <right_val>0.3031975924968720</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 4 -1.</_>\n                <_>8 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1376109905540943e-003</threshold>\n            <left_val>0.2730407118797302</left_val>\n            <right_val>0.5646508932113648</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 18 3 2 -1.</_>\n                <_>10 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2651998810470104e-003</threshold>\n            <left_val>0.1405909061431885</left_val>\n            <right_val>0.5461820960044861</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 2 -1.</_>\n                <_>9 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9602861031889915e-003</threshold>\n            <left_val>0.1795035004615784</left_val>\n            <right_val>0.5459290146827698</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 6 -1.</_>\n                <_>4 7 12 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8448226451873779e-003</threshold>\n            <left_val>0.5736783146858215</left_val>\n            <right_val>0.2809219956398010</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 6 -1.</_>\n                <_>3 14 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6430689767003059e-003</threshold>\n            <left_val>0.2370675951242447</left_val>\n            <right_val>0.5503826141357422</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 2 12 -1.</_>\n                <_>10 12 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9997808635234833e-003</threshold>\n            <left_val>0.5608199834823608</left_val>\n            <right_val>0.3304282128810883</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 18 3 2 -1.</_>\n                <_>8 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1221720166504383e-003</threshold>\n            <left_val>0.1640105992555618</left_val>\n            <right_val>0.5378993153572083</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 2 -1.</_>\n                <_>11 0 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0156249096617103</threshold>\n            <left_val>0.5227649211883545</left_val>\n            <right_val>0.2288603931665421</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 9 3 -1.</_>\n                <_>5 12 9 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103564197197557</threshold>\n            <left_val>0.7016193866729736</left_val>\n            <right_val>0.4252927899360657</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 2 -1.</_>\n                <_>11 0 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7960809469223022e-003</threshold>\n            <left_val>0.2767347097396851</left_val>\n            <right_val>0.5355830192565918</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 5 -1.</_>\n                <_>7 1 6 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1622693985700607</threshold>\n            <left_val>0.4342240095138550</left_val>\n            <right_val>0.7442579269409180</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 4 4 -1.</_>\n                <_>10 0 2 2 2.</_>\n                <_>8 2 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5542530715465546e-003</threshold>\n            <left_val>0.5726485848426819</left_val>\n            <right_val>0.2582125067710877</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 1 3 -1.</_>\n                <_>3 13 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1309209987521172e-003</threshold>\n            <left_val>0.2106848061084747</left_val>\n            <right_val>0.5361018776893616</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 5 3 -1.</_>\n                <_>8 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0132084200158715</threshold>\n            <left_val>0.7593790888786316</left_val>\n            <right_val>0.4552468061447144</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 10 12 -1.</_>\n                <_>5 4 5 6 2.</_>\n                <_>10 10 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0659966766834259</threshold>\n            <left_val>0.1252475976943970</left_val>\n            <right_val>0.5344039797782898</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 9 12 -1.</_>\n                <_>9 10 9 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9142656177282333e-003</threshold>\n            <left_val>0.3315384089946747</left_val>\n            <right_val>0.5601043105125427</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 12 14 -1.</_>\n                <_>2 2 6 7 2.</_>\n                <_>8 9 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0208942797034979</threshold>\n            <left_val>0.5506049990653992</left_val>\n            <right_val>0.2768838107585907</right_val></_></_></trees>\n      <stage_threshold>15.3241395950317380</stage_threshold>\n      <parent>3</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 5 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 2 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1961159761995077e-003</threshold>\n            <left_val>0.1762690991163254</left_val>\n            <right_val>0.6156241297721863</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 6 4 -1.</_>\n                <_>7 6 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8679830245673656e-003</threshold>\n            <left_val>0.6118106842041016</left_val>\n            <right_val>0.1832399964332581</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 11 8 -1.</_>\n                <_>4 9 11 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9579799845814705e-004</threshold>\n            <left_val>0.0990442633628845</left_val>\n            <right_val>0.5723816156387329</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 10 16 4 -1.</_>\n                <_>3 12 16 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0255657667294145e-004</threshold>\n            <left_val>0.5579879879951477</left_val>\n            <right_val>0.2377282977104187</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 16 2 -1.</_>\n                <_>0 1 16 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4510810617357492e-003</threshold>\n            <left_val>0.2231457978487015</left_val>\n            <right_val>0.5858935117721558</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 2 -1.</_>\n                <_>9 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0361850298941135e-004</threshold>\n            <left_val>0.2653993964195252</left_val>\n            <right_val>0.5794103741645813</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 6 10 -1.</_>\n                <_>3 2 3 5 2.</_>\n                <_>6 7 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0293349884450436e-003</threshold>\n            <left_val>0.5803827047348023</left_val>\n            <right_val>0.2484865039587021</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 8 15 -1.</_>\n                <_>10 10 8 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0144517095759511</threshold>\n            <left_val>0.1830351948738098</left_val>\n            <right_val>0.5484204888343811</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 8 6 -1.</_>\n                <_>3 14 4 3 2.</_>\n                <_>7 17 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0380979403853416e-003</threshold>\n            <left_val>0.3363558948040009</left_val>\n            <right_val>0.6051092743873596</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 2 2 -1.</_>\n                <_>14 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6155190533027053e-003</threshold>\n            <left_val>0.2286642044782639</left_val>\n            <right_val>0.5441246032714844</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 7 6 -1.</_>\n                <_>1 13 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3458340913057327e-003</threshold>\n            <left_val>0.5625913143157959</left_val>\n            <right_val>0.2392338067293167</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 4 4 3 -1.</_>\n                <_>15 4 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6379579901695251e-003</threshold>\n            <left_val>0.3906993865966797</left_val>\n            <right_val>0.5964621901512146</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 9 14 6 -1.</_>\n                <_>2 9 7 3 2.</_>\n                <_>9 12 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0302512105554342</threshold>\n            <left_val>0.5248482227325440</left_val>\n            <right_val>0.1575746983289719</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 4 -1.</_>\n                <_>5 9 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0372519902884960</threshold>\n            <left_val>0.4194310903549194</left_val>\n            <right_val>0.6748418807983398</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 8 -1.</_>\n                <_>6 9 4 4 2.</_>\n                <_>10 13 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0251097902655602</threshold>\n            <left_val>0.1882549971342087</left_val>\n            <right_val>0.5473451018333435</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 3 2 -1.</_>\n                <_>14 2 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3099058568477631e-003</threshold>\n            <left_val>0.1339973062276840</left_val>\n            <right_val>0.5227110981941223</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 4 2 -1.</_>\n                <_>3 4 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2086479691788554e-003</threshold>\n            <left_val>0.3762088119983673</left_val>\n            <right_val>0.6109635829925537</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 8 -1.</_>\n                <_>11 14 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0219076797366142</threshold>\n            <left_val>0.2663142979145050</left_val>\n            <right_val>0.5404006838798523</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 5 3 -1.</_>\n                <_>0 1 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4116579703986645e-003</threshold>\n            <left_val>0.5363578796386719</left_val>\n            <right_val>0.2232273072004318</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 18 8 -1.</_>\n                <_>11 5 9 4 2.</_>\n                <_>2 9 9 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0699463263154030</threshold>\n            <left_val>0.5358232855796814</left_val>\n            <right_val>0.2453698068857193</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 6 -1.</_>\n                <_>6 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4520021290518343e-004</threshold>\n            <left_val>0.2409671992063522</left_val>\n            <right_val>0.5376930236816406</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 1 1 3 -1.</_>\n                <_>19 2 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2627709656953812e-003</threshold>\n            <left_val>0.5425856709480286</left_val>\n            <right_val>0.3155693113803864</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 6 -1.</_>\n                <_>9 6 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0227195098996162</threshold>\n            <left_val>0.4158405959606171</left_val>\n            <right_val>0.6597865223884583</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 1 1 3 -1.</_>\n                <_>19 2 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8111000536009669e-003</threshold>\n            <left_val>0.2811253070831299</left_val>\n            <right_val>0.5505244731903076</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3469670452177525e-003</threshold>\n            <left_val>0.5260028243064880</left_val>\n            <right_val>0.1891465038061142</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 8 12 -1.</_>\n                <_>12 4 4 6 2.</_>\n                <_>8 10 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0791751234792173e-004</threshold>\n            <left_val>0.5673509240150452</left_val>\n            <right_val>0.3344210088253021</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 3 -1.</_>\n                <_>7 2 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127347996458411</threshold>\n            <left_val>0.5343592166900635</left_val>\n            <right_val>0.2395612001419067</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 9 10 -1.</_>\n                <_>6 6 9 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3119727894663811e-003</threshold>\n            <left_val>0.6010890007019043</left_val>\n            <right_val>0.4022207856178284</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 6 12 -1.</_>\n                <_>2 4 2 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0569487512111664</threshold>\n            <left_val>0.8199151158332825</left_val>\n            <right_val>0.4543190896511078</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0116591155529022e-003</threshold>\n            <left_val>0.2200281023979187</left_val>\n            <right_val>0.5357710719108582</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 5 3 -1.</_>\n                <_>7 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0334368608891964e-003</threshold>\n            <left_val>0.4413081109523773</left_val>\n            <right_val>0.7181751132011414</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 3 3 -1.</_>\n                <_>15 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9437441155314445e-003</threshold>\n            <left_val>0.5478860735893250</left_val>\n            <right_val>0.2791733145713806</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 8 3 -1.</_>\n                <_>6 15 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6591119132936001e-003</threshold>\n            <left_val>0.6357867717742920</left_val>\n            <right_val>0.3989723920822144</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 3 3 -1.</_>\n                <_>15 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8456181064248085e-003</threshold>\n            <left_val>0.3493686020374298</left_val>\n            <right_val>0.5300664901733398</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 3 3 -1.</_>\n                <_>2 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1926261298358440e-003</threshold>\n            <left_val>0.1119614988565445</left_val>\n            <right_val>0.5229672789573669</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 12 -1.</_>\n                <_>10 7 6 6 2.</_>\n                <_>4 13 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0527989417314529</threshold>\n            <left_val>0.2387102991342545</left_val>\n            <right_val>0.5453451275825501</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 6 -1.</_>\n                <_>10 7 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9537667334079742e-003</threshold>\n            <left_val>0.7586917877197266</left_val>\n            <right_val>0.4439376890659332</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 5 2 -1.</_>\n                <_>8 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7344180271029472e-003</threshold>\n            <left_val>0.2565476894378662</left_val>\n            <right_val>0.5489321947097778</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 4 -1.</_>\n                <_>9 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8507939530536532e-003</threshold>\n            <left_val>0.6734347939491272</left_val>\n            <right_val>0.4252474904060364</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 8 -1.</_>\n                <_>9 10 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0159189198166132</threshold>\n            <left_val>0.5488352775573731</left_val>\n            <right_val>0.2292661964893341</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 6 -1.</_>\n                <_>8 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2687679845839739e-003</threshold>\n            <left_val>0.6104331016540527</left_val>\n            <right_val>0.4022389948368073</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 3 3 -1.</_>\n                <_>12 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2883910723030567e-003</threshold>\n            <left_val>0.5310853123664856</left_val>\n            <right_val>0.1536193042993546</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 1 -1.</_>\n                <_>7 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2259892001748085e-003</threshold>\n            <left_val>0.1729111969470978</left_val>\n            <right_val>0.5241606235504150</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 3 -1.</_>\n                <_>5 7 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0121325999498367</threshold>\n            <left_val>0.6597759723663330</left_val>\n            <right_val>0.4325182139873505</right_val></_></_></trees>\n      <stage_threshold>21.0106391906738280</stage_threshold>\n      <parent>4</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 6 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 6 9 -1.</_>\n                <_>7 6 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9184908382594585e-003</threshold>\n            <left_val>0.6103435158729553</left_val>\n            <right_val>0.1469330936670303</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 9 1 -1.</_>\n                <_>9 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5971299726516008e-003</threshold>\n            <left_val>0.2632363140583038</left_val>\n            <right_val>0.5896466970443726</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 16 8 -1.</_>\n                <_>2 12 16 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0177801102399826</threshold>\n            <left_val>0.5872874259948731</left_val>\n            <right_val>0.1760361939668655</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 6 -1.</_>\n                <_>14 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5334769897162914e-004</threshold>\n            <left_val>0.1567801982164383</left_val>\n            <right_val>0.5596066117286682</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 6 15 -1.</_>\n                <_>1 10 6 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8353091329336166e-004</threshold>\n            <left_val>0.1913153976202011</left_val>\n            <right_val>0.5732036232948303</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 6 9 -1.</_>\n                <_>10 3 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6104689566418529e-003</threshold>\n            <left_val>0.2914913892745972</left_val>\n            <right_val>0.5623080730438232</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 7 14 -1.</_>\n                <_>6 13 7 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0977506190538406</threshold>\n            <left_val>0.1943476945161820</left_val>\n            <right_val>0.5648233294487000</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 3 6 -1.</_>\n                <_>13 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5182358482852578e-004</threshold>\n            <left_val>0.3134616911411285</left_val>\n            <right_val>0.5504639744758606</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 15 4 -1.</_>\n                <_>6 8 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128582203760743</threshold>\n            <left_val>0.2536481916904450</left_val>\n            <right_val>0.5760142803192139</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 3 10 -1.</_>\n                <_>11 7 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1530239395797253e-003</threshold>\n            <left_val>0.5767722129821777</left_val>\n            <right_val>0.3659774065017700</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 4 6 -1.</_>\n                <_>3 9 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7092459602281451e-003</threshold>\n            <left_val>0.2843191027641296</left_val>\n            <right_val>0.5918939113616943</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 3 6 10 -1.</_>\n                <_>15 3 2 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.5217359699308872e-003</threshold>\n            <left_val>0.4052427113056183</left_val>\n            <right_val>0.6183109283447266</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 10 -1.</_>\n                <_>5 7 4 5 2.</_>\n                <_>9 12 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2479810286313295e-003</threshold>\n            <left_val>0.5783755183219910</left_val>\n            <right_val>0.3135401010513306</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 12 -1.</_>\n                <_>10 4 6 6 2.</_>\n                <_>4 10 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0520062111318111</threshold>\n            <left_val>0.5541312098503113</left_val>\n            <right_val>0.1916636973619461</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 6 9 -1.</_>\n                <_>3 4 2 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0120855299755931</threshold>\n            <left_val>0.4032655954360962</left_val>\n            <right_val>0.6644591093063355</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 2 5 -1.</_>\n                <_>11 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4687820112158079e-005</threshold>\n            <left_val>0.3535977900028229</left_val>\n            <right_val>0.5709382891654968</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 2 5 -1.</_>\n                <_>8 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1395188570022583e-006</threshold>\n            <left_val>0.3037444949150085</left_val>\n            <right_val>0.5610269904136658</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 2 3 -1.</_>\n                <_>10 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6001640148460865e-003</threshold>\n            <left_val>0.7181087136268616</left_val>\n            <right_val>0.4580326080322266</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 6 2 -1.</_>\n                <_>8 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0058949012309313e-003</threshold>\n            <left_val>0.5621951818466187</left_val>\n            <right_val>0.2953684031963348</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5050270855426788e-003</threshold>\n            <left_val>0.4615387916564941</left_val>\n            <right_val>0.7619017958641052</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 12 6 -1.</_>\n                <_>4 14 12 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0117468303069472</threshold>\n            <left_val>0.5343837141990662</left_val>\n            <right_val>0.1772529035806656</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 5 9 -1.</_>\n                <_>11 14 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0583163388073444</threshold>\n            <left_val>0.1686245948076248</left_val>\n            <right_val>0.5340772271156311</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 3 2 -1.</_>\n                <_>6 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3629379575140774e-004</threshold>\n            <left_val>0.3792056143283844</left_val>\n            <right_val>0.6026803851127625</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 5 -1.</_>\n                <_>12 0 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8156180679798126e-003</threshold>\n            <left_val>0.1512867063283920</left_val>\n            <right_val>0.5324323773384094</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 7 -1.</_>\n                <_>8 5 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108761601150036</threshold>\n            <left_val>0.2081822007894516</left_val>\n            <right_val>0.5319945216178894</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 1 9 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7745519764721394e-003</threshold>\n            <left_val>0.4098246991634369</left_val>\n            <right_val>0.5210328102111816</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 4 8 -1.</_>\n                <_>3 2 2 4 2.</_>\n                <_>5 6 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8276381827890873e-004</threshold>\n            <left_val>0.5693274140357971</left_val>\n            <right_val>0.3478842079639435</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 12 4 6 -1.</_>\n                <_>13 14 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0138704096898437</threshold>\n            <left_val>0.5326750874519348</left_val>\n            <right_val>0.2257698029279709</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 4 6 -1.</_>\n                <_>3 14 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0236749108880758</threshold>\n            <left_val>0.1551305055618286</left_val>\n            <right_val>0.5200707912445068</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 4 -1.</_>\n                <_>13 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4879409718560055e-005</threshold>\n            <left_val>0.5500566959381104</left_val>\n            <right_val>0.3820176124572754</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 4 3 -1.</_>\n                <_>4 5 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6190641112625599e-003</threshold>\n            <left_val>0.4238683879375458</left_val>\n            <right_val>0.6639748215675354</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 11 8 -1.</_>\n                <_>7 9 11 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0198171101510525</threshold>\n            <left_val>0.2150038033723831</left_val>\n            <right_val>0.5382357835769653</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 4 -1.</_>\n                <_>8 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8154039066284895e-003</threshold>\n            <left_val>0.6675711274147034</left_val>\n            <right_val>0.4215297102928162</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 6 1 -1.</_>\n                <_>11 1 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9775829538702965e-003</threshold>\n            <left_val>0.2267289012670517</left_val>\n            <right_val>0.5386328101158142</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 3 3 -1.</_>\n                <_>5 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2441020701080561e-003</threshold>\n            <left_val>0.4308691024780273</left_val>\n            <right_val>0.6855735778808594</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 20 6 -1.</_>\n                <_>10 9 10 3 2.</_>\n                <_>0 12 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0122824599966407</threshold>\n            <left_val>0.5836614966392517</left_val>\n            <right_val>0.3467479050159454</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 5 -1.</_>\n                <_>9 6 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8548699337989092e-003</threshold>\n            <left_val>0.7016944885253906</left_val>\n            <right_val>0.4311453998088837</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 1 3 -1.</_>\n                <_>11 1 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7875669077038765e-003</threshold>\n            <left_val>0.2895345091819763</left_val>\n            <right_val>0.5224946141242981</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 4 2 -1.</_>\n                <_>4 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2201230274513364e-003</threshold>\n            <left_val>0.2975570857524872</left_val>\n            <right_val>0.5481644868850708</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 4 3 -1.</_>\n                <_>12 7 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0101605998352170</threshold>\n            <left_val>0.4888817965984345</left_val>\n            <right_val>0.8182697892189026</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 6 4 -1.</_>\n                <_>7 0 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0161745697259903</threshold>\n            <left_val>0.1481492966413498</left_val>\n            <right_val>0.5239992737770081</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 8 -1.</_>\n                <_>10 7 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0192924607545137</threshold>\n            <left_val>0.4786309897899628</left_val>\n            <right_val>0.7378190755844116</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>10 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.2479539513587952e-003</threshold>\n            <left_val>0.7374222874641419</left_val>\n            <right_val>0.4470643997192383</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 14 4 -1.</_>\n                <_>13 7 7 2 2.</_>\n                <_>6 9 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3803480267524719e-003</threshold>\n            <left_val>0.3489154875278473</left_val>\n            <right_val>0.5537996292114258</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 3 6 -1.</_>\n                <_>0 7 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0126061299815774</threshold>\n            <left_val>0.2379686981439591</left_val>\n            <right_val>0.5315443277359009</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 4 -1.</_>\n                <_>13 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0256219301372766</threshold>\n            <left_val>0.1964688003063202</left_val>\n            <right_val>0.5138769745826721</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 4 -1.</_>\n                <_>4 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5741496402770281e-005</threshold>\n            <left_val>0.5590522885322571</left_val>\n            <right_val>0.3365853130817413</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 8 -1.</_>\n                <_>11 9 6 4 2.</_>\n                <_>5 13 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0892108827829361</threshold>\n            <left_val>0.0634046569466591</left_val>\n            <right_val>0.5162634849548340</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 3 -1.</_>\n                <_>9 13 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7670480776578188e-003</threshold>\n            <left_val>0.7323467731475830</left_val>\n            <right_val>0.4490706026554108</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 2 4 -1.</_>\n                <_>10 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7152578695677221e-004</threshold>\n            <left_val>0.4114834964275360</left_val>\n            <right_val>0.5985518097877502</right_val></_></_></trees>\n      <stage_threshold>23.9187908172607420</stage_threshold>\n      <parent>5</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 7 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 1 -1.</_>\n                <_>9 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4786219689995050e-003</threshold>\n            <left_val>0.2663545012474060</left_val>\n            <right_val>0.6643316745758057</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 6 6 -1.</_>\n                <_>15 3 3 3 2.</_>\n                <_>12 6 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8741659587249160e-003</threshold>\n            <left_val>0.6143848896026611</left_val>\n            <right_val>0.2518512904644013</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 10 6 -1.</_>\n                <_>0 6 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7151009524241090e-003</threshold>\n            <left_val>0.5766341090202332</left_val>\n            <right_val>0.2397463023662567</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 8 14 -1.</_>\n                <_>12 3 4 7 2.</_>\n                <_>8 10 4 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8939269939437509e-003</threshold>\n            <left_val>0.5682045817375183</left_val>\n            <right_val>0.2529144883155823</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 7 15 -1.</_>\n                <_>4 9 7 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3006052039563656e-003</threshold>\n            <left_val>0.1640675961971283</left_val>\n            <right_val>0.5556079745292664</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 6 8 -1.</_>\n                <_>15 2 3 4 2.</_>\n                <_>12 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0466625317931175</threshold>\n            <left_val>0.6123154163360596</left_val>\n            <right_val>0.4762830138206482</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 6 8 -1.</_>\n                <_>2 2 3 4 2.</_>\n                <_>5 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9431332414969802e-004</threshold>\n            <left_val>0.5707858800888062</left_val>\n            <right_val>0.2839404046535492</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 18 7 -1.</_>\n                <_>8 13 6 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0148916700854898</threshold>\n            <left_val>0.4089672863483429</left_val>\n            <right_val>0.6006367206573486</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 8 14 -1.</_>\n                <_>4 3 4 7 2.</_>\n                <_>8 10 4 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2046529445797205e-003</threshold>\n            <left_val>0.5712450742721558</left_val>\n            <right_val>0.2705289125442505</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 6 -1.</_>\n                <_>18 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0619381256401539e-003</threshold>\n            <left_val>0.5262504220008850</left_val>\n            <right_val>0.3262225985527039</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5286648888140917e-003</threshold>\n            <left_val>0.6853830814361572</left_val>\n            <right_val>0.4199256896972656</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 6 -1.</_>\n                <_>18 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.9010218828916550e-003</threshold>\n            <left_val>0.3266282081604004</left_val>\n            <right_val>0.5434812903404236</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 2 6 -1.</_>\n                <_>0 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6702760048210621e-003</threshold>\n            <left_val>0.5468410849571228</left_val>\n            <right_val>0.2319003939628601</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 18 6 -1.</_>\n                <_>1 7 18 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0304100364446640e-003</threshold>\n            <left_val>0.5570667982101440</left_val>\n            <right_val>0.2708238065242767</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 7 -1.</_>\n                <_>3 2 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9803649522364140e-003</threshold>\n            <left_val>0.3700568974018097</left_val>\n            <right_val>0.5890625715255737</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 6 14 -1.</_>\n                <_>7 10 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0758405104279518</threshold>\n            <left_val>0.2140070050954819</left_val>\n            <right_val>0.5419948101043701</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 13 10 -1.</_>\n                <_>3 12 13 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0192625392228365</threshold>\n            <left_val>0.5526772141456604</left_val>\n            <right_val>0.2726590037345886</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 15 2 2 -1.</_>\n                <_>11 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8888259364757687e-004</threshold>\n            <left_val>0.3958011865615845</left_val>\n            <right_val>0.6017209887504578</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 16 4 -1.</_>\n                <_>2 11 8 2 2.</_>\n                <_>10 13 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0293695498257875</threshold>\n            <left_val>0.5241373777389526</left_val>\n            <right_val>0.1435758024454117</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0417619487270713e-003</threshold>\n            <left_val>0.3385409116744995</left_val>\n            <right_val>0.5929983258247376</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 9 -1.</_>\n                <_>6 13 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6125640142709017e-003</threshold>\n            <left_val>0.5485377907752991</left_val>\n            <right_val>0.3021597862243652</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 1 6 -1.</_>\n                <_>14 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6977467183023691e-004</threshold>\n            <left_val>0.3375276029109955</left_val>\n            <right_val>0.5532032847404480</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 4 1 -1.</_>\n                <_>7 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9512659208849072e-004</threshold>\n            <left_val>0.5631743073463440</left_val>\n            <right_val>0.3359399139881134</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 15 5 -1.</_>\n                <_>8 8 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1015655994415283</threshold>\n            <left_val>0.0637350380420685</left_val>\n            <right_val>0.5230425000190735</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 6 5 4 -1.</_>\n                <_>1 8 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0361566990613937</threshold>\n            <left_val>0.5136963129043579</left_val>\n            <right_val>0.1029528975486755</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 17 6 -1.</_>\n                <_>3 3 17 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4624140243977308e-003</threshold>\n            <left_val>0.3879320025444031</left_val>\n            <right_val>0.5558289289474487</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 8 2 -1.</_>\n                <_>10 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0195549800992012</threshold>\n            <left_val>0.5250086784362793</left_val>\n            <right_val>0.1875859946012497</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 2 -1.</_>\n                <_>10 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3121440317481756e-003</threshold>\n            <left_val>0.6672028899192810</left_val>\n            <right_val>0.4679641127586365</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>9 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8605289515107870e-003</threshold>\n            <left_val>0.7163379192352295</left_val>\n            <right_val>0.4334670901298523</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 4 2 -1.</_>\n                <_>8 10 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4026362057775259e-004</threshold>\n            <left_val>0.3021360933780670</left_val>\n            <right_val>0.5650203227996826</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 3 -1.</_>\n                <_>8 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2418331615626812e-003</threshold>\n            <left_val>0.1820009052753449</left_val>\n            <right_val>0.5250256061553955</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 4 -1.</_>\n                <_>9 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1729019752237946e-004</threshold>\n            <left_val>0.3389188051223755</left_val>\n            <right_val>0.5445973277091980</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1878840159624815e-003</threshold>\n            <left_val>0.4085349142551422</left_val>\n            <right_val>0.6253563165664673</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 6 -1.</_>\n                <_>10 7 6 3 2.</_>\n                <_>4 10 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108813596889377</threshold>\n            <left_val>0.3378399014472961</left_val>\n            <right_val>0.5700082778930664</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7354859737679362e-003</threshold>\n            <left_val>0.4204635918140411</left_val>\n            <right_val>0.6523038744926453</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>9 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5119052305817604e-003</threshold>\n            <left_val>0.2595216035842896</left_val>\n            <right_val>0.5428143739700317</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 3 8 -1.</_>\n                <_>8 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2136430013924837e-003</threshold>\n            <left_val>0.6165143847465515</left_val>\n            <right_val>0.3977893888950348</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 3 6 -1.</_>\n                <_>11 0 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103542404249310</threshold>\n            <left_val>0.1628028005361557</left_val>\n            <right_val>0.5219504833221436</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 4 8 -1.</_>\n                <_>8 3 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5858830455690622e-004</threshold>\n            <left_val>0.3199650943279266</left_val>\n            <right_val>0.5503574013710022</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 13 -1.</_>\n                <_>14 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0152996499091387</threshold>\n            <left_val>0.4103994071483612</left_val>\n            <right_val>0.6122388243675232</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 3 6 -1.</_>\n                <_>8 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215882100164890</threshold>\n            <left_val>0.1034912988543510</left_val>\n            <right_val>0.5197384953498840</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 13 -1.</_>\n                <_>14 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1283462941646576</threshold>\n            <left_val>0.8493865132331848</left_val>\n            <right_val>0.4893102943897247</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 10 4 -1.</_>\n                <_>0 7 5 2 2.</_>\n                <_>5 9 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2927189711481333e-003</threshold>\n            <left_val>0.3130157887935638</left_val>\n            <right_val>0.5471575260162354</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 13 -1.</_>\n                <_>14 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0799151062965393</threshold>\n            <left_val>0.4856320917606354</left_val>\n            <right_val>0.6073989272117615</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 6 13 -1.</_>\n                <_>3 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0794410929083824</threshold>\n            <left_val>0.8394674062728882</left_val>\n            <right_val>0.4624533057212830</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 4 1 -1.</_>\n                <_>9 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2800010889768600e-003</threshold>\n            <left_val>0.1881695985794067</left_val>\n            <right_val>0.5306698083877564</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 2 1 -1.</_>\n                <_>9 0 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0463109938427806e-003</threshold>\n            <left_val>0.5271229147911072</left_val>\n            <right_val>0.2583065927028656</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 4 4 -1.</_>\n                <_>12 16 2 2 2.</_>\n                <_>10 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6317298761568964e-004</threshold>\n            <left_val>0.4235304892063141</left_val>\n            <right_val>0.5735440850257874</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 3 -1.</_>\n                <_>10 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6173160187900066e-003</threshold>\n            <left_val>0.6934396028518677</left_val>\n            <right_val>0.4495444893836975</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 2 -1.</_>\n                <_>8 5 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0114218797534704</threshold>\n            <left_val>0.5900921225547791</left_val>\n            <right_val>0.4138193130493164</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9963278900831938e-003</threshold>\n            <left_val>0.6466382741928101</left_val>\n            <right_val>0.4327239990234375</right_val></_></_></trees>\n      <stage_threshold>24.5278797149658200</stage_threshold>\n      <parent>6</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 8 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 8 6 -1.</_>\n                <_>6 6 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9691245704889297e-003</threshold>\n            <left_val>0.6142324209213257</left_val>\n            <right_val>0.2482212036848068</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 12 -1.</_>\n                <_>9 11 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3073059320449829e-004</threshold>\n            <left_val>0.5704951882362366</left_val>\n            <right_val>0.2321965992450714</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 6 8 -1.</_>\n                <_>4 10 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4045301405712962e-004</threshold>\n            <left_val>0.2112251967191696</left_val>\n            <right_val>0.5814933180809021</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 8 5 -1.</_>\n                <_>12 2 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5424019917845726e-003</threshold>\n            <left_val>0.2950482070446014</left_val>\n            <right_val>0.5866311788558960</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 18 3 -1.</_>\n                <_>0 9 18 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.2477443104144186e-005</threshold>\n            <left_val>0.2990990877151489</left_val>\n            <right_val>0.5791326761245728</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 8 -1.</_>\n                <_>8 16 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6603146046400070e-003</threshold>\n            <left_val>0.2813029885292053</left_val>\n            <right_val>0.5635542273521423</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 8 5 -1.</_>\n                <_>4 2 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0515816807746887e-003</threshold>\n            <left_val>0.3535369038581848</left_val>\n            <right_val>0.6054757237434387</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 4 -1.</_>\n                <_>13 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3835240649059415e-004</threshold>\n            <left_val>0.5596532225608826</left_val>\n            <right_val>0.2731510996818543</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.8168973636347800e-005</threshold>\n            <left_val>0.5978031754493713</left_val>\n            <right_val>0.3638561069965363</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 3 1 -1.</_>\n                <_>12 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1298790341243148e-003</threshold>\n            <left_val>0.2755252122879028</left_val>\n            <right_val>0.5432729125022888</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 5 3 -1.</_>\n                <_>7 14 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4356150105595589e-003</threshold>\n            <left_val>0.4305641949176788</left_val>\n            <right_val>0.7069833278656006</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 7 6 -1.</_>\n                <_>11 14 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0568293295800686</threshold>\n            <left_val>0.2495242953300476</left_val>\n            <right_val>0.5294997096061707</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 7 6 -1.</_>\n                <_>2 14 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0668169967830181e-003</threshold>\n            <left_val>0.5478553175926209</left_val>\n            <right_val>0.2497723996639252</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 2 6 -1.</_>\n                <_>12 16 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8164798499783501e-005</threshold>\n            <left_val>0.3938601016998291</left_val>\n            <right_val>0.5706356167793274</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 3 3 -1.</_>\n                <_>8 15 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1795017682015896e-003</threshold>\n            <left_val>0.4407606124877930</left_val>\n            <right_val>0.7394766807556152</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 5 -1.</_>\n                <_>12 0 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4985752105712891e-003</threshold>\n            <left_val>0.5445243120193481</left_val>\n            <right_val>0.2479152977466583</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 4 9 -1.</_>\n                <_>8 1 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0211090557277203e-003</threshold>\n            <left_val>0.2544766962528229</left_val>\n            <right_val>0.5338971018791199</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 6 1 -1.</_>\n                <_>12 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4247528314590454e-003</threshold>\n            <left_val>0.2718858122825623</left_val>\n            <right_val>0.5324069261550903</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>8 10 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0559899965301156e-003</threshold>\n            <left_val>0.3178288042545319</left_val>\n            <right_val>0.5534508824348450</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6465808777138591e-004</threshold>\n            <left_val>0.4284219145774841</left_val>\n            <right_val>0.6558194160461426</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 18 4 2 -1.</_>\n                <_>5 19 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7524109464138746e-004</threshold>\n            <left_val>0.5902860760688782</left_val>\n            <right_val>0.3810262978076935</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 18 6 -1.</_>\n                <_>2 3 18 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2293202131986618e-003</threshold>\n            <left_val>0.3816489875316620</left_val>\n            <right_val>0.5709385871887207</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 2 -1.</_>\n                <_>7 0 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.2868210691958666e-003</threshold>\n            <left_val>0.1747743934392929</left_val>\n            <right_val>0.5259544253349304</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 8 6 2 -1.</_>\n                <_>16 8 3 1 2.</_>\n                <_>13 9 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5611879643984139e-004</threshold>\n            <left_val>0.3601722121238709</left_val>\n            <right_val>0.5725612044334412</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 6 -1.</_>\n                <_>6 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3621381488919724e-006</threshold>\n            <left_val>0.5401858091354370</left_val>\n            <right_val>0.3044497072696686</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 4 -1.</_>\n                <_>10 13 10 2 2.</_>\n                <_>0 15 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0147672500461340</threshold>\n            <left_val>0.3220770061016083</left_val>\n            <right_val>0.5573434829711914</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 5 -1.</_>\n                <_>9 7 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0244895908981562</threshold>\n            <left_val>0.4301528036594391</left_val>\n            <right_val>0.6518812775611877</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 2 2 -1.</_>\n                <_>11 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7652091123163700e-004</threshold>\n            <left_val>0.3564583063125610</left_val>\n            <right_val>0.5598236918449402</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 6 2 -1.</_>\n                <_>1 8 3 1 2.</_>\n                <_>4 9 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3657688517414499e-006</threshold>\n            <left_val>0.3490782976150513</left_val>\n            <right_val>0.5561897754669190</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 2 -1.</_>\n                <_>10 2 10 1 2.</_>\n                <_>0 3 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0150999398902059</threshold>\n            <left_val>0.1776272058486939</left_val>\n            <right_val>0.5335299968719482</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 5 3 -1.</_>\n                <_>7 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8316650316119194e-003</threshold>\n            <left_val>0.6149687767028809</left_val>\n            <right_val>0.4221394062042236</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 6 -1.</_>\n                <_>10 13 3 3 2.</_>\n                <_>7 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0169254001230001</threshold>\n            <left_val>0.5413014888763428</left_val>\n            <right_val>0.2166585028171539</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0477850232273340e-003</threshold>\n            <left_val>0.6449490785598755</left_val>\n            <right_val>0.4354617893695831</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 11 1 6 -1.</_>\n                <_>16 13 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2140589319169521e-003</threshold>\n            <left_val>0.5400155186653137</left_val>\n            <right_val>0.3523217141628265</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 1 6 -1.</_>\n                <_>3 13 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0023201145231724e-003</threshold>\n            <left_val>0.2774524092674255</left_val>\n            <right_val>0.5338417291641235</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 14 12 -1.</_>\n                <_>11 4 7 6 2.</_>\n                <_>4 10 7 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4182129465043545e-003</threshold>\n            <left_val>0.5676739215850830</left_val>\n            <right_val>0.3702817857265472</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8764587417244911e-003</threshold>\n            <left_val>0.7749221920967102</left_val>\n            <right_val>0.4583688974380493</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7311739977449179e-003</threshold>\n            <left_val>0.5338721871376038</left_val>\n            <right_val>0.3996661007404327</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 3 -1.</_>\n                <_>6 7 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5082379579544067e-003</threshold>\n            <left_val>0.5611963272094727</left_val>\n            <right_val>0.3777498900890350</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0541074275970459e-003</threshold>\n            <left_val>0.2915228903293610</left_val>\n            <right_val>0.5179182887077332</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 4 10 -1.</_>\n                <_>3 1 2 5 2.</_>\n                <_>5 6 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.7938813269138336e-004</threshold>\n            <left_val>0.5536432862281799</left_val>\n            <right_val>0.3700192868709564</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 2 -1.</_>\n                <_>5 7 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8745909482240677e-003</threshold>\n            <left_val>0.3754391074180603</left_val>\n            <right_val>0.5679376125335693</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4936719350516796e-003</threshold>\n            <left_val>0.7019699215888977</left_val>\n            <right_val>0.4480949938297272</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 3 -1.</_>\n                <_>15 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4389229044318199e-003</threshold>\n            <left_val>0.2310364991426468</left_val>\n            <right_val>0.5313386917114258</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 4 -1.</_>\n                <_>8 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5094640487805009e-004</threshold>\n            <left_val>0.5864868760108948</left_val>\n            <right_val>0.4129343032836914</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 12 -1.</_>\n                <_>13 10 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4528800420521293e-005</threshold>\n            <left_val>0.3732407093048096</left_val>\n            <right_val>0.5619621276855469</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 12 -1.</_>\n                <_>4 5 6 6 2.</_>\n                <_>10 11 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0407580696046352</threshold>\n            <left_val>0.5312091112136841</left_val>\n            <right_val>0.2720521986484528</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 7 3 -1.</_>\n                <_>7 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6505931317806244e-003</threshold>\n            <left_val>0.4710015952587128</left_val>\n            <right_val>0.6693493723869324</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 3 -1.</_>\n                <_>3 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5759351924061775e-003</threshold>\n            <left_val>0.5167819261550903</left_val>\n            <right_val>0.1637275964021683</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 14 2 -1.</_>\n                <_>10 2 7 1 2.</_>\n                <_>3 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5269311890006065e-003</threshold>\n            <left_val>0.5397608876228333</left_val>\n            <right_val>0.2938531935214996</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 3 10 -1.</_>\n                <_>1 1 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0136603796854615</threshold>\n            <left_val>0.7086488008499146</left_val>\n            <right_val>0.4532200098037720</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 5 -1.</_>\n                <_>11 0 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0273588690906763</threshold>\n            <left_val>0.5206481218338013</left_val>\n            <right_val>0.3589231967926025</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 6 2 -1.</_>\n                <_>8 7 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2197551596909761e-004</threshold>\n            <left_val>0.3507075905799866</left_val>\n            <right_val>0.5441123247146606</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 10 -1.</_>\n                <_>7 6 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3077080734074116e-003</threshold>\n            <left_val>0.5859522819519043</left_val>\n            <right_val>0.4024891853332520</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 3 -1.</_>\n                <_>7 1 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0106311095878482</threshold>\n            <left_val>0.6743267178535461</left_val>\n            <right_val>0.4422602951526642</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 6 -1.</_>\n                <_>16 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0194416493177414</threshold>\n            <left_val>0.5282716155052185</left_val>\n            <right_val>0.1797904968261719</right_val></_></_></trees>\n      <stage_threshold>27.1533508300781250</stage_threshold>\n      <parent>7</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 9 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 7 6 -1.</_>\n                <_>6 6 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5052167735993862e-003</threshold>\n            <left_val>0.5914731025695801</left_val>\n            <right_val>0.2626559138298035</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 2 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9562279339879751e-003</threshold>\n            <left_val>0.2312581986188889</left_val>\n            <right_val>0.5741627216339111</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 17 10 -1.</_>\n                <_>0 9 17 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8924784213304520e-003</threshold>\n            <left_val>0.1656530052423477</left_val>\n            <right_val>0.5626654028892517</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 15 16 -1.</_>\n                <_>3 12 15 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0836383774876595</threshold>\n            <left_val>0.5423449873924255</left_val>\n            <right_val>0.1957294940948486</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 6 4 -1.</_>\n                <_>7 17 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2282270472496748e-003</threshold>\n            <left_val>0.3417904078960419</left_val>\n            <right_val>0.5992503762245178</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 4 9 -1.</_>\n                <_>15 2 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7629169896245003e-003</threshold>\n            <left_val>0.3719581961631775</left_val>\n            <right_val>0.6079903841018677</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 3 2 -1.</_>\n                <_>2 4 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6417410224676132e-003</threshold>\n            <left_val>0.2577486038208008</left_val>\n            <right_val>0.5576915740966797</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 7 9 -1.</_>\n                <_>13 9 7 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4113149158656597e-003</threshold>\n            <left_val>0.2950749099254608</left_val>\n            <right_val>0.5514171719551086</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0110693201422691</threshold>\n            <left_val>0.7569358944892883</left_val>\n            <right_val>0.4477078914642334</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 6 -1.</_>\n                <_>10 2 10 3 2.</_>\n                <_>0 5 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0348659716546535</threshold>\n            <left_val>0.5583708882331848</left_val>\n            <right_val>0.2669621109962463</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 6 10 -1.</_>\n                <_>3 2 3 5 2.</_>\n                <_>6 7 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5701099811121821e-004</threshold>\n            <left_val>0.5627313256263733</left_val>\n            <right_val>0.2988890111446381</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 10 3 4 -1.</_>\n                <_>13 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0243391301482916</threshold>\n            <left_val>0.2771185040473938</left_val>\n            <right_val>0.5108863115310669</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 3 4 -1.</_>\n                <_>4 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9435202274471521e-004</threshold>\n            <left_val>0.5580651760101318</left_val>\n            <right_val>0.3120341897010803</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 3 -1.</_>\n                <_>9 5 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2971509024500847e-003</threshold>\n            <left_val>0.3330250084400177</left_val>\n            <right_val>0.5679075717926025</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 8 -1.</_>\n                <_>7 10 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7801829166710377e-003</threshold>\n            <left_val>0.2990534901618958</left_val>\n            <right_val>0.5344808101654053</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 11 20 6 -1.</_>\n                <_>0 14 20 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1342066973447800</threshold>\n            <left_val>0.1463858932256699</left_val>\n            <right_val>0.5392568111419678</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 4 6 -1.</_>\n                <_>4 13 2 3 2.</_>\n                <_>6 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.5224548345431685e-004</threshold>\n            <left_val>0.3746953904628754</left_val>\n            <right_val>0.5692734718322754</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>10 0 4 6 2.</_>\n                <_>6 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0405455417931080</threshold>\n            <left_val>0.2754747867584229</left_val>\n            <right_val>0.5484297871589661</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 15 2 -1.</_>\n                <_>2 1 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2572970008477569e-003</threshold>\n            <left_val>0.3744584023952484</left_val>\n            <right_val>0.5756075978279114</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4249948374927044e-003</threshold>\n            <left_val>0.7513859272003174</left_val>\n            <right_val>0.4728231132030487</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 1 2 -1.</_>\n                <_>3 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0908129196614027e-004</threshold>\n            <left_val>0.5404896736145020</left_val>\n            <right_val>0.2932321131229401</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2808450264856219e-003</threshold>\n            <left_val>0.6169779896736145</left_val>\n            <right_val>0.4273349046707153</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 3 1 -1.</_>\n                <_>8 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8348860321566463e-003</threshold>\n            <left_val>0.2048496007919312</left_val>\n            <right_val>0.5206472277641296</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 7 3 6 -1.</_>\n                <_>17 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0274848695844412</threshold>\n            <left_val>0.5252984762191773</left_val>\n            <right_val>0.1675522029399872</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 3 2 -1.</_>\n                <_>8 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2372419480234385e-003</threshold>\n            <left_val>0.5267782807350159</left_val>\n            <right_val>0.2777658104896545</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 5 3 -1.</_>\n                <_>11 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8635291904211044e-003</threshold>\n            <left_val>0.6954557895660400</left_val>\n            <right_val>0.4812048971652985</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 5 3 -1.</_>\n                <_>4 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1753971017897129e-003</threshold>\n            <left_val>0.4291887879371643</left_val>\n            <right_val>0.6349195837974548</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 3 1 2 -1.</_>\n                <_>19 4 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7098189564421773e-003</threshold>\n            <left_val>0.2930536866188049</left_val>\n            <right_val>0.5361248850822449</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 4 3 -1.</_>\n                <_>5 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5328548662364483e-003</threshold>\n            <left_val>0.4495325088500977</left_val>\n            <right_val>0.7409694194793701</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 7 3 6 -1.</_>\n                <_>17 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.5372907817363739e-003</threshold>\n            <left_val>0.3149119913578033</left_val>\n            <right_val>0.5416501760482788</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 3 6 -1.</_>\n                <_>0 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0253109894692898</threshold>\n            <left_val>0.5121892094612122</left_val>\n            <right_val>0.1311707943677902</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 9 -1.</_>\n                <_>14 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0364609695971012</threshold>\n            <left_val>0.5175911784172058</left_val>\n            <right_val>0.2591339945793152</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 5 6 -1.</_>\n                <_>0 6 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0208543296903372</threshold>\n            <left_val>0.5137140154838562</left_val>\n            <right_val>0.1582316011190414</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 6 2 -1.</_>\n                <_>12 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7207747856155038e-004</threshold>\n            <left_val>0.5574309825897217</left_val>\n            <right_val>0.4398978948593140</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 6 2 -1.</_>\n                <_>6 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5227000403683633e-005</threshold>\n            <left_val>0.5548940896987915</left_val>\n            <right_val>0.3708069920539856</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 4 6 -1.</_>\n                <_>8 3 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.4316509310156107e-004</threshold>\n            <left_val>0.3387419879436493</left_val>\n            <right_val>0.5554211139678955</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6037859972566366e-003</threshold>\n            <left_val>0.5358061790466309</left_val>\n            <right_val>0.3411171138286591</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 3 -1.</_>\n                <_>6 7 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8057891912758350e-003</threshold>\n            <left_val>0.6125202775001526</left_val>\n            <right_val>0.4345862865447998</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 5 9 -1.</_>\n                <_>0 4 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0470216609537601</threshold>\n            <left_val>0.2358165979385376</left_val>\n            <right_val>0.5193738937377930</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 15 -1.</_>\n                <_>16 0 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0369541086256504</threshold>\n            <left_val>0.7323111295700073</left_val>\n            <right_val>0.4760943949222565</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 3 2 -1.</_>\n                <_>1 11 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0439479956403375e-003</threshold>\n            <left_val>0.5419455170631409</left_val>\n            <right_val>0.3411330878734589</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 1 10 -1.</_>\n                <_>14 9 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1050689974799752e-004</threshold>\n            <left_val>0.2821694016456604</left_val>\n            <right_val>0.5554947257041931</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 12 -1.</_>\n                <_>2 1 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0808315873146057</threshold>\n            <left_val>0.9129930138587952</left_val>\n            <right_val>0.4697434902191162</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 4 2 -1.</_>\n                <_>11 11 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6579059087671340e-004</threshold>\n            <left_val>0.6022670269012451</left_val>\n            <right_val>0.3978292942047119</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 4 2 -1.</_>\n                <_>7 11 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2545920617412776e-004</threshold>\n            <left_val>0.5613213181495667</left_val>\n            <right_val>0.3845539987087250</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 15 5 -1.</_>\n                <_>8 8 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0687864869832993</threshold>\n            <left_val>0.2261611968278885</left_val>\n            <right_val>0.5300496816635132</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 10 -1.</_>\n                <_>3 0 3 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0124157899990678</threshold>\n            <left_val>0.4075691998004913</left_val>\n            <right_val>0.5828812122344971</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 3 2 -1.</_>\n                <_>12 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7174817882478237e-003</threshold>\n            <left_val>0.2827253937721252</left_val>\n            <right_val>0.5267757773399353</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 3 8 -1.</_>\n                <_>8 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0381368584930897</threshold>\n            <left_val>0.5074741244316101</left_val>\n            <right_val>0.1023615971207619</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 5 3 -1.</_>\n                <_>8 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8168049175292253e-003</threshold>\n            <left_val>0.6169006824493408</left_val>\n            <right_val>0.4359692931175232</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 4 3 -1.</_>\n                <_>7 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1303603947162628e-003</threshold>\n            <left_val>0.4524433016777039</left_val>\n            <right_val>0.7606095075607300</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 3 2 -1.</_>\n                <_>12 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0056019574403763e-003</threshold>\n            <left_val>0.5240408778190613</left_val>\n            <right_val>0.1859712004661560</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 14 4 -1.</_>\n                <_>3 15 7 2 2.</_>\n                <_>10 17 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0191393196582794</threshold>\n            <left_val>0.5209379196166992</left_val>\n            <right_val>0.2332071959972382</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 16 4 -1.</_>\n                <_>10 2 8 2 2.</_>\n                <_>2 4 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0164457596838474</threshold>\n            <left_val>0.5450702905654907</left_val>\n            <right_val>0.3264234960079193</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 6 12 -1.</_>\n                <_>3 8 3 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0373568907380104</threshold>\n            <left_val>0.6999046802520752</left_val>\n            <right_val>0.4533241987228394</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 2 -1.</_>\n                <_>5 7 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0197279006242752</threshold>\n            <left_val>0.2653664946556091</left_val>\n            <right_val>0.5412809848785400</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 5 -1.</_>\n                <_>10 7 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6972579807043076e-003</threshold>\n            <left_val>0.4480566084384918</left_val>\n            <right_val>0.7138652205467224</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4457528535276651e-004</threshold>\n            <left_val>0.4231350123882294</left_val>\n            <right_val>0.5471320152282715</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 8 2 -1.</_>\n                <_>0 14 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1790640419349074e-003</threshold>\n            <left_val>0.5341702103614807</left_val>\n            <right_val>0.3130455017089844</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0349806100130081</threshold>\n            <left_val>0.5118659734725952</left_val>\n            <right_val>0.3430530130863190</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 6 4 -1.</_>\n                <_>1 7 3 2 2.</_>\n                <_>4 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6859792675822973e-004</threshold>\n            <left_val>0.3532187044620514</left_val>\n            <right_val>0.5468639731407166</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 1 12 -1.</_>\n                <_>12 12 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0113406497985125</threshold>\n            <left_val>0.2842353880405426</left_val>\n            <right_val>0.5348700881004334</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>10 5 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6228108480572701e-003</threshold>\n            <left_val>0.6883640289306641</left_val>\n            <right_val>0.4492664933204651</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 3 -1.</_>\n                <_>14 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0160330981016159e-003</threshold>\n            <left_val>0.1709893941879273</left_val>\n            <right_val>0.5224308967590332</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 3 -1.</_>\n                <_>4 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4206819469109178e-003</threshold>\n            <left_val>0.5290846228599548</left_val>\n            <right_val>0.2993383109569550</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7801711112260818e-003</threshold>\n            <left_val>0.6498854160308838</left_val>\n            <right_val>0.4460499882698059</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 2 4 -1.</_>\n                <_>5 2 1 2 2.</_>\n                <_>6 4 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4747589593753219e-003</threshold>\n            <left_val>0.3260438144207001</left_val>\n            <right_val>0.5388113260269165</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 11 3 -1.</_>\n                <_>5 6 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0238303393125534</threshold>\n            <left_val>0.7528941035270691</left_val>\n            <right_val>0.4801219999790192</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 4 12 -1.</_>\n                <_>7 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9369790144264698e-003</threshold>\n            <left_val>0.5335165858268738</left_val>\n            <right_val>0.3261427879333496</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 13 8 5 -1.</_>\n                <_>12 13 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2806255668401718e-003</threshold>\n            <left_val>0.4580394029617310</left_val>\n            <right_val>0.5737829804420471</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 1 12 -1.</_>\n                <_>7 12 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0104395002126694</threshold>\n            <left_val>0.2592320144176483</left_val>\n            <right_val>0.5233827829360962</right_val></_></_></trees>\n      <stage_threshold>34.5541114807128910</stage_threshold>\n      <parent>8</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 10 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 6 3 -1.</_>\n                <_>4 2 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2006587870419025e-003</threshold>\n            <left_val>0.3258886039257050</left_val>\n            <right_val>0.6849808096885681</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 10 -1.</_>\n                <_>12 5 3 5 2.</_>\n                <_>9 10 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8593589086085558e-003</threshold>\n            <left_val>0.5838881134986877</left_val>\n            <right_val>0.2537829875946045</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 8 12 -1.</_>\n                <_>5 5 4 6 2.</_>\n                <_>9 11 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8580528022721410e-004</threshold>\n            <left_val>0.5708081722259522</left_val>\n            <right_val>0.2812424004077911</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 20 6 -1.</_>\n                <_>0 9 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9580191522836685e-003</threshold>\n            <left_val>0.2501051127910614</left_val>\n            <right_val>0.5544260740280151</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 2 2 -1.</_>\n                <_>4 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2124150525778532e-003</threshold>\n            <left_val>0.2385368049144745</left_val>\n            <right_val>0.5433350205421448</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 18 12 2 -1.</_>\n                <_>8 18 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9426132142543793e-003</threshold>\n            <left_val>0.3955070972442627</left_val>\n            <right_val>0.6220757961273193</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 4 16 -1.</_>\n                <_>7 12 4 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4630590341985226e-003</threshold>\n            <left_val>0.5639708042144775</left_val>\n            <right_val>0.2992357909679413</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 7 8 -1.</_>\n                <_>7 10 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0396599583327770e-003</threshold>\n            <left_val>0.2186512947082520</left_val>\n            <right_val>0.5411676764488220</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 3 1 -1.</_>\n                <_>7 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2988339876756072e-003</threshold>\n            <left_val>0.2350706011056900</left_val>\n            <right_val>0.5364584922790527</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 15 2 4 -1.</_>\n                <_>11 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2299369447864592e-004</threshold>\n            <left_val>0.3804112970829010</left_val>\n            <right_val>0.5729606151580811</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 5 4 8 -1.</_>\n                <_>3 9 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4654280385002494e-003</threshold>\n            <left_val>0.2510167956352234</left_val>\n            <right_val>0.5258268713951111</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 12 -1.</_>\n                <_>7 7 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1210042117163539e-004</threshold>\n            <left_val>0.5992823839187622</left_val>\n            <right_val>0.3851158916950226</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 6 2 -1.</_>\n                <_>6 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3836020370945334e-003</threshold>\n            <left_val>0.5681396126747131</left_val>\n            <right_val>0.3636586964130402</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 4 4 6 -1.</_>\n                <_>16 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0279364492744207</threshold>\n            <left_val>0.1491317003965378</left_val>\n            <right_val>0.5377560257911682</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 3 5 2 -1.</_>\n                <_>3 4 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6919551095925272e-004</threshold>\n            <left_val>0.3692429959774017</left_val>\n            <right_val>0.5572484731674194</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9829659983515739e-003</threshold>\n            <left_val>0.6758509278297424</left_val>\n            <right_val>0.4532504081726074</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 4 2 -1.</_>\n                <_>2 17 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8815309740602970e-003</threshold>\n            <left_val>0.5368022918701172</left_val>\n            <right_val>0.2932539880275726</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 6 -1.</_>\n                <_>10 13 3 3 2.</_>\n                <_>7 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0190675500780344</threshold>\n            <left_val>0.1649377048015595</left_val>\n            <right_val>0.5330067276954651</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 4 -1.</_>\n                <_>8 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6906559728085995e-003</threshold>\n            <left_val>0.1963925957679749</left_val>\n            <right_val>0.5119361877441406</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9777139686048031e-003</threshold>\n            <left_val>0.4671171903610230</left_val>\n            <right_val>0.7008398175239563</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 4 6 -1.</_>\n                <_>0 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0333031304180622</threshold>\n            <left_val>0.1155416965484619</left_val>\n            <right_val>0.5104162096977234</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 12 3 -1.</_>\n                <_>9 6 4 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0907441079616547</threshold>\n            <left_val>0.5149660110473633</left_val>\n            <right_val>0.1306173056364059</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 14 -1.</_>\n                <_>9 6 2 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3555898638442159e-004</threshold>\n            <left_val>0.3605481088161469</left_val>\n            <right_val>0.5439859032630920</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0149016501381993</threshold>\n            <left_val>0.4886212050914764</left_val>\n            <right_val>0.7687569856643677</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 2 4 -1.</_>\n                <_>6 14 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1594118596985936e-004</threshold>\n            <left_val>0.5356813073158264</left_val>\n            <right_val>0.3240939080715179</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 7 6 -1.</_>\n                <_>10 14 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0506709888577461</threshold>\n            <left_val>0.1848621964454651</left_val>\n            <right_val>0.5230404138565064</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 15 2 -1.</_>\n                <_>1 1 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8665749859064817e-004</threshold>\n            <left_val>0.3840579986572266</left_val>\n            <right_val>0.5517945885658264</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 6 -1.</_>\n                <_>14 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3712432533502579e-003</threshold>\n            <left_val>0.4288564026355743</left_val>\n            <right_val>0.6131753921508789</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 3 1 -1.</_>\n                <_>6 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2953069526702166e-003</threshold>\n            <left_val>0.2913674116134644</left_val>\n            <right_val>0.5280737876892090</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 6 -1.</_>\n                <_>14 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0419416800141335</threshold>\n            <left_val>0.7554799914360046</left_val>\n            <right_val>0.4856030941009522</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 20 10 -1.</_>\n                <_>0 8 20 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0235293805599213</threshold>\n            <left_val>0.2838279902935028</left_val>\n            <right_val>0.5256081223487854</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 6 -1.</_>\n                <_>14 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0408574491739273</threshold>\n            <left_val>0.4870935082435608</left_val>\n            <right_val>0.6277297139167786</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 6 -1.</_>\n                <_>3 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0254068691283464</threshold>\n            <left_val>0.7099707722663879</left_val>\n            <right_val>0.4575029015541077</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 15 1 2 -1.</_>\n                <_>19 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1415440500713885e-004</threshold>\n            <left_val>0.4030886888504028</left_val>\n            <right_val>0.5469412207603455</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 4 8 -1.</_>\n                <_>2 2 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0218241196125746</threshold>\n            <left_val>0.4502024054527283</left_val>\n            <right_val>0.6768701076507568</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 18 4 -1.</_>\n                <_>11 1 9 2 2.</_>\n                <_>2 3 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0141140399500728</threshold>\n            <left_val>0.5442860722541809</left_val>\n            <right_val>0.3791700005531311</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 1 2 -1.</_>\n                <_>8 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7214590671937913e-005</threshold>\n            <left_val>0.4200463891029358</left_val>\n            <right_val>0.5873476266860962</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 10 6 -1.</_>\n                <_>10 2 5 3 2.</_>\n                <_>5 5 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9417638480663300e-003</threshold>\n            <left_val>0.3792561888694763</left_val>\n            <right_val>0.5585265755653381</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 4 -1.</_>\n                <_>10 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2144409641623497e-003</threshold>\n            <left_val>0.7253103852272034</left_val>\n            <right_val>0.4603548943996429</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5817339774221182e-003</threshold>\n            <left_val>0.4693301916122437</left_val>\n            <right_val>0.5900238752365112</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 8 -1.</_>\n                <_>8 5 4 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1340931951999664</threshold>\n            <left_val>0.5149213075637817</left_val>\n            <right_val>0.1808844953775406</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 15 4 3 -1.</_>\n                <_>15 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2962710354477167e-003</threshold>\n            <left_val>0.5399743914604187</left_val>\n            <right_val>0.3717867136001587</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 1 -1.</_>\n                <_>9 18 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1575849968940020e-003</threshold>\n            <left_val>0.2408495992422104</left_val>\n            <right_val>0.5148863792419434</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 4 3 -1.</_>\n                <_>9 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9196188338100910e-003</threshold>\n            <left_val>0.6573588252067566</left_val>\n            <right_val>0.4738740026950836</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 4 3 -1.</_>\n                <_>7 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6267469618469477e-003</threshold>\n            <left_val>0.4192821979522705</left_val>\n            <right_val>0.6303114295005798</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 15 1 2 -1.</_>\n                <_>19 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3413388882763684e-004</threshold>\n            <left_val>0.5540298223495483</left_val>\n            <right_val>0.3702101111412048</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 8 4 -1.</_>\n                <_>0 17 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0266980808228254</threshold>\n            <left_val>0.1710917949676514</left_val>\n            <right_val>0.5101410746574402</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 6 4 -1.</_>\n                <_>11 3 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0305618792772293</threshold>\n            <left_val>0.1904218047857285</left_val>\n            <right_val>0.5168793797492981</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8511548880487680e-003</threshold>\n            <left_val>0.4447506964206696</left_val>\n            <right_val>0.6313853859901428</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 14 6 -1.</_>\n                <_>3 16 14 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0362114794552326</threshold>\n            <left_val>0.2490727007389069</left_val>\n            <right_val>0.5377349257469177</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 6 6 -1.</_>\n                <_>6 6 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4115189444273710e-003</threshold>\n            <left_val>0.5381243228912354</left_val>\n            <right_val>0.3664236962795258</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 10 6 -1.</_>\n                <_>5 14 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7253201743587852e-004</threshold>\n            <left_val>0.5530232191085815</left_val>\n            <right_val>0.3541550040245056</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 10 3 4 -1.</_>\n                <_>4 10 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9481729143299162e-004</threshold>\n            <left_val>0.4132699072360992</left_val>\n            <right_val>0.5667243003845215</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 2 -1.</_>\n                <_>13 9 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2334560789167881e-003</threshold>\n            <left_val>0.0987872332334518</left_val>\n            <right_val>0.5198668837547302</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 6 4 -1.</_>\n                <_>7 3 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0262747295200825</threshold>\n            <left_val>0.0911274924874306</left_val>\n            <right_val>0.5028107166290283</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3212260827422142e-003</threshold>\n            <left_val>0.4726648926734924</left_val>\n            <right_val>0.6222720742225647</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 2 3 -1.</_>\n                <_>2 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1129058226943016e-003</threshold>\n            <left_val>0.2157457023859024</left_val>\n            <right_val>0.5137804746627808</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 3 12 -1.</_>\n                <_>9 12 3 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2457809429615736e-003</threshold>\n            <left_val>0.5410770773887634</left_val>\n            <right_val>0.3721776902675629</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 4 6 -1.</_>\n                <_>3 14 2 3 2.</_>\n                <_>5 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0163597092032433</threshold>\n            <left_val>0.7787874937057495</left_val>\n            <right_val>0.4685291945934296</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 15 2 2 -1.</_>\n                <_>16 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2166109303943813e-004</threshold>\n            <left_val>0.5478987097740173</left_val>\n            <right_val>0.4240373969078064</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 2 2 -1.</_>\n                <_>2 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4452440710738301e-004</threshold>\n            <left_val>0.5330560803413391</left_val>\n            <right_val>0.3501324951648712</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8909732401371002e-003</threshold>\n            <left_val>0.6923521161079407</left_val>\n            <right_val>0.4726569056510925</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 20 1 -1.</_>\n                <_>10 7 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0483362115919590</threshold>\n            <left_val>0.5055900216102600</left_val>\n            <right_val>0.0757492035627365</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 8 3 -1.</_>\n                <_>7 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5178127735853195e-004</threshold>\n            <left_val>0.3783741891384125</left_val>\n            <right_val>0.5538573861122131</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>9 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4953910615295172e-003</threshold>\n            <left_val>0.3081651031970978</left_val>\n            <right_val>0.5359612107276917</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2385010961443186e-003</threshold>\n            <left_val>0.6633958816528320</left_val>\n            <right_val>0.4649342894554138</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7988430336117744e-003</threshold>\n            <left_val>0.6596844792366028</left_val>\n            <right_val>0.4347187876701355</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 1 3 5 -1.</_>\n                <_>12 1 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7860915809869766e-003</threshold>\n            <left_val>0.5231832861900330</left_val>\n            <right_val>0.2315579950809479</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 2 3 6 -1.</_>\n                <_>7 2 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6715380847454071e-003</threshold>\n            <left_val>0.5204250216484070</left_val>\n            <right_val>0.2977376878261566</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 14 6 5 -1.</_>\n                <_>14 14 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0353364497423172</threshold>\n            <left_val>0.7238878011703491</left_val>\n            <right_val>0.4861505031585693</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 2 -1.</_>\n                <_>9 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9189240457490087e-004</threshold>\n            <left_val>0.3105022013187408</left_val>\n            <right_val>0.5229824781417847</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 1 3 -1.</_>\n                <_>10 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3946109469980001e-003</threshold>\n            <left_val>0.3138968050479889</left_val>\n            <right_val>0.5210173726081848</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 2 2 -1.</_>\n                <_>6 6 1 1 2.</_>\n                <_>7 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8569283727556467e-004</threshold>\n            <left_val>0.4536580145359039</left_val>\n            <right_val>0.6585097908973694</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 18 4 -1.</_>\n                <_>11 11 9 2 2.</_>\n                <_>2 13 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0501631014049053</threshold>\n            <left_val>0.1804454028606415</left_val>\n            <right_val>0.5198916792869568</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 2 2 -1.</_>\n                <_>6 6 1 1 2.</_>\n                <_>7 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2367259953171015e-003</threshold>\n            <left_val>0.7255702018737793</left_val>\n            <right_val>0.4651359021663666</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 20 2 -1.</_>\n                <_>0 16 20 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4326287722215056e-004</threshold>\n            <left_val>0.4412921071052551</left_val>\n            <right_val>0.5898545980453491</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 2 3 -1.</_>\n                <_>4 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3485182151198387e-004</threshold>\n            <left_val>0.3500052988529205</left_val>\n            <right_val>0.5366017818450928</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0174979399889708</threshold>\n            <left_val>0.4912194907665253</left_val>\n            <right_val>0.8315284848213196</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 3 -1.</_>\n                <_>8 8 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5200000489130616e-003</threshold>\n            <left_val>0.3570275902748108</left_val>\n            <right_val>0.5370560288429260</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 3 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8003940870985389e-004</threshold>\n            <left_val>0.4353772103786469</left_val>\n            <right_val>0.5967335104942322</right_val></_></_></trees>\n      <stage_threshold>39.1072883605957030</stage_threshold>\n      <parent>9</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 11 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 10 4 -1.</_>\n                <_>5 6 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9945552647113800e-003</threshold>\n            <left_val>0.6162583231925964</left_val>\n            <right_val>0.3054533004760742</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 6 4 -1.</_>\n                <_>12 7 3 2 2.</_>\n                <_>9 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1085229925811291e-003</threshold>\n            <left_val>0.5818294882774353</left_val>\n            <right_val>0.3155578076839447</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 3 6 -1.</_>\n                <_>4 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0364380432292819e-003</threshold>\n            <left_val>0.2552052140235901</left_val>\n            <right_val>0.5692911744117737</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 15 4 4 -1.</_>\n                <_>13 15 2 2 2.</_>\n                <_>11 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8211311008781195e-004</threshold>\n            <left_val>0.3685089945793152</left_val>\n            <right_val>0.5934931039810181</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 4 2 -1.</_>\n                <_>7 9 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8057340104132891e-004</threshold>\n            <left_val>0.2332392036914825</left_val>\n            <right_val>0.5474792122840881</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 1 4 3 -1.</_>\n                <_>13 1 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6068789884448051e-004</threshold>\n            <left_val>0.3257457017898560</left_val>\n            <right_val>0.5667545795440674</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 4 4 -1.</_>\n                <_>5 15 2 2 2.</_>\n                <_>7 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1607372006401420e-004</threshold>\n            <left_val>0.3744716942310333</left_val>\n            <right_val>0.5845472812652588</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 4 7 -1.</_>\n                <_>9 5 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5007521556690335e-004</threshold>\n            <left_val>0.3420371115207672</left_val>\n            <right_val>0.5522807240486145</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 8 3 -1.</_>\n                <_>9 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8607829697430134e-003</threshold>\n            <left_val>0.2804419994354248</left_val>\n            <right_val>0.5375424027442932</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5033970121294260e-003</threshold>\n            <left_val>0.2579050958156586</left_val>\n            <right_val>0.5498952269554138</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 5 3 -1.</_>\n                <_>7 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3478909861296415e-003</threshold>\n            <left_val>0.4175156056880951</left_val>\n            <right_val>0.6313710808753967</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 4 3 -1.</_>\n                <_>11 10 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8880240279249847e-004</threshold>\n            <left_val>0.5865169763565064</left_val>\n            <right_val>0.4052666127681732</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 10 -1.</_>\n                <_>6 14 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9405477046966553e-003</threshold>\n            <left_val>0.5211141109466553</left_val>\n            <right_val>0.2318654060363770</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 6 2 -1.</_>\n                <_>10 11 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0193277392536402</threshold>\n            <left_val>0.2753432989120483</left_val>\n            <right_val>0.5241525769233704</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 6 2 -1.</_>\n                <_>7 11 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0202060113660991e-004</threshold>\n            <left_val>0.5722978711128235</left_val>\n            <right_val>0.3677195906639099</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 8 1 -1.</_>\n                <_>11 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1179069299250841e-003</threshold>\n            <left_val>0.4466108083724976</left_val>\n            <right_val>0.5542430877685547</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 3 2 -1.</_>\n                <_>7 3 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7743760254234076e-003</threshold>\n            <left_val>0.2813253104686737</left_val>\n            <right_val>0.5300959944725037</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 6 5 -1.</_>\n                <_>14 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2234458960592747e-003</threshold>\n            <left_val>0.4399709999561310</left_val>\n            <right_val>0.5795428156852722</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 2 12 -1.</_>\n                <_>7 11 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0143752200528979</threshold>\n            <left_val>0.2981117963790894</left_val>\n            <right_val>0.5292059183120728</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0153491804376245</threshold>\n            <left_val>0.7705215215682983</left_val>\n            <right_val>0.4748171865940094</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 2 3 -1.</_>\n                <_>5 1 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5152279956964776e-005</threshold>\n            <left_val>0.3718844056129456</left_val>\n            <right_val>0.5576897263526917</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 6 -1.</_>\n                <_>18 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1293919831514359e-003</threshold>\n            <left_val>0.3615196049213409</left_val>\n            <right_val>0.5286766886711121</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 6 -1.</_>\n                <_>0 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2512159775942564e-003</threshold>\n            <left_val>0.5364704728126526</left_val>\n            <right_val>0.3486298024654388</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9696918576955795e-003</threshold>\n            <left_val>0.6927651762962341</left_val>\n            <right_val>0.4676836133003235</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 4 3 -1.</_>\n                <_>7 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128290103748441</threshold>\n            <left_val>0.7712153792381287</left_val>\n            <right_val>0.4660735130310059</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 0 2 6 -1.</_>\n                <_>18 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3660065904259682e-003</threshold>\n            <left_val>0.3374983966350555</left_val>\n            <right_val>0.5351287722587585</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 6 -1.</_>\n                <_>0 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2452319283038378e-003</threshold>\n            <left_val>0.5325189828872681</left_val>\n            <right_val>0.3289610147476196</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 6 3 -1.</_>\n                <_>8 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0117235602810979</threshold>\n            <left_val>0.6837652921676636</left_val>\n            <right_val>0.4754300117492676</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 2 4 -1.</_>\n                <_>8 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9257940695970319e-005</threshold>\n            <left_val>0.3572087883949280</left_val>\n            <right_val>0.5360502004623413</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 4 6 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2244219508138485e-005</threshold>\n            <left_val>0.5541427135467529</left_val>\n            <right_val>0.3552064001560211</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 2 2 -1.</_>\n                <_>7 4 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0881509669125080e-003</threshold>\n            <left_val>0.5070844292640686</left_val>\n            <right_val>0.1256462037563324</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 14 4 -1.</_>\n                <_>10 14 7 2 2.</_>\n                <_>3 16 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0274296794086695</threshold>\n            <left_val>0.5269560217857361</left_val>\n            <right_val>0.1625818014144898</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 6 2 -1.</_>\n                <_>6 15 3 1 2.</_>\n                <_>9 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4142867922782898e-003</threshold>\n            <left_val>0.7145588994026184</left_val>\n            <right_val>0.4584197103977203</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 6 2 -1.</_>\n                <_>14 16 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3479959238320589e-003</threshold>\n            <left_val>0.5398612022399902</left_val>\n            <right_val>0.3494696915149689</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 12 8 -1.</_>\n                <_>2 16 12 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0826354920864105</threshold>\n            <left_val>0.2439192980527878</left_val>\n            <right_val>0.5160226225852966</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 7 2 -1.</_>\n                <_>7 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0261740535497665e-003</threshold>\n            <left_val>0.3886891901493073</left_val>\n            <right_val>0.5767908096313477</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 18 2 -1.</_>\n                <_>0 3 18 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6307090409100056e-003</threshold>\n            <left_val>0.3389458060264587</left_val>\n            <right_val>0.5347700715065002</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 5 -1.</_>\n                <_>9 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4546680506318808e-003</threshold>\n            <left_val>0.4601413905620575</left_val>\n            <right_val>0.6387246847152710</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 3 8 -1.</_>\n                <_>8 5 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9476519972085953e-004</threshold>\n            <left_val>0.5769879221916199</left_val>\n            <right_val>0.4120396077632904</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 3 4 -1.</_>\n                <_>10 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0154091902077198</threshold>\n            <left_val>0.4878709018230438</left_val>\n            <right_val>0.7089822292327881</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 3 2 -1.</_>\n                <_>4 14 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1784400558099151e-003</threshold>\n            <left_val>0.5263553261756897</left_val>\n            <right_val>0.2895244956016541</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 3 -1.</_>\n                <_>11 4 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0277019198983908</threshold>\n            <left_val>0.1498828977346420</left_val>\n            <right_val>0.5219606757164002</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 3 -1.</_>\n                <_>7 4 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0295053999871016</threshold>\n            <left_val>0.0248933192342520</left_val>\n            <right_val>0.4999816119670868</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 11 5 2 -1.</_>\n                <_>14 12 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5159430010244250e-004</threshold>\n            <left_val>0.5464622974395752</left_val>\n            <right_val>0.4029662907123566</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 6 9 -1.</_>\n                <_>3 2 2 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1772639639675617e-003</threshold>\n            <left_val>0.4271056950092316</left_val>\n            <right_val>0.5866296887397766</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 6 13 -1.</_>\n                <_>14 6 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0741820484399796</threshold>\n            <left_val>0.6874179244041443</left_val>\n            <right_val>0.4919027984142304</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 14 8 -1.</_>\n                <_>3 6 7 4 2.</_>\n                <_>10 10 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0172541607171297</threshold>\n            <left_val>0.3370676040649414</left_val>\n            <right_val>0.5348739027976990</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 11 -1.</_>\n                <_>16 0 2 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0148515598848462</threshold>\n            <left_val>0.4626792967319489</left_val>\n            <right_val>0.6129904985427856</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 12 12 -1.</_>\n                <_>3 4 6 6 2.</_>\n                <_>9 10 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0100020002573729</threshold>\n            <left_val>0.5346122980117798</left_val>\n            <right_val>0.3423453867435455</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 5 3 -1.</_>\n                <_>11 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0138120744377375e-003</threshold>\n            <left_val>0.4643830060958862</left_val>\n            <right_val>0.5824304223060608</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 4 2 -1.</_>\n                <_>4 12 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5135470312088728e-003</threshold>\n            <left_val>0.5196396112442017</left_val>\n            <right_val>0.2856149971485138</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 2 2 -1.</_>\n                <_>10 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1381431035697460e-003</threshold>\n            <left_val>0.4838162958621979</left_val>\n            <right_val>0.5958529710769653</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 2 -1.</_>\n                <_>9 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1450440660119057e-003</threshold>\n            <left_val>0.8920302987098694</left_val>\n            <right_val>0.4741412103176117</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4736708514392376e-003</threshold>\n            <left_val>0.2033942937850952</left_val>\n            <right_val>0.5337278842926025</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 3 3 -1.</_>\n                <_>5 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9628470763564110e-003</threshold>\n            <left_val>0.4571633934974670</left_val>\n            <right_val>0.6725863218307495</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 3 3 -1.</_>\n                <_>11 0 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4260450415313244e-003</threshold>\n            <left_val>0.5271108150482178</left_val>\n            <right_val>0.2845670878887177</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 6 2 -1.</_>\n                <_>5 6 3 1 2.</_>\n                <_>8 7 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9611460417509079e-004</threshold>\n            <left_val>0.4138312935829163</left_val>\n            <right_val>0.5718597769737244</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 16 4 3 -1.</_>\n                <_>12 17 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3728788197040558e-003</threshold>\n            <left_val>0.5225151181221008</left_val>\n            <right_val>0.2804847061634064</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 3 2 -1.</_>\n                <_>3 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0500897234305739e-004</threshold>\n            <left_val>0.5236768722534180</left_val>\n            <right_val>0.3314523994922638</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 2 -1.</_>\n                <_>9 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6792551185935736e-004</threshold>\n            <left_val>0.4531059861183167</left_val>\n            <right_val>0.6276971101760864</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 16 4 -1.</_>\n                <_>1 11 8 2 2.</_>\n                <_>9 13 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0246443394571543</threshold>\n            <left_val>0.5130851864814758</left_val>\n            <right_val>0.2017143964767456</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0102904504165053</threshold>\n            <left_val>0.7786595225334168</left_val>\n            <right_val>0.4876641035079956</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 5 3 -1.</_>\n                <_>4 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0629419013857841e-003</threshold>\n            <left_val>0.4288598895072937</left_val>\n            <right_val>0.5881264209747315</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 16 4 3 -1.</_>\n                <_>12 17 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0519481301307678e-003</threshold>\n            <left_val>0.3523977994918823</left_val>\n            <right_val>0.5286008715629578</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7692620903253555e-003</threshold>\n            <left_val>0.6841086149215698</left_val>\n            <right_val>0.4588094055652618</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 2 2 -1.</_>\n                <_>9 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5789941214025021e-004</threshold>\n            <left_val>0.3565520048141480</left_val>\n            <right_val>0.5485978126525879</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 4 2 -1.</_>\n                <_>8 10 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5918837683275342e-004</threshold>\n            <left_val>0.3368793129920960</left_val>\n            <right_val>0.5254197120666504</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 3 -1.</_>\n                <_>8 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7737259622663260e-003</threshold>\n            <left_val>0.3422161042690277</left_val>\n            <right_val>0.5454015135765076</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 6 3 -1.</_>\n                <_>2 13 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5610467940568924e-003</threshold>\n            <left_val>0.6533612012863159</left_val>\n            <right_val>0.4485856890678406</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 14 3 2 -1.</_>\n                <_>16 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7277270089834929e-003</threshold>\n            <left_val>0.5307580232620239</left_val>\n            <right_val>0.3925352990627289</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 18 2 -1.</_>\n                <_>7 18 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0281996093690395</threshold>\n            <left_val>0.6857458949089050</left_val>\n            <right_val>0.4588584005832672</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 14 3 2 -1.</_>\n                <_>16 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7781109781935811e-003</threshold>\n            <left_val>0.4037851095199585</left_val>\n            <right_val>0.5369856953620911</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 3 2 -1.</_>\n                <_>1 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3177141449414194e-004</threshold>\n            <left_val>0.5399798750877380</left_val>\n            <right_val>0.3705750107765198</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 3 -1.</_>\n                <_>7 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6385399978607893e-003</threshold>\n            <left_val>0.4665437042713165</left_val>\n            <right_val>0.6452730894088745</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 14 8 3 -1.</_>\n                <_>5 15 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1183069329708815e-003</threshold>\n            <left_val>0.5914781093597412</left_val>\n            <right_val>0.4064677059650421</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 14 -1.</_>\n                <_>10 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0147732896730304</threshold>\n            <left_val>0.3642038106918335</left_val>\n            <right_val>0.5294762849807739</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 14 -1.</_>\n                <_>8 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0168154407292604</threshold>\n            <left_val>0.2664231956005096</left_val>\n            <right_val>0.5144972801208496</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 3 -1.</_>\n                <_>13 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3370140269398689e-003</threshold>\n            <left_val>0.6779531240463257</left_val>\n            <right_val>0.4852097928524017</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 6 1 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4560048991115764e-005</threshold>\n            <left_val>0.5613964796066284</left_val>\n            <right_val>0.4153054058551788</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 3 -1.</_>\n                <_>9 13 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0240620467811823e-003</threshold>\n            <left_val>0.5964478254318237</left_val>\n            <right_val>0.4566304087638855</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 3 -1.</_>\n                <_>8 0 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3161689750850201e-003</threshold>\n            <left_val>0.2976115047931671</left_val>\n            <right_val>0.5188159942626953</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 16 18 -1.</_>\n                <_>4 9 16 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.5321757197380066</threshold>\n            <left_val>0.5187839269638062</left_val>\n            <right_val>0.2202631980180740</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 16 14 -1.</_>\n                <_>1 8 16 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1664305031299591</threshold>\n            <left_val>0.1866022944450378</left_val>\n            <right_val>0.5060343146324158</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 9 15 4 -1.</_>\n                <_>8 9 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1125352978706360</threshold>\n            <left_val>0.5212125182151794</left_val>\n            <right_val>0.1185022965073586</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 7 3 -1.</_>\n                <_>6 13 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3046864494681358e-003</threshold>\n            <left_val>0.4589937031269074</left_val>\n            <right_val>0.6826149225234985</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 2 3 -1.</_>\n                <_>14 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6255099587142467e-003</threshold>\n            <left_val>0.3079940974712372</left_val>\n            <right_val>0.5225008726119995</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 16 14 -1.</_>\n                <_>2 3 8 7 2.</_>\n                <_>10 10 8 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1111646965146065</threshold>\n            <left_val>0.2101044058799744</left_val>\n            <right_val>0.5080801844596863</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 18 -1.</_>\n                <_>18 2 2 9 2.</_>\n                <_>16 11 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108884396031499</threshold>\n            <left_val>0.5765355229377747</left_val>\n            <right_val>0.4790464043617249</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 15 2 3 -1.</_>\n                <_>4 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8564301580190659e-003</threshold>\n            <left_val>0.5065100193023682</left_val>\n            <right_val>0.1563598960638046</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 18 -1.</_>\n                <_>18 2 2 9 2.</_>\n                <_>16 11 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0548543892800808</threshold>\n            <left_val>0.4966914951801300</left_val>\n            <right_val>0.7230510711669922</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 8 3 -1.</_>\n                <_>1 2 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0111973397433758</threshold>\n            <left_val>0.2194979041814804</left_val>\n            <right_val>0.5098798274993897</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4069071300327778e-003</threshold>\n            <left_val>0.4778401851654053</left_val>\n            <right_val>0.6770902872085571</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 5 9 -1.</_>\n                <_>5 14 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0636652931571007</threshold>\n            <left_val>0.1936362981796265</left_val>\n            <right_val>0.5081024169921875</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 11 -1.</_>\n                <_>16 0 2 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.8081491887569427e-003</threshold>\n            <left_val>0.5999063253402710</left_val>\n            <right_val>0.4810341000556946</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 1 -1.</_>\n                <_>9 0 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1717099007219076e-003</threshold>\n            <left_val>0.3338333964347839</left_val>\n            <right_val>0.5235472917556763</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0133155202493072</threshold>\n            <left_val>0.6617069840431213</left_val>\n            <right_val>0.4919213056564331</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 3 7 -1.</_>\n                <_>2 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5442079640924931e-003</threshold>\n            <left_val>0.4488744139671326</left_val>\n            <right_val>0.6082184910774231</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 6 12 -1.</_>\n                <_>7 12 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0120378397405148</threshold>\n            <left_val>0.5409392118453980</left_val>\n            <right_val>0.3292432129383087</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 11 -1.</_>\n                <_>2 0 2 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0207010507583618</threshold>\n            <left_val>0.6819120049476624</left_val>\n            <right_val>0.4594995975494385</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 20 -1.</_>\n                <_>14 0 3 20 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0276082791388035</threshold>\n            <left_val>0.4630792140960693</left_val>\n            <right_val>0.5767282843589783</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 1 2 -1.</_>\n                <_>0 4 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2370620388537645e-003</threshold>\n            <left_val>0.5165379047393799</left_val>\n            <right_val>0.2635016143321991</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 10 8 -1.</_>\n                <_>10 5 5 4 2.</_>\n                <_>5 9 5 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0376693382859230</threshold>\n            <left_val>0.2536393105983734</left_val>\n            <right_val>0.5278980135917664</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 4 -1.</_>\n                <_>4 7 6 2 2.</_>\n                <_>10 9 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8057259730994701e-003</threshold>\n            <left_val>0.3985156118869782</left_val>\n            <right_val>0.5517500042915344</right_val></_></_></trees>\n      <stage_threshold>50.6104812622070310</stage_threshold>\n      <parent>10</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 12 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 6 4 -1.</_>\n                <_>5 1 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4299028813838959e-003</threshold>\n            <left_val>0.2891018092632294</left_val>\n            <right_val>0.6335226297378540</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 6 4 -1.</_>\n                <_>12 7 3 2 2.</_>\n                <_>9 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3813319858163595e-003</threshold>\n            <left_val>0.6211789250373840</left_val>\n            <right_val>0.3477487862110138</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 6 -1.</_>\n                <_>5 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2915711160749197e-003</threshold>\n            <left_val>0.2254412025213242</left_val>\n            <right_val>0.5582118034362793</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 6 4 -1.</_>\n                <_>12 16 3 2 2.</_>\n                <_>9 18 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9457940086722374e-004</threshold>\n            <left_val>0.3711710870265961</left_val>\n            <right_val>0.5930070877075195</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 12 -1.</_>\n                <_>9 10 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7164667891338468e-004</threshold>\n            <left_val>0.5651720166206360</left_val>\n            <right_val>0.3347995877265930</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 18 -1.</_>\n                <_>9 1 2 18 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1386410333216190e-003</threshold>\n            <left_val>0.3069126009941101</left_val>\n            <right_val>0.5508630871772766</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 12 2 -1.</_>\n                <_>8 12 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6403039626311511e-004</threshold>\n            <left_val>0.5762827992439270</left_val>\n            <right_val>0.3699047863483429</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 6 2 -1.</_>\n                <_>8 9 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9793529392918572e-005</threshold>\n            <left_val>0.2644244134426117</left_val>\n            <right_val>0.5437911152839661</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 3 6 -1.</_>\n                <_>9 0 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5774902254343033e-003</threshold>\n            <left_val>0.5051138997077942</left_val>\n            <right_val>0.1795724928379059</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 18 3 2 -1.</_>\n                <_>11 19 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6032689493149519e-004</threshold>\n            <left_val>0.5826969146728516</left_val>\n            <right_val>0.4446826875209808</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 17 4 -1.</_>\n                <_>1 3 17 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1404630541801453e-003</threshold>\n            <left_val>0.3113852143287659</left_val>\n            <right_val>0.5346971750259399</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 8 4 12 -1.</_>\n                <_>11 8 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0230869501829147</threshold>\n            <left_val>0.3277946114540100</left_val>\n            <right_val>0.5331197977066040</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0142436502501369</threshold>\n            <left_val>0.7381709814071655</left_val>\n            <right_val>0.4588063061237335</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 2 17 -1.</_>\n                <_>12 3 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0194871295243502</threshold>\n            <left_val>0.5256630778312683</left_val>\n            <right_val>0.2274471968412399</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 6 1 -1.</_>\n                <_>6 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.6681108698248863e-004</threshold>\n            <left_val>0.5511230826377869</left_val>\n            <right_val>0.3815006911754608</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 3 -1.</_>\n                <_>18 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1474709976464510e-003</threshold>\n            <left_val>0.5425636768341065</left_val>\n            <right_val>0.2543726861476898</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 3 4 -1.</_>\n                <_>8 6 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8026070029009134e-004</threshold>\n            <left_val>0.5380191802978516</left_val>\n            <right_val>0.3406304121017456</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 10 -1.</_>\n                <_>4 10 12 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0266260989010334e-003</threshold>\n            <left_val>0.3035801947116852</left_val>\n            <right_val>0.5420572161674500</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 18 4 2 -1.</_>\n                <_>7 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4462960795499384e-004</threshold>\n            <left_val>0.3990997076034546</left_val>\n            <right_val>0.5660110116004944</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 2 3 6 -1.</_>\n                <_>17 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2609760053455830e-003</threshold>\n            <left_val>0.5562806725502014</left_val>\n            <right_val>0.3940688073635101</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 6 -1.</_>\n                <_>9 7 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0511330589652061</threshold>\n            <left_val>0.4609653949737549</left_val>\n            <right_val>0.7118561863899231</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 2 3 6 -1.</_>\n                <_>17 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0177863091230392</threshold>\n            <left_val>0.2316166013479233</left_val>\n            <right_val>0.5322144031524658</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 3 4 -1.</_>\n                <_>9 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9679628573358059e-003</threshold>\n            <left_val>0.2330771982669830</left_val>\n            <right_val>0.5122029185295105</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0667689386755228e-003</threshold>\n            <left_val>0.4657444059848785</left_val>\n            <right_val>0.6455488204956055</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 6 3 -1.</_>\n                <_>0 13 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4413768015801907e-003</threshold>\n            <left_val>0.5154392123222351</left_val>\n            <right_val>0.2361633926630020</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6277279723435640e-003</threshold>\n            <left_val>0.6219773292541504</left_val>\n            <right_val>0.4476661086082459</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 3 -1.</_>\n                <_>3 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3530759178102016e-003</threshold>\n            <left_val>0.1837355047464371</left_val>\n            <right_val>0.5102208256721497</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 12 7 -1.</_>\n                <_>9 6 4 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1453091949224472</threshold>\n            <left_val>0.5145987272262573</left_val>\n            <right_val>0.1535930931568146</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4394490756094456e-003</threshold>\n            <left_val>0.5343660116195679</left_val>\n            <right_val>0.3624661862850189</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 1 3 -1.</_>\n                <_>14 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1283390708267689e-003</threshold>\n            <left_val>0.6215007901191711</left_val>\n            <right_val>0.4845592081546783</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 3 14 -1.</_>\n                <_>3 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7940260004252195e-003</threshold>\n            <left_val>0.4299261868000031</left_val>\n            <right_val>0.5824198126792908</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 5 6 -1.</_>\n                <_>12 16 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0362538211047649</threshold>\n            <left_val>0.5260334014892578</left_val>\n            <right_val>0.1439467966556549</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 5 6 -1.</_>\n                <_>4 16 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1746722310781479e-003</threshold>\n            <left_val>0.3506538867950440</left_val>\n            <right_val>0.5287045240402222</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 2 -1.</_>\n                <_>12 10 1 1 2.</_>\n                <_>11 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5383297624066472e-004</threshold>\n            <left_val>0.4809640944004059</left_val>\n            <right_val>0.6122040152549744</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 3 14 -1.</_>\n                <_>6 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0264802295714617</threshold>\n            <left_val>0.1139362007379532</left_val>\n            <right_val>0.5045586228370667</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 2 3 -1.</_>\n                <_>10 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0440660193562508e-003</threshold>\n            <left_val>0.6352095007896423</left_val>\n            <right_val>0.4794734120368958</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 2 3 -1.</_>\n                <_>0 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6993520334362984e-003</threshold>\n            <left_val>0.5131118297576904</left_val>\n            <right_val>0.2498510926961899</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 12 6 -1.</_>\n                <_>5 14 12 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6762931267730892e-004</threshold>\n            <left_val>0.5421394705772400</left_val>\n            <right_val>0.3709532022476196</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 3 9 -1.</_>\n                <_>6 14 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0413822606205940</threshold>\n            <left_val>0.1894959956407547</left_val>\n            <right_val>0.5081691741943359</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 2 -1.</_>\n                <_>12 10 1 1 2.</_>\n                <_>11 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0532729793339968e-003</threshold>\n            <left_val>0.6454367041587830</left_val>\n            <right_val>0.4783608913421631</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 1 3 -1.</_>\n                <_>5 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1648600231856108e-003</threshold>\n            <left_val>0.6215031147003174</left_val>\n            <right_val>0.4499826133251190</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 13 3 -1.</_>\n                <_>4 10 13 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.6747748749330640e-004</threshold>\n            <left_val>0.3712610900402069</left_val>\n            <right_val>0.5419334769248962</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 15 6 -1.</_>\n                <_>6 7 5 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1737584024667740</threshold>\n            <left_val>0.5023643970489502</left_val>\n            <right_val>0.1215742006897926</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 6 -1.</_>\n                <_>8 5 4 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9049699660390615e-003</threshold>\n            <left_val>0.3240267932415009</left_val>\n            <right_val>0.5381883978843689</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 4 3 -1.</_>\n                <_>8 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2299539521336555e-003</threshold>\n            <left_val>0.4165507853031158</left_val>\n            <right_val>0.5703486204147339</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 3 -1.</_>\n                <_>15 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4329237900674343e-004</threshold>\n            <left_val>0.3854042887687683</left_val>\n            <right_val>0.5547549128532410</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 5 3 -1.</_>\n                <_>1 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.3297258242964745e-003</threshold>\n            <left_val>0.2204494029283524</left_val>\n            <right_val>0.5097082853317261</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 7 12 -1.</_>\n                <_>7 7 7 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0417630255687982e-004</threshold>\n            <left_val>0.5607066154479981</left_val>\n            <right_val>0.4303036034107208</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 6 10 -1.</_>\n                <_>0 1 3 5 2.</_>\n                <_>3 6 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0312047004699707</threshold>\n            <left_val>0.4621657133102417</left_val>\n            <right_val>0.6982004046440125</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 1 4 3 -1.</_>\n                <_>16 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8943502157926559e-003</threshold>\n            <left_val>0.5269594192504883</left_val>\n            <right_val>0.2269068062305450</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3645310215651989e-003</threshold>\n            <left_val>0.6359223127365112</left_val>\n            <right_val>0.4537956118583679</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 3 5 -1.</_>\n                <_>13 2 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6793059706687927e-003</threshold>\n            <left_val>0.5274767875671387</left_val>\n            <right_val>0.2740483880043030</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 4 6 -1.</_>\n                <_>0 5 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0254311393946409</threshold>\n            <left_val>0.2038519978523254</left_val>\n            <right_val>0.5071732997894287</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2000601105391979e-004</threshold>\n            <left_val>0.4587455093860626</left_val>\n            <right_val>0.6119868159294128</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 1 -1.</_>\n                <_>9 18 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9284600168466568e-003</threshold>\n            <left_val>0.5071274042129517</left_val>\n            <right_val>0.2028204947710037</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 2 -1.</_>\n                <_>12 10 1 1 2.</_>\n                <_>11 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5256470912136137e-005</threshold>\n            <left_val>0.4812104105949402</left_val>\n            <right_val>0.5430821776390076</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 2 2 -1.</_>\n                <_>7 10 1 1 2.</_>\n                <_>8 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3158309739083052e-003</threshold>\n            <left_val>0.4625813961029053</left_val>\n            <right_val>0.6779323220252991</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 4 4 -1.</_>\n                <_>11 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5870389761403203e-003</threshold>\n            <left_val>0.5386291742324829</left_val>\n            <right_val>0.3431465029716492</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 3 8 -1.</_>\n                <_>9 12 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215396601706743</threshold>\n            <left_val>0.0259425006806850</left_val>\n            <right_val>0.5003222823143005</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 6 3 -1.</_>\n                <_>13 1 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0143344802781940</threshold>\n            <left_val>0.5202844738960266</left_val>\n            <right_val>0.1590632945299149</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>9 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.3881383761763573e-003</threshold>\n            <left_val>0.7282481193542481</left_val>\n            <right_val>0.4648044109344482</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 10 -1.</_>\n                <_>10 7 5 5 2.</_>\n                <_>5 12 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1906841844320297e-003</threshold>\n            <left_val>0.5562356710433960</left_val>\n            <right_val>0.3923191130161285</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 18 8 2 -1.</_>\n                <_>3 18 4 1 2.</_>\n                <_>7 19 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8453059755265713e-003</threshold>\n            <left_val>0.6803392767906189</left_val>\n            <right_val>0.4629127979278565</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 6 8 -1.</_>\n                <_>12 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0547077991068363</threshold>\n            <left_val>0.2561671137809753</left_val>\n            <right_val>0.5206125974655151</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 6 8 -1.</_>\n                <_>6 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1142775490880013e-003</threshold>\n            <left_val>0.5189620256423950</left_val>\n            <right_val>0.3053877055644989</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 7 -1.</_>\n                <_>12 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0155750000849366</threshold>\n            <left_val>0.1295074969530106</left_val>\n            <right_val>0.5169094800949097</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 1 -1.</_>\n                <_>8 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2050600344082341e-004</threshold>\n            <left_val>0.5735098123550415</left_val>\n            <right_val>0.4230825006961823</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 3 -1.</_>\n                <_>15 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2273970060050488e-003</threshold>\n            <left_val>0.5289878249168396</left_val>\n            <right_val>0.4079791903495789</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 2 -1.</_>\n                <_>7 15 1 1 2.</_>\n                <_>8 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2186600361019373e-003</threshold>\n            <left_val>0.6575639843940735</left_val>\n            <right_val>0.4574409127235413</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 3 -1.</_>\n                <_>15 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3256649039685726e-003</threshold>\n            <left_val>0.3628047108650208</left_val>\n            <right_val>0.5195019841194153</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 7 -1.</_>\n                <_>7 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0132883097976446</threshold>\n            <left_val>0.1284265965223312</left_val>\n            <right_val>0.5043488740921021</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 7 -1.</_>\n                <_>18 1 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3839771058410406e-003</threshold>\n            <left_val>0.6292240023612976</left_val>\n            <right_val>0.4757505953311920</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 8 20 -1.</_>\n                <_>2 10 8 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2195422053337097</threshold>\n            <left_val>0.1487731933593750</left_val>\n            <right_val>0.5065013766288757</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 15 6 -1.</_>\n                <_>3 2 15 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9111708067357540e-003</threshold>\n            <left_val>0.4256102144718170</left_val>\n            <right_val>0.5665838718414307</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 12 2 -1.</_>\n                <_>4 4 12 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8744950648397207e-004</threshold>\n            <left_val>0.4004144072532654</left_val>\n            <right_val>0.5586857199668884</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 5 -1.</_>\n                <_>16 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2178641781210899e-003</threshold>\n            <left_val>0.6009116172790527</left_val>\n            <right_val>0.4812706112861633</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 4 -1.</_>\n                <_>8 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1111519997939467e-003</threshold>\n            <left_val>0.3514933884143829</left_val>\n            <right_val>0.5287089943885803</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 5 -1.</_>\n                <_>16 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4036400504410267e-003</threshold>\n            <left_val>0.4642275869846344</left_val>\n            <right_val>0.5924085974693298</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 6 13 -1.</_>\n                <_>3 7 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1229949966073036</threshold>\n            <left_val>0.5025529265403748</left_val>\n            <right_val>0.0691524818539619</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 5 -1.</_>\n                <_>16 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0123135102912784</threshold>\n            <left_val>0.5884591937065125</left_val>\n            <right_val>0.4934012889862061</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 5 -1.</_>\n                <_>2 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1471039876341820e-003</threshold>\n            <left_val>0.4372239112854004</left_val>\n            <right_val>0.5893477797508240</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 3 6 -1.</_>\n                <_>14 14 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5502649843692780e-003</threshold>\n            <left_val>0.4327551126480103</left_val>\n            <right_val>0.5396270155906677</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 3 6 -1.</_>\n                <_>3 14 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0192242693156004</threshold>\n            <left_val>0.1913134008646011</left_val>\n            <right_val>0.5068330764770508</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 1 4 3 -1.</_>\n                <_>16 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4395059552043676e-003</threshold>\n            <left_val>0.5308178067207336</left_val>\n            <right_val>0.4243533015251160</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 10 -1.</_>\n                <_>8 7 1 5 2.</_>\n                <_>9 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7751999013125896e-003</threshold>\n            <left_val>0.6365395784378052</left_val>\n            <right_val>0.4540086090564728</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 4 4 -1.</_>\n                <_>11 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0119630545377731e-003</threshold>\n            <left_val>0.5189834237098694</left_val>\n            <right_val>0.3026199936866760</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 3 -1.</_>\n                <_>0 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4014651104807854e-003</threshold>\n            <left_val>0.5105062127113342</left_val>\n            <right_val>0.2557682991027832</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 3 -1.</_>\n                <_>13 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0274988906458020e-004</threshold>\n            <left_val>0.4696914851665497</left_val>\n            <right_val>0.5861827731132507</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 3 5 -1.</_>\n                <_>8 15 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0114744501188397</threshold>\n            <left_val>0.5053645968437195</left_val>\n            <right_val>0.1527177989482880</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7023430019617081e-003</threshold>\n            <left_val>0.6508980989456177</left_val>\n            <right_val>0.4890604019165039</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0462959073483944e-003</threshold>\n            <left_val>0.6241816878318787</left_val>\n            <right_val>0.4514600038528442</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 14 -1.</_>\n                <_>10 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9951568990945816e-003</threshold>\n            <left_val>0.3432781100273132</left_val>\n            <right_val>0.5400953888893127</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 5 6 -1.</_>\n                <_>0 7 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0357007086277008</threshold>\n            <left_val>0.1878059059381485</left_val>\n            <right_val>0.5074077844619751</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 4 -1.</_>\n                <_>9 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5584561303257942e-004</threshold>\n            <left_val>0.3805277049541473</left_val>\n            <right_val>0.5402569770812988</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 18 10 -1.</_>\n                <_>6 0 6 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0542606003582478</threshold>\n            <left_val>0.6843714714050293</left_val>\n            <right_val>0.4595097005367279</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 14 -1.</_>\n                <_>10 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0600461438298225e-003</threshold>\n            <left_val>0.5502905249595642</left_val>\n            <right_val>0.4500527977943420</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 14 -1.</_>\n                <_>8 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4791832119226456e-003</threshold>\n            <left_val>0.3368858098983765</left_val>\n            <right_val>0.5310757160186768</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 3 -1.</_>\n                <_>13 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4939469983801246e-003</threshold>\n            <left_val>0.6487640142440796</left_val>\n            <right_val>0.4756175875663757</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 2 3 -1.</_>\n                <_>6 1 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4610530342906713e-005</threshold>\n            <left_val>0.4034579098224640</left_val>\n            <right_val>0.5451064109802246</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 18 -1.</_>\n                <_>19 1 1 9 2.</_>\n                <_>18 10 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2321938350796700e-003</threshold>\n            <left_val>0.6386873722076416</left_val>\n            <right_val>0.4824739992618561</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 4 3 -1.</_>\n                <_>2 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0645818226039410e-003</threshold>\n            <left_val>0.2986421883106232</left_val>\n            <right_val>0.5157335996627808</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 18 -1.</_>\n                <_>19 1 1 9 2.</_>\n                <_>18 10 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0304630808532238</threshold>\n            <left_val>0.5022199749946594</left_val>\n            <right_val>0.7159956097602844</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 4 6 -1.</_>\n                <_>1 14 2 3 2.</_>\n                <_>3 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0544911324977875e-003</threshold>\n            <left_val>0.6492452025413513</left_val>\n            <right_val>0.4619275033473969</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 7 6 -1.</_>\n                <_>10 13 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0395051389932632</threshold>\n            <left_val>0.5150570869445801</left_val>\n            <right_val>0.2450613975524902</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 6 10 -1.</_>\n                <_>0 10 3 5 2.</_>\n                <_>3 15 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4530208259820938e-003</threshold>\n            <left_val>0.4573669135570526</left_val>\n            <right_val>0.6394037008285523</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 4 -1.</_>\n                <_>12 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1688120430335402e-003</threshold>\n            <left_val>0.3865512013435364</left_val>\n            <right_val>0.5483661293983460</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 5 6 -1.</_>\n                <_>5 13 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8070670086890459e-003</threshold>\n            <left_val>0.5128579139709473</left_val>\n            <right_val>0.2701480090618134</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 1 8 -1.</_>\n                <_>14 10 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7365209320560098e-004</threshold>\n            <left_val>0.4051581919193268</left_val>\n            <right_val>0.5387461185455322</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 18 6 -1.</_>\n                <_>1 7 9 3 2.</_>\n                <_>10 10 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0117410803213716</threshold>\n            <left_val>0.5295950174331665</left_val>\n            <right_val>0.3719413876533508</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>9 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1833238899707794e-003</threshold>\n            <left_val>0.4789406955242157</left_val>\n            <right_val>0.6895126104354858</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 4 5 -1.</_>\n                <_>7 9 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0241501089185476e-004</threshold>\n            <left_val>0.5384489297866821</left_val>\n            <right_val>0.3918080925941467</right_val></_></_></trees>\n      <stage_threshold>54.6200714111328130</stage_threshold>\n      <parent>11</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 13 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 3 -1.</_>\n                <_>9 6 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0170599296689034</threshold>\n            <left_val>0.3948527872562408</left_val>\n            <right_val>0.7142534852027893</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0218408405780792</threshold>\n            <left_val>0.3370316028594971</left_val>\n            <right_val>0.6090016961097717</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 4 -1.</_>\n                <_>7 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4520049919374287e-004</threshold>\n            <left_val>0.3500576019287109</left_val>\n            <right_val>0.5987902283668518</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 19 9 -1.</_>\n                <_>1 3 19 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3272606134414673e-003</threshold>\n            <left_val>0.3267528116703033</left_val>\n            <right_val>0.5697240829467773</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 3 6 -1.</_>\n                <_>3 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7148298947140574e-004</threshold>\n            <left_val>0.3044599890708923</left_val>\n            <right_val>0.5531656742095947</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 4 4 -1.</_>\n                <_>15 7 2 2 2.</_>\n                <_>13 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7373987985774875e-004</threshold>\n            <left_val>0.3650012016296387</left_val>\n            <right_val>0.5672631263732910</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 4 4 -1.</_>\n                <_>3 7 2 2 2.</_>\n                <_>5 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4681590477703139e-005</threshold>\n            <left_val>0.3313541114330292</left_val>\n            <right_val>0.5388727188110352</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 10 8 -1.</_>\n                <_>9 10 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8563398197293282e-003</threshold>\n            <left_val>0.2697942852973938</left_val>\n            <right_val>0.5498778820037842</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 14 12 -1.</_>\n                <_>3 14 14 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5102273151278496e-003</threshold>\n            <left_val>0.5269358158111572</left_val>\n            <right_val>0.2762879133224487</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 10 12 -1.</_>\n                <_>11 5 5 6 2.</_>\n                <_>6 11 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0698172077536583</threshold>\n            <left_val>0.2909603118896484</left_val>\n            <right_val>0.5259246826171875</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6113670840859413e-004</threshold>\n            <left_val>0.5892577171325684</left_val>\n            <right_val>0.4073697924613953</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 5 -1.</_>\n                <_>9 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.7149249631911516e-004</threshold>\n            <left_val>0.3523564040660858</left_val>\n            <right_val>0.5415862202644348</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 4 -1.</_>\n                <_>9 6 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4727490452060010e-005</threshold>\n            <left_val>0.5423017740249634</left_val>\n            <right_val>0.3503156006336212</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 5 -1.</_>\n                <_>9 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0484202913939953</threshold>\n            <left_val>0.5193945765495300</left_val>\n            <right_val>0.3411195874214172</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 5 -1.</_>\n                <_>8 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3257140526548028e-003</threshold>\n            <left_val>0.3157769143581390</left_val>\n            <right_val>0.5335376262664795</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 6 1 -1.</_>\n                <_>13 2 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4922149603080470e-005</threshold>\n            <left_val>0.4451299905776978</left_val>\n            <right_val>0.5536553859710693</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 6 1 -1.</_>\n                <_>5 2 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7173398993909359e-003</threshold>\n            <left_val>0.3031741976737976</left_val>\n            <right_val>0.5248088836669922</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 3 -1.</_>\n                <_>13 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9219500720500946e-003</threshold>\n            <left_val>0.4781453013420105</left_val>\n            <right_val>0.6606041789054871</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 1 4 -1.</_>\n                <_>0 12 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9804988987743855e-003</threshold>\n            <left_val>0.3186308145523071</left_val>\n            <right_val>0.5287625193595886</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 3 -1.</_>\n                <_>13 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0012109093368053e-003</threshold>\n            <left_val>0.6413596868515015</left_val>\n            <right_val>0.4749928116798401</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 2 -1.</_>\n                <_>9 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3491991236805916e-003</threshold>\n            <left_val>0.1507498025894165</left_val>\n            <right_val>0.5098996758460999</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 9 2 -1.</_>\n                <_>6 16 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3490889687091112e-003</threshold>\n            <left_val>0.4316158890724182</left_val>\n            <right_val>0.5881167054176331</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0185970701277256</threshold>\n            <left_val>0.4735553860664368</left_val>\n            <right_val>0.9089794158935547</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 4 -1.</_>\n                <_>18 6 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8562379991635680e-003</threshold>\n            <left_val>0.3553189039230347</left_val>\n            <right_val>0.5577837228775024</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2940430790185928e-003</threshold>\n            <left_val>0.4500094950199127</left_val>\n            <right_val>0.6580877900123596</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 16 3 2 -1.</_>\n                <_>15 17 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9982850537635386e-004</threshold>\n            <left_val>0.5629242062568665</left_val>\n            <right_val>0.3975878953933716</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 3 9 -1.</_>\n                <_>0 3 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5455459728837013e-003</threshold>\n            <left_val>0.5381547212600708</left_val>\n            <right_val>0.3605485856533051</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>9 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6104722470045090e-003</threshold>\n            <left_val>0.5255997180938721</left_val>\n            <right_val>0.1796745955944061</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>8 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2783220782876015e-003</threshold>\n            <left_val>0.2272856980562210</left_val>\n            <right_val>0.5114030241966248</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>9 5 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4598479978740215e-003</threshold>\n            <left_val>0.4626308083534241</left_val>\n            <right_val>0.6608219146728516</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 4 -1.</_>\n                <_>9 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3112019514665008e-003</threshold>\n            <left_val>0.6317539811134338</left_val>\n            <right_val>0.4436857998371124</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 8 12 -1.</_>\n                <_>11 6 4 6 2.</_>\n                <_>7 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6876179035753012e-003</threshold>\n            <left_val>0.5421109795570374</left_val>\n            <right_val>0.4054022133350372</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 8 12 -1.</_>\n                <_>5 6 4 6 2.</_>\n                <_>9 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9118169806897640e-003</threshold>\n            <left_val>0.5358477830886841</left_val>\n            <right_val>0.3273454904556274</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0142064504325390</threshold>\n            <left_val>0.7793576717376709</left_val>\n            <right_val>0.4975781142711639</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 3 2 -1.</_>\n                <_>2 17 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1705528534948826e-004</threshold>\n            <left_val>0.5297319889068604</left_val>\n            <right_val>0.3560903966426849</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6635019565001130e-003</threshold>\n            <left_val>0.4678094089031220</left_val>\n            <right_val>0.5816481709480286</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 6 6 -1.</_>\n                <_>2 14 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3686188980937004e-003</threshold>\n            <left_val>0.5276734232902527</left_val>\n            <right_val>0.3446420133113861</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127995302900672</threshold>\n            <left_val>0.4834679961204529</left_val>\n            <right_val>0.7472159266471863</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 6 3 -1.</_>\n                <_>6 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3901201095432043e-003</threshold>\n            <left_val>0.4511859118938446</left_val>\n            <right_val>0.6401721239089966</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 5 3 -1.</_>\n                <_>14 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7070779837667942e-003</threshold>\n            <left_val>0.5335658788681030</left_val>\n            <right_val>0.3555220961570740</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4819339849054813e-003</threshold>\n            <left_val>0.4250707030296326</left_val>\n            <right_val>0.5772724151611328</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 5 3 -1.</_>\n                <_>14 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9995759986341000e-003</threshold>\n            <left_val>0.3003320097923279</left_val>\n            <right_val>0.5292900204658508</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 6 2 -1.</_>\n                <_>7 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0159390103071928</threshold>\n            <left_val>0.5067319273948669</left_val>\n            <right_val>0.1675581932067871</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6377349905669689e-003</threshold>\n            <left_val>0.4795069992542267</left_val>\n            <right_val>0.7085601091384888</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 15 5 3 -1.</_>\n                <_>1 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7334040068089962e-003</threshold>\n            <left_val>0.5133113265037537</left_val>\n            <right_val>0.2162470072507858</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>10 13 2 3 2.</_>\n                <_>8 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128588099032640</threshold>\n            <left_val>0.1938841938972473</left_val>\n            <right_val>0.5251371860504150</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 3 -1.</_>\n                <_>8 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2270800117403269e-004</threshold>\n            <left_val>0.5686538219451904</left_val>\n            <right_val>0.4197868108749390</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 5 4 -1.</_>\n                <_>12 2 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2651681471616030e-004</threshold>\n            <left_val>0.4224168956279755</left_val>\n            <right_val>0.5429695844650269</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 2 -1.</_>\n                <_>0 2 10 1 2.</_>\n                <_>10 3 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0110750999301672</threshold>\n            <left_val>0.5113775134086609</left_val>\n            <right_val>0.2514517903327942</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0367282517254353</threshold>\n            <left_val>0.7194662094116211</left_val>\n            <right_val>0.4849618971347809</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 6 1 -1.</_>\n                <_>6 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8207109426148236e-004</threshold>\n            <left_val>0.3840261995792389</left_val>\n            <right_val>0.5394446253776550</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 18 13 2 -1.</_>\n                <_>4 19 13 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7489690110087395e-003</threshold>\n            <left_val>0.5937088727951050</left_val>\n            <right_val>0.4569182097911835</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 3 6 -1.</_>\n                <_>2 12 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0100475195795298</threshold>\n            <left_val>0.5138576030731201</left_val>\n            <right_val>0.2802298069000244</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 6 8 -1.</_>\n                <_>17 12 3 4 2.</_>\n                <_>14 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1497840583324432e-003</threshold>\n            <left_val>0.6090037226676941</left_val>\n            <right_val>0.4636121094226837</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 10 6 -1.</_>\n                <_>4 13 5 3 2.</_>\n                <_>9 16 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8833888508379459e-003</threshold>\n            <left_val>0.3458611071109772</left_val>\n            <right_val>0.5254660248756409</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 1 2 -1.</_>\n                <_>14 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4039360394235700e-005</threshold>\n            <left_val>0.5693104267120361</left_val>\n            <right_val>0.4082083106040955</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5498419525101781e-003</threshold>\n            <left_val>0.4350537061691284</left_val>\n            <right_val>0.5806517004966736</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 2 -1.</_>\n                <_>14 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7841499112546444e-003</threshold>\n            <left_val>0.1468873023986816</left_val>\n            <right_val>0.5182775259017944</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 2 -1.</_>\n                <_>4 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1705629478674382e-004</threshold>\n            <left_val>0.5293524265289307</left_val>\n            <right_val>0.3456174135208130</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 9 2 -1.</_>\n                <_>8 13 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1198898795992136e-004</threshold>\n            <left_val>0.4652450978755951</left_val>\n            <right_val>0.5942413806915283</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4507530294358730e-003</threshold>\n            <left_val>0.4653508961200714</left_val>\n            <right_val>0.7024846076965332</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 6 -1.</_>\n                <_>11 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5818689027801156e-004</threshold>\n            <left_val>0.5497295260429382</left_val>\n            <right_val>0.3768967092037201</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 9 12 -1.</_>\n                <_>5 12 9 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0174425393342972</threshold>\n            <left_val>0.3919087946414948</left_val>\n            <right_val>0.5457497835159302</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 6 -1.</_>\n                <_>11 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0453435294330120</threshold>\n            <left_val>0.1631357073783875</left_val>\n            <right_val>0.5154908895492554</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 6 -1.</_>\n                <_>6 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9190689781680703e-003</threshold>\n            <left_val>0.5145897865295410</left_val>\n            <right_val>0.2791895866394043</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 11 3 -1.</_>\n                <_>5 5 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0177869163453579e-003</threshold>\n            <left_val>0.6517636179924011</left_val>\n            <right_val>0.4756332933902741</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 5 10 -1.</_>\n                <_>7 6 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0720738470554352e-003</threshold>\n            <left_val>0.5514652729034424</left_val>\n            <right_val>0.4092685878276825</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 18 2 -1.</_>\n                <_>2 9 18 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9855059003457427e-004</threshold>\n            <left_val>0.3165240883827210</left_val>\n            <right_val>0.5285550951957703</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 5 3 -1.</_>\n                <_>7 18 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5418570302426815e-003</threshold>\n            <left_val>0.6853377819061279</left_val>\n            <right_val>0.4652808904647827</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 1 -1.</_>\n                <_>9 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4845089539885521e-003</threshold>\n            <left_val>0.5484588146209717</left_val>\n            <right_val>0.4502759873867035</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 6 6 -1.</_>\n                <_>0 14 3 3 2.</_>\n                <_>3 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0136967804282904</threshold>\n            <left_val>0.6395779848098755</left_val>\n            <right_val>0.4572555124759674</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 1 -1.</_>\n                <_>9 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0173471402376890</threshold>\n            <left_val>0.2751072943210602</left_val>\n            <right_val>0.5181614756584168</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 9 12 1 -1.</_>\n                <_>7 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0885428898036480e-003</threshold>\n            <left_val>0.3325636088848114</left_val>\n            <right_val>0.5194984078407288</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 6 7 -1.</_>\n                <_>14 10 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4687901437282562e-003</threshold>\n            <left_val>0.5942280888557434</left_val>\n            <right_val>0.4851819872856140</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 16 2 -1.</_>\n                <_>1 1 16 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7084840219467878e-003</threshold>\n            <left_val>0.4167110919952393</left_val>\n            <right_val>0.5519806146621704</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 10 9 -1.</_>\n                <_>10 12 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4809094443917274e-003</threshold>\n            <left_val>0.5433894991874695</left_val>\n            <right_val>0.4208514988422394</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 10 2 -1.</_>\n                <_>5 1 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7389650717377663e-003</threshold>\n            <left_val>0.6407189965248108</left_val>\n            <right_val>0.4560655057430267</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 2 3 -1.</_>\n                <_>17 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5761050209403038e-003</threshold>\n            <left_val>0.5214555263519287</left_val>\n            <right_val>0.2258227020502091</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 2 3 -1.</_>\n                <_>1 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1690549328923225e-003</threshold>\n            <left_val>0.3151527941226959</left_val>\n            <right_val>0.5156704783439636</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 6 -1.</_>\n                <_>10 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0146601703017950</threshold>\n            <left_val>0.4870837032794952</left_val>\n            <right_val>0.6689941287040710</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 4 3 -1.</_>\n                <_>8 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7231999663636088e-004</threshold>\n            <left_val>0.3569748997688294</left_val>\n            <right_val>0.5251078009605408</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 6 -1.</_>\n                <_>9 5 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0218037609010935</threshold>\n            <left_val>0.8825920820236206</left_val>\n            <right_val>0.4966329932212830</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 12 12 -1.</_>\n                <_>3 4 6 6 2.</_>\n                <_>9 10 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0947361066937447</threshold>\n            <left_val>0.1446162015199661</left_val>\n            <right_val>0.5061113834381104</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 6 15 -1.</_>\n                <_>11 2 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5825551971793175e-003</threshold>\n            <left_val>0.5396478772163391</left_val>\n            <right_val>0.4238066077232361</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 6 17 -1.</_>\n                <_>4 2 2 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9517090404406190e-003</threshold>\n            <left_val>0.4170410931110382</left_val>\n            <right_val>0.5497786998748779</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 6 7 -1.</_>\n                <_>14 10 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0121499001979828</threshold>\n            <left_val>0.4698367118835449</left_val>\n            <right_val>0.5664274096488953</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 6 7 -1.</_>\n                <_>3 10 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5169620104134083e-003</threshold>\n            <left_val>0.6267772912979126</left_val>\n            <right_val>0.4463135898113251</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 6 15 -1.</_>\n                <_>11 2 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0716679096221924</threshold>\n            <left_val>0.3097011148929596</left_val>\n            <right_val>0.5221003293991089</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 15 -1.</_>\n                <_>7 2 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0882924199104309</threshold>\n            <left_val>0.0811238884925842</left_val>\n            <right_val>0.5006365180015564</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 9 3 6 -1.</_>\n                <_>17 11 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0310630798339844</threshold>\n            <left_val>0.5155503749847412</left_val>\n            <right_val>0.1282255947589874</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 6 6 -1.</_>\n                <_>8 7 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0466218404471874</threshold>\n            <left_val>0.4699777960777283</left_val>\n            <right_val>0.7363960742950440</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 18 6 -1.</_>\n                <_>10 10 9 3 2.</_>\n                <_>1 13 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0121894897893071</threshold>\n            <left_val>0.3920530080795288</left_val>\n            <right_val>0.5518996715545654</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 10 9 -1.</_>\n                <_>0 12 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130161102861166</threshold>\n            <left_val>0.5260658264160156</left_val>\n            <right_val>0.3685136139392853</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4952899441123009e-003</threshold>\n            <left_val>0.6339294910430908</left_val>\n            <right_val>0.4716280996799469</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 3 4 -1.</_>\n                <_>5 14 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4015039748046547e-005</threshold>\n            <left_val>0.5333027243614197</left_val>\n            <right_val>0.3776184916496277</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 3 16 12 -1.</_>\n                <_>3 9 16 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1096649020910263</threshold>\n            <left_val>0.1765342056751251</left_val>\n            <right_val>0.5198346972465515</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 12 12 -1.</_>\n                <_>1 1 6 6 2.</_>\n                <_>7 7 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0279558207839727e-004</threshold>\n            <left_val>0.5324159860610962</left_val>\n            <right_val>0.3838908076286316</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 4 2 4 -1.</_>\n                <_>11 4 1 2 2.</_>\n                <_>10 6 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1126641705632210e-004</threshold>\n            <left_val>0.4647929966449738</left_val>\n            <right_val>0.5755224227905273</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 10 2 -1.</_>\n                <_>0 9 5 1 2.</_>\n                <_>5 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1250279862433672e-003</threshold>\n            <left_val>0.3236708939075470</left_val>\n            <right_val>0.5166770815849304</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 3 3 -1.</_>\n                <_>9 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4144679773598909e-003</threshold>\n            <left_val>0.4787439107894898</left_val>\n            <right_val>0.6459717750549316</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 9 2 -1.</_>\n                <_>3 13 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4391240226104856e-004</threshold>\n            <left_val>0.4409308135509491</left_val>\n            <right_val>0.6010255813598633</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2611189342569560e-004</threshold>\n            <left_val>0.4038113951683044</left_val>\n            <right_val>0.5493255853652954</right_val></_></_></trees>\n      <stage_threshold>50.1697311401367190</stage_threshold>\n      <parent>12</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 14 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 13 6 -1.</_>\n                <_>3 6 13 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0469012893736362</threshold>\n            <left_val>0.6600171923637390</left_val>\n            <right_val>0.3743801116943359</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 6 4 -1.</_>\n                <_>12 7 3 2 2.</_>\n                <_>9 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4568349579349160e-003</threshold>\n            <left_val>0.5783991217613220</left_val>\n            <right_val>0.3437797129154205</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 6 8 -1.</_>\n                <_>4 0 3 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5598369799554348e-003</threshold>\n            <left_val>0.3622266948223114</left_val>\n            <right_val>0.5908216238021851</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 12 -1.</_>\n                <_>9 11 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3170487303286791e-004</threshold>\n            <left_val>0.5500419139862061</left_val>\n            <right_val>0.2873558104038239</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 3 10 -1.</_>\n                <_>4 9 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3318009441718459e-003</threshold>\n            <left_val>0.2673169970512390</left_val>\n            <right_val>0.5431019067764282</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 17 8 3 -1.</_>\n                <_>6 18 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4347059661522508e-004</threshold>\n            <left_val>0.3855027854442596</left_val>\n            <right_val>0.5741388797760010</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 10 6 -1.</_>\n                <_>0 7 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0512469820678234e-003</threshold>\n            <left_val>0.5503209829330444</left_val>\n            <right_val>0.3462845087051392</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 3 2 -1.</_>\n                <_>13 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8657199153676629e-004</threshold>\n            <left_val>0.3291221857070923</left_val>\n            <right_val>0.5429509282112122</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 4 5 -1.</_>\n                <_>9 5 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4668200165033340e-003</threshold>\n            <left_val>0.3588382005691528</left_val>\n            <right_val>0.5351811051368713</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 3 6 -1.</_>\n                <_>12 16 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2021870720200241e-004</threshold>\n            <left_val>0.4296841919422150</left_val>\n            <right_val>0.5700234174728394</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 8 2 -1.</_>\n                <_>1 12 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4122188379988074e-004</threshold>\n            <left_val>0.5282164812088013</left_val>\n            <right_val>0.3366870880126953</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.8330298848450184e-003</threshold>\n            <left_val>0.4559567868709564</left_val>\n            <right_val>0.6257336139678955</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 3 6 -1.</_>\n                <_>0 7 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0154564399272203</threshold>\n            <left_val>0.2350116968154907</left_val>\n            <right_val>0.5129452943801880</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 3 2 -1.</_>\n                <_>13 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6796779129654169e-003</threshold>\n            <left_val>0.5329415202140808</left_val>\n            <right_val>0.4155062139034271</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 4 6 -1.</_>\n                <_>4 14 2 3 2.</_>\n                <_>6 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8296569362282753e-003</threshold>\n            <left_val>0.4273087978363037</left_val>\n            <right_val>0.5804538130760193</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 3 2 -1.</_>\n                <_>13 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9444249123334885e-003</threshold>\n            <left_val>0.2912611961364746</left_val>\n            <right_val>0.5202686190605164</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 4 12 -1.</_>\n                <_>8 6 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7179559692740440e-003</threshold>\n            <left_val>0.5307688117027283</left_val>\n            <right_val>0.3585677146911621</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 8 -1.</_>\n                <_>17 0 3 4 2.</_>\n                <_>14 4 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9077627956867218e-003</threshold>\n            <left_val>0.4703775048255920</left_val>\n            <right_val>0.5941585898399353</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 3 2 -1.</_>\n                <_>8 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2240349575877190e-003</threshold>\n            <left_val>0.2141567021608353</left_val>\n            <right_val>0.5088796019554138</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0725888684391975e-003</threshold>\n            <left_val>0.4766413867473602</left_val>\n            <right_val>0.6841061115264893</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0101495301350951</threshold>\n            <left_val>0.5360798835754395</left_val>\n            <right_val>0.3748497068881989</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 2 10 -1.</_>\n                <_>15 0 1 5 2.</_>\n                <_>14 5 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8864999583456665e-004</threshold>\n            <left_val>0.5720130205154419</left_val>\n            <right_val>0.3853805065155029</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 8 6 -1.</_>\n                <_>5 3 4 3 2.</_>\n                <_>9 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8864358104765415e-003</threshold>\n            <left_val>0.3693122863769531</left_val>\n            <right_val>0.5340958833694458</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 10 -1.</_>\n                <_>17 0 3 5 2.</_>\n                <_>14 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0261584799736738</threshold>\n            <left_val>0.4962374866008759</left_val>\n            <right_val>0.6059989929199219</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 1 2 -1.</_>\n                <_>9 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8560759751126170e-004</threshold>\n            <left_val>0.4438945949077606</left_val>\n            <right_val>0.6012468934059143</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 10 4 3 -1.</_>\n                <_>15 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0112687097862363</threshold>\n            <left_val>0.5244250297546387</left_val>\n            <right_val>0.1840388029813767</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 2 3 -1.</_>\n                <_>8 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8114619199186563e-003</threshold>\n            <left_val>0.6060283780097961</left_val>\n            <right_val>0.4409897029399872</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 14 4 -1.</_>\n                <_>10 13 7 2 2.</_>\n                <_>3 15 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.6112729944288731e-003</threshold>\n            <left_val>0.3891170918941498</left_val>\n            <right_val>0.5589237213134766</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 4 3 -1.</_>\n                <_>1 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5680093616247177e-003</threshold>\n            <left_val>0.5069345831871033</left_val>\n            <right_val>0.2062619030475617</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8172779022715986e-004</threshold>\n            <left_val>0.5882201790809631</left_val>\n            <right_val>0.4192610979080200</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7680290329735726e-004</threshold>\n            <left_val>0.5533605813980103</left_val>\n            <right_val>0.4003368914127350</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 5 16 15 -1.</_>\n                <_>3 10 16 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5112537704408169e-003</threshold>\n            <left_val>0.3310146927833557</left_val>\n            <right_val>0.5444191098213196</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 4 2 -1.</_>\n                <_>8 12 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5948683186434209e-005</threshold>\n            <left_val>0.5433831810951233</left_val>\n            <right_val>0.3944905996322632</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 10 -1.</_>\n                <_>10 4 6 5 2.</_>\n                <_>4 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9939051754772663e-003</threshold>\n            <left_val>0.5600358247756958</left_val>\n            <right_val>0.4192714095115662</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 4 -1.</_>\n                <_>9 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6744439750909805e-003</threshold>\n            <left_val>0.6685466766357422</left_val>\n            <right_val>0.4604960978031158</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 8 -1.</_>\n                <_>10 12 2 4 2.</_>\n                <_>8 16 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0115898502990603</threshold>\n            <left_val>0.5357121229171753</left_val>\n            <right_val>0.2926830053329468</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130078401416540</threshold>\n            <left_val>0.4679817855358124</left_val>\n            <right_val>0.7307463288307190</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 3 2 -1.</_>\n                <_>13 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1008579749614000e-003</threshold>\n            <left_val>0.3937501013278961</left_val>\n            <right_val>0.5415065288543701</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 3 2 -1.</_>\n                <_>8 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0472649056464434e-004</threshold>\n            <left_val>0.4242376089096069</left_val>\n            <right_val>0.5604041218757629</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 9 14 -1.</_>\n                <_>9 0 3 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0144948400557041</threshold>\n            <left_val>0.3631210029125214</left_val>\n            <right_val>0.5293182730674744</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 3 -1.</_>\n                <_>10 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3056948818266392e-003</threshold>\n            <left_val>0.6860452294349670</left_val>\n            <right_val>0.4621821045875549</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 2 3 -1.</_>\n                <_>10 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1829127157106996e-004</threshold>\n            <left_val>0.3944096863269806</left_val>\n            <right_val>0.5420439243316650</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 4 6 -1.</_>\n                <_>0 11 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0190775208175182</threshold>\n            <left_val>0.1962621957063675</left_val>\n            <right_val>0.5037891864776611</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 2 -1.</_>\n                <_>6 1 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5549470339901745e-004</threshold>\n            <left_val>0.4086259007453919</left_val>\n            <right_val>0.5613973140716553</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 7 3 -1.</_>\n                <_>6 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9679730758070946e-003</threshold>\n            <left_val>0.4489121139049530</left_val>\n            <right_val>0.5926123261451721</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 8 9 -1.</_>\n                <_>8 13 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9189141504466534e-003</threshold>\n            <left_val>0.5335925817489624</left_val>\n            <right_val>0.3728385865688324</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 3 2 -1.</_>\n                <_>6 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9872779268771410e-003</threshold>\n            <left_val>0.5111321210861206</left_val>\n            <right_val>0.2975643873214722</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 6 8 -1.</_>\n                <_>17 1 3 4 2.</_>\n                <_>14 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2264618463814259e-003</threshold>\n            <left_val>0.5541489720344544</left_val>\n            <right_val>0.4824537932872772</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 6 8 -1.</_>\n                <_>0 1 3 4 2.</_>\n                <_>3 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0133533002808690</threshold>\n            <left_val>0.4586423933506012</left_val>\n            <right_val>0.6414797902107239</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 6 -1.</_>\n                <_>10 2 9 3 2.</_>\n                <_>1 5 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0335052385926247</threshold>\n            <left_val>0.5392425060272217</left_val>\n            <right_val>0.3429994881153107</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 1 -1.</_>\n                <_>10 3 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5294460356235504e-003</threshold>\n            <left_val>0.1703713983297348</left_val>\n            <right_val>0.5013315081596375</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 6 -1.</_>\n                <_>15 2 2 3 2.</_>\n                <_>13 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2801629491150379e-003</threshold>\n            <left_val>0.5305461883544922</left_val>\n            <right_val>0.4697405099868774</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0687388069927692e-003</threshold>\n            <left_val>0.4615545868873596</left_val>\n            <right_val>0.6436504721641541</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 1 3 -1.</_>\n                <_>13 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6880499040707946e-004</threshold>\n            <left_val>0.4833599030971527</left_val>\n            <right_val>0.6043894290924072</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 5 3 -1.</_>\n                <_>2 17 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9647659286856651e-003</threshold>\n            <left_val>0.5187637209892273</left_val>\n            <right_val>0.3231816887855530</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 6 -1.</_>\n                <_>15 2 2 3 2.</_>\n                <_>13 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0220577307045460</threshold>\n            <left_val>0.4079256951808929</left_val>\n            <right_val>0.5200980901718140</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 4 6 -1.</_>\n                <_>3 2 2 3 2.</_>\n                <_>5 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6906312713399529e-004</threshold>\n            <left_val>0.5331609249114990</left_val>\n            <right_val>0.3815600872039795</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 1 2 -1.</_>\n                <_>13 6 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7009328631684184e-004</threshold>\n            <left_val>0.5655422210693359</left_val>\n            <right_val>0.4688901901245117</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 2 -1.</_>\n                <_>5 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4284552829340100e-004</threshold>\n            <left_val>0.4534381031990051</left_val>\n            <right_val>0.6287400126457214</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 2 -1.</_>\n                <_>13 9 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2227810695767403e-003</threshold>\n            <left_val>0.5350633263587952</left_val>\n            <right_val>0.3303655982017517</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 2 2 -1.</_>\n                <_>6 9 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4130521602928638e-003</threshold>\n            <left_val>0.1113687008619309</left_val>\n            <right_val>0.5005434751510620</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 17 3 2 -1.</_>\n                <_>13 18 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4520040167553816e-005</threshold>\n            <left_val>0.5628737807273865</left_val>\n            <right_val>0.4325133860111237</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 16 4 4 -1.</_>\n                <_>6 16 2 2 2.</_>\n                <_>8 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3369169502984732e-004</threshold>\n            <left_val>0.4165835082530975</left_val>\n            <right_val>0.5447791218757629</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 3 -1.</_>\n                <_>9 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2894547805190086e-003</threshold>\n            <left_val>0.4860391020774841</left_val>\n            <right_val>0.6778649091720581</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 9 6 -1.</_>\n                <_>0 15 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9103150852024555e-003</threshold>\n            <left_val>0.5262305140495300</left_val>\n            <right_val>0.3612113893032074</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 6 -1.</_>\n                <_>9 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0129005396738648</threshold>\n            <left_val>0.5319377183914185</left_val>\n            <right_val>0.3250288069248200</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 2 3 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6982979401946068e-003</threshold>\n            <left_val>0.4618245065212250</left_val>\n            <right_val>0.6665925979614258</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 18 6 -1.</_>\n                <_>1 12 18 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0104398597031832</threshold>\n            <left_val>0.5505670905113220</left_val>\n            <right_val>0.3883604109287262</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 2 -1.</_>\n                <_>8 12 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0443191062659025e-003</threshold>\n            <left_val>0.4697853028774262</left_val>\n            <right_val>0.7301844954490662</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 9 6 2 -1.</_>\n                <_>7 10 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1593751888722181e-004</threshold>\n            <left_val>0.3830839097499847</left_val>\n            <right_val>0.5464984178543091</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 2 3 -1.</_>\n                <_>8 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4247159492224455e-003</threshold>\n            <left_val>0.2566300034523010</left_val>\n            <right_val>0.5089530944824219</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 5 3 4 -1.</_>\n                <_>18 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3538565561175346e-003</threshold>\n            <left_val>0.6469966173171997</left_val>\n            <right_val>0.4940795898437500</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 19 18 1 -1.</_>\n                <_>7 19 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0523389987647533</threshold>\n            <left_val>0.4745982885360718</left_val>\n            <right_val>0.7878770828247070</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 3 2 -1.</_>\n                <_>10 0 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5765620414167643e-003</threshold>\n            <left_val>0.5306664705276489</left_val>\n            <right_val>0.2748498022556305</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 1 6 -1.</_>\n                <_>1 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1555317845195532e-004</threshold>\n            <left_val>0.5413125753402710</left_val>\n            <right_val>0.4041908979415894</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 17 8 3 -1.</_>\n                <_>12 17 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0105166798457503</threshold>\n            <left_val>0.6158512234687805</left_val>\n            <right_val>0.4815283119678497</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 3 4 -1.</_>\n                <_>1 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7347927726805210e-003</threshold>\n            <left_val>0.4695805907249451</left_val>\n            <right_val>0.7028980851173401</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 3 -1.</_>\n                <_>9 8 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3226778507232666e-003</threshold>\n            <left_val>0.2849566042423248</left_val>\n            <right_val>0.5304684042930603</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 2 -1.</_>\n                <_>7 11 1 1 2.</_>\n                <_>8 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5534399319440126e-003</threshold>\n            <left_val>0.7056984901428223</left_val>\n            <right_val>0.4688892066478729</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 2 5 -1.</_>\n                <_>11 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0268510231981054e-004</threshold>\n            <left_val>0.3902932107448578</left_val>\n            <right_val>0.5573464035987854</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 2 5 -1.</_>\n                <_>8 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1395188570022583e-006</threshold>\n            <left_val>0.3684231936931610</left_val>\n            <right_val>0.5263987779617310</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6711989883333445e-003</threshold>\n            <left_val>0.3849175870418549</left_val>\n            <right_val>0.5387271046638489</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 3 -1.</_>\n                <_>5 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9260449595749378e-003</threshold>\n            <left_val>0.4729771912097931</left_val>\n            <right_val>0.7447251081466675</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 19 15 1 -1.</_>\n                <_>9 19 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3908702209591866e-003</threshold>\n            <left_val>0.4809181094169617</left_val>\n            <right_val>0.5591921806335449</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 19 15 1 -1.</_>\n                <_>6 19 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0177936293184757</threshold>\n            <left_val>0.6903678178787231</left_val>\n            <right_val>0.4676927030086517</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0469669252634048e-003</threshold>\n            <left_val>0.5370690226554871</left_val>\n            <right_val>0.3308162093162537</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 4 15 -1.</_>\n                <_>7 0 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0298914890736341</threshold>\n            <left_val>0.5139865279197693</left_val>\n            <right_val>0.3309059143066406</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 5 -1.</_>\n                <_>9 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5494900289922953e-003</threshold>\n            <left_val>0.4660237133502960</left_val>\n            <right_val>0.6078342795372009</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 7 -1.</_>\n                <_>10 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4956969534978271e-003</threshold>\n            <left_val>0.4404835999011993</left_val>\n            <right_val>0.5863919854164124</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 11 3 3 -1.</_>\n                <_>16 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.5885928021743894e-004</threshold>\n            <left_val>0.5435971021652222</left_val>\n            <right_val>0.4208523035049439</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 3 3 -1.</_>\n                <_>1 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9643701640889049e-004</threshold>\n            <left_val>0.5370578169822693</left_val>\n            <right_val>0.4000622034072876</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 3 -1.</_>\n                <_>6 7 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7280810754746199e-003</threshold>\n            <left_val>0.5659412741661072</left_val>\n            <right_val>0.4259642958641052</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 6 2 -1.</_>\n                <_>0 16 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3026480339467525e-003</threshold>\n            <left_val>0.5161657929420471</left_val>\n            <right_val>0.3350869119167328</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 6 -1.</_>\n                <_>7 0 6 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.2515163123607636</threshold>\n            <left_val>0.4869661927223206</left_val>\n            <right_val>0.7147309780120850</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 4 -1.</_>\n                <_>7 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6328022144734859e-003</threshold>\n            <left_val>0.2727448940277100</left_val>\n            <right_val>0.5083789825439453</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 4 10 -1.</_>\n                <_>16 10 2 5 2.</_>\n                <_>14 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0404344908893108</threshold>\n            <left_val>0.6851438879966736</left_val>\n            <right_val>0.5021767020225525</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 3 2 -1.</_>\n                <_>4 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4972220014897175e-005</threshold>\n            <left_val>0.4284465014934540</left_val>\n            <right_val>0.5522555112838745</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 2 2 -1.</_>\n                <_>11 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4050309730228037e-004</threshold>\n            <left_val>0.4226118922233582</left_val>\n            <right_val>0.5390074849128723</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 4 10 -1.</_>\n                <_>2 10 2 5 2.</_>\n                <_>4 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0236578397452831</threshold>\n            <left_val>0.4744631946086884</left_val>\n            <right_val>0.7504366040229797</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 6 -1.</_>\n                <_>10 13 10 3 2.</_>\n                <_>0 16 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1449104472994804e-003</threshold>\n            <left_val>0.4245058894157410</left_val>\n            <right_val>0.5538362860679627</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 2 15 -1.</_>\n                <_>1 5 1 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6992130335420370e-003</threshold>\n            <left_val>0.5952357053756714</left_val>\n            <right_val>0.4529713094234467</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 18 4 -1.</_>\n                <_>10 7 9 2 2.</_>\n                <_>1 9 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7718601785600185e-003</threshold>\n            <left_val>0.4137794077396393</left_val>\n            <right_val>0.5473399758338928</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 17 -1.</_>\n                <_>1 0 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2669530957937241e-003</threshold>\n            <left_val>0.4484114944934845</left_val>\n            <right_val>0.5797994136810303</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 6 16 6 -1.</_>\n                <_>10 6 8 3 2.</_>\n                <_>2 9 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7791989957913756e-003</threshold>\n            <left_val>0.5624858736991882</left_val>\n            <right_val>0.4432444870471954</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 1 3 -1.</_>\n                <_>8 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6774770338088274e-003</threshold>\n            <left_val>0.4637751877307892</left_val>\n            <right_val>0.6364241838455200</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 2 -1.</_>\n                <_>8 16 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1732629500329494e-003</threshold>\n            <left_val>0.4544503092765808</left_val>\n            <right_val>0.5914415717124939</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 8 2 -1.</_>\n                <_>5 2 4 1 2.</_>\n                <_>9 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6998171173036098e-004</threshold>\n            <left_val>0.5334752798080444</left_val>\n            <right_val>0.3885917961597443</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 6 -1.</_>\n                <_>6 14 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6378340600058436e-004</threshold>\n            <left_val>0.5398585200309753</left_val>\n            <right_val>0.3744941949844360</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 2 -1.</_>\n                <_>9 14 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5684569370932877e-004</threshold>\n            <left_val>0.4317873120307922</left_val>\n            <right_val>0.5614616274833679</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215113703161478</threshold>\n            <left_val>0.1785925030708313</left_val>\n            <right_val>0.5185542702674866</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 2 -1.</_>\n                <_>9 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3081369979772717e-004</threshold>\n            <left_val>0.4342499077320099</left_val>\n            <right_val>0.5682849884033203</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0219920407980680</threshold>\n            <left_val>0.5161716938018799</left_val>\n            <right_val>0.2379394024610519</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 1 3 -1.</_>\n                <_>9 14 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0136500764638186e-004</threshold>\n            <left_val>0.5986763238906860</left_val>\n            <right_val>0.4466426968574524</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2736099138855934e-003</threshold>\n            <left_val>0.4108217954635620</left_val>\n            <right_val>0.5251057147979736</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 2 6 -1.</_>\n                <_>0 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6831789184361696e-003</threshold>\n            <left_val>0.5173814296722412</left_val>\n            <right_val>0.3397518098354340</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 3 -1.</_>\n                <_>9 13 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9525681212544441e-003</threshold>\n            <left_val>0.6888983249664307</left_val>\n            <right_val>0.4845924079418182</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5382299898192286e-003</threshold>\n            <left_val>0.5178567171096802</left_val>\n            <right_val>0.3454113900661469</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 4 3 -1.</_>\n                <_>13 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0140435304492712</threshold>\n            <left_val>0.1678421050310135</left_val>\n            <right_val>0.5188667774200440</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4315890148282051e-003</threshold>\n            <left_val>0.4368256926536560</left_val>\n            <right_val>0.5655773878097534</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 10 6 -1.</_>\n                <_>5 4 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0340142287313938</threshold>\n            <left_val>0.7802296280860901</left_val>\n            <right_val>0.4959217011928558</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 4 3 -1.</_>\n                <_>3 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0120272999629378</threshold>\n            <left_val>0.1585101038217545</left_val>\n            <right_val>0.5032231807708740</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 15 5 -1.</_>\n                <_>8 7 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1331661939620972</threshold>\n            <left_val>0.5163304805755615</left_val>\n            <right_val>0.2755128145217896</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 12 2 -1.</_>\n                <_>7 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5221949433907866e-003</threshold>\n            <left_val>0.3728317916393280</left_val>\n            <right_val>0.5214552283287048</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 3 9 -1.</_>\n                <_>11 3 1 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3929271679371595e-004</threshold>\n            <left_val>0.5838379263877869</left_val>\n            <right_val>0.4511165022850037</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 6 -1.</_>\n                <_>10 6 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0277197398245335</threshold>\n            <left_val>0.4728286862373352</left_val>\n            <right_val>0.7331544756889343</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 4 3 -1.</_>\n                <_>9 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1030150130391121e-003</threshold>\n            <left_val>0.5302202105522156</left_val>\n            <right_val>0.4101563096046448</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 4 9 -1.</_>\n                <_>2 9 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0778612196445465</threshold>\n            <left_val>0.4998334050178528</left_val>\n            <right_val>0.1272961944341660</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 3 5 -1.</_>\n                <_>10 13 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0158549398183823</threshold>\n            <left_val>0.0508333593606949</left_val>\n            <right_val>0.5165656208992004</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 3 -1.</_>\n                <_>9 7 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9725300632417202e-003</threshold>\n            <left_val>0.6798133850097656</left_val>\n            <right_val>0.4684231877326965</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.7676506265997887e-004</threshold>\n            <left_val>0.6010771989822388</left_val>\n            <right_val>0.4788931906223297</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>9 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4647710379213095e-003</threshold>\n            <left_val>0.3393397927284241</left_val>\n            <right_val>0.5220503807067871</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 2 -1.</_>\n                <_>9 9 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7937700077891350e-003</threshold>\n            <left_val>0.4365136921405792</left_val>\n            <right_val>0.5239663124084473</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 3 -1.</_>\n                <_>10 6 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0326080210506916</threshold>\n            <left_val>0.5052723884582520</left_val>\n            <right_val>0.2425214946269989</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 3 1 -1.</_>\n                <_>11 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8514421107247472e-004</threshold>\n            <left_val>0.5733973979949951</left_val>\n            <right_val>0.4758574068546295</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 11 15 -1.</_>\n                <_>0 6 11 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0296326000243425</threshold>\n            <left_val>0.3892289102077484</left_val>\n            <right_val>0.5263597965240479</right_val></_></_></trees>\n      <stage_threshold>66.6691207885742190</stage_threshold>\n      <parent>13</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 15 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 6 -1.</_>\n                <_>7 0 6 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0465508513152599</threshold>\n            <left_val>0.3276950120925903</left_val>\n            <right_val>0.6240522861480713</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 1 -1.</_>\n                <_>9 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9537127166986465e-003</threshold>\n            <left_val>0.4256485104560852</left_val>\n            <right_val>0.6942939162254334</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 16 6 4 -1.</_>\n                <_>5 16 3 2 2.</_>\n                <_>8 18 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8221561377868056e-004</threshold>\n            <left_val>0.3711487054824829</left_val>\n            <right_val>0.5900732874870300</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 9 8 -1.</_>\n                <_>6 9 9 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9348249770700932e-004</threshold>\n            <left_val>0.2041133940219879</left_val>\n            <right_val>0.5300545096397400</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 2 6 -1.</_>\n                <_>5 13 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6710508973337710e-004</threshold>\n            <left_val>0.5416126251220703</left_val>\n            <right_val>0.3103179037570953</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 8 10 -1.</_>\n                <_>11 6 4 5 2.</_>\n                <_>7 11 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7818060480058193e-003</threshold>\n            <left_val>0.5277832746505737</left_val>\n            <right_val>0.3467069864273071</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 8 10 -1.</_>\n                <_>5 6 4 5 2.</_>\n                <_>9 11 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6779078547842801e-004</threshold>\n            <left_val>0.5308231115341187</left_val>\n            <right_val>0.3294492065906525</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 2 -1.</_>\n                <_>9 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0335160772665404e-005</threshold>\n            <left_val>0.5773872733116150</left_val>\n            <right_val>0.3852097094058991</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 8 2 -1.</_>\n                <_>5 13 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8038009814918041e-004</threshold>\n            <left_val>0.4317438900470734</left_val>\n            <right_val>0.6150057911872864</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 8 2 -1.</_>\n                <_>10 3 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2553851380944252e-003</threshold>\n            <left_val>0.2933903932571411</left_val>\n            <right_val>0.5324292778968811</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 2 10 -1.</_>\n                <_>4 0 1 5 2.</_>\n                <_>5 5 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4735610350035131e-004</threshold>\n            <left_val>0.5468844771385193</left_val>\n            <right_val>0.3843030035495758</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 2 -1.</_>\n                <_>9 11 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4724259381182492e-004</threshold>\n            <left_val>0.4281542897224426</left_val>\n            <right_val>0.5755587220191956</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 15 3 -1.</_>\n                <_>2 9 15 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1864770203828812e-003</threshold>\n            <left_val>0.3747301101684570</left_val>\n            <right_val>0.5471466183662415</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3936580400913954e-003</threshold>\n            <left_val>0.4537783861160278</left_val>\n            <right_val>0.6111528873443604</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 3 2 -1.</_>\n                <_>8 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5390539774671197e-003</threshold>\n            <left_val>0.2971341907978058</left_val>\n            <right_val>0.5189538002014160</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1968790143728256e-003</threshold>\n            <left_val>0.6699066758155823</left_val>\n            <right_val>0.4726476967334747</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1499789222143590e-004</threshold>\n            <left_val>0.3384954035282135</left_val>\n            <right_val>0.5260317921638489</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 2 3 6 -1.</_>\n                <_>17 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4359830208122730e-003</threshold>\n            <left_val>0.5399122238159180</left_val>\n            <right_val>0.3920140862464905</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 3 4 -1.</_>\n                <_>2 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6606200262904167e-003</threshold>\n            <left_val>0.4482578039169312</left_val>\n            <right_val>0.6119617819786072</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 8 4 6 -1.</_>\n                <_>14 10 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5287200221791863e-003</threshold>\n            <left_val>0.3711237907409668</left_val>\n            <right_val>0.5340266227722168</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 3 8 -1.</_>\n                <_>2 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7397250309586525e-003</threshold>\n            <left_val>0.6031088232994080</left_val>\n            <right_val>0.4455145001411438</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>8 16 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0148291299119592</threshold>\n            <left_val>0.2838754057884216</left_val>\n            <right_val>0.5341861844062805</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 2 2 -1.</_>\n                <_>3 15 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.2275557108223438e-004</threshold>\n            <left_val>0.5209547281265259</left_val>\n            <right_val>0.3361653983592987</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 8 4 6 -1.</_>\n                <_>14 10 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0835298076272011</threshold>\n            <left_val>0.5119969844818115</left_val>\n            <right_val>0.0811644494533539</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 4 6 -1.</_>\n                <_>2 10 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5633148662745953e-004</threshold>\n            <left_val>0.3317120075225830</left_val>\n            <right_val>0.5189831256866455</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 6 -1.</_>\n                <_>10 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8403859883546829e-003</threshold>\n            <left_val>0.5247598290443420</left_val>\n            <right_val>0.2334959059953690</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 3 6 -1.</_>\n                <_>8 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5953830443322659e-003</threshold>\n            <left_val>0.5750094056129456</left_val>\n            <right_val>0.4295622110366821</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 2 6 -1.</_>\n                <_>12 2 1 3 2.</_>\n                <_>11 5 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4766020689858124e-005</threshold>\n            <left_val>0.4342445135116577</left_val>\n            <right_val>0.5564029216766357</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 6 5 -1.</_>\n                <_>8 6 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0298629105091095</threshold>\n            <left_val>0.4579147100448608</left_val>\n            <right_val>0.6579188108444214</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 1 3 6 -1.</_>\n                <_>17 3 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0113255903124809</threshold>\n            <left_val>0.5274311900138855</left_val>\n            <right_val>0.3673888146877289</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7828645482659340e-003</threshold>\n            <left_val>0.7100368738174439</left_val>\n            <right_val>0.4642167091369629</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 18 3 2 -1.</_>\n                <_>10 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3639959767460823e-003</threshold>\n            <left_val>0.5279216170310974</left_val>\n            <right_val>0.2705877125263214</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 2 -1.</_>\n                <_>9 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1804728098213673e-003</threshold>\n            <left_val>0.5072525143623352</left_val>\n            <right_val>0.2449083030223846</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 5 2 -1.</_>\n                <_>12 4 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5668511302210391e-004</threshold>\n            <left_val>0.4283105134963989</left_val>\n            <right_val>0.5548691153526306</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 5 12 -1.</_>\n                <_>7 7 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7140368949621916e-003</threshold>\n            <left_val>0.5519387722015381</left_val>\n            <right_val>0.4103653132915497</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0253042895346880</threshold>\n            <left_val>0.6867002248764038</left_val>\n            <right_val>0.4869889020919800</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 2 2 -1.</_>\n                <_>4 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4454080741852522e-004</threshold>\n            <left_val>0.3728874027729034</left_val>\n            <right_val>0.5287693142890930</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 14 4 2 -1.</_>\n                <_>13 14 2 1 2.</_>\n                <_>11 15 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.3935231668874621e-004</threshold>\n            <left_val>0.6060152053833008</left_val>\n            <right_val>0.4616062045097351</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0172800496220589</threshold>\n            <left_val>0.5049635767936707</left_val>\n            <right_val>0.1819823980331421</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 3 -1.</_>\n                <_>9 8 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3595077954232693e-003</threshold>\n            <left_val>0.1631239950656891</left_val>\n            <right_val>0.5232778787612915</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 1 3 -1.</_>\n                <_>5 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0298109846189618e-003</threshold>\n            <left_val>0.4463278055191040</left_val>\n            <right_val>0.6176549196243286</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 6 1 -1.</_>\n                <_>10 10 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0117109632119536e-003</threshold>\n            <left_val>0.5473384857177734</left_val>\n            <right_val>0.4300698935985565</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 6 1 -1.</_>\n                <_>7 10 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103088002651930</threshold>\n            <left_val>0.1166985034942627</left_val>\n            <right_val>0.5000867247581482</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 3 -1.</_>\n                <_>9 18 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4682018235325813e-003</threshold>\n            <left_val>0.4769287109375000</left_val>\n            <right_val>0.6719213724136353</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 1 3 -1.</_>\n                <_>4 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1696460731327534e-004</threshold>\n            <left_val>0.3471089899539948</left_val>\n            <right_val>0.5178164839744568</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 3 3 -1.</_>\n                <_>12 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3922820109874010e-003</threshold>\n            <left_val>0.4785236120223999</left_val>\n            <right_val>0.6216310858726502</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 3 -1.</_>\n                <_>4 6 12 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5573818758130074e-003</threshold>\n            <left_val>0.5814796090126038</left_val>\n            <right_val>0.4410085082054138</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 3 -1.</_>\n                <_>9 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7024032361805439e-004</threshold>\n            <left_val>0.3878000080585480</left_val>\n            <right_val>0.5465722084045410</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 3 3 -1.</_>\n                <_>5 9 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7125990539789200e-003</threshold>\n            <left_val>0.1660051047801971</left_val>\n            <right_val>0.4995836019515991</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 9 17 -1.</_>\n                <_>9 0 3 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103063201531768</threshold>\n            <left_val>0.4093391001224518</left_val>\n            <right_val>0.5274233818054199</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 3 -1.</_>\n                <_>9 13 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0940979011356831e-003</threshold>\n            <left_val>0.6206194758415222</left_val>\n            <right_val>0.4572280049324036</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 15 -1.</_>\n                <_>9 10 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8099051713943481e-003</threshold>\n            <left_val>0.5567759275436401</left_val>\n            <right_val>0.4155600070953369</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 2 3 -1.</_>\n                <_>8 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0746059706434608e-003</threshold>\n            <left_val>0.5638927817344666</left_val>\n            <right_val>0.4353024959564209</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1550289820879698e-003</threshold>\n            <left_val>0.4826265871524811</left_val>\n            <right_val>0.6749758124351502</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 5 -1.</_>\n                <_>9 1 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0317423194646835</threshold>\n            <left_val>0.5048379898071289</left_val>\n            <right_val>0.1883248984813690</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 20 2 -1.</_>\n                <_>0 0 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0783827230334282</threshold>\n            <left_val>0.2369548976421356</left_val>\n            <right_val>0.5260158181190491</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 5 3 -1.</_>\n                <_>2 14 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7415119372308254e-003</threshold>\n            <left_val>0.5048828721046448</left_val>\n            <right_val>0.2776469886302948</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9014600440859795e-003</threshold>\n            <left_val>0.6238604784011841</left_val>\n            <right_val>0.4693317115306854</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 9 15 -1.</_>\n                <_>2 10 9 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6427931152284145e-003</threshold>\n            <left_val>0.3314141929149628</left_val>\n            <right_val>0.5169777274131775</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 12 10 -1.</_>\n                <_>11 0 6 5 2.</_>\n                <_>5 5 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1094966009259224</threshold>\n            <left_val>0.2380045056343079</left_val>\n            <right_val>0.5183441042900085</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 2 3 -1.</_>\n                <_>6 1 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4075913289561868e-005</threshold>\n            <left_val>0.4069635868072510</left_val>\n            <right_val>0.5362150073051453</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 6 1 -1.</_>\n                <_>12 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0593802006915212e-004</threshold>\n            <left_val>0.5506706237792969</left_val>\n            <right_val>0.4374594092369080</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 2 10 -1.</_>\n                <_>3 1 1 5 2.</_>\n                <_>4 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2131777890026569e-004</threshold>\n            <left_val>0.5525709986686707</left_val>\n            <right_val>0.4209375977516174</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 2 1 -1.</_>\n                <_>13 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0276539443293586e-005</threshold>\n            <left_val>0.5455474853515625</left_val>\n            <right_val>0.4748266041278839</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 4 6 -1.</_>\n                <_>4 15 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8065142259001732e-003</threshold>\n            <left_val>0.5157995820045471</left_val>\n            <right_val>0.3424577116966248</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 2 1 -1.</_>\n                <_>13 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7202789895236492e-003</threshold>\n            <left_val>0.5013207793235779</left_val>\n            <right_val>0.6331263780593872</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 1 -1.</_>\n                <_>6 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3016929733566940e-004</threshold>\n            <left_val>0.5539718270301819</left_val>\n            <right_val>0.4226869940757752</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 18 4 -1.</_>\n                <_>11 12 9 2 2.</_>\n                <_>2 14 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8016388900578022e-003</threshold>\n            <left_val>0.4425095021724701</left_val>\n            <right_val>0.5430780053138733</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 2 -1.</_>\n                <_>5 7 1 1 2.</_>\n                <_>6 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5399310979992151e-003</threshold>\n            <left_val>0.7145782113075256</left_val>\n            <right_val>0.4697605073451996</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 4 2 -1.</_>\n                <_>16 4 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4278929447755218e-003</threshold>\n            <left_val>0.4070445001125336</left_val>\n            <right_val>0.5399605035781860</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 2 18 -1.</_>\n                <_>0 2 1 9 2.</_>\n                <_>1 11 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0251425504684448</threshold>\n            <left_val>0.7884690761566162</left_val>\n            <right_val>0.4747352004051209</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 4 -1.</_>\n                <_>10 2 9 2 2.</_>\n                <_>1 4 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8899609353393316e-003</threshold>\n            <left_val>0.4296191930770874</left_val>\n            <right_val>0.5577110052108765</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 1 3 -1.</_>\n                <_>9 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3947459198534489e-003</threshold>\n            <left_val>0.4693162143230438</left_val>\n            <right_val>0.7023944258689880</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 18 4 -1.</_>\n                <_>11 12 9 2 2.</_>\n                <_>2 14 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0246784202754498</threshold>\n            <left_val>0.5242322087287903</left_val>\n            <right_val>0.3812510073184967</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 18 4 -1.</_>\n                <_>0 12 9 2 2.</_>\n                <_>9 14 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0380476787686348</threshold>\n            <left_val>0.5011739730834961</left_val>\n            <right_val>0.1687828004360199</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 5 3 -1.</_>\n                <_>11 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9424865543842316e-003</threshold>\n            <left_val>0.4828582108020783</left_val>\n            <right_val>0.6369568109512329</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 7 3 -1.</_>\n                <_>6 5 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5110049862414598e-003</threshold>\n            <left_val>0.5906485915184021</left_val>\n            <right_val>0.4487667977809906</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 17 3 3 -1.</_>\n                <_>13 18 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4201741479337215e-003</threshold>\n            <left_val>0.5241097807884216</left_val>\n            <right_val>0.2990570068359375</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 3 4 -1.</_>\n                <_>9 1 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9802159406244755e-003</threshold>\n            <left_val>0.3041465878486633</left_val>\n            <right_val>0.5078489780426025</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 2 4 -1.</_>\n                <_>11 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4580078944563866e-004</threshold>\n            <left_val>0.4128139019012451</left_val>\n            <right_val>0.5256826281547546</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 9 3 -1.</_>\n                <_>3 17 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0104709500446916</threshold>\n            <left_val>0.5808395147323608</left_val>\n            <right_val>0.4494296014308929</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 2 8 -1.</_>\n                <_>12 0 1 4 2.</_>\n                <_>11 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3369204550981522e-003</threshold>\n            <left_val>0.5246552824974060</left_val>\n            <right_val>0.2658948898315430</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 6 12 -1.</_>\n                <_>0 8 3 6 2.</_>\n                <_>3 14 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0279369000345469</threshold>\n            <left_val>0.4674955010414124</left_val>\n            <right_val>0.7087256908416748</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 4 12 -1.</_>\n                <_>10 13 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4277678504586220e-003</threshold>\n            <left_val>0.5409486889839172</left_val>\n            <right_val>0.3758518099784851</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 8 14 -1.</_>\n                <_>5 10 8 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0235845092684031</threshold>\n            <left_val>0.3758639991283417</left_val>\n            <right_val>0.5238550901412964</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 6 1 -1.</_>\n                <_>14 10 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1452640173956752e-003</threshold>\n            <left_val>0.4329578876495361</left_val>\n            <right_val>0.5804247260093689</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 10 4 -1.</_>\n                <_>0 6 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3468660442158580e-004</threshold>\n            <left_val>0.5280618071556091</left_val>\n            <right_val>0.3873069882392883</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 5 8 -1.</_>\n                <_>10 4 5 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0106485402211547</threshold>\n            <left_val>0.4902113080024719</left_val>\n            <right_val>0.5681251883506775</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 4 8 -1.</_>\n                <_>8 1 2 4 2.</_>\n                <_>10 5 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9418050437234342e-004</threshold>\n            <left_val>0.5570880174636841</left_val>\n            <right_val>0.4318251013755798</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3270479394122958e-004</threshold>\n            <left_val>0.5658439993858337</left_val>\n            <right_val>0.4343554973602295</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 3 4 -1.</_>\n                <_>9 9 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0125510636717081e-003</threshold>\n            <left_val>0.6056739091873169</left_val>\n            <right_val>0.4537523984909058</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4854319635778666e-003</threshold>\n            <left_val>0.5390477180480957</left_val>\n            <right_val>0.4138010144233704</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>9 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8237880431115627e-003</threshold>\n            <left_val>0.4354828894138336</left_val>\n            <right_val>0.5717188715934753</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 13 3 -1.</_>\n                <_>7 2 13 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0166566595435143</threshold>\n            <left_val>0.3010913133621216</left_val>\n            <right_val>0.5216122865676880</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 1 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0349558265879750e-004</threshold>\n            <left_val>0.5300151109695435</left_val>\n            <right_val>0.3818396925926209</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 3 6 -1.</_>\n                <_>12 13 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4170378930866718e-003</threshold>\n            <left_val>0.5328028798103333</left_val>\n            <right_val>0.4241400063037872</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6222729249857366e-004</threshold>\n            <left_val>0.5491728186607361</left_val>\n            <right_val>0.4186977148056030</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 18 10 -1.</_>\n                <_>10 4 9 5 2.</_>\n                <_>1 9 9 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1163002029061317</threshold>\n            <left_val>0.1440722048282623</left_val>\n            <right_val>0.5226451158523560</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 9 -1.</_>\n                <_>8 9 4 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146950101479888</threshold>\n            <left_val>0.7747725248336792</left_val>\n            <right_val>0.4715717136859894</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 3 -1.</_>\n                <_>8 7 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1972130052745342e-003</threshold>\n            <left_val>0.5355433821678162</left_val>\n            <right_val>0.3315644860267639</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6965209185145795e-004</threshold>\n            <left_val>0.5767235159873962</left_val>\n            <right_val>0.4458136856555939</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 4 3 -1.</_>\n                <_>14 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5144998952746391e-003</threshold>\n            <left_val>0.5215674042701721</left_val>\n            <right_val>0.3647888898849487</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 3 10 -1.</_>\n                <_>6 10 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0213000606745481</threshold>\n            <left_val>0.4994204938411713</left_val>\n            <right_val>0.1567950993776321</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1881409231573343e-003</threshold>\n            <left_val>0.4742200076580048</left_val>\n            <right_val>0.6287270188331604</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 1 6 -1.</_>\n                <_>0 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0019777417182922e-004</threshold>\n            <left_val>0.5347954034805298</left_val>\n            <right_val>0.3943752050399780</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 1 3 -1.</_>\n                <_>10 16 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1772277802228928e-003</threshold>\n            <left_val>0.6727191805839539</left_val>\n            <right_val>0.5013138055801392</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 4 3 -1.</_>\n                <_>2 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3764649890363216e-003</threshold>\n            <left_val>0.3106675148010254</left_val>\n            <right_val>0.5128793120384216</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 8 -1.</_>\n                <_>19 3 1 4 2.</_>\n                <_>18 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6299960445612669e-003</threshold>\n            <left_val>0.4886310100555420</left_val>\n            <right_val>0.5755215883255005</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 8 -1.</_>\n                <_>0 3 1 4 2.</_>\n                <_>1 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0458688959479332e-003</threshold>\n            <left_val>0.6025794148445129</left_val>\n            <right_val>0.4558076858520508</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 14 10 -1.</_>\n                <_>10 7 7 5 2.</_>\n                <_>3 12 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0694827064871788</threshold>\n            <left_val>0.5240747928619385</left_val>\n            <right_val>0.2185259014368057</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 19 3 -1.</_>\n                <_>0 8 19 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0240489393472672</threshold>\n            <left_val>0.5011867284774780</left_val>\n            <right_val>0.2090622037649155</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 3 3 -1.</_>\n                <_>12 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1095340382307768e-003</threshold>\n            <left_val>0.4866712093353272</left_val>\n            <right_val>0.7108548283576965</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 1 3 -1.</_>\n                <_>0 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2503260513767600e-003</threshold>\n            <left_val>0.3407891094684601</left_val>\n            <right_val>0.5156195163726807</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 3 3 -1.</_>\n                <_>12 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0281190043315291e-003</threshold>\n            <left_val>0.5575572252273560</left_val>\n            <right_val>0.4439432024955750</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 3 3 -1.</_>\n                <_>5 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8893622159957886e-003</threshold>\n            <left_val>0.6402000784873962</left_val>\n            <right_val>0.4620442092418671</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 4 2 -1.</_>\n                <_>8 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1094801640138030e-004</threshold>\n            <left_val>0.3766441941261292</left_val>\n            <right_val>0.5448899865150452</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 4 12 -1.</_>\n                <_>8 3 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7686357758939266e-003</threshold>\n            <left_val>0.3318648934364319</left_val>\n            <right_val>0.5133677124977112</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 2 3 -1.</_>\n                <_>13 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8506490159779787e-003</threshold>\n            <left_val>0.4903570115566254</left_val>\n            <right_val>0.6406934857368469</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 20 4 -1.</_>\n                <_>0 12 20 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0997994691133499</threshold>\n            <left_val>0.1536051034927368</left_val>\n            <right_val>0.5015562176704407</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 17 14 -1.</_>\n                <_>2 7 17 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.3512834906578064</threshold>\n            <left_val>0.0588231310248375</left_val>\n            <right_val>0.5174378752708435</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 10 -1.</_>\n                <_>0 0 3 5 2.</_>\n                <_>3 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0452445708215237</threshold>\n            <left_val>0.6961488723754883</left_val>\n            <right_val>0.4677872955799103</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 6 4 -1.</_>\n                <_>14 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0714815780520439</threshold>\n            <left_val>0.5167986154556274</left_val>\n            <right_val>0.1038092970848084</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 6 4 -1.</_>\n                <_>3 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1895780228078365e-003</threshold>\n            <left_val>0.4273078143596649</left_val>\n            <right_val>0.5532060861587524</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 7 2 -1.</_>\n                <_>13 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.9242651332169771e-004</threshold>\n            <left_val>0.4638943970203400</left_val>\n            <right_val>0.5276389122009277</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 7 2 -1.</_>\n                <_>0 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6788389766588807e-003</threshold>\n            <left_val>0.5301648974418640</left_val>\n            <right_val>0.3932034969329834</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 14 2 -1.</_>\n                <_>13 11 7 1 2.</_>\n                <_>6 12 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2163488902151585e-003</threshold>\n            <left_val>0.5630694031715393</left_val>\n            <right_val>0.4757033884525299</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 2 2 -1.</_>\n                <_>8 5 1 1 2.</_>\n                <_>9 6 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1568699846975505e-004</threshold>\n            <left_val>0.4307535886764526</left_val>\n            <right_val>0.5535702705383301</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 3 -1.</_>\n                <_>13 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2017288766801357e-003</threshold>\n            <left_val>0.1444882005453110</left_val>\n            <right_val>0.5193064212799072</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 3 12 -1.</_>\n                <_>2 1 1 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9081272017210722e-004</threshold>\n            <left_val>0.4384432137012482</left_val>\n            <right_val>0.5593621134757996</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 4 1 3 -1.</_>\n                <_>17 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9605009583756328e-004</threshold>\n            <left_val>0.5340415835380554</left_val>\n            <right_val>0.4705956876277924</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 4 1 3 -1.</_>\n                <_>2 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.2022142335772514e-004</threshold>\n            <left_val>0.5213856101036072</left_val>\n            <right_val>0.3810079097747803</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 1 3 -1.</_>\n                <_>14 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4588572392240167e-004</threshold>\n            <left_val>0.4769414961338043</left_val>\n            <right_val>0.6130738854408264</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 2 3 -1.</_>\n                <_>7 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1698471806012094e-005</threshold>\n            <left_val>0.4245009124279022</left_val>\n            <right_val>0.5429363250732422</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>10 13 2 3 2.</_>\n                <_>8 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1833200007677078e-003</threshold>\n            <left_val>0.5457730889320374</left_val>\n            <right_val>0.4191075861454010</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 1 3 -1.</_>\n                <_>5 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6039671441540122e-004</threshold>\n            <left_val>0.5764588713645935</left_val>\n            <right_val>0.4471659958362579</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 20 -1.</_>\n                <_>16 0 2 20 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0132362395524979</threshold>\n            <left_val>0.6372823119163513</left_val>\n            <right_val>0.4695009887218475</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 2 6 -1.</_>\n                <_>5 1 1 3 2.</_>\n                <_>6 4 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3376701069064438e-004</threshold>\n            <left_val>0.5317873954772949</left_val>\n            <right_val>0.3945829868316650</right_val></_></_></trees>\n      <stage_threshold>67.6989212036132810</stage_threshold>\n      <parent>14</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 16 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 10 4 -1.</_>\n                <_>5 6 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0248471498489380</threshold>\n            <left_val>0.6555516719818115</left_val>\n            <right_val>0.3873311877250671</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 4 12 -1.</_>\n                <_>15 2 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1348611488938332e-003</threshold>\n            <left_val>0.3748072087764740</left_val>\n            <right_val>0.5973997712135315</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 4 12 -1.</_>\n                <_>7 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4498498104512691e-003</threshold>\n            <left_val>0.5425491929054260</left_val>\n            <right_val>0.2548811137676239</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 1 8 -1.</_>\n                <_>14 9 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3491211039945483e-004</threshold>\n            <left_val>0.2462442070245743</left_val>\n            <right_val>0.5387253761291504</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 14 10 -1.</_>\n                <_>1 4 7 5 2.</_>\n                <_>8 9 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4023890253156424e-003</threshold>\n            <left_val>0.5594322085380554</left_val>\n            <right_val>0.3528657853603363</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 6 6 14 -1.</_>\n                <_>14 6 3 7 2.</_>\n                <_>11 13 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0044000595808029e-004</threshold>\n            <left_val>0.3958503901958466</left_val>\n            <right_val>0.5765938162803650</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 6 14 -1.</_>\n                <_>3 6 3 7 2.</_>\n                <_>6 13 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0042409849120304e-004</threshold>\n            <left_val>0.3698996901512146</left_val>\n            <right_val>0.5534998178482056</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 15 2 -1.</_>\n                <_>9 9 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0841490738093853e-003</threshold>\n            <left_val>0.3711090981960297</left_val>\n            <right_val>0.5547800064086914</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 3 -1.</_>\n                <_>7 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0195372607558966</threshold>\n            <left_val>0.7492755055427551</left_val>\n            <right_val>0.4579297006130219</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 14 4 -1.</_>\n                <_>13 3 7 2 2.</_>\n                <_>6 5 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4532740654831287e-006</threshold>\n            <left_val>0.5649787187576294</left_val>\n            <right_val>0.3904069960117340</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 15 2 -1.</_>\n                <_>6 9 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6079459823668003e-003</threshold>\n            <left_val>0.3381088078022003</left_val>\n            <right_val>0.5267801284790039</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 9 -1.</_>\n                <_>6 14 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0697501022368670e-003</threshold>\n            <left_val>0.5519291162490845</left_val>\n            <right_val>0.3714388906955719</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 3 8 -1.</_>\n                <_>8 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6463840408250690e-004</threshold>\n            <left_val>0.5608214735984802</left_val>\n            <right_val>0.4113566875457764</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 6 -1.</_>\n                <_>14 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.5490452582016587e-004</threshold>\n            <left_val>0.3559206128120422</left_val>\n            <right_val>0.5329356193542481</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 6 4 -1.</_>\n                <_>5 7 3 2 2.</_>\n                <_>8 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.8322238773107529e-004</threshold>\n            <left_val>0.5414795875549316</left_val>\n            <right_val>0.3763205111026764</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 19 -1.</_>\n                <_>7 1 6 19 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0199406407773495</threshold>\n            <left_val>0.6347903013229370</left_val>\n            <right_val>0.4705299139022827</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 6 5 -1.</_>\n                <_>4 2 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.7680300883948803e-003</threshold>\n            <left_val>0.3913489878177643</left_val>\n            <right_val>0.5563716292381287</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 17 6 2 -1.</_>\n                <_>12 18 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4528505578637123e-003</threshold>\n            <left_val>0.2554892897605896</left_val>\n            <right_val>0.5215116739273071</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 17 6 2 -1.</_>\n                <_>2 18 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9560849070549011e-003</threshold>\n            <left_val>0.5174679160118103</left_val>\n            <right_val>0.3063920140266419</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>17 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1078737750649452e-003</threshold>\n            <left_val>0.5388448238372803</left_val>\n            <right_val>0.2885963022708893</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 3 -1.</_>\n                <_>8 18 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8219229532405734e-003</threshold>\n            <left_val>0.4336043000221252</left_val>\n            <right_val>0.5852196812629700</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 13 2 6 -1.</_>\n                <_>10 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0146887395530939</threshold>\n            <left_val>0.5287361741065979</left_val>\n            <right_val>0.2870005965232849</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0143879903480411</threshold>\n            <left_val>0.7019448876380920</left_val>\n            <right_val>0.4647370874881744</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>17 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0189866498112679</threshold>\n            <left_val>0.2986552119255066</left_val>\n            <right_val>0.5247011780738831</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 2 3 -1.</_>\n                <_>8 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1527639580890536e-003</threshold>\n            <left_val>0.4323473870754242</left_val>\n            <right_val>0.5931661725044251</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 6 2 -1.</_>\n                <_>11 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0109336702153087</threshold>\n            <left_val>0.5286864042282105</left_val>\n            <right_val>0.3130319118499756</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 3 6 -1.</_>\n                <_>0 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0149327302351594</threshold>\n            <left_val>0.2658419013023377</left_val>\n            <right_val>0.5084077119827271</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 4 6 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9970539617352188e-004</threshold>\n            <left_val>0.5463526844978333</left_val>\n            <right_val>0.3740724027156830</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 3 2 -1.</_>\n                <_>5 6 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1677621193230152e-003</threshold>\n            <left_val>0.4703496992588043</left_val>\n            <right_val>0.7435721755027771</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 3 4 -1.</_>\n                <_>11 1 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3905320130288601e-003</threshold>\n            <left_val>0.2069258987903595</left_val>\n            <right_val>0.5280538201332092</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 5 9 -1.</_>\n                <_>1 5 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5029609464108944e-003</threshold>\n            <left_val>0.5182648897171021</left_val>\n            <right_val>0.3483543097972870</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 2 3 -1.</_>\n                <_>13 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.2040365561842918e-003</threshold>\n            <left_val>0.6803777217864990</left_val>\n            <right_val>0.4932360053062439</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 14 3 -1.</_>\n                <_>7 6 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0813272595405579</threshold>\n            <left_val>0.5058398842811585</left_val>\n            <right_val>0.2253051996231079</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 18 8 -1.</_>\n                <_>2 15 18 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1507928073406220</threshold>\n            <left_val>0.2963424921035767</left_val>\n            <right_val>0.5264679789543152</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 3 -1.</_>\n                <_>5 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3179009333252907e-003</threshold>\n            <left_val>0.4655495882034302</left_val>\n            <right_val>0.7072932124137878</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 2 -1.</_>\n                <_>12 6 2 1 2.</_>\n                <_>10 7 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7402801252901554e-004</threshold>\n            <left_val>0.4780347943305969</left_val>\n            <right_val>0.5668237805366516</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 2 -1.</_>\n                <_>6 6 2 1 2.</_>\n                <_>8 7 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8199541419744492e-004</threshold>\n            <left_val>0.4286996126174927</left_val>\n            <right_val>0.5722156763076782</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 3 4 -1.</_>\n                <_>11 1 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3671570494771004e-003</threshold>\n            <left_val>0.5299307107925415</left_val>\n            <right_val>0.3114621937274933</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 2 7 -1.</_>\n                <_>8 1 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.7018666565418243e-005</threshold>\n            <left_val>0.3674638867378235</left_val>\n            <right_val>0.5269461870193481</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 15 14 -1.</_>\n                <_>4 9 15 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1253408938646317</threshold>\n            <left_val>0.2351492047309876</left_val>\n            <right_val>0.5245791077613831</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>9 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2516269497573376e-003</threshold>\n            <left_val>0.7115936875343323</left_val>\n            <right_val>0.4693767130374908</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 18 4 -1.</_>\n                <_>11 3 9 2 2.</_>\n                <_>2 5 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8342109918594360e-003</threshold>\n            <left_val>0.4462651014328003</left_val>\n            <right_val>0.5409085750579834</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>10 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1310069821774960e-003</threshold>\n            <left_val>0.5945618748664856</left_val>\n            <right_val>0.4417662024497986</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 3 -1.</_>\n                <_>13 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7601120052859187e-003</threshold>\n            <left_val>0.5353249907493591</left_val>\n            <right_val>0.3973453044891357</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 2 -1.</_>\n                <_>7 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1581249833106995e-004</threshold>\n            <left_val>0.3760268092155457</left_val>\n            <right_val>0.5264726877212524</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 7 -1.</_>\n                <_>9 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8687589112669230e-003</threshold>\n            <left_val>0.6309912800788879</left_val>\n            <right_val>0.4749819934368134</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 2 3 -1.</_>\n                <_>6 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5207129763439298e-003</threshold>\n            <left_val>0.5230181813240051</left_val>\n            <right_val>0.3361223936080933</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 14 18 -1.</_>\n                <_>6 9 14 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.5458673834800720</threshold>\n            <left_val>0.5167139768600464</left_val>\n            <right_val>0.1172635033726692</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 6 3 -1.</_>\n                <_>2 17 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0156501904129982</threshold>\n            <left_val>0.4979439079761505</left_val>\n            <right_val>0.1393294930458069</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 6 -1.</_>\n                <_>10 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0117318602278829</threshold>\n            <left_val>0.7129650712013245</left_val>\n            <right_val>0.4921196103096008</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 4 3 -1.</_>\n                <_>7 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1765122227370739e-003</threshold>\n            <left_val>0.2288102954626083</left_val>\n            <right_val>0.5049701929092407</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 3 -1.</_>\n                <_>7 13 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2457661107182503e-003</threshold>\n            <left_val>0.4632433950901032</left_val>\n            <right_val>0.6048725843429565</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1915869116783142e-003</threshold>\n            <left_val>0.6467421054840088</left_val>\n            <right_val>0.4602192938327789</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 2 -1.</_>\n                <_>9 12 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0238278806209564</threshold>\n            <left_val>0.1482000946998596</left_val>\n            <right_val>0.5226079225540161</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 4 6 -1.</_>\n                <_>5 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0284580057486892e-003</threshold>\n            <left_val>0.5135489106178284</left_val>\n            <right_val>0.3375957012176514</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 7 2 -1.</_>\n                <_>11 13 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0100788502022624</threshold>\n            <left_val>0.2740561068058014</left_val>\n            <right_val>0.5303567051887512</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 8 6 -1.</_>\n                <_>6 10 4 3 2.</_>\n                <_>10 13 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6168930344283581e-003</threshold>\n            <left_val>0.5332670807838440</left_val>\n            <right_val>0.3972454071044922</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 4 -1.</_>\n                <_>11 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4385367548093200e-004</threshold>\n            <left_val>0.5365604162216187</left_val>\n            <right_val>0.4063411951065064</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 3 -1.</_>\n                <_>9 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3510512225329876e-003</threshold>\n            <left_val>0.4653759002685547</left_val>\n            <right_val>0.6889045834541321</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 3 1 9 -1.</_>\n                <_>13 6 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5274790348485112e-003</threshold>\n            <left_val>0.5449501276016235</left_val>\n            <right_val>0.3624723851680756</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 13 14 6 -1.</_>\n                <_>1 15 14 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0806244164705276</threshold>\n            <left_val>0.1656087040901184</left_val>\n            <right_val>0.5000287294387817</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 1 6 -1.</_>\n                <_>13 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0221920292824507</threshold>\n            <left_val>0.5132731199264526</left_val>\n            <right_val>0.2002808004617691</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 3 8 -1.</_>\n                <_>1 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3100631125271320e-003</threshold>\n            <left_val>0.4617947936058044</left_val>\n            <right_val>0.6366536021232605</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 0 2 18 -1.</_>\n                <_>18 0 1 18 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4063072204589844e-003</threshold>\n            <left_val>0.5916250944137573</left_val>\n            <right_val>0.4867860972881317</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 6 2 -1.</_>\n                <_>2 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.6415040530264378e-004</threshold>\n            <left_val>0.3888409137725830</left_val>\n            <right_val>0.5315797924995422</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 8 6 -1.</_>\n                <_>9 2 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6734489994123578e-004</threshold>\n            <left_val>0.4159064888954163</left_val>\n            <right_val>0.5605279803276062</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 6 -1.</_>\n                <_>6 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1474501853808761e-004</threshold>\n            <left_val>0.3089022040367127</left_val>\n            <right_val>0.5120148062705994</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 8 6 3 -1.</_>\n                <_>14 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0105270929634571e-003</threshold>\n            <left_val>0.3972199857234955</left_val>\n            <right_val>0.5207306146621704</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 18 -1.</_>\n                <_>1 0 1 18 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6909132078289986e-003</threshold>\n            <left_val>0.6257408261299133</left_val>\n            <right_val>0.4608575999736786</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 18 2 -1.</_>\n                <_>10 18 9 1 2.</_>\n                <_>1 19 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0163914598524570</threshold>\n            <left_val>0.2085209935903549</left_val>\n            <right_val>0.5242266058921814</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 2 2 -1.</_>\n                <_>3 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0973909199237823e-004</threshold>\n            <left_val>0.5222427248954773</left_val>\n            <right_val>0.3780320882797241</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 5 3 -1.</_>\n                <_>8 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5242289993911982e-003</threshold>\n            <left_val>0.5803927183151245</left_val>\n            <right_val>0.4611890017986298</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 2 3 -1.</_>\n                <_>8 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0945312250405550e-004</threshold>\n            <left_val>0.4401271939277649</left_val>\n            <right_val>0.5846015810966492</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9656419754028320e-003</threshold>\n            <left_val>0.5322325229644775</left_val>\n            <right_val>0.4184590876102448</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 2 -1.</_>\n                <_>9 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6298897834494710e-004</threshold>\n            <left_val>0.3741844892501831</left_val>\n            <right_val>0.5234565734863281</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 5 5 2 -1.</_>\n                <_>15 6 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7946797935292125e-004</threshold>\n            <left_val>0.4631041884422302</left_val>\n            <right_val>0.5356478095054627</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 5 2 -1.</_>\n                <_>0 6 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2856349870562553e-003</threshold>\n            <left_val>0.5044670104980469</left_val>\n            <right_val>0.2377564013004303</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 14 1 6 -1.</_>\n                <_>17 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0174594894051552</threshold>\n            <left_val>0.7289121150970459</left_val>\n            <right_val>0.5050435066223145</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 9 9 3 -1.</_>\n                <_>5 9 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0254217498004436</threshold>\n            <left_val>0.6667134761810303</left_val>\n            <right_val>0.4678100049495697</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5647639520466328e-003</threshold>\n            <left_val>0.4391759037971497</left_val>\n            <right_val>0.5323626995086670</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 18 -1.</_>\n                <_>2 0 2 18 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0114443600177765</threshold>\n            <left_val>0.4346440136432648</left_val>\n            <right_val>0.5680012106895447</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 6 1 3 -1.</_>\n                <_>17 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7352550104260445e-004</threshold>\n            <left_val>0.4477140903472900</left_val>\n            <right_val>0.5296812057495117</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 14 1 6 -1.</_>\n                <_>2 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3194209039211273e-003</threshold>\n            <left_val>0.4740200042724609</left_val>\n            <right_val>0.7462607026100159</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 8 1 2 -1.</_>\n                <_>19 9 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3328490604180843e-004</threshold>\n            <left_val>0.5365061759948731</left_val>\n            <right_val>0.4752134978771210</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 3 3 -1.</_>\n                <_>6 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8815799206495285e-003</threshold>\n            <left_val>0.1752219051122665</left_val>\n            <right_val>0.5015255212783814</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 3 -1.</_>\n                <_>9 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7985680177807808e-003</threshold>\n            <left_val>0.7271236777305603</left_val>\n            <right_val>0.4896200895309448</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 6 1 3 -1.</_>\n                <_>2 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8922499516047537e-004</threshold>\n            <left_val>0.4003908932209015</left_val>\n            <right_val>0.5344941020011902</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 8 2 -1.</_>\n                <_>16 4 4 1 2.</_>\n                <_>12 5 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9288610201328993e-003</threshold>\n            <left_val>0.5605612993240356</left_val>\n            <right_val>0.4803955852985382</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 8 2 -1.</_>\n                <_>0 4 4 1 2.</_>\n                <_>4 5 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4214154630899429e-003</threshold>\n            <left_val>0.4753246903419495</left_val>\n            <right_val>0.7623608708381653</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 18 4 -1.</_>\n                <_>2 18 18 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1655876711010933e-003</threshold>\n            <left_val>0.5393261909484863</left_val>\n            <right_val>0.4191643893718720</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 4 -1.</_>\n                <_>7 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8280550981871784e-004</threshold>\n            <left_val>0.4240800142288208</left_val>\n            <right_val>0.5399821996688843</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 14 3 -1.</_>\n                <_>4 1 14 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7186630759388208e-003</threshold>\n            <left_val>0.4244599938392639</left_val>\n            <right_val>0.5424923896789551</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 20 -1.</_>\n                <_>2 0 2 20 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0125072300434113</threshold>\n            <left_val>0.5895841717720032</left_val>\n            <right_val>0.4550411105155945</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 4 8 -1.</_>\n                <_>14 4 2 4 2.</_>\n                <_>12 8 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0242865197360516</threshold>\n            <left_val>0.2647134959697723</left_val>\n            <right_val>0.5189179778099060</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 2 2 -1.</_>\n                <_>6 7 1 1 2.</_>\n                <_>7 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9676330741494894e-003</threshold>\n            <left_val>0.7347682714462280</left_val>\n            <right_val>0.4749749898910523</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 2 3 -1.</_>\n                <_>10 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0125289997085929</threshold>\n            <left_val>0.2756049931049347</left_val>\n            <right_val>0.5177599787712097</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>8 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0104000102728605e-003</threshold>\n            <left_val>0.3510560989379883</left_val>\n            <right_val>0.5144724249839783</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 6 12 -1.</_>\n                <_>8 8 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1348530426621437e-003</threshold>\n            <left_val>0.5637925863265991</left_val>\n            <right_val>0.4667319953441620</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 11 12 -1.</_>\n                <_>4 4 11 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0195642597973347</threshold>\n            <left_val>0.4614573121070862</left_val>\n            <right_val>0.6137639880180359</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 9 6 11 -1.</_>\n                <_>16 9 2 11 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0971463471651077</threshold>\n            <left_val>0.2998378872871399</left_val>\n            <right_val>0.5193555951118469</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 4 3 -1.</_>\n                <_>0 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5014568604528904e-003</threshold>\n            <left_val>0.5077884793281555</left_val>\n            <right_val>0.3045755922794342</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 3 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3706971704959869e-003</threshold>\n            <left_val>0.4861018955707550</left_val>\n            <right_val>0.6887500882148743</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 3 2 -1.</_>\n                <_>5 12 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0721528977155685e-003</threshold>\n            <left_val>0.1673395931720734</left_val>\n            <right_val>0.5017563104629517</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 3 3 -1.</_>\n                <_>10 15 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3537208586931229e-003</threshold>\n            <left_val>0.2692756950855255</left_val>\n            <right_val>0.5242633223533630</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>9 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0109328404068947</threshold>\n            <left_val>0.7183864116668701</left_val>\n            <right_val>0.4736028909683228</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 3 3 -1.</_>\n                <_>10 15 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2356072962284088e-003</threshold>\n            <left_val>0.5223966836929321</left_val>\n            <right_val>0.2389862984418869</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 2 -1.</_>\n                <_>8 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0038160253316164e-003</threshold>\n            <left_val>0.5719355940818787</left_val>\n            <right_val>0.4433943033218384</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 16 4 -1.</_>\n                <_>10 10 8 2 2.</_>\n                <_>2 12 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0859128348529339e-003</threshold>\n            <left_val>0.5472841858863831</left_val>\n            <right_val>0.4148836135864258</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 4 17 -1.</_>\n                <_>4 3 2 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1548541933298111</threshold>\n            <left_val>0.4973812103271484</left_val>\n            <right_val>0.0610615983605385</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 7 -1.</_>\n                <_>15 13 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0897459762636572e-004</threshold>\n            <left_val>0.4709174036979675</left_val>\n            <right_val>0.5423889160156250</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 6 1 -1.</_>\n                <_>5 2 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3316991175524890e-004</threshold>\n            <left_val>0.4089626967906952</left_val>\n            <right_val>0.5300992131233215</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 12 4 -1.</_>\n                <_>9 2 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108134001493454</threshold>\n            <left_val>0.6104369759559631</left_val>\n            <right_val>0.4957334101200104</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0456560105085373</threshold>\n            <left_val>0.5069689154624939</left_val>\n            <right_val>0.2866660058498383</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 2 2 -1.</_>\n                <_>14 7 1 1 2.</_>\n                <_>13 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2569549726322293e-003</threshold>\n            <left_val>0.4846917092800140</left_val>\n            <right_val>0.6318171024322510</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 20 6 -1.</_>\n                <_>0 14 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1201507002115250</threshold>\n            <left_val>0.0605261400341988</left_val>\n            <right_val>0.4980959892272949</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 2 3 -1.</_>\n                <_>14 7 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0533799650147557e-004</threshold>\n            <left_val>0.5363109707832336</left_val>\n            <right_val>0.4708042144775391</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 9 12 -1.</_>\n                <_>3 8 3 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2070319056510925</threshold>\n            <left_val>0.0596603304147720</left_val>\n            <right_val>0.4979098141193390</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 16 2 -1.</_>\n                <_>3 0 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2909180077258497e-004</threshold>\n            <left_val>0.4712977111339569</left_val>\n            <right_val>0.5377997756004334</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 3 3 -1.</_>\n                <_>6 16 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.8818528992123902e-004</threshold>\n            <left_val>0.4363538026809692</left_val>\n            <right_val>0.5534191131591797</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 6 3 -1.</_>\n                <_>8 16 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9243610333651304e-003</threshold>\n            <left_val>0.5811185836791992</left_val>\n            <right_val>0.4825215935707092</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 1 6 -1.</_>\n                <_>0 12 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3882332546636462e-004</threshold>\n            <left_val>0.5311700105667114</left_val>\n            <right_val>0.4038138985633850</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 4 3 -1.</_>\n                <_>10 10 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9061550265178084e-003</threshold>\n            <left_val>0.3770701885223389</left_val>\n            <right_val>0.5260015130043030</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 2 3 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9514348655939102e-003</threshold>\n            <left_val>0.4766167998313904</left_val>\n            <right_val>0.7682183980941773</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 1 -1.</_>\n                <_>5 7 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130834598094225</threshold>\n            <left_val>0.5264462828636169</left_val>\n            <right_val>0.3062222003936768</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 12 19 -1.</_>\n                <_>10 0 6 19 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2115933001041412</threshold>\n            <left_val>0.6737198233604431</left_val>\n            <right_val>0.4695810079574585</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 20 6 -1.</_>\n                <_>10 6 10 3 2.</_>\n                <_>0 9 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1493250280618668e-003</threshold>\n            <left_val>0.5644835233688355</left_val>\n            <right_val>0.4386953115463257</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 2 2 -1.</_>\n                <_>3 6 1 1 2.</_>\n                <_>4 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9754100725986063e-004</threshold>\n            <left_val>0.4526061117649078</left_val>\n            <right_val>0.5895630121231079</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 6 2 2 -1.</_>\n                <_>16 6 1 1 2.</_>\n                <_>15 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3814480043947697e-003</threshold>\n            <left_val>0.6070582270622253</left_val>\n            <right_val>0.4942413866519928</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 2 2 -1.</_>\n                <_>3 6 1 1 2.</_>\n                <_>4 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8122188784182072e-004</threshold>\n            <left_val>0.5998213291168213</left_val>\n            <right_val>0.4508252143859863</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 1 12 -1.</_>\n                <_>14 10 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3905329871922731e-003</threshold>\n            <left_val>0.4205588996410370</left_val>\n            <right_val>0.5223848223686218</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 16 10 -1.</_>\n                <_>2 5 8 5 2.</_>\n                <_>10 10 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0272689294070005</threshold>\n            <left_val>0.5206447243690491</left_val>\n            <right_val>0.3563301861286163</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7658358924090862e-003</threshold>\n            <left_val>0.3144704103469849</left_val>\n            <right_val>0.5218814015388489</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 2 2 -1.</_>\n                <_>1 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4903489500284195e-003</threshold>\n            <left_val>0.3380196094512940</left_val>\n            <right_val>0.5124437212944031</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 15 5 -1.</_>\n                <_>10 0 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0174282304942608</threshold>\n            <left_val>0.5829960703849793</left_val>\n            <right_val>0.4919725954532623</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 15 5 -1.</_>\n                <_>5 0 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0152780301868916</threshold>\n            <left_val>0.6163144707679749</left_val>\n            <right_val>0.4617887139320374</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 2 17 -1.</_>\n                <_>11 2 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0319956094026566</threshold>\n            <left_val>0.5166357159614563</left_val>\n            <right_val>0.1712764054536820</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 2 17 -1.</_>\n                <_>8 2 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8256710395216942e-003</threshold>\n            <left_val>0.3408012092113495</left_val>\n            <right_val>0.5131387710571289</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 2 9 -1.</_>\n                <_>15 11 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5186436772346497e-003</threshold>\n            <left_val>0.6105518937110901</left_val>\n            <right_val>0.4997941851615906</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 2 9 -1.</_>\n                <_>4 11 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0641621500253677e-004</threshold>\n            <left_val>0.4327270984649658</left_val>\n            <right_val>0.5582311153411865</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 16 14 4 -1.</_>\n                <_>5 16 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0103448498994112</threshold>\n            <left_val>0.4855653047561646</left_val>\n            <right_val>0.5452420115470886</right_val></_></_></trees>\n      <stage_threshold>69.2298736572265630</stage_threshold>\n      <parent>15</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 17 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 18 1 -1.</_>\n                <_>7 4 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8981826081871986e-003</threshold>\n            <left_val>0.3332524895668030</left_val>\n            <right_val>0.5946462154388428</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6170160379260778e-003</threshold>\n            <left_val>0.3490641117095947</left_val>\n            <right_val>0.5577868819236755</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 12 -1.</_>\n                <_>9 12 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5449741194024682e-004</threshold>\n            <left_val>0.5542566180229187</left_val>\n            <right_val>0.3291530013084412</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 6 6 -1.</_>\n                <_>12 3 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5428980113938451e-003</threshold>\n            <left_val>0.3612579107284546</left_val>\n            <right_val>0.5545979142189026</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 6 -1.</_>\n                <_>5 2 3 3 2.</_>\n                <_>8 5 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0329450014978647e-003</threshold>\n            <left_val>0.3530139029026032</left_val>\n            <right_val>0.5576140284538269</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 6 4 -1.</_>\n                <_>12 16 3 2 2.</_>\n                <_>9 18 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7698158565908670e-004</threshold>\n            <left_val>0.3916778862476349</left_val>\n            <right_val>0.5645321011543274</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 3 -1.</_>\n                <_>7 2 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1432030051946640</threshold>\n            <left_val>0.4667482078075409</left_val>\n            <right_val>0.7023633122444153</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 9 10 -1.</_>\n                <_>7 9 9 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3866490274667740e-003</threshold>\n            <left_val>0.3073684871196747</left_val>\n            <right_val>0.5289257764816284</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 4 4 -1.</_>\n                <_>7 9 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2936742324382067e-004</threshold>\n            <left_val>0.5622118115425110</left_val>\n            <right_val>0.4037049114704132</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 6 -1.</_>\n                <_>11 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8893528552725911e-004</threshold>\n            <left_val>0.5267661213874817</left_val>\n            <right_val>0.3557874858379364</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 5 3 -1.</_>\n                <_>7 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0122280502691865</threshold>\n            <left_val>0.6668320894241333</left_val>\n            <right_val>0.4625549912452698</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 6 6 -1.</_>\n                <_>10 11 3 3 2.</_>\n                <_>7 14 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5420239437371492e-003</threshold>\n            <left_val>0.5521438121795654</left_val>\n            <right_val>0.3869673013687134</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 10 9 -1.</_>\n                <_>0 3 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0585320414975286e-003</threshold>\n            <left_val>0.3628678023815155</left_val>\n            <right_val>0.5320926904678345</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 1 6 -1.</_>\n                <_>13 16 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4935660146875307e-005</threshold>\n            <left_val>0.4632444977760315</left_val>\n            <right_val>0.5363323092460632</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.2537708543241024e-003</threshold>\n            <left_val>0.5132231712341309</left_val>\n            <right_val>0.3265708982944489</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2338023930788040e-003</threshold>\n            <left_val>0.6693689823150635</left_val>\n            <right_val>0.4774140119552612</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 1 6 -1.</_>\n                <_>6 16 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1866810129722580e-005</threshold>\n            <left_val>0.4053862094879150</left_val>\n            <right_val>0.5457931160926819</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 2 3 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8150229956954718e-003</threshold>\n            <left_val>0.6454995870590210</left_val>\n            <right_val>0.4793178141117096</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 3 3 -1.</_>\n                <_>7 4 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1105879675596952e-003</threshold>\n            <left_val>0.5270407199859619</left_val>\n            <right_val>0.3529678881168366</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 11 3 -1.</_>\n                <_>9 1 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7707689702510834e-003</threshold>\n            <left_val>0.3803547024726868</left_val>\n            <right_val>0.5352957844734192</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 20 3 -1.</_>\n                <_>0 7 20 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0158339068293571e-003</threshold>\n            <left_val>0.5339403152465820</left_val>\n            <right_val>0.3887133002281189</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 1 2 -1.</_>\n                <_>10 2 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5453689098358154e-004</threshold>\n            <left_val>0.3564616143703461</left_val>\n            <right_val>0.5273603796958923</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 6 -1.</_>\n                <_>10 6 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0110505102202296</threshold>\n            <left_val>0.4671907126903534</left_val>\n            <right_val>0.6849737763404846</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 8 12 1 -1.</_>\n                <_>9 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0426058396697044</threshold>\n            <left_val>0.5151473283767700</left_val>\n            <right_val>0.0702200904488564</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 12 1 -1.</_>\n                <_>7 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0781750101596117e-003</threshold>\n            <left_val>0.3041661083698273</left_val>\n            <right_val>0.5152602195739746</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4815728217363358e-003</threshold>\n            <left_val>0.6430295705795288</left_val>\n            <right_val>0.4897229969501495</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 9 6 2 -1.</_>\n                <_>6 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1881860923022032e-003</threshold>\n            <left_val>0.5307493209838867</left_val>\n            <right_val>0.3826209902763367</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5947180003859103e-004</threshold>\n            <left_val>0.4650047123432159</left_val>\n            <right_val>0.5421904921531677</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 1 -1.</_>\n                <_>9 0 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0705031715333462e-003</threshold>\n            <left_val>0.2849679887294769</left_val>\n            <right_val>0.5079116225242615</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0145941702648997</threshold>\n            <left_val>0.2971645891666412</left_val>\n            <right_val>0.5128461718559265</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 2 1 -1.</_>\n                <_>8 10 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1947689927183092e-004</threshold>\n            <left_val>0.5631098151206970</left_val>\n            <right_val>0.4343082010746002</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 9 13 -1.</_>\n                <_>9 4 3 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9344649091362953e-004</threshold>\n            <left_val>0.4403578042984009</left_val>\n            <right_val>0.5359959006309509</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 4 2 -1.</_>\n                <_>6 9 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4834799912932795e-005</threshold>\n            <left_val>0.3421008884906769</left_val>\n            <right_val>0.5164697766304016</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 6 -1.</_>\n                <_>16 2 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0296985581517220e-003</threshold>\n            <left_val>0.4639343023300171</left_val>\n            <right_val>0.6114075183868408</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 6 3 -1.</_>\n                <_>0 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0640818923711777e-003</threshold>\n            <left_val>0.2820158898830414</left_val>\n            <right_val>0.5075494050979614</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 3 10 -1.</_>\n                <_>10 15 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0260621197521687</threshold>\n            <left_val>0.5208905935287476</left_val>\n            <right_val>0.2688778042793274</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0173146594315767</threshold>\n            <left_val>0.4663713872432709</left_val>\n            <right_val>0.6738539934158325</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 4 4 3 -1.</_>\n                <_>10 4 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0226666405797005</threshold>\n            <left_val>0.5209349989891052</left_val>\n            <right_val>0.2212723940610886</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 3 8 -1.</_>\n                <_>9 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1965929772704840e-003</threshold>\n            <left_val>0.6063101291656494</left_val>\n            <right_val>0.4538190066814423</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 9 13 -1.</_>\n                <_>9 6 3 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.5282476395368576e-003</threshold>\n            <left_val>0.4635204970836639</left_val>\n            <right_val>0.5247430801391602</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0943619832396507e-003</threshold>\n            <left_val>0.5289440155029297</left_val>\n            <right_val>0.3913882076740265</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 8 -1.</_>\n                <_>16 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0728773325681686</threshold>\n            <left_val>0.7752001881599426</left_val>\n            <right_val>0.4990234971046448</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 6 -1.</_>\n                <_>7 0 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9009521976113319e-003</threshold>\n            <left_val>0.2428039014339447</left_val>\n            <right_val>0.5048090219497681</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 8 -1.</_>\n                <_>16 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0113082397729158</threshold>\n            <left_val>0.5734364986419678</left_val>\n            <right_val>0.4842376112937927</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 6 6 -1.</_>\n                <_>0 8 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0596132017672062</threshold>\n            <left_val>0.5029836297035217</left_val>\n            <right_val>0.2524977028369904</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 6 2 -1.</_>\n                <_>12 12 3 1 2.</_>\n                <_>9 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8624620754271746e-003</threshold>\n            <left_val>0.6073045134544373</left_val>\n            <right_val>0.4898459911346436</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 2 -1.</_>\n                <_>9 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4781449250876904e-003</threshold>\n            <left_val>0.5015289187431335</left_val>\n            <right_val>0.2220316976308823</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 6 2 2 -1.</_>\n                <_>12 6 1 1 2.</_>\n                <_>11 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7513240454718471e-003</threshold>\n            <left_val>0.6614428758621216</left_val>\n            <right_val>0.4933868944644928</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 2 -1.</_>\n                <_>7 9 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0401634201407433</threshold>\n            <left_val>0.5180878043174744</left_val>\n            <right_val>0.3741044998168945</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 6 2 2 -1.</_>\n                <_>12 6 1 1 2.</_>\n                <_>11 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4768949262797832e-004</threshold>\n            <left_val>0.4720416963100433</left_val>\n            <right_val>0.5818032026290894</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 12 8 -1.</_>\n                <_>7 4 4 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6551650371402502e-003</threshold>\n            <left_val>0.3805010914802551</left_val>\n            <right_val>0.5221335887908936</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 5 3 -1.</_>\n                <_>13 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7706279009580612e-003</threshold>\n            <left_val>0.2944166064262390</left_val>\n            <right_val>0.5231295228004456</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 3 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5122091434895992e-003</threshold>\n            <left_val>0.7346177101135254</left_val>\n            <right_val>0.4722816944122315</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 2 3 -1.</_>\n                <_>14 7 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8672042107209563e-004</threshold>\n            <left_val>0.5452876091003418</left_val>\n            <right_val>0.4242413043975830</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 1 3 -1.</_>\n                <_>5 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6019669864326715e-004</threshold>\n            <left_val>0.4398862123489380</left_val>\n            <right_val>0.5601285099983215</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 2 3 -1.</_>\n                <_>13 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4143769405782223e-003</threshold>\n            <left_val>0.4741686880588532</left_val>\n            <right_val>0.6136621832847595</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 2 3 -1.</_>\n                <_>5 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5680900542065501e-003</threshold>\n            <left_val>0.6044552922248840</left_val>\n            <right_val>0.4516409933567047</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 3 -1.</_>\n                <_>9 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6827491130679846e-003</threshold>\n            <left_val>0.2452459037303925</left_val>\n            <right_val>0.5294982194900513</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 2 2 -1.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9409190756268799e-004</threshold>\n            <left_val>0.3732838034629822</left_val>\n            <right_val>0.5251451134681702</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 4 -1.</_>\n                <_>15 16 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2847759323194623e-004</threshold>\n            <left_val>0.5498809814453125</left_val>\n            <right_val>0.4065535068511963</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 2 -1.</_>\n                <_>3 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8817070201039314e-003</threshold>\n            <left_val>0.2139908969402313</left_val>\n            <right_val>0.4999957084655762</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 15 2 2 -1.</_>\n                <_>13 15 1 1 2.</_>\n                <_>12 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7272020815871656e-004</threshold>\n            <left_val>0.4650287032127380</left_val>\n            <right_val>0.5813428759574890</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 2 -1.</_>\n                <_>9 14 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0947199664078653e-004</threshold>\n            <left_val>0.4387486875057221</left_val>\n            <right_val>0.5572792887687683</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 14 9 -1.</_>\n                <_>4 14 14 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0485011897981167</threshold>\n            <left_val>0.5244972705841065</left_val>\n            <right_val>0.3212889134883881</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 4 3 -1.</_>\n                <_>7 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5166411437094212e-003</threshold>\n            <left_val>0.6056813001632690</left_val>\n            <right_val>0.4545882046222687</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 4 -1.</_>\n                <_>15 16 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0122916800901294</threshold>\n            <left_val>0.2040929049253464</left_val>\n            <right_val>0.5152214169502258</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 1 4 -1.</_>\n                <_>4 16 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8549679922871292e-004</threshold>\n            <left_val>0.5237604975700378</left_val>\n            <right_val>0.3739503026008606</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 13 -1.</_>\n                <_>16 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0305560491979122</threshold>\n            <left_val>0.4960533976554871</left_val>\n            <right_val>0.5938246250152588</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 2 12 -1.</_>\n                <_>4 1 1 6 2.</_>\n                <_>5 7 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5105320198927075e-004</threshold>\n            <left_val>0.5351303815841675</left_val>\n            <right_val>0.4145204126834869</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 14 6 6 -1.</_>\n                <_>14 14 3 3 2.</_>\n                <_>11 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4937440175563097e-003</threshold>\n            <left_val>0.4693366885185242</left_val>\n            <right_val>0.5514941215515137</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 6 6 -1.</_>\n                <_>3 14 3 3 2.</_>\n                <_>6 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0123821301385760</threshold>\n            <left_val>0.6791396737098694</left_val>\n            <right_val>0.4681667983531952</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 17 3 2 -1.</_>\n                <_>14 18 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1333461888134480e-003</threshold>\n            <left_val>0.3608739078044891</left_val>\n            <right_val>0.5229160189628601</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 17 3 2 -1.</_>\n                <_>3 18 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1919277757406235e-004</threshold>\n            <left_val>0.5300073027610779</left_val>\n            <right_val>0.3633613884449005</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 13 -1.</_>\n                <_>16 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1506042033433914</threshold>\n            <left_val>0.5157316923141480</left_val>\n            <right_val>0.2211782038211823</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 13 -1.</_>\n                <_>2 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7144149690866470e-003</threshold>\n            <left_val>0.4410496950149536</left_val>\n            <right_val>0.5776609182357788</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 7 6 -1.</_>\n                <_>10 12 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4443522393703461e-003</threshold>\n            <left_val>0.5401855111122131</left_val>\n            <right_val>0.3756650090217590</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 2 2 -1.</_>\n                <_>6 15 1 1 2.</_>\n                <_>7 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5006249779835343e-004</threshold>\n            <left_val>0.4368270933628082</left_val>\n            <right_val>0.5607374906539917</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 6 -1.</_>\n                <_>10 11 4 3 2.</_>\n                <_>6 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3077150583267212e-003</threshold>\n            <left_val>0.4244799017906189</left_val>\n            <right_val>0.5518230795860291</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 2 2 -1.</_>\n                <_>7 6 1 1 2.</_>\n                <_>8 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4048910755664110e-004</threshold>\n            <left_val>0.4496962130069733</left_val>\n            <right_val>0.5900576710700989</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 16 6 -1.</_>\n                <_>10 2 8 3 2.</_>\n                <_>2 5 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0440920516848564</threshold>\n            <left_val>0.5293493270874023</left_val>\n            <right_val>0.3156355023384094</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3639909233897924e-003</threshold>\n            <left_val>0.4483296871185303</left_val>\n            <right_val>0.5848662257194519</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 7 3 10 -1.</_>\n                <_>11 12 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9760079234838486e-003</threshold>\n            <left_val>0.4559507071971893</left_val>\n            <right_val>0.5483639240264893</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 3 10 -1.</_>\n                <_>6 12 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7716930489987135e-003</threshold>\n            <left_val>0.5341786146163940</left_val>\n            <right_val>0.3792484104633331</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4123019829858094e-004</threshold>\n            <left_val>0.5667188763618469</left_val>\n            <right_val>0.4576973021030426</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9425667384639382e-004</threshold>\n            <left_val>0.4421244859695435</left_val>\n            <right_val>0.5628787279129028</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 1 3 -1.</_>\n                <_>10 2 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8876468897797167e-004</threshold>\n            <left_val>0.4288370907306671</left_val>\n            <right_val>0.5391063094139099</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 4 18 -1.</_>\n                <_>1 2 2 9 2.</_>\n                <_>3 11 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0500488989055157</threshold>\n            <left_val>0.6899513006210327</left_val>\n            <right_val>0.4703742861747742</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 4 12 -1.</_>\n                <_>12 10 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0366354808211327</threshold>\n            <left_val>0.2217779010534287</left_val>\n            <right_val>0.5191826224327087</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 1 6 -1.</_>\n                <_>0 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4273579474538565e-003</threshold>\n            <left_val>0.5136224031448364</left_val>\n            <right_val>0.3497397899627686</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9558030180633068e-003</threshold>\n            <left_val>0.4826192855834961</left_val>\n            <right_val>0.6408380866050720</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 4 3 -1.</_>\n                <_>8 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7494610510766506e-003</threshold>\n            <left_val>0.3922835886478424</left_val>\n            <right_val>0.5272685289382935</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0139550799503922</threshold>\n            <left_val>0.5078201889991760</left_val>\n            <right_val>0.8416504859924316</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 2 -1.</_>\n                <_>8 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1896739781368524e-004</threshold>\n            <left_val>0.5520489811897278</left_val>\n            <right_val>0.4314234852790833</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 1 -1.</_>\n                <_>11 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5131309628486633e-003</threshold>\n            <left_val>0.3934605121612549</left_val>\n            <right_val>0.5382571220397949</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 3 -1.</_>\n                <_>9 7 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3622800149023533e-003</threshold>\n            <left_val>0.7370628714561462</left_val>\n            <right_val>0.4736475944519043</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 8 6 -1.</_>\n                <_>16 7 4 3 2.</_>\n                <_>12 10 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0651605874300003</threshold>\n            <left_val>0.5159279704093933</left_val>\n            <right_val>0.3281595110893250</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 8 6 -1.</_>\n                <_>0 7 4 3 2.</_>\n                <_>4 10 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3567399475723505e-003</threshold>\n            <left_val>0.3672826886177063</left_val>\n            <right_val>0.5172886252403259</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 2 2 10 -1.</_>\n                <_>19 2 1 5 2.</_>\n                <_>18 7 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0151466596871614</threshold>\n            <left_val>0.5031493902206421</left_val>\n            <right_val>0.6687604188919067</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 4 -1.</_>\n                <_>3 2 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0228509604930878</threshold>\n            <left_val>0.6767519712448120</left_val>\n            <right_val>0.4709596931934357</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 1 -1.</_>\n                <_>11 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8867650330066681e-003</threshold>\n            <left_val>0.5257998108863831</left_val>\n            <right_val>0.4059878885746002</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 2 -1.</_>\n                <_>7 15 1 1 2.</_>\n                <_>8 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7619599821045995e-003</threshold>\n            <left_val>0.4696272909641266</left_val>\n            <right_val>0.6688278913497925</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 13 1 6 -1.</_>\n                <_>11 16 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2942519970238209e-003</threshold>\n            <left_val>0.4320712983608246</left_val>\n            <right_val>0.5344281792640686</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 1 6 -1.</_>\n                <_>8 16 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0109299495816231</threshold>\n            <left_val>0.4997706115245819</left_val>\n            <right_val>0.1637486070394516</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 2 1 -1.</_>\n                <_>14 3 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9958489903947338e-005</threshold>\n            <left_val>0.4282417893409729</left_val>\n            <right_val>0.5633224248886108</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 2 3 -1.</_>\n                <_>8 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5884361974895000e-003</threshold>\n            <left_val>0.6772121191024780</left_val>\n            <right_val>0.4700526893138886</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 15 7 4 -1.</_>\n                <_>12 17 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2527779694646597e-003</threshold>\n            <left_val>0.5313397049903870</left_val>\n            <right_val>0.4536148905754089</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 12 3 -1.</_>\n                <_>4 15 12 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0435739792883396e-003</threshold>\n            <left_val>0.5660061836242676</left_val>\n            <right_val>0.4413388967514038</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 3 2 -1.</_>\n                <_>11 3 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2523540062829852e-003</threshold>\n            <left_val>0.3731913864612579</left_val>\n            <right_val>0.5356451869010925</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 2 -1.</_>\n                <_>4 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9246719602961093e-004</threshold>\n            <left_val>0.5189986228942871</left_val>\n            <right_val>0.3738811016082764</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 4 6 -1.</_>\n                <_>10 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0385896712541580</threshold>\n            <left_val>0.2956373989582062</left_val>\n            <right_val>0.5188810825347900</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 2 2 -1.</_>\n                <_>7 13 1 1 2.</_>\n                <_>8 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5489870565943420e-004</threshold>\n            <left_val>0.4347135126590729</left_val>\n            <right_val>0.5509533286094666</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 14 4 -1.</_>\n                <_>11 11 7 2 2.</_>\n                <_>4 13 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0337638482451439</threshold>\n            <left_val>0.3230330049991608</left_val>\n            <right_val>0.5195475816726685</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 18 2 -1.</_>\n                <_>7 18 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2657067105174065e-003</threshold>\n            <left_val>0.5975489020347595</left_val>\n            <right_val>0.4552114009857178</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 18 2 2 -1.</_>\n                <_>12 18 1 1 2.</_>\n                <_>11 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4481440302915871e-005</threshold>\n            <left_val>0.4745678007602692</left_val>\n            <right_val>0.5497426986694336</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 18 2 2 -1.</_>\n                <_>7 18 1 1 2.</_>\n                <_>8 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4951299817766994e-005</threshold>\n            <left_val>0.4324473142623901</left_val>\n            <right_val>0.5480644106864929</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 18 8 2 -1.</_>\n                <_>12 19 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0187417995184660</threshold>\n            <left_val>0.1580052971839905</left_val>\n            <right_val>0.5178533196449280</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 2 -1.</_>\n                <_>7 15 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7572239739820361e-003</threshold>\n            <left_val>0.4517636895179749</left_val>\n            <right_val>0.5773764252662659</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 8 -1.</_>\n                <_>10 12 2 4 2.</_>\n                <_>8 16 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1391119118779898e-003</threshold>\n            <left_val>0.4149647951126099</left_val>\n            <right_val>0.5460842251777649</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 3 3 -1.</_>\n                <_>4 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6656779381446540e-005</threshold>\n            <left_val>0.4039090871810913</left_val>\n            <right_val>0.5293084979057312</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 6 2 -1.</_>\n                <_>9 10 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7743421532213688e-003</threshold>\n            <left_val>0.4767651855945587</left_val>\n            <right_val>0.6121956110000610</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 4 15 -1.</_>\n                <_>7 0 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3868161998689175e-003</threshold>\n            <left_val>0.3586258888244629</left_val>\n            <right_val>0.5187280774116516</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 12 14 -1.</_>\n                <_>12 6 4 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0140409301966429</threshold>\n            <left_val>0.4712139964103699</left_val>\n            <right_val>0.5576155781745911</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 16 3 3 -1.</_>\n                <_>5 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5258329957723618e-003</threshold>\n            <left_val>0.2661027014255524</left_val>\n            <right_val>0.5039281249046326</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 12 19 -1.</_>\n                <_>12 1 4 19 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.3868423998355866</threshold>\n            <left_val>0.5144339799880981</left_val>\n            <right_val>0.2525899112224579</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 3 2 -1.</_>\n                <_>3 1 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1459240340627730e-004</threshold>\n            <left_val>0.4284994900226593</left_val>\n            <right_val>0.5423371195793152</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 4 5 -1.</_>\n                <_>10 12 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0184675697237253</threshold>\n            <left_val>0.3885835111141205</left_val>\n            <right_val>0.5213062167167664</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 4 5 -1.</_>\n                <_>8 12 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5907011372037232e-004</threshold>\n            <left_val>0.5412563085556030</left_val>\n            <right_val>0.4235909879207611</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2527540093287826e-003</threshold>\n            <left_val>0.4899305105209351</left_val>\n            <right_val>0.6624091267585754</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4910609461367130e-003</threshold>\n            <left_val>0.5286778211593628</left_val>\n            <right_val>0.4040051996707916</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5435562757775187e-004</threshold>\n            <left_val>0.6032990217208862</left_val>\n            <right_val>0.4795120060443878</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 4 10 -1.</_>\n                <_>7 11 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9478838704526424e-003</threshold>\n            <left_val>0.4084401130676270</left_val>\n            <right_val>0.5373504161834717</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8092920547351241e-004</threshold>\n            <left_val>0.4846062958240509</left_val>\n            <right_val>0.5759382247924805</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 5 2 -1.</_>\n                <_>2 14 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6073717577382922e-004</threshold>\n            <left_val>0.5164741277694702</left_val>\n            <right_val>0.3554979860782623</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6883929967880249e-004</threshold>\n            <left_val>0.5677582025527954</left_val>\n            <right_val>0.4731765985488892</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 2 -1.</_>\n                <_>7 11 1 1 2.</_>\n                <_>8 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1599370520561934e-003</threshold>\n            <left_val>0.4731487035751343</left_val>\n            <right_val>0.7070567011833191</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 13 3 3 -1.</_>\n                <_>14 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6235301308333874e-003</threshold>\n            <left_val>0.5240243077278137</left_val>\n            <right_val>0.2781791985034943</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 3 3 -1.</_>\n                <_>3 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0243991427123547e-003</threshold>\n            <left_val>0.2837013900279999</left_val>\n            <right_val>0.5062304139137268</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.7611639648675919e-003</threshold>\n            <left_val>0.7400717735290527</left_val>\n            <right_val>0.4934569001197815</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>8 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1515100747346878e-003</threshold>\n            <left_val>0.5119131207466126</left_val>\n            <right_val>0.3407008051872253</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 3 3 -1.</_>\n                <_>13 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2465080991387367e-003</threshold>\n            <left_val>0.4923788011074066</left_val>\n            <right_val>0.6579058766365051</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 5 3 -1.</_>\n                <_>0 10 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.0597478188574314e-003</threshold>\n            <left_val>0.2434711009263992</left_val>\n            <right_val>0.5032842159271240</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 3 3 -1.</_>\n                <_>13 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0587709732353687e-003</threshold>\n            <left_val>0.5900310873985291</left_val>\n            <right_val>0.4695087075233460</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 8 -1.</_>\n                <_>9 12 1 4 2.</_>\n                <_>10 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4146060459315777e-003</threshold>\n            <left_val>0.3647317886352539</left_val>\n            <right_val>0.5189201831817627</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 7 2 2 -1.</_>\n                <_>12 7 1 1 2.</_>\n                <_>11 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4817609917372465e-003</threshold>\n            <left_val>0.6034948229789734</left_val>\n            <right_val>0.4940128028392792</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 16 6 4 -1.</_>\n                <_>3 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3016400672495365e-003</threshold>\n            <left_val>0.5818989872932434</left_val>\n            <right_val>0.4560427963733673</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 2 3 -1.</_>\n                <_>10 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4763428848236799e-003</threshold>\n            <left_val>0.5217475891113281</left_val>\n            <right_val>0.3483993113040924</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>9 7 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0222508702427149</threshold>\n            <left_val>0.2360700070858002</left_val>\n            <right_val>0.5032082796096802</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 15 8 4 -1.</_>\n                <_>12 15 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0306125506758690</threshold>\n            <left_val>0.6499186754226685</left_val>\n            <right_val>0.4914919137954712</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 8 6 -1.</_>\n                <_>4 14 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130574796348810</threshold>\n            <left_val>0.4413323104381561</left_val>\n            <right_val>0.5683764219284058</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 3 2 -1.</_>\n                <_>10 0 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0095742810517550e-004</threshold>\n            <left_val>0.4359731078147888</left_val>\n            <right_val>0.5333483219146729</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 15 4 2 -1.</_>\n                <_>6 15 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1514250915497541e-004</threshold>\n            <left_val>0.5504062771797180</left_val>\n            <right_val>0.4326060116291046</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 13 -1.</_>\n                <_>13 7 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0137762902304530</threshold>\n            <left_val>0.4064112901687622</left_val>\n            <right_val>0.5201548933982849</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 3 13 -1.</_>\n                <_>6 7 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0322965085506439</threshold>\n            <left_val>0.0473519712686539</left_val>\n            <right_val>0.4977194964885712</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 3 9 -1.</_>\n                <_>9 9 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0535569787025452</threshold>\n            <left_val>0.4881733059883118</left_val>\n            <right_val>0.6666939258575440</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 7 12 -1.</_>\n                <_>4 10 7 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1889545544981956e-003</threshold>\n            <left_val>0.5400037169456482</left_val>\n            <right_val>0.4240820109844208</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 12 2 2 -1.</_>\n                <_>13 12 1 1 2.</_>\n                <_>12 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1055320394225419e-004</threshold>\n            <left_val>0.4802047908306122</left_val>\n            <right_val>0.5563852787017822</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 2 2 -1.</_>\n                <_>6 12 1 1 2.</_>\n                <_>7 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4382730480283499e-003</threshold>\n            <left_val>0.7387793064117432</left_val>\n            <right_val>0.4773685038089752</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 4 2 -1.</_>\n                <_>10 9 2 1 2.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2835570164024830e-003</threshold>\n            <left_val>0.5288546085357666</left_val>\n            <right_val>0.3171291947364807</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 2 2 -1.</_>\n                <_>3 6 1 1 2.</_>\n                <_>4 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3729570675641298e-003</threshold>\n            <left_val>0.4750812947750092</left_val>\n            <right_val>0.7060170769691467</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 6 3 2 -1.</_>\n                <_>16 7 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4541699783876538e-003</threshold>\n            <left_val>0.3811730146408081</left_val>\n            <right_val>0.5330739021301270</right_val></_></_></trees>\n      <stage_threshold>79.2490768432617190</stage_threshold>\n      <parent>16</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 18 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 19 4 -1.</_>\n                <_>0 9 19 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0557552389800549</threshold>\n            <left_val>0.4019156992435455</left_val>\n            <right_val>0.6806036829948425</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 10 1 -1.</_>\n                <_>10 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4730248842388391e-003</threshold>\n            <left_val>0.3351148962974548</left_val>\n            <right_val>0.5965719819068909</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 12 -1.</_>\n                <_>9 10 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5031698644161224e-004</threshold>\n            <left_val>0.5557708144187927</left_val>\n            <right_val>0.3482286930084229</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 18 4 1 -1.</_>\n                <_>12 18 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4167630150914192e-004</threshold>\n            <left_val>0.4260858893394470</left_val>\n            <right_val>0.5693380832672119</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 6 4 -1.</_>\n                <_>1 7 3 2 2.</_>\n                <_>4 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7193678589537740e-004</threshold>\n            <left_val>0.3494240045547485</left_val>\n            <right_val>0.5433688759803772</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 6 13 -1.</_>\n                <_>14 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5999219613149762e-003</threshold>\n            <left_val>0.4028499126434326</left_val>\n            <right_val>0.5484359264373779</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 6 13 -1.</_>\n                <_>4 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1832080053864047e-004</threshold>\n            <left_val>0.3806901872158051</left_val>\n            <right_val>0.5425465106964111</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 8 8 -1.</_>\n                <_>10 9 8 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2909031142480671e-004</threshold>\n            <left_val>0.2620100080966950</left_val>\n            <right_val>0.5429521799087524</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 2 5 -1.</_>\n                <_>9 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9518108931370080e-004</threshold>\n            <left_val>0.3799768984317780</left_val>\n            <right_val>0.5399264097213745</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 9 1 -1.</_>\n                <_>11 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0466710389591753e-005</threshold>\n            <left_val>0.4433645009994507</left_val>\n            <right_val>0.5440226197242737</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 9 1 -1.</_>\n                <_>6 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5007190086180344e-005</threshold>\n            <left_val>0.3719654977321625</left_val>\n            <right_val>0.5409119725227356</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 10 -1.</_>\n                <_>7 0 6 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1393561065196991</threshold>\n            <left_val>0.5525395870208740</left_val>\n            <right_val>0.4479042887687683</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 5 3 -1.</_>\n                <_>7 18 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6461990308016539e-003</threshold>\n            <left_val>0.4264501035213471</left_val>\n            <right_val>0.5772169828414917</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 6 1 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9984431825578213e-004</threshold>\n            <left_val>0.4359526038169861</left_val>\n            <right_val>0.5685871243476868</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 3 2 -1.</_>\n                <_>2 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0971280280500650e-003</threshold>\n            <left_val>0.3390136957168579</left_val>\n            <right_val>0.5205408930778503</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6919892560690641e-004</threshold>\n            <left_val>0.4557456076145172</left_val>\n            <right_val>0.5980659723281860</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 6 -1.</_>\n                <_>6 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6471042595803738e-004</threshold>\n            <left_val>0.5134841203689575</left_val>\n            <right_val>0.2944033145904541</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 2 4 -1.</_>\n                <_>11 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7182599296793342e-004</threshold>\n            <left_val>0.3906578123569489</left_val>\n            <right_val>0.5377181172370911</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 2 4 -1.</_>\n                <_>8 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0249499104684219e-005</threshold>\n            <left_val>0.3679609894752502</left_val>\n            <right_val>0.5225688815116882</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 4 -1.</_>\n                <_>9 6 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5225896909832954e-003</threshold>\n            <left_val>0.7293102145195007</left_val>\n            <right_val>0.4892365038394928</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 13 8 3 -1.</_>\n                <_>6 14 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6705560265108943e-003</threshold>\n            <left_val>0.4345324933528900</left_val>\n            <right_val>0.5696138143539429</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 3 4 -1.</_>\n                <_>10 15 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1433838456869125e-003</threshold>\n            <left_val>0.2591280043125153</left_val>\n            <right_val>0.5225623846054077</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 2 17 -1.</_>\n                <_>10 2 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0163193698972464</threshold>\n            <left_val>0.6922279000282288</left_val>\n            <right_val>0.4651575982570648</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 1 -1.</_>\n                <_>9 0 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8034260980784893e-003</threshold>\n            <left_val>0.5352262854576111</left_val>\n            <right_val>0.3286302983760834</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 3 4 -1.</_>\n                <_>9 15 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5421929359436035e-003</threshold>\n            <left_val>0.2040544003248215</left_val>\n            <right_val>0.5034546256065369</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 7 3 -1.</_>\n                <_>7 14 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0143631100654602</threshold>\n            <left_val>0.6804888844490051</left_val>\n            <right_val>0.4889059066772461</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 3 3 -1.</_>\n                <_>9 16 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9063588529825211e-004</threshold>\n            <left_val>0.5310695767402649</left_val>\n            <right_val>0.3895480930805206</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 2 8 10 -1.</_>\n                <_>6 7 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4060191139578819e-003</threshold>\n            <left_val>0.5741562843322754</left_val>\n            <right_val>0.4372426867485046</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 8 8 -1.</_>\n                <_>2 9 8 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8862540309783071e-004</threshold>\n            <left_val>0.2831785976886749</left_val>\n            <right_val>0.5098205208778381</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 16 2 2 -1.</_>\n                <_>14 17 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7979281041771173e-003</threshold>\n            <left_val>0.3372507989406586</left_val>\n            <right_val>0.5246580243110657</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 16 2 2 -1.</_>\n                <_>4 17 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4627049677073956e-004</threshold>\n            <left_val>0.5306674242019653</left_val>\n            <right_val>0.3911710083484650</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 4 6 -1.</_>\n                <_>10 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9164638767251745e-005</threshold>\n            <left_val>0.5462496280670166</left_val>\n            <right_val>0.3942720890045166</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 4 6 -1.</_>\n                <_>6 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0335825011134148</threshold>\n            <left_val>0.2157824039459229</left_val>\n            <right_val>0.5048211812973023</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5339309833943844e-003</threshold>\n            <left_val>0.6465312242507935</left_val>\n            <right_val>0.4872696995735169</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0144111737608910e-003</threshold>\n            <left_val>0.4617668092250824</left_val>\n            <right_val>0.6248074769973755</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 4 6 -1.</_>\n                <_>12 0 2 3 2.</_>\n                <_>10 3 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0188173707574606</threshold>\n            <left_val>0.5220689177513123</left_val>\n            <right_val>0.2000052034854889</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 20 2 -1.</_>\n                <_>0 4 20 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3434339780360460e-003</threshold>\n            <left_val>0.4014537930488586</left_val>\n            <right_val>0.5301619768142700</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 8 2 -1.</_>\n                <_>16 0 4 1 2.</_>\n                <_>12 1 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7557960236445069e-003</threshold>\n            <left_val>0.4794039130210877</left_val>\n            <right_val>0.5653169751167297</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 10 8 -1.</_>\n                <_>2 16 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0956374630331993</threshold>\n            <left_val>0.2034195065498352</left_val>\n            <right_val>0.5006706714630127</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 7 2 10 -1.</_>\n                <_>18 7 1 5 2.</_>\n                <_>17 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0222412291914225</threshold>\n            <left_val>0.7672473192214966</left_val>\n            <right_val>0.5046340227127075</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 2 10 -1.</_>\n                <_>1 7 1 5 2.</_>\n                <_>2 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0155758196488023</threshold>\n            <left_val>0.7490342259407044</left_val>\n            <right_val>0.4755851030349731</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 10 3 6 -1.</_>\n                <_>15 12 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3599118255078793e-003</threshold>\n            <left_val>0.5365303754806519</left_val>\n            <right_val>0.4004670977592468</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 6 2 -1.</_>\n                <_>6 4 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0217634998261929</threshold>\n            <left_val>0.0740154981613159</left_val>\n            <right_val>0.4964174926280975</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 20 6 -1.</_>\n                <_>0 7 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1656159013509750</threshold>\n            <left_val>0.2859103083610535</left_val>\n            <right_val>0.5218086242675781</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 8 2 -1.</_>\n                <_>0 0 4 1 2.</_>\n                <_>4 1 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6461320046801120e-004</threshold>\n            <left_val>0.4191615879535675</left_val>\n            <right_val>0.5380793213844299</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9077502489089966e-003</threshold>\n            <left_val>0.6273192763328552</left_val>\n            <right_val>0.4877404868602753</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 13 6 2 -1.</_>\n                <_>1 14 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6346449097618461e-004</threshold>\n            <left_val>0.5159940719604492</left_val>\n            <right_val>0.3671025931835175</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 4 -1.</_>\n                <_>11 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3751760125160217e-003</threshold>\n            <left_val>0.5884376764297485</left_val>\n            <right_val>0.4579083919525147</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 6 1 -1.</_>\n                <_>8 1 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4081239933148026e-003</threshold>\n            <left_val>0.3560509979724884</left_val>\n            <right_val>0.5139945149421692</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9342888630926609e-003</threshold>\n            <left_val>0.5994288921356201</left_val>\n            <right_val>0.4664272069931030</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 6 18 2 -1.</_>\n                <_>10 6 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0319669283926487</threshold>\n            <left_val>0.3345462083816528</left_val>\n            <right_val>0.5144183039665222</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 2 -1.</_>\n                <_>15 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5089280168467667e-005</threshold>\n            <left_val>0.5582656264305115</left_val>\n            <right_val>0.4414057135581970</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 1 2 -1.</_>\n                <_>6 6 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1994470413774252e-004</threshold>\n            <left_val>0.4623680114746094</left_val>\n            <right_val>0.6168993711471558</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 3 -1.</_>\n                <_>13 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4220460802316666e-003</threshold>\n            <left_val>0.6557074785232544</left_val>\n            <right_val>0.4974805116653442</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 1 2 -1.</_>\n                <_>2 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7723299970384687e-004</threshold>\n            <left_val>0.5269501805305481</left_val>\n            <right_val>0.3901908099651337</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 4 3 -1.</_>\n                <_>12 5 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5716759953647852e-003</threshold>\n            <left_val>0.4633373022079468</left_val>\n            <right_val>0.5790457725524902</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 7 3 -1.</_>\n                <_>0 1 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9041329920291901e-003</threshold>\n            <left_val>0.2689608037471771</left_val>\n            <right_val>0.5053591132164002</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 6 2 -1.</_>\n                <_>9 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0677518700249493e-004</threshold>\n            <left_val>0.5456603169441223</left_val>\n            <right_val>0.4329898953437805</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 2 3 -1.</_>\n                <_>5 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7604780197143555e-003</threshold>\n            <left_val>0.4648993909358978</left_val>\n            <right_val>0.6689761877059937</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 3 -1.</_>\n                <_>18 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9100088868290186e-003</threshold>\n            <left_val>0.5309703946113586</left_val>\n            <right_val>0.3377839922904968</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 8 6 -1.</_>\n                <_>3 2 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3885459629818797e-003</threshold>\n            <left_val>0.4074738919734955</left_val>\n            <right_val>0.5349133014678955</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 6 -1.</_>\n                <_>10 2 10 3 2.</_>\n                <_>0 5 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0767642632126808</threshold>\n            <left_val>0.1992176026105881</left_val>\n            <right_val>0.5228242278099060</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 2 4 -1.</_>\n                <_>5 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2688310127705336e-004</threshold>\n            <left_val>0.5438501834869385</left_val>\n            <right_val>0.4253072142601013</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 10 15 2 -1.</_>\n                <_>8 10 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3094152137637138e-003</threshold>\n            <left_val>0.4259178936481476</left_val>\n            <right_val>0.5378909707069397</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 12 11 -1.</_>\n                <_>9 0 6 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1100727990269661</threshold>\n            <left_val>0.6904156804084778</left_val>\n            <right_val>0.4721749126911163</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 2 6 -1.</_>\n                <_>13 0 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8619659133255482e-004</threshold>\n            <left_val>0.4524914920330048</left_val>\n            <right_val>0.5548306107521057</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 19 2 1 -1.</_>\n                <_>1 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9425329557852820e-005</threshold>\n            <left_val>0.5370373725891113</left_val>\n            <right_val>0.4236463904380798</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 10 4 10 -1.</_>\n                <_>18 10 2 5 2.</_>\n                <_>16 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0248865708708763</threshold>\n            <left_val>0.6423557996749878</left_val>\n            <right_val>0.4969303905963898</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 10 3 -1.</_>\n                <_>4 9 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0331488512456417</threshold>\n            <left_val>0.4988475143909454</left_val>\n            <right_val>0.1613811999559403</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 3 3 -1.</_>\n                <_>14 13 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8491691965609789e-004</threshold>\n            <left_val>0.5416026115417481</left_val>\n            <right_val>0.4223009049892426</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 4 10 -1.</_>\n                <_>0 10 2 5 2.</_>\n                <_>2 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7087189741432667e-003</threshold>\n            <left_val>0.4576328992843628</left_val>\n            <right_val>0.6027557849884033</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 6 -1.</_>\n                <_>18 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4144479539245367e-003</threshold>\n            <left_val>0.5308973193168640</left_val>\n            <right_val>0.4422498941421509</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 3 -1.</_>\n                <_>6 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9523180089890957e-003</threshold>\n            <left_val>0.4705634117126465</left_val>\n            <right_val>0.6663324832916260</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 7 2 -1.</_>\n                <_>7 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3031980488449335e-003</threshold>\n            <left_val>0.4406126141548157</left_val>\n            <right_val>0.5526962280273438</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 6 -1.</_>\n                <_>0 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4735497795045376e-003</threshold>\n            <left_val>0.5129023790359497</left_val>\n            <right_val>0.3301498889923096</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 1 3 1 -1.</_>\n                <_>12 1 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6652868837118149e-003</threshold>\n            <left_val>0.3135471045970917</left_val>\n            <right_val>0.5175036191940308</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 2 6 -1.</_>\n                <_>6 0 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3666770246345550e-004</threshold>\n            <left_val>0.4119370877742767</left_val>\n            <right_val>0.5306876897811890</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 14 -1.</_>\n                <_>7 1 6 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0171264503151178</threshold>\n            <left_val>0.6177806258201599</left_val>\n            <right_val>0.4836578965187073</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 8 3 -1.</_>\n                <_>8 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6601430727168918e-004</threshold>\n            <left_val>0.3654330968856812</left_val>\n            <right_val>0.5169736742973328</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 6 2 -1.</_>\n                <_>9 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0229323804378510</threshold>\n            <left_val>0.3490915000438690</left_val>\n            <right_val>0.5163992047309876</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 6 2 -1.</_>\n                <_>8 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3316550068557262e-003</threshold>\n            <left_val>0.5166299939155579</left_val>\n            <right_val>0.3709389865398407</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 5 -1.</_>\n                <_>11 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0169256608933210</threshold>\n            <left_val>0.5014736056327820</left_val>\n            <right_val>0.8053988218307495</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 5 -1.</_>\n                <_>8 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9858826249837875e-003</threshold>\n            <left_val>0.6470788717269898</left_val>\n            <right_val>0.4657020866870880</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 10 -1.</_>\n                <_>14 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0118746999651194</threshold>\n            <left_val>0.3246378898620606</left_val>\n            <right_val>0.5258755087852478</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 2 -1.</_>\n                <_>4 12 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9350569345988333e-004</threshold>\n            <left_val>0.5191941857337952</left_val>\n            <right_val>0.3839643895626068</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>18 3 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8713490143418312e-003</threshold>\n            <left_val>0.4918133914470673</left_val>\n            <right_val>0.6187043190002441</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 18 10 -1.</_>\n                <_>1 13 18 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2483879029750824</threshold>\n            <left_val>0.1836802959442139</left_val>\n            <right_val>0.4988150000572205</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 10 -1.</_>\n                <_>14 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0122560001909733</threshold>\n            <left_val>0.5227053761482239</left_val>\n            <right_val>0.3632029891014099</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3990179700776935e-004</threshold>\n            <left_val>0.4490250051021576</left_val>\n            <right_val>0.5774148106575012</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5407369248569012e-003</threshold>\n            <left_val>0.4804787039756775</left_val>\n            <right_val>0.5858299136161804</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 3 10 -1.</_>\n                <_>5 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0148224299773574</threshold>\n            <left_val>0.2521049976348877</left_val>\n            <right_val>0.5023537278175354</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7973959483206272e-003</threshold>\n            <left_val>0.5996695756912231</left_val>\n            <right_val>0.4853715002536774</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 1 2 -1.</_>\n                <_>0 10 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2662148158997297e-004</threshold>\n            <left_val>0.5153716802597046</left_val>\n            <right_val>0.3671779930591583</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 10 -1.</_>\n                <_>18 1 1 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0172325801104307</threshold>\n            <left_val>0.6621719002723694</left_val>\n            <right_val>0.4994656145572662</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 2 10 -1.</_>\n                <_>1 1 1 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8624086454510689e-003</threshold>\n            <left_val>0.4633395075798035</left_val>\n            <right_val>0.6256101727485657</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7343620099127293e-003</threshold>\n            <left_val>0.3615573048591614</left_val>\n            <right_val>0.5281885266304016</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 3 3 -1.</_>\n                <_>3 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3048478700220585e-004</threshold>\n            <left_val>0.4442889094352722</left_val>\n            <right_val>0.5550957918167114</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 2 6 -1.</_>\n                <_>12 0 1 3 2.</_>\n                <_>11 3 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6602199114859104e-003</threshold>\n            <left_val>0.5162935256958008</left_val>\n            <right_val>0.2613354921340942</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 2 6 -1.</_>\n                <_>7 0 1 3 2.</_>\n                <_>8 3 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1048377752304077e-003</threshold>\n            <left_val>0.2789632081985474</left_val>\n            <right_val>0.5019031763076782</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8512578941881657e-003</threshold>\n            <left_val>0.4968984127044678</left_val>\n            <right_val>0.5661668181419373</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 3 7 -1.</_>\n                <_>2 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9896453320980072e-004</threshold>\n            <left_val>0.4445607960224152</left_val>\n            <right_val>0.5551813244819641</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 6 16 -1.</_>\n                <_>16 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2702363133430481</threshold>\n            <left_val>0.0293882098048925</left_val>\n            <right_val>0.5151314139366150</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 6 16 -1.</_>\n                <_>2 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0130906803533435</threshold>\n            <left_val>0.5699399709701538</left_val>\n            <right_val>0.4447459876537323</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 16 8 -1.</_>\n                <_>10 0 8 4 2.</_>\n                <_>2 4 8 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4342790544033051e-003</threshold>\n            <left_val>0.4305466115474701</left_val>\n            <right_val>0.5487895011901856</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 5 3 -1.</_>\n                <_>6 9 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5482039889320731e-003</threshold>\n            <left_val>0.3680317103862763</left_val>\n            <right_val>0.5128080844879150</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3746132180094719e-003</threshold>\n            <left_val>0.4838916957378388</left_val>\n            <right_val>0.6101555824279785</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 3 -1.</_>\n                <_>8 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5786769799888134e-003</threshold>\n            <left_val>0.5325223207473755</left_val>\n            <right_val>0.4118548035621643</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 4 -1.</_>\n                <_>9 6 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6856050137430429e-003</threshold>\n            <left_val>0.4810948073863983</left_val>\n            <right_val>0.6252303123474121</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 15 1 -1.</_>\n                <_>5 7 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3887019902467728e-003</threshold>\n            <left_val>0.5200229883193970</left_val>\n            <right_val>0.3629410862922669</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 7 9 -1.</_>\n                <_>8 5 7 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127926301211119</threshold>\n            <left_val>0.4961709976196289</left_val>\n            <right_val>0.6738016009330750</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 16 4 -1.</_>\n                <_>1 7 8 2 2.</_>\n                <_>9 9 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3661040943115950e-003</threshold>\n            <left_val>0.4060279130935669</left_val>\n            <right_val>0.5283598899841309</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 8 2 -1.</_>\n                <_>6 13 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9771420415490866e-004</threshold>\n            <left_val>0.4674113988876343</left_val>\n            <right_val>0.5900775194168091</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 3 3 -1.</_>\n                <_>8 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4868030557408929e-003</threshold>\n            <left_val>0.4519116878509522</left_val>\n            <right_val>0.6082053780555725</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 14 10 -1.</_>\n                <_>11 5 7 5 2.</_>\n                <_>4 10 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0886867493391037</threshold>\n            <left_val>0.2807899117469788</left_val>\n            <right_val>0.5180991888046265</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 3 2 -1.</_>\n                <_>4 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4296112870797515e-005</threshold>\n            <left_val>0.5295584201812744</left_val>\n            <right_val>0.4087625145912170</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4932939848222304e-005</threshold>\n            <left_val>0.5461400151252747</left_val>\n            <right_val>0.4538542926311493</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 7 6 -1.</_>\n                <_>4 11 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9162238612771034e-003</threshold>\n            <left_val>0.5329161286354065</left_val>\n            <right_val>0.4192134141921997</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 6 3 -1.</_>\n                <_>7 11 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1141640134155750e-003</threshold>\n            <left_val>0.4512017965316773</left_val>\n            <right_val>0.5706217288970947</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 2 -1.</_>\n                <_>9 12 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9249362645205110e-005</threshold>\n            <left_val>0.4577805995941162</left_val>\n            <right_val>0.5897638201713562</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 20 6 -1.</_>\n                <_>0 7 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5319510605186224e-003</threshold>\n            <left_val>0.5299603939056397</left_val>\n            <right_val>0.3357639014720917</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 6 1 -1.</_>\n                <_>8 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0124262003228068</threshold>\n            <left_val>0.4959059059619904</left_val>\n            <right_val>0.1346601992845535</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0283357501029968</threshold>\n            <left_val>0.5117079019546509</left_val>\n            <right_val>6.1043637106195092e-004</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6165882162749767e-003</threshold>\n            <left_val>0.4736349880695343</left_val>\n            <right_val>0.7011628150939941</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0468766391277313e-003</threshold>\n            <left_val>0.5216417908668518</left_val>\n            <right_val>0.3282819986343384</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1193980462849140e-003</threshold>\n            <left_val>0.5809860825538635</left_val>\n            <right_val>0.4563739001750946</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 16 8 -1.</_>\n                <_>2 16 16 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0132775902748108</threshold>\n            <left_val>0.5398362278938294</left_val>\n            <right_val>0.4103901088237763</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 15 2 -1.</_>\n                <_>0 16 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8794739996083081e-004</threshold>\n            <left_val>0.4249286055564880</left_val>\n            <right_val>0.5410590767860413</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 4 5 6 -1.</_>\n                <_>15 6 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0112431701272726</threshold>\n            <left_val>0.5269963741302490</left_val>\n            <right_val>0.3438215851783752</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 4 -1.</_>\n                <_>10 5 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9896668214350939e-004</threshold>\n            <left_val>0.5633075833320618</left_val>\n            <right_val>0.4456613063812256</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 9 6 -1.</_>\n                <_>8 12 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6677159629762173e-003</threshold>\n            <left_val>0.5312889218330383</left_val>\n            <right_val>0.4362679123878479</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 19 15 1 -1.</_>\n                <_>7 19 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0289472993463278</threshold>\n            <left_val>0.4701794981956482</left_val>\n            <right_val>0.6575797796249390</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0234000496566296</threshold>\n            <left_val>0.</left_val>\n            <right_val>0.5137398838996887</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 20 4 -1.</_>\n                <_>0 17 20 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0891170501708984</threshold>\n            <left_val>0.0237452797591686</left_val>\n            <right_val>0.4942430853843689</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0140546001493931</threshold>\n            <left_val>0.3127323091030121</left_val>\n            <right_val>0.5117511153221130</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 3 4 -1.</_>\n                <_>8 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1239398568868637e-003</threshold>\n            <left_val>0.5009049177169800</left_val>\n            <right_val>0.2520025968551636</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 3 -1.</_>\n                <_>9 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9964650534093380e-003</threshold>\n            <left_val>0.6387143731117249</left_val>\n            <right_val>0.4927811920642853</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 6 -1.</_>\n                <_>8 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1253970228135586e-003</threshold>\n            <left_val>0.5136849880218506</left_val>\n            <right_val>0.3680452108383179</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 12 -1.</_>\n                <_>9 10 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7669642157852650e-003</threshold>\n            <left_val>0.5509843826293945</left_val>\n            <right_val>0.4363631904125214</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 4 3 -1.</_>\n                <_>8 18 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3711440153419971e-003</threshold>\n            <left_val>0.6162335276603699</left_val>\n            <right_val>0.4586946964263916</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 18 8 2 -1.</_>\n                <_>13 18 4 1 2.</_>\n                <_>9 19 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3522791713476181e-003</threshold>\n            <left_val>0.6185457706451416</left_val>\n            <right_val>0.4920490980148315</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 8 2 -1.</_>\n                <_>1 19 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0159688591957092</threshold>\n            <left_val>0.1382617950439453</left_val>\n            <right_val>0.4983252882957459</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 6 15 -1.</_>\n                <_>15 5 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7676060348749161e-003</threshold>\n            <left_val>0.4688057899475098</left_val>\n            <right_val>0.5490046143531799</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 2 -1.</_>\n                <_>9 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4714691098779440e-003</threshold>\n            <left_val>0.2368514984846115</left_val>\n            <right_val>0.5003952980041504</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 3 -1.</_>\n                <_>9 5 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1033788844943047e-004</threshold>\n            <left_val>0.5856394171714783</left_val>\n            <right_val>0.4721533060073853</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 6 15 -1.</_>\n                <_>3 5 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1411755979061127</threshold>\n            <left_val>0.0869000628590584</left_val>\n            <right_val>0.4961591064929962</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 14 8 -1.</_>\n                <_>11 1 7 4 2.</_>\n                <_>4 5 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1065180972218514</threshold>\n            <left_val>0.5138837099075317</left_val>\n            <right_val>0.1741005033254623</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 4 4 16 -1.</_>\n                <_>2 4 2 8 2.</_>\n                <_>4 12 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0527447499334812</threshold>\n            <left_val>0.7353636026382446</left_val>\n            <right_val>0.4772881865501404</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 12 -1.</_>\n                <_>12 10 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7431760467588902e-003</threshold>\n            <left_val>0.3884406089782715</left_val>\n            <right_val>0.5292701721191406</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 10 12 -1.</_>\n                <_>4 5 5 6 2.</_>\n                <_>9 11 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9676765967160463e-004</threshold>\n            <left_val>0.5223492980003357</left_val>\n            <right_val>0.4003424048423767</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0284131690859795e-003</threshold>\n            <left_val>0.4959106147289276</left_val>\n            <right_val>0.7212964296340942</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 2 3 -1.</_>\n                <_>5 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6025858763605356e-004</threshold>\n            <left_val>0.4444884061813355</left_val>\n            <right_val>0.5538476109504700</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 4 10 -1.</_>\n                <_>14 2 2 5 2.</_>\n                <_>12 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3191501218825579e-004</threshold>\n            <left_val>0.5398371219635010</left_val>\n            <right_val>0.4163244068622589</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 7 3 -1.</_>\n                <_>6 5 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5082060601562262e-003</threshold>\n            <left_val>0.5854265093803406</left_val>\n            <right_val>0.4562500119209290</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 18 2 -1.</_>\n                <_>11 0 9 1 2.</_>\n                <_>2 1 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1378761157393456e-003</threshold>\n            <left_val>0.4608069062232971</left_val>\n            <right_val>0.5280259251594544</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 18 2 -1.</_>\n                <_>0 0 9 1 2.</_>\n                <_>9 1 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1546049974858761e-003</threshold>\n            <left_val>0.3791126906871796</left_val>\n            <right_val>0.5255997180938721</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 4 6 -1.</_>\n                <_>15 13 2 3 2.</_>\n                <_>13 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.6214009895920753e-003</threshold>\n            <left_val>0.5998609066009522</left_val>\n            <right_val>0.4952073991298676</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 4 6 -1.</_>\n                <_>3 13 2 3 2.</_>\n                <_>5 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2055360022932291e-003</threshold>\n            <left_val>0.4484206140041351</left_val>\n            <right_val>0.5588530898094177</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 2 6 -1.</_>\n                <_>10 15 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2586950324475765e-003</threshold>\n            <left_val>0.5450747013092041</left_val>\n            <right_val>0.4423840939998627</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 10 10 -1.</_>\n                <_>5 9 5 5 2.</_>\n                <_>10 14 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0926720723509789e-003</threshold>\n            <left_val>0.4118275046348572</left_val>\n            <right_val>0.5263035893440247</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5095739401876926e-003</threshold>\n            <left_val>0.5787907838821411</left_val>\n            <right_val>0.4998494982719421</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 8 -1.</_>\n                <_>10 12 3 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0773275569081306</threshold>\n            <left_val>0.8397865891456604</left_val>\n            <right_val>0.4811120033264160</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 4 10 -1.</_>\n                <_>14 2 2 5 2.</_>\n                <_>12 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0414858199656010</threshold>\n            <left_val>0.2408611029386520</left_val>\n            <right_val>0.5176993012428284</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 2 1 -1.</_>\n                <_>9 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0355669655837119e-004</threshold>\n            <left_val>0.4355360865592957</left_val>\n            <right_val>0.5417054295539856</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 1 12 -1.</_>\n                <_>10 9 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3255809899419546e-003</threshold>\n            <left_val>0.5453971028327942</left_val>\n            <right_val>0.4894095063209534</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 11 6 9 -1.</_>\n                <_>3 11 3 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0598732456564903e-003</threshold>\n            <left_val>0.5771024227142334</left_val>\n            <right_val>0.4577918946743012</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 4 10 -1.</_>\n                <_>14 2 2 5 2.</_>\n                <_>12 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0190586205571890</threshold>\n            <left_val>0.5169867873191834</left_val>\n            <right_val>0.3400475084781647</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 4 10 -1.</_>\n                <_>4 2 2 5 2.</_>\n                <_>6 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0350578911602497</threshold>\n            <left_val>0.2203243970870972</left_val>\n            <right_val>0.5000503063201904</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7296059094369411e-003</threshold>\n            <left_val>0.5043408274650574</left_val>\n            <right_val>0.6597570776939392</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 6 3 -1.</_>\n                <_>0 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116483299061656</threshold>\n            <left_val>0.2186284959316254</left_val>\n            <right_val>0.4996652901172638</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4544479781761765e-003</threshold>\n            <left_val>0.5007681846618652</left_val>\n            <right_val>0.5503727793693543</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 3 2 -1.</_>\n                <_>7 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5030909455381334e-004</threshold>\n            <left_val>0.4129841029644013</left_val>\n            <right_val>0.5241670012474060</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2907272735610604e-004</threshold>\n            <left_val>0.5412868261337280</left_val>\n            <right_val>0.4974496066570282</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 4 2 -1.</_>\n                <_>5 4 2 1 2.</_>\n                <_>7 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0862209601327777e-003</threshold>\n            <left_val>0.4605529904365540</left_val>\n            <right_val>0.5879228711128235</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 2 12 -1.</_>\n                <_>14 0 1 6 2.</_>\n                <_>13 6 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0000500080641359e-004</threshold>\n            <left_val>0.5278854966163635</left_val>\n            <right_val>0.4705209136009216</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 10 -1.</_>\n                <_>7 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9212920926511288e-003</threshold>\n            <left_val>0.5129609704017639</left_val>\n            <right_val>0.3755536973476410</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 17 8 -1.</_>\n                <_>3 4 17 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0253874007612467</threshold>\n            <left_val>0.4822691977024078</left_val>\n            <right_val>0.5790768265724182</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 20 4 -1.</_>\n                <_>0 6 20 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1968469265848398e-003</threshold>\n            <left_val>0.5248395204544067</left_val>\n            <right_val>0.3962840139865875</right_val></_></_></trees>\n      <stage_threshold>87.6960296630859380</stage_threshold>\n      <parent>17</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 19 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 8 2 -1.</_>\n                <_>4 3 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8031738735735416e-003</threshold>\n            <left_val>0.3498983979225159</left_val>\n            <right_val>0.5961983203887940</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0003069490194321e-003</threshold>\n            <left_val>0.6816636919975281</left_val>\n            <right_val>0.4478552043437958</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 6 4 -1.</_>\n                <_>5 7 3 2 2.</_>\n                <_>8 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1549659539014101e-003</threshold>\n            <left_val>0.5585706233978272</left_val>\n            <right_val>0.3578251004219055</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 4 9 -1.</_>\n                <_>8 6 4 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1069850297644734e-003</threshold>\n            <left_val>0.5365036129951477</left_val>\n            <right_val>0.3050428032875061</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 1 4 -1.</_>\n                <_>8 17 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0308309720130637e-004</threshold>\n            <left_val>0.3639095127582550</left_val>\n            <right_val>0.5344635844230652</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 7 -1.</_>\n                <_>8 5 4 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0984839908778667e-003</threshold>\n            <left_val>0.2859157025814056</left_val>\n            <right_val>0.5504264831542969</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 4 10 -1.</_>\n                <_>4 2 2 5 2.</_>\n                <_>6 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2572200335562229e-004</threshold>\n            <left_val>0.5236523747444153</left_val>\n            <right_val>0.3476041853427887</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 17 2 -1.</_>\n                <_>3 1 17 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9783325567841530e-003</threshold>\n            <left_val>0.4750322103500366</left_val>\n            <right_val>0.6219646930694580</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 16 15 -1.</_>\n                <_>2 7 16 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0374025292694569</threshold>\n            <left_val>0.3343375921249390</left_val>\n            <right_val>0.5278062820434570</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 5 2 -1.</_>\n                <_>15 3 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8548257909715176e-003</threshold>\n            <left_val>0.5192180871963501</left_val>\n            <right_val>0.3700444102287293</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 2 -1.</_>\n                <_>10 3 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8664470408111811e-003</threshold>\n            <left_val>0.2929843962192535</left_val>\n            <right_val>0.5091944932937622</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 16 15 -1.</_>\n                <_>4 10 16 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0168888904154301</threshold>\n            <left_val>0.3686845898628235</left_val>\n            <right_val>0.5431225895881653</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 5 6 -1.</_>\n                <_>7 16 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8372621424496174e-003</threshold>\n            <left_val>0.3632183969020844</left_val>\n            <right_val>0.5221335887908936</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4713739510625601e-003</threshold>\n            <left_val>0.5870683789253235</left_val>\n            <right_val>0.4700650870800018</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 3 1 -1.</_>\n                <_>9 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1522950371727347e-003</threshold>\n            <left_val>0.3195894956588745</left_val>\n            <right_val>0.5140954256057739</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 3 -1.</_>\n                <_>9 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2560300789773464e-003</threshold>\n            <left_val>0.6301859021186829</left_val>\n            <right_val>0.4814921021461487</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 5 2 -1.</_>\n                <_>0 3 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7378291860222816e-003</threshold>\n            <left_val>0.1977048069238663</left_val>\n            <right_val>0.5025808215141296</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0113826701417565</threshold>\n            <left_val>0.4954132139682770</left_val>\n            <right_val>0.6867045760154724</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 12 1 -1.</_>\n                <_>5 7 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1794708706438541e-003</threshold>\n            <left_val>0.5164427757263184</left_val>\n            <right_val>0.3350647985935211</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 14 -1.</_>\n                <_>7 12 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1174378991127014</threshold>\n            <left_val>0.2315246015787125</left_val>\n            <right_val>0.5234413743019104</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 8 10 -1.</_>\n                <_>0 0 4 5 2.</_>\n                <_>4 5 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0287034492939711</threshold>\n            <left_val>0.4664297103881836</left_val>\n            <right_val>0.6722521185874939</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 3 2 -1.</_>\n                <_>10 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8231030814349651e-003</threshold>\n            <left_val>0.5220875144004822</left_val>\n            <right_val>0.2723532915115356</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 3 2 -1.</_>\n                <_>9 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6798530016094446e-003</threshold>\n            <left_val>0.5079277157783508</left_val>\n            <right_val>0.2906948924064636</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0504082143306732e-003</threshold>\n            <left_val>0.4885950982570648</left_val>\n            <right_val>0.6395021080970764</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 6 16 -1.</_>\n                <_>7 12 6 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8054959625005722e-003</threshold>\n            <left_val>0.5197256803512573</left_val>\n            <right_val>0.3656663894653320</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2420159075409174e-003</threshold>\n            <left_val>0.6153467893600464</left_val>\n            <right_val>0.4763701856136322</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 2 6 -1.</_>\n                <_>2 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0137577103450894</threshold>\n            <left_val>0.2637344896793366</left_val>\n            <right_val>0.5030903220176697</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 9 -1.</_>\n                <_>14 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1033829972147942</threshold>\n            <left_val>0.2287521958351135</left_val>\n            <right_val>0.5182461142539978</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4432085752487183e-003</threshold>\n            <left_val>0.6953303813934326</left_val>\n            <right_val>0.4694949090480804</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0271181650459766e-004</threshold>\n            <left_val>0.5450655221939087</left_val>\n            <right_val>0.4268783926963806</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1945669800043106e-003</threshold>\n            <left_val>0.6091387867927551</left_val>\n            <right_val>0.4571642875671387</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 6 -1.</_>\n                <_>13 13 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0109422104433179</threshold>\n            <left_val>0.5241063237190247</left_val>\n            <right_val>0.3284547030925751</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 2 6 -1.</_>\n                <_>3 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7841069065034389e-004</threshold>\n            <left_val>0.5387929081916809</left_val>\n            <right_val>0.4179368913173676</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 2 -1.</_>\n                <_>14 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0888620056211948e-003</threshold>\n            <left_val>0.4292691051959992</left_val>\n            <right_val>0.5301715731620789</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 16 2 -1.</_>\n                <_>0 9 16 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2383969519287348e-003</threshold>\n            <left_val>0.3792347908020020</left_val>\n            <right_val>0.5220744013786316</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 2 -1.</_>\n                <_>14 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9075027927756310e-003</threshold>\n            <left_val>0.5237283110618591</left_val>\n            <right_val>0.4126757979393005</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 5 6 -1.</_>\n                <_>0 2 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0322779417037964</threshold>\n            <left_val>0.1947655975818634</left_val>\n            <right_val>0.4994502067565918</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9711230248212814e-003</threshold>\n            <left_val>0.6011285185813904</left_val>\n            <right_val>0.4929032027721405</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 6 -1.</_>\n                <_>4 13 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0153210898861289</threshold>\n            <left_val>0.5009753704071045</left_val>\n            <right_val>0.2039822041988373</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0855569746345282e-003</threshold>\n            <left_val>0.4862189888954163</left_val>\n            <right_val>0.5721694827079773</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 1 3 -1.</_>\n                <_>9 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0615021027624607e-003</threshold>\n            <left_val>0.5000218749046326</left_val>\n            <right_val>0.1801805943250656</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7174751050770283e-003</threshold>\n            <left_val>0.5530117154121399</left_val>\n            <right_val>0.4897592961788178</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 12 -1.</_>\n                <_>6 12 8 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0121705001220107</threshold>\n            <left_val>0.4178605973720551</left_val>\n            <right_val>0.5383723974227905</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6248398721218109e-003</threshold>\n            <left_val>0.4997169971466065</left_val>\n            <right_val>0.5761327147483826</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 9 2 -1.</_>\n                <_>8 12 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1040429419372231e-004</threshold>\n            <left_val>0.5331807136535645</left_val>\n            <right_val>0.4097681045532227</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146417804062366</threshold>\n            <left_val>0.5755925178527832</left_val>\n            <right_val>0.5051776170730591</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 4 3 -1.</_>\n                <_>4 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3199489116668701e-003</threshold>\n            <left_val>0.4576976895332336</left_val>\n            <right_val>0.6031805872917175</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 9 2 -1.</_>\n                <_>9 6 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.7236879579722881e-003</threshold>\n            <left_val>0.4380396902561188</left_val>\n            <right_val>0.5415883064270020</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 1 3 -1.</_>\n                <_>4 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2951161311939359e-004</threshold>\n            <left_val>0.5163031816482544</left_val>\n            <right_val>0.3702219128608704</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 6 6 -1.</_>\n                <_>14 12 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0114084901288152</threshold>\n            <left_val>0.6072946786880493</left_val>\n            <right_val>0.4862565100193024</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 7 -1.</_>\n                <_>8 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5320121571421623e-003</threshold>\n            <left_val>0.3292475938796997</left_val>\n            <right_val>0.5088962912559509</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 3 3 -1.</_>\n                <_>10 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1276017911732197e-003</threshold>\n            <left_val>0.4829767942428589</left_val>\n            <right_val>0.6122708916664124</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 3 -1.</_>\n                <_>9 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8583158105611801e-003</threshold>\n            <left_val>0.4660679996013641</left_val>\n            <right_val>0.6556177139282227</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 11 3 -1.</_>\n                <_>5 11 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0369859188795090</threshold>\n            <left_val>0.5204849243164063</left_val>\n            <right_val>0.1690472066402435</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 1 -1.</_>\n                <_>10 7 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6491161920130253e-003</threshold>\n            <left_val>0.5167322158813477</left_val>\n            <right_val>0.3725225031375885</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 2 -1.</_>\n                <_>10 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2664702050387859e-003</threshold>\n            <left_val>0.6406493186950684</left_val>\n            <right_val>0.4987342953681946</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>9 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7956590424291790e-004</threshold>\n            <left_val>0.5897293090820313</left_val>\n            <right_val>0.4464873969554901</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 9 4 2 -1.</_>\n                <_>11 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6827160511165857e-003</threshold>\n            <left_val>0.5441560745239258</left_val>\n            <right_val>0.3472662866115570</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 4 2 -1.</_>\n                <_>7 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0100598800927401</threshold>\n            <left_val>0.2143162935972214</left_val>\n            <right_val>0.5004829764366150</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 2 4 -1.</_>\n                <_>14 12 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0361840617842972e-004</threshold>\n            <left_val>0.5386424064636231</left_val>\n            <right_val>0.4590323865413666</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 2 -1.</_>\n                <_>8 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4545479789376259e-003</threshold>\n            <left_val>0.5751184225082398</left_val>\n            <right_val>0.4497095048427582</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 17 6 3 -1.</_>\n                <_>14 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6515209572389722e-003</threshold>\n            <left_val>0.5421937704086304</left_val>\n            <right_val>0.4238520860671997</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 12 -1.</_>\n                <_>4 5 6 6 2.</_>\n                <_>10 11 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8468639403581619e-003</threshold>\n            <left_val>0.4077920913696289</left_val>\n            <right_val>0.5258157253265381</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 8 -1.</_>\n                <_>10 9 4 4 2.</_>\n                <_>6 13 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1259850151836872e-003</threshold>\n            <left_val>0.4229275882244110</left_val>\n            <right_val>0.5479453206062317</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 15 4 -1.</_>\n                <_>5 4 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0368909612298012</threshold>\n            <left_val>0.6596375703811646</left_val>\n            <right_val>0.4674678146839142</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 1 -1.</_>\n                <_>13 2 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4035639944486320e-004</threshold>\n            <left_val>0.4251135885715485</left_val>\n            <right_val>0.5573202967643738</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 2 -1.</_>\n                <_>4 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5150169929256663e-005</threshold>\n            <left_val>0.5259246826171875</left_val>\n            <right_val>0.4074114859104157</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2108471021056175e-003</threshold>\n            <left_val>0.4671722948551178</left_val>\n            <right_val>0.5886352062225342</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 3 -1.</_>\n                <_>9 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1568620102480054e-003</threshold>\n            <left_val>0.5711066126823425</left_val>\n            <right_val>0.4487161934375763</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 2 3 -1.</_>\n                <_>13 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9996292218565941e-003</threshold>\n            <left_val>0.5264198184013367</left_val>\n            <right_val>0.2898327112197876</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 4 4 -1.</_>\n                <_>7 12 2 2 2.</_>\n                <_>9 14 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4656189596280456e-003</threshold>\n            <left_val>0.3891738057136536</left_val>\n            <right_val>0.5197871923446655</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 2 2 -1.</_>\n                <_>11 11 1 1 2.</_>\n                <_>10 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1975039960816503e-003</threshold>\n            <left_val>0.5795872807502747</left_val>\n            <right_val>0.4927955865859985</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 2 -1.</_>\n                <_>9 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4954330660402775e-003</threshold>\n            <left_val>0.2377603054046631</left_val>\n            <right_val>0.5012555122375488</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 2 2 -1.</_>\n                <_>11 11 1 1 2.</_>\n                <_>10 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4997160178609192e-004</threshold>\n            <left_val>0.4876626133918762</left_val>\n            <right_val>0.5617607831954956</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 6 3 -1.</_>\n                <_>0 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6391509454697371e-003</threshold>\n            <left_val>0.5168088078498840</left_val>\n            <right_val>0.3765509128570557</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 2 2 -1.</_>\n                <_>11 11 1 1 2.</_>\n                <_>10 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9368131072260439e-004</threshold>\n            <left_val>0.5446649193763733</left_val>\n            <right_val>0.4874630868434906</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 2 2 -1.</_>\n                <_>8 11 1 1 2.</_>\n                <_>9 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4211760135367513e-003</threshold>\n            <left_val>0.4687897861003876</left_val>\n            <right_val>0.6691331863403320</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 8 4 -1.</_>\n                <_>12 5 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0794276371598244</threshold>\n            <left_val>0.5193443894386292</left_val>\n            <right_val>0.2732945978641510</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 8 4 -1.</_>\n                <_>4 5 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0799375027418137</threshold>\n            <left_val>0.4971731007099152</left_val>\n            <right_val>0.1782083958387375</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 1 -1.</_>\n                <_>13 2 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0110892597585917</threshold>\n            <left_val>0.5165994763374329</left_val>\n            <right_val>0.3209475874900818</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 4 1 -1.</_>\n                <_>5 2 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6560709627810866e-004</threshold>\n            <left_val>0.4058471918106079</left_val>\n            <right_val>0.5307276248931885</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 4 2 -1.</_>\n                <_>12 0 2 1 2.</_>\n                <_>10 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3354292176663876e-003</threshold>\n            <left_val>0.3445056974887848</left_val>\n            <right_val>0.5158129930496216</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 3 1 -1.</_>\n                <_>8 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1287260567769408e-003</threshold>\n            <left_val>0.4594863057136536</left_val>\n            <right_val>0.6075533032417297</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 8 -1.</_>\n                <_>10 11 2 4 2.</_>\n                <_>8 15 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0219692196696997</threshold>\n            <left_val>0.1680400967597961</left_val>\n            <right_val>0.5228595733642578</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1775320055894554e-004</threshold>\n            <left_val>0.3861596882343292</left_val>\n            <right_val>0.5215672850608826</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 18 15 2 -1.</_>\n                <_>3 19 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0200149447191507e-004</threshold>\n            <left_val>0.5517979264259338</left_val>\n            <right_val>0.4363039135932922</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 6 2 12 -1.</_>\n                <_>2 6 1 6 2.</_>\n                <_>3 12 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0217331498861313</threshold>\n            <left_val>0.7999460101127625</left_val>\n            <right_val>0.4789851009845734</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 3 -1.</_>\n                <_>9 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.4399932529777288e-004</threshold>\n            <left_val>0.4085975885391235</left_val>\n            <right_val>0.5374773144721985</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 3 2 -1.</_>\n                <_>8 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3895249837078154e-004</threshold>\n            <left_val>0.5470405220985413</left_val>\n            <right_val>0.4366143047809601</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 3 1 -1.</_>\n                <_>12 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5092400135472417e-003</threshold>\n            <left_val>0.4988996982574463</left_val>\n            <right_val>0.5842149257659912</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 3 1 -1.</_>\n                <_>7 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5547839943319559e-003</threshold>\n            <left_val>0.6753690242767334</left_val>\n            <right_val>0.4721005856990814</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 4 2 -1.</_>\n                <_>11 2 2 1 2.</_>\n                <_>9 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8191400128416717e-004</threshold>\n            <left_val>0.5415853857994080</left_val>\n            <right_val>0.4357109069824219</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 3 -1.</_>\n                <_>4 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0264398343861103e-003</threshold>\n            <left_val>0.2258509993553162</left_val>\n            <right_val>0.4991880953311920</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 18 3 -1.</_>\n                <_>8 1 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116681400686502</threshold>\n            <left_val>0.6256554722785950</left_val>\n            <right_val>0.4927498996257782</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 4 14 -1.</_>\n                <_>7 1 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8718370012938976e-003</threshold>\n            <left_val>0.3947784900665283</left_val>\n            <right_val>0.5245801806449890</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 12 3 -1.</_>\n                <_>8 16 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0170511696487665</threshold>\n            <left_val>0.4752511084079742</left_val>\n            <right_val>0.5794224143028259</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 17 18 3 -1.</_>\n                <_>7 17 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0133520802482963</threshold>\n            <left_val>0.6041104793548584</left_val>\n            <right_val>0.4544535875320435</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 6 -1.</_>\n                <_>9 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9301801007241011e-004</threshold>\n            <left_val>0.4258275926113129</left_val>\n            <right_val>0.5544905066490173</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 8 -1.</_>\n                <_>9 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0483349692076445e-003</threshold>\n            <left_val>0.5233420133590698</left_val>\n            <right_val>0.3780272901058197</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3579288758337498e-003</threshold>\n            <left_val>0.6371889114379883</left_val>\n            <right_val>0.4838674068450928</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 12 -1.</_>\n                <_>9 10 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6661018170416355e-003</threshold>\n            <left_val>0.5374705791473389</left_val>\n            <right_val>0.4163666069507599</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0677339206449687e-005</threshold>\n            <left_val>0.4638795852661133</left_val>\n            <right_val>0.5311625003814697</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 8 -1.</_>\n                <_>2 1 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0367381609976292</threshold>\n            <left_val>0.4688656032085419</left_val>\n            <right_val>0.6466524004936218</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 6 2 -1.</_>\n                <_>12 1 3 1 2.</_>\n                <_>9 2 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6528137326240540e-003</threshold>\n            <left_val>0.5204318761825562</left_val>\n            <right_val>0.2188657969236374</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 12 14 -1.</_>\n                <_>1 10 12 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1537135988473892</threshold>\n            <left_val>0.1630371958017349</left_val>\n            <right_val>0.4958840012550354</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>10 12 2 1 2.</_>\n                <_>8 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1560421232134104e-004</threshold>\n            <left_val>0.5774459242820740</left_val>\n            <right_val>0.4696458876132965</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 10 2 -1.</_>\n                <_>1 9 5 1 2.</_>\n                <_>6 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2640169588848948e-003</threshold>\n            <left_val>0.3977175951004028</left_val>\n            <right_val>0.5217198133468628</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5473341122269630e-003</threshold>\n            <left_val>0.6046528220176697</left_val>\n            <right_val>0.4808315038681030</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 8 3 -1.</_>\n                <_>6 9 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0019069527043030e-005</threshold>\n            <left_val>0.3996723890304565</left_val>\n            <right_val>0.5228201150894165</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 5 3 -1.</_>\n                <_>9 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3113019522279501e-003</threshold>\n            <left_val>0.4712158143520355</left_val>\n            <right_val>0.5765997767448425</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 4 3 -1.</_>\n                <_>8 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3374709524214268e-003</threshold>\n            <left_val>0.4109584987163544</left_val>\n            <right_val>0.5253170132637024</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 2 -1.</_>\n                <_>7 8 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0208767093718052</threshold>\n            <left_val>0.5202993750572205</left_val>\n            <right_val>0.1757981926202774</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>5 7 4 1 2.</_>\n                <_>9 8 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5497948564589024e-003</threshold>\n            <left_val>0.6566609740257263</left_val>\n            <right_val>0.4694975018501282</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0241885501891375</threshold>\n            <left_val>0.5128673911094666</left_val>\n            <right_val>0.3370220959186554</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 4 2 -1.</_>\n                <_>4 8 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9358828905969858e-003</threshold>\n            <left_val>0.6580786705017090</left_val>\n            <right_val>0.4694541096687317</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 9 -1.</_>\n                <_>14 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0575579293072224</threshold>\n            <left_val>0.5146445035934448</left_val>\n            <right_val>0.2775259912014008</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 3 3 -1.</_>\n                <_>5 9 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1343370424583554e-003</threshold>\n            <left_val>0.3836601972579956</left_val>\n            <right_val>0.5192667245864868</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0168169997632504</threshold>\n            <left_val>0.5085592865943909</left_val>\n            <right_val>0.6177260875701904</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 9 -1.</_>\n                <_>0 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0535178743302822e-003</threshold>\n            <left_val>0.5138763189315796</left_val>\n            <right_val>0.3684791922569275</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>18 3 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5874710194766521e-003</threshold>\n            <left_val>0.5989655256271362</left_val>\n            <right_val>0.4835202097892761</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 3 6 -1.</_>\n                <_>1 3 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6882460331544280e-003</threshold>\n            <left_val>0.4509486854076386</left_val>\n            <right_val>0.5723056793212891</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 14 1 2 -1.</_>\n                <_>17 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6554000321775675e-003</threshold>\n            <left_val>0.3496770858764648</left_val>\n            <right_val>0.5243319272994995</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 4 3 -1.</_>\n                <_>6 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0193738006055355</threshold>\n            <left_val>0.1120536997914314</left_val>\n            <right_val>0.4968712925910950</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0103744501248002</threshold>\n            <left_val>0.5148196816444397</left_val>\n            <right_val>0.4395213127136231</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 3 3 -1.</_>\n                <_>5 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4973050565458834e-004</threshold>\n            <left_val>0.4084999859333038</left_val>\n            <right_val>0.5269886851310730</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 8 -1.</_>\n                <_>12 5 3 4 2.</_>\n                <_>9 9 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0429819300770760</threshold>\n            <left_val>0.6394104957580566</left_val>\n            <right_val>0.5018504261970520</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 8 -1.</_>\n                <_>5 5 3 4 2.</_>\n                <_>8 9 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3065936341881752e-003</threshold>\n            <left_val>0.4707553982734680</left_val>\n            <right_val>0.6698353290557861</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 1 4 6 -1.</_>\n                <_>16 4 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1285790503025055e-003</threshold>\n            <left_val>0.4541369080543518</left_val>\n            <right_val>0.5323647260665894</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 6 20 -1.</_>\n                <_>3 0 2 20 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7399420030415058e-003</threshold>\n            <left_val>0.4333961904048920</left_val>\n            <right_val>0.5439866185188294</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 3 2 -1.</_>\n                <_>13 11 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1739750334527344e-004</threshold>\n            <left_val>0.4579687118530273</left_val>\n            <right_val>0.5543426275253296</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 3 2 -1.</_>\n                <_>6 11 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8585780344437808e-004</threshold>\n            <left_val>0.4324643909931183</left_val>\n            <right_val>0.5426754951477051</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 1 -1.</_>\n                <_>11 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5587692186236382e-003</threshold>\n            <left_val>0.5257220864295960</left_val>\n            <right_val>0.3550611138343811</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 8 3 -1.</_>\n                <_>4 0 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9851560294628143e-003</threshold>\n            <left_val>0.6043018102645874</left_val>\n            <right_val>0.4630635976791382</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 0 2 5 -1.</_>\n                <_>15 0 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0594122624024749e-004</threshold>\n            <left_val>0.4598254859447479</left_val>\n            <right_val>0.5533195137977600</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 3 2 -1.</_>\n                <_>5 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2983040253166109e-004</threshold>\n            <left_val>0.4130752086639404</left_val>\n            <right_val>0.5322461128234863</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 15 -1.</_>\n                <_>9 0 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3740210821852088e-004</threshold>\n            <left_val>0.4043039977550507</left_val>\n            <right_val>0.5409289002418518</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 3 1 -1.</_>\n                <_>7 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9482020181603730e-004</threshold>\n            <left_val>0.4494963884353638</left_val>\n            <right_val>0.5628852248191834</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 3 4 -1.</_>\n                <_>13 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0103126596659422</threshold>\n            <left_val>0.5177510976791382</left_val>\n            <right_val>0.2704316973686218</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 1 -1.</_>\n                <_>7 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7241109684109688e-003</threshold>\n            <left_val>0.1988019049167633</left_val>\n            <right_val>0.4980553984642029</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 2 -1.</_>\n                <_>12 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6797208487987518e-003</threshold>\n            <left_val>0.6644750237464905</left_val>\n            <right_val>0.5018296241760254</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 6 -1.</_>\n                <_>0 4 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0755459815263748e-003</threshold>\n            <left_val>0.3898304998874664</left_val>\n            <right_val>0.5185269117355347</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 2 -1.</_>\n                <_>12 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2479740437120199e-003</threshold>\n            <left_val>0.4801808893680573</left_val>\n            <right_val>0.5660336017608643</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 3 3 -1.</_>\n                <_>2 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3327008178457618e-004</threshold>\n            <left_val>0.5210919976234436</left_val>\n            <right_val>0.3957188129425049</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 8 6 10 -1.</_>\n                <_>16 8 3 5 2.</_>\n                <_>13 13 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0412793308496475</threshold>\n            <left_val>0.6154541969299316</left_val>\n            <right_val>0.5007054209709168</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 5 2 -1.</_>\n                <_>0 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0930189900100231e-004</threshold>\n            <left_val>0.3975942134857178</left_val>\n            <right_val>0.5228403806686401</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 2 2 -1.</_>\n                <_>13 11 1 1 2.</_>\n                <_>12 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2568780221045017e-003</threshold>\n            <left_val>0.4979138076305389</left_val>\n            <right_val>0.5939183235168457</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 3 3 -1.</_>\n                <_>3 16 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0048497766256332e-003</threshold>\n            <left_val>0.4984497129917145</left_val>\n            <right_val>0.1633366048336029</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 2 -1.</_>\n                <_>12 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1879300000146031e-003</threshold>\n            <left_val>0.5904964804649353</left_val>\n            <right_val>0.4942624866962433</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 3 2 -1.</_>\n                <_>5 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1948952497914433e-004</threshold>\n            <left_val>0.4199557900428772</left_val>\n            <right_val>0.5328726172447205</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 9 9 -1.</_>\n                <_>9 8 9 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6829859279096127e-003</threshold>\n            <left_val>0.5418602824211121</left_val>\n            <right_val>0.4905889034271240</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 3 7 -1.</_>\n                <_>6 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7062340416014194e-003</threshold>\n            <left_val>0.3725939095020294</left_val>\n            <right_val>0.5138000249862671</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 12 5 -1.</_>\n                <_>9 2 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0397394113242626</threshold>\n            <left_val>0.6478961110115051</left_val>\n            <right_val>0.5050346851348877</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 2 2 -1.</_>\n                <_>6 11 1 1 2.</_>\n                <_>7 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4085009461268783e-003</threshold>\n            <left_val>0.4682339131832123</left_val>\n            <right_val>0.6377884149551392</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 15 3 2 -1.</_>\n                <_>15 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9322688826359808e-004</threshold>\n            <left_val>0.5458530187606812</left_val>\n            <right_val>0.4150482118129730</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 3 2 -1.</_>\n                <_>2 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8979819724336267e-003</threshold>\n            <left_val>0.3690159916877747</left_val>\n            <right_val>0.5149704217910767</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 6 8 -1.</_>\n                <_>17 12 3 4 2.</_>\n                <_>14 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0139704402536154</threshold>\n            <left_val>0.6050562858581543</left_val>\n            <right_val>0.4811357855796814</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 15 6 -1.</_>\n                <_>7 8 5 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1010081991553307</threshold>\n            <left_val>0.2017080038785934</left_val>\n            <right_val>0.4992361962795258</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 18 17 -1.</_>\n                <_>8 2 6 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0173469204455614</threshold>\n            <left_val>0.5713148713111877</left_val>\n            <right_val>0.4899486005306244</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 4 1 -1.</_>\n                <_>7 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5619759506080300e-004</threshold>\n            <left_val>0.4215388894081116</left_val>\n            <right_val>0.5392642021179199</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 12 5 -1.</_>\n                <_>9 2 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1343892961740494</threshold>\n            <left_val>0.5136151909828186</left_val>\n            <right_val>0.3767612874507904</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 12 5 -1.</_>\n                <_>7 2 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0245822407305241</threshold>\n            <left_val>0.7027357816696167</left_val>\n            <right_val>0.4747906923294067</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 12 4 -1.</_>\n                <_>10 9 6 2 2.</_>\n                <_>4 11 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8553720805794001e-003</threshold>\n            <left_val>0.4317409098148346</left_val>\n            <right_val>0.5427716970443726</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 6 2 -1.</_>\n                <_>5 15 3 1 2.</_>\n                <_>8 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3165249731391668e-003</threshold>\n            <left_val>0.5942698717117310</left_val>\n            <right_val>0.4618647992610931</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 2 3 -1.</_>\n                <_>10 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8518120311200619e-003</threshold>\n            <left_val>0.6191568970680237</left_val>\n            <right_val>0.4884895086288452</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 2 -1.</_>\n                <_>0 13 10 1 2.</_>\n                <_>10 14 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4699938949197531e-003</threshold>\n            <left_val>0.5256664752960205</left_val>\n            <right_val>0.4017199873924255</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 12 8 -1.</_>\n                <_>10 9 6 4 2.</_>\n                <_>4 13 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0454969592392445</threshold>\n            <left_val>0.5237867832183838</left_val>\n            <right_val>0.2685773968696594</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 3 6 -1.</_>\n                <_>8 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0203195996582508</threshold>\n            <left_val>0.2130445986986160</left_val>\n            <right_val>0.4979738891124725</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 2 2 -1.</_>\n                <_>10 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6994998916052282e-004</threshold>\n            <left_val>0.4814041852951050</left_val>\n            <right_val>0.5543122291564941</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 2 -1.</_>\n                <_>9 12 1 1 2.</_>\n                <_>10 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8232699949294329e-003</threshold>\n            <left_val>0.6482579708099365</left_val>\n            <right_val>0.4709989130496979</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 14 4 -1.</_>\n                <_>11 11 7 2 2.</_>\n                <_>4 13 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3015790656208992e-003</threshold>\n            <left_val>0.4581927955150604</left_val>\n            <right_val>0.5306236147880554</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 4 2 -1.</_>\n                <_>8 6 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4139499873854220e-004</threshold>\n            <left_val>0.5232086777687073</left_val>\n            <right_val>0.4051763117313385</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 6 3 -1.</_>\n                <_>12 10 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0330369696021080e-003</threshold>\n            <left_val>0.5556201934814453</left_val>\n            <right_val>0.4789193868637085</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 14 1 2 -1.</_>\n                <_>2 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8041160365100950e-004</threshold>\n            <left_val>0.5229442715644836</left_val>\n            <right_val>0.4011810123920441</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 8 6 12 -1.</_>\n                <_>16 8 3 6 2.</_>\n                <_>13 14 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0614078603684902</threshold>\n            <left_val>0.6298682093620300</left_val>\n            <right_val>0.5010703206062317</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 6 12 -1.</_>\n                <_>1 8 3 6 2.</_>\n                <_>4 14 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0695439130067825</threshold>\n            <left_val>0.7228280901908875</left_val>\n            <right_val>0.4773184061050415</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 6 10 -1.</_>\n                <_>12 0 2 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0705426633358002</threshold>\n            <left_val>0.2269513010978699</left_val>\n            <right_val>0.5182529091835022</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 8 4 -1.</_>\n                <_>5 11 4 2 2.</_>\n                <_>9 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4423799477517605e-003</threshold>\n            <left_val>0.5237097144126892</left_val>\n            <right_val>0.4098151028156281</right_val></_></_>\n        <_>\n          <!-- tree 177 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 8 4 -1.</_>\n                <_>14 16 4 2 2.</_>\n                <_>10 18 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5494349645450711e-003</threshold>\n            <left_val>0.4773750901222229</left_val>\n            <right_val>0.5468043088912964</right_val></_></_>\n        <_>\n          <!-- tree 178 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 6 -1.</_>\n                <_>9 7 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0239142198115587</threshold>\n            <left_val>0.7146975994110107</left_val>\n            <right_val>0.4783824980258942</right_val></_></_>\n        <_>\n          <!-- tree 179 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 4 10 -1.</_>\n                <_>10 2 2 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0124536901712418</threshold>\n            <left_val>0.2635296881198883</left_val>\n            <right_val>0.5241122841835022</right_val></_></_>\n        <_>\n          <!-- tree 180 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 4 9 -1.</_>\n                <_>8 1 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0760179904755205e-004</threshold>\n            <left_val>0.3623757064342499</left_val>\n            <right_val>0.5113608837127686</right_val></_></_>\n        <_>\n          <!-- tree 181 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 19 2 1 -1.</_>\n                <_>12 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9781080229440704e-005</threshold>\n            <left_val>0.4705932140350342</left_val>\n            <right_val>0.5432801842689514</right_val></_></_></trees>\n      <stage_threshold>90.2533493041992190</stage_threshold>\n      <parent>18</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 20 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 4 9 -1.</_>\n                <_>3 2 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0117727499455214</threshold>\n            <left_val>0.3860518932342529</left_val>\n            <right_val>0.6421167254447937</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 4 -1.</_>\n                <_>9 5 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0270375702530146</threshold>\n            <left_val>0.4385654926300049</left_val>\n            <right_val>0.6754038929939270</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 4 -1.</_>\n                <_>9 6 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6419500247575343e-005</threshold>\n            <left_val>0.5487101078033447</left_val>\n            <right_val>0.3423315882682800</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 2 8 -1.</_>\n                <_>14 9 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9995409529656172e-003</threshold>\n            <left_val>0.3230532109737396</left_val>\n            <right_val>0.5400317907333374</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 5 12 -1.</_>\n                <_>7 12 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5278300531208515e-003</threshold>\n            <left_val>0.5091639757156372</left_val>\n            <right_val>0.2935043871402741</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 6 -1.</_>\n                <_>14 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7890920541249216e-004</threshold>\n            <left_val>0.4178153872489929</left_val>\n            <right_val>0.5344064235687256</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 2 6 -1.</_>\n                <_>4 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1720920447260141e-003</threshold>\n            <left_val>0.2899182140827179</left_val>\n            <right_val>0.5132070779800415</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 10 4 -1.</_>\n                <_>13 15 5 2 2.</_>\n                <_>8 17 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.5305702416226268e-004</threshold>\n            <left_val>0.4280124902725220</left_val>\n            <right_val>0.5560845136642456</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 18 2 2 -1.</_>\n                <_>7 18 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5099150004971307e-005</threshold>\n            <left_val>0.4044871926307678</left_val>\n            <right_val>0.5404760241508484</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 2 -1.</_>\n                <_>11 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0817901976406574e-004</threshold>\n            <left_val>0.4271768927574158</left_val>\n            <right_val>0.5503466129302979</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 16 6 -1.</_>\n                <_>2 2 16 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3224520739167929e-003</threshold>\n            <left_val>0.3962723910808563</left_val>\n            <right_val>0.5369734764099121</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 2 -1.</_>\n                <_>11 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1037490330636501e-003</threshold>\n            <left_val>0.4727177917957306</left_val>\n            <right_val>0.5237749814987183</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 10 3 -1.</_>\n                <_>4 12 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4350269921123981e-003</threshold>\n            <left_val>0.5603008270263672</left_val>\n            <right_val>0.4223509132862091</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 2 -1.</_>\n                <_>11 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0767399109899998e-003</threshold>\n            <left_val>0.5225917100906372</left_val>\n            <right_val>0.4732725918292999</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 3 6 2 -1.</_>\n                <_>3 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6412809782195836e-004</threshold>\n            <left_val>0.3999075889587402</left_val>\n            <right_val>0.5432739853858948</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 7 -1.</_>\n                <_>16 0 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.8302437216043472e-003</threshold>\n            <left_val>0.4678385853767395</left_val>\n            <right_val>0.6027327179908752</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 9 6 -1.</_>\n                <_>0 16 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0105520701035857</threshold>\n            <left_val>0.3493967056274414</left_val>\n            <right_val>0.5213974714279175</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 3 -1.</_>\n                <_>9 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2731600329279900e-003</threshold>\n            <left_val>0.6185818910598755</left_val>\n            <right_val>0.4749062955379486</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 6 2 -1.</_>\n                <_>6 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.4786332445219159e-004</threshold>\n            <left_val>0.5285341143608093</left_val>\n            <right_val>0.3843482136726379</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 3 -1.</_>\n                <_>15 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2081359745934606e-003</threshold>\n            <left_val>0.5360640883445740</left_val>\n            <right_val>0.3447335958480835</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6512730401009321e-003</threshold>\n            <left_val>0.4558292031288147</left_val>\n            <right_val>0.6193962097167969</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 2 2 -1.</_>\n                <_>10 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1012479662895203e-003</threshold>\n            <left_val>0.3680230081081390</left_val>\n            <right_val>0.5327628254890442</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 4 3 -1.</_>\n                <_>5 1 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9561518244445324e-004</threshold>\n            <left_val>0.3960595130920410</left_val>\n            <right_val>0.5274940729141235</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 7 -1.</_>\n                <_>16 0 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0439017713069916</threshold>\n            <left_val>0.7020444869995117</left_val>\n            <right_val>0.4992839097976685</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 20 1 -1.</_>\n                <_>10 0 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0346903502941132</threshold>\n            <left_val>0.5049164295196533</left_val>\n            <right_val>0.2766602933406830</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 3 -1.</_>\n                <_>15 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7442190330475569e-003</threshold>\n            <left_val>0.2672632932662964</left_val>\n            <right_val>0.5274971127510071</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 3 4 -1.</_>\n                <_>1 4 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3316588960587978e-003</threshold>\n            <left_val>0.4579482972621918</left_val>\n            <right_val>0.6001101732254028</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 6 -1.</_>\n                <_>16 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0200445707887411</threshold>\n            <left_val>0.3171594142913818</left_val>\n            <right_val>0.5235717892646790</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 3 6 -1.</_>\n                <_>1 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3492030557245016e-003</threshold>\n            <left_val>0.5265362858772278</left_val>\n            <right_val>0.4034324884414673</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 2 12 6 -1.</_>\n                <_>12 2 6 3 2.</_>\n                <_>6 5 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9702018946409225e-003</threshold>\n            <left_val>0.5332456827163696</left_val>\n            <right_val>0.4571984112262726</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 4 3 -1.</_>\n                <_>8 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3039981760084629e-003</threshold>\n            <left_val>0.4593310952186585</left_val>\n            <right_val>0.6034635901451111</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 14 6 -1.</_>\n                <_>11 2 7 3 2.</_>\n                <_>4 5 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0129365902394056</threshold>\n            <left_val>0.4437963962554932</left_val>\n            <right_val>0.5372971296310425</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0148729458451271e-003</threshold>\n            <left_val>0.4680323898792267</left_val>\n            <right_val>0.6437833905220032</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6401679497212172e-003</threshold>\n            <left_val>0.3709631860256195</left_val>\n            <right_val>0.5314332842826843</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0139184398576617</threshold>\n            <left_val>0.4723555147647858</left_val>\n            <right_val>0.7130808830261231</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 3 -1.</_>\n                <_>15 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5087869511917233e-004</threshold>\n            <left_val>0.4492394030094147</left_val>\n            <right_val>0.5370404124259949</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 5 2 -1.</_>\n                <_>7 14 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5384349282830954e-004</threshold>\n            <left_val>0.4406864047050476</left_val>\n            <right_val>0.5514402985572815</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 3 -1.</_>\n                <_>7 13 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2710000630468130e-003</threshold>\n            <left_val>0.4682416915893555</left_val>\n            <right_val>0.5967984199523926</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 4 4 -1.</_>\n                <_>5 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4120779708027840e-003</threshold>\n            <left_val>0.5079392194747925</left_val>\n            <right_val>0.3018598854541779</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 3 3 -1.</_>\n                <_>12 4 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6025670851813629e-005</threshold>\n            <left_val>0.5601037144660950</left_val>\n            <right_val>0.4471096992492676</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 3 3 -1.</_>\n                <_>7 4 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4905529618263245e-003</threshold>\n            <left_val>0.2207535058259964</left_val>\n            <right_val>0.4989944100379944</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 5 3 6 -1.</_>\n                <_>17 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0175131205469370</threshold>\n            <left_val>0.6531215906143189</left_val>\n            <right_val>0.5017648935317993</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 12 7 -1.</_>\n                <_>7 6 4 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1428163051605225</threshold>\n            <left_val>0.4967963099479675</left_val>\n            <right_val>0.1482062041759491</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 5 3 6 -1.</_>\n                <_>17 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5345268920063972e-003</threshold>\n            <left_val>0.4898946881294251</left_val>\n            <right_val>0.5954223871231079</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.6323591424152255e-004</threshold>\n            <left_val>0.3927116990089417</left_val>\n            <right_val>0.5196074247360230</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 5 3 6 -1.</_>\n                <_>17 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0370010752230883e-003</threshold>\n            <left_val>0.5613325238227844</left_val>\n            <right_val>0.4884858131408691</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 3 6 -1.</_>\n                <_>2 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6614829655736685e-003</threshold>\n            <left_val>0.4472880065441132</left_val>\n            <right_val>0.5578880906105042</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 1 -1.</_>\n                <_>7 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1188090797513723e-003</threshold>\n            <left_val>0.3840532898902893</left_val>\n            <right_val>0.5397477746009827</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 8 7 -1.</_>\n                <_>4 9 4 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4000617712736130e-003</threshold>\n            <left_val>0.5843983888626099</left_val>\n            <right_val>0.4533218145370483</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 8 2 -1.</_>\n                <_>12 12 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1319601112045348e-004</threshold>\n            <left_val>0.5439221858978272</left_val>\n            <right_val>0.4234727919101715</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 11 8 2 -1.</_>\n                <_>0 12 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0182220991700888</threshold>\n            <left_val>0.1288464963436127</left_val>\n            <right_val>0.4958404898643494</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 3 -1.</_>\n                <_>9 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7969247251749039e-003</threshold>\n            <left_val>0.4951297938823700</left_val>\n            <right_val>0.7153480052947998</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 12 4 -1.</_>\n                <_>4 10 6 2 2.</_>\n                <_>10 12 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2395070195198059e-003</threshold>\n            <left_val>0.3946599960327148</left_val>\n            <right_val>0.5194936990737915</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 3 7 -1.</_>\n                <_>10 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.7086271271109581e-003</threshold>\n            <left_val>0.4897503852844238</left_val>\n            <right_val>0.6064900159835815</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 3 5 -1.</_>\n                <_>8 2 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9934171363711357e-003</threshold>\n            <left_val>0.3245440125465393</left_val>\n            <right_val>0.5060828924179077</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 4 6 -1.</_>\n                <_>11 12 2 3 2.</_>\n                <_>9 15 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0167850591242313</threshold>\n            <left_val>0.1581953018903732</left_val>\n            <right_val>0.5203778743743897</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 6 -1.</_>\n                <_>9 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0182720907032490</threshold>\n            <left_val>0.4680935144424439</left_val>\n            <right_val>0.6626979112625122</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 4 4 2 -1.</_>\n                <_>15 5 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6872838176786900e-003</threshold>\n            <left_val>0.5211697816848755</left_val>\n            <right_val>0.3512184917926788</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0739039862528443e-003</threshold>\n            <left_val>0.5768386125564575</left_val>\n            <right_val>0.4529845118522644</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 4 -1.</_>\n                <_>14 4 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7093870341777802e-003</threshold>\n            <left_val>0.4507763087749481</left_val>\n            <right_val>0.5313581228256226</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 6 1 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1110709349159151e-004</threshold>\n            <left_val>0.5460820198059082</left_val>\n            <right_val>0.4333376884460449</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0670139454305172e-003</threshold>\n            <left_val>0.5371856093406677</left_val>\n            <right_val>0.4078390896320343</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 10 -1.</_>\n                <_>9 7 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5943021066486835e-003</threshold>\n            <left_val>0.4471287131309509</left_val>\n            <right_val>0.5643836259841919</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 6 -1.</_>\n                <_>11 12 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1776031032204628e-003</threshold>\n            <left_val>0.4499393105506897</left_val>\n            <right_val>0.5280330181121826</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 4 1 -1.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5414369883947074e-004</threshold>\n            <left_val>0.5516173243522644</left_val>\n            <right_val>0.4407708048820496</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 2 2 -1.</_>\n                <_>10 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3522560521960258e-003</threshold>\n            <left_val>0.5194190144538879</left_val>\n            <right_val>0.2465227991342545</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 2 2 -1.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4205080484971404e-004</threshold>\n            <left_val>0.3830705881118774</left_val>\n            <right_val>0.5139682292938232</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 2 2 -1.</_>\n                <_>13 7 1 1 2.</_>\n                <_>12 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4488727841526270e-004</threshold>\n            <left_val>0.4891090989112854</left_val>\n            <right_val>0.5974786877632141</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 2 -1.</_>\n                <_>5 7 1 1 2.</_>\n                <_>6 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5116379149258137e-003</threshold>\n            <left_val>0.7413681745529175</left_val>\n            <right_val>0.4768764972686768</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 14 -1.</_>\n                <_>14 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0125409103929996</threshold>\n            <left_val>0.3648819029331207</left_val>\n            <right_val>0.5252826809883118</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 3 14 -1.</_>\n                <_>5 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4931852072477341e-003</threshold>\n            <left_val>0.5100492835044861</left_val>\n            <right_val>0.3629586994647980</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 3 14 -1.</_>\n                <_>14 4 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0129611501470208</threshold>\n            <left_val>0.5232442021369934</left_val>\n            <right_val>0.4333561062812805</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7209449112415314e-003</threshold>\n            <left_val>0.4648149013519287</left_val>\n            <right_val>0.6331052780151367</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3119079414755106e-003</threshold>\n            <left_val>0.5930309891700745</left_val>\n            <right_val>0.4531058073043823</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 3 16 -1.</_>\n                <_>5 2 1 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8262299019843340e-003</threshold>\n            <left_val>0.3870477974414825</left_val>\n            <right_val>0.5257101058959961</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 8 10 -1.</_>\n                <_>7 7 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4311339473351836e-003</threshold>\n            <left_val>0.5522503256797791</left_val>\n            <right_val>0.4561854898929596</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 7 3 -1.</_>\n                <_>6 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9378310535103083e-003</threshold>\n            <left_val>0.4546220898628235</left_val>\n            <right_val>0.5736966729164124</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 10 12 -1.</_>\n                <_>14 2 5 6 2.</_>\n                <_>9 8 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6343559147790074e-004</threshold>\n            <left_val>0.5345739126205444</left_val>\n            <right_val>0.4571875035762787</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 8 2 -1.</_>\n                <_>6 8 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8257522545754910e-004</threshold>\n            <left_val>0.3967815935611725</left_val>\n            <right_val>0.5220187902450562</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>8 16 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0195504408329725</threshold>\n            <left_val>0.2829642891883850</left_val>\n            <right_val>0.5243508219718933</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 3 -1.</_>\n                <_>6 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3914958951063454e-004</threshold>\n            <left_val>0.4590066969394684</left_val>\n            <right_val>0.5899090170860291</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 6 -1.</_>\n                <_>16 4 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0214520003646612</threshold>\n            <left_val>0.5231410861015320</left_val>\n            <right_val>0.2855378985404968</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 2 -1.</_>\n                <_>6 6 2 1 2.</_>\n                <_>8 7 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8973580598831177e-004</threshold>\n            <left_val>0.4397256970405579</left_val>\n            <right_val>0.5506421923637390</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 6 -1.</_>\n                <_>16 4 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0261576101183891</threshold>\n            <left_val>0.3135079145431519</left_val>\n            <right_val>0.5189175009727478</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 4 6 -1.</_>\n                <_>0 4 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0139598604291677</threshold>\n            <left_val>0.3213272988796234</left_val>\n            <right_val>0.5040717720985413</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 6 -1.</_>\n                <_>9 6 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3699018210172653e-003</threshold>\n            <left_val>0.6387544870376587</left_val>\n            <right_val>0.4849506914615631</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 6 10 -1.</_>\n                <_>3 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5613820701837540e-003</threshold>\n            <left_val>0.2759132087230682</left_val>\n            <right_val>0.5032019019126892</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>9 5 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6622901037335396e-004</threshold>\n            <left_val>0.4685640931129456</left_val>\n            <right_val>0.5834879279136658</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6550268568098545e-004</threshold>\n            <left_val>0.5175207257270813</left_val>\n            <right_val>0.3896422088146210</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 3 2 -1.</_>\n                <_>13 14 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1833340227603912e-003</threshold>\n            <left_val>0.2069136947393417</left_val>\n            <right_val>0.5208122134208679</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 10 4 -1.</_>\n                <_>2 16 5 2 2.</_>\n                <_>7 18 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3976939097046852e-003</threshold>\n            <left_val>0.6134091019630432</left_val>\n            <right_val>0.4641222953796387</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 6 -1.</_>\n                <_>10 6 5 3 2.</_>\n                <_>5 9 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8028980381786823e-003</threshold>\n            <left_val>0.5454108119010925</left_val>\n            <right_val>0.4395219981670380</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 1 3 -1.</_>\n                <_>7 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5680569708347321e-003</threshold>\n            <left_val>0.6344485282897949</left_val>\n            <right_val>0.4681093990802765</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 16 6 3 -1.</_>\n                <_>14 17 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0733120404183865e-003</threshold>\n            <left_val>0.5292683243751526</left_val>\n            <right_val>0.4015620052814484</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2568129459396005e-003</threshold>\n            <left_val>0.4392988085746765</left_val>\n            <right_val>0.5452824831008911</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 10 3 -1.</_>\n                <_>7 5 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9065010603517294e-003</threshold>\n            <left_val>0.5898832082748413</left_val>\n            <right_val>0.4863379895687103</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 5 4 -1.</_>\n                <_>0 6 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4409340694546700e-003</threshold>\n            <left_val>0.4069364964962006</left_val>\n            <right_val>0.5247421860694885</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 9 -1.</_>\n                <_>13 14 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0248307008296251</threshold>\n            <left_val>0.5182725787162781</left_val>\n            <right_val>0.3682524859905243</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 9 -1.</_>\n                <_>4 14 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0488540083169937</threshold>\n            <left_val>0.1307577937841415</left_val>\n            <right_val>0.4961281120777130</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 1 -1.</_>\n                <_>9 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6110379947349429e-003</threshold>\n            <left_val>0.6421005725860596</left_val>\n            <right_val>0.4872662127017975</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 6 17 -1.</_>\n                <_>7 0 2 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0970094799995422</threshold>\n            <left_val>0.0477693490684032</left_val>\n            <right_val>0.4950988888740540</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 6 3 -1.</_>\n                <_>10 3 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1209240183234215e-003</threshold>\n            <left_val>0.4616267085075378</left_val>\n            <right_val>0.5354745984077454</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 15 4 -1.</_>\n                <_>7 2 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3064090162515640e-003</threshold>\n            <left_val>0.6261854171752930</left_val>\n            <right_val>0.4638805985450745</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 8 2 -1.</_>\n                <_>12 2 4 1 2.</_>\n                <_>8 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5771620352752507e-004</threshold>\n            <left_val>0.5384417772293091</left_val>\n            <right_val>0.4646640121936798</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 3 6 -1.</_>\n                <_>8 3 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3149951165542006e-004</threshold>\n            <left_val>0.3804047107696533</left_val>\n            <right_val>0.5130257010459900</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 2 2 -1.</_>\n                <_>9 18 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4505970466416329e-004</threshold>\n            <left_val>0.4554310142993927</left_val>\n            <right_val>0.5664461851119995</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 14 -1.</_>\n                <_>1 0 1 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0164745505899191</threshold>\n            <left_val>0.6596958041191101</left_val>\n            <right_val>0.4715859889984131</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 7 3 -1.</_>\n                <_>12 1 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0133695797994733</threshold>\n            <left_val>0.5195466279983521</left_val>\n            <right_val>0.3035964965820313</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 1 2 -1.</_>\n                <_>1 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0271780047332868e-004</threshold>\n            <left_val>0.5229176282882690</left_val>\n            <right_val>0.4107066094875336</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 8 -1.</_>\n                <_>15 12 1 4 2.</_>\n                <_>14 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5311559699475765e-003</threshold>\n            <left_val>0.6352887749671936</left_val>\n            <right_val>0.4960907101631165</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 7 3 -1.</_>\n                <_>1 1 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6187049224972725e-003</threshold>\n            <left_val>0.3824546039104462</left_val>\n            <right_val>0.5140984058380127</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 8 -1.</_>\n                <_>15 12 1 4 2.</_>\n                <_>14 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0834268331527710e-003</threshold>\n            <left_val>0.4950439929962158</left_val>\n            <right_val>0.6220818758010864</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0798181593418121</threshold>\n            <left_val>0.4952335953712463</left_val>\n            <right_val>0.1322475969791412</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 8 9 -1.</_>\n                <_>6 4 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0992265865206718</threshold>\n            <left_val>0.7542728781700134</left_val>\n            <right_val>0.5008416771888733</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 2 2 -1.</_>\n                <_>5 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5174017800018191e-004</threshold>\n            <left_val>0.3699302971363068</left_val>\n            <right_val>0.5130121111869812</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 6 6 -1.</_>\n                <_>16 14 3 3 2.</_>\n                <_>13 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0189968496561050</threshold>\n            <left_val>0.6689178943634033</left_val>\n            <right_val>0.4921202957630158</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 20 2 -1.</_>\n                <_>0 17 10 1 2.</_>\n                <_>10 18 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0173468999564648</threshold>\n            <left_val>0.4983300864696503</left_val>\n            <right_val>0.1859198063611984</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 2 6 -1.</_>\n                <_>11 3 1 3 2.</_>\n                <_>10 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5082101607695222e-004</threshold>\n            <left_val>0.4574424028396606</left_val>\n            <right_val>0.5522121787071228</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 6 2 -1.</_>\n                <_>8 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0056050270795822e-003</threshold>\n            <left_val>0.5131744742393494</left_val>\n            <right_val>0.3856469988822937</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 6 13 -1.</_>\n                <_>10 7 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7688191086053848e-003</threshold>\n            <left_val>0.4361700117588043</left_val>\n            <right_val>0.5434309244155884</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 10 5 -1.</_>\n                <_>10 15 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0508782789111137</threshold>\n            <left_val>0.4682720899581909</left_val>\n            <right_val>0.6840639710426331</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 4 4 10 -1.</_>\n                <_>10 4 2 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2901780903339386e-003</threshold>\n            <left_val>0.4329245090484619</left_val>\n            <right_val>0.5306099057197571</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 1 -1.</_>\n                <_>6 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5715380141045898e-004</threshold>\n            <left_val>0.5370057225227356</left_val>\n            <right_val>0.4378164112567902</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 6 7 -1.</_>\n                <_>10 3 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1051924005150795</threshold>\n            <left_val>0.5137274265289307</left_val>\n            <right_val>0.0673614665865898</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 6 7 -1.</_>\n                <_>7 3 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7198919560760260e-003</threshold>\n            <left_val>0.4112060964107513</left_val>\n            <right_val>0.5255665183067322</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 18 5 -1.</_>\n                <_>7 7 6 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0483377799391747</threshold>\n            <left_val>0.5404623746871948</left_val>\n            <right_val>0.4438967108726502</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 17 4 3 -1.</_>\n                <_>5 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.5703761326149106e-004</threshold>\n            <left_val>0.4355969130992889</left_val>\n            <right_val>0.5399510860443115</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 12 6 -1.</_>\n                <_>14 14 6 3 2.</_>\n                <_>8 17 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0253712590783834</threshold>\n            <left_val>0.5995175242424011</left_val>\n            <right_val>0.5031024813652039</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 4 -1.</_>\n                <_>0 13 10 2 2.</_>\n                <_>10 15 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0524579510092735</threshold>\n            <left_val>0.4950287938117981</left_val>\n            <right_val>0.1398351043462753</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 14 2 -1.</_>\n                <_>11 5 7 1 2.</_>\n                <_>4 6 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0123656298965216</threshold>\n            <left_val>0.6397299170494080</left_val>\n            <right_val>0.4964106082916260</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 10 12 -1.</_>\n                <_>1 2 5 6 2.</_>\n                <_>6 8 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1458971947431564</threshold>\n            <left_val>0.1001669988036156</left_val>\n            <right_val>0.4946322143077850</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 14 3 -1.</_>\n                <_>6 2 14 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0159086007624865</threshold>\n            <left_val>0.3312329947948456</left_val>\n            <right_val>0.5208340883255005</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 2 3 -1.</_>\n                <_>8 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9486068999394774e-004</threshold>\n            <left_val>0.4406363964080811</left_val>\n            <right_val>0.5426102876663208</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2454001270234585e-003</threshold>\n            <left_val>0.2799589931964874</left_val>\n            <right_val>0.5189967155456543</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 4 2 -1.</_>\n                <_>5 15 2 1 2.</_>\n                <_>7 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0421799533069134e-003</threshold>\n            <left_val>0.6987580060958862</left_val>\n            <right_val>0.4752142131328583</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 1 3 -1.</_>\n                <_>10 16 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9812189750373363e-003</threshold>\n            <left_val>0.4983288943767548</left_val>\n            <right_val>0.6307479739189148</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 4 4 -1.</_>\n                <_>8 16 2 2 2.</_>\n                <_>10 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2884308174252510e-003</threshold>\n            <left_val>0.2982333004474640</left_val>\n            <right_val>0.5026869773864746</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 6 -1.</_>\n                <_>6 14 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5094350092113018e-003</threshold>\n            <left_val>0.5308442115783691</left_val>\n            <right_val>0.3832970857620239</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 5 2 -1.</_>\n                <_>2 14 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3340799212455750e-003</threshold>\n            <left_val>0.2037964016199112</left_val>\n            <right_val>0.4969817101955414</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 6 6 -1.</_>\n                <_>16 14 3 3 2.</_>\n                <_>13 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0286671407520771</threshold>\n            <left_val>0.5025696754455566</left_val>\n            <right_val>0.6928027272224426</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 4 -1.</_>\n                <_>7 9 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1701968014240265</threshold>\n            <left_val>0.4960052967071533</left_val>\n            <right_val>0.1476442962884903</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 6 6 -1.</_>\n                <_>16 14 3 3 2.</_>\n                <_>13 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.2614478841423988e-003</threshold>\n            <left_val>0.5603063702583313</left_val>\n            <right_val>0.4826056063175201</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 1 6 -1.</_>\n                <_>0 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5769277969375253e-004</threshold>\n            <left_val>0.5205562114715576</left_val>\n            <right_val>0.4129633009433746</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 15 20 -1.</_>\n                <_>5 10 15 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.3625833988189697</threshold>\n            <left_val>0.5221652984619141</left_val>\n            <right_val>0.3768612146377564</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 6 6 -1.</_>\n                <_>1 14 3 3 2.</_>\n                <_>4 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116151301190257</threshold>\n            <left_val>0.6022682785987854</left_val>\n            <right_val>0.4637489914894104</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 6 -1.</_>\n                <_>10 14 2 3 2.</_>\n                <_>8 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0795197710394859e-003</threshold>\n            <left_val>0.4070447087287903</left_val>\n            <right_val>0.5337479114532471</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 1 -1.</_>\n                <_>8 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7204300537705421e-004</threshold>\n            <left_val>0.4601835012435913</left_val>\n            <right_val>0.5900393128395081</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7543348995968699e-004</threshold>\n            <left_val>0.5398252010345459</left_val>\n            <right_val>0.4345428943634033</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 2 -1.</_>\n                <_>9 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3295697327703238e-004</threshold>\n            <left_val>0.5201563239097595</left_val>\n            <right_val>0.4051358997821808</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 4 6 -1.</_>\n                <_>14 14 2 3 2.</_>\n                <_>12 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2435320531949401e-003</threshold>\n            <left_val>0.4642387926578522</left_val>\n            <right_val>0.5547441244125366</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 4 6 -1.</_>\n                <_>4 14 2 3 2.</_>\n                <_>6 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7363857738673687e-003</threshold>\n            <left_val>0.6198567152023315</left_val>\n            <right_val>0.4672552049160004</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 2 6 -1.</_>\n                <_>14 14 1 3 2.</_>\n                <_>13 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4658462069928646e-003</threshold>\n            <left_val>0.6837332844734192</left_val>\n            <right_val>0.5019000768661499</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 14 2 6 -1.</_>\n                <_>5 14 1 3 2.</_>\n                <_>6 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5017321351915598e-004</threshold>\n            <left_val>0.4344803094863892</left_val>\n            <right_val>0.5363622903823853</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 12 -1.</_>\n                <_>7 4 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5754920605104417e-004</threshold>\n            <left_val>0.4760079085826874</left_val>\n            <right_val>0.5732020735740662</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 12 2 -1.</_>\n                <_>4 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9774366244673729e-003</threshold>\n            <left_val>0.5090985894203186</left_val>\n            <right_val>0.3635039925575256</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 3 13 -1.</_>\n                <_>11 3 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1464529931545258e-004</threshold>\n            <left_val>0.5570064783096314</left_val>\n            <right_val>0.4593802094459534</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 3 13 -1.</_>\n                <_>8 3 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5888899583369493e-004</threshold>\n            <left_val>0.5356845855712891</left_val>\n            <right_val>0.4339134991168976</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 6 3 -1.</_>\n                <_>10 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0463250479660928e-004</threshold>\n            <left_val>0.4439803063869476</left_val>\n            <right_val>0.5436776876449585</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 3 2 -1.</_>\n                <_>4 11 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2184787606820464e-004</threshold>\n            <left_val>0.4042294919490814</left_val>\n            <right_val>0.5176299214363098</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 12 6 8 -1.</_>\n                <_>16 12 3 4 2.</_>\n                <_>13 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9467419050633907e-003</threshold>\n            <left_val>0.4927651882171631</left_val>\n            <right_val>0.5633779764175415</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 5 -1.</_>\n                <_>9 6 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0217533893883228</threshold>\n            <left_val>0.8006293773651123</left_val>\n            <right_val>0.4800840914249420</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 11 2 7 -1.</_>\n                <_>17 11 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0145403798669577</threshold>\n            <left_val>0.3946054875850678</left_val>\n            <right_val>0.5182222723960877</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 8 2 -1.</_>\n                <_>7 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0405107699334621</threshold>\n            <left_val>0.0213249903172255</left_val>\n            <right_val>0.4935792982578278</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 3 -1.</_>\n                <_>6 10 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8458268176764250e-004</threshold>\n            <left_val>0.4012795984745026</left_val>\n            <right_val>0.5314025282859802</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 4 3 -1.</_>\n                <_>4 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5151800625026226e-003</threshold>\n            <left_val>0.4642418920993805</left_val>\n            <right_val>0.5896260738372803</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 4 3 -1.</_>\n                <_>11 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0626221820712090e-003</threshold>\n            <left_val>0.6502159237861633</left_val>\n            <right_val>0.5016477704048157</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 17 12 -1.</_>\n                <_>1 8 17 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0945358425378799</threshold>\n            <left_val>0.5264708995819092</left_val>\n            <right_val>0.4126827120780945</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 4 3 -1.</_>\n                <_>11 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7315051779150963e-003</threshold>\n            <left_val>0.4879199862480164</left_val>\n            <right_val>0.5892447829246521</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 6 3 -1.</_>\n                <_>4 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2571471314877272e-004</threshold>\n            <left_val>0.3917280137538910</left_val>\n            <right_val>0.5189412832260132</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 5 3 -1.</_>\n                <_>12 4 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5464049540460110e-003</threshold>\n            <left_val>0.5837599039077759</left_val>\n            <right_val>0.4985705912113190</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 2 7 -1.</_>\n                <_>2 11 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0260756891220808</threshold>\n            <left_val>0.1261983960866928</left_val>\n            <right_val>0.4955821931362152</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 8 -1.</_>\n                <_>16 12 1 4 2.</_>\n                <_>15 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4779709316790104e-003</threshold>\n            <left_val>0.5722513794898987</left_val>\n            <right_val>0.5010265707969666</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 11 3 -1.</_>\n                <_>4 9 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1337741315364838e-003</threshold>\n            <left_val>0.5273262262344360</left_val>\n            <right_val>0.4226376116275787</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 6 2 -1.</_>\n                <_>12 13 3 1 2.</_>\n                <_>9 14 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7944980906322598e-004</threshold>\n            <left_val>0.4450066983699799</left_val>\n            <right_val>0.5819587111473084</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 13 4 3 -1.</_>\n                <_>6 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1114079281687737e-003</threshold>\n            <left_val>0.5757653117179871</left_val>\n            <right_val>0.4511714875698090</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 3 -1.</_>\n                <_>10 12 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0131799904629588</threshold>\n            <left_val>0.1884381026029587</left_val>\n            <right_val>0.5160734057426453</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 3 3 -1.</_>\n                <_>5 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7968099825084209e-003</threshold>\n            <left_val>0.6589789986610413</left_val>\n            <right_val>0.4736118912696838</right_val></_></_>\n        <_>\n          <!-- tree 177 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 3 -1.</_>\n                <_>9 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7483168095350266e-003</threshold>\n            <left_val>0.5259429812431335</left_val>\n            <right_val>0.3356395065784454</right_val></_></_>\n        <_>\n          <!-- tree 178 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 16 3 -1.</_>\n                <_>0 3 16 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4623369788751006e-003</threshold>\n            <left_val>0.5355271100997925</left_val>\n            <right_val>0.4264092147350311</right_val></_></_>\n        <_>\n          <!-- tree 179 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 8 -1.</_>\n                <_>16 12 1 4 2.</_>\n                <_>15 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7645159065723419e-003</threshold>\n            <left_val>0.5034406781196594</left_val>\n            <right_val>0.5786827802658081</right_val></_></_>\n        <_>\n          <!-- tree 180 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 8 -1.</_>\n                <_>3 12 1 4 2.</_>\n                <_>4 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8066660314798355e-003</threshold>\n            <left_val>0.4756605029106140</left_val>\n            <right_val>0.6677829027175903</right_val></_></_>\n        <_>\n          <!-- tree 181 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 13 3 6 -1.</_>\n                <_>14 15 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6608621012419462e-003</threshold>\n            <left_val>0.5369611978530884</left_val>\n            <right_val>0.4311546981334686</right_val></_></_>\n        <_>\n          <!-- tree 182 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 3 6 -1.</_>\n                <_>3 15 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0214496403932571</threshold>\n            <left_val>0.4968641996383667</left_val>\n            <right_val>0.1888816058635712</right_val></_></_>\n        <_>\n          <!-- tree 183 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 10 2 -1.</_>\n                <_>11 5 5 1 2.</_>\n                <_>6 6 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1678901761770248e-003</threshold>\n            <left_val>0.4930733144283295</left_val>\n            <right_val>0.5815368890762329</right_val></_></_>\n        <_>\n          <!-- tree 184 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 14 14 6 -1.</_>\n                <_>2 17 14 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6467564105987549e-003</threshold>\n            <left_val>0.5205205082893372</left_val>\n            <right_val>0.4132595062255859</right_val></_></_>\n        <_>\n          <!-- tree 185 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6114078829996288e-004</threshold>\n            <left_val>0.5483555197715759</left_val>\n            <right_val>0.4800927937030792</right_val></_></_>\n        <_>\n          <!-- tree 186 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 16 2 2 -1.</_>\n                <_>4 16 1 1 2.</_>\n                <_>5 17 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0808729566633701e-003</threshold>\n            <left_val>0.4689902067184448</left_val>\n            <right_val>0.6041421294212341</right_val></_></_>\n        <_>\n          <!-- tree 187 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 2 3 -1.</_>\n                <_>10 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7719959877431393e-003</threshold>\n            <left_val>0.5171142220497131</left_val>\n            <right_val>0.3053277134895325</right_val></_></_>\n        <_>\n          <!-- tree 188 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 20 2 -1.</_>\n                <_>0 17 10 1 2.</_>\n                <_>10 18 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5720770461484790e-003</threshold>\n            <left_val>0.5219978094100952</left_val>\n            <right_val>0.4178803861141205</right_val></_></_>\n        <_>\n          <!-- tree 189 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 1 3 -1.</_>\n                <_>13 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9307859474793077e-003</threshold>\n            <left_val>0.5860369801521301</left_val>\n            <right_val>0.4812920093536377</right_val></_></_>\n        <_>\n          <!-- tree 190 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 3 2 -1.</_>\n                <_>9 13 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8926272690296173e-003</threshold>\n            <left_val>0.1749276965856552</left_val>\n            <right_val>0.4971733987331390</right_val></_></_>\n        <_>\n          <!-- tree 191 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 3 3 -1.</_>\n                <_>13 2 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2224679123610258e-003</threshold>\n            <left_val>0.4342589080333710</left_val>\n            <right_val>0.5212848186492920</right_val></_></_>\n        <_>\n          <!-- tree 192 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 18 2 2 -1.</_>\n                <_>3 18 1 1 2.</_>\n                <_>4 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9011989934369922e-003</threshold>\n            <left_val>0.4765186905860901</left_val>\n            <right_val>0.6892055273056030</right_val></_></_>\n        <_>\n          <!-- tree 193 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 4 -1.</_>\n                <_>10 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7576119173318148e-003</threshold>\n            <left_val>0.5262191295623779</left_val>\n            <right_val>0.4337486028671265</right_val></_></_>\n        <_>\n          <!-- tree 194 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 3 -1.</_>\n                <_>6 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1787449046969414e-003</threshold>\n            <left_val>0.4804069101810455</left_val>\n            <right_val>0.7843729257583618</right_val></_></_>\n        <_>\n          <!-- tree 195 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 1 5 2 -1.</_>\n                <_>13 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0273341629654169e-004</threshold>\n            <left_val>0.4120846986770630</left_val>\n            <right_val>0.5353423953056335</right_val></_></_>\n        <_>\n          <!-- tree 196 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 2 -1.</_>\n                <_>7 14 3 1 2.</_>\n                <_>10 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1797959022223949e-003</threshold>\n            <left_val>0.4740372896194458</left_val>\n            <right_val>0.6425960063934326</right_val></_></_>\n        <_>\n          <!-- tree 197 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 3 4 -1.</_>\n                <_>12 3 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0101140001788735</threshold>\n            <left_val>0.2468792051076889</left_val>\n            <right_val>0.5175017714500427</right_val></_></_>\n        <_>\n          <!-- tree 198 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 13 12 6 -1.</_>\n                <_>5 13 4 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0186170600354671</threshold>\n            <left_val>0.5756294131278992</left_val>\n            <right_val>0.4628978967666626</right_val></_></_>\n        <_>\n          <!-- tree 199 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 11 5 2 -1.</_>\n                <_>14 12 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9225959703326225e-003</threshold>\n            <left_val>0.5169625878334045</left_val>\n            <right_val>0.3214271068572998</right_val></_></_>\n        <_>\n          <!-- tree 200 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 14 4 -1.</_>\n                <_>2 15 7 2 2.</_>\n                <_>9 17 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2945079989731312e-003</threshold>\n            <left_val>0.3872014880180359</left_val>\n            <right_val>0.5141636729240418</right_val></_></_>\n        <_>\n          <!-- tree 201 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 14 2 -1.</_>\n                <_>10 7 7 1 2.</_>\n                <_>3 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5353019163012505e-003</threshold>\n            <left_val>0.4853048920631409</left_val>\n            <right_val>0.6310489773750305</right_val></_></_>\n        <_>\n          <!-- tree 202 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 4 2 -1.</_>\n                <_>1 12 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0878399480134249e-003</threshold>\n            <left_val>0.5117315053939819</left_val>\n            <right_val>0.3723258972167969</right_val></_></_>\n        <_>\n          <!-- tree 203 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 14 -1.</_>\n                <_>16 0 2 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0225422400981188</threshold>\n            <left_val>0.5692740082740784</left_val>\n            <right_val>0.4887112975120544</right_val></_></_>\n        <_>\n          <!-- tree 204 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 1 3 -1.</_>\n                <_>4 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0065660830587149e-003</threshold>\n            <left_val>0.2556012868881226</left_val>\n            <right_val>0.5003992915153503</right_val></_></_>\n        <_>\n          <!-- tree 205 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 14 -1.</_>\n                <_>16 0 2 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4741272255778313e-003</threshold>\n            <left_val>0.4810872972011566</left_val>\n            <right_val>0.5675926804542542</right_val></_></_>\n        <_>\n          <!-- tree 206 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 3 7 -1.</_>\n                <_>2 10 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0261623207479715</threshold>\n            <left_val>0.4971194863319397</left_val>\n            <right_val>0.1777237057685852</right_val></_></_>\n        <_>\n          <!-- tree 207 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 9 2 -1.</_>\n                <_>8 13 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4352738233283162e-004</threshold>\n            <left_val>0.4940010905265808</left_val>\n            <right_val>0.5491250753402710</right_val></_></_>\n        <_>\n          <!-- tree 208 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 20 1 -1.</_>\n                <_>10 6 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0333632417023182</threshold>\n            <left_val>0.5007612109184265</left_val>\n            <right_val>0.2790724039077759</right_val></_></_>\n        <_>\n          <!-- tree 209 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 4 4 -1.</_>\n                <_>8 4 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0151186501607299</threshold>\n            <left_val>0.7059578895568848</left_val>\n            <right_val>0.4973031878471375</right_val></_></_>\n        <_>\n          <!-- tree 210 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 2 -1.</_>\n                <_>0 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8648946732282639e-004</threshold>\n            <left_val>0.5128620266914368</left_val>\n            <right_val>0.3776761889457703</right_val></_></_></trees>\n      <stage_threshold>104.7491989135742200</stage_threshold>\n      <parent>19</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 21 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 10 9 -1.</_>\n                <_>5 6 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0951507985591888</threshold>\n            <left_val>0.6470757126808167</left_val>\n            <right_val>0.4017286896705627</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 4 10 -1.</_>\n                <_>15 2 2 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2702340073883533e-003</threshold>\n            <left_val>0.3999822139739990</left_val>\n            <right_val>0.5746449232101440</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 2 7 -1.</_>\n                <_>9 2 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0018089455552399e-004</threshold>\n            <left_val>0.3558770120143890</left_val>\n            <right_val>0.5538809895515442</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 12 1 -1.</_>\n                <_>11 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1757409665733576e-003</threshold>\n            <left_val>0.4256534874439240</left_val>\n            <right_val>0.5382617712020874</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 9 1 -1.</_>\n                <_>6 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4235268433112651e-005</threshold>\n            <left_val>0.3682908117771149</left_val>\n            <right_val>0.5589926838874817</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 10 1 4 -1.</_>\n                <_>15 12 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9936920327600092e-005</threshold>\n            <left_val>0.5452470183372498</left_val>\n            <right_val>0.4020367860794067</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 6 4 -1.</_>\n                <_>7 10 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0073199886828661e-003</threshold>\n            <left_val>0.5239058136940002</left_val>\n            <right_val>0.3317843973636627</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 9 1 6 -1.</_>\n                <_>15 12 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0105138896033168</threshold>\n            <left_val>0.4320689141750336</left_val>\n            <right_val>0.5307983756065369</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 6 3 -1.</_>\n                <_>7 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3476826548576355e-003</threshold>\n            <left_val>0.4504637122154236</left_val>\n            <right_val>0.6453298926353455</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 2 16 -1.</_>\n                <_>15 3 1 8 2.</_>\n                <_>14 11 1 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1492270063608885e-003</threshold>\n            <left_val>0.4313425123691559</left_val>\n            <right_val>0.5370525121688843</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 1 6 -1.</_>\n                <_>4 12 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4435649973165710e-005</threshold>\n            <left_val>0.5326603055000305</left_val>\n            <right_val>0.3817971944808960</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 5 2 -1.</_>\n                <_>12 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2855090578086674e-004</threshold>\n            <left_val>0.4305163919925690</left_val>\n            <right_val>0.5382009744644165</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 18 4 2 -1.</_>\n                <_>6 18 2 1 2.</_>\n                <_>8 19 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5062429883982986e-004</threshold>\n            <left_val>0.4235970973968506</left_val>\n            <right_val>0.5544965267181397</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 4 16 10 -1.</_>\n                <_>10 4 8 5 2.</_>\n                <_>2 9 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0715598315000534</threshold>\n            <left_val>0.5303059816360474</left_val>\n            <right_val>0.2678802907466888</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 1 10 -1.</_>\n                <_>6 10 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4095180500298738e-004</threshold>\n            <left_val>0.3557108938694000</left_val>\n            <right_val>0.5205433964729309</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 15 2 -1.</_>\n                <_>9 8 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0629865005612373</threshold>\n            <left_val>0.5225362777709961</left_val>\n            <right_val>0.2861376106739044</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 15 2 -1.</_>\n                <_>6 8 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3798629883676767e-003</threshold>\n            <left_val>0.3624185919761658</left_val>\n            <right_val>0.5201697945594788</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 3 6 -1.</_>\n                <_>9 7 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1810739670181647e-004</threshold>\n            <left_val>0.5474476814270020</left_val>\n            <right_val>0.3959893882274628</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>9 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4505601292476058e-004</threshold>\n            <left_val>0.3740422129631043</left_val>\n            <right_val>0.5215715765953064</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8454910023137927e-003</threshold>\n            <left_val>0.5893052220344544</left_val>\n            <right_val>0.4584448933601379</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 16 3 -1.</_>\n                <_>1 1 16 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3832371011376381e-004</threshold>\n            <left_val>0.4084582030773163</left_val>\n            <right_val>0.5385351181030273</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 7 2 -1.</_>\n                <_>11 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4000830017030239e-003</threshold>\n            <left_val>0.3777455091476440</left_val>\n            <right_val>0.5293580293655396</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 10 18 -1.</_>\n                <_>5 7 10 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0987957417964935</threshold>\n            <left_val>0.2963612079620361</left_val>\n            <right_val>0.5070089101791382</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 4 3 2 -1.</_>\n                <_>18 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1798239797353745e-003</threshold>\n            <left_val>0.4877632856369019</left_val>\n            <right_val>0.6726443767547607</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 1 3 -1.</_>\n                <_>8 14 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2406419632025063e-004</threshold>\n            <left_val>0.4366911053657532</left_val>\n            <right_val>0.5561109781265259</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 14 6 -1.</_>\n                <_>3 16 14 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0325472503900528</threshold>\n            <left_val>0.3128157854080200</left_val>\n            <right_val>0.5308616161346436</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 4 -1.</_>\n                <_>1 2 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7561130747199059e-003</threshold>\n            <left_val>0.6560224890708923</left_val>\n            <right_val>0.4639872014522553</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 5 2 -1.</_>\n                <_>12 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0160272493958473</threshold>\n            <left_val>0.5172680020332336</left_val>\n            <right_val>0.3141897916793823</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 5 2 -1.</_>\n                <_>3 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1002350523485802e-006</threshold>\n            <left_val>0.4084446132183075</left_val>\n            <right_val>0.5336294770240784</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 13 2 3 -1.</_>\n                <_>10 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3422808200120926e-003</threshold>\n            <left_val>0.4966922104358673</left_val>\n            <right_val>0.6603465080261231</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 2 3 -1.</_>\n                <_>8 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6970280557870865e-003</threshold>\n            <left_val>0.5908237099647522</left_val>\n            <right_val>0.4500182867050171</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 3 -1.</_>\n                <_>14 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4118260480463505e-003</threshold>\n            <left_val>0.5315160751342773</left_val>\n            <right_val>0.3599720895290375</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 2 3 -1.</_>\n                <_>7 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5300937965512276e-003</threshold>\n            <left_val>0.2334040999412537</left_val>\n            <right_val>0.4996814131736755</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 4 -1.</_>\n                <_>10 6 5 2 2.</_>\n                <_>5 8 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6478730142116547e-003</threshold>\n            <left_val>0.5880935788154602</left_val>\n            <right_val>0.4684734046459198</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 1 6 -1.</_>\n                <_>9 16 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0112956296652555</threshold>\n            <left_val>0.4983777105808258</left_val>\n            <right_val>0.1884590983390808</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 2 2 -1.</_>\n                <_>11 12 1 1 2.</_>\n                <_>10 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6952878842130303e-004</threshold>\n            <left_val>0.5872138142585754</left_val>\n            <right_val>0.4799019992351532</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 3 -1.</_>\n                <_>4 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4410680159926414e-003</threshold>\n            <left_val>0.5131189227104187</left_val>\n            <right_val>0.3501011133193970</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 6 6 -1.</_>\n                <_>14 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4637870956212282e-003</threshold>\n            <left_val>0.5339372158050537</left_val>\n            <right_val>0.4117639064788818</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 2 3 -1.</_>\n                <_>8 18 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3114518737420440e-004</threshold>\n            <left_val>0.4313383102416992</left_val>\n            <right_val>0.5398246049880981</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 4 4 6 -1.</_>\n                <_>16 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0335572697222233</threshold>\n            <left_val>0.2675336897373200</left_val>\n            <right_val>0.5179154872894287</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 4 6 -1.</_>\n                <_>0 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0185394193977118</threshold>\n            <left_val>0.4973869919776917</left_val>\n            <right_val>0.2317177057266235</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 3 -1.</_>\n                <_>14 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9698139405809343e-004</threshold>\n            <left_val>0.5529708266258240</left_val>\n            <right_val>0.4643664062023163</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 8 1 -1.</_>\n                <_>8 9 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5577259152196348e-004</threshold>\n            <left_val>0.5629584193229675</left_val>\n            <right_val>0.4469191133975983</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0101589802652597</threshold>\n            <left_val>0.6706212759017944</left_val>\n            <right_val>0.4925918877124786</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 10 6 -1.</_>\n                <_>5 14 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2413829356082715e-005</threshold>\n            <left_val>0.5239421725273132</left_val>\n            <right_val>0.3912901878356934</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 1 2 -1.</_>\n                <_>11 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2034963523037732e-005</threshold>\n            <left_val>0.4799438118934631</left_val>\n            <right_val>0.5501788854598999</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 2 -1.</_>\n                <_>8 16 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9267209619283676e-003</threshold>\n            <left_val>0.6930009722709656</left_val>\n            <right_val>0.4698084890842438</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 8 -1.</_>\n                <_>10 9 4 4 2.</_>\n                <_>6 13 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.6997838914394379e-003</threshold>\n            <left_val>0.4099623858928680</left_val>\n            <right_val>0.5480883121490479</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 4 6 -1.</_>\n                <_>7 12 2 3 2.</_>\n                <_>9 15 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3130549862980843e-003</threshold>\n            <left_val>0.3283475935459137</left_val>\n            <right_val>0.5057886242866516</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 3 1 -1.</_>\n                <_>11 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9650589674711227e-003</threshold>\n            <left_val>0.4978047013282776</left_val>\n            <right_val>0.6398249864578247</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 10 -1.</_>\n                <_>9 7 1 5 2.</_>\n                <_>10 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1647600270807743e-003</threshold>\n            <left_val>0.4661160111427307</left_val>\n            <right_val>0.6222137212753296</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 6 6 -1.</_>\n                <_>10 0 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0240786392241716</threshold>\n            <left_val>0.2334644943475723</left_val>\n            <right_val>0.5222162008285523</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 2 6 -1.</_>\n                <_>3 13 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0210279691964388</threshold>\n            <left_val>0.1183653995394707</left_val>\n            <right_val>0.4938226044178009</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 12 1 2 -1.</_>\n                <_>16 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6017020465806127e-004</threshold>\n            <left_val>0.5325019955635071</left_val>\n            <right_val>0.4116711020469666</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 6 6 -1.</_>\n                <_>1 14 3 3 2.</_>\n                <_>4 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0172197297215462</threshold>\n            <left_val>0.6278762221336365</left_val>\n            <right_val>0.4664269089698792</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 1 3 6 -1.</_>\n                <_>14 1 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8672142699360847e-003</threshold>\n            <left_val>0.3403415083885193</left_val>\n            <right_val>0.5249736905097961</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 2 2 -1.</_>\n                <_>8 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4777389848604798e-004</threshold>\n            <left_val>0.3610411882400513</left_val>\n            <right_val>0.5086259245872498</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 3 3 -1.</_>\n                <_>10 9 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5486010387539864e-003</threshold>\n            <left_val>0.4884265959262848</left_val>\n            <right_val>0.6203498244285584</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>8 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9461148232221603e-003</threshold>\n            <left_val>0.2625930011272430</left_val>\n            <right_val>0.5011097192764282</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 2 3 -1.</_>\n                <_>14 0 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3569870498031378e-004</threshold>\n            <left_val>0.4340794980525971</left_val>\n            <right_val>0.5628312230110169</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 9 -1.</_>\n                <_>7 0 6 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0458802506327629</threshold>\n            <left_val>0.6507998704910278</left_val>\n            <right_val>0.4696274995803833</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 5 4 15 -1.</_>\n                <_>11 5 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215825606137514</threshold>\n            <left_val>0.3826502859592438</left_val>\n            <right_val>0.5287616848945618</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 4 15 -1.</_>\n                <_>7 5 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0202095396816731</threshold>\n            <left_val>0.3233368098735809</left_val>\n            <right_val>0.5074477195739746</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 2 3 -1.</_>\n                <_>14 0 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8496710844337940e-003</threshold>\n            <left_val>0.5177603960037231</left_val>\n            <right_val>0.4489670991897583</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 2 3 -1.</_>\n                <_>5 0 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7476379879517481e-005</threshold>\n            <left_val>0.4020850956439972</left_val>\n            <right_val>0.5246363878250122</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 2 2 -1.</_>\n                <_>12 12 1 1 2.</_>\n                <_>11 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1513100471347570e-003</threshold>\n            <left_val>0.6315072178840637</left_val>\n            <right_val>0.4905154109001160</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 2 2 -1.</_>\n                <_>7 12 1 1 2.</_>\n                <_>8 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9862831104546785e-003</threshold>\n            <left_val>0.4702459871768951</left_val>\n            <right_val>0.6497151255607605</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 3 4 -1.</_>\n                <_>13 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2719512023031712e-003</threshold>\n            <left_val>0.3650383949279785</left_val>\n            <right_val>0.5227652788162231</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 3 -1.</_>\n                <_>4 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2662699446082115e-003</threshold>\n            <left_val>0.5166100859642029</left_val>\n            <right_val>0.3877618014812470</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 4 2 -1.</_>\n                <_>12 8 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2919440679252148e-003</threshold>\n            <left_val>0.7375894188880920</left_val>\n            <right_val>0.5023847818374634</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 3 2 -1.</_>\n                <_>9 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7360111279413104e-004</threshold>\n            <left_val>0.4423226118087769</left_val>\n            <right_val>0.5495585799217224</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 3 2 -1.</_>\n                <_>10 9 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0523450328037143e-003</threshold>\n            <left_val>0.5976396203041077</left_val>\n            <right_val>0.4859583079814911</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 3 2 -1.</_>\n                <_>9 9 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4216238893568516e-004</threshold>\n            <left_val>0.5955939292907715</left_val>\n            <right_val>0.4398930966854096</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 3 4 -1.</_>\n                <_>13 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1747940443456173e-003</threshold>\n            <left_val>0.5349888205528259</left_val>\n            <right_val>0.4605058133602142</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 3 4 -1.</_>\n                <_>6 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.2457437850534916e-003</threshold>\n            <left_val>0.5049191117286682</left_val>\n            <right_val>0.2941577136516571</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 12 4 -1.</_>\n                <_>10 14 6 2 2.</_>\n                <_>4 16 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0245397202670574</threshold>\n            <left_val>0.2550177872180939</left_val>\n            <right_val>0.5218586921691895</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 2 3 -1.</_>\n                <_>8 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3793041519820690e-004</threshold>\n            <left_val>0.4424861073493958</left_val>\n            <right_val>0.5490816235542297</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 3 8 -1.</_>\n                <_>10 14 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4233799884095788e-003</threshold>\n            <left_val>0.5319514274597168</left_val>\n            <right_val>0.4081355929374695</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 4 8 -1.</_>\n                <_>8 10 2 4 2.</_>\n                <_>10 14 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4149110540747643e-003</threshold>\n            <left_val>0.4087659120559692</left_val>\n            <right_val>0.5238950252532959</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 1 -1.</_>\n                <_>11 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2165299849584699e-003</threshold>\n            <left_val>0.5674579143524170</left_val>\n            <right_val>0.4908052980899811</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 6 -1.</_>\n                <_>9 15 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2438809499144554e-003</threshold>\n            <left_val>0.4129425883293152</left_val>\n            <right_val>0.5256118178367615</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 1 -1.</_>\n                <_>11 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1942739412188530e-003</threshold>\n            <left_val>0.5060194134712219</left_val>\n            <right_val>0.7313653230667114</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 1 -1.</_>\n                <_>8 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6607169527560472e-003</threshold>\n            <left_val>0.5979632139205933</left_val>\n            <right_val>0.4596369862556458</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 15 14 -1.</_>\n                <_>5 9 15 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0273162592202425</threshold>\n            <left_val>0.4174365103244782</left_val>\n            <right_val>0.5308842062950134</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 2 10 -1.</_>\n                <_>2 1 1 5 2.</_>\n                <_>3 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5845570014789701e-003</threshold>\n            <left_val>0.5615804791450501</left_val>\n            <right_val>0.4519486129283905</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 14 2 3 -1.</_>\n                <_>14 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5514739789068699e-003</threshold>\n            <left_val>0.4076187014579773</left_val>\n            <right_val>0.5360785126686096</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 7 3 3 -1.</_>\n                <_>3 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.8446558755822480e-004</threshold>\n            <left_val>0.4347293972969055</left_val>\n            <right_val>0.5430442094802856</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 4 3 3 -1.</_>\n                <_>17 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146722598001361</threshold>\n            <left_val>0.1659304946660996</left_val>\n            <right_val>0.5146093964576721</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 3 3 -1.</_>\n                <_>0 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1608882173895836e-003</threshold>\n            <left_val>0.4961819052696228</left_val>\n            <right_val>0.1884745955467224</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 6 2 -1.</_>\n                <_>16 5 3 1 2.</_>\n                <_>13 6 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1121659772470593e-003</threshold>\n            <left_val>0.4868263900279999</left_val>\n            <right_val>0.6093816161155701</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 19 12 1 -1.</_>\n                <_>8 19 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2603770531713963e-003</threshold>\n            <left_val>0.6284325122833252</left_val>\n            <right_val>0.4690375924110413</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 12 2 4 -1.</_>\n                <_>12 14 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4046430189628154e-004</threshold>\n            <left_val>0.5575000047683716</left_val>\n            <right_val>0.4046044051647186</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 1 3 -1.</_>\n                <_>3 16 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3348190006799996e-004</threshold>\n            <left_val>0.4115762114524841</left_val>\n            <right_val>0.5252848267555237</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 16 6 4 -1.</_>\n                <_>11 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5736480280756950e-003</threshold>\n            <left_val>0.4730072915554047</left_val>\n            <right_val>0.5690100789070129</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 3 10 -1.</_>\n                <_>3 10 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0306237693876028</threshold>\n            <left_val>0.4971886873245239</left_val>\n            <right_val>0.1740095019340515</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 8 2 4 -1.</_>\n                <_>12 8 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.2074798885732889e-004</threshold>\n            <left_val>0.5372117757797241</left_val>\n            <right_val>0.4354872107505798</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 2 4 -1.</_>\n                <_>7 8 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3550739064812660e-005</threshold>\n            <left_val>0.5366883873939514</left_val>\n            <right_val>0.4347316920757294</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 2 3 -1.</_>\n                <_>10 14 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6452710889279842e-003</threshold>\n            <left_val>0.3435518145561218</left_val>\n            <right_val>0.5160533189773560</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 10 3 -1.</_>\n                <_>10 1 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0432219989597797</threshold>\n            <left_val>0.4766792058944702</left_val>\n            <right_val>0.7293652892112732</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2331769578158855e-003</threshold>\n            <left_val>0.5029315948486328</left_val>\n            <right_val>0.5633171200752258</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 9 2 -1.</_>\n                <_>8 6 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1829739455133677e-003</threshold>\n            <left_val>0.4016092121601105</left_val>\n            <right_val>0.5192136764526367</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 2 -1.</_>\n                <_>9 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8027749320026487e-004</threshold>\n            <left_val>0.4088315963745117</left_val>\n            <right_val>0.5417919754981995</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 16 6 -1.</_>\n                <_>2 11 8 3 2.</_>\n                <_>10 14 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2934689447283745e-003</threshold>\n            <left_val>0.4075677096843720</left_val>\n            <right_val>0.5243561863899231</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 2 2 -1.</_>\n                <_>13 7 1 1 2.</_>\n                <_>12 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2750959722325206e-003</threshold>\n            <left_val>0.4913282990455627</left_val>\n            <right_val>0.6387010812759399</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 3 -1.</_>\n                <_>9 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3385322205722332e-003</threshold>\n            <left_val>0.5031672120094299</left_val>\n            <right_val>0.2947346866130829</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 2 -1.</_>\n                <_>10 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5250744596123695e-003</threshold>\n            <left_val>0.4949789047241211</left_val>\n            <right_val>0.6308869123458862</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 8 12 -1.</_>\n                <_>5 7 8 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4266352243721485e-004</threshold>\n            <left_val>0.5328366756439209</left_val>\n            <right_val>0.4285649955272675</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 2 -1.</_>\n                <_>13 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3609660090878606e-003</threshold>\n            <left_val>0.4991525113582611</left_val>\n            <right_val>0.5941501259803772</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 2 -1.</_>\n                <_>5 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4782509212382138e-004</threshold>\n            <left_val>0.4573504030704498</left_val>\n            <right_val>0.5854480862617493</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3360050506889820e-003</threshold>\n            <left_val>0.4604358971118927</left_val>\n            <right_val>0.5849052071571350</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 2 3 -1.</_>\n                <_>4 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0967548051849008e-004</threshold>\n            <left_val>0.3969388902187347</left_val>\n            <right_val>0.5229423046112061</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3656780831515789e-003</threshold>\n            <left_val>0.5808320045471191</left_val>\n            <right_val>0.4898357093334198</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0734340175986290e-003</threshold>\n            <left_val>0.4351210892200470</left_val>\n            <right_val>0.5470039248466492</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 6 -1.</_>\n                <_>10 14 1 3 2.</_>\n                <_>9 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1923359017819166e-003</threshold>\n            <left_val>0.5355060100555420</left_val>\n            <right_val>0.3842903971672058</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 3 2 -1.</_>\n                <_>9 14 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4968618787825108e-003</threshold>\n            <left_val>0.5018138885498047</left_val>\n            <right_val>0.2827191948890686</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 6 -1.</_>\n                <_>11 5 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0753688216209412</threshold>\n            <left_val>0.1225076019763947</left_val>\n            <right_val>0.5148826837539673</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 6 -1.</_>\n                <_>7 5 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0251344703137875</threshold>\n            <left_val>0.4731766879558563</left_val>\n            <right_val>0.7025446295738220</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 1 2 -1.</_>\n                <_>13 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9358599931583740e-005</threshold>\n            <left_val>0.5430532097816467</left_val>\n            <right_val>0.4656086862087250</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 10 2 -1.</_>\n                <_>0 3 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8355910005047917e-004</threshold>\n            <left_val>0.4031040072441101</left_val>\n            <right_val>0.5190119743347168</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 1 2 -1.</_>\n                <_>13 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6639450807124376e-003</threshold>\n            <left_val>0.4308126866817474</left_val>\n            <right_val>0.5161771178245544</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 2 -1.</_>\n                <_>5 7 1 1 2.</_>\n                <_>6 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3804089976474643e-003</threshold>\n            <left_val>0.6219829916954041</left_val>\n            <right_val>0.4695515930652618</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 7 -1.</_>\n                <_>13 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2313219485804439e-003</threshold>\n            <left_val>0.5379363894462585</left_val>\n            <right_val>0.4425831139087677</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 13 1 2 -1.</_>\n                <_>6 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4644179827882908e-005</threshold>\n            <left_val>0.5281640291213989</left_val>\n            <right_val>0.4222503006458283</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 7 -1.</_>\n                <_>12 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128188095986843</threshold>\n            <left_val>0.2582092881202698</left_val>\n            <right_val>0.5179932713508606</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 16 -1.</_>\n                <_>0 3 1 8 2.</_>\n                <_>1 11 1 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0228521898388863</threshold>\n            <left_val>0.4778693020343781</left_val>\n            <right_val>0.7609264254570007</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 7 -1.</_>\n                <_>12 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2305970136076212e-004</threshold>\n            <left_val>0.5340992212295532</left_val>\n            <right_val>0.4671724140644074</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 7 -1.</_>\n                <_>7 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127701200544834</threshold>\n            <left_val>0.4965761005878449</left_val>\n            <right_val>0.1472366005182266</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 16 8 4 -1.</_>\n                <_>11 16 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0500515103340149</threshold>\n            <left_val>0.6414994001388550</left_val>\n            <right_val>0.5016592144966126</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 16 8 4 -1.</_>\n                <_>5 16 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0157752707600594</threshold>\n            <left_val>0.4522320032119751</left_val>\n            <right_val>0.5685362219810486</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 7 -1.</_>\n                <_>13 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0185016207396984</threshold>\n            <left_val>0.2764748930931091</left_val>\n            <right_val>0.5137959122657776</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 7 -1.</_>\n                <_>6 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4626250378787518e-003</threshold>\n            <left_val>0.5141941905021668</left_val>\n            <right_val>0.3795408010482788</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 6 2 14 -1.</_>\n                <_>18 13 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0629161670804024</threshold>\n            <left_val>0.5060648918151856</left_val>\n            <right_val>0.6580433845520020</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 4 -1.</_>\n                <_>6 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1648500478477217e-005</threshold>\n            <left_val>0.5195388197898865</left_val>\n            <right_val>0.4019886851310730</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 1 2 -1.</_>\n                <_>14 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1180990152060986e-003</threshold>\n            <left_val>0.4962365031242371</left_val>\n            <right_val>0.5954458713531494</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 18 6 -1.</_>\n                <_>0 1 9 3 2.</_>\n                <_>9 4 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0166348908096552</threshold>\n            <left_val>0.3757933080196381</left_val>\n            <right_val>0.5175446867942810</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 1 2 -1.</_>\n                <_>14 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8899470344185829e-003</threshold>\n            <left_val>0.6624013781547546</left_val>\n            <right_val>0.5057178735733032</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 2 14 -1.</_>\n                <_>0 13 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0767832621932030</threshold>\n            <left_val>0.4795796871185303</left_val>\n            <right_val>0.8047714829444885</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 0 3 12 -1.</_>\n                <_>18 0 1 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9170677773654461e-003</threshold>\n            <left_val>0.4937882125377655</left_val>\n            <right_val>0.5719941854476929</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 18 3 -1.</_>\n                <_>0 7 18 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0726706013083458</threshold>\n            <left_val>0.0538945607841015</left_val>\n            <right_val>0.4943903982639313</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 14 16 -1.</_>\n                <_>6 8 14 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.5403950214385986</threshold>\n            <left_val>0.5129774212837219</left_val>\n            <right_val>0.1143338978290558</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 3 12 -1.</_>\n                <_>1 0 1 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9510019812732935e-003</threshold>\n            <left_val>0.4528343975543976</left_val>\n            <right_val>0.5698574185371399</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 7 -1.</_>\n                <_>14 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4508369863033295e-003</threshold>\n            <left_val>0.5357726812362671</left_val>\n            <right_val>0.4218730926513672</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 1 2 -1.</_>\n                <_>5 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2077939724549651e-004</threshold>\n            <left_val>0.5916172862052918</left_val>\n            <right_val>0.4637925922870636</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 6 6 -1.</_>\n                <_>14 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3051050268113613e-003</threshold>\n            <left_val>0.5273385047912598</left_val>\n            <right_val>0.4382042884826660</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 7 2 -1.</_>\n                <_>5 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7735060798004270e-004</threshold>\n            <left_val>0.4046528041362763</left_val>\n            <right_val>0.5181884765625000</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 6 9 -1.</_>\n                <_>8 9 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0259285103529692</threshold>\n            <left_val>0.7452235817909241</left_val>\n            <right_val>0.5089386105537415</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 1 -1.</_>\n                <_>7 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9729790985584259e-003</threshold>\n            <left_val>0.3295435905456543</left_val>\n            <right_val>0.5058795213699341</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 6 4 -1.</_>\n                <_>16 0 3 2 2.</_>\n                <_>13 2 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8508329093456268e-003</threshold>\n            <left_val>0.4857144057750702</left_val>\n            <right_val>0.5793024897575378</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 12 -1.</_>\n                <_>1 6 18 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0459675192832947</threshold>\n            <left_val>0.4312731027603149</left_val>\n            <right_val>0.5380653142929077</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 17 12 -1.</_>\n                <_>3 6 17 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1558596044778824</threshold>\n            <left_val>0.5196170210838318</left_val>\n            <right_val>0.1684713959693909</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 14 7 3 -1.</_>\n                <_>5 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0151648297905922</threshold>\n            <left_val>0.4735757112503052</left_val>\n            <right_val>0.6735026836395264</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0604249546304345e-003</threshold>\n            <left_val>0.5822926759719849</left_val>\n            <right_val>0.4775702953338623</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 3 3 -1.</_>\n                <_>3 15 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6476291976869106e-003</threshold>\n            <left_val>0.4999198913574219</left_val>\n            <right_val>0.2319535017013550</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 6 6 -1.</_>\n                <_>14 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0122311301529408</threshold>\n            <left_val>0.4750893115997315</left_val>\n            <right_val>0.5262982249259949</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 6 6 -1.</_>\n                <_>0 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6528882123529911e-003</threshold>\n            <left_val>0.5069767832756043</left_val>\n            <right_val>0.3561818897724152</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2977829901501536e-003</threshold>\n            <left_val>0.4875693917274475</left_val>\n            <right_val>0.5619062781333923</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 4 3 -1.</_>\n                <_>4 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0107815898954868</threshold>\n            <left_val>0.4750770032405853</left_val>\n            <right_val>0.6782308220863342</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 0 2 6 -1.</_>\n                <_>18 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8654779307544231e-003</threshold>\n            <left_val>0.5305461883544922</left_val>\n            <right_val>0.4290736019611359</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 4 9 -1.</_>\n                <_>10 1 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8663428965955973e-003</threshold>\n            <left_val>0.4518479108810425</left_val>\n            <right_val>0.5539351105690002</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 2 -1.</_>\n                <_>6 6 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1983320154249668e-003</threshold>\n            <left_val>0.4149119853973389</left_val>\n            <right_val>0.5434188842773438</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 4 2 -1.</_>\n                <_>6 5 2 1 2.</_>\n                <_>8 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3739990107715130e-003</threshold>\n            <left_val>0.4717896878719330</left_val>\n            <right_val>0.6507657170295715</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 2 3 -1.</_>\n                <_>10 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146415298804641</threshold>\n            <left_val>0.2172164022922516</left_val>\n            <right_val>0.5161777138710022</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 1 3 -1.</_>\n                <_>9 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5042580344015732e-005</threshold>\n            <left_val>0.5337383747100830</left_val>\n            <right_val>0.4298836886882782</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 2 -1.</_>\n                <_>9 11 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1875660129589960e-004</threshold>\n            <left_val>0.4604594111442566</left_val>\n            <right_val>0.5582447052001953</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 4 3 -1.</_>\n                <_>0 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0169955305755138</threshold>\n            <left_val>0.4945895075798035</left_val>\n            <right_val>0.0738800764083862</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 6 -1.</_>\n                <_>6 3 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0350959412753582</threshold>\n            <left_val>0.7005509138107300</left_val>\n            <right_val>0.4977591037750244</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 6 4 -1.</_>\n                <_>1 0 3 2 2.</_>\n                <_>4 2 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4217350874096155e-003</threshold>\n            <left_val>0.4466265141963959</left_val>\n            <right_val>0.5477694272994995</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 7 -1.</_>\n                <_>14 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.6340337768197060e-004</threshold>\n            <left_val>0.4714098870754242</left_val>\n            <right_val>0.5313338041305542</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 2 -1.</_>\n                <_>9 17 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6391130338888615e-004</threshold>\n            <left_val>0.4331546127796173</left_val>\n            <right_val>0.5342242121696472</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 6 10 -1.</_>\n                <_>11 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0211414601653814</threshold>\n            <left_val>0.2644700109958649</left_val>\n            <right_val>0.5204498767852783</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 19 2 -1.</_>\n                <_>0 11 19 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7775202700868249e-004</threshold>\n            <left_val>0.5208349823951721</left_val>\n            <right_val>0.4152742922306061</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 8 9 -1.</_>\n                <_>9 8 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0279439203441143</threshold>\n            <left_val>0.6344125270843506</left_val>\n            <right_val>0.5018811821937561</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 3 7 -1.</_>\n                <_>5 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7297378554940224e-003</threshold>\n            <left_val>0.5050438046455383</left_val>\n            <right_val>0.3500863909721375</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 12 -1.</_>\n                <_>10 6 2 6 2.</_>\n                <_>8 12 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0232810396701097</threshold>\n            <left_val>0.4966318011283875</left_val>\n            <right_val>0.6968677043914795</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 4 -1.</_>\n                <_>0 4 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116449799388647</threshold>\n            <left_val>0.3300260007381439</left_val>\n            <right_val>0.5049629807472229</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0157643090933561</threshold>\n            <left_val>0.4991598129272461</left_val>\n            <right_val>0.7321153879165649</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 3 7 -1.</_>\n                <_>9 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3611479662358761e-003</threshold>\n            <left_val>0.3911735117435455</left_val>\n            <right_val>0.5160670876502991</right_val></_></_>\n        <_>\n          <!-- tree 177 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 3 4 -1.</_>\n                <_>10 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1522337859496474e-004</threshold>\n            <left_val>0.5628911256790161</left_val>\n            <right_val>0.4949719011783600</right_val></_></_>\n        <_>\n          <!-- tree 178 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 3 4 -1.</_>\n                <_>9 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0066272271797061e-004</threshold>\n            <left_val>0.5853595137596130</left_val>\n            <right_val>0.4550595879554749</right_val></_></_>\n        <_>\n          <!-- tree 179 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 1 -1.</_>\n                <_>9 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9715518252924085e-004</threshold>\n            <left_val>0.4271470010280609</left_val>\n            <right_val>0.5443599224090576</right_val></_></_>\n        <_>\n          <!-- tree 180 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 4 4 -1.</_>\n                <_>7 14 2 2 2.</_>\n                <_>9 16 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3475370835512877e-003</threshold>\n            <left_val>0.5143110752105713</left_val>\n            <right_val>0.3887656927108765</right_val></_></_>\n        <_>\n          <!-- tree 181 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 4 6 -1.</_>\n                <_>15 14 2 3 2.</_>\n                <_>13 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9261569082736969e-003</threshold>\n            <left_val>0.6044502258300781</left_val>\n            <right_val>0.4971720874309540</right_val></_></_>\n        <_>\n          <!-- tree 182 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 1 8 -1.</_>\n                <_>7 12 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0139199104160070</threshold>\n            <left_val>0.2583160996437073</left_val>\n            <right_val>0.5000367760658264</right_val></_></_>\n        <_>\n          <!-- tree 183 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 2 8 -1.</_>\n                <_>17 0 1 4 2.</_>\n                <_>16 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0209949687123299e-003</threshold>\n            <left_val>0.4857374131679535</left_val>\n            <right_val>0.5560358166694641</right_val></_></_>\n        <_>\n          <!-- tree 184 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 2 8 -1.</_>\n                <_>2 0 1 4 2.</_>\n                <_>3 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7441629208624363e-003</threshold>\n            <left_val>0.5936884880065918</left_val>\n            <right_val>0.4645777046680450</right_val></_></_>\n        <_>\n          <!-- tree 185 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 14 3 -1.</_>\n                <_>6 2 14 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0162001308053732</threshold>\n            <left_val>0.3163014948368073</left_val>\n            <right_val>0.5193495154380798</right_val></_></_>\n        <_>\n          <!-- tree 186 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 9 3 10 -1.</_>\n                <_>7 14 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3331980705261230e-003</threshold>\n            <left_val>0.5061224102973938</left_val>\n            <right_val>0.3458878993988037</right_val></_></_>\n        <_>\n          <!-- tree 187 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 2 -1.</_>\n                <_>9 15 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8497930876910686e-004</threshold>\n            <left_val>0.4779017865657806</left_val>\n            <right_val>0.5870177745819092</right_val></_></_>\n        <_>\n          <!-- tree 188 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 8 -1.</_>\n                <_>7 11 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2466450463980436e-003</threshold>\n            <left_val>0.4297851026058197</left_val>\n            <right_val>0.5374773144721985</right_val></_></_>\n        <_>\n          <!-- tree 189 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 6 -1.</_>\n                <_>9 10 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3146099410951138e-003</threshold>\n            <left_val>0.5438671708106995</left_val>\n            <right_val>0.4640969932079315</right_val></_></_>\n        <_>\n          <!-- tree 190 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 3 3 -1.</_>\n                <_>7 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7679121643304825e-003</threshold>\n            <left_val>0.4726893007755280</left_val>\n            <right_val>0.6771789789199829</right_val></_></_>\n        <_>\n          <!-- tree 191 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2448020172305405e-004</threshold>\n            <left_val>0.4229173064231873</left_val>\n            <right_val>0.5428048968315125</right_val></_></_>\n        <_>\n          <!-- tree 192 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 18 2 -1.</_>\n                <_>6 1 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4336021207273006e-003</threshold>\n            <left_val>0.6098880767822266</left_val>\n            <right_val>0.4683673977851868</right_val></_></_>\n        <_>\n          <!-- tree 193 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 14 -1.</_>\n                <_>7 8 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3189240600913763e-003</threshold>\n            <left_val>0.5689436793327332</left_val>\n            <right_val>0.4424242079257965</right_val></_></_>\n        <_>\n          <!-- tree 194 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 1 -1.</_>\n                <_>7 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1042178850620985e-003</threshold>\n            <left_val>0.3762221038341522</left_val>\n            <right_val>0.5187087059020996</right_val></_></_>\n        <_>\n          <!-- tree 195 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>9 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6034841216169298e-004</threshold>\n            <left_val>0.4699405133724213</left_val>\n            <right_val>0.5771207213401794</right_val></_></_>\n        <_>\n          <!-- tree 196 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 9 -1.</_>\n                <_>10 3 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0547629790380597e-003</threshold>\n            <left_val>0.4465216994285584</left_val>\n            <right_val>0.5601701736450195</right_val></_></_>\n        <_>\n          <!-- tree 197 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 14 2 3 -1.</_>\n                <_>18 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7148818420246243e-004</threshold>\n            <left_val>0.5449805259704590</left_val>\n            <right_val>0.3914709091186523</right_val></_></_>\n        <_>\n          <!-- tree 198 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 3 1 -1.</_>\n                <_>8 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3364820410497487e-004</threshold>\n            <left_val>0.4564009010791779</left_val>\n            <right_val>0.5645738840103149</right_val></_></_>\n        <_>\n          <!-- tree 199 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 4 -1.</_>\n                <_>11 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4853250468149781e-003</threshold>\n            <left_val>0.5747377872467041</left_val>\n            <right_val>0.4692778885364533</right_val></_></_>\n        <_>\n          <!-- tree 200 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 3 6 -1.</_>\n                <_>8 14 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0251620337367058e-003</threshold>\n            <left_val>0.5166196823120117</left_val>\n            <right_val>0.3762814104557037</right_val></_></_>\n        <_>\n          <!-- tree 201 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 4 -1.</_>\n                <_>11 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0280741415917873e-003</threshold>\n            <left_val>0.5002111792564392</left_val>\n            <right_val>0.6151527166366577</right_val></_></_>\n        <_>\n          <!-- tree 202 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 4 -1.</_>\n                <_>8 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8164511574432254e-004</threshold>\n            <left_val>0.5394598245620728</left_val>\n            <right_val>0.4390751123428345</right_val></_></_>\n        <_>\n          <!-- tree 203 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 9 6 9 -1.</_>\n                <_>7 12 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0451415292918682</threshold>\n            <left_val>0.5188326835632324</left_val>\n            <right_val>0.2063035964965820</right_val></_></_>\n        <_>\n          <!-- tree 204 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 2 3 -1.</_>\n                <_>0 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0795620037242770e-003</threshold>\n            <left_val>0.3904685080051422</left_val>\n            <right_val>0.5137907266616821</right_val></_></_>\n        <_>\n          <!-- tree 205 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 1 2 -1.</_>\n                <_>11 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5995999274309725e-004</threshold>\n            <left_val>0.4895322918891907</left_val>\n            <right_val>0.5427504181861877</right_val></_></_>\n        <_>\n          <!-- tree 206 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 8 3 -1.</_>\n                <_>8 3 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0193592701107264</threshold>\n            <left_val>0.6975228786468506</left_val>\n            <right_val>0.4773507118225098</right_val></_></_>\n        <_>\n          <!-- tree 207 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 20 6 -1.</_>\n                <_>0 4 10 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.2072550952434540</threshold>\n            <left_val>0.5233635902404785</left_val>\n            <right_val>0.3034991919994354</right_val></_></_>\n        <_>\n          <!-- tree 208 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 1 3 -1.</_>\n                <_>9 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1953290929086506e-004</threshold>\n            <left_val>0.5419396758079529</left_val>\n            <right_val>0.4460186064243317</right_val></_></_>\n        <_>\n          <!-- tree 209 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2582069505006075e-003</threshold>\n            <left_val>0.4815764129161835</left_val>\n            <right_val>0.6027408838272095</right_val></_></_>\n        <_>\n          <!-- tree 210 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 14 4 -1.</_>\n                <_>0 17 14 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7811207845807076e-003</threshold>\n            <left_val>0.3980278968811035</left_val>\n            <right_val>0.5183305740356445</right_val></_></_>\n        <_>\n          <!-- tree 211 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 18 6 -1.</_>\n                <_>1 17 18 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0111543098464608</threshold>\n            <left_val>0.5431231856346130</left_val>\n            <right_val>0.4188759922981262</right_val></_></_>\n        <_>\n          <!-- tree 212 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 10 6 -1.</_>\n                <_>0 0 5 3 2.</_>\n                <_>5 3 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0431624315679073</threshold>\n            <left_val>0.4738228023052216</left_val>\n            <right_val>0.6522961258888245</right_val></_></_></trees>\n      <stage_threshold>105.7611007690429700</stage_threshold>\n      <parent>20</parent>\n      <next>-1</next></_></stages></haarcascade_frontalface_alt>\n</opencv_storage>\n"
  },
  {
    "path": "examples/hello.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nfunc main() {\n\trobot := gobot.NewRobot(\n\t\tfunc() {\n\t\t\tgobot.Every(500*time.Millisecond, func() { fmt.Println(\"Greetings human\") })\n\t\t},\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/hello_api.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"html\"\n\t\"net/http\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\n\ta := api.NewAPI(manager)\n\ta.AddHandler(func(w http.ResponseWriter, r *http.Request) {\n\t\tfmt.Fprintf(w, \"Hello, %q \\n\", html.EscapeString(r.URL.Path))\n\t})\n\ta.Debug()\n\ta.Start()\n\n\tmanager.AddCommand(\"custom_gobot_command\",\n\t\tfunc(params map[string]interface{}) interface{} {\n\t\t\treturn \"This command is attached to the mcp!\"\n\t\t})\n\n\thello := manager.AddRobot(gobot.NewRobot(\"hello\"))\n\n\thello.AddCommand(\"hi_there\", func(params map[string]interface{}) interface{} {\n\t\treturn fmt.Sprintf(\"This command is attached to the robot %v\", hello.Name)\n\t})\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/hello_api_auth.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"html\"\n\t\"net/http\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\n\ta := api.NewAPI(manager)\n\ta.AddHandler(api.BasicAuth(\"gort\", \"klatuu\"))\n\ta.Debug()\n\n\ta.AddHandler(func(w http.ResponseWriter, r *http.Request) {\n\t\tfmt.Fprintf(w, \"Hello, %q \\n\", html.EscapeString(r.URL.Path))\n\t})\n\ta.Start()\n\n\tmanager.AddCommand(\"custom_gobot_command\",\n\t\tfunc(params map[string]interface{}) interface{} {\n\t\t\treturn \"This command is attached to the mcp!\"\n\t\t})\n\n\thello := manager.AddRobot(gobot.NewRobot(\"hello\"))\n\n\thello.AddCommand(\"hi_there\", func(params map[string]interface{}) interface{} {\n\t\treturn fmt.Sprintf(\"This command is attached to the robot %v\", hello.Name)\n\t})\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/hello_api_custom.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\n\ta := api.NewAPI(manager)\n\n\t// creates routes/handlers for the custom API\n\ta.Get(\"/\", func(res http.ResponseWriter, req *http.Request) {\n\t\tif _, err := res.Write([]byte(\"OK\")); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t})\n\ta.Get(\"/api/hello\", func(res http.ResponseWriter, req *http.Request) {\n\t\tmsg := fmt.Sprintf(\"This command is attached to the robot %v\", manager.Robot(\"hello\").Name)\n\t\tif _, err := res.Write([]byte(msg)); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t})\n\n\t// starts the API without the default C2PIO API and Robeaux web interface.\n\ta.StartWithoutDefaults()\n\n\tmanager.AddRobot(gobot.NewRobot(\"hello\"))\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/hello_api_video.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/hybridgroup/mjpeg\"\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gocv.io/x/gocv\"\n)\n\nvar (\n\tdeviceID int\n\terr      error\n\twebcam   *gocv.VideoCapture\n\tstream   *mjpeg.Stream\n)\n\nfunc main() {\n\t// parse args\n\tdeviceID := os.Args[1]\n\n\tmanager := gobot.NewManager()\n\n\ta := api.NewAPI(manager)\n\n\t// add the standard C3PIO API routes manually.\n\ta.AddC3PIORoutes()\n\n\t// starts the API without the default C2PIO API and Robeaux web interface.\n\t// However, the C3PIO API was added manually using a.AddC3PIORoutes() which\n\t// means the REST API will be available, but not the web interface.\n\ta.StartWithoutDefaults()\n\n\thello := manager.AddRobot(gobot.NewRobot(\"hello\"))\n\n\thello.AddCommand(\"hi_there\", func(params map[string]interface{}) interface{} {\n\t\treturn fmt.Sprintf(\"This command is attached to the robot %v\", hello.Name)\n\t})\n\n\t// open webcam\n\twebcam, err = gocv.OpenVideoCapture(deviceID)\n\tif err != nil {\n\t\tfmt.Printf(\"Error opening capture device: %v\\n\", deviceID)\n\t\treturn\n\t}\n\tdefer webcam.Close()\n\n\t// create the mjpeg stream\n\tstream = mjpeg.NewStream()\n\thttp.Handle(\"/video\", stream)\n\n\t// start capturing\n\tgo mjpegCapture()\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc mjpegCapture() {\n\timg := gocv.NewMat()\n\tdefer img.Close()\n\n\tfor {\n\t\tif ok := webcam.Read(&img); !ok {\n\t\t\tfmt.Printf(\"Device closed: %v\\n\", deviceID)\n\t\t\treturn\n\t\t}\n\t\tif img.Empty() {\n\t\t\tcontinue\n\t\t}\n\n\t\tbuf, _ := gocv.IMEncode(\".jpg\", img)\n\t\tstream.UpdateJPEG(buf)\n\t}\n}\n"
  },
  {
    "path": "examples/holystone_hs200.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n\tgo run examples/holystone_hs200.go\n\n*/\n\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/holystone/hs200\"\n)\n\nfunc main() {\n\tdrone := hs200.NewDriver(\"172.16.10.1:8888\", \"172.16.10.1:8080\")\n\n\twork := func() {\n\t\tdrone.TakeOff()\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tdrone.Land()\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"hs200\",\n\t\t[]gobot.Connection{},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/jetson-nano_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/jetson\"\n)\n\nfunc main() {\n\tr := jetson.NewAdaptor()\n\tled := gpio.NewLedDriver(r, \"40\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/jetson-nano_servo.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\n//\n// before to run\n// 1. check Jetson io pwm pin configure `sudo /opt/nvidia/jetson-io/jetson-io.py`\n// 2. if end pin configure, reboot Jetson nano.\n// 3. run gobot\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/jetson\"\n)\n\nfunc main() {\n\tjetsonAdaptor := jetson.NewAdaptor()\n\tservo := gpio.NewServoDriver(jetsonAdaptor, \"32\")\n\n\tcounter := 0\n\tflg := true\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tlog.Println(\"Turning\", counter)\n\t\t\tif err := servo.Move(uint8(counter)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tswitch counter {\n\t\t\tcase 140:\n\t\t\t\tflg = false\n\t\t\tcase 30:\n\t\t\t\tflg = true\n\t\t\t}\n\n\t\t\tif flg {\n\t\t\t\tcounter = counter + 1\n\t\t\t} else {\n\t\t\t\tcounter = counter - 1\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"Jetsonservo\",\n\t\t[]gobot.Connection{jetsonAdaptor},\n\t\t[]gobot.Device{servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joule_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n\te := joule.NewAdaptor()\n\tled := gpio.NewLedDriver(e, \"GP100\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joule_blinkm.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n\te := joule.NewAdaptor()\n\tblinkm := i2c.NewBlinkMDriver(e, i2c.WithBus(0), i2c.WithAddress(0x09))\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := byte(gobot.Rand(255))\n\t\t\tg := byte(gobot.Rand(255))\n\t\t\tb := byte(gobot.Rand(255))\n\t\t\tif err := blinkm.Rgb(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tcolor, err := blinkm.Color()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"color %v\\n\", color)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkmBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{blinkm},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joule_grove_lcd.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n\tboard := joule.NewAdaptor()\n\tscreen := i2c.NewGroveLcdDriver(board)\n\n\twork := func() {\n\t\tif err := screen.Write(\"hello\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tif err := screen.SetRGB(255, 0, 0); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := screen.Clear(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.Home(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.SetRGB(0, 255, 0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// set a custom character in the first position\n\t\t\tif err := screen.SetCustomChar(0, i2c.CustomLCDChars[\"smiley\"]); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// add the custom character at the end of the string\n\t\t\tif err := screen.Write(\"goodbye\\nhave a nice day \" + string(byte(0))); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t\tif err := screen.Scroll(false); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tif err := screen.Home(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1 * time.Second)\n\t\tif err := screen.SetRGB(0, 0, 255); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"screenBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{screen},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joule_grove_rotary_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n\tboard := joule.NewAdaptor()\n\tads1015 := i2c.NewADS1015Driver(board)\n\tsensor := aio.NewGroveRotaryDriver(ads1015, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{ads1015, sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joule_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n\te := joule.NewAdaptor()\n\tled := gpio.NewLedDriver(e, \"J12_26\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joule_led_brightness_with_analog_input.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n\te := joule.NewAdaptor()\n\tads1015 := i2c.NewADS1015Driver(e)\n\tsensor := aio.NewAnalogSensorDriver(ads1015, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\tled := gpio.NewLedDriver(e, \"J12_26\")\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tbrightness := uint8(gobot.ToScale(gobot.FromScale(float64(data.(int)), 0, 1023), 0, 255))\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t\tfmt.Println(\"brightness\", brightness)\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{ads1015, sensor, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joule_leds.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n\te := joule.NewAdaptor()\n\tled0 := gpio.NewLedDriver(e, \"GP100\")\n\tled1 := gpio.NewLedDriver(e, \"GP101\")\n\tled2 := gpio.NewLedDriver(e, \"GP102\")\n\tled3 := gpio.NewLedDriver(e, \"GP103\")\n\n\twork := func() {\n\t\tif err := led0.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := led1.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := led2.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := led3.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led0.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tif err := led1.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(4*time.Second, func() {\n\t\t\tif err := led2.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(8*time.Second, func() {\n\t\t\tif err := led3.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{e},\n\t\t[]gobot.Device{led0, led1, led2, led3},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joystick_ps3.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, joystick.Dualshock3)\n\n\twork := func() {\n\t\t// buttons\n\t\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\t\tfmt.Println(\"square_press\")\n\t\t})\n\t\t_ = stick.On(joystick.SquareRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"square_release\")\n\t\t})\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tfmt.Println(\"triangle_press\")\n\t\t})\n\t\t_ = stick.On(joystick.TriangleRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"triangle_release\")\n\t\t})\n\t\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\t\tfmt.Println(\"circle_press\")\n\t\t})\n\t\t_ = stick.On(joystick.CircleRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"circle_release\")\n\t\t})\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tfmt.Println(\"x_press\")\n\t\t})\n\t\t_ = stick.On(joystick.XRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"x_release\")\n\t\t})\n\t\t_ = stick.On(joystick.StartPress, func(data interface{}) {\n\t\t\tfmt.Println(\"start_press\")\n\t\t})\n\t\t_ = stick.On(joystick.StartRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"start_release\")\n\t\t})\n\t\t_ = stick.On(joystick.SelectPress, func(data interface{}) {\n\t\t\tfmt.Println(\"select_press\")\n\t\t})\n\t\t_ = stick.On(joystick.SelectRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"select_release\")\n\t\t})\n\t\t_ = stick.On(joystick.HomePress, func(data interface{}) {\n\t\t\tfmt.Println(\"home_press\")\n\t\t})\n\t\t_ = stick.On(joystick.HomeRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"home_release\")\n\t\t})\n\t\t_ = stick.On(joystick.RightPress, func(data interface{}) {\n\t\t\tfmt.Println(\"right_press\")\n\t\t})\n\t\t_ = stick.On(joystick.RightRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"right_release\")\n\t\t})\n\t\t_ = stick.On(joystick.LeftPress, func(data interface{}) {\n\t\t\tfmt.Println(\"left_press\")\n\t\t})\n\t\t_ = stick.On(joystick.LeftRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"left_release\")\n\t\t})\n\t\t_ = stick.On(joystick.UpPress, func(data interface{}) {\n\t\t\tfmt.Println(\"up_press\")\n\t\t})\n\t\t_ = stick.On(joystick.UpRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"up_release\")\n\t\t})\n\t\t_ = stick.On(joystick.DownPress, func(data interface{}) {\n\t\t\tfmt.Println(\"down_press\")\n\t\t})\n\t\t_ = stick.On(joystick.DownRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"down_release\")\n\t\t})\n\n\t\t// joysticks\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tfmt.Println(\"left_x\", data)\n\t\t})\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tfmt.Println(\"left_y\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tfmt.Println(\"right_x\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tfmt.Println(\"right_y\", data)\n\t\t})\n\n\t\t// triggers\n\t\t_ = stick.On(joystick.R1Press, func(data interface{}) {\n\t\t\tfmt.Println(\"R1Press\", data)\n\t\t})\n\t\t_ = stick.On(joystick.R1Release, func(data interface{}) {\n\t\t\tfmt.Println(\"R1Release\", data)\n\t\t})\n\t\t_ = stick.On(joystick.R2Press, func(data interface{}) {\n\t\t\tfmt.Println(\"R2Press\", data)\n\t\t})\n\t\t_ = stick.On(joystick.R2Release, func(data interface{}) {\n\t\t\tfmt.Println(\"R2Release\", data)\n\t\t})\n\t\t_ = stick.On(joystick.L1Press, func(data interface{}) {\n\t\t\tfmt.Println(\"L1Press\", data)\n\t\t})\n\t\t_ = stick.On(joystick.L1Release, func(data interface{}) {\n\t\t\tfmt.Println(\"L1Release\", data)\n\t\t})\n\t\t_ = stick.On(joystick.L2Press, func(data interface{}) {\n\t\t\tfmt.Println(\"L2Press\", data)\n\t\t})\n\t\t_ = stick.On(joystick.L2Release, func(data interface{}) {\n\t\t\tfmt.Println(\"L2Release\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"joystickBot\",\n\t\t[]gobot.Connection{joystickAdaptor},\n\t\t[]gobot.Device{stick},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joystick_ps4.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, joystick.Dualshock4)\n\n\twork := func() {\n\t\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\t\tfmt.Println(\"square_press\")\n\t\t})\n\t\t_ = stick.On(joystick.SquareRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"square_release\")\n\t\t})\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tfmt.Println(\"triangle_press\")\n\t\t})\n\t\t_ = stick.On(joystick.TriangleRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"triangle_release\")\n\t\t})\n\t\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\t\tfmt.Println(\"circle_press\")\n\t\t})\n\t\t_ = stick.On(joystick.CircleRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"circle_release\")\n\t\t})\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tfmt.Println(\"x_press\")\n\t\t})\n\t\t_ = stick.On(joystick.XRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"x_release\")\n\t\t})\n\t\t_ = stick.On(joystick.HomePress, func(data interface{}) {\n\t\t\tfmt.Println(\"home_press\")\n\t\t})\n\t\t_ = stick.On(joystick.HomeRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"home_release\")\n\t\t})\n\t\t_ = stick.On(joystick.SharePress, func(data interface{}) {\n\t\t\tfmt.Println(\"share_press\")\n\t\t})\n\t\t_ = stick.On(joystick.ShareRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"share_release\")\n\t\t})\n\t\t_ = stick.On(joystick.OptionsPress, func(data interface{}) {\n\t\t\tfmt.Println(\"options_press\")\n\t\t})\n\t\t_ = stick.On(joystick.OptionsRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"options_release\")\n\t\t})\n\t\t_ = stick.On(joystick.L1Press, func(data interface{}) {\n\t\t\tfmt.Println(\"l1_press\")\n\t\t})\n\t\t_ = stick.On(joystick.L1Release, func(data interface{}) {\n\t\t\tfmt.Println(\"l1_release\")\n\t\t})\n\t\t_ = stick.On(joystick.L2Press, func(data interface{}) {\n\t\t\tfmt.Println(\"l2_press\")\n\t\t})\n\t\t_ = stick.On(joystick.L2Release, func(data interface{}) {\n\t\t\tfmt.Println(\"l2_release\")\n\t\t})\n\t\t_ = stick.On(joystick.R1Press, func(data interface{}) {\n\t\t\tfmt.Println(\"r1_press\")\n\t\t})\n\t\t_ = stick.On(joystick.R1Release, func(data interface{}) {\n\t\t\tfmt.Println(\"r1_release\")\n\t\t})\n\t\t_ = stick.On(joystick.R2Press, func(data interface{}) {\n\t\t\tfmt.Println(\"r2_press\")\n\t\t})\n\t\t_ = stick.On(joystick.R2Release, func(data interface{}) {\n\t\t\tfmt.Println(\"r2_release\")\n\t\t})\n\n\t\t_ = stick.On(joystick.UpPress, func(data interface{}) {\n\t\t\tfmt.Println(\"up_press\")\n\t\t})\n\t\t_ = stick.On(joystick.UpRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"up_release\")\n\t\t})\n\t\t_ = stick.On(joystick.DownPress, func(data interface{}) {\n\t\t\tfmt.Println(\"down_press\")\n\t\t})\n\t\t_ = stick.On(joystick.DownRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"down_release\")\n\t\t})\n\t\t_ = stick.On(joystick.RightPress, func(data interface{}) {\n\t\t\tfmt.Println(\"right_press\")\n\t\t})\n\t\t_ = stick.On(joystick.RightRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"right_release\")\n\t\t})\n\t\t_ = stick.On(joystick.LeftPress, func(data interface{}) {\n\t\t\tfmt.Println(\"left_press\")\n\t\t})\n\t\t_ = stick.On(joystick.LeftRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"left_release\")\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tfmt.Println(\"left_x\", data)\n\t\t})\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tfmt.Println(\"left_y\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tfmt.Println(\"right_x\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tfmt.Println(\"right_y\", data)\n\t\t})\n\t\t_ = stick.On(joystick.L2, func(data interface{}) {\n\t\t\tfmt.Println(\"L2\", data)\n\t\t})\n\t\t_ = stick.On(joystick.R2, func(data interface{}) {\n\t\t\tfmt.Println(\"R2\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"joystickBot\",\n\t\t[]gobot.Connection{joystickAdaptor},\n\t\t[]gobot.Device{stick},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joystick_ps5.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, joystick.Dualsense)\n\n\twork := func() {\n\t\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\t\tfmt.Println(\"square_press\")\n\t\t})\n\t\t_ = stick.On(joystick.SquareRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"square_release\")\n\t\t})\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tfmt.Println(\"triangle_press\")\n\t\t})\n\t\t_ = stick.On(joystick.TriangleRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"triangle_release\")\n\t\t})\n\t\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\t\tfmt.Println(\"circle_press\")\n\t\t})\n\t\t_ = stick.On(joystick.CircleRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"circle_release\")\n\t\t})\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tfmt.Println(\"x_press\")\n\t\t})\n\t\t_ = stick.On(joystick.XRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"x_release\")\n\t\t})\n\t\t_ = stick.On(joystick.HomePress, func(data interface{}) {\n\t\t\tfmt.Println(\"home_press\")\n\t\t})\n\t\t_ = stick.On(joystick.HomeRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"home_release\")\n\t\t})\n\t\t_ = stick.On(joystick.CreatePress, func(data interface{}) {\n\t\t\tfmt.Println(\"create_press\")\n\t\t})\n\t\t_ = stick.On(joystick.CreateRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"create_release\")\n\t\t})\n\t\t_ = stick.On(joystick.OptionsPress, func(data interface{}) {\n\t\t\tfmt.Println(\"options_press\")\n\t\t})\n\t\t_ = stick.On(joystick.OptionsRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"options_release\")\n\t\t})\n\t\t_ = stick.On(joystick.L1Press, func(data interface{}) {\n\t\t\tfmt.Println(\"l1_press\")\n\t\t})\n\t\t_ = stick.On(joystick.L1Release, func(data interface{}) {\n\t\t\tfmt.Println(\"l1_release\")\n\t\t})\n\t\t_ = stick.On(joystick.R1Press, func(data interface{}) {\n\t\t\tfmt.Println(\"r1_press\")\n\t\t})\n\t\t_ = stick.On(joystick.R1Release, func(data interface{}) {\n\t\t\tfmt.Println(\"r1_release\")\n\t\t})\n\t\t_ = stick.On(joystick.PSPress, func(data interface{}) {\n\t\t\tfmt.Println(\"ps_press\")\n\t\t})\n\t\t_ = stick.On(joystick.PSRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"ps_release\")\n\t\t})\n\t\t_ = stick.On(joystick.TrackpadPress, func(data interface{}) {\n\t\t\tfmt.Println(\"trackpad_press\")\n\t\t})\n\t\t_ = stick.On(joystick.TrackpadRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"trackpad_release\")\n\t\t})\n\n\t\t_ = stick.On(joystick.UpPress, func(data interface{}) {\n\t\t\tfmt.Println(\"up_press\")\n\t\t})\n\t\t_ = stick.On(joystick.UpRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"up_release\")\n\t\t})\n\t\t_ = stick.On(joystick.DownPress, func(data interface{}) {\n\t\t\tfmt.Println(\"down_press\")\n\t\t})\n\t\t_ = stick.On(joystick.DownRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"down_release\")\n\t\t})\n\t\t_ = stick.On(joystick.RightPress, func(data interface{}) {\n\t\t\tfmt.Println(\"right_press\")\n\t\t})\n\t\t_ = stick.On(joystick.RightRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"right_release\")\n\t\t})\n\t\t_ = stick.On(joystick.LeftPress, func(data interface{}) {\n\t\t\tfmt.Println(\"left_press\")\n\t\t})\n\t\t_ = stick.On(joystick.LeftRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"left_release\")\n\t\t})\n\n\t\t// _ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t// \tfmt.Println(\"left_x\", data)\n\t\t// })\n\t\t// _ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t// \tfmt.Println(\"left_y\", data)\n\t\t// })\n\t\t// _ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t// \tfmt.Println(\"right_x\", data)\n\t\t// })\n\t\t// _ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t// \tfmt.Println(\"right_y\", data)\n\t\t// })\n\t\t// _ = stick.On(joystick.L2, func(data interface{}) {\n\t\t// \tfmt.Println(\"L2\", data)\n\t\t// })\n\t\t// _ = stick.On(joystick.R2, func(data interface{}) {\n\t\t// \tfmt.Println(\"R2\", data)\n\t\t// })\n\t}\n\n\trobot := gobot.NewRobot(\"joystickBot\",\n\t\t[]gobot.Connection{joystickAdaptor},\n\t\t[]gobot.Device{stick},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joystick_xbox360.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, joystick.Xbox360)\n\n\twork := func() {\n\t\t_ = stick.On(joystick.APress, func(data interface{}) {\n\t\t\tfmt.Println(\"a_press\")\n\t\t})\n\t\t_ = stick.On(joystick.ARelease, func(data interface{}) {\n\t\t\tfmt.Println(\"a_release\")\n\t\t})\n\t\t_ = stick.On(joystick.BPress, func(data interface{}) {\n\t\t\tfmt.Println(\"b_press\")\n\t\t})\n\t\t_ = stick.On(joystick.BRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"b_release\")\n\t\t})\n\t\t_ = stick.On(joystick.UpPress, func(data interface{}) {\n\t\t\tfmt.Println(\"up\", data)\n\t\t})\n\t\t_ = stick.On(joystick.DownPress, func(data interface{}) {\n\t\t\tfmt.Println(\"down\", data)\n\t\t})\n\t\t_ = stick.On(joystick.LeftPress, func(data interface{}) {\n\t\t\tfmt.Println(\"left\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightPress, func(data interface{}) {\n\t\t\tfmt.Println(\"right\", data)\n\t\t})\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tfmt.Println(\"left_x\", data)\n\t\t})\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tfmt.Println(\"left_y\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tfmt.Println(\"right_x\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tfmt.Println(\"right_y\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"joystickBot\",\n\t\t[]gobot.Connection{joystickAdaptor},\n\t\t[]gobot.Device{stick},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joystick_xbox360_rock_band_drums.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, joystick.Xbox360RockBandDrums)\n\n\twork := func() {\n\t\t_ = stick.On(joystick.RedPress, func(data interface{}) {\n\t\t\tfmt.Println(\"red_press\")\n\t\t})\n\t\t_ = stick.On(joystick.RedRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"red_release\")\n\t\t})\n\t\t_ = stick.On(joystick.YellowPress, func(data interface{}) {\n\t\t\tfmt.Println(\"yellow_press\")\n\t\t})\n\t\t_ = stick.On(joystick.YellowRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"yellow_release\")\n\t\t})\n\t\t_ = stick.On(joystick.BluePress, func(data interface{}) {\n\t\t\tfmt.Println(\"blue_press\")\n\t\t})\n\t\t_ = stick.On(joystick.BlueRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"blue_release\")\n\t\t})\n\t\t_ = stick.On(joystick.GreenPress, func(data interface{}) {\n\t\t\tfmt.Println(\"green_press\")\n\t\t})\n\t\t_ = stick.On(joystick.GreenRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"blue_release\")\n\t\t})\n\t\t_ = stick.On(joystick.PedalPress, func(data interface{}) {\n\t\t\tfmt.Println(\"pedal_press\")\n\t\t})\n\t\t_ = stick.On(joystick.PedalRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"pedal_release\")\n\t\t})\n\t\t_ = stick.On(joystick.UpPress, func(data interface{}) {\n\t\t\tfmt.Println(\"up\", data)\n\t\t})\n\t\t_ = stick.On(joystick.DownPress, func(data interface{}) {\n\t\t\tfmt.Println(\"down\", data)\n\t\t})\n\t\t_ = stick.On(joystick.LeftPress, func(data interface{}) {\n\t\t\tfmt.Println(\"left\", data)\n\t\t})\n\t\t_ = stick.On(joystick.RightPress, func(data interface{}) {\n\t\t\tfmt.Println(\"right\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"joystickBot\",\n\t\t[]gobot.Connection{joystickAdaptor},\n\t\t[]gobot.Device{stick},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/joystick_xboxone.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tjoystick := joystick.NewDriver(joystickAdaptor, joystick.XboxOne)\n\n\twork := func() {\n\t\t// start button\n\t\t_ = joystick.On(joystick.Event(\"start_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"start_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"start_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"start_release\")\n\t\t})\n\n\t\t// back button\n\t\t_ = joystick.On(joystick.Event(\"back_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"back_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"back_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"back_release\")\n\t\t})\n\n\t\t// a button\n\t\t_ = joystick.On(joystick.Event(\"a_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"a_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"a_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"a_release\")\n\t\t})\n\n\t\t// b button\n\t\t_ = joystick.On(joystick.Event(\"b_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"b_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"b_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"b_release\")\n\t\t})\n\n\t\t// x button\n\t\t_ = joystick.On(joystick.Event(\"x_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"x_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"x_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"x_release\")\n\t\t})\n\n\t\t// y button\n\t\t_ = joystick.On(joystick.Event(\"y_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"y_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"y_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"y_release\")\n\t\t})\n\n\t\t// up dpad\n\t\t_ = joystick.On(joystick.Event(\"up_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"up_press\", data)\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"up_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"up_release\", data)\n\t\t})\n\n\t\t// down dpad\n\t\t_ = joystick.On(joystick.Event(\"down_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"down_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"down_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"down_release\")\n\t\t})\n\n\t\t// left dpad\n\t\t_ = joystick.On(joystick.Event(\"left_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"left_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"left_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"left_release\")\n\t\t})\n\n\t\t// right dpad\n\t\t_ = joystick.On(joystick.Event(\"right_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"right_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"right_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"right_release\")\n\t\t})\n\n\t\t// rt trigger\n\t\t_ = joystick.On(joystick.Event(\"rt\"), func(data interface{}) {\n\t\t\tfmt.Println(\"rt\", data)\n\t\t})\n\n\t\t// lt trigger\n\t\t_ = joystick.On(joystick.Event(\"lt\"), func(data interface{}) {\n\t\t\tfmt.Println(\"lt\", data)\n\t\t})\n\n\t\t// lb button\n\t\t_ = joystick.On(joystick.Event(\"lb_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"lb_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"lb_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"lb_release\")\n\t\t})\n\n\t\t// rb button\n\t\t_ = joystick.On(joystick.Event(\"rb_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"rb_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"rb_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"rb_release\")\n\t\t})\n\n\t\t// rx stick\n\t\t_ = joystick.On(joystick.Event(\"right_x\"), func(data interface{}) {\n\t\t\tfmt.Println(\"right_x\", data)\n\t\t})\n\n\t\t// ry stick\n\t\t_ = joystick.On(joystick.Event(\"right_y\"), func(data interface{}) {\n\t\t\tfmt.Println(\"right_y\", data)\n\t\t})\n\n\t\t// right_stick button\n\t\t_ = joystick.On(joystick.Event(\"right_stick_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"right_stick_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"right_stick_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"right_stick_release\")\n\t\t})\n\n\t\t// lx stick\n\t\t_ = joystick.On(joystick.Event(\"left_x\"), func(data interface{}) {\n\t\t\tfmt.Println(\"left_x\", data)\n\t\t})\n\n\t\t// ly stick\n\t\t_ = joystick.On(joystick.Event(\"left_y\"), func(data interface{}) {\n\t\t\tfmt.Println(\"left_y\", data)\n\t\t})\n\n\t\t// left_stick button\n\t\t_ = joystick.On(joystick.Event(\"left_stick_press\"), func(data interface{}) {\n\t\t\tfmt.Println(\"left_stick_press\")\n\t\t})\n\t\t_ = joystick.On(joystick.Event(\"left_stick_release\"), func(data interface{}) {\n\t\t\tfmt.Println(\"left_stick_release\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"joystickBot\",\n\t\t[]gobot.Connection{joystickAdaptor},\n\t\t[]gobot.Device{joystick},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/keyboard.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/keyboard\"\n)\n\nfunc main() {\n\tkeys := keyboard.NewDriver()\n\n\twork := func() {\n\t\t_ = keys.On(keyboard.Key, func(data interface{}) {\n\t\t\tkey := data.(keyboard.KeyEvent)\n\n\t\t\tif key.Key == keyboard.A {\n\t\t\t\tfmt.Println(\"A pressed!\")\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"keyboard event!\", key, key.Char)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"keyboardbot\",\n\t\t[]gobot.Connection{},\n\t\t[]gobot.Device{keys},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/keyboard_mqtt.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/keyboard\"\n\t\"gobot.io/x/gobot/v2/platforms/mqtt\"\n)\n\nfunc main() {\n\tkeys := keyboard.NewDriver()\n\tmqttAdaptor := mqtt.NewAdaptor(\"tcp://iot.eclipse.org:1883\", \"conductor\")\n\n\twork := func() {\n\t\t_ = keys.On(keyboard.Key, func(data interface{}) {\n\t\t\tkey := data.(keyboard.KeyEvent)\n\n\t\t\tswitch key.Key {\n\t\t\tcase keyboard.ArrowUp:\n\t\t\t\tmqttAdaptor.Publish(\"rover/frente\", []byte{})\n\t\t\tcase keyboard.ArrowRight:\n\t\t\t\tmqttAdaptor.Publish(\"rover/derecha\", []byte{})\n\t\t\tcase keyboard.ArrowDown:\n\t\t\t\tmqttAdaptor.Publish(\"rover/atras\", []byte{})\n\t\t\tcase keyboard.ArrowLeft:\n\t\t\t\tmqttAdaptor.Publish(\"rover/izquierda\", []byte{})\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"keyboardbot\",\n\t\t[]gobot.Connection{mqttAdaptor},\n\t\t[]gobot.Device{keys},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/leap_motion.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/leap\"\n)\n\nfunc main() {\n\tleapMotionAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n\tl := leap.NewDriver(leapMotionAdaptor)\n\n\twork := func() {\n\t\t_ = l.On(leap.MessageEvent, func(data interface{}) {\n\t\t\tfmt.Println(data.(leap.Frame))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"leapBot\",\n\t\t[]gobot.Connection{leapMotionAdaptor},\n\t\t[]gobot.Device{l},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/leap_motion_gestures.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/leap\"\n)\n\nfunc main() {\n\tleapMotionAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n\tl := leap.NewDriver(leapMotionAdaptor)\n\n\twork := func() {\n\t\t_ = l.On(leap.GestureEvent, func(data interface{}) {\n\t\t\tprintGesture(data.(leap.Gesture))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"leapBot\",\n\t\t[]gobot.Connection{leapMotionAdaptor},\n\t\t[]gobot.Device{l},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc printGesture(gesture leap.Gesture) {\n\tfmt.Println(\"Gesture\", gesture)\n}\n"
  },
  {
    "path": "examples/leap_motion_hands.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/leap\"\n)\n\nfunc main() {\n\tleapMotionAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n\tl := leap.NewDriver(leapMotionAdaptor)\n\n\twork := func() {\n\t\t_ = l.On(leap.HandEvent, func(data interface{}) {\n\t\t\tprintHand(data.(leap.Hand))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"leapBot\",\n\t\t[]gobot.Connection{leapMotionAdaptor},\n\t\t[]gobot.Device{l},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc printHand(hand leap.Hand) {\n\tfmt.Println(\"Hand\", hand)\n}\n"
  },
  {
    "path": "examples/leap_servos.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/leap\"\n)\n\n// Video: https://www.youtube.com/watch?v=ayNMyUfdAqc\nfunc main() {\n\tfirmataAdaptor := firmata.NewAdaptor(\"/dev/tty.usbmodem1451\")\n\tservo1 := gpio.NewServoDriver(firmataAdaptor, \"3\")\n\tservo2 := gpio.NewServoDriver(firmataAdaptor, \"4\")\n\tservo3 := gpio.NewServoDriver(firmataAdaptor, \"5\")\n\tservo4 := gpio.NewServoDriver(firmataAdaptor, \"6\")\n\tservo5 := gpio.NewServoDriver(firmataAdaptor, \"7\")\n\n\tleapMotionAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n\tl := leap.NewDriver(leapMotionAdaptor)\n\n\twork := func() {\n\t\tfist := false\n\t\t_ = l.On(leap.MessageEvent, func(data interface{}) {\n\t\t\thandIsOpen := len(data.(leap.Frame).Pointables) > 0\n\t\t\tif handIsOpen && fist {\n\t\t\t\tif err := servo1.Move(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo2.Move(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo3.Move(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo4.Move(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo5.Move(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tfist = false\n\t\t\t} else if !handIsOpen && !fist {\n\t\t\t\tif err := servo1.Move(120); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo2.Move(120); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo3.Move(120); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo4.Move(120); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tif err := servo5.Move(120); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t\tfist = true\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"servoBot\",\n\t\t[]gobot.Connection{firmataAdaptor, leapMotionAdaptor},\n\t\t[]gobot.Device{servo1, servo2, servo3, servo4, servo5, l},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/leap_sphero.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"math\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/leap\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\tleapAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n\tspheroAdaptor := serialport.NewAdaptor(\"/dev/tty.Sphero-YBW-RN-SPP\")\n\n\tleapDriver := leap.NewDriver(leapAdaptor)\n\tspheroDriver := sphero.NewSpheroDriver(spheroAdaptor)\n\n\twork := func() {\n\t\t_ = leapDriver.On(leap.MessageEvent, func(data interface{}) {\n\t\t\thands := data.(leap.Frame).Hands\n\n\t\t\tif len(hands) > 0 {\n\t\t\t\tx := math.Abs(hands[0].Direction[0])\n\t\t\t\ty := math.Abs(hands[0].Direction[1])\n\t\t\t\tz := math.Abs(hands[0].Direction[2])\n\t\t\t\tspheroDriver.SetRGB(scale(x), scale(y), scale(z))\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"leapBot\",\n\t\t[]gobot.Connection{leapAdaptor, spheroAdaptor},\n\t\t[]gobot.Device{leapDriver, spheroDriver},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc scale(position float64) uint8 {\n\treturn uint8(gobot.ToScale(gobot.FromScale(position, 0, 1), 0, 255))\n}\n"
  },
  {
    "path": "examples/mavlink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/mavlink\"\n\tcommon \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n)\n\nfunc main() {\n\tadaptor := mavlink.NewAdaptor(\"/dev/ttyACM0\")\n\tiris := mavlink.NewDriver(adaptor)\n\n\twork := func() {\n\t\t_ = iris.Once(mavlink.PacketEvent, func(data interface{}) {\n\t\t\tpacket := data.(*common.MAVLinkPacket)\n\n\t\t\tdataStream := common.NewRequestDataStream(100,\n\t\t\t\tpacket.SystemID,\n\t\t\t\tpacket.ComponentID,\n\t\t\t\t4,\n\t\t\t\t1,\n\t\t\t)\n\t\t\tif err := iris.SendPacket(\n\t\t\t\tcommon.CraftMAVLinkPacket(packet.SystemID, packet.ComponentID, dataStream)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = iris.On(mavlink.MessageEvent, func(data interface{}) {\n\t\t\tif data.(common.MAVLinkMessage).Id() == 30 {\n\t\t\t\tmessage := data.(*common.Attitude)\n\t\t\t\tfmt.Println(\"Attitude\")\n\t\t\t\tfmt.Println(\"TIME_BOOT_MS\", message.TIME_BOOT_MS)\n\t\t\t\tfmt.Println(\"ROLL\", message.ROLL)\n\t\t\t\tfmt.Println(\"PITCH\", message.PITCH)\n\t\t\t\tfmt.Println(\"YAW\", message.YAW)\n\t\t\t\tfmt.Println(\"ROLLSPEED\", message.ROLLSPEED)\n\t\t\t\tfmt.Println(\"PITCHSPEED\", message.PITCHSPEED)\n\t\t\t\tfmt.Println(\"YAWSPEED\", message.YAWSPEED)\n\t\t\t\tfmt.Println(\"\")\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mavBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{iris},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/metal_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\te := edison.NewAdaptor()\n\tif err := e.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tled := gpio.NewLedDriver(e, \"13\")\n\tif err := led.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := led.Off(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tbutton := gpio.NewButtonDriver(e, \"5\")\n\tif err := button.Start(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\tbuttonEvents := button.Subscribe()\n\tfor event := range buttonEvents {\n\t\tfmt.Println(\"Event:\", event.Name, event.Data)\n\t\tif event.Name == gpio.ButtonPush {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/mqtt_driver_ping.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n// TO RUN:\n//\n//\tgo run ./examples/mqtt_driver_ping.go <SERVER>\n//\n// EXAMPLE:\n//\n//\tgo run ./examples/mqtt_driver_ping.go ssl://iot.eclipse.org:8883\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/mqtt\"\n)\n\nfunc main() {\n\tmqttAdaptor := mqtt.NewAdaptor(os.Args[1], \"pinger\")\n\tmqttAdaptor.SetAutoReconnect(true)\n\n\tholaDriver := mqtt.NewDriver(mqttAdaptor, \"hola\")\n\thelloDriver := mqtt.NewDriver(mqttAdaptor, \"hello\")\n\n\twork := func() {\n\t\t_ = helloDriver.On(mqtt.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"hello\")\n\t\t})\n\n\t\t_ = holaDriver.On(mqtt.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"hola\")\n\t\t})\n\n\t\tdata := []byte(\"o\")\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\thelloDriver.Publish(data)\n\t\t})\n\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tholaDriver.Publish(data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mqttBot\",\n\t\t[]gobot.Connection{mqttAdaptor},\n\t\t[]gobot.Device{helloDriver, holaDriver},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/mqtt_firmata_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/mqtt\"\n)\n\nfunc main() {\n\tmqttAdaptor := mqtt.NewAdaptor(\"tcp://test.mosquitto.org:1883\", \"blinker\")\n\tfirmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\twork := func() {\n\t\t_ = mqttAdaptor.On(\"lights/on\", func(msg mqtt.Message) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\t_ = mqttAdaptor.On(\"lights/off\", func(msg mqtt.Message) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tdata := []byte(\"\")\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tmqttAdaptor.Publish(\"lights/on\", data)\n\t\t})\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tmqttAdaptor.Publish(\"lights/off\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mqttBot\",\n\t\t[]gobot.Connection{mqttAdaptor, firmataAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/mqtt_ping.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/mqtt\"\n)\n\nfunc main() {\n\tmqttAdaptor := mqtt.NewAdaptor(\"tcp://test.mosquitto.org:1883\", \"pinger\")\n\n\twork := func() {\n\t\t_ = mqttAdaptor.On(\"hello\", func(msg mqtt.Message) {\n\t\t\tfmt.Println(\"hello\")\n\t\t})\n\t\t_ = mqttAdaptor.On(\"hola\", func(msg mqtt.Message) {\n\t\t\tfmt.Println(\"hola\")\n\t\t})\n\t\tdata := []byte(\"o\")\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tmqttAdaptor.Publish(\"hello\", data)\n\t\t})\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tmqttAdaptor.Publish(\"hola\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mqttBot\",\n\t\t[]gobot.Connection{mqttAdaptor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopct6_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopct6\"\n)\n\n// Wiring\n// PWR   : 1, 17 (+3.3V, VCC), 2, 4 (+5V), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// GPIO  : header pin 36 is input, pin 37 used as normal output, pin 38 used as inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of the LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed for >2 seconds the state\n// changes\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"36\"\n\t\toutPinNum         = \"37\"\n\t\toutPinInvertedNum = \"38\"\n\t\tdebounceTime      = 2 * time.Second\n\t)\n\t// note: WithGpiosOpenDrain() is optional, if using WithGpiosOpenSource() the LED's will not light up\n\tboard := nanopct6.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum),\n\t\tadaptors.WithGpiosOpenDrain(outPinNum, outPinInvertedNum),\n\t\tadaptors.WithGpiosPullUp(inPinNum),\n\t\tadaptors.WithGpioDebounce(inPinNum, debounceTime))\n\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t\tif level == 1 {\n\t\t\t\t\tlevel = 0\n\t\t\t\t} else {\n\t\t\t\t\tlevel = 1\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopct6_ds18b20.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/onewire\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopct6\"\n)\n\n// Preparation: see /gobot/system/ONEWIRE.md\n//\n// Wiring:\n// PWR    : 1, 17 (+3.3V, VCC), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// 1-wire : 16 (DQ) - resistor to VCC, ~1.5kOhm ... 5kOhm\n// DS18B20: 1 (GND), 2 (DQ), 3 (VDD, +3 ... 5.5V) for local power mode\nfunc main() {\n\tadaptor := nanopct6.NewAdaptor()\n\t// resolution change not supported by all devices\n\ttemp0 := onewire.NewDS18B20Driver(adaptor, 0xde5e710a6461, onewire.WithResolution(12))\n\ttemp1 := onewire.NewDS18B20Driver(adaptor, 0x1e40710a6461, onewire.WithFahrenheit(), onewire.WithConversionTime(500))\n\n\twork := func() {\n\t\ttime0, err := temp0.ConversionTime()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err CT0: %v\\n\", err)\n\t\t}\n\t\tres0, err := temp0.Resolution()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err R0: %v\\n\", err)\n\t\t}\n\t\tlog.Printf(\"Conversion time @%d bit for Temp 0: %d ms\\n\", res0, time0)\n\n\t\ttime1, err := temp1.ConversionTime()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err CT1: %v\\n\", err)\n\t\t}\n\t\tres1, err := temp1.Resolution()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err R1: %v\\n\", err)\n\t\t}\n\t\tlog.Printf(\"Conversion time @%d bit for Temp 0: %d ms\\n\", res1, time1)\n\n\t\tgobot.Every(10*(time.Duration(time0))*time.Millisecond, func() {\n\t\t\tt0, err := temp0.Temperature()\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"Err Temp 0: %v\\n\", err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"Temp 0: %2.1f °C\\n\", t0)\n\t\t})\n\n\t\tgobot.Every(10*(time.Duration(time1))*time.Millisecond, func() {\n\t\t\tt1, err := temp1.Temperature()\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"Err Temp 1:  %v\\n\", err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"Temp 1: %2.3f °F\\n\", t1)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"onewireBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{temp0, temp1},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopct6_servo.go",
    "content": "//go:build example\n// +build example\n\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopct6\"\n)\n\n// Wiring\n// PWR: 1, 17 (+3.3V, VCC), 2, 4 (+5V), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// PWM: header pin 11 (pwm14-m0), 13 (pwm15-m0), 29 (pwm12-m0), 31 (pwm13-m0), 35 (pwm10-m0)\n// Servo SG90: red (+5V), brown (GND), orange (PWM)\nfunc main() {\n\tconst (\n\t\tpwmPin = \"35\"\n\t\twait   = 3 * time.Second\n\n\t\tfiftyHzNanos = 20 * 1000 * 1000 // 50Hz = 0.02 sec = 20 ms\n\t)\n\t// usually a frequency of 50Hz is used for servos, most servos have 0.5 ms..2.5 ms for 0-180°,\n\t// however the mapping can be changed with options:\n\tadaptor := nanopct6.NewAdaptor(\n\t\tadaptors.WithPWMDefaultPeriodForPin(pwmPin, fiftyHzNanos),\n\t\tadaptors.WithPWMServoDutyCycleRangeForPin(pwmPin, 500*time.Microsecond, 2500*time.Microsecond),\n\t\tadaptors.WithPWMServoAngleRangeForPin(pwmPin, 0, 180),\n\t)\n\tservo := gpio.NewServoDriver(adaptor, pwmPin)\n\n\twork := func() {\n\t\tfmt.Printf(\"first move to minimal position for %s...\\n\", wait)\n\t\tif err := servo.ToMin(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"second move to center position for %s...\\n\", wait)\n\t\tif err := servo.ToCenter(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"third move to maximal position for %s...\\n\", wait)\n\t\tif err := servo.ToMax(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Println(\"finally move 0-180° (or what your servo do for the new mapping) and back forever...\")\n\t\tangle := 0\n\t\tfadeAmount := 45\n\n\t\tgobot.Every(time.Second, func() {\n\t\t\tif err := servo.Move(byte(angle)); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tangle = angle + fadeAmount\n\t\t\tif angle < 0 || angle > 180 {\n\t\t\t\tif angle < 0 {\n\t\t\t\t\tangle = 0\n\t\t\t\t}\n\t\t\t\tif angle > 180 {\n\t\t\t\t\tangle = 180\n\t\t\t\t}\n\t\t\t\t// change direction and recalculate\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t\tangle = angle + fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"motorBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopct6_thermalzone.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopct6\"\n)\n\n// Wiring: no wiring needed\nfunc main() {\n\tadaptor := nanopct6.NewAdaptor()\n\ttherm0 := aio.NewThermalZoneDriver(adaptor, \"soc_thermal\")\n\ttherm1 := aio.NewThermalZoneDriver(adaptor, \"npu_thermal\", aio.WithFahrenheit())\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tt0, err := therm0.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tt1, err := therm1.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"SOC: %2.3f °C, NPU: %2.3f °F\\n\", t0, t1)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"thermalBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{therm0, therm1},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopct6_yl40.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopct6\"\n)\n\nfunc main() {\n\t// Wiring\n\t// PWR : 1, 17 (+3.3V, VCC), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n\t// I2C8: 3 (SDA), 5 (SCL)\n\t// YL-40 module: wire AOUT --> AIN2 for this example, set all jumpers for temp, LDR and variable resistor\n\t//\n\t// Note: temperature measurement is often buggy, because sensor is not properly grounded\n\t//       fix it by soldering a small bridge to the adjacent ground pin of brightness sensor\n\tboard := nanopct6.NewAdaptor()\n\tyl := i2c.NewYL40Driver(board, i2c.WithBus(8))\n\n\twork := func() {\n\t\t// the LED light is visible above ~1.7V\n\t\twriteVal, _ := yl.AOUT()\n\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif err := yl.Write(writeVal); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\" %.1f V written\", writeVal)\n\t\t\t\twriteVal = writeVal + 0.1\n\t\t\t\tif writeVal > 3.3 {\n\t\t\t\t\twriteVal = 0\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif brightness, err := yl.ReadBrightness(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Brightness: %.0f [0..1000]\", brightness)\n\t\t\t}\n\n\t\t\tif temperature, err := yl.ReadTemperature(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Temperature: %.1f °C\", temperature)\n\t\t\t}\n\n\t\t\tif ain2, err := yl.ReadAIN2(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Read back AOUT: %.1f [0..3.3]\", ain2)\n\t\t\t}\n\n\t\t\tif potiState, err := yl.ReadPotentiometer(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Resistor: %.0f %% [-100..+100]\", potiState)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"yl40Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{yl},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopi_button.go",
    "content": "//go:build example\n// +build example\n\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopi\"\n)\n\n// PWR  NanoPi: 1, 17 (+3.3V, VCC); 2, 4 (+5V, VDD); 6, 9, 14, 20 (GND)\n// GPIO NanoPi: header pin 22 is input, pin 7 is normal output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED: the output pin is wired to the cathode of a LED, the anode is wired with a resistor (70-130Ohm for 20mA) to VCC\n// Expected behavior: LED is initially on, if button is pressed and released, the state changes\nfunc main() {\n\tconst (\n\t\tbuttonPin = \"22\"\n\t\tledPin    = \"7\"\n\t)\n\n\ta := nanopi.NewNeoAdaptor(adaptors.WithGpiosPullUp(buttonPin))\n\tbutton := gpio.NewButtonDriver(a, buttonPin, gpio.WithButtonPollInterval(50*time.Millisecond))\n\tled := gpio.NewLedDriver(a, ledPin)\n\tif err := led.On(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\twork := func() {\n\t\tif err := button.On(gpio.Error, func(err interface{}) {\n\t\t\tfmt.Println(\"an error occurred:\", err)\n\t\t}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tif err := button.On(gpio.ButtonPush, func(interface{}) {\n\t\t\tfmt.Println(\"button pressed\")\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tif err := button.On(gpio.ButtonRelease, func(interface{}) {\n\t\t\tfmt.Println(\"button released\")\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopi_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopi\"\n)\n\n// Wiring\n// PWR  NanoPi: 1, 17 (+3.3V, VCC); 2, 4 (+5V, VDD); 6, 9, 14, 20 (GND)\n// GPIO NanoPi: header pin 22 is input, pin 23 is normal output, pin 24 is inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of the LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed for >2 seconds the state\n// changes\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"22\" // 7, 8, 10, 11, 12, 13, 15, 16, 18, 22\n\t\toutPinNum         = \"23\"\n\t\toutPinInvertedNum = \"24\"\n\t\tdebounceTime      = 2 * time.Second\n\t)\n\t// note: WithGpiosOpenDrain() is optional, if using WithGpiosOpenSource() the LED's will not light up\n\tboard := nanopi.NewNeoAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum),\n\t\tadaptors.WithGpiosOpenDrain(outPinNum, outPinInvertedNum),\n\t\tadaptors.WithGpiosPullUp(inPinNum),\n\t\tadaptors.WithGpioDebounce(inPinNum, debounceTime))\n\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t\tif level == 1 {\n\t\t\t\t\tlevel = 0\n\t\t\t\t} else {\n\t\t\t\t\tlevel = 1\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopi_direct_pin_event.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopi\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tinPinNum          = \"22\" // 7, 8, 10, 11, 12, 13, 15, 16, 18, 22\n\toutPinNum         = \"23\"\n\toutPinInvertedNum = \"24\"\n\tdebounceTime      = 2 * time.Second\n)\n\nvar (\n\toutPin         gobot.DigitalPinner\n\toutPinInverted gobot.DigitalPinner\n)\n\n// Wiring\n// PWR  NanoPi: 1, 17 (+3.3V, VCC); 2, 4 (+5V, VDD); 6, 9, 14, 20 (GND)\n// GPIO NanoPi: header pin 22 is input, pin 23 is normal output, pin 24 is inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of a LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed for >2 seconds the state\n// changes\nfunc main() {\n\tboard := nanopi.NewNeoAdaptor()\n\n\twork := func() {\n\t\tinPin, err := board.DigitalPin(inPinNum)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := inPin.ApplyOptions(system.WithPinDirectionInput(), system.WithPinPullUp(),\n\t\t\tsystem.WithPinDebounce(debounceTime), system.WithPinEventOnBothEdges(buttonEventHandler)); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\t// note: WithPinOpenDrain() is optional, if using WithPinOpenSource() the LED's will not light up\n\t\toutPin, err = board.DigitalPin(outPinNum)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := outPin.ApplyOptions(system.WithPinDirectionOutput(1), system.WithPinOpenDrain()); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\toutPinInverted, err = board.DigitalPin(outPinInvertedNum)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := outPinInverted.ApplyOptions(system.WithPinActiveLow(), system.WithPinDirectionOutput(1),\n\t\t\tsystem.WithPinOpenDrain()); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tfmt.Printf(\"\\nPlease press and hold the button for at least %s\\n\", debounceTime)\n\t}\n\n\trobot := gobot.NewRobot(\"pinEdgeBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc buttonEventHandler(offset int, t time.Duration, et string, sn uint32, lsn uint32) {\n\tfmt.Printf(\"%s: %s detected on line %d with total sequence %d and line sequence %d\\n\", t, et, offset, sn, lsn)\n\tlevel := 1\n\n\tif et == \"falling edge\" {\n\t\tlevel = 0\n\t}\n\n\tif outPin != nil {\n\t\terr := outPin.Write(level)\n\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\tif outPinInverted != nil {\n\t\terr := outPinInverted.Write(level)\n\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/nanopi_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopi\"\n)\n\n// Wiring\n// PWR  NanoPi: 1, 17 (+3.3V, VCC); 2, 4 (+5V, VDD); 6, 9, 14, 20 (GND)\n// GPIO NanoPi: the fourth header pin at inner USB side, count from USB side, is the PWM output\n// LED: the PWM output is NOT able to drive a 20mA LED with full brightness (custom driver or low current LED is needed)\n// Expected behavior: the LED fades in and out\nfunc main() {\n\tr := nanopi.NewNeoAdaptor()\n\tled := gpio.NewLedDriver(r, \"PWM\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nanopi_pca9533.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopi\"\n)\n\n// Wiring\n// PWR  NanoPi: 1, 17 (+3.3V, VCC); 2, 4 (+5V, VDD); 6, 9, 14, 20 (GND)\n// I2C0 NanoPi: 3 (SDA), 5 (SCL)\n// PCA9533: 8 (VDD, +2.3..5.5V), 4 (VSS, GND), 7 (SDA), 6 (SCL)\n// LED pins: 1 (LED0), 2 (LED1), 3 (LED2), 5 (LED3)\n// LED's directly driven with pull-up resistors to VDD, e.g. 180 Ohm\n// I2C addresses: 0x62 (PCA9533/01), 0x63 (PCA9533/02)\nfunc main() {\n\tboard := nanopi.NewNeoAdaptor()\n\tpca := i2c.NewPCA953xDriver(board, i2c.WithAddress(0x63))\n\n\tled := uint8(0)  // index of LED\n\twVal := uint8(1) // start with LED is \"off\"\n\trVal := uint8(0)\n\n\twork := func() {\n\t\t// LED 2 with 5 Hz 1:1, LED 3 with 1 Hz 1:10\n\t\tinitialize(pca, 5, 1)\n\n\t\tgobot.Every(2000*time.Millisecond, func() {\n\t\t\tfmt.Printf(\"set LED%d output to %d\", led, wVal)\n\t\t\terr := pca.WriteGPIO(led, wVal)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"errW:\", err)\n\t\t\t}\n\n\t\t\trVal, err = pca.ReadGPIO(led)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"errR:\", err)\n\t\t\t}\n\t\t\tif rVal == 0 {\n\t\t\t\tfmt.Printf(\" - LED%d is ON\\n\", led)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\" - LED%d is OFF\\n\", led)\n\t\t\t}\n\n\t\t\tled = led + 1\n\t\t\tif led > 1 {\n\t\t\t\tled = 0\n\t\t\t\tif wVal == 1 {\n\t\t\t\t\twVal = 0\n\t\t\t\t} else {\n\t\t\t\t\twVal = 1\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ledI2c\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{pca},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initialize(pca *i2c.PCA953xDriver, led2FrequHz float32, led3FrequHz float32) {\n\t// prepare PWM0\n\terr := pca.WriteFrequency(0, led2FrequHz)\n\tif err != nil {\n\t\tfmt.Println(\"errWF0:\", err)\n\t}\n\tfrq, err := pca.ReadFrequency(0)\n\tif err != nil {\n\t\tfmt.Println(\"errRF0:\", err)\n\t}\n\tfmt.Println(\"get Frq0:\", frq)\n\n\terr = pca.WriteDutyCyclePercent(0, 50)\n\tif err != nil {\n\t\tfmt.Println(\"errWD0:\", err)\n\t}\n\tdc, err := pca.ReadDutyCyclePercent(0)\n\tif err != nil {\n\t\tfmt.Println(\"errRD0:\", err)\n\t}\n\tfmt.Println(\"get dc0:\", dc)\n\n\t// prepare PWM1\n\terr = pca.WriteFrequency(1, led3FrequHz)\n\tif err != nil {\n\t\tfmt.Println(\"errWF1:\", err)\n\t}\n\tfrq, err = pca.ReadFrequency(1)\n\tif err != nil {\n\t\tfmt.Println(\"errRF1:\", err)\n\t}\n\tfmt.Println(\"get Frq1:\", frq)\n\n\terr = pca.WriteDutyCyclePercent(1, 10)\n\tif err != nil {\n\t\tfmt.Println(\"errWD1:\", err)\n\t}\n\tdc, err = pca.ReadDutyCyclePercent(1)\n\tif err != nil {\n\t\tfmt.Println(\"errRD1:\", err)\n\t}\n\tfmt.Println(\"get dc1:\", dc)\n\n\t// LED 2\n\tfmt.Println(\"set LED: 2 to: pwm0\")\n\terr = pca.SetLED(2, i2c.PCA953xModePwm0)\n\tif err != nil {\n\t\tfmt.Println(\"errW:\", err)\n\t}\n\tfmt.Println(\"set LED: 3 to: pwm1\")\n\terr = pca.SetLED(3, i2c.PCA953xModePwm1)\n\tif err != nil {\n\t\tfmt.Println(\"errW:\", err)\n\t}\n}\n"
  },
  {
    "path": "examples/nats.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/nats\"\n)\n\nfunc main() {\n\tnatsAdaptor := nats.NewAdaptorWithAuth(\"localhost:4222\", 1234, \"user\", \"pass\")\n\n\twork := func() {\n\t\tnatsAdaptor.On(\"hello\", func(msg nats.Message) {\n\t\t\tfmt.Println(\"hello\")\n\t\t})\n\t\tnatsAdaptor.On(\"hola\", func(msg nats.Message) {\n\t\t\tfmt.Println(\"hola\")\n\t\t})\n\t\tdata := []byte(\"o\")\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tnatsAdaptor.Publish(\"hello\", data)\n\t\t})\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tnatsAdaptor.Publish(\"hola\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"natsBot\",\n\t\t[]gobot.Connection{natsAdaptor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/nats_driver_ping.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n// TO RUN:\n//\n//\tgo run ./examples/nats_driver_ping.go <SERVER>\n//\n// EXAMPLE:\n//\n//\tgo run ./examples/nats_driver_ping.go tls://nats.demo.io:4443\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/nats\"\n)\n\nfunc main() {\n\tnatsAdaptor := nats.NewAdaptor(os.Args[1], 1234)\n\n\tholaDriver := nats.NewDriver(natsAdaptor, \"hola\")\n\thelloDriver := nats.NewDriver(natsAdaptor, \"hello\")\n\n\twork := func() {\n\t\t_ = helloDriver.On(nats.Data, func(msg nats.Message) {\n\t\t\tfmt.Println(\"hello\")\n\t\t})\n\n\t\t_ = holaDriver.On(nats.Data, func(msg nats.Message) {\n\t\t\tfmt.Println(\"hola\")\n\t\t})\n\n\t\tdata := []byte(\"o\")\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\thelloDriver.Publish(data)\n\t\t})\n\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tholaDriver.Publish(data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"natsBot\",\n\t\t[]gobot.Connection{natsAdaptor},\n\t\t[]gobot.Device{helloDriver, holaDriver},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/opencv_face_detect.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"path\"\n\t\"runtime\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/opencv\"\n\t\"gocv.io/x/gocv\"\n)\n\nvar img atomic.Value\n\nfunc main() {\n\t_, currentfile, _, _ := runtime.Caller(0)\n\tcascade := path.Join(path.Dir(currentfile), \"haarcascade_frontalface_alt.xml\")\n\n\twindow := opencv.NewWindowDriver()\n\tcamera := opencv.NewCameraDriver(1)\n\n\twork := func() {\n\t\tmat := gocv.NewMat()\n\t\timg.Store(mat)\n\n\t\tcamera.On(opencv.Frame, func(data interface{}) {\n\t\t\ti := data.(gocv.Mat)\n\t\t\timg.Store(i)\n\t\t})\n\n\t\tgobot.Every(10*time.Millisecond, func() {\n\t\t\ti := img.Load().(gocv.Mat)\n\t\t\tif i.Empty() {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfaces := opencv.DetectObjects(cascade, i)\n\t\t\topencv.DrawRectangles(i, faces, 0, 255, 0, 5)\n\t\t\twindow.ShowImage(i)\n\t\t\twindow.WaitKey(1)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"faceBot\",\n\t\t[]gobot.Connection{},\n\t\t[]gobot.Device{window, camera},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/opencv_window.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/opencv\"\n\t\"gocv.io/x/gocv\"\n)\n\nfunc main() {\n\twindow := opencv.NewWindowDriver()\n\tcamera := opencv.NewCameraDriver(0)\n\n\twork := func() {\n\t\tcamera.On(opencv.Frame, func(data interface{}) {\n\t\t\timg := data.(gocv.Mat)\n\t\t\twindow.ShowImage(img)\n\t\t\twindow.WaitKey(1)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"cameraBot\",\n\t\t[]gobot.Device{window, camera},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/orangepi5pro_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/orangepi/orangepi5pro\"\n)\n\n// Wiring\n// PWR   : 1, 17 (+3.3V, VCC), 2, 4 (+5V), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// GPIO  : header pin 32 is input, pin 38 used as normal output, pin 40 used as inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of the LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed for >2 seconds the state\n// changes\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"32\"\n\t\toutPinNum         = \"38\"\n\t\toutPinInvertedNum = \"40\"\n\t\tdebounceTime      = 2 * time.Second\n\t)\n\t// note: WithGpiosOpenDrain() is optional, if using WithGpiosOpenSource() the LED's will not light up\n\tboard := orangepi5pro.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum),\n\t\tadaptors.WithGpiosOpenDrain(outPinNum, outPinInvertedNum),\n\t\tadaptors.WithGpiosPullUp(inPinNum),\n\t\tadaptors.WithGpioDebounce(inPinNum, debounceTime))\n\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t\tif level == 1 {\n\t\t\t\t\tlevel = 0\n\t\t\t\t} else {\n\t\t\t\t\tlevel = 1\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/orangepi5pro_servo.go",
    "content": "//go:build example\n// +build example\n\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/orangepi/orangepi5pro\"\n)\n\n// Wiring\n// PWR: 1, 17 (+3.3V, VCC), 2, 4 (+5V), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// PWM: 7(pwm13-m2), 11(pwm14-m1), 12(pwm3-m3), 13(pwm15-m1), 27(pwm0-m2), 28(pwm1-m2), 32(pwm14-m2), 33(pwm15-m3)\n// Servo SG90: red (+5V), brown (GND), orange (PWM)\nfunc main() {\n\tconst (\n\t\tpwmPin = \"7\"\n\t\twait   = 3 * time.Second\n\n\t\tfiftyHzNanos = 20 * 1000 * 1000 // 50Hz = 0.02 sec = 20 ms\n\t)\n\t// usually a frequency of 50Hz is used for servos, most servos have 0.5 ms..2.5 ms for 0-180°,\n\t// however the mapping can be changed with options:\n\tadaptor := orangepi5pro.NewAdaptor(\n\t\tadaptors.WithPWMDefaultPeriodForPin(pwmPin, fiftyHzNanos),\n\t\tadaptors.WithPWMServoDutyCycleRangeForPin(pwmPin, 500*time.Microsecond, 2500*time.Microsecond),\n\t\tadaptors.WithPWMServoAngleRangeForPin(pwmPin, 0, 180),\n\t)\n\tservo := gpio.NewServoDriver(adaptor, pwmPin)\n\n\twork := func() {\n\t\tfmt.Printf(\"first move to minimal position for %s...\\n\", wait)\n\t\tif err := servo.ToMin(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"second move to center position for %s...\\n\", wait)\n\t\tif err := servo.ToCenter(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"third move to maximal position for %s...\\n\", wait)\n\t\tif err := servo.ToMax(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Println(\"finally move 0-180° (or what your servo do for the new mapping) and back forever...\")\n\t\tangle := 0\n\t\tfadeAmount := 45\n\n\t\tgobot.Every(time.Second, func() {\n\t\t\tif err := servo.Move(byte(angle)); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tangle = angle + fadeAmount\n\t\t\tif angle < 0 || angle > 180 {\n\t\t\t\tif angle < 0 {\n\t\t\t\t\tangle = 0\n\t\t\t\t}\n\t\t\t\tif angle > 180 {\n\t\t\t\t\tangle = 180\n\t\t\t\t}\n\t\t\t\t// change direction and recalculate\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t\tangle = angle + fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"motorBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/orangepi5pro_thermalzone.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/orangepi/orangepi5pro\"\n)\n\n// Wiring: no wiring needed\nfunc main() {\n\tadaptor := orangepi5pro.NewAdaptor()\n\ttherm0 := aio.NewThermalZoneDriver(adaptor, \"soc_thermal\")\n\ttherm1 := aio.NewThermalZoneDriver(adaptor, \"npu_thermal\", aio.WithFahrenheit())\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tt0, err := therm0.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tt1, err := therm1.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"SOC: %2.3f °C, NPU: %2.3f °F\\n\", t0, t1)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"thermalBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{therm0, therm1},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/particle_api.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the device ID as first param,\n and the access token as the second param:\n\n\tgo run examples/particle_api.go mydevice myaccesstoken\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\tcore := particle.NewAdaptor(os.Args[1], os.Args[2])\n\tled := gpio.NewLedDriver(core, \"D7\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"spark\",\n\t\t[]gobot.Connection{core},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/particle_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the device ID as first param,\n and the access token as the second param:\n\n\tgo run examples/particle_blink.go mydevice myaccesstoken\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n\tcore := particle.NewAdaptor(os.Args[1], os.Args[2])\n\tled := gpio.NewLedDriver(core, \"D7\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"spark\",\n\t\t[]gobot.Connection{core},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/particle_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the device ID as first param,\n and the access token as the second param:\n\n\tgo run examples/particle_button.go mydevice myaccesstoken\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n\tcore := particle.NewAdaptor(os.Args[1], os.Args[2])\n\tled := gpio.NewLedDriver(core, \"D7\")\n\tbutton := gpio.NewButtonDriver(core, \"D5\")\n\n\twork := func() {\n\t\t_ = button.On(button.Event(\"push\"), func(data interface{}) {\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = button.On(button.Event(\"release\"), func(data interface{}) {\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"spark\",\n\t\t[]gobot.Connection{core},\n\t\t[]gobot.Device{button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/particle_events.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the device ID as first param,\n and the access token as the second param:\n\n\tgo run examples/particle_events.go mydevice myaccesstoken\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n\tcore := particle.NewAdaptor(os.Args[1], os.Args[2])\n\n\twork := func() {\n\t\tif stream, err := core.EventStream(\"all\", \"\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t} else {\n\t\t\t// TODO: some other way to handle this\n\t\t\tfmt.Println(stream)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"spark\",\n\t\t[]gobot.Connection{core},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/particle_function.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the device ID as first param,\n and the access token as the second param:\n\n\tgo run examples/particle_function.go mydevice myaccesstoken\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n\tcore := particle.NewAdaptor(os.Args[1], os.Args[2])\n\n\twork := func() {\n\t\tif result, err := core.Function(\"brew\", \"202,230\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t} else {\n\t\t\tfmt.Println(\"result from \\\"brew\\\":\", result)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"spark\",\n\t\t[]gobot.Connection{core},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/particle_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the device ID as first param,\n and the access token as the second param:\n\n\tgo run examples/particle_led_brightness.go mydevice myaccesstoken\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n\tcore := particle.NewAdaptor(os.Args[1], os.Args[2])\n\tled := gpio.NewLedDriver(core, \"A1\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(25)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"spark\",\n\t\t[]gobot.Connection{core},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/particle_variable.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n To run this example, pass the device ID as first param,\n and the access token as the second param:\n\n\tgo run examples/particle_variable.go mydevice myaccesstoken\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n\tcore := particle.NewAdaptor(os.Args[1], os.Args[2])\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif temp, err := core.Variable(\"temperature\"); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"result from \\\"temperature\\\" is:\", temp)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"spark\",\n\t\t[]gobot.Connection{core},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/pebble.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/platforms/pebble\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi := api.NewAPI(manager)\n\tapi.Port = \"8080\"\n\tapi.Start()\n\n\tpebbleAdaptor := pebble.NewAdaptor()\n\tpebbleDriver := pebble.NewDriver(pebbleAdaptor)\n\n\twork := func() {\n\t\tpebbleDriver.SendNotification(\"Hello Pebble!\")\n\t\t_ = pebbleDriver.On(pebbleDriver.Event(\"button\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Button pushed: \" + data.(string))\n\t\t})\n\n\t\t_ = pebbleDriver.On(pebbleDriver.Event(\"tap\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Tap event detected\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pebble\",\n\t\t[]gobot.Connection{pebbleAdaptor},\n\t\t[]gobot.Device{pebbleDriver},\n\t\twork,\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/pebble_accelerometer.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/platforms/pebble\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\ta := api.NewAPI(manager)\n\ta.Port = \"8080\"\n\ta.Start()\n\n\tpebbleAdaptor := pebble.NewAdaptor()\n\tpebbleDriver := pebble.NewDriver(pebbleAdaptor)\n\n\twork := func() {\n\t\t_ = pebbleDriver.On(pebbleDriver.Event(\"accel\"), func(data interface{}) {\n\t\t\tfmt.Println(data.(string))\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pebble\",\n\t\t[]gobot.Connection{pebbleAdaptor},\n\t\t[]gobot.Device{pebbleDriver},\n\t\twork,\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_adafruit2327_servo.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nconst (\n\t// Min pulse length out of 4096\n\tservoMin = 150\n\t// Max pulse length out of 4096\n\tservoMax = 700\n\t// Limiting the max this servo can rotate (in deg)\n\tmaxDegree = 180\n\t// Number of degrees to increase per call\n\tdegIncrease = 10\n\tyawDeg      = 90\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\n\t// Changing from the default 0x40 address because this configuration involves\n\t// a Servo HAT stacked on top of a DC/Stepper Motor HAT on top of the Pi.\n\tstackedHatAddr := 0x41\n\n\tadaFruit := i2c.NewAdafruit2327Driver(r, i2c.WithAddress(stackedHatAddr))\n\n\twork := func() {\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tif err := adafruitServoMotorRunner(adaFruit); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"adaFruitBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{adaFruit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc adafruitServoMotorRunner(a *i2c.Adafruit2327Driver) error {\n\tlog.Printf(\"Servo Motor Run Loop...\\n\")\n\n\tvar channel byte = 1\n\tdeg := 90\n\n\t// Do not need to set this every run loop\n\tfreq := 60.0\n\tif err := a.SetServoMotorFreq(freq); err != nil {\n\t\treturn err\n\t}\n\t// start in the middle of the 180-deg range\n\tpulse := degree2pulse(deg)\n\tif err := a.SetServoMotorPulse(channel, 0, pulse); err != nil {\n\t\treturn err\n\t}\n\t// INCR\n\tpulse = degree2pulse(deg + degIncrease)\n\tif err := a.SetServoMotorPulse(channel, 0, pulse); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(2000 * time.Millisecond)\n\t// DECR\n\tpulse = degree2pulse(deg - degIncrease)\n\tif err := a.SetServoMotorPulse(channel, 0, pulse); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc degree2pulse(deg int) int32 {\n\tpulse := servoMin\n\tpulse += ((servoMax - servoMin) / maxDegree) * deg\n\treturn int32(pulse)\n}\n"
  },
  {
    "path": "examples/raspi_adafruit2348_dcmotor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\n\t// we use the default address 0x60 for DC/Stepper Motor HAT on top of the Pi\n\tadaFruit := i2c.NewAdafruit2348Driver(r)\n\n\twork := func() {\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tdcMotor := 2 // 0-based\n\t\t\tif err := adafruitDCMotorRunner(adaFruit, dcMotor); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"adaFruitBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{adaFruit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc adafruitDCMotorRunner(a *i2c.Adafruit2348Driver, dcMotor int) error {\n\tlog.Printf(\"DC Motor Run Loop...\\n\")\n\t// set the speed:\n\tvar speed int32 = 255 // 255 = full speed!\n\tif err := a.SetDCMotorSpeed(dcMotor, speed); err != nil {\n\t\treturn err\n\t}\n\t// run FORWARD\n\tif err := a.RunDCMotor(dcMotor, i2c.Adafruit2348Forward); err != nil {\n\t\treturn err\n\t}\n\t// Sleep and RELEASE\n\ttime.Sleep(2000 * time.Millisecond)\n\tif err := a.RunDCMotor(dcMotor, i2c.Adafruit2348Release); err != nil {\n\t\treturn err\n\t}\n\t// run BACKWARD\n\tif err := a.RunDCMotor(dcMotor, i2c.Adafruit2348Backward); err != nil {\n\t\treturn err\n\t}\n\t// Sleep and RELEASE\n\ttime.Sleep(2000 * time.Millisecond)\n\tif err := a.RunDCMotor(dcMotor, i2c.Adafruit2348Release); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "examples/raspi_adafruit2348_stepper.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\n\t// we use the default address 0x60 for DC/Stepper Motor HAT on top of the Pi\n\tadaFruit := i2c.NewAdafruit2348Driver(r)\n\n\twork := func() {\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tmotor := 0 // 0-based\n\t\t\tif err := adafruitStepperMotorRunner(adaFruit, motor); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"adaFruitBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{adaFruit},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc adafruitStepperMotorRunner(a *i2c.Adafruit2348Driver, motor int) error {\n\tlog.Printf(\"Stepper Motor Run Loop...\\n\")\n\t// set the speed state:\n\tspeed := 30 // rpm\n\tstyle := i2c.Adafruit2348Double\n\tsteps := 20\n\n\tif err := a.SetStepperMotorSpeed(motor, speed); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.Step(motor, steps, i2c.Adafruit2348Forward, style); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.Step(motor, steps, i2c.Adafruit2348Backward, style); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "examples/raspi_ads1015.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\ta := raspi.NewAdaptor()\n\t// Use the gain to be able to read values of at least 5V (for all channels)\n\tads1015 := i2c.NewADS1015Driver(a, i2c.WithADS1x15BestGainForVoltage(5.0))\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tv, _ := ads1015.ReadWithDefaults(0)\n\t\t\tfmt.Println(\"A0\", v)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ads1015bot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{ads1015},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tled := gpio.NewLedDriver(r, \"7\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_blinkm.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tblinkm := i2c.NewBlinkMDriver(r)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := byte(gobot.Rand(255))\n\t\t\tg := byte(gobot.Rand(255))\n\t\t\tb := byte(gobot.Rand(255))\n\t\t\tif err := blinkm.Rgb(r, g, b); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tcolor, err := blinkm.Color()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"color %v\\n\", color)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkmBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{blinkm},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tbutton := gpio.NewButtonDriver(r, \"11\")\n\tled := gpio.NewLedDriver(r, \"7\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tfmt.Println(\"button pressed\")\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"button released\")\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_ccs811.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc CCS811BootData(a *i2c.CCS811Driver) {\n\tv, err := a.GetHardwareVersion()\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t}\n\n\tfmt.Printf(\"Hardare Version %#x\\n\", v)\n\n\td, err := a.GetFirmwareBootVersion()\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t}\n\n\tfmt.Printf(\"Boot Version %#x\\n\", d)\n\n\td, err = a.GetFirmwareAppVersion()\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t}\n\n\tfmt.Printf(\"App Version %#x\\n\\n\", d)\n}\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tccs811Driver := i2c.NewCCS811Driver(r)\n\n\twork := func() {\n\t\tCCS811BootData(ccs811Driver)\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\ts, err := ccs811Driver.GetStatus()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"Error fetching data from the status register: %+v\\n\", err.Error())\n\t\t\t}\n\t\t\tfmt.Printf(\"Status %+v \\n\", s)\n\n\t\t\thd, err := ccs811Driver.HasData()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"Error fetching data from the status register: %+v\\n\", err.Error())\n\t\t\t}\n\n\t\t\tif hd {\n\t\t\t\tec02, tv0C, _ := ccs811Driver.GetGasData()\n\t\t\t\tfmt.Printf(\"Gas Data - eco2: %+v, tvoc: %+v \\n\", ec02, tv0C)\n\n\t\t\t\ttemp, _ := ccs811Driver.GetTemperature()\n\t\t\t\tfmt.Printf(\"Temperature %+v \\n\\n\", temp)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"New data is not available\")\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"adaFruitBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{ccs811Driver},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\n// Wiring\n// PWR  Raspi: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// GPIO Raspi: header pin 21 (GPIO9) is input, pin 24 (GPIO8) is normal output, pin 26 (GPIO7) is inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of a LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed for >2 seconds the state\n// changes\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"21\"\n\t\toutPinNum         = \"24\"\n\t\toutPinInvertedNum = \"26\"\n\t)\n\t// note: WithGpiosOpenDrain() is optional, if using WithGpiosOpenSource() the LED's will not light up\n\tboard := raspi.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum),\n\t\tadaptors.WithGpiosOpenDrain(outPinNum, outPinInvertedNum),\n\t\tadaptors.WithGpiosPullUp(inPinNum),\n\t\tadaptors.WithGpioDebounce(inPinNum, 2*time.Second))\n\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tif level == 1 {\n\t\t\t\tlevel = 0\n\t\t\t} else {\n\t\t\t\tlevel = 1\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_direct_pin_event.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tinPinNum          = \"21\"\n\toutPinNum         = \"24\"\n\toutPinInvertedNum = \"26\"\n\tdebounceTime      = 2 * time.Second\n)\n\nvar (\n\toutPin         gobot.DigitalPinner\n\toutPinInverted gobot.DigitalPinner\n)\n\n// Wiring\n// PWR  Raspi: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// GPIO Raspi: header pin 21 (GPIO9) is input, pin 24 (GPIO8) is normal output, pin 26 (GPIO7) is inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of a LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed for >2 seconds the state\n// changes\nfunc main() {\n\tboard := raspi.NewAdaptor()\n\n\twork := func() {\n\t\tinPin, err := board.DigitalPin(inPinNum)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := inPin.ApplyOptions(system.WithPinDirectionInput(), system.WithPinPullUp(),\n\t\t\tsystem.WithPinDebounce(debounceTime), system.WithPinEventOnBothEdges(buttonEventHandler)); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\t// note: WithPinOpenDrain() is optional, if using WithPinOpenSource() the LED's will not light up\n\t\toutPin, err = board.DigitalPin(outPinNum)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := outPin.ApplyOptions(system.WithPinDirectionOutput(1), system.WithPinOpenDrain()); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\toutPinInverted, err = board.DigitalPin(outPinInvertedNum)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := outPinInverted.ApplyOptions(system.WithPinActiveLow(), system.WithPinDirectionOutput(1),\n\t\t\tsystem.WithPinOpenDrain()); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tfmt.Printf(\"\\nPlease press and hold the button for at least %s\\n\", debounceTime)\n\t}\n\n\trobot := gobot.NewRobot(\"pinEdgeBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc buttonEventHandler(offset int, t time.Duration, et string, sn uint32, lsn uint32) {\n\tfmt.Printf(\"%s: %s detected on line %d with total sequence %d and line sequence %d\\n\", t, et, offset, sn, lsn)\n\tlevel := 1\n\n\tif et == \"falling edge\" {\n\t\tlevel = 0\n\t}\n\n\terr := outPin.Write(level)\n\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\terr = outPinInverted.Write(level)\n\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_generic.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\n// Wiring\n// PWR  Raspi: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n// I2C1 Raspi: 3 (SDA), 5 (SCL)\n// PCA9501: 20 (VDD, +2.5..3.6V), 10 (VSS, GND), 19 (SDA), 18 (SCL)\n// HW address pins: 1 (A0), 2 (A1), 3 (A2), 12 (A3), 11 (A4), 9 (A5)\nfunc main() {\n\tconst (\n\t\tdefaultAddress = 0x7F // with open address pins (internal pull-up)\n\t\tmyAddress      = 0x44 // needs to be adjusted for your configuration\n\t\teepromAddr     = uint8(0x02)\n\t\tdataLen        = 7\n\t\twrite          = true\n\t\tread           = true\n\t)\n\n\tboard := raspi.NewAdaptor()\n\tdrv := i2c.NewGenericDriver(board, \"PCA9501-EEPROM\", defaultAddress, i2c.WithAddress(myAddress))\n\n\tvar valWr uint8 = 0x09\n\tvar err error\n\n\twData := make([]byte, dataLen)\n\trData := make([]byte, dataLen)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t// write \"dataLen\" values, starting by EEPROM address\n\t\t\tvalWr++\n\n\t\t\tif write {\n\t\t\t\tfor i := range wData {\n\t\t\t\t\twData[i] = byte(i) + valWr\n\t\t\t\t}\n\t\t\t\terr = drv.WriteBlockData(eepromAddr, wData)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"err write:\", err)\n\t\t\t\t} else if read != write {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d, wr: %v\\n\", eepromAddr, wData)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// write process needs some time, so wait at least 5ms before read a value\n\t\t\t// when decreasing to much, the check below will fail\n\t\t\ttime.Sleep(10 * time.Millisecond)\n\n\t\t\tif read {\n\t\t\t\terr = drv.ReadBlockData(eepromAddr, rData)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"err read:\", err)\n\t\t\t\t} else if read != write {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d, rd: %v\\n\", eepromAddr, rData)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// compare read and write\n\t\t\tif read && write {\n\t\t\t\tif reflect.DeepEqual(wData, rData) {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d equal: %v\\n\", eepromAddr, rData)\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d wr: %v differ rd: %v\\n\", eepromAddr, wData, rData)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"genericDriverI2c\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{drv},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_grove_pi_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tgp := i2c.NewGrovePiDriver(r)\n\tled := gpio.NewLedDriver(gp, \"D2\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{gp, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_grove_pi_button.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tgp := i2c.NewGrovePiDriver(r)\n\tbutton := gpio.NewButtonDriver(gp, \"D3\", gpio.WithButtonPollInterval(50*time.Millisecond))\n\tled := gpio.NewLedDriver(gp, \"D2\")\n\n\twork := func() {\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tfmt.Println(\"button pressed\")\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tfmt.Println(\"button released\")\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{gp, button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_grove_pi_dht.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nconst (\n\tdhtPin        = \"4\"\n\tdhtModel      = 1 // white DHT22, 0 for the blue DHT11\n\tdelayMillisec = 10\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tgp := i2c.NewGrovePiDriver(r)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif temp, hum, err := gp.DHTRead(dhtPin, dhtModel, delayMillisec); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Temperature [°C]\", temp)\n\t\t\t\tfmt.Println(\"rel. Humidity [%]\", hum)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"dhtBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{gp},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_grove_pi_rotary.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tboard := raspi.NewAdaptor()\n\tgp := i2c.NewGrovePiDriver(board)\n\tsensor := aio.NewGroveRotaryDriver(gp, \"A1\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{gp, sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_grove_pi_ultrasonic.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nconst (\n\tultrasonicPin = \"4\"\n\tdelayMillisec = 10\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tgp := i2c.NewGrovePiDriver(r)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif val, err := gp.UltrasonicRead(ultrasonicPin, delayMillisec); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Distance [cm]\", val)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ultrasonicBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{gp},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_grove_rotary_sensor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tboard := raspi.NewAdaptor()\n\tads1015 := i2c.NewADS1015Driver(board)\n\tsensor := aio.NewGroveRotaryDriver(ads1015, \"0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{ads1015, sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_hcsr04.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tconst (\n\t\ttriggerOutput = \"11\"\n\t\techoInput     = \"13\"\n\t)\n\n\t// this is mandatory for systems with defunct edge detection, although the \"cdev\" is used with an newer Kernel\n\t// keep in mind, that this cause more inaccurate measurements\n\tconst pollEdgeDetection = true\n\topts := []interface{}{}\n\tif pollEdgeDetection {\n\t\topts = append(opts, gpio.WithHCSR04UseEdgePolling())\n\t}\n\n\ta := raspi.NewAdaptor()\n\thcsr04 := gpio.NewHCSR04Driver(a, triggerOutput, echoInput, opts...)\n\n\twork := func() {\n\t\tif pollEdgeDetection {\n\t\t\tfmt.Println(\"Please note that measurements are CPU consuming and will be more inaccurate with this setting.\")\n\t\t\tfmt.Println(\"After startup the system is under load and the measurement is very inaccurate, so wait a bit...\")\n\t\t\ttime.Sleep(2000 * time.Millisecond)\n\t\t}\n\n\t\tif err := hcsr04.StartDistanceMonitor(); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\n\t\t// first single shot\n\t\tif v, err := hcsr04.MeasureDistance(); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t} else {\n\t\t\tfmt.Printf(\"first single shot done: %5.3f m\\n\", v)\n\t\t}\n\n\t\tticker := gobot.Every(1*time.Second, func() {\n\t\t\tfmt.Printf(\"continuous measurement: %5.3f m\\n\", hcsr04.Distance())\n\t\t})\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := hcsr04.StopDistanceMonitor(); err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t\tticker.Stop()\n\t\t})\n\n\t\tgobot.After(7*time.Second, func() {\n\t\t\t// second single shot\n\t\t\tif v, err := hcsr04.MeasureDistance(); err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"second single shot done: %5.3f m\\n\", v)\n\t\t\t}\n\t\t\t// cleanup\n\t\t\tif err := hcsr04.Halt(); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tif err := a.Finalize(); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tos.Exit(0)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"distanceBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{hcsr04},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_hmc5883l.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to run\n\n\tgo run examples/raspi_hmc5883l.go\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\traspi := raspi.NewAdaptor()\n\thmc5883l := i2c.NewHMC5883LDriver(raspi)\n\n\twork := func() {\n\t\tgobot.Every(200*time.Millisecond, func() {\n\t\t\t// get heading in radians, to convert to degrees multiply by 180/math.Pi\n\t\t\theading, _ := hmc5883l.Heading()\n\t\t\tfmt.Println(\"Heading\", heading)\n\n\t\t\t// read the data in Gauss\n\t\t\tx, y, z, _ := hmc5883l.Read()\n\t\t\tfmt.Println(x, y, z)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"hmc5883LBot\",\n\t\t[]gobot.Connection{raspi},\n\t\t[]gobot.Device{hmc5883l},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_ina3221.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tina := i2c.NewINA3221Driver(r)\n\n\twork := func() {\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\tfor _, ch := range []i2c.INA3221Channel{i2c.INA3221Channel1, i2c.INA3221Channel2, i2c.INA3221Channel3} {\n\t\t\t\tval, err := ina.GetBusVoltage(ch)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"INA3221Channel %v Bus Voltage error: %v\\n\", ch, err)\n\t\t\t\t}\n\t\t\t\tfmt.Printf(\"INA3221Channel %v Bus Voltage: %fV\\n\", ch, val)\n\n\t\t\t\tval, err = ina.GetShuntVoltage(ch)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"INA3221Channel %v Shunt Voltage error: %v\\n\", ch, err)\n\t\t\t\t}\n\t\t\t\tfmt.Printf(\"INA3221Channel %v Shunt Voltage: %fV\\n\", ch, val)\n\n\t\t\t\tval, err = ina.GetCurrent(ch)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"INA3221Channel %v Current error: %v\\n\", ch, err)\n\t\t\t\t}\n\t\t\t\tfmt.Printf(\"INA3221Channel %v Current: %fmA\\n\", ch, val)\n\n\t\t\t\tval, err = ina.GetLoadVoltage(ch)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"INA3221Channel %v Load Voltage error: %v\\n\", ch, err)\n\t\t\t\t}\n\t\t\t\tfmt.Printf(\"INA3221Channel %v Load Voltage: %fV\\n\", ch, val)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"INA3221 Robot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{ina},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_led_brightness.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tled := gpio.NewLedDriver(r, \"pwm0\")\n\n\twork := func() {\n\t\tbrightness := uint8(0)\n\t\tfadeAmount := uint8(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := led.Brightness(brightness); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tbrightness = brightness + fadeAmount\n\t\t\tif brightness == 0 || brightness == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pwmBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_mcp3008.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\ta := raspi.NewAdaptor()\n\tadc := spi.NewMCP3008Driver(a)\n\n\twork := func() {\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tresult, err := adc.Read(0)\n\t\t\tfmt.Println(\"A0\", result, err)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mcp3008bot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{adc},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_pca9533.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\n// Wiring\n// PWR  Raspi: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n// I2C1 Raspi: 3 (SDA), 5 (SCL)\n// PCA9533: 8 (VDD, +2.3..5.5V), 4 (VSS, GND), 7 (SDA), 6 (SCL)\n// LED pins: 1 (LED0), 2 (LED1), 3 (LED2), 5 (LED3)\n// LED's directly driven with pull-up resistors to VDD, e.g. 180 Ohm\n// I2C addresses: 0x62 (PCA9533/01), 0x63 (PCA9533/02)\nfunc main() {\n\tboard := raspi.NewAdaptor()\n\tpca := i2c.NewPCA953xDriver(board, i2c.WithAddress(0x63))\n\n\tled := uint8(0)  // index of LED\n\twVal := uint8(1) // start with LED is \"off\"\n\trVal := uint8(0)\n\n\twork := func() {\n\t\t// LED 2 with 5 Hz 1:1, LED 3 with 1 Hz 1:10\n\t\tinitialize(pca, 5, 1)\n\n\t\tgobot.Every(2000*time.Millisecond, func() {\n\t\t\tfmt.Printf(\"set LED%d output to %d\", led, wVal)\n\t\t\terr := pca.WriteGPIO(led, wVal)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"errW:\", err)\n\t\t\t}\n\n\t\t\trVal, err = pca.ReadGPIO(led)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"errR:\", err)\n\t\t\t}\n\t\t\tif rVal == 0 {\n\t\t\t\tfmt.Printf(\" - LED%d is ON\\n\", led)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\" - LED%d is OFF\\n\", led)\n\t\t\t}\n\n\t\t\tled = led + 1\n\t\t\tif led > 1 {\n\t\t\t\tled = 0\n\t\t\t\tif wVal == 1 {\n\t\t\t\t\twVal = 0\n\t\t\t\t} else {\n\t\t\t\t\twVal = 1\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ledI2c\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{pca},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initialize(pca *i2c.PCA953xDriver, led2FrequHz float32, led3FrequHz float32) {\n\t// prepare PWM0\n\terr := pca.WriteFrequency(0, led2FrequHz)\n\tif err != nil {\n\t\tfmt.Println(\"errWF0:\", err)\n\t}\n\tfrq, err := pca.ReadFrequency(0)\n\tif err != nil {\n\t\tfmt.Println(\"errRF0:\", err)\n\t}\n\tfmt.Println(\"get Frq0:\", frq)\n\n\terr = pca.WriteDutyCyclePercent(0, 50)\n\tif err != nil {\n\t\tfmt.Println(\"errWD0:\", err)\n\t}\n\tdc, err := pca.ReadDutyCyclePercent(0)\n\tif err != nil {\n\t\tfmt.Println(\"errRD0:\", err)\n\t}\n\tfmt.Println(\"get dc0:\", dc)\n\n\t// prepare PWM1\n\terr = pca.WriteFrequency(1, led3FrequHz)\n\tif err != nil {\n\t\tfmt.Println(\"errWF1:\", err)\n\t}\n\tfrq, err = pca.ReadFrequency(1)\n\tif err != nil {\n\t\tfmt.Println(\"errRF1:\", err)\n\t}\n\tfmt.Println(\"get Frq1:\", frq)\n\n\terr = pca.WriteDutyCyclePercent(1, 10)\n\tif err != nil {\n\t\tfmt.Println(\"errWD1:\", err)\n\t}\n\tdc, err = pca.ReadDutyCyclePercent(1)\n\tif err != nil {\n\t\tfmt.Println(\"errRD1:\", err)\n\t}\n\tfmt.Println(\"get dc1:\", dc)\n\n\t// LED 2\n\tfmt.Println(\"set LED: 2 to: pwm0\")\n\terr = pca.SetLED(2, i2c.PCA953xModePwm0)\n\tif err != nil {\n\t\tfmt.Println(\"errW:\", err)\n\t}\n\tfmt.Println(\"set LED: 3 to: pwm1\")\n\terr = pca.SetLED(3, i2c.PCA953xModePwm1)\n\tif err != nil {\n\t\tfmt.Println(\"errW:\", err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_servo.go",
    "content": "//go:build example\n// +build example\n\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\n// Wiring\n// PWM Raspi: header pin 12 (GPIO18-PWM0), please refer to the README.md, located in the folder of raspi platform, on\n// how to activate the pwm support.\n// Servo: orange (PWM), black (GND), red (VCC) 4-6V (please read the manual of your device)\nfunc main() {\n\tconst (\n\t\tpwmPin = \"pwm0\"\n\t\twait   = 3 * time.Second\n\n\t\tfiftyHzNanos = 20 * 1000 * 1000 // 50Hz = 0.02 sec = 20 ms\n\t)\n\t// usually a frequency of 50Hz is used for servos, most servos have 0.5 ms..2.5 ms for 0-180°, however the mapping\n\t// can be changed with options...\n\t//\n\t// for usage of pi-blaster driver just add the option \"adaptors.WithPWMUsePiBlaster()\" and use your pin number\n\t// instead of \"pwm0\"\n\tadaptor := raspi.NewAdaptor(adaptors.WithPWMDefaultPeriodForPin(pwmPin, fiftyHzNanos))\n\tservo := gpio.NewServoDriver(adaptor, pwmPin)\n\n\twork := func() {\n\t\tfmt.Printf(\"first move to minimal position for %s...\\n\", wait)\n\t\tif err := servo.ToMin(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"second move to center position for %s...\\n\", wait)\n\t\tif err := servo.ToCenter(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"third move to maximal position for %s...\\n\", wait)\n\t\tif err := servo.ToMax(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Println(\"finally move 0-180° (or what your servo do for the new mapping) and back forever...\")\n\t\tangle := 0\n\t\tfadeAmount := 45\n\n\t\tgobot.Every(time.Second, func() {\n\t\t\tif err := servo.Move(byte(angle)); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tangle = angle + fadeAmount\n\t\t\tif angle < 0 || angle > 180 {\n\t\t\t\tif angle < 0 {\n\t\t\t\t\tangle = 0\n\t\t\t\t}\n\t\t\t\tif angle > 180 {\n\t\t\t\t\tangle = 180\n\t\t\t\t}\n\t\t\t\t// change direction and recalculate\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t\tangle = angle + fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"motorBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_sht2x.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tsht2x := i2c.NewSHT2xDriver(r)\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tt, _ := sht2x.Temperature()\n\t\t\tfmt.Printf(\"Temperature: %v\\n\", t)\n\n\t\t\th, _ := sht2x.Humidity()\n\t\t\tfmt.Printf(\"Humidity: %v\\n\", h)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"SHT2xbot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{sht2x},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_sht3x.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tr := raspi.NewAdaptor()\n\tsht3x := i2c.NewSHT3xDriver(r)\n\n\twork := func() {\n\t\tsht3x.Units = \"F\"\n\t\tif err := sht3x.Start(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tsn, err := sht3x.SerialNumber()\n\t\tfmt.Printf(\"Serial Number: 0x%08x, err: %v\\n\", sn, err)\n\n\t\tgobot.Every(5*time.Second, func() {\n\t\t\ttemp, rh, err := sht3x.Sample()\n\t\t\tfmt.Printf(\"Temp: %f F, Relative Humidity: %f, err: %v\\n\", temp, rh, err)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"SHT3xbot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{sht3x},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_ssd1306.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\twidth := 128\n\theight := 32\n\tr := raspi.NewAdaptor()\n\toled := i2c.NewSSD1306Driver(r, i2c.WithSSD1306DisplayWidth(width), i2c.WithSSD1306DisplayHeight(height))\n\n\tstage := false\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\toled.Clear()\n\t\t\tif stage {\n\t\t\t\tfor x := 0; x < width; x += 5 {\n\t\t\t\t\tfor y := 0; y < height; y++ {\n\t\t\t\t\t\toled.Set(x, y, 1)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstage = !stage\n\t\t\tif err := oled.Display(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ssd1306Robot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{oled},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_ssd1306spi.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\n// this example only works for a 128x64 display\n//\n//nolint:lll // ok for example\nvar gobotLogo = []byte{0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xe0, 0xb0, 0x90, 0xc8, 0x6e, 0x9a, 0xb6, 0xd, 0x3a, 0x15, 0xf7, 0xd, 0x59, 0x98, 0x94, 0xf4, 0xf4, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x8f, 0x8f, 0xff, 0x97, 0xcf, 0x4f, 0xc3, 0x51, 0xc0, 0x41, 0xd1, 0x40, 0xa4, 0xc4, 0x50, 0xc0, 0x40, 0xd1, 0x87, 0xdf, 0x97, 0x77, 0x3f, 0x8f, 0x4f, 0xff, 0x9f, 0xbf, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x37, 0x37, 0xef, 0xda, 0xbf, 0xef, 0x8e, 0x8d, 0xe7, 0xad, 0xfb, 0xaf, 0x1b, 0xdb, 0x29, 0x1f, 0x56, 0xcf, 0x1b, 0xcf, 0x9b, 0x55, 0x8f, 0xdd, 0x1a, 0xd7, 0x1e, 0xb5, 0x9b, 0xad, 0x17, 0xbd, 0xab, 0x15, 0xbf, 0x2d, 0x9a, 0xb7, 0x1d, 0xb7, 0x2d, 0x9a, 0xb7, 0x9e, 0x95, 0x9f, 0x55, 0x9b, 0x5d, 0x97, 0x5a, 0x8f, 0xda, 0xf, 0xda, 0x4f, 0x9a, 0x2e, 0x5a, 0xae, 0x14, 0xff, 0x67, 0xcf, 0x8b, 0x56, 0xdd, 0x74, 0xdd, 0x77, 0x57, 0x5f, 0x5f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfe, 0xff, 0xf2, 0xff, 0xfc, 0xef, 0xba, 0xef, 0xba, 0xed, 0xbf, 0xea, 0x5f, 0xfa, 0x56, 0xfe, 0xb4, 0xde, 0x74, 0xbe, 0xec, 0x5a, 0xfc, 0x55, 0xfc, 0xd5, 0xbc, 0x74, 0xad, 0x7c, 0xa9, 0xfc, 0xa5, 0xec, 0x9d, 0xc8, 0xcd, 0xac, 0x79, 0xd5, 0x7c, 0xb4, 0xdc, 0xb4, 0xdd, 0x74, 0xdd, 0xf4, 0xac, 0xfd, 0xaa, 0xfc, 0x56, 0xfc, 0xae, 0xfa, 0xad, 0xfe, 0xaa, 0x7f, 0xed, 0x5b, 0xfe, 0x55, 0xff, 0xff, 0xab, 0xaf, 0xf9, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1f, 0x1f, 0x6e, 0xfb, 0x6e, 0xdb, 0x7e, 0xd5, 0x7f, 0xd5, 0x7f, 0xd5, 0xff, 0xaa, 0xff, 0x55, 0xff, 0x55, 0xff, 0x55, 0xff, 0xd6, 0xfd, 0xd7, 0x7d, 0xeb, 0xff, 0xaa, 0xff, 0xdb, 0x7f, 0xf5, 0xdf, 0x7b, 0xef, 0xfb, 0xed, 0xbf, 0xea, 0x7f, 0xea, 0xbf, 0xeb, 0xbe, 0xeb, 0x5e, 0xfb, 0x56, 0xff, 0x55, 0xff, 0xaa, 0xff, 0x56, 0xfd, 0x57, 0xfd, 0x57, 0xfd, 0x57, 0xfd, 0xb7, 0xb7, 0xda, 0x1a, 0x3f, 0x3f, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0xff, 0xf, 0xf, 0xf, 0x1, 0x20, 0x8, 0x40, 0x10, 0x84, 0x0, 0xa8, 0x0, 0x2, 0xa8, 0x0, 0x2, 0xa8, 0x0, 0x42, 0xfd, 0x9f, 0x75, 0xdf, 0xb5, 0xdf, 0xb5, 0xff, 0xaa, 0x7f, 0x2a, 0x5f, 0x75, 0x3f, 0x6d, 0x7f, 0x5b, 0x7f, 0xf6, 0x3f, 0xed, 0x7f, 0xfb, 0xaf, 0x7e, 0xfb, 0x6f, 0xbd, 0xf7, 0x5f, 0xfd, 0x77, 0xde, 0x7f, 0xf5, 0x5f, 0x7f, 0xf5, 0x5f, 0xff, 0x35, 0xff, 0x57, 0x7d, 0x6f, 0x3d, 0x6b, 0x3f, 0x2a, 0xff, 0x55, 0xff, 0x95, 0x7f, 0x55, 0xff, 0x95, 0x6f, 0xa8, 0x40, 0x0, 0x2a, 0x0, 0x44, 0x10, 0x4, 0x40, 0x10, 0x84, 0x0, 0x28, 0x0, 0x20, 0x1, 0xf, 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x7, 0x7, 0x7, 0xa1, 0x0, 0x48, 0xa0, 0xd4, 0x30, 0xe8, 0x1a, 0x4, 0x18, 0x44, 0xc, 0x80, 0xe, 0x20, 0x84, 0x8c, 0x0, 0xcd, 0x8, 0x88, 0x92, 0x8, 0xa0, 0x2, 0x8, 0x42, 0xb0, 0x60, 0x9a, 0xf0, 0xc, 0x10, 0x4d, 0x8, 0x85, 0x24, 0x5, 0x48, 0x4, 0x84, 0x2c, 0x0, 0x8c, 0x19, 0x68, 0xb2, 0x48, 0xf1, 0x0, 0x44, 0x10, 0x0, 0x6c, 0xd8, 0x24, 0xfc, 0x80, 0x4c, 0x84, 0x48, 0x84, 0x4c, 0x80, 0x4c, 0x84, 0x48, 0xd4, 0x38, 0xe4, 0x18, 0x60, 0x4, 0x90, 0x2, 0x20, 0xc4, 0x31, 0xe8, 0x92, 0x78, 0x4, 0x19, 0x44, 0x9, 0x85, 0x25, 0x8, 0x85, 0x24, 0x4, 0x48, 0x5, 0x18, 0xb4, 0x49, 0xb0, 0xd4, 0x21, 0xcc, 0x0, 0x4c, 0x1, 0x8c, 0x24, 0x4, 0x88, 0x76, 0xa8, 0xdc, 0x30, 0x4e, 0x0, 0xc, 0x44, 0xc, 0x0, 0xc, 0x8, 0x62, 0x0, 0xa, 0x0, 0x10, 0x10, 0x80, 0xc0, 0xe0, 0xe2, 0x8, 0x0, 0x13, 0x6, 0x9, 0x27, 0xc, 0xc9, 0x18, 0x2, 0x58, 0x0, 0x9a, 0x10, 0x44, 0x18, 0x81, 0x18, 0x47, 0x18, 0x7, 0x4d, 0x2, 0x10, 0x4, 0x1, 0x13, 0x4, 0xb, 0x26, 0xd, 0xc8, 0x18, 0x82, 0x18, 0x10, 0x54, 0x1, 0x18, 0x40, 0x1a, 0x88, 0x98, 0xc6, 0x9, 0x27, 0xa, 0x85, 0x11, 0x40, 0xa, 0x20, 0x8b, 0x16, 0x49, 0x8e, 0x19, 0x80, 0x58, 0x82, 0x18, 0x81, 0x58, 0x8, 0x90, 0x89, 0xd8, 0x5, 0xe, 0x29, 0x7, 0x12, 0x4, 0x0, 0x68, 0x1, 0x87, 0xa0, 0xf, 0xa, 0xd4, 0x9, 0x18, 0x40, 0x1a, 0x0, 0x58, 0x2, 0x18, 0x40, 0x99, 0x4, 0x58, 0x6, 0x2b, 0x4, 0x13, 0x5, 0x80, 0x8, 0x2, 0x0, 0x28, 0x2, 0x40, 0x8, 0x97, 0xa, 0x9d, 0x53, 0x4, 0x0, 0x51, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80}\n\nfunc main() {\n\traspiAdaptor := raspi.NewAdaptor()\n\toled := spi.NewSSD1306Driver(raspiAdaptor)\n\twork := func() {\n\t\t_ = oled.Clear()\n\t\tif err := oled.SetBufferAndDisplay(gobotLogo); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\trobot := gobot.NewRobot(\"ssd1360\",\n\t\t[]gobot.Connection{raspiAdaptor},\n\t\t[]gobot.Device{oled},\n\t\twork,\n\t)\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_stepper_move.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n\tconst (\n\t\tcoilA1 = \"7\"\n\t\tcoilA2 = \"13\"\n\t\tcoilB1 = \"11\"\n\t\tcoilB2 = \"15\"\n\n\t\tdegPerStep = 1.875\n\t\tcountRot   = 10\n\t)\n\tstepPerRevision := int(360.0 / degPerStep)\n\n\tr := raspi.NewAdaptor()\n\tstepper := gpio.NewStepperDriver(r, [4]string{coilA1, coilB1, coilA2, coilB2}, gpio.StepperModes.DualPhaseStepping,\n\t\tuint(stepPerRevision))\n\n\twork := func() {\n\t\tdefer func() {\n\t\t\tec := 0\n\t\t\t// set current to zero to prevent overheating\n\t\t\tif err := stepper.Sleep(); err != nil {\n\t\t\t\tec = 1\n\t\t\t\tlog.Println(\"work done\", err)\n\t\t\t} else {\n\t\t\t\tlog.Println(\"work done\")\n\t\t\t}\n\n\t\t\tos.Exit(ec)\n\t\t}()\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\t// this stops only the current movement and the next will start immediately (if any)\n\t\t\t// this means for the example, that the first rotation stops after ~5 rotations\n\t\t\tlog.Println(\"asynchron stop after 5 sec.\")\n\t\t\tif err := stepper.Stop(); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t// one rotation per second\n\t\tif err := stepper.SetSpeed(60); err != nil {\n\t\t\tlog.Println(\"set speed\", err)\n\t\t}\n\n\t\t// Move forward N revolution\n\t\tif err := stepper.Move(stepPerRevision * countRot); err != nil {\n\t\t\tlog.Println(\"move forward\", err)\n\t\t}\n\n\t\t// Move backward N revolution\n\t\tif err := stepper.MoveDeg(-360 * countRot); err != nil {\n\t\t\tlog.Println(\"move backward\", err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"stepperBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{stepper},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/raspi_thermalzone.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\n// Wiring: no wiring needed\nfunc main() {\n\tadaptor := raspi.NewAdaptor()\n\ttherm0C := aio.NewThermalZoneDriver(adaptor, \"thermal_zone0\")\n\ttherm0F := aio.NewThermalZoneDriver(adaptor, \"thermal_zone0\", aio.WithFahrenheit())\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tt0C, err := therm0C.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tt0F, err := therm0F.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"Zone 0: %2.3f °C, %2.3f °F\\n\", t0C, t0F)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"thermalBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{therm0C, therm0F},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/rock64_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/pine64/rock64\"\n)\n\n// Wiring\n// PWR  ROCK64: 1, P5_1 (+3.3V, VCC); 2, 4, P5_2 (+5V, VDD); 6, 9, 14, 20, P5_7, P5_8, P5_15, P5_16 (GND)\n// GPIO ROCK64: second header P5+BUS pin 3 is input, pin 4 is normal output, pin 5 is inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of the LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed for >2 seconds the state\n// changes\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"P5_3\"\n\t\toutPinNum         = \"P5_4\"\n\t\toutPinInvertedNum = \"P5_5\"\n\t\tdebounceTime      = 2 * time.Second\n\t)\n\t// note: WithGpiosOpenDrain() is optional, if using WithGpiosOpenSource() the LED's will not light up\n\tboard := rock64.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum),\n\t\tadaptors.WithGpiosOpenDrain(outPinNum, outPinInvertedNum),\n\t\tadaptors.WithGpiosPullUp(inPinNum),\n\t\tadaptors.WithGpioDebounce(inPinNum, debounceTime))\n\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t\tif level == 1 {\n\t\t\t\t\tlevel = 0\n\t\t\t\t} else {\n\t\t\t\t\tlevel = 1\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/rock64_yl40.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/pine64/rock64\"\n)\n\nfunc main() {\n\t// Wiring\n\t// PWR  ROCK64: 1, P5_1 (+3.3V, VCC), 6, 9, 14, 20, P5_7, P5_8, P5_15, P5_16 (GND)\n\t// I2C0 ROCK64: 3 (SDA), 5 (SCL)\n\t// I2C1 ROCK64: 27 (SDA), 28 (SCL)\n\t// YL-40 module: wire AOUT --> AIN2 for this example\n\t//\n\t// Note: temperature measurement is often buggy, because sensor is not properly grounded\n\t//       fix it by soldering a small bridge to the adjacent ground pin of brightness sensor\n\tboard := rock64.NewAdaptor()\n\tyl := i2c.NewYL40Driver(board, i2c.WithBus(1))\n\n\twork := func() {\n\t\t// the LED light is visible above ~1.7V\n\t\twriteVal, _ := yl.AOUT()\n\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif err := yl.Write(writeVal); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\" %.1f V written\", writeVal)\n\t\t\t\twriteVal = writeVal + 0.1\n\t\t\t\tif writeVal > 3.3 {\n\t\t\t\t\twriteVal = 0\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif brightness, err := yl.ReadBrightness(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Brightness: %.0f [0..1000]\", brightness)\n\t\t\t}\n\n\t\t\tif temperature, err := yl.ReadTemperature(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Temperature: %.1f °C\", temperature)\n\t\t\t}\n\n\t\t\tif ain2, err := yl.ReadAIN2(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Read back AOUT: %.1f [0..3.3]\", ain2)\n\t\t\t}\n\n\t\t\tif potiState, err := yl.ReadPotentiometer(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Resistor: %.0f %% [-100..+100]\", potiState)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"yl40Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{yl},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_megapi_motor.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/megapi\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\t// use \"/dev/ttyUSB0\" if connecting with USB cable\n\t// use \"/dev/ttyAMA0\" on devices older than Raspberry Pi 3 Model B\n\tadaptor := serialport.NewAdaptor(\"/dev/ttyS0\", serialport.WithName(\"MegaPi\"))\n\tmotor := megapi.NewMotorDriver(adaptor, 1)\n\n\twork := func() {\n\t\tspeed := int16(0)\n\t\tfadeAmount := int16(30)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := motor.Speed(speed); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tspeed = speed + fadeAmount\n\t\t\tif speed == 0 || speed == 300 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"megaPiBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{motor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_mindwave.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/neurosky\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\tadaptor := serialport.NewAdaptor(\"/dev/rfcomm0\", serialport.WithName(\"Neurosky\"), serialport.WithBaudRate(57600))\n\tneuro := neurosky.NewMindWaveDriver(adaptor)\n\n\twork := func() {\n\t\t_ = neuro.On(neuro.Event(\"extended\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Extended\", data)\n\t\t})\n\t\t_ = neuro.On(neuro.Event(\"signal\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Signal\", data)\n\t\t})\n\t\t_ = neuro.On(neuro.Event(\"attention\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Attention\", data)\n\t\t})\n\t\t_ = neuro.On(neuro.Event(\"meditation\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Meditation\", data)\n\t\t})\n\t\t_ = neuro.On(neuro.Event(\"blink\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Blink\", data)\n\t\t})\n\t\t_ = neuro.On(neuro.Event(\"wave\"), func(data interface{}) {\n\t\t\tfmt.Println(\"Wave\", data)\n\t\t})\n\t\t_ = neuro.On(neuro.Event(\"eeg\"), func(data interface{}) {\n\t\t\teeg := data.(neurosky.MindWaveEEGData)\n\t\t\tfmt.Println(\"Delta\", eeg.Delta)\n\t\t\tfmt.Println(\"Theta\", eeg.Theta)\n\t\t\tfmt.Println(\"LoAlpha\", eeg.LoAlpha)\n\t\t\tfmt.Println(\"HiAlpha\", eeg.HiAlpha)\n\t\t\tfmt.Println(\"LoBeta\", eeg.LoBeta)\n\t\t\tfmt.Println(\"HiBeta\", eeg.HiBeta)\n\t\t\tfmt.Println(\"LoGamma\", eeg.LoGamma)\n\t\t\tfmt.Println(\"MidGamma\", eeg.MidGamma)\n\t\t\tfmt.Printf(\"\\n\\n\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"brainBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{neuro},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_sphero.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\tadaptor := serialport.NewAdaptor(\"/dev/rfcomm0\")\n\tspheroDriver := sphero.NewSpheroDriver(adaptor)\n\n\twork := func() {\n\t\tspheroDriver.SetDataStreaming(spherocommon.DefaultDataStreamingConfig())\n\n\t\t_ = spheroDriver.On(spherocommon.CollisionEvent, func(data interface{}) {\n\t\t\tfmt.Printf(\"Collision! %+v\\n\", data)\n\t\t})\n\n\t\t_ = spheroDriver.On(spherocommon.SensorDataEvent, func(data interface{}) {\n\t\t\tfmt.Printf(\"Streaming Data! %+v\\n\", data)\n\t\t})\n\n\t\tgobot.Every(3*time.Second, func() {\n\t\t\tspheroDriver.Roll(30, uint16(gobot.Rand(360)))\n\t\t})\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tr := uint8(gobot.Rand(255))\n\t\t\tg := uint8(gobot.Rand(255))\n\t\t\tb := uint8(gobot.Rand(255))\n\t\t\tspheroDriver.SetRGB(r, g, b)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sphero\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{spheroDriver},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_sphero_api.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\tspheros := map[string]string{\n\t\t\"Sphero-BPO\": \"/dev/rfcomm0\",\n\t}\n\n\tfor name, port := range spheros {\n\t\tspheroAdaptor := serialport.NewAdaptor(port)\n\t\tspheroDriver := sphero.NewSpheroDriver(spheroAdaptor)\n\n\t\twork := func() {\n\t\t\tspheroDriver.SetRGB(uint8(255), uint8(0), uint8(0))\n\t\t}\n\n\t\trobot := gobot.NewRobot(name,\n\t\t\t[]gobot.Connection{spheroAdaptor},\n\t\t\t[]gobot.Device{spheroDriver},\n\t\t\twork,\n\t\t)\n\t\trobot.AddCommand(\"turn_blue\", func(params map[string]interface{}) interface{} {\n\t\t\tspheroDriver.SetRGB(uint8(0), uint8(0), uint8(255))\n\t\t\treturn nil\n\t\t})\n\n\t\tmanager.AddRobot(robot)\n\t}\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_sphero_calibration.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/keyboard\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\ta := api.NewAPI(manager)\n\ta.Start()\n\n\tballConn := serialport.NewAdaptor(\"/dev/rfcomm0\")\n\tball := sphero.NewSpheroDriver(ballConn)\n\n\tkeys := keyboard.NewDriver()\n\n\tcalibrating := false\n\n\twork := func() {\n\t\t_ = keys.On(keyboard.Key, func(data interface{}) {\n\t\t\tkey := data.(keyboard.KeyEvent)\n\n\t\t\tswitch key.Key {\n\t\t\tcase keyboard.ArrowUp:\n\t\t\t\tif calibrating {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tball.Roll(100, 0)\n\t\t\tcase keyboard.ArrowDown:\n\t\t\t\tif calibrating {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tball.Roll(100, 100)\n\t\t\tcase keyboard.ArrowLeft:\n\t\t\t\tball.Roll(100, 270)\n\t\t\tcase keyboard.ArrowRight:\n\t\t\t\tball.Roll(100, 90)\n\t\t\tcase keyboard.Spacebar:\n\t\t\t\tif calibrating {\n\t\t\t\t\tball.FinishCalibration()\n\t\t\t\t} else {\n\t\t\t\t\tball.StartCalibration()\n\t\t\t\t}\n\t\t\t\tcalibrating = !calibrating\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sphero-calibration\",\n\t\t[]gobot.Connection{ballConn},\n\t\t[]gobot.Device{ball, keys},\n\t\twork,\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_sphero_conways.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n\t\"gobot.io/x/gobot/v2/drivers/serial\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\ntype conway struct {\n\talive    bool\n\tage      int\n\tcontacts int\n\tcell     *sphero.SpheroDriver\n}\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\n\tspheros := []string{\n\t\t\"/dev/rfcomm0\",\n\t\t\"/dev/rfcomm1\",\n\t\t\"/dev/rfcomm2\",\n\t}\n\n\tfor _, port := range spheros {\n\t\tspheroAdaptor := serialport.NewAdaptor(port)\n\n\t\tcell := sphero.NewSpheroDriver(spheroAdaptor, serial.WithName(\"Sphero\"+port))\n\n\t\twork := func() {\n\t\t\tconway := new(conway)\n\t\t\tconway.cell = cell\n\n\t\t\tconway.birth()\n\n\t\t\t_ = cell.On(spherocommon.CollisionEvent, func(data interface{}) {\n\t\t\t\tconway.contact()\n\t\t\t})\n\n\t\t\tgobot.Every(3*time.Second, func() {\n\t\t\t\tif conway.alive {\n\t\t\t\t\tconway.movement()\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tgobot.Every(10*time.Second, func() {\n\t\t\t\tif conway.alive {\n\t\t\t\t\tconway.birthday()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"conway\",\n\t\t\t[]gobot.Connection{spheroAdaptor},\n\t\t\t[]gobot.Device{cell},\n\t\t\twork,\n\t\t)\n\n\t\tmanager.AddRobot(robot)\n\t}\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc (c *conway) resetContacts() {\n\tc.contacts = 0\n}\n\nfunc (c *conway) contact() {\n\tc.contacts++\n}\n\nfunc (c *conway) rebirth() {\n\tfmt.Println(\"Welcome back\", c.cell.Name(), \"!\")\n\tc.life()\n}\n\nfunc (c *conway) birth() {\n\tc.resetContacts()\n\tc.age = 0\n\tc.life()\n\tc.movement()\n}\n\nfunc (c *conway) life() {\n\tc.cell.SetRGB(0, 255, 0)\n\tc.alive = true\n}\n\nfunc (c *conway) death() {\n\tfmt.Println(c.cell.Name(), \"died :(\")\n\tc.alive = false\n\tc.cell.SetRGB(255, 0, 0)\n\tc.cell.Stop()\n}\n\nfunc (c *conway) enoughContacts() bool {\n\tif c.contacts >= 2 && c.contacts < 7 {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (c *conway) birthday() {\n\tc.age++\n\n\tfmt.Println(\"Happy birthday\", c.cell.Name(), \"you are\", c.age, \"and had\", c.contacts, \"contacts.\")\n\n\tif c.enoughContacts() {\n\t\tif !c.alive {\n\t\t\tc.rebirth()\n\t\t}\n\t} else {\n\t\tc.death()\n\t}\n\n\tc.resetContacts()\n}\n\nfunc (c *conway) movement() {\n\tif c.alive {\n\t\tc.cell.Roll(100, uint16(gobot.Rand(360)))\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_sphero_dpad.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\ta := api.NewAPI(manager)\n\ta.Start()\n\n\tconn := serialport.NewAdaptor(\"/dev/rfcomm0\")\n\tball := sphero.NewSpheroDriver(conn)\n\n\trobot := gobot.NewRobot(\"sphero-dpad\",\n\t\t[]gobot.Connection{conn},\n\t\t[]gobot.Device{ball},\n\t)\n\n\trobot.AddCommand(\"move\", func(params map[string]interface{}) interface{} {\n\t\tdirection := params[\"direction\"].(string)\n\n\t\tswitch direction {\n\t\tcase \"up\":\n\t\t\tball.Roll(100, 0)\n\t\tcase \"down\":\n\t\t\tball.Roll(100, 180)\n\t\tcase \"left\":\n\t\t\tball.Roll(100, 270)\n\t\tcase \"right\":\n\t\t\tball.Roll(100, 90)\n\t\t}\n\n\t\ttime.Sleep(2 * time.Second)\n\t\tball.Stop()\n\t\treturn \"ok\"\n\t})\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_sphero_master.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\n\tspheros := map[string]string{\n\t\t\"Sphero-BPO\": \"/dev/rfcomm0\",\n\t}\n\n\tfor name, port := range spheros {\n\t\tspheroAdaptor := serialport.NewAdaptor(port)\n\t\tspheroDriver := sphero.NewSpheroDriver(spheroAdaptor)\n\n\t\twork := func() {\n\t\t\tspheroDriver.SetRGB(uint8(255), uint8(0), uint8(0))\n\t\t}\n\n\t\trobot := gobot.NewRobot(name,\n\t\t\t[]gobot.Connection{spheroAdaptor},\n\t\t\t[]gobot.Device{spheroDriver},\n\t\t\twork,\n\t\t)\n\n\t\tmanager.AddRobot(robot)\n\t}\n\n\trobot := gobot.NewRobot(\"\",\n\t\tfunc() {\n\t\t\tgobot.Every(1*time.Second, func() {\n\t\t\t\tsphero := manager.Robot(\"Sphero-BPO\").Device(\"sphero\").(*sphero.SpheroDriver)\n\t\t\t\tsphero.SetRGB(uint8(gobot.Rand(255)),\n\t\t\t\t\tuint8(gobot.Rand(255)),\n\t\t\t\t\tuint8(gobot.Rand(255)),\n\t\t\t\t)\n\t\t\t})\n\t\t},\n\t)\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/serialport_sphero_multiple.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n//nolint:gosec // ok here\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/common/spherocommon\"\n\t\"gobot.io/x/gobot/v2/drivers/serial\"\n\t\"gobot.io/x/gobot/v2/drivers/serial/sphero\"\n\t\"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc NewSwarmBot(port string) *gobot.Robot {\n\tspheroAdaptor := serialport.NewAdaptor(port)\n\tspheroDriver := sphero.NewSpheroDriver(spheroAdaptor, serial.WithName(\"Sphero\"+port))\n\n\twork := func() {\n\t\tspheroDriver.Stop()\n\n\t\t_ = spheroDriver.On(spherocommon.CollisionEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"Collision Detected!\")\n\t\t})\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tspheroDriver.Roll(100, uint16(gobot.Rand(360)))\n\t\t})\n\t\tgobot.Every(3*time.Second, func() {\n\t\t\tspheroDriver.SetRGB(uint8(gobot.Rand(255)),\n\t\t\t\tuint8(gobot.Rand(255)),\n\t\t\t\tuint8(gobot.Rand(255)),\n\t\t\t)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sphero\",\n\t\t[]gobot.Connection{spheroAdaptor},\n\t\t[]gobot.Device{spheroDriver},\n\t\twork,\n\t)\n\n\treturn robot\n}\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\tapi.NewAPI(manager).Start()\n\n\tspheros := []string{\n\t\t\"/dev/rfcomm0\",\n\t\t\"/dev/rfcomm1\",\n\t\t\"/dev/rfcomm2\",\n\t\t\"/dev/rfcomm3\",\n\t}\n\n\tfor _, port := range spheros {\n\t\tmanager.AddRobot(NewSwarmBot(port))\n\t}\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/square.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\ta := api.NewAPI(manager)\n\ta.Start()\n\n\tboard := edison.NewAdaptor()\n\tred := gpio.NewLedDriver(board, \"3\")\n\tgreen := gpio.NewLedDriver(board, \"5\")\n\tblue := gpio.NewLedDriver(board, \"6\")\n\n\tbutton := gpio.NewButtonDriver(board, \"7\")\n\n\tenabled := true\n\twork := func() {\n\t\tif err := red.Brightness(0xff); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := green.Brightness(0x00); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := blue.Brightness(0x00); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tflash := false\n\t\ton := true\n\n\t\tgobot.Every(250*time.Millisecond, func() {\n\t\t\tif enabled {\n\t\t\t\tif flash {\n\t\t\t\t\tif on {\n\t\t\t\t\t\tif err := red.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := green.Brightness(0xff); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := blue.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ton = false\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif err := red.Brightness(0xff); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := green.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := blue.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ton = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tflash = true\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tflash = false\n\t\t\tif err := red.Brightness(0x00); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := green.Brightness(0x00); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := blue.Brightness(0xff); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\n\t\t\"square of fire\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{red, green, blue, button},\n\t\twork,\n\t)\n\n\trobot.AddCommand(\"enable\", func(params map[string]interface{}) interface{} {\n\t\tenabled = !enabled\n\t\treturn enabled\n\t})\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/square_fire.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/api\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n\tmanager := gobot.NewManager()\n\ta := api.NewAPI(manager)\n\ta.Start()\n\n\tboard := edison.NewAdaptor()\n\tred := gpio.NewLedDriver(board, \"3\")\n\tgreen := gpio.NewLedDriver(board, \"5\")\n\tblue := gpio.NewLedDriver(board, \"6\")\n\n\tbutton := gpio.NewButtonDriver(board, \"7\")\n\n\tenabled := true\n\twork := func() {\n\t\tif err := red.Brightness(0xff); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := green.Brightness(0x00); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := blue.Brightness(0x00); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tflash := false\n\t\ton := true\n\n\t\tgobot.Every(50*time.Millisecond, func() {\n\t\t\tif enabled {\n\t\t\t\tif flash {\n\t\t\t\t\tif on {\n\t\t\t\t\t\tif err := red.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := green.Brightness(0xff); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := blue.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ton = false\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif err := red.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := green.Brightness(0x00); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := blue.Brightness(0xff); err != nil {\n\t\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\ton = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonPush, func(data interface{}) {\n\t\t\tflash = true\n\t\t})\n\n\t\t_ = button.On(gpio.ButtonRelease, func(data interface{}) {\n\t\t\tflash = false\n\t\t\tif err := red.Brightness(0x00); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := green.Brightness(0x00); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := blue.Brightness(0xff); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\n\t\t\"square of fire\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{red, green, blue, button},\n\t\twork,\n\t)\n\n\trobot.AddCommand(\"enable\", func(params map[string]interface{}) interface{} {\n\t\tenabled = !enabled\n\t\treturn enabled\n\t})\n\n\tmanager.AddRobot(robot)\n\n\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tello.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nHow to run:\nConnect to the drone's Wi-Fi network from your computer. It will be named something like \"TELLO-XXXXXX\".\n\nOnce you are connected you can run the Gobot code on your computer to control the drone.\n\n\tgo run examples/tello.go\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/dji/tello\"\n)\n\nfunc main() {\n\tdrone := tello.NewDriver(\"8888\")\n\n\twork := func() {\n\t\tif err := drone.TakeOff(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"tello\",\n\t\t[]gobot.Connection{},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tello_facetracker.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nYou must have ffmpeg and OpenCV installed in order to run this code. It will connect to the Tello\nand then open a window using OpenCV showing the streaming video.\n\nHow to run\n\n\tgo run examples/tello_facetracker.go ~/Downloads/res10_300x300_ssd_iter_140000.caffemodel ~/Development/opencv/samples/dnn/face_detector/deploy.prototxt\n\nYou can find download the weight via https://github.com/opencv/opencv_3rdparty/raw/dnn_samples_face_detector_20170830/res10_300x300_ssd_iter_140000.caffemodel\nAnd you can find protofile in OpenCV samples directory\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"image/color\"\n\t\"io\"\n\t\"math\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strconv\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/dji/tello\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n\t\"gocv.io/x/gocv\"\n)\n\ntype pair struct {\n\tx float64\n\ty float64\n}\n\nconst (\n\tframeX    = 400\n\tframeY    = 300\n\tframeSize = frameX * frameY * 3\n\toffset    = 32767.0\n)\n\nvar (\n\t// ffmpeg command to decode video stream from drone\n\tffmpeg = exec.Command(\"ffmpeg\", \"-hwaccel\", \"auto\", \"-hwaccel_device\", \"opencl\", \"-i\", \"pipe:0\",\n\t\t\"-nostats\", \"-flags\", \"low_delay\", \"-probesize\", \"32\", \"-fflags\", \"nobuffer+fastseek+flush_packets\", \"-analyzeduration\", \"0\", \"-af\", \"aresample=async=1:min_comp=0.1:first_pts=0\",\n\t\t\"-pix_fmt\", \"bgr24\", \"-s\", strconv.Itoa(frameX)+\"x\"+strconv.Itoa(frameY), \"-f\", \"rawvideo\", \"pipe:1\")\n\tffmpegIn, _  = ffmpeg.StdinPipe()\n\tffmpegOut, _ = ffmpeg.StdoutPipe()\n\n\t// gocv\n\twindow = gocv.NewWindow(\"Tello\")\n\tnet    *gocv.Net\n\tgreen  = color.RGBA{0, 255, 0, 0}\n\n\t// tracking\n\ttracking                 = false\n\tdetected                 = false\n\tdetectSize               = false\n\tdistTolerance            = 0.05 * dist(0, 0, frameX, frameY)\n\trefDistance              float64\n\tleft, top, right, bottom float64\n\n\t// drone\n\tdrone      = tello.NewDriver(\"8890\")\n\tflightData *tello.FlightData\n\n\t// joystick\n\tjoyAdaptor                   = joystick.NewAdaptor(\"0\")\n\tstick                        = joystick.NewDriver(joyAdaptor, \"dualshock4\")\n\tleftX, leftY, rightX, rightY atomic.Value\n)\n\nfunc init() {\n\tleftX.Store(float64(0.0))\n\tleftY.Store(float64(0.0))\n\trightX.Store(float64(0.0))\n\trightY.Store(float64(0.0))\n\n\t// process drone events in separate goroutine for concurrency\n\tgo func() {\n\t\thandleJoystick()\n\n\t\tif err := ffmpeg.Start(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t\treturn\n\t\t}\n\n\t\t_ = drone.On(tello.FlightDataEvent, func(data interface{}) {\n\t\t\t// TODO: protect flight data from race condition\n\t\t\tflightData = data.(*tello.FlightData)\n\t\t})\n\n\t\t_ = drone.On(tello.ConnectedEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"Connected\")\n\t\t\tif err := drone.StartVideo(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := drone.SetVideoEncoderRate(tello.VideoBitRateAuto); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := drone.SetExposure(0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\t\tif err := drone.StartVideo(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\t_ = drone.On(tello.VideoFrameEvent, func(data interface{}) {\n\t\t\tpkt := data.([]byte)\n\t\t\tif _, err := ffmpegIn.Write(pkt); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\trobot := gobot.NewRobot(\"tello\",\n\t\t\t[]gobot.Connection{joyAdaptor},\n\t\t\t[]gobot.Device{drone, stick},\n\t\t)\n\n\t\terr := robot.Start()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}()\n}\n\nfunc main() {\n\tif len(os.Args) < 5 {\n\t\tfmt.Println(\"How to run:\\ngo run facetracker.go [model] [config] ([backend] [device])\")\n\t\treturn\n\t}\n\n\tmodel := os.Args[1]\n\tconfig := os.Args[2]\n\tbackend := gocv.NetBackendDefault\n\tif len(os.Args) > 3 {\n\t\tbackend = gocv.ParseNetBackend(os.Args[3])\n\t}\n\n\ttarget := gocv.NetTargetCPU\n\tif len(os.Args) > 4 {\n\t\ttarget = gocv.ParseNetTarget(os.Args[4])\n\t}\n\n\tn := gocv.ReadNet(model, config)\n\tif n.Empty() {\n\t\tfmt.Printf(\"Error reading network model from : %v %v\\n\", model, config)\n\t\treturn\n\t}\n\tnet = &n\n\tdefer net.Close()\n\tnet.SetPreferableBackend(gocv.NetBackendType(backend))\n\tnet.SetPreferableTarget(gocv.NetTargetType(target))\n\n\tfor {\n\t\t// get next frame from stream\n\t\tbuf := make([]byte, frameSize)\n\t\tif _, err := io.ReadFull(ffmpegOut, buf); err != nil {\n\t\t\tfmt.Println(err)\n\t\t\tcontinue\n\t\t}\n\t\timg, _ := gocv.NewMatFromBytes(frameY, frameX, gocv.MatTypeCV8UC3, buf)\n\t\tif img.Empty() {\n\t\t\tcontinue\n\t\t}\n\n\t\ttrackFace(&img)\n\n\t\twindow.IMShow(img)\n\t\tif window.WaitKey(10) >= 0 {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc trackFace(frame *gocv.Mat) {\n\tW := float64(frame.Cols())\n\tH := float64(frame.Rows())\n\n\tblob := gocv.BlobFromImage(*frame, 1.0, image.Pt(300, 300), gocv.NewScalar(104, 177, 123, 0), false, false)\n\tdefer blob.Close()\n\n\tnet.SetInput(blob, \"data\")\n\n\tdetBlob := net.Forward(\"detection_out\")\n\tdefer detBlob.Close()\n\n\tdetections := gocv.GetBlobChannel(detBlob, 0, 0)\n\tdefer detections.Close()\n\n\tfor r := 0; r < detections.Rows(); r++ {\n\t\tconfidence := detections.GetFloatAt(r, 2)\n\t\tif confidence < 0.5 {\n\t\t\tcontinue\n\t\t}\n\n\t\tleft = float64(detections.GetFloatAt(r, 3)) * W\n\t\ttop = float64(detections.GetFloatAt(r, 4)) * H\n\t\tright = float64(detections.GetFloatAt(r, 5)) * W\n\t\tbottom = float64(detections.GetFloatAt(r, 6)) * H\n\n\t\tleft = math.Min(math.Max(0.0, left), W-1.0)\n\t\tright = math.Min(math.Max(0.0, right), W-1.0)\n\t\tbottom = math.Min(math.Max(0.0, bottom), H-1.0)\n\t\ttop = math.Min(math.Max(0.0, top), H-1.0)\n\n\t\tdetected = true\n\t\trect := image.Rect(int(left), int(top), int(right), int(bottom))\n\t\tgocv.Rectangle(frame, rect, green, 3)\n\t}\n\n\tif !tracking || !detected {\n\t\treturn\n\t}\n\n\tif detectSize {\n\t\tdetectSize = false\n\t\trefDistance = dist(left, top, right, bottom)\n\t}\n\n\tdistance := dist(left, top, right, bottom)\n\n\t// x axis\n\tswitch {\n\tcase right < W/2:\n\t\tdrone.CounterClockwise(50)\n\tcase left > W/2:\n\t\tdrone.Clockwise(50)\n\tdefault:\n\t\tdrone.Clockwise(0)\n\t}\n\n\t// y axis\n\tswitch {\n\tcase top < H/10:\n\t\tdrone.Up(25)\n\tcase bottom > H-H/10:\n\t\tdrone.Down(25)\n\tdefault:\n\t\tdrone.Up(0)\n\t}\n\n\t// z axis\n\tswitch {\n\tcase distance < refDistance-distTolerance:\n\t\tdrone.Forward(20)\n\tcase distance > refDistance+distTolerance:\n\t\tdrone.Backward(20)\n\tdefault:\n\t\tdrone.Forward(0)\n\t}\n}\n\nfunc dist(x1, y1, x2, y2 float64) float64 {\n\treturn math.Sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))\n}\n\nfunc handleJoystick() {\n\t_ = stick.On(joystick.CirclePress, func(data interface{}) {\n\t\tdrone.Forward(0)\n\t\tdrone.Up(0)\n\t\tdrone.Clockwise(0)\n\t\ttracking = !tracking\n\t\tif tracking {\n\t\t\tdetectSize = true\n\t\t\tprintln(\"tracking\")\n\t\t} else {\n\t\t\tdetectSize = false\n\t\t\tprintln(\"not tracking\")\n\t\t}\n\t})\n\t_ = stick.On(joystick.SquarePress, func(data interface{}) {\n\t\tfmt.Println(\"battery:\", flightData.BatteryPercentage)\n\t})\n\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\tdrone.TakeOff()\n\t\tprintln(\"Takeoff\")\n\t})\n\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\tdrone.Land()\n\t\tprintln(\"Land\")\n\t})\n\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\tval := float64(data.(int16))\n\t\tleftX.Store(val)\n\t})\n\n\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\tval := float64(data.(int16))\n\t\tleftY.Store(val)\n\t})\n\n\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\tval := float64(data.(int16))\n\t\trightX.Store(val)\n\t})\n\n\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\tval := float64(data.(int16))\n\t\trightY.Store(val)\n\t})\n\tgobot.Every(50*time.Millisecond, func() {\n\t\trightStick := getRightStick()\n\n\t\tswitch {\n\t\tcase rightStick.y < -10:\n\t\t\tif err := drone.Forward(tello.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase rightStick.y > 10:\n\t\t\tif err := drone.Backward(tello.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := drone.Forward(0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\n\t\tswitch {\n\t\tcase rightStick.x > 10:\n\t\t\tif err := drone.Right(tello.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase rightStick.x < -10:\n\t\t\tif err := drone.Left(tello.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := drone.Right(0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\t})\n\n\tgobot.Every(50*time.Millisecond, func() {\n\t\tleftStick := getLeftStick()\n\t\tswitch {\n\t\tcase leftStick.y < -10:\n\t\t\tif err := drone.Up(tello.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase leftStick.y > 10:\n\t\t\tif err := drone.Down(tello.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := drone.Up(0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\n\t\tswitch {\n\t\tcase leftStick.x > 20:\n\t\t\tif err := drone.Clockwise(tello.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase leftStick.x < -20:\n\t\t\tif err := drone.CounterClockwise(tello.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := drone.Clockwise(0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\t})\n}\n\nfunc getLeftStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = leftX.Load().(float64)\n\ts.y = leftY.Load().(float64)\n\treturn s\n}\n\nfunc getRightStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = rightX.Load().(float64)\n\ts.y = rightY.Load().(float64)\n\treturn s\n}\n"
  },
  {
    "path": "examples/tello_keyboard.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nHow to run:\nConnect to the drone's Wi-Fi network from your computer. It will be named something like \"TELLO-XXXXXX\".\n\nOnce you are connected you can run the Gobot code on your computer to control the drone.\n\n\tgo run examples/tello_keyboard.go\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/dji/tello\"\n\t\"gobot.io/x/gobot/v2/platforms/keyboard\"\n)\n\nfunc resetDronePostion(drone *tello.Driver) {\n\tif err := drone.Forward(0); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := drone.Backward(0); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := drone.Up(0); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := drone.Down(0); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := drone.Left(0); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := drone.Right(0); err != nil {\n\t\tfmt.Println(err)\n\t}\n\tif err := drone.Clockwise(0); err != nil {\n\t\tfmt.Println(err)\n\t}\n}\n\nfunc main() {\n\tdrone := tello.NewDriver(\"8888\")\n\tkeys := keyboard.NewDriver()\n\n\t_ = keys.On(keyboard.Key, func(data interface{}) {\n\t\tkey := data.(keyboard.KeyEvent)\n\t\tswitch key.Key {\n\t\tcase keyboard.A:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.Clockwise(-25); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.D:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.Clockwise(25); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.W:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.Forward(20); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.S:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.Backward(20); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.K:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.Down(20); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.J:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.Up(20); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.Q:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.P:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.TakeOff(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.ArrowUp:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.FrontFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.ArrowDown:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.BackFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.ArrowLeft:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.LeftFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.ArrowRight:\n\t\t\tfmt.Println(key.Char)\n\t\t\tif err := drone.RightFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\tcase keyboard.Escape:\n\t\t\tresetDronePostion(drone)\n\t\t}\n\t})\n\n\tvar flightData *tello.FlightData\n\twork := func() {\n\t\t_ = drone.On(tello.FlightDataEvent, func(data interface{}) {\n\t\t\tflightData = data.(*tello.FlightData)\n\t\t\tfmt.Println(\"Height:\", flightData.Height)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"tello\",\n\t\t[]gobot.Connection{},\n\t\t[]gobot.Device{keys, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tello_opencv.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nYou must have ffmpeg and OpenCV installed in order to run this code. It will connect to the Tello\nand then open a window using OpenCV showing the streaming video.\n\nHow to run\n\n\tgo run examples/tello_opencv.go\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os/exec\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/dji/tello\"\n\t\"gocv.io/x/gocv\"\n)\n\nconst (\n\tframeX    = 960\n\tframeY    = 720\n\tframeSize = frameX * frameY * 3\n)\n\nfunc main() {\n\tdrone := tello.NewDriver(\"8890\")\n\twindow := gocv.NewWindow(\"Tello\")\n\n\tffmpeg := exec.Command(\"ffmpeg\", \"-hwaccel\", \"auto\", \"-hwaccel_device\", \"opencl\", \"-i\", \"pipe:0\",\n\t\t\"-pix_fmt\", \"bgr24\", \"-s\", strconv.Itoa(frameX)+\"x\"+strconv.Itoa(frameY), \"-f\", \"rawvideo\", \"pipe:1\")\n\tffmpegIn, _ := ffmpeg.StdinPipe()\n\tffmpegOut, _ := ffmpeg.StdoutPipe()\n\n\twork := func() {\n\t\tif err := ffmpeg.Start(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t\treturn\n\t\t}\n\n\t\t_ = drone.On(tello.ConnectedEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"Connected\")\n\t\t\tif err := drone.StartVideo(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := drone.SetVideoEncoderRate(tello.VideoBitRateAuto); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := drone.SetExposure(0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\t\tif err := drone.StartVideo(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\t_ = drone.On(tello.VideoFrameEvent, func(data interface{}) {\n\t\t\tpkt := data.([]byte)\n\t\t\tif _, err := ffmpegIn.Write(pkt); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"tello\",\n\t\t[]gobot.Connection{},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\t// calling Start(false) lets the Start routine return immediately without an additional blocking goroutine\n\trobot.Start(false)\n\n\t// now handle video frames from ffmpeg stream in main thread, to be macOS/Windows friendly\n\tfor {\n\t\tbuf := make([]byte, frameSize)\n\t\tif _, err := io.ReadFull(ffmpegOut, buf); err != nil {\n\t\t\tfmt.Println(err)\n\t\t\tcontinue\n\t\t}\n\t\timg, _ := gocv.NewMatFromBytes(frameY, frameX, gocv.MatTypeCV8UC3, buf)\n\t\tif img.Empty() {\n\t\t\tcontinue\n\t\t}\n\n\t\twindow.IMShow(img)\n\t\tif window.WaitKey(1) >= 0 {\n\t\t\tbreak\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/tello_ps3.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nHow to setup\nYou must be using a PS3 or compatible controller, along with a DJI Tello drone to run this example.\n\nYou run the Go program on your computer and communicate wirelessly via WiFi with the Tello.\n\nHow to run\n\n\tgo run examples/tello_ps3.go\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/dji/tello\"\n\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\ntype pair struct {\n\tx float64\n\ty float64\n}\n\nvar leftX, leftY, rightX, rightY atomic.Value\n\nconst offset = 32767.0\n\nfunc main() {\n\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\tstick := joystick.NewDriver(joystickAdaptor, \"dualshock3\")\n\n\tdrone := tello.NewDriver(\"8888\")\n\n\twork := func() {\n\t\tleftX.Store(float64(0.0))\n\t\tleftY.Store(float64(0.0))\n\t\trightX.Store(float64(0.0))\n\t\trightY.Store(float64(0.0))\n\n\t\t_ = stick.On(joystick.TrianglePress, func(data interface{}) {\n\t\t\tif err := drone.TakeOff(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.XPress, func(data interface{}) {\n\t\t\tif err := drone.Land(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.UpPress, func(data interface{}) {\n\t\t\tfmt.Println(\"FrontFlip\")\n\t\t\tif err := drone.FrontFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.DownPress, func(data interface{}) {\n\t\t\tfmt.Println(\"BackFlip\")\n\t\t\tif err := drone.BackFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.RightPress, func(data interface{}) {\n\t\t\tfmt.Println(\"RightFlip\")\n\t\t\tif err := drone.RightFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftPress, func(data interface{}) {\n\t\t\tfmt.Println(\"LeftFlip\")\n\t\t\tif err := drone.LeftFlip(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.LeftY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\tleftY.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightX, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightX.Store(val)\n\t\t})\n\n\t\t_ = stick.On(joystick.RightY, func(data interface{}) {\n\t\t\tval := float64(data.(int))\n\t\t\trightY.Store(val)\n\t\t})\n\n\t\tgobot.Every(50*time.Millisecond, func() {\n\t\t\trightStick := getRightStick()\n\n\t\t\tswitch {\n\t\t\tcase rightStick.y < -10:\n\t\t\t\tif err := drone.Forward(tello.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.y > 10:\n\t\t\t\tif err := drone.Backward(tello.ValidatePitch(rightStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Forward(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase rightStick.x > 10:\n\t\t\t\tif err := drone.Right(tello.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase rightStick.x < -10:\n\t\t\t\tif err := drone.Left(tello.ValidatePitch(rightStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Right(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tgobot.Every(50*time.Millisecond, func() {\n\t\t\tleftStick := getLeftStick()\n\t\t\tswitch {\n\t\t\tcase leftStick.y < -10:\n\t\t\t\tif err := drone.Up(tello.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.y > 10:\n\t\t\t\tif err := drone.Down(tello.ValidatePitch(leftStick.y, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Up(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase leftStick.x > 20:\n\t\t\t\tif err := drone.Clockwise(tello.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tcase leftStick.x < -20:\n\t\t\t\tif err := drone.CounterClockwise(tello.ValidatePitch(leftStick.x, offset)); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif err := drone.Clockwise(0); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"tello\",\n\t\t[]gobot.Connection{joystickAdaptor},\n\t\t[]gobot.Device{stick, drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc getLeftStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = leftX.Load().(float64)\n\ts.y = leftY.Load().(float64)\n\treturn s\n}\n\nfunc getRightStick() pair {\n\ts := pair{x: 0, y: 0}\n\ts.x = rightX.Load().(float64)\n\ts.y = rightY.Load().(float64)\n\treturn s\n}\n"
  },
  {
    "path": "examples/tello_video.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nYou must have MPlayer (https://mplayerhq.hu) installed in order to run this code. it will connect to the Tello\nand then open a window using MPlayer showing the streaming video.\n\nHow to run\n\n\tgo run examples/tello_video.go\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os/exec\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/dji/tello\"\n)\n\nfunc main() {\n\tdrone := tello.NewDriver(\"8890\")\n\n\tmplayer := exec.Command(\"mplayer\", \"-fps\", \"60\", \"-\")\n\tmplayerIn, _ := mplayer.StdinPipe()\n\tif err := mplayer.Start(); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\twork := func() {\n\t\t_ = drone.On(tello.ConnectedEvent, func(data interface{}) {\n\t\t\tfmt.Println(\"Connected\")\n\t\t\tif err := drone.StartVideo(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := drone.SetVideoEncoderRate(tello.VideoBitRateAuto); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\t\tif err := drone.StartVideo(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\t_ = drone.On(tello.VideoFrameEvent, func(data interface{}) {\n\t\t\tpkt := data.([]byte)\n\t\t\tif _, err := mplayerIn.Write(pkt); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"tello\",\n\t\t[]gobot.Connection{},\n\t\t[]gobot.Device{drone},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard2_direct_pin_bin_counter.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard2\"\n)\n\n// Wiring\n// PWR  Tinkerboard-2: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// GPIO Tinkerboard-2: header pins 3, 5, 7, 11 used as inverted output\n// LED's: the output pins are wired to the cathode of a LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to +3.3V (use >150Ohm if connected to +5V)\n// Expected behavior: the 4 LED's on normal output counts up binary\nfunc main() {\n\tconst (\n\t\toutPinBit0Num = \"3\"\n\t\toutPinBit1Num = \"5\"\n\t\toutPinBit2Num = \"7\"\n\t\toutPinBit3Num = \"11\"\n\t)\n\n\tboard := tinkerboard2.NewAdaptor(adaptors.WithGpiosActiveLow(outPinBit0Num, outPinBit1Num, outPinBit2Num,\n\t\toutPinBit3Num))\n\toutPinB0 := gpio.NewDirectPinDriver(board, outPinBit0Num)\n\toutPinB1 := gpio.NewDirectPinDriver(board, outPinBit1Num)\n\toutPinB2 := gpio.NewDirectPinDriver(board, outPinBit2Num)\n\toutPinB3 := gpio.NewDirectPinDriver(board, outPinBit3Num)\n\n\twork := func() {\n\t\tvalue := byte(0)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tb0 := value & 0x01\n\t\t\tb1 := (value & 0x02) / 0x02\n\t\t\tb2 := (value & 0x04) / 0x04\n\t\t\tb3 := (value & 0x08) / 0x08\n\n\t\t\tif err := outPinB0.DigitalWrite(b0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinBit0Num, b0)\n\t\t\t}\n\n\t\t\tif err := outPinB1.DigitalWrite(b1); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinBit1Num, b1)\n\t\t\t}\n\n\t\t\tif err := outPinB2.DigitalWrite(b2); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinBit2Num, b2)\n\t\t\t}\n\n\t\t\tif err := outPinB3.DigitalWrite(b3); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinBit3Num, b3)\n\t\t\t}\n\n\t\t\tvalue++\n\t\t\tif value > 15 {\n\t\t\t\tvalue = 0\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{outPinB0, outPinB1, outPinB2, outPinB3},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard2_yl40.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard2\"\n)\n\nfunc main() {\n\t// Wiring\n\t// PWR  Tinkerboard 2: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n\t// I2C1 Tinkerboard 2: 27 (SDA), 28 (SCL)\n\t// YL-40 module: wire AOUT --> AIN2 for this example, set all jumpers for temp, LDR and variable resistor\n\t//\n\t// Note: temperature measurement is often buggy, because sensor is not properly grounded\n\t//       fix it by soldering a small bridge to the adjacent ground pin of brightness sensor\n\tboard := tinkerboard2.NewAdaptor()\n\tyl := i2c.NewYL40Driver(board, i2c.WithBus(7))\n\n\twork := func() {\n\t\t// the LED light is visible above ~1.7V\n\t\twriteVal, _ := yl.AOUT()\n\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif err := yl.Write(writeVal); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\" %.1f V written\", writeVal)\n\t\t\t\twriteVal = writeVal + 0.1\n\t\t\t\tif writeVal > 3.3 {\n\t\t\t\t\twriteVal = 0\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif brightness, err := yl.ReadBrightness(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Brightness: %.0f [0..1000]\", brightness)\n\t\t\t}\n\n\t\t\tif temperature, err := yl.ReadTemperature(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Temperature: %.1f °C\", temperature)\n\t\t\t}\n\n\t\t\tif ain2, err := yl.ReadAIN2(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Read back AOUT: %.1f [0..3.3]\", ain2)\n\t\t\t}\n\n\t\t\tif potiState, err := yl.ReadPotentiometer(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Resistor: %.0f %% [-100..+100]\", potiState)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"yl40Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{yl},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_adafruit1109_lcd_keys.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2 (+5V), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA), 5 (SCL)\n// PLATE: connected via pin header (pin 1..26)\nfunc main() {\n\tboard := tinkerboard.NewAdaptor()\n\tada := i2c.NewAdafruit1109Driver(board, i2c.WithBus(1))\n\n\twork := func() {\n\t\t// set a custom character\n\t\tsmiley := [8]byte{0, 0, 10, 0, 0, 17, 14, 0}\n\t\tif err := ada.CreateChar(0, smiley); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tif err := ada.Clear(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := ada.SetRGB(true, false, false); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := ada.Write(\"   Hello from   \\n  Tinker Board \"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\t// add the custom character at the end of the string\n\t\tif err := ada.Write(string(byte(0))); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\t// after 1 sec. activate rotation\n\t\tdirection := 1\n\t\tgobot.After(1*time.Second, func() {\n\t\t\tif err := ada.SetRGB(false, true, false); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(400*time.Millisecond, func() {\n\t\t\t\tif direction == 1 {\n\t\t\t\t\tif err := ada.ScrollLeft(); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif direction == 2 {\n\t\t\t\t\tif err := ada.ScrollRight(); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\t// after 7 sec. activate play with the buttons\n\t\tgobot.After(7*time.Second, func() {\n\t\t\tdirection = 0\n\t\t\ttime.Sleep(1 * time.Second)\n\t\t\tif err := ada.LeftToRight(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := ada.Clear(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := ada.SetRGB(false, false, true); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := ada.Write(\"Try the buttons!\"); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t\tif val, err := ada.SelectButton(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t} else if val != 0 {\n\t\t\t\t\tif err := ada.Clear(); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Write(\"-Select Button-\\nclear the screen\"); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Blink(false); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tdirection = 0\n\t\t\t\t}\n\t\t\t\tif val, err := ada.UpButton(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t} else if val != 0 {\n\t\t\t\t\tif err := ada.Clear(); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Write(\"  -Up Button-   \\nset RGB to white\"); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Blink(false); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.SetRGB(true, true, true); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tdirection = 0\n\t\t\t\t}\n\t\t\t\tif val, err := ada.DownButton(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t} else if val != 0 {\n\t\t\t\t\tif err := ada.Clear(); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Write(\" -Down Button-  \\nset blink on\"); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Blink(true); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tdirection = 0\n\t\t\t\t}\n\t\t\t\tif val, err := ada.LeftButton(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t} else if val != 0 {\n\t\t\t\t\tif err := ada.Clear(); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Write(\"   -Left Button-  \\nrotate left\"); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Blink(false); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tdirection = 1\n\t\t\t\t}\n\t\t\t\tif val, err := ada.RightButton(); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t} else if val != 0 {\n\t\t\t\t\tif err := ada.Clear(); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Write(\"   -Right Button-  \\nrotate right\"); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tif err := ada.Blink(false); err != nil {\n\t\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\t}\n\t\t\t\t\tdirection = 2\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"adaBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{ada},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_ads1115.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA-ws), 5 (SCL-gn)\n// ADS1115 plate: VDD (2.0..5.5V), GND, SDL, SDA, A0..A3 (input voltage 0..5V)\nfunc main() {\n\tconst voltage = 5.0 // we will be able to read values of at least 5V (for all channels)\n\n\ta := tinkerboard.NewAdaptor()\n\tads1115 := i2c.NewADS1115Driver(a, i2c.WithADS1x15BestGainForVoltage(voltage))\n\n\twork := func() {\n\t\tvar a0, a1, a2, a3 float64\n\t\tvar err error\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\ta0, err = ads1115.ReadWithDefaults(0)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"A0\", a0)\n\t\t\t}\n\t\t\ta1, err = ads1115.ReadWithDefaults(1)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"A1\", a1)\n\t\t\t}\n\t\t\ta2, err = ads1115.ReadWithDefaults(2)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"A2\", a2)\n\t\t\t}\n\t\t\ta3, err = ads1115.ReadWithDefaults(3)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"A3\", a3)\n\t\t\t}\n\t\t\tif v, err := ads1115.ReadDifferenceWithDefaults(0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"A0-A1 %f, (e: %f)\\n\", v, v-(a0-a1))\n\t\t\t}\n\t\t\tif v, err := ads1115.ReadDifferenceWithDefaults(1); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"A0-A3 %f, (e: %f)\\n\", v, v-(a0-a3))\n\t\t\t}\n\t\t\tif v, err := ads1115.ReadDifferenceWithDefaults(2); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"A1-A3 %f, (e: %f)\\n\", v, v-(a1-a3))\n\t\t\t}\n\t\t\tif v, err := ads1115.ReadDifferenceWithDefaults(3); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"A2-A3 %f, (e: %f)\\n\", v, v-(a2-a3))\n\t\t\t}\n\t\t\tfmt.Println(\"-------------\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ads1115bot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{ads1115},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_adxl345.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA-ws), 5 (SCL-gn)\n// ADXL345 plate: VCC, GND, SDL, SDA\nfunc main() {\n\ta := tinkerboard.NewAdaptor()\n\tadxl := i2c.NewADXL345Driver(a)\n\n\twork := func() {\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif x, y, z, err := adxl.XYZ(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"x: %.7f | y: %.7f | z: %.7f \\n\", x, y, z)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mpBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{adxl},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\nfunc main() {\n\tr := tinkerboard.NewAdaptor()\n\tled := gpio.NewLedDriver(r, \"7\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{r},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_bme280.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA-ws), 5 (SCL-gn)\n// BME280 plate: VIN (2.5..5V), GND, SDL, SDA, SDO to GND\nfunc main() {\n\ta := tinkerboard.NewAdaptor()\n\tbme280 := i2c.NewBME280Driver(a, i2c.WithAddress(0x76),\n\t\ti2c.WithBME280PressureOversampling(0x05),\n\t\ti2c.WithBME280TemperatureOversampling(0x02),\n\t\ti2c.WithBME280HumidityOversampling(0x01),\n\t\ti2c.WithBME280IIRFilter(0x05))\n\n\twork := func() {\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tt, e := bme280.Temperature()\n\t\t\tfmt.Println(\"Temperature [°C]\", t)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\tp, e := bme280.Pressure()\n\t\t\tfmt.Println(\"Pressure [Pa]\", p) // 100hPa = 1Pa\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\ta, e := bme280.Altitude()\n\t\t\tfmt.Println(\"Altitude [m]\", a)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\th, e := bme280.Humidity()\n\t\t\tfmt.Println(\"Humidity [%]\", h)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\t\t\tfmt.Println(\"-------------\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bme280bot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{bme280},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_bmp280.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA-ws), 5 (SCL-gn)\n// BMP280 plate: VIN (2.5..5V), GND, SDL, SDA, SDO to GND\nfunc main() {\n\ta := tinkerboard.NewAdaptor()\n\tbmp280 := i2c.NewBMP280Driver(a, i2c.WithAddress(0x76),\n\t\ti2c.WithBME280PressureOversampling(0x05),\n\t\ti2c.WithBME280TemperatureOversampling(0x02),\n\t\ti2c.WithBME280IIRFilter(0x05))\n\n\twork := func() {\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tt, e := bmp280.Temperature()\n\t\t\tfmt.Println(\"Temperature [°C]\", t)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\tp, e := bmp280.Pressure()\n\t\t\tfmt.Println(\"Pressure [Pa]\", p) // 100hPa = 1Pa\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\n\t\t\ta, e := bmp280.Altitude()\n\t\t\tfmt.Println(\"Altitude [m]\", a)\n\t\t\tif e != nil {\n\t\t\t\tfmt.Println(e)\n\t\t\t}\n\t\t\tfmt.Println(\"-------------\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bmp280bot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{bmp280},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_button.go",
    "content": "//go:build example\n// +build example\n\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// GPIO Tinkerboard: header pin 22 is input, pin 7 is normal output\n// Button: the input pin is wired with a button to GND, an external pull up resistor is needed (e.g. 1K)\n// LED: the output pin is wired to the cathode of a LED, the anode is wired with a resistor (70-130Ohm for 20mA) to VCC\n// Expected behavior: LED is initially on, if button is pressed and released, the state changes\nfunc main() {\n\tconst (\n\t\tbuttonPin = \"22\"\n\t\tledPin    = \"7\"\n\t)\n\n\ta := tinkerboard.NewAdaptor()\n\tbutton := gpio.NewButtonDriver(a, buttonPin, gpio.WithButtonPollInterval(100*time.Millisecond))\n\tled := gpio.NewLedDriver(a, ledPin)\n\tif err := led.On(); err != nil {\n\t\tfmt.Println(err)\n\t}\n\n\twork := func() {\n\t\tif err := button.On(gpio.Error, func(err interface{}) {\n\t\t\tfmt.Println(\"an error occurred:\", err)\n\t\t}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tif err := button.On(gpio.ButtonPush, func(interface{}) {\n\t\t\tfmt.Println(\"button pressed\")\n\t\t\tif err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tif err := button.On(gpio.ButtonRelease, func(interface{}) {\n\t\t\tfmt.Println(\"button released\")\n\t\t\tif err := led.Off(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"buttonBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{button, led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// GPIO Tinkerboard: header pin 21 is input, pin 24 used as normal output, pin 26 used as inverted output\n// Button: the input pin is wired with a button to GND, an external pull up resistor is needed (e.g. 1K)\n// LED's: the output pins are wired to the cathode of a LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, on button press the state changes\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"21\"\n\t\toutPinNum         = \"24\"\n\t\toutPinInvertedNum = \"26\"\n\t)\n\tboard := tinkerboard.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum))\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\tif level == 1 {\n\t\t\t\tlevel = 0\n\t\t\t} else {\n\t\t\t\tlevel = 1\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_ds18b20.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/onewire\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Preparation: see /gobot/system/ONEWIRE.md and /gobot/platforms/asus/tinkerboard/README.md\n//\n// Wiring:\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n// 1-wire Tinkerboard: 7 (DQ) - resistor to VCC, ~1.5kOhm ... 5kOhm\n// DS18B20: 1 (GND), 2 (DQ), 3 (VDD, +3 ... 5.5V) for local power mode\nfunc main() {\n\tadaptor := tinkerboard.NewAdaptor()\n\t// resolution change not supported by all devices\n\ttemp0 := onewire.NewDS18B20Driver(adaptor, 0x072261452f18, onewire.WithResolution(10))\n\ttemp1 := onewire.NewDS18B20Driver(adaptor, 0x1465421f64ff, onewire.WithFahrenheit(), onewire.WithConversionTime(500))\n\n\twork := func() {\n\t\ttime0, err := temp0.ConversionTime()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err CT0: %v\\n\", err)\n\t\t}\n\t\tres0, err := temp0.Resolution()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err R0: %v\\n\", err)\n\t\t}\n\t\tlog.Printf(\"Conversion time @%d bit for Temp 0: %d ms\\n\", res0, time0)\n\n\t\ttime1, err := temp1.ConversionTime()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err CT1: %v\\n\", err)\n\t\t}\n\t\tres1, err := temp1.Resolution()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Err R1: %v\\n\", err)\n\t\t}\n\t\tlog.Printf(\"Conversion time @%d bit for Temp 0: %d ms\\n\", res1, time1)\n\n\t\tgobot.Every(10*(time.Duration(time0))*time.Millisecond, func() {\n\t\t\tt0, err := temp0.Temperature()\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"Err Temp 0: %v\\n\", err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"Temp 0: %2.1f °C\\n\", t0)\n\t\t})\n\n\t\tgobot.Every(10*(time.Duration(time1))*time.Millisecond, func() {\n\t\t\tt1, err := temp1.Temperature()\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"Err Temp 1:  %v\\n\", err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"Temp 1: %2.3f °F\\n\", t1)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"onewireBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{temp0, temp1},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_generic.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Attention! Possibly this will not work, because the current kernel of Tinker-OS 4.4.194 (2021-10-06) needs the\n// workaround for bad timing to emulate a PCA9501 EEPROM random read (switch on the flag below in this case).\n// The armbian image with kernel 5.15.74-rockchip (2022-10-18) is known to work.\n//\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA), 5 (SCL)\n// PCA9501: 20 (VDD, +2.5..3.6V), 10 (VSS, GND), 19 (SDA), 18 (SCL)\n// HW address pins: 1 (A0), 2 (A1), 3 (A2), 12 (A3), 11 (A4), 9 (A5)\nfunc main() {\n\tconst (\n\t\tdefaultAddress      = 0x7F // with open address pins (internal pull-up)\n\t\tmyAddress           = 0x44 // needs to be adjusted for your configuration\n\t\tworkaroundBadTiming = false\n\t\teepromAddr          = uint8(0x02)\n\t\tdataLen             = 7\n\t\twrite               = true\n\t\tread                = true\n\t)\n\n\tboard := tinkerboard.NewAdaptor()\n\tdrv := i2c.NewGenericDriver(board, \"PCA9501-EEPROM\", defaultAddress, i2c.WithAddress(myAddress))\n\n\tvar valWr uint8 = 0x09\n\tvar err error\n\n\twData := make([]byte, dataLen)\n\trData := make([]byte, dataLen)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t// write \"dataLen\" values, starting by EEPROM address\n\t\t\tvalWr++\n\n\t\t\tif write {\n\t\t\t\tfor i := range wData {\n\t\t\t\t\twData[i] = byte(i) + valWr\n\t\t\t\t}\n\t\t\t\terr = drv.WriteBlockData(eepromAddr, wData)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"err write:\", err)\n\t\t\t\t} else if read != write {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d, wr: %v\\n\", eepromAddr, wData)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// write process needs some time, so wait at least 5ms before read a value\n\t\t\t// when decreasing to much, the check below will fail\n\t\t\ttime.Sleep(10 * time.Millisecond)\n\n\t\t\tif read {\n\t\t\t\tif workaroundBadTiming {\n\t\t\t\t\terr = readBlockDataBadTiming(drv, eepromAddr, rData)\n\t\t\t\t} else {\n\t\t\t\t\terr = drv.ReadBlockData(eepromAddr, rData)\n\t\t\t\t}\n\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"err read:\", err)\n\t\t\t\t} else if read != write {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d, rd: %v\\n\", eepromAddr, rData)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// compare read and write\n\t\t\tif read && write {\n\t\t\t\tif reflect.DeepEqual(wData, rData) {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d equal: %v\\n\", eepromAddr, rData)\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Printf(\"EEPROM addr: %d wr: %v differ rd: %v\\n\", eepromAddr, wData, rData)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"genericDriverI2c\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{drv},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// workaround for some boards (e.g. tinkerboard), because Read*Data not working together with PCA9501,\n// caused by bad timing\nfunc readBlockDataBadTiming(drv *i2c.GenericDriver, reg uint8, data []byte) error {\n\t// set a value to the dummy address\n\tif err := drv.WriteByteData(reg-1, 0x00); err != nil {\n\t\treturn err\n\t}\n\n\t// write process needs some time, so wait at least 5ms before read a value\n\t// when decreasing to much, the check below will fail\n\ttime.Sleep(20 * time.Millisecond)\n\n\treturn drv.Read(data)\n}\n"
  },
  {
    "path": "examples/tinkerboard_grove_lcd.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\nfunc main() {\n\tboard := tinkerboard.NewAdaptor()\n\tscreen := i2c.NewGroveLcdDriver(board)\n\n\twork := func() {\n\t\tif err := screen.Write(\"Hello from\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tif err := screen.SetRGB(255, 0, 0); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := screen.Clear(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.Home(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.SetRGB(0, 255, 0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// set a custom character in the first position\n\t\t\tif err := screen.SetCustomChar(0, i2c.CustomLCDChars[\"smiley\"]); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// add the custom character at the end of the string\n\t\t\tif err := screen.Write(\"\\nTinker Board \" + string(byte(0))); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t\tif err := screen.Scroll(false); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tif err := screen.Home(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1 * time.Second)\n\t\tif err := screen.SetRGB(0, 0, 255); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"screenBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{screen},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_hcsr04.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 2(+5V), 6, 9, 14, 20 (GND)\n// GPIO Tinkerboard: header pin 7 is the trigger output, pin 22 used as echo input\n// HC-SR04: the power is wired to +5V and GND of tinkerboard, the same for trigger output and the echo input pin\nfunc main() {\n\tconst (\n\t\ttriggerOutput = \"7\"\n\t\techoInput     = \"22\"\n\t)\n\n\t// this is mandatory for systems with defunct edge detection, although the \"cdev\" is used with an newer Kernel\n\t// keep in mind, that this cause more inaccurate measurements\n\tconst pollEdgeDetection = true\n\topts := []interface{}{}\n\tif pollEdgeDetection {\n\t\topts = append(opts, gpio.WithHCSR04UseEdgePolling())\n\t}\n\n\ta := tinkerboard.NewAdaptor()\n\thcsr04 := gpio.NewHCSR04Driver(a, triggerOutput, echoInput, opts...)\n\n\twork := func() {\n\t\tif pollEdgeDetection {\n\t\t\tfmt.Println(\"Please note that measurements are CPU consuming and will be more inaccurate with this setting.\")\n\t\t\tfmt.Println(\"After startup the system is under load and the measurement is very inaccurate, so wait a bit...\")\n\t\t\ttime.Sleep(2000 * time.Millisecond)\n\t\t}\n\n\t\tif err := hcsr04.StartDistanceMonitor(); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\n\t\t// first single shot\n\t\tif v, err := hcsr04.MeasureDistance(); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t} else {\n\t\t\tfmt.Printf(\"first single shot done: %5.3f m\\n\", v)\n\t\t}\n\n\t\tticker := gobot.Every(1*time.Second, func() {\n\t\t\tfmt.Printf(\"continuous measurement: %5.3f m\\n\", hcsr04.Distance())\n\t\t})\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := hcsr04.StopDistanceMonitor(); err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t\tticker.Stop()\n\t\t})\n\n\t\tgobot.After(7*time.Second, func() {\n\t\t\t// second single shot\n\t\t\tif v, err := hcsr04.MeasureDistance(); err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"second single shot done: %5.3f m\\n\", v)\n\t\t\t}\n\t\t\t// cleanup\n\t\t\tif err := hcsr04.Halt(); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tif err := a.Finalize(); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tos.Exit(0)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"distanceBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{hcsr04},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_hmc5883l.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA), 5 (SCL)\n// HMC5883L plate: VCC, GND, SDL, SDA\nfunc main() {\n\ta := tinkerboard.NewAdaptor()\n\thmc := i2c.NewHMC5883LDriver(a)\n\n\twork := func() {\n\t\tvar x, y, z, h float64\n\t\tvar err error\n\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif x, y, z, err = hmc.Read(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Xn: %f, Yn: %f, Zn: %f\", x, y, z)\n\t\t\t}\n\t\t\tif h, err = hmc.Heading(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Heading: %.1f\", h)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"hcBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{hmc},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_mfcrc522gpio.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// GPIO-SPI Tinkerboard (same as SPI2): 23 (CLK), 19 (TXD), 21 (RXD), 24 (CSN0)\n// MFRC522 plate: VCC, GND, SCK (CLK), SDO (->TXD), SDI (->RXD), NCS/SDA (CSN0/CSN1?)\nconst (\n\tsclk    = \"23\"\n\tncs     = \"24\"\n\tsdo     = \"19\"\n\tsdi     = \"21\"\n\tspeedHz = 5000 // more than 15kHz is not possible with GPIO's, so we choose 5kHz\n)\n\nfunc main() {\n\ta := tinkerboard.NewAdaptor(adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi))\n\td := spi.NewMFRC522Driver(a, spi.WithSpeed(speedHz))\n\n\twasCardDetected := false\n\tconst textToCard = \"Hello RFID user!\\nHey, we use GPIO's for SPI.\"\n\n\twork := func() {\n\t\tif err := d.PrintReaderVersion(); err != nil {\n\t\t\tfmt.Println(\"get version err:\", err)\n\t\t}\n\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tif !wasCardDetected {\n\t\t\t\tfmt.Println(\"\\n+++ poll for card +++\")\n\t\t\t\tif err := d.IsCardPresent(); err != nil {\n\t\t\t\t\tfmt.Println(\"no card found\")\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Println(\"\\n+++ write card +++\")\n\t\t\t\t\terr := d.WriteText(textToCard)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tfmt.Println(\"write err:\", err)\n\t\t\t\t\t}\n\t\t\t\t\twasCardDetected = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"\\n+++ read card +++\")\n\t\t\t\ttext, err := d.ReadText()\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"read err:\", err)\n\t\t\t\t\twasCardDetected = false\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Printf(\"-- start text --\\n%s\\n-- end  text --\\n\", text)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"gpioSpiBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{d},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_mfcrc522spi.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// SPI0 Tinkerboard (not working with armbian): 11 (CLK), 13 (TXD), 15 (RXD), 29 (CSN0), 31 (CSN1, n.c.)\n// SPI2 Tinkerboard: 23 (CLK), 19 (TXD), 21 (RXD), 24 (CSN0), 26 (CSN1, n.c.)\n// MFRC522 plate: VCC, GND, SCK (CLK), SDO (->TXD), SDI (->RXD), NCS/SDA (CSN0/CSN1?)\nfunc main() {\n\ta := tinkerboard.NewAdaptor()\n\td := spi.NewMFRC522Driver(a, spi.WithBusNumber(2))\n\n\twasCardDetected := false\n\tconst textToCard = \"Hello RFID user!\\nThis text was written to card.\"\n\n\twork := func() {\n\t\tif err := d.PrintReaderVersion(); err != nil {\n\t\t\tfmt.Println(\"get version err:\", err)\n\t\t}\n\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tif !wasCardDetected {\n\t\t\t\tfmt.Println(\"\\n+++ poll for card +++\")\n\t\t\t\tif err := d.IsCardPresent(); err != nil {\n\t\t\t\t\tfmt.Println(\"no card found\")\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Println(\"\\n+++ write card +++\")\n\t\t\t\t\terr := d.WriteText(textToCard)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tfmt.Println(\"write err:\", err)\n\t\t\t\t\t}\n\t\t\t\t\twasCardDetected = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"\\n+++ read card +++\")\n\t\t\t\ttext, err := d.ReadText()\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"read err:\", err)\n\t\t\t\t\twasCardDetected = false\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Printf(\"-- start text --\\n%s\\n-- end  text --\\n\", text)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"spiBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{d},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_motor.go",
    "content": "//go:build example\n// +build example\n\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// PWM Tinkerboard: header pin 33 (PWM2) or pin 32 (PWM3)\n// Please decouple the PWM pin with an amplifier, e.g. a simple MOSFET (IRLZ34N, IRF530 etc.), a half H-bridge or\n// just use a LED for the first tests.\nfunc main() {\n\tadaptor := tinkerboard.NewAdaptor()\n\tmotor := gpio.NewMotorDriver(adaptor, \"32\", gpio.WithMotorAnalog()) // gpio.WithMotorAnalog() is optional here\n\n\twork := func() {\n\t\tfmt.Println(\"first try full speed for 5 seconds...\")\n\t\tif err := motor.On(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(5 * time.Second)\n\n\t\tfmt.Println(\"second switch off for 5 seconds...\")\n\t\tif err := motor.Off(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(5 * time.Second)\n\n\t\tfmt.Println(\"finally fade in and out forever...\")\n\t\tspeed := byte(0)\n\t\tfadeAmount := byte(15)\n\n\t\tgobot.Every(100*time.Millisecond, func() {\n\t\t\tif err := motor.SetSpeed(speed); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tspeed = speed + fadeAmount\n\t\t\tif speed == 0 || speed == 255 {\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"motorBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{motor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_mpl115a2.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA-ws), 5 (SCL-gn)\n// MPL115A2 plate: VDD (2.375..5.5V), GND, SDL, SDA\nfunc main() {\n\tboard := tinkerboard.NewAdaptor()\n\tmpl115a2 := i2c.NewMPL115A2Driver(board)\n\n\twork := func() {\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tif press, err := mpl115a2.Pressure(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Pressure [kPa]\", press)\n\t\t\t}\n\n\t\t\tif temp, err := mpl115a2.Temperature(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Temperature [°C]\", temp)\n\t\t\t}\n\n\t\t\tfmt.Println(\"-------------\")\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mpl115Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{mpl115a2},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_mpu6050.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA-ws), 5 (SCL-gn)\n// MPU6050 plate: VCC, GND, SDL, SDA\nfunc main() {\n\ta := tinkerboard.NewAdaptor()\n\tmpu6050 := i2c.NewMPU6050Driver(a)\n\n\twork := func() {\n\t\tvar err error\n\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif err = mpu6050.GetData(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"Acc: %v Gyr: %v Temp: %v\\n\", mpu6050.Accelerometer, mpu6050.Gyroscope, mpu6050.Temperature)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"mpBot\",\n\t\t[]gobot.Connection{a},\n\t\t[]gobot.Device{mpu6050},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_pca9533.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n// I2C1 Tinkerboard: 3 (SDA), 5 (SCL)\n// PCA9533: 8 (VDD, +2.3..5.5V), 4 (VSS, GND), 7 (SDA), 6 (SCL)\n// LED pins: 1 (LED0), 2 (LED1), 3 (LED2), 5 (LED3)\n// LED's directly driven with pull-up resistors to VDD, e.g. 180 Ohm\n// I2C addresses: 0x62 (PCA9533/01), 0x63 (PCA9533/02)\nfunc main() {\n\tboard := tinkerboard.NewAdaptor()\n\tpca := i2c.NewPCA953xDriver(board, i2c.WithAddress(0x63))\n\n\tled := uint8(0)  // index of LED\n\twVal := uint8(1) // start with LED is \"off\"\n\trVal := uint8(0)\n\n\twork := func() {\n\t\t// LED 2 with 2 Hz 1:1, LED 3 with 5 Hz 1:10\n\t\tinitialize(pca, 2, 5)\n\n\t\tgobot.Every(2000*time.Millisecond, func() {\n\t\t\tfmt.Printf(\"set LED%d output to %d\", led, wVal)\n\t\t\terr := pca.WriteGPIO(led, wVal)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"errW:\", err)\n\t\t\t}\n\n\t\t\trVal, err = pca.ReadGPIO(led)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"errR:\", err)\n\t\t\t}\n\t\t\tif rVal == 0 {\n\t\t\t\tfmt.Printf(\" - LED%d is ON\\n\", led)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\" - LED%d is OFF\\n\", led)\n\t\t\t}\n\n\t\t\tled = led + 1\n\t\t\tif led > 1 {\n\t\t\t\tled = 0\n\t\t\t\tif wVal == 1 {\n\t\t\t\t\twVal = 0\n\t\t\t\t} else {\n\t\t\t\t\twVal = 1\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"ledI2c\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{pca},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc initialize(pca *i2c.PCA953xDriver, led2FrequHz float32, led3FrequHz float32) {\n\t// prepare PWM0\n\terr := pca.WriteFrequency(0, led2FrequHz)\n\tif err != nil {\n\t\tfmt.Println(\"errWF0:\", err)\n\t}\n\tfrq, err := pca.ReadFrequency(0)\n\tif err != nil {\n\t\tfmt.Println(\"errRF0:\", err)\n\t}\n\tfmt.Println(\"get Frq0:\", frq)\n\n\terr = pca.WriteDutyCyclePercent(0, 50)\n\tif err != nil {\n\t\tfmt.Println(\"errWD0:\", err)\n\t}\n\tdc, err := pca.ReadDutyCyclePercent(0)\n\tif err != nil {\n\t\tfmt.Println(\"errRD0:\", err)\n\t}\n\tfmt.Println(\"get dc0:\", dc)\n\n\t// prepare PWM1\n\terr = pca.WriteFrequency(1, led3FrequHz)\n\tif err != nil {\n\t\tfmt.Println(\"errWF1:\", err)\n\t}\n\tfrq, err = pca.ReadFrequency(1)\n\tif err != nil {\n\t\tfmt.Println(\"errRF1:\", err)\n\t}\n\tfmt.Println(\"get Frq1:\", frq)\n\n\terr = pca.WriteDutyCyclePercent(1, 10)\n\tif err != nil {\n\t\tfmt.Println(\"errWD1:\", err)\n\t}\n\tdc, err = pca.ReadDutyCyclePercent(1)\n\tif err != nil {\n\t\tfmt.Println(\"errRD1:\", err)\n\t}\n\tfmt.Println(\"get dc1:\", dc)\n\n\t// LED 2\n\tfmt.Println(\"set LED: 2 to: pwm0\")\n\terr = pca.SetLED(2, i2c.PCA953xModePwm0)\n\tif err != nil {\n\t\tfmt.Println(\"errW:\", err)\n\t}\n\tfmt.Println(\"set LED: 3 to: pwm1\")\n\terr = pca.SetLED(3, i2c.PCA953xModePwm1)\n\tif err != nil {\n\t\tfmt.Println(\"errW:\", err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_pcf8583_clock.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1(+3.3V, VCC), 6,9,14,20(GND)\n// I2C1 Tinkerboard: 3(SDA), 5(SCL)\n// PCF8583 DIP package: 1(OSCI,50Hz), 2(OSCO,nc), 3(A0-GND), 4(VSS,GND), 5(SDA), 6(SCL), 7(/INT,nc), 8(VDD,+3.3V)\nfunc main() {\n\tboard := tinkerboard.NewAdaptor()\n\tpcf := i2c.NewPCF8583Driver(board, i2c.WithBus(1), i2c.WithPCF8583Mode(i2c.PCF8583CtrlModeClock50))\n\n\twork := func() {\n\t\tcurrentTime := time.Now()\n\t\tlog.Println(currentTime)\n\n\t\tif err := pcf.WriteTime(currentTime); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.Every(10*time.Second, func() {\n\t\t\tif val, err := pcf.ReadTime(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"read Time: %v\", val)\n\t\t\t}\n\n\t\t\tramVal, err := pcf.ReadRAM(uint8(0))\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"read RAM: %v\", ramVal)\n\t\t\t\tramVal++\n\t\t\t}\n\t\t\tif err := pcf.WriteRAM(uint8(0), ramVal); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pcfBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{pcf},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_pcf8583_counter.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring\n// PWR  Tinkerboard: 1(+3.3V,VCC), 6,9,14,20(GND)\n// I2C1 Tinkerboard: 3(SDA), 5(SCL)\n// PCF8583 DIP package: 1(OSCI,event), 2(OSCO,nc), 3(A0-GND), 4(VSS,GND), 5(SDA), 6(SCL), 7(/INT,nc), 8(VDD,+3.3V)\n// Note: event can be created by e.g. an debounced button\nfunc main() {\n\tboard := tinkerboard.NewAdaptor()\n\tpcf := i2c.NewPCF8583Driver(board, i2c.WithBus(1), i2c.WithPCF8583Mode(i2c.PCF8583CtrlModeCounter))\n\n\twork := func() {\n\t\tlastCnt := int32(1234)\n\n\t\tif err := pcf.WriteCounter(lastCnt); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif val, err := pcf.ReadCounter(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"read Counter: %d, diff [Hz]: %d\", val, val-lastCnt)\n\t\t\t\tlastCnt = val\n\t\t\t}\n\n\t\t\tramVal, err := pcf.ReadRAM(uint8(0))\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"read RAM: %d\", ramVal)\n\t\t\t\tramVal++\n\t\t\t}\n\t\t\tif err := pcf.WriteRAM(uint8(0), ramVal); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pcfBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{pcf},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_pcf8591.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\nfunc main() {\n\t// This driver was tested with Tinkerboard and this board with temperature & brightness sensor:\n\t// https://www.makershop.de/download/YL_40_PCF8591.pdf\n\t//\n\t// Wiring\n\t// PWR  Tinkerboard: 1 (+3.3V, VCC), 6, 9, 14, 20 (GND)\n\t// I2C1 Tinkerboard: 3 (SDA), 5 (SCL)\n\t// PCF8591 plate: wire AOUT --> AIN2 for this example\n\tboard := tinkerboard.NewAdaptor()\n\tpcf := i2c.NewPCF8591Driver(board, i2c.WithBus(1))\n\taout := aio.NewAnalogActuatorDriver(pcf, \"AOUT\")\n\taout.SetScaler(aio.AnalogActuatorLinearScaler(0, 3.3, 0, 255))\n\n\tvar val int\n\tvar err error\n\n\t// brightness sensor, high brightness - low raw value\n\tdescLight := \"s.0\"\n\t// temperature sensor, high temperature - low raw value\n\t// sometimes buggy, because not properly grounded\n\tdescTemp := \"s.1\"\n\t// wired to AOUT\n\tdescAIN2 := \"s.2\"\n\t// adjustable resistor, turn clockwise will lower the raw value\n\tdescResi := \"s.3\"\n\t// the LED light is visible above ~1.7V, this means ~127 (half of 3.3V)\n\twriteVal := 1.7\n\n\twork := func() {\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif err := aout.Write(writeVal); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Write AOUT: %.1f V [0..3.3]\", writeVal)\n\t\t\t\twriteVal = writeVal + 0.1\n\t\t\t\tif writeVal > 3.3 {\n\t\t\t\t\twriteVal = 0\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif val, err = pcf.AnalogRead(descLight); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Brightness (%s): %d [255..0]\", descLight, val)\n\t\t\t}\n\n\t\t\tif val, err = pcf.AnalogRead(descTemp); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Temperature (%s): %d [255..0]\", descTemp, val)\n\t\t\t}\n\n\t\t\tif val, err = pcf.AnalogRead(descAIN2); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Read AOUT (%s): %d [0..255]\", descAIN2, val)\n\t\t\t}\n\n\t\t\tif val, err = pcf.AnalogRead(descResi); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Resistor (%s): %d [255..0]\", descResi, val)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pcfBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{pcf},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/tinkerboard_thermalzone.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n)\n\n// Wiring: no wiring needed\nfunc main() {\n\tadaptor := tinkerboard.NewAdaptor()\n\ttherm0 := aio.NewThermalZoneDriver(adaptor, \"thermal_zone0\")\n\ttherm1 := aio.NewThermalZoneDriver(adaptor, \"thermal_zone1\", aio.WithFahrenheit())\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tt0, err := therm0.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tt1, err := therm1.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"Zone 0: %2.3f °C, Zone 1: %2.3f °F\\n\", t0, t1)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"thermalBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{therm0, therm1},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/up2_lcd.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/upboard/up2\"\n)\n\nfunc main() {\n\tboard := up2.NewAdaptor()\n\tscreen := i2c.NewGroveLcdDriver(board)\n\n\twork := func() {\n\t\tif err := screen.Write(\"hello\"); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tif err := screen.SetRGB(255, 0, 0); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.After(5*time.Second, func() {\n\t\t\tif err := screen.Clear(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.Home(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif err := screen.SetRGB(0, 255, 0); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// set a custom character in the first position\n\t\t\tif err := screen.SetCustomChar(0, i2c.CustomLCDChars[\"smiley\"]); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t// add the custom character at the end of the string\n\t\t\tif err := screen.Write(\"goodbye\\nhave a nice day \" + string(byte(0))); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\t\tif err := screen.Scroll(false); err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tif err := screen.Home(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\ttime.Sleep(1 * time.Second)\n\t\tif err := screen.SetRGB(0, 0, 255); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\n\trobot := gobot.NewRobot(\"screenBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{screen},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/up2_leds.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/upboard/up2\"\n)\n\nfunc main() {\n\tb := up2.NewAdaptor()\n\tred := gpio.NewLedDriver(b, up2.LEDRed)\n\tblue := gpio.NewLedDriver(b, up2.LEDBlue)\n\tgreen := gpio.NewLedDriver(b, up2.LEDGreen)\n\tyellow := gpio.NewLedDriver(b, up2.LEDYellow)\n\n\twork := func() {\n\t\tif err := red.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := blue.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := green.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\tif err := yellow.Off(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := red.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(2*time.Second, func() {\n\t\t\tif err := green.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(4*time.Second, func() {\n\t\t\tif err := yellow.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t\tgobot.Every(8*time.Second, func() {\n\t\t\tif err := blue.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t[]gobot.Connection{b},\n\t\t[]gobot.Device{red, blue, green, yellow},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/wifi_firmata_analog_input.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewTCPAdaptor(os.Args[1])\n\tsensor := aio.NewAnalogSensorDriver(firmataAdaptor, \"A0\", aio.WithSensorCyclicRead(500*time.Millisecond))\n\n\twork := func() {\n\t\t_ = sensor.On(aio.Data, func(data interface{}) {\n\t\t\tbrightness := uint8(\n\t\t\t\tgobot.ToScale(gobot.FromScale(float64(data.(int)), 0, 1024), 0, 255),\n\t\t\t)\n\t\t\tfmt.Println(\"sensor\", data)\n\t\t\tfmt.Println(\"brightness\", brightness)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"sensorBot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{sensor},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/wifi_firmata_blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\n How to setup\n You must be using a WiFi-connected microcontroller,\n that has been flashed with the WifiFirmata sketch.\n You then run the go program on your computer, and communicate\n wirelessly with the microcontroller.\n\n How to run\n Pass the IP address/port as first param:\n\n\tgo run examples/wifi_firmata_blink.go 192.168.0.39:3030\n*/\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n\tfirmataAdaptor := firmata.NewTCPAdaptor(os.Args[1])\n\tled := gpio.NewLedDriver(firmataAdaptor, \"2\")\n\n\twork := func() {\n\t\tgobot.Every(1*time.Second, func() {\n\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"bot\",\n\t\t[]gobot.Connection{firmataAdaptor},\n\t\t[]gobot.Device{led},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/zero_analog.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/platforms/radxa/zero\"\n)\n\n// Wiring:\n// PWR            : 1, 17 (+3.3V, VCC), 2, 4 (+5V), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// ADC (max. 1.8V): header pin 15 is input for channel 1, pin 26 is input for channel 2\nfunc main() {\n\tconst (\n\t\tinPin0         = \"15_mean\"\n\t\tinPin1         = \"26\"\n\t\tinVoltageScale = 0.439453125 // see README.md of the platform\n\t)\n\n\tscaler := aio.AnalogSensorLinearScaler(0, 4095, 0, 1.8)\n\n\tadaptor := zero.NewAdaptor()\n\tana0 := aio.NewAnalogSensorDriver(adaptor, inPin0, aio.WithSensorScaler(scaler))\n\tana1 := aio.NewAnalogSensorDriver(adaptor, inPin1)\n\n\twork := func() {\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tv0, err := ana0.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tv1, err := ana1.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\n\t\t\tfmt.Printf(\"%s: %1.3f V, %s: %2.0f (%4.0f mV)\\n\", inPin0, v0, inPin1, v1, v1*inVoltageScale)\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"adcBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{ana0, ana1},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/zero_direct_pin.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/radxa/zero\"\n)\n\n// Wiring\n// PWR   : 1, 17 (+3.3V, VCC), 2, 4 (+5V), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// GPIO  : header pin 24 is input, pin 32 used as normal output, pin 36 used as inverted output\n// Button: the input pin is wired with a button to GND, the internal pull up resistor is used\n// LED's: the output pins are wired to the cathode of the LED, the anode is wired with a resistor (70-130Ohm for 20mA)\n// to VCC\n// Expected behavior: always one LED is on, the other in opposite state, if button is pressed the state changes\nfunc main() {\n\tconst (\n\t\tinPinNum          = \"24\"\n\t\toutPinNum         = \"32\"\n\t\toutPinInvertedNum = \"36\"\n\t)\n\t// note: WithGpiosOpenDrain() is optional, if using WithGpiosOpenSource() the LED's will not light up\n\tboard := zero.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum),\n\t\tadaptors.WithGpiosOpenDrain(outPinNum, outPinInvertedNum), adaptors.WithGpiosPullUp(inPinNum))\n\n\tinPin := gpio.NewDirectPinDriver(board, inPinNum)\n\toutPin := gpio.NewDirectPinDriver(board, outPinNum)\n\toutPinInverted := gpio.NewDirectPinDriver(board, outPinInvertedNum)\n\n\twork := func() {\n\t\tlevel := byte(1)\n\n\t\tgobot.Every(500*time.Millisecond, func() {\n\t\t\tread, err := inPin.DigitalRead()\n\t\t\tfmt.Printf(\"pin %s state is %d\\n\", inPinNum, read)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t\tif level == 1 {\n\t\t\t\t\tlevel = 0\n\t\t\t\t} else {\n\t\t\t\t\tlevel = 1\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlevel = byte(read)\n\t\t\t}\n\n\t\t\terr = outPin.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now %d\\n\", outPinNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\n\t\t\terr = outPinInverted.DigitalWrite(level)\n\t\t\tfmt.Printf(\"pin %s is now not %d\\n\", outPinInvertedNum, level)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"pinBot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{inPin, outPin, outPinInverted},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/zero_servo.go",
    "content": "//go:build example\n// +build example\n\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/radxa/zero\"\n)\n\n// Wiring\n// PWR: 1, 17 (+3.3V, VCC), 2, 4 (+5V), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n// PWM: header pin 18 (PWM_C), 40 (PWMAO_A)\n// Servo SG90: red (+5V), brown (GND), orange (PWM)\nfunc main() {\n\tconst (\n\t\tpwmPin = \"18\"\n\t\twait   = 3 * time.Second\n\n\t\tfiftyHzNanos = 20 * 1000 * 1000 // 50Hz = 0.02 sec = 20 ms\n\t)\n\t// usually a frequency of 50Hz is used for servos, most servos have 0.5 ms..2.5 ms for 0-180°,\n\t// however the mapping can be changed with options:\n\tadaptor := zero.NewAdaptor(\n\t\tadaptors.WithPWMDefaultPeriodForPin(pwmPin, fiftyHzNanos),\n\t\tadaptors.WithPWMServoDutyCycleRangeForPin(pwmPin, 500*time.Microsecond, 2500*time.Microsecond),\n\t\tadaptors.WithPWMServoAngleRangeForPin(pwmPin, 0, 180),\n\t)\n\tservo := gpio.NewServoDriver(adaptor, pwmPin)\n\n\twork := func() {\n\t\tfmt.Printf(\"first move to minimal position for %s...\\n\", wait)\n\t\tif err := servo.ToMin(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"second move to center position for %s...\\n\", wait)\n\t\tif err := servo.ToCenter(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Printf(\"third move to maximal position for %s...\\n\", wait)\n\t\tif err := servo.ToMax(); err != nil {\n\t\t\tlog.Println(err)\n\t\t}\n\n\t\ttime.Sleep(wait)\n\n\t\tfmt.Println(\"finally move 0-180° (or what your servo do for the new mapping) and back forever...\")\n\t\tangle := 0\n\t\tfadeAmount := 45\n\n\t\tgobot.Every(time.Second, func() {\n\t\t\tif err := servo.Move(byte(angle)); err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t}\n\t\t\tangle = angle + fadeAmount\n\t\t\tif angle < 0 || angle > 180 {\n\t\t\t\tif angle < 0 {\n\t\t\t\t\tangle = 0\n\t\t\t\t}\n\t\t\t\tif angle > 180 {\n\t\t\t\t\tangle = 180\n\t\t\t\t}\n\t\t\t\t// change direction and recalculate\n\t\t\t\tfadeAmount = -fadeAmount\n\t\t\t\tangle = angle + fadeAmount\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"motorBot\",\n\t\t[]gobot.Connection{adaptor},\n\t\t[]gobot.Device{servo},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "examples/zero_yl40.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/radxa/zero\"\n)\n\nfunc main() {\n\t// Wiring\n\t// PWR : 1, 17 (+3.3V, VCC), 6, 9, 14, 20, 25, 30, 34, 39 (GND)\n\t// I2C3: 3 (SDA), 5 (SCL), I2C1: 24/16 (SDA), 23/13 (SCL), I2C4: 7 (SDA), 11 (SCL)\n\t// YL-40 module: wire AOUT --> AIN2 for this example\n\t//\n\t// Note: temperature measurement is often buggy, because sensor is not properly grounded\n\t//       fix it by soldering a small bridge to the adjacent ground pin of brightness sensor\n\tboard := zero.NewAdaptor()\n\tyl := i2c.NewYL40Driver(board, i2c.WithBus(3))\n\n\twork := func() {\n\t\t// the LED light is visible above ~1.7V\n\t\twriteVal, _ := yl.AOUT()\n\n\t\tgobot.Every(1000*time.Millisecond, func() {\n\t\t\tif err := yl.Write(writeVal); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\" %.1f V written\", writeVal)\n\t\t\t\twriteVal = writeVal + 0.1\n\t\t\t\tif writeVal > 3.3 {\n\t\t\t\t\twriteVal = 0\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif brightness, err := yl.ReadBrightness(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Brightness: %.0f [0..1000]\", brightness)\n\t\t\t}\n\n\t\t\tif temperature, err := yl.ReadTemperature(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Temperature: %.1f °C\", temperature)\n\t\t\t}\n\n\t\t\tif ain2, err := yl.ReadAIN2(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Read back AOUT: %.1f [0..3.3]\", ain2)\n\t\t\t}\n\n\t\t\tif potiState, err := yl.ReadPotentiometer(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t} else {\n\t\t\t\tlog.Printf(\"Resistor: %.0f %% [-100..+100]\", potiState)\n\t\t\t}\n\t\t})\n\t}\n\n\trobot := gobot.NewRobot(\"yl40Bot\",\n\t\t[]gobot.Connection{board},\n\t\t[]gobot.Device{yl},\n\t\twork,\n\t)\n\n\tif err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module gobot.io/x/gobot/v2\n\ngo 1.24.0\n\ntoolchain go1.24.6\n\nrequire (\n\tgithub.com/0xcafed00d/joystick v1.0.1\n\tgithub.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f\n\tgithub.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0\n\tgithub.com/eclipse/paho.mqtt.golang v1.5.1\n\tgithub.com/gofrs/uuid v4.4.0+incompatible\n\tgithub.com/hashicorp/go-multierror v1.1.1\n\tgithub.com/hybridgroup/go-ardrone v0.0.0-20140402002621-b9750d8d7b78\n\tgithub.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e\n\tgithub.com/nats-io/nats.go v1.47.0\n\tgithub.com/nsf/termbox-go v1.1.1\n\tgithub.com/sigurn/crc8 v0.0.0-20220107193325-2243fe600f9f\n\tgithub.com/stretchr/testify v1.11.1\n\tgithub.com/warthog618/go-gpiocdev v0.9.1\n\tgo.bug.st/serial v1.6.4\n\tgocv.io/x/gocv v0.42.0\n\tgolang.org/x/net v0.46.0\n\tgolang.org/x/sys v0.37.0\n\tperiph.io/x/conn/v3 v3.7.2\n\tperiph.io/x/host/v3 v3.8.5\n\ttinygo.org/x/bluetooth v0.13.0\n)\n\nrequire (\n\tgithub.com/creack/goselect v0.1.3 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/go-ole/go-ole v1.3.0 // indirect\n\tgithub.com/godbus/dbus/v5 v5.1.0 // indirect\n\tgithub.com/gorilla/websocket v1.5.3 // indirect\n\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n\tgithub.com/klauspost/compress v1.18.0 // indirect\n\tgithub.com/mattn/go-runewidth v0.0.9 // indirect\n\tgithub.com/nats-io/nkeys v0.4.11 // indirect\n\tgithub.com/nats-io/nuid v1.0.1 // indirect\n\tgithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/saltosystems/winrt-go v0.0.0-20241223121953-98e32661f6ff // indirect\n\tgithub.com/sirupsen/logrus v1.9.3 // indirect\n\tgithub.com/soypat/cyw43439 v0.0.0-20250505012923-830110c8f4af // indirect\n\tgithub.com/soypat/seqs v0.0.0-20250630134107-01c3f05666ba // indirect\n\tgithub.com/tinygo-org/cbgo v0.0.4 // indirect\n\tgithub.com/tinygo-org/pio v0.2.0 // indirect\n\tgolang.org/x/crypto v0.43.0 // indirect\n\tgolang.org/x/exp v0.0.0-20251017212417-90e834f514db // indirect\n\tgolang.org/x/sync v0.17.0 // indirect\n\tgopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/0xcafed00d/joystick v1.0.1 h1:r4p2cRp4MHJWu1gArhGtumbkPxmr3tcOUTFqybEhplM=\ngithub.com/0xcafed00d/joystick v1.0.1/go.mod h1:gzszjNgzP6jtCAeSdC9OqPVO5rO7TJuaw4P7eAjNzx8=\ngithub.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f h1:gOO/tNZMjjvTKZWpY7YnXC72ULNLErRtp94LountVE8=\ngithub.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=\ngithub.com/creack/goselect v0.1.3 h1:MaGNMclRo7P2Jl21hBpR1Cn33ITSbKP6E49RtfblLKc=\ngithub.com/creack/goselect v0.1.3/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 h1:C7t6eeMaEQVy6e8CarIhscYQlNmw5e3G36y7l7Y21Ao=\ngithub.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0/go.mod h1:56wL82FO0bfMU5RvfXoIwSOP2ggqqxT+tAfNEIyxuHw=\ngithub.com/eclipse/paho.mqtt.golang v1.5.1 h1:/VSOv3oDLlpqR2Epjn1Q7b2bSTplJIeV2ISgCl2W7nE=\ngithub.com/eclipse/paho.mqtt.golang v1.5.1/go.mod h1:1/yJCneuyOoCOzKSsOTUc0AJfpsItBGWvYpBLimhArU=\ngithub.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=\ngithub.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=\ngithub.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=\ngithub.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=\ngithub.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=\ngithub.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=\ngithub.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hybridgroup/go-ardrone v0.0.0-20140402002621-b9750d8d7b78 h1:7of6LJZ4LF9AvF4bTiMr2I72KxodBf1BXrSD9Tz0lWU=\ngithub.com/hybridgroup/go-ardrone v0.0.0-20140402002621-b9750d8d7b78/go.mod h1:YllNbhGM1UEcySxCv1BWK5lre7QLmJJ+O0ADUOo2nbc=\ngithub.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e h1:xCcwD5FOXul+j1dn8xD16nbrhJkkum/Cn+jTd/u1LhY=\ngithub.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs=\ngithub.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=\ngithub.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=\ngithub.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=\ngithub.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM=\ngithub.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g=\ngithub.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0=\ngithub.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE=\ngithub.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=\ngithub.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\ngithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\ngithub.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY=\ngithub.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/saltosystems/winrt-go v0.0.0-20241223121953-98e32661f6ff h1:cCYo/NzsEvK9MedoaqkVY8kCp4g1QMyKOYlA/uJwO7g=\ngithub.com/saltosystems/winrt-go v0.0.0-20241223121953-98e32661f6ff/go.mod h1:CIltaIm7qaANUIvzr0Vmz71lmQMAIbGJ7cvgzX7FMfA=\ngithub.com/sigurn/crc8 v0.0.0-20220107193325-2243fe600f9f h1:1R9KdKjCNSd7F8iGTxIpoID9prlYH8nuNYKt0XvweHA=\ngithub.com/sigurn/crc8 v0.0.0-20220107193325-2243fe600f9f/go.mod h1:vQhwQ4meQEDfahT5kd61wLAF5AAeh5ZPLVI4JJ/tYo8=\ngithub.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=\ngithub.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=\ngithub.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/soypat/cyw43439 v0.0.0-20250505012923-830110c8f4af h1:ZfFq94aH/BCSWWKd9RPUgdHOdgGKCnfl2VdvU9UksTA=\ngithub.com/soypat/cyw43439 v0.0.0-20250505012923-830110c8f4af/go.mod h1:MUaGO5m6X7xrkHrPDmnaxCEcuCCFN/0ZFh9oie+exbU=\ngithub.com/soypat/seqs v0.0.0-20250630134107-01c3f05666ba h1:NaIxs8iRVTAGBY4xiCy1Jqex3mIPodyLHppYvxUjJEk=\ngithub.com/soypat/seqs v0.0.0-20250630134107-01c3f05666ba/go.mod h1:oCVCNGCHMKoBj97Zp9znLbQ1nHxpkmOY9X+UAGzOxc8=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/tinygo-org/cbgo v0.0.4 h1:3D76CRYbH03Rudi8sEgs/YO0x3JIMdyq8jlQtk/44fU=\ngithub.com/tinygo-org/cbgo v0.0.4/go.mod h1:7+HgWIHd4nbAz0ESjGlJ1/v9LDU1Ox8MGzP9mah/fLk=\ngithub.com/tinygo-org/pio v0.2.0 h1:vo3xa6xDZ2rVtxrks/KcTZHF3qq4lyWOntvEvl2pOhU=\ngithub.com/tinygo-org/pio v0.2.0/go.mod h1:LU7Dw00NJ+N86QkeTGjMLNkYcEYMor6wTDpTCu0EaH8=\ngithub.com/warthog618/go-gpiocdev v0.9.1 h1:pwHPaqjJfhCipIQl78V+O3l9OKHivdRDdmgXYbmhuCI=\ngithub.com/warthog618/go-gpiocdev v0.9.1/go.mod h1:dN3e3t/S2aSNC+hgigGE/dBW8jE1ONk9bDSEYfoPyl8=\ngithub.com/warthog618/go-gpiosim v0.1.1 h1:MRAEv+T+itmw+3GeIGpQJBfanUVyg0l3JCTwHtwdre4=\ngithub.com/warthog618/go-gpiosim v0.1.1/go.mod h1:YXsnB+I9jdCMY4YAlMSRrlts25ltjmuIsrnoUrBLdqU=\ngo.bug.st/serial v1.6.4 h1:7FmqNPgVp3pu2Jz5PoPtbZ9jJO5gnEnZIvnI1lzve8A=\ngo.bug.st/serial v1.6.4/go.mod h1:nofMJxTeNVny/m6+KaafC6vJGj3miwQZ6vW4BZUGJPI=\ngocv.io/x/gocv v0.42.0 h1:AAsrFJH2aIsQHukkCovWqj0MCGZleQpVyf5gNVRXjQI=\ngocv.io/x/gocv v0.42.0/go.mod h1:zYdWMj29WAEznM3Y8NsU3A0TRq/wR/cy75jeUypThqU=\ngolang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=\ngolang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=\ngolang.org/x/exp v0.0.0-20251017212417-90e834f514db h1:by6IehL4BH5k3e3SJmcoNbOobMey2SLpAF79iPOEBvw=\ngolang.org/x/exp v0.0.0-20251017212417-90e834f514db/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70=\ngolang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=\ngolang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=\ngolang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=\ngolang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\ngopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nperiph.io/x/conn/v3 v3.7.2 h1:qt9dE6XGP5ljbFnCKRJ9OOCoiOyBGlw7JZgoi72zZ1s=\nperiph.io/x/conn/v3 v3.7.2/go.mod h1:Ao0b4sFRo4QOx6c1tROJU1fLJN1hUIYggjOrkIVnpGg=\nperiph.io/x/host/v3 v3.8.5 h1:g4g5xE1XZtDiGl1UAJaUur1aT7uNiFLMkyMEiZ7IHII=\nperiph.io/x/host/v3 v3.8.5/go.mod h1:hPq8dISZIc+UNfWoRj+bPH3XEBQqJPdFdx218W92mdc=\ntinygo.org/x/bluetooth v0.13.0 h1:3pkTMcfqv71HoAxG4DBTm2n+1bm6Nqqz8eoHjSW9+5g=\ntinygo.org/x/bluetooth v0.13.0/go.mod h1:YnyJRVX09i+wkFeHpXut0b+qHq+T2WwKBRRiF/scANA=\n"
  },
  {
    "path": "helpers_test.go",
    "content": "package gobot\n\nimport \"os\"\n\ntype NullReadWriteCloser struct{}\n\nfunc (NullReadWriteCloser) Write(p []byte) (int, error) {\n\treturn len(p), nil\n}\n\nfunc (NullReadWriteCloser) Read(b []byte) (int, error) {\n\treturn len(b), nil\n}\n\nfunc (NullReadWriteCloser) Close() error {\n\treturn nil\n}\n\ntype testDriver struct {\n\tCommander\n\n\tname       string\n\tpin        string\n\tconnection Connection\n}\n\nvar (\n\ttestDriverStart = func() error { return nil }\n\ttestDriverHalt  = func() error { return nil }\n)\n\nfunc (t *testDriver) Start() error           { return testDriverStart() }\nfunc (t *testDriver) Halt() error            { return testDriverHalt() }\nfunc (t *testDriver) Name() string           { return t.name }\nfunc (t *testDriver) SetName(n string)       { t.name = n }\nfunc (t *testDriver) Pin() string            { return t.pin }\nfunc (t *testDriver) Connection() Connection { return t.connection }\n\nfunc newTestDriver(adaptor *testAdaptor, name string, pin string) *testDriver {\n\tt := &testDriver{\n\t\tname:       name,\n\t\tconnection: adaptor,\n\t\tpin:        pin,\n\t\tCommander:  NewCommander(),\n\t}\n\n\tt.AddCommand(\"DriverCommand\", func(params map[string]interface{}) interface{} { return nil })\n\n\treturn t\n}\n\ntype testAdaptor struct {\n\tname string\n\tport string\n}\n\nvar (\n\ttestAdaptorConnect  = func() error { return nil }\n\ttestAdaptorFinalize = func() error { return nil }\n)\n\nfunc (t *testAdaptor) Finalize() error  { return testAdaptorFinalize() }\nfunc (t *testAdaptor) Connect() error   { return testAdaptorConnect() }\nfunc (t *testAdaptor) Name() string     { return t.name }\nfunc (t *testAdaptor) SetName(n string) { t.name = n }\nfunc (t *testAdaptor) Port() string     { return t.port }\n\nfunc newTestAdaptor(name string, port string) *testAdaptor { //nolint:unparam // keep for tests\n\treturn &testAdaptor{\n\t\tname: name,\n\t\tport: port,\n\t}\n}\n\nfunc newTestRobot(name string) *Robot {\n\tadaptor1 := newTestAdaptor(\"Connection1\", \"/dev/null\")\n\tadaptor2 := newTestAdaptor(\"Connection2\", \"/dev/null\")\n\tadaptor3 := newTestAdaptor(\"\", \"/dev/null\")\n\tdriver1 := newTestDriver(adaptor1, \"Device1\", \"0\")\n\tdriver2 := newTestDriver(adaptor2, \"Device2\", \"2\")\n\tdriver3 := newTestDriver(adaptor3, \"\", \"1\")\n\twork := func() {}\n\tr := NewRobot(name,\n\t\t[]Connection{adaptor1, adaptor2, adaptor3},\n\t\t[]Device{driver1, driver2, driver3},\n\t\twork,\n\t)\n\tr.AddCommand(\"RobotCommand\", func(params map[string]interface{}) interface{} { return nil })\n\tr.trap = func(c chan os.Signal) {\n\t\tc <- os.Interrupt\n\t}\n\n\treturn r\n}\n"
  },
  {
    "path": "manager.go",
    "content": "package gobot\n\nimport (\n\t\"os\"\n\t\"os/signal\"\n\t\"sync/atomic\"\n)\n\n// JSONManager is a JSON representation of a Gobot Manager.\ntype JSONManager struct {\n\tRobots   []*JSONRobot `json:\"robots\"`\n\tCommands []string     `json:\"commands\"`\n}\n\n// NewJSONManager returns a JSONManager given a Gobot Manager.\nfunc NewJSONManager(gobot *Manager) *JSONManager {\n\tjsonGobot := &JSONManager{\n\t\tRobots:   []*JSONRobot{},\n\t\tCommands: []string{},\n\t}\n\n\tfor command := range gobot.Commands() {\n\t\tjsonGobot.Commands = append(jsonGobot.Commands, command)\n\t}\n\n\tgobot.robots.Each(func(r *Robot) {\n\t\tjsonGobot.Robots = append(jsonGobot.Robots, NewJSONRobot(r))\n\t})\n\treturn jsonGobot\n}\n\n// Manager is the main type of your Gobot application and contains a collection of\n// Robots, API commands that apply to the Manager, and Events that apply to the Manager.\ntype Manager struct {\n\tCommander\n\tEventer\n\n\trobots  *Robots\n\ttrap    func(chan os.Signal)\n\tAutoRun bool\n\trunning atomic.Value\n}\n\n// NewManager returns a new Gobot Manager\nfunc NewManager() *Manager {\n\tm := &Manager{\n\t\trobots: &Robots{},\n\t\ttrap: func(c chan os.Signal) {\n\t\t\tsignal.Notify(c, os.Interrupt)\n\t\t},\n\t\tAutoRun:   true,\n\t\tCommander: NewCommander(),\n\t\tEventer:   NewEventer(),\n\t}\n\tm.running.Store(false)\n\treturn m\n}\n\n// Start calls the Start method on each robot in its collection of robots. On\n// error, call Stop to ensure that all robots are returned to a sane, stopped\n// state.\nfunc (g *Manager) Start() error {\n\tif err := g.robots.Start(!g.AutoRun); err != nil {\n\t\treturn err\n\t}\n\n\tg.running.Store(true)\n\n\tif !g.AutoRun {\n\t\treturn nil\n\t}\n\n\tc := make(chan os.Signal, 1)\n\tg.trap(c)\n\n\t// waiting for interrupt coming on the channel\n\t<-c\n\n\t// Stop calls the Stop method on each robot in its collection of robots.\n\treturn g.Stop()\n}\n\n// Stop calls the Stop method on each robot in its collection of robots.\nfunc (g *Manager) Stop() error {\n\terr := g.robots.Stop()\n\tg.running.Store(false)\n\treturn err\n}\n\n// Running returns if the Manager is currently started or not\nfunc (g *Manager) Running() bool {\n\treturn g.running.Load().(bool) //nolint:forcetypeassert // no error return value, so there is no better way\n}\n\n// Robots returns all robots associated with this Gobot Manager.\nfunc (g *Manager) Robots() *Robots {\n\treturn g.robots\n}\n\n// AddRobot adds a new robot to the internal collection of robots. Returns the\n// added robot\nfunc (g *Manager) AddRobot(r *Robot) *Robot {\n\t*g.robots = append(*g.robots, r)\n\treturn r\n}\n\n// Robot returns a robot given name. Returns nil if the Robot does not exist.\nfunc (g *Manager) Robot(name string) *Robot {\n\tfor _, robot := range *g.Robots() {\n\t\tif robot.Name == name {\n\t\t\treturn robot\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "manager_test.go",
    "content": "package gobot\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc initTestManager() *Manager {\n\tlog.SetOutput(&NullReadWriteCloser{})\n\tg := NewManager()\n\tg.trap = func(c chan os.Signal) {\n\t\tc <- os.Interrupt\n\t}\n\tg.AddRobot(newTestRobot(\"Robot1\"))\n\tg.AddRobot(newTestRobot(\"Robot2\"))\n\tg.AddRobot(newTestRobot(\"\"))\n\treturn g\n}\n\nfunc initTestManager1Robot() *Manager {\n\tlog.SetOutput(&NullReadWriteCloser{})\n\tg := NewManager()\n\tg.trap = func(c chan os.Signal) {\n\t\tc <- os.Interrupt\n\t}\n\tg.AddRobot(newTestRobot(\"Robot99\"))\n\n\treturn g\n}\n\nfunc TestNullReadWriteCloser(t *testing.T) {\n\tn := &NullReadWriteCloser{}\n\ti, _ := n.Write([]byte{1, 2, 3})\n\tassert.Equal(t, 3, i)\n\ti, _ = n.Read(make([]byte, 10))\n\tassert.Equal(t, 10, i)\n\trequire.NoError(t, n.Close())\n}\n\nfunc TestManagerRobot(t *testing.T) {\n\tg := initTestManager()\n\tassert.Equal(t, \"Robot1\", g.Robot(\"Robot1\").Name)\n\tassert.Equal(t, (*Robot)(nil), g.Robot(\"Robot4\"))\n\tassert.Equal(t, (Device)(nil), g.Robot(\"Robot4\").Device(\"Device1\"))\n\tassert.Equal(t, (Connection)(nil), g.Robot(\"Robot4\").Connection(\"Connection1\"))\n\tassert.Equal(t, (Device)(nil), g.Robot(\"Robot1\").Device(\"Device4\"))\n\tassert.Equal(t, \"Device1\", g.Robot(\"Robot1\").Device(\"Device1\").Name())\n\tassert.Equal(t, 3, g.Robot(\"Robot1\").Devices().Len())\n\tassert.Equal(t, (Connection)(nil), g.Robot(\"Robot1\").Connection(\"Connection4\"))\n\tassert.Equal(t, 3, g.Robot(\"Robot1\").Connections().Len())\n}\n\nfunc TestManagerToJSON(t *testing.T) {\n\tg := initTestManager()\n\tg.AddCommand(\"test_function\", func(params map[string]interface{}) interface{} {\n\t\treturn nil\n\t})\n\tjson := NewJSONManager(g)\n\tassert.Len(t, json.Robots, g.Robots().Len())\n\tassert.Len(t, json.Commands, len(g.Commands()))\n}\n\nfunc TestManagerStart(t *testing.T) {\n\tg := initTestManager()\n\trequire.NoError(t, g.Start())\n\trequire.NoError(t, g.Stop())\n\tassert.False(t, g.Running())\n}\n\nfunc TestManagerStartAutoRun(t *testing.T) {\n\tg := NewManager()\n\tg.AddRobot(newTestRobot(\"Robot99\"))\n\tgo func() { _ = g.Start() }()\n\ttime.Sleep(10 * time.Millisecond)\n\tassert.True(t, g.Running())\n\n\t// stop it\n\trequire.NoError(t, g.Stop())\n\tassert.False(t, g.Running())\n}\n\nfunc TestManagerStartDriverErrors(t *testing.T) {\n\t// arrange\n\tg := initTestManager1Robot()\n\tvar ec int\n\tes := [4]error{\n\t\tnil,\n\t\terrors.New(\"driver start error 1\"),\n\t\terrors.New(\"driver start error 2\"),\n\t\terrors.New(\"driver start error 3\"),\n\t}\n\ttestDriverStart = func() error {\n\t\tec++\n\t\treturn es[ec]\n\t}\n\tdefer func() { testDriverStart = func() error { return nil } }()\n\n\tvar want error\n\twant = multierror.Append(want, fmt.Errorf(\"'Device1' start error: %w\", es[1]))\n\twant = multierror.Append(want, fmt.Errorf(\"'Device2' start error: %w\", es[2]))\n\twant = multierror.Append(want, fmt.Errorf(\"'' start error: %w\", es[3]))\n\n\t// act & assert\n\tassert.Equal(t, want, g.Start())\n\trequire.NoError(t, g.Stop())\n}\n\nfunc TestManagerHaltFromRobotDriverErrors(t *testing.T) {\n\t// arrange\n\tg := initTestManager1Robot()\n\tes := [4]error{\n\t\tnil,\n\t\terrors.New(\"driver halt error 1\"),\n\t\terrors.New(\"driver halt error 2\"),\n\t\terrors.New(\"driver halt error 3\"),\n\t}\n\tvar ec int\n\ttestDriverHalt = func() error {\n\t\tec++\n\t\treturn es[ec]\n\t}\n\tdefer func() { testDriverHalt = func() error { return nil } }()\n\n\tvar want error\n\twant = multierror.Append(want, fmt.Errorf(\"'Device1' halt error: %w\", es[1]))\n\twant = multierror.Append(want, fmt.Errorf(\"'Device2' halt error: %w\", es[2]))\n\twant = multierror.Append(want, fmt.Errorf(\"'' halt error: %w\", es[3]))\n\n\t// act & assert\n\tassert.Equal(t, want, g.Start())\n}\n\nfunc TestManagerStartRobotAdaptorErrors(t *testing.T) {\n\t// arrange\n\tg := initTestManager1Robot()\n\tes := [4]error{\n\t\tnil,\n\t\terrors.New(\"adaptor start error 1\"),\n\t\terrors.New(\"adaptor start error 2\"),\n\t\terrors.New(\"adaptor start error 3\"),\n\t}\n\tvar ec int\n\ttestAdaptorConnect = func() error {\n\t\tec++\n\t\treturn es[ec]\n\t}\n\tdefer func() { testAdaptorConnect = func() error { return nil } }()\n\n\tvar want error\n\twant = multierror.Append(want, fmt.Errorf(\"'Connection1' connect error: %w\", es[1]))\n\twant = multierror.Append(want, fmt.Errorf(\"'Connection2' connect error: %w\", es[2]))\n\twant = multierror.Append(want, fmt.Errorf(\"'' connect error: %w\", es[3]))\n\n\t// act & assert\n\tassert.Equal(t, want, g.Start())\n\trequire.NoError(t, g.Stop())\n}\n\nfunc TestManagerFinalizeErrors(t *testing.T) {\n\t// arrange\n\tg := initTestManager1Robot()\n\tes := [4]error{\n\t\tnil,\n\t\terrors.New(\"adaptor finalize error 1\"),\n\t\terrors.New(\"adaptor finalize error 2\"),\n\t\terrors.New(\"adaptor finalize error 3\"),\n\t}\n\tvar ec int\n\ttestAdaptorFinalize = func() error {\n\t\tec++\n\t\treturn fmt.Errorf(\"adaptor finalize error %d\", ec)\n\t}\n\tdefer func() { testAdaptorFinalize = func() error { return nil } }()\n\n\tvar want error\n\twant = multierror.Append(want, fmt.Errorf(\"'Connection1' finalize error: %w\", es[1]))\n\twant = multierror.Append(want, fmt.Errorf(\"'Connection2' finalize error: %w\", es[2]))\n\twant = multierror.Append(want, fmt.Errorf(\"'' finalize error: %w\", es[3]))\n\n\t// act & assert\n\tassert.Equal(t, want, g.Start())\n}\n"
  },
  {
    "path": "platforms/adaptors/analogpinsadaptor.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\ntype analogPinTranslator func(pin string) (path string, w bool, readBufLen uint16, err error)\n\n// analogPinsConfiguration contains all changeable attributes of the adaptor.\ntype analogPinsConfiguration struct {\n\tdebug bool\n}\n\n// AnalogPinsAdaptor is a adaptor for analog pins, normally used for composition in platforms.\n// It is also usable for general sysfs access.\ntype AnalogPinsAdaptor struct {\n\tsys           *system.Accesser\n\tanalogPinsCfg *analogPinsConfiguration\n\ttranslate     analogPinTranslator\n\tpins          map[string]gobot.AnalogPinner\n\tmutex         sync.Mutex\n}\n\n// NewAnalogPinsAdaptor provides the access to analog pins of the board. Usually sysfs system drivers are used.\n// The translator is used to adapt the pin header naming, which is given by user, to the internal file name\n// nomenclature. This varies by each platform.\n//\n// Options:\n//\n//\t\"WithAnalogPinDebug\"\nfunc NewAnalogPinsAdaptor(\n\tsys *system.Accesser,\n\tt analogPinTranslator,\n\topts ...AnalogPinsOptionApplier,\n) *AnalogPinsAdaptor {\n\ta := AnalogPinsAdaptor{\n\t\tsys:           sys,\n\t\tanalogPinsCfg: &analogPinsConfiguration{},\n\t\ttranslate:     t,\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(a.analogPinsCfg)\n\t}\n\n\tsys.AddAnalogSupport()\n\n\treturn &a\n}\n\n// WithAnalogPinDebug can be used to switch on debugging for analog pins implementation.\nfunc WithAnalogPinDebug() analogPinsDebugOption {\n\treturn analogPinsDebugOption(true)\n}\n\n// Connect prepare new connection to analog pins.\nfunc (a *AnalogPinsAdaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.pins != nil {\n\t\treturn fmt.Errorf(\"analog pin adaptor already connected, please call Finalize() for re-connect\")\n\t}\n\n\ta.pins = make(map[string]gobot.AnalogPinner)\n\ta.debuglnf(\"connect the analog pins adaptor done\")\n\n\treturn nil\n}\n\n// Finalize closes connection to analog pins\nfunc (a *AnalogPinsAdaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\t// nothing to do at the moment, because the file access for each pin will be closed immediately after read/write\n\n\ta.pins = nil\n\ta.debuglnf(\"finalize the analog pins adaptor done\")\n\n\treturn nil\n}\n\n// AnalogRead returns an analog value from specified pin or identifier, defined by the translation function.\nfunc (a *AnalogPinsAdaptor) AnalogRead(id string) (int, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tpin, err := a.analogPin(id)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn pin.Read()\n}\n\n// AnalogWrite writes an analog value to the specified pin or identifier, defined by the translation function.\nfunc (a *AnalogPinsAdaptor) AnalogWrite(id string, val int) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tpin, err := a.analogPin(id)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn pin.Write(val)\n}\n\n// analogPin initializes the pin for analog access and returns matched pin for specified identifier.\nfunc (a *AnalogPinsAdaptor) analogPin(id string) (gobot.AnalogPinner, error) {\n\tif a.pins == nil {\n\t\treturn nil, fmt.Errorf(\"not connected for pin %s\", id)\n\t}\n\n\tpin := a.pins[id]\n\n\tif pin == nil {\n\t\tpath, w, readBufLen, err := a.translate(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpin = a.sys.NewAnalogPin(path, w, readBufLen)\n\t\ta.pins[id] = pin\n\t}\n\n\treturn pin, nil\n}\n\nfunc (a *AnalogPinsAdaptor) debuglnf(format string, p ...interface{}) {\n\tgobot.Debuglnf(a.analogPinsCfg.debug, format, p...)\n}\n"
  },
  {
    "path": "platforms/adaptors/analogpinsadaptor_test.go",
    "content": "//nolint:nonamedreturns // ok for tests\npackage adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tanalogReadPath            = \"/sys/bus/iio/devices/iio:device0/in_voltage0_raw\"\n\tanalogWritePath           = \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/export\"\n\tanalogReadWritePath       = \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/pwm44/period\"\n\tanalogReadWriteStringPath = \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/pwm44/polarity\"\n)\n\nvar analogMockPaths = []string{\n\tanalogReadPath,\n\tanalogWritePath,\n\tanalogReadWritePath,\n\tanalogReadWriteStringPath,\n}\n\nfunc initTestAnalogPinsAdaptorWithMockedFilesystem(mockPaths []string) (*AnalogPinsAdaptor, *system.MockFilesystem) {\n\tsys := system.NewAccesser()\n\tfs := sys.UseMockFilesystem(mockPaths)\n\ta := NewAnalogPinsAdaptor(sys, testAnalogPinTranslator)\n\tfs.Files[analogReadPath].Contents = \"54321\"\n\tfs.Files[analogWritePath].Contents = \"0\"\n\tfs.Files[analogReadWritePath].Contents = \"30000\"\n\tfs.Files[analogReadWriteStringPath].Contents = \"inverted\"\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc testAnalogPinTranslator(id string) (string, bool, uint16, error) {\n\tswitch id {\n\tcase \"read\":\n\t\treturn analogReadPath, false, 10, nil\n\tcase \"write\":\n\t\treturn analogWritePath, true, 0, nil\n\tcase \"read/write\":\n\t\treturn analogReadWritePath, true, 12, nil\n\tcase \"read/write_string\":\n\t\treturn analogReadWriteStringPath, true, 13, nil\n\t}\n\n\treturn \"\", false, 0, fmt.Errorf(\"'%s' is not a valid id of an analog pin\", id)\n}\n\nfunc TestAnalogPinsConnect(t *testing.T) {\n\ttranslate := func(id string) (path string, w bool, bufLen uint16, err error) { return }\n\ta := NewAnalogPinsAdaptor(system.NewAccesser(), translate)\n\tassert.Equal(t, (map[string]gobot.AnalogPinner)(nil), a.pins)\n\n\terr := a.AnalogWrite(\"write\", 1)\n\trequire.ErrorContains(t, err, \"not connected\")\n\n\terr = a.Connect()\n\trequire.NoError(t, err)\n\tassert.NotEqual(t, (map[string]gobot.AnalogPinner)(nil), a.pins)\n\tassert.Empty(t, a.pins)\n}\n\nfunc TestAnalogPinsFinalize(t *testing.T) {\n\t// arrange\n\tsys := system.NewAccesser()\n\tfs := sys.UseMockFilesystem(analogMockPaths)\n\ta := NewAnalogPinsAdaptor(sys, testAnalogPinTranslator)\n\tfs.Files[analogReadPath].Contents = \"0\"\n\t// assert that finalize before connect is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.AnalogWrite(\"write\", 1))\n\tassert.Len(t, a.pins, 1)\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Empty(t, a.pins)\n\t// assert that finalize after finalize is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange missing file\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.AnalogWrite(\"write\", 2))\n\tdelete(fs.Files, analogWritePath)\n\terr = a.Finalize()\n\trequire.NoError(t, err) // because there is currently no access on finalize\n\t// arrange write error\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.AnalogWrite(\"read/write_string\", 5))\n\tfs.WithWriteError = true\n\terr = a.Finalize()\n\trequire.NoError(t, err) // because there is currently no access on finalize\n}\n\nfunc TestAnalogPinsReConnect(t *testing.T) {\n\t// arrange\n\ta, _ := initTestAnalogPinsAdaptorWithMockedFilesystem(analogMockPaths)\n\trequire.NoError(t, a.AnalogWrite(\"read/write_string\", 1))\n\tassert.Len(t, a.pins, 1)\n\trequire.NoError(t, a.Finalize())\n\t// act\n\terr := a.Connect()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.NotNil(t, a.pins)\n\tassert.Empty(t, a.pins)\n}\n\nfunc TestAnalogWrite(t *testing.T) {\n\ttests := map[string]struct {\n\t\tpin              string\n\t\tsimulateWriteErr bool\n\t\tsimulateReadErr  bool\n\t\twantValW         string\n\t\twantValRW        string\n\t\twantValRWS       string\n\t\twantErr          string\n\t}{\n\t\t\"write_w_pin\": {\n\t\t\tpin:        \"write\",\n\t\t\twantValW:   \"100\",\n\t\t\twantValRW:  \"30000\",\n\t\t\twantValRWS: \"inverted\",\n\t\t},\n\t\t\"write_rw_pin\": {\n\t\t\tpin:        \"read/write_string\",\n\t\t\twantValW:   \"0\",\n\t\t\twantValRW:  \"30000\",\n\t\t\twantValRWS: \"100\",\n\t\t},\n\t\t\"ok_on_read_error\": {\n\t\t\tpin:             \"read/write_string\",\n\t\t\tsimulateReadErr: true,\n\t\t\twantValW:        \"0\",\n\t\t\twantValRW:       \"30000\",\n\t\t\twantValRWS:      \"100\",\n\t\t},\n\t\t\"error_write_error\": {\n\t\t\tpin:              \"read/write_string\",\n\t\t\tsimulateWriteErr: true,\n\t\t\twantValW:         \"0\",\n\t\t\twantValRW:        \"30000\",\n\t\t\twantValRWS:       \"inverted\",\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t\t\"error_notexist\": {\n\t\t\tpin:        \"notexist\",\n\t\t\twantValW:   \"0\",\n\t\t\twantValRW:  \"30000\",\n\t\t\twantValRWS: \"inverted\",\n\t\t\twantErr:    \"'notexist' is not a valid id of an analog pin\",\n\t\t},\n\t\t\"error_write_not_allowed\": {\n\t\t\tpin:        \"read\",\n\t\t\twantValW:   \"0\",\n\t\t\twantValRW:  \"30000\",\n\t\t\twantValRWS: \"inverted\",\n\t\t\twantErr:    \"the pin '/sys/bus/iio/devices/iio:device0/in_voltage0_raw' is not allowed to write (val: 100)\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta, fs := initTestAnalogPinsAdaptorWithMockedFilesystem(analogMockPaths)\n\t\t\tfs.WithWriteError = tc.simulateWriteErr\n\t\t\tfs.WithReadError = tc.simulateReadErr\n\t\t\t// act\n\t\t\terr := a.AnalogWrite(tc.pin, 100)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, \"54321\", fs.Files[analogReadPath].Contents)\n\t\t\tassert.Equal(t, tc.wantValW, fs.Files[analogWritePath].Contents)\n\t\t\tassert.Equal(t, tc.wantValRW, fs.Files[analogReadWritePath].Contents)\n\t\t\tassert.Equal(t, tc.wantValRWS, fs.Files[analogReadWriteStringPath].Contents)\n\t\t})\n\t}\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\ttests := map[string]struct {\n\t\tpin              string\n\t\tsimulateReadErr  bool\n\t\tsimulateWriteErr bool\n\t\twantVal          int\n\t\twantErr          string\n\t}{\n\t\t\"read_r_pin\": {\n\t\t\tpin:     \"read\",\n\t\t\twantVal: 54321,\n\t\t},\n\t\t\"read_rw_pin\": {\n\t\t\tpin:     \"read/write\",\n\t\t\twantVal: 30000,\n\t\t},\n\t\t\"ok_on_write_error\": {\n\t\t\tpin:              \"read\",\n\t\t\tsimulateWriteErr: true,\n\t\t\twantVal:          54321,\n\t\t},\n\t\t\"error_read_error\": {\n\t\t\tpin:             \"read\",\n\t\t\tsimulateReadErr: true,\n\t\t\twantErr:         \"read error\",\n\t\t},\n\t\t\"error_notexist\": {\n\t\t\tpin:     \"notexist\",\n\t\t\twantErr: \"'notexist' is not a valid id of an analog pin\",\n\t\t},\n\t\t\"error_invalid_syntax\": {\n\t\t\tpin:     \"read/write_string\",\n\t\t\twantErr: \"strconv.Atoi: parsing \\\"inverted\\\": invalid syntax\",\n\t\t},\n\t\t\"error_read_not_allowed\": {\n\t\t\tpin:     \"write\",\n\t\t\twantErr: \"the pin '/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/export' is not allowed to read\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta, fs := initTestAnalogPinsAdaptorWithMockedFilesystem(analogMockPaths)\n\t\t\tfs.WithReadError = tc.simulateReadErr\n\t\t\tfs.WithWriteError = tc.simulateWriteErr\n\t\t\t// act\n\t\t\tgot, err := a.AnalogRead(tc.pin)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantVal, got)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/adaptors/analogpinsadaptoroptions.go",
    "content": "package adaptors\n\n// AnalogPinsOptionApplier is the interface for analog pins adaptor options. This provides the possibility for change\n// the platform behavior by the user when creating the platform, e.g. by \"NewAdaptor()\".\n// The interface needs to be implemented by each configurable option type.\ntype AnalogPinsOptionApplier interface {\n\tapply(cfg *analogPinsConfiguration)\n}\n\n// analogPinsDebugOption is the type to switch on analog pins related debug messages.\ntype analogPinsDebugOption bool\n\nfunc (o analogPinsDebugOption) String() string {\n\treturn \"switch on debugging for analog pins option\"\n}\n\nfunc (o analogPinsDebugOption) apply(cfg *analogPinsConfiguration) {\n\tcfg.debug = bool(o)\n}\n"
  },
  {
    "path": "platforms/adaptors/analogpinsadaptoroptions_test.go",
    "content": "package adaptors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestWithAnalogPinDebug(t *testing.T) {\n\t// This is a general test, that options are applied in constructor. Further tests for options\n\t// can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange & act\n\ta := NewAnalogPinsAdaptor(system.NewAccesser(), nil, WithAnalogPinDebug())\n\t// assert\n\tassert.True(t, a.analogPinsCfg.debug)\n}\n"
  },
  {
    "path": "platforms/adaptors/analogpintranslator.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\ntype AnalogPinDefinition struct {\n\tPath       string\n\tW          bool   // writable\n\tReadBufLen uint16 // readable if buffer > 0\n}\n\ntype AnalogPinDefinitions map[string]AnalogPinDefinition\n\ntype AnalogPinTranslator struct {\n\tsys            *system.Accesser\n\tpinDefinitions AnalogPinDefinitions\n}\n\n// NewAnalogPinTranslator creates a new instance of a translator for analog pins, suitable for the most cases.\nfunc NewAnalogPinTranslator(sys *system.Accesser, pinDefinitions AnalogPinDefinitions) *AnalogPinTranslator {\n\treturn &AnalogPinTranslator{sys: sys, pinDefinitions: pinDefinitions}\n}\n\n// Translate returns the sysfs path for the given id.\nfunc (pt *AnalogPinTranslator) Translate(id string) (string, bool, uint16, error) {\n\tpinInfo, ok := pt.pinDefinitions[id]\n\tif !ok {\n\t\treturn \"\", false, 0, fmt.Errorf(\"'%s' is not a valid id for an analog pin\", id)\n\t}\n\n\tpath := pinInfo.Path\n\tinfo, err := pt.sys.Stat(path)\n\tif err != nil {\n\t\treturn \"\", false, 0, fmt.Errorf(\"error (%v) on access '%s'\", err, path)\n\t}\n\tif info.IsDir() {\n\t\treturn \"\", false, 0, fmt.Errorf(\"the item '%s' is a directory, which is not expected\", path)\n\t}\n\n\treturn path, pinInfo.W, pinInfo.ReadBufLen, nil\n}\n"
  },
  {
    "path": "platforms/adaptors/analogpintranslator_test.go",
    "content": "package adaptors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestNewAnalogPinTranslator(t *testing.T) {\n\t// arrange\n\tsys := &system.Accesser{}\n\tpinDef := AnalogPinDefinitions{}\n\t// act\n\tpt := NewAnalogPinTranslator(sys, pinDef)\n\t// assert\n\tassert.IsType(t, &AnalogPinTranslator{}, pt)\n\tassert.Equal(t, sys, pt.sys)\n\tassert.Equal(t, pinDef, pt.pinDefinitions)\n}\n\nfunc TestAnalogPinTranslatorTranslate(t *testing.T) {\n\tpinDefinitions := AnalogPinDefinitions{\n\t\t\"thermal_zone0\": {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n\t\t\"thermal_zone1\": {Path: \"/sys/class/thermal/thermal_zone1/temp\", W: false, ReadBufLen: 7},\n\t}\n\tmockedPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t\t\"/sys/class/thermal/thermal_zone1/temp\",\n\t}\n\ttests := map[string]struct {\n\t\tid         string\n\t\twantPath   string\n\t\twantBufLen uint16\n\t\twantErr    string\n\t}{\n\t\t\"translate_thermal_zone0\": {\n\t\t\tid:         \"thermal_zone0\",\n\t\t\twantPath:   \"/sys/class/thermal/thermal_zone0/temp\",\n\t\t\twantBufLen: 7,\n\t\t},\n\t\t\"translate_thermal_zone1\": {\n\t\t\tid:         \"thermal_zone1\",\n\t\t\twantPath:   \"/sys/class/thermal/thermal_zone1/temp\",\n\t\t\twantBufLen: 7,\n\t\t},\n\t\t\"unknown_id\": {\n\t\t\tid:      \"99\",\n\t\t\twantErr: \"'99' is not a valid id for an analog pin\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tsys := system.NewAccesser()\n\t\t\t_ = sys.UseMockFilesystem(mockedPaths)\n\t\t\tpt := NewAnalogPinTranslator(sys, pinDefinitions)\n\t\t\t// act\n\t\t\tpath, w, buf, err := pt.Translate(tc.id)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantPath, path)\n\t\t\tassert.False(t, w)\n\t\t\tassert.Equal(t, tc.wantBufLen, buf)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/adaptors/busnumbervalidator.go",
    "content": "package adaptors\n\nimport \"fmt\"\n\ntype BusNumberValidator struct {\n\tvalidNumbers []int\n}\n\n// NewBusNumberValidator creates a new instance for a bus number validator, used for I2C and SPI.\nfunc NewBusNumberValidator(validNumbers []int) *BusNumberValidator {\n\treturn &BusNumberValidator{validNumbers: validNumbers}\n}\n\nfunc (bnv *BusNumberValidator) Validate(busNr int) error {\n\tfor _, validNumber := range bnv.validNumbers {\n\t\tif validNumber == busNr {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn fmt.Errorf(\"bus number %d out of range %v\", busNr, bnv.validNumbers)\n}\n"
  },
  {
    "path": "platforms/adaptors/busnumbervalidator_test.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestNewBusNumberValidator(t *testing.T) {\n\t// arrange\n\tvalidNums := []int{5, 8}\n\t// act\n\tbnv := NewBusNumberValidator(validNums)\n\t// assert\n\tassert.IsType(t, &BusNumberValidator{}, bnv)\n\tassert.Equal(t, validNums, bnv.validNumbers)\n}\n\nfunc TestBusNumberValidatorValidate(t *testing.T) {\n\ttests := map[string]struct {\n\t\tvalidNumbers []int\n\t\tbusNr        int\n\t\twantErr      error\n\t}{\n\t\t\"number_negative_error\": {\n\t\t\tvalidNumbers: []int{0, 1, 2, 3, 4},\n\t\t\tbusNr:        -1,\n\t\t\twantErr:      fmt.Errorf(\"bus number -1 out of range [0 1 2 3 4]\"),\n\t\t},\n\t\t\"number_0_ok\": {\n\t\t\tvalidNumbers: []int{0, 1, 2, 3, 4},\n\t\t\tbusNr:        0,\n\t\t},\n\t\t\"number_1_ok\": {\n\t\t\tvalidNumbers: []int{0, 1, 2, 3, 4},\n\t\t\tbusNr:        1,\n\t\t},\n\t\t\"number_2_ok\": {\n\t\t\tvalidNumbers: []int{0, 1, 2, 3, 4},\n\t\t\tbusNr:        2,\n\t\t},\n\t\t\"number_3_ok\": {\n\t\t\tvalidNumbers: []int{0, 1, 2, 3, 4},\n\t\t\tbusNr:        3,\n\t\t},\n\t\t\"number_4_ok\": {\n\t\t\tvalidNumbers: []int{0, 1, 2, 3, 4},\n\t\t\tbusNr:        4,\n\t\t},\n\t\t\"number_5_error\": {\n\t\t\tvalidNumbers: []int{0, 1, 2, 3, 4},\n\t\t\tbusNr:        5,\n\t\t\twantErr:      fmt.Errorf(\"bus number 5 out of range [0 1 2 3 4]\"),\n\t\t},\n\t\t\"number_negative_error_0_2\": {\n\t\t\tvalidNumbers: []int{0, 2},\n\t\t\tbusNr:        -1,\n\t\t\twantErr:      fmt.Errorf(\"bus number -1 out of range [0 2]\"),\n\t\t},\n\t\t\"number_0_ok_0_2\": {\n\t\t\tvalidNumbers: []int{0, 2},\n\t\t\tbusNr:        0,\n\t\t},\n\t\t\"number_1_error_0_2\": {\n\t\t\tvalidNumbers: []int{0, 2},\n\t\t\tbusNr:        1,\n\t\t\twantErr:      fmt.Errorf(\"bus number 1 out of range [0 2]\"),\n\t\t},\n\t\t\"number_2_ok_0_2\": {\n\t\t\tvalidNumbers: []int{0, 2},\n\t\t\tbusNr:        2,\n\t\t},\n\t\t\"number_3_error_0_2\": {\n\t\t\tvalidNumbers: []int{0, 2},\n\t\t\tbusNr:        3,\n\t\t\twantErr:      fmt.Errorf(\"bus number 3 out of range [0 2]\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tbnv := NewBusNumberValidator(tc.validNumbers)\n\t\t\t// act\n\t\t\terr := bnv.Validate(tc.busNr)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/adaptors/digitalpinsadaptor.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\ntype (\n\tdigitalPinTranslator  func(pin string) (chip string, line int, err error)\n\tdigitalPinInitializer func(gobot.DigitalPinner) error\n)\n\n// digitalPinsConfiguration contains all changeable attributes of the adaptor.\ntype digitalPinsConfiguration struct {\n\tdebug         bool\n\tinitialize    digitalPinInitializer\n\tsystemOptions []system.AccesserOptionApplier\n\tpinOptions    map[string][]func(gobot.DigitalPinOptioner) bool\n}\n\n// DigitalPinsAdaptor is a adaptor for digital pins, normally used for composition in platforms.\ntype DigitalPinsAdaptor struct {\n\tsys            *system.Accesser\n\tdigitalPinsCfg *digitalPinsConfiguration\n\ttranslate      digitalPinTranslator\n\tpins           map[string]gobot.DigitalPinner\n\tmutex          sync.Mutex\n}\n\n// NewDigitalPinsAdaptor provides the access to digital pins of the board. It supports sysfs and cdev system drivers.\n// This is decided by the given accesser. The translator is used to adapt the pin header naming, which is given by user,\n// to the internal file name or chip/line nomenclature. This varies by each platform. If for some reasons the default\n// initializer is not suitable, it can be given by the option \"WithDigitalPinInitializer()\". This is especially needed,\n// if some values needs to be adjusted after the pin was created but before the pin is exported.\nfunc NewDigitalPinsAdaptor(\n\tsys *system.Accesser,\n\tt digitalPinTranslator,\n\topts ...DigitalPinsOptionApplier,\n) *DigitalPinsAdaptor {\n\ta := DigitalPinsAdaptor{\n\t\tsys: sys,\n\t\tdigitalPinsCfg: &digitalPinsConfiguration{\n\t\t\tinitialize: func(pin gobot.DigitalPinner) error { return pin.Export() },\n\t\t\tpinOptions: make(map[string][]func(gobot.DigitalPinOptioner) bool),\n\t\t},\n\t\ttranslate: t,\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(a.digitalPinsCfg)\n\t}\n\n\ta.sys.AddDigitalPinSupport(a.digitalPinsCfg.systemOptions...)\n\n\treturn &a\n}\n\n// WithDigitalPinDebug can be used to switch on debugging for digital pins implementation.\nfunc WithDigitalPinDebug() digitalPinsDebugOption {\n\treturn digitalPinsDebugOption(true)\n}\n\n// WithDigitalPinInitializer can be used to substitute the default initializer.\nfunc WithDigitalPinInitializer(pc digitalPinInitializer) digitalPinsInitializeOption {\n\treturn digitalPinsInitializeOption(pc)\n}\n\n// WithGpioCdevAccess can be used to change the default legacy sysfs implementation to the character device Kernel ABI,\n// provided by the go-gpiocdev package.\nfunc WithGpioCdevAccess() digitalPinsSystemSysfsOption {\n\treturn digitalPinsSystemSysfsOption(false)\n}\n\n// WithGpioSysfsAccess can be used to change the default character device implementation, provided by the go-gpiocdev\n// package, to the legacy sysfs Kernel ABI.\nfunc WithGpioSysfsAccess() digitalPinsSystemSysfsOption {\n\treturn digitalPinsSystemSysfsOption(true)\n}\n\n// WithGpiosActiveLow prepares the given pins for inverse reaction on next initialize.\n// This is working for inputs and outputs.\nfunc WithGpiosActiveLow(pin string, otherPins ...string) digitalPinsActiveLowOption {\n\tpins := append([]string{pin}, otherPins...)\n\treturn digitalPinsActiveLowOption(pins)\n}\n\n// WithGpiosPullDown prepares the given pins to be pulled down (high impedance to GND) on next initialize.\n// This is working for inputs and outputs since Kernel 5.5, but will be ignored with sysfs ABI.\nfunc WithGpiosPullDown(pin string, otherPins ...string) digitalPinsPullDownOption {\n\tpins := append([]string{pin}, otherPins...)\n\treturn digitalPinsPullDownOption(pins)\n}\n\n// WithGpiosPullUp prepares the given pins to be pulled up (high impedance to VDD) on next initialize.\n// This is working for inputs and outputs since Kernel 5.5, but will be ignored with sysfs ABI.\nfunc WithGpiosPullUp(pin string, otherPins ...string) digitalPinsPullUpOption {\n\tpins := append([]string{pin}, otherPins...)\n\treturn digitalPinsPullUpOption(pins)\n}\n\n// WithGpiosOpenDrain prepares the given output pins to be driven with open drain/collector on next initialize.\n// This will be ignored for inputs or with sysfs ABI.\nfunc WithGpiosOpenDrain(pin string, otherPins ...string) digitalPinsOpenDrainOption {\n\tpins := append([]string{pin}, otherPins...)\n\treturn digitalPinsOpenDrainOption(pins)\n}\n\n// WithGpiosOpenSource prepares the given output pins to be driven with open source/emitter on next initialize.\n// This will be ignored for inputs or with sysfs ABI.\nfunc WithGpiosOpenSource(pin string, otherPins ...string) digitalPinsOpenSourceOption {\n\tpins := append([]string{pin}, otherPins...)\n\treturn digitalPinsOpenSourceOption(pins)\n}\n\n// WithGpioDebounce prepares the given input pin to be debounced on next initialize.\n// This is working for inputs since Kernel 5.10, but will be ignored for outputs or with sysfs ABI.\nfunc WithGpioDebounce(pin string, period time.Duration) digitalPinsDebounceOption {\n\treturn digitalPinsDebounceOption{id: pin, period: period}\n}\n\n// WithGpioEventOnFallingEdge prepares the given input pin to be generate an event on falling edge.\n// This is working for inputs since Kernel 5.10, but will be ignored for outputs or with sysfs ABI.\nfunc WithGpioEventOnFallingEdge(pin string, handler func(lineOffset int, timestamp time.Duration, detectedEdge string,\n\tseqno uint32, lseqno uint32),\n) digitalPinsEventOnFallingEdgeOption {\n\treturn digitalPinsEventOnFallingEdgeOption{id: pin, handler: handler}\n}\n\n// WithGpioEventOnRisingEdge prepares the given input pin to be generate an event on rising edge.\n// This is working for inputs since Kernel 5.10, but will be ignored for outputs or with sysfs ABI.\nfunc WithGpioEventOnRisingEdge(pin string, handler func(lineOffset int, timestamp time.Duration, detectedEdge string,\n\tseqno uint32, lseqno uint32),\n) digitalPinsEventOnRisingEdgeOption {\n\treturn digitalPinsEventOnRisingEdgeOption{id: pin, handler: handler}\n}\n\n// WithGpioEventOnBothEdges prepares the given input pin to be generate an event on rising and falling edges.\n// This is working for inputs since Kernel 5.10, but will be ignored for outputs or with sysfs ABI.\nfunc WithGpioEventOnBothEdges(pin string, handler func(lineOffset int, timestamp time.Duration, detectedEdge string,\n\tseqno uint32, lseqno uint32),\n) digitalPinsEventOnBothEdgesOption {\n\treturn digitalPinsEventOnBothEdgesOption{id: pin, handler: handler}\n}\n\n// WithGpioPollForEdgeDetection prepares the given input pin to use a discrete input pin polling function together with\n// edge detection.\nfunc WithGpioPollForEdgeDetection(\n\tpin string,\n\tpollInterval time.Duration,\n\tpollQuitChan chan struct{},\n) digitalPinsPollForEdgeDetectionOption {\n\treturn digitalPinsPollForEdgeDetectionOption{id: pin, pollInterval: pollInterval, pollQuitChan: pollQuitChan}\n}\n\n// Connect prepare new connection to digital pins.\nfunc (a *DigitalPinsAdaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.pins != nil {\n\t\treturn fmt.Errorf(\"digital pin adaptor already connected, please call Finalize() for re-connect\")\n\t}\n\n\ta.pins = make(map[string]gobot.DigitalPinner)\n\ta.debuglnf(\"connect the digital pins adaptor done\")\n\n\treturn nil\n}\n\n// Finalize closes connection to digital pins\nfunc (a *DigitalPinsAdaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.debuglnf(\"finalize the digital pins adaptor with %d pins...\", len(a.pins))\n\n\tvar err error\n\tfor id, pin := range a.pins {\n\t\tif pin != nil {\n\t\t\te := pin.Unexport()\n\t\t\tif e != nil {\n\t\t\t\terr = multierror.Append(err, e)\n\t\t\t}\n\t\t\ta.debuglnf(\"finalize the digital pin '%s' done with error: %v\", id, e)\n\t\t}\n\t}\n\ta.pins = nil\n\ta.debuglnf(\"finalize the digital pins adaptor done with error: %v\", err)\n\n\treturn err\n}\n\n// DigitalPin returns a digital pin. If the pin is initially acquired, it is an input.\n// Pin direction and other options can be changed afterwards by pin.ApplyOptions() at any time.\nfunc (a *DigitalPinsAdaptor) DigitalPin(id string) (gobot.DigitalPinner, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.digitalPin(id)\n}\n\n// DigitalRead reads digital value from pin\nfunc (a *DigitalPinsAdaptor) DigitalRead(id string) (int, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tpin, err := a.digitalPin(id, system.WithPinDirectionInput())\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn pin.Read()\n}\n\n// DigitalWrite writes digital value to specified pin\nfunc (a *DigitalPinsAdaptor) DigitalWrite(id string, val byte) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tpin, err := a.digitalPin(id, system.WithPinDirectionOutput(int(val)))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn pin.Write(int(val))\n}\n\nfunc (a *DigitalPinsAdaptor) digitalPin(\n\tid string,\n\topts ...func(gobot.DigitalPinOptioner) bool,\n) (gobot.DigitalPinner, error) {\n\tif a.pins == nil {\n\t\treturn nil, fmt.Errorf(\"not connected for pin %s\", id)\n\t}\n\n\to := append(a.digitalPinsCfg.pinOptions[id], opts...)\n\tpin := a.pins[id]\n\n\tif pin == nil {\n\t\tchip, line, err := a.translate(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpin = a.sys.NewDigitalPin(chip, line, o...)\n\t\tif err = a.digitalPinsCfg.initialize(pin); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ta.pins[id] = pin\n\t} else {\n\t\tif err := pin.ApplyOptions(o...); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn pin, nil\n}\n\nfunc (a *DigitalPinsAdaptor) debuglnf(format string, p ...interface{}) {\n\tgobot.Debuglnf(a.digitalPinsCfg.debug, format, p...)\n}\n"
  },
  {
    "path": "platforms/adaptors/digitalpinsadaptor_test.go",
    "content": "//nolint:nonamedreturns // ok for tests\npackage adaptors\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.DigitalPinnerProvider = (*DigitalPinsAdaptor)(nil)\n\t_ gpio.DigitalReader          = (*DigitalPinsAdaptor)(nil)\n\t_ gpio.DigitalWriter          = (*DigitalPinsAdaptor)(nil)\n)\n\nfunc initTestConnectedDigitalPinsAdaptorWithMockedFilesystem(\n\tmockPaths []string,\n) (*DigitalPinsAdaptor, *system.MockFilesystem) {\n\ta, fs := initTestDigitalPinsAdaptorWithMockedFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc initTestDigitalPinsAdaptorWithMockedFilesystem(mockPaths []string) (*DigitalPinsAdaptor, *system.MockFilesystem) {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\tfs := sys.UseMockFilesystem(mockPaths)\n\ta := NewDigitalPinsAdaptor(sys, testDigitalPinTranslator)\n\n\treturn a, fs\n}\n\nfunc testDigitalPinTranslator(pin string) (string, int, error) {\n\tline, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn \"\", 0, fmt.Errorf(\"not a valid pin\")\n\t}\n\tline = line + 11 // just for tests\n\treturn \"\", line, err\n}\n\nfunc TestNewDigitalPinsAdaptor(t *testing.T) {\n\t// arrange\n\ttranslate := func(string) (string, int, error) { return \"\", 0, nil }\n\tsys := system.NewAccesser()\n\t// arrange for cdev needed\n\tsys.UseMockFilesystem([]string{\"/dev/gpiochip\"})\n\t// act\n\ta := NewDigitalPinsAdaptor(sys, translate)\n\t// assert\n\tassert.IsType(t, &DigitalPinsAdaptor{}, a)\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.digitalPinsCfg)\n\tassert.NotNil(t, a.translate)\n\tassert.Nil(t, a.pins) // will be created on connect\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n}\n\nfunc TestDigitalPinsConnect(t *testing.T) {\n\ttranslate := func(pin string) (chip string, line int, err error) { return }\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\n\ta := NewDigitalPinsAdaptor(sys, translate)\n\tassert.Equal(t, (map[string]gobot.DigitalPinner)(nil), a.pins)\n\n\t_, err := a.DigitalRead(\"13\")\n\trequire.ErrorContains(t, err, \"not connected for pin 13\")\n\n\terr = a.DigitalWrite(\"7\", 1)\n\trequire.ErrorContains(t, err, \"not connected for pin 7\")\n\n\terr = a.Connect()\n\trequire.NoError(t, err)\n\tassert.NotEqual(t, (map[string]gobot.DigitalPinner)(nil), a.pins)\n\tassert.Empty(t, a.pins)\n}\n\nfunc TestDigitalPinsFinalize(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio14/direction\",\n\t\t\"/sys/class/gpio/gpio14/value\",\n\t}\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\tfs := sys.UseMockFilesystem(mockedPaths)\n\ta := NewDigitalPinsAdaptor(sys, testDigitalPinTranslator)\n\t// assert that finalize before connect is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.DigitalWrite(\"3\", 1))\n\tassert.Len(t, a.pins, 1)\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Empty(t, a.pins)\n\t// assert that finalize after finalize is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange missing sysfs file\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.DigitalWrite(\"3\", 2))\n\tdelete(fs.Files, \"/sys/class/gpio/unexport\")\n\terr = a.Finalize()\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/unexport: no such file\")\n}\n\nfunc TestDigitalPinsReConnect(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio15/direction\",\n\t\t\"/sys/class/gpio/gpio15/value\",\n\t}\n\ta, _ := initTestConnectedDigitalPinsAdaptorWithMockedFilesystem(mockedPaths)\n\trequire.NoError(t, a.DigitalWrite(\"4\", 1))\n\tassert.Len(t, a.pins, 1)\n\trequire.NoError(t, a.Finalize())\n\t// act\n\terr := a.Connect()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.NotNil(t, a.pins)\n\tassert.Empty(t, a.pins)\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio25/value\",\n\t\t\"/sys/class/gpio/gpio25/direction\",\n\t}\n\ta, _ := initTestConnectedDigitalPinsAdaptorWithMockedFilesystem(mockedPaths)\n\n\terr := a.DigitalWrite(\"14\", 1)\n\trequire.NoError(t, err)\n\n\ti, err := a.DigitalRead(\"14\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, i)\n}\n\nfunc TestDigitalRead(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio24/value\",\n\t\t\"/sys/class/gpio/gpio24/direction\",\n\t}\n\ta, fs := initTestConnectedDigitalPinsAdaptorWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/gpio/gpio24/value\"].Contents = \"1\"\n\n\t// assert read correct value without error\n\ti, err := a.DigitalRead(\"13\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, i)\n\n\t// assert error bubbling for read errors\n\tfs.WithReadError = true\n\t_, err = a.DigitalRead(\"13\")\n\trequire.ErrorContains(t, err, \"read error\")\n\n\t// assert error bubbling for write errors\n\tfs.WithWriteError = true\n\t_, err = a.DigitalRead(\"7\")\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestDigitalPinConcurrency(t *testing.T) {\n\toldProcs := runtime.GOMAXPROCS(0)\n\truntime.GOMAXPROCS(8)\n\tdefer runtime.GOMAXPROCS(oldProcs)\n\n\ttranslate := func(pin string) (string, int, error) { line, err := strconv.Atoi(pin); return \"\", line, err }\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\n\tfor retry := 0; retry < 20; retry++ {\n\n\t\ta := NewDigitalPinsAdaptor(sys, translate)\n\t\t_ = a.Connect()\n\t\tvar wg sync.WaitGroup\n\n\t\tfor i := 0; i < 20; i++ {\n\t\t\twg.Add(1)\n\t\t\tpinAsString := strconv.Itoa(i)\n\t\t\tgo func(pin string) {\n\t\t\t\tdefer wg.Done()\n\t\t\t\t_, _ = a.DigitalPin(pin)\n\t\t\t}(pinAsString)\n\t\t}\n\n\t\twg.Wait()\n\t}\n}\n"
  },
  {
    "path": "platforms/adaptors/digitalpinsadaptoroptions.go",
    "content": "package adaptors\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// DigitalPinsOptionApplier is the interface for digital adaptors options. This provides the possibility for change the\n// platform behavior by the user when creating the platform, e.g. by \"NewAdaptor()\".\n// The interface needs to be implemented by each configurable option type.\ntype DigitalPinsOptionApplier interface {\n\tapply(cfg *digitalPinsConfiguration)\n}\n\n// digitalPinsDebugOption is the type to switch on digital pin related debug messages.\ntype digitalPinsDebugOption bool\n\n// digitalPinInitializeOption is the type for applying another than the default initializer\ntype digitalPinsInitializeOption digitalPinInitializer\n\n// digitalPinsSystemSysfsOption is the type to change the default character device implementation to the legacy\n// sysfs Kernel ABI\ntype digitalPinsSystemSysfsOption bool\n\n// digitalPinsActiveLowOption is the type to prepare the given pins for inverse reaction on next initialize\ntype digitalPinsActiveLowOption []string\n\n// digitalPinsPullDownOption is the type to prepare the given pins to be pulled down (high impedance to GND)\n// on next initialize\ntype digitalPinsPullDownOption []string\n\n// digitalPinsPullUpOption is the type to prepare the given pins to be pulled up (high impedance to VDD)\n// on next initialize\ntype digitalPinsPullUpOption []string\n\n// digitalPinsOpenDrainOption is the type to prepare the given output pins to be driven with open drain/collector\n// on next initialize\ntype digitalPinsOpenDrainOption []string\n\n// digitalPinsOpenSourceOption is the type to prepares the given output pins to be driven with open source/emitter\n// on next initialize\ntype digitalPinsOpenSourceOption []string\n\n// digitalPinsDebounceOption is the type to prepare the given input pin to be debounced on next initialize\ntype digitalPinsDebounceOption struct {\n\tid     string\n\tperiod time.Duration\n}\n\n// digitalPinsEventOnFallingEdgeOption is the type to prepare the given input pin to be generate an event\n// on falling edge\ntype digitalPinsEventOnFallingEdgeOption struct {\n\tid      string\n\thandler func(int, time.Duration, string, uint32, uint32)\n}\n\n// digitalPinsEventOnRisingEdgeOption is the type to prepare the given input pin to be generate an event\n// on rising edge\ntype digitalPinsEventOnRisingEdgeOption struct {\n\tid      string\n\thandler func(int, time.Duration, string, uint32, uint32)\n}\n\n// digitalPinsEventOnBothEdgesOption is the type to prepare the given input pin to be generate an event\n// on rising and falling edges\ntype digitalPinsEventOnBothEdgesOption struct {\n\tid      string\n\thandler func(int, time.Duration, string, uint32, uint32)\n}\n\n// digitalPinsPollForEdgeDetectionOption is the type to prepare the given input pin to use a discrete input pin polling\n// function together with edge detection.\ntype digitalPinsPollForEdgeDetectionOption struct {\n\tid           string\n\tpollInterval time.Duration\n\tpollQuitChan chan struct{}\n}\n\nfunc (o digitalPinsDebugOption) String() string {\n\treturn \"switch on debugging for digital pins option\"\n}\n\nfunc (o digitalPinsInitializeOption) String() string {\n\treturn \"pin initializer option for digital IO's\"\n}\n\nfunc (o digitalPinsSystemSysfsOption) String() string {\n\treturn \"use sysfs vs. cdev system access option for digital pins\"\n}\n\nfunc (o digitalPinsActiveLowOption) String() string {\n\treturn \"digital pins set to active low option\"\n}\n\nfunc (o digitalPinsPullDownOption) String() string {\n\treturn \"digital pins set to pull down option\"\n}\n\nfunc (o digitalPinsPullUpOption) String() string {\n\treturn \"digital pins set to pull up option\"\n}\n\nfunc (o digitalPinsOpenDrainOption) String() string {\n\treturn \"digital pins set to open drain option\"\n}\n\nfunc (o digitalPinsOpenSourceOption) String() string {\n\treturn \"digital pins set to open source option\"\n}\n\nfunc (o digitalPinsDebounceOption) String() string {\n\treturn \"set debounce time for digital pin option\"\n}\n\nfunc (o digitalPinsEventOnFallingEdgeOption) String() string {\n\treturn \"set event on falling edge for digital pin option\"\n}\n\nfunc (o digitalPinsEventOnRisingEdgeOption) String() string {\n\treturn \"set event on rising edge for digital pin option\"\n}\n\nfunc (o digitalPinsEventOnBothEdgesOption) String() string {\n\treturn \"set event on rising and falling edge for digital pin option\"\n}\n\nfunc (o digitalPinsPollForEdgeDetectionOption) String() string {\n\treturn \"discrete polling function for edge detection on digital pin option\"\n}\n\nfunc (o digitalPinsDebugOption) apply(cfg *digitalPinsConfiguration) {\n\tcfg.debug = bool(o)\n\tcfg.systemOptions = append(cfg.systemOptions, system.WithDigitalPinDebug())\n}\n\nfunc (o digitalPinsInitializeOption) apply(cfg *digitalPinsConfiguration) {\n\tcfg.initialize = digitalPinInitializer(o)\n}\n\nfunc (o digitalPinsSystemSysfsOption) apply(cfg *digitalPinsConfiguration) {\n\tuseSysFs := bool(o)\n\n\tif useSysFs {\n\t\tcfg.systemOptions = append(cfg.systemOptions, system.WithDigitalPinSysfsAccess())\n\t} else {\n\t\tcfg.systemOptions = append(cfg.systemOptions, system.WithDigitalPinCdevAccess())\n\t}\n}\n\nfunc (o digitalPinsActiveLowOption) apply(cfg *digitalPinsConfiguration) {\n\tfor _, pin := range o {\n\t\tcfg.pinOptions[pin] = append(cfg.pinOptions[pin], system.WithPinActiveLow())\n\t}\n}\n\nfunc (o digitalPinsPullDownOption) apply(cfg *digitalPinsConfiguration) {\n\tfor _, pin := range o {\n\t\tcfg.pinOptions[pin] = append(cfg.pinOptions[pin], system.WithPinPullDown())\n\t}\n}\n\nfunc (o digitalPinsPullUpOption) apply(cfg *digitalPinsConfiguration) {\n\tfor _, pin := range o {\n\t\tcfg.pinOptions[pin] = append(cfg.pinOptions[pin], system.WithPinPullUp())\n\t}\n}\n\nfunc (o digitalPinsOpenDrainOption) apply(cfg *digitalPinsConfiguration) {\n\tfor _, pin := range o {\n\t\tcfg.pinOptions[pin] = append(cfg.pinOptions[pin], system.WithPinOpenDrain())\n\t}\n}\n\nfunc (o digitalPinsOpenSourceOption) apply(cfg *digitalPinsConfiguration) {\n\tfor _, pin := range o {\n\t\tcfg.pinOptions[pin] = append(cfg.pinOptions[pin], system.WithPinOpenSource())\n\t}\n}\n\nfunc (o digitalPinsDebounceOption) apply(cfg *digitalPinsConfiguration) {\n\tcfg.pinOptions[o.id] = append(cfg.pinOptions[o.id], system.WithPinDebounce(o.period))\n}\n\nfunc (o digitalPinsEventOnFallingEdgeOption) apply(cfg *digitalPinsConfiguration) {\n\tcfg.pinOptions[o.id] = append(cfg.pinOptions[o.id], system.WithPinEventOnFallingEdge(o.handler))\n}\n\nfunc (o digitalPinsEventOnRisingEdgeOption) apply(cfg *digitalPinsConfiguration) {\n\tcfg.pinOptions[o.id] = append(cfg.pinOptions[o.id], system.WithPinEventOnRisingEdge(o.handler))\n}\n\nfunc (o digitalPinsEventOnBothEdgesOption) apply(cfg *digitalPinsConfiguration) {\n\tcfg.pinOptions[o.id] = append(cfg.pinOptions[o.id], system.WithPinEventOnBothEdges(o.handler))\n}\n\nfunc (o digitalPinsPollForEdgeDetectionOption) apply(cfg *digitalPinsConfiguration) {\n\tcfg.pinOptions[o.id] = append(cfg.pinOptions[o.id],\n\t\tsystem.WithPinPollForEdgeDetection(o.pollInterval, o.pollQuitChan))\n}\n"
  },
  {
    "path": "platforms/adaptors/digitalpinsadaptoroptions_test.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestDigitalPinsWithGpiosActiveLow(t *testing.T) {\n\t// This is a general test, that options are applied in constructor. Further tests for options\n\t// can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange & act\n\ta := NewDigitalPinsAdaptor(system.NewAccesser(), nil, WithGpiosActiveLow(\"1\", \"12\", \"33\"))\n\t// assert\n\tassert.Len(t, a.digitalPinsCfg.pinOptions, 3)\n}\n\nfunc TestWithDigitalPinDebug(t *testing.T) {\n\t// arrange\n\tcfg := &digitalPinsConfiguration{debug: false}\n\t// act\n\tWithDigitalPinDebug().apply(cfg)\n\t// assert\n\tassert.True(t, cfg.debug)\n}\n\nfunc TestDigitalPinsWithDigitalPinInitializer(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tpinNo           = \"1\"\n\t\ttranslatedPinNo = \"12\"\n\t)\n\ta := NewDigitalPinsAdaptor(system.NewAccesser(), testDigitalPinTranslator)\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\tpin, err := a.DigitalPin(pinNo)\n\trequire.NoError(t, err)\n\trequire.Equal(t, 1, dpa.Exported(\"\", translatedPinNo)) // original initializer called on DigitalPin()\n\trequire.NoError(t, a.digitalPinsCfg.initialize(pin))\n\trequire.Equal(t, 2, dpa.Exported(\"\", translatedPinNo))\n\tvar called bool\n\tanotherInitializer := func(pin gobot.DigitalPinner) error {\n\t\tcalled = true\n\t\treturn nil\n\t}\n\tWithDigitalPinInitializer(anotherInitializer).apply(a.digitalPinsCfg)\n\t// act\n\trequire.NoError(t, a.digitalPinsCfg.initialize(pin))\n\t// assert\n\tassert.Equal(t, 2, dpa.Exported(\"\", translatedPinNo))\n\tassert.True(t, called)\n}\n\nfunc TestDigitalPinsWithSysfsAccess(t *testing.T) {\n\t// arrange\n\ta := NewDigitalPinsAdaptor(system.NewAccesser(), nil, WithGpioSysfsAccess())\n\t// assert\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalPinsWithCdevAccess(t *testing.T) {\n\t// arrange\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\tsys.UseMockFilesystem([]string{\"/dev/gpiochip0\"})\n\ta := NewDigitalPinsAdaptor(sys, nil, WithGpioCdevAccess())\n\t// assert\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n}\n\nfunc TestDigitalReadWithGpiosActiveLow(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio25/value\",\n\t\t\"/sys/class/gpio/gpio25/direction\",\n\t\t\"/sys/class/gpio/gpio25/active_low\",\n\t\t\"/sys/class/gpio/gpio26/value\",\n\t\t\"/sys/class/gpio/gpio26/direction\",\n\t}\n\ta, fs := initTestDigitalPinsAdaptorWithMockedFilesystem(mockedPaths)\n\t// arrange files for for pin 14\n\tfs.Files[\"/sys/class/gpio/gpio25/value\"].Contents = \"1\"\n\tfs.Files[\"/sys/class/gpio/gpio25/active_low\"].Contents = \"5\"\n\t// arrange value file and config for pin 15\n\tfs.Files[\"/sys/class/gpio/gpio26/value\"].Contents = \"0\"\n\tWithGpiosActiveLow(\"14\").apply(a.digitalPinsCfg)\n\trequire.NoError(t, a.Connect())\n\t// creates a new pin without inverted logic\n\tif _, err := a.DigitalRead(\"15\"); err != nil {\n\t\tpanic(err)\n\t}\n\t// assert for untouched content of pin 14\n\tassert.Equal(t, \"5\", fs.Files[\"/sys/class/gpio/gpio25/active_low\"].Contents)\n\t// arrange direction file and config for pin 15\n\tfs.Add(\"/sys/class/gpio/gpio26/active_low\")\n\tfs.Files[\"/sys/class/gpio/gpio26/active_low\"].Contents = \"6\"\n\tWithGpiosActiveLow(\"15\").apply(a.digitalPinsCfg)\n\trequire.NoError(t, a.Finalize())\n\trequire.NoError(t, a.Connect())\n\t// act\n\tgot1, err1 := a.DigitalRead(\"14\") // for a new pin\n\tgot2, err2 := a.DigitalRead(\"15\") // for an existing pin (calls ApplyOptions())\n\t// assert\n\trequire.NoError(t, err1)\n\trequire.NoError(t, err2)\n\tassert.Equal(t, 1, got1) // there is no mechanism to negate mocked values\n\tassert.Equal(t, 0, got2)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio25/active_low\"].Contents)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio26/active_low\"].Contents)\n}\n\nfunc TestDigitalWriteWithOptions(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio18/value\",\n\t\t\"/sys/class/gpio/gpio18/direction\",\n\t}\n\ta, fs := initTestDigitalPinsAdaptorWithMockedFilesystem(mockedPaths)\n\n\t// assert write correct value without error and just ignore unsupported options\n\tWithGpiosPullUp(\"7\").apply(a.digitalPinsCfg)\n\tWithGpiosOpenDrain(\"7\").apply(a.digitalPinsCfg)\n\tWithGpioEventOnFallingEdge(\"7\", gpioTestEventHandler).apply(a.digitalPinsCfg)\n\tWithGpioPollForEdgeDetection(\"7\", 0, nil).apply(a.digitalPinsCfg)\n\trequire.NoError(t, a.Connect())\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio18/value\"].Contents)\n\n\t// assert second write to same pin without error and just ignore unsupported options\n\tWithGpiosPullDown(\"7\").apply(a.digitalPinsCfg)\n\tWithGpiosOpenSource(\"7\").apply(a.digitalPinsCfg)\n\tWithGpioDebounce(\"7\", 2*time.Second).apply(a.digitalPinsCfg)\n\tWithGpioEventOnRisingEdge(\"7\", gpioTestEventHandler).apply(a.digitalPinsCfg)\n\trequire.NoError(t, a.Finalize())\n\trequire.NoError(t, a.Connect())\n\terr = a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\n\t// assert third write to same pin without error\n\tWithGpioEventOnBothEdges(\"7\", gpioTestEventHandler).apply(a.digitalPinsCfg)\n\trequire.NoError(t, a.Finalize())\n\trequire.NoError(t, a.Connect())\n\terr = a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\n\t// assert error on bad id\n\trequire.ErrorContains(t, a.DigitalWrite(\"notexist\", 1), \"not a valid pin\")\n\n\t// assert error bubbling\n\tfs.WithWriteError = true\n\terr = a.DigitalWrite(\"7\", 0)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestDigitalWriteWithGpiosActiveLow(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio19/value\",\n\t\t\"/sys/class/gpio/gpio19/direction\",\n\t\t\"/sys/class/gpio/gpio19/active_low\",\n\t}\n\ta, fs := initTestDigitalPinsAdaptorWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/gpio/gpio19/active_low\"].Contents = \"5\"\n\tWithGpiosActiveLow(\"8\").apply(a.digitalPinsCfg)\n\trequire.NoError(t, a.Connect())\n\t// act\n\terr := a.DigitalWrite(\"8\", 2)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"2\", fs.Files[\"/sys/class/gpio/gpio19/value\"].Contents)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio19/active_low\"].Contents)\n}\n\nfunc gpioTestEventHandler(o int, t time.Duration, et string, sn uint32, lsn uint32) {\n\t// the handler should never execute, because used in outputs and not supported by sysfs\n\tpanic(fmt.Sprintf(\"event handler was called (%d, %d) unexpected for line %d with '%s' at %s!\", sn, lsn, o, t, et))\n}\n"
  },
  {
    "path": "platforms/adaptors/digitalpintranslator.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\ntype CdevPin struct {\n\tChip uint8\n\tLine uint8\n}\n\ntype DigitalPinDefinition struct {\n\tSysfs int\n\tCdev  CdevPin\n}\n\ntype DigitalPinDefinitions map[string]DigitalPinDefinition\n\ntype DigitalPinTranslator struct {\n\tsys            *system.Accesser\n\tpinDefinitions DigitalPinDefinitions\n}\n\n// NewDigitalPinTranslator creates a new instance of a translator for digital GPIO pins, suitable for the most cases.\nfunc NewDigitalPinTranslator(sys *system.Accesser, pinDefinitions DigitalPinDefinitions) *DigitalPinTranslator {\n\treturn &DigitalPinTranslator{sys: sys, pinDefinitions: pinDefinitions}\n}\n\n// Translate returns the chip and the line or for legacy sysfs usage the pin number from the given id.\nfunc (pt *DigitalPinTranslator) Translate(id string) (string, int, error) {\n\tpindef, ok := pt.pinDefinitions[id]\n\tif !ok {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a digital pin\", id)\n\t}\n\tif pt.sys.HasDigitalPinSysfsAccess() {\n\t\treturn \"\", pindef.Sysfs, nil\n\t}\n\tchip := fmt.Sprintf(\"gpiochip%d\", pindef.Cdev.Chip)\n\tline := int(pindef.Cdev.Line)\n\treturn chip, line, nil\n}\n"
  },
  {
    "path": "platforms/adaptors/digitalpintranslator_test.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestNewDigitalPinTranslator(t *testing.T) {\n\t// arrange\n\tsys := &system.Accesser{}\n\tpinDef := DigitalPinDefinitions{}\n\t// act\n\tpt := NewDigitalPinTranslator(sys, pinDef)\n\t// assert\n\tassert.IsType(t, &DigitalPinTranslator{}, pt)\n\tassert.Equal(t, sys, pt.sys)\n\tassert.Equal(t, pinDef, pt.pinDefinitions)\n}\n\nfunc TestDigitalPinTranslatorTranslate(t *testing.T) {\n\tpinDefinitions := DigitalPinDefinitions{\n\t\t\"7\":  {Sysfs: 17, Cdev: CdevPin{Chip: 0, Line: 17}},\n\t\t\"22\": {Sysfs: 171, Cdev: CdevPin{Chip: 5, Line: 19}},\n\t\t\"5\":  {Sysfs: 253, Cdev: CdevPin{Chip: 8, Line: 5}},\n\t}\n\ttests := map[string]struct {\n\t\taccess   system.AccesserOptionApplier\n\t\tpin      string\n\t\twantChip string\n\t\twantLine int\n\t\twantErr  error\n\t}{\n\t\t\"cdev_ok_7\": {\n\t\t\tpin:      \"7\",\n\t\t\twantChip: \"gpiochip0\",\n\t\t\twantLine: 17,\n\t\t},\n\t\t\"cdev_ok_22\": {\n\t\t\tpin:      \"22\",\n\t\t\twantChip: \"gpiochip5\",\n\t\t\twantLine: 19,\n\t\t},\n\t\t\"cdev_ok_5\": {\n\t\t\tpin:      \"5\",\n\t\t\twantChip: \"gpiochip8\",\n\t\t\twantLine: 5,\n\t\t},\n\t\t\"sysfs_ok_7\": {\n\t\t\taccess:   system.WithDigitalPinSysfsAccess(),\n\t\t\tpin:      \"7\",\n\t\t\twantChip: \"\",\n\t\t\twantLine: 17,\n\t\t},\n\t\t\"sysfs_ok_22\": {\n\t\t\taccess:   system.WithDigitalPinSysfsAccess(),\n\t\t\tpin:      \"22\",\n\t\t\twantChip: \"\",\n\t\t\twantLine: 171,\n\t\t},\n\t\t\"sysfs_ok_5\": {\n\t\t\taccess:   system.WithDigitalPinSysfsAccess(),\n\t\t\tpin:      \"5\",\n\t\t\twantChip: \"\",\n\t\t\twantLine: 253,\n\t\t},\n\t\t\"unknown_pin\": {\n\t\t\tpin:      \"99\",\n\t\t\twantChip: \"\",\n\t\t\twantLine: -1,\n\t\t\twantErr:  fmt.Errorf(\"'99' is not a valid id for a digital pin\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tsys := system.NewAccesser()\n\t\t\t// arrange for cdev needed\n\t\t\tsys.UseMockFilesystem([]string{\"/dev/gpiochip\"})\n\t\t\tsys.AddDigitalPinSupport(tc.access)\n\t\t\tpt := NewDigitalPinTranslator(sys, pinDefinitions)\n\t\t\t// act\n\t\t\tchip, line, err := pt.Translate(tc.pin)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantChip, chip)\n\t\t\tassert.Equal(t, tc.wantLine, line)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/adaptors/i2cbusadaptor.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\ntype i2cBusNumberValidator func(busNumber int) error\n\n// i2cBusConfiguration contains all changeable attributes of the adaptor.\ntype i2cBusConfiguration struct {\n\tdebug bool\n}\n\n// I2cBusAdaptor is a adaptor for i2c bus, normally used for composition in platforms.\ntype I2cBusAdaptor struct {\n\tsys              *system.Accesser\n\ti2cBusCfg        *i2cBusConfiguration\n\tvalidateNumber   i2cBusNumberValidator\n\tdefaultBusNumber int\n\tmutex            sync.Mutex\n\tbuses            map[int]gobot.I2cSystemDevicer\n}\n\n// NewI2cBusAdaptor provides the access to i2c buses of the board. The validator is used to check the bus number,\n// which is given by user, to the abilities of the board.\n//\n// Options:\n//\n//\t\"WithI2cDebug\"\nfunc NewI2cBusAdaptor(\n\tsys *system.Accesser,\n\tv i2cBusNumberValidator,\n\tdefaultBusNr int,\n\topts ...I2CBusOptionApplier,\n) *I2cBusAdaptor {\n\ta := I2cBusAdaptor{\n\t\tsys:              sys,\n\t\ti2cBusCfg:        &i2cBusConfiguration{},\n\t\tvalidateNumber:   v,\n\t\tdefaultBusNumber: defaultBusNr,\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(a.i2cBusCfg)\n\t}\n\n\tsys.AddI2CSupport()\n\n\treturn &a\n}\n\n// WithI2cDebug can be used to switch on debugging for I2C implementation.\nfunc WithI2cDebug() i2cBusDebugOption {\n\treturn i2cBusDebugOption(true)\n}\n\n// Connect prepares the connection to i2c buses.\nfunc (a *I2cBusAdaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.buses != nil {\n\t\treturn fmt.Errorf(\"I2C bus adaptor already connected, please call Finalize() for re-connect\")\n\t}\n\n\ta.buses = make(map[int]gobot.I2cSystemDevicer)\n\ta.debuglnf(\"connect the I2C bus adaptor done\")\n\n\treturn nil\n}\n\n// Finalize closes all i2c buses.\nfunc (a *I2cBusAdaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.debuglnf(\"finalize the I2C bus adaptor for %d buses...\", len(a.buses))\n\n\tvar err error\n\tfor busNum, bus := range a.buses {\n\t\tif bus != nil {\n\t\t\te := bus.Close()\n\t\t\tif e != nil {\n\t\t\t\terr = multierror.Append(err, e)\n\t\t\t}\n\t\t\ta.debuglnf(\"I2C bus %d closed with error: %v\", busNum, e)\n\t\t}\n\t}\n\ta.buses = nil\n\ta.debuglnf(\"finalize the I2C bus adaptor done with error: %v\", err)\n\n\treturn err\n}\n\n// GetI2cConnection returns a connection to a device on a specified i2c bus\nfunc (a *I2cBusAdaptor) GetI2cConnection(address int, busNum int) (i2c.Connection, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.buses == nil {\n\t\treturn nil, fmt.Errorf(\"not connected\")\n\t}\n\n\tbus := a.buses[busNum]\n\tif bus == nil {\n\t\terr := a.validateNumber(busNum)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tbus, err = a.sys.NewI2cDevice(fmt.Sprintf(\"/dev/i2c-%d\", busNum))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ta.buses[busNum] = bus\n\t}\n\treturn i2c.NewConnection(bus, address), nil\n}\n\n// DefaultI2cBus returns the default i2c bus number for this platform.\nfunc (a *I2cBusAdaptor) DefaultI2cBus() int {\n\treturn a.defaultBusNumber\n}\n\nfunc (a *I2cBusAdaptor) debuglnf(format string, p ...interface{}) {\n\tgobot.Debuglnf(a.i2cBusCfg.debug, format, p...)\n}\n"
  },
  {
    "path": "platforms/adaptors/i2cbusadaptor_test.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar _ i2c.Connector = (*I2cBusAdaptor)(nil)\n\nconst i2cBus1 = \"/dev/i2c-1\"\n\nfunc initTestI2cAdaptorWithMockedFilesystem(mockPaths []string) (*I2cBusAdaptor, *system.MockFilesystem) {\n\tvalidator := func(busNr int) error {\n\t\tif busNr > 1 {\n\t\t\treturn fmt.Errorf(\"%d not valid\", busNr)\n\t\t}\n\t\treturn nil\n\t}\n\ta := NewI2cBusAdaptor(system.NewAccesser(), validator, 1)\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc TestI2cWorkflow(t *testing.T) {\n\ta, _ := initTestI2cAdaptorWithMockedFilesystem([]string{i2cBus1})\n\tassert.Empty(t, a.buses)\n\n\tcon, err := a.GetI2cConnection(0xff, 1)\n\trequire.NoError(t, err)\n\tassert.Len(t, a.buses, 1)\n\n\t_, err = con.Write([]byte{0x00, 0x01})\n\trequire.NoError(t, err)\n\n\tdata := []byte{42, 42}\n\t_, err = con.Read(data)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte{0x00, 0x01}, data)\n\n\trequire.NoError(t, a.Finalize())\n\tassert.Empty(t, a.buses)\n}\n\nfunc TestI2cGetI2cConnection(t *testing.T) {\n\t// arrange\n\ta, _ := initTestI2cAdaptorWithMockedFilesystem([]string{i2cBus1})\n\t// assert working connection\n\tc1, e1 := a.GetI2cConnection(0xff, 1)\n\trequire.NoError(t, e1)\n\tassert.NotNil(t, c1)\n\tassert.Len(t, a.buses, 1)\n\t// assert invalid bus gets error\n\tc2, e2 := a.GetI2cConnection(0x01, 99)\n\trequire.ErrorContains(t, e2, \"99 not valid\")\n\tassert.Nil(t, c2)\n\tassert.Len(t, a.buses, 1)\n\t// assert unconnected gets error\n\trequire.NoError(t, a.Finalize())\n\tc3, e3 := a.GetI2cConnection(0x01, 99)\n\trequire.ErrorContains(t, e3, \"not connected\")\n\tassert.Nil(t, c3)\n\tassert.Empty(t, a.buses)\n}\n\nfunc TestI2cFinalize(t *testing.T) {\n\t// arrange\n\ta, fs := initTestI2cAdaptorWithMockedFilesystem([]string{i2cBus1})\n\t// assert that finalize before connect is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange\n\trequire.NoError(t, a.Connect())\n\t_, _ = a.GetI2cConnection(0xaf, 1)\n\tassert.Len(t, a.buses, 1)\n\t// assert that Finalize after GetI2cConnection is working and clean up\n\trequire.NoError(t, a.Finalize())\n\tassert.Empty(t, a.buses)\n\t// assert that finalize after finalize is working\n\trequire.NoError(t, a.Finalize())\n\t// assert that close error is recognized\n\trequire.NoError(t, a.Connect())\n\tcon, _ := a.GetI2cConnection(0xbf, 1)\n\tassert.Len(t, a.buses, 1)\n\t_, _ = con.Write([]byte{0xbf})\n\tfs.WithCloseError = true\n\terr := a.Finalize()\n\trequire.ErrorContains(t, err, \"close error\")\n}\n\nfunc TestI2cReConnect(t *testing.T) {\n\t// arrange\n\ta, _ := initTestI2cAdaptorWithMockedFilesystem([]string{i2cBus1})\n\trequire.NoError(t, a.Finalize())\n\t// act\n\trequire.NoError(t, a.Connect())\n\t// assert\n\tassert.NotNil(t, a.buses)\n\tassert.Empty(t, a.buses)\n}\n\nfunc TestI2cGetDefaultBus(t *testing.T) {\n\ta := NewI2cBusAdaptor(system.NewAccesser(), nil, 2)\n\tassert.Equal(t, 2, a.DefaultI2cBus())\n}\n"
  },
  {
    "path": "platforms/adaptors/i2cbusadaptoroptions.go",
    "content": "package adaptors\n\n// I2CBusOptionApplier is the interface for I2C bus adaptors options. This provides the possibility for change the\n// platform behavior by the user when creating the platform, e.g. by \"NewAdaptor()\".\n// The interface needs to be implemented by each configurable option type.\ntype I2CBusOptionApplier interface {\n\tapply(cfg *i2cBusConfiguration)\n}\n\n// i2cBusDebugOption is the type to switch on I2C related debug messages.\ntype i2cBusDebugOption bool\n\nfunc (o i2cBusDebugOption) String() string {\n\treturn \"switch on debugging for I2C option\"\n}\n\nfunc (o i2cBusDebugOption) apply(cfg *i2cBusConfiguration) {\n\tcfg.debug = bool(o)\n}\n"
  },
  {
    "path": "platforms/adaptors/i2cbusadaptoroptions_test.go",
    "content": "package adaptors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestWithI2cDebug(t *testing.T) {\n\t// This is a general test, that options are applied in constructor. Further tests for options\n\t// can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange & act\n\ta := NewI2cBusAdaptor(system.NewAccesser(), nil, 0, WithI2cDebug())\n\t// assert\n\tassert.True(t, a.i2cBusCfg.debug)\n}\n"
  },
  {
    "path": "platforms/adaptors/onewirebusadaptor.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/onewire\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// oneWireBusConfiguration contains all changeable attributes of the adaptor.\ntype oneWireBusConfiguration struct {\n\tdebug bool\n}\n\n// OneWireBusAdaptor is a adaptor for the 1-wire bus, normally used for composition in platforms.\n// note: currently only one controller is supported by most platforms, but it would be possible to activate more,\n// see https://forums.raspberrypi.com/viewtopic.php?t=65137\n//\n// Options:\n//\n//\t\"WithOneWireDebug\"\ntype OneWireBusAdaptor struct {\n\tsys           *system.Accesser\n\toneWireBusCfg *oneWireBusConfiguration\n\tmutex         *sync.Mutex\n\tconnections   map[string]onewire.Connection\n}\n\n// NewOneWireBusAdaptor provides the access to 1-wire devices of the board.\nfunc NewOneWireBusAdaptor(sys *system.Accesser, opts ...OneWireBusOptionApplier) *OneWireBusAdaptor {\n\ta := OneWireBusAdaptor{\n\t\tsys:           sys,\n\t\toneWireBusCfg: &oneWireBusConfiguration{},\n\t\tmutex:         &sync.Mutex{},\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(a.oneWireBusCfg)\n\t}\n\n\tsys.AddOneWireSupport()\n\n\treturn &a\n}\n\n// WithOneWireDebug can be used to switch on debugging for 1-wire implementation.\nfunc WithOneWireDebug() oneWireBusDebugOption {\n\treturn oneWireBusDebugOption(true)\n}\n\n// Connect prepares the connection to 1-wire devices.\nfunc (a *OneWireBusAdaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.connections != nil {\n\t\treturn fmt.Errorf(\"1-wire bus adaptor already connected, please call Finalize() for re-connect\")\n\t}\n\n\ta.connections = make(map[string]onewire.Connection)\n\ta.debuglnf(\"connect the 1-wire bus adaptor done\")\n\n\treturn nil\n}\n\n// Finalize closes all 1-wire connections.\nfunc (a *OneWireBusAdaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.debuglnf(\"finalize the 1-wire bus adaptor for %d buses...\", len(a.connections))\n\n\tvar err error\n\tfor id, con := range a.connections {\n\t\tif con != nil {\n\t\t\te := con.Close()\n\t\t\tif e != nil {\n\t\t\t\terr = multierror.Append(err, e)\n\t\t\t}\n\t\t\ta.debuglnf(\"1-wire bus %s closed with error: %v\", id, e)\n\t\t}\n\t}\n\ta.connections = nil\n\ta.debuglnf(\"finalize the 1-wire bus adaptor done with error: %v\", err)\n\n\treturn err\n}\n\n// GetOneWireConnection returns a 1-wire connection to a device with the given family code and serial number.\nfunc (a *OneWireBusAdaptor) GetOneWireConnection(familyCode byte, serialNumber uint64) (onewire.Connection, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.connections == nil {\n\t\treturn nil, fmt.Errorf(\"not connected\")\n\t}\n\n\tid := fmt.Sprintf(\"%d_%d\", familyCode, serialNumber)\n\n\tcon := a.connections[id]\n\tif con == nil {\n\t\tvar err error\n\t\tdev, err := a.sys.NewOneWireDevice(familyCode, serialNumber)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcon = onewire.NewConnection(dev)\n\t\ta.connections[id] = con\n\t}\n\n\treturn con, nil\n}\n\nfunc (a *OneWireBusAdaptor) debuglnf(format string, p ...interface{}) {\n\tgobot.Debuglnf(a.oneWireBusCfg.debug, format, p...)\n}\n"
  },
  {
    "path": "platforms/adaptors/onewirebusadaptor_test.go",
    "content": "package adaptors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc initTestOneWireAdaptor() *OneWireBusAdaptor {\n\ta := NewOneWireBusAdaptor(system.NewAccesser())\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewOneWireBusAdaptor(t *testing.T) {\n\t// arrange\n\tsys := system.NewAccesser()\n\t// act\n\ta := NewOneWireBusAdaptor(sys)\n\t// assert\n\tassert.IsType(t, &OneWireBusAdaptor{}, a)\n\tassert.NotNil(t, a.mutex)\n\tassert.Nil(t, a.connections)\n}\n\nfunc TestOneWireGetOneWireConnection(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tfamilyCode   = 28\n\t\tserialNumber = 123456789\n\t)\n\ta := initTestOneWireAdaptor()\n\t// assert working connection\n\tc1, e1 := a.GetOneWireConnection(familyCode, serialNumber)\n\trequire.NoError(t, e1)\n\tassert.NotNil(t, c1)\n\tassert.Len(t, a.connections, 1)\n\t// assert unconnected gets error\n\trequire.NoError(t, a.Finalize())\n\tc2, e2 := a.GetOneWireConnection(familyCode, serialNumber+1)\n\trequire.ErrorContains(t, e2, \"not connected\")\n\tassert.Nil(t, c2)\n\tassert.Empty(t, a.connections)\n}\n\nfunc TestOneWireFinalize(t *testing.T) {\n\t// arrange\n\ta := initTestOneWireAdaptor()\n\t// assert that finalize before connect is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange\n\trequire.NoError(t, a.Connect())\n\t_, _ = a.GetOneWireConnection(28, 54321)\n\tassert.Len(t, a.connections, 1)\n\t// assert that Finalize after GetOneWireConnection is working and clean up\n\trequire.NoError(t, a.Finalize())\n\tassert.Empty(t, a.connections)\n\t// assert that finalize after finalize is working\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestOneWireReConnect(t *testing.T) {\n\t// arrange\n\ta := initTestOneWireAdaptor()\n\trequire.NoError(t, a.Finalize())\n\t// act\n\trequire.NoError(t, a.Connect())\n\t// assert\n\tassert.NotNil(t, a.connections)\n\tassert.Empty(t, a.connections)\n}\n"
  },
  {
    "path": "platforms/adaptors/onewirebusadaptoroptions.go",
    "content": "package adaptors\n\n// OneWireBusOptionApplier is the interface for 1-wire bus adaptors options. This provides the possibility for change\n// the platform behavior by the user when creating the platform, e.g. by \"NewAdaptor()\".\n// The interface needs to be implemented by each configurable option type.\ntype OneWireBusOptionApplier interface {\n\tapply(cfg *oneWireBusConfiguration)\n}\n\n// oneWireBusDebugOption is the type to switch on 1-wire related debug messages.\ntype oneWireBusDebugOption bool\n\nfunc (o oneWireBusDebugOption) String() string {\n\treturn \"switch on debugging for 1-wire option\"\n}\n\nfunc (o oneWireBusDebugOption) apply(cfg *oneWireBusConfiguration) {\n\tcfg.debug = bool(o)\n}\n"
  },
  {
    "path": "platforms/adaptors/onewirebusadaptoroptions_test.go",
    "content": "package adaptors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestWithOneWireDebug(t *testing.T) {\n\t// This is a general test, that options are applied in constructor. Further tests for options\n\t// can also be done by call of \"WithOption(val).apply(cfg)\".\n\t// arrange & act\n\ta := NewOneWireBusAdaptor(system.NewAccesser(), WithOneWireDebug())\n\t// assert\n\tassert.True(t, a.oneWireBusCfg.debug)\n}\n"
  },
  {
    "path": "platforms/adaptors/piblasterpwm_pin.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpiBlasterPath        = \"/dev/pi-blaster\"\n\tpiBlasterMinDutyNano = 10000 // 10 us\n)\n\n// piBlasterPWMPin is the Raspberry Pi implementation of the PWMPinner interface.\n// It uses Pi Blaster.\ntype piBlasterPWMPin struct {\n\tsys    *system.Accesser\n\tpin    string\n\tdc     uint32\n\tperiod uint32\n}\n\n// newPiBlasterPWMPin returns a new PWM pin for pi-blaster access.\nfunc newPiBlasterPWMPin(sys *system.Accesser, pinNo int) *piBlasterPWMPin {\n\treturn &piBlasterPWMPin{\n\t\tsys: sys,\n\t\tpin: strconv.Itoa(pinNo),\n\t}\n}\n\n// Export exports the pin for use by the Raspberry Pi\nfunc (p *piBlasterPWMPin) Export() error {\n\treturn nil\n}\n\n// Unexport releases the pin from the operating system\nfunc (p *piBlasterPWMPin) Unexport() error {\n\treturn p.writeValue(fmt.Sprintf(\"release %v\\n\", p.pin))\n}\n\n// Enabled returns always true for \"enabled\"\nfunc (p *piBlasterPWMPin) Enabled() (bool, error) {\n\treturn true, nil\n}\n\n// SetEnabled do nothing for PiBlaster\nfunc (p *piBlasterPWMPin) SetEnabled(e bool) error {\n\treturn nil\n}\n\n// Polarity returns always true for \"normal\"\nfunc (p *piBlasterPWMPin) Polarity() (bool, error) {\n\treturn true, nil\n}\n\n// SetPolarity does not do anything when using PiBlaster\nfunc (p *piBlasterPWMPin) SetPolarity(bool) error {\n\treturn nil\n}\n\n// Period returns the cached PWM period for pin\nfunc (p *piBlasterPWMPin) Period() (uint32, error) {\n\treturn p.period, nil\n}\n\n// SetPeriod uses PiBlaster setting and cannot be changed. We allow setting once here to define a base period for\n// ServoWrite(). see https://github.com/sarfata/pi-blaster#how-to-adjust-the-frequency-and-the-resolution-of-the-pwm\nfunc (p *piBlasterPWMPin) SetPeriod(period uint32) error {\n\tif p.period != 0 {\n\t\treturn fmt.Errorf(\"the period of PWM pins needs to be set to '%d' in pi-blaster source code\", period)\n\t}\n\tp.period = period\n\treturn nil\n}\n\n// DutyCycle returns the duty cycle for the pin\nfunc (p *piBlasterPWMPin) DutyCycle() (uint32, error) {\n\treturn p.dc, nil\n}\n\n// SetDutyCycle writes the duty cycle to the pin\nfunc (p *piBlasterPWMPin) SetDutyCycle(dutyNanos uint32) error {\n\tif p.period == 0 {\n\t\treturn fmt.Errorf(\"pi-blaster PWM pin period not set while try to set duty cycle to '%d'\", dutyNanos)\n\t}\n\n\tif dutyNanos > p.period {\n\t\treturn fmt.Errorf(\"the duty cycle (%d) exceeds period (%d) for pi-blaster\", dutyNanos, p.period)\n\t}\n\n\t// never go below minimum allowed duty for pi blaster unless the duty equals to 0\n\tif dutyNanos < piBlasterMinDutyNano && dutyNanos != 0 {\n\t\tdutyNanos = piBlasterMinDutyNano\n\t\tfmt.Printf(\"duty cycle value limited to '%d' ns for pi-blaster\", dutyNanos)\n\t}\n\n\tduty := float64(dutyNanos) / float64(p.period)\n\tif err := p.writeValue(fmt.Sprintf(\"%v=%v\\n\", p.pin, duty)); err != nil {\n\t\treturn err\n\t}\n\n\tp.dc = dutyNanos\n\treturn nil\n}\n\nfunc (p *piBlasterPWMPin) writeValue(data string) error {\n\tfi, err := p.sys.OpenFile(piBlasterPath, os.O_WRONLY|os.O_APPEND, 0o644)\n\tdefer fi.Close() //nolint:staticcheck // for historical reasons\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = fi.WriteString(data)\n\treturn err\n}\n"
  },
  {
    "path": "platforms/adaptors/piblasterpwm_pin_test.go",
    "content": "package adaptors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nvar _ gobot.PWMPinner = (*piBlasterPWMPin)(nil)\n\nfunc TestPiBlasterPWMPin(t *testing.T) {\n\t// arrange\n\tconst path = \"/dev/pi-blaster\"\n\ta := system.NewAccesser()\n\ta.UseMockFilesystem([]string{path})\n\tpin := newPiBlasterPWMPin(a, 1)\n\t// act & assert: activate pin for usage\n\trequire.NoError(t, pin.Export())\n\trequire.NoError(t, pin.SetEnabled(true))\n\t// act & assert: get and set polarity\n\tval, err := pin.Polarity()\n\trequire.NoError(t, err)\n\tassert.True(t, val)\n\trequire.NoError(t, pin.SetPolarity(false))\n\tpolarity, err := pin.Polarity()\n\tassert.True(t, polarity)\n\trequire.NoError(t, err)\n\t// act & assert: get and set period\n\tperiod, err := pin.Period()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(0), period)\n\trequire.NoError(t, pin.SetPeriod(20000000))\n\tperiod, err = pin.Period()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(20000000), period)\n\terr = pin.SetPeriod(10000000)\n\trequire.EqualError(t, err, \"the period of PWM pins needs to be set to '10000000' in pi-blaster source code\")\n\t// act & assert: cleanup\n\trequire.NoError(t, pin.Unexport())\n}\n\nfunc TestPiBlasterPWMPin_DutyCycle(t *testing.T) {\n\t// arrange\n\tconst path = \"/dev/pi-blaster\"\n\ta := system.NewAccesser()\n\ta.UseMockFilesystem([]string{path})\n\tpin := newPiBlasterPWMPin(a, 1)\n\t// act & assert: activate pin for usage\n\trequire.NoError(t, pin.Export())\n\trequire.NoError(t, pin.SetEnabled(true))\n\t// act & assert zero\n\tdc, err := pin.DutyCycle()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(0), dc)\n\t// act & assert error without period set, the value remains zero\n\terr = pin.SetDutyCycle(10000)\n\trequire.EqualError(t, err, \"pi-blaster PWM pin period not set while try to set duty cycle to '10000'\")\n\tdc, err = pin.DutyCycle()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(0), dc)\n\t// arrange, act & assert a value\n\tpin.period = 20000000\n\trequire.NoError(t, pin.SetDutyCycle(10000))\n\tdc, err = pin.DutyCycle()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(10000), dc)\n\t// act & assert error on over limit, the value remains\n\terr = pin.SetDutyCycle(20000001)\n\trequire.EqualError(t, err, \"the duty cycle (20000001) exceeds period (20000000) for pi-blaster\")\n\tdc, err = pin.DutyCycle()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(10000), dc)\n\t// act & assert: cleanup\n\trequire.NoError(t, pin.Unexport())\n}\n"
  },
  {
    "path": "platforms/adaptors/pwmpinsadaptor.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"sync\"\n\t\"time\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// note for period in nano seconds:\n// 100000000ns = 100ms = 10Hz, 10000000ns = 10ms = 100Hz,  1000000ns = 1ms = 1kHz,\n// 100000ns = 100us = 10kHz, 10000ns = 10us = 100kHz, 1000ns = 1us = 1MHz,\n// 100ns = 10MHz, 10ns = 100MHz, 1ns = 1GHz\nconst pwmPeriodDefault = 10000000 // 10 ms = 100 Hz\n\n// 50Hz = 0.02 sec = 20 ms\nconst fiftyHzNanos = 20 * 1000 * 1000\n\ntype (\n\tpwmPinTranslator  func(pin string) (path string, channel int, err error)\n\tpwmPinInitializer func(id string, pin gobot.PWMPinner) error\n)\n\ntype pwmPinServoScale struct {\n\tminDegree, maxDegree float64\n\tminDuty, maxDuty     time.Duration\n}\n\n// pwmPinsConfiguration contains all changeable attributes of the adaptor.\ntype pwmPinsConfiguration struct {\n\tdebug                      bool\n\tinitialize                 pwmPinInitializer\n\tusePiBlasterPin            bool\n\tperiodDefault              uint32\n\tperiodMinimum              uint32\n\tdutyRateMinimum            float64 // is the minimal relation of duty/period (except 0.0)\n\tpolarityNormalIdentifier   string\n\tpolarityInvertedIdentifier string\n\tadjustDutyOnSetPeriod      bool\n\tpinsDefaultPeriod          map[string]uint32           // the key is the pin id\n\tpinsServoScale             map[string]pwmPinServoScale // the key is the pin id\n}\n\n// PWMPinsAdaptor is a adaptor for PWM pins, normally used for composition in platforms.\ntype PWMPinsAdaptor struct {\n\tsys        *system.Accesser\n\ttranslate  pwmPinTranslator\n\tpwmPinsCfg *pwmPinsConfiguration\n\tpins       map[string]gobot.PWMPinner\n\tmutex      sync.Mutex\n}\n\n// NewPWMPinsAdaptor provides the access to PWM pins of the board. It uses sysfs system drivers. The translator is used\n// to adapt the pin header naming, which is given by user, to the internal file name nomenclature. This varies by each\n// platform. If for some reasons the default initializer is not suitable, it can be given by the option\n// \"WithPWMPinInitializer()\".\n//\n// Further options:\n//\n//\t\"WithPWMPinDebug\"\n//\t\"WithPWMDefaultPeriod\"\n//\t\"WithPWMPolarityInvertedIdentifier\"\n//\t\"WithPWMNoDutyCycleAdjustment\"\n//\t\"WithPWMDefaultPeriodForPin\"\n//\t\"WithPWMServoDutyCycleRangeForPin\"\n//\t\"WithPWMServoAngleRangeForPin\"\nfunc NewPWMPinsAdaptor(sys *system.Accesser, t pwmPinTranslator, opts ...PwmPinsOptionApplier) *PWMPinsAdaptor {\n\ta := PWMPinsAdaptor{\n\t\tsys:       sys,\n\t\ttranslate: t,\n\t\tpwmPinsCfg: &pwmPinsConfiguration{\n\t\t\tperiodDefault:              pwmPeriodDefault,\n\t\t\tpinsDefaultPeriod:          make(map[string]uint32),\n\t\t\tpinsServoScale:             make(map[string]pwmPinServoScale),\n\t\t\tpolarityNormalIdentifier:   \"normal\",\n\t\t\tpolarityInvertedIdentifier: \"inversed\",\n\t\t\tadjustDutyOnSetPeriod:      true,\n\t\t},\n\t}\n\ta.pwmPinsCfg.initialize = a.getDefaultInitializer()\n\n\tfor _, o := range opts {\n\t\to.apply(a.pwmPinsCfg)\n\t}\n\n\tsys.AddPWMSupport()\n\n\treturn &a\n}\n\n// WithPWMPinDebug can be used to switch on debugging for PWM-pins implementation.\nfunc WithPWMPinDebug() pwmPinsDebugOption {\n\treturn pwmPinsDebugOption(true)\n}\n\n// WithPWMPinInitializer substitute the default initializer.\nfunc WithPWMPinInitializer(pc pwmPinInitializer) pwmPinsInitializeOption {\n\treturn pwmPinsInitializeOption(pc)\n}\n\n// WithPWMUsePiBlaster substitute the default sysfs-implementation for PWM-pins by the implementation for pi-blaster.\nfunc WithPWMUsePiBlaster() pwmPinsUsePiBlasterPinOption {\n\treturn pwmPinsUsePiBlasterPinOption(true)\n}\n\n// WithPWMDefaultPeriod substitute the default period of 10 ms (100 Hz) for all created pins.\nfunc WithPWMDefaultPeriod(periodNanoSec uint32) pwmPinsPeriodDefaultOption {\n\treturn pwmPinsPeriodDefaultOption(periodNanoSec)\n}\n\n// WithPWMMinimumPeriod substitute the default minimum period limit of 0 nanoseconds.\nfunc WithPWMMinimumPeriod(periodNanoSec uint32) pwmPinsPeriodMinimumOption {\n\treturn pwmPinsPeriodMinimumOption(periodNanoSec)\n}\n\n// WithPWMMinimumDutyRate substitute the default minimum duty rate of 1/period. The given limit only come into effect,\n// if the rate is > 0, because a rate of 0.0 is always allowed.\nfunc WithPWMMinimumDutyRate(dutyRate float64) pwmPinsDutyRateMinimumOption {\n\treturn pwmPinsDutyRateMinimumOption(dutyRate)\n}\n\n// WithPWMPolarityInvertedIdentifier use the given identifier, which will replace the default \"inversed\".\nfunc WithPWMPolarityInvertedIdentifier(identifier string) pwmPinsPolarityInvertedIdentifierOption {\n\treturn pwmPinsPolarityInvertedIdentifierOption(identifier)\n}\n\n// WithPWMNoDutyCycleAdjustment switch off the automatic adjustment of duty cycle on setting the period.\nfunc WithPWMNoDutyCycleAdjustment() pwmPinsAdjustDutyOnSetPeriodOption {\n\treturn pwmPinsAdjustDutyOnSetPeriodOption(false)\n}\n\n// WithPWMDefaultPeriodForPin substitute the default period of 10 ms (100 Hz) for the given pin.\n// This option also overrides a default period given by the WithPWMDefaultPeriod() option.\n// This is often needed for servo applications, where the default period is 50Hz (20.000.000 ns).\nfunc WithPWMDefaultPeriodForPin(pin string, periodNanoSec uint32) pwmPinsDefaultPeriodForPinOption {\n\to := pwmPinsDefaultPeriodForPinOption{id: pin, period: periodNanoSec}\n\treturn o\n}\n\n// WithPWMServoDutyCycleRangeForPin set new values for range of duty cycle for servo calls, which replaces the default\n// 0.5-2.5 ms range. The given duration values will be internally converted to nanoseconds.\nfunc WithPWMServoDutyCycleRangeForPin(pin string, minimum, maximum time.Duration) pwmPinsServoDutyScaleForPinOption {\n\treturn pwmPinsServoDutyScaleForPinOption{id: pin, min: minimum, max: maximum}\n}\n\n// WithPWMServoAngleRangeForPin set new values for range of angle for servo calls, which replaces\n// the default 0.0-180.0° range.\nfunc WithPWMServoAngleRangeForPin(pin string, minimum, maximum float64) pwmPinsServoAngleScaleForPinOption {\n\treturn pwmPinsServoAngleScaleForPinOption{id: pin, minDegree: minimum, maxDegree: maximum}\n}\n\n// Connect prepare new connection to PWM pins.\nfunc (a *PWMPinsAdaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.pins != nil {\n\t\treturn fmt.Errorf(\"PWM pins adaptor already connected, please call Finalize() for re-connect\")\n\t}\n\n\ta.pins = make(map[string]gobot.PWMPinner)\n\n\tif a.pwmPinsCfg.dutyRateMinimum == 0 && a.pwmPinsCfg.periodDefault > 0 {\n\t\ta.pwmPinsCfg.dutyRateMinimum = 1 / float64(a.pwmPinsCfg.periodDefault)\n\t}\n\n\ta.debuglnf(\"connect the PWM pins adaptor done\")\n\n\treturn nil\n}\n\n// Finalize closes connection to PWM pins.\nfunc (a *PWMPinsAdaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.debuglnf(\"finalize the pwm pins adaptor with %d pins...\", len(a.pins))\n\n\tvar err error\n\tfor id, pin := range a.pins {\n\t\tif pin != nil {\n\t\t\tif e := pin.SetEnabled(false); e != nil {\n\t\t\t\ta.debuglnf(\"PWM pin '%s' disabled on finalize with error: %v\", id, e)\n\t\t\t\terr = multierror.Append(err, e)\n\t\t\t}\n\t\t\tif e := pin.Unexport(); e != nil {\n\t\t\t\ta.debuglnf(\"PWM pin '%s' unexport on finalize with error: %v\", id, e)\n\t\t\t\terr = multierror.Append(err, e)\n\t\t\t}\n\t\t}\n\t}\n\ta.pins = nil\n\ta.debuglnf(\"finalize the PWM pins adaptor done with error: %v\", err)\n\n\treturn err\n}\n\n// PwmWrite writes a PWM signal to the specified pin. The given value is between 0 and 255.\nfunc (a *PWMPinsAdaptor) PwmWrite(id string, val byte) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tpin, err := a.pwmPin(id)\n\tif err != nil {\n\t\treturn err\n\t}\n\tperiodNanos, err := pin.Period()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdutyNanos := float64(periodNanos) * gobot.FromScale(float64(val), 0, 255.0)\n\n\tif err := a.validateDutyCycle(id, dutyNanos, float64(periodNanos)); err != nil {\n\t\treturn err\n\t}\n\n\treturn pin.SetDutyCycle(uint32(dutyNanos))\n}\n\n// ServoWrite writes a servo signal to the specified pin. The given angle is between 0 and 180°.\nfunc (a *PWMPinsAdaptor) ServoWrite(id string, angle byte) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tpin, err := a.pwmPin(id)\n\tif err != nil {\n\t\treturn err\n\t}\n\tperiodNanos, err := pin.Period()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif periodNanos != fiftyHzNanos {\n\t\tlog.Printf(\"WARNING: the PWM acts with a period of %d, but should use %d (50Hz) for servos\\n\",\n\t\t\tperiodNanos, fiftyHzNanos)\n\t}\n\n\tscale, ok := a.pwmPinsCfg.pinsServoScale[id]\n\tif !ok {\n\t\treturn fmt.Errorf(\"no scaler found for servo pin '%s'\", id)\n\t}\n\n\tdutyNanos := gobot.ToScale(gobot.FromScale(float64(angle),\n\t\tscale.minDegree, scale.maxDegree),\n\t\tfloat64(scale.minDuty), float64(scale.maxDuty))\n\n\tif err := a.validateDutyCycle(id, dutyNanos, float64(periodNanos)); err != nil {\n\t\treturn err\n\t}\n\n\treturn pin.SetDutyCycle(uint32(dutyNanos))\n}\n\n// SetPeriod adjusts the period of the specified PWM pin immediately.\n// If duty cycle is already set, also this value will be adjusted in the same ratio.\nfunc (a *PWMPinsAdaptor) SetPeriod(id string, period uint32) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tpin, err := a.pwmPin(id)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn setPeriod(pin, period, a.pwmPinsCfg.adjustDutyOnSetPeriod)\n}\n\n// PWMPin initializes the pin for PWM and returns matched pwmPin for specified pin number.\n// It implements the PWMPinnerProvider interface.\nfunc (a *PWMPinsAdaptor) PWMPin(id string) (gobot.PWMPinner, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.pwmPin(id)\n}\n\nfunc (a *PWMPinsAdaptor) getDefaultInitializer() func(string, gobot.PWMPinner) error {\n\treturn func(id string, pin gobot.PWMPinner) error {\n\t\tif err := pin.Export(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Make sure PWM is disabled before change anything (period needs to be >0 for this check)\n\t\tif period, _ := pin.Period(); period > 0 {\n\t\t\tif err := pin.SetEnabled(false); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// looking for a pin specific period\n\t\tdefaultPeriod, ok := a.pwmPinsCfg.pinsDefaultPeriod[id]\n\t\tif !ok {\n\t\t\tdefaultPeriod = a.pwmPinsCfg.periodDefault\n\t\t}\n\n\t\tif err := setPeriod(pin, defaultPeriod, a.pwmPinsCfg.adjustDutyOnSetPeriod); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// ensure servo scaler is present\n\t\t//\n\t\t// usually for the most servos (at 50Hz) for 180° (SG90, AD002)\n\t\t// 0.5 ms =>   0 (1/40 part of period at 50Hz)\n\t\t// 1.5 ms =>  90\n\t\t// 2.5 ms => 180 (1/8 part of period at 50Hz)\n\t\tscale, ok := a.pwmPinsCfg.pinsServoScale[id]\n\t\tif !ok {\n\t\t\tscale = pwmPinServoScale{\n\t\t\t\tminDegree: 0,\n\t\t\t\tmaxDegree: 180,\n\t\t\t}\n\t\t}\n\t\tif scale.minDuty == 0 {\n\t\t\tscale.minDuty = time.Duration(defaultPeriod / 40)\n\t\t}\n\t\tif scale.maxDuty == 0 {\n\t\t\tscale.maxDuty = time.Duration(defaultPeriod / 8)\n\t\t}\n\t\ta.pwmPinsCfg.pinsServoScale[id] = scale\n\n\t\t// period needs to be set >1 before all next statements\n\t\tif err := pin.SetPolarity(true); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn pin.SetEnabled(true)\n\t}\n}\n\nfunc (a *PWMPinsAdaptor) pwmPin(id string) (gobot.PWMPinner, error) {\n\tif a.pins == nil {\n\t\treturn nil, fmt.Errorf(\"not connected\")\n\t}\n\n\tpin := a.pins[id]\n\n\tif pin == nil {\n\t\tpath, channel, err := a.translate(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif a.pwmPinsCfg.usePiBlasterPin {\n\t\t\tpin = newPiBlasterPWMPin(a.sys, channel)\n\t\t} else {\n\t\t\tpin = a.sys.NewPWMPin(path, channel, a.pwmPinsCfg.polarityNormalIdentifier,\n\t\t\t\ta.pwmPinsCfg.polarityInvertedIdentifier)\n\t\t}\n\t\tif err := a.pwmPinsCfg.initialize(id, pin); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ta.pins[id] = pin\n\t}\n\n\treturn pin, nil\n}\n\nfunc (a *PWMPinsAdaptor) validateDutyCycle(id string, dutyNanos, periodNanos float64) error {\n\tif periodNanos == 0 {\n\t\treturn nil\n\t}\n\n\tif dutyNanos > periodNanos {\n\t\treturn fmt.Errorf(\"duty cycle (%d) exceeds period (%d) for PWM pin id '%s'\",\n\t\t\tuint32(dutyNanos), uint32(periodNanos), id)\n\t}\n\n\tif dutyNanos == 0 {\n\t\treturn nil\n\t}\n\n\trate := dutyNanos / periodNanos\n\tif rate < a.pwmPinsCfg.dutyRateMinimum {\n\t\treturn fmt.Errorf(\"duty rate (%.8f) is lower than allowed (%.8f) for PWM pin id '%s'\",\n\t\t\trate, a.pwmPinsCfg.dutyRateMinimum, id)\n\t}\n\treturn nil\n}\n\nfunc (a *PWMPinsAdaptor) debuglnf(format string, p ...interface{}) {\n\tgobot.Debuglnf(a.pwmPinsCfg.debug, format, p...)\n}\n\n// setPeriod adjusts the PWM period of the given pin. If duty cycle is already set and this feature is not suppressed,\n// also this value will be adjusted in the same ratio. The order of writing the values must be observed, otherwise an\n// error occur \"write error: Invalid argument\".\nfunc setPeriod(pin gobot.PWMPinner, period uint32, adjustDuty bool) error {\n\terrorBase := fmt.Sprintf(\"setPeriod(%v, %d) failed\", pin, period)\n\n\tvar oldDuty uint32\n\tvar err error\n\tif adjustDuty {\n\t\tif oldDuty, err = pin.DutyCycle(); err != nil {\n\t\t\treturn fmt.Errorf(\"%s with '%v'\", errorBase, err)\n\t\t}\n\t}\n\n\tif oldDuty == 0 {\n\t\tif err := pin.SetPeriod(period); err != nil {\n\t\t\treturn fmt.Errorf(\"%s with '%v'\", errorBase, err)\n\t\t}\n\t} else {\n\t\t// adjust duty cycle in the same ratio\n\t\toldPeriod, err := pin.Period()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"%s with '%v'\", errorBase, err)\n\t\t}\n\n\t\t//nolint:gosec // TODO: fix later\n\t\tduty := uint32(uint64(oldDuty) * uint64(period) / uint64(oldPeriod))\n\n\t\t// the order depends on value (duty must not be bigger than period in any situation)\n\t\tif duty > oldPeriod {\n\t\t\tif err := pin.SetPeriod(period); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s with '%v'\", errorBase, err)\n\t\t\t}\n\t\t\tif err := pin.SetDutyCycle(duty); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s with '%v'\", errorBase, err)\n\t\t\t}\n\t\t} else {\n\t\t\tif err := pin.SetDutyCycle(duty); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s with '%v'\", errorBase, err)\n\t\t\t}\n\t\t\tif err := pin.SetPeriod(period); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s with '%v'\", errorBase, err)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/adaptors/pwmpinsadaptor_test.go",
    "content": "//nolint:nonamedreturns // ok for tests\npackage adaptors\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmDir             = \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/\" //nolint:gosec // false positive\n\tpwmPwm44Dir        = pwmDir + \"pwm44/\"\n\tpwmPwm47Dir        = pwmDir + \"pwm47/\"\n\tpwmExportPath      = pwmDir + \"export\"\n\tpwmUnexportPath    = pwmDir + \"unexport\"\n\tpwm44EnablePath    = pwmPwm44Dir + \"enable\"\n\tpwm44PeriodPath    = pwmPwm44Dir + \"period\"\n\tpwm44DutyCyclePath = pwmPwm44Dir + \"duty_cycle\"\n\tpwm44PolarityPath  = pwmPwm44Dir + \"polarity\"\n\tpwm47EnablePath    = pwmPwm47Dir + \"enable\"\n\tpwm47PeriodPath    = pwmPwm47Dir + \"period\"\n\tpwm47DutyCyclePath = pwmPwm47Dir + \"duty_cycle\"\n\tpwm47PolarityPath  = pwmPwm47Dir + \"polarity\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwm44EnablePath,\n\tpwm44PeriodPath,\n\tpwm44DutyCyclePath,\n\tpwm44PolarityPath,\n\tpwm47EnablePath,\n\tpwm47PeriodPath,\n\tpwm47DutyCyclePath,\n\tpwm47PolarityPath,\n}\n\n// make sure that this PWMPinsAdaptor fulfills all the required interfaces\nvar (\n\t_ gobot.PWMPinnerProvider = (*PWMPinsAdaptor)(nil)\n\t_ gpio.PwmWriter          = (*PWMPinsAdaptor)(nil)\n\t_ gpio.ServoWriter        = (*PWMPinsAdaptor)(nil)\n)\n\nfunc initTestPWMPinsAdaptorWithMockedFilesystem(mockPaths []string) (*PWMPinsAdaptor, *system.MockFilesystem) {\n\tsys := system.NewAccesser()\n\tfs := sys.UseMockFilesystem(mockPaths)\n\ta := NewPWMPinsAdaptor(sys, testPWMPinTranslator)\n\tfs.Files[pwm44EnablePath].Contents = \"0\"\n\tfs.Files[pwm44PeriodPath].Contents = \"0\"\n\tfs.Files[pwm44DutyCyclePath].Contents = \"0\"\n\tfs.Files[pwm44PolarityPath].Contents = a.pwmPinsCfg.polarityInvertedIdentifier\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc testPWMPinTranslator(id string) (string, int, error) {\n\tchannel, err := strconv.Atoi(id)\n\tif err != nil {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id of a PWM pin\", id)\n\t}\n\tchannel = channel + 11 // just for tests, 33=>pwm0, 36=>pwm3\n\treturn pwmDir, channel, err\n}\n\nfunc TestNewPWMPinsAdaptor(t *testing.T) {\n\t// arrange\n\ttranslate := func(pin string) (chip string, line int, err error) { return }\n\t// act\n\ta := NewPWMPinsAdaptor(system.NewAccesser(), translate)\n\t// assert\n\tassert.Equal(t, uint32(pwmPeriodDefault), a.pwmPinsCfg.periodDefault)\n\tassert.Equal(t, \"normal\", a.pwmPinsCfg.polarityNormalIdentifier)\n\tassert.Equal(t, \"inversed\", a.pwmPinsCfg.polarityInvertedIdentifier)\n\tassert.True(t, a.pwmPinsCfg.adjustDutyOnSetPeriod)\n}\n\nfunc TestPWMPinsConnect(t *testing.T) {\n\ttranslate := func(pin string) (chip string, line int, err error) { return }\n\ta := NewPWMPinsAdaptor(system.NewAccesser(), translate)\n\tassert.Equal(t, (map[string]gobot.PWMPinner)(nil), a.pins)\n\n\terr := a.PwmWrite(\"33\", 1)\n\trequire.ErrorContains(t, err, \"not connected\")\n\n\terr = a.Connect()\n\trequire.NoError(t, err)\n\tassert.NotEqual(t, (map[string]gobot.PWMPinner)(nil), a.pins)\n\tassert.Empty(t, a.pins)\n}\n\nfunc TestPWMPinsFinalize(t *testing.T) {\n\t// arrange\n\tsys := system.NewAccesser()\n\tfs := sys.UseMockFilesystem(pwmMockPaths)\n\ta := NewPWMPinsAdaptor(sys, testPWMPinTranslator)\n\tfs.Files[pwm44PeriodPath].Contents = \"0\"\n\tfs.Files[pwm44DutyCyclePath].Contents = \"0\"\n\t// assert that finalize before connect is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.PwmWrite(\"33\", 1))\n\tassert.Len(t, a.pins, 1)\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Empty(t, a.pins)\n\t// assert that finalize after finalize is working\n\trequire.NoError(t, a.Finalize())\n\t// arrange missing sysfs file\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.PwmWrite(\"33\", 2))\n\tdelete(fs.Files, pwmUnexportPath)\n\terr = a.Finalize()\n\trequire.ErrorContains(t, err, pwmUnexportPath+\": no such file\")\n\t// arrange write error\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.PwmWrite(\"33\", 2))\n\tfs.WithWriteError = true\n\terr = a.Finalize()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestPWMPinsReConnect(t *testing.T) {\n\t// arrange\n\ta, _ := initTestPWMPinsAdaptorWithMockedFilesystem(pwmMockPaths)\n\trequire.NoError(t, a.PwmWrite(\"33\", 1))\n\tassert.Len(t, a.pins, 1)\n\trequire.NoError(t, a.Finalize())\n\t// act\n\terr := a.Connect()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.NotNil(t, a.pins)\n\tassert.Empty(t, a.pins)\n}\n\nfunc TestPWMPinsCache(t *testing.T) {\n\t// arrange\n\ta, _ := initTestPWMPinsAdaptorWithMockedFilesystem(pwmMockPaths)\n\t// act\n\tfirstSysPin, err := a.PWMPin(\"33\")\n\trequire.NoError(t, err)\n\tsecondSysPin, err := a.PWMPin(\"33\")\n\trequire.NoError(t, err)\n\totherSysPin, err := a.PWMPin(\"36\")\n\trequire.NoError(t, err)\n\t// assert\n\tassert.Equal(t, secondSysPin, firstSysPin)\n\tassert.NotEqual(t, otherSysPin, firstSysPin)\n}\n\nfunc TestPwmWrite(t *testing.T) {\n\ttests := map[string]struct {\n\t\tpin              string\n\t\tvalue            byte\n\t\tminimumRate      float64\n\t\tsimulateWriteErr bool\n\t\tsimulateReadErr  bool\n\t\twantExport       string\n\t\twantEnable       string\n\t\twantPeriod       string\n\t\twantDutyCycle    string\n\t\twantErr          string\n\t}{\n\t\t\"write_max\": {\n\t\t\tpin:           \"33\",\n\t\t\tvalue:         255,\n\t\t\twantExport:    \"44\",\n\t\t\twantEnable:    \"1\",\n\t\t\twantPeriod:    \"10000000\",\n\t\t\twantDutyCycle: \"10000000\",\n\t\t},\n\t\t\"write_nearmax\": {\n\t\t\tpin:           \"33\",\n\t\t\tvalue:         254,\n\t\t\twantExport:    \"44\",\n\t\t\twantEnable:    \"1\",\n\t\t\twantPeriod:    \"10000000\",\n\t\t\twantDutyCycle: \"9960784\",\n\t\t},\n\t\t\"write_mid\": {\n\t\t\tpin:           \"33\",\n\t\t\tvalue:         100,\n\t\t\twantExport:    \"44\",\n\t\t\twantEnable:    \"1\",\n\t\t\twantPeriod:    \"10000000\",\n\t\t\twantDutyCycle: \"3921568\",\n\t\t},\n\t\t\"write_near min\": {\n\t\t\tpin:           \"33\",\n\t\t\tvalue:         1,\n\t\t\twantExport:    \"44\",\n\t\t\twantEnable:    \"1\",\n\t\t\twantPeriod:    \"10000000\",\n\t\t\twantDutyCycle: \"39215\",\n\t\t},\n\t\t\"write_min\": {\n\t\t\tpin:           \"33\",\n\t\t\tvalue:         0,\n\t\t\tminimumRate:   0.05,\n\t\t\twantExport:    \"44\",\n\t\t\twantEnable:    \"1\",\n\t\t\twantPeriod:    \"10000000\",\n\t\t\twantDutyCycle: \"0\",\n\t\t},\n\t\t\"error_min_rate\": {\n\t\t\tpin:           \"33\",\n\t\t\tvalue:         1,\n\t\t\tminimumRate:   0.05,\n\t\t\twantExport:    \"44\",\n\t\t\twantEnable:    \"1\",\n\t\t\twantPeriod:    \"10000000\",\n\t\t\twantDutyCycle: \"0\",\n\t\t\twantErr:       \"is lower than allowed (0.05\",\n\t\t},\n\t\t\"error_non_existent_pin\": {\n\t\t\tpin:           \"notexist\",\n\t\t\twantEnable:    \"0\",\n\t\t\twantPeriod:    \"0\",\n\t\t\twantDutyCycle: \"0\",\n\t\t\twantErr:       \"'notexist' is not a valid id of a PWM pin\",\n\t\t},\n\t\t\"error_write_error\": {\n\t\t\tpin:              \"33\",\n\t\t\tvalue:            10,\n\t\t\tsimulateWriteErr: true,\n\t\t\twantEnable:       \"0\",\n\t\t\twantPeriod:       \"0\",\n\t\t\twantDutyCycle:    \"0\",\n\t\t\twantErr:          \"write error\",\n\t\t},\n\t\t\"error_read_error\": {\n\t\t\tpin:             \"33\",\n\t\t\tvalue:           11,\n\t\t\tsimulateReadErr: true,\n\t\t\twantExport:      \"44\",\n\t\t\twantEnable:      \"0\",\n\t\t\twantPeriod:      \"0\",\n\t\t\twantDutyCycle:   \"0\",\n\t\t\twantErr:         \"read error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta, fs := initTestPWMPinsAdaptorWithMockedFilesystem(pwmMockPaths)\n\t\t\tif tc.minimumRate > 0 {\n\t\t\t\ta.pwmPinsCfg.dutyRateMinimum = tc.minimumRate\n\t\t\t}\n\t\t\tfs.WithWriteError = tc.simulateWriteErr\n\t\t\tfs.WithReadError = tc.simulateReadErr\n\t\t\t// act\n\t\t\terr := a.PwmWrite(tc.pin, tc.value)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantExport, fs.Files[pwmExportPath].Contents)\n\t\t\tassert.Equal(t, tc.wantEnable, fs.Files[pwm44EnablePath].Contents)\n\t\t\tassert.Equal(t, tc.wantPeriod, fs.Files[pwm44PeriodPath].Contents)\n\t\t\tassert.Equal(t, tc.wantDutyCycle, fs.Files[pwm44DutyCyclePath].Contents)\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, \"normal\", fs.Files[pwm44PolarityPath].Contents)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestServoWrite(t *testing.T) {\n\ta, fs := initTestPWMPinsAdaptorWithMockedFilesystem(pwmMockPaths)\n\n\terr := a.ServoWrite(\"33\", 0)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"44\", fs.Files[pwmExportPath].Contents)\n\tassert.Equal(t, \"1\", fs.Files[pwm44EnablePath].Contents)\n\t//nolint:perfsprint // ok here\n\tassert.Equal(t, fmt.Sprintf(\"%d\", a.pwmPinsCfg.periodDefault), fs.Files[pwm44PeriodPath].Contents)\n\tassert.Equal(t, \"250000\", fs.Files[pwm44DutyCyclePath].Contents)\n\tassert.Equal(t, \"normal\", fs.Files[pwm44PolarityPath].Contents)\n\n\terr = a.ServoWrite(\"33\", 180)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"1250000\", fs.Files[pwm44DutyCyclePath].Contents)\n\n\terr = a.ServoWrite(\"notexist\", 42)\n\trequire.ErrorContains(t, err, \"'notexist' is not a valid id of a PWM pin\")\n\n\tfs.WithWriteError = true\n\terr = a.ServoWrite(\"33\", 100)\n\trequire.ErrorContains(t, err, \"write error\")\n\tfs.WithWriteError = false\n\n\tfs.WithReadError = true\n\terr = a.ServoWrite(\"33\", 100)\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\tdelete(a.pwmPinsCfg.pinsServoScale, \"33\")\n\terr = a.ServoWrite(\"33\", 42)\n\trequire.EqualError(t, err, \"no scaler found for servo pin '33'\")\n}\n\nfunc TestSetPeriod(t *testing.T) {\n\t// arrange\n\ta, fs := initTestPWMPinsAdaptorWithMockedFilesystem(pwmMockPaths)\n\tnewPeriod := uint32(2550000)\n\t// act\n\terr := a.SetPeriod(\"33\", newPeriod)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"44\", fs.Files[pwmExportPath].Contents)\n\tassert.Equal(t, \"1\", fs.Files[pwm44EnablePath].Contents)\n\tassert.Equal(t, fmt.Sprintf(\"%d\", newPeriod), fs.Files[pwm44PeriodPath].Contents) //nolint:perfsprint // ok here\n\tassert.Equal(t, \"0\", fs.Files[pwm44DutyCyclePath].Contents)\n\tassert.Equal(t, \"normal\", fs.Files[pwm44PolarityPath].Contents)\n\n\t// arrange test for automatic adjustment of duty cycle to lower value\n\terr = a.PwmWrite(\"33\", 127) // 127 is a little bit smaller than 50% of period\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(1270000), fs.Files[pwm44DutyCyclePath].Contents)\n\tnewPeriod = newPeriod / 10\n\n\t// act\n\terr = a.SetPeriod(\"33\", newPeriod)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(127000), fs.Files[pwm44DutyCyclePath].Contents)\n\n\t// arrange test for automatic adjustment of duty cycle to higher value\n\tnewPeriod = newPeriod * 20\n\n\t// act\n\terr = a.SetPeriod(\"33\", newPeriod)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(2540000), fs.Files[pwm44DutyCyclePath].Contents)\n\n\t// act\n\terr = a.SetPeriod(\"not_exist\", newPeriod)\n\t// assert\n\trequire.ErrorContains(t, err, \"'not_exist' is not a valid id of a PWM pin\")\n}\n\nfunc Test_PWMPin(t *testing.T) {\n\ttranslateErr := \"translator_error\"\n\ttranslator := func(string) (string, int, error) { return pwmDir, 44, nil }\n\ttests := map[string]struct {\n\t\tmockPaths []string\n\t\tperiod    string\n\t\tdutyCycle string\n\t\ttranslate func(string) (string, int, error)\n\t\tpin       string\n\t\twantErr   string\n\t}{\n\t\t\"pin_ok\": {\n\t\t\tmockPaths: []string{pwmExportPath, pwm44EnablePath, pwm44PeriodPath, pwm44DutyCyclePath, pwm44PolarityPath},\n\t\t\tperiod:    \"0\",\n\t\t\tdutyCycle: \"0\",\n\t\t\ttranslate: translator,\n\t\t\tpin:       \"33\",\n\t\t},\n\t\t\"init_export_error\": {\n\t\t\tmockPaths: []string{},\n\t\t\ttranslate: translator,\n\t\t\tpin:       \"33\",\n\t\t\twantErr: \"Export() failed for id 44 with  : \" +\n\t\t\t\t\"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/export: no such file\",\n\t\t},\n\t\t\"init_setenabled_error\": {\n\t\t\tmockPaths: []string{pwmExportPath, pwm44PeriodPath},\n\t\t\tperiod:    \"1000\",\n\t\t\ttranslate: translator,\n\t\t\tpin:       \"33\",\n\t\t\twantErr: \"SetEnabled(false) failed for id 44 with  : \" +\n\t\t\t\t\"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/pwm44/enable: no such file\",\n\t\t},\n\t\t\"init_setperiod_dutycycle_no_error\": {\n\t\t\tmockPaths: []string{pwmExportPath, pwm44EnablePath, pwm44PeriodPath, pwm44DutyCyclePath, pwm44PolarityPath},\n\t\t\tperiod:    \"0\",\n\t\t\tdutyCycle: \"0\",\n\t\t\ttranslate: translator,\n\t\t\tpin:       \"33\",\n\t\t},\n\t\t\"init_setperiod_error\": {\n\t\t\tmockPaths: []string{pwmExportPath, pwm44EnablePath, pwm44DutyCyclePath},\n\t\t\tdutyCycle: \"0\",\n\t\t\ttranslate: translator,\n\t\t\tpin:       \"33\",\n\t\t\twantErr: \"SetPeriod(10000000) failed for id 44 with  : \" +\n\t\t\t\t\"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/pwm44/period: no such file\",\n\t\t},\n\t\t\"init_setpolarity_error\": {\n\t\t\tmockPaths: []string{pwmExportPath, pwm44EnablePath, pwm44PeriodPath, pwm44DutyCyclePath},\n\t\t\tperiod:    \"0\",\n\t\t\tdutyCycle: \"0\",\n\t\t\ttranslate: translator,\n\t\t\tpin:       \"33\",\n\t\t\twantErr: \"SetPolarity(normal) failed for id 44 with  : \" +\n\t\t\t\t\"/sys/devices/platform/ff680020.pwm/pwm/pwmchip3/pwm44/polarity: no such file\",\n\t\t},\n\t\t\"translate_error\": {\n\t\t\ttranslate: func(string) (string, int, error) { return \"\", -1, errors.New(translateErr) },\n\t\t\twantErr:   translateErr,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tsys := system.NewAccesser()\n\t\t\tfs := sys.UseMockFilesystem(tc.mockPaths)\n\t\t\tif tc.period != \"\" {\n\t\t\t\tfs.Files[pwm44PeriodPath].Contents = tc.period\n\t\t\t}\n\t\t\tif tc.dutyCycle != \"\" {\n\t\t\t\tfs.Files[pwm44DutyCyclePath].Contents = tc.dutyCycle\n\t\t\t}\n\t\t\ta := NewPWMPinsAdaptor(sys, tc.translate)\n\t\t\tif err := a.Connect(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := a.PWMPin(tc.pin)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.NotNil(t, got)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t\tassert.Nil(t, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPWMPinConcurrency(t *testing.T) {\n\toldProcs := runtime.GOMAXPROCS(0)\n\truntime.GOMAXPROCS(8)\n\tdefer runtime.GOMAXPROCS(oldProcs)\n\n\ttranslate := func(pin string) (string, int, error) { line, err := strconv.Atoi(pin); return \"\", line, err }\n\tsys := system.NewAccesser()\n\n\tfor retry := 0; retry < 20; retry++ {\n\n\t\ta := NewPWMPinsAdaptor(sys, translate)\n\t\trequire.NoError(t, a.Connect())\n\t\tvar wg sync.WaitGroup\n\n\t\tfor i := 0; i < 20; i++ {\n\t\t\twg.Add(1)\n\t\t\tpinAsString := strconv.Itoa(i)\n\t\t\tgo func(pin string) {\n\t\t\t\tdefer wg.Done()\n\t\t\t\t_, _ = a.PWMPin(pin)\n\t\t\t}(pinAsString)\n\t\t}\n\n\t\twg.Wait()\n\t}\n}\n"
  },
  {
    "path": "platforms/adaptors/pwmpinsadaptoroptions.go",
    "content": "package adaptors\n\nimport \"time\"\n\n// PwmPinsOptionApplier needs to be implemented by each configurable option type\ntype PwmPinsOptionApplier interface {\n\tapply(cfg *pwmPinsConfiguration)\n}\n\n// pwmPinsDebugOption is the type to switch on PWM pins related debug messages.\ntype pwmPinsDebugOption bool\n\n// pwmPinInitializeOption is the type for applying another than the default initializer.\ntype pwmPinsInitializeOption pwmPinInitializer\n\n// pwmPinsUsePiBlasterPinOption is the type for applying the usage of the pi-blaster PWM pin implementation, which will\n// replace the default sysfs-implementation for PWM-pins.\ntype pwmPinsUsePiBlasterPinOption bool\n\n// pwmPinPeriodDefaultOption is the type for applying another than the default period of 10 ms (100 Hz) for all\n// created pins.\ntype pwmPinsPeriodDefaultOption uint32\n\n// pwmPinsPeriodMinimumOption is the type for applying another than the default minimum period of \"0\".\ntype pwmPinsPeriodMinimumOption uint32\n\n// pwmPinsDutyRateMinimumOption is the type for applying another than the default minimum rate of 1/period.\ntype pwmPinsDutyRateMinimumOption float64\n\n// pwmPinPolarityInvertedIdentifierOption is the type for applying another identifier, which will replace the default\n// \"inversed\".\ntype pwmPinsPolarityInvertedIdentifierOption string\n\n// pwmPinsAdjustDutyOnSetPeriodOption is the type for applying the automatic adjustment of duty cycle on setting\n// the period to on/off.\ntype pwmPinsAdjustDutyOnSetPeriodOption bool\n\n// pwmPinsDefaultPeriodForPinOption is the type for applying another than the default period of 10 ms (100 Hz) only for\n// the given pin id.\ntype pwmPinsDefaultPeriodForPinOption struct {\n\tid     string\n\tperiod uint32\n}\n\n// pwmPinsServoDutyScaleForPinOption is the type for applying another than the default 0.5-2.5 ms range of duty cycle\n// for servo calls on the specified pin id.\ntype pwmPinsServoDutyScaleForPinOption struct {\n\tid  string\n\tmin time.Duration\n\tmax time.Duration\n}\n\n// pwmPinsServoAngleScaleForPinOption is the type for applying another than the default 0.0-180.0° range of angle for\n// servo calls on the specified pin id.\ntype pwmPinsServoAngleScaleForPinOption struct {\n\tid        string\n\tminDegree float64\n\tmaxDegree float64\n}\n\nfunc (o pwmPinsDebugOption) String() string {\n\treturn \"switch on debugging for pwm pins option\"\n}\n\nfunc (o pwmPinsInitializeOption) String() string {\n\treturn \"pin initializer option for PWM's\"\n}\n\nfunc (o pwmPinsUsePiBlasterPinOption) String() string {\n\treturn \"pi-blaster pin implementation option for PWM's\"\n}\n\nfunc (o pwmPinsPeriodDefaultOption) String() string {\n\treturn \"default period option for PWM's\"\n}\n\nfunc (o pwmPinsPeriodMinimumOption) String() string {\n\treturn \"minimum period option for PWM's\"\n}\n\nfunc (o pwmPinsDutyRateMinimumOption) String() string {\n\treturn \"minimum duty rate option for PWM's\"\n}\n\nfunc (o pwmPinsPolarityInvertedIdentifierOption) String() string {\n\treturn \"identifier for 'inversed' option for PWM's\"\n}\n\nfunc (o pwmPinsAdjustDutyOnSetPeriodOption) String() string {\n\treturn \"adjust duty cycle on set period option for PWM's\"\n}\n\nfunc (o pwmPinsDefaultPeriodForPinOption) String() string {\n\treturn \"default period for the pin option for PWM's\"\n}\n\nfunc (o pwmPinsServoDutyScaleForPinOption) String() string {\n\treturn \"duty cycle min-max range for a servo pin option for PWM's\"\n}\n\nfunc (o pwmPinsServoAngleScaleForPinOption) String() string {\n\treturn \"angle min-max range for a servo pin option for PWM's\"\n}\n\nfunc (o pwmPinsDebugOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.debug = bool(o)\n}\n\nfunc (o pwmPinsInitializeOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.initialize = pwmPinInitializer(o)\n}\n\nfunc (o pwmPinsUsePiBlasterPinOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.usePiBlasterPin = bool(o)\n}\n\nfunc (o pwmPinsPeriodDefaultOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.periodDefault = uint32(o)\n}\n\nfunc (o pwmPinsPeriodMinimumOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.periodMinimum = uint32(o)\n}\n\nfunc (o pwmPinsDutyRateMinimumOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.dutyRateMinimum = float64(o)\n}\n\nfunc (o pwmPinsPolarityInvertedIdentifierOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.polarityInvertedIdentifier = string(o)\n}\n\nfunc (o pwmPinsAdjustDutyOnSetPeriodOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.adjustDutyOnSetPeriod = bool(o)\n}\n\nfunc (o pwmPinsDefaultPeriodForPinOption) apply(cfg *pwmPinsConfiguration) {\n\tcfg.pinsDefaultPeriod[o.id] = o.period\n}\n\nfunc (o pwmPinsServoDutyScaleForPinOption) apply(cfg *pwmPinsConfiguration) {\n\tscale, ok := cfg.pinsServoScale[o.id]\n\tif !ok {\n\t\tscale = pwmPinServoScale{minDegree: 0, maxDegree: 180}\n\t}\n\n\tscale.minDuty = o.min\n\tscale.maxDuty = o.max\n\n\tcfg.pinsServoScale[o.id] = scale\n}\n\nfunc (o pwmPinsServoAngleScaleForPinOption) apply(cfg *pwmPinsConfiguration) {\n\tscale, ok := cfg.pinsServoScale[o.id]\n\tif !ok {\n\t\tscale = pwmPinServoScale{} // default values for duty cycle will be set on initialize, if zero\n\t}\n\n\tscale.minDegree = o.minDegree\n\tscale.maxDegree = o.maxDegree\n\n\tcfg.pinsServoScale[o.id] = scale\n}\n"
  },
  {
    "path": "platforms/adaptors/pwmpinsadaptoroptions_test.go",
    "content": "//nolint:nonamedreturns // ok for tests\npackage adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestWithPWMPinInitializer(t *testing.T) {\n\t// This is a general test, that options are applied by using the WithPWMPinInitializer() option.\n\t// All other configuration options can also be tested by With..(val).apply(cfg).\n\t// arrange\n\twantErr := fmt.Errorf(\"new_initializer\")\n\tnewInitializer := func(string, gobot.PWMPinner) error { return wantErr }\n\t// act\n\ta := NewPWMPinsAdaptor(system.NewAccesser(), func(pin string) (c string, l int, e error) { return },\n\t\tWithPWMPinInitializer(newInitializer))\n\t// assert\n\terr := a.pwmPinsCfg.initialize(\"1\", nil)\n\tassert.Equal(t, wantErr, err)\n}\n\nfunc TestWithPWMPinDebug(t *testing.T) {\n\t// arrange\n\tcfg := &pwmPinsConfiguration{debug: false}\n\t// act\n\tWithPWMPinDebug().apply(cfg)\n\t// assert\n\tassert.True(t, cfg.debug)\n}\n\nfunc TestWithPWMUsePiBlaster(t *testing.T) {\n\t// arrange\n\tcfg := &pwmPinsConfiguration{usePiBlasterPin: false}\n\t// act\n\tWithPWMUsePiBlaster().apply(cfg)\n\t// assert\n\tassert.True(t, cfg.usePiBlasterPin)\n}\n\nfunc TestWithPWMDefaultPeriod(t *testing.T) {\n\t// arrange\n\tconst newPeriod = uint32(10)\n\tcfg := &pwmPinsConfiguration{periodDefault: 123}\n\t// act\n\tWithPWMDefaultPeriod(newPeriod).apply(cfg)\n\t// assert\n\tassert.Equal(t, newPeriod, cfg.periodDefault)\n}\n\nfunc TestWithPWMMinimumPeriod(t *testing.T) {\n\t// arrange\n\tconst newMinPeriod = uint32(10)\n\tcfg := &pwmPinsConfiguration{periodMinimum: 23}\n\t// act\n\tWithPWMMinimumPeriod(newMinPeriod).apply(cfg)\n\t// assert\n\tassert.Equal(t, newMinPeriod, cfg.periodMinimum)\n}\n\nfunc TestWithPWMMinimumDutyRate(t *testing.T) {\n\t// arrange\n\tconst newRate = 11.0\n\tcfg := &pwmPinsConfiguration{dutyRateMinimum: 33}\n\t// act\n\tWithPWMMinimumDutyRate(newRate).apply(cfg)\n\t// assert\n\tassert.InDelta(t, newRate, cfg.dutyRateMinimum, 0.0)\n}\n\nfunc TestWithPWMPolarityInvertedIdentifier(t *testing.T) {\n\t// arrange\n\tconst newPolarityIdent = \"pwm_invers\"\n\tcfg := &pwmPinsConfiguration{polarityInvertedIdentifier: \"old_inverted\"}\n\t// act\n\tWithPWMPolarityInvertedIdentifier(newPolarityIdent).apply(cfg)\n\t// assert\n\tassert.Equal(t, newPolarityIdent, cfg.polarityInvertedIdentifier)\n}\n\nfunc TestWithPWMNoDutyCycleAdjustment(t *testing.T) {\n\t// arrange\n\tcfg := &pwmPinsConfiguration{adjustDutyOnSetPeriod: true}\n\t// act\n\tWithPWMNoDutyCycleAdjustment().apply(cfg)\n\t// assert\n\tassert.False(t, cfg.adjustDutyOnSetPeriod)\n}\n\nfunc TestWithPWMDefaultPeriodForPin(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tpin       = \"pin4test\"\n\t\tnewPeriod = 123456\n\t)\n\tcfg := &pwmPinsConfiguration{pinsDefaultPeriod: map[string]uint32{pin: 54321}}\n\t// act\n\tWithPWMDefaultPeriodForPin(pin, newPeriod).apply(cfg)\n\t// assert\n\tassert.Equal(t, uint32(newPeriod), cfg.pinsDefaultPeriod[pin])\n}\n\nfunc TestWithPWMServoDutyCycleRangeForPin(t *testing.T) {\n\tconst (\n\t\tpin    = \"pin4test\"\n\t\tnewMin = 19\n\t\tnewMax = 99\n\t)\n\n\ttests := map[string]struct {\n\t\tscaleMap     map[string]pwmPinServoScale\n\t\twantScaleMap map[string]pwmPinServoScale\n\t}{\n\t\t\"empty_scale_map\": {\n\t\t\tscaleMap: make(map[string]pwmPinServoScale),\n\t\t\twantScaleMap: map[string]pwmPinServoScale{\n\t\t\t\tpin: {minDuty: newMin, maxDuty: newMax, minDegree: 0, maxDegree: 180},\n\t\t\t},\n\t\t},\n\t\t\"scale_exists_for_set_pin\": {\n\t\t\tscaleMap: map[string]pwmPinServoScale{\n\t\t\t\t\"other\": {minDuty: 123, maxDuty: 234, minDegree: 11, maxDegree: 22},\n\t\t\t\tpin:     {minDuty: newMin - 2, maxDuty: newMax + 2, minDegree: 1, maxDegree: 2},\n\t\t\t},\n\t\t\twantScaleMap: map[string]pwmPinServoScale{\n\t\t\t\t\"other\": {minDuty: 123, maxDuty: 234, minDegree: 11, maxDegree: 22},\n\t\t\t\tpin:     {minDuty: newMin, maxDuty: newMax, minDegree: 1, maxDegree: 2},\n\t\t\t},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tcfg := &pwmPinsConfiguration{pinsServoScale: tc.scaleMap}\n\t\t\t// act\n\t\t\tWithPWMServoDutyCycleRangeForPin(pin, newMin, newMax).apply(cfg)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantScaleMap, cfg.pinsServoScale)\n\t\t})\n\t}\n}\n\nfunc TestWithPWMServoAngleRangeForPin(t *testing.T) {\n\tconst (\n\t\tpin    = \"pin4test\"\n\t\tnewMin = 30\n\t\tnewMax = 90\n\t)\n\n\ttests := map[string]struct {\n\t\tscaleMap     map[string]pwmPinServoScale\n\t\twantScaleMap map[string]pwmPinServoScale\n\t}{\n\t\t\"empty_scale_map\": {\n\t\t\tscaleMap: make(map[string]pwmPinServoScale),\n\t\t\twantScaleMap: map[string]pwmPinServoScale{\n\t\t\t\tpin: {minDuty: 0.0, maxDuty: 0.0, minDegree: newMin, maxDegree: newMax},\n\t\t\t},\n\t\t},\n\t\t\"scale_exists_for_set_pin\": {\n\t\t\tscaleMap: map[string]pwmPinServoScale{\n\t\t\t\t\"other\": {minDuty: 123, maxDuty: 234, minDegree: 11, maxDegree: 22},\n\t\t\t\tpin:     {minDuty: 4, maxDuty: 5, minDegree: newMin - 2, maxDegree: newMax + 2},\n\t\t\t},\n\t\t\twantScaleMap: map[string]pwmPinServoScale{\n\t\t\t\t\"other\": {minDuty: 123, maxDuty: 234, minDegree: 11, maxDegree: 22},\n\t\t\t\tpin:     {minDuty: 4, maxDuty: 5, minDegree: newMin, maxDegree: newMax},\n\t\t\t},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tcfg := &pwmPinsConfiguration{pinsServoScale: tc.scaleMap}\n\t\t\t// act\n\t\t\tWithPWMServoAngleRangeForPin(pin, newMin, newMax).apply(cfg)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantScaleMap, cfg.pinsServoScale)\n\t\t})\n\t}\n}\n\nfunc TestStringer(t *testing.T) {\n\tassert.NotEmpty(t, pwmPinsInitializeOption(nil).String())\n\tassert.NotEmpty(t, pwmPinsUsePiBlasterPinOption(true).String())\n\tassert.NotEmpty(t, pwmPinsPeriodDefaultOption(1).String())\n\tassert.NotEmpty(t, pwmPinsPeriodMinimumOption(1).String())\n\tassert.NotEmpty(t, pwmPinsDutyRateMinimumOption(1).String())\n\tassert.NotEmpty(t, pwmPinsPolarityInvertedIdentifierOption(\"1\").String())\n\tassert.NotEmpty(t, pwmPinsAdjustDutyOnSetPeriodOption(true).String())\n\tassert.NotEmpty(t, pwmPinsDefaultPeriodForPinOption{}.String())\n\tassert.NotEmpty(t, pwmPinsServoDutyScaleForPinOption{}.String())\n\tassert.NotEmpty(t, pwmPinsServoAngleScaleForPinOption{}.String())\n}\n"
  },
  {
    "path": "platforms/adaptors/pwmpintranslator.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\ntype PWMPinDefinition struct {\n\tDir       string\n\tDirRegexp string\n\tChannel   int\n}\n\ntype PWMPinDefinitions map[string]PWMPinDefinition\n\ntype PWMPinTranslator struct {\n\tsys            *system.Accesser\n\tpinDefinitions PWMPinDefinitions\n}\n\n// NewPWMPinTranslator creates a new instance of a PWM pin translator, suitable for the most cases.\nfunc NewPWMPinTranslator(sys *system.Accesser, pinDefinitions PWMPinDefinitions) *PWMPinTranslator {\n\treturn &PWMPinTranslator{sys: sys, pinDefinitions: pinDefinitions}\n}\n\n// Translate returns the sysfs path and channel for the given id.\nfunc (pt *PWMPinTranslator) Translate(id string) (string, int, error) {\n\tpinInfo, ok := pt.pinDefinitions[id]\n\tif !ok {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a PWM pin\", id)\n\t}\n\tpath, err := pinInfo.FindPWMDir(pt.sys)\n\tif err != nil {\n\t\treturn \"\", -1, err\n\t}\n\treturn path, pinInfo.Channel, nil\n}\n\nfunc (p PWMPinDefinition) FindPWMDir(sys *system.Accesser) (string, error) {\n\titems, _ := sys.Find(p.Dir, p.DirRegexp)\n\tif len(items) == 0 {\n\t\treturn \"\", fmt.Errorf(\"no path found for PWM directory pattern, '%s' in path '%s'. See README.md for activation\",\n\t\t\tp.DirRegexp, p.Dir)\n\t}\n\n\tdir := items[0]\n\tinfo, err := sys.Stat(dir)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"error (%v) on access '%s'\", err, dir)\n\t}\n\tif !info.IsDir() {\n\t\treturn \"\", fmt.Errorf(\"the item '%s' is not a directory, which is not expected\", dir)\n\t}\n\n\treturn dir, nil\n}\n"
  },
  {
    "path": "platforms/adaptors/pwmpintranslator_test.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestNewPWMPinTranslator(t *testing.T) {\n\t// arrange\n\tsys := &system.Accesser{}\n\tpinDef := PWMPinDefinitions{}\n\t// act\n\tpt := NewPWMPinTranslator(sys, pinDef)\n\t// assert\n\tassert.IsType(t, &PWMPinTranslator{}, pt)\n\tassert.Equal(t, sys, pt.sys)\n\tassert.Equal(t, pinDef, pt.pinDefinitions)\n}\n\nfunc TestPWMPinTranslatorTranslate(t *testing.T) {\n\tpinDefinitions := PWMPinDefinitions{\n\t\t\"33\": {Dir: \"/sys/devices/platform/ff680020.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2]$\", Channel: 0},\n\t\t\"32\": {Dir: \"/sys/devices/platform/ff680030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3]$\", Channel: 0},\n\t}\n\tbasePaths := []string{\n\t\t\"/sys/devices/platform/ff680020.pwm/pwm/\",\n\t\t\"/sys/devices/platform/ff680030.pwm/pwm/\",\n\t}\n\ttests := map[string]struct {\n\t\tpin         string\n\t\tchip        string\n\t\twantDir     string\n\t\twantChannel int\n\t\twantErr     error\n\t}{\n\t\t\"32_chip0\": {\n\t\t\tpin:         \"32\",\n\t\t\tchip:        \"pwmchip0\",\n\t\t\twantDir:     \"/sys/devices/platform/ff680030.pwm/pwm/pwmchip0\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"32_chip1\": {\n\t\t\tpin:         \"32\",\n\t\t\tchip:        \"pwmchip1\",\n\t\t\twantDir:     \"/sys/devices/platform/ff680030.pwm/pwm/pwmchip1\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"32_chip2\": {\n\t\t\tpin:         \"32\",\n\t\t\tchip:        \"pwmchip2\",\n\t\t\twantDir:     \"/sys/devices/platform/ff680030.pwm/pwm/pwmchip2\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"32_chip3\": {\n\t\t\tpin:         \"32\",\n\t\t\tchip:        \"pwmchip3\",\n\t\t\twantDir:     \"/sys/devices/platform/ff680030.pwm/pwm/pwmchip3\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"33_chip0\": {\n\t\t\tpin:         \"33\",\n\t\t\tchip:        \"pwmchip0\",\n\t\t\twantDir:     \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip0\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"33_chip1\": {\n\t\t\tpin:         \"33\",\n\t\t\tchip:        \"pwmchip1\",\n\t\t\twantDir:     \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip1\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"33_chip2\": {\n\t\t\tpin:         \"33\",\n\t\t\tchip:        \"pwmchip2\",\n\t\t\twantDir:     \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip2\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"invalid_pin\": {\n\t\t\tpin:         \"7\",\n\t\t\twantDir:     \"\",\n\t\t\twantChannel: -1,\n\t\t\twantErr:     fmt.Errorf(\"'7' is not a valid id for a PWM pin\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tmockedPaths := []string{}\n\t\t\tfor _, base := range basePaths {\n\t\t\t\tmockedPaths = append(mockedPaths, base+tc.chip+\"/\")\n\t\t\t}\n\t\t\tsys := system.NewAccesser()\n\t\t\t_ = sys.UseMockFilesystem(mockedPaths)\n\t\t\tpt := NewPWMPinTranslator(sys, pinDefinitions)\n\t\t\t// act\n\t\t\tdir, channel, err := pt.Translate(tc.pin)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantDir, dir)\n\t\t\tassert.Equal(t, tc.wantChannel, channel)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/adaptors/spibusadaptor.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\ntype spiBusNumberValidator func(busNumber int) error\n\n// spiBusConfiguration contains all changeable attributes of the adaptor.\ntype spiBusConfiguration struct {\n\tdebug                 bool\n\tspiGpioPinnerProvider gobot.DigitalPinnerProvider\n\tsystemOptions         []system.AccesserOptionApplier\n}\n\n// SpiBusAdaptor is a adaptor for SPI bus, normally used for composition in platforms.\ntype SpiBusAdaptor struct {\n\tsys               *system.Accesser\n\tvalidateBusNumber spiBusNumberValidator\n\tdefaultBusNumber  int\n\tdefaultChipNumber int\n\tdefaultMode       int\n\tdefaultBitCount   int\n\tdefaultMaxSpeed   int64 // Hz\n\tspiBusCfg         *spiBusConfiguration\n\tmutex             sync.Mutex\n\tconnections       map[string]spi.Connection\n}\n\n// NewSpiBusAdaptor provides the access to SPI buses of the board. The validator is used to check the\n// bus number (given by user) to the abilities of the board.\n//\n// Options:\n//\n//\t\"WithSpiDebug\"\n//\t\"WithSpiGpioAccess\"\nfunc NewSpiBusAdaptor(\n\tsys *system.Accesser,\n\tv spiBusNumberValidator,\n\tbusNum, chipNum, mode, bits int,\n\tmaxSpeed int64,\n\tspiGpioPinnerProvider gobot.DigitalPinnerProvider,\n\topts ...SpiBusOptionApplier,\n) *SpiBusAdaptor {\n\ta := SpiBusAdaptor{\n\t\tsys:               sys,\n\t\tvalidateBusNumber: v,\n\t\tdefaultBusNumber:  busNum,\n\t\tdefaultChipNumber: chipNum,\n\t\tdefaultMode:       mode,\n\t\tdefaultBitCount:   bits,\n\t\tdefaultMaxSpeed:   maxSpeed,\n\t\tspiBusCfg:         &spiBusConfiguration{spiGpioPinnerProvider: spiGpioPinnerProvider},\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(a.spiBusCfg)\n\t}\n\n\tsys.AddSPISupport(a.spiBusCfg.systemOptions...)\n\n\treturn &a\n}\n\n// WithSpiDebug can be used to switch on debugging for SPI implementation.\nfunc WithSpiDebug() spiBusDebugOption {\n\treturn spiBusDebugOption(true)\n}\n\n// WithSpiGpioAccess can be used to switch the default SPI implementation to GPIO usage.\nfunc WithSpiGpioAccess(sclkPin, ncsPin, sdoPin, sdiPin string) spiBusDigitalPinsForSystemSpiOption {\n\to := spiBusDigitalPinsForSystemSpiOption{\n\t\tsclkPin: sclkPin,\n\t\tncsPin:  ncsPin,\n\t\tsdoPin:  sdoPin,\n\t\tsdiPin:  sdiPin,\n\t}\n\n\treturn o\n}\n\n// Connect prepares the connection to SPI buses.\nfunc (a *SpiBusAdaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.connections != nil {\n\t\treturn fmt.Errorf(\"SPI bus adaptor already connected, please call Finalize() for re-connect\")\n\t}\n\n\ta.connections = make(map[string]spi.Connection)\n\ta.debuglnf(\"connect the SPI bus adaptor done\")\n\n\treturn nil\n}\n\n// Finalize closes all SPI connections.\nfunc (a *SpiBusAdaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.debuglnf(\"finalize the SPI bus adaptor for %d buses...\", len(a.connections))\n\n\tvar err error\n\tfor id, con := range a.connections {\n\t\tif con != nil {\n\t\t\te := con.Close()\n\t\t\tif e != nil {\n\t\t\t\terr = multierror.Append(err, e)\n\t\t\t}\n\t\t\ta.debuglnf(\"SPI bus '%s' closed with error: %v\", id, e)\n\t\t}\n\t}\n\ta.connections = nil\n\ta.debuglnf(\"finalize the SPI bus adaptor done with error: %v\", err)\n\n\treturn err\n}\n\n// GetSpiConnection returns an spi connection to a device on a specified bus.\n// Valid bus numbers range between 0 and 65536, valid chip numbers are 0 ... 255.\nfunc (a *SpiBusAdaptor) GetSpiConnection(busNum, chipNum, mode, bits int, maxSpeed int64) (spi.Connection, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.debuglnf(\"get SPI connection\")\n\n\tif a.connections == nil {\n\t\treturn nil, fmt.Errorf(\"not connected\")\n\t}\n\n\tid := fmt.Sprintf(\"%d_%d\", busNum, chipNum)\n\n\tcon := a.connections[id]\n\tif con == nil {\n\t\tif err := a.validateBusNumber(busNum); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvar err error\n\t\tbus, err := a.sys.NewSpiDevice(busNum, chipNum, mode, bits, maxSpeed)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcon = spi.NewConnection(bus)\n\t\ta.connections[id] = con\n\t}\n\n\treturn con, nil\n}\n\n// SpiDefaultBusNumber returns the default bus number for this platform.\nfunc (a *SpiBusAdaptor) SpiDefaultBusNumber() int {\n\treturn a.defaultBusNumber\n}\n\n// SpiDefaultChipNumber returns the default chip number for this platform.\nfunc (a *SpiBusAdaptor) SpiDefaultChipNumber() int {\n\treturn a.defaultChipNumber\n}\n\n// SpiDefaultMode returns the default SPI mode for this platform.\nfunc (a *SpiBusAdaptor) SpiDefaultMode() int {\n\treturn a.defaultMode\n}\n\n// SpiDefaultBitCount returns the default number of bits used for this platform.\nfunc (a *SpiBusAdaptor) SpiDefaultBitCount() int {\n\treturn a.defaultBitCount\n}\n\n// SpiDefaultMaxSpeed returns the default maximal speed for this platform.\nfunc (a *SpiBusAdaptor) SpiDefaultMaxSpeed() int64 {\n\treturn a.defaultMaxSpeed\n}\n\nfunc (a *SpiBusAdaptor) debuglnf(format string, p ...interface{}) {\n\tgobot.Debuglnf(a.spiBusCfg.debug, format, p...)\n}\n"
  },
  {
    "path": "platforms/adaptors/spibusadaptor_test.go",
    "content": "package adaptors\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this SpiBusAdaptor fulfills all the required interfaces\nvar _ spi.Connector = (*SpiBusAdaptor)(nil)\n\nconst spiTestAllowedBus = 15\n\nfunc initTestSpiBusAdaptorWithMockedSpi() (*SpiBusAdaptor, *system.MockSpiAccess) {\n\tvalidator := func(busNr int) error {\n\t\tif busNr != spiTestAllowedBus {\n\t\t\treturn fmt.Errorf(\"%d not valid\", busNr)\n\t\t}\n\t\treturn nil\n\t}\n\tsys := system.NewAccesser()\n\t// arrange for periphio needed\n\tsys.UseMockFilesystem([]string{\"/dev/spidev\"})\n\tdpa := sys.UseMockDigitalPinAccess()\n\ta := NewSpiBusAdaptor(sys, validator, 1, 2, 3, 4, 5, dpa)\n\tspi := a.sys.UseMockSpi()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, spi\n}\n\nfunc TestNewSpiAdaptor(t *testing.T) {\n\t// arrange\n\tsys := system.NewAccesser()\n\t// arrange for periphio needed\n\tsys.UseMockFilesystem([]string{\"/dev/spidev\"})\n\tdpa := sys.UseMockDigitalPinAccess()\n\ta := NewSpiBusAdaptor(sys, nil, 1, 2, 3, 4, 5, dpa)\n\t// act & assert\n\tassert.Equal(t, 1, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 2, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 3, a.SpiDefaultMode())\n\tassert.Equal(t, 4, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(5), a.SpiDefaultMaxSpeed())\n\t_, err := a.GetSpiConnection(10, 0, 0, 8, 10000000)\n\trequire.ErrorContains(t, err, \"not connected\")\n}\n\nfunc TestGetSpiConnection(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tbusNum   = spiTestAllowedBus\n\t\tchipNum  = 14\n\t\tmode     = 13\n\t\tbits     = 12\n\t\tmaxSpeed = int64(11)\n\t)\n\ta, spi := initTestSpiBusAdaptorWithMockedSpi()\n\tassert.Empty(t, a.connections)\n\t// act\n\tcon1, err1 := a.GetSpiConnection(busNum, chipNum, mode, bits, maxSpeed)\n\t// assert\n\trequire.NoError(t, err1)\n\tassert.NotNil(t, con1)\n\tassert.Len(t, a.connections, 1)\n\t// assert cached connection\n\tcon1a, err2 := a.GetSpiConnection(busNum, chipNum, mode, bits, maxSpeed)\n\trequire.NoError(t, err2)\n\tassert.Equal(t, con1, con1a)\n\tassert.Len(t, a.connections, 1)\n\t// assert second connection\n\tcon2, err3 := a.GetSpiConnection(busNum, chipNum+1, mode, bits, maxSpeed)\n\trequire.NoError(t, err3)\n\tassert.NotNil(t, con2)\n\tassert.NotEqual(t, con1, con2)\n\tassert.Len(t, a.connections, 2)\n\t// assert bus validation error\n\tcon, err := a.GetSpiConnection(busNum+1, chipNum, mode, bits, maxSpeed)\n\trequire.ErrorContains(t, err, \"16 not valid\")\n\tassert.Nil(t, con)\n\t// assert create error\n\tspi.CreateError = true\n\tcon, err = a.GetSpiConnection(busNum, chipNum+2, mode, bits, maxSpeed)\n\trequire.ErrorContains(t, err, \"error while create SPI connection in mock\")\n\tassert.Nil(t, con)\n}\n\nfunc TestSpiFinalize(t *testing.T) {\n\t// arrange\n\ta, _ := initTestSpiBusAdaptorWithMockedSpi()\n\t_, e := a.GetSpiConnection(spiTestAllowedBus, 2, 3, 4, 5)\n\trequire.NoError(t, e)\n\tassert.Len(t, a.connections, 1)\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Empty(t, a.connections)\n}\n\nfunc TestSpiFinalizeWithError(t *testing.T) {\n\t// arrange\n\ta, spi := initTestSpiBusAdaptorWithMockedSpi()\n\t_, e := a.GetSpiConnection(spiTestAllowedBus, 2, 3, 4, 5)\n\trequire.NoError(t, e)\n\tspi.SetCloseError(true)\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"error while SPI close\")\n}\n\nfunc TestSpiReConnect(t *testing.T) {\n\t// arrange\n\ta, _ := initTestSpiBusAdaptorWithMockedSpi()\n\trequire.NoError(t, a.Finalize())\n\t// act\n\trequire.NoError(t, a.Connect())\n\t// assert\n\tassert.NotNil(t, a.connections)\n\tassert.Empty(t, a.connections)\n}\n"
  },
  {
    "path": "platforms/adaptors/spibusadaptoroptions.go",
    "content": "package adaptors\n\nimport \"gobot.io/x/gobot/v2/system\"\n\n// SpiBusOptionApplier is the interface for spi bus adaptor options. This provides the possibility for change the\n// platform behavior by the user when creating the platform, e.g. by \"NewAdaptor()\".\n// The interface needs to be implemented by each configurable option type.\ntype SpiBusOptionApplier interface {\n\tapply(cfg *spiBusConfiguration)\n}\n\n// spiBusDebugOption is the type to switch on SPI related debug messages.\ntype spiBusDebugOption bool\n\n// spiBusDigitalPinsForSystemSpiOption is the type to switch the default SPI implementation to GPIO usage\ntype spiBusDigitalPinsForSystemSpiOption struct {\n\tsclkPin string\n\tncsPin  string\n\tsdoPin  string\n\tsdiPin  string\n}\n\nfunc (o spiBusDebugOption) String() string {\n\treturn \"switch on debugging for SPI option\"\n}\n\nfunc (o spiBusDigitalPinsForSystemSpiOption) String() string {\n\treturn \"use digital pins for SPI option\"\n}\n\nfunc (o spiBusDebugOption) apply(cfg *spiBusConfiguration) {\n\tcfg.debug = bool(o)\n\tcfg.systemOptions = append(cfg.systemOptions, system.WithSpiDebug())\n}\n\nfunc (o spiBusDigitalPinsForSystemSpiOption) apply(cfg *spiBusConfiguration) {\n\tcfg.systemOptions = append(cfg.systemOptions, system.WithSpiGpioAccess(cfg.spiGpioPinnerProvider, o.sclkPin, o.ncsPin,\n\t\to.sdoPin, o.sdiPin))\n}\n"
  },
  {
    "path": "platforms/adaptors/spibusadaptoroptions_test.go",
    "content": "package adaptors\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc TestNewSpiBusAdaptorWithSpiGpioAccess(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tsclkPin           = \"1\"\n\t\tncsPin            = \"2\"\n\t\tsdoPin            = \"3\"\n\t\tsdiPin            = \"4\"\n\t\tsclkPinTranslated = \"1\"\n\t\tncsPinTranslated  = \"2\"\n\t\tsdoPinTranslated  = \"3\"\n\t\tsdiPinTranslated  = \"4\"\n\t)\n\tsys := system.NewAccesser()\n\tdpa := sys.UseMockDigitalPinAccess()\n\ta := NewSpiBusAdaptor(sys, nil, 1, 2, 3, 4, 5, dpa, WithSpiGpioAccess(sclkPin, ncsPin, sdoPin, sdiPin))\n\t// act\n\trequire.NoError(t, a.Connect())\n\tbus, err := a.sys.NewSpiDevice(0, 0, 0, 0, 1111)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.NotNil(t, bus)\n\tassert.True(t, a.sys.HasSpiGpioAccess())\n\tassert.Equal(t, 1, dpa.AppliedOptions(\"\", sclkPinTranslated))\n\tassert.Equal(t, 1, dpa.AppliedOptions(\"\", ncsPinTranslated))\n\tassert.Equal(t, 1, dpa.AppliedOptions(\"\", sdoPinTranslated))\n\tassert.Equal(t, 0, dpa.AppliedOptions(\"\", sdiPinTranslated)) // already input, so no option applied\n}\n\nfunc TestWithSpiDebug(t *testing.T) {\n\t// arrange\n\tcfg := &spiBusConfiguration{debug: false}\n\t// act\n\tWithSpiDebug().apply(cfg)\n\t// assert\n\tassert.True(t, cfg.debug)\n}\n"
  },
  {
    "path": "platforms/asus/tinkerboard/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/asus/tinkerboard/README.md",
    "content": "# Tinker Board\n\nThe ASUS Tinker Board is a single board SoC computer based on the Rockchip RK3288 processor. It has built-in GPIO, PWM,\nSPI, and I2C interfaces.\n\nFor more info about the Tinker Board, go to [https://www.asus.com/uk/Single-Board-Computer/Tinker-Board/](https://www.asus.com/uk/Single-Board-Computer/Tinker-Board/).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTested OS:\n\n* [Debian TinkerOS](https://github.com/TinkerBoard/debian_kernel/releases)\n* [armbian](https://www.armbian.com/tinkerboard/) with Debian or Ubuntu\n\n> The latest \"Tinker Board Debian 10 V3.0.11\" is official discontinued. Nevertheless it is tested with gobot. There\n> is a known i2c issue with the Kernel 4.4.194 if using block reads. armbian is known to work in this area. We recommend\n> to use \"armbian bookworm minimal\", because it is used for the latest development steps of gobot.\n\n## Configuration steps for the OS\n\n### System access and configuration basics\n\nSome configuration steps are needed to enable drivers and simplify the interaction with your Tinker Board. Once your\nTinker Board has been configured, you do not need to do so again.\n\nNote that these configuration steps must be performed on the Tinker Board itself. The easiest is to login to the Tinker\nBoard via SSH (option \"-4\" is used to force IPv4, which is needed for some versions of TinkerOS):\n\n```sh\nssh -4 <user>@192.168.1.xxx # linaro@192.168.1.xxx\n```\n\n### Enabling hardware drivers\n\nNot all drivers are enabled by default. You can have a look at the configuration file, to find out what is enabled at\nyour system:\n\n```sh\ncat /boot/armbianEnv.txt #/boot/config.txt\n```\n\nThis file can be modified by \"vi\" or \"nano\", it is self explanatory:\n\n```sh\nsudo vi /boot/armbianEnv.txt\n```\n\nNewer versions of OS provide an user interface for configuration with:\n\n```sh\nsudo apt install armbian-config\nsudo armbian-config # tinker-config\n```\n\nAfter configuration was changed, an reboot is necessary.\n\n```sh\nsudo reboot\n```\n\n### Enabling GPIO pins\n\n#### Create a group \"gpio\"\n\nCreate a Linux group named \"gpio\" by running the following command:\n\n```sh\nsudo groupadd -f --system gpio\n```\n\nIf you already have a \"gpio\" group, you can skip to the next step.\n\n#### Add the user to the new \"gpio\" group (TinkerOS only)\n\nAdd the user to be a member of the Linux group named \"gpio\" by running the following command:\n\n```sh\nsudo usermod -a -G gpio <user>\n```\n\nIf you already have added the \"gpio\" group, you can skip to the next step.\n\n#### Add a \"udev\" rules file for gpio (TinkerOS only)\n\nCreate a new \"udev\" rules file for the GPIO on the Tinker Board by running the following command:\n\n```sh\nsudo vi /etc/udev/rules.d/91-gpio.rules\n```\n\nAnd add the following contents to the file:\n\n```txt\nSUBSYSTEM==\"gpio\", KERNEL==\"gpiochip*\", ACTION==\"add\", PROGRAM=\"/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'\"\nSUBSYSTEM==\"gpio\", KERNEL==\"gpio*\", ACTION==\"add\", PROGRAM=\"/bin/sh -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'\"\n```\n\nPress the \"Esc\" key, then press the \":\" key and then the \"q\" key, and then press the \"Enter\" key. This should save your\nfile. After rebooting your Tinker Board, you should be able to run your Gobot code that uses GPIO.\n\n### Enabling I2C\n\n#### Create a group \"i2c\"\n\nIf you already have a \"i2c\" group, you can skip to the next step.  \n\nCreate a Linux group named \"i2c\" by running the following command:\n\n```sh\nsudo groupadd -f --system i2c\n```\n\n#### Add the user to the new \"i2c\" group\n\nIf you already have added the \"i2c\" group, you can skip to the next step.  \n\nAdd the user to be a member of the Linux group named \"i2c\" by running the following command:\n\n```sh\nsudo usermod -a -G gpio <user>\n```\n\n#### Add a \"udev\" rules file for I2C (TinkerOS only)\n\nCreate a new \"udev\" rules file for the I2C on the Tinker Board by running the following command:\n\n```sh\nsudo vi /etc/udev/rules.d/92-i2c.rules\n```\n\nAnd add the following contents to the file:\n\n```txt\nKERNEL==\"i2c-0\"     , GROUP=\"i2c\", MODE=\"0660\"\nKERNEL==\"i2c-[1-9]*\", GROUP=\"i2c\", MODE=\"0666\"\n```\n\nPress the \"Esc\" key, then press the \":\" key and then the \"q\" key, and then press the \"Enter\" key. This should save your\nfile. After rebooting your Tinker Board, you should be able to run your Gobot code that uses I2C.\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := tinkerboard.NewAdaptor()\nled := gpio.NewLedDriver(r, \"7\")\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARM=7 GOARCH=arm GOOS=linux go build examples/tinkerboard_blink.go\n```\n\nOnce you have compiled your code, you can upload your program and execute it on the Tinkerboard from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp tinkerboard_blink <user>@192.168.1.xxx:/home/<user>/\nssh -t <user>@192.168.1.xxx \"./tinkerboard_blink\"\n```\n\n## Troubleshooting\n\n### PWM\n\n#### Investigate state\n\n```sh\n# ls -la /sys/class/pwm/\ntotal 0\ndrwxr-xr-x  2 root root 0 Apr 24 14:11 .\ndrwxr-xr-x 66 root root 0 Apr 24 14:09 ..\nlrwxrwxrwx  1 root root 0 Apr 24 14:09 pwmchip0 -> ../../devices/platform/ff680000.pwm/pwm/pwmchip0\n```\n\nlooking for one of the following items in the path:\nff680000 => internally, not usable\nff680010 => internally, not usable\nff680020 => pwm2, pin33\nff680030 => pwm3, pin32\n\n#### Activate\n\nWhen there is no pwm2, pwm3, this can be activated.\nOpen the file /boot/config.txt and add lines/remove comment sign and adjust:\n\nintf:pwm2=on\nintf:pwm3=on\n\nThen save the file, close and reboot.\n\nAfter reboot check the state:\n\n```sh\n# ls -la /sys/class/pwm/\ntotal 0\ndrwxr-xr-x  2 root root 0 Apr 24 14:11 .\ndrwxr-xr-x 66 root root 0 Apr 24 14:09 ..\nlrwxrwxrwx  1 root root 0 Apr 24 14:09 pwmchip0 -> ../../devices/platform/ff680000.pwm/pwm/pwmchip0\nlrwxrwxrwx  1 root root 0 Apr 24 14:09 pwmchip1 -> ../../devices/platform/ff680010.pwm/pwm/pwmchip1\nlrwxrwxrwx  1 root root 0 Apr 24 14:09 pwmchip2 -> ../../devices/platform/ff680030.pwm/pwm/pwmchip2\n```\n\n#### Test\n\nFor example only pwm3 was activated to use pin32. Connect an oscilloscope or at least a meter to the pin 32.\n\nswitch to root user by \"su -\"\n\ninvestigate state:\n\n```sh\n# ls -la /sys/class/pwm/pwmchip2/\ntotal 0\ndrwxr-xr-x 3 root root    0 Apr 24 14:17 .\ndrwxr-xr-x 3 root root    0 Apr 24 14:17 ..\nlrwxrwxrwx 1 root root    0 Apr 24 14:17 device -> ../../../ff680030.pwm\n--w------- 1 root root 4096 Apr 24 14:17 export\n-r--r--r-- 1 root root 4096 Apr 24 14:17 npwm\ndrwxr-xr-x 2 root root    0 Apr 24 14:17 power\nlrwxrwxrwx 1 root root    0 Apr 24 14:17 subsystem -> ../../../../../class/pwm\n-rw-r--r-- 1 root root 4096 Apr 24 14:17 uevent\n--w------- 1 root root 4096 Apr 24 14:17 unexport\n```\n\n#### Creating pwm0\n\n`echo 0 > /sys/class/pwm/pwmchip2/export`\n\ninvestigate result:\n\n```sh\n# ls /sys/class/pwm/pwmchip2/\ndevice  export  npwm  power  pwm0  subsystem  uevent  unexport\n# ls /sys/class/pwm/pwmchip2/pwm0/\ncapture  duty_cycle  enable  period  polarity  power  uevent\n# cat /sys/class/pwm/pwmchip2/pwm0/period \n0\n# cat /sys/class/pwm/pwmchip2/pwm0/duty_cycle \n0\n# cat /sys/class/pwm/pwmchip2/pwm0/enable \n0\n# cat /sys/class/pwm/pwmchip2/pwm0/polarity \ninversed\n```\n\n#### Initialization\n\nNote: Before writing the period all other write actions will cause an error \"-bash: echo: write error: Invalid argument\"\n\n```sh\necho 10000000 > /sys/class/pwm/pwmchip2/pwm0/period # this is a frequency divider for 1GHz (1000 will produce a frequency of 1MHz, 1000000 will cause a frequency of 1kHz, her we got 100Hz)\necho \"normal\" > /sys/class/pwm/pwmchip2/pwm0/polarity\necho 3000000 > /sys/class/pwm/pwmchip2/pwm0/duty_cycle # this means 30%\necho 1  > /sys/class/pwm/pwmchip2/pwm0/enable\n```\n\nNow we should measure a value of around 1V with the meter, because the basis value is 3.3V and 30% leads to 1V.\n\nTry to inverse the sequence:\n`echo \"inversed\" > /sys/class/pwm/pwmchip2/pwm0/polarity`\nNow we should measure a value of around 2.3V with the meter, which is the difference of 1V to 3.3V.\n\nIf we have attached an oscilloscope we can play around with the values for period and duty_cycle and see what happen.\n"
  },
  {
    "path": "platforms/asus/tinkerboard/adaptor.go",
    "content": "package tinkerboard\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 1\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor represents a Gobot Adaptor for the ASUS Tinker Board\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\t*adaptors.OneWireBusAdaptor\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex *sync.Mutex\n}\n\n// NewAdaptor creates a Tinkerboard Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\t1-wire, see [adaptors.NewOneWireBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\n//\n// note from RK3288 datasheet: \"The pull direction (pullup or pulldown) for all of GPIOs are software-programmable\", but\n// the latter is not working for any pin (armbian 22.08.7)\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser()\n\ta := &Adaptor{\n\t\tname:  gobot.DefaultName(\"Tinker Board\"),\n\t\tsys:   sys,\n\t\tmutex: &sync.Mutex{},\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tvar oneWireBusOpts []adaptors.OneWireBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tcase adaptors.OneWireBusOptionApplier:\n\t\t\toneWireBusOpts = append(oneWireBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinDefinitions)\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions)\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, pwmPinDefinitions)\n\t// Valid bus numbers are [0..4] which corresponds to /dev/i2c-0 through /dev/i2c-4.\n\t// We don't support \"/dev/i2c-6 DesignWare HDMI\".\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1, 2, 3, 4})\n\t// Valid bus numbers are [0,2] which corresponds to /dev/spidev0.x, /dev/spidev2.x\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 2})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, digitalPinTranslator.Translate, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, pwmPinTranslator.Translate, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\ta.OneWireBusAdaptor = adaptors.NewOneWireBusAdaptor(sys, oneWireBusOpts...)\n\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.OneWireBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board, pins and bus\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.OneWireBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n"
  },
  {
    "path": "platforms/asus/tinkerboard/adaptor_test.go",
    "content": "package tinkerboard\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmDir           = \"/sys/devices/platform/ff680020.pwm/pwm/pwmchip2/\" //nolint:gosec // false positive\n\tpwmPwmDir        = pwmDir + \"pwm0/\"\n\tpwmExportPath    = pwmDir + \"export\"\n\tpwmUnexportPath  = pwmDir + \"unexport\"\n\tpwmEnablePath    = pwmPwmDir + \"enable\"\n\tpwmPeriodPath    = pwmPwmDir + \"period\"\n\tpwmDutyCyclePath = pwmPwmDir + \"duty_cycle\"\n\tpwmPolarityPath  = pwmPwmDir + \"polarity\"\n\n\tpwmInvertedIdentifier = \"inversed\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwmEnablePath,\n\tpwmPeriodPath,\n\tpwmDutyCyclePath,\n\tpwmPolarityPath,\n}\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ gpio.ServoWriter            = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc preparePwmFs(fs *system.MockFilesystem) {\n\tfs.Files[pwmEnablePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPolarityPath].Contents = pwmInvertedIdentifier\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := initConnectedTestAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\treturn a, fs\n}\n\nfunc initConnectedTestAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Tinker Board\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.mutex)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.NotNil(t, a.OneWireBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip0\", \"17\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"gpiochip5\", \"8\", []int{3})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 3, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip0\", \"17\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip5\", \"8\"))\n}\n\nfunc TestDigitalIOSysfs(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewAdaptor(adaptors.WithGpioSysfsAccess())\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"\", \"17\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"\", \"160\", []int{4})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 4, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"17\"))\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"160\"))\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/class/thermal/thermal_zone0/temp\"].Contents = \"567\\n\"\n\tgot, err := a.AnalogRead(\"thermal_zone0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 567, got)\n\n\t_, err = a.AnalogRead(\"thermal_zone10\")\n\trequire.ErrorContains(t, err, \"'thermal_zone10' is not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"thermal_zone0\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\trequire.NoError(t, a.DigitalWrite(\"7\", 1))\n\tdpa.UseUnexportError(\"gpiochip0\", \"17\")\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"unexport error\")\n}\n\nfunc TestFinalizeErrorAfterPWM(t *testing.T) {\n\t// indirect test for PWM.Finalize() is called for the adaptor\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tpreparePwmFs(fs)\n\trequire.NoError(t, a.PwmWrite(\"33\", 1))\n\tfs.WithWriteError = true\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, 8, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 1, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-4\"})\n\tcon, err := a.GetI2cConnection(0xff, 4)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/asus/tinkerboard/doc.go",
    "content": "/*\nPackage tinkerboard contains the Gobot adaptor for the ASUS Tinker Board.\n\nFor further information refer to tinkerboard README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/asus/tinkerboard/README.md\n*/\npackage tinkerboard // import \"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n"
  },
  {
    "path": "platforms/asus/tinkerboard/pinmap.go",
    "content": "package tinkerboard\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// notes for character device\n// pins: A=0+Nr, B=8+Nr, C=16+Nr\n// tested: armbian Linux, OK: work as input and output, IN: work only as input\nvar gpioPinDefinitions = adaptors.DigitalPinDefinitions{\n\t\"7\":  {Sysfs: 17, Cdev: adaptors.CdevPin{Chip: 0, Line: 17}},  // GPIO0_C1_CLKOUT - OK\n\t\"10\": {Sysfs: 160, Cdev: adaptors.CdevPin{Chip: 5, Line: 8}},  // GPIO5_B0_UART1RX - IN, initial 1\n\t\"8\":  {Sysfs: 161, Cdev: adaptors.CdevPin{Chip: 5, Line: 9}},  // GPIO5_B1_UART1TX - NO, initial 1\n\t\"16\": {Sysfs: 162, Cdev: adaptors.CdevPin{Chip: 5, Line: 10}}, // GPIO5_B2_UART1CTSN - NO, initial 0\n\t\"18\": {Sysfs: 163, Cdev: adaptors.CdevPin{Chip: 5, Line: 11}}, // GPIO5_B3_UART1RTSN - NO, initial 0\n\t\"11\": {Sysfs: 164, Cdev: adaptors.CdevPin{Chip: 5, Line: 12}}, // GPIO5_B4_SPI0CLK_UART4CTSN - NO, initial 0\n\t\"29\": {Sysfs: 165, Cdev: adaptors.CdevPin{Chip: 5, Line: 13}}, // GPIO5_B5_SPI0CSN_UART4RTSN - NO, initial 0\n\t\"13\": {Sysfs: 166, Cdev: adaptors.CdevPin{Chip: 5, Line: 14}}, // GPIO5_B6_SPI0_TXD_UART4TX - NO, initial 1\n\t\"15\": {Sysfs: 167, Cdev: adaptors.CdevPin{Chip: 5, Line: 15}}, // GPIO5_B7_SPI0_RXD_UART4RX - IN, initial 1\n\t\"31\": {Sysfs: 168, Cdev: adaptors.CdevPin{Chip: 5, Line: 16}}, // GPIO5_C0_SPI0CSN1 - OK if SPI0 off\n\t\"22\": {Sysfs: 171, Cdev: adaptors.CdevPin{Chip: 5, Line: 19}}, // GPIO5_C3 - OK\n\t\"12\": {Sysfs: 184, Cdev: adaptors.CdevPin{Chip: 6, Line: 0}},  // GPIO6_A0_PCM/I2S_CLK - NO, initial 1\n\t\"35\": {Sysfs: 185, Cdev: adaptors.CdevPin{Chip: 6, Line: 1}},  // GPIO6_A1_PCM/I2S_FS - NO, initial 0\n\t\"38\": {Sysfs: 187, Cdev: adaptors.CdevPin{Chip: 6, Line: 3}},  // GPIO6_A3_PCM/I2S_SDI - IN, initial 1\n\t\"40\": {Sysfs: 188, Cdev: adaptors.CdevPin{Chip: 6, Line: 4}},  // GPIO6_A4_PCM/I2S_SDO - NO, initial 0\n\t\"36\": {Sysfs: 223, Cdev: adaptors.CdevPin{Chip: 7, Line: 7}},  // GPIO7_A7_UART3RX - IN, initial 1\n\t\"37\": {Sysfs: 224, Cdev: adaptors.CdevPin{Chip: 7, Line: 8}},  // GPIO7_B0_UART3TX - NO, initial 1\n\t\"27\": {Sysfs: 233, Cdev: adaptors.CdevPin{Chip: 7, Line: 17}}, // GPIO7_C1_I2C4_SDA - OK if I2C4 off\n\t\"28\": {Sysfs: 234, Cdev: adaptors.CdevPin{Chip: 7, Line: 18}}, // GPIO7_C2_I2C_SCL - OK if I2C4 off\n\t\"33\": {Sysfs: 238, Cdev: adaptors.CdevPin{Chip: 7, Line: 22}}, // GPIO7_C6_UART2RX_PWM2 - IN, initial 1\n\t\"32\": {Sysfs: 239, Cdev: adaptors.CdevPin{Chip: 7, Line: 23}}, // GPIO7_C7_UART2TX_PWM3 - NO, initial 1\n\t\"26\": {Sysfs: 251, Cdev: adaptors.CdevPin{Chip: 8, Line: 3}},  // GPIO8_A3_SPI2CSN1 - OK if SPI2 off\n\t\"3\":  {Sysfs: 252, Cdev: adaptors.CdevPin{Chip: 8, Line: 4}},  // GPIO8_A4_I2C1_SDA - OK if I2C1 off\n\t\"5\":  {Sysfs: 253, Cdev: adaptors.CdevPin{Chip: 8, Line: 5}},  // GPIO8_A5_I2C1_SCL - OK if I2C1 off\n\t\"23\": {Sysfs: 254, Cdev: adaptors.CdevPin{Chip: 8, Line: 6}},  // GPIO8_A6_SPI2CLK - OK if SPI2 off\n\t\"24\": {Sysfs: 255, Cdev: adaptors.CdevPin{Chip: 8, Line: 7}},  // GPIO8_A7_SPI2CSN0 - OK if SPI2 off\n\t\"21\": {Sysfs: 256, Cdev: adaptors.CdevPin{Chip: 8, Line: 8}},  // GPIO8_B0_SPI2RXD - OK if SPI2 off\n\t\"19\": {Sysfs: 257, Cdev: adaptors.CdevPin{Chip: 8, Line: 9}},  // GPIO8_B1_SPI2TXD - OK if SPI2 off\n}\n\nvar pwmPinDefinitions = adaptors.PWMPinDefinitions{\n\t// GPIO7_C6_UART2RX_PWM2\n\t\"33\": {Dir: \"/sys/devices/platform/ff680020.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2]$\", Channel: 0},\n\t// GPIO7_C7_UART2TX_PWM3\n\t\"32\": {Dir: \"/sys/devices/platform/ff680030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3]$\", Channel: 0},\n}\n\nvar analogPinDefinitions = adaptors.AnalogPinDefinitions{\n\t// +/-273.200 °C need >=7 characters to read: +/-273200 millidegree Celsius\n\t\"thermal_zone0\": {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n\t\"thermal_zone1\": {Path: \"/sys/class/thermal/thermal_zone1/temp\", W: false, ReadBufLen: 7},\n}\n"
  },
  {
    "path": "platforms/asus/tinkerboard2/README.md",
    "content": "# Tinker Board 2\n\nThe ASUS Tinker Board 2 is a single board SoC computer based on the Rockchip RK3399 processor (arm64). It has built-in\nGPIO, I2C, PWM, SPI, 1-Wire, MIPI CSI and MIPI DSI interfaces.\n\nFor more info about the Tinker Board, go to [https://tinker-board.asus.com/series/tinker-board-2.html/](https://tinker-board.asus.com/series/tinker-board-2.html).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTested OS:\n\n* [armbian](https://www.armbian.com/tinkerboard-2/) with Debian\n\n### System access and configuration basics\n\nUse `sudo armbian-config` or see description for [Tinker Board](../README.md).\n\n### Enabling hardware drivers\n\nSee description for [Tinker Board](../README.md).\n\n### Enabling GPIO pins\n\nSee description for [Tinker Board](../README.md).\n\n### Enabling I2C\n\nSee description for [Tinker Board](../README.md).\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := tinkerboard2.NewAdaptor()\nled := gpio.NewLedDriver(r, \"7\")\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=arm64 GOOS=linux go build -o output/ examples/tinkerboard2_yl40.go\n```\n\nOnce you have compiled your code, you can upload your program and execute it on the Tinker Board 2 from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp output/tinkerboard2_yl40 <user>@192.168.1.xxx:~\nssh -t <user>@192.168.1.xxx \"./tinkerboard2_yl40\"\n```\n\n## Troubleshooting\n\n### I2C\n\nThe version \"Armbian_community 25.2.0-trunk.124 bookworm\" contains by default the overlay for i2c7 (header pins 27, 28)\nand i2c8 (connection on DSI_1, DSI_2). An overlay for i2c6 (header pins 3, 5) needs to be created manually based on one\nof the other overlays.\n\n### PWM\n\n#### Investigate state\n\n```sh\n# ls -la /sys/class/pwm/\nls -la /sys/class/pwm/\ntotal 0\ndrwxr-xr-x  2 root root 0 Jan 18  2013 .\ndrwxr-xr-x 77 root root 0 Jan 18  2013 ..\nlrwxrwxrwx  1 root root 0 Jan 18  2013 pwmchip0 -> ../../devices/platform/ff420020.pwm/pwm/pwmchip0\n```\n\nlooking for one of the following items in the path:\nff420000 => pwm0, pin32\nff420010 => pwm1, pin33\nff420020 => pwm2, already activated, but internally, not usable\nff420030 => pwm3, pin26\n\n#### Activate\n\nThe version \"Armbian_community 25.2.0-trunk.124 bookworm\" contains no overlay for pwm0, pwm1 or pwm3. This needs to be\ncreated based on another overlay, e.g. `rockchip-rk3568-hk-pwm1.dtbo`. After activation of your preferred pwmchip,\nproceed like described for [Tinker Board](../README).\n"
  },
  {
    "path": "platforms/asus/tinkerboard2/adaptor.go",
    "content": "package tinkerboard2\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/asus/tinkerboard\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 7 // i2c-7 (header pins 27, 28)\n\n\tdefaultSpiBusNumber  = 1 // spidev1.x (header pins 19, 21, 23, 24)\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\ntype Tinkerboard2Adaptor struct {\n\t*tinkerboard.Adaptor\n\n\tsys *system.Accesser // used for unit tests only\n}\n\n// NewAdaptor creates a Tinkerboard-2 Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\n// Further optional parameters for:\n//\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Tinkerboard2Adaptor {\n\tsys := system.NewAccesser()\n\ta := Tinkerboard2Adaptor{\n\t\tAdaptor: tinkerboard.NewAdaptor(opts...),\n\t\tsys:     sys,\n\t}\n\ta.SetName(gobot.DefaultName(\"Tinker Board 2\"))\n\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.Name()))\n\t\t}\n\t}\n\n\t// note: only adaptors different from tinkerboard needs to be re-assigned\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions)\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, pwmPinDefinitions)\n\t// Valid bus numbers are [6..8] which corresponds to /dev/i2c-6 through /dev/i2c-8.\n\t// We don't support \"/dev/i2c-0, /dev/i2c-3, /dev/i2c-4\".\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{6, 7, 8})\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{1, 5})\n\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, digitalPinTranslator.Translate, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, pwmPinTranslator.Translate, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\n\treturn &a\n}\n"
  },
  {
    "path": "platforms/asus/tinkerboard2/adaptor_test.go",
    "content": "package tinkerboard2\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n)\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Tinkerboard2Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Tinker Board 2\"))\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n"
  },
  {
    "path": "platforms/asus/tinkerboard2/pinmap.go",
    "content": "package tinkerboard2\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// notes for character device\n// pins: A=0+Nr, B=8+Nr, C=16+Nr, D=24+Nr\n// tested: armbian Linux, OK: work as input and output, IN: work only as input\n// MIPI ports itself not wired yet\nvar gpioPinDefinitions = adaptors.DigitalPinDefinitions{\n\t\"26\":    {Sysfs: 6, Cdev: adaptors.CdevPin{Chip: 0, Line: 6}},    // GPIO0_A6_PWM3A_IR - OK, PWM OK\n\t\"7\":     {Sysfs: 8, Cdev: adaptors.CdevPin{Chip: 0, Line: 8}},    // GPIO0_B0_TEST_CLKOUT2 - OK\n\t\"21\":    {Sysfs: 39, Cdev: adaptors.CdevPin{Chip: 1, Line: 7}},   // GPIO1_A7_SPI1_RXD_UART4_RXD - OK\n\t\"19\":    {Sysfs: 40, Cdev: adaptors.CdevPin{Chip: 1, Line: 8}},   // GPIO1_B0_SPI1_TXD_UART4_TXD - OK\n\t\"23\":    {Sysfs: 41, Cdev: adaptors.CdevPin{Chip: 1, Line: 9}},   // GPIO1_B1_SPI1_CLK - OK\n\t\"24\":    {Sysfs: 42, Cdev: adaptors.CdevPin{Chip: 1, Line: 10}},  // GPIO1_B2_SPI1_CSN - OK\n\t\"DSI_1\": {Sysfs: 48, Cdev: adaptors.CdevPin{Chip: 1, Line: 20}},  // GPIO1_C4_I2C8_SDA - ?\n\t\"DSI_2\": {Sysfs: 48, Cdev: adaptors.CdevPin{Chip: 1, Line: 21}},  // GPIO1_C5_I2C8_SCL - ?\n\t\"27\":    {Sysfs: 71, Cdev: adaptors.CdevPin{Chip: 2, Line: 7}},   // GPIO2_A7_I2C7_SDA - OK\n\t\"28\":    {Sysfs: 72, Cdev: adaptors.CdevPin{Chip: 2, Line: 8}},   // GPIO2_B0_I2C7_SCL - OK\n\t\"3\":     {Sysfs: 73, Cdev: adaptors.CdevPin{Chip: 2, Line: 9}},   // GPIO2_B1_I2C6_SDA - OK\n\t\"5\":     {Sysfs: 74, Cdev: adaptors.CdevPin{Chip: 2, Line: 10}},  // GPIO2_B2_I2C6_SCL - OK\n\t\"CSI_3\": {Sysfs: 75, Cdev: adaptors.CdevPin{Chip: 2, Line: 11}},  // GPIO2_B3_CSI_CLKOUT - ?\n\t\"10\":    {Sysfs: 80, Cdev: adaptors.CdevPin{Chip: 2, Line: 16}},  // GPIO2_C0_UART0_RXD - OK\n\t\"8\":     {Sysfs: 81, Cdev: adaptors.CdevPin{Chip: 2, Line: 17}},  // GPIO2_C1_UART0_TXD - OK\n\t\"36\":    {Sysfs: 82, Cdev: adaptors.CdevPin{Chip: 2, Line: 18}},  // GPIO2_C2_UART0_CTSN - OK\n\t\"11\":    {Sysfs: 83, Cdev: adaptors.CdevPin{Chip: 2, Line: 19}},  // GPIO2_C3_UART0_RTSN - OK\n\t\"15\":    {Sysfs: 84, Cdev: adaptors.CdevPin{Chip: 2, Line: 20}},  // GPIO2_C4_SPI5_RX - OK\n\t\"13\":    {Sysfs: 85, Cdev: adaptors.CdevPin{Chip: 2, Line: 21}},  // GPIO2_C5_SPI5_TX - OK\n\t\"16\":    {Sysfs: 86, Cdev: adaptors.CdevPin{Chip: 2, Line: 22}},  // GPIO2_C6_SPI5_CLK - OK\n\t\"18\":    {Sysfs: 87, Cdev: adaptors.CdevPin{Chip: 2, Line: 23}},  // GPIO2_C7_SPI5_CSN - OK\n\t\"12\":    {Sysfs: 120, Cdev: adaptors.CdevPin{Chip: 3, Line: 24}}, // GPIO3_D0_I2S0_SCLK - OK\n\t\"35\":    {Sysfs: 121, Cdev: adaptors.CdevPin{Chip: 3, Line: 25}}, // GPIO3_D1_I2S0_FS - OK (smooth digital behavior)\n\t\"38\":    {Sysfs: 123, Cdev: adaptors.CdevPin{Chip: 3, Line: 27}}, // GPIO3_D3_I2S0_SDI0 - OK\n\t\"22\":    {Sysfs: 124, Cdev: adaptors.CdevPin{Chip: 3, Line: 28}}, // GPIO3_D4_I2S0_SDO3 - OK\n\t\"31\":    {Sysfs: 125, Cdev: adaptors.CdevPin{Chip: 3, Line: 29}}, // GPIO3_D5_I2S0_SDO2 - OK\n\t\"29\":    {Sysfs: 126, Cdev: adaptors.CdevPin{Chip: 3, Line: 30}}, // GPIO3_D6_I2S0_SDO1 - OK\n\t\"40\":    {Sysfs: 127, Cdev: adaptors.CdevPin{Chip: 3, Line: 31}}, // GPIO3_D7_I2S0_SDO0 - OK\n\t\"CSI_1\": {Sysfs: 128, Cdev: adaptors.CdevPin{Chip: 4, Line: 1}},  // GPIO4_A1_I2C1_SDA -?\n\t\"CSI_2\": {Sysfs: 129, Cdev: adaptors.CdevPin{Chip: 4, Line: 2}},  // GPIO4_A2_I2C1_SCL -?\n\t\"CSI_4\": {Sysfs: 130, Cdev: adaptors.CdevPin{Chip: 4, Line: 3}},  // GPIO4_A3_CSI_GPIO -?\n\t\"32\":    {Sysfs: 146, Cdev: adaptors.CdevPin{Chip: 4, Line: 18}}, // GPIO4_C2_PWM0 - OK, PWM OK\n\t\"J6_1\":  {Sysfs: 147, Cdev: adaptors.CdevPin{Chip: 4, Line: 19}}, // GPIO4_C3_UART2_RX -?\n\t\"J6_2\":  {Sysfs: 148, Cdev: adaptors.CdevPin{Chip: 4, Line: 20}}, // GPIO4_C4_UART2_TX -?\n\t\"37\":    {Sysfs: 149, Cdev: adaptors.CdevPin{Chip: 4, Line: 21}}, // GPIO4_C5_SPDIF_TX - OK\n\t\"33\":    {Sysfs: 150, Cdev: adaptors.CdevPin{Chip: 4, Line: 22}}, // GPIO4_C6_PWM1 - OK, PWM OK\n}\n\nvar pwmPinDefinitions = adaptors.PWMPinDefinitions{\n\t// needs to be enabled by device tree (pwm0)\n\t\"32\": {Dir: \"/sys/devices/platform/ff420000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3]$\", Channel: 0},\n\t// needs to be enabled by device tree (pwm1)\n\t\"33\": {Dir: \"/sys/devices/platform/ff420010.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3]$\", Channel: 0},\n\t// needs to be enabled by device tree (pwm3)\n\t\"26\": {Dir: \"/sys/devices/platform/ff420030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3]$\", Channel: 0},\n}\n\n// analog pins are the same as for tinkerboard\n"
  },
  {
    "path": "platforms/audio/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/audio/audio_adaptor.go",
    "content": "// Package audio is based on aplay audio adaptor written by @colemanserious (https://github.com/colemanserious)\npackage audio\n\nimport (\n\t\"errors\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Adaptor is gobot Adaptor connection to audio playback\ntype Adaptor struct {\n\tname string\n}\n\n// NewAdaptor returns a new audio Adaptor\nfunc NewAdaptor() *Adaptor {\n\treturn &Adaptor{name: gobot.DefaultName(\"Audio\")}\n}\n\n// Name returns the Adaptor Name\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the Adaptor Name\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect establishes a connection to the Audio adaptor\nfunc (a *Adaptor) Connect() error { return nil }\n\n// Finalize terminates the connection to the Audio adaptor\nfunc (a *Adaptor) Finalize() error { return nil }\n\n// Sound plays a sound and accepts:\n//\n//\tstring: The filename of the audio to start playing\nfunc (a *Adaptor) Sound(fileName string) []error {\n\tvar errorsList []error\n\n\tif fileName == \"\" {\n\t\tlog.Println(\"Requires filename for audio file.\")\n\t\terrorsList = append(errorsList, errors.New(\"requires filename for audio file\"))\n\t\treturn errorsList\n\t}\n\n\t_, err := os.Stat(fileName)\n\tif err != nil {\n\t\tlog.Println(err)\n\t\terrorsList = append(errorsList, err)\n\t\treturn errorsList\n\t}\n\n\t// command to play audio file based on file type\n\tcommandName, err := CommandName(fileName)\n\tif err != nil {\n\t\tlog.Println(err)\n\t\terrorsList = append(errorsList, err)\n\t\treturn errorsList\n\t}\n\n\terr = RunCommand(commandName, fileName)\n\tif err != nil {\n\t\tlog.Println(err)\n\t\terrorsList = append(errorsList, err)\n\t\treturn errorsList\n\t}\n\n\t// Need to return to fulfill function sig, even though returning an empty\n\treturn nil\n}\n\n// CommandName defines the playback command for a sound and accepts:\n//\n//\tstring: The filename of the audio that needs playback\nfunc CommandName(fileName string) (string, error) {\n\tfileType := path.Ext(fileName)\n\tswitch fileType {\n\tcase \".mp3\":\n\t\treturn \"mpg123\", nil\n\tcase \".wav\":\n\t\treturn \"aplay\", nil\n\tdefault:\n\t\treturn \"\", errors.New(\"unknown filetype for audio file\")\n\t}\n}\n\nvar execCommand = exec.Command\n\n// RunCommand executes the playback command for a sound file and accepts:\n//\n//\tstring: The audio command to be use for playback\n//\tstring: The filename of the audio that needs playback\nfunc RunCommand(audioCommand string, filename string) error {\n\tcmd := execCommand(audioCommand, filename)\n\terr := cmd.Start()\n\treturn err\n}\n"
  },
  {
    "path": "platforms/audio/audio_adaptor_test.go",
    "content": "// Based on aplay audio adaptor written by @colemanserious (https://github.com/colemanserious)\npackage audio\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc TestAudioAdaptor(t *testing.T) {\n\ta := NewAdaptor()\n\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestAudioAdaptorName(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Audio\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestAudioAdaptorCommandsWav(t *testing.T) {\n\tcmd, _ := CommandName(\"whatever.wav\")\n\tassert.Equal(t, \"aplay\", cmd)\n}\n\nfunc TestAudioAdaptorCommandsMp3(t *testing.T) {\n\tcmd, _ := CommandName(\"whatever.mp3\")\n\tassert.Equal(t, \"mpg123\", cmd)\n}\n\nfunc TestAudioAdaptorCommandsUnknown(t *testing.T) {\n\tcmd, err := CommandName(\"whatever.unk\")\n\tassert.NotEqual(t, \"mpg123\", cmd)\n\trequire.ErrorContains(t, err, \"unknown filetype for audio file\")\n}\n\nfunc TestAudioAdaptorSoundWithNoFilename(t *testing.T) {\n\ta := NewAdaptor()\n\n\terrors := a.Sound(\"\")\n\trequire.ErrorContains(t, errors[0], \"requires filename for audio file\")\n}\n\nfunc TestAudioAdaptorSoundWithNonexistingFilename(t *testing.T) {\n\ta := NewAdaptor()\n\n\terrors := a.Sound(\"doesnotexist.mp3\")\n\trequire.ErrorContains(t, errors[0], \"stat doesnotexist.mp3: no such file or directory\")\n}\n\nfunc TestAudioAdaptorSoundWithValidMP3Filename(t *testing.T) {\n\texecCommand = myExecCommand\n\n\ta := NewAdaptor()\n\tdefer func() { execCommand = exec.Command }()\n\n\terrors := a.Sound(\"../../examples/laser.mp3\")\n\n\tassert.Empty(t, errors)\n}\n\nfunc myExecCommand(command string, args ...string) *exec.Cmd {\n\tcs := []string{\"-test.run=TestHelperProcess\", \"--\", command}\n\tcs = append(cs, args...)\n\tcmd := exec.CommandContext(context.Background(), os.Args[0], cs...) //nolint:gosec // ok for test\n\tcmd.Env = []string{\"GO_WANT_HELPER_PROCESS=1\"}\n\treturn cmd\n}\n"
  },
  {
    "path": "platforms/audio/audio_driver.go",
    "content": "// Package audio is based on aplay audio adaptor written by @colemanserious (https://github.com/colemanserious)\npackage audio\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Driver is gobot software device for audio playback\ntype Driver struct {\n\tgobot.Eventer\n\tgobot.Commander\n\n\tname       string\n\tconnection gobot.Connection\n\tinterval   time.Duration\n\thalt       chan bool\n\tfilename   string\n}\n\n// NewDriver returns a new audio Driver. It accepts:\n//\n// *Adaptor: The audio adaptor to use for the driver\n//\n//\tstring: The filename of the audio to start playing\nfunc NewDriver(a *Adaptor, filename string) *Driver {\n\treturn &Driver{\n\t\tname:       gobot.DefaultName(\"Audio\"),\n\t\tconnection: a,\n\t\tinterval:   500 * time.Millisecond,\n\t\tfilename:   filename,\n\t\thalt:       make(chan bool),\n\t\tEventer:    gobot.NewEventer(),\n\t\tCommander:  gobot.NewCommander(),\n\t}\n}\n\n// Name returns the Driver Name\nfunc (d *Driver) Name() string { return d.name }\n\n// SetName sets the Driver Name\nfunc (d *Driver) SetName(n string) { d.name = n }\n\n// Filename returns the file name for the driver to playback\nfunc (d *Driver) Filename() string { return d.filename }\n\n// Connection returns the Driver Connection\nfunc (d *Driver) Connection() gobot.Connection {\n\treturn d.connection\n}\n\n// Sound plays back a sound file. It accepts:\n//\n//\tstring: The filename of the audio to start playing\nfunc (d *Driver) Sound(fileName string) []error {\n\t//nolint:forcetypeassert // ok here\n\treturn d.Connection().(*Adaptor).Sound(fileName)\n}\n\n// Play plays back the current sound file.\nfunc (d *Driver) Play() []error {\n\treturn d.Sound(d.Filename())\n}\n\n// Start starts the Driver\nfunc (d *Driver) Start() error {\n\treturn nil\n}\n\n// Halt halts the Driver\nfunc (d *Driver) Halt() error {\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/audio/audio_driver_test.go",
    "content": "// Based on aplay audio adaptor written by @colemanserious (https://github.com/colemanserious)\n\npackage audio\n\nimport (\n\t\"os/exec\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc TestAudioDriver(t *testing.T) {\n\td := NewDriver(NewAdaptor(), \"../../examples/laser.mp3\")\n\n\tassert.Equal(t, \"../../examples/laser.mp3\", d.Filename())\n\n\tassert.NotNil(t, d.Connection())\n\n\trequire.NoError(t, d.Start())\n\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestAudioDriverName(t *testing.T) {\n\td := NewDriver(NewAdaptor(), \"\")\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Audio\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestAudioDriverSoundWithNoFilename(t *testing.T) {\n\td := NewDriver(NewAdaptor(), \"\")\n\n\terrors := d.Sound(\"\")\n\trequire.ErrorContains(t, errors[0], \"requires filename for audio file\")\n}\n\nfunc TestAudioDriverSoundWithDefaultFilename(t *testing.T) {\n\texecCommand = myExecCommand\n\tdefer func() { execCommand = exec.Command }()\n\n\td := NewDriver(NewAdaptor(), \"../../examples/laser.mp3\")\n\n\terrors := d.Play()\n\tassert.Empty(t, errors)\n}\n"
  },
  {
    "path": "platforms/audio/doc.go",
    "content": "/*\nPackage audio provides the Gobot adaptor for audio.\n\nFor more information refer to the README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/audio/README.md\n*/\npackage audio // import \"gobot.io/x/gobot/v2/platforms/audio\"\n"
  },
  {
    "path": "platforms/beagleboard/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/beagleboard/README.md",
    "content": "# BeagleBoard devices\n\nThe BeagleBone is an ARM based single board computer, with lots of GPIO, I2C, and analog interfaces built in.\n\nThe Gobot adaptor for the BeagleBone supports all of the various BeagleBone boards such as the BeagleBone Black,\nSeeedStudio BeagleBone Green, SeeedStudio BeagleBone Green Wireless, and others that use the latest Debian and standard\n\"Cape Manager\" interfaces.\n\nFor more info about the BeagleBone platform go to  [http://beagleboard.org/getting-started](http://beagleboard.org/getting-started).\n\nIn addition, there is an separate Adaptor for the PocketBeagle, a USB-key-fob sized computer. The PocketBeagle has a\ndifferent pin layout and somewhat different capabilities.\n\nFor more info about the PocketBeagle platform go to  [http://beagleboard.org/pocket](http://beagleboard.org/pocket).\n\n## How to Install\n\nWe recommend updating to the latest Debian OS when using the BeagleBone. The current Gobot only supports 4.x versions of\nthe OS. If you need support for older versions of the OS, you will need to use Gobot v1.4.\n\nYou would normally install Go and Gobot on your workstation. Once installed, cross compile your program on your workstation,\ntransfer the final executable to your BeagleBone, and run the program on the BeagleBone itself as documented here.\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\nGobot also has support for the four built-in LEDs, by referring to them as `usr0`, `usr1`, `usr2` and `usr3`.\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n)\n\nfunc main() {\n  beagleBoneAdaptor := beaglebone.NewAdaptor()\n  led := gpio.NewLedDriver(beagleBoneAdaptor, \"P9_12\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"blinkBot\",\n    []gobot.Connection{beagleBoneAdaptor},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nTo use the PocketBeagle, use `pocketbeagle.NewAdaptor()` like this:\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/beagleboard/pocketbeagle\"\n)\n\nfunc main() {\n  pocketBeagleAdaptor := pocketbeagle.NewAdaptor()\n  led := gpio.NewLedDriver(pocketBeagleAdaptor, \"P1_02\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"pocketBeagleBot\",\n    []gobot.Connection{pocketBeagleAdaptor},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARM=7 GOARCH=arm GOOS=linux go build -o output/ examples/beaglebone_blink.go\n```\n\nOnce you have compiled your code, you can you can upload your program and execute it on the BeagleBone from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp output/beaglebone_blink debian@192.168.7.2:/home/debian/\nssh -t debian@192.168.7.2 \"./beaglebone_blink\"\n```\n\nIn order to run the preceding commands, you must be running the official Debian Linux through the usb->ethernet connection,\nor be connected to the board using WiFi.\n\nYou must also configure hardware settings as described below.\n\n### Updating your board to the latest OS\n\nWe recommend using your BeagleBone with the latest Debian OS. It is very easy to do this using the Etcher (<https://etcher.io/>)\nutility program.\n\nFirst, download the latest BeagleBone OS from <http://beagleboard.org/latest-images>\n\nNow, use Etcher to create an SD card with the OS image you have downloaded.\n\nOnce you have created the SD card, boot your BeagleBone using the new image as follows:\n\n- Insert SD card into your (powered-down) board, hold down the USER/BOOT button (if using Black) and apply power, either\n  by the USB cable or 5V adapter.\n\n- If all you want to do it boot once from the SD card, it should now be booting.\n\n- If using BeagleBone Black and desire to write the image to your on-board eMMC, you'll need to follow the instructions at\n  <http://elinux.org/Beagleboard:BeagleBoneBlack_Debian#Flashing_eMMC>. When the flashing is complete, all 4 USRx LEDs\n  will be steady on or off. The latest Debian flasher images automatically power down the board upon completion. This can\n  take up to 45 minutes. Power-down your board, remove the SD card and apply power again to be complete.\n\nThese instructions come from the Beagleboard web site's \"Getting Started\" page located here:\n\n<http://beagleboard.org/getting-started>\n\n### Configure hardware settings\n\nThanks to the BeagleBone team, the new \"U-Boot Overlays\" system for enabling hardware and the \"cape-universal\", the latest\nDebian OS should \"just work\" with any GPIO, PWM, I2C, or SPI pins.\n\nIf you want to dig in and learn more about this check out:\n\n<https://elinux.org/Beagleboard:BeagleBoneBlack_Debian#U-Boot_Overlays>\n\n### Upgrading from an older version\n\nPlease note that if you are upgrading a board that has already run from an older version of Debian OS, you might need to\nclear out your older eMMC bootloader, otherwise the new U-Boot Overlays in the newer U-Boot may not get enabled. If so,\nlogin using SSH and run the following command on your BeagleBone board:\n\n`sudo dd if=/dev/zero of=/dev/mmcblk1 count=1 seek=1 bs=128k`\n\nThanks to [@RobertCNelson](https://github.com/RobertCNelson) for the tip on the above.\n"
  },
  {
    "path": "platforms/beagleboard/beaglebone/adaptor.go",
    "content": "package beaglebone\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmPeriodDefault = 500000 // 0.5 ms = 2 kHz\n\n\tdefaultI2cBusNumber = 2\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor is the gobot.Adaptor representation for the Beaglebone Black/Green\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname   string\n\tsys    *system.Accesser\n\tmutex  *sync.Mutex\n\tusrLed string\n}\n\n// NewAdaptor returns a new Beaglebone Black/Green Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of sysfs\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, bbbPwmPinMap)\n\ta := &Adaptor{\n\t\tname:   gobot.DefaultName(\"BeagleboneBlack\"),\n\t\tsys:    sys,\n\t\tmutex:  &sync.Mutex{},\n\t\tusrLed: \"/sys/class/leds/beaglebone:green:\",\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tpwmPinsOpts := []adaptors.PwmPinsOptionApplier{adaptors.WithPWMDefaultPeriod(pwmPeriodDefault)}\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, bbbAnalogPinMap)\n\t// Valid bus number is either 0 or 2 which corresponds to /dev/i2c-0 or /dev/i2c-2.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 2})\n\t// Valid bus numbers are [0,1] which corresponds to /dev/spidev0.x through /dev/spidev1.x.\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.translateAndMuxDigitalPin, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.getTranslateAndMuxPWMPinFunc(pwmPinTranslator.Translate),\n\t\tpwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\treturn a\n}\n\n// Name returns the Adaptor name\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the Adaptor name\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize releases all i2c devices and exported analog, digital, pwm pins.\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\treturn err\n}\n\n// DigitalWrite writes a digital value to specified pin.\n// valid usr pin values are usr0, usr1, usr2 and usr3\nfunc (a *Adaptor) DigitalWrite(id string, val byte) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif strings.Contains(id, \"usr\") {\n\t\tfi, e := a.sys.OpenFile(a.usrLed+id+\"/brightness\", os.O_WRONLY|os.O_APPEND, 0o666)\n\t\tdefer fi.Close() //nolint:staticcheck // for historical reasons\n\t\tif e != nil {\n\t\t\treturn e\n\t\t}\n\t\t_, err := fi.WriteString(strconv.Itoa(int(val)))\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.DigitalWrite(id, val)\n}\n\n// translatePin converts digital pin name to pin position\nfunc (a *Adaptor) translateAndMuxDigitalPin(id string) (string, int, error) {\n\tline, ok := bbbPinMap[id]\n\tif !ok {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a digital pin\", id)\n\t}\n\t// mux is done by id, not by line\n\tif err := a.muxPin(id, \"gpio\"); err != nil {\n\t\treturn \"\", -1, err\n\t}\n\treturn \"\", line, nil\n}\n\nfunc (a *Adaptor) getTranslateAndMuxPWMPinFunc(\n\tpwmPinTranslate func(id string) (string, int, error),\n) func(id string) (string, int, error) {\n\treturn func(id string) (string, int, error) {\n\t\tpath, channel, err := pwmPinTranslate(id)\n\t\tif err != nil {\n\t\t\treturn path, channel, err\n\t\t}\n\n\t\tif err := a.muxPin(id, \"pwm\"); err != nil {\n\t\t\treturn \"\", -1, err\n\t\t}\n\n\t\treturn path, channel, nil\n\t}\n}\n\nfunc (a *Adaptor) muxPin(pin, cmd string) error {\n\tpath := fmt.Sprintf(\"/sys/devices/platform/ocp/ocp:%s_pinmux/state\", pin)\n\tfi, e := a.sys.OpenFile(path, os.O_WRONLY, 0o666)\n\tdefer fi.Close() //nolint:staticcheck // for historical reasons\n\tif e != nil {\n\t\treturn e\n\t}\n\t_, e = fi.WriteString(cmd)\n\treturn e\n}\n"
  },
  {
    "path": "platforms/beagleboard/beaglebone/adaptor_test.go",
    "content": "package beaglebone\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ gpio.ServoWriter            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n\t_ spi.Connector               = (*Adaptor)(nil)\n)\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nconst (\n\tpwmDir               = \"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/\" //nolint:gosec // false positive\n\tpwmChip0Dir          = pwmDir + \"pwmchip0/\"\n\tpwmChip0ExportPath   = pwmChip0Dir + \"export\"\n\tpwmChip0UnexportPath = pwmChip0Dir + \"unexport\"\n\tpwmChip0Pwm0Dir      = pwmChip0Dir + \"pwm0/\"\n\tpwmChip0Pwm1Dir      = pwmChip0Dir + \"pwm1/\"\n\n\tpwm0EnablePath    = pwmChip0Pwm0Dir + \"enable\"\n\tpwm0PeriodPath    = pwmChip0Pwm0Dir + \"period\"\n\tpwm0DutyCyclePath = pwmChip0Pwm0Dir + \"duty_cycle\"\n\tpwm0PolarityPath  = pwmChip0Pwm0Dir + \"polarity\"\n\n\tpwm1EnablePath    = pwmChip0Pwm1Dir + \"enable\"\n\tpwm1PeriodPath    = pwmChip0Pwm1Dir + \"period\"\n\tpwm1DutyCyclePath = pwmChip0Pwm1Dir + \"duty_cycle\"\n\tpwm1PolarityPath  = pwmChip0Pwm1Dir + \"polarity\"\n)\n\nvar pwmMockPaths = []string{\n\t\"/sys/devices/platform/ocp/ocp:P9_22_pinmux/state\",\n\t\"/sys/devices/platform/ocp/ocp:P9_21_pinmux/state\",\n\t\"/sys/bus/iio/devices/iio:device0/in_voltage1_raw\",\n\tpwmChip0ExportPath,\n\tpwmChip0UnexportPath,\n\tpwm0EnablePath,\n\tpwm0PeriodPath,\n\tpwm0DutyCyclePath,\n\tpwm0PolarityPath,\n\tpwm1EnablePath,\n\tpwm1PeriodPath,\n\tpwm1DutyCyclePath,\n\tpwm1PolarityPath,\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Beaglebone\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.mutex)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.Equal(t, \"/sys/class/leds/beaglebone:green:\", a.usrLed)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestPWMWrite(t *testing.T) {\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tfs.Files[pwm1DutyCyclePath].Contents = \"0\"\n\tfs.Files[pwm1PeriodPath].Contents = \"0\"\n\t// act & assert wrong pin\n\trequire.ErrorContains(t, a.PwmWrite(\"P9_99\", 175), \"'P9_99' is not a valid id for a PWM pin\")\n\n\t// act & assert values\n\t_ = a.PwmWrite(\"P9_21\", 175)\n\tassert.Equal(t, \"500000\", fs.Files[pwm1PeriodPath].Contents)\n\tassert.Equal(t, \"343137\", fs.Files[pwm1DutyCyclePath].Contents)\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestServoWrite(t *testing.T) {\n\t// arrange: prepare 50Hz for servos\n\tconst (\n\t\tpin         = \"P9_21\"\n\t\tfiftyHzNano = 20000000\n\t)\n\ta := NewAdaptor(adaptors.WithPWMDefaultPeriodForPin(pin, fiftyHzNano))\n\tfs := a.sys.UseMockFilesystem(pwmMockPaths)\n\trequire.NoError(t, a.Connect())\n\t// act & assert for 0° (min default value)\n\terr := a.ServoWrite(pin, 0)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[pwm1PeriodPath].Contents)\n\tassert.Equal(t, \"500000\", fs.Files[pwm1DutyCyclePath].Contents)\n\t// act & assert for 180° (max default value)\n\terr = a.ServoWrite(pin, 180)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[pwm1PeriodPath].Contents)\n\tassert.Equal(t, \"2500000\", fs.Files[pwm1DutyCyclePath].Contents)\n\t// act & assert invalid pins\n\terr = a.ServoWrite(\"3\", 120)\n\trequire.ErrorContains(t, err, \"'3' is not a valid id for a PWM pin\")\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/bus/iio/devices/iio:device0/in_voltage1_raw\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/bus/iio/devices/iio:device0/in_voltage1_raw\"].Contents = \"567\\n\"\n\ti, err := a.AnalogRead(\"P9_40\")\n\tassert.Equal(t, 567, i)\n\trequire.NoError(t, err)\n\n\t_, err = a.AnalogRead(\"P9_99\")\n\trequire.ErrorContains(t, err, \"not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"P9_40\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/devices/platform/ocp/ocp:P8_07_pinmux/state\",\n\t\t\"/sys/devices/platform/ocp/ocp:P9_11_pinmux/state\",\n\t\t\"/sys/devices/platform/ocp/ocp:P9_12_pinmux/state\",\n\t\t\"/sys/class/leds/beaglebone:green:usr1/brightness\",\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio60/value\",\n\t\t\"/sys/class/gpio/gpio60/direction\",\n\t\t\"/sys/class/gpio/gpio66/value\",\n\t\t\"/sys/class/gpio/gpio66/direction\",\n\t\t\"/sys/class/gpio/gpio10/value\",\n\t\t\"/sys/class/gpio/gpio10/direction\",\n\t\t\"/sys/class/gpio/gpio30/value\",\n\t\t\"/sys/class/gpio/gpio30/direction\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\t// DigitalIO\n\trequire.NoError(t, a.DigitalWrite(\"usr1\", 1))\n\tassert.Equal(t,\n\t\t\"1\",\n\t\tfs.Files[\"/sys/class/leds/beaglebone:green:usr1/brightness\"].Contents,\n\t)\n\n\t// no such LED\n\terr := a.DigitalWrite(\"usr10101\", 1)\n\trequire.ErrorContains(t, err, \" : /sys/class/leds/beaglebone:green:usr10101/brightness: no such file\")\n\n\trequire.NoError(t, a.DigitalWrite(\"P9_12\", 1))\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio60/value\"].Contents)\n\n\trequire.ErrorContains(t, a.DigitalWrite(\"P9_99\", 1), \"'P9_99' is not a valid id for a digital pin\")\n\n\t_, err = a.DigitalRead(\"P9_99\")\n\trequire.ErrorContains(t, err, \"'P9_99' is not a valid id for a digital pin\")\n\n\tfs.Files[\"/sys/class/gpio/gpio66/value\"].Contents = \"1\"\n\ti, err := a.DigitalRead(\"P8_07\")\n\tassert.Equal(t, 1, i)\n\trequire.NoError(t, err)\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestAnalogReadFileError(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/devices/platform/whatever\",\n\t}\n\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\t_, err := a.AnalogRead(\"P9_40\")\n\trequire.ErrorContains(t, err, \"/sys/bus/iio/devices/iio:device0/in_voltage1_raw: no such file\")\n}\n\nfunc TestDigitalPinDirectionFileError(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/gpio60/value\",\n\t\t\"/sys/devices/platform/ocp/ocp:P9_12_pinmux/state\",\n\t}\n\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\terr := a.DigitalWrite(\"P9_12\", 1)\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/gpio60/direction: no such file\")\n\n\t// no pin added after previous problem, so no pin to unexport in finalize\n\terr = a.Finalize()\n\trequire.NoError(t, err)\n}\n\nfunc TestDigitalPinFinalizeFileError(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/gpio60/value\",\n\t\t\"/sys/class/gpio/gpio60/direction\",\n\t\t\"/sys/devices/platform/ocp/ocp:P9_12_pinmux/state\",\n\t}\n\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\terr := a.DigitalWrite(\"P9_12\", 1)\n\trequire.NoError(t, err)\n\n\terr = a.Finalize()\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/unexport: no such file\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, 8, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 2, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-2\"})\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 2)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n\nfunc Test_translateAndMuxPWMPin(t *testing.T) {\n\t// arrange\n\tmockPaths := []string{\n\t\t\"/sys/devices/platform/ocp/48304000.epwmss/48304200.pwm/pwm/pwmchip4/\",\n\t\t\"/sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/pwmchip2/\",\n\t\t\"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/pwmchip0/\",\n\t\t\"/sys/devices/platform/ocp/48300000.epwmss/48300100.ecap/pwm/pwmchip0/\",\n\t}\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\ttests := map[string]struct {\n\t\twantDir     string\n\t\twantChannel int\n\t\twantErr     error\n\t}{\n\t\t\"P8_13\": {\n\t\t\twantDir:     \"/sys/devices/platform/ocp/48304000.epwmss/48304200.pwm/pwm/pwmchip4\",\n\t\t\twantChannel: 1,\n\t\t},\n\t\t\"P8_19\": {\n\t\t\twantDir:     \"/sys/devices/platform/ocp/48304000.epwmss/48304200.pwm/pwm/pwmchip4\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"P9_14\": {\n\t\t\twantDir:     \"/sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/pwmchip2\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"P9_16\": {\n\t\t\twantDir:     \"/sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/pwmchip2\",\n\t\t\twantChannel: 1,\n\t\t},\n\t\t\"P9_21\": {\n\t\t\twantDir:     \"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/pwmchip0\",\n\t\t\twantChannel: 1,\n\t\t},\n\t\t\"P9_22\": {\n\t\t\twantDir:     \"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/pwmchip0\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"P9_42\": {\n\t\t\twantDir:     \"/sys/devices/platform/ocp/48300000.epwmss/48300100.ecap/pwm/pwmchip0\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"P9_99\": {\n\t\t\twantDir:     \"\",\n\t\t\twantChannel: -1,\n\t\t\twantErr:     fmt.Errorf(\"'P9_99' is not a valid id for a PWM pin\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tmuxPath := fmt.Sprintf(\"/sys/devices/platform/ocp/ocp:%s_pinmux/state\", name)\n\t\t\tfs.Add(muxPath)\n\t\t\tpwmPinTranslator := adaptors.NewPWMPinTranslator(a.sys, bbbPwmPinMap)\n\t\t\ttranslateAndMuxPWMPin := a.getTranslateAndMuxPWMPinFunc(pwmPinTranslator.Translate)\n\t\t\t// act\n\t\t\tpath, channel, err := translateAndMuxPWMPin(name)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantDir, path)\n\t\t\tassert.Equal(t, tc.wantChannel, channel)\n\t\t\tif tc.wantErr == nil {\n\t\t\t\tassert.Equal(t, \"pwm\", fs.Files[muxPath].Contents)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/beagleboard/beaglebone/pinmap.go",
    "content": "package beaglebone\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\nvar bbbPinMap = map[string]int{\n\t// P8_01 - P8_2 GND\n\t// P8_03 - P8_6 EMCC\n\t\"P8_07\": 66,\n\t\"P8_08\": 67,\n\t\"P8_09\": 69,\n\t\"P8_10\": 68,\n\t\"P8_11\": 45,\n\t\"P8_12\": 44,\n\t\"P8_13\": 23,\n\t\"P8_14\": 26,\n\t\"P8_15\": 47,\n\t\"P8_16\": 46,\n\t\"P8_17\": 27,\n\t\"P8_18\": 65,\n\t\"P8_19\": 22,\n\t// P8_20 - P8_25 EMCC\n\t\"P8_26\": 61,\n\t// P8_27 - P8_46 HDMI\n\n\t// P9_1 - P9_2 GND\n\t// P9_3 - P9_4 3V3\n\t// P9_5 - P9_6 5V\n\t// P9_7 - P9_8 5V SYS\n\t// P9_9 PWR_BUT\n\t// P9_10 SYS_RESET\n\t\"P9_11\": 30,\n\t\"P9_12\": 60,\n\t\"P9_13\": 31,\n\t\"P9_14\": 50,\n\t\"P9_15\": 48,\n\t\"P9_16\": 51,\n\t\"P9_17\": 5,\n\t\"P9_18\": 4,\n\t// P9_19 I2C2 SCL\n\t// P9_20 I2C2 SDA\n\t\"P9_21\": 3,\n\t\"P9_22\": 2,\n\t\"P9_23\": 49,\n\t\"P9_24\": 15,\n\t\"P9_25\": 117,\n\t\"P9_26\": 14,\n\t\"P9_27\": 115,\n\t\"P9_28\": 113,\n\t\"P9_29\": 111,\n\t\"P9_30\": 112,\n\t\"P9_31\": 110,\n}\n\nvar bbbPwmPinMap = adaptors.PWMPinDefinitions{\n\t\"P8_13\": {\n\t\tDir: \"/sys/devices/platform/ocp/48304000.epwmss/48304200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 1,\n\t},\n\t\"P8_19\": {\n\t\tDir: \"/sys/devices/platform/ocp/48304000.epwmss/48304200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 0,\n\t},\n\t\"P9_14\": {\n\t\tDir: \"/sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 0,\n\t},\n\t\"P9_16\": {\n\t\tDir: \"/sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 1,\n\t},\n\t\"P9_21\": {\n\t\tDir: \"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 1,\n\t},\n\t\"P9_22\": {\n\t\tDir: \"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 0,\n\t},\n\t\"P9_42\": {\n\t\tDir: \"/sys/devices/platform/ocp/48300000.epwmss/48300100.ecap/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 0,\n\t},\n}\n\nvar bbbAnalogPinMap = adaptors.AnalogPinDefinitions{\n\t\"P9_39\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage0_raw\", W: false, ReadBufLen: 1024},\n\t\"P9_40\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage1_raw\", W: false, ReadBufLen: 1024},\n\t\"P9_37\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage2_raw\", W: false, ReadBufLen: 1024},\n\t\"P9_38\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage3_raw\", W: false, ReadBufLen: 1024},\n\t\"P9_33\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage4_raw\", W: false, ReadBufLen: 1024},\n\t\"P9_36\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage5_raw\", W: false, ReadBufLen: 1024},\n\t\"P9_35\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage6_raw\", W: false, ReadBufLen: 1024},\n}\n"
  },
  {
    "path": "platforms/beagleboard/doc.go",
    "content": "/*\nPackage beagleboard provides the Gobot adaptor for the Beaglebone Black/Green, as well as a\nseparate Adaptor for the PocketBeagle.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"time\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n\t)\n\n\tfunc main() {\n\t\tbeagleboneAdaptor := beaglebone.NewAdaptor()\n\t\tled := gpio.NewLedDriver(beagleboneAdaptor, \"P9_12\")\n\n\t\twork := func() {\n\t\t\tgobot.Every(1*time.Second, func() {\n\t\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t\t[]gobot.Connection{beagleboneAdaptor},\n\t\t\t[]gobot.Device{led},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor more information refer to the beaglebone README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/beagleboard/README.md\n*/\npackage beagleboard // import \"gobot.io/x/gobot/v2/platforms/beagleboard\"\n"
  },
  {
    "path": "platforms/beagleboard/pocketbeagle/adaptor.go",
    "content": "package pocketbeagle\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst pwmPeriodDefault = 500000 // 0.5 ms = 2 kHz\n\n// PocketBeagleAdaptor is the Gobot Adaptor for the PocketBeagle\n// For more information check out:\n//\n//\thttp://beagleboard.org/pocket\ntype PocketBeagleAdaptor struct {\n\t*beaglebone.Adaptor\n\n\tsys *system.Accesser\n}\n\n// NewAdaptor creates a new Adaptor for the PocketBeagle\n// tested with sysfs and cdev on \"Linux BeagleBone 5.10.168-ti-r71\"\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of sysfs\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosPullUp(pins): will be silently ignored (for some pins)\n//\tadaptors.WithGpioDebounce(inPinNum, debounceTime): is only supported for debounceTime < 8ms\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\nfunc NewAdaptor(opts ...interface{}) *PocketBeagleAdaptor {\n\tsys := system.NewAccesser()\n\ta := PocketBeagleAdaptor{\n\t\tAdaptor: beaglebone.NewAdaptor(opts...),\n\t\tsys:     sys,\n\t}\n\n\ta.SetName(gobot.DefaultName(\"PocketBeagle\"))\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tpwmPinsOpts := []adaptors.PwmPinsOptionApplier{adaptors.WithPWMDefaultPeriod(pwmPeriodDefault)}\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.Name()))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinMap)\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions)\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, pwmPinMap)\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys,\n\t\ta.getTranslateAndMuxDigitalPinFunc(digitalPinTranslator.Translate), digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.getTranslateAndMuxPWMPinFunc(pwmPinTranslator.Translate),\n\t\tpwmPinsOpts...)\n\n\treturn &a\n}\n\nfunc (a *PocketBeagleAdaptor) getTranslateAndMuxDigitalPinFunc(\n\tdigitalPinTranslate func(id string) (string, int, error),\n) func(id string) (string, int, error) {\n\treturn func(id string) (string, int, error) {\n\t\tif a.sys.HasDigitalPinSysfsAccess() {\n\t\t\t// mux is done by id, not by line\n\t\t\tif err := a.muxPin(id, \"gpio\"); err != nil {\n\t\t\t\treturn \"\", -1, err\n\t\t\t}\n\t\t}\n\n\t\treturn digitalPinTranslate(id)\n\t}\n}\n\nfunc (a *PocketBeagleAdaptor) getTranslateAndMuxPWMPinFunc(\n\tpwmPinTranslate func(id string) (string, int, error),\n) func(id string) (string, int, error) {\n\treturn func(id string) (string, int, error) {\n\t\tpath, channel, err := pwmPinTranslate(id)\n\t\tif err != nil {\n\t\t\treturn path, channel, err\n\t\t}\n\n\t\tif err := a.muxPin(id, \"pwm\"); err != nil {\n\t\t\treturn \"\", -1, err\n\t\t}\n\n\t\treturn path, channel, nil\n\t}\n}\n\nfunc (a *PocketBeagleAdaptor) muxPin(pin, cmd string) error {\n\tpath := fmt.Sprintf(\"/sys/devices/platform/ocp/ocp:%s_pinmux/state\", pin)\n\tfi, e := a.sys.OpenFile(path, os.O_WRONLY, 0o666)\n\tdefer fi.Close() //nolint:staticcheck // for historical reasons\n\tif e != nil {\n\t\treturn e\n\t}\n\t_, e = fi.WriteString(cmd)\n\treturn e\n}\n"
  },
  {
    "path": "platforms/beagleboard/pocketbeagle/adaptor_test.go",
    "content": "package pocketbeagle\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n)\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &PocketBeagleAdaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"PocketBeagle\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewAdaptor()\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"P1_02\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip2\", \"23\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"gpiochip3\", \"19\", []int{2})\n\ti, err := a.DigitalRead(\"P2_34\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 2, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip2\", \"23\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip3\", \"19\"))\n}\n"
  },
  {
    "path": "platforms/beagleboard/pocketbeagle/pinmap.go",
    "content": "package pocketbeagle\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// tested: am335x-debian-11.7-iot-armhf-2023-09-02-4gb, OK: work as input and output, IN: work only as input\nvar gpioPinDefinitions = adaptors.DigitalPinDefinitions{\n\t// gpiochip0 - 32 lines:\n\t// line   0:         \"NC\"       unused   input  active-high\n\t// line   1:         \"NC\"       unused   input  active-high\n\t\"P1_08\": {Sysfs: 2, Cdev: adaptors.CdevPin{Chip: 0, Line: 2}}, // P1.08_SPI0_CLK - ?\n\t\"P1_10\": {Sysfs: 3, Cdev: adaptors.CdevPin{Chip: 0, Line: 3}}, // P1.10_SPI0_MISO - ?\n\t\"P1_12\": {Sysfs: 4, Cdev: adaptors.CdevPin{Chip: 0, Line: 4}}, // P1.12_SPI0_MOSI - ?\n\t\"P1_06\": {Sysfs: 5, Cdev: adaptors.CdevPin{Chip: 0, Line: 5}}, // P1.06_SPI0_CS - ?\n\t// line   6:  \"[MMC0_CD]\"         \"cd\"   input   active-low [used]\n\t\"P2_29\": {Sysfs: 7, Cdev: adaptors.CdevPin{Chip: 0, Line: 7}}, // P2.29_SPI1_CLK - ?\n\t// line   8: \"[SYSBOOT 12]\" unused input active-high\n\t// line   9: \"[SYSBOOT 13]\" unused input active-high\n\t// line  10: \"[SYSBOOT 14]\" unused input active-high\n\t// line  11: \"[SYSBOOT 15]\" unused input active-high\n\t\"P1_26\": {Sysfs: 12, Cdev: adaptors.CdevPin{Chip: 0, Line: 12}}, // P1.26_I2C2_SDA - ?\n\t\"P1_28\": {Sysfs: 13, Cdev: adaptors.CdevPin{Chip: 0, Line: 13}}, // P1.28_I2C2_SCL - ?\n\t\"P2_11\": {Sysfs: 14, Cdev: adaptors.CdevPin{Chip: 0, Line: 14}}, // P2.11_I2C1_SDA - ?\n\t\"P2_09\": {Sysfs: 15, Cdev: adaptors.CdevPin{Chip: 0, Line: 15}}, // P2.09_I2C1_SCL - ?\n\t// line  16:         \"NC\"       unused   input  active-high\n\t// line  17:         \"NC\"       unused   input  active-high\n\t// line  18:         \"NC\"       unused   input  active-high\n\t\"P2_31\": {Sysfs: 19, Cdev: adaptors.CdevPin{Chip: 0, Line: 19}}, // P2.31_SPI1_CS - ?\n\t\"P1_20\": {Sysfs: 20, Cdev: adaptors.CdevPin{Chip: 0, Line: 20}}, // P1.20_PRU0.16 - ?\n\t// line  21:         \"NC\"       unused   input  active-high\n\t// line  22:         \"NC\"       unused   input  active-high\n\t\"P2_03\": {Sysfs: 23, Cdev: adaptors.CdevPin{Chip: 0, Line: 23}}, // P2.03 - ?\n\t// line  24:         \"NC\"       unused   input  active-high\n\t// line  25:         \"NC\"       unused   input  active-high\n\t\"P1_34\": {Sysfs: 26, Cdev: adaptors.CdevPin{Chip: 0, Line: 26}}, // P1.34 - ?\n\t\"P2_19\": {Sysfs: 27, Cdev: adaptors.CdevPin{Chip: 0, Line: 27}}, // P2.19 - ?\n\t// line  28:         \"NC\"       unused   input  active-high\n\t// line  29:         \"NC\"       unused   input  active-high\n\t\"P2_05\": {Sysfs: 30, Cdev: adaptors.CdevPin{Chip: 0, Line: 30}}, // P2.05_UART4_RX - ?\n\t\"P2_07\": {Sysfs: 31, Cdev: adaptors.CdevPin{Chip: 0, Line: 31}}, // P2.07_UART4_TX - ?\n\t// gpiochip1 - 32 lines:\n\t// line   0:         \"NC\"       unused   input  active-high\n\t// ...\n\t// line   7:         \"NC\"       unused   input  active-high\n\t\"P2_27\": {Sysfs: 40, Cdev: adaptors.CdevPin{Chip: 1, Line: 8}},  // P2.27_SPI1_MISO- ?\n\t\"P2_25\": {Sysfs: 41, Cdev: adaptors.CdevPin{Chip: 1, Line: 9}},  // P2.25_SPI1_MOSI - ?\n\t\"P1_32\": {Sysfs: 42, Cdev: adaptors.CdevPin{Chip: 1, Line: 10}}, // P1.32_UART0_RX - ?\n\t\"P1_30\": {Sysfs: 43, Cdev: adaptors.CdevPin{Chip: 1, Line: 11}}, // P1.30_UART0_TX - ?\n\t\"P2_24\": {Sysfs: 44, Cdev: adaptors.CdevPin{Chip: 1, Line: 12}}, // P2.24 - ?\n\t\"P2_33\": {Sysfs: 45, Cdev: adaptors.CdevPin{Chip: 1, Line: 13}}, // P2.33 - ?\n\t\"P2_22\": {Sysfs: 46, Cdev: adaptors.CdevPin{Chip: 1, Line: 14}}, // P2.22 - ?\n\t\"P2_18\": {Sysfs: 47, Cdev: adaptors.CdevPin{Chip: 1, Line: 15}}, // P2.18 - ?\n\t// line  16:         \"NC\"       unused   input  active-high\n\t// line  17:         \"NC\"       unused   input  active-high\n\t\"P2_01\": {Sysfs: 50, Cdev: adaptors.CdevPin{Chip: 1, Line: 18}}, // P2.01_PWM1A - ?\n\t// line  19:         \"NC\"       unused   input  active-high\n\t\"P2_10\": {Sysfs: 52, Cdev: adaptors.CdevPin{Chip: 1, Line: 20}}, // P2.10- ?\n\t\"usr0\":  {Sysfs: -1, Cdev: adaptors.CdevPin{Chip: 1, Line: 21}}, // USR LED 0 (beaglebone:green:usr0) - ?\n\t\"usr1\":  {Sysfs: -1, Cdev: adaptors.CdevPin{Chip: 1, Line: 22}}, // USR LED 1 (beaglebone:green:usr1) - ?\n\t\"usr2\":  {Sysfs: -1, Cdev: adaptors.CdevPin{Chip: 1, Line: 23}}, // USR LED 2 (beaglebone:green:usr2) - ?\n\t\"usr3\":  {Sysfs: -1, Cdev: adaptors.CdevPin{Chip: 1, Line: 24}}, // USR LED 3 (beaglebone:green:usr3) - ?\n\t\"P2_06\": {Sysfs: 57, Cdev: adaptors.CdevPin{Chip: 1, Line: 25}}, // P2.06 - ?\n\t\"P2_04\": {Sysfs: 58, Cdev: adaptors.CdevPin{Chip: 1, Line: 26}}, // P2.04 - ?\n\t\"P2_02\": {Sysfs: 59, Cdev: adaptors.CdevPin{Chip: 1, Line: 27}}, // P2.02 - ?\n\t\"P2_08\": {Sysfs: 60, Cdev: adaptors.CdevPin{Chip: 1, Line: 28}}, // P2.08 - ?\n\t// line  29:         \"NC\"       unused   input  active-high\n\t// line  30:         \"NC\"       unused   input  active-high\n\t// line  31:         \"NC\"       unused   input  active-high\n\t// gpiochip2 - 32 lines:\n\t\"P2_20\": {Sysfs: 64, Cdev: adaptors.CdevPin{Chip: 2, Line: 0}}, // P2.20 - ?\n\t\"P2_17\": {Sysfs: 65, Cdev: adaptors.CdevPin{Chip: 2, Line: 1}}, // P2.17 - ?\n\t// line   2:         \"NC\"       unused   input  active-high\n\t// line   3:         \"NC\"       unused   input  active-high\n\t// line   4:         \"NC\"       unused   input  active-high\n\t// line   5: \"[EEPROM_WP]\" unused input active-high\n\t// line   6: \"[SYSBOOT 0]\" unused input active-high\n\t// line   7: \"[SYSBOOT 1]\" unused input active-high\n\t// line   8: \"[SYSBOOT 2]\" unused input active-high\n\t// line   9: \"[SYSBOOT 3]\" unused input active-high\n\t// line  10: \"[SYSBOOT 4]\" unused input active-high\n\t// line  11: \"[SYSBOOT 5]\" unused input active-high\n\t// line  12: \"[SYSBOOT 6]\" unused input active-high\n\t// line  13: \"[SYSBOOT 7]\" unused input active-high\n\t// line  14: \"[SYSBOOT 8]\" unused input active-high\n\t// line  15: \"[SYSBOOT 9]\" unused input active-high\n\t// line  16: \"[SYSBOOT 10]\" unused input active-high\n\t// line  17: \"[SYSBOOT 11]\" unused input active-high\n\t// line  18:         \"NC\"       unused   input  active-high\n\t// ...\n\t// line  21:         \"NC\"       unused   input  active-high\n\t\"P2_35\": {Sysfs: 86, Cdev: adaptors.CdevPin{Chip: 2, Line: 22}}, // P2.35_AIN5 - ?\n\t\"P1_02\": {Sysfs: 87, Cdev: adaptors.CdevPin{Chip: 2, Line: 23}}, // P1.02_AIN6 - ?\n\t\"P1_35\": {Sysfs: 88, Cdev: adaptors.CdevPin{Chip: 2, Line: 24}}, // P1.35_PRU1.10 - ?\n\t\"P1_04\": {Sysfs: 89, Cdev: adaptors.CdevPin{Chip: 2, Line: 25}}, // P1.04_PRU1.11 - ?\n\t// line  26: \"[MMC0_DAT3]\" unused input active-high\n\t// line  27: \"[MMC0_DAT2]\" unused input active-high\n\t// line  28: \"[MMC0_DAT1]\" unused input active-high\n\t// line  29: \"[MMC0_DAT0]\" unused input active-high\n\t// line  30: \"[MMC0_CLK]\"       unused   input  active-high\n\t// line  31: \"[MMC0_CMD]\"       unused   input  active-high\n\t// gpiochip3 - 32 lines:\n\t// line   0:         \"NC\"       unused   input  active-high\n\t// ...\n\t// line   4:         \"NC\"       unused   input  active-high\n\t// line  13: \"P1.03 [USB1]\" unused input active-high\n\t\"P1_36\": {Sysfs: 110, Cdev: adaptors.CdevPin{Chip: 3, Line: 14}}, // P1.36_PWM0A - ?\n\t\"P1_33\": {Sysfs: 111, Cdev: adaptors.CdevPin{Chip: 3, Line: 15}}, // P1.33_PRU0.1 - ?\n\t\"P2_32\": {Sysfs: 112, Cdev: adaptors.CdevPin{Chip: 3, Line: 16}}, // P2.32_PRU0.2 - ?\n\t\"P2_30\": {Sysfs: 113, Cdev: adaptors.CdevPin{Chip: 3, Line: 17}}, // P2.30_PRU0.3 - ?\n\t\"P1_31\": {Sysfs: 114, Cdev: adaptors.CdevPin{Chip: 3, Line: 18}}, // P1.31_PRU0.4 - ?\n\t\"P2_34\": {Sysfs: 115, Cdev: adaptors.CdevPin{Chip: 3, Line: 19}}, // P2.34_PRU0.5 - ?\n\t\"P2_28\": {Sysfs: 116, Cdev: adaptors.CdevPin{Chip: 3, Line: 20}}, // P2.28_PRU0.6- ?\n\t\"P1_29\": {Sysfs: 117, Cdev: adaptors.CdevPin{Chip: 3, Line: 21}}, // P1.29_PRU0.7 - ?\n\t// line  22:         \"NC\"       unused   input  active-high\n\t// ...\n\t// line  31:         \"NC\"       unused   input  active-high\n\n\t// P1_01 - VIN; P1_03 - USB1-V_EN; P1_05 - USB1-VBUS; P1_07 - USB1-VIN; P1_09 - USB1-DN; P1_11 - USB1-DP;\n\t// P1_13 - USB1-ID; P1_14 - 3.3V; P1_15 - USB1-GND; P1_16 - GND; P1_16 - AIN-VREF-; P1_18 - AIN-VREF+; P1_19 - AIO0\n\t// P1_21 - AIO1; P1_22 - GND; P1_23 - AIO2; P1_24 - VOUT-5V; P1_25 - AIO3; P1_27 - AIO4; P2_12 - PWR-BTN; P2_13 - VOUT\n\t// P2_14 - BAT-VIN; P2_15 - GND; P2_16 - BAT-TEMP; P2_21 - GND; P2_23 - 3.3V; P2_26 - NRST; P2_36 - AIO7\n}\n\nvar pwmPinMap = adaptors.PWMPinDefinitions{\n\t\"P1_33\": {Dir: \"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 1},\n\t\"P1_36\": {Dir: \"/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 0},\n\n\t\"P2_1\": {Dir: \"/sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 0},\n\t\"P2_3\": {Dir: \"/sys/devices/platform/ocp/48304000.epwmss/48304200.pwm/pwm/\", DirRegexp: \"pwmchip[0-9]+$\", Channel: 1},\n}\n\nvar analogPinMap = adaptors.AnalogPinDefinitions{\n\t\"P1_19\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage0_raw\", W: false, ReadBufLen: 1024},\n\t\"P1_21\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage1_raw\", W: false, ReadBufLen: 1024},\n\t\"P1_23\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage2_raw\", W: false, ReadBufLen: 1024},\n\t\"P1_25\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage3_raw\", W: false, ReadBufLen: 1024},\n\t\"P1_27\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage4_raw\", W: false, ReadBufLen: 1024},\n\t\"P2_36\": {Path: \"/sys/bus/iio/devices/iio:device0/in_voltage7_raw\", W: false, ReadBufLen: 1024},\n}\n"
  },
  {
    "path": "platforms/bleclient/LICENSE",
    "content": "Copyright (c) 2015-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/bleclient/README.md",
    "content": "# Bluetooth LE\n\nThe Gobot BLE adaptor makes it easy to interact with Bluetooth LE aka Bluetooth 4.0 using Go.\n\nIt is written using the [TinyGo Bluetooth](tinygo.org/x/bluetooth) package.\n\nLearn more about Bluetooth LE at <http://en.wikipedia.org/wiki/Bluetooth_low_energy>\n\nDrivers for several BLE Services can be found in the according [driver folder](https://github.com/hybridgroup/gobot/tree/release/drivers/ble).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n### macOS\n\nYou need to have XCode installed to be able to compile code that uses the Gobot BLE adaptor on macOS. This is because the\n`bluetooth` package uses a CGo based implementation.\n\n### Ubuntu\n\nEverything should already just compile on most Linux systems.\n\n### Windows\n\nYou will need to have a GCC compiler such as [mingw-w64](https://github.com/mingw-w64/mingw-w64) installed in order to use\nBLE on Windows.\n\n## How To Connect\n\nWhen using BLE a \"peripheral\" aka \"server\" is something you connect to such a a pulse meter. A \"central\" aka \"client\" is\nwhat does the connecting, such as your computer or mobile phone.\n\nYou need to know the BLE ID of the peripheral you want to connect to. The Gobot BLE client adaptor also lets you connect\nto a peripheral by friendly name.\n\n### Connect on Ubuntu\n\nOn Linux the BLE code will need to run as a root user account. The easiest way to accomplish this is probably to use\n`go build` to build your program, and then to run the requesting executable using `sudo`.\n\nFor example:\n\n    go build examples/minidrone.go\n    sudo ./minidrone AA:BB:CC:DD:EE\n\n### Connect on Windows\n\nHopefully coming soon...\n\n## How to Use\n\nHere is an example that uses the BLE \"Battery\" service to retrieve the current change level of the peripheral device:\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/ble\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nfunc main() {\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n  battery := ble.NewBatteryDriver(bleAdaptor)\n\n  work := func() {\n    gobot.Every(5*time.Second, func() {\n      level, err := battery.GetBatteryLevel()\n      if err != nil {\n        fmt.Println(err)\n      }\n      fmt.Println(\"Battery level:\", level)\n    })\n  }\n\n  robot := gobot.NewRobot(\"bleBot\",\n    []gobot.Connection{bleAdaptor},\n    []gobot.Device{battery},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n"
  },
  {
    "path": "platforms/bleclient/ble_client_adaptor.go",
    "content": "package bleclient\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"sync\"\n\t\"time\"\n\n\t\"tinygo.org/x/bluetooth\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype configuration struct {\n\tscanTimeout                     time.Duration\n\tsleepAfterDisconnect            time.Duration\n\tdropCharacteristicsOnDisconnect bool\n\tdebug                           bool\n}\n\n// Adaptor represents a Client Connection to a BLE Peripheral\ntype Adaptor struct {\n\tname       string\n\tidentifier string\n\tcfg        *configuration\n\n\tbtAdpt          *btAdapter\n\tbtDevice        *btDevice\n\tcharacteristics map[string]bluetoothExtCharacteristicer\n\n\tconnected bool\n\trssi      int\n\n\tbtAdptCreator btAdptCreatorFunc\n\tmutex         *sync.Mutex\n}\n\n// NewAdaptor returns a new Adaptor given an identifier. The identifier can be the address or the name.\n//\n// Supported options:\n//\n//\t\"WithDebug\"\n//\t\"WithDropCharacteristicsOnDisconnect\"\n//\t\"WithScanTimeout\"\nfunc NewAdaptor(identifier string, opts ...optionApplier) *Adaptor {\n\tcfg := configuration{\n\t\tscanTimeout:          10 * time.Minute,\n\t\tsleepAfterDisconnect: 500 * time.Millisecond,\n\t}\n\n\ta := Adaptor{\n\t\tname:            gobot.DefaultName(\"BLEClient\"),\n\t\tidentifier:      identifier,\n\t\tcfg:             &cfg,\n\t\tcharacteristics: make(map[string]bluetoothExtCharacteristicer),\n\t\tbtAdptCreator:   newBtAdapter,\n\t\tmutex:           &sync.Mutex{},\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(a.cfg)\n\t}\n\n\treturn &a\n}\n\n// WithDebug switch on some debug messages.\nfunc WithDebug() debugOption {\n\treturn debugOption(true)\n}\n\n// WithWithDropCharacteristicsOnDisconnect leads to clean all discovered services from last connect command if a\n// disconnect command happen. Also all subscriptions will be cleaned. A new discover of services and characteristics is\n// done on next connect and the subscriptions needs to be done again afterwards by the caller.\nfunc WithDropCharacteristicsOnDisconnect() dropCharacteristicsOnDisconnect {\n\treturn dropCharacteristicsOnDisconnect(true)\n}\n\n// WithScanTimeout substitute the default scan timeout of 10 min.\nfunc WithScanTimeout(timeout time.Duration) scanTimeoutOption {\n\treturn scanTimeoutOption(timeout)\n}\n\n// WithSleepAfterDisconnect substitute the default sleep of 500 ms.\nfunc WithSleepAfterDisconnect(sleep time.Duration) sleepAfterDisconnectOption {\n\treturn sleepAfterDisconnectOption(sleep)\n}\n\n// Name returns the name for the adaptor and after the connection is done, the name of the device\nfunc (a *Adaptor) Name() string {\n\tif a.btDevice != nil {\n\t\treturn a.btDevice.name()\n\t}\n\treturn a.name\n}\n\n// SetName sets the name for the adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Address returns the Bluetooth LE address of the device if connected, otherwise the identifier\nfunc (a *Adaptor) Address() string {\n\tif a.btDevice != nil {\n\t\treturn a.btDevice.address()\n\t}\n\n\treturn a.identifier\n}\n\n// RSSI returns the Bluetooth LE RSSI value at the moment of connecting the adaptor\nfunc (a *Adaptor) RSSI() int { return a.rssi }\n\n// WithoutResponses sets if the adaptor should expect responses after\n// writing characteristics for this device (has no effect at the moment).\nfunc (a *Adaptor) WithoutResponses(bool) {}\n\n// Connect initiates a connection to the BLE peripheral.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif a.connected {\n\t\treturn fmt.Errorf(\"%s is already connected\", a.name)\n\t}\n\n\tvar err error\n\n\tif a.cfg.debug {\n\t\tfmt.Println(\"[Connect]: enable adaptor...\")\n\t}\n\n\t// for re-connect, the adapter is already known\n\tif a.btAdpt == nil {\n\t\ta.btAdpt = a.btAdptCreator(bluetooth.DefaultAdapter, a.cfg.debug)\n\t\tif err := a.btAdpt.enable(); err != nil {\n\t\t\treturn fmt.Errorf(\"BT can't get adapter default: %v\", err)\n\t\t}\n\t}\n\n\tif a.cfg.debug {\n\t\tfmt.Printf(\"[Connect]: scan %s for the identifier '%s'...\\n\", a.cfg.scanTimeout, a.identifier)\n\t}\n\n\tresult, err := a.btAdpt.scan(a.identifier, a.cfg.scanTimeout)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"BT scan error: %v\", err)\n\t}\n\n\tif a.cfg.debug {\n\t\tfmt.Printf(\"[Connect]: connect to peripheral device with address %s...\\n\", result.Address)\n\t}\n\n\tdev, err := a.btAdpt.connect(result.Address, result.LocalName())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"BT connect error: %v\", err)\n\t}\n\n\ta.rssi = int(result.RSSI)\n\ta.btDevice = dev\n\n\tif len(a.characteristics) == 0 {\n\t\tif a.cfg.debug {\n\t\t\tfmt.Println(\"[Connect]: get all services/characteristics...\")\n\t\t}\n\t\tservices, err := a.btDevice.discoverServices(nil)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"BT discover services/characteristics error: %v\", err)\n\t\t}\n\t\tfor _, service := range services {\n\t\t\tif a.cfg.debug {\n\t\t\t\tfmt.Printf(\"[Connect]: service found: %s\\n\", service)\n\t\t\t}\n\t\t\tchars, err := service.DiscoverCharacteristics(nil)\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, char := range chars {\n\t\t\t\tif a.cfg.debug {\n\t\t\t\t\tfmt.Printf(\"[Connect]: characteristic found: %s\\n\", char)\n\t\t\t\t}\n\t\t\t\tc := char // to prevent implicit memory aliasing in for loop, before go 1.22\n\t\t\t\ta.characteristics[char.UUID().String()] = &c\n\t\t\t}\n\t\t}\n\t}\n\n\tif a.cfg.debug {\n\t\tfmt.Println(\"[Connect]: connected\")\n\t}\n\ta.connected = true\n\treturn nil\n}\n\n// Reconnect attempts to reconnect to the BLE peripheral. If it has an active connection\n// it will first close that connection and then establish a new connection.\nfunc (a *Adaptor) Reconnect() error {\n\tif a.connected {\n\t\tif err := a.Disconnect(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn a.Connect()\n}\n\n// Disconnect terminates the connection to the BLE peripheral.\nfunc (a *Adaptor) Disconnect() error {\n\tif a.cfg.debug {\n\t\tfmt.Println(\"[Disconnect]: disconnect...\")\n\t}\n\n\tif a.cfg.dropCharacteristicsOnDisconnect {\n\t\tif a.cfg.debug {\n\t\t\tfmt.Println(\"[Disconnect]: unsubscribe...\")\n\t\t}\n\n\t\tfor id, chara := range a.characteristics {\n\t\t\tif err := adjustNotificationsForCharacteristic(chara, nil); err != nil {\n\t\t\t\tfmt.Printf(\"[Disconnect]: error on unsubscribe characteristic %s: %v\\n\", id, err)\n\t\t\t}\n\t\t}\n\n\t\tif a.cfg.debug {\n\t\t\tfmt.Println(\"[Disconnect]: drop characteristics...\")\n\t\t}\n\t\ta.characteristics = make(map[string]bluetoothExtCharacteristicer)\n\t} else if a.cfg.debug {\n\t\tfmt.Println(\"[Disconnect]: as configured, characteristics not dropped\")\n\t}\n\n\terr := a.btDevice.disconnect()\n\ttime.Sleep(a.cfg.sleepAfterDisconnect)\n\ta.connected = false\n\tif err != nil {\n\t\treturn fmt.Errorf(\"BT disconnect error: %v\", err)\n\t}\n\n\tif a.cfg.debug {\n\t\tfmt.Println(\"[Disconnect]: disconnected\")\n\t}\n\n\treturn nil\n}\n\n// Finalize finalizes the BLEAdaptor\nfunc (a *Adaptor) Finalize() error {\n\treturn a.Disconnect()\n}\n\n// ReadCharacteristic returns bytes from the BLE device for the requested characteristic UUID.\n// The UUID can be given as 16-bit or 128-bit (with or without dashes) value.\nfunc (a *Adaptor) ReadCharacteristic(cUUID string) ([]byte, error) {\n\tif !a.connected {\n\t\treturn nil, fmt.Errorf(\"cannot read from BLE device until connected\")\n\t}\n\n\tcUUID, err := convertUUID(cUUID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif chara, ok := a.characteristics[cUUID]; ok {\n\t\treturn readFromCharacteristic(chara)\n\t}\n\n\treturn nil, fmt.Errorf(\"unknown characteristic: %s\", cUUID)\n}\n\n// WriteCharacteristic writes bytes to the BLE device for the requested characteristic UUID.\n// The UUID can be given as 16-bit or 128-bit (with or without dashes) value.\nfunc (a *Adaptor) WriteCharacteristic(cUUID string, data []byte) error {\n\tif !a.connected {\n\t\treturn fmt.Errorf(\"cannot write to BLE device until connected\")\n\t}\n\n\tcUUID, err := convertUUID(cUUID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif chara, ok := a.characteristics[cUUID]; ok {\n\t\treturn writeToCharacteristicWithoutResponse(chara, data)\n\t}\n\n\treturn fmt.Errorf(\"unknown characteristic: %s\", cUUID)\n}\n\n// Subscribe subscribes to notifications from the BLE device for the requested characteristic UUID.\n// The UUID can be given as 16-bit or 128-bit (with or without dashes) value.\nfunc (a *Adaptor) Subscribe(cUUID string, f func(data []byte)) error {\n\tif !a.connected {\n\t\treturn fmt.Errorf(\"cannot subscribe to BLE device until connected\")\n\t}\n\n\tcUUID, err := convertUUID(cUUID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif chara, ok := a.characteristics[cUUID]; ok {\n\t\treturn adjustNotificationsForCharacteristic(chara, f)\n\t}\n\n\treturn fmt.Errorf(\"unknown characteristic: %s\", cUUID)\n}\n\n// Unsubscribe remove subscription to notifications from the BLE device for the requested characteristic UUID.\n// The UUID can be given as 16-bit or 128-bit (with or without dashes) value.\nfunc (a *Adaptor) Unsubscribe(cUUID string) error {\n\tif !a.connected {\n\t\treturn fmt.Errorf(\"cannot unsubscribe from BLE device until connected\")\n\t}\n\n\tcUUID, err := convertUUID(cUUID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif chara, ok := a.characteristics[cUUID]; ok {\n\t\treturn adjustNotificationsForCharacteristic(chara, nil)\n\t}\n\n\treturn fmt.Errorf(\"unknown characteristic: %s\", cUUID)\n}\n"
  },
  {
    "path": "platforms/bleclient/ble_client_adaptor_options.go",
    "content": "package bleclient\n\nimport \"time\"\n\n// optionApplier needs to be implemented by each configurable option type\ntype optionApplier interface {\n\tapply(cfg *configuration)\n}\n\n// dropCharacteristicsOnDisconnect is the type for applying drop feature.\ntype dropCharacteristicsOnDisconnect bool\n\n// debugOption is the type for applying the debug switch on or off.\ntype debugOption bool\n\n// scanTimeoutOption is the type for applying another timeout than the default 10 min.\ntype scanTimeoutOption time.Duration\n\n// sleepAfterDisconnectOption is the type for applying another sleep time than the default 500 ms.\ntype sleepAfterDisconnectOption time.Duration\n\nfunc (o dropCharacteristicsOnDisconnect) String() string {\n\treturn \"drop characteristics on disconnect option for BLE client adaptors\"\n}\n\nfunc (o debugOption) String() string {\n\treturn \"debug option for BLE client adaptors\"\n}\n\nfunc (o scanTimeoutOption) String() string {\n\treturn \"scan timeout option for BLE client adaptors\"\n}\n\nfunc (o sleepAfterDisconnectOption) String() string {\n\treturn \"sleep after disconnect option for BLE client adaptors\"\n}\n\nfunc (o dropCharacteristicsOnDisconnect) apply(cfg *configuration) {\n\tcfg.dropCharacteristicsOnDisconnect = bool(o)\n}\n\nfunc (o debugOption) apply(cfg *configuration) {\n\tcfg.debug = bool(o)\n}\n\nfunc (o scanTimeoutOption) apply(cfg *configuration) {\n\tcfg.scanTimeout = time.Duration(o)\n}\n\nfunc (o sleepAfterDisconnectOption) apply(cfg *configuration) {\n\tcfg.sleepAfterDisconnect = time.Duration(o)\n}\n"
  },
  {
    "path": "platforms/bleclient/ble_client_adaptor_options_test.go",
    "content": "package bleclient\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestWithDebug(t *testing.T) {\n\t// This is a general test, that options are applied by using the WithDebug() option.\n\t// All other configuration options can also be tested by With..(val).apply(cfg).\n\t// arrange & act\n\ta := NewAdaptor(\"address\", WithDebug())\n\t// assert\n\tassert.True(t, a.cfg.debug)\n}\n\nfunc TestWithDropCharacteristicsOnDisconnect(t *testing.T) {\n\t// arrange\n\tcfg := &configuration{dropCharacteristicsOnDisconnect: false}\n\t// act\n\tWithDropCharacteristicsOnDisconnect().apply(cfg)\n\t// assert\n\tassert.True(t, cfg.dropCharacteristicsOnDisconnect)\n}\n\nfunc TestWithScanTimeout(t *testing.T) {\n\t// arrange\n\tnewTimeout := 2 * time.Second\n\tcfg := &configuration{scanTimeout: 10 * time.Second}\n\t// act\n\tWithScanTimeout(newTimeout).apply(cfg)\n\t// assert\n\tassert.Equal(t, newTimeout, cfg.scanTimeout)\n}\n\nfunc TestWithSleepAfterDisconnect(t *testing.T) {\n\t// arrange\n\tnewSleep := 3 * time.Second\n\tcfg := &configuration{sleepAfterDisconnect: 10 * time.Second}\n\t// act\n\tWithSleepAfterDisconnect(newSleep).apply(cfg)\n\t// assert\n\tassert.Equal(t, newSleep, cfg.sleepAfterDisconnect)\n}\n"
  },
  {
    "path": "platforms/bleclient/ble_client_adaptor_test.go",
    "content": "package bleclient\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar (\n\t_ gobot.Adaptor      = (*Adaptor)(nil)\n\t_ gobot.BLEConnector = (*Adaptor)(nil)\n)\n\nfunc TestNewAdaptor(t *testing.T) {\n\ta := NewAdaptor(\"D7:99:5A:26:EC:38\")\n\tassert.Equal(t, \"D7:99:5A:26:EC:38\", a.Address())\n\tassert.True(t, strings.HasPrefix(a.Name(), \"BLEClient\"))\n}\n\nfunc TestName(t *testing.T) {\n\ta := NewAdaptor(\"D7:99:5A:26:EC:38\")\n\ta.SetName(\"awesome\")\n\tassert.Equal(t, \"awesome\", a.Name())\n}\n\nfunc TestConnect(t *testing.T) {\n\tconst (\n\t\tscanTimeout   = 5 * time.Millisecond\n\t\tdeviceName    = \"hello\"\n\t\tdeviceAddress = \"11:22:44:AA:BB:CC\"\n\t\trssi          = 56\n\t)\n\ttests := map[string]struct {\n\t\tidentifier                  string\n\t\textAdapter                  *btTestAdapter\n\t\tsimulateConnected           bool\n\t\tsimulateDiscoverServicesErr bool\n\t\twantAddress                 string\n\t\twantName                    string\n\t\twantErr                     string\n\t}{\n\t\t\"connect_by_address\": {\n\t\t\tidentifier: deviceAddress,\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tdeviceAddress: deviceAddress,\n\t\t\t\trssi:          rssi,\n\t\t\t\tpayload:       &btTestPayload{name: deviceName},\n\t\t\t},\n\t\t\twantAddress: deviceAddress,\n\t\t\twantName:    deviceName,\n\t\t},\n\t\t\"connect_by_name\": {\n\t\t\tidentifier: deviceName,\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tdeviceAddress: deviceAddress,\n\t\t\t\trssi:          rssi,\n\t\t\t\tpayload:       &btTestPayload{name: deviceName},\n\t\t\t},\n\t\t\twantAddress: deviceAddress,\n\t\t\twantName:    deviceName,\n\t\t},\n\t\t\"error_already_connected\": {\n\t\t\textAdapter:        &btTestAdapter{},\n\t\t\tsimulateConnected: true,\n\t\t\twantName:          \"BLEClient\",\n\t\t\twantErr:           \"is already connected\",\n\t\t},\n\t\t\"error_enable\": {\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tsimulateEnableErr: true,\n\t\t\t},\n\t\t\twantName: \"BLEClient\",\n\t\t\twantErr:  \"can't get adapter default: adapter enable error\",\n\t\t},\n\t\t\"error_scan\": {\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tsimulateScanErr: true,\n\t\t\t},\n\t\t\twantName: \"BLEClient\",\n\t\t\twantErr:  \"scan error\",\n\t\t},\n\t\t\"error_stop_scan\": {\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tdeviceAddress:       deviceAddress,\n\t\t\t\tpayload:             &btTestPayload{},\n\t\t\t\tsimulateStopScanErr: true,\n\t\t\t},\n\t\t\twantName: \"BLEClient\",\n\t\t\twantErr:  \"stop scan error\",\n\t\t},\n\t\t\"error_timeout_long_delay\": {\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tdeviceAddress: deviceAddress,\n\t\t\t\tpayload:       &btTestPayload{},\n\t\t\t\tscanDelay:     2 * scanTimeout,\n\t\t\t},\n\t\t\twantName: \"BLEClient\",\n\t\t\twantErr:  \"scan timeout (5ms) elapsed\",\n\t\t},\n\t\t\"error_timeout_bad_identifier\": {\n\t\t\tidentifier: \"bad_identifier\",\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tdeviceAddress: deviceAddress,\n\t\t\t\tpayload:       &btTestPayload{},\n\t\t\t},\n\t\t\twantAddress: \"bad_identifier\",\n\t\t\twantName:    \"BLEClient\",\n\t\t\twantErr:     \"scan timeout (5ms) elapsed\",\n\t\t},\n\t\t\"error_connect\": {\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tdeviceAddress:      deviceAddress,\n\t\t\t\tpayload:            &btTestPayload{},\n\t\t\t\tsimulateConnectErr: true,\n\t\t\t},\n\t\t\twantName: \"BLEClient\",\n\t\t\twantErr:  \"adapter connect error\",\n\t\t},\n\t\t\"error_discovery_services\": {\n\t\t\tidentifier: \"disco_err\",\n\t\t\textAdapter: &btTestAdapter{\n\t\t\t\tdeviceAddress: deviceAddress,\n\t\t\t\tpayload:       &btTestPayload{name: \"disco_err\"},\n\t\t\t},\n\t\t\tsimulateDiscoverServicesErr: true,\n\t\t\twantAddress:                 deviceAddress,\n\t\t\twantName:                    \"disco_err\",\n\t\t\twantErr:                     \"device discover services error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(tc.identifier)\n\t\t\textDevice := btTestDevice{simulateDiscoverServicesErr: tc.simulateDiscoverServicesErr}\n\t\t\tbtdc := func(_ bluetoothExtDevicer, address, name string) *btDevice {\n\t\t\t\treturn &btDevice{extDevice: extDevice, devAddress: address, devName: name}\n\t\t\t}\n\t\t\tbtac := func(bluetoothExtAdapterer, bool) *btAdapter {\n\t\t\t\treturn &btAdapter{extAdapter: tc.extAdapter, btDeviceCreator: btdc}\n\t\t\t}\n\t\t\ta.btAdptCreator = btac\n\t\t\ta.cfg.scanTimeout = scanTimeout // to speed up test\n\t\t\ta.connected = tc.simulateConnected\n\t\t\t// act\n\t\t\terr := a.Connect()\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, tc.wantName, a.Name())\n\t\t\t\tassert.Equal(t, tc.wantAddress, a.Address())\n\t\t\t\tassert.Equal(t, rssi, a.RSSI())\n\t\t\t\tassert.True(t, a.connected)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t\tassert.Contains(t, a.Name(), tc.wantName)\n\t\t\t\tassert.Equal(t, tc.wantAddress, a.Address())\n\t\t\t\tassert.Equal(t, tc.simulateConnected, a.connected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDisconnect(t *testing.T) {\n\tconst (\n\t\tscanTimeout   = 5 * time.Millisecond\n\t\tdeviceName    = \"hello\"\n\t\tdeviceAddress = \"11:22:44:AA:BB:CC\"\n\t)\n\ttests := map[string]struct {\n\t\tconnectBefore         bool\n\t\tdropCharacteristics   bool\n\t\tsimulateDisconnectErr bool\n\t\twantErr               string\n\t}{\n\t\t\"disconnect_not_connectected\": {},\n\t\t\"disconnect_connectected_before\": {\n\t\t\tconnectBefore: true,\n\t\t},\n\t\t\"disconnect_drop_charas\": {\n\t\t\tconnectBefore:       true,\n\t\t\tdropCharacteristics: true,\n\t\t},\n\t\t\"error_disconnect\": {\n\t\t\tsimulateDisconnectErr: true,\n\t\t\tconnectBefore:         true,\n\t\t\twantErr:               \"device disconnect error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(deviceName)\n\t\t\ta.cfg.sleepAfterDisconnect = 0 // to speed up test\n\t\t\ta.cfg.dropCharacteristicsOnDisconnect = tc.dropCharacteristics\n\t\t\tvar wantCharaLen int\n\t\t\tif tc.connectBefore {\n\t\t\t\textDevice := btTestDevice{simulateDisconnectErr: tc.simulateDisconnectErr}\n\t\t\t\tbtdc := func(_ bluetoothExtDevicer, address, name string) *btDevice {\n\t\t\t\t\treturn &btDevice{extDevice: extDevice, devAddress: address, devName: name}\n\t\t\t\t}\n\t\t\t\textAdapter := &btTestAdapter{\n\t\t\t\t\tdeviceAddress: deviceAddress,\n\t\t\t\t\tpayload:       &btTestPayload{name: deviceName},\n\t\t\t\t}\n\t\t\t\tbtac := func(bluetoothExtAdapterer, bool) *btAdapter {\n\t\t\t\t\treturn &btAdapter{extAdapter: extAdapter, btDeviceCreator: btdc}\n\t\t\t\t}\n\t\t\t\ta.btAdptCreator = btac\n\t\t\t\ta.cfg.scanTimeout = scanTimeout // to speed up test\n\t\t\t\trequire.NoError(t, a.Connect())\n\t\t\t\ta.characteristics[\"charauuid\"] = &btTestChara{}\n\t\t\t\tif !tc.dropCharacteristics {\n\t\t\t\t\twantCharaLen = 1\n\t\t\t\t}\n\t\t\t}\n\t\t\t// act\n\t\t\terr := a.Disconnect()\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.False(t, a.connected)\n\t\t\trequire.NotNil(t, a.characteristics)\n\t\t\tassert.Len(t, a.characteristics, wantCharaLen)\n\t\t})\n\t}\n}\n\nfunc TestReconnect(t *testing.T) {\n\tconst (\n\t\tscanTimeout   = 5 * time.Millisecond\n\t\tdeviceName    = \"hello\"\n\t\tdeviceAddress = \"11:22:44:AA:BB:CC\"\n\t\trssi          = 56\n\t)\n\ttests := map[string]struct {\n\t\twasConnected          bool\n\t\tdropCharacteristics   bool\n\t\tsimulateDisconnectErr bool\n\t\tsimulateConnectErr    bool\n\t\twantErr               string\n\t}{\n\t\t\"reconnect_not_connected\": {},\n\t\t\"reconnect_was_connected\": {\n\t\t\twasConnected: true,\n\t\t},\n\t\t\"reconnect_drop_charas\": {\n\t\t\twasConnected:        true,\n\t\t\tdropCharacteristics: true,\n\t\t},\n\t\t\"error_disconnect\": {\n\t\t\tsimulateDisconnectErr: true,\n\t\t\twasConnected:          true,\n\t\t\twantErr:               \"device disconnect error\",\n\t\t},\n\t\t\"error_connect\": {\n\t\t\tsimulateConnectErr: true,\n\t\t\twasConnected:       true,\n\t\t\twantErr:            \"adapter connect error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(deviceAddress)\n\t\t\textDevice := btTestDevice{simulateDisconnectErr: tc.simulateDisconnectErr}\n\t\t\tbtdc := func(_ bluetoothExtDevicer, address, name string) *btDevice {\n\t\t\t\treturn &btDevice{extDevice: extDevice, devAddress: address, devName: name}\n\t\t\t}\n\t\t\textAdapter := &btTestAdapter{\n\t\t\t\tsimulateConnectErr: tc.simulateConnectErr,\n\t\t\t\tdeviceAddress:      deviceAddress,\n\t\t\t\trssi:               rssi,\n\t\t\t\tpayload:            &btTestPayload{name: deviceName},\n\t\t\t}\n\t\t\ta.btAdpt = &btAdapter{extAdapter: extAdapter, btDeviceCreator: btdc}\n\t\t\ta.cfg.scanTimeout = scanTimeout // to speed up test in case of errors\n\t\t\ta.cfg.sleepAfterDisconnect = 0  // to speed up test\n\t\t\ta.cfg.dropCharacteristicsOnDisconnect = tc.dropCharacteristics\n\t\t\tvar wantCharaLen int\n\t\t\tif tc.wasConnected {\n\t\t\t\ta.btDevice = btdc(nil, \"\", \"\")\n\t\t\t\ta.connected = tc.wasConnected\n\t\t\t\ta.characteristics[\"charauuid\"] = &btTestChara{}\n\t\t\t\tif !tc.dropCharacteristics {\n\t\t\t\t\twantCharaLen = 1\n\t\t\t\t}\n\t\t\t}\n\t\t\t// act\n\t\t\terr := a.Reconnect()\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, rssi, a.RSSI())\n\t\t\t\tassert.Len(t, a.characteristics, wantCharaLen)\n\t\t\t\tassert.True(t, a.connected)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFinalize(t *testing.T) {\n\t// this also tests Disconnect()\n\ttests := map[string]struct {\n\t\tsimulateDisconnectErr bool\n\t\twantErr               string\n\t}{\n\t\t\"disconnect\": {},\n\t\t\"error_disconnect\": {\n\t\t\tsimulateDisconnectErr: true,\n\t\t\twantErr:               \"device disconnect error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(\"\")\n\t\t\ta.cfg.sleepAfterDisconnect = 0 // to speed up test\n\t\t\textDevice := btTestDevice{simulateDisconnectErr: tc.simulateDisconnectErr}\n\t\t\ta.btDevice = &btDevice{extDevice: extDevice}\n\t\t\t// act\n\t\t\terr := a.Finalize()\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.False(t, a.connected)\n\t\t})\n\t}\n}\n\nfunc TestReadCharacteristic(t *testing.T) {\n\tconst uuid = \"00001234-0000-1000-8000-00805f9b34fb\"\n\ttests := map[string]struct {\n\t\tinUUID       string\n\t\tchara        *btTestChara\n\t\tnotConnected bool\n\t\twant         []byte\n\t\twantErr      string\n\t}{\n\t\t\"read_ok\": {\n\t\t\tinUUID: uuid,\n\t\t\tchara:  &btTestChara{readData: []byte{1, 2, 3}},\n\t\t\twant:   []byte{1, 2, 3},\n\t\t},\n\t\t\"error_not_connected\": {\n\t\t\tnotConnected: true,\n\t\t\twantErr:      \"cannot read from BLE device until connected\",\n\t\t},\n\t\t\"error_bad_chara\": {\n\t\t\tinUUID:  \"gag1\",\n\t\t\twantErr: \"'gag1' is not a valid 16-bit Bluetooth UUID\",\n\t\t},\n\t\t\"error_unknown_chara\": {\n\t\t\tinUUID:  uuid,\n\t\t\twantErr: \"unknown characteristic: 00001234-0000-1000-8000-00805f9b34fb\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(\"\")\n\t\t\tif tc.chara != nil {\n\t\t\t\ta.characteristics[uuid] = tc.chara\n\t\t\t}\n\t\t\ta.connected = !tc.notConnected\n\t\t\t// act\n\t\t\tgot, err := a.ReadCharacteristic(tc.inUUID)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestWriteCharacteristic(t *testing.T) {\n\tconst uuid = \"00004321-0000-1000-8000-00805f9b34fb\"\n\ttests := map[string]struct {\n\t\tinUUID       string\n\t\tinData       []byte\n\t\tnotConnected bool\n\t\tchara        *btTestChara\n\t\twant         []byte\n\t\twantErr      string\n\t}{\n\t\t\"write_ok\": {\n\t\t\tinUUID: uuid,\n\t\t\tinData: []byte{3, 2, 1},\n\t\t\tchara:  &btTestChara{},\n\t\t\twant:   []byte{3, 2, 1},\n\t\t},\n\t\t\"error_not_connected\": {\n\t\t\tnotConnected: true,\n\t\t\twantErr:      \"cannot write to BLE device until connected\",\n\t\t},\n\t\t\"error_bad_chara\": {\n\t\t\tinUUID:  \"gag2\",\n\t\t\twantErr: \"'gag2' is not a valid 16-bit Bluetooth UUID\",\n\t\t},\n\t\t\"error_unknown_chara\": {\n\t\t\tinUUID:  uuid,\n\t\t\twantErr: \"unknown characteristic: 00004321-0000-1000-8000-00805f9b34fb\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(\"\")\n\t\t\tif tc.chara != nil {\n\t\t\t\ta.characteristics[uuid] = tc.chara\n\t\t\t}\n\t\t\ta.connected = !tc.notConnected\n\t\t\t// act\n\t\t\terr := a.WriteCharacteristic(tc.inUUID, tc.inData)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, tc.want, tc.chara.writtenData)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubscribe(t *testing.T) {\n\tconst uuid = \"00004321-0000-1000-8000-00805f9b34fb\"\n\ttests := map[string]struct {\n\t\tinUUID       string\n\t\tnotConnected bool\n\t\tchara        *btTestChara\n\t\twant         []byte\n\t\twantErr      string\n\t}{\n\t\t\"subscribe_ok\": {\n\t\t\tinUUID: uuid,\n\t\t\tchara:  &btTestChara{},\n\t\t\twant:   []byte{3, 4, 5},\n\t\t},\n\t\t\"error_not_connected\": {\n\t\t\tnotConnected: true,\n\t\t\twantErr:      \"cannot subscribe to BLE device until connected\",\n\t\t},\n\t\t\"error_bad_chara\": {\n\t\t\tinUUID:  \"gag2\",\n\t\t\twantErr: \"'gag2' is not a valid 16-bit Bluetooth UUID\",\n\t\t},\n\t\t\"error_unknown_chara\": {\n\t\t\tinUUID:  uuid,\n\t\t\twantErr: \"unknown characteristic: 00004321-0000-1000-8000-00805f9b34fb\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(\"\")\n\t\t\tif tc.chara != nil {\n\t\t\t\ta.characteristics[uuid] = tc.chara\n\t\t\t}\n\t\t\ta.connected = !tc.notConnected\n\t\t\tvar got []byte\n\t\t\tnotificationFunc := func(data []byte) {\n\t\t\t\tgot = append(got, data...)\n\t\t\t}\n\t\t\t// act\n\t\t\terr := a.Subscribe(tc.inUUID, notificationFunc)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\ttc.chara.notificationFunc([]byte{3, 4, 5})\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc TestUnsubscribe(t *testing.T) {\n\tconst uuid = \"00004321-0000-1000-8000-00805f9b34fb\"\n\ttests := map[string]struct {\n\t\tinUUID       string\n\t\tnotConnected bool\n\t\tchara        *btTestChara\n\t\twantErr      string\n\t}{\n\t\t\"unsubscribe_ok\": {\n\t\t\tinUUID: uuid,\n\t\t\tchara:  &btTestChara{notificationFunc: func([]byte) {}},\n\t\t},\n\t\t\"error_not_connected\": {\n\t\t\tnotConnected: true,\n\t\t\twantErr:      \"cannot unsubscribe from BLE device until connected\",\n\t\t},\n\t\t\"error_bad_chara\": {\n\t\t\tinUUID:  \"gag2\",\n\t\t\twantErr: \"'gag2' is not a valid 16-bit Bluetooth UUID\",\n\t\t},\n\t\t\"error_unknown_chara\": {\n\t\t\tinUUID:  uuid,\n\t\t\twantErr: \"unknown characteristic: 00004321-0000-1000-8000-00805f9b34fb\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(\"\")\n\t\t\tif tc.chara != nil {\n\t\t\t\ta.characteristics[uuid] = tc.chara\n\t\t\t}\n\t\t\ta.connected = !tc.notConnected\n\t\t\t// act\n\t\t\terr := a.Unsubscribe(tc.inUUID)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\trequire.NotNil(t, a.characteristics)\n\t\t\t\trequire.NotNil(t, a.characteristics[uuid])\n\t\t\t\tassert.Nil(t, tc.chara.notificationFunc)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/bleclient/btwrapper.go",
    "content": "package bleclient\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"tinygo.org/x/bluetooth\"\n)\n\n// bluetoothExtDevicer is the interface usually implemented by bluetooth.Device\ntype bluetoothExtDevicer interface {\n\tDiscoverServices(uuids []bluetooth.UUID) ([]bluetooth.DeviceService, error)\n\tDisconnect() error\n}\n\n// bluetoothExtAdapterer is the interface usually implemented by bluetooth.Adapter\ntype bluetoothExtAdapterer interface {\n\tEnable() error\n\tScan(callback func(*bluetooth.Adapter, bluetooth.ScanResult)) error\n\tStopScan() error\n\tConnect(address bluetooth.Address, params bluetooth.ConnectionParams) (bluetooth.Device, error)\n}\n\ntype bluetoothExtCharacteristicer interface {\n\tRead(data []byte) (int, error)\n\tWriteWithoutResponse(p []byte) (n int, err error)\n\tEnableNotifications(callback func(buf []byte)) error\n}\n\n// btAdptCreatorFunc is just a convenience type, used in the BLE client to ensure testability\ntype btAdptCreatorFunc func(bluetoothExtAdapterer, bool) *btAdapter\n\n// btAdapter is the wrapper for an external adapter implementation\ntype btAdapter struct {\n\textAdapter      bluetoothExtAdapterer\n\tbtDeviceCreator func(bluetoothExtDevicer, string, string) *btDevice\n\tdebug           bool\n}\n\n// newBtAdapter creates a new wrapper around the given external implementation\nfunc newBtAdapter(a bluetoothExtAdapterer, debug bool) *btAdapter {\n\tbta := btAdapter{\n\t\textAdapter:      a,\n\t\tbtDeviceCreator: newBtDevice,\n\t\tdebug:           debug,\n\t}\n\n\treturn &bta\n}\n\n// Enable configures the BLE stack. It must be called before any Bluetooth-related calls (unless otherwise indicated).\n// It pass through the function of the external implementation.\nfunc (bta *btAdapter) enable() error {\n\treturn bta.extAdapter.Enable()\n}\n\n// StopScan stops any in-progress scan. It can be called from within a Scan callback to stop the current scan.\n// If no scan is in progress, an error will be returned.\nfunc (bta *btAdapter) stopScan() error {\n\treturn bta.extAdapter.StopScan()\n}\n\n// Connect starts a connection attempt to the given peripheral device address.\n//\n// On Linux and Windows, the IsRandom part of the address is ignored.\nfunc (bta *btAdapter) connect(address bluetooth.Address, devName string) (*btDevice, error) {\n\textDev, err := bta.extAdapter.Connect(address, bluetooth.ConnectionParams{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn bta.btDeviceCreator(extDev, address.String(), devName), nil\n}\n\n// Scan starts a BLE scan for the given identifier (address or name).\nfunc (bta *btAdapter) scan(identifier string, scanTimeout time.Duration) (*bluetooth.ScanResult, error) {\n\tresultChan := make(chan bluetooth.ScanResult, 1)\n\terrChan := make(chan error)\n\n\tgo func() {\n\t\tcallback := func(_ *bluetooth.Adapter, result bluetooth.ScanResult) {\n\t\t\tif bta.debug {\n\t\t\t\tfmt.Printf(\"[scan result]: address: '%s', rssi: %d, name: '%s', manufacturer: %v\\n\",\n\t\t\t\t\tresult.Address, result.RSSI, result.LocalName(), result.ManufacturerData())\n\t\t\t}\n\t\t\tif result.Address.String() == identifier || result.LocalName() == identifier {\n\t\t\t\tresultChan <- result\n\t\t\t}\n\t\t}\n\t\terr := bta.extAdapter.Scan(callback)\n\t\tif err != nil {\n\t\t\terrChan <- err\n\t\t}\n\t}()\n\n\tselect {\n\tcase result := <-resultChan:\n\t\tif err := bta.stopScan(); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"stop scan: %v\", err)\n\t\t}\n\n\t\treturn &result, nil\n\tcase err := <-errChan:\n\t\treturn nil, err\n\tcase <-time.After(scanTimeout):\n\t\t_ = bta.stopScan()\n\t\treturn nil, fmt.Errorf(\"scan timeout (%s) elapsed\", scanTimeout)\n\t}\n}\n\n// btDevice is the wrapper for an external device implementation\ntype btDevice struct {\n\textDevice  bluetoothExtDevicer\n\tdevAddress string\n\tdevName    string\n}\n\n// newBtDevice creates a new wrapper around the given external implementation\nfunc newBtDevice(d bluetoothExtDevicer, address, name string) *btDevice {\n\treturn &btDevice{extDevice: d, devAddress: address, devName: name}\n}\n\nfunc (btd *btDevice) name() string { return btd.devName }\n\nfunc (btd *btDevice) address() string { return btd.devAddress }\n\nfunc (btd *btDevice) discoverServices(uuids []bluetooth.UUID) ([]bluetooth.DeviceService, error) {\n\treturn btd.extDevice.DiscoverServices(uuids)\n}\n\n// Disconnect from the BLE device. This method is non-blocking and does not wait until the connection is fully gone.\nfunc (btd *btDevice) disconnect() error {\n\tif btd != nil && btd.extDevice != nil {\n\t\treturn btd.extDevice.Disconnect()\n\t}\n\n\treturn nil\n}\n\nfunc readFromCharacteristic(chara bluetoothExtCharacteristicer) ([]byte, error) {\n\tbuf := make([]byte, 255)\n\tn, err := chara.Read(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn buf[:n], nil\n}\n\nfunc writeToCharacteristicWithoutResponse(chara bluetoothExtCharacteristicer, data []byte) error {\n\tif _, err := chara.WriteWithoutResponse(data); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc adjustNotificationsForCharacteristic(chara bluetoothExtCharacteristicer, f func(data []byte)) error {\n\treturn chara.EnableNotifications(f)\n}\n"
  },
  {
    "path": "platforms/bleclient/doc.go",
    "content": "/*\nPackage bleclient provides the Gobot client adaptor for Bluetooth LE.\n\nFor more information refer to the README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/bleclient/README.md\n*/\npackage bleclient // import \"gobot.io/x/gobot/v2/platforms/bleclient\"\n"
  },
  {
    "path": "platforms/bleclient/helpers_test.go",
    "content": "package bleclient\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"tinygo.org/x/bluetooth\"\n)\n\ntype btTestAdapter struct {\n\tdeviceAddress       string\n\trssi                int16\n\tscanDelay           time.Duration\n\tpayload             *btTestPayload\n\tsimulateEnableErr   bool\n\tsimulateScanErr     bool\n\tsimulateStopScanErr bool\n\tsimulateConnectErr  bool\n}\n\nfunc (bta *btTestAdapter) Enable() error {\n\tif bta.simulateEnableErr {\n\t\treturn fmt.Errorf(\"adapter enable error\")\n\t}\n\n\treturn nil\n}\n\nfunc (bta *btTestAdapter) Scan(callback func(*bluetooth.Adapter, bluetooth.ScanResult)) error {\n\tif bta.simulateScanErr {\n\t\treturn fmt.Errorf(\"adapter scan error\")\n\t}\n\n\tdevAddr, err := bluetooth.ParseMAC(bta.deviceAddress)\n\tif err != nil {\n\t\t// normally this error should not happen in test\n\t\treturn err\n\t}\n\ttime.Sleep(bta.scanDelay)\n\n\ta := bluetooth.Address{MACAddress: bluetooth.MACAddress{MAC: devAddr}}\n\tr := bluetooth.ScanResult{Address: a, RSSI: bta.rssi, AdvertisementPayload: bta.payload}\n\tcallback(nil, r)\n\n\treturn nil\n}\n\nfunc (bta *btTestAdapter) StopScan() error {\n\tif bta.simulateStopScanErr {\n\t\treturn fmt.Errorf(\"adapter stop scan error\")\n\t}\n\n\treturn nil\n}\n\nfunc (bta *btTestAdapter) Connect(addr bluetooth.Address, _ bluetooth.ConnectionParams) (bluetooth.Device, error) {\n\tif bta.simulateConnectErr {\n\t\treturn bluetooth.Device{}, fmt.Errorf(\"adapter connect error\")\n\t}\n\n\treturn bluetooth.Device{Address: addr}, nil\n}\n\ntype btTestPayload struct {\n\tname string\n}\n\nfunc (ptp *btTestPayload) LocalName() string { return ptp.name }\n\nfunc (*btTestPayload) HasServiceUUID(bluetooth.UUID) bool { return true }\n\nfunc (*btTestPayload) ServiceUUIDs() []bluetooth.UUID { return nil }\n\nfunc (*btTestPayload) Bytes() []byte { return nil }\n\nfunc (*btTestPayload) ManufacturerData() []bluetooth.ManufacturerDataElement { return nil }\n\nfunc (*btTestPayload) ServiceData() []bluetooth.ServiceDataElement { return nil }\n\ntype btTestDevice struct {\n\tsimulateDiscoverServicesErr bool\n\tsimulateDisconnectErr       bool\n}\n\nfunc (btd btTestDevice) DiscoverServices(_ []bluetooth.UUID) ([]bluetooth.DeviceService, error) {\n\tif btd.simulateDiscoverServicesErr {\n\t\treturn nil, fmt.Errorf(\"device discover services error\")\n\t}\n\n\t// for this test we can not return any []bluetooth.DeviceService\n\treturn nil, nil\n}\n\nfunc (btd btTestDevice) Disconnect() error {\n\tif btd.simulateDisconnectErr {\n\t\treturn fmt.Errorf(\"device disconnect error\")\n\t}\n\n\treturn nil\n}\n\n// btTestChara implements bluetoothExtCharacteristicer\ntype btTestChara struct {\n\treadData         []byte\n\twrittenData      []byte\n\tnotificationFunc func(buf []byte)\n}\n\nfunc (btc *btTestChara) Read(data []byte) (int, error) {\n\tcopy(data, btc.readData)\n\treturn len(btc.readData), nil\n}\n\nfunc (btc *btTestChara) WriteWithoutResponse(data []byte) (int, error) {\n\tbtc.writtenData = append(btc.writtenData, data...)\n\treturn len(data), nil\n}\n\nfunc (btc *btTestChara) EnableNotifications(callback func(buf []byte)) error {\n\tbtc.notificationFunc = callback\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/bleclient/uuid.go",
    "content": "package bleclient\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"tinygo.org/x/bluetooth\"\n)\n\n// convertUUID creates a common 128 bit UUID xxxxyyyy-0000-1000-8000-00805f9b34fb from a short 16 bit UUID by replacing\n// the yyyy fields. If the given ID is still an arbitrary long one but without dashes, the dashes will be added.\n// Additionally some simple checks for the resulting UUID will be done.\nfunc convertUUID(cUUID string) (string, error) {\n\tvar uuid string\n\tswitch len(cUUID) {\n\tcase 4:\n\t\tuid, err := strconv.ParseUint(cUUID, 16, 16)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"'%s' is not a valid 16-bit Bluetooth UUID: %v\", cUUID, err)\n\t\t}\n\t\treturn bluetooth.New16BitUUID(uint16(uid)).String(), nil\n\tcase 32:\n\t\t// convert \"22bb746f2bbd75542d6f726568705327\" to \"22bb746f-2bbd-7554-2d6f-726568705327\"\n\t\tuuid = fmt.Sprintf(\"%s-%s-%s-%s-%s\", cUUID[:8], cUUID[8:12], cUUID[12:16], cUUID[16:20], cUUID[20:])\n\tcase 36:\n\t\tuuid = cUUID\n\t}\n\n\tif uuid != \"\" {\n\t\tid := strings.ReplaceAll(uuid, \"-\", \"\")\n\t\t_, errHigh := strconv.ParseUint(id[:16], 16, 64)\n\t\t_, errLow := strconv.ParseUint(id[16:], 16, 64)\n\t\tif errHigh == nil && errLow == nil {\n\t\t\treturn uuid, nil\n\t\t}\n\t}\n\n\treturn \"\", fmt.Errorf(\"'%s' is not a valid 128-bit Bluetooth UUID\", cUUID)\n}\n"
  },
  {
    "path": "platforms/bleclient/uuid_test.go",
    "content": "package bleclient\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_convertUUID(t *testing.T) {\n\ttests := map[string]struct {\n\t\tinput   string\n\t\twant    string\n\t\twantErr string\n\t}{\n\t\t\"32_bit\": {\n\t\t\tinput: \"12345678-4321-1234-4321-123456789abc\",\n\t\t\twant:  \"12345678-4321-1234-4321-123456789abc\",\n\t\t},\n\t\t\"16_bit\": {\n\t\t\tinput: \"12f4\",\n\t\t\twant:  \"000012f4-0000-1000-8000-00805f9b34fb\",\n\t\t},\n\t\t\"32_bit_without_dashes\": {\n\t\t\tinput: \"0123456789abcdef012345678abcdefc\",\n\t\t\twant:  \"01234567-89ab-cdef-0123-45678abcdefc\",\n\t\t},\n\t\t\"error_bad_chacters_16bit\": {\n\t\t\tinput:   \"123g\",\n\t\t\twantErr: \"'123g' is not a valid 16-bit Bluetooth UUID\",\n\t\t},\n\t\t\"error_bad_chacters_32bit\": {\n\t\t\tinput:   \"12345678-4321-1234-4321-123456789abg\",\n\t\t\twantErr: \"'12345678-4321-1234-4321-123456789abg' is not a valid 128-bit Bluetooth UUID\",\n\t\t},\n\t\t\"error_too_long\": {\n\t\t\tinput:   \"12345678-4321-1234-4321-123456789abcd\",\n\t\t\twantErr: \"'12345678-4321-1234-4321-123456789abcd' is not a valid 128-bit Bluetooth UUID\",\n\t\t},\n\t\t\"error_invalid\": {\n\t\t\tinput:   \"12345\",\n\t\t\twantErr: \"'12345' is not a valid 128-bit Bluetooth UUID\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// act\n\t\t\tgot, err := convertUUID(tc.input)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/chip/LICENSE",
    "content": "Copyright (c) 2015-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/chip/README.md",
    "content": "# C.H.I.P.\n\nThe [C.H.I.P.](http://www.getchip.com/) is a small, inexpensive ARM based single board computer, with many different IO\ninterfaces available on the [pin headers](http://docs.getchip.com/#pin-headers).\n\nFor documentation about the C.H.I.P. platform click [here](http://docs.getchip.com/).\n\nThe [C.H.I.P. Pro](https://getchip.com/pages/chippro) is a version of C.H.I.P. intended for use in embedded product\ndevelopment. Here is info about the [C.H.I.P. Pro pin headers](https://docs.getchip.com/chip_pro.html#pin-descriptions).\n\n## How to Install\n\nWe recommend updating to the latest Debian OS when using the C.H.I.P., however Gobot should also support older versions\nof the OS, should your application require this.\n\nYou would normally install Go and Gobot on your workstation. Once installed, cross compile your program on your\nworkstation, transfer the final executable to your C.H.I.P and run the program on the C.H.I.P. itself as documented here.\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n### PWM support\n\nNote that PWM might not be available in your kernel. In that case, you can install the required device tree overlay\nfrom the command line using [Gort](https://gobot.io/x/gort) CLI commands on the C.H.I.P device.\nHere are the steps:\n\nInstall the required patched device tree compiler as described in the [C.H.I.P docs](https://docs.getchip.com/dip.html#make-a-dtbo-device-tree-overlay-blob):\n\n```sh\ngort chip install dtc\n```\n\nNow, install the pwm overlay to activate pwm on the PWM0 pin:\n\n```sh\ngort chip install pwm\n```\n\nReboot the device to make sure the init script loads the overlay on boot.\n\n## How to Use\n\nPlease refer to one example for your platform, e.g. [chip_button.go](https://github.com/hybridgroup/gobot/blob/release/examples/chip_button.go).\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\nIf you want to use the C.H.I.P. Pro, use the `NewProAdaptor()` function like this:\n\n```go\nchipProAdaptor := chip.NewProAdaptor()\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```bash\nGOARM=7 GOARCH=arm GOOS=linux go build examples/chip_button.go\n```\n\nOnce you have compiled your code, you can you can upload your program and execute it on the C.H.I.P. from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```bash\nscp chip_button root@192.168.1.xx:\nssh -t root@192.168.1.xx \"./chip_button\"\n```\n"
  },
  {
    "path": "platforms/chip/chip_adaptor.go",
    "content": "package chip\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 1\n\n\tdefaultSpiMaxSpeed = 5000 // 5kHz (more than 15kHz not possible with SPI over GPIO)\n)\n\n// Valids pins are the XIO-P0 through XIO-P7 pins from the\n// extender (pins 13-20 on header 14), as well as the SoC pins\n// aka all the other pins.\ntype sysfsPin struct {\n\tpin    int\n\tpwmPin int\n}\n\n// Adaptor represents a Gobot Adaptor for a C.H.I.P.\ntype Adaptor struct {\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor // for usage of \"adaptors.WithSpiGpioAccess()\"\n\n\tname   string\n\tsys    *system.Accesser // used for unit tests only\n\tmutex  sync.Mutex\n\tpinMap map[string]sysfsPin\n}\n\n// NewAdaptor creates a C.H.I.P. Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of sysfs\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\n// Further optional parameters for:\n//\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\ta := &Adaptor{\n\t\tname: gobot.DefaultName(\"CHIP\"),\n\t\tsys:  sys,\n\t}\n\n\ta.pinMap = chipPins\n\tbaseAddr, _ := getXIOBase()\n\tfor i := 0; i < 8; i++ {\n\t\tpin := fmt.Sprintf(\"XIO-P%d\", i)\n\t\ta.pinMap[pin] = sysfsPin{pin: baseAddr + i, pwmPin: -1}\n\t}\n\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\t// Valid bus numbers are [0..2] which corresponds to /dev/i2c-0 through /dev/i2c-2.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1, 2})\n\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.translateDigitalPin, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.translatePWMPin, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\n\t// SPI is only supported when \"adaptors.WithSpiGpioAccess()\" is given\n\tif len(spiBusOpts) > 0 {\n\t\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, func(int) error { return nil }, 0, 0, 0, 0, defaultSpiMaxSpeed,\n\t\t\ta.DigitalPinsAdaptor, spiBusOpts...)\n\t}\n\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board and pins\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n\nfunc getXIOBase() (int, error) {\n\t// Default to original base from 4.3 kernel\n\tbaseAddr := 408\n\tconst expanderID = \"pcf8574a\"\n\n\tlabels, err := filepath.Glob(\"/sys/class/gpio/*/label\")\n\tif err != nil {\n\t\treturn baseAddr, err\n\t}\n\n\tfor _, labelPath := range labels {\n\t\tlabel, err := os.ReadFile(labelPath)\n\t\tif err != nil {\n\t\t\treturn baseAddr, err\n\t\t}\n\t\tif strings.HasPrefix(string(label), expanderID) {\n\t\t\texpanderPath, _ := filepath.Split(labelPath)\n\t\t\tbasePath := filepath.Join(expanderPath, \"base\")\n\t\t\tbase, err := os.ReadFile(basePath)\n\t\t\tif err != nil {\n\t\t\t\treturn baseAddr, err\n\t\t\t}\n\t\t\tbaseAddr, _ = strconv.Atoi(strings.TrimSpace(string(base)))\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn baseAddr, nil\n}\n\nfunc (a *Adaptor) translateDigitalPin(id string) (string, int, error) {\n\tif val, ok := a.pinMap[id]; ok {\n\t\treturn \"\", val.pin, nil\n\t}\n\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a digital pin\", id)\n}\n\nfunc (a *Adaptor) translatePWMPin(id string) (string, int, error) {\n\tsysPin, ok := a.pinMap[id]\n\tif !ok {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a pin\", id)\n\t}\n\tif sysPin.pwmPin == -1 {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a PWM pin\", id)\n\t}\n\treturn \"/sys/class/pwm/pwmchip0\", sysPin.pwmPin, nil\n}\n"
  },
  {
    "path": "platforms/chip/chip_adaptor_test.go",
    "content": "package chip\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ gpio.ServoWriter            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nvar mockPaths = []string{\n\t\"/sys/class/gpio/export\",\n\t\"/sys/class/gpio/unexport\",\n\t\"/sys/class/gpio/gpio50/value\",\n\t\"/sys/class/gpio/gpio50/direction\",\n\t\"/sys/class/gpio/gpio139/value\",\n\t\"/sys/class/gpio/gpio139/direction\",\n\t\"/sys/class/pwm/pwmchip0/export\",\n\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\"/sys/class/pwm/pwmchip0/pwm0/enable\",\n\t\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\",\n\t\"/sys/class/pwm/pwmchip0/pwm0/polarity\",\n\t\"/sys/class/pwm/pwmchip0/pwm0/period\",\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem() (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"CHIP\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.pinMap)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.Nil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithSpiGpioAccess(\"1\", \"2\", \"3\", \"4\"))\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"CHIP\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.pinMap)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\trequire.NoError(t, a.DigitalWrite(\"CSID7\", 1))\n\n\tfs.WithWriteError = true\n\n\terr := a.Finalize()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestFinalizeErrorAfterPWM(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\"].Contents = \"0\"\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm0/period\"].Contents = \"0\"\n\n\trequire.NoError(t, a.PwmWrite(\"PWM0\", 100))\n\n\tfs.WithWriteError = true\n\n\terr := a.Finalize()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.DigitalWrite(\"CSID7\", 1))\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio139/value\"].Contents)\n\n\tfs.Files[\"/sys/class/gpio/gpio50/value\"].Contents = \"1\"\n\ti, _ := a.DigitalRead(\"TWI2-SDA\")\n\tassert.Equal(t, 1, i)\n\n\trequire.ErrorContains(t, a.DigitalWrite(\"XIO-P10\", 1), \"'XIO-P10' is not a valid id for a digital pin\")\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestPWMWrite(t *testing.T) {\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\"].Contents = \"0\"\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm0/period\"].Contents = \"0\"\n\t// act\n\terr := a.PwmWrite(\"PWM0\", 100)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"0\", fs.Files[\"/sys/class/pwm/pwmchip0/export\"].Contents)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/enable\"].Contents)\n\tassert.Equal(t, \"3921568\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\"].Contents)\n\tassert.Equal(t, \"10000000\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/period\"].Contents) // pwmPeriodDefault\n\tassert.Equal(t, \"normal\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/polarity\"].Contents)\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestServoWrite(t *testing.T) {\n\t// arrange: prepare 50Hz for servos\n\tconst (\n\t\tpin         = \"PWM0\"\n\t\tfiftyHzNano = 20000000\n\t)\n\ta := NewAdaptor(adaptors.WithPWMDefaultPeriodForPin(pin, fiftyHzNano))\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\trequire.NoError(t, a.Connect())\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\"].Contents = \"0\"\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm0/period\"].Contents = \"0\"\n\t// act & assert for 0° (min default value)\n\terr := a.ServoWrite(pin, 0)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/period\"].Contents)\n\tassert.Equal(t, \"500000\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\"].Contents)\n\t// act & assert for 180° (max default value)\n\terr = a.ServoWrite(pin, 180)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/period\"].Contents)\n\tassert.Equal(t, \"2500000\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\"].Contents)\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 1, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-2\"})\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 2)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n\nfunc Test_translatePWMPin(t *testing.T) {\n\ttests := map[string]struct {\n\t\tusePro      bool\n\t\twantDir     string\n\t\twantChannel int\n\t\twantErr     error\n\t}{\n\t\t\"PWM0\": {\n\t\t\twantDir:     \"/sys/class/pwm/pwmchip0\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"PWM1\": {\n\t\t\tusePro:      true,\n\t\t\twantDir:     \"/sys/class/pwm/pwmchip0\",\n\t\t\twantChannel: 1,\n\t\t},\n\t\t\"33_1\": {\n\t\t\twantDir:     \"\",\n\t\t\twantChannel: -1,\n\t\t\twantErr:     fmt.Errorf(\"'33_1' is not a valid id for a pin\"),\n\t\t},\n\t\t\"AP-EINT3\": {\n\t\t\twantDir:     \"\",\n\t\t\twantChannel: -1,\n\t\t\twantErr:     fmt.Errorf(\"'AP-EINT3' is not a valid id for a PWM pin\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tvar a *Adaptor\n\t\t\tif tc.usePro {\n\t\t\t\ta = NewProAdaptor()\n\t\t\t} else {\n\t\t\t\ta = NewAdaptor()\n\t\t\t}\n\t\t\t// act\n\t\t\tdir, channel, err := a.translatePWMPin(name)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantDir, dir)\n\t\t\tassert.Equal(t, tc.wantChannel, channel)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/chip/chip_pinmap.go",
    "content": "package chip\n\nvar chipPins = map[string]sysfsPin{\n\t\"PWM0\": {\n\t\tpin:    34,\n\t\tpwmPin: 0,\n\t},\n\t\"AP-EINT3\": {\n\t\tpin:    35,\n\t\tpwmPin: -1,\n\t},\n\t\"TWI1-SCK\": {\n\t\tpin:    47,\n\t\tpwmPin: -1,\n\t},\n\t\"TWI1-SDA\": {\n\t\tpin:    48,\n\t\tpwmPin: -1,\n\t},\n\t\"TWI2-SCK\": {\n\t\tpin:    49,\n\t\tpwmPin: -1,\n\t},\n\t\"TWI2-SDA\": {\n\t\tpin:    50,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D2\": {\n\t\tpin:    98,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D3\": {\n\t\tpin:    99,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D4\": {\n\t\tpin:    100,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D5\": {\n\t\tpin:    101,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D6\": {\n\t\tpin:    102,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D7\": {\n\t\tpin:    103,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D10\": {\n\t\tpin:    106,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D11\": {\n\t\tpin:    107,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D12\": {\n\t\tpin:    108,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D13\": {\n\t\tpin:    109,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D14\": {\n\t\tpin:    110,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D15\": {\n\t\tpin:    111,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D18\": {\n\t\tpin:    114,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D19\": {\n\t\tpin:    115,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D20\": {\n\t\tpin:    116,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D21\": {\n\t\tpin:    117,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D22\": {\n\t\tpin:    118,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D23\": {\n\t\tpin:    119,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-CLK\": {\n\t\tpin:    120,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-DE\": {\n\t\tpin:    121,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-HSYNC\": {\n\t\tpin:    122,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-VSYNC\": {\n\t\tpin:    123,\n\t\tpwmPin: -1,\n\t},\n\t\"CSIPCK\": {\n\t\tpin:    128,\n\t\tpwmPin: -1,\n\t},\n\t\"CSICK\": {\n\t\tpin:    129,\n\t\tpwmPin: -1,\n\t},\n\t\"CSIHSYNC\": {\n\t\tpin:    130,\n\t\tpwmPin: -1,\n\t},\n\t\"CSIVSYNC\": {\n\t\tpin:    131,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID0\": {\n\t\tpin:    132,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID1\": {\n\t\tpin:    133,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID2\": {\n\t\tpin:    134,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID3\": {\n\t\tpin:    135,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID4\": {\n\t\tpin:    136,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID5\": {\n\t\tpin:    137,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID6\": {\n\t\tpin:    138,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID7\": {\n\t\tpin:    139,\n\t\tpwmPin: -1,\n\t},\n\t\"AP-EINT1\": {\n\t\tpin:    193,\n\t\tpwmPin: -1,\n\t},\n\t\"UART1-TX\": {\n\t\tpin:    195,\n\t\tpwmPin: -1,\n\t},\n\t\"UART1-RX\": {\n\t\tpin:    196,\n\t\tpwmPin: -1,\n\t},\n}\n"
  },
  {
    "path": "platforms/chip/chippro_adaptor.go",
    "content": "package chip\n\nimport \"gobot.io/x/gobot/v2\"\n\n// NewProAdaptor creates a C.H.I.P. Pro Adaptor\nfunc NewProAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\ta.name = gobot.DefaultName(\"CHIP Pro\")\n\ta.pinMap = chipProPins\n\treturn a\n}\n"
  },
  {
    "path": "platforms/chip/chippro_adaptor_test.go",
    "content": "package chip\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc initConnectedTestProAdaptorWithMockedFilesystem() (*Adaptor, *system.MockFilesystem) {\n\ta := NewProAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc TestNewProAdaptor(t *testing.T) {\n\ta := NewProAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"CHIP Pro\"))\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestProDigitalIO(t *testing.T) {\n\ta, fs := initConnectedTestProAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.DigitalWrite(\"CSID7\", 1))\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio139/value\"].Contents)\n\n\tfs.Files[\"/sys/class/gpio/gpio50/value\"].Contents = \"1\"\n\ti, err := a.DigitalRead(\"TWI2-SDA\")\n\tassert.Equal(t, 1, i)\n\trequire.NoError(t, err)\n\n\trequire.ErrorContains(t, a.DigitalWrite(\"XIO-P0\", 1), \"'XIO-P0' is not a valid id for a digital pin\")\n\trequire.NoError(t, a.Finalize())\n}\n"
  },
  {
    "path": "platforms/chip/chippro_pinmap.go",
    "content": "package chip\n\nvar chipProPins = map[string]sysfsPin{\n\t\"PWM0\": {\n\t\tpin:    34,\n\t\tpwmPin: 0,\n\t},\n\t\"PWM1\": {\n\t\tpin:    205,\n\t\tpwmPin: 1,\n\t},\n\t\"LCD-D2\": {\n\t\tpin:    98,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D3\": {\n\t\tpin:    99,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D4\": {\n\t\tpin:    100,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D5\": {\n\t\tpin:    101,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D6\": {\n\t\tpin:    102,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D7\": {\n\t\tpin:    103,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D10\": {\n\t\tpin:    106,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D11\": {\n\t\tpin:    107,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D12\": {\n\t\tpin:    108,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D13\": {\n\t\tpin:    109,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D14\": {\n\t\tpin:    110,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D15\": {\n\t\tpin:    111,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D18\": {\n\t\tpin:    114,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D19\": {\n\t\tpin:    115,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D20\": {\n\t\tpin:    116,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D21\": {\n\t\tpin:    117,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D22\": {\n\t\tpin:    118,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-D23\": {\n\t\tpin:    119,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-CLK\": {\n\t\tpin:    120,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-HSYNC\": {\n\t\tpin:    122,\n\t\tpwmPin: -1,\n\t},\n\t\"LCD-VSYNC\": {\n\t\tpin:    123,\n\t\tpwmPin: -1,\n\t},\n\t\"UART1-TX\": {\n\t\tpin:    195,\n\t\tpwmPin: -1,\n\t},\n\t\"UART1-RX\": {\n\t\tpin:    196,\n\t\tpwmPin: -1,\n\t},\n\t\"AP-EINT1\": {\n\t\tpin:    193,\n\t\tpwmPin: -1,\n\t},\n\t\"AP-EINT3\": {\n\t\tpin:    35,\n\t\tpwmPin: -1,\n\t},\n\t\"TWI2-SCK\": {\n\t\tpin:    49,\n\t\tpwmPin: -1,\n\t},\n\t\"TWI2-SDA\": {\n\t\tpin:    50,\n\t\tpwmPin: -1,\n\t},\n\t\"CSIPCK\": {\n\t\tpin:    128,\n\t\tpwmPin: -1,\n\t},\n\t\"CSICK\": {\n\t\tpin:    129,\n\t\tpwmPin: -1,\n\t},\n\t\"CSIHSYNC\": {\n\t\tpin:    130,\n\t\tpwmPin: -1,\n\t},\n\t\"CSIVSYNC\": {\n\t\tpin:    131,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID0\": {\n\t\tpin:    132,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID1\": {\n\t\tpin:    133,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID2\": {\n\t\tpin:    134,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID3\": {\n\t\tpin:    135,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID4\": {\n\t\tpin:    136,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID5\": {\n\t\tpin:    137,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID6\": {\n\t\tpin:    138,\n\t\tpwmPin: -1,\n\t},\n\t\"CSID7\": {\n\t\tpin:    139,\n\t\tpwmPin: -1,\n\t},\n}\n"
  },
  {
    "path": "platforms/chip/doc.go",
    "content": "/*\nPackage chip contains the Gobot adaptor for the CHIP and CHIP Pro\n\nFor further information refer to the chip README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/chip/README.md\n*/\npackage chip // import \"gobot.io/x/gobot/v2/platforms/chip\"\n"
  },
  {
    "path": "platforms/dexter/README.md",
    "content": "# Dexter\n\nThis package contains the Gobot drivers for the various Dexter Industries (https://www.dexterindustries.com) robots.\n\nThis package currently supports the following robots:\n- [GoPiGo3](https://www.dexterindustries.com/gopigo3/)\n"
  },
  {
    "path": "platforms/dexter/dexter.go",
    "content": "/*\nPackage dexter contains Gobot drivers for the Dexter Industries robots\n\nThis package currently supports the following robots:\n- GoPiGo3\n\nFor further information refer to Dexter README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/dexter/README.md\n*/\npackage dexter\n"
  },
  {
    "path": "platforms/dexter/gopigo3/README.md",
    "content": "# GoPiGo3\n\nThe GoPiGo3 is a robotics controller by Dexter Industries that is compatible with the Raspberry Pi.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\nThis example will blink the left and right leds red/blue.\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  g \"gobot.io/x/gobot/v2/platforms/dexter/gopigo3\"\n  \"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n  raspiAdaptor := raspi.NewAdaptor()\n  gopigo3 := g.NewDriver(raspiAdaptor)\n\n  work := func() {\n    on := uint8(0xFF)\n    gobot.Every(1000*time.Millisecond, func() {\n      err := gopigo3.SetLED(g.LED_EYE_RIGHT, 0x00, 0x00, on)\n      if err != nil {\n        fmt.Println(err)\n      }\n      err = gopigo3.SetLED(g.LED_EYE_LEFT, ^on, 0x00, 0x00)\n      if err != nil {\n        fmt.Println(err)\n      }\n      on = ^on\n    })\n  }\n\n  robot := gobot.NewRobot(\"gopigo3\",\n    []gobot.Connection{raspiAdaptor},\n    []gobot.Device{gopigo3},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n"
  },
  {
    "path": "platforms/dexter/gopigo3/driver.go",
    "content": "// Package gopigo3 is based on https://github.com/DexterInd/GoPiGo3/blob/master/Software/Python/gopigo3.py\n// You will need to run the following commands if using a stock raspbian image before this library will work:\n// sudo curl -kL dexterindustries.com/update_gopigo3 | bash\n// sudo reboot\npackage gopigo3\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"log\"\n\t\"math\"\n\t\"time\"\n\n\t\"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n)\n\n// spi address for gopigo3\nconst goPiGo3Address = 0x08\n\n// register addresses for gopigo3\nconst (\n\tNONE byte = iota\n\tGET_MANUFACTURER\n\tGET_NAME\n\tGET_HARDWARE_VERSION\n\tGET_FIRMWARE_VERSION\n\tGET_ID\n\tSET_LED\n\tGET_VOLTAGE_5V\n\tGET_VOLTAGE_VCC\n\tSET_SERVO\n\tSET_MOTOR_PWM\n\tSET_MOTOR_POSITION\n\tSET_MOTOR_POSITION_KP\n\tSET_MOTOR_POSITION_KD\n\tSET_MOTOR_DPS\n\tSET_MOTOR_LIMITS\n\tOFFSET_MOTOR_ENCODER\n\tGET_MOTOR_ENCODER_LEFT\n\tGET_MOTOR_ENCODER_RIGHT\n\tGET_MOTOR_STATUS_LEFT\n\tGET_MOTOR_STATUS_RIGHT\n\tSET_GROVE_TYPE\n\tSET_GROVE_MODE\n\tSET_GROVE_STATE\n\tSET_GROVE_PWM_DUTY\n\tSET_GROVE_PWM_FREQUENCY\n\tGET_GROVE_VALUE_1\n\tGET_GROVE_VALUE_2\n\tGET_GROVE_STATE_1_1\n\tGET_GROVE_STATE_1_2\n\tGET_GROVE_STATE_2_1\n\tGET_GROVE_STATE_2_2\n\tGET_GROVE_VOLTAGE_1_1\n\tGET_GROVE_VOLTAGE_1_2\n\tGET_GROVE_VOLTAGE_2_1\n\tGET_GROVE_VOLTAGE_2_2\n\tGET_GROVE_ANALOG_1_1\n\tGET_GROVE_ANALOG_1_2\n\tGET_GROVE_ANALOG_2_1\n\tGET_GROVE_ANALOG_2_2\n\tSTART_GROVE_I2C_1\n\tSTART_GROVE_I2C_2\n)\n\nconst (\n\t// distance (mm) from left wheel to right wheel. This works with the initial GPG3 prototype. Will need to be adjusted.\n\tWHEEL_BASE_WIDTH = 117\n\t// wheel diameter (mm)\n\tWHEEL_DIAMETER = 66.5\n\t// circumference of the circle the wheels will trace while turning (mm)\n\tWHEEL_BASE_CIRCUMFERENCE = WHEEL_BASE_WIDTH * math.Pi\n\t// circumference of the wheels (mm)\n\tWHEEL_CIRCUMFERENCE = WHEEL_DIAMETER * math.Pi\n\t// motor gear ratio\n\tMOTOR_GEAR_RATIO = 120\n\t// encoder ticks per motor rotation (number of magnet positions)\n\tENCODER_TICKS_PER_ROTATION = 6\n\t// encoder ticks per output shaft rotation degree\n\tMOTOR_TICKS_PER_DEGREE = ((MOTOR_GEAR_RATIO * ENCODER_TICKS_PER_ROTATION) / 360.0)\n\tGROVE_I2C_LENGTH_LIMIT = 16\n\tMOTOR_FLOAT            = -128\n)\n\n// GroveMode sets the mode of AD pins on the gopigo3.\ntype GroveMode byte\n\nconst (\n\tGROVE_INPUT_DIGITAL          GroveMode = 0\n\tGROVE_OUTPUT_DIGITAL         GroveMode = 1\n\tGROVE_INPUT_DIGITAL_PULLUP   GroveMode = 2\n\tGROVE_INPUT_DIGITAL_PULLDOWN GroveMode = 3\n\tGROVE_INPUT_ANALOG           GroveMode = 4\n\tGROVE_OUTPUT_PWM             GroveMode = 5\n\tGROVE_INPUT_ANALOG_PULLUP    GroveMode = 6\n\tGROVE_INPUT_ANALOG_PULLDOWN  GroveMode = 7\n)\n\n// Servo contains the address for the 2 servo ports.\ntype Servo byte\n\nconst (\n\tSERVO_1 Servo = 0x01\n\tSERVO_2 Servo = 0x02\n)\n\n// Motor contains the address for the left and right motors.\ntype Motor byte\n\nconst (\n\tMOTOR_LEFT  Motor = 0x01\n\tMOTOR_RIGHT Motor = 0x02\n)\n\n// Led contains the addresses for all leds on the board.\ntype Led byte\n\nconst (\n\tLED_EYE_RIGHT     Led = 0x01\n\tLED_EYE_LEFT      Led = 0x02\n\tLED_BLINKER_LEFT  Led = 0x04\n\tLED_BLINKER_RIGHT Led = 0x08\n\tLED_WIFI          Led = 0x80\n)\n\n// Grove contains the addresses for pins/ports of the AD1/AD2 grove connector.\ntype Grove byte\n\nconst (\n\tAD11     string = \"AD_1_1\"\n\tAD12     string = \"AD_1_2\"\n\tAD21     string = \"AD_2_1\"\n\tAD22     string = \"AD_2_2\"\n\tAD_1_1_G Grove  = 0x01 // default pin for most grove devices, A0/D0\n\tAD_1_2_G Grove  = 0x02\n\tAD_2_1_G Grove  = 0x04 // default pin for most grove devices, A0/D0\n\tAD_2_2_G Grove  = 0x08\n\tAD_1_G   Grove  = AD_1_1_G + AD_1_2_G\n\tAD_2_G   Grove  = AD_2_1_G + AD_2_2_G\n)\n\n// GroveType represents the type of a grove device.\ntype GroveType int\n\nconst (\n\tCUSTOM        GroveType = 1\n\tIR_DI_REMOTE  GroveType = 2\n\tIR_EV3_REMOTE GroveType = 3\n\tUS            GroveType = 4\n\tI2C           GroveType = 5\n)\n\n// GroveState contains the state of a grove device.\ntype GroveState int\n\nconst (\n\tVALID_DATA GroveState = iota\n\tNOT_CONFIGURED\n\tCONFIGURING\n\tNO_DATA\n\tI2C_ERROR\n)\n\n// Driver is a Gobot Driver for the GoPiGo3 board.\ntype Driver struct {\n\tspi.Config\n\n\tname       string\n\tconnector  spi.Connector\n\tconnection spi.Connection\n}\n\n// NewDriver creates a new Gobot Driver for the GoPiGo3 board.\n//\n// Params:\n//\n//\ta *Adaptor - the Adaptor to use with this Driver\n//\n// Optional params:\n//\n//\t spi.WithBusNumber(int):  bus to use with this driver\n//\t\tspi.WithChipNumber(int): chip to use with this driver\n//\t spi.WithMode(int):    \t mode to use with this driver\n//\t spi.WithBitCount(int):   number of bits to use with this driver\n//\t spi.WithSpeed(int64):    speed in Hz to use with this driver\nfunc NewDriver(a spi.Connector, options ...func(spi.Config)) *Driver {\n\tspiConfig := spi.NewConfig()\n\t// use /dev/spidev0.1\n\tspiConfig.SetBusNumber(0)\n\tspiConfig.SetChipNumber(1)\n\td := &Driver{\n\t\tname:      gobot.DefaultName(\"GoPiGo3\"),\n\t\tconnector: a,\n\t\tConfig:    spiConfig,\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\treturn d\n}\n\n// Name returns the name of the device.\nfunc (d *Driver) Name() string { return d.name }\n\n// SetName sets the name of the device.\nfunc (d *Driver) SetName(n string) { d.name = n }\n\n// Connection returns the Connection of the device.\nfunc (d *Driver) Connection() gobot.Connection {\n\tif conn, ok := d.connection.(gobot.Connection); ok {\n\t\treturn conn\n\t}\n\n\tlog.Printf(\"%s has no gobot connection\\n\", d.name)\n\treturn nil\n}\n\n// Halt stops the driver.\nfunc (d *Driver) Halt() error {\n\terr := d.resetAll()\n\ttime.Sleep(10 * time.Millisecond)\n\treturn err\n}\n\n// Start initializes the GoPiGo3\nfunc (d *Driver) Start() error {\n\tbus := d.GetBusNumberOrDefault(d.connector.SpiDefaultBusNumber())\n\tchip := d.GetChipNumberOrDefault(d.connector.SpiDefaultChipNumber())\n\tmode := d.GetModeOrDefault(d.connector.SpiDefaultMode())\n\tbits := d.GetBitCountOrDefault(d.connector.SpiDefaultBitCount())\n\tmaxSpeed := d.GetSpeedOrDefault(d.connector.SpiDefaultMaxSpeed())\n\n\tvar err error\n\td.connection, err = d.connector.GetSpiConnection(bus, chip, mode, bits, maxSpeed)\n\treturn err\n}\n\n// GetManufacturerName returns the manufacturer from the firmware.\nfunc (d *Driver) GetManufacturerName() (string, error) {\n\t// read 24 bytes to get manufacturer name\n\tresponse, err := d.readBytes(goPiGo3Address, GET_MANUFACTURER, 24)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif err := d.responseValid(response); err != nil {\n\t\treturn \"\", err\n\t}\n\tmf := response[4:23]\n\tmf = bytes.Trim(mf, \"\\x00\")\n\treturn string(mf), nil\n}\n\n// GetBoardName returns the board name from the firmware.\nfunc (d *Driver) GetBoardName() (string, error) {\n\t// read 24 bytes to get board name\n\tresponse, err := d.readBytes(goPiGo3Address, GET_NAME, 24)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif err := d.responseValid(response); err != nil {\n\t\treturn \"\", err\n\t}\n\tmf := response[4:23]\n\tmf = bytes.Trim(mf, \"\\x00\")\n\treturn string(mf), nil\n}\n\n// GetHardwareVersion returns the hardware version from the firmware.\nfunc (d *Driver) GetHardwareVersion() (string, error) {\n\tresponse, err := d.readUint32(goPiGo3Address, GET_HARDWARE_VERSION)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tmajor := response / 1000000\n\tminor := response / 1000 % 1000\n\tpatch := response % 1000\n\treturn fmt.Sprintf(\"%d.%d.%d\", major, minor, patch), nil\n}\n\n// GetFirmwareVersion returns the current firmware version.\nfunc (d *Driver) GetFirmwareVersion() (string, error) {\n\tresponse, err := d.readUint32(goPiGo3Address, GET_FIRMWARE_VERSION)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tmajor := response / 1000000\n\tminor := response / 1000 % 1000\n\tpatch := response % 1000\n\treturn fmt.Sprintf(\"%d.%d.%d\", major, minor, patch), nil\n}\n\n// GetSerialNumber returns the 128-bit hardware serial number of the board.\nfunc (d *Driver) GetSerialNumber() (string, error) {\n\t// read 20 bytes to get the serial number\n\tresponse, err := d.readBytes(goPiGo3Address, GET_ID, 20)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif err := d.responseValid(response); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fmt.Sprintf(\"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\", response[4], response[5],\n\t\tresponse[6], response[7], response[8], response[9], response[10], response[11], response[12], response[13],\n\t\tresponse[14], response[15], response[16], response[17], response[18], response[19]), nil\n}\n\n// Get5vVoltage returns the current voltage on the 5v line.\nfunc (d *Driver) Get5vVoltage() (float32, error) {\n\tval, err := d.readUint16(goPiGo3Address, GET_VOLTAGE_5V)\n\treturn (float32(val) / 1000.0), err\n}\n\n// GetBatteryVoltage gets the battery voltage from the main battery pack (7v-12v).\nfunc (d *Driver) GetBatteryVoltage() (float32, error) {\n\tval, err := d.readUint16(goPiGo3Address, GET_VOLTAGE_VCC)\n\treturn (float32(val) / 1000.0), err\n}\n\n// SetLED sets rgb values from 0 to 255.\nfunc (d *Driver) SetLED(led Led, red, green, blue uint8) error {\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_LED,\n\t\tbyte(led),\n\t\tred,\n\t\tgreen,\n\t\tblue,\n\t})\n}\n\n// SetServo sets a servo's position in microseconds (0-16666).\nfunc (d *Driver) SetServo(srvo Servo, us uint16) error {\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_SERVO,\n\t\tbyte(srvo),\n\t\tbyte((us >> 8) & 0xFF),\n\t\tbyte(us & 0xFF),\n\t})\n}\n\n// ServoWrite writes an angle (0-180) to the given servo (servo 1 or servo 2).\n// Must implement the ServoWriter interface of gpio package.\nfunc (d *Driver) ServoWrite(port string, angle byte) error {\n\tsrvo := SERVO_1 // default for unknown ports\n\tif port == \"2\" || port == \"SERVO_2\" {\n\t\tsrvo = SERVO_2\n\t}\n\n\tpulseWidthRange := 1850\n\tif angle > 180 {\n\t\tangle = 180\n\t}\n\tpulseWidth := ((1500 - (pulseWidthRange / 2)) + ((pulseWidthRange / 180) * int(angle)))\n\treturn d.SetServo(srvo, uint16(pulseWidth)) //nolint:gosec // TODO: fix later\n}\n\n// SetMotorPower sets a motor's power from -128 to 127.\nfunc (d *Driver) SetMotorPower(motor Motor, power int8) error {\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_MOTOR_PWM,\n\t\tbyte(motor),\n\t\tbyte(power),\n\t})\n}\n\n// SetMotorPosition sets the motor's position in degrees.\nfunc (d *Driver) SetMotorPosition(motor Motor, position int) error {\n\tpositionRaw := position * MOTOR_TICKS_PER_DEGREE\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_MOTOR_POSITION,\n\t\tbyte(motor),\n\t\tbyte((positionRaw >> 24) & 0xFF),\n\t\tbyte((positionRaw >> 16) & 0xFF),\n\t\tbyte((positionRaw >> 8) & 0xFF),\n\t\tbyte(positionRaw & 0xFF),\n\t})\n}\n\n// SetMotorDps sets the motor target speed in degrees per second.\nfunc (d *Driver) SetMotorDps(motor Motor, dps int) error {\n\tmdps := dps * MOTOR_TICKS_PER_DEGREE\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_MOTOR_DPS,\n\t\tbyte(motor),\n\t\tbyte((mdps >> 8) & 0xFF),\n\t\tbyte(mdps & 0xFF),\n\t})\n}\n\n// SetMotorLimits sets the speed limits for a motor.\nfunc (d *Driver) SetMotorLimits(motor Motor, power int8, dps int) error {\n\tdpsUint := dps * MOTOR_TICKS_PER_DEGREE\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_MOTOR_LIMITS,\n\t\tbyte(motor),\n\t\tbyte(power),\n\t\tbyte((dpsUint >> 8) & 0xFF),\n\t\tbyte(dpsUint & 0xFF),\n\t})\n}\n\n// GetMotorStatus returns the status for the given motor.\n//\n//nolint:nonamedreturns // sufficient here\nfunc (d *Driver) GetMotorStatus(motor Motor) (flags uint8, power uint16, encoder, dps int, err error) {\n\tmessage := GET_MOTOR_STATUS_RIGHT\n\tif motor == MOTOR_LEFT {\n\t\tmessage = GET_MOTOR_STATUS_LEFT\n\t}\n\tresponse, err := d.readBytes(goPiGo3Address, message, 12)\n\tif err != nil {\n\t\treturn flags, power, encoder, dps, err\n\t}\n\tif err := d.responseValid(response); err != nil {\n\t\treturn flags, power, encoder, dps, err\n\t}\n\t// get flags\n\tflags = response[4]\n\t// get power\n\tpower = uint16(response[5])\n\tif power&0x80 == 0x80 {\n\t\tpower = power - 0x100\n\t}\n\t// get encoder\n\tenc := make([]byte, 4)\n\tenc[3] = response[6]\n\tenc[2] = response[7]\n\tenc[1] = response[8]\n\tenc[0] = response[9]\n\te := binary.LittleEndian.Uint32(enc)\n\tencoder = int(e)\n\tif e&0x80000000 == 0x80000000 {\n\t\tencoder = int(uint64(e) - 0x100000000) //nolint:gosec // TODO: fix later\n\t}\n\t// get dps\n\tdpsRaw := make([]byte, 4)\n\tdpsRaw[1] = response[10]\n\tdpsRaw[0] = response[11]\n\tds := binary.LittleEndian.Uint32(dpsRaw)\n\tdps = int(ds)\n\tif ds&0x8000 == 0x8000 {\n\t\tdps = int(ds - 0x10000)\n\t}\n\treturn flags, power, encoder / MOTOR_TICKS_PER_DEGREE, dps / MOTOR_TICKS_PER_DEGREE, nil\n}\n\n// GetMotorEncoder reads a motor's encoder in degrees.\nfunc (d *Driver) GetMotorEncoder(motor Motor) (int64, error) {\n\tmessage := GET_MOTOR_ENCODER_RIGHT\n\tif motor == MOTOR_LEFT {\n\t\tmessage = GET_MOTOR_ENCODER_LEFT\n\t}\n\tresponse, err := d.readUint32(goPiGo3Address, message)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tencoder := int64(response)\n\tif response&0x80000000 != 0 {\n\t\tencoder = encoder - 0x100000000\n\t}\n\tencoder = encoder / MOTOR_TICKS_PER_DEGREE\n\treturn encoder, nil\n}\n\n// OffsetMotorEncoder offsets a motor's encoder for calibration purposes.\nfunc (d *Driver) OffsetMotorEncoder(motor Motor, offset float64) error {\n\toffsetUint := math.Float64bits(offset * MOTOR_TICKS_PER_DEGREE)\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tOFFSET_MOTOR_ENCODER,\n\t\tbyte(motor),\n\t\tbyte((offsetUint >> 24) & 0xFF),\n\t\tbyte((offsetUint >> 16) & 0xFF),\n\t\tbyte((offsetUint >> 8) & 0xFF),\n\t\tbyte(offsetUint & 0xFF),\n\t})\n}\n\n// SetGroveType sets the given port to a grove device type.\nfunc (d *Driver) SetGroveType(port Grove, gType GroveType) error {\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_GROVE_TYPE,\n\t\tbyte(port),\n\t\tbyte(gType),\n\t})\n}\n\n// SetGroveMode sets the mode a given pin/port of the grove connector.\nfunc (d *Driver) SetGroveMode(port Grove, mode GroveMode) error {\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_GROVE_MODE,\n\t\tbyte(port),\n\t\tbyte(mode),\n\t})\n}\n\n// SetPWMDuty sets the pwm duty cycle for the given pin/port.\nfunc (d *Driver) SetPWMDuty(port Grove, duty uint16) error {\n\tif duty > 100 {\n\t\tduty = 100\n\t}\n\tduty = duty * 10\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_GROVE_PWM_DUTY,\n\t\tbyte(port),\n\t\tbyte((duty >> 8) & 0xFF),\n\t\tbyte(duty & 0xFF),\n\t})\n}\n\n// SetPWMFreq setst the pwm frequency for the given pin/port.\nfunc (d *Driver) SetPWMFreq(port Grove, freq uint16) error {\n\tif freq < 3 {\n\t\tfreq = 3\n\t}\n\tif freq > 48000 {\n\t\tfreq = 48000\n\t}\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_GROVE_PWM_FREQUENCY,\n\t\tbyte(port),\n\t\tbyte((freq >> 8) & 0xFF),\n\t\tbyte(freq & 0xFF),\n\t})\n}\n\n// PwmWrite implents the pwm interface for the gopigo3.\nfunc (d *Driver) PwmWrite(pin string, val byte) error {\n\tvar (\n\t\tgrovePin, grovePort Grove\n\t\terr                 error\n\t)\n\tif grovePin, grovePort, _, _, err = getGroveAddresses(pin); err != nil {\n\t\treturn err\n\t}\n\tif err := d.SetGroveType(grovePort, CUSTOM); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tif err = d.SetGroveMode(grovePin, GROVE_OUTPUT_PWM); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tif err = d.SetPWMFreq(grovePin, 24000); err != nil {\n\t\treturn err\n\t}\n\tval64 := math.Float64frombits(uint64(val))\n\tdutyCycle := uint16(math.Float64bits((100.0 / 255.0) * val64)) //nolint:gosec // TODO: fix later\n\treturn d.SetPWMDuty(grovePin, dutyCycle)\n}\n\n// AnalogRead returns the analog value of the given pin.\nfunc (d *Driver) AnalogRead(pin string) (int, error) {\n\tgrovePin, grovePort, analogCmd, _, err := getGroveAddresses(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.SetGroveType(grovePort, CUSTOM); err != nil {\n\t\treturn 0, err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tif err := d.SetGroveMode(grovePin, GROVE_INPUT_ANALOG); err != nil {\n\t\treturn 0, err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tresponse, err := d.readBytes(goPiGo3Address, analogCmd, 7)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.responseValid(response); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.valueValid(response); err != nil {\n\t\treturn 0, err\n\t}\n\thighBytes := uint16(response[5])\n\tlowBytes := uint16(response[6])\n\treturn int((highBytes<<8)&0xFF00) | int(lowBytes&0xFF), nil\n}\n\n// DigitalWrite writes a 0/1 value to the given pin.\nfunc (d *Driver) DigitalWrite(pin string, val byte) error {\n\tvar (\n\t\tgrovePin, grovePort Grove\n\t\terr                 error\n\t)\n\tgrovePin, grovePort, _, _, err = getGroveAddresses(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := d.SetGroveType(grovePort, CUSTOM); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tif err := d.SetGroveMode(grovePin, GROVE_OUTPUT_DIGITAL); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\treturn d.writeBytes([]byte{\n\t\tgoPiGo3Address,\n\t\tSET_GROVE_STATE,\n\t\tbyte(grovePin),\n\t\tval,\n\t})\n}\n\n// DigitalRead reads the 0/1 value from the given pin.\nfunc (d *Driver) DigitalRead(pin string) (int, error) {\n\tgrovePin, grovePort, _, stateCmd, err := getGroveAddresses(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\terr = d.SetGroveType(grovePort, CUSTOM)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\terr = d.SetGroveMode(grovePin, GROVE_INPUT_DIGITAL)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tresponse, err := d.readBytes(goPiGo3Address, stateCmd, 6)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.responseValid(response); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.valueValid(response); err != nil {\n\t\treturn 0, err\n\t}\n\treturn int(response[5]), nil\n}\n\n//nolint:nonamedreturns // sufficient here\nfunc getGroveAddresses(pin string) (gPin, gPort Grove, analog, state byte, err error) {\n\tswitch pin {\n\tcase \"AD_1_1\":\n\t\tgPin = AD_1_1_G\n\t\tgPort = AD_1_G\n\t\tanalog = GET_GROVE_ANALOG_1_1\n\t\tstate = GET_GROVE_STATE_1_1\n\tcase \"AD_1_2\":\n\t\tgPin = AD_1_2_G\n\t\tgPort = AD_1_G\n\t\tanalog = GET_GROVE_ANALOG_1_2\n\t\tstate = GET_GROVE_STATE_1_2\n\tcase \"AD_2_1\":\n\t\tgPin = AD_2_1_G\n\t\tgPort = AD_2_G\n\t\tanalog = GET_GROVE_ANALOG_2_1\n\t\tstate = GET_GROVE_STATE_2_1\n\tcase \"AD_2_2\":\n\t\tgPin = AD_2_2_G\n\t\tgPort = AD_2_G\n\t\tanalog = GET_GROVE_ANALOG_2_2\n\t\tstate = GET_GROVE_STATE_2_2\n\tdefault:\n\t\terr = fmt.Errorf(\"invalid grove pin name\")\n\t}\n\treturn gPin, gPort, analog, state, err\n}\n\nfunc (d *Driver) responseValid(response []byte) error {\n\tif response[3] != 0xA5 {\n\t\treturn fmt.Errorf(\"no SPI response, response not valid\")\n\t}\n\treturn nil\n}\n\nfunc (d *Driver) valueValid(value []byte) error {\n\tif value[4] != byte(VALID_DATA) {\n\t\treturn fmt.Errorf(\"invalid value\")\n\t}\n\treturn nil\n}\n\nfunc (d *Driver) readBytes(address byte, msg byte, numBytes int) ([]byte, error) {\n\tw := make([]byte, numBytes)\n\tw[0] = address\n\tw[1] = msg\n\tr := make([]byte, len(w))\n\tif err := d.connection.ReadCommandData(w, r); err != nil {\n\t\treturn nil, err\n\t}\n\treturn r, nil\n}\n\nfunc (d *Driver) readUint16(address, msg byte) (uint16, error) {\n\tr, err := d.readBytes(address, msg, 8)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.responseValid(r); err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint16(r[4])<<8 | uint16(r[5]), nil\n}\n\nfunc (d *Driver) readUint32(address, msg byte) (uint32, error) {\n\tr, err := d.readBytes(address, msg, 8)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.responseValid(r); err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint32(r[4])<<24 | uint32(r[5])<<16 | uint32(r[6])<<8 | uint32(r[7]), nil\n}\n\nfunc (d *Driver) writeBytes(w []byte) error {\n\treturn d.connection.WriteBytes(w)\n}\n\nfunc (d *Driver) resetAll() error {\n\terr := d.SetGroveType(AD_1_G+AD_2_G, CUSTOM)\n\ttime.Sleep(10 * time.Millisecond)\n\tif e := d.SetGroveMode(AD_1_G+AD_2_G, GROVE_INPUT_DIGITAL); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\ttime.Sleep(10 * time.Millisecond)\n\tif e := d.SetMotorPower(MOTOR_LEFT+MOTOR_RIGHT, 0.0); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\tif e := d.SetMotorLimits(MOTOR_LEFT+MOTOR_RIGHT, 0, 0); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\tif e := d.SetServo(SERVO_1+SERVO_2, 0); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\tif e := d.SetLED(LED_EYE_LEFT+LED_EYE_RIGHT+LED_BLINKER_LEFT+LED_BLINKER_RIGHT, 0, 0, 0); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n"
  },
  {
    "path": "platforms/dexter/gopigo3/driver_test.go",
    "content": "package gopigo3\n\nimport (\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n)\n\nvar (\n\t_               gobot.Driver = (*Driver)(nil)\n\tnegativeEncoder              = false\n)\n\nfunc initTestDriver() *Driver {\n\td := NewDriver(&TestConnector{})\n\t_ = d.Start()\n\treturn d\n}\n\nfunc TestDriverStart(t *testing.T) {\n\td := initTestDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestDriverHalt(t *testing.T) {\n\td := initTestDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestDriverManufacturerName(t *testing.T) {\n\twantName := \"Dexter Industries\"\n\td := initTestDriver()\n\tname, err := d.GetManufacturerName()\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantName, name)\n}\n\nfunc TestDriverBoardName(t *testing.T) {\n\twantBoardName := \"GoPiGo3\"\n\td := initTestDriver()\n\tname, err := d.GetBoardName()\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantBoardName, name)\n}\n\nfunc TestDriverHardwareVersion(t *testing.T) {\n\twantHwVer := \"3.1.3\"\n\td := initTestDriver()\n\tver, err := d.GetHardwareVersion()\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantHwVer, ver)\n}\n\nfunc TestDriverFirmareVersion(t *testing.T) {\n\twantFwVer := \"0.3.4\"\n\td := initTestDriver()\n\tver, err := d.GetFirmwareVersion()\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantFwVer, ver)\n}\n\nfunc TestGetSerialNumber(t *testing.T) {\n\twantSerialNumber := \"E0180A54514E343732202020FF112137\"\n\td := initTestDriver()\n\tserial, err := d.GetSerialNumber()\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantSerialNumber, serial)\n}\n\nfunc TestGetFiveVolts(t *testing.T) {\n\twantVoltage := float32(5.047000)\n\td := initTestDriver()\n\tvoltage, err := d.Get5vVoltage()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, wantVoltage, voltage, 0.0)\n}\n\nfunc TestGetBatVolts(t *testing.T) {\n\twantBatVoltage := float32(15.411000)\n\td := initTestDriver()\n\tvoltage, err := d.GetBatteryVoltage()\n\trequire.NoError(t, err)\n\tassert.InDelta(t, wantBatVoltage, voltage, 0.0)\n}\n\nfunc TestGetMotorStatus(t *testing.T) {\n\twantPower := uint16(65408)\n\td := initTestDriver()\n\tf1, power, f2, f3, err := d.GetMotorStatus(MOTOR_LEFT)\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantPower, power)\n\tassert.Equal(t, uint8(0), f1)\n\tassert.Equal(t, 0, f2)\n\tassert.Equal(t, 0, f3)\n}\n\nfunc TestGetEncoderStatusPos(t *testing.T) {\n\tnegativeEncoder = false\n\twantEncoderValue := int64(127)\n\td := initTestDriver()\n\tencoderValue, err := d.GetMotorEncoder(MOTOR_LEFT)\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantEncoderValue, encoderValue)\n}\n\nfunc TestGetEncoderStatusNeg(t *testing.T) {\n\tnegativeEncoder = true\n\twantEncoderValue := int64(-128)\n\td := initTestDriver()\n\tencoderValue, err := d.GetMotorEncoder(MOTOR_LEFT)\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantEncoderValue, encoderValue)\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\twantVal := 160\n\td := initTestDriver()\n\tval, err := d.AnalogRead(\"AD_1_1\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantVal, val)\n}\n\nfunc TestDigitalRead(t *testing.T) {\n\twantVal := 1\n\td := initTestDriver()\n\tval, err := d.DigitalRead(\"AD_1_2\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantVal, val)\n}\n\nfunc TestServoWrite(t *testing.T) {\n\td := initTestDriver()\n\terr := d.ServoWrite(\"SERVO_1\", 0x7F)\n\trequire.NoError(t, err)\n}\n\nfunc TestSetMotorPosition(t *testing.T) {\n\td := initTestDriver()\n\terr := d.SetMotorPosition(MOTOR_LEFT, 12.0)\n\trequire.NoError(t, err)\n}\n\nfunc TestSetMotorPower(t *testing.T) {\n\td := initTestDriver()\n\terr := d.SetMotorPower(MOTOR_LEFT, 127)\n\trequire.NoError(t, err)\n}\n\nfunc TestSetMotorDps(t *testing.T) {\n\td := initTestDriver()\n\terr := d.SetMotorDps(MOTOR_LEFT, 12.0)\n\trequire.NoError(t, err)\n}\n\nfunc TestOffsetMotorEncoder(t *testing.T) {\n\td := initTestDriver()\n\terr := d.OffsetMotorEncoder(MOTOR_LEFT, 12.0)\n\trequire.NoError(t, err)\n}\n\nfunc TestSetPWMDuty(t *testing.T) {\n\td := initTestDriver()\n\terr := d.SetPWMDuty(AD_1_1_G, 80)\n\trequire.NoError(t, err)\n}\n\nfunc TestSetPWMfreq(t *testing.T) {\n\td := initTestDriver()\n\terr := d.SetPWMFreq(AD_1_2_G, 100)\n\trequire.NoError(t, err)\n}\n\nfunc TestPwmWrite(t *testing.T) {\n\td := initTestDriver()\n\terr := d.PwmWrite(\"AD_2_2\", 80)\n\trequire.NoError(t, err)\n}\n\nfunc TestDigitalWrite(t *testing.T) {\n\td := initTestDriver()\n\terr := d.DigitalWrite(\"AD_2_1\", 1)\n\trequire.NoError(t, err)\n}\n\ntype TestConnector struct{}\n\nfunc (ctr *TestConnector) GetSpiConnection(busNum, chipNum, mode, bits int, maxSpeed int64) (spi.Connection, error) {\n\treturn TestSpiDevice{}, nil\n}\n\nfunc (ctr *TestConnector) SpiDefaultBusNumber() int {\n\treturn 0\n}\n\nfunc (ctr *TestConnector) SpiDefaultChipNumber() int {\n\treturn 0\n}\n\nfunc (ctr *TestConnector) SpiDefaultMode() int {\n\treturn 0\n}\n\nfunc (ctr *TestConnector) SpiDefaultBitCount() int {\n\treturn 8\n}\n\nfunc (ctr *TestConnector) SpiDefaultMaxSpeed() int64 {\n\treturn 0\n}\n\ntype TestSpiDevice struct{}\n\nfunc (c TestSpiDevice) Close() error {\n\treturn nil\n}\n\nfunc (c TestSpiDevice) ReadByteData(byte) (byte, error)   { return 0, nil }\nfunc (c TestSpiDevice) ReadBlockData(byte, []byte) error  { return nil }\nfunc (c TestSpiDevice) WriteByte(byte) error              { return nil }\nfunc (c TestSpiDevice) WriteByteData(byte, byte) error    { return nil }\nfunc (c TestSpiDevice) WriteBlockData(byte, []byte) error { return nil }\nfunc (c TestSpiDevice) WriteBytes([]byte) error           { return nil }\n\nfunc (c TestSpiDevice) ReadCommandData(w, r []byte) error {\n\tmanName, _ := hex.DecodeString(\"ff0000a544657874657220496e6475737472696573000000\")\n\tboardName, _ := hex.DecodeString(\"ff0000a5476f5069476f3300000000000000000000000000\")\n\thwVersion, _ := hex.DecodeString(\"ff0000a5002dcaab\")\n\tfwVersion, _ := hex.DecodeString(\"ff0000a500000bbc\")\n\tserialNum, _ := hex.DecodeString(\"ff0000a5e0180a54514e343732202020ff112137\")\n\tfiveVoltVoltage, _ := hex.DecodeString(\"ff0000a513b7\")\n\tbatteryVoltage, _ := hex.DecodeString(\"ff0000a53c33\")\n\tnegMotorEncoder, _ := hex.DecodeString(\"ff0000a5ffffff00\")\n\tmotorEncoder, _ := hex.DecodeString(\"ff0000a5000000ff\")\n\tmotorStatus, _ := hex.DecodeString(\"ff0000a50080000000000000\")\n\tanalogValue, _ := hex.DecodeString(\"ff0000a50000a0\")\n\tbuttonPush, _ := hex.DecodeString(\"ff0000a50001\")\n\tswitch w[1] {\n\tcase 1:\n\t\tcopy(r, manName)\n\t\treturn nil\n\tcase 2:\n\t\tcopy(r, boardName)\n\t\treturn nil\n\tcase 3:\n\t\tcopy(r, hwVersion)\n\t\treturn nil\n\tcase 4:\n\t\tcopy(r, fwVersion)\n\t\treturn nil\n\tcase 5:\n\t\tcopy(r, serialNum)\n\t\treturn nil\n\tcase 7:\n\t\tcopy(r, fiveVoltVoltage)\n\t\treturn nil\n\tcase 8:\n\t\tcopy(r, batteryVoltage)\n\t\treturn nil\n\tcase 17:\n\t\tif negativeEncoder {\n\t\t\tcopy(r, negMotorEncoder)\n\t\t\treturn nil\n\t\t}\n\t\tcopy(r, motorEncoder)\n\t\treturn nil\n\tcase 19:\n\t\tcopy(r, motorStatus)\n\t\treturn nil\n\tcase 29:\n\t\tcopy(r, buttonPush)\n\t\treturn nil\n\tcase 36:\n\t\tcopy(r, analogValue)\n\t\treturn nil\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/digispark/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/digispark/README.md",
    "content": "# Digispark\n\nThe Digispark is an Attiny85 based microcontroller development board similar to the Arduino line, only cheaper, smaller,\nand a bit less powerful. With a whole host of shields to extend its functionality and the ability to use the familiar\nArduino IDE the Digispark is a great way to jump into electronics, or perfect for when an Arduino is too big or too much.\n\nThis package provides the Gobot adaptor for the [Digispark](http://digistump.com/products/1) ATTiny-based USB development\nboard with the [Little Wire](http://littlewire.github.io/) protocol firmware installed.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nThis package requires `libusb`.\n\n### OSX\n\nTo install `libusb` on OSX using Homebrew:\n\n```sh\nbrew install libusb && brew install libusb-compat\n```\n\n### Ubuntu\n\nTo install libusb on linux:\n\n```sh\nsudo apt-get install libusb-dev\n```\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/digispark\"\n)\n\nfunc main() {\n  digisparkAdaptor := digispark.NewAdaptor()\n  led := gpio.NewLedDriver(digisparkAdaptor, \"0\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"blinkBot\",\n    []gobot.Connection{digisparkAdaptor},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nBuild your application with build tag \"libusb\".\n\n## How to Connect\n\nIf your Digispark already has the Little Wire protocol firmware installed, you can connect right away with Gobot.\n\nOtherwise, you must first flash your Digispark with the Little Wire firmware.\n\nThe easiest way to flash your Digispark is to use Gort [https://gort.io](https://gort.io).\n\nDownload and install Gort, and then use the following commands:\n\nThen, install the needed Digispark firmware.\n\n```sh\ngort digispark install\n```\n\n### Connect on OSX\n\n**Important**: 2012 MBP The USB ports on the 2012 MBPs (Retina and non) cause issues due to their USB3 controllers,\ncurrently the best work around is to use a cheap USB hub (non USB3).\n\nPlug the Digispark into your computer via the USB port and run:\n\n```sh\ngort digispark upload littlewire\n```\n\n### Connect on Ubuntu\n\nUbuntu requires an extra one-time step to set up the Digispark for communication with Gobot. Run the following command:\n\n```sh\ngort digispark set-udev-rules\n```\n\nYou might need to enter your administrative password. This steps adds a udev rule to allow access to the Digispark device.\n\nOnce this is done, you can upload Little Wire to your Digispark:\n\n```sh\ngort digispark upload littlewire\n```\n\n### Connect on Windows\n\nWe need instructions here, because it supposedly works.\n\n### Manual instructions\n\nFor manual instructions on how to install Little Wire on a Digispark check out <http://digistump.com/board/index.php/topic,160.0.html>\n\nThanks to [@bluebie](https://github.com/Bluebie) for these instructions! (<https://github.com/Bluebie/micronucleus-t85/wiki/Ubuntu-Linux>)\n\nNow plug the Digispark into your computer via the USB port.\n"
  },
  {
    "path": "platforms/digispark/digispark_adaptor.go",
    "content": "//go:build libusb\n// +build libusb\n\npackage digispark\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n)\n\n// ErrConnection is the error resulting of a connection error with the digispark\nvar ErrConnection = errors.New(\"connection error\")\n\n// Adaptor is the Gobot Adaptor for the Digispark\ntype Adaptor struct {\n\tname       string\n\tlittleWire lw\n\tservo      bool\n\tpwm        bool\n\ti2c        bool\n\tconnect    func(*Adaptor) error\n}\n\n// NewAdaptor returns a new Digispark Adaptor\nfunc NewAdaptor() *Adaptor {\n\treturn &Adaptor{\n\t\tname: gobot.DefaultName(\"Digispark\"),\n\t\tconnect: func(d *Adaptor) error {\n\t\t\td.littleWire = littleWireConnect()\n\t\t\t//nolint:forcetypeassert // ok here\n\t\t\tif d.littleWire.(*littleWire).lwHandle == nil {\n\t\t\t\treturn ErrConnection\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n}\n\n// Name returns the Digispark adaptors name\nfunc (d *Adaptor) Name() string { return d.name }\n\n// SetName sets the Digispark adaptors name\nfunc (d *Adaptor) SetName(n string) { d.name = n }\n\n// Connect starts a connection to the digispark\nfunc (d *Adaptor) Connect() error {\n\treturn d.connect(d)\n}\n\n// Finalize implements the Adaptor interface\nfunc (d *Adaptor) Finalize() error { return nil }\n\n// DigitalWrite writes a value to the pin. Acceptable values are 1 or 0.\nfunc (d *Adaptor) DigitalWrite(pin string, level byte) error {\n\tp, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t//nolint:gosec // TODO: fix later\n\tif err := d.littleWire.pinMode(uint8(p), 0); err != nil {\n\t\treturn err\n\t}\n\n\t//nolint:gosec // TODO: fix later\n\treturn d.littleWire.digitalWrite(uint8(p), level)\n}\n\n// PwmWrite writes the 0-254 value to the specified pin\nfunc (d *Adaptor) PwmWrite(pin string, value byte) error {\n\tif !d.pwm {\n\t\tif err := d.littleWire.pwmInit(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := d.littleWire.pwmUpdatePrescaler(1); err != nil {\n\t\t\treturn err\n\t\t}\n\t\td.pwm = true\n\t}\n\n\treturn d.littleWire.pwmUpdateCompare(value, value)\n}\n\n// ServoWrite writes the 0-180 degree val to the specified pin.\nfunc (d *Adaptor) ServoWrite(pin string, angle uint8) error {\n\tif !d.servo {\n\t\tif err := d.littleWire.servoInit(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\td.servo = true\n\t}\n\treturn d.littleWire.servoUpdateLocation(angle, angle)\n}\n\n// GetI2cConnection returns an i2c connection to a device on a specified bus.\n// Only supports bus number 0\nfunc (d *Adaptor) GetI2cConnection(address int, bus int) (i2c.Connection, error) {\n\tif bus != 0 {\n\t\treturn nil, fmt.Errorf(\"invalid bus number %d, only 0 is supported\", bus)\n\t}\n\t//nolint:gosec // TODO: fix later\n\tc := NewDigisparkI2cConnection(d, uint8(address))\n\tif err := c.Init(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn i2c.Connection(c), nil\n}\n\n// DefaultI2cBus returns the default i2c bus for this platform\nfunc (d *Adaptor) DefaultI2cBus() int {\n\treturn 0\n}\n"
  },
  {
    "path": "platforms/digispark/digispark_adaptor_test.go",
    "content": "//go:build libusb\n// +build libusb\n\n//nolint:forcetypeassert // ok here\npackage digispark\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nvar (\n\t_ gpio.DigitalWriter = (*Adaptor)(nil)\n\t_ gpio.PwmWriter     = (*Adaptor)(nil)\n\t_ gpio.ServoWriter   = (*Adaptor)(nil)\n)\n\ntype mock struct {\n\tlocationA         uint8\n\tlocationB         uint8\n\tpwmChannelA       uint8\n\tpwmChannelB       uint8\n\tpwmPrescalerValue uint\n\tpin               uint8\n\tmode              uint8\n\tstate             uint8\n}\n\n// setup mock for GPIO, PWM and servo tests\nfunc (l *mock) digitalWrite(pin uint8, state uint8) error {\n\tl.pin = pin\n\tl.state = state\n\treturn l.error()\n}\n\nfunc (l *mock) pinMode(pin uint8, mode uint8) error {\n\tl.pin = pin\n\tl.mode = mode\n\treturn l.error()\n}\n\nvar pwmInitErrorFunc = func() error { return nil }\n\nfunc (l *mock) pwmInit() error { return pwmInitErrorFunc() }\nfunc (l *mock) pwmStop() error { return l.error() }\nfunc (l *mock) pwmUpdateCompare(channelA uint8, channelB uint8) error {\n\tl.pwmChannelA = channelA\n\tl.pwmChannelB = channelB\n\treturn l.error()\n}\n\nfunc (l *mock) pwmUpdatePrescaler(value uint) error {\n\tl.pwmPrescalerValue = value\n\treturn l.error()\n}\nfunc (l *mock) servoInit() error { return l.error() }\nfunc (l *mock) servoUpdateLocation(locationA uint8, locationB uint8) error {\n\tl.locationA = locationA\n\tl.locationB = locationB\n\treturn l.error()\n}\n\nvar errorFunc = func() error { return nil }\n\nfunc (l *mock) error() error { return errorFunc() }\n\n// i2c functions unused in this test scenarios\nfunc (l *mock) i2cInit() error                                                  { return nil }\nfunc (l *mock) i2cStart(address7bit uint8, direction uint8) error               { return nil }\nfunc (l *mock) i2cWrite(sendBuffer []byte, length int, endWithStop uint8) error { return nil }\nfunc (l *mock) i2cRead(readBuffer []byte, length int, endWithStop uint8) error  { return nil }\nfunc (l *mock) i2cUpdateDelay(duration uint) error                              { return nil }\n\nfunc initTestAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\ta.connect = func(a *Adaptor) error { return nil }\n\ta.littleWire = new(mock)\n\terrorFunc = func() error { return nil }\n\tpwmInitErrorFunc = func() error { return nil }\n\treturn a\n}\n\nfunc TestDigisparkAdaptorName(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Digispark\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestDigisparkAdaptorConnect(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.Connect())\n}\n\nfunc TestDigisparkAdaptorFinalize(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestDigisparkAdaptorDigitalWrite(t *testing.T) {\n\ta := initTestAdaptor()\n\terr := a.DigitalWrite(\"0\", uint8(1))\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint8(0), a.littleWire.(*mock).pin)\n\tassert.Equal(t, uint8(1), a.littleWire.(*mock).state)\n\n\terr = a.DigitalWrite(\"?\", uint8(1))\n\trequire.Error(t, err)\n\n\terrorFunc = func() error { return errors.New(\"pin mode error\") }\n\terr = a.DigitalWrite(\"0\", uint8(1))\n\trequire.ErrorContains(t, err, \"pin mode error\")\n}\n\nfunc TestDigisparkAdaptorServoWrite(t *testing.T) {\n\ta := initTestAdaptor()\n\terr := a.ServoWrite(\"2\", uint8(80))\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint8(80), a.littleWire.(*mock).locationA)\n\tassert.Equal(t, uint8(80), a.littleWire.(*mock).locationB)\n\n\ta = initTestAdaptor()\n\terrorFunc = func() error { return errors.New(\"servo error\") }\n\terr = a.ServoWrite(\"2\", uint8(80))\n\trequire.ErrorContains(t, err, \"servo error\")\n}\n\nfunc TestDigisparkAdaptorPwmWrite(t *testing.T) {\n\ta := initTestAdaptor()\n\terr := a.PwmWrite(\"1\", uint8(100))\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint8(100), a.littleWire.(*mock).pwmChannelA)\n\tassert.Equal(t, uint8(100), a.littleWire.(*mock).pwmChannelB)\n\n\ta = initTestAdaptor()\n\tpwmInitErrorFunc = func() error { return errors.New(\"pwminit error\") }\n\terr = a.PwmWrite(\"1\", uint8(100))\n\trequire.ErrorContains(t, err, \"pwminit error\")\n\n\ta = initTestAdaptor()\n\terrorFunc = func() error { return errors.New(\"pwm error\") }\n\terr = a.PwmWrite(\"1\", uint8(100))\n\trequire.ErrorContains(t, err, \"pwm error\")\n}\n"
  },
  {
    "path": "platforms/digispark/digispark_i2c.go",
    "content": "//go:build libusb\n// +build libusb\n\npackage digispark\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n)\n\n// digisparkI2cConnection implements the interface gobot.I2cOperations\ntype digisparkI2cConnection struct {\n\taddress uint8\n\tadaptor *Adaptor\n\tmtx     sync.Mutex\n}\n\n// NewDigisparkI2cConnection creates an i2c connection to an i2c device at\n// the specified address\nfunc NewDigisparkI2cConnection(adaptor *Adaptor, address uint8) *digisparkI2cConnection {\n\treturn &digisparkI2cConnection{adaptor: adaptor, address: address}\n}\n\n// Init makes sure that the i2c device is already initialized\nfunc (c *digisparkI2cConnection) Init() error {\n\tif !c.adaptor.i2c {\n\t\tif err := c.adaptor.littleWire.i2cInit(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.adaptor.i2c = true\n\t}\n\treturn nil\n}\n\n// Test tests i2c connection with the given address\nfunc (c *digisparkI2cConnection) Test(address uint8) error {\n\tif !c.adaptor.i2c {\n\t\treturn errors.New(\"Digispark i2c not initialized\")\n\t}\n\treturn c.adaptor.littleWire.i2cStart(address, 0)\n}\n\n// UpdateDelay updates i2c signal delay amount; tune if necessary to fit your requirements\nfunc (c *digisparkI2cConnection) UpdateDelay(duration uint) error {\n\tif !c.adaptor.i2c {\n\t\treturn errors.New(\"Digispark i2c not initialized\")\n\t}\n\treturn c.adaptor.littleWire.i2cUpdateDelay(duration)\n}\n\n// Read tries to read a full buffer from the i2c device.\n// Returns an empty array if the response from the board has timed out.\nfunc (c *digisparkI2cConnection) Read(b []byte) (int, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\treturn c.readInternal(b)\n}\n\n// Write writes the buffer content in data to the i2c device.\nfunc (c *digisparkI2cConnection) Write(data []byte) (int, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\treturn c.writeInternal(data, true)\n}\n\n// Close do nothing than return nil.\nfunc (c *digisparkI2cConnection) Close() error {\n\treturn nil\n}\n\n// ReadByte reads one byte from the i2c device.\nfunc (c *digisparkI2cConnection) ReadByte() (byte, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tbuf := []byte{0}\n\tif err := c.readAndCheckCount(buf); err != nil {\n\t\treturn 0, err\n\t}\n\tval := buf[0]\n\treturn val, nil\n}\n\n// ReadByteData reads one byte of the given register address from the i2c device.\nfunc (c *digisparkI2cConnection) ReadByteData(reg uint8) (uint8, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif err := c.writeAndCheckCount([]byte{reg}, false); err != nil {\n\t\treturn 0, err\n\t}\n\n\tbuf := []byte{0}\n\tif err := c.readAndCheckCount(buf); err != nil {\n\t\treturn 0, err\n\t}\n\tval := buf[0]\n\treturn val, nil\n}\n\n// ReadWordData reads two bytes of the given register address from the i2c device.\nfunc (c *digisparkI2cConnection) ReadWordData(reg uint8) (uint16, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif err := c.writeAndCheckCount([]byte{reg}, false); err != nil {\n\t\treturn 0, err\n\t}\n\n\tbuf := []byte{0, 0}\n\tif err := c.readAndCheckCount(buf); err != nil {\n\t\treturn 0, err\n\t}\n\tlow, high := buf[0], buf[1]\n\n\tval := (uint16(high) << 8) | uint16(low)\n\treturn val, nil\n}\n\n// ReadBlockData reads a block of maximum 32 bytes from the given register address of the i2c device.\nfunc (c *digisparkI2cConnection) ReadBlockData(reg uint8, data []byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif err := c.writeAndCheckCount([]byte{reg}, false); err != nil {\n\t\treturn err\n\t}\n\n\tif len(data) > 32 {\n\t\tdata = data[:32]\n\t}\n\treturn c.readAndCheckCount(data)\n}\n\n// WriteByte writes one byte to the i2c device.\nfunc (c *digisparkI2cConnection) WriteByte(val byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tbuf := []byte{val}\n\treturn c.writeAndCheckCount(buf, true)\n}\n\n// WriteByteData writes one byte to the given register address of the i2c device.\nfunc (c *digisparkI2cConnection) WriteByteData(reg uint8, val byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tbuf := []byte{reg, val}\n\treturn c.writeAndCheckCount(buf, true)\n}\n\n// WriteWordData writes two bytes to the given register address of the i2c device.\nfunc (c *digisparkI2cConnection) WriteWordData(reg uint8, val uint16) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tlow := uint8(val & 0xff)         //nolint:gosec // ok here\n\thigh := uint8((val >> 8) & 0xff) //nolint:gosec // ok here\n\tbuf := []byte{reg, low, high}\n\treturn c.writeAndCheckCount(buf, true)\n}\n\n// WriteBlockData writes a block of maximum 32 bytes to the given register address of the i2c device.\nfunc (c *digisparkI2cConnection) WriteBlockData(reg uint8, data []byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif len(data) > 32 {\n\t\tdata = data[:32]\n\t}\n\n\tbuf := make([]byte, len(data)+1)\n\tcopy(buf[1:], data)\n\tbuf[0] = reg\n\treturn c.writeAndCheckCount(buf, true)\n}\n\n// WriteBytes writes a block of maximum 32 bytes to the current register address of the i2c device.\nfunc (c *digisparkI2cConnection) WriteBytes(buf []byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif len(buf) > 32 {\n\t\tbuf = buf[:32]\n\t}\n\n\treturn c.writeAndCheckCount(buf, true)\n}\n\nfunc (c *digisparkI2cConnection) readAndCheckCount(buf []byte) error {\n\tcountRead, err := c.readInternal(buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\texpectedCount := len(buf)\n\tif countRead != expectedCount {\n\t\treturn fmt.Errorf(\"digispark i2c read %d bytes, expected %d bytes\", countRead, expectedCount)\n\t}\n\treturn nil\n}\n\nfunc (c *digisparkI2cConnection) writeAndCheckCount(buf []byte, finalStop bool) error {\n\tcountWritten, err := c.writeInternal(buf, finalStop)\n\tif err != nil {\n\t\treturn err\n\t}\n\texpectedCount := len(buf)\n\tif countWritten != expectedCount {\n\t\treturn fmt.Errorf(\"digispark i2c write %d bytes, expected %d bytes\", countWritten, expectedCount)\n\t}\n\treturn nil\n}\n\nfunc (c *digisparkI2cConnection) readInternal(b []byte) (int, error) {\n\tif !c.adaptor.i2c {\n\t\terr := errors.New(\"digispark i2c not initialized\")\n\t\treturn 0, err\n\t}\n\tif err := c.adaptor.littleWire.i2cStart(c.address, 1); err != nil {\n\t\treturn 0, err\n\t}\n\tl := 8\n\tstop := uint8(0)\n\n\tvar countRead int\n\tfor stop == 0 {\n\t\tif countRead+l >= len(b) {\n\t\t\tl = len(b) - countRead\n\t\t\tstop = 1\n\t\t}\n\t\tif err := c.adaptor.littleWire.i2cRead(b[countRead:countRead+l], l, stop); err != nil {\n\t\t\treturn countRead, err\n\t\t}\n\t\tcountRead += l\n\t}\n\treturn countRead, nil\n}\n\nfunc (c *digisparkI2cConnection) writeInternal(data []byte, finalStop bool) (int, error) {\n\tif !c.adaptor.i2c {\n\t\treturn 0, errors.New(\"digispark i2c not initialized\")\n\t}\n\tif err := c.adaptor.littleWire.i2cStart(c.address, 0); err != nil {\n\t\treturn 0, err\n\t}\n\tl := 4\n\tlastQuadruplet := false\n\tstop := uint8(0)\n\n\tvar countWritten int\n\tfor !lastQuadruplet {\n\t\tif countWritten+l >= len(data) {\n\t\t\tlastQuadruplet = true\n\t\t\tl = len(data) - countWritten\n\t\t\tif finalStop {\n\t\t\t\tstop = 1\n\t\t\t}\n\t\t}\n\t\tif err := c.adaptor.littleWire.i2cWrite(data[countWritten:countWritten+l], l, stop); err != nil {\n\t\t\treturn countWritten, err\n\t\t}\n\t\tcountWritten += l\n\t}\n\treturn countWritten, nil\n}\n"
  },
  {
    "path": "platforms/digispark/digispark_i2c_test.go",
    "content": "//go:build libusb\n// +build libusb\n\n//nolint:forcetypeassert // ok here\npackage digispark\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n)\n\nconst (\n\tavailableI2cAddress = 0x40\n\tmaxUint8            = ^uint8(0)\n)\n\nvar (\n\t_       i2c.Connector = (*Adaptor)(nil)\n\ti2cData               = []byte{5, 4, 3, 2, 1, 0}\n)\n\ntype i2cMock struct {\n\tduration          uint\n\tdirection         uint8\n\tdataWritten       []byte\n\twriteStartWasSend bool\n\twriteStopWasSend  bool\n\treadStartWasSend  bool\n\treadStopWasSend   bool\n}\n\nfunc initTestAdaptorI2c() *Adaptor {\n\ta := NewAdaptor()\n\ta.connect = func(a *Adaptor) error { return nil }\n\ta.littleWire = new(i2cMock)\n\treturn a\n}\n\nfunc TestDigisparkAdaptorI2cGetI2cConnection(t *testing.T) {\n\t// arrange\n\tvar c i2c.Connection\n\tvar err error\n\ta := initTestAdaptorI2c()\n\n\t// act\n\tc, err = a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.NotNil(t, c)\n}\n\nfunc TestDigisparkAdaptorI2cGetI2cConnectionFailWithInvalidBus(t *testing.T) {\n\t// arrange\n\ta := initTestAdaptorI2c()\n\n\t// act\n\tc, err := a.GetI2cConnection(0x40, 1)\n\n\t// assert\n\trequire.ErrorContains(t, err, \"invalid bus number 1, only 0 is supported\")\n\tassert.Nil(t, c)\n}\n\nfunc TestDigisparkAdaptorI2cStartFailWithWrongAddress(t *testing.T) {\n\t// arrange\n\tdata := []byte{0, 1, 2, 3, 4}\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(0x39, a.DefaultI2cBus())\n\n\t// act\n\tcount, err := c.Write(data)\n\n\t// assert\n\tassert.Equal(t, 0, count)\n\trequire.ErrorContains(t, err, fmt.Sprintf(\"invalid address, only %d is supported\", availableI2cAddress))\n\tassert.Equal(t, maxUint8, a.littleWire.(*i2cMock).direction)\n}\n\nfunc TestDigisparkAdaptorI2cWrite(t *testing.T) {\n\t// arrange\n\tdata := []byte{0, 1, 2, 3, 4}\n\tdataLen := len(data)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\tcount, err := c.Write(data)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(0), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, dataLen, count)\n\tassert.Equal(t, data, a.littleWire.(*i2cMock).dataWritten)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cWriteByte(t *testing.T) {\n\t// arrange\n\tdata := byte(0x02)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\terr := c.WriteByte(data)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(0), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, []byte{data}, a.littleWire.(*i2cMock).dataWritten)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cWriteByteData(t *testing.T) {\n\t// arrange\n\treg := uint8(0x03)\n\tdata := byte(0x09)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\terr := c.WriteByteData(reg, data)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(0), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, []byte{reg, data}, a.littleWire.(*i2cMock).dataWritten)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cWriteWordData(t *testing.T) {\n\t// arrange\n\treg := uint8(0x04)\n\tdata := uint16(0x0508)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\terr := c.WriteWordData(reg, data)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(0), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, []byte{reg, 0x08, 0x05}, a.littleWire.(*i2cMock).dataWritten)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cWriteBlockData(t *testing.T) {\n\t// arrange\n\treg := uint8(0x05)\n\tdata := []byte{0x80, 0x81, 0x82}\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\terr := c.WriteBlockData(reg, data)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(0), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, append([]byte{reg}, data...), a.littleWire.(*i2cMock).dataWritten)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.False(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cRead(t *testing.T) {\n\t// arrange\n\tdata := []byte{0, 1, 2, 3, 4}\n\tdataLen := len(data)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\tcount, err := c.Read(data)\n\n\t// assert\n\tassert.Equal(t, dataLen, count)\n\trequire.NoError(t, err)\n\tassert.False(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(1), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, i2cData[:dataLen], data)\n\tassert.False(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cReadByte(t *testing.T) {\n\t// arrange\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\tdata, err := c.ReadByte()\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.False(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(1), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, i2cData[0], data)\n\tassert.False(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cReadByteData(t *testing.T) {\n\t// arrange\n\treg := uint8(0x04)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\tdata, err := c.ReadByteData(reg)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(1), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, []byte{reg}, a.littleWire.(*i2cMock).dataWritten)\n\tassert.Equal(t, i2cData[0], data)\n\tassert.False(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cReadWordData(t *testing.T) {\n\t// arrange\n\treg := uint8(0x05)\n\t// 2 bytes of i2cData are used swapped\n\texpectedValue := uint16(0x0405)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\tdata, err := c.ReadWordData(reg)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(1), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, []byte{reg}, a.littleWire.(*i2cMock).dataWritten)\n\tassert.Equal(t, expectedValue, data)\n\tassert.False(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cReadBlockData(t *testing.T) {\n\t// arrange\n\treg := uint8(0x05)\n\tdata := []byte{0, 0, 0, 0, 0}\n\tdataLen := len(data)\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\terr := c.ReadBlockData(reg, data)\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.True(t, a.littleWire.(*i2cMock).writeStartWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStartWasSend)\n\tassert.Equal(t, uint8(1), a.littleWire.(*i2cMock).direction)\n\tassert.Equal(t, []byte{reg}, a.littleWire.(*i2cMock).dataWritten)\n\tassert.Equal(t, i2cData[:dataLen], data)\n\tassert.False(t, a.littleWire.(*i2cMock).writeStopWasSend)\n\tassert.True(t, a.littleWire.(*i2cMock).readStopWasSend)\n}\n\nfunc TestDigisparkAdaptorI2cUpdateDelay(t *testing.T) {\n\t// arrange\n\ta := initTestAdaptorI2c()\n\tc, _ := a.GetI2cConnection(availableI2cAddress, a.DefaultI2cBus())\n\n\t// act\n\terr := c.(*digisparkI2cConnection).UpdateDelay(uint(100))\n\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint(100), a.littleWire.(*i2cMock).duration)\n}\n\n// setup mock for i2c tests\nfunc (l *i2cMock) i2cInit() error {\n\tl.direction = maxUint8\n\treturn l.error()\n}\n\nfunc (l *i2cMock) i2cStart(address7bit uint8, direction uint8) error {\n\tif address7bit != availableI2cAddress {\n\t\treturn fmt.Errorf(\"invalid address, only %d is supported\", availableI2cAddress)\n\t}\n\tif err := l.error(); err != nil {\n\t\treturn err\n\t}\n\tl.direction = direction\n\tif direction == 1 {\n\t\tl.readStartWasSend = true\n\t} else {\n\t\tl.writeStartWasSend = true\n\t}\n\treturn nil\n}\n\nfunc (l *i2cMock) i2cWrite(sendBuffer []byte, length int, endWithStop uint8) error {\n\tl.dataWritten = append(l.dataWritten, sendBuffer...)\n\tif endWithStop > 0 {\n\t\tl.writeStopWasSend = true\n\t}\n\treturn l.error()\n}\n\nfunc (l *i2cMock) i2cRead(readBuffer []byte, length int, endWithStop uint8) error {\n\tif len(readBuffer) < length {\n\t\tlength = len(readBuffer)\n\t}\n\tif len(i2cData) < length {\n\t\tlength = len(i2cData)\n\t}\n\tcopy(readBuffer[:length], i2cData[:length])\n\n\tif endWithStop > 0 {\n\t\tl.readStopWasSend = true\n\t}\n\treturn l.error()\n}\n\nfunc (l *i2cMock) i2cUpdateDelay(duration uint) error {\n\tl.duration = duration\n\treturn l.error()\n}\n\n// GPIO, PWM and servo functions unused in this test scenarios\nfunc (l *i2cMock) digitalWrite(pin uint8, state uint8) error                  { return nil }\nfunc (l *i2cMock) pinMode(pin uint8, mode uint8) error                        { return nil }\nfunc (l *i2cMock) pwmInit() error                                             { return nil }\nfunc (l *i2cMock) pwmStop() error                                             { return nil }\nfunc (l *i2cMock) pwmUpdateCompare(channelA uint8, channelB uint8) error      { return nil }\nfunc (l *i2cMock) pwmUpdatePrescaler(value uint) error                        { return nil }\nfunc (l *i2cMock) servoInit() error                                           { return nil }\nfunc (l *i2cMock) servoUpdateLocation(locationA uint8, locationB uint8) error { return nil }\nfunc (l *i2cMock) error() error                                               { return nil }\n"
  },
  {
    "path": "platforms/digispark/doc.go",
    "content": "//go:build libusb\n// +build libusb\n\n/*\nPackage digispark provides the Gobot adaptor for the Digispark ATTiny-based USB development board.\n\nInstalling:\n\nThis package requires installing `libusb`.\nThen you can install the package with:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"time\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\t\"gobot.io/x/gobot/v2/platforms/digispark\"\n\t)\n\n\tfunc main() {\n\t\tdigisparkAdaptor := digispark.NewAdaptor()\n\t\tled := gpio.NewLedDriver(digisparkAdaptor, \"0\")\n\n\t\twork := func() {\n\t\t\tgobot.Every(1*time.Second, func() {\n\t\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"blinkBot\",\n\t\t\t[]gobot.Connection{digisparkAdaptor},\n\t\t\t[]gobot.Device{led},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor further information refer to digispark README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/digispark/README.md\n*/\npackage digispark // import \"gobot.io/x/gobot/v2/platforms/digispark\"\n"
  },
  {
    "path": "platforms/digispark/littleWire.c",
    "content": "/*\n  Cross platform computer interface library for Little Wire project\n\n  http://littlewire.github.io\n\n  Copyright (C) <2013> ihsan Kehribar <ihsan@kehribar.me>\n  Copyright (C) <2013> Omer Kilic <omerkilic@gmail.com>\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy of\n  this software and associated documentation files (the \"Software\"), to deal in\n  the Software without restriction, including without limitation the rights to\n  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n  of the Software, and to permit persons to whom the Software is furnished to do\n  so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n/******************************************************************************\n* See the littleWire.h for the function descriptions/comments\n/*****************************************************************************/\n#include \"littleWire.h\"\n\nunsigned char\tcrc8;\nint\t\tLastDiscrepancy;\nint \tLastFamilyDiscrepancy;\nint \tLastDeviceFlag;\n\n\nunsigned char rxBuffer[RX_BUFFER_SIZE]; /* This has to be unsigned for the data's sake */\nunsigned char ROM_NO[8];\nint lwStatus;\nlwCollection lwResults[16];\nint lw_totalDevices;\n\n\n/******************************************************************************\n/ Taken from: http://www.maxim-ic.com/appnotes.cfm/appnote_number/187\n/*****************************************************************************/\nstatic unsigned char dscrc_table[] = {\n        0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,\n      157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,\n       35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,\n      190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,\n       70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,\n      219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,\n      101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,\n      248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,\n      140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,\n       17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,\n      175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,\n       50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,\n      202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,\n       87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,\n      233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,\n      116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};\n/*****************************************************************************/\n\nint littlewire_search()\n{\n  struct usb_bus *bus;\n  struct usb_device *dev;\n\n  usb_init();\n  usb_find_busses();\n  usb_find_devices();\n\n  lw_totalDevices = 0;\n\n  for (bus = usb_busses; bus; bus = bus->next)\n  {\n    for (dev = bus->devices; dev; dev = dev->next)\n    {\n      usb_dev_handle *udev;\n      char description[256];\n      char string[256];\n      int ret, i;\n\n      if((dev->descriptor.idVendor == VENDOR_ID) && (dev->descriptor.idProduct == PRODUCT_ID))\n      {\n        udev = usb_open(dev);\n        if (udev)\n        {\n          if (dev->descriptor.iSerialNumber)\n          {\n            ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));\n            if (ret > 0)\n            {\n              lwResults[lw_totalDevices].serialNumber = atoi(string);\n              lwResults[lw_totalDevices].lw_device = dev;\n            }\n          }\n          usb_close(udev);\n          lw_totalDevices++;\n        }\n      }\n    }\n  }\n\n  return lw_totalDevices;\n}\n\nlittleWire* littlewire_connect_byID(int desiredID)\n{\n  littleWire  *tempHandle = NULL;\n\n  if(desiredID > (lw_totalDevices-1))\n  {\n    return tempHandle;\n  }\n\n  tempHandle = usb_open(lwResults[desiredID].lw_device);\n\n  return tempHandle;\n}\n\nlittleWire* littlewire_connect_bySerialNum(int mySerial)\n{\n  littleWire  *tempHandle = NULL;\n  int temp_id = 0xDEAF;\n  int i;\n\n  for(i=0;i<lw_totalDevices;i++)\n  {\n    if(lwResults[i].serialNumber == mySerial)\n    {\n      temp_id = i;\n    }\n  }\n\n  tempHandle = littlewire_connect_byID(temp_id);\n  return tempHandle;\n}\n\nlittleWire* littleWire_connect()\n{\n\tlittleWire  *tempHandle = NULL;\n\n\tusb_init();\n\tusbOpenDevice(&tempHandle, VENDOR_ID, \"*\", PRODUCT_ID, \"*\", \"*\", NULL, NULL );\n\n\treturn tempHandle;\n}\n\nunsigned char readFirmwareVersion(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 34, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\n\treturn rxBuffer[0];\n}\n\nvoid changeSerialNumber(littleWire* lwHandle,int serialNumber)\n{\n\tchar serBuf[4];\n\n\tif(serialNumber > 999)\n\t{\n\t\tserialNumber = 999;\n\t}\n\telse if(serialNumber < 100)\n\t{\n\t\tserialNumber = 100;\n\t}\n\n\tsprintf(serBuf,\"%d\",serialNumber);\n\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 55, (serBuf[1]<<8)|serBuf[0],serBuf[2], rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid digitalWrite(littleWire* lwHandle, unsigned char pin, unsigned char state)\n{\n\tif(state){\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 18, pin, 0, rxBuffer, 8, USB_TIMEOUT);\n\t} else{\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 19, pin, 0, rxBuffer, 8, USB_TIMEOUT);\n\t}\n}\n\nvoid pinMode(littleWire* lwHandle, unsigned char pin, unsigned char mode)\n{\n\tif(mode){\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 13, pin, 0, rxBuffer, 8, USB_TIMEOUT);\n\t} else {\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 14, pin, 0, rxBuffer, 8, USB_TIMEOUT);\n\t}\n}\n\nunsigned char digitalRead(littleWire* lwHandle, unsigned char pin)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 20, pin, 0, rxBuffer, 8, USB_TIMEOUT);\n\n\treturn rxBuffer[0];\n}\n\nvoid internalPullup(littleWire* lwHandle, unsigned char pin, unsigned char state)\n{\n\tif(state){\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 18, pin, 0, rxBuffer, 8, USB_TIMEOUT);\n\t} else{\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 19, pin, 0, rxBuffer, 8, USB_TIMEOUT);\n\t}\n}\n\nvoid analog_init(littleWire* lwHandle, unsigned char voltageRef)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 35, (voltageRef<<8) | 0x07, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nunsigned int analogRead(littleWire* lwHandle, unsigned char channel)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 15, channel, 0, rxBuffer, 8, USB_TIMEOUT);\n\n\treturn ((rxBuffer[1] *256) + (rxBuffer[0]));\n}\n\nvoid pwm_init(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 16, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid pwm_stop(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 32, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid pwm_updateCompare(littleWire* lwHandle, unsigned char channelA, unsigned char channelB)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 17, channelA, channelB, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid pwm_updatePrescaler(littleWire* lwHandle, unsigned int value)\n{\n\tswitch(value)\n\t{\n\t\tcase 1024:\n\t\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 22, 4, 0, rxBuffer, 8, USB_TIMEOUT);\n\t\tbreak;\n\t\tcase 256:\n\t\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 22, 3, 0, rxBuffer, 8, USB_TIMEOUT);\n\t\tbreak;\n\t\tcase 64:\n\t\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 22, 2, 0, rxBuffer, 8, USB_TIMEOUT);\n\t\tbreak;\n\t\tcase 8:\n\t\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 22, 1, 0, rxBuffer, 8, USB_TIMEOUT);\n\t\tbreak;\n\t\tcase 1:\n\t\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 22, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\t\tbreak;\n\t}\n}\n\nvoid spi_init(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 23, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid spi_sendMessage(littleWire* lwHandle, unsigned char * sendBuffer, unsigned char * inputBuffer, unsigned char length ,unsigned char mode)\n{\n\tint i=0;\n\tif(length>4)\n\t\tlength=4;\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, (0xF0 + length + (mode<<3) ), (sendBuffer[1]<<8) + sendBuffer[0] , (sendBuffer[3]<<8) + sendBuffer[2], rxBuffer, 8, USB_TIMEOUT);\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 40, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\tfor(i=0;i<length;i++)\n\t\tinputBuffer[i]=rxBuffer[i];\n}\n\nunsigned char debugSpi(littleWire* lwHandle, unsigned char message)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 33, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 40, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\treturn rxBuffer[0];\n}\n\nvoid spi_updateDelay(littleWire* lwHandle, unsigned int duration)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 31, duration, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid i2c_init(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 44, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nunsigned char i2c_start(littleWire* lwHandle, unsigned char address7bit, unsigned char direction)\n{\n\tunsigned char temp;\n\n\ttemp = (address7bit << 1) | direction;\n\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 45, temp, 0, rxBuffer, 8, USB_TIMEOUT);\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 40, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\treturn !rxBuffer[0];\n}\n\nvoid i2c_write(littleWire* lwHandle, unsigned char* sendBuffer, unsigned char length, unsigned char endWithStop)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, (0xE0 + length + (endWithStop<<3) ), (sendBuffer[1]<<8) + sendBuffer[0] , (sendBuffer[3]<<8) + sendBuffer[2], rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid i2c_read(littleWire* lwHandle, unsigned char* readBuffer, unsigned char length, unsigned char endWithStop)\n{\n\tint i=0;\n\n\tif(endWithStop)\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 46, (length<<8) + 1, 1, rxBuffer, 8, USB_TIMEOUT);\n\telse\n\t\tlwStatus=usb_control_msg(lwHandle, 0xC0, 46, (length<<8) + 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\n\tdelay(3);\n\n  lwStatus=usb_control_msg(lwHandle, 0xC0, 40, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\n\tfor(i=0;i<length;i++)\n\t\treadBuffer[i]=rxBuffer[i];\n}\n\nvoid i2c_updateDelay(littleWire* lwHandle, unsigned int duration)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 49, duration, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid onewire_sendBit(littleWire* lwHandle, unsigned char bitValue)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 51, bitValue, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid onewire_writeByte(littleWire* lwHandle, unsigned char messageToSend)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 42, messageToSend, 0, rxBuffer, 8, USB_TIMEOUT);\n\tdelay(3);\n}\n\nunsigned char onewire_readByte(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 43, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\tdelay(3);\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 40, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\treturn rxBuffer[0];\n}\n\nunsigned char onewire_readBit(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 50, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 40, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\treturn rxBuffer[0];\n}\n\nunsigned char onewire_resetPulse(littleWire* lwHandle)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 41, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\tdelay(3);\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 40, 0, 0, rxBuffer, 8, USB_TIMEOUT);\n\treturn rxBuffer[0];\n}\n\nvoid softPWM_state(littleWire* lwHandle,unsigned char state)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 47, state, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid softPWM_write(littleWire* lwHandle,unsigned char ch1,unsigned char ch2,unsigned char ch3)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 48, (ch2<<8) | ch1, ch3, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid ws2812_write(littleWire* lwHandle, unsigned char pin, unsigned char r,unsigned char g,unsigned char b)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 54, (g<<8) | pin | 0x30, (b<<8) | r, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid ws2812_flush(littleWire* lwHandle, unsigned char pin)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 54, pin | 0x10, 0, rxBuffer, 8, USB_TIMEOUT);\n}\n\nvoid ws2812_preload(littleWire* lwHandle, unsigned char r,unsigned char g,unsigned char b)\n{\n\tlwStatus=usb_control_msg(lwHandle, 0xC0, 54, (g<<8) | 0x20, (b<<8) | r, rxBuffer, 8, USB_TIMEOUT);\n}\n\nint customMessage(littleWire* lwHandle,unsigned char* receiveBuffer,unsigned char command,unsigned char d1,unsigned char d2, unsigned char d3, unsigned char d4)\n{\n\tint i;\n\tint rc;\n\trc = lwStatus=usb_control_msg(lwHandle, 0xC0, command, (d2<<8)|d1, (d4<<8)|d3, rxBuffer, 8, USB_TIMEOUT);\n\tfor(i=0;i<8;i++)\n\t\treceiveBuffer[i]=rxBuffer[i];\n\treturn rc;\n}\n\n/******************************************************************************\n* Do the crc8 calculation\n* Taken from: http://www.maxim-ic.com/appnotes.cfm/appnote_number/187\n/*****************************************************************************/\nunsigned char docrc8(unsigned char value)\n{\n   // See Maxim Application Note 27\n\n   crc8 = dscrc_table[crc8 ^ value];\n\n   return crc8;\n}\n\nint onewire_nextAddress(littleWire* lwHandle)\n{\n   int id_bit_number;\n   int last_zero, rom_byte_number, search_result;\n   int id_bit, cmp_id_bit;\n   unsigned char rom_byte_mask, search_direction;\n\n   // initialize for search\n   id_bit_number = 1;\n   last_zero = 0;\n   rom_byte_number = 0;\n   rom_byte_mask = 1;\n   search_result = 0;\n   crc8 = 0;\n\n   // if the last call was not the last one\n   if (!LastDeviceFlag)\n   {\n      // 1-Wire reset\n      if (!onewire_resetPulse(lwHandle))\n      {\n         // reset the search\n         LastDiscrepancy = 0;\n         LastDeviceFlag = 0;\n         LastFamilyDiscrepancy = 0;\n         return 0;\n      }\n\n      // issue the search command\n      onewire_writeByte(lwHandle,0xF0);\n\n      // loop to do the search\n      do\n      {\n         // read a bit and its complement\n         id_bit = onewire_readBit(lwHandle);\n         cmp_id_bit = onewire_readBit(lwHandle);\n\n         // check for no devices on 1-wire\n         if ((id_bit == 1) && (cmp_id_bit == 1))\n            break;\n         else\n         {\n            // all devices coupled have 0 or 1\n            if (id_bit != cmp_id_bit)\n               search_direction = id_bit;  // bit write value for search\n            else\n            {\n               // if this discrepancy if before the Last Discrepancy\n               // on a previous next then pick the same as last time\n               if (id_bit_number < LastDiscrepancy)\n                  search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);\n               else\n                  // if equal to last pick 1, if not then pick 0\n                  search_direction = (id_bit_number == LastDiscrepancy);\n\n               // if 0 was picked then record its position in LastZero\n               if (search_direction == 0)\n               {\n                  last_zero = id_bit_number;\n\n                  // check for Last discrepancy in family\n                  if (last_zero < 9)\n                     LastFamilyDiscrepancy = last_zero;\n               }\n            }\n\n            // set or clear the bit in the ROM byte rom_byte_number\n            // with mask rom_byte_mask\n            if (search_direction == 1)\n              ROM_NO[rom_byte_number] |= rom_byte_mask;\n            else\n              ROM_NO[rom_byte_number] &= ~rom_byte_mask;\n\n            // serial number search direction write bit\n            onewire_sendBit(lwHandle,search_direction);\n\n            // increment the byte counter id_bit_number\n            // and shift the mask rom_byte_mask\n            id_bit_number++;\n            rom_byte_mask <<= 1;\n\n            // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask\n            if (rom_byte_mask == 0)\n            {\n                docrc8(ROM_NO[rom_byte_number]);  // accumulate the CRC\n                rom_byte_number++;\n                rom_byte_mask = 1;\n            }\n         }\n      }\n      while(rom_byte_number < 8);  // loop until through all ROM bytes 0-7\n\n      // if the search was successful then\n      if (!((id_bit_number < 65) || (crc8 != 0)))\n      {\n         // search successful so set LastDiscrepancy,LastDeviceFlag,search_result\n         LastDiscrepancy = last_zero;\n\n         // check for last device\n         if (LastDiscrepancy == 0)\n            LastDeviceFlag = 1;\n\n         search_result = 1;\n      }\n   }\n\n   // if no device found then reset counters so next 'search' will be like a first\n   if (!search_result || !ROM_NO[0])\n   {\n      LastDiscrepancy = 0;\n      LastDeviceFlag = 0;\n      LastFamilyDiscrepancy = 0;\n      search_result = 0;\n   }\n\n   return search_result;\n}\n\nint onewire_firstAddress(littleWire* lwHandle)\n{\n\tlittleWire* temp = lwHandle;\n\n   // reset the search state\n   LastDiscrepancy = 0;\n   LastDeviceFlag = 0;\n   LastFamilyDiscrepancy = 0;\n\n   return onewire_nextAddress(temp);\n}\n\nint littleWire_error () {\n        if (lwStatus<0) return lwStatus;\n        else return 0;\n}\n\nchar *littleWire_errorName () {\n        if (lwStatus<0) switch (lwStatus) {\n                case -1: return \"I/O Error\"; break;\n                case -2: return \"Invalid parameter\"; break;\n                case -3: return \"Access error\"; break;\n                case -4: return \"No device\"; break;\n                case -5: return \"Not found\"; break;\n                case -6: return \"Busy\"; break;\n                case -7: return \"Timeout\"; break;\n                case -8: return \"Overflow\"; break;\n                case -9: return \"Pipe\"; break;\n                case -10: return \"Interrupted\"; break;\n                case -11: return \"No memory\"; break;\n                case -12: return \"Not supported\"; break;\n                case -99: return \"Other\"; break;\n                default: return \"unknown\";\n        }\n        else return 0;\n}\n"
  },
  {
    "path": "platforms/digispark/littleWire.go",
    "content": "//go:build libusb\n// +build libusb\n\npackage digispark\n\n//#cgo pkg-config: libusb\n//#include \"littleWire.h\"\n//#include \"littleWire_servo.h\"\n// typedef usb_dev_handle littleWire;\nimport \"C\"\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\ntype lw interface {\n\tdigitalWrite(pin uint8, state uint8) error\n\tpinMode(pin uint8, mode uint8) error\n\tpwmInit() error\n\tpwmStop() error\n\tpwmUpdateCompare(channelA uint8, channelb uint8) error\n\tpwmUpdatePrescaler(value uint) error\n\tservoInit() error\n\tservoUpdateLocation(locationA uint8, locationB uint8) error\n\ti2cInit() error\n\ti2cStart(address7bit uint8, direction uint8) error\n\ti2cWrite(sendBuffer []byte, length int, endWithStop uint8) error\n\ti2cRead(readBuffer []byte, length int, endWithStop uint8) error\n\ti2cUpdateDelay(duration uint) error\n\terror() error\n}\n\ntype littleWire struct {\n\tlwHandle *C.littleWire\n}\n\nfunc littleWireConnect() *littleWire {\n\treturn &littleWire{\n\t\tlwHandle: C.littleWire_connect(),\n\t}\n}\n\nfunc (l *littleWire) digitalWrite(pin uint8, state uint8) error {\n\tC.digitalWrite(l.lwHandle, C.uchar(pin), C.uchar(state))\n\treturn l.error()\n}\n\nfunc (l *littleWire) pinMode(pin uint8, mode uint8) error {\n\tC.pinMode(l.lwHandle, C.uchar(pin), C.uchar(mode))\n\treturn l.error()\n}\n\nfunc (l *littleWire) pwmInit() error {\n\tC.pwm_init(l.lwHandle)\n\treturn l.error()\n}\n\nfunc (l *littleWire) pwmStop() error {\n\tC.pwm_stop(l.lwHandle)\n\treturn l.error()\n}\n\nfunc (l *littleWire) pwmUpdateCompare(channelA uint8, channelB uint8) error {\n\tC.pwm_updateCompare(l.lwHandle, C.uchar(channelA), C.uchar(channelB))\n\treturn l.error()\n}\n\nfunc (l *littleWire) pwmUpdatePrescaler(value uint) error {\n\tC.pwm_updatePrescaler(l.lwHandle, C.uint(value))\n\treturn l.error()\n}\n\nfunc (l *littleWire) servoInit() error {\n\tC.servo_init(l.lwHandle)\n\treturn l.error()\n}\n\nfunc (l *littleWire) servoUpdateLocation(locationA uint8, locationB uint8) error {\n\tC.servo_updateLocation(l.lwHandle, C.uchar(locationA), C.uchar(locationB))\n\treturn l.error()\n}\n\nfunc (l *littleWire) i2cInit() error {\n\tC.i2c_init(l.lwHandle)\n\treturn l.error()\n}\n\n// i2cStart starts the i2c communication; set direction to 1 for reading, 0 for writing\nfunc (l *littleWire) i2cStart(address7bit uint8, direction uint8) error {\n\tif C.i2c_start(l.lwHandle, C.uchar(address7bit), C.uchar(direction)) == 1 {\n\t\treturn nil\n\t}\n\tif err := l.error(); err != nil {\n\t\treturn err\n\t}\n\treturn fmt.Errorf(\"Littlewire i2cStart failed for %d in direction %d\", address7bit, direction)\n}\n\n// i2cWrite sends byte(s) over i2c with a given length <= 4\nfunc (l *littleWire) i2cWrite(sendBuffer []byte, length int, endWithStop uint8) error {\n\tC.i2c_write(l.lwHandle, (*C.uchar)(&sendBuffer[0]), C.uchar(length), C.uchar(endWithStop))\n\treturn l.error()\n}\n\n// i2cRead reads byte(s) over i2c with a given length <= 8\nfunc (l *littleWire) i2cRead(readBuffer []byte, length int, endWithStop uint8) error {\n\tC.i2c_read(l.lwHandle, (*C.uchar)(&readBuffer[0]), C.uchar(length), C.uchar(endWithStop))\n\treturn l.error()\n}\n\n// i2cUpdateDelay updates i2c signal delay amount. Tune if necessary to fit your requirements\nfunc (l *littleWire) i2cUpdateDelay(duration uint) error {\n\tC.i2c_updateDelay(l.lwHandle, C.uint(duration))\n\treturn l.error()\n}\n\nfunc (l *littleWire) error() error {\n\tstr := C.GoString(C.littleWire_errorName())\n\tif str != \"\" {\n\t\treturn errors.New(str)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/digispark/littleWire.h",
    "content": "#ifndef LITTLEWIRE_H\n#define LITTLEWIRE_H\n\n/*\n  Cross platform computer interface library for Little Wire project\n\n  http://littlewire.github.io\n\n  Copyright (C) <2013> ihsan Kehribar <ihsan@kehribar.me>\n  Copyright (C) <2013> Omer Kilic <omerkilic@gmail.com>\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy of\n  this software and associated documentation files (the \"Software\"), to deal in\n  the Software without restriction, including without limitation the rights to\n  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n  of the Software, and to permit persons to whom the Software is furnished to do\n  so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n#ifdef _WIN32\n   #include <lusb0_usb.h>   // this is libusb, see http://libusb.sourceforge.net/\n#else\n   #include <usb.h>       // this is libusb, see http://libusb.sourceforge.net/\n#endif\n#include \"opendevice.h\"\t\t\t// common code moved to separate module\n#include \"littleWire_util.h\"\n#include <stdio.h>\n\n#define\tVENDOR_ID 0x1781\n#define\tPRODUCT_ID 0x0c9f\n#define USB_TIMEOUT 5000\n#define RX_BUFFER_SIZE 64\n\n#define INPUT 1\n#define OUTPUT 0\n\n#define ENABLE 1\n#define DISABLE 0\n\n#define HIGH 1\n#define LOW\t 0\n\n#define AUTO_CS 1\n#define MANUAL_CS 0\n\n// Voltage ref definition\n#define VREF_VCC 0\n#define VREF_1100mV 1\n#define VREF_2560mV 2 \n\n// I2C definition\n#define END_WITH_STOP 1\n#define NO_STOP 0\n#define READ 1\n#define WRITE 0\n\n// General Purpose Pins\n#define PIN1 1\n#define PIN2 2\n#define PIN3 5\n#define PIN4 0\n\n// ADC Channels\n#define ADC_PIN3 0\n#define ADC_PIN2 1\n#define ADC_TEMP_SENS 2\n\n// PWM Pins\n#define PWM1 PIN4\n#define PWM2 PIN1\n\n// Aliases\n#define ADC0 ADC_PIN3\n#define ADC1 ADC_PIN2\n#define ADC2 ADC_TEMP_SENS\n#define PWMA PWM1\n#define PWMB PWM2\n\n// 'AVR ISP' Pins\n#define SCK_PIN PIN2\n#define MISO_PIN PIN1\n#define MOSI_PIN PIN4\n#define RESET_PIN PIN3\n\nextern unsigned char rxBuffer[RX_BUFFER_SIZE]; /* This has to be unsigned for the data's sake */\nextern unsigned char ROM_NO[8];\nextern int lwStatus;\n\n/*! \\addtogroup General\n*  @brief General library functions\n*  @{\n*/\n\ntypedef usb_dev_handle littleWire;\n\ntypedef struct lwCollection\n{\n  struct usb_device* lw_device;\n  int serialNumber;  \n}lwCollection;\n\nextern lwCollection lwResults[16];\n\nextern int lw_totalDevices;\n\n/**\n  * Tries to cache all the littleWire devices and stores them in lwResults array. \\n\n  * Don't actually connects to any of the device(s).\n  *\n  * @param (none)\n  * @return Total number of littleWire devices found in the USB system.\n  */\nint littlewire_search();\n\n/**\n  * Tries to connect to the spesific littleWire device by array id. \n  *\n  * @param desiredID array index of the lwResults array.\n  * @return littleWire pointer for healthy connection, NULL for a failed trial.\n  */\nlittleWire* littlewire_connect_byID(int desiredID);\n\n/**\n  * Tries to connect to the spesific littleWire with a given serial number. \\n\n  * If multiple devices have the same serial number, it connects to the last one it finds \n  *\n  * @param mySerial Serial number of the desired littlewire device.\n  * @return littleWire pointer for healthy connection, NULL for a failed trial.\n  */\nlittleWire* littlewire_connect_bySerialNum(int mySerial);\n\n/**\n  * Tries to connect to the first littleWire device that libusb can find. \n  *\n  * @param (none)\n  * @return littleWire pointer for healthy connection, NULL for a failed trial.\n  */\nlittleWire* littleWire_connect();\n\n/**\n  * Reads the firmware version of the Little Wire \\n\n  * Format: 0xXY => X: Primary version Y: Minor version\n  *\n  * @param (none)\n  * @return Firmware version\n  */ \nunsigned char readFirmwareVersion(littleWire* lwHandle);\n\n/**\n  * Changes the USB serial number of the Little Wire \n  * \n  * @param serialNumber Serial number integer value (100-99)\n  * @return (none)\n  */\nvoid changeSerialNumber(littleWire* lwHandle,int serialNumber);\n\n/**\n  * Sends a custom message to the device. \\n\n  * Useful when developing new features in the firmware.\n  *\n  * @param receiveBuffer Returned data buffer\n  * @param command Firmware command\n  * @param d1 data[0] for the command\n  * @param d2 data[1] for the command\n  * @param d3 data[2] for the command\n  * @param d4 data[3] for the command\n  * @return status\n  */\nint customMessage(littleWire* lwHandle,unsigned char* receiveBuffer,unsigned char command,unsigned char d1,unsigned char d2, unsigned char d3, unsigned char d4);\n\n/**\n  * Returns the numeric value of the status of the last communication attempt\n  *\n  * @param (none)\n  * @return Numeric value of the status of the last communication attempt\n  */\nint littleWire_error ();\n\n/**\n  * Returns the string version of the last communication attempt status if there was an error\n  *\n  * @param (none)\n  * @return String version of the last communication attempt status if there was an error\n  */\nchar *littleWire_errorName ();\n\n/*! @} */\n\n/*! \\addtogroup GPIO\n*  @brief GPIO library functions with Arduino-like syntax\n*  @{\n*/\n\n/**\n  * Set pin value\n  *\n  * @param lwHandle littleWire device pointer\n  * @param pin Pin name (\\b PIN1 , \\b PIN2 , \\b PIN3 or \\b PIN4 )\n  * @param state Pin state (\\b HIGH or \\b LOW)\n  * @return (none)\n  */\nvoid digitalWrite(littleWire* lwHandle, unsigned char pin, unsigned char state);\n\n/**\n  * Set pin as input/output\n  *\n  * @param lwHandle littleWire device pointer\n  * @param pin Pin name (\\b PIN1 , \\b PIN2 , \\b PIN3 or \\b PIN4 )\n  * @param mode Mode of pin (\\b INPUT or \\b OUTPUT)\n  * @return (none)\n  */\nvoid pinMode(littleWire* lwHandle, unsigned char pin, unsigned char mode);\n\n/**\n  * Read pin value\n  *\n  * @param lwHandle littleWire device pointer\n  * @param pin Pin name (\\b PIN1 , \\b PIN2 , \\b PIN3 or \\b PIN4 )\n  * @return Pin state (\\b HIGH or \\b LOW)\n  */\nunsigned char digitalRead(littleWire* lwHandle, unsigned char pin);\n\n/**\n  * Sets the state of the internal pullup resistor. \n  * \\n Call this function after you assign the pin as an input.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param pin Pin name (\\b PIN1 , \\b PIN2 , \\b PIN3 or \\b PIN4 )\n  * @rparam state (\\b ENABLE or \\b DISABLE )\n  * @return (none)\n  */\nvoid internalPullup(littleWire* lwHandle, unsigned char pin, unsigned char state);\n\n/*! @} */\n\n/*! \\addtogroup ADC\n*  @brief Analog to digital converter functions.\n*  @{\n*/\n\n/**\n  * Initialize the analog module. VREF_VCC is the standard voltage coming from the USB plug\n  * \\n Others are the Attiny's internal voltage references.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param voltageRef (\\b VREF_VCC , \\b VREF_110mV or \\b VREF_2560mV )\n  * @return (none)\n  */\nvoid analog_init(littleWire* lwHandle, unsigned char voltageRef);\n\n/**\n  * Read analog voltage. Analog voltage reading from ADC_PIN3 isn't advised (it is a bit noisy) but supported. Use it at your own risk.\n  * \\n For more about internal temperature sensor, look at the Attiny85 datasheet.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param channel Source of ADC reading (\\b ADC_PIN2 , \\b ADC_PIN3 or \\b ADC_TEMP_SENS )\n  * @return 10 bit ADC result\n  */\nunsigned int analogRead(littleWire* lwHandle, unsigned char channel);\n\n/*! @} */\n\n/*! \\addtogroup PWM\n*  @brief Pulse width modulation functions.\n*  @{\n*/\n\n/**\n  * Initialize the PWM module on the Little-Wire \n  *\n  * @param lwHandle littleWire device pointer\n  * @return (none)\n  */\nvoid pwm_init(littleWire* lwHandle);\n\n/**\n  * Stop the PWM module on the Little-Wire \n  *\n  * @param lwHandle littleWire device pointer\n  * @return (none)\n  */\nvoid pwm_stop(littleWire* lwHandle);\n\n/**\n  * Update the compare values of the PWM output pins. Resolution is 8 bit.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param channelA Compare value of \\b PWMA pin\n  * @param channelB Compare value of \\b PWMB pin\n  * @return (none)\n  */\nvoid pwm_updateCompare(littleWire* lwHandle, unsigned char channelA, unsigned char channelB);\n\n/**\n  * Update the prescaler of the PWM module. Adjust this value according to your need for speed in PWM output. Default is 1024. Lower prescale means higher frequency PWM output.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param value Presecaler value (\\b 1024, \\b 256, \\b 64, \\b 8 or \\b 1) \n  * @return (none)\n  */\nvoid pwm_updatePrescaler(littleWire* lwHandle, unsigned int value);\n\n/*! @} */\n\n/*! \\addtogroup SPI\n*  @brief Serial peripheral interface functions.\n*  @{\n*/\n\n/**\n  * Initialize the SPI module on the Little-Wire \n  *\n  * @param lwHandle littleWire device pointer\n  * @return (none)\n  */\nvoid spi_init(littleWire* lwHandle);\n\n/**\n  * Send SPI message(s). SPI Mode is 0. \n  *\n  * @param lwHandle littleWire device pointer\n  * @param sendBuffer Message array to send\n  * @param inputBuffer Returned answer message\n  * @param length Message length - maximum 4\n  * @param mode \\b AUTO_CS or \\b MANUAL_CS\n  * @return (none)\n  */\nvoid spi_sendMessage(littleWire* lwHandle, unsigned char * sendBuffer, unsigned char * inputBuffer, unsigned char length ,unsigned char mode);\n\n/**\n  * Send one byte SPI message over SDO pin. Slightly slower than the actual one.\n  * \\n There isn't any chip select control involved. Useful for debug console app\n  *\n  * @param lwHandle littleWire device pointer\n  * @param message Message to send\n  * @return Received SPI message\n  */\nunsigned char debugSpi(littleWire* lwHandle, unsigned char message);\n\n/**\n  * Change the SPI message frequency by adjusting delay duration. By default, Little-Wire sends the SPI messages with maximum speed. \n  * \\n If your hardware can't catch up with the speed, increase the duration value to lower the SPI speed.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param duration Amount of delay. \n  * @return (none)\n  */\nvoid spi_updateDelay(littleWire* lwHandle, unsigned int duration);\n\n/*! @} */\n\n/*! \\addtogroup I2C\n  *  @brief Inter IC communication functions.\n  *  @{\n  */\n\n/**\n  * Initialize the I2C module on the Little-Wire \n  *\n  * @return (none)\n  */\nvoid i2c_init(littleWire* lwHandle);\n\n/**\n  * Start the i2c communication\n  *\n  * @param lwHandle littleWire device pointer\n  * @param address 7 bit target address.\n  * @param direction ( \\b READ or \\b WRITE )\n  * @return 1 if received ACK\n  */\nunsigned char i2c_start(littleWire* lwHandle, unsigned char address7bit, unsigned char direction);\n\n/**\n  * Send byte(s) over i2c bus\n  *\n  * @param lwHandle littleWire device pointer\n  * @param sendBuffer Message array to send\n  * @param length Message length -> Max = 4\n  * @param endWithStop Should we send a STOP condition after this buffer? ( \\b END_WITH_STOP or \\b NO_STOP )\n  * @return (none)\n  */\nvoid i2c_write(littleWire* lwHandle, unsigned char* sendBuffer, unsigned char length, unsigned char endWithStop);\n\n/**\n  * Read byte(s) over i2c bus\n  * \n  * @param lwHandle littleWire device pointer\n  * @param readBuffer Returned message array\n  * @param length Message length -> Max = 8\n  * @param endWithStop Should we send a STOP condition after this buffer? ( \\b END_WITH_STOP or \\b NO_STOP )\n  * @return (none)\n  */\nvoid i2c_read(littleWire* lwHandle, unsigned char* readBuffer, unsigned char length, unsigned char endWithStop);\n\n/**\n  * Update i2c signal delay amount. Tune if necessary to fit your requirements.\n  * \n  * @param lwHandle littleWire device pointer\n  * @param duration Delay amount\n  * @return (none)\n  */\nvoid i2c_updateDelay(littleWire* lwHandle, unsigned int duration);\n\n/*! @} */ \n\n/*! \\addtogroup Onewire\n *  @brief Onewire functions.\n *  @{\n */\n\n/**\n  * Send a single bit over onewire bus.\n  *\n  * @param lwHandle littleWire device pointer  \n  * @param bitValue \\b 1 or \\b 0\n  * @return (none)\n  */\nvoid onewire_sendBit(littleWire* lwHandle, unsigned char bitValue);\n\n/**\n  * Send a byte over onewire bus.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param messageToSend Message to send\n  * @return (none)\n  */\nvoid onewire_writeByte(littleWire* lwHandle, unsigned char messageToSend);\n\n/**\n  * Read a byte over onewire bus.\n  *\n  * @param lwHandle littleWire device pointer\n  * @return Read byte\n  */\nunsigned char onewire_readByte(littleWire* lwHandle);\n\n/**\n  * Read a single bit over onewire bus\n  *\n  * @param lwHandle littleWire device pointer\n  * @return Read bit ( \\b 1 or \\b 0 )\n  */\nunsigned char onewire_readBit(littleWire* lwHandle);\n\n/**\n  * Send a reset pulse over onewire bus\n  * \n  * @param lwHandle littleWire device pointer\n  * @return Nonzero if any device presents on the bus\n  */\nunsigned char onewire_resetPulse(littleWire* lwHandle);\n\n/**\n  * Start searching for device address on the onewire bus.\n  * \\n Read the 8 byte address from \\b ROM_NO array\n  *\n  * @param lwHandle littleWire device pointer  \n  * @return Nonzero if any device found\n  */\nint onewire_firstAddress(littleWire* lwHandle);\n\n/**\n  * Try to find the next adress on the onewire bus.\n  * \\n Read the 8 byte address from \\b ROM_NO array\n  *\n  * @param lwHandle littleWire device pointer  \n  * @return Nonzero if any new device found\n  */\nint onewire_nextAddress(littleWire* lwHandle);\n\n/*! @} */ \n\n/*! \\addtogroup SOFT_PWM\n  *  @brief Software PWM functions. Designed to be used with RGB LEDs.\n  *  @{\n  */\n\n/**\n  * Sets the state of the softPWM module\n  * \n  * @param lwHandle littleWire device pointer\n  * @param state State of the softPWM module ( \\b ENABLE or \\b DISABLE )\n  * @return (none)\n  */\nvoid softPWM_state(littleWire* lwHandle,unsigned char state);\n\n/**\n  * Updates the values of softPWM modules\n  *\n  * @param lwHandle littleWire device pointer\n  * @param ch1 Value of channel 1 - \\b PIN4\n  * @param ch2 Value of channel 2 - \\b PIN1\n  * @param ch3 Value of channel 3 - \\b PIN2\n  * @return (none)\n  */\nvoid softPWM_write(littleWire* lwHandle,unsigned char ch1,unsigned char ch2,unsigned char ch3);\n\n/*! @} */\n\n/*! @} */ \n\n/*! \\addtogroup WS2812\n  *  @brief WS2812 programmable RGB-LED support\n  *  @{\n  */\n\n  /**\n  * Writes to a WS2812 RGB-LED. This function writes the passed rgb values to a WS2812 led string\n  * connected to the given pin. Use this if you want to control a single LED.\n  *\n  * If RGB values were preloaded with the preload call, the values passed in this call are added\n  * to the buffer and the entire buffer is written to the LED string. This feature can be used to\n  * reduce the number of USB transmissions for a string.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param r value of the red channel\n  * @param g value of the green channel\n  * @param b value of the blue channel\n  * @param pin Pin name (\\b PIN1 , \\b PIN2 , \\b PIN3 or \\b PIN4 )\n  * @return (none)\n  */\nvoid ws2812_write(littleWire* lwHandle, unsigned char pin,unsigned char r,unsigned char g,unsigned char b);\n\n  /**\n  * This function flushes the contents of the littlewire internal RGB buffer to the LED string.\n  *\n  * @param lwHandle littleWire device pointer\n  * @param r value of the red channel\n  * @param g value of the green channel\n  * @param b value of the blue channel\n  * @return (none)\n  */\nvoid ws2812_flush(littleWire* lwHandle, unsigned char pin);\n\n  /**\n  * Preloads a RGB value to the internal buffer. Up to 64 values can be preloaded. Further writes will be ignored\n  *\n  * @param lwHandle littleWire device pointer\n  * @param r value of the red channel\n  * @param g value of the green channel\n  * @param b value of the blue channel\n  * @return (none)\n  */\nvoid ws2812_preload(littleWire* lwHandle, unsigned char r,unsigned char g,unsigned char b);\n\n  /*! @} */\n  \n\n/**\n* @mainpage Introduction\n\n\\htmlinclude intro.html\n\n*/\n\n#endif\n"
  },
  {
    "path": "platforms/digispark/littleWire_servo.c",
    "content": "/*\n\tHigher level servo driving library for Little Wire.\n\n\tCopyright (C) <2013> ihsan Kehribar <ihsan@kehribar.me>\n\t\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n\tof the Software, and to permit persons to whom the Software is furnished to do\n\tso, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n*/\n\n#include \"littleWire_servo.h\"\n\n/********************************************************************************\n* Useful definitions\n********************************************************************************/\nconst float MIN_LIMIT = 0.45; // in miliseconds\nconst float MAX_LIMIT = 2.45; // in miliseconds\nconst float STEP_SIZE = 0.062; // in miliseconds\nconst float RANGE = 180.0; // in degrees\n/*******************************************************************************/\n\n/********************************************************************************\n* Servo module initialization\n********************************************************************************/\nvoid servo_init(littleWire* lwHandle)\n{\n\tpwm_init(lwHandle); // Initialize the PWM hardware.\n\tpinMode(lwHandle,PWMA,OUTPUT); pinMode(lwHandle,PWMB,OUTPUT); // Set PWM pins output.\n\tpwm_updatePrescaler(lwHandle,1024); // Make sure the PWM prescaler is set correctly.\n}\n/*******************************************************************************/\n\n/********************************************************************************\n* Servo locations update\n*\tlocationChannelA in degrees\n*\tlocationChannelB in degrees\n********************************************************************************/\nvoid servo_updateLocation(littleWire* lwHandle,unsigned char locationChannelA,unsigned char locationChannelB)\n{\n\tlocationChannelA=(((locationChannelA/RANGE)*(MAX_LIMIT-MIN_LIMIT))+MIN_LIMIT)/STEP_SIZE;\n\tlocationChannelB=(((locationChannelB/RANGE)*(MAX_LIMIT-MIN_LIMIT))+MIN_LIMIT)/STEP_SIZE;\n\tpwm_updateCompare(lwHandle,locationChannelA,locationChannelB);\n}\n/*******************************************************************************/"
  },
  {
    "path": "platforms/digispark/littleWire_servo.h",
    "content": "#ifndef LITTLEWIRE_SERVO_H\n#define LITTLEWIRE_SERVO_H\n/*\n\tHigher level servo driving library for Little Wire.\n\n\tCopyright (C) <2013> ihsan Kehribar <ihsan@kehribar.me>\n\t\n\tPermission is hereby granted, free of charge, to any person obtaining a copy of\n\tthis software and associated documentation files (the \"Software\"), to deal in\n\tthe Software without restriction, including without limitation the rights to\n\tuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n\tof the Software, and to permit persons to whom the Software is furnished to do\n\tso, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n*/\n\n#include \"littleWire.h\"\n\n/*! \\addtogroup Servo\n  *  @brief Servo functions. Higher level access to PWM module.\n  *  @{\n  */\n\n/**\n  * Initialize the PWM module on the Little-Wire with the Servo special settings.\n  *\n  * @param lwHandle littleWire device pointer\n  * @return (none)\n  */\nvoid servo_init(littleWire* lwHandle);\n\n/**\n  * Update servo locations \n  *\n  * @param lwHandle littleWire device pointer\n  * @param locationChannelA Location of servo connected to channel A ( in degrees )\n  * @param locationChannelB Location of servo connected to channel B ( in degrees )\n  * @return (none)\n  */\nvoid servo_updateLocation(littleWire* lwHandle,unsigned char locationChannelA,unsigned char locationChannelB);\n\n/*! @} */\n\n#endif"
  },
  {
    "path": "platforms/digispark/littleWire_util.c",
    "content": "\n#include <littleWire_util.h>\n\n/* Delay in miliseconds */\nvoid delay(unsigned int duration)\n{\n\t#ifdef _WIN32\n    Sleep(duration);\n\t#else\n    usleep(duration*1000);\n\t#endif\n}\n"
  },
  {
    "path": "platforms/digispark/littleWire_util.h",
    "content": "#ifndef LITTLEWIRE_UTIL_H\n#define LITTLEWIRE_UTIL_H\n\n#ifdef _WIN32\n  #include <windows.h>\n#else\n  #include <unistd.h>\n#endif\n\n/* Delay in miliseconds */\nvoid delay(unsigned int duration);\n\n#endif\n"
  },
  {
    "path": "platforms/digispark/opendevice.c",
    "content": "/* Name: opendevice.c\n * Project: V-USB host-side library\n * Author: Christian Starkjohann\n * Creation Date: 2008-04-10\n * Tabsize: 4\n * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH\n * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)\n * This Revision: $Id: opendevice.c 740 2009-04-13 18:23:31Z cs $\n */\n\n/*\nGeneral Description:\nThe functions in this module can be used to find and open a device based on\nlibusb or libusb-win32.\n*/\n\n#include <stdio.h>\n#include \"opendevice.h\"\n\n/* ------------------------------------------------------------------------- */\n\n#define MATCH_SUCCESS\t\t\t1\n#define MATCH_FAILED\t\t\t0\n#define MATCH_ABORT\t\t\t\t-1\n\n/* private interface: match text and p, return MATCH_SUCCESS, MATCH_FAILED, or MATCH_ABORT. */\nstatic int  _shellStyleMatch(char *text, char *p)\n{\nint last, matched, reverse;\n\n    for(; *p; text++, p++){\n        if(*text == 0 && *p != '*')\n            return MATCH_ABORT;\n        switch(*p){\n        case '\\\\':\n            /* Literal match with following character. */\n            p++;\n            /* FALLTHROUGH */\n        default:\n            if(*text != *p)\n                return MATCH_FAILED;\n            continue;\n        case '?':\n            /* Match anything. */\n            continue;\n        case '*':\n            while(*++p == '*')\n                /* Consecutive stars act just like one. */\n                continue;\n            if(*p == 0)\n                /* Trailing star matches everything. */\n                return MATCH_SUCCESS;\n            while(*text)\n                if((matched = _shellStyleMatch(text++, p)) != MATCH_FAILED)\n                    return matched;\n            return MATCH_ABORT;\n        case '[':\n            reverse = p[1] == '^';\n            if(reverse) /* Inverted character class. */\n                p++;\n            matched = MATCH_FAILED;\n            if(p[1] == ']' || p[1] == '-')\n                if(*++p == *text)\n                    matched = MATCH_SUCCESS;\n            for(last = *p; *++p && *p != ']'; last = *p)\n                if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : *text == *p)\n                    matched = MATCH_SUCCESS;\n            if(matched == reverse)\n                return MATCH_FAILED;\n            continue;\n        }\n    }\n    return *text == 0;\n}\n\n/* public interface for shell style matching: returns 0 if fails, 1 if matches */\nstatic int shellStyleMatch(char *text, char *pattern)\n{\n    if(pattern == NULL) /* NULL pattern is synonymous to \"*\" */\n        return 1;\n    return _shellStyleMatch(text, pattern) == MATCH_SUCCESS;\n}\n\n/* ------------------------------------------------------------------------- */\n\nint usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen)\n{\nchar    buffer[256];\nint     rval, i;\n\n    if((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use libusb version if it works */\n        return rval;\n    if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, 0x0409, buffer, sizeof(buffer), 5000)) < 0)\n        return rval;\n    if(buffer[1] != USB_DT_STRING){\n        *buf = 0;\n        return 0;\n    }\n    if((unsigned char)buffer[0] < rval)\n        rval = (unsigned char)buffer[0];\n    rval /= 2;\n    /* lossy conversion to ISO Latin1: */\n    for(i=1;i<rval;i++){\n        if(i > buflen)              /* destination buffer overflow */\n            break;\n        buf[i-1] = buffer[2 * i];\n        if(buffer[2 * i + 1] != 0)  /* outside of ISO Latin1 range */\n            buf[i-1] = '?';\n    }\n    buf[i-1] = 0;\n    return i-1;\n}\n\n/* ------------------------------------------------------------------------- */\n\nint usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp)\n{\nstruct usb_bus      *bus;\nstruct usb_device   *dev;\nusb_dev_handle      *handle = NULL;\nint                 errorCode = USBOPEN_ERR_NOTFOUND;\n\n    usb_find_busses();\n    usb_find_devices();\n    for(bus = usb_get_busses(); bus; bus = bus->next){\n        for(dev = bus->devices; dev; dev = dev->next){  /* iterate over all devices on all busses */\n            if((vendorID == 0 || dev->descriptor.idVendor == vendorID)\n                        && (productID == 0 || dev->descriptor.idProduct == productID)){\n                char    vendor[256], product[256], serial[256];\n                int     len;\n                handle = usb_open(dev); /* we need to open the device in order to query strings */\n                if(!handle){\n                    errorCode = USBOPEN_ERR_ACCESS;\n                    if(warningsFp != NULL)\n                        fprintf(warningsFp, \"Warning: cannot open VID=0x%04x PID=0x%04x: %s\\n\", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror());\n                    continue;\n                }\n                /* now check whether the names match: */\n                len = vendor[0] = 0;\n                if(dev->descriptor.iManufacturer > 0){\n                    len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, vendor, sizeof(vendor));\n                }\n                if(len < 0){\n                    errorCode = USBOPEN_ERR_ACCESS;\n                    if(warningsFp != NULL)\n                        fprintf(warningsFp, \"Warning: cannot query manufacturer for VID=0x%04x PID=0x%04x: %s\\n\", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror());\n                }else{\n                    errorCode = USBOPEN_ERR_NOTFOUND;\n                    /* printf(\"seen device from vendor ->%s<-\\n\", vendor); */\n                    if(shellStyleMatch(vendor, vendorNamePattern)){\n                        len = product[0] = 0;\n                        if(dev->descriptor.iProduct > 0){\n                            len = usbGetStringAscii(handle, dev->descriptor.iProduct, product, sizeof(product));\n                        }\n                        if(len < 0){\n                            errorCode = USBOPEN_ERR_ACCESS;\n                            if(warningsFp != NULL)\n                                fprintf(warningsFp, \"Warning: cannot query product for VID=0x%04x PID=0x%04x: %s\\n\", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror());\n                        }else{\n                            errorCode = USBOPEN_ERR_NOTFOUND;\n                            /* printf(\"seen product ->%s<-\\n\", product); */\n                            if(shellStyleMatch(product, productNamePattern)){\n                                len = serial[0] = 0;\n                                if(dev->descriptor.iSerialNumber > 0){\n                                    len = usbGetStringAscii(handle, dev->descriptor.iSerialNumber, serial, sizeof(serial));\n                                }\n                                if(len < 0){\n                                    errorCode = USBOPEN_ERR_ACCESS;\n                                    if(warningsFp != NULL)\n                                        fprintf(warningsFp, \"Warning: cannot query serial for VID=0x%04x PID=0x%04x: %s\\n\", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror());\n                                }\n                                if(shellStyleMatch(serial, serialNamePattern)){\n                                    if(printMatchingDevicesFp != NULL){\n                                        if(serial[0] == 0){\n                                            fprintf(printMatchingDevicesFp, \"VID=0x%04x PID=0x%04x vendor=\\\"%s\\\" product=\\\"%s\\\"\\n\", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product);\n                                        }else{\n                                            fprintf(printMatchingDevicesFp, \"VID=0x%04x PID=0x%04x vendor=\\\"%s\\\" product=\\\"%s\\\" serial=\\\"%s\\\"\\n\", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product, serial);\n                                        }\n                                    }else{\n                                        break;\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n                usb_close(handle);\n                handle = NULL;\n            }\n        }\n        if(handle)  /* we have found a deice */\n            break;\n    }\n    if(handle != NULL){\n        errorCode = 0;\n        *device = handle;\n    }\n    if(printMatchingDevicesFp != NULL)  /* never return an error for listing only */\n        errorCode = 0;\n    return errorCode;\n}\n\n/* ------------------------------------------------------------------------- */\n"
  },
  {
    "path": "platforms/digispark/opendevice.h",
    "content": "/* Name: opendevice.h\n * Project: V-USB host-side library\n * Author: Christian Starkjohann\n * Creation Date: 2008-04-10\n * Tabsize: 4\n * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH\n * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)\n * This Revision: $Id: opendevice.h 755 2009-08-03 17:01:21Z cs $\n */\n\n/*\nGeneral Description:\nThis module offers additional functionality for host side drivers based on\nlibusb or libusb-win32. It includes a function to find and open a device\nbased on numeric IDs and textual description. It also includes a function to\nobtain textual descriptions from a device.\n\nTo use this functionality, simply copy opendevice.c and opendevice.h into your\nproject and add them to your Makefile. You may modify and redistribute these\nfiles according to the GNU General Public License (GPL) version 2 or 3.\n*/\n\n#ifndef __OPENDEVICE_H_INCLUDED__\n#define __OPENDEVICE_H_INCLUDED__\n\n#ifdef _WIN32\n   #include <lusb0_usb.h>   // this is libusb, see http://libusb.sourceforge.net/ \n#else\n   #include <usb.h>     // this is libusb, see http://libusb.sourceforge.net/ \n#endif\n#include <stdio.h>\n\nint usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen);\n/* This function gets a string descriptor from the device. 'index' is the\n * string descriptor index. The string is returned in ISO Latin 1 encoding in\n * 'buf' and it is terminated with a 0-character. The buffer size must be\n * passed in 'buflen' to prevent buffer overflows. A libusb device handle\n * must be given in 'dev'.\n * Returns: The length of the string (excluding the terminating 0) or\n * a negative number in case of an error. If there was an error, use\n * usb_strerror() to obtain the error message.\n */\n\nint usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp);\n/* This function iterates over all devices on all USB busses and searches for\n * a device. Matching is done first by means of Vendor- and Product-ID (passed\n * in 'vendorID' and 'productID'. An ID of 0 matches any numeric ID (wildcard).\n * When a device matches by its IDs, matching by names is performed. Name\n * matching can be done on textual vendor name ('vendorNamePattern'), product\n * name ('productNamePattern') and serial number ('serialNamePattern'). A\n * device matches only if all non-null pattern match. If you don't care about\n * a string, pass NULL for the pattern. Patterns are Unix shell style pattern:\n * '*' stands for 0 or more characters, '?' for one single character, a list\n * of characters in square brackets for a single character from the list\n * (dashes are allowed to specify a range) and if the lis of characters begins\n * with a caret ('^'), it matches one character which is NOT in the list.\n * Other parameters to the function: If 'warningsFp' is not NULL, warning\n * messages are printed to this file descriptor with fprintf(). If\n * 'printMatchingDevicesFp' is not NULL, no device is opened but matching\n * devices are printed to the given file descriptor with fprintf().\n * If a device is opened, the resulting USB handle is stored in '*device'. A\n * pointer to a \"usb_dev_handle *\" type variable must be passed here.\n * Returns: 0 on success, an error code (see defines below) on failure.\n */\n\n/* usbOpenDevice() error codes: */\n#define USBOPEN_SUCCESS         0   /* no error */\n#define USBOPEN_ERR_ACCESS      1   /* not enough permissions to open device */\n#define USBOPEN_ERR_IO          2   /* I/O error */\n#define USBOPEN_ERR_NOTFOUND    3   /* device not found */\n\n\n/* Obdev's free USB IDs, see USB-IDs-for-free.txt for details */\n\n#define USB_VID_OBDEV_SHARED        5824    /* obdev's shared vendor ID */\n#define USB_PID_OBDEV_SHARED_CUSTOM 1500    /* shared PID for custom class devices */\n#define USB_PID_OBDEV_SHARED_HID    1503    /* shared PID for HIDs except mice & keyboards */\n#define USB_PID_OBDEV_SHARED_CDCACM 1505    /* shared PID for CDC Modem devices */\n#define USB_PID_OBDEV_SHARED_MIDI   1508    /* shared PID for MIDI class devices */\n\n#endif /* __OPENDEVICE_H_INCLUDED__ */\n"
  },
  {
    "path": "platforms/dji/README.md",
    "content": "# DJI\n\nThis package contains the Gobot drivers for DJI (https://www.dji.com/) drones.\n\nThis package currently supports the following drones:\n- [DJI Tello](https://www.ryzerobotics.com/tello)\n"
  },
  {
    "path": "platforms/dji/dji.go",
    "content": "// Package dji contains the Gobot drivers for DJI drones.\n// Currently only has support for the DJI Tello.\n// For more information, go to:\npackage dji // import \"gobot.io/x/gobot/v2/platforms/dji\"\n"
  },
  {
    "path": "platforms/dji/tello/README.md",
    "content": "# Tello\n\nThis package contains the Gobot driver for the Ryze Tello drone, sold by DJI.\n\nFor more information on this drone, go to: [https://www.ryzerobotics.com/tello](https://www.ryzerobotics.com/tello)\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\nConnect to the drone's Wi-Fi network from your computer. It will be named something like \"TELLO-XXXXXX\".\n\nOnce you are connected you can run the Gobot code on your computer to control the drone.\n\nHere is a sample of how you initialize and use the driver:\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/dji/tello\"\n)\n\nfunc main() {\n  drone := tello.NewDriver(\"8888\")\n\n  work := func() {\n    drone.TakeOff()\n\n    gobot.After(5*time.Second, func() {\n      drone.Land()\n    })\n  }\n\n  robot := gobot.NewRobot(\"tello\",\n    []gobot.Connection{},\n    []gobot.Device{drone},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## Telo Edu driver\n\nIf you are planning to connect to the edu version of the tello, please use the `NewDriverWithIP` driver instead\n\n```go\ndrone := tello.NewDriverWithIP(\"192.168.10.1\", \"8888\")\n```\n\n## References\n\nThis driver could not exist without the awesome members of the unofficial Tello forum:\n\n<https://tellopilots.com/forums/tello-development.8/>\n\nSpecial thanks to [@Kragrathea](https://github.com/Kragrathea) who figured out a LOT of the packets and code as implemented\nin C#: [https://github.com/Kragrathea/TelloPC](https://github.com/Kragrathea/TelloPC)\n\nAlso thanks to [@microlinux](https://github.com/microlinux) with the Python library which served as the first example for\nthe Tello community: [https://github.com/microlinux/tello](https://github.com/microlinux/tello)\n\nThank you to bluejune for the [https://bitbucket.org/PingguSoft/pytello](https://bitbucket.org/PingguSoft/pytello) repo,\nespecially the Wireshark Lua dissector which has proven indispensable.\n"
  },
  {
    "path": "platforms/dji/tello/crc.go",
    "content": "package tello\n\nvar crc8table = []byte{\n\t0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83, 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,\n\t0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e, 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,\n\t0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0, 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,\n\t0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d, 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,\n\t0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5, 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,\n\t0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58, 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,\n\t0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6, 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,\n\t0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b, 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,\n\t0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f, 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,\n\t0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92, 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,\n\t0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c, 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,\n\t0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1, 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,\n\t0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49, 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,\n\t0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4, 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,\n\t0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a, 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,\n\t0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7, 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35,\n}\n\n// CalculateCRC8 calculates the starting CRC8 byte for packet.\nfunc CalculateCRC8(pkt []byte) byte {\n\tcrc := byte(0x77)\n\tfor _, val := range pkt {\n\t\tcrc = crc8table[(crc^val)&0xff]\n\t}\n\n\treturn crc\n}\n\n//nolint:lll // ok here\nvar crc16table = []uint16{\n\t0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,\n\t0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,\n\t0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,\n\t0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,\n\t0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,\n\t0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,\n\t0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,\n\t0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,\n\t0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,\n\t0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,\n\t0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,\n\t0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,\n\t0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,\n\t0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,\n\t0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,\n\t0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78,\n}\n\n// CalculateCRC16 calculates the ending CRC16 bytes for packet.\nfunc CalculateCRC16(pkt []byte) uint16 {\n\tcrc := uint16(0x3692)\n\tfor _, val := range pkt {\n\t\tcrc = crc16table[(crc^uint16(val))&0xff] ^ (crc >> 8)\n\t}\n\n\treturn crc\n}\n"
  },
  {
    "path": "platforms/dji/tello/driver.go",
    "content": "package tello\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"net\"\n\t\"strconv\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// BounceEvent event\n\tBounceEvent = \"bounce\"\n\n\t// ConnectedEvent event\n\tConnectedEvent = \"connected\"\n\n\t// FlightDataEvent event\n\tFlightDataEvent = \"flightdata\"\n\n\t// TakeoffEvent event\n\tTakeoffEvent = \"takeoff\"\n\n\t// LandingEvent event\n\tLandingEvent = \"landing\"\n\n\t// PalmLandingEvent event\n\tPalmLandingEvent = \"palm-landing\"\n\n\t// FlipEvent event\n\tFlipEvent = \"flip\"\n\n\t// TimeEvent event\n\tTimeEvent = \"time\"\n\n\t// LogEvent event\n\tLogEvent = \"log\"\n\n\t// WifiDataEvent event\n\tWifiDataEvent = \"wifidata\"\n\n\t// LightStrengthEvent event\n\tLightStrengthEvent = \"lightstrength\"\n\n\t// SetExposureEvent event\n\tSetExposureEvent = \"setexposure\"\n\n\t// VideoFrameEvent event\n\tVideoFrameEvent = \"videoframe\"\n\n\t// SetVideoEncoderRateEvent event\n\tSetVideoEncoderRateEvent = \"setvideoencoder\"\n)\n\n// the 16-bit messages and commands stored in bytes 6 & 5 of the packet\nconst (\n\tmessageStart   = 0x00cc // 204\n\twifiMessage    = 0x001a // 26\n\tvideoRateQuery = 0x0028 // 40\n\tlightMessage   = 0x0035 // 53\n\tflightMessage  = 0x0056 // 86\n\tlogMessage     = 0x1050 // 4176\n\n\tvideoEncoderRateCommand = 0x0020 // 32\n\tvideoStartCommand       = 0x0025 // 37\n\texposureCommand         = 0x0034 // 52\n\ttimeCommand             = 0x0046 // 70\n\tstickCommand            = 0x0050 // 80\n\ttakeoffCommand          = 0x0054 // 84\n\tlandCommand             = 0x0055 // 85\n\tflipCommand             = 0x005c // 92\n\tthrowtakeoffCommand     = 0x005d // 93\n\tpalmLandCommand         = 0x005e // 94\n\tbounceCommand           = 0x1053 // 4179\n)\n\n// FlipType is used for the various flips supported by the Tello.\ntype FlipType int\n\nconst (\n\t// FlipFront flips forward.\n\tFlipFront FlipType = 0\n\n\t// FlipLeft flips left.\n\tFlipLeft FlipType = 1\n\n\t// FlipBack flips backwards.\n\tFlipBack FlipType = 2\n\n\t// FlipRight flips to the right.\n\tFlipRight FlipType = 3\n\n\t// FlipForwardLeft flips forwards and to the left.\n\tFlipForwardLeft FlipType = 4\n\n\t// FlipBackLeft flips backwards and to the left.\n\tFlipBackLeft FlipType = 5\n\n\t// FlipBackRight flips backwards and to the right.\n\tFlipBackRight FlipType = 6\n\n\t// FlipForwardRight flips forewards and to the right.\n\tFlipForwardRight FlipType = 7\n)\n\n// VideoBitRate is used to set the bit rate for the streaming video returned by the Tello.\ntype VideoBitRate int\n\nconst (\n\t// VideoBitRateAuto sets the bitrate for streaming video to auto-adjust.\n\tVideoBitRateAuto VideoBitRate = 0\n\n\t// VideoBitRate1M sets the bitrate for streaming video to 1 Mb/s.\n\tVideoBitRate1M VideoBitRate = 1\n\n\t// VideoBitRate15M sets the bitrate for streaming video to 1.5 Mb/s\n\tVideoBitRate15M VideoBitRate = 2\n\n\t// VideoBitRate2M sets the bitrate for streaming video to 2 Mb/s.\n\tVideoBitRate2M VideoBitRate = 3\n\n\t// VideoBitRate3M sets the bitrate for streaming video to 3 Mb/s.\n\tVideoBitRate3M VideoBitRate = 4\n\n\t// VideoBitRate4M sets the bitrate for streaming video to 4 Mb/s.\n\tVideoBitRate4M VideoBitRate = 5\n)\n\n// FlightData packet returned by the Tello.\n//\n// The meaning of some fields is not documented. If you learned more, please, contribute.\n// See https://github.com/hybridgroup/gobot/issues/798.\ntype FlightData struct {\n\tBatteryLow               bool\n\tBatteryLower             bool\n\tBatteryPercentage        int8 // How much battery left [in %].\n\tCameraState              int8\n\tDroneBatteryLeft         int16\n\tDroneFlyTimeLeft         int16\n\tDroneHover               bool // If the drone is in the air and not moving.\n\tEmOpen                   bool\n\tFlying                   bool  // If the drone is currently in the air.\n\tOnGround                 bool  // If the drone is currently on the ground.\n\tEastSpeed                int16 // Movement speed towards East [in cm/s]. Negative if moving west.\n\tElectricalMachineryState int16\n\tFactoryMode              bool\n\tFlyMode                  int8\n\tFlyTime                  int16 // How long since take off [in s/10].\n\tFrontIn                  bool\n\tFrontLSC                 bool\n\tFrontOut                 bool\n\tGravityState             bool\n\tVerticalSpeed            int16 // Movement speed up [in cm/s].\n\tHeight                   int16 // The height [in decimeters].\n\tImuCalibrationState      int8  // The IMU calibration step (when doing IMU calibration).\n\tNorthSpeed               int16 // Movement speed towards North [in cm/s]. Negative if moving South.\n\tThrowFlyTimer            int8\n\n\t// Warnings:\n\tDownVisualState bool // If the ground is visible by the down camera.\n\tBatteryState    bool // If there is an issue with battery.\n\tImuState        bool // If drone needs IMU (Inertial Measurement Unit) calibration.\n\tOutageRecording bool // If there is an issue with video recording.\n\tPowerState      bool // If there is an issue with power supply.\n\tPressureState   bool // If there is an issue with air pressure.\n\tTemperatureHigh bool // If drone is overheating.\n\tWindState       bool // If the wind is too strong.\n}\n\n// WifiData packet returned by the Tello\ntype WifiData struct {\n\tDisturb  int8\n\tStrength int8\n}\n\n// Driver represents the DJI Tello drone\ntype Driver struct {\n\tgobot.Eventer\n\n\tname              string\n\treqAddr           string\n\tcmdConn           io.WriteCloser // UDP connection to send/receive drone commands\n\tvideoConn         *net.UDPConn   // UDP connection for drone video\n\trespPort          string\n\tvideoPort         string\n\tcmdMutex          sync.Mutex\n\tseq               int16\n\trx, ry, lx, ly    float32\n\tthrottle          int\n\tbouncing          bool\n\tdoneCh            chan struct{}\n\tdoneChReaderCount int32\n}\n\n// NewDriver creates a driver for the Tello drone. Pass in the UDP port to use for the responses\n// from the drone.\nfunc NewDriver(port string) *Driver {\n\treturn NewDriverWithIP(\"192.168.10.1\", port)\n}\n\n// NewDriverWithIP creates a driver for the Tello EDU drone. Pass in the ip address and UDP port to use for\n// the responses from the drone.\nfunc NewDriverWithIP(ip string, port string) *Driver {\n\td := &Driver{\n\t\tname:      gobot.DefaultName(\"Tello\"),\n\t\treqAddr:   ip + \":8889\",\n\t\trespPort:  port,\n\t\tvideoPort: \"11111\",\n\t\tEventer:   gobot.NewEventer(),\n\t\tdoneCh:    make(chan struct{}, 1),\n\t}\n\n\td.AddEvent(ConnectedEvent)\n\td.AddEvent(FlightDataEvent)\n\td.AddEvent(TakeoffEvent)\n\td.AddEvent(LandingEvent)\n\td.AddEvent(PalmLandingEvent)\n\td.AddEvent(BounceEvent)\n\td.AddEvent(FlipEvent)\n\td.AddEvent(TimeEvent)\n\td.AddEvent(LogEvent)\n\td.AddEvent(WifiDataEvent)\n\td.AddEvent(LightStrengthEvent)\n\td.AddEvent(SetExposureEvent)\n\td.AddEvent(VideoFrameEvent)\n\td.AddEvent(SetVideoEncoderRateEvent)\n\n\treturn d\n}\n\n// Name returns the name of the device.\nfunc (d *Driver) Name() string { return d.name }\n\n// SetName sets the name of the device.\nfunc (d *Driver) SetName(n string) { d.name = n }\n\n// Connection returns the Connection of the device.\nfunc (d *Driver) Connection() gobot.Connection { return nil }\n\n// Start starts the driver.\nfunc (d *Driver) Start() error {\n\treqAddr, err := net.ResolveUDPAddr(\"udp\", d.reqAddr)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn err\n\t}\n\trespPort, err := net.ResolveUDPAddr(\"udp\", \":\"+d.respPort)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn err\n\t}\n\tcmdConn, err := net.DialUDP(\"udp\", respPort, reqAddr)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn err\n\t}\n\td.cmdConn = cmdConn\n\n\t// handle responses\n\td.addDoneChReaderCount(1)\n\tgo func() {\n\t\tdefer d.addDoneChReaderCount(-1)\n\n\t\terr := d.On(d.Event(ConnectedEvent), func(interface{}) {\n\t\t\tif err := d.SendDateTime(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tif err := d.processVideo(); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t})\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\tcmdLoop:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-d.doneCh:\n\t\t\t\tbreak cmdLoop\n\t\t\tdefault:\n\t\t\t\terr := d.handleResponse(cmdConn)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"response parse error:\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\t// starts notifications coming from drone to video port normally 11111\n\tif err := d.SendCommand(d.connectionString()); err != nil {\n\t\treturn err\n\t}\n\n\t// send stick commands\n\td.addDoneChReaderCount(1)\n\tgo func() {\n\t\tdefer d.addDoneChReaderCount(-1)\n\n\tstickCmdLoop:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-d.doneCh:\n\t\t\t\tbreak stickCmdLoop\n\t\t\tdefault:\n\t\t\t\tif err := d.SendStickCommand(); err != nil {\n\t\t\t\t\tfmt.Println(\"stick command error:\", err)\n\t\t\t\t}\n\t\t\t\ttime.Sleep(20 * time.Millisecond)\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil\n}\n\n// Halt stops the driver.\nfunc (d *Driver) Halt() error {\n\t// send a landing command when we disconnect, and give it 500ms to be received before we shutdown\n\tif d.cmdConn != nil {\n\t\tif err := d.Land(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\ttime.Sleep(500 * time.Millisecond)\n\n\tif d.cmdConn != nil {\n\t\td.cmdConn.Close()\n\t}\n\n\tif d.videoConn != nil {\n\t\td.videoConn.Close()\n\t}\n\treaderCount := atomic.LoadInt32(&d.doneChReaderCount)\n\tfor i := 0; i < int(readerCount); i++ {\n\t\td.doneCh <- struct{}{}\n\t}\n\n\treturn nil\n}\n\n// TakeOff tells drones to liftoff and start flying.\nfunc (d *Driver) TakeOff() error {\n\tbuf, _ := d.createPacket(takeoffCommand, 0x68, 0)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// Throw & Go support\nfunc (d *Driver) ThrowTakeOff() error {\n\tbuf, _ := d.createPacket(throwtakeoffCommand, 0x48, 0)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// Land tells drone to come in for landing.\nfunc (d *Driver) Land() error {\n\tbuf, _ := d.createPacket(landCommand, 0x68, 1)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(0x00)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// StopLanding tells drone to stop landing.\nfunc (d *Driver) StopLanding() error {\n\tbuf, _ := d.createPacket(landCommand, 0x68, 1)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(0x01)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// PalmLand tells drone to come in for a hand landing.\nfunc (d *Driver) PalmLand() error {\n\tbuf, _ := d.createPacket(palmLandCommand, 0x68, 1)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(0x00)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// StartVideo tells Tello to send start info (SPS/PPS) for video stream.\nfunc (d *Driver) StartVideo() error {\n\tbuf, _ := d.createPacket(videoStartCommand, 0x60, 0)\n\t// seq = 0\n\tif err := binary.Write(buf, binary.LittleEndian, int16(0x00)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// SetExposure sets the drone camera exposure level. Valid levels are 0, 1, and 2.\nfunc (d *Driver) SetExposure(level int) error {\n\tif level < 0 || level > 2 {\n\t\treturn errors.New(\"invalid exposure level\")\n\t}\n\n\tbuf, _ := d.createPacket(exposureCommand, 0x48, 1)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(level)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// SetVideoEncoderRate sets the drone video encoder rate.\nfunc (d *Driver) SetVideoEncoderRate(rate VideoBitRate) error {\n\tbuf, _ := d.createPacket(videoEncoderRateCommand, 0x68, 1)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(rate)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// SetFastMode sets the drone throttle to 1.\nfunc (d *Driver) SetFastMode() error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.throttle = 1\n\treturn nil\n}\n\n// SetSlowMode sets the drone throttle to 0.\nfunc (d *Driver) SetSlowMode() error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.throttle = 0\n\treturn nil\n}\n\n// Rate queries the current video bit rate.\nfunc (d *Driver) Rate() error {\n\tbuf, _ := d.createPacket(videoRateQuery, 0x48, 0)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// bound is a naive implementation that returns the smaller of x or y.\nfunc bound(x, y float32) float32 { //nolint:unparam // keep y as parameter\n\tif x < -y {\n\t\treturn -y\n\t}\n\tif x > y {\n\t\treturn y\n\t}\n\treturn x\n}\n\n// Vector returns the current motion vector.\n// Values are from 0 to 1.\n// x, y, z denote forward, side and vertical translation,\n// and psi  yaw (rotation around the z-axis).\n//\n//nolint:nonamedreturns // sufficient here\nfunc (d *Driver) Vector() (x, y, z, psi float32) {\n\treturn d.ry, d.rx, d.ly, d.lx\n}\n\n// AddVector adds to the current motion vector.\n// Pass values from 0 to 1.\n// See Vector() for the frame of reference.\nfunc (d *Driver) AddVector(x, y, z, psi float32) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ry = bound(d.ry+x, 1)\n\td.rx = bound(d.rx+y, 1)\n\td.ly = bound(d.ly+z, 1)\n\td.lx = bound(d.lx+psi, 1)\n\n\treturn nil\n}\n\n// SetVector sets the current motion vector.\n// Pass values from 0 to 1.\n// See Vector() for the frame of reference.\nfunc (d *Driver) SetVector(x, y, z, psi float32) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ry = x\n\td.rx = y\n\td.ly = z\n\td.lx = psi\n\n\treturn nil\n}\n\n// SetX sets the x component of the current motion vector\n// Pass values from 0 to 1.\n// See Vector() for the frame of reference.\nfunc (d *Driver) SetX(x float32) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ry = x\n\n\treturn nil\n}\n\n// SetY sets the y component of the current motion vector\n// Pass values from 0 to 1.\n// See Vector() for the frame of reference.\nfunc (d *Driver) SetY(y float32) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.rx = y\n\n\treturn nil\n}\n\n// SetZ sets the z component of the current motion vector\n// Pass values from 0 to 1.\n// See Vector() for the frame of reference.\nfunc (d *Driver) SetZ(z float32) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ly = z\n\n\treturn nil\n}\n\n// SetPsi sets the psi component (yaw) of the current motion vector\n// Pass values from 0 to 1.\n// See Vector() for the frame of reference.\nfunc (d *Driver) SetPsi(psi float32) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.lx = psi\n\n\treturn nil\n}\n\n// Up tells the drone to ascend. Pass in an int from 0-100.\nfunc (d *Driver) Up(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ly = float32(val) / 100.0\n\treturn nil\n}\n\n// Down tells the drone to descend. Pass in an int from 0-100.\nfunc (d *Driver) Down(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ly = float32(val) / 100.0 * -1\n\treturn nil\n}\n\n// Forward tells the drone to go forward. Pass in an int from 0-100.\nfunc (d *Driver) Forward(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ry = float32(val) / 100.0\n\treturn nil\n}\n\n// Backward tells drone to go in reverse. Pass in an int from 0-100.\nfunc (d *Driver) Backward(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.ry = float32(val) / 100.0 * -1\n\treturn nil\n}\n\n// Right tells drone to go right. Pass in an int from 0-100.\nfunc (d *Driver) Right(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.rx = float32(val) / 100.0\n\treturn nil\n}\n\n// Left tells drone to go left. Pass in an int from 0-100.\nfunc (d *Driver) Left(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.rx = float32(val) / 100.0 * -1\n\treturn nil\n}\n\n// Clockwise tells drone to rotate in a clockwise direction. Pass in an int from 0-100.\nfunc (d *Driver) Clockwise(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.lx = float32(val) / 100.0\n\treturn nil\n}\n\n// CounterClockwise tells drone to rotate in a counter-clockwise direction.\n// Pass in an int from 0-100.\nfunc (d *Driver) CounterClockwise(val int) error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.lx = float32(val) / 100.0 * -1\n\treturn nil\n}\n\n// Hover tells the drone to stop moving on the X, Y, and Z axes and stay in place\nfunc (d *Driver) Hover() {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.rx = float32(0)\n\td.ry = float32(0)\n\td.lx = float32(0)\n\td.ly = float32(0)\n}\n\n// CeaseRotation stops any rotational motion\nfunc (d *Driver) CeaseRotation() {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\td.lx = float32(0)\n}\n\n// Bounce tells drone to start/stop performing the bouncing action\nfunc (d *Driver) Bounce() error {\n\tbuf, _ := d.createPacket(bounceCommand, 0x68, 1)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\n\tif d.bouncing {\n\t\tif err := binary.Write(buf, binary.LittleEndian, byte(0x31)); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif err := binary.Write(buf, binary.LittleEndian, byte(0x30)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\td.bouncing = !d.bouncing\n\treturn err\n}\n\n// Flip tells drone to flip\nfunc (d *Driver) Flip(direction FlipType) error {\n\tbuf, _ := d.createPacket(flipCommand, 0x70, 1)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(direction)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// FrontFlip tells the drone to perform a front flip.\nfunc (d *Driver) FrontFlip() error {\n\treturn d.Flip(FlipFront)\n}\n\n// BackFlip tells the drone to perform a back flip.\nfunc (d *Driver) BackFlip() error {\n\treturn d.Flip(FlipBack)\n}\n\n// RightFlip tells the drone to perform a flip to the right.\nfunc (d *Driver) RightFlip() error {\n\treturn d.Flip(FlipRight)\n}\n\n// LeftFlip tells the drone to perform a flip to the left.\nfunc (d *Driver) LeftFlip() error {\n\treturn d.Flip(FlipLeft)\n}\n\n// ParseFlightData from drone\nfunc (d *Driver) ParseFlightData(b []byte) (*FlightData, error) {\n\tbuf := bytes.NewReader(b)\n\tfd := &FlightData{}\n\tvar data byte\n\n\tif buf.Len() < 24 {\n\t\terr := errors.New(\"invalid buffer length for flight data packet\")\n\t\tfmt.Println(err)\n\t\treturn fd, err\n\t}\n\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.Height); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.NorthSpeed); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.EastSpeed); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.VerticalSpeed); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.FlyTime); err != nil {\n\t\treturn fd, err\n\t}\n\n\tif err := binary.Read(buf, binary.LittleEndian, &data); err != nil {\n\t\treturn fd, err\n\t}\n\tfd.ImuState = (data >> 0 & 0x1) == 1\n\tfd.PressureState = (data >> 1 & 0x1) == 1\n\tfd.DownVisualState = (data >> 2 & 0x1) == 1\n\tfd.PowerState = (data >> 3 & 0x1) == 1\n\tfd.BatteryState = (data >> 4 & 0x1) == 1\n\tfd.GravityState = (data >> 5 & 0x1) == 1\n\tfd.WindState = (data >> 7 & 0x1) == 1\n\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.ImuCalibrationState); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.BatteryPercentage); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.DroneFlyTimeLeft); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.DroneBatteryLeft); err != nil {\n\t\treturn fd, err\n\t}\n\n\tif err := binary.Read(buf, binary.LittleEndian, &data); err != nil {\n\t\treturn fd, err\n\t}\n\tfd.Flying = (data >> 0 & 0x1) == 1\n\tfd.OnGround = (data >> 1 & 0x1) == 1\n\tfd.EmOpen = (data >> 2 & 0x1) == 1\n\tfd.DroneHover = (data >> 3 & 0x1) == 1\n\tfd.OutageRecording = (data >> 4 & 0x1) == 1\n\tfd.BatteryLow = (data >> 5 & 0x1) == 1\n\tfd.BatteryLower = (data >> 6 & 0x1) == 1\n\tfd.FactoryMode = (data >> 7 & 0x1) == 1\n\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.FlyMode); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.ThrowFlyTimer); err != nil {\n\t\treturn fd, err\n\t}\n\tif err := binary.Read(buf, binary.LittleEndian, &fd.CameraState); err != nil {\n\t\treturn fd, err\n\t}\n\n\tif err := binary.Read(buf, binary.LittleEndian, &data); err != nil {\n\t\treturn fd, err\n\t}\n\tfd.ElectricalMachineryState = int16(data & 0xff)\n\n\tif err := binary.Read(buf, binary.LittleEndian, &data); err != nil {\n\t\treturn fd, err\n\t}\n\tfd.FrontIn = (data >> 0 & 0x1) == 1\n\tfd.FrontOut = (data >> 1 & 0x1) == 1\n\tfd.FrontLSC = (data >> 2 & 0x1) == 1\n\n\tif err := binary.Read(buf, binary.LittleEndian, &data); err != nil {\n\t\treturn fd, err\n\t}\n\tfd.TemperatureHigh = (data >> 0 & 0x1) == 1\n\n\treturn fd, nil\n}\n\n// SendStickCommand sends the joystick command packet to the drone.\nfunc (d *Driver) SendStickCommand() error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\tbuf, _ := d.createPacket(stickCommand, 0x60, 11)\n\t// seq = 0\n\tif err := binary.Write(buf, binary.LittleEndian, int16(0x00)); err != nil {\n\t\treturn err\n\t}\n\n\t// RightX center=1024 left =364 right =-364\n\taxis1 := int16(660.0*d.rx + 1024.0)\n\n\t// RightY down =364 up =-364\n\taxis2 := int16(660.0*d.ry + 1024.0)\n\n\t// LeftY down =364 up =-364\n\taxis3 := int16(660.0*d.ly + 1024.0)\n\n\t// LeftX left =364 right =-364\n\taxis4 := int16(660.0*d.lx + 1024.0)\n\n\t// speed control\n\taxis5 := int16(d.throttle) //nolint:gosec // TODO: fix later\n\n\tpackedAxis := int64(axis1)&0x7FF | int64(axis2&0x7FF)<<11 | 0x7FF&int64(axis3)<<22 | 0x7FF&int64(axis4)<<33 |\n\t\tint64(axis5)<<44\n\tif err := binary.Write(buf, binary.LittleEndian, byte(0xFF&packedAxis)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(packedAxis>>8&0xFF)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(packedAxis>>16&0xFF)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(packedAxis>>24&0xFF)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(packedAxis>>32&0xFF)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(packedAxis>>40&0xFF)); err != nil {\n\t\treturn err\n\t}\n\n\tnow := time.Now()\n\tif err := binary.Write(buf, binary.LittleEndian, byte(now.Hour())); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(now.Minute())); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(now.Second())); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(now.UnixNano()/int64(time.Millisecond)&0xff)); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, byte(now.UnixNano()/int64(time.Millisecond)>>8)); err != nil {\n\t\treturn err\n\t}\n\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\n\treturn err\n}\n\n// SendDateTime sends the current date/time to the drone.\nfunc (d *Driver) SendDateTime() error {\n\td.cmdMutex.Lock()\n\tdefer d.cmdMutex.Unlock()\n\n\tbuf, _ := d.createPacket(timeCommand, 0x50, 11)\n\td.seq++\n\tif err := binary.Write(buf, binary.LittleEndian, d.seq); err != nil {\n\t\treturn err\n\t}\n\n\tnow := time.Now()\n\tif err := binary.Write(buf, binary.LittleEndian, byte(0x00)); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(buf, binary.LittleEndian, int16(now.Hour())); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(buf, binary.LittleEndian, int16(now.Minute())); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(buf, binary.LittleEndian, int16(now.Second())); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(buf, binary.LittleEndian, int16(now.UnixNano()/int64(time.Millisecond)&0xff)); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(buf, binary.LittleEndian, int16(now.UnixNano()/int64(time.Millisecond)>>8)); err != nil {\n\t\treturn err\n\t}\n\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC16(buf.Bytes())); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := d.cmdConn.Write(buf.Bytes())\n\treturn err\n}\n\n// SendCommand is used to send a text command such as the initial connection request to the drone.\nfunc (d *Driver) SendCommand(cmd string) error {\n\t_, err := d.cmdConn.Write([]byte(cmd))\n\treturn err\n}\n\nfunc (d *Driver) handleResponse(r io.Reader) error {\n\tvar buf [2048]byte\n\tvar msgType uint16\n\tn, err := r.Read(buf[0:])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// parse binary packet\n\tif buf[0] == messageStart {\n\t\tmsgType = (uint16(buf[6]) << 8) | uint16(buf[5])\n\t\tswitch msgType {\n\t\tcase wifiMessage:\n\t\t\twd := &WifiData{\n\t\t\t\tStrength: int8(buf[9:10][0]),\n\t\t\t\tDisturb:  int8(buf[10:11][0]),\n\t\t\t}\n\t\t\td.Publish(d.Event(WifiDataEvent), wd)\n\t\tcase lightMessage:\n\t\t\td.Publish(d.Event(LightStrengthEvent), int8(buf[9:10][0]))\n\t\tcase logMessage:\n\t\t\td.Publish(d.Event(LogEvent), buf[9:])\n\t\tcase timeCommand:\n\t\t\td.Publish(d.Event(TimeEvent), buf[7:8])\n\t\tcase bounceCommand:\n\t\t\td.Publish(d.Event(BounceEvent), buf[7:8])\n\t\tcase takeoffCommand:\n\t\t\td.Publish(d.Event(TakeoffEvent), buf[7:8])\n\t\tcase landCommand:\n\t\t\td.Publish(d.Event(LandingEvent), buf[7:8])\n\t\tcase palmLandCommand:\n\t\t\td.Publish(d.Event(PalmLandingEvent), buf[7:8])\n\t\tcase flipCommand:\n\t\t\td.Publish(d.Event(FlipEvent), buf[7:8])\n\t\tcase flightMessage:\n\t\t\tfd, _ := d.ParseFlightData(buf[9:])\n\t\t\td.Publish(d.Event(FlightDataEvent), fd)\n\t\tcase exposureCommand:\n\t\t\td.Publish(d.Event(SetExposureEvent), buf[7:8])\n\t\tcase videoEncoderRateCommand:\n\t\t\td.Publish(d.Event(SetVideoEncoderRateEvent), buf[7:8])\n\t\tdefault:\n\t\t\tfmt.Printf(\"Unknown message: %+v\\n\", buf[0:n])\n\t\t}\n\t\treturn nil\n\t}\n\n\t// parse text packet\n\tif buf[0] == 0x63 && buf[1] == 0x6f && buf[2] == 0x6e {\n\t\td.Publish(d.Event(ConnectedEvent), nil)\n\t}\n\n\treturn nil\n}\n\nfunc (d *Driver) processVideo() error {\n\tvideoPort, err := net.ResolveUDPAddr(\"udp\", \":11111\")\n\tif err != nil {\n\t\treturn err\n\t}\n\td.videoConn, err = net.ListenUDP(\"udp\", videoPort)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\td.addDoneChReaderCount(1)\n\tgo func() {\n\t\tdefer d.addDoneChReaderCount(-1)\n\n\tvideoConnLoop:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-d.doneCh:\n\t\t\t\tbreak videoConnLoop\n\t\t\tdefault:\n\t\t\t\tbuf := make([]byte, 2048)\n\t\t\t\tn, _, err := d.videoConn.ReadFromUDP(buf)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(\"Error: \", err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\td.Publish(d.Event(VideoFrameEvent), buf[2:n])\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil\n}\n\nfunc (d *Driver) createPacket(cmd int16, pktType byte, pktLen int16) (*bytes.Buffer, error) {\n\tl := pktLen + 11\n\tbuf := &bytes.Buffer{}\n\n\tif err := binary.Write(buf, binary.LittleEndian, byte(messageStart)); err != nil {\n\t\treturn buf, err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, l<<3); err != nil {\n\t\treturn buf, err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, CalculateCRC8(buf.Bytes()[0:3])); err != nil {\n\t\treturn buf, err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, pktType); err != nil {\n\t\treturn buf, err\n\t}\n\tif err := binary.Write(buf, binary.LittleEndian, cmd); err != nil {\n\t\treturn buf, err\n\t}\n\n\treturn buf, nil\n}\n\nfunc (d *Driver) connectionString() string {\n\tx, _ := strconv.Atoi(d.videoPort)\n\tb := [2]byte{}\n\tbinary.LittleEndian.PutUint16(b[:], uint16(x)) //nolint:gosec // TODO: fix later\n\tres := fmt.Sprintf(\"conn_req:%s\", b)\n\treturn res\n}\n\nfunc (d *Driver) addDoneChReaderCount(delta int32) {\n\tatomic.AddInt32(&d.doneChReaderCount, delta)\n}\n\nfunc (f *FlightData) AirSpeed() float64 {\n\treturn math.Sqrt(\n\t\tmath.Pow(float64(f.NorthSpeed), 2) +\n\t\t\tmath.Pow(float64(f.EastSpeed), 2) +\n\t\t\tmath.Pow(float64(f.VerticalSpeed), 2))\n}\n\nfunc (f *FlightData) GroundSpeed() float64 {\n\treturn math.Sqrt(\n\t\tmath.Pow(float64(f.NorthSpeed), 2) +\n\t\t\tmath.Pow(float64(f.EastSpeed), 2))\n}\n"
  },
  {
    "path": "platforms/dji/tello/driver_test.go",
    "content": "package tello\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\ntype WriteCloserDoNothing struct{}\n\nfunc (w *WriteCloserDoNothing) Write(p []byte) (int, error) {\n\treturn 0, nil\n}\n\nfunc (w *WriteCloserDoNothing) Close() error {\n\treturn nil\n}\n\nfunc TestNewDriver(t *testing.T) {\n\td := NewDriver(\"8888\")\n\n\tassert.Equal(t, \"8888\", d.respPort)\n}\n\nfunc Test_handleResponse(t *testing.T) {\n\ttests := map[string]struct {\n\t\tmsg       []byte\n\t\twantEvent string\n\t\twantData  (interface{})\n\t\terr       error\n\t}{\n\t\t\"[empty message]\": {\n\t\t\tmsg: nil,\n\t\t\terr: io.EOF,\n\t\t},\n\t\t\"wifiMessage\": {\n\t\t\tmsg:       statusMessage(wifiMessage, 0x07, 0x08, 0xA3, 0x0A),\n\t\t\twantEvent: WifiDataEvent,\n\t\t\twantData:  &WifiData{Strength: -93, Disturb: 10},\n\t\t},\n\t\t\"lightMessage\": {\n\t\t\tmsg:       statusMessage(lightMessage, 0x17, 0x18, 0xFF),\n\t\t\twantEvent: LightStrengthEvent,\n\t\t\twantData:  int8(-1),\n\t\t},\n\t\t\"logMessage\": {\n\t\t\tmsg:       statusMessage(logMessage),\n\t\t\twantEvent: LogEvent,\n\t\t\twantData:  make([]byte, 2048-9),\n\t\t},\n\t\t\"timeCommand\": {\n\t\t\tmsg:       statusMessage(timeCommand, 0x27),\n\t\t\twantEvent: TimeEvent,\n\t\t\twantData:  []uint8{0x27},\n\t\t},\n\t\t\"bounceCommand\": {\n\t\t\tmsg:       statusMessage(bounceCommand, 0x37),\n\t\t\twantEvent: BounceEvent,\n\t\t\twantData:  []uint8{0x37},\n\t\t},\n\t\t\"takeoffCommand\": {\n\t\t\tmsg:       statusMessage(takeoffCommand, 0x47),\n\t\t\twantEvent: TakeoffEvent,\n\t\t\twantData:  []uint8{0x47},\n\t\t},\n\t\t\"landCommand\": {\n\t\t\tmsg:       statusMessage(landCommand, 0x57),\n\t\t\twantEvent: LandingEvent,\n\t\t\twantData:  []uint8{0x57},\n\t\t},\n\t\t\"palmLandCommand\": {\n\t\t\tmsg:       statusMessage(palmLandCommand, 0x67),\n\t\t\twantEvent: PalmLandingEvent,\n\t\t\twantData:  []uint8{0x67},\n\t\t},\n\t\t\"flipCommand\": {\n\t\t\tmsg:       statusMessage(flipCommand, 0x77),\n\t\t\twantEvent: FlipEvent,\n\t\t\twantData:  []uint8{0x77},\n\t\t},\n\t\t\"flightMessage\": {\n\t\t\tmsg:       statusMessage(flightMessage, 0x87, 0x88, 0x60, 0xA4),\n\t\t\twantEvent: FlightDataEvent,\n\t\t\twantData:  &FlightData{Height: -23456},\n\t\t},\n\t\t\"exposureCommand\": {\n\t\t\tmsg:       statusMessage(exposureCommand, 0x97),\n\t\t\twantEvent: SetExposureEvent,\n\t\t\twantData:  []uint8{0x97},\n\t\t},\n\t\t\"videoEncoderRateCommand\": {\n\t\t\tmsg:       statusMessage(videoEncoderRateCommand, 0xa7),\n\t\t\twantEvent: SetVideoEncoderRateEvent,\n\t\t\twantData:  []uint8{0xA7},\n\t\t},\n\t\t\"ConnectedEvent\": {\n\t\t\tmsg:       []byte{0x63, 0x6f, 0x6e},\n\t\t\twantEvent: ConnectedEvent,\n\t\t\twantData:  nil,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\td := NewDriver(\"8888\")\n\t\t\tevents := d.Subscribe()\n\t\t\terr := d.handleResponse(bytes.NewReader(tc.msg))\n\t\t\trequire.ErrorIs(t, tc.err, err)\n\t\t\tif tc.wantEvent != \"\" {\n\t\t\t\tselect {\n\t\t\t\tcase ev, ok := <-events:\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\tt.Error(\"subscription channel is closed\")\n\t\t\t\t\t}\n\t\t\t\t\trequire.Equal(t, tc.wantEvent, ev.Name)\n\t\t\t\t\tgot := fmt.Sprintf(\"%T %+[1]v\", ev.Data)\n\t\t\t\t\twant := fmt.Sprintf(\"%T %+[1]v\", tc.wantData)\n\t\t\t\t\trequire.Equal(t, want, got)\n\t\t\t\tcase <-time.After(5 * time.Millisecond):\n\t\t\t\t\tt.Error(\"subscription channel seems empty\")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHaltShouldTerminateAllTheRelatedGoroutines(t *testing.T) {\n\td := NewDriver(\"8888\")\n\td.cmdConn = &WriteCloserDoNothing{}\n\n\tvar wg sync.WaitGroup\n\twg.Add(3)\n\n\td.addDoneChReaderCount(1)\n\tgo func() {\n\t\t<-d.doneCh\n\t\td.addDoneChReaderCount(-1)\n\t\twg.Done()\n\t\tfmt.Println(\"Done routine 1.\")\n\t}()\n\n\td.addDoneChReaderCount(1)\n\tgo func() {\n\t\t<-d.doneCh\n\t\td.addDoneChReaderCount(-1)\n\t\twg.Done()\n\t\tfmt.Println(\"Done routine 2.\")\n\t}()\n\n\td.addDoneChReaderCount(1)\n\tgo func() {\n\t\t<-d.doneCh\n\t\td.addDoneChReaderCount(-1)\n\t\twg.Done()\n\t\tfmt.Println(\"Done routine 3.\")\n\t}()\n\n\t_ = d.Halt()\n\twg.Wait()\n\n\tassert.Equal(t, int32(0), d.doneChReaderCount)\n}\n\nfunc TestHaltNotWaitForeverWhenCalledMultipleTimes(t *testing.T) {\n\td := NewDriver(\"8888\")\n\td.cmdConn = &WriteCloserDoNothing{}\n\n\t_ = d.Halt()\n\t_ = d.Halt()\n\t_ = d.Halt()\n}\n\nfunc statusMessage(msgType uint16, msgAfter7 ...byte) []byte {\n\tmsg := make([]byte, 7, len(msgAfter7)+7)\n\tmsg[0] = messageStart\n\tbinary.LittleEndian.PutUint16(msg[5:7], msgType)\n\tmsg = append(msg, msgAfter7...)\n\treturn msg\n}\n"
  },
  {
    "path": "platforms/dji/tello/pitch.go",
    "content": "package tello\n\nimport \"math\"\n\n// ValidatePitch helps validate pitch values such as those created by\n// a joystick to values between 0-100 that are required as\n// params to Tello stick commands.\nfunc ValidatePitch(data float64, offset float64) int {\n\tvalue := math.Abs(data) / offset\n\tif value >= 0.1 {\n\t\tif value <= 1.0 {\n\t\t\treturn int((float64(int(value*100)) / 100) * 100)\n\t\t}\n\t\treturn 100\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "platforms/dji/tello/pitch_test.go",
    "content": "package tello\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestMinidroneValidatePitchWhenEqualOffset(t *testing.T) {\n\tassert.Equal(t, 100, ValidatePitch(32767.0, 32767.0))\n}\n\nfunc TestMinidroneValidatePitchWhenTiny(t *testing.T) {\n\tassert.Equal(t, 0, ValidatePitch(1.1, 32767.0))\n}\n\nfunc TestMinidroneValidatePitchWhenCentered(t *testing.T) {\n\tassert.Equal(t, 50, ValidatePitch(16383.5, 32767.0))\n}\n"
  },
  {
    "path": "platforms/dragonboard/LICENSE",
    "content": "Copyright (c) 2015-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/dragonboard/README.md",
    "content": "# DragonBoard™ 410c\n\nThe [DragonBoard 410c](http://www.96boards.org/product/dragonboard410c/), a product of Arrow Electronics, is the development\nboard based on the mid-tier Qualcomm® Snapdragon™ 410E processor. It features advanced processing power, Wi-Fi, Bluetooth\nconnectivity, and GPS, all packed into a board the size of a credit card.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nMake sure you are using the latest Linaro Debian image. Both AArch32 and AArch64 work™ though you should stick to 64bit\nas OS internals may be different and aren't tested.\n\nYou would normally install Go and Gobot on your workstation. Once installed, cross compile your program on your workstation,\ntransfer the final executable to your DragonBoard and run the program on the DragonBoard itself as documented here.\n\n## How to Use\n\nPlease refer to one example for your platform, e.g. [dragonboard_button.go](https://github.com/hybridgroup/gobot/blob/release/examples/dragonboard_button.go).\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself. See [here](https://www.96boards.org/db410c-getting-started/HardwareDocs/HWUserManual.md/).\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=arm64 GOOS=linux go build examples/dragonboard_button.go\n```\n\nOnce you have compiled your code, you can you can upload your program and execute it on the DragonBoard from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp dragonboard_button root@192.168.1.xx:\nssh -t root@192.168.1.xx \"./dragonboard_button\"\n```\n"
  },
  {
    "path": "platforms/dragonboard/doc.go",
    "content": "/*\nPackage dragonboard contains the Gobot adaptor for the DragonBoard 410c\n\nFor further information refer to the chip README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/dragonboard/README.md\n*/\npackage dragonboard // import \"gobot.io/x/gobot/v2/platforms/dragonboard\"\n"
  },
  {
    "path": "platforms/dragonboard/dragonboard_adaptor.go",
    "content": "package dragonboard\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 0\n\n\tdefaultSpiMaxSpeed = 5000 // 5kHz (more than 15kHz not possible with SPI over GPIO)\n)\n\n// Adaptor represents a Gobot Adaptor for a DragonBoard 410c\ntype Adaptor struct {\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor // for usage of \"adaptors.WithSpiGpioAccess()\"\n\n\tname   string\n\tsys    *system.Accesser // used for unit tests only\n\tmutex  sync.Mutex\n\tpinMap map[string]int\n}\n\n// Valid pins are the GPIO_A through GPIO_L pins from the\n// extender (pins 23-34 on header J8), as well as the SoC pins\n// aka all the other pins, APQ GPIO_0-GPIO_122 and PM_MPP_0-4.\nvar fixedPins = map[string]int{\n\t\"GPIO_A\": 36,\n\t\"GPIO_B\": 12,\n\t\"GPIO_C\": 13,\n\t\"GPIO_D\": 69,\n\t\"GPIO_E\": 115,\n\t\"GPIO_F\": 507,\n\t\"GPIO_G\": 24,\n\t\"GPIO_H\": 25,\n\t\"GPIO_I\": 35,\n\t\"GPIO_J\": 34,\n\t\"GPIO_K\": 28,\n\t\"GPIO_L\": 33,\n\n\t\"LED_1\": 21,\n\t\"LED_2\": 120,\n}\n\n// NewAdaptor creates a DragonBoard 410c Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of sysfs\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\n// Further optional parameters for:\n//\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\ta := &Adaptor{\n\t\tname: gobot.DefaultName(\"DragonBoard\"),\n\t\tsys:  sys,\n\t}\n\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\t// Valid bus numbers are [0,1] which corresponds to /dev/i2c-0 through /dev/i2c-1.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.translateDigitalPin, digitalPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\n\t// SPI is only supported when \"adaptors.WithSpiGpioAccess()\" is given\n\tif len(spiBusOpts) > 0 {\n\t\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, func(int) error { return nil }, 0, 0, 0, 0, defaultSpiMaxSpeed,\n\t\t\ta.DigitalPinsAdaptor, spiBusOpts...)\n\t}\n\n\ta.pinMap = fixedPins\n\tfor i := 0; i < 122; i++ {\n\t\tpin := fmt.Sprintf(\"GPIO_%d\", i)\n\t\ta.pinMap[pin] = i\n\t}\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board and pins\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n\nfunc (a *Adaptor) translateDigitalPin(id string) (string, int, error) {\n\tif line, ok := a.pinMap[id]; ok {\n\t\treturn \"\", line, nil\n\t}\n\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a digital pin\", id)\n}\n"
  },
  {
    "path": "platforms/dragonboard/dragonboard_adaptor_test.go",
    "content": "package dragonboard\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc initConnectedTestAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"DragonBoard\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.pinMap)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.Nil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithSpiGpioAccess(\"1\", \"2\", \"3\", \"4\"))\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"DragonBoard\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.pinMap)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\ta := initConnectedTestAdaptor()\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio36/value\",\n\t\t\"/sys/class/gpio/gpio36/direction\",\n\t\t\"/sys/class/gpio/gpio12/value\",\n\t\t\"/sys/class/gpio/gpio12/direction\",\n\t}\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\n\t_ = a.DigitalWrite(\"GPIO_B\", 1)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio12/value\"].Contents)\n\n\tfs.Files[\"/sys/class/gpio/gpio36/value\"].Contents = \"1\"\n\ti, _ := a.DigitalRead(\"GPIO_A\")\n\tassert.Equal(t, 1, i)\n\n\trequire.ErrorContains(t, a.DigitalWrite(\"GPIO_M\", 1), \"'GPIO_M' is not a valid id for a digital pin\")\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\ta := initConnectedTestAdaptor()\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio36/value\",\n\t\t\"/sys/class/gpio/gpio36/direction\",\n\t\t\"/sys/class/gpio/gpio12/value\",\n\t\t\"/sys/class/gpio/gpio12/direction\",\n\t}\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\n\trequire.NoError(t, a.DigitalWrite(\"GPIO_B\", 1))\n\n\tfs.WithWriteError = true\n\n\terr := a.Finalize()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := initConnectedTestAdaptor()\n\tassert.Equal(t, 0, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-1\"})\n\tcon, err := a.GetI2cConnection(0xff, 1)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/firmata/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/firmata/README.md",
    "content": "# Firmata\n\nArduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's\nintended for artists, designers, hobbyists and anyone interested in creating interactive objects or environments.\n\nThis package provides the adaptor for microcontrollers such as Arduino that support the [Firmata](https://github.com/firmata/protocol)\nprotocol.\n\nYou can connect to the microcontroller using either a serial connection, or a TCP connection to a WiFi-connected\nmicrocontroller such as the ESP8266.\n\nFor more info about the Arduino platform, go to [http://arduino.cc/](http://arduino.cc/).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nYou must install Firmata on your microcontroller before you can connect to it using Gobot. You can do this in many cases\nusing Gort ([http://gort.io](http://gort.io)).\n\nIn order to use a TCP connection with a WiFi-enbaled microcontroller, you must install WifiFirmata on the microcontroller.\nYou can use the Arduino IDE to do this.\n\n## How to Use\n\nWith a serial connection:\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n  firmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n  led := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"bot\",\n    []gobot.Connection{firmataAdaptor},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nWith a TCP connection, use the `NewTCPAdaptor`:\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nfunc main() {\n  firmataAdaptor := firmata.NewTCPAdaptor(\"192.168.0.66:3030\")\n  led := gpio.NewLedDriver(firmataAdaptor, \"2\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"bot\",\n    []gobot.Connection{firmataAdaptor},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n**Important** note that analog pins A4 and A5 are normally used by the Firmata I2C interface, so you will not be able to\nuse them as analog inputs without changing the Firmata sketch.\n\n## How to Connect\n\n### Upload the Firmata Firmware to the Arduino\n\nThis section assumes you're using an Arduino Uno or another compatible board. If you already have the Firmata sketch installed,\nyou can skip straight to the examples.\n\n### OS X\n\nFirst plug the Arduino into your computer via the USB/serial port.\nA dialog box will appear telling you that a new network interface has been detected.\nClick \"Network Preferences...\", and when it opens, simply click \"Apply\".\n\nOnce plugged in, use [Gort](http://gort.io)'s `gort scan serial` command to find out your connection info and serial port\naddress:\n\n```sh\ngort scan serial\n```\n\nUse the `gort arduino install` command to install `avrdude`, this will allow you to upload firmata to the arduino:\n\n```sh\ngort arduino install\n```\n\nOnce the avrdude uploader is installed we upload the firmata protocol to the arduino, use the arduino serial port address\nfound when you ran `gort scan serial`:\n\n```sh\ngort arduino upload firmata /dev/tty.usbmodem1421\n```\n\nNow you are ready to connect and communicate with the Arduino using serial port connection\n\nNote that Gobot works best with the `tty.` version of the serial port as shown above, not the `cu.` version.\n\n### Ubuntu\n\nFirst plug the Arduino into your computer via the USB/serial port.\n\nOnce plugged in, use [Gort](http://gort.io)'s `gort scan serial` command to find out your connection info and serial port\naddress:\n\n```sh\ngort scan serial\n```\n\nUse the `gort arduino install` command to install `avrdude`, this will allow you to upload firmata to the arduino:\n\n```sh\ngort arduino install\n```\n\nOnce the avrdude uploader is installed we upload the firmata protocol to the arduino, use the arduino serial port address\nfound when you ran `gort scan serial`, or leave it blank to use the default address `ttyACM0`:\n\n```sh\ngort arduino upload firmata /dev/ttyACM0\n```\n\nNow you are ready to connect and communicate with the Arduino using serial port connection\n\n### Windows\n\nFirst download and install gort for your OS from the [gort.io](gort.io) [downloads page](http://gort.io/documentation/getting_started/downloads/)\nand install it.\n\nOpen a command prompt window by right clicking on the start button and choose `Command Prompt (Admin)` (on windows 8.1).\nThen navigate to the folder where you uncompressed gort (uncomress to a folder first if you haven't done this yet).\n\nOnce inside the gort folder, first install avrdude which we'll use to upload firmata to the arduino.\n\n```cmd\ngort arduino install\n```\n\nWhen the installation is complete, close the command prompt window and open a new one. We need to do this for the env variables\nto reload.\n\n```cmd\ngort scan serial\n```\n\nTake note of your arduinos serialport address (COM1 | COM2 | COM3| etc). You need to already have installed the arduino\ndrivers from [arduino.cc/en/Main/Software](https://www.arduino.cc/en/Main/Software). Finally upload the firmata protocol\nsketch to the arduino.\n\n```cmd\ngort arduino upload firmata <COMX>\n```\n\nMake sure to substitute `<COMX>` with the apropiate serialport address.\n\nNow you are ready to connect and communicate with the Arduino using serial port connection.\n\n### Using arduino IDE\n\nOpen arduino IDE and go to File > Examples > Firmata > StandardFirmata and open it. Select the appriate port\nfor your arduino and click upload. Wait for the upload to finish and you should be ready to start using Gobot\nwith your arduino.\n\n## Hardware Support\n\nThe following Firmata devices have been tested and are known to work:\n\n- [Arduino Uno R3](http://arduino.cc/en/Main/arduinoBoardUno)\n- [Arduino/Genuino 101](https://www.arduino.cc/en/Main/ArduinoBoard101)\n- [Teensy 3.0](http://www.pjrc.com/store/teensy3.html)\n\nThe following WiFi devices have been tested and are known to work:\n\n- [NodeMCU 1.0](http://nodemcu.com/index_en.html)\n\nMore devices are coming soon...\n"
  },
  {
    "path": "platforms/firmata/ble_firmata_adaptor.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage firmata\n\nimport (\n\t\"io\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/ble\"\n\t\"gobot.io/x/gobot/v2/platforms/bleclient\"\n)\n\nconst (\n\t// ReceiveID is the BLE characteristic ID for receiving serial data\n\tReceiveID = \"6e400003b5a3f393e0a9e50e24dcca9e\"\n\n\t// TransmitID is the BLE characteristic ID for transmitting serial data\n\tTransmitID = \"6e400002b5a3f393e0a9e50e24dcca9e\"\n)\n\n// BLEAdaptor represents a Bluetooth LE based connection to a\n// microcontroller running FirmataBLE\ntype BLEAdaptor struct {\n\t*Adaptor\n}\n\n// NewBLEAdaptor opens and uses a BLE connection to a\n// microcontroller running FirmataBLE\nfunc NewBLEAdaptor(args ...interface{}) *BLEAdaptor {\n\taddress := args[0].(string) //nolint:forcetypeassert // ok here\n\trid := ReceiveID\n\twid := TransmitID\n\n\t//nolint:forcetypeassert // ok here\n\tif len(args) >= 3 {\n\t\trid = args[1].(string)\n\t\twid = args[2].(string)\n\t}\n\n\ta := NewAdaptor(address)\n\ta.SetName(gobot.DefaultName(\"BLEFirmata\"))\n\ta.PortOpener = func(port string) (io.ReadWriteCloser, error) {\n\t\ta := bleclient.NewAdaptor(address)\n\t\tsp := ble.NewSerialPortDriver(a, rid, wid)\n\t\tif err := sp.Open(); err != nil {\n\t\t\treturn sp, err\n\t\t}\n\t\treturn sp, nil\n\t}\n\n\treturn &BLEAdaptor{\n\t\tAdaptor: a,\n\t}\n}\n"
  },
  {
    "path": "platforms/firmata/ble_firmata_adaptor_test.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage firmata\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*BLEAdaptor)(nil)\n\nfunc initTestBLEAdaptor() *BLEAdaptor {\n\ta := NewBLEAdaptor(\"DEVICE\", \"123\", \"456\")\n\treturn a\n}\n\nfunc TestFirmataBLEAdaptor(t *testing.T) {\n\ta := initTestBLEAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"BLEFirmata\"))\n}\n"
  },
  {
    "path": "platforms/firmata/client/client.go",
    "content": "// Package client provies a client for interacting with microcontrollers\n// using the Firmata protocol https://github.com/firmata/protocol.\npackage client // import \"gobot.io/x/gobot/v2/platforms/firmata/client\"\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Pin Modes\nconst (\n\tInput  = 0x00\n\tOutput = 0x01\n\tAnalog = 0x02\n\tPwm    = 0x03\n\tServo  = 0x04\n)\n\n// Sysex Codes\nconst (\n\tProtocolVersion          byte = 0xF9\n\tSystemReset              byte = 0xFF\n\tDigitalMessage           byte = 0x90\n\tDigitalMessageRangeStart byte = 0x90\n\tDigitalMessageRangeEnd   byte = 0x9F\n\tAnalogMessage            byte = 0xE0\n\tAnalogMessageRangeStart  byte = 0xE0\n\tAnalogMessageRangeEnd    byte = 0xEF\n\tReportAnalog             byte = 0xC0\n\tReportDigital            byte = 0xD0\n\tPinMode                  byte = 0xF4\n\tStartSysex               byte = 0xF0\n\tEndSysex                 byte = 0xF7\n\tCapabilityQuery          byte = 0x6B\n\tCapabilityResponse       byte = 0x6C\n\tPinStateQuery            byte = 0x6D\n\tPinStateResponse         byte = 0x6E\n\tAnalogMappingQuery       byte = 0x69\n\tAnalogMappingResponse    byte = 0x6A\n\tStringData               byte = 0x71\n\tI2CRequest               byte = 0x76\n\tI2CReply                 byte = 0x77\n\tI2CConfig                byte = 0x78\n\tFirmwareQuery            byte = 0x79\n\tI2CModeWrite             byte = 0x00\n\tI2CModeRead              byte = 0x01\n\tI2CModeContinuousRead    byte = 0x02\n\tI2CModeStopReading       byte = 0x03\n\tServoConfig              byte = 0x70\n)\n\n// Errors\nvar (\n\tErrConnected = errors.New(\"client is already connected\")\n)\n\n// Client represents a client connection to a firmata board\ntype Client struct {\n\tgobot.Eventer\n\n\tpins            []Pin\n\tFirmwareName    string\n\tProtocolVersion string\n\tconnecting      atomic.Value\n\tconnected       atomic.Value\n\tconnection      io.ReadWriteCloser\n\tanalogPins      []int\n\tConnectTimeout  time.Duration\n}\n\n// Pin represents a pin on the firmata board\ntype Pin struct {\n\tSupportedModes []int\n\tMode           int\n\tValue          int\n\tState          int\n\tAnalogChannel  int\n}\n\n// I2cReply represents the response from an I2cReply message\ntype I2cReply struct {\n\tAddress  int\n\tRegister int\n\tData     []byte\n}\n\n// New returns a new Client\nfunc New() *Client {\n\tc := &Client{\n\t\tProtocolVersion: \"\",\n\t\tFirmwareName:    \"\",\n\t\tconnection:      nil,\n\t\tConnectTimeout:  15 * time.Second,\n\t\tpins:            []Pin{},\n\t\tanalogPins:      []int{},\n\t\tEventer:         gobot.NewEventer(),\n\t}\n\n\tc.connecting.Store(false)\n\tc.connected.Store(false)\n\n\tfor _, s := range []string{\n\t\t\"FirmwareQuery\",\n\t\t\"CapabilityQuery\",\n\t\t\"AnalogMappingQuery\",\n\t\t\"ProtocolVersion\",\n\t\t\"I2cReply\",\n\t\t\"StringData\",\n\t\t\"Error\",\n\t} {\n\t\tc.AddEvent(s)\n\t}\n\n\treturn c\n}\n\nfunc (b *Client) setConnecting(c bool) {\n\tb.connecting.Store(c)\n}\n\nfunc (b *Client) setConnected(c bool) {\n\tb.connected.Store(c)\n}\n\n// Disconnect disconnects the Client\nfunc (b *Client) Disconnect() error {\n\tb.setConnected(false)\n\treturn b.connection.Close()\n}\n\n// Connecting returns true when the client is connecting\nfunc (b *Client) Connecting() bool {\n\t//nolint:forcetypeassert // ok here\n\treturn b.connecting.Load().(bool)\n}\n\n// Connected returns the current connection state of the Client\nfunc (b *Client) Connected() bool {\n\t//nolint:forcetypeassert // ok here\n\treturn b.connected.Load().(bool)\n}\n\n// Pins returns all available pins\nfunc (b *Client) Pins() []Pin {\n\treturn b.pins\n}\n\n// Connect connects to the Client given conn. It first resets the firmata board\n// then continuously polls the firmata board for new information when it's\n// available.\nfunc (b *Client) Connect(conn io.ReadWriteCloser) error {\n\tif b.Connected() {\n\t\treturn ErrConnected\n\t}\n\n\tb.connection = conn\n\tif err := b.Reset(); err != nil {\n\t\treturn err\n\t}\n\tconnected := make(chan bool, 1)\n\tconnectError := make(chan error, 1)\n\n\tif err := b.Once(b.Event(\"ProtocolVersion\"), func(data interface{}) {\n\t\te := b.FirmwareQuery()\n\t\tif e != nil {\n\t\t\tb.setConnecting(false)\n\t\t\tconnectError <- e\n\t\t}\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err := b.Once(b.Event(\"FirmwareQuery\"), func(data interface{}) {\n\t\te := b.CapabilitiesQuery()\n\t\tif e != nil {\n\t\t\tb.setConnecting(false)\n\t\t\tconnectError <- e\n\t\t}\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err := b.Once(b.Event(\"CapabilityQuery\"), func(data interface{}) {\n\t\te := b.AnalogMappingQuery()\n\t\tif e != nil {\n\t\t\tb.setConnecting(false)\n\t\t\tconnectError <- e\n\t\t}\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\tif err := b.Once(b.Event(\"AnalogMappingQuery\"), func(data interface{}) {\n\t\tif err := b.ReportDigital(0, 1); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tif err := b.ReportDigital(1, 1); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tb.setConnecting(false)\n\t\tb.setConnected(true)\n\t\tconnected <- true\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\t// start it off...\n\tb.setConnecting(true)\n\tif err := b.ProtocolVersionQuery(); err != nil {\n\t\treturn err\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\tif !b.Connecting() {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif e := b.process(); e != nil {\n\t\t\t\tconnectError <- e\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t}\n\t}()\n\n\tselect {\n\tcase <-connected:\n\tcase e := <-connectError:\n\t\treturn e\n\tcase <-time.After(b.ConnectTimeout):\n\t\treturn errors.New(\"unable to connect. Perhaps you need to flash your Arduino with Firmata?\")\n\t}\n\n\tgo func() {\n\t\tfor b.Connected() {\n\t\t\tif err := b.process(); err != nil {\n\t\t\t\tb.Publish(b.Event(\"Error\"), err)\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil\n}\n\n// Reset sends the SystemReset sysex code.\nfunc (b *Client) Reset() error {\n\treturn b.write([]byte{SystemReset})\n}\n\n// SetPinMode sets the pin to mode.\nfunc (b *Client) SetPinMode(pin int, mode int) error {\n\tb.pins[byte(pin)].Mode = mode\n\treturn b.write([]byte{PinMode, byte(pin), byte(mode)})\n}\n\n// DigitalWrite writes value to pin.\nfunc (b *Client) DigitalWrite(pin int, value int) error {\n\tport := byte(math.Floor(float64(pin) / 8))\n\tportValue := byte(0)\n\n\tb.pins[pin].Value = value\n\n\tfor i := byte(0); i < 8; i++ {\n\t\tif b.pins[8*port+i].Value != 0 {\n\t\t\tportValue = portValue | (1 << i)\n\t\t}\n\t}\n\treturn b.write([]byte{DigitalMessage | port, portValue & 0x7F, (portValue >> 7) & 0x7F})\n}\n\n// ServoConfig sets the min and max pulse width for servo PWM range\nfunc (b *Client) ServoConfig(pin int, maximum int, minimum int) error {\n\tret := []byte{\n\t\tServoConfig,\n\t\tbyte(pin),\n\t\tbyte(minimum & 0x7F),\n\t\tbyte((minimum >> 7) & 0x7F),\n\t\tbyte(maximum & 0x7F),\n\t\tbyte((maximum >> 7) & 0x7F),\n\t}\n\treturn b.WriteSysex(ret)\n}\n\n// AnalogWrite writes value to pin.\nfunc (b *Client) AnalogWrite(pin int, value int) error {\n\tb.pins[pin].Value = value\n\treturn b.write([]byte{AnalogMessage | byte(pin), byte(value & 0x7F), byte((value >> 7) & 0x7F)})\n}\n\n// FirmwareQuery sends the FirmwareQuery sysex code.\nfunc (b *Client) FirmwareQuery() error {\n\treturn b.WriteSysex([]byte{FirmwareQuery})\n}\n\n// PinStateQuery sends a PinStateQuery for pin.\nfunc (b *Client) PinStateQuery(pin int) error {\n\treturn b.WriteSysex([]byte{PinStateQuery, byte(pin)})\n}\n\n// ProtocolVersionQuery sends the ProtocolVersion sysex code.\nfunc (b *Client) ProtocolVersionQuery() error {\n\treturn b.write([]byte{ProtocolVersion})\n}\n\n// CapabilitiesQuery sends the CapabilityQuery sysex code.\nfunc (b *Client) CapabilitiesQuery() error {\n\treturn b.WriteSysex([]byte{CapabilityQuery})\n}\n\n// AnalogMappingQuery sends the AnalogMappingQuery sysex code.\nfunc (b *Client) AnalogMappingQuery() error {\n\treturn b.WriteSysex([]byte{AnalogMappingQuery})\n}\n\n// ReportDigital enables or disables digital reporting for pin, a non zero\n// state enables reporting\nfunc (b *Client) ReportDigital(pin int, state int) error {\n\treturn b.togglePinReporting(pin, state, ReportDigital)\n}\n\n// ReportAnalog enables or disables analog reporting for pin, a non zero\n// state enables reporting\nfunc (b *Client) ReportAnalog(pin int, state int) error {\n\treturn b.togglePinReporting(pin, state, ReportAnalog)\n}\n\n// I2cRead reads numBytes from address once.\nfunc (b *Client) I2cRead(address int, numBytes int) error {\n\treturn b.WriteSysex([]byte{\n\t\tI2CRequest, byte(address), (I2CModeRead << 3),\n\t\tbyte(numBytes) & 0x7F, (byte(numBytes) >> 7) & 0x7F,\n\t})\n}\n\n// I2cWrite writes data to address.\nfunc (b *Client) I2cWrite(address int, data []byte) error {\n\tret := []byte{I2CRequest, byte(address), (I2CModeWrite << 3)}\n\tfor _, val := range data {\n\t\tret = append(ret, val&0x7F)\n\t\tret = append(ret, (val>>7)&0x7F)\n\t}\n\treturn b.WriteSysex(ret)\n}\n\n// I2cConfig configures the delay in which a register can be read from after it\n// has been written to.\nfunc (b *Client) I2cConfig(delay int) error {\n\treturn b.WriteSysex([]byte{I2CConfig, byte(delay & 0xFF), byte((delay >> 8) & 0xFF)})\n}\n\nfunc (b *Client) togglePinReporting(pin int, state int, mode byte) error {\n\tif state != 0 {\n\t\tstate = 1\n\t} else {\n\t\tstate = 0\n\t}\n\n\treturn b.write([]byte{mode | byte(pin), byte(state)})\n}\n\n// WriteSysex writes an arbitrary Sysex command to the microcontroller.\nfunc (b *Client) WriteSysex(data []byte) error {\n\treturn b.write(append([]byte{StartSysex}, append(data, EndSysex)...))\n}\n\nfunc (b *Client) write(data []byte) error {\n\t_, err := b.connection.Write(data)\n\treturn err\n}\n\nfunc (b *Client) read(n int) ([]byte, error) {\n\tbuf := make([]byte, n)\n\t_, err := io.ReadFull(b.connection, buf)\n\treturn buf, err\n}\n\nfunc (b *Client) process() error {\n\tmsgBuf, err := b.read(1)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmessageType := msgBuf[0]\n\tswitch {\n\tcase ProtocolVersion == messageType:\n\t\tbuf, err := b.read(2)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tb.ProtocolVersion = fmt.Sprintf(\"%v.%v\", buf[0], buf[1])\n\n\t\tb.Publish(b.Event(\"ProtocolVersion\"), b.ProtocolVersion)\n\tcase AnalogMessageRangeStart <= messageType &&\n\t\tAnalogMessageRangeEnd >= messageType:\n\n\t\tbuf, err := b.read(2)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvalue := uint(buf[0]) | uint(buf[1])<<7\n\t\tpin := int((messageType & 0x0F))\n\n\t\tif len(b.analogPins) > pin {\n\t\t\tif len(b.pins) > b.analogPins[pin] {\n\t\t\t\t//nolint:gosec // TODO: fix later\n\t\t\t\tb.pins[b.analogPins[pin]].Value = int(value)\n\t\t\t\tb.Publish(b.Event(fmt.Sprintf(\"AnalogRead%v\", pin)), b.pins[b.analogPins[pin]].Value)\n\t\t\t}\n\t\t}\n\tcase DigitalMessageRangeStart <= messageType &&\n\t\tDigitalMessageRangeEnd >= messageType:\n\n\t\tbuf, err := b.read(2)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tport := messageType & 0x0F\n\t\tportValue := buf[0] | (buf[1] << 7)\n\n\t\tfor i := 0; i < 8; i++ {\n\t\t\tpinNumber := int((8*port + byte(i)))\n\t\t\tif len(b.pins) > pinNumber {\n\t\t\t\tif b.pins[pinNumber].Mode == Input {\n\t\t\t\t\tb.pins[pinNumber].Value = int((portValue >> (byte(i) & 0x07)) & 0x01)\n\t\t\t\t\tb.Publish(b.Event(fmt.Sprintf(\"DigitalRead%v\", pinNumber)), b.pins[pinNumber].Value)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase StartSysex == messageType:\n\t\tbuf, err := b.read(2)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tcurrentBuffer := append(msgBuf, buf[0], buf[1])\n\t\tfor {\n\t\t\tbuf, err = b.read(1)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcurrentBuffer = append(currentBuffer, buf[0])\n\t\t\tif buf[0] == EndSysex {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tcommand := currentBuffer[1]\n\t\tswitch command {\n\t\tcase CapabilityResponse:\n\t\t\tb.pins = []Pin{}\n\t\t\tsupportedModes := 0\n\t\t\tn := 0\n\n\t\t\tfor _, val := range currentBuffer[2 : len(currentBuffer)-1] {\n\t\t\t\tif val == 127 {\n\t\t\t\t\tmodes := []int{}\n\t\t\t\t\tfor _, mode := range []int{Input, Output, Analog, Pwm, Servo} {\n\t\t\t\t\t\tif (supportedModes & (1 << byte(mode))) != 0 {\n\t\t\t\t\t\t\tmodes = append(modes, mode)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tb.pins = append(b.pins, Pin{SupportedModes: modes, Mode: Output})\n\t\t\t\t\tb.AddEvent(fmt.Sprintf(\"DigitalRead%v\", len(b.pins)-1))\n\t\t\t\t\tb.AddEvent(fmt.Sprintf(\"PinState%v\", len(b.pins)-1))\n\t\t\t\t\tsupportedModes = 0\n\t\t\t\t\tn = 0\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif n == 0 {\n\t\t\t\t\tsupportedModes = supportedModes | (1 << val)\n\t\t\t\t}\n\t\t\t\tn ^= 1\n\t\t\t}\n\t\t\tb.Publish(b.Event(\"CapabilityQuery\"), nil)\n\t\tcase AnalogMappingResponse:\n\t\t\tpinIndex := 0\n\t\t\tb.analogPins = []int{}\n\n\t\t\tfor _, val := range currentBuffer[2 : len(currentBuffer)-1] {\n\t\t\t\tb.pins[pinIndex].AnalogChannel = int(val)\n\n\t\t\t\tif val != 127 {\n\t\t\t\t\tb.analogPins = append(b.analogPins, pinIndex)\n\t\t\t\t}\n\t\t\t\tb.AddEvent(fmt.Sprintf(\"AnalogRead%v\", pinIndex))\n\t\t\t\tpinIndex++\n\t\t\t}\n\t\t\tb.Publish(b.Event(\"AnalogMappingQuery\"), nil)\n\t\tcase PinStateResponse:\n\t\t\tpin := currentBuffer[2]\n\t\t\tb.pins[pin].Mode = int(currentBuffer[3])\n\t\t\tb.pins[pin].State = int(currentBuffer[4])\n\n\t\t\tif len(currentBuffer) > 6 {\n\t\t\t\t//nolint:gosec // TODO: fix later\n\t\t\t\tb.pins[pin].State = int(uint(b.pins[pin].State) | uint(currentBuffer[5])<<7)\n\t\t\t}\n\t\t\tif len(currentBuffer) > 7 {\n\t\t\t\t//nolint:gosec // TODO: fix later\n\t\t\t\tb.pins[pin].State = int(uint(b.pins[pin].State) | uint(currentBuffer[6])<<14)\n\t\t\t}\n\n\t\t\tb.Publish(b.Event(fmt.Sprintf(\"PinState%v\", pin)), b.pins[pin])\n\t\tcase I2CReply:\n\t\t\treply := I2cReply{\n\t\t\t\tAddress:  int(currentBuffer[2] | currentBuffer[3]<<7),\n\t\t\t\tRegister: int(currentBuffer[4] | currentBuffer[5]<<7),\n\t\t\t\tData:     []byte{currentBuffer[6] | currentBuffer[7]<<7},\n\t\t\t}\n\t\t\tfor i := 8; i < len(currentBuffer); i = i + 2 {\n\t\t\t\tif currentBuffer[i] == byte(0xF7) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif i+2 > len(currentBuffer) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\treply.Data = append(reply.Data,\n\t\t\t\t\tcurrentBuffer[i]|currentBuffer[i+1]<<7,\n\t\t\t\t)\n\t\t\t}\n\t\t\tb.Publish(b.Event(\"I2cReply\"), reply)\n\t\tcase FirmwareQuery:\n\t\t\tname := []byte{}\n\t\t\tfor _, val := range currentBuffer[4:(len(currentBuffer) - 1)] {\n\t\t\t\tif val != 0 {\n\t\t\t\t\tname = append(name, val)\n\t\t\t\t}\n\t\t\t}\n\t\t\tb.FirmwareName = string(name)\n\t\t\tb.Publish(b.Event(\"FirmwareQuery\"), b.FirmwareName)\n\t\tcase StringData:\n\t\t\tstr := currentBuffer[2:]\n\t\t\tb.Publish(b.Event(\"StringData\"), string(str[:len(str)-1]))\n\t\tdefault:\n\t\t\tdata := make([]byte, len(currentBuffer))\n\t\t\tcopy(data, currentBuffer)\n\t\t\tb.Publish(\"SysexResponse\", data)\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/firmata/client/client_test.go",
    "content": "package client\n\nimport (\n\t\"bytes\"\n\t\"log\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nconst semPublishWait = 30 * time.Millisecond\n\ntype readWriteCloser struct {\n\tid string\n}\n\nvar (\n\ttestWriteData  = bytes.Buffer{}\n\twriteDataMutex sync.Mutex\n)\n\n// do not set this data directly, use always addTestReadData()\nvar (\n\ttestReadDataMap = make(map[string][]byte)\n\trwDataMapMutex  sync.Mutex\n)\n\n// arduino uno r3 protocol response \"2.3\"\nvar testDataProtocolResponse = []byte{249, 2, 3}\n\n// arduino uno r3 firmware response \"StandardFirmata.ino\"\nvar testDataFirmwareResponse = []byte{\n\t240, 121, 2, 3, 83, 0, 116, 0, 97, 0, 110, 0, 100, 0, 97,\n\t0, 114, 0, 100, 0, 70, 0, 105, 0, 114, 0, 109, 0, 97, 0, 116, 0, 97, 0, 46,\n\t0, 105, 0, 110, 0, 111, 0, 247,\n}\n\n// arduino uno r3 capabilities response\nvar testDataCapabilitiesResponse = []byte{\n\t240, 108, 127, 127, 0, 1, 1, 1, 4, 14, 127, 0, 1, 1, 1, 3,\n\t8, 4, 14, 127, 0, 1, 1, 1, 4, 14, 127, 0, 1, 1, 1, 3, 8, 4, 14, 127, 0, 1,\n\t1, 1, 3, 8, 4, 14, 127, 0, 1, 1, 1, 4, 14, 127, 0, 1, 1, 1, 4, 14, 127, 0,\n\t1, 1, 1, 3, 8, 4, 14, 127, 0, 1, 1, 1, 3, 8, 4, 14, 127, 0, 1, 1, 1, 3, 8,\n\t4, 14, 127, 0, 1, 1, 1, 4, 14, 127, 0, 1, 1, 1, 4, 14, 127, 0, 1, 1, 1, 2,\n\t10, 127, 0, 1, 1, 1, 2, 10, 127, 0, 1, 1, 1, 2, 10, 127, 0, 1, 1, 1, 2, 10,\n\t127, 0, 1, 1, 1, 2, 10, 6, 1, 127, 0, 1, 1, 1, 2, 10, 6, 1, 127, 247,\n}\n\n// arduino uno r3 analog mapping response\nvar testDataAnalogMappingResponse = []byte{\n\t240, 106, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,\n\t127, 127, 127, 127, 0, 1, 2, 3, 4, 5, 247,\n}\n\nfunc (readWriteCloser) Write(p []byte) (int, error) {\n\twriteDataMutex.Lock()\n\tdefer writeDataMutex.Unlock()\n\treturn testWriteData.Write(p)\n}\n\nfunc (rwc readWriteCloser) addTestReadData(d []byte) {\n\t// concurrent read/change of map is not allowed\n\trwDataMapMutex.Lock()\n\tdefer rwDataMapMutex.Unlock()\n\n\tdata, ok := testReadDataMap[rwc.id]\n\tif !ok {\n\t\tdata = []byte{}\n\t}\n\n\tdata = append(data, d...)\n\ttestReadDataMap[rwc.id] = data\n}\n\nfunc (rwc readWriteCloser) Read(b []byte) (int, error) {\n\t// concurrent change of map is not allowed\n\trwDataMapMutex.Lock()\n\tdefer rwDataMapMutex.Unlock()\n\n\tdata, ok := testReadDataMap[rwc.id]\n\tif !ok {\n\t\t// there was no content stored before to read\n\t\tlog.Printf(\"no content stored in %s\", rwc.id)\n\t\treturn 0, nil\n\t}\n\tsize := len(b)\n\tif len(data) < size {\n\t\tsize = len(data)\n\t}\n\tcopy(b, data[:size])\n\ttestReadDataMap[rwc.id] = data[size:]\n\treturn size, nil\n}\n\nfunc (readWriteCloser) Close() error {\n\treturn nil\n}\n\nfunc initTestFirmataWithReadWriteCloser(name string, data ...[]byte) (*Client, readWriteCloser) {\n\tb := New()\n\trwc := readWriteCloser{id: name}\n\tb.connection = rwc\n\n\tfor _, d := range data {\n\t\trwc.addTestReadData(d)\n\t\t_ = b.process()\n\t}\n\n\tb.setConnected(true)\n\treturn b, rwc\n}\n\nfunc TestPins(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse, testDataAnalogMappingResponse)\n\tassert.Len(t, b.Pins(), 20)\n\tassert.Len(t, b.analogPins, 6)\n}\n\nfunc TestProtocolVersionQuery(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.ProtocolVersionQuery())\n}\n\nfunc TestFirmwareQuery(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.FirmwareQuery())\n}\n\nfunc TestPinStateQuery(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.PinStateQuery(1))\n}\n\nfunc TestProcessProtocolVersion(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name())\n\trwc.addTestReadData(testDataProtocolResponse)\n\n\t_ = b.Once(b.Event(\"ProtocolVersion\"), func(data interface{}) {\n\t\tassert.Equal(t, \"2.3\", data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"ProtocolVersion was not published\")\n\t}\n}\n\nfunc TestProcessAnalogRead0(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse, testDataAnalogMappingResponse)\n\trwc.addTestReadData([]byte{0xE0, 0x23, 0x05})\n\n\t_ = b.Once(b.Event(\"AnalogRead0\"), func(data interface{}) {\n\t\tassert.Equal(t, 675, data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"AnalogRead0 was not published\")\n\t}\n}\n\nfunc TestProcessAnalogRead1(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse, testDataAnalogMappingResponse)\n\trwc.addTestReadData([]byte{0xE1, 0x23, 0x06})\n\n\t_ = b.Once(b.Event(\"AnalogRead1\"), func(data interface{}) {\n\t\tassert.Equal(t, 803, data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"AnalogRead1 was not published\")\n\t}\n}\n\nfunc TestProcessDigitalRead2(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse)\n\tb.pins[2].Mode = Input\n\trwc.addTestReadData([]byte{0x90, 0x04, 0x00})\n\n\t_ = b.Once(b.Event(\"DigitalRead2\"), func(data interface{}) {\n\t\tassert.Equal(t, 1, data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"DigitalRead2 was not published\")\n\t}\n}\n\nfunc TestProcessDigitalRead4(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse)\n\tb.pins[4].Mode = Input\n\trwc.addTestReadData([]byte{0x90, 0x16, 0x00})\n\n\t_ = b.Once(b.Event(\"DigitalRead4\"), func(data interface{}) {\n\t\tassert.Equal(t, 1, data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"DigitalRead4 was not published\")\n\t}\n}\n\nfunc TestDigitalWrite(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse)\n\trequire.NoError(t, b.DigitalWrite(13, 0))\n}\n\nfunc TestSetPinMode(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse)\n\trequire.NoError(t, b.SetPinMode(13, Output))\n}\n\nfunc TestAnalogWrite(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse)\n\trequire.NoError(t, b.AnalogWrite(0, 128))\n}\n\nfunc TestReportAnalog(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.ReportAnalog(0, 1))\n\trequire.NoError(t, b.ReportAnalog(0, 0))\n}\n\nfunc TestProcessPinState13(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name(), testDataCapabilitiesResponse, testDataAnalogMappingResponse)\n\trwc.addTestReadData([]byte{240, 110, 13, 1, 1, 247})\n\n\t_ = b.Once(b.Event(\"PinState13\"), func(data interface{}) {\n\t\tassert.Equal(t, Pin{[]int{0, 1, 4}, 1, 0, 1, 127}, data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"PinState13 was not published\")\n\t}\n}\n\nfunc TestI2cConfig(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.I2cConfig(100))\n}\n\nfunc TestI2cWrite(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.I2cWrite(0x00, []byte{0x01, 0x02}))\n}\n\nfunc TestI2cRead(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.I2cRead(0x00, 10))\n}\n\nfunc TestWriteSysex(t *testing.T) {\n\tb, _ := initTestFirmataWithReadWriteCloser(t.Name())\n\trequire.NoError(t, b.WriteSysex([]byte{0x01, 0x02}))\n}\n\nfunc TestProcessI2cReply(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name())\n\trwc.addTestReadData([]byte{240, 119, 9, 0, 0, 0, 24, 1, 1, 0, 26, 1, 247})\n\n\t_ = b.Once(b.Event(\"I2cReply\"), func(data interface{}) {\n\t\tassert.Equal(t, I2cReply{\n\t\t\tAddress:  9,\n\t\t\tRegister: 0,\n\t\t\tData:     []byte{152, 1, 154},\n\t\t}, data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"I2cReply was not published\")\n\t}\n}\n\nfunc TestProcessFirmwareQuery(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name())\n\trwc.addTestReadData(testDataFirmwareResponse)\n\n\t_ = b.Once(b.Event(\"FirmwareQuery\"), func(data interface{}) {\n\t\tassert.Equal(t, \"StandardFirmata.ino\", data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"FirmwareQuery was not published\")\n\t}\n}\n\nfunc TestProcessStringData(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name())\n\trwc.addTestReadData(append([]byte{240, 0x71}, append([]byte(\"Hello Firmata!\"), 247)...))\n\n\t_ = b.Once(b.Event(\"StringData\"), func(data interface{}) {\n\t\tassert.Equal(t, \"Hello Firmata!\", data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"StringData was not published\")\n\t}\n}\n\nfunc TestConnect(t *testing.T) {\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name())\n\tb.setConnected(false)\n\n\trwc.addTestReadData(testDataProtocolResponse)\n\n\t_ = b.Once(b.Event(\"ProtocolVersion\"), func(data interface{}) {\n\t\trwc.addTestReadData(testDataFirmwareResponse)\n\t})\n\n\t_ = b.Once(b.Event(\"FirmwareQuery\"), func(data interface{}) {\n\t\trwc.addTestReadData(testDataCapabilitiesResponse)\n\t})\n\n\t_ = b.Once(b.Event(\"CapabilityQuery\"), func(data interface{}) {\n\t\trwc.addTestReadData(testDataAnalogMappingResponse)\n\t})\n\n\t_ = b.Once(b.Event(\"AnalogMappingQuery\"), func(data interface{}) {\n\t\trwc.addTestReadData(testDataProtocolResponse)\n\t})\n\n\trequire.NoError(t, b.Connect(rwc))\n\ttime.Sleep(150 * time.Millisecond)\n\trequire.NoError(t, b.Disconnect())\n}\n\nfunc TestServoConfig(t *testing.T) {\n\tb := New()\n\tb.connection = readWriteCloser{}\n\n\ttests := []struct {\n\t\tdescription string\n\t\targuments   [3]int\n\t\texpected    []byte\n\t\tresult      error\n\t}{\n\t\t{\n\t\t\tdescription: \"Min values for min & max\",\n\t\t\targuments:   [3]int{9, 0, 0},\n\t\t\texpected:    []byte{0xF0, 0x70, 9, 0, 0, 0, 0, 0xF7},\n\t\t},\n\t\t{\n\t\t\tdescription: \"Max values for min & max\",\n\t\t\targuments:   [3]int{9, 0x3FFF, 0x3FFF},\n\t\t\texpected:    []byte{0xF0, 0x70, 9, 0x7F, 0x7F, 0x7F, 0x7F, 0xF7},\n\t\t},\n\t\t{\n\t\t\tdescription: \"Clipped max values for min & max\",\n\t\t\targuments:   [3]int{9, 0xFFFF, 0xFFFF},\n\t\t\texpected:    []byte{0xF0, 0x70, 9, 0x7F, 0x7F, 0x7F, 0x7F, 0xF7},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\twriteDataMutex.Lock()\n\t\ttestWriteData.Reset()\n\t\twriteDataMutex.Unlock()\n\t\terr := b.ServoConfig(test.arguments[0], test.arguments[1], test.arguments[2])\n\t\twriteDataMutex.Lock()\n\t\tassert.Equal(t, test.expected, testWriteData.Bytes())\n\t\tassert.Equal(t, test.result, err)\n\t\twriteDataMutex.Unlock()\n\t}\n}\n\nfunc TestProcessSysexData(t *testing.T) {\n\tsem := make(chan bool)\n\tb, rwc := initTestFirmataWithReadWriteCloser(t.Name())\n\trwc.addTestReadData([]byte{240, 17, 1, 2, 3, 247})\n\n\t_ = b.Once(\"SysexResponse\", func(data interface{}) {\n\t\tassert.Equal(t, []byte{240, 17, 1, 2, 3, 247}, data)\n\t\tsem <- true\n\t})\n\n\t_ = b.process()\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(semPublishWait):\n\t\trequire.Fail(t, \"SysexResponse was not published\")\n\t}\n}\n"
  },
  {
    "path": "platforms/firmata/client/examples/blink.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"go.bug.st/serial\"\n\n\t\"gobot.io/x/gobot/v2/platforms/firmata/client\"\n)\n\nfunc main() {\n\tsp, err := serial.Open(\"/dev/ttyACM0\", &serial.Mode{BaudRate: 57600})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tboard := client.New()\n\n\tfmt.Println(\"connecting.....\")\n\terr = board.Connect(sp)\n\tdefer func() {\n\t\tif err := board.Disconnect(); err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(\"firmware name:\", board.FirmwareName)\n\tfmt.Println(\"firmata version:\", board.ProtocolVersion)\n\n\tpin := 13\n\tif err = board.SetPinMode(pin, client.Output); err != nil {\n\t\tpanic(err)\n\t}\n\n\tlevel := 0\n\n\tfor {\n\t\tlevel ^= 1\n\t\tif err := board.DigitalWrite(pin, level); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tfmt.Println(\"level:\", level)\n\t\ttime.Sleep(500 * time.Millisecond)\n\t}\n}\n"
  },
  {
    "path": "platforms/firmata/doc.go",
    "content": "/*\nPackage firmata provides the Gobot adaptor for microcontrollers that support the Firmata protocol.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"time\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t)\n\n\tfunc main() {\n\t\tfirmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n\t\tled := gpio.NewLedDriver(firmataAdaptor, \"13\")\n\n\t\twork := func() {\n\t\t\tgobot.Every(1*time.Second, func() {\n\t\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"bot\",\n\t\t\t[]gobot.Connection{firmataAdaptor},\n\t\t\t[]gobot.Device{led},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor further information refer to firmata readme:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/firmata/README.md\n*/\npackage firmata // import \"gobot.io/x/gobot/v2/platforms/firmata\"\n"
  },
  {
    "path": "platforms/firmata/firmata_adaptor.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage firmata\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"go.bug.st/serial\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata/client\"\n)\n\ntype firmataBoard interface {\n\tConnect(conn io.ReadWriteCloser) error\n\tDisconnect() error\n\tPins() []client.Pin\n\tAnalogWrite(pin int, value int) error\n\tSetPinMode(pin int, mode int) error\n\tReportAnalog(pin int, state int) error\n\tReportDigital(pin int, state int) error\n\tDigitalWrite(pin int, value int) error\n\tI2cRead(address int, numBytes int) error\n\tI2cWrite(address int, data []byte) error\n\tI2cConfig(delay int) error\n\tServoConfig(pin int, maximum int, minimum int) error\n\tWriteSysex(data []byte) error\n\tgobot.Eventer\n}\n\ntype FirmataAdaptor interface {\n\tConnect() error\n\tFinalize() error\n\tName() string\n\tSetName(n string)\n\tWriteSysex(data []byte) error\n\tgobot.Eventer\n}\n\n// Adaptor is the Gobot Adaptor for Firmata based boards\ntype Adaptor struct {\n\tgobot.Eventer\n\n\tname       string\n\tport       string\n\tBoard      firmataBoard\n\tconn       io.ReadWriteCloser\n\tPortOpener func(port string) (io.ReadWriteCloser, error)\n}\n\n// NewAdaptor returns a new Firmata Adaptor which optionally accepts:\n//\n//\tstring: port the Adaptor uses to connect to a serial port with a baude rate of 57600\n//\tio.ReadWriteCloser: connection the Adaptor uses to communication with the hardware\n//\n// If an io.ReadWriteCloser is not supplied, the Adaptor will open a connection\n// to a serial port with a baude rate of 57600. If an io.ReadWriteCloser\n// is supplied, then the Adaptor will use the provided io.ReadWriteCloser and use the\n// string port as a label to be displayed in the log and api.\nfunc NewAdaptor(args ...interface{}) *Adaptor {\n\tf := &Adaptor{\n\t\tname:  gobot.DefaultName(\"Firmata\"),\n\t\tport:  \"\",\n\t\tconn:  nil,\n\t\tBoard: client.New(),\n\t\tPortOpener: func(port string) (io.ReadWriteCloser, error) {\n\t\t\treturn serial.Open(port, &serial.Mode{BaudRate: 57600})\n\t\t},\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\tfor _, arg := range args {\n\t\tswitch a := arg.(type) {\n\t\tcase string:\n\t\t\tf.port = a\n\t\tcase io.ReadWriteCloser:\n\t\t\tf.conn = a\n\t\t}\n\t}\n\n\treturn f\n}\n\n// Connect starts a connection to the board.\nfunc (f *Adaptor) Connect() error {\n\tif f.conn == nil {\n\t\tsp, err := f.PortOpener(f.Port())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tf.conn = sp\n\t}\n\tif err := f.Board.Connect(f.conn); err != nil {\n\t\treturn err\n\t}\n\n\treturn f.Board.On(\"SysexResponse\", func(data interface{}) {\n\t\tf.Publish(\"SysexResponse\", data)\n\t})\n}\n\n// Disconnect closes the io connection to the Board\nfunc (f *Adaptor) Disconnect() error {\n\tif f.Board != nil {\n\t\treturn f.Board.Disconnect()\n\t}\n\treturn nil\n}\n\n// Finalize terminates the firmata connection\nfunc (f *Adaptor) Finalize() error {\n\treturn f.Disconnect()\n}\n\n// Port returns the Firmata adaptors port\nfunc (f *Adaptor) Port() string { return f.port }\n\n// Name returns the Firmata adaptors name\nfunc (f *Adaptor) Name() string { return f.name }\n\n// SetName sets the Firmata adaptors name\nfunc (f *Adaptor) SetName(n string) { f.name = n }\n\n// ServoConfig sets the pulse width in microseconds for a pin attached to a servo\nfunc (f *Adaptor) ServoConfig(pin string, minimum, maximum int) error {\n\tp, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn f.Board.ServoConfig(p, maximum, minimum)\n}\n\n// ServoWrite writes the 0-180 degree angle to the specified pin.\nfunc (f *Adaptor) ServoWrite(pin string, angle byte) error {\n\tp, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif f.Board.Pins()[p].Mode != client.Servo {\n\t\terr = f.Board.SetPinMode(p, client.Servo)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn f.Board.AnalogWrite(p, int(angle))\n}\n\n// PwmWrite writes the 0-254 value to the specified pin\nfunc (f *Adaptor) PwmWrite(pin string, level byte) error {\n\tp, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif f.Board.Pins()[p].Mode != client.Pwm {\n\t\terr = f.Board.SetPinMode(p, client.Pwm)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn f.Board.AnalogWrite(p, int(level))\n}\n\n// DigitalWrite writes a value to the pin. Acceptable values are 1 or 0.\nfunc (f *Adaptor) DigitalWrite(pin string, level byte) error {\n\tp, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif f.Board.Pins()[p].Mode != client.Output {\n\t\tif err = f.Board.SetPinMode(p, client.Output); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn f.Board.DigitalWrite(p, int(level))\n}\n\n// DigitalRead retrieves digital value from specified pin.\n// Returns -1 if the response from the board has timed out\nfunc (f *Adaptor) DigitalRead(pin string) (int, error) {\n\tp, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif f.Board.Pins()[p].Mode != client.Input {\n\t\tif err := f.Board.SetPinMode(p, client.Input); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tif err := f.Board.ReportDigital(p, 1); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\t<-time.After(10 * time.Millisecond)\n\t}\n\n\treturn f.Board.Pins()[p].Value, nil\n}\n\n// AnalogRead retrieves value from analog pin.\n// Returns -1 if the response from the board has timed out\nfunc (f *Adaptor) AnalogRead(pin string) (int, error) {\n\tp, err := strconv.Atoi(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tp = f.digitalPin(p)\n\n\tif f.Board.Pins()[p].Mode != client.Analog {\n\t\tif err := f.Board.SetPinMode(p, client.Analog); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\tif err := f.Board.ReportAnalog(p, 1); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\t<-time.After(10 * time.Millisecond)\n\t}\n\n\treturn f.Board.Pins()[p].Value, nil\n}\n\nfunc (f *Adaptor) WriteSysex(data []byte) error {\n\treturn f.Board.WriteSysex(data)\n}\n\n// digitalPin converts pin number to digital mapping\nfunc (f *Adaptor) digitalPin(pin int) int {\n\treturn pin + 14\n}\n\n// GetI2cConnection returns an i2c connection to a device on a specified bus.\n// Only supports bus number 0\nfunc (f *Adaptor) GetI2cConnection(address int, bus int) (i2c.Connection, error) {\n\tif bus != 0 {\n\t\treturn nil, fmt.Errorf(\"invalid bus number %d, only 0 is supported\", bus)\n\t}\n\tif err := f.Board.I2cConfig(0); err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewFirmataI2cConnection(f, address), nil\n}\n\n// DefaultI2cBus returns the default i2c bus for this platform\nfunc (f *Adaptor) DefaultI2cBus() int {\n\treturn 0\n}\n"
  },
  {
    "path": "platforms/firmata/firmata_adaptor_test.go",
    "content": "//go:build !windows\n// +build !windows\n\n//nolint:forcetypeassert // ok here\npackage firmata\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata/client\"\n)\n\n// make sure that this Adaptor fulfills all required analog and digital interfaces\nvar (\n\t_ gobot.Adaptor      = (*Adaptor)(nil)\n\t_ gpio.DigitalReader = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter = (*Adaptor)(nil)\n\t_ aio.AnalogReader   = (*Adaptor)(nil)\n\t_ gpio.PwmWriter     = (*Adaptor)(nil)\n\t_ gpio.ServoWriter   = (*Adaptor)(nil)\n\t_ FirmataAdaptor     = (*Adaptor)(nil)\n)\n\ntype readWriteCloser struct{}\n\nfunc (readWriteCloser) Write(p []byte) (int, error) {\n\treturn testWriteData.Write(p)\n}\n\nvar (\n\ttestReadData  = []byte{}\n\ttestWriteData = bytes.Buffer{}\n)\n\nfunc (readWriteCloser) Read(b []byte) (int, error) {\n\tsize := len(b)\n\tif len(testReadData) < size {\n\t\tsize = len(testReadData)\n\t}\n\tcopy(b, testReadData[:size])\n\ttestReadData = testReadData[size:]\n\n\treturn size, nil\n}\n\nfunc (readWriteCloser) Close() error {\n\treturn nil\n}\n\ntype mockFirmataBoard struct {\n\tgobot.Eventer\n\n\tdisconnectError error\n\tpins            []client.Pin\n}\n\nfunc newMockFirmataBoard() *mockFirmataBoard {\n\tm := &mockFirmataBoard{\n\t\tEventer:         gobot.NewEventer(),\n\t\tdisconnectError: nil,\n\t\tpins:            make([]client.Pin, 100),\n\t}\n\n\tm.pins[1].Value = 1\n\tm.pins[15].Value = 133\n\n\treturn m\n}\n\n// setup mock for GPIO, PWM and servo tests\nfunc (mockFirmataBoard) Connect(io.ReadWriteCloser) error { return nil }\n\nfunc (m mockFirmataBoard) Disconnect() error {\n\treturn m.disconnectError\n}\n\nfunc (m mockFirmataBoard) Pins() []client.Pin {\n\treturn m.pins\n}\nfunc (mockFirmataBoard) AnalogWrite(int, int) error      { return nil }\nfunc (mockFirmataBoard) SetPinMode(int, int) error       { return nil }\nfunc (mockFirmataBoard) ReportAnalog(int, int) error     { return nil }\nfunc (mockFirmataBoard) ReportDigital(int, int) error    { return nil }\nfunc (mockFirmataBoard) DigitalWrite(int, int) error     { return nil }\nfunc (mockFirmataBoard) ServoConfig(int, int, int) error { return nil }\nfunc (mockFirmataBoard) WriteSysex([]byte) error         { return nil }\n\n// i2c functions unused in this test scenarios\nfunc (mockFirmataBoard) I2cRead(int, int) error     { return nil }\nfunc (mockFirmataBoard) I2cWrite(int, []byte) error { return nil }\nfunc (mockFirmataBoard) I2cConfig(int) error        { return nil }\n\nfunc initTestAdaptor() *Adaptor {\n\ta := NewAdaptor(\"/dev/null\")\n\ta.Board = newMockFirmataBoard()\n\ta.PortOpener = func(port string) (io.ReadWriteCloser, error) {\n\t\treturn &readWriteCloser{}, nil\n\t}\n\t_ = a.Connect()\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\ta := NewAdaptor(\"/dev/null\")\n\tassert.Equal(t, \"/dev/null\", a.Port())\n}\n\nfunc TestAdaptorFinalize(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.Finalize())\n\n\ta = initTestAdaptor()\n\ta.Board.(*mockFirmataBoard).disconnectError = errors.New(\"close error\")\n\trequire.ErrorContains(t, a.Finalize(), \"close error\")\n}\n\nfunc TestAdaptorConnect(t *testing.T) {\n\topenSP := func(port string) (io.ReadWriteCloser, error) {\n\t\treturn &readWriteCloser{}, nil\n\t}\n\ta := NewAdaptor(\"/dev/null\")\n\ta.PortOpener = openSP\n\ta.Board = newMockFirmataBoard()\n\trequire.NoError(t, a.Connect())\n\n\ta = NewAdaptor(\"/dev/null\")\n\ta.Board = newMockFirmataBoard()\n\ta.PortOpener = func(port string) (io.ReadWriteCloser, error) {\n\t\treturn nil, errors.New(\"connect error\")\n\t}\n\trequire.ErrorContains(t, a.Connect(), \"connect error\")\n\n\ta = NewAdaptor(&readWriteCloser{})\n\ta.Board = newMockFirmataBoard()\n\trequire.NoError(t, a.Connect())\n\n\ta = NewAdaptor(\"/dev/null\")\n\ta.Board = nil\n\trequire.NoError(t, a.Disconnect())\n}\n\nfunc TestAdaptorServoWrite(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.ServoWrite(\"1\", 50))\n}\n\nfunc TestAdaptorServoWriteBadPin(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.Error(t, a.ServoWrite(\"xyz\", 50))\n}\n\nfunc TestAdaptorPwmWrite(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.PwmWrite(\"1\", 50))\n}\n\nfunc TestAdaptorPwmWriteBadPin(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.Error(t, a.PwmWrite(\"xyz\", 50))\n}\n\nfunc TestAdaptorDigitalWrite(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.DigitalWrite(\"1\", 1))\n}\n\nfunc TestAdaptorDigitalWriteBadPin(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.Error(t, a.DigitalWrite(\"xyz\", 50))\n}\n\nfunc TestAdaptorDigitalRead(t *testing.T) {\n\ta := initTestAdaptor()\n\tval, err := a.DigitalRead(\"1\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, val)\n\n\tval, err = a.DigitalRead(\"0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, val)\n}\n\nfunc TestAdaptorDigitalReadBadPin(t *testing.T) {\n\ta := initTestAdaptor()\n\t_, err := a.DigitalRead(\"xyz\")\n\trequire.Error(t, err)\n}\n\nfunc TestAdaptorAnalogRead(t *testing.T) {\n\ta := initTestAdaptor()\n\tval, err := a.AnalogRead(\"1\")\n\tassert.Equal(t, 133, val)\n\trequire.NoError(t, err)\n\n\tval, err = a.AnalogRead(\"0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, val)\n}\n\nfunc TestAdaptorAnalogReadBadPin(t *testing.T) {\n\ta := initTestAdaptor()\n\t_, err := a.AnalogRead(\"xyz\")\n\trequire.Error(t, err)\n}\n\nfunc TestServoConfig(t *testing.T) {\n\ta := initTestAdaptor()\n\terr := a.ServoConfig(\"9\", 0, 0)\n\trequire.NoError(t, err)\n\n\t// test atoi error\n\terr = a.ServoConfig(\"a\", 0, 0)\n\trequire.ErrorContains(t, err, \"invalid syntax\")\n}\n"
  },
  {
    "path": "platforms/firmata/firmata_i2c.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage firmata\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"gobot.io/x/gobot/v2/platforms/firmata/client\"\n)\n\n// firmataI2cConnection implements the interface gobot.I2cOperations\ntype firmataI2cConnection struct {\n\taddress int\n\tadaptor *Adaptor\n\tmtx     sync.Mutex\n}\n\n// NewFirmataI2cConnection creates an I2C connection to an I2C device at\n// the specified address\nfunc NewFirmataI2cConnection(adaptor *Adaptor, address int) *firmataI2cConnection {\n\treturn &firmataI2cConnection{adaptor: adaptor, address: address}\n}\n\n// Read tries to read a full buffer from the i2c device.\n// Returns an empty array if the response from the board has timed out.\nfunc (c *firmataI2cConnection) Read(b []byte) (int, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\treturn c.readInternal(b)\n}\n\n// Write writes the buffer content in data to the i2c device.\nfunc (c *firmataI2cConnection) Write(data []byte) (int, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\treturn c.writeInternal(data)\n}\n\n// Close do nothing than return nil.\nfunc (c *firmataI2cConnection) Close() error {\n\treturn nil\n}\n\n// ReadByte reads one byte from the i2c device.\nfunc (c *firmataI2cConnection) ReadByte() (byte, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tbuf := []byte{0}\n\tif err := c.readAndCheckCount(buf); err != nil {\n\t\treturn 0, err\n\t}\n\treturn buf[0], nil\n}\n\n// ReadByteData reads one byte of the given register address from the i2c device.\n// TODO: implement the specification, because some devices will not work with this\n//\n//\tcurrent:  \"S Addr Wr [A] Comm [A] P S Addr Rd [A] [Data] NA P\"\n//\trequired: \"S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P\"\nfunc (c *firmataI2cConnection) ReadByteData(reg uint8) (uint8, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif err := c.writeAndCheckCount([]byte{reg}); err != nil {\n\t\treturn 0, err\n\t}\n\n\tbuf := []byte{0}\n\tif err := c.readAndCheckCount(buf); err != nil {\n\t\treturn 0, err\n\t}\n\treturn buf[0], nil\n}\n\n// ReadWordData reads two bytes of the given register address from the i2c device.\n// TODO: implement the specification, because some devices will not work with this\n//\n//\tcurrent:  \"S Addr Wr [A] Comm [A] P S Addr Rd [A] [DataLow] A [DataHigh] NA P\"\n//\trequired: \"S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P\"\nfunc (c *firmataI2cConnection) ReadWordData(reg uint8) (uint16, error) {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif err := c.writeAndCheckCount([]byte{reg}); err != nil {\n\t\treturn uint16(0), err\n\t}\n\n\tbuf := []byte{0, 0}\n\tif err := c.readAndCheckCount(buf); err != nil {\n\t\treturn uint16(0), err\n\t}\n\tlow, high := buf[0], buf[1]\n\treturn (uint16(high) << 8) | uint16(low), nil\n}\n\n// ReadBlockData reads a block of maximum 32 bytes from the given register address of the i2c device.\n// TODO: implement the specification, because some devices will not work with this\n//\n//\tcurrent:  \"S Addr Wr [A] Comm [A] P S Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P\"\n//\trequired: \"S Addr Wr [A] Comm [A] S Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P\"\nfunc (c *firmataI2cConnection) ReadBlockData(reg uint8, data []byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif err := c.writeAndCheckCount([]byte{reg}); err != nil {\n\t\treturn err\n\t}\n\n\tif len(data) > 32 {\n\t\tdata = data[:32]\n\t}\n\treturn c.readAndCheckCount(data)\n}\n\n// WriteByte writes one byte to the i2c device.\nfunc (c *firmataI2cConnection) WriteByte(val byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tbuf := []byte{val}\n\treturn c.writeAndCheckCount(buf)\n}\n\n// WriteByteData writes one byte to the given register address of the i2c device.\nfunc (c *firmataI2cConnection) WriteByteData(reg uint8, val byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tbuf := []byte{reg, val}\n\treturn c.writeAndCheckCount(buf)\n}\n\n// WriteWordData writes two bytes to the given register address of the i2c device.\nfunc (c *firmataI2cConnection) WriteWordData(reg uint8, val uint16) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tlow := uint8(val & 0xff)         //nolint:gosec // ok here\n\thigh := uint8((val >> 8) & 0xff) //nolint:gosec // ok here\n\tbuf := []byte{reg, low, high}\n\treturn c.writeAndCheckCount(buf)\n}\n\n// WriteBlockData writes a block of maximum 32 bytes to the given register address of the i2c device.\nfunc (c *firmataI2cConnection) WriteBlockData(reg uint8, data []byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif len(data) > 32 {\n\t\tdata = data[:32]\n\t}\n\n\tbuf := make([]byte, len(data)+1)\n\tcopy(buf[1:], data)\n\tbuf[0] = reg\n\treturn c.writeAndCheckCount(buf)\n}\n\n// WriteBytes writes a block of maximum 32 bytes to the current register address of the i2c device.\nfunc (c *firmataI2cConnection) WriteBytes(buf []byte) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif len(buf) > 32 {\n\t\tbuf = buf[:32]\n\t}\n\n\treturn c.writeAndCheckCount(buf)\n}\n\nfunc (c *firmataI2cConnection) readAndCheckCount(buf []byte) error {\n\tcountRead, err := c.readInternal(buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\texpectedCount := len(buf)\n\tif countRead != expectedCount {\n\t\treturn fmt.Errorf(\"firmata i2c read %d bytes, expected %d bytes\", countRead, expectedCount)\n\t}\n\treturn nil\n}\n\nfunc (c *firmataI2cConnection) writeAndCheckCount(buf []byte) error {\n\tcountWritten, err := c.writeInternal(buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\texpectedCount := len(buf)\n\tif countWritten != expectedCount {\n\t\treturn fmt.Errorf(\"firmata i2c write %d bytes, expected %d bytes\", countWritten, expectedCount)\n\t}\n\treturn nil\n}\n\nfunc (c *firmataI2cConnection) readInternal(b []byte) (int, error) {\n\tret := make(chan []byte)\n\n\tif err := c.adaptor.Board.I2cRead(c.address, len(b)); err != nil {\n\t\treturn 0, err\n\t}\n\n\tif err := c.adaptor.Board.Once(c.adaptor.Board.Event(\"I2cReply\"), func(data interface{}) {\n\t\tret <- data.(client.I2cReply).Data //nolint:forcetypeassert // ok here\n\t}); err != nil {\n\t\treturn 0, err\n\t}\n\n\tresult := <-ret\n\tcopy(b, result)\n\n\treturn len(result), nil\n}\n\nfunc (c *firmataI2cConnection) writeInternal(data []byte) (int, error) {\n\tvar chunk []byte\n\tvar written int\n\tfor len(data) >= 16 {\n\t\tchunk, data = data[:16], data[16:]\n\t\tif err := c.adaptor.Board.I2cWrite(c.address, chunk); err != nil {\n\t\t\treturn written, err\n\t\t}\n\t\twritten += len(chunk)\n\t}\n\tif len(data) > 0 {\n\t\tif err := c.adaptor.Board.I2cWrite(c.address, data); err != nil {\n\t\t\treturn written, err\n\t\t}\n\t\twritten += len(data)\n\t}\n\treturn written, nil\n}\n"
  },
  {
    "path": "platforms/firmata/firmata_i2c_test.go",
    "content": "//go:build !windows\n// +build !windows\n\n//nolint:forcetypeassert,gosec // ok here\npackage firmata\n\nimport (\n\t\"io\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata/client\"\n)\n\n// make sure that this Adaptor fulfills all required I2C interfaces\nvar _ i2c.Connector = (*Adaptor)(nil)\n\ntype i2cMockFirmataBoard struct {\n\tgobot.Eventer\n\n\ti2cDataForRead []byte\n\tnumBytesToRead int\n\ti2cWritten     []byte\n}\n\n// setup mock for i2c tests\nfunc (t *i2cMockFirmataBoard) I2cRead(address int, numBytes int) error {\n\tt.numBytesToRead = numBytes\n\ti2cReply := client.I2cReply{Data: t.i2cDataForRead}\n\tgo func() {\n\t\t<-time.After(10 * time.Millisecond)\n\t\tt.Publish(t.Event(\"I2cReply\"), i2cReply)\n\t}()\n\treturn nil\n}\n\nfunc (t *i2cMockFirmataBoard) I2cWrite(address int, data []byte) error {\n\tt.i2cWritten = append(t.i2cWritten, data...)\n\treturn nil\n}\nfunc (*i2cMockFirmataBoard) I2cConfig(int) error { return nil }\n\n// GPIO, PWM and servo functions unused in this test scenarios\nfunc (*i2cMockFirmataBoard) Connect(io.ReadWriteCloser) error { return nil }\nfunc (*i2cMockFirmataBoard) Disconnect() error                { return nil }\nfunc (*i2cMockFirmataBoard) Pins() []client.Pin               { return nil }\nfunc (*i2cMockFirmataBoard) AnalogWrite(int, int) error       { return nil }\nfunc (*i2cMockFirmataBoard) SetPinMode(int, int) error        { return nil }\nfunc (*i2cMockFirmataBoard) ReportAnalog(int, int) error      { return nil }\nfunc (*i2cMockFirmataBoard) ReportDigital(int, int) error     { return nil }\nfunc (*i2cMockFirmataBoard) DigitalWrite(int, int) error      { return nil }\nfunc (*i2cMockFirmataBoard) ServoConfig(int, int, int) error  { return nil }\n\n// WriteSysex of the client implementation not tested here\nfunc (*i2cMockFirmataBoard) WriteSysex([]byte) error { return nil }\n\nfunc newI2cMockFirmataBoard() *i2cMockFirmataBoard {\n\tm := &i2cMockFirmataBoard{\n\t\tEventer: gobot.NewEventer(),\n\t}\n\tm.AddEvent(\"I2cReply\")\n\treturn m\n}\n\nfunc initTestTestAdaptorWithI2cConnection() (i2c.Connection, *i2cMockFirmataBoard) {\n\ta := NewAdaptor()\n\ta.Board = newI2cMockFirmataBoard()\n\tcon, err := a.GetI2cConnection(0, 0)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn con, a.Board.(*i2cMockFirmataBoard)\n}\n\nfunc TestClose(t *testing.T) {\n\ti2c, _ := initTestTestAdaptorWithI2cConnection()\n\trequire.NoError(t, i2c.Close())\n}\n\nfunc TestRead(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\tbrd.i2cDataForRead = []byte{111}\n\tbuf := []byte{0}\n\t// act\n\tcountRead, err := con.Read(buf)\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, countRead)\n\tassert.Equal(t, 1, brd.numBytesToRead)\n\tassert.Equal(t, brd.i2cDataForRead, buf)\n\tassert.Empty(t, brd.i2cWritten)\n}\n\nfunc TestReadByte(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\tbrd.i2cDataForRead = []byte{222}\n\t// act\n\tval, err := con.ReadByte()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, brd.numBytesToRead)\n\tassert.Equal(t, brd.i2cDataForRead[0], val)\n\tassert.Empty(t, brd.i2cWritten)\n}\n\nfunc TestReadByteData(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\tbrd.i2cDataForRead = []byte{100}\n\treg := uint8(0x01)\n\t// act\n\tval, err := con.ReadByteData(reg)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, brd.numBytesToRead)\n\tassert.Equal(t, brd.i2cDataForRead[0], val)\n\tassert.Len(t, brd.i2cWritten, 1)\n\tassert.Equal(t, reg, brd.i2cWritten[0])\n}\n\nfunc TestReadWordData(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\tlsb := uint8(0x11)\n\tmsb := uint8(0xff)\n\tbrd.i2cDataForRead = []byte{lsb, msb}\n\treg := uint8(0x22)\n\t// act\n\tval, err := con.ReadWordData(reg)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 2, brd.numBytesToRead)\n\tassert.Equal(t, uint16(lsb)|uint16(msb)<<8, val)\n\tassert.Len(t, brd.i2cWritten, 1)\n\tassert.Equal(t, reg, brd.i2cWritten[0])\n}\n\nfunc TestReadBlockData(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\tbrd.i2cDataForRead = []byte{50, 40, 30, 20, 10}\n\treg := uint8(0x33)\n\tbuf := []byte{1, 2, 3, 4, 5}\n\t// act\n\terr := con.ReadBlockData(reg, buf)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, 5, brd.numBytesToRead)\n\tassert.Equal(t, brd.i2cDataForRead, buf)\n\tassert.Len(t, brd.i2cWritten, 1)\n\tassert.Equal(t, reg, brd.i2cWritten[0])\n}\n\nfunc TestWrite(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\twant := []byte{0x00, 0x01}\n\twantLen := len(want)\n\t// act\n\twritten, err := con.Write(want)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantLen, written)\n\tassert.Equal(t, want, brd.i2cWritten)\n}\n\nfunc TestWrite20bytes(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\twant := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}\n\twantLen := len(want)\n\t// act\n\twritten, err := con.Write(want)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, wantLen, written)\n\tassert.Equal(t, want, brd.i2cWritten)\n}\n\nfunc TestWriteByte(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\twant := uint8(0x11)\n\t// act\n\terr := con.WriteByte(want)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, brd.i2cWritten, 1)\n\tassert.Equal(t, want, brd.i2cWritten[0])\n}\n\nfunc TestWriteByteData(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\treg := uint8(0x12)\n\tval := uint8(0x22)\n\t// act\n\terr := con.WriteByteData(reg, val)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, brd.i2cWritten, 2)\n\tassert.Equal(t, reg, brd.i2cWritten[0])\n\tassert.Equal(t, val, brd.i2cWritten[1])\n}\n\nfunc TestWriteWordData(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\treg := uint8(0x13)\n\tval := uint16(0x8002)\n\t// act\n\terr := con.WriteWordData(reg, val)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, brd.i2cWritten, 3)\n\tassert.Equal(t, reg, brd.i2cWritten[0])\n\tassert.Equal(t, uint8(val&0x00FF), brd.i2cWritten[1])\n\tassert.Equal(t, uint8(val>>8), brd.i2cWritten[2])\n}\n\nfunc TestWriteBlockData(t *testing.T) {\n\t// arrange\n\tcon, brd := initTestTestAdaptorWithI2cConnection()\n\treg := uint8(0x14)\n\tval := []byte{}\n\t// we prepare more than 32 bytes, because the call has to drop it\n\tfor i := uint8(0); i < 40; i++ {\n\t\tval = append(val, i)\n\t}\n\t// act\n\terr := con.WriteBlockData(reg, val)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Len(t, brd.i2cWritten, 33)\n\tassert.Equal(t, reg, brd.i2cWritten[0])\n\tassert.Equal(t, val[0:32], brd.i2cWritten[1:])\n}\n\nfunc TestDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 0, a.DefaultI2cBus())\n}\n\nfunc TestGetI2cConnectionInvalidBus(t *testing.T) {\n\ta := NewAdaptor()\n\t_, err := a.GetI2cConnection(0x01, 99)\n\trequire.ErrorContains(t, err, \"invalid bus number 99, only 0 is supported\")\n}\n"
  },
  {
    "path": "platforms/firmata/tcp_firmata_adaptor.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage firmata\n\nimport (\n\t\"io\"\n\t\"net\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// TCPAdaptor represents a TCP based connection to a microcontroller running\n// WiFiFirmata\ntype TCPAdaptor struct {\n\t*Adaptor\n}\n\n// NewTCPAdaptor opens and uses a TCP connection to a microcontroller running\n// WiFiFirmata\nfunc NewTCPAdaptor(args ...interface{}) *TCPAdaptor {\n\taddress := args[0].(string) //nolint:forcetypeassert // ok here\n\n\ta := NewAdaptor(address)\n\ta.SetName(gobot.DefaultName(\"TCPFirmata\"))\n\ta.PortOpener = connect\n\n\treturn &TCPAdaptor{\n\t\tAdaptor: a,\n\t}\n}\n\nfunc connect(address string) (io.ReadWriteCloser, error) {\n\tdialer := net.Dialer{}\n\treturn dialer.Dial(\"tcp\", address)\n}\n"
  },
  {
    "path": "platforms/firmata/tcp_firmata_adaptor_test.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage firmata\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*TCPAdaptor)(nil)\n\nfunc initTestTCPAdaptor() *TCPAdaptor {\n\ta := NewTCPAdaptor(\"localhost:4567\")\n\treturn a\n}\n\nfunc TestFirmataTCPAdaptor(t *testing.T) {\n\ta := initTestTCPAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"TCPFirmata\"))\n}\n"
  },
  {
    "path": "platforms/friendlyelec/nanopct6/LICENSE",
    "content": "Copyright (c) 2025 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/friendlyelec/nanopct6/README.md",
    "content": "# FriendlyELEC NanoPC-T6\n\nThe FriendlyELEC NanoPC-T6 is a single board SoC computer based on the Rockchip RK3588 arm64 processor. It has built-in\nGPIO, I2C, PWM, SPI, 1-Wire, MIPI CSI and MIPI DSI interfaces.\n\nFor more info about the FriendlyELEC NanoPC-T6, go to [https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6](https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTested OS:\n\n* [armbian](https://www.armbian.com/nanopct6/) with \"Armbian 24.11.1 Bookworm Minimal / IOT\"\n\n## Configuration steps for the OS\n\n### System access and configuration basics\n\nPlease follow the instructions of the OS provider. A ssh access is used in this guide.\n\n```sh\nssh <user>@192.168.1.xxx\n```\n\n### Enabling hardware drivers\n\nNot all drivers are enabled by default. You can have a look at the configuration file, to find out what is enabled at\nyour system:\n\n```sh\ncat /boot/armbianEnv.txt\n```\n\n```sh\nsudo apt install armbian-config\nsudo armbian-config\n```\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := nanopct6.NewAdaptor()\nled := gpio.NewLedDriver(r, \"7\")\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=arm64 GOOS=linux go build -o output/ examples/nanopct6_blink.go\n```\n\nOnce you have compiled your code, you can upload your program and execute it on the board from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp nanopct6_blink <user>@192.168.1.xxx:~\nssh -t <user>@192.168.1.xxx \"./nanopct6_blink\"\n```\n\n## Troubleshooting\n"
  },
  {
    "path": "platforms/friendlyelec/nanopct6/adaptor.go",
    "content": "package nanopct6\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 8 // on 40 pin header\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor represents a Gobot Adaptor for the FriendlyELEC NanoPC-T6\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\t*adaptors.OneWireBusAdaptor\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex *sync.Mutex\n}\n\n// NewAdaptor creates a NanoPC-T6 Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\tadaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior\n//\tadaptors.WithGpioDebounce(pin, period): sets the input debouncer\n//\tadaptors.WithGpioEventOnFallingEdge/RaisingEdge/BothEdges(pin, handler): activate edge detection\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\t1-wire, see [adaptors.NewOneWireBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser()\n\ta := &Adaptor{\n\t\tname:  gobot.DefaultName(\"NanoPC-T6\"),\n\t\tsys:   sys,\n\t\tmutex: &sync.Mutex{},\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tvar oneWireBusOpts []adaptors.OneWireBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tcase adaptors.OneWireBusOptionApplier:\n\t\t\toneWireBusOpts = append(oneWireBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinDefinitions)\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions)\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, pwmPinDefinitions)\n\t// Valid bus numbers are [3,4,5,7,8] which corresponds to /dev/i2c-3, /dev/i2c-4 ...\n\t// needs to be enabled by DT-overlay: i2c3-m0, i2c4-m3, i2c5-m0, i2c8-m2\n\t// i2c7-m0 maybe shared with sound, so 0x?? is in use\n\t// We don't support /dev/i2c-0 (voltage regulator), /dev/i2c-1 (?), /dev/i2c-2 (voltage regulator),\n\t// /dev/i2c-6 (RTC, USB-C, EEPROM 24c02), /dev/i2c-9 (ddc), /dev/i2c-10 (ddc), /dev/i2c-11 (fde50000.dp).\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{3, 4, 5, 7, 8})\n\t// Valid bus numbers are [0,4] which corresponds to /dev/spidev0.x, /dev/spidev4.x\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 4})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, digitalPinTranslator.Translate, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, pwmPinTranslator.Translate, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\t// pin 16 needs to be activated by DT-overlay w1-gpio3-b3\n\ta.OneWireBusAdaptor = adaptors.NewOneWireBusAdaptor(sys, oneWireBusOpts...)\n\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.OneWireBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board, pins and bus\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.OneWireBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n"
  },
  {
    "path": "platforms/friendlyelec/nanopct6/adaptor_test.go",
    "content": "package nanopct6\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmDir           = \"/sys/devices/platform/febf0030.pwm/pwm/pwmchip7/\" //nolint:gosec // false positive\n\tpwmExportPath    = pwmDir + \"export\"\n\tpwmUnexportPath  = pwmDir + \"unexport\"\n\tpwmPwmDir        = pwmDir + \"pwm0/\"\n\tpwmEnablePath    = pwmPwmDir + \"enable\"\n\tpwmPeriodPath    = pwmPwmDir + \"period\"\n\tpwmDutyCyclePath = pwmPwmDir + \"duty_cycle\"\n\tpwmPolarityPath  = pwmPwmDir + \"polarity\"\n\n\tpwmInvertedIdentifier = \"inversed\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwmEnablePath,\n\tpwmPeriodPath,\n\tpwmDutyCyclePath,\n\tpwmPolarityPath,\n}\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc preparePwmFs(fs *system.MockFilesystem) {\n\tfs.Files[pwmEnablePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPolarityPath].Contents = pwmInvertedIdentifier\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := initConnectedTestAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\treturn a, fs\n}\n\nfunc initConnectedTestAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"NanoPC-T6\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.mutex)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip3\", \"10\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"gpiochip0\", \"20\", []int{3})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 3, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip3\", \"10\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip0\", \"20\"))\n}\n\nfunc TestDigitalIOSysfs(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewAdaptor(adaptors.WithGpioSysfsAccess())\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"\", \"106\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"\", \"20\", []int{4})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 4, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"106\"))\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"20\"))\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/class/thermal/thermal_zone0/temp\"].Contents = \"567\\n\"\n\tgot, err := a.AnalogRead(\"soc_thermal\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 567, got)\n\n\t_, err = a.AnalogRead(\"thermal_zone10\")\n\trequire.ErrorContains(t, err, \"'thermal_zone10' is not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"soc_thermal\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\trequire.NoError(t, a.DigitalWrite(\"7\", 1))\n\tdpa.UseUnexportError(\"gpiochip3\", \"10\")\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"unexport error\")\n}\n\nfunc TestFinalizeErrorAfterPWM(t *testing.T) {\n\t// indirect test for PWM.Finalize() is called for the adaptor\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tpreparePwmFs(fs)\n\trequire.NoError(t, a.PwmWrite(\"13\", 1))\n\tfs.WithWriteError = true\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, 8, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 8, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-4\"})\n\tcon, err := a.GetI2cConnection(0xff, 4)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/friendlyelec/nanopct6/doc.go",
    "content": "/*\nPackage nanopct6 contains the Gobot adaptor for the FriendlyELEC NanoPC-T6.\n\nFor further information refer to the boards README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/friendlyelec/nanopct6/README.md\n*/\npackage nanopct6 // import \"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopct6\"\n"
  },
  {
    "path": "platforms/friendlyelec/nanopct6/pinmap.go",
    "content": "package nanopct6\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// notes for character device\n// sysfs: Chip*32 + (A=0, B=8, C=16) + Nr\n// tested with cdev on a NanoPC-T6 2301 board: armbian Linux, OK: works, ?: unknown, NOK: not working\n// IN: works only as input, PU: if used as input, external pullup resistor needed\nvar gpioPinDefinitions = adaptors.DigitalPinDefinitions{\n\t\"10\":      {Sysfs: 20, Cdev: adaptors.CdevPin{Chip: 0, Line: 20}},  // GPIO0_C4_UART0_RX_M0 - OK\n\t\"8\":       {Sysfs: 21, Cdev: adaptors.CdevPin{Chip: 0, Line: 21}},  // GPIO0_C5_UART0_TX_M0_PWM4_M0 - OK\n\t\"32\":      {Sysfs: 22, Cdev: adaptors.CdevPin{Chip: 0, Line: 22}},  // GPIO0_C6_PWM5_M1 - OK\n\t\"27\":      {Sysfs: 32, Cdev: adaptors.CdevPin{Chip: 1, Line: 0}},   // GPIO1_A0_UART6_RX_M1 - OK\n\t\"28\":      {Sysfs: 33, Cdev: adaptors.CdevPin{Chip: 1, Line: 1}},   // GPIO1_A1_UART6_TX_M1 - OK (UP)\n\t\"15\":      {Sysfs: 39, Cdev: adaptors.CdevPin{Chip: 1, Line: 7}},   // GPIO1_A7 - OK\n\t\"26\":      {Sysfs: 40, Cdev: adaptors.CdevPin{Chip: 1, Line: 8}},   // GPIO1_B0 - OK\n\t\"21\":      {Sysfs: 41, Cdev: adaptors.CdevPin{Chip: 1, Line: 9}},   // GPIO1_B1_SPI0_MISO_M2 - OK (UP)\n\t\"19\":      {Sysfs: 42, Cdev: adaptors.CdevPin{Chip: 1, Line: 10}},  // GPIO1_B2_SPI0_MOSI_M2_UART4_RX_M2 - OK\n\t\"23\":      {Sysfs: 43, Cdev: adaptors.CdevPin{Chip: 1, Line: 11}},  // GPIO1_B3_SPI0_CLK_M2_UART4_TX_M2 - OK\n\t\"24\":      {Sysfs: 44, Cdev: adaptors.CdevPin{Chip: 1, Line: 12}},  // GPIO1_B4_SPI0_CS0_M2_UART7_RX_M2 - OK\n\t\"22\":      {Sysfs: 45, Cdev: adaptors.CdevPin{Chip: 1, Line: 13}},  // GPIO1_B5_SPI0_CS1_M0_UART7_TX_M2 - OK\n\t\"5\":       {Sysfs: 62, Cdev: adaptors.CdevPin{Chip: 1, Line: 30}},  // GPIO1_D6_I2C8_SCL_M2 - OK\n\t\"3\":       {Sysfs: 63, Cdev: adaptors.CdevPin{Chip: 1, Line: 31}},  // GPIO1_D7_I2C8_SDA_M2 - OK\n\t\"CSI1_11\": {Sysfs: 81, Cdev: adaptors.CdevPin{Chip: 2, Line: 17}},  // GPIO2_C1 - ?\n\t\"CSI1_12\": {Sysfs: 82, Cdev: adaptors.CdevPin{Chip: 2, Line: 18}},  // GPIO2_C2 - ?\n\t\"35\":      {Sysfs: 96, Cdev: adaptors.CdevPin{Chip: 3, Line: 0}},   // GPIO3_A0_SPI4_MISO_M1_I2S3_MCLK_PWM10_M0 - OK\n\t\"38\":      {Sysfs: 97, Cdev: adaptors.CdevPin{Chip: 3, Line: 1}},   // GPIO3_A1_SPI4_MOSI_M1_I2S3_SCLK - OK\n\t\"40\":      {Sysfs: 98, Cdev: adaptors.CdevPin{Chip: 3, Line: 2}},   // GPIO3_A2_SPI4_CLK_M1_UART8_TX_M1_I2S3_LRCK - OK\n\t\"36\":      {Sysfs: 99, Cdev: adaptors.CdevPin{Chip: 3, Line: 3}},   // GPIO3_A3_SPI4_CS0_M1_UART8_RX_M1_I2S3_SDO - OK\n\t\"37\":      {Sysfs: 100, Cdev: adaptors.CdevPin{Chip: 3, Line: 4}},  // GPIO3_A4_SPI4_CS1_M1_I2S3_SDI - OK\n\t\"DSI0_12\": {Sysfs: 102, Cdev: adaptors.CdevPin{Chip: 3, Line: 6}},  // GPIO3_A6 - ?\n\t\"33\":      {Sysfs: 104, Cdev: adaptors.CdevPin{Chip: 3, Line: 8}},  // GPIO3_B0_PWM9_M0 - OK\n\t\"DSI0_10\": {Sysfs: 105, Cdev: adaptors.CdevPin{Chip: 3, Line: 9}},  // GPIO3_B1_PWM2_M1 - ?\n\t\"7\":       {Sysfs: 106, Cdev: adaptors.CdevPin{Chip: 3, Line: 10}}, // GPIO3_B2_I2S2_SDI_M1 - OK\n\t\"16\":      {Sysfs: 107, Cdev: adaptors.CdevPin{Chip: 3, Line: 11}}, // GPIO3_B3_I2S2_SDO_M1 - OK\n\t\"18\":      {Sysfs: 108, Cdev: adaptors.CdevPin{Chip: 3, Line: 12}}, // GPIO3_B4_I2S2_MCLK_M1 - OK\n\t\"29\":      {Sysfs: 109, Cdev: adaptors.CdevPin{Chip: 3, Line: 13}}, // GPIO3_B5_UART3_TX_M1_I2S2_SCLK_M1_PWM12_M0 - OK\n\t\"31\":      {Sysfs: 110, Cdev: adaptors.CdevPin{Chip: 3, Line: 14}}, // GPIO3_B6_UART3_RX_M1_I2S2_LRCK_M1_PWM13_M0 - OK\n\t\"12\":      {Sysfs: 111, Cdev: adaptors.CdevPin{Chip: 3, Line: 15}}, // GPIO3_B7 - OK (UP)\n\t\"DSI0_8\":  {Sysfs: 112, Cdev: adaptors.CdevPin{Chip: 3, Line: 16}}, // GPIO3_C0 - ?\n\t\"DSI0_14\": {Sysfs: 113, Cdev: adaptors.CdevPin{Chip: 3, Line: 17}}, // GPIO3_C1 - ?\n\t\"11\":      {Sysfs: 114, Cdev: adaptors.CdevPin{Chip: 3, Line: 18}}, // GPIO3_C2_PWM14_M0 - OK\n\t\"13\":      {Sysfs: 115, Cdev: adaptors.CdevPin{Chip: 3, Line: 19}}, // GPIO3_C3_PWM15_IR_M0 - OK\n\t\"DSI1_10\": {Sysfs: 125, Cdev: adaptors.CdevPin{Chip: 3, Line: 29}}, // GPIO3_D5_PWM11_M3 - ?\n\t\"DSI1_8\":  {Sysfs: 128, Cdev: adaptors.CdevPin{Chip: 4, Line: 0}},  // GPIO4_A0 - ?\n\t\"DSI1_14\": {Sysfs: 129, Cdev: adaptors.CdevPin{Chip: 4, Line: 1}},  // GPIO4_A1 - ?\n\t\"DSI1_12\": {Sysfs: 131, Cdev: adaptors.CdevPin{Chip: 4, Line: 3}},  // GPIO4_A3 - ?\n\t\"CSI0_11\": {Sysfs: 148, Cdev: adaptors.CdevPin{Chip: 4, Line: 20}}, // GPIO4_C4 - ?\n\t\"CSI0_12\": {Sysfs: 149, Cdev: adaptors.CdevPin{Chip: 4, Line: 21}}, // GPIO4_C5 - ?\n}\n\nvar pwmPinDefinitions = adaptors.PWMPinDefinitions{\n\t// needs to be enabled by DT-overlay pwm2-m1 (pwm2 = \"/pwm@fd8b0020\";)\n\t\"DSI0_10\": {Dir: \"/sys/devices/platform/fd8b0020.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm4-m0 (pwm4 = \"/pwm@febd0000\";)\n\t\"8\": {Dir: \"/sys/devices/platform/febd0000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm5-m1 (pwm5 = \"/pwm@febd0010\";)\n\t\"32\": {Dir: \"/sys/devices/platform/febd0010.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm9-m0 (pwm9 = \"/pwm@febe0010\";)\n\t\"33\": {Dir: \"/sys/devices/platform/febe0010.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm10-m0 (pwm10 = \"/pwm@febe0020\";)\n\t\"35\": {Dir: \"/sys/devices/platform/febe0020.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm11-m3 (pwm11 = \"/pwm@febe0030\";)\n\t\"DSI1_10\": {Dir: \"/sys/devices/platform/febe0030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm12-m0 (pwm12 = \"/pwm@febf0000\";)\n\t\"29\": {Dir: \"/sys/devices/platform/febf0000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm13-m0  (pwm13 = \"/pwm@febf0010\";)\n\t\"31\": {Dir: \"/sys/devices/platform/febf0010.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm14-m0 (pwm14 = \"/pwm@febf0020\";)\n\t\"11\": {Dir: \"/sys/devices/platform/febf0020.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm15-m0 (pwm15 = \"/pwm@febf0030\";)\n\t\"13\": {Dir: \"/sys/devices/platform/febf0030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n}\n\nvar analogPinDefinitions = adaptors.AnalogPinDefinitions{\n\t// +/-273.200 °C need >=7 characters to read: +/-273200 millidegree Celsius\n\t// names equals /sys/class/thermal/thermal_zone*/hwmon*/name\n\t\"soc_thermal\":        {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n\t\"bigcore0_thermal\":   {Path: \"/sys/class/thermal/thermal_zone1/temp\", W: false, ReadBufLen: 7},\n\t\"bigcore1_thermal\":   {Path: \"/sys/class/thermal/thermal_zone2/temp\", W: false, ReadBufLen: 7},\n\t\"littlecore_thermal\": {Path: \"/sys/class/thermal/thermal_zone3/temp\", W: false, ReadBufLen: 7},\n\t\"center_thermal\":     {Path: \"/sys/class/thermal/thermal_zone4/temp\", W: false, ReadBufLen: 7},\n\t\"gpu_thermal\":        {Path: \"/sys/class/thermal/thermal_zone5/temp\", W: false, ReadBufLen: 7},\n\t\"npu_thermal\":        {Path: \"/sys/class/thermal/thermal_zone6/temp\", W: false, ReadBufLen: 7},\n}\n"
  },
  {
    "path": "platforms/friendlyelec/nanopi/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/friendlyelec/nanopi/README.md",
    "content": "# NanoPi Boards\n\nThe FriendlyELEC NanoPi Boards are single board SoC computers with different hardware design. It has built-in GPIO, PWM,\nSPI, and I2C interfaces.\n\nFor more info about the NanoPi Boards, go to [https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTested OS:\n\n* [armbian](https://www.armbian.com/nanopi-neo/) with Debian or Ubuntu\n\n### System access and configuration basics\n\nPlease follow the installation instructions for the chosen OS.\n\n### Enabling hardware drivers\n\nPlease follow the configuration instructions for the chosen OS.\n\nE.g. for armbian:\n\n```sh\nsudo armbian-config\n```\n\nAfter configuration was changed, an reboot is necessary.\n\n```sh\nsudo reboot\n```\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := nanopi.NewNeoAdaptor()\nled := gpio.NewLedDriver(r, \"7\")\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARM=7 GOARCH=arm GOOS=linux go build -o output/ examples/nanopi_blink.go\n```\n\nOnce you have compiled your code, you can upload your program and execute it on the board from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp output/nanopi_blink nan@nanopineo:~\nssh -t nan@nanopineo \"./nanopi_blink\"\n```\n\n## GPIO's\n\nAt least for NEO, nearly all 14 GPIO's supports the advanced pin options \"bias\", \"drive\", \"debounce\" and \"edge detection\".\n\n> Configure of edge detection will cause an initial event. GPIO header pins 19, 21, 23, 24 - do NOT support \"debounce\" and\n> \"edge detection\" for NEO. Using unsupported options leads to reconfigure errors with text \"no such device or address\".\n\n## PWM\n\nA single PWM output is available at UART0-RX (UART_RXD0, internal PA5). So the UART0 needs to be disabled. The sunxi-\noverlay (e.g. for armbian) disables the UART0 and the kernel console at ttyS0. The related kernel module needs to be\nloaded: `sudo modprobe pwm-sun4i`. The default frequency is 100Hz.\n\n## I2C\n\nThe default bus number is set to 0, which is connected to header pins 3 (PA12-SDA) and 5 (PA11-SCL). At least for NEO\nrev.1.4 it is possible to activate bus 1, which is connected to \"USB/Audio/IR\" header pins 9 \"PCM0_CLK/I2S0_BCK\"\n(PA19-SDA) and 8 \"PCM0_SYNC/I2S0_LRC\" (PA18-SCL). Armbian allows to activate bus 2 (PE12-SCL, PE13-SDA), which pins are\nnot wired for NEO and NEO2, but we do not block it at adaptor side.\n\n## SPI\n\nThere is a known issue on [armbian](https://forum.armbian.com/topic/20033-51525-breaks-spi-on-nanopi-neo-and-does-not-create-devspidev00/)\nfor later Kernels.\n"
  },
  {
    "path": "platforms/friendlyelec/nanopi/adaptor.go",
    "content": "package nanopi\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 0\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor represents a Gobot Adaptor for the FriendlyELEC NanoPi Boards\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex sync.Mutex\n}\n\n// NewNeoAdaptor creates a board adaptor for NanoPi NEO\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\tadaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior\n//\tadaptors.WithGpioDebounce(pin, period): sets the input debouncer\n//\tadaptors.WithGpioEventOnFallingEdge/RaisingEdge/BothEdges(pin, handler): activate edge detection\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewNeoAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser()\n\ta := &Adaptor{\n\t\tname: gobot.DefaultName(\"NanoPi NEO Board\"),\n\t\tsys:  sys,\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinDefinitions)\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, neoDigitalPinDefinitions)\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, neoPWMPinDefinitions)\n\t// Valid bus numbers are [0..2] which corresponds to /dev/i2c-0 through /dev/i2c-2.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1, 2})\n\t// Valid bus numbers are [0] which corresponds to /dev/spidev0.x\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, digitalPinTranslator.Translate, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, pwmPinTranslator.Translate, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board, pins and bus\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "platforms/friendlyelec/nanopi/adaptor_test.go",
    "content": "package nanopi\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmDir           = \"/sys/devices/platform/soc/1c21400.pwm/pwm/pwmchip0/\" //nolint:gosec // false positive\n\tpwmExportPath    = pwmDir + \"export\"\n\tpwmUnexportPath  = pwmDir + \"unexport\"\n\tpwmPwmDir        = pwmDir + \"pwm0/\"\n\tpwmEnablePath    = pwmPwmDir + \"enable\"\n\tpwmPeriodPath    = pwmPwmDir + \"period\"\n\tpwmDutyCyclePath = pwmPwmDir + \"duty_cycle\"\n\tpwmPolarityPath  = pwmPwmDir + \"polarity\"\n\n\tpwmInvertedIdentifier = \"inversed\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwmEnablePath,\n\tpwmPeriodPath,\n\tpwmDutyCyclePath,\n\tpwmPolarityPath,\n}\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ gpio.ServoWriter            = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc preparePwmFs(fs *system.MockFilesystem) {\n\tfs.Files[pwmEnablePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPolarityPath].Contents = pwmInvertedIdentifier\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := initConnectedTestAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\treturn a, fs\n}\n\nfunc initConnectedTestAdaptor() *Adaptor {\n\ta := NewNeoAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewNeoAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"NanoPi NEO Board\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewNeoAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip0\", \"203\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"gpiochip0\", \"199\", []int{2})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 2, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip0\", \"203\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip0\", \"199\"))\n}\n\nfunc TestDigitalIOSysfs(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewNeoAdaptor(adaptors.WithGpioSysfsAccess())\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"\", \"203\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"\", \"199\", []int{2})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 2, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"203\"))\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"199\"))\n}\n\nfunc TestAnalog(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/class/thermal/thermal_zone0/temp\"].Contents = \"567\\n\"\n\tgot, err := a.AnalogRead(\"thermal_zone0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 567, got)\n\n\t_, err = a.AnalogRead(\"thermal_zone10\")\n\trequire.ErrorContains(t, err, \"'thermal_zone10' is not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"thermal_zone0\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\trequire.NoError(t, a.DigitalWrite(\"7\", 1))\n\tdpa.UseUnexportError(\"gpiochip0\", \"203\")\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"unexport error\")\n}\n\nfunc TestFinalizeErrorAfterPWM(t *testing.T) {\n\t// indirect test for PWM.Finalize() is called for the adaptor\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tpreparePwmFs(fs)\n\trequire.NoError(t, a.PwmWrite(\"PWM\", 1))\n\tfs.WithWriteError = true\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewNeoAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, 8, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewNeoAdaptor()\n\tassert.Equal(t, 0, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewNeoAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-1\"})\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 1)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/friendlyelec/nanopi/doc.go",
    "content": "/*\nPackage nanopi contains the Gobot adaptor for the FriendlyELEC NanoPi Boards.\n\nFor further information refer to nanopi README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/friendlyelec/nanopi/README.md\n*/\npackage nanopi // import \"gobot.io/x/gobot/v2/platforms/friendlyelec/nanopi\"\n"
  },
  {
    "path": "platforms/friendlyelec/nanopi/neo_pinmap.go",
    "content": "package nanopi\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// pin definition for NanoPi NEO\n// pins: A=0+Nr, C=64+Nr, G=192+Nr\nvar neoDigitalPinDefinitions = adaptors.DigitalPinDefinitions{\n\t\"11\": {Sysfs: 0, Cdev: adaptors.CdevPin{Chip: 0, Line: 0}},     // UART2_TX/GPIOA0\n\t\"22\": {Sysfs: 1, Cdev: adaptors.CdevPin{Chip: 0, Line: 1}},     // UART2_RX/GPIOA1\n\t\"13\": {Sysfs: 2, Cdev: adaptors.CdevPin{Chip: 0, Line: 2}},     // UART2_RTS/GPIOA2\n\t\"15\": {Sysfs: 3, Cdev: adaptors.CdevPin{Chip: 0, Line: 3}},     // UART2_CTS/GPIOA3\n\t\"12\": {Sysfs: 6, Cdev: adaptors.CdevPin{Chip: 0, Line: 6}},     // GPIOA6\n\t\"19\": {Sysfs: 64, Cdev: adaptors.CdevPin{Chip: 0, Line: 64}},   // SPI0_SDO/GPIOC0\n\t\"21\": {Sysfs: 65, Cdev: adaptors.CdevPin{Chip: 0, Line: 65}},   // SPI0_SDI/GPIOC1\n\t\"23\": {Sysfs: 66, Cdev: adaptors.CdevPin{Chip: 0, Line: 66}},   // SPI0_CLK/GPIOC2\n\t\"24\": {Sysfs: 67, Cdev: adaptors.CdevPin{Chip: 0, Line: 67}},   // SPI0_CS/GPIOC3\n\t\"8\":  {Sysfs: 198, Cdev: adaptors.CdevPin{Chip: 0, Line: 198}}, // UART1_TX/GPIOG6\n\t\"10\": {Sysfs: 199, Cdev: adaptors.CdevPin{Chip: 0, Line: 199}}, // UART1_RX/GPIOG7\n\t\"16\": {Sysfs: 200, Cdev: adaptors.CdevPin{Chip: 0, Line: 200}}, // UART1_RTS/GPIOG8\n\t\"18\": {Sysfs: 201, Cdev: adaptors.CdevPin{Chip: 0, Line: 201}}, // UART1_CTS/GPIOG9\n\t\"7\":  {Sysfs: 203, Cdev: adaptors.CdevPin{Chip: 0, Line: 203}}, // GPIOG11\n}\n\nvar neoPWMPinDefinitions = adaptors.PWMPinDefinitions{\n\t// UART_RXD0, GPIOA5, PWM\n\t\"PWM\": {Dir: \"/sys/devices/platform/soc/1c21400.pwm/pwm/\", DirRegexp: \"pwmchip[0]$\", Channel: 0},\n}\n\nvar analogPinDefinitions = adaptors.AnalogPinDefinitions{\n\t// +/-273.200 °C need >=7 characters to read: +/-273200 millidegree Celsius\n\t\"thermal_zone0\": {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n}\n"
  },
  {
    "path": "platforms/holystone/README.md",
    "content": "# Holystone\n\nThis package contains the Gobot drivers for the various Holystone (http://www.holystone.com/) drones.\n\nThis package currently supports the following drones:\n- [Holystone HS200](http://www.holystone.com/product/Holy_Stone_HS200W_FPV_Drone_with_720P_HD_Live_Video_Wifi_Camera_2_4GHz_4CH_6_Axis_Gyro_RC_Quadcopter_with_Altitude_Hold,_Gravity_Sensor_and_Headless_Mode_Function_RTF,_Color_Red-39.html)\n\n"
  },
  {
    "path": "platforms/holystone/holystone.go",
    "content": "// Package holystone contains the Gobot drivers for the Holystone drones.\n// Currently only have support for the HS200 drone.\n// For more information, go to:\n// http://www.holystone.com/product/Holy_Stone_HS200W_FPV_Drone_with_720P_HD_Live_Video_Wifi_Camera_2_4GHz_4CH_6_Axis_Gyro_RC_Quadcopter_with_Altitude_Hold,_Gravity_Sensor_and_Headless_Mode_Function_RTF,_Color_Red-39.html\n//\n//nolint:lll // ok here\npackage holystone // import \"gobot.io/x/gobot/v2/platforms/holystone\"\n"
  },
  {
    "path": "platforms/holystone/hs200/README.md",
    "content": "# Holystone HS200\n\nThis package contains the Gobot driver for the Holystone HS200 drone.\n\nFor more information on this drone, go to:\n<http://www.holystone.com/product/Holy_Stone_HS200W_FPV_Drone_with_720P_HD_Live_Video_Wifi_Camera_2_4GHz_4CH_6_Axis_Gyro_RC_Quadcopter_with_Altitude_Hold,_Gravity_Sensor_and_Headless_Mode_Function_RTF,_Color_Red-39.html>\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n- Connect to the drone's Wi-Fi network and identify the drone/gateway IP address.\n- Use that IP address when you create a new driver.\n- Some drones appear to use a different TCP port (8080 vs. 8888?).  If the example doesn't work scan the drone for open\n  ports or modify the driver not to use TCP.\n\nHere is a sample of how you initialize and use the driver:\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/holystone/hs200\"\n)\n\nfunc main() {\n  drone := hs200.NewDriver(\"172.16.10.1:8888\", \"172.16.10.1:8080\")\n\n  work := func() {\n    drone.TakeOff()\n\n    gobot.After(5*time.Second, func() {\n      drone.Land()\n    })\n  }\n\n  robot := gobot.NewRobot(\"hs200\",\n    []gobot.Connection{},\n    []gobot.Device{drone},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## References\n\n<https://hackaday.io/project/19356/logs>\n\n<https://github.com/lancecaraccioli/holystone-hs110w>\n\n## Random notes\n\n- The hs200 sends out an RTSP video feed from its own board camera.  Not clear how this is turned on.  The data is\n  apparently streamed over UDP. (Reference mentions rtsp://192.168.0.1/0 in VLC, I didn't try it!)\n- The Android control app seems to be sending out the following TCP bytes for an unknown purpose:\n  `00 01 02 03 04 05 06 07 08 09 25 25` but the drone flies without a TCP connection.\n- The drone apparently always replies \"noact\\r\\n\" over TCP.\n- The app occasionally sends out 29 bytes long UDP packets besides the 11 byte control packet for an unknown purpose:\n  `26 e1 07 00 00 07 00 00 00 10 00 00 00 00 00 00 00 14 00 00 00 0e 00 00 00 03 00 00 00`\n- The doesn't seem to be any telemetry coming out of the drone besides the video feed.\n- The drone can sometimes be a little flaky.  Ensure you've got a fully charged battery, minimal Wi-Fi interference,\n  various connectors on the drone all well seated.\n- It's not clear whether the drone's remote uses Wi-Fi or not, possibly Wi-Fi is only for the mobile app.\n"
  },
  {
    "path": "platforms/holystone/hs200/doc.go",
    "content": "// Package hs200 is the Gobot driver for the Holystone HS200 drone.\npackage hs200 // import \"gobot.io/x/gobot/v2/platforms/holystone/hs200\"\n"
  },
  {
    "path": "platforms/holystone/hs200/hs200_driver.go",
    "content": "package hs200\n\nimport (\n\t\"net\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Driver represents the control information for the hs200 drone\ntype Driver struct {\n\tname       string\n\tmutex      *sync.RWMutex // Protect the command from concurrent access\n\tstopc      chan struct{} // Stop the flight loop goroutine\n\tcmd        []byte        // the UDP command packet we keep sending the drone\n\tenabled    bool          // Are we in an enabled state\n\ttcpaddress string\n\tudpaddress string\n\tudpconn    net.Conn // UDP connection to the drone\n\ttcpconn    net.Conn // TCP connection to the drone\n}\n\n// NewDriver creates a driver for the HolyStone hs200\nfunc NewDriver(tcpaddress string, udpaddress string) *Driver {\n\tcommand := []byte{\n\t\t0xff, // 2 byte header\n\t\t0x04,\n\n\t\t// Left joystick\n\t\t0x7e, // throttle 0x00 - 0xff(?)\n\t\t0x3f, // rotate left/right\n\n\t\t// Right joystick\n\t\t0xc0, // forward / backward 0x80 - 0xfe(?)\n\t\t0x3f, // left / right 0x00 - 0x7e(?)\n\n\t\t// Trim\n\t\t0x90, // ? yaw (used as a setting to trim the yaw of the uav)\n\t\t0x10, // ? pitch (used as a setting to trim the pitch of the uav)\n\t\t0x10, // ? roll (used as a setting to trim the roll of the uav)\n\n\t\t0x00, // flags/buttons\n\t\t0x00, // checksum; 255 - ((sum of flight controls from index 1 to 9) % 256)\n\t}\n\tcommand[10] = checksum(command)\n\n\treturn &Driver{\n\t\tname: gobot.DefaultName(\"HS200\"), stopc: make(chan struct{}),\n\t\ttcpaddress: tcpaddress, udpaddress: udpaddress, cmd: command, mutex: &sync.RWMutex{},\n\t}\n}\n\n// Name returns the name of the device.\nfunc (d *Driver) Name() string { return d.name }\n\n// SetName sets the name of the device.\nfunc (d *Driver) SetName(n string) { d.name = n }\n\n// Connection returns the Connection of the device.\nfunc (d *Driver) Connection() gobot.Connection { return nil }\n\n// Start starts the driver.\nfunc (d *Driver) Start() error {\n\tdialer := net.Dialer{}\n\ttc, terr := dialer.Dial(\"tcp\", d.tcpaddress)\n\tif terr != nil {\n\t\treturn terr\n\t}\n\tuc, uerr := dialer.Dial(\"udp4\", d.udpaddress)\n\tif uerr != nil {\n\t\treturn uerr\n\t}\n\n\td.udpconn = uc\n\td.tcpconn = tc\n\n\treturn nil\n}\n\n// Halt stops the driver.\nfunc (d *Driver) Halt() error {\n\td.stop()\n\treturn nil\n}\n\nfunc (d *Driver) stop() {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\td.enabled = false\n}\n\nfunc (d *Driver) flightLoop(stopc chan struct{}) {\n\tudpTick := time.NewTicker(50 * time.Millisecond)\n\tdefer udpTick.Stop()\n\ttcpTick := time.NewTicker(1000 * time.Millisecond)\n\tdefer tcpTick.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-udpTick.C:\n\t\t\td.sendUDP()\n\t\tcase <-tcpTick.C:\n\t\t\t// Send TCP commands from here once we figure out what they do...\n\t\tcase <-stopc:\n\t\t\td.stop()\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc checksum(c []byte) byte {\n\tvar sum byte\n\tfor i := 1; i < 10; i++ {\n\t\tsum += c[i]\n\t}\n\treturn 255 - sum\n}\n\nfunc (d *Driver) sendUDP() {\n\td.mutex.RLock()\n\tdefer d.mutex.RUnlock()\n\n\tif _, err := d.udpconn.Write(d.cmd); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Enable enables the drone to start flying.\nfunc (d *Driver) Enable() {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\tif !d.enabled {\n\t\tgo d.flightLoop(d.stopc)\n\t\td.enabled = true\n\t}\n}\n\n// Disable disables the drone from flying.\nfunc (d *Driver) Disable() {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\tif d.enabled {\n\t\td.stopc <- struct{}{}\n\t}\n}\n\n// TakeOff tells drones to liftoff and start flying.\nfunc (d *Driver) TakeOff() {\n\td.mutex.Lock()\n\td.cmd[9] = 0x40\n\td.cmd[10] = checksum(d.cmd)\n\td.mutex.Unlock()\n\ttime.Sleep(500 * time.Millisecond)\n\td.mutex.Lock()\n\td.cmd[9] = 0x04\n\td.cmd[10] = checksum(d.cmd)\n\td.mutex.Unlock()\n}\n\n// Land tells drone to come in for landing.\nfunc (d *Driver) Land() {\n\td.mutex.Lock()\n\td.cmd[9] = 0x80\n\td.cmd[10] = checksum(d.cmd)\n\td.mutex.Unlock()\n\ttime.Sleep(500 * time.Millisecond)\n\td.mutex.Lock()\n\td.cmd[9] = 0x04\n\td.cmd[10] = checksum(d.cmd)\n\td.mutex.Unlock()\n}\n\n// floatToCmdByte converts a float in the range of -1 to +1 to an integer command\nfunc floatToCmdByte(cmd float32, mid byte, maxv byte) byte {\n\tif cmd > 1.0 {\n\t\tcmd = 1.0\n\t}\n\tif cmd < -1.0 {\n\t\tcmd = -1.0\n\t}\n\tcmd = cmd * float32(maxv)\n\tbval := byte(cmd + float32(mid) + 0.5)\n\treturn bval\n}\n\n// Throttle sends the drone up from a hover (or down if speed is negative)\nfunc (d *Driver) Throttle(speed float32) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\td.cmd[2] = floatToCmdByte(speed, 0x7e, 0x7e)\n\td.cmd[10] = checksum(d.cmd)\n}\n\n// Rotate rotates the drone (yaw)\nfunc (d *Driver) Rotate(speed float32) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\td.cmd[3] = floatToCmdByte(speed, 0x3f, 0x3f)\n\td.cmd[10] = checksum(d.cmd)\n}\n\n// Forward sends the drone forward (or backwards if speed is negative, pitch the drone)\nfunc (d *Driver) Forward(speed float32) {\n\tspeed = -speed\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\td.cmd[4] = floatToCmdByte(speed, 0xc0, 0x3f)\n\td.cmd[10] = checksum(d.cmd)\n}\n\n// Right moves the drone to the right (or left if speed is negative, rolls the drone)\nfunc (d *Driver) Right(speed float32) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\td.cmd[5] = floatToCmdByte(speed, 0x3f, 0x3f)\n\td.cmd[10] = checksum(d.cmd)\n}\n"
  },
  {
    "path": "platforms/holystone/hs200/hs200_driver_test.go",
    "content": "package hs200\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc TestHS200Driver(t *testing.T) {\n\td := NewDriver(\"127.0.0.1:8080\", \"127.0.0.1:9090\")\n\n\tassert.Equal(t, \"127.0.0.1:8080\", d.tcpaddress)\n\tassert.Equal(t, \"127.0.0.1:9090\", d.udpaddress)\n}\n"
  },
  {
    "path": "platforms/intel-iot/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/intel-iot/README.md",
    "content": "# Intel IoT\n\nThis package contains the Gobot adaptor for the [Intel Edison](http://www.intel.com/content/www/us/en/do-it-yourself/edison.html) and [Intel Joule](http://intel.com/joule) IoT platforms.\n\nThis package currently supports the following Intel IoT hardware:\n- Intel Edison with the Arduino breakout board\n- Intel Joule Developer Kit\n"
  },
  {
    "path": "platforms/intel-iot/curie/README.md",
    "content": "# Curie\n\nThe Intel Curie is a tiny computer for the Internet of Things. It is the processor used by the [Arduino/Genuino 101](https://www.arduino.cc/en/Main/ArduinoBoard101)\nand the [Intel TinyTILE](https://software.intel.com/en-us/node/675623).\n\nIn addition to the GPIO, ADC, and I2C hardware interfaces, the Curie also has a built-in Inertial Measurement Unit (IMU),\nincluding an accelerometer, gyroscope, and thermometer.\n\nFor more info about the Intel Curie platform go to: [https://www.intel.com/content/www/us/en/products/boards-kits/curie.html](https://www.intel.com/content/www/us/en/products/boards-kits/curie.html).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nYou would normally install Go and Gobot on your computer. When you execute the Gobot program code, it communicates with\nthe connected microcontroller using the [Firmata protocol](https://github.com/firmata/protocol), either using a serial\nport, or the Bluetooth LE wireless interface.\n\n## How To Use\n\n```go\npackage main\n\nimport (\n  \"log\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/firmata\"\n  \"gobot.io/x/gobot/v2/platforms/intel-iot/curie\"\n)\n\nfunc main() {\n  firmataAdaptor := firmata.NewAdaptor(\"/dev/ttyACM0\")\n  led := gpio.NewLedDriver(firmataAdaptor, \"13\")\n  imu := curie.NewIMUDriver(firmataAdaptor)\n\n  work := func() {\n    _ = imu.On(\"Accelerometer\", func(data interface{}) {\n      log.Println(\"Accelerometer\", data)\n    })\n\n    _ = imu.On(\"Gyroscope\", func(data interface{}) {\n      log.Println(\"Gyroscope\", data)\n    })\n\n    _ = imu.On(\"Temperature\", func(data interface{}) {\n      log.Println(\"Temperature\", data)\n    })\n\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n\n    gobot.Every(100*time.Millisecond, func() {\n      imu.ReadAccelerometer()\n      imu.ReadGyroscope()\n      imu.ReadTemperature()\n    })\n  }\n\n  robot := gobot.NewRobot(\"curieBot\",\n    []gobot.Connection{firmataAdaptor},\n    []gobot.Device{imu, led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n    panic(err)\n  }\n}\n```\n\n## How to Connect\n\n### Installing Firmware\n\nYou need to flash your Intel Curie with firmware that uses ConfigurableFirmata along with the FirmataCurieIMU plugin.\nThere are 2 versions of this firmware, once that allows connecting using the serial interface, the other using a\nBluetooth LE connection.\n\nTo setup your Arduino environment:\n\n- Install the latest Arduino, if you have not done so yet.\n- Install the \"Intel Curie Boards\" board files using the \"Board Manager\". You can find it in the Arduino IDE under the\n  \"Tools\" menu. Choose \"Boards > Boards Manager\".\n- Search for the \"Intel Curie Boards\" package in the \"Boards Manager\" dialog, and then install the latest version.\n- Follow the [installation instructions](https://github.com/firmata/ConfigurableFirmata#installation) for the\n  ConfigurableFirmata library\n- Download the ZIP file for the FirmataCurieIMU library. You can download the latest version of FirmataCurieIMU from here:\n  [https://github.com/intel-iot-devkit/firmata-curie-imu/archive/master.zip](https://github.com/intel-iot-devkit/firmata-curie-imu/archive/master.zip)\n- Once you have downloaded the FirmataCurieIMU library, install it by using the \"Library Manager\". You can find it in the\n  Arduino IDE under the \"Sketch\" menu. Choose \"Include Library > Add .ZIP Library\". Select the ZIP file for the FirmataCurieIMU\n  library that you just downloaded.\n- Linux only: On some Linux distributions, additional device rules are required in order to connect to the board. Run the\n  following command then unplug the board and plug it back in before proceeding:\n\n  ```sh\n  curl -sL https://raw.githubusercontent.com/01org/corelibs-arduino101/master/scripts/create_dfu_udev_rule | sudo -E bash -\n  ```\n\nNow you are ready to install your firmware. You must decide if you want to connect via the serial port, or using\nBluetooth LE.\n\n### Serial Port\n\nTo use your Intel Curie connected via serial port, you should use the sketch located here:\n\n[https://github.com/intel-iot-devkit/firmata-curie-imu/blob/master/examples/everythingIMU/everythingIMU.ino](https://github.com/intel-iot-devkit/firmata-curie-imu/blob/master/examples/everythingIMU/everythingIMU.ino)\n\nOnce you have loaded this sketch on your Intel Curie, you can run your Gobot code to communicate with it. Leave your\nArduino 101 or TinyTILE connected using the serial cable that you used to flash the firmware, and refer to that same serial\nport name in your Gobot code.\n\n### Bluetooth LE\n\nTo use your Intel Curie connected via Bluetooth LE, you should use the sketch located here:\n\n[https://github.com/intel-iot-devkit/firmata-curie-imu/blob/master/examples/bleIMU/bleIMU.ino](https://github.com/intel-iot-devkit/firmata-curie-imu/blob/master/examples/bleIMU/bleIMU.ino)\n\nOnce you have loaded this sketch on your Intel Curie, you can run your Gobot code to communicate with it.\n\nPower up your Arduino 101 or TinyTILE using a battery or other power source, and connect using the BLE address or name.\nThe default BLE name is \"FIRMATA\".\n"
  },
  {
    "path": "platforms/intel-iot/curie/doc.go",
    "content": "/*\nPackage curie contains the Gobot driver for the Intel Curie IMU.\n\nFor further information refer to intel-iot README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/intel-iot/curie/README.md\n*/\npackage curie // import \"gobot.io/x/gobot/v2/platforms/intel-iot/curie\"\n"
  },
  {
    "path": "platforms/intel-iot/curie/imu_driver.go",
    "content": "package curie\n\nimport (\n\t\"errors\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n)\n\nconst (\n\tCURIE_IMU              = 0x11\n\tCURIE_IMU_READ_ACCEL   = 0x00\n\tCURIE_IMU_READ_GYRO    = 0x01\n\tCURIE_IMU_READ_TEMP    = 0x02\n\tCURIE_IMU_SHOCK_DETECT = 0x03\n\tCURIE_IMU_STEP_COUNTER = 0x04\n\tCURIE_IMU_TAP_DETECT   = 0x05\n\tCURIE_IMU_READ_MOTION  = 0x06\n)\n\n// AccelerometerData is what gets returned with the \"Accelerometer\" event.\ntype AccelerometerData struct {\n\tX int16\n\tY int16\n\tZ int16\n}\n\n// GyroscopeData is what gets returned with the \"Gyroscope\" event.\ntype GyroscopeData struct {\n\tX int16\n\tY int16\n\tZ int16\n}\n\n// ShockData is what gets returned with the \"Shock\" event.\ntype ShockData struct {\n\tAxis      byte\n\tDirection byte\n}\n\n// TapData is what gets returned with the \"Tap\" event.\ntype TapData struct {\n\tAxis      byte\n\tDirection byte\n}\n\n// MotionData is what gets returned with the \"Motion\" event.\ntype MotionData struct {\n\tAX int16\n\tAY int16\n\tAZ int16\n\tGX int16\n\tGY int16\n\tGZ int16\n}\n\n// IMUDriver represents the IMU that is built-in to the Curie\ntype IMUDriver struct {\n\tgobot.Eventer\n\n\tname       string\n\tconnection *firmata.Adaptor\n}\n\n// NewIMUDriver returns a new IMUDriver\nfunc NewIMUDriver(a *firmata.Adaptor) *IMUDriver {\n\timu := &IMUDriver{\n\t\tname:       gobot.DefaultName(\"CurieIMU\"),\n\t\tconnection: a,\n\t\tEventer:    gobot.NewEventer(),\n\t}\n\n\treturn imu\n}\n\n// Start starts up the IMUDriver\nfunc (imu *IMUDriver) Start() error {\n\treturn imu.connection.On(\"SysexResponse\", func(res interface{}) {\n\t\t//nolint:forcetypeassert // ok here\n\t\tdata := res.([]byte)\n\t\tif err := imu.handleEvent(data); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t})\n}\n\n// Halt stops the IMUDriver\nfunc (imu *IMUDriver) Halt() error { return nil }\n\n// Name returns the IMUDrivers name\nfunc (imu *IMUDriver) Name() string { return imu.name }\n\n// SetName sets the IMUDrivers name\nfunc (imu *IMUDriver) SetName(n string) { imu.name = n }\n\n// Connection returns the IMUDrivers Connection\nfunc (imu *IMUDriver) Connection() gobot.Connection { return imu.connection }\n\n// ReadAccelerometer calls the Curie's built-in accelerometer. The result will\n// be returned by the Sysex response message\nfunc (imu *IMUDriver) ReadAccelerometer() error {\n\treturn imu.connection.WriteSysex([]byte{CURIE_IMU, CURIE_IMU_READ_ACCEL})\n}\n\n// ReadGyroscope calls the Curie's built-in gyroscope. The result will\n// be returned by the Sysex response message\nfunc (imu *IMUDriver) ReadGyroscope() error {\n\treturn imu.connection.WriteSysex([]byte{CURIE_IMU, CURIE_IMU_READ_GYRO})\n}\n\n// ReadTemperature calls the Curie's built-in temperature sensor.\n// The result will be returned by the Sysex response message\nfunc (imu *IMUDriver) ReadTemperature() error {\n\treturn imu.connection.WriteSysex([]byte{CURIE_IMU, CURIE_IMU_READ_TEMP})\n}\n\n// EnableShockDetection turns on/off the Curie's built-in shock detection.\n// The result will be returned by the Sysex response message\nfunc (imu *IMUDriver) EnableShockDetection(detect bool) error {\n\tvar d byte\n\tif detect {\n\t\td = 1\n\t}\n\treturn imu.connection.WriteSysex([]byte{CURIE_IMU, CURIE_IMU_SHOCK_DETECT, d})\n}\n\n// EnableStepCounter turns on/off the Curie's built-in step counter.\n// The result will be returned by the Sysex response message\nfunc (imu *IMUDriver) EnableStepCounter(count bool) error {\n\tvar c byte\n\tif count {\n\t\tc = 1\n\t}\n\treturn imu.connection.WriteSysex([]byte{CURIE_IMU, CURIE_IMU_STEP_COUNTER, c})\n}\n\n// EnableTapDetection turns on/off the Curie's built-in tap detection.\n// The result will be returned by the Sysex response message\nfunc (imu *IMUDriver) EnableTapDetection(detect bool) error {\n\tvar d byte\n\tif detect {\n\t\td = 1\n\t}\n\treturn imu.connection.WriteSysex([]byte{CURIE_IMU, CURIE_IMU_TAP_DETECT, d})\n}\n\n// ReadMotion calls the Curie's built-in accelerometer & gyroscope.\n// The result will be returned by the Sysex response message\nfunc (imu *IMUDriver) ReadMotion() error {\n\treturn imu.connection.WriteSysex([]byte{CURIE_IMU, CURIE_IMU_READ_MOTION})\n}\n\nfunc (imu *IMUDriver) handleEvent(data []byte) error {\n\tif data[1] == CURIE_IMU {\n\t\tswitch data[2] {\n\t\tcase CURIE_IMU_READ_ACCEL:\n\t\t\tif val, err := parseAccelerometerData(data); err == nil {\n\t\t\t\timu.Publish(\"Accelerometer\", val)\n\t\t\t} else {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase CURIE_IMU_READ_GYRO:\n\t\t\tif val, err := parseGyroscopeData(data); err == nil {\n\t\t\t\timu.Publish(\"Gyroscope\", val)\n\t\t\t} else {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase CURIE_IMU_READ_TEMP:\n\t\t\tif val, err := parseTemperatureData(data); err == nil {\n\t\t\t\timu.Publish(\"Temperature\", val)\n\t\t\t} else {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase CURIE_IMU_SHOCK_DETECT:\n\t\t\tif val, err := parseShockData(data); err == nil {\n\t\t\t\timu.Publish(\"Shock\", val)\n\t\t\t} else {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase CURIE_IMU_STEP_COUNTER:\n\t\t\tif val, err := parseStepData(data); err == nil {\n\t\t\t\timu.Publish(\"Steps\", val)\n\t\t\t} else {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase CURIE_IMU_TAP_DETECT:\n\t\t\tif val, err := parseTapData(data); err == nil {\n\t\t\t\timu.Publish(\"Tap\", val)\n\t\t\t} else {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase CURIE_IMU_READ_MOTION:\n\t\t\tif val, err := parseMotionData(data); err == nil {\n\t\t\t\timu.Publish(\"Motion\", val)\n\t\t\t} else {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc parseAccelerometerData(data []byte) (*AccelerometerData, error) {\n\tif len(data) < 9 {\n\t\treturn nil, errors.New(\"invalid data\")\n\t}\n\tx := int16(uint16(data[3]) | uint16(data[4])<<7) //nolint:gosec // ok here\n\ty := int16(uint16(data[5]) | uint16(data[6])<<7) //nolint:gosec // ok here\n\tz := int16(uint16(data[7]) | uint16(data[8])<<7) //nolint:gosec // ok here\n\n\tres := &AccelerometerData{X: x, Y: y, Z: z}\n\treturn res, nil\n}\n\nfunc parseGyroscopeData(data []byte) (*GyroscopeData, error) {\n\tif len(data) < 9 {\n\t\treturn nil, errors.New(\"invalid data\")\n\t}\n\tx := int16(uint16(data[3]) | uint16(data[4])<<7) //nolint:gosec // ok here\n\ty := int16(uint16(data[5]) | uint16(data[6])<<7) //nolint:gosec // ok here\n\tz := int16(uint16(data[7]) | uint16(data[8])<<7) //nolint:gosec // ok here\n\n\tres := &GyroscopeData{X: x, Y: y, Z: z}\n\treturn res, nil\n}\n\nfunc parseTemperatureData(data []byte) (float32, error) {\n\tif len(data) < 8 {\n\t\treturn 0, errors.New(\"invalid data\")\n\t}\n\tt1 := int16(uint16(data[3]) | uint16(data[4])<<7) //nolint:gosec // ok here\n\tt2 := int16(uint16(data[5]) | uint16(data[6])<<7) //nolint:gosec // ok here\n\n\tres := (float32(t1+(t2*8)) / 512.0) + 23.0\n\treturn res, nil\n}\n\nfunc parseShockData(data []byte) (*ShockData, error) {\n\tif len(data) < 6 {\n\t\treturn nil, errors.New(\"invalid data\")\n\t}\n\n\tres := &ShockData{Axis: data[3], Direction: data[4]}\n\treturn res, nil\n}\n\nfunc parseStepData(data []byte) (int16, error) {\n\tif len(data) < 6 {\n\t\treturn 0, errors.New(\"invalid data\")\n\t}\n\n\tres := int16(uint16(data[3]) | uint16(data[4])<<7) //nolint:gosec // ok here\n\treturn res, nil\n}\n\nfunc parseTapData(data []byte) (*TapData, error) {\n\tif len(data) < 6 {\n\t\treturn nil, errors.New(\"invalid data\")\n\t}\n\n\tres := &TapData{Axis: data[3], Direction: data[4]}\n\treturn res, nil\n}\n\nfunc parseMotionData(data []byte) (*MotionData, error) {\n\tif len(data) < 16 {\n\t\treturn nil, errors.New(\"invalid data\")\n\t}\n\tax := int16(uint16(data[3]) | uint16(data[4])<<7) //nolint:gosec // ok here\n\tay := int16(uint16(data[5]) | uint16(data[6])<<7) //nolint:gosec // ok here\n\taz := int16(uint16(data[7]) | uint16(data[8])<<7) //nolint:gosec // ok here\n\n\tgx := int16(uint16(data[9]) | uint16(data[10])<<7)  //nolint:gosec // ok here\n\tgy := int16(uint16(data[11]) | uint16(data[12])<<7) //nolint:gosec // ok here\n\tgz := int16(uint16(data[13]) | uint16(data[14])<<7) //nolint:gosec // ok here\n\n\tres := &MotionData{AX: ax, AY: ay, AZ: az, GX: gx, GY: gy, GZ: gz}\n\treturn res, nil\n}\n"
  },
  {
    "path": "platforms/intel-iot/curie/imu_driver_test.go",
    "content": "package curie\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata\"\n\t\"gobot.io/x/gobot/v2/platforms/firmata/client\"\n)\n\nvar _ gobot.Driver = (*IMUDriver)(nil)\n\ntype readWriteCloser struct{}\n\nfunc (readWriteCloser) Write(p []byte) (int, error) {\n\treturn testWriteData.Write(p)\n}\n\nvar (\n\ttestReadData  = []byte{}\n\ttestWriteData = bytes.Buffer{}\n)\n\nfunc (readWriteCloser) Read(b []byte) (int, error) {\n\tsize := len(b)\n\tif len(testReadData) < size {\n\t\tsize = len(testReadData)\n\t}\n\tcopy(b, testReadData[:size])\n\ttestReadData = testReadData[size:]\n\n\treturn size, nil\n}\n\nfunc (readWriteCloser) Close() error {\n\treturn nil\n}\n\ntype mockFirmataBoard struct {\n\tgobot.Eventer\n\n\tdisconnectError error\n\tpins            []client.Pin\n}\n\nfunc newMockFirmataBoard() *mockFirmataBoard {\n\tm := &mockFirmataBoard{\n\t\tEventer:         gobot.NewEventer(),\n\t\tdisconnectError: nil,\n\t\tpins:            make([]client.Pin, 100),\n\t}\n\n\tm.pins[1].Value = 1\n\tm.pins[15].Value = 133\n\n\tm.AddEvent(\"I2cReply\")\n\treturn m\n}\n\nfunc (mockFirmataBoard) Connect(io.ReadWriteCloser) error { return nil }\nfunc (m mockFirmataBoard) Disconnect() error {\n\treturn m.disconnectError\n}\n\nfunc (m mockFirmataBoard) Pins() []client.Pin {\n\treturn m.pins\n}\nfunc (mockFirmataBoard) AnalogWrite(int, int) error      { return nil }\nfunc (mockFirmataBoard) SetPinMode(int, int) error       { return nil }\nfunc (mockFirmataBoard) ReportAnalog(int, int) error     { return nil }\nfunc (mockFirmataBoard) ReportDigital(int, int) error    { return nil }\nfunc (mockFirmataBoard) DigitalWrite(int, int) error     { return nil }\nfunc (mockFirmataBoard) I2cRead(int, int) error          { return nil }\nfunc (mockFirmataBoard) I2cWrite(int, []byte) error      { return nil }\nfunc (mockFirmataBoard) I2cConfig(int) error             { return nil }\nfunc (mockFirmataBoard) ServoConfig(int, int, int) error { return nil }\nfunc (mockFirmataBoard) WriteSysex(data []byte) error    { return nil }\n\nfunc initTestIMUDriver() *IMUDriver {\n\ta := firmata.NewAdaptor(\"/dev/null\")\n\ta.Board = newMockFirmataBoard()\n\ta.PortOpener = func(port string) (io.ReadWriteCloser, error) {\n\t\treturn &readWriteCloser{}, nil\n\t}\n\treturn NewIMUDriver(a)\n}\n\nfunc TestIMUDriverStart(t *testing.T) {\n\td := initTestIMUDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestIMUDriverHalt(t *testing.T) {\n\td := initTestIMUDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestIMUDriverDefaultName(t *testing.T) {\n\td := initTestIMUDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"CurieIMU\"))\n}\n\nfunc TestIMUDriverSetName(t *testing.T) {\n\td := initTestIMUDriver()\n\td.SetName(\"mybot\")\n\tassert.Equal(t, \"mybot\", d.Name())\n}\n\nfunc TestIMUDriverConnection(t *testing.T) {\n\td := initTestIMUDriver()\n\tassert.NotNil(t, d.Connection())\n}\n\nfunc TestIMUDriverReadAccelerometer(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.ReadAccelerometer())\n}\n\nfunc TestIMUDriverReadAccelerometerData(t *testing.T) {\n\t_, err := parseAccelerometerData([]byte{})\n\trequire.ErrorContains(t, err, \"invalid data\")\n\n\tresult, err := parseAccelerometerData([]byte{0xF0, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0xf7})\n\trequire.NoError(t, err)\n\tassert.Equal(t, &AccelerometerData{X: 1920, Y: 1920, Z: 1920}, result)\n}\n\nfunc TestIMUDriverReadGyroscope(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.ReadGyroscope())\n}\n\nfunc TestIMUDriverReadGyroscopeData(t *testing.T) {\n\t_, err := parseGyroscopeData([]byte{})\n\trequire.ErrorContains(t, err, \"invalid data\")\n\n\tresult, err := parseGyroscopeData([]byte{0xF0, 0x11, 0x01, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0xf7})\n\trequire.NoError(t, err)\n\tassert.Equal(t, &GyroscopeData{X: 1920, Y: 1920, Z: 1920}, result)\n}\n\nfunc TestIMUDriverReadTemperature(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.ReadTemperature())\n}\n\nfunc TestIMUDriverReadTemperatureData(t *testing.T) {\n\t_, err := parseTemperatureData([]byte{})\n\trequire.ErrorContains(t, err, \"invalid data\")\n\n\tresult, err := parseTemperatureData([]byte{0xF0, 0x11, 0x02, 0x00, 0x02, 0x03, 0x04, 0xf7})\n\trequire.NoError(t, err)\n\tassert.InDelta(t, float32(31.546875), result, 0.0)\n}\n\nfunc TestIMUDriverEnableShockDetection(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.EnableShockDetection(true))\n}\n\nfunc TestIMUDriverShockDetectData(t *testing.T) {\n\t_, err := parseShockData([]byte{})\n\trequire.ErrorContains(t, err, \"invalid data\")\n\n\tresult, err := parseShockData([]byte{0xF0, 0x11, 0x03, 0x00, 0x02, 0xf7})\n\trequire.NoError(t, err)\n\tassert.Equal(t, &ShockData{Axis: 0, Direction: 2}, result)\n}\n\nfunc TestIMUDriverEnableStepCounter(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.EnableStepCounter(true))\n}\n\nfunc TestIMUDriverStepCountData(t *testing.T) {\n\t_, err := parseStepData([]byte{})\n\trequire.ErrorContains(t, err, \"invalid data\")\n\n\tresult, err := parseStepData([]byte{0xF0, 0x11, 0x04, 0x00, 0x02, 0xf7})\n\trequire.NoError(t, err)\n\tassert.Equal(t, int16(256), result)\n}\n\nfunc TestIMUDriverEnableTapDetection(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.EnableTapDetection(true))\n}\n\nfunc TestIMUDriverTapDetectData(t *testing.T) {\n\t_, err := parseTapData([]byte{})\n\trequire.ErrorContains(t, err, \"invalid data\")\n\n\tresult, err := parseTapData([]byte{0xF0, 0x11, 0x05, 0x00, 0x02, 0xf7})\n\trequire.NoError(t, err)\n\tassert.Equal(t, &TapData{Axis: 0, Direction: 2}, result)\n}\n\nfunc TestIMUDriverEnableReadMotion(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\trequire.NoError(t, d.ReadMotion())\n}\n\nfunc TestIMUDriverReadMotionData(t *testing.T) {\n\t_, err := parseMotionData([]byte{})\n\trequire.ErrorContains(t, err, \"invalid data\")\n\n\tresult, err := parseMotionData([]byte{\n\t\t0xF0, 0x11, 0x06, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0xf7,\n\t})\n\trequire.NoError(t, err)\n\tassert.Equal(t, &MotionData{AX: 1920, AY: 1920, AZ: 1920, GX: 1920, GY: 1920, GZ: 1920}, result)\n}\n\nfunc TestIMUDriverHandleEvents(t *testing.T) {\n\td := initTestIMUDriver()\n\t_ = d.Start()\n\n\trequire.NoError(t, d.handleEvent([]byte{0xF0, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0xf7}))\n\trequire.NoError(t, d.handleEvent([]byte{0xF0, 0x11, 0x01, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0xf7}))\n\trequire.NoError(t, d.handleEvent([]byte{0xF0, 0x11, 0x02, 0x00, 0x02, 0x03, 0x04, 0xf7}))\n\trequire.NoError(t, d.handleEvent([]byte{0xF0, 0x11, 0x03, 0x00, 0x02, 0xf7}))\n\trequire.NoError(t, d.handleEvent([]byte{0xF0, 0x11, 0x04, 0x00, 0x02, 0xf7}))\n\trequire.NoError(t, d.handleEvent([]byte{0xF0, 0x11, 0x05, 0x00, 0x02, 0xf7}))\n\trequire.NoError(t, d.handleEvent([]byte{\n\t\t0xF0, 0x11, 0x06, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0xf7,\n\t}))\n}\n"
  },
  {
    "path": "platforms/intel-iot/edison/README.md",
    "content": "# Edison\n\nThe Intel Edison is a WiFi and Bluetooth enabled development platform for the Internet of Things. It packs a robust set\nof features into its small size and supports a broad spectrum of I/O and software support.\n\nFor more info about the Edison platform click [here](http://www.intel.com/content/www/us/en/do-it-yourself/edison.html).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n### Setting up your Intel Edison\n\nEverything you need to get started with the Edison is in the Intel Getting Started Guide:\n\n<https://software.intel.com/en-us/iot/library/edison-getting-started>\n\nDon't forget to configure your Edison's wifi connection and flash your Edison with the latest firmware image!\n\nThe recommended way to connect to your device is via wifi, for that follow the directions here:\n\n<https://software.intel.com/en-us/connecting-your-intel-edison-board-using-wifi>\n\nIf you don't have a wifi network available, the Intel documentation explains how to use another connection type, but note\nthat this guide assumes you are using wifi connection.\n\nYou can obtain the IP address of your Edison, by running the floowing command:\n\n```sh\nip addr show | grep inet\n```\n\nDon't forget to setup the a password for the device otherwise you won't be able to connect using SSH. From within the screen\nsession, run the following command:\n\n```ah\nconfigure_edison --password\n```\n\nNote that you MUST setup a password otherwise SSH won't be enabled. If\nlater on you aren't able to scp to the device, try to reset the\npassword. This password will obviously be needed next time you connect to\nyour device.\n\n## How To Use\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n)\n\nfunc main() {\n  e := edison.NewAdaptor()\n  led := gpio.NewLedDriver(e, \"13\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"blinkBot\",\n    []gobot.Connection{e},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nYou can read the [full API documentation online](http://godoc.org/gobot.io/x/gobot/v2).\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=386 GOOS=linux go build examples/edison_blink.go\n```\n\nOnce you have compiled your code, you can you can upload your program and execute it on the Intel Edison from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp edison_blink root@<IP of your device>:/home/root/\nssh -t root@<IP of your device> \"./edison_blink\"\n```\n\nAt this point you should see one of the onboard LEDs blinking. Press control + c\nto exit.\n\nTo update the program after you made a change, you will need to scp it\nover once again and start it from the command line (via screen).\n"
  },
  {
    "path": "platforms/intel-iot/edison/arduino_pinmap.go",
    "content": "package edison\n\nimport \"gobot.io/x/gobot/v2/system\"\n\nvar arduinoPinMap = map[string]sysfsPin{\n\t\"0\": {\n\t\tpin:          130,\n\t\tresistor:     216,\n\t\tlevelShifter: 248,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"1\": {\n\t\tpin:          131,\n\t\tresistor:     217,\n\t\tlevelShifter: 249,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"2\": {\n\t\tpin:          128,\n\t\tresistor:     218,\n\t\tlevelShifter: 250,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"3\": {\n\t\tpin:          12,\n\t\tresistor:     219,\n\t\tlevelShifter: 251,\n\t\tpwmPin:       0,\n\t\tmux:          []mux{},\n\t},\n\n\t\"4\": {\n\t\tpin:          129,\n\t\tresistor:     220,\n\t\tlevelShifter: 252,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"5\": {\n\t\tpin:          13,\n\t\tresistor:     221,\n\t\tlevelShifter: 253,\n\t\tpwmPin:       1,\n\t\tmux:          []mux{},\n\t},\n\t\"6\": {\n\t\tpin:          182,\n\t\tresistor:     222,\n\t\tlevelShifter: 254,\n\t\tpwmPin:       2,\n\t\tmux:          []mux{},\n\t},\n\t\"7\": {\n\t\tpin:          48,\n\t\tresistor:     223,\n\t\tlevelShifter: 255,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"8\": {\n\t\tpin:          49,\n\t\tresistor:     224,\n\t\tlevelShifter: 256,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"9\": {\n\t\tpin:          183,\n\t\tresistor:     225,\n\t\tlevelShifter: 257,\n\t\tpwmPin:       3,\n\t\tmux:          []mux{},\n\t},\n\t\"10\": {\n\t\tpin:          41,\n\t\tresistor:     226,\n\t\tlevelShifter: 258,\n\t\tpwmPin:       4,\n\t\tmux: []mux{\n\t\t\t{263, system.HIGH},\n\t\t\t{240, system.LOW},\n\t\t},\n\t},\n\t\"11\": {\n\t\tpin:          43,\n\t\tresistor:     227,\n\t\tlevelShifter: 259,\n\t\tpwmPin:       5,\n\t\tmux: []mux{\n\t\t\t{262, system.HIGH},\n\t\t\t{241, system.LOW},\n\t\t},\n\t},\n\t\"12\": {\n\t\tpin:          42,\n\t\tresistor:     228,\n\t\tlevelShifter: 260,\n\t\tpwmPin:       -1,\n\t\tmux: []mux{\n\t\t\t{242, system.LOW},\n\t\t},\n\t},\n\t\"13\": {\n\t\tpin:          40,\n\t\tresistor:     229,\n\t\tlevelShifter: 261,\n\t\tpwmPin:       -1,\n\t\tmux: []mux{\n\t\t\t{243, system.LOW},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/intel-iot/edison/doc.go",
    "content": "/*\nPackage edison contains the Gobot adaptor for the Intel Edison.\n\nFor further information refer to intel-iot README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/intel-iot/edison/README.md\n*/\npackage edison // import \"gobot.io/x/gobot/v2/platforms/intel-iot/edison\"\n"
  },
  {
    "path": "platforms/intel-iot/edison/edison_adaptor.go",
    "content": "package edison\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber      = 6\n\tdefaultI2cBusNumberOther = 1\n)\n\ntype mux struct {\n\tpin   int\n\tvalue int\n}\n\ntype sysfsPin struct {\n\tpin          int\n\tresistor     int\n\tlevelShifter int\n\tpwmPin       int\n\tmux          []mux\n}\n\n// Adaptor represents a Gobot Adaptor for an Intel Edison\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\n\tname                  string\n\tboard                 string\n\tsys                   *system.Accesser\n\tmutex                 sync.Mutex\n\tpinMap                map[string]sysfsPin\n\ttristate              gobot.DigitalPinner\n\tdigitalPins           map[int]gobot.DigitalPinner\n\tarduinoI2cInitialized bool\n}\n\n// NewAdaptor returns a new Edison Adaptor of the given type.\n// Supported types are: \"arduino\", \"miniboard\", \"sparkfun\", an empty string defaults to \"arduino\"\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\tsys.AddDigitalPinSupport()\n\ta := &Adaptor{\n\t\tname:   gobot.DefaultName(\"Edison\"),\n\t\tboard:  \"arduino\",\n\t\tsys:    sys,\n\t\tpinMap: arduinoPinMap,\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tpwmPinsOpts := []adaptors.PwmPinsOptionApplier{adaptors.WithPWMPinInitializer(pwmPinInitializer)}\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase string:\n\t\t\tif o != \"\" {\n\t\t\t\ta.board = o\n\t\t\t}\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, a.translateAnalogPin, analogPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.translateAndMuxPWMPin, pwmPinsOpts...)\n\tdefI2cBusNr := defaultI2cBusNumber\n\tif a.board != \"arduino\" {\n\t\tdefI2cBusNr = defaultI2cBusNumberOther\n\t}\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, a.validateAndSetupI2cBusNumber, defI2cBusNr, i2cBusOpts...)\n\treturn a\n}\n\n// Name returns the adaptors name\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the adaptors name\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect initializes the Edison for use with the Arduino breakout board\nfunc (a *Adaptor) Connect() error {\n\ta.digitalPins = make(map[int]gobot.DigitalPinner)\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tswitch a.board {\n\tcase \"sparkfun\":\n\t\ta.pinMap = sparkfunPinMap\n\tcase \"arduino\":\n\t\ta.board = \"arduino\"\n\t\ta.pinMap = arduinoPinMap\n\t\tif err := a.arduinoSetup(); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase \"miniboard\":\n\t\ta.pinMap = miniboardPinMap\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown board type: %s\", a.board)\n\t}\n\n\treturn nil\n}\n\n// Finalize releases all i2c devices and exported analog, digital, pwm pins.\nfunc (a *Adaptor) Finalize() error {\n\tvar err error\n\tif a.tristate != nil {\n\t\tif errs := a.tristate.Unexport(); errs != nil {\n\t\t\terr = multierror.Append(err, errs)\n\t\t}\n\t}\n\ta.tristate = nil\n\n\tfor _, pin := range a.digitalPins {\n\t\tif pin != nil {\n\t\t\tif errs := pin.Unexport(); errs != nil {\n\t\t\t\terr = multierror.Append(err, errs)\n\t\t\t}\n\t\t}\n\t}\n\ta.digitalPins = nil\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\ta.arduinoI2cInitialized = false\n\treturn err\n}\n\n// DigitalRead reads digital value from pin\nfunc (a *Adaptor) DigitalRead(pin string) (int, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tsysPin, err := a.digitalPin(pin, system.WithPinDirectionInput())\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn sysPin.Read()\n}\n\n// DigitalWrite writes a value to the pin. Acceptable values are 1 or 0.\nfunc (a *Adaptor) DigitalWrite(pin string, val byte) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.digitalWrite(pin, val)\n}\n\n// DigitalPin returns a digital pin. If the pin is initially acquired, it is an input.\n// Pin direction and other options can be changed afterwards by pin.ApplyOptions() at any time.\nfunc (a *Adaptor) DigitalPin(id string) (gobot.DigitalPinner, error) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.digitalPin(id)\n}\n\n// AnalogRead returns value from analog reading of specified pin\nfunc (a *Adaptor) AnalogRead(pin string) (int, error) {\n\trawRead, err := a.AnalogPinsAdaptor.AnalogRead(pin)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn rawRead / 4, err\n}\n\nfunc (a *Adaptor) validateAndSetupI2cBusNumber(busNr int) error {\n\t// Valid bus number is 6 for \"arduino\", otherwise 1.\n\tif busNr == 6 && a.board == \"arduino\" {\n\t\tif !a.arduinoI2cInitialized {\n\t\t\tif err := a.arduinoI2CSetup(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\ta.arduinoI2cInitialized = true\n\t\t\treturn nil\n\t\t}\n\t\treturn nil\n\t}\n\n\tif busNr == 1 && a.board != \"arduino\" {\n\t\treturn nil\n\t}\n\n\treturn fmt.Errorf(\"unsupported I2C bus '%d'\", busNr)\n}\n\n// arduinoSetup does needed setup for the Arduino compatible breakout board\nfunc (a *Adaptor) arduinoSetup() error {\n\t// TODO: also check to see if device labels for\n\t// /sys/class/gpio/gpiochip{200,216,232,248}/label == \"pcal9555a\"\n\n\ttpin, err := a.newExportedDigitalPin(214, system.WithPinDirectionOutput(system.LOW))\n\tif err != nil {\n\t\treturn err\n\t}\n\ta.tristate = tpin\n\n\tfor _, i := range []int{263, 262} {\n\t\tif err := a.newUnexportedDigitalPin(i, system.WithPinDirectionOutput(system.HIGH)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, i := range []int{240, 241, 242, 243} {\n\t\tif err := a.newUnexportedDigitalPin(i, system.WithPinDirectionOutput(system.LOW)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, i := range []string{\"111\", \"115\", \"114\", \"109\"} {\n\t\tif err := a.changePinMode(i, \"1\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, i := range []string{\"131\", \"129\", \"40\"} {\n\t\tif err := a.changePinMode(i, \"0\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn a.tristate.Write(system.HIGH)\n}\n\nfunc (a *Adaptor) arduinoI2CSetup() error {\n\tif a.tristate == nil {\n\t\treturn fmt.Errorf(\"not connected\")\n\t}\n\n\tif err := a.tristate.Write(system.LOW); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, i := range []int{14, 165, 212, 213} {\n\t\tif err := a.newUnexportedDigitalPin(i, system.WithPinDirectionInput()); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, i := range []int{236, 237, 204, 205} {\n\t\tif err := a.newUnexportedDigitalPin(i, system.WithPinDirectionOutput(system.LOW)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, i := range []string{\"28\", \"27\"} {\n\t\tif err := a.changePinMode(i, \"1\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn a.tristate.Write(system.HIGH)\n}\n\nfunc (a *Adaptor) digitalPin(id string, o ...func(gobot.DigitalPinOptioner) bool) (gobot.DigitalPinner, error) {\n\ti := a.pinMap[id]\n\n\terr := a.ensureDigitalPin(i.pin, o...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpin := a.digitalPins[i.pin]\n\tvpin, ok := pin.(gobot.DigitalPinValuer)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"can not determine the direction behavior\")\n\t}\n\tdir := vpin.DirectionBehavior()\n\tif i.resistor > 0 {\n\t\trop := system.WithPinDirectionOutput(system.LOW)\n\t\tif dir == system.OUT {\n\t\t\trop = system.WithPinDirectionInput()\n\t\t}\n\t\tif err := a.ensureDigitalPin(i.resistor, rop); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif i.levelShifter > 0 {\n\t\tlop := system.WithPinDirectionOutput(system.LOW)\n\t\tif dir == system.OUT {\n\t\t\tlop = system.WithPinDirectionOutput(system.HIGH)\n\t\t}\n\t\tif err := a.ensureDigitalPin(i.levelShifter, lop); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif len(i.mux) > 0 {\n\t\tfor _, mux := range i.mux {\n\t\t\tif err := a.ensureDigitalPin(mux.pin, system.WithPinDirectionOutput(mux.value)); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn pin, nil\n}\n\nfunc (a *Adaptor) ensureDigitalPin(idx int, o ...func(gobot.DigitalPinOptioner) bool) error {\n\tpin := a.digitalPins[idx]\n\tvar err error\n\tif pin == nil {\n\t\tpin, err = a.newExportedDigitalPin(idx, o...)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ta.digitalPins[idx] = pin\n\t} else {\n\t\tif err := pin.ApplyOptions(o...); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc pwmPinInitializer(_ string, pin gobot.PWMPinner) error {\n\tif err := pin.Export(); err != nil {\n\t\treturn err\n\t}\n\treturn pin.SetEnabled(true)\n}\n\nfunc (a *Adaptor) translateAnalogPin(pin string) (string, bool, uint16, error) {\n\tpath := fmt.Sprintf(\"/sys/bus/iio/devices/iio:device1/in_voltage%s_raw\", pin)\n\tconst (\n\t\twrite      = false\n\t\treadBufLen = 200\n\t)\n\treturn path, write, readBufLen, nil\n}\n\nfunc (a *Adaptor) translateAndMuxPWMPin(id string) (string, int, error) {\n\tsysPin, ok := a.pinMap[id]\n\tif !ok {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a pin\", id)\n\t}\n\tif sysPin.pwmPin == -1 {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a PWM pin\", id)\n\t}\n\tif err := a.digitalWrite(id, 1); err != nil {\n\t\treturn \"\", -1, err\n\t}\n\tif err := a.changePinMode(strconv.Itoa(sysPin.pin), \"1\"); err != nil {\n\t\treturn \"\", -1, err\n\t}\n\treturn \"/sys/class/pwm/pwmchip0\", sysPin.pwmPin, nil\n}\n\nfunc (a *Adaptor) newUnexportedDigitalPin(i int, o ...func(gobot.DigitalPinOptioner) bool) error {\n\tio := a.sys.NewDigitalPin(\"\", i, o...)\n\tif err := io.Export(); err != nil {\n\t\treturn err\n\t}\n\treturn io.Unexport()\n}\n\nfunc (a *Adaptor) newExportedDigitalPin(\n\tpin int,\n\to ...func(gobot.DigitalPinOptioner) bool,\n) (gobot.DigitalPinner, error) {\n\tsysPin := a.sys.NewDigitalPin(\"\", pin, o...)\n\terr := sysPin.Export()\n\treturn sysPin, err\n}\n\n// changePinMode writes pin mode to current_pinmux file\nfunc (a *Adaptor) changePinMode(pin, mode string) error {\n\tfile, err := a.sys.OpenFile(\"/sys/kernel/debug/gpio_debug/gpio\"+pin+\"/current_pinmux\", os.O_WRONLY, 0o644)\n\tdefer file.Close() //nolint:staticcheck // for historical reasons\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = file.Write([]byte(\"mode\" + mode))\n\treturn err\n}\n\nfunc (a *Adaptor) digitalWrite(pin string, val byte) error {\n\tsysPin, err := a.digitalPin(pin, system.WithPinDirectionOutput(int(val)))\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn sysPin.Write(int(val))\n}\n"
  },
  {
    "path": "platforms/intel-iot/edison/edison_adaptor_test.go",
    "content": "package edison\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nvar testPinFiles = []string{\n\t\"/sys/bus/iio/devices/iio:device1/in_voltage0_raw\",\n\t\"/sys/kernel/debug/gpio_debug/gpio111/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio115/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio114/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio109/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio131/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio129/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio40/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio13/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio28/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio27/current_pinmux\",\n\t\"/sys/class/pwm/pwmchip0/export\",\n\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\"/sys/class/pwm/pwmchip0/pwm1/duty_cycle\",\n\t\"/sys/class/pwm/pwmchip0/pwm1/period\",\n\t\"/sys/class/pwm/pwmchip0/pwm1/enable\",\n\t\"/sys/class/gpio/export\",\n\t\"/sys/class/gpio/unexport\",\n\t\"/sys/class/gpio/gpio13/value\",\n\t\"/sys/class/gpio/gpio13/direction\",\n\t\"/sys/class/gpio/gpio40/value\",\n\t\"/sys/class/gpio/gpio40/direction\",\n\t\"/sys/class/gpio/gpio128/value\",\n\t\"/sys/class/gpio/gpio128/direction\",\n\t\"/sys/class/gpio/gpio221/value\",\n\t\"/sys/class/gpio/gpio221/direction\",\n\t\"/sys/class/gpio/gpio243/value\",\n\t\"/sys/class/gpio/gpio243/direction\",\n\t\"/sys/class/gpio/gpio229/value\",\n\t\"/sys/class/gpio/gpio229/direction\",\n\t\"/sys/class/gpio/gpio253/value\",\n\t\"/sys/class/gpio/gpio253/direction\",\n\t\"/sys/class/gpio/gpio261/value\",\n\t\"/sys/class/gpio/gpio261/direction\",\n\t\"/sys/class/gpio/gpio214/value\",\n\t\"/sys/class/gpio/gpio214/direction\",\n\t\"/sys/class/gpio/gpio14/direction\",\n\t\"/sys/class/gpio/gpio14/value\",\n\t\"/sys/class/gpio/gpio165/direction\",\n\t\"/sys/class/gpio/gpio165/value\",\n\t\"/sys/class/gpio/gpio212/direction\",\n\t\"/sys/class/gpio/gpio212/value\",\n\t\"/sys/class/gpio/gpio213/direction\",\n\t\"/sys/class/gpio/gpio213/value\",\n\t\"/sys/class/gpio/gpio236/direction\",\n\t\"/sys/class/gpio/gpio236/value\",\n\t\"/sys/class/gpio/gpio237/direction\",\n\t\"/sys/class/gpio/gpio237/value\",\n\t\"/sys/class/gpio/gpio204/direction\",\n\t\"/sys/class/gpio/gpio204/value\",\n\t\"/sys/class/gpio/gpio205/direction\",\n\t\"/sys/class/gpio/gpio205/value\",\n\t\"/sys/class/gpio/gpio263/direction\",\n\t\"/sys/class/gpio/gpio263/value\",\n\t\"/sys/class/gpio/gpio262/direction\",\n\t\"/sys/class/gpio/gpio262/value\",\n\t\"/sys/class/gpio/gpio240/direction\",\n\t\"/sys/class/gpio/gpio240/value\",\n\t\"/sys/class/gpio/gpio241/direction\",\n\t\"/sys/class/gpio/gpio241/value\",\n\t\"/sys/class/gpio/gpio242/direction\",\n\t\"/sys/class/gpio/gpio242/value\",\n\t\"/sys/class/gpio/gpio218/direction\",\n\t\"/sys/class/gpio/gpio218/value\",\n\t\"/sys/class/gpio/gpio250/direction\",\n\t\"/sys/class/gpio/gpio250/value\",\n\t\"/dev/i2c-6\",\n}\n\nvar pwmMockPathsMux13Arduino = []string{\n\t\"/sys/class/gpio/export\",\n\t\"/sys/class/gpio/unexport\",\n\t\"/sys/kernel/debug/gpio_debug/gpio13/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio40/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio109/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio111/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio114/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio115/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio129/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio131/current_pinmux\",\n\t\"/sys/class/gpio/gpio13/direction\",\n\t\"/sys/class/gpio/gpio13/value\",\n\t\"/sys/class/gpio/gpio214/direction\",\n\t\"/sys/class/gpio/gpio214/value\",\n\t\"/sys/class/gpio/gpio221/direction\",\n\t\"/sys/class/gpio/gpio221/value\",\n\t\"/sys/class/gpio/gpio240/direction\",\n\t\"/sys/class/gpio/gpio240/value\",\n\t\"/sys/class/gpio/gpio241/direction\",\n\t\"/sys/class/gpio/gpio241/value\",\n\t\"/sys/class/gpio/gpio242/direction\",\n\t\"/sys/class/gpio/gpio242/value\",\n\t\"/sys/class/gpio/gpio243/direction\",\n\t\"/sys/class/gpio/gpio243/value\",\n\t\"/sys/class/gpio/gpio253/direction\",\n\t\"/sys/class/gpio/gpio253/value\",\n\t\"/sys/class/gpio/gpio262/direction\",\n\t\"/sys/class/gpio/gpio262/value\",\n\t\"/sys/class/gpio/gpio263/direction\",\n\t\"/sys/class/gpio/gpio263/value\",\n}\n\nvar pwmMockPathsMux13ArduinoI2c = []string{\n\t\"/dev/i2c-6\",\n\t\"/sys/class/gpio/export\",\n\t\"/sys/class/gpio/unexport\",\n\t\"/sys/kernel/debug/gpio_debug/gpio13/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio27/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio28/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio40/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio109/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio111/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio114/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio115/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio129/current_pinmux\",\n\t\"/sys/kernel/debug/gpio_debug/gpio131/current_pinmux\",\n\t\"/sys/class/gpio/gpio13/direction\",\n\t\"/sys/class/gpio/gpio13/value\",\n\t\"/sys/class/gpio/gpio14/direction\",\n\t\"/sys/class/gpio/gpio14/value\",\n\t\"/sys/class/gpio/gpio28/direction\",\n\t\"/sys/class/gpio/gpio28/value\",\n\t\"/sys/class/gpio/gpio165/direction\",\n\t\"/sys/class/gpio/gpio165/value\",\n\t\"/sys/class/gpio/gpio212/direction\",\n\t\"/sys/class/gpio/gpio212/value\",\n\t\"/sys/class/gpio/gpio213/direction\",\n\t\"/sys/class/gpio/gpio213/value\",\n\t\"/sys/class/gpio/gpio214/direction\",\n\t\"/sys/class/gpio/gpio214/value\",\n\t\"/sys/class/gpio/gpio221/direction\",\n\t\"/sys/class/gpio/gpio221/value\",\n\t\"/sys/class/gpio/gpio236/direction\",\n\t\"/sys/class/gpio/gpio236/value\",\n\t\"/sys/class/gpio/gpio237/direction\",\n\t\"/sys/class/gpio/gpio237/value\",\n\t\"/sys/class/gpio/gpio204/value\",\n\t\"/sys/class/gpio/gpio204/direction\",\n\t\"/sys/class/gpio/gpio205/value\",\n\t\"/sys/class/gpio/gpio205/direction\",\n\t\"/sys/class/gpio/gpio240/direction\",\n\t\"/sys/class/gpio/gpio240/value\",\n\t\"/sys/class/gpio/gpio241/direction\",\n\t\"/sys/class/gpio/gpio241/value\",\n\t\"/sys/class/gpio/gpio242/direction\",\n\t\"/sys/class/gpio/gpio242/value\",\n\t\"/sys/class/gpio/gpio243/direction\",\n\t\"/sys/class/gpio/gpio243/value\",\n\t\"/sys/class/gpio/gpio253/direction\",\n\t\"/sys/class/gpio/gpio253/value\",\n\t\"/sys/class/gpio/gpio262/direction\",\n\t\"/sys/class/gpio/gpio262/value\",\n\t\"/sys/class/gpio/gpio263/direction\",\n\t\"/sys/class/gpio/gpio263/value\",\n}\n\nvar pwmMockPathsMux13 = []string{\n\t\"/sys/kernel/debug/gpio_debug/gpio13/current_pinmux\",\n\t\"/sys/class/gpio/export\",\n\t\"/sys/class/gpio/gpio13/direction\",\n\t\"/sys/class/gpio/gpio13/value\",\n\t\"/sys/class/gpio/gpio221/direction\",\n\t\"/sys/class/gpio/gpio221/value\",\n\t\"/sys/class/gpio/gpio253/direction\",\n\t\"/sys/class/gpio/gpio253/value\",\n\t\"/sys/class/pwm/pwmchip0/export\",\n\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\"/sys/class/pwm/pwmchip0/pwm1/duty_cycle\",\n\t\"/sys/class/pwm/pwmchip0/pwm1/period\",\n\t\"/sys/class/pwm/pwmchip0/pwm1/enable\",\n}\n\nvar pwmMockPathsMux40 = []string{\n\t\"/sys/kernel/debug/gpio_debug/gpio40/current_pinmux\",\n\t\"/sys/class/gpio/export\",\n\t\"/sys/class/gpio/unexport\",\n\t\"/sys/class/gpio/gpio40/value\",\n\t\"/sys/class/gpio/gpio40/direction\",\n\t\"/sys/class/gpio/gpio229/value\", // resistor\n\t\"/sys/class/gpio/gpio229/direction\",\n\t\"/sys/class/gpio/gpio243/value\",\n\t\"/sys/class/gpio/gpio243/direction\",\n\t\"/sys/class/gpio/gpio261/value\", // level shifter\n\t\"/sys/class/gpio/gpio261/direction\",\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem() (*Adaptor, *system.MockFilesystem) {\n\ta, fs := initTestAdaptorWithMockedFilesystem(\"arduino\")\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc initTestAdaptorWithMockedFilesystem(boardType string) (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor(boardType)\n\tfs := a.sys.UseMockFilesystem(testPinFiles)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm1/period\"].Contents = \"5000\"\n\treturn a, fs\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Edison\"))\n\tassert.Equal(t, 6, a.DefaultI2cBus())\n\tassert.Equal(t, \"arduino\", a.board)\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestConnect(t *testing.T) {\n\t// arrange\n\ta, _ := initTestAdaptorWithMockedFilesystem(\"arduino\")\n\t// act & assert\n\trequire.NoError(t, a.Connect())\n}\n\nfunc TestArduinoSetupFail263(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tdelete(fs.Files, \"/sys/class/gpio/gpio263/direction\")\n\n\terr := a.arduinoSetup()\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/gpio263/direction: no such file\")\n}\n\nfunc TestArduinoSetupFail240(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tdelete(fs.Files, \"/sys/class/gpio/gpio240/direction\")\n\n\terr := a.arduinoSetup()\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/gpio240/direction: no such file\")\n}\n\nfunc TestArduinoSetupFail111(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tdelete(fs.Files, \"/sys/kernel/debug/gpio_debug/gpio111/current_pinmux\")\n\n\terr := a.arduinoSetup()\n\trequire.ErrorContains(t, err, \"/sys/kernel/debug/gpio_debug/gpio111/current_pinmux: no such file\")\n}\n\nfunc TestArduinoSetupFail131(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tdelete(fs.Files, \"/sys/kernel/debug/gpio_debug/gpio131/current_pinmux\")\n\n\terr := a.arduinoSetup()\n\trequire.ErrorContains(t, err, \"/sys/kernel/debug/gpio_debug/gpio131/current_pinmux: no such file\")\n}\n\nfunc TestArduinoI2CSetupFailTristate(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\trequire.NoError(t, a.arduinoSetup())\n\n\tfs.WithWriteError = true\n\terr := a.arduinoI2CSetup()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestArduinoI2CSetupFail14(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.arduinoSetup())\n\tdelete(fs.Files, \"/sys/class/gpio/gpio14/direction\")\n\n\terr := a.arduinoI2CSetup()\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/gpio14/direction: no such file\")\n}\n\nfunc TestArduinoI2CSetupUnexportFail(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.arduinoSetup())\n\tdelete(fs.Files, \"/sys/class/gpio/unexport\")\n\n\terr := a.arduinoI2CSetup()\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/unexport: no such file\")\n}\n\nfunc TestArduinoI2CSetupFail236(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.arduinoSetup())\n\tdelete(fs.Files, \"/sys/class/gpio/gpio236/direction\")\n\n\terr := a.arduinoI2CSetup()\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/gpio236/direction: no such file\")\n}\n\nfunc TestArduinoI2CSetupFail28(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.arduinoSetup())\n\tdelete(fs.Files, \"/sys/kernel/debug/gpio_debug/gpio28/current_pinmux\")\n\n\terr := a.arduinoI2CSetup()\n\trequire.ErrorContains(t, err, \"/sys/kernel/debug/gpio_debug/gpio28/current_pinmux: no such file\")\n}\n\nfunc TestConnectArduinoError(t *testing.T) {\n\ta, fs := initTestAdaptorWithMockedFilesystem(\"arduino\")\n\tfs.WithWriteError = true\n\n\terr := a.Connect()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestConnectArduinoWriteError(t *testing.T) {\n\ta, fs := initTestAdaptorWithMockedFilesystem(\"arduino\")\n\tfs.WithWriteError = true\n\n\terr := a.Connect()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestConnectSparkfun(t *testing.T) {\n\ta, _ := initTestAdaptorWithMockedFilesystem(\"sparkfun\")\n\n\trequire.NoError(t, a.Connect())\n\tassert.Equal(t, 1, a.DefaultI2cBus())\n\tassert.Equal(t, \"sparkfun\", a.board)\n}\n\nfunc TestConnectMiniboard(t *testing.T) {\n\ta, _ := initTestAdaptorWithMockedFilesystem(\"miniboard\")\n\n\trequire.NoError(t, a.Connect())\n\tassert.Equal(t, 1, a.DefaultI2cBus())\n\tassert.Equal(t, \"miniboard\", a.board)\n}\n\nfunc TestConnectUnknown(t *testing.T) {\n\ta := NewAdaptor(\"wha\")\n\n\terr := a.Connect()\n\trequire.ErrorContains(t, err, \"unknown board type: wha\")\n}\n\nfunc TestFinalize(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\t_ = a.DigitalWrite(\"3\", 1)\n\trequire.NoError(t, a.PwmWrite(\"5\", 100))\n\n\t_, _ = a.GetI2cConnection(0xff, 6)\n\trequire.NoError(t, a.Finalize())\n\n\t// assert that finalize after finalize is working\n\trequire.NoError(t, a.Finalize())\n\n\t// assert that re-connect is working\n\trequire.NoError(t, a.Connect())\n\t// remove one file to force Finalize error\n\tdelete(fs.Files, \"/sys/class/gpio/unexport\")\n\terr := a.Finalize()\n\trequire.ErrorContains(t, err, \"1 error occurred\")\n\trequire.ErrorContains(t, err, \"/sys/class/gpio/unexport\")\n}\n\nfunc TestFinalizeError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.PwmWrite(\"5\", 100))\n\n\tfs.WithWriteError = true\n\terr := a.Finalize()\n\trequire.ErrorContains(t, err, \"6 errors occurred\")\n\trequire.ErrorContains(t, err, \"write error\")\n\trequire.ErrorContains(t, err, \"SetEnabled(false) failed for id 1 with write error\")\n\trequire.ErrorContains(t, err, \"Unexport() failed for id 1 with write error\")\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\trequire.NoError(t, a.DigitalWrite(\"13\", 1))\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio40/value\"].Contents)\n\n\trequire.NoError(t, a.DigitalWrite(\"2\", 0))\n\ti, err := a.DigitalRead(\"2\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, i)\n}\n\nfunc TestDigitalPinInFileError(t *testing.T) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(pwmMockPathsMux40)\n\tdelete(fs.Files, \"/sys/class/gpio/gpio40/value\")\n\tdelete(fs.Files, \"/sys/class/gpio/gpio40/direction\")\n\t_ = a.Connect() // we drop this error\n\n\t_, err := a.DigitalPin(\"13\")\n\trequire.ErrorContains(t, err, \"no such file\")\n}\n\nfunc TestDigitalPinInResistorFileError(t *testing.T) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(pwmMockPathsMux40)\n\tdelete(fs.Files, \"/sys/class/gpio/gpio229/value\")\n\tdelete(fs.Files, \"/sys/class/gpio/gpio229/direction\")\n\t_ = a.Connect() // we drop this error\n\n\t_, err := a.DigitalPin(\"13\")\n\trequire.ErrorContains(t, err, \"no such file\")\n}\n\nfunc TestDigitalPinInLevelShifterFileError(t *testing.T) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(pwmMockPathsMux40)\n\tdelete(fs.Files, \"/sys/class/gpio/gpio261/value\")\n\tdelete(fs.Files, \"/sys/class/gpio/gpio261/direction\")\n\t_ = a.Connect() // we drop this error\n\n\t_, err := a.DigitalPin(\"13\")\n\trequire.ErrorContains(t, err, \"no such file\")\n}\n\nfunc TestDigitalPinInMuxFileError(t *testing.T) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(pwmMockPathsMux40)\n\tdelete(fs.Files, \"/sys/class/gpio/gpio243/value\")\n\tdelete(fs.Files, \"/sys/class/gpio/gpio243/direction\")\n\t_ = a.Connect() // we drop this error\n\n\t_, err := a.DigitalPin(\"13\")\n\trequire.ErrorContains(t, err, \"no such file\")\n}\n\nfunc TestDigitalWriteError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.WithWriteError = true\n\n\terr := a.DigitalWrite(\"13\", 1)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestDigitalReadWriteError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.WithWriteError = true\n\n\t_, err := a.DigitalRead(\"13\")\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestPwm(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\terr := a.PwmWrite(\"5\", 100)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"1960\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm1/duty_cycle\"].Contents)\n\n\terr = a.PwmWrite(\"7\", 100)\n\trequire.ErrorContains(t, err, \"'7' is not a valid id for a PWM pin\")\n}\n\nfunc TestPwmExportError(t *testing.T) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(pwmMockPathsMux13Arduino)\n\tdelete(fs.Files, \"/sys/class/pwm/pwmchip0/export\")\n\terr := a.Connect()\n\trequire.NoError(t, err)\n\n\terr = a.PwmWrite(\"5\", 100)\n\trequire.ErrorContains(t, err, \"/sys/class/pwm/pwmchip0/export: no such file\")\n}\n\nfunc TestPwmEnableError(t *testing.T) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(pwmMockPathsMux13)\n\tdelete(fs.Files, \"/sys/class/pwm/pwmchip0/pwm1/enable\")\n\t_ = a.Connect() // we drop this error\n\n\terr := a.PwmWrite(\"5\", 100)\n\trequire.ErrorContains(t, err, \"/sys/class/pwm/pwmchip0/pwm1/enable: no such file\")\n}\n\nfunc TestPwmWritePinError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.WithWriteError = true\n\n\terr := a.PwmWrite(\"5\", 100)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestPwmWriteError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.WithWriteError = true\n\n\terr := a.PwmWrite(\"5\", 100)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestPwmReadError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.WithReadError = true\n\n\terr := a.PwmWrite(\"5\", 100)\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestAnalog(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.Files[\"/sys/bus/iio/devices/iio:device1/in_voltage0_raw\"].Contents = \"1000\\n\"\n\n\ti, err := a.AnalogRead(\"0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 250, i)\n}\n\nfunc TestAnalogError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tfs.WithReadError = true\n\n\t_, err := a.AnalogRead(\"0\")\n\trequire.ErrorContains(t, err, \"read error\")\n}\n\nfunc TestI2cWorkflow(t *testing.T) {\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem()\n\ta.sys.UseMockSyscall()\n\n\tcon, err := a.GetI2cConnection(0xff, 6)\n\trequire.NoError(t, err)\n\n\t_, err = con.Write([]byte{0x00, 0x01})\n\trequire.NoError(t, err)\n\n\tdata := []byte{42, 42}\n\t_, err = con.Read(data)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte{0x00, 0x01}, data)\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem(pwmMockPathsMux13ArduinoI2c)\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 6)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0x0A})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.Error(t, err)\n\trequire.ErrorContains(t, err, \"close error\")\n}\n\nfunc Test_validateAndSetupI2cBusNumber(t *testing.T) {\n\ttests := map[string]struct {\n\t\tboard   string\n\t\tbusNr   int\n\t\twantErr string\n\t}{\n\t\t\"arduino_number_negative_error\": {\n\t\t\tbusNr:   -1,\n\t\t\twantErr: \"unsupported I2C bus '-1'\",\n\t\t},\n\t\t\"arduino_number_1_error\": {\n\t\t\tbusNr:   1,\n\t\t\twantErr: \"unsupported I2C bus '1'\",\n\t\t},\n\t\t\"arduino_number_6_ok\": {\n\t\t\tbusNr: 6,\n\t\t},\n\t\t\"sparkfun_number_negative_error\": {\n\t\t\tboard:   \"sparkfun\",\n\t\t\tbusNr:   -1,\n\t\t\twantErr: \"unsupported I2C bus '-1'\",\n\t\t},\n\t\t\"sparkfun_number_1_ok\": {\n\t\t\tboard: \"sparkfun\",\n\t\t\tbusNr: 1,\n\t\t},\n\t\t\"miniboard_number_6_error\": {\n\t\t\tboard:   \"miniboard\",\n\t\t\tbusNr:   6,\n\t\t\twantErr: \"unsupported I2C bus '6'\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor(tc.board)\n\t\t\ta.sys.UseMockFilesystem(pwmMockPathsMux13ArduinoI2c)\n\t\t\t_ = a.Connect()\n\t\t\t// act\n\t\t\terr := a.validateAndSetupI2cBusNumber(tc.busNr)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/intel-iot/edison/miniboard_pinmap.go",
    "content": "package edison\n\nvar miniboardPinMap = map[string]sysfsPin{\n\t\"J17-1\": {\n\t\tpin:          182,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-2\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-3\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-4\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-5\": {\n\t\tpin:          135,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-6\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-7\": {\n\t\tpin:          27,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-8\": {\n\t\tpin:          20,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-9\": {\n\t\tpin:          28,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-10\": {\n\t\tpin:          111,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-11\": {\n\t\tpin:          109,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-12\": {\n\t\tpin:          115,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-13\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J17-14\": {\n\t\tpin:          128,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-1\": {\n\t\tpin:          13,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-2\": {\n\t\tpin:          165,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-3\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-4\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-5\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-6\": {\n\t\tpin:          19,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-7\": {\n\t\tpin:          12,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-8\": {\n\t\tpin:          183,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-9\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-10\": {\n\t\tpin:          110,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-11\": {\n\t\tpin:          114,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-12\": {\n\t\tpin:          129,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-13\": {\n\t\tpin:          130,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J18-14\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-1\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-2\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-3\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-4\": {\n\t\tpin:          44,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-5\": {\n\t\tpin:          46,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-6\": {\n\t\tpin:          48,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-7\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-8\": {\n\t\tpin:          131,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-9\": {\n\t\tpin:          14,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-10\": {\n\t\tpin:          40,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-11\": {\n\t\tpin:          43,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-12\": {\n\t\tpin:          77,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-13\": {\n\t\tpin:          82,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J19-14\": {\n\t\tpin:          83,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\n\t\"J20-1\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-2\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-3\": {\n\t\tpin:          -1,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-4\": {\n\t\tpin:          45,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-5\": {\n\t\tpin:          47,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-6\": {\n\t\tpin:          49,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-7\": {\n\t\tpin:          15,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-8\": {\n\t\tpin:          84,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-9\": {\n\t\tpin:          42,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-10\": {\n\t\tpin:          41,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-11\": {\n\t\tpin:          78,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-12\": {\n\t\tpin:          79,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-13\": {\n\t\tpin:          80,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"J20-14\": {\n\t\tpin:          81,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n}\n"
  },
  {
    "path": "platforms/intel-iot/edison/sparkfun_pinmap.go",
    "content": "package edison\n\nvar sparkfunPinMap = map[string]sysfsPin{\n\t\"12\": {\n\t\tpin:          12,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"13\": {\n\t\tpin:          13,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"14\": {\n\t\tpin:          14,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"15\": {\n\t\tpin:          15,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"44\": {\n\t\tpin:          44,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"45\": {\n\t\tpin:          45,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"46\": {\n\t\tpin:          46,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"47\": {\n\t\tpin:          47,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"48\": {\n\t\tpin:          48,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"49\": {\n\t\tpin:          49,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"128\": {\n\t\tpin:          128,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"129\": {\n\t\tpin:          129,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"130\": {\n\t\tpin:          130,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"131\": {\n\t\tpin:          131,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"182\": {\n\t\tpin:          182,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n\t\"183\": {\n\t\tpin:          183,\n\t\tresistor:     -1,\n\t\tlevelShifter: -1,\n\t\tpwmPin:       -1,\n\t\tmux:          []mux{},\n\t},\n}\n"
  },
  {
    "path": "platforms/intel-iot/intel-iot.go",
    "content": "/*\nPackage inteliot contains Gobot adaptors for the Intel IoT platforms.\n\nThis package currently supports the following Intel IoT hardware:\n- Intel Edison with the Arduino breakout board\n- Intel Joule developer kit\n\nFor further information refer to intel-iot README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/intel-iot/README.md\n*/\npackage inteliot\n"
  },
  {
    "path": "platforms/intel-iot/joule/README.md",
    "content": "# Edison\n\nThe Intel Joule is a WiFi and Bluetooth enabled development platform for the Internet of Things.\n\nFor more info about the Intel Joule platform go to:\n\n<http://www.intel.com/joule>\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n### Setting up your Intel Joule\n\nEverything you need to get started with the Joule is in the Intel Getting Started Guide located at:\n\n<https://intel.com/joule/getstarted>\n\nDon't forget to configure your Joule's WiFi connection and update your Joule to the latest firmware image. Gobot has been\ntested using the reference OS based on Ostro.\n\n## How To Use\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n)\n\nfunc main() {\n  e := joule.NewAdaptor()\n  led := gpio.NewLedDriver(e, \"GP103\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"blinkBot\",\n    []gobot.Connection{e},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nYou can read the [full API documentation online](http://godoc.org/gobot.io/x/gobot/v2).\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=386 GOOS=linux go build joule_blink.go\n```\n\nOnce you have compiled your code, you can you can upload your program and execute it on the Intel Joule from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp joule_blink root@<IP of your device>:/home/root/\nssh -t root@<IP of your device> \"./joule_blink\"\n```\n\nAt this point you should see one of the onboard LEDs blinking. Press control + c\nto exit.\n\nTo update the program after you made a change, you will need to scp it\nover once again and start it from the command line (via screen).\n\n## Pin Mapping\n\nThe Gobot pin mapping for the Intel Joule uses a naming system based on how the pins are labeled on the board itself.\n\nThere are 2 jumpers on the Joule expansion board, labeled \"J12\" and \"J13\". There are 2 rows of pins on each jumper, labeled\nfrom 1 to 40. So to use the 26th pin of jumper J12, you use pin name \"J12_26\".\n\nIn addition, there are pins that control the build-in LEDs (pins GP100 thru GP103) as used in the example above.\n\nThe i2c interfaces on the Intel Joule developer kit board require that you terminate the SDA & SCL lines using 2 10K resistors\npulled up to the voltage used for the i2c device, for example 5V.\n"
  },
  {
    "path": "platforms/intel-iot/joule/doc.go",
    "content": "/*\nPackage joule contains the Gobot adaptor for the Intel Joule.\n\nFor further information refer to intel-iot README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/intel-iot/joule/README.md\n*/\npackage joule // import \"gobot.io/x/gobot/v2/platforms/intel-iot/joule\"\n"
  },
  {
    "path": "platforms/intel-iot/joule/joule_adaptor.go",
    "content": "package joule\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 0\n\n\tdefaultSpiMaxSpeed = 5000 // 5kHz (more than 15kHz not possible with SPI over GPIO)\n)\n\ntype sysfsPin struct {\n\tpin    int\n\tpwmPin int\n}\n\n// Adaptor represents an Intel Joule\ntype Adaptor struct {\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor // for usage of \"adaptors.WithSpiGpioAccess()\"\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex sync.Mutex\n}\n\n// NewAdaptor returns a new Joule Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of sysfs\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\n// Further optional parameters for:\n//\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\ta := &Adaptor{\n\t\tname: gobot.DefaultName(\"Joule\"),\n\t\tsys:  sys,\n\t}\n\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tpwmPinsOpts := []adaptors.PwmPinsOptionApplier{adaptors.WithPWMPinInitializer(pwmPinInitializer)}\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\t// Valid bus numbers are [0..2] which corresponds to /dev/i2c-0 through /dev/i2c-2.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1, 2})\n\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.translateDigitalPin, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.translatePWMPin, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\n\t// SPI is only supported when \"adaptors.WithSpiGpioAccess()\" is given\n\tif len(spiBusOpts) > 0 {\n\t\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, func(int) error { return nil }, 0, 0, 0, 0, defaultSpiMaxSpeed,\n\t\t\ta.DigitalPinsAdaptor, spiBusOpts...)\n\t}\n\n\treturn a\n}\n\n// Name returns the adaptors name\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the adaptors name\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize releases all i2c devices and exported digital and pwm pins.\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n\nfunc (a *Adaptor) translateDigitalPin(id string) (string, int, error) {\n\tif val, ok := sysfsPinMap[id]; ok {\n\t\treturn \"\", val.pin, nil\n\t}\n\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a digital pin\", id)\n}\n\nfunc (a *Adaptor) translatePWMPin(id string) (string, int, error) {\n\tsysPin, ok := sysfsPinMap[id]\n\tif !ok {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a pin\", id)\n\t}\n\tif sysPin.pwmPin == -1 {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a PWM pin\", id)\n\t}\n\treturn \"/sys/class/pwm/pwmchip0\", sysPin.pwmPin, nil\n}\n\nfunc pwmPinInitializer(_ string, pin gobot.PWMPinner) error {\n\tif err := pin.Export(); err != nil {\n\t\treturn err\n\t}\n\tif err := pin.SetPeriod(10000000); err != nil {\n\t\treturn err\n\t}\n\treturn pin.SetEnabled(true)\n}\n"
  },
  {
    "path": "platforms/intel-iot/joule/joule_adaptor_test.go",
    "content": "package joule\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc initConnectedTestAdaptorWithMockedFilesystem() (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor()\n\tmockPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm0/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm0/enable\",\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio13/value\",\n\t\t\"/sys/class/gpio/gpio13/direction\",\n\t\t\"/sys/class/gpio/gpio40/value\",\n\t\t\"/sys/class/gpio/gpio40/direction\",\n\t\t\"/sys/class/gpio/gpio446/value\",\n\t\t\"/sys/class/gpio/gpio446/direction\",\n\t\t\"/sys/class/gpio/gpio463/value\",\n\t\t\"/sys/class/gpio/gpio463/direction\",\n\t\t\"/sys/class/gpio/gpio421/value\",\n\t\t\"/sys/class/gpio/gpio421/direction\",\n\t\t\"/sys/class/gpio/gpio221/value\",\n\t\t\"/sys/class/gpio/gpio221/direction\",\n\t\t\"/sys/class/gpio/gpio243/value\",\n\t\t\"/sys/class/gpio/gpio243/direction\",\n\t\t\"/sys/class/gpio/gpio229/value\",\n\t\t\"/sys/class/gpio/gpio229/direction\",\n\t\t\"/sys/class/gpio/gpio253/value\",\n\t\t\"/sys/class/gpio/gpio253/direction\",\n\t\t\"/sys/class/gpio/gpio261/value\",\n\t\t\"/sys/class/gpio/gpio261/direction\",\n\t\t\"/sys/class/gpio/gpio214/value\",\n\t\t\"/sys/class/gpio/gpio214/direction\",\n\t\t\"/sys/class/gpio/gpio14/direction\",\n\t\t\"/sys/class/gpio/gpio14/value\",\n\t\t\"/sys/class/gpio/gpio165/direction\",\n\t\t\"/sys/class/gpio/gpio165/value\",\n\t\t\"/sys/class/gpio/gpio212/direction\",\n\t\t\"/sys/class/gpio/gpio212/value\",\n\t\t\"/sys/class/gpio/gpio213/direction\",\n\t\t\"/sys/class/gpio/gpio213/value\",\n\t\t\"/sys/class/gpio/gpio236/direction\",\n\t\t\"/sys/class/gpio/gpio236/value\",\n\t\t\"/sys/class/gpio/gpio237/direction\",\n\t\t\"/sys/class/gpio/gpio237/value\",\n\t\t\"/sys/class/gpio/gpio204/direction\",\n\t\t\"/sys/class/gpio/gpio204/value\",\n\t\t\"/sys/class/gpio/gpio205/direction\",\n\t\t\"/sys/class/gpio/gpio205/value\",\n\t\t\"/sys/class/gpio/gpio263/direction\",\n\t\t\"/sys/class/gpio/gpio263/value\",\n\t\t\"/sys/class/gpio/gpio262/direction\",\n\t\t\"/sys/class/gpio/gpio262/value\",\n\t\t\"/sys/class/gpio/gpio240/direction\",\n\t\t\"/sys/class/gpio/gpio240/value\",\n\t\t\"/sys/class/gpio/gpio241/direction\",\n\t\t\"/sys/class/gpio/gpio241/value\",\n\t\t\"/sys/class/gpio/gpio242/direction\",\n\t\t\"/sys/class/gpio/gpio242/value\",\n\t\t\"/sys/class/gpio/gpio218/direction\",\n\t\t\"/sys/class/gpio/gpio218/value\",\n\t\t\"/sys/class/gpio/gpio250/direction\",\n\t\t\"/sys/class/gpio/gpio250/value\",\n\t\t\"/sys/class/gpio/gpio451/direction\",\n\t\t\"/sys/class/gpio/gpio451/value\",\n\t\t\"/dev/i2c-0\",\n\t}\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm0/period\"].Contents = \"5000\"\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Joule\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.Nil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithSpiGpioAccess(\"1\", \"2\", \"3\", \"4\"))\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Joule\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestFinalize(t *testing.T) {\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem()\n\n\t_ = a.DigitalWrite(\"J12_1\", 1)\n\t_ = a.PwmWrite(\"J12_26\", 100)\n\n\trequire.NoError(t, a.Finalize())\n\n\t// assert finalize after finalize is working\n\trequire.NoError(t, a.Finalize())\n\n\t// assert re-connect is working\n\trequire.NoError(t, a.Connect())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\t_ = a.DigitalWrite(\"J12_1\", 1)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio451/value\"].Contents)\n\n\t_ = a.DigitalWrite(\"J12_1\", 0)\n\n\ti, err := a.DigitalRead(\"J12_1\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 0, i)\n\n\t_, err = a.DigitalRead(\"P9_99\")\n\trequire.ErrorContains(t, err, \"'P9_99' is not a valid id for a digital pin\")\n}\n\nfunc TestPwm(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\n\terr := a.PwmWrite(\"J12_26\", 100)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"3921568\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm0/duty_cycle\"].Contents)\n\n\terr = a.PwmWrite(\"4\", 100)\n\trequire.ErrorContains(t, err, \"'4' is not a valid id for a pin\")\n\n\terr = a.PwmWrite(\"J12_1\", 100)\n\trequire.ErrorContains(t, err, \"'J12_1' is not a valid id for a PWM pin\")\n}\n\nfunc TestPwmPinExportError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tdelete(fs.Files, \"/sys/class/pwm/pwmchip0/export\")\n\n\terr := a.PwmWrite(\"J12_26\", 100)\n\trequire.ErrorContains(t, err, \"/sys/class/pwm/pwmchip0/export: no such file\")\n}\n\nfunc TestPwmPinEnableError(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem()\n\tdelete(fs.Files, \"/sys/class/pwm/pwmchip0/pwm0/enable\")\n\n\terr := a.PwmWrite(\"J12_26\", 100)\n\trequire.ErrorContains(t, err, \"/sys/class/pwm/pwmchip0/pwm0/enable: no such file\")\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 0, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-2\"})\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 2)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/intel-iot/joule/tuchuck_pinmap.go",
    "content": "package joule\n\nvar sysfsPinMap = map[string]sysfsPin{\n\t// GPIO22\n\t\"J12_1\": {\n\t\tpin:    451,\n\t\tpwmPin: -1,\n\t},\n\t// SPP1RX\n\t\"J12_2\": {\n\t\tpin:    421,\n\t\tpwmPin: -1,\n\t},\n\t// PMICRST\n\t\"J12_3\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// SPP1TX\n\t\"J12_4\": {\n\t\tpin:    422,\n\t\tpwmPin: -1,\n\t},\n\t// 19.2mhz\n\t\"J12_5\": {\n\t\tpin:    356,\n\t\tpwmPin: -1,\n\t},\n\t// SPP1FS0\n\t\"J12_6\": {\n\t\tpin:    417,\n\t\tpwmPin: -1,\n\t},\n\t// UART0TX\n\t\"J12_7\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// SPP1FS2\n\t\"J12_8\": {\n\t\tpin:    419,\n\t\tpwmPin: -1,\n\t},\n\t// PWRGD\n\t\"J12_9\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// SPP1CLK\n\t\"J12_10\": {\n\t\tpin:    416,\n\t\tpwmPin: -1,\n\t},\n\t// I2C0SDA\n\t\"J12_11\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2S1SDI\n\t\"J12_12\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2C0SCL\n\t\"J12_13\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2S1SDO\n\t\"J12_14\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// II0SDA\n\t\"J12_15\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2S1WS\n\t\"J12_16\": {\n\t\tpin:    380,\n\t\tpwmPin: -1,\n\t},\n\t// IIC0SCL\n\t\"J12_17\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2S1CLK\n\t\"J12_18\": {\n\t\tpin:    379,\n\t\tpwmPin: -1,\n\t},\n\t// IIC1SDA\n\t\"J12_19\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2S1MCL\n\t\"J12_20\": {\n\t\tpin:    378,\n\t\tpwmPin: -1,\n\t},\n\t// IIC1SCL\n\t\"J12_21\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// UART1TX\n\t\"J12_22\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// ISH_IO6\n\t\"J12_23\": {\n\t\tpin:    343,\n\t\tpwmPin: -1,\n\t},\n\t// UART1RX\n\t\"J12_24\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// ISH_IO5\n\t\"J12_25\": {\n\t\tpin:    342,\n\t\tpwmPin: -1,\n\t},\n\t// PWM0\n\t\"J12_26\": {\n\t\tpin:    463,\n\t\tpwmPin: 0,\n\t},\n\t// ISH_IO4\n\t\"J12_27\": {\n\t\tpin:    341,\n\t\tpwmPin: -1,\n\t},\n\t// PWM1\n\t\"J12_28\": {\n\t\tpin:    464,\n\t\tpwmPin: 1,\n\t},\n\t// ISH_IO3\n\t\"J12_29\": {\n\t\tpin:    340,\n\t\tpwmPin: -1,\n\t},\n\t// PWM2\n\t\"J12_30\": {\n\t\tpin:    465,\n\t\tpwmPin: 2,\n\t},\n\t// ISH_IO2\n\t\"J12_31\": {\n\t\tpin:    339,\n\t\tpwmPin: -1,\n\t},\n\t// PWM3\n\t\"J12_32\": {\n\t\tpin:    466,\n\t\tpwmPin: 3,\n\t},\n\t// ISH_IO1\n\t\"J12_33\": {\n\t\tpin:    338,\n\t\tpwmPin: -1,\n\t},\n\t// 1.8V\n\t\"J12_34\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// ISH_IO0\n\t\"J12_35\": {\n\t\tpin:    337,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J12_36\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J12_37\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J12_38\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J12_39\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J12_40\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\n\t// Second header\n\t// GND\n\t\"J13_1\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// 5V\n\t\"J13_2\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J13_3\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// 5V\n\t\"J13_4\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J13_5\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// 3.3V\n\t\"J13_6\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J13_7\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// 3.3V\n\t\"J13_8\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J13_9\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// 1.8V\n\t\"J13_10\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// GPIO\n\t\"J13_11\": {\n\t\tpin:    456,\n\t\tpwmPin: -1,\n\t},\n\t// 1.8V\n\t\"J13_12\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// PANEL\n\t\"J13_13\": {\n\t\tpin:    270,\n\t\tpwmPin: -1,\n\t},\n\t// GND\n\t\"J13_14\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// PANEL\n\t\"J13_15\": {\n\t\tpin:    271,\n\t\tpwmPin: -1,\n\t},\n\t// CAMERA\n\t\"J13_16\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// PANEL\n\t\"J13_17\": {\n\t\tpin:    272,\n\t\tpwmPin: -1,\n\t},\n\t// CAMERA\n\t\"J13_18\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// SPP0FS0\n\t\"J13_19\": {\n\t\tpin:    411,\n\t\tpwmPin: -1,\n\t},\n\t// CAMERA\n\t\"J13_20\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// SPP0FS1\n\t\"J13_21\": {\n\t\tpin:    412,\n\t\tpwmPin: -1,\n\t},\n\t// SPI_DAT\n\t\"J13_22\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// SPP0FS2\n\t\"J13_23\": {\n\t\tpin:    413,\n\t\tpwmPin: -1,\n\t},\n\t// SPICLKB\n\t\"J13_24\": {\n\t\tpin:    384,\n\t\tpwmPin: -1,\n\t},\n\t// SPP0CLK\n\t\"J13_25\": {\n\t\tpin:    410,\n\t\tpwmPin: -1,\n\t},\n\t// SPICLKA\n\t\"J13_26\": {\n\t\tpin:    383,\n\t\tpwmPin: -1,\n\t},\n\t// SPP0TX\n\t\"J13_27\": {\n\t\tpin:    414,\n\t\tpwmPin: -1,\n\t},\n\t// UART0RX\n\t\"J13_28\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// SPP0RX\n\t\"J13_29\": {\n\t\tpin:    415,\n\t\tpwmPin: -1,\n\t},\n\t// UART0RT\n\t\"J13_30\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2C1SDA\n\t\"J13_31\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// UART0CT\n\t\"J13_32\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2C1SCL\n\t\"J13_33\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// IURT0TX\n\t\"J13_34\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2C2SDA\n\t\"J13_35\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// IURT0RX\n\t\"J13_36\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// I2C2SCL\n\t\"J13_37\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// IURT0RT\n\t\"J13_38\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\t// RTC_CLK\n\t\"J13_39\": {\n\t\tpin:    367,\n\t\tpwmPin: -1,\n\t},\n\t// IURT0CT\n\t\"J13_40\": {\n\t\tpin:    -1,\n\t\tpwmPin: -1,\n\t},\n\n\t// Built-in LEDs\n\t// LED100\n\t\"GP100\": {\n\t\tpin:    337,\n\t\tpwmPin: -1,\n\t},\n\t// LED101\n\t\"GP101\": {\n\t\tpin:    338,\n\t\tpwmPin: -1,\n\t},\n\t// LED102\n\t\"GP102\": {\n\t\tpin:    339,\n\t\tpwmPin: -1,\n\t},\n\t// LED103\n\t\"GP103\": {\n\t\tpin:    340,\n\t\tpwmPin: -1,\n\t},\n\t// LEDWIFI\n\t\"GP104\": {\n\t\tpin:    438,\n\t\tpwmPin: -1,\n\t},\n\t// LEDBT\n\t\"GP105\": {\n\t\tpin:    439,\n\t\tpwmPin: -1,\n\t},\n}\n"
  },
  {
    "path": "platforms/jetson/README.md",
    "content": "# Jetson Nano\n\nThe Jetson Nano is ARM based single board computer with digital & PWM GPIO, and i2c interfaces built in.\n\nThe Gobot adaptor for the Jetson Nano should support Jetno Nano.\n\nFor more info about the Jetson Nano platform, click [here](https://developer.nvidia.com/embedded/jetson-nano/).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nWe recommend updating to the latest jetson-nano OS when using the Jetson Nano, however Gobot should also support older\nversions of the OS, should your application require this.\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/jetson\"\n)\n\nfunc main() {\n  r := jetson.NewAdaptor()\n  led := gpio.NewLedDriver(r, \"40\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"blinkBot\",\n    []gobot.Connection{r},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\n}\n```\n\n## How to Connect\n\n### Compiling\n\nOnce you have compiled your code, you can upload your program and execute it on the Jetson Nano from your workstation using\nthe `scp` and `ssh` commands like this:\n\n```sh\nscp jetson-nano_blink jn@192.168.1.xxx:/home/jn/\nssh -t jn@192.168.1.xxx \"./jetson-nano_blink\"\n```\n"
  },
  {
    "path": "platforms/jetson/adaptor.go",
    "content": "package jetson\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmPeriodDefault   = 3000000 // 3 ms = 333 Hz\n\tpwmPeriodMinimum   = 5334\n\tpwmDutyRateMinimum = 0.0005 // minimum duty of 1500 for default period, ~3 for minimum period\n\n\tdefaultI2cBusNumber = 1\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 10000000\n)\n\n// Adaptor is the Gobot adaptor for the Jetson Nano\ntype Adaptor struct {\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex *sync.Mutex\n}\n\n// NewAdaptor creates a Jetson Nano adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of sysfs\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\n// Further optional parameters for:\n//\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\ta := &Adaptor{\n\t\tname:  gobot.DefaultName(\"JetsonNano\"),\n\t\tsys:   sys,\n\t\tmutex: &sync.Mutex{},\n\t}\n\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tpwmPinsOpts := []adaptors.PwmPinsOptionApplier{\n\t\tadaptors.WithPWMDefaultPeriod(pwmPeriodDefault),\n\t\tadaptors.WithPWMMinimumPeriod(pwmPeriodMinimum),\n\t\tadaptors.WithPWMMinimumDutyRate(pwmDutyRateMinimum),\n\t}\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\t// Valid bus numbers are [0,1] which corresponds to /dev/i2c-0 through /dev/i2c-1.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\t// Valid bus numbers are [0,1] which corresponds to /dev/spidev0.x through /dev/spidev1.x.\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.translateDigitalPin, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.translatePWMPin, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\treturn a\n}\n\n// Name returns the adaptors name\nfunc (a *Adaptor) Name() string {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.name\n}\n\n// SetName sets the adaptors name\nfunc (a *Adaptor) SetName(n string) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.name = n\n}\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board and pins\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\treturn err\n}\n\nfunc (a *Adaptor) translateDigitalPin(id string) (string, int, error) {\n\tif line, ok := gpioPins[id]; ok {\n\t\treturn \"\", line, nil\n\t}\n\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a digital pin\", id)\n}\n\nfunc (a *Adaptor) translatePWMPin(id string) (string, int, error) {\n\tif channel, ok := pwmPins[id]; ok {\n\t\treturn \"/sys/class/pwm/pwmchip0\", channel, nil\n\t}\n\treturn \"\", 0, fmt.Errorf(\"'%s' is not a valid pin id for PWM on '%s'\", id, a.name)\n}\n"
  },
  {
    "path": "platforms/jetson/adaptor_test.go",
    "content": "package jetson\n\nimport (\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n\t_ spi.Connector               = (*Adaptor)(nil)\n)\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"JetsonNano\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.mutex)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestFinalize(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/dev/i2c-1\",\n\t\t\"/dev/i2c-0\",\n\t\t\"/dev/spidev0.0\",\n\t\t\"/dev/spidev0.1\",\n\t}\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\t_ = a.DigitalWrite(\"3\", 1)\n\n\t_, _ = a.GetI2cConnection(0xff, 0)\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestPWMPinsConnect(t *testing.T) {\n\ta := NewAdaptor()\n\n\terr := a.PwmWrite(\"33\", 1)\n\trequire.ErrorContains(t, err, \"not connected\")\n\n\terr = a.Connect()\n\trequire.NoError(t, err)\n}\n\nfunc TestPWMPinsReConnect(t *testing.T) {\n\t// arrange\n\tmockPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm2/duty_cycle\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm2/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm2/polarity\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm2/enable\",\n\t}\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\trequire.NoError(t, a.PwmWrite(\"33\", 1))\n\trequire.NoError(t, a.Finalize())\n\t// act\n\terr := a.Connect()\n\t// assert\n\trequire.NoError(t, err)\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio216/value\",\n\t\t\"/sys/class/gpio/gpio216/direction\",\n\t\t\"/sys/class/gpio/gpio14/value\",\n\t\t\"/sys/class/gpio/gpio14/direction\",\n\t}\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio216/value\"].Contents)\n\n\terr = a.DigitalWrite(\"13\", 1)\n\trequire.NoError(t, err)\n\ti, err := a.DigitalRead(\"13\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 1, i)\n\n\trequire.ErrorContains(t, a.DigitalWrite(\"notexist\", 1), \"'notexist' is not a valid id for a digital pin\")\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestDigitalPinConcurrency(t *testing.T) {\n\toldProcs := runtime.GOMAXPROCS(0)\n\truntime.GOMAXPROCS(8)\n\tdefer runtime.GOMAXPROCS(oldProcs)\n\n\tfor retry := 0; retry < 20; retry++ {\n\n\t\ta := NewAdaptor()\n\t\tvar wg sync.WaitGroup\n\n\t\tfor i := 0; i < 20; i++ {\n\t\t\twg.Add(1)\n\t\t\tpinAsString := strconv.Itoa(i)\n\t\t\tgo func(pin string) {\n\t\t\t\tdefer wg.Done()\n\t\t\t\t_, _ = a.DigitalPin(pin)\n\t\t\t}(pinAsString)\n\t\t}\n\n\t\twg.Wait()\n\t}\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, int64(10000000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 1, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-1\"})\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 1)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n\nfunc Test_translatePWMPin(t *testing.T) {\n\ttests := map[string]struct {\n\t\tpin         string\n\t\twantDir     string\n\t\twantChannel int\n\t\twantErr     error\n\t}{\n\t\t\"32_pwm0\": {\n\t\t\tpin:         \"32\",\n\t\t\twantDir:     \"/sys/class/pwm/pwmchip0\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"33_pwm2\": {\n\t\t\tpin:         \"33\",\n\t\t\twantDir:     \"/sys/class/pwm/pwmchip0\",\n\t\t\twantChannel: 2,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor()\n\t\t\t// act\n\t\t\tdir, channel, err := a.translatePWMPin(tc.pin)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantDir, dir)\n\t\t\tassert.Equal(t, tc.wantChannel, channel)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/jetson/doc.go",
    "content": "/*\nPackage jetson contains the Gobot adaptor for the Jetson Nano.\n\nFor further information refer to Jetson README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/jetson/README.md\n*/\npackage jetson // import \"gobot.io/x/gobot/v2/platforms/jetson\"\n"
  },
  {
    "path": "platforms/jetson/pinmap.go",
    "content": "package jetson\n\nvar gpioPins = map[string]int{\n\t\"7\":  216,\n\t\"11\": 50,\n\t\"12\": 79,\n\t\"13\": 14,\n\t\"15\": 194,\n\t\"16\": 232,\n\t\"18\": 15,\n\t\"19\": 16,\n\t\"21\": 17,\n\t\"22\": 13,\n\t\"23\": 18,\n\t\"24\": 19,\n\t\"26\": 20,\n\t\"29\": 149,\n\t\"31\": 200,\n\t\"32\": 168,\n\t\"33\": 38,\n\t\"35\": 76,\n\t\"36\": 51,\n\t\"37\": 12,\n\t\"38\": 77,\n\t\"40\": 78,\n}\n\n// pin to pwm channel (pwm0, pwm2)\nvar pwmPins = map[string]int{\n\t\"32\": 0,\n\t\"33\": 2,\n}\n"
  },
  {
    "path": "platforms/joystick/LICENSE",
    "content": "Copyright (c) 2014-2023 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/joystick/README.md",
    "content": "# Joystick\n\nYou can use Gobot with many USB joysticks and game controllers.\n\nCurrent configurations included:\n\n- Dualshock3 game controller\n- Dualshock4 game controller\n- Dualsense game controller\n- Thrustmaster T-Flight Hotas X Joystick\n- XBox360 game controller\n- XBox360 \"Rock Band\" drum controller\n- Nintendo Switch Joy-Con controller pair\n\n## How to Install\n\nAny platform specific info here...\n\n### macOS\n\n\n### Linux (Ubuntu and Raspbian)\n\n\n### Windows\n\n\n## How to Use\n\nController configurations are stored in Gobot, but you can also use external file in JSON format. Take a look at the `configs` directory for examples.\n\n## How to Connect\n\nPlug your USB joystick or game controller into your USB port. If your device is supported by your operating system, it might prompt you to install some system drivers.\n\nFor the Dualshock4, you must pair the device with your computers Bluetooth interface first, before running your Gobot program.\n\n## Examples\n\nThis small program receives joystick and button press events from an PlayStation 3 game controller.\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/joystick\"\n)\n\nfunc main() {\n  joystickAdaptor := joystick.NewAdaptor(\"0\")\n  stick := joystick.NewDriver(joystickAdaptor, \"dualshock3\",\n  )\n\n  work := func() {\n    // buttons\n    _ = stick.On(joystick.SquarePress, func(data interface{}) {\n      fmt.Println(\"square_press\")\n    })\n    _ = stick.On(joystick.SquareRelease, func(data interface{}) {\n      fmt.Println(\"square_release\")\n    })\n    _ = stick.On(joystick.TrianglePress, func(data interface{}) {\n      fmt.Println(\"triangle_press\")\n    })\n    _ = stick.On(joystick.TriangleRelease, func(data interface{}) {\n      fmt.Println(\"triangle_release\")\n    })\n    _ = stick.On(joystick.CirclePress, func(data interface{}) {\n      fmt.Println(\"circle_press\")\n    })\n    _ = stick.On(joystick.CircleRelease, func(data interface{}) {\n      fmt.Println(\"circle_release\")\n    })\n    _ = stick.On(joystick.XPress, func(data interface{}) {\n      fmt.Println(\"x_press\")\n    })\n    _ = stick.On(joystick.XRelease, func(data interface{}) {\n      fmt.Println(\"x_release\")\n    })\n    _ = stick.On(joystick.StartPress, func(data interface{}) {\n      fmt.Println(\"start_press\")\n    })\n    _ = stick.On(joystick.StartRelease, func(data interface{}) {\n      fmt.Println(\"start_release\")\n    })\n    _ = stick.On(joystick.SelectPress, func(data interface{}) {\n      fmt.Println(\"select_press\")\n    })\n    _ = stick.On(joystick.SelectRelease, func(data interface{}) {\n      fmt.Println(\"select_release\")\n    })\n\n    // joysticks\n    _ = stick.On(joystick.LeftX, func(data interface{}) {\n      fmt.Println(\"left_x\", data)\n    })\n    _ = stick.On(joystick.LeftY, func(data interface{}) {\n      fmt.Println(\"left_y\", data)\n    })\n    _ = stick.On(joystick.RightX, func(data interface{}) {\n      fmt.Println(\"right_x\", data)\n    })\n    _ = stick.On(joystick.RightY, func(data interface{}) {\n      fmt.Println(\"right_y\", data)\n    })\n\n    // triggers\n    _ = stick.On(joystick.R1Press, func(data interface{}) {\n      fmt.Println(\"R1Press\", data)\n    })\n    _ = stick.On(joystick.R2Press, func(data interface{}) {\n      fmt.Println(\"R2Press\", data)\n    })\n    _ = stick.On(joystick.L1Press, func(data interface{}) {\n      fmt.Println(\"L1Press\", data)\n    })\n    _ = stick.On(joystick.L2Press, func(data interface{}) {\n      fmt.Println(\"L2Press\", data)\n    })\n  }\n\n  robot := gobot.NewRobot(\"joystickBot\",\n    []gobot.Connection{joystickAdaptor},\n    []gobot.Device{stick},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How to Add A New Joystick\n\nYou can create a file similar to `joystick_dualshock3.go` and submit a pull request with the new configuration so others can use it as well.\n"
  },
  {
    "path": "platforms/joystick/bin/scanner.go",
    "content": "//go:build utils\n// +build utils\n\n// Do not build by default.\n//\n// Joystick scanner\n// Based on original code from\n// https://github.com/0xcafed00d/joystick/blob/master/joysticktest/joysticktest.go\n// Simple program that displays the state of the specified joystick\n//\n//\tgo run joysticktest.go 2\n//\n// displays state of joystick id 2\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/0xcafed00d/joystick\"\n\t\"github.com/nsf/termbox-go\"\n)\n\nfunc printAt(x, y int, s string) {\n\tfor _, r := range s {\n\t\ttermbox.SetCell(x, y, r, termbox.ColorDefault, termbox.ColorDefault)\n\t\tx++\n\t}\n}\n\nfunc readJoystick(js joystick.Joystick) {\n\tjinfo, err := js.Read()\n\tif err != nil {\n\t\tprintAt(1, 5, \"Error: \"+err.Error())\n\t\treturn\n\t}\n\n\tprintAt(1, 5, \"Buttons:\")\n\tfor button := 0; button < js.ButtonCount(); button++ {\n\t\t//nolint:gosec // TODO: fix later\n\t\tif jinfo.Buttons&(1<<uint32(button)) != 0 {\n\t\t\tprintAt(10+button, 5, \"X\")\n\t\t\tprintAt(1, 6, fmt.Sprintf(\"Button %2d Pressed\", button))\n\t\t} else {\n\t\t\tprintAt(10+button, 5, \".\")\n\t\t}\n\t}\n\n\tfor axis := 0; axis < js.AxisCount(); axis++ {\n\t\tprintAt(1, axis+8, fmt.Sprintf(\"Axis %2d Value: %7d\", axis, jinfo.AxisData[axis]))\n\t}\n}\n\nfunc main() {\n\tjsid := 0\n\tif len(os.Args) > 1 {\n\t\ti, err := strconv.Atoi(os.Args[1])\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t\treturn\n\t\t}\n\t\tjsid = i\n\t}\n\n\tjs, jserr := joystick.Open(jsid)\n\n\tif jserr != nil {\n\t\tfmt.Println(jserr)\n\t\treturn\n\t}\n\n\terr := termbox.Init()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer termbox.Close()\n\n\teventQueue := make(chan termbox.Event)\n\tgo func() {\n\t\tfor {\n\t\t\teventQueue <- termbox.PollEvent()\n\t\t}\n\t}()\n\n\tticker := time.NewTicker(time.Millisecond * 40)\n\n\tfor doQuit := false; !doQuit; {\n\t\tselect {\n\t\tcase ev := <-eventQueue:\n\t\t\tif ev.Type == termbox.EventKey {\n\t\t\t\tif ev.Ch == 'q' {\n\t\t\t\t\tdoQuit = true\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ev.Type == termbox.EventResize {\n\t\t\t\ttermbox.Flush()\n\t\t\t}\n\n\t\tcase <-ticker.C:\n\t\t\tprintAt(1, 0, \"-- Press 'q' to Exit --\")\n\t\t\tprintAt(1, 1, fmt.Sprintf(\"Joystick Name: %s\", js.Name())) //nolint:perfsprint // ok here\n\t\t\tprintAt(1, 2, fmt.Sprintf(\"   Axis Count: %d\", js.AxisCount()))\n\t\t\tprintAt(1, 3, fmt.Sprintf(\" Button Count: %d\", js.ButtonCount()))\n\t\t\treadJoystick(js)\n\t\t\ttermbox.Flush()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "platforms/joystick/configs/dualsense.json",
    "content": "{\n    \"name\": \"Sony PLAYSTATION(R)5 Controller\",\n    \"guid\": \"E7D56FCA-A01F-4A14-B0D0-4FDAFD847E5E\",\n    \"axis\": [\n        {\n            \"name\": \"left_x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"left_y\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"right_x\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"right_y\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"l2\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"r2\",\n            \"id\": 5\n        }\n    ],\n    \"buttons\": [\n        {\n            \"name\": \"x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"circle\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"square\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"triangle\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"l1\",\n            \"id\": 9\n        },\n        {\n            \"name\": \"r1\",\n            \"id\": 10\n        },\n        {\n            \"name\": \"create\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"options\",\n            \"id\": 6\n        },\n        {\n            \"name\": \"ps\",\n            \"id\": 5\n        },\n        {\n            \"name\": \"up\",\n            \"id\": 11\n        },\n        {\n            \"name\": \"down\",\n            \"id\": 12\n        },\n        {\n            \"name\": \"left\",\n            \"id\": 13\n        },\n        {\n            \"name\": \"right\",\n            \"id\": 14\n        },\n        {\n            \"name\": \"trackpad\",\n            \"id\": 15\n        }\n    ]\n}\n"
  },
  {
    "path": "platforms/joystick/configs/dualshock3.json",
    "content": "{\n    \"name\": \"Sony PLAYSTATION(R)3 Controller\",\n    \"guid\": \"030000004c0500006802000011010000\",\n    \"axis\": [\n        {\n            \"name\": \"left_x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"left_y\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"l2\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"right_x\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"right_y\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"r2\",\n            \"id\": 5\n        }\n    ],\n    \"buttons\": [\n        {\n            \"name\": \"square\",\n            \"id\": 15\n        },\n        {\n            \"name\": \"triangle\",\n            \"id\": 12\n        },\n        {\n            \"name\": \"circle\",\n            \"id\": 13\n        },\n        {\n            \"name\": \"x\",\n            \"id\": 14\n        },\n        {\n            \"name\": \"up\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"down\",\n            \"id\": 6\n        },\n        {\n            \"name\": \"left\",\n            \"id\": 7\n        },\n        {\n            \"name\": \"right\",\n            \"id\": 5\n        },\n        {\n            \"name\": \"left_stick\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"right_stick\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"l1\",\n            \"id\": 10\n        },\n        {\n            \"name\": \"l2\",\n            \"id\": 8\n        },\n        {\n            \"name\": \"r1\",\n            \"id\": 11\n        },\n        {\n            \"name\": \"r2\",\n            \"id\": 9\n        },\n        {\n            \"name\": \"start\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"select\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"home\",\n            \"id\": 16\n        }\n    ]\n}"
  },
  {
    "path": "platforms/joystick/configs/dualshock4.json",
    "content": "{\n    \"name\": \"Sony PLAYSTATION(R)4 Controller\",\n    \"guid\": \"1234\",\n    \"axis\": [\n        {\n            \"name\": \"left_x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"left_y\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"right_x\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"right_y\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"l2\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"r2\",\n            \"id\": 5\n        },\n        {\n            \"name\": \"up\",\n            \"id\": 7\n        },\n        {\n            \"name\": \"down\",\n            \"id\": 7\n        },\n        {\n            \"name\": \"left\",\n            \"id\": 6\n        },\n        {\n            \"name\": \"right\",\n            \"id\": 6\n        }\n    ],\n    \"buttons\": [\n        {\n            \"name\": \"square\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"triangle\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"circle\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"l1\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"l2\",\n            \"id\": 6\n        },\n        {\n            \"name\": \"r2\",\n            \"id\": 7\n        },\n        {\n            \"name\": \"r1\",\n            \"id\": 5\n        },\n        {\n            \"name\": \"share\",\n            \"id\": 8\n        },\n        {\n            \"name\": \"options\",\n            \"id\": 9\n        },\n        {\n            \"name\": \"ps\",\n            \"id\": 10\n        },\n        {\n            \"name\": \"left\",\n            \"id\": 11\n        },\n        {\n            \"name\": \"right\",\n            \"id\": 12\n        }\n    ]\n}\n"
  },
  {
    "path": "platforms/joystick/configs/magicseer1.json",
    "content": "{\n    \"name\": \"Magicse R1\",\n    \"guid\": \"030000004c0\",\n    \"axis\": [\n        {\n            \"name\": \"left_x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"left_y\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"right_x\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"right_y\",\n            \"id\": 3\n        }\n    ],\n    \"buttons\": [\n        {\n            \"name\": \"a\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"b\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"c\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"d\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"enter\",\n            \"id\": 6\n        },\n        {\n            \"name\": \"back\",\n            \"id\": 7\n        }\n    ],\n    \"hats\": [\n    ]\n}\n"
  },
  {
    "path": "platforms/joystick/configs/shield.json",
    "content": "{\n    \"name\": \"Nvidia SHIELD Controller\",\n    \"guid\": \"30001983600083000100\",\n    \"hats\": [\n        {\n            \"hat\": 0,\n            \"name\": \"down\",\n            \"id\": 4\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"up\",\n            \"id\": 1\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"left\",\n            \"id\": 8\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"right\",\n            \"id\": 2\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"released\",\n            \"id\": 0\n        }\n    ],\n    \"axis\": [\n        {\n            \"name\": \"left_x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"left_y\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"right_x\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"right_y\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"rt\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"lt\",\n            \"id\": 5\n        }\n    ],\n    \"buttons\": [\n        {\n            \"name\": \"x\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"a\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"b\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"y\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"lb\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"rb\",\n            \"id\": 5\n        },\n        {\n            \"name\": \"back\",\n            \"id\": 14\n        },\n        {\n            \"name\": \"start\",\n            \"id\": 7\n        },\n        {\n            \"name\": \"home\",\n            \"id\": 15\n        },\n        {\n            \"name\": \"right_stick\",\n            \"id\": 9\n        },\n        {\n            \"name\": \"left_stick\",\n            \"id\": 8\n        }\n    ]\n}\n"
  },
  {
    "path": "platforms/joystick/configs/xbox360_power_a_mini_proex.json",
    "content": "{\n    \"name\": \"PowerA MINI PROEX Controller\",\n    \"guid\": \"30001983600083000100\",\n    \"hats\": [\n        {\n            \"hat\": 0,\n            \"name\": \"down\",\n            \"id\": 4\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"up\",\n            \"id\": 1\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"left\",\n            \"id\": 8\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"upLeft\",\n            \"id\": 9\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"downLeft\",\n            \"id\": 12\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"right\",\n            \"id\": 2\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"upRight\",\n            \"id\": 3\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"downRight\",\n            \"id\": 6\n        },\n        {\n            \"hat\": 0,\n            \"name\": \"released\",\n            \"id\": 0\n        }\n    ],\n    \"axis\": [\n        {\n            \"name\": \"left_x\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"left_y\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"right_x\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"right_y\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"rt\",\n            \"id\": 5\n        },\n        {\n            \"name\": \"lt\",\n            \"id\": 2\n        }\n    ],\n    \"buttons\": [\n        {\n            \"name\": \"x\",\n            \"id\": 2\n        },\n        {\n            \"name\": \"a\",\n            \"id\": 0\n        },\n        {\n            \"name\": \"b\",\n            \"id\": 1\n        },\n        {\n            \"name\": \"y\",\n            \"id\": 3\n        },\n        {\n            \"name\": \"lb\",\n            \"id\": 4\n        },\n        {\n            \"name\": \"rb\",\n            \"id\": 5\n        },\n        {\n            \"name\": \"back\",\n            \"id\": 6\n        },\n        {\n            \"name\": \"start\",\n            \"id\": 7\n        },\n        {\n            \"name\": \"home\",\n            \"id\": 8\n        },\n        {\n            \"name\": \"right_stick\",\n            \"id\": 10\n        },\n        {\n            \"name\": \"left_stick\",\n            \"id\": 9\n        }\n    ]\n}\n"
  },
  {
    "path": "platforms/joystick/doc.go",
    "content": "/*\nPackage joystick provides the Gobot adaptor and drivers for game controllers and joysticks.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"fmt\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/platforms/joystick\"\n\t)\n\n\tfunc main() {\n\t\tjoystickAdaptor := joystick.NewAdaptor(\"0\")\n\t\tjoystick := joystick.NewDriver(joystickAdaptor, \"dualshock3\")\n\n\t\twork := func() {\n\t\t\t_ = joystick.On(joystick.Event(\"square_press\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"square_press\")\n\t\t\t})\n\t\t\t_ = joystick.On(joystick.Event(\"square_release\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"square_release\")\n\t\t\t})\n\t\t\t_ = joystick.On(joystick.Event(\"triangle_press\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"triangle_press\")\n\t\t\t})\n\t\t\t_ = joystick.On(joystick.Event(\"triangle_release\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"triangle_release\")\n\t\t\t})\n\t\t\t_ = joystick.On(joystick.Event(\"left_x\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"left_x\", data)\n\t\t\t})\n\t\t\t_ = joystick.On(joystick.Event(\"left_y\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"left_y\", data)\n\t\t\t})\n\t\t\t_ = joystick.On(joystick.Event(\"right_x\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"right_x\", data)\n\t\t\t})\n\t\t\t_ = joystick.On(joystick.Event(\"right_y\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"right_y\", data)\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"joystickBot\",\n\t\t\t[]gobot.Connection{joystickAdaptor},\n\t\t\t[]gobot.Device{joystick},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor further information refer to joystick README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/joystick/README.md\n*/\npackage joystick // import \"gobot.io/x/gobot/v2/platforms/joystick\"\n"
  },
  {
    "path": "platforms/joystick/events.go",
    "content": "package joystick\n\nconst (\n\t// left X joystick event\n\tLeftX = \"left_x\"\n\t// left Y joystick event\n\tLeftY = \"left_y\"\n\t// right X joystick event\n\tRightX = \"right_x\"\n\t// right Y joystick event\n\tRightY = \"right_y\"\n\t// L1 button joystick event\n\tL1 = \"l1\"\n\t// L1 button press event\n\tL1Press = \"l1_press\"\n\t// L1 button release event\n\tL1Release = \"l1_release\"\n\t// L2 joystick event\n\tL2 = \"l2\"\n\t// L2 button press event\n\tL2Press = \"l2_press\"\n\t// L2 button release event\n\tL2Release = \"l2_release\"\n\t// L3 button press event\n\tL3Press = \"l3_press\"\n\t// L3 button release event\n\tL3Release = \"l3_release\"\n\t// R1 button joystick event\n\tR1 = \"r1\"\n\t// R1 button press event\n\tR1Press = \"r1_press\"\n\t// R1 button release event\n\tR1Release = \"r1_release\"\n\t// R2 joystick event\n\tR2 = \"r2\"\n\t// R2 button press event\n\tR2Press = \"r2_press\"\n\t// R1 button release event\n\tR2Release = \"r2_release\"\n\t// R3 button press event\n\tR3Press = \"r3_press\"\n\t// R1 button release event\n\tR3Release = \"r3_release\"\n\t// up gamepad press event\n\tUpPress = \"up_press\"\n\t// up gamepad release event\n\tUpRelease = \"up_release\"\n\t// down gamepad press event\n\tDownPress = \"down_press\"\n\t// down gamepad release event\n\tDownRelease = \"down_release\"\n\t// left gamepad press event\n\tLeftPress = \"left_press\"\n\t// left gamepad release event\n\tLeftRelease = \"left_release\"\n\t// right gamepad press event\n\tRightPress = \"right_press\"\n\t// right gamepad release event\n\tRightRelease = \"right_release\"\n\t// square button press event\n\tSquarePress = \"square_press\"\n\t// square button release event\n\tSquareRelease = \"square_release\"\n\t// circle button press event\n\tCirclePress = \"circle_press\"\n\t// circle button release event\n\tCircleRelease = \"circle_release\"\n\t// triangle button press event\n\tTrianglePress = \"triangle_press\"\n\t// triangle button release event\n\tTriangleRelease = \"triangle_release\"\n\t// X button press event\n\tXPress = \"x_press\"\n\t// X button release event\n\tXRelease = \"x_release\"\n\t// share button press event\n\tSharePress = \"share_press\"\n\t// share button release event\n\tShareRelease = \"share_release\"\n\t// create button press event\n\tCreatePress = \"create_press\"\n\t// create button release event\n\tCreateRelease = \"create_release\"\n\t// ps button press event\n\tPSPress = \"ps_press\"\n\t// ps button release event\n\tPSRelease = \"ps_release\"\n\t// trackpad button press event\n\tTrackpadPress = \"trackpad_press\"\n\t// trackpad button release event\n\tTrackpadRelease = \"trackpad_release\"\n\t// options button press event\n\tOptionsPress = \"options_press\"\n\t// options button release event\n\tOptionsRelease = \"options_release\"\n\t// home button press event\n\tHomePress = \"home_press\"\n\t// home button release event\n\tHomeRelease = \"home_release\"\n\t// start button press event\n\tStartPress = \"start_press\"\n\t// start button release event\n\tStartRelease = \"start_release\"\n\t// select button press event\n\tSelectPress = \"select_press\"\n\t// select button release event\n\tSelectRelease = \"select_release\"\n\t// rt button press event\n\tRTPress = \"rt_press\"\n\t// rt button release event\n\tRTRelease = \"rt_release\"\n\t// lt button press event\n\tLTPress = \"lt_press\"\n\t// lt button release event\n\tLTRelease = \"lt_release\"\n\t// Y button press event\n\tYPress = \"y_press\"\n\t// Y button release event\n\tYRelease = \"y_release\"\n\t// A button press event\n\tAPress = \"a_press\"\n\t// A button release event\n\tARelease = \"a_release\"\n\t// B button press event\n\tBPress = \"b_press\"\n\t// B button release event\n\tBRelease = \"b_release\"\n\t// rb button press event\n\tRBPress = \"rb_press\"\n\t// rb button release event\n\tRBRelease = \"rb_release\"\n\t// lb button press event\n\tLBPress = \"lb_press\"\n\t// lb button release event\n\tLBRelease = \"lb_release\"\n\t// back button press event\n\tBackPress = \"back_press\"\n\t// back button release event\n\tBackRelease = \"back_release\"\n\t// red pad press event\n\tRedPress = \"red_press\"\n\t// red pad release event\n\tRedRelease = \"red_release\"\n\t// yellow pad press event\n\tYellowPress = \"yellow_press\"\n\t// yellow pad release event\n\tYellowRelease = \"yellow_release\"\n\t// blue pad press event\n\tBluePress = \"blue_press\"\n\t// blue pad release event\n\tBlueRelease = \"blue_release\"\n\t// green pad press event\n\tGreenPress = \"green_press\"\n\t// green pad release event\n\tGreenRelease = \"green_release\"\n\t// pedal press event\n\tPedalPress = \"pedal_press\"\n\t// pedal release event\n\tPedalRelease = \"pedal_release\"\n)\n"
  },
  {
    "path": "platforms/joystick/joystick_adaptor.go",
    "content": "package joystick\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\n\tjs \"github.com/0xcafed00d/joystick\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Adaptor represents a connection to a joystick\ntype Adaptor struct {\n\tname     string\n\tid       string\n\tjoystick js.Joystick\n\tconnect  func(*Adaptor) error\n}\n\n// NewAdaptor returns a new Joystick Adaptor.\n// Pass in the ID of the joystick you wish to connect to.\nfunc NewAdaptor(id string) *Adaptor {\n\treturn &Adaptor{\n\t\tname: gobot.DefaultName(\"Joystick\"),\n\t\tconnect: func(j *Adaptor) error {\n\t\t\ti, err := strconv.Atoi(id)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid joystick ID: %v\", err)\n\t\t\t}\n\n\t\t\tjoy, err := js.Open(i)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"no joystick available: %v\", err)\n\t\t\t}\n\n\t\t\tj.id = id\n\t\t\tj.joystick = joy\n\t\t\treturn nil\n\t\t},\n\t}\n}\n\n// Name returns the adaptors name\nfunc (j *Adaptor) Name() string { return j.name }\n\n// SetName sets the adaptors name\nfunc (j *Adaptor) SetName(n string) { j.name = n }\n\n// Connect connects to the joystick\nfunc (j *Adaptor) Connect() error {\n\treturn j.connect(j)\n}\n\n// Finalize closes connection to joystick\nfunc (j *Adaptor) Finalize() error {\n\tj.joystick.Close()\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_adaptor_test.go",
    "content": "package joystick\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc initTestAdaptor() *Adaptor {\n\ta := NewAdaptor(\"6\")\n\ta.connect = func(j *Adaptor) error {\n\t\tj.joystick = &testJoystick{}\n\t\treturn nil\n\t}\n\treturn a\n}\n\nfunc TestJoystickAdaptorName(t *testing.T) {\n\ta := initTestAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Joystick\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestAdaptorConnect(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.Connect())\n\n\ta = NewAdaptor(\"6\")\n\terr := a.Connect()\n\trequire.ErrorContains(t, err, \"no joystick available\")\n}\n\nfunc TestAdaptorFinalize(t *testing.T) {\n\ta := initTestAdaptor()\n\t_ = a.Connect()\n\trequire.NoError(t, a.Finalize())\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_driver.go",
    "content": "package joystick\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\tjs \"github.com/0xcafed00d/joystick\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// Dualshock3 joystick configuration.\n\tDualshock3 = \"dualshock3\"\n\n\t// Dualshock4 joystick configuration.\n\tDualshock4 = \"dualshock4\"\n\n\t// Dualsense joystick configuration.\n\tDualsense = \"dualsense\"\n\n\t// TFlightHotasX flight stick configuration.\n\tTFlightHotasX = \"tflightHotasX\"\n\n\t// Configuration for Xbox 360 controller.\n\tXbox360 = \"xbox360\"\n\n\t// Xbox360RockBandDrums controller configuration.\n\tXbox360RockBandDrums = \"xbox360RockBandDrums\"\n\n\t// Configuration for the Xbox One controller.\n\tXboxOne = \"xboxOne\"\n\n\t// Nvidia Shield TV Controller\n\tShield = \"shield\"\n\n\t// Nintendo Switch Joycon Controller Pair\n\tNintendoSwitchPair = \"joyconPair\"\n)\n\n// Driver represents a joystick\ntype Driver struct {\n\tgobot.Eventer\n\n\tname        string\n\tinterval    time.Duration\n\tconnection  gobot.Connection\n\tconfigPath  string\n\tconfig      joystickConfig\n\tbuttonState map[int]bool\n\taxisState   map[int]int\n\n\thalt chan bool\n}\n\n// pair is a JSON representation of name and id\ntype pair struct {\n\tName string `json:\"name\"`\n\tID   int    `json:\"id\"`\n}\n\n// joystickConfig is a JSON representation of configuration values\ntype joystickConfig struct {\n\tName    string `json:\"name\"`\n\tGUID    string `json:\"guid\"`\n\tAxis    []pair `json:\"axis\"`\n\tButtons []pair `json:\"buttons\"`\n}\n\n// NewDriver returns a new Driver with a polling interval of\n// 10 Milliseconds given a Joystick Adaptor and json button configuration\n// file location.\n//\n// Optionally accepts:\n//\n//\ttime.Duration: Interval at which the Driver is polled for new information\nfunc NewDriver(a *Adaptor, config string, v ...time.Duration) *Driver {\n\td := &Driver{\n\t\tname:        gobot.DefaultName(\"Joystick\"),\n\t\tconnection:  a,\n\t\tEventer:     gobot.NewEventer(),\n\t\tconfigPath:  config,\n\t\tbuttonState: make(map[int]bool),\n\t\taxisState:   make(map[int]int),\n\n\t\tinterval: 10 * time.Millisecond,\n\t\thalt:     make(chan bool),\n\t}\n\n\tif len(v) > 0 {\n\t\td.interval = v[0]\n\t}\n\n\td.AddEvent(\"error\")\n\treturn d\n}\n\n// Name returns the Drivers name\nfunc (j *Driver) Name() string { return j.name }\n\n// SetName sets the Drivers name\nfunc (j *Driver) SetName(n string) { j.name = n }\n\n// Connection returns the Drivers connection\nfunc (j *Driver) Connection() gobot.Connection { return j.connection }\n\n// adaptor returns joystick adaptor\nfunc (j *Driver) adaptor() *Adaptor {\n\t//nolint:forcetypeassert // ok here\n\treturn j.Connection().(*Adaptor)\n}\n\n// Start and polls the state of the joystick at the given interval.\n//\n// Emits the Events:\n//\n//\tError error - On button error\n//\tEvents defined in the json button configuration file.\n//\tThey will have the format:\n//\t\t[button]_press\n//\t\t[button]_release\n//\t\t[axis]\nfunc (j *Driver) Start() error {\n\tif err := j.initConfig(); err != nil {\n\t\treturn err\n\t}\n\n\tj.initEvents()\n\n\tgo func() {\n\t\tfor {\n\t\t\tstate, err := j.adaptor().joystick.Read()\n\t\t\tif err != nil {\n\t\t\t\tj.Publish(j.Event(\"error\"), err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// might just be missing a button definition, so keep going\n\t\t\tif err := j.handleButtons(state); err != nil {\n\t\t\t\tj.Publish(j.Event(\"error\"), err)\n\t\t\t}\n\n\t\t\t// might just be missing an axis definition, so keep going\n\t\t\tif err := j.handleAxes(state); err != nil {\n\t\t\t\tj.Publish(j.Event(\"error\"), err)\n\t\t\t}\n\n\t\t\tselect {\n\t\t\tcase <-time.After(j.interval):\n\t\t\tcase <-j.halt:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil\n}\n\nfunc (j *Driver) initConfig() error {\n\tswitch j.configPath {\n\tcase Dualshock3:\n\t\tj.config = dualshock3Config\n\tcase Dualshock4:\n\t\tj.config = dualshock4Config\n\tcase Dualsense:\n\t\tj.config = dualsenseConfig\n\tcase TFlightHotasX:\n\t\tj.config = tflightHotasXConfig\n\tcase Xbox360:\n\t\tj.config = xbox360Config\n\tcase Xbox360RockBandDrums:\n\t\tj.config = xbox360RockBandDrumsConfig\n\tcase XboxOne:\n\t\tj.config = xboxOneConfig\n\tcase Shield:\n\t\tj.config = shieldConfig\n\tcase NintendoSwitchPair:\n\t\tj.config = joyconPairConfig\n\tdefault:\n\t\terr := j.loadFile()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"loadfile error: %w\", err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (j *Driver) initEvents() {\n\tfor _, value := range j.config.Buttons {\n\t\tj.AddEvent(fmt.Sprintf(\"%s_press\", value.Name))   //nolint:perfsprint // ok here\n\t\tj.AddEvent(fmt.Sprintf(\"%s_release\", value.Name)) //nolint:perfsprint // ok here\n\t}\n\tfor _, value := range j.config.Axis {\n\t\tj.AddEvent(value.Name)\n\t}\n}\n\n// Halt stops joystick driver\nfunc (j *Driver) Halt() error {\n\tj.halt <- true\n\treturn nil\n}\n\nfunc (j *Driver) handleButtons(state js.State) error {\n\tfor button := 0; button < j.adaptor().joystick.ButtonCount(); button++ {\n\t\t//nolint:gosec // TODO: fix later\n\t\tbuttonPressed := state.Buttons&(1<<uint32(button)) != 0\n\t\tif buttonPressed != j.buttonState[button] {\n\t\t\tj.buttonState[button] = buttonPressed\n\t\t\t//nolint:gosec // TODO: fix later\n\t\t\tname := j.findName(uint8(button), j.config.Buttons)\n\t\t\tif name == \"\" {\n\t\t\t\treturn fmt.Errorf(\"unknown button: %v\", button)\n\t\t\t}\n\n\t\t\tif buttonPressed {\n\t\t\t\tj.Publish(j.Event(fmt.Sprintf(\"%s_press\", name)), nil) //nolint:perfsprint // ok here\n\t\t\t} else {\n\t\t\t\tj.Publish(j.Event(fmt.Sprintf(\"%s_release\", name)), nil) //nolint:perfsprint // ok here\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (j *Driver) handleAxes(state js.State) error {\n\tfor axis := 0; axis < j.adaptor().joystick.AxisCount(); axis++ {\n\t\t//nolint:gosec // TODO: fix later\n\t\tname := j.findName(uint8(axis), j.config.Axis)\n\t\tif name == \"\" {\n\t\t\treturn fmt.Errorf(\"unknown Axis: %v\", axis)\n\t\t}\n\n\t\tif j.axisState[axis] != state.AxisData[axis] {\n\t\t\tj.axisState[axis] = state.AxisData[axis]\n\t\t\tj.Publish(name, state.AxisData[axis])\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// findName returns name from button or axis found by id in provided list\nfunc (j *Driver) findName(id uint8, list []pair) string {\n\tfor _, value := range list {\n\t\tif int(id) == value.ID {\n\t\t\treturn value.Name\n\t\t}\n\t}\n\treturn \"\"\n}\n\n// findID returns the ID based on the name from button or axis.\nfunc (j *Driver) findID(name string, list []pair) int {\n\tfor _, value := range list {\n\t\tif name == value.Name {\n\t\t\treturn value.ID\n\t\t}\n\t}\n\treturn 0\n}\n\n// loadFile load the joystick config from a .json file\nfunc (j *Driver) loadFile() error {\n\tfile, e := os.ReadFile(j.configPath)\n\tif e != nil {\n\t\treturn e\n\t}\n\n\tvar jsontype joystickConfig\n\tif err := json.Unmarshal(file, &jsontype); err != nil {\n\t\treturn err\n\t}\n\n\tj.config = jsontype\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_driver_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage joystick\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\tjs \"github.com/0xcafed00d/joystick\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestDriver(config string) (*Driver, *testJoystick) {\n\ta := NewAdaptor(\"6\")\n\ttj := &testJoystick{}\n\ta.connect = func(j *Adaptor) error {\n\t\tj.joystick = tj\n\t\treturn nil\n\t}\n\t_ = a.Connect()\n\td := NewDriver(a, config)\n\treturn d, tj\n}\n\nfunc TestJoystickDriverName(t *testing.T) {\n\td, _ := initTestDriver(\"./configs/dualshock3.json\")\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Joystick\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestDriverStart(t *testing.T) {\n\td, _ := initTestDriver(\"./configs/dualshock3.json\")\n\td.interval = 1 * time.Millisecond\n\trequire.NoError(t, d.Start())\n\ttime.Sleep(2 * time.Millisecond)\n}\n\nfunc TestDriverHalt(t *testing.T) {\n\td, _ := initTestDriver(\"./configs/dualshock3.json\")\n\tgo func() {\n\t\t<-d.halt\n\t}()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestDriverHandleEventDS3(t *testing.T) {\n\tsem := make(chan bool)\n\td, tj := initTestDriver(\"dualshock3\")\n\ttj.axisCount = 6\n\ttj.buttonCount = 17\n\n\trequire.NoError(t, d.initConfig())\n\n\td.initEvents()\n\n\t// left x stick\n\t_ = d.On(d.Event(\"left_x\"), func(data interface{}) {\n\t\tassert.Equal(t, int(255), data.(int))\n\t\tsem <- true\n\t})\n\t_ = d.handleAxes(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  0,\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"left_x\\\" was not published\")\n\t}\n\n\t// square button press\n\t_ = d.On(d.Event(\"square_press\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\t_ = d.handleButtons(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  1 << d.findID(\"square\", d.config.Buttons),\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"square_press\\\" was not published\")\n\t}\n\n\t// square button release\n\t_ = d.On(d.Event(\"square_release\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\t_ = d.handleButtons(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  0,\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"square_release\\\" was not published\")\n\t}\n}\n\nfunc TestDriverHandleEventJSONDS3(t *testing.T) {\n\tsem := make(chan bool)\n\td, tj := initTestDriver(\"./configs/dualshock3.json\")\n\ttj.axisCount = 6\n\ttj.buttonCount = 17\n\n\trequire.NoError(t, d.initConfig())\n\n\td.initEvents()\n\n\t// left x stick\n\t_ = d.On(d.Event(\"left_x\"), func(data interface{}) {\n\t\tassert.Equal(t, int(255), data.(int))\n\t\tsem <- true\n\t})\n\t_ = d.handleAxes(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  0,\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"left_x\\\" was not published\")\n\t}\n\n\t// square button press\n\t_ = d.On(d.Event(\"square_press\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\t_ = d.handleButtons(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  1 << d.findID(\"square\", d.config.Buttons),\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"square_press\\\" was not published\")\n\t}\n\n\t// square button release\n\t_ = d.On(d.Event(\"square_release\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\t_ = d.handleButtons(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  0,\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"square_release\\\" was not published\")\n\t}\n}\n\nfunc TestDriverHandleEventDS4(t *testing.T) {\n\tsem := make(chan bool)\n\td, tj := initTestDriver(\"dualshock4\")\n\ttj.axisCount = 6\n\ttj.buttonCount = 17\n\n\trequire.NoError(t, d.initConfig())\n\n\td.initEvents()\n\n\t// left x stick\n\t_ = d.On(d.Event(\"left_x\"), func(data interface{}) {\n\t\tassert.Equal(t, int(255), data.(int))\n\t\tsem <- true\n\t})\n\t_ = d.handleAxes(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  0,\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"left_x\\\" was not published\")\n\t}\n\n\t// square button press\n\t_ = d.On(d.Event(\"square_press\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\t_ = d.handleButtons(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  1 << d.findID(\"square\", d.config.Buttons),\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"square_press\\\" was not published\")\n\t}\n\n\t// square button release\n\t_ = d.On(d.Event(\"square_release\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\t_ = d.handleButtons(js.State{\n\t\tAxisData: []int{255, 0, 0, 0, 0, 0},\n\t\tButtons:  0,\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(1 * time.Second):\n\t\trequire.Fail(t, \"Button Event \\\"square_release\\\" was not published\")\n\t}\n}\n\nfunc TestDriverInvalidConfig(t *testing.T) {\n\td, _ := initTestDriver(\"./configs/doesnotexist\")\n\terr := d.Start()\n\trequire.ErrorContains(t, err, \"loadfile error\")\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_dualsense.go",
    "content": "package joystick\n\nvar dualsenseConfig = joystickConfig{\n\tName: \"Dualsense Controller\",\n\tGUID: \"E7D56FCA-A01F-4A14-B0D0-4FDAFD847E5E\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   5,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"circle\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"square\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"triangle\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"create\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"options\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"ps\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"l1\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"r1\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"up\",\n\t\t\tID:   11,\n\t\t},\n\t\t{\n\t\t\tName: \"down\",\n\t\t\tID:   12,\n\t\t},\n\t\t{\n\t\t\tName: \"left\",\n\t\t\tID:   13,\n\t\t},\n\t\t{\n\t\t\tName: \"right\",\n\t\t\tID:   14,\n\t\t},\n\t\t{\n\t\t\tName: \"trackpad\",\n\t\t\tID:   15,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_dualshock3_darwin.go",
    "content": "package joystick\n\nvar dualshock3Config = joystickConfig{\n\tName: \"Dualshock3 Controller\",\n\tGUID: \"1111\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   3,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"square\",\n\t\t\tID:   15,\n\t\t},\n\t\t{\n\t\t\tName: \"triangle\",\n\t\t\tID:   12,\n\t\t},\n\t\t{\n\t\t\tName: \"circle\",\n\t\t\tID:   13,\n\t\t},\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   14,\n\t\t},\n\t\t{\n\t\t\tName: \"up\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"down\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"left\",\n\t\t\tID:   17,\n\t\t},\n\t\t{\n\t\t\tName: \"right\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"l1\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"r1\",\n\t\t\tID:   11,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"start\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"select\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   16,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_dualshock3_linux.go",
    "content": "package joystick\n\nvar dualshock3Config = joystickConfig{\n\tName: \"Dualshock3 Controller\",\n\tGUID: \"1111\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   5,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"square\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"triangle\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"circle\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"up\",\n\t\t\tID:   13,\n\t\t},\n\t\t{\n\t\t\tName: \"down\",\n\t\t\tID:   14,\n\t\t},\n\t\t{\n\t\t\tName: \"left\",\n\t\t\tID:   15,\n\t\t},\n\t\t{\n\t\t\tName: \"right\",\n\t\t\tID:   16,\n\t\t},\n\t\t{\n\t\t\tName: \"l1\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"r1\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"start\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"select\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   10,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_dualshock3_windows.go",
    "content": "package joystick\n\nvar dualshock3Config = joystickConfig{\n\tName: \"Dualshock3 Controller\",\n\tGUID: \"1111\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   3,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"square\",\n\t\t\tID:   15,\n\t\t},\n\t\t{\n\t\t\tName: \"triangle\",\n\t\t\tID:   12,\n\t\t},\n\t\t{\n\t\t\tName: \"circle\",\n\t\t\tID:   13,\n\t\t},\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   14,\n\t\t},\n\t\t{\n\t\t\tName: \"up\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"down\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"left\",\n\t\t\tID:   17,\n\t\t},\n\t\t{\n\t\t\tName: \"right\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"l1\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"r1\",\n\t\t\tID:   11,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"start\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"select\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   16,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_dualshock4_darwin.go",
    "content": "package joystick\n\nvar dualshock4Config = joystickConfig{\n\tName: \"Dualshock4 Controller\",\n\tGUID: \"2222\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   5,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"square\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"triangle\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"circle\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"l1\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"r1\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"share\",\n\t\t\tID:   13,\n\t\t},\n\t\t{\n\t\t\tName: \"options\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   12,\n\t\t},\n\t\t{\n\t\t\tName: \"left_joystick\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"right_joystick\",\n\t\t\tID:   11,\n\t\t},\n\t\t{\n\t\t\tName: \"panel\",\n\t\t\tID:   13,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_dualshock4_linux.go",
    "content": "package joystick\n\nvar dualshock4Config = joystickConfig{\n\tName: \"Dualshock4 Controller\",\n\tGUID: \"2222\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"right_left\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"up_down\",\n\t\t\tID:   7,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"square\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"triangle\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"circle\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"l1\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"r1\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"share\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"options\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"left_joystick\",\n\t\t\tID:   11,\n\t\t},\n\t\t{\n\t\t\tName: \"right_joystick\",\n\t\t\tID:   12,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_dualshock4_windows.go",
    "content": "package joystick\n\nvar dualshock4Config = joystickConfig{\n\tName: \"Dualshock4 Controller\",\n\tGUID: \"2222\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"right_left\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"up_down\",\n\t\t\tID:   7,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"square\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"triangle\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"circle\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"l1\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"l2\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"r1\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"r2\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"share\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"options\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   12,\n\t\t},\n\t\t{\n\t\t\tName: \"left_joystick\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"right_joystick\",\n\t\t\tID:   11,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_nintendo_joycon.go",
    "content": "package joystick\n\nvar joyconPairConfig = joystickConfig{\n\tName: \"Nintendo Switch Joycon Controller Pair\",\n\tGUID: \"5555\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"lt\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"rt\",\n\t\t\tID:   5,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"a\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"b\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"up\",\n\t\t\tID:   11,\n\t\t},\n\t\t{\n\t\t\tName: \"down\",\n\t\t\tID:   12,\n\t\t},\n\t\t{\n\t\t\tName: \"left\",\n\t\t\tID:   13,\n\t\t},\n\t\t{\n\t\t\tName: \"right\",\n\t\t\tID:   14,\n\t\t},\n\t\t{\n\t\t\tName: \"lb\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"rb\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"right_stick\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"left_stick\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"options\",\n\t\t\tID:   15,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"sr_left\",\n\t\t\tID:   17,\n\t\t},\n\t\t{\n\t\t\tName: \"sl_left\",\n\t\t\tID:   19,\n\t\t},\n\t\t{\n\t\t\tName: \"sr_right\",\n\t\t\tID:   16,\n\t\t},\n\t\t{\n\t\t\tName: \"sl_right\",\n\t\t\tID:   18,\n\t\t},\n\t\t{\n\t\t\tName: \"minus\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"plus\",\n\t\t\tID:   6,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_shield.go",
    "content": "package joystick\n\nvar shieldConfig = joystickConfig{\n\tName: \"Nvidia SHIELD Controller\",\n\tGUID: \"3333\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"rt\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"lt\",\n\t\t\tID:   5,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"a\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"b\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"lb\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"rb\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"back\",\n\t\t\tID:   14,\n\t\t},\n\t\t{\n\t\t\tName: \"start\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   15,\n\t\t},\n\t\t{\n\t\t\tName: \"right_stick\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"left_stick\",\n\t\t\tID:   9,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_tflight_hotas_x.go",
    "content": "package joystick\n\nvar tflightHotasXConfig = joystickConfig{\n\tName: \"Thrustmaster T-Flight Hotas X Joystick\",\n\tGUID: \"4444\",\n\tAxis: []pair{\n\t\t{Name: \"right_x\", ID: 0},\n\t\t{Name: \"right_y\", ID: 1},\n\t\t{Name: \"left_y\", ID: 2},\n\t\t{Name: \"r1\", ID: 3}, // RH Twist\n\t\t{Name: \"left_x\", ID: 4},\n\t},\n\tButtons: []pair{\n\t\t{Name: \"r1\", ID: 0},\n\t\t{Name: \"l1\", ID: 1},\n\t\t{Name: \"r3\", ID: 2},\n\t\t{Name: \"l3\", ID: 3},\n\t\t{Name: \"square\", ID: 4},\n\t\t{Name: \"x\", ID: 5},\n\t\t{Name: \"circle\", ID: 6},\n\t\t{Name: \"triangle\", ID: 7},\n\t\t{Name: \"r2\", ID: 8},\n\t\t{Name: \"l2\", ID: 9},\n\t\t{Name: \"select\", ID: 10},\n\t\t{Name: \"start\", ID: 11},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_xbox360.go",
    "content": "package joystick\n\nvar xbox360Config = joystickConfig{\n\tName: \"XBox 360 Controller\",\n\tGUID: \"3333\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"rt\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"lt\",\n\t\t\tID:   2,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"a\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"b\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"lb\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"rb\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"back\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"start\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"right_stick\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"left_stick\",\n\t\t\tID:   9,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_xbox360_rock_band_drums.go",
    "content": "package joystick\n\nvar xbox360RockBandDrumsConfig = joystickConfig{\n\tName: \"XBox 360 Rock Band Drums Controller\",\n\tGUID: \"4444\",\n\tAxis: []pair{},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"green\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"red\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"blue\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"yellow\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"pedal\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"back\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"start\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   8,\n\t\t},\n\t\t{\n\t\t\tName: \"left\",\n\t\t\tID:   11,\n\t\t},\n\t\t{\n\t\t\tName: \"right\",\n\t\t\tID:   12,\n\t\t},\n\t\t{\n\t\t\tName: \"up\",\n\t\t\tID:   13,\n\t\t},\n\t\t{\n\t\t\tName: \"down\",\n\t\t\tID:   14,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/joystick_xboxone.go",
    "content": "package joystick\n\nvar xboxOneConfig = joystickConfig{\n\tName: \"Xbox One Controller\",\n\tGUID: \"30001983600083000100\",\n\tAxis: []pair{\n\t\t{\n\t\t\tName: \"left_x\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"left_y\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"right_x\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"right_y\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"rt\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"lt\",\n\t\t\tID:   2,\n\t\t},\n\t},\n\tButtons: []pair{\n\t\t{\n\t\t\tName: \"x\",\n\t\t\tID:   2,\n\t\t},\n\t\t{\n\t\t\tName: \"a\",\n\t\t\tID:   0,\n\t\t},\n\t\t{\n\t\t\tName: \"b\",\n\t\t\tID:   1,\n\t\t},\n\t\t{\n\t\t\tName: \"y\",\n\t\t\tID:   3,\n\t\t},\n\t\t{\n\t\t\tName: \"lb\",\n\t\t\tID:   4,\n\t\t},\n\t\t{\n\t\t\tName: \"rb\",\n\t\t\tID:   5,\n\t\t},\n\t\t{\n\t\t\tName: \"back\",\n\t\t\tID:   6,\n\t\t},\n\t\t{\n\t\t\tName: \"start\",\n\t\t\tID:   7,\n\t\t},\n\t\t{\n\t\t\tName: \"home\",\n\t\t\tID:   9,\n\t\t},\n\t\t{\n\t\t\tName: \"right_stick\",\n\t\t\tID:   10,\n\t\t},\n\t\t{\n\t\t\tName: \"left_stick\",\n\t\t\tID:   8,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "platforms/joystick/test_helper.go",
    "content": "package joystick\n\nimport js \"github.com/0xcafed00d/joystick\"\n\ntype testJoystick struct {\n\taxisCount   int\n\tbuttonCount int\n}\n\nfunc (t *testJoystick) Close()                  {}\nfunc (t *testJoystick) ID() int                 { return 0 }\nfunc (t *testJoystick) ButtonCount() int        { return t.buttonCount }\nfunc (t *testJoystick) AxisCount() int          { return t.axisCount }\nfunc (t *testJoystick) Name() string            { return \"test-joy\" }\nfunc (t *testJoystick) Read() (js.State, error) { return js.State{}, nil }\n"
  },
  {
    "path": "platforms/keyboard/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/keyboard/README.md",
    "content": "# Keyboard\n\nThis module implements support for keyboard events, wrapping the `stty` utility.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\nExample parsing key events\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/keyboard\"\n)\n\nfunc main() {\n  keys := keyboard.NewDriver()\n\n  work := func() {\n    _ = keys.On(keyboard.Key, func(data interface{}) {\n      key := data.(keyboard.KeyEvent)\n\n      if key.Key == keyboard.A {\n        fmt.Println(\"A pressed!\")\n      } else {\n        fmt.Println(\"keyboard event!\", key, key.Char)\n      }\n    })\n  }\n\n  robot := gobot.NewRobot(\"keyboardbot\",\n    []gobot.Connection{},\n    []gobot.Device{keys},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n"
  },
  {
    "path": "platforms/keyboard/doc.go",
    "content": "/*\nPackage keyboard contains the Gobot drivers for keyboard support.\n\nInstalling:\n\nThen you can install the package with:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"fmt\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/platforms/keyboard\"\n\t)\n\n\tfunc main() {\n\t\tkeys := keyboard.NewDriver()\n\n\t\twork := func() {\n\t\t\t_ = keys.On(keyboard.Key, func(data interface{}) {\n\t\t\t\tkey := data.(keyboard.KeyEvent)\n\n\t\t\t\tif key.Key == keyboard.A {\n\t\t\t\t\tfmt.Println(\"A pressed!\")\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Println(\"keyboard event!\", key, key.Char)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"keyboardbot\",\n\t\t\t[]gobot.Connection{},\n\t\t\t[]gobot.Device{keys},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor further information refer to keyboard README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/keyboard/README.md\n*/\npackage keyboard // import \"gobot.io/x/gobot/v2/platforms/keyboard\"\n"
  },
  {
    "path": "platforms/keyboard/keyboard.go",
    "content": "package keyboard\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"os/exec\"\n)\n\ntype bytes [3]byte\n\n// KeyEvent contains data about a keyboard event\ntype KeyEvent struct {\n\tBytes bytes\n\tKey   int\n\tChar  string\n}\n\nconst (\n\tTilde = iota + 96\n\tA\n\tB\n\tC\n\tD\n\tE\n\tF\n\tG\n\tH\n\tI\n\tJ\n\tK\n\tL\n\tM\n\tN\n\tO\n\tP\n\tQ\n\tR\n\tS\n\tT\n\tU\n\tV\n\tW\n\tX\n\tY\n\tZ\n)\n\nconst (\n\tEscape   = 27\n\tSpacebar = 32\n\tHyphen   = 45\n\tAsterisk = 42\n\tPlus     = 43\n\tSlash    = 47\n\tDot      = 46\n)\n\nconst (\n\tZero = iota + 48\n\tOne\n\tTwo\n\tThree\n\tFour\n\tFive\n\tSix\n\tSeven\n\tEight\n\tNine\n)\n\nconst (\n\tArrowUp = iota + 65\n\tArrowDown\n\tArrowRight\n\tArrowLeft\n)\n\n// used to hold the original stty state\nvar originalState string\n\nfunc Parse(input bytes) KeyEvent {\n\tevent := KeyEvent{Bytes: input, Char: string(input[:])}\n\n\tvar code byte\n\n\t// basic input codes\n\tif input[1] == 0 && input[2] == 0 {\n\t\tcode = input[0]\n\n\t\t// space bar\n\t\tif code == Spacebar {\n\t\t\tevent.Key = Spacebar\n\t\t}\n\n\t\t// vanilla escape\n\t\tif code == Escape {\n\t\t\tevent.Key = Escape\n\t\t}\n\n\t\t// Hyphen\n\t\tif code == Hyphen {\n\t\t\tevent.Key = Hyphen\n\t\t}\n\n\t\t// Asterisk\n\t\tif code == Asterisk {\n\t\t\tevent.Key = Asterisk\n\t\t}\n\n\t\t// Plus\n\t\tif code == Plus {\n\t\t\tevent.Key = Plus\n\t\t}\n\n\t\t// Slash\n\t\tif code == Slash {\n\t\t\tevent.Key = Slash\n\t\t}\n\n\t\t// Dot\n\t\tif code == Dot {\n\t\t\tevent.Key = Dot\n\t\t}\n\n\t\t// number keys\n\t\tif code >= 48 && code <= 57 {\n\t\t\tevent.Key = int(code)\n\t\t}\n\n\t\t// alphabet\n\t\tif code >= 97 && code <= 122 {\n\t\t\tevent.Key = int(code)\n\t\t}\n\n\t\treturn event\n\t}\n\n\t// arrow keys\n\tif input[0] == Escape && input[1] == 91 {\n\t\tcode = input[2]\n\n\t\tif code >= 65 && code <= 68 {\n\t\t\tevent.Key = int(code)\n\t\t\treturn event\n\t\t}\n\t}\n\n\treturn event\n}\n\n// fetches original state, sets up TTY for raw (unbuffered) input\nfunc configure() error {\n\tstate, err := stty(\"-g\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\toriginalState = state\n\n\t// -echo: terminal doesn't echo typed characters back to the terminal\n\t// -icanon: terminal doesn't interpret special characters (like backspace)\n\t_, err = stty(\"-echo\", \"-icanon\")\n\n\treturn err\n}\n\n// restores the TTY to the original state\nfunc restore() error {\n\tif _, err := stty(\"echo\"); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := stty(originalState)\n\n\treturn err\n}\n\nfunc stty(args ...string) (string, error) {\n\tcmd := exec.CommandContext(context.Background(), \"stty\", args...)\n\tcmd.Stdin = os.Stdin\n\n\tout, err := cmd.Output()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(out), nil\n}\n"
  },
  {
    "path": "platforms/keyboard/keyboard_driver.go",
    "content": "package keyboard\n\nimport (\n\t\"log\"\n\t\"os\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// Key board event\n\tKey = \"key\"\n)\n\n// Driver is gobot software device to the keyboard\ntype Driver struct {\n\tgobot.Eventer\n\n\tname    string\n\tconnect func(*Driver) error\n\tlisten  func(*Driver)\n\tstdin   *os.File\n}\n\n// NewDriver returns a new keyboard Driver.\nfunc NewDriver() *Driver {\n\tk := &Driver{\n\t\tname: gobot.DefaultName(\"Keyboard\"),\n\t\tconnect: func(k *Driver) error {\n\t\t\tif err := configure(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tk.stdin = os.Stdin\n\t\t\treturn nil\n\t\t},\n\t\tlisten: func(k *Driver) {\n\t\t\tctrlc := bytes{3}\n\n\t\t\tfor {\n\t\t\t\tvar keybuf bytes\n\t\t\t\tif _, err := k.stdin.Read(keybuf[0:3]); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\n\t\t\t\tif keybuf == ctrlc {\n\t\t\t\t\tproc, err := os.FindProcess(os.Getpid())\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tlog.Fatal(err)\n\t\t\t\t\t}\n\n\t\t\t\t\tif err := proc.Signal(os.Interrupt); err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tk.Publish(Key, Parse(keybuf))\n\n\t\t\t}\n\t\t},\n\t\tEventer: gobot.NewEventer(),\n\t}\n\n\tk.AddEvent(Key)\n\n\treturn k\n}\n\n// Name returns the Driver Name\nfunc (k *Driver) Name() string { return k.name }\n\n// SetName sets the Driver Name\nfunc (k *Driver) SetName(n string) { k.name = n }\n\n// Connection returns the Driver Connection\nfunc (k *Driver) Connection() gobot.Connection { return nil }\n\n// Start initializes keyboard by grabbing key events as they come in and\n// publishing each as a key event\nfunc (k *Driver) Start() error {\n\tif err := k.connect(k); err != nil {\n\t\treturn err\n\t}\n\n\tgo k.listen(k)\n\n\treturn nil\n}\n\n// Halt stops keyboard driver\nfunc (k *Driver) Halt() error {\n\tif originalState != \"\" {\n\t\treturn restore()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/keyboard/keyboard_driver_test.go",
    "content": "package keyboard\n\nimport (\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestKeyboardDriver() *Driver {\n\td := NewDriver()\n\td.connect = func(k *Driver) error {\n\t\tk.stdin = &os.File{}\n\t\treturn nil\n\t}\n\td.listen = func(k *Driver) {}\n\treturn d\n}\n\nfunc TestKeyboardDriver(t *testing.T) {\n\td := initTestKeyboardDriver()\n\tassert.Equal(t, (gobot.Connection)(nil), d.Connection())\n}\n\nfunc TestKeyboardDriverName(t *testing.T) {\n\td := initTestKeyboardDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Keyboard\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestKeyboardDriverStart(t *testing.T) {\n\td := initTestKeyboardDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestKeyboardDriverHalt(t *testing.T) {\n\td := initTestKeyboardDriver()\n\trequire.NoError(t, d.Halt())\n}\n"
  },
  {
    "path": "platforms/keyboard/keyboard_test.go",
    "content": "package keyboard\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestParseSpace(t *testing.T) {\n\tassert.Equal(t, Spacebar, Parse(bytes{32, 0, 0}).Key)\n}\n\nfunc TestParseEscape(t *testing.T) {\n\tassert.Equal(t, Escape, Parse(bytes{27, 0, 0}).Key)\n}\n\nfunc TestParseHyphen(t *testing.T) {\n\tassert.Equal(t, Hyphen, Parse(bytes{45, 0, 0}).Key)\n}\n\nfunc TestParseAsterisk(t *testing.T) {\n\tassert.Equal(t, Asterisk, Parse(bytes{42, 0, 0}).Key)\n}\n\nfunc TestParsePlus(t *testing.T) {\n\tassert.Equal(t, Plus, Parse(bytes{43, 0, 0}).Key)\n}\n\nfunc TestParseSlash(t *testing.T) {\n\tassert.Equal(t, Slash, Parse(bytes{47, 0, 0}).Key)\n}\n\nfunc TestParseDot(t *testing.T) {\n\tassert.Equal(t, Dot, Parse(bytes{46, 0, 0}).Key)\n}\n\nfunc TestParseNotEscape(t *testing.T) {\n\tassert.NotEqual(t, Escape, Parse(bytes{27, 91, 65}).Key)\n}\n\nfunc TestParseNumberKeys(t *testing.T) {\n\tassert.Equal(t, 48, Parse(bytes{48, 0, 0}).Key)\n\tassert.Equal(t, 50, Parse(bytes{50, 0, 0}).Key)\n\tassert.Equal(t, 57, Parse(bytes{57, 0, 0}).Key)\n}\n\nfunc TestParseAlphaKeys(t *testing.T) {\n\tassert.Equal(t, 97, Parse(bytes{97, 0, 0}).Key)\n\tassert.Equal(t, 101, Parse(bytes{101, 0, 0}).Key)\n\tassert.Equal(t, 122, Parse(bytes{122, 0, 0}).Key)\n}\n\nfunc TestParseNotAlphaKeys(t *testing.T) {\n\tassert.NotEqual(t, 132, Parse(bytes{132, 0, 0}).Key)\n}\n\nfunc TestParseArrowKeys(t *testing.T) {\n\tassert.Equal(t, 65, Parse(bytes{27, 91, 65}).Key)\n\tassert.Equal(t, 66, Parse(bytes{27, 91, 66}).Key)\n\tassert.Equal(t, 67, Parse(bytes{27, 91, 67}).Key)\n\tassert.Equal(t, 68, Parse(bytes{27, 91, 68}).Key)\n}\n\nfunc TestParseNotArrowKeys(t *testing.T) {\n\tassert.NotEqual(t, Escape, Parse(bytes{27, 91, 65}).Key)\n\tassert.NotEqual(t, 70, Parse(bytes{27, 91, 70}).Key)\n}\n"
  },
  {
    "path": "platforms/leap/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/leap/README.md",
    "content": "# Leap\n\nThe Leap Motion is a user-interface device that tracks the user's hand motions, and translates them into events that can\ncontrol robots and physical computing hardware.\n\nFor more info about the Leap Motion platform click [Leap Motion](https://www.leapmotion.com/)\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFirst install the [Leap Motion Software](https://www.leapmotion.com/setup)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/leap\"\n)\n\nfunc main() {\n  leapMotionAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n  l := leap.NewDriver(leapMotionAdaptor)\n\n  work := func() {\n    l.On(l.Event(\"message\"), func(data interface{}) {\n      fmt.Println(data.(leap.Frame))\n    })\n  }\n\n  robot := gobot.NewRobot(\"leapBot\",\n    []gobot.Connection{leapMotionAdaptor},\n    []gobot.Device{l},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How To Connect\n\n### OSX\n\nThis driver works out of the box with the vanilla installation of the Leap Motion Software that you get in their [Setup Guide](https://www.leapmotion.com/setup).\n\nThe main steps are:\n\n* Run Leap Motion.app to open a websocket connection in port 6437.\n* Connect your Computer and Leap Motion Controller.\n* Connect to the device via Gobot.\n\n### Ubuntu\n\nThe Linux download of the Leap Motion software can be obtained from [Leap Motion Dev Center](https://developer.leapmotion.com/downloads)\n(requires free signup).\n\nThe main steps are:\n\n* Run the leapd daemon, to open a websocket connection in port 6437.\n* Connect your computer and the Leap Motion controller\n* Connect to the device via Gobot\n"
  },
  {
    "path": "platforms/leap/doc.go",
    "content": "/*\nPackage leap provides the Gobot adaptor and driver for the Leap Motion.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n\tInstall the [Leap Motion Software](https://www.leapmotion.com/setup).\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"fmt\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/platforms/leap\"\n\t)\n\n\tfunc main() {\n\t\tleapMotionAdaptor := leap.NewAdaptor(\"127.0.0.1:6437\")\n\t\tl := leap.NewDriver(leapMotionAdaptor)\n\n\t\twork := func() {\n\t\t\tl.On(l.Event(\"message\"), func(data interface{}) {\n\t\t\t\tfmt.Println(data.(leap.Frame))\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"leapBot\",\n\t\t\t[]gobot.Connection{leapMotionAdaptor},\n\t\t\t[]gobot.Device{l},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor more information refer to the leap README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/leap/README.md\n*/\npackage leap // import \"gobot.io/x/gobot/v2/platforms/leap\"\n"
  },
  {
    "path": "platforms/leap/leap_motion_adaptor.go",
    "content": "package leap\n\nimport (\n\t\"io\"\n\n\t\"golang.org/x/net/websocket\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Adaptor is the Gobot Adaptor connection to the Leap Motion\ntype Adaptor struct {\n\tname    string\n\tport    string\n\tws      io.ReadWriteCloser\n\tconnect func(string) (io.ReadWriteCloser, error)\n}\n\n// NewAdaptor creates a new leap motion adaptor using specified port,\n// which is this case is the host IP or name of the Leap Motion daemon\nfunc NewAdaptor(port string) *Adaptor {\n\treturn &Adaptor{\n\t\tname: gobot.DefaultName(\"LeapMotion\"),\n\t\tport: port,\n\t\tconnect: func(host string) (io.ReadWriteCloser, error) {\n\t\t\treturn websocket.Dial(\"ws://\"+host+\"/v6.json\", \"\", \"http://\"+host)\n\t\t},\n\t}\n}\n\n// Name returns the Adaptor Name\nfunc (l *Adaptor) Name() string { return l.name }\n\n// SetName sets the Adaptor Name\nfunc (l *Adaptor) SetName(n string) { l.name = n }\n\n// Port returns the Adaptor Port which is this case is the host IP or name\nfunc (l *Adaptor) Port() string { return l.port }\n\n// Connect returns true if connection to leap motion is established successfully\nfunc (l *Adaptor) Connect() error {\n\tws, err := l.connect(l.Port())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tl.ws = ws\n\treturn nil\n}\n\n// Finalize ends connection to leap motion\nfunc (l *Adaptor) Finalize() error { return nil }\n"
  },
  {
    "path": "platforms/leap/leap_motion_adaptor_test.go",
    "content": "package leap\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc initTestLeapMotionAdaptor() *Adaptor {\n\ta := NewAdaptor(\"\")\n\ta.connect = func(port string) (io.ReadWriteCloser, error) { return nil, nil } //nolint:nilnil // ok for test\n\treturn a\n}\n\nfunc TestLeapMotionAdaptor(t *testing.T) {\n\ta := NewAdaptor(\"127.0.0.1\")\n\tassert.Equal(t, \"127.0.0.1\", a.Port())\n}\n\nfunc TestLeapMotionAdaptorName(t *testing.T) {\n\ta := NewAdaptor(\"127.0.0.1\")\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Leap\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestLeapMotionAdaptorConnect(t *testing.T) {\n\ta := initTestLeapMotionAdaptor()\n\trequire.NoError(t, a.Connect())\n\n\ta.connect = func(port string) (io.ReadWriteCloser, error) {\n\t\treturn nil, errors.New(\"connection error\")\n\t}\n\trequire.ErrorContains(t, a.Connect(), \"connection error\")\n}\n\nfunc TestLeapMotionAdaptorFinalize(t *testing.T) {\n\ta := initTestLeapMotionAdaptor()\n\trequire.NoError(t, a.Finalize())\n}\n"
  },
  {
    "path": "platforms/leap/leap_motion_driver.go",
    "content": "package leap\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"log\"\n\n\t\"golang.org/x/net/websocket\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// MessageEvent event\n\tMessageEvent = \"message\"\n\t// HandEvent event\n\tHandEvent = \"hand\"\n\t// GestureEvent event\n\tGestureEvent = \"gesture\"\n)\n\n// Driver the Gobot software device to the Leap Motion\ntype Driver struct {\n\tgobot.Eventer\n\n\tname       string\n\tconnection gobot.Connection\n\treceive    func(ws io.ReadWriteCloser, msg *[]byte)\n}\n\n// NewDriver creates a new leap motion driver\n//\n// Adds the following events:\n//\n//\t\"message\" - Gets triggered when receiving a message from leap motion\n//\t\"hand\" - Gets triggered per-message when leap motion detects a hand\n//\t\"gesture\" - Gets triggered per-message when leap motion detects a gesture\nfunc NewDriver(a *Adaptor) *Driver {\n\tl := &Driver{\n\t\tname:       gobot.DefaultName(\"LeapMotion\"),\n\t\tconnection: a,\n\t\tEventer:    gobot.NewEventer(),\n\t\treceive: func(ws io.ReadWriteCloser, msg *[]byte) {\n\t\t\t//nolint:forcetypeassert // ok here\n\t\t\tif err := websocket.Message.Receive(ws.(*websocket.Conn), msg); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t},\n\t}\n\n\tl.AddEvent(MessageEvent)\n\tl.AddEvent(HandEvent)\n\tl.AddEvent(GestureEvent)\n\treturn l\n}\n\n// Name returns the Driver Name\nfunc (l *Driver) Name() string { return l.name }\n\n// SetName sets the Driver Name\nfunc (l *Driver) SetName(n string) { l.name = n }\n\n// Connection returns the Driver's Connection\nfunc (l *Driver) Connection() gobot.Connection { return l.connection }\n\n// adaptor returns leap motion adaptor\nfunc (l *Driver) adaptor() *Adaptor {\n\t//nolint:forcetypeassert // ok here\n\treturn l.Connection().(*Adaptor)\n}\n\nfunc enableFeature(l *Driver, feature string) error {\n\tcommand := map[string]bool{feature: true}\n\tb, err := json.Marshal(command)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err = l.adaptor().ws.Write(b); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Start inits leap motion driver by enabling gestures\n// and listening from incoming messages.\n//\n// Publishes the following events:\n//\n//\t\"message\" - Emits Frame on new message received from Leap.\n//\t\"hand\" - Emits Hand when detected in message from Leap.\n//\t\"gesture\" - Emits Gesture when detected in message from Leap.\nfunc (l *Driver) Start() error {\n\tif err := enableFeature(l, \"enableGestures\"); err != nil {\n\t\treturn err\n\t}\n\tif err := enableFeature(l, \"background\"); err != nil {\n\t\treturn err\n\t}\n\n\tgo func() {\n\t\tvar msg []byte\n\t\tvar frame Frame\n\t\tvar err error\n\t\tfor {\n\t\t\tl.receive(l.adaptor().ws, &msg)\n\t\t\tframe, err = l.ParseFrame(msg)\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tl.Publish(MessageEvent, frame)\n\n\t\t\tfor _, hand := range frame.Hands {\n\t\t\t\tl.Publish(HandEvent, hand)\n\t\t\t}\n\n\t\t\tfor _, gesture := range frame.Gestures {\n\t\t\t\tl.Publish(GestureEvent, gesture)\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil\n}\n\n// Halt returns nil if driver is halted successfully\nfunc (l *Driver) Halt() error { return nil }\n"
  },
  {
    "path": "platforms/leap/leap_motion_driver_test.go",
    "content": "package leap\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\ntype NullReadWriteCloser struct {\n\tmtx        sync.Mutex\n\twriteError error\n}\n\nfunc (n *NullReadWriteCloser) WriteError(e error) {\n\tn.mtx.Lock()\n\tdefer n.mtx.Unlock()\n\tn.writeError = e\n}\n\nfunc (n *NullReadWriteCloser) Write(p []byte) (int, error) {\n\tn.mtx.Lock()\n\tdefer n.mtx.Unlock()\n\treturn len(p), n.writeError\n}\n\nfunc (n *NullReadWriteCloser) Read(b []byte) (int, error) {\n\treturn len(b), nil\n}\n\nfunc (n *NullReadWriteCloser) Close() error {\n\treturn nil\n}\n\nfunc initTestLeapMotionDriver() (*Driver, *NullReadWriteCloser) {\n\ta := NewAdaptor(\"\")\n\trwc := &NullReadWriteCloser{}\n\ta.connect = func(port string) (io.ReadWriteCloser, error) {\n\t\treturn rwc, nil\n\t}\n\t_ = a.Connect()\n\n\td := NewDriver(a)\n\td.receive = func(ws io.ReadWriteCloser, buf *[]byte) {\n\t\tfile, _ := os.ReadFile(\"./test/support/example_frame.json\")\n\t\tcopy(*buf, file)\n\t}\n\treturn d, rwc\n}\n\nfunc TestLeapMotionDriver(t *testing.T) {\n\td, _ := initTestLeapMotionDriver()\n\tassert.NotNil(t, d.Connection())\n}\n\nfunc TestLeapMotionDriverName(t *testing.T) {\n\td, _ := initTestLeapMotionDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Leap\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestLeapMotionDriverStart(t *testing.T) {\n\td, _ := initTestLeapMotionDriver()\n\trequire.NoError(t, d.Start())\n\n\td2, rwc := initTestLeapMotionDriver()\n\te := errors.New(\"write error\")\n\trwc.WriteError(e)\n\tassert.Equal(t, e, d2.Start())\n}\n\nfunc TestLeapMotionDriverHalt(t *testing.T) {\n\td, _ := initTestLeapMotionDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestLeapMotionDriverParser(t *testing.T) {\n\td, _ := initTestLeapMotionDriver()\n\tfile, _ := os.ReadFile(\"./test/support/example_frame.json\")\n\tparsedFrame, _ := d.ParseFrame(file)\n\n\tif parsedFrame.Hands == nil || parsedFrame.Pointables == nil || parsedFrame.Gestures == nil {\n\t\trequire.Fail(t, \"ParseFrame incorrectly parsed frame\")\n\t}\n\n\tassert.Equal(t, uint64(134211791358), parsedFrame.Timestamp)\n\tassert.InDelta(t, 247.410, parsedFrame.Hands[0].X(), 0.0)\n\tassert.InDelta(t, 275.868, parsedFrame.Hands[0].Y(), 0.0)\n\tassert.InDelta(t, 132.843, parsedFrame.Hands[0].Z(), 0.0)\n\n\tassert.InDelta(t, 214.293, parsedFrame.Pointables[0].BTipPosition[0], 0.0)\n\tassert.InDelta(t, 213.865, parsedFrame.Pointables[0].BTipPosition[1], 0.0)\n\tassert.InDelta(t, 95.0224, parsedFrame.Pointables[0].BTipPosition[2], 0.0)\n\n\tassert.InDelta(t, -0.468069, parsedFrame.Pointables[0].Bases[0][0][0], 0.0)\n\tassert.InDelta(t, 0.807844, parsedFrame.Pointables[0].Bases[0][0][1], 0.0)\n\tassert.InDelta(t, -0.358190, parsedFrame.Pointables[0].Bases[0][0][2], 0.0)\n\n\tassert.InDelta(t, 19.7871, parsedFrame.Pointables[0].Width, 0.0)\n}\n"
  },
  {
    "path": "platforms/leap/parser.go",
    "content": "package leap\n\nimport (\n\t\"encoding/json\"\n)\n\n// Gesture is a Leap Motion gesture that has been detected\ntype Gesture struct {\n\tCenter        []float64 `json:\"center\"`\n\tDirection     []float64 `json:\"direction\"`\n\tDuration      int       `json:\"duration\"`\n\tHandIDs       []int     `json:\"handIds\"`\n\tID            int       `json:\"id\"`\n\tNormal        []float64 `json:\"normal\"`\n\tPointableIDs  []int     `json:\"pointableIds\"`\n\tPosition      []float64 `json:\"position\"`\n\tProgress      float64   `json:\"progress\"`\n\tRadius        float64   `json:\"radius\"`\n\tSpeed         float64   `json:\"speed\"`\n\tStartPosition []float64 `json:\"StartPosition\"`\n\tState         string    `json:\"state\"`\n\tType          string    `json:\"type\"`\n}\n\n// Hand is a Leap Motion hand that has been detected\ntype Hand struct {\n\tArmBasis               [][]float64 `json:\"armBasis\"`\n\tArmWidth               float64     `json:\"armWidth\"`\n\tConfidence             float64     `json:\"confidence\"`\n\tDirection              []float64   `json:\"direction\"`\n\tElbow                  []float64   `json:\"elbow\"`\n\tGrabStrength           float64     `json:\"grabStrength\"`\n\tID                     int         `json:\"id\"`\n\tPalmNormal             []float64   `json:\"palmNormal\"`\n\tPalmPosition           []float64   `json:\"PalmPosition\"`\n\tPalmVelocity           []float64   `json:\"PalmVelocity\"`\n\tPinchStrength          float64     `json:\"PinchStrength\"`\n\tR                      [][]float64 `json:\"r\"`\n\tS                      float64     `json:\"s\"`\n\tSphereCenter           []float64   `json:\"sphereCenter\"`\n\tSphereRadius           float64     `json:\"sphereRadius\"`\n\tStabilizedPalmPosition []float64   `json:\"stabilizedPalmPosition\"`\n\tT                      []float64   `json:\"t\"`\n\tTimeVisible            float64     `json:\"TimeVisible\"`\n\tType                   string      `json:\"type\"`\n\tWrist                  []float64   `json:\"wrist\"`\n}\n\n// Pointable is a Leap Motion pointing motion that has been detected\ntype Pointable struct {\n\tBases                 [][][]float64 `json:\"bases\"`\n\tBTipPosition          []float64     `json:\"btipPosition\"`\n\tCarpPosition          []float64     `json:\"carpPosition\"`\n\tDipPosition           []float64     `json:\"dipPosition\"`\n\tDirection             []float64     `json:\"direction\"`\n\tExtended              bool          `json:\"extended\"`\n\tHandID                int           `json:\"handId\"`\n\tID                    int           `json:\"id\"`\n\tLength                float64       `json:\"length\"`\n\tMCPPosition           []float64     `json:\"mcpPosition\"`\n\tPIPPosition           []float64     `json:\"pipPosition\"`\n\tStabilizedTipPosition []float64     `json:\"stabilizedTipPosition\"`\n\tTimeVisible           float64       `json:\"timeVisible\"`\n\tTipPosition           []float64     `json:\"tipPosition\"`\n\tTipVelocity           []float64     `json:\"tipVelocity\"`\n\tTool                  bool          `json:\"tool\"`\n\tTouchDistance         float64       `json:\"touchDistance\"`\n\tTouchZone             string        `json:\"touchZone\"`\n\tType                  int           `json:\"type\"`\n\tWidth                 float64       `json:\"width\"`\n}\n\n// InteractionBox is the area within which the gestural interaction has been detected\ntype InteractionBox struct {\n\tCenter []float64 `json:\"center\"`\n\tSize   []float64 `json:\"size\"`\n}\n\n// Frame is the base representation returned that holds every other objects\ntype Frame struct {\n\tCurrentFrameRate float64        `json:\"currentFrameRate\"`\n\tGestures         []Gesture      `json:\"gestures\"`\n\tHands            []Hand         `json:\"hands\"`\n\tID               int            `json:\"id\"`\n\tInteractionBox   InteractionBox `json:\"interactionBox\"`\n\tPointables       []Pointable    `json:\"pointables\"`\n\tR                [][]float64    `json:\"r\"`\n\tS                float64        `json:\"s\"`\n\tT                []float64      `json:\"t\"`\n\tTimestamp        uint64         `json:\"timestamp\"`\n}\n\n// X returns hand x value\nfunc (h *Hand) X() float64 {\n\treturn h.PalmPosition[0]\n}\n\n// Y returns hand y value\nfunc (h *Hand) Y() float64 {\n\treturn h.PalmPosition[1]\n}\n\n// Z returns hand z value\nfunc (h *Hand) Z() float64 {\n\treturn h.PalmPosition[2]\n}\n\n// ParseFrame converts json data to a Frame\nfunc (l *Driver) ParseFrame(data []byte) (Frame, error) {\n\tvar frame Frame\n\terr := json.Unmarshal(data, &frame)\n\treturn frame, err\n}\n"
  },
  {
    "path": "platforms/leap/test/support/example_frame.json",
    "content": "{\n  \"currentFrameRate\": 110.583,\n  \"devices\": [],\n  \"gestures\": [\n    {\n      \"direction\": [\n        0.721478,\n        -0.510801,\n        0.467495\n      ],\n      \"duration\": 108349,\n      \"handIds\": [\n        129\n      ],\n      \"id\": 1,\n      \"pointableIds\": [\n        1290\n      ],\n      \"position\": [\n        228.679,\n        214.101,\n        101.574\n      ],\n      \"progress\": 1.00000,\n      \"state\": \"stop\",\n      \"type\": \"keyTap\"\n    }\n  ],\n  \"hands\": [\n    {\n      \"armBasis\": [\n        [\n          0.642307,\n          0.418027,\n          0.642414\n        ],\n        [\n          -0.760890,\n          0.448533,\n          0.468898\n        ],\n        [\n          -0.0921319,\n          -0.789982,\n          0.606168\n        ]\n      ],\n      \"armWidth\": 62.2635,\n      \"confidence\": 0.152371,\n      \"direction\": [\n        0.221251,\n        -0.0617914,\n        -0.973257\n      ],\n      \"elbow\": [\n        212.001,\n        79.2408,\n        343.710\n      ],\n      \"grabStrength\": 0.00000,\n      \"id\": 129,\n      \"palmNormal\": [\n        0.813532,\n        -0.538649,\n        0.219139\n      ],\n      \"palmPosition\": [\n        247.410,\n        275.868,\n        132.843\n      ],\n      \"palmVelocity\": [\n        -0.713996,\n        -23.6569,\n        -13.8691\n      ],\n      \"palmWidth\": 88.9102,\n      \"pinchStrength\": 0.00000,\n      \"r\": [\n        [\n          0.192921,\n          0.960078,\n          -0.202565\n        ],\n        [\n          -0.745728,\n          0.00929180,\n          -0.666186\n        ],\n        [\n          -0.637708,\n          0.279579,\n          0.717750\n        ]\n      ],\n      \"s\": 1.30419,\n      \"sphereCenter\": [\n        287.160,\n        297.142,\n        100.094\n      ],\n      \"sphereRadius\": 67.0665,\n      \"stabilizedPalmPosition\": [\n        247.480,\n        276.296,\n        133.123\n      ],\n      \"t\": [\n        61.7977,\n        116.515,\n        56.4642\n      ],\n      \"timeVisible\": 1.87085,\n      \"type\": \"right\",\n      \"wrist\": [\n        236.308,\n        287.660,\n        183.786\n      ]\n    }\n  ],\n  \"id\": 641123,\n  \"interactionBox\": {\n    \"center\": [\n      0.00000,\n      189.367,\n      0.00000\n    ],\n    \"size\": [\n      222.740,\n      222.740,\n      139.896\n    ]\n  },\n  \"pointables\": [\n    {\n      \"bases\": [\n        [\n          [\n            -0.468069,\n            0.807844,\n            -0.358190\n          ],\n          [\n            -0.882976,\n            -0.411231,\n            0.226369\n          ],\n          [\n            0.0355723,\n            0.422230,\n            0.905791\n          ]\n        ],\n        [\n          [\n            -0.466451,\n            0.822774,\n            -0.324757\n          ],\n          [\n            -0.870335,\n            -0.361355,\n            0.334573\n          ],\n          [\n            0.157925,\n            0.438709,\n            0.884643\n          ]\n        ],\n        [\n          [\n            -0.466451,\n            0.822774,\n            -0.324757\n          ],\n          [\n            -0.884402,\n            -0.440445,\n            0.154403\n          ],\n          [\n            -0.0159988,\n            0.359238,\n            0.933109\n          ]\n        ],\n        [\n          [\n            -0.466451,\n            0.822774,\n            -0.324757\n          ],\n          [\n            -0.817784,\n            -0.261199,\n            0.512840\n          ],\n          [\n            0.337125,\n            0.504796,\n            0.794687\n          ]\n        ]\n      ],\n      \"btipPosition\": [\n        214.293,\n        213.865,\n        95.0224\n      ],\n      \"carpPosition\": [\n        229.172,\n        258.776,\n        187.433\n      ],\n      \"dipPosition\": [\n        222.002,\n        225.409,\n        113.196\n      ],\n      \"direction\": [\n        0.0159988,\n        -0.359238,\n        -0.933109\n      ],\n      \"extended\": true,\n      \"handId\": 129,\n      \"id\": 1290,\n      \"length\": 50.9251,\n      \"mcpPosition\": [\n        229.172,\n        258.776,\n        187.433\n      ],\n      \"pipPosition\": [\n        221.469,\n        237.377,\n        144.284\n      ],\n      \"stabilizedTipPosition\": [\n        220.428,\n        215.841,\n        99.4813\n      ],\n      \"timeVisible\": 1.87085,\n      \"tipPosition\": [\n        212.427,\n        218.656,\n        99.7341\n      ],\n      \"tipVelocity\": [\n        -324.525,\n        55.5317,\n        -41.1663\n      ],\n      \"tool\": false,\n      \"touchDistance\": 0.341002,\n      \"touchZone\": \"hovering\",\n      \"type\": 0,\n      \"width\": 19.7871\n    },\n    {\n      \"bases\": [\n        [\n          [\n            0.654255,\n            0.750454,\n            0.0936476\n          ],\n          [\n            -0.683587,\n            0.639792,\n            -0.351248\n          ],\n          [\n            -0.323510,\n            0.165789,\n            0.931588\n          ]\n        ],\n        [\n          [\n            0.641810,\n            0.756085,\n            0.128125\n          ],\n          [\n            -0.742571,\n            0.654463,\n            -0.142363\n          ],\n          [\n            -0.191492,\n            -0.00377221,\n            0.981487\n          ]\n        ],\n        [\n          [\n            0.641810,\n            0.756085,\n            0.128125\n          ],\n          [\n            -0.726482,\n            0.652969,\n            -0.214139\n          ],\n          [\n            -0.245569,\n            0.0443555,\n            0.968364\n          ]\n        ],\n        [\n          [\n            0.641810,\n            0.756085,\n            0.128125\n          ],\n          [\n            -0.709564,\n            0.648876,\n            -0.274734\n          ],\n          [\n            -0.290860,\n            0.0854138,\n            0.952946\n          ]\n        ]\n      ],\n      \"btipPosition\": [\n        269.006,\n        271.529,\n        17.2009\n      ],\n      \"carpPosition\": [\n        225.768,\n        285.455,\n        171.343\n      ],\n      \"dipPosition\": [\n        263.665,\n        273.097,\n        34.6993\n      ],\n      \"direction\": [\n        0.245569,\n        -0.0443555,\n        -0.968364\n      ],\n      \"extended\": true,\n      \"handId\": 129,\n      \"id\": 1292,\n      \"length\": 65.4748,\n      \"mcpPosition\": [\n        247.823,\n        274.152,\n        107.833\n      ],\n      \"pipPosition\": [\n        256.842,\n        274.330,\n        61.6066\n      ],\n      \"stabilizedTipPosition\": [\n        268.409,\n        272.318,\n        21.5696\n      ],\n      \"timeVisible\": 1.87085,\n      \"tipPosition\": [\n        268.718,\n        271.794,\n        21.5136\n      ],\n      \"tipVelocity\": [\n        -13.9732,\n        6.53920,\n        -19.5770\n      ],\n      \"tool\": false,\n      \"touchDistance\": 0.332816,\n      \"touchZone\": \"hovering\",\n      \"type\": 2,\n      \"width\": 18.5630\n    },\n    {\n      \"bases\": [\n        [\n          [\n            0.649174,\n            0.716291,\n            0.255928\n          ],\n          [\n            -0.645061,\n            0.696732,\n            -0.313783\n          ],\n          [\n            -0.403074,\n            0.0386109,\n            0.914353\n          ]\n        ],\n        [\n          [\n            0.610655,\n            0.716881,\n            0.336426\n          ],\n          [\n            -0.767227,\n            0.640801,\n            0.0271437\n          ],\n          [\n            -0.196123,\n            -0.274690,\n            0.941319\n          ]\n        ],\n        [\n          [\n            0.610655,\n            0.716881,\n            0.336426\n          ],\n          [\n            -0.728617,\n            0.675044,\n            -0.115904\n          ],\n          [\n            -0.310191,\n            -0.174348,\n            0.934550\n          ]\n        ],\n        [\n          [\n            0.610655,\n            0.716881,\n            0.336426\n          ],\n          [\n            -0.679596,\n            0.692496,\n            -0.242072\n          ],\n          [\n            -0.406510,\n            -0.0808113,\n            0.910065\n          ]\n        ]\n      ],\n      \"btipPosition\": [\n        282.293,\n        310.673,\n        32.4311\n      ],\n      \"carpPosition\": [\n        233.241,\n        294.849,\n        171.406\n      ],\n      \"dipPosition\": [\n        274.872,\n        309.198,\n        49.0461\n      ],\n      \"direction\": [\n        0.310191,\n        0.174348,\n        -0.934550\n      ],\n      \"extended\": true,\n      \"handId\": 129,\n      \"id\": 1293,\n      \"length\": 62.9558,\n      \"mcpPosition\": [\n        257.913,\n        292.486,\n        115.440\n      ],\n      \"pipPosition\": [\n        266.475,\n        304.478,\n        74.3433\n      ],\n      \"stabilizedTipPosition\": [\n        281.546,\n        310.434,\n        36.7157\n      ],\n      \"timeVisible\": 1.87085,\n      \"tipPosition\": [\n        281.024,\n        309.986,\n        36.2968\n      ],\n      \"tipVelocity\": [\n        -49.1356,\n        23.1718,\n        -14.1464\n      ],\n      \"tool\": false,\n      \"touchDistance\": 0.332567,\n      \"touchZone\": \"hovering\",\n      \"type\": 3,\n      \"width\": 17.6638\n    },\n    {\n      \"bases\": [\n        [\n          [\n            0.695759,\n            0.590913,\n            0.408339\n          ],\n          [\n            -0.569298,\n            0.800316,\n            -0.188135\n          ],\n          [\n            -0.437971,\n            -0.101569,\n            0.893233\n          ]\n        ],\n        [\n          [\n            0.555629,\n            0.543209,\n            0.629445\n          ],\n          [\n            -0.762608,\n            0.634559,\n            0.125553\n          ],\n          [\n            -0.331219,\n            -0.549780,\n            0.766835\n          ]\n        ],\n        [\n          [\n            0.555629,\n            0.543209,\n            0.629445\n          ],\n          [\n            -0.707544,\n            0.706513,\n            0.0148494\n          ],\n          [\n            -0.436645,\n            -0.453610,\n            0.776903\n          ]\n        ],\n        [\n          [\n            0.555629,\n            0.543209,\n            0.629445\n          ],\n          [\n            -0.645129,\n            0.759246,\n            -0.0857538\n          ],\n          [\n            -0.524486,\n            -0.358426,\n            0.772299\n          ]\n        ]\n      ],\n      \"btipPosition\": [\n        298.360,\n        340.270,\n        71.0701\n      ],\n      \"carpPosition\": [\n        244.922,\n        300.813,\n        176.031\n      ],\n      \"dipPosition\": [\n        289.526,\n        334.233,\n        84.0778\n      ],\n      \"direction\": [\n        0.436645,\n        0.453610,\n        -0.776904\n      ],\n      \"extended\": true,\n      \"handId\": 129,\n      \"id\": 1294,\n      \"length\": 49.3562,\n      \"mcpPosition\": [\n        269.737,\n        306.568,\n        125.421\n      ],\n      \"pipPosition\": [\n        281.181,\n        325.564,\n        98.9257\n      ],\n      \"stabilizedTipPosition\": [\n        297.824,\n        337.184,\n        73.7178\n      ],\n      \"timeVisible\": 1.87085,\n      \"tipPosition\": [\n        295.463,\n        338.639,\n        73.5436\n      ],\n      \"tipVelocity\": [\n        -67.9258,\n        44.5899,\n        -9.70583\n      ],\n      \"tool\": false,\n      \"touchDistance\": 0.332281,\n      \"touchZone\": \"hovering\",\n      \"type\": 4,\n      \"width\": 15.6904\n    },\n    {\n      \"bases\": [\n        [\n          [\n            0.567299,\n            0.817958,\n            -0.0954824\n          ],\n          [\n            -0.785572,\n            0.502726,\n            -0.360755\n          ],\n          [\n            -0.247081,\n            0.279664,\n            0.927760\n          ]\n        ],\n        [\n          [\n            0.556741,\n            0.828691,\n            -0.0575341\n          ],\n          [\n            -0.461401,\n            0.250903,\n            -0.850974\n          ],\n          [\n            -0.690760,\n            0.500319,\n            0.522046\n          ]\n        ],\n        [\n          [\n            0.556741,\n            0.828691,\n            -0.0575341\n          ],\n          [\n            0.184936,\n            -0.191172,\n            -0.963977\n          ],\n          [\n            -0.809838,\n            0.526046,\n            -0.259688\n          ]\n        ],\n        [\n          [\n            0.556741,\n            0.828691,\n            -0.0575341\n          ],\n          [\n            0.450238,\n            -0.359238,\n            -0.817456\n          ],\n          [\n            -0.698087,\n            0.429207,\n            -0.573111\n          ]\n        ]\n      ],\n      \"btipPosition\": [\n        297.722,\n        214.346,\n        100.704\n      ],\n      \"carpPosition\": [\n        220.180,\n        275.044,\n        173.613\n      ],\n      \"dipPosition\": [\n        286.067,\n        221.511,\n        91.1361\n      ],\n      \"direction\": [\n        0.809838,\n        -0.526046,\n        0.259688\n      ],\n      \"extended\": false,\n      \"handId\": 129,\n      \"id\": 1291,\n      \"length\": 57.4633,\n      \"mcpPosition\": [\n        237.942,\n        254.939,\n        106.918\n      ],\n      \"pipPosition\": [\n        266.941,\n        233.936,\n        85.0028\n      ],\n      \"stabilizedTipPosition\": [\n        294.484,\n        215.800,\n        98.6516\n      ],\n      \"timeVisible\": 1.87085,\n      \"tipPosition\": [\n        294.960,\n        216.076,\n        98.9796\n      ],\n      \"tipVelocity\": [\n        77.7159,\n        38.2101,\n        -21.6539\n      ],\n      \"tool\": false,\n      \"touchDistance\": 0.340420,\n      \"touchZone\": \"none\",\n      \"type\": 1,\n      \"width\": 18.9007\n    }\n  ],\n  \"r\": [\n    [\n      0.192921,\n      0.960078,\n      -0.202565\n    ],\n    [\n      -0.745728,\n      0.00929180,\n      -0.666186\n    ],\n    [\n      -0.637708,\n      0.279579,\n      0.717750\n    ]\n  ],\n  \"s\": 1.30419,\n  \"t\": [\n    61.7977,\n    116.515,\n    56.4642\n  ],\n  \"timestamp\": 134211791358\n}"
  },
  {
    "path": "platforms/mavlink/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/mavlink/README.md",
    "content": "# Mavlink\n\nFor information on the MAVlink communication protocol click [here](https://mavlink.io/).\n\nThis package supports Mavlink over serial (such as a\n[SiK modem](http://ardupilot.org/copter/docs/common-sik-telemetry-radio.html))\nand Mavlink over UDP (such as via\n[mavproxy](https://github.com/ArduPilot/MAVProxy)).  Serial is useful\nfor point to point links, and UDP is useful for where you have\nmultiple simultaneous clients such as the robot and\n[QGroundControl](http://qgroundcontrol.com/).\n\nAs at 2018-04, this package supports Mavlink 1.0 only.  If the robot\ndoesn't receiving data then check that the other devices are\nconfigured to send version 1.0 frames.\n\nFor Mavlink 2.0 please refer to [gomavlib](https://github.com/bluenviron/gomavlib).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/mavlink\"\n  common \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n)\n\nfunc main() {\n  adaptor := mavlink.NewAdaptor(\"/dev/ttyACM0\")\n  iris := mavlink.NewDriver(adaptor)\n\n  work := func() {\n    iris.Once(iris.Event(\"packet\"), func(data interface{}) {\n      packet := data.(*common.MAVLinkPacket)\n\n      dataStream := common.NewRequestDataStream(100,\n        packet.SystemID,\n        packet.ComponentID,\n        4,\n        1,\n      )\n      iris.SendPacket(common.CraftMAVLinkPacket(packet.SystemID,\n        packet.ComponentID,\n        dataStream,\n      ))\n    })\n\n    iris.On(iris.Event(\"message\"), func(data interface{}) {\n      if data.(common.MAVLinkMessage).Id() == 30 {\n        message := data.(*common.Attitude)\n        fmt.Println(\"Attitude\")\n        fmt.Println(\"TIME_BOOT_MS\", message.TIME_BOOT_MS)\n        fmt.Println(\"ROLL\", message.ROLL)\n        fmt.Println(\"PITCH\", message.PITCH)\n        fmt.Println(\"YAW\", message.YAW)\n        fmt.Println(\"ROLLSPEED\", message.ROLLSPEED)\n        fmt.Println(\"PITCHSPEED\", message.PITCHSPEED)\n        fmt.Println(\"YAWSPEED\", message.YAWSPEED)\n        fmt.Println(\"\")\n      }\n    })\n  }\n\n  robot := gobot.NewRobot(\"mavBot\",\n    []gobot.Connection{adaptor},\n    []gobot.Device{iris},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How to use: UDP\n\n``` go\n  adaptor := mavlink.NewUDPAdaptor(\":14550\")\n```\n\nTo test, install Mavproxy and set it up to listen on serial and repeat\nover UDP:\n\n`$ mavproxy.py --out=udpbcast:192.168.0.255:14550`\n\nChange the address to the broadcast address of your subnet.\n"
  },
  {
    "path": "platforms/mavlink/common/common.go",
    "content": "//nolint:dupl,gocritic,lll // seems to be useful here\npackage mavlink\n\n//\n// MAVLink comm protocol generated from common.xml\n// http://qgroundcontrol.org/mavlink/\n//\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n)\n\nvar messages = map[uint8]MAVLinkMessage{\n\t0:   &Heartbeat{},\n\t1:   &SysStatus{},\n\t2:   &SystemTime{},\n\t4:   &Ping{},\n\t5:   &ChangeOperatorControl{},\n\t6:   &ChangeOperatorControlAck{},\n\t7:   &AuthKey{},\n\t11:  &SetMode{},\n\t20:  &ParamRequestRead{},\n\t21:  &ParamRequestList{},\n\t22:  &ParamValue{},\n\t23:  &ParamSet{},\n\t24:  &GpsRawInt{},\n\t25:  &GpsStatus{},\n\t26:  &ScaledImu{},\n\t27:  &RawImu{},\n\t28:  &RawPressure{},\n\t29:  &ScaledPressure{},\n\t30:  &Attitude{},\n\t31:  &AttitudeQuaternion{},\n\t32:  &LocalPositionNed{},\n\t33:  &GlobalPositionInt{},\n\t34:  &RcChannelsScaled{},\n\t35:  &RcChannelsRaw{},\n\t36:  &ServoOutputRaw{},\n\t37:  &MissionRequestPartialList{},\n\t38:  &MissionWritePartialList{},\n\t39:  &MissionItem{},\n\t40:  &MissionRequest{},\n\t41:  &MissionSetCurrent{},\n\t42:  &MissionCurrent{},\n\t43:  &MissionRequestList{},\n\t44:  &MissionCount{},\n\t45:  &MissionClearAll{},\n\t46:  &MissionItemReached{},\n\t47:  &MissionAck{},\n\t48:  &SetGpsGlobalOrigin{},\n\t49:  &GpsGlobalOrigin{},\n\t50:  &SetLocalPositionSetpoint{},\n\t51:  &LocalPositionSetpoint{},\n\t52:  &GlobalPositionSetpointInt{},\n\t53:  &SetGlobalPositionSetpointInt{},\n\t54:  &SafetySetAllowedArea{},\n\t55:  &SafetyAllowedArea{},\n\t56:  &SetRollPitchYawThrust{},\n\t57:  &SetRollPitchYawSpeedThrust{},\n\t58:  &RollPitchYawThrustSetpoint{},\n\t59:  &RollPitchYawSpeedThrustSetpoint{},\n\t60:  &SetQuadMotorsSetpoint{},\n\t61:  &SetQuadSwarmRollPitchYawThrust{},\n\t62:  &NavControllerOutput{},\n\t63:  &SetQuadSwarmLedRollPitchYawThrust{},\n\t64:  &StateCorrection{},\n\t65:  &RcChannels{},\n\t66:  &RequestDataStream{},\n\t67:  &DataStream{},\n\t69:  &ManualControl{},\n\t70:  &RcChannelsOverride{},\n\t74:  &VfrHud{},\n\t76:  &CommandLong{},\n\t77:  &CommandAck{},\n\t80:  &RollPitchYawRatesThrustSetpoint{},\n\t81:  &ManualSetpoint{},\n\t82:  &AttitudeSetpointExternal{},\n\t83:  &LocalNedPositionSetpointExternal{},\n\t84:  &GlobalPositionSetpointExternalInt{},\n\t89:  &LocalPositionNedSystemGlobalOffset{},\n\t90:  &HilState{},\n\t91:  &HilControls{},\n\t92:  &HilRcInputsRaw{},\n\t100: &OpticalFlow{},\n\t101: &GlobalVisionPositionEstimate{},\n\t102: &VisionPositionEstimate{},\n\t103: &VisionSpeedEstimate{},\n\t104: &ViconPositionEstimate{},\n\t105: &HighresImu{},\n\t106: &OmnidirectionalFlow{},\n\t107: &HilSensor{},\n\t108: &SimState{},\n\t109: &RadioStatus{},\n\t110: &FileTransferStart{},\n\t111: &FileTransferDirList{},\n\t112: &FileTransferRes{},\n\t113: &HilGps{},\n\t114: &HilOpticalFlow{},\n\t115: &HilStateQuaternion{},\n\t116: &ScaledImu2{},\n\t117: &LogRequestList{},\n\t118: &LogEntry{},\n\t119: &LogRequestData{},\n\t120: &LogData{},\n\t121: &LogErase{},\n\t122: &LogRequestEnd{},\n\t123: &GpsInjectData{},\n\t124: &Gps2Raw{},\n\t125: &PowerStatus{},\n\t126: &SerialControl{},\n\t127: &GpsRtk{},\n\t128: &Gps2Rtk{},\n\t130: &DataTransmissionHandshake{},\n\t131: &EncapsulatedData{},\n\t132: &DistanceSensor{},\n\t133: &TerrainRequest{},\n\t134: &TerrainData{},\n\t135: &TerrainCheck{},\n\t136: &TerrainReport{},\n\t147: &BatteryStatus{},\n\t148: &Setpoint8Dof{},\n\t149: &Setpoint6Dof{},\n\t249: &MemoryVect{},\n\t250: &DebugVect{},\n\t251: &NamedValueFloat{},\n\t252: &NamedValueInt{},\n\t253: &Statustext{},\n\t254: &Debug{},\n}\n\n// NewMAVLinkMessage returns a new MAVLinkMessage or an error if it encounters an unknown Message ID\nfunc NewMAVLinkMessage(msgid uint8, data []byte) (MAVLinkMessage, error) {\n\tmessage := messages[msgid]\n\tif message != nil {\n\t\tmessage.Decode(data)\n\t\treturn message, nil\n\t}\n\treturn nil, fmt.Errorf(\"unknown Message ID: %v\", msgid)\n}\n\n//\n// MAV_AUTOPILOT\n/*Micro air vehicle / autopilot classes. This identifies the individual model.*/\n//\nconst (\n\tMAV_AUTOPILOT_GENERIC                                      = 0  // Generic autopilot, full support for everything |\n\tMAV_AUTOPILOT_PIXHAWK                                      = 1  // PIXHAWK autopilot, http://pixhawk.ethz.ch |\n\tMAV_AUTOPILOT_SLUGS                                        = 2  // SLUGS autopilot, http://slugsuav.soe.ucsc.edu |\n\tMAV_AUTOPILOT_ARDUPILOTMEGA                                = 3  // ArduPilotMega / ArduCopter, http://diydrones.com |\n\tMAV_AUTOPILOT_OPENPILOT                                    = 4  // OpenPilot, http://openpilot.org |\n\tMAV_AUTOPILOT_GENERIC_WAYPOINTS_ONLY                       = 5  // Generic autopilot only supporting simple waypoints |\n\tMAV_AUTOPILOT_GENERIC_WAYPOINTS_AND_SIMPLE_NAVIGATION_ONLY = 6  // Generic autopilot supporting waypoints and other simple navigation commands |\n\tMAV_AUTOPILOT_GENERIC_MISSION_FULL                         = 7  // Generic autopilot supporting the full mission command set |\n\tMAV_AUTOPILOT_INVALID                                      = 8  // No valid autopilot, e.g. a GCS or other MAVLink component |\n\tMAV_AUTOPILOT_PPZ                                          = 9  // PPZ UAV - http://nongnu.org/paparazzi |\n\tMAV_AUTOPILOT_UDB                                          = 10 // UAV Dev Board |\n\tMAV_AUTOPILOT_FP                                           = 11 // FlexiPilot |\n\tMAV_AUTOPILOT_PX4                                          = 12 // PX4 Autopilot - http://pixhawk.ethz.ch/px4/ |\n\tMAV_AUTOPILOT_SMACCMPILOT                                  = 13 // SMACCMPilot - http://smaccmpilot.org |\n\tMAV_AUTOPILOT_AUTOQUAD                                     = 14 // AutoQuad -- http://autoquad.org |\n\tMAV_AUTOPILOT_ARMAZILA                                     = 15 // Armazila -- http://armazila.com |\n\tMAV_AUTOPILOT_AEROB                                        = 16 // Aerob -- http://aerob.ru |\n\tMAV_AUTOPILOT_ENUM_END                                     = 17 //  |\n)\n\n//\n// MAV_TYPE\n/**/\n//\nconst (\n\tMAV_TYPE_GENERIC            = 0  // Generic micro air vehicle. |\n\tMAV_TYPE_FIXED_WING         = 1  // Fixed wing aircraft. |\n\tMAV_TYPE_QUADROTOR          = 2  // Quadrotor |\n\tMAV_TYPE_COAXIAL            = 3  // Coaxial helicopter |\n\tMAV_TYPE_HELICOPTER         = 4  // Normal helicopter with tail rotor. |\n\tMAV_TYPE_ANTENNA_TRACKER    = 5  // Ground installation |\n\tMAV_TYPE_GCS                = 6  // Operator control unit / ground control station |\n\tMAV_TYPE_AIRSHIP            = 7  // Airship, controlled |\n\tMAV_TYPE_FREE_BALLOON       = 8  // Free balloon, uncontrolled |\n\tMAV_TYPE_ROCKET             = 9  // Rocket |\n\tMAV_TYPE_GROUND_ROVER       = 10 // Ground rover |\n\tMAV_TYPE_SURFACE_BOAT       = 11 // Surface vessel, boat, ship |\n\tMAV_TYPE_SUBMARINE          = 12 // Submarine |\n\tMAV_TYPE_HEXAROTOR          = 13 // Hexarotor |\n\tMAV_TYPE_OCTOROTOR          = 14 // Octorotor |\n\tMAV_TYPE_TRICOPTER          = 15 // Octorotor |\n\tMAV_TYPE_FLAPPING_WING      = 16 // Flapping wing |\n\tMAV_TYPE_KITE               = 17 // Flapping wing |\n\tMAV_TYPE_ONBOARD_CONTROLLER = 18 // Onboard companion controller |\n\tMAV_TYPE_ENUM_END           = 19 //  |\n)\n\n//\n// MAV_MODE_FLAG\n/*These flags encode the MAV mode.*/\n//\nconst (\n\tMAV_MODE_FLAG_CUSTOM_MODE_ENABLED  = 1   // 0b00000001 Reserved for future use. |\n\tMAV_MODE_FLAG_TEST_ENABLED         = 2   // 0b00000010 system has a test mode enabled. This flag is intended for temporary system tests and should not be used for stable implementations. |\n\tMAV_MODE_FLAG_AUTO_ENABLED         = 4   // 0b00000100 autonomous mode enabled, system finds its own goal positions. Guided flag can be set or not, depends on the actual implementation. |\n\tMAV_MODE_FLAG_GUIDED_ENABLED       = 8   // 0b00001000 guided mode enabled, system flies MISSIONs / mission items. |\n\tMAV_MODE_FLAG_STABILIZE_ENABLED    = 16  // 0b00010000 system stabilizes electronically its attitude (and optionally position). It needs however further control inputs to move around. |\n\tMAV_MODE_FLAG_HIL_ENABLED          = 32  // 0b00100000 hardware in the loop simulation. All motors / actuators are blocked, but internal software is full operational. |\n\tMAV_MODE_FLAG_MANUAL_INPUT_ENABLED = 64  // 0b01000000 remote control input is enabled. |\n\tMAV_MODE_FLAG_SAFETY_ARMED         = 128 // 0b10000000 MAV safety set to armed. Motors are enabled / running / can start. Ready to fly. |\n\tMAV_MODE_FLAG_ENUM_END             = 129 //  |\n)\n\n//\n// MAV_MODE_FLAG_DECODE_POSITION\n/*These values encode the bit positions of the decode position. These values can be used to read the value of a flag bit by combining the base_mode variable with AND with the flag position value. The result will be either 0 or 1, depending on if the flag is set or not.*/\n//\nconst (\n\tMAV_MODE_FLAG_DECODE_POSITION_CUSTOM_MODE = 1   // Eighth bit: 00000001 |\n\tMAV_MODE_FLAG_DECODE_POSITION_TEST        = 2   // Seventh bit: 00000010 |\n\tMAV_MODE_FLAG_DECODE_POSITION_AUTO        = 4   // Sixt bit:   00000100 |\n\tMAV_MODE_FLAG_DECODE_POSITION_GUIDED      = 8   // Fifth bit:  00001000 |\n\tMAV_MODE_FLAG_DECODE_POSITION_STABILIZE   = 16  // Fourth bit: 00010000 |\n\tMAV_MODE_FLAG_DECODE_POSITION_HIL         = 32  // Third bit:  00100000 |\n\tMAV_MODE_FLAG_DECODE_POSITION_MANUAL      = 64  // Second bit: 01000000 |\n\tMAV_MODE_FLAG_DECODE_POSITION_SAFETY      = 128 // First bit:  10000000 |\n\tMAV_MODE_FLAG_DECODE_POSITION_ENUM_END    = 129 //  |\n)\n\n//\n// MAV_GOTO\n/*Override command, pauses current mission execution and moves immediately to a position*/\n//\nconst (\n\tMAV_GOTO_DO_HOLD                    = 0 // Hold at the current position. |\n\tMAV_GOTO_DO_CONTINUE                = 1 // Continue with the next item in mission execution. |\n\tMAV_GOTO_HOLD_AT_CURRENT_POSITION   = 2 // Hold at the current position of the system |\n\tMAV_GOTO_HOLD_AT_SPECIFIED_POSITION = 3 // Hold at the position specified in the parameters of the DO_HOLD action |\n\tMAV_GOTO_ENUM_END                   = 4 //  |\n)\n\n//\n// MAV_MODE\n/*These defines are predefined OR-combined mode flags. There is no need to use values from this enum, but it\n  simplifies the use of the mode flags. Note that manual input is enabled in all modes as a safety override.*/\n//\nconst (\n\tMAV_MODE_PREFLIGHT          = 0   // System is not ready to fly, booting, calibrating, etc. No flag is set. |\n\tMAV_MODE_MANUAL_DISARMED    = 64  // System is allowed to be active, under manual (RC) control, no stabilization |\n\tMAV_MODE_TEST_DISARMED      = 66  // UNDEFINED mode. This solely depends on the autopilot - use with caution, intended for developers only. |\n\tMAV_MODE_STABILIZE_DISARMED = 80  // System is allowed to be active, under assisted RC control. |\n\tMAV_MODE_GUIDED_DISARMED    = 88  // System is allowed to be active, under autonomous control, manual setpoint |\n\tMAV_MODE_AUTO_DISARMED      = 92  // System is allowed to be active, under autonomous control and navigation (the trajectory is decided onboard and not pre-programmed by MISSIONs) |\n\tMAV_MODE_MANUAL_ARMED       = 192 // System is allowed to be active, under manual (RC) control, no stabilization |\n\tMAV_MODE_TEST_ARMED         = 194 // UNDEFINED mode. This solely depends on the autopilot - use with caution, intended for developers only. |\n\tMAV_MODE_STABILIZE_ARMED    = 208 // System is allowed to be active, under assisted RC control. |\n\tMAV_MODE_GUIDED_ARMED       = 216 // System is allowed to be active, under autonomous control, manual setpoint |\n\tMAV_MODE_AUTO_ARMED         = 220 // System is allowed to be active, under autonomous control and navigation (the trajectory is decided onboard and not pre-programmed by MISSIONs) |\n\tMAV_MODE_ENUM_END           = 221 //  |\n)\n\n//\n// MAV_STATE\n/**/\n//\nconst (\n\tMAV_STATE_UNINIT      = 0 // Uninitialized system, state is unknown. |\n\tMAV_STATE_BOOT        = 1 // System is booting up. |\n\tMAV_STATE_CALIBRATING = 2 // System is calibrating and not flight-ready. |\n\tMAV_STATE_STANDBY     = 3 // System is grounded and on standby. It can be launched any time. |\n\tMAV_STATE_ACTIVE      = 4 // System is active and might be already airborne. Motors are engaged. |\n\tMAV_STATE_CRITICAL    = 5 // System is in a non-normal flight mode. It can however still navigate. |\n\tMAV_STATE_EMERGENCY   = 6 // System is in a non-normal flight mode. It lost control over parts or over the whole airframe. It is in mayday and going down. |\n\tMAV_STATE_POWEROFF    = 7 // System just initialized its power-down sequence, will shut down now. |\n\tMAV_STATE_ENUM_END    = 8 //  |\n)\n\n//\n// MAV_COMPONENT\n/**/\n//\nconst (\n\tMAV_COMP_ID_ALL            = 0   //  |\n\tMAV_COMP_ID_CAMERA         = 100 //  |\n\tMAV_COMP_ID_SERVO1         = 140 //  |\n\tMAV_COMP_ID_SERVO2         = 141 //  |\n\tMAV_COMP_ID_SERVO3         = 142 //  |\n\tMAV_COMP_ID_SERVO4         = 143 //  |\n\tMAV_COMP_ID_SERVO5         = 144 //  |\n\tMAV_COMP_ID_SERVO6         = 145 //  |\n\tMAV_COMP_ID_SERVO7         = 146 //  |\n\tMAV_COMP_ID_SERVO8         = 147 //  |\n\tMAV_COMP_ID_SERVO9         = 148 //  |\n\tMAV_COMP_ID_SERVO10        = 149 //  |\n\tMAV_COMP_ID_SERVO11        = 150 //  |\n\tMAV_COMP_ID_SERVO12        = 151 //  |\n\tMAV_COMP_ID_SERVO13        = 152 //  |\n\tMAV_COMP_ID_SERVO14        = 153 //  |\n\tMAV_COMP_ID_MAPPER         = 180 //  |\n\tMAV_COMP_ID_MISSIONPLANNER = 190 //  |\n\tMAV_COMP_ID_PATHPLANNER    = 195 //  |\n\tMAV_COMP_ID_IMU            = 200 //  |\n\tMAV_COMP_ID_IMU_2          = 201 //  |\n\tMAV_COMP_ID_IMU_3          = 202 //  |\n\tMAV_COMP_ID_GPS            = 220 //  |\n\tMAV_COMP_ID_UDP_BRIDGE     = 240 //  |\n\tMAV_COMP_ID_UART_BRIDGE    = 241 //  |\n\tMAV_COMP_ID_SYSTEM_CONTROL = 250 //  |\n\tMAV_COMPONENT_ENUM_END     = 251 //  |\n)\n\n//\n// MAV_SYS_STATUS_SENSOR\n/*These encode the sensors whose status is sent as part of the SYS_STATUS message.*/\n//\nconst (\n\tMAV_SYS_STATUS_SENSOR_3D_GYRO                = 1       // 0x01 3D gyro |\n\tMAV_SYS_STATUS_SENSOR_3D_ACCEL               = 2       // 0x02 3D accelerometer |\n\tMAV_SYS_STATUS_SENSOR_3D_MAG                 = 4       // 0x04 3D magnetometer |\n\tMAV_SYS_STATUS_SENSOR_ABSOLUTE_PRESSURE      = 8       // 0x08 absolute pressure |\n\tMAV_SYS_STATUS_SENSOR_DIFFERENTIAL_PRESSURE  = 16      // 0x10 differential pressure |\n\tMAV_SYS_STATUS_SENSOR_GPS                    = 32      // 0x20 GPS |\n\tMAV_SYS_STATUS_SENSOR_OPTICAL_FLOW           = 64      // 0x40 optical flow |\n\tMAV_SYS_STATUS_SENSOR_VISION_POSITION        = 128     // 0x80 computer vision position |\n\tMAV_SYS_STATUS_SENSOR_LASER_POSITION         = 256     // 0x100 laser based position |\n\tMAV_SYS_STATUS_SENSOR_EXTERNAL_GROUND_TRUTH  = 512     // 0x200 external ground truth (Vicon or Leica) |\n\tMAV_SYS_STATUS_SENSOR_ANGULAR_RATE_CONTROL   = 1024    // 0x400 3D angular rate control |\n\tMAV_SYS_STATUS_SENSOR_ATTITUDE_STABILIZATION = 2048    // 0x800 attitude stabilization |\n\tMAV_SYS_STATUS_SENSOR_YAW_POSITION           = 4096    // 0x1000 yaw position |\n\tMAV_SYS_STATUS_SENSOR_Z_ALTITUDE_CONTROL     = 8192    // 0x2000 z/altitude control |\n\tMAV_SYS_STATUS_SENSOR_XY_POSITION_CONTROL    = 16384   // 0x4000 x/y position control |\n\tMAV_SYS_STATUS_SENSOR_MOTOR_OUTPUTS          = 32768   // 0x8000 motor outputs / control |\n\tMAV_SYS_STATUS_SENSOR_RC_RECEIVER            = 65536   // 0x10000 rc receiver |\n\tMAV_SYS_STATUS_SENSOR_3D_GYRO2               = 131072  // 0x20000 2nd 3D gyro |\n\tMAV_SYS_STATUS_SENSOR_3D_ACCEL2              = 262144  // 0x40000 2nd 3D accelerometer |\n\tMAV_SYS_STATUS_SENSOR_3D_MAG2                = 524288  // 0x80000 2nd 3D magnetometer |\n\tMAV_SYS_STATUS_GEOFENCE                      = 1048576 // 0x100000 geofence |\n\tMAV_SYS_STATUS_AHRS                          = 2097152 // 0x200000 AHRS subsystem health |\n\tMAV_SYS_STATUS_TERRAIN                       = 4194304 // 0x400000 Terrain subsystem health |\n\tMAV_SYS_STATUS_SENSOR_ENUM_END               = 4194305 //  |\n)\n\n//\n// MAV_FRAME\n/**/\n//\nconst (\n\tMAV_FRAME_GLOBAL                  = 0  // Global coordinate frame, WGS84 coordinate system. First value / x: latitude, second value / y: longitude, third value / z: positive altitude over mean sea level (MSL) |\n\tMAV_FRAME_LOCAL_NED               = 1  // Local coordinate frame, Z-up (x: north, y: east, z: down). |\n\tMAV_FRAME_MISSION                 = 2  // NOT a coordinate frame, indicates a mission command. |\n\tMAV_FRAME_GLOBAL_RELATIVE_ALT     = 3  // Global coordinate frame, WGS84 coordinate system, relative altitude over ground with respect to the home position. First value / x: latitude, second value / y: longitude, third value / z: positive altitude with 0 being at the altitude of the home location. |\n\tMAV_FRAME_LOCAL_ENU               = 4  // Local coordinate frame, Z-down (x: east, y: north, z: up) |\n\tMAV_FRAME_GLOBAL_INT              = 5  // Global coordinate frame with some fields as scaled integers, WGS84 coordinate system. First value / x: latitude, second value / y: longitude, third value / z: positive altitude over mean sea level (MSL). Lat / Lon are scaled * 1E7 to avoid floating point accuracy limitations. |\n\tMAV_FRAME_GLOBAL_RELATIVE_ALT_INT = 6  // Global coordinate frame with some fields as scaled integers, WGS84 coordinate system, relative altitude over ground with respect to the home position. First value / x: latitude, second value / y: longitude, third value / z: positive altitude with 0 being at the altitude of the home location. Lat / Lon are scaled * 1E7 to avoid floating point accuracy limitations. |\n\tMAV_FRAME_LOCAL_OFFSET_NED        = 7  // Offset to the current local frame. Anything expressed in this frame should be added to the current local frame position. |\n\tMAV_FRAME_BODY_NED                = 8  // Setpoint in body NED frame. This makes sense if all position control is externalized - e.g. useful to command 2 m/s^2 acceleration to the right. |\n\tMAV_FRAME_BODY_OFFSET_NED         = 9  // Offset in body NED frame. This makes sense if adding setpoints to the current flight path, to avoid an obstacle - e.g. useful to command 2 m/s^2 acceleration to the east. |\n\tMAV_FRAME_GLOBAL_TERRAIN_ALT      = 10 // Global coordinate frame with above terrain level altitude. WGS84 coordinate system, relative altitude over terrain with respect to the waypoint coordinate. First value / x: latitude, second value / y: longitude, third value / z: positive altitude with 0 being at ground level in terrain model. |\n\tMAV_FRAME_ENUM_END                = 11 //  |\n)\n\n//\n// MAVLINK_DATA_STREAM_TYPE\n/**/\n//\nconst (\n\tMAVLINK_DATA_STREAM_IMG_JPEG      = 1 //  |\n\tMAVLINK_DATA_STREAM_IMG_BMP       = 2 //  |\n\tMAVLINK_DATA_STREAM_IMG_RAW8U     = 3 //  |\n\tMAVLINK_DATA_STREAM_IMG_RAW32U    = 4 //  |\n\tMAVLINK_DATA_STREAM_IMG_PGM       = 5 //  |\n\tMAVLINK_DATA_STREAM_IMG_PNG       = 6 //  |\n\tMAVLINK_DATA_STREAM_TYPE_ENUM_END = 7 //  |\n)\n\n//\n// FENCE_ACTION\n/**/\n//\nconst (\n\tFENCE_ACTION_NONE            = 0 // Disable fenced mode |\n\tFENCE_ACTION_GUIDED          = 1 // Switched to guided mode to return point (fence point 0) |\n\tFENCE_ACTION_REPORT          = 2 // Report fence breach, but don't take action |\n\tFENCE_ACTION_GUIDED_THR_PASS = 3 // Switched to guided mode to return point (fence point 0) with manual throttle control |\n\tFENCE_ACTION_ENUM_END        = 4 //  |\n)\n\n//\n// FENCE_BREACH\n/**/\n//\nconst (\n\tFENCE_BREACH_NONE     = 0 // No last fence breach |\n\tFENCE_BREACH_MINALT   = 1 // Breached minimum altitude |\n\tFENCE_BREACH_MAXALT   = 2 // Breached maximum altitude |\n\tFENCE_BREACH_BOUNDARY = 3 // Breached fence boundary |\n\tFENCE_BREACH_ENUM_END = 4 //  |\n)\n\n//\n// MAV_MOUNT_MODE\n/*Enumeration of possible mount operation modes*/\n//\nconst (\n\tMAV_MOUNT_MODE_RETRACT           = 0 // Load and keep safe position (Roll,Pitch,Yaw) from permant memory and stop stabilization |\n\tMAV_MOUNT_MODE_NEUTRAL           = 1 // Load and keep neutral position (Roll,Pitch,Yaw) from permanent memory. |\n\tMAV_MOUNT_MODE_MAVLINK_TARGETING = 2 // Load neutral position and start MAVLink Roll,Pitch,Yaw control with stabilization |\n\tMAV_MOUNT_MODE_RC_TARGETING      = 3 // Load neutral position and start RC Roll,Pitch,Yaw control with stabilization |\n\tMAV_MOUNT_MODE_GPS_POINT         = 4 // Load neutral position and start to point to Lat,Lon,Alt |\n\tMAV_MOUNT_MODE_ENUM_END          = 5 //  |\n)\n\n//\n// MAV_CMD\n/*Commands to be executed by the MAV. They can be executed on user request, or as part of a mission script. If the action is used in a mission, the parameter mapping to the waypoint/mission message is as follows: Param 1, Param 2, Param 3, Param 4, X: Param 5, Y:Param 6, Z:Param 7. This command list is similar what ARINC 424 is for commercial aircraft: A data format how to interpret waypoint/mission data.*/\n//\nconst (\n\tMAV_CMD_NAV_WAYPOINT                 = 16  // Navigate to MISSION. | Hold time in decimal seconds. (ignored by fixed wing, time to stay at MISSION for rotary wing) | Acceptance radius in meters (if the sphere with this radius is hit, the MISSION counts as reached) | 0 to pass through the WP, if > 0 radius in meters to pass by WP. Positive value for clockwise orbit, negative value for counter-clockwise orbit. Allows trajectory control. | Desired yaw angle at MISSION (rotary wing) | Latitude | Longitude | Altitude |\n\tMAV_CMD_NAV_LOITER_UNLIM             = 17  // Loiter around this MISSION an unlimited amount of time | Empty | Empty | Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise | Desired yaw angle. | Latitude | Longitude | Altitude |\n\tMAV_CMD_NAV_LOITER_TURNS             = 18  // Loiter around this MISSION for X turns | Turns | Empty | Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise | Desired yaw angle. | Latitude | Longitude | Altitude |\n\tMAV_CMD_NAV_LOITER_TIME              = 19  // Loiter around this MISSION for X seconds | Seconds (decimal) | Empty | Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise | Desired yaw angle. | Latitude | Longitude | Altitude |\n\tMAV_CMD_NAV_RETURN_TO_LAUNCH         = 20  // Return to launch location | Empty | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_NAV_LAND                     = 21  // Land at location | Empty | Empty | Empty | Desired yaw angle. | Latitude | Longitude | Altitude |\n\tMAV_CMD_NAV_TAKEOFF                  = 22  // Takeoff from ground / hand | Minimum pitch (if airspeed sensor present), desired pitch without sensor | Empty | Empty | Yaw angle (if magnetometer present), ignored without magnetometer | Latitude | Longitude | Altitude |\n\tMAV_CMD_NAV_ROI                      = 80  // Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. | Region of intereset mode. (see MAV_ROI enum) | MISSION index/ target ID. (see MAV_ROI enum) | ROI index (allows a vehicle to manage multiple ROI's) | Empty | x the location of the fixed ROI (see MAV_FRAME) | y | z |\n\tMAV_CMD_NAV_PATHPLANNING             = 81  // Control autonomous path planning on the MAV. | 0: Disable local obstacle avoidance / local path planning (without resetting map), 1: Enable local path planning, 2: Enable and reset local path planning | 0: Disable full path planning (without resetting map), 1: Enable, 2: Enable and reset map/occupancy grid, 3: Enable and reset planned route, but not occupancy grid | Empty | Yaw angle at goal, in compass degrees, [0..360] | Latitude/X of goal | Longitude/Y of goal | Altitude/Z of goal |\n\tMAV_CMD_NAV_SPLINE_WAYPOINT          = 82  // Navigate to MISSION using a spline path. | Hold time in decimal seconds. (ignored by fixed wing, time to stay at MISSION for rotary wing) | Empty | Empty | Empty | Latitude/X of goal | Longitude/Y of goal | Altitude/Z of goal |\n\tMAV_CMD_NAV_GUIDED_ENABLE            = 92  // hand control over to an external controller | On / Off (> 0.5f on) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_NAV_LAST                     = 95  // NOP - This command is only used to mark the upper limit of the NAV/ACTION commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_CONDITION_DELAY              = 112 // Delay mission state machine. | Delay in seconds (decimal) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_CONDITION_CHANGE_ALT         = 113 // Ascend/descend at rate.  Delay mission state machine until desired altitude reached. | Descent / Ascend rate (m/s) | Empty | Empty | Empty | Empty | Empty | Finish Altitude |\n\tMAV_CMD_CONDITION_DISTANCE           = 114 // Delay mission state machine until within desired distance of next NAV point. | Distance (meters) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_CONDITION_YAW                = 115 // Reach a certain target angle. | target angle: [0-360], 0 is north | speed during yaw change:[deg per second] | direction: negative: counter clockwise, positive: clockwise [-1,1] | relative offset or absolute angle: [ 1,0] | Empty | Empty | Empty |\n\tMAV_CMD_CONDITION_LAST               = 159 // NOP - This command is only used to mark the upper limit of the CONDITION commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_SET_MODE                  = 176 // Set system mode. | Mode, as defined by ENUM MAV_MODE | Custom mode - this is system specific, please refer to the individual autopilot specifications for details. | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_JUMP                      = 177 // Jump to the desired command in the mission list.  Repeat this action only the specified number of times | Sequence number | Repeat count | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_CHANGE_SPEED              = 178 // Change speed and/or throttle set points. | Speed type (0=Airspeed, 1=Ground Speed) | Speed  (m/s, -1 indicates no change) | Throttle  ( Percent, -1 indicates no change) | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_SET_HOME                  = 179 // Changes the home location either to the current location or a specified location. | Use current (1=use current location, 0=use specified location) | Empty | Empty | Empty | Latitude | Longitude | Altitude |\n\tMAV_CMD_DO_SET_PARAMETER             = 180 // Set a system parameter.  Caution!  Use of this command requires knowledge of the numeric enumeration value of the parameter. | Parameter number | Parameter value | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_SET_RELAY                 = 181 // Set a relay to a condition. | Relay number | Setting (1=on, 0=off, others possible depending on system hardware) | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_REPEAT_RELAY              = 182 // Cycle a relay on and off for a desired number of cyles with a desired period. | Relay number | Cycle count | Cycle time (seconds, decimal) | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_SET_SERVO                 = 183 // Set a servo to a desired PWM value. | Servo number | PWM (microseconds, 1000 to 2000 typical) | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_REPEAT_SERVO              = 184 // Cycle a between its nominal setting and a desired PWM for a desired number of cycles with a desired period. | Servo number | PWM (microseconds, 1000 to 2000 typical) | Cycle count | Cycle time (seconds) | Empty | Empty | Empty |\n\tMAV_CMD_DO_FLIGHTTERMINATION         = 185 // Terminate flight immediately | Flight termination activated if > 0.5 | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_RALLY_LAND                = 190 // Mission command to perform a landing from a rally point. | Break altitude (meters) | Landing speed (m/s) | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_GO_AROUND                 = 191 // Mission command to safely abort an autonmous landing. | Altitude (meters) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_CONTROL_VIDEO             = 200 // Control onboard camera system. | Camera ID (-1 for all) | Transmission: 0: disabled, 1: enabled compressed, 2: enabled raw | Transmission mode: 0: video stream, >0: single images every n seconds (decimal) | Recording: 0: disabled, 1: enabled compressed, 2: enabled raw | Empty | Empty | Empty |\n\tMAV_CMD_DO_SET_ROI                   = 201 // Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. | Region of intereset mode. (see MAV_ROI enum) | MISSION index/ target ID. (see MAV_ROI enum) | ROI index (allows a vehicle to manage multiple ROI's) | Empty | x the location of the fixed ROI (see MAV_FRAME) | y | z |\n\tMAV_CMD_DO_DIGICAM_CONFIGURE         = 202 // Mission command to configure an on-board camera controller system. | Modes: P, TV, AV, M, Etc | Shutter speed: Divisor number for one second | Aperture: F stop number | ISO number e.g. 80, 100, 200, Etc | Exposure type enumerator | Command Identity | Main engine cut-off time before camera trigger in seconds/10 (0 means no cut-off) |\n\tMAV_CMD_DO_DIGICAM_CONTROL           = 203 // Mission command to control an on-board camera controller system. | Session control e.g. show/hide lens | Zoom's absolute position | Zooming step value to offset zoom from the current position | Focus Locking, Unlocking or Re-locking | Shooting Command | Command Identity | Empty |\n\tMAV_CMD_DO_MOUNT_CONFIGURE           = 204 // Mission command to configure a camera or antenna mount | Mount operation mode (see MAV_MOUNT_MODE enum) | stabilize roll? (1 = yes, 0 = no) | stabilize pitch? (1 = yes, 0 = no) | stabilize yaw? (1 = yes, 0 = no) | Empty | Empty | Empty |\n\tMAV_CMD_DO_MOUNT_CONTROL             = 205 // Mission command to control a camera or antenna mount | pitch or lat in degrees, depending on mount mode. | roll or lon in degrees depending on mount mode | yaw or alt (in meters) depending on mount mode | reserved | reserved | reserved | MAV_MOUNT_MODE enum value |\n\tMAV_CMD_DO_SET_CAM_TRIGG_DIST        = 206 // Mission command to set CAM_TRIGG_DIST for this flight | Camera trigger distance (meters) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_FENCE_ENABLE              = 207 // Mission command to enable the geofence | enable? (0=disable, 1=enable) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_PARACHUTE                 = 208 // Mission command to trigger a parachute | action (0=disable, 1=enable, 2=release, for some systems see PARACHUTE_ACTION enum, not in general message set.) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_INVERTED_FLIGHT           = 210 // Change to/from inverted flight | inverted (0=normal, 1=inverted) | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_MOUNT_CONTROL_QUAT        = 220 // Mission command to control a camera or antenna mount, using a quaternion as reference. | q1 - quaternion param #1, w (1 in null-rotation) | q2 - quaternion param #2, x (0 in null-rotation) | q3 - quaternion param #3, y (0 in null-rotation) | q4 - quaternion param #4, z (0 in null-rotation) | Empty | Empty | Empty |\n\tMAV_CMD_DO_GUIDED_CONTROLLER         = 221 // set id of the controller | System ID | Component ID | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_DO_GUIDED_LIMITS             = 222 // set limits for external control | timeout - maximum time (in seconds) that external controller will be allowed to control vehicle. 0 means no timeout | absolute altitude min (in meters, WGS84) - if vehicle moves below this alt, the command will be aborted and the mission will continue.  0 means no lower altitude limit | absolute altitude max (in meters)- if vehicle moves above this alt, the command will be aborted and the mission will continue.  0 means no upper altitude limit | horizontal move limit (in meters, WGS84) - if vehicle moves more than this distance from it's location at the moment the command was executed, the command will be aborted and the mission will continue. 0 means no horizontal altitude limit | Empty | Empty | Empty |\n\tMAV_CMD_DO_LAST                      = 240 // NOP - This command is only used to mark the upper limit of the DO commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty |\n\tMAV_CMD_PREFLIGHT_CALIBRATION        = 241 // Trigger calibration. This command will be only accepted if in pre-flight mode. | Gyro calibration: 0: no, 1: yes | Magnetometer calibration: 0: no, 1: yes | Ground pressure: 0: no, 1: yes | Radio calibration: 0: no, 1: yes | Accelerometer calibration: 0: no, 1: yes | Compass/Motor interference calibration: 0: no, 1: yes | Empty |\n\tMAV_CMD_PREFLIGHT_SET_SENSOR_OFFSETS = 242 // Set sensor offsets. This command will be only accepted if in pre-flight mode. | Sensor to adjust the offsets for: 0: gyros, 1: accelerometer, 2: magnetometer, 3: barometer, 4: optical flow, 5: second magnetometer | X axis offset (or generic dimension 1), in the sensor's raw units | Y axis offset (or generic dimension 2), in the sensor's raw units | Z axis offset (or generic dimension 3), in the sensor's raw units | Generic dimension 4, in the sensor's raw units | Generic dimension 5, in the sensor's raw units | Generic dimension 6, in the sensor's raw units |\n\tMAV_CMD_PREFLIGHT_STORAGE            = 245 // Request storage of different parameter values and logs. This command will be only accepted if in pre-flight mode. | Parameter storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM | Mission storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM | Reserved | Reserved | Empty | Empty | Empty |\n\tMAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN    = 246 // Request the reboot or shutdown of system components. | 0: Do nothing for autopilot, 1: Reboot autopilot, 2: Shutdown autopilot. | 0: Do nothing for onboard computer, 1: Reboot onboard computer, 2: Shutdown onboard computer. | Reserved | Reserved | Empty | Empty | Empty |\n\tMAV_CMD_OVERRIDE_GOTO                = 252 // Hold / continue the current action | MAV_GOTO_DO_HOLD: hold MAV_GOTO_DO_CONTINUE: continue with next item in mission plan | MAV_GOTO_HOLD_AT_CURRENT_POSITION: Hold at current position MAV_GOTO_HOLD_AT_SPECIFIED_POSITION: hold at specified position | MAV_FRAME coordinate frame of hold point | Desired yaw angle in degrees | Latitude / X position | Longitude / Y position | Altitude / Z position |\n\tMAV_CMD_MISSION_START                = 300 // start running a mission | first_item: the first mission item to run | last_item:  the last mission item to run (after this item is run, the mission ends) |\n\tMAV_CMD_COMPONENT_ARM_DISARM         = 400 // Arms / Disarms a component | 1 to arm, 0 to disarm |\n\tMAV_CMD_START_RX_PAIR                = 500 // Starts receiver pairing | 0:Spektrum | 0:Spektrum DSM2, 1:Spektrum DSMX |\n\tMAV_CMD_ENUM_END                     = 501 //  |\n)\n\n//\n// MAV_DATA_STREAM\n/*Data stream IDs. A data stream is not a fixed set of messages, but rather a\n  recommendation to the autopilot software. Individual autopilots may or may not obey\n  the recommended messages.*/\n//\nconst (\n\tMAV_DATA_STREAM_ALL             = 0  // Enable all data streams |\n\tMAV_DATA_STREAM_RAW_SENSORS     = 1  // Enable IMU_RAW, GPS_RAW, GPS_STATUS packets. |\n\tMAV_DATA_STREAM_EXTENDED_STATUS = 2  // Enable GPS_STATUS, CONTROL_STATUS, AUX_STATUS |\n\tMAV_DATA_STREAM_RC_CHANNELS     = 3  // Enable RC_CHANNELS_SCALED, RC_CHANNELS_RAW, SERVO_OUTPUT_RAW |\n\tMAV_DATA_STREAM_RAW_CONTROLLER  = 4  // Enable ATTITUDE_CONTROLLER_OUTPUT, POSITION_CONTROLLER_OUTPUT, NAV_CONTROLLER_OUTPUT. |\n\tMAV_DATA_STREAM_POSITION        = 6  // Enable LOCAL_POSITION, GLOBAL_POSITION/GLOBAL_POSITION_INT messages. |\n\tMAV_DATA_STREAM_EXTRA1          = 10 // Dependent on the autopilot |\n\tMAV_DATA_STREAM_EXTRA2          = 11 // Dependent on the autopilot |\n\tMAV_DATA_STREAM_EXTRA3          = 12 // Dependent on the autopilot |\n\tMAV_DATA_STREAM_ENUM_END        = 13 //  |\n)\n\n//\n// MAV_ROI\n/* The ROI (region of interest) for the vehicle. This can be\n   used by the vehicle for camera/vehicle attitude alignment (see\n   MAV_CMD_NAV_ROI).*/\n//\nconst (\n\tMAV_ROI_NONE     = 0 // No region of interest. |\n\tMAV_ROI_WPNEXT   = 1 // Point toward next MISSION. |\n\tMAV_ROI_WPINDEX  = 2 // Point toward given MISSION. |\n\tMAV_ROI_LOCATION = 3 // Point toward fixed location. |\n\tMAV_ROI_TARGET   = 4 // Point toward of given id. |\n\tMAV_ROI_ENUM_END = 5 //  |\n)\n\n//\n// MAV_CMD_ACK\n/*ACK / NACK / ERROR values as a result of MAV_CMDs and for mission item transmission.*/\n//\nconst (\n\tMAV_CMD_ACK_OK                                 = 1  // Command / mission item is ok. |\n\tMAV_CMD_ACK_ERR_FAIL                           = 2  // Generic error message if none of the other reasons fails or if no detailed error reporting is implemented. |\n\tMAV_CMD_ACK_ERR_ACCESS_DENIED                  = 3  // The system is refusing to accept this command from this source / communication partner. |\n\tMAV_CMD_ACK_ERR_NOT_SUPPORTED                  = 4  // Command or mission item is not supported, other commands would be accepted. |\n\tMAV_CMD_ACK_ERR_COORDINATE_FRAME_NOT_SUPPORTED = 5  // The coordinate frame of this command / mission item is not supported. |\n\tMAV_CMD_ACK_ERR_COORDINATES_OUT_OF_RANGE       = 6  // The coordinate frame of this command is ok, but he coordinate values exceed the safety limits of this system. This is a generic error, please use the more specific error messages below if possible. |\n\tMAV_CMD_ACK_ERR_X_LAT_OUT_OF_RANGE             = 7  // The X or latitude value is out of range. |\n\tMAV_CMD_ACK_ERR_Y_LON_OUT_OF_RANGE             = 8  // The Y or longitude value is out of range. |\n\tMAV_CMD_ACK_ERR_Z_ALT_OUT_OF_RANGE             = 9  // The Z or altitude value is out of range. |\n\tMAV_CMD_ACK_ENUM_END                           = 10 //  |\n)\n\n//\n// MAV_PARAM_TYPE\n/*Specifies the datatype of a MAVLink parameter.*/\n//\nconst (\n\tMAV_PARAM_TYPE_UINT8    = 1  // 8-bit unsigned integer |\n\tMAV_PARAM_TYPE_INT8     = 2  // 8-bit signed integer |\n\tMAV_PARAM_TYPE_UINT16   = 3  // 16-bit unsigned integer |\n\tMAV_PARAM_TYPE_INT16    = 4  // 16-bit signed integer |\n\tMAV_PARAM_TYPE_UINT32   = 5  // 32-bit unsigned integer |\n\tMAV_PARAM_TYPE_INT32    = 6  // 32-bit signed integer |\n\tMAV_PARAM_TYPE_UINT64   = 7  // 64-bit unsigned integer |\n\tMAV_PARAM_TYPE_INT64    = 8  // 64-bit signed integer |\n\tMAV_PARAM_TYPE_REAL32   = 9  // 32-bit floating-point |\n\tMAV_PARAM_TYPE_REAL64   = 10 // 64-bit floating-point |\n\tMAV_PARAM_TYPE_ENUM_END = 11 //  |\n)\n\n//\n// MAV_RESULT\n/*result from a mavlink command*/\n//\nconst (\n\tMAV_RESULT_ACCEPTED             = 0 // Command ACCEPTED and EXECUTED |\n\tMAV_RESULT_TEMPORARILY_REJECTED = 1 // Command TEMPORARY REJECTED/DENIED |\n\tMAV_RESULT_DENIED               = 2 // Command PERMANENTLY DENIED |\n\tMAV_RESULT_UNSUPPORTED          = 3 // Command UNKNOWN/UNSUPPORTED |\n\tMAV_RESULT_FAILED               = 4 // Command executed, but failed |\n\tMAV_RESULT_ENUM_END             = 5 //  |\n)\n\n//\n// MAV_MISSION_RESULT\n/*result in a mavlink mission ack*/\n//\nconst (\n\tMAV_MISSION_ACCEPTED          = 0  // mission accepted OK |\n\tMAV_MISSION_ERROR             = 1  // generic error / not accepting mission commands at all right now |\n\tMAV_MISSION_UNSUPPORTED_FRAME = 2  // coordinate frame is not supported |\n\tMAV_MISSION_UNSUPPORTED       = 3  // command is not supported |\n\tMAV_MISSION_NO_SPACE          = 4  // mission item exceeds storage space |\n\tMAV_MISSION_INVALID           = 5  // one of the parameters has an invalid value |\n\tMAV_MISSION_INVALID_PARAM1    = 6  // param1 has an invalid value |\n\tMAV_MISSION_INVALID_PARAM2    = 7  // param2 has an invalid value |\n\tMAV_MISSION_INVALID_PARAM3    = 8  // param3 has an invalid value |\n\tMAV_MISSION_INVALID_PARAM4    = 9  // param4 has an invalid value |\n\tMAV_MISSION_INVALID_PARAM5_X  = 10 // x/param5 has an invalid value |\n\tMAV_MISSION_INVALID_PARAM6_Y  = 11 // y/param6 has an invalid value |\n\tMAV_MISSION_INVALID_PARAM7    = 12 // param7 has an invalid value |\n\tMAV_MISSION_INVALID_SEQUENCE  = 13 // received waypoint out of sequence |\n\tMAV_MISSION_DENIED            = 14 // not accepting any mission commands from this communication partner |\n\tMAV_MISSION_RESULT_ENUM_END   = 15 //  |\n)\n\n//\n// MAV_SEVERITY\n/*Indicates the severity level, generally used for status messages to indicate their relative urgency. Based on RFC-5424 using expanded definitions at: http://www.kiwisyslog.com/kb/info:-syslog-message-levels/.*/\n//\nconst (\n\tMAV_SEVERITY_EMERGENCY = 0 // System is unusable. This is a \"panic\" condition. |\n\tMAV_SEVERITY_ALERT     = 1 // Action should be taken immediately. Indicates error in non-critical systems. |\n\tMAV_SEVERITY_CRITICAL  = 2 // Action must be taken immediately. Indicates failure in a primary system. |\n\tMAV_SEVERITY_ERROR     = 3 // Indicates an error in secondary/redundant systems. |\n\tMAV_SEVERITY_WARNING   = 4 // Indicates about a possible future error if this is not resolved within a given timeframe. Example would be a low battery warning. |\n\tMAV_SEVERITY_NOTICE    = 5 // An unusual event has occurred, though not an error condition. This should be investigated for the root cause. |\n\tMAV_SEVERITY_INFO      = 6 // Normal operational messages. Useful for logging. No action is required for these messages. |\n\tMAV_SEVERITY_DEBUG     = 7 // Useful non-operational messages that can assist in debugging. These should not occur during normal operation. |\n\tMAV_SEVERITY_ENUM_END  = 8 //  |\n)\n\n//\n// MAV_POWER_STATUS\n/*Power supply status flags (bitmask)*/\n//\nconst (\n\tMAV_POWER_STATUS_BRICK_VALID                = 1  // main brick power supply valid |\n\tMAV_POWER_STATUS_SERVO_VALID                = 2  // main servo power supply valid for FMU |\n\tMAV_POWER_STATUS_USB_CONNECTED              = 4  // USB power is connected |\n\tMAV_POWER_STATUS_PERIPH_OVERCURRENT         = 8  // peripheral supply is in over-current state |\n\tMAV_POWER_STATUS_PERIPH_HIPOWER_OVERCURRENT = 16 // hi-power peripheral supply is in over-current state |\n\tMAV_POWER_STATUS_CHANGED                    = 32 // Power status has changed since boot |\n\tMAV_POWER_STATUS_ENUM_END                   = 33 //  |\n)\n\n//\n// SERIAL_CONTROL_DEV\n/*SERIAL_CONTROL device types*/\n//\nconst (\n\tSERIAL_CONTROL_DEV_TELEM1   = 0 // First telemetry port |\n\tSERIAL_CONTROL_DEV_TELEM2   = 1 // Second telemetry port |\n\tSERIAL_CONTROL_DEV_GPS1     = 2 // First GPS port |\n\tSERIAL_CONTROL_DEV_GPS2     = 3 // Second GPS port |\n\tSERIAL_CONTROL_DEV_ENUM_END = 4 //  |\n)\n\n//\n// SERIAL_CONTROL_FLAG\n/*SERIAL_CONTROL flags (bitmask)*/\n//\nconst (\n\tSERIAL_CONTROL_FLAG_REPLY     = 1  // Set if this is a reply |\n\tSERIAL_CONTROL_FLAG_RESPOND   = 2  // Set if the sender wants the receiver to send a response as another SERIAL_CONTROL message |\n\tSERIAL_CONTROL_FLAG_EXCLUSIVE = 4  // Set if access to the serial port should be removed from whatever driver is currently using it, giving exclusive access to the SERIAL_CONTROL protocol. The port can be handed back by sending a request without this flag set |\n\tSERIAL_CONTROL_FLAG_BLOCKING  = 8  // Block on writes to the serial port |\n\tSERIAL_CONTROL_FLAG_MULTI     = 16 // Send multiple replies until port is drained |\n\tSERIAL_CONTROL_FLAG_ENUM_END  = 17 //  |\n)\n\n//\n// MAV_DISTANCE_SENSOR\n/*Enumeration of distance sensor types*/\n//\nconst (\n\tMAV_DISTANCE_SENSOR_LASER      = 0 // Laser altimeter, e.g. LightWare SF02/F or PulsedLight units |\n\tMAV_DISTANCE_SENSOR_ULTRASOUND = 1 // Ultrasound altimeter, e.g. MaxBotix units |\n\tMAV_DISTANCE_SENSOR_ENUM_END   = 2 //  |\n)\n\n// MESSAGE HEARTBEAT\n//\n// MAVLINK_MSG_ID_HEARTBEAT 0\n//\n// MAVLINK_MSG_ID_HEARTBEAT_LEN 9\n//\n// MAVLINK_MSG_ID_HEARTBEAT_CRC 50\ntype Heartbeat struct {\n\tCUSTOM_MODE     uint32 // A bitfield for use for autopilot-specific flags.\n\tTYPE            uint8  // Type of the MAV (quadrotor, helicopter, etc., up to 15 types, defined in MAV_TYPE ENUM)\n\tAUTOPILOT       uint8  // Autopilot type / class. defined in MAV_AUTOPILOT ENUM\n\tBASE_MODE       uint8  // System mode bitfield, see MAV_MODE_FLAG ENUM in mavlink/include/mavlink_types.h\n\tSYSTEM_STATUS   uint8  // System status flag, see MAV_STATE ENUM\n\tMAVLINK_VERSION uint8  // MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version\n}\n\n// NewHeartbeat returns a new Heartbeat\nfunc NewHeartbeat(CUSTOM_MODE uint32, TYPE uint8, AUTOPILOT uint8, BASE_MODE uint8, SYSTEM_STATUS uint8, MAVLINK_VERSION uint8) *Heartbeat {\n\tm := Heartbeat{}\n\tm.CUSTOM_MODE = CUSTOM_MODE\n\tm.TYPE = TYPE\n\tm.AUTOPILOT = AUTOPILOT\n\tm.BASE_MODE = BASE_MODE\n\tm.SYSTEM_STATUS = SYSTEM_STATUS\n\tm.MAVLINK_VERSION = MAVLINK_VERSION\n\treturn &m\n}\n\n// Id returns the Heartbeat Message ID\nfunc (*Heartbeat) Id() uint8 {\n\treturn 0\n}\n\n// Len returns the Heartbeat Message Length\nfunc (*Heartbeat) Len() uint8 {\n\treturn 9\n}\n\n// Crc returns the Heartbeat Message CRC\nfunc (*Heartbeat) Crc() uint8 {\n\treturn 50\n}\n\n// Pack returns a packed byte array which represents a Heartbeat payload\nfunc (m *Heartbeat) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.CUSTOM_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AUTOPILOT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASE_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SYSTEM_STATUS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MAVLINK_VERSION); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Heartbeat\nfunc (m *Heartbeat) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.CUSTOM_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AUTOPILOT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASE_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SYSTEM_STATUS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MAVLINK_VERSION); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SYS_STATUS\n//\n// MAVLINK_MSG_ID_SYS_STATUS 1\n//\n// MAVLINK_MSG_ID_SYS_STATUS_LEN 31\n//\n// MAVLINK_MSG_ID_SYS_STATUS_CRC 124\ntype SysStatus struct {\n\tONBOARD_CONTROL_SENSORS_PRESENT uint32 // Bitmask showing which onboard controllers and sensors are present. Value of 0: not present. Value of 1: present. Indices defined by ENUM MAV_SYS_STATUS_SENSOR\n\tONBOARD_CONTROL_SENSORS_ENABLED uint32 // Bitmask showing which onboard controllers and sensors are enabled:  Value of 0: not enabled. Value of 1: enabled. Indices defined by ENUM MAV_SYS_STATUS_SENSOR\n\tONBOARD_CONTROL_SENSORS_HEALTH  uint32 // Bitmask showing which onboard controllers and sensors are operational or have an error:  Value of 0: not enabled. Value of 1: enabled. Indices defined by ENUM MAV_SYS_STATUS_SENSOR\n\tLOAD                            uint16 // Maximum usage in percent of the mainloop time, (0%: 0, 100%: 1000) should be always below 1000\n\tVOLTAGE_BATTERY                 uint16 // Battery voltage, in millivolts (1 = 1 millivolt)\n\tCURRENT_BATTERY                 int16  // Battery current, in 10*milliamperes (1 = 10 milliampere), -1: autopilot does not measure the current\n\tDROP_RATE_COMM                  uint16 // Communication drops in percent, (0%: 0, 100%: 10'000), (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV)\n\tERRORS_COMM                     uint16 // Communication errors (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV)\n\tERRORS_COUNT1                   uint16 // Autopilot-specific errors\n\tERRORS_COUNT2                   uint16 // Autopilot-specific errors\n\tERRORS_COUNT3                   uint16 // Autopilot-specific errors\n\tERRORS_COUNT4                   uint16 // Autopilot-specific errors\n\tBATTERY_REMAINING               int8   // Remaining battery energy: (0%: 0, 100%: 100), -1: autopilot estimate the remaining battery\n}\n\n// NewSysStatus returns a new SysStatus\nfunc NewSysStatus(ONBOARD_CONTROL_SENSORS_PRESENT uint32, ONBOARD_CONTROL_SENSORS_ENABLED uint32, ONBOARD_CONTROL_SENSORS_HEALTH uint32, LOAD uint16, VOLTAGE_BATTERY uint16, CURRENT_BATTERY int16, DROP_RATE_COMM uint16, ERRORS_COMM uint16, ERRORS_COUNT1 uint16, ERRORS_COUNT2 uint16, ERRORS_COUNT3 uint16, ERRORS_COUNT4 uint16, BATTERY_REMAINING int8) *SysStatus {\n\tm := SysStatus{}\n\tm.ONBOARD_CONTROL_SENSORS_PRESENT = ONBOARD_CONTROL_SENSORS_PRESENT\n\tm.ONBOARD_CONTROL_SENSORS_ENABLED = ONBOARD_CONTROL_SENSORS_ENABLED\n\tm.ONBOARD_CONTROL_SENSORS_HEALTH = ONBOARD_CONTROL_SENSORS_HEALTH\n\tm.LOAD = LOAD\n\tm.VOLTAGE_BATTERY = VOLTAGE_BATTERY\n\tm.CURRENT_BATTERY = CURRENT_BATTERY\n\tm.DROP_RATE_COMM = DROP_RATE_COMM\n\tm.ERRORS_COMM = ERRORS_COMM\n\tm.ERRORS_COUNT1 = ERRORS_COUNT1\n\tm.ERRORS_COUNT2 = ERRORS_COUNT2\n\tm.ERRORS_COUNT3 = ERRORS_COUNT3\n\tm.ERRORS_COUNT4 = ERRORS_COUNT4\n\tm.BATTERY_REMAINING = BATTERY_REMAINING\n\treturn &m\n}\n\n// Id returns the SysStatus Message ID\nfunc (*SysStatus) Id() uint8 {\n\treturn 1\n}\n\n// Len returns the SysStatus Message Length\nfunc (*SysStatus) Len() uint8 {\n\treturn 31\n}\n\n// Crc returns the SysStatus Message CRC\nfunc (*SysStatus) Crc() uint8 {\n\treturn 124\n}\n\n// Pack returns a packed byte array which represents a SysStatus payload\nfunc (m *SysStatus) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.ONBOARD_CONTROL_SENSORS_PRESENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ONBOARD_CONTROL_SENSORS_ENABLED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ONBOARD_CONTROL_SENSORS_HEALTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LOAD); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VOLTAGE_BATTERY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CURRENT_BATTERY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DROP_RATE_COMM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ERRORS_COMM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ERRORS_COUNT1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ERRORS_COUNT2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ERRORS_COUNT3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ERRORS_COUNT4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BATTERY_REMAINING); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SysStatus\nfunc (m *SysStatus) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.ONBOARD_CONTROL_SENSORS_PRESENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ONBOARD_CONTROL_SENSORS_ENABLED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ONBOARD_CONTROL_SENSORS_HEALTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LOAD); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VOLTAGE_BATTERY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CURRENT_BATTERY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DROP_RATE_COMM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ERRORS_COMM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ERRORS_COUNT1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ERRORS_COUNT2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ERRORS_COUNT3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ERRORS_COUNT4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BATTERY_REMAINING); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SYSTEM_TIME\n//\n// MAVLINK_MSG_ID_SYSTEM_TIME 2\n//\n// MAVLINK_MSG_ID_SYSTEM_TIME_LEN 12\n//\n// MAVLINK_MSG_ID_SYSTEM_TIME_CRC 137\ntype SystemTime struct {\n\tTIME_UNIX_USEC uint64 // Timestamp of the primary reference clock in microseconds since UNIX epoch.\n\tTIME_BOOT_MS   uint32 // Timestamp of the component clock since boot time in milliseconds.\n}\n\n// NewSystemTime returns a new SystemTime\nfunc NewSystemTime(TIME_UNIX_USEC uint64, TIME_BOOT_MS uint32) *SystemTime {\n\tm := SystemTime{}\n\tm.TIME_UNIX_USEC = TIME_UNIX_USEC\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\treturn &m\n}\n\n// Id returns the SystemTime Message ID\nfunc (*SystemTime) Id() uint8 {\n\treturn 2\n}\n\n// Len returns the SystemTime Message Length\nfunc (*SystemTime) Len() uint8 {\n\treturn 12\n}\n\n// Crc returns the SystemTime Message CRC\nfunc (*SystemTime) Crc() uint8 {\n\treturn 137\n}\n\n// Pack returns a packed byte array which represents a SystemTime payload\nfunc (m *SystemTime) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_UNIX_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SystemTime\nfunc (m *SystemTime) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_UNIX_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE PING\n//\n// MAVLINK_MSG_ID_PING 4\n//\n// MAVLINK_MSG_ID_PING_LEN 14\n//\n// MAVLINK_MSG_ID_PING_CRC 237\ntype Ping struct {\n\tTIME_USEC        uint64 // Unix timestamp in microseconds\n\tSEQ              uint32 // PING sequence\n\tTARGET_SYSTEM    uint8  // 0: request ping from all receiving systems, if greater than 0: message is a ping response and number is the system id of the requesting system\n\tTARGET_COMPONENT uint8  // 0: request ping from all receiving components, if greater than 0: message is a ping response and number is the system id of the requesting system\n}\n\n// NewPing returns a new Ping\nfunc NewPing(TIME_USEC uint64, SEQ uint32, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *Ping {\n\tm := Ping{}\n\tm.TIME_USEC = TIME_USEC\n\tm.SEQ = SEQ\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the Ping Message ID\nfunc (*Ping) Id() uint8 {\n\treturn 4\n}\n\n// Len returns the Ping Message Length\nfunc (*Ping) Len() uint8 {\n\treturn 14\n}\n\n// Crc returns the Ping Message CRC\nfunc (*Ping) Crc() uint8 {\n\treturn 237\n}\n\n// Pack returns a packed byte array which represents a Ping payload\nfunc (m *Ping) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Ping\nfunc (m *Ping) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE CHANGE_OPERATOR_CONTROL\n//\n// MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL 5\n//\n// MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL_LEN 28\n//\n// MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL_CRC 217\ntype ChangeOperatorControl struct {\n\tTARGET_SYSTEM   uint8     // System the GCS requests control for\n\tCONTROL_REQUEST uint8     // 0: request control of this MAV, 1: Release control of this MAV\n\tVERSION         uint8     // 0: key as plaintext, 1-255: future, different hashing/encryption variants. The GCS should in general use the safest mode possible initially and then gradually move down the encryption level if it gets a NACK message indicating an encryption mismatch.\n\tPASSKEY         [25]uint8 // Password / Key, depending on version plaintext or encrypted. 25 or less characters, NULL terminated. The characters may involve A-Z, a-z, 0-9, and \"!?,.-\"\n}\n\n// NewChangeOperatorControl returns a new ChangeOperatorControl\nfunc NewChangeOperatorControl(TARGET_SYSTEM uint8, CONTROL_REQUEST uint8, VERSION uint8, PASSKEY [25]uint8) *ChangeOperatorControl {\n\tm := ChangeOperatorControl{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.CONTROL_REQUEST = CONTROL_REQUEST\n\tm.VERSION = VERSION\n\tm.PASSKEY = PASSKEY\n\treturn &m\n}\n\n// Id returns the ChangeOperatorControl Message ID\nfunc (*ChangeOperatorControl) Id() uint8 {\n\treturn 5\n}\n\n// Len returns the ChangeOperatorControl Message Length\nfunc (*ChangeOperatorControl) Len() uint8 {\n\treturn 28\n}\n\n// Crc returns the ChangeOperatorControl Message CRC\nfunc (*ChangeOperatorControl) Crc() uint8 {\n\treturn 217\n}\n\n// Pack returns a packed byte array which represents a ChangeOperatorControl payload\nfunc (m *ChangeOperatorControl) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CONTROL_REQUEST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VERSION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PASSKEY); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ChangeOperatorControl\nfunc (m *ChangeOperatorControl) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CONTROL_REQUEST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VERSION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PASSKEY); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_CHANGE_OPERATOR_CONTROL_FIELD_passkey_LEN = 25\n)\n\n// MESSAGE CHANGE_OPERATOR_CONTROL_ACK\n//\n// MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL_ACK 6\n//\n// MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL_ACK_LEN 3\n//\n// MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL_ACK_CRC 104\ntype ChangeOperatorControlAck struct {\n\tGCS_SYSTEM_ID   uint8 // ID of the GCS this message\n\tCONTROL_REQUEST uint8 // 0: request control of this MAV, 1: Release control of this MAV\n\tACK             uint8 // 0: ACK, 1: NACK: Wrong passkey, 2: NACK: Unsupported passkey encryption method, 3: NACK: Already under control\n}\n\n// NewChangeOperatorControlAck returns a new ChangeOperatorControlAck\nfunc NewChangeOperatorControlAck(GCS_SYSTEM_ID uint8, CONTROL_REQUEST uint8, ACK uint8) *ChangeOperatorControlAck {\n\tm := ChangeOperatorControlAck{}\n\tm.GCS_SYSTEM_ID = GCS_SYSTEM_ID\n\tm.CONTROL_REQUEST = CONTROL_REQUEST\n\tm.ACK = ACK\n\treturn &m\n}\n\n// Id returns the ChangeOperatorControlAck Message ID\nfunc (*ChangeOperatorControlAck) Id() uint8 {\n\treturn 6\n}\n\n// Len returns the ChangeOperatorControlAck Message Length\nfunc (*ChangeOperatorControlAck) Len() uint8 {\n\treturn 3\n}\n\n// Crc returns the ChangeOperatorControlAck Message CRC\nfunc (*ChangeOperatorControlAck) Crc() uint8 {\n\treturn 104\n}\n\n// Pack returns a packed byte array which represents a ChangeOperatorControlAck payload\nfunc (m *ChangeOperatorControlAck) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.GCS_SYSTEM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CONTROL_REQUEST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ACK); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ChangeOperatorControlAck\nfunc (m *ChangeOperatorControlAck) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.GCS_SYSTEM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CONTROL_REQUEST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ACK); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE AUTH_KEY\n//\n// MAVLINK_MSG_ID_AUTH_KEY 7\n//\n// MAVLINK_MSG_ID_AUTH_KEY_LEN 32\n//\n// MAVLINK_MSG_ID_AUTH_KEY_CRC 119\ntype AuthKey struct {\n\tKEY [32]uint8 // key\n}\n\n// NewAuthKey returns a new AuthKey\nfunc NewAuthKey(KEY [32]uint8) *AuthKey {\n\tm := AuthKey{}\n\tm.KEY = KEY\n\treturn &m\n}\n\n// Id returns the AuthKey Message ID\nfunc (*AuthKey) Id() uint8 {\n\treturn 7\n}\n\n// Len returns the AuthKey Message Length\nfunc (*AuthKey) Len() uint8 {\n\treturn 32\n}\n\n// Crc returns the AuthKey Message CRC\nfunc (*AuthKey) Crc() uint8 {\n\treturn 119\n}\n\n// Pack returns a packed byte array which represents a AuthKey payload\nfunc (m *AuthKey) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.KEY); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the AuthKey\nfunc (m *AuthKey) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.KEY); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_AUTH_KEY_FIELD_key_LEN = 32\n)\n\n// MESSAGE SET_MODE\n//\n// MAVLINK_MSG_ID_SET_MODE 11\n//\n// MAVLINK_MSG_ID_SET_MODE_LEN 6\n//\n// MAVLINK_MSG_ID_SET_MODE_CRC 89\ntype SetMode struct {\n\tCUSTOM_MODE   uint32 // The new autopilot-specific mode. This field can be ignored by an autopilot.\n\tTARGET_SYSTEM uint8  // The system setting the mode\n\tBASE_MODE     uint8  // The new base mode\n}\n\n// NewSetMode returns a new SetMode\nfunc NewSetMode(CUSTOM_MODE uint32, TARGET_SYSTEM uint8, BASE_MODE uint8) *SetMode {\n\tm := SetMode{}\n\tm.CUSTOM_MODE = CUSTOM_MODE\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.BASE_MODE = BASE_MODE\n\treturn &m\n}\n\n// Id returns the SetMode Message ID\nfunc (*SetMode) Id() uint8 {\n\treturn 11\n}\n\n// Len returns the SetMode Message Length\nfunc (*SetMode) Len() uint8 {\n\treturn 6\n}\n\n// Crc returns the SetMode Message CRC\nfunc (*SetMode) Crc() uint8 {\n\treturn 89\n}\n\n// Pack returns a packed byte array which represents a SetMode payload\nfunc (m *SetMode) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.CUSTOM_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASE_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetMode\nfunc (m *SetMode) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.CUSTOM_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASE_MODE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE PARAM_REQUEST_READ\n//\n// MAVLINK_MSG_ID_PARAM_REQUEST_READ 20\n//\n// MAVLINK_MSG_ID_PARAM_REQUEST_READ_LEN 20\n//\n// MAVLINK_MSG_ID_PARAM_REQUEST_READ_CRC 214\ntype ParamRequestRead struct {\n\tPARAM_INDEX      int16     // Parameter index. Send -1 to use the param ID field as identifier (else the param id will be ignored)\n\tTARGET_SYSTEM    uint8     // System ID\n\tTARGET_COMPONENT uint8     // Component ID\n\tPARAM_ID         [16]uint8 // Onboard parameter id, terminated by NULL if the length is less than 16 human-readable chars and WITHOUT null termination (NULL) byte if the length is exactly 16 chars - applications have to provide 16+1 bytes storage if the ID is stored as string\n}\n\n// NewParamRequestRead returns a new ParamRequestRead\nfunc NewParamRequestRead(PARAM_INDEX int16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, PARAM_ID [16]uint8) *ParamRequestRead {\n\tm := ParamRequestRead{}\n\tm.PARAM_INDEX = PARAM_INDEX\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.PARAM_ID = PARAM_ID\n\treturn &m\n}\n\n// Id returns the ParamRequestRead Message ID\nfunc (*ParamRequestRead) Id() uint8 {\n\treturn 20\n}\n\n// Len returns the ParamRequestRead Message Length\nfunc (*ParamRequestRead) Len() uint8 {\n\treturn 20\n}\n\n// Crc returns the ParamRequestRead Message CRC\nfunc (*ParamRequestRead) Crc() uint8 {\n\treturn 214\n}\n\n// Pack returns a packed byte array which represents a ParamRequestRead payload\nfunc (m *ParamRequestRead) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ParamRequestRead\nfunc (m *ParamRequestRead) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_PARAM_REQUEST_READ_FIELD_param_id_LEN = 16\n)\n\n// MESSAGE PARAM_REQUEST_LIST\n//\n// MAVLINK_MSG_ID_PARAM_REQUEST_LIST 21\n//\n// MAVLINK_MSG_ID_PARAM_REQUEST_LIST_LEN 2\n//\n// MAVLINK_MSG_ID_PARAM_REQUEST_LIST_CRC 159\ntype ParamRequestList struct {\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n}\n\n// NewParamRequestList returns a new ParamRequestList\nfunc NewParamRequestList(TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *ParamRequestList {\n\tm := ParamRequestList{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the ParamRequestList Message ID\nfunc (*ParamRequestList) Id() uint8 {\n\treturn 21\n}\n\n// Len returns the ParamRequestList Message Length\nfunc (*ParamRequestList) Len() uint8 {\n\treturn 2\n}\n\n// Crc returns the ParamRequestList Message CRC\nfunc (*ParamRequestList) Crc() uint8 {\n\treturn 159\n}\n\n// Pack returns a packed byte array which represents a ParamRequestList payload\nfunc (m *ParamRequestList) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ParamRequestList\nfunc (m *ParamRequestList) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE PARAM_VALUE\n//\n// MAVLINK_MSG_ID_PARAM_VALUE 22\n//\n// MAVLINK_MSG_ID_PARAM_VALUE_LEN 25\n//\n// MAVLINK_MSG_ID_PARAM_VALUE_CRC 220\ntype ParamValue struct {\n\tPARAM_VALUE float32   // Onboard parameter value\n\tPARAM_COUNT uint16    // Total number of onboard parameters\n\tPARAM_INDEX uint16    // Index of this onboard parameter\n\tPARAM_ID    [16]uint8 // Onboard parameter id, terminated by NULL if the length is less than 16 human-readable chars and WITHOUT null termination (NULL) byte if the length is exactly 16 chars - applications have to provide 16+1 bytes storage if the ID is stored as string\n\tPARAM_TYPE  uint8     // Onboard parameter type: see the MAV_PARAM_TYPE enum for supported data types.\n}\n\n// NewParamValue returns a new ParamValue\nfunc NewParamValue(PARAM_VALUE float32, PARAM_COUNT uint16, PARAM_INDEX uint16, PARAM_ID [16]uint8, PARAM_TYPE uint8) *ParamValue {\n\tm := ParamValue{}\n\tm.PARAM_VALUE = PARAM_VALUE\n\tm.PARAM_COUNT = PARAM_COUNT\n\tm.PARAM_INDEX = PARAM_INDEX\n\tm.PARAM_ID = PARAM_ID\n\tm.PARAM_TYPE = PARAM_TYPE\n\treturn &m\n}\n\n// Id returns the ParamValue Message ID\nfunc (*ParamValue) Id() uint8 {\n\treturn 22\n}\n\n// Len returns the ParamValue Message Length\nfunc (*ParamValue) Len() uint8 {\n\treturn 25\n}\n\n// Crc returns the ParamValue Message CRC\nfunc (*ParamValue) Crc() uint8 {\n\treturn 220\n}\n\n// Pack returns a packed byte array which represents a ParamValue payload\nfunc (m *ParamValue) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ParamValue\nfunc (m *ParamValue) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_PARAM_VALUE_FIELD_param_id_LEN = 16\n)\n\n// MESSAGE PARAM_SET\n//\n// MAVLINK_MSG_ID_PARAM_SET 23\n//\n// MAVLINK_MSG_ID_PARAM_SET_LEN 23\n//\n// MAVLINK_MSG_ID_PARAM_SET_CRC 168\ntype ParamSet struct {\n\tPARAM_VALUE      float32   // Onboard parameter value\n\tTARGET_SYSTEM    uint8     // System ID\n\tTARGET_COMPONENT uint8     // Component ID\n\tPARAM_ID         [16]uint8 // Onboard parameter id, terminated by NULL if the length is less than 16 human-readable chars and WITHOUT null termination (NULL) byte if the length is exactly 16 chars - applications have to provide 16+1 bytes storage if the ID is stored as string\n\tPARAM_TYPE       uint8     // Onboard parameter type: see the MAV_PARAM_TYPE enum for supported data types.\n}\n\n// NewParamSet returns a new ParamSet\nfunc NewParamSet(PARAM_VALUE float32, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, PARAM_ID [16]uint8, PARAM_TYPE uint8) *ParamSet {\n\tm := ParamSet{}\n\tm.PARAM_VALUE = PARAM_VALUE\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.PARAM_ID = PARAM_ID\n\tm.PARAM_TYPE = PARAM_TYPE\n\treturn &m\n}\n\n// Id returns the ParamSet Message ID\nfunc (*ParamSet) Id() uint8 {\n\treturn 23\n}\n\n// Len returns the ParamSet Message Length\nfunc (*ParamSet) Len() uint8 {\n\treturn 23\n}\n\n// Crc returns the ParamSet Message CRC\nfunc (*ParamSet) Crc() uint8 {\n\treturn 168\n}\n\n// Pack returns a packed byte array which represents a ParamSet payload\nfunc (m *ParamSet) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ParamSet\nfunc (m *ParamSet) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_PARAM_SET_FIELD_param_id_LEN = 16\n)\n\n// MESSAGE GPS_RAW_INT\n//\n// MAVLINK_MSG_ID_GPS_RAW_INT 24\n//\n// MAVLINK_MSG_ID_GPS_RAW_INT_LEN 30\n//\n// MAVLINK_MSG_ID_GPS_RAW_INT_CRC 24\ntype GpsRawInt struct {\n\tTIME_USEC          uint64 // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tLAT                int32  // Latitude (WGS84), in degrees * 1E7\n\tLON                int32  // Longitude (WGS84), in degrees * 1E7\n\tALT                int32  // Altitude (WGS84), in meters * 1000 (positive for up)\n\tEPH                uint16 // GPS HDOP horizontal dilution of position in cm (m*100). If unknown, set to: UINT16_MAX\n\tEPV                uint16 // GPS VDOP vertical dilution of position in cm (m*100). If unknown, set to: UINT16_MAX\n\tVEL                uint16 // GPS ground speed (m/s * 100). If unknown, set to: UINT16_MAX\n\tCOG                uint16 // Course over ground (NOT heading, but direction of movement) in degrees * 100, 0.0..359.99 degrees. If unknown, set to: UINT16_MAX\n\tFIX_TYPE           uint8  // 0-1: no fix, 2: 2D fix, 3: 3D fix, 4: DGPS, 5: RTK. Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix.\n\tSATELLITES_VISIBLE uint8  // Number of satellites visible. If unknown, set to 255\n}\n\n// NewGpsRawInt returns a new GpsRawInt\nfunc NewGpsRawInt(TIME_USEC uint64, LAT int32, LON int32, ALT int32, EPH uint16, EPV uint16, VEL uint16, COG uint16, FIX_TYPE uint8, SATELLITES_VISIBLE uint8) *GpsRawInt {\n\tm := GpsRawInt{}\n\tm.TIME_USEC = TIME_USEC\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.ALT = ALT\n\tm.EPH = EPH\n\tm.EPV = EPV\n\tm.VEL = VEL\n\tm.COG = COG\n\tm.FIX_TYPE = FIX_TYPE\n\tm.SATELLITES_VISIBLE = SATELLITES_VISIBLE\n\treturn &m\n}\n\n// Id returns the GpsRawInt Message ID\nfunc (*GpsRawInt) Id() uint8 {\n\treturn 24\n}\n\n// Len returns the GpsRawInt Message Length\nfunc (*GpsRawInt) Len() uint8 {\n\treturn 30\n}\n\n// Crc returns the GpsRawInt Message CRC\nfunc (*GpsRawInt) Crc() uint8 {\n\treturn 24\n}\n\n// Pack returns a packed byte array which represents a GpsRawInt payload\nfunc (m *GpsRawInt) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.EPH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.EPV); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VEL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FIX_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GpsRawInt\nfunc (m *GpsRawInt) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.EPH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.EPV); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VEL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FIX_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GPS_STATUS\n//\n// MAVLINK_MSG_ID_GPS_STATUS 25\n//\n// MAVLINK_MSG_ID_GPS_STATUS_LEN 101\n//\n// MAVLINK_MSG_ID_GPS_STATUS_CRC 23\ntype GpsStatus struct {\n\tSATELLITES_VISIBLE  uint8     // Number of satellites visible\n\tSATELLITE_PRN       [20]uint8 // Global satellite ID\n\tSATELLITE_USED      [20]uint8 // 0: Satellite not used, 1: used for localization\n\tSATELLITE_ELEVATION [20]uint8 // Elevation (0: right on top of receiver, 90: on the horizon) of satellite\n\tSATELLITE_AZIMUTH   [20]uint8 // Direction of satellite, 0: 0 deg, 255: 360 deg.\n\tSATELLITE_SNR       [20]uint8 // Signal to noise ratio of satellite\n}\n\n// NewGpsStatus returns a new GpsStatus\nfunc NewGpsStatus(SATELLITES_VISIBLE uint8, SATELLITE_PRN [20]uint8, SATELLITE_USED [20]uint8, SATELLITE_ELEVATION [20]uint8, SATELLITE_AZIMUTH [20]uint8, SATELLITE_SNR [20]uint8) *GpsStatus {\n\tm := GpsStatus{}\n\tm.SATELLITES_VISIBLE = SATELLITES_VISIBLE\n\tm.SATELLITE_PRN = SATELLITE_PRN\n\tm.SATELLITE_USED = SATELLITE_USED\n\tm.SATELLITE_ELEVATION = SATELLITE_ELEVATION\n\tm.SATELLITE_AZIMUTH = SATELLITE_AZIMUTH\n\tm.SATELLITE_SNR = SATELLITE_SNR\n\treturn &m\n}\n\n// Id returns the GpsStatus Message ID\nfunc (*GpsStatus) Id() uint8 {\n\treturn 25\n}\n\n// Len returns the GpsStatus Message Length\nfunc (*GpsStatus) Len() uint8 {\n\treturn 101\n}\n\n// Crc returns the GpsStatus Message CRC\nfunc (*GpsStatus) Crc() uint8 {\n\treturn 23\n}\n\n// Pack returns a packed byte array which represents a GpsStatus payload\nfunc (m *GpsStatus) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITE_PRN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITE_USED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITE_ELEVATION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITE_AZIMUTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITE_SNR); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GpsStatus\nfunc (m *GpsStatus) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITE_PRN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITE_USED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITE_ELEVATION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITE_AZIMUTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITE_SNR); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_GPS_STATUS_FIELD_satellite_prn_LEN       = 20\n\tMAVLINK_MSG_GPS_STATUS_FIELD_satellite_used_LEN      = 20\n\tMAVLINK_MSG_GPS_STATUS_FIELD_satellite_elevation_LEN = 20\n\tMAVLINK_MSG_GPS_STATUS_FIELD_satellite_azimuth_LEN   = 20\n\tMAVLINK_MSG_GPS_STATUS_FIELD_satellite_snr_LEN       = 20\n)\n\n// MESSAGE SCALED_IMU\n//\n// MAVLINK_MSG_ID_SCALED_IMU 26\n//\n// MAVLINK_MSG_ID_SCALED_IMU_LEN 22\n//\n// MAVLINK_MSG_ID_SCALED_IMU_CRC 170\ntype ScaledImu struct {\n\tTIME_BOOT_MS uint32 // Timestamp (milliseconds since system boot)\n\tXACC         int16  // X acceleration (mg)\n\tYACC         int16  // Y acceleration (mg)\n\tZACC         int16  // Z acceleration (mg)\n\tXGYRO        int16  // Angular speed around X axis (millirad /sec)\n\tYGYRO        int16  // Angular speed around Y axis (millirad /sec)\n\tZGYRO        int16  // Angular speed around Z axis (millirad /sec)\n\tXMAG         int16  // X Magnetic field (milli tesla)\n\tYMAG         int16  // Y Magnetic field (milli tesla)\n\tZMAG         int16  // Z Magnetic field (milli tesla)\n}\n\n// NewScaledImu returns a new ScaledImu\nfunc NewScaledImu(TIME_BOOT_MS uint32, XACC int16, YACC int16, ZACC int16, XGYRO int16, YGYRO int16, ZGYRO int16, XMAG int16, YMAG int16, ZMAG int16) *ScaledImu {\n\tm := ScaledImu{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\tm.XGYRO = XGYRO\n\tm.YGYRO = YGYRO\n\tm.ZGYRO = ZGYRO\n\tm.XMAG = XMAG\n\tm.YMAG = YMAG\n\tm.ZMAG = ZMAG\n\treturn &m\n}\n\n// Id returns the ScaledImu Message ID\nfunc (*ScaledImu) Id() uint8 {\n\treturn 26\n}\n\n// Len returns the ScaledImu Message Length\nfunc (*ScaledImu) Len() uint8 {\n\treturn 22\n}\n\n// Crc returns the ScaledImu Message CRC\nfunc (*ScaledImu) Crc() uint8 {\n\treturn 170\n}\n\n// Pack returns a packed byte array which represents a ScaledImu payload\nfunc (m *ScaledImu) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ScaledImu\nfunc (m *ScaledImu) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE RAW_IMU\n//\n// MAVLINK_MSG_ID_RAW_IMU 27\n//\n// MAVLINK_MSG_ID_RAW_IMU_LEN 26\n//\n// MAVLINK_MSG_ID_RAW_IMU_CRC 144\ntype RawImu struct {\n\tTIME_USEC uint64 // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tXACC      int16  // X acceleration (raw)\n\tYACC      int16  // Y acceleration (raw)\n\tZACC      int16  // Z acceleration (raw)\n\tXGYRO     int16  // Angular speed around X axis (raw)\n\tYGYRO     int16  // Angular speed around Y axis (raw)\n\tZGYRO     int16  // Angular speed around Z axis (raw)\n\tXMAG      int16  // X Magnetic field (raw)\n\tYMAG      int16  // Y Magnetic field (raw)\n\tZMAG      int16  // Z Magnetic field (raw)\n}\n\n// NewRawImu returns a new RawImu\nfunc NewRawImu(TIME_USEC uint64, XACC int16, YACC int16, ZACC int16, XGYRO int16, YGYRO int16, ZGYRO int16, XMAG int16, YMAG int16, ZMAG int16) *RawImu {\n\tm := RawImu{}\n\tm.TIME_USEC = TIME_USEC\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\tm.XGYRO = XGYRO\n\tm.YGYRO = YGYRO\n\tm.ZGYRO = ZGYRO\n\tm.XMAG = XMAG\n\tm.YMAG = YMAG\n\tm.ZMAG = ZMAG\n\treturn &m\n}\n\n// Id returns the RawImu Message ID\nfunc (*RawImu) Id() uint8 {\n\treturn 27\n}\n\n// Len returns the RawImu Message Length\nfunc (*RawImu) Len() uint8 {\n\treturn 26\n}\n\n// Crc returns the RawImu Message CRC\nfunc (*RawImu) Crc() uint8 {\n\treturn 144\n}\n\n// Pack returns a packed byte array which represents a RawImu payload\nfunc (m *RawImu) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RawImu\nfunc (m *RawImu) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE RAW_PRESSURE\n//\n// MAVLINK_MSG_ID_RAW_PRESSURE 28\n//\n// MAVLINK_MSG_ID_RAW_PRESSURE_LEN 16\n//\n// MAVLINK_MSG_ID_RAW_PRESSURE_CRC 67\ntype RawPressure struct {\n\tTIME_USEC   uint64 // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tPRESS_ABS   int16  // Absolute pressure (raw)\n\tPRESS_DIFF1 int16  // Differential pressure 1 (raw)\n\tPRESS_DIFF2 int16  // Differential pressure 2 (raw)\n\tTEMPERATURE int16  // Raw Temperature measurement (raw)\n}\n\n// NewRawPressure returns a new RawPressure\nfunc NewRawPressure(TIME_USEC uint64, PRESS_ABS int16, PRESS_DIFF1 int16, PRESS_DIFF2 int16, TEMPERATURE int16) *RawPressure {\n\tm := RawPressure{}\n\tm.TIME_USEC = TIME_USEC\n\tm.PRESS_ABS = PRESS_ABS\n\tm.PRESS_DIFF1 = PRESS_DIFF1\n\tm.PRESS_DIFF2 = PRESS_DIFF2\n\tm.TEMPERATURE = TEMPERATURE\n\treturn &m\n}\n\n// Id returns the RawPressure Message ID\nfunc (*RawPressure) Id() uint8 {\n\treturn 28\n}\n\n// Len returns the RawPressure Message Length\nfunc (*RawPressure) Len() uint8 {\n\treturn 16\n}\n\n// Crc returns the RawPressure Message CRC\nfunc (*RawPressure) Crc() uint8 {\n\treturn 67\n}\n\n// Pack returns a packed byte array which represents a RawPressure payload\nfunc (m *RawPressure) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PRESS_ABS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PRESS_DIFF1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PRESS_DIFF2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RawPressure\nfunc (m *RawPressure) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PRESS_ABS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PRESS_DIFF1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PRESS_DIFF2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SCALED_PRESSURE\n//\n// MAVLINK_MSG_ID_SCALED_PRESSURE 29\n//\n// MAVLINK_MSG_ID_SCALED_PRESSURE_LEN 14\n//\n// MAVLINK_MSG_ID_SCALED_PRESSURE_CRC 115\ntype ScaledPressure struct {\n\tTIME_BOOT_MS uint32  // Timestamp (milliseconds since system boot)\n\tPRESS_ABS    float32 // Absolute pressure (hectopascal)\n\tPRESS_DIFF   float32 // Differential pressure 1 (hectopascal)\n\tTEMPERATURE  int16   // Temperature measurement (0.01 degrees celsius)\n}\n\n// NewScaledPressure returns a new ScaledPressure\nfunc NewScaledPressure(TIME_BOOT_MS uint32, PRESS_ABS float32, PRESS_DIFF float32, TEMPERATURE int16) *ScaledPressure {\n\tm := ScaledPressure{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.PRESS_ABS = PRESS_ABS\n\tm.PRESS_DIFF = PRESS_DIFF\n\tm.TEMPERATURE = TEMPERATURE\n\treturn &m\n}\n\n// Id returns the ScaledPressure Message ID\nfunc (*ScaledPressure) Id() uint8 {\n\treturn 29\n}\n\n// Len returns the ScaledPressure Message Length\nfunc (*ScaledPressure) Len() uint8 {\n\treturn 14\n}\n\n// Crc returns the ScaledPressure Message CRC\nfunc (*ScaledPressure) Crc() uint8 {\n\treturn 115\n}\n\n// Pack returns a packed byte array which represents a ScaledPressure payload\nfunc (m *ScaledPressure) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PRESS_ABS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PRESS_DIFF); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ScaledPressure\nfunc (m *ScaledPressure) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PRESS_ABS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PRESS_DIFF); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE ATTITUDE\n//\n// MAVLINK_MSG_ID_ATTITUDE 30\n//\n// MAVLINK_MSG_ID_ATTITUDE_LEN 28\n//\n// MAVLINK_MSG_ID_ATTITUDE_CRC 39\ntype Attitude struct {\n\tTIME_BOOT_MS uint32  // Timestamp (milliseconds since system boot)\n\tROLL         float32 // Roll angle (rad, -pi..+pi)\n\tPITCH        float32 // Pitch angle (rad, -pi..+pi)\n\tYAW          float32 // Yaw angle (rad, -pi..+pi)\n\tROLLSPEED    float32 // Roll angular speed (rad/s)\n\tPITCHSPEED   float32 // Pitch angular speed (rad/s)\n\tYAWSPEED     float32 // Yaw angular speed (rad/s)\n}\n\n// NewAttitude returns a new Attitude\nfunc NewAttitude(TIME_BOOT_MS uint32, ROLL float32, PITCH float32, YAW float32, ROLLSPEED float32, PITCHSPEED float32, YAWSPEED float32) *Attitude {\n\tm := Attitude{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.ROLLSPEED = ROLLSPEED\n\tm.PITCHSPEED = PITCHSPEED\n\tm.YAWSPEED = YAWSPEED\n\treturn &m\n}\n\n// Id returns the Attitude Message ID\nfunc (*Attitude) Id() uint8 {\n\treturn 30\n}\n\n// Len returns the Attitude Message Length\nfunc (*Attitude) Len() uint8 {\n\treturn 28\n}\n\n// Crc returns the Attitude Message CRC\nfunc (*Attitude) Crc() uint8 {\n\treturn 39\n}\n\n// Pack returns a packed byte array which represents a Attitude payload\nfunc (m *Attitude) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Attitude\nfunc (m *Attitude) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE ATTITUDE_QUATERNION\n//\n// MAVLINK_MSG_ID_ATTITUDE_QUATERNION 31\n//\n// MAVLINK_MSG_ID_ATTITUDE_QUATERNION_LEN 32\n//\n// MAVLINK_MSG_ID_ATTITUDE_QUATERNION_CRC 246\ntype AttitudeQuaternion struct {\n\tTIME_BOOT_MS uint32  // Timestamp (milliseconds since system boot)\n\tQ1           float32 // Quaternion component 1, w (1 in null-rotation)\n\tQ2           float32 // Quaternion component 2, x (0 in null-rotation)\n\tQ3           float32 // Quaternion component 3, y (0 in null-rotation)\n\tQ4           float32 // Quaternion component 4, z (0 in null-rotation)\n\tROLLSPEED    float32 // Roll angular speed (rad/s)\n\tPITCHSPEED   float32 // Pitch angular speed (rad/s)\n\tYAWSPEED     float32 // Yaw angular speed (rad/s)\n}\n\n// NewAttitudeQuaternion returns a new AttitudeQuaternion\nfunc NewAttitudeQuaternion(TIME_BOOT_MS uint32, Q1 float32, Q2 float32, Q3 float32, Q4 float32, ROLLSPEED float32, PITCHSPEED float32, YAWSPEED float32) *AttitudeQuaternion {\n\tm := AttitudeQuaternion{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.Q1 = Q1\n\tm.Q2 = Q2\n\tm.Q3 = Q3\n\tm.Q4 = Q4\n\tm.ROLLSPEED = ROLLSPEED\n\tm.PITCHSPEED = PITCHSPEED\n\tm.YAWSPEED = YAWSPEED\n\treturn &m\n}\n\n// Id returns the AttitudeQuaternion Message ID\nfunc (*AttitudeQuaternion) Id() uint8 {\n\treturn 31\n}\n\n// Len returns the AttitudeQuaternion Message Length\nfunc (*AttitudeQuaternion) Len() uint8 {\n\treturn 32\n}\n\n// Crc returns the AttitudeQuaternion Message CRC\nfunc (*AttitudeQuaternion) Crc() uint8 {\n\treturn 246\n}\n\n// Pack returns a packed byte array which represents a AttitudeQuaternion payload\nfunc (m *AttitudeQuaternion) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the AttitudeQuaternion\nfunc (m *AttitudeQuaternion) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOCAL_POSITION_NED\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_NED 32\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_NED_LEN 28\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_NED_CRC 185\ntype LocalPositionNed struct {\n\tTIME_BOOT_MS uint32  // Timestamp (milliseconds since system boot)\n\tX            float32 // X Position\n\tY            float32 // Y Position\n\tZ            float32 // Z Position\n\tVX           float32 // X Speed\n\tVY           float32 // Y Speed\n\tVZ           float32 // Z Speed\n}\n\n// NewLocalPositionNed returns a new LocalPositionNed\nfunc NewLocalPositionNed(TIME_BOOT_MS uint32, X float32, Y float32, Z float32, VX float32, VY float32, VZ float32) *LocalPositionNed {\n\tm := LocalPositionNed{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.VX = VX\n\tm.VY = VY\n\tm.VZ = VZ\n\treturn &m\n}\n\n// Id returns the LocalPositionNed Message ID\nfunc (*LocalPositionNed) Id() uint8 {\n\treturn 32\n}\n\n// Len returns the LocalPositionNed Message Length\nfunc (*LocalPositionNed) Len() uint8 {\n\treturn 28\n}\n\n// Crc returns the LocalPositionNed Message CRC\nfunc (*LocalPositionNed) Crc() uint8 {\n\treturn 185\n}\n\n// Pack returns a packed byte array which represents a LocalPositionNed payload\nfunc (m *LocalPositionNed) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LocalPositionNed\nfunc (m *LocalPositionNed) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GLOBAL_POSITION_INT\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_INT 33\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_INT_LEN 28\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_INT_CRC 104\ntype GlobalPositionInt struct {\n\tTIME_BOOT_MS uint32 // Timestamp (milliseconds since system boot)\n\tLAT          int32  // Latitude, expressed as * 1E7\n\tLON          int32  // Longitude, expressed as * 1E7\n\tALT          int32  // Altitude in meters, expressed as * 1000 (millimeters), above MSL\n\tRELATIVE_ALT int32  // Altitude above ground in meters, expressed as * 1000 (millimeters)\n\tVX           int16  // Ground X Speed (Latitude), expressed as m/s * 100\n\tVY           int16  // Ground Y Speed (Longitude), expressed as m/s * 100\n\tVZ           int16  // Ground Z Speed (Altitude), expressed as m/s * 100\n\tHDG          uint16 // Compass heading in degrees * 100, 0.0..359.99 degrees. If unknown, set to: UINT16_MAX\n}\n\n// NewGlobalPositionInt returns a new GlobalPositionInt\nfunc NewGlobalPositionInt(TIME_BOOT_MS uint32, LAT int32, LON int32, ALT int32, RELATIVE_ALT int32, VX int16, VY int16, VZ int16, HDG uint16) *GlobalPositionInt {\n\tm := GlobalPositionInt{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.ALT = ALT\n\tm.RELATIVE_ALT = RELATIVE_ALT\n\tm.VX = VX\n\tm.VY = VY\n\tm.VZ = VZ\n\tm.HDG = HDG\n\treturn &m\n}\n\n// Id returns the GlobalPositionInt Message ID\nfunc (*GlobalPositionInt) Id() uint8 {\n\treturn 33\n}\n\n// Len returns the GlobalPositionInt Message Length\nfunc (*GlobalPositionInt) Len() uint8 {\n\treturn 28\n}\n\n// Crc returns the GlobalPositionInt Message CRC\nfunc (*GlobalPositionInt) Crc() uint8 {\n\treturn 104\n}\n\n// Pack returns a packed byte array which represents a GlobalPositionInt payload\nfunc (m *GlobalPositionInt) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RELATIVE_ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.HDG); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GlobalPositionInt\nfunc (m *GlobalPositionInt) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RELATIVE_ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.HDG); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE RC_CHANNELS_SCALED\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_SCALED 34\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_SCALED_LEN 22\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_SCALED_CRC 237\ntype RcChannelsScaled struct {\n\tTIME_BOOT_MS uint32 // Timestamp (milliseconds since system boot)\n\tCHAN1_SCALED int16  // RC channel 1 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tCHAN2_SCALED int16  // RC channel 2 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tCHAN3_SCALED int16  // RC channel 3 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tCHAN4_SCALED int16  // RC channel 4 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tCHAN5_SCALED int16  // RC channel 5 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tCHAN6_SCALED int16  // RC channel 6 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tCHAN7_SCALED int16  // RC channel 7 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tCHAN8_SCALED int16  // RC channel 8 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) INT16_MAX.\n\tPORT         uint8  // Servo output port (set of 8 outputs = 1 port). Most MAVs will just use one, but this allows for more than 8 servos.\n\tRSSI         uint8  // Receive signal strength indicator, 0: 0%, 100: 100%, 255: invalid/unknown.\n}\n\n// NewRcChannelsScaled returns a new RcChannelsScaled\nfunc NewRcChannelsScaled(TIME_BOOT_MS uint32, CHAN1_SCALED int16, CHAN2_SCALED int16, CHAN3_SCALED int16, CHAN4_SCALED int16, CHAN5_SCALED int16, CHAN6_SCALED int16, CHAN7_SCALED int16, CHAN8_SCALED int16, PORT uint8, RSSI uint8) *RcChannelsScaled {\n\tm := RcChannelsScaled{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.CHAN1_SCALED = CHAN1_SCALED\n\tm.CHAN2_SCALED = CHAN2_SCALED\n\tm.CHAN3_SCALED = CHAN3_SCALED\n\tm.CHAN4_SCALED = CHAN4_SCALED\n\tm.CHAN5_SCALED = CHAN5_SCALED\n\tm.CHAN6_SCALED = CHAN6_SCALED\n\tm.CHAN7_SCALED = CHAN7_SCALED\n\tm.CHAN8_SCALED = CHAN8_SCALED\n\tm.PORT = PORT\n\tm.RSSI = RSSI\n\treturn &m\n}\n\n// Id returns the RcChannelsScaled Message ID\nfunc (*RcChannelsScaled) Id() uint8 {\n\treturn 34\n}\n\n// Len returns the RcChannelsScaled Message Length\nfunc (*RcChannelsScaled) Len() uint8 {\n\treturn 22\n}\n\n// Crc returns the RcChannelsScaled Message CRC\nfunc (*RcChannelsScaled) Crc() uint8 {\n\treturn 237\n}\n\n// Pack returns a packed byte array which represents a RcChannelsScaled payload\nfunc (m *RcChannelsScaled) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN1_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN2_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN3_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN4_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN5_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN6_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN7_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN8_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PORT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RcChannelsScaled\nfunc (m *RcChannelsScaled) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN1_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN2_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN3_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN4_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN5_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN6_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN7_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN8_SCALED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PORT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE RC_CHANNELS_RAW\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_RAW 35\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_RAW_LEN 22\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_RAW_CRC 244\ntype RcChannelsRaw struct {\n\tTIME_BOOT_MS uint32 // Timestamp (milliseconds since system boot)\n\tCHAN1_RAW    uint16 // RC channel 1 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN2_RAW    uint16 // RC channel 2 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN3_RAW    uint16 // RC channel 3 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN4_RAW    uint16 // RC channel 4 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN5_RAW    uint16 // RC channel 5 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN6_RAW    uint16 // RC channel 6 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN7_RAW    uint16 // RC channel 7 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN8_RAW    uint16 // RC channel 8 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tPORT         uint8  // Servo output port (set of 8 outputs = 1 port). Most MAVs will just use one, but this allows for more than 8 servos.\n\tRSSI         uint8  // Receive signal strength indicator, 0: 0%, 100: 100%, 255: invalid/unknown.\n}\n\n// NewRcChannelsRaw returns a new RcChannelsRaw\nfunc NewRcChannelsRaw(TIME_BOOT_MS uint32, CHAN1_RAW uint16, CHAN2_RAW uint16, CHAN3_RAW uint16, CHAN4_RAW uint16, CHAN5_RAW uint16, CHAN6_RAW uint16, CHAN7_RAW uint16, CHAN8_RAW uint16, PORT uint8, RSSI uint8) *RcChannelsRaw {\n\tm := RcChannelsRaw{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.CHAN1_RAW = CHAN1_RAW\n\tm.CHAN2_RAW = CHAN2_RAW\n\tm.CHAN3_RAW = CHAN3_RAW\n\tm.CHAN4_RAW = CHAN4_RAW\n\tm.CHAN5_RAW = CHAN5_RAW\n\tm.CHAN6_RAW = CHAN6_RAW\n\tm.CHAN7_RAW = CHAN7_RAW\n\tm.CHAN8_RAW = CHAN8_RAW\n\tm.PORT = PORT\n\tm.RSSI = RSSI\n\treturn &m\n}\n\n// Id returns the RcChannelsRaw Message ID\nfunc (*RcChannelsRaw) Id() uint8 {\n\treturn 35\n}\n\n// Len returns the RcChannelsRaw Message Length\nfunc (*RcChannelsRaw) Len() uint8 {\n\treturn 22\n}\n\n// Crc returns the RcChannelsRaw Message CRC\nfunc (*RcChannelsRaw) Crc() uint8 {\n\treturn 244\n}\n\n// Pack returns a packed byte array which represents a RcChannelsRaw payload\nfunc (m *RcChannelsRaw) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PORT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RcChannelsRaw\nfunc (m *RcChannelsRaw) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PORT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SERVO_OUTPUT_RAW\n//\n// MAVLINK_MSG_ID_SERVO_OUTPUT_RAW 36\n//\n// MAVLINK_MSG_ID_SERVO_OUTPUT_RAW_LEN 21\n//\n// MAVLINK_MSG_ID_SERVO_OUTPUT_RAW_CRC 222\ntype ServoOutputRaw struct {\n\tTIME_USEC  uint32 // Timestamp (microseconds since system boot)\n\tSERVO1_RAW uint16 // Servo output 1 value, in microseconds\n\tSERVO2_RAW uint16 // Servo output 2 value, in microseconds\n\tSERVO3_RAW uint16 // Servo output 3 value, in microseconds\n\tSERVO4_RAW uint16 // Servo output 4 value, in microseconds\n\tSERVO5_RAW uint16 // Servo output 5 value, in microseconds\n\tSERVO6_RAW uint16 // Servo output 6 value, in microseconds\n\tSERVO7_RAW uint16 // Servo output 7 value, in microseconds\n\tSERVO8_RAW uint16 // Servo output 8 value, in microseconds\n\tPORT       uint8  // Servo output port (set of 8 outputs = 1 port). Most MAVs will just use one, but this allows to encode more than 8 servos.\n}\n\n// NewServoOutputRaw returns a new ServoOutputRaw\nfunc NewServoOutputRaw(TIME_USEC uint32, SERVO1_RAW uint16, SERVO2_RAW uint16, SERVO3_RAW uint16, SERVO4_RAW uint16, SERVO5_RAW uint16, SERVO6_RAW uint16, SERVO7_RAW uint16, SERVO8_RAW uint16, PORT uint8) *ServoOutputRaw {\n\tm := ServoOutputRaw{}\n\tm.TIME_USEC = TIME_USEC\n\tm.SERVO1_RAW = SERVO1_RAW\n\tm.SERVO2_RAW = SERVO2_RAW\n\tm.SERVO3_RAW = SERVO3_RAW\n\tm.SERVO4_RAW = SERVO4_RAW\n\tm.SERVO5_RAW = SERVO5_RAW\n\tm.SERVO6_RAW = SERVO6_RAW\n\tm.SERVO7_RAW = SERVO7_RAW\n\tm.SERVO8_RAW = SERVO8_RAW\n\tm.PORT = PORT\n\treturn &m\n}\n\n// Id returns the ServoOutputRaw Message ID\nfunc (*ServoOutputRaw) Id() uint8 {\n\treturn 36\n}\n\n// Len returns the ServoOutputRaw Message Length\nfunc (*ServoOutputRaw) Len() uint8 {\n\treturn 21\n}\n\n// Crc returns the ServoOutputRaw Message CRC\nfunc (*ServoOutputRaw) Crc() uint8 {\n\treturn 222\n}\n\n// Pack returns a packed byte array which represents a ServoOutputRaw payload\nfunc (m *ServoOutputRaw) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SERVO8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PORT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ServoOutputRaw\nfunc (m *ServoOutputRaw) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SERVO8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PORT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_REQUEST_PARTIAL_LIST\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_PARTIAL_LIST 37\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_PARTIAL_LIST_LEN 6\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_PARTIAL_LIST_CRC 212\ntype MissionRequestPartialList struct {\n\tSTART_INDEX      int16 // Start index, 0 by default\n\tEND_INDEX        int16 // End index, -1 by default (-1: send list to end). Else a valid index of the list\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n}\n\n// NewMissionRequestPartialList returns a new MissionRequestPartialList\nfunc NewMissionRequestPartialList(START_INDEX int16, END_INDEX int16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *MissionRequestPartialList {\n\tm := MissionRequestPartialList{}\n\tm.START_INDEX = START_INDEX\n\tm.END_INDEX = END_INDEX\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the MissionRequestPartialList Message ID\nfunc (*MissionRequestPartialList) Id() uint8 {\n\treturn 37\n}\n\n// Len returns the MissionRequestPartialList Message Length\nfunc (*MissionRequestPartialList) Len() uint8 {\n\treturn 6\n}\n\n// Crc returns the MissionRequestPartialList Message CRC\nfunc (*MissionRequestPartialList) Crc() uint8 {\n\treturn 212\n}\n\n// Pack returns a packed byte array which represents a MissionRequestPartialList payload\nfunc (m *MissionRequestPartialList) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.START_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.END_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionRequestPartialList\nfunc (m *MissionRequestPartialList) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.START_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.END_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_WRITE_PARTIAL_LIST\n//\n// MAVLINK_MSG_ID_MISSION_WRITE_PARTIAL_LIST 38\n//\n// MAVLINK_MSG_ID_MISSION_WRITE_PARTIAL_LIST_LEN 6\n//\n// MAVLINK_MSG_ID_MISSION_WRITE_PARTIAL_LIST_CRC 9\ntype MissionWritePartialList struct {\n\tSTART_INDEX      int16 // Start index, 0 by default and smaller / equal to the largest index of the current onboard list.\n\tEND_INDEX        int16 // End index, equal or greater than start index.\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n}\n\n// NewMissionWritePartialList returns a new MissionWritePartialList\nfunc NewMissionWritePartialList(START_INDEX int16, END_INDEX int16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *MissionWritePartialList {\n\tm := MissionWritePartialList{}\n\tm.START_INDEX = START_INDEX\n\tm.END_INDEX = END_INDEX\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the MissionWritePartialList Message ID\nfunc (*MissionWritePartialList) Id() uint8 {\n\treturn 38\n}\n\n// Len returns the MissionWritePartialList Message Length\nfunc (*MissionWritePartialList) Len() uint8 {\n\treturn 6\n}\n\n// Crc returns the MissionWritePartialList Message CRC\nfunc (*MissionWritePartialList) Crc() uint8 {\n\treturn 9\n}\n\n// Pack returns a packed byte array which represents a MissionWritePartialList payload\nfunc (m *MissionWritePartialList) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.START_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.END_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionWritePartialList\nfunc (m *MissionWritePartialList) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.START_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.END_INDEX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_ITEM\n//\n// MAVLINK_MSG_ID_MISSION_ITEM 39\n//\n// MAVLINK_MSG_ID_MISSION_ITEM_LEN 37\n//\n// MAVLINK_MSG_ID_MISSION_ITEM_CRC 254\ntype MissionItem struct {\n\tPARAM1           float32 // PARAM1, see MAV_CMD enum\n\tPARAM2           float32 // PARAM2, see MAV_CMD enum\n\tPARAM3           float32 // PARAM3, see MAV_CMD enum\n\tPARAM4           float32 // PARAM4, see MAV_CMD enum\n\tX                float32 // PARAM5 / local: x position, global: latitude\n\tY                float32 // PARAM6 / y position: global: longitude\n\tZ                float32 // PARAM7 / z position: global: altitude (relative or absolute, depending on frame.\n\tSEQ              uint16  // Sequence\n\tCOMMAND          uint16  // The scheduled action for the MISSION. see MAV_CMD in common.xml MAVLink specs\n\tTARGET_SYSTEM    uint8   // System ID\n\tTARGET_COMPONENT uint8   // Component ID\n\tFRAME            uint8   // The coordinate system of the MISSION. see MAV_FRAME in mavlink_types.h\n\tCURRENT          uint8   // false:0, true:1\n\tAUTOCONTINUE     uint8   // autocontinue to next wp\n}\n\n// NewMissionItem returns a new MissionItem\nfunc NewMissionItem(PARAM1 float32, PARAM2 float32, PARAM3 float32, PARAM4 float32, X float32, Y float32, Z float32, SEQ uint16, COMMAND uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, FRAME uint8, CURRENT uint8, AUTOCONTINUE uint8) *MissionItem {\n\tm := MissionItem{}\n\tm.PARAM1 = PARAM1\n\tm.PARAM2 = PARAM2\n\tm.PARAM3 = PARAM3\n\tm.PARAM4 = PARAM4\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.SEQ = SEQ\n\tm.COMMAND = COMMAND\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.FRAME = FRAME\n\tm.CURRENT = CURRENT\n\tm.AUTOCONTINUE = AUTOCONTINUE\n\treturn &m\n}\n\n// Id returns the MissionItem Message ID\nfunc (*MissionItem) Id() uint8 {\n\treturn 39\n}\n\n// Len returns the MissionItem Message Length\nfunc (*MissionItem) Len() uint8 {\n\treturn 37\n}\n\n// Crc returns the MissionItem Message CRC\nfunc (*MissionItem) Crc() uint8 {\n\treturn 254\n}\n\n// Pack returns a packed byte array which represents a MissionItem payload\nfunc (m *MissionItem) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COMMAND); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CURRENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AUTOCONTINUE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionItem\nfunc (m *MissionItem) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COMMAND); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CURRENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AUTOCONTINUE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_REQUEST\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST 40\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_LEN 4\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_CRC 230\ntype MissionRequest struct {\n\tSEQ              uint16 // Sequence\n\tTARGET_SYSTEM    uint8  // System ID\n\tTARGET_COMPONENT uint8  // Component ID\n}\n\n// NewMissionRequest returns a new MissionRequest\nfunc NewMissionRequest(SEQ uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *MissionRequest {\n\tm := MissionRequest{}\n\tm.SEQ = SEQ\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the MissionRequest Message ID\nfunc (*MissionRequest) Id() uint8 {\n\treturn 40\n}\n\n// Len returns the MissionRequest Message Length\nfunc (*MissionRequest) Len() uint8 {\n\treturn 4\n}\n\n// Crc returns the MissionRequest Message CRC\nfunc (*MissionRequest) Crc() uint8 {\n\treturn 230\n}\n\n// Pack returns a packed byte array which represents a MissionRequest payload\nfunc (m *MissionRequest) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionRequest\nfunc (m *MissionRequest) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_SET_CURRENT\n//\n// MAVLINK_MSG_ID_MISSION_SET_CURRENT 41\n//\n// MAVLINK_MSG_ID_MISSION_SET_CURRENT_LEN 4\n//\n// MAVLINK_MSG_ID_MISSION_SET_CURRENT_CRC 28\ntype MissionSetCurrent struct {\n\tSEQ              uint16 // Sequence\n\tTARGET_SYSTEM    uint8  // System ID\n\tTARGET_COMPONENT uint8  // Component ID\n}\n\n// NewMissionSetCurrent returns a new MissionSetCurrent\nfunc NewMissionSetCurrent(SEQ uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *MissionSetCurrent {\n\tm := MissionSetCurrent{}\n\tm.SEQ = SEQ\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the MissionSetCurrent Message ID\nfunc (*MissionSetCurrent) Id() uint8 {\n\treturn 41\n}\n\n// Len returns the MissionSetCurrent Message Length\nfunc (*MissionSetCurrent) Len() uint8 {\n\treturn 4\n}\n\n// Crc returns the MissionSetCurrent Message CRC\nfunc (*MissionSetCurrent) Crc() uint8 {\n\treturn 28\n}\n\n// Pack returns a packed byte array which represents a MissionSetCurrent payload\nfunc (m *MissionSetCurrent) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionSetCurrent\nfunc (m *MissionSetCurrent) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_CURRENT\n//\n// MAVLINK_MSG_ID_MISSION_CURRENT 42\n//\n// MAVLINK_MSG_ID_MISSION_CURRENT_LEN 2\n//\n// MAVLINK_MSG_ID_MISSION_CURRENT_CRC 28\ntype MissionCurrent struct {\n\tSEQ uint16 // Sequence\n}\n\n// NewMissionCurrent returns a new MissionCurrent\nfunc NewMissionCurrent(SEQ uint16) *MissionCurrent {\n\tm := MissionCurrent{}\n\tm.SEQ = SEQ\n\treturn &m\n}\n\n// Id returns the MissionCurrent Message ID\nfunc (*MissionCurrent) Id() uint8 {\n\treturn 42\n}\n\n// Len returns the MissionCurrent Message Length\nfunc (*MissionCurrent) Len() uint8 {\n\treturn 2\n}\n\n// Crc returns the MissionCurrent Message CRC\nfunc (*MissionCurrent) Crc() uint8 {\n\treturn 28\n}\n\n// Pack returns a packed byte array which represents a MissionCurrent payload\nfunc (m *MissionCurrent) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionCurrent\nfunc (m *MissionCurrent) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_REQUEST_LIST\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_LIST 43\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_LIST_LEN 2\n//\n// MAVLINK_MSG_ID_MISSION_REQUEST_LIST_CRC 132\ntype MissionRequestList struct {\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n}\n\n// NewMissionRequestList returns a new MissionRequestList\nfunc NewMissionRequestList(TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *MissionRequestList {\n\tm := MissionRequestList{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the MissionRequestList Message ID\nfunc (*MissionRequestList) Id() uint8 {\n\treturn 43\n}\n\n// Len returns the MissionRequestList Message Length\nfunc (*MissionRequestList) Len() uint8 {\n\treturn 2\n}\n\n// Crc returns the MissionRequestList Message CRC\nfunc (*MissionRequestList) Crc() uint8 {\n\treturn 132\n}\n\n// Pack returns a packed byte array which represents a MissionRequestList payload\nfunc (m *MissionRequestList) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionRequestList\nfunc (m *MissionRequestList) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_COUNT\n//\n// MAVLINK_MSG_ID_MISSION_COUNT 44\n//\n// MAVLINK_MSG_ID_MISSION_COUNT_LEN 4\n//\n// MAVLINK_MSG_ID_MISSION_COUNT_CRC 221\ntype MissionCount struct {\n\tCOUNT            uint16 // Number of mission items in the sequence\n\tTARGET_SYSTEM    uint8  // System ID\n\tTARGET_COMPONENT uint8  // Component ID\n}\n\n// NewMissionCount returns a new MissionCount\nfunc NewMissionCount(COUNT uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *MissionCount {\n\tm := MissionCount{}\n\tm.COUNT = COUNT\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the MissionCount Message ID\nfunc (*MissionCount) Id() uint8 {\n\treturn 44\n}\n\n// Len returns the MissionCount Message Length\nfunc (*MissionCount) Len() uint8 {\n\treturn 4\n}\n\n// Crc returns the MissionCount Message CRC\nfunc (*MissionCount) Crc() uint8 {\n\treturn 221\n}\n\n// Pack returns a packed byte array which represents a MissionCount payload\nfunc (m *MissionCount) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionCount\nfunc (m *MissionCount) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_CLEAR_ALL\n//\n// MAVLINK_MSG_ID_MISSION_CLEAR_ALL 45\n//\n// MAVLINK_MSG_ID_MISSION_CLEAR_ALL_LEN 2\n//\n// MAVLINK_MSG_ID_MISSION_CLEAR_ALL_CRC 232\ntype MissionClearAll struct {\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n}\n\n// NewMissionClearAll returns a new MissionClearAll\nfunc NewMissionClearAll(TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *MissionClearAll {\n\tm := MissionClearAll{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the MissionClearAll Message ID\nfunc (*MissionClearAll) Id() uint8 {\n\treturn 45\n}\n\n// Len returns the MissionClearAll Message Length\nfunc (*MissionClearAll) Len() uint8 {\n\treturn 2\n}\n\n// Crc returns the MissionClearAll Message CRC\nfunc (*MissionClearAll) Crc() uint8 {\n\treturn 232\n}\n\n// Pack returns a packed byte array which represents a MissionClearAll payload\nfunc (m *MissionClearAll) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionClearAll\nfunc (m *MissionClearAll) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_ITEM_REACHED\n//\n// MAVLINK_MSG_ID_MISSION_ITEM_REACHED 46\n//\n// MAVLINK_MSG_ID_MISSION_ITEM_REACHED_LEN 2\n//\n// MAVLINK_MSG_ID_MISSION_ITEM_REACHED_CRC 11\ntype MissionItemReached struct {\n\tSEQ uint16 // Sequence\n}\n\n// NewMissionItemReached returns a new MissionItemReached\nfunc NewMissionItemReached(SEQ uint16) *MissionItemReached {\n\tm := MissionItemReached{}\n\tm.SEQ = SEQ\n\treturn &m\n}\n\n// Id returns the MissionItemReached Message ID\nfunc (*MissionItemReached) Id() uint8 {\n\treturn 46\n}\n\n// Len returns the MissionItemReached Message Length\nfunc (*MissionItemReached) Len() uint8 {\n\treturn 2\n}\n\n// Crc returns the MissionItemReached Message CRC\nfunc (*MissionItemReached) Crc() uint8 {\n\treturn 11\n}\n\n// Pack returns a packed byte array which represents a MissionItemReached payload\nfunc (m *MissionItemReached) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionItemReached\nfunc (m *MissionItemReached) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEQ); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MISSION_ACK\n//\n// MAVLINK_MSG_ID_MISSION_ACK 47\n//\n// MAVLINK_MSG_ID_MISSION_ACK_LEN 3\n//\n// MAVLINK_MSG_ID_MISSION_ACK_CRC 153\ntype MissionAck struct {\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n\tTYPE             uint8 // See MAV_MISSION_RESULT enum\n}\n\n// NewMissionAck returns a new MissionAck\nfunc NewMissionAck(TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, TYPE uint8) *MissionAck {\n\tm := MissionAck{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.TYPE = TYPE\n\treturn &m\n}\n\n// Id returns the MissionAck Message ID\nfunc (*MissionAck) Id() uint8 {\n\treturn 47\n}\n\n// Len returns the MissionAck Message Length\nfunc (*MissionAck) Len() uint8 {\n\treturn 3\n}\n\n// Crc returns the MissionAck Message CRC\nfunc (*MissionAck) Crc() uint8 {\n\treturn 153\n}\n\n// Pack returns a packed byte array which represents a MissionAck payload\nfunc (m *MissionAck) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MissionAck\nfunc (m *MissionAck) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_GPS_GLOBAL_ORIGIN\n//\n// MAVLINK_MSG_ID_SET_GPS_GLOBAL_ORIGIN 48\n//\n// MAVLINK_MSG_ID_SET_GPS_GLOBAL_ORIGIN_LEN 13\n//\n// MAVLINK_MSG_ID_SET_GPS_GLOBAL_ORIGIN_CRC 41\ntype SetGpsGlobalOrigin struct {\n\tLATITUDE      int32 // Latitude (WGS84), in degrees * 1E7\n\tLONGITUDE     int32 // Longitude (WGS84, in degrees * 1E7\n\tALTITUDE      int32 // Altitude (WGS84), in meters * 1000 (positive for up)\n\tTARGET_SYSTEM uint8 // System ID\n}\n\n// NewSetGpsGlobalOrigin returns a new SetGpsGlobalOrigin\nfunc NewSetGpsGlobalOrigin(LATITUDE int32, LONGITUDE int32, ALTITUDE int32, TARGET_SYSTEM uint8) *SetGpsGlobalOrigin {\n\tm := SetGpsGlobalOrigin{}\n\tm.LATITUDE = LATITUDE\n\tm.LONGITUDE = LONGITUDE\n\tm.ALTITUDE = ALTITUDE\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\treturn &m\n}\n\n// Id returns the SetGpsGlobalOrigin Message ID\nfunc (*SetGpsGlobalOrigin) Id() uint8 {\n\treturn 48\n}\n\n// Len returns the SetGpsGlobalOrigin Message Length\nfunc (*SetGpsGlobalOrigin) Len() uint8 {\n\treturn 13\n}\n\n// Crc returns the SetGpsGlobalOrigin Message CRC\nfunc (*SetGpsGlobalOrigin) Crc() uint8 {\n\treturn 41\n}\n\n// Pack returns a packed byte array which represents a SetGpsGlobalOrigin payload\nfunc (m *SetGpsGlobalOrigin) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetGpsGlobalOrigin\nfunc (m *SetGpsGlobalOrigin) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GPS_GLOBAL_ORIGIN\n//\n// MAVLINK_MSG_ID_GPS_GLOBAL_ORIGIN 49\n//\n// MAVLINK_MSG_ID_GPS_GLOBAL_ORIGIN_LEN 12\n//\n// MAVLINK_MSG_ID_GPS_GLOBAL_ORIGIN_CRC 39\ntype GpsGlobalOrigin struct {\n\tLATITUDE  int32 // Latitude (WGS84), in degrees * 1E7\n\tLONGITUDE int32 // Longitude (WGS84), in degrees * 1E7\n\tALTITUDE  int32 // Altitude (WGS84), in meters * 1000 (positive for up)\n}\n\n// NewGpsGlobalOrigin returns a new GpsGlobalOrigin\nfunc NewGpsGlobalOrigin(LATITUDE int32, LONGITUDE int32, ALTITUDE int32) *GpsGlobalOrigin {\n\tm := GpsGlobalOrigin{}\n\tm.LATITUDE = LATITUDE\n\tm.LONGITUDE = LONGITUDE\n\tm.ALTITUDE = ALTITUDE\n\treturn &m\n}\n\n// Id returns the GpsGlobalOrigin Message ID\nfunc (*GpsGlobalOrigin) Id() uint8 {\n\treturn 49\n}\n\n// Len returns the GpsGlobalOrigin Message Length\nfunc (*GpsGlobalOrigin) Len() uint8 {\n\treturn 12\n}\n\n// Crc returns the GpsGlobalOrigin Message CRC\nfunc (*GpsGlobalOrigin) Crc() uint8 {\n\treturn 39\n}\n\n// Pack returns a packed byte array which represents a GpsGlobalOrigin payload\nfunc (m *GpsGlobalOrigin) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GpsGlobalOrigin\nfunc (m *GpsGlobalOrigin) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_LOCAL_POSITION_SETPOINT\n//\n// MAVLINK_MSG_ID_SET_LOCAL_POSITION_SETPOINT 50\n//\n// MAVLINK_MSG_ID_SET_LOCAL_POSITION_SETPOINT_LEN 19\n//\n// MAVLINK_MSG_ID_SET_LOCAL_POSITION_SETPOINT_CRC 214\ntype SetLocalPositionSetpoint struct {\n\tX                float32 // x position\n\tY                float32 // y position\n\tZ                float32 // z position\n\tYAW              float32 // Desired yaw angle\n\tTARGET_SYSTEM    uint8   // System ID\n\tTARGET_COMPONENT uint8   // Component ID\n\tCOORDINATE_FRAME uint8   // Coordinate frame - valid values are only MAV_FRAME_LOCAL_NED or MAV_FRAME_LOCAL_ENU\n}\n\n// NewSetLocalPositionSetpoint returns a new SetLocalPositionSetpoint\nfunc NewSetLocalPositionSetpoint(X float32, Y float32, Z float32, YAW float32, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, COORDINATE_FRAME uint8) *SetLocalPositionSetpoint {\n\tm := SetLocalPositionSetpoint{}\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.YAW = YAW\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.COORDINATE_FRAME = COORDINATE_FRAME\n\treturn &m\n}\n\n// Id returns the SetLocalPositionSetpoint Message ID\nfunc (*SetLocalPositionSetpoint) Id() uint8 {\n\treturn 50\n}\n\n// Len returns the SetLocalPositionSetpoint Message Length\nfunc (*SetLocalPositionSetpoint) Len() uint8 {\n\treturn 19\n}\n\n// Crc returns the SetLocalPositionSetpoint Message CRC\nfunc (*SetLocalPositionSetpoint) Crc() uint8 {\n\treturn 214\n}\n\n// Pack returns a packed byte array which represents a SetLocalPositionSetpoint payload\nfunc (m *SetLocalPositionSetpoint) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetLocalPositionSetpoint\nfunc (m *SetLocalPositionSetpoint) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOCAL_POSITION_SETPOINT\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_SETPOINT 51\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_SETPOINT_LEN 17\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_SETPOINT_CRC 223\ntype LocalPositionSetpoint struct {\n\tX                float32 // x position\n\tY                float32 // y position\n\tZ                float32 // z position\n\tYAW              float32 // Desired yaw angle\n\tCOORDINATE_FRAME uint8   // Coordinate frame - valid values are only MAV_FRAME_LOCAL_NED or MAV_FRAME_LOCAL_ENU\n}\n\n// NewLocalPositionSetpoint returns a new LocalPositionSetpoint\nfunc NewLocalPositionSetpoint(X float32, Y float32, Z float32, YAW float32, COORDINATE_FRAME uint8) *LocalPositionSetpoint {\n\tm := LocalPositionSetpoint{}\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.YAW = YAW\n\tm.COORDINATE_FRAME = COORDINATE_FRAME\n\treturn &m\n}\n\n// Id returns the LocalPositionSetpoint Message ID\nfunc (*LocalPositionSetpoint) Id() uint8 {\n\treturn 51\n}\n\n// Len returns the LocalPositionSetpoint Message Length\nfunc (*LocalPositionSetpoint) Len() uint8 {\n\treturn 17\n}\n\n// Crc returns the LocalPositionSetpoint Message CRC\nfunc (*LocalPositionSetpoint) Crc() uint8 {\n\treturn 223\n}\n\n// Pack returns a packed byte array which represents a LocalPositionSetpoint payload\nfunc (m *LocalPositionSetpoint) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LocalPositionSetpoint\nfunc (m *LocalPositionSetpoint) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GLOBAL_POSITION_SETPOINT_INT\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_SETPOINT_INT 52\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_SETPOINT_INT_LEN 15\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_SETPOINT_INT_CRC 141\ntype GlobalPositionSetpointInt struct {\n\tLATITUDE         int32 // Latitude (WGS84), in degrees * 1E7\n\tLONGITUDE        int32 // Longitude (WGS84), in degrees * 1E7\n\tALTITUDE         int32 // Altitude (WGS84), in meters * 1000 (positive for up)\n\tYAW              int16 // Desired yaw angle in degrees * 100\n\tCOORDINATE_FRAME uint8 // Coordinate frame - valid values are only MAV_FRAME_GLOBAL or MAV_FRAME_GLOBAL_RELATIVE_ALT\n}\n\n// NewGlobalPositionSetpointInt returns a new GlobalPositionSetpointInt\nfunc NewGlobalPositionSetpointInt(LATITUDE int32, LONGITUDE int32, ALTITUDE int32, YAW int16, COORDINATE_FRAME uint8) *GlobalPositionSetpointInt {\n\tm := GlobalPositionSetpointInt{}\n\tm.LATITUDE = LATITUDE\n\tm.LONGITUDE = LONGITUDE\n\tm.ALTITUDE = ALTITUDE\n\tm.YAW = YAW\n\tm.COORDINATE_FRAME = COORDINATE_FRAME\n\treturn &m\n}\n\n// Id returns the GlobalPositionSetpointInt Message ID\nfunc (*GlobalPositionSetpointInt) Id() uint8 {\n\treturn 52\n}\n\n// Len returns the GlobalPositionSetpointInt Message Length\nfunc (*GlobalPositionSetpointInt) Len() uint8 {\n\treturn 15\n}\n\n// Crc returns the GlobalPositionSetpointInt Message CRC\nfunc (*GlobalPositionSetpointInt) Crc() uint8 {\n\treturn 141\n}\n\n// Pack returns a packed byte array which represents a GlobalPositionSetpointInt payload\nfunc (m *GlobalPositionSetpointInt) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GlobalPositionSetpointInt\nfunc (m *GlobalPositionSetpointInt) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_GLOBAL_POSITION_SETPOINT_INT\n//\n// MAVLINK_MSG_ID_SET_GLOBAL_POSITION_SETPOINT_INT 53\n//\n// MAVLINK_MSG_ID_SET_GLOBAL_POSITION_SETPOINT_INT_LEN 15\n//\n// MAVLINK_MSG_ID_SET_GLOBAL_POSITION_SETPOINT_INT_CRC 33\ntype SetGlobalPositionSetpointInt struct {\n\tLATITUDE         int32 // Latitude (WGS84), in degrees * 1E7\n\tLONGITUDE        int32 // Longitude (WGS84), in degrees * 1E7\n\tALTITUDE         int32 // Altitude (WGS84), in meters * 1000 (positive for up)\n\tYAW              int16 // Desired yaw angle in degrees * 100\n\tCOORDINATE_FRAME uint8 // Coordinate frame - valid values are only MAV_FRAME_GLOBAL or MAV_FRAME_GLOBAL_RELATIVE_ALT\n}\n\n// NewSetGlobalPositionSetpointInt returns a new SetGlobalPositionSetpointInt\nfunc NewSetGlobalPositionSetpointInt(LATITUDE int32, LONGITUDE int32, ALTITUDE int32, YAW int16, COORDINATE_FRAME uint8) *SetGlobalPositionSetpointInt {\n\tm := SetGlobalPositionSetpointInt{}\n\tm.LATITUDE = LATITUDE\n\tm.LONGITUDE = LONGITUDE\n\tm.ALTITUDE = ALTITUDE\n\tm.YAW = YAW\n\tm.COORDINATE_FRAME = COORDINATE_FRAME\n\treturn &m\n}\n\n// Id returns the SetGlobalPositionSetpointInt Message ID\nfunc (*SetGlobalPositionSetpointInt) Id() uint8 {\n\treturn 53\n}\n\n// Len returns the SetGlobalPositionSetpointInt Message Length\nfunc (*SetGlobalPositionSetpointInt) Len() uint8 {\n\treturn 15\n}\n\n// Crc returns the SetGlobalPositionSetpointInt Message CRC\nfunc (*SetGlobalPositionSetpointInt) Crc() uint8 {\n\treturn 33\n}\n\n// Pack returns a packed byte array which represents a SetGlobalPositionSetpointInt payload\nfunc (m *SetGlobalPositionSetpointInt) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetGlobalPositionSetpointInt\nfunc (m *SetGlobalPositionSetpointInt) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.LATITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LONGITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALTITUDE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SAFETY_SET_ALLOWED_AREA\n//\n// MAVLINK_MSG_ID_SAFETY_SET_ALLOWED_AREA 54\n//\n// MAVLINK_MSG_ID_SAFETY_SET_ALLOWED_AREA_LEN 27\n//\n// MAVLINK_MSG_ID_SAFETY_SET_ALLOWED_AREA_CRC 15\ntype SafetySetAllowedArea struct {\n\tP1X              float32 // x position 1 / Latitude 1\n\tP1Y              float32 // y position 1 / Longitude 1\n\tP1Z              float32 // z position 1 / Altitude 1\n\tP2X              float32 // x position 2 / Latitude 2\n\tP2Y              float32 // y position 2 / Longitude 2\n\tP2Z              float32 // z position 2 / Altitude 2\n\tTARGET_SYSTEM    uint8   // System ID\n\tTARGET_COMPONENT uint8   // Component ID\n\tFRAME            uint8   // Coordinate frame, as defined by MAV_FRAME enum in mavlink_types.h. Can be either global, GPS, right-handed with Z axis up or local, right handed, Z axis down.\n}\n\n// NewSafetySetAllowedArea returns a new SafetySetAllowedArea\nfunc NewSafetySetAllowedArea(P1X float32, P1Y float32, P1Z float32, P2X float32, P2Y float32, P2Z float32, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, FRAME uint8) *SafetySetAllowedArea {\n\tm := SafetySetAllowedArea{}\n\tm.P1X = P1X\n\tm.P1Y = P1Y\n\tm.P1Z = P1Z\n\tm.P2X = P2X\n\tm.P2Y = P2Y\n\tm.P2Z = P2Z\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.FRAME = FRAME\n\treturn &m\n}\n\n// Id returns the SafetySetAllowedArea Message ID\nfunc (*SafetySetAllowedArea) Id() uint8 {\n\treturn 54\n}\n\n// Len returns the SafetySetAllowedArea Message Length\nfunc (*SafetySetAllowedArea) Len() uint8 {\n\treturn 27\n}\n\n// Crc returns the SafetySetAllowedArea Message CRC\nfunc (*SafetySetAllowedArea) Crc() uint8 {\n\treturn 15\n}\n\n// Pack returns a packed byte array which represents a SafetySetAllowedArea payload\nfunc (m *SafetySetAllowedArea) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.P1X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P1Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P1Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P2X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P2Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P2Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SafetySetAllowedArea\nfunc (m *SafetySetAllowedArea) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.P1X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P1Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P1Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P2X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P2Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P2Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FRAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SAFETY_ALLOWED_AREA\n//\n// MAVLINK_MSG_ID_SAFETY_ALLOWED_AREA 55\n//\n// MAVLINK_MSG_ID_SAFETY_ALLOWED_AREA_LEN 25\n//\n// MAVLINK_MSG_ID_SAFETY_ALLOWED_AREA_CRC 3\ntype SafetyAllowedArea struct {\n\tP1X   float32 // x position 1 / Latitude 1\n\tP1Y   float32 // y position 1 / Longitude 1\n\tP1Z   float32 // z position 1 / Altitude 1\n\tP2X   float32 // x position 2 / Latitude 2\n\tP2Y   float32 // y position 2 / Longitude 2\n\tP2Z   float32 // z position 2 / Altitude 2\n\tFRAME uint8   // Coordinate frame, as defined by MAV_FRAME enum in mavlink_types.h. Can be either global, GPS, right-handed with Z axis up or local, right handed, Z axis down.\n}\n\n// NewSafetyAllowedArea returns a new SafetyAllowedArea\nfunc NewSafetyAllowedArea(P1X float32, P1Y float32, P1Z float32, P2X float32, P2Y float32, P2Z float32, FRAME uint8) *SafetyAllowedArea {\n\tm := SafetyAllowedArea{}\n\tm.P1X = P1X\n\tm.P1Y = P1Y\n\tm.P1Z = P1Z\n\tm.P2X = P2X\n\tm.P2Y = P2Y\n\tm.P2Z = P2Z\n\tm.FRAME = FRAME\n\treturn &m\n}\n\n// Id returns the SafetyAllowedArea Message ID\nfunc (*SafetyAllowedArea) Id() uint8 {\n\treturn 55\n}\n\n// Len returns the SafetyAllowedArea Message Length\nfunc (*SafetyAllowedArea) Len() uint8 {\n\treturn 25\n}\n\n// Crc returns the SafetyAllowedArea Message CRC\nfunc (*SafetyAllowedArea) Crc() uint8 {\n\treturn 3\n}\n\n// Pack returns a packed byte array which represents a SafetyAllowedArea payload\nfunc (m *SafetyAllowedArea) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.P1X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P1Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P1Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P2X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P2Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.P2Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SafetyAllowedArea\nfunc (m *SafetyAllowedArea) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.P1X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P1Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P1Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P2X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P2Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.P2Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FRAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_ROLL_PITCH_YAW_THRUST\n//\n// MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_THRUST 56\n//\n// MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_THRUST_LEN 18\n//\n// MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_THRUST_CRC 100\ntype SetRollPitchYawThrust struct {\n\tROLL             float32 // Desired roll angle in radians\n\tPITCH            float32 // Desired pitch angle in radians\n\tYAW              float32 // Desired yaw angle in radians\n\tTHRUST           float32 // Collective thrust, normalized to 0 .. 1\n\tTARGET_SYSTEM    uint8   // System ID\n\tTARGET_COMPONENT uint8   // Component ID\n}\n\n// NewSetRollPitchYawThrust returns a new SetRollPitchYawThrust\nfunc NewSetRollPitchYawThrust(ROLL float32, PITCH float32, YAW float32, THRUST float32, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *SetRollPitchYawThrust {\n\tm := SetRollPitchYawThrust{}\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.THRUST = THRUST\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the SetRollPitchYawThrust Message ID\nfunc (*SetRollPitchYawThrust) Id() uint8 {\n\treturn 56\n}\n\n// Len returns the SetRollPitchYawThrust Message Length\nfunc (*SetRollPitchYawThrust) Len() uint8 {\n\treturn 18\n}\n\n// Crc returns the SetRollPitchYawThrust Message CRC\nfunc (*SetRollPitchYawThrust) Crc() uint8 {\n\treturn 100\n}\n\n// Pack returns a packed byte array which represents a SetRollPitchYawThrust payload\nfunc (m *SetRollPitchYawThrust) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetRollPitchYawThrust\nfunc (m *SetRollPitchYawThrust) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_ROLL_PITCH_YAW_SPEED_THRUST\n//\n// MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_SPEED_THRUST 57\n//\n// MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_SPEED_THRUST_LEN 18\n//\n// MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_SPEED_THRUST_CRC 24\ntype SetRollPitchYawSpeedThrust struct {\n\tROLL_SPEED       float32 // Desired roll angular speed in rad/s\n\tPITCH_SPEED      float32 // Desired pitch angular speed in rad/s\n\tYAW_SPEED        float32 // Desired yaw angular speed in rad/s\n\tTHRUST           float32 // Collective thrust, normalized to 0 .. 1\n\tTARGET_SYSTEM    uint8   // System ID\n\tTARGET_COMPONENT uint8   // Component ID\n}\n\n// NewSetRollPitchYawSpeedThrust returns a new SetRollPitchYawSpeedThrust\nfunc NewSetRollPitchYawSpeedThrust(ROLL_SPEED float32, PITCH_SPEED float32, YAW_SPEED float32, THRUST float32, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *SetRollPitchYawSpeedThrust {\n\tm := SetRollPitchYawSpeedThrust{}\n\tm.ROLL_SPEED = ROLL_SPEED\n\tm.PITCH_SPEED = PITCH_SPEED\n\tm.YAW_SPEED = YAW_SPEED\n\tm.THRUST = THRUST\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the SetRollPitchYawSpeedThrust Message ID\nfunc (*SetRollPitchYawSpeedThrust) Id() uint8 {\n\treturn 57\n}\n\n// Len returns the SetRollPitchYawSpeedThrust Message Length\nfunc (*SetRollPitchYawSpeedThrust) Len() uint8 {\n\treturn 18\n}\n\n// Crc returns the SetRollPitchYawSpeedThrust Message CRC\nfunc (*SetRollPitchYawSpeedThrust) Crc() uint8 {\n\treturn 24\n}\n\n// Pack returns a packed byte array which represents a SetRollPitchYawSpeedThrust payload\nfunc (m *SetRollPitchYawSpeedThrust) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetRollPitchYawSpeedThrust\nfunc (m *SetRollPitchYawSpeedThrust) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE ROLL_PITCH_YAW_THRUST_SETPOINT\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_THRUST_SETPOINT 58\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_THRUST_SETPOINT_LEN 20\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_THRUST_SETPOINT_CRC 239\ntype RollPitchYawThrustSetpoint struct {\n\tTIME_BOOT_MS uint32  // Timestamp in milliseconds since system boot\n\tROLL         float32 // Desired roll angle in radians\n\tPITCH        float32 // Desired pitch angle in radians\n\tYAW          float32 // Desired yaw angle in radians\n\tTHRUST       float32 // Collective thrust, normalized to 0 .. 1\n}\n\n// NewRollPitchYawThrustSetpoint returns a new RollPitchYawThrustSetpoint\nfunc NewRollPitchYawThrustSetpoint(TIME_BOOT_MS uint32, ROLL float32, PITCH float32, YAW float32, THRUST float32) *RollPitchYawThrustSetpoint {\n\tm := RollPitchYawThrustSetpoint{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.THRUST = THRUST\n\treturn &m\n}\n\n// Id returns the RollPitchYawThrustSetpoint Message ID\nfunc (*RollPitchYawThrustSetpoint) Id() uint8 {\n\treturn 58\n}\n\n// Len returns the RollPitchYawThrustSetpoint Message Length\nfunc (*RollPitchYawThrustSetpoint) Len() uint8 {\n\treturn 20\n}\n\n// Crc returns the RollPitchYawThrustSetpoint Message CRC\nfunc (*RollPitchYawThrustSetpoint) Crc() uint8 {\n\treturn 239\n}\n\n// Pack returns a packed byte array which represents a RollPitchYawThrustSetpoint payload\nfunc (m *RollPitchYawThrustSetpoint) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RollPitchYawThrustSetpoint\nfunc (m *RollPitchYawThrustSetpoint) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT 59\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT_LEN 20\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT_CRC 238\ntype RollPitchYawSpeedThrustSetpoint struct {\n\tTIME_BOOT_MS uint32  // Timestamp in milliseconds since system boot\n\tROLL_SPEED   float32 // Desired roll angular speed in rad/s\n\tPITCH_SPEED  float32 // Desired pitch angular speed in rad/s\n\tYAW_SPEED    float32 // Desired yaw angular speed in rad/s\n\tTHRUST       float32 // Collective thrust, normalized to 0 .. 1\n}\n\n// NewRollPitchYawSpeedThrustSetpoint returns a new RollPitchYawSpeedThrustSetpoint\nfunc NewRollPitchYawSpeedThrustSetpoint(TIME_BOOT_MS uint32, ROLL_SPEED float32, PITCH_SPEED float32, YAW_SPEED float32, THRUST float32) *RollPitchYawSpeedThrustSetpoint {\n\tm := RollPitchYawSpeedThrustSetpoint{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.ROLL_SPEED = ROLL_SPEED\n\tm.PITCH_SPEED = PITCH_SPEED\n\tm.YAW_SPEED = YAW_SPEED\n\tm.THRUST = THRUST\n\treturn &m\n}\n\n// Id returns the RollPitchYawSpeedThrustSetpoint Message ID\nfunc (*RollPitchYawSpeedThrustSetpoint) Id() uint8 {\n\treturn 59\n}\n\n// Len returns the RollPitchYawSpeedThrustSetpoint Message Length\nfunc (*RollPitchYawSpeedThrustSetpoint) Len() uint8 {\n\treturn 20\n}\n\n// Crc returns the RollPitchYawSpeedThrustSetpoint Message CRC\nfunc (*RollPitchYawSpeedThrustSetpoint) Crc() uint8 {\n\treturn 238\n}\n\n// Pack returns a packed byte array which represents a RollPitchYawSpeedThrustSetpoint payload\nfunc (m *RollPitchYawSpeedThrustSetpoint) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RollPitchYawSpeedThrustSetpoint\nfunc (m *RollPitchYawSpeedThrustSetpoint) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW_SPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_QUAD_MOTORS_SETPOINT\n//\n// MAVLINK_MSG_ID_SET_QUAD_MOTORS_SETPOINT 60\n//\n// MAVLINK_MSG_ID_SET_QUAD_MOTORS_SETPOINT_LEN 9\n//\n// MAVLINK_MSG_ID_SET_QUAD_MOTORS_SETPOINT_CRC 30\ntype SetQuadMotorsSetpoint struct {\n\tMOTOR_FRONT_NW uint16 // Front motor in + configuration, front left motor in x configuration\n\tMOTOR_RIGHT_NE uint16 // Right motor in + configuration, front right motor in x configuration\n\tMOTOR_BACK_SE  uint16 // Back motor in + configuration, back right motor in x configuration\n\tMOTOR_LEFT_SW  uint16 // Left motor in + configuration, back left motor in x configuration\n\tTARGET_SYSTEM  uint8  // System ID of the system that should set these motor commands\n}\n\n// NewSetQuadMotorsSetpoint returns a new SetQuadMotorsSetpoint\nfunc NewSetQuadMotorsSetpoint(MOTOR_FRONT_NW uint16, MOTOR_RIGHT_NE uint16, MOTOR_BACK_SE uint16, MOTOR_LEFT_SW uint16, TARGET_SYSTEM uint8) *SetQuadMotorsSetpoint {\n\tm := SetQuadMotorsSetpoint{}\n\tm.MOTOR_FRONT_NW = MOTOR_FRONT_NW\n\tm.MOTOR_RIGHT_NE = MOTOR_RIGHT_NE\n\tm.MOTOR_BACK_SE = MOTOR_BACK_SE\n\tm.MOTOR_LEFT_SW = MOTOR_LEFT_SW\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\treturn &m\n}\n\n// Id returns the SetQuadMotorsSetpoint Message ID\nfunc (*SetQuadMotorsSetpoint) Id() uint8 {\n\treturn 60\n}\n\n// Len returns the SetQuadMotorsSetpoint Message Length\nfunc (*SetQuadMotorsSetpoint) Len() uint8 {\n\treturn 9\n}\n\n// Crc returns the SetQuadMotorsSetpoint Message CRC\nfunc (*SetQuadMotorsSetpoint) Crc() uint8 {\n\treturn 30\n}\n\n// Pack returns a packed byte array which represents a SetQuadMotorsSetpoint payload\nfunc (m *SetQuadMotorsSetpoint) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.MOTOR_FRONT_NW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MOTOR_RIGHT_NE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MOTOR_BACK_SE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MOTOR_LEFT_SW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetQuadMotorsSetpoint\nfunc (m *SetQuadMotorsSetpoint) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.MOTOR_FRONT_NW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MOTOR_RIGHT_NE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MOTOR_BACK_SE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MOTOR_LEFT_SW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST\n//\n// MAVLINK_MSG_ID_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST 61\n//\n// MAVLINK_MSG_ID_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST_LEN 34\n//\n// MAVLINK_MSG_ID_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST_CRC 240\ntype SetQuadSwarmRollPitchYawThrust struct {\n\tROLL   [4]int16  // Desired roll angle in radians +-PI (+-INT16_MAX)\n\tPITCH  [4]int16  // Desired pitch angle in radians +-PI (+-INT16_MAX)\n\tYAW    [4]int16  // Desired yaw angle in radians, scaled to int16 +-PI (+-INT16_MAX)\n\tTHRUST [4]uint16 // Collective thrust, scaled to uint16 (0..UINT16_MAX)\n\tGROUP  uint8     // ID of the quadrotor group (0 - 255, up to 256 groups supported)\n\tMODE   uint8     // ID of the flight mode (0 - 255, up to 256 modes supported)\n}\n\n// NewSetQuadSwarmRollPitchYawThrust returns a new SetQuadSwarmRollPitchYawThrust\nfunc NewSetQuadSwarmRollPitchYawThrust(ROLL [4]int16, PITCH [4]int16, YAW [4]int16, THRUST [4]uint16, GROUP uint8, MODE uint8) *SetQuadSwarmRollPitchYawThrust {\n\tm := SetQuadSwarmRollPitchYawThrust{}\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.THRUST = THRUST\n\tm.GROUP = GROUP\n\tm.MODE = MODE\n\treturn &m\n}\n\n// Id returns the SetQuadSwarmRollPitchYawThrust Message ID\nfunc (*SetQuadSwarmRollPitchYawThrust) Id() uint8 {\n\treturn 61\n}\n\n// Len returns the SetQuadSwarmRollPitchYawThrust Message Length\nfunc (*SetQuadSwarmRollPitchYawThrust) Len() uint8 {\n\treturn 34\n}\n\n// Crc returns the SetQuadSwarmRollPitchYawThrust Message CRC\nfunc (*SetQuadSwarmRollPitchYawThrust) Crc() uint8 {\n\treturn 240\n}\n\n// Pack returns a packed byte array which represents a SetQuadSwarmRollPitchYawThrust payload\nfunc (m *SetQuadSwarmRollPitchYawThrust) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GROUP); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MODE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetQuadSwarmRollPitchYawThrust\nfunc (m *SetQuadSwarmRollPitchYawThrust) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GROUP); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MODE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST_FIELD_roll_LEN   = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST_FIELD_pitch_LEN  = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST_FIELD_yaw_LEN    = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST_FIELD_thrust_LEN = 4\n)\n\n// MESSAGE NAV_CONTROLLER_OUTPUT\n//\n// MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT 62\n//\n// MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT_LEN 26\n//\n// MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT_CRC 183\ntype NavControllerOutput struct {\n\tNAV_ROLL       float32 // Current desired roll in degrees\n\tNAV_PITCH      float32 // Current desired pitch in degrees\n\tALT_ERROR      float32 // Current altitude error in meters\n\tASPD_ERROR     float32 // Current airspeed error in meters/second\n\tXTRACK_ERROR   float32 // Current crosstrack error on x-y plane in meters\n\tNAV_BEARING    int16   // Current desired heading in degrees\n\tTARGET_BEARING int16   // Bearing to current MISSION/target in degrees\n\tWP_DIST        uint16  // Distance to active MISSION in meters\n}\n\n// NewNavControllerOutput returns a new NavControllerOutput\nfunc NewNavControllerOutput(NAV_ROLL float32, NAV_PITCH float32, ALT_ERROR float32, ASPD_ERROR float32, XTRACK_ERROR float32, NAV_BEARING int16, TARGET_BEARING int16, WP_DIST uint16) *NavControllerOutput {\n\tm := NavControllerOutput{}\n\tm.NAV_ROLL = NAV_ROLL\n\tm.NAV_PITCH = NAV_PITCH\n\tm.ALT_ERROR = ALT_ERROR\n\tm.ASPD_ERROR = ASPD_ERROR\n\tm.XTRACK_ERROR = XTRACK_ERROR\n\tm.NAV_BEARING = NAV_BEARING\n\tm.TARGET_BEARING = TARGET_BEARING\n\tm.WP_DIST = WP_DIST\n\treturn &m\n}\n\n// Id returns the NavControllerOutput Message ID\nfunc (*NavControllerOutput) Id() uint8 {\n\treturn 62\n}\n\n// Len returns the NavControllerOutput Message Length\nfunc (*NavControllerOutput) Len() uint8 {\n\treturn 26\n}\n\n// Crc returns the NavControllerOutput Message CRC\nfunc (*NavControllerOutput) Crc() uint8 {\n\treturn 183\n}\n\n// Pack returns a packed byte array which represents a NavControllerOutput payload\nfunc (m *NavControllerOutput) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.NAV_ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NAV_PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT_ERROR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ASPD_ERROR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XTRACK_ERROR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NAV_BEARING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_BEARING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.WP_DIST); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the NavControllerOutput\nfunc (m *NavControllerOutput) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.NAV_ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NAV_PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT_ERROR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ASPD_ERROR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XTRACK_ERROR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NAV_BEARING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_BEARING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.WP_DIST); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST\n//\n// MAVLINK_MSG_ID_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST 63\n//\n// MAVLINK_MSG_ID_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_LEN 46\n//\n// MAVLINK_MSG_ID_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_CRC 130\ntype SetQuadSwarmLedRollPitchYawThrust struct {\n\tROLL      [4]int16  // Desired roll angle in radians +-PI (+-INT16_MAX)\n\tPITCH     [4]int16  // Desired pitch angle in radians +-PI (+-INT16_MAX)\n\tYAW       [4]int16  // Desired yaw angle in radians, scaled to int16 +-PI (+-INT16_MAX)\n\tTHRUST    [4]uint16 // Collective thrust, scaled to uint16 (0..UINT16_MAX)\n\tGROUP     uint8     // ID of the quadrotor group (0 - 255, up to 256 groups supported)\n\tMODE      uint8     // ID of the flight mode (0 - 255, up to 256 modes supported)\n\tLED_RED   [4]uint8  // RGB red channel (0-255)\n\tLED_BLUE  [4]uint8  // RGB green channel (0-255)\n\tLED_GREEN [4]uint8  // RGB blue channel (0-255)\n}\n\n// NewSetQuadSwarmLedRollPitchYawThrust returns a new SetQuadSwarmLedRollPitchYawThrust\nfunc NewSetQuadSwarmLedRollPitchYawThrust(ROLL [4]int16, PITCH [4]int16, YAW [4]int16, THRUST [4]uint16, GROUP uint8, MODE uint8, LED_RED [4]uint8, LED_BLUE [4]uint8, LED_GREEN [4]uint8) *SetQuadSwarmLedRollPitchYawThrust {\n\tm := SetQuadSwarmLedRollPitchYawThrust{}\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.THRUST = THRUST\n\tm.GROUP = GROUP\n\tm.MODE = MODE\n\tm.LED_RED = LED_RED\n\tm.LED_BLUE = LED_BLUE\n\tm.LED_GREEN = LED_GREEN\n\treturn &m\n}\n\n// Id returns the SetQuadSwarmLedRollPitchYawThrust Message ID\nfunc (*SetQuadSwarmLedRollPitchYawThrust) Id() uint8 {\n\treturn 63\n}\n\n// Len returns the SetQuadSwarmLedRollPitchYawThrust Message Length\nfunc (*SetQuadSwarmLedRollPitchYawThrust) Len() uint8 {\n\treturn 46\n}\n\n// Crc returns the SetQuadSwarmLedRollPitchYawThrust Message CRC\nfunc (*SetQuadSwarmLedRollPitchYawThrust) Crc() uint8 {\n\treturn 130\n}\n\n// Pack returns a packed byte array which represents a SetQuadSwarmLedRollPitchYawThrust payload\nfunc (m *SetQuadSwarmLedRollPitchYawThrust) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GROUP); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LED_RED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LED_BLUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LED_GREEN); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SetQuadSwarmLedRollPitchYawThrust\nfunc (m *SetQuadSwarmLedRollPitchYawThrust) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GROUP); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LED_RED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LED_BLUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LED_GREEN); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_FIELD_roll_LEN      = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_FIELD_pitch_LEN     = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_FIELD_yaw_LEN       = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_FIELD_thrust_LEN    = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_FIELD_led_red_LEN   = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_FIELD_led_blue_LEN  = 4\n\tMAVLINK_MSG_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST_FIELD_led_green_LEN = 4\n)\n\n// MESSAGE STATE_CORRECTION\n//\n// MAVLINK_MSG_ID_STATE_CORRECTION 64\n//\n// MAVLINK_MSG_ID_STATE_CORRECTION_LEN 36\n//\n// MAVLINK_MSG_ID_STATE_CORRECTION_CRC 130\ntype StateCorrection struct {\n\tXERR     float32 // x position error\n\tYERR     float32 // y position error\n\tZERR     float32 // z position error\n\tROLLERR  float32 // roll error (radians)\n\tPITCHERR float32 // pitch error (radians)\n\tYAWERR   float32 // yaw error (radians)\n\tVXERR    float32 // x velocity\n\tVYERR    float32 // y velocity\n\tVZERR    float32 // z velocity\n}\n\n// NewStateCorrection returns a new StateCorrection\nfunc NewStateCorrection(XERR float32, YERR float32, ZERR float32, ROLLERR float32, PITCHERR float32, YAWERR float32, VXERR float32, VYERR float32, VZERR float32) *StateCorrection {\n\tm := StateCorrection{}\n\tm.XERR = XERR\n\tm.YERR = YERR\n\tm.ZERR = ZERR\n\tm.ROLLERR = ROLLERR\n\tm.PITCHERR = PITCHERR\n\tm.YAWERR = YAWERR\n\tm.VXERR = VXERR\n\tm.VYERR = VYERR\n\tm.VZERR = VZERR\n\treturn &m\n}\n\n// Id returns the StateCorrection Message ID\nfunc (*StateCorrection) Id() uint8 {\n\treturn 64\n}\n\n// Len returns the StateCorrection Message Length\nfunc (*StateCorrection) Len() uint8 {\n\treturn 36\n}\n\n// Crc returns the StateCorrection Message CRC\nfunc (*StateCorrection) Crc() uint8 {\n\treturn 130\n}\n\n// Pack returns a packed byte array which represents a StateCorrection payload\nfunc (m *StateCorrection) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.XERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLLERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCHERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAWERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VXERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VYERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VZERR); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the StateCorrection\nfunc (m *StateCorrection) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.XERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLLERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCHERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAWERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VXERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VYERR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VZERR); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE RC_CHANNELS\n//\n// MAVLINK_MSG_ID_RC_CHANNELS 65\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_LEN 42\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_CRC 118\ntype RcChannels struct {\n\tTIME_BOOT_MS uint32 // Timestamp (milliseconds since system boot)\n\tCHAN1_RAW    uint16 // RC channel 1 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN2_RAW    uint16 // RC channel 2 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN3_RAW    uint16 // RC channel 3 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN4_RAW    uint16 // RC channel 4 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN5_RAW    uint16 // RC channel 5 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN6_RAW    uint16 // RC channel 6 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN7_RAW    uint16 // RC channel 7 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN8_RAW    uint16 // RC channel 8 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN9_RAW    uint16 // RC channel 9 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN10_RAW   uint16 // RC channel 10 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN11_RAW   uint16 // RC channel 11 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN12_RAW   uint16 // RC channel 12 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN13_RAW   uint16 // RC channel 13 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN14_RAW   uint16 // RC channel 14 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN15_RAW   uint16 // RC channel 15 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN16_RAW   uint16 // RC channel 16 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN17_RAW   uint16 // RC channel 17 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHAN18_RAW   uint16 // RC channel 18 value, in microseconds. A value of UINT16_MAX implies the channel is unused.\n\tCHANCOUNT    uint8  // Total number of RC channels being received. This can be larger than 18, indicating that more channels are available but not given in this message. This value should be 0 when no RC channels are available.\n\tRSSI         uint8  // Receive signal strength indicator, 0: 0%, 100: 100%, 255: invalid/unknown.\n}\n\n// NewRcChannels returns a new RcChannels\nfunc NewRcChannels(TIME_BOOT_MS uint32, CHAN1_RAW uint16, CHAN2_RAW uint16, CHAN3_RAW uint16, CHAN4_RAW uint16, CHAN5_RAW uint16, CHAN6_RAW uint16, CHAN7_RAW uint16, CHAN8_RAW uint16, CHAN9_RAW uint16, CHAN10_RAW uint16, CHAN11_RAW uint16, CHAN12_RAW uint16, CHAN13_RAW uint16, CHAN14_RAW uint16, CHAN15_RAW uint16, CHAN16_RAW uint16, CHAN17_RAW uint16, CHAN18_RAW uint16, CHANCOUNT uint8, RSSI uint8) *RcChannels {\n\tm := RcChannels{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.CHAN1_RAW = CHAN1_RAW\n\tm.CHAN2_RAW = CHAN2_RAW\n\tm.CHAN3_RAW = CHAN3_RAW\n\tm.CHAN4_RAW = CHAN4_RAW\n\tm.CHAN5_RAW = CHAN5_RAW\n\tm.CHAN6_RAW = CHAN6_RAW\n\tm.CHAN7_RAW = CHAN7_RAW\n\tm.CHAN8_RAW = CHAN8_RAW\n\tm.CHAN9_RAW = CHAN9_RAW\n\tm.CHAN10_RAW = CHAN10_RAW\n\tm.CHAN11_RAW = CHAN11_RAW\n\tm.CHAN12_RAW = CHAN12_RAW\n\tm.CHAN13_RAW = CHAN13_RAW\n\tm.CHAN14_RAW = CHAN14_RAW\n\tm.CHAN15_RAW = CHAN15_RAW\n\tm.CHAN16_RAW = CHAN16_RAW\n\tm.CHAN17_RAW = CHAN17_RAW\n\tm.CHAN18_RAW = CHAN18_RAW\n\tm.CHANCOUNT = CHANCOUNT\n\tm.RSSI = RSSI\n\treturn &m\n}\n\n// Id returns the RcChannels Message ID\nfunc (*RcChannels) Id() uint8 {\n\treturn 65\n}\n\n// Len returns the RcChannels Message Length\nfunc (*RcChannels) Len() uint8 {\n\treturn 42\n}\n\n// Crc returns the RcChannels Message CRC\nfunc (*RcChannels) Crc() uint8 {\n\treturn 118\n}\n\n// Pack returns a packed byte array which represents a RcChannels payload\nfunc (m *RcChannels) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN9_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN10_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN11_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN12_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN13_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN14_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN15_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN16_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN17_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN18_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHANCOUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RcChannels\nfunc (m *RcChannels) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN9_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN10_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN11_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN12_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN13_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN14_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN15_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN16_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN17_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN18_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHANCOUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE REQUEST_DATA_STREAM\n//\n// MAVLINK_MSG_ID_REQUEST_DATA_STREAM 66\n//\n// MAVLINK_MSG_ID_REQUEST_DATA_STREAM_LEN 6\n//\n// MAVLINK_MSG_ID_REQUEST_DATA_STREAM_CRC 148\ntype RequestDataStream struct {\n\tREQ_MESSAGE_RATE uint16 // The requested interval between two messages of this type\n\tTARGET_SYSTEM    uint8  // The target requested to send the message stream.\n\tTARGET_COMPONENT uint8  // The target requested to send the message stream.\n\tREQ_STREAM_ID    uint8  // The ID of the requested data stream\n\tSTART_STOP       uint8  // 1 to start sending, 0 to stop sending.\n}\n\n// NewRequestDataStream returns a new RequestDataStream\nfunc NewRequestDataStream(REQ_MESSAGE_RATE uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, REQ_STREAM_ID uint8, START_STOP uint8) *RequestDataStream {\n\tm := RequestDataStream{}\n\tm.REQ_MESSAGE_RATE = REQ_MESSAGE_RATE\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.REQ_STREAM_ID = REQ_STREAM_ID\n\tm.START_STOP = START_STOP\n\treturn &m\n}\n\n// Id returns the RequestDataStream Message ID\nfunc (*RequestDataStream) Id() uint8 {\n\treturn 66\n}\n\n// Len returns the RequestDataStream Message Length\nfunc (*RequestDataStream) Len() uint8 {\n\treturn 6\n}\n\n// Crc returns the RequestDataStream Message CRC\nfunc (*RequestDataStream) Crc() uint8 {\n\treturn 148\n}\n\n// Pack returns a packed byte array which represents a RequestDataStream payload\nfunc (m *RequestDataStream) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.REQ_MESSAGE_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.REQ_STREAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.START_STOP); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RequestDataStream\nfunc (m *RequestDataStream) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.REQ_MESSAGE_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.REQ_STREAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.START_STOP); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE DATA_STREAM\n//\n// MAVLINK_MSG_ID_DATA_STREAM 67\n//\n// MAVLINK_MSG_ID_DATA_STREAM_LEN 4\n//\n// MAVLINK_MSG_ID_DATA_STREAM_CRC 21\ntype DataStream struct {\n\tMESSAGE_RATE uint16 // The requested interval between two messages of this type\n\tSTREAM_ID    uint8  // The ID of the requested data stream\n\tON_OFF       uint8  // 1 stream is enabled, 0 stream is stopped.\n}\n\n// NewDataStream returns a new DataStream\nfunc NewDataStream(MESSAGE_RATE uint16, STREAM_ID uint8, ON_OFF uint8) *DataStream {\n\tm := DataStream{}\n\tm.MESSAGE_RATE = MESSAGE_RATE\n\tm.STREAM_ID = STREAM_ID\n\tm.ON_OFF = ON_OFF\n\treturn &m\n}\n\n// Id returns the DataStream Message ID\nfunc (*DataStream) Id() uint8 {\n\treturn 67\n}\n\n// Len returns the DataStream Message Length\nfunc (*DataStream) Len() uint8 {\n\treturn 4\n}\n\n// Crc returns the DataStream Message CRC\nfunc (*DataStream) Crc() uint8 {\n\treturn 21\n}\n\n// Pack returns a packed byte array which represents a DataStream payload\nfunc (m *DataStream) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.MESSAGE_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.STREAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ON_OFF); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the DataStream\nfunc (m *DataStream) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.MESSAGE_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.STREAM_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ON_OFF); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MANUAL_CONTROL\n//\n// MAVLINK_MSG_ID_MANUAL_CONTROL 69\n//\n// MAVLINK_MSG_ID_MANUAL_CONTROL_LEN 11\n//\n// MAVLINK_MSG_ID_MANUAL_CONTROL_CRC 243\ntype ManualControl struct {\n\tX       int16  // X-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to forward(1000)-backward(-1000) movement on a joystick and the pitch of a vehicle.\n\tY       int16  // Y-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to left(-1000)-right(1000) movement on a joystick and the roll of a vehicle.\n\tZ       int16  // Z-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to a separate slider movement with maximum being 1000 and minimum being -1000 on a joystick and the thrust of a vehicle.\n\tR       int16  // R-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to a twisting of the joystick, with counter-clockwise being 1000 and clockwise being -1000, and the yaw of a vehicle.\n\tBUTTONS uint16 // A bitfield corresponding to the joystick buttons' current state, 1 for pressed, 0 for released. The lowest bit corresponds to Button 1.\n\tTARGET  uint8  // The system to be controlled.\n}\n\n// NewManualControl returns a new ManualControl\nfunc NewManualControl(X int16, Y int16, Z int16, R int16, BUTTONS uint16, TARGET uint8) *ManualControl {\n\tm := ManualControl{}\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.R = R\n\tm.BUTTONS = BUTTONS\n\tm.TARGET = TARGET\n\treturn &m\n}\n\n// Id returns the ManualControl Message ID\nfunc (*ManualControl) Id() uint8 {\n\treturn 69\n}\n\n// Len returns the ManualControl Message Length\nfunc (*ManualControl) Len() uint8 {\n\treturn 11\n}\n\n// Crc returns the ManualControl Message CRC\nfunc (*ManualControl) Crc() uint8 {\n\treturn 243\n}\n\n// Pack returns a packed byte array which represents a ManualControl payload\nfunc (m *ManualControl) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.R); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BUTTONS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ManualControl\nfunc (m *ManualControl) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.R); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BUTTONS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE RC_CHANNELS_OVERRIDE\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE 70\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE_LEN 18\n//\n// MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE_CRC 124\ntype RcChannelsOverride struct {\n\tCHAN1_RAW        uint16 // RC channel 1 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tCHAN2_RAW        uint16 // RC channel 2 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tCHAN3_RAW        uint16 // RC channel 3 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tCHAN4_RAW        uint16 // RC channel 4 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tCHAN5_RAW        uint16 // RC channel 5 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tCHAN6_RAW        uint16 // RC channel 6 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tCHAN7_RAW        uint16 // RC channel 7 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tCHAN8_RAW        uint16 // RC channel 8 value, in microseconds. A value of UINT16_MAX means to ignore this field.\n\tTARGET_SYSTEM    uint8  // System ID\n\tTARGET_COMPONENT uint8  // Component ID\n}\n\n// NewRcChannelsOverride returns a new RcChannelsOverride\nfunc NewRcChannelsOverride(CHAN1_RAW uint16, CHAN2_RAW uint16, CHAN3_RAW uint16, CHAN4_RAW uint16, CHAN5_RAW uint16, CHAN6_RAW uint16, CHAN7_RAW uint16, CHAN8_RAW uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *RcChannelsOverride {\n\tm := RcChannelsOverride{}\n\tm.CHAN1_RAW = CHAN1_RAW\n\tm.CHAN2_RAW = CHAN2_RAW\n\tm.CHAN3_RAW = CHAN3_RAW\n\tm.CHAN4_RAW = CHAN4_RAW\n\tm.CHAN5_RAW = CHAN5_RAW\n\tm.CHAN6_RAW = CHAN6_RAW\n\tm.CHAN7_RAW = CHAN7_RAW\n\tm.CHAN8_RAW = CHAN8_RAW\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the RcChannelsOverride Message ID\nfunc (*RcChannelsOverride) Id() uint8 {\n\treturn 70\n}\n\n// Len returns the RcChannelsOverride Message Length\nfunc (*RcChannelsOverride) Len() uint8 {\n\treturn 18\n}\n\n// Crc returns the RcChannelsOverride Message CRC\nfunc (*RcChannelsOverride) Crc() uint8 {\n\treturn 124\n}\n\n// Pack returns a packed byte array which represents a RcChannelsOverride payload\nfunc (m *RcChannelsOverride) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RcChannelsOverride\nfunc (m *RcChannelsOverride) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE VFR_HUD\n//\n// MAVLINK_MSG_ID_VFR_HUD 74\n//\n// MAVLINK_MSG_ID_VFR_HUD_LEN 20\n//\n// MAVLINK_MSG_ID_VFR_HUD_CRC 20\ntype VfrHud struct {\n\tAIRSPEED    float32 // Current airspeed in m/s\n\tGROUNDSPEED float32 // Current ground speed in m/s\n\tALT         float32 // Current altitude (MSL), in meters\n\tCLIMB       float32 // Current climb rate in meters/second\n\tHEADING     int16   // Current heading in degrees, in compass units (0..360, 0=north)\n\tTHROTTLE    uint16  // Current throttle setting in integer percent, 0 to 100\n}\n\n// NewVfrHud returns a new VfrHud\nfunc NewVfrHud(AIRSPEED float32, GROUNDSPEED float32, ALT float32, CLIMB float32, HEADING int16, THROTTLE uint16) *VfrHud {\n\tm := VfrHud{}\n\tm.AIRSPEED = AIRSPEED\n\tm.GROUNDSPEED = GROUNDSPEED\n\tm.ALT = ALT\n\tm.CLIMB = CLIMB\n\tm.HEADING = HEADING\n\tm.THROTTLE = THROTTLE\n\treturn &m\n}\n\n// Id returns the VfrHud Message ID\nfunc (*VfrHud) Id() uint8 {\n\treturn 74\n}\n\n// Len returns the VfrHud Message Length\nfunc (*VfrHud) Len() uint8 {\n\treturn 20\n}\n\n// Crc returns the VfrHud Message CRC\nfunc (*VfrHud) Crc() uint8 {\n\treturn 20\n}\n\n// Pack returns a packed byte array which represents a VfrHud payload\nfunc (m *VfrHud) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.AIRSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GROUNDSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CLIMB); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.HEADING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THROTTLE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the VfrHud\nfunc (m *VfrHud) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.AIRSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GROUNDSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CLIMB); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.HEADING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THROTTLE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE COMMAND_LONG\n//\n// MAVLINK_MSG_ID_COMMAND_LONG 76\n//\n// MAVLINK_MSG_ID_COMMAND_LONG_LEN 33\n//\n// MAVLINK_MSG_ID_COMMAND_LONG_CRC 152\ntype CommandLong struct {\n\tPARAM1           float32 // Parameter 1, as defined by MAV_CMD enum.\n\tPARAM2           float32 // Parameter 2, as defined by MAV_CMD enum.\n\tPARAM3           float32 // Parameter 3, as defined by MAV_CMD enum.\n\tPARAM4           float32 // Parameter 4, as defined by MAV_CMD enum.\n\tPARAM5           float32 // Parameter 5, as defined by MAV_CMD enum.\n\tPARAM6           float32 // Parameter 6, as defined by MAV_CMD enum.\n\tPARAM7           float32 // Parameter 7, as defined by MAV_CMD enum.\n\tCOMMAND          uint16  // Command ID, as defined by MAV_CMD enum.\n\tTARGET_SYSTEM    uint8   // System which should execute the command\n\tTARGET_COMPONENT uint8   // Component which should execute the command, 0 for all components\n\tCONFIRMATION     uint8   // 0: First transmission of this command. 1-255: Confirmation transmissions (e.g. for kill command)\n}\n\n// NewCommandLong returns a new CommandLong\nfunc NewCommandLong(PARAM1 float32, PARAM2 float32, PARAM3 float32, PARAM4 float32, PARAM5 float32, PARAM6 float32, PARAM7 float32, COMMAND uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, CONFIRMATION uint8) *CommandLong {\n\tm := CommandLong{}\n\tm.PARAM1 = PARAM1\n\tm.PARAM2 = PARAM2\n\tm.PARAM3 = PARAM3\n\tm.PARAM4 = PARAM4\n\tm.PARAM5 = PARAM5\n\tm.PARAM6 = PARAM6\n\tm.PARAM7 = PARAM7\n\tm.COMMAND = COMMAND\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.CONFIRMATION = CONFIRMATION\n\treturn &m\n}\n\n// Id returns the CommandLong Message ID\nfunc (*CommandLong) Id() uint8 {\n\treturn 76\n}\n\n// Len returns the CommandLong Message Length\nfunc (*CommandLong) Len() uint8 {\n\treturn 33\n}\n\n// Crc returns the CommandLong Message CRC\nfunc (*CommandLong) Crc() uint8 {\n\treturn 152\n}\n\n// Pack returns a packed byte array which represents a CommandLong payload\nfunc (m *CommandLong) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM5); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM6); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PARAM7); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COMMAND); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CONFIRMATION); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the CommandLong\nfunc (m *CommandLong) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM5); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM6); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PARAM7); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COMMAND); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CONFIRMATION); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE COMMAND_ACK\n//\n// MAVLINK_MSG_ID_COMMAND_ACK 77\n//\n// MAVLINK_MSG_ID_COMMAND_ACK_LEN 3\n//\n// MAVLINK_MSG_ID_COMMAND_ACK_CRC 143\ntype CommandAck struct {\n\tCOMMAND uint16 // Command ID, as defined by MAV_CMD enum.\n\tRESULT  uint8  // See MAV_RESULT enum\n}\n\n// NewCommandAck returns a new CommandAck\nfunc NewCommandAck(COMMAND uint16, RESULT uint8) *CommandAck {\n\tm := CommandAck{}\n\tm.COMMAND = COMMAND\n\tm.RESULT = RESULT\n\treturn &m\n}\n\n// Id returns the CommandAck Message ID\nfunc (*CommandAck) Id() uint8 {\n\treturn 77\n}\n\n// Len returns the CommandAck Message Length\nfunc (*CommandAck) Len() uint8 {\n\treturn 3\n}\n\n// Crc returns the CommandAck Message CRC\nfunc (*CommandAck) Crc() uint8 {\n\treturn 143\n}\n\n// Pack returns a packed byte array which represents a CommandAck payload\nfunc (m *CommandAck) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.COMMAND); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RESULT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the CommandAck\nfunc (m *CommandAck) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.COMMAND); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RESULT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE ROLL_PITCH_YAW_RATES_THRUST_SETPOINT\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_RATES_THRUST_SETPOINT 80\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_RATES_THRUST_SETPOINT_LEN 20\n//\n// MAVLINK_MSG_ID_ROLL_PITCH_YAW_RATES_THRUST_SETPOINT_CRC 127\ntype RollPitchYawRatesThrustSetpoint struct {\n\tTIME_BOOT_MS uint32  // Timestamp in milliseconds since system boot\n\tROLL_RATE    float32 // Desired roll rate in radians per second\n\tPITCH_RATE   float32 // Desired pitch rate in radians per second\n\tYAW_RATE     float32 // Desired yaw rate in radians per second\n\tTHRUST       float32 // Collective thrust, normalized to 0 .. 1\n}\n\n// NewRollPitchYawRatesThrustSetpoint returns a new RollPitchYawRatesThrustSetpoint\nfunc NewRollPitchYawRatesThrustSetpoint(TIME_BOOT_MS uint32, ROLL_RATE float32, PITCH_RATE float32, YAW_RATE float32, THRUST float32) *RollPitchYawRatesThrustSetpoint {\n\tm := RollPitchYawRatesThrustSetpoint{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.ROLL_RATE = ROLL_RATE\n\tm.PITCH_RATE = PITCH_RATE\n\tm.YAW_RATE = YAW_RATE\n\tm.THRUST = THRUST\n\treturn &m\n}\n\n// Id returns the RollPitchYawRatesThrustSetpoint Message ID\nfunc (*RollPitchYawRatesThrustSetpoint) Id() uint8 {\n\treturn 80\n}\n\n// Len returns the RollPitchYawRatesThrustSetpoint Message Length\nfunc (*RollPitchYawRatesThrustSetpoint) Len() uint8 {\n\treturn 20\n}\n\n// Crc returns the RollPitchYawRatesThrustSetpoint Message CRC\nfunc (*RollPitchYawRatesThrustSetpoint) Crc() uint8 {\n\treturn 127\n}\n\n// Pack returns a packed byte array which represents a RollPitchYawRatesThrustSetpoint payload\nfunc (m *RollPitchYawRatesThrustSetpoint) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RollPitchYawRatesThrustSetpoint\nfunc (m *RollPitchYawRatesThrustSetpoint) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MANUAL_SETPOINT\n//\n// MAVLINK_MSG_ID_MANUAL_SETPOINT 81\n//\n// MAVLINK_MSG_ID_MANUAL_SETPOINT_LEN 22\n//\n// MAVLINK_MSG_ID_MANUAL_SETPOINT_CRC 106\ntype ManualSetpoint struct {\n\tTIME_BOOT_MS           uint32  // Timestamp in milliseconds since system boot\n\tROLL                   float32 // Desired roll rate in radians per second\n\tPITCH                  float32 // Desired pitch rate in radians per second\n\tYAW                    float32 // Desired yaw rate in radians per second\n\tTHRUST                 float32 // Collective thrust, normalized to 0 .. 1\n\tMODE_SWITCH            uint8   // Flight mode switch position, 0.. 255\n\tMANUAL_OVERRIDE_SWITCH uint8   // Override mode switch position, 0.. 255\n}\n\n// NewManualSetpoint returns a new ManualSetpoint\nfunc NewManualSetpoint(TIME_BOOT_MS uint32, ROLL float32, PITCH float32, YAW float32, THRUST float32, MODE_SWITCH uint8, MANUAL_OVERRIDE_SWITCH uint8) *ManualSetpoint {\n\tm := ManualSetpoint{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.THRUST = THRUST\n\tm.MODE_SWITCH = MODE_SWITCH\n\tm.MANUAL_OVERRIDE_SWITCH = MANUAL_OVERRIDE_SWITCH\n\treturn &m\n}\n\n// Id returns the ManualSetpoint Message ID\nfunc (*ManualSetpoint) Id() uint8 {\n\treturn 81\n}\n\n// Len returns the ManualSetpoint Message Length\nfunc (*ManualSetpoint) Len() uint8 {\n\treturn 22\n}\n\n// Crc returns the ManualSetpoint Message CRC\nfunc (*ManualSetpoint) Crc() uint8 {\n\treturn 106\n}\n\n// Pack returns a packed byte array which represents a ManualSetpoint payload\nfunc (m *ManualSetpoint) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MODE_SWITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MANUAL_OVERRIDE_SWITCH); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ManualSetpoint\nfunc (m *ManualSetpoint) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MODE_SWITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MANUAL_OVERRIDE_SWITCH); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE ATTITUDE_SETPOINT_EXTERNAL\n//\n// MAVLINK_MSG_ID_ATTITUDE_SETPOINT_EXTERNAL 82\n//\n// MAVLINK_MSG_ID_ATTITUDE_SETPOINT_EXTERNAL_LEN 39\n//\n// MAVLINK_MSG_ID_ATTITUDE_SETPOINT_EXTERNAL_CRC 147\ntype AttitudeSetpointExternal struct {\n\tTIME_BOOT_MS     uint32     // Timestamp in milliseconds since system boot\n\tQ                [4]float32 // Attitude quaternion (w, x, y, z order, zero-rotation is 1, 0, 0, 0)\n\tBODY_ROLL_RATE   float32    // Body roll rate in radians per second\n\tBODY_PITCH_RATE  float32    // Body roll rate in radians per second\n\tBODY_YAW_RATE    float32    // Body roll rate in radians per second\n\tTHRUST           float32    // Collective thrust, normalized to 0 .. 1 (-1 .. 1 for vehicles capable of reverse trust)\n\tTARGET_SYSTEM    uint8      // System ID\n\tTARGET_COMPONENT uint8      // Component ID\n\tTYPE_MASK        uint8      // Mappings: If any of these bits are set, the corresponding input should be ignored: bit 1: body roll rate, bit 2: body pitch rate, bit 3: body yaw rate. bit 4-bit 7: reserved, bit 8: attitude\n}\n\n// NewAttitudeSetpointExternal returns a new AttitudeSetpointExternal\nfunc NewAttitudeSetpointExternal(TIME_BOOT_MS uint32, Q [4]float32, BODY_ROLL_RATE float32, BODY_PITCH_RATE float32, BODY_YAW_RATE float32, THRUST float32, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, TYPE_MASK uint8) *AttitudeSetpointExternal {\n\tm := AttitudeSetpointExternal{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.Q = Q\n\tm.BODY_ROLL_RATE = BODY_ROLL_RATE\n\tm.BODY_PITCH_RATE = BODY_PITCH_RATE\n\tm.BODY_YAW_RATE = BODY_YAW_RATE\n\tm.THRUST = THRUST\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.TYPE_MASK = TYPE_MASK\n\treturn &m\n}\n\n// Id returns the AttitudeSetpointExternal Message ID\nfunc (*AttitudeSetpointExternal) Id() uint8 {\n\treturn 82\n}\n\n// Len returns the AttitudeSetpointExternal Message Length\nfunc (*AttitudeSetpointExternal) Len() uint8 {\n\treturn 39\n}\n\n// Crc returns the AttitudeSetpointExternal Message CRC\nfunc (*AttitudeSetpointExternal) Crc() uint8 {\n\treturn 147\n}\n\n// Pack returns a packed byte array which represents a AttitudeSetpointExternal payload\nfunc (m *AttitudeSetpointExternal) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BODY_ROLL_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BODY_PITCH_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BODY_YAW_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE_MASK); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the AttitudeSetpointExternal\nfunc (m *AttitudeSetpointExternal) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BODY_ROLL_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BODY_PITCH_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BODY_YAW_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THRUST); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE_MASK); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_ATTITUDE_SETPOINT_EXTERNAL_FIELD_q_LEN = 4\n)\n\n// MESSAGE LOCAL_NED_POSITION_SETPOINT_EXTERNAL\n//\n// MAVLINK_MSG_ID_LOCAL_NED_POSITION_SETPOINT_EXTERNAL 83\n//\n// MAVLINK_MSG_ID_LOCAL_NED_POSITION_SETPOINT_EXTERNAL_LEN 45\n//\n// MAVLINK_MSG_ID_LOCAL_NED_POSITION_SETPOINT_EXTERNAL_CRC 211\ntype LocalNedPositionSetpointExternal struct {\n\tTIME_BOOT_MS     uint32  // Timestamp in milliseconds since system boot\n\tX                float32 // X Position in NED frame in meters\n\tY                float32 // Y Position in NED frame in meters\n\tZ                float32 // Z Position in NED frame in meters (note, altitude is negative in NED)\n\tVX               float32 // X velocity in NED frame in meter / s\n\tVY               float32 // Y velocity in NED frame in meter / s\n\tVZ               float32 // Z velocity in NED frame in meter / s\n\tAFX              float32 // X acceleration or force (if bit 10 of type_mask is set) in NED frame in meter / s^2 or N\n\tAFY              float32 // Y acceleration or force (if bit 10 of type_mask is set) in NED frame in meter / s^2 or N\n\tAFZ              float32 // Z acceleration or force (if bit 10 of type_mask is set) in NED frame in meter / s^2 or N\n\tTYPE_MASK        uint16  // Bitmask to indicate which dimensions should be ignored by the vehicle: a value of 0b0000000000000000 or 0b0000001000000000 indicates that none of the setpoint dimensions should be ignored. If bit 10 is set the floats afx afy afz should be interpreted as force instead of acceleration. Mapping: bit 1: x, bit 2: y, bit 3: z, bit 4: vx, bit 5: vy, bit 6: vz, bit 7: ax, bit 8: ay, bit 9: az, bit 10: is force setpoint\n\tTARGET_SYSTEM    uint8   // System ID\n\tTARGET_COMPONENT uint8   // Component ID\n\tCOORDINATE_FRAME uint8   // Valid options are: MAV_FRAME_LOCAL_NED, MAV_FRAME_LOCAL_OFFSET_NED = 5, MAV_FRAME_BODY_NED = 6, MAV_FRAME_BODY_OFFSET_NED = 7\n}\n\n// NewLocalNedPositionSetpointExternal returns a new LocalNedPositionSetpointExternal\nfunc NewLocalNedPositionSetpointExternal(TIME_BOOT_MS uint32, X float32, Y float32, Z float32, VX float32, VY float32, VZ float32, AFX float32, AFY float32, AFZ float32, TYPE_MASK uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, COORDINATE_FRAME uint8) *LocalNedPositionSetpointExternal {\n\tm := LocalNedPositionSetpointExternal{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.VX = VX\n\tm.VY = VY\n\tm.VZ = VZ\n\tm.AFX = AFX\n\tm.AFY = AFY\n\tm.AFZ = AFZ\n\tm.TYPE_MASK = TYPE_MASK\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.COORDINATE_FRAME = COORDINATE_FRAME\n\treturn &m\n}\n\n// Id returns the LocalNedPositionSetpointExternal Message ID\nfunc (*LocalNedPositionSetpointExternal) Id() uint8 {\n\treturn 83\n}\n\n// Len returns the LocalNedPositionSetpointExternal Message Length\nfunc (*LocalNedPositionSetpointExternal) Len() uint8 {\n\treturn 45\n}\n\n// Crc returns the LocalNedPositionSetpointExternal Message CRC\nfunc (*LocalNedPositionSetpointExternal) Crc() uint8 {\n\treturn 211\n}\n\n// Pack returns a packed byte array which represents a LocalNedPositionSetpointExternal payload\nfunc (m *LocalNedPositionSetpointExternal) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AFX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AFY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AFZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE_MASK); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LocalNedPositionSetpointExternal\nfunc (m *LocalNedPositionSetpointExternal) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AFX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AFY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AFZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE_MASK); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COORDINATE_FRAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GLOBAL_POSITION_SETPOINT_EXTERNAL_INT\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_SETPOINT_EXTERNAL_INT 84\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_SETPOINT_EXTERNAL_INT_LEN 44\n//\n// MAVLINK_MSG_ID_GLOBAL_POSITION_SETPOINT_EXTERNAL_INT_CRC 198\ntype GlobalPositionSetpointExternalInt struct {\n\tTIME_BOOT_MS     uint32  // Timestamp in milliseconds since system boot. The rationale for the timestamp in the setpoint is to allow the system to compensate for the transport delay of the setpoint. This allows the system to compensate processing latency.\n\tLAT_INT          int32   // X Position in WGS84 frame in 1e7 * meters\n\tLON_INT          int32   // Y Position in WGS84 frame in 1e7 * meters\n\tALT              float32 // Altitude in WGS84, not AMSL\n\tVX               float32 // X velocity in NED frame in meter / s\n\tVY               float32 // Y velocity in NED frame in meter / s\n\tVZ               float32 // Z velocity in NED frame in meter / s\n\tAFX              float32 // X acceleration or force (if bit 10 of type_mask is set) in NED frame in meter / s^2 or N\n\tAFY              float32 // Y acceleration or force (if bit 10 of type_mask is set) in NED frame in meter / s^2 or N\n\tAFZ              float32 // Z acceleration or force (if bit 10 of type_mask is set) in NED frame in meter / s^2 or N\n\tTYPE_MASK        uint16  // Bitmask to indicate which dimensions should be ignored by the vehicle: a value of 0b0000000000000000 or 0b0000001000000000 indicates that none of the setpoint dimensions should be ignored. If bit 10 is set the floats afx afy afz should be interpreted as force instead of acceleration. Mapping: bit 1: x, bit 2: y, bit 3: z, bit 4: vx, bit 5: vy, bit 6: vz, bit 7: ax, bit 8: ay, bit 9: az, bit 10: is force setpoint\n\tTARGET_SYSTEM    uint8   // System ID\n\tTARGET_COMPONENT uint8   // Component ID\n}\n\n// NewGlobalPositionSetpointExternalInt returns a new GlobalPositionSetpointExternalInt\nfunc NewGlobalPositionSetpointExternalInt(TIME_BOOT_MS uint32, LAT_INT int32, LON_INT int32, ALT float32, VX float32, VY float32, VZ float32, AFX float32, AFY float32, AFZ float32, TYPE_MASK uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *GlobalPositionSetpointExternalInt {\n\tm := GlobalPositionSetpointExternalInt{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.LAT_INT = LAT_INT\n\tm.LON_INT = LON_INT\n\tm.ALT = ALT\n\tm.VX = VX\n\tm.VY = VY\n\tm.VZ = VZ\n\tm.AFX = AFX\n\tm.AFY = AFY\n\tm.AFZ = AFZ\n\tm.TYPE_MASK = TYPE_MASK\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the GlobalPositionSetpointExternalInt Message ID\nfunc (*GlobalPositionSetpointExternalInt) Id() uint8 {\n\treturn 84\n}\n\n// Len returns the GlobalPositionSetpointExternalInt Message Length\nfunc (*GlobalPositionSetpointExternalInt) Len() uint8 {\n\treturn 44\n}\n\n// Crc returns the GlobalPositionSetpointExternalInt Message CRC\nfunc (*GlobalPositionSetpointExternalInt) Crc() uint8 {\n\treturn 198\n}\n\n// Pack returns a packed byte array which represents a GlobalPositionSetpointExternalInt payload\nfunc (m *GlobalPositionSetpointExternalInt) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT_INT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON_INT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AFX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AFY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AFZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE_MASK); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GlobalPositionSetpointExternalInt\nfunc (m *GlobalPositionSetpointExternalInt) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT_INT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON_INT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AFX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AFY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AFZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE_MASK); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET 89\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET_LEN 28\n//\n// MAVLINK_MSG_ID_LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET_CRC 231\ntype LocalPositionNedSystemGlobalOffset struct {\n\tTIME_BOOT_MS uint32  // Timestamp (milliseconds since system boot)\n\tX            float32 // X Position\n\tY            float32 // Y Position\n\tZ            float32 // Z Position\n\tROLL         float32 // Roll\n\tPITCH        float32 // Pitch\n\tYAW          float32 // Yaw\n}\n\n// NewLocalPositionNedSystemGlobalOffset returns a new LocalPositionNedSystemGlobalOffset\nfunc NewLocalPositionNedSystemGlobalOffset(TIME_BOOT_MS uint32, X float32, Y float32, Z float32, ROLL float32, PITCH float32, YAW float32) *LocalPositionNedSystemGlobalOffset {\n\tm := LocalPositionNedSystemGlobalOffset{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\treturn &m\n}\n\n// Id returns the LocalPositionNedSystemGlobalOffset Message ID\nfunc (*LocalPositionNedSystemGlobalOffset) Id() uint8 {\n\treturn 89\n}\n\n// Len returns the LocalPositionNedSystemGlobalOffset Message Length\nfunc (*LocalPositionNedSystemGlobalOffset) Len() uint8 {\n\treturn 28\n}\n\n// Crc returns the LocalPositionNedSystemGlobalOffset Message CRC\nfunc (*LocalPositionNedSystemGlobalOffset) Crc() uint8 {\n\treturn 231\n}\n\n// Pack returns a packed byte array which represents a LocalPositionNedSystemGlobalOffset payload\nfunc (m *LocalPositionNedSystemGlobalOffset) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LocalPositionNedSystemGlobalOffset\nfunc (m *LocalPositionNedSystemGlobalOffset) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE HIL_STATE\n//\n// MAVLINK_MSG_ID_HIL_STATE 90\n//\n// MAVLINK_MSG_ID_HIL_STATE_LEN 56\n//\n// MAVLINK_MSG_ID_HIL_STATE_CRC 183\ntype HilState struct {\n\tTIME_USEC  uint64  // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tROLL       float32 // Roll angle (rad)\n\tPITCH      float32 // Pitch angle (rad)\n\tYAW        float32 // Yaw angle (rad)\n\tROLLSPEED  float32 // Body frame roll / phi angular speed (rad/s)\n\tPITCHSPEED float32 // Body frame pitch / theta angular speed (rad/s)\n\tYAWSPEED   float32 // Body frame yaw / psi angular speed (rad/s)\n\tLAT        int32   // Latitude, expressed as * 1E7\n\tLON        int32   // Longitude, expressed as * 1E7\n\tALT        int32   // Altitude in meters, expressed as * 1000 (millimeters)\n\tVX         int16   // Ground X Speed (Latitude), expressed as m/s * 100\n\tVY         int16   // Ground Y Speed (Longitude), expressed as m/s * 100\n\tVZ         int16   // Ground Z Speed (Altitude), expressed as m/s * 100\n\tXACC       int16   // X acceleration (mg)\n\tYACC       int16   // Y acceleration (mg)\n\tZACC       int16   // Z acceleration (mg)\n}\n\n// NewHilState returns a new HilState\nfunc NewHilState(TIME_USEC uint64, ROLL float32, PITCH float32, YAW float32, ROLLSPEED float32, PITCHSPEED float32, YAWSPEED float32, LAT int32, LON int32, ALT int32, VX int16, VY int16, VZ int16, XACC int16, YACC int16, ZACC int16) *HilState {\n\tm := HilState{}\n\tm.TIME_USEC = TIME_USEC\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.ROLLSPEED = ROLLSPEED\n\tm.PITCHSPEED = PITCHSPEED\n\tm.YAWSPEED = YAWSPEED\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.ALT = ALT\n\tm.VX = VX\n\tm.VY = VY\n\tm.VZ = VZ\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\treturn &m\n}\n\n// Id returns the HilState Message ID\nfunc (*HilState) Id() uint8 {\n\treturn 90\n}\n\n// Len returns the HilState Message Length\nfunc (*HilState) Len() uint8 {\n\treturn 56\n}\n\n// Crc returns the HilState Message CRC\nfunc (*HilState) Crc() uint8 {\n\treturn 183\n}\n\n// Pack returns a packed byte array which represents a HilState payload\nfunc (m *HilState) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HilState\nfunc (m *HilState) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE HIL_CONTROLS\n//\n// MAVLINK_MSG_ID_HIL_CONTROLS 91\n//\n// MAVLINK_MSG_ID_HIL_CONTROLS_LEN 42\n//\n// MAVLINK_MSG_ID_HIL_CONTROLS_CRC 63\ntype HilControls struct {\n\tTIME_USEC      uint64  // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tROLL_AILERONS  float32 // Control output -1 .. 1\n\tPITCH_ELEVATOR float32 // Control output -1 .. 1\n\tYAW_RUDDER     float32 // Control output -1 .. 1\n\tTHROTTLE       float32 // Throttle 0 .. 1\n\tAUX1           float32 // Aux 1, -1 .. 1\n\tAUX2           float32 // Aux 2, -1 .. 1\n\tAUX3           float32 // Aux 3, -1 .. 1\n\tAUX4           float32 // Aux 4, -1 .. 1\n\tMODE           uint8   // System mode (MAV_MODE)\n\tNAV_MODE       uint8   // Navigation mode (MAV_NAV_MODE)\n}\n\n// NewHilControls returns a new HilControls\nfunc NewHilControls(TIME_USEC uint64, ROLL_AILERONS float32, PITCH_ELEVATOR float32, YAW_RUDDER float32, THROTTLE float32, AUX1 float32, AUX2 float32, AUX3 float32, AUX4 float32, MODE uint8, NAV_MODE uint8) *HilControls {\n\tm := HilControls{}\n\tm.TIME_USEC = TIME_USEC\n\tm.ROLL_AILERONS = ROLL_AILERONS\n\tm.PITCH_ELEVATOR = PITCH_ELEVATOR\n\tm.YAW_RUDDER = YAW_RUDDER\n\tm.THROTTLE = THROTTLE\n\tm.AUX1 = AUX1\n\tm.AUX2 = AUX2\n\tm.AUX3 = AUX3\n\tm.AUX4 = AUX4\n\tm.MODE = MODE\n\tm.NAV_MODE = NAV_MODE\n\treturn &m\n}\n\n// Id returns the HilControls Message ID\nfunc (*HilControls) Id() uint8 {\n\treturn 91\n}\n\n// Len returns the HilControls Message Length\nfunc (*HilControls) Len() uint8 {\n\treturn 42\n}\n\n// Crc returns the HilControls Message CRC\nfunc (*HilControls) Crc() uint8 {\n\treturn 63\n}\n\n// Pack returns a packed byte array which represents a HilControls payload\nfunc (m *HilControls) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL_AILERONS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH_ELEVATOR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW_RUDDER); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.THROTTLE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AUX1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AUX2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AUX3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.AUX4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NAV_MODE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HilControls\nfunc (m *HilControls) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL_AILERONS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH_ELEVATOR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW_RUDDER); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.THROTTLE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AUX1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AUX2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AUX3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.AUX4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MODE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NAV_MODE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE HIL_RC_INPUTS_RAW\n//\n// MAVLINK_MSG_ID_HIL_RC_INPUTS_RAW 92\n//\n// MAVLINK_MSG_ID_HIL_RC_INPUTS_RAW_LEN 33\n//\n// MAVLINK_MSG_ID_HIL_RC_INPUTS_RAW_CRC 54\ntype HilRcInputsRaw struct {\n\tTIME_USEC  uint64 // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tCHAN1_RAW  uint16 // RC channel 1 value, in microseconds\n\tCHAN2_RAW  uint16 // RC channel 2 value, in microseconds\n\tCHAN3_RAW  uint16 // RC channel 3 value, in microseconds\n\tCHAN4_RAW  uint16 // RC channel 4 value, in microseconds\n\tCHAN5_RAW  uint16 // RC channel 5 value, in microseconds\n\tCHAN6_RAW  uint16 // RC channel 6 value, in microseconds\n\tCHAN7_RAW  uint16 // RC channel 7 value, in microseconds\n\tCHAN8_RAW  uint16 // RC channel 8 value, in microseconds\n\tCHAN9_RAW  uint16 // RC channel 9 value, in microseconds\n\tCHAN10_RAW uint16 // RC channel 10 value, in microseconds\n\tCHAN11_RAW uint16 // RC channel 11 value, in microseconds\n\tCHAN12_RAW uint16 // RC channel 12 value, in microseconds\n\tRSSI       uint8  // Receive signal strength indicator, 0: 0%, 255: 100%\n}\n\n// NewHilRcInputsRaw returns a new HilRcInputsRaw\nfunc NewHilRcInputsRaw(TIME_USEC uint64, CHAN1_RAW uint16, CHAN2_RAW uint16, CHAN3_RAW uint16, CHAN4_RAW uint16, CHAN5_RAW uint16, CHAN6_RAW uint16, CHAN7_RAW uint16, CHAN8_RAW uint16, CHAN9_RAW uint16, CHAN10_RAW uint16, CHAN11_RAW uint16, CHAN12_RAW uint16, RSSI uint8) *HilRcInputsRaw {\n\tm := HilRcInputsRaw{}\n\tm.TIME_USEC = TIME_USEC\n\tm.CHAN1_RAW = CHAN1_RAW\n\tm.CHAN2_RAW = CHAN2_RAW\n\tm.CHAN3_RAW = CHAN3_RAW\n\tm.CHAN4_RAW = CHAN4_RAW\n\tm.CHAN5_RAW = CHAN5_RAW\n\tm.CHAN6_RAW = CHAN6_RAW\n\tm.CHAN7_RAW = CHAN7_RAW\n\tm.CHAN8_RAW = CHAN8_RAW\n\tm.CHAN9_RAW = CHAN9_RAW\n\tm.CHAN10_RAW = CHAN10_RAW\n\tm.CHAN11_RAW = CHAN11_RAW\n\tm.CHAN12_RAW = CHAN12_RAW\n\tm.RSSI = RSSI\n\treturn &m\n}\n\n// Id returns the HilRcInputsRaw Message ID\nfunc (*HilRcInputsRaw) Id() uint8 {\n\treturn 92\n}\n\n// Len returns the HilRcInputsRaw Message Length\nfunc (*HilRcInputsRaw) Len() uint8 {\n\treturn 33\n}\n\n// Crc returns the HilRcInputsRaw Message CRC\nfunc (*HilRcInputsRaw) Crc() uint8 {\n\treturn 54\n}\n\n// Pack returns a packed byte array which represents a HilRcInputsRaw payload\nfunc (m *HilRcInputsRaw) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN9_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN10_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN11_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CHAN12_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HilRcInputsRaw\nfunc (m *HilRcInputsRaw) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN1_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN2_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN3_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN4_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN5_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN6_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN7_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN8_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN9_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN10_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN11_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CHAN12_RAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE OPTICAL_FLOW\n//\n// MAVLINK_MSG_ID_OPTICAL_FLOW 100\n//\n// MAVLINK_MSG_ID_OPTICAL_FLOW_LEN 26\n//\n// MAVLINK_MSG_ID_OPTICAL_FLOW_CRC 175\ntype OpticalFlow struct {\n\tTIME_USEC       uint64  // Timestamp (UNIX)\n\tFLOW_COMP_M_X   float32 // Flow in meters in x-sensor direction, angular-speed compensated\n\tFLOW_COMP_M_Y   float32 // Flow in meters in y-sensor direction, angular-speed compensated\n\tGROUND_DISTANCE float32 // Ground distance in meters. Positive value: distance known. Negative value: Unknown distance\n\tFLOW_X          int16   // Flow in pixels * 10 in x-sensor direction (dezi-pixels)\n\tFLOW_Y          int16   // Flow in pixels * 10 in y-sensor direction (dezi-pixels)\n\tSENSOR_ID       uint8   // Sensor ID\n\tQUALITY         uint8   // Optical flow quality / confidence. 0: bad, 255: maximum quality\n}\n\n// NewOpticalFlow returns a new OpticalFlow\nfunc NewOpticalFlow(TIME_USEC uint64, FLOW_COMP_M_X float32, FLOW_COMP_M_Y float32, GROUND_DISTANCE float32, FLOW_X int16, FLOW_Y int16, SENSOR_ID uint8, QUALITY uint8) *OpticalFlow {\n\tm := OpticalFlow{}\n\tm.TIME_USEC = TIME_USEC\n\tm.FLOW_COMP_M_X = FLOW_COMP_M_X\n\tm.FLOW_COMP_M_Y = FLOW_COMP_M_Y\n\tm.GROUND_DISTANCE = GROUND_DISTANCE\n\tm.FLOW_X = FLOW_X\n\tm.FLOW_Y = FLOW_Y\n\tm.SENSOR_ID = SENSOR_ID\n\tm.QUALITY = QUALITY\n\treturn &m\n}\n\n// Id returns the OpticalFlow Message ID\nfunc (*OpticalFlow) Id() uint8 {\n\treturn 100\n}\n\n// Len returns the OpticalFlow Message Length\nfunc (*OpticalFlow) Len() uint8 {\n\treturn 26\n}\n\n// Crc returns the OpticalFlow Message CRC\nfunc (*OpticalFlow) Crc() uint8 {\n\treturn 175\n}\n\n// Pack returns a packed byte array which represents a OpticalFlow payload\nfunc (m *OpticalFlow) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_COMP_M_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_COMP_M_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GROUND_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SENSOR_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the OpticalFlow\nfunc (m *OpticalFlow) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_COMP_M_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_COMP_M_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GROUND_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SENSOR_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GLOBAL_VISION_POSITION_ESTIMATE\n//\n// MAVLINK_MSG_ID_GLOBAL_VISION_POSITION_ESTIMATE 101\n//\n// MAVLINK_MSG_ID_GLOBAL_VISION_POSITION_ESTIMATE_LEN 32\n//\n// MAVLINK_MSG_ID_GLOBAL_VISION_POSITION_ESTIMATE_CRC 102\ntype GlobalVisionPositionEstimate struct {\n\tUSEC  uint64  // Timestamp (microseconds, synced to UNIX time or since system boot)\n\tX     float32 // Global X position\n\tY     float32 // Global Y position\n\tZ     float32 // Global Z position\n\tROLL  float32 // Roll angle in rad\n\tPITCH float32 // Pitch angle in rad\n\tYAW   float32 // Yaw angle in rad\n}\n\n// NewGlobalVisionPositionEstimate returns a new GlobalVisionPositionEstimate\nfunc NewGlobalVisionPositionEstimate(USEC uint64, X float32, Y float32, Z float32, ROLL float32, PITCH float32, YAW float32) *GlobalVisionPositionEstimate {\n\tm := GlobalVisionPositionEstimate{}\n\tm.USEC = USEC\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\treturn &m\n}\n\n// Id returns the GlobalVisionPositionEstimate Message ID\nfunc (*GlobalVisionPositionEstimate) Id() uint8 {\n\treturn 101\n}\n\n// Len returns the GlobalVisionPositionEstimate Message Length\nfunc (*GlobalVisionPositionEstimate) Len() uint8 {\n\treturn 32\n}\n\n// Crc returns the GlobalVisionPositionEstimate Message CRC\nfunc (*GlobalVisionPositionEstimate) Crc() uint8 {\n\treturn 102\n}\n\n// Pack returns a packed byte array which represents a GlobalVisionPositionEstimate payload\nfunc (m *GlobalVisionPositionEstimate) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GlobalVisionPositionEstimate\nfunc (m *GlobalVisionPositionEstimate) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE VISION_POSITION_ESTIMATE\n//\n// MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE 102\n//\n// MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE_LEN 32\n//\n// MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE_CRC 158\ntype VisionPositionEstimate struct {\n\tUSEC  uint64  // Timestamp (microseconds, synced to UNIX time or since system boot)\n\tX     float32 // Global X position\n\tY     float32 // Global Y position\n\tZ     float32 // Global Z position\n\tROLL  float32 // Roll angle in rad\n\tPITCH float32 // Pitch angle in rad\n\tYAW   float32 // Yaw angle in rad\n}\n\n// NewVisionPositionEstimate returns a new VisionPositionEstimate\nfunc NewVisionPositionEstimate(USEC uint64, X float32, Y float32, Z float32, ROLL float32, PITCH float32, YAW float32) *VisionPositionEstimate {\n\tm := VisionPositionEstimate{}\n\tm.USEC = USEC\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\treturn &m\n}\n\n// Id returns the VisionPositionEstimate Message ID\nfunc (*VisionPositionEstimate) Id() uint8 {\n\treturn 102\n}\n\n// Len returns the VisionPositionEstimate Message Length\nfunc (*VisionPositionEstimate) Len() uint8 {\n\treturn 32\n}\n\n// Crc returns the VisionPositionEstimate Message CRC\nfunc (*VisionPositionEstimate) Crc() uint8 {\n\treturn 158\n}\n\n// Pack returns a packed byte array which represents a VisionPositionEstimate payload\nfunc (m *VisionPositionEstimate) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the VisionPositionEstimate\nfunc (m *VisionPositionEstimate) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE VISION_SPEED_ESTIMATE\n//\n// MAVLINK_MSG_ID_VISION_SPEED_ESTIMATE 103\n//\n// MAVLINK_MSG_ID_VISION_SPEED_ESTIMATE_LEN 20\n//\n// MAVLINK_MSG_ID_VISION_SPEED_ESTIMATE_CRC 208\ntype VisionSpeedEstimate struct {\n\tUSEC uint64  // Timestamp (microseconds, synced to UNIX time or since system boot)\n\tX    float32 // Global X speed\n\tY    float32 // Global Y speed\n\tZ    float32 // Global Z speed\n}\n\n// NewVisionSpeedEstimate returns a new VisionSpeedEstimate\nfunc NewVisionSpeedEstimate(USEC uint64, X float32, Y float32, Z float32) *VisionSpeedEstimate {\n\tm := VisionSpeedEstimate{}\n\tm.USEC = USEC\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\treturn &m\n}\n\n// Id returns the VisionSpeedEstimate Message ID\nfunc (*VisionSpeedEstimate) Id() uint8 {\n\treturn 103\n}\n\n// Len returns the VisionSpeedEstimate Message Length\nfunc (*VisionSpeedEstimate) Len() uint8 {\n\treturn 20\n}\n\n// Crc returns the VisionSpeedEstimate Message CRC\nfunc (*VisionSpeedEstimate) Crc() uint8 {\n\treturn 208\n}\n\n// Pack returns a packed byte array which represents a VisionSpeedEstimate payload\nfunc (m *VisionSpeedEstimate) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the VisionSpeedEstimate\nfunc (m *VisionSpeedEstimate) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE VICON_POSITION_ESTIMATE\n//\n// MAVLINK_MSG_ID_VICON_POSITION_ESTIMATE 104\n//\n// MAVLINK_MSG_ID_VICON_POSITION_ESTIMATE_LEN 32\n//\n// MAVLINK_MSG_ID_VICON_POSITION_ESTIMATE_CRC 56\ntype ViconPositionEstimate struct {\n\tUSEC  uint64  // Timestamp (microseconds, synced to UNIX time or since system boot)\n\tX     float32 // Global X position\n\tY     float32 // Global Y position\n\tZ     float32 // Global Z position\n\tROLL  float32 // Roll angle in rad\n\tPITCH float32 // Pitch angle in rad\n\tYAW   float32 // Yaw angle in rad\n}\n\n// NewViconPositionEstimate returns a new ViconPositionEstimate\nfunc NewViconPositionEstimate(USEC uint64, X float32, Y float32, Z float32, ROLL float32, PITCH float32, YAW float32) *ViconPositionEstimate {\n\tm := ViconPositionEstimate{}\n\tm.USEC = USEC\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\treturn &m\n}\n\n// Id returns the ViconPositionEstimate Message ID\nfunc (*ViconPositionEstimate) Id() uint8 {\n\treturn 104\n}\n\n// Len returns the ViconPositionEstimate Message Length\nfunc (*ViconPositionEstimate) Len() uint8 {\n\treturn 32\n}\n\n// Crc returns the ViconPositionEstimate Message CRC\nfunc (*ViconPositionEstimate) Crc() uint8 {\n\treturn 56\n}\n\n// Pack returns a packed byte array which represents a ViconPositionEstimate payload\nfunc (m *ViconPositionEstimate) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ViconPositionEstimate\nfunc (m *ViconPositionEstimate) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE HIGHRES_IMU\n//\n// MAVLINK_MSG_ID_HIGHRES_IMU 105\n//\n// MAVLINK_MSG_ID_HIGHRES_IMU_LEN 62\n//\n// MAVLINK_MSG_ID_HIGHRES_IMU_CRC 93\ntype HighresImu struct {\n\tTIME_USEC      uint64  // Timestamp (microseconds, synced to UNIX time or since system boot)\n\tXACC           float32 // X acceleration (m/s^2)\n\tYACC           float32 // Y acceleration (m/s^2)\n\tZACC           float32 // Z acceleration (m/s^2)\n\tXGYRO          float32 // Angular speed around X axis (rad / sec)\n\tYGYRO          float32 // Angular speed around Y axis (rad / sec)\n\tZGYRO          float32 // Angular speed around Z axis (rad / sec)\n\tXMAG           float32 // X Magnetic field (Gauss)\n\tYMAG           float32 // Y Magnetic field (Gauss)\n\tZMAG           float32 // Z Magnetic field (Gauss)\n\tABS_PRESSURE   float32 // Absolute pressure in millibar\n\tDIFF_PRESSURE  float32 // Differential pressure in millibar\n\tPRESSURE_ALT   float32 // Altitude calculated from pressure\n\tTEMPERATURE    float32 // Temperature in degrees celsius\n\tFIELDS_UPDATED uint16  // Bitmask for fields that have updated since last message, bit 0 = xacc, bit 12: temperature\n}\n\n// NewHighresImu returns a new HighresImu\nfunc NewHighresImu(TIME_USEC uint64, XACC float32, YACC float32, ZACC float32, XGYRO float32, YGYRO float32, ZGYRO float32, XMAG float32, YMAG float32, ZMAG float32, ABS_PRESSURE float32, DIFF_PRESSURE float32, PRESSURE_ALT float32, TEMPERATURE float32, FIELDS_UPDATED uint16) *HighresImu {\n\tm := HighresImu{}\n\tm.TIME_USEC = TIME_USEC\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\tm.XGYRO = XGYRO\n\tm.YGYRO = YGYRO\n\tm.ZGYRO = ZGYRO\n\tm.XMAG = XMAG\n\tm.YMAG = YMAG\n\tm.ZMAG = ZMAG\n\tm.ABS_PRESSURE = ABS_PRESSURE\n\tm.DIFF_PRESSURE = DIFF_PRESSURE\n\tm.PRESSURE_ALT = PRESSURE_ALT\n\tm.TEMPERATURE = TEMPERATURE\n\tm.FIELDS_UPDATED = FIELDS_UPDATED\n\treturn &m\n}\n\n// Id returns the HighresImu Message ID\nfunc (*HighresImu) Id() uint8 {\n\treturn 105\n}\n\n// Len returns the HighresImu Message Length\nfunc (*HighresImu) Len() uint8 {\n\treturn 62\n}\n\n// Crc returns the HighresImu Message CRC\nfunc (*HighresImu) Crc() uint8 {\n\treturn 93\n}\n\n// Pack returns a packed byte array which represents a HighresImu payload\nfunc (m *HighresImu) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ABS_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DIFF_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PRESSURE_ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FIELDS_UPDATED); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HighresImu\nfunc (m *HighresImu) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ABS_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DIFF_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PRESSURE_ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FIELDS_UPDATED); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE OMNIDIRECTIONAL_FLOW\n//\n// MAVLINK_MSG_ID_OMNIDIRECTIONAL_FLOW 106\n//\n// MAVLINK_MSG_ID_OMNIDIRECTIONAL_FLOW_LEN 54\n//\n// MAVLINK_MSG_ID_OMNIDIRECTIONAL_FLOW_CRC 211\ntype OmnidirectionalFlow struct {\n\tTIME_USEC        uint64    // Timestamp (microseconds, synced to UNIX time or since system boot)\n\tFRONT_DISTANCE_M float32   // Front distance in meters. Positive value (including zero): distance known. Negative value: Unknown distance\n\tLEFT             [10]int16 // Flow in deci pixels (1 = 0.1 pixel) on left hemisphere\n\tRIGHT            [10]int16 // Flow in deci pixels (1 = 0.1 pixel) on right hemisphere\n\tSENSOR_ID        uint8     // Sensor ID\n\tQUALITY          uint8     // Optical flow quality / confidence. 0: bad, 255: maximum quality\n}\n\n// NewOmnidirectionalFlow returns a new OmnidirectionalFlow\nfunc NewOmnidirectionalFlow(TIME_USEC uint64, FRONT_DISTANCE_M float32, LEFT [10]int16, RIGHT [10]int16, SENSOR_ID uint8, QUALITY uint8) *OmnidirectionalFlow {\n\tm := OmnidirectionalFlow{}\n\tm.TIME_USEC = TIME_USEC\n\tm.FRONT_DISTANCE_M = FRONT_DISTANCE_M\n\tm.LEFT = LEFT\n\tm.RIGHT = RIGHT\n\tm.SENSOR_ID = SENSOR_ID\n\tm.QUALITY = QUALITY\n\treturn &m\n}\n\n// Id returns the OmnidirectionalFlow Message ID\nfunc (*OmnidirectionalFlow) Id() uint8 {\n\treturn 106\n}\n\n// Len returns the OmnidirectionalFlow Message Length\nfunc (*OmnidirectionalFlow) Len() uint8 {\n\treturn 54\n}\n\n// Crc returns the OmnidirectionalFlow Message CRC\nfunc (*OmnidirectionalFlow) Crc() uint8 {\n\treturn 211\n}\n\n// Pack returns a packed byte array which represents a OmnidirectionalFlow payload\nfunc (m *OmnidirectionalFlow) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FRONT_DISTANCE_M); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LEFT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SENSOR_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the OmnidirectionalFlow\nfunc (m *OmnidirectionalFlow) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FRONT_DISTANCE_M); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LEFT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SENSOR_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_OMNIDIRECTIONAL_FLOW_FIELD_left_LEN  = 10\n\tMAVLINK_MSG_OMNIDIRECTIONAL_FLOW_FIELD_right_LEN = 10\n)\n\n// MESSAGE HIL_SENSOR\n//\n// MAVLINK_MSG_ID_HIL_SENSOR 107\n//\n// MAVLINK_MSG_ID_HIL_SENSOR_LEN 64\n//\n// MAVLINK_MSG_ID_HIL_SENSOR_CRC 108\ntype HilSensor struct {\n\tTIME_USEC      uint64  // Timestamp (microseconds, synced to UNIX time or since system boot)\n\tXACC           float32 // X acceleration (m/s^2)\n\tYACC           float32 // Y acceleration (m/s^2)\n\tZACC           float32 // Z acceleration (m/s^2)\n\tXGYRO          float32 // Angular speed around X axis in body frame (rad / sec)\n\tYGYRO          float32 // Angular speed around Y axis in body frame (rad / sec)\n\tZGYRO          float32 // Angular speed around Z axis in body frame (rad / sec)\n\tXMAG           float32 // X Magnetic field (Gauss)\n\tYMAG           float32 // Y Magnetic field (Gauss)\n\tZMAG           float32 // Z Magnetic field (Gauss)\n\tABS_PRESSURE   float32 // Absolute pressure in millibar\n\tDIFF_PRESSURE  float32 // Differential pressure (airspeed) in millibar\n\tPRESSURE_ALT   float32 // Altitude calculated from pressure\n\tTEMPERATURE    float32 // Temperature in degrees celsius\n\tFIELDS_UPDATED uint32  // Bitmask for fields that have updated since last message, bit 0 = xacc, bit 12: temperature\n}\n\n// NewHilSensor returns a new HilSensor\nfunc NewHilSensor(TIME_USEC uint64, XACC float32, YACC float32, ZACC float32, XGYRO float32, YGYRO float32, ZGYRO float32, XMAG float32, YMAG float32, ZMAG float32, ABS_PRESSURE float32, DIFF_PRESSURE float32, PRESSURE_ALT float32, TEMPERATURE float32, FIELDS_UPDATED uint32) *HilSensor {\n\tm := HilSensor{}\n\tm.TIME_USEC = TIME_USEC\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\tm.XGYRO = XGYRO\n\tm.YGYRO = YGYRO\n\tm.ZGYRO = ZGYRO\n\tm.XMAG = XMAG\n\tm.YMAG = YMAG\n\tm.ZMAG = ZMAG\n\tm.ABS_PRESSURE = ABS_PRESSURE\n\tm.DIFF_PRESSURE = DIFF_PRESSURE\n\tm.PRESSURE_ALT = PRESSURE_ALT\n\tm.TEMPERATURE = TEMPERATURE\n\tm.FIELDS_UPDATED = FIELDS_UPDATED\n\treturn &m\n}\n\n// Id returns the HilSensor Message ID\nfunc (*HilSensor) Id() uint8 {\n\treturn 107\n}\n\n// Len returns the HilSensor Message Length\nfunc (*HilSensor) Len() uint8 {\n\treturn 64\n}\n\n// Crc returns the HilSensor Message CRC\nfunc (*HilSensor) Crc() uint8 {\n\treturn 108\n}\n\n// Pack returns a packed byte array which represents a HilSensor payload\nfunc (m *HilSensor) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ABS_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DIFF_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PRESSURE_ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FIELDS_UPDATED); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HilSensor\nfunc (m *HilSensor) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ABS_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DIFF_PRESSURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PRESSURE_ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TEMPERATURE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FIELDS_UPDATED); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SIM_STATE\n//\n// MAVLINK_MSG_ID_SIM_STATE 108\n//\n// MAVLINK_MSG_ID_SIM_STATE_LEN 84\n//\n// MAVLINK_MSG_ID_SIM_STATE_CRC 32\ntype SimState struct {\n\tQ1           float32 // True attitude quaternion component 1, w (1 in null-rotation)\n\tQ2           float32 // True attitude quaternion component 2, x (0 in null-rotation)\n\tQ3           float32 // True attitude quaternion component 3, y (0 in null-rotation)\n\tQ4           float32 // True attitude quaternion component 4, z (0 in null-rotation)\n\tROLL         float32 // Attitude roll expressed as Euler angles, not recommended except for human-readable outputs\n\tPITCH        float32 // Attitude pitch expressed as Euler angles, not recommended except for human-readable outputs\n\tYAW          float32 // Attitude yaw expressed as Euler angles, not recommended except for human-readable outputs\n\tXACC         float32 // X acceleration m/s/s\n\tYACC         float32 // Y acceleration m/s/s\n\tZACC         float32 // Z acceleration m/s/s\n\tXGYRO        float32 // Angular speed around X axis rad/s\n\tYGYRO        float32 // Angular speed around Y axis rad/s\n\tZGYRO        float32 // Angular speed around Z axis rad/s\n\tLAT          float32 // Latitude in degrees\n\tLON          float32 // Longitude in degrees\n\tALT          float32 // Altitude in meters\n\tSTD_DEV_HORZ float32 // Horizontal position standard deviation\n\tSTD_DEV_VERT float32 // Vertical position standard deviation\n\tVN           float32 // True velocity in m/s in NORTH direction in earth-fixed NED frame\n\tVE           float32 // True velocity in m/s in EAST direction in earth-fixed NED frame\n\tVD           float32 // True velocity in m/s in DOWN direction in earth-fixed NED frame\n}\n\n// NewSimState returns a new SimState\nfunc NewSimState(Q1 float32, Q2 float32, Q3 float32, Q4 float32, ROLL float32, PITCH float32, YAW float32, XACC float32, YACC float32, ZACC float32, XGYRO float32, YGYRO float32, ZGYRO float32, LAT float32, LON float32, ALT float32, STD_DEV_HORZ float32, STD_DEV_VERT float32, VN float32, VE float32, VD float32) *SimState {\n\tm := SimState{}\n\tm.Q1 = Q1\n\tm.Q2 = Q2\n\tm.Q3 = Q3\n\tm.Q4 = Q4\n\tm.ROLL = ROLL\n\tm.PITCH = PITCH\n\tm.YAW = YAW\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\tm.XGYRO = XGYRO\n\tm.YGYRO = YGYRO\n\tm.ZGYRO = ZGYRO\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.ALT = ALT\n\tm.STD_DEV_HORZ = STD_DEV_HORZ\n\tm.STD_DEV_VERT = STD_DEV_VERT\n\tm.VN = VN\n\tm.VE = VE\n\tm.VD = VD\n\treturn &m\n}\n\n// Id returns the SimState Message ID\nfunc (*SimState) Id() uint8 {\n\treturn 108\n}\n\n// Len returns the SimState Message Length\nfunc (*SimState) Len() uint8 {\n\treturn 84\n}\n\n// Crc returns the SimState Message CRC\nfunc (*SimState) Crc() uint8 {\n\treturn 32\n}\n\n// Pack returns a packed byte array which represents a SimState payload\nfunc (m *SimState) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.Q1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Q4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.STD_DEV_HORZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.STD_DEV_VERT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VD); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SimState\nfunc (m *SimState) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Q4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.STD_DEV_HORZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.STD_DEV_VERT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VD); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE RADIO_STATUS\n//\n// MAVLINK_MSG_ID_RADIO_STATUS 109\n//\n// MAVLINK_MSG_ID_RADIO_STATUS_LEN 9\n//\n// MAVLINK_MSG_ID_RADIO_STATUS_CRC 185\ntype RadioStatus struct {\n\tRXERRORS uint16 // receive errors\n\tFIXED    uint16 // count of error corrected packets\n\tRSSI     uint8  // local signal strength\n\tREMRSSI  uint8  // remote signal strength\n\tTXBUF    uint8  // how full the tx buffer is as a percentage\n\tNOISE    uint8  // background noise level\n\tREMNOISE uint8  // remote background noise level\n}\n\n// NewRadioStatus returns a new RadioStatus\nfunc NewRadioStatus(RXERRORS uint16, FIXED uint16, RSSI uint8, REMRSSI uint8, TXBUF uint8, NOISE uint8, REMNOISE uint8) *RadioStatus {\n\tm := RadioStatus{}\n\tm.RXERRORS = RXERRORS\n\tm.FIXED = FIXED\n\tm.RSSI = RSSI\n\tm.REMRSSI = REMRSSI\n\tm.TXBUF = TXBUF\n\tm.NOISE = NOISE\n\tm.REMNOISE = REMNOISE\n\treturn &m\n}\n\n// Id returns the RadioStatus Message ID\nfunc (*RadioStatus) Id() uint8 {\n\treturn 109\n}\n\n// Len returns the RadioStatus Message Length\nfunc (*RadioStatus) Len() uint8 {\n\treturn 9\n}\n\n// Crc returns the RadioStatus Message CRC\nfunc (*RadioStatus) Crc() uint8 {\n\treturn 185\n}\n\n// Pack returns a packed byte array which represents a RadioStatus payload\nfunc (m *RadioStatus) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.RXERRORS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FIXED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.REMRSSI); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TXBUF); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NOISE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.REMNOISE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the RadioStatus\nfunc (m *RadioStatus) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.RXERRORS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FIXED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RSSI); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.REMRSSI); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TXBUF); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NOISE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.REMNOISE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE FILE_TRANSFER_START\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_START 110\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_START_LEN 254\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_START_CRC 235\ntype FileTransferStart struct {\n\tTRANSFER_UID uint64     // Unique transfer ID\n\tFILE_SIZE    uint32     // File size in bytes\n\tDEST_PATH    [240]uint8 // Destination path\n\tDIRECTION    uint8      // Transfer direction: 0: from requester, 1: to requester\n\tFLAGS        uint8      // RESERVED\n}\n\n// NewFileTransferStart returns a new FileTransferStart\nfunc NewFileTransferStart(TRANSFER_UID uint64, FILE_SIZE uint32, DEST_PATH [240]uint8, DIRECTION uint8, FLAGS uint8) *FileTransferStart {\n\tm := FileTransferStart{}\n\tm.TRANSFER_UID = TRANSFER_UID\n\tm.FILE_SIZE = FILE_SIZE\n\tm.DEST_PATH = DEST_PATH\n\tm.DIRECTION = DIRECTION\n\tm.FLAGS = FLAGS\n\treturn &m\n}\n\n// Id returns the FileTransferStart Message ID\nfunc (*FileTransferStart) Id() uint8 {\n\treturn 110\n}\n\n// Len returns the FileTransferStart Message Length\nfunc (*FileTransferStart) Len() uint8 {\n\treturn 254\n}\n\n// Crc returns the FileTransferStart Message CRC\nfunc (*FileTransferStart) Crc() uint8 {\n\treturn 235\n}\n\n// Pack returns a packed byte array which represents a FileTransferStart payload\nfunc (m *FileTransferStart) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TRANSFER_UID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FILE_SIZE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DEST_PATH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DIRECTION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the FileTransferStart\nfunc (m *FileTransferStart) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TRANSFER_UID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FILE_SIZE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DEST_PATH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DIRECTION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_FILE_TRANSFER_START_FIELD_dest_path_LEN = 240\n)\n\n// MESSAGE FILE_TRANSFER_DIR_LIST\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_DIR_LIST 111\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_DIR_LIST_LEN 249\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_DIR_LIST_CRC 93\ntype FileTransferDirList struct {\n\tTRANSFER_UID uint64     // Unique transfer ID\n\tDIR_PATH     [240]uint8 // Directory path to list\n\tFLAGS        uint8      // RESERVED\n}\n\n// NewFileTransferDirList returns a new FileTransferDirList\nfunc NewFileTransferDirList(TRANSFER_UID uint64, DIR_PATH [240]uint8, FLAGS uint8) *FileTransferDirList {\n\tm := FileTransferDirList{}\n\tm.TRANSFER_UID = TRANSFER_UID\n\tm.DIR_PATH = DIR_PATH\n\tm.FLAGS = FLAGS\n\treturn &m\n}\n\n// Id returns the FileTransferDirList Message ID\nfunc (*FileTransferDirList) Id() uint8 {\n\treturn 111\n}\n\n// Len returns the FileTransferDirList Message Length\nfunc (*FileTransferDirList) Len() uint8 {\n\treturn 249\n}\n\n// Crc returns the FileTransferDirList Message CRC\nfunc (*FileTransferDirList) Crc() uint8 {\n\treturn 93\n}\n\n// Pack returns a packed byte array which represents a FileTransferDirList payload\nfunc (m *FileTransferDirList) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TRANSFER_UID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DIR_PATH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the FileTransferDirList\nfunc (m *FileTransferDirList) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TRANSFER_UID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DIR_PATH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_FILE_TRANSFER_DIR_LIST_FIELD_dir_path_LEN = 240\n)\n\n// MESSAGE FILE_TRANSFER_RES\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_RES 112\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_RES_LEN 9\n//\n// MAVLINK_MSG_ID_FILE_TRANSFER_RES_CRC 124\ntype FileTransferRes struct {\n\tTRANSFER_UID uint64 // Unique transfer ID\n\tRESULT       uint8  // 0: OK, 1: not permitted, 2: bad path / file name, 3: no space left on device\n}\n\n// NewFileTransferRes returns a new FileTransferRes\nfunc NewFileTransferRes(TRANSFER_UID uint64, RESULT uint8) *FileTransferRes {\n\tm := FileTransferRes{}\n\tm.TRANSFER_UID = TRANSFER_UID\n\tm.RESULT = RESULT\n\treturn &m\n}\n\n// Id returns the FileTransferRes Message ID\nfunc (*FileTransferRes) Id() uint8 {\n\treturn 112\n}\n\n// Len returns the FileTransferRes Message Length\nfunc (*FileTransferRes) Len() uint8 {\n\treturn 9\n}\n\n// Crc returns the FileTransferRes Message CRC\nfunc (*FileTransferRes) Crc() uint8 {\n\treturn 124\n}\n\n// Pack returns a packed byte array which represents a FileTransferRes payload\nfunc (m *FileTransferRes) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TRANSFER_UID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RESULT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the FileTransferRes\nfunc (m *FileTransferRes) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TRANSFER_UID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RESULT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE HIL_GPS\n//\n// MAVLINK_MSG_ID_HIL_GPS 113\n//\n// MAVLINK_MSG_ID_HIL_GPS_LEN 36\n//\n// MAVLINK_MSG_ID_HIL_GPS_CRC 124\ntype HilGps struct {\n\tTIME_USEC          uint64 // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tLAT                int32  // Latitude (WGS84), in degrees * 1E7\n\tLON                int32  // Longitude (WGS84), in degrees * 1E7\n\tALT                int32  // Altitude (WGS84), in meters * 1000 (positive for up)\n\tEPH                uint16 // GPS HDOP horizontal dilution of position in cm (m*100). If unknown, set to: 65535\n\tEPV                uint16 // GPS VDOP vertical dilution of position in cm (m*100). If unknown, set to: 65535\n\tVEL                uint16 // GPS ground speed (m/s * 100). If unknown, set to: 65535\n\tVN                 int16  // GPS velocity in cm/s in NORTH direction in earth-fixed NED frame\n\tVE                 int16  // GPS velocity in cm/s in EAST direction in earth-fixed NED frame\n\tVD                 int16  // GPS velocity in cm/s in DOWN direction in earth-fixed NED frame\n\tCOG                uint16 // Course over ground (NOT heading, but direction of movement) in degrees * 100, 0.0..359.99 degrees. If unknown, set to: 65535\n\tFIX_TYPE           uint8  // 0-1: no fix, 2: 2D fix, 3: 3D fix. Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix.\n\tSATELLITES_VISIBLE uint8  // Number of satellites visible. If unknown, set to 255\n}\n\n// NewHilGps returns a new HilGps\nfunc NewHilGps(TIME_USEC uint64, LAT int32, LON int32, ALT int32, EPH uint16, EPV uint16, VEL uint16, VN int16, VE int16, VD int16, COG uint16, FIX_TYPE uint8, SATELLITES_VISIBLE uint8) *HilGps {\n\tm := HilGps{}\n\tm.TIME_USEC = TIME_USEC\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.ALT = ALT\n\tm.EPH = EPH\n\tm.EPV = EPV\n\tm.VEL = VEL\n\tm.VN = VN\n\tm.VE = VE\n\tm.VD = VD\n\tm.COG = COG\n\tm.FIX_TYPE = FIX_TYPE\n\tm.SATELLITES_VISIBLE = SATELLITES_VISIBLE\n\treturn &m\n}\n\n// Id returns the HilGps Message ID\nfunc (*HilGps) Id() uint8 {\n\treturn 113\n}\n\n// Len returns the HilGps Message Length\nfunc (*HilGps) Len() uint8 {\n\treturn 36\n}\n\n// Crc returns the HilGps Message CRC\nfunc (*HilGps) Crc() uint8 {\n\treturn 124\n}\n\n// Pack returns a packed byte array which represents a HilGps payload\nfunc (m *HilGps) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.EPH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.EPV); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VEL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VD); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FIX_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HilGps\nfunc (m *HilGps) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.EPH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.EPV); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VEL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VD); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FIX_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE HIL_OPTICAL_FLOW\n//\n// MAVLINK_MSG_ID_HIL_OPTICAL_FLOW 114\n//\n// MAVLINK_MSG_ID_HIL_OPTICAL_FLOW_LEN 26\n//\n// MAVLINK_MSG_ID_HIL_OPTICAL_FLOW_CRC 119\ntype HilOpticalFlow struct {\n\tTIME_USEC       uint64  // Timestamp (UNIX)\n\tFLOW_COMP_M_X   float32 // Flow in meters in x-sensor direction, angular-speed compensated\n\tFLOW_COMP_M_Y   float32 // Flow in meters in y-sensor direction, angular-speed compensated\n\tGROUND_DISTANCE float32 // Ground distance in meters. Positive value: distance known. Negative value: Unknown distance\n\tFLOW_X          int16   // Flow in pixels in x-sensor direction\n\tFLOW_Y          int16   // Flow in pixels in y-sensor direction\n\tSENSOR_ID       uint8   // Sensor ID\n\tQUALITY         uint8   // Optical flow quality / confidence. 0: bad, 255: maximum quality\n}\n\n// NewHilOpticalFlow returns a new HilOpticalFlow\nfunc NewHilOpticalFlow(TIME_USEC uint64, FLOW_COMP_M_X float32, FLOW_COMP_M_Y float32, GROUND_DISTANCE float32, FLOW_X int16, FLOW_Y int16, SENSOR_ID uint8, QUALITY uint8) *HilOpticalFlow {\n\tm := HilOpticalFlow{}\n\tm.TIME_USEC = TIME_USEC\n\tm.FLOW_COMP_M_X = FLOW_COMP_M_X\n\tm.FLOW_COMP_M_Y = FLOW_COMP_M_Y\n\tm.GROUND_DISTANCE = GROUND_DISTANCE\n\tm.FLOW_X = FLOW_X\n\tm.FLOW_Y = FLOW_Y\n\tm.SENSOR_ID = SENSOR_ID\n\tm.QUALITY = QUALITY\n\treturn &m\n}\n\n// Id returns the HilOpticalFlow Message ID\nfunc (*HilOpticalFlow) Id() uint8 {\n\treturn 114\n}\n\n// Len returns the HilOpticalFlow Message Length\nfunc (*HilOpticalFlow) Len() uint8 {\n\treturn 26\n}\n\n// Crc returns the HilOpticalFlow Message CRC\nfunc (*HilOpticalFlow) Crc() uint8 {\n\treturn 119\n}\n\n// Pack returns a packed byte array which represents a HilOpticalFlow payload\nfunc (m *HilOpticalFlow) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_COMP_M_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_COMP_M_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GROUND_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLOW_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SENSOR_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HilOpticalFlow\nfunc (m *HilOpticalFlow) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_COMP_M_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_COMP_M_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GROUND_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLOW_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SENSOR_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE HIL_STATE_QUATERNION\n//\n// MAVLINK_MSG_ID_HIL_STATE_QUATERNION 115\n//\n// MAVLINK_MSG_ID_HIL_STATE_QUATERNION_LEN 64\n//\n// MAVLINK_MSG_ID_HIL_STATE_QUATERNION_CRC 4\ntype HilStateQuaternion struct {\n\tTIME_USEC           uint64     // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tATTITUDE_QUATERNION [4]float32 // Vehicle attitude expressed as normalized quaternion in w, x, y, z order (with 1 0 0 0 being the null-rotation)\n\tROLLSPEED           float32    // Body frame roll / phi angular speed (rad/s)\n\tPITCHSPEED          float32    // Body frame pitch / theta angular speed (rad/s)\n\tYAWSPEED            float32    // Body frame yaw / psi angular speed (rad/s)\n\tLAT                 int32      // Latitude, expressed as * 1E7\n\tLON                 int32      // Longitude, expressed as * 1E7\n\tALT                 int32      // Altitude in meters, expressed as * 1000 (millimeters)\n\tVX                  int16      // Ground X Speed (Latitude), expressed as m/s * 100\n\tVY                  int16      // Ground Y Speed (Longitude), expressed as m/s * 100\n\tVZ                  int16      // Ground Z Speed (Altitude), expressed as m/s * 100\n\tIND_AIRSPEED        uint16     // Indicated airspeed, expressed as m/s * 100\n\tTRUE_AIRSPEED       uint16     // True airspeed, expressed as m/s * 100\n\tXACC                int16      // X acceleration (mg)\n\tYACC                int16      // Y acceleration (mg)\n\tZACC                int16      // Z acceleration (mg)\n}\n\n// NewHilStateQuaternion returns a new HilStateQuaternion\nfunc NewHilStateQuaternion(TIME_USEC uint64, ATTITUDE_QUATERNION [4]float32, ROLLSPEED float32, PITCHSPEED float32, YAWSPEED float32, LAT int32, LON int32, ALT int32, VX int16, VY int16, VZ int16, IND_AIRSPEED uint16, TRUE_AIRSPEED uint16, XACC int16, YACC int16, ZACC int16) *HilStateQuaternion {\n\tm := HilStateQuaternion{}\n\tm.TIME_USEC = TIME_USEC\n\tm.ATTITUDE_QUATERNION = ATTITUDE_QUATERNION\n\tm.ROLLSPEED = ROLLSPEED\n\tm.PITCHSPEED = PITCHSPEED\n\tm.YAWSPEED = YAWSPEED\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.ALT = ALT\n\tm.VX = VX\n\tm.VY = VY\n\tm.VZ = VZ\n\tm.IND_AIRSPEED = IND_AIRSPEED\n\tm.TRUE_AIRSPEED = TRUE_AIRSPEED\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\treturn &m\n}\n\n// Id returns the HilStateQuaternion Message ID\nfunc (*HilStateQuaternion) Id() uint8 {\n\treturn 115\n}\n\n// Len returns the HilStateQuaternion Message Length\nfunc (*HilStateQuaternion) Len() uint8 {\n\treturn 64\n}\n\n// Crc returns the HilStateQuaternion Message CRC\nfunc (*HilStateQuaternion) Crc() uint8 {\n\treturn 4\n}\n\n// Pack returns a packed byte array which represents a HilStateQuaternion payload\nfunc (m *HilStateQuaternion) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ATTITUDE_QUATERNION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.IND_AIRSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TRUE_AIRSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the HilStateQuaternion\nfunc (m *HilStateQuaternion) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ATTITUDE_QUATERNION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROLLSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PITCHSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YAWSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VX); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VZ); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.IND_AIRSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TRUE_AIRSPEED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_HIL_STATE_QUATERNION_FIELD_attitude_quaternion_LEN = 4\n)\n\n// MESSAGE SCALED_IMU2\n//\n// MAVLINK_MSG_ID_SCALED_IMU2 116\n//\n// MAVLINK_MSG_ID_SCALED_IMU2_LEN 22\n//\n// MAVLINK_MSG_ID_SCALED_IMU2_CRC 76\ntype ScaledImu2 struct {\n\tTIME_BOOT_MS uint32 // Timestamp (milliseconds since system boot)\n\tXACC         int16  // X acceleration (mg)\n\tYACC         int16  // Y acceleration (mg)\n\tZACC         int16  // Z acceleration (mg)\n\tXGYRO        int16  // Angular speed around X axis (millirad /sec)\n\tYGYRO        int16  // Angular speed around Y axis (millirad /sec)\n\tZGYRO        int16  // Angular speed around Z axis (millirad /sec)\n\tXMAG         int16  // X Magnetic field (milli tesla)\n\tYMAG         int16  // Y Magnetic field (milli tesla)\n\tZMAG         int16  // Z Magnetic field (milli tesla)\n}\n\n// NewScaledImu2 returns a new ScaledImu2\nfunc NewScaledImu2(TIME_BOOT_MS uint32, XACC int16, YACC int16, ZACC int16, XGYRO int16, YGYRO int16, ZGYRO int16, XMAG int16, YMAG int16, ZMAG int16) *ScaledImu2 {\n\tm := ScaledImu2{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.XACC = XACC\n\tm.YACC = YACC\n\tm.ZACC = ZACC\n\tm.XGYRO = XGYRO\n\tm.YGYRO = YGYRO\n\tm.ZGYRO = ZGYRO\n\tm.XMAG = XMAG\n\tm.YMAG = YMAG\n\tm.ZMAG = ZMAG\n\treturn &m\n}\n\n// Id returns the ScaledImu2 Message ID\nfunc (*ScaledImu2) Id() uint8 {\n\treturn 116\n}\n\n// Len returns the ScaledImu2 Message Length\nfunc (*ScaledImu2) Len() uint8 {\n\treturn 22\n}\n\n// Crc returns the ScaledImu2 Message CRC\nfunc (*ScaledImu2) Crc() uint8 {\n\treturn 76\n}\n\n// Pack returns a packed byte array which represents a ScaledImu2 payload\nfunc (m *ScaledImu2) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the ScaledImu2\nfunc (m *ScaledImu2) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZACC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZGYRO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.XMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.YMAG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ZMAG); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOG_REQUEST_LIST\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_LIST 117\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_LIST_LEN 6\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_LIST_CRC 128\ntype LogRequestList struct {\n\tSTART            uint16 // First log id (0 for first available)\n\tEND              uint16 // Last log id (0xffff for last available)\n\tTARGET_SYSTEM    uint8  // System ID\n\tTARGET_COMPONENT uint8  // Component ID\n}\n\n// NewLogRequestList returns a new LogRequestList\nfunc NewLogRequestList(START uint16, END uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *LogRequestList {\n\tm := LogRequestList{}\n\tm.START = START\n\tm.END = END\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the LogRequestList Message ID\nfunc (*LogRequestList) Id() uint8 {\n\treturn 117\n}\n\n// Len returns the LogRequestList Message Length\nfunc (*LogRequestList) Len() uint8 {\n\treturn 6\n}\n\n// Crc returns the LogRequestList Message CRC\nfunc (*LogRequestList) Crc() uint8 {\n\treturn 128\n}\n\n// Pack returns a packed byte array which represents a LogRequestList payload\nfunc (m *LogRequestList) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.START); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.END); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LogRequestList\nfunc (m *LogRequestList) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.START); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.END); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOG_ENTRY\n//\n// MAVLINK_MSG_ID_LOG_ENTRY 118\n//\n// MAVLINK_MSG_ID_LOG_ENTRY_LEN 14\n//\n// MAVLINK_MSG_ID_LOG_ENTRY_CRC 56\ntype LogEntry struct {\n\tTIME_UTC     uint32 // UTC timestamp of log in seconds since 1970, or 0 if not available\n\tSIZE         uint32 // Size of the log (may be approximate) in bytes\n\tID           uint16 // Log id\n\tNUM_LOGS     uint16 // Total number of logs\n\tLAST_LOG_NUM uint16 // High log number\n}\n\n// NewLogEntry returns a new LogEntry\nfunc NewLogEntry(TIME_UTC uint32, SIZE uint32, ID uint16, NUM_LOGS uint16, LAST_LOG_NUM uint16) *LogEntry {\n\tm := LogEntry{}\n\tm.TIME_UTC = TIME_UTC\n\tm.SIZE = SIZE\n\tm.ID = ID\n\tm.NUM_LOGS = NUM_LOGS\n\tm.LAST_LOG_NUM = LAST_LOG_NUM\n\treturn &m\n}\n\n// Id returns the LogEntry Message ID\nfunc (*LogEntry) Id() uint8 {\n\treturn 118\n}\n\n// Len returns the LogEntry Message Length\nfunc (*LogEntry) Len() uint8 {\n\treturn 14\n}\n\n// Crc returns the LogEntry Message CRC\nfunc (*LogEntry) Crc() uint8 {\n\treturn 56\n}\n\n// Pack returns a packed byte array which represents a LogEntry payload\nfunc (m *LogEntry) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_UTC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SIZE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NUM_LOGS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAST_LOG_NUM); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LogEntry\nfunc (m *LogEntry) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_UTC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SIZE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NUM_LOGS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAST_LOG_NUM); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOG_REQUEST_DATA\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_DATA 119\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_DATA_LEN 12\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_DATA_CRC 116\ntype LogRequestData struct {\n\tOFS              uint32 // Offset into the log\n\tCOUNT            uint32 // Number of bytes\n\tID               uint16 // Log id (from LOG_ENTRY reply)\n\tTARGET_SYSTEM    uint8  // System ID\n\tTARGET_COMPONENT uint8  // Component ID\n}\n\n// NewLogRequestData returns a new LogRequestData\nfunc NewLogRequestData(OFS uint32, COUNT uint32, ID uint16, TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *LogRequestData {\n\tm := LogRequestData{}\n\tm.OFS = OFS\n\tm.COUNT = COUNT\n\tm.ID = ID\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the LogRequestData Message ID\nfunc (*LogRequestData) Id() uint8 {\n\treturn 119\n}\n\n// Len returns the LogRequestData Message Length\nfunc (*LogRequestData) Len() uint8 {\n\treturn 12\n}\n\n// Crc returns the LogRequestData Message CRC\nfunc (*LogRequestData) Crc() uint8 {\n\treturn 116\n}\n\n// Pack returns a packed byte array which represents a LogRequestData payload\nfunc (m *LogRequestData) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.OFS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LogRequestData\nfunc (m *LogRequestData) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.OFS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOG_DATA\n//\n// MAVLINK_MSG_ID_LOG_DATA 120\n//\n// MAVLINK_MSG_ID_LOG_DATA_LEN 97\n//\n// MAVLINK_MSG_ID_LOG_DATA_CRC 134\ntype LogData struct {\n\tOFS   uint32    // Offset into the log\n\tID    uint16    // Log id (from LOG_ENTRY reply)\n\tCOUNT uint8     // Number of bytes (zero for end of log)\n\tDATA  [90]uint8 // log data\n}\n\n// NewLogData returns a new LogData\nfunc NewLogData(OFS uint32, ID uint16, COUNT uint8, DATA [90]uint8) *LogData {\n\tm := LogData{}\n\tm.OFS = OFS\n\tm.ID = ID\n\tm.COUNT = COUNT\n\tm.DATA = DATA\n\treturn &m\n}\n\n// Id returns the LogData Message ID\nfunc (*LogData) Id() uint8 {\n\treturn 120\n}\n\n// Len returns the LogData Message Length\nfunc (*LogData) Len() uint8 {\n\treturn 97\n}\n\n// Crc returns the LogData Message CRC\nfunc (*LogData) Crc() uint8 {\n\treturn 134\n}\n\n// Pack returns a packed byte array which represents a LogData payload\nfunc (m *LogData) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.OFS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LogData\nfunc (m *LogData) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.OFS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_LOG_DATA_FIELD_data_LEN = 90\n)\n\n// MESSAGE LOG_ERASE\n//\n// MAVLINK_MSG_ID_LOG_ERASE 121\n//\n// MAVLINK_MSG_ID_LOG_ERASE_LEN 2\n//\n// MAVLINK_MSG_ID_LOG_ERASE_CRC 237\ntype LogErase struct {\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n}\n\n// NewLogErase returns a new LogErase\nfunc NewLogErase(TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *LogErase {\n\tm := LogErase{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the LogErase Message ID\nfunc (*LogErase) Id() uint8 {\n\treturn 121\n}\n\n// Len returns the LogErase Message Length\nfunc (*LogErase) Len() uint8 {\n\treturn 2\n}\n\n// Crc returns the LogErase Message CRC\nfunc (*LogErase) Crc() uint8 {\n\treturn 237\n}\n\n// Pack returns a packed byte array which represents a LogErase payload\nfunc (m *LogErase) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LogErase\nfunc (m *LogErase) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE LOG_REQUEST_END\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_END 122\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_END_LEN 2\n//\n// MAVLINK_MSG_ID_LOG_REQUEST_END_CRC 203\ntype LogRequestEnd struct {\n\tTARGET_SYSTEM    uint8 // System ID\n\tTARGET_COMPONENT uint8 // Component ID\n}\n\n// NewLogRequestEnd returns a new LogRequestEnd\nfunc NewLogRequestEnd(TARGET_SYSTEM uint8, TARGET_COMPONENT uint8) *LogRequestEnd {\n\tm := LogRequestEnd{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\treturn &m\n}\n\n// Id returns the LogRequestEnd Message ID\nfunc (*LogRequestEnd) Id() uint8 {\n\treturn 122\n}\n\n// Len returns the LogRequestEnd Message Length\nfunc (*LogRequestEnd) Len() uint8 {\n\treturn 2\n}\n\n// Crc returns the LogRequestEnd Message CRC\nfunc (*LogRequestEnd) Crc() uint8 {\n\treturn 203\n}\n\n// Pack returns a packed byte array which represents a LogRequestEnd payload\nfunc (m *LogRequestEnd) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the LogRequestEnd\nfunc (m *LogRequestEnd) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GPS_INJECT_DATA\n//\n// MAVLINK_MSG_ID_GPS_INJECT_DATA 123\n//\n// MAVLINK_MSG_ID_GPS_INJECT_DATA_LEN 113\n//\n// MAVLINK_MSG_ID_GPS_INJECT_DATA_CRC 250\ntype GpsInjectData struct {\n\tTARGET_SYSTEM    uint8      // System ID\n\tTARGET_COMPONENT uint8      // Component ID\n\tLEN              uint8      // data length\n\tDATA             [110]uint8 // raw data (110 is enough for 12 satellites of RTCMv2)\n}\n\n// NewGpsInjectData returns a new GpsInjectData\nfunc NewGpsInjectData(TARGET_SYSTEM uint8, TARGET_COMPONENT uint8, LEN uint8, DATA [110]uint8) *GpsInjectData {\n\tm := GpsInjectData{}\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\tm.TARGET_COMPONENT = TARGET_COMPONENT\n\tm.LEN = LEN\n\tm.DATA = DATA\n\treturn &m\n}\n\n// Id returns the GpsInjectData Message ID\nfunc (*GpsInjectData) Id() uint8 {\n\treturn 123\n}\n\n// Len returns the GpsInjectData Message Length\nfunc (*GpsInjectData) Len() uint8 {\n\treturn 113\n}\n\n// Crc returns the GpsInjectData Message CRC\nfunc (*GpsInjectData) Crc() uint8 {\n\treturn 250\n}\n\n// Pack returns a packed byte array which represents a GpsInjectData payload\nfunc (m *GpsInjectData) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LEN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GpsInjectData\nfunc (m *GpsInjectData) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_COMPONENT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LEN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_GPS_INJECT_DATA_FIELD_data_LEN = 110\n)\n\n// MESSAGE GPS2_RAW\n//\n// MAVLINK_MSG_ID_GPS2_RAW 124\n//\n// MAVLINK_MSG_ID_GPS2_RAW_LEN 35\n//\n// MAVLINK_MSG_ID_GPS2_RAW_CRC 87\ntype Gps2Raw struct {\n\tTIME_USEC          uint64 // Timestamp (microseconds since UNIX epoch or microseconds since system boot)\n\tLAT                int32  // Latitude (WGS84), in degrees * 1E7\n\tLON                int32  // Longitude (WGS84), in degrees * 1E7\n\tALT                int32  // Altitude (WGS84), in meters * 1000 (positive for up)\n\tDGPS_AGE           uint32 // Age of DGPS info\n\tEPH                uint16 // GPS HDOP horizontal dilution of position in cm (m*100). If unknown, set to: UINT16_MAX\n\tEPV                uint16 // GPS VDOP vertical dilution of position in cm (m*100). If unknown, set to: UINT16_MAX\n\tVEL                uint16 // GPS ground speed (m/s * 100). If unknown, set to: UINT16_MAX\n\tCOG                uint16 // Course over ground (NOT heading, but direction of movement) in degrees * 100, 0.0..359.99 degrees. If unknown, set to: UINT16_MAX\n\tFIX_TYPE           uint8  // 0-1: no fix, 2: 2D fix, 3: 3D fix, 4: DGPS fix, 5: RTK Fix. Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix.\n\tSATELLITES_VISIBLE uint8  // Number of satellites visible. If unknown, set to 255\n\tDGPS_NUMCH         uint8  // Number of DGPS satellites\n}\n\n// NewGps2Raw returns a new Gps2Raw\nfunc NewGps2Raw(TIME_USEC uint64, LAT int32, LON int32, ALT int32, DGPS_AGE uint32, EPH uint16, EPV uint16, VEL uint16, COG uint16, FIX_TYPE uint8, SATELLITES_VISIBLE uint8, DGPS_NUMCH uint8) *Gps2Raw {\n\tm := Gps2Raw{}\n\tm.TIME_USEC = TIME_USEC\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.ALT = ALT\n\tm.DGPS_AGE = DGPS_AGE\n\tm.EPH = EPH\n\tm.EPV = EPV\n\tm.VEL = VEL\n\tm.COG = COG\n\tm.FIX_TYPE = FIX_TYPE\n\tm.SATELLITES_VISIBLE = SATELLITES_VISIBLE\n\tm.DGPS_NUMCH = DGPS_NUMCH\n\treturn &m\n}\n\n// Id returns the Gps2Raw Message ID\nfunc (*Gps2Raw) Id() uint8 {\n\treturn 124\n}\n\n// Len returns the Gps2Raw Message Length\nfunc (*Gps2Raw) Len() uint8 {\n\treturn 35\n}\n\n// Crc returns the Gps2Raw Message CRC\nfunc (*Gps2Raw) Crc() uint8 {\n\treturn 87\n}\n\n// Pack returns a packed byte array which represents a Gps2Raw payload\nfunc (m *Gps2Raw) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DGPS_AGE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.EPH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.EPV); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VEL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FIX_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DGPS_NUMCH); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Gps2Raw\nfunc (m *Gps2Raw) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ALT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DGPS_AGE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.EPH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.EPV); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VEL); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COG); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FIX_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SATELLITES_VISIBLE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DGPS_NUMCH); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE POWER_STATUS\n//\n// MAVLINK_MSG_ID_POWER_STATUS 125\n//\n// MAVLINK_MSG_ID_POWER_STATUS_LEN 6\n//\n// MAVLINK_MSG_ID_POWER_STATUS_CRC 203\ntype PowerStatus struct {\n\tVCC    uint16 // 5V rail voltage in millivolts\n\tVSERVO uint16 // servo rail voltage in millivolts\n\tFLAGS  uint16 // power supply status flags (see MAV_POWER_STATUS enum)\n}\n\n// NewPowerStatus returns a new PowerStatus\nfunc NewPowerStatus(VCC uint16, VSERVO uint16, FLAGS uint16) *PowerStatus {\n\tm := PowerStatus{}\n\tm.VCC = VCC\n\tm.VSERVO = VSERVO\n\tm.FLAGS = FLAGS\n\treturn &m\n}\n\n// Id returns the PowerStatus Message ID\nfunc (*PowerStatus) Id() uint8 {\n\treturn 125\n}\n\n// Len returns the PowerStatus Message Length\nfunc (*PowerStatus) Len() uint8 {\n\treturn 6\n}\n\n// Crc returns the PowerStatus Message CRC\nfunc (*PowerStatus) Crc() uint8 {\n\treturn 203\n}\n\n// Pack returns a packed byte array which represents a PowerStatus payload\nfunc (m *PowerStatus) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.VCC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VSERVO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the PowerStatus\nfunc (m *PowerStatus) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.VCC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VSERVO); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SERIAL_CONTROL\n//\n// MAVLINK_MSG_ID_SERIAL_CONTROL 126\n//\n// MAVLINK_MSG_ID_SERIAL_CONTROL_LEN 79\n//\n// MAVLINK_MSG_ID_SERIAL_CONTROL_CRC 220\ntype SerialControl struct {\n\tBAUDRATE uint32    // Baudrate of transfer. Zero means no change.\n\tTIMEOUT  uint16    // Timeout for reply data in milliseconds\n\tDEVICE   uint8     // See SERIAL_CONTROL_DEV enum\n\tFLAGS    uint8     // See SERIAL_CONTROL_FLAG enum\n\tCOUNT    uint8     // how many bytes in this transfer\n\tDATA     [70]uint8 // serial data\n}\n\n// NewSerialControl returns a new SerialControl\nfunc NewSerialControl(BAUDRATE uint32, TIMEOUT uint16, DEVICE uint8, FLAGS uint8, COUNT uint8, DATA [70]uint8) *SerialControl {\n\tm := SerialControl{}\n\tm.BAUDRATE = BAUDRATE\n\tm.TIMEOUT = TIMEOUT\n\tm.DEVICE = DEVICE\n\tm.FLAGS = FLAGS\n\tm.COUNT = COUNT\n\tm.DATA = DATA\n\treturn &m\n}\n\n// Id returns the SerialControl Message ID\nfunc (*SerialControl) Id() uint8 {\n\treturn 126\n}\n\n// Len returns the SerialControl Message Length\nfunc (*SerialControl) Len() uint8 {\n\treturn 79\n}\n\n// Crc returns the SerialControl Message CRC\nfunc (*SerialControl) Crc() uint8 {\n\treturn 220\n}\n\n// Pack returns a packed byte array which represents a SerialControl payload\nfunc (m *SerialControl) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.BAUDRATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TIMEOUT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DEVICE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the SerialControl\nfunc (m *SerialControl) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.BAUDRATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIMEOUT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DEVICE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.FLAGS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COUNT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_SERIAL_CONTROL_FIELD_data_LEN = 70\n)\n\n// MESSAGE GPS_RTK\n//\n// MAVLINK_MSG_ID_GPS_RTK 127\n//\n// MAVLINK_MSG_ID_GPS_RTK_LEN 35\n//\n// MAVLINK_MSG_ID_GPS_RTK_CRC 25\ntype GpsRtk struct {\n\tTIME_LAST_BASELINE_MS uint32 // Time since boot of last baseline message received in ms.\n\tTOW                   uint32 // GPS Time of Week of last baseline\n\tBASELINE_A_MM         int32  // Current baseline in ECEF x or NED north component in mm.\n\tBASELINE_B_MM         int32  // Current baseline in ECEF y or NED east component in mm.\n\tBASELINE_C_MM         int32  // Current baseline in ECEF z or NED down component in mm.\n\tACCURACY              uint32 // Current estimate of baseline accuracy.\n\tIAR_NUM_HYPOTHESES    int32  // Current number of integer ambiguity hypotheses.\n\tWN                    uint16 // GPS Week Number of last baseline\n\tRTK_RECEIVER_ID       uint8  // Identification of connected RTK receiver.\n\tRTK_HEALTH            uint8  // GPS-specific health report for RTK data.\n\tRTK_RATE              uint8  // Rate of baseline messages being received by GPS, in HZ\n\tNSATS                 uint8  // Current number of sats used for RTK calculation.\n\tBASELINE_COORDS_TYPE  uint8  // Coordinate system of baseline. 0 == ECEF, 1 == NED\n}\n\n// NewGpsRtk returns a new GpsRtk\nfunc NewGpsRtk(TIME_LAST_BASELINE_MS uint32, TOW uint32, BASELINE_A_MM int32, BASELINE_B_MM int32, BASELINE_C_MM int32, ACCURACY uint32, IAR_NUM_HYPOTHESES int32, WN uint16, RTK_RECEIVER_ID uint8, RTK_HEALTH uint8, RTK_RATE uint8, NSATS uint8, BASELINE_COORDS_TYPE uint8) *GpsRtk {\n\tm := GpsRtk{}\n\tm.TIME_LAST_BASELINE_MS = TIME_LAST_BASELINE_MS\n\tm.TOW = TOW\n\tm.BASELINE_A_MM = BASELINE_A_MM\n\tm.BASELINE_B_MM = BASELINE_B_MM\n\tm.BASELINE_C_MM = BASELINE_C_MM\n\tm.ACCURACY = ACCURACY\n\tm.IAR_NUM_HYPOTHESES = IAR_NUM_HYPOTHESES\n\tm.WN = WN\n\tm.RTK_RECEIVER_ID = RTK_RECEIVER_ID\n\tm.RTK_HEALTH = RTK_HEALTH\n\tm.RTK_RATE = RTK_RATE\n\tm.NSATS = NSATS\n\tm.BASELINE_COORDS_TYPE = BASELINE_COORDS_TYPE\n\treturn &m\n}\n\n// Id returns the GpsRtk Message ID\nfunc (*GpsRtk) Id() uint8 {\n\treturn 127\n}\n\n// Len returns the GpsRtk Message Length\nfunc (*GpsRtk) Len() uint8 {\n\treturn 35\n}\n\n// Crc returns the GpsRtk Message CRC\nfunc (*GpsRtk) Crc() uint8 {\n\treturn 25\n}\n\n// Pack returns a packed byte array which represents a GpsRtk payload\nfunc (m *GpsRtk) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_LAST_BASELINE_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TOW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_A_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_B_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_C_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ACCURACY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.IAR_NUM_HYPOTHESES); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.WN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RTK_RECEIVER_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RTK_HEALTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RTK_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NSATS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_COORDS_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the GpsRtk\nfunc (m *GpsRtk) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_LAST_BASELINE_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TOW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_A_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_B_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_C_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ACCURACY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.IAR_NUM_HYPOTHESES); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.WN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RTK_RECEIVER_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RTK_HEALTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RTK_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NSATS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_COORDS_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE GPS2_RTK\n//\n// MAVLINK_MSG_ID_GPS2_RTK 128\n//\n// MAVLINK_MSG_ID_GPS2_RTK_LEN 35\n//\n// MAVLINK_MSG_ID_GPS2_RTK_CRC 226\ntype Gps2Rtk struct {\n\tTIME_LAST_BASELINE_MS uint32 // Time since boot of last baseline message received in ms.\n\tTOW                   uint32 // GPS Time of Week of last baseline\n\tBASELINE_A_MM         int32  // Current baseline in ECEF x or NED north component in mm.\n\tBASELINE_B_MM         int32  // Current baseline in ECEF y or NED east component in mm.\n\tBASELINE_C_MM         int32  // Current baseline in ECEF z or NED down component in mm.\n\tACCURACY              uint32 // Current estimate of baseline accuracy.\n\tIAR_NUM_HYPOTHESES    int32  // Current number of integer ambiguity hypotheses.\n\tWN                    uint16 // GPS Week Number of last baseline\n\tRTK_RECEIVER_ID       uint8  // Identification of connected RTK receiver.\n\tRTK_HEALTH            uint8  // GPS-specific health report for RTK data.\n\tRTK_RATE              uint8  // Rate of baseline messages being received by GPS, in HZ\n\tNSATS                 uint8  // Current number of sats used for RTK calculation.\n\tBASELINE_COORDS_TYPE  uint8  // Coordinate system of baseline. 0 == ECEF, 1 == NED\n}\n\n// NewGps2Rtk returns a new Gps2Rtk\nfunc NewGps2Rtk(TIME_LAST_BASELINE_MS uint32, TOW uint32, BASELINE_A_MM int32, BASELINE_B_MM int32, BASELINE_C_MM int32, ACCURACY uint32, IAR_NUM_HYPOTHESES int32, WN uint16, RTK_RECEIVER_ID uint8, RTK_HEALTH uint8, RTK_RATE uint8, NSATS uint8, BASELINE_COORDS_TYPE uint8) *Gps2Rtk {\n\tm := Gps2Rtk{}\n\tm.TIME_LAST_BASELINE_MS = TIME_LAST_BASELINE_MS\n\tm.TOW = TOW\n\tm.BASELINE_A_MM = BASELINE_A_MM\n\tm.BASELINE_B_MM = BASELINE_B_MM\n\tm.BASELINE_C_MM = BASELINE_C_MM\n\tm.ACCURACY = ACCURACY\n\tm.IAR_NUM_HYPOTHESES = IAR_NUM_HYPOTHESES\n\tm.WN = WN\n\tm.RTK_RECEIVER_ID = RTK_RECEIVER_ID\n\tm.RTK_HEALTH = RTK_HEALTH\n\tm.RTK_RATE = RTK_RATE\n\tm.NSATS = NSATS\n\tm.BASELINE_COORDS_TYPE = BASELINE_COORDS_TYPE\n\treturn &m\n}\n\n// Id returns the Gps2Rtk Message ID\nfunc (*Gps2Rtk) Id() uint8 {\n\treturn 128\n}\n\n// Len returns the Gps2Rtk Message Length\nfunc (*Gps2Rtk) Len() uint8 {\n\treturn 35\n}\n\n// Crc returns the Gps2Rtk Message CRC\nfunc (*Gps2Rtk) Crc() uint8 {\n\treturn 226\n}\n\n// Pack returns a packed byte array which represents a Gps2Rtk payload\nfunc (m *Gps2Rtk) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_LAST_BASELINE_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TOW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_A_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_B_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_C_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ACCURACY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.IAR_NUM_HYPOTHESES); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.WN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RTK_RECEIVER_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RTK_HEALTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.RTK_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NSATS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BASELINE_COORDS_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Gps2Rtk\nfunc (m *Gps2Rtk) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_LAST_BASELINE_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TOW); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_A_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_B_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_C_MM); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ACCURACY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.IAR_NUM_HYPOTHESES); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.WN); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RTK_RECEIVER_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RTK_HEALTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.RTK_RATE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NSATS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BASELINE_COORDS_TYPE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE DATA_TRANSMISSION_HANDSHAKE\n//\n// MAVLINK_MSG_ID_DATA_TRANSMISSION_HANDSHAKE 130\n//\n// MAVLINK_MSG_ID_DATA_TRANSMISSION_HANDSHAKE_LEN 13\n//\n// MAVLINK_MSG_ID_DATA_TRANSMISSION_HANDSHAKE_CRC 29\ntype DataTransmissionHandshake struct {\n\tSIZE        uint32 // total data size in bytes (set on ACK only)\n\tWIDTH       uint16 // Width of a matrix or image\n\tHEIGHT      uint16 // Height of a matrix or image\n\tPACKETS     uint16 // number of packets being sent (set on ACK only)\n\tTYPE        uint8  // type of requested/acknowledged data (as defined in ENUM DATA_TYPES in mavlink/include/mavlink_types.h)\n\tPAYLOAD     uint8  // payload size per packet (normally 253 byte, see DATA field size in message ENCAPSULATED_DATA) (set on ACK only)\n\tJPG_QUALITY uint8  // JPEG quality out of [1,100]\n}\n\n// NewDataTransmissionHandshake returns a new DataTransmissionHandshake\nfunc NewDataTransmissionHandshake(SIZE uint32, WIDTH uint16, HEIGHT uint16, PACKETS uint16, TYPE uint8, PAYLOAD uint8, JPG_QUALITY uint8) *DataTransmissionHandshake {\n\tm := DataTransmissionHandshake{}\n\tm.SIZE = SIZE\n\tm.WIDTH = WIDTH\n\tm.HEIGHT = HEIGHT\n\tm.PACKETS = PACKETS\n\tm.TYPE = TYPE\n\tm.PAYLOAD = PAYLOAD\n\tm.JPG_QUALITY = JPG_QUALITY\n\treturn &m\n}\n\n// Id returns the DataTransmissionHandshake Message ID\nfunc (*DataTransmissionHandshake) Id() uint8 {\n\treturn 130\n}\n\n// Len returns the DataTransmissionHandshake Message Length\nfunc (*DataTransmissionHandshake) Len() uint8 {\n\treturn 13\n}\n\n// Crc returns the DataTransmissionHandshake Message CRC\nfunc (*DataTransmissionHandshake) Crc() uint8 {\n\treturn 29\n}\n\n// Pack returns a packed byte array which represents a DataTransmissionHandshake payload\nfunc (m *DataTransmissionHandshake) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SIZE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.WIDTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.HEIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PACKETS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PAYLOAD); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.JPG_QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the DataTransmissionHandshake\nfunc (m *DataTransmissionHandshake) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SIZE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.WIDTH); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.HEIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PACKETS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PAYLOAD); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.JPG_QUALITY); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE ENCAPSULATED_DATA\n//\n// MAVLINK_MSG_ID_ENCAPSULATED_DATA 131\n//\n// MAVLINK_MSG_ID_ENCAPSULATED_DATA_LEN 255\n//\n// MAVLINK_MSG_ID_ENCAPSULATED_DATA_CRC 223\ntype EncapsulatedData struct {\n\tSEQNR uint16     // sequence number (starting with 0 on every transmission)\n\tDATA  [253]uint8 // image data bytes\n}\n\n// NewEncapsulatedData returns a new EncapsulatedData\nfunc NewEncapsulatedData(SEQNR uint16, DATA [253]uint8) *EncapsulatedData {\n\tm := EncapsulatedData{}\n\tm.SEQNR = SEQNR\n\tm.DATA = DATA\n\treturn &m\n}\n\n// Id returns the EncapsulatedData Message ID\nfunc (*EncapsulatedData) Id() uint8 {\n\treturn 131\n}\n\n// Len returns the EncapsulatedData Message Length\nfunc (*EncapsulatedData) Len() uint8 {\n\treturn 255\n}\n\n// Crc returns the EncapsulatedData Message CRC\nfunc (*EncapsulatedData) Crc() uint8 {\n\treturn 223\n}\n\n// Pack returns a packed byte array which represents a EncapsulatedData payload\nfunc (m *EncapsulatedData) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SEQNR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the EncapsulatedData\nfunc (m *EncapsulatedData) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEQNR); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_ENCAPSULATED_DATA_FIELD_data_LEN = 253\n)\n\n// MESSAGE DISTANCE_SENSOR\n//\n// MAVLINK_MSG_ID_DISTANCE_SENSOR 132\n//\n// MAVLINK_MSG_ID_DISTANCE_SENSOR_LEN 14\n//\n// MAVLINK_MSG_ID_DISTANCE_SENSOR_CRC 85\ntype DistanceSensor struct {\n\tTIME_BOOT_MS     uint32 // Time since system boot\n\tMIN_DISTANCE     uint16 // Minimum distance the sensor can measure in centimeters\n\tMAX_DISTANCE     uint16 // Maximum distance the sensor can measure in centimeters\n\tCURRENT_DISTANCE uint16 // Current distance reading\n\tTYPE             uint8  // Type from MAV_DISTANCE_SENSOR enum.\n\tID               uint8  // Onboard ID of the sensor\n\tORIENTATION      uint8  // Direction the sensor faces from FIXME enum.\n\tCOVARIANCE       uint8  // Measurement covariance in centimeters, 0 for unknown / invalid readings\n}\n\n// NewDistanceSensor returns a new DistanceSensor\nfunc NewDistanceSensor(TIME_BOOT_MS uint32, MIN_DISTANCE uint16, MAX_DISTANCE uint16, CURRENT_DISTANCE uint16, TYPE uint8, ID uint8, ORIENTATION uint8, COVARIANCE uint8) *DistanceSensor {\n\tm := DistanceSensor{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.MIN_DISTANCE = MIN_DISTANCE\n\tm.MAX_DISTANCE = MAX_DISTANCE\n\tm.CURRENT_DISTANCE = CURRENT_DISTANCE\n\tm.TYPE = TYPE\n\tm.ID = ID\n\tm.ORIENTATION = ORIENTATION\n\tm.COVARIANCE = COVARIANCE\n\treturn &m\n}\n\n// Id returns the DistanceSensor Message ID\nfunc (*DistanceSensor) Id() uint8 {\n\treturn 132\n}\n\n// Len returns the DistanceSensor Message Length\nfunc (*DistanceSensor) Len() uint8 {\n\treturn 14\n}\n\n// Crc returns the DistanceSensor Message CRC\nfunc (*DistanceSensor) Crc() uint8 {\n\treturn 85\n}\n\n// Pack returns a packed byte array which represents a DistanceSensor payload\nfunc (m *DistanceSensor) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MIN_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MAX_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CURRENT_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ORIENTATION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.COVARIANCE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the DistanceSensor\nfunc (m *DistanceSensor) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MIN_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.MAX_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CURRENT_DISTANCE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ORIENTATION); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.COVARIANCE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE TERRAIN_REQUEST\n//\n// MAVLINK_MSG_ID_TERRAIN_REQUEST 133\n//\n// MAVLINK_MSG_ID_TERRAIN_REQUEST_LEN 18\n//\n// MAVLINK_MSG_ID_TERRAIN_REQUEST_CRC 6\ntype TerrainRequest struct {\n\tMASK         uint64 // Bitmask of requested 4x4 grids (row major 8x7 array of grids, 56 bits)\n\tLAT          int32  // Latitude of SW corner of first grid (degrees *10^7)\n\tLON          int32  // Longitude of SW corner of first grid (in degrees *10^7)\n\tGRID_SPACING uint16 // Grid spacing in meters\n}\n\n// NewTerrainRequest returns a new TerrainRequest\nfunc NewTerrainRequest(MASK uint64, LAT int32, LON int32, GRID_SPACING uint16) *TerrainRequest {\n\tm := TerrainRequest{}\n\tm.MASK = MASK\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.GRID_SPACING = GRID_SPACING\n\treturn &m\n}\n\n// Id returns the TerrainRequest Message ID\nfunc (*TerrainRequest) Id() uint8 {\n\treturn 133\n}\n\n// Len returns the TerrainRequest Message Length\nfunc (*TerrainRequest) Len() uint8 {\n\treturn 18\n}\n\n// Crc returns the TerrainRequest Message CRC\nfunc (*TerrainRequest) Crc() uint8 {\n\treturn 6\n}\n\n// Pack returns a packed byte array which represents a TerrainRequest payload\nfunc (m *TerrainRequest) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.MASK); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GRID_SPACING); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the TerrainRequest\nfunc (m *TerrainRequest) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.MASK); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GRID_SPACING); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE TERRAIN_DATA\n//\n// MAVLINK_MSG_ID_TERRAIN_DATA 134\n//\n// MAVLINK_MSG_ID_TERRAIN_DATA_LEN 43\n//\n// MAVLINK_MSG_ID_TERRAIN_DATA_CRC 229\ntype TerrainData struct {\n\tLAT          int32     // Latitude of SW corner of first grid (degrees *10^7)\n\tLON          int32     // Longitude of SW corner of first grid (in degrees *10^7)\n\tGRID_SPACING uint16    // Grid spacing in meters\n\tDATA         [16]int16 // Terrain data in meters AMSL\n\tGRIDBIT      uint8     // bit within the terrain request mask\n}\n\n// NewTerrainData returns a new TerrainData\nfunc NewTerrainData(LAT int32, LON int32, GRID_SPACING uint16, DATA [16]int16, GRIDBIT uint8) *TerrainData {\n\tm := TerrainData{}\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.GRID_SPACING = GRID_SPACING\n\tm.DATA = DATA\n\tm.GRIDBIT = GRIDBIT\n\treturn &m\n}\n\n// Id returns the TerrainData Message ID\nfunc (*TerrainData) Id() uint8 {\n\treturn 134\n}\n\n// Len returns the TerrainData Message Length\nfunc (*TerrainData) Len() uint8 {\n\treturn 43\n}\n\n// Crc returns the TerrainData Message CRC\nfunc (*TerrainData) Crc() uint8 {\n\treturn 229\n}\n\n// Pack returns a packed byte array which represents a TerrainData payload\nfunc (m *TerrainData) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GRID_SPACING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.GRIDBIT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the TerrainData\nfunc (m *TerrainData) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GRID_SPACING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.DATA); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.GRIDBIT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_TERRAIN_DATA_FIELD_data_LEN = 16\n)\n\n// MESSAGE TERRAIN_CHECK\n//\n// MAVLINK_MSG_ID_TERRAIN_CHECK 135\n//\n// MAVLINK_MSG_ID_TERRAIN_CHECK_LEN 8\n//\n// MAVLINK_MSG_ID_TERRAIN_CHECK_CRC 203\ntype TerrainCheck struct {\n\tLAT int32 // Latitude (degrees *10^7)\n\tLON int32 // Longitude (degrees *10^7)\n}\n\n// NewTerrainCheck returns a new TerrainCheck\nfunc NewTerrainCheck(LAT int32, LON int32) *TerrainCheck {\n\tm := TerrainCheck{}\n\tm.LAT = LAT\n\tm.LON = LON\n\treturn &m\n}\n\n// Id returns the TerrainCheck Message ID\nfunc (*TerrainCheck) Id() uint8 {\n\treturn 135\n}\n\n// Len returns the TerrainCheck Message Length\nfunc (*TerrainCheck) Len() uint8 {\n\treturn 8\n}\n\n// Crc returns the TerrainCheck Message CRC\nfunc (*TerrainCheck) Crc() uint8 {\n\treturn 203\n}\n\n// Pack returns a packed byte array which represents a TerrainCheck payload\nfunc (m *TerrainCheck) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the TerrainCheck\nfunc (m *TerrainCheck) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE TERRAIN_REPORT\n//\n// MAVLINK_MSG_ID_TERRAIN_REPORT 136\n//\n// MAVLINK_MSG_ID_TERRAIN_REPORT_LEN 22\n//\n// MAVLINK_MSG_ID_TERRAIN_REPORT_CRC 1\ntype TerrainReport struct {\n\tLAT            int32   // Latitude (degrees *10^7)\n\tLON            int32   // Longitude (degrees *10^7)\n\tTERRAIN_HEIGHT float32 // Terrain height in meters AMSL\n\tCURRENT_HEIGHT float32 // Current vehicle height above lat/lon terrain height (meters)\n\tSPACING        uint16  // grid spacing (zero if terrain at this location unavailable)\n\tPENDING        uint16  // Number of 4x4 terrain blocks waiting to be received or read from disk\n\tLOADED         uint16  // Number of 4x4 terrain blocks in memory\n}\n\n// NewTerrainReport returns a new TerrainReport\nfunc NewTerrainReport(LAT int32, LON int32, TERRAIN_HEIGHT float32, CURRENT_HEIGHT float32, SPACING uint16, PENDING uint16, LOADED uint16) *TerrainReport {\n\tm := TerrainReport{}\n\tm.LAT = LAT\n\tm.LON = LON\n\tm.TERRAIN_HEIGHT = TERRAIN_HEIGHT\n\tm.CURRENT_HEIGHT = CURRENT_HEIGHT\n\tm.SPACING = SPACING\n\tm.PENDING = PENDING\n\tm.LOADED = LOADED\n\treturn &m\n}\n\n// Id returns the TerrainReport Message ID\nfunc (*TerrainReport) Id() uint8 {\n\treturn 136\n}\n\n// Len returns the TerrainReport Message Length\nfunc (*TerrainReport) Len() uint8 {\n\treturn 22\n}\n\n// Crc returns the TerrainReport Message CRC\nfunc (*TerrainReport) Crc() uint8 {\n\treturn 1\n}\n\n// Pack returns a packed byte array which represents a TerrainReport payload\nfunc (m *TerrainReport) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TERRAIN_HEIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CURRENT_HEIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SPACING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.PENDING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.LOADED); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the TerrainReport\nfunc (m *TerrainReport) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.LAT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LON); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TERRAIN_HEIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CURRENT_HEIGHT); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.SPACING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.PENDING); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.LOADED); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE BATTERY_STATUS\n//\n// MAVLINK_MSG_ID_BATTERY_STATUS 147\n//\n// MAVLINK_MSG_ID_BATTERY_STATUS_LEN 24\n//\n// MAVLINK_MSG_ID_BATTERY_STATUS_CRC 177\ntype BatteryStatus struct {\n\tCURRENT_CONSUMED  int32  // Consumed charge, in milliampere hours (1 = 1 mAh), -1: autopilot does not provide mAh consumption estimate\n\tENERGY_CONSUMED   int32  // Consumed energy, in 100*Joules (integrated U*I*dt)  (1 = 100 Joule), -1: autopilot does not provide energy consumption estimate\n\tVOLTAGE_CELL_1    uint16 // Battery voltage of cell 1, in millivolts (1 = 1 millivolt)\n\tVOLTAGE_CELL_2    uint16 // Battery voltage of cell 2, in millivolts (1 = 1 millivolt), -1: no cell\n\tVOLTAGE_CELL_3    uint16 // Battery voltage of cell 3, in millivolts (1 = 1 millivolt), -1: no cell\n\tVOLTAGE_CELL_4    uint16 // Battery voltage of cell 4, in millivolts (1 = 1 millivolt), -1: no cell\n\tVOLTAGE_CELL_5    uint16 // Battery voltage of cell 5, in millivolts (1 = 1 millivolt), -1: no cell\n\tVOLTAGE_CELL_6    uint16 // Battery voltage of cell 6, in millivolts (1 = 1 millivolt), -1: no cell\n\tCURRENT_BATTERY   int16  // Battery current, in 10*milliamperes (1 = 10 milliampere), -1: autopilot does not measure the current\n\tACCU_ID           uint8  // Accupack ID\n\tBATTERY_REMAINING int8   // Remaining battery energy: (0%: 0, 100%: 100), -1: autopilot does not estimate the remaining battery\n}\n\n// NewBatteryStatus returns a new BatteryStatus\nfunc NewBatteryStatus(CURRENT_CONSUMED int32, ENERGY_CONSUMED int32, VOLTAGE_CELL_1 uint16, VOLTAGE_CELL_2 uint16, VOLTAGE_CELL_3 uint16, VOLTAGE_CELL_4 uint16, VOLTAGE_CELL_5 uint16, VOLTAGE_CELL_6 uint16, CURRENT_BATTERY int16, ACCU_ID uint8, BATTERY_REMAINING int8) *BatteryStatus {\n\tm := BatteryStatus{}\n\tm.CURRENT_CONSUMED = CURRENT_CONSUMED\n\tm.ENERGY_CONSUMED = ENERGY_CONSUMED\n\tm.VOLTAGE_CELL_1 = VOLTAGE_CELL_1\n\tm.VOLTAGE_CELL_2 = VOLTAGE_CELL_2\n\tm.VOLTAGE_CELL_3 = VOLTAGE_CELL_3\n\tm.VOLTAGE_CELL_4 = VOLTAGE_CELL_4\n\tm.VOLTAGE_CELL_5 = VOLTAGE_CELL_5\n\tm.VOLTAGE_CELL_6 = VOLTAGE_CELL_6\n\tm.CURRENT_BATTERY = CURRENT_BATTERY\n\tm.ACCU_ID = ACCU_ID\n\tm.BATTERY_REMAINING = BATTERY_REMAINING\n\treturn &m\n}\n\n// Id returns the BatteryStatus Message ID\nfunc (*BatteryStatus) Id() uint8 {\n\treturn 147\n}\n\n// Len returns the BatteryStatus Message Length\nfunc (*BatteryStatus) Len() uint8 {\n\treturn 24\n}\n\n// Crc returns the BatteryStatus Message CRC\nfunc (*BatteryStatus) Crc() uint8 {\n\treturn 177\n}\n\n// Pack returns a packed byte array which represents a BatteryStatus payload\nfunc (m *BatteryStatus) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.CURRENT_CONSUMED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ENERGY_CONSUMED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VOLTAGE_CELL_1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VOLTAGE_CELL_2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VOLTAGE_CELL_3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VOLTAGE_CELL_4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VOLTAGE_CELL_5); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VOLTAGE_CELL_6); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.CURRENT_BATTERY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ACCU_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.BATTERY_REMAINING); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the BatteryStatus\nfunc (m *BatteryStatus) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.CURRENT_CONSUMED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ENERGY_CONSUMED); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VOLTAGE_CELL_1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VOLTAGE_CELL_2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VOLTAGE_CELL_3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VOLTAGE_CELL_4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VOLTAGE_CELL_5); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VOLTAGE_CELL_6); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.CURRENT_BATTERY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ACCU_ID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.BATTERY_REMAINING); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SETPOINT_8DOF\n//\n// MAVLINK_MSG_ID_SETPOINT_8DOF 148\n//\n// MAVLINK_MSG_ID_SETPOINT_8DOF_LEN 33\n//\n// MAVLINK_MSG_ID_SETPOINT_8DOF_CRC 241\ntype Setpoint8Dof struct {\n\tVAL1          float32 // Value 1\n\tVAL2          float32 // Value 2\n\tVAL3          float32 // Value 3\n\tVAL4          float32 // Value 4\n\tVAL5          float32 // Value 5\n\tVAL6          float32 // Value 6\n\tVAL7          float32 // Value 7\n\tVAL8          float32 // Value 8\n\tTARGET_SYSTEM uint8   // System ID\n}\n\n// NewSetpoint8Dof returns a new Setpoint8Dof\nfunc NewSetpoint8Dof(VAL1 float32, VAL2 float32, VAL3 float32, VAL4 float32, VAL5 float32, VAL6 float32, VAL7 float32, VAL8 float32, TARGET_SYSTEM uint8) *Setpoint8Dof {\n\tm := Setpoint8Dof{}\n\tm.VAL1 = VAL1\n\tm.VAL2 = VAL2\n\tm.VAL3 = VAL3\n\tm.VAL4 = VAL4\n\tm.VAL5 = VAL5\n\tm.VAL6 = VAL6\n\tm.VAL7 = VAL7\n\tm.VAL8 = VAL8\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\treturn &m\n}\n\n// Id returns the Setpoint8Dof Message ID\nfunc (*Setpoint8Dof) Id() uint8 {\n\treturn 148\n}\n\n// Len returns the Setpoint8Dof Message Length\nfunc (*Setpoint8Dof) Len() uint8 {\n\treturn 33\n}\n\n// Crc returns the Setpoint8Dof Message CRC\nfunc (*Setpoint8Dof) Crc() uint8 {\n\treturn 241\n}\n\n// Pack returns a packed byte array which represents a Setpoint8Dof payload\nfunc (m *Setpoint8Dof) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL5); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL6); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL7); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VAL8); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Setpoint8Dof\nfunc (m *Setpoint8Dof) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL1); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL2); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL3); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL4); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL5); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL6); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL7); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VAL8); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE SETPOINT_6DOF\n//\n// MAVLINK_MSG_ID_SETPOINT_6DOF 149\n//\n// MAVLINK_MSG_ID_SETPOINT_6DOF_LEN 25\n//\n// MAVLINK_MSG_ID_SETPOINT_6DOF_CRC 15\ntype Setpoint6Dof struct {\n\tTRANS_X       float32 // Translational Component in x\n\tTRANS_Y       float32 // Translational Component in y\n\tTRANS_Z       float32 // Translational Component in z\n\tROT_X         float32 // Rotational Component in x\n\tROT_Y         float32 // Rotational Component in y\n\tROT_Z         float32 // Rotational Component in z\n\tTARGET_SYSTEM uint8   // System ID\n}\n\n// NewSetpoint6Dof returns a new Setpoint6Dof\nfunc NewSetpoint6Dof(TRANS_X float32, TRANS_Y float32, TRANS_Z float32, ROT_X float32, ROT_Y float32, ROT_Z float32, TARGET_SYSTEM uint8) *Setpoint6Dof {\n\tm := Setpoint6Dof{}\n\tm.TRANS_X = TRANS_X\n\tm.TRANS_Y = TRANS_Y\n\tm.TRANS_Z = TRANS_Z\n\tm.ROT_X = ROT_X\n\tm.ROT_Y = ROT_Y\n\tm.ROT_Z = ROT_Z\n\tm.TARGET_SYSTEM = TARGET_SYSTEM\n\treturn &m\n}\n\n// Id returns the Setpoint6Dof Message ID\nfunc (*Setpoint6Dof) Id() uint8 {\n\treturn 149\n}\n\n// Len returns the Setpoint6Dof Message Length\nfunc (*Setpoint6Dof) Len() uint8 {\n\treturn 25\n}\n\n// Crc returns the Setpoint6Dof Message CRC\nfunc (*Setpoint6Dof) Crc() uint8 {\n\treturn 15\n}\n\n// Pack returns a packed byte array which represents a Setpoint6Dof payload\nfunc (m *Setpoint6Dof) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TRANS_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TRANS_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TRANS_Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROT_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROT_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ROT_Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Setpoint6Dof\nfunc (m *Setpoint6Dof) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TRANS_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TRANS_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TRANS_Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROT_X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROT_Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.ROT_Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TARGET_SYSTEM); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// MESSAGE MEMORY_VECT\n//\n// MAVLINK_MSG_ID_MEMORY_VECT 249\n//\n// MAVLINK_MSG_ID_MEMORY_VECT_LEN 36\n//\n// MAVLINK_MSG_ID_MEMORY_VECT_CRC 204\ntype MemoryVect struct {\n\tADDRESS uint16   // Starting address of the debug variables\n\tVER     uint8    // Version code of the type variable. 0=unknown, type ignored and assumed int16_t. 1=as below\n\tTYPE    uint8    // Type code of the memory variables. for ver = 1: 0=16 x int16_t, 1=16 x uint16_t, 2=16 x Q15, 3=16 x 1Q14\n\tVALUE   [32]int8 // Memory contents at specified address\n}\n\n// NewMemoryVect returns a new MemoryVect\nfunc NewMemoryVect(ADDRESS uint16, VER uint8, TYPE uint8, VALUE [32]int8) *MemoryVect {\n\tm := MemoryVect{}\n\tm.ADDRESS = ADDRESS\n\tm.VER = VER\n\tm.TYPE = TYPE\n\tm.VALUE = VALUE\n\treturn &m\n}\n\n// Id returns the MemoryVect Message ID\nfunc (*MemoryVect) Id() uint8 {\n\treturn 249\n}\n\n// Len returns the MemoryVect Message Length\nfunc (*MemoryVect) Len() uint8 {\n\treturn 36\n}\n\n// Crc returns the MemoryVect Message CRC\nfunc (*MemoryVect) Crc() uint8 {\n\treturn 204\n}\n\n// Pack returns a packed byte array which represents a MemoryVect payload\nfunc (m *MemoryVect) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.ADDRESS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VER); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MemoryVect\nfunc (m *MemoryVect) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.ADDRESS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VER); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TYPE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_MEMORY_VECT_FIELD_value_LEN = 32\n)\n\n// MESSAGE DEBUG_VECT\n//\n// MAVLINK_MSG_ID_DEBUG_VECT 250\n//\n// MAVLINK_MSG_ID_DEBUG_VECT_LEN 30\n//\n// MAVLINK_MSG_ID_DEBUG_VECT_CRC 49\ntype DebugVect struct {\n\tTIME_USEC uint64    // Timestamp\n\tX         float32   // x\n\tY         float32   // y\n\tZ         float32   // z\n\tNAME      [10]uint8 // Name\n}\n\n// NewDebugVect returns a new DebugVect\nfunc NewDebugVect(TIME_USEC uint64, X float32, Y float32, Z float32, NAME [10]uint8) *DebugVect {\n\tm := DebugVect{}\n\tm.TIME_USEC = TIME_USEC\n\tm.X = X\n\tm.Y = Y\n\tm.Z = Z\n\tm.NAME = NAME\n\treturn &m\n}\n\n// Id returns the DebugVect Message ID\nfunc (*DebugVect) Id() uint8 {\n\treturn 250\n}\n\n// Len returns the DebugVect Message Length\nfunc (*DebugVect) Len() uint8 {\n\treturn 30\n}\n\n// Crc returns the DebugVect Message CRC\nfunc (*DebugVect) Crc() uint8 {\n\treturn 49\n}\n\n// Pack returns a packed byte array which represents a DebugVect payload\nfunc (m *DebugVect) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the DebugVect\nfunc (m *DebugVect) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_USEC); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.X); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Y); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.Z); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_DEBUG_VECT_FIELD_name_LEN = 10\n)\n\n// MESSAGE NAMED_VALUE_FLOAT\n//\n// MAVLINK_MSG_ID_NAMED_VALUE_FLOAT 251\n//\n// MAVLINK_MSG_ID_NAMED_VALUE_FLOAT_LEN 18\n//\n// MAVLINK_MSG_ID_NAMED_VALUE_FLOAT_CRC 170\ntype NamedValueFloat struct {\n\tTIME_BOOT_MS uint32    // Timestamp (milliseconds since system boot)\n\tVALUE        float32   // Floating point value\n\tNAME         [10]uint8 // Name of the debug variable\n}\n\n// NewNamedValueFloat returns a new NamedValueFloat\nfunc NewNamedValueFloat(TIME_BOOT_MS uint32, VALUE float32, NAME [10]uint8) *NamedValueFloat {\n\tm := NamedValueFloat{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.VALUE = VALUE\n\tm.NAME = NAME\n\treturn &m\n}\n\n// Id returns the NamedValueFloat Message ID\nfunc (*NamedValueFloat) Id() uint8 {\n\treturn 251\n}\n\n// Len returns the NamedValueFloat Message Length\nfunc (*NamedValueFloat) Len() uint8 {\n\treturn 18\n}\n\n// Crc returns the NamedValueFloat Message CRC\nfunc (*NamedValueFloat) Crc() uint8 {\n\treturn 170\n}\n\n// Pack returns a packed byte array which represents a NamedValueFloat payload\nfunc (m *NamedValueFloat) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the NamedValueFloat\nfunc (m *NamedValueFloat) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_NAMED_VALUE_FLOAT_FIELD_name_LEN = 10\n)\n\n// MESSAGE NAMED_VALUE_INT\n//\n// MAVLINK_MSG_ID_NAMED_VALUE_INT 252\n//\n// MAVLINK_MSG_ID_NAMED_VALUE_INT_LEN 18\n//\n// MAVLINK_MSG_ID_NAMED_VALUE_INT_CRC 44\ntype NamedValueInt struct {\n\tTIME_BOOT_MS uint32    // Timestamp (milliseconds since system boot)\n\tVALUE        int32     // Signed integer value\n\tNAME         [10]uint8 // Name of the debug variable\n}\n\n// NewNamedValueInt returns a new NamedValueInt\nfunc NewNamedValueInt(TIME_BOOT_MS uint32, VALUE int32, NAME [10]uint8) *NamedValueInt {\n\tm := NamedValueInt{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.VALUE = VALUE\n\tm.NAME = NAME\n\treturn &m\n}\n\n// Id returns the NamedValueInt Message ID\nfunc (*NamedValueInt) Id() uint8 {\n\treturn 252\n}\n\n// Len returns the NamedValueInt Message Length\nfunc (*NamedValueInt) Len() uint8 {\n\treturn 18\n}\n\n// Crc returns the NamedValueInt Message CRC\nfunc (*NamedValueInt) Crc() uint8 {\n\treturn 44\n}\n\n// Pack returns a packed byte array which represents a NamedValueInt payload\nfunc (m *NamedValueInt) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.NAME); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the NamedValueInt\nfunc (m *NamedValueInt) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.NAME); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_NAMED_VALUE_INT_FIELD_name_LEN = 10\n)\n\n// MESSAGE STATUSTEXT\n//\n// MAVLINK_MSG_ID_STATUSTEXT 253\n//\n// MAVLINK_MSG_ID_STATUSTEXT_LEN 51\n//\n// MAVLINK_MSG_ID_STATUSTEXT_CRC 83\ntype Statustext struct {\n\tSEVERITY uint8     // Severity of status. Relies on the definitions within RFC-5424. See enum MAV_SEVERITY.\n\tTEXT     [50]uint8 // Status text message, without null termination character\n}\n\n// NewStatustext returns a new Statustext\nfunc NewStatustext(SEVERITY uint8, TEXT [50]uint8) *Statustext {\n\tm := Statustext{}\n\tm.SEVERITY = SEVERITY\n\tm.TEXT = TEXT\n\treturn &m\n}\n\n// Id returns the Statustext Message ID\nfunc (*Statustext) Id() uint8 {\n\treturn 253\n}\n\n// Len returns the Statustext Message Length\nfunc (*Statustext) Len() uint8 {\n\treturn 51\n}\n\n// Crc returns the Statustext Message CRC\nfunc (*Statustext) Crc() uint8 {\n\treturn 83\n}\n\n// Pack returns a packed byte array which represents a Statustext payload\nfunc (m *Statustext) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.SEVERITY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.TEXT); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Statustext\nfunc (m *Statustext) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.SEVERITY); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.TEXT); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nconst (\n\tMAVLINK_MSG_STATUSTEXT_FIELD_text_LEN = 50\n)\n\n// MESSAGE DEBUG\n//\n// MAVLINK_MSG_ID_DEBUG 254\n//\n// MAVLINK_MSG_ID_DEBUG_LEN 9\n//\n// MAVLINK_MSG_ID_DEBUG_CRC 46\ntype Debug struct {\n\tTIME_BOOT_MS uint32  // Timestamp (milliseconds since system boot)\n\tVALUE        float32 // DEBUG value\n\tIND          uint8   // index of debug variable\n}\n\n// NewDebug returns a new Debug\nfunc NewDebug(TIME_BOOT_MS uint32, VALUE float32, IND uint8) *Debug {\n\tm := Debug{}\n\tm.TIME_BOOT_MS = TIME_BOOT_MS\n\tm.VALUE = VALUE\n\tm.IND = IND\n\treturn &m\n}\n\n// Id returns the Debug Message ID\nfunc (*Debug) Id() uint8 {\n\treturn 254\n}\n\n// Len returns the Debug Message Length\nfunc (*Debug) Len() uint8 {\n\treturn 9\n}\n\n// Crc returns the Debug Message CRC\nfunc (*Debug) Crc() uint8 {\n\treturn 46\n}\n\n// Pack returns a packed byte array which represents a Debug payload\nfunc (m *Debug) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.IND); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the Debug\nfunc (m *Debug) Decode(buf []byte) {\n\tdata := bytes.NewBuffer(buf)\n\tif err := binary.Read(data, binary.LittleEndian, &m.TIME_BOOT_MS); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.VALUE); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Read(data, binary.LittleEndian, &m.IND); err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "platforms/mavlink/common/mavlink.go",
    "content": "package mavlink\n\n//\n// MAVLink comm protocol built from common.xml\n// http://pixhawk.ethz.ch/software/mavlink\n//\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"time\"\n)\n\nconst (\n\tMAVLINK_BIG_ENDIAN     = 0\n\tMAVLINK_LITTLE_ENDIAN  = 1\n\tMAVLINK_10_STX         = 254\n\tMAVLINK_20_STX         = 253\n\tMAVLINK_ENDIAN         = MAVLINK_LITTLE_ENDIAN\n\tMAVLINK_ALIGNED_FIELDS = 1\n\tMAVLINK_CRC_EXTRA      = 1\n\tX25_INIT_CRC           = 0xffff\n\tX25_VALIDATE_CRC       = 0xf0b8\n)\n\nvar sequence uint16 = 0\n\nfunc generateSequence() uint8 {\n\tsequence = (sequence + 1) % 256\n\treturn uint8(sequence) //nolint:gosec // ok here\n}\n\n// The MAVLinkMessage interface is implemented by MAVLink messages\ntype MAVLinkMessage interface {\n\tId() uint8\n\tLen() uint8\n\tCrc() uint8\n\tPack() []byte\n\tDecode(buf []byte)\n}\n\n// A MAVLinkPacket represents a raw packet received from a micro air vehicle\ntype MAVLinkPacket struct {\n\tProtocol    uint8\n\tLength      uint8\n\tSequence    uint8\n\tSystemID    uint8\n\tComponentID uint8\n\tMessageID   uint8\n\tData        []uint8\n\tChecksum    uint16\n}\n\n// ReadMAVLinkPacket reads an io.Reader for a new packet and returns a new MAVLink packet\n// or returns the error received by the io.Reader\nfunc ReadMAVLinkPacket(r io.Reader) (*MAVLinkPacket, error) {\n\tfor {\n\t\theader, err := read(r, 1)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif header[0] == 254 {\n\t\t\tlength, err := read(r, 1)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t} else if length[0] > 250 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tm := &MAVLinkPacket{}\n\t\t\tdata, err := read(r, int(length[0])+7)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tdata = append([]byte{header[0], length[0]}, data...)\n\t\t\tm.Decode(data)\n\t\t\treturn m, nil\n\t\t}\n\t}\n}\n\n// CraftMAVLinkPacket returns a new MAVLinkPacket from a MAVLinkMessage\nfunc CraftMAVLinkPacket(systemID uint8, cComponentID uint8, mMessage MAVLinkMessage) *MAVLinkPacket {\n\treturn NewMAVLinkPacket(\n\t\t0xFE,\n\t\tmMessage.Len(),\n\t\tgenerateSequence(),\n\t\tsystemID,\n\t\tcComponentID,\n\t\tmMessage.Id(),\n\t\tmMessage.Pack(),\n\t)\n}\n\n// NewMAVLinkPacket returns a new MAVLinkPacket\nfunc NewMAVLinkPacket(\n\tpProtocol uint8,\n\tlLength uint8,\n\tsSequence uint8,\n\tsSystemID uint8,\n\tcComponentID uint8,\n\tmMessageID uint8,\n\tdData []uint8,\n) *MAVLinkPacket {\n\tm := &MAVLinkPacket{\n\t\tProtocol:    pProtocol,\n\t\tLength:      lLength,\n\t\tSequence:    sSequence,\n\t\tSystemID:    sSystemID,\n\t\tComponentID: cComponentID,\n\t\tMessageID:   mMessageID,\n\t\tData:        dData,\n\t}\n\tm.Checksum = crcCalculate(m)\n\treturn m\n}\n\n// MAVLinkMessage returns the decoded MAVLinkMessage from the MAVLinkPacket\n// or returns an error generated from the MAVLinkMessage\nfunc (m *MAVLinkPacket) MAVLinkMessage() (MAVLinkMessage, error) {\n\treturn NewMAVLinkMessage(m.MessageID, m.Data)\n}\n\n// Pack returns a packed byte array which represents the MAVLinkPacket\nfunc (m *MAVLinkPacket) Pack() []byte {\n\tdata := new(bytes.Buffer)\n\tif err := binary.Write(data, binary.LittleEndian, m.Protocol); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Length); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.Sequence); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.SystemID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.ComponentID); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := binary.Write(data, binary.LittleEndian, m.MessageID); err != nil {\n\t\tpanic(err)\n\t}\n\tdata.Write(m.Data)\n\tif err := binary.Write(data, binary.LittleEndian, m.Checksum); err != nil {\n\t\tpanic(err)\n\t}\n\treturn data.Bytes()\n}\n\n// Decode accepts a packed byte array and populates the fields of the MAVLinkPacket\nfunc (m *MAVLinkPacket) Decode(buf []byte) {\n\tm.Protocol = buf[0]\n\tm.Length = buf[1]\n\tm.Sequence = buf[2]\n\tm.SystemID = buf[3]\n\tm.ComponentID = buf[4]\n\tm.MessageID = buf[5]\n\tm.Data = buf[6 : 6+int(m.Length)]\n\tchecksum := buf[7+int(m.Length):]\n\tm.Checksum = uint16(checksum[1])<<8 | uint16(checksum[0])\n}\n\nfunc read(r io.Reader, length int) ([]byte, error) {\n\tbuf := []byte{}\n\tfor length > 0 {\n\t\ttmp := make([]byte, length)\n\t\ti, err := r.Read(tmp)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tlength -= i\n\t\tbuf = append(buf, tmp...)\n\t\tif length != i {\n\t\t\ttime.Sleep(1 * time.Millisecond)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\n\t}\n\treturn buf, nil\n}\n\n// Accumulate the X.25 CRC by adding one char at a time.\n//\n// The checksum function adds the hash of one char at a time to the\n// 16 bit checksum (uint16).\n//\n// data to hash\n// crcAccum the already accumulated checksum\nfunc crcAccumulate(data uint8, crcAccum uint16) uint16 {\n\t/*Accumulate one byte of data into the CRC*/\n\tvar tmp uint8\n\n\ttmp = data ^ (uint8)(crcAccum&0xff) //nolint:gosec // ok here\n\ttmp ^= (tmp << 4)\n\tcrcAccum = (crcAccum >> 8) ^ (uint16(tmp) << 8) ^ (uint16(tmp) << 3) ^ (uint16(tmp) >> 4)\n\treturn crcAccum\n}\n\n// Initiliaze the buffer for the X.25 CRC\nfunc crcInit() uint16 {\n\treturn X25_INIT_CRC\n}\n\n// Calculates the X.25 checksum on a byte buffer\n//\n// return the checksum over the buffer bytes\nfunc crcCalculate(m *MAVLinkPacket) uint16 {\n\tcrc := crcInit()\n\n\tfor _, v := range m.Pack()[1 : m.Length+6] {\n\t\tcrc = crcAccumulate(v, crc)\n\t}\n\tmessage, _ := m.MAVLinkMessage()\n\tcrc = crcAccumulate(message.Crc(), crc)\n\treturn crc\n}\n"
  },
  {
    "path": "platforms/mavlink/common/version.go",
    "content": "package mavlink\n\n//\n// MAVLink comm protocol built from common.xml\n// http://pixhawk.ethz.ch/software/mavlink\n//\n\nconst (\n\tMAVLINK_BUILD_DATE               = \"Fri Sep 26 19:23:02 2014\"\n\tMAVLINK_WIRE_PROTOCOL_VERSION    = \"1.0\"\n\tMAVLINK_MAX_DIALECT_PAYLOAD_SIZE = 255\n\tMAVLINK_VERSION                  = 3\n)\n"
  },
  {
    "path": "platforms/mavlink/doc.go",
    "content": "/*\nPackage mavlink contains the Gobot adaptor and driver for the MAVlink Communication Protocol.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"fmt\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/platforms/mavlink\"\n\t\tcommon \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n\t)\n\n\tfunc main() {\n\t\tadaptor := mavlink.NewAdaptor(\"/dev/ttyACM0\")\n\t\tiris := mavlink.NewDriver(adaptor)\n\n\t\twork := func() {\n\t\t\tiris.Once(iris.Event(\"packet\"), func(data interface{}) {\n\t\t\t\tpacket := data.(*common.MAVLinkPacket)\n\n\t\t\t\tdataStream := common.NewRequestDataStream(100,\n\t\t\t\t\tpacket.SystemID,\n\t\t\t\t\tpacket.ComponentID,\n\t\t\t\t\t4,\n\t\t\t\t\t1,\n\t\t\t\t)\n\t\t\t\tiris.SendPacket(common.CraftMAVLinkPacket(packet.SystemID,\n\t\t\t\t\tpacket.ComponentID,\n\t\t\t\t\tdataStream,\n\t\t\t\t))\n\t\t\t})\n\n\t\t\tiris.On(iris.Event(\"message\"), func(data interface{}) {\n\t\t\t\tif data.(common.MAVLinkMessage).Id() == 30 {\n\t\t\t\t\tmessage := data.(*common.Attitude)\n\t\t\t\t\tfmt.Println(\"Attitude\")\n\t\t\t\t\tfmt.Println(\"TIME_BOOT_MS\", message.TIME_BOOT_MS)\n\t\t\t\t\tfmt.Println(\"ROLL\", message.ROLL)\n\t\t\t\t\tfmt.Println(\"PITCH\", message.PITCH)\n\t\t\t\t\tfmt.Println(\"YAW\", message.YAW)\n\t\t\t\t\tfmt.Println(\"ROLLSPEED\", message.ROLLSPEED)\n\t\t\t\t\tfmt.Println(\"PITCHSPEED\", message.PITCHSPEED)\n\t\t\t\t\tfmt.Println(\"YAWSPEED\", message.YAWSPEED)\n\t\t\t\t\tfmt.Println(\"\")\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"mavBot\",\n\t\t\t[]gobot.Connection{adaptor},\n\t\t\t[]gobot.Device{iris},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor further information refer to mavlink README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/mavlink/README.md\n*/\npackage mavlink // import \"gobot.io/x/gobot/v2/platforms/mavlink\"\n"
  },
  {
    "path": "platforms/mavlink/mavlink_adaptor.go",
    "content": "package mavlink\n\nimport (\n\t\"io\"\n\n\t\"go.bug.st/serial\"\n\n\t\"gobot.io/x/gobot/v2\"\n\tcommon \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n)\n\n// Adaptor is a Mavlink transport adaptor.\ntype BaseAdaptor interface {\n\tgobot.Connection\n\n\tio.Writer\n\tReadMAVLinkPacket() (*common.MAVLinkPacket, error)\n}\n\n// Adaptor is a Mavlink-over-serial adaptor.\ntype Adaptor struct {\n\tname    string\n\tport    string\n\tsp      io.ReadWriteCloser\n\tconnect func(string) (io.ReadWriteCloser, error)\n}\n\n// NewAdaptor creates a new mavlink adaptor with specified port\nfunc NewAdaptor(port string) *Adaptor {\n\treturn &Adaptor{\n\t\tname: \"Mavlink\",\n\t\tport: port,\n\t\tconnect: func(port string) (io.ReadWriteCloser, error) {\n\t\t\treturn serial.Open(port, &serial.Mode{BaudRate: 57600})\n\t\t},\n\t}\n}\n\nfunc (m *Adaptor) Name() string     { return m.name }\nfunc (m *Adaptor) SetName(n string) { m.name = n }\nfunc (m *Adaptor) Port() string     { return m.port }\n\n// Connect returns true if connection to device is successful\nfunc (m *Adaptor) Connect() error {\n\tsp, err := m.connect(m.Port())\n\tif err != nil {\n\t\treturn err\n\t}\n\tm.sp = sp\n\n\treturn nil\n}\n\n// Finalize returns true if connection to devices is closed successfully\nfunc (m *Adaptor) Finalize() error {\n\treturn m.sp.Close()\n}\n\nfunc (m *Adaptor) ReadMAVLinkPacket() (*common.MAVLinkPacket, error) {\n\treturn common.ReadMAVLinkPacket(m.sp)\n}\n\nfunc (m *Adaptor) Write(b []byte) (int, error) {\n\treturn m.sp.Write(b)\n}\n"
  },
  {
    "path": "platforms/mavlink/mavlink_adaptor_test.go",
    "content": "package mavlink\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\ntype nullReadWriteCloser struct{}\n\nvar payload = []byte{\n\t0xFE, 0x09, 0x4E, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x51, 0x04, 0x03, 0x1C, 0x7F,\n}\n\nvar testAdaptorRead = func(p []byte) (int, error) {\n\treturn len(p), nil\n}\n\nfunc (nullReadWriteCloser) Write(p []byte) (int, error) {\n\treturn testAdaptorRead(p)\n}\n\nvar testAdaptorWrite = func(b []byte) (int, error) {\n\tif len(payload) > 0 {\n\t\tcopy(b, payload[:len(b)])\n\t\tpayload = payload[len(b):]\n\t\treturn len(b), nil\n\t}\n\treturn 0, errors.New(\"out of bytes\")\n}\n\nfunc (nullReadWriteCloser) Read(b []byte) (int, error) {\n\treturn testAdaptorWrite(b)\n}\n\nvar testAdaptorClose = func() error {\n\treturn nil\n}\n\nfunc (nullReadWriteCloser) Close() error {\n\treturn testAdaptorClose()\n}\n\nfunc initTestMavlinkAdaptor() *Adaptor {\n\tm := NewAdaptor(\"/dev/null\")\n\tm.sp = nullReadWriteCloser{}\n\tm.connect = func(port string) (io.ReadWriteCloser, error) { return nil, nil } //nolint:nilnil // ok for tests\n\treturn m\n}\n\nfunc TestMavlinkAdaptor(t *testing.T) {\n\ta := initTestMavlinkAdaptor()\n\tassert.Equal(t, \"/dev/null\", a.Port())\n}\n\nfunc TestMavlinkAdaptorName(t *testing.T) {\n\ta := initTestMavlinkAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Mavlink\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestMavlinkAdaptorConnect(t *testing.T) {\n\ta := initTestMavlinkAdaptor()\n\trequire.NoError(t, a.Connect())\n\n\ta.connect = func(port string) (io.ReadWriteCloser, error) { return nil, errors.New(\"connect error\") }\n\trequire.ErrorContains(t, a.Connect(), \"connect error\")\n}\n\nfunc TestMavlinkAdaptorFinalize(t *testing.T) {\n\ta := initTestMavlinkAdaptor()\n\trequire.NoError(t, a.Finalize())\n\n\ttestAdaptorClose = func() error {\n\t\treturn errors.New(\"close error\")\n\t}\n\trequire.ErrorContains(t, a.Finalize(), \"close error\")\n}\n"
  },
  {
    "path": "platforms/mavlink/mavlink_driver.go",
    "content": "package mavlink\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n\tcommon \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n)\n\nconst (\n\t// PacketEvent event\n\tPacketEvent = \"packet\"\n\t// MessageEvent event\n\tMessageEvent = \"message\"\n\t// ErrorIOEEvent event\n\tErrorIOEvent = \"errorIO\"\n\t// ErrorMAVLinkEvent event\n\tErrorMAVLinkEvent = \"errorMAVLink\"\n)\n\ntype Driver struct {\n\tgobot.Eventer\n\n\tname       string\n\tconnection gobot.Connection\n\tinterval   time.Duration\n}\n\ntype MavlinkInterface interface{}\n\n// NewDriver creates a new mavlink driver.\n//\n// It add the following events:\n//\n//\t\"packet\" - triggered when a new packet is read\n//\t\"message\" - triggered when a new valid message is processed\nfunc NewDriver(a BaseAdaptor, v ...time.Duration) *Driver {\n\tm := &Driver{\n\t\tname:       \"Mavlink\",\n\t\tconnection: a,\n\t\tEventer:    gobot.NewEventer(),\n\t\tinterval:   10 * time.Millisecond,\n\t}\n\n\tif len(v) > 0 {\n\t\tm.interval = v[0]\n\t}\n\n\tm.AddEvent(PacketEvent)\n\tm.AddEvent(MessageEvent)\n\tm.AddEvent(ErrorIOEvent)\n\tm.AddEvent(ErrorMAVLinkEvent)\n\n\treturn m\n}\n\nfunc (m *Driver) Connection() gobot.Connection { return m.connection }\nfunc (m *Driver) Name() string                 { return m.name }\nfunc (m *Driver) SetName(n string)             { m.name = n }\n\n// adaptor returns driver associated adaptor\nfunc (m *Driver) adaptor() BaseAdaptor {\n\t//nolint:forcetypeassert // ok here\n\treturn m.Connection().(BaseAdaptor)\n}\n\n// Start begins process to read mavlink packets every m.Interval\n// and process them\nfunc (m *Driver) Start() error {\n\tgo func() {\n\t\tfor {\n\t\t\tpacket, err := m.adaptor().ReadMAVLinkPacket()\n\t\t\tif err != nil {\n\t\t\t\tm.Publish(ErrorIOEvent, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tm.Publish(PacketEvent, packet)\n\t\t\tmessage, err := packet.MAVLinkMessage()\n\t\t\tif err != nil {\n\t\t\t\tm.Publish(ErrorMAVLinkEvent, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tm.Publish(MessageEvent, message)\n\t\t\ttime.Sleep(m.interval)\n\t\t}\n\t}()\n\treturn nil\n}\n\n// Halt returns true if device is halted successfully\nfunc (m *Driver) Halt() error { return nil }\n\n// SendPacket sends a packet to mavlink device\nfunc (m *Driver) SendPacket(packet *common.MAVLinkPacket) error {\n\t_, err := m.adaptor().Write(packet.Pack())\n\treturn err\n}\n"
  },
  {
    "path": "platforms/mavlink/mavlink_driver_test.go",
    "content": "//nolint:forcetypeassert,nilnil // ok here\npackage mavlink\n\nimport (\n\t\"io\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\tcommon \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestMavlinkDriver() *Driver {\n\tm := NewAdaptor(\"/dev/null\")\n\tm.connect = func(port string) (io.ReadWriteCloser, error) { return nil, nil }\n\tm.sp = nullReadWriteCloser{}\n\treturn NewDriver(m)\n}\n\nfunc TestMavlinkDriver(t *testing.T) {\n\tm := NewAdaptor(\"/dev/null\")\n\tm.sp = nullReadWriteCloser{}\n\tm.connect = func(port string) (io.ReadWriteCloser, error) { return nil, nil }\n\n\td := NewDriver(m)\n\tassert.NotNil(t, d.Connection())\n\tassert.Equal(t, 10*time.Millisecond, d.interval)\n\n\td = NewDriver(m, 100*time.Millisecond)\n\tassert.Equal(t, 100*time.Millisecond, d.interval)\n}\n\nfunc TestMavlinkDriverName(t *testing.T) {\n\td := initTestMavlinkDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Mavlink\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestMavlinkDriverStart(t *testing.T) {\n\td := initTestMavlinkDriver()\n\terr := make(chan error)\n\tpacket := make(chan *common.MAVLinkPacket)\n\tmessage := make(chan common.MAVLinkMessage)\n\n\t_ = d.On(PacketEvent, func(data interface{}) {\n\t\tpacket <- data.(*common.MAVLinkPacket)\n\t})\n\t_ = d.On(MessageEvent, func(data interface{}) {\n\t\tmessage <- data.(common.MAVLinkMessage)\n\t})\n\t_ = d.On(ErrorIOEvent, func(data interface{}) {\n\t\terr <- data.(error)\n\t})\n\t_ = d.On(ErrorMAVLinkEvent, func(data interface{}) {\n\t\terr <- data.(error)\n\t})\n\n\trequire.NoError(t, d.Start())\n\n\tselect {\n\tcase p := <-packet:\n\t\trequire.NoError(t, d.SendPacket(p))\n\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"packet was not emitted\")\n\t}\n\tselect {\n\tcase <-message:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"message was not emitted\")\n\t}\n\tselect {\n\tcase <-err:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"error was not emitted\")\n\t}\n}\n\nfunc TestMavlinkDriverHalt(t *testing.T) {\n\td := initTestMavlinkDriver()\n\trequire.NoError(t, d.Halt())\n}\n"
  },
  {
    "path": "platforms/mavlink/mavlink_udp_adaptor.go",
    "content": "package mavlink\n\nimport (\n\t\"net\"\n\n\tcommon \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n)\n\ntype UDPConnection interface {\n\tClose() error\n\tReadFromUDP(b []byte) (int, *net.UDPAddr, error)\n\tWriteTo(b []byte, a net.Addr) (int, error)\n}\n\ntype UDPAdaptor struct {\n\tname string\n\tport string\n\tsock UDPConnection\n}\n\nvar _ BaseAdaptor = (*UDPAdaptor)(nil)\n\n// NewAdaptor creates a new Mavlink-over-UDP adaptor with specified\n// port.\nfunc NewUDPAdaptor(port string) *UDPAdaptor {\n\treturn &UDPAdaptor{\n\t\tname: \"Mavlink\",\n\t\tport: port,\n\t}\n}\n\nfunc (m *UDPAdaptor) Name() string     { return m.name }\nfunc (m *UDPAdaptor) SetName(n string) { m.name = n }\nfunc (m *UDPAdaptor) Port() string     { return m.port }\n\n// Connect returns true if connection to device is successful\nfunc (m *UDPAdaptor) Connect() error {\n\tm.close()\n\n\taddr, err := net.ResolveUDPAddr(\"udp\", m.Port())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tm.sock, err = net.ListenUDP(\"udp\", addr)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (m *UDPAdaptor) close() error {\n\tsock := m.sock\n\tm.sock = nil\n\n\tif sock != nil {\n\t\treturn sock.Close()\n\t} else {\n\t\treturn nil\n\t}\n}\n\n// Finalize returns true if connection to devices is closed successfully\nfunc (m *UDPAdaptor) Finalize() error {\n\treturn m.close()\n}\n\nfunc (m *UDPAdaptor) ReadMAVLinkPacket() (*common.MAVLinkPacket, error) {\n\tbuf := make([]byte, 4096)\n\n\tfor {\n\t\tgot, _, err := m.sock.ReadFromUDP(buf)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif got < 2 {\n\t\t\tcontinue\n\t\t}\n\t\tsof := buf[0]\n\t\tlength := buf[1]\n\n\t\tif sof != common.MAVLINK_10_STX {\n\t\t\tcontinue\n\t\t}\n\t\tif length > 250 {\n\t\t\tcontinue\n\t\t}\n\t\tm := &common.MAVLinkPacket{}\n\t\tm.Decode(buf)\n\t\treturn m, nil\n\t}\n}\n\nfunc (m *UDPAdaptor) Write(b []byte) (int, error) {\n\taddr, err := net.ResolveUDPAddr(\"udp\", m.Port())\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn m.sock.WriteTo(b, addr)\n}\n"
  },
  {
    "path": "platforms/mavlink/mavlink_udp_adaptor_test.go",
    "content": "package mavlink\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\tmavlink \"gobot.io/x/gobot/v2/platforms/mavlink/common\"\n)\n\nvar _ gobot.Adaptor = (*UDPAdaptor)(nil)\n\ntype MockUDPConnection struct {\n\tTestClose       func() error\n\tTestReadFromUDP func([]byte) (int, *net.UDPAddr, error)\n\tTestWriteTo     func([]byte, net.Addr) (int, error)\n}\n\nfunc (m *MockUDPConnection) Close() error {\n\treturn m.TestClose()\n}\n\nfunc (m *MockUDPConnection) ReadFromUDP(b []byte) (int, *net.UDPAddr, error) {\n\treturn m.TestReadFromUDP(b)\n}\n\nfunc (m *MockUDPConnection) WriteTo(b []byte, a net.Addr) (int, error) {\n\treturn m.TestWriteTo(b, a)\n}\n\nfunc NewMockUDPConnection() *MockUDPConnection {\n\treturn &MockUDPConnection{\n\t\tTestClose: func() error {\n\t\t\treturn nil\n\t\t},\n\t\tTestReadFromUDP: func([]byte) (int, *net.UDPAddr, error) {\n\t\t\treturn 0, nil, nil\n\t\t},\n\t\tTestWriteTo: func([]byte, net.Addr) (int, error) {\n\t\t\treturn 0, nil\n\t\t},\n\t}\n}\n\nfunc initTestMavlinkUDPAdaptor() *UDPAdaptor {\n\tm := NewUDPAdaptor(\":14550\")\n\treturn m\n}\n\nfunc TestMavlinkUDPAdaptor(t *testing.T) {\n\ta := initTestMavlinkUDPAdaptor()\n\tassert.Equal(t, \":14550\", a.Port())\n}\n\nfunc TestMavlinkUDPAdaptorName(t *testing.T) {\n\ta := initTestMavlinkUDPAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Mavlink\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestMavlinkUDPAdaptorConnectAndFinalize(t *testing.T) {\n\ta := initTestMavlinkUDPAdaptor()\n\trequire.NoError(t, a.Connect())\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestMavlinkUDPAdaptorWrite(t *testing.T) {\n\ta := initTestMavlinkUDPAdaptor()\n\t_ = a.Connect()\n\tdefer func() { _ = a.Finalize() }()\n\n\tm := NewMockUDPConnection()\n\tm.TestWriteTo = func([]byte, net.Addr) (int, error) {\n\t\treturn 3, nil\n\t}\n\ta.sock = m\n\n\ti, err := a.Write([]byte{0x01, 0x02, 0x03})\n\tassert.Equal(t, 3, i)\n\trequire.NoError(t, err)\n}\n\nfunc TestMavlinkReadMAVLinkReadDefaultPacket(t *testing.T) {\n\ta := initTestMavlinkUDPAdaptor()\n\t_ = a.Connect()\n\tdefer func() { _ = a.Finalize() }()\n\n\tm := NewMockUDPConnection()\n\n\tm.TestReadFromUDP = func(b []byte) (int, *net.UDPAddr, error) {\n\t\tbuf := new(bytes.Buffer)\n\t\tbuf.Write([]byte{mavlink.MAVLINK_10_STX, 0x02, 0x03})\n\t\tcopy(b, buf.Bytes())\n\t\treturn buf.Len(), nil, nil\n\t}\n\ta.sock = m\n\n\tp, _ := a.ReadMAVLinkPacket()\n\tassert.Equal(t, uint8(254), p.Protocol)\n}\n\nfunc TestMavlinkReadMAVLinkPacketReadError(t *testing.T) {\n\ta := initTestMavlinkUDPAdaptor()\n\t_ = a.Connect()\n\tdefer func() { _ = a.Finalize() }()\n\n\tm := NewMockUDPConnection()\n\n\ti := 0\n\tm.TestReadFromUDP = func(b []byte) (int, *net.UDPAddr, error) {\n\t\tswitch i {\n\t\tcase 0:\n\t\t\ti = 1\n\t\t\treturn 1, nil, nil\n\t\tcase 1:\n\t\t\ti = 2\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\tbuf.Write([]byte{0x01, 0x02, 0x03})\n\t\t\tcopy(b, buf.Bytes())\n\t\t\treturn buf.Len(), nil, nil\n\t\tcase 2:\n\t\t\ti = 3\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\tbuf.Write([]byte{mavlink.MAVLINK_10_STX, 255})\n\t\t\tcopy(b, buf.Bytes())\n\t\t\treturn buf.Len(), nil, nil\n\t\t}\n\n\t\treturn 0, nil, errors.New(\"read error\")\n\t}\n\ta.sock = m\n\n\t_, err := a.ReadMAVLinkPacket()\n\trequire.ErrorContains(t, err, \"read error\")\n}\n"
  },
  {
    "path": "platforms/megapi/README.md",
    "content": "# MegaPi\n\nThe [MegaPi](http://learn.makeblock.com/en/megapi/) is a motor controller by MakeBlock that is compatible with the\nRaspberry Pi.\n\nThe code is based on a python implementation that can be found [here](https://github.com/Makeblock-official/PythonForMegaPi).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/serial/megapi\"\n  \"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n  // use \"/dev/ttyUSB0\" if connecting with USB cable\n  // use \"/dev/ttyAMA0\" on devices older than Raspberry Pi 3 Model B\n  adaptor := serialport.NewAdaptor(\"/dev/ttyS0\", serialport.WithName(\"MegaPi\"))\n  motor := megapi.NewMotorDriver(adaptor, 1)\n\n  work := func() {\n    speed := int16(0)\n    fadeAmount := int16(30)\n\n    gobot.Every(100*time.Millisecond, func() {\n      motor.Speed(speed)\n      speed = speed + fadeAmount\n      if speed == 0 || speed == 300 {\n        fadeAmount = -fadeAmount\n      }\n    })\n  }\n\n  robot := gobot.NewRobot(\"megaPiBot\",\n    []gobot.Connection{adaptor},\n    []gobot.Device{motor},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n    panic(err)\n  }\n}\n```\n"
  },
  {
    "path": "platforms/megapi/doc.go",
    "content": "/*\nPackage megapi provides the Gobot adaptor for MegaPi.\n\nFor more information refer to the README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/megapi/README.md\n*/\npackage megapi // import \"gobot.io/x/gobot/v2/platforms/megapi\"\n"
  },
  {
    "path": "platforms/microbit/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/microbit/README.md",
    "content": "# Microbit\n\nThe [Microbit](http://microbit.org/) is a tiny computer with built-in Bluetooth LE aka Bluetooth 4.0.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nYou must install the Microbit firmware from [@sandeepmistry] located at  [https://github.com/sandeepmistry/node-bbc-microbit](https://github.com/sandeepmistry/node-bbc-microbit)\nto use the Microbit with Gobot. This firmware is based on the micro:bit template, but with a few changes.\n\nIf you have the [Gort](https://gort.io) command line tool installed, you can install the firmware using the following commands:\n\n```sh\ngort microbit download\ngort microbit install /media/mysystem/MICROBIT\n```\n\nSubstitute the proper location to your Microbit for `/media/mysystem/MICROBIT` in the previous command.\n\nOnce the firmware is installed, make sure your rotate your Microbit in a circle to calibrate the magnetometer before your\ntry to connect to it using Gobot, or it will not respond.\n\nYou can also follow the firmware installation instructions at [https://github.com/sandeepmistry/node-bbc-microbit#flashing-microbit-firmware](https://github.com/sandeepmistry/node-bbc-microbit#flashing-microbit-firmware).\n\nThe source code for the firmware is located at [https://github.com/sandeepmistry/node-bbc-microbit-firmware](https://github.com/sandeepmistry/node-bbc-microbit-firmware)\nhowever you do not need this source code to install the firmware using the installation instructions.\n\n## How to Use\n\nThe Gobot package for the Microbit includes several [different drivers](https://github.com/hybridgroup/gobot/blob/release/drivers/ble/README.md).\nThe platform itself is represented by the generic Bluetooth LE [Client adaptor](https://github.com/hybridgroup/gobot/blob/release/platforms/bleclient/ble_client_adaptor.go),\nsee examples below.\n\nThe following example uses the LEDDriver:\n\n```go\npackage main\n\nimport (\n  \"os\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n  \"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n)\n\nfunc main() {\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n  ubit := microbit.NewLEDDriver(bleAdaptor)\n\n  work := func() {\n    if err := ubit.Blank(); err != nil {\n      fmt.Println(err)\n    }\n    gobot.After(1*time.Second, func() {\n      ubit.WriteText(\"Hello\")\n    })\n    gobot.After(7*time.Second, func() {\n      ubit.Smile()\n    })\n  }\n\n  robot := gobot.NewRobot(\"blinkBot\",\n    []gobot.Connection{bleAdaptor},\n    []gobot.Device{ubit},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n### Using Microbit with GPIO and AIO Drivers\n\nThe IOPinDriver is a special kind of Driver. It supports the DigitalReader, DigitalWriter, and AnalogReader interfaces.\n\nThis means you can use it with any gpio or aio Driver. In this example, we are using the normal `gpio.ButtonDriver` and `gpio.LedDriver`:\n\n```go\npackage main\n\nimport (\n  \"os\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n  \"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n)\n\nfunc main() {\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n\n  ubit := microbit.NewIOPinDriver(bleAdaptor)\n  button := gpio.NewButtonDriver(ubit, \"0\")\n  led := gpio.NewLedDriver(ubit, \"1\")\n\n  work := func() {\n    _ = button.On(gpio.ButtonPush, func(data interface{}) {\n      if err := led.On(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n    _ = button.On(gpio.ButtonRelease, func(data interface{}) {\n      if err := led.Off(); err != nil {\n\t\tfmt.Println(err)\n\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"buttonBot\",\n    []gobot.Connection{bleAdaptor},\n    []gobot.Device{ubit, button, led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How to Connect\n\nThe Microbit is a Bluetooth LE device.\n\nYou need to know the BLE ID of the Microbit that you want to connect to.\n\n### OSX\n\nIf you connect by name, then you do not need to worry about the Bluetooth LE ID. However, if you want to connect by ID,\nOS X uses its own Bluetooth ID system which is different from the IDs used on Linux. The code calls thru the XPC interfaces\nprovided by OSX, so as a result does not need to run under sudo.\n\nFor example: `go run examples/microbit_led.go \"BBC micro:bit\"`\n\nOSX uses its own Bluetooth ID system which is different from the IDs used on Linux. The code calls thru the XPC interfaces\nprovided by OSX, so as a result does not need to run under sudo.\n\n### Ubuntu\n\nOn Linux the BLE code will need to run as a root user account. The easiest way to accomplish this is probably to use\n`go build` to build your program, and then to run the requesting executable using `sudo`.\n\nFor example:\n\n```sh\ngo build examples/microbit_led.go\nsudo ./microbit_led \"BBC micro:bit\"\n```\n\n### Windows\n\nHopefully coming soon...\n"
  },
  {
    "path": "platforms/microbit/doc.go",
    "content": "/*\nPackage microbit contains the Gobot drivers for the Microbit.\n\nFor more information refer to the microbit README:\nhttps://github.com/hybridgroup/gobot/blob/release/drivers/ble/microbit/README.md\n*/\npackage microbit // import \"gobot.io/x/gobot/v2/drivers/ble/microbit\"\n"
  },
  {
    "path": "platforms/mqtt/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/mqtt/README.md",
    "content": "# MQTT\n\nMQTT is an Internet of Things connectivity protocol featuring a lightweight publish/subscribe messaging transport. It is\nuseful for its small code footprint and minimal network bandwidth usage.\n\nThis repository contains the Gobot adaptor/driver to connect to MQTT servers. It uses the Paho MQTT Golang client package\n(<https://eclipse.org/paho/>) created and maintained by the Eclipse Foundation (<https://github.com/eclipse>) thank you!\n\nFor more info about the MQTT machine to machine messaging standard, go to <http://mqtt.org/>.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\nBefore running the example, make sure you have an MQTT message broker running somewhere you can connect to\n\n```go\npackage main\n\nimport (\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/mqtt\"\n  \"fmt\"\n  \"time\"\n)\n\nfunc main() {\n  mqttAdaptor := mqtt.NewAdaptor(\"tcp://0.0.0.0:1883\", \"pinger\")\n\n  work := func() {\n    _ = mqttAdaptor.On(\"hello\", func(msg mqtt.Message) {\n      fmt.Println(msg)\n    })\n    _ = mqttAdaptor.On(\"hola\", func(msg mqtt.Message) {\n      fmt.Println(msg)\n    })\n    data := []byte(\"o\")\n    gobot.Every(1*time.Second, func() {\n      mqttAdaptor.Publish(\"hello\", data)\n    })\n    gobot.Every(5*time.Second, func() {\n      mqttAdaptor.Publish(\"hola\", data)\n    })\n  }\n\n  robot := gobot.NewRobot(\"mqttBot\",\n    []gobot.Connection{mqttAdaptor},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## Supported Features\n\n* Publish messages\n* Respond to incoming message events\n\n## License\n\nCopyright (c) 2013-2018 The Hybrid Group. Licensed under the Apache 2.0 license.\n"
  },
  {
    "path": "platforms/mqtt/doc.go",
    "content": "/*\nPackage mqtt provides Gobot adaptor for the mqtt message service.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFor further information refer to mqtt README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/mqtt/README.md\n*/\npackage mqtt // import \"gobot.io/x/gobot/v2/platforms/mqtt\"\n"
  },
  {
    "path": "platforms/mqtt/mqtt_adaptor.go",
    "content": "package mqtt\n\nimport (\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"fmt\"\n\t\"os\"\n\n\tpaho \"github.com/eclipse/paho.mqtt.golang\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// ErrNilClient is returned when a client action can't be taken because the struct has no client\nvar ErrNilClient = fmt.Errorf(\"no MQTT client available\")\n\n// Message is a message received from the broker.\ntype Message paho.Message\n\n// Adaptor is the Gobot Adaptor for MQTT\ntype Adaptor struct {\n\tname          string\n\tHost          string\n\tclientID      string\n\tusername      string\n\tpassword      string\n\tuseSSL        bool\n\tserverCert    string\n\tclientCert    string\n\tclientKey     string\n\tautoReconnect bool\n\tcleanSession  bool\n\tclient        paho.Client\n\tqos           int\n}\n\n// NewAdaptor creates a new mqtt adaptor with specified host and client id\nfunc NewAdaptor(host string, clientID string) *Adaptor {\n\treturn &Adaptor{\n\t\tname:          gobot.DefaultName(\"MQTT\"),\n\t\tHost:          host,\n\t\tautoReconnect: false,\n\t\tcleanSession:  true,\n\t\tuseSSL:        false,\n\t\tclientID:      clientID,\n\t}\n}\n\n// NewAdaptorWithAuth creates a new mqtt adaptor with specified host, client id, username, and password.\nfunc NewAdaptorWithAuth(host, clientID, username, password string) *Adaptor {\n\treturn &Adaptor{\n\t\tname:          \"MQTT\",\n\t\tHost:          host,\n\t\tautoReconnect: false,\n\t\tcleanSession:  true,\n\t\tuseSSL:        false,\n\t\tclientID:      clientID,\n\t\tusername:      username,\n\t\tpassword:      password,\n\t}\n}\n\n// Name returns the MQTT adaptors name\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the MQTT adaptors name\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Port returns the Host name\nfunc (a *Adaptor) Port() string { return a.Host }\n\n// AutoReconnect returns the MQTT AutoReconnect setting\nfunc (a *Adaptor) AutoReconnect() bool { return a.autoReconnect }\n\n// SetAutoReconnect sets the MQTT AutoReconnect setting\nfunc (a *Adaptor) SetAutoReconnect(val bool) { a.autoReconnect = val }\n\n// CleanSession returns the MQTT CleanSession setting\nfunc (a *Adaptor) CleanSession() bool { return a.cleanSession }\n\n// SetCleanSession sets the MQTT CleanSession setting. Should be false if reconnect is enabled.\n// Otherwise all subscriptions will be lost\nfunc (a *Adaptor) SetCleanSession(val bool) { a.cleanSession = val }\n\n// UseSSL returns the MQTT server SSL preference\nfunc (a *Adaptor) UseSSL() bool { return a.useSSL }\n\n// SetUseSSL sets the MQTT server SSL preference\nfunc (a *Adaptor) SetUseSSL(val bool) { a.useSSL = val }\n\n// ServerCert returns the MQTT server SSL cert file\nfunc (a *Adaptor) ServerCert() string { return a.serverCert }\n\n// SetQoS sets the QoS value passed into the MTT client on Publish/Subscribe events\nfunc (a *Adaptor) SetQoS(qos int) { a.qos = qos }\n\n// SetServerCert sets the MQTT server SSL cert file\nfunc (a *Adaptor) SetServerCert(val string) { a.serverCert = val }\n\n// ClientCert returns the MQTT client SSL cert file\nfunc (a *Adaptor) ClientCert() string { return a.clientCert }\n\n// SetClientCert sets the MQTT client SSL cert file\nfunc (a *Adaptor) SetClientCert(val string) { a.clientCert = val }\n\n// ClientKey returns the MQTT client SSL key file\nfunc (a *Adaptor) ClientKey() string { return a.clientKey }\n\n// SetClientKey sets the MQTT client SSL key file\nfunc (a *Adaptor) SetClientKey(val string) { a.clientKey = val }\n\n// Connect returns true if connection to mqtt is established\nfunc (a *Adaptor) Connect() error {\n\ta.client = paho.NewClient(a.createClientOptions())\n\tif token := a.client.Connect(); token.Wait() && token.Error() != nil {\n\t\treturn token.Error()\n\t}\n\n\treturn nil\n}\n\n// Disconnect returns true if connection to mqtt is closed\nfunc (a *Adaptor) Disconnect() error {\n\tif a.client != nil {\n\t\ta.client.Disconnect(500)\n\t}\n\treturn nil\n}\n\n// Finalize returns true if connection to mqtt is finalized successfully\nfunc (a *Adaptor) Finalize() error {\n\treturn a.Disconnect()\n}\n\n// Publish a message under a specific topic\nfunc (a *Adaptor) Publish(topic string, message []byte) bool {\n\t_, err := a.PublishWithQOS(topic, a.qos, message)\n\treturn err == nil\n}\n\n// PublishAndRetain publishes a message under a specific topic with retain flag\nfunc (a *Adaptor) PublishAndRetain(topic string, message []byte) bool {\n\tif a.client == nil {\n\t\treturn false\n\t}\n\n\ta.client.Publish(topic, byte(a.qos), true, message)\n\treturn true\n}\n\n// PublishWithQOS allows per-publish QOS values to be set and returns a paho.Token\nfunc (a *Adaptor) PublishWithQOS(topic string, qos int, message []byte) (paho.Token, error) {\n\tif a.client == nil {\n\t\treturn nil, ErrNilClient\n\t}\n\n\ttoken := a.client.Publish(topic, byte(qos), false, message)\n\treturn token, nil\n}\n\n// OnWithQOS allows per-subscribe QOS values to be set and returns a paho.Token\nfunc (a *Adaptor) OnWithQOS(event string, qos int, f func(msg Message)) (paho.Token, error) {\n\tif a.client == nil {\n\t\treturn nil, ErrNilClient\n\t}\n\n\ttoken := a.client.Subscribe(event, byte(qos), func(client paho.Client, msg paho.Message) {\n\t\tf(msg)\n\t})\n\n\treturn token, nil\n}\n\n// On subscribes to a topic, and then calls the message handler function when data is received\nfunc (a *Adaptor) On(event string, f func(msg Message)) bool {\n\t_, err := a.OnWithQOS(event, a.qos, f)\n\treturn err == nil\n}\n\nfunc (a *Adaptor) createClientOptions() *paho.ClientOptions {\n\topts := paho.NewClientOptions()\n\topts.AddBroker(a.Host)\n\topts.SetClientID(a.clientID)\n\tif a.username != \"\" && a.password != \"\" {\n\t\topts.SetPassword(a.password)\n\t\topts.SetUsername(a.username)\n\t}\n\topts.AutoReconnect = a.autoReconnect\n\topts.CleanSession = a.cleanSession\n\n\tif a.UseSSL() {\n\t\topts.SetTLSConfig(a.newTLSConfig())\n\t}\n\treturn opts\n}\n\n// newTLSConfig sets the TLS config in the case that we are using\n// an MQTT broker with TLS\nfunc (a *Adaptor) newTLSConfig() *tls.Config {\n\t// Import server certificate\n\tvar certpool *x509.CertPool\n\tif len(a.ServerCert()) > 0 {\n\t\tcertpool = x509.NewCertPool()\n\t\tpemCerts, err := os.ReadFile(a.ServerCert())\n\t\tif err == nil {\n\t\t\tcertpool.AppendCertsFromPEM(pemCerts)\n\t\t}\n\t}\n\n\t// Import client certificate/key pair\n\tvar certs []tls.Certificate\n\tif len(a.ClientCert()) > 0 && len(a.ClientKey()) > 0 {\n\t\tcert, err := tls.LoadX509KeyPair(a.ClientCert(), a.ClientKey())\n\t\tif err != nil {\n\t\t\t// TODO: proper error handling\n\t\t\tpanic(err)\n\t\t}\n\t\tcerts = append(certs, cert)\n\t}\n\n\t// Create tls.Config with desired tls properties\n\treturn &tls.Config{\n\t\t// RootCAs = certs used to verify server cert.\n\t\tRootCAs: certpool,\n\t\t// ClientAuth = whether to request cert from server.\n\t\t// Since the server is set up for SSL, this happens\n\t\t// anyways.\n\t\tClientAuth: tls.NoClientCert,\n\t\t// ClientCAs = certs used to validate client cert.\n\t\tClientCAs: nil,\n\t\t// InsecureSkipVerify = verify that cert contents\n\t\t// match server. IP matches what is in cert etc.\n\t\tInsecureSkipVerify: false,\n\t\t// Certificates = list of certs client sends to server.\n\t\tCertificates: certs,\n\t\t// MinVersion contains the minimum TLS version that is acceptable.\n\t\t// TLS 1.2 is currently used as the minimum when acting as a client.\n\t\tMinVersion: tls.VersionTLS12,\n\t}\n}\n"
  },
  {
    "path": "platforms/mqtt/mqtt_adaptor_test.go",
    "content": "package mqtt\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc initTestMqttAdaptor() *Adaptor {\n\treturn NewAdaptor(\"tcp://localhost:1883\", \"client\")\n}\n\nfunc TestMqttAdaptorName(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"MQTT\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestMqttAdaptorPort(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.Equal(t, \"tcp://localhost:1883\", a.Port())\n}\n\nfunc TestMqttAdaptorAutoReconnect(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.False(t, a.AutoReconnect())\n\ta.SetAutoReconnect(true)\n\tassert.True(t, a.AutoReconnect())\n}\n\nfunc TestMqttAdaptorCleanSession(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.True(t, a.CleanSession())\n\ta.SetCleanSession(false)\n\tassert.False(t, a.CleanSession())\n}\n\nfunc TestMqttAdaptorUseSSL(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.False(t, a.UseSSL())\n\ta.SetUseSSL(true)\n\tassert.True(t, a.UseSSL())\n}\n\nfunc TestMqttAdaptorUseServerCert(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.Empty(t, a.ServerCert())\n\ta.SetServerCert(\"/path/to/server.cert\")\n\tassert.Equal(t, \"/path/to/server.cert\", a.ServerCert())\n}\n\nfunc TestMqttAdaptorUseClientCert(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.Empty(t, a.ClientCert())\n\ta.SetClientCert(\"/path/to/client.cert\")\n\tassert.Equal(t, \"/path/to/client.cert\", a.ClientCert())\n}\n\nfunc TestMqttAdaptorUseClientKey(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.Empty(t, a.ClientKey())\n\ta.SetClientKey(\"/path/to/client.key\")\n\tassert.Equal(t, \"/path/to/client.key\", a.ClientKey())\n}\n\nfunc TestMqttAdaptorConnectError(t *testing.T) {\n\ta := NewAdaptor(\"tcp://localhost:1884\", \"client\")\n\n\terr := a.Connect()\n\trequire.ErrorContains(t, err, \"connection refused\")\n}\n\nfunc TestMqttAdaptorConnectSSLError(t *testing.T) {\n\ta := NewAdaptor(\"tcp://localhost:1884\", \"client\")\n\ta.SetUseSSL(true)\n\terr := a.Connect()\n\trequire.ErrorContains(t, err, \"connection refused\")\n}\n\nfunc TestMqttAdaptorConnectWithAuthError(t *testing.T) {\n\ta := NewAdaptorWithAuth(\"xyz://localhost:1883\", \"client\", \"user\", \"pass\")\n\trequire.ErrorContains(t, a.Connect(), \"network Error : unknown protocol\")\n}\n\nfunc TestMqttAdaptorFinalize(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestMqttAdaptorCannotPublishUnlessConnected(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tdata := []byte(\"o\")\n\tassert.False(t, a.Publish(\"test\", data))\n}\n\nfunc TestMqttAdaptorPublishWhenConnected(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\t_ = a.Connect()\n\tdata := []byte(\"o\")\n\tassert.True(t, a.Publish(\"test\", data))\n}\n\nfunc TestMqttAdaptorCannotOnUnlessConnected(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\tassert.False(t, a.On(\"hola\", func(msg Message) {\n\t\tfmt.Println(\"hola\")\n\t}))\n}\n\nfunc TestMqttAdaptorOnWhenConnected(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\t_ = a.Connect()\n\tassert.True(t, a.On(\"hola\", func(msg Message) {\n\t\tfmt.Println(\"hola\")\n\t}))\n}\n\nfunc TestMqttAdaptorQoS(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\ta.SetQoS(1)\n\tassert.Equal(t, 1, a.qos)\n}\n"
  },
  {
    "path": "platforms/mqtt/mqtt_driver.go",
    "content": "package mqtt\n\nimport \"gobot.io/x/gobot/v2\"\n\nconst (\n\t// Data event when data is available for Driver\n\tData = \"data\"\n\n\t// Error event when error occurs in Driver\n\tError = \"error\"\n)\n\n// Driver for mqtt\ntype Driver struct {\n\tgobot.Eventer\n\tgobot.Commander\n\n\tname       string\n\ttopic      string\n\tconnection gobot.Connection\n}\n\n// NewDriver returns a new Gobot MQTT Driver\nfunc NewDriver(a *Adaptor, topic string) *Driver {\n\tm := &Driver{\n\t\tname:       gobot.DefaultName(\"MQTT\"),\n\t\ttopic:      topic,\n\t\tconnection: a,\n\t\tEventer:    gobot.NewEventer(),\n\t\tCommander:  gobot.NewCommander(),\n\t}\n\n\tm.AddEvent(Data)\n\tm.AddEvent(Error)\n\n\treturn m\n}\n\n// Name returns name for the Driver\nfunc (m *Driver) Name() string { return m.name }\n\n// Name sets name for the Driver\nfunc (m *Driver) SetName(name string) { m.name = name }\n\n// Connection returns Connections used by the Driver\nfunc (m *Driver) Connection() gobot.Connection {\n\treturn m.connection\n}\n\nfunc (m *Driver) adaptor() *Adaptor {\n\t//nolint:forcetypeassert // ok here\n\treturn m.Connection().(*Adaptor)\n}\n\n// Start starts the Driver\nfunc (m *Driver) Start() error {\n\treturn nil\n}\n\n// Halt halts the Driver\nfunc (m *Driver) Halt() error {\n\treturn nil\n}\n\n// Topic returns the current topic for the Driver\nfunc (m *Driver) Topic() string { return m.topic }\n\n// SetTopic sets the current topic for the Driver\nfunc (m *Driver) SetTopic(topic string) { m.topic = topic }\n\n// Publish a message to the current device topic\nfunc (m *Driver) Publish(data interface{}) bool {\n\t//nolint:forcetypeassert // ok here\n\tmessage := data.([]byte)\n\treturn m.adaptor().Publish(m.topic, message)\n}\n\n// On subscribes to data updates for the current device topic,\n// and then calls the message handler function when data is received\nfunc (m *Driver) On(n string, f func(msg interface{})) error {\n\t// TODO: also be able to subscribe to Error updates\n\tf1 := func(msg Message) {\n\t\tf(msg)\n\t}\n\tm.adaptor().On(m.topic, f1)\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/mqtt/mqtt_driver_test.go",
    "content": "package mqtt\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc TestMqttDriver(t *testing.T) {\n\td := NewDriver(initTestMqttAdaptor(), \"/test/topic\")\n\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MQTT\"))\n\tassert.True(t, strings.HasPrefix(d.Connection().Name(), \"MQTT\"))\n\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestMqttDriverName(t *testing.T) {\n\td := NewDriver(initTestMqttAdaptor(), \"/test/topic\")\n\tassert.True(t, strings.HasPrefix(d.Name(), \"MQTT\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestMqttDriverTopic(t *testing.T) {\n\td := NewDriver(initTestMqttAdaptor(), \"/test/topic\")\n\tassert.Equal(t, \"/test/topic\", d.Topic())\n\td.SetTopic(\"/test/newtopic\")\n\tassert.Equal(t, \"/test/newtopic\", d.Topic())\n}\n\nfunc TestMqttDriverPublish(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\td := NewDriver(a, \"/test/topic\")\n\t_ = a.Connect()\n\t_ = d.Start()\n\tdefer func() { _ = d.Halt() }()\n\tassert.True(t, d.Publish([]byte{0x01, 0x02, 0x03}))\n}\n\nfunc TestMqttDriverPublishError(t *testing.T) {\n\ta := initTestMqttAdaptor()\n\td := NewDriver(a, \"/test/topic\")\n\t_ = d.Start()\n\tdefer func() { _ = d.Halt() }()\n\tassert.False(t, d.Publish([]byte{0x01, 0x02, 0x03}))\n}\n"
  },
  {
    "path": "platforms/nats/README.md",
    "content": "# NATS\n\nNATS is a lightweight messaging protocol perfect for your IoT/Robotics projects. It operates over TCP, offers a great\nnumber of features but an incredibly simple Pub Sub style model of communicating broadcast messages. NATS is blazingly\nfast as it is written in Go.\n\nThis repository contains the Gobot adaptor/drivers to connect to NATS servers. It uses the NATS Go Client available at\n<https://github.com/nats-io/nats>. The NATS project is a project part of the [CNCF](https://www.cncf.io/). Find more\ninformation on setting up a NATS server and its capability at <http://nats.io/>.\n\nThe NATS messaging protocol (<http://www.nats.io/documentation/internals/nats-protocol-demo/>) is really easy to work\nwith and can be practiced by setting up a NATS server using Go or Docker. For information on setting up a server using\nthe source code, visit <https://github.com/nats-io/gnatsd>. For information on the Docker image up on Docker Hub, see\n<https://hub.docker.com/_/nats/>. Getting the server set up is very easy. The server itself is Golang, can be built for\ndifferent architectures and installs in a small footprint. This is an excellent way to get communications going between\nyour IoT and Robotics projects.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\nBefore running the example, make sure you have an NATS server running somewhere you can connect to (for demo purposes\nyou could also use the public endpoint `demo.nats.io:4222`).\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/nats\"\n)\n\nfunc main() {\n  natsAdaptor := nats.NewAdaptor(\"nats://localhost:4222\", 1234)\n\n  work := func() {\n    natsAdaptor.On(\"hello\", func(msg nats.Message) {\n      fmt.Printf(\"[Received on %q] %s\\n\", msg.Subject, string(msg.Data))\n    })\n    natsAdaptor.On(\"hola\", func(msg nats.Message) {\n      fmt.Printf(\"[Received on %q] %s\\n\", msg.Subject, string(msg.Data))\n    })\n\n    data := []byte(\"Hello Gobot!\")\n    gobot.Every(1*time.Second, func() {\n      natsAdaptor.Publish(\"hello\", data)\n    })\n    gobot.Every(5*time.Second, func() {\n      natsAdaptor.Publish(\"hola\", data)\n    })\n  }\n\n  robot := gobot.NewRobot(\"natsBot\",\n    []gobot.Connection{natsAdaptor},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nTo run with TLS enabled, set the URL scheme prefix to `tls://`. Make sure the NATS server has TLS enabled and use the\nNATS option parameters to pass in the TLS settings to the adaptor. Refer to the [github.com/nats-io/go-nats](https://github.com/nats-io/go-nats)\nREADME for more TLS option parameters.\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  natsio \"github.com/nats-io/go-nats\"\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/nats\"\n)\n\nfunc main() {\n  natsAdaptor := nats.NewAdaptor(\"tls://localhost:4222\", 1234, natsio.RootCAs(\"certs/ca.pem\"))\n\n  work := func() {\n    natsAdaptor.On(\"hello\", func(msg nats.Message) {\n      fmt.Printf(\"[Received on %q] %s\\n\", msg.Subject, string(msg.Data))\n    })\n    natsAdaptor.On(\"hola\", func(msg nats.Message) {\n      fmt.Printf(\"[Received on %q] %s\\n\", msg.Subject, string(msg.Data))\n    })\n\n    data := []byte(\"Hello Gobot!\")\n    gobot.Every(1*time.Second, func() {\n      natsAdaptor.Publish(\"hello\", data)\n    })\n    gobot.Every(5*time.Second, func() {\n      natsAdaptor.Publish(\"hola\", data)\n    })\n  }\n\n  robot := gobot.NewRobot(\"natsBot\",\n    []gobot.Connection{natsAdaptor},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n### Supported Features\n\n* Publish messages\n* Respond to incoming message events\n* Support for Username/password authentication\n* Support for NATS adaptor options to support TLS\n\n### Upcoming Features\n\n* Encoded messages (JSON)\n* Exposing more NATS Features (tls)\n* Simplified tests\n\n## License\n\nCopyright (c) 2013-2018 The Hybrid Group. Licensed under the Apache 2.0 license.\n"
  },
  {
    "path": "platforms/nats/doc.go",
    "content": "/*\nPackage nats provides Gobot adaptor for the nats message service.\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFor further information refer to nats README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/nats/README.md\n*/\npackage nats // import \"gobot.io/x/gobot/v2/platforms/nats\"\n"
  },
  {
    "path": "platforms/nats/nats_adaptor.go",
    "content": "package nats\n\nimport (\n\t\"log\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/nats-io/nats.go\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Adaptor is a configuration struct for interacting with a NATS server.\n// Name is a logical name for the adaptor/nats server connection.\n// Host is in the form \"localhost:4222\" which is the hostname/ip and port of the nats server.\n// ClientID is a unique identifier integer that specifies the identity of the client.\ntype Adaptor struct {\n\tname     string\n\tHost     string\n\tclientID int\n\tusername string\n\tpassword string\n\tclient   *nats.Conn\n\tconnect  func() (*nats.Conn, error)\n}\n\n// Message is a message received from the server.\ntype Message *nats.Msg\n\n// NewAdaptor populates a new NATS Adaptor.\nfunc NewAdaptor(host string, clientID int, options ...nats.Option) *Adaptor {\n\thosts, err := processHostString(host)\n\n\treturn &Adaptor{\n\t\tname:     gobot.DefaultName(\"NATS\"),\n\t\tHost:     hosts,\n\t\tclientID: clientID,\n\t\tconnect: func() (*nats.Conn, error) {\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nats.Connect(hosts, options...)\n\t\t},\n\t}\n}\n\n// NewAdaptorWithAuth populates a NATS Adaptor including username and password.\nfunc NewAdaptorWithAuth(host string, clientID int, username string, password string, options ...nats.Option) *Adaptor {\n\thosts, err := processHostString(host)\n\n\treturn &Adaptor{\n\t\tHost:     hosts,\n\t\tclientID: clientID,\n\t\tusername: username,\n\t\tpassword: password,\n\t\tconnect: func() (*nats.Conn, error) {\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nats.Connect(hosts, append(options, nats.UserInfo(username, password))...)\n\t\t},\n\t}\n}\n\nfunc processHostString(host string) (string, error) {\n\turls := strings.Split(host, \",\")\n\tfor i, s := range urls {\n\t\ts = strings.TrimSpace(s)\n\t\tif !strings.HasPrefix(s, \"tls://\") && !strings.HasPrefix(s, \"nats://\") {\n\t\t\ts = \"nats://\" + s\n\t\t}\n\n\t\tu, err := url.Parse(s)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\turls[i] = u.String()\n\t}\n\n\treturn strings.Join(urls, \",\"), nil\n}\n\n// Name returns the logical client name.\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the logical client name.\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect makes a connection to the Nats server.\nfunc (a *Adaptor) Connect() error {\n\tvar err error\n\ta.client, err = a.connect()\n\treturn err\n}\n\n// Disconnect from the nats server.\nfunc (a *Adaptor) Disconnect() error {\n\tif a.client != nil {\n\t\ta.client.Close()\n\t}\n\treturn nil\n}\n\n// Finalize is simply a helper method for the disconnect.\nfunc (a *Adaptor) Finalize() error {\n\treturn a.Disconnect()\n}\n\n// Publish sends a message with the particular topic to the nats server.\nfunc (a *Adaptor) Publish(topic string, message []byte) bool {\n\tif a.client == nil {\n\t\treturn false\n\t}\n\n\tif err := a.client.Publish(topic, message); err != nil {\n\t\tlog.Println(err)\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// On is an event-handler style subscriber to a particular topic (named event).\n// Supply a handler function to use the bytes returned by the server.\nfunc (a *Adaptor) On(event string, f func(msg Message)) bool {\n\tif a.client == nil {\n\t\treturn false\n\t}\n\tif _, err := a.client.Subscribe(event, func(msg *nats.Msg) {\n\t\tf(msg)\n\t}); err != nil {\n\t\tlog.Println(err)\n\t\treturn false\n\t}\n\n\treturn true\n}\n"
  },
  {
    "path": "platforms/nats/nats_adaptor_test.go",
    "content": "package nats\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc connStub(options ...nats.Option) func() (*nats.Conn, error) {\n\treturn func() (*nats.Conn, error) {\n\t\topts := nats.GetDefaultOptions()\n\t\tfor _, opt := range options {\n\t\t\tif err := opt(&opts); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tc := &nats.Conn{Opts: opts}\n\t\treturn c, nil\n\t}\n}\n\nfunc initTestNatsAdaptor() *Adaptor {\n\ta := NewAdaptor(\"localhost:4222\", 19999)\n\ta.connect = func() (*nats.Conn, error) {\n\t\tc := &nats.Conn{}\n\t\treturn c, nil\n\t}\n\treturn a\n}\n\nfunc initTestNatsAdaptorWithAuth() *Adaptor {\n\ta := NewAdaptorWithAuth(\"localhost:4222\", 29999, \"user\", \"pass\")\n\ta.connect = func() (*nats.Conn, error) {\n\t\tc := &nats.Conn{}\n\t\treturn c, nil\n\t}\n\treturn a\n}\n\nfunc initTestNatsAdaptorTLS(options ...nats.Option) *Adaptor {\n\ta := NewAdaptor(\"tls://localhost:4242\", 39999, options...)\n\ta.connect = connStub(options...)\n\treturn a\n}\n\nfunc TestNatsAdaptorName(t *testing.T) {\n\ta := initTestNatsAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"NATS\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNatsAdaptorReturnsHost(t *testing.T) {\n\ta := initTestNatsAdaptor()\n\tassert.Equal(t, \"nats://localhost:4222\", a.Host)\n}\n\nfunc TestNatsAdaptorWithAuth(t *testing.T) {\n\ta := initTestNatsAdaptorWithAuth()\n\tassert.Equal(t, \"user\", a.username)\n\tassert.Equal(t, \"pass\", a.password)\n}\n\nfunc TestNatsAdapterSetsRootCAs(t *testing.T) {\n\ta := initTestNatsAdaptorTLS(nats.RootCAs(\"test_certs/catest.pem\"))\n\tassert.Equal(t, \"tls://localhost:4242\", a.Host)\n\t_ = a.Connect()\n\to := a.client.Opts\n\tcasPool, err := o.RootCAsCB()\n\trequire.NoError(t, err)\n\tassert.NotNil(t, casPool)\n\tassert.True(t, o.Secure)\n}\n\nfunc TestNatsAdapterSetsClientCerts(t *testing.T) {\n\ta := initTestNatsAdaptorTLS(nats.ClientCert(\"test_certs/client-cert.pem\", \"test_certs/client-key.pem\"))\n\tassert.Equal(t, \"tls://localhost:4242\", a.Host)\n\t_ = a.Connect()\n\tcert, err := a.client.Opts.TLSCertCB()\n\trequire.NoError(t, err)\n\tassert.NotNil(t, cert)\n\tassert.NotNil(t, cert.Leaf)\n\tassert.True(t, a.client.Opts.Secure)\n}\n\nfunc TestNatsAdapterSetsClientCertsWithUserInfo(t *testing.T) {\n\ta := initTestNatsAdaptorTLS(nats.ClientCert(\"test_certs/client-cert.pem\", \"test_certs/client-key.pem\"),\n\t\tnats.UserInfo(\"test\", \"testwd\"))\n\tassert.Equal(t, \"tls://localhost:4242\", a.Host)\n\t_ = a.Connect()\n\tcert, err := a.client.Opts.TLSCertCB()\n\trequire.NoError(t, err)\n\tassert.NotNil(t, cert)\n\tassert.NotNil(t, cert.Leaf)\n\tassert.True(t, a.client.Opts.Secure)\n\tassert.Equal(t, \"test\", a.client.Opts.User)\n\tassert.Equal(t, \"testwd\", a.client.Opts.Password)\n}\n\n// TODO: implement this test without requiring actual server connection\nfunc TestNatsAdaptorPublishWhenConnected(t *testing.T) {\n\tt.Skip(\"TODO: implement this test without requiring actual server connection\")\n\ta := initTestNatsAdaptor()\n\t_ = a.Connect()\n\tdata := []byte(\"o\")\n\tassert.True(t, a.Publish(\"test\", data))\n}\n\n// TODO: implement this test without requiring actual server connection\nfunc TestNatsAdaptorOnWhenConnected(t *testing.T) {\n\tt.Skip(\"TODO: implement this test without requiring actual server connection\")\n\ta := initTestNatsAdaptor()\n\t_ = a.Connect()\n\tassert.True(t, a.On(\"hola\", func(msg Message) {\n\t\tfmt.Println(\"hola\")\n\t}))\n}\n\n// TODO: implement this test without requiring actual server connection\nfunc TestNatsAdaptorPublishWhenConnectedWithAuth(t *testing.T) {\n\tt.Skip(\"TODO: implement this test without requiring actual server connection\")\n\ta := NewAdaptorWithAuth(\"localhost:4222\", 49999, \"test\", \"testwd\")\n\t_ = a.Connect()\n\tdata := []byte(\"o\")\n\tassert.True(t, a.Publish(\"test\", data))\n}\n\n// TODO: implement this test without requiring actual server connection\nfunc TestNatsAdaptorOnWhenConnectedWithAuth(t *testing.T) {\n\tt.Skip(\"TODO: implement this test without requiring actual server connection\")\n\tlog.Println(\"###not skipped###\")\n\ta := NewAdaptorWithAuth(\"localhost:4222\", 59999, \"test\", \"testwd\")\n\t_ = a.Connect()\n\tassert.True(t, a.On(\"hola\", func(msg Message) {\n\t\tfmt.Println(\"hola\")\n\t}))\n}\n\nfunc TestNatsAdaptorFailedConnect(t *testing.T) {\n\ta := NewAdaptor(\"localhost:9999\", 69999)\n\terr := a.Connect()\n\tif err != nil && strings.Contains(err.Error(), \"cannot assign requested address\") {\n\t\tt.Skip(\"FLAKY: Can not test, because IP or port is in use.\")\n\t}\n\trequire.ErrorContains(t, err, \"nats: no servers available for connection\")\n}\n\nfunc TestNatsAdaptorFinalize(t *testing.T) {\n\ta := NewAdaptor(\"localhost:9999\", 79999)\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestNatsAdaptorCannotPublishUnlessConnected(t *testing.T) {\n\ta := NewAdaptor(\"localhost:9999\", 89999)\n\tdata := []byte(\"o\")\n\tassert.False(t, a.Publish(\"test\", data))\n}\n\nfunc TestNatsAdaptorCannotOnUnlessConnected(t *testing.T) {\n\ta := NewAdaptor(\"localhost:9999\", 99999)\n\tassert.False(t, a.On(\"hola\", func(msg Message) {\n\t\tfmt.Println(\"hola\")\n\t}))\n}\n"
  },
  {
    "path": "platforms/nats/nats_driver.go",
    "content": "package nats\n\nimport \"gobot.io/x/gobot/v2\"\n\nconst (\n\t// Data event when data is available for Driver\n\tData = \"data\"\n\n\t// Error event when error occurs in Driver\n\tError = \"error\"\n)\n\n// Driver for NATS\ntype Driver struct {\n\tgobot.Eventer\n\tgobot.Commander\n\n\tname       string\n\ttopic      string\n\tconnection gobot.Connection\n}\n\n// NewDriver returns a new Gobot NATS Driver\nfunc NewDriver(a *Adaptor, topic string) *Driver {\n\tm := &Driver{\n\t\tname:       gobot.DefaultName(\"NATS\"),\n\t\ttopic:      topic,\n\t\tconnection: a,\n\t\tEventer:    gobot.NewEventer(),\n\t\tCommander:  gobot.NewCommander(),\n\t}\n\n\treturn m\n}\n\n// Name returns name for the Driver\nfunc (m *Driver) Name() string { return m.name }\n\n// SetName sets name for the Driver\nfunc (m *Driver) SetName(name string) { m.name = name }\n\n// Connection returns Connections used by the Driver\nfunc (m *Driver) Connection() gobot.Connection {\n\treturn m.connection\n}\n\nfunc (m *Driver) adaptor() *Adaptor {\n\t//nolint:forcetypeassert // ok here\n\treturn m.Connection().(*Adaptor)\n}\n\n// Start starts the Driver\nfunc (m *Driver) Start() error {\n\treturn nil\n}\n\n// Halt halts the Driver\nfunc (m *Driver) Halt() error {\n\treturn nil\n}\n\n// Topic returns the current topic for the Driver\nfunc (m *Driver) Topic() string { return m.topic }\n\n// SetTopic sets the current topic for the Driver\nfunc (m *Driver) SetTopic(topic string) { m.topic = topic }\n\n// Publish a message to the current device topic\nfunc (m *Driver) Publish(data interface{}) bool {\n\t//nolint:forcetypeassert // ok here\n\tmessage := data.([]byte)\n\treturn m.adaptor().Publish(m.topic, message)\n}\n\n// On subscribes to data updates for the current device topic,\n// and then calls the message handler function when data is received\nfunc (m *Driver) On(n string, f func(msg Message)) error {\n\t// TODO: also be able to subscribe to Error updates\n\tm.adaptor().On(m.topic, f)\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/nats/nats_driver_test.go",
    "content": "package nats\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc TestNatsDriver(t *testing.T) {\n\td := NewDriver(initTestNatsAdaptor(), \"/test/topic\")\n\n\tassert.True(t, strings.HasPrefix(d.Name(), \"NATS\"))\n\tassert.True(t, strings.HasPrefix(d.Connection().Name(), \"NATS\"))\n\tassert.NotNil(t, d.adaptor())\n\n\trequire.NoError(t, d.Start())\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestNatsDriverName(t *testing.T) {\n\td := NewDriver(initTestNatsAdaptor(), \"/test/topic\")\n\tassert.True(t, strings.HasPrefix(d.Name(), \"NATS\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestNatsDriverTopic(t *testing.T) {\n\td := NewDriver(initTestNatsAdaptor(), \"/test/topic\")\n\td.SetTopic(\"interestingtopic\")\n\tassert.Equal(t, \"interestingtopic\", d.Topic())\n}\n"
  },
  {
    "path": "platforms/nats/test_certs/catest-key.pem",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-256-CBC,A22F189537986661D31D1E3E2E4883C9\n\n4M+2g/t6q7FfWY7zA8J4JsIRDy3H0y5X6tKtJMIeqlW6CZV0HFNJiiA35/rL3sP7\nc96cSY8olwy3mMjk88NrLmAVLfLRzfnu5PEx3mpgqGbRuzElLsYUikU3bjmfpyJA\nUHjZav5rrG5un5+ZJ6SDlCMo90WWyGOcTyDHdQ5zkLYMO6aRp5guhYMUBRR8MpJF\nAC88XiSjD64bYEMHIDB0jB8q6WonKM3nb9HorKShVq5rR1Yfps4NLbN8rq98Cv4M\ncpbI3Q1cXhum+VOHT0vBB9/oFc0+o3IFNdnjg5ygKU7aHjpBl88QJNFjkT4pdWEE\nOqrMFxsOb53BkOgkjqRadYYYFYh2MTAeP05Eg4c7SKPTq3d+S2Ti5OLcE4rNlCsE\nd+thb4xdsAamOJG3XrifVG8/VOiNNCG+jPASUWZ8ZXpshOnb3UXmA6tzR33y0E/R\nHWki9bpKZbznuTN4J3UrmvkJy2pX+RTwz2KApVrS934aFf4urNgSrNH3sb0Kpidi\nN3WD5SyEudGJcuRqn+wmbm5yPSafNPyHp8Gevh9+5XWlec9hkYeiSjh4aUwXFql3\nT3izp5f+bdupQ3W+G3Yd4+uv30KQJ9ZnIb/LHGn9FtzPG1svuD0vi6RAQuEySGwv\nY6fac1qDgfPI62QKlpL1X/BFubSK6P9p+OgX6oHM1FBU4U0GRH8curnsn6xkZ48b\nNr0yCrMaU48wLQXp/eyxJDx+rleeDrzDje+PW81//ujq44uLygPnnxTfkmIilu9X\nRSEEUZ4W4AXgaxndqZS0Elp7QneZLduIEYzQqlsXHfPqUKN3xyGyjgBu42eE4c1l\nk0yFYzebQBJ2nmT9vMLvwiU0BV5gwKLCb/T1Boql0VZCJhoenLP5Yzi/kw9GTCYX\nn/Ba1oPvb62vpESIzZqc6yU2RJnXqFi//dvmTi+MWjWK6L4Vf//LDihWDvvW1aU0\n1bjBWfwhPy1jv6SSjSjsAfXrBKGY1gJxaqcFBcotxyUUeV1069mM/ShEnNCex+cF\nnmKhnNbhJ2V9jf0c9Y59voDKf/xuYTsdTzu5svDSv8ox4oCQayrauGEfaypWCIgh\nhNoHy5+ottQJsKgmGb+VuED1o3/D/U7N4+Ee+6hJbJnbaV58r5SWjIR5pGlGy7VN\nhemNCJA4SBKwtTs2hUkzvYL3UpcQoSHMIXf7KW2v3EVgj/1HZOZwH5dYA2/pV+Pp\nJQy+zq/ImbVW54WPji2PaQs/j+fz0v2Hc0JxxEmtBQHWhHhrXzvnFrOMbdZfmPNz\n5MThA9U22mDn332WrGopFL6ZLCLEqUqQaVEAc3kiZskbfztDa+TS8SCZP9MYOcMY\n85GHK3rDuhUjarhWfUkfUVHt/jAWKVMzs8FVQZxtoUsSlJ+AOXa4JM233RA2h5v+\nTLASqIrfMxjAIOrbmKd4CX5xofNWqgYTcdbRpuuOoVZ3Lo7JQas7IO0MnIW44pyu\nub3qdbUJ/PomvcCO/ZVuIzwxtbWiciuk943ZEYmjCdVQSadhOEXRegbSxAIVRhF1\nCnJnYfs9Bsuler9Hs6H9NI4T97S5N0J8vK317ehNUUL5MFLVjiw2NmteABqvjUnv\nn7Gb7Epi1yYWCcURc/UI0V+wSf912I1xAfI6P/dkDNQgBz/grA6dBKUWZGfjCDGO\nFlzfrPbJDxHAj/X5u4Df0YY+uQJQ9Kk9ONtvgCcg5+w9ahokqmB+LY1yHe4eO6m9\nZMxL3L1A5aQ/QDN2areMoMCFMzEF2qIP+seMhQ6tPR7Rfi5WEMg+5JuNtsABXz3t\nBopJzC33aZLfkQ1alWNGhCEmtCsOO3P6fRGNHvLEcw8eJBX3V2R/Ar3re5nY/h+G\nxP/C0DR/TYyqM+9StCoLIXR1twN3AvWJU0hsKFejJEvzoL4qMrGDn4csznfc8bAB\nJIXVikNzaXDHc7hdKaqwe9G9e+TQrIUl4tRyaEKAu64TNVA11E2X5cF8dl9XUpcM\n59Zb3RUiw3/oqbG5BKvie7Udmxsil1EnFAEFrPT6TTFB+rswj9iPobX41tLZ6ZV8\nyRYrZ/DcGHCvjib1fA4BgeldIVin+92sQbgBlFVnPVWsPsmanzpQHQnb2NXaTtX3\nN9DMsnclaED7RMC7J5PgUGLyCqa9bRddsT5O+1xBykoU7J6OhXu4pe3rlNy4yJLd\nPFBB/JwzlDb9CxO4zN3ZrFUvwB9W/N0hAA+o9jTnTEtxyM7gitFkrGXHJIACfZmM\nWmoEYhEsqn0To78SGfe5jqp56DKPM7onhNWXUu+ZkRi4xFQXJqvwKjZpXV2oQOcS\n8JULyft9AmY7sChoNINlALdGRCXmKqoLg16suN7r6WpJx2peQg7fPsPxcb9/9hEM\ncmrISL7CoZOX01PyQyxL2KEEYjjef5Licz0ywk8DmUv1ABqtP7Uxha8dSuSq6mtc\nDVcO+YXS8DDsH5UvrGSsMO2Q+P9Juu8Nx+u2LfEF8ANds0L1mKa+3S8JQU8y28g9\n34wHQiSA88m7t841J9pJ7+Nlymac3qRRTIyvu7SIz7dTBjPuAdDf/GPfG42YF9D9\nsp0NXLzR1Sp2+4ZWrxZoezt8Sljnhl9olSqtrMrV/Dtco/04RXnepCBmE+JIA5sx\ns+CxWaDjzc2+CN1BOO9Bi9fGsXSmbcGnQ3+UyJWfIPDENUhAdI7ccLCim6R5MDIL\nZ7bpXR1zw6eIGdFcSsG0dXspPGARQdsFI6r+OroK7MaUkbHE7qjX93LMqd0a/h87\nQNUQZleBNAllrFeKvcCwuzVamJyv5gbgdbibpy7Ue5URUxlyy4RCUHnZXLJ7kOE4\nXu8bCzK6nZJ+AQBadtFDT45RWjtMoexkvjZszVgtZLz0TGWnK0SOf/t8MeJ+FKu8\naob7iYLX1xAt9ztnpcR7unDaBiYmePghc9b8SrVfcQdjUe0TxGsW2kQmu6QYvvQ1\npRGmvxRPk2KUUG2rCNlZDfNscEGiIE6Ff4wLQr9N01zXpWx1w3uURcIlZzFvXKOi\nUtnHbqI49qnJTz/iVGREd0PqHTu+yVKal4OVpGNLMSV9K+ERVI40gllC5tiHX0A+\ndRlXxI+s7vJ9rwtyq32XYZtvKiuqCdsMQyOJ2fNaQ4bz06OxvtV301LXxXv1Kya/\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "platforms/nats/test_certs/catest.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIGpDCCBIygAwIBAgIJAIBmBEvgiah+MA0GCSqGSIb3DQEBCwUAMIGSMQswCQYD\nVQQGEwJVUzEPMA0GA1UECBMGSGF3YWlpMREwDwYDVQQHEwhIb25vbHVsdTERMA8G\nA1UEChMIR29ib3QuaW8xFDASBgNVBAsTC09wZW4gU291cmNlMRIwEAYDVQQDEwls\nb2NhbGhvc3QxIjAgBgkqhkiG9w0BCQEWE25vd2hlcmVAbm93aGVyZS5jb20wHhcN\nMTcwMjEzMDEyNzA4WhcNMjIwMjEyMDEyNzA4WjCBkjELMAkGA1UEBhMCVVMxDzAN\nBgNVBAgTBkhhd2FpaTERMA8GA1UEBxMISG9ub2x1bHUxETAPBgNVBAoTCEdvYm90\nLmlvMRQwEgYDVQQLEwtPcGVuIFNvdXJjZTESMBAGA1UEAxMJbG9jYWxob3N0MSIw\nIAYJKoZIhvcNAQkBFhNub3doZXJlQG5vd2hlcmUuY29tMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAv8dYH8TRoSwD0yWHr8A7w+vkK6HmImh/VuC9ZpQm\nilIpzKgU2Y9hG3+C1OmqyxVSWHhVRFOHv7TUzR5Q7C2PM7GwYe+QHrheZ8ZByRp0\nHLcqo/FVpKg7k/cNwGQYWkQ8W4Qms/hI0F0F3r7gHrlLNJ4MTvZAxpfsfo0Qiuc6\nZdf9ugbpSTMoKtkHqpeOu2xo4ScOot1UqQy7xSzAIK3W6FIVLuXbDW16fViYkwUB\npWGjwBqotR4tZg4mp4ehaXhtapHyAk8H6gEQcgPkqw8PDVqi336gbiOMlHvMI2m0\niPwidX96Nd7sHuDERrOsi3LEGGl9uzCqEePAj6k5iuYa4c+0Os7t/w0s2ttCz4Xn\nryoKxQsaq313WnT84SsQQu5S8ZFJf2B5A+jC8phZx79KHf0QlLlB+xFYxQj1byjX\nxiUdCw1fA9ocC+Q/rgL59MbHyEApYU04/aKxhnak/bSBgmqekTQyMvwez9VVQ5qY\nTFiirEMqc2qZym8nbO38YKyvGGkrY5oOzBNEW4WrUuhoJGvt+Up3/ritEZxMaLLi\nIcih5zgitzVqTkDMAU6yiVazHwhhWcWx4Owo16Q/jiwgXflFEiKT37w2ysh2SWUq\nqlSWZV2ltI3UAUQlIEzkjTQS8Duj5ObpeCOr4L4IIKwWfZOpaldwqE3CmGpq3McW\n5V8CAwEAAaOB+jCB9zAdBgNVHQ4EFgQUBc1Osxlm7cX8oI/WHdsj2peh9vswgccG\nA1UdIwSBvzCBvIAUBc1Osxlm7cX8oI/WHdsj2peh9vuhgZikgZUwgZIxCzAJBgNV\nBAYTAlVTMQ8wDQYDVQQIEwZIYXdhaWkxETAPBgNVBAcTCEhvbm9sdWx1MREwDwYD\nVQQKEwhHb2JvdC5pbzEUMBIGA1UECxMLT3BlbiBTb3VyY2UxEjAQBgNVBAMTCWxv\nY2FsaG9zdDEiMCAGCSqGSIb3DQEJARYTbm93aGVyZUBub3doZXJlLmNvbYIJAIBm\nBEvgiah+MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBACEaRC/DZfmB\n5X06tKVhudPu4PnYKRIW5t+u2nzEKumqVaQ32oUBdkwLzJ0D4XNp/HJSfhuwJQl6\nEYzcYH76At8BZ89lWTH37EDWvdZom3NzKz2TzHpU9oaLEi0gnFdTv1z3wUW/G6w5\npzxqiL3qIivYGGo/JRIEwD93F0uLVjUT+Cqh0zft4yJVbupxfJh8m8sVcy7HzVkb\nJwqAnAL0lLsOH/BjkVzkdKosTUFxLgb/xYBy1OtsskkE1Mql6INJKHYRNPxuauP4\nIJT1hPb7sXl0prV+ufIYXdYZUpILw945Z/FBvazNCjZ9lR6l94mh5NQtGL4/wLZR\nzGpv1+hqvXaHCL7ayY3r43nmfRyqqhsuOEl5iyxE03j2EWmjxK5Z9Vo+5lliUEIl\nKzADXdZ19mwYDfo12KTZp/DHioRUHjdUG0944jfC8EoX87yF95JTCvRYT8397qn4\nOxeTrSG4rrOtYhQs7/xeDjwrl5JNcXEPIwkWyye6NB5XJvAeEiOAL1+IU1iV6Oyy\ne4ZHMcpSo22m4EFha8zlYD7CaJHo6JBcSqaLMWFaRY1rWakl12/0fJ68R7OioJ/0\n3Y3j24hdtuAAccLMzH3YI7uM/mzJhmBAgUXc5Kt6I81vgds7yBio7zaOeC+2+cOq\n5uUwm9dfOMZxnJI+HnXDFVyGgGlANQbb\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "platforms/nats/test_certs/client-cert.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFPjCCAyagAwIBAgIJAMSwPHLUBjPUMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYD\nVQQGEwJVUzEPMA0GA1UECBMGSGF3YWlpMREwDwYDVQQHEwhIb25vbHVsdTERMA8G\nA1UEChMIR29ib3QuaW8xFDASBgNVBAsTC09wZW4gU291cmNlMRIwEAYDVQQDEwls\nb2NhbGhvc3QxIjAgBgkqhkiG9w0BCQEWE25vd2hlcmVAbm93aGVyZS5jb20wHhcN\nMTcwMjEzMDEzNTI5WhcNMjIwMjEyMDEzNTI5WjARMQ8wDQYDVQQDEwZjbGllbnQw\nggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/9f5QeY89ILj2LX4j2t3R\nV8LO7YUMcarLENtpu37lpni43Bfn38PZUX5Mgmt7EufcZ6nTxmdhCUBQWz9bCCwl\nf7Ukxs8vkpDdxXCSCSzafZsxVtaV21yPT9ACr2uYahTR5q4ChblfMd7u0hpbmcTZ\nLfXzErds92Dept9k1W8tgSzzvv9qK5Wld5ZeYsiSanUC23Jl2CIy9T0H3AnRko+p\nLli/szQX9A11Dbjd/SKQam+ca618sZ9kRQQRNQHVLtKhnlZDITZHjExQqlDTcWGQ\nvRODJIuxJt2L4Qx0tl2poQ2GT2Zxtt7/uY5Lmbga2OOoxBfbp8ar4n/APt19/r+5\nQape/vgGypTh9CjzMBE8cIDXVik4eVR2mRsCuYyZY8fNO07g2zPZ+Zc9VpYZ5c3L\nbh6cCV3e5lMcLfZtBgj4Y60GZJIkUcgfZpIG/plZ96TG4CZdV1NzI1dHRP91UFvG\nbExjn1O3hTXSe174+APGGodHIApbY45m5Jdz+XYNUovaghqour2vvIn9kgglr+OU\n8o84xYc6bINanEowRl5uYIL/cidYT83DucM0N8uyV4FNm+/tS7ZW4vCm8WEd5mck\n2p7ZC/wrHwZB96tRT5dbNArbtlXN17RfyeGzprTz7VB1yxzzVN9OU0rxGgAc36bC\nDxf9jS+nzpqT3X2P9EJYLQIDAQABoxcwFTATBgNVHSUEDDAKBggrBgEFBQcDAjAN\nBgkqhkiG9w0BAQsFAAOCAgEAlBXFfjb2Od8ijz7K8qkSImDarzEnTav+inm1wukE\nfe30Ld89iMQnAajLzchYElzDZOuTXQrPmsmCg5DbsSOi4yVaZ3aBa37lZ5Q8W9ck\nvA9gH9jsSMnhrhceAnbjOtueHlcRW8QXQ2KPcTQGi80dApN5hMjAUiSaaE6c13bN\nlvIpBS87bhk5UKIH+avuug0l+JK25Onwqkz0hgWDGQceLx0+RE6OLQtN8gtjomWb\nbql/M6DnqQGZwPLcPj9RqVUexl+Nq8Q3vnEcy9w5AG0YK47QgwxtzsLk/eeql9jU\n5a7J5Z23+0u2uqbnrHvTBfl/MG1x+C0AnNgPgdCQbzv0U+qrE8l7IZW7mDF0nNwe\nBThvkR8PCtdXl0SkWcfEbyeNjIQ0pKxNvt4MOMoI3AJWK1g465oDnf8OMOU55Swy\niPhj9gg7JCrb8haYLkH4JAg6Ufdv9JGgdWhoNz52YV1cKv2gDf4NpIYvM8Wm9psY\nRSSAor11sxvqazRVqjOKYsTV/WlvVpM5G/UlySoCJiyw6H3S79hJiJSHdN6KEp5Z\nI+WEUYZEWJ+TL9RU8jaS6XJW+Fy159fWTzTG6XDLU/HRTypUFWnvvcuhy1zlIDSR\nehuCRVj0mVI91A3lEatKgjng7uK2jfcQRV5cMYspVn2Rdvf3NkZ0Hoxt+JDDYlJf\nNDc=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "platforms/nats/test_certs/client-key.pem",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIJKAIBAAKCAgEAv/X+UHmPPSC49i1+I9rd0VfCzu2FDHGqyxDbabt+5aZ4uNwX\n59/D2VF+TIJrexLn3Gep08ZnYQlAUFs/WwgsJX+1JMbPL5KQ3cVwkgks2n2bMVbW\nldtcj0/QAq9rmGoU0eauAoW5XzHe7tIaW5nE2S318xK3bPdg3qbfZNVvLYEs877/\naiuVpXeWXmLIkmp1AttyZdgiMvU9B9wJ0ZKPqS5Yv7M0F/QNdQ243f0ikGpvnGut\nfLGfZEUEETUB1S7SoZ5WQyE2R4xMUKpQ03FhkL0TgySLsSbdi+EMdLZdqaENhk9m\ncbbe/7mOS5m4GtjjqMQX26fGq+J/wD7dff6/uUGqXv74BsqU4fQo8zARPHCA11Yp\nOHlUdpkbArmMmWPHzTtO4Nsz2fmXPVaWGeXNy24enAld3uZTHC32bQYI+GOtBmSS\nJFHIH2aSBv6ZWfekxuAmXVdTcyNXR0T/dVBbxmxMY59Tt4U10nte+PgDxhqHRyAK\nW2OOZuSXc/l2DVKL2oIaqLq9r7yJ/ZIIJa/jlPKPOMWHOmyDWpxKMEZebmCC/3In\nWE/Nw7nDNDfLsleBTZvv7Uu2VuLwpvFhHeZnJNqe2Qv8Kx8GQferUU+XWzQK27ZV\nzde0X8nhs6a08+1Qdcsc81TfTlNK8RoAHN+mwg8X/Y0vp86ak919j/RCWC0CAwEA\nAQKCAgAw+IGDaC95ibKF4v8uCHTUJg5lmcR6czj+CvPeml16GqjriAJ1PemJtDeD\nLzZaNG2AFdYGV7Qh1ilZFp4oDAKvIlBE7I8IdNyOJwNbzglqR+bihGPD4S1Qxiyr\nsrLBNDbRgYbcz96FgYR86o6c1bKZMRdwhlLS8pz80Bdncuek9TJRkGU6YZoQl1x+\nAbdnWs81BmS9xJCc7WE/cwvyMfCCWXd8mCvu/Gy+cty5jQ1XSD/m6LVefTXLb6vk\n89/e0c4cOveIsp1VTV5eqcRq3J7mPMYQi68zZ1XXjHcQA0ILtzFrFTBuTBfBp0W8\n1Z9ZAgG6GSR4/ek6ClNK6P66WNXx7MXmv4HwdceEQxNSDrZWnpzkgLJyh65SNQSR\nU6Tza5YYhyOng3y1r4nriCn4Ar1a5DTMTo72Aq+OAr9qRINIYW9yCXjiO1kvvNO7\ndS6VsyMW5mvxgefnEHLGEWFSLCUjAOabiIF4xSnPr/t3xXrBGuVvhkIO9Pqp87fA\nGUjTXEIbRuGRPJqLMpmpCK50BgYPupZmKCrnpHdsyE0yLNzK06Ol7qb3AHn7io40\n5ANm00BexDGHE8jtJCTyKeHg9m3o86a544zbmkj92dMtO3MqgRPhVrT0remsLtXe\nxE3nVv8ikFScwQRWvPYEPNDWIdeVN/s0nzCiOESQ6xGBSwVeYQKCAQEA4Z3mOLIA\nTDonpeRohTtqxq39LY5hgNfbcR4i5PYeEKya6u6zhOgp89ealGn2lZNYLMyrKjxZ\nxrScMD+1nbUBHKvnAMi2tKbkOp13D17qXFdCnOvMHP1lxH6h3UVYN8O61C7I5Wdt\nGix66Ol/8dWdc57CnfqCtrkwCTiBtJQ3e2MncaAZdUjF/6YM+dfpgaPDX0mmElvg\n4Lc4pKHa8aezqw8YXqKVPHWc10kfCAxvyabasnVyQz+UjUUNE/NOtHW+8l52/f50\njizreD3CJcre56YxPy3Mvtw32i92tkYGbvmsO0l3STca3S4+2NshO4ZkJDtT3KYb\nR2LiJQP8EDVjKQKCAQEA2c/QMwYJj210H0Q7v8qLWg5WVEpfQpVaE0oeIaIWUai1\nIqq0naFmrK9ncFZ88ENOYB36zbeZR4dWcfh7HDwQzoCSYjITCkwiQk20McXx1rtJ\niJgb4S8Ri5cWfyX2XXZTf5eGzcB6pBRuITWkIMThYV5aCZgWrCo6JKSaZLeA17vS\n0kynGBNVTUiypwyAZz0saTU9OFYOwclD+rhjYuiPH90CnieAnXVGX4Co+UsfHMGo\nmjBWDMwQHj1lfEoatXGVaVnqP/0Fkrkmb7uabFqFBcDiGZiOaausZFd1sqOysn/c\nU71L2WrN0PYjSiWQzKlUwJRKG0XVVn+QxmMQSsiRZQKCAQBzW43MLU8zqoR9MOU0\nQiYdQfbypRs7iqL8GoGS+jhzJB3tw3DsotxYfkPeYLOg1P6/oUJfTQ5GKDC4Bssw\nwMy5wTdS0k2A3thRFBQ9OrWv0zoPDA2IQRQYvPq8LWmm0aAkP2ueyBwjxtxtXH57\nw1JHPMSbi+vry5JBFLBVCXe40gDn+wkpS7VZOqjl0jzleTs67GhKeMnpfCUtIEjX\nSHz4GLbIJG8Tw7sW5J9GOT2rKHInzx9GPSsSdFz0d3IlmRKx0BUdV053J4aaK1Gq\niykf3nzNpfhLGkRAfgY/ulwtv+ENS0n/mHpW3v9pV9mNGvD3CZKefhvyix+/92KZ\nUwLJAoIBAAYaGE8VoDbwbgxiMPpShkzjke+SldCbtoZL0URH8jAfddOezKiN2P6F\ne3ReN+nTOOLgdCJHPngOhpFy0KAd3qqqV2+Az5++Okd5Pc8XKItHe+vjtwQ7+VXb\nybmOKrS7l+M/L3ucJNNr7xnnEs4INfgwWH1kUV5JYI+ePOUNbwKcNG/HzfaStBUS\nME8VvpMl15Sq9Sga4Rb0uH7Ro5clxLyzyFr96FCA9JPAWvuA60I2+q43JHH/VYRD\nXBB7Uvw6TmFBL5rTT9CodzcyHkVi088xdCQbbgHv2UiGWrnCdEMj6dw+tV1F7LYp\n7xsoqkHRjJpIjTruXeeqczfblp1BuTECggEBAMOB0Kb7IBOXLYJcUof3WzwjbhP3\nIu5aZMkWZUKg1FZG5fJGDZiK9Ha5E0+aSsC8LS17mPVmC2dS4NMVFmkuhkAwXPgi\ntzbDdaHFiv9ypyoEXgmavWDYg7gppEZcg2PkpcpIOK8rxEhQU1XvQr0RQvyWu1Ju\n7/dg/Zazb27jYAtO5uAKV8StB0KoqPlkv6v6KOBNM29rSUtcapgtIRBgQLC1tObR\nmKRHaaXKF+WzYtmQ5UF0mRccjuH2TIrpGp5Rw8Hyi6Nec7sxSYVQIY2g248SZz17\nVJMHxZ7cCMjrpAtvjlay829aYfvVh5ea/NiM1y8tKjxdBvqU9/uxAt123Gc=\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "platforms/nats/test_certs/server-cert.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFSDCCAzCgAwIBAgIJAMSwPHLUBjPTMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYD\nVQQGEwJVUzEPMA0GA1UECBMGSGF3YWlpMREwDwYDVQQHEwhIb25vbHVsdTERMA8G\nA1UEChMIR29ib3QuaW8xFDASBgNVBAsTC09wZW4gU291cmNlMRIwEAYDVQQDEwls\nb2NhbGhvc3QxIjAgBgkqhkiG9w0BCQEWE25vd2hlcmVAbm93aGVyZS5jb20wHhcN\nMTcwMjEzMDEzMjEzWhcNMjIwMjEyMDEzMjEzWjAUMRIwEAYDVQQDEwlsb2NhbGhv\nc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiiEt8zo67qXXRbpb3\n1U9CJ4Fb8gMidHxa3SN/0p4+5hyCmRxezaYn45TGsjRJ1su/6IUk2X7pagoVDLOl\n0jmjhvn1ALHSPSVsW1l56hK+J7O4/9NPU/1m/q1ofoF1/DyO16L/xIC0WghLKvkC\nf38eUXiB93yOLZun50g69sLS66UmLLa8xDxtb4lA1cHMkuUxXWyDjv8SKP8eGUDc\nrvurzNJsGphw3ixVz6tvtbc+/PiHQKtQZTvyTKQemn89fpl4v+FBrrKBAXAHMzLc\nOZexmprQLzyNAeX+mWhVDrfBHUt/yn9Swbg++mQEB5956HfMaAbEbrUdDnYa/UGE\nSiU09P+9vCTg8SndMDfzb/Jmdc26HuVsl5vPrhMeNnS61jZDwlA90RYTUuk447sx\nZP8MzKtgauPOIgKm2quEBTvMrG3aLUHnOxJe/ylUBV9zz4WvmZk4Wk9F4/BsWMOM\nHs0xfctBfbrCvcKIg/j0Q/epskkZO+u0BcjH0YdCi3nHBp9Z5E0s/0XK8buP5tfo\n3Gm1WBfXOuH3EIufqI4Gq5BRWLQWJ9mlio+ZrqHT6W3h4LJYp9KSoSGRYkrQiMeG\nHlu/JYoaFeY/WFTXuMwx+b25yrhu/nKbzaEIgQBu5B1XMhuZpwt75hOe0zff2OAv\ndOY44exFlmCfnlI7bkAm0lozIQIDAQABox4wHDAaBgNVHREEEzARgglsb2NhbGhv\nc3SHBH8AAAEwDQYJKoZIhvcNAQELBQADggIBAFo4AM9rJsbBQOIo9WUrAIc5czZM\nwZVOd/eWHZVqg4k3A+4p/EtVlIG23JyTbIa5OnMyHoqEIV/yDTdy8KFlZSFRdMAh\nOCTCh7SpCS/CFBG+dZdYltEvLnxFASh5Bb83MNbbQXMPpBKyTtFNaWef5A0wzSZn\nR2OdPqckcm+3nhzEJTTGEotsguVxK5NAmZuXrFbncCGnXlnqGGu8RvEADfunv01+\nrFe1S62mdKW7CJxQzZmhL8na19AbGYXmnYz7bt5hbNZknzeIgemxwIbJUrzogLjM\nEccAlaA/8yOfrff/IMhiMUnnvA9SHRgmOZcZ0Ecq0i2MkbQviX7x0cGIwBhIZCMT\nK2VDi4y3AuEEUhcvwUlY1O8GKZ5Oqs/KG4tunpZZ0sZpfX4tTv5pc/zaoV7a8vEv\nGFjeqUH6xiqgv+vm6ZzJZLVfvkH8NBdV0O/3VvDLKkapfRMic19W64whgWw5vIx1\njzQ4q/DPe+Cxa2Bz/Vx5DG8B0jedPURvOK8TKrbgEwIdIBxtE2IsJz8DPCytRbXS\nxaaNFSLBz8HV3cnvGPhl9JrnF7rKWFQlhLIFAJuqrTokgyqS0u51I5NYXGLVueSJ\n9wnkn3raomFcmwLDervMCx8i187m9xK/PBd6XLJF1oslYweHuW2CX5Tle0w67zAK\nrSx8jFD3GheS9WcT\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "platforms/nats/test_certs/server-key.pem",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIJKAIBAAKCAgEAoohLfM6Ou6l10W6W99VPQieBW/IDInR8Wt0jf9KePuYcgpkc\nXs2mJ+OUxrI0SdbLv+iFJNl+6WoKFQyzpdI5o4b59QCx0j0lbFtZeeoSviezuP/T\nT1P9Zv6taH6Bdfw8jtei/8SAtFoISyr5An9/HlF4gfd8ji2bp+dIOvbC0uulJiy2\nvMQ8bW+JQNXBzJLlMV1sg47/Eij/HhlA3K77q8zSbBqYcN4sVc+rb7W3Pvz4h0Cr\nUGU78kykHpp/PX6ZeL/hQa6ygQFwBzMy3DmXsZqa0C88jQHl/ploVQ63wR1Lf8p/\nUsG4PvpkBAefeeh3zGgGxG61HQ52Gv1BhEolNPT/vbwk4PEp3TA382/yZnXNuh7l\nbJebz64THjZ0utY2Q8JQPdEWE1LpOOO7MWT/DMyrYGrjziICptqrhAU7zKxt2i1B\n5zsSXv8pVAVfc8+Fr5mZOFpPRePwbFjDjB7NMX3LQX26wr3CiIP49EP3qbJJGTvr\ntAXIx9GHQot5xwafWeRNLP9FyvG7j+bX6NxptVgX1zrh9xCLn6iOBquQUVi0FifZ\npYqPma6h0+lt4eCyWKfSkqEhkWJK0IjHhh5bvyWKGhXmP1hU17jMMfm9ucq4bv5y\nm82hCIEAbuQdVzIbmacLe+YTntM339jgL3TmOOHsRZZgn55SO25AJtJaMyECAwEA\nAQKCAgADtcjDWJO5hOzDkxqvHZdpky1IxAV+S9pq2JFu4YfrN6V+9a/IGjmov3Et\n9/NpnBWak9w2MyDKgzknsdqH9nyKVxJtnU5x1iN8jblFJyq2XIGlv3E7ZldqenXK\n5NhfsRpQyGtYG0w00blOvfRhMjfcoU926AdX14KuGoFzlx5rYiWq8WpadMBMXzdq\n23ZJDTFeJxvLBQCdkYIBVeI9J2FnUo2bGiBQs0Gf09W9/w/nyC6EJ93BQA5WQZmd\neTleVf163CZwMWSxvS6pe2m1zTrBOx49klZ3gYuWfDn9dxCKv/hxOlYdtX5XMbAG\nx4XEaqIRcG53HW/U8feQNifAtVCUE5LL8A/Xc1WbTPQCdGGUUlX/P7feriY709GV\niLBWmz7iOx08QxMRcmfPEb+OZnssEo9rRw1YXn5Mv7F93XbFrilRFRBv5t4KyLCz\nGi4jbfvjGzz8ElguNGYWMxZjiyNYNKjOFCGt616M5CV6aShSzdLR/tD4+mgNfJnm\nRSFm0pwi8PQNg2OQbp9lhZ5FzHPQBQwUi0r6RodSHhQT5L4zPwvGZpPsLOIERGMe\nrPRtI2VU0sliSqBuzE7d9qDJJoAiQkUxsQVtQVJuNVrNrxtCkOKdDQcrJlL4G5tz\nf/JcUjiwSMkrAXGtLX8yDXh5GFJFVa8MuLiKSKHLz0OucWxYgQKCAQEA0V6q8rvj\nk78rrNR4/mcjXQLJopAhu8wYs6bm3M8eKM4nnirKfh81UK80FQmqTd8urCoFkyMA\nlAu8NBjGY28Wo6xKP4nFGU/ezgD55WeqK6IOwb4a6t3Kk5rrbbOBkpFRgSoViF+z\nDjt4sARYsXVUfM35t+trsNsLEw1U2Um2GDxhjo+41Z6Sc0oNht27c3d5WLQPnN4q\nAZ3Tmu0IQaQGHjaaalml3RCY311SVJTSDM91wpf8WREcnUDyDuRDesEeQZk+VWpd\nhfMtelYNj57VwSyMOrL8zxtz5esbHNrcjQBL+96Yx1iwazg9a3bez9apjxj1zXWk\nqaA5iW4sWZ9jdQKCAQEAxrsq8HbDUvfurfH0N1s6NoN7JN53AU1SsPDGtF0tLSbU\nnLVM8IMZTqzC1GeTvz2MYEADfUsrW4o2SciMhv7TTr70JDf3z/j6P57N/uZmXjAa\n1Ro00qbHMXtj9/eiPmRfTToHhSPzcSiOrpZlC+F724jYDGRA6Jo/XsCf1HfyIIha\nB+FPS7GEyGXZIblAHAHlmsCZLdcKZ6PC6lgZpytE2tQqkUuBl+bZYdqR/xkLwExC\ntECQHodQXWUzyCJFf8ppuDobB9JsTaTTWasDO2nmEN+/O38/mCt+8hbZW3ngiN6j\nqY7OI2eousIbd+5aF3q94HMSOEYwJUfV56Uxufa3fQKCAQBdhjdApLN8/SlqU6MU\nqUe/tY4SguW+uOXT4ltACXkEa0qBOcYoXpJ3TzwppZ6gmHCF0WOaHUmV2EQi1WpR\nYn8vb7fe+BDGRMpXJVJ7qjn2sbZ7zwrBHX/vPYWrBEN+EFHjK8RgnbcjRWec4OQp\nqSqrcWr6QDxjzQT+ZrcfNPEVlGtTvlmneuUagNrYAtZINvdKq2xJ+2eyPykWDIni\noH1nI6cImLEhtddD97DePXgy5r1IxpGfy6gHispV4ptOC1QTo3uXtiK+wijve98k\n56O+XcLqOaf6b93ut33t/soEZjyK7x059yEfVAkDpx7SoqYtWM38EHAUoZDyFffT\ntQI9AoIBADJJ2qvO4c50/uj1eR8o7qosy1ShFuw1bN9pjl7F1VC/qr2dA0M5aYYH\nIaYuL60NHiCdEkT6aJZZezNglG70vPQITi98GjF+h5Th0q7WDsF22tNiNku3+GAF\nIV72QxAWxib8sDp4xnm0EacMV7WR8Y20Kze3htVVcwO/KrLRR2wEFQQ5d59n5Hnx\ni+iEwDxWHovygNCgwflH72LtuFAdGudlGQB7YufVetzQOnGbHOYkZhzG2bFf/G4l\n1dynD38u8WG1EnIARXfAZdsi80ZtndJXTET6BlWzbARG0+naBX+dFz0o7fD3ojLg\nO6M1pYabgMDzXYDwAe7tJqvfmZ29WOECggEBAL3yoPQ5ghhhFA4tuEX6VvsOhVdH\ni5OptgHnV8ZrjSABT2F05Bv1sIgRsNzMre7sa3MwyNfXWwZb1HWG+/wn9K0Tucbs\nc5SFqIcyK0pGTbwGOX+kMvkqTfkQTHMM1FOo2eV8tqWUyxVw+iaLFxh8gyGR0whH\nzRLKk38yfr9txKoTJqsYvLowPUnugfvQ5piaf/e5ZMsA1yTlqjD9ejkDHOzHAg28\nvSZ5lFOf2Kfp6osydKUWbK58e3cqwyZjI6c0yhuItwsV9xSNsvoBmk0D8aG0Yl6G\nN+ifWFh/fDvM3UXHbovLwU4Umv+xCJS03w33XN54xTBpVodLycWuF0J83o0=\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "platforms/neurosky/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/neurosky/README.md",
    "content": "# Neurosky\n\nNeuroSky delivers fully integrated, single chip EEG biosensors. NeuroSky enables its partners and developers to bring their\nbrainwave application ideas to market with the shortest amount of time, and lowest end consumer price.\n\nThis package contains the Gobot adaptor and driver for the [Neurosky MindWave Mobile EEG](http://store.neurosky.com/products/mindwave-mobile).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How To Connect\n\n### OSX\n\nIn order to allow Gobot running on your Mac to access the MindWave, go to \"Bluetooth > Open Bluetooth Preferences > Sharing Setup\"\nand make sure that \"Bluetooth Sharing\" is checked.\n\nNow you must pair with the MindWave. Open System Preferences > Bluetooth. Now with the Bluetooth devices windows open, hold\nthe On/Pair button on the MindWave towards the On/Pair text until you see \"MindWave\" pop up as available devices. Pair with\nthat device. Once paired your MindWave will be accessable through the serial device similarly named as `/dev/tty.MindWaveMobile-DevA`\n\n### Ubuntu\n\nConnecting to the MindWave from Ubuntu or any other Linux-based OS can be done entirely from the command line using [Gort](https://gobot.io/x/gort)\nCLI commands. Here are the steps.\n\nFind the address of the MindWave, by using:\n\n```sh\ngort scan bluetooth\n```\n\nPair to MindWave using this command (substituting the actual address of your MindWave):\n\n```sh\ngort bluetooth pair <address>\n```\n\nConnect to the MindWave using this command (substituting the actual address of your MindWave):\n\n```sh\ngort bluetooth connect <address>\n```\n\n### Windows\n\nYou should be able to pair your MindWave using your normal system tray applet for Bluetooth, and then connect to the\nCOM port that is bound to the device, such as `COM3`.\n\n## How to Use\n\nPlease refer to the provided example `examples/serialport_neurosky.go`.\n"
  },
  {
    "path": "platforms/opencv/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/opencv/README.md",
    "content": "# OpenCV\n\nOpenCV (Open Source Computer Vision Library) is an open source computer vision and machine learning software library.\nOpenCV was built to provide a common infrastructure for computer vision applications and to accelerate the use of machine\nperception in the commercial products. Being a BSD-licensed product, OpenCV makes it easy for businesses to utilize and\nmodify the code.\n\nFor more info about OpenCV click [here](http://opencv.org/)\n\n## How to Install\n\nThis package requires OpenCV 3.4+ be installed on your system, along with GoCV, which is the Go programming language\nwrapper used by Gobot. The best way is to follow the installation instructions on the GoCV website at [https://gocv.io](https://gocv.io).\n\nThe instructions should automatically install OpenCV 4+\n\n### macOS\n\nTo install on macOS follow the instructions here:\n\n<https://gocv.io/getting-started/macos/>\n\n### Ubuntu\n\nTo install on Ubuntu follow the instructions here:\n\n<https://gocv.io/getting-started/linux/>\n\n### Windows\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTo install on Windows follow the instructions here:\n\n<https://gocv.io/getting-started/windows/>\n\n## How to Use\n\nHere is an example using the camera:\n\n```go\npackage main\n\nimport (\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/opencv\"\n  \"gocv.io/x/gocv\"\n)\n\nfunc main() {\n  window := opencv.NewWindowDriver()\n  camera := opencv.NewCameraDriver(0)\n\n  work := func() {\n    camera.On(opencv.Frame, func(data interface{}) {\n      img := data.(gocv.Mat)\n      window.ShowImage(img)\n      window.WaitKey(1)\n    })\n  }\n\n  robot := gobot.NewRobot(\"cameraBot\",\n    []gobot.Device{window, camera},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nBuild your application with build tag \"gocv\".\n"
  },
  {
    "path": "platforms/opencv/camera_driver.go",
    "content": "//go:build gocv\n// +build gocv\n\npackage opencv\n\nimport (\n\t\"errors\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gocv.io/x/gocv\"\n)\n\ntype capture interface {\n\tRead(img *gocv.Mat) bool\n}\n\nconst (\n\t// Frame event\n\tFrame = \"frame\"\n)\n\n// CameraDriver is the Gobot Driver for the OpenCV camera\ntype CameraDriver struct {\n\tgobot.Eventer\n\tname   string\n\tcamera capture\n\tSource interface{}\n\tstart  func(*CameraDriver) error\n}\n\n// NewCameraDriver creates a new driver with specified source.\n// It also creates a start function to either set camera as a File or Camera capture.\nfunc NewCameraDriver(source interface{}) *CameraDriver {\n\tc := &CameraDriver{\n\t\tname:    \"Camera\",\n\t\tEventer: gobot.NewEventer(),\n\t\tSource:  source,\n\t\tstart: func(c *CameraDriver) error {\n\t\t\tswitch v := c.Source.(type) {\n\t\t\tcase string:\n\t\t\t\tc.camera, _ = gocv.VideoCaptureFile(v)\n\t\t\tcase int:\n\t\t\t\tc.camera, _ = gocv.VideoCaptureDevice(v)\n\t\t\tdefault:\n\t\t\t\treturn errors.New(\"unknown camera source\")\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\n\tc.AddEvent(Frame)\n\n\treturn c\n}\n\n// Name returns the Driver name\nfunc (c *CameraDriver) Name() string { return c.name }\n\n// SetName sets the Driver name\nfunc (c *CameraDriver) SetName(n string) { c.name = n }\n\n// Connection returns the Driver's connection\nfunc (c *CameraDriver) Connection() gobot.Connection { return nil }\n\n// Start initializes camera by grabbing frames\nfunc (c *CameraDriver) Start() error {\n\tif err := c.start(c); err != nil {\n\t\treturn err\n\t}\n\timg := gocv.NewMat()\n\tgo func() {\n\t\tfor {\n\t\t\tif ok := c.camera.Read(&img); ok {\n\t\t\t\tc.Publish(Frame, img)\n\t\t\t}\n\t\t}\n\t}()\n\treturn nil\n}\n\n// Halt stops camera driver\nfunc (c *CameraDriver) Halt() error { return nil }\n"
  },
  {
    "path": "platforms/opencv/camera_driver_test.go",
    "content": "//go:build gocv\n// +build gocv\n\npackage opencv\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*CameraDriver)(nil)\n\nfunc initTestCameraDriver() *CameraDriver {\n\td := NewCameraDriver(\"\")\n\td.start = func(c *CameraDriver) error {\n\t\td.camera = &testCapture{}\n\t\treturn nil\n\t}\n\treturn d\n}\n\nfunc TestCameraDriver(t *testing.T) {\n\td := initTestCameraDriver()\n\tassert.Equal(t, \"Camera\", d.Name())\n\tassert.Equal(t, (gobot.Connection)(nil), d.Connection())\n}\n\nfunc TestCameraDriverName(t *testing.T) {\n\td := initTestCameraDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Camera\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestCameraDriverStart(t *testing.T) {\n\tsem := make(chan bool)\n\td := initTestCameraDriver()\n\trequire.NoError(t, d.Start())\n\td.On(d.Event(\"frame\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Event \\\"frame\\\" was not published\")\n\t}\n\n\td = NewCameraDriver(\"\")\n\trequire.NoError(t, d.Start())\n\n\td = NewCameraDriver(true)\n\tassert.NotNil(t, d.Start())\n}\n\nfunc TestCameraDriverHalt(t *testing.T) {\n\td := initTestCameraDriver()\n\trequire.NoError(t, d.Halt())\n}\n"
  },
  {
    "path": "platforms/opencv/doc.go",
    "content": "/*\nPackage opencv contains the Gobot drivers for opencv.\n\nInstalling:\n\n# This package requires `opencv` to be installed on your system\n\nThen you can install the package with:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\tcv \"gobot.io/x/go-opencv/opencv\"\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/platforms/opencv\"\n\t)\n\n\tfunc main() {\n\t\twindow := opencv.NewWindowDriver()\n\t\tcamera := opencv.NewCameraDriver(0)\n\n\t\twork := func() {\n\t\t\tcamera.On(camera.Event(\"frame\"), func(data interface{}) {\n\t\t\t\twindow.ShowImage(data.(*cv.IplImage))\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"cameraBot\",\n\t\t\t[]gobot.Device{window, camera},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor further information refer to opencv README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/opencv/README.md\n*/\npackage opencv // import \"gobot.io/x/gobot/v2/platforms/opencv\"\n"
  },
  {
    "path": "platforms/opencv/haarcascade_frontalface_alt.xml",
    "content": "<?xml version=\"1.0\"?>\n<!--\n    Stump-based 20x20 gentle adaboost frontal face detector.\n    Created by Rainer Lienhart.\n\n////////////////////////////////////////////////////////////////////////////////////////\n\n  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.\n\n  By downloading, copying, installing or using the software you agree to this license.\n  If you do not agree to this license, do not download, install,\n  copy or use the software.\n\n\n                        Intel License Agreement\n                For Open Source Computer Vision Library\n\n Copyright (C) 2000, Intel Corporation, all rights reserved.\n Third party copyrights are property of their respective owners.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n   * Redistribution's of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n\n   * Redistribution's in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation\n     and/or other materials provided with the distribution.\n\n   * The name of Intel Corporation may not be used to endorse or promote products\n     derived from this software without specific prior written permission.\n\n This software is provided by the copyright holders and contributors \"as is\" and\n any express or implied warranties, including, but not limited to, the implied\n warranties of merchantability and fitness for a particular purpose are disclaimed.\n In no event shall the Intel Corporation or contributors be liable for any direct,\n indirect, incidental, special, exemplary, or consequential damages\n (including, but not limited to, procurement of substitute goods or services;\n loss of use, data, or profits; or business interruption) however caused\n and on any theory of liability, whether in contract, strict liability,\n or tort (including negligence or otherwise) arising in any way out of\n the use of this software, even if advised of the possibility of such damage.\n-->\n<opencv_storage>\n<haarcascade_frontalface_alt type_id=\"opencv-haar-classifier\">\n  <size>20 20</size>\n  <stages>\n    <_>\n      <!-- stage 0 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 14 4 -1.</_>\n                <_>3 9 14 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0141958743333817e-003</threshold>\n            <left_val>0.0337941907346249</left_val>\n            <right_val>0.8378106951713562</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 4 -1.</_>\n                <_>7 2 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0151513395830989</threshold>\n            <left_val>0.1514132022857666</left_val>\n            <right_val>0.7488812208175659</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 15 9 -1.</_>\n                <_>1 10 15 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2109931819140911e-003</threshold>\n            <left_val>0.0900492817163467</left_val>\n            <right_val>0.6374819874763489</right_val></_></_></trees>\n      <stage_threshold>0.8226894140243530</stage_threshold>\n      <parent>-1</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 1 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 6 -1.</_>\n                <_>5 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6227109590545297e-003</threshold>\n            <left_val>0.0693085864186287</left_val>\n            <right_val>0.7110946178436279</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 3 -1.</_>\n                <_>9 5 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2906649392098188e-003</threshold>\n            <left_val>0.1795803010463715</left_val>\n            <right_val>0.6668692231178284</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 12 9 -1.</_>\n                <_>4 3 12 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0025708042085171e-003</threshold>\n            <left_val>0.1693672984838486</left_val>\n            <right_val>0.6554006934165955</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 10 8 -1.</_>\n                <_>6 13 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9659894108772278e-003</threshold>\n            <left_val>0.5866332054138184</left_val>\n            <right_val>0.0914145186543465</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 14 8 -1.</_>\n                <_>3 10 14 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5227010957896709e-003</threshold>\n            <left_val>0.1413166970014572</left_val>\n            <right_val>0.6031895875930786</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 6 10 -1.</_>\n                <_>14 1 3 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0366676896810532</threshold>\n            <left_val>0.3675672113895416</left_val>\n            <right_val>0.7920318245887756</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 5 12 -1.</_>\n                <_>7 12 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3361474573612213e-003</threshold>\n            <left_val>0.6161385774612427</left_val>\n            <right_val>0.2088509947061539</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 3 -1.</_>\n                <_>7 1 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6961314082145691e-003</threshold>\n            <left_val>0.2836230993270874</left_val>\n            <right_val>0.6360273957252502</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 17 2 -1.</_>\n                <_>1 9 17 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1488880263641477e-003</threshold>\n            <left_val>0.2223580926656723</left_val>\n            <right_val>0.5800700783729553</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 6 4 2 -1.</_>\n                <_>16 7 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1484689787030220e-003</threshold>\n            <left_val>0.2406464070081711</left_val>\n            <right_val>0.5787054896354675</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 17 2 2 -1.</_>\n                <_>5 18 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1219060290604830e-003</threshold>\n            <left_val>0.5559654831886292</left_val>\n            <right_val>0.1362237036228180</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 12 -1.</_>\n                <_>14 2 3 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0939491465687752</threshold>\n            <left_val>0.8502737283706665</left_val>\n            <right_val>0.4717740118503571</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 4 12 -1.</_>\n                <_>4 0 2 6 2.</_>\n                <_>6 6 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3777789426967502e-003</threshold>\n            <left_val>0.5993673801422119</left_val>\n            <right_val>0.2834529876708984</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 18 8 -1.</_>\n                <_>8 11 6 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0730631574988365</threshold>\n            <left_val>0.4341886043548584</left_val>\n            <right_val>0.7060034275054932</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 2 -1.</_>\n                <_>5 8 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6767389974556863e-004</threshold>\n            <left_val>0.3027887940406799</left_val>\n            <right_val>0.6051574945449829</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 5 3 -1.</_>\n                <_>15 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0479710809886456e-003</threshold>\n            <left_val>0.1798433959484100</left_val>\n            <right_val>0.5675256848335266</right_val></_></_></trees>\n      <stage_threshold>6.9566087722778320</stage_threshold>\n      <parent>0</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 2 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 10 9 -1.</_>\n                <_>5 6 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0165106896311045</threshold>\n            <left_val>0.6644225120544434</left_val>\n            <right_val>0.1424857974052429</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 14 -1.</_>\n                <_>9 11 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7052499353885651e-003</threshold>\n            <left_val>0.6325352191925049</left_val>\n            <right_val>0.1288477033376694</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 5 4 12 -1.</_>\n                <_>3 9 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8069869149476290e-003</threshold>\n            <left_val>0.1240288019180298</left_val>\n            <right_val>0.6193193197250366</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 5 -1.</_>\n                <_>8 5 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5402400167658925e-003</threshold>\n            <left_val>0.1432143002748489</left_val>\n            <right_val>0.5670015811920166</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 8 -1.</_>\n                <_>5 10 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.6386279175058007e-004</threshold>\n            <left_val>0.1657433062791824</left_val>\n            <right_val>0.5905207991600037</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 6 9 -1.</_>\n                <_>8 3 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9253729842603207e-003</threshold>\n            <left_val>0.2695507109165192</left_val>\n            <right_val>0.5738824009895325</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 8 -1.</_>\n                <_>9 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0214841030538082e-003</threshold>\n            <left_val>0.1893538981676102</left_val>\n            <right_val>0.5782774090766907</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 20 6 -1.</_>\n                <_>0 9 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6365420781075954e-003</threshold>\n            <left_val>0.2309329062700272</left_val>\n            <right_val>0.5695425868034363</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 17 -1.</_>\n                <_>9 0 2 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5127769438549876e-003</threshold>\n            <left_val>0.2759602069854736</left_val>\n            <right_val>0.5956642031669617</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 4 -1.</_>\n                <_>11 0 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0101574398577213</threshold>\n            <left_val>0.1732538044452667</left_val>\n            <right_val>0.5522047281265259</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 6 4 -1.</_>\n                <_>7 1 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0119536602869630</threshold>\n            <left_val>0.1339409947395325</left_val>\n            <right_val>0.5559014081954956</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 6 16 -1.</_>\n                <_>14 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8859491944313049e-003</threshold>\n            <left_val>0.3628703951835632</left_val>\n            <right_val>0.6188849210739136</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 18 8 -1.</_>\n                <_>0 5 9 4 2.</_>\n                <_>9 9 9 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0801329165697098</threshold>\n            <left_val>0.0912110507488251</left_val>\n            <right_val>0.5475944876670837</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 10 4 -1.</_>\n                <_>13 15 5 2 2.</_>\n                <_>8 17 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0643280111253262e-003</threshold>\n            <left_val>0.3715142905712128</left_val>\n            <right_val>0.5711399912834168</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 4 8 -1.</_>\n                <_>3 1 2 4 2.</_>\n                <_>5 5 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3419450260698795e-003</threshold>\n            <left_val>0.5953313708305359</left_val>\n            <right_val>0.3318097889423370</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 14 10 -1.</_>\n                <_>10 6 7 5 2.</_>\n                <_>3 11 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0546011403203011</threshold>\n            <left_val>0.1844065934419632</left_val>\n            <right_val>0.5602846145629883</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 6 16 -1.</_>\n                <_>4 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9071690514683723e-003</threshold>\n            <left_val>0.3594244122505188</left_val>\n            <right_val>0.6131715178489685</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 18 20 2 -1.</_>\n                <_>0 19 20 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4718717951327562e-004</threshold>\n            <left_val>0.5994353294372559</left_val>\n            <right_val>0.3459562957286835</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3013808317482471e-003</threshold>\n            <left_val>0.4172652065753937</left_val>\n            <right_val>0.6990845203399658</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5017572119832039e-003</threshold>\n            <left_val>0.4509715139865875</left_val>\n            <right_val>0.7801457047462463</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 9 6 -1.</_>\n                <_>0 14 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0241385009139776</threshold>\n            <left_val>0.5438212752342224</left_val>\n            <right_val>0.1319826990365982</right_val></_></_></trees>\n      <stage_threshold>9.4985427856445313</stage_threshold>\n      <parent>1</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 3 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 3 4 -1.</_>\n                <_>5 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9212230108678341e-003</threshold>\n            <left_val>0.1415266990661621</left_val>\n            <right_val>0.6199870705604553</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 16 -1.</_>\n                <_>9 11 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2748669541906565e-004</threshold>\n            <left_val>0.6191074252128601</left_val>\n            <right_val>0.1884928941726685</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 13 8 -1.</_>\n                <_>3 10 13 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1409931620582938e-004</threshold>\n            <left_val>0.1487396955490112</left_val>\n            <right_val>0.5857927799224854</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 8 2 -1.</_>\n                <_>12 3 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1878609918057919e-003</threshold>\n            <left_val>0.2746909856796265</left_val>\n            <right_val>0.6359239816665649</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 12 -1.</_>\n                <_>8 12 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1015717908740044e-003</threshold>\n            <left_val>0.5870851278305054</left_val>\n            <right_val>0.2175628989934921</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 8 6 -1.</_>\n                <_>15 3 4 3 2.</_>\n                <_>11 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1448440384119749e-003</threshold>\n            <left_val>0.5880944728851318</left_val>\n            <right_val>0.2979590892791748</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 19 -1.</_>\n                <_>9 1 2 19 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8977119363844395e-003</threshold>\n            <left_val>0.2373327016830444</left_val>\n            <right_val>0.5876647233963013</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 4 -1.</_>\n                <_>11 0 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0216106791049242</threshold>\n            <left_val>0.1220654994249344</left_val>\n            <right_val>0.5194202065467835</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 9 3 -1.</_>\n                <_>6 1 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6299318782985210e-003</threshold>\n            <left_val>0.2631230950355530</left_val>\n            <right_val>0.5817409157752991</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 10 4 -1.</_>\n                <_>13 15 5 2 2.</_>\n                <_>8 17 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9393711853772402e-004</threshold>\n            <left_val>0.3638620078563690</left_val>\n            <right_val>0.5698544979095459</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 6 10 -1.</_>\n                <_>3 3 3 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0538786612451077</threshold>\n            <left_val>0.4303531050682068</left_val>\n            <right_val>0.7559366226196289</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 15 15 -1.</_>\n                <_>3 9 15 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8887349870055914e-003</threshold>\n            <left_val>0.2122603058815002</left_val>\n            <right_val>0.5613427162170410</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 8 6 -1.</_>\n                <_>6 7 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3635339457541704e-003</threshold>\n            <left_val>0.5631849169731140</left_val>\n            <right_val>0.2642767131328583</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 10 -1.</_>\n                <_>10 4 6 5 2.</_>\n                <_>4 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0240177996456623</threshold>\n            <left_val>0.5797107815742493</left_val>\n            <right_val>0.2751705944538117</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 4 4 -1.</_>\n                <_>8 4 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0543030404951423e-004</threshold>\n            <left_val>0.2705242037773132</left_val>\n            <right_val>0.5752568840980530</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 2 -1.</_>\n                <_>15 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4790197433903813e-004</threshold>\n            <left_val>0.5435624718666077</left_val>\n            <right_val>0.2334876954555512</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 2 2 -1.</_>\n                <_>3 12 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4091329649090767e-003</threshold>\n            <left_val>0.5319424867630005</left_val>\n            <right_val>0.2063155025243759</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 11 1 3 -1.</_>\n                <_>16 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4642629539594054e-003</threshold>\n            <left_val>0.5418980717658997</left_val>\n            <right_val>0.3068861067295075</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 6 4 -1.</_>\n                <_>3 15 3 2 2.</_>\n                <_>6 17 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6352549428120255e-003</threshold>\n            <left_val>0.3695372939109802</left_val>\n            <right_val>0.6112868189811707</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 8 2 -1.</_>\n                <_>6 8 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3172752056270838e-004</threshold>\n            <left_val>0.3565036952495575</left_val>\n            <right_val>0.6025236248970032</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 1 3 -1.</_>\n                <_>3 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0998890977352858e-003</threshold>\n            <left_val>0.1913982033729553</left_val>\n            <right_val>0.5362827181816101</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 12 2 -1.</_>\n                <_>6 1 12 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4213981861248612e-004</threshold>\n            <left_val>0.3835555016994476</left_val>\n            <right_val>0.5529310107231140</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2655049581080675e-003</threshold>\n            <left_val>0.4312896132469177</left_val>\n            <right_val>0.7101895809173584</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 6 2 -1.</_>\n                <_>7 16 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9134991867467761e-004</threshold>\n            <left_val>0.3984830975532532</left_val>\n            <right_val>0.6391963958740234</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 4 6 -1.</_>\n                <_>0 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0152841797098517</threshold>\n            <left_val>0.2366732954978943</left_val>\n            <right_val>0.5433713793754578</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 12 2 -1.</_>\n                <_>8 12 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8381411470472813e-003</threshold>\n            <left_val>0.5817500948905945</left_val>\n            <right_val>0.3239189088344574</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 1 9 -1.</_>\n                <_>6 6 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1093179071322083e-004</threshold>\n            <left_val>0.5540593862533569</left_val>\n            <right_val>0.2911868989467621</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 17 3 2 -1.</_>\n                <_>11 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1275060288608074e-003</threshold>\n            <left_val>0.1775255054235458</left_val>\n            <right_val>0.5196629166603088</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4576259097084403e-004</threshold>\n            <left_val>0.3024170100688934</left_val>\n            <right_val>0.5533593893051148</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 4 -1.</_>\n                <_>9 6 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0226465407758951</threshold>\n            <left_val>0.4414930939674377</left_val>\n            <right_val>0.6975377202033997</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 3 2 -1.</_>\n                <_>8 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8804960418492556e-003</threshold>\n            <left_val>0.2791394889354706</left_val>\n            <right_val>0.5497952103614807</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 17 3 3 -1.</_>\n                <_>11 17 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0889107882976532e-003</threshold>\n            <left_val>0.5263199210166931</left_val>\n            <right_val>0.2385547012090683</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 3 2 -1.</_>\n                <_>8 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7318050377070904e-003</threshold>\n            <left_val>0.4319379031658173</left_val>\n            <right_val>0.6983600854873657</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 6 2 -1.</_>\n                <_>11 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8482700735330582e-003</threshold>\n            <left_val>0.3082042932510376</left_val>\n            <right_val>0.5390920042991638</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 14 4 -1.</_>\n                <_>3 13 14 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5062530110299122e-005</threshold>\n            <left_val>0.5521922111511231</left_val>\n            <right_val>0.3120366036891937</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 18 4 -1.</_>\n                <_>10 10 9 2 2.</_>\n                <_>1 12 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0294755697250366</threshold>\n            <left_val>0.5401322841644287</left_val>\n            <right_val>0.1770603060722351</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 3 3 -1.</_>\n                <_>0 11 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1387329846620560e-003</threshold>\n            <left_val>0.5178617835044861</left_val>\n            <right_val>0.1211019009351730</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 6 6 -1.</_>\n                <_>11 1 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0209429506212473</threshold>\n            <left_val>0.5290294289588928</left_val>\n            <right_val>0.3311221897602081</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 6 -1.</_>\n                <_>9 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.5665529370307922e-003</threshold>\n            <left_val>0.7471994161605835</left_val>\n            <right_val>0.4451968967914581</right_val></_></_></trees>\n      <stage_threshold>18.4129695892333980</stage_threshold>\n      <parent>2</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 4 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 9 -1.</_>\n                <_>1 3 18 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8206960996612906e-004</threshold>\n            <left_val>0.2064086049795151</left_val>\n            <right_val>0.6076732277870178</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 10 2 6 -1.</_>\n                <_>12 13 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6790600493550301e-003</threshold>\n            <left_val>0.5851997137069702</left_val>\n            <right_val>0.1255383938550949</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 19 8 -1.</_>\n                <_>0 9 19 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9827912375330925e-004</threshold>\n            <left_val>0.0940184295177460</left_val>\n            <right_val>0.5728961229324341</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 9 -1.</_>\n                <_>9 0 2 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8959012171253562e-004</threshold>\n            <left_val>0.1781987994909287</left_val>\n            <right_val>0.5694308876991272</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 6 1 -1.</_>\n                <_>7 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8560499195009470e-003</threshold>\n            <left_val>0.1638399064540863</left_val>\n            <right_val>0.5788664817810059</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 1 -1.</_>\n                <_>13 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8122469559311867e-003</threshold>\n            <left_val>0.2085440009832382</left_val>\n            <right_val>0.5508564710617065</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 4 6 -1.</_>\n                <_>5 13 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5896620461717248e-003</threshold>\n            <left_val>0.5702760815620422</left_val>\n            <right_val>0.1857215017080307</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 1 -1.</_>\n                <_>13 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0100783398374915</threshold>\n            <left_val>0.5116943120956421</left_val>\n            <right_val>0.2189770042896271</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 6 -1.</_>\n                <_>4 6 12 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0635263025760651</threshold>\n            <left_val>0.7131379842758179</left_val>\n            <right_val>0.4043813049793243</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 6 -1.</_>\n                <_>15 14 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1031491756439209e-003</threshold>\n            <left_val>0.2567181885242462</left_val>\n            <right_val>0.5463973283767700</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 2 -1.</_>\n                <_>10 3 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4035000242292881e-003</threshold>\n            <left_val>0.1700665950775147</left_val>\n            <right_val>0.5590974092483521</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 3 1 -1.</_>\n                <_>10 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5226360410451889e-003</threshold>\n            <left_val>0.5410556793212891</left_val>\n            <right_val>0.2619054019451141</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 4 14 -1.</_>\n                <_>3 1 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0179974399507046</threshold>\n            <left_val>0.3732436895370483</left_val>\n            <right_val>0.6535220742225647</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 4 4 -1.</_>\n                <_>11 0 2 2 2.</_>\n                <_>9 2 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4538191072642803e-003</threshold>\n            <left_val>0.2626481950283051</left_val>\n            <right_val>0.5537446141242981</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 1 14 -1.</_>\n                <_>7 12 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0118807600811124</threshold>\n            <left_val>0.2003753930330277</left_val>\n            <right_val>0.5544745922088623</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 0 1 4 -1.</_>\n                <_>19 2 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2713660253211856e-003</threshold>\n            <left_val>0.5591902732849121</left_val>\n            <right_val>0.3031975924968720</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 4 -1.</_>\n                <_>8 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1376109905540943e-003</threshold>\n            <left_val>0.2730407118797302</left_val>\n            <right_val>0.5646508932113648</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 18 3 2 -1.</_>\n                <_>10 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2651998810470104e-003</threshold>\n            <left_val>0.1405909061431885</left_val>\n            <right_val>0.5461820960044861</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 2 -1.</_>\n                <_>9 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9602861031889915e-003</threshold>\n            <left_val>0.1795035004615784</left_val>\n            <right_val>0.5459290146827698</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 6 -1.</_>\n                <_>4 7 12 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8448226451873779e-003</threshold>\n            <left_val>0.5736783146858215</left_val>\n            <right_val>0.2809219956398010</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 6 -1.</_>\n                <_>3 14 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6430689767003059e-003</threshold>\n            <left_val>0.2370675951242447</left_val>\n            <right_val>0.5503826141357422</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 2 12 -1.</_>\n                <_>10 12 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9997808635234833e-003</threshold>\n            <left_val>0.5608199834823608</left_val>\n            <right_val>0.3304282128810883</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 18 3 2 -1.</_>\n                <_>8 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1221720166504383e-003</threshold>\n            <left_val>0.1640105992555618</left_val>\n            <right_val>0.5378993153572083</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 2 -1.</_>\n                <_>11 0 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0156249096617103</threshold>\n            <left_val>0.5227649211883545</left_val>\n            <right_val>0.2288603931665421</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 9 3 -1.</_>\n                <_>5 12 9 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103564197197557</threshold>\n            <left_val>0.7016193866729736</left_val>\n            <right_val>0.4252927899360657</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 2 -1.</_>\n                <_>11 0 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7960809469223022e-003</threshold>\n            <left_val>0.2767347097396851</left_val>\n            <right_val>0.5355830192565918</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 5 -1.</_>\n                <_>7 1 6 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1622693985700607</threshold>\n            <left_val>0.4342240095138550</left_val>\n            <right_val>0.7442579269409180</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 4 4 -1.</_>\n                <_>10 0 2 2 2.</_>\n                <_>8 2 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5542530715465546e-003</threshold>\n            <left_val>0.5726485848426819</left_val>\n            <right_val>0.2582125067710877</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 1 3 -1.</_>\n                <_>3 13 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1309209987521172e-003</threshold>\n            <left_val>0.2106848061084747</left_val>\n            <right_val>0.5361018776893616</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 5 3 -1.</_>\n                <_>8 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0132084200158715</threshold>\n            <left_val>0.7593790888786316</left_val>\n            <right_val>0.4552468061447144</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 10 12 -1.</_>\n                <_>5 4 5 6 2.</_>\n                <_>10 10 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0659966766834259</threshold>\n            <left_val>0.1252475976943970</left_val>\n            <right_val>0.5344039797782898</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 9 12 -1.</_>\n                <_>9 10 9 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9142656177282333e-003</threshold>\n            <left_val>0.3315384089946747</left_val>\n            <right_val>0.5601043105125427</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 12 14 -1.</_>\n                <_>2 2 6 7 2.</_>\n                <_>8 9 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0208942797034979</threshold>\n            <left_val>0.5506049990653992</left_val>\n            <right_val>0.2768838107585907</right_val></_></_></trees>\n      <stage_threshold>15.3241395950317380</stage_threshold>\n      <parent>3</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 5 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 2 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1961159761995077e-003</threshold>\n            <left_val>0.1762690991163254</left_val>\n            <right_val>0.6156241297721863</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 6 4 -1.</_>\n                <_>7 6 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8679830245673656e-003</threshold>\n            <left_val>0.6118106842041016</left_val>\n            <right_val>0.1832399964332581</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 11 8 -1.</_>\n                <_>4 9 11 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9579799845814705e-004</threshold>\n            <left_val>0.0990442633628845</left_val>\n            <right_val>0.5723816156387329</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 10 16 4 -1.</_>\n                <_>3 12 16 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0255657667294145e-004</threshold>\n            <left_val>0.5579879879951477</left_val>\n            <right_val>0.2377282977104187</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 16 2 -1.</_>\n                <_>0 1 16 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4510810617357492e-003</threshold>\n            <left_val>0.2231457978487015</left_val>\n            <right_val>0.5858935117721558</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 2 -1.</_>\n                <_>9 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0361850298941135e-004</threshold>\n            <left_val>0.2653993964195252</left_val>\n            <right_val>0.5794103741645813</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 6 10 -1.</_>\n                <_>3 2 3 5 2.</_>\n                <_>6 7 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0293349884450436e-003</threshold>\n            <left_val>0.5803827047348023</left_val>\n            <right_val>0.2484865039587021</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 8 15 -1.</_>\n                <_>10 10 8 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0144517095759511</threshold>\n            <left_val>0.1830351948738098</left_val>\n            <right_val>0.5484204888343811</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 8 6 -1.</_>\n                <_>3 14 4 3 2.</_>\n                <_>7 17 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0380979403853416e-003</threshold>\n            <left_val>0.3363558948040009</left_val>\n            <right_val>0.6051092743873596</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 2 2 -1.</_>\n                <_>14 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6155190533027053e-003</threshold>\n            <left_val>0.2286642044782639</left_val>\n            <right_val>0.5441246032714844</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 7 6 -1.</_>\n                <_>1 13 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3458340913057327e-003</threshold>\n            <left_val>0.5625913143157959</left_val>\n            <right_val>0.2392338067293167</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 4 4 3 -1.</_>\n                <_>15 4 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6379579901695251e-003</threshold>\n            <left_val>0.3906993865966797</left_val>\n            <right_val>0.5964621901512146</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 9 14 6 -1.</_>\n                <_>2 9 7 3 2.</_>\n                <_>9 12 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0302512105554342</threshold>\n            <left_val>0.5248482227325440</left_val>\n            <right_val>0.1575746983289719</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 4 -1.</_>\n                <_>5 9 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0372519902884960</threshold>\n            <left_val>0.4194310903549194</left_val>\n            <right_val>0.6748418807983398</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 8 -1.</_>\n                <_>6 9 4 4 2.</_>\n                <_>10 13 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0251097902655602</threshold>\n            <left_val>0.1882549971342087</left_val>\n            <right_val>0.5473451018333435</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 3 2 -1.</_>\n                <_>14 2 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3099058568477631e-003</threshold>\n            <left_val>0.1339973062276840</left_val>\n            <right_val>0.5227110981941223</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 4 2 -1.</_>\n                <_>3 4 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2086479691788554e-003</threshold>\n            <left_val>0.3762088119983673</left_val>\n            <right_val>0.6109635829925537</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 8 -1.</_>\n                <_>11 14 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0219076797366142</threshold>\n            <left_val>0.2663142979145050</left_val>\n            <right_val>0.5404006838798523</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 5 3 -1.</_>\n                <_>0 1 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4116579703986645e-003</threshold>\n            <left_val>0.5363578796386719</left_val>\n            <right_val>0.2232273072004318</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 18 8 -1.</_>\n                <_>11 5 9 4 2.</_>\n                <_>2 9 9 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0699463263154030</threshold>\n            <left_val>0.5358232855796814</left_val>\n            <right_val>0.2453698068857193</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 6 -1.</_>\n                <_>6 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4520021290518343e-004</threshold>\n            <left_val>0.2409671992063522</left_val>\n            <right_val>0.5376930236816406</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 1 1 3 -1.</_>\n                <_>19 2 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2627709656953812e-003</threshold>\n            <left_val>0.5425856709480286</left_val>\n            <right_val>0.3155693113803864</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 6 -1.</_>\n                <_>9 6 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0227195098996162</threshold>\n            <left_val>0.4158405959606171</left_val>\n            <right_val>0.6597865223884583</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 1 1 3 -1.</_>\n                <_>19 2 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8111000536009669e-003</threshold>\n            <left_val>0.2811253070831299</left_val>\n            <right_val>0.5505244731903076</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3469670452177525e-003</threshold>\n            <left_val>0.5260028243064880</left_val>\n            <right_val>0.1891465038061142</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 8 12 -1.</_>\n                <_>12 4 4 6 2.</_>\n                <_>8 10 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0791751234792173e-004</threshold>\n            <left_val>0.5673509240150452</left_val>\n            <right_val>0.3344210088253021</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 3 -1.</_>\n                <_>7 2 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127347996458411</threshold>\n            <left_val>0.5343592166900635</left_val>\n            <right_val>0.2395612001419067</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 9 10 -1.</_>\n                <_>6 6 9 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3119727894663811e-003</threshold>\n            <left_val>0.6010890007019043</left_val>\n            <right_val>0.4022207856178284</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 6 12 -1.</_>\n                <_>2 4 2 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0569487512111664</threshold>\n            <left_val>0.8199151158332825</left_val>\n            <right_val>0.4543190896511078</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0116591155529022e-003</threshold>\n            <left_val>0.2200281023979187</left_val>\n            <right_val>0.5357710719108582</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 5 3 -1.</_>\n                <_>7 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0334368608891964e-003</threshold>\n            <left_val>0.4413081109523773</left_val>\n            <right_val>0.7181751132011414</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 3 3 -1.</_>\n                <_>15 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9437441155314445e-003</threshold>\n            <left_val>0.5478860735893250</left_val>\n            <right_val>0.2791733145713806</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 8 3 -1.</_>\n                <_>6 15 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6591119132936001e-003</threshold>\n            <left_val>0.6357867717742920</left_val>\n            <right_val>0.3989723920822144</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 3 3 -1.</_>\n                <_>15 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8456181064248085e-003</threshold>\n            <left_val>0.3493686020374298</left_val>\n            <right_val>0.5300664901733398</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 3 3 -1.</_>\n                <_>2 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1926261298358440e-003</threshold>\n            <left_val>0.1119614988565445</left_val>\n            <right_val>0.5229672789573669</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 12 -1.</_>\n                <_>10 7 6 6 2.</_>\n                <_>4 13 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0527989417314529</threshold>\n            <left_val>0.2387102991342545</left_val>\n            <right_val>0.5453451275825501</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 6 -1.</_>\n                <_>10 7 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9537667334079742e-003</threshold>\n            <left_val>0.7586917877197266</left_val>\n            <right_val>0.4439376890659332</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 5 2 -1.</_>\n                <_>8 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7344180271029472e-003</threshold>\n            <left_val>0.2565476894378662</left_val>\n            <right_val>0.5489321947097778</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 4 -1.</_>\n                <_>9 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8507939530536532e-003</threshold>\n            <left_val>0.6734347939491272</left_val>\n            <right_val>0.4252474904060364</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 8 -1.</_>\n                <_>9 10 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0159189198166132</threshold>\n            <left_val>0.5488352775573731</left_val>\n            <right_val>0.2292661964893341</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 6 -1.</_>\n                <_>8 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2687679845839739e-003</threshold>\n            <left_val>0.6104331016540527</left_val>\n            <right_val>0.4022389948368073</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 3 3 -1.</_>\n                <_>12 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2883910723030567e-003</threshold>\n            <left_val>0.5310853123664856</left_val>\n            <right_val>0.1536193042993546</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 1 -1.</_>\n                <_>7 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2259892001748085e-003</threshold>\n            <left_val>0.1729111969470978</left_val>\n            <right_val>0.5241606235504150</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 3 -1.</_>\n                <_>5 7 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0121325999498367</threshold>\n            <left_val>0.6597759723663330</left_val>\n            <right_val>0.4325182139873505</right_val></_></_></trees>\n      <stage_threshold>21.0106391906738280</stage_threshold>\n      <parent>4</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 6 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 6 9 -1.</_>\n                <_>7 6 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9184908382594585e-003</threshold>\n            <left_val>0.6103435158729553</left_val>\n            <right_val>0.1469330936670303</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 9 1 -1.</_>\n                <_>9 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5971299726516008e-003</threshold>\n            <left_val>0.2632363140583038</left_val>\n            <right_val>0.5896466970443726</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 16 8 -1.</_>\n                <_>2 12 16 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0177801102399826</threshold>\n            <left_val>0.5872874259948731</left_val>\n            <right_val>0.1760361939668655</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 6 -1.</_>\n                <_>14 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5334769897162914e-004</threshold>\n            <left_val>0.1567801982164383</left_val>\n            <right_val>0.5596066117286682</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 6 15 -1.</_>\n                <_>1 10 6 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8353091329336166e-004</threshold>\n            <left_val>0.1913153976202011</left_val>\n            <right_val>0.5732036232948303</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 6 9 -1.</_>\n                <_>10 3 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6104689566418529e-003</threshold>\n            <left_val>0.2914913892745972</left_val>\n            <right_val>0.5623080730438232</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 7 14 -1.</_>\n                <_>6 13 7 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0977506190538406</threshold>\n            <left_val>0.1943476945161820</left_val>\n            <right_val>0.5648233294487000</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 3 6 -1.</_>\n                <_>13 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5182358482852578e-004</threshold>\n            <left_val>0.3134616911411285</left_val>\n            <right_val>0.5504639744758606</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 15 4 -1.</_>\n                <_>6 8 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128582203760743</threshold>\n            <left_val>0.2536481916904450</left_val>\n            <right_val>0.5760142803192139</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 3 10 -1.</_>\n                <_>11 7 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1530239395797253e-003</threshold>\n            <left_val>0.5767722129821777</left_val>\n            <right_val>0.3659774065017700</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 4 6 -1.</_>\n                <_>3 9 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7092459602281451e-003</threshold>\n            <left_val>0.2843191027641296</left_val>\n            <right_val>0.5918939113616943</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 3 6 10 -1.</_>\n                <_>15 3 2 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.5217359699308872e-003</threshold>\n            <left_val>0.4052427113056183</left_val>\n            <right_val>0.6183109283447266</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 10 -1.</_>\n                <_>5 7 4 5 2.</_>\n                <_>9 12 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2479810286313295e-003</threshold>\n            <left_val>0.5783755183219910</left_val>\n            <right_val>0.3135401010513306</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 12 -1.</_>\n                <_>10 4 6 6 2.</_>\n                <_>4 10 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0520062111318111</threshold>\n            <left_val>0.5541312098503113</left_val>\n            <right_val>0.1916636973619461</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 6 9 -1.</_>\n                <_>3 4 2 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0120855299755931</threshold>\n            <left_val>0.4032655954360962</left_val>\n            <right_val>0.6644591093063355</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 2 5 -1.</_>\n                <_>11 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4687820112158079e-005</threshold>\n            <left_val>0.3535977900028229</left_val>\n            <right_val>0.5709382891654968</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 2 5 -1.</_>\n                <_>8 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1395188570022583e-006</threshold>\n            <left_val>0.3037444949150085</left_val>\n            <right_val>0.5610269904136658</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 2 3 -1.</_>\n                <_>10 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6001640148460865e-003</threshold>\n            <left_val>0.7181087136268616</left_val>\n            <right_val>0.4580326080322266</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 6 2 -1.</_>\n                <_>8 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0058949012309313e-003</threshold>\n            <left_val>0.5621951818466187</left_val>\n            <right_val>0.2953684031963348</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5050270855426788e-003</threshold>\n            <left_val>0.4615387916564941</left_val>\n            <right_val>0.7619017958641052</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 12 6 -1.</_>\n                <_>4 14 12 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0117468303069472</threshold>\n            <left_val>0.5343837141990662</left_val>\n            <right_val>0.1772529035806656</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 5 9 -1.</_>\n                <_>11 14 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0583163388073444</threshold>\n            <left_val>0.1686245948076248</left_val>\n            <right_val>0.5340772271156311</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 3 2 -1.</_>\n                <_>6 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3629379575140774e-004</threshold>\n            <left_val>0.3792056143283844</left_val>\n            <right_val>0.6026803851127625</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 5 -1.</_>\n                <_>12 0 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8156180679798126e-003</threshold>\n            <left_val>0.1512867063283920</left_val>\n            <right_val>0.5324323773384094</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 7 -1.</_>\n                <_>8 5 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108761601150036</threshold>\n            <left_val>0.2081822007894516</left_val>\n            <right_val>0.5319945216178894</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 1 9 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7745519764721394e-003</threshold>\n            <left_val>0.4098246991634369</left_val>\n            <right_val>0.5210328102111816</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 4 8 -1.</_>\n                <_>3 2 2 4 2.</_>\n                <_>5 6 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8276381827890873e-004</threshold>\n            <left_val>0.5693274140357971</left_val>\n            <right_val>0.3478842079639435</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 12 4 6 -1.</_>\n                <_>13 14 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0138704096898437</threshold>\n            <left_val>0.5326750874519348</left_val>\n            <right_val>0.2257698029279709</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 4 6 -1.</_>\n                <_>3 14 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0236749108880758</threshold>\n            <left_val>0.1551305055618286</left_val>\n            <right_val>0.5200707912445068</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 4 -1.</_>\n                <_>13 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4879409718560055e-005</threshold>\n            <left_val>0.5500566959381104</left_val>\n            <right_val>0.3820176124572754</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 4 3 -1.</_>\n                <_>4 5 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6190641112625599e-003</threshold>\n            <left_val>0.4238683879375458</left_val>\n            <right_val>0.6639748215675354</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 11 8 -1.</_>\n                <_>7 9 11 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0198171101510525</threshold>\n            <left_val>0.2150038033723831</left_val>\n            <right_val>0.5382357835769653</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 4 -1.</_>\n                <_>8 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8154039066284895e-003</threshold>\n            <left_val>0.6675711274147034</left_val>\n            <right_val>0.4215297102928162</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 6 1 -1.</_>\n                <_>11 1 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9775829538702965e-003</threshold>\n            <left_val>0.2267289012670517</left_val>\n            <right_val>0.5386328101158142</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 3 3 -1.</_>\n                <_>5 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2441020701080561e-003</threshold>\n            <left_val>0.4308691024780273</left_val>\n            <right_val>0.6855735778808594</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 20 6 -1.</_>\n                <_>10 9 10 3 2.</_>\n                <_>0 12 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0122824599966407</threshold>\n            <left_val>0.5836614966392517</left_val>\n            <right_val>0.3467479050159454</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 5 -1.</_>\n                <_>9 6 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8548699337989092e-003</threshold>\n            <left_val>0.7016944885253906</left_val>\n            <right_val>0.4311453998088837</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 1 3 -1.</_>\n                <_>11 1 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7875669077038765e-003</threshold>\n            <left_val>0.2895345091819763</left_val>\n            <right_val>0.5224946141242981</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 4 2 -1.</_>\n                <_>4 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2201230274513364e-003</threshold>\n            <left_val>0.2975570857524872</left_val>\n            <right_val>0.5481644868850708</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 4 3 -1.</_>\n                <_>12 7 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0101605998352170</threshold>\n            <left_val>0.4888817965984345</left_val>\n            <right_val>0.8182697892189026</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 6 4 -1.</_>\n                <_>7 0 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0161745697259903</threshold>\n            <left_val>0.1481492966413498</left_val>\n            <right_val>0.5239992737770081</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 8 -1.</_>\n                <_>10 7 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0192924607545137</threshold>\n            <left_val>0.4786309897899628</left_val>\n            <right_val>0.7378190755844116</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>10 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.2479539513587952e-003</threshold>\n            <left_val>0.7374222874641419</left_val>\n            <right_val>0.4470643997192383</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 14 4 -1.</_>\n                <_>13 7 7 2 2.</_>\n                <_>6 9 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3803480267524719e-003</threshold>\n            <left_val>0.3489154875278473</left_val>\n            <right_val>0.5537996292114258</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 3 6 -1.</_>\n                <_>0 7 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0126061299815774</threshold>\n            <left_val>0.2379686981439591</left_val>\n            <right_val>0.5315443277359009</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 4 -1.</_>\n                <_>13 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0256219301372766</threshold>\n            <left_val>0.1964688003063202</left_val>\n            <right_val>0.5138769745826721</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 4 -1.</_>\n                <_>4 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5741496402770281e-005</threshold>\n            <left_val>0.5590522885322571</left_val>\n            <right_val>0.3365853130817413</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 8 -1.</_>\n                <_>11 9 6 4 2.</_>\n                <_>5 13 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0892108827829361</threshold>\n            <left_val>0.0634046569466591</left_val>\n            <right_val>0.5162634849548340</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 3 -1.</_>\n                <_>9 13 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7670480776578188e-003</threshold>\n            <left_val>0.7323467731475830</left_val>\n            <right_val>0.4490706026554108</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 2 4 -1.</_>\n                <_>10 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7152578695677221e-004</threshold>\n            <left_val>0.4114834964275360</left_val>\n            <right_val>0.5985518097877502</right_val></_></_></trees>\n      <stage_threshold>23.9187908172607420</stage_threshold>\n      <parent>5</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 7 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 1 -1.</_>\n                <_>9 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4786219689995050e-003</threshold>\n            <left_val>0.2663545012474060</left_val>\n            <right_val>0.6643316745758057</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 6 6 -1.</_>\n                <_>15 3 3 3 2.</_>\n                <_>12 6 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8741659587249160e-003</threshold>\n            <left_val>0.6143848896026611</left_val>\n            <right_val>0.2518512904644013</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 10 6 -1.</_>\n                <_>0 6 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7151009524241090e-003</threshold>\n            <left_val>0.5766341090202332</left_val>\n            <right_val>0.2397463023662567</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 8 14 -1.</_>\n                <_>12 3 4 7 2.</_>\n                <_>8 10 4 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8939269939437509e-003</threshold>\n            <left_val>0.5682045817375183</left_val>\n            <right_val>0.2529144883155823</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 7 15 -1.</_>\n                <_>4 9 7 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3006052039563656e-003</threshold>\n            <left_val>0.1640675961971283</left_val>\n            <right_val>0.5556079745292664</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 6 8 -1.</_>\n                <_>15 2 3 4 2.</_>\n                <_>12 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0466625317931175</threshold>\n            <left_val>0.6123154163360596</left_val>\n            <right_val>0.4762830138206482</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 6 8 -1.</_>\n                <_>2 2 3 4 2.</_>\n                <_>5 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9431332414969802e-004</threshold>\n            <left_val>0.5707858800888062</left_val>\n            <right_val>0.2839404046535492</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 18 7 -1.</_>\n                <_>8 13 6 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0148916700854898</threshold>\n            <left_val>0.4089672863483429</left_val>\n            <right_val>0.6006367206573486</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 8 14 -1.</_>\n                <_>4 3 4 7 2.</_>\n                <_>8 10 4 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2046529445797205e-003</threshold>\n            <left_val>0.5712450742721558</left_val>\n            <right_val>0.2705289125442505</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 6 -1.</_>\n                <_>18 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0619381256401539e-003</threshold>\n            <left_val>0.5262504220008850</left_val>\n            <right_val>0.3262225985527039</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5286648888140917e-003</threshold>\n            <left_val>0.6853830814361572</left_val>\n            <right_val>0.4199256896972656</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 6 -1.</_>\n                <_>18 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.9010218828916550e-003</threshold>\n            <left_val>0.3266282081604004</left_val>\n            <right_val>0.5434812903404236</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 2 6 -1.</_>\n                <_>0 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6702760048210621e-003</threshold>\n            <left_val>0.5468410849571228</left_val>\n            <right_val>0.2319003939628601</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 18 6 -1.</_>\n                <_>1 7 18 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0304100364446640e-003</threshold>\n            <left_val>0.5570667982101440</left_val>\n            <right_val>0.2708238065242767</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 7 -1.</_>\n                <_>3 2 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9803649522364140e-003</threshold>\n            <left_val>0.3700568974018097</left_val>\n            <right_val>0.5890625715255737</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 6 14 -1.</_>\n                <_>7 10 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0758405104279518</threshold>\n            <left_val>0.2140070050954819</left_val>\n            <right_val>0.5419948101043701</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 13 10 -1.</_>\n                <_>3 12 13 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0192625392228365</threshold>\n            <left_val>0.5526772141456604</left_val>\n            <right_val>0.2726590037345886</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 15 2 2 -1.</_>\n                <_>11 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8888259364757687e-004</threshold>\n            <left_val>0.3958011865615845</left_val>\n            <right_val>0.6017209887504578</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 16 4 -1.</_>\n                <_>2 11 8 2 2.</_>\n                <_>10 13 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0293695498257875</threshold>\n            <left_val>0.5241373777389526</left_val>\n            <right_val>0.1435758024454117</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0417619487270713e-003</threshold>\n            <left_val>0.3385409116744995</left_val>\n            <right_val>0.5929983258247376</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 9 -1.</_>\n                <_>6 13 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6125640142709017e-003</threshold>\n            <left_val>0.5485377907752991</left_val>\n            <right_val>0.3021597862243652</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 1 6 -1.</_>\n                <_>14 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6977467183023691e-004</threshold>\n            <left_val>0.3375276029109955</left_val>\n            <right_val>0.5532032847404480</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 4 1 -1.</_>\n                <_>7 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9512659208849072e-004</threshold>\n            <left_val>0.5631743073463440</left_val>\n            <right_val>0.3359399139881134</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 15 5 -1.</_>\n                <_>8 8 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1015655994415283</threshold>\n            <left_val>0.0637350380420685</left_val>\n            <right_val>0.5230425000190735</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 6 5 4 -1.</_>\n                <_>1 8 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0361566990613937</threshold>\n            <left_val>0.5136963129043579</left_val>\n            <right_val>0.1029528975486755</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 17 6 -1.</_>\n                <_>3 3 17 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4624140243977308e-003</threshold>\n            <left_val>0.3879320025444031</left_val>\n            <right_val>0.5558289289474487</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 8 2 -1.</_>\n                <_>10 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0195549800992012</threshold>\n            <left_val>0.5250086784362793</left_val>\n            <right_val>0.1875859946012497</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 2 -1.</_>\n                <_>10 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3121440317481756e-003</threshold>\n            <left_val>0.6672028899192810</left_val>\n            <right_val>0.4679641127586365</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>9 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8605289515107870e-003</threshold>\n            <left_val>0.7163379192352295</left_val>\n            <right_val>0.4334670901298523</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 4 2 -1.</_>\n                <_>8 10 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4026362057775259e-004</threshold>\n            <left_val>0.3021360933780670</left_val>\n            <right_val>0.5650203227996826</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 3 -1.</_>\n                <_>8 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2418331615626812e-003</threshold>\n            <left_val>0.1820009052753449</left_val>\n            <right_val>0.5250256061553955</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 4 -1.</_>\n                <_>9 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1729019752237946e-004</threshold>\n            <left_val>0.3389188051223755</left_val>\n            <right_val>0.5445973277091980</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1878840159624815e-003</threshold>\n            <left_val>0.4085349142551422</left_val>\n            <right_val>0.6253563165664673</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 6 -1.</_>\n                <_>10 7 6 3 2.</_>\n                <_>4 10 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108813596889377</threshold>\n            <left_val>0.3378399014472961</left_val>\n            <right_val>0.5700082778930664</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7354859737679362e-003</threshold>\n            <left_val>0.4204635918140411</left_val>\n            <right_val>0.6523038744926453</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>9 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5119052305817604e-003</threshold>\n            <left_val>0.2595216035842896</left_val>\n            <right_val>0.5428143739700317</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 3 8 -1.</_>\n                <_>8 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2136430013924837e-003</threshold>\n            <left_val>0.6165143847465515</left_val>\n            <right_val>0.3977893888950348</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 3 6 -1.</_>\n                <_>11 0 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103542404249310</threshold>\n            <left_val>0.1628028005361557</left_val>\n            <right_val>0.5219504833221436</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 4 8 -1.</_>\n                <_>8 3 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5858830455690622e-004</threshold>\n            <left_val>0.3199650943279266</left_val>\n            <right_val>0.5503574013710022</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 13 -1.</_>\n                <_>14 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0152996499091387</threshold>\n            <left_val>0.4103994071483612</left_val>\n            <right_val>0.6122388243675232</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 3 6 -1.</_>\n                <_>8 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215882100164890</threshold>\n            <left_val>0.1034912988543510</left_val>\n            <right_val>0.5197384953498840</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 13 -1.</_>\n                <_>14 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1283462941646576</threshold>\n            <left_val>0.8493865132331848</left_val>\n            <right_val>0.4893102943897247</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 10 4 -1.</_>\n                <_>0 7 5 2 2.</_>\n                <_>5 9 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2927189711481333e-003</threshold>\n            <left_val>0.3130157887935638</left_val>\n            <right_val>0.5471575260162354</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 13 -1.</_>\n                <_>14 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0799151062965393</threshold>\n            <left_val>0.4856320917606354</left_val>\n            <right_val>0.6073989272117615</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 6 13 -1.</_>\n                <_>3 3 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0794410929083824</threshold>\n            <left_val>0.8394674062728882</left_val>\n            <right_val>0.4624533057212830</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 4 1 -1.</_>\n                <_>9 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2800010889768600e-003</threshold>\n            <left_val>0.1881695985794067</left_val>\n            <right_val>0.5306698083877564</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 2 1 -1.</_>\n                <_>9 0 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0463109938427806e-003</threshold>\n            <left_val>0.5271229147911072</left_val>\n            <right_val>0.2583065927028656</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 4 4 -1.</_>\n                <_>12 16 2 2 2.</_>\n                <_>10 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6317298761568964e-004</threshold>\n            <left_val>0.4235304892063141</left_val>\n            <right_val>0.5735440850257874</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 3 -1.</_>\n                <_>10 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6173160187900066e-003</threshold>\n            <left_val>0.6934396028518677</left_val>\n            <right_val>0.4495444893836975</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 2 -1.</_>\n                <_>8 5 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0114218797534704</threshold>\n            <left_val>0.5900921225547791</left_val>\n            <right_val>0.4138193130493164</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9963278900831938e-003</threshold>\n            <left_val>0.6466382741928101</left_val>\n            <right_val>0.4327239990234375</right_val></_></_></trees>\n      <stage_threshold>24.5278797149658200</stage_threshold>\n      <parent>6</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 8 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 8 6 -1.</_>\n                <_>6 6 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9691245704889297e-003</threshold>\n            <left_val>0.6142324209213257</left_val>\n            <right_val>0.2482212036848068</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 12 -1.</_>\n                <_>9 11 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3073059320449829e-004</threshold>\n            <left_val>0.5704951882362366</left_val>\n            <right_val>0.2321965992450714</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 6 8 -1.</_>\n                <_>4 10 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4045301405712962e-004</threshold>\n            <left_val>0.2112251967191696</left_val>\n            <right_val>0.5814933180809021</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 8 5 -1.</_>\n                <_>12 2 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5424019917845726e-003</threshold>\n            <left_val>0.2950482070446014</left_val>\n            <right_val>0.5866311788558960</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 18 3 -1.</_>\n                <_>0 9 18 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.2477443104144186e-005</threshold>\n            <left_val>0.2990990877151489</left_val>\n            <right_val>0.5791326761245728</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 8 -1.</_>\n                <_>8 16 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6603146046400070e-003</threshold>\n            <left_val>0.2813029885292053</left_val>\n            <right_val>0.5635542273521423</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 8 5 -1.</_>\n                <_>4 2 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0515816807746887e-003</threshold>\n            <left_val>0.3535369038581848</left_val>\n            <right_val>0.6054757237434387</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 4 -1.</_>\n                <_>13 13 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3835240649059415e-004</threshold>\n            <left_val>0.5596532225608826</left_val>\n            <right_val>0.2731510996818543</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.8168973636347800e-005</threshold>\n            <left_val>0.5978031754493713</left_val>\n            <right_val>0.3638561069965363</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 3 1 -1.</_>\n                <_>12 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1298790341243148e-003</threshold>\n            <left_val>0.2755252122879028</left_val>\n            <right_val>0.5432729125022888</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 5 3 -1.</_>\n                <_>7 14 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4356150105595589e-003</threshold>\n            <left_val>0.4305641949176788</left_val>\n            <right_val>0.7069833278656006</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 7 6 -1.</_>\n                <_>11 14 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0568293295800686</threshold>\n            <left_val>0.2495242953300476</left_val>\n            <right_val>0.5294997096061707</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 7 6 -1.</_>\n                <_>2 14 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0668169967830181e-003</threshold>\n            <left_val>0.5478553175926209</left_val>\n            <right_val>0.2497723996639252</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 2 6 -1.</_>\n                <_>12 16 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8164798499783501e-005</threshold>\n            <left_val>0.3938601016998291</left_val>\n            <right_val>0.5706356167793274</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 3 3 -1.</_>\n                <_>8 15 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1795017682015896e-003</threshold>\n            <left_val>0.4407606124877930</left_val>\n            <right_val>0.7394766807556152</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 5 -1.</_>\n                <_>12 0 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4985752105712891e-003</threshold>\n            <left_val>0.5445243120193481</left_val>\n            <right_val>0.2479152977466583</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 4 9 -1.</_>\n                <_>8 1 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0211090557277203e-003</threshold>\n            <left_val>0.2544766962528229</left_val>\n            <right_val>0.5338971018791199</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 6 1 -1.</_>\n                <_>12 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4247528314590454e-003</threshold>\n            <left_val>0.2718858122825623</left_val>\n            <right_val>0.5324069261550903</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>8 10 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0559899965301156e-003</threshold>\n            <left_val>0.3178288042545319</left_val>\n            <right_val>0.5534508824348450</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6465808777138591e-004</threshold>\n            <left_val>0.4284219145774841</left_val>\n            <right_val>0.6558194160461426</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 18 4 2 -1.</_>\n                <_>5 19 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7524109464138746e-004</threshold>\n            <left_val>0.5902860760688782</left_val>\n            <right_val>0.3810262978076935</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 18 6 -1.</_>\n                <_>2 3 18 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2293202131986618e-003</threshold>\n            <left_val>0.3816489875316620</left_val>\n            <right_val>0.5709385871887207</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 2 -1.</_>\n                <_>7 0 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.2868210691958666e-003</threshold>\n            <left_val>0.1747743934392929</left_val>\n            <right_val>0.5259544253349304</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 8 6 2 -1.</_>\n                <_>16 8 3 1 2.</_>\n                <_>13 9 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5611879643984139e-004</threshold>\n            <left_val>0.3601722121238709</left_val>\n            <right_val>0.5725612044334412</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 6 -1.</_>\n                <_>6 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3621381488919724e-006</threshold>\n            <left_val>0.5401858091354370</left_val>\n            <right_val>0.3044497072696686</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 4 -1.</_>\n                <_>10 13 10 2 2.</_>\n                <_>0 15 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0147672500461340</threshold>\n            <left_val>0.3220770061016083</left_val>\n            <right_val>0.5573434829711914</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 5 -1.</_>\n                <_>9 7 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0244895908981562</threshold>\n            <left_val>0.4301528036594391</left_val>\n            <right_val>0.6518812775611877</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 2 2 -1.</_>\n                <_>11 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7652091123163700e-004</threshold>\n            <left_val>0.3564583063125610</left_val>\n            <right_val>0.5598236918449402</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 6 2 -1.</_>\n                <_>1 8 3 1 2.</_>\n                <_>4 9 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3657688517414499e-006</threshold>\n            <left_val>0.3490782976150513</left_val>\n            <right_val>0.5561897754669190</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 2 -1.</_>\n                <_>10 2 10 1 2.</_>\n                <_>0 3 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0150999398902059</threshold>\n            <left_val>0.1776272058486939</left_val>\n            <right_val>0.5335299968719482</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 5 3 -1.</_>\n                <_>7 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8316650316119194e-003</threshold>\n            <left_val>0.6149687767028809</left_val>\n            <right_val>0.4221394062042236</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 6 -1.</_>\n                <_>10 13 3 3 2.</_>\n                <_>7 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0169254001230001</threshold>\n            <left_val>0.5413014888763428</left_val>\n            <right_val>0.2166585028171539</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0477850232273340e-003</threshold>\n            <left_val>0.6449490785598755</left_val>\n            <right_val>0.4354617893695831</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 11 1 6 -1.</_>\n                <_>16 13 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2140589319169521e-003</threshold>\n            <left_val>0.5400155186653137</left_val>\n            <right_val>0.3523217141628265</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 1 6 -1.</_>\n                <_>3 13 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0023201145231724e-003</threshold>\n            <left_val>0.2774524092674255</left_val>\n            <right_val>0.5338417291641235</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 14 12 -1.</_>\n                <_>11 4 7 6 2.</_>\n                <_>4 10 7 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4182129465043545e-003</threshold>\n            <left_val>0.5676739215850830</left_val>\n            <right_val>0.3702817857265472</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8764587417244911e-003</threshold>\n            <left_val>0.7749221920967102</left_val>\n            <right_val>0.4583688974380493</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7311739977449179e-003</threshold>\n            <left_val>0.5338721871376038</left_val>\n            <right_val>0.3996661007404327</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 3 -1.</_>\n                <_>6 7 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5082379579544067e-003</threshold>\n            <left_val>0.5611963272094727</left_val>\n            <right_val>0.3777498900890350</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0541074275970459e-003</threshold>\n            <left_val>0.2915228903293610</left_val>\n            <right_val>0.5179182887077332</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 4 10 -1.</_>\n                <_>3 1 2 5 2.</_>\n                <_>5 6 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.7938813269138336e-004</threshold>\n            <left_val>0.5536432862281799</left_val>\n            <right_val>0.3700192868709564</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 2 -1.</_>\n                <_>5 7 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8745909482240677e-003</threshold>\n            <left_val>0.3754391074180603</left_val>\n            <right_val>0.5679376125335693</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4936719350516796e-003</threshold>\n            <left_val>0.7019699215888977</left_val>\n            <right_val>0.4480949938297272</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 3 -1.</_>\n                <_>15 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4389229044318199e-003</threshold>\n            <left_val>0.2310364991426468</left_val>\n            <right_val>0.5313386917114258</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 4 -1.</_>\n                <_>8 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5094640487805009e-004</threshold>\n            <left_val>0.5864868760108948</left_val>\n            <right_val>0.4129343032836914</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 12 -1.</_>\n                <_>13 10 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4528800420521293e-005</threshold>\n            <left_val>0.3732407093048096</left_val>\n            <right_val>0.5619621276855469</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 12 -1.</_>\n                <_>4 5 6 6 2.</_>\n                <_>10 11 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0407580696046352</threshold>\n            <left_val>0.5312091112136841</left_val>\n            <right_val>0.2720521986484528</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 7 3 -1.</_>\n                <_>7 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6505931317806244e-003</threshold>\n            <left_val>0.4710015952587128</left_val>\n            <right_val>0.6693493723869324</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 3 -1.</_>\n                <_>3 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5759351924061775e-003</threshold>\n            <left_val>0.5167819261550903</left_val>\n            <right_val>0.1637275964021683</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 14 2 -1.</_>\n                <_>10 2 7 1 2.</_>\n                <_>3 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5269311890006065e-003</threshold>\n            <left_val>0.5397608876228333</left_val>\n            <right_val>0.2938531935214996</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 3 10 -1.</_>\n                <_>1 1 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0136603796854615</threshold>\n            <left_val>0.7086488008499146</left_val>\n            <right_val>0.4532200098037720</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 6 5 -1.</_>\n                <_>11 0 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0273588690906763</threshold>\n            <left_val>0.5206481218338013</left_val>\n            <right_val>0.3589231967926025</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 6 2 -1.</_>\n                <_>8 7 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2197551596909761e-004</threshold>\n            <left_val>0.3507075905799866</left_val>\n            <right_val>0.5441123247146606</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 10 -1.</_>\n                <_>7 6 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3077080734074116e-003</threshold>\n            <left_val>0.5859522819519043</left_val>\n            <right_val>0.4024891853332520</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 3 -1.</_>\n                <_>7 1 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0106311095878482</threshold>\n            <left_val>0.6743267178535461</left_val>\n            <right_val>0.4422602951526642</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 6 -1.</_>\n                <_>16 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0194416493177414</threshold>\n            <left_val>0.5282716155052185</left_val>\n            <right_val>0.1797904968261719</right_val></_></_></trees>\n      <stage_threshold>27.1533508300781250</stage_threshold>\n      <parent>7</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 9 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 7 6 -1.</_>\n                <_>6 6 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5052167735993862e-003</threshold>\n            <left_val>0.5914731025695801</left_val>\n            <right_val>0.2626559138298035</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 2 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9562279339879751e-003</threshold>\n            <left_val>0.2312581986188889</left_val>\n            <right_val>0.5741627216339111</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 17 10 -1.</_>\n                <_>0 9 17 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8924784213304520e-003</threshold>\n            <left_val>0.1656530052423477</left_val>\n            <right_val>0.5626654028892517</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 15 16 -1.</_>\n                <_>3 12 15 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0836383774876595</threshold>\n            <left_val>0.5423449873924255</left_val>\n            <right_val>0.1957294940948486</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 6 4 -1.</_>\n                <_>7 17 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2282270472496748e-003</threshold>\n            <left_val>0.3417904078960419</left_val>\n            <right_val>0.5992503762245178</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 4 9 -1.</_>\n                <_>15 2 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7629169896245003e-003</threshold>\n            <left_val>0.3719581961631775</left_val>\n            <right_val>0.6079903841018677</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 3 2 -1.</_>\n                <_>2 4 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6417410224676132e-003</threshold>\n            <left_val>0.2577486038208008</left_val>\n            <right_val>0.5576915740966797</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 7 9 -1.</_>\n                <_>13 9 7 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4113149158656597e-003</threshold>\n            <left_val>0.2950749099254608</left_val>\n            <right_val>0.5514171719551086</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0110693201422691</threshold>\n            <left_val>0.7569358944892883</left_val>\n            <right_val>0.4477078914642334</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 6 -1.</_>\n                <_>10 2 10 3 2.</_>\n                <_>0 5 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0348659716546535</threshold>\n            <left_val>0.5583708882331848</left_val>\n            <right_val>0.2669621109962463</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 6 10 -1.</_>\n                <_>3 2 3 5 2.</_>\n                <_>6 7 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5701099811121821e-004</threshold>\n            <left_val>0.5627313256263733</left_val>\n            <right_val>0.2988890111446381</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 10 3 4 -1.</_>\n                <_>13 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0243391301482916</threshold>\n            <left_val>0.2771185040473938</left_val>\n            <right_val>0.5108863115310669</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 3 4 -1.</_>\n                <_>4 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9435202274471521e-004</threshold>\n            <left_val>0.5580651760101318</left_val>\n            <right_val>0.3120341897010803</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 3 -1.</_>\n                <_>9 5 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2971509024500847e-003</threshold>\n            <left_val>0.3330250084400177</left_val>\n            <right_val>0.5679075717926025</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 8 -1.</_>\n                <_>7 10 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7801829166710377e-003</threshold>\n            <left_val>0.2990534901618958</left_val>\n            <right_val>0.5344808101654053</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 11 20 6 -1.</_>\n                <_>0 14 20 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1342066973447800</threshold>\n            <left_val>0.1463858932256699</left_val>\n            <right_val>0.5392568111419678</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 4 6 -1.</_>\n                <_>4 13 2 3 2.</_>\n                <_>6 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.5224548345431685e-004</threshold>\n            <left_val>0.3746953904628754</left_val>\n            <right_val>0.5692734718322754</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>10 0 4 6 2.</_>\n                <_>6 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0405455417931080</threshold>\n            <left_val>0.2754747867584229</left_val>\n            <right_val>0.5484297871589661</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 15 2 -1.</_>\n                <_>2 1 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2572970008477569e-003</threshold>\n            <left_val>0.3744584023952484</left_val>\n            <right_val>0.5756075978279114</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4249948374927044e-003</threshold>\n            <left_val>0.7513859272003174</left_val>\n            <right_val>0.4728231132030487</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 1 2 -1.</_>\n                <_>3 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0908129196614027e-004</threshold>\n            <left_val>0.5404896736145020</left_val>\n            <right_val>0.2932321131229401</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2808450264856219e-003</threshold>\n            <left_val>0.6169779896736145</left_val>\n            <right_val>0.4273349046707153</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 3 1 -1.</_>\n                <_>8 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8348860321566463e-003</threshold>\n            <left_val>0.2048496007919312</left_val>\n            <right_val>0.5206472277641296</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 7 3 6 -1.</_>\n                <_>17 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0274848695844412</threshold>\n            <left_val>0.5252984762191773</left_val>\n            <right_val>0.1675522029399872</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 3 2 -1.</_>\n                <_>8 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2372419480234385e-003</threshold>\n            <left_val>0.5267782807350159</left_val>\n            <right_val>0.2777658104896545</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 5 3 -1.</_>\n                <_>11 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8635291904211044e-003</threshold>\n            <left_val>0.6954557895660400</left_val>\n            <right_val>0.4812048971652985</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 5 3 -1.</_>\n                <_>4 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1753971017897129e-003</threshold>\n            <left_val>0.4291887879371643</left_val>\n            <right_val>0.6349195837974548</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 3 1 2 -1.</_>\n                <_>19 4 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7098189564421773e-003</threshold>\n            <left_val>0.2930536866188049</left_val>\n            <right_val>0.5361248850822449</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 4 3 -1.</_>\n                <_>5 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5328548662364483e-003</threshold>\n            <left_val>0.4495325088500977</left_val>\n            <right_val>0.7409694194793701</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 7 3 6 -1.</_>\n                <_>17 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.5372907817363739e-003</threshold>\n            <left_val>0.3149119913578033</left_val>\n            <right_val>0.5416501760482788</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 3 6 -1.</_>\n                <_>0 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0253109894692898</threshold>\n            <left_val>0.5121892094612122</left_val>\n            <right_val>0.1311707943677902</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 9 -1.</_>\n                <_>14 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0364609695971012</threshold>\n            <left_val>0.5175911784172058</left_val>\n            <right_val>0.2591339945793152</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 5 6 -1.</_>\n                <_>0 6 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0208543296903372</threshold>\n            <left_val>0.5137140154838562</left_val>\n            <right_val>0.1582316011190414</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 6 2 -1.</_>\n                <_>12 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7207747856155038e-004</threshold>\n            <left_val>0.5574309825897217</left_val>\n            <right_val>0.4398978948593140</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 6 2 -1.</_>\n                <_>6 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5227000403683633e-005</threshold>\n            <left_val>0.5548940896987915</left_val>\n            <right_val>0.3708069920539856</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 4 6 -1.</_>\n                <_>8 3 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.4316509310156107e-004</threshold>\n            <left_val>0.3387419879436493</left_val>\n            <right_val>0.5554211139678955</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6037859972566366e-003</threshold>\n            <left_val>0.5358061790466309</left_val>\n            <right_val>0.3411171138286591</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 3 -1.</_>\n                <_>6 7 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8057891912758350e-003</threshold>\n            <left_val>0.6125202775001526</left_val>\n            <right_val>0.4345862865447998</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 5 9 -1.</_>\n                <_>0 4 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0470216609537601</threshold>\n            <left_val>0.2358165979385376</left_val>\n            <right_val>0.5193738937377930</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 15 -1.</_>\n                <_>16 0 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0369541086256504</threshold>\n            <left_val>0.7323111295700073</left_val>\n            <right_val>0.4760943949222565</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 3 2 -1.</_>\n                <_>1 11 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0439479956403375e-003</threshold>\n            <left_val>0.5419455170631409</left_val>\n            <right_val>0.3411330878734589</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 1 10 -1.</_>\n                <_>14 9 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1050689974799752e-004</threshold>\n            <left_val>0.2821694016456604</left_val>\n            <right_val>0.5554947257041931</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 12 -1.</_>\n                <_>2 1 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0808315873146057</threshold>\n            <left_val>0.9129930138587952</left_val>\n            <right_val>0.4697434902191162</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 4 2 -1.</_>\n                <_>11 11 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6579059087671340e-004</threshold>\n            <left_val>0.6022670269012451</left_val>\n            <right_val>0.3978292942047119</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 4 2 -1.</_>\n                <_>7 11 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2545920617412776e-004</threshold>\n            <left_val>0.5613213181495667</left_val>\n            <right_val>0.3845539987087250</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 15 5 -1.</_>\n                <_>8 8 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0687864869832993</threshold>\n            <left_val>0.2261611968278885</left_val>\n            <right_val>0.5300496816635132</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 10 -1.</_>\n                <_>3 0 3 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0124157899990678</threshold>\n            <left_val>0.4075691998004913</left_val>\n            <right_val>0.5828812122344971</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 3 2 -1.</_>\n                <_>12 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7174817882478237e-003</threshold>\n            <left_val>0.2827253937721252</left_val>\n            <right_val>0.5267757773399353</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 3 8 -1.</_>\n                <_>8 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0381368584930897</threshold>\n            <left_val>0.5074741244316101</left_val>\n            <right_val>0.1023615971207619</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 5 3 -1.</_>\n                <_>8 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8168049175292253e-003</threshold>\n            <left_val>0.6169006824493408</left_val>\n            <right_val>0.4359692931175232</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 4 3 -1.</_>\n                <_>7 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1303603947162628e-003</threshold>\n            <left_val>0.4524433016777039</left_val>\n            <right_val>0.7606095075607300</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 3 2 -1.</_>\n                <_>12 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0056019574403763e-003</threshold>\n            <left_val>0.5240408778190613</left_val>\n            <right_val>0.1859712004661560</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 14 4 -1.</_>\n                <_>3 15 7 2 2.</_>\n                <_>10 17 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0191393196582794</threshold>\n            <left_val>0.5209379196166992</left_val>\n            <right_val>0.2332071959972382</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 16 4 -1.</_>\n                <_>10 2 8 2 2.</_>\n                <_>2 4 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0164457596838474</threshold>\n            <left_val>0.5450702905654907</left_val>\n            <right_val>0.3264234960079193</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 6 12 -1.</_>\n                <_>3 8 3 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0373568907380104</threshold>\n            <left_val>0.6999046802520752</left_val>\n            <right_val>0.4533241987228394</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 2 -1.</_>\n                <_>5 7 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0197279006242752</threshold>\n            <left_val>0.2653664946556091</left_val>\n            <right_val>0.5412809848785400</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 5 -1.</_>\n                <_>10 7 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6972579807043076e-003</threshold>\n            <left_val>0.4480566084384918</left_val>\n            <right_val>0.7138652205467224</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4457528535276651e-004</threshold>\n            <left_val>0.4231350123882294</left_val>\n            <right_val>0.5471320152282715</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 8 2 -1.</_>\n                <_>0 14 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1790640419349074e-003</threshold>\n            <left_val>0.5341702103614807</left_val>\n            <right_val>0.3130455017089844</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0349806100130081</threshold>\n            <left_val>0.5118659734725952</left_val>\n            <right_val>0.3430530130863190</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 6 4 -1.</_>\n                <_>1 7 3 2 2.</_>\n                <_>4 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6859792675822973e-004</threshold>\n            <left_val>0.3532187044620514</left_val>\n            <right_val>0.5468639731407166</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 1 12 -1.</_>\n                <_>12 12 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0113406497985125</threshold>\n            <left_val>0.2842353880405426</left_val>\n            <right_val>0.5348700881004334</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>10 5 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6228108480572701e-003</threshold>\n            <left_val>0.6883640289306641</left_val>\n            <right_val>0.4492664933204651</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 3 -1.</_>\n                <_>14 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0160330981016159e-003</threshold>\n            <left_val>0.1709893941879273</left_val>\n            <right_val>0.5224308967590332</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 3 -1.</_>\n                <_>4 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4206819469109178e-003</threshold>\n            <left_val>0.5290846228599548</left_val>\n            <right_val>0.2993383109569550</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7801711112260818e-003</threshold>\n            <left_val>0.6498854160308838</left_val>\n            <right_val>0.4460499882698059</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 2 4 -1.</_>\n                <_>5 2 1 2 2.</_>\n                <_>6 4 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4747589593753219e-003</threshold>\n            <left_val>0.3260438144207001</left_val>\n            <right_val>0.5388113260269165</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 11 3 -1.</_>\n                <_>5 6 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0238303393125534</threshold>\n            <left_val>0.7528941035270691</left_val>\n            <right_val>0.4801219999790192</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 4 12 -1.</_>\n                <_>7 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9369790144264698e-003</threshold>\n            <left_val>0.5335165858268738</left_val>\n            <right_val>0.3261427879333496</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 13 8 5 -1.</_>\n                <_>12 13 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2806255668401718e-003</threshold>\n            <left_val>0.4580394029617310</left_val>\n            <right_val>0.5737829804420471</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 1 12 -1.</_>\n                <_>7 12 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0104395002126694</threshold>\n            <left_val>0.2592320144176483</left_val>\n            <right_val>0.5233827829360962</right_val></_></_></trees>\n      <stage_threshold>34.5541114807128910</stage_threshold>\n      <parent>8</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 10 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 6 3 -1.</_>\n                <_>4 2 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2006587870419025e-003</threshold>\n            <left_val>0.3258886039257050</left_val>\n            <right_val>0.6849808096885681</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 10 -1.</_>\n                <_>12 5 3 5 2.</_>\n                <_>9 10 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8593589086085558e-003</threshold>\n            <left_val>0.5838881134986877</left_val>\n            <right_val>0.2537829875946045</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 8 12 -1.</_>\n                <_>5 5 4 6 2.</_>\n                <_>9 11 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8580528022721410e-004</threshold>\n            <left_val>0.5708081722259522</left_val>\n            <right_val>0.2812424004077911</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 20 6 -1.</_>\n                <_>0 9 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9580191522836685e-003</threshold>\n            <left_val>0.2501051127910614</left_val>\n            <right_val>0.5544260740280151</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 2 2 -1.</_>\n                <_>4 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2124150525778532e-003</threshold>\n            <left_val>0.2385368049144745</left_val>\n            <right_val>0.5433350205421448</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 18 12 2 -1.</_>\n                <_>8 18 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9426132142543793e-003</threshold>\n            <left_val>0.3955070972442627</left_val>\n            <right_val>0.6220757961273193</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 4 16 -1.</_>\n                <_>7 12 4 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4630590341985226e-003</threshold>\n            <left_val>0.5639708042144775</left_val>\n            <right_val>0.2992357909679413</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 7 8 -1.</_>\n                <_>7 10 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0396599583327770e-003</threshold>\n            <left_val>0.2186512947082520</left_val>\n            <right_val>0.5411676764488220</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 3 1 -1.</_>\n                <_>7 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2988339876756072e-003</threshold>\n            <left_val>0.2350706011056900</left_val>\n            <right_val>0.5364584922790527</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 15 2 4 -1.</_>\n                <_>11 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2299369447864592e-004</threshold>\n            <left_val>0.3804112970829010</left_val>\n            <right_val>0.5729606151580811</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 5 4 8 -1.</_>\n                <_>3 9 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4654280385002494e-003</threshold>\n            <left_val>0.2510167956352234</left_val>\n            <right_val>0.5258268713951111</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 12 -1.</_>\n                <_>7 7 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1210042117163539e-004</threshold>\n            <left_val>0.5992823839187622</left_val>\n            <right_val>0.3851158916950226</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 6 2 -1.</_>\n                <_>6 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3836020370945334e-003</threshold>\n            <left_val>0.5681396126747131</left_val>\n            <right_val>0.3636586964130402</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 4 4 6 -1.</_>\n                <_>16 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0279364492744207</threshold>\n            <left_val>0.1491317003965378</left_val>\n            <right_val>0.5377560257911682</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 3 5 2 -1.</_>\n                <_>3 4 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6919551095925272e-004</threshold>\n            <left_val>0.3692429959774017</left_val>\n            <right_val>0.5572484731674194</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9829659983515739e-003</threshold>\n            <left_val>0.6758509278297424</left_val>\n            <right_val>0.4532504081726074</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 4 2 -1.</_>\n                <_>2 17 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8815309740602970e-003</threshold>\n            <left_val>0.5368022918701172</left_val>\n            <right_val>0.2932539880275726</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 6 -1.</_>\n                <_>10 13 3 3 2.</_>\n                <_>7 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0190675500780344</threshold>\n            <left_val>0.1649377048015595</left_val>\n            <right_val>0.5330067276954651</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 4 -1.</_>\n                <_>8 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6906559728085995e-003</threshold>\n            <left_val>0.1963925957679749</left_val>\n            <right_val>0.5119361877441406</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9777139686048031e-003</threshold>\n            <left_val>0.4671171903610230</left_val>\n            <right_val>0.7008398175239563</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 4 6 -1.</_>\n                <_>0 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0333031304180622</threshold>\n            <left_val>0.1155416965484619</left_val>\n            <right_val>0.5104162096977234</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 12 3 -1.</_>\n                <_>9 6 4 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0907441079616547</threshold>\n            <left_val>0.5149660110473633</left_val>\n            <right_val>0.1306173056364059</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 14 -1.</_>\n                <_>9 6 2 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3555898638442159e-004</threshold>\n            <left_val>0.3605481088161469</left_val>\n            <right_val>0.5439859032630920</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0149016501381993</threshold>\n            <left_val>0.4886212050914764</left_val>\n            <right_val>0.7687569856643677</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 2 4 -1.</_>\n                <_>6 14 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1594118596985936e-004</threshold>\n            <left_val>0.5356813073158264</left_val>\n            <right_val>0.3240939080715179</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 7 6 -1.</_>\n                <_>10 14 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0506709888577461</threshold>\n            <left_val>0.1848621964454651</left_val>\n            <right_val>0.5230404138565064</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 15 2 -1.</_>\n                <_>1 1 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8665749859064817e-004</threshold>\n            <left_val>0.3840579986572266</left_val>\n            <right_val>0.5517945885658264</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 6 -1.</_>\n                <_>14 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3712432533502579e-003</threshold>\n            <left_val>0.4288564026355743</left_val>\n            <right_val>0.6131753921508789</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 3 1 -1.</_>\n                <_>6 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2953069526702166e-003</threshold>\n            <left_val>0.2913674116134644</left_val>\n            <right_val>0.5280737876892090</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 6 -1.</_>\n                <_>14 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0419416800141335</threshold>\n            <left_val>0.7554799914360046</left_val>\n            <right_val>0.4856030941009522</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 20 10 -1.</_>\n                <_>0 8 20 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0235293805599213</threshold>\n            <left_val>0.2838279902935028</left_val>\n            <right_val>0.5256081223487854</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 6 -1.</_>\n                <_>14 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0408574491739273</threshold>\n            <left_val>0.4870935082435608</left_val>\n            <right_val>0.6277297139167786</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 6 -1.</_>\n                <_>3 0 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0254068691283464</threshold>\n            <left_val>0.7099707722663879</left_val>\n            <right_val>0.4575029015541077</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 15 1 2 -1.</_>\n                <_>19 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1415440500713885e-004</threshold>\n            <left_val>0.4030886888504028</left_val>\n            <right_val>0.5469412207603455</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 4 8 -1.</_>\n                <_>2 2 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0218241196125746</threshold>\n            <left_val>0.4502024054527283</left_val>\n            <right_val>0.6768701076507568</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 18 4 -1.</_>\n                <_>11 1 9 2 2.</_>\n                <_>2 3 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0141140399500728</threshold>\n            <left_val>0.5442860722541809</left_val>\n            <right_val>0.3791700005531311</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 1 2 -1.</_>\n                <_>8 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7214590671937913e-005</threshold>\n            <left_val>0.4200463891029358</left_val>\n            <right_val>0.5873476266860962</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 10 6 -1.</_>\n                <_>10 2 5 3 2.</_>\n                <_>5 5 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9417638480663300e-003</threshold>\n            <left_val>0.3792561888694763</left_val>\n            <right_val>0.5585265755653381</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 4 -1.</_>\n                <_>10 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2144409641623497e-003</threshold>\n            <left_val>0.7253103852272034</left_val>\n            <right_val>0.4603548943996429</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5817339774221182e-003</threshold>\n            <left_val>0.4693301916122437</left_val>\n            <right_val>0.5900238752365112</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 8 -1.</_>\n                <_>8 5 4 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1340931951999664</threshold>\n            <left_val>0.5149213075637817</left_val>\n            <right_val>0.1808844953775406</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 15 4 3 -1.</_>\n                <_>15 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2962710354477167e-003</threshold>\n            <left_val>0.5399743914604187</left_val>\n            <right_val>0.3717867136001587</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 1 -1.</_>\n                <_>9 18 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1575849968940020e-003</threshold>\n            <left_val>0.2408495992422104</left_val>\n            <right_val>0.5148863792419434</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 4 3 -1.</_>\n                <_>9 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9196188338100910e-003</threshold>\n            <left_val>0.6573588252067566</left_val>\n            <right_val>0.4738740026950836</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 4 3 -1.</_>\n                <_>7 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6267469618469477e-003</threshold>\n            <left_val>0.4192821979522705</left_val>\n            <right_val>0.6303114295005798</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 15 1 2 -1.</_>\n                <_>19 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3413388882763684e-004</threshold>\n            <left_val>0.5540298223495483</left_val>\n            <right_val>0.3702101111412048</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 8 4 -1.</_>\n                <_>0 17 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0266980808228254</threshold>\n            <left_val>0.1710917949676514</left_val>\n            <right_val>0.5101410746574402</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 6 4 -1.</_>\n                <_>11 3 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0305618792772293</threshold>\n            <left_val>0.1904218047857285</left_val>\n            <right_val>0.5168793797492981</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8511548880487680e-003</threshold>\n            <left_val>0.4447506964206696</left_val>\n            <right_val>0.6313853859901428</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 14 6 -1.</_>\n                <_>3 16 14 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0362114794552326</threshold>\n            <left_val>0.2490727007389069</left_val>\n            <right_val>0.5377349257469177</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 6 6 -1.</_>\n                <_>6 6 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4115189444273710e-003</threshold>\n            <left_val>0.5381243228912354</left_val>\n            <right_val>0.3664236962795258</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 10 6 -1.</_>\n                <_>5 14 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7253201743587852e-004</threshold>\n            <left_val>0.5530232191085815</left_val>\n            <right_val>0.3541550040245056</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 10 3 4 -1.</_>\n                <_>4 10 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9481729143299162e-004</threshold>\n            <left_val>0.4132699072360992</left_val>\n            <right_val>0.5667243003845215</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 2 -1.</_>\n                <_>13 9 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2334560789167881e-003</threshold>\n            <left_val>0.0987872332334518</left_val>\n            <right_val>0.5198668837547302</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 6 4 -1.</_>\n                <_>7 3 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0262747295200825</threshold>\n            <left_val>0.0911274924874306</left_val>\n            <right_val>0.5028107166290283</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3212260827422142e-003</threshold>\n            <left_val>0.4726648926734924</left_val>\n            <right_val>0.6222720742225647</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 2 3 -1.</_>\n                <_>2 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1129058226943016e-003</threshold>\n            <left_val>0.2157457023859024</left_val>\n            <right_val>0.5137804746627808</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 3 12 -1.</_>\n                <_>9 12 3 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2457809429615736e-003</threshold>\n            <left_val>0.5410770773887634</left_val>\n            <right_val>0.3721776902675629</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 4 6 -1.</_>\n                <_>3 14 2 3 2.</_>\n                <_>5 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0163597092032433</threshold>\n            <left_val>0.7787874937057495</left_val>\n            <right_val>0.4685291945934296</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 15 2 2 -1.</_>\n                <_>16 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2166109303943813e-004</threshold>\n            <left_val>0.5478987097740173</left_val>\n            <right_val>0.4240373969078064</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 2 2 -1.</_>\n                <_>2 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4452440710738301e-004</threshold>\n            <left_val>0.5330560803413391</left_val>\n            <right_val>0.3501324951648712</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8909732401371002e-003</threshold>\n            <left_val>0.6923521161079407</left_val>\n            <right_val>0.4726569056510925</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 20 1 -1.</_>\n                <_>10 7 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0483362115919590</threshold>\n            <left_val>0.5055900216102600</left_val>\n            <right_val>0.0757492035627365</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 8 3 -1.</_>\n                <_>7 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5178127735853195e-004</threshold>\n            <left_val>0.3783741891384125</left_val>\n            <right_val>0.5538573861122131</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>9 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4953910615295172e-003</threshold>\n            <left_val>0.3081651031970978</left_val>\n            <right_val>0.5359612107276917</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2385010961443186e-003</threshold>\n            <left_val>0.6633958816528320</left_val>\n            <right_val>0.4649342894554138</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7988430336117744e-003</threshold>\n            <left_val>0.6596844792366028</left_val>\n            <right_val>0.4347187876701355</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 1 3 5 -1.</_>\n                <_>12 1 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7860915809869766e-003</threshold>\n            <left_val>0.5231832861900330</left_val>\n            <right_val>0.2315579950809479</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 2 3 6 -1.</_>\n                <_>7 2 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6715380847454071e-003</threshold>\n            <left_val>0.5204250216484070</left_val>\n            <right_val>0.2977376878261566</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 14 6 5 -1.</_>\n                <_>14 14 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0353364497423172</threshold>\n            <left_val>0.7238878011703491</left_val>\n            <right_val>0.4861505031585693</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 2 -1.</_>\n                <_>9 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9189240457490087e-004</threshold>\n            <left_val>0.3105022013187408</left_val>\n            <right_val>0.5229824781417847</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 1 3 -1.</_>\n                <_>10 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3946109469980001e-003</threshold>\n            <left_val>0.3138968050479889</left_val>\n            <right_val>0.5210173726081848</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 2 2 -1.</_>\n                <_>6 6 1 1 2.</_>\n                <_>7 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8569283727556467e-004</threshold>\n            <left_val>0.4536580145359039</left_val>\n            <right_val>0.6585097908973694</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 18 4 -1.</_>\n                <_>11 11 9 2 2.</_>\n                <_>2 13 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0501631014049053</threshold>\n            <left_val>0.1804454028606415</left_val>\n            <right_val>0.5198916792869568</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 2 2 -1.</_>\n                <_>6 6 1 1 2.</_>\n                <_>7 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2367259953171015e-003</threshold>\n            <left_val>0.7255702018737793</left_val>\n            <right_val>0.4651359021663666</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 20 2 -1.</_>\n                <_>0 16 20 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4326287722215056e-004</threshold>\n            <left_val>0.4412921071052551</left_val>\n            <right_val>0.5898545980453491</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 2 3 -1.</_>\n                <_>4 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3485182151198387e-004</threshold>\n            <left_val>0.3500052988529205</left_val>\n            <right_val>0.5366017818450928</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0174979399889708</threshold>\n            <left_val>0.4912194907665253</left_val>\n            <right_val>0.8315284848213196</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 3 -1.</_>\n                <_>8 8 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5200000489130616e-003</threshold>\n            <left_val>0.3570275902748108</left_val>\n            <right_val>0.5370560288429260</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 3 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8003940870985389e-004</threshold>\n            <left_val>0.4353772103786469</left_val>\n            <right_val>0.5967335104942322</right_val></_></_></trees>\n      <stage_threshold>39.1072883605957030</stage_threshold>\n      <parent>9</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 11 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 10 4 -1.</_>\n                <_>5 6 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9945552647113800e-003</threshold>\n            <left_val>0.6162583231925964</left_val>\n            <right_val>0.3054533004760742</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 6 4 -1.</_>\n                <_>12 7 3 2 2.</_>\n                <_>9 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1085229925811291e-003</threshold>\n            <left_val>0.5818294882774353</left_val>\n            <right_val>0.3155578076839447</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 3 6 -1.</_>\n                <_>4 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0364380432292819e-003</threshold>\n            <left_val>0.2552052140235901</left_val>\n            <right_val>0.5692911744117737</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 15 4 4 -1.</_>\n                <_>13 15 2 2 2.</_>\n                <_>11 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8211311008781195e-004</threshold>\n            <left_val>0.3685089945793152</left_val>\n            <right_val>0.5934931039810181</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 4 2 -1.</_>\n                <_>7 9 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8057340104132891e-004</threshold>\n            <left_val>0.2332392036914825</left_val>\n            <right_val>0.5474792122840881</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 1 4 3 -1.</_>\n                <_>13 1 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6068789884448051e-004</threshold>\n            <left_val>0.3257457017898560</left_val>\n            <right_val>0.5667545795440674</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 4 4 -1.</_>\n                <_>5 15 2 2 2.</_>\n                <_>7 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1607372006401420e-004</threshold>\n            <left_val>0.3744716942310333</left_val>\n            <right_val>0.5845472812652588</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 4 7 -1.</_>\n                <_>9 5 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5007521556690335e-004</threshold>\n            <left_val>0.3420371115207672</left_val>\n            <right_val>0.5522807240486145</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 8 3 -1.</_>\n                <_>9 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8607829697430134e-003</threshold>\n            <left_val>0.2804419994354248</left_val>\n            <right_val>0.5375424027442932</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5033970121294260e-003</threshold>\n            <left_val>0.2579050958156586</left_val>\n            <right_val>0.5498952269554138</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 5 3 -1.</_>\n                <_>7 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3478909861296415e-003</threshold>\n            <left_val>0.4175156056880951</left_val>\n            <right_val>0.6313710808753967</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 4 3 -1.</_>\n                <_>11 10 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8880240279249847e-004</threshold>\n            <left_val>0.5865169763565064</left_val>\n            <right_val>0.4052666127681732</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 10 -1.</_>\n                <_>6 14 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9405477046966553e-003</threshold>\n            <left_val>0.5211141109466553</left_val>\n            <right_val>0.2318654060363770</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 6 2 -1.</_>\n                <_>10 11 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0193277392536402</threshold>\n            <left_val>0.2753432989120483</left_val>\n            <right_val>0.5241525769233704</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 6 2 -1.</_>\n                <_>7 11 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0202060113660991e-004</threshold>\n            <left_val>0.5722978711128235</left_val>\n            <right_val>0.3677195906639099</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 8 1 -1.</_>\n                <_>11 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1179069299250841e-003</threshold>\n            <left_val>0.4466108083724976</left_val>\n            <right_val>0.5542430877685547</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 3 2 -1.</_>\n                <_>7 3 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7743760254234076e-003</threshold>\n            <left_val>0.2813253104686737</left_val>\n            <right_val>0.5300959944725037</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 6 5 -1.</_>\n                <_>14 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2234458960592747e-003</threshold>\n            <left_val>0.4399709999561310</left_val>\n            <right_val>0.5795428156852722</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 2 12 -1.</_>\n                <_>7 11 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0143752200528979</threshold>\n            <left_val>0.2981117963790894</left_val>\n            <right_val>0.5292059183120728</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0153491804376245</threshold>\n            <left_val>0.7705215215682983</left_val>\n            <right_val>0.4748171865940094</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 2 3 -1.</_>\n                <_>5 1 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5152279956964776e-005</threshold>\n            <left_val>0.3718844056129456</left_val>\n            <right_val>0.5576897263526917</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 6 -1.</_>\n                <_>18 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1293919831514359e-003</threshold>\n            <left_val>0.3615196049213409</left_val>\n            <right_val>0.5286766886711121</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 6 -1.</_>\n                <_>0 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2512159775942564e-003</threshold>\n            <left_val>0.5364704728126526</left_val>\n            <right_val>0.3486298024654388</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9696918576955795e-003</threshold>\n            <left_val>0.6927651762962341</left_val>\n            <right_val>0.4676836133003235</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 4 3 -1.</_>\n                <_>7 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128290103748441</threshold>\n            <left_val>0.7712153792381287</left_val>\n            <right_val>0.4660735130310059</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 0 2 6 -1.</_>\n                <_>18 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3660065904259682e-003</threshold>\n            <left_val>0.3374983966350555</left_val>\n            <right_val>0.5351287722587585</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 6 -1.</_>\n                <_>0 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2452319283038378e-003</threshold>\n            <left_val>0.5325189828872681</left_val>\n            <right_val>0.3289610147476196</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 6 3 -1.</_>\n                <_>8 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0117235602810979</threshold>\n            <left_val>0.6837652921676636</left_val>\n            <right_val>0.4754300117492676</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 2 4 -1.</_>\n                <_>8 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9257940695970319e-005</threshold>\n            <left_val>0.3572087883949280</left_val>\n            <right_val>0.5360502004623413</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 4 6 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2244219508138485e-005</threshold>\n            <left_val>0.5541427135467529</left_val>\n            <right_val>0.3552064001560211</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 2 2 -1.</_>\n                <_>7 4 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0881509669125080e-003</threshold>\n            <left_val>0.5070844292640686</left_val>\n            <right_val>0.1256462037563324</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 14 4 -1.</_>\n                <_>10 14 7 2 2.</_>\n                <_>3 16 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0274296794086695</threshold>\n            <left_val>0.5269560217857361</left_val>\n            <right_val>0.1625818014144898</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 6 2 -1.</_>\n                <_>6 15 3 1 2.</_>\n                <_>9 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4142867922782898e-003</threshold>\n            <left_val>0.7145588994026184</left_val>\n            <right_val>0.4584197103977203</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 6 2 -1.</_>\n                <_>14 16 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3479959238320589e-003</threshold>\n            <left_val>0.5398612022399902</left_val>\n            <right_val>0.3494696915149689</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 12 8 -1.</_>\n                <_>2 16 12 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0826354920864105</threshold>\n            <left_val>0.2439192980527878</left_val>\n            <right_val>0.5160226225852966</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 7 2 -1.</_>\n                <_>7 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0261740535497665e-003</threshold>\n            <left_val>0.3886891901493073</left_val>\n            <right_val>0.5767908096313477</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 18 2 -1.</_>\n                <_>0 3 18 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6307090409100056e-003</threshold>\n            <left_val>0.3389458060264587</left_val>\n            <right_val>0.5347700715065002</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 5 -1.</_>\n                <_>9 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4546680506318808e-003</threshold>\n            <left_val>0.4601413905620575</left_val>\n            <right_val>0.6387246847152710</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 3 8 -1.</_>\n                <_>8 5 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9476519972085953e-004</threshold>\n            <left_val>0.5769879221916199</left_val>\n            <right_val>0.4120396077632904</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 3 4 -1.</_>\n                <_>10 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0154091902077198</threshold>\n            <left_val>0.4878709018230438</left_val>\n            <right_val>0.7089822292327881</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 3 2 -1.</_>\n                <_>4 14 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1784400558099151e-003</threshold>\n            <left_val>0.5263553261756897</left_val>\n            <right_val>0.2895244956016541</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 3 -1.</_>\n                <_>11 4 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0277019198983908</threshold>\n            <left_val>0.1498828977346420</left_val>\n            <right_val>0.5219606757164002</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 3 -1.</_>\n                <_>7 4 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0295053999871016</threshold>\n            <left_val>0.0248933192342520</left_val>\n            <right_val>0.4999816119670868</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 11 5 2 -1.</_>\n                <_>14 12 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5159430010244250e-004</threshold>\n            <left_val>0.5464622974395752</left_val>\n            <right_val>0.4029662907123566</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 6 9 -1.</_>\n                <_>3 2 2 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1772639639675617e-003</threshold>\n            <left_val>0.4271056950092316</left_val>\n            <right_val>0.5866296887397766</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 6 13 -1.</_>\n                <_>14 6 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0741820484399796</threshold>\n            <left_val>0.6874179244041443</left_val>\n            <right_val>0.4919027984142304</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 14 8 -1.</_>\n                <_>3 6 7 4 2.</_>\n                <_>10 10 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0172541607171297</threshold>\n            <left_val>0.3370676040649414</left_val>\n            <right_val>0.5348739027976990</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 11 -1.</_>\n                <_>16 0 2 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0148515598848462</threshold>\n            <left_val>0.4626792967319489</left_val>\n            <right_val>0.6129904985427856</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 12 12 -1.</_>\n                <_>3 4 6 6 2.</_>\n                <_>9 10 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0100020002573729</threshold>\n            <left_val>0.5346122980117798</left_val>\n            <right_val>0.3423453867435455</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 5 3 -1.</_>\n                <_>11 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0138120744377375e-003</threshold>\n            <left_val>0.4643830060958862</left_val>\n            <right_val>0.5824304223060608</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 4 2 -1.</_>\n                <_>4 12 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5135470312088728e-003</threshold>\n            <left_val>0.5196396112442017</left_val>\n            <right_val>0.2856149971485138</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 2 2 -1.</_>\n                <_>10 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1381431035697460e-003</threshold>\n            <left_val>0.4838162958621979</left_val>\n            <right_val>0.5958529710769653</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 2 -1.</_>\n                <_>9 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1450440660119057e-003</threshold>\n            <left_val>0.8920302987098694</left_val>\n            <right_val>0.4741412103176117</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4736708514392376e-003</threshold>\n            <left_val>0.2033942937850952</left_val>\n            <right_val>0.5337278842926025</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 3 3 -1.</_>\n                <_>5 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9628470763564110e-003</threshold>\n            <left_val>0.4571633934974670</left_val>\n            <right_val>0.6725863218307495</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 3 3 -1.</_>\n                <_>11 0 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4260450415313244e-003</threshold>\n            <left_val>0.5271108150482178</left_val>\n            <right_val>0.2845670878887177</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 6 2 -1.</_>\n                <_>5 6 3 1 2.</_>\n                <_>8 7 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9611460417509079e-004</threshold>\n            <left_val>0.4138312935829163</left_val>\n            <right_val>0.5718597769737244</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 16 4 3 -1.</_>\n                <_>12 17 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3728788197040558e-003</threshold>\n            <left_val>0.5225151181221008</left_val>\n            <right_val>0.2804847061634064</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 3 2 -1.</_>\n                <_>3 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0500897234305739e-004</threshold>\n            <left_val>0.5236768722534180</left_val>\n            <right_val>0.3314523994922638</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 2 -1.</_>\n                <_>9 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6792551185935736e-004</threshold>\n            <left_val>0.4531059861183167</left_val>\n            <right_val>0.6276971101760864</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 16 4 -1.</_>\n                <_>1 11 8 2 2.</_>\n                <_>9 13 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0246443394571543</threshold>\n            <left_val>0.5130851864814758</left_val>\n            <right_val>0.2017143964767456</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0102904504165053</threshold>\n            <left_val>0.7786595225334168</left_val>\n            <right_val>0.4876641035079956</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 5 3 -1.</_>\n                <_>4 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0629419013857841e-003</threshold>\n            <left_val>0.4288598895072937</left_val>\n            <right_val>0.5881264209747315</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 16 4 3 -1.</_>\n                <_>12 17 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0519481301307678e-003</threshold>\n            <left_val>0.3523977994918823</left_val>\n            <right_val>0.5286008715629578</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7692620903253555e-003</threshold>\n            <left_val>0.6841086149215698</left_val>\n            <right_val>0.4588094055652618</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 2 2 -1.</_>\n                <_>9 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5789941214025021e-004</threshold>\n            <left_val>0.3565520048141480</left_val>\n            <right_val>0.5485978126525879</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 4 2 -1.</_>\n                <_>8 10 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5918837683275342e-004</threshold>\n            <left_val>0.3368793129920960</left_val>\n            <right_val>0.5254197120666504</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 3 -1.</_>\n                <_>8 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7737259622663260e-003</threshold>\n            <left_val>0.3422161042690277</left_val>\n            <right_val>0.5454015135765076</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 6 3 -1.</_>\n                <_>2 13 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5610467940568924e-003</threshold>\n            <left_val>0.6533612012863159</left_val>\n            <right_val>0.4485856890678406</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 14 3 2 -1.</_>\n                <_>16 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7277270089834929e-003</threshold>\n            <left_val>0.5307580232620239</left_val>\n            <right_val>0.3925352990627289</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 18 2 -1.</_>\n                <_>7 18 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0281996093690395</threshold>\n            <left_val>0.6857458949089050</left_val>\n            <right_val>0.4588584005832672</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 14 3 2 -1.</_>\n                <_>16 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7781109781935811e-003</threshold>\n            <left_val>0.4037851095199585</left_val>\n            <right_val>0.5369856953620911</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 3 2 -1.</_>\n                <_>1 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3177141449414194e-004</threshold>\n            <left_val>0.5399798750877380</left_val>\n            <right_val>0.3705750107765198</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 3 -1.</_>\n                <_>7 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6385399978607893e-003</threshold>\n            <left_val>0.4665437042713165</left_val>\n            <right_val>0.6452730894088745</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 14 8 3 -1.</_>\n                <_>5 15 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1183069329708815e-003</threshold>\n            <left_val>0.5914781093597412</left_val>\n            <right_val>0.4064677059650421</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 14 -1.</_>\n                <_>10 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0147732896730304</threshold>\n            <left_val>0.3642038106918335</left_val>\n            <right_val>0.5294762849807739</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 14 -1.</_>\n                <_>8 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0168154407292604</threshold>\n            <left_val>0.2664231956005096</left_val>\n            <right_val>0.5144972801208496</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 3 -1.</_>\n                <_>13 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3370140269398689e-003</threshold>\n            <left_val>0.6779531240463257</left_val>\n            <right_val>0.4852097928524017</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 6 1 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4560048991115764e-005</threshold>\n            <left_val>0.5613964796066284</left_val>\n            <right_val>0.4153054058551788</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 3 -1.</_>\n                <_>9 13 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0240620467811823e-003</threshold>\n            <left_val>0.5964478254318237</left_val>\n            <right_val>0.4566304087638855</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 3 -1.</_>\n                <_>8 0 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3161689750850201e-003</threshold>\n            <left_val>0.2976115047931671</left_val>\n            <right_val>0.5188159942626953</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 16 18 -1.</_>\n                <_>4 9 16 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.5321757197380066</threshold>\n            <left_val>0.5187839269638062</left_val>\n            <right_val>0.2202631980180740</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 16 14 -1.</_>\n                <_>1 8 16 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1664305031299591</threshold>\n            <left_val>0.1866022944450378</left_val>\n            <right_val>0.5060343146324158</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 9 15 4 -1.</_>\n                <_>8 9 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1125352978706360</threshold>\n            <left_val>0.5212125182151794</left_val>\n            <right_val>0.1185022965073586</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 7 3 -1.</_>\n                <_>6 13 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3046864494681358e-003</threshold>\n            <left_val>0.4589937031269074</left_val>\n            <right_val>0.6826149225234985</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 2 3 -1.</_>\n                <_>14 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6255099587142467e-003</threshold>\n            <left_val>0.3079940974712372</left_val>\n            <right_val>0.5225008726119995</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 16 14 -1.</_>\n                <_>2 3 8 7 2.</_>\n                <_>10 10 8 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1111646965146065</threshold>\n            <left_val>0.2101044058799744</left_val>\n            <right_val>0.5080801844596863</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 18 -1.</_>\n                <_>18 2 2 9 2.</_>\n                <_>16 11 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108884396031499</threshold>\n            <left_val>0.5765355229377747</left_val>\n            <right_val>0.4790464043617249</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 15 2 3 -1.</_>\n                <_>4 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8564301580190659e-003</threshold>\n            <left_val>0.5065100193023682</left_val>\n            <right_val>0.1563598960638046</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 18 -1.</_>\n                <_>18 2 2 9 2.</_>\n                <_>16 11 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0548543892800808</threshold>\n            <left_val>0.4966914951801300</left_val>\n            <right_val>0.7230510711669922</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 8 3 -1.</_>\n                <_>1 2 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0111973397433758</threshold>\n            <left_val>0.2194979041814804</left_val>\n            <right_val>0.5098798274993897</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4069071300327778e-003</threshold>\n            <left_val>0.4778401851654053</left_val>\n            <right_val>0.6770902872085571</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 5 9 -1.</_>\n                <_>5 14 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0636652931571007</threshold>\n            <left_val>0.1936362981796265</left_val>\n            <right_val>0.5081024169921875</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 11 -1.</_>\n                <_>16 0 2 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.8081491887569427e-003</threshold>\n            <left_val>0.5999063253402710</left_val>\n            <right_val>0.4810341000556946</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 1 -1.</_>\n                <_>9 0 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1717099007219076e-003</threshold>\n            <left_val>0.3338333964347839</left_val>\n            <right_val>0.5235472917556763</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0133155202493072</threshold>\n            <left_val>0.6617069840431213</left_val>\n            <right_val>0.4919213056564331</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 3 7 -1.</_>\n                <_>2 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5442079640924931e-003</threshold>\n            <left_val>0.4488744139671326</left_val>\n            <right_val>0.6082184910774231</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 6 12 -1.</_>\n                <_>7 12 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0120378397405148</threshold>\n            <left_val>0.5409392118453980</left_val>\n            <right_val>0.3292432129383087</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 11 -1.</_>\n                <_>2 0 2 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0207010507583618</threshold>\n            <left_val>0.6819120049476624</left_val>\n            <right_val>0.4594995975494385</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 20 -1.</_>\n                <_>14 0 3 20 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0276082791388035</threshold>\n            <left_val>0.4630792140960693</left_val>\n            <right_val>0.5767282843589783</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 1 2 -1.</_>\n                <_>0 4 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2370620388537645e-003</threshold>\n            <left_val>0.5165379047393799</left_val>\n            <right_val>0.2635016143321991</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 10 8 -1.</_>\n                <_>10 5 5 4 2.</_>\n                <_>5 9 5 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0376693382859230</threshold>\n            <left_val>0.2536393105983734</left_val>\n            <right_val>0.5278980135917664</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 12 4 -1.</_>\n                <_>4 7 6 2 2.</_>\n                <_>10 9 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8057259730994701e-003</threshold>\n            <left_val>0.3985156118869782</left_val>\n            <right_val>0.5517500042915344</right_val></_></_></trees>\n      <stage_threshold>50.6104812622070310</stage_threshold>\n      <parent>10</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 12 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 6 4 -1.</_>\n                <_>5 1 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4299028813838959e-003</threshold>\n            <left_val>0.2891018092632294</left_val>\n            <right_val>0.6335226297378540</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 6 4 -1.</_>\n                <_>12 7 3 2 2.</_>\n                <_>9 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3813319858163595e-003</threshold>\n            <left_val>0.6211789250373840</left_val>\n            <right_val>0.3477487862110138</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 6 -1.</_>\n                <_>5 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2915711160749197e-003</threshold>\n            <left_val>0.2254412025213242</left_val>\n            <right_val>0.5582118034362793</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 6 4 -1.</_>\n                <_>12 16 3 2 2.</_>\n                <_>9 18 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9457940086722374e-004</threshold>\n            <left_val>0.3711710870265961</left_val>\n            <right_val>0.5930070877075195</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 12 -1.</_>\n                <_>9 10 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7164667891338468e-004</threshold>\n            <left_val>0.5651720166206360</left_val>\n            <right_val>0.3347995877265930</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 18 -1.</_>\n                <_>9 1 2 18 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1386410333216190e-003</threshold>\n            <left_val>0.3069126009941101</left_val>\n            <right_val>0.5508630871772766</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 12 2 -1.</_>\n                <_>8 12 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6403039626311511e-004</threshold>\n            <left_val>0.5762827992439270</left_val>\n            <right_val>0.3699047863483429</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 6 2 -1.</_>\n                <_>8 9 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9793529392918572e-005</threshold>\n            <left_val>0.2644244134426117</left_val>\n            <right_val>0.5437911152839661</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 3 6 -1.</_>\n                <_>9 0 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5774902254343033e-003</threshold>\n            <left_val>0.5051138997077942</left_val>\n            <right_val>0.1795724928379059</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 18 3 2 -1.</_>\n                <_>11 19 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6032689493149519e-004</threshold>\n            <left_val>0.5826969146728516</left_val>\n            <right_val>0.4446826875209808</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 17 4 -1.</_>\n                <_>1 3 17 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1404630541801453e-003</threshold>\n            <left_val>0.3113852143287659</left_val>\n            <right_val>0.5346971750259399</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 8 4 12 -1.</_>\n                <_>11 8 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0230869501829147</threshold>\n            <left_val>0.3277946114540100</left_val>\n            <right_val>0.5331197977066040</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0142436502501369</threshold>\n            <left_val>0.7381709814071655</left_val>\n            <right_val>0.4588063061237335</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 2 17 -1.</_>\n                <_>12 3 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0194871295243502</threshold>\n            <left_val>0.5256630778312683</left_val>\n            <right_val>0.2274471968412399</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 6 1 -1.</_>\n                <_>6 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.6681108698248863e-004</threshold>\n            <left_val>0.5511230826377869</left_val>\n            <right_val>0.3815006911754608</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 3 -1.</_>\n                <_>18 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1474709976464510e-003</threshold>\n            <left_val>0.5425636768341065</left_val>\n            <right_val>0.2543726861476898</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 3 4 -1.</_>\n                <_>8 6 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8026070029009134e-004</threshold>\n            <left_val>0.5380191802978516</left_val>\n            <right_val>0.3406304121017456</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 10 -1.</_>\n                <_>4 10 12 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0266260989010334e-003</threshold>\n            <left_val>0.3035801947116852</left_val>\n            <right_val>0.5420572161674500</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 18 4 2 -1.</_>\n                <_>7 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4462960795499384e-004</threshold>\n            <left_val>0.3990997076034546</left_val>\n            <right_val>0.5660110116004944</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 2 3 6 -1.</_>\n                <_>17 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2609760053455830e-003</threshold>\n            <left_val>0.5562806725502014</left_val>\n            <right_val>0.3940688073635101</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 6 -1.</_>\n                <_>9 7 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0511330589652061</threshold>\n            <left_val>0.4609653949737549</left_val>\n            <right_val>0.7118561863899231</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 2 3 6 -1.</_>\n                <_>17 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0177863091230392</threshold>\n            <left_val>0.2316166013479233</left_val>\n            <right_val>0.5322144031524658</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 3 4 -1.</_>\n                <_>9 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9679628573358059e-003</threshold>\n            <left_val>0.2330771982669830</left_val>\n            <right_val>0.5122029185295105</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0667689386755228e-003</threshold>\n            <left_val>0.4657444059848785</left_val>\n            <right_val>0.6455488204956055</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 6 3 -1.</_>\n                <_>0 13 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4413768015801907e-003</threshold>\n            <left_val>0.5154392123222351</left_val>\n            <right_val>0.2361633926630020</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6277279723435640e-003</threshold>\n            <left_val>0.6219773292541504</left_val>\n            <right_val>0.4476661086082459</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 3 -1.</_>\n                <_>3 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3530759178102016e-003</threshold>\n            <left_val>0.1837355047464371</left_val>\n            <right_val>0.5102208256721497</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 12 7 -1.</_>\n                <_>9 6 4 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1453091949224472</threshold>\n            <left_val>0.5145987272262573</left_val>\n            <right_val>0.1535930931568146</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4394490756094456e-003</threshold>\n            <left_val>0.5343660116195679</left_val>\n            <right_val>0.3624661862850189</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 1 3 -1.</_>\n                <_>14 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1283390708267689e-003</threshold>\n            <left_val>0.6215007901191711</left_val>\n            <right_val>0.4845592081546783</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 3 14 -1.</_>\n                <_>3 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7940260004252195e-003</threshold>\n            <left_val>0.4299261868000031</left_val>\n            <right_val>0.5824198126792908</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 5 6 -1.</_>\n                <_>12 16 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0362538211047649</threshold>\n            <left_val>0.5260334014892578</left_val>\n            <right_val>0.1439467966556549</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 5 6 -1.</_>\n                <_>4 16 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1746722310781479e-003</threshold>\n            <left_val>0.3506538867950440</left_val>\n            <right_val>0.5287045240402222</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 2 -1.</_>\n                <_>12 10 1 1 2.</_>\n                <_>11 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5383297624066472e-004</threshold>\n            <left_val>0.4809640944004059</left_val>\n            <right_val>0.6122040152549744</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 3 14 -1.</_>\n                <_>6 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0264802295714617</threshold>\n            <left_val>0.1139362007379532</left_val>\n            <right_val>0.5045586228370667</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 2 3 -1.</_>\n                <_>10 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0440660193562508e-003</threshold>\n            <left_val>0.6352095007896423</left_val>\n            <right_val>0.4794734120368958</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 2 3 -1.</_>\n                <_>0 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6993520334362984e-003</threshold>\n            <left_val>0.5131118297576904</left_val>\n            <right_val>0.2498510926961899</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 12 6 -1.</_>\n                <_>5 14 12 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6762931267730892e-004</threshold>\n            <left_val>0.5421394705772400</left_val>\n            <right_val>0.3709532022476196</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 3 9 -1.</_>\n                <_>6 14 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0413822606205940</threshold>\n            <left_val>0.1894959956407547</left_val>\n            <right_val>0.5081691741943359</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 2 -1.</_>\n                <_>12 10 1 1 2.</_>\n                <_>11 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0532729793339968e-003</threshold>\n            <left_val>0.6454367041587830</left_val>\n            <right_val>0.4783608913421631</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 1 3 -1.</_>\n                <_>5 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1648600231856108e-003</threshold>\n            <left_val>0.6215031147003174</left_val>\n            <right_val>0.4499826133251190</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 13 3 -1.</_>\n                <_>4 10 13 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.6747748749330640e-004</threshold>\n            <left_val>0.3712610900402069</left_val>\n            <right_val>0.5419334769248962</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 15 6 -1.</_>\n                <_>6 7 5 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1737584024667740</threshold>\n            <left_val>0.5023643970489502</left_val>\n            <right_val>0.1215742006897926</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 6 -1.</_>\n                <_>8 5 4 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9049699660390615e-003</threshold>\n            <left_val>0.3240267932415009</left_val>\n            <right_val>0.5381883978843689</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 4 3 -1.</_>\n                <_>8 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2299539521336555e-003</threshold>\n            <left_val>0.4165507853031158</left_val>\n            <right_val>0.5703486204147339</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 3 -1.</_>\n                <_>15 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4329237900674343e-004</threshold>\n            <left_val>0.3854042887687683</left_val>\n            <right_val>0.5547549128532410</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 5 3 -1.</_>\n                <_>1 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.3297258242964745e-003</threshold>\n            <left_val>0.2204494029283524</left_val>\n            <right_val>0.5097082853317261</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 7 12 -1.</_>\n                <_>7 7 7 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0417630255687982e-004</threshold>\n            <left_val>0.5607066154479981</left_val>\n            <right_val>0.4303036034107208</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 6 10 -1.</_>\n                <_>0 1 3 5 2.</_>\n                <_>3 6 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0312047004699707</threshold>\n            <left_val>0.4621657133102417</left_val>\n            <right_val>0.6982004046440125</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 1 4 3 -1.</_>\n                <_>16 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8943502157926559e-003</threshold>\n            <left_val>0.5269594192504883</left_val>\n            <right_val>0.2269068062305450</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3645310215651989e-003</threshold>\n            <left_val>0.6359223127365112</left_val>\n            <right_val>0.4537956118583679</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 3 5 -1.</_>\n                <_>13 2 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6793059706687927e-003</threshold>\n            <left_val>0.5274767875671387</left_val>\n            <right_val>0.2740483880043030</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 4 6 -1.</_>\n                <_>0 5 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0254311393946409</threshold>\n            <left_val>0.2038519978523254</left_val>\n            <right_val>0.5071732997894287</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2000601105391979e-004</threshold>\n            <left_val>0.4587455093860626</left_val>\n            <right_val>0.6119868159294128</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 1 -1.</_>\n                <_>9 18 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9284600168466568e-003</threshold>\n            <left_val>0.5071274042129517</left_val>\n            <right_val>0.2028204947710037</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 2 -1.</_>\n                <_>12 10 1 1 2.</_>\n                <_>11 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5256470912136137e-005</threshold>\n            <left_val>0.4812104105949402</left_val>\n            <right_val>0.5430821776390076</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 2 2 -1.</_>\n                <_>7 10 1 1 2.</_>\n                <_>8 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3158309739083052e-003</threshold>\n            <left_val>0.4625813961029053</left_val>\n            <right_val>0.6779323220252991</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 4 4 -1.</_>\n                <_>11 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5870389761403203e-003</threshold>\n            <left_val>0.5386291742324829</left_val>\n            <right_val>0.3431465029716492</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 3 8 -1.</_>\n                <_>9 12 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215396601706743</threshold>\n            <left_val>0.0259425006806850</left_val>\n            <right_val>0.5003222823143005</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 6 3 -1.</_>\n                <_>13 1 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0143344802781940</threshold>\n            <left_val>0.5202844738960266</left_val>\n            <right_val>0.1590632945299149</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>9 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.3881383761763573e-003</threshold>\n            <left_val>0.7282481193542481</left_val>\n            <right_val>0.4648044109344482</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 10 -1.</_>\n                <_>10 7 5 5 2.</_>\n                <_>5 12 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1906841844320297e-003</threshold>\n            <left_val>0.5562356710433960</left_val>\n            <right_val>0.3923191130161285</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 18 8 2 -1.</_>\n                <_>3 18 4 1 2.</_>\n                <_>7 19 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8453059755265713e-003</threshold>\n            <left_val>0.6803392767906189</left_val>\n            <right_val>0.4629127979278565</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 6 8 -1.</_>\n                <_>12 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0547077991068363</threshold>\n            <left_val>0.2561671137809753</left_val>\n            <right_val>0.5206125974655151</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 6 8 -1.</_>\n                <_>6 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1142775490880013e-003</threshold>\n            <left_val>0.5189620256423950</left_val>\n            <right_val>0.3053877055644989</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 7 -1.</_>\n                <_>12 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0155750000849366</threshold>\n            <left_val>0.1295074969530106</left_val>\n            <right_val>0.5169094800949097</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 1 -1.</_>\n                <_>8 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2050600344082341e-004</threshold>\n            <left_val>0.5735098123550415</left_val>\n            <right_val>0.4230825006961823</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 3 -1.</_>\n                <_>15 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2273970060050488e-003</threshold>\n            <left_val>0.5289878249168396</left_val>\n            <right_val>0.4079791903495789</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 2 -1.</_>\n                <_>7 15 1 1 2.</_>\n                <_>8 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2186600361019373e-003</threshold>\n            <left_val>0.6575639843940735</left_val>\n            <right_val>0.4574409127235413</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 3 -1.</_>\n                <_>15 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3256649039685726e-003</threshold>\n            <left_val>0.3628047108650208</left_val>\n            <right_val>0.5195019841194153</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 7 -1.</_>\n                <_>7 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0132883097976446</threshold>\n            <left_val>0.1284265965223312</left_val>\n            <right_val>0.5043488740921021</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 7 -1.</_>\n                <_>18 1 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3839771058410406e-003</threshold>\n            <left_val>0.6292240023612976</left_val>\n            <right_val>0.4757505953311920</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 8 20 -1.</_>\n                <_>2 10 8 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2195422053337097</threshold>\n            <left_val>0.1487731933593750</left_val>\n            <right_val>0.5065013766288757</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 15 6 -1.</_>\n                <_>3 2 15 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9111708067357540e-003</threshold>\n            <left_val>0.4256102144718170</left_val>\n            <right_val>0.5665838718414307</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 12 2 -1.</_>\n                <_>4 4 12 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8744950648397207e-004</threshold>\n            <left_val>0.4004144072532654</left_val>\n            <right_val>0.5586857199668884</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 5 -1.</_>\n                <_>16 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2178641781210899e-003</threshold>\n            <left_val>0.6009116172790527</left_val>\n            <right_val>0.4812706112861633</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 4 -1.</_>\n                <_>8 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1111519997939467e-003</threshold>\n            <left_val>0.3514933884143829</left_val>\n            <right_val>0.5287089943885803</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 5 -1.</_>\n                <_>16 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4036400504410267e-003</threshold>\n            <left_val>0.4642275869846344</left_val>\n            <right_val>0.5924085974693298</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 6 13 -1.</_>\n                <_>3 7 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1229949966073036</threshold>\n            <left_val>0.5025529265403748</left_val>\n            <right_val>0.0691524818539619</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 5 -1.</_>\n                <_>16 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0123135102912784</threshold>\n            <left_val>0.5884591937065125</left_val>\n            <right_val>0.4934012889862061</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 5 -1.</_>\n                <_>2 0 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1471039876341820e-003</threshold>\n            <left_val>0.4372239112854004</left_val>\n            <right_val>0.5893477797508240</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 3 6 -1.</_>\n                <_>14 14 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5502649843692780e-003</threshold>\n            <left_val>0.4327551126480103</left_val>\n            <right_val>0.5396270155906677</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 3 6 -1.</_>\n                <_>3 14 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0192242693156004</threshold>\n            <left_val>0.1913134008646011</left_val>\n            <right_val>0.5068330764770508</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 1 4 3 -1.</_>\n                <_>16 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4395059552043676e-003</threshold>\n            <left_val>0.5308178067207336</left_val>\n            <right_val>0.4243533015251160</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 10 -1.</_>\n                <_>8 7 1 5 2.</_>\n                <_>9 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7751999013125896e-003</threshold>\n            <left_val>0.6365395784378052</left_val>\n            <right_val>0.4540086090564728</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 4 4 -1.</_>\n                <_>11 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0119630545377731e-003</threshold>\n            <left_val>0.5189834237098694</left_val>\n            <right_val>0.3026199936866760</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 3 -1.</_>\n                <_>0 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4014651104807854e-003</threshold>\n            <left_val>0.5105062127113342</left_val>\n            <right_val>0.2557682991027832</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 3 -1.</_>\n                <_>13 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0274988906458020e-004</threshold>\n            <left_val>0.4696914851665497</left_val>\n            <right_val>0.5861827731132507</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 3 5 -1.</_>\n                <_>8 15 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0114744501188397</threshold>\n            <left_val>0.5053645968437195</left_val>\n            <right_val>0.1527177989482880</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7023430019617081e-003</threshold>\n            <left_val>0.6508980989456177</left_val>\n            <right_val>0.4890604019165039</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0462959073483944e-003</threshold>\n            <left_val>0.6241816878318787</left_val>\n            <right_val>0.4514600038528442</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 14 -1.</_>\n                <_>10 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.9951568990945816e-003</threshold>\n            <left_val>0.3432781100273132</left_val>\n            <right_val>0.5400953888893127</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 5 6 -1.</_>\n                <_>0 7 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0357007086277008</threshold>\n            <left_val>0.1878059059381485</left_val>\n            <right_val>0.5074077844619751</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 4 -1.</_>\n                <_>9 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5584561303257942e-004</threshold>\n            <left_val>0.3805277049541473</left_val>\n            <right_val>0.5402569770812988</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 18 10 -1.</_>\n                <_>6 0 6 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0542606003582478</threshold>\n            <left_val>0.6843714714050293</left_val>\n            <right_val>0.4595097005367279</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 14 -1.</_>\n                <_>10 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0600461438298225e-003</threshold>\n            <left_val>0.5502905249595642</left_val>\n            <right_val>0.4500527977943420</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 14 -1.</_>\n                <_>8 6 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4791832119226456e-003</threshold>\n            <left_val>0.3368858098983765</left_val>\n            <right_val>0.5310757160186768</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 3 -1.</_>\n                <_>13 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4939469983801246e-003</threshold>\n            <left_val>0.6487640142440796</left_val>\n            <right_val>0.4756175875663757</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 2 3 -1.</_>\n                <_>6 1 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4610530342906713e-005</threshold>\n            <left_val>0.4034579098224640</left_val>\n            <right_val>0.5451064109802246</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 18 -1.</_>\n                <_>19 1 1 9 2.</_>\n                <_>18 10 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2321938350796700e-003</threshold>\n            <left_val>0.6386873722076416</left_val>\n            <right_val>0.4824739992618561</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 4 3 -1.</_>\n                <_>2 2 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0645818226039410e-003</threshold>\n            <left_val>0.2986421883106232</left_val>\n            <right_val>0.5157335996627808</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 18 -1.</_>\n                <_>19 1 1 9 2.</_>\n                <_>18 10 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0304630808532238</threshold>\n            <left_val>0.5022199749946594</left_val>\n            <right_val>0.7159956097602844</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 4 6 -1.</_>\n                <_>1 14 2 3 2.</_>\n                <_>3 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0544911324977875e-003</threshold>\n            <left_val>0.6492452025413513</left_val>\n            <right_val>0.4619275033473969</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 7 6 -1.</_>\n                <_>10 13 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0395051389932632</threshold>\n            <left_val>0.5150570869445801</left_val>\n            <right_val>0.2450613975524902</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 6 10 -1.</_>\n                <_>0 10 3 5 2.</_>\n                <_>3 15 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4530208259820938e-003</threshold>\n            <left_val>0.4573669135570526</left_val>\n            <right_val>0.6394037008285523</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 4 -1.</_>\n                <_>12 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1688120430335402e-003</threshold>\n            <left_val>0.3865512013435364</left_val>\n            <right_val>0.5483661293983460</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 5 6 -1.</_>\n                <_>5 13 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8070670086890459e-003</threshold>\n            <left_val>0.5128579139709473</left_val>\n            <right_val>0.2701480090618134</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 1 8 -1.</_>\n                <_>14 10 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7365209320560098e-004</threshold>\n            <left_val>0.4051581919193268</left_val>\n            <right_val>0.5387461185455322</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 18 6 -1.</_>\n                <_>1 7 9 3 2.</_>\n                <_>10 10 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0117410803213716</threshold>\n            <left_val>0.5295950174331665</left_val>\n            <right_val>0.3719413876533508</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>9 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1833238899707794e-003</threshold>\n            <left_val>0.4789406955242157</left_val>\n            <right_val>0.6895126104354858</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 4 5 -1.</_>\n                <_>7 9 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0241501089185476e-004</threshold>\n            <left_val>0.5384489297866821</left_val>\n            <right_val>0.3918080925941467</right_val></_></_></trees>\n      <stage_threshold>54.6200714111328130</stage_threshold>\n      <parent>11</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 13 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 3 -1.</_>\n                <_>9 6 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0170599296689034</threshold>\n            <left_val>0.3948527872562408</left_val>\n            <right_val>0.7142534852027893</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0218408405780792</threshold>\n            <left_val>0.3370316028594971</left_val>\n            <right_val>0.6090016961097717</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 4 -1.</_>\n                <_>7 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4520049919374287e-004</threshold>\n            <left_val>0.3500576019287109</left_val>\n            <right_val>0.5987902283668518</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 19 9 -1.</_>\n                <_>1 3 19 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3272606134414673e-003</threshold>\n            <left_val>0.3267528116703033</left_val>\n            <right_val>0.5697240829467773</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 3 6 -1.</_>\n                <_>3 9 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7148298947140574e-004</threshold>\n            <left_val>0.3044599890708923</left_val>\n            <right_val>0.5531656742095947</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 4 4 -1.</_>\n                <_>15 7 2 2 2.</_>\n                <_>13 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7373987985774875e-004</threshold>\n            <left_val>0.3650012016296387</left_val>\n            <right_val>0.5672631263732910</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 4 4 -1.</_>\n                <_>3 7 2 2 2.</_>\n                <_>5 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4681590477703139e-005</threshold>\n            <left_val>0.3313541114330292</left_val>\n            <right_val>0.5388727188110352</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 10 8 -1.</_>\n                <_>9 10 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8563398197293282e-003</threshold>\n            <left_val>0.2697942852973938</left_val>\n            <right_val>0.5498778820037842</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 14 12 -1.</_>\n                <_>3 14 14 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5102273151278496e-003</threshold>\n            <left_val>0.5269358158111572</left_val>\n            <right_val>0.2762879133224487</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 10 12 -1.</_>\n                <_>11 5 5 6 2.</_>\n                <_>6 11 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0698172077536583</threshold>\n            <left_val>0.2909603118896484</left_val>\n            <right_val>0.5259246826171875</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6113670840859413e-004</threshold>\n            <left_val>0.5892577171325684</left_val>\n            <right_val>0.4073697924613953</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 5 -1.</_>\n                <_>9 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.7149249631911516e-004</threshold>\n            <left_val>0.3523564040660858</left_val>\n            <right_val>0.5415862202644348</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 4 -1.</_>\n                <_>9 6 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4727490452060010e-005</threshold>\n            <left_val>0.5423017740249634</left_val>\n            <right_val>0.3503156006336212</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 5 -1.</_>\n                <_>9 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0484202913939953</threshold>\n            <left_val>0.5193945765495300</left_val>\n            <right_val>0.3411195874214172</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 5 -1.</_>\n                <_>8 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3257140526548028e-003</threshold>\n            <left_val>0.3157769143581390</left_val>\n            <right_val>0.5335376262664795</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 6 1 -1.</_>\n                <_>13 2 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4922149603080470e-005</threshold>\n            <left_val>0.4451299905776978</left_val>\n            <right_val>0.5536553859710693</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 6 1 -1.</_>\n                <_>5 2 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7173398993909359e-003</threshold>\n            <left_val>0.3031741976737976</left_val>\n            <right_val>0.5248088836669922</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 3 -1.</_>\n                <_>13 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9219500720500946e-003</threshold>\n            <left_val>0.4781453013420105</left_val>\n            <right_val>0.6606041789054871</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 1 4 -1.</_>\n                <_>0 12 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9804988987743855e-003</threshold>\n            <left_val>0.3186308145523071</left_val>\n            <right_val>0.5287625193595886</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 3 -1.</_>\n                <_>13 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0012109093368053e-003</threshold>\n            <left_val>0.6413596868515015</left_val>\n            <right_val>0.4749928116798401</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 2 -1.</_>\n                <_>9 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3491991236805916e-003</threshold>\n            <left_val>0.1507498025894165</left_val>\n            <right_val>0.5098996758460999</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 9 2 -1.</_>\n                <_>6 16 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3490889687091112e-003</threshold>\n            <left_val>0.4316158890724182</left_val>\n            <right_val>0.5881167054176331</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0185970701277256</threshold>\n            <left_val>0.4735553860664368</left_val>\n            <right_val>0.9089794158935547</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 4 -1.</_>\n                <_>18 6 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8562379991635680e-003</threshold>\n            <left_val>0.3553189039230347</left_val>\n            <right_val>0.5577837228775024</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2940430790185928e-003</threshold>\n            <left_val>0.4500094950199127</left_val>\n            <right_val>0.6580877900123596</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 16 3 2 -1.</_>\n                <_>15 17 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9982850537635386e-004</threshold>\n            <left_val>0.5629242062568665</left_val>\n            <right_val>0.3975878953933716</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 3 9 -1.</_>\n                <_>0 3 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5455459728837013e-003</threshold>\n            <left_val>0.5381547212600708</left_val>\n            <right_val>0.3605485856533051</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>9 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6104722470045090e-003</threshold>\n            <left_val>0.5255997180938721</left_val>\n            <right_val>0.1796745955944061</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>8 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2783220782876015e-003</threshold>\n            <left_val>0.2272856980562210</left_val>\n            <right_val>0.5114030241966248</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>9 5 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4598479978740215e-003</threshold>\n            <left_val>0.4626308083534241</left_val>\n            <right_val>0.6608219146728516</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 4 -1.</_>\n                <_>9 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3112019514665008e-003</threshold>\n            <left_val>0.6317539811134338</left_val>\n            <right_val>0.4436857998371124</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 8 12 -1.</_>\n                <_>11 6 4 6 2.</_>\n                <_>7 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6876179035753012e-003</threshold>\n            <left_val>0.5421109795570374</left_val>\n            <right_val>0.4054022133350372</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 8 12 -1.</_>\n                <_>5 6 4 6 2.</_>\n                <_>9 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9118169806897640e-003</threshold>\n            <left_val>0.5358477830886841</left_val>\n            <right_val>0.3273454904556274</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0142064504325390</threshold>\n            <left_val>0.7793576717376709</left_val>\n            <right_val>0.4975781142711639</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 3 2 -1.</_>\n                <_>2 17 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1705528534948826e-004</threshold>\n            <left_val>0.5297319889068604</left_val>\n            <right_val>0.3560903966426849</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6635019565001130e-003</threshold>\n            <left_val>0.4678094089031220</left_val>\n            <right_val>0.5816481709480286</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 6 6 -1.</_>\n                <_>2 14 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3686188980937004e-003</threshold>\n            <left_val>0.5276734232902527</left_val>\n            <right_val>0.3446420133113861</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127995302900672</threshold>\n            <left_val>0.4834679961204529</left_val>\n            <right_val>0.7472159266471863</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 6 3 -1.</_>\n                <_>6 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3901201095432043e-003</threshold>\n            <left_val>0.4511859118938446</left_val>\n            <right_val>0.6401721239089966</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 5 3 -1.</_>\n                <_>14 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7070779837667942e-003</threshold>\n            <left_val>0.5335658788681030</left_val>\n            <right_val>0.3555220961570740</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4819339849054813e-003</threshold>\n            <left_val>0.4250707030296326</left_val>\n            <right_val>0.5772724151611328</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 5 3 -1.</_>\n                <_>14 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9995759986341000e-003</threshold>\n            <left_val>0.3003320097923279</left_val>\n            <right_val>0.5292900204658508</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 6 2 -1.</_>\n                <_>7 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0159390103071928</threshold>\n            <left_val>0.5067319273948669</left_val>\n            <right_val>0.1675581932067871</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6377349905669689e-003</threshold>\n            <left_val>0.4795069992542267</left_val>\n            <right_val>0.7085601091384888</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 15 5 3 -1.</_>\n                <_>1 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7334040068089962e-003</threshold>\n            <left_val>0.5133113265037537</left_val>\n            <right_val>0.2162470072507858</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>10 13 2 3 2.</_>\n                <_>8 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128588099032640</threshold>\n            <left_val>0.1938841938972473</left_val>\n            <right_val>0.5251371860504150</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 3 -1.</_>\n                <_>8 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2270800117403269e-004</threshold>\n            <left_val>0.5686538219451904</left_val>\n            <right_val>0.4197868108749390</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 5 4 -1.</_>\n                <_>12 2 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2651681471616030e-004</threshold>\n            <left_val>0.4224168956279755</left_val>\n            <right_val>0.5429695844650269</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 2 -1.</_>\n                <_>0 2 10 1 2.</_>\n                <_>10 3 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0110750999301672</threshold>\n            <left_val>0.5113775134086609</left_val>\n            <right_val>0.2514517903327942</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0367282517254353</threshold>\n            <left_val>0.7194662094116211</left_val>\n            <right_val>0.4849618971347809</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 6 1 -1.</_>\n                <_>6 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8207109426148236e-004</threshold>\n            <left_val>0.3840261995792389</left_val>\n            <right_val>0.5394446253776550</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 18 13 2 -1.</_>\n                <_>4 19 13 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7489690110087395e-003</threshold>\n            <left_val>0.5937088727951050</left_val>\n            <right_val>0.4569182097911835</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 3 6 -1.</_>\n                <_>2 12 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0100475195795298</threshold>\n            <left_val>0.5138576030731201</left_val>\n            <right_val>0.2802298069000244</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 6 8 -1.</_>\n                <_>17 12 3 4 2.</_>\n                <_>14 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1497840583324432e-003</threshold>\n            <left_val>0.6090037226676941</left_val>\n            <right_val>0.4636121094226837</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 10 6 -1.</_>\n                <_>4 13 5 3 2.</_>\n                <_>9 16 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8833888508379459e-003</threshold>\n            <left_val>0.3458611071109772</left_val>\n            <right_val>0.5254660248756409</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 1 2 -1.</_>\n                <_>14 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4039360394235700e-005</threshold>\n            <left_val>0.5693104267120361</left_val>\n            <right_val>0.4082083106040955</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5498419525101781e-003</threshold>\n            <left_val>0.4350537061691284</left_val>\n            <right_val>0.5806517004966736</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 2 -1.</_>\n                <_>14 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7841499112546444e-003</threshold>\n            <left_val>0.1468873023986816</left_val>\n            <right_val>0.5182775259017944</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 2 -1.</_>\n                <_>4 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1705629478674382e-004</threshold>\n            <left_val>0.5293524265289307</left_val>\n            <right_val>0.3456174135208130</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 9 2 -1.</_>\n                <_>8 13 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1198898795992136e-004</threshold>\n            <left_val>0.4652450978755951</left_val>\n            <right_val>0.5942413806915283</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4507530294358730e-003</threshold>\n            <left_val>0.4653508961200714</left_val>\n            <right_val>0.7024846076965332</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 6 -1.</_>\n                <_>11 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5818689027801156e-004</threshold>\n            <left_val>0.5497295260429382</left_val>\n            <right_val>0.3768967092037201</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 9 12 -1.</_>\n                <_>5 12 9 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0174425393342972</threshold>\n            <left_val>0.3919087946414948</left_val>\n            <right_val>0.5457497835159302</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 6 -1.</_>\n                <_>11 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0453435294330120</threshold>\n            <left_val>0.1631357073783875</left_val>\n            <right_val>0.5154908895492554</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 6 -1.</_>\n                <_>6 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9190689781680703e-003</threshold>\n            <left_val>0.5145897865295410</left_val>\n            <right_val>0.2791895866394043</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 11 3 -1.</_>\n                <_>5 5 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0177869163453579e-003</threshold>\n            <left_val>0.6517636179924011</left_val>\n            <right_val>0.4756332933902741</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 5 10 -1.</_>\n                <_>7 6 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0720738470554352e-003</threshold>\n            <left_val>0.5514652729034424</left_val>\n            <right_val>0.4092685878276825</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 18 2 -1.</_>\n                <_>2 9 18 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9855059003457427e-004</threshold>\n            <left_val>0.3165240883827210</left_val>\n            <right_val>0.5285550951957703</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 5 3 -1.</_>\n                <_>7 18 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5418570302426815e-003</threshold>\n            <left_val>0.6853377819061279</left_val>\n            <right_val>0.4652808904647827</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 1 -1.</_>\n                <_>9 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4845089539885521e-003</threshold>\n            <left_val>0.5484588146209717</left_val>\n            <right_val>0.4502759873867035</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 6 6 -1.</_>\n                <_>0 14 3 3 2.</_>\n                <_>3 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0136967804282904</threshold>\n            <left_val>0.6395779848098755</left_val>\n            <right_val>0.4572555124759674</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 1 -1.</_>\n                <_>9 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0173471402376890</threshold>\n            <left_val>0.2751072943210602</left_val>\n            <right_val>0.5181614756584168</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 9 12 1 -1.</_>\n                <_>7 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0885428898036480e-003</threshold>\n            <left_val>0.3325636088848114</left_val>\n            <right_val>0.5194984078407288</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 6 7 -1.</_>\n                <_>14 10 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4687901437282562e-003</threshold>\n            <left_val>0.5942280888557434</left_val>\n            <right_val>0.4851819872856140</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 16 2 -1.</_>\n                <_>1 1 16 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7084840219467878e-003</threshold>\n            <left_val>0.4167110919952393</left_val>\n            <right_val>0.5519806146621704</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 10 9 -1.</_>\n                <_>10 12 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4809094443917274e-003</threshold>\n            <left_val>0.5433894991874695</left_val>\n            <right_val>0.4208514988422394</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 10 2 -1.</_>\n                <_>5 1 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7389650717377663e-003</threshold>\n            <left_val>0.6407189965248108</left_val>\n            <right_val>0.4560655057430267</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 2 3 -1.</_>\n                <_>17 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5761050209403038e-003</threshold>\n            <left_val>0.5214555263519287</left_val>\n            <right_val>0.2258227020502091</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 2 3 -1.</_>\n                <_>1 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1690549328923225e-003</threshold>\n            <left_val>0.3151527941226959</left_val>\n            <right_val>0.5156704783439636</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 6 -1.</_>\n                <_>10 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0146601703017950</threshold>\n            <left_val>0.4870837032794952</left_val>\n            <right_val>0.6689941287040710</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 4 3 -1.</_>\n                <_>8 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7231999663636088e-004</threshold>\n            <left_val>0.3569748997688294</left_val>\n            <right_val>0.5251078009605408</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 6 -1.</_>\n                <_>9 5 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0218037609010935</threshold>\n            <left_val>0.8825920820236206</left_val>\n            <right_val>0.4966329932212830</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 12 12 -1.</_>\n                <_>3 4 6 6 2.</_>\n                <_>9 10 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0947361066937447</threshold>\n            <left_val>0.1446162015199661</left_val>\n            <right_val>0.5061113834381104</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 6 15 -1.</_>\n                <_>11 2 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5825551971793175e-003</threshold>\n            <left_val>0.5396478772163391</left_val>\n            <right_val>0.4238066077232361</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 6 17 -1.</_>\n                <_>4 2 2 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9517090404406190e-003</threshold>\n            <left_val>0.4170410931110382</left_val>\n            <right_val>0.5497786998748779</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 6 7 -1.</_>\n                <_>14 10 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0121499001979828</threshold>\n            <left_val>0.4698367118835449</left_val>\n            <right_val>0.5664274096488953</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 6 7 -1.</_>\n                <_>3 10 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5169620104134083e-003</threshold>\n            <left_val>0.6267772912979126</left_val>\n            <right_val>0.4463135898113251</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 6 15 -1.</_>\n                <_>11 2 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0716679096221924</threshold>\n            <left_val>0.3097011148929596</left_val>\n            <right_val>0.5221003293991089</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 15 -1.</_>\n                <_>7 2 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0882924199104309</threshold>\n            <left_val>0.0811238884925842</left_val>\n            <right_val>0.5006365180015564</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 9 3 6 -1.</_>\n                <_>17 11 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0310630798339844</threshold>\n            <left_val>0.5155503749847412</left_val>\n            <right_val>0.1282255947589874</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 6 6 -1.</_>\n                <_>8 7 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0466218404471874</threshold>\n            <left_val>0.4699777960777283</left_val>\n            <right_val>0.7363960742950440</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 18 6 -1.</_>\n                <_>10 10 9 3 2.</_>\n                <_>1 13 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0121894897893071</threshold>\n            <left_val>0.3920530080795288</left_val>\n            <right_val>0.5518996715545654</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 10 9 -1.</_>\n                <_>0 12 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130161102861166</threshold>\n            <left_val>0.5260658264160156</left_val>\n            <right_val>0.3685136139392853</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4952899441123009e-003</threshold>\n            <left_val>0.6339294910430908</left_val>\n            <right_val>0.4716280996799469</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 3 4 -1.</_>\n                <_>5 14 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4015039748046547e-005</threshold>\n            <left_val>0.5333027243614197</left_val>\n            <right_val>0.3776184916496277</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 3 16 12 -1.</_>\n                <_>3 9 16 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1096649020910263</threshold>\n            <left_val>0.1765342056751251</left_val>\n            <right_val>0.5198346972465515</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 12 12 -1.</_>\n                <_>1 1 6 6 2.</_>\n                <_>7 7 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0279558207839727e-004</threshold>\n            <left_val>0.5324159860610962</left_val>\n            <right_val>0.3838908076286316</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 4 2 4 -1.</_>\n                <_>11 4 1 2 2.</_>\n                <_>10 6 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1126641705632210e-004</threshold>\n            <left_val>0.4647929966449738</left_val>\n            <right_val>0.5755224227905273</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 10 2 -1.</_>\n                <_>0 9 5 1 2.</_>\n                <_>5 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1250279862433672e-003</threshold>\n            <left_val>0.3236708939075470</left_val>\n            <right_val>0.5166770815849304</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 3 3 -1.</_>\n                <_>9 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4144679773598909e-003</threshold>\n            <left_val>0.4787439107894898</left_val>\n            <right_val>0.6459717750549316</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 9 2 -1.</_>\n                <_>3 13 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4391240226104856e-004</threshold>\n            <left_val>0.4409308135509491</left_val>\n            <right_val>0.6010255813598633</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2611189342569560e-004</threshold>\n            <left_val>0.4038113951683044</left_val>\n            <right_val>0.5493255853652954</right_val></_></_></trees>\n      <stage_threshold>50.1697311401367190</stage_threshold>\n      <parent>12</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 14 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 13 6 -1.</_>\n                <_>3 6 13 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0469012893736362</threshold>\n            <left_val>0.6600171923637390</left_val>\n            <right_val>0.3743801116943359</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 6 4 -1.</_>\n                <_>12 7 3 2 2.</_>\n                <_>9 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4568349579349160e-003</threshold>\n            <left_val>0.5783991217613220</left_val>\n            <right_val>0.3437797129154205</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 6 8 -1.</_>\n                <_>4 0 3 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5598369799554348e-003</threshold>\n            <left_val>0.3622266948223114</left_val>\n            <right_val>0.5908216238021851</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 12 -1.</_>\n                <_>9 11 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3170487303286791e-004</threshold>\n            <left_val>0.5500419139862061</left_val>\n            <right_val>0.2873558104038239</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 3 10 -1.</_>\n                <_>4 9 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3318009441718459e-003</threshold>\n            <left_val>0.2673169970512390</left_val>\n            <right_val>0.5431019067764282</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 17 8 3 -1.</_>\n                <_>6 18 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4347059661522508e-004</threshold>\n            <left_val>0.3855027854442596</left_val>\n            <right_val>0.5741388797760010</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 10 6 -1.</_>\n                <_>0 7 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0512469820678234e-003</threshold>\n            <left_val>0.5503209829330444</left_val>\n            <right_val>0.3462845087051392</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 3 2 -1.</_>\n                <_>13 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.8657199153676629e-004</threshold>\n            <left_val>0.3291221857070923</left_val>\n            <right_val>0.5429509282112122</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 4 5 -1.</_>\n                <_>9 5 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4668200165033340e-003</threshold>\n            <left_val>0.3588382005691528</left_val>\n            <right_val>0.5351811051368713</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 3 6 -1.</_>\n                <_>12 16 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2021870720200241e-004</threshold>\n            <left_val>0.4296841919422150</left_val>\n            <right_val>0.5700234174728394</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 8 2 -1.</_>\n                <_>1 12 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4122188379988074e-004</threshold>\n            <left_val>0.5282164812088013</left_val>\n            <right_val>0.3366870880126953</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.8330298848450184e-003</threshold>\n            <left_val>0.4559567868709564</left_val>\n            <right_val>0.6257336139678955</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 3 6 -1.</_>\n                <_>0 7 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0154564399272203</threshold>\n            <left_val>0.2350116968154907</left_val>\n            <right_val>0.5129452943801880</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 3 2 -1.</_>\n                <_>13 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6796779129654169e-003</threshold>\n            <left_val>0.5329415202140808</left_val>\n            <right_val>0.4155062139034271</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 4 6 -1.</_>\n                <_>4 14 2 3 2.</_>\n                <_>6 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8296569362282753e-003</threshold>\n            <left_val>0.4273087978363037</left_val>\n            <right_val>0.5804538130760193</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 3 2 -1.</_>\n                <_>13 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9444249123334885e-003</threshold>\n            <left_val>0.2912611961364746</left_val>\n            <right_val>0.5202686190605164</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 4 12 -1.</_>\n                <_>8 6 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7179559692740440e-003</threshold>\n            <left_val>0.5307688117027283</left_val>\n            <right_val>0.3585677146911621</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 8 -1.</_>\n                <_>17 0 3 4 2.</_>\n                <_>14 4 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9077627956867218e-003</threshold>\n            <left_val>0.4703775048255920</left_val>\n            <right_val>0.5941585898399353</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 3 2 -1.</_>\n                <_>8 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2240349575877190e-003</threshold>\n            <left_val>0.2141567021608353</left_val>\n            <right_val>0.5088796019554138</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0725888684391975e-003</threshold>\n            <left_val>0.4766413867473602</left_val>\n            <right_val>0.6841061115264893</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0101495301350951</threshold>\n            <left_val>0.5360798835754395</left_val>\n            <right_val>0.3748497068881989</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 2 10 -1.</_>\n                <_>15 0 1 5 2.</_>\n                <_>14 5 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8864999583456665e-004</threshold>\n            <left_val>0.5720130205154419</left_val>\n            <right_val>0.3853805065155029</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 8 6 -1.</_>\n                <_>5 3 4 3 2.</_>\n                <_>9 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8864358104765415e-003</threshold>\n            <left_val>0.3693122863769531</left_val>\n            <right_val>0.5340958833694458</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 10 -1.</_>\n                <_>17 0 3 5 2.</_>\n                <_>14 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0261584799736738</threshold>\n            <left_val>0.4962374866008759</left_val>\n            <right_val>0.6059989929199219</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 1 2 -1.</_>\n                <_>9 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8560759751126170e-004</threshold>\n            <left_val>0.4438945949077606</left_val>\n            <right_val>0.6012468934059143</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 10 4 3 -1.</_>\n                <_>15 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0112687097862363</threshold>\n            <left_val>0.5244250297546387</left_val>\n            <right_val>0.1840388029813767</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 2 3 -1.</_>\n                <_>8 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8114619199186563e-003</threshold>\n            <left_val>0.6060283780097961</left_val>\n            <right_val>0.4409897029399872</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 14 4 -1.</_>\n                <_>10 13 7 2 2.</_>\n                <_>3 15 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.6112729944288731e-003</threshold>\n            <left_val>0.3891170918941498</left_val>\n            <right_val>0.5589237213134766</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 4 3 -1.</_>\n                <_>1 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5680093616247177e-003</threshold>\n            <left_val>0.5069345831871033</left_val>\n            <right_val>0.2062619030475617</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8172779022715986e-004</threshold>\n            <left_val>0.5882201790809631</left_val>\n            <right_val>0.4192610979080200</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7680290329735726e-004</threshold>\n            <left_val>0.5533605813980103</left_val>\n            <right_val>0.4003368914127350</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 5 16 15 -1.</_>\n                <_>3 10 16 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5112537704408169e-003</threshold>\n            <left_val>0.3310146927833557</left_val>\n            <right_val>0.5444191098213196</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 4 2 -1.</_>\n                <_>8 12 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5948683186434209e-005</threshold>\n            <left_val>0.5433831810951233</left_val>\n            <right_val>0.3944905996322632</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 12 10 -1.</_>\n                <_>10 4 6 5 2.</_>\n                <_>4 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9939051754772663e-003</threshold>\n            <left_val>0.5600358247756958</left_val>\n            <right_val>0.4192714095115662</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 3 4 -1.</_>\n                <_>9 6 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6744439750909805e-003</threshold>\n            <left_val>0.6685466766357422</left_val>\n            <right_val>0.4604960978031158</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 8 -1.</_>\n                <_>10 12 2 4 2.</_>\n                <_>8 16 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0115898502990603</threshold>\n            <left_val>0.5357121229171753</left_val>\n            <right_val>0.2926830053329468</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130078401416540</threshold>\n            <left_val>0.4679817855358124</left_val>\n            <right_val>0.7307463288307190</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 3 2 -1.</_>\n                <_>13 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1008579749614000e-003</threshold>\n            <left_val>0.3937501013278961</left_val>\n            <right_val>0.5415065288543701</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 3 2 -1.</_>\n                <_>8 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0472649056464434e-004</threshold>\n            <left_val>0.4242376089096069</left_val>\n            <right_val>0.5604041218757629</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 9 14 -1.</_>\n                <_>9 0 3 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0144948400557041</threshold>\n            <left_val>0.3631210029125214</left_val>\n            <right_val>0.5293182730674744</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 3 -1.</_>\n                <_>10 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3056948818266392e-003</threshold>\n            <left_val>0.6860452294349670</left_val>\n            <right_val>0.4621821045875549</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 2 3 -1.</_>\n                <_>10 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1829127157106996e-004</threshold>\n            <left_val>0.3944096863269806</left_val>\n            <right_val>0.5420439243316650</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 4 6 -1.</_>\n                <_>0 11 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0190775208175182</threshold>\n            <left_val>0.1962621957063675</left_val>\n            <right_val>0.5037891864776611</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 2 -1.</_>\n                <_>6 1 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5549470339901745e-004</threshold>\n            <left_val>0.4086259007453919</left_val>\n            <right_val>0.5613973140716553</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 7 3 -1.</_>\n                <_>6 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9679730758070946e-003</threshold>\n            <left_val>0.4489121139049530</left_val>\n            <right_val>0.5926123261451721</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 8 9 -1.</_>\n                <_>8 13 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.9189141504466534e-003</threshold>\n            <left_val>0.5335925817489624</left_val>\n            <right_val>0.3728385865688324</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 3 2 -1.</_>\n                <_>6 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9872779268771410e-003</threshold>\n            <left_val>0.5111321210861206</left_val>\n            <right_val>0.2975643873214722</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 6 8 -1.</_>\n                <_>17 1 3 4 2.</_>\n                <_>14 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2264618463814259e-003</threshold>\n            <left_val>0.5541489720344544</left_val>\n            <right_val>0.4824537932872772</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 6 8 -1.</_>\n                <_>0 1 3 4 2.</_>\n                <_>3 5 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0133533002808690</threshold>\n            <left_val>0.4586423933506012</left_val>\n            <right_val>0.6414797902107239</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 6 -1.</_>\n                <_>10 2 9 3 2.</_>\n                <_>1 5 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0335052385926247</threshold>\n            <left_val>0.5392425060272217</left_val>\n            <right_val>0.3429994881153107</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 1 -1.</_>\n                <_>10 3 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5294460356235504e-003</threshold>\n            <left_val>0.1703713983297348</left_val>\n            <right_val>0.5013315081596375</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 6 -1.</_>\n                <_>15 2 2 3 2.</_>\n                <_>13 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2801629491150379e-003</threshold>\n            <left_val>0.5305461883544922</left_val>\n            <right_val>0.4697405099868774</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.0687388069927692e-003</threshold>\n            <left_val>0.4615545868873596</left_val>\n            <right_val>0.6436504721641541</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 1 3 -1.</_>\n                <_>13 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6880499040707946e-004</threshold>\n            <left_val>0.4833599030971527</left_val>\n            <right_val>0.6043894290924072</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 5 3 -1.</_>\n                <_>2 17 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9647659286856651e-003</threshold>\n            <left_val>0.5187637209892273</left_val>\n            <right_val>0.3231816887855530</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 6 -1.</_>\n                <_>15 2 2 3 2.</_>\n                <_>13 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0220577307045460</threshold>\n            <left_val>0.4079256951808929</left_val>\n            <right_val>0.5200980901718140</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 4 6 -1.</_>\n                <_>3 2 2 3 2.</_>\n                <_>5 5 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6906312713399529e-004</threshold>\n            <left_val>0.5331609249114990</left_val>\n            <right_val>0.3815600872039795</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 1 2 -1.</_>\n                <_>13 6 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7009328631684184e-004</threshold>\n            <left_val>0.5655422210693359</left_val>\n            <right_val>0.4688901901245117</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 2 -1.</_>\n                <_>5 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4284552829340100e-004</threshold>\n            <left_val>0.4534381031990051</left_val>\n            <right_val>0.6287400126457214</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 2 -1.</_>\n                <_>13 9 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2227810695767403e-003</threshold>\n            <left_val>0.5350633263587952</left_val>\n            <right_val>0.3303655982017517</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 2 2 -1.</_>\n                <_>6 9 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4130521602928638e-003</threshold>\n            <left_val>0.1113687008619309</left_val>\n            <right_val>0.5005434751510620</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 17 3 2 -1.</_>\n                <_>13 18 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4520040167553816e-005</threshold>\n            <left_val>0.5628737807273865</left_val>\n            <right_val>0.4325133860111237</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 16 4 4 -1.</_>\n                <_>6 16 2 2 2.</_>\n                <_>8 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3369169502984732e-004</threshold>\n            <left_val>0.4165835082530975</left_val>\n            <right_val>0.5447791218757629</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 3 -1.</_>\n                <_>9 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2894547805190086e-003</threshold>\n            <left_val>0.4860391020774841</left_val>\n            <right_val>0.6778649091720581</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 9 6 -1.</_>\n                <_>0 15 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9103150852024555e-003</threshold>\n            <left_val>0.5262305140495300</left_val>\n            <right_val>0.3612113893032074</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 6 -1.</_>\n                <_>9 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0129005396738648</threshold>\n            <left_val>0.5319377183914185</left_val>\n            <right_val>0.3250288069248200</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 2 3 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6982979401946068e-003</threshold>\n            <left_val>0.4618245065212250</left_val>\n            <right_val>0.6665925979614258</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 18 6 -1.</_>\n                <_>1 12 18 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0104398597031832</threshold>\n            <left_val>0.5505670905113220</left_val>\n            <right_val>0.3883604109287262</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 2 -1.</_>\n                <_>8 12 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0443191062659025e-003</threshold>\n            <left_val>0.4697853028774262</left_val>\n            <right_val>0.7301844954490662</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 9 6 2 -1.</_>\n                <_>7 10 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1593751888722181e-004</threshold>\n            <left_val>0.3830839097499847</left_val>\n            <right_val>0.5464984178543091</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 2 3 -1.</_>\n                <_>8 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4247159492224455e-003</threshold>\n            <left_val>0.2566300034523010</left_val>\n            <right_val>0.5089530944824219</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 5 3 4 -1.</_>\n                <_>18 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3538565561175346e-003</threshold>\n            <left_val>0.6469966173171997</left_val>\n            <right_val>0.4940795898437500</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 19 18 1 -1.</_>\n                <_>7 19 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0523389987647533</threshold>\n            <left_val>0.4745982885360718</left_val>\n            <right_val>0.7878770828247070</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 3 2 -1.</_>\n                <_>10 0 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5765620414167643e-003</threshold>\n            <left_val>0.5306664705276489</left_val>\n            <right_val>0.2748498022556305</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 1 6 -1.</_>\n                <_>1 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1555317845195532e-004</threshold>\n            <left_val>0.5413125753402710</left_val>\n            <right_val>0.4041908979415894</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 17 8 3 -1.</_>\n                <_>12 17 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0105166798457503</threshold>\n            <left_val>0.6158512234687805</left_val>\n            <right_val>0.4815283119678497</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 3 4 -1.</_>\n                <_>1 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7347927726805210e-003</threshold>\n            <left_val>0.4695805907249451</left_val>\n            <right_val>0.7028980851173401</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 3 -1.</_>\n                <_>9 8 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3226778507232666e-003</threshold>\n            <left_val>0.2849566042423248</left_val>\n            <right_val>0.5304684042930603</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 2 -1.</_>\n                <_>7 11 1 1 2.</_>\n                <_>8 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5534399319440126e-003</threshold>\n            <left_val>0.7056984901428223</left_val>\n            <right_val>0.4688892066478729</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 2 5 -1.</_>\n                <_>11 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0268510231981054e-004</threshold>\n            <left_val>0.3902932107448578</left_val>\n            <right_val>0.5573464035987854</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 2 5 -1.</_>\n                <_>8 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1395188570022583e-006</threshold>\n            <left_val>0.3684231936931610</left_val>\n            <right_val>0.5263987779617310</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6711989883333445e-003</threshold>\n            <left_val>0.3849175870418549</left_val>\n            <right_val>0.5387271046638489</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 3 -1.</_>\n                <_>5 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9260449595749378e-003</threshold>\n            <left_val>0.4729771912097931</left_val>\n            <right_val>0.7447251081466675</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 19 15 1 -1.</_>\n                <_>9 19 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3908702209591866e-003</threshold>\n            <left_val>0.4809181094169617</left_val>\n            <right_val>0.5591921806335449</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 19 15 1 -1.</_>\n                <_>6 19 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0177936293184757</threshold>\n            <left_val>0.6903678178787231</left_val>\n            <right_val>0.4676927030086517</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0469669252634048e-003</threshold>\n            <left_val>0.5370690226554871</left_val>\n            <right_val>0.3308162093162537</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 4 15 -1.</_>\n                <_>7 0 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0298914890736341</threshold>\n            <left_val>0.5139865279197693</left_val>\n            <right_val>0.3309059143066406</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 5 -1.</_>\n                <_>9 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5494900289922953e-003</threshold>\n            <left_val>0.4660237133502960</left_val>\n            <right_val>0.6078342795372009</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 7 -1.</_>\n                <_>10 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4956969534978271e-003</threshold>\n            <left_val>0.4404835999011993</left_val>\n            <right_val>0.5863919854164124</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 11 3 3 -1.</_>\n                <_>16 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.5885928021743894e-004</threshold>\n            <left_val>0.5435971021652222</left_val>\n            <right_val>0.4208523035049439</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 3 3 -1.</_>\n                <_>1 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9643701640889049e-004</threshold>\n            <left_val>0.5370578169822693</left_val>\n            <right_val>0.4000622034072876</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 3 -1.</_>\n                <_>6 7 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7280810754746199e-003</threshold>\n            <left_val>0.5659412741661072</left_val>\n            <right_val>0.4259642958641052</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 6 2 -1.</_>\n                <_>0 16 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3026480339467525e-003</threshold>\n            <left_val>0.5161657929420471</left_val>\n            <right_val>0.3350869119167328</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 6 -1.</_>\n                <_>7 0 6 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.2515163123607636</threshold>\n            <left_val>0.4869661927223206</left_val>\n            <right_val>0.7147309780120850</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 4 -1.</_>\n                <_>7 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6328022144734859e-003</threshold>\n            <left_val>0.2727448940277100</left_val>\n            <right_val>0.5083789825439453</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 4 10 -1.</_>\n                <_>16 10 2 5 2.</_>\n                <_>14 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0404344908893108</threshold>\n            <left_val>0.6851438879966736</left_val>\n            <right_val>0.5021767020225525</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 3 2 -1.</_>\n                <_>4 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4972220014897175e-005</threshold>\n            <left_val>0.4284465014934540</left_val>\n            <right_val>0.5522555112838745</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 2 2 -1.</_>\n                <_>11 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4050309730228037e-004</threshold>\n            <left_val>0.4226118922233582</left_val>\n            <right_val>0.5390074849128723</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 4 10 -1.</_>\n                <_>2 10 2 5 2.</_>\n                <_>4 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0236578397452831</threshold>\n            <left_val>0.4744631946086884</left_val>\n            <right_val>0.7504366040229797</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 6 -1.</_>\n                <_>10 13 10 3 2.</_>\n                <_>0 16 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1449104472994804e-003</threshold>\n            <left_val>0.4245058894157410</left_val>\n            <right_val>0.5538362860679627</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 2 15 -1.</_>\n                <_>1 5 1 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6992130335420370e-003</threshold>\n            <left_val>0.5952357053756714</left_val>\n            <right_val>0.4529713094234467</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 18 4 -1.</_>\n                <_>10 7 9 2 2.</_>\n                <_>1 9 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7718601785600185e-003</threshold>\n            <left_val>0.4137794077396393</left_val>\n            <right_val>0.5473399758338928</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 17 -1.</_>\n                <_>1 0 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2669530957937241e-003</threshold>\n            <left_val>0.4484114944934845</left_val>\n            <right_val>0.5797994136810303</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 6 16 6 -1.</_>\n                <_>10 6 8 3 2.</_>\n                <_>2 9 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7791989957913756e-003</threshold>\n            <left_val>0.5624858736991882</left_val>\n            <right_val>0.4432444870471954</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 1 3 -1.</_>\n                <_>8 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6774770338088274e-003</threshold>\n            <left_val>0.4637751877307892</left_val>\n            <right_val>0.6364241838455200</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 2 -1.</_>\n                <_>8 16 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1732629500329494e-003</threshold>\n            <left_val>0.4544503092765808</left_val>\n            <right_val>0.5914415717124939</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 8 2 -1.</_>\n                <_>5 2 4 1 2.</_>\n                <_>9 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6998171173036098e-004</threshold>\n            <left_val>0.5334752798080444</left_val>\n            <right_val>0.3885917961597443</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 6 -1.</_>\n                <_>6 14 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6378340600058436e-004</threshold>\n            <left_val>0.5398585200309753</left_val>\n            <right_val>0.3744941949844360</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 2 -1.</_>\n                <_>9 14 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5684569370932877e-004</threshold>\n            <left_val>0.4317873120307922</left_val>\n            <right_val>0.5614616274833679</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215113703161478</threshold>\n            <left_val>0.1785925030708313</left_val>\n            <right_val>0.5185542702674866</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 2 -1.</_>\n                <_>9 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3081369979772717e-004</threshold>\n            <left_val>0.4342499077320099</left_val>\n            <right_val>0.5682849884033203</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0219920407980680</threshold>\n            <left_val>0.5161716938018799</left_val>\n            <right_val>0.2379394024610519</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 1 3 -1.</_>\n                <_>9 14 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0136500764638186e-004</threshold>\n            <left_val>0.5986763238906860</left_val>\n            <right_val>0.4466426968574524</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2736099138855934e-003</threshold>\n            <left_val>0.4108217954635620</left_val>\n            <right_val>0.5251057147979736</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 2 6 -1.</_>\n                <_>0 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6831789184361696e-003</threshold>\n            <left_val>0.5173814296722412</left_val>\n            <right_val>0.3397518098354340</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 3 -1.</_>\n                <_>9 13 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9525681212544441e-003</threshold>\n            <left_val>0.6888983249664307</left_val>\n            <right_val>0.4845924079418182</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5382299898192286e-003</threshold>\n            <left_val>0.5178567171096802</left_val>\n            <right_val>0.3454113900661469</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 4 3 -1.</_>\n                <_>13 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0140435304492712</threshold>\n            <left_val>0.1678421050310135</left_val>\n            <right_val>0.5188667774200440</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4315890148282051e-003</threshold>\n            <left_val>0.4368256926536560</left_val>\n            <right_val>0.5655773878097534</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 10 6 -1.</_>\n                <_>5 4 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0340142287313938</threshold>\n            <left_val>0.7802296280860901</left_val>\n            <right_val>0.4959217011928558</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 4 3 -1.</_>\n                <_>3 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0120272999629378</threshold>\n            <left_val>0.1585101038217545</left_val>\n            <right_val>0.5032231807708740</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 15 5 -1.</_>\n                <_>8 7 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1331661939620972</threshold>\n            <left_val>0.5163304805755615</left_val>\n            <right_val>0.2755128145217896</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 12 2 -1.</_>\n                <_>7 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5221949433907866e-003</threshold>\n            <left_val>0.3728317916393280</left_val>\n            <right_val>0.5214552283287048</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 3 9 -1.</_>\n                <_>11 3 1 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3929271679371595e-004</threshold>\n            <left_val>0.5838379263877869</left_val>\n            <right_val>0.4511165022850037</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 6 -1.</_>\n                <_>10 6 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0277197398245335</threshold>\n            <left_val>0.4728286862373352</left_val>\n            <right_val>0.7331544756889343</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 4 3 -1.</_>\n                <_>9 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1030150130391121e-003</threshold>\n            <left_val>0.5302202105522156</left_val>\n            <right_val>0.4101563096046448</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 4 9 -1.</_>\n                <_>2 9 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0778612196445465</threshold>\n            <left_val>0.4998334050178528</left_val>\n            <right_val>0.1272961944341660</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 3 5 -1.</_>\n                <_>10 13 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0158549398183823</threshold>\n            <left_val>0.0508333593606949</left_val>\n            <right_val>0.5165656208992004</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 3 -1.</_>\n                <_>9 7 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9725300632417202e-003</threshold>\n            <left_val>0.6798133850097656</left_val>\n            <right_val>0.4684231877326965</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.7676506265997887e-004</threshold>\n            <left_val>0.6010771989822388</left_val>\n            <right_val>0.4788931906223297</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>9 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4647710379213095e-003</threshold>\n            <left_val>0.3393397927284241</left_val>\n            <right_val>0.5220503807067871</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 12 2 -1.</_>\n                <_>9 9 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7937700077891350e-003</threshold>\n            <left_val>0.4365136921405792</left_val>\n            <right_val>0.5239663124084473</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 3 -1.</_>\n                <_>10 6 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0326080210506916</threshold>\n            <left_val>0.5052723884582520</left_val>\n            <right_val>0.2425214946269989</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 3 1 -1.</_>\n                <_>11 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8514421107247472e-004</threshold>\n            <left_val>0.5733973979949951</left_val>\n            <right_val>0.4758574068546295</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 11 15 -1.</_>\n                <_>0 6 11 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0296326000243425</threshold>\n            <left_val>0.3892289102077484</left_val>\n            <right_val>0.5263597965240479</right_val></_></_></trees>\n      <stage_threshold>66.6691207885742190</stage_threshold>\n      <parent>13</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 15 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 6 -1.</_>\n                <_>7 0 6 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0465508513152599</threshold>\n            <left_val>0.3276950120925903</left_val>\n            <right_val>0.6240522861480713</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 1 -1.</_>\n                <_>9 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9537127166986465e-003</threshold>\n            <left_val>0.4256485104560852</left_val>\n            <right_val>0.6942939162254334</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 16 6 4 -1.</_>\n                <_>5 16 3 2 2.</_>\n                <_>8 18 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8221561377868056e-004</threshold>\n            <left_val>0.3711487054824829</left_val>\n            <right_val>0.5900732874870300</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 9 8 -1.</_>\n                <_>6 9 9 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9348249770700932e-004</threshold>\n            <left_val>0.2041133940219879</left_val>\n            <right_val>0.5300545096397400</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 2 6 -1.</_>\n                <_>5 13 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6710508973337710e-004</threshold>\n            <left_val>0.5416126251220703</left_val>\n            <right_val>0.3103179037570953</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 8 10 -1.</_>\n                <_>11 6 4 5 2.</_>\n                <_>7 11 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7818060480058193e-003</threshold>\n            <left_val>0.5277832746505737</left_val>\n            <right_val>0.3467069864273071</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 8 10 -1.</_>\n                <_>5 6 4 5 2.</_>\n                <_>9 11 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6779078547842801e-004</threshold>\n            <left_val>0.5308231115341187</left_val>\n            <right_val>0.3294492065906525</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 2 -1.</_>\n                <_>9 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0335160772665404e-005</threshold>\n            <left_val>0.5773872733116150</left_val>\n            <right_val>0.3852097094058991</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 8 2 -1.</_>\n                <_>5 13 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8038009814918041e-004</threshold>\n            <left_val>0.4317438900470734</left_val>\n            <right_val>0.6150057911872864</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 8 2 -1.</_>\n                <_>10 3 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2553851380944252e-003</threshold>\n            <left_val>0.2933903932571411</left_val>\n            <right_val>0.5324292778968811</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 2 10 -1.</_>\n                <_>4 0 1 5 2.</_>\n                <_>5 5 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4735610350035131e-004</threshold>\n            <left_val>0.5468844771385193</left_val>\n            <right_val>0.3843030035495758</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 2 -1.</_>\n                <_>9 11 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4724259381182492e-004</threshold>\n            <left_val>0.4281542897224426</left_val>\n            <right_val>0.5755587220191956</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 15 3 -1.</_>\n                <_>2 9 15 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1864770203828812e-003</threshold>\n            <left_val>0.3747301101684570</left_val>\n            <right_val>0.5471466183662415</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3936580400913954e-003</threshold>\n            <left_val>0.4537783861160278</left_val>\n            <right_val>0.6111528873443604</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 3 2 -1.</_>\n                <_>8 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5390539774671197e-003</threshold>\n            <left_val>0.2971341907978058</left_val>\n            <right_val>0.5189538002014160</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1968790143728256e-003</threshold>\n            <left_val>0.6699066758155823</left_val>\n            <right_val>0.4726476967334747</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1499789222143590e-004</threshold>\n            <left_val>0.3384954035282135</left_val>\n            <right_val>0.5260317921638489</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 2 3 6 -1.</_>\n                <_>17 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4359830208122730e-003</threshold>\n            <left_val>0.5399122238159180</left_val>\n            <right_val>0.3920140862464905</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 3 4 -1.</_>\n                <_>2 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6606200262904167e-003</threshold>\n            <left_val>0.4482578039169312</left_val>\n            <right_val>0.6119617819786072</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 8 4 6 -1.</_>\n                <_>14 10 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5287200221791863e-003</threshold>\n            <left_val>0.3711237907409668</left_val>\n            <right_val>0.5340266227722168</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 3 8 -1.</_>\n                <_>2 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7397250309586525e-003</threshold>\n            <left_val>0.6031088232994080</left_val>\n            <right_val>0.4455145001411438</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>8 16 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0148291299119592</threshold>\n            <left_val>0.2838754057884216</left_val>\n            <right_val>0.5341861844062805</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 2 2 -1.</_>\n                <_>3 15 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.2275557108223438e-004</threshold>\n            <left_val>0.5209547281265259</left_val>\n            <right_val>0.3361653983592987</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 8 4 6 -1.</_>\n                <_>14 10 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0835298076272011</threshold>\n            <left_val>0.5119969844818115</left_val>\n            <right_val>0.0811644494533539</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 4 6 -1.</_>\n                <_>2 10 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5633148662745953e-004</threshold>\n            <left_val>0.3317120075225830</left_val>\n            <right_val>0.5189831256866455</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 6 -1.</_>\n                <_>10 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8403859883546829e-003</threshold>\n            <left_val>0.5247598290443420</left_val>\n            <right_val>0.2334959059953690</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 3 6 -1.</_>\n                <_>8 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5953830443322659e-003</threshold>\n            <left_val>0.5750094056129456</left_val>\n            <right_val>0.4295622110366821</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 2 6 -1.</_>\n                <_>12 2 1 3 2.</_>\n                <_>11 5 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4766020689858124e-005</threshold>\n            <left_val>0.4342445135116577</left_val>\n            <right_val>0.5564029216766357</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 6 5 -1.</_>\n                <_>8 6 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0298629105091095</threshold>\n            <left_val>0.4579147100448608</left_val>\n            <right_val>0.6579188108444214</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 1 3 6 -1.</_>\n                <_>17 3 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0113255903124809</threshold>\n            <left_val>0.5274311900138855</left_val>\n            <right_val>0.3673888146877289</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7828645482659340e-003</threshold>\n            <left_val>0.7100368738174439</left_val>\n            <right_val>0.4642167091369629</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 18 3 2 -1.</_>\n                <_>10 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3639959767460823e-003</threshold>\n            <left_val>0.5279216170310974</left_val>\n            <right_val>0.2705877125263214</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 18 3 2 -1.</_>\n                <_>9 18 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1804728098213673e-003</threshold>\n            <left_val>0.5072525143623352</left_val>\n            <right_val>0.2449083030223846</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 5 2 -1.</_>\n                <_>12 4 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5668511302210391e-004</threshold>\n            <left_val>0.4283105134963989</left_val>\n            <right_val>0.5548691153526306</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 5 12 -1.</_>\n                <_>7 7 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7140368949621916e-003</threshold>\n            <left_val>0.5519387722015381</left_val>\n            <right_val>0.4103653132915497</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0253042895346880</threshold>\n            <left_val>0.6867002248764038</left_val>\n            <right_val>0.4869889020919800</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 2 2 -1.</_>\n                <_>4 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4454080741852522e-004</threshold>\n            <left_val>0.3728874027729034</left_val>\n            <right_val>0.5287693142890930</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 14 4 2 -1.</_>\n                <_>13 14 2 1 2.</_>\n                <_>11 15 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.3935231668874621e-004</threshold>\n            <left_val>0.6060152053833008</left_val>\n            <right_val>0.4616062045097351</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0172800496220589</threshold>\n            <left_val>0.5049635767936707</left_val>\n            <right_val>0.1819823980331421</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 3 -1.</_>\n                <_>9 8 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3595077954232693e-003</threshold>\n            <left_val>0.1631239950656891</left_val>\n            <right_val>0.5232778787612915</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 1 3 -1.</_>\n                <_>5 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0298109846189618e-003</threshold>\n            <left_val>0.4463278055191040</left_val>\n            <right_val>0.6176549196243286</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 6 1 -1.</_>\n                <_>10 10 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0117109632119536e-003</threshold>\n            <left_val>0.5473384857177734</left_val>\n            <right_val>0.4300698935985565</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 6 1 -1.</_>\n                <_>7 10 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103088002651930</threshold>\n            <left_val>0.1166985034942627</left_val>\n            <right_val>0.5000867247581482</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 3 -1.</_>\n                <_>9 18 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4682018235325813e-003</threshold>\n            <left_val>0.4769287109375000</left_val>\n            <right_val>0.6719213724136353</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 1 3 -1.</_>\n                <_>4 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.1696460731327534e-004</threshold>\n            <left_val>0.3471089899539948</left_val>\n            <right_val>0.5178164839744568</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 3 3 -1.</_>\n                <_>12 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3922820109874010e-003</threshold>\n            <left_val>0.4785236120223999</left_val>\n            <right_val>0.6216310858726502</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 3 -1.</_>\n                <_>4 6 12 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5573818758130074e-003</threshold>\n            <left_val>0.5814796090126038</left_val>\n            <right_val>0.4410085082054138</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 3 -1.</_>\n                <_>9 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7024032361805439e-004</threshold>\n            <left_val>0.3878000080585480</left_val>\n            <right_val>0.5465722084045410</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 3 3 -1.</_>\n                <_>5 9 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7125990539789200e-003</threshold>\n            <left_val>0.1660051047801971</left_val>\n            <right_val>0.4995836019515991</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 9 17 -1.</_>\n                <_>9 0 3 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0103063201531768</threshold>\n            <left_val>0.4093391001224518</left_val>\n            <right_val>0.5274233818054199</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 3 -1.</_>\n                <_>9 13 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0940979011356831e-003</threshold>\n            <left_val>0.6206194758415222</left_val>\n            <right_val>0.4572280049324036</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 15 -1.</_>\n                <_>9 10 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8099051713943481e-003</threshold>\n            <left_val>0.5567759275436401</left_val>\n            <right_val>0.4155600070953369</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 2 3 -1.</_>\n                <_>8 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0746059706434608e-003</threshold>\n            <left_val>0.5638927817344666</left_val>\n            <right_val>0.4353024959564209</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1550289820879698e-003</threshold>\n            <left_val>0.4826265871524811</left_val>\n            <right_val>0.6749758124351502</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 5 -1.</_>\n                <_>9 1 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0317423194646835</threshold>\n            <left_val>0.5048379898071289</left_val>\n            <right_val>0.1883248984813690</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 20 2 -1.</_>\n                <_>0 0 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0783827230334282</threshold>\n            <left_val>0.2369548976421356</left_val>\n            <right_val>0.5260158181190491</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 5 3 -1.</_>\n                <_>2 14 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7415119372308254e-003</threshold>\n            <left_val>0.5048828721046448</left_val>\n            <right_val>0.2776469886302948</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9014600440859795e-003</threshold>\n            <left_val>0.6238604784011841</left_val>\n            <right_val>0.4693317115306854</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 9 15 -1.</_>\n                <_>2 10 9 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6427931152284145e-003</threshold>\n            <left_val>0.3314141929149628</left_val>\n            <right_val>0.5169777274131775</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 12 10 -1.</_>\n                <_>11 0 6 5 2.</_>\n                <_>5 5 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1094966009259224</threshold>\n            <left_val>0.2380045056343079</left_val>\n            <right_val>0.5183441042900085</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 2 3 -1.</_>\n                <_>6 1 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4075913289561868e-005</threshold>\n            <left_val>0.4069635868072510</left_val>\n            <right_val>0.5362150073051453</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 6 1 -1.</_>\n                <_>12 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0593802006915212e-004</threshold>\n            <left_val>0.5506706237792969</left_val>\n            <right_val>0.4374594092369080</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 2 10 -1.</_>\n                <_>3 1 1 5 2.</_>\n                <_>4 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2131777890026569e-004</threshold>\n            <left_val>0.5525709986686707</left_val>\n            <right_val>0.4209375977516174</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 2 1 -1.</_>\n                <_>13 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0276539443293586e-005</threshold>\n            <left_val>0.5455474853515625</left_val>\n            <right_val>0.4748266041278839</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 13 4 6 -1.</_>\n                <_>4 15 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8065142259001732e-003</threshold>\n            <left_val>0.5157995820045471</left_val>\n            <right_val>0.3424577116966248</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 2 1 -1.</_>\n                <_>13 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7202789895236492e-003</threshold>\n            <left_val>0.5013207793235779</left_val>\n            <right_val>0.6331263780593872</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 1 -1.</_>\n                <_>6 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3016929733566940e-004</threshold>\n            <left_val>0.5539718270301819</left_val>\n            <right_val>0.4226869940757752</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 18 4 -1.</_>\n                <_>11 12 9 2 2.</_>\n                <_>2 14 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8016388900578022e-003</threshold>\n            <left_val>0.4425095021724701</left_val>\n            <right_val>0.5430780053138733</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 2 -1.</_>\n                <_>5 7 1 1 2.</_>\n                <_>6 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5399310979992151e-003</threshold>\n            <left_val>0.7145782113075256</left_val>\n            <right_val>0.4697605073451996</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 4 2 -1.</_>\n                <_>16 4 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4278929447755218e-003</threshold>\n            <left_val>0.4070445001125336</left_val>\n            <right_val>0.5399605035781860</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 2 18 -1.</_>\n                <_>0 2 1 9 2.</_>\n                <_>1 11 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0251425504684448</threshold>\n            <left_val>0.7884690761566162</left_val>\n            <right_val>0.4747352004051209</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 4 -1.</_>\n                <_>10 2 9 2 2.</_>\n                <_>1 4 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8899609353393316e-003</threshold>\n            <left_val>0.4296191930770874</left_val>\n            <right_val>0.5577110052108765</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 1 3 -1.</_>\n                <_>9 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3947459198534489e-003</threshold>\n            <left_val>0.4693162143230438</left_val>\n            <right_val>0.7023944258689880</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 18 4 -1.</_>\n                <_>11 12 9 2 2.</_>\n                <_>2 14 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0246784202754498</threshold>\n            <left_val>0.5242322087287903</left_val>\n            <right_val>0.3812510073184967</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 18 4 -1.</_>\n                <_>0 12 9 2 2.</_>\n                <_>9 14 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0380476787686348</threshold>\n            <left_val>0.5011739730834961</left_val>\n            <right_val>0.1687828004360199</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 5 3 -1.</_>\n                <_>11 5 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.9424865543842316e-003</threshold>\n            <left_val>0.4828582108020783</left_val>\n            <right_val>0.6369568109512329</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 7 3 -1.</_>\n                <_>6 5 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5110049862414598e-003</threshold>\n            <left_val>0.5906485915184021</left_val>\n            <right_val>0.4487667977809906</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 17 3 3 -1.</_>\n                <_>13 18 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4201741479337215e-003</threshold>\n            <left_val>0.5241097807884216</left_val>\n            <right_val>0.2990570068359375</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 3 4 -1.</_>\n                <_>9 1 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9802159406244755e-003</threshold>\n            <left_val>0.3041465878486633</left_val>\n            <right_val>0.5078489780426025</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 2 4 -1.</_>\n                <_>11 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4580078944563866e-004</threshold>\n            <left_val>0.4128139019012451</left_val>\n            <right_val>0.5256826281547546</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 9 3 -1.</_>\n                <_>3 17 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0104709500446916</threshold>\n            <left_val>0.5808395147323608</left_val>\n            <right_val>0.4494296014308929</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 2 8 -1.</_>\n                <_>12 0 1 4 2.</_>\n                <_>11 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3369204550981522e-003</threshold>\n            <left_val>0.5246552824974060</left_val>\n            <right_val>0.2658948898315430</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 6 12 -1.</_>\n                <_>0 8 3 6 2.</_>\n                <_>3 14 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0279369000345469</threshold>\n            <left_val>0.4674955010414124</left_val>\n            <right_val>0.7087256908416748</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 4 12 -1.</_>\n                <_>10 13 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4277678504586220e-003</threshold>\n            <left_val>0.5409486889839172</left_val>\n            <right_val>0.3758518099784851</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 8 14 -1.</_>\n                <_>5 10 8 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0235845092684031</threshold>\n            <left_val>0.3758639991283417</left_val>\n            <right_val>0.5238550901412964</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 6 1 -1.</_>\n                <_>14 10 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1452640173956752e-003</threshold>\n            <left_val>0.4329578876495361</left_val>\n            <right_val>0.5804247260093689</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 10 4 -1.</_>\n                <_>0 6 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3468660442158580e-004</threshold>\n            <left_val>0.5280618071556091</left_val>\n            <right_val>0.3873069882392883</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 5 8 -1.</_>\n                <_>10 4 5 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0106485402211547</threshold>\n            <left_val>0.4902113080024719</left_val>\n            <right_val>0.5681251883506775</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 4 8 -1.</_>\n                <_>8 1 2 4 2.</_>\n                <_>10 5 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9418050437234342e-004</threshold>\n            <left_val>0.5570880174636841</left_val>\n            <right_val>0.4318251013755798</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3270479394122958e-004</threshold>\n            <left_val>0.5658439993858337</left_val>\n            <right_val>0.4343554973602295</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 3 4 -1.</_>\n                <_>9 9 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0125510636717081e-003</threshold>\n            <left_val>0.6056739091873169</left_val>\n            <right_val>0.4537523984909058</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 6 -1.</_>\n                <_>18 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4854319635778666e-003</threshold>\n            <left_val>0.5390477180480957</left_val>\n            <right_val>0.4138010144233704</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>9 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8237880431115627e-003</threshold>\n            <left_val>0.4354828894138336</left_val>\n            <right_val>0.5717188715934753</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 13 3 -1.</_>\n                <_>7 2 13 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0166566595435143</threshold>\n            <left_val>0.3010913133621216</left_val>\n            <right_val>0.5216122865676880</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 1 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0349558265879750e-004</threshold>\n            <left_val>0.5300151109695435</left_val>\n            <right_val>0.3818396925926209</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 3 6 -1.</_>\n                <_>12 13 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4170378930866718e-003</threshold>\n            <left_val>0.5328028798103333</left_val>\n            <right_val>0.4241400063037872</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6222729249857366e-004</threshold>\n            <left_val>0.5491728186607361</left_val>\n            <right_val>0.4186977148056030</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 18 10 -1.</_>\n                <_>10 4 9 5 2.</_>\n                <_>1 9 9 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1163002029061317</threshold>\n            <left_val>0.1440722048282623</left_val>\n            <right_val>0.5226451158523560</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 9 -1.</_>\n                <_>8 9 4 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146950101479888</threshold>\n            <left_val>0.7747725248336792</left_val>\n            <right_val>0.4715717136859894</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 3 -1.</_>\n                <_>8 7 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1972130052745342e-003</threshold>\n            <left_val>0.5355433821678162</left_val>\n            <right_val>0.3315644860267639</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6965209185145795e-004</threshold>\n            <left_val>0.5767235159873962</left_val>\n            <right_val>0.4458136856555939</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 15 4 3 -1.</_>\n                <_>14 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5144998952746391e-003</threshold>\n            <left_val>0.5215674042701721</left_val>\n            <right_val>0.3647888898849487</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 3 10 -1.</_>\n                <_>6 10 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0213000606745481</threshold>\n            <left_val>0.4994204938411713</left_val>\n            <right_val>0.1567950993776321</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1881409231573343e-003</threshold>\n            <left_val>0.4742200076580048</left_val>\n            <right_val>0.6287270188331604</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 1 6 -1.</_>\n                <_>0 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0019777417182922e-004</threshold>\n            <left_val>0.5347954034805298</left_val>\n            <right_val>0.3943752050399780</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 1 3 -1.</_>\n                <_>10 16 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1772277802228928e-003</threshold>\n            <left_val>0.6727191805839539</left_val>\n            <right_val>0.5013138055801392</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 4 3 -1.</_>\n                <_>2 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3764649890363216e-003</threshold>\n            <left_val>0.3106675148010254</left_val>\n            <right_val>0.5128793120384216</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 8 -1.</_>\n                <_>19 3 1 4 2.</_>\n                <_>18 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6299960445612669e-003</threshold>\n            <left_val>0.4886310100555420</left_val>\n            <right_val>0.5755215883255005</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 8 -1.</_>\n                <_>0 3 1 4 2.</_>\n                <_>1 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0458688959479332e-003</threshold>\n            <left_val>0.6025794148445129</left_val>\n            <right_val>0.4558076858520508</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 14 10 -1.</_>\n                <_>10 7 7 5 2.</_>\n                <_>3 12 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0694827064871788</threshold>\n            <left_val>0.5240747928619385</left_val>\n            <right_val>0.2185259014368057</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 19 3 -1.</_>\n                <_>0 8 19 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0240489393472672</threshold>\n            <left_val>0.5011867284774780</left_val>\n            <right_val>0.2090622037649155</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 3 3 -1.</_>\n                <_>12 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1095340382307768e-003</threshold>\n            <left_val>0.4866712093353272</left_val>\n            <right_val>0.7108548283576965</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 1 3 -1.</_>\n                <_>0 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2503260513767600e-003</threshold>\n            <left_val>0.3407891094684601</left_val>\n            <right_val>0.5156195163726807</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 6 3 3 -1.</_>\n                <_>12 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0281190043315291e-003</threshold>\n            <left_val>0.5575572252273560</left_val>\n            <right_val>0.4439432024955750</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 3 3 -1.</_>\n                <_>5 7 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.8893622159957886e-003</threshold>\n            <left_val>0.6402000784873962</left_val>\n            <right_val>0.4620442092418671</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 4 2 -1.</_>\n                <_>8 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1094801640138030e-004</threshold>\n            <left_val>0.3766441941261292</left_val>\n            <right_val>0.5448899865150452</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 4 12 -1.</_>\n                <_>8 3 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7686357758939266e-003</threshold>\n            <left_val>0.3318648934364319</left_val>\n            <right_val>0.5133677124977112</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 2 3 -1.</_>\n                <_>13 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8506490159779787e-003</threshold>\n            <left_val>0.4903570115566254</left_val>\n            <right_val>0.6406934857368469</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 20 4 -1.</_>\n                <_>0 12 20 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0997994691133499</threshold>\n            <left_val>0.1536051034927368</left_val>\n            <right_val>0.5015562176704407</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 17 14 -1.</_>\n                <_>2 7 17 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.3512834906578064</threshold>\n            <left_val>0.0588231310248375</left_val>\n            <right_val>0.5174378752708435</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 10 -1.</_>\n                <_>0 0 3 5 2.</_>\n                <_>3 5 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0452445708215237</threshold>\n            <left_val>0.6961488723754883</left_val>\n            <right_val>0.4677872955799103</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 6 4 -1.</_>\n                <_>14 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0714815780520439</threshold>\n            <left_val>0.5167986154556274</left_val>\n            <right_val>0.1038092970848084</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 6 4 -1.</_>\n                <_>3 6 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1895780228078365e-003</threshold>\n            <left_val>0.4273078143596649</left_val>\n            <right_val>0.5532060861587524</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 7 2 -1.</_>\n                <_>13 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.9242651332169771e-004</threshold>\n            <left_val>0.4638943970203400</left_val>\n            <right_val>0.5276389122009277</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 7 2 -1.</_>\n                <_>0 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6788389766588807e-003</threshold>\n            <left_val>0.5301648974418640</left_val>\n            <right_val>0.3932034969329834</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 14 2 -1.</_>\n                <_>13 11 7 1 2.</_>\n                <_>6 12 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2163488902151585e-003</threshold>\n            <left_val>0.5630694031715393</left_val>\n            <right_val>0.4757033884525299</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 2 2 -1.</_>\n                <_>8 5 1 1 2.</_>\n                <_>9 6 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1568699846975505e-004</threshold>\n            <left_val>0.4307535886764526</left_val>\n            <right_val>0.5535702705383301</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 3 -1.</_>\n                <_>13 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2017288766801357e-003</threshold>\n            <left_val>0.1444882005453110</left_val>\n            <right_val>0.5193064212799072</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 3 12 -1.</_>\n                <_>2 1 1 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9081272017210722e-004</threshold>\n            <left_val>0.4384432137012482</left_val>\n            <right_val>0.5593621134757996</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 4 1 3 -1.</_>\n                <_>17 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9605009583756328e-004</threshold>\n            <left_val>0.5340415835380554</left_val>\n            <right_val>0.4705956876277924</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 4 1 3 -1.</_>\n                <_>2 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.2022142335772514e-004</threshold>\n            <left_val>0.5213856101036072</left_val>\n            <right_val>0.3810079097747803</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 1 3 -1.</_>\n                <_>14 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4588572392240167e-004</threshold>\n            <left_val>0.4769414961338043</left_val>\n            <right_val>0.6130738854408264</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 2 3 -1.</_>\n                <_>7 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1698471806012094e-005</threshold>\n            <left_val>0.4245009124279022</left_val>\n            <right_val>0.5429363250732422</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>10 13 2 3 2.</_>\n                <_>8 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1833200007677078e-003</threshold>\n            <left_val>0.5457730889320374</left_val>\n            <right_val>0.4191075861454010</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 1 3 -1.</_>\n                <_>5 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6039671441540122e-004</threshold>\n            <left_val>0.5764588713645935</left_val>\n            <right_val>0.4471659958362579</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 20 -1.</_>\n                <_>16 0 2 20 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0132362395524979</threshold>\n            <left_val>0.6372823119163513</left_val>\n            <right_val>0.4695009887218475</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 2 6 -1.</_>\n                <_>5 1 1 3 2.</_>\n                <_>6 4 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3376701069064438e-004</threshold>\n            <left_val>0.5317873954772949</left_val>\n            <right_val>0.3945829868316650</right_val></_></_></trees>\n      <stage_threshold>67.6989212036132810</stage_threshold>\n      <parent>14</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 16 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 10 4 -1.</_>\n                <_>5 6 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0248471498489380</threshold>\n            <left_val>0.6555516719818115</left_val>\n            <right_val>0.3873311877250671</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 4 12 -1.</_>\n                <_>15 2 2 12 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1348611488938332e-003</threshold>\n            <left_val>0.3748072087764740</left_val>\n            <right_val>0.5973997712135315</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 4 12 -1.</_>\n                <_>7 12 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.4498498104512691e-003</threshold>\n            <left_val>0.5425491929054260</left_val>\n            <right_val>0.2548811137676239</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 1 8 -1.</_>\n                <_>14 9 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3491211039945483e-004</threshold>\n            <left_val>0.2462442070245743</left_val>\n            <right_val>0.5387253761291504</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 14 10 -1.</_>\n                <_>1 4 7 5 2.</_>\n                <_>8 9 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4023890253156424e-003</threshold>\n            <left_val>0.5594322085380554</left_val>\n            <right_val>0.3528657853603363</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 6 6 14 -1.</_>\n                <_>14 6 3 7 2.</_>\n                <_>11 13 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0044000595808029e-004</threshold>\n            <left_val>0.3958503901958466</left_val>\n            <right_val>0.5765938162803650</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 6 14 -1.</_>\n                <_>3 6 3 7 2.</_>\n                <_>6 13 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0042409849120304e-004</threshold>\n            <left_val>0.3698996901512146</left_val>\n            <right_val>0.5534998178482056</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 15 2 -1.</_>\n                <_>9 9 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0841490738093853e-003</threshold>\n            <left_val>0.3711090981960297</left_val>\n            <right_val>0.5547800064086914</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 3 -1.</_>\n                <_>7 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0195372607558966</threshold>\n            <left_val>0.7492755055427551</left_val>\n            <right_val>0.4579297006130219</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 3 14 4 -1.</_>\n                <_>13 3 7 2 2.</_>\n                <_>6 5 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4532740654831287e-006</threshold>\n            <left_val>0.5649787187576294</left_val>\n            <right_val>0.3904069960117340</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 15 2 -1.</_>\n                <_>6 9 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6079459823668003e-003</threshold>\n            <left_val>0.3381088078022003</left_val>\n            <right_val>0.5267801284790039</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 9 -1.</_>\n                <_>6 14 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0697501022368670e-003</threshold>\n            <left_val>0.5519291162490845</left_val>\n            <right_val>0.3714388906955719</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 3 8 -1.</_>\n                <_>8 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6463840408250690e-004</threshold>\n            <left_val>0.5608214735984802</left_val>\n            <right_val>0.4113566875457764</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 6 -1.</_>\n                <_>14 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.5490452582016587e-004</threshold>\n            <left_val>0.3559206128120422</left_val>\n            <right_val>0.5329356193542481</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 6 4 -1.</_>\n                <_>5 7 3 2 2.</_>\n                <_>8 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.8322238773107529e-004</threshold>\n            <left_val>0.5414795875549316</left_val>\n            <right_val>0.3763205111026764</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 19 -1.</_>\n                <_>7 1 6 19 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0199406407773495</threshold>\n            <left_val>0.6347903013229370</left_val>\n            <right_val>0.4705299139022827</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 6 5 -1.</_>\n                <_>4 2 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.7680300883948803e-003</threshold>\n            <left_val>0.3913489878177643</left_val>\n            <right_val>0.5563716292381287</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 17 6 2 -1.</_>\n                <_>12 18 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4528505578637123e-003</threshold>\n            <left_val>0.2554892897605896</left_val>\n            <right_val>0.5215116739273071</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 17 6 2 -1.</_>\n                <_>2 18 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9560849070549011e-003</threshold>\n            <left_val>0.5174679160118103</left_val>\n            <right_val>0.3063920140266419</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>17 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.1078737750649452e-003</threshold>\n            <left_val>0.5388448238372803</left_val>\n            <right_val>0.2885963022708893</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 3 -1.</_>\n                <_>8 18 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8219229532405734e-003</threshold>\n            <left_val>0.4336043000221252</left_val>\n            <right_val>0.5852196812629700</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 13 2 6 -1.</_>\n                <_>10 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0146887395530939</threshold>\n            <left_val>0.5287361741065979</left_val>\n            <right_val>0.2870005965232849</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 6 3 -1.</_>\n                <_>7 14 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0143879903480411</threshold>\n            <left_val>0.7019448876380920</left_val>\n            <right_val>0.4647370874881744</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>17 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0189866498112679</threshold>\n            <left_val>0.2986552119255066</left_val>\n            <right_val>0.5247011780738831</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 2 3 -1.</_>\n                <_>8 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1527639580890536e-003</threshold>\n            <left_val>0.4323473870754242</left_val>\n            <right_val>0.5931661725044251</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 6 2 -1.</_>\n                <_>11 3 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0109336702153087</threshold>\n            <left_val>0.5286864042282105</left_val>\n            <right_val>0.3130319118499756</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 3 6 -1.</_>\n                <_>0 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0149327302351594</threshold>\n            <left_val>0.2658419013023377</left_val>\n            <right_val>0.5084077119827271</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 4 6 -1.</_>\n                <_>8 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9970539617352188e-004</threshold>\n            <left_val>0.5463526844978333</left_val>\n            <right_val>0.3740724027156830</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 3 2 -1.</_>\n                <_>5 6 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1677621193230152e-003</threshold>\n            <left_val>0.4703496992588043</left_val>\n            <right_val>0.7435721755027771</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 3 4 -1.</_>\n                <_>11 1 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3905320130288601e-003</threshold>\n            <left_val>0.2069258987903595</left_val>\n            <right_val>0.5280538201332092</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 5 9 -1.</_>\n                <_>1 5 5 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5029609464108944e-003</threshold>\n            <left_val>0.5182648897171021</left_val>\n            <right_val>0.3483543097972870</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 2 3 -1.</_>\n                <_>13 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.2040365561842918e-003</threshold>\n            <left_val>0.6803777217864990</left_val>\n            <right_val>0.4932360053062439</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 14 3 -1.</_>\n                <_>7 6 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0813272595405579</threshold>\n            <left_val>0.5058398842811585</left_val>\n            <right_val>0.2253051996231079</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 18 8 -1.</_>\n                <_>2 15 18 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1507928073406220</threshold>\n            <left_val>0.2963424921035767</left_val>\n            <right_val>0.5264679789543152</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 2 3 -1.</_>\n                <_>5 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3179009333252907e-003</threshold>\n            <left_val>0.4655495882034302</left_val>\n            <right_val>0.7072932124137878</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 4 2 -1.</_>\n                <_>12 6 2 1 2.</_>\n                <_>10 7 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7402801252901554e-004</threshold>\n            <left_val>0.4780347943305969</left_val>\n            <right_val>0.5668237805366516</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 2 -1.</_>\n                <_>6 6 2 1 2.</_>\n                <_>8 7 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8199541419744492e-004</threshold>\n            <left_val>0.4286996126174927</left_val>\n            <right_val>0.5722156763076782</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 3 4 -1.</_>\n                <_>11 1 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3671570494771004e-003</threshold>\n            <left_val>0.5299307107925415</left_val>\n            <right_val>0.3114621937274933</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 2 7 -1.</_>\n                <_>8 1 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.7018666565418243e-005</threshold>\n            <left_val>0.3674638867378235</left_val>\n            <right_val>0.5269461870193481</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 15 14 -1.</_>\n                <_>4 9 15 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1253408938646317</threshold>\n            <left_val>0.2351492047309876</left_val>\n            <right_val>0.5245791077613831</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>9 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2516269497573376e-003</threshold>\n            <left_val>0.7115936875343323</left_val>\n            <right_val>0.4693767130374908</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 18 4 -1.</_>\n                <_>11 3 9 2 2.</_>\n                <_>2 5 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8342109918594360e-003</threshold>\n            <left_val>0.4462651014328003</left_val>\n            <right_val>0.5409085750579834</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>10 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1310069821774960e-003</threshold>\n            <left_val>0.5945618748664856</left_val>\n            <right_val>0.4417662024497986</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 9 2 3 -1.</_>\n                <_>13 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7601120052859187e-003</threshold>\n            <left_val>0.5353249907493591</left_val>\n            <right_val>0.3973453044891357</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 2 -1.</_>\n                <_>7 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1581249833106995e-004</threshold>\n            <left_val>0.3760268092155457</left_val>\n            <right_val>0.5264726877212524</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 7 -1.</_>\n                <_>9 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8687589112669230e-003</threshold>\n            <left_val>0.6309912800788879</left_val>\n            <right_val>0.4749819934368134</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 2 3 -1.</_>\n                <_>6 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5207129763439298e-003</threshold>\n            <left_val>0.5230181813240051</left_val>\n            <right_val>0.3361223936080933</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 14 18 -1.</_>\n                <_>6 9 14 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.5458673834800720</threshold>\n            <left_val>0.5167139768600464</left_val>\n            <right_val>0.1172635033726692</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 6 3 -1.</_>\n                <_>2 17 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0156501904129982</threshold>\n            <left_val>0.4979439079761505</left_val>\n            <right_val>0.1393294930458069</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 6 -1.</_>\n                <_>10 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0117318602278829</threshold>\n            <left_val>0.7129650712013245</left_val>\n            <right_val>0.4921196103096008</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 4 3 -1.</_>\n                <_>7 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.1765122227370739e-003</threshold>\n            <left_val>0.2288102954626083</left_val>\n            <right_val>0.5049701929092407</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 3 -1.</_>\n                <_>7 13 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2457661107182503e-003</threshold>\n            <left_val>0.4632433950901032</left_val>\n            <right_val>0.6048725843429565</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 3 -1.</_>\n                <_>9 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1915869116783142e-003</threshold>\n            <left_val>0.6467421054840088</left_val>\n            <right_val>0.4602192938327789</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 2 -1.</_>\n                <_>9 12 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0238278806209564</threshold>\n            <left_val>0.1482000946998596</left_val>\n            <right_val>0.5226079225540161</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 4 6 -1.</_>\n                <_>5 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0284580057486892e-003</threshold>\n            <left_val>0.5135489106178284</left_val>\n            <right_val>0.3375957012176514</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 7 2 -1.</_>\n                <_>11 13 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0100788502022624</threshold>\n            <left_val>0.2740561068058014</left_val>\n            <right_val>0.5303567051887512</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 8 6 -1.</_>\n                <_>6 10 4 3 2.</_>\n                <_>10 13 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6168930344283581e-003</threshold>\n            <left_val>0.5332670807838440</left_val>\n            <right_val>0.3972454071044922</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 4 -1.</_>\n                <_>11 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4385367548093200e-004</threshold>\n            <left_val>0.5365604162216187</left_val>\n            <right_val>0.4063411951065064</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 3 -1.</_>\n                <_>9 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3510512225329876e-003</threshold>\n            <left_val>0.4653759002685547</left_val>\n            <right_val>0.6889045834541321</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 3 1 9 -1.</_>\n                <_>13 6 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5274790348485112e-003</threshold>\n            <left_val>0.5449501276016235</left_val>\n            <right_val>0.3624723851680756</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 13 14 6 -1.</_>\n                <_>1 15 14 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0806244164705276</threshold>\n            <left_val>0.1656087040901184</left_val>\n            <right_val>0.5000287294387817</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 1 6 -1.</_>\n                <_>13 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0221920292824507</threshold>\n            <left_val>0.5132731199264526</left_val>\n            <right_val>0.2002808004617691</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 3 8 -1.</_>\n                <_>1 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3100631125271320e-003</threshold>\n            <left_val>0.4617947936058044</left_val>\n            <right_val>0.6366536021232605</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 0 2 18 -1.</_>\n                <_>18 0 1 18 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4063072204589844e-003</threshold>\n            <left_val>0.5916250944137573</left_val>\n            <right_val>0.4867860972881317</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 6 2 -1.</_>\n                <_>2 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.6415040530264378e-004</threshold>\n            <left_val>0.3888409137725830</left_val>\n            <right_val>0.5315797924995422</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 8 6 -1.</_>\n                <_>9 2 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6734489994123578e-004</threshold>\n            <left_val>0.4159064888954163</left_val>\n            <right_val>0.5605279803276062</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 6 -1.</_>\n                <_>6 9 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1474501853808761e-004</threshold>\n            <left_val>0.3089022040367127</left_val>\n            <right_val>0.5120148062705994</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 8 6 3 -1.</_>\n                <_>14 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0105270929634571e-003</threshold>\n            <left_val>0.3972199857234955</left_val>\n            <right_val>0.5207306146621704</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 18 -1.</_>\n                <_>1 0 1 18 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.6909132078289986e-003</threshold>\n            <left_val>0.6257408261299133</left_val>\n            <right_val>0.4608575999736786</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 18 2 -1.</_>\n                <_>10 18 9 1 2.</_>\n                <_>1 19 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0163914598524570</threshold>\n            <left_val>0.2085209935903549</left_val>\n            <right_val>0.5242266058921814</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 2 2 -1.</_>\n                <_>3 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0973909199237823e-004</threshold>\n            <left_val>0.5222427248954773</left_val>\n            <right_val>0.3780320882797241</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 5 3 -1.</_>\n                <_>8 15 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5242289993911982e-003</threshold>\n            <left_val>0.5803927183151245</left_val>\n            <right_val>0.4611890017986298</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 2 3 -1.</_>\n                <_>8 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0945312250405550e-004</threshold>\n            <left_val>0.4401271939277649</left_val>\n            <right_val>0.5846015810966492</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9656419754028320e-003</threshold>\n            <left_val>0.5322325229644775</left_val>\n            <right_val>0.4184590876102448</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 2 -1.</_>\n                <_>9 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6298897834494710e-004</threshold>\n            <left_val>0.3741844892501831</left_val>\n            <right_val>0.5234565734863281</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 5 5 2 -1.</_>\n                <_>15 6 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7946797935292125e-004</threshold>\n            <left_val>0.4631041884422302</left_val>\n            <right_val>0.5356478095054627</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 5 2 -1.</_>\n                <_>0 6 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2856349870562553e-003</threshold>\n            <left_val>0.5044670104980469</left_val>\n            <right_val>0.2377564013004303</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 14 1 6 -1.</_>\n                <_>17 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0174594894051552</threshold>\n            <left_val>0.7289121150970459</left_val>\n            <right_val>0.5050435066223145</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 9 9 3 -1.</_>\n                <_>5 9 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0254217498004436</threshold>\n            <left_val>0.6667134761810303</left_val>\n            <right_val>0.4678100049495697</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 3 3 -1.</_>\n                <_>13 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5647639520466328e-003</threshold>\n            <left_val>0.4391759037971497</left_val>\n            <right_val>0.5323626995086670</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 18 -1.</_>\n                <_>2 0 2 18 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0114443600177765</threshold>\n            <left_val>0.4346440136432648</left_val>\n            <right_val>0.5680012106895447</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 6 1 3 -1.</_>\n                <_>17 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7352550104260445e-004</threshold>\n            <left_val>0.4477140903472900</left_val>\n            <right_val>0.5296812057495117</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 14 1 6 -1.</_>\n                <_>2 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3194209039211273e-003</threshold>\n            <left_val>0.4740200042724609</left_val>\n            <right_val>0.7462607026100159</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>19 8 1 2 -1.</_>\n                <_>19 9 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3328490604180843e-004</threshold>\n            <left_val>0.5365061759948731</left_val>\n            <right_val>0.4752134978771210</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 3 3 -1.</_>\n                <_>6 3 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8815799206495285e-003</threshold>\n            <left_val>0.1752219051122665</left_val>\n            <right_val>0.5015255212783814</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 3 -1.</_>\n                <_>9 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7985680177807808e-003</threshold>\n            <left_val>0.7271236777305603</left_val>\n            <right_val>0.4896200895309448</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 6 1 3 -1.</_>\n                <_>2 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8922499516047537e-004</threshold>\n            <left_val>0.4003908932209015</left_val>\n            <right_val>0.5344941020011902</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 8 2 -1.</_>\n                <_>16 4 4 1 2.</_>\n                <_>12 5 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9288610201328993e-003</threshold>\n            <left_val>0.5605612993240356</left_val>\n            <right_val>0.4803955852985382</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 8 2 -1.</_>\n                <_>0 4 4 1 2.</_>\n                <_>4 5 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4214154630899429e-003</threshold>\n            <left_val>0.4753246903419495</left_val>\n            <right_val>0.7623608708381653</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 18 4 -1.</_>\n                <_>2 18 18 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1655876711010933e-003</threshold>\n            <left_val>0.5393261909484863</left_val>\n            <right_val>0.4191643893718720</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 4 -1.</_>\n                <_>7 17 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8280550981871784e-004</threshold>\n            <left_val>0.4240800142288208</left_val>\n            <right_val>0.5399821996688843</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 14 3 -1.</_>\n                <_>4 1 14 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7186630759388208e-003</threshold>\n            <left_val>0.4244599938392639</left_val>\n            <right_val>0.5424923896789551</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 4 20 -1.</_>\n                <_>2 0 2 20 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0125072300434113</threshold>\n            <left_val>0.5895841717720032</left_val>\n            <right_val>0.4550411105155945</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 4 8 -1.</_>\n                <_>14 4 2 4 2.</_>\n                <_>12 8 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0242865197360516</threshold>\n            <left_val>0.2647134959697723</left_val>\n            <right_val>0.5189179778099060</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 2 2 -1.</_>\n                <_>6 7 1 1 2.</_>\n                <_>7 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9676330741494894e-003</threshold>\n            <left_val>0.7347682714462280</left_val>\n            <right_val>0.4749749898910523</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 2 3 -1.</_>\n                <_>10 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0125289997085929</threshold>\n            <left_val>0.2756049931049347</left_val>\n            <right_val>0.5177599787712097</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>8 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0104000102728605e-003</threshold>\n            <left_val>0.3510560989379883</left_val>\n            <right_val>0.5144724249839783</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 6 12 -1.</_>\n                <_>8 8 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1348530426621437e-003</threshold>\n            <left_val>0.5637925863265991</left_val>\n            <right_val>0.4667319953441620</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 11 12 -1.</_>\n                <_>4 4 11 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0195642597973347</threshold>\n            <left_val>0.4614573121070862</left_val>\n            <right_val>0.6137639880180359</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 9 6 11 -1.</_>\n                <_>16 9 2 11 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0971463471651077</threshold>\n            <left_val>0.2998378872871399</left_val>\n            <right_val>0.5193555951118469</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 4 3 -1.</_>\n                <_>0 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5014568604528904e-003</threshold>\n            <left_val>0.5077884793281555</left_val>\n            <right_val>0.3045755922794342</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 3 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3706971704959869e-003</threshold>\n            <left_val>0.4861018955707550</left_val>\n            <right_val>0.6887500882148743</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 3 2 -1.</_>\n                <_>5 12 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0721528977155685e-003</threshold>\n            <left_val>0.1673395931720734</left_val>\n            <right_val>0.5017563104629517</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 3 3 -1.</_>\n                <_>10 15 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3537208586931229e-003</threshold>\n            <left_val>0.2692756950855255</left_val>\n            <right_val>0.5242633223533630</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 4 -1.</_>\n                <_>9 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0109328404068947</threshold>\n            <left_val>0.7183864116668701</left_val>\n            <right_val>0.4736028909683228</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 3 3 -1.</_>\n                <_>10 15 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2356072962284088e-003</threshold>\n            <left_val>0.5223966836929321</left_val>\n            <right_val>0.2389862984418869</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 2 -1.</_>\n                <_>8 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0038160253316164e-003</threshold>\n            <left_val>0.5719355940818787</left_val>\n            <right_val>0.4433943033218384</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 16 4 -1.</_>\n                <_>10 10 8 2 2.</_>\n                <_>2 12 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0859128348529339e-003</threshold>\n            <left_val>0.5472841858863831</left_val>\n            <right_val>0.4148836135864258</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 4 17 -1.</_>\n                <_>4 3 2 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1548541933298111</threshold>\n            <left_val>0.4973812103271484</left_val>\n            <right_val>0.0610615983605385</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 7 -1.</_>\n                <_>15 13 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0897459762636572e-004</threshold>\n            <left_val>0.4709174036979675</left_val>\n            <right_val>0.5423889160156250</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 6 1 -1.</_>\n                <_>5 2 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3316991175524890e-004</threshold>\n            <left_val>0.4089626967906952</left_val>\n            <right_val>0.5300992131233215</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 12 4 -1.</_>\n                <_>9 2 4 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0108134001493454</threshold>\n            <left_val>0.6104369759559631</left_val>\n            <right_val>0.4957334101200104</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0456560105085373</threshold>\n            <left_val>0.5069689154624939</left_val>\n            <right_val>0.2866660058498383</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 2 2 -1.</_>\n                <_>14 7 1 1 2.</_>\n                <_>13 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2569549726322293e-003</threshold>\n            <left_val>0.4846917092800140</left_val>\n            <right_val>0.6318171024322510</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 12 20 6 -1.</_>\n                <_>0 14 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1201507002115250</threshold>\n            <left_val>0.0605261400341988</left_val>\n            <right_val>0.4980959892272949</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 2 3 -1.</_>\n                <_>14 7 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0533799650147557e-004</threshold>\n            <left_val>0.5363109707832336</left_val>\n            <right_val>0.4708042144775391</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 9 12 -1.</_>\n                <_>3 8 3 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2070319056510925</threshold>\n            <left_val>0.0596603304147720</left_val>\n            <right_val>0.4979098141193390</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 16 2 -1.</_>\n                <_>3 0 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2909180077258497e-004</threshold>\n            <left_val>0.4712977111339569</left_val>\n            <right_val>0.5377997756004334</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 3 3 -1.</_>\n                <_>6 16 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.8818528992123902e-004</threshold>\n            <left_val>0.4363538026809692</left_val>\n            <right_val>0.5534191131591797</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 6 3 -1.</_>\n                <_>8 16 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9243610333651304e-003</threshold>\n            <left_val>0.5811185836791992</left_val>\n            <right_val>0.4825215935707092</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 1 6 -1.</_>\n                <_>0 12 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3882332546636462e-004</threshold>\n            <left_val>0.5311700105667114</left_val>\n            <right_val>0.4038138985633850</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 4 3 -1.</_>\n                <_>10 10 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9061550265178084e-003</threshold>\n            <left_val>0.3770701885223389</left_val>\n            <right_val>0.5260015130043030</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 2 3 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9514348655939102e-003</threshold>\n            <left_val>0.4766167998313904</left_val>\n            <right_val>0.7682183980941773</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 1 -1.</_>\n                <_>5 7 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130834598094225</threshold>\n            <left_val>0.5264462828636169</left_val>\n            <right_val>0.3062222003936768</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 12 19 -1.</_>\n                <_>10 0 6 19 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2115933001041412</threshold>\n            <left_val>0.6737198233604431</left_val>\n            <right_val>0.4695810079574585</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 20 6 -1.</_>\n                <_>10 6 10 3 2.</_>\n                <_>0 9 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1493250280618668e-003</threshold>\n            <left_val>0.5644835233688355</left_val>\n            <right_val>0.4386953115463257</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 2 2 -1.</_>\n                <_>3 6 1 1 2.</_>\n                <_>4 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9754100725986063e-004</threshold>\n            <left_val>0.4526061117649078</left_val>\n            <right_val>0.5895630121231079</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 6 2 2 -1.</_>\n                <_>16 6 1 1 2.</_>\n                <_>15 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3814480043947697e-003</threshold>\n            <left_val>0.6070582270622253</left_val>\n            <right_val>0.4942413866519928</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 2 2 -1.</_>\n                <_>3 6 1 1 2.</_>\n                <_>4 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8122188784182072e-004</threshold>\n            <left_val>0.5998213291168213</left_val>\n            <right_val>0.4508252143859863</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 1 12 -1.</_>\n                <_>14 10 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3905329871922731e-003</threshold>\n            <left_val>0.4205588996410370</left_val>\n            <right_val>0.5223848223686218</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 16 10 -1.</_>\n                <_>2 5 8 5 2.</_>\n                <_>10 10 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0272689294070005</threshold>\n            <left_val>0.5206447243690491</left_val>\n            <right_val>0.3563301861286163</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7658358924090862e-003</threshold>\n            <left_val>0.3144704103469849</left_val>\n            <right_val>0.5218814015388489</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 2 2 -1.</_>\n                <_>1 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4903489500284195e-003</threshold>\n            <left_val>0.3380196094512940</left_val>\n            <right_val>0.5124437212944031</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 15 5 -1.</_>\n                <_>10 0 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0174282304942608</threshold>\n            <left_val>0.5829960703849793</left_val>\n            <right_val>0.4919725954532623</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 15 5 -1.</_>\n                <_>5 0 5 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0152780301868916</threshold>\n            <left_val>0.6163144707679749</left_val>\n            <right_val>0.4617887139320374</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 2 17 -1.</_>\n                <_>11 2 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0319956094026566</threshold>\n            <left_val>0.5166357159614563</left_val>\n            <right_val>0.1712764054536820</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 2 17 -1.</_>\n                <_>8 2 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8256710395216942e-003</threshold>\n            <left_val>0.3408012092113495</left_val>\n            <right_val>0.5131387710571289</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 2 9 -1.</_>\n                <_>15 11 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5186436772346497e-003</threshold>\n            <left_val>0.6105518937110901</left_val>\n            <right_val>0.4997941851615906</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 2 9 -1.</_>\n                <_>4 11 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0641621500253677e-004</threshold>\n            <left_val>0.4327270984649658</left_val>\n            <right_val>0.5582311153411865</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 16 14 4 -1.</_>\n                <_>5 16 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0103448498994112</threshold>\n            <left_val>0.4855653047561646</left_val>\n            <right_val>0.5452420115470886</right_val></_></_></trees>\n      <stage_threshold>69.2298736572265630</stage_threshold>\n      <parent>15</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 17 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 18 1 -1.</_>\n                <_>7 4 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8981826081871986e-003</threshold>\n            <left_val>0.3332524895668030</left_val>\n            <right_val>0.5946462154388428</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 7 6 4 -1.</_>\n                <_>16 7 3 2 2.</_>\n                <_>13 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6170160379260778e-003</threshold>\n            <left_val>0.3490641117095947</left_val>\n            <right_val>0.5577868819236755</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 12 -1.</_>\n                <_>9 12 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5449741194024682e-004</threshold>\n            <left_val>0.5542566180229187</left_val>\n            <right_val>0.3291530013084412</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 6 6 -1.</_>\n                <_>12 3 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5428980113938451e-003</threshold>\n            <left_val>0.3612579107284546</left_val>\n            <right_val>0.5545979142189026</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 6 6 -1.</_>\n                <_>5 2 3 3 2.</_>\n                <_>8 5 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0329450014978647e-003</threshold>\n            <left_val>0.3530139029026032</left_val>\n            <right_val>0.5576140284538269</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 6 4 -1.</_>\n                <_>12 16 3 2 2.</_>\n                <_>9 18 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7698158565908670e-004</threshold>\n            <left_val>0.3916778862476349</left_val>\n            <right_val>0.5645321011543274</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 3 -1.</_>\n                <_>7 2 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1432030051946640</threshold>\n            <left_val>0.4667482078075409</left_val>\n            <right_val>0.7023633122444153</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 9 10 -1.</_>\n                <_>7 9 9 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3866490274667740e-003</threshold>\n            <left_val>0.3073684871196747</left_val>\n            <right_val>0.5289257764816284</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 4 4 -1.</_>\n                <_>7 9 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2936742324382067e-004</threshold>\n            <left_val>0.5622118115425110</left_val>\n            <right_val>0.4037049114704132</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 3 6 -1.</_>\n                <_>11 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8893528552725911e-004</threshold>\n            <left_val>0.5267661213874817</left_val>\n            <right_val>0.3557874858379364</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 5 3 -1.</_>\n                <_>7 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0122280502691865</threshold>\n            <left_val>0.6668320894241333</left_val>\n            <right_val>0.4625549912452698</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 6 6 -1.</_>\n                <_>10 11 3 3 2.</_>\n                <_>7 14 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5420239437371492e-003</threshold>\n            <left_val>0.5521438121795654</left_val>\n            <right_val>0.3869673013687134</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 10 9 -1.</_>\n                <_>0 3 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0585320414975286e-003</threshold>\n            <left_val>0.3628678023815155</left_val>\n            <right_val>0.5320926904678345</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 1 6 -1.</_>\n                <_>13 16 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4935660146875307e-005</threshold>\n            <left_val>0.4632444977760315</left_val>\n            <right_val>0.5363323092460632</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.2537708543241024e-003</threshold>\n            <left_val>0.5132231712341309</left_val>\n            <right_val>0.3265708982944489</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2338023930788040e-003</threshold>\n            <left_val>0.6693689823150635</left_val>\n            <right_val>0.4774140119552612</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 1 6 -1.</_>\n                <_>6 16 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1866810129722580e-005</threshold>\n            <left_val>0.4053862094879150</left_val>\n            <right_val>0.5457931160926819</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 2 3 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8150229956954718e-003</threshold>\n            <left_val>0.6454995870590210</left_val>\n            <right_val>0.4793178141117096</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 3 3 -1.</_>\n                <_>7 4 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1105879675596952e-003</threshold>\n            <left_val>0.5270407199859619</left_val>\n            <right_val>0.3529678881168366</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 11 3 -1.</_>\n                <_>9 1 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7707689702510834e-003</threshold>\n            <left_val>0.3803547024726868</left_val>\n            <right_val>0.5352957844734192</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 20 3 -1.</_>\n                <_>0 7 20 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0158339068293571e-003</threshold>\n            <left_val>0.5339403152465820</left_val>\n            <right_val>0.3887133002281189</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 1 2 -1.</_>\n                <_>10 2 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5453689098358154e-004</threshold>\n            <left_val>0.3564616143703461</left_val>\n            <right_val>0.5273603796958923</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 6 -1.</_>\n                <_>10 6 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0110505102202296</threshold>\n            <left_val>0.4671907126903534</left_val>\n            <right_val>0.6849737763404846</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 8 12 1 -1.</_>\n                <_>9 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0426058396697044</threshold>\n            <left_val>0.5151473283767700</left_val>\n            <right_val>0.0702200904488564</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 8 12 1 -1.</_>\n                <_>7 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0781750101596117e-003</threshold>\n            <left_val>0.3041661083698273</left_val>\n            <right_val>0.5152602195739746</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 5 -1.</_>\n                <_>10 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4815728217363358e-003</threshold>\n            <left_val>0.6430295705795288</left_val>\n            <right_val>0.4897229969501495</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 9 6 2 -1.</_>\n                <_>6 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1881860923022032e-003</threshold>\n            <left_val>0.5307493209838867</left_val>\n            <right_val>0.3826209902763367</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5947180003859103e-004</threshold>\n            <left_val>0.4650047123432159</left_val>\n            <right_val>0.5421904921531677</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 1 -1.</_>\n                <_>9 0 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0705031715333462e-003</threshold>\n            <left_val>0.2849679887294769</left_val>\n            <right_val>0.5079116225242615</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0145941702648997</threshold>\n            <left_val>0.2971645891666412</left_val>\n            <right_val>0.5128461718559265</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 2 1 -1.</_>\n                <_>8 10 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1947689927183092e-004</threshold>\n            <left_val>0.5631098151206970</left_val>\n            <right_val>0.4343082010746002</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 9 13 -1.</_>\n                <_>9 4 3 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9344649091362953e-004</threshold>\n            <left_val>0.4403578042984009</left_val>\n            <right_val>0.5359959006309509</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 4 2 -1.</_>\n                <_>6 9 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4834799912932795e-005</threshold>\n            <left_val>0.3421008884906769</left_val>\n            <right_val>0.5164697766304016</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 6 -1.</_>\n                <_>16 2 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0296985581517220e-003</threshold>\n            <left_val>0.4639343023300171</left_val>\n            <right_val>0.6114075183868408</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 6 3 -1.</_>\n                <_>0 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0640818923711777e-003</threshold>\n            <left_val>0.2820158898830414</left_val>\n            <right_val>0.5075494050979614</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 3 10 -1.</_>\n                <_>10 15 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0260621197521687</threshold>\n            <left_val>0.5208905935287476</left_val>\n            <right_val>0.2688778042793274</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 5 -1.</_>\n                <_>9 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0173146594315767</threshold>\n            <left_val>0.4663713872432709</left_val>\n            <right_val>0.6738539934158325</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 4 4 3 -1.</_>\n                <_>10 4 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0226666405797005</threshold>\n            <left_val>0.5209349989891052</left_val>\n            <right_val>0.2212723940610886</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 3 8 -1.</_>\n                <_>9 4 1 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1965929772704840e-003</threshold>\n            <left_val>0.6063101291656494</left_val>\n            <right_val>0.4538190066814423</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 9 13 -1.</_>\n                <_>9 6 3 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.5282476395368576e-003</threshold>\n            <left_val>0.4635204970836639</left_val>\n            <right_val>0.5247430801391602</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0943619832396507e-003</threshold>\n            <left_val>0.5289440155029297</left_val>\n            <right_val>0.3913882076740265</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 8 -1.</_>\n                <_>16 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0728773325681686</threshold>\n            <left_val>0.7752001881599426</left_val>\n            <right_val>0.4990234971046448</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 6 -1.</_>\n                <_>7 0 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9009521976113319e-003</threshold>\n            <left_val>0.2428039014339447</left_val>\n            <right_val>0.5048090219497681</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 8 -1.</_>\n                <_>16 2 2 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0113082397729158</threshold>\n            <left_val>0.5734364986419678</left_val>\n            <right_val>0.4842376112937927</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 6 6 -1.</_>\n                <_>0 8 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0596132017672062</threshold>\n            <left_val>0.5029836297035217</left_val>\n            <right_val>0.2524977028369904</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 6 2 -1.</_>\n                <_>12 12 3 1 2.</_>\n                <_>9 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8624620754271746e-003</threshold>\n            <left_val>0.6073045134544373</left_val>\n            <right_val>0.4898459911346436</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 2 -1.</_>\n                <_>9 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4781449250876904e-003</threshold>\n            <left_val>0.5015289187431335</left_val>\n            <right_val>0.2220316976308823</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 6 2 2 -1.</_>\n                <_>12 6 1 1 2.</_>\n                <_>11 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7513240454718471e-003</threshold>\n            <left_val>0.6614428758621216</left_val>\n            <right_val>0.4933868944644928</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 2 -1.</_>\n                <_>7 9 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0401634201407433</threshold>\n            <left_val>0.5180878043174744</left_val>\n            <right_val>0.3741044998168945</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 6 2 2 -1.</_>\n                <_>12 6 1 1 2.</_>\n                <_>11 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4768949262797832e-004</threshold>\n            <left_val>0.4720416963100433</left_val>\n            <right_val>0.5818032026290894</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 12 8 -1.</_>\n                <_>7 4 4 8 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6551650371402502e-003</threshold>\n            <left_val>0.3805010914802551</left_val>\n            <right_val>0.5221335887908936</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 5 3 -1.</_>\n                <_>13 12 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.7706279009580612e-003</threshold>\n            <left_val>0.2944166064262390</left_val>\n            <right_val>0.5231295228004456</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 3 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5122091434895992e-003</threshold>\n            <left_val>0.7346177101135254</left_val>\n            <right_val>0.4722816944122315</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 2 3 -1.</_>\n                <_>14 7 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8672042107209563e-004</threshold>\n            <left_val>0.5452876091003418</left_val>\n            <right_val>0.4242413043975830</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 1 3 -1.</_>\n                <_>5 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6019669864326715e-004</threshold>\n            <left_val>0.4398862123489380</left_val>\n            <right_val>0.5601285099983215</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 2 3 -1.</_>\n                <_>13 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4143769405782223e-003</threshold>\n            <left_val>0.4741686880588532</left_val>\n            <right_val>0.6136621832847595</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 2 3 -1.</_>\n                <_>5 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5680900542065501e-003</threshold>\n            <left_val>0.6044552922248840</left_val>\n            <right_val>0.4516409933567047</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 3 -1.</_>\n                <_>9 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6827491130679846e-003</threshold>\n            <left_val>0.2452459037303925</left_val>\n            <right_val>0.5294982194900513</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 2 2 -1.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9409190756268799e-004</threshold>\n            <left_val>0.3732838034629822</left_val>\n            <right_val>0.5251451134681702</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 4 -1.</_>\n                <_>15 16 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.2847759323194623e-004</threshold>\n            <left_val>0.5498809814453125</left_val>\n            <right_val>0.4065535068511963</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 2 -1.</_>\n                <_>3 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8817070201039314e-003</threshold>\n            <left_val>0.2139908969402313</left_val>\n            <right_val>0.4999957084655762</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 15 2 2 -1.</_>\n                <_>13 15 1 1 2.</_>\n                <_>12 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7272020815871656e-004</threshold>\n            <left_val>0.4650287032127380</left_val>\n            <right_val>0.5813428759574890</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 2 -1.</_>\n                <_>9 14 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0947199664078653e-004</threshold>\n            <left_val>0.4387486875057221</left_val>\n            <right_val>0.5572792887687683</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 14 9 -1.</_>\n                <_>4 14 14 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0485011897981167</threshold>\n            <left_val>0.5244972705841065</left_val>\n            <right_val>0.3212889134883881</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 4 3 -1.</_>\n                <_>7 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5166411437094212e-003</threshold>\n            <left_val>0.6056813001632690</left_val>\n            <right_val>0.4545882046222687</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 14 1 4 -1.</_>\n                <_>15 16 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0122916800901294</threshold>\n            <left_val>0.2040929049253464</left_val>\n            <right_val>0.5152214169502258</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 1 4 -1.</_>\n                <_>4 16 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8549679922871292e-004</threshold>\n            <left_val>0.5237604975700378</left_val>\n            <right_val>0.3739503026008606</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 13 -1.</_>\n                <_>16 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0305560491979122</threshold>\n            <left_val>0.4960533976554871</left_val>\n            <right_val>0.5938246250152588</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 2 12 -1.</_>\n                <_>4 1 1 6 2.</_>\n                <_>5 7 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5105320198927075e-004</threshold>\n            <left_val>0.5351303815841675</left_val>\n            <right_val>0.4145204126834869</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 14 6 6 -1.</_>\n                <_>14 14 3 3 2.</_>\n                <_>11 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4937440175563097e-003</threshold>\n            <left_val>0.4693366885185242</left_val>\n            <right_val>0.5514941215515137</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 6 6 -1.</_>\n                <_>3 14 3 3 2.</_>\n                <_>6 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0123821301385760</threshold>\n            <left_val>0.6791396737098694</left_val>\n            <right_val>0.4681667983531952</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 17 3 2 -1.</_>\n                <_>14 18 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1333461888134480e-003</threshold>\n            <left_val>0.3608739078044891</left_val>\n            <right_val>0.5229160189628601</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 17 3 2 -1.</_>\n                <_>3 18 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1919277757406235e-004</threshold>\n            <left_val>0.5300073027610779</left_val>\n            <right_val>0.3633613884449005</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 13 -1.</_>\n                <_>16 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1506042033433914</threshold>\n            <left_val>0.5157316923141480</left_val>\n            <right_val>0.2211782038211823</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 6 13 -1.</_>\n                <_>2 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7144149690866470e-003</threshold>\n            <left_val>0.4410496950149536</left_val>\n            <right_val>0.5776609182357788</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 7 6 -1.</_>\n                <_>10 12 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4443522393703461e-003</threshold>\n            <left_val>0.5401855111122131</left_val>\n            <right_val>0.3756650090217590</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 15 2 2 -1.</_>\n                <_>6 15 1 1 2.</_>\n                <_>7 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5006249779835343e-004</threshold>\n            <left_val>0.4368270933628082</left_val>\n            <right_val>0.5607374906539917</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 6 -1.</_>\n                <_>10 11 4 3 2.</_>\n                <_>6 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3077150583267212e-003</threshold>\n            <left_val>0.4244799017906189</left_val>\n            <right_val>0.5518230795860291</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 2 2 -1.</_>\n                <_>7 6 1 1 2.</_>\n                <_>8 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4048910755664110e-004</threshold>\n            <left_val>0.4496962130069733</left_val>\n            <right_val>0.5900576710700989</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 16 6 -1.</_>\n                <_>10 2 8 3 2.</_>\n                <_>2 5 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0440920516848564</threshold>\n            <left_val>0.5293493270874023</left_val>\n            <right_val>0.3156355023384094</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3639909233897924e-003</threshold>\n            <left_val>0.4483296871185303</left_val>\n            <right_val>0.5848662257194519</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 7 3 10 -1.</_>\n                <_>11 12 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9760079234838486e-003</threshold>\n            <left_val>0.4559507071971893</left_val>\n            <right_val>0.5483639240264893</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 3 10 -1.</_>\n                <_>6 12 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7716930489987135e-003</threshold>\n            <left_val>0.5341786146163940</left_val>\n            <right_val>0.3792484104633331</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4123019829858094e-004</threshold>\n            <left_val>0.5667188763618469</left_val>\n            <right_val>0.4576973021030426</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9425667384639382e-004</threshold>\n            <left_val>0.4421244859695435</left_val>\n            <right_val>0.5628787279129028</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 1 1 3 -1.</_>\n                <_>10 2 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8876468897797167e-004</threshold>\n            <left_val>0.4288370907306671</left_val>\n            <right_val>0.5391063094139099</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 4 18 -1.</_>\n                <_>1 2 2 9 2.</_>\n                <_>3 11 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0500488989055157</threshold>\n            <left_val>0.6899513006210327</left_val>\n            <right_val>0.4703742861747742</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 4 12 -1.</_>\n                <_>12 10 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0366354808211327</threshold>\n            <left_val>0.2217779010534287</left_val>\n            <right_val>0.5191826224327087</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 1 6 -1.</_>\n                <_>0 2 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4273579474538565e-003</threshold>\n            <left_val>0.5136224031448364</left_val>\n            <right_val>0.3497397899627686</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9558030180633068e-003</threshold>\n            <left_val>0.4826192855834961</left_val>\n            <right_val>0.6408380866050720</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 4 3 -1.</_>\n                <_>8 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.7494610510766506e-003</threshold>\n            <left_val>0.3922835886478424</left_val>\n            <right_val>0.5272685289382935</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0139550799503922</threshold>\n            <left_val>0.5078201889991760</left_val>\n            <right_val>0.8416504859924316</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 2 -1.</_>\n                <_>8 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1896739781368524e-004</threshold>\n            <left_val>0.5520489811897278</left_val>\n            <right_val>0.4314234852790833</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 1 -1.</_>\n                <_>11 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5131309628486633e-003</threshold>\n            <left_val>0.3934605121612549</left_val>\n            <right_val>0.5382571220397949</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 2 3 -1.</_>\n                <_>9 7 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3622800149023533e-003</threshold>\n            <left_val>0.7370628714561462</left_val>\n            <right_val>0.4736475944519043</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 8 6 -1.</_>\n                <_>16 7 4 3 2.</_>\n                <_>12 10 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0651605874300003</threshold>\n            <left_val>0.5159279704093933</left_val>\n            <right_val>0.3281595110893250</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 8 6 -1.</_>\n                <_>0 7 4 3 2.</_>\n                <_>4 10 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3567399475723505e-003</threshold>\n            <left_val>0.3672826886177063</left_val>\n            <right_val>0.5172886252403259</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 2 2 10 -1.</_>\n                <_>19 2 1 5 2.</_>\n                <_>18 7 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0151466596871614</threshold>\n            <left_val>0.5031493902206421</left_val>\n            <right_val>0.6687604188919067</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 4 -1.</_>\n                <_>3 2 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0228509604930878</threshold>\n            <left_val>0.6767519712448120</left_val>\n            <right_val>0.4709596931934357</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 1 -1.</_>\n                <_>11 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8867650330066681e-003</threshold>\n            <left_val>0.5257998108863831</left_val>\n            <right_val>0.4059878885746002</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 15 2 2 -1.</_>\n                <_>7 15 1 1 2.</_>\n                <_>8 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7619599821045995e-003</threshold>\n            <left_val>0.4696272909641266</left_val>\n            <right_val>0.6688278913497925</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 13 1 6 -1.</_>\n                <_>11 16 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2942519970238209e-003</threshold>\n            <left_val>0.4320712983608246</left_val>\n            <right_val>0.5344281792640686</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 1 6 -1.</_>\n                <_>8 16 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0109299495816231</threshold>\n            <left_val>0.4997706115245819</left_val>\n            <right_val>0.1637486070394516</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 2 1 -1.</_>\n                <_>14 3 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9958489903947338e-005</threshold>\n            <left_val>0.4282417893409729</left_val>\n            <right_val>0.5633224248886108</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 2 3 -1.</_>\n                <_>8 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5884361974895000e-003</threshold>\n            <left_val>0.6772121191024780</left_val>\n            <right_val>0.4700526893138886</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 15 7 4 -1.</_>\n                <_>12 17 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2527779694646597e-003</threshold>\n            <left_val>0.5313397049903870</left_val>\n            <right_val>0.4536148905754089</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 12 3 -1.</_>\n                <_>4 15 12 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0435739792883396e-003</threshold>\n            <left_val>0.5660061836242676</left_val>\n            <right_val>0.4413388967514038</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 3 2 -1.</_>\n                <_>11 3 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2523540062829852e-003</threshold>\n            <left_val>0.3731913864612579</left_val>\n            <right_val>0.5356451869010925</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 2 -1.</_>\n                <_>4 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9246719602961093e-004</threshold>\n            <left_val>0.5189986228942871</left_val>\n            <right_val>0.3738811016082764</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 4 6 -1.</_>\n                <_>10 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0385896712541580</threshold>\n            <left_val>0.2956373989582062</left_val>\n            <right_val>0.5188810825347900</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 2 2 -1.</_>\n                <_>7 13 1 1 2.</_>\n                <_>8 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5489870565943420e-004</threshold>\n            <left_val>0.4347135126590729</left_val>\n            <right_val>0.5509533286094666</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 14 4 -1.</_>\n                <_>11 11 7 2 2.</_>\n                <_>4 13 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0337638482451439</threshold>\n            <left_val>0.3230330049991608</left_val>\n            <right_val>0.5195475816726685</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 18 2 -1.</_>\n                <_>7 18 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2657067105174065e-003</threshold>\n            <left_val>0.5975489020347595</left_val>\n            <right_val>0.4552114009857178</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 18 2 2 -1.</_>\n                <_>12 18 1 1 2.</_>\n                <_>11 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4481440302915871e-005</threshold>\n            <left_val>0.4745678007602692</left_val>\n            <right_val>0.5497426986694336</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 18 2 2 -1.</_>\n                <_>7 18 1 1 2.</_>\n                <_>8 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4951299817766994e-005</threshold>\n            <left_val>0.4324473142623901</left_val>\n            <right_val>0.5480644106864929</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 18 8 2 -1.</_>\n                <_>12 19 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0187417995184660</threshold>\n            <left_val>0.1580052971839905</left_val>\n            <right_val>0.5178533196449280</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 2 -1.</_>\n                <_>7 15 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7572239739820361e-003</threshold>\n            <left_val>0.4517636895179749</left_val>\n            <right_val>0.5773764252662659</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 8 -1.</_>\n                <_>10 12 2 4 2.</_>\n                <_>8 16 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1391119118779898e-003</threshold>\n            <left_val>0.4149647951126099</left_val>\n            <right_val>0.5460842251777649</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 3 3 -1.</_>\n                <_>4 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6656779381446540e-005</threshold>\n            <left_val>0.4039090871810913</left_val>\n            <right_val>0.5293084979057312</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 6 2 -1.</_>\n                <_>9 10 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7743421532213688e-003</threshold>\n            <left_val>0.4767651855945587</left_val>\n            <right_val>0.6121956110000610</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 4 15 -1.</_>\n                <_>7 0 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3868161998689175e-003</threshold>\n            <left_val>0.3586258888244629</left_val>\n            <right_val>0.5187280774116516</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 12 14 -1.</_>\n                <_>12 6 4 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0140409301966429</threshold>\n            <left_val>0.4712139964103699</left_val>\n            <right_val>0.5576155781745911</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 16 3 3 -1.</_>\n                <_>5 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5258329957723618e-003</threshold>\n            <left_val>0.2661027014255524</left_val>\n            <right_val>0.5039281249046326</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 12 19 -1.</_>\n                <_>12 1 4 19 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.3868423998355866</threshold>\n            <left_val>0.5144339799880981</left_val>\n            <right_val>0.2525899112224579</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 3 2 -1.</_>\n                <_>3 1 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1459240340627730e-004</threshold>\n            <left_val>0.4284994900226593</left_val>\n            <right_val>0.5423371195793152</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 4 5 -1.</_>\n                <_>10 12 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0184675697237253</threshold>\n            <left_val>0.3885835111141205</left_val>\n            <right_val>0.5213062167167664</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 4 5 -1.</_>\n                <_>8 12 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5907011372037232e-004</threshold>\n            <left_val>0.5412563085556030</left_val>\n            <right_val>0.4235909879207611</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2527540093287826e-003</threshold>\n            <left_val>0.4899305105209351</left_val>\n            <right_val>0.6624091267585754</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 6 -1.</_>\n                <_>0 4 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4910609461367130e-003</threshold>\n            <left_val>0.5286778211593628</left_val>\n            <right_val>0.4040051996707916</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5435562757775187e-004</threshold>\n            <left_val>0.6032990217208862</left_val>\n            <right_val>0.4795120060443878</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 4 10 -1.</_>\n                <_>7 11 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9478838704526424e-003</threshold>\n            <left_val>0.4084401130676270</left_val>\n            <right_val>0.5373504161834717</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8092920547351241e-004</threshold>\n            <left_val>0.4846062958240509</left_val>\n            <right_val>0.5759382247924805</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 5 2 -1.</_>\n                <_>2 14 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6073717577382922e-004</threshold>\n            <left_val>0.5164741277694702</left_val>\n            <right_val>0.3554979860782623</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 2 2 -1.</_>\n                <_>12 11 1 1 2.</_>\n                <_>11 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6883929967880249e-004</threshold>\n            <left_val>0.5677582025527954</left_val>\n            <right_val>0.4731765985488892</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 2 -1.</_>\n                <_>7 11 1 1 2.</_>\n                <_>8 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1599370520561934e-003</threshold>\n            <left_val>0.4731487035751343</left_val>\n            <right_val>0.7070567011833191</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 13 3 3 -1.</_>\n                <_>14 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6235301308333874e-003</threshold>\n            <left_val>0.5240243077278137</left_val>\n            <right_val>0.2781791985034943</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 3 3 -1.</_>\n                <_>3 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0243991427123547e-003</threshold>\n            <left_val>0.2837013900279999</left_val>\n            <right_val>0.5062304139137268</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.7611639648675919e-003</threshold>\n            <left_val>0.7400717735290527</left_val>\n            <right_val>0.4934569001197815</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>8 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1515100747346878e-003</threshold>\n            <left_val>0.5119131207466126</left_val>\n            <right_val>0.3407008051872253</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 3 3 -1.</_>\n                <_>13 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2465080991387367e-003</threshold>\n            <left_val>0.4923788011074066</left_val>\n            <right_val>0.6579058766365051</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 5 3 -1.</_>\n                <_>0 10 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.0597478188574314e-003</threshold>\n            <left_val>0.2434711009263992</left_val>\n            <right_val>0.5032842159271240</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 3 3 -1.</_>\n                <_>13 6 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0587709732353687e-003</threshold>\n            <left_val>0.5900310873985291</left_val>\n            <right_val>0.4695087075233460</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 8 -1.</_>\n                <_>9 12 1 4 2.</_>\n                <_>10 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4146060459315777e-003</threshold>\n            <left_val>0.3647317886352539</left_val>\n            <right_val>0.5189201831817627</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 7 2 2 -1.</_>\n                <_>12 7 1 1 2.</_>\n                <_>11 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4817609917372465e-003</threshold>\n            <left_val>0.6034948229789734</left_val>\n            <right_val>0.4940128028392792</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 16 6 4 -1.</_>\n                <_>3 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3016400672495365e-003</threshold>\n            <left_val>0.5818989872932434</left_val>\n            <right_val>0.4560427963733673</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 2 3 -1.</_>\n                <_>10 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4763428848236799e-003</threshold>\n            <left_val>0.5217475891113281</left_val>\n            <right_val>0.3483993113040924</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>9 7 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0222508702427149</threshold>\n            <left_val>0.2360700070858002</left_val>\n            <right_val>0.5032082796096802</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 15 8 4 -1.</_>\n                <_>12 15 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0306125506758690</threshold>\n            <left_val>0.6499186754226685</left_val>\n            <right_val>0.4914919137954712</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 8 6 -1.</_>\n                <_>4 14 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0130574796348810</threshold>\n            <left_val>0.4413323104381561</left_val>\n            <right_val>0.5683764219284058</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 0 3 2 -1.</_>\n                <_>10 0 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0095742810517550e-004</threshold>\n            <left_val>0.4359731078147888</left_val>\n            <right_val>0.5333483219146729</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 15 4 2 -1.</_>\n                <_>6 15 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1514250915497541e-004</threshold>\n            <left_val>0.5504062771797180</left_val>\n            <right_val>0.4326060116291046</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 13 -1.</_>\n                <_>13 7 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0137762902304530</threshold>\n            <left_val>0.4064112901687622</left_val>\n            <right_val>0.5201548933982849</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 3 13 -1.</_>\n                <_>6 7 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0322965085506439</threshold>\n            <left_val>0.0473519712686539</left_val>\n            <right_val>0.4977194964885712</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 3 9 -1.</_>\n                <_>9 9 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0535569787025452</threshold>\n            <left_val>0.4881733059883118</left_val>\n            <right_val>0.6666939258575440</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 7 12 -1.</_>\n                <_>4 10 7 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1889545544981956e-003</threshold>\n            <left_val>0.5400037169456482</left_val>\n            <right_val>0.4240820109844208</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 12 2 2 -1.</_>\n                <_>13 12 1 1 2.</_>\n                <_>12 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1055320394225419e-004</threshold>\n            <left_val>0.4802047908306122</left_val>\n            <right_val>0.5563852787017822</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 2 2 -1.</_>\n                <_>6 12 1 1 2.</_>\n                <_>7 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4382730480283499e-003</threshold>\n            <left_val>0.7387793064117432</left_val>\n            <right_val>0.4773685038089752</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 4 2 -1.</_>\n                <_>10 9 2 1 2.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2835570164024830e-003</threshold>\n            <left_val>0.5288546085357666</left_val>\n            <right_val>0.3171291947364807</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 2 2 -1.</_>\n                <_>3 6 1 1 2.</_>\n                <_>4 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3729570675641298e-003</threshold>\n            <left_val>0.4750812947750092</left_val>\n            <right_val>0.7060170769691467</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 6 3 2 -1.</_>\n                <_>16 7 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4541699783876538e-003</threshold>\n            <left_val>0.3811730146408081</left_val>\n            <right_val>0.5330739021301270</right_val></_></_></trees>\n      <stage_threshold>79.2490768432617190</stage_threshold>\n      <parent>16</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 18 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 19 4 -1.</_>\n                <_>0 9 19 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0557552389800549</threshold>\n            <left_val>0.4019156992435455</left_val>\n            <right_val>0.6806036829948425</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 10 1 -1.</_>\n                <_>10 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4730248842388391e-003</threshold>\n            <left_val>0.3351148962974548</left_val>\n            <right_val>0.5965719819068909</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 12 -1.</_>\n                <_>9 10 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5031698644161224e-004</threshold>\n            <left_val>0.5557708144187927</left_val>\n            <right_val>0.3482286930084229</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 18 4 1 -1.</_>\n                <_>12 18 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4167630150914192e-004</threshold>\n            <left_val>0.4260858893394470</left_val>\n            <right_val>0.5693380832672119</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 6 4 -1.</_>\n                <_>1 7 3 2 2.</_>\n                <_>4 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.7193678589537740e-004</threshold>\n            <left_val>0.3494240045547485</left_val>\n            <right_val>0.5433688759803772</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 6 13 -1.</_>\n                <_>14 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5999219613149762e-003</threshold>\n            <left_val>0.4028499126434326</left_val>\n            <right_val>0.5484359264373779</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 6 13 -1.</_>\n                <_>4 0 2 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1832080053864047e-004</threshold>\n            <left_val>0.3806901872158051</left_val>\n            <right_val>0.5425465106964111</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 8 8 -1.</_>\n                <_>10 9 8 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2909031142480671e-004</threshold>\n            <left_val>0.2620100080966950</left_val>\n            <right_val>0.5429521799087524</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 2 5 -1.</_>\n                <_>9 3 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9518108931370080e-004</threshold>\n            <left_val>0.3799768984317780</left_val>\n            <right_val>0.5399264097213745</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 9 1 -1.</_>\n                <_>11 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.0466710389591753e-005</threshold>\n            <left_val>0.4433645009994507</left_val>\n            <right_val>0.5440226197242737</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 9 1 -1.</_>\n                <_>6 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5007190086180344e-005</threshold>\n            <left_val>0.3719654977321625</left_val>\n            <right_val>0.5409119725227356</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 10 -1.</_>\n                <_>7 0 6 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1393561065196991</threshold>\n            <left_val>0.5525395870208740</left_val>\n            <right_val>0.4479042887687683</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 5 3 -1.</_>\n                <_>7 18 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6461990308016539e-003</threshold>\n            <left_val>0.4264501035213471</left_val>\n            <right_val>0.5772169828414917</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 6 1 -1.</_>\n                <_>9 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9984431825578213e-004</threshold>\n            <left_val>0.4359526038169861</left_val>\n            <right_val>0.5685871243476868</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 3 2 -1.</_>\n                <_>2 3 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0971280280500650e-003</threshold>\n            <left_val>0.3390136957168579</left_val>\n            <right_val>0.5205408930778503</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>8 13 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6919892560690641e-004</threshold>\n            <left_val>0.4557456076145172</left_val>\n            <right_val>0.5980659723281860</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 6 -1.</_>\n                <_>6 13 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6471042595803738e-004</threshold>\n            <left_val>0.5134841203689575</left_val>\n            <right_val>0.2944033145904541</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 2 4 -1.</_>\n                <_>11 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7182599296793342e-004</threshold>\n            <left_val>0.3906578123569489</left_val>\n            <right_val>0.5377181172370911</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 2 4 -1.</_>\n                <_>8 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0249499104684219e-005</threshold>\n            <left_val>0.3679609894752502</left_val>\n            <right_val>0.5225688815116882</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 4 -1.</_>\n                <_>9 6 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5225896909832954e-003</threshold>\n            <left_val>0.7293102145195007</left_val>\n            <right_val>0.4892365038394928</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 13 8 3 -1.</_>\n                <_>6 14 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6705560265108943e-003</threshold>\n            <left_val>0.4345324933528900</left_val>\n            <right_val>0.5696138143539429</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 3 4 -1.</_>\n                <_>10 15 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1433838456869125e-003</threshold>\n            <left_val>0.2591280043125153</left_val>\n            <right_val>0.5225623846054077</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 2 17 -1.</_>\n                <_>10 2 1 17 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0163193698972464</threshold>\n            <left_val>0.6922279000282288</left_val>\n            <right_val>0.4651575982570648</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 1 -1.</_>\n                <_>9 0 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8034260980784893e-003</threshold>\n            <left_val>0.5352262854576111</left_val>\n            <right_val>0.3286302983760834</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 3 4 -1.</_>\n                <_>9 15 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5421929359436035e-003</threshold>\n            <left_val>0.2040544003248215</left_val>\n            <right_val>0.5034546256065369</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 7 3 -1.</_>\n                <_>7 14 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0143631100654602</threshold>\n            <left_val>0.6804888844490051</left_val>\n            <right_val>0.4889059066772461</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 3 3 -1.</_>\n                <_>9 16 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9063588529825211e-004</threshold>\n            <left_val>0.5310695767402649</left_val>\n            <right_val>0.3895480930805206</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 2 8 10 -1.</_>\n                <_>6 7 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4060191139578819e-003</threshold>\n            <left_val>0.5741562843322754</left_val>\n            <right_val>0.4372426867485046</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 5 8 8 -1.</_>\n                <_>2 9 8 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8862540309783071e-004</threshold>\n            <left_val>0.2831785976886749</left_val>\n            <right_val>0.5098205208778381</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 16 2 2 -1.</_>\n                <_>14 17 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7979281041771173e-003</threshold>\n            <left_val>0.3372507989406586</left_val>\n            <right_val>0.5246580243110657</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 16 2 2 -1.</_>\n                <_>4 17 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4627049677073956e-004</threshold>\n            <left_val>0.5306674242019653</left_val>\n            <right_val>0.3911710083484650</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 4 6 -1.</_>\n                <_>10 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9164638767251745e-005</threshold>\n            <left_val>0.5462496280670166</left_val>\n            <right_val>0.3942720890045166</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 4 6 -1.</_>\n                <_>6 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0335825011134148</threshold>\n            <left_val>0.2157824039459229</left_val>\n            <right_val>0.5048211812973023</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5339309833943844e-003</threshold>\n            <left_val>0.6465312242507935</left_val>\n            <right_val>0.4872696995735169</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0144111737608910e-003</threshold>\n            <left_val>0.4617668092250824</left_val>\n            <right_val>0.6248074769973755</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 4 6 -1.</_>\n                <_>12 0 2 3 2.</_>\n                <_>10 3 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0188173707574606</threshold>\n            <left_val>0.5220689177513123</left_val>\n            <right_val>0.2000052034854889</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 20 2 -1.</_>\n                <_>0 4 20 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3434339780360460e-003</threshold>\n            <left_val>0.4014537930488586</left_val>\n            <right_val>0.5301619768142700</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 8 2 -1.</_>\n                <_>16 0 4 1 2.</_>\n                <_>12 1 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7557960236445069e-003</threshold>\n            <left_val>0.4794039130210877</left_val>\n            <right_val>0.5653169751167297</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 10 8 -1.</_>\n                <_>2 16 10 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0956374630331993</threshold>\n            <left_val>0.2034195065498352</left_val>\n            <right_val>0.5006706714630127</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 7 2 10 -1.</_>\n                <_>18 7 1 5 2.</_>\n                <_>17 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0222412291914225</threshold>\n            <left_val>0.7672473192214966</left_val>\n            <right_val>0.5046340227127075</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 2 10 -1.</_>\n                <_>1 7 1 5 2.</_>\n                <_>2 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0155758196488023</threshold>\n            <left_val>0.7490342259407044</left_val>\n            <right_val>0.4755851030349731</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 10 3 6 -1.</_>\n                <_>15 12 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3599118255078793e-003</threshold>\n            <left_val>0.5365303754806519</left_val>\n            <right_val>0.4004670977592468</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 4 6 2 -1.</_>\n                <_>6 4 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0217634998261929</threshold>\n            <left_val>0.0740154981613159</left_val>\n            <right_val>0.4964174926280975</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 20 6 -1.</_>\n                <_>0 7 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1656159013509750</threshold>\n            <left_val>0.2859103083610535</left_val>\n            <right_val>0.5218086242675781</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 8 2 -1.</_>\n                <_>0 0 4 1 2.</_>\n                <_>4 1 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6461320046801120e-004</threshold>\n            <left_val>0.4191615879535675</left_val>\n            <right_val>0.5380793213844299</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 4 -1.</_>\n                <_>7 0 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9077502489089966e-003</threshold>\n            <left_val>0.6273192763328552</left_val>\n            <right_val>0.4877404868602753</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 13 6 2 -1.</_>\n                <_>1 14 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6346449097618461e-004</threshold>\n            <left_val>0.5159940719604492</left_val>\n            <right_val>0.3671025931835175</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 4 -1.</_>\n                <_>11 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3751760125160217e-003</threshold>\n            <left_val>0.5884376764297485</left_val>\n            <right_val>0.4579083919525147</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 6 1 -1.</_>\n                <_>8 1 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4081239933148026e-003</threshold>\n            <left_val>0.3560509979724884</left_val>\n            <right_val>0.5139945149421692</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9342888630926609e-003</threshold>\n            <left_val>0.5994288921356201</left_val>\n            <right_val>0.4664272069931030</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 6 18 2 -1.</_>\n                <_>10 6 9 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0319669283926487</threshold>\n            <left_val>0.3345462083816528</left_val>\n            <right_val>0.5144183039665222</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 2 -1.</_>\n                <_>15 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5089280168467667e-005</threshold>\n            <left_val>0.5582656264305115</left_val>\n            <right_val>0.4414057135581970</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 1 2 -1.</_>\n                <_>6 6 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1994470413774252e-004</threshold>\n            <left_val>0.4623680114746094</left_val>\n            <right_val>0.6168993711471558</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 1 3 -1.</_>\n                <_>13 5 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.4220460802316666e-003</threshold>\n            <left_val>0.6557074785232544</left_val>\n            <right_val>0.4974805116653442</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 1 2 -1.</_>\n                <_>2 16 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7723299970384687e-004</threshold>\n            <left_val>0.5269501805305481</left_val>\n            <right_val>0.3901908099651337</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 4 3 -1.</_>\n                <_>12 5 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5716759953647852e-003</threshold>\n            <left_val>0.4633373022079468</left_val>\n            <right_val>0.5790457725524902</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 7 3 -1.</_>\n                <_>0 1 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9041329920291901e-003</threshold>\n            <left_val>0.2689608037471771</left_val>\n            <right_val>0.5053591132164002</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 6 2 -1.</_>\n                <_>9 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0677518700249493e-004</threshold>\n            <left_val>0.5456603169441223</left_val>\n            <right_val>0.4329898953437805</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 2 3 -1.</_>\n                <_>5 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7604780197143555e-003</threshold>\n            <left_val>0.4648993909358978</left_val>\n            <right_val>0.6689761877059937</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 4 2 3 -1.</_>\n                <_>18 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9100088868290186e-003</threshold>\n            <left_val>0.5309703946113586</left_val>\n            <right_val>0.3377839922904968</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 8 6 -1.</_>\n                <_>3 2 8 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3885459629818797e-003</threshold>\n            <left_val>0.4074738919734955</left_val>\n            <right_val>0.5349133014678955</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 20 6 -1.</_>\n                <_>10 2 10 3 2.</_>\n                <_>0 5 10 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0767642632126808</threshold>\n            <left_val>0.1992176026105881</left_val>\n            <right_val>0.5228242278099060</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 2 4 -1.</_>\n                <_>5 7 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2688310127705336e-004</threshold>\n            <left_val>0.5438501834869385</left_val>\n            <right_val>0.4253072142601013</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 10 15 2 -1.</_>\n                <_>8 10 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3094152137637138e-003</threshold>\n            <left_val>0.4259178936481476</left_val>\n            <right_val>0.5378909707069397</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 12 11 -1.</_>\n                <_>9 0 6 11 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1100727990269661</threshold>\n            <left_val>0.6904156804084778</left_val>\n            <right_val>0.4721749126911163</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 2 6 -1.</_>\n                <_>13 0 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8619659133255482e-004</threshold>\n            <left_val>0.4524914920330048</left_val>\n            <right_val>0.5548306107521057</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 19 2 1 -1.</_>\n                <_>1 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9425329557852820e-005</threshold>\n            <left_val>0.5370373725891113</left_val>\n            <right_val>0.4236463904380798</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 10 4 10 -1.</_>\n                <_>18 10 2 5 2.</_>\n                <_>16 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0248865708708763</threshold>\n            <left_val>0.6423557996749878</left_val>\n            <right_val>0.4969303905963898</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 10 3 -1.</_>\n                <_>4 9 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0331488512456417</threshold>\n            <left_val>0.4988475143909454</left_val>\n            <right_val>0.1613811999559403</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 3 3 -1.</_>\n                <_>14 13 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8491691965609789e-004</threshold>\n            <left_val>0.5416026115417481</left_val>\n            <right_val>0.4223009049892426</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 4 10 -1.</_>\n                <_>0 10 2 5 2.</_>\n                <_>2 15 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7087189741432667e-003</threshold>\n            <left_val>0.4576328992843628</left_val>\n            <right_val>0.6027557849884033</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 3 2 6 -1.</_>\n                <_>18 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4144479539245367e-003</threshold>\n            <left_val>0.5308973193168640</left_val>\n            <right_val>0.4422498941421509</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 3 -1.</_>\n                <_>6 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9523180089890957e-003</threshold>\n            <left_val>0.4705634117126465</left_val>\n            <right_val>0.6663324832916260</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 7 2 -1.</_>\n                <_>7 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3031980488449335e-003</threshold>\n            <left_val>0.4406126141548157</left_val>\n            <right_val>0.5526962280273438</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 6 -1.</_>\n                <_>0 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4735497795045376e-003</threshold>\n            <left_val>0.5129023790359497</left_val>\n            <right_val>0.3301498889923096</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 1 3 1 -1.</_>\n                <_>12 1 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6652868837118149e-003</threshold>\n            <left_val>0.3135471045970917</left_val>\n            <right_val>0.5175036191940308</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 2 6 -1.</_>\n                <_>6 0 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3666770246345550e-004</threshold>\n            <left_val>0.4119370877742767</left_val>\n            <right_val>0.5306876897811890</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 1 18 14 -1.</_>\n                <_>7 1 6 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0171264503151178</threshold>\n            <left_val>0.6177806258201599</left_val>\n            <right_val>0.4836578965187073</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 8 3 -1.</_>\n                <_>8 6 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6601430727168918e-004</threshold>\n            <left_val>0.3654330968856812</left_val>\n            <right_val>0.5169736742973328</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 6 2 -1.</_>\n                <_>9 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0229323804378510</threshold>\n            <left_val>0.3490915000438690</left_val>\n            <right_val>0.5163992047309876</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 6 2 -1.</_>\n                <_>8 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3316550068557262e-003</threshold>\n            <left_val>0.5166299939155579</left_val>\n            <right_val>0.3709389865398407</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 5 -1.</_>\n                <_>11 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0169256608933210</threshold>\n            <left_val>0.5014736056327820</left_val>\n            <right_val>0.8053988218307495</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 5 -1.</_>\n                <_>8 7 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9858826249837875e-003</threshold>\n            <left_val>0.6470788717269898</left_val>\n            <right_val>0.4657020866870880</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 10 -1.</_>\n                <_>14 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0118746999651194</threshold>\n            <left_val>0.3246378898620606</left_val>\n            <right_val>0.5258755087852478</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 2 -1.</_>\n                <_>4 12 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9350569345988333e-004</threshold>\n            <left_val>0.5191941857337952</left_val>\n            <right_val>0.3839643895626068</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>18 3 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8713490143418312e-003</threshold>\n            <left_val>0.4918133914470673</left_val>\n            <right_val>0.6187043190002441</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 18 10 -1.</_>\n                <_>1 13 18 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2483879029750824</threshold>\n            <left_val>0.1836802959442139</left_val>\n            <right_val>0.4988150000572205</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 10 -1.</_>\n                <_>14 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0122560001909733</threshold>\n            <left_val>0.5227053761482239</left_val>\n            <right_val>0.3632029891014099</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3990179700776935e-004</threshold>\n            <left_val>0.4490250051021576</left_val>\n            <right_val>0.5774148106575012</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5407369248569012e-003</threshold>\n            <left_val>0.4804787039756775</left_val>\n            <right_val>0.5858299136161804</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 3 10 -1.</_>\n                <_>5 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0148224299773574</threshold>\n            <left_val>0.2521049976348877</left_val>\n            <right_val>0.5023537278175354</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7973959483206272e-003</threshold>\n            <left_val>0.5996695756912231</left_val>\n            <right_val>0.4853715002536774</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 1 2 -1.</_>\n                <_>0 10 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2662148158997297e-004</threshold>\n            <left_val>0.5153716802597046</left_val>\n            <right_val>0.3671779930591583</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 1 2 10 -1.</_>\n                <_>18 1 1 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0172325801104307</threshold>\n            <left_val>0.6621719002723694</left_val>\n            <right_val>0.4994656145572662</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 2 10 -1.</_>\n                <_>1 1 1 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8624086454510689e-003</threshold>\n            <left_val>0.4633395075798035</left_val>\n            <right_val>0.6256101727485657</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7343620099127293e-003</threshold>\n            <left_val>0.3615573048591614</left_val>\n            <right_val>0.5281885266304016</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 3 3 -1.</_>\n                <_>3 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3048478700220585e-004</threshold>\n            <left_val>0.4442889094352722</left_val>\n            <right_val>0.5550957918167114</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 2 6 -1.</_>\n                <_>12 0 1 3 2.</_>\n                <_>11 3 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6602199114859104e-003</threshold>\n            <left_val>0.5162935256958008</left_val>\n            <right_val>0.2613354921340942</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 2 6 -1.</_>\n                <_>7 0 1 3 2.</_>\n                <_>8 3 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1048377752304077e-003</threshold>\n            <left_val>0.2789632081985474</left_val>\n            <right_val>0.5019031763076782</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 7 -1.</_>\n                <_>17 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8512578941881657e-003</threshold>\n            <left_val>0.4968984127044678</left_val>\n            <right_val>0.5661668181419373</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 3 7 -1.</_>\n                <_>2 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9896453320980072e-004</threshold>\n            <left_val>0.4445607960224152</left_val>\n            <right_val>0.5551813244819641</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 1 6 16 -1.</_>\n                <_>16 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.2702363133430481</threshold>\n            <left_val>0.0293882098048925</left_val>\n            <right_val>0.5151314139366150</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 6 16 -1.</_>\n                <_>2 1 2 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0130906803533435</threshold>\n            <left_val>0.5699399709701538</left_val>\n            <right_val>0.4447459876537323</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 16 8 -1.</_>\n                <_>10 0 8 4 2.</_>\n                <_>2 4 8 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4342790544033051e-003</threshold>\n            <left_val>0.4305466115474701</left_val>\n            <right_val>0.5487895011901856</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 5 3 -1.</_>\n                <_>6 9 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5482039889320731e-003</threshold>\n            <left_val>0.3680317103862763</left_val>\n            <right_val>0.5128080844879150</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 3 -1.</_>\n                <_>10 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3746132180094719e-003</threshold>\n            <left_val>0.4838916957378388</left_val>\n            <right_val>0.6101555824279785</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 4 3 -1.</_>\n                <_>8 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5786769799888134e-003</threshold>\n            <left_val>0.5325223207473755</left_val>\n            <right_val>0.4118548035621643</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 4 -1.</_>\n                <_>9 6 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6856050137430429e-003</threshold>\n            <left_val>0.4810948073863983</left_val>\n            <right_val>0.6252303123474121</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 15 1 -1.</_>\n                <_>5 7 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3887019902467728e-003</threshold>\n            <left_val>0.5200229883193970</left_val>\n            <right_val>0.3629410862922669</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 7 9 -1.</_>\n                <_>8 5 7 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127926301211119</threshold>\n            <left_val>0.4961709976196289</left_val>\n            <right_val>0.6738016009330750</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 16 4 -1.</_>\n                <_>1 7 8 2 2.</_>\n                <_>9 9 8 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3661040943115950e-003</threshold>\n            <left_val>0.4060279130935669</left_val>\n            <right_val>0.5283598899841309</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 12 8 2 -1.</_>\n                <_>6 13 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9771420415490866e-004</threshold>\n            <left_val>0.4674113988876343</left_val>\n            <right_val>0.5900775194168091</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 3 3 -1.</_>\n                <_>8 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4868030557408929e-003</threshold>\n            <left_val>0.4519116878509522</left_val>\n            <right_val>0.6082053780555725</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 14 10 -1.</_>\n                <_>11 5 7 5 2.</_>\n                <_>4 10 7 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0886867493391037</threshold>\n            <left_val>0.2807899117469788</left_val>\n            <right_val>0.5180991888046265</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 3 2 -1.</_>\n                <_>4 13 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4296112870797515e-005</threshold>\n            <left_val>0.5295584201812744</left_val>\n            <right_val>0.4087625145912170</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4932939848222304e-005</threshold>\n            <left_val>0.5461400151252747</left_val>\n            <right_val>0.4538542926311493</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 7 6 -1.</_>\n                <_>4 11 7 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9162238612771034e-003</threshold>\n            <left_val>0.5329161286354065</left_val>\n            <right_val>0.4192134141921997</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 6 3 -1.</_>\n                <_>7 11 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1141640134155750e-003</threshold>\n            <left_val>0.4512017965316773</left_val>\n            <right_val>0.5706217288970947</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 2 -1.</_>\n                <_>9 12 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.9249362645205110e-005</threshold>\n            <left_val>0.4577805995941162</left_val>\n            <right_val>0.5897638201713562</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 20 6 -1.</_>\n                <_>0 7 20 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5319510605186224e-003</threshold>\n            <left_val>0.5299603939056397</left_val>\n            <right_val>0.3357639014720917</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 6 1 -1.</_>\n                <_>8 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0124262003228068</threshold>\n            <left_val>0.4959059059619904</left_val>\n            <right_val>0.1346601992845535</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 6 1 -1.</_>\n                <_>11 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0283357501029968</threshold>\n            <left_val>0.5117079019546509</left_val>\n            <right_val>6.1043637106195092e-004</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 6 1 -1.</_>\n                <_>7 11 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6165882162749767e-003</threshold>\n            <left_val>0.4736349880695343</left_val>\n            <right_val>0.7011628150939941</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0468766391277313e-003</threshold>\n            <left_val>0.5216417908668518</left_val>\n            <right_val>0.3282819986343384</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1193980462849140e-003</threshold>\n            <left_val>0.5809860825538635</left_val>\n            <right_val>0.4563739001750946</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 12 16 8 -1.</_>\n                <_>2 16 16 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0132775902748108</threshold>\n            <left_val>0.5398362278938294</left_val>\n            <right_val>0.4103901088237763</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 15 2 -1.</_>\n                <_>0 16 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8794739996083081e-004</threshold>\n            <left_val>0.4249286055564880</left_val>\n            <right_val>0.5410590767860413</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 4 5 6 -1.</_>\n                <_>15 6 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0112431701272726</threshold>\n            <left_val>0.5269963741302490</left_val>\n            <right_val>0.3438215851783752</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 4 -1.</_>\n                <_>10 5 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9896668214350939e-004</threshold>\n            <left_val>0.5633075833320618</left_val>\n            <right_val>0.4456613063812256</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 9 6 -1.</_>\n                <_>8 12 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6677159629762173e-003</threshold>\n            <left_val>0.5312889218330383</left_val>\n            <right_val>0.4362679123878479</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 19 15 1 -1.</_>\n                <_>7 19 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0289472993463278</threshold>\n            <left_val>0.4701794981956482</left_val>\n            <right_val>0.6575797796249390</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0234000496566296</threshold>\n            <left_val>0.</left_val>\n            <right_val>0.5137398838996887</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 20 4 -1.</_>\n                <_>0 17 20 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0891170501708984</threshold>\n            <left_val>0.0237452797591686</left_val>\n            <right_val>0.4942430853843689</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 3 4 -1.</_>\n                <_>11 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0140546001493931</threshold>\n            <left_val>0.3127323091030121</left_val>\n            <right_val>0.5117511153221130</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 3 4 -1.</_>\n                <_>8 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1239398568868637e-003</threshold>\n            <left_val>0.5009049177169800</left_val>\n            <right_val>0.2520025968551636</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 3 -1.</_>\n                <_>9 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.9964650534093380e-003</threshold>\n            <left_val>0.6387143731117249</left_val>\n            <right_val>0.4927811920642853</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 6 -1.</_>\n                <_>8 14 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1253970228135586e-003</threshold>\n            <left_val>0.5136849880218506</left_val>\n            <right_val>0.3680452108383179</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 12 -1.</_>\n                <_>9 10 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7669642157852650e-003</threshold>\n            <left_val>0.5509843826293945</left_val>\n            <right_val>0.4363631904125214</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 4 3 -1.</_>\n                <_>8 18 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3711440153419971e-003</threshold>\n            <left_val>0.6162335276603699</left_val>\n            <right_val>0.4586946964263916</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 18 8 2 -1.</_>\n                <_>13 18 4 1 2.</_>\n                <_>9 19 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3522791713476181e-003</threshold>\n            <left_val>0.6185457706451416</left_val>\n            <right_val>0.4920490980148315</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 18 8 2 -1.</_>\n                <_>1 19 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0159688591957092</threshold>\n            <left_val>0.1382617950439453</left_val>\n            <right_val>0.4983252882957459</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 6 15 -1.</_>\n                <_>15 5 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7676060348749161e-003</threshold>\n            <left_val>0.4688057899475098</left_val>\n            <right_val>0.5490046143531799</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 2 -1.</_>\n                <_>9 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4714691098779440e-003</threshold>\n            <left_val>0.2368514984846115</left_val>\n            <right_val>0.5003952980041504</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 3 -1.</_>\n                <_>9 5 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.1033788844943047e-004</threshold>\n            <left_val>0.5856394171714783</left_val>\n            <right_val>0.4721533060073853</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 6 15 -1.</_>\n                <_>3 5 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1411755979061127</threshold>\n            <left_val>0.0869000628590584</left_val>\n            <right_val>0.4961591064929962</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 14 8 -1.</_>\n                <_>11 1 7 4 2.</_>\n                <_>4 5 7 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1065180972218514</threshold>\n            <left_val>0.5138837099075317</left_val>\n            <right_val>0.1741005033254623</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 4 4 16 -1.</_>\n                <_>2 4 2 8 2.</_>\n                <_>4 12 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0527447499334812</threshold>\n            <left_val>0.7353636026382446</left_val>\n            <right_val>0.4772881865501404</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 12 -1.</_>\n                <_>12 10 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7431760467588902e-003</threshold>\n            <left_val>0.3884406089782715</left_val>\n            <right_val>0.5292701721191406</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 10 12 -1.</_>\n                <_>4 5 5 6 2.</_>\n                <_>9 11 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9676765967160463e-004</threshold>\n            <left_val>0.5223492980003357</left_val>\n            <right_val>0.4003424048423767</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0284131690859795e-003</threshold>\n            <left_val>0.4959106147289276</left_val>\n            <right_val>0.7212964296340942</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 2 3 -1.</_>\n                <_>5 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6025858763605356e-004</threshold>\n            <left_val>0.4444884061813355</left_val>\n            <right_val>0.5538476109504700</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 4 10 -1.</_>\n                <_>14 2 2 5 2.</_>\n                <_>12 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.3191501218825579e-004</threshold>\n            <left_val>0.5398371219635010</left_val>\n            <right_val>0.4163244068622589</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 7 3 -1.</_>\n                <_>6 5 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5082060601562262e-003</threshold>\n            <left_val>0.5854265093803406</left_val>\n            <right_val>0.4562500119209290</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 18 2 -1.</_>\n                <_>11 0 9 1 2.</_>\n                <_>2 1 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1378761157393456e-003</threshold>\n            <left_val>0.4608069062232971</left_val>\n            <right_val>0.5280259251594544</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 18 2 -1.</_>\n                <_>0 0 9 1 2.</_>\n                <_>9 1 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1546049974858761e-003</threshold>\n            <left_val>0.3791126906871796</left_val>\n            <right_val>0.5255997180938721</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 4 6 -1.</_>\n                <_>15 13 2 3 2.</_>\n                <_>13 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.6214009895920753e-003</threshold>\n            <left_val>0.5998609066009522</left_val>\n            <right_val>0.4952073991298676</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 4 6 -1.</_>\n                <_>3 13 2 3 2.</_>\n                <_>5 16 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2055360022932291e-003</threshold>\n            <left_val>0.4484206140041351</left_val>\n            <right_val>0.5588530898094177</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 2 6 -1.</_>\n                <_>10 15 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2586950324475765e-003</threshold>\n            <left_val>0.5450747013092041</left_val>\n            <right_val>0.4423840939998627</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 10 10 -1.</_>\n                <_>5 9 5 5 2.</_>\n                <_>10 14 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0926720723509789e-003</threshold>\n            <left_val>0.4118275046348572</left_val>\n            <right_val>0.5263035893440247</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5095739401876926e-003</threshold>\n            <left_val>0.5787907838821411</left_val>\n            <right_val>0.4998494982719421</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 8 -1.</_>\n                <_>10 12 3 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0773275569081306</threshold>\n            <left_val>0.8397865891456604</left_val>\n            <right_val>0.4811120033264160</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 4 10 -1.</_>\n                <_>14 2 2 5 2.</_>\n                <_>12 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0414858199656010</threshold>\n            <left_val>0.2408611029386520</left_val>\n            <right_val>0.5176993012428284</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 2 1 -1.</_>\n                <_>9 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0355669655837119e-004</threshold>\n            <left_val>0.4355360865592957</left_val>\n            <right_val>0.5417054295539856</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 1 12 -1.</_>\n                <_>10 9 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3255809899419546e-003</threshold>\n            <left_val>0.5453971028327942</left_val>\n            <right_val>0.4894095063209534</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 11 6 9 -1.</_>\n                <_>3 11 3 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.0598732456564903e-003</threshold>\n            <left_val>0.5771024227142334</left_val>\n            <right_val>0.4577918946743012</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 4 10 -1.</_>\n                <_>14 2 2 5 2.</_>\n                <_>12 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0190586205571890</threshold>\n            <left_val>0.5169867873191834</left_val>\n            <right_val>0.3400475084781647</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 4 10 -1.</_>\n                <_>4 2 2 5 2.</_>\n                <_>6 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0350578911602497</threshold>\n            <left_val>0.2203243970870972</left_val>\n            <right_val>0.5000503063201904</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7296059094369411e-003</threshold>\n            <left_val>0.5043408274650574</left_val>\n            <right_val>0.6597570776939392</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 6 3 -1.</_>\n                <_>0 15 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116483299061656</threshold>\n            <left_val>0.2186284959316254</left_val>\n            <right_val>0.4996652901172638</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4544479781761765e-003</threshold>\n            <left_val>0.5007681846618652</left_val>\n            <right_val>0.5503727793693543</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 3 2 -1.</_>\n                <_>7 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5030909455381334e-004</threshold>\n            <left_val>0.4129841029644013</left_val>\n            <right_val>0.5241670012474060</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 4 2 -1.</_>\n                <_>13 4 2 1 2.</_>\n                <_>11 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2907272735610604e-004</threshold>\n            <left_val>0.5412868261337280</left_val>\n            <right_val>0.4974496066570282</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 4 2 -1.</_>\n                <_>5 4 2 1 2.</_>\n                <_>7 5 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0862209601327777e-003</threshold>\n            <left_val>0.4605529904365540</left_val>\n            <right_val>0.5879228711128235</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 2 12 -1.</_>\n                <_>14 0 1 6 2.</_>\n                <_>13 6 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0000500080641359e-004</threshold>\n            <left_val>0.5278854966163635</left_val>\n            <right_val>0.4705209136009216</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 10 -1.</_>\n                <_>7 0 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9212920926511288e-003</threshold>\n            <left_val>0.5129609704017639</left_val>\n            <right_val>0.3755536973476410</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 17 8 -1.</_>\n                <_>3 4 17 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0253874007612467</threshold>\n            <left_val>0.4822691977024078</left_val>\n            <right_val>0.5790768265724182</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 20 4 -1.</_>\n                <_>0 6 20 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1968469265848398e-003</threshold>\n            <left_val>0.5248395204544067</left_val>\n            <right_val>0.3962840139865875</right_val></_></_></trees>\n      <stage_threshold>87.6960296630859380</stage_threshold>\n      <parent>17</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 19 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 8 2 -1.</_>\n                <_>4 3 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8031738735735416e-003</threshold>\n            <left_val>0.3498983979225159</left_val>\n            <right_val>0.5961983203887940</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 3 -1.</_>\n                <_>8 12 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0003069490194321e-003</threshold>\n            <left_val>0.6816636919975281</left_val>\n            <right_val>0.4478552043437958</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 6 4 -1.</_>\n                <_>5 7 3 2 2.</_>\n                <_>8 9 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1549659539014101e-003</threshold>\n            <left_val>0.5585706233978272</left_val>\n            <right_val>0.3578251004219055</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 4 9 -1.</_>\n                <_>8 6 4 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1069850297644734e-003</threshold>\n            <left_val>0.5365036129951477</left_val>\n            <right_val>0.3050428032875061</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 1 4 -1.</_>\n                <_>8 17 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0308309720130637e-004</threshold>\n            <left_val>0.3639095127582550</left_val>\n            <right_val>0.5344635844230652</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 7 -1.</_>\n                <_>8 5 4 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0984839908778667e-003</threshold>\n            <left_val>0.2859157025814056</left_val>\n            <right_val>0.5504264831542969</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 4 10 -1.</_>\n                <_>4 2 2 5 2.</_>\n                <_>6 7 2 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2572200335562229e-004</threshold>\n            <left_val>0.5236523747444153</left_val>\n            <right_val>0.3476041853427887</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 0 17 2 -1.</_>\n                <_>3 1 17 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9783325567841530e-003</threshold>\n            <left_val>0.4750322103500366</left_val>\n            <right_val>0.6219646930694580</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 16 15 -1.</_>\n                <_>2 7 16 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0374025292694569</threshold>\n            <left_val>0.3343375921249390</left_val>\n            <right_val>0.5278062820434570</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 5 2 -1.</_>\n                <_>15 3 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8548257909715176e-003</threshold>\n            <left_val>0.5192180871963501</left_val>\n            <right_val>0.3700444102287293</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 2 -1.</_>\n                <_>10 3 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8664470408111811e-003</threshold>\n            <left_val>0.2929843962192535</left_val>\n            <right_val>0.5091944932937622</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 16 15 -1.</_>\n                <_>4 10 16 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0168888904154301</threshold>\n            <left_val>0.3686845898628235</left_val>\n            <right_val>0.5431225895881653</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 5 6 -1.</_>\n                <_>7 16 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8372621424496174e-003</threshold>\n            <left_val>0.3632183969020844</left_val>\n            <right_val>0.5221335887908936</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4713739510625601e-003</threshold>\n            <left_val>0.5870683789253235</left_val>\n            <right_val>0.4700650870800018</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 3 3 1 -1.</_>\n                <_>9 3 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1522950371727347e-003</threshold>\n            <left_val>0.3195894956588745</left_val>\n            <right_val>0.5140954256057739</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 3 -1.</_>\n                <_>9 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2560300789773464e-003</threshold>\n            <left_val>0.6301859021186829</left_val>\n            <right_val>0.4814921021461487</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 5 2 -1.</_>\n                <_>0 3 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7378291860222816e-003</threshold>\n            <left_val>0.1977048069238663</left_val>\n            <right_val>0.5025808215141296</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0113826701417565</threshold>\n            <left_val>0.4954132139682770</left_val>\n            <right_val>0.6867045760154724</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 12 1 -1.</_>\n                <_>5 7 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1794708706438541e-003</threshold>\n            <left_val>0.5164427757263184</left_val>\n            <right_val>0.3350647985935211</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 14 -1.</_>\n                <_>7 12 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1174378991127014</threshold>\n            <left_val>0.2315246015787125</left_val>\n            <right_val>0.5234413743019104</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 8 10 -1.</_>\n                <_>0 0 4 5 2.</_>\n                <_>4 5 4 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0287034492939711</threshold>\n            <left_val>0.4664297103881836</left_val>\n            <right_val>0.6722521185874939</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 3 2 -1.</_>\n                <_>10 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8231030814349651e-003</threshold>\n            <left_val>0.5220875144004822</left_val>\n            <right_val>0.2723532915115356</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 3 2 -1.</_>\n                <_>9 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6798530016094446e-003</threshold>\n            <left_val>0.5079277157783508</left_val>\n            <right_val>0.2906948924064636</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0504082143306732e-003</threshold>\n            <left_val>0.4885950982570648</left_val>\n            <right_val>0.6395021080970764</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 6 16 -1.</_>\n                <_>7 12 6 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8054959625005722e-003</threshold>\n            <left_val>0.5197256803512573</left_val>\n            <right_val>0.3656663894653320</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2420159075409174e-003</threshold>\n            <left_val>0.6153467893600464</left_val>\n            <right_val>0.4763701856136322</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 3 2 6 -1.</_>\n                <_>2 5 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0137577103450894</threshold>\n            <left_val>0.2637344896793366</left_val>\n            <right_val>0.5030903220176697</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 9 -1.</_>\n                <_>14 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1033829972147942</threshold>\n            <left_val>0.2287521958351135</left_val>\n            <right_val>0.5182461142539978</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4432085752487183e-003</threshold>\n            <left_val>0.6953303813934326</left_val>\n            <right_val>0.4694949090480804</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0271181650459766e-004</threshold>\n            <left_val>0.5450655221939087</left_val>\n            <right_val>0.4268783926963806</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1945669800043106e-003</threshold>\n            <left_val>0.6091387867927551</left_val>\n            <right_val>0.4571642875671387</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 6 -1.</_>\n                <_>13 13 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0109422104433179</threshold>\n            <left_val>0.5241063237190247</left_val>\n            <right_val>0.3284547030925751</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 2 6 -1.</_>\n                <_>3 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7841069065034389e-004</threshold>\n            <left_val>0.5387929081916809</left_val>\n            <right_val>0.4179368913173676</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 2 -1.</_>\n                <_>14 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0888620056211948e-003</threshold>\n            <left_val>0.4292691051959992</left_val>\n            <right_val>0.5301715731620789</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 16 2 -1.</_>\n                <_>0 9 16 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2383969519287348e-003</threshold>\n            <left_val>0.3792347908020020</left_val>\n            <right_val>0.5220744013786316</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 6 2 -1.</_>\n                <_>14 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9075027927756310e-003</threshold>\n            <left_val>0.5237283110618591</left_val>\n            <right_val>0.4126757979393005</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 5 6 -1.</_>\n                <_>0 2 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0322779417037964</threshold>\n            <left_val>0.1947655975818634</left_val>\n            <right_val>0.4994502067565918</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9711230248212814e-003</threshold>\n            <left_val>0.6011285185813904</left_val>\n            <right_val>0.4929032027721405</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 6 -1.</_>\n                <_>4 13 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0153210898861289</threshold>\n            <left_val>0.5009753704071045</left_val>\n            <right_val>0.2039822041988373</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0855569746345282e-003</threshold>\n            <left_val>0.4862189888954163</left_val>\n            <right_val>0.5721694827079773</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 1 3 -1.</_>\n                <_>9 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0615021027624607e-003</threshold>\n            <left_val>0.5000218749046326</left_val>\n            <right_val>0.1801805943250656</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7174751050770283e-003</threshold>\n            <left_val>0.5530117154121399</left_val>\n            <right_val>0.4897592961788178</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 12 -1.</_>\n                <_>6 12 8 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0121705001220107</threshold>\n            <left_val>0.4178605973720551</left_val>\n            <right_val>0.5383723974227905</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6248398721218109e-003</threshold>\n            <left_val>0.4997169971466065</left_val>\n            <right_val>0.5761327147483826</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 9 2 -1.</_>\n                <_>8 12 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1040429419372231e-004</threshold>\n            <left_val>0.5331807136535645</left_val>\n            <right_val>0.4097681045532227</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146417804062366</threshold>\n            <left_val>0.5755925178527832</left_val>\n            <right_val>0.5051776170730591</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 4 3 -1.</_>\n                <_>4 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3199489116668701e-003</threshold>\n            <left_val>0.4576976895332336</left_val>\n            <right_val>0.6031805872917175</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 9 2 -1.</_>\n                <_>9 6 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.7236879579722881e-003</threshold>\n            <left_val>0.4380396902561188</left_val>\n            <right_val>0.5415883064270020</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 1 3 -1.</_>\n                <_>4 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2951161311939359e-004</threshold>\n            <left_val>0.5163031816482544</left_val>\n            <right_val>0.3702219128608704</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 6 6 -1.</_>\n                <_>14 12 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0114084901288152</threshold>\n            <left_val>0.6072946786880493</left_val>\n            <right_val>0.4862565100193024</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 3 7 -1.</_>\n                <_>8 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5320121571421623e-003</threshold>\n            <left_val>0.3292475938796997</left_val>\n            <right_val>0.5088962912559509</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 3 3 -1.</_>\n                <_>10 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1276017911732197e-003</threshold>\n            <left_val>0.4829767942428589</left_val>\n            <right_val>0.6122708916664124</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 3 3 -1.</_>\n                <_>9 8 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8583158105611801e-003</threshold>\n            <left_val>0.4660679996013641</left_val>\n            <right_val>0.6556177139282227</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 10 11 3 -1.</_>\n                <_>5 11 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0369859188795090</threshold>\n            <left_val>0.5204849243164063</left_val>\n            <right_val>0.1690472066402435</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 10 1 -1.</_>\n                <_>10 7 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6491161920130253e-003</threshold>\n            <left_val>0.5167322158813477</left_val>\n            <right_val>0.3725225031375885</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 2 -1.</_>\n                <_>10 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2664702050387859e-003</threshold>\n            <left_val>0.6406493186950684</left_val>\n            <right_val>0.4987342953681946</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 2 -1.</_>\n                <_>9 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7956590424291790e-004</threshold>\n            <left_val>0.5897293090820313</left_val>\n            <right_val>0.4464873969554901</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 9 4 2 -1.</_>\n                <_>11 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6827160511165857e-003</threshold>\n            <left_val>0.5441560745239258</left_val>\n            <right_val>0.3472662866115570</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 4 2 -1.</_>\n                <_>7 9 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0100598800927401</threshold>\n            <left_val>0.2143162935972214</left_val>\n            <right_val>0.5004829764366150</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 10 2 4 -1.</_>\n                <_>14 12 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0361840617842972e-004</threshold>\n            <left_val>0.5386424064636231</left_val>\n            <right_val>0.4590323865413666</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 3 2 -1.</_>\n                <_>8 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4545479789376259e-003</threshold>\n            <left_val>0.5751184225082398</left_val>\n            <right_val>0.4497095048427582</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 17 6 3 -1.</_>\n                <_>14 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6515209572389722e-003</threshold>\n            <left_val>0.5421937704086304</left_val>\n            <right_val>0.4238520860671997</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 12 12 -1.</_>\n                <_>4 5 6 6 2.</_>\n                <_>10 11 6 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8468639403581619e-003</threshold>\n            <left_val>0.4077920913696289</left_val>\n            <right_val>0.5258157253265381</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 8 -1.</_>\n                <_>10 9 4 4 2.</_>\n                <_>6 13 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1259850151836872e-003</threshold>\n            <left_val>0.4229275882244110</left_val>\n            <right_val>0.5479453206062317</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 15 4 -1.</_>\n                <_>5 4 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0368909612298012</threshold>\n            <left_val>0.6596375703811646</left_val>\n            <right_val>0.4674678146839142</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 1 -1.</_>\n                <_>13 2 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4035639944486320e-004</threshold>\n            <left_val>0.4251135885715485</left_val>\n            <right_val>0.5573202967643738</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 2 -1.</_>\n                <_>4 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5150169929256663e-005</threshold>\n            <left_val>0.5259246826171875</left_val>\n            <right_val>0.4074114859104157</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 3 -1.</_>\n                <_>8 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2108471021056175e-003</threshold>\n            <left_val>0.4671722948551178</left_val>\n            <right_val>0.5886352062225342</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 3 -1.</_>\n                <_>9 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1568620102480054e-003</threshold>\n            <left_val>0.5711066126823425</left_val>\n            <right_val>0.4487161934375763</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 2 3 -1.</_>\n                <_>13 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9996292218565941e-003</threshold>\n            <left_val>0.5264198184013367</left_val>\n            <right_val>0.2898327112197876</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 4 4 -1.</_>\n                <_>7 12 2 2 2.</_>\n                <_>9 14 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4656189596280456e-003</threshold>\n            <left_val>0.3891738057136536</left_val>\n            <right_val>0.5197871923446655</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 2 2 -1.</_>\n                <_>11 11 1 1 2.</_>\n                <_>10 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1975039960816503e-003</threshold>\n            <left_val>0.5795872807502747</left_val>\n            <right_val>0.4927955865859985</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 2 -1.</_>\n                <_>9 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4954330660402775e-003</threshold>\n            <left_val>0.2377603054046631</left_val>\n            <right_val>0.5012555122375488</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 2 2 -1.</_>\n                <_>11 11 1 1 2.</_>\n                <_>10 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4997160178609192e-004</threshold>\n            <left_val>0.4876626133918762</left_val>\n            <right_val>0.5617607831954956</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 6 3 -1.</_>\n                <_>0 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6391509454697371e-003</threshold>\n            <left_val>0.5168088078498840</left_val>\n            <right_val>0.3765509128570557</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 2 2 -1.</_>\n                <_>11 11 1 1 2.</_>\n                <_>10 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9368131072260439e-004</threshold>\n            <left_val>0.5446649193763733</left_val>\n            <right_val>0.4874630868434906</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 2 2 -1.</_>\n                <_>8 11 1 1 2.</_>\n                <_>9 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4211760135367513e-003</threshold>\n            <left_val>0.4687897861003876</left_val>\n            <right_val>0.6691331863403320</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 8 4 -1.</_>\n                <_>12 5 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0794276371598244</threshold>\n            <left_val>0.5193443894386292</left_val>\n            <right_val>0.2732945978641510</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 5 8 4 -1.</_>\n                <_>4 5 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0799375027418137</threshold>\n            <left_val>0.4971731007099152</left_val>\n            <right_val>0.1782083958387375</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 2 4 1 -1.</_>\n                <_>13 2 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0110892597585917</threshold>\n            <left_val>0.5165994763374329</left_val>\n            <right_val>0.3209475874900818</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 4 1 -1.</_>\n                <_>5 2 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6560709627810866e-004</threshold>\n            <left_val>0.4058471918106079</left_val>\n            <right_val>0.5307276248931885</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 4 2 -1.</_>\n                <_>12 0 2 1 2.</_>\n                <_>10 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.3354292176663876e-003</threshold>\n            <left_val>0.3445056974887848</left_val>\n            <right_val>0.5158129930496216</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 3 1 -1.</_>\n                <_>8 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1287260567769408e-003</threshold>\n            <left_val>0.4594863057136536</left_val>\n            <right_val>0.6075533032417297</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 11 4 8 -1.</_>\n                <_>10 11 2 4 2.</_>\n                <_>8 15 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0219692196696997</threshold>\n            <left_val>0.1680400967597961</left_val>\n            <right_val>0.5228595733642578</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1775320055894554e-004</threshold>\n            <left_val>0.3861596882343292</left_val>\n            <right_val>0.5215672850608826</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 18 15 2 -1.</_>\n                <_>3 19 15 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0200149447191507e-004</threshold>\n            <left_val>0.5517979264259338</left_val>\n            <right_val>0.4363039135932922</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 6 2 12 -1.</_>\n                <_>2 6 1 6 2.</_>\n                <_>3 12 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0217331498861313</threshold>\n            <left_val>0.7999460101127625</left_val>\n            <right_val>0.4789851009845734</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 3 -1.</_>\n                <_>9 9 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.4399932529777288e-004</threshold>\n            <left_val>0.4085975885391235</left_val>\n            <right_val>0.5374773144721985</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 10 3 2 -1.</_>\n                <_>8 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3895249837078154e-004</threshold>\n            <left_val>0.5470405220985413</left_val>\n            <right_val>0.4366143047809601</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 11 3 1 -1.</_>\n                <_>12 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5092400135472417e-003</threshold>\n            <left_val>0.4988996982574463</left_val>\n            <right_val>0.5842149257659912</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 3 1 -1.</_>\n                <_>7 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5547839943319559e-003</threshold>\n            <left_val>0.6753690242767334</left_val>\n            <right_val>0.4721005856990814</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 4 2 -1.</_>\n                <_>11 2 2 1 2.</_>\n                <_>9 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8191400128416717e-004</threshold>\n            <left_val>0.5415853857994080</left_val>\n            <right_val>0.4357109069824219</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 3 -1.</_>\n                <_>4 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0264398343861103e-003</threshold>\n            <left_val>0.2258509993553162</left_val>\n            <right_val>0.4991880953311920</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 18 3 -1.</_>\n                <_>8 1 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116681400686502</threshold>\n            <left_val>0.6256554722785950</left_val>\n            <right_val>0.4927498996257782</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 4 14 -1.</_>\n                <_>7 1 2 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8718370012938976e-003</threshold>\n            <left_val>0.3947784900665283</left_val>\n            <right_val>0.5245801806449890</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 12 3 -1.</_>\n                <_>8 16 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0170511696487665</threshold>\n            <left_val>0.4752511084079742</left_val>\n            <right_val>0.5794224143028259</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 17 18 3 -1.</_>\n                <_>7 17 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0133520802482963</threshold>\n            <left_val>0.6041104793548584</left_val>\n            <right_val>0.4544535875320435</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 6 -1.</_>\n                <_>9 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9301801007241011e-004</threshold>\n            <left_val>0.4258275926113129</left_val>\n            <right_val>0.5544905066490173</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 8 -1.</_>\n                <_>9 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0483349692076445e-003</threshold>\n            <left_val>0.5233420133590698</left_val>\n            <right_val>0.3780272901058197</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3579288758337498e-003</threshold>\n            <left_val>0.6371889114379883</left_val>\n            <right_val>0.4838674068450928</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 12 -1.</_>\n                <_>9 10 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6661018170416355e-003</threshold>\n            <left_val>0.5374705791473389</left_val>\n            <right_val>0.4163666069507599</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0677339206449687e-005</threshold>\n            <left_val>0.4638795852661133</left_val>\n            <right_val>0.5311625003814697</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 8 -1.</_>\n                <_>2 1 2 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0367381609976292</threshold>\n            <left_val>0.4688656032085419</left_val>\n            <right_val>0.6466524004936218</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 1 6 2 -1.</_>\n                <_>12 1 3 1 2.</_>\n                <_>9 2 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6528137326240540e-003</threshold>\n            <left_val>0.5204318761825562</left_val>\n            <right_val>0.2188657969236374</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 12 14 -1.</_>\n                <_>1 10 12 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1537135988473892</threshold>\n            <left_val>0.1630371958017349</left_val>\n            <right_val>0.4958840012550354</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 2 -1.</_>\n                <_>10 12 2 1 2.</_>\n                <_>8 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1560421232134104e-004</threshold>\n            <left_val>0.5774459242820740</left_val>\n            <right_val>0.4696458876132965</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 10 2 -1.</_>\n                <_>1 9 5 1 2.</_>\n                <_>6 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2640169588848948e-003</threshold>\n            <left_val>0.3977175951004028</left_val>\n            <right_val>0.5217198133468628</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5473341122269630e-003</threshold>\n            <left_val>0.6046528220176697</left_val>\n            <right_val>0.4808315038681030</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 8 3 -1.</_>\n                <_>6 9 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0019069527043030e-005</threshold>\n            <left_val>0.3996723890304565</left_val>\n            <right_val>0.5228201150894165</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 15 5 3 -1.</_>\n                <_>9 16 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3113019522279501e-003</threshold>\n            <left_val>0.4712158143520355</left_val>\n            <right_val>0.5765997767448425</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 4 3 -1.</_>\n                <_>8 8 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3374709524214268e-003</threshold>\n            <left_val>0.4109584987163544</left_val>\n            <right_val>0.5253170132637024</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 2 -1.</_>\n                <_>7 8 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0208767093718052</threshold>\n            <left_val>0.5202993750572205</left_val>\n            <right_val>0.1757981926202774</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>5 7 4 1 2.</_>\n                <_>9 8 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.5497948564589024e-003</threshold>\n            <left_val>0.6566609740257263</left_val>\n            <right_val>0.4694975018501282</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0241885501891375</threshold>\n            <left_val>0.5128673911094666</left_val>\n            <right_val>0.3370220959186554</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 7 4 2 -1.</_>\n                <_>4 8 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9358828905969858e-003</threshold>\n            <left_val>0.6580786705017090</left_val>\n            <right_val>0.4694541096687317</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 9 -1.</_>\n                <_>14 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0575579293072224</threshold>\n            <left_val>0.5146445035934448</left_val>\n            <right_val>0.2775259912014008</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 3 3 -1.</_>\n                <_>5 9 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1343370424583554e-003</threshold>\n            <left_val>0.3836601972579956</left_val>\n            <right_val>0.5192667245864868</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0168169997632504</threshold>\n            <left_val>0.5085592865943909</left_val>\n            <right_val>0.6177260875701904</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 9 -1.</_>\n                <_>0 5 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0535178743302822e-003</threshold>\n            <left_val>0.5138763189315796</left_val>\n            <right_val>0.3684791922569275</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 3 3 6 -1.</_>\n                <_>18 3 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5874710194766521e-003</threshold>\n            <left_val>0.5989655256271362</left_val>\n            <right_val>0.4835202097892761</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 3 6 -1.</_>\n                <_>1 3 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6882460331544280e-003</threshold>\n            <left_val>0.4509486854076386</left_val>\n            <right_val>0.5723056793212891</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 14 1 2 -1.</_>\n                <_>17 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6554000321775675e-003</threshold>\n            <left_val>0.3496770858764648</left_val>\n            <right_val>0.5243319272994995</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 4 3 -1.</_>\n                <_>6 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0193738006055355</threshold>\n            <left_val>0.1120536997914314</left_val>\n            <right_val>0.4968712925910950</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 9 3 3 -1.</_>\n                <_>12 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0103744501248002</threshold>\n            <left_val>0.5148196816444397</left_val>\n            <right_val>0.4395213127136231</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 9 3 3 -1.</_>\n                <_>5 10 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4973050565458834e-004</threshold>\n            <left_val>0.4084999859333038</left_val>\n            <right_val>0.5269886851310730</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 8 -1.</_>\n                <_>12 5 3 4 2.</_>\n                <_>9 9 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0429819300770760</threshold>\n            <left_val>0.6394104957580566</left_val>\n            <right_val>0.5018504261970520</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 8 -1.</_>\n                <_>5 5 3 4 2.</_>\n                <_>8 9 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3065936341881752e-003</threshold>\n            <left_val>0.4707553982734680</left_val>\n            <right_val>0.6698353290557861</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 1 4 6 -1.</_>\n                <_>16 4 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1285790503025055e-003</threshold>\n            <left_val>0.4541369080543518</left_val>\n            <right_val>0.5323647260665894</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 6 20 -1.</_>\n                <_>3 0 2 20 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.7399420030415058e-003</threshold>\n            <left_val>0.4333961904048920</left_val>\n            <right_val>0.5439866185188294</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 3 2 -1.</_>\n                <_>13 11 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1739750334527344e-004</threshold>\n            <left_val>0.4579687118530273</left_val>\n            <right_val>0.5543426275253296</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 3 2 -1.</_>\n                <_>6 11 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8585780344437808e-004</threshold>\n            <left_val>0.4324643909931183</left_val>\n            <right_val>0.5426754951477051</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 6 1 -1.</_>\n                <_>11 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5587692186236382e-003</threshold>\n            <left_val>0.5257220864295960</left_val>\n            <right_val>0.3550611138343811</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 8 3 -1.</_>\n                <_>4 0 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.9851560294628143e-003</threshold>\n            <left_val>0.6043018102645874</left_val>\n            <right_val>0.4630635976791382</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 0 2 5 -1.</_>\n                <_>15 0 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.0594122624024749e-004</threshold>\n            <left_val>0.4598254859447479</left_val>\n            <right_val>0.5533195137977600</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 1 3 2 -1.</_>\n                <_>5 1 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2983040253166109e-004</threshold>\n            <left_val>0.4130752086639404</left_val>\n            <right_val>0.5322461128234863</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 15 -1.</_>\n                <_>9 0 2 15 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3740210821852088e-004</threshold>\n            <left_val>0.4043039977550507</left_val>\n            <right_val>0.5409289002418518</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 3 1 -1.</_>\n                <_>7 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9482020181603730e-004</threshold>\n            <left_val>0.4494963884353638</left_val>\n            <right_val>0.5628852248191834</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 3 4 -1.</_>\n                <_>13 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0103126596659422</threshold>\n            <left_val>0.5177510976791382</left_val>\n            <right_val>0.2704316973686218</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 1 -1.</_>\n                <_>7 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7241109684109688e-003</threshold>\n            <left_val>0.1988019049167633</left_val>\n            <right_val>0.4980553984642029</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 2 -1.</_>\n                <_>12 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.6797208487987518e-003</threshold>\n            <left_val>0.6644750237464905</left_val>\n            <right_val>0.5018296241760254</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 4 6 -1.</_>\n                <_>0 4 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0755459815263748e-003</threshold>\n            <left_val>0.3898304998874664</left_val>\n            <right_val>0.5185269117355347</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 2 -1.</_>\n                <_>12 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2479740437120199e-003</threshold>\n            <left_val>0.4801808893680573</left_val>\n            <right_val>0.5660336017608643</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 3 3 -1.</_>\n                <_>2 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3327008178457618e-004</threshold>\n            <left_val>0.5210919976234436</left_val>\n            <right_val>0.3957188129425049</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 8 6 10 -1.</_>\n                <_>16 8 3 5 2.</_>\n                <_>13 13 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0412793308496475</threshold>\n            <left_val>0.6154541969299316</left_val>\n            <right_val>0.5007054209709168</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 5 2 -1.</_>\n                <_>0 10 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0930189900100231e-004</threshold>\n            <left_val>0.3975942134857178</left_val>\n            <right_val>0.5228403806686401</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 2 2 -1.</_>\n                <_>13 11 1 1 2.</_>\n                <_>12 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2568780221045017e-003</threshold>\n            <left_val>0.4979138076305389</left_val>\n            <right_val>0.5939183235168457</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 3 3 -1.</_>\n                <_>3 16 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.0048497766256332e-003</threshold>\n            <left_val>0.4984497129917145</left_val>\n            <right_val>0.1633366048336029</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 3 2 -1.</_>\n                <_>12 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1879300000146031e-003</threshold>\n            <left_val>0.5904964804649353</left_val>\n            <right_val>0.4942624866962433</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 3 2 -1.</_>\n                <_>5 8 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1948952497914433e-004</threshold>\n            <left_val>0.4199557900428772</left_val>\n            <right_val>0.5328726172447205</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 9 9 -1.</_>\n                <_>9 8 9 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6829859279096127e-003</threshold>\n            <left_val>0.5418602824211121</left_val>\n            <right_val>0.4905889034271240</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 3 7 -1.</_>\n                <_>6 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7062340416014194e-003</threshold>\n            <left_val>0.3725939095020294</left_val>\n            <right_val>0.5138000249862671</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 12 5 -1.</_>\n                <_>9 2 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0397394113242626</threshold>\n            <left_val>0.6478961110115051</left_val>\n            <right_val>0.5050346851348877</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 2 2 -1.</_>\n                <_>6 11 1 1 2.</_>\n                <_>7 12 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4085009461268783e-003</threshold>\n            <left_val>0.4682339131832123</left_val>\n            <right_val>0.6377884149551392</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 15 3 2 -1.</_>\n                <_>15 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9322688826359808e-004</threshold>\n            <left_val>0.5458530187606812</left_val>\n            <right_val>0.4150482118129730</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 3 2 -1.</_>\n                <_>2 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8979819724336267e-003</threshold>\n            <left_val>0.3690159916877747</left_val>\n            <right_val>0.5149704217910767</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 6 8 -1.</_>\n                <_>17 12 3 4 2.</_>\n                <_>14 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0139704402536154</threshold>\n            <left_val>0.6050562858581543</left_val>\n            <right_val>0.4811357855796814</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 8 15 6 -1.</_>\n                <_>7 8 5 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1010081991553307</threshold>\n            <left_val>0.2017080038785934</left_val>\n            <right_val>0.4992361962795258</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 18 17 -1.</_>\n                <_>8 2 6 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0173469204455614</threshold>\n            <left_val>0.5713148713111877</left_val>\n            <right_val>0.4899486005306244</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 4 1 -1.</_>\n                <_>7 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5619759506080300e-004</threshold>\n            <left_val>0.4215388894081116</left_val>\n            <right_val>0.5392642021179199</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 12 5 -1.</_>\n                <_>9 2 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1343892961740494</threshold>\n            <left_val>0.5136151909828186</left_val>\n            <right_val>0.3767612874507904</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 12 5 -1.</_>\n                <_>7 2 4 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0245822407305241</threshold>\n            <left_val>0.7027357816696167</left_val>\n            <right_val>0.4747906923294067</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 12 4 -1.</_>\n                <_>10 9 6 2 2.</_>\n                <_>4 11 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.8553720805794001e-003</threshold>\n            <left_val>0.4317409098148346</left_val>\n            <right_val>0.5427716970443726</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 6 2 -1.</_>\n                <_>5 15 3 1 2.</_>\n                <_>8 16 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3165249731391668e-003</threshold>\n            <left_val>0.5942698717117310</left_val>\n            <right_val>0.4618647992610931</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 2 3 -1.</_>\n                <_>10 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.8518120311200619e-003</threshold>\n            <left_val>0.6191568970680237</left_val>\n            <right_val>0.4884895086288452</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 2 -1.</_>\n                <_>0 13 10 1 2.</_>\n                <_>10 14 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4699938949197531e-003</threshold>\n            <left_val>0.5256664752960205</left_val>\n            <right_val>0.4017199873924255</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 12 8 -1.</_>\n                <_>10 9 6 4 2.</_>\n                <_>4 13 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0454969592392445</threshold>\n            <left_val>0.5237867832183838</left_val>\n            <right_val>0.2685773968696594</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 3 6 -1.</_>\n                <_>8 16 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0203195996582508</threshold>\n            <left_val>0.2130445986986160</left_val>\n            <right_val>0.4979738891124725</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 2 2 -1.</_>\n                <_>10 13 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6994998916052282e-004</threshold>\n            <left_val>0.4814041852951050</left_val>\n            <right_val>0.5543122291564941</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 2 2 -1.</_>\n                <_>9 12 1 1 2.</_>\n                <_>10 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8232699949294329e-003</threshold>\n            <left_val>0.6482579708099365</left_val>\n            <right_val>0.4709989130496979</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 14 4 -1.</_>\n                <_>11 11 7 2 2.</_>\n                <_>4 13 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3015790656208992e-003</threshold>\n            <left_val>0.4581927955150604</left_val>\n            <right_val>0.5306236147880554</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 4 2 -1.</_>\n                <_>8 6 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4139499873854220e-004</threshold>\n            <left_val>0.5232086777687073</left_val>\n            <right_val>0.4051763117313385</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 6 3 -1.</_>\n                <_>12 10 2 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0330369696021080e-003</threshold>\n            <left_val>0.5556201934814453</left_val>\n            <right_val>0.4789193868637085</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 14 1 2 -1.</_>\n                <_>2 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.8041160365100950e-004</threshold>\n            <left_val>0.5229442715644836</left_val>\n            <right_val>0.4011810123920441</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 8 6 12 -1.</_>\n                <_>16 8 3 6 2.</_>\n                <_>13 14 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0614078603684902</threshold>\n            <left_val>0.6298682093620300</left_val>\n            <right_val>0.5010703206062317</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 6 12 -1.</_>\n                <_>1 8 3 6 2.</_>\n                <_>4 14 3 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0695439130067825</threshold>\n            <left_val>0.7228280901908875</left_val>\n            <right_val>0.4773184061050415</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 0 6 10 -1.</_>\n                <_>12 0 2 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0705426633358002</threshold>\n            <left_val>0.2269513010978699</left_val>\n            <right_val>0.5182529091835022</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 8 4 -1.</_>\n                <_>5 11 4 2 2.</_>\n                <_>9 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4423799477517605e-003</threshold>\n            <left_val>0.5237097144126892</left_val>\n            <right_val>0.4098151028156281</right_val></_></_>\n        <_>\n          <!-- tree 177 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 16 8 4 -1.</_>\n                <_>14 16 4 2 2.</_>\n                <_>10 18 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5494349645450711e-003</threshold>\n            <left_val>0.4773750901222229</left_val>\n            <right_val>0.5468043088912964</right_val></_></_>\n        <_>\n          <!-- tree 178 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 6 -1.</_>\n                <_>9 7 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0239142198115587</threshold>\n            <left_val>0.7146975994110107</left_val>\n            <right_val>0.4783824980258942</right_val></_></_>\n        <_>\n          <!-- tree 179 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 2 4 10 -1.</_>\n                <_>10 2 2 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0124536901712418</threshold>\n            <left_val>0.2635296881198883</left_val>\n            <right_val>0.5241122841835022</right_val></_></_>\n        <_>\n          <!-- tree 180 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 4 9 -1.</_>\n                <_>8 1 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0760179904755205e-004</threshold>\n            <left_val>0.3623757064342499</left_val>\n            <right_val>0.5113608837127686</right_val></_></_>\n        <_>\n          <!-- tree 181 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 19 2 1 -1.</_>\n                <_>12 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9781080229440704e-005</threshold>\n            <left_val>0.4705932140350342</left_val>\n            <right_val>0.5432801842689514</right_val></_></_></trees>\n      <stage_threshold>90.2533493041992190</stage_threshold>\n      <parent>18</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 20 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 4 9 -1.</_>\n                <_>3 2 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0117727499455214</threshold>\n            <left_val>0.3860518932342529</left_val>\n            <right_val>0.6421167254447937</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 5 6 4 -1.</_>\n                <_>9 5 2 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0270375702530146</threshold>\n            <left_val>0.4385654926300049</left_val>\n            <right_val>0.6754038929939270</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 4 -1.</_>\n                <_>9 6 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6419500247575343e-005</threshold>\n            <left_val>0.5487101078033447</left_val>\n            <right_val>0.3423315882682800</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 5 2 8 -1.</_>\n                <_>14 9 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9995409529656172e-003</threshold>\n            <left_val>0.3230532109737396</left_val>\n            <right_val>0.5400317907333374</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 5 12 -1.</_>\n                <_>7 12 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5278300531208515e-003</threshold>\n            <left_val>0.5091639757156372</left_val>\n            <right_val>0.2935043871402741</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 6 -1.</_>\n                <_>14 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7890920541249216e-004</threshold>\n            <left_val>0.4178153872489929</left_val>\n            <right_val>0.5344064235687256</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 2 6 -1.</_>\n                <_>4 9 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1720920447260141e-003</threshold>\n            <left_val>0.2899182140827179</left_val>\n            <right_val>0.5132070779800415</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 10 4 -1.</_>\n                <_>13 15 5 2 2.</_>\n                <_>8 17 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.5305702416226268e-004</threshold>\n            <left_val>0.4280124902725220</left_val>\n            <right_val>0.5560845136642456</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 18 2 2 -1.</_>\n                <_>7 18 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5099150004971307e-005</threshold>\n            <left_val>0.4044871926307678</left_val>\n            <right_val>0.5404760241508484</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 2 -1.</_>\n                <_>11 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0817901976406574e-004</threshold>\n            <left_val>0.4271768927574158</left_val>\n            <right_val>0.5503466129302979</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 16 6 -1.</_>\n                <_>2 2 16 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3224520739167929e-003</threshold>\n            <left_val>0.3962723910808563</left_val>\n            <right_val>0.5369734764099121</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 2 -1.</_>\n                <_>11 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1037490330636501e-003</threshold>\n            <left_val>0.4727177917957306</left_val>\n            <right_val>0.5237749814987183</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 10 3 -1.</_>\n                <_>4 12 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4350269921123981e-003</threshold>\n            <left_val>0.5603008270263672</left_val>\n            <right_val>0.4223509132862091</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 6 2 -1.</_>\n                <_>11 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0767399109899998e-003</threshold>\n            <left_val>0.5225917100906372</left_val>\n            <right_val>0.4732725918292999</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 3 6 2 -1.</_>\n                <_>3 4 6 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6412809782195836e-004</threshold>\n            <left_val>0.3999075889587402</left_val>\n            <right_val>0.5432739853858948</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 7 -1.</_>\n                <_>16 0 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.8302437216043472e-003</threshold>\n            <left_val>0.4678385853767395</left_val>\n            <right_val>0.6027327179908752</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 9 6 -1.</_>\n                <_>0 16 9 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0105520701035857</threshold>\n            <left_val>0.3493967056274414</left_val>\n            <right_val>0.5213974714279175</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 3 -1.</_>\n                <_>9 17 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2731600329279900e-003</threshold>\n            <left_val>0.6185818910598755</left_val>\n            <right_val>0.4749062955379486</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 6 6 2 -1.</_>\n                <_>6 6 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.4786332445219159e-004</threshold>\n            <left_val>0.5285341143608093</left_val>\n            <right_val>0.3843482136726379</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 3 -1.</_>\n                <_>15 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2081359745934606e-003</threshold>\n            <left_val>0.5360640883445740</left_val>\n            <right_val>0.3447335958480835</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 3 -1.</_>\n                <_>5 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6512730401009321e-003</threshold>\n            <left_val>0.4558292031288147</left_val>\n            <right_val>0.6193962097167969</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 2 2 -1.</_>\n                <_>10 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1012479662895203e-003</threshold>\n            <left_val>0.3680230081081390</left_val>\n            <right_val>0.5327628254890442</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 4 3 -1.</_>\n                <_>5 1 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9561518244445324e-004</threshold>\n            <left_val>0.3960595130920410</left_val>\n            <right_val>0.5274940729141235</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 4 7 -1.</_>\n                <_>16 0 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0439017713069916</threshold>\n            <left_val>0.7020444869995117</left_val>\n            <right_val>0.4992839097976685</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 20 1 -1.</_>\n                <_>10 0 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0346903502941132</threshold>\n            <left_val>0.5049164295196533</left_val>\n            <right_val>0.2766602933406830</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 3 -1.</_>\n                <_>15 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7442190330475569e-003</threshold>\n            <left_val>0.2672632932662964</left_val>\n            <right_val>0.5274971127510071</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 3 4 -1.</_>\n                <_>1 4 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3316588960587978e-003</threshold>\n            <left_val>0.4579482972621918</left_val>\n            <right_val>0.6001101732254028</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 3 3 6 -1.</_>\n                <_>16 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0200445707887411</threshold>\n            <left_val>0.3171594142913818</left_val>\n            <right_val>0.5235717892646790</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 3 3 6 -1.</_>\n                <_>1 5 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3492030557245016e-003</threshold>\n            <left_val>0.5265362858772278</left_val>\n            <right_val>0.4034324884414673</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 2 12 6 -1.</_>\n                <_>12 2 6 3 2.</_>\n                <_>6 5 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9702018946409225e-003</threshold>\n            <left_val>0.5332456827163696</left_val>\n            <right_val>0.4571984112262726</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 4 3 -1.</_>\n                <_>8 11 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3039981760084629e-003</threshold>\n            <left_val>0.4593310952186585</left_val>\n            <right_val>0.6034635901451111</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 14 6 -1.</_>\n                <_>11 2 7 3 2.</_>\n                <_>4 5 7 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0129365902394056</threshold>\n            <left_val>0.4437963962554932</left_val>\n            <right_val>0.5372971296310425</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0148729458451271e-003</threshold>\n            <left_val>0.4680323898792267</left_val>\n            <right_val>0.6437833905220032</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6401679497212172e-003</threshold>\n            <left_val>0.3709631860256195</left_val>\n            <right_val>0.5314332842826843</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0139184398576617</threshold>\n            <left_val>0.4723555147647858</left_val>\n            <right_val>0.7130808830261231</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 11 1 3 -1.</_>\n                <_>15 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5087869511917233e-004</threshold>\n            <left_val>0.4492394030094147</left_val>\n            <right_val>0.5370404124259949</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 5 2 -1.</_>\n                <_>7 14 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.5384349282830954e-004</threshold>\n            <left_val>0.4406864047050476</left_val>\n            <right_val>0.5514402985572815</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 6 3 -1.</_>\n                <_>7 13 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2710000630468130e-003</threshold>\n            <left_val>0.4682416915893555</left_val>\n            <right_val>0.5967984199523926</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 11 4 4 -1.</_>\n                <_>5 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4120779708027840e-003</threshold>\n            <left_val>0.5079392194747925</left_val>\n            <right_val>0.3018598854541779</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 3 3 -1.</_>\n                <_>12 4 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6025670851813629e-005</threshold>\n            <left_val>0.5601037144660950</left_val>\n            <right_val>0.4471096992492676</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 4 3 3 -1.</_>\n                <_>7 4 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4905529618263245e-003</threshold>\n            <left_val>0.2207535058259964</left_val>\n            <right_val>0.4989944100379944</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 5 3 6 -1.</_>\n                <_>17 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0175131205469370</threshold>\n            <left_val>0.6531215906143189</left_val>\n            <right_val>0.5017648935317993</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 6 12 7 -1.</_>\n                <_>7 6 4 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1428163051605225</threshold>\n            <left_val>0.4967963099479675</left_val>\n            <right_val>0.1482062041759491</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 5 3 6 -1.</_>\n                <_>17 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5345268920063972e-003</threshold>\n            <left_val>0.4898946881294251</left_val>\n            <right_val>0.5954223871231079</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.6323591424152255e-004</threshold>\n            <left_val>0.3927116990089417</left_val>\n            <right_val>0.5196074247360230</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 5 3 6 -1.</_>\n                <_>17 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.0370010752230883e-003</threshold>\n            <left_val>0.5613325238227844</left_val>\n            <right_val>0.4884858131408691</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 5 3 6 -1.</_>\n                <_>2 5 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6614829655736685e-003</threshold>\n            <left_val>0.4472880065441132</left_val>\n            <right_val>0.5578880906105042</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 1 -1.</_>\n                <_>7 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1188090797513723e-003</threshold>\n            <left_val>0.3840532898902893</left_val>\n            <right_val>0.5397477746009827</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 9 8 7 -1.</_>\n                <_>4 9 4 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4000617712736130e-003</threshold>\n            <left_val>0.5843983888626099</left_val>\n            <right_val>0.4533218145370483</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 11 8 2 -1.</_>\n                <_>12 12 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1319601112045348e-004</threshold>\n            <left_val>0.5439221858978272</left_val>\n            <right_val>0.4234727919101715</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 11 8 2 -1.</_>\n                <_>0 12 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0182220991700888</threshold>\n            <left_val>0.1288464963436127</left_val>\n            <right_val>0.4958404898643494</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 2 3 -1.</_>\n                <_>9 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7969247251749039e-003</threshold>\n            <left_val>0.4951297938823700</left_val>\n            <right_val>0.7153480052947998</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 12 4 -1.</_>\n                <_>4 10 6 2 2.</_>\n                <_>10 12 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2395070195198059e-003</threshold>\n            <left_val>0.3946599960327148</left_val>\n            <right_val>0.5194936990737915</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 3 7 -1.</_>\n                <_>10 3 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.7086271271109581e-003</threshold>\n            <left_val>0.4897503852844238</left_val>\n            <right_val>0.6064900159835815</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 3 5 -1.</_>\n                <_>8 2 1 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.9934171363711357e-003</threshold>\n            <left_val>0.3245440125465393</left_val>\n            <right_val>0.5060828924179077</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 4 6 -1.</_>\n                <_>11 12 2 3 2.</_>\n                <_>9 15 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0167850591242313</threshold>\n            <left_val>0.1581953018903732</left_val>\n            <right_val>0.5203778743743897</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 6 -1.</_>\n                <_>9 7 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0182720907032490</threshold>\n            <left_val>0.4680935144424439</left_val>\n            <right_val>0.6626979112625122</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 4 4 2 -1.</_>\n                <_>15 5 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6872838176786900e-003</threshold>\n            <left_val>0.5211697816848755</left_val>\n            <right_val>0.3512184917926788</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>9 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0739039862528443e-003</threshold>\n            <left_val>0.5768386125564575</left_val>\n            <right_val>0.4529845118522644</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 2 6 4 -1.</_>\n                <_>14 4 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.7093870341777802e-003</threshold>\n            <left_val>0.4507763087749481</left_val>\n            <right_val>0.5313581228256226</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 16 6 1 -1.</_>\n                <_>9 16 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1110709349159151e-004</threshold>\n            <left_val>0.5460820198059082</left_val>\n            <right_val>0.4333376884460449</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 13 2 3 -1.</_>\n                <_>15 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0670139454305172e-003</threshold>\n            <left_val>0.5371856093406677</left_val>\n            <right_val>0.4078390896320343</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 10 -1.</_>\n                <_>9 7 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5943021066486835e-003</threshold>\n            <left_val>0.4471287131309509</left_val>\n            <right_val>0.5643836259841919</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 10 2 6 -1.</_>\n                <_>11 12 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1776031032204628e-003</threshold>\n            <left_val>0.4499393105506897</left_val>\n            <right_val>0.5280330181121826</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 4 1 -1.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5414369883947074e-004</threshold>\n            <left_val>0.5516173243522644</left_val>\n            <right_val>0.4407708048820496</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 9 2 2 -1.</_>\n                <_>10 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3522560521960258e-003</threshold>\n            <left_val>0.5194190144538879</left_val>\n            <right_val>0.2465227991342545</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 2 2 -1.</_>\n                <_>8 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4205080484971404e-004</threshold>\n            <left_val>0.3830705881118774</left_val>\n            <right_val>0.5139682292938232</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 2 2 -1.</_>\n                <_>13 7 1 1 2.</_>\n                <_>12 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4488727841526270e-004</threshold>\n            <left_val>0.4891090989112854</left_val>\n            <right_val>0.5974786877632141</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 2 -1.</_>\n                <_>5 7 1 1 2.</_>\n                <_>6 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5116379149258137e-003</threshold>\n            <left_val>0.7413681745529175</left_val>\n            <right_val>0.4768764972686768</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 14 -1.</_>\n                <_>14 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0125409103929996</threshold>\n            <left_val>0.3648819029331207</left_val>\n            <right_val>0.5252826809883118</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 3 14 -1.</_>\n                <_>5 0 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4931852072477341e-003</threshold>\n            <left_val>0.5100492835044861</left_val>\n            <right_val>0.3629586994647980</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 4 3 14 -1.</_>\n                <_>14 4 1 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0129611501470208</threshold>\n            <left_val>0.5232442021369934</left_val>\n            <right_val>0.4333561062812805</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 3 -1.</_>\n                <_>9 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7209449112415314e-003</threshold>\n            <left_val>0.4648149013519287</left_val>\n            <right_val>0.6331052780151367</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3119079414755106e-003</threshold>\n            <left_val>0.5930309891700745</left_val>\n            <right_val>0.4531058073043823</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 2 3 16 -1.</_>\n                <_>5 2 1 16 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8262299019843340e-003</threshold>\n            <left_val>0.3870477974414825</left_val>\n            <right_val>0.5257101058959961</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 8 10 -1.</_>\n                <_>7 7 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4311339473351836e-003</threshold>\n            <left_val>0.5522503256797791</left_val>\n            <right_val>0.4561854898929596</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 14 7 3 -1.</_>\n                <_>6 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9378310535103083e-003</threshold>\n            <left_val>0.4546220898628235</left_val>\n            <right_val>0.5736966729164124</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 2 10 12 -1.</_>\n                <_>14 2 5 6 2.</_>\n                <_>9 8 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.6343559147790074e-004</threshold>\n            <left_val>0.5345739126205444</left_val>\n            <right_val>0.4571875035762787</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 7 8 2 -1.</_>\n                <_>6 8 8 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.8257522545754910e-004</threshold>\n            <left_val>0.3967815935611725</left_val>\n            <right_val>0.5220187902450562</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 4 6 -1.</_>\n                <_>8 16 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0195504408329725</threshold>\n            <left_val>0.2829642891883850</left_val>\n            <right_val>0.5243508219718933</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 3 -1.</_>\n                <_>6 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3914958951063454e-004</threshold>\n            <left_val>0.4590066969394684</left_val>\n            <right_val>0.5899090170860291</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 6 -1.</_>\n                <_>16 4 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0214520003646612</threshold>\n            <left_val>0.5231410861015320</left_val>\n            <right_val>0.2855378985404968</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 4 2 -1.</_>\n                <_>6 6 2 1 2.</_>\n                <_>8 7 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8973580598831177e-004</threshold>\n            <left_val>0.4397256970405579</left_val>\n            <right_val>0.5506421923637390</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 2 4 6 -1.</_>\n                <_>16 4 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0261576101183891</threshold>\n            <left_val>0.3135079145431519</left_val>\n            <right_val>0.5189175009727478</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 4 6 -1.</_>\n                <_>0 4 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0139598604291677</threshold>\n            <left_val>0.3213272988796234</left_val>\n            <right_val>0.5040717720985413</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 6 2 6 -1.</_>\n                <_>9 6 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3699018210172653e-003</threshold>\n            <left_val>0.6387544870376587</left_val>\n            <right_val>0.4849506914615631</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 6 10 -1.</_>\n                <_>3 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.5613820701837540e-003</threshold>\n            <left_val>0.2759132087230682</left_val>\n            <right_val>0.5032019019126892</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 6 -1.</_>\n                <_>9 5 1 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.6622901037335396e-004</threshold>\n            <left_val>0.4685640931129456</left_val>\n            <right_val>0.5834879279136658</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 2 3 -1.</_>\n                <_>3 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.6550268568098545e-004</threshold>\n            <left_val>0.5175207257270813</left_val>\n            <right_val>0.3896422088146210</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 3 2 -1.</_>\n                <_>13 14 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1833340227603912e-003</threshold>\n            <left_val>0.2069136947393417</left_val>\n            <right_val>0.5208122134208679</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 16 10 4 -1.</_>\n                <_>2 16 5 2 2.</_>\n                <_>7 18 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3976939097046852e-003</threshold>\n            <left_val>0.6134091019630432</left_val>\n            <right_val>0.4641222953796387</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 6 -1.</_>\n                <_>10 6 5 3 2.</_>\n                <_>5 9 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.8028980381786823e-003</threshold>\n            <left_val>0.5454108119010925</left_val>\n            <right_val>0.4395219981670380</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 1 3 -1.</_>\n                <_>7 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5680569708347321e-003</threshold>\n            <left_val>0.6344485282897949</left_val>\n            <right_val>0.4681093990802765</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 16 6 3 -1.</_>\n                <_>14 17 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0733120404183865e-003</threshold>\n            <left_val>0.5292683243751526</left_val>\n            <right_val>0.4015620052814484</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2568129459396005e-003</threshold>\n            <left_val>0.4392988085746765</left_val>\n            <right_val>0.5452824831008911</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 10 3 -1.</_>\n                <_>7 5 10 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9065010603517294e-003</threshold>\n            <left_val>0.5898832082748413</left_val>\n            <right_val>0.4863379895687103</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 5 4 -1.</_>\n                <_>0 6 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4409340694546700e-003</threshold>\n            <left_val>0.4069364964962006</left_val>\n            <right_val>0.5247421860694885</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 11 3 9 -1.</_>\n                <_>13 14 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0248307008296251</threshold>\n            <left_val>0.5182725787162781</left_val>\n            <right_val>0.3682524859905243</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 9 -1.</_>\n                <_>4 14 3 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0488540083169937</threshold>\n            <left_val>0.1307577937841415</left_val>\n            <right_val>0.4961281120777130</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 1 -1.</_>\n                <_>9 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6110379947349429e-003</threshold>\n            <left_val>0.6421005725860596</left_val>\n            <right_val>0.4872662127017975</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 6 17 -1.</_>\n                <_>7 0 2 17 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0970094799995422</threshold>\n            <left_val>0.0477693490684032</left_val>\n            <right_val>0.4950988888740540</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 6 3 -1.</_>\n                <_>10 3 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1209240183234215e-003</threshold>\n            <left_val>0.4616267085075378</left_val>\n            <right_val>0.5354745984077454</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 2 15 4 -1.</_>\n                <_>7 2 5 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3064090162515640e-003</threshold>\n            <left_val>0.6261854171752930</left_val>\n            <right_val>0.4638805985450745</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 8 2 -1.</_>\n                <_>12 2 4 1 2.</_>\n                <_>8 3 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.5771620352752507e-004</threshold>\n            <left_val>0.5384417772293091</left_val>\n            <right_val>0.4646640121936798</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 3 6 -1.</_>\n                <_>8 3 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.3149951165542006e-004</threshold>\n            <left_val>0.3804047107696533</left_val>\n            <right_val>0.5130257010459900</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 2 2 -1.</_>\n                <_>9 18 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4505970466416329e-004</threshold>\n            <left_val>0.4554310142993927</left_val>\n            <right_val>0.5664461851119995</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 14 -1.</_>\n                <_>1 0 1 14 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0164745505899191</threshold>\n            <left_val>0.6596958041191101</left_val>\n            <right_val>0.4715859889984131</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 7 3 -1.</_>\n                <_>12 1 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0133695797994733</threshold>\n            <left_val>0.5195466279983521</left_val>\n            <right_val>0.3035964965820313</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 1 2 -1.</_>\n                <_>1 15 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0271780047332868e-004</threshold>\n            <left_val>0.5229176282882690</left_val>\n            <right_val>0.4107066094875336</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 8 -1.</_>\n                <_>15 12 1 4 2.</_>\n                <_>14 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5311559699475765e-003</threshold>\n            <left_val>0.6352887749671936</left_val>\n            <right_val>0.4960907101631165</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 7 3 -1.</_>\n                <_>1 1 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6187049224972725e-003</threshold>\n            <left_val>0.3824546039104462</left_val>\n            <right_val>0.5140984058380127</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 8 -1.</_>\n                <_>15 12 1 4 2.</_>\n                <_>14 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0834268331527710e-003</threshold>\n            <left_val>0.4950439929962158</left_val>\n            <right_val>0.6220818758010864</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 12 -1.</_>\n                <_>6 0 4 6 2.</_>\n                <_>10 6 4 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0798181593418121</threshold>\n            <left_val>0.4952335953712463</left_val>\n            <right_val>0.1322475969791412</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 8 9 -1.</_>\n                <_>6 4 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0992265865206718</threshold>\n            <left_val>0.7542728781700134</left_val>\n            <right_val>0.5008416771888733</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 2 2 -1.</_>\n                <_>5 3 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.5174017800018191e-004</threshold>\n            <left_val>0.3699302971363068</left_val>\n            <right_val>0.5130121111869812</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 6 6 -1.</_>\n                <_>16 14 3 3 2.</_>\n                <_>13 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0189968496561050</threshold>\n            <left_val>0.6689178943634033</left_val>\n            <right_val>0.4921202957630158</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 20 2 -1.</_>\n                <_>0 17 10 1 2.</_>\n                <_>10 18 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0173468999564648</threshold>\n            <left_val>0.4983300864696503</left_val>\n            <right_val>0.1859198063611984</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 2 6 -1.</_>\n                <_>11 3 1 3 2.</_>\n                <_>10 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5082101607695222e-004</threshold>\n            <left_val>0.4574424028396606</left_val>\n            <right_val>0.5522121787071228</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 6 2 -1.</_>\n                <_>8 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.0056050270795822e-003</threshold>\n            <left_val>0.5131744742393494</left_val>\n            <right_val>0.3856469988822937</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 6 13 -1.</_>\n                <_>10 7 3 13 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7688191086053848e-003</threshold>\n            <left_val>0.4361700117588043</left_val>\n            <right_val>0.5434309244155884</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 10 5 -1.</_>\n                <_>10 15 5 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0508782789111137</threshold>\n            <left_val>0.4682720899581909</left_val>\n            <right_val>0.6840639710426331</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 4 4 10 -1.</_>\n                <_>10 4 2 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2901780903339386e-003</threshold>\n            <left_val>0.4329245090484619</left_val>\n            <right_val>0.5306099057197571</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 1 -1.</_>\n                <_>6 7 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5715380141045898e-004</threshold>\n            <left_val>0.5370057225227356</left_val>\n            <right_val>0.4378164112567902</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 6 7 -1.</_>\n                <_>10 3 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1051924005150795</threshold>\n            <left_val>0.5137274265289307</left_val>\n            <right_val>0.0673614665865898</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 6 7 -1.</_>\n                <_>7 3 3 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7198919560760260e-003</threshold>\n            <left_val>0.4112060964107513</left_val>\n            <right_val>0.5255665183067322</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 7 18 5 -1.</_>\n                <_>7 7 6 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0483377799391747</threshold>\n            <left_val>0.5404623746871948</left_val>\n            <right_val>0.4438967108726502</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 17 4 3 -1.</_>\n                <_>5 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.5703761326149106e-004</threshold>\n            <left_val>0.4355969130992889</left_val>\n            <right_val>0.5399510860443115</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 12 6 -1.</_>\n                <_>14 14 6 3 2.</_>\n                <_>8 17 6 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0253712590783834</threshold>\n            <left_val>0.5995175242424011</left_val>\n            <right_val>0.5031024813652039</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 13 20 4 -1.</_>\n                <_>0 13 10 2 2.</_>\n                <_>10 15 10 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0524579510092735</threshold>\n            <left_val>0.4950287938117981</left_val>\n            <right_val>0.1398351043462753</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 14 2 -1.</_>\n                <_>11 5 7 1 2.</_>\n                <_>4 6 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0123656298965216</threshold>\n            <left_val>0.6397299170494080</left_val>\n            <right_val>0.4964106082916260</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 10 12 -1.</_>\n                <_>1 2 5 6 2.</_>\n                <_>6 8 5 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.1458971947431564</threshold>\n            <left_val>0.1001669988036156</left_val>\n            <right_val>0.4946322143077850</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 14 3 -1.</_>\n                <_>6 2 14 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0159086007624865</threshold>\n            <left_val>0.3312329947948456</left_val>\n            <right_val>0.5208340883255005</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 2 3 -1.</_>\n                <_>8 17 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9486068999394774e-004</threshold>\n            <left_val>0.4406363964080811</left_val>\n            <right_val>0.5426102876663208</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2454001270234585e-003</threshold>\n            <left_val>0.2799589931964874</left_val>\n            <right_val>0.5189967155456543</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 15 4 2 -1.</_>\n                <_>5 15 2 1 2.</_>\n                <_>7 16 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.0421799533069134e-003</threshold>\n            <left_val>0.6987580060958862</left_val>\n            <right_val>0.4752142131328583</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 15 1 3 -1.</_>\n                <_>10 16 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9812189750373363e-003</threshold>\n            <left_val>0.4983288943767548</left_val>\n            <right_val>0.6307479739189148</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 16 4 4 -1.</_>\n                <_>8 16 2 2 2.</_>\n                <_>10 18 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2884308174252510e-003</threshold>\n            <left_val>0.2982333004474640</left_val>\n            <right_val>0.5026869773864746</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 11 8 6 -1.</_>\n                <_>6 14 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5094350092113018e-003</threshold>\n            <left_val>0.5308442115783691</left_val>\n            <right_val>0.3832970857620239</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 13 5 2 -1.</_>\n                <_>2 14 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.3340799212455750e-003</threshold>\n            <left_val>0.2037964016199112</left_val>\n            <right_val>0.4969817101955414</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 6 6 -1.</_>\n                <_>16 14 3 3 2.</_>\n                <_>13 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0286671407520771</threshold>\n            <left_val>0.5025696754455566</left_val>\n            <right_val>0.6928027272224426</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 4 -1.</_>\n                <_>7 9 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1701968014240265</threshold>\n            <left_val>0.4960052967071533</left_val>\n            <right_val>0.1476442962884903</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 6 6 -1.</_>\n                <_>16 14 3 3 2.</_>\n                <_>13 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.2614478841423988e-003</threshold>\n            <left_val>0.5603063702583313</left_val>\n            <right_val>0.4826056063175201</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 1 6 -1.</_>\n                <_>0 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5769277969375253e-004</threshold>\n            <left_val>0.5205562114715576</left_val>\n            <right_val>0.4129633009433746</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 15 20 -1.</_>\n                <_>5 10 15 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.3625833988189697</threshold>\n            <left_val>0.5221652984619141</left_val>\n            <right_val>0.3768612146377564</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 6 6 -1.</_>\n                <_>1 14 3 3 2.</_>\n                <_>4 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116151301190257</threshold>\n            <left_val>0.6022682785987854</left_val>\n            <right_val>0.4637489914894104</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 6 -1.</_>\n                <_>10 14 2 3 2.</_>\n                <_>8 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.0795197710394859e-003</threshold>\n            <left_val>0.4070447087287903</left_val>\n            <right_val>0.5337479114532471</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 2 1 -1.</_>\n                <_>8 11 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7204300537705421e-004</threshold>\n            <left_val>0.4601835012435913</left_val>\n            <right_val>0.5900393128395081</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 17 3 2 -1.</_>\n                <_>10 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7543348995968699e-004</threshold>\n            <left_val>0.5398252010345459</left_val>\n            <right_val>0.4345428943634033</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 3 2 -1.</_>\n                <_>9 17 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.3295697327703238e-004</threshold>\n            <left_val>0.5201563239097595</left_val>\n            <right_val>0.4051358997821808</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 14 4 6 -1.</_>\n                <_>14 14 2 3 2.</_>\n                <_>12 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2435320531949401e-003</threshold>\n            <left_val>0.4642387926578522</left_val>\n            <right_val>0.5547441244125366</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 4 6 -1.</_>\n                <_>4 14 2 3 2.</_>\n                <_>6 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7363857738673687e-003</threshold>\n            <left_val>0.6198567152023315</left_val>\n            <right_val>0.4672552049160004</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 2 6 -1.</_>\n                <_>14 14 1 3 2.</_>\n                <_>13 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.4658462069928646e-003</threshold>\n            <left_val>0.6837332844734192</left_val>\n            <right_val>0.5019000768661499</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 14 2 6 -1.</_>\n                <_>5 14 1 3 2.</_>\n                <_>6 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.5017321351915598e-004</threshold>\n            <left_val>0.4344803094863892</left_val>\n            <right_val>0.5363622903823853</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 0 6 12 -1.</_>\n                <_>7 4 6 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5754920605104417e-004</threshold>\n            <left_val>0.4760079085826874</left_val>\n            <right_val>0.5732020735740662</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 7 12 2 -1.</_>\n                <_>4 7 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.9774366244673729e-003</threshold>\n            <left_val>0.5090985894203186</left_val>\n            <right_val>0.3635039925575256</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 3 3 13 -1.</_>\n                <_>11 3 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1464529931545258e-004</threshold>\n            <left_val>0.5570064783096314</left_val>\n            <right_val>0.4593802094459534</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 3 3 13 -1.</_>\n                <_>8 3 1 13 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.5888899583369493e-004</threshold>\n            <left_val>0.5356845855712891</left_val>\n            <right_val>0.4339134991168976</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 6 3 -1.</_>\n                <_>10 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.0463250479660928e-004</threshold>\n            <left_val>0.4439803063869476</left_val>\n            <right_val>0.5436776876449585</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 3 2 -1.</_>\n                <_>4 11 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.2184787606820464e-004</threshold>\n            <left_val>0.4042294919490814</left_val>\n            <right_val>0.5176299214363098</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 12 6 8 -1.</_>\n                <_>16 12 3 4 2.</_>\n                <_>13 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9467419050633907e-003</threshold>\n            <left_val>0.4927651882171631</left_val>\n            <right_val>0.5633779764175415</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 5 -1.</_>\n                <_>9 6 2 5 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0217533893883228</threshold>\n            <left_val>0.8006293773651123</left_val>\n            <right_val>0.4800840914249420</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 11 2 7 -1.</_>\n                <_>17 11 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0145403798669577</threshold>\n            <left_val>0.3946054875850678</left_val>\n            <right_val>0.5182222723960877</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 8 2 -1.</_>\n                <_>7 13 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0405107699334621</threshold>\n            <left_val>0.0213249903172255</left_val>\n            <right_val>0.4935792982578278</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 3 -1.</_>\n                <_>6 10 8 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8458268176764250e-004</threshold>\n            <left_val>0.4012795984745026</left_val>\n            <right_val>0.5314025282859802</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 4 3 -1.</_>\n                <_>4 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5151800625026226e-003</threshold>\n            <left_val>0.4642418920993805</left_val>\n            <right_val>0.5896260738372803</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 4 3 -1.</_>\n                <_>11 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0626221820712090e-003</threshold>\n            <left_val>0.6502159237861633</left_val>\n            <right_val>0.5016477704048157</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 4 17 12 -1.</_>\n                <_>1 8 17 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0945358425378799</threshold>\n            <left_val>0.5264708995819092</left_val>\n            <right_val>0.4126827120780945</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 4 3 -1.</_>\n                <_>11 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7315051779150963e-003</threshold>\n            <left_val>0.4879199862480164</left_val>\n            <right_val>0.5892447829246521</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 6 3 -1.</_>\n                <_>4 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2571471314877272e-004</threshold>\n            <left_val>0.3917280137538910</left_val>\n            <right_val>0.5189412832260132</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 3 5 3 -1.</_>\n                <_>12 4 5 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.5464049540460110e-003</threshold>\n            <left_val>0.5837599039077759</left_val>\n            <right_val>0.4985705912113190</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 2 7 -1.</_>\n                <_>2 11 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0260756891220808</threshold>\n            <left_val>0.1261983960866928</left_val>\n            <right_val>0.4955821931362152</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 8 -1.</_>\n                <_>16 12 1 4 2.</_>\n                <_>15 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4779709316790104e-003</threshold>\n            <left_val>0.5722513794898987</left_val>\n            <right_val>0.5010265707969666</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 11 3 -1.</_>\n                <_>4 9 11 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1337741315364838e-003</threshold>\n            <left_val>0.5273262262344360</left_val>\n            <right_val>0.4226376116275787</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 6 2 -1.</_>\n                <_>12 13 3 1 2.</_>\n                <_>9 14 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7944980906322598e-004</threshold>\n            <left_val>0.4450066983699799</left_val>\n            <right_val>0.5819587111473084</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 13 4 3 -1.</_>\n                <_>6 14 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1114079281687737e-003</threshold>\n            <left_val>0.5757653117179871</left_val>\n            <right_val>0.4511714875698090</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 3 3 -1.</_>\n                <_>10 12 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0131799904629588</threshold>\n            <left_val>0.1884381026029587</left_val>\n            <right_val>0.5160734057426453</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 3 3 -1.</_>\n                <_>5 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.7968099825084209e-003</threshold>\n            <left_val>0.6589789986610413</left_val>\n            <right_val>0.4736118912696838</right_val></_></_>\n        <_>\n          <!-- tree 177 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 4 2 3 -1.</_>\n                <_>9 5 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7483168095350266e-003</threshold>\n            <left_val>0.5259429812431335</left_val>\n            <right_val>0.3356395065784454</right_val></_></_>\n        <_>\n          <!-- tree 178 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 16 3 -1.</_>\n                <_>0 3 16 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4623369788751006e-003</threshold>\n            <left_val>0.5355271100997925</left_val>\n            <right_val>0.4264092147350311</right_val></_></_>\n        <_>\n          <!-- tree 179 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 12 2 8 -1.</_>\n                <_>16 12 1 4 2.</_>\n                <_>15 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7645159065723419e-003</threshold>\n            <left_val>0.5034406781196594</left_val>\n            <right_val>0.5786827802658081</right_val></_></_>\n        <_>\n          <!-- tree 180 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 12 2 8 -1.</_>\n                <_>3 12 1 4 2.</_>\n                <_>4 16 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.8066660314798355e-003</threshold>\n            <left_val>0.4756605029106140</left_val>\n            <right_val>0.6677829027175903</right_val></_></_>\n        <_>\n          <!-- tree 181 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 13 3 6 -1.</_>\n                <_>14 15 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6608621012419462e-003</threshold>\n            <left_val>0.5369611978530884</left_val>\n            <right_val>0.4311546981334686</right_val></_></_>\n        <_>\n          <!-- tree 182 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 13 3 6 -1.</_>\n                <_>3 15 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0214496403932571</threshold>\n            <left_val>0.4968641996383667</left_val>\n            <right_val>0.1888816058635712</right_val></_></_>\n        <_>\n          <!-- tree 183 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 10 2 -1.</_>\n                <_>11 5 5 1 2.</_>\n                <_>6 6 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.1678901761770248e-003</threshold>\n            <left_val>0.4930733144283295</left_val>\n            <right_val>0.5815368890762329</right_val></_></_>\n        <_>\n          <!-- tree 184 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 14 14 6 -1.</_>\n                <_>2 17 14 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.6467564105987549e-003</threshold>\n            <left_val>0.5205205082893372</left_val>\n            <right_val>0.4132595062255859</right_val></_></_>\n        <_>\n          <!-- tree 185 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.6114078829996288e-004</threshold>\n            <left_val>0.5483555197715759</left_val>\n            <right_val>0.4800927937030792</right_val></_></_>\n        <_>\n          <!-- tree 186 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 16 2 2 -1.</_>\n                <_>4 16 1 1 2.</_>\n                <_>5 17 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0808729566633701e-003</threshold>\n            <left_val>0.4689902067184448</left_val>\n            <right_val>0.6041421294212341</right_val></_></_>\n        <_>\n          <!-- tree 187 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 6 2 3 -1.</_>\n                <_>10 7 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.7719959877431393e-003</threshold>\n            <left_val>0.5171142220497131</left_val>\n            <right_val>0.3053277134895325</right_val></_></_>\n        <_>\n          <!-- tree 188 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 17 20 2 -1.</_>\n                <_>0 17 10 1 2.</_>\n                <_>10 18 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5720770461484790e-003</threshold>\n            <left_val>0.5219978094100952</left_val>\n            <right_val>0.4178803861141205</right_val></_></_>\n        <_>\n          <!-- tree 189 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 6 1 3 -1.</_>\n                <_>13 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.9307859474793077e-003</threshold>\n            <left_val>0.5860369801521301</left_val>\n            <right_val>0.4812920093536377</right_val></_></_>\n        <_>\n          <!-- tree 190 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 3 2 -1.</_>\n                <_>9 13 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8926272690296173e-003</threshold>\n            <left_val>0.1749276965856552</left_val>\n            <right_val>0.4971733987331390</right_val></_></_>\n        <_>\n          <!-- tree 191 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 2 3 3 -1.</_>\n                <_>13 2 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2224679123610258e-003</threshold>\n            <left_val>0.4342589080333710</left_val>\n            <right_val>0.5212848186492920</right_val></_></_>\n        <_>\n          <!-- tree 192 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 18 2 2 -1.</_>\n                <_>3 18 1 1 2.</_>\n                <_>4 19 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9011989934369922e-003</threshold>\n            <left_val>0.4765186905860901</left_val>\n            <right_val>0.6892055273056030</right_val></_></_>\n        <_>\n          <!-- tree 193 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 3 4 -1.</_>\n                <_>10 16 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.7576119173318148e-003</threshold>\n            <left_val>0.5262191295623779</left_val>\n            <right_val>0.4337486028671265</right_val></_></_>\n        <_>\n          <!-- tree 194 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 1 3 -1.</_>\n                <_>6 7 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1787449046969414e-003</threshold>\n            <left_val>0.4804069101810455</left_val>\n            <right_val>0.7843729257583618</right_val></_></_>\n        <_>\n          <!-- tree 195 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 1 5 2 -1.</_>\n                <_>13 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.0273341629654169e-004</threshold>\n            <left_val>0.4120846986770630</left_val>\n            <right_val>0.5353423953056335</right_val></_></_>\n        <_>\n          <!-- tree 196 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 6 2 -1.</_>\n                <_>7 14 3 1 2.</_>\n                <_>10 15 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.1797959022223949e-003</threshold>\n            <left_val>0.4740372896194458</left_val>\n            <right_val>0.6425960063934326</right_val></_></_>\n        <_>\n          <!-- tree 197 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 3 3 4 -1.</_>\n                <_>12 3 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0101140001788735</threshold>\n            <left_val>0.2468792051076889</left_val>\n            <right_val>0.5175017714500427</right_val></_></_>\n        <_>\n          <!-- tree 198 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 13 12 6 -1.</_>\n                <_>5 13 4 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0186170600354671</threshold>\n            <left_val>0.5756294131278992</left_val>\n            <right_val>0.4628978967666626</right_val></_></_>\n        <_>\n          <!-- tree 199 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 11 5 2 -1.</_>\n                <_>14 12 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.9225959703326225e-003</threshold>\n            <left_val>0.5169625878334045</left_val>\n            <right_val>0.3214271068572998</right_val></_></_>\n        <_>\n          <!-- tree 200 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 15 14 4 -1.</_>\n                <_>2 15 7 2 2.</_>\n                <_>9 17 7 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2945079989731312e-003</threshold>\n            <left_val>0.3872014880180359</left_val>\n            <right_val>0.5141636729240418</right_val></_></_>\n        <_>\n          <!-- tree 201 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 7 14 2 -1.</_>\n                <_>10 7 7 1 2.</_>\n                <_>3 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.5353019163012505e-003</threshold>\n            <left_val>0.4853048920631409</left_val>\n            <right_val>0.6310489773750305</right_val></_></_>\n        <_>\n          <!-- tree 202 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 11 4 2 -1.</_>\n                <_>1 12 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0878399480134249e-003</threshold>\n            <left_val>0.5117315053939819</left_val>\n            <right_val>0.3723258972167969</right_val></_></_>\n        <_>\n          <!-- tree 203 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 14 -1.</_>\n                <_>16 0 2 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0225422400981188</threshold>\n            <left_val>0.5692740082740784</left_val>\n            <right_val>0.4887112975120544</right_val></_></_>\n        <_>\n          <!-- tree 204 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 1 3 -1.</_>\n                <_>4 12 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.0065660830587149e-003</threshold>\n            <left_val>0.2556012868881226</left_val>\n            <right_val>0.5003992915153503</right_val></_></_>\n        <_>\n          <!-- tree 205 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 6 14 -1.</_>\n                <_>16 0 2 14 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.4741272255778313e-003</threshold>\n            <left_val>0.4810872972011566</left_val>\n            <right_val>0.5675926804542542</right_val></_></_>\n        <_>\n          <!-- tree 206 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 10 3 7 -1.</_>\n                <_>2 10 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0261623207479715</threshold>\n            <left_val>0.4971194863319397</left_val>\n            <right_val>0.1777237057685852</right_val></_></_>\n        <_>\n          <!-- tree 207 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 9 2 -1.</_>\n                <_>8 13 9 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.4352738233283162e-004</threshold>\n            <left_val>0.4940010905265808</left_val>\n            <right_val>0.5491250753402710</right_val></_></_>\n        <_>\n          <!-- tree 208 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 20 1 -1.</_>\n                <_>10 6 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0333632417023182</threshold>\n            <left_val>0.5007612109184265</left_val>\n            <right_val>0.2790724039077759</right_val></_></_>\n        <_>\n          <!-- tree 209 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 4 4 4 -1.</_>\n                <_>8 4 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0151186501607299</threshold>\n            <left_val>0.7059578895568848</left_val>\n            <right_val>0.4973031878471375</right_val></_></_>\n        <_>\n          <!-- tree 210 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 2 2 -1.</_>\n                <_>0 1 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.8648946732282639e-004</threshold>\n            <left_val>0.5128620266914368</left_val>\n            <right_val>0.3776761889457703</right_val></_></_></trees>\n      <stage_threshold>104.7491989135742200</stage_threshold>\n      <parent>19</parent>\n      <next>-1</next></_>\n    <_>\n      <!-- stage 21 -->\n      <trees>\n        <_>\n          <!-- tree 0 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 3 10 9 -1.</_>\n                <_>5 6 10 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0951507985591888</threshold>\n            <left_val>0.6470757126808167</left_val>\n            <right_val>0.4017286896705627</right_val></_></_>\n        <_>\n          <!-- tree 1 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 2 4 10 -1.</_>\n                <_>15 2 2 10 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.2702340073883533e-003</threshold>\n            <left_val>0.3999822139739990</left_val>\n            <right_val>0.5746449232101440</right_val></_></_>\n        <_>\n          <!-- tree 2 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 2 2 7 -1.</_>\n                <_>9 2 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0018089455552399e-004</threshold>\n            <left_val>0.3558770120143890</left_val>\n            <right_val>0.5538809895515442</right_val></_></_>\n        <_>\n          <!-- tree 3 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 4 12 1 -1.</_>\n                <_>11 4 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1757409665733576e-003</threshold>\n            <left_val>0.4256534874439240</left_val>\n            <right_val>0.5382617712020874</right_val></_></_>\n        <_>\n          <!-- tree 4 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 4 9 1 -1.</_>\n                <_>6 4 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4235268433112651e-005</threshold>\n            <left_val>0.3682908117771149</left_val>\n            <right_val>0.5589926838874817</right_val></_></_>\n        <_>\n          <!-- tree 5 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 10 1 4 -1.</_>\n                <_>15 12 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9936920327600092e-005</threshold>\n            <left_val>0.5452470183372498</left_val>\n            <right_val>0.4020367860794067</right_val></_></_>\n        <_>\n          <!-- tree 6 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 10 6 4 -1.</_>\n                <_>7 10 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0073199886828661e-003</threshold>\n            <left_val>0.5239058136940002</left_val>\n            <right_val>0.3317843973636627</right_val></_></_>\n        <_>\n          <!-- tree 7 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>15 9 1 6 -1.</_>\n                <_>15 12 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0105138896033168</threshold>\n            <left_val>0.4320689141750336</left_val>\n            <right_val>0.5307983756065369</right_val></_></_>\n        <_>\n          <!-- tree 8 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 17 6 3 -1.</_>\n                <_>7 18 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.3476826548576355e-003</threshold>\n            <left_val>0.4504637122154236</left_val>\n            <right_val>0.6453298926353455</right_val></_></_>\n        <_>\n          <!-- tree 9 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 3 2 16 -1.</_>\n                <_>15 3 1 8 2.</_>\n                <_>14 11 1 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.1492270063608885e-003</threshold>\n            <left_val>0.4313425123691559</left_val>\n            <right_val>0.5370525121688843</right_val></_></_>\n        <_>\n          <!-- tree 10 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 1 6 -1.</_>\n                <_>4 12 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4435649973165710e-005</threshold>\n            <left_val>0.5326603055000305</left_val>\n            <right_val>0.3817971944808960</right_val></_></_>\n        <_>\n          <!-- tree 11 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 5 2 -1.</_>\n                <_>12 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2855090578086674e-004</threshold>\n            <left_val>0.4305163919925690</left_val>\n            <right_val>0.5382009744644165</right_val></_></_>\n        <_>\n          <!-- tree 12 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 18 4 2 -1.</_>\n                <_>6 18 2 1 2.</_>\n                <_>8 19 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5062429883982986e-004</threshold>\n            <left_val>0.4235970973968506</left_val>\n            <right_val>0.5544965267181397</right_val></_></_>\n        <_>\n          <!-- tree 13 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 4 16 10 -1.</_>\n                <_>10 4 8 5 2.</_>\n                <_>2 9 8 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0715598315000534</threshold>\n            <left_val>0.5303059816360474</left_val>\n            <right_val>0.2678802907466888</right_val></_></_>\n        <_>\n          <!-- tree 14 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 1 10 -1.</_>\n                <_>6 10 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.4095180500298738e-004</threshold>\n            <left_val>0.3557108938694000</left_val>\n            <right_val>0.5205433964729309</right_val></_></_>\n        <_>\n          <!-- tree 15 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 8 15 2 -1.</_>\n                <_>9 8 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0629865005612373</threshold>\n            <left_val>0.5225362777709961</left_val>\n            <right_val>0.2861376106739044</right_val></_></_>\n        <_>\n          <!-- tree 16 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 8 15 2 -1.</_>\n                <_>6 8 5 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-3.3798629883676767e-003</threshold>\n            <left_val>0.3624185919761658</left_val>\n            <right_val>0.5201697945594788</right_val></_></_>\n        <_>\n          <!-- tree 17 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 3 6 -1.</_>\n                <_>9 7 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1810739670181647e-004</threshold>\n            <left_val>0.5474476814270020</left_val>\n            <right_val>0.3959893882274628</right_val></_></_>\n        <_>\n          <!-- tree 18 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 8 2 -1.</_>\n                <_>9 7 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.4505601292476058e-004</threshold>\n            <left_val>0.3740422129631043</left_val>\n            <right_val>0.5215715765953064</right_val></_></_>\n        <_>\n          <!-- tree 19 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 11 2 3 -1.</_>\n                <_>9 12 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8454910023137927e-003</threshold>\n            <left_val>0.5893052220344544</left_val>\n            <right_val>0.4584448933601379</right_val></_></_>\n        <_>\n          <!-- tree 20 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 16 3 -1.</_>\n                <_>1 1 16 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3832371011376381e-004</threshold>\n            <left_val>0.4084582030773163</left_val>\n            <right_val>0.5385351181030273</right_val></_></_>\n        <_>\n          <!-- tree 21 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 2 7 2 -1.</_>\n                <_>11 3 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4000830017030239e-003</threshold>\n            <left_val>0.3777455091476440</left_val>\n            <right_val>0.5293580293655396</right_val></_></_>\n        <_>\n          <!-- tree 22 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 10 18 -1.</_>\n                <_>5 7 10 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0987957417964935</threshold>\n            <left_val>0.2963612079620361</left_val>\n            <right_val>0.5070089101791382</right_val></_></_>\n        <_>\n          <!-- tree 23 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 4 3 2 -1.</_>\n                <_>18 4 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1798239797353745e-003</threshold>\n            <left_val>0.4877632856369019</left_val>\n            <right_val>0.6726443767547607</right_val></_></_>\n        <_>\n          <!-- tree 24 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 1 3 -1.</_>\n                <_>8 14 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.2406419632025063e-004</threshold>\n            <left_val>0.4366911053657532</left_val>\n            <right_val>0.5561109781265259</right_val></_></_>\n        <_>\n          <!-- tree 25 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 14 6 -1.</_>\n                <_>3 16 14 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0325472503900528</threshold>\n            <left_val>0.3128157854080200</left_val>\n            <right_val>0.5308616161346436</right_val></_></_>\n        <_>\n          <!-- tree 26 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 3 4 -1.</_>\n                <_>1 2 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.7561130747199059e-003</threshold>\n            <left_val>0.6560224890708923</left_val>\n            <right_val>0.4639872014522553</right_val></_></_>\n        <_>\n          <!-- tree 27 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 1 5 2 -1.</_>\n                <_>12 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0160272493958473</threshold>\n            <left_val>0.5172680020332336</left_val>\n            <right_val>0.3141897916793823</right_val></_></_>\n        <_>\n          <!-- tree 28 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 1 5 2 -1.</_>\n                <_>3 2 5 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1002350523485802e-006</threshold>\n            <left_val>0.4084446132183075</left_val>\n            <right_val>0.5336294770240784</right_val></_></_>\n        <_>\n          <!-- tree 29 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 13 2 3 -1.</_>\n                <_>10 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3422808200120926e-003</threshold>\n            <left_val>0.4966922104358673</left_val>\n            <right_val>0.6603465080261231</right_val></_></_>\n        <_>\n          <!-- tree 30 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 2 3 -1.</_>\n                <_>8 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6970280557870865e-003</threshold>\n            <left_val>0.5908237099647522</left_val>\n            <right_val>0.4500182867050171</right_val></_></_>\n        <_>\n          <!-- tree 31 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 12 2 3 -1.</_>\n                <_>14 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4118260480463505e-003</threshold>\n            <left_val>0.5315160751342773</left_val>\n            <right_val>0.3599720895290375</right_val></_></_>\n        <_>\n          <!-- tree 32 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 2 2 3 -1.</_>\n                <_>7 3 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.5300937965512276e-003</threshold>\n            <left_val>0.2334040999412537</left_val>\n            <right_val>0.4996814131736755</right_val></_></_>\n        <_>\n          <!-- tree 33 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 10 4 -1.</_>\n                <_>10 6 5 2 2.</_>\n                <_>5 8 5 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6478730142116547e-003</threshold>\n            <left_val>0.5880935788154602</left_val>\n            <right_val>0.4684734046459198</right_val></_></_>\n        <_>\n          <!-- tree 34 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 13 1 6 -1.</_>\n                <_>9 16 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0112956296652555</threshold>\n            <left_val>0.4983777105808258</left_val>\n            <right_val>0.1884590983390808</right_val></_></_>\n        <_>\n          <!-- tree 35 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 12 2 2 -1.</_>\n                <_>11 12 1 1 2.</_>\n                <_>10 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6952878842130303e-004</threshold>\n            <left_val>0.5872138142585754</left_val>\n            <right_val>0.4799019992351532</right_val></_></_>\n        <_>\n          <!-- tree 36 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 12 2 3 -1.</_>\n                <_>4 13 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4410680159926414e-003</threshold>\n            <left_val>0.5131189227104187</left_val>\n            <right_val>0.3501011133193970</right_val></_></_>\n        <_>\n          <!-- tree 37 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 6 6 -1.</_>\n                <_>14 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4637870956212282e-003</threshold>\n            <left_val>0.5339372158050537</left_val>\n            <right_val>0.4117639064788818</right_val></_></_>\n        <_>\n          <!-- tree 38 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 17 2 3 -1.</_>\n                <_>8 18 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3114518737420440e-004</threshold>\n            <left_val>0.4313383102416992</left_val>\n            <right_val>0.5398246049880981</right_val></_></_>\n        <_>\n          <!-- tree 39 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 4 4 6 -1.</_>\n                <_>16 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0335572697222233</threshold>\n            <left_val>0.2675336897373200</left_val>\n            <right_val>0.5179154872894287</right_val></_></_>\n        <_>\n          <!-- tree 40 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 4 6 -1.</_>\n                <_>0 6 4 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0185394193977118</threshold>\n            <left_val>0.4973869919776917</left_val>\n            <right_val>0.2317177057266235</right_val></_></_>\n        <_>\n          <!-- tree 41 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 6 2 3 -1.</_>\n                <_>14 6 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9698139405809343e-004</threshold>\n            <left_val>0.5529708266258240</left_val>\n            <right_val>0.4643664062023163</right_val></_></_>\n        <_>\n          <!-- tree 42 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 9 8 1 -1.</_>\n                <_>8 9 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.5577259152196348e-004</threshold>\n            <left_val>0.5629584193229675</left_val>\n            <right_val>0.4469191133975983</right_val></_></_>\n        <_>\n          <!-- tree 43 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 12 4 3 -1.</_>\n                <_>8 13 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0101589802652597</threshold>\n            <left_val>0.6706212759017944</left_val>\n            <right_val>0.4925918877124786</right_val></_></_>\n        <_>\n          <!-- tree 44 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 12 10 6 -1.</_>\n                <_>5 14 10 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2413829356082715e-005</threshold>\n            <left_val>0.5239421725273132</left_val>\n            <right_val>0.3912901878356934</right_val></_></_>\n        <_>\n          <!-- tree 45 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 1 2 -1.</_>\n                <_>11 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.2034963523037732e-005</threshold>\n            <left_val>0.4799438118934631</left_val>\n            <right_val>0.5501788854598999</right_val></_></_>\n        <_>\n          <!-- tree 46 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 2 -1.</_>\n                <_>8 16 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9267209619283676e-003</threshold>\n            <left_val>0.6930009722709656</left_val>\n            <right_val>0.4698084890842438</right_val></_></_>\n        <_>\n          <!-- tree 47 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 9 8 8 -1.</_>\n                <_>10 9 4 4 2.</_>\n                <_>6 13 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.6997838914394379e-003</threshold>\n            <left_val>0.4099623858928680</left_val>\n            <right_val>0.5480883121490479</right_val></_></_>\n        <_>\n          <!-- tree 48 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 4 6 -1.</_>\n                <_>7 12 2 3 2.</_>\n                <_>9 15 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.3130549862980843e-003</threshold>\n            <left_val>0.3283475935459137</left_val>\n            <right_val>0.5057886242866516</right_val></_></_>\n        <_>\n          <!-- tree 49 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 11 3 1 -1.</_>\n                <_>11 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9650589674711227e-003</threshold>\n            <left_val>0.4978047013282776</left_val>\n            <right_val>0.6398249864578247</right_val></_></_>\n        <_>\n          <!-- tree 50 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 10 -1.</_>\n                <_>9 7 1 5 2.</_>\n                <_>10 12 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.1647600270807743e-003</threshold>\n            <left_val>0.4661160111427307</left_val>\n            <right_val>0.6222137212753296</right_val></_></_>\n        <_>\n          <!-- tree 51 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 6 6 -1.</_>\n                <_>10 0 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0240786392241716</threshold>\n            <left_val>0.2334644943475723</left_val>\n            <right_val>0.5222162008285523</right_val></_></_>\n        <_>\n          <!-- tree 52 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 11 2 6 -1.</_>\n                <_>3 13 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0210279691964388</threshold>\n            <left_val>0.1183653995394707</left_val>\n            <right_val>0.4938226044178009</right_val></_></_>\n        <_>\n          <!-- tree 53 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 12 1 2 -1.</_>\n                <_>16 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.6017020465806127e-004</threshold>\n            <left_val>0.5325019955635071</left_val>\n            <right_val>0.4116711020469666</right_val></_></_>\n        <_>\n          <!-- tree 54 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 6 6 -1.</_>\n                <_>1 14 3 3 2.</_>\n                <_>4 17 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0172197297215462</threshold>\n            <left_val>0.6278762221336365</left_val>\n            <right_val>0.4664269089698792</right_val></_></_>\n        <_>\n          <!-- tree 55 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 1 3 6 -1.</_>\n                <_>14 1 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.8672142699360847e-003</threshold>\n            <left_val>0.3403415083885193</left_val>\n            <right_val>0.5249736905097961</right_val></_></_>\n        <_>\n          <!-- tree 56 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 8 2 2 -1.</_>\n                <_>8 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4777389848604798e-004</threshold>\n            <left_val>0.3610411882400513</left_val>\n            <right_val>0.5086259245872498</right_val></_></_>\n        <_>\n          <!-- tree 57 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 3 3 -1.</_>\n                <_>10 9 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5486010387539864e-003</threshold>\n            <left_val>0.4884265959262848</left_val>\n            <right_val>0.6203498244285584</right_val></_></_>\n        <_>\n          <!-- tree 58 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 7 3 3 -1.</_>\n                <_>8 8 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.9461148232221603e-003</threshold>\n            <left_val>0.2625930011272430</left_val>\n            <right_val>0.5011097192764282</right_val></_></_>\n        <_>\n          <!-- tree 59 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 2 3 -1.</_>\n                <_>14 0 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3569870498031378e-004</threshold>\n            <left_val>0.4340794980525971</left_val>\n            <right_val>0.5628312230110169</right_val></_></_>\n        <_>\n          <!-- tree 60 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 18 9 -1.</_>\n                <_>7 0 6 9 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0458802506327629</threshold>\n            <left_val>0.6507998704910278</left_val>\n            <right_val>0.4696274995803833</right_val></_></_>\n        <_>\n          <!-- tree 61 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 5 4 15 -1.</_>\n                <_>11 5 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0215825606137514</threshold>\n            <left_val>0.3826502859592438</left_val>\n            <right_val>0.5287616848945618</right_val></_></_>\n        <_>\n          <!-- tree 62 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 4 15 -1.</_>\n                <_>7 5 2 15 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0202095396816731</threshold>\n            <left_val>0.3233368098735809</left_val>\n            <right_val>0.5074477195739746</right_val></_></_>\n        <_>\n          <!-- tree 63 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 0 2 3 -1.</_>\n                <_>14 0 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8496710844337940e-003</threshold>\n            <left_val>0.5177603960037231</left_val>\n            <right_val>0.4489670991897583</right_val></_></_>\n        <_>\n          <!-- tree 64 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 2 3 -1.</_>\n                <_>5 0 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.7476379879517481e-005</threshold>\n            <left_val>0.4020850956439972</left_val>\n            <right_val>0.5246363878250122</right_val></_></_>\n        <_>\n          <!-- tree 65 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 2 2 -1.</_>\n                <_>12 12 1 1 2.</_>\n                <_>11 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1513100471347570e-003</threshold>\n            <left_val>0.6315072178840637</left_val>\n            <right_val>0.4905154109001160</right_val></_></_>\n        <_>\n          <!-- tree 66 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 12 2 2 -1.</_>\n                <_>7 12 1 1 2.</_>\n                <_>8 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.9862831104546785e-003</threshold>\n            <left_val>0.4702459871768951</left_val>\n            <right_val>0.6497151255607605</right_val></_></_>\n        <_>\n          <!-- tree 67 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 3 4 -1.</_>\n                <_>13 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2719512023031712e-003</threshold>\n            <left_val>0.3650383949279785</left_val>\n            <right_val>0.5227652788162231</right_val></_></_>\n        <_>\n          <!-- tree 68 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 11 3 3 -1.</_>\n                <_>4 12 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2662699446082115e-003</threshold>\n            <left_val>0.5166100859642029</left_val>\n            <right_val>0.3877618014812470</right_val></_></_>\n        <_>\n          <!-- tree 69 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 4 2 -1.</_>\n                <_>12 8 4 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.2919440679252148e-003</threshold>\n            <left_val>0.7375894188880920</left_val>\n            <right_val>0.5023847818374634</right_val></_></_>\n        <_>\n          <!-- tree 70 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 3 2 -1.</_>\n                <_>9 10 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7360111279413104e-004</threshold>\n            <left_val>0.4423226118087769</left_val>\n            <right_val>0.5495585799217224</right_val></_></_>\n        <_>\n          <!-- tree 71 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 3 2 -1.</_>\n                <_>10 9 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0523450328037143e-003</threshold>\n            <left_val>0.5976396203041077</left_val>\n            <right_val>0.4859583079814911</right_val></_></_>\n        <_>\n          <!-- tree 72 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 9 3 2 -1.</_>\n                <_>9 9 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.4216238893568516e-004</threshold>\n            <left_val>0.5955939292907715</left_val>\n            <right_val>0.4398930966854096</right_val></_></_>\n        <_>\n          <!-- tree 73 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 0 3 4 -1.</_>\n                <_>13 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1747940443456173e-003</threshold>\n            <left_val>0.5349888205528259</left_val>\n            <right_val>0.4605058133602142</right_val></_></_>\n        <_>\n          <!-- tree 74 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 0 3 4 -1.</_>\n                <_>6 0 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.2457437850534916e-003</threshold>\n            <left_val>0.5049191117286682</left_val>\n            <right_val>0.2941577136516571</right_val></_></_>\n        <_>\n          <!-- tree 75 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 12 4 -1.</_>\n                <_>10 14 6 2 2.</_>\n                <_>4 16 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0245397202670574</threshold>\n            <left_val>0.2550177872180939</left_val>\n            <right_val>0.5218586921691895</right_val></_></_>\n        <_>\n          <!-- tree 76 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 13 2 3 -1.</_>\n                <_>8 14 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>7.3793041519820690e-004</threshold>\n            <left_val>0.4424861073493958</left_val>\n            <right_val>0.5490816235542297</right_val></_></_>\n        <_>\n          <!-- tree 77 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 10 3 8 -1.</_>\n                <_>10 14 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.4233799884095788e-003</threshold>\n            <left_val>0.5319514274597168</left_val>\n            <right_val>0.4081355929374695</right_val></_></_>\n        <_>\n          <!-- tree 78 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 10 4 8 -1.</_>\n                <_>8 10 2 4 2.</_>\n                <_>10 14 2 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4149110540747643e-003</threshold>\n            <left_val>0.4087659120559692</left_val>\n            <right_val>0.5238950252532959</right_val></_></_>\n        <_>\n          <!-- tree 79 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 1 -1.</_>\n                <_>11 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2165299849584699e-003</threshold>\n            <left_val>0.5674579143524170</left_val>\n            <right_val>0.4908052980899811</right_val></_></_>\n        <_>\n          <!-- tree 80 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 12 1 6 -1.</_>\n                <_>9 15 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.2438809499144554e-003</threshold>\n            <left_val>0.4129425883293152</left_val>\n            <right_val>0.5256118178367615</right_val></_></_>\n        <_>\n          <!-- tree 81 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 1 -1.</_>\n                <_>11 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.1942739412188530e-003</threshold>\n            <left_val>0.5060194134712219</left_val>\n            <right_val>0.7313653230667114</right_val></_></_>\n        <_>\n          <!-- tree 82 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 1 -1.</_>\n                <_>8 8 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.6607169527560472e-003</threshold>\n            <left_val>0.5979632139205933</left_val>\n            <right_val>0.4596369862556458</right_val></_></_>\n        <_>\n          <!-- tree 83 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 2 15 14 -1.</_>\n                <_>5 9 15 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0273162592202425</threshold>\n            <left_val>0.4174365103244782</left_val>\n            <right_val>0.5308842062950134</right_val></_></_>\n        <_>\n          <!-- tree 84 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 1 2 10 -1.</_>\n                <_>2 1 1 5 2.</_>\n                <_>3 6 1 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5845570014789701e-003</threshold>\n            <left_val>0.5615804791450501</left_val>\n            <right_val>0.4519486129283905</right_val></_></_>\n        <_>\n          <!-- tree 85 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 14 2 3 -1.</_>\n                <_>14 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5514739789068699e-003</threshold>\n            <left_val>0.4076187014579773</left_val>\n            <right_val>0.5360785126686096</right_val></_></_>\n        <_>\n          <!-- tree 86 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 7 3 3 -1.</_>\n                <_>3 7 1 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.8446558755822480e-004</threshold>\n            <left_val>0.4347293972969055</left_val>\n            <right_val>0.5430442094802856</right_val></_></_>\n        <_>\n          <!-- tree 87 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 4 3 3 -1.</_>\n                <_>17 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146722598001361</threshold>\n            <left_val>0.1659304946660996</left_val>\n            <right_val>0.5146093964576721</right_val></_></_>\n        <_>\n          <!-- tree 88 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 3 3 -1.</_>\n                <_>0 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.1608882173895836e-003</threshold>\n            <left_val>0.4961819052696228</left_val>\n            <right_val>0.1884745955467224</right_val></_></_>\n        <_>\n          <!-- tree 89 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 6 2 -1.</_>\n                <_>16 5 3 1 2.</_>\n                <_>13 6 3 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.1121659772470593e-003</threshold>\n            <left_val>0.4868263900279999</left_val>\n            <right_val>0.6093816161155701</right_val></_></_>\n        <_>\n          <!-- tree 90 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 19 12 1 -1.</_>\n                <_>8 19 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.2603770531713963e-003</threshold>\n            <left_val>0.6284325122833252</left_val>\n            <right_val>0.4690375924110413</right_val></_></_>\n        <_>\n          <!-- tree 91 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 12 2 4 -1.</_>\n                <_>12 14 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.4046430189628154e-004</threshold>\n            <left_val>0.5575000047683716</left_val>\n            <right_val>0.4046044051647186</right_val></_></_>\n        <_>\n          <!-- tree 92 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 15 1 3 -1.</_>\n                <_>3 16 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3348190006799996e-004</threshold>\n            <left_val>0.4115762114524841</left_val>\n            <right_val>0.5252848267555237</right_val></_></_>\n        <_>\n          <!-- tree 93 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 16 6 4 -1.</_>\n                <_>11 16 3 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.5736480280756950e-003</threshold>\n            <left_val>0.4730072915554047</left_val>\n            <right_val>0.5690100789070129</right_val></_></_>\n        <_>\n          <!-- tree 94 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 10 3 10 -1.</_>\n                <_>3 10 1 10 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0306237693876028</threshold>\n            <left_val>0.4971886873245239</left_val>\n            <right_val>0.1740095019340515</right_val></_></_>\n        <_>\n          <!-- tree 95 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 8 2 4 -1.</_>\n                <_>12 8 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>9.2074798885732889e-004</threshold>\n            <left_val>0.5372117757797241</left_val>\n            <right_val>0.4354872107505798</right_val></_></_>\n        <_>\n          <!-- tree 96 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 8 2 4 -1.</_>\n                <_>7 8 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.3550739064812660e-005</threshold>\n            <left_val>0.5366883873939514</left_val>\n            <right_val>0.4347316920757294</right_val></_></_>\n        <_>\n          <!-- tree 97 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 2 3 -1.</_>\n                <_>10 14 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.6452710889279842e-003</threshold>\n            <left_val>0.3435518145561218</left_val>\n            <right_val>0.5160533189773560</right_val></_></_>\n        <_>\n          <!-- tree 98 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 10 3 -1.</_>\n                <_>10 1 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0432219989597797</threshold>\n            <left_val>0.4766792058944702</left_val>\n            <right_val>0.7293652892112732</right_val></_></_>\n        <_>\n          <!-- tree 99 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 7 3 2 -1.</_>\n                <_>11 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2331769578158855e-003</threshold>\n            <left_val>0.5029315948486328</left_val>\n            <right_val>0.5633171200752258</right_val></_></_>\n        <_>\n          <!-- tree 100 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 6 9 2 -1.</_>\n                <_>8 6 3 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.1829739455133677e-003</threshold>\n            <left_val>0.4016092121601105</left_val>\n            <right_val>0.5192136764526367</right_val></_></_>\n        <_>\n          <!-- tree 101 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 8 2 2 -1.</_>\n                <_>9 9 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.8027749320026487e-004</threshold>\n            <left_val>0.4088315963745117</left_val>\n            <right_val>0.5417919754981995</right_val></_></_>\n        <_>\n          <!-- tree 102 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 11 16 6 -1.</_>\n                <_>2 11 8 3 2.</_>\n                <_>10 14 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.2934689447283745e-003</threshold>\n            <left_val>0.4075677096843720</left_val>\n            <right_val>0.5243561863899231</right_val></_></_>\n        <_>\n          <!-- tree 103 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 7 2 2 -1.</_>\n                <_>13 7 1 1 2.</_>\n                <_>12 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2750959722325206e-003</threshold>\n            <left_val>0.4913282990455627</left_val>\n            <right_val>0.6387010812759399</right_val></_></_>\n        <_>\n          <!-- tree 104 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 2 3 -1.</_>\n                <_>9 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3385322205722332e-003</threshold>\n            <left_val>0.5031672120094299</left_val>\n            <right_val>0.2947346866130829</right_val></_></_>\n        <_>\n          <!-- tree 105 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 2 -1.</_>\n                <_>10 7 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.5250744596123695e-003</threshold>\n            <left_val>0.4949789047241211</left_val>\n            <right_val>0.6308869123458862</right_val></_></_>\n        <_>\n          <!-- tree 106 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 1 8 12 -1.</_>\n                <_>5 7 8 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.4266352243721485e-004</threshold>\n            <left_val>0.5328366756439209</left_val>\n            <right_val>0.4285649955272675</right_val></_></_>\n        <_>\n          <!-- tree 107 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 2 -1.</_>\n                <_>13 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3609660090878606e-003</threshold>\n            <left_val>0.4991525113582611</left_val>\n            <right_val>0.5941501259803772</right_val></_></_>\n        <_>\n          <!-- tree 108 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 2 -1.</_>\n                <_>5 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.4782509212382138e-004</threshold>\n            <left_val>0.4573504030704498</left_val>\n            <right_val>0.5854480862617493</right_val></_></_>\n        <_>\n          <!-- tree 109 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.3360050506889820e-003</threshold>\n            <left_val>0.4604358971118927</left_val>\n            <right_val>0.5849052071571350</right_val></_></_>\n        <_>\n          <!-- tree 110 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 14 2 3 -1.</_>\n                <_>4 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0967548051849008e-004</threshold>\n            <left_val>0.3969388902187347</left_val>\n            <right_val>0.5229423046112061</right_val></_></_>\n        <_>\n          <!-- tree 111 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 4 3 3 -1.</_>\n                <_>12 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3656780831515789e-003</threshold>\n            <left_val>0.5808320045471191</left_val>\n            <right_val>0.4898357093334198</right_val></_></_>\n        <_>\n          <!-- tree 112 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 3 3 -1.</_>\n                <_>5 5 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0734340175986290e-003</threshold>\n            <left_val>0.4351210892200470</left_val>\n            <right_val>0.5470039248466492</right_val></_></_>\n        <_>\n          <!-- tree 113 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 6 -1.</_>\n                <_>10 14 1 3 2.</_>\n                <_>9 17 1 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1923359017819166e-003</threshold>\n            <left_val>0.5355060100555420</left_val>\n            <right_val>0.3842903971672058</right_val></_></_>\n        <_>\n          <!-- tree 114 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 3 2 -1.</_>\n                <_>9 14 1 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.4968618787825108e-003</threshold>\n            <left_val>0.5018138885498047</left_val>\n            <right_val>0.2827191948890686</right_val></_></_>\n        <_>\n          <!-- tree 115 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 6 6 -1.</_>\n                <_>11 5 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0753688216209412</threshold>\n            <left_val>0.1225076019763947</left_val>\n            <right_val>0.5148826837539673</right_val></_></_>\n        <_>\n          <!-- tree 116 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 6 6 -1.</_>\n                <_>7 5 2 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0251344703137875</threshold>\n            <left_val>0.4731766879558563</left_val>\n            <right_val>0.7025446295738220</right_val></_></_>\n        <_>\n          <!-- tree 117 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 1 2 -1.</_>\n                <_>13 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9358599931583740e-005</threshold>\n            <left_val>0.5430532097816467</left_val>\n            <right_val>0.4656086862087250</right_val></_></_>\n        <_>\n          <!-- tree 118 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 10 2 -1.</_>\n                <_>0 3 10 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8355910005047917e-004</threshold>\n            <left_val>0.4031040072441101</left_val>\n            <right_val>0.5190119743347168</right_val></_></_>\n        <_>\n          <!-- tree 119 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 13 1 2 -1.</_>\n                <_>13 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.6639450807124376e-003</threshold>\n            <left_val>0.4308126866817474</left_val>\n            <right_val>0.5161771178245544</right_val></_></_>\n        <_>\n          <!-- tree 120 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 2 2 -1.</_>\n                <_>5 7 1 1 2.</_>\n                <_>6 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3804089976474643e-003</threshold>\n            <left_val>0.6219829916954041</left_val>\n            <right_val>0.4695515930652618</right_val></_></_>\n        <_>\n          <!-- tree 121 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 7 -1.</_>\n                <_>13 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2313219485804439e-003</threshold>\n            <left_val>0.5379363894462585</left_val>\n            <right_val>0.4425831139087677</right_val></_></_>\n        <_>\n          <!-- tree 122 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 13 1 2 -1.</_>\n                <_>6 14 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4644179827882908e-005</threshold>\n            <left_val>0.5281640291213989</left_val>\n            <right_val>0.4222503006458283</right_val></_></_>\n        <_>\n          <!-- tree 123 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 7 -1.</_>\n                <_>12 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0128188095986843</threshold>\n            <left_val>0.2582092881202698</left_val>\n            <right_val>0.5179932713508606</right_val></_></_>\n        <_>\n          <!-- tree 124 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 3 2 16 -1.</_>\n                <_>0 3 1 8 2.</_>\n                <_>1 11 1 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0228521898388863</threshold>\n            <left_val>0.4778693020343781</left_val>\n            <right_val>0.7609264254570007</right_val></_></_>\n        <_>\n          <!-- tree 125 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 0 3 7 -1.</_>\n                <_>12 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.2305970136076212e-004</threshold>\n            <left_val>0.5340992212295532</left_val>\n            <right_val>0.4671724140644074</right_val></_></_>\n        <_>\n          <!-- tree 126 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 3 7 -1.</_>\n                <_>7 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0127701200544834</threshold>\n            <left_val>0.4965761005878449</left_val>\n            <right_val>0.1472366005182266</right_val></_></_>\n        <_>\n          <!-- tree 127 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 16 8 4 -1.</_>\n                <_>11 16 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0500515103340149</threshold>\n            <left_val>0.6414994001388550</left_val>\n            <right_val>0.5016592144966126</right_val></_></_>\n        <_>\n          <!-- tree 128 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 16 8 4 -1.</_>\n                <_>5 16 4 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0157752707600594</threshold>\n            <left_val>0.4522320032119751</left_val>\n            <right_val>0.5685362219810486</right_val></_></_>\n        <_>\n          <!-- tree 129 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 5 2 7 -1.</_>\n                <_>13 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0185016207396984</threshold>\n            <left_val>0.2764748930931091</left_val>\n            <right_val>0.5137959122657776</right_val></_></_>\n        <_>\n          <!-- tree 130 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 5 2 7 -1.</_>\n                <_>6 5 1 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4626250378787518e-003</threshold>\n            <left_val>0.5141941905021668</left_val>\n            <right_val>0.3795408010482788</right_val></_></_>\n        <_>\n          <!-- tree 131 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 6 2 14 -1.</_>\n                <_>18 13 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0629161670804024</threshold>\n            <left_val>0.5060648918151856</left_val>\n            <right_val>0.6580433845520020</right_val></_></_>\n        <_>\n          <!-- tree 132 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 10 3 4 -1.</_>\n                <_>6 12 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1648500478477217e-005</threshold>\n            <left_val>0.5195388197898865</left_val>\n            <right_val>0.4019886851310730</right_val></_></_>\n        <_>\n          <!-- tree 133 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 1 2 -1.</_>\n                <_>14 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.1180990152060986e-003</threshold>\n            <left_val>0.4962365031242371</left_val>\n            <right_val>0.5954458713531494</right_val></_></_>\n        <_>\n          <!-- tree 134 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 18 6 -1.</_>\n                <_>0 1 9 3 2.</_>\n                <_>9 4 9 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0166348908096552</threshold>\n            <left_val>0.3757933080196381</left_val>\n            <right_val>0.5175446867942810</right_val></_></_>\n        <_>\n          <!-- tree 135 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 7 1 2 -1.</_>\n                <_>14 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.8899470344185829e-003</threshold>\n            <left_val>0.6624013781547546</left_val>\n            <right_val>0.5057178735733032</right_val></_></_>\n        <_>\n          <!-- tree 136 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 2 14 -1.</_>\n                <_>0 13 2 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0767832621932030</threshold>\n            <left_val>0.4795796871185303</left_val>\n            <right_val>0.8047714829444885</right_val></_></_>\n        <_>\n          <!-- tree 137 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>17 0 3 12 -1.</_>\n                <_>18 0 1 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.9170677773654461e-003</threshold>\n            <left_val>0.4937882125377655</left_val>\n            <right_val>0.5719941854476929</right_val></_></_>\n        <_>\n          <!-- tree 138 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 6 18 3 -1.</_>\n                <_>0 7 18 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0726706013083458</threshold>\n            <left_val>0.0538945607841015</left_val>\n            <right_val>0.4943903982639313</right_val></_></_>\n        <_>\n          <!-- tree 139 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 14 16 -1.</_>\n                <_>6 8 14 8 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.5403950214385986</threshold>\n            <left_val>0.5129774212837219</left_val>\n            <right_val>0.1143338978290558</right_val></_></_>\n        <_>\n          <!-- tree 140 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 3 12 -1.</_>\n                <_>1 0 1 12 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.9510019812732935e-003</threshold>\n            <left_val>0.4528343975543976</left_val>\n            <right_val>0.5698574185371399</right_val></_></_>\n        <_>\n          <!-- tree 141 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 7 -1.</_>\n                <_>14 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.4508369863033295e-003</threshold>\n            <left_val>0.5357726812362671</left_val>\n            <right_val>0.4218730926513672</right_val></_></_>\n        <_>\n          <!-- tree 142 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 1 2 -1.</_>\n                <_>5 8 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.2077939724549651e-004</threshold>\n            <left_val>0.5916172862052918</left_val>\n            <right_val>0.4637925922870636</right_val></_></_>\n        <_>\n          <!-- tree 143 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 6 6 -1.</_>\n                <_>14 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3051050268113613e-003</threshold>\n            <left_val>0.5273385047912598</left_val>\n            <right_val>0.4382042884826660</right_val></_></_>\n        <_>\n          <!-- tree 144 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 7 7 2 -1.</_>\n                <_>5 8 7 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.7735060798004270e-004</threshold>\n            <left_val>0.4046528041362763</left_val>\n            <right_val>0.5181884765625000</right_val></_></_>\n        <_>\n          <!-- tree 145 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 6 9 -1.</_>\n                <_>8 9 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0259285103529692</threshold>\n            <left_val>0.7452235817909241</left_val>\n            <right_val>0.5089386105537415</right_val></_></_>\n        <_>\n          <!-- tree 146 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 4 6 1 -1.</_>\n                <_>7 4 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.9729790985584259e-003</threshold>\n            <left_val>0.3295435905456543</left_val>\n            <right_val>0.5058795213699341</right_val></_></_>\n        <_>\n          <!-- tree 147 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 6 4 -1.</_>\n                <_>16 0 3 2 2.</_>\n                <_>13 2 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8508329093456268e-003</threshold>\n            <left_val>0.4857144057750702</left_val>\n            <right_val>0.5793024897575378</right_val></_></_>\n        <_>\n          <!-- tree 148 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 2 18 12 -1.</_>\n                <_>1 6 18 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0459675192832947</threshold>\n            <left_val>0.4312731027603149</left_val>\n            <right_val>0.5380653142929077</right_val></_></_>\n        <_>\n          <!-- tree 149 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 2 17 12 -1.</_>\n                <_>3 6 17 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.1558596044778824</threshold>\n            <left_val>0.5196170210838318</left_val>\n            <right_val>0.1684713959693909</right_val></_></_>\n        <_>\n          <!-- tree 150 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>5 14 7 3 -1.</_>\n                <_>5 15 7 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0151648297905922</threshold>\n            <left_val>0.4735757112503052</left_val>\n            <right_val>0.6735026836395264</right_val></_></_>\n        <_>\n          <!-- tree 151 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 14 1 3 -1.</_>\n                <_>10 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0604249546304345e-003</threshold>\n            <left_val>0.5822926759719849</left_val>\n            <right_val>0.4775702953338623</right_val></_></_>\n        <_>\n          <!-- tree 152 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>3 14 3 3 -1.</_>\n                <_>3 15 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.6476291976869106e-003</threshold>\n            <left_val>0.4999198913574219</left_val>\n            <right_val>0.2319535017013550</right_val></_></_>\n        <_>\n          <!-- tree 153 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>14 4 6 6 -1.</_>\n                <_>14 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0122311301529408</threshold>\n            <left_val>0.4750893115997315</left_val>\n            <right_val>0.5262982249259949</right_val></_></_>\n        <_>\n          <!-- tree 154 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 6 6 -1.</_>\n                <_>0 6 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.6528882123529911e-003</threshold>\n            <left_val>0.5069767832756043</left_val>\n            <right_val>0.3561818897724152</right_val></_></_>\n        <_>\n          <!-- tree 155 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>12 5 4 3 -1.</_>\n                <_>12 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.2977829901501536e-003</threshold>\n            <left_val>0.4875693917274475</left_val>\n            <right_val>0.5619062781333923</right_val></_></_>\n        <_>\n          <!-- tree 156 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 5 4 3 -1.</_>\n                <_>4 6 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0107815898954868</threshold>\n            <left_val>0.4750770032405853</left_val>\n            <right_val>0.6782308220863342</right_val></_></_>\n        <_>\n          <!-- tree 157 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 0 2 6 -1.</_>\n                <_>18 2 2 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8654779307544231e-003</threshold>\n            <left_val>0.5305461883544922</left_val>\n            <right_val>0.4290736019611359</right_val></_></_>\n        <_>\n          <!-- tree 158 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 1 4 9 -1.</_>\n                <_>10 1 2 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.8663428965955973e-003</threshold>\n            <left_val>0.4518479108810425</left_val>\n            <right_val>0.5539351105690002</right_val></_></_>\n        <_>\n          <!-- tree 159 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 6 8 2 -1.</_>\n                <_>6 6 4 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.1983320154249668e-003</threshold>\n            <left_val>0.4149119853973389</left_val>\n            <right_val>0.5434188842773438</right_val></_></_>\n        <_>\n          <!-- tree 160 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 5 4 2 -1.</_>\n                <_>6 5 2 1 2.</_>\n                <_>8 6 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.3739990107715130e-003</threshold>\n            <left_val>0.4717896878719330</left_val>\n            <right_val>0.6507657170295715</right_val></_></_>\n        <_>\n          <!-- tree 161 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 5 2 3 -1.</_>\n                <_>10 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0146415298804641</threshold>\n            <left_val>0.2172164022922516</left_val>\n            <right_val>0.5161777138710022</right_val></_></_>\n        <_>\n          <!-- tree 162 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 1 3 -1.</_>\n                <_>9 6 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.5042580344015732e-005</threshold>\n            <left_val>0.5337383747100830</left_val>\n            <right_val>0.4298836886882782</right_val></_></_>\n        <_>\n          <!-- tree 163 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 10 2 2 -1.</_>\n                <_>9 11 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.1875660129589960e-004</threshold>\n            <left_val>0.4604594111442566</left_val>\n            <right_val>0.5582447052001953</right_val></_></_>\n        <_>\n          <!-- tree 164 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 8 4 3 -1.</_>\n                <_>0 9 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0169955305755138</threshold>\n            <left_val>0.4945895075798035</left_val>\n            <right_val>0.0738800764083862</right_val></_></_>\n        <_>\n          <!-- tree 165 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 0 8 6 -1.</_>\n                <_>6 3 8 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0350959412753582</threshold>\n            <left_val>0.7005509138107300</left_val>\n            <right_val>0.4977591037750244</right_val></_></_>\n        <_>\n          <!-- tree 166 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 0 6 4 -1.</_>\n                <_>1 0 3 2 2.</_>\n                <_>4 2 3 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.4217350874096155e-003</threshold>\n            <left_val>0.4466265141963959</left_val>\n            <right_val>0.5477694272994995</right_val></_></_>\n        <_>\n          <!-- tree 167 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 0 3 7 -1.</_>\n                <_>14 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-9.6340337768197060e-004</threshold>\n            <left_val>0.4714098870754242</left_val>\n            <right_val>0.5313338041305542</right_val></_></_>\n        <_>\n          <!-- tree 168 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 16 2 2 -1.</_>\n                <_>9 17 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.6391130338888615e-004</threshold>\n            <left_val>0.4331546127796173</left_val>\n            <right_val>0.5342242121696472</right_val></_></_>\n        <_>\n          <!-- tree 169 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 4 6 10 -1.</_>\n                <_>11 9 6 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0211414601653814</threshold>\n            <left_val>0.2644700109958649</left_val>\n            <right_val>0.5204498767852783</right_val></_></_>\n        <_>\n          <!-- tree 170 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 10 19 2 -1.</_>\n                <_>0 11 19 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7775202700868249e-004</threshold>\n            <left_val>0.5208349823951721</left_val>\n            <right_val>0.4152742922306061</right_val></_></_>\n        <_>\n          <!-- tree 171 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 8 9 -1.</_>\n                <_>9 8 8 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0279439203441143</threshold>\n            <left_val>0.6344125270843506</left_val>\n            <right_val>0.5018811821937561</right_val></_></_>\n        <_>\n          <!-- tree 172 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 0 3 7 -1.</_>\n                <_>5 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>6.7297378554940224e-003</threshold>\n            <left_val>0.5050438046455383</left_val>\n            <right_val>0.3500863909721375</right_val></_></_>\n        <_>\n          <!-- tree 173 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 6 4 12 -1.</_>\n                <_>10 6 2 6 2.</_>\n                <_>8 12 2 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0232810396701097</threshold>\n            <left_val>0.4966318011283875</left_val>\n            <right_val>0.6968677043914795</right_val></_></_>\n        <_>\n          <!-- tree 174 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 2 6 4 -1.</_>\n                <_>0 4 6 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0116449799388647</threshold>\n            <left_val>0.3300260007381439</left_val>\n            <right_val>0.5049629807472229</right_val></_></_>\n        <_>\n          <!-- tree 175 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 15 4 3 -1.</_>\n                <_>8 16 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0157643090933561</threshold>\n            <left_val>0.4991598129272461</left_val>\n            <right_val>0.7321153879165649</right_val></_></_>\n        <_>\n          <!-- tree 176 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 0 3 7 -1.</_>\n                <_>9 0 1 7 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.3611479662358761e-003</threshold>\n            <left_val>0.3911735117435455</left_val>\n            <right_val>0.5160670876502991</right_val></_></_>\n        <_>\n          <!-- tree 177 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 5 3 4 -1.</_>\n                <_>10 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.1522337859496474e-004</threshold>\n            <left_val>0.5628911256790161</left_val>\n            <right_val>0.4949719011783600</right_val></_></_>\n        <_>\n          <!-- tree 178 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 5 3 4 -1.</_>\n                <_>9 5 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.0066272271797061e-004</threshold>\n            <left_val>0.5853595137596130</left_val>\n            <right_val>0.4550595879554749</right_val></_></_>\n        <_>\n          <!-- tree 179 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 6 6 1 -1.</_>\n                <_>9 6 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.9715518252924085e-004</threshold>\n            <left_val>0.4271470010280609</left_val>\n            <right_val>0.5443599224090576</right_val></_></_>\n        <_>\n          <!-- tree 180 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 4 4 -1.</_>\n                <_>7 14 2 2 2.</_>\n                <_>9 16 2 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3475370835512877e-003</threshold>\n            <left_val>0.5143110752105713</left_val>\n            <right_val>0.3887656927108765</right_val></_></_>\n        <_>\n          <!-- tree 181 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>13 14 4 6 -1.</_>\n                <_>15 14 2 3 2.</_>\n                <_>13 17 2 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-8.9261569082736969e-003</threshold>\n            <left_val>0.6044502258300781</left_val>\n            <right_val>0.4971720874309540</right_val></_></_>\n        <_>\n          <!-- tree 182 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 1 8 -1.</_>\n                <_>7 12 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0139199104160070</threshold>\n            <left_val>0.2583160996437073</left_val>\n            <right_val>0.5000367760658264</right_val></_></_>\n        <_>\n          <!-- tree 183 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>16 0 2 8 -1.</_>\n                <_>17 0 1 4 2.</_>\n                <_>16 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0209949687123299e-003</threshold>\n            <left_val>0.4857374131679535</left_val>\n            <right_val>0.5560358166694641</right_val></_></_>\n        <_>\n          <!-- tree 184 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>2 0 2 8 -1.</_>\n                <_>2 0 1 4 2.</_>\n                <_>3 4 1 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.7441629208624363e-003</threshold>\n            <left_val>0.5936884880065918</left_val>\n            <right_val>0.4645777046680450</right_val></_></_>\n        <_>\n          <!-- tree 185 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>6 1 14 3 -1.</_>\n                <_>6 2 14 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0162001308053732</threshold>\n            <left_val>0.3163014948368073</left_val>\n            <right_val>0.5193495154380798</right_val></_></_>\n        <_>\n          <!-- tree 186 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 9 3 10 -1.</_>\n                <_>7 14 3 5 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.3331980705261230e-003</threshold>\n            <left_val>0.5061224102973938</left_val>\n            <right_val>0.3458878993988037</right_val></_></_>\n        <_>\n          <!-- tree 187 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 2 2 -1.</_>\n                <_>9 15 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.8497930876910686e-004</threshold>\n            <left_val>0.4779017865657806</left_val>\n            <right_val>0.5870177745819092</right_val></_></_>\n        <_>\n          <!-- tree 188 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 7 6 8 -1.</_>\n                <_>7 11 6 4 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2466450463980436e-003</threshold>\n            <left_val>0.4297851026058197</left_val>\n            <right_val>0.5374773144721985</right_val></_></_>\n        <_>\n          <!-- tree 189 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 3 6 -1.</_>\n                <_>9 10 3 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.3146099410951138e-003</threshold>\n            <left_val>0.5438671708106995</left_val>\n            <right_val>0.4640969932079315</right_val></_></_>\n        <_>\n          <!-- tree 190 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 13 3 3 -1.</_>\n                <_>7 14 3 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7679121643304825e-003</threshold>\n            <left_val>0.4726893007755280</left_val>\n            <right_val>0.6771789789199829</right_val></_></_>\n        <_>\n          <!-- tree 191 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 9 2 2 -1.</_>\n                <_>9 10 2 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.2448020172305405e-004</threshold>\n            <left_val>0.4229173064231873</left_val>\n            <right_val>0.5428048968315125</right_val></_></_>\n        <_>\n          <!-- tree 192 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 1 18 2 -1.</_>\n                <_>6 1 6 2 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-7.4336021207273006e-003</threshold>\n            <left_val>0.6098880767822266</left_val>\n            <right_val>0.4683673977851868</right_val></_></_>\n        <_>\n          <!-- tree 193 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 1 6 14 -1.</_>\n                <_>7 8 6 7 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.3189240600913763e-003</threshold>\n            <left_val>0.5689436793327332</left_val>\n            <right_val>0.4424242079257965</right_val></_></_>\n        <_>\n          <!-- tree 194 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 9 18 1 -1.</_>\n                <_>7 9 6 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-2.1042178850620985e-003</threshold>\n            <left_val>0.3762221038341522</left_val>\n            <right_val>0.5187087059020996</right_val></_></_>\n        <_>\n          <!-- tree 195 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 7 2 2 -1.</_>\n                <_>9 7 1 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>4.6034841216169298e-004</threshold>\n            <left_val>0.4699405133724213</left_val>\n            <right_val>0.5771207213401794</right_val></_></_>\n        <_>\n          <!-- tree 196 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 3 2 9 -1.</_>\n                <_>10 3 1 9 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.0547629790380597e-003</threshold>\n            <left_val>0.4465216994285584</left_val>\n            <right_val>0.5601701736450195</right_val></_></_>\n        <_>\n          <!-- tree 197 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>18 14 2 3 -1.</_>\n                <_>18 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>8.7148818420246243e-004</threshold>\n            <left_val>0.5449805259704590</left_val>\n            <right_val>0.3914709091186523</right_val></_></_>\n        <_>\n          <!-- tree 198 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 11 3 1 -1.</_>\n                <_>8 11 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.3364820410497487e-004</threshold>\n            <left_val>0.4564009010791779</left_val>\n            <right_val>0.5645738840103149</right_val></_></_>\n        <_>\n          <!-- tree 199 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 4 -1.</_>\n                <_>11 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.4853250468149781e-003</threshold>\n            <left_val>0.5747377872467041</left_val>\n            <right_val>0.4692778885364533</right_val></_></_>\n        <_>\n          <!-- tree 200 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 14 3 6 -1.</_>\n                <_>8 14 1 6 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>3.0251620337367058e-003</threshold>\n            <left_val>0.5166196823120117</left_val>\n            <right_val>0.3762814104557037</right_val></_></_>\n        <_>\n          <!-- tree 201 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>10 8 3 4 -1.</_>\n                <_>11 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>5.0280741415917873e-003</threshold>\n            <left_val>0.5002111792564392</left_val>\n            <right_val>0.6151527166366577</right_val></_></_>\n        <_>\n          <!-- tree 202 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 8 3 4 -1.</_>\n                <_>8 8 1 4 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-5.8164511574432254e-004</threshold>\n            <left_val>0.5394598245620728</left_val>\n            <right_val>0.4390751123428345</right_val></_></_>\n        <_>\n          <!-- tree 203 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>7 9 6 9 -1.</_>\n                <_>7 12 6 3 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0451415292918682</threshold>\n            <left_val>0.5188326835632324</left_val>\n            <right_val>0.2063035964965820</right_val></_></_>\n        <_>\n          <!-- tree 204 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 14 2 3 -1.</_>\n                <_>0 15 2 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-1.0795620037242770e-003</threshold>\n            <left_val>0.3904685080051422</left_val>\n            <right_val>0.5137907266616821</right_val></_></_>\n        <_>\n          <!-- tree 205 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>11 12 1 2 -1.</_>\n                <_>11 13 1 1 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>1.5995999274309725e-004</threshold>\n            <left_val>0.4895322918891907</left_val>\n            <right_val>0.5427504181861877</right_val></_></_>\n        <_>\n          <!-- tree 206 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>4 3 8 3 -1.</_>\n                <_>8 3 4 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-0.0193592701107264</threshold>\n            <left_val>0.6975228786468506</left_val>\n            <right_val>0.4773507118225098</right_val></_></_>\n        <_>\n          <!-- tree 207 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 4 20 6 -1.</_>\n                <_>0 4 10 6 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.2072550952434540</threshold>\n            <left_val>0.5233635902404785</left_val>\n            <right_val>0.3034991919994354</right_val></_></_>\n        <_>\n          <!-- tree 208 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>9 14 1 3 -1.</_>\n                <_>9 15 1 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-4.1953290929086506e-004</threshold>\n            <left_val>0.5419396758079529</left_val>\n            <right_val>0.4460186064243317</right_val></_></_>\n        <_>\n          <!-- tree 209 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>8 14 4 3 -1.</_>\n                <_>8 15 4 1 3.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>2.2582069505006075e-003</threshold>\n            <left_val>0.4815764129161835</left_val>\n            <right_val>0.6027408838272095</right_val></_></_>\n        <_>\n          <!-- tree 210 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 15 14 4 -1.</_>\n                <_>0 17 14 2 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>-6.7811207845807076e-003</threshold>\n            <left_val>0.3980278968811035</left_val>\n            <right_val>0.5183305740356445</right_val></_></_>\n        <_>\n          <!-- tree 211 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>1 14 18 6 -1.</_>\n                <_>1 17 18 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0111543098464608</threshold>\n            <left_val>0.5431231856346130</left_val>\n            <right_val>0.4188759922981262</right_val></_></_>\n        <_>\n          <!-- tree 212 -->\n          <_>\n            <!-- root node -->\n            <feature>\n              <rects>\n                <_>0 0 10 6 -1.</_>\n                <_>0 0 5 3 2.</_>\n                <_>5 3 5 3 2.</_></rects>\n              <tilted>0</tilted></feature>\n            <threshold>0.0431624315679073</threshold>\n            <left_val>0.4738228023052216</left_val>\n            <right_val>0.6522961258888245</right_val></_></_></trees>\n      <stage_threshold>105.7611007690429700</stage_threshold>\n      <parent>20</parent>\n      <next>-1</next></_></stages></haarcascade_frontalface_alt>\n</opencv_storage>\n"
  },
  {
    "path": "platforms/opencv/helpers_test.go",
    "content": "//go:build gocv\n// +build gocv\n\npackage opencv\n\nimport (\n\t\"gocv.io/x/gocv\"\n)\n\ntype testCapture struct{}\n\nfunc (c *testCapture) Read(img *gocv.Mat) bool {\n\treturn true\n}\n\ntype testWindow struct{}\n\nfunc (w *testWindow) ShowImage(img gocv.Mat) { return }\n"
  },
  {
    "path": "platforms/opencv/utils.go",
    "content": "//go:build gocv\n// +build gocv\n\npackage opencv\n\nimport (\n\t\"image\"\n\t\"image/color\"\n\n\t\"gocv.io/x/gocv\"\n)\n\nvar classifier *gocv.CascadeClassifier\n\n// loadHaarClassifierCascade returns open cv HaarCascade loaded\nfunc loadCascadeClassifier(haar string) *gocv.CascadeClassifier {\n\tif classifier != nil {\n\t\treturn classifier\n\t}\n\n\tc := gocv.NewCascadeClassifier()\n\tc.Load(haar)\n\tclassifier = &c\n\treturn classifier\n}\n\n// DetectObjects loads Haar cascade to detect face objects in image\nfunc DetectObjects(haar string, img gocv.Mat) []image.Rectangle {\n\treturn loadCascadeClassifier(haar).DetectMultiScale(img)\n}\n\n// DrawRectangles uses Rect array values to return image with rectangles drawn.\nfunc DrawRectangles(img gocv.Mat, rects []image.Rectangle, r int, g int, b int, thickness int) {\n\tfor _, rect := range rects {\n\t\tgocv.Rectangle(&img, rect, color.RGBA{uint8(r), uint8(g), uint8(b), 0}, thickness)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "platforms/opencv/utils_test.go",
    "content": "//go:build gocv\n// +build gocv\n\npackage opencv\n\nimport (\n\t\"path\"\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gocv.io/x/gocv\"\n)\n\nfunc TestUtils(t *testing.T) {\n\t_, currentfile, _, _ := runtime.Caller(0)\n\timage := gocv.IMRead(path.Join(path.Dir(currentfile), \"lena-256x256.jpg\"), gocv.IMReadColor)\n\trect := DetectObjects(\"haarcascade_frontalface_alt.xml\", image)\n\tassert.NotEqual(t, 0, len(rect))\n\tDrawRectangles(image, rect, 0, 0, 0, 0)\n}\n"
  },
  {
    "path": "platforms/opencv/window_driver.go",
    "content": "//go:build gocv\n// +build gocv\n\npackage opencv\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gocv.io/x/gocv\"\n)\n\ntype window interface {\n\tIMShow(gocv.Mat)\n}\n\n// WindowDriver is the Gobot Driver for the OpenCV window\ntype WindowDriver struct {\n\tname   string\n\twindow window\n\tstart  func(*WindowDriver)\n}\n\n// NewWindowDriver creates a new window driver.\n// It adds an start function to initialize window\nfunc NewWindowDriver() *WindowDriver {\n\treturn &WindowDriver{\n\t\tname: \"Window\",\n\t\tstart: func(w *WindowDriver) {\n\t\t\tw.window = gocv.NewWindow(w.Name())\n\t\t},\n\t}\n}\n\n// Name returns the Driver name\nfunc (w *WindowDriver) Name() string { return w.name }\n\n// SetName sets the Driver name\nfunc (w *WindowDriver) SetName(n string) { w.name = n }\n\n// Connection returns the Driver's connection\nfunc (w *WindowDriver) Connection() gobot.Connection { return nil }\n\n// Start starts window thread and driver\nfunc (w *WindowDriver) Start() error {\n\tw.start(w)\n\treturn nil\n}\n\n// Halt returns true if camera is halted successfully\nfunc (w *WindowDriver) Halt() error { return nil }\n\n// ShowImage displays image in window\nfunc (w *WindowDriver) ShowImage(img gocv.Mat) {\n\tw.window.IMShow(img)\n}\n\n// WaitKey gives window a chance to redraw, and checks for keyboard input\nfunc (w *WindowDriver) WaitKey(pause int) int {\n\treturn gocv.WaitKey(pause)\n}\n"
  },
  {
    "path": "platforms/opencv/window_driver_test.go",
    "content": "//go:build gocv\n// +build gocv\n\npackage opencv\n\nimport (\n\t\"path\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gocv.io/x/gocv\"\n)\n\nvar _ gobot.Driver = (*WindowDriver)(nil)\n\nfunc initTestWindowDriver() *WindowDriver {\n\td := NewWindowDriver()\n\treturn d\n}\n\nfunc TestWindowDriver(t *testing.T) {\n\td := initTestWindowDriver()\n\tassert.Equal(t, \"Window\", d.Name())\n\tassert.Equal(t, (gobot.Connection)(nil), d.Connection())\n}\n\nfunc TestWindowDriverName(t *testing.T) {\n\td := initTestWindowDriver()\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Window\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestWindowDriverStart(t *testing.T) {\n\td := initTestWindowDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestWindowDriverHalt(t *testing.T) {\n\td := initTestWindowDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestWindowDriverShowImage(t *testing.T) {\n\td := initTestWindowDriver()\n\t_, currentfile, _, _ := runtime.Caller(0)\n\timage := gocv.IMRead(path.Join(path.Dir(currentfile), \"lena-256x256.jpg\"), gocv.IMReadColor)\n\td.Start()\n\td.ShowImage(image)\n}\n"
  },
  {
    "path": "platforms/orangepi/orangepi5pro/LICENSE",
    "content": "Copyright (c) 2025 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/orangepi/orangepi5pro/README.md",
    "content": "# OrangePi 5 Pro\n\nThe OrangePi 5 Pro is a single board SoC computer based on the Rockchip RK3588S arm64 processor. It has built-in\nGPIO, I2C, PWM, SPI and MIPI DSI interfaces.\n\nFor more info about the OrangePi 5 Pro, go to [http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5-Pro.html](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5-Pro.html).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTested OS:\n\n* [armbian](https://www.armbian.com/orange-pi-5-pro/): \"Armbian_community_25.5.0-trunk.4_Orangepi5pro_bookworm_vendor_6.1.99_minimal\" (1-wire not working)\n* [Debian server image](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-Pro.html): \"Orangepi5pro_1.0.4_debian_bookworm_server_linux6.1.43\"\n\n## Configuration steps for the OS\n\n### System access and configuration basics\n\nPlease follow the instructions of the OS provider. A ssh access is used in this guide.\n\n```sh\nssh <user>@192.168.1.xxx\n```\n\n### Enabling hardware drivers\n\nNot all drivers are enabled by default. You can have a look at the configuration file, to find out what is enabled at\nyour system:\n\n```sh\ncat /boot/armbianEnv.txt\n```\n\n```sh\nsudo apt install armbian-config\nsudo armbian-config\n```\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := orangepi5pro.NewAdaptor()\nled := gpio.NewLedDriver(r, \"7\")\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=arm64 GOOS=linux go build -o output/ examples/orangepi5pro_blink.go\n```\n\nOnce you have compiled your code, you can upload your program and execute it on the board from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp output/orangepi5pro_blink <user>@192.168.1.xxx:~\nssh -t <user>@192.168.1.xxx \"./orangepi5pro_blink\"\n```\n\n## Troubleshooting\n"
  },
  {
    "path": "platforms/orangepi/orangepi5pro/adaptor.go",
    "content": "package orangepi5pro\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 4\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor represents a Gobot Adaptor for the OrangePi 5 Pro\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex *sync.Mutex\n}\n\n// NewAdaptor creates a OrangePi 5 Pro Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\tadaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior\n//\tadaptors.WithGpioEventOnFallingEdge/RaisingEdge/BothEdges(pin, handler): activate edge detection\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser()\n\ta := &Adaptor{\n\t\tname:  gobot.DefaultName(\"Zero\"),\n\t\tsys:   sys,\n\t\tmutex: &sync.Mutex{},\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinDefinitions)\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions)\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, pwmPinDefinitions)\n\t// Valid bus numbers are [1,4,5,8] which corresponds to /dev/i2c-1, /dev/i2c-4, /dev/i2c-5, /dev/i2c-8\n\t// needs to be enabled by DT-overlay: i2c1-m4, i2c4-m3, i2c5-m2 or i2c5-m3, i2c8-m2\n\t// We don't support i2c-0, i2c-2, i2c-3, i2c-6, i2c-7 (rk3x-i2c), i2c-9 (ddc), i2c-10 (fde50000.dp)\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{1, 3, 4})\n\t// Valid bus numbers are [0,4] which corresponds to /dev/spidev0.x, /dev/spidev4.x\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 4})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, digitalPinTranslator.Translate, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, pwmPinTranslator.Translate, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board, pins and bus\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n"
  },
  {
    "path": "platforms/orangepi/orangepi5pro/adaptor_test.go",
    "content": "package orangepi5pro\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmDir           = \"/sys/devices/platform/febf0030.pwm/pwm/pwmchip2/\" //nolint:gosec // false positive\n\tpwmExportPath    = pwmDir + \"export\"\n\tpwmUnexportPath  = pwmDir + \"unexport\"\n\tpwmPwmDir        = pwmDir + \"pwm0/\"\n\tpwmEnablePath    = pwmPwmDir + \"enable\"\n\tpwmPeriodPath    = pwmPwmDir + \"period\"\n\tpwmDutyCyclePath = pwmPwmDir + \"duty_cycle\"\n\tpwmPolarityPath  = pwmPwmDir + \"polarity\"\n\n\tpwmInvertedIdentifier = \"inversed\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwmEnablePath,\n\tpwmPeriodPath,\n\tpwmDutyCyclePath,\n\tpwmPolarityPath,\n}\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc preparePwmFs(fs *system.MockFilesystem) {\n\tfs.Files[pwmEnablePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPolarityPath].Contents = pwmInvertedIdentifier\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := initConnectedTestAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\treturn a, fs\n}\n\nfunc initConnectedTestAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Zero\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.mutex)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip1\", \"15\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"gpiochip0\", \"14\", []int{3})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 3, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip1\", \"15\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip0\", \"14\"))\n}\n\nfunc TestDigitalIOSysfs(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewAdaptor(adaptors.WithGpioSysfsAccess())\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"\", \"47\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"\", \"14\", []int{4})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 4, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"47\"))\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"14\"))\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/class/thermal/thermal_zone0/temp\"].Contents = \"567\\n\"\n\tgot, err := a.AnalogRead(\"soc_thermal\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 567, got)\n\n\t_, err = a.AnalogRead(\"thermal_zone10\")\n\trequire.ErrorContains(t, err, \"'thermal_zone10' is not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"soc_thermal\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\trequire.NoError(t, a.DigitalWrite(\"7\", 1))\n\tdpa.UseUnexportError(\"gpiochip1\", \"15\")\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"unexport error\")\n}\n\nfunc TestFinalizeErrorAfterPWM(t *testing.T) {\n\t// indirect test for PWM.Finalize() is called for the adaptor\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tpreparePwmFs(fs)\n\trequire.NoError(t, a.PwmWrite(\"33\", 1))\n\tfs.WithWriteError = true\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, 8, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 4, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-4\"})\n\tcon, err := a.GetI2cConnection(0xff, 4)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/orangepi/orangepi5pro/doc.go",
    "content": "/*\nPackage orangepi5pro contains the Gobot adaptor for the OrangePi 5 Pro.\n\nFor further information refer to the boards README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/orangepi/orangepi5pro/README.md\n*/\npackage orangepi5pro // import \"gobot.io/x/gobot/v2/platforms/orangepi/orangepi5pro\"\n"
  },
  {
    "path": "platforms/orangepi/orangepi5pro/pinmap.go",
    "content": "package orangepi5pro\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// notes for character device\n// sysfs: Chip*32 + (A=0, B=8, C=16, D=24) + Nr\n// tested with cdev on a OrangePi 5 Pro V1.2 board: armbian Linux, OK: works, ?: unknown, NOK: not working\n// IN: works only as input, PU: if used as input, external pullup resistor needed\nvar gpioPinDefinitions = adaptors.DigitalPinDefinitions{\n\t\"8\":  {Sysfs: 13, Cdev: adaptors.CdevPin{Chip: 0, Line: 13}},  // GPIOO_B5_UART2_TX_MO - OK\n\t\"10\": {Sysfs: 14, Cdev: adaptors.CdevPin{Chip: 0, Line: 14}},  // GPIOO_B6_UART2_RX_MO - OK\n\t\"18\": {Sysfs: 32, Cdev: adaptors.CdevPin{Chip: 1, Line: 0}},   // GPIO1_A0_UART6_RX_M1 - OK\n\t\"16\": {Sysfs: 33, Cdev: adaptors.CdevPin{Chip: 1, Line: 1}},   // GPIO1_A1_UART6_TX_M1 - PU\n\t\"27\": {Sysfs: 34, Cdev: adaptors.CdevPin{Chip: 1, Line: 2}},   // GPIO1_A2_I2C4_SDA_M3_PWM0_M2_SPI4_CLK_M2 - PU\n\t\"28\": {Sysfs: 35, Cdev: adaptors.CdevPin{Chip: 1, Line: 3}},   // GPIO1_A3_I2C4_SCL_M3_PWM1_M2_SPI4_CSO_M2 - OK\n\t\"29\": {Sysfs: 36, Cdev: adaptors.CdevPin{Chip: 1, Line: 4}},   // GPIO1_A4 - OK\n\t\"31\": {Sysfs: 38, Cdev: adaptors.CdevPin{Chip: 1, Line: 6}},   // GPIO1_A6 - OK\n\t\"12\": {Sysfs: 39, Cdev: adaptors.CdevPin{Chip: 1, Line: 7}},   // GPIO1_A7_PWM3_IR_M3 - OK\n\t\"22\": {Sysfs: 40, Cdev: adaptors.CdevPin{Chip: 1, Line: 8}},   // GPIO1_B0 - OK\n\t\"21\": {Sysfs: 41, Cdev: adaptors.CdevPin{Chip: 1, Line: 9}},   // GPIO1_B1_SPI0_MISO_M2 - OK\n\t\"19\": {Sysfs: 42, Cdev: adaptors.CdevPin{Chip: 1, Line: 10}},  // GPIO1_B2_SPI0_MOSI_M2_UART4_RX_M2 - PU\n\t\"23\": {Sysfs: 43, Cdev: adaptors.CdevPin{Chip: 1, Line: 11}},  // GPIO1_B3_SPI0_CLK_M2_UART4_TX_M2 - OK\n\t\"24\": {Sysfs: 44, Cdev: adaptors.CdevPin{Chip: 1, Line: 12}},  // GPIO1_B4_SPI0_CSO_M2_UART7_RX_M2 - OK\n\t\"26\": {Sysfs: 45, Cdev: adaptors.CdevPin{Chip: 1, Line: 13}},  // GPIO1_B5_SPI0_CS1_M2_UART7_TX_M2 - OK\n\t\"15\": {Sysfs: 46, Cdev: adaptors.CdevPin{Chip: 1, Line: 14}},  // GPIO1_B6_I2C5_SCL_M3_UART1_TX_M1 - OK\n\t\"7\":  {Sysfs: 47, Cdev: adaptors.CdevPin{Chip: 1, Line: 15}},  // GPIO1_B7_PWM13_M2_I2C5_SDA_M3_UART1_RX_M1 - OK\n\t\"5\":  {Sysfs: 58, Cdev: adaptors.CdevPin{Chip: 1, Line: 26}},  // GPIO1_D2_I2C1_SCL_M4_UART4_TX_M0 - OK\n\t\"3\":  {Sysfs: 59, Cdev: adaptors.CdevPin{Chip: 1, Line: 27}},  // GPIO1_D3_I2C1_SDA_M4_UART4_RX_M0 - OK\n\t\"32\": {Sysfs: 62, Cdev: adaptors.CdevPin{Chip: 1, Line: 30}},  // GPIO1_D6_PWM14_M2_I2C8_SCL_M2 - OK\n\t\"33\": {Sysfs: 63, Cdev: adaptors.CdevPin{Chip: 1, Line: 31}},  // GPIO1_D7_PWM15_IR_M3_I2C8_SDA_M2 - OK\n\t\"36\": {Sysfs: 131, Cdev: adaptors.CdevPin{Chip: 4, Line: 3}},  // GPIO4_A3_UART0_TX_M2 - PU\n\t\"38\": {Sysfs: 132, Cdev: adaptors.CdevPin{Chip: 4, Line: 4}},  // GPIO4_A4_UART0_RX_M2 - OK\n\t\"40\": {Sysfs: 133, Cdev: adaptors.CdevPin{Chip: 4, Line: 5}},  // GPIO4_A5_UART3_TX_M2 - OK\n\t\"37\": {Sysfs: 134, Cdev: adaptors.CdevPin{Chip: 4, Line: 6}},  // GPIO4_A6_I2C5_SCL_M2_UART3_RX_M2 - OK\n\t\"35\": {Sysfs: 135, Cdev: adaptors.CdevPin{Chip: 4, Line: 7}},  // GPIO4_A7_I2C5_SDA_M2 - OK\n\t\"11\": {Sysfs: 138, Cdev: adaptors.CdevPin{Chip: 4, Line: 10}}, // GPIO4_B2_CAN1_RX_M1_PWM14_R1 - OK\n\t\"13\": {Sysfs: 139, Cdev: adaptors.CdevPin{Chip: 4, Line: 11}}, // GPIO4_B3_CAN1_TX_M1_PWM15_IR_M1 - OK\n}\n\nvar pwmPinDefinitions = adaptors.PWMPinDefinitions{\n\t// needs to be enabled by DT-overlay pwm0-m2 (pwm0 = \"/pwm@fd8b0000\";)\n\t\"27\": {Dir: \"/sys/devices/platform/fd8b0000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm1-m2 (pwm0 = \"/pwm@fd8b0010\";)\n\t\"28\": {Dir: \"/sys/devices/platform/fd8b0010.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm3-m3 (pwm0 = \"/pwm@fd8b0030\";)\n\t\"12\": {Dir: \"/sys/devices/platform/fd8b0030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm13-m2  (pwm13 = \"/pwm@febf0010\";)\n\t\"7\": {Dir: \"/sys/devices/platform/febf0010.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm14-m1 (pwm14 = \"/pwm@febf0020\";)\n\t\"11\": {Dir: \"/sys/devices/platform/febf0020.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm14-m2 (pwm14 = \"/pwm@febf0020\";)\n\t\"32\": {Dir: \"/sys/devices/platform/febf0020.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm15-m1 (pwm15 = \"/pwm@febf0030\";)\n\t\"13\": {Dir: \"/sys/devices/platform/febf0030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n\t// needs to be enabled by DT-overlay pwm15-m3 (pwm15 = \"/pwm@febf0030\";)\n\t\"33\": {Dir: \"/sys/devices/platform/febf0030.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4|5|6|7]$\", Channel: 0},\n}\n\nvar analogPinDefinitions = adaptors.AnalogPinDefinitions{\n\t// +/-273.200 °C need >=7 characters to read: +/-273200 millidegree Celsius\n\t// names equals /sys/class/thermal/thermal_zone*/hwmon*/name\n\t\"soc_thermal\":        {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n\t\"bigcore0_thermal\":   {Path: \"/sys/class/thermal/thermal_zone1/temp\", W: false, ReadBufLen: 7},\n\t\"bigcore1_thermal\":   {Path: \"/sys/class/thermal/thermal_zone2/temp\", W: false, ReadBufLen: 7},\n\t\"littlecore_thermal\": {Path: \"/sys/class/thermal/thermal_zone3/temp\", W: false, ReadBufLen: 7},\n\t\"center_thermal\":     {Path: \"/sys/class/thermal/thermal_zone4/temp\", W: false, ReadBufLen: 7},\n\t\"gpu_thermal\":        {Path: \"/sys/class/thermal/thermal_zone5/temp\", W: false, ReadBufLen: 7},\n\t\"npu_thermal\":        {Path: \"/sys/class/thermal/thermal_zone6/temp\", W: false, ReadBufLen: 7},\n}\n"
  },
  {
    "path": "platforms/parrot/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/parrot/README.md",
    "content": "# Parrot\n\nThis package contains the Gobot adaptors and drivers for the various Parrot (https://www.parrot.com) drones.\n\nThis package currently supports the following drones:\n\n- Parrot ARDrone 2.0\n- Parrot Bebop/Bebop 2\n- Parrot Minidrone\n"
  },
  {
    "path": "platforms/parrot/ardrone/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/parrot/ardrone/README.md",
    "content": "# Ardrone\n\nThe ARDrone from Parrot is an inexpensive quadcopter that is controlled using WiFi. It includes a built-in front-facing\nHD video camera, as well as a second lower resolution bottom facing video camera.\n\nFor more info about the ARDrone platform click [here](http://ardrone2.parrot.com/).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/parrot/ardrone\"\n)\n\nfunc main() {\n  ardroneAdaptor := ardrone.NewAdaptor(\"Drone\")\n  drone := ardrone.NewDriver(ardroneAdaptor, \"Drone\")\n\n  work := func() {\n    drone.On(drone.Event(\"flying\"), func(data interface{}) {\n      gobot.After(3*time.Second, func() {\n        drone.Land()\n      })\n    })\n    drone.TakeOff()\n  }\n\n  robot := gobot.NewRobot(\"drone\",\n    []gobot.Connection{ardroneAdaptor},\n    []gobot.Device{drone},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How to Connect\n\nThe ARDrone is a WiFi device, so there is no additional work to establish a connection to a single drone. However, in\norder to connect to multiple drones, you need to perform some configuration steps on each drone via SSH.\n"
  },
  {
    "path": "platforms/parrot/ardrone/ardrone_adaptor.go",
    "content": "package ardrone\n\nimport (\n\tclient \"github.com/hybridgroup/go-ardrone/client\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// drone defines expected drone behaviour\ntype drone interface {\n\tTakeoff() bool\n\tLand()\n\tUp(n float64)\n\tDown(n float64)\n\tLeft(n float64)\n\tRight(n float64)\n\tForward(n float64)\n\tBackward(n float64)\n\tClockwise(n float64)\n\tCounterclockwise(n float64)\n\tHover()\n}\n\n// Adaptor is gobot.Adaptor representation for the Ardrone\ntype Adaptor struct {\n\tname    string\n\tdrone   drone\n\tconfig  client.Config\n\tconnect func(*Adaptor) (drone, error)\n}\n\n// NewAdaptor returns a new ardrone.Adaptor and optionally accepts:\n//\n//\tstring: The ardrones IP Address\nfunc NewAdaptor(v ...string) *Adaptor {\n\ta := &Adaptor{\n\t\tname: gobot.DefaultName(\"ARDrone\"),\n\t\tconnect: func(a *Adaptor) (drone, error) {\n\t\t\treturn client.Connect(a.config)\n\t\t},\n\t}\n\n\ta.config = client.DefaultConfig()\n\tif len(v) > 0 {\n\t\ta.config.Ip = v[0]\n\t}\n\n\treturn a\n}\n\n// Name returns the Adaptor Name\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the Adaptor Name\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect establishes a connection to the ardrone\nfunc (a *Adaptor) Connect() error {\n\td, err := a.connect(a)\n\tif err != nil {\n\t\treturn err\n\t}\n\ta.drone = d\n\treturn nil\n}\n\n// Finalize terminates the connection to the ardrone\nfunc (a *Adaptor) Finalize() error { return nil }\n"
  },
  {
    "path": "platforms/parrot/ardrone/ardrone_adaptor_test.go",
    "content": "package ardrone\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc initTestArdroneAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\ta.connect = func(a *Adaptor) (drone, error) {\n\t\treturn &testDrone{}, nil\n\t}\n\treturn a\n}\n\nfunc TestArdroneAdaptor(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, \"192.168.1.1\", a.config.Ip)\n\n\ta = NewAdaptor(\"192.168.100.100\")\n\tassert.Equal(t, \"192.168.100.100\", a.config.Ip)\n}\n\nfunc TestArdroneAdaptorConnect(t *testing.T) {\n\ta := initTestArdroneAdaptor()\n\trequire.NoError(t, a.Connect())\n\n\ta.connect = func(a *Adaptor) (drone, error) {\n\t\treturn nil, errors.New(\"connection error\")\n\t}\n\trequire.ErrorContains(t, a.Connect(), \"connection error\")\n}\n\nfunc TestArdroneAdaptorName(t *testing.T) {\n\ta := initTestArdroneAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"ARDrone\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestArdroneAdaptorFinalize(t *testing.T) {\n\ta := initTestArdroneAdaptor()\n\trequire.NoError(t, a.Finalize())\n}\n"
  },
  {
    "path": "platforms/parrot/ardrone/ardrone_driver.go",
    "content": "package ardrone\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// Flying event\n\tFlying = \"flying\"\n)\n\n// Driver is gobot.Driver representation for the Ardrone\ntype Driver struct {\n\tgobot.Eventer\n\n\tname       string\n\tconnection gobot.Connection\n}\n\n// NewDriver creates an Driver for the ARDrone.\n//\n// It add the following events:\n//\n//\t'flying' - Sent when the device has taken off.\nfunc NewDriver(connection *Adaptor) *Driver {\n\td := &Driver{\n\t\tname:       gobot.DefaultName(\"ARDrone\"),\n\t\tconnection: connection,\n\t\tEventer:    gobot.NewEventer(),\n\t}\n\td.AddEvent(Flying)\n\treturn d\n}\n\n// Name returns the Driver Name\nfunc (a *Driver) Name() string { return a.name }\n\n// SetName sets the Driver Name\nfunc (a *Driver) SetName(n string) { a.name = n }\n\n// Connection returns the Driver Connection\nfunc (a *Driver) Connection() gobot.Connection { return a.connection }\n\n// adaptor returns ardrone adaptor\nfunc (a *Driver) adaptor() *Adaptor {\n\t//nolint:forcetypeassert // ok here\n\treturn a.Connection().(*Adaptor)\n}\n\n// Start starts the Driver\nfunc (a *Driver) Start() error {\n\treturn nil\n}\n\n// Halt halts the Driver\nfunc (a *Driver) Halt() error {\n\treturn nil\n}\n\n// TakeOff makes the drone start flying, and publishes `flying` event\nfunc (a *Driver) TakeOff() {\n\ta.Publish(a.Event(\"flying\"), a.adaptor().drone.Takeoff())\n}\n\n// Land causes the drone to land\nfunc (a *Driver) Land() {\n\ta.adaptor().drone.Land()\n}\n\n// Up makes the drone gain altitude.\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) Up(speed float64) {\n\ta.adaptor().drone.Up(speed)\n}\n\n// Down makes the drone reduce altitude.\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) Down(speed float64) {\n\ta.adaptor().drone.Down(speed)\n}\n\n// Left causes the drone to bank to the left, controls the roll, which is\n// a horizontal movement using the camera as a reference point.\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) Left(speed float64) {\n\ta.adaptor().drone.Left(speed)\n}\n\n// Right causes the drone to bank to the right, controls the roll, which is\n// a horizontal movement using the camera as a reference point.\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) Right(speed float64) {\n\ta.adaptor().drone.Right(speed)\n}\n\n// Forward causes the drone go forward, controls the pitch.\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) Forward(speed float64) {\n\ta.adaptor().drone.Forward(speed)\n}\n\n// Backward causes the drone go backward, controls the pitch.\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) Backward(speed float64) {\n\ta.adaptor().drone.Backward(speed)\n}\n\n// Clockwise causes the drone to spin in clockwise direction\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) Clockwise(speed float64) {\n\ta.adaptor().drone.Clockwise(speed)\n}\n\n// CounterClockwise the drone to spin in counter clockwise direction\n// speed can be a value from `0.0` to `1.0`.\nfunc (a *Driver) CounterClockwise(speed float64) {\n\ta.adaptor().drone.Counterclockwise(speed)\n}\n\n// Hover makes the drone to hover in place.\nfunc (a *Driver) Hover() {\n\ta.adaptor().drone.Hover()\n}\n"
  },
  {
    "path": "platforms/parrot/ardrone/ardrone_driver_test.go",
    "content": "package ardrone\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestArdroneDriver() *Driver {\n\ta := NewAdaptor()\n\ta.connect = func(a *Adaptor) (drone, error) {\n\t\treturn &testDrone{}, nil\n\t}\n\td := NewDriver(a)\n\td.SetName(\"mydrone\")\n\t_ = a.Connect()\n\treturn d\n}\n\nfunc TestArdroneDriver(t *testing.T) {\n\td := initTestArdroneDriver()\n\tassert.Equal(t, \"mydrone\", d.Name())\n}\n\nfunc TestArdroneDriverName(t *testing.T) {\n\td := initTestArdroneDriver()\n\tassert.Equal(t, \"mydrone\", d.Name())\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n\nfunc TestArdroneDriverStart(t *testing.T) {\n\td := initTestArdroneDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestArdroneDriverHalt(t *testing.T) {\n\td := initTestArdroneDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestArdroneDriverTakeOff(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.TakeOff()\n}\n\nfunc TestArdroneDriverand(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Land()\n}\n\nfunc TestArdroneDriverUp(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Up(1)\n}\n\nfunc TestArdroneDriverDown(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Down(1)\n}\n\nfunc TestArdroneDriverLeft(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Left(1)\n}\n\nfunc TestArdroneDriverRight(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Right(1)\n}\n\nfunc TestArdroneDriverForward(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Forward(1)\n}\n\nfunc TestArdroneDriverackward(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Backward(1)\n}\n\nfunc TestArdroneDriverClockwise(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Clockwise(1)\n}\n\nfunc TestArdroneDriverCounterClockwise(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.CounterClockwise(1)\n}\n\nfunc TestArdroneDriverHover(t *testing.T) {\n\td := initTestArdroneDriver()\n\td.Hover()\n}\n"
  },
  {
    "path": "platforms/parrot/ardrone/doc.go",
    "content": "/*\nPackage ardrone provides the Gobot adaptor and driver for the Parrot Ardrone.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"time\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/platforms/parrot/ardrone\"\n\t)\n\n\tfunc main() {\n\t\tardroneAdaptor := ardrone.NewAdaptor()\n\t\tdrone := ardrone.NewDriver(ardroneAdaptor)\n\n\t\twork := func() {\n\t\t\tdrone.TakeOff()\n\t\t\tdrone.On(drone.Event(\"flying\"), func(data interface{}) {\n\t\t\t\tgobot.After(3*time.Second, func() {\n\t\t\t\t\tdrone.Land()\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"drone\",\n\t\t\t[]gobot.Connection{ardroneAdaptor},\n\t\t\t[]gobot.Device{drone},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor more information refer to the ardrone README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/parrot/ardrone/README.md\n*/\npackage ardrone // import \"gobot.io/x/gobot/v2/platforms/parrot/ardrone\"\n"
  },
  {
    "path": "platforms/parrot/ardrone/pitch.go",
    "content": "package ardrone\n\nimport \"math\"\n\n// ValidatePitch helps validate pitch values such as those created by\n// a joystick to values between 0-1.0 that are required as\n// params to Parrot ARDrone PCMDs\nfunc ValidatePitch(data float64, offset float64) float64 {\n\tvalue := math.Abs(data) / offset\n\tif value >= 0.1 {\n\t\tif value <= 1.0 {\n\t\t\treturn float64(int(value*100)) / 100\n\t\t}\n\t\treturn 1.0\n\t}\n\treturn 0.0\n}\n"
  },
  {
    "path": "platforms/parrot/ardrone/pitch_test.go",
    "content": "package ardrone\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestArdroneValidatePitchWhenEqualOffset(t *testing.T) {\n\tassert.InDelta(t, 1.0, ValidatePitch(32767.0, 32767.0), 0.0)\n}\n\nfunc TestArdroneValidatePitchWhenTiny(t *testing.T) {\n\tassert.InDelta(t, 0.0, ValidatePitch(1.1, 32767.0), 0.0)\n}\n\nfunc TestArdroneValidatePitchWhenCentered(t *testing.T) {\n\tassert.InDelta(t, 0.5, ValidatePitch(16383.5, 32767.0), 0.0)\n}\n"
  },
  {
    "path": "platforms/parrot/ardrone/test_helper.go",
    "content": "package ardrone\n\ntype testDrone struct{}\n\nfunc (t testDrone) Takeoff() bool              { return true }\nfunc (t testDrone) Land()                      {}\nfunc (t testDrone) Up(a float64)               {}\nfunc (t testDrone) Down(a float64)             {}\nfunc (t testDrone) Left(a float64)             {}\nfunc (t testDrone) Right(a float64)            {}\nfunc (t testDrone) Forward(a float64)          {}\nfunc (t testDrone) Backward(a float64)         {}\nfunc (t testDrone) Clockwise(a float64)        {}\nfunc (t testDrone) Counterclockwise(a float64) {}\nfunc (t testDrone) Hover()                     {}\n"
  },
  {
    "path": "platforms/parrot/bebop/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/parrot/bebop/README.md",
    "content": "# Bebop\n\nThe Parrot Bebop and Parrot Bebop 2 are inexpensive quadcopters that can be controlled using their built-in API commands\nvia a WiFi connection. They include a built-in front-facing HD video camera, as well as a second lower resolution\nbottom-facing video camera.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/parrot/bebop\"\n)\n\nfunc main() {\n  bebopAdaptor := bebop.NewAdaptor()\n  drone := bebop.NewDriver(bebopAdaptor)\n\n  work := func() {\n    drone.HullProtection(true)\n    drone.TakeOff()\n    gobot.On(drone.Event(\"flying\"), func(data interface{}) {\n      gobot.After(3*time.Second, func() {\n        drone.Land()\n      })\n    })\n  }\n\n  robot := gobot.NewRobot(\"drone\",\n    []gobot.Connection{bebopAdaptor},\n    []gobot.Device{drone},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How to Connect\n\nBy default, the Parrot Bebop is a WiFi access point, so there is no additional work to establish a connection to a single\ndrone, you just connect to it.\n\nOnce connected, if you want to stream drone video you can either:\n\n- Use the RTP protocol with an external player such as mplayer or VLC.\n- Grab the video frames from the drone's data frames, and work with them directly.\n"
  },
  {
    "path": "platforms/parrot/bebop/bebop_adaptor.go",
    "content": "package bebop\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/parrot/bebop/client\"\n)\n\n// drone defines expected drone behaviour\ntype drone interface {\n\tTakeOff() error\n\tLand() error\n\tUp(n int) error\n\tDown(n int) error\n\tLeft(n int) error\n\tRight(n int) error\n\tForward(n int) error\n\tBackward(n int) error\n\tClockwise(n int) error\n\tCounterClockwise(n int) error\n\tStop() error\n\tConnect() error\n\tVideo() chan []byte\n\tStartRecording() error\n\tStopRecording() error\n\tHullProtection(protect bool) error\n\tOutdoor(outdoor bool) error\n\tVideoEnable(enable bool) error\n\tVideoStreamMode(mode int8) error\n}\n\n// Adaptor is gobot.Adaptor representation for the Bebop\ntype Adaptor struct {\n\tname    string\n\tdrone   drone\n\tconnect func(*Adaptor) error\n}\n\n// NewAdaptor returns a new BebopAdaptor\nfunc NewAdaptor() *Adaptor {\n\treturn &Adaptor{\n\t\tname:  gobot.DefaultName(\"Bebop\"),\n\t\tdrone: client.New(),\n\t\tconnect: func(a *Adaptor) error {\n\t\t\treturn a.drone.Connect()\n\t\t},\n\t}\n}\n\n// Name returns the Bebop adaptors Name\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the Bebop adaptors Name\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect establishes a connection to the ardrone\nfunc (a *Adaptor) Connect() error {\n\treturn a.connect(a)\n}\n\n// Finalize terminates the connection to the ardrone\nfunc (a *Adaptor) Finalize() error { return nil }\n"
  },
  {
    "path": "platforms/parrot/bebop/bebop_adaptor_test.go",
    "content": "package bebop\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc initTestBebopAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\ta.connect = func(b *Adaptor) error {\n\t\tb.drone = &testDrone{}\n\t\treturn nil\n\t}\n\treturn a\n}\n\nfunc TestBebopAdaptorName(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Bebop\"))\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestBebopAdaptorConnect(t *testing.T) {\n\ta := initTestBebopAdaptor()\n\trequire.NoError(t, a.Connect())\n\n\ta.connect = func(a *Adaptor) error {\n\t\treturn errors.New(\"connection error\")\n\t}\n\trequire.ErrorContains(t, a.Connect(), \"connection error\")\n}\n\nfunc TestBebopAdaptorFinalize(t *testing.T) {\n\ta := initTestBebopAdaptor()\n\t_ = a.Connect()\n\trequire.NoError(t, a.Finalize())\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/bebop_driver.go",
    "content": "package bebop\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// Flying event\n\tFlying = \"flying\"\n)\n\n// Driver is gobot.Driver representation for the Bebop\ntype Driver struct {\n\tgobot.Eventer\n\n\tname       string\n\tconnection gobot.Connection\n}\n\n// NewDriver creates an Bebop Driver.\nfunc NewDriver(connection *Adaptor) *Driver {\n\td := &Driver{\n\t\tname:       gobot.DefaultName(\"Bebop\"),\n\t\tconnection: connection,\n\t\tEventer:    gobot.NewEventer(),\n\t}\n\td.AddEvent(Flying)\n\treturn d\n}\n\n// Name returns the Bebop Drivers Name\nfunc (a *Driver) Name() string { return a.name }\n\n// SetName sets the Bebop Drivers Name\nfunc (a *Driver) SetName(n string) { a.name = n }\n\n// Connection returns the Bebop Drivers Connection\nfunc (a *Driver) Connection() gobot.Connection { return a.connection }\n\n// adaptor returns ardrone adaptor\nfunc (a *Driver) adaptor() *Adaptor {\n\t//nolint:forcetypeassert // ok here\n\treturn a.Connection().(*Adaptor)\n}\n\n// Start starts the Bebop Driver\nfunc (a *Driver) Start() error {\n\treturn nil\n}\n\n// Halt halts the Bebop Driver\nfunc (a *Driver) Halt() error {\n\treturn nil\n}\n\n// TakeOff makes the drone start flying\nfunc (a *Driver) TakeOff() {\n\ta.Publish(a.Event(\"flying\"), a.adaptor().drone.TakeOff())\n}\n\n// Land causes the drone to land\nfunc (a *Driver) Land() error {\n\treturn a.adaptor().drone.Land()\n}\n\n// Up makes the drone gain altitude.\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) Up(speed int) error {\n\treturn a.adaptor().drone.Up(speed)\n}\n\n// Down makes the drone reduce altitude.\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) Down(speed int) error {\n\treturn a.adaptor().drone.Down(speed)\n}\n\n// Left causes the drone to bank to the left, controls the roll, which is\n// a horizontal movement using the camera as a reference point.\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) Left(speed int) error {\n\treturn a.adaptor().drone.Left(speed)\n}\n\n// Right causes the drone to bank to the right, controls the roll, which is\n// a horizontal movement using the camera as a reference point.\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) Right(speed int) error {\n\treturn a.adaptor().drone.Right(speed)\n}\n\n// Forward causes the drone go forward, controls the pitch.\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) Forward(speed int) error {\n\treturn a.adaptor().drone.Forward(speed)\n}\n\n// Backward causes the drone go forward, controls the pitch.\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) Backward(speed int) error {\n\treturn a.adaptor().drone.Backward(speed)\n}\n\n// Clockwise causes the drone to spin in clockwise direction\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) Clockwise(speed int) error {\n\treturn a.adaptor().drone.Clockwise(speed)\n}\n\n// CounterClockwise the drone to spin in counter clockwise direction\n// speed can be a value from `0` to `100`.\nfunc (a *Driver) CounterClockwise(speed int) error {\n\treturn a.adaptor().drone.CounterClockwise(speed)\n}\n\n// Stop makes the drone to hover in place.\nfunc (a *Driver) Stop() error {\n\treturn a.adaptor().drone.Stop()\n}\n\n// Video returns a channel which raw video frames will be broadcast on\nfunc (a *Driver) Video() chan []byte {\n\treturn a.adaptor().drone.Video()\n}\n\n// StartRecording starts the recording video to the drones interal storage\nfunc (a *Driver) StartRecording() error {\n\treturn a.adaptor().drone.StartRecording()\n}\n\n// StopRecording stops a previously started recording\nfunc (a *Driver) StopRecording() error {\n\treturn a.adaptor().drone.StopRecording()\n}\n\n// HullProtection tells the drone if the hull/prop protectors are attached. This is needed to adjust\n// flight characteristics of the Bebop.\nfunc (a *Driver) HullProtection(protect bool) error {\n\treturn a.adaptor().drone.HullProtection(protect)\n}\n\n// Outdoor tells the drone if flying Outdoor or not. This is needed to adjust flight characteristics of the Bebop.\nfunc (a *Driver) Outdoor(outdoor bool) error {\n\treturn a.adaptor().drone.Outdoor(outdoor)\n}\n\n// VideoEnable tells the drone to start/stop streaming video\nfunc (a *Driver) VideoEnable(enable bool) error {\n\treturn a.adaptor().drone.VideoEnable(enable)\n}\n\n// VideoStreamMode tells the drone what mode to use for streaming video\nfunc (a *Driver) VideoStreamMode(mode int8) error {\n\treturn a.adaptor().drone.VideoStreamMode(mode)\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/bebop_driver_test.go",
    "content": "package bebop\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc TestBebopDriverName(t *testing.T) {\n\ta := initTestBebopAdaptor()\n\td := NewDriver(a)\n\tassert.True(t, strings.HasPrefix(d.Name(), \"Bebop\"))\n\td.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", d.Name())\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/client/client.go",
    "content": "package client\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n)\n\nfunc validatePitch(val int) int {\n\tif val > 100 {\n\t\treturn 100\n\t} else if val < 0 {\n\t\treturn 0\n\t}\n\n\treturn val\n}\n\ntype tmpFrame struct {\n\tarstreamACK   ARStreamACK\n\tfragments     map[int][]byte\n\tframe         []byte\n\twaitForIframe bool\n\tframeFlags    int\n}\n\ntype ARStreamACK struct {\n\tFrameNumber    int\n\tHighPacketsAck uint64\n\tLowPacketsAck  uint64\n}\n\ntype ARStreamFrame struct {\n\tFrameNumber       int\n\tFrameFlags        int\n\tFragmentNumber    int\n\tFragmentsPerFrame int\n\tFrame             []byte\n}\n\nfunc NewARStreamFrame(buf []byte) ARStreamFrame {\n\t//\n\t// ARSTREAM_NetworkHeaders_DataHeader_t;\n\t//\n\t// uint16_t frameNumber;\n\t// uint8_t  frameFlags; // Infos on the current frame\n\t// uint8_t  fragmentNumber; // Index of the current fragment in current frame\n\t// uint8_t  fragmentsPerFrame; // Number of fragments in current frame\n\t//\n\t// * frameFlags structure :\n\t// *  x x x x x x x x\n\t// *  | | | | | | | \\-> FLUSH FRAME\n\t// *  | | | | | | \\-> UNUSED\n\t// *  | | | | | \\-> UNUSED\n\t// *  | | | | \\-> UNUSED\n\t// *  | | | \\-> UNUSED\n\t// *  | | \\-> UNUSED\n\t// *  | \\-> UNUSED\n\t// *  \\-> UNUSED\n\t// *\n\t//\n\n\tframe := ARStreamFrame{\n\t\tFrameFlags:        int(buf[2]),\n\t\tFragmentNumber:    int(buf[3]),\n\t\tFragmentsPerFrame: int(buf[4]),\n\t}\n\n\tvar number uint16\n\tif err := binary.Read(bytes.NewReader(buf[0:2]), binary.LittleEndian, &number); err != nil {\n\t\tpanic(err)\n\t}\n\n\tframe.FrameNumber = int(number)\n\n\tframe.Frame = buf[5:]\n\n\treturn frame\n}\n\ntype NetworkFrame struct {\n\tType int\n\tSeq  int\n\tId   int\n\tSize int\n\tData []byte\n}\n\nfunc NewNetworkFrame(buf []byte) NetworkFrame {\n\tframe := NetworkFrame{\n\t\tType: int(buf[0]),\n\t\tId:   int(buf[1]),\n\t\tSeq:  int(buf[2]),\n\t\tData: []byte{},\n\t}\n\n\tvar size uint32\n\tif err := binary.Read(bytes.NewReader(buf[3:7]), binary.LittleEndian, &size); err != nil {\n\t\tpanic(err)\n\t}\n\tframe.Size = int(size)\n\n\tframe.Data = buf[7:frame.Size]\n\n\treturn frame\n}\n\ntype Pcmd struct {\n\tFlag  int\n\tRoll  int\n\tPitch int\n\tYaw   int\n\tGaz   int\n\tPsi   float32\n}\n\ntype Bebop struct {\n\tIP               string\n\tNavData          map[string]string\n\tPcmd             Pcmd\n\ttmpFrame         tmpFrame\n\tC2dPort          int\n\tD2cPort          int\n\tRTPStreamPort    int\n\tRTPControlPort   int\n\tDiscoveryPort    int\n\tc2dClient        *net.UDPConn\n\td2cClient        *net.UDPConn\n\tdiscoveryClient  *net.TCPConn\n\tnwFrameGenerator *nwFrameGenerator\n\tvideo            chan []byte\n\twriteChan        chan []byte\n}\n\nfunc New() *Bebop {\n\treturn &Bebop{\n\t\tIP:               \"192.168.42.1\",\n\t\tNavData:          make(map[string]string),\n\t\tC2dPort:          54321,\n\t\tD2cPort:          43210,\n\t\tRTPStreamPort:    55004,\n\t\tRTPControlPort:   55005,\n\t\tDiscoveryPort:    44444,\n\t\tnwFrameGenerator: newNetworkFrameGenerator(),\n\t\tPcmd: Pcmd{\n\t\t\tFlag:  0,\n\t\t\tRoll:  0,\n\t\t\tPitch: 0,\n\t\t\tYaw:   0,\n\t\t\tGaz:   0,\n\t\t\tPsi:   0,\n\t\t},\n\t\ttmpFrame:  tmpFrame{},\n\t\tvideo:     make(chan []byte),\n\t\twriteChan: make(chan []byte),\n\t}\n}\n\nfunc (b *Bebop) write(buf []byte) error {\n\tb.writeChan <- buf\n\treturn nil\n}\n\nfunc (b *Bebop) Discover() error {\n\taddr, err := net.ResolveTCPAddr(\"tcp\", fmt.Sprintf(\"%s:%d\", b.IP, b.DiscoveryPort))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tb.discoveryClient, err = net.DialTCP(\"tcp\", nil, addr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := fmt.Fprintf(b.discoveryClient,\n\n\t\t`{\n\t\t\t\t\t\t\"controller_type\": \"computer\",\n\t\t\t\t\t\t\"controller_name\": \"go-bebop\",\n\t\t\t\t\t\t\"d2c_port\": \"%d\",\n\t\t\t\t\t\t\"arstream2_client_stream_port\": \"%d\",\n\t\t\t\t\t\t\"arstream2_client_control_port\": \"%d\",\n\t\t\t\t\t\t}`,\n\t\tb.D2cPort,\n\t\tb.RTPStreamPort,\n\t\tb.RTPControlPort); err != nil {\n\t\treturn err\n\t}\n\n\tdata := make([]byte, 10240)\n\n\t_, err = b.discoveryClient.Read(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn b.discoveryClient.Close()\n}\n\nfunc (b *Bebop) Connect() error {\n\terr := b.Discover()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc2daddr, err := net.ResolveUDPAddr(\"udp\", fmt.Sprintf(\"%s:%d\", b.IP, b.C2dPort))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tb.c2dClient, err = net.DialUDP(\"udp\", nil, c2daddr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\td2caddr, err := net.ResolveUDPAddr(\"udp\", fmt.Sprintf(\":%d\", b.D2cPort))\n\tif err != nil {\n\t\treturn err\n\t}\n\tb.d2cClient, err = net.ListenUDP(\"udp\", d2caddr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\t_, err := b.c2dClient.Write(<-b.writeChan)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\t}()\n\n\tgo func() {\n\t\tfor {\n\t\t\tdata := make([]byte, 40960)\n\t\t\ti, _, err := b.d2cClient.ReadFromUDP(data)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"d2cClient error:\", err)\n\t\t\t}\n\n\t\t\tb.packetReceiver(data[0:i])\n\t\t}\n\t}()\n\n\t// send pcmd values at 40hz\n\tgo func() {\n\t\t// wait a little bit so that there is enough time to get some ACKs\n\t\ttime.Sleep(500 * time.Millisecond)\n\t\tfor {\n\t\t\tif err := b.write(b.generatePcmd().Bytes()); err != nil {\n\t\t\t\tfmt.Println(\"pcmd c2dClient.Write\", err)\n\t\t\t}\n\t\t\ttime.Sleep(25 * time.Millisecond)\n\t\t}\n\t}()\n\n\tif err := b.GenerateAllStates(); err != nil {\n\t\treturn err\n\t}\n\tif err := b.FlatTrim(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (b *Bebop) FlatTrim() error {\n\t//\n\t// ARCOMMANDS_Generator_GenerateARDrone3PilotingFlatTrim\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_PILOTING)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, uint16(ARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_FLATTRIM)); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) GenerateAllStates() error {\n\t//\n\t// ARCOMMANDS_Generator_GenerateCommonCommonAllStates\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_COMMON)\n\tcmd.WriteByte(ARCOMMANDS_ID_COMMON_CLASS_COMMON)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, uint16(ARCOMMANDS_ID_COMMON_COMMON_CMD_ALLSTATES)); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) TakeOff() error {\n\t//\n\t//  ARCOMMANDS_Generator_GenerateARDrone3PilotingTakeOff\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_PILOTING)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, uint16(ARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_TAKEOFF)); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) Land() error {\n\t//\n\t// ARCOMMANDS_Generator_GenerateARDrone3PilotingLanding\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_PILOTING)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, uint16(ARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_LANDING)); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) Up(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Gaz = validatePitch(val)\n\treturn nil\n}\n\nfunc (b *Bebop) Down(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Gaz = validatePitch(val) * -1\n\treturn nil\n}\n\nfunc (b *Bebop) Forward(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Pitch = validatePitch(val)\n\treturn nil\n}\n\nfunc (b *Bebop) Backward(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Pitch = validatePitch(val) * -1\n\treturn nil\n}\n\nfunc (b *Bebop) Right(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Roll = validatePitch(val)\n\treturn nil\n}\n\nfunc (b *Bebop) Left(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Roll = validatePitch(val) * -1\n\treturn nil\n}\n\nfunc (b *Bebop) Clockwise(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Yaw = validatePitch(val)\n\treturn nil\n}\n\nfunc (b *Bebop) CounterClockwise(val int) error {\n\tb.Pcmd.Flag = 1\n\tb.Pcmd.Yaw = validatePitch(val) * -1\n\treturn nil\n}\n\nfunc (b *Bebop) Stop() error {\n\tb.Pcmd = Pcmd{\n\t\tFlag:  0,\n\t\tRoll:  0,\n\t\tPitch: 0,\n\t\tYaw:   0,\n\t\tGaz:   0,\n\t\tPsi:   0,\n\t}\n\n\treturn nil\n}\n\nfunc (b *Bebop) generatePcmd() *bytes.Buffer {\n\t//\n\t// ARCOMMANDS_Generator_GenerateARDrone3PilotingPCMD\n\t//\n\t// uint8 - flag Boolean flag to activate roll/pitch movement\n\t// int8  - roll Roll consign for the drone [-100;100]\n\t// int8  - pitch Pitch consign for the drone [-100;100]\n\t// int8  - yaw Yaw consign for the drone [-100;100]\n\t// int8  - gaz Gaz consign for the drone [-100;100]\n\t// float - psi [NOT USED] - Magnetic north heading of the\n\t//         controlling device (deg) [-180;180]\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_PILOTING)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, uint16(ARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_PCMD)); err != nil {\n\t\tpanic(err)\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(tmp, binary.LittleEndian, uint8(b.Pcmd.Flag)); err != nil {\n\t\tpanic(err)\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(tmp, binary.LittleEndian, int8(b.Pcmd.Roll)); err != nil {\n\t\tpanic(err)\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(tmp, binary.LittleEndian, int8(b.Pcmd.Pitch)); err != nil {\n\t\tpanic(err)\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(tmp, binary.LittleEndian, int8(b.Pcmd.Yaw)); err != nil {\n\t\tpanic(err)\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(tmp, binary.LittleEndian, int8(b.Pcmd.Gaz)); err != nil {\n\t\tpanic(err)\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, uint32(b.Pcmd.Psi)); err != nil {\n\t\tpanic(err)\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID)\n}\n\nfunc (b *Bebop) createAck(frame NetworkFrame) *bytes.Buffer {\n\t//\n\t// ARNETWORK_Receiver_ThreadRun\n\t//\n\n\t//\n\t// libARNetwork/Sources/ARNETWORK_Manager.h#ARNETWORK_Manager_IDOutputToIDAck\n\t//\n\n\t//nolint:gosec // TODO: fix later\n\treturn b.nwFrameGenerator.generate(bytes.NewBuffer([]byte{uint8(frame.Seq)}),\n\t\tARNETWORKAL_FRAME_TYPE_ACK,\n\t\tbyte(uint16(frame.Id)+(ARNETWORKAL_MANAGER_DEFAULT_ID_MAX/2)),\n\t)\n}\n\nfunc (b *Bebop) createPong(frame NetworkFrame) *bytes.Buffer {\n\treturn b.nwFrameGenerator.generate(bytes.NewBuffer(frame.Data),\n\t\tARNETWORKAL_FRAME_TYPE_DATA,\n\t\tARNETWORK_MANAGER_INTERNAL_BUFFER_ID_PONG,\n\t)\n}\n\nfunc (b *Bebop) packetReceiver(buf []byte) {\n\tframe := NewNetworkFrame(buf)\n\n\t//\n\t// libARNetwork/Sources/ARNETWORK_Receiver.c#ARNETWORK_Receiver_ThreadRun\n\t//\n\tif frame.Type == int(ARNETWORKAL_FRAME_TYPE_DATA_WITH_ACK) {\n\t\tack := b.createAck(frame).Bytes()\n\t\tif err := b.write(ack); err != nil {\n\t\t\tfmt.Println(\"ARNETWORKAL_FRAME_TYPE_DATA_WITH_ACK\", err)\n\t\t}\n\t}\n\n\tif frame.Type == int(ARNETWORKAL_FRAME_TYPE_DATA_LOW_LATENCY) &&\n\t\tframe.Id == int(BD_NET_DC_VIDEO_DATA_ID) {\n\n\t\tarstreamFrame := NewARStreamFrame(frame.Data)\n\n\t\tack := b.createARStreamACK(arstreamFrame).Bytes()\n\t\tif err := b.write(ack); err != nil {\n\t\t\tfmt.Println(\"ARNETWORKAL_FRAME_TYPE_DATA_LOW_LATENCY\", err)\n\t\t}\n\t}\n\n\t//\n\t// libARNetwork/Sources/ARNETWORK_Receiver.c#ARNETWORK_Receiver_ThreadRun\n\t//\n\tif frame.Id == int(ARNETWORK_MANAGER_INTERNAL_BUFFER_ID_PING) {\n\t\tpong := b.createPong(frame).Bytes()\n\t\tif err := b.write(pong); err != nil {\n\t\t\tfmt.Println(\"ARNETWORK_MANAGER_INTERNAL_BUFFER_ID_PING\", err)\n\t\t}\n\t}\n}\n\nfunc (b *Bebop) StartRecording() error {\n\tbuf := b.videoRecord(ARCOMMANDS_ARDRONE3_MEDIARECORD_VIDEO_RECORD_START)\n\n\treturn b.write(b.nwFrameGenerator.generate(buf, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) StopRecording() error {\n\tbuf := b.videoRecord(ARCOMMANDS_ARDRONE3_MEDIARECORD_VIDEO_RECORD_STOP)\n\n\treturn b.write(b.nwFrameGenerator.generate(buf, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) videoRecord(state byte) *bytes.Buffer {\n\t//\n\t// ARCOMMANDS_Generator_GenerateARDrone3MediaRecordVideo\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_MEDIARECORD)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp,\n\t\tbinary.LittleEndian,\n\t\tuint16(ARCOMMANDS_ID_ARDRONE3_MEDIARECORD_CMD_VIDEO),\n\t); err != nil {\n\t\tpanic(err)\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, uint32(state)); err != nil {\n\t\tpanic(err)\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\tcmd.WriteByte(0)\n\n\treturn cmd\n}\n\nfunc (b *Bebop) Video() chan []byte {\n\treturn b.video\n}\n\nfunc (b *Bebop) HullProtection(protect bool) error {\n\t//\n\t// ARCOMMANDS_Generator_GenerateARDrone3SpeedSettingsHullProtection\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_SPEEDSETTINGS)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp,\n\t\tbinary.LittleEndian,\n\t\tuint16(ARCOMMANDS_ID_ARDRONE3_SPEEDSETTINGS_CMD_HULLPROTECTION),\n\t); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, bool2int8(protect)); err != nil {\n\t\treturn err\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) Outdoor(outdoor bool) error {\n\t//\n\t// ARCOMMANDS_Generator_GenerateARDrone3SpeedSettingsOutdoor\n\t//\n\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_SPEEDSETTINGS)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp,\n\t\tbinary.LittleEndian,\n\t\tuint16(ARCOMMANDS_ID_ARDRONE3_SPEEDSETTINGS_CMD_OUTDOOR),\n\t); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, bool2int8(outdoor)); err != nil {\n\t\treturn err\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) VideoEnable(enable bool) error {\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_MEDIASTREAMING)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp,\n\t\tbinary.LittleEndian,\n\t\tuint16(ARCOMMANDS_ID_ARDRONE3_MEDIASTREAMING_CMD_VIDEOENABLE),\n\t); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, bool2int8(enable)); err != nil {\n\t\treturn err\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc (b *Bebop) VideoStreamMode(mode int8) error {\n\tcmd := &bytes.Buffer{}\n\n\tcmd.WriteByte(ARCOMMANDS_ID_PROJECT_ARDRONE3)\n\tcmd.WriteByte(ARCOMMANDS_ID_ARDRONE3_CLASS_MEDIASTREAMING)\n\n\ttmp := &bytes.Buffer{}\n\tif err := binary.Write(tmp,\n\t\tbinary.LittleEndian,\n\t\tuint16(ARCOMMANDS_ID_ARDRONE3_MEDIASTREAMING_CMD_VIDEOSTREAMMODE),\n\t); err != nil {\n\t\treturn err\n\t}\n\n\tcmd.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, mode); err != nil {\n\t\treturn err\n\t}\n\tcmd.Write(tmp.Bytes())\n\n\treturn b.write(b.nwFrameGenerator.generate(cmd, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_NONACK_ID).Bytes())\n}\n\nfunc bool2int8(b bool) int8 {\n\tif b {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (b *Bebop) createARStreamACK(frame ARStreamFrame) *bytes.Buffer {\n\t//\n\t// ARSTREAM_NetworkHeaders_AckPacket_t;\n\t//\n\t// uint16_t frameNumber;    // id of the current frame\n\t// uint64_t highPacketsAck; // Upper 64 packets bitfield\n\t// uint64_t lowPacketsAck;  // Lower 64 packets bitfield\n\t//\n\t// libARStream/Sources/ARSTREAM_NetworkHeaders.c#ARSTREAM_NetworkHeaders_AckPacketSetFlag\n\t//\n\n\t//\n\t// each bit in the highPacketsAck and lowPacketsAck correspond to the\n\t// fragmentsPerFrame which have been received per frameNumber, so time to\n\t// flip some bits!\n\t//\n\tif frame.FrameNumber != b.tmpFrame.arstreamACK.FrameNumber {\n\t\tif len(b.tmpFrame.fragments) > 0 {\n\t\t\temit := false\n\n\t\t\t// if we missed some frames, wait for the next iframe\n\t\t\tif frame.FrameNumber != b.tmpFrame.arstreamACK.FrameNumber+1 {\n\t\t\t\tb.tmpFrame.waitForIframe = true\n\t\t\t}\n\n\t\t\t// if it's an iframe\n\t\t\tif b.tmpFrame.frameFlags == 1 {\n\t\t\t\tb.tmpFrame.waitForIframe = false\n\t\t\t\temit = true\n\t\t\t} else if !b.tmpFrame.waitForIframe {\n\t\t\t\temit = true\n\t\t\t}\n\n\t\t\tif emit {\n\t\t\t\tskip := false\n\n\t\t\t\tfor i := 0; i < len(b.tmpFrame.fragments); i++ {\n\t\t\t\t\t// check if any fragments are missing\n\t\t\t\t\tif len(b.tmpFrame.fragments[i]) == 0 {\n\t\t\t\t\t\tskip = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tb.tmpFrame.frame = append(b.tmpFrame.frame, b.tmpFrame.fragments[i]...)\n\t\t\t\t}\n\n\t\t\t\tif !skip {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase b.video <- b.tmpFrame.frame:\n\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tb.tmpFrame.fragments = make(map[int][]byte)\n\t\tb.tmpFrame.frame = []byte{}\n\t\tb.tmpFrame.arstreamACK.FrameNumber = frame.FrameNumber\n\t\tb.tmpFrame.frameFlags = frame.FrameFlags\n\t}\n\tb.tmpFrame.fragments[frame.FragmentNumber] = frame.Frame\n\n\tif frame.FragmentNumber < 64 {\n\t\t//nolint:gosec // TODO: fix later\n\t\tb.tmpFrame.arstreamACK.LowPacketsAck |= uint64(1) << uint64(frame.FragmentNumber)\n\t} else {\n\t\t//nolint:gosec // TODO: fix later\n\t\tb.tmpFrame.arstreamACK.HighPacketsAck |= uint64(1) << uint64(frame.FragmentNumber-64)\n\t}\n\n\tackPacket := &bytes.Buffer{}\n\ttmp := &bytes.Buffer{}\n\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(tmp, binary.LittleEndian, uint16(b.tmpFrame.arstreamACK.FrameNumber)); err != nil {\n\t\tpanic(err)\n\t}\n\tackPacket.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, b.tmpFrame.arstreamACK.HighPacketsAck); err != nil {\n\t\tpanic(err)\n\t}\n\tackPacket.Write(tmp.Bytes())\n\n\ttmp = &bytes.Buffer{}\n\tif err := binary.Write(tmp, binary.LittleEndian, b.tmpFrame.arstreamACK.LowPacketsAck); err != nil {\n\t\tpanic(err)\n\t}\n\tackPacket.Write(tmp.Bytes())\n\n\treturn b.nwFrameGenerator.generate(ackPacket, ARNETWORKAL_FRAME_TYPE_DATA, BD_NET_CD_VIDEO_ACK_ID)\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/client/constants.go",
    "content": "package client\n\nconst (\n\t// libARNetworkAL/Includes/libARNetworkAL/ARNETWORKAL_Manager.h\n\tARNETWORKAL_MANAGER_DEFAULT_ID_MAX uint16 = 256\n\n\t// ARNETWORKAL_Frame_t identifiers\n\tBD_NET_CD_NONACK_ID     byte = 10\n\tBD_NET_CD_ACK_ID        byte = 11\n\tBD_NET_CD_EMERGENCY_ID  byte = 12\n\tBD_NET_CD_VIDEO_ACK_ID  byte = 13\n\tBD_NET_DC_VIDEO_DATA_ID byte = 125\n\tBD_NET_DC_EVENT_ID      byte = 126\n\tBD_NET_DC_NAVDATA_ID    byte = 127\n\n\t// eARCOMMANDS_ID_PROJECT\n\tARCOMMANDS_ID_PROJECT_COMMON   byte = 0\n\tARCOMMANDS_ID_PROJECT_ARDRONE3 byte = 1\n\n\t// eARCOMMANDS_ID_ARDRONE3_CLASS\n\tARCOMMANDS_ID_ARDRONE3_CLASS_PILOTING              byte = 0\n\tARCOMMANDS_ID_ARDRONE3_CLASS_ANIMATIONS            byte = 5\n\tARCOMMANDS_ID_ARDRONE3_CLASS_CAMERA                byte = 1\n\tARCOMMANDS_ID_ARDRONE3_CLASS_MEDIARECORD           byte = 7\n\tARCOMMANDS_ID_ARDRONE3_CLASS_MEDIARECORDSTATE      byte = 8\n\tARCOMMANDS_ID_ARDRONE3_CLASS_MEDIARECORDEVENT      byte = 3\n\tARCOMMANDS_ID_ARDRONE3_CLASS_PILOTINGSTATE         byte = 4\n\tARCOMMANDS_ID_ARDRONE3_CLASS_NETWORK               byte = 13\n\tARCOMMANDS_ID_ARDRONE3_CLASS_NETWORKSTATE          byte = 14\n\tARCOMMANDS_ID_ARDRONE3_CLASS_PILOTINGSETTINGS      byte = 2\n\tARCOMMANDS_ID_ARDRONE3_CLASS_PILOTINGSETTINGSSTATE byte = 6\n\tARCOMMANDS_ID_ARDRONE3_CLASS_SPEEDSETTINGS         byte = 11\n\tARCOMMANDS_ID_ARDRONE3_CLASS_SPEEDSETTINGSSTATE    byte = 12\n\tARCOMMANDS_ID_ARDRONE3_CLASS_NETWORKSETTINGS       byte = 9\n\tARCOMMANDS_ID_ARDRONE3_CLASS_NETWORKSETTINGSSTATE  byte = 10\n\tARCOMMANDS_ID_ARDRONE3_CLASS_SETTINGS              byte = 15\n\tARCOMMANDS_ID_ARDRONE3_CLASS_SETTINGSSTATE         byte = 16\n\tARCOMMANDS_ID_ARDRONE3_CLASS_DIRECTORMODE          byte = 17\n\tARCOMMANDS_ID_ARDRONE3_CLASS_DIRECTORMODESTATE     byte = 18\n\tARCOMMANDS_ID_ARDRONE3_CLASS_PICTURESETTINGS       byte = 19\n\tARCOMMANDS_ID_ARDRONE3_CLASS_PICTURESETTINGSSTATE  byte = 20\n\tARCOMMANDS_ID_ARDRONE3_CLASS_MEDIASTREAMING        byte = 21\n\tARCOMMANDS_ID_ARDRONE3_CLASS_MEDIASTREAMINGSTATE   byte = 22\n\tARCOMMANDS_ID_ARDRONE3_CLASS_GPSSETTINGS           byte = 23\n\tARCOMMANDS_ID_ARDRONE3_CLASS_GPSSETTINGSSTATE      byte = 24\n\tARCOMMANDS_ID_ARDRONE3_CLASS_CAMERASTATE           byte = 25\n\tARCOMMANDS_ID_ARDRONE3_CLASS_ANTIFLICKERING        byte = 29\n\tARCOMMANDS_ID_ARDRONE3_CLASS_ANTIFLICKERINGSTATE   byte = 30\n\n\t// eARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_FLATTRIMCHANGED          byte = 0\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_FLYINGSTATECHANGED       byte = 1\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_ALERTSTATECHANGED        byte = 2\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_NAVIGATEHOMESTATECHANGED byte = 3\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_POSITIONCHANGED          byte = 4\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_SPEEDCHANGED             byte = 5\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_ATTITUDECHANGED          byte = 6\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_AUTOTAKEOFFMODECHANGED   byte = 7\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_ALTITUDECHANGED          byte = 8\n\tARCOMMANDS_ID_ARDRONE3_PILOTINGSTATE_CMD_MAX                      byte = 9\n\n\t// eARCOMMANDS_ID_ARDRONE3_ANIMATIONS_CMD;\n\tARCOMMANDS_ID_ARDRONE3_ANIMATIONS_CMD_FLIP byte = 0\n\tARCOMMANDS_ID_ARDRONE3_ANIMATIONS_CMD_MAX  byte = 1\n\n\t// eARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE;\n\tARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_LANDED    byte = 0\n\tARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_TAKINGOFF byte = 1\n\tARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_HOVERING  byte = 2\n\tARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_FLYING    byte = 3\n\tARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_LANDING   byte = 4\n\tARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_EMERGENCY byte = 5\n\tARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_MAX       byte = 6\n\n\t// eARCOMMANDS_ARDRONE3_ANIMATIONS_FLIP_DIRECTION;\n\tARCOMMANDS_ARDRONE3_ANIMATIONS_FLIP_DIRECTION_FRONT byte = 0\n\tARCOMMANDS_ARDRONE3_ANIMATIONS_FLIP_DIRECTION_BACK  byte = 1\n\tARCOMMANDS_ARDRONE3_ANIMATIONS_FLIP_DIRECTION_RIGHT byte = 2\n\tARCOMMANDS_ARDRONE3_ANIMATIONS_FLIP_DIRECTION_LEFT  byte = 3\n\tARCOMMANDS_ARDRONE3_ANIMATIONS_FLIP_DIRECTION_MAX   byte = 4\n\n\t// eARCOMMANDS_ID_COMMON_CLASS\n\tARCOMMANDS_ID_COMMON_CLASS_NETWORK             byte = 0\n\tARCOMMANDS_ID_COMMON_CLASS_NETWORKEVENT        byte = 1\n\tARCOMMANDS_ID_COMMON_CLASS_SETTINGS            byte = 2\n\tARCOMMANDS_ID_COMMON_CLASS_SETTINGSSTATE       byte = 3\n\tARCOMMANDS_ID_COMMON_CLASS_COMMON              byte = 4\n\tARCOMMANDS_ID_COMMON_CLASS_COMMONSTATE         byte = 5\n\tARCOMMANDS_ID_COMMON_CLASS_OVERHEAT            byte = 6\n\tARCOMMANDS_ID_COMMON_CLASS_OVERHEATSTATE       byte = 7\n\tARCOMMANDS_ID_COMMON_CLASS_CONTROLLERSTATE     byte = 8\n\tARCOMMANDS_ID_COMMON_CLASS_WIFISETTINGS        byte = 9\n\tARCOMMANDS_ID_COMMON_CLASS_WIFISETTINGSSTATE   byte = 10\n\tARCOMMANDS_ID_COMMON_CLASS_MAVLINK             byte = 11\n\tARCOMMANDS_ID_COMMON_CLASS_MAVLINKSTATE        byte = 12\n\tARCOMMANDS_ID_COMMON_CLASS_CALIBRATION         byte = 13\n\tARCOMMANDS_ID_COMMON_CLASS_CALIBRATIONSTATE    byte = 14\n\tARCOMMANDS_ID_COMMON_CLASS_CAMERASETTINGSSTATE byte = 15\n\tARCOMMANDS_ID_COMMON_CLASS_GPS                 byte = 16\n\tARCOMMANDS_ID_COMMON_CLASS_FLIGHTPLANSTATE     byte = 17\n\tARCOMMANDS_ID_COMMON_CLASS_FLIGHTPLANEVENT     byte = 19\n\tARCOMMANDS_ID_COMMON_CLASS_ARLIBSVERSIONSSTATE byte = 18\n\n\t// eARCOMMANDS_ID_ARDRONE3_PILOTING_CMD\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_FLATTRIM        byte = 0\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_TAKEOFF         byte = 1\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_PCMD            byte = 2\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_LANDING         byte = 3\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_EMERGENCY       byte = 4\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_NAVIGATEHOME    byte = 5\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_AUTOTAKEOFFMODE byte = 6\n\tARCOMMANDS_ID_ARDRONE3_PILOTING_CMD_MAX             byte = 7\n\n\t// eARCOMMANDS_ID_ARDRONE3_MEDIARECORD_CMD\n\tARCOMMANDS_ID_ARDRONE3_MEDIARECORD_CMD_PICTURE   byte = 0\n\tARCOMMANDS_ID_ARDRONE3_MEDIARECORD_CMD_VIDEO     byte = 1\n\tARCOMMANDS_ID_ARDRONE3_MEDIARECORD_CMD_PICTUREV2 byte = 2\n\tARCOMMANDS_ID_ARDRONE3_MEDIARECORD_CMD_VIDEOV2   byte = 3\n\tARCOMMANDS_ID_ARDRONE3_MEDIARECORD_CMD_MAX       byte = 4\n\n\t// eARCOMMANDS_ARDRONE3_MEDIARECORD_VIDEO_RECORD\n\tARCOMMANDS_ARDRONE3_MEDIARECORD_VIDEO_RECORD_STOP  byte = 0\n\tARCOMMANDS_ARDRONE3_MEDIARECORD_VIDEO_RECORD_START byte = 1\n\tARCOMMANDS_ARDRONE3_MEDIARECORD_VIDEO_RECORD_MAX   byte = 2\n\n\t// eARCOMMANDS_ID_COMMON_COMMON_CMD\n\tARCOMMANDS_ID_COMMON_COMMON_CMD_ALLSTATES   byte = 0\n\tARCOMMANDS_ID_COMMON_COMMON_CMD_CURRENTDATE byte = 1\n\tARCOMMANDS_ID_COMMON_COMMON_CMD_CURRENTTIME byte = 2\n\tARCOMMANDS_ID_COMMON_COMMON_CMD_REBOOT      byte = 3\n\tARCOMMANDS_ID_COMMON_COMMON_CMD_MAX         byte = 4\n\n\t// eARCOMMANDS_ID_COMMON_COMMONSTATE_CMD;\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_ALLSTATESCHANGED                    byte = 0\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_BATTERYSTATECHANGED                 byte = 1\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_MASSSTORAGESTATELISTCHANGED         byte = 2\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_MASSSTORAGEINFOSTATELISTCHANGED     byte = 3\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_CURRENTDATECHANGED                  byte = 4\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_CURRENTTIMECHANGED                  byte = 5\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_MASSSTORAGEINFOREMAININGLISTCHANGED byte = 6\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_WIFISIGNALCHANGED                   byte = 6\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_SENSORSSTATESLISTCHANGED            byte = 7\n\tARCOMMANDS_ID_COMMON_COMMONSTATE_CMD_MAX                                 byte = 8\n\n\t// eARMEDIA_ENCAPSULER_CODEC\n\tCODEC_UNKNNOWN     byte = 0\n\tCODEC_VLIB         byte = 1\n\tCODEC_P264         byte = 2\n\tCODEC_MPEG4_VISUAL byte = 3\n\tCODEC_MPEG4_AVC    byte = 4\n\tCODEC_MOTION_JPEG  byte = 5\n\n\t// eARMEDIA_ENCAPSULER_FRAME_TYPE;\n\tARMEDIA_ENCAPSULER_FRAME_TYPE_UNKNNOWN byte = 0\n\tARMEDIA_ENCAPSULER_FRAME_TYPE_I_FRAME  byte = 1\n\tARMEDIA_ENCAPSULER_FRAME_TYPE_P_FRAME  byte = 2\n\tARMEDIA_ENCAPSULER_FRAME_TYPE_JPEG     byte = 3\n\tARMEDIA_ENCAPSULER_FRAME_TYPE_MAX      byte = 4\n\n\t// eARNETWORK_MANAGER_INTERNAL_BUFFER_ID\n\tARNETWORK_MANAGER_INTERNAL_BUFFER_ID_PING byte = 0\n\tARNETWORK_MANAGER_INTERNAL_BUFFER_ID_PONG byte = 1\n\tARNETWORK_MANAGER_INTERNAL_BUFFER_ID_MAX  byte = 3\n\n\t// eARNETWORKAL_FRAME_TYPE\n\tARNETWORKAL_FRAME_TYPE_UNINITIALIZED    byte = 0\n\tARNETWORKAL_FRAME_TYPE_ACK              byte = 1\n\tARNETWORKAL_FRAME_TYPE_DATA             byte = 2\n\tARNETWORKAL_FRAME_TYPE_DATA_LOW_LATENCY byte = 3\n\tARNETWORKAL_FRAME_TYPE_DATA_WITH_ACK    byte = 4\n\tARNETWORKAL_FRAME_TYPE_MAX              byte = 5\n\n\tARCOMMANDS_ID_ARDRONE3_SPEEDSETTINGS_CMD_MAXVERTICALSPEED byte = 0\n\tARCOMMANDS_ID_ARDRONE3_SPEEDSETTINGS_CMD_MAXROTATIONSPEED byte = 1\n\tARCOMMANDS_ID_ARDRONE3_SPEEDSETTINGS_CMD_HULLPROTECTION   byte = 2\n\tARCOMMANDS_ID_ARDRONE3_SPEEDSETTINGS_CMD_OUTDOOR          byte = 3\n\n\tARCOMMANDS_ID_ARDRONE3_MEDIASTREAMING_CMD_VIDEOENABLE     byte = 0\n\tARCOMMANDS_ID_ARDRONE3_MEDIASTREAMING_CMD_VIDEOSTREAMMODE byte = 1\n)\n"
  },
  {
    "path": "platforms/parrot/bebop/client/examples/ff.conf",
    "content": "Port            8090\nBindAddress     0.0.0.0\nMaxClients      1000\nMaxBandWidth    50000\nCustomLog       -\nNoDaemon\n\n\n<Feed bebop.ffm>\n  File            /tmp/bebop.ffm\n  FileMaxSize     20M\n</Feed>\n\n\n<Stream bebop.mjpeg>\n  Feed bebop.ffm\n  Format mpjpeg\n  VideoFrameRate 14\n  VideoSize 640x368\n  VideoQMin 3\n  VideoQMax 31\n  NoAudio\n  Strict -1\n  ACL allow 192.168.0.0 192.168.255.255\n  ACL allow localhost\n  ACL allow 127.0.0.1\n</Stream>\n"
  },
  {
    "path": "platforms/parrot/bebop/client/examples/takeoff.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2/platforms/parrot/bebop/client\"\n)\n\nfunc main() {\n\tbebop := client.New()\n\n\tif err := bebop.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tif err := bebop.HullProtection(true); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"takeoff\")\n\tif err := bebop.TakeOff(); err != nil {\n\t\tfmt.Println(err)\n\t\tfmt.Println(\"fail\")\n\t\treturn\n\t}\n\ttime.Sleep(5 * time.Second)\n\tfmt.Println(\"land\")\n\tif err := bebop.Land(); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\ttime.Sleep(5 * time.Second)\n\tfmt.Println(\"done\")\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/client/examples/video.go",
    "content": "//go:build example\n// +build example\n\n//\n// Do not build by default.\n\n/*\nThis example will connect to the Bebop and stream its video to a webpage\nvia ffserver. This requires you to have both ffmpeg and ffserver installed\non your computer.\n\nIn order to run this example you will first need to  start ffserver with:\n\n\t$ ffserver -f ff.conf\n\nthen in a separate terminal run this program:\n\n\t$ go run video.go\n\nYou will then be able to view the video feed by navigation to\nhttp://localhost:8090/bebop.mjpeg in a web browser. *NOTE* firefox works\nbest for viewing the video feed.\n*/\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os/exec\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2/platforms/parrot/bebop/client\"\n)\n\nfunc main() {\n\tbebop := client.New()\n\n\tif err := bebop.Connect(); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tif err := bebop.VideoEnable(true); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tif err := bebop.VideoStreamMode(0); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tffmpeg := exec.Command(\"ffmpeg\", \"-i\", \"pipe:0\", \"http://localhost:8090/bebop.ffm\")\n\n\tffmpegErr, err := ffmpeg.StderrPipe()\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tffmpegIn, err := ffmpeg.StdinPipe()\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tif err := ffmpeg.Start(); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\tbuf, err := io.ReadAll(ffmpegErr)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\tif len(buf) > 0 {\n\t\t\t\tfmt.Println(string(buf))\n\t\t\t}\n\t\t}\n\t}()\n\n\tgo func() {\n\t\tfor {\n\t\t\tif _, err := ffmpegIn.Write(<-bebop.Video()); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t}\n\t}()\n\n\ttime.Sleep(99 * time.Second)\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/client/networkframegenerator.go",
    "content": "package client\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"sync\"\n)\n\ntype nwFrameGenerator struct {\n\tseq   map[byte]byte\n\thlen  int\n\tmutex *sync.Mutex\n}\n\nfunc newNetworkFrameGenerator() *nwFrameGenerator {\n\tnwg := nwFrameGenerator{\n\t\tseq:   make(map[byte]byte), // each frame id has it's own sequence number\n\t\thlen:  7,                   // size of ARNETWORKAL_Frame_t header\n\t\tmutex: &sync.Mutex{},\n\t}\n\treturn &nwg\n}\n\n// generate the \"NetworkFrame\" as bytes buffer\nfunc (nwg *nwFrameGenerator) generate(cmd *bytes.Buffer, frameType byte, id byte) *bytes.Buffer {\n\tnwg.mutex.Lock()\n\tdefer nwg.mutex.Unlock()\n\n\t// func networkFrameGenerator() func(*bytes.Buffer, byte, byte) NetworkFrame {\n\t//\n\t// ARNETWORKAL_Frame_t\n\t//\n\t// uint8  type  - frame type ARNETWORK_FRAME_TYPE\n\t// uint8  id    - identifier of the buffer sending the frame\n\t// uint8  seq   - sequence number of the frame\n\t// uint32 size  - size of the frame\n\t//\n\n\tif _, ok := nwg.seq[id]; !ok {\n\t\tnwg.seq[id] = 0\n\t}\n\n\tnwg.seq[id]++ // automatically rollover to 0 when > 255 is fine\n\n\tret := &bytes.Buffer{}\n\tret.WriteByte(frameType)\n\tret.WriteByte(id)\n\tret.WriteByte(nwg.seq[id])\n\n\tsize := &bytes.Buffer{}\n\t//nolint:gosec // TODO: fix later\n\tif err := binary.Write(size, binary.LittleEndian, uint32(cmd.Len()+nwg.hlen)); err != nil {\n\t\tpanic(err)\n\t}\n\n\tret.Write(size.Bytes())\n\tret.Write(cmd.Bytes())\n\n\treturn ret\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/doc.go",
    "content": "/*\nPackage bebop provides the Gobot adaptor and driver for the Parrot Bebop.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nFor more information refer to the bebop README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/parrot/bebop/README.md\n*/\npackage bebop // import \"gobot.io/x/gobot/v2/platforms/parrot/bebop\"\n"
  },
  {
    "path": "platforms/parrot/bebop/pitch.go",
    "content": "package bebop\n\nimport \"math\"\n\n// ValidatePitch helps validate pitch values such as those created by\n// a joystick to values between 0-100 that are required as\n// params to Parrot Bebop PCMDs\nfunc ValidatePitch(data float64, offset float64) int {\n\tvalue := math.Abs(data) / offset\n\tif value >= 0.1 {\n\t\tif value <= 1.0 {\n\t\t\treturn int((float64(int(value*100)) / 100) * 100)\n\t\t}\n\t\treturn 100\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/pitch_test.go",
    "content": "package bebop\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestBebopValidatePitchWhenEqualOffset(t *testing.T) {\n\tassert.Equal(t, 100, ValidatePitch(32767.0, 32767.0))\n}\n\nfunc TestBebopValidatePitchWhenTiny(t *testing.T) {\n\tassert.Equal(t, 0, ValidatePitch(1.1, 32767.0))\n}\n\nfunc TestBebopValidatePitchWhenCentered(t *testing.T) {\n\tassert.Equal(t, 50, ValidatePitch(16383.5, 32767.0))\n}\n"
  },
  {
    "path": "platforms/parrot/bebop/test_helper.go",
    "content": "package bebop\n\ntype testDrone struct{}\n\nfunc (t testDrone) TakeOff() error                    { return nil }\nfunc (t testDrone) Land() error                       { return nil }\nfunc (t testDrone) Up(n int) error                    { return nil }\nfunc (t testDrone) Down(n int) error                  { return nil }\nfunc (t testDrone) Left(n int) error                  { return nil }\nfunc (t testDrone) Right(n int) error                 { return nil }\nfunc (t testDrone) Forward(n int) error               { return nil }\nfunc (t testDrone) Backward(n int) error              { return nil }\nfunc (t testDrone) Clockwise(n int) error             { return nil }\nfunc (t testDrone) CounterClockwise(n int) error      { return nil }\nfunc (t testDrone) Stop() error                       { return nil }\nfunc (t testDrone) Connect() error                    { return nil }\nfunc (t testDrone) Video() chan []byte                { return nil }\nfunc (t testDrone) StartRecording() error             { return nil }\nfunc (t testDrone) StopRecording() error              { return nil }\nfunc (t testDrone) HullProtection(protect bool) error { return nil }\nfunc (t testDrone) Outdoor(outdoor bool) error        { return nil }\nfunc (t testDrone) VideoEnable(enable bool) error     { return nil }\nfunc (t testDrone) VideoStreamMode(mode int8) error   { return nil }\n"
  },
  {
    "path": "platforms/parrot/minidrone/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/parrot/minidrone/README.md",
    "content": "# Parrot Minidrone\n\nThe Parrot Minidrones are very inexpensive drones that are controlled using Bluetooth LE aka Bluetooth 4.0.\n\nModels that are known to work with this package include:\n\n- Parrot Rolling Spider\n- Parrot Airborne Cargo Mars\n- Parrot Airborne Cargo Travis\n- Parrot Mambo\n\nModels that should work now, but have not been tested by us:\n\n- Parrot Airborne Night Swat\n- Parrot Airborne Night Maclane\n- Parrot Airborne Night Blaze\n- Parrot HYDROFOIL Orak\n- Parrot HYDROFOIL NewZ\n\nModels that will require additional work for compatibility:\n\n- Parrot Swing\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n  \"gobot.io/x/gobot/v2/drivers/ble/parrot\"\n)\n\nfunc main() {\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n  drone := parrot.NewMinidroneDriver(bleAdaptor)\n\n  work := func() {\n    drone.On(minidrone.Battery, func(data interface{}) {\n      fmt.Printf(\"battery: %d\\n\", data)\n    })\n\n    drone.On(minidrone.FlightStatus, func(data interface{}) {\n      fmt.Printf(\"flight status: %d\\n\", data)\n    })\n\n    drone.On(minidrone.Takeoff, func(data interface{}) {\n      fmt.Println(\"taking off...\")\n    })\n\n    drone.On(minidrone.Hovering, func(data interface{}) {\n      fmt.Println(\"hovering!\")\n      gobot.After(5*time.Second, func() {\n        drone.Land()\n      })\n    })\n\n    drone.On(minidrone.Landing, func(data interface{}) {\n      fmt.Println(\"landing...\")\n    })\n\n    drone.On(minidrone.Landed, func(data interface{}) {\n      fmt.Println(\"landed.\")\n    })\n\n    time.Sleep(1000 * time.Millisecond)\n    drone.TakeOff()\n  }\n\n  robot := gobot.NewRobot(\"minidrone\",\n    []gobot.Connection{bleAdaptor},\n    []gobot.Device{drone},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## How to Connect\n\nThe Parrot Minidrones are Bluetooth LE devices.\n\nYou need to know the BLE ID or name of the Minidrone you want to connect to. The Gobot BLE client adaptor also lets you\nconnect by friendly name, aka \"RS_1234\".\n\n### OSX\n\nTo run any of the Gobot BLE code you must use the `GODEBUG=cgocheck=0` flag in order to get around some of the issues in\nthe CGo-based implementation.\n\nIf you connect by name, then you do not need to worry about the Bluetooth LE ID. However, if you want to connect by ID,\nOS X uses its own Bluetooth ID system which is different from the IDs used on Linux. The code calls thru the XPC interfaces\nprovided by OSX, so as a result does not need to run under sudo.\n\nFor example:\n\n`GODEBUG=cgocheck=0 go run examples/minidrone.go RS_1234`\n\n### Ubuntu\n\nOn Linux the BLE code will need to run as a root user account. The easiest way to accomplish this is probably to use\n`go build` to build your program, and then to run the requesting executable using `sudo`.\n\nFor example:\n\n```sh\ngo build examples/minidrone.go\nsudo ./minidrone RS_1234\n```\n\n### Windows\n\nHopefully coming soon...\n"
  },
  {
    "path": "platforms/parrot/minidrone/doc.go",
    "content": "/*\nPackage minidrone contains the Gobot driver for the Parrot Minidrone.\n\nFor more information refer to the minidrone README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/parrot/minidrone/README.md\n*/\npackage minidrone // import \"gobot.io/x/gobot/v2/drivers/ble/parrot\"\n"
  },
  {
    "path": "platforms/parrot/parrot.go",
    "content": "/*\nPackage parrot contains Gobot adaptors and drivers for the Parrot drones\n\nThis package currently supports the following Parrot drones:\n- Parrot Minidrone\n- Intel Joule developer kit\n\nFor further information refer to Parrot README:\nhttps://gobot.io/x/gobot/v2/blob/release/platforms/parrot/README.md\n*/\npackage parrot\n"
  },
  {
    "path": "platforms/particle/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/particle/README.md",
    "content": "# Particle\n\nThe Particle Photon and Particle Electron are connected microcontrollers from Particle (<http://particle.io>), the company\nformerly known as Spark Devices. The Photon uses a Wi-Fi connection to the Particle cloud, and the Electron uses a\n3G wireless connection. Once the Photon or Electron connects to the network, it automatically connects with a central server\n(the \"Particle Cloud\") and stays connected so it can be controlled from external systems, such as a Gobot program. To run\nGobot programs please make sure you are running default Tinker firmware on the Photon or Electron.\n\nFor more info about the Particle platform go to <https://www.particle.io/>\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/gpio\"\n  \"gobot.io/x/gobot/v2/platforms/particle\"\n)\n\nfunc main() {\n  core := particle.NewAdaptor(\"device_id\", \"access_token\")\n  led := gpio.NewLedDriver(core, \"D7\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"spark\",\n    []gobot.Connection{core},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n"
  },
  {
    "path": "platforms/particle/adaptor.go",
    "content": "package particle\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\n\t\"github.com/donovanhide/eventsource\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// Adaptor is the Gobot Adaptor for Particle\ntype Adaptor struct {\n\tgobot.Eventer\n\n\tname        string\n\tDeviceID    string\n\tAccessToken string\n\tAPIServer   string\n\tservoPins   map[string]bool\n}\n\n// Event is an event emitted by the Particle cloud\ntype Event struct {\n\tName  string\n\tData  string\n\tError error\n}\n\nvar eventSource = func(url string) (chan eventsource.Event, chan error, error) {\n\tstream, err := eventsource.Subscribe(url, \"\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn stream.Events, stream.Errors, nil\n}\n\n// NewAdaptor creates new Photon adaptor with deviceId and accessToken\n// using api.particle.io server as default\nfunc NewAdaptor(deviceID string, accessToken string) *Adaptor {\n\treturn &Adaptor{\n\t\tname:        gobot.DefaultName(\"Particle\"),\n\t\tDeviceID:    deviceID,\n\t\tAccessToken: accessToken,\n\t\tservoPins:   make(map[string]bool),\n\t\tAPIServer:   \"https://api.particle.io\",\n\t\tEventer:     gobot.NewEventer(),\n\t}\n}\n\n// Name returns the Adaptor name\nfunc (s *Adaptor) Name() string { return s.name }\n\n// SetName sets the Adaptor name\nfunc (s *Adaptor) SetName(n string) { s.name = n }\n\n// Connect returns true if connection to Particle Photon or Electron is successful\nfunc (s *Adaptor) Connect() error { return nil }\n\n// Finalize returns true if connection to Particle Photon or Electron is finalized successfully\nfunc (s *Adaptor) Finalize() error { return nil }\n\n// AnalogRead reads analog ping value using Particle cloud api\nfunc (s *Adaptor) AnalogRead(pin string) (int, error) {\n\tparams := url.Values{\n\t\t\"params\":       {pin},\n\t\t\"access_token\": {s.AccessToken},\n\t}\n\n\turl := fmt.Sprintf(\"%v/analogread\", s.deviceURL())\n\n\tresp, err := s.request(\"POST\", url, params)\n\tif err == nil {\n\t\t//nolint:forcetypeassert // ok here\n\t\treturn int(resp[\"return_value\"].(float64)), nil\n\t}\n\n\treturn 0, err\n}\n\n// PwmWrite writes in pin using analog write api\nfunc (s *Adaptor) PwmWrite(pin string, level byte) error {\n\treturn s.AnalogWrite(pin, level)\n}\n\n// AnalogWrite writes analog pin with specified level using Particle cloud api\nfunc (s *Adaptor) AnalogWrite(pin string, level byte) error {\n\tparams := url.Values{\n\t\t\"params\":       {fmt.Sprintf(\"%v,%v\", pin, level)},\n\t\t\"access_token\": {s.AccessToken},\n\t}\n\turl := fmt.Sprintf(\"%v/analogwrite\", s.deviceURL())\n\t_, err := s.request(\"POST\", url, params)\n\treturn err\n}\n\n// DigitalWrite writes to a digital pin using Particle cloud api\nfunc (s *Adaptor) DigitalWrite(pin string, level byte) error {\n\tparams := url.Values{\n\t\t\"params\":       {fmt.Sprintf(\"%v,%v\", pin, s.pinLevel(level))},\n\t\t\"access_token\": {s.AccessToken},\n\t}\n\turl := fmt.Sprintf(\"%v/digitalwrite\", s.deviceURL())\n\t_, err := s.request(\"POST\", url, params)\n\treturn err\n}\n\n// DigitalRead reads from digital pin using Particle cloud api\nfunc (s *Adaptor) DigitalRead(pin string) (int, error) {\n\tparams := url.Values{\n\t\t\"params\":       {pin},\n\t\t\"access_token\": {s.AccessToken},\n\t}\n\turl := fmt.Sprintf(\"%v/digitalread\", s.deviceURL())\n\tresp, err := s.request(\"POST\", url, params)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\treturn int(resp[\"return_value\"].(float64)), nil\n}\n\n// ServoWrite writes the 0-180 degree angle to the specified pin.\n// To use it requires installing the \"tinker-servo\" sketch on your\n// Particle device. not just the default \"tinker\".\nfunc (s *Adaptor) ServoWrite(pin string, angle byte) error {\n\tif _, present := s.servoPins[pin]; !present {\n\t\tif err := s.servoPinOpen(pin); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tparams := url.Values{\n\t\t\"params\":       {fmt.Sprintf(\"%v,%v\", pin, angle)},\n\t\t\"access_token\": {s.AccessToken},\n\t}\n\turl := fmt.Sprintf(\"%v/servoSet\", s.deviceURL())\n\t_, err := s.request(\"POST\", url, params)\n\treturn err\n}\n\n// EventStream returns a gobot.Event based on the following params:\n//\n// * source - \"all\"/\"devices\"/\"device\" (More info at: http://docs.particle.io/api/#reading-data-from-a-core-events)\n// * name  - Event name to subscribe for, leave blank to subscribe to all events.\n//\n// A new event is emitted as a particle.Event struct\nfunc (s *Adaptor) EventStream(source string, name string) (*gobot.Event, error) {\n\tvar url string\n\n\tswitch source {\n\tcase \"all\":\n\t\turl = fmt.Sprintf(\"%s/v1/events/%s?access_token=%s\", s.APIServer, name, s.AccessToken)\n\tcase \"devices\":\n\t\turl = fmt.Sprintf(\"%s/v1/devices/events/%s?access_token=%s\", s.APIServer, name, s.AccessToken)\n\tcase \"device\":\n\t\turl = fmt.Sprintf(\"%s/events/%s?access_token=%s\", s.deviceURL(), name, s.AccessToken)\n\tdefault:\n\t\treturn nil, errors.New(\"source param should be: all, devices or device\")\n\t}\n\n\tevents, _, err := eventSource(url)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\tev := <-events\n\t\t\tif ev.Event() != \"\" && ev.Data() != \"\" {\n\t\t\t\ts.Publish(ev.Event(), ev.Data())\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn nil, nil //nolint:nilnil // seems ok here\n}\n\n// Variable returns a core variable value as a string\nfunc (s *Adaptor) Variable(name string) (string, error) {\n\turl := fmt.Sprintf(\"%v/%s?access_token=%s\", s.deviceURL(), name, s.AccessToken)\n\tresp, err := s.request(\"GET\", url, nil)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tvar result string\n\tswitch val := resp[\"result\"].(type) {\n\tcase bool:\n\t\tresult = strconv.FormatBool(val)\n\tcase float64:\n\t\tresult = strconv.FormatFloat(val, 'f', -1, 64)\n\tcase string:\n\t\tresult = val\n\t}\n\n\treturn result, nil\n}\n\n// Function executes a core function and\n// returns value from request.\n// Takes a String as the only argument and returns an Int.\n// If function is not defined in core, it will time out\nfunc (s *Adaptor) Function(name string, args string) (int, error) {\n\tparams := url.Values{\n\t\t\"args\":         {args},\n\t\t\"access_token\": {s.AccessToken},\n\t}\n\n\turl := fmt.Sprintf(\"%s/%s\", s.deviceURL(), name)\n\tresp, err := s.request(\"POST\", url, params)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\t//nolint:forcetypeassert // ok here\n\treturn int(resp[\"return_value\"].(float64)), nil\n}\n\n// setAPIServer sets Particle cloud api server, this can be used to change from default api.spark.io\nfunc (s *Adaptor) setAPIServer(server string) {\n\ts.APIServer = server\n}\n\n// deviceURL constructs device url to make requests from Particle cloud api\nfunc (s *Adaptor) deviceURL() string {\n\tif len(s.APIServer) == 0 {\n\t\ts.setAPIServer(\"https://api.particle.io\")\n\t}\n\treturn fmt.Sprintf(\"%v/v1/devices/%v\", s.APIServer, s.DeviceID)\n}\n\n// pinLevel converts byte level to string expected in api\nfunc (s *Adaptor) pinLevel(level byte) string {\n\tif level == 1 {\n\t\treturn \"HIGH\"\n\t}\n\treturn \"LOW\"\n}\n\n// request makes request to Particle cloud server, return err != nil if there is\n// any issue with the request.\n//\n//nolint:bodyclose,noctx // not changed yet\nfunc (s *Adaptor) request(method string, url string, params url.Values) (map[string]interface{}, error) {\n\tvar resp *http.Response\n\tvar err error\n\tswitch method {\n\tcase \"POST\":\n\t\tresp, err = http.PostForm(url, params) //nolint:gosec // accepted, because local function and no exposed routing\n\tcase \"GET\":\n\t\tresp, err = http.Get(url) //nolint:gosec // accepted, because local function and no exposed routing\n\t}\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbuf, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar m map[string]interface{}\n\tif err := json.Unmarshal(buf, &m); err != nil {\n\t\treturn m, err\n\t}\n\n\tif resp.Status != \"200 OK\" {\n\t\treturn m, fmt.Errorf(\"%v: error communicating to the Particle cloud\", resp.Status)\n\t}\n\n\tif _, ok := m[\"error\"]; ok {\n\t\t//nolint:forcetypeassert // ok here\n\t\treturn m, errors.New(m[\"error\"].(string))\n\t}\n\n\treturn m, nil\n}\n\nfunc (s *Adaptor) servoPinOpen(pin string) error {\n\tparams := url.Values{\n\t\t\"params\":       {pin},\n\t\t\"access_token\": {s.AccessToken},\n\t}\n\turl := fmt.Sprintf(\"%v/servoOpen\", s.deviceURL())\n\t_, err := s.request(\"POST\", url, params)\n\tif err != nil {\n\t\treturn err\n\t}\n\ts.servoPins[pin] = true\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/particle/adaptor_test.go",
    "content": "package particle\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"net/url\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/donovanhide/eventsource\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// HELPERS\n\nfunc createTestServer(handler func(w http.ResponseWriter, r *http.Request)) *httptest.Server {\n\treturn httptest.NewServer(http.HandlerFunc(handler))\n}\n\nfunc getDummyResponseForPath(t *testing.T, path string, dummyResponse string) *httptest.Server {\n\tt.Helper()\n\n\tdummyData := []byte(dummyResponse)\n\n\treturn createTestServer(func(w http.ResponseWriter, r *http.Request) {\n\t\t//nolint:testifylint // TODO: fix later\n\t\trequire.Equal(t, \"/v1/devices\"+path, r.URL.Path)\n\n\t\t_, _ = w.Write(dummyData)\n\t})\n}\n\nfunc getDummyResponseForPathWithParams(\n\tt *testing.T,\n\tpath string,\n\tparams []string,\n\tdummyResponse string,\n) *httptest.Server {\n\tt.Helper()\n\n\tdummyData := []byte(dummyResponse)\n\n\treturn createTestServer(func(w http.ResponseWriter, r *http.Request) {\n\t\t//nolint:testifylint // TODO: fix later\n\t\trequire.Equal(t, \"/v1/devices\"+path, r.URL.Path)\n\n\t\t_ = r.ParseForm()\n\n\t\tfor key, value := range params {\n\t\t\tif r.Form[\"params\"][key] != value {\n\t\t\t\tt.Error(\"Expected param to be \" + r.Form[\"params\"][key] + \" but was \" + value)\n\t\t\t}\n\t\t}\n\t\t_, _ = w.Write(dummyData)\n\t})\n}\n\nfunc initTestAdaptor() *Adaptor {\n\treturn NewAdaptor(\"myDevice\", \"token\")\n}\n\nfunc initTestAdaptorWithServo() *Adaptor {\n\ta := NewAdaptor(\"myDevice\", \"token\")\n\ta.servoPins[\"1\"] = true\n\treturn a\n}\n\n// TESTS\n\nfunc TestAdaptor(t *testing.T) {\n\tvar a interface{} = initTestAdaptor()\n\t_, ok := a.(gobot.Adaptor)\n\tif !ok {\n\t\trequire.Fail(t, \"Adaptor{} should be a gobot.Adaptor\")\n\t}\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// does it return a pointer to an instance of Adaptor?\n\tvar a interface{} = initTestAdaptor()\n\tcore, ok := a.(*Adaptor)\n\tif !ok {\n\t\trequire.Fail(t, \"NewAdaptor() should have returned a *Adaptor\")\n\t}\n\n\tassert.Equal(t, \"https://api.particle.io\", core.APIServer)\n\tassert.True(t, strings.HasPrefix(core.Name(), \"Particle\"))\n\n\tcore.SetName(\"sparkie\")\n\tassert.Equal(t, \"sparkie\", core.Name())\n}\n\nfunc TestAdaptorConnect(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.Connect())\n}\n\nfunc TestAdaptorFinalize(t *testing.T) {\n\ta := initTestAdaptor()\n\t_ = a.Connect()\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestAdaptorAnalogRead(t *testing.T) {\n\t// When no error\n\tresponse := `{\"return_value\": 5.2}`\n\tparams := []string{\"A1\"}\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/analogread\", params, response)\n\n\ta.setAPIServer(testServer.URL)\n\tdefer testServer.Close()\n\n\tval, _ := a.AnalogRead(\"A1\")\n\tassert.Equal(t, 5, val)\n}\n\nfunc TestAdaptorAnalogReadError(t *testing.T) {\n\ta := initTestAdaptor()\n\t// When error\n\ttestServer := createTestServer(func(w http.ResponseWriter, r *http.Request) {\n\t\thttp.NotFound(w, r)\n\t})\n\tdefer testServer.Close()\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ := a.AnalogRead(\"A1\")\n\tassert.Equal(t, 0, val)\n}\n\nfunc TestAdaptorPwmWrite(t *testing.T) {\n\tresponse := `{}`\n\tparams := []string{\"A1,1\"}\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/analogwrite\", params, response)\n\tdefer testServer.Close()\n\n\ta.setAPIServer(testServer.URL)\n\t_ = a.PwmWrite(\"A1\", 1)\n}\n\nfunc TestAdaptorAnalogWrite(t *testing.T) {\n\tresponse := `{}`\n\tparams := []string{\"A1,1\"}\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/analogwrite\", params, response)\n\tdefer testServer.Close()\n\n\ta.setAPIServer(testServer.URL)\n\t_ = a.AnalogWrite(\"A1\", 1)\n}\n\nfunc TestAdaptorDigitalWrite(t *testing.T) {\n\t// When HIGH\n\tresponse := `{}`\n\tparams := []string{\"D7,HIGH\"}\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/digitalwrite\", params, response)\n\n\ta.setAPIServer(testServer.URL)\n\t_ = a.DigitalWrite(\"D7\", 1)\n\n\ttestServer.Close()\n\t// When LOW\n\tparams = []string{\"D7,LOW\"}\n\n\ttestServer = getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/digitalwrite\", params, response)\n\tdefer testServer.Close()\n\n\ta.setAPIServer(testServer.URL)\n\t_ = a.DigitalWrite(\"D7\", 0)\n}\n\nfunc TestAdaptorServoOpen(t *testing.T) {\n\tresponse := `{}`\n\tparams := []string{\"1\"}\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/servoOpen\", params, response)\n\tdefer testServer.Close()\n\n\ta.setAPIServer(testServer.URL)\n\t_ = a.servoPinOpen(\"1\")\n}\n\nfunc TestAdaptorServoWrite(t *testing.T) {\n\tresponse := `{}`\n\tparams := []string{\"1,128\"}\n\n\ta := initTestAdaptorWithServo()\n\ttestServer := getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/servoSet\", params, response)\n\tdefer testServer.Close()\n\n\ta.setAPIServer(testServer.URL)\n\t_ = a.ServoWrite(\"1\", 128)\n}\n\nfunc TestAdaptorDigitalRead(t *testing.T) {\n\t// When HIGH\n\tresponse := `{\"return_value\": 1}`\n\tparams := []string{\"D7\"}\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/digitalread\", params, response)\n\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ := a.DigitalRead(\"D7\")\n\tassert.Equal(t, 1, val)\n\ttestServer.Close()\n\n\t// When LOW\n\tresponse = `{\"return_value\": 0}`\n\n\ttestServer = getDummyResponseForPathWithParams(t, \"/\"+a.DeviceID+\"/digitalread\", params, response)\n\n\ta.setAPIServer(testServer.URL)\n\tdefer testServer.Close()\n\n\tval, _ = a.DigitalRead(\"D7\")\n\tassert.Equal(t, 0, val)\n}\n\nfunc TestAdaptorDigitalReadError(t *testing.T) {\n\ta := initTestAdaptor()\n\t// When error\n\ttestServer := createTestServer(func(w http.ResponseWriter, r *http.Request) {\n\t\thttp.NotFound(w, r)\n\t})\n\tdefer testServer.Close()\n\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ := a.DigitalRead(\"D7\")\n\tassert.Equal(t, -1, val)\n}\n\nfunc TestAdaptorFunction(t *testing.T) {\n\tresponse := `{\"return_value\": 1}`\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPath(t, \"/\"+a.DeviceID+\"/hello\", response)\n\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ := a.Function(\"hello\", \"100,200\")\n\tassert.Equal(t, 1, val)\n\ttestServer.Close()\n\n\t// When not existent\n\tresponse = `{\"ok\": false, \"error\": \"timeout\"}`\n\ttestServer = getDummyResponseForPath(t, \"/\"+a.DeviceID+\"/hello\", response)\n\n\ta.setAPIServer(testServer.URL)\n\n\t_, err := a.Function(\"hello\", \"\")\n\trequire.ErrorContains(t, err, \"timeout\")\n\n\ttestServer.Close()\n}\n\nfunc TestAdaptorVariable(t *testing.T) {\n\t// When String\n\tresponse := `{\"result\": \"1\"}`\n\n\ta := initTestAdaptor()\n\ttestServer := getDummyResponseForPath(t, \"/\"+a.DeviceID+\"/variable_name\", response)\n\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ := a.Variable(\"variable_name\")\n\tassert.Equal(t, \"1\", val)\n\ttestServer.Close()\n\n\t// When float\n\tresponse = `{\"result\": 1.1}`\n\ttestServer = getDummyResponseForPath(t, \"/\"+a.DeviceID+\"/variable_name\", response)\n\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ = a.Variable(\"variable_name\")\n\tassert.Equal(t, \"1.1\", val)\n\ttestServer.Close()\n\n\t// When int\n\tresponse = `{\"result\": 1}`\n\ttestServer = getDummyResponseForPath(t, \"/\"+a.DeviceID+\"/variable_name\", response)\n\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ = a.Variable(\"variable_name\")\n\tassert.Equal(t, \"1\", val)\n\ttestServer.Close()\n\n\t// When bool\n\tresponse = `{\"result\": true}`\n\ttestServer = getDummyResponseForPath(t, \"/\"+a.DeviceID+\"/variable_name\", response)\n\n\ta.setAPIServer(testServer.URL)\n\n\tval, _ = a.Variable(\"variable_name\")\n\tassert.Equal(t, \"true\", val)\n\ttestServer.Close()\n\n\t// When not existent\n\tresponse = `{\"ok\": false, \"error\": \"Variable not found\"}`\n\ttestServer = getDummyResponseForPath(t, \"/\"+a.DeviceID+\"/not_existent\", response)\n\n\ta.setAPIServer(testServer.URL)\n\n\t_, err := a.Variable(\"not_existent\")\n\trequire.ErrorContains(t, err, \"Variable not found\")\n\n\ttestServer.Close()\n}\n\nfunc TestAdaptorSetAPIServer(t *testing.T) {\n\ta := initTestAdaptor()\n\tapiServer := \"new_api_server\"\n\tassert.NotEqual(t, apiServer, a.APIServer)\n\n\ta.setAPIServer(apiServer)\n\tassert.Equal(t, apiServer, a.APIServer)\n}\n\nfunc TestAdaptorDeviceURL(t *testing.T) {\n\t// When APIServer is set\n\ta := initTestAdaptor()\n\ta.setAPIServer(\"http://server\")\n\ta.DeviceID = \"devID\"\n\tassert.Equal(t, \"http://server/v1/devices/devID\", a.deviceURL())\n\n\t// When APIServer is not set\n\ta = &Adaptor{name: \"particleie\", DeviceID: \"myDevice\", AccessToken: \"token\"}\n\tassert.Equal(t, \"https://api.particle.io/v1/devices/myDevice\", a.deviceURL())\n}\n\nfunc TestAdaptorPinLevel(t *testing.T) {\n\ta := initTestAdaptor()\n\n\tassert.Equal(t, \"HIGH\", a.pinLevel(1))\n\tassert.Equal(t, \"LOW\", a.pinLevel(0))\n\tassert.Equal(t, \"LOW\", a.pinLevel(5))\n}\n\nfunc TestAdaptorPostToparticle(t *testing.T) {\n\ta := initTestAdaptor()\n\n\t// When error on request\n\tvals := url.Values{}\n\tvals.Add(\"error\", \"error\")\n\tresp, err := a.request(\"POST\", \"http://invalid%20host.com\", vals)\n\tif err == nil {\n\t\tt.Error(\"request() should return an error when request was unsuccessful but returned\", resp)\n\t}\n\n\t// When error reading body\n\t// Pending\n\n\t// When response.Status is not 200\n\ttestServer := createTestServer(func(w http.ResponseWriter, r *http.Request) {\n\t\thttp.NotFound(w, r)\n\t})\n\tdefer testServer.Close()\n\n\tresp, err = a.request(\"POST\", testServer.URL+\"/existent\", vals)\n\tif err == nil {\n\t\tt.Error(\"request() should return an error when status is not 200 but returned\", resp)\n\t}\n}\n\nfunc TestAdaptorEventStream(t *testing.T) {\n\ta := initTestAdaptor()\n\tvar url string\n\teventSource = func(u string) (chan eventsource.Event, chan error, error) {\n\t\turl = u\n\t\treturn nil, nil, nil\n\t}\n\t_, _ = a.EventStream(\"all\", \"ping\")\n\tassert.Equal(t, \"https://api.particle.io/v1/events/ping?access_token=token\", url)\n\n\t_, _ = a.EventStream(\"devices\", \"ping\")\n\tassert.Equal(t, \"https://api.particle.io/v1/devices/events/ping?access_token=token\", url)\n\n\t_, _ = a.EventStream(\"device\", \"ping\")\n\tassert.Equal(t, \"https://api.particle.io/v1/devices/myDevice/events/ping?access_token=token\", url)\n\n\t_, err := a.EventStream(\"nothing\", \"ping\")\n\trequire.ErrorContains(t, err, \"source param should be: all, devices or device\")\n\n\teventSource = func(u string) (chan eventsource.Event, chan error, error) {\n\t\treturn nil, nil, errors.New(\"error connecting sse\")\n\t}\n\n\t_, err = a.EventStream(\"devices\", \"\")\n\trequire.ErrorContains(t, err, \"error connecting sse\")\n\n\teventChan := make(chan eventsource.Event)\n\terrorChan := make(chan error)\n\n\teventSource = func(u string) (chan eventsource.Event, chan error, error) {\n\t\treturn eventChan, errorChan, nil\n\t}\n\n\t_, err = a.EventStream(\"devices\", \"\")\n\trequire.NoError(t, err)\n}\n"
  },
  {
    "path": "platforms/particle/doc.go",
    "content": "/*\nPackage particle provides the Gobot adaptor for the Particle Photon and Electron.\n\nInstalling:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\n\tpackage main\n\n\timport (\n\t\t\"time\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\t\"gobot.io/x/gobot/v2/platforms/particle\"\n\t)\n\n\tfunc main() {\n\t\tcore := paticle.NewAdaptor(\"device_id\", \"access_token\")\n\t\tled := gpio.NewLedDriver(core, \"D7\")\n\n\t\twork := func() {\n\t\t\tgobot.Every(1*time.Second, func() {\n\t\t\t\tif err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"particle\",\n\t\t\t[]gobot.Connection{core},\n\t\t\t[]gobot.Device{led},\n\t\t\twork,\n\t\t)\n\n\t\tif err := robot.Start(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\nFor further information refer to Particle readme:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/particle/README.md\n*/\npackage particle // import \"gobot.io/x/gobot/v2/platforms/particle\"\n"
  },
  {
    "path": "platforms/pebble/README.md",
    "content": "# Pebble\n\nThis repository contains the Gobot adaptor for [Pebble smart watch](http://getpebble.com/).\n\nIt uses the Pebble 2.0 SDK, and requires the 2.0 iOS or Android app, and that the [\"watchbot\" app](https://gobot.io/x/watchbot)\nhas been installed on the Pebble watch.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n* Install Pebble 2.0 iOS or Android app. (If you haven't already)\n* Follow README to install and configure \"watchbot\" on your watch: <https://gobot.io/x/watchbot>\n\n## How to Use\n\nBefore running the example, make sure configuration settings match with your program. In the example, api host is your\ncomputer IP, robot name is 'pebble' and robot api port is 8080\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/api\"\n  \"gobot.io/x/gobot/v2/platforms/pebble\"\n)\n\nfunc main() {\n  manager := gobot.NewManager()\n  api.NewAPI(manager).Start()\n\n  pebbleAdaptor := pebble.NewAdaptor()\n  watch := pebble.NewDriver(pebbleAdaptor)\n\n  work := func() {\n    watch.SendNotification(\"Hello Pebble!\")\n    watch.On(watch.Event(\"button\"), func(data interface{}) {\n      fmt.Println(\"Button pushed: \" + data.(string))\n    })\n\n    watch.On(watch.Event(\"tap\"), func(data interface{}) {\n      fmt.Println(\"Tap event detected\")\n    })\n  }\n\n  robot := gobot.NewRobot(\"pebble\",\n    []gobot.Connection{pebbleAdaptor},\n    []gobot.Device{watch},\n    work,\n  )\n\n  manager.AddRobot(robot)\n\n  if err := manager.Start(); err != nil {\n    panic(err)\n  }\n}\n\n```\n\n## Supported Features\n\n* We support event detection of 3 main pebble buttons.\n* Accelerometer events\n* Pushing data to pebble watch\n\n## Documentation\n\nWe're busy adding documentation to our web site at <http://gobot.io/> please check there as we continue to work on Gobot\n\nThank you!\n\n## Contributing\n\n* All patches must be provided under the Apache 2.0 License\n* Please use the -s option in git to \"sign off\" that the commit is your work and you are providing it under the\n  Apache 2.0 License\n* Submit a Github Pull Request to the appropriate branch and ideally discuss the changes with us in IRC.\n* We will look at the patch, test it out, and give you feedback.\n* Avoid doing minor whitespace changes, renamings, etc. along with merged content. These will be done by the maintainers\n  from time to time but they can complicate merges and should be done seperately.\n* Take care to maintain the existing coding style.\n* Add unit tests for any new or changed functionality\n* All pull requests should be \"fast forward\"\n* If there are commits after yours use “git rebase -i <new_head_branch>”\n* If you have local changes you may need to use “git stash”\n* For git help see [progit](http://git-scm.com/book) which is an awesome (and free) book on git\n\n## License\n\nCopyright (c) 2013-2018 The Hybrid Group. Licensed under the Apache 2.0 license.\n"
  },
  {
    "path": "platforms/pebble/doc.go",
    "content": "/*\nPackage pebble contains the Gobot adaptor and driver for Pebble smart watch.\n\nInstalling:\n\nIt requires the 2.x iOS or Android app, and \"watchbot\" app (https://gobot.io/x/watchbot)\ninstalled on Pebble watch. Then install running:\n\n\tPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nExample:\n\nBefore running the example, make sure configuration settings match with your program. In the example, api host is\nyour computer IP, robot name is 'pebble' and robot api port is 8080\n\n\tpackage main\n\n\timport (\n\t\t\"fmt\"\n\n\t\t\"gobot.io/x/gobot/v2\"\n\t\t\"gobot.io/x/gobot/v2/api\"\n\t\t\"gobot.io/x/gobot/v2/platforms/pebble\"\n\t)\n\n\tfunc main() {\n\t\tmanager := gobot.NewManager()\n\t\tapi.NewAPI(manager).Start()\n\n\t\tpebbleAdaptor := pebble.NewAdaptor()\n\t\twatch := pebble.NewDriver(pebbleAdaptor)\n\n\t\twork := func() {\n\t\t\twatch.SendNotification(\"Hello Pebble!\")\n\t\t\twatch.On(watch.Event(\"button\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"Button pushed: \" + data.(string))\n\t\t\t})\n\n\t\t\twatch.On(watch.Event(\"tap\"), func(data interface{}) {\n\t\t\t\tfmt.Println(\"Tap event detected\")\n\t\t\t})\n\t\t}\n\n\t\trobot := gobot.NewRobot(\"pebble\",\n\t\t\t[]gobot.Connection{pebbleAdaptor},\n\t\t\t[]gobot.Device{watch},\n\t\t\twork,\n\t\t)\n\n\t\tmanager.AddRobot(robot)\n\n\t\tif err := manager.Start(); err != nil {\n\t\tpanic(err)\n\t}\n\t}\n\nFor more information refer to the pebble README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/pebble/README.md\n*/\npackage pebble // import \"gobot.io/x/gobot/v2/platforms/pebble\"\n"
  },
  {
    "path": "platforms/pebble/pebble_adaptor.go",
    "content": "package pebble\n\ntype Adaptor struct {\n\tname string\n}\n\n// NewAdaptor creates a new pebble adaptor\nfunc NewAdaptor() *Adaptor {\n\treturn &Adaptor{\n\t\tname: \"Pebble\",\n\t}\n}\n\nfunc (a *Adaptor) Name() string     { return a.name }\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect returns true if connection to pebble is established successfully\nfunc (a *Adaptor) Connect() error {\n\treturn nil\n}\n\n// Finalize returns true if connection to pebble is finalized successfully\nfunc (a *Adaptor) Finalize() error {\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/pebble/pebble_adaptor_test.go",
    "content": "package pebble\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc initTestAdaptor() *Adaptor {\n\treturn NewAdaptor()\n}\n\nfunc TestAdaptor(t *testing.T) {\n\ta := initTestAdaptor()\n\tassert.Equal(t, \"Pebble\", a.Name())\n}\n\nfunc TestAdaptorConnect(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.Connect())\n}\n\nfunc TestAdaptorFinalize(t *testing.T) {\n\ta := initTestAdaptor()\n\trequire.NoError(t, a.Finalize())\n}\n"
  },
  {
    "path": "platforms/pebble/pebble_driver.go",
    "content": "package pebble\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype Driver struct {\n\tgobot.Commander\n\tgobot.Eventer\n\n\tname       string\n\tconnection gobot.Connection\n\tMessages   []string\n}\n\n// NewDriver creates a new pebble driver\n// Adds following events:\n//\n//\tbutton - Sent when a pebble button is pressed\n//\taccel - Pebble watch acceleromenter data\n//\ttab - When a pebble watch tap event is detected\n//\n// And the following API commands:\n//\n//\t\"publish_event\"\n//\t\"send_notification\"\n//\t\"pending_message\"\nfunc NewDriver(adaptor *Adaptor) *Driver {\n\tp := &Driver{\n\t\tname:       \"Pebble\",\n\t\tconnection: adaptor,\n\t\tMessages:   []string{},\n\t\tEventer:    gobot.NewEventer(),\n\t\tCommander:  gobot.NewCommander(),\n\t}\n\n\tp.AddEvent(\"button\")\n\tp.AddEvent(\"accel\")\n\tp.AddEvent(\"tap\")\n\n\t//nolint:forcetypeassert // ok here\n\tp.AddCommand(\"publish_event\", func(params map[string]interface{}) interface{} {\n\t\tp.PublishEvent(params[\"name\"].(string), params[\"data\"].(string))\n\t\treturn nil\n\t})\n\t//nolint:forcetypeassert // ok here\n\tp.AddCommand(\"send_notification\", func(params map[string]interface{}) interface{} {\n\t\tp.SendNotification(params[\"message\"].(string))\n\t\treturn nil\n\t})\n\n\tp.AddCommand(\"pending_message\", func(_ map[string]interface{}) interface{} {\n\t\treturn p.PendingMessage()\n\t})\n\n\treturn p\n}\nfunc (d *Driver) Name() string                 { return d.name }\nfunc (d *Driver) SetName(n string)             { d.name = n }\nfunc (d *Driver) Connection() gobot.Connection { return d.connection }\n\n// Start returns true if driver is initialized correctly\nfunc (d *Driver) Start() error { return nil }\n\n// Halt returns true if driver is halted successfully\nfunc (d *Driver) Halt() error { return nil }\n\n// PublishEvent publishes event with specified name and data in gobot\nfunc (d *Driver) PublishEvent(name string, data string) {\n\td.Publish(d.Event(name), data)\n}\n\n// SendNotification appends message to list of notifications to be sent to watch\nfunc (d *Driver) SendNotification(message string) string {\n\td.Messages = append(d.Messages, message)\n\treturn message\n}\n\n// PendingMessages returns messages to be sent as notifications to pebble\n// (Not intended to be used directly)\nfunc (d *Driver) PendingMessage() string {\n\tif len(d.Messages) < 1 {\n\t\treturn \"\"\n\t}\n\tm := d.Messages[0]\n\td.Messages = d.Messages[1:]\n\n\treturn m\n}\n"
  },
  {
    "path": "platforms/pebble/pebble_driver_test.go",
    "content": "package pebble\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Driver = (*Driver)(nil)\n\nfunc initTestDriver() *Driver {\n\treturn NewDriver(NewAdaptor())\n}\n\nfunc TestDriverStart(t *testing.T) {\n\td := initTestDriver()\n\trequire.NoError(t, d.Start())\n}\n\nfunc TestDriverHalt(t *testing.T) {\n\td := initTestDriver()\n\trequire.NoError(t, d.Halt())\n}\n\nfunc TestDriver(t *testing.T) {\n\td := initTestDriver()\n\n\tassert.Equal(t, \"Pebble\", d.Name())\n\tassert.Equal(t, \"Pebble\", d.Connection().Name())\n\n\tsem := make(chan bool)\n\td.SendNotification(\"Hello\")\n\td.SendNotification(\"World\")\n\n\tassert.Equal(t, \"Hello\", d.Messages[0])\n\tassert.Equal(t, \"Hello\", d.PendingMessage())\n\tassert.Equal(t, \"World\", d.PendingMessage())\n\tassert.Empty(t, d.PendingMessage())\n\n\t_ = d.On(d.Event(\"button\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\td.PublishEvent(\"button\", \"\")\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Button Event was not published\")\n\t}\n\n\t_ = d.On(d.Event(\"accel\"), func(data interface{}) {\n\t\tsem <- true\n\t})\n\n\td.Command(\"publish_event\")(map[string]interface{}{\"name\": \"accel\", \"data\": \"100\"})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(100 * time.Millisecond):\n\t\trequire.Fail(t, \"Accel Event was not published\")\n\t}\n\n\td.Command(\"send_notification\")(map[string]interface{}{\"message\": \"Hey buddy!\"})\n\tassert.Equal(t, \"Hey buddy!\", d.Messages[0])\n\n\tmessage := d.Command(\"pending_message\")(map[string]interface{}{})\n\tassert.Equal(t, \"Hey buddy!\", message)\n}\n"
  },
  {
    "path": "platforms/pine64/rock64/LICENSE",
    "content": "Copyright (c) 2025 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/pine64/rock64/README.md",
    "content": "# Pine ROCK64\n\nThe Pine ROCK64 is a single board SoC computer based on the Rockchip RK3328 arm64 processor. It has built-in GPIO and\nI2C interfaces. SPI is most likely not usable (not tested), because in use by the SPI FLASH 128M memory chip.\n\nFor more info about the Pine ROCK64, go to [https://pine64.org/documentation/ROCK64/](https://pine64.org/documentation/ROCK64/).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTested OS:\n\n* [armbian](https://www.armbian.com/rock64/) with Debian\n\n## Configuration steps for the OS\n\n### System access and configuration basics\n\nPlease follow the instructions of the OS provider. A ssh access is used in this guide.\n\n```sh\nssh <user>@192.168.1.xxx\n```\n\n### Enabling hardware drivers\n\nNot all drivers are enabled by default. You can have a look at the configuration file, to find out what is enabled at\nyour system:\n\n```sh\ncat /boot/armbianEnv.txt\n```\n\n```sh\nsudo apt install armbian-config\nsudo armbian-config\n```\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := rock64.NewAdaptor()\nled := gpio.NewLedDriver(r, \"7\")\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=arm64 GOOS=linux go build -o output/ examples/rock64_blink.go\n```\n\nOnce you have compiled your code, you can upload your program and execute it on the board from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp rock64_blink <user>@192.168.1.xxx:~\nssh -t <user>@192.168.1.xxx \"./rock64_blink\"\n```\n\n## Troubleshooting\n\n### I2C-0 overlay\n\nWith the armbian-config sometimes the overlays can not properly applied (different open Bugs). To ensure your overlay\nis applied have a look into your /boot/boot.cmd and search for the name of the used shell variable(s). This name needs\nto be used in your /boot/armbianEnv.txt.\n\n```sh cat /boot/boot.cmd | grep overlay_file\nfor overlay_file in ${overlays}; do\n\tif load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then\n\t\techo \"Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo\"\nfor overlay_file in ${user_overlays}; do\n\tif load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then\n\t\techo \"Applying user provided DT overlay ${overlay_file}.dtbo\"\n```\n\nIn the example above the variable is named `overlays`. So your /boot/armbianEnv.txt must contain this variable.\n\n```sh cat /boot/armbianEnv.txt | grep overlay\noverlay_prefix=rockchip\noverlays=rk3328-i2c0\n```\n\nIn some buggy versions the variable is named \"fdt_overlays\", just rename the variable in your \"armbianEnv.txt\" to match\nthe boot script.\n\nAs you can see in the boot script, the real file name is a concatenate of different variables `${overlay_prefix}-${overlay_file}.dtbo`.\nThis file must exist in the folder `${prefix}dtb/rockchip/overlay` (prefix=\"/boot/\"). So for the i2c-0 overlay:\n\n```sh ls -la /boot/dtb/rockchip/overlay/ | grep i2c0\n-rw-r--r-- 1 root root   218 Nov 25 19:15 rockchip-rk3328-i2c0.dtbo\n-rw-r--r-- 1 root root   223 Nov 25 19:15 rockchip-rk3568-hk-i2c0.dtbo\n```\n\n...means the entry in the armbianEnv.txt sould be set to \"overlays=rk3328-i2c0\".\n\nThe variable can contain a space separated list.\n\n### PWM\n\nThere are 3 PWMs on the chip (pwm0, pwm1, pwm2). Unfortunately all pins are shared with the PMIC, so i2c-1 (pwm0, pwm1)\ncan not be deactivated, because it is mandatory for the i2c communication to PMIC address 0x18. Simply an activation of\npwm0 or pwm1 with an overlay leads to the Kernel can not be loaded anymore.\n"
  },
  {
    "path": "platforms/pine64/rock64/adaptor.go",
    "content": "package rock64\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 1\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor represents a Gobot Adaptor for the PINE64 ROCK64\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex *sync.Mutex\n}\n\n// NewAdaptor creates a ROCK64 Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\tadaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior\n//\tadaptors.WithGpioDebounce(pin, period): sets the input debouncer\n//\tadaptors.WithGpioEventOnFallingEdge/RaisingEdge/BothEdges(pin, handler): activate edge detection\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser()\n\ta := &Adaptor{\n\t\tname:  gobot.DefaultName(\"ROCK64\"),\n\t\tsys:   sys,\n\t\tmutex: &sync.Mutex{},\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinDefinitions)\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions)\n\t// Valid bus numbers are [0,1] which corresponds to /dev/i2c-0, /dev/i2c-1.\n\t// We don't support \"/dev/i2c-4 DesignWare HDMI\".\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\t// Valid bus number is 0 which corresponds to /dev/spidev0.x\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, digitalPinTranslator.Translate, digitalPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board, pins and bus\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n"
  },
  {
    "path": "platforms/pine64/rock64/adaptor_test.go",
    "content": "package rock64\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := initConnectedTestAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\treturn a, fs\n}\n\nfunc initConnectedTestAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"ROCK64\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.mutex)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip1\", \"28\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"gpiochip2\", \"1\", []int{3})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 3, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip1\", \"28\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip2\", \"1\"))\n}\n\nfunc TestDigitalIOSysfs(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewAdaptor(adaptors.WithGpioSysfsAccess())\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"\", \"60\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"\", \"65\", []int{4})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 4, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"60\"))\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"65\"))\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/class/thermal/thermal_zone0/temp\"].Contents = \"567\\n\"\n\tgot, err := a.AnalogRead(\"thermal_zone0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 567, got)\n\n\t_, err = a.AnalogRead(\"thermal_zone10\")\n\trequire.ErrorContains(t, err, \"'thermal_zone10' is not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"thermal_zone0\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\trequire.NoError(t, a.DigitalWrite(\"7\", 1))\n\tdpa.UseUnexportError(\"gpiochip1\", \"28\")\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"unexport error\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, 8, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 1, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-1\"})\n\tcon, err := a.GetI2cConnection(0xff, 1)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/pine64/rock64/doc.go",
    "content": "/*\nPackage rock64 contains the Gobot adaptor for the PINE64 ROCK64.\n\nFor further information refer to the boards README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/pine64/rock64/README.md\n*/\npackage rock64 // import \"gobot.io/x/gobot/v2/platforms/pin64/rock64\"\n"
  },
  {
    "path": "platforms/pine64/rock64/pinmap.go",
    "content": "package rock64\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// notes for character device\n// sysfs: Chip*32 + (A=0, B=8, C=16) + Nr\n// tested with cdev on a ROCK64 V2.0 board: armbian Linux, OK: works, ?: unknown, NOK: not working\n// IN: works only as input, PU: if used as input, external pullup resistor needed\n// PM: pins are shared with the PMIC i2c communication (address 0x13), GPIO seems to work but problems can occur\n//\n// pin suffix:\n// \"P5\": those pins are located on the second pin header \"P5+BUS\"\n// \"SD\": those pins should be used with caution and only if eMMC is used and no SD card is inserted\n// \"M2\": those pins are used by the SPI FLASH 128M memory chip, but not blocked and maybe work, if unsure don't use it\n// \"SDA/SCL\": see PM above, should only used for i2c-1\nvar gpioPinDefinitions = adaptors.DigitalPinDefinitions{\n\t\"13\":     {Sysfs: 0, Cdev: adaptors.CdevPin{Chip: 0, Line: 0}},   // GPIO0_A0 - OK\n\t\"P5_13\":  {Sysfs: 27, Cdev: adaptors.CdevPin{Chip: 0, Line: 27}}, // GPIO0_D3_SPDIF_TX_M0 - OK\n\t\"33_SD\":  {Sysfs: 32, Cdev: adaptors.CdevPin{Chip: 1, Line: 0}},  // GPIO1_A0_SDMMC0_D0 - ?\n\t\"35_SD\":  {Sysfs: 33, Cdev: adaptors.CdevPin{Chip: 1, Line: 1}},  // GPIO1_A1_SDMMC0_D1 - ?\n\t\"37_SD\":  {Sysfs: 34, Cdev: adaptors.CdevPin{Chip: 1, Line: 2}},  // GPIO1_A2_SDMMC0_D2_JTAG_TCK - ?\n\t\"40_SD\":  {Sysfs: 35, Cdev: adaptors.CdevPin{Chip: 1, Line: 3}},  // GPIO1_A3_SDMMC0_D3_JTAG_TMS - ?\n\t\"38_SD\":  {Sysfs: 36, Cdev: adaptors.CdevPin{Chip: 1, Line: 4}},  // GPIO1_A4_SDMMC0_CMD - ?\n\t\"36_SD\":  {Sysfs: 37, Cdev: adaptors.CdevPin{Chip: 1, Line: 5}},  // GPIO1_A5_SDMMC0_DET - ?\n\t\"32_SD\":  {Sysfs: 38, Cdev: adaptors.CdevPin{Chip: 1, Line: 6}},  // GPIO1_A6_SDMMC0_CLK - ?\n\t\"7\":      {Sysfs: 60, Cdev: adaptors.CdevPin{Chip: 1, Line: 28}}, // GPIO1_D4_CLK32KOUT_M1 - OK (PU)\n\t\"8\":      {Sysfs: 64, Cdev: adaptors.CdevPin{Chip: 2, Line: 0}},  // GPIO2_A0_UART2_TX_M1 - OK (PU)\n\t\"10\":     {Sysfs: 65, Cdev: adaptors.CdevPin{Chip: 2, Line: 1}},  // GPIO2_A1_UART2_RX_M1 - OK\n\t\"12\":     {Sysfs: 67, Cdev: adaptors.CdevPin{Chip: 2, Line: 3}},  // GPIO2_A3 - IN\n\t\"27_SDA\": {Sysfs: 68, Cdev: adaptors.CdevPin{Chip: 2, Line: 4}},  // GPIO2_A4_I2C1_SDA - PM\n\t\"28_SCL\": {Sysfs: 69, Cdev: adaptors.CdevPin{Chip: 2, Line: 5}},  // GPIO2_A5_I2C1_SCL - PM\n\t\"26\":     {Sysfs: 76, Cdev: adaptors.CdevPin{Chip: 2, Line: 12}}, // GPIO2_B4_SPI_CSN1_M0 - OK\n\t\"P5_10\":  {Sysfs: 79, Cdev: adaptors.CdevPin{Chip: 2, Line: 15}}, // GPIO2_B7_I2S1_MCLK - OK (PU)\n\t\"P5_9\":   {Sysfs: 80, Cdev: adaptors.CdevPin{Chip: 2, Line: 16}}, // GPIO2_C0_I2S1_LRCKRX - OK\n\t\"P5_3\":   {Sysfs: 81, Cdev: adaptors.CdevPin{Chip: 2, Line: 17}}, // GPIO2_C1_I2S1_LRCKTX - OK\n\t\"P5_4\":   {Sysfs: 82, Cdev: adaptors.CdevPin{Chip: 2, Line: 18}}, // GPIO2_C2_I2S1_SCLK - OK (PU)\n\t\"P5_6\":   {Sysfs: 83, Cdev: adaptors.CdevPin{Chip: 2, Line: 19}}, // GPIO2_C3_I2S1_SDI - OK\n\t\"P5_12\":  {Sysfs: 84, Cdev: adaptors.CdevPin{Chip: 2, Line: 20}}, // GPIO2_C4_I2S1_SDIO1 - OK\n\t\"P5_11\":  {Sysfs: 85, Cdev: adaptors.CdevPin{Chip: 2, Line: 21}}, // GPIO2_C5_I2S1_SDIO2 - OK\n\t\"P5_14\":  {Sysfs: 86, Cdev: adaptors.CdevPin{Chip: 2, Line: 22}}, // GPIO2_C6_I2S1_SDIO3 - OK\n\t\"P5_5\":   {Sysfs: 87, Cdev: adaptors.CdevPin{Chip: 2, Line: 23}}, // GPIO2_C7_I2S1_SDO - OK\n\t\"5\":      {Sysfs: 88, Cdev: adaptors.CdevPin{Chip: 2, Line: 24}}, // GPIO2_D0_I2C0_SCL_EthernetLink (P5_22) - OK\n\t\"P5_22\":  {Sysfs: 88, Cdev: adaptors.CdevPin{Chip: 2, Line: 24}}, // GPIO2_D0_I2C0_SCL_EthernetLink (P5_22) - OK\n\t\"3\":      {Sysfs: 89, Cdev: adaptors.CdevPin{Chip: 2, Line: 25}}, // GPIO2_D1_I2C0_SDA_EthernetSpeed (P5_21) - OK\n\t\"P5_21\":  {Sysfs: 89, Cdev: adaptors.CdevPin{Chip: 2, Line: 25}}, // GPIO2_D1_I2C0_SDA_EthernetSpeed (P5_21) - OK\n\t\"23_M2\":  {Sysfs: 96, Cdev: adaptors.CdevPin{Chip: 3, Line: 0}},  // GPIO3_A0_SPI_CLK_M2 - NOK\n\t\"19_M2\":  {Sysfs: 97, Cdev: adaptors.CdevPin{Chip: 3, Line: 1}},  // GPIO3_A1_SPI_TXD_M2 - OK\n\t\"21_M2\":  {Sysfs: 98, Cdev: adaptors.CdevPin{Chip: 3, Line: 2}},  // GPIO3_A2_SPI_RXD_M2 - OK\n\t\"15\":     {Sysfs: 100, Cdev: adaptors.CdevPin{Chip: 3, Line: 4}}, // GPIO3_A4 - OK\n\t\"16\":     {Sysfs: 101, Cdev: adaptors.CdevPin{Chip: 3, Line: 5}}, // GPIO3_A5 - OK\n\t\"18\":     {Sysfs: 102, Cdev: adaptors.CdevPin{Chip: 3, Line: 6}}, // GPIO3_A6 - OK\n\t\"22\":     {Sysfs: 103, Cdev: adaptors.CdevPin{Chip: 3, Line: 7}}, // GPIO3_A7 - OK\n\t\"24_M2\":  {Sysfs: 104, Cdev: adaptors.CdevPin{Chip: 3, Line: 8}}, // GPIO3_B0_SPI_CSN0_M2 - NOK\n}\n\nvar analogPinDefinitions = adaptors.AnalogPinDefinitions{\n\t// +/-273.200 °C need >=7 characters to read: +/-273200 millidegree Celsius\n\t\"thermal_zone0\": {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n}\n"
  },
  {
    "path": "platforms/radxa/rockpi/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/radxa/rockpi/README.md",
    "content": "# Radxa Rock Pi\n\nThe [Radxa Rock Pi board series](https://wiki.radxa.com/Rock4/getting_started) are clones of the popular Raspberry Pi Single Board Computers (SBCs) with GPIO/PWM/I2C functionalities built-in.\n\nThe Gobot adaptor is currently compatible with:\n\n- Rock Pi 4\n- Rock Pi 4C+\n\nWith the possibility to expand its compatibility into past and future models.\n\nCheck out the output of `cat /proc/device-tree/model` to see which model you have if you're not sure. The 4C+ model has a Rockchip 3399_T SoC, while the regular 4 has the 3399. Both are similar, but have slightly different GPIO pin configurations.\n\n## How to Install\n\nMake sure you've installed an official Linux image from Radxa with working drivers. See the [ROCK 4 Installation Wiki](https://wiki.radxa.com/Rock4/install) for your SBC setup.\n\n> Some versions or Armbian ISOs do not detect the newer SoC chips.\n\nAs for your Gobot development, treat this as a regular Go package. It can be cross-compiled and copied over, or simply compiled on the SBC itself (tested and working with go 1.15.15 on linux/arm64, RockPi4C+).\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\nThat is, follow the **colored Pin# numbers** in the middle in the [GPIO mapping Wiki](https://wiki.radxa.com/Rock4/hardware/gpio). These have been translated for you into their corresponding underlying GPIO numbers.\n\n```go\npackage main\n\nimport (\n        \"time\"\n\n        \"gobot.io/x/gobot/v2\"\n        \"gobot.io/x/gobot/v2/drivers/gpio\"\n        \"gobot.io/x/gobot/v2/platforms/radxa/rockpi\"\n)\n\nfunc main() {\n        r := rockpi.NewAdaptor()\n        led := gpio.NewLedDriver(r, \"7\")\n\n        work := func() {\n                gobot.Every(1*time.Second, func() {\n                        if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n                })\n        }\n\n        robot := gobot.NewRobot(\"blinkBot\",\n                []gobot.Connection{r},\n                []gobot.Device{led},\n                work,\n        )\n\n        if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\nIf you want to use I2C, RockPi4 offers three I2C buses: I2C2 (pins 27, 28), I2C6 (pins 29, 31) and I2C7 (pins 3, 5) of which I2C7 is the default.\nChanging this is a matter of passing the right bus number using `i2c.WithBus`:\n\n```go\na := rockpi.NewAdaptor()\nadc2 := i2c.NewADS1115Driver(a, i2c.WithBus(6))\n```\n\nThere are mapped to `/dev/i2c-[bus]`, just like the Gobot raspi implementation.\n\n### What's currently supported?\n\n- General digital pin GPIO access works, but not through the new character device driver.\n- The I2C buses 2, 6, 7 work\n- SPI buses 1, 2 work\n\nPWM interaction is currently not yet supported.\n\nPlease see the [official Radxa Rock Pi documentation](https://wiki.radxa.com/Rockpi4/dev/libmraa) on how `librmaa` can be utilized in combination with this module, and how these work.\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```bash\n$ GOARCH=arm64 GOOS=linux go build examples/rockpi_blink.go\n```\n\nRock Pi 4s are ARM64 machines.\n"
  },
  {
    "path": "platforms/radxa/rockpi/adaptor.go",
    "content": "package rockpi\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tprocDeviceTreeModel = \"/proc/device-tree/model\"\n\n\tdefaultI2cBusNumber = 7\n\n\tdefaultSpiBusNumber  = 1\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor is the Gobot Adaptor for Radxa's Rock Pi.\ntype Adaptor struct {\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname     string\n\tmutex    sync.Mutex\n\tsys      *system.Accesser\n\trevision string\n}\n\n// NewAdaptor creates a RockPi Adaptor\n// Do not forget to enable the required overlays in /boot/hw_initfc.conf!\n// See https://wiki.radxa.com/Rockpi4/dev/libmraa\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of the default sysfs (NOT work on RockPi4C+!)\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\n// Further optional parameters for:\n//\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\ta := &Adaptor{\n\t\tname: gobot.DefaultName(\"RockPi\"),\n\t\tsys:  sys,\n\t}\n\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\t// The RockPi4 has 3 I2C buses: 2, 6, 7. See https://wiki.radxa.com/Rock4/hardware/gpio\n\t// This could change in the future with other revisions!\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{2, 6, 7})\n\t// The RockPi4 has 2 SPI buses: 1, 2. See https://wiki.radxa.com/Rock4/hardware/gpio\n\t// This could change in the future with other revisions!\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{1, 2})\n\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.getPinTranslatorFunction(), digitalPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\n\treturn a\n}\n\n// Name returns the adaptors name\nfunc (a *Adaptor) Name() string {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.name\n}\n\n// SetName sets the adaptors name\nfunc (a *Adaptor) SetName(n string) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.name = n\n}\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board and pins\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\treturn err\n}\n\nfunc (a *Adaptor) getPinTranslatorFunction() func(string) (string, int, error) {\n\treturn func(pin string) (string, int, error) {\n\t\tvar line int\n\t\tif val, ok := pins[pin][a.readRevision()]; ok {\n\t\t\tline = val\n\t\t} else if val, ok := pins[pin][\"*\"]; ok {\n\t\t\tline = val\n\t\t} else {\n\t\t\treturn \"\", 0, errors.New(\"not a valid pin\")\n\t\t}\n\t\treturn \"\", line, nil\n\t}\n}\n\nfunc (a *Adaptor) readRevision() string {\n\tif a.revision == \"\" {\n\t\tcontent, err := a.sys.ReadFile(procDeviceTreeModel)\n\t\tif err != nil {\n\t\t\treturn a.revision\n\t\t}\n\t\tmodel := string(content)\n\t\tswitch model {\n\t\tcase \"Radxa ROCK 4\":\n\t\t\ta.revision = \"4\"\n\t\tcase \"Radxa ROCK 4C+\":\n\t\t\ta.revision = \"4C+\"\n\t\tdefault:\n\t\t\ta.revision = \"4\"\n\t\t}\n\t}\n\n\treturn a.revision\n}\n"
  },
  {
    "path": "platforms/radxa/rockpi/adaptor_test.go",
    "content": "package rockpi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\t_ = a.Connect()\n\treturn a, fs\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"RockPi\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestDefaultI2cBus(t *testing.T) {\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem([]string{})\n\tassert.Equal(t, 7, a.DefaultI2cBus())\n}\n\nfunc Test_getPinTranslatorFunction(t *testing.T) {\n\tcases := map[string]struct {\n\t\tpin          string\n\t\tmodel        string\n\t\texpectedLine int\n\t\texpectedErr  error\n\t}{\n\t\t\"Rock Pi 4 specific pin\": {\n\t\t\tpin:          \"12\",\n\t\t\tmodel:        \"Radxa ROCK 4\",\n\t\t\texpectedLine: 131,\n\t\t\texpectedErr:  nil,\n\t\t},\n\t\t\"Rock Pi 4C+ specific pin\": {\n\t\t\tpin:          \"12\",\n\t\t\tmodel:        \"Radxa ROCK 4C+\",\n\t\t\texpectedLine: 91,\n\t\t\texpectedErr:  nil,\n\t\t},\n\t\t\"Generic pin\": {\n\t\t\tpin:          \"3\",\n\t\t\tmodel:        \"whatever\",\n\t\t\texpectedLine: 71,\n\t\t\texpectedErr:  nil,\n\t\t},\n\t\t\"Not a valid pin\": {\n\t\t\tpin:          \"666\",\n\t\t\tmodel:        \"whatever\",\n\t\t\texpectedLine: 0,\n\t\t\texpectedErr:  fmt.Errorf(\"not a valid pin\"),\n\t\t},\n\t}\n\n\tfor name, tc := range cases {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor()\n\t\t\tfn := a.getPinTranslatorFunction()\n\t\t\tfs := a.sys.UseMockFilesystem([]string{procDeviceTreeModel})\n\t\t\tfs.Files[procDeviceTreeModel].Contents = tc.model\n\t\t\t// act\n\t\t\tchip, line, err := fn(tc.pin)\n\t\t\t// assert\n\t\t\tassert.Empty(t, chip)\n\t\t\tassert.Equal(t, tc.expectedErr, err)\n\t\t\tassert.Equal(t, tc.expectedLine, line)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/radxa/rockpi/doc.go",
    "content": "/*\nPackage rockpi contains the Gobot adaptor for Radxa's Rock Pi Single Board Computers.\n\nFor further information refer to rockpi README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/radxa/rockpi/README.md\n*/\npackage rockpi // import \"gobot.io/x/gobot/v2/platforms/radxa/rockpi\"\n"
  },
  {
    "path": "platforms/radxa/rockpi/pinmap.go",
    "content": "package rockpi\n\n// See https://wiki.radxa.com/Rock4/hardware/gpio.\nvar pins = map[string]map[string]int{\n\t\"3\": {\n\t\t\"*\": 71,\n\t},\n\t\"5\": {\n\t\t\"*\": 72,\n\t},\n\t\"7\": {\n\t\t\"*\": 75,\n\t},\n\t\"8\": {\n\t\t\"*\": 148,\n\t},\n\t\"10\": {\n\t\t\"*\": 147,\n\t},\n\t\"11\": {\n\t\t\"*\": 146,\n\t},\n\t\"12\": {\n\t\t\"4\":   131,\n\t\t\"4C+\": 91,\n\t},\n\t\"13\": {\n\t\t\"4\":   150,\n\t\t\"4C+\": 33,\n\t},\n\t\"15\": {\n\t\t\"*\": 149,\n\t},\n\t\"16\": {\n\t\t\"*\": 154,\n\t},\n\t\"18\": {\n\t\t\"*\": 156,\n\t},\n\t\"19\": {\n\t\t\"*\": 40,\n\t},\n\t\"21\": {\n\t\t\"*\": 39,\n\t},\n\t\"22\": {\n\t\t\"*\": 157,\n\t},\n\t\"23\": {\n\t\t\"*\": 41,\n\t},\n\t\"24\": {\n\t\t\"*\": 42,\n\t},\n\t\"27\": {\n\t\t\"*\": 64,\n\t},\n\t\"28\": {\n\t\t\"*\": 65,\n\t},\n\t\"29\": {\n\t\t\"*\": 74,\n\t},\n\t\"31\": {\n\t\t\"*\": 73,\n\t},\n\t\"32\": {\n\t\t\"*\": 112,\n\t},\n\t\"33\": {\n\t\t\"*\": 76,\n\t},\n\t\"35\": {\n\t\t\"*\": 133,\n\t},\n\t\"36\": {\n\t\t\"4\":   132,\n\t\t\"4C+\": 92,\n\t},\n\t\"37\": {\n\t\t\"*\": 158,\n\t},\n\t\"38\": {\n\t\t\"4\":   134,\n\t\t\"4C+\": 36,\n\t},\n\t\"40\": {\n\t\t\"4\":   135,\n\t\t\"4C+\": 52,\n\t},\n}\n"
  },
  {
    "path": "platforms/radxa/zero/LICENSE",
    "content": "Copyright (c) 2025 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/radxa/zero/README.md",
    "content": "# Radxa Zero\n\nThe Radxa Zero is a single board SoC computer based on the Amlogic S905Y2 arm64 processor. It has built-in\nGPIO, I2C, PWM, SPI, 1-Wire and ADC interfaces.\n\nFor more info about the Radxa Zero, go to [https://docs.radxa.com/en/zero/zero](https://docs.radxa.com/en/zero/zero).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nTested OS:\n\n* [dietPi](https://dietpi.com/downloads/images/DietPi_RadxaZero-ARMv8-Bookworm.img.xz) a minimal image with Debian Bookworm\n\n## Configuration steps for the OS\n\n### WLAN access\n\nThere is no LAN network interface on the board, but WLAN is sufficient for our needs. After copy over the image to your\nSD card you can modify the file dietpi.txt before plug in the card to [make it work on first boot](https://dietpi.com/docs/usage/#how-to-do-an-automatic-base-installation-at-first-boot-dietpi-automation).\n\n```txt adjust dietpi.txt to your needs\nAUTO_SETUP_NET_WIFI_ENABLED=1\nAUTO_SETUP_NET_WIFI_COUNTRY_CODE=DE\n```\n\nAfterwards the WiFi login data needs to be provided (unencrypted file, will be removed after first boot):\n\n```txt adjust dietpi-wifi.txt\naWIFI_SSID[0]=\"<name of your network>\"\naWIFI_KEY[0]=\"<password>\"\n```\n\nFirst login needs to be done with \"root\" or \"dietpi\", and you will start with a configuration procedure.\n\n```sh\nssh root@DietPi\n```\n\n### System access and configuration basics\n\nPlease follow the instructions of the OS provider. A ssh access for (WLAN with dietpi user) is used in this guide.\n\n```sh\nssh dietpi@DietPi\n```\n\n### Enabling hardware drivers in general\n\nNot all drivers are enabled by default. You can have a look at the configuration file, to find out what is enabled at\nyour system:\n\n```sh\ncat /boot/dietpiEnv.txt\n```\n\nMissing interfaces needs to be enabled by DT-overlays (drop \"meson\" prefix and file extension).\n\n```sh list available overlays\nls /boot/dtb/amlogic/overlay/\n```\n\nPlease read [this GPIO page](https://wiki.radxa.com/Zero/hardware/gpio.) for meaning of the different part of file name (e.g. \"ao\" vs. \"ee\").\nThe [page about overlays](https://wiki.radxa.com/Device-tree-overlays#Meson_G12A_Available_Overlay_.28Radxa_Zero.29) will help you in addition to choose the right one.\n\n### enable I2C\n\n|  device  |SDA|SCL|DT overlay file name|\n|----------|---|---|--------------------|\n|/dev/i2c-1| 16| 13|meson-g12a-radxa-zero-i2c-ee-m1-gpiox-10-gpiox-11.dtbo|\n|/dev/i2c-1| 24| 23|meson-g12a-radxa-zero-i2c-ee-m1-gpioh-6-gpioh-7.dtbo|\n|/dev/i2c-3|  3|  5|meson-g12a-radxa-zero-i2c-ee-m3-gpioa-14-gpioa-15.dtbo|\n|/dev/i2c-4|  7| 11|meson-g12a-radxa-zero-i2c-ao-m0-gpioao-2-gpioao-3.dtbo|\n\n\n```sh /boot/dietpiEnv.txt example for i2c-1\n...\noverlays=g12a-radxa-zero-i2c-ee-m1-gpioh-6-gpioh-7\n...\n```\n\n>The I2C device \"/dev/i2c-3\" was already enabled on dietPi after setup.\n\n### enable SPI\n\n```sh /boot/dietpiEnv.txt for SPI\n...\noverlays=g12a-radxa-zero-spi-spidev\n...\n```\n\n>Most likely the overlay is currently defective - it contains \"armbian\" and only \"disabled\" spi devices.\n\n### enable PWM\n\n|pin     |  symbol |          DT path          |        driver      |DT overlay file name|\n|--------|---------|---------------------------|--------------------|--------------------|\n|32, PWMAO_C|pwm_AO_cd|/soc/bus@ff800000/pwm@2000 |meson-g12a-ao-pwm-cd|on by default|\n|40, PWMAO_A|pwm_AO_ab|/soc/bus@ff800000/pwm@7000 |meson-g12a-ao-pwm-ab|meson-g12a-radxa-zero-pwmao-a-on-gpioao-11.dtbo|\n|18, PWM_C  |pwm_cd   |/soc/bus@ffd00000/pwm@1a000|meson-g12a-ee-pwm   |meson-g12a-radxa-zero-pwm-c-on-gpiox-8.dtbo|\n|21, PWM_F  |pwm_ef   |/soc/bus@ffd00000/pwm@19000|meson-g12a-ee-pwm   |on by default|\n\n>PWMAO_B (channel 1 of pwm_AO_ab) and PWM_D (channel 1 of pwm_cd) not wired. PWMAO_D (channel 1 of pwm_AO_cd) in use by\n>\"regulator-vddcpu\". PWM_E (channel 0 of pwm_ef) in use by wifi32k. PWMAO_C and PWM_F not really working, see\n>troubleshooting section.\n\n### enable 1-wire\n\nThe contained overlays maybe not working, because compatible with gxbb (Amlogic Meson S905). At least for my Zero V1.51\ng12a (Amlogic Meson S905X2 and above) it does not work.\n\n```sh /boot/dietpiEnv.txt for 1-wire\ndtc -I dtb -O dts /boot/dtb/amlogic/overlay/meson-w1AB-gpio.dtbo | grep amlogic\n...\ncompatible = \"amlogic,meson-gxbb\";\n```\n\nSo create your own overlay as `/boot/overlay_user/meson-g12a-w1-gpioao-3.dts`...\n\n```sh\n/dts-v1/;\n/plugin/;\n\n/ {\n\tcompatible = \"radxa,zero\", \"amlogic,g12a\";\n\n\tfragment@0 {\n\t\ttarget-path = \"/\";\n\n\t\t__overlay__ {\n\t\t\tw1: onewire {\n\t\t\t\tcompatible = \"w1-gpio\";\n\t\t\t\tpinctrl-names = \"default\";\n\t\t\t\t/* GPIOAO_3=0x03, GPIOC_7=0x30 */\n\t\t\t\t/* GPIO_ACTIVE_HIGH=0, GPIO_ACTIVE_LOW=1 */\n\t\t\t\t/* GPIO_SINGLE_ENDED=2, GPIO_LINE_OPEN_DRAIN=4 */\n\t\t\t\tgpios = <0xffffffff 0x03 0x06>;\n\t\t\t\tstatus = \"okay\";\n\t\t\t\tphandle = <0x01>;\n\t\t\t};\n\t\t};\n\t};\n\n\t__fixups__ {\n\t\t/* gpio_ao or gpio for GPIOC_7 */\n\t\tgpio_ao = \"/fragment@0/__overlay__/onewire:gpios:0\";\n\t};\n};\n```\n\n...compile it\n\n```sh\ndtc -@ -O dtb -b 0 -o meson-g12a-w1-gpioao-3.dtbo meson-g12a-w1-gpioao-3.dts\n```\n\n... and add it as follows:\n\n```sh /boot/dietpiEnv.txt for 1-wire\n...\nuser_overlays=<existing names> meson-g12a-w1-gpioao-3\n...\n```\n\n## enable SAR ADC\n\nThe 12-bit ADC is enabled by default. The voltage range is 0..1.8V. Raw values can be read with pin 15 (channel 1) or\npin 26 (channel 2). Additionally some internal values can be accessed, e.g. gnd and 1/4 vdd. For debugging purposes more\ninformation is provided, e.g. each item provides a label:\n\n```sh\ncat /sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage9_label\ngnd\ncat /sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage10_label\n0.25vdd\n```\n```sh\ncat /sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/calibbias\n-4\ncat /sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/calibscale\n1.002447\ncat /sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage_scale\n0.439453125\ncat /sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage9_raw\n0\ncat /sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage10_raw\n1023\n```\n\nThe `in_voltage_scale` (e.g. 0.439453125) is for calculation of \"value = (raw + offset) * scale\", value in millivolts.\nThe `calibbias` is the offset and `calibscale` the scale which is used for internal calibration, so we get an output\nof 0..4095 for 0..1.8V input.\n\n>The channel 10 is a 1/4 of full range, but if the channel 2 is in saturation state (above 1.8V = 4095), it becomes more\n>and more wrong.\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := zero.NewAdaptor()\nled := gpio.NewLedDriver(r, \"7\")\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=arm64 GOOS=linux go build -o output/ examples/zero_blink.go\n```\n\nOnce you have compiled your code, you can upload your program and execute it on the board from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp zero_blink dietpi@DietPi:~\nssh -t dietpi@DietPi \"./zero_blink\"\n```\n\n## Troubleshooting\n\n### scp fails\n\n\"bash: line 1: /usr/lib/sftp-server: No such file or directory\"\n\nThe dietPi has only a limited package set, so sftp-server is missing.\n\n```sh\nsudo apt install openssh-sftp-server\n```\n\n### GPIO pin3, pin5 and pin7 not working like expected\n\ne.g. for pin3:\n`cdev.Export(): cdev.reconfigure(gpiochip0-63)-c.RequestLine(63, [0 2000000000 2]): invalid argument`\n\nThe pin does not support `adaptors.WithGpioDebounce(inPinNum, debounceTime)`.\n\n`cdev.Export(): cdev.reconfigure(gpiochip1-0)-c.RequestLine(0, [0 2]): invalid argument`\n\nThe pin 8 is configured for UART.\n\n>Some pins have low power or have a strong pullup resistor, so the expected voltage drop is maybe not possible.\n>Pins 7-27 and 11-28 are bridged.\n\n### PWMAO_C and PWM_F not really working\n\nIf you run `cat /sys/kernel/debug/pwm` when those PWMs are used you can see, that it is working \"internally\". Most\nlikely the pin itself is not enabled by DT on PWM usage. Currently there is no fix provided for that.\n"
  },
  {
    "path": "platforms/radxa/zero/adaptor.go",
    "content": "package zero\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tdefaultI2cBusNumber = 3\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 10000000\n)\n\n// Adaptor represents a Gobot Adaptor for the Radxa Zero\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\t*adaptors.OneWireBusAdaptor\n\n\tname  string\n\tsys   *system.Accesser // used for unit tests only\n\tmutex *sync.Mutex\n}\n\n// NewAdaptor creates a Zero Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\tadaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior\n//\tadaptors.WithGpioEventOnFallingEdge/RaisingEdge/BothEdges(pin, handler): activate edge detection\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\t1-wire, see [adaptors.NewOneWireBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser()\n\ta := &Adaptor{\n\t\tname:  gobot.DefaultName(\"Zero\"),\n\t\tsys:   sys,\n\t\tmutex: &sync.Mutex{},\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tvar oneWireBusOpts []adaptors.OneWireBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tcase adaptors.OneWireBusOptionApplier:\n\t\t\toneWireBusOpts = append(oneWireBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinDefinitions)\n\tdigitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions)\n\tpwmPinTranslator := adaptors.NewPWMPinTranslator(sys, pwmPinDefinitions)\n\t// Valid bus numbers are [1,3,4] which corresponds to /dev/i2c-1, /dev/i2c-3, /dev/i2c-4\n\t// We don't support /dev/i2c-5 (DesignWare HDMI)\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{1, 3, 4})\n\t// Valid bus numbers are [0,1] which corresponds to /dev/spidev0.x, /dev/spidev1.x\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, digitalPinTranslator.Translate, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, pwmPinTranslator.Translate, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\t// pin ?? needs to be activated by DT-overlay w1-gpio\n\ta.OneWireBusAdaptor = adaptors.NewOneWireBusAdaptor(sys, oneWireBusOpts...)\n\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.OneWireBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board, pins and bus\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.OneWireBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\treturn err\n}\n"
  },
  {
    "path": "platforms/radxa/zero/adaptor_test.go",
    "content": "package zero\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmDir           = \"/sys/devices/platform/soc/ffd00000.bus/ffd1a000.pwm/pwm/pwmchip2/\" //nolint:gosec // false positive\n\tpwmExportPath    = pwmDir + \"export\"\n\tpwmUnexportPath  = pwmDir + \"unexport\"\n\tpwmPwmDir        = pwmDir + \"pwm0/\"\n\tpwmEnablePath    = pwmPwmDir + \"enable\"\n\tpwmPeriodPath    = pwmPwmDir + \"period\"\n\tpwmDutyCyclePath = pwmPwmDir + \"duty_cycle\"\n\tpwmPolarityPath  = pwmPwmDir + \"polarity\"\n\n\tpwmInvertedIdentifier = \"inversed\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwmEnablePath,\n\tpwmPeriodPath,\n\tpwmDutyCyclePath,\n\tpwmPolarityPath,\n}\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n)\n\nfunc preparePwmFs(fs *system.MockFilesystem) {\n\tfs.Files[pwmEnablePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPolarityPath].Contents = pwmInvertedIdentifier\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := initConnectedTestAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\treturn a, fs\n}\n\nfunc initConnectedTestAdaptor() *Adaptor {\n\ta := NewAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Zero\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.mutex)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip1\", \"3\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"gpiochip1\", \"1\", []int{3})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 3, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip1\", \"3\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip1\", \"1\"))\n}\n\nfunc TestDigitalIOSysfs(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewAdaptor(adaptors.WithGpioSysfsAccess())\n\trequire.NoError(t, a.Connect())\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert write\n\terr := a.DigitalWrite(\"7\", 1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{1}, dpa.Written(\"\", \"415\"))\n\t// arrange, act & assert read\n\tdpa.UseValues(\"\", \"413\", []int{4})\n\ti, err := a.DigitalRead(\"10\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 4, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"415\"))\n\tassert.Equal(t, 0, dpa.Exported(\"\", \"413\"))\n}\n\nfunc TestAnalogRead(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/class/thermal/thermal_zone0/temp\"].Contents = \"567\\n\"\n\tgot, err := a.AnalogRead(\"cpu_thermal\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 567, got)\n\n\t_, err = a.AnalogRead(\"thermal_zone10\")\n\trequire.ErrorContains(t, err, \"'thermal_zone10' is not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"cpu_thermal\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\trequire.NoError(t, a.DigitalWrite(\"7\", 1))\n\tdpa.UseUnexportError(\"gpiochip1\", \"3\")\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"unexport error\")\n}\n\nfunc TestFinalizeErrorAfterPWM(t *testing.T) {\n\t// indirect test for PWM.Finalize() is called for the adaptor\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tpreparePwmFs(fs)\n\trequire.NoError(t, a.PwmWrite(\"18\", 1))\n\tfs.WithWriteError = true\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, 8, a.SpiDefaultBitCount())\n\tassert.Equal(t, int64(10000000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 3, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := initConnectedTestAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-4\"})\n\tcon, err := a.GetI2cConnection(0xff, 4)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n"
  },
  {
    "path": "platforms/radxa/zero/doc.go",
    "content": "/*\nPackage zero contains the Gobot adaptor for the Radxa Zero.\n\nFor further information refer to the boards README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/radxa/zero/README.md\n*/\npackage zero // import \"gobot.io/x/gobot/v2/platforms/radxa/zero\"\n"
  },
  {
    "path": "platforms/radxa/zero/pinmap.go",
    "content": "package zero\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\n// tested with cdev on a Zero V1.51 board: dietPi Linux, OK: works, ?: unknown, NOK: not working\n// IN: works only as input, PU: if used as input, external pullup resistor needed\n//\n//nolint:lll // ok here\nvar gpioPinDefinitions = adaptors.DigitalPinDefinitions{\n\t\"8\":   {Sysfs: 412, Cdev: adaptors.CdevPin{Chip: 1, Line: 0}},  // GPIOAO_0_UART_AO_A_TXD - ?\n\t\"10\":  {Sysfs: 413, Cdev: adaptors.CdevPin{Chip: 1, Line: 1}},  // GPIOAO_1_UART_AO_A_RXD - OK\n\t\"11\":  {Sysfs: 414, Cdev: adaptors.CdevPin{Chip: 1, Line: 2}},  // GPIOAO_2_I2C_AO_M0_SCL_UART_AO_B_TX_I2C_AO_S0_SCL - OK\n\t\"28\":  {Sysfs: 414, Cdev: adaptors.CdevPin{Chip: 1, Line: 2}},  // GPIOAO_2_I2C_AO_M0_SCL_UART_AO_B_TX_I2C_AO_S0_SCL - OK\n\t\"7\":   {Sysfs: 415, Cdev: adaptors.CdevPin{Chip: 1, Line: 3}},  // GPIOAO_3_I2C_AO_M0_SDA_UART_AO_B_RX_I2C_AO_S0_SDA - OK\n\t\"27\":  {Sysfs: 415, Cdev: adaptors.CdevPin{Chip: 1, Line: 3}},  // GPIOAO_3_I2C_AO_M0_SDA_UART_AO_B_RX_I2C_AO_S0_SDA - OK\n\t\"32\":  {Sysfs: 416, Cdev: adaptors.CdevPin{Chip: 1, Line: 4}},  // GPIOAO_4_PWMAO_C - OK\n\t\"35\":  {Sysfs: 420, Cdev: adaptors.CdevPin{Chip: 1, Line: 8}},  // GPIOAO_8_UART_AO_B_TX - OK\n\t\"37\":  {Sysfs: 421, Cdev: adaptors.CdevPin{Chip: 1, Line: 9}},  // GPIOAO_9_UART_AO_B_RX - OK\n\t\"LED\": {Sysfs: 422, Cdev: adaptors.CdevPin{Chip: 1, Line: 10}}, // GPIOAO_10_PWMAO_D - Wired to LED besides USB-C\n\t\"40\":  {Sysfs: 423, Cdev: adaptors.CdevPin{Chip: 1, Line: 11}}, // GPIOAO_11_PWMAO_A - OK\n\t\"19\":  {Sysfs: 447, Cdev: adaptors.CdevPin{Chip: 0, Line: 20}}, // GPIOH_4_UART_EE_C_RTS_SPI_B_MOSI - OK\n\t\"21\":  {Sysfs: 448, Cdev: adaptors.CdevPin{Chip: 0, Line: 21}}, // GPIOH_5_UART_EE_C_CTS_SPI_B_MISO_PWM_F - OK\n\t\"24\":  {Sysfs: 449, Cdev: adaptors.CdevPin{Chip: 0, Line: 22}}, // GPIOH_6_UART_EE_C_RX_SPI_B_SS0_I2C_EE_M1_SDA - OK\n\t\"23\":  {Sysfs: 450, Cdev: adaptors.CdevPin{Chip: 0, Line: 23}}, // GPIOH_7_UART_EE_C_TX_SPI_B_SCLK_I2C_EE_M1_SCL - OK\n\t\"36\":  {Sysfs: 451, Cdev: adaptors.CdevPin{Chip: 0, Line: 24}}, // GPIOH_8 - OK\n\t\"22\":  {Sysfs: 475, Cdev: adaptors.CdevPin{Chip: 0, Line: 48}}, // GPIOC_7 - OK\n\t\"3\":   {Sysfs: 490, Cdev: adaptors.CdevPin{Chip: 0, Line: 63}}, // GPIOA_14_I2C_EE_M3_SDA - OK (i2c-3)\n\t\"5\":   {Sysfs: 491, Cdev: adaptors.CdevPin{Chip: 0, Line: 64}}, // GPIOA_15_I2C_EE_M3_SCL - OK (i2-c3)\n\t\"18\":  {Sysfs: 500, Cdev: adaptors.CdevPin{Chip: 0, Line: 73}}, // GPIOX_8_SPI_A_MOSI_PWM_C_TDMA_D1 - OK\n\t\"12\":  {Sysfs: 501, Cdev: adaptors.CdevPin{Chip: 0, Line: 74}}, // GPIOX_9_SPI_A_MISO_TDMA_D0 - OK\n\t\"16\":  {Sysfs: 502, Cdev: adaptors.CdevPin{Chip: 0, Line: 75}}, // GPIOX_10_SPI_A_SS0_I2C_EE_M1_SDA_TDMA_FS - OK\n\t\"13\":  {Sysfs: 503, Cdev: adaptors.CdevPin{Chip: 0, Line: 76}}, // GPIOX_11_SPI_A_SCLK_I2C_EE_M1_SCL_TDMA_SCLK - OK\n}\n\nvar pwmPinDefinitions = adaptors.PWMPinDefinitions{\n\t// enabled by default, but pin seems to be not really enabled on pwm usage, channel 1 used by \"regulator-vddcpu\"\n\t\"32\": {Dir: \"/sys/devices/platform/soc/ff800000.bus/ff802000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4]$\", Channel: 0},\n\t\"40\": {Dir: \"/sys/devices/platform/soc/ff800000.bus/ff807000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4]$\", Channel: 0},\n\t\"18\": {Dir: \"/sys/devices/platform/soc/ffd00000.bus/ffd1a000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4]$\", Channel: 0},\n\t// enabled by default, but pin seems to be not really enabled on pwm usage, channel 0 used by \"wifi32k\"\n\t\"21\": {Dir: \"/sys/devices/platform/soc/ffd00000.bus/ffd19000.pwm/pwm/\", DirRegexp: \"pwmchip[0|1|2|3|4]$\", Channel: 1},\n}\n\nvar analogPinDefinitions = adaptors.AnalogPinDefinitions{\n\t// +/-273.200 °C need >=7 characters to read: +/-273200 millidegree Celsius\n\t// names equals /sys/class/thermal/thermal_zone*/hwmon*/name\n\t\"cpu_thermal\": {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n\t\"ddr_thermal\": {Path: \"/sys/class/thermal/thermal_zone1/temp\", W: false, ReadBufLen: 7},\n\t// 2 channel 12-bit SAR ADC, 0..4095, so 4 characters to read\n\t\"15\": {\n\t\tPath: \"/sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage1_raw\", W: false, ReadBufLen: 4,\n\t},\n\t\"15_mean\": {\n\t\tPath: \"/sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage1_mean_raw\", W: false, ReadBufLen: 4,\n\t},\n\t\"26\": {\n\t\tPath: \"/sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage2_raw\", W: false, ReadBufLen: 4,\n\t},\n\t\"26_mean\": {\n\t\tPath: \"/sys/bus/platform/drivers/meson-saradc/ff809000.adc/iio:device0/in_voltage2_mean_raw\", W: false, ReadBufLen: 4,\n\t},\n}\n"
  },
  {
    "path": "platforms/raspi/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/raspi/README.md",
    "content": "# Raspberry Pi\n\nThe Raspberry Pi is an inexpensive and popular ARM based single board computer with digital & PWM GPIO, and i2c interfaces\nbuilt in.\n\nThe Gobot adaptor for the Raspberry Pi should support all of the various Raspberry Pi boards such as the\nRaspberry Pi 4 Model B, Raspberry Pi 3 Model B, Raspberry Pi 2 Model B, Raspberry Pi 1 Model A+, Raspberry Pi Zero,\nand Raspberry Pi Zero W.\n\nFor more info about the Raspberry Pi platform, click [here](http://www.raspberrypi.org/).\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\nWe recommend updating to the latest Raspian Jessie OS when using the Raspberry Pi, however Gobot should also support\nolder versions of the OS, should your application require this.\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\npackage main\n\nimport (\n\"time\"\n\n\"gobot.io/x/gobot/v2\"\n\"gobot.io/x/gobot/v2/drivers/gpio\"\n\"gobot.io/x/gobot/v2/platforms/raspi\"\n)\n\nfunc main() {\n  r := raspi.NewAdaptor()\n  led := gpio.NewLedDriver(r, \"7\")\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      if err := led.Toggle(); err != nil {\n\t\t\t\tfmt.Println(err)\n\t\t\t}\n    })\n  }\n\n  robot := gobot.NewRobot(\"blinkBot\",\n    []gobot.Connection{r},\n    []gobot.Device{led},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n\n## Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARM=6 GOARCH=arm GOOS=linux go build examples/raspi_blink.go\n```\n\nUse the following `GOARM` values to compile depending on which model Raspberry Pi you are using:\n\n`GOARM=6` (Raspberry Pi A, A+, B, B+, Zero)\n`GOARM=7` (Raspberry Pi 2, 3)\n\nOnce you have compiled your code, you can upload your program and execute it on the Raspberry Pi from your workstation\nusing the `scp` and `ssh` commands like this:\n\n```sh\nscp raspi_blink pi@192.168.1.xxx:/home/pi/\nssh -t pi@192.168.1.xxx \"./raspi_blink\"\n```\n\n## Enabling PWM output on GPIO pins\n\n### Using Linux Kernel sysfs implementation\n\nThe PWM needs to be enabled in the device tree. Please read `/boot/overlays/README` of your device. Usually \"pwm0\" can\nbe activated for all raspi variants with a line `dtoverlay=pwm,pin=18,func=2` added to `/boot/config.txt`. The number\nrelates to \"GPIO18\", not the header number, which is \"12\" in this case.\n\nNow the pin can be used with gobot by the pwm channel name, e.g. for our example above:\n\n```go\n...\n// create the adaptor with a 50Hz default frequency for usage with servos\na := NewAdaptor(adaptors.WithPWMDefaultPeriod(20000000))\n// move servo connected with header pin 12 to 90°\na.ServoWrite(\"pwm0\", 90)\n...\n```\n\n> If the activation fails or something strange happen, maybe the audio driver conflicts with the PWM. Please deactivate\n> the audio device tree overlay in `/boot/config.txt` to avoid conflicts.\n\n### Using pi-blaster\n\nFor support PWM on all pins, you may use a program called pi-blaster. You can follow the instructions for install in\nthe pi-blaster repo here: <https://github.com/sarfata/pi-blaster>\n\nFor using a PWM for servo, the default 100Hz period needs to be adjusted to 50Hz in the source code of the driver.\nPlease refer to <https://github.com/sarfata/pi-blaster#how-to-adjust-the-frequency-and-the-resolution-of-the-pwm>.\n\nIt is not possible to change the period from gobot side.\n\nNow the pin can be used with gobot by the header number, e.g.:\n\n```go\n...\n// create the adaptor with usage of pi-blaster instead of default sysfs, 50Hz default is given for calculate\n// duty cycle for servos but will not change everything for the pi-blaster driver, see description above\na := NewAdaptor(adaptors.WithPWMUsePiBlaster(), adaptors.WithPWMDefaultPeriod(20000000))\n// move servo to 90°\na.ServoWrite(\"11\", 90)\n// this will not work like expected, see description\na.SetPeriod(\"11\", 20000000)\n...\n```\n"
  },
  {
    "path": "platforms/raspi/adaptor.go",
    "content": "package raspi\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tinfoFile = \"/proc/cpuinfo\"\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\n// Adaptor is the Gobot Adaptor for the Raspberry Pi\ntype Adaptor struct {\n\t*adaptors.AnalogPinsAdaptor\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname     string\n\tmutex    sync.Mutex\n\tsys      *system.Accesser\n\trevision string\n}\n\n// NewAdaptor creates a Raspi Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioSysfsAccess():\tuse legacy sysfs driver instead of default character device driver\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\tadaptors.WithGpiosActiveLow(pin's): invert the pin behavior\n//\tadaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor\n//\tadaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior\n//\tadaptors.WithGpioDebounce(pin, period): sets the input debouncer\n//\tadaptors.WithGpioEventOnFallingEdge/RaisingEdge/BothEdges(pin, handler): activate edge detection\n//\n// Further optional parameters for:\n//\n//\tAIO, see [adaptors.NewAnalogPinsAdaptor]\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser()\n\ta := &Adaptor{\n\t\tname: gobot.DefaultName(\"RaspberryPi\"),\n\t\tsys:  sys,\n\t}\n\n\tvar analogPinsOpts []adaptors.AnalogPinsOptionApplier\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.AnalogPinsOptionApplier:\n\t\t\tanalogPinsOpts = append(analogPinsOpts, o)\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\tanalogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinDefinitions)\n\t// Valid bus numbers are [0,1] which corresponds to /dev/i2c-0 through /dev/i2c-1.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\t// Valid bus numbers are [0,1] which corresponds to /dev/spidev0.x through /dev/spidev1.x.\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\n\ta.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate, analogPinsOpts...)\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.getPinTranslatorFunction(), digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.getPinTranslatorFunction(), pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, 1, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\treturn a\n}\n\n// Name returns the adaptors name\nfunc (a *Adaptor) Name() string {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\treturn a.name\n}\n\n// SetName sets the adaptors name\nfunc (a *Adaptor) SetName(n string) {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\ta.name = n\n}\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.AnalogPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board and pins\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.AnalogPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\treturn err\n}\n\n// DefaultI2cBus returns the default i2c bus for this platform.\n// This overrides the base function due to the revision dependency.\nfunc (a *Adaptor) DefaultI2cBus() int {\n\trev := a.readRevision()\n\tif rev == \"2\" || rev == \"3\" {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\n// getPinTranslatorFunction returns a function to be able to translate GPIO and PWM pins.\n// This means for pi-blaster usage, each pin can be used and therefore the pin is given as number, like a GPIO pin.\n// For sysfs-PWM usage, the pin will be given as \"pwm0\" or \"pwm1\", because the real pin number depends on the user\n// configuration in \"/boot/config.txt\". For further details, see \"/boot/overlays/README\".\nfunc (a *Adaptor) getPinTranslatorFunction() func(string) (string, int, error) {\n\treturn func(pin string) (string, int, error) {\n\t\tvar line int\n\t\tif val, ok := pins[pin][a.readRevision()]; ok {\n\t\t\tline = val\n\t\t} else if val, ok := pins[pin][\"*\"]; ok {\n\t\t\tline = val\n\t\t} else {\n\t\t\treturn \"\", 0, fmt.Errorf(\"'%s' is not a valid pin id for raspi revision %s\", pin, a.revision)\n\t\t}\n\t\t// We always use \"gpiochip0\", because currently all pins are available with this approach. A change of the\n\t\t// translator would be needed to support different chips (e.g. gpiochip1) with different revisions.\n\t\tpath := \"gpiochip0\"\n\t\tif strings.HasPrefix(pin, \"pwm\") {\n\t\t\tpath = \"/sys/class/pwm/pwmchip0\"\n\t\t}\n\n\t\treturn path, line, nil\n\t}\n}\n\nfunc (a *Adaptor) readRevision() string {\n\tif a.revision == \"\" {\n\t\ta.revision = \"0\"\n\t\tcontent, err := a.sys.ReadFile(infoFile)\n\t\tif err != nil {\n\t\t\treturn a.revision\n\t\t}\n\t\tfor _, v := range strings.Split(string(content), \"\\n\") {\n\t\t\tif strings.Contains(v, \"Revision\") {\n\t\t\t\ts := strings.Split(v, \" \")\n\t\t\t\tversion, _ := strconv.ParseInt(\"0x\"+s[len(s)-1], 0, 64)\n\t\t\t\tswitch {\n\t\t\t\tcase version <= 3:\n\t\t\t\t\ta.revision = \"1\"\n\t\t\t\tcase version <= 15:\n\t\t\t\t\ta.revision = \"2\"\n\t\t\t\tdefault:\n\t\t\t\t\ta.revision = \"3\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a.revision\n}\n"
  },
  {
    "path": "platforms/raspi/adaptor_test.go",
    "content": "package raspi\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/aio\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\tpwmDir           = \"/sys/class/pwm/pwmchip0/\" //nolint:gosec // false positive\n\tpwmPwmDir        = pwmDir + \"pwm0/\"\n\tpwmExportPath    = pwmDir + \"export\"\n\tpwmUnexportPath  = pwmDir + \"unexport\"\n\tpwmEnablePath    = pwmPwmDir + \"enable\"\n\tpwmPeriodPath    = pwmPwmDir + \"period\"\n\tpwmDutyCyclePath = pwmPwmDir + \"duty_cycle\"\n\tpwmPolarityPath  = pwmPwmDir + \"polarity\"\n\n\tpwmInvertedIdentifier = \"inversed\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwmEnablePath,\n\tpwmPeriodPath,\n\tpwmDutyCyclePath,\n\tpwmPolarityPath,\n}\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ gpio.ServoWriter            = (*Adaptor)(nil)\n\t_ aio.AnalogReader            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n\t_ spi.Connector               = (*Adaptor)(nil)\n)\n\nfunc preparePwmFs(fs *system.MockFilesystem) {\n\tfs.Files[pwmEnablePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPolarityPath].Contents = pwmInvertedIdentifier\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"RaspberryPi\"))\n\tassert.NotNil(t, a.sys)\n\tassert.NotNil(t, a.AnalogPinsAdaptor)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestNewAdaptorWithOption(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor(adaptors.WithGpiosActiveLow(\"1\"), adaptors.WithGpioSysfsAccess())\n\t// assert\n\trequire.NoError(t, a.Connect())\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n}\n\nfunc TestGetDefaultBus(t *testing.T) {\n\tconst contentPattern = \"Hardware        : BCM2708\\n%sSerial          : 000000003bc748ea\\n\"\n\ttests := map[string]struct {\n\t\trevisionPart string\n\t\twantRev      string\n\t\twantBus      int\n\t}{\n\t\t\"no_revision\": {\n\t\t\twantRev: \"0\",\n\t\t\twantBus: 0,\n\t\t},\n\t\t\"rev_1\": {\n\t\t\trevisionPart: \"Revision        : 0002\\n\",\n\t\t\twantRev:      \"1\",\n\t\t\twantBus:      0,\n\t\t},\n\t\t\"rev_2\": {\n\t\t\trevisionPart: \"Revision        : 000D\\n\",\n\t\t\twantRev:      \"2\",\n\t\t\twantBus:      1,\n\t\t},\n\t\t\"rev_3\": {\n\t\t\trevisionPart: \"Revision        : 0010\\n\",\n\t\t\twantRev:      \"3\",\n\t\t\twantBus:      1,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor()\n\t\t\tfs := a.sys.UseMockFilesystem([]string{infoFile})\n\t\t\tfs.Files[infoFile].Contents = fmt.Sprintf(contentPattern, tc.revisionPart)\n\t\t\tassert.Empty(t, a.revision)\n\t\t\t// act, will read and refresh the revision\n\t\t\tgotBus := a.DefaultI2cBus()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantRev, a.revision)\n\t\t\tassert.Equal(t, tc.wantBus, gotBus)\n\t\t})\n\t}\n}\n\nfunc TestFinalize(t *testing.T) {\n\tmockedPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/dev/pi-blaster\",\n\t\t\"/dev/i2c-1\",\n\t\t\"/dev/i2c-0\",\n\t\t\"/dev/spidev0.0\",\n\t\t\"/dev/spidev0.1\",\n\t}\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem(mockedPaths)\n\n\t_ = a.DigitalWrite(\"3\", 1)\n\t_ = a.PwmWrite(\"7\", 255)\n\n\t_, _ = a.GetI2cConnection(0xff, 0)\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestAnalog(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/thermal/thermal_zone0/temp\",\n\t}\n\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(mockPaths)\n\n\tfs.Files[\"/sys/class/thermal/thermal_zone0/temp\"].Contents = \"567\\n\"\n\tgot, err := a.AnalogRead(\"thermal_zone0\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 567, got)\n\n\t_, err = a.AnalogRead(\"thermal_zone10\")\n\trequire.ErrorContains(t, err, \"'thermal_zone10' is not a valid id for an analog pin\")\n\n\tfs.WithReadError = true\n\t_, err = a.AnalogRead(\"thermal_zone0\")\n\trequire.ErrorContains(t, err, \"read error\")\n\tfs.WithReadError = false\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestPwmWrite(t *testing.T) {\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tpreparePwmFs(fs)\n\t// act\n\terr := a.PwmWrite(\"pwm0\", 100)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"0\", fs.Files[pwmExportPath].Contents)\n\tassert.Equal(t, \"1\", fs.Files[pwmEnablePath].Contents)\n\tassert.Equal(t, \"10000000\", fs.Files[pwmPeriodPath].Contents)\n\tassert.Equal(t, \"3921568\", fs.Files[pwmDutyCyclePath].Contents)\n\tassert.Equal(t, \"normal\", fs.Files[pwmPolarityPath].Contents)\n\t// act & assert invalid pin\n\terr = a.PwmWrite(\"pwm1\", 42)\n\trequire.ErrorContains(t, err, \"'pwm1' is not a valid pin id for raspi revision 0\")\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestServoWrite(t *testing.T) {\n\t// arrange: prepare 50Hz for servos\n\tconst (\n\t\tpin         = \"pwm0\"\n\t\tfiftyHzNano = 20000000\n\t)\n\ta := NewAdaptor(adaptors.WithPWMDefaultPeriodForPin(pin, fiftyHzNano))\n\tfs := a.sys.UseMockFilesystem(pwmMockPaths)\n\tpreparePwmFs(fs)\n\trequire.NoError(t, a.Connect())\n\t// act & assert for 0° (min default value)\n\terr := a.ServoWrite(pin, 0)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[pwmPeriodPath].Contents)\n\tassert.Equal(t, \"500000\", fs.Files[pwmDutyCyclePath].Contents)\n\t// act & assert for 180° (max default value)\n\terr = a.ServoWrite(pin, 180)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[pwmPeriodPath].Contents)\n\tassert.Equal(t, \"2500000\", fs.Files[pwmDutyCyclePath].Contents)\n\t// act & assert invalid pins\n\terr = a.ServoWrite(\"3\", 120)\n\trequire.ErrorContains(t, err, \"'3' is not a valid pin id for raspi revision 0\")\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestPWMWrite_piPlaster(t *testing.T) {\n\t// arrange\n\tconst hundredHzNano = 10000000\n\tmockedPaths := []string{\"/dev/pi-blaster\"}\n\ta := NewAdaptor(adaptors.WithPWMUsePiBlaster())\n\tfs := a.sys.UseMockFilesystem(mockedPaths)\n\trequire.NoError(t, a.Connect())\n\t// act & assert: Write & Pin & Period\n\trequire.NoError(t, a.PwmWrite(\"7\", 255))\n\tassert.Equal(t, \"4=1\", strings.Split(fs.Files[\"/dev/pi-blaster\"].Contents, \"\\n\")[0])\n\tpin, _ := a.PWMPin(\"7\")\n\tperiod, err := pin.Period()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(hundredHzNano), period)\n\t// act & assert: nonexistent pin\n\trequire.ErrorContains(t, a.PwmWrite(\"notexist\", 1), \"'notexist' is not a valid pin id for raspi revision 0\")\n\t// act & assert: SetDutyCycle\n\tpin, _ = a.PWMPin(\"12\")\n\trequire.NoError(t, pin.SetDutyCycle(1.5*1000*1000))\n\tassert.Equal(t, \"18=0.15\", strings.Split(fs.Files[\"/dev/pi-blaster\"].Contents, \"\\n\")[0])\n}\n\nfunc TestPWM_piPlaster(t *testing.T) {\n\t// arrange\n\tconst fiftyHzNano = 20000000 // 20 ms\n\tmockedPaths := []string{\"/dev/pi-blaster\"}\n\ta := NewAdaptor(adaptors.WithPWMUsePiBlaster(), adaptors.WithPWMDefaultPeriod(fiftyHzNano))\n\tfs := a.sys.UseMockFilesystem(mockedPaths)\n\trequire.NoError(t, a.Connect())\n\t// act & assert: Pin & Period\n\tpin, _ := a.PWMPin(\"7\")\n\tperiod, err := pin.Period()\n\trequire.NoError(t, err)\n\tassert.Equal(t, uint32(fiftyHzNano), period)\n\t// act & assert for 180° (max default value), 2.5 ms => 12.5%\n\trequire.NoError(t, a.ServoWrite(\"11\", 180))\n\tassert.Equal(t, \"17=0.125\", strings.Split(fs.Files[\"/dev/pi-blaster\"].Contents, \"\\n\")[0])\n\t// act & assert for 90° (center value), 1.5 ms => 7.5% duty\n\trequire.NoError(t, a.ServoWrite(\"11\", 90))\n\tassert.Equal(t, \"17=0.075\", strings.Split(fs.Files[\"/dev/pi-blaster\"].Contents, \"\\n\")[0])\n\t// act & assert for 0° (min default value), 0.5 ms => 2.5% duty\n\trequire.NoError(t, a.ServoWrite(\"11\", 0))\n\tassert.Equal(t, \"17=0.025\", strings.Split(fs.Files[\"/dev/pi-blaster\"].Contents, \"\\n\")[0])\n\t// act & assert: nonexistent pin\n\trequire.ErrorContains(t, a.ServoWrite(\"notexist\", 1), \"'notexist' is not a valid pin id for raspi revision 0\")\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\t// some basic tests, further tests are done in \"digitalpinsadaptor.go\"\n\t// arrange\n\ta := NewAdaptor()\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\tdpa := a.sys.UseMockDigitalPinAccess()\n\trequire.True(t, a.sys.HasDigitalPinCdevAccess())\n\t// act & assert write\n\t_ = a.DigitalWrite(\"7\", 1)\n\tassert.Equal(t, []int{1}, dpa.Written(\"gpiochip0\", \"4\"))\n\t// arrange, act & assert read\n\ta.revision = \"2\"\n\tdpa.UseValues(\"gpiochip0\", \"27\", []int{2})\n\ti, err := a.DigitalRead(\"13\")\n\trequire.NoError(t, err)\n\tassert.Equal(t, 2, i)\n\t// act and assert unknown pin\n\trequire.ErrorContains(t, a.DigitalWrite(\"notexist\", 1), \"'notexist' is not a valid pin id for raspi revision 2\")\n\t// act and assert finalize\n\trequire.NoError(t, a.Finalize())\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip0\", \"4\"))\n\tassert.Equal(t, 0, dpa.Exported(\"gpiochip0\", \"27\"))\n}\n\nfunc TestDigitalPinConcurrency(t *testing.T) {\n\toldProcs := runtime.GOMAXPROCS(0)\n\truntime.GOMAXPROCS(8)\n\tdefer runtime.GOMAXPROCS(oldProcs)\n\n\tfor retry := 0; retry < 20; retry++ {\n\n\t\ta := NewAdaptor()\n\t\tvar wg sync.WaitGroup\n\n\t\tfor i := 0; i < 20; i++ {\n\t\t\twg.Add(1)\n\t\t\tpinAsString := strconv.Itoa(i)\n\t\t\tgo func(pin string) {\n\t\t\t\tdefer wg.Done()\n\t\t\t\t_, _ = a.DigitalPin(pin)\n\t\t\t}(pinAsString)\n\t\t}\n\n\t\twg.Wait()\n\t}\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultChipNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\tmockedPaths := []string{\"/dev/i2c-1\"}\n\ta, _ := initConnectedTestAdaptorWithMockedFilesystem(mockedPaths)\n\ta.sys.UseMockSyscall()\n\n\ta.revision = \"0\"\n\tassert.Equal(t, 0, a.DefaultI2cBus())\n\n\ta.revision = \"2\"\n\tassert.Equal(t, 1, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-1\"})\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 1)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n\nfunc Test_getPinTranslatorFunction(t *testing.T) {\n\ttests := map[string]struct {\n\t\tid       string\n\t\trevision string\n\t\twantPath string\n\t\twantLine int\n\t\twantErr  string\n\t}{\n\t\t\"translate_12_rev0\": {\n\t\t\tid:       \"12\",\n\t\t\twantPath: \"gpiochip0\",\n\t\t\twantLine: 18,\n\t\t},\n\t\t\"translate_13_rev0\": {\n\t\t\tid:      \"13\",\n\t\t\twantErr: \"'13' is not a valid pin id for raspi revision 0\",\n\t\t},\n\t\t\"translate_13_rev1\": {\n\t\t\tid:       \"13\",\n\t\t\trevision: \"1\",\n\t\t\twantPath: \"gpiochip0\",\n\t\t\twantLine: 21,\n\t\t},\n\t\t\"translate_29_rev1\": {\n\t\t\tid:       \"29\",\n\t\t\trevision: \"1\",\n\t\t\twantErr:  \"'29' is not a valid pin id for raspi revision 1\",\n\t\t},\n\t\t\"translate_29_rev3\": {\n\t\t\tid:       \"29\",\n\t\t\trevision: \"3\",\n\t\t\twantPath: \"gpiochip0\",\n\t\t\twantLine: 5,\n\t\t},\n\t\t\"translate_pwm0_rev0\": {\n\t\t\tid:       \"pwm0\",\n\t\t\twantPath: \"/sys/class/pwm/pwmchip0\",\n\t\t\twantLine: 0,\n\t\t},\n\t\t\"translate_pwm1_rev0\": {\n\t\t\tid:      \"pwm1\",\n\t\t\twantErr: \"'pwm1' is not a valid pin id for raspi revision 0\",\n\t\t},\n\t\t\"translate_pwm1_rev3\": {\n\t\t\tid:       \"pwm1\",\n\t\t\trevision: \"3\",\n\t\t\twantPath: \"/sys/class/pwm/pwmchip0\",\n\t\t\twantLine: 1,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor()\n\t\t\ta.revision = tc.revision\n\t\t\t// act\n\t\t\tf := a.getPinTranslatorFunction()\n\t\t\tpath, line, err := f(tc.id)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantPath, path)\n\t\t\tassert.Equal(t, tc.wantLine, line)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/raspi/doc.go",
    "content": "/*\nPackage raspi contains the Gobot adaptor for the Raspberry Pi.\n\nFor further information refer to raspi README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/raspi/README.md\n*/\npackage raspi // import \"gobot.io/x/gobot/v2/platforms/raspi\"\n"
  },
  {
    "path": "platforms/raspi/pinmap.go",
    "content": "package raspi\n\nimport \"gobot.io/x/gobot/v2/platforms/adaptors\"\n\nvar pins = map[string]map[string]int{\n\t\"3\": {\n\t\t\"1\": 0,\n\t\t\"2\": 2,\n\t\t\"3\": 2,\n\t},\n\t\"5\": {\n\t\t\"1\": 1,\n\t\t\"2\": 3,\n\t\t\"3\": 3,\n\t},\n\t\"7\": {\n\t\t\"*\": 4,\n\t},\n\t\"8\": {\n\t\t\"*\": 14,\n\t},\n\t\"10\": {\n\t\t\"*\": 15,\n\t},\n\t\"11\": {\n\t\t\"*\": 17,\n\t},\n\t\"12\": {\n\t\t\"*\": 18,\n\t},\n\t\"13\": {\n\t\t\"1\": 21,\n\t\t\"2\": 27,\n\t\t\"3\": 27,\n\t},\n\t\"15\": {\n\t\t\"*\": 22,\n\t},\n\t\"16\": {\n\t\t\"*\": 23,\n\t},\n\t\"18\": {\n\t\t\"*\": 24,\n\t},\n\t\"19\": {\n\t\t\"*\": 10,\n\t},\n\t\"21\": {\n\t\t\"*\": 9,\n\t},\n\t\"22\": {\n\t\t\"*\": 25,\n\t},\n\t\"23\": {\n\t\t\"*\": 11,\n\t},\n\t\"24\": {\n\t\t\"*\": 8,\n\t},\n\t\"26\": {\n\t\t\"*\": 7,\n\t},\n\t\"29\": {\n\t\t\"3\": 5,\n\t},\n\t\"31\": {\n\t\t\"3\": 6,\n\t},\n\t\"32\": {\n\t\t\"3\": 12,\n\t},\n\t\"33\": {\n\t\t\"3\": 13,\n\t},\n\t\"35\": {\n\t\t\"3\": 19,\n\t},\n\t\"36\": {\n\t\t\"3\": 16,\n\t},\n\t\"37\": {\n\t\t\"3\": 26,\n\t},\n\t\"38\": {\n\t\t\"3\": 20,\n\t},\n\t\"40\": {\n\t\t\"3\": 21,\n\t},\n\t\"pwm0\": { // pin 12 (GPIO18) and pin 32 (GPIO12) can be configured for \"pwm0\"\n\t\t\"*\": 0,\n\t},\n\t\"pwm1\": { // pin 33 (GPIO13) and pin 35 (GPIO19) can be configured for \"pwm1\"\n\t\t\"3\": 1,\n\t},\n}\n\nvar analogPinDefinitions = adaptors.AnalogPinDefinitions{\n\t// +/-273.200 °C need >=7 characters to read: +/-273200 millidegree Celsius\n\t\"thermal_zone0\": {Path: \"/sys/class/thermal/thermal_zone0/temp\", W: false, ReadBufLen: 7},\n}\n"
  },
  {
    "path": "platforms/serialport/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/serialport/README.md",
    "content": "# Serialport\n\nThe adaptor \"serialport\" is a small wrapper to get access to the serial port.\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\nSee documentation for [Sphero](https://github.com/hybridgroup/gobot/blob/release/platforms/sphero/sphero/README.md) or\n[Neurosky MindWave](https://github.com/hybridgroup/gobot/blob/release/platforms/neurosky/README.md).\n"
  },
  {
    "path": "platforms/serialport/adaptor.go",
    "content": "package serialport\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"go.bug.st/serial\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// configuration contains all changeable attributes of the driver.\ntype configuration struct {\n\tname     string\n\tbaudRate int\n}\n\n// Adaptor represents a Gobot Adaptor for the Serial Communication\ntype Adaptor struct {\n\tport string\n\tcfg  *configuration\n\n\tsp          io.ReadWriteCloser\n\tconnectFunc func(string, int) (io.ReadWriteCloser, error)\n}\n\n// NewAdaptor returns a new adaptor given a port for the serial communication\nfunc NewAdaptor(port string, opts ...optionApplier) *Adaptor {\n\tcfg := configuration{\n\t\tname:     gobot.DefaultName(\"Serial\"),\n\t\tbaudRate: 115200,\n\t}\n\n\ta := Adaptor{\n\t\tcfg:  &cfg,\n\t\tport: port,\n\t\tconnectFunc: func(port string, baudRate int) (io.ReadWriteCloser, error) {\n\t\t\treturn serial.Open(port, &serial.Mode{BaudRate: baudRate})\n\t\t},\n\t}\n\n\tfor _, o := range opts {\n\t\to.apply(a.cfg)\n\t}\n\n\treturn &a\n}\n\n// WithName is used to replace the default name of the driver.\nfunc WithName(name string) optionApplier {\n\treturn nameOption(name)\n}\n\n// WithName is used to replace the default name of the driver.\nfunc WithBaudRate(baudRate int) optionApplier {\n\treturn baudRateOption(baudRate)\n}\n\n// Name returns the adaptors name\nfunc (a *Adaptor) Name() string {\n\treturn a.cfg.name\n}\n\n// SetName sets the adaptors name\n// Deprecated: Please use option [serialport.WithName] instead.\nfunc (a *Adaptor) SetName(n string) {\n\tWithName(n).apply(a.cfg)\n}\n\n// Connect initiates a connection to the serial port.\nfunc (a *Adaptor) Connect() error {\n\tif a.sp != nil {\n\t\treturn fmt.Errorf(\"serial port is already connected, try reconnect or run disconnect first\")\n\t}\n\n\tsp, err := a.connectFunc(a.port, a.cfg.baudRate)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ta.sp = sp\n\treturn nil\n}\n\n// Finalize finalizes the adaptor by disconnect\nfunc (a *Adaptor) Finalize() error {\n\treturn a.Disconnect()\n}\n\n// Disconnect terminates the connection to the port.\nfunc (a *Adaptor) Disconnect() error {\n\tif a.sp != nil {\n\t\tif err := a.sp.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ta.sp = nil\n\t}\n\treturn nil\n}\n\n// Reconnect attempts to reconnect to the port. If the port is connected it will first close\n// that connection and then establish a new connection.\nfunc (a *Adaptor) Reconnect() error {\n\tif a.sp != nil {\n\t\tif err := a.Disconnect(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn a.Connect()\n}\n\n// Port returns the adaptors port\nfunc (a *Adaptor) Port() string { return a.port }\n\n// IsConnected returns the connection state\nfunc (a *Adaptor) IsConnected() bool {\n\treturn a.sp != nil\n}\n\n// SerialRead reads from the port to the given reference\nfunc (a *Adaptor) SerialRead(pData []byte) (int, error) {\n\treturn a.sp.Read(pData)\n}\n\n// SerialWrite writes to the port\nfunc (a *Adaptor) SerialWrite(data []byte) (int, error) {\n\treturn a.sp.Write(data)\n}\n"
  },
  {
    "path": "platforms/serialport/adaptor_options.go",
    "content": "package serialport\n\n// optionApplier needs to be implemented by each configurable option type\ntype optionApplier interface {\n\tapply(cfg *configuration)\n}\n\n// nameOption is the type for applying another name to the configuration\ntype nameOption string\n\n// baudRateOption is the type for applying another baud rate than the default 115200\ntype baudRateOption int\n\nfunc (o nameOption) String() string {\n\treturn \"name option for Serial Port adaptors\"\n}\n\nfunc (o baudRateOption) String() string {\n\treturn \"baud rate option for Serial Port adaptors\"\n}\n\nfunc (o nameOption) apply(cfg *configuration) {\n\tcfg.name = string(o)\n}\n\nfunc (o baudRateOption) apply(cfg *configuration) {\n\tcfg.baudRate = int(o)\n}\n"
  },
  {
    "path": "platforms/serialport/adaptor_options_test.go",
    "content": "package serialport\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestWithName(t *testing.T) {\n\t// This is a general test, that options are applied by using the WithName() option.\n\t// All other configuration options can also be tested by With..(val).apply(cfg).\n\t// arrange & act\n\tconst newName = \"new name\"\n\ta := NewAdaptor(\"port\", WithName(newName))\n\t// assert\n\tassert.Equal(t, newName, a.cfg.name)\n}\n\nfunc TestWithBaudRate(t *testing.T) {\n\t// arrange\n\tnewBaudRate := 5432\n\tcfg := &configuration{baudRate: 1234}\n\t// act\n\tWithBaudRate(newBaudRate).apply(cfg)\n\t// assert\n\tassert.Equal(t, newBaudRate, cfg.baudRate)\n}\n"
  },
  {
    "path": "platforms/serialport/adaptor_test.go",
    "content": "package serialport\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.Adaptor = (*Adaptor)(nil)\n\nfunc initTestAdaptor() (*Adaptor, *nullReadWriteCloser) {\n\ta := NewAdaptor(\"/dev/null\")\n\trwc := newNullReadWriteCloser()\n\n\ta.connectFunc = func(string, int) (io.ReadWriteCloser, error) {\n\t\treturn rwc, nil\n\t}\n\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, rwc\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor(\"/dev/null\")\n\tassert.Equal(t, \"/dev/null\", a.Port())\n\trequire.NotNil(t, a.cfg)\n\tassert.Equal(t, 115200, a.cfg.baudRate)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"Serial\"))\n}\n\nfunc TestSerialRead(t *testing.T) {\n\ttests := map[string]struct {\n\t\treadDataBuffer []byte\n\t\tsimReadErr     bool\n\t\twantCount      int\n\t\twantErr        string\n\t}{\n\t\t\"read_ok\": {\n\t\t\treadDataBuffer: []byte{0, 0},\n\t\t\twantCount:      2,\n\t\t},\n\t\t\"error_read\": {\n\t\t\treadDataBuffer: []byte{},\n\t\t\tsimReadErr:     true,\n\t\t\twantErr:        \"read error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta, rwc := initTestAdaptor()\n\t\t\trwc.simulateReadErr = tc.simReadErr\n\t\t\t// act\n\t\t\tgotCount, err := a.SerialRead(tc.readDataBuffer)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t} else {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantCount, gotCount)\n\t\t})\n\t}\n}\n\nfunc TestSerialWrite(t *testing.T) {\n\ttests := map[string]struct {\n\t\twriteDataBuffer []byte\n\t\tsimWriteErr     bool\n\t\twantCount       int\n\t\twantWritten     []byte\n\t\twantErr         string\n\t}{\n\t\t\"write_ok\": {\n\t\t\twriteDataBuffer: []byte{1, 3, 6},\n\t\t\twantWritten:     []byte{1, 3, 6},\n\t\t\twantCount:       3,\n\t\t},\n\t\t\"error_write\": {\n\t\t\twriteDataBuffer: []byte{},\n\t\t\tsimWriteErr:     true,\n\t\t\twantErr:         \"write error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta, rwc := initTestAdaptor()\n\t\t\trwc.simulateWriteErr = tc.simWriteErr\n\t\t\t// act\n\t\t\tgotCount, err := a.SerialWrite(tc.writeDataBuffer)\n\t\t\t// assert\n\t\t\tif tc.wantErr == \"\" {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, tc.wantWritten, rwc.written)\n\t\t\t} else {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantCount, gotCount)\n\t\t})\n\t}\n}\n\nfunc TestConnect(t *testing.T) {\n\t// arrange\n\ta, _ := initTestAdaptor()\n\trequire.True(t, a.IsConnected())\n\t// act & assert\n\trequire.EqualError(t, a.Connect(), \"serial port is already connected, try reconnect or run disconnect first\")\n\t// re-arrange error\n\ta.sp = nil\n\ta.connectFunc = func(string, int) (io.ReadWriteCloser, error) {\n\t\treturn nil, errors.New(\"connect error\")\n\t}\n\t// act & assert\n\trequire.ErrorContains(t, a.Connect(), \"connect error\")\n\tassert.False(t, a.IsConnected())\n}\n\nfunc TestReconnect(t *testing.T) {\n\t// arrange\n\ta, _ := initTestAdaptor()\n\trequire.NotNil(t, a.sp)\n\t// act & assert\n\trequire.NoError(t, a.Reconnect())\n\trequire.NotNil(t, a.sp)\n\t// act & assert\n\trequire.NoError(t, a.Disconnect())\n\trequire.Nil(t, a.sp)\n\t// act & assert\n\trequire.NoError(t, a.Reconnect())\n\trequire.NotNil(t, a.sp)\n}\n\nfunc TestFinalize(t *testing.T) {\n\t// arrange\n\ta, rwc := initTestAdaptor()\n\t// act & assert\n\trequire.NoError(t, a.Finalize())\n\tassert.False(t, a.IsConnected())\n\t// re-arrange error\n\trwc.simulateCloseErr = true\n\trequire.NoError(t, a.Connect())\n\t// act & assert\n\trequire.ErrorContains(t, a.Finalize(), \"close error\")\n}\n"
  },
  {
    "path": "platforms/serialport/doc.go",
    "content": "/*\nPackage serialport provides the Gobot adaptor for serial communication with drivers.\n\nFor further information refer to readme:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/serialport/README.md\n*/\npackage serialport // import \"gobot.io/x/gobot/v2/platforms/serialport\"\n"
  },
  {
    "path": "platforms/serialport/helpers_test.go",
    "content": "package serialport\n\nimport \"fmt\"\n\ntype nullReadWriteCloser struct {\n\twritten          []byte\n\tsimulateReadErr  bool\n\tsimulateWriteErr bool\n\tsimulateCloseErr bool\n}\n\nfunc newNullReadWriteCloser() *nullReadWriteCloser {\n\treturn &nullReadWriteCloser{}\n}\n\nfunc (rwc *nullReadWriteCloser) Write(data []byte) (int, error) {\n\tif rwc.simulateWriteErr {\n\t\treturn 0, fmt.Errorf(\"write error\")\n\t}\n\trwc.written = append(rwc.written, data...)\n\treturn len(data), nil\n}\n\nfunc (rwc *nullReadWriteCloser) Read(p []byte) (int, error) {\n\tif rwc.simulateReadErr {\n\t\treturn 0, fmt.Errorf(\"read error\")\n\t}\n\treturn len(p), nil\n}\n\nfunc (rwc *nullReadWriteCloser) Close() error {\n\tif rwc.simulateCloseErr {\n\t\treturn fmt.Errorf(\"close error\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "platforms/sphero/bb8/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/sphero/bb8/README.md",
    "content": "# Sphero BB-8\n\nThe Sphero BB-8 is a toy robot from Sphero that is controlled using Bluetooth LE. For more information, go to [http://www.sphero.com/bb8](http://www.sphero.com/bb8)\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"os\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n  \"gobot.io/x/gobot/v2/drivers/ble/sphero/bb8\"\n)\n\nfunc main() {\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n  bb8 := bb8.NewBB8Driver(bleAdaptor)\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      r := uint8(gobot.Rand(255))\n      g := uint8(gobot.Rand(255))\n      b := uint8(gobot.Rand(255))\n      bb8.SetRGB(r, g, b)\n    })\n  }\n\n  robot := gobot.NewRobot(\"bb\",\n    []gobot.Connection{bleAdaptor},\n    []gobot.Device{bb8},\n    work,\n  )\n\n  err := robot.Start()\n  if err != nil {\n    fmt.Println(err)\n  }\n}\n```\n\n## How to Connect\n\nThe Sphero BB-8 is a Bluetooth LE device.\n\nYou need to know the BLE ID of the BB-8 you want to connect to. The Gobot BLE client adaptor also lets you connect by\nfriendly name, aka \"BB-1247\".\n\n### OSX\n\nTo run any of the Gobot BLE code you must use the `GODEBUG=cgocheck=0` flag in order to get around some of the issues in\nthe CGo-based implementation.\n\nIf you connect by name, then you do not need to worry about the Bluetooth LE ID. However, if you want to connect by ID,\nOS X uses its own Bluetooth ID system which is different from the IDs used on Linux. The code calls thru the XPC interfaces\nprovided by OSX, so as a result does not need to run under sudo.\n\nFor example:\n\n`GODEBUG=cgocheck=0 go run examples/bb8.go BB-1247`\n\n### Ubuntu\n\nOn Linux the BLE code will need to run as a root user account. The easiest way to accomplish this is probably to use\n`go build` to build your program, and then to run the requesting executable using `sudo`.\n\nFor example:\n\n```sh\ngo build examples/bb8.go\nsudo ./bb8 BB-1247\n```\n\n### Windows\n\nHopefully coming soon...\n"
  },
  {
    "path": "platforms/sphero/ollie/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/sphero/ollie/README.md",
    "content": "# Sphero Ollie\n\nThe Sphero Ollie is a toy robot from Sphero that is controlled using Bluetooth LE. For more information, go to [http://www.sphero.com/ollie](http://www.sphero.com/ollie)\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"os\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n  \"gobot.io/x/gobot/v2/drivers/ble/sphero/ollie\"\n)\n\nfunc main() {\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n  ollie := ollie.NewOllieDriver(bleAdaptor)\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      r := uint8(gobot.Rand(255))\n      g := uint8(gobot.Rand(255))\n      b := uint8(gobot.Rand(255))\n      ollie.SetRGB(r, g, b)\n    })\n  }\n\n  robot := gobot.NewRobot(\"ollieBot\",\n    []gobot.Connection{bleAdaptor},\n    []gobot.Device{ollie},\n    work,\n  )\n\n  err := robot.Start()\n  if err != nil {\n    fmt.Println(err)\n  }\n}\n```\n\n## How to Connect\n\nThe Sphero Ollie is a Bluetooth LE device.\n\nYou need to know the BLE ID of the Ollie you want to connect to. The Gobot BLE client adaptor also lets you connect by\nfriendly name, aka \"2B-1247\".\n\n### OSX\n\nTo run any of the Gobot BLE code you must use the `GODEBUG=cgocheck=0` flag in order to get around some of the issues in\nthe CGo-based implementation.\n\nIf you connect by name, then you do not need to worry about the Bluetooth LE ID. However, if you want to connect by ID,\nOS X uses its own Bluetooth ID system which is different from the IDs used on Linux. The code calls thru the XPC interfaces\nprovided by OSX, so as a result does not need to run under sudo.\n\nFor example:\n\n`GODEBUG=cgocheck=0 go run examples/ollie.go 2B-1247`\n\n### Ubuntu\n\nOn Linux the BLE code will need to run as a root user account. The easiest way to accomplish this is probably to use\n`go build` to build your program, and then to run the requesting executable using `sudo`.\n\nFor example:\n\n```sh\ngo build examples/ollie.go\nsudo ./minidrone 2B-1247\n```\n\n### Windows\n\nHopefully coming soon...\n"
  },
  {
    "path": "platforms/sphero/sphero/LICENSE",
    "content": "Copyright (c) 2013-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/sphero/sphero/README.md",
    "content": "# Sphero\n\nSphero is a sophisticated and programmable robot housed in a polycarbonate sphere shell.\n\nThe Gobot Serial Adaptor & Sphero Driver makes it easy to interact with Sphero using Go. Once you have your Sphero setup\nand connected to your computer you can start writing code to make Sphero move, change direction, speed and colors, or\ndetect Sphero events and execute some code when they occur.\n\nLearn more about the Sphero robot go here: <http://www.gosphero.com/>\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How To Connect\n\n### OSX\n\nIn order to allow Gobot running on your Mac to access the Sphero, go to \"Bluetooth > Open Bluetooth Preferences > Sharing Setup\"\nand make sure that \"Bluetooth Sharing\" is checked.\n\nNow you must pair with the Sphero. Open System Preferences > Bluetooth. Now with the Bluetooth devices windows open, smack\nthe Sphero until it starts flashing three colors. You should see \"Sphero-XXX\" pop up as available devices where \"XXX\" is\nthe first letter of the three colors the sphero is flashing. Pair with that device. Once paired your Sphero will be accessable\nthrough the serial device similarly named as `/dev/tty.Sphero-XXX-RN-SPP`\n\n### Ubuntu\n\nConnecting to the Sphero from Ubuntu or any other Linux-based OS can be done entirely from the command line using [Gort](http://gort.io/)\nCLI commands. Here are the steps.\n\nFind the address of the Sphero, by using:\n\n```sh\ngort scan bluetooth\n```\n\nPair to Sphero using this command (substituting the actual address of your Sphero):\n\n```sh\ngort bluetooth pair <address>\n```\n\nConnect to the Sphero using this command (substituting the actual address of your Sphero):\n\n```sh\ngort bluetooth connect <address>\n```\n\n### Windows\n\nYou should be able to pair your Sphero using your normal system tray applet for Bluetooth, and then connect to the COM\nport that is bound to the device, such as `COM3`.\n\n## How to Use\n\nExample of a simple program that makes the Sphero roll.\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/drivers/serial\"\n  \"gobot.io/x/gobot/v2/platforms/serialport\"\n)\n\nfunc main() {\n  adaptor := serialport.NewAdaptor(\"/dev/rfcomm0\")\n  driver := sphero.NewSpheroDriver(adaptor)\n\n  work := func() {\n    gobot.Every(3*time.Second, func() {\n      driver.Roll(30, uint16(gobot.Rand(360)))\n    })\n  }\n\n  robot := gobot.NewRobot(\"sphero\",\n    []gobot.Connection{adaptor},\n    []gobot.Device{driver},\n    work,\n  )\n\n  if err := robot.Start(); err != nil {\n\t\tpanic(err)\n\t}\n}\n```\n"
  },
  {
    "path": "platforms/sphero/sprkplus/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/sphero/sprkplus/README.md",
    "content": "# Sphero SPRK+\n\nThe Sphero SPRK+ is a toy robot from Sphero that is controlled using Bluetooth LE. For more information, go to [http://www.sphero.com/sprk-plus](http://www.sphero.com/sprk-plus)\n\n## How to Install\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\n```go\npackage main\n\nimport (\n  \"os\"\n  \"time\"\n\n  \"gobot.io/x/gobot/v2\"\n  \"gobot.io/x/gobot/v2/platforms/bleclient\"\n  \"gobot.io/x/gobot/v2/drivers/ble/sphero\"\n)\n\nfunc main() {\n  bleAdaptor := bleclient.NewAdaptor(os.Args[1])\n  sprk := sphero.NewSPRKPlusDriver(bleAdaptor)\n\n  work := func() {\n    gobot.Every(1*time.Second, func() {\n      r := uint8(gobot.Rand(255))\n      g := uint8(gobot.Rand(255))\n      b := uint8(gobot.Rand(255))\n      sprk.SetRGB(r, g, b)\n    })\n  }\n\n  robot := gobot.NewRobot(\"sprk\",\n    []gobot.Connection{bleAdaptor},\n    []gobot.Device{sprk},\n    work,\n  )\n\n  err := robot.Start()\n  if err != nil {\n    fmt.Println(err)\n  }\n}\n```\n\n## How to Connect\n\nThe Sphero SPRK+ is a Bluetooth LE device.\n\nYou need to know the BLE ID of the SPRK+ you want to connect to. The Gobot BLE client adaptor also lets you connect by\nfriendly name, aka \"SK-1247\".\n\n### OSX\n\nTo run any of the Gobot BLE code you must use the `GODEBUG=cgocheck=0` flag in order to get around some of the issues in\nthe CGo-based implementation.\n\nIf you connect by name, then you do not need to worry about the Bluetooth LE ID. However, if you want to connect by ID,\nOS X uses its own Bluetooth ID system which is different from the IDs used on Linux. The code calls thru the XPC interfaces\nprovided by OSX, so as a result does not need to run under sudo.\n\nFor example:\n\n`GODEBUG=cgocheck=0 go run examples/sprkplus.go SK-1247`\n\n### Ubuntu\n\nOn Linux the BLE code will need to run as a root user account. The easiest way to accomplish this is probably to use\n`go build` to build your program, and then to run the requesting executable using `sudo`.\n\nFor example:\n\n```sh\ngo build examples/sprkplus.go\nsudo ./sprkplus SK-1247\n```\n\n### Windows\n\nHopefully coming soon...\n"
  },
  {
    "path": "platforms/upboard/README.md",
    "content": "# Upboard\n\nThis package contains the Gobot adaptor for the [UP2]() IoT platforms.\n\nThis package currently supports the following hardware:\n- UP2 (Squared)\n"
  },
  {
    "path": "platforms/upboard/up2/LICENSE",
    "content": "Copyright (c) 2014-2018 The Hybrid Group\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "platforms/upboard/up2/README.md",
    "content": "# UP2\n\nThe UP2 Board aka \"Up Squared\" is a single board SoC computer based on the Intel Apollo Lake processor. It has built-in\nGPIO, PWM, SPI, and I2C interfaces.\n\nFor more info about the UP2 Board, go to [http://www.up-board.org/upsquared/](http://www.up-board.org/upsquared/).\n\n## How to Install\n\n### Update operating system and BIOS on UP2 board\n\nWe recommend updating to the latest Ubuntu 16.04 and BIOS v3.3 when using the UP2 board. To update your UP2 OS go to:\n\n<https://downloads.up-community.org/download/up-squared-iot-grove-development-kit-ubuntu-16-04-server-image/>\n\nTo update your UP2 BIOS, go to:\n\n<https://downloads.up-community.org/download/up-squared-uefi-bios-v3-3/>\n\nOnce your UP2 has been updated, you will need to provide permission to the `upsquared` user to access the GPIO or I2C\nsubsystems on the board.\n\n### Configuring GPIO on UP2 board\n\nTo access the GPIO subsystem, you will need to create a new group, add your user to the group, and then add a UDEV rule.\n\nFirst, run the following commands on the board itself:\n\n```sh\nsudo groupadd gpio\nsudo adduser upsquared gpio\n```\n\nNow, add a new UDEV rule to the UP2 board. Add the following text as a new UDEV rule named `/etc/udev/rules.d/99-gpio.rules`:\n\n```sh\nSUBSYSTEM==\"gpio*\", PROGRAM=\"/bin/sh -c '\\\n        chown -R root:gpiouser /sys/class/gpio && chmod -R 770 /sys/class/gpio;\\\n        chown -R root:gpiouser /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\\\n        chown -R root:gpiouser /sys$devpath && chmod -R 770 /sys$devpath\\\n'\"\n```\n\n### Configuring built-in LEDs on UP2 board\n\nTo use the built-in LEDs you will need to create a new group, add your user to the group, and then add a UDEV rule.\n\nFirst, run the following commands on the board itself:\n\n```sh\nsudo groupadd leds\nsudo adduser upsquared leds\n```\n\nNow add the following text as a new UDEV rule named `/etc/udev/rules.d/99-leds.rules`:\n\n```sh\nSUBSYSTEM==\"leds*\", PROGRAM=\"/bin/sh -c '\\\n        chown -R root:leds /sys/class/leds && chmod -R 770 /sys/class/leds;\\\n        chown -R root:leds /sys/devices/platform/up-pinctrl/leds && chmod -R 770 /sys/devices/platform/up-pinctrl/leds;\\\n        chown -R root:leds /sys/devices/platform/AANT0F01:00/upboard-led.* && chmod -R 770 /sys/devices/platform/AANT0F01:00/upboard-led.*;\\\n'\"\n```\n\n### Configuring I2C on UP2 board\n\nTo access the I2C subsystem, run the following command:\n\n```sh\nsudo usermod -aG i2c upsquared\n```\n\nYou should reboot your UP2 board after making these changes for them to take effect.\n\n**IMPORTANT NOTE REGARDING I2C:**\nThe current UP2 firmware is not able to scan for I2C devices using the `i2cdetect` command line tool. If you run this tool,\nit will cause the I2C subsystem to malfunction until you reboot your system. That means at this time, do not use `i2cdetect`\non the UP2 board.\n\n### Local setup\n\nPlease refer to the main [README.md](https://github.com/hybridgroup/gobot/blob/release/README.md)\n\n## How to Use\n\nThe pin numbering used by your Gobot program should match the way your board is labeled right on the board itself.\n\n```go\nr := up2.NewAdaptor()\nled := gpio.NewLedDriver(r, \"13\")\n```\n\nYou can also use the values `up2.LEDRed`, `up2.LEDBlue`, `up2.LEDGreen`, and `up2.LEDYellow` as pin reference to access\nthe 4 built-in LEDs. For example:\n\n```go\nr := up2.NewAdaptor()\nled := gpio.NewLedDriver(r, up2.LEDRed)\n```\n\n## How to Connect\n\n### Compiling\n\nCompile your Gobot program on your workstation like this:\n\n```sh\nGOARCH=amd64 GOOS=linux go build examples/up2_blink.go\n```\n\nOnce you have compiled your code, you can you can upload your program and execute it on the UP2 from your workstation using\nthe `scp` and `ssh` commands like this:\n\n```sh\nscp up2_blink upsquared@192.168.1.xxx:/home/upsquared/\nssh -t upsquared@192.168.1.xxx \"./up2_blink\"\n```\n"
  },
  {
    "path": "platforms/upboard/up2/adaptor.go",
    "content": "package up2\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"sync\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\nconst (\n\t// LEDRed is the built-in red LED.\n\tLEDRed = \"red\"\n\t// LEDBlue is the built-in blue LED.\n\tLEDBlue = \"blue\"\n\t// LEDGreen is the built-in green LED.\n\tLEDGreen = \"green\"\n\t// LEDYellow is the built-in yellow LED.\n\tLEDYellow = \"yellow\"\n\n\tdefaultI2cBusNumber = 5\n\n\tdefaultSpiBusNumber  = 0\n\tdefaultSpiChipNumber = 0\n\tdefaultSpiMode       = 0\n\tdefaultSpiBitsNumber = 8\n\tdefaultSpiMaxSpeed   = 500000\n)\n\ntype sysfsPin struct {\n\tpin    int\n\tpwmPin int\n}\n\n// Adaptor represents a Gobot Adaptor for the Upboard UP2\ntype Adaptor struct {\n\t*adaptors.DigitalPinsAdaptor\n\t*adaptors.PWMPinsAdaptor\n\t*adaptors.I2cBusAdaptor\n\t*adaptors.SpiBusAdaptor\n\n\tname    string\n\tsys     *system.Accesser\n\tmutex   sync.Mutex\n\tpinMap  map[string]sysfsPin\n\tledPath string\n}\n\n// NewAdaptor creates a UP2 Adaptor\n//\n// Optional parameters:\n//\n//\tadaptors.WithGpioCdevAccess():\tuse character device driver instead of sysfs\n//\tadaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi):\tuse GPIO's instead of /dev/spidev#.#\n//\n// Further optional parameters for:\n//\n//\tGPIO, see [adaptors.NewDigitalPinsAdaptor]\n//\tI2C, see [adaptors.NewI2cBusAdaptor]\n//\tPWM, see [adaptors.NewPWMPinsAdaptor]\n//\tSPI, see [adaptors.NewSpiBusAdaptor]\nfunc NewAdaptor(opts ...interface{}) *Adaptor {\n\tsys := system.NewAccesser(system.WithDigitalPinSysfsAccess())\n\ta := &Adaptor{\n\t\tname:    gobot.DefaultName(\"UP2\"),\n\t\tsys:     sys,\n\t\tledPath: \"/sys/class/leds/upboard:%s:/brightness\",\n\t\tpinMap:  fixedPins,\n\t}\n\n\tvar digitalPinsOpts []adaptors.DigitalPinsOptionApplier\n\tvar pwmPinsOpts []adaptors.PwmPinsOptionApplier\n\tvar i2cBusOpts []adaptors.I2CBusOptionApplier\n\tvar spiBusOpts []adaptors.SpiBusOptionApplier\n\tfor _, opt := range opts {\n\t\tswitch o := opt.(type) {\n\t\tcase adaptors.DigitalPinsOptionApplier:\n\t\t\tdigitalPinsOpts = append(digitalPinsOpts, o)\n\t\tcase adaptors.PwmPinsOptionApplier:\n\t\t\tpwmPinsOpts = append(pwmPinsOpts, o)\n\t\tcase adaptors.I2CBusOptionApplier:\n\t\t\ti2cBusOpts = append(i2cBusOpts, o)\n\t\tcase adaptors.SpiBusOptionApplier:\n\t\t\tspiBusOpts = append(spiBusOpts, o)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"'%s' can not be applied on adaptor '%s'\", opt, a.name))\n\t\t}\n\t}\n\n\t// Valid bus numbers are [5,6] which corresponds to /dev/i2c-5 through /dev/i2c-6.\n\ti2cBusNumberValidator := adaptors.NewBusNumberValidator([]int{5, 6})\n\t// Valid bus numbers are [0,1] which corresponds to /dev/spidev0.x through /dev/spidev1.x.\n\t// x is the chip number <255\n\tspiBusNumberValidator := adaptors.NewBusNumberValidator([]int{0, 1})\n\n\ta.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.translateDigitalPin, digitalPinsOpts...)\n\ta.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.translatePWMPin, pwmPinsOpts...)\n\ta.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber, i2cBusOpts...)\n\ta.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber,\n\t\tdefaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed, a.DigitalPinsAdaptor, spiBusOpts...)\n\treturn a\n}\n\n// Name returns the name of the Adaptor\nfunc (a *Adaptor) Name() string { return a.name }\n\n// SetName sets the name of the Adaptor\nfunc (a *Adaptor) SetName(n string) { a.name = n }\n\n// Connect create new connection to board and pins.\nfunc (a *Adaptor) Connect() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\tif err := a.SpiBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.I2cBusAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := a.PWMPinsAdaptor.Connect(); err != nil {\n\t\treturn err\n\t}\n\treturn a.DigitalPinsAdaptor.Connect()\n}\n\n// Finalize closes connection to board and pins\nfunc (a *Adaptor) Finalize() error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\terr := a.DigitalPinsAdaptor.Finalize()\n\n\tif e := a.PWMPinsAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.I2cBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif e := a.SpiBusAdaptor.Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\treturn err\n}\n\n// DigitalWrite writes digital value to the specified pin.\nfunc (a *Adaptor) DigitalWrite(id string, val byte) error {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\n\t// is it one of the built-in LEDs?\n\tif id == LEDRed || id == LEDBlue || id == LEDGreen || id == LEDYellow {\n\t\tpinPath := fmt.Sprintf(a.ledPath, id)\n\t\tfi, err := a.sys.OpenFile(pinPath, os.O_WRONLY|os.O_APPEND, 0o666)\n\t\tdefer fi.Close() //nolint:staticcheck // for historical reasons\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = fi.WriteString(strconv.Itoa(int(val)))\n\t\treturn err\n\t}\n\n\treturn a.DigitalPinsAdaptor.DigitalWrite(id, val)\n}\n\nfunc (a *Adaptor) translateDigitalPin(id string) (string, int, error) {\n\tif val, ok := a.pinMap[id]; ok {\n\t\treturn \"\", val.pin, nil\n\t}\n\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a digital pin\", id)\n}\n\nfunc (a *Adaptor) translatePWMPin(id string) (string, int, error) {\n\tsysPin, ok := a.pinMap[id]\n\tif !ok {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a pin\", id)\n\t}\n\tif sysPin.pwmPin == -1 {\n\t\treturn \"\", -1, fmt.Errorf(\"'%s' is not a valid id for a PWM pin\", id)\n\t}\n\treturn \"/sys/class/pwm/pwmchip0\", sysPin.pwmPin, nil\n}\n"
  },
  {
    "path": "platforms/upboard/up2/adaptor_test.go",
    "content": "package up2\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n\t\"gobot.io/x/gobot/v2/drivers/gpio\"\n\t\"gobot.io/x/gobot/v2/drivers/i2c\"\n\t\"gobot.io/x/gobot/v2/drivers/spi\"\n\t\"gobot.io/x/gobot/v2/platforms/adaptors\"\n\t\"gobot.io/x/gobot/v2/system\"\n)\n\n// make sure that this Adaptor fulfills all the required interfaces\nvar (\n\t_ gobot.Adaptor               = (*Adaptor)(nil)\n\t_ gobot.DigitalPinnerProvider = (*Adaptor)(nil)\n\t_ gobot.PWMPinnerProvider     = (*Adaptor)(nil)\n\t_ gpio.DigitalReader          = (*Adaptor)(nil)\n\t_ gpio.DigitalWriter          = (*Adaptor)(nil)\n\t_ gpio.PwmWriter              = (*Adaptor)(nil)\n\t_ gpio.ServoWriter            = (*Adaptor)(nil)\n\t_ i2c.Connector               = (*Adaptor)(nil)\n\t_ spi.Connector               = (*Adaptor)(nil)\n)\n\nconst (\n\tpwmDir           = \"/sys/class/pwm/pwmchip0/\" //nolint:gosec // false positive\n\tpwmExportPath    = pwmDir + \"export\"\n\tpwmUnexportPath  = pwmDir + \"unexport\"\n\tpwmEnablePath    = pwmDir + \"pwm0/enable\"\n\tpwmDutyCyclePath = pwmDir + \"pwm0/duty_cycle\"\n\tpwmPeriodPath    = pwmDir + \"pwm0/period\"\n\tpwmPolarityPath  = pwmDir + \"pwm0/polarity\"\n)\n\nvar pwmMockPaths = []string{\n\tpwmExportPath,\n\tpwmUnexportPath,\n\tpwmEnablePath,\n\tpwmPeriodPath,\n\tpwmDutyCyclePath,\n\tpwmPolarityPath,\n}\n\nvar gpioMockPaths = []string{\n\t\"/sys/class/gpio/export\",\n\t\"/sys/class/gpio/unexport\",\n\t\"/sys/class/gpio/gpio462/value\",\n\t\"/sys/class/gpio/gpio462/direction\",\n\t\"/sys/class/gpio/gpio432/value\",\n\t\"/sys/class/gpio/gpio432/direction\",\n\t\"/sys/class/leds/upboard:green:/brightness\",\n}\n\nfunc initConnectedTestAdaptorWithMockedFilesystem(mockPaths []string) (*Adaptor, *system.MockFilesystem) {\n\ta := NewAdaptor()\n\tfs := a.sys.UseMockFilesystem(mockPaths)\n\tif err := a.Connect(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn a, fs\n}\n\nfunc TestNewAdaptor(t *testing.T) {\n\t// arrange & act\n\ta := NewAdaptor()\n\t// assert\n\tassert.IsType(t, &Adaptor{}, a)\n\tassert.True(t, strings.HasPrefix(a.Name(), \"UP2\"))\n\tassert.NotNil(t, a.sys)\n\tassert.Equal(t, \"/sys/class/leds/upboard:%s:/brightness\", a.ledPath)\n\tassert.NotNil(t, a.DigitalPinsAdaptor)\n\tassert.NotNil(t, a.PWMPinsAdaptor)\n\tassert.NotNil(t, a.I2cBusAdaptor)\n\tassert.NotNil(t, a.SpiBusAdaptor)\n\tassert.True(t, a.sys.HasDigitalPinSysfsAccess())\n\t// act & assert\n\ta.SetName(\"NewName\")\n\tassert.Equal(t, \"NewName\", a.Name())\n}\n\nfunc TestDigitalIO(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(gpioMockPaths)\n\n\t_ = a.DigitalWrite(\"7\", 1)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio462/value\"].Contents)\n\n\tfs.Files[\"/sys/class/gpio/gpio432/value\"].Contents = \"1\"\n\ti, _ := a.DigitalRead(\"13\")\n\tassert.Equal(t, 1, i)\n\n\t_ = a.DigitalWrite(\"green\", 1)\n\tassert.Equal(t,\n\t\t\"1\",\n\t\tfs.Files[\"/sys/class/leds/upboard:green:/brightness\"].Contents,\n\t)\n\n\trequire.ErrorContains(t, a.DigitalWrite(\"99\", 1), \"'99' is not a valid id for a digital pin\")\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestPWMWrite(t *testing.T) {\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\t// act\n\terr := a.PwmWrite(\"32\", 100)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"0\", fs.Files[pwmExportPath].Contents)\n\tassert.Equal(t, \"1\", fs.Files[pwmEnablePath].Contents)\n\tassert.Equal(t, \"3921568\", fs.Files[pwmDutyCyclePath].Contents)\n\tassert.Equal(t, \"10000000\", fs.Files[pwmPeriodPath].Contents) // pwmPeriodDefault\n\tassert.Equal(t, \"normal\", fs.Files[pwmPolarityPath].Contents)\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestServoWrite(t *testing.T) {\n\t// arrange: prepare 50Hz for servos\n\tconst (\n\t\tpin         = \"32\"\n\t\tfiftyHzNano = 20000000\n\t)\n\ta := NewAdaptor(adaptors.WithPWMDefaultPeriodForPin(pin, fiftyHzNano))\n\tfs := a.sys.UseMockFilesystem(pwmMockPaths)\n\trequire.NoError(t, a.Connect())\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\t// act & assert for 0° (min default value)\n\terr := a.ServoWrite(pin, 0)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[pwmPeriodPath].Contents)\n\tassert.Equal(t, \"500000\", fs.Files[pwmDutyCyclePath].Contents)\n\t// act & assert for 180° (max default value)\n\terr = a.ServoWrite(pin, 180)\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(fiftyHzNano), fs.Files[pwmPeriodPath].Contents)\n\tassert.Equal(t, \"2500000\", fs.Files[pwmDutyCyclePath].Contents)\n\n\trequire.NoError(t, a.Finalize())\n}\n\nfunc TestFinalizeErrorAfterGPIO(t *testing.T) {\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(gpioMockPaths)\n\n\trequire.NoError(t, a.DigitalWrite(\"7\", 1))\n\n\tfs.WithWriteError = true\n\n\terr := a.Finalize()\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestFinalizeErrorAfterPWM(t *testing.T) {\n\t// indirect test for PWM.Finalize() is called for the adaptor\n\t// arrange\n\ta, fs := initConnectedTestAdaptorWithMockedFilesystem(pwmMockPaths)\n\tfs.Files[pwmDutyCyclePath].Contents = \"0\"\n\tfs.Files[pwmPeriodPath].Contents = \"0\"\n\trequire.NoError(t, a.PwmWrite(\"32\", 1))\n\tfs.WithWriteError = true\n\t// act\n\terr := a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestSpiDefaultValues(t *testing.T) {\n\ta := NewAdaptor()\n\n\tassert.Equal(t, 0, a.SpiDefaultBusNumber())\n\tassert.Equal(t, 0, a.SpiDefaultMode())\n\tassert.Equal(t, int64(500000), a.SpiDefaultMaxSpeed())\n}\n\nfunc TestI2cDefaultBus(t *testing.T) {\n\ta := NewAdaptor()\n\tassert.Equal(t, 5, a.DefaultI2cBus())\n}\n\nfunc TestI2cFinalizeWithErrors(t *testing.T) {\n\t// arrange\n\ta := NewAdaptor()\n\ta.sys.UseMockSyscall()\n\tfs := a.sys.UseMockFilesystem([]string{\"/dev/i2c-5\"})\n\trequire.NoError(t, a.Connect())\n\tcon, err := a.GetI2cConnection(0xff, 5)\n\trequire.NoError(t, err)\n\t_, err = con.Write([]byte{0xbf})\n\trequire.NoError(t, err)\n\tfs.WithCloseError = true\n\t// act\n\terr = a.Finalize()\n\t// assert\n\trequire.ErrorContains(t, err, \"close error\")\n}\n\nfunc Test_translatePWMPin(t *testing.T) {\n\ttests := map[string]struct {\n\t\twantDir     string\n\t\twantChannel int\n\t\twantErr     error\n\t}{\n\t\t\"16\": {\n\t\t\twantDir:     \"/sys/class/pwm/pwmchip0\",\n\t\t\twantChannel: 3,\n\t\t},\n\t\t\"32\": {\n\t\t\twantDir:     \"/sys/class/pwm/pwmchip0\",\n\t\t\twantChannel: 0,\n\t\t},\n\t\t\"33\": {\n\t\t\twantDir:     \"/sys/class/pwm/pwmchip0\",\n\t\t\twantChannel: 1,\n\t\t},\n\t\t\"PWM0\": {\n\t\t\twantDir:     \"\",\n\t\t\twantChannel: -1,\n\t\t\twantErr:     fmt.Errorf(\"'PWM0' is not a valid id for a pin\"),\n\t\t},\n\t\t\"7\": {\n\t\t\twantDir:     \"\",\n\t\t\twantChannel: -1,\n\t\t\twantErr:     fmt.Errorf(\"'7' is not a valid id for a PWM pin\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAdaptor()\n\t\t\t// act\n\t\t\tdir, channel, err := a.translatePWMPin(name)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantDir, dir)\n\t\t\tassert.Equal(t, tc.wantChannel, channel)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "platforms/upboard/up2/doc.go",
    "content": "/*\nPackage up2 contains the Gobot adaptor for the Upboard UP2.\n\nFor further information refer to the UP2 README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/upboard/up2/README.md\n*/\npackage up2 // import \"gobot.io/x/gobot/v2/platforms/upboard/up2\"\n"
  },
  {
    "path": "platforms/upboard/up2/pinmap.go",
    "content": "package up2\n\nvar fixedPins = map[string]sysfsPin{\n\t\"7\": {\n\t\tpin:    462, // GPIO4\n\t\tpwmPin: -1,\n\t},\n\t\"13\": {\n\t\tpin:    432, // GPIO27\n\t\tpwmPin: -1,\n\t},\n\t\"15\": {\n\t\tpin:    431, // GPIO22\n\t\tpwmPin: -1,\n\t},\n\t\"16\": {\n\t\tpin:    471, // PWM3\n\t\tpwmPin: 3,\n\t},\n\t\"18\": {\n\t\tpin:    405, // GPIO24\n\t\tpwmPin: -1,\n\t},\n\t\"22\": {\n\t\tpin:    402, // GPIO25\n\t\tpwmPin: -1,\n\t},\n\t\"29\": {\n\t\tpin:    430, // GPIO5\n\t\tpwmPin: -1,\n\t},\n\t\"31\": {\n\t\tpin:    404, // GPIO6\n\t\tpwmPin: -1,\n\t},\n\t\"32\": {\n\t\tpin:    468, // PWM0\n\t\tpwmPin: 0,\n\t},\n\t\"33\": {\n\t\tpin:    469, // PWM1\n\t\tpwmPin: 1,\n\t},\n\t\"37\": {\n\t\tpin:    403, // GPIO26\n\t\tpwmPin: -1,\n\t},\n}\n"
  },
  {
    "path": "platforms/upboard/upboard.go",
    "content": "/*\nPackage upboard contains Gobot adaptors for the Upboard SoC boards.\n\nThis package currently supports the following hardware:\n- UP2 (Squared)\n\nFor further information refer to the Upboard README:\nhttps://github.com/hybridgroup/gobot/blob/release/platforms/upboard/README.md\n*/\npackage upboard\n"
  },
  {
    "path": "robot.go",
    "content": "package gobot\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\tmultierror \"github.com/hashicorp/go-multierror\"\n)\n\n// JSONRobot a JSON representation of a Robot.\ntype JSONRobot struct {\n\tName        string            `json:\"name\"`\n\tCommands    []string          `json:\"commands\"`\n\tConnections []*JSONConnection `json:\"connections\"`\n\tDevices     []*JSONDevice     `json:\"devices\"`\n}\n\n// NewJSONRobot returns a JSONRobot given a Robot.\nfunc NewJSONRobot(robot *Robot) *JSONRobot {\n\tjsonRobot := &JSONRobot{\n\t\tName:        robot.Name,\n\t\tCommands:    []string{},\n\t\tConnections: []*JSONConnection{},\n\t\tDevices:     []*JSONDevice{},\n\t}\n\n\tfor command := range robot.Commands() {\n\t\tjsonRobot.Commands = append(jsonRobot.Commands, command)\n\t}\n\n\trobot.Devices().Each(func(device Device) {\n\t\tjsonDevice := NewJSONDevice(device)\n\t\tjsonRobot.Connections = append(jsonRobot.Connections, NewJSONConnection(robot.Connection(jsonDevice.Connection)))\n\t\tjsonRobot.Devices = append(jsonRobot.Devices, jsonDevice)\n\t})\n\treturn jsonRobot\n}\n\n// Robot is a named entity that manages a collection of connections and devices.\n// It contains its own work routine and a collection of\n// custom commands to control a robot remotely via the Gobot api.\ntype Robot struct {\n\tCommander\n\tEventer\n\n\tName               string\n\tWork               func()\n\tconnections        *Connections\n\tdevices            *Devices\n\ttrap               func(chan os.Signal)\n\tAutoRun            bool\n\trunning            atomic.Value\n\tdone               chan bool\n\tworkRegistry       *RobotWorkRegistry\n\tWorkEveryWaitGroup *sync.WaitGroup\n\tWorkAfterWaitGroup *sync.WaitGroup\n}\n\n// Robots is a collection of Robot\ntype Robots []*Robot\n\n// Len returns the amount of Robots in the collection.\nfunc (r *Robots) Len() int {\n\treturn len(*r)\n}\n\n// Start calls the Start method of each Robot in the collection. We return on first error.\nfunc (r *Robots) Start(args ...interface{}) error {\n\tautoRun := true\n\tif args[0] != nil {\n\t\tvar ok bool\n\t\tif autoRun, ok = args[0].(bool); !ok {\n\t\t\t// we treat this as false\n\t\t\tautoRun = false\n\t\t}\n\t}\n\tfor _, robot := range *r {\n\t\tif err := robot.Start(autoRun); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Stop calls the Stop method of each Robot in the collection. We try to stop all robots and\n// collect the errors.\nfunc (r *Robots) Stop() error {\n\tvar err error\n\tfor _, robot := range *r {\n\t\tif e := robot.Stop(); e != nil {\n\t\t\terr = multierror.Append(err, e)\n\t\t}\n\t}\n\treturn err\n}\n\n// Each enumerates through the Robots and calls specified callback function.\nfunc (r *Robots) Each(f func(*Robot)) {\n\tfor _, robot := range *r {\n\t\tf(robot)\n\t}\n}\n\n// NewRobot returns a new Robot. It supports the following optional params:\n//\n//\tname:\tstring with the name of the Robot. A name will be automatically generated if no name is supplied.\n//\t[]Connection: Connections which are automatically started and stopped with the robot\n//\t[]Device: Devices which are automatically started and stopped with the robot\n//\tfunc(): The work routine the robot will execute once all devices and connections have been initialized and started\nfunc NewRobot(v ...interface{}) *Robot {\n\tr := &Robot{\n\t\tName:        fmt.Sprintf(\"%X\", Rand(int(^uint(0)>>1))),\n\t\tconnections: &Connections{},\n\t\tdevices:     &Devices{},\n\t\tdone:        make(chan bool, 1),\n\t\ttrap: func(c chan os.Signal) {\n\t\t\tsignal.Notify(c, os.Interrupt)\n\t\t},\n\t\tAutoRun:   true,\n\t\tWork:      nil,\n\t\tEventer:   NewEventer(),\n\t\tCommander: NewCommander(),\n\t}\n\n\tfor i := range v {\n\t\tswitch val := v[i].(type) {\n\t\tcase string:\n\t\t\tr.Name = val\n\t\tcase []Connection:\n\t\t\tlog.Println(\"Initializing connections...\")\n\t\t\tfor _, connection := range val {\n\t\t\t\tc := r.AddConnection(connection)\n\t\t\t\tlog.Println(\"Initializing connection\", c.Name(), \"...\")\n\t\t\t}\n\t\tcase []Device:\n\t\t\tlog.Println(\"Initializing devices...\")\n\t\t\tfor _, device := range val {\n\t\t\t\td := r.AddDevice(device)\n\t\t\t\tlog.Println(\"Initializing device\", d.Name(), \"...\")\n\t\t\t}\n\t\tcase func():\n\t\t\tr.Work = val\n\t\t}\n\t}\n\n\tr.workRegistry = &RobotWorkRegistry{\n\t\tr: make(map[string]*RobotWork),\n\t}\n\tr.WorkAfterWaitGroup = &sync.WaitGroup{}\n\tr.WorkEveryWaitGroup = &sync.WaitGroup{}\n\n\tr.running.Store(false)\n\tlog.Println(\"Robot\", r.Name, \"initialized.\")\n\n\treturn r\n}\n\n// Start a Robot's Connections, Devices, and work. We stop initialization of\n// connections and devices on first error.\nfunc (r *Robot) Start(args ...interface{}) error {\n\tif len(args) > 0 && args[0] != nil {\n\t\tvar ok bool\n\t\tif r.AutoRun, ok = args[0].(bool); !ok {\n\t\t\t// we treat this as false\n\t\t\tr.AutoRun = false\n\t\t}\n\t}\n\tlog.Println(\"Starting Robot\", r.Name, \"...\")\n\tif err := r.Connections().Start(); err != nil {\n\t\tlog.Println(err)\n\t\treturn err\n\t}\n\n\tif err := r.Devices().Start(); err != nil {\n\t\tlog.Println(err)\n\t\treturn err\n\t}\n\n\tif r.Work == nil {\n\t\tr.Work = func() {}\n\t}\n\n\tlog.Println(\"Starting work...\")\n\tgo func() {\n\t\tr.Work()\n\t\t<-r.done\n\t}()\n\n\tr.running.Store(true)\n\n\tif !r.AutoRun {\n\t\treturn nil\n\t}\n\n\tc := make(chan os.Signal, 1)\n\tr.trap(c)\n\n\t// waiting for interrupt coming on the channel\n\t<-c\n\n\t// Stop calls the Stop method on itself, if we are \"auto-running\".\n\treturn r.Stop()\n}\n\n// Stop stops a Robot's connections and devices. We try to stop all items and\n// collect all errors.\nfunc (r *Robot) Stop() error {\n\tvar err error\n\tlog.Println(\"Stopping Robot\", r.Name, \"...\")\n\tif e := r.Devices().Halt(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\tif e := r.Connections().Finalize(); e != nil {\n\t\terr = multierror.Append(err, e)\n\t}\n\n\tif !r.Running() {\n\t\t// start was not successful, a full channel would block\n\t\treturn err\n\t}\n\n\tr.done <- true\n\tr.running.Store(false)\n\treturn err\n}\n\n// Running returns if the Robot is currently started or not\nfunc (r *Robot) Running() bool {\n\treturn r.running.Load().(bool) //nolint:forcetypeassert // no error return value, so there is no better way\n}\n\n// Devices returns all devices associated with this Robot.\nfunc (r *Robot) Devices() *Devices {\n\treturn r.devices\n}\n\n// AddDevice adds a new Device to the robots collection of devices. Returns the\n// added device.\nfunc (r *Robot) AddDevice(d Device) Device {\n\t*r.devices = append(*r.Devices(), d)\n\treturn d\n}\n\n// Device returns a device given a name. Returns nil if the Device does not exist.\nfunc (r *Robot) Device(name string) Device {\n\tif r == nil {\n\t\treturn nil\n\t}\n\tfor _, device := range *r.devices {\n\t\tif device.Name() == name {\n\t\t\treturn device\n\t\t}\n\t}\n\treturn nil\n}\n\n// Connections returns all connections associated with this robot.\nfunc (r *Robot) Connections() *Connections {\n\treturn r.connections\n}\n\n// AddConnection adds a new connection to the robots collection of connections.\n// Returns the added connection.\nfunc (r *Robot) AddConnection(c Connection) Connection {\n\t*r.connections = append(*r.Connections(), c)\n\treturn c\n}\n\n// Connection returns a connection given a name. Returns nil if the Connection\n// does not exist.\nfunc (r *Robot) Connection(name string) Connection {\n\tif r == nil {\n\t\treturn nil\n\t}\n\tfor _, connection := range *r.connections {\n\t\tif connection.Name() == name {\n\t\t\treturn connection\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "robot_test.go",
    "content": "package gobot\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestRobotConnectionEach(t *testing.T) {\n\tr := newTestRobot(\"Robot1\")\n\n\ti := 0\n\tr.Connections().Each(func(conn Connection) {\n\t\ti++\n\t})\n\tassert.Equal(t, i, r.Connections().Len())\n}\n\nfunc TestRobotToJSON(t *testing.T) {\n\tr := newTestRobot(\"Robot99\")\n\tr.AddCommand(\"test_function\", func(params map[string]interface{}) interface{} {\n\t\treturn nil\n\t})\n\tjson := NewJSONRobot(r)\n\tassert.Len(t, json.Devices, r.Devices().Len())\n\tassert.Len(t, json.Commands, len(r.Commands()))\n}\n\nfunc TestRobotDevicesToJSON(t *testing.T) {\n\tr := newTestRobot(\"Robot99\")\n\tjson := NewJSONRobot(r)\n\tassert.Len(t, json.Devices, r.Devices().Len())\n\tassert.Equal(t, \"Device1\", json.Devices[0].Name)\n\tassert.Equal(t, \"*gobot.testDriver\", json.Devices[0].Driver)\n\tassert.Equal(t, \"Connection1\", json.Devices[0].Connection)\n\tassert.Len(t, json.Devices[0].Commands, 1)\n}\n\nfunc TestRobotStart(t *testing.T) {\n\tr := newTestRobot(\"Robot99\")\n\trequire.NoError(t, r.Start())\n\trequire.NoError(t, r.Stop())\n\tassert.False(t, r.Running())\n}\n\nfunc TestRobotStartAutoRun(t *testing.T) {\n\tadaptor1 := newTestAdaptor(\"Connection1\", \"/dev/null\")\n\tdriver1 := newTestDriver(adaptor1, \"Device1\", \"0\")\n\t// work := func() {}\n\tr := NewRobot(\"autorun\",\n\t\t[]Connection{adaptor1},\n\t\t[]Device{driver1},\n\t\t// work,\n\t)\n\n\terrChan := make(chan error, 1)\n\tgo func() {\n\t\terrChan <- r.Start() // if no strange things happen, this runs until os.signal occurs\n\t}()\n\n\ttime.Sleep(10 * time.Millisecond)\n\tassert.True(t, r.Running())\n\n\t// stop it\n\trequire.NoError(t, r.Stop())\n\tassert.False(t, r.Running())\n\tselect {\n\tcase err := <-errChan:\n\t\trequire.NoError(t, err)\n\tcase <-time.After(10 * time.Millisecond):\n\t\t// because the Start() will run forever, until os.Signal, this is ok here\n\t}\n}\n"
  },
  {
    "path": "robot_work.go",
    "content": "package gobot\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n)\n\n// RobotWorkRegistry contains all the work units registered on a Robot\ntype RobotWorkRegistry struct {\n\tsync.RWMutex\n\n\tr map[string]*RobotWork\n}\n\nconst (\n\tEveryWorkKind = \"every\"\n\tAfterWorkKind = \"after\"\n)\n\n// RobotWork and the RobotWork registry represent units of executing computation\n// managed at the Robot level. Unlike the utility functions gobot.After and gobot.Every,\n// RobotWork units require a context.Context, and can be cancelled externally by calling code.\n//\n// Usage:\n//\n//\tsomeWork := myRobot.Every(context.Background(), time.Second * 2, func(){\n//\t\tfmt.Println(\"Here I am doing work\")\n//\t})\n//\n//\tsomeWork.CallCancelFunc() // Cancel next tick and remove from work registry\n//\n// goroutines for Every and After are run on their own WaitGroups for synchronization:\n//\n//\tsomeWork2 := myRobot.Every(context.Background(), time.Second * 2, func(){\n//\t\tfmt.Println(\"Here I am doing more work\")\n//\t})\n//\n//\tsomework2.CallCancelFunc()\n//\n//\t// wait for both Every calls to finish\n//\trobot.WorkEveryWaitGroup().Wait()\ntype RobotWork struct {\n\tid         uuid.UUID\n\tkind       string\n\ttickCount  int\n\tctx        context.Context //nolint:containedctx // done by intention\n\tcancelFunc context.CancelFunc\n\tfunction   func()\n\tticker     *time.Ticker\n\tduration   time.Duration\n}\n\n// ID returns the UUID of the RobotWork\nfunc (rw *RobotWork) ID() uuid.UUID {\n\treturn rw.id\n}\n\n// CancelFunc returns the context.CancelFunc used to cancel the work\nfunc (rw *RobotWork) CancelFunc() context.CancelFunc {\n\treturn rw.cancelFunc\n}\n\n// CallCancelFunc calls the context.CancelFunc used to cancel the work\nfunc (rw *RobotWork) CallCancelFunc() {\n\trw.cancelFunc()\n}\n\n// Ticker returns the time.Ticker used in an Every so that calling code can sync on the same channel\nfunc (rw *RobotWork) Ticker() *time.Ticker {\n\tif rw.kind == AfterWorkKind {\n\t\treturn nil\n\t}\n\treturn rw.ticker\n}\n\n// TickCount returns the number of times the function successfully ran\nfunc (rw *RobotWork) TickCount() int {\n\treturn rw.tickCount\n}\n\n// Duration returns the timeout until an After fires or the period of an Every\nfunc (rw *RobotWork) Duration() time.Duration {\n\treturn rw.duration\n}\n\nfunc (rw *RobotWork) String() string {\n\tformat := `ID: %s\nKind: %s\nTickCount: %d\n\n`\n\treturn fmt.Sprintf(format, rw.id, rw.kind, rw.tickCount)\n}\n\n// WorkRegistry returns the Robot's WorkRegistry\nfunc (r *Robot) WorkRegistry() *RobotWorkRegistry {\n\treturn r.workRegistry\n}\n\n// Every calls the given function for every tick of the provided duration.\nfunc (r *Robot) Every(ctx context.Context, d time.Duration, f func()) *RobotWork {\n\trw := r.workRegistry.registerEvery(ctx, d, f)\n\tr.WorkEveryWaitGroup.Add(1)\n\tgo func() {\n\tEVERYWORK:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-rw.ctx.Done():\n\t\t\t\tr.workRegistry.delete(rw.id)\n\t\t\t\trw.ticker.Stop()\n\t\t\t\tbreak EVERYWORK\n\t\t\tcase <-rw.ticker.C:\n\t\t\t\tf()\n\t\t\t\trw.tickCount++\n\t\t\t}\n\t\t}\n\t\tr.WorkEveryWaitGroup.Done()\n\t}()\n\treturn rw\n}\n\n// After calls the given function after the provided duration has elapsed\nfunc (r *Robot) After(ctx context.Context, d time.Duration, f func()) *RobotWork {\n\trw := r.workRegistry.registerAfter(ctx, d, f)\n\tch := time.After(d)\n\tr.WorkAfterWaitGroup.Add(1)\n\tgo func() {\n\tAFTERWORK:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-rw.ctx.Done():\n\t\t\t\tr.workRegistry.delete(rw.id)\n\t\t\t\tbreak AFTERWORK\n\t\t\tcase <-ch:\n\t\t\t\tf()\n\t\t\t}\n\t\t}\n\t\tr.WorkAfterWaitGroup.Done()\n\t}()\n\treturn rw\n}\n\n// Get returns the RobotWork specified by the provided ID. To delete something from the registry, it's\n// necessary to call its context.CancelFunc, which will perform a goroutine-safe delete on the underlying\n// map.\nfunc (rwr *RobotWorkRegistry) Get(id uuid.UUID) *RobotWork {\n\trwr.Lock()\n\tdefer rwr.Unlock()\n\treturn rwr.r[id.String()]\n}\n\n// Delete returns the RobotWork specified by the provided ID\nfunc (rwr *RobotWorkRegistry) delete(id uuid.UUID) {\n\trwr.Lock()\n\tdefer rwr.Unlock()\n\tdelete(rwr.r, id.String())\n}\n\n// registerAfter creates a new unit of RobotWork and sets up its context/cancellation\nfunc (rwr *RobotWorkRegistry) registerAfter(ctx context.Context, d time.Duration, f func()) *RobotWork {\n\trwr.Lock()\n\tdefer rwr.Unlock()\n\n\tid, _ := uuid.NewV4()\n\trw := &RobotWork{\n\t\tid:       id,\n\t\tkind:     AfterWorkKind,\n\t\tfunction: f,\n\t\tduration: d,\n\t}\n\n\trw.ctx, rw.cancelFunc = context.WithCancel(ctx)\n\trwr.r[id.String()] = rw\n\treturn rw\n}\n\n// registerEvery creates a new unit of RobotWork and sets up its context/cancellation\nfunc (rwr *RobotWorkRegistry) registerEvery(ctx context.Context, d time.Duration, f func()) *RobotWork {\n\trwr.Lock()\n\tdefer rwr.Unlock()\n\n\tid, _ := uuid.NewV4()\n\trw := &RobotWork{\n\t\tid:       id,\n\t\tkind:     EveryWorkKind,\n\t\tfunction: f,\n\t\tduration: d,\n\t\tticker:   time.NewTicker(d),\n\t}\n\n\trw.ctx, rw.cancelFunc = context.WithCancel(ctx)\n\n\trwr.r[id.String()] = rw\n\treturn rw\n}\n"
  },
  {
    "path": "robot_work_test.go",
    "content": "package gobot\n\nimport (\n\t\"context\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/gofrs/uuid\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestRobotWork(t *testing.T) {\n\tid, _ := uuid.NewV4()\n\n\trw := &RobotWork{\n\t\tid:       id,\n\t\tkind:     EveryWorkKind,\n\t\tfunction: func() {},\n\t}\n\n\tduration := time.Second * 1\n\tctx, cancelFunc := context.WithCancel(t.Context())\n\n\trw.ctx = ctx\n\trw.cancelFunc = cancelFunc\n\trw.duration = duration\n\n\tt.Run(\"ID()\", func(t *testing.T) {\n\t\tassert.Equal(t, rw.ID(), id)\n\t})\n\n\tt.Run(\"Ticker()\", func(t *testing.T) {\n\t\tt.Skip()\n\t})\n\n\tt.Run(\"Duration()\", func(t *testing.T) {\n\t\tassert.Equal(t, rw.duration, duration)\n\t})\n}\n\nfunc TestRobotWorkRegistry(t *testing.T) {\n\trobot := NewRobot(\"testbot\")\n\n\trw := robot.Every(t.Context(), time.Millisecond*250, func() {\n\t\t_ = 1 + 1\n\t})\n\n\tt.Run(\"Get retrieves\", func(t *testing.T) {\n\t\tassert.Equal(t, robot.workRegistry.Get(rw.id), rw)\n\t})\n\n\tt.Run(\"delete deletes\", func(t *testing.T) {\n\t\trobot.workRegistry.delete(rw.id)\n\t\tpostDeleteKeys := collectStringKeysFromWorkRegistry(robot.workRegistry)\n\t\tassert.NotContains(t, postDeleteKeys, rw.id.String())\n\t})\n}\n\nfunc TestRobotAutomationFunctions(t *testing.T) {\n\tt.Run(\"Every with cancel\", func(t *testing.T) {\n\t\trobot := NewRobot(\"testbot\")\n\t\tcounter := 0\n\n\t\trw := robot.Every(t.Context(), time.Millisecond*100, func() {\n\t\t\tcounter++\n\t\t})\n\n\t\ttime.Sleep(time.Millisecond * 225)\n\t\trw.CallCancelFunc()\n\n\t\trobot.WorkEveryWaitGroup.Wait()\n\n\t\tassert.Equal(t, 2, counter)\n\t\tpostDeleteKeys := collectStringKeysFromWorkRegistry(robot.workRegistry)\n\t\tassert.NotContains(t, postDeleteKeys, rw.id.String())\n\t})\n\n\tt.Run(\"After with cancel\", func(t *testing.T) {\n\t\trobot := NewRobot(\"testbot\")\n\n\t\trw := robot.After(t.Context(), time.Millisecond*10, func() {\n\t\t\t_ = 1 + 1 // perform mindless computation!\n\t\t})\n\n\t\trw.CallCancelFunc()\n\n\t\trobot.WorkAfterWaitGroup.Wait()\n\n\t\tpostDeleteKeys := collectStringKeysFromWorkRegistry(robot.workRegistry)\n\t\tassert.NotContains(t, postDeleteKeys, rw.id.String())\n\t})\n}\n\nfunc collectStringKeysFromWorkRegistry(rwr *RobotWorkRegistry) []string {\n\tkeys := make([]string, len(rwr.r))\n\tvar idx int\n\tfor key := range rwr.r {\n\t\tkeys[idx] = key\n\t\tidx++\n\t}\n\treturn keys\n}\n"
  },
  {
    "path": "system/GPIO.md",
    "content": "# GPIOs\n\nThis document describes some basics for developers. This is useful to understand programming in gobot's [digital pin driver](./digitalpin_access.go).\n\n## GPIOs with sysfs\n\n> Kernel SYSFS ABI is deprecated since Linux 4.8, see <https://www.kernel.org/doc/html/latest/admin-guide/gpio/sysfs.html>.\n> For GPIO's we still use the Kernel SYSFS ABI.\n\n## GPIOs with character devices\n\nThis document provides some test possibilities by using the new character device feature since Kernel 4.8. Please check\nyour Kernel version before using this. Install of \"gpiod\" is mandatory for the tests.\n\n```sh\nuname -a\nLinux raspi 5.15.61+ #1579 Fri Aug 26 11:08:59 BST 2022 armv6l GNU/Linux\n\nsudo apt install gpiod\n```\n\n> For work on character device user space drivers, please refer to our [issue #775](https://github.com/hybridgroup/gobot/issues/775).\n\n## Check available GPIO banks\n\nExample for Tinkerboard (RK3288) with TinkerOS:\n\n```sh\nls -la /sys/class/gpio/\ntotal 0\ndrwxr-xr-x  2 root root    0 Nov 12 06:53 .\ndrwxr-xr-x 66 root root    0 Feb 14  2019 ..\n--w-------  1 root root 4096 Feb 14  2019 export\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip0 -> ../../devices/platform/pinctrl/gpio/gpiochip0\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip120 -> ../../devices/platform/pinctrl/gpio/gpiochip120\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip152 -> ../../devices/platform/pinctrl/gpio/gpiochip152\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip184 -> ../../devices/platform/pinctrl/gpio/gpiochip184\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip216 -> ../../devices/platform/pinctrl/gpio/gpiochip216\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip24 -> ../../devices/platform/pinctrl/gpio/gpiochip24\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip248 -> ../../devices/platform/pinctrl/gpio/gpiochip248\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip56 -> ../../devices/platform/pinctrl/gpio/gpiochip56\nlrwxrwxrwx  1 root root    0 Feb 14  2019 gpiochip88 -> ../../devices/platform/pinctrl/gpio/gpiochip88\n```\n\nExample for \"Raspberry Pi Model B Rev 2\" with \"Raspbian GNU/Linux 11 (bullseye)\" (26 pin header):\n\n```sh\nls -la /sys/class/gpio/\ntotal 0\ndrwxrwxr-x  2 root gpio    0 Nov 13 09:33 .\ndrwxr-xr-x 58 root root    0 Sep 13 02:58 ..\n--w--w----  1 root gpio 4096 Nov 13 09:33 export\nlrwxrwxrwx  1 root gpio    0 Nov 13 09:33 gpiochip0 -> ../../devices/platform/soc/20200000.gpio/gpio/gpiochip0\n--w--w----  1 root gpio 4096 Nov 13 09:33 unexport\n\ngpiodetect\ngpiochip0 [pinctrl-bcm2835] (54 lines)\n\ngpioinfo \ngpiochip0 - 54 lines:\n  gpiochip0 - 54 lines:\n  ...\n  line   2:       \"SDA1\"       unused   input  active-high \n  line   3:       \"SCL1\"       unused   input  active-high \n  line   4:  \"GPIO_GCLK\"       unused   input  active-high \n  ...\n  line   7:  \"SPI_CE1_N\"       unused   input  active-high \n  line   8:  \"SPI_CE0_N\"       unused   input  active-high \n  line   9:    \"SPI_SDI\"       unused   input  active-high\n  line  10:    \"SPI_SDO\"       unused   input  active-high\n  line  11:   \"SPI_SCLK\"       unused   input  active-high \n  ...\n  line  14:       \"TXD0\"       unused   input  active-high \n  line  15:       \"RXD0\"       unused   input  active-high \n  ...\n  line  17:     \"GPIO17\"       unused   input  active-high \n  line  18:     \"GPIO18\"       unused   input  active-high \n  ...\n  line  22:     \"GPIO22\"       unused   input  active-high \n  line  23:     \"GPIO23\"       unused   input  active-high \n  line  24:     \"GPIO24\"       unused   input  active-high \n  line  25:     \"GPIO25\"       unused   input  active-high \n  ...\n```\n\n## General GPIO tests\n\nFor Tinkerboard and in general for all other boards:\n\n* the name on system level differ from the header name (normally pin1..pin40)\n* the mapping is done in gobot by a file named something like [pinmap.go](../platforms/asus/tinkerboard/pinmap.go)\n* for the next tests the system level name is needed\n\nConnect an oscilloscope or at least a meter to the pin (used header pin26 for example). For the output tests a LED with\na sufficient resistor to 3.3.V (e.g. 290 Ohm) can be used to detect the output state.  \n\n> On Tinkerboard the pin26 relates to gpio251. For raspi it relates to gpio7.\n\n### Creating gpio251 (sysfs Tinkerboard)\n\n> Needs to be \"root\" for this to work. Switch to root user by \"su -\".\n\n```sh\necho \"251\" > /sys/class/gpio/export\n```\n\ninvestigate result:\n\n```sh\n# cat /sys/class/gpio/gpio251/active_low \n0\n\n# cat /sys/class/gpio/gpio251/direction \nin\n\n# cat /sys/class/gpio/gpio251/edge \nnone\n\n# cat /sys/class/gpio/gpio251/value \n1\n```\n\n> The value can float to \"1\", if the input is open.\n\n### Test input behavior of gpio251 (sysfs Tinkerboard)\n\n> Be careful with connecting the input to GND or 3.3V directly, instead use an resistor with minimum 300 Ohm.\n\nConnect the input header pin26 to GND.\n\n```sh\n# cat /sys/class/gpio/gpio251/direction \nin\n# cat /sys/class/gpio/gpio251/value \n0\n```\n\nConnect the input header pin26 to +3.3V with an resistor (e.g. 1kOhm).\n\n```sh\n# cat /sys/class/gpio/gpio251/value \n1\n```\n\n### Test edge detection behavior of gpio251 (sysfs Tinkerboard)\n\ninvestigate status:\n\n```sh\n# cat /sys/class/gpio/gpio251/edge\nnone\n```\n\nThe file exists only if the pin can be configured as an interrupt generating input pin. To activate edge detection,\n\"rising\", \"falling\", or \"both\" needs to be set.\n\n```sh\n# cat /sys/class/gpio/gpio251/value\n1\n```\n\nIf edge detection is activated, a poll will return only when the interrupt was triggered. The new value is written to\nthe beginning of the file.\n\n> Not tested yet, not supported by gobot yet.\n\n### Test output behavior of gpio251 (sysfs Tinkerboard)\n\nConnect the output header pin26 to +3.3V with an resistor (e.g. 1kOhm leads to ~0.3mA, 300Ohm leads to ~10mA).\n\n```sh\n# echo \"out\" > /sys/class/gpio/gpio251/direction\n# cat /sys/class/gpio/gpio251/direction\nout\n# cat /sys/class/gpio/gpio251/value\n0\n\n# echo \"1\" > /sys/class/gpio/gpio251/value\n# cat /sys/class/gpio/gpio251/value\n1\n\n# echo \"0\" > /sys/class/gpio/gpio251/value\n# cat /sys/class/gpio/gpio251/value\n0\n```\n\nThe meter should show \"0V\" for values of \"0\" and \"3.3V\", when the value was set to \"1\".\n\n> For armbian and Tinkerboard the value remains to \"1\", although it was set to \"0\". In this case the pin is not usable\n> as output.\n\n### Test inverse output behavior of gpio251 (sysfs Tinkerboard)\n\n```sh\n# cat /sys/class/gpio/gpio251/value\n0\n# cat /sys/class/gpio/gpio251/active_low\n0\n\n# echo \"1\" > /sys/class/gpio/gpio251/active_low\n# cat /sys/class/gpio/gpio251/value\n1\n\n# echo \"0\" > /sys/class/gpio/gpio251/value\n# cat /sys/class/gpio/gpio251/value\n0\n```\n\nThe meter should show \"0V\" for values of \"1\" and \"3.3V\", when the value was set to \"0\".\n\n### Test input behavior of gpio7 (cdev Raspi)\n\n> Use --help to get some information of the command usage and options, e.g. \"gpioget --help\". Be careful with connecting\n> the input to GND or 3.3V directly, instead use an resistor with minimum 300Ohm. Prefer to use the pull-up or pull-down\n> feature, if working.\n\n```sh\nsudo gpioget 0 7\n1\ngpioinfo | grep 'line   7'\n  line   7:  \"SPI_CE1_N\"       unused   input  active-high\n\nsudo gpioget --bias=pull-down 0 7\n0\n```\n\n>The value can float to \"1\", if the input is open. Most likely the raspi device has an internal pull-up resistor.\n>Setting the bias is not possible for sysfs usage. This is one of the advantages of the new character device Kernel feature.\n\n### Test output behavior of gpio7 (cdev Raspi)\n\n```sh\nsudo gpioset 0 7=0\ngpioinfo | grep 'line   7'\n  line   7:  \"SPI_CE1_N\"       unused  output  active-high\n\nsudo gpioset 0 7=1\ngpioinfo | grep 'line   7'\n  line   7:  \"SPI_CE1_N\"       unused  output  active-high\n```\n\nThe meter should show \"0V\" for values of \"0\" and \"3.3V\", when the value was set to \"1\".  \nA connected LED with pull-up resistor lights up for setting to \"0\" (inverse).\n\n### Test inverse output behavior of gpio7 (cdev Raspi)\n\n```sh\nsudo gpioset -l 0 7=0\nsudo gpioset -l 0 7=1\n```\n\nThe meter should show \"0V\" for values of \"1\" and \"3.3V\", when the value was set to \"0\" (inverse logic).  \nA connected LED with pull-up resistor lights up for setting to \"1\" (inverse reversed).\n\n> The gpioinfo seems to do not recognize the \"active-low\" set.\n\n## Links\n\n* <https://www.kernel.org/doc/html/latest/admin-guide/gpio/sysfs.html>\n* <https://embeddedbits.org/linux-kernel-gpio-user-space-interface-embeddedbits-2/>\n"
  },
  {
    "path": "system/I2C.md",
    "content": "# I2C\n\nThis document describes some basics for developers.\n\n## Byte order\n\nAll common libraries (smbus, digispark, firmata, i2cget) read and write I2C data in the order LSByte, MSByte.  \nOften the devices store its bytes in the reverse order and therefor needs to be swapped after reading.\n\n## Linux syscall implementation\n\nIn general there are different ioctl features for I2C\n\n* IOCTL I2C_RDWR, needs \"I2C_FUNC_I2C\"\n* IOCTL SMBUS, needs \"I2C_FUNC_SMBUS..\"\n* SYSFS I/O\n* call of \"i2c_smbus_* methods\"\n\n>The possible functions should be checked before by \"I2C_FUNCS\".\n\n## SMBus ioctl workflow and functions\n\n> Some calls are branched by kernels [i2c-dev.c:i2cdev_ioctl()](https://elixir.bootlin.com/linux/latest/source/drivers/i2c/i2c-dev.c#L392)\n> to the next listed calls.\n\nSet the device address `ioctl(file, I2C_TARGET, long addr)`. The call set the address directly to the character device.\n\nQuery the supported functions `ioctl(file, I2C_FUNCS, unsigned long *funcs)`. The call is converted to in-kernel function\n[i2c.h:i2c_get_functionality()](https://elixir.bootlin.com/linux/latest/source/include/linux/i2c.h#L902)\n\nExecute a function, if supported `ioctl(file, I2C_SMBUS, struct i2c_smbus_ioctl_data *args)`. The call is converted by\nkernels [i2c-dev.c:i2cdev_ioctl_smbus](https://elixir.bootlin.com/linux/latest/source/drivers/i2c/i2c-dev.c#L311) to\n[i2c.h:i2c_smbus_xfer()](https://elixir.bootlin.com/linux/latest/source/include/linux/i2c.h#L140). This leads to call of\n[i2c-core-smbus.c:i2c_smbus_xfer_emulated()](https://elixir.bootlin.com/linux/latest/source/drivers/i2c/i2c-core-smbus.c#L607)\nif adapter.algo->smbus_xfer() is not implemented (that means there is no implementation for the current platform/adapter).\n\n```C\n/* This is the structure as used in the I2C_SMBUS ioctl call */\nstruct i2c_smbus_ioctl_data {\n  __u8 read_write;\n  __u8 command;\n  __u32 size;\n  union i2c_smbus_data __user *data;\n};\n\n/*\n * Data for SMBus Messages\n */\n#define I2C_SMBUS_BLOCK_MAX 32  /* As specified in SMBus standard */\nunion i2c_smbus_data {\n  __u8 byte;\n  __u16 word;\n  __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */\n             /* and one more for user-space compatibility */\n};\n\n```\n\n```C\n// default preparation for call of \"status = __i2c_transfer(adapter, msg, nmsgs)\"\n\nmsgbuf0[I2C_SMBUS_BLOCK_MAX+3];\nmsgbuf1[I2C_SMBUS_BLOCK_MAX+2];\n\nmsgbuf0[0] = command;\n\nstruct i2c_msg msg[2] = {\n  {\n    .addr = addr,\n    .flags = flags,\n    .len = 1,\n    .buf = msgbuf0,\n  }, {\n    .addr = addr,\n    .flags = flags | I2C_M_RD,\n    .len = 0,\n    .buf = msgbuf1,\n  },\n};\n/* note: msg[0].buf == msgbuf0, means\n         msg[0].buf[0] == msgbuf0[0]\n         msg[0].buf[1] == msgbuf0[1]\n         msg[0].buf[2] == msgbuf0[2]\n*/\n```\n\n### Data flow for I2C_FUNC_SMBUS_WRITE_BYTE\n\n```C\ni2c_smbus_write_byte(const struct i2c_client *client, u8 value);\n\\\\would call:\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);\n```\n\ngobot: d.smbusAccess(I2C_SMBUS_WRITE, val, I2C_SMBUS_BYTE, nil), calls without a platform driver  \n\n```C\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write=I2C_SMBUS_WRITE, command=val, size=I2C_SMBUS_BYTE, *data=NULL);\n```\n\n```C\n// by default preparation (see above)\nmsg[0].len = 1;\nmsg[0].buf[0] = command; // corresponds to \"val\"\nnmsg = 1;\n```\n\n### Data flow for I2C_FUNC_SMBUS_WRITE_BYTE_DATA\n\n```C\ni2c_smbus_write_byte_data(const struct i2c_client *client, u8 command, u8 value);\n// would call:\ndata.byte = value;\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_WRITE, command, I2C_SMBUS_BYTE_DATA, &data);\n```\n\ngobot: d.smbusAccess(I2C_SMBUS_WRITE, reg, I2C_SMBUS_BYTE_DATA, unsafe.Pointer(&data)), calls without a platform driver\n\n```C\ndatasize = sizeof(data->byte);\ncopy_from_user(&temp, data, datasize);\n\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write=I2C_SMBUS_WRITE, command=reg, size=I2C_SMBUS_BYTE_DATA, *data=&temp);\n\n// leads to:\nmsg[0].len = 2;\nmsg[0].buf[0] = command; // corresponds to \"reg\"\nmsg[0].buf[1] = data->byte;\nnmsg = 1;\n```\n\n### Data flow for I2C_FUNC_SMBUS_WRITE_WORD_DATA\n\n```C\ni2c_smbus_write_word_data(const struct i2c_client *client, u8 command, u16 value);\n// would call:\ndata.word = value;\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_WRITE, command, I2C_SMBUS_WORD_DATA, &data);\n```\n\ngobot: d.smbusAccess(I2C_SMBUS_WRITE, reg, I2C_SMBUS_WORD_DATA, unsafe.Pointer(&data)), calls without a platform driver\n\n```C\ndatasize = sizeof(data->word);\ncopy_from_user(&temp, data, datasize);\n\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write=I2C_SMBUS_WRITE, command=reg, size=I2C_SMBUS_WORD_DATA, *data=&temp);\n\n// leads to:\nmsg[0].len = 3;\nmsg[0].buf[0] = command;\nmsg[0].buf[1] = data->word & 0xff;\nmsg[0].buf[2] = data->word >> 8;\nnmsg = 1;\n```\n\n### Data flow for I2C_FUNC_SMBUS_WRITE_BLOCK_DATA\n\n```C\ni2c_smbus_write_block_data(const struct i2c_client *client, u8 command, u8 length, const u8 *values);\n// would call:\ndata.block[0] = length; // set first data element to length\nmemcpy(&data.block[1], values, length); // ...followed by the real data values\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_WRITE, command, I2C_SMBUS_BLOCK_DATA, &data);\n```\n\ngobot: do not use this feature, but this would call without a platform driver\n\n```C\ndatasize = sizeof(data->block); // it seems this just blocks 32+2\ncopy_from_user(&temp, data, datasize); // but possibly this only copy what is there\n\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write==I2C_SMBUS_WRITE, command=reg, size==I2C_SMBUS_BLOCK_DATA, *data==&temp);\n\n// leads to:\n// this reads the length from given user data, first element, add 2 for command and one more for user space compatibility:\nmsg[0].len = data->block[0] + 2;\nmsg[0].buf[0] = command; // by i2c_smbus_try_get_dmabuf(&msg[0], command)\nmsg[0].buf + 1 = data->block; // copy with size!, by memcpy(msg[0].buf + 1, data->block, msg[0].len - 1);\nnmsg = 1;\n```\n\n> \"i2c_smbus_write_block_data\" adds the real data size as first value in data. Writing this to the device is intended\n> for SMBus devices, see \"section 6.5.7 Block Write/Read\" of [smbus 3.0 specification](http://smbus.org/specs/SMBus_3_0_20141220.pdf).\n> Implementing this behavior in gobot leads to writing the size as first data element, but this is normally not useful\n> for i2c devices. When using ioctl calls there is no way to drop the size element by using this call.\n\n### Data flow for I2C_FUNC_SMBUS_WRITE_I2C_BLOCK\n\n```C\ni2c_smbus_write_i2c_block_data(const struct i2c_client *client, u8 command, u8 length, const u8 *values);\n// would call:\ndata.block[0] = length; // set first data element to length\nmemcpy(data.block + 1, values, length); // ...followed by the real data values\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_WRITE, command, I2C_SMBUS_I2C_BLOCK_DATA, &data);\n```\n\ngobot:\n\n```go\n// set the first element with the data size\ndataLen := len(data)\nbuf := make([]byte, dataLen+1)\nbuf[0] = byte(dataLen)\ncopy(buf[1:], data)\nd.smbusAccess(I2C_SMBUS_WRITE, reg, I2C_SMBUS_I2C_BLOCK_DATA, unsafe.Pointer(&buf[0]))\n```\n\n...calls without a platform driver\n\n```C\ndatasize = sizeof(data->block); // it seems this just blocks 32+2\ncopy_from_user(&temp, data, datasize); // but possibly this only copy what is there\n\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write==I2C_SMBUS_WRITE, command=reg, size==I2C_SMBUS_I2C_BLOCK_DATA,\n  *data==&temp);\n\n// this reads the length from given user data, first element, add 1 for command:\nmsg[0].len = data->block[0] + 1;\nmsg[0].buf[0] = command; // by i2c_smbus_try_get_dmabuf(&msg[0], command)\nmsg[0].buf + 1 = data->block + 1; // copy real data without size, by memcpy(msg[0].buf + 1, data->block + 1, data->block[0]);\nnmsg=1\n```\n\n### Data flow for I2C_FUNC_SMBUS_READ_BYTE\n\n```C\ni2c_smbus_read_byte(const struct i2c_client *client);\n// would call:\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data);\nreturn data.byte;\n```\n\ngobot: d.smbusAccess(I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, unsafe.Pointer(&data)), calls without a platform driver\n\n```C\ndatasize = sizeof(data->byte); // &temp keeps empty\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write==I2C_SMBUS_READ, command=0, size==I2C_SMBUS_BYTE, *data==&temp);\n\nmsg[0].len = 1; // per default\nmsg[0].flags = I2C_M_RD | flags;\nmsg[0].buf[0] = 0; // from command\nnmsgs = 1;\n```\n\nafterwards copy content to target structure\n\n```C\ndata->byte = msg[0].buf[0]; // copy read value back to given data pointer and one level above\ncopy_to_user(data, &temp, datasize); // copy one byte back to given data pointer\n```\n\n### Data flow for I2C_FUNC_SMBUS_READ_BYTE_DATA\n\n```C\ni2c_smbus_read_byte_data(const struct i2c_client *client, u8 command);\n// would call:\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_READ, command, I2C_SMBUS_BYTE_DATA, &data);\nreturn data.byte;\n```\n\ngobot: d.smbusAccess(I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, unsafe.Pointer(&data)), calls without a platform driver\n\n```C\ndatasize = sizeof(data->byte); // &temp keeps empty\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write==I2C_SMBUS_READ, command=reg, size==I2C_SMBUS_BYTE_DATA, *data==&temp);\n\nmsg[0].len = 1; // per default\nmsg[0].buf[0] = command;\nmsg[1].len = 1;\nnmsgs = 2;\n```\n\nafterwards copy content to target structure\n\n```C\ndata->byte = msg[1].buf[0]; // copy read value back to given data pointer and one level above\ncopy_to_user(data, &temp, datasize); // copy one byte back to given data pointer\n```\n\n### Data flow for I2C_FUNC_SMBUS_READ_WORD_DATA\n\n```C\ni2c_smbus_read_word_data(const struct i2c_client *client, u8 command);\n// would call:\nstatus = i2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_READ, command, I2C_SMBUS_WORD_DATA, &data);\nreturn data.word;\n```\n\ngobot: d.smbusAccess(I2C_SMBUS_READ, reg, I2C_SMBUS_WORD_DATA, unsafe.Pointer(&data)), calls without a platform driver\n\n```C\ndatasize = sizeof(data->word); // &temp keeps empty\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write==I2C_SMBUS_READ, command=reg, size==I2C_SMBUS_BYTE_DATA, *data==&temp);\n\nmsg[0].len = 1; // per default\nmsg[0].buf[0] = command;\nmsg[1].len = 2;\nnmsgs = 2;\n```\n\nafterwards copy content to target structure\n\n```C\ndata->word = msgbuf1[0] | (msgbuf1[1] << 8); // copy read value back to given data pointer and one level above\ncopy_to_user(data, &temp, datasize); // copy 2 bytes back to given data pointer\n```\n\n### Data flow for I2C_FUNC_SMBUS_READ_BLOCK_DATA\n\n```C\ni2c_smbus_read_block_data(const struct i2c_client *client, u8 command, u8 *values);\n// would call:\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_READ, command, I2C_SMBUS_BLOCK_DATA, &data);\n// data.block[0] is the read length (N)\nmemcpy(values, &data.block[1], data.block[0]); // copy starting from data.block[1] to \"values\", N elements\nreturn data.block[0]; // number of read bytes (N)\n```\n\ngobot: do not use this feature, but this would call without a platform driver\n\n```C\ndatasize = sizeof(data->block); // &temp keeps empty\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write==I2C_SMBUS_READ, command=reg, size==I2C_SMBUS_BYTE_DATA, *data==&temp);\n\nmsg[0].len = 1; // per default\nmsg[0].buf[0] = command;\nmsg[1].flags |= I2C_M_RECV_LEN;\nmsg[1].len = 1; // block length will be added by the underlying bus driver\nmsg[1].buf[0] = 0; // by i2c_smbus_try_get_dmabuf(&msg[1], 0);\nnmsgs = 2;\n```\n\nafterwards copy content to target structure\n\n```C\nmemcpy(data->block, msg[1].buf, msg[1].buf[0] + 1); // copy read value back to given data pointer and one level above\ncopy_to_user(data, &temp, datasize); // copy all bytes (according to given size) back to given data pointer\n```\n\n### Data flow for I2C_FUNC_SMBUS_READ_I2C_BLOCK\n\n```C\ni2c_smbus_read_i2c_block_data(const struct i2c_client *client, u8 command, u8 length, u8 *values);\n// would call:\ndata.block[0] = length; // set first data element to length\ni2c_smbus_xfer(client->adapter, client->addr, client->flags, I2C_SMBUS_READ, command, I2C_SMBUS_I2C_BLOCK_DATA, &data);\n// data.block[0] is the read length (N)\nmemcpy(values, &data.block[1], data.block[0]); // copy starting from data.block[1] to \"values\", N elements\nreturn data.block[0]; // number of read bytes (N)\n```\n\ngobot:\n\n```go\ndataLen := len(data)\n// set the first element with the data size\nbuf := make([]byte, dataLen+1)\nbuf[0] = byte(dataLen)\ncopy(buf[1:], data)\nlog.Printf(\"buffer: %v\", buf)\nd.smbusAccess(I2C_SMBUS_READ, reg, I2C_SMBUS_I2C_BLOCK_DATA, unsafe.Pointer(&buf[0])); err != nil {\n// get data from buffer without first size element\ncopy(data, buf[1:])\n```\n\n...calls without a platform driver\n\n```C\ndatasize = sizeof(data->block); // &temp keeps empty, datasize includes the \"size\" byte (means real data + 1)\ncopy_from_user(&temp, data, datasize); // but possibly this only copy what is there\n\ni2c_smbus_xfer_emulated(*adapter, addr, flags, read_write==I2C_SMBUS_READ, command=reg, size==I2C_SMBUS_I2C_BLOCK_DATA, *data==&temp);\n\nmsg[0].len = 1; // per default\nmsg[0].buf[0] = command;\nmsg[1].len = data->block[0]; // this reads the length from given user data, first element:\nmsg[1].buf[0] = 0; // by i2c_smbus_try_get_dmabuf(&msg[1], 0);\nnmsgs = 2;\n```\n\nafterwards copy content to target structure\n\n```C\n// copy read values back, starting from second value (contains length)\nmemcpy(data->block + 1, msg[1].buf, data->block[0]);\n// and one level above:\ncopy_to_user(data, &temp, datasize); // copy all bytes (according to given size) back to given data pointer\n// this means, the caller needs to strip the real data starting from second byte (like \"i2c_smbus_read_i2c_block_data\")\n```\n\n## Links\n\n* <https://www.kernel.org/doc/Documentation/i2c/dev-interface>\n* <https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/i2c-dev.h#L42>\n* <https://stackoverflow.com/questions/9974592/i2c-slave-ioctl-purpose> (good for understanding, but there are some\n  small errors in the provided example)\n* <https://stackoverflow.com/questions/55976683/read-a-block-of-data-from-a-specific-registerfifo-using-c-c-and-i2c-in-raspb>\n\n> Qotation from kernel.org: \"If possible, use the provided i2c_smbus_* methods described below instead of issuing direct\n> ioctls.\"  \n> We do not do this at the moment, instead we using the \"IOCTL SMBUS\".\n\nBecause the syscall needs uintptr in Go, there are some known pitfalls with that. Following documents could be helpful:\n\n* <https://go101.org/article/unsafe.html>\n* <https://stackoverflow.com/questions/51187973/how-to-create-an-array-or-a-slice-from-an-array-unsafe-pointer-in-golang>\n* <https://stackoverflow.com/questions/59042646/whats-the-difference-between-uint-and-uintptr-in-golang>\n* <https://go.dev/play/p/Wd7hWn9Zsu>\n* for go vet false positives, see: <https://github.com/golang/go/issues/41205>\n\nBasically by convert to an uintptr, which is than just a number to an object existing at the moment of creation without\nany other reference, the garbage collector will possible destroy the original object. Therefor uintptr should be avoided\nas long as possible.\n"
  },
  {
    "path": "system/ONEWIRE.md",
    "content": "# 1-wire bus\n\nThis document describes some basics for developers. This is useful to understand programming in gobot's [1-wire driver](./onewiredevice_sysfs.go).\n\n## 1-wire with sysfs\n\nIf the 1-wire bus is enabled on the board, the bus data can be connected to one pin of the used platform. The enabling\nactivates the Kernel drivers for common devices (family drivers), which are than mapped to the sysfs, see\n<https://www.kernel.org/doc/Documentation/w1/w1.generic>.\n\n## Check available 1-wire devices\n\nExample for Tinkerboard (RK3288) with armbian and 3 connected temperature sensors DS18B20:\n\n```sh\nls -la /sys/bus/w1/devices/\ninsgesamt 0\ndrwxr-xr-x 2 root root 0 29. Okt 08:58 .\ndrwxr-xr-x 4 root root 0 29. Okt 08:58 ..\nlrwxrwxrwx 1 root root 0 31. Okt 07:55 28-072261452f18 -> ../../../devices/w1_bus_master1/28-072261452f18\nlrwxrwxrwx 1 root root 0 31. Okt 07:55 28-08225482b0de -> ../../../devices/w1_bus_master1/28-08225482b0de\nlrwxrwxrwx 1 root root 0 31. Okt 07:55 28-1e40710a6461 -> ../../../devices/w1_bus_master1/28-1e40710a6461\nlrwxrwxrwx 1 root root 0 29. Okt 08:58 w1_bus_master1 -> ../../../devices/w1_bus_master1\n```\n\nWithin a device folder different files are available for typical access.\n\n```sh\nls -la /sys/bus/w1/devices/28-072261452f18/\ninsgesamt 0\ndrwxr-xr-x 4 root root    0 29. Okt 08:58 .\ndrwxr-xr-x 6 root root    0 29. Okt 08:58 ..\n-rw-r--r-- 1 root root 4096 31. Okt 07:57 alarms\n-rw-r--r-- 1 root root 4096 31. Okt 07:57 conv_time\nlrwxrwxrwx 1 root root    0 31. Okt 07:57 driver -> ../../../bus/w1/drivers/w1_slave_driver\n--w------- 1 root root 4096 31. Okt 07:57 eeprom_cmd\n-r--r--r-- 1 root root 4096 31. Okt 07:57 ext_power\n-rw-r--r-- 1 root root 4096 31. Okt 07:57 features\ndrwxr-xr-x 3 root root    0 29. Okt 08:58 hwmon\n-r--r--r-- 1 root root 4096 31. Okt 07:57 id\n-r--r--r-- 1 root root 4096 31. Okt 07:57 name\ndrwxr-xr-x 2 root root    0 31. Okt 07:13 power\n-rw-r--r-- 1 root root 4096 31. Okt 11:10 resolution\nlrwxrwxrwx 1 root root    0 29. Okt 08:58 subsystem -> ../../../bus/w1\n-r--r--r-- 1 root root 4096 31. Okt 07:57 temperature\n-rw-r--r-- 1 root root 4096 29. Okt 08:58 uevent\n-rw-r--r-- 1 root root 4096 31. Okt 07:57 w1_slave\n```\n\nThis files depends on the family driver.\n\n## Different access levels and modes\n\nCurrently gobot supports only direct access to the devices in automatic search mode of the controller device. The\nimplementation is similar to the sysfs access of the analog pin driver.\n\nE.g. if the cyclic device search should be avoided, the access to the controller device is needed, see Kernel\ndocumentation. If this will be implemented in the future, have in mind that more than one controller devices are\npossible. The gobot's 1-wire architecture can be changed then similar to SPI or I2C.\n\n## Troubleshooting\n\nIf something is not working, please check this points:\n\nIs the correct gpio used: `cat /sys/kernel/debug/gpio`\nDoes the base path exist: `ls /sys/bus/w1/`\nIs the Kernel module loaded: `lsmod | grep wire`\nIs the onewire support activated in the device tree: `dtc -I fs -O dts /sys/firmware/devicetree/base | grep onewire`\nIs there an according overlay on the system: `locate w1-gpio`\nIs the overlay loading configured: `cat /boot/armbianEnv.txt`\nIs the content of the overlay correct: `dtc -I dtb -O dts -o <name>-w1-gpio.dtbo.dts /boot/dtb/overlay/<name>-w1-gpio.dtbo`\n"
  },
  {
    "path": "system/PWM.md",
    "content": "# PWM's\n\nThis document describes some basics for developers.\n\n## Check the PWM features\n\nExample for Tinkerboard:\n\n```sh\n# ls -la /sys/class/pwm/\ntotal 0\ndrwxr-xr-x  2 root root 0 Apr 24 14:11 .\ndrwxr-xr-x 66 root root 0 Apr 24 14:09 ..\nlrwxrwxrwx  1 root root 0 Apr 24 14:09 pwmchip0 -> ../../devices/platform/ff680000.pwm/pwm/pwmchip0\nlrwxrwxrwx  1 root root 0 Apr 24 14:09 pwmchip1 -> ../../devices/platform/ff680010.pwm/pwm/pwmchip1\nlrwxrwxrwx  1 root root 0 Apr 24 14:09 pwmchip2 -> ../../devices/platform/ff680030.pwm/pwm/pwmchip2\n```\n\n```sh\n# ls -la /sys/class/pwm/pwmchip2/\ntotal 0\ndrwxr-xr-x 3 root root    0 Apr 24 14:17 .\ndrwxr-xr-x 3 root root    0 Apr 24 14:17 ..\nlrwxrwxrwx 1 root root    0 Apr 24 14:17 device -> ../../../ff680030.pwm\n--w------- 1 root root 4096 Apr 24 14:17 export\n-r--r--r-- 1 root root 4096 Apr 24 14:17 npwm\ndrwxr-xr-x 2 root root    0 Apr 24 14:17 power\nlrwxrwxrwx 1 root root    0 Apr 24 14:17 subsystem -> ../../../../../class/pwm\n-rw-r--r-- 1 root root 4096 Apr 24 14:17 uevent\n--w------- 1 root root 4096 Apr 24 14:17 unexport\n```\n\n## General PWM tests\n\nConnect an oscilloscope or at least a meter to the pin (used pin32 for example with Tinkerboard).  \nSwitch to root user by \"su -\".\n\n### Investigate state of PWMs\n\nFor Tinkerboard:\n\n* ff680000 and ff680010 seems to be not usable (unknown, which functionality make use of that, maybe fan?)\n* if there is no ff680020, ff680030, this can be activated. See section [Change available features](README.md#change-available-features)\n\n### Creating pwm0 on pwmchip2\n\n```sh\necho 0 > /sys/class/pwm/pwmchip2/export\n```\n\ninvestigate result:\n\n```sh\n# ls /sys/class/pwm/pwmchip2/\ndevice  export  npwm  power  pwm0  subsystem  uevent  unexport\n\n# ls /sys/class/pwm/pwmchip2/pwm0/\ncapture  duty_cycle  enable  period  polarity  power  uevent\n\n# cat /sys/class/pwm/pwmchip2/pwm0/period \n0\n\n# cat /sys/class/pwm/pwmchip2/pwm0/duty_cycle \n0\n\n# cat /sys/class/pwm/pwmchip2/pwm0/enable \n0\n\n# cat /sys/class/pwm/pwmchip2/pwm0/polarity \ninversed\n```\n\n### Initialization of pwm0\n\n```sh\necho 10000000 > /sys/class/pwm/pwmchip2/pwm0/period\necho \"normal\" > /sys/class/pwm/pwmchip2/pwm0/polarity\necho 3000000 > /sys/class/pwm/pwmchip2/pwm0/duty_cycle # this means 30%\necho 1  > /sys/class/pwm/pwmchip2/pwm0/enable\n\n```\n\n> Before writing the period, all other write actions will cause an error \"-bash: echo: write error: Invalid argument\".\n> The \"period\" is in nanoseconds (or a frequency divider for 1GHz), 1000 will produce a frequency of 1MHz, 1000000 will\n> cause a frequency of 1kHz. For the example 10000000 we have 100Hz.\n\nNow we should measure a value of around 1V with the meter, because the basis value is 3.3V and 30% leads to 1V.\n\nTry to inverse the sequence:\n`echo \"inversed\" > /sys/class/pwm/pwmchip2/pwm0/polarity`\nNow we should measure a value of around 2.3V with the meter, which is the difference of 1V to 3.3V.\n\nIf we have attached an oscilloscope we can play around with the values for period and duty_cycle and see what happen.\n\n## Links\n\n* <https://docs.kernel.org/driver-api/pwm.html>\n"
  },
  {
    "path": "system/README.md",
    "content": "# system\n\nThis document describes some basics for developers.\n\n> The gobot package name is a little bit misleading, because also contains `/dev/i2c-*` usage with syscall for i2c\n> interface and the file system mock for unit testing.\n\n## Change available features on TinkerOS (Tinkerboard)\n\nOpen the file /boot/config.txt and add lines/remove comment sign. Then save the file, close and reboot.\n\n### For PWM on TinkerOS (Tinkerboard)\n\nintf:pwm2=on\nintf:pwm3=on\n\n### For i2c on TinkerOS (Tinkerboard)\n\nintf:i2c1=on\nintf:i2c4=on\n\nDevice tree overlays can also be provided, e.g. \"overlay=i2c-100kbit-tinker-overlay\".\n\nCreate a dts-file \"i2c1-100kbit-tinker-overlay.dts\" with this content:\n\n```c\n// Definitions for i2c1 with 100 kbit\n/dts-v1/;\n/plugin/;\n\n/ {\n  compatible = \"rockchip,rk3288-evb-rk808-linux\", \"rockchip,rk3288\";\n\n  fragment@0 {\n    target = <&i2c1>;\n    __overlay__ {\n      status = \"okay\";\n      clock-frequency = <100000>;\n    };\n  };\n};\n```\n\nCompile the tree overlay:\n\n```sh\ndtc -@ -I dts -O dtb -o i2c1-100kbit-tinker-overlay.dtbo i2c1-100kbit-tinker-overlay.dts\n```\n\nCopy the file to \"/boot/overlays/i2c-100kbit-tinker-overlay.dtbo\"\n\n> Package \"device-tree-compiler\" needs to be installed for \"dtc\" command.\n\n## Change available features on raspi\n\nStart \"raspi-config\" and go to the menu \"interface options\". After change something save and reboot the device.\n\n## Change available features on armbian\n\nInstall the armbian-config utility (howto is shown after each login) and start it.\n\n### For i2c on armbian\n\nOpen the related menu entry and activate/deactivate the needed features.\n\n### For PWM on armbian\n\nGo to the device tree menu - this opens the device tree for editing.  \nLooking for the pwm entries. There are some marked with \"disabled\". Change the entry to \"okay\" for your needed pwm.\n\nExample for Tinkerboard:\n\nff680020 => pwm2, pin33\nff680030 => pwm3, pin32\n\n## Next steps for developers\n\n* test [gpio](GPIO.md)\n* test [pwm](PWM.md)\n* background information for [i2c](I2C.md) in gobot\n\n## Links\n\n* <https://www.digi.com/resources/documentation/digidocs/embedded/dey/3.0/cc8x/bsp_r_create-dt-overlays>\n"
  },
  {
    "path": "system/analogpin_sysfs.go",
    "content": "package system\n\nimport \"fmt\"\n\ntype analogPinSysFs struct {\n\tsysfsPath string\n\tr, w      bool\n\tsfa       *sysfsFileAccess\n}\n\nfunc newAnalogPinSysfs(sfa *sysfsFileAccess, path string, r, w bool) *analogPinSysFs {\n\tp := &analogPinSysFs{\n\t\tsysfsPath: path,\n\t\tsfa:       sfa,\n\t\tr:         r,\n\t\tw:         w,\n\t}\n\treturn p\n}\n\n// Read reads a value from sysf path\nfunc (p *analogPinSysFs) Read() (int, error) {\n\tif !p.r {\n\t\treturn 0, fmt.Errorf(\"the pin '%s' is not allowed to read\", p.sysfsPath)\n\t}\n\n\treturn p.sfa.readInteger(p.sysfsPath)\n}\n\n// Write writes a value to sysf path\nfunc (p *analogPinSysFs) Write(val int) error {\n\tif !p.w {\n\t\treturn fmt.Errorf(\"the pin '%s' is not allowed to write (val: %v)\", p.sysfsPath, val)\n\t}\n\n\treturn p.sfa.writeInteger(p.sysfsPath, val)\n}\n"
  },
  {
    "path": "system/analogpin_sysfs_test.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_newAnalogPinSysfs(t *testing.T) {\n\t// arrange\n\tm := &MockFilesystem{}\n\tsfa := sysfsFileAccess{fs: m, readBufLen: 2}\n\tconst path = \"/sys/whatever\"\n\t// act\n\tpin := newAnalogPinSysfs(&sfa, path, true, false)\n\t// assert\n\tassert.Equal(t, path, pin.sysfsPath)\n\tassert.Equal(t, &sfa, pin.sfa)\n\tassert.True(t, pin.r)\n\tassert.False(t, pin.w)\n}\n\nfunc TestRead(t *testing.T) {\n\tconst (\n\t\tsysfsPath = \"/sys/testread\"\n\t\tvalue     = \"32\"\n\t)\n\ttests := map[string]struct {\n\t\treadable bool\n\t\tsimErr   bool\n\t\twantVal  int\n\t\twantErr  string\n\t}{\n\t\t\"read_ok\": {\n\t\t\treadable: true,\n\t\t\twantVal:  32,\n\t\t},\n\t\t\"error_not_readable\": {\n\t\t\treadable: false,\n\t\t\twantErr:  \"the pin '/sys/testread' is not allowed to read\",\n\t\t},\n\t\t\"error_on_read\": {\n\t\t\treadable: true,\n\t\t\tsimErr:   true,\n\t\t\twantErr:  \"read error\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tfs := newMockFilesystem([]string{sysfsPath})\n\t\t\tsfa := sysfsFileAccess{fs: fs, readBufLen: 2}\n\t\t\tpin := newAnalogPinSysfs(&sfa, sysfsPath, tc.readable, false)\n\t\t\tfs.Files[sysfsPath].Contents = value\n\t\t\tif tc.simErr {\n\t\t\t\tfs.Files[sysfsPath].simulateReadError = fmt.Errorf(\"read error\")\n\t\t\t}\n\t\t\t// act\n\t\t\tgot, err := pin.Read()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantVal, got)\n\t\t})\n\t}\n}\n\nfunc TestWrite(t *testing.T) {\n\tconst (\n\t\tsysfsPath = \"/sys/testwrite\"\n\t\toldVal    = \"old_value\"\n\t)\n\ttests := map[string]struct {\n\t\twriteable bool\n\t\tsimErr    bool\n\t\twantVal   string\n\t\twantErr   string\n\t}{\n\t\t\"write_ok\": {\n\t\t\twriteable: true,\n\t\t\twantVal:   \"23\",\n\t\t},\n\t\t\"error_not_writeable\": {\n\t\t\twriteable: false,\n\t\t\twantErr:   \"the pin '/sys/testwrite' is not allowed to write (val: 23)\",\n\t\t\twantVal:   oldVal,\n\t\t},\n\t\t\"error_on_write\": {\n\t\t\twriteable: true,\n\t\t\tsimErr:    true,\n\t\t\twantErr:   \"write error\",\n\t\t\twantVal:   \"23\", // the mock is implemented in this way\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tfs := newMockFilesystem([]string{sysfsPath})\n\t\t\tsfa := sysfsFileAccess{fs: fs, readBufLen: 10}\n\t\t\tpin := newAnalogPinSysfs(&sfa, sysfsPath, false, tc.writeable)\n\t\t\tfs.Files[sysfsPath].Contents = oldVal\n\t\t\tif tc.simErr {\n\t\t\t\tfs.Files[sysfsPath].simulateWriteError = fmt.Errorf(\"write error\")\n\t\t\t}\n\t\t\t// act\n\t\t\terr := pin.Write(23)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.EqualError(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantVal, fs.Files[sysfsPath].Contents)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "system/digitalpin_bench_test.go",
    "content": "package system\n\nimport (\n\t\"testing\"\n)\n\nfunc BenchmarkDigitalRead(b *testing.B) {\n\ta := NewAccesser()\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio10/value\",\n\t\t\"/sys/class/gpio/gpio10/direction\",\n\t}\n\ta.UseMockFilesystem(mockPaths)\n\n\tpin := a.NewDigitalPin(\"\", 10)\n\t_ = pin.Write(1)\n\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _ = pin.Read()\n\t}\n}\n"
  },
  {
    "path": "system/digitalpin_cdev.go",
    "content": "package system\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\tgpiocdev \"github.com/warthog618/go-gpiocdev\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst systemCdevDebug = false\n\ntype cdevLine interface {\n\tSetValue(value int) error\n\tValue() (int, error)\n\tClose() error\n}\n\ntype digitalPinCdev struct {\n\t*digitalPinConfig\n\n\tchipName string\n\tpin      int\n\tline     cdevLine\n}\n\nvar digitalPinCdevReconfigure = digitalPinCdevReconfigureLine // to allow unit testing\n\nvar (\n\tdigitalPinCdevUsed      = map[bool]string{true: \"used\", false: \"unused\"}\n\tdigitalPinCdevActiveLow = map[bool]string{true: \"low\", false: \"high\"}\n\tdigitalPinCdevDebounced = map[bool]string{true: \"debounced\", false: \"not debounced\"}\n)\n\nvar digitalPinCdevDirection = map[gpiocdev.LineDirection]string{\n\tgpiocdev.LineDirectionUnknown: \"unknown direction\",\n\tgpiocdev.LineDirectionInput:   \"input\", gpiocdev.LineDirectionOutput: \"output\",\n}\n\nvar digitalPinCdevDrive = map[gpiocdev.LineDrive]string{\n\tgpiocdev.LineDrivePushPull: \"push-pull\", gpiocdev.LineDriveOpenDrain: \"open-drain\",\n\tgpiocdev.LineDriveOpenSource: \"open-source\",\n}\n\nvar digitalPinCdevBias = map[gpiocdev.LineBias]string{\n\tgpiocdev.LineBiasUnknown: \"unknown\", gpiocdev.LineBiasDisabled: \"disabled\",\n\tgpiocdev.LineBiasPullUp: \"pull-up\", gpiocdev.LineBiasPullDown: \"pull-down\",\n}\n\nvar digitalPinCdevEdgeDetect = map[gpiocdev.LineEdge]string{\n\tgpiocdev.LineEdgeNone: \"no\", gpiocdev.LineEdgeRising: \"rising\",\n\tgpiocdev.LineEdgeFalling: \"falling\", gpiocdev.LineEdgeBoth: \"both\",\n}\n\nvar digitalPinCdevEventClock = map[gpiocdev.LineEventClock]string{\n\tgpiocdev.LineEventClockMonotonic: \"monotonic\",\n\tgpiocdev.LineEventClockRealtime:  \"realtime\",\n}\n\n// newDigitalPinCdev returns a digital pin given the pin number, with the label \"gobotio\" followed by the pin number.\n// The pin label can be modified optionally. The pin is handled by the character device Kernel ABI.\nfunc newDigitalPinCdev(chipName string, pin int, options ...func(gobot.DigitalPinOptioner) bool) *digitalPinCdev {\n\tif chipName == \"\" {\n\t\tchipName = \"gpiochip0\"\n\t}\n\tcfg := newDigitalPinConfig(\"gobotio\"+strconv.Itoa(pin), options...)\n\td := &digitalPinCdev{\n\t\tchipName:         chipName,\n\t\tpin:              pin,\n\t\tdigitalPinConfig: cfg,\n\t}\n\treturn d\n}\n\n// ApplyOptions apply all given options to the pin immediately. Implements interface gobot.DigitalPinOptionApplier.\nfunc (d *digitalPinCdev) ApplyOptions(options ...func(gobot.DigitalPinOptioner) bool) error {\n\tanyChange := false\n\tfor _, option := range options {\n\t\tanyChange = option(d) || anyChange\n\t}\n\tif anyChange {\n\t\treturn digitalPinCdevReconfigure(d, false)\n\t}\n\treturn nil\n}\n\n// DirectionBehavior gets the direction behavior when the pin is used the next time. This means its possibly not in\n// this direction type at the moment. Implements the interface gobot.DigitalPinValuer, but should be rarely used.\nfunc (d *digitalPinCdev) DirectionBehavior() string {\n\treturn d.direction\n}\n\n// Export sets the pin as used by this driver. Implements the interface gobot.DigitalPinner.\nfunc (d *digitalPinCdev) Export() error {\n\terr := digitalPinCdevReconfigure(d, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cdev.Export(): %v\", err)\n\t}\n\treturn nil\n}\n\n// Unexport releases the pin as input. Implements the interface gobot.DigitalPinner.\nfunc (d *digitalPinCdev) Unexport() error {\n\tvar errs []string\n\tif d.line != nil {\n\t\tif err := digitalPinCdevReconfigure(d, true); err != nil {\n\t\t\terrs = append(errs, err.Error())\n\t\t}\n\t\tif err := d.line.Close(); err != nil {\n\t\t\terr = fmt.Errorf(\"cdev.Unexport()-line.Close(): %v\", err)\n\t\t\terrs = append(errs, err.Error())\n\t\t}\n\t}\n\tif len(errs) == 0 {\n\t\treturn nil\n\t}\n\n\treturn errors.New(strings.Join(errs, \",\"))\n}\n\n// Write writes the given value to the character device. Implements the interface gobot.DigitalPinner.\nfunc (d *digitalPinCdev) Write(val int) error {\n\tif val < 0 {\n\t\tval = 0\n\t}\n\tif val > 1 {\n\t\tval = 1\n\t}\n\n\terr := d.line.SetValue(val)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cdev.Write(): %v\", err)\n\t}\n\treturn nil\n}\n\n// Read reads the given value from character device. Implements the interface gobot.DigitalPinner.\nfunc (d *digitalPinCdev) Read() (int, error) {\n\tval, err := d.line.Value()\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"cdev.Read(): %v\", err)\n\t}\n\treturn val, err\n}\n\n// ListLines is used for development purposes.\nfunc (d *digitalPinCdev) ListLines() error {\n\tc, err := gpiocdev.NewChip(d.chipName, gpiocdev.WithConsumer(d.label))\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor i := 0; i < c.Lines(); i++ {\n\t\tli, err := c.LineInfo(i)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfmt.Println(digitalPinCdevFmtLine(li))\n\t}\n\n\treturn nil\n}\n\n// List is used for development purposes.\nfunc (d *digitalPinCdev) List() error {\n\tc, err := gpiocdev.NewChip(d.chipName)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer c.Close()\n\tl, err := c.RequestLine(d.pin)\n\tif err != nil && l != nil {\n\t\tl.Close()\n\t\tl = nil\n\t}\n\tli, err := l.Info()\n\tif err != nil {\n\t\treturn err\n\t}\n\tfmt.Println(digitalPinCdevFmtLine(li))\n\n\treturn nil\n}\n\nfunc digitalPinCdevReconfigureLine(d *digitalPinCdev, forceInput bool) error {\n\t// cleanup old line\n\tif d.line != nil {\n\t\td.line.Close()\n\t}\n\td.line = nil\n\n\t// acquire chip, temporary\n\t// the given label is applied to all lines, which are requested on the chip\n\tgpiodChip, err := gpiocdev.NewChip(d.chipName, gpiocdev.WithConsumer(d.label))\n\tid := fmt.Sprintf(\"%s-%d\", d.chipName, d.pin)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cdev.reconfigure(%s)-lib.NewChip(%s): %v\", id, d.chipName, err)\n\t}\n\tdefer gpiodChip.Close()\n\n\t// collect line configuration options\n\tvar opts []gpiocdev.LineReqOption\n\n\t// configure direction, debounce period (inputs only), edge detection (inputs only) and drive (outputs only)\n\tif d.direction == IN || forceInput {\n\t\tif systemCdevDebug {\n\t\t\tlog.Printf(\"input (%s): debounce %s, edge %d, handler %t, inverse %t, bias %d\",\n\t\t\t\tid, d.debouncePeriod, d.edge, d.edgeEventHandler != nil, d.activeLow, d.bias)\n\t\t}\n\t\topts = append(opts, gpiocdev.AsInput)\n\t\tif !forceInput && d.drive != digitalPinDrivePushPull && systemCdevDebug {\n\t\t\tlog.Printf(\"\\n++ drive option (%d) is dropped for input++\\n\", d.drive)\n\t\t}\n\t\tif d.debouncePeriod != 0 {\n\t\t\topts = append(opts, gpiocdev.WithDebounce(d.debouncePeriod))\n\t\t}\n\t\t// edge detection\n\t\tif d.edgeEventHandler != nil && d.pollInterval <= 0 {\n\t\t\t// use edge detection provided by gpiocdev\n\t\t\twrappedHandler := digitalPinCdevGetWrappedEventHandler(d.edgeEventHandler)\n\t\t\tswitch d.edge {\n\t\t\tcase digitalPinEventOnFallingEdge:\n\t\t\t\topts = append(opts, gpiocdev.WithEventHandler(wrappedHandler), gpiocdev.WithFallingEdge)\n\t\t\tcase digitalPinEventOnRisingEdge:\n\t\t\t\topts = append(opts, gpiocdev.WithEventHandler(wrappedHandler), gpiocdev.WithRisingEdge)\n\t\t\tcase digitalPinEventOnBothEdges:\n\t\t\t\topts = append(opts, gpiocdev.WithEventHandler(wrappedHandler), gpiocdev.WithBothEdges)\n\t\t\tdefault:\n\t\t\t\topts = append(opts, gpiocdev.WithoutEdges)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif systemCdevDebug {\n\t\t\tlog.Printf(\"output (%s): ini-state %d, drive %d, inverse %t, bias %d\",\n\t\t\t\tid, d.outInitialState, d.drive, d.activeLow, d.bias)\n\t\t}\n\t\topts = append(opts, gpiocdev.AsOutput(d.outInitialState))\n\t\tswitch d.drive {\n\t\tcase digitalPinDriveOpenDrain:\n\t\t\topts = append(opts, gpiocdev.AsOpenDrain)\n\t\tcase digitalPinDriveOpenSource:\n\t\t\topts = append(opts, gpiocdev.AsOpenSource)\n\t\tdefault:\n\t\t\topts = append(opts, gpiocdev.AsPushPull)\n\t\t}\n\t\tif d.debouncePeriod != 0 && systemCdevDebug {\n\t\t\tlog.Printf(\"\\n++debounce option (%d) is dropped for output++\\n\", d.drive)\n\t\t}\n\t\tif d.edgeEventHandler != nil || d.edge != digitalPinEventNone && systemCdevDebug {\n\t\t\tlog.Printf(\"\\n++edge detection is dropped for output++\\n\")\n\t\t}\n\t}\n\n\t// configure inverse logic (inputs and outputs)\n\tif d.activeLow {\n\t\topts = append(opts, gpiocdev.AsActiveLow)\n\t}\n\n\t// configure bias (inputs and outputs)\n\tswitch d.bias {\n\tcase digitalPinBiasPullDown:\n\t\topts = append(opts, gpiocdev.WithPullDown)\n\tcase digitalPinBiasPullUp:\n\t\topts = append(opts, gpiocdev.WithPullUp)\n\tdefault:\n\t\topts = append(opts, gpiocdev.WithBiasAsIs)\n\t}\n\n\t// acquire line with collected options\n\tgpiodLine, err := gpiodChip.RequestLine(d.pin, opts...)\n\tif err != nil {\n\t\tif gpiodLine != nil {\n\t\t\tgpiodLine.Close()\n\t\t}\n\t\td.line = nil\n\n\t\treturn fmt.Errorf(\"cdev.reconfigure(%s)-c.RequestLine(%d, %v): %v\", id, d.pin, opts, err)\n\t}\n\td.line = gpiodLine\n\n\t// start discrete polling function and wait for first read is done\n\tif (d.direction == IN || forceInput) && d.pollInterval > 0 {\n\t\tif err := startEdgePolling(d.label, d.Read, d.pollInterval, d.edge, d.edgeEventHandler,\n\t\t\td.pollQuitChan); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc digitalPinCdevGetWrappedEventHandler(\n\thandler func(int, time.Duration, string, uint32, uint32),\n) func(gpiocdev.LineEvent) {\n\treturn func(evt gpiocdev.LineEvent) {\n\t\tdetectedEdge := \"none\"\n\t\tswitch evt.Type {\n\t\tcase gpiocdev.LineEventRisingEdge:\n\t\t\tdetectedEdge = DigitalPinEventRisingEdge\n\t\tcase gpiocdev.LineEventFallingEdge:\n\t\t\tdetectedEdge = DigitalPinEventFallingEdge\n\t\t}\n\t\thandler(evt.Offset, evt.Timestamp, detectedEdge, evt.Seqno, evt.LineSeqno)\n\t}\n}\n\nfunc digitalPinCdevFmtLine(li gpiocdev.LineInfo) string {\n\tvar consumer string\n\tif li.Consumer != \"\" {\n\t\tconsumer = fmt.Sprintf(\" by '%s'\", li.Consumer)\n\t}\n\treturn fmt.Sprintf(\"++ Info line %d '%s', %s%s ++\\n Config: %s\\n\",\n\t\tli.Offset, li.Name, digitalPinCdevUsed[li.Used], consumer, digitalPinCdevFmtLineConfig(li.Config))\n}\n\nfunc digitalPinCdevFmtLineConfig(cfg gpiocdev.LineConfig) string {\n\tt := \"active-%s, %s, %s, %s bias, %s edge detect, %s, debounce-period: %v, %s event clock\"\n\treturn fmt.Sprintf(t, digitalPinCdevActiveLow[cfg.ActiveLow], digitalPinCdevDirection[cfg.Direction],\n\t\tdigitalPinCdevDrive[cfg.Drive], digitalPinCdevBias[cfg.Bias], digitalPinCdevEdgeDetect[cfg.EdgeDetection],\n\t\tdigitalPinCdevDebounced[cfg.Debounced], cfg.DebouncePeriod, digitalPinCdevEventClock[cfg.EventClock])\n}\n"
  },
  {
    "path": "system/digitalpin_cdev_test.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar (\n\t_ gobot.DigitalPinner           = (*digitalPinCdev)(nil)\n\t_ gobot.DigitalPinValuer        = (*digitalPinCdev)(nil)\n\t_ gobot.DigitalPinOptioner      = (*digitalPinCdev)(nil)\n\t_ gobot.DigitalPinOptionApplier = (*digitalPinCdev)(nil)\n)\n\nfunc Test_newDigitalPinCdev(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tchip  = \"gpiochip0\"\n\t\tpin   = 17\n\t\tlabel = \"gobotio17\"\n\t)\n\t// act\n\td := newDigitalPinCdev(chip, pin)\n\t// assert\n\tassert.NotNil(t, d)\n\tassert.Equal(t, chip, d.chipName)\n\tassert.Equal(t, pin, d.pin)\n\tassert.Equal(t, label, d.label)\n\tassert.Equal(t, IN, d.direction)\n\tassert.Equal(t, 0, d.outInitialState)\n}\n\nfunc Test_newDigitalPinCdevWithOptions(t *testing.T) {\n\t// This is a general test, that options are applied by using \"newDigitalPinCdev\" with the WithPinLabel() option.\n\t// All other configuration options will be tested in tests for \"digitalPinConfig\".\n\t//\n\t// arrange\n\tconst label = \"my own label\"\n\t// act\n\tdp := newDigitalPinCdev(\"\", 9, WithPinLabel(label))\n\t// assert\n\tassert.Equal(t, label, dp.label)\n}\n\nfunc TestApplyOptions(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanged          []bool\n\t\tsimErr           error\n\t\twantReconfigured int\n\t\twantErr          error\n\t}{\n\t\t\"both_changed\": {\n\t\t\tchanged:          []bool{true, true},\n\t\t\twantReconfigured: 1,\n\t\t},\n\t\t\"first_changed\": {\n\t\t\tchanged:          []bool{true, false},\n\t\t\twantReconfigured: 1,\n\t\t},\n\t\t\"second_changed\": {\n\t\t\tchanged:          []bool{false, true},\n\t\t\twantReconfigured: 1,\n\t\t},\n\t\t\"none_changed\": {\n\t\t\tchanged:          []bool{false, false},\n\t\t\tsimErr:           fmt.Errorf(\"error not raised\"),\n\t\t\twantReconfigured: 0,\n\t\t},\n\t\t\"error_on_change\": {\n\t\t\tchanged:          []bool{false, true},\n\t\t\tsimErr:           fmt.Errorf(\"error raised\"),\n\t\t\twantReconfigured: 1,\n\t\t\twantErr:          fmt.Errorf(\"error raised\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// currently the gpiocdev.Chip has no interface for RequestLine(),\n\t\t\t// so we can only test without trigger of real reconfigure\n\t\t\t// arrange\n\t\t\torgReconf := digitalPinCdevReconfigure\n\t\t\tdefer func() { digitalPinCdevReconfigure = orgReconf }()\n\n\t\t\tinputForced := true\n\t\t\treconfigured := 0\n\t\t\tdigitalPinCdevReconfigure = func(d *digitalPinCdev, forceInput bool) error {\n\t\t\t\tinputForced = forceInput\n\t\t\t\treconfigured++\n\t\t\t\treturn tc.simErr\n\t\t\t}\n\t\t\td := &digitalPinCdev{digitalPinConfig: &digitalPinConfig{direction: \"in\"}}\n\t\t\toptionFunction1 := func(gobot.DigitalPinOptioner) bool {\n\t\t\t\td.direction = \"test\"\n\t\t\t\treturn tc.changed[0]\n\t\t\t}\n\t\t\toptionFunction2 := func(gobot.DigitalPinOptioner) bool {\n\t\t\t\td.drive = 15\n\t\t\t\treturn tc.changed[1]\n\t\t\t}\n\t\t\t// act\n\t\t\terr := d.ApplyOptions(optionFunction1, optionFunction2)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, \"test\", d.direction)\n\t\t\tassert.Equal(t, 15, d.drive)\n\t\t\tassert.Equal(t, tc.wantReconfigured, reconfigured)\n\t\t\tif reconfigured > 0 {\n\t\t\t\tassert.False(t, inputForced)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestExport_cdev(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimErr           error\n\t\twantReconfigured int\n\t\twantErr          error\n\t}{\n\t\t\"no_err\": {\n\t\t\twantReconfigured: 1,\n\t\t},\n\t\t\"error\": {\n\t\t\twantReconfigured: 1,\n\t\t\tsimErr:           fmt.Errorf(\"reconfigure error\"),\n\t\t\twantErr:          fmt.Errorf(\"cdev.Export(): reconfigure error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// currently the gpiocdev.Chip has no interface for RequestLine(),\n\t\t\t// so we can only test without trigger of real reconfigure\n\t\t\t// arrange\n\t\t\torgReconf := digitalPinCdevReconfigure\n\t\t\tdefer func() { digitalPinCdevReconfigure = orgReconf }()\n\n\t\t\tinputForced := true\n\t\t\treconfigured := 0\n\t\t\tdigitalPinCdevReconfigure = func(d *digitalPinCdev, forceInput bool) error {\n\t\t\t\tinputForced = forceInput\n\t\t\t\treconfigured++\n\t\t\t\treturn tc.simErr\n\t\t\t}\n\t\t\td := &digitalPinCdev{}\n\t\t\t// act\n\t\t\terr := d.Export()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.False(t, inputForced)\n\t\t\tassert.Equal(t, tc.wantReconfigured, reconfigured)\n\t\t})\n\t}\n}\n\nfunc TestUnexport_cdev(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimNoLine        bool\n\t\tsimReconfErr     error\n\t\tsimCloseErr      error\n\t\twantReconfigured int\n\t\twantErr          error\n\t}{\n\t\t\"no_line_no_err\": {\n\t\t\tsimNoLine:        true,\n\t\t\twantReconfigured: 0,\n\t\t},\n\t\t\"no_line_with_err\": {\n\t\t\tsimNoLine:        true,\n\t\t\tsimReconfErr:     fmt.Errorf(\"reconfigure error\"),\n\t\t\twantReconfigured: 0,\n\t\t},\n\t\t\"no_err\": {\n\t\t\twantReconfigured: 1,\n\t\t},\n\t\t\"error_reconfigure\": {\n\t\t\twantReconfigured: 1,\n\t\t\tsimReconfErr:     fmt.Errorf(\"reconfigure error\"),\n\t\t\twantErr:          fmt.Errorf(\"reconfigure error\"),\n\t\t},\n\t\t\"error_close\": {\n\t\t\twantReconfigured: 1,\n\t\t\tsimCloseErr:      fmt.Errorf(\"close error\"),\n\t\t\twantErr:          fmt.Errorf(\"cdev.Unexport()-line.Close(): close error\"),\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// currently the gpiocdev.Chip has no interface for RequestLine(),\n\t\t\t// so we can only test without trigger of real reconfigure\n\t\t\t// arrange\n\t\t\torgReconf := digitalPinCdevReconfigure\n\t\t\tdefer func() { digitalPinCdevReconfigure = orgReconf }()\n\n\t\t\tinputForced := false\n\t\t\treconfigured := 0\n\t\t\tdigitalPinCdevReconfigure = func(d *digitalPinCdev, forceInput bool) error {\n\t\t\t\tinputForced = forceInput\n\t\t\t\treconfigured++\n\t\t\t\treturn tc.simReconfErr\n\t\t\t}\n\t\t\tdp := newDigitalPinCdev(\"\", 4)\n\t\t\tif !tc.simNoLine {\n\t\t\t\tdp.line = &lineMock{simCloseErr: tc.simCloseErr}\n\t\t\t}\n\t\t\t// act\n\t\t\terr := dp.Unexport()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.wantErr, err)\n\t\t\tassert.Equal(t, tc.wantReconfigured, reconfigured)\n\t\t\tif reconfigured > 0 {\n\t\t\t\tassert.True(t, inputForced)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWrite_cdev(t *testing.T) {\n\ttests := map[string]struct {\n\t\tval     int\n\t\tsimErr  error\n\t\twant    int\n\t\twantErr []string\n\t}{\n\t\t\"write_zero\": {\n\t\t\tval:  0,\n\t\t\twant: 0,\n\t\t},\n\t\t\"write_one\": {\n\t\t\tval:  1,\n\t\t\twant: 1,\n\t\t},\n\t\t\"write_minus_one\": {\n\t\t\tval:  -1,\n\t\t\twant: 0,\n\t\t},\n\t\t\"write_two\": {\n\t\t\tval:  2,\n\t\t\twant: 1,\n\t\t},\n\t\t\"write_with_err\": {\n\t\t\tsimErr:  fmt.Errorf(\"a write err\"),\n\t\t\twantErr: []string{\"a write err\", \"cdev.Write\"},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdp := newDigitalPinCdev(\"\", 4)\n\t\t\tlm := &lineMock{lastVal: 10, simSetErr: tc.simErr}\n\t\t\tdp.line = lm\n\t\t\t// act\n\t\t\terr := dp.Write(tc.val)\n\t\t\t// assert\n\t\t\tif tc.wantErr != nil {\n\t\t\t\tfor _, want := range tc.wantErr {\n\t\t\t\t\trequire.ErrorContains(t, err, want)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.want, lm.lastVal)\n\t\t})\n\t}\n}\n\nfunc TestRead_cdev(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimVal  int\n\t\tsimErr  error\n\t\twantErr []string\n\t}{\n\t\t\"read_ok\": {\n\t\t\tsimVal: 3,\n\t\t},\n\t\t\"write_with_err\": {\n\t\t\tsimErr:  fmt.Errorf(\"a read err\"),\n\t\t\twantErr: []string{\"a read err\", \"cdev.Read\"},\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdp := newDigitalPinCdev(\"\", 4)\n\t\t\tlm := &lineMock{lastVal: tc.simVal, simValueErr: tc.simErr}\n\t\t\tdp.line = lm\n\t\t\t// act\n\t\t\tgot, err := dp.Read()\n\t\t\t// assert\n\t\t\tif tc.wantErr != nil {\n\t\t\t\tfor _, want := range tc.wantErr {\n\t\t\t\t\trequire.ErrorContains(t, err, want)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, got, tc.simVal)\n\t\t})\n\t}\n}\n\ntype lineMock struct {\n\tlastVal     int\n\tsimSetErr   error\n\tsimValueErr error\n\tsimCloseErr error\n}\n\nfunc (lm *lineMock) SetValue(value int) error { lm.lastVal = value; return lm.simSetErr }\nfunc (lm *lineMock) Value() (int, error)      { return lm.lastVal, lm.simValueErr }\nfunc (lm *lineMock) Close() error             { return lm.simCloseErr }\n"
  },
  {
    "path": "system/digitalpin_mock.go",
    "content": "package system\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype simulateErrors struct {\n\tapplyOption bool\n\texport      bool\n\twrite       bool\n\tread        bool\n\tunexport    bool\n}\n\ntype mockDigitalPinAccess struct {\n\tunderlyingDigitalPinAccess digitalPinAccesser\n\tvalues                     map[string][]int\n\tsimulateErrors             map[string]simulateErrors // key is the pin-key\n\tpins                       map[string]*digitalPinMock\n}\n\ntype digitalPinMock struct {\n\tchip           string\n\tpin            int\n\tappliedOptions int\n\texported       int\n\twritten        []int\n\tvalues         []int\n\treadIdx        int\n\tsimulateErrors simulateErrors\n}\n\nfunc newMockDigitalPinAccess(underlyingDigitalPinAccess digitalPinAccesser) *mockDigitalPinAccess {\n\tdpa := mockDigitalPinAccess{\n\t\tunderlyingDigitalPinAccess: underlyingDigitalPinAccess,\n\t\tvalues:                     make(map[string][]int),\n\t\tsimulateErrors:             make(map[string]simulateErrors),\n\t\tpins:                       make(map[string]*digitalPinMock),\n\t}\n\treturn &dpa\n}\n\nfunc (dpa *mockDigitalPinAccess) isType(accesserType digitalPinAccesserType) bool {\n\treturn dpa.underlyingDigitalPinAccess.isType(accesserType)\n}\n\nfunc (dpa *mockDigitalPinAccess) isSupported() bool { return true }\n\nfunc (dpa *mockDigitalPinAccess) createPin(chip string, pin int,\n\to ...func(gobot.DigitalPinOptioner) bool,\n) gobot.DigitalPinner {\n\tdpm := &digitalPinMock{chip: chip, pin: pin, readIdx: -1}\n\n\tkey := getDigitalPinMockKey(chip, strconv.Itoa(pin))\n\tif v, ok := dpa.values[key]; ok {\n\t\tdpm.values = v\n\t}\n\n\tif v, ok := dpa.simulateErrors[key]; ok {\n\t\tdpm.simulateErrors = v\n\t}\n\n\tdpa.pins[key] = dpm\n\treturn dpm\n}\n\nfunc (dpa *mockDigitalPinAccess) setFs(fs filesystem) {\n\tpanic(\"setFs() for mockDigitalPinAccess not supported\")\n}\n\n// DigitalPin implements the gobot.DigitalPinnerProvider.\nfunc (dpa *mockDigitalPinAccess) DigitalPin(id string) (gobot.DigitalPinner, error) {\n\tpin, err := strconv.Atoi(id)\n\treturn dpa.createPin(\"\", pin), err\n}\n\nfunc (dpa *mockDigitalPinAccess) AppliedOptions(chip, pin string) int {\n\treturn dpa.pins[getDigitalPinMockKey(chip, pin)].appliedOptions\n}\n\nfunc (dpa *mockDigitalPinAccess) Written(chip, pin string) []int {\n\treturn dpa.pins[getDigitalPinMockKey(chip, pin)].written\n}\n\nfunc (dpa *mockDigitalPinAccess) Exported(chip, pin string) int {\n\treturn dpa.pins[getDigitalPinMockKey(chip, pin)].exported\n}\n\nfunc (dpa *mockDigitalPinAccess) UseValues(chip, pin string, values []int) {\n\tkey := getDigitalPinMockKey(chip, pin)\n\tif pin, ok := dpa.pins[key]; ok {\n\t\tpin.values = values\n\t}\n\n\t// for creation and re-creation\n\tdpa.values[key] = values\n}\n\nfunc (dpa *mockDigitalPinAccess) UseUnexportError(chip, pin string) {\n\tkey := getDigitalPinMockKey(chip, pin)\n\tif pin, ok := dpa.pins[key]; ok {\n\t\tpin.simulateErrors.unexport = true\n\t}\n\n\t// for creation and re-creation\n\tsimErrs, ok := dpa.simulateErrors[key]\n\tif !ok {\n\t\tsimErrs = simulateErrors{}\n\t}\n\n\tsimErrs.unexport = true\n\tdpa.simulateErrors[getDigitalPinMockKey(chip, pin)] = simErrs\n}\n\nfunc (dp *digitalPinMock) ApplyOptions(options ...func(gobot.DigitalPinOptioner) bool) error {\n\tdp.appliedOptions = dp.appliedOptions + len(options)\n\n\tif dp.simulateErrors.applyOption {\n\t\treturn errors.New(\"applyOption error\")\n\t}\n\n\treturn nil\n}\n\nfunc (dp *digitalPinMock) DirectionBehavior() string {\n\tpanic(\"DirectionBehavior() for digitalPinMock needs do be implemented now\")\n}\n\n// Write writes the given value to the character device\nfunc (dp *digitalPinMock) Write(b int) error {\n\tdp.written = append(dp.written, b)\n\n\tif dp.simulateErrors.write {\n\t\treturn errors.New(\"write error\")\n\t}\n\n\treturn nil\n}\n\n// Read reads the given value from character device\nfunc (dp *digitalPinMock) Read() (int, error) {\n\tdp.readIdx++\n\tif dp.simulateErrors.read {\n\t\treturn -1, errors.New(\"read error\")\n\t}\n\n\treturn dp.values[dp.readIdx], nil\n}\n\n// Export sets the pin as exported with the configured direction\nfunc (dp *digitalPinMock) Export() error {\n\tdp.exported++\n\tif dp.simulateErrors.export {\n\t\treturn errors.New(\"export error\")\n\t}\n\n\treturn nil\n}\n\n// Unexport release the pin\nfunc (dp *digitalPinMock) Unexport() error {\n\tdp.exported--\n\tif dp.simulateErrors.unexport {\n\t\treturn errors.New(\"unexport error\")\n\t}\n\n\treturn nil\n}\n\nfunc getDigitalPinMockKey(chip, pin string) string {\n\treturn chip + \"_\" + pin\n}\n"
  },
  {
    "path": "system/digitalpin_poll.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n)\n\nfunc startEdgePolling(\n\tpinLabel string,\n\tpinReadFunc func() (int, error),\n\tpollInterval time.Duration,\n\twantedEdge int,\n\teventHandler func(offset int, t time.Duration, et string, sn uint32, lsn uint32),\n\tquitChan chan struct{},\n) error {\n\tif eventHandler == nil {\n\t\treturn fmt.Errorf(\"an event handler is mandatory for edge polling\")\n\t}\n\tif quitChan == nil {\n\t\treturn fmt.Errorf(\"the quit channel is mandatory for edge polling\")\n\t}\n\n\tconst allEdges = \"all\"\n\n\ttriggerEventOn := \"none\"\n\tswitch wantedEdge {\n\tcase digitalPinEventOnFallingEdge:\n\t\ttriggerEventOn = DigitalPinEventFallingEdge\n\tcase digitalPinEventOnRisingEdge:\n\t\ttriggerEventOn = DigitalPinEventRisingEdge\n\tcase digitalPinEventOnBothEdges:\n\t\ttriggerEventOn = allEdges\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported edge type %d for edge polling\", wantedEdge)\n\t}\n\n\twg := sync.WaitGroup{}\n\twg.Add(1)\n\n\tgo func() {\n\t\tvar oldState int\n\t\tvar readStart time.Time\n\t\tvar firstLoopDone bool\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-quitChan:\n\t\t\t\tif !firstLoopDone {\n\t\t\t\t\twg.Done()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\t// note: pure reading takes between 30us and 1ms on rasperry Pi1, typically 50us, with sysfs also 500us\n\t\t\t\t// can happen, so we use the time stamp before start of reading to reduce random duration offset\n\t\t\t\treadStart = time.Now()\n\t\t\t\treadValue, err := pinReadFunc()\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"edge polling error occurred while reading the pin %s: %v\\n\", pinLabel, err)\n\t\t\t\t\treadValue = oldState // keep the value\n\t\t\t\t}\n\t\t\t\tif readValue != oldState {\n\t\t\t\t\tdetectedEdge := DigitalPinEventRisingEdge\n\t\t\t\t\tif readValue < oldState {\n\t\t\t\t\t\tdetectedEdge = DigitalPinEventFallingEdge\n\t\t\t\t\t}\n\t\t\t\t\tif firstLoopDone && (triggerEventOn == allEdges || triggerEventOn == detectedEdge) {\n\t\t\t\t\t\teventHandler(0, time.Duration(readStart.UnixNano()), detectedEdge, 0, 0)\n\t\t\t\t\t}\n\t\t\t\t\toldState = readValue\n\t\t\t\t}\n\t\t\t\t// the real poll interval is increased by the reading time, see also note above\n\t\t\t\t// negative or zero duration causes no sleep\n\t\t\t\ttime.Sleep(pollInterval - time.Since(readStart))\n\t\t\t\tif !firstLoopDone {\n\t\t\t\t\twg.Done()\n\t\t\t\t\tfirstLoopDone = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\twg.Wait()\n\treturn nil\n}\n"
  },
  {
    "path": "system/digitalpin_poll_test.go",
    "content": "package system\n\nimport (\n\t\"errors\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_startEdgePolling(t *testing.T) {\n\ttype readValue struct {\n\t\tvalue int\n\t\terr   string\n\t}\n\ttests := map[string]struct {\n\t\teventOnEdge            int\n\t\tsimulateReadValues     []readValue\n\t\tsimulateNoEventHandler bool\n\t\tsimulateNoQuitChan     bool\n\t\twantEdgeTypes          []string\n\t\twantErr                string\n\t}{\n\t\t\"edge_falling\": {\n\t\t\teventOnEdge: digitalPinEventOnFallingEdge,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 0},\n\t\t\t},\n\t\t\twantEdgeTypes: []string{DigitalPinEventFallingEdge, DigitalPinEventFallingEdge},\n\t\t},\n\t\t\"no_edge_falling\": {\n\t\t\teventOnEdge: digitalPinEventOnFallingEdge,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 1},\n\t\t\t},\n\t\t\twantEdgeTypes: nil,\n\t\t},\n\t\t\"edge_rising\": {\n\t\t\teventOnEdge: digitalPinEventOnRisingEdge,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 1},\n\t\t\t},\n\t\t\twantEdgeTypes: []string{DigitalPinEventRisingEdge, DigitalPinEventRisingEdge},\n\t\t},\n\t\t\"no_edge_rising\": {\n\t\t\teventOnEdge: digitalPinEventOnRisingEdge,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 0},\n\t\t\t},\n\t\t\twantEdgeTypes: nil,\n\t\t},\n\t\t\"edge_both\": {\n\t\t\teventOnEdge: digitalPinEventOnBothEdges,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 1},\n\t\t\t},\n\t\t\twantEdgeTypes: []string{DigitalPinEventRisingEdge, DigitalPinEventFallingEdge, DigitalPinEventRisingEdge},\n\t\t},\n\t\t\"no_edges_low\": {\n\t\t\teventOnEdge: digitalPinEventOnBothEdges,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 0},\n\t\t\t},\n\t\t\twantEdgeTypes: nil,\n\t\t},\n\t\t\"no_edges_high\": {\n\t\t\teventOnEdge: digitalPinEventOnBothEdges,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 1},\n\t\t\t},\n\t\t\twantEdgeTypes: nil,\n\t\t},\n\t\t\"read_error_keep_state\": {\n\t\t\teventOnEdge: digitalPinEventOnBothEdges,\n\t\t\tsimulateReadValues: []readValue{\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1, err: \"read error suppress rising and falling edge\"},\n\t\t\t\t{value: 0},\n\t\t\t\t{value: 1},\n\t\t\t\t{value: 1},\n\t\t\t},\n\t\t\twantEdgeTypes: []string{DigitalPinEventRisingEdge},\n\t\t},\n\t\t\"error_no_eventhandler\": {\n\t\t\tsimulateNoEventHandler: true,\n\t\t\twantErr:                \"event handler is mandatory\",\n\t\t},\n\t\t\"error_no_quitchannel\": {\n\t\t\tsimulateNoQuitChan: true,\n\t\t\twantErr:            \"quit channel is mandatory\",\n\t\t},\n\t\t\"error_unsupported_edgetype_none\": {\n\t\t\teventOnEdge: digitalPinEventNone,\n\t\t\twantErr:     \"unsupported edge type 0\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tpinLabel := \"test_pin\"\n\t\t\tpollInterval := time.Microsecond // zero is possible, just to show usage\n\t\t\t// arrange event handler\n\t\t\tvar edgeTypes []string\n\t\t\tvar eventHandler func(int, time.Duration, string, uint32, uint32)\n\t\t\tif !tc.simulateNoEventHandler {\n\t\t\t\teventHandler = func(offset int, t time.Duration, et string, sn uint32, lsn uint32) {\n\t\t\t\t\tedgeTypes = append(edgeTypes, et)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// arrange quit channel\n\t\t\tvar quitChan chan struct{}\n\t\t\tif !tc.simulateNoQuitChan {\n\t\t\t\tquitChan = make(chan struct{})\n\t\t\t}\n\t\t\tdefer func() {\n\t\t\t\tif quitChan != nil {\n\t\t\t\t\tclose(quitChan)\n\t\t\t\t}\n\t\t\t}()\n\t\t\t// arrange reads\n\t\t\tnumCallsRead := 0\n\t\t\twg := sync.WaitGroup{}\n\t\t\tif tc.simulateReadValues != nil {\n\t\t\t\twg.Add(1)\n\t\t\t}\n\t\t\treadFunc := func() (int, error) {\n\t\t\t\tnumCallsRead++\n\t\t\t\treadVal := tc.simulateReadValues[numCallsRead-1]\n\t\t\t\tvar err error\n\t\t\t\tif readVal.err != \"\" {\n\t\t\t\t\terr = errors.New(readVal.err)\n\t\t\t\t}\n\t\t\t\tif numCallsRead >= len(tc.simulateReadValues) {\n\t\t\t\t\tclose(quitChan) // ensure no further read call\n\t\t\t\t\tquitChan = nil  // lets skip defer routine\n\t\t\t\t\twg.Done()       // release assertions\n\t\t\t\t}\n\n\t\t\t\treturn readVal.value, err\n\t\t\t}\n\t\t\t// act\n\t\t\terr := startEdgePolling(pinLabel, readFunc, pollInterval, tc.eventOnEdge, eventHandler, quitChan)\n\t\t\twg.Wait()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Len(t, tc.simulateReadValues, numCallsRead)\n\t\t\tassert.Equal(t, tc.wantEdgeTypes, edgeTypes)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "system/digitalpin_sysfs.go",
    "content": "package system\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\tsystemSysfsDebug = false\n\t// gpioPath default linux sysfs gpio path\n\tgpioPath = \"/sys/class/gpio\"\n)\n\nvar errNotExported = errors.New(\"pin has not been exported\")\n\n// digitalPin represents a digital pin\ntype digitalPinSysfs struct {\n\t*digitalPinConfig\n\n\tpin string\n\tsfa *sysfsFileAccess\n\n\tdirFile       *sysfsFile\n\tvalFile       *sysfsFile\n\tactiveLowFile *sysfsFile\n}\n\n// newDigitalPinSysfs returns a digital pin using for the given number. The name of the sysfs file will prepend \"gpio\"\n// to the pin number, eg. a pin number of 10 will have a name of \"gpio10\". The pin is handled by the sysfs Kernel ABI.\nfunc newDigitalPinSysfs(\n\tsfa *sysfsFileAccess,\n\tpin string,\n\toptions ...func(gobot.DigitalPinOptioner) bool,\n) *digitalPinSysfs {\n\tcfg := newDigitalPinConfig(\"gpio\"+pin, options...)\n\td := &digitalPinSysfs{\n\t\tpin:              pin,\n\t\tdigitalPinConfig: cfg,\n\t\tsfa:              sfa,\n\t}\n\treturn d\n}\n\n// ApplyOptions apply all given options to the pin immediately. Implements interface gobot.DigitalPinOptionApplier.\nfunc (d *digitalPinSysfs) ApplyOptions(options ...func(gobot.DigitalPinOptioner) bool) error {\n\tanyChange := false\n\tfor _, option := range options {\n\t\tanyChange = option(d) || anyChange\n\t}\n\tif anyChange {\n\t\treturn d.reconfigure()\n\t}\n\treturn nil\n}\n\n// DirectionBehavior gets the direction behavior when the pin is used the next time. This means its possibly not in\n// this direction type at the moment. Implements the interface gobot.DigitalPinValuer, but should be rarely used.\nfunc (d *digitalPinSysfs) DirectionBehavior() string {\n\treturn d.direction\n}\n\n// Export sets the pin as exported with the configured direction\nfunc (d *digitalPinSysfs) Export() error {\n\treturn d.reconfigure()\n}\n\n// Unexport release the pin\nfunc (d *digitalPinSysfs) Unexport() error {\n\tunexport, err := d.sfa.openWrite(gpioPath + \"/unexport\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer unexport.close()\n\n\tif d.dirFile != nil {\n\t\td.dirFile.close()\n\t\td.dirFile = nil\n\t}\n\tif d.valFile != nil {\n\t\td.valFile.close()\n\t\td.valFile = nil\n\t}\n\tif d.activeLowFile != nil {\n\t\td.activeLowFile.close()\n\t\td.activeLowFile = nil\n\t}\n\n\terr = unexport.write([]byte(d.pin))\n\tif err != nil {\n\t\t// If EINVAL then the pin is reserved in the system and can't be unexported, we suppress the error\n\t\tvar pathError *os.PathError\n\t\tif !errors.As(err, &pathError) || !errors.Is(err, Syscall_EINVAL) {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Write writes the given value to the character device\nfunc (d *digitalPinSysfs) Write(b int) error {\n\tif d.valFile == nil {\n\t\treturn errNotExported\n\t}\n\terr := d.valFile.write([]byte(strconv.Itoa(b)))\n\treturn err\n}\n\n// Read reads a value from character device\nfunc (d *digitalPinSysfs) Read() (int, error) {\n\tif d.valFile == nil {\n\t\treturn 0, errNotExported\n\t}\n\tbuf, err := d.valFile.read()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn strconv.Atoi(string(buf[0]))\n}\n\nfunc (d *digitalPinSysfs) reconfigure() error {\n\texportFile, err := d.sfa.openWrite(gpioPath + \"/export\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer exportFile.close()\n\n\terr = exportFile.write([]byte(d.pin))\n\tif err != nil {\n\t\t// If EBUSY then the pin has already been exported, we suppress the error\n\t\tvar pathError *os.PathError\n\t\tif !errors.As(err, &pathError) || !errors.Is(err, Syscall_EBUSY) {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif d.dirFile != nil {\n\t\td.dirFile.close()\n\t}\n\n\tattempt := 0\n\tfor {\n\t\tattempt++\n\t\td.dirFile, err = d.sfa.openReadWrite(fmt.Sprintf(\"%s/%s/direction\", gpioPath, d.label))\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t\tif attempt > 10 {\n\t\t\tbreak\n\t\t}\n\t\ttime.Sleep(10 * time.Millisecond)\n\t}\n\n\tif d.valFile != nil {\n\t\td.valFile.close()\n\t}\n\tif err == nil {\n\t\td.valFile, err = d.sfa.openReadWrite(fmt.Sprintf(\"%s/%s/value\", gpioPath, d.label))\n\t}\n\n\t// configure direction\n\tif err == nil {\n\t\terr = d.writeDirectionWithInitialOutput()\n\t}\n\n\t// configure inverse logic\n\tif err == nil {\n\t\tif d.activeLow {\n\t\t\td.activeLowFile, err = d.sfa.openReadWrite(fmt.Sprintf(\"%s/%s/active_low\", gpioPath, d.label))\n\t\t\tif err == nil {\n\t\t\t\terr = d.activeLowFile.write([]byte(\"1\"))\n\t\t\t}\n\t\t}\n\t}\n\n\t// configure bias (inputs and outputs, unsupported)\n\tif err == nil {\n\t\tif d.bias != digitalPinBiasDefault && systemSysfsDebug {\n\t\t\tlog.Printf(\"bias options (%d) are not supported by sysfs, please use hardware resistors instead\\n\", d.bias)\n\t\t}\n\t}\n\n\t// configure debounce period (inputs only), edge detection (inputs only) and drive (outputs only)\n\tif d.direction == IN {\n\t\t// configure debounce (unsupported)\n\t\tif d.debouncePeriod != 0 && systemSysfsDebug {\n\t\t\tlog.Printf(\"debounce period option (%d) is not supported by sysfs\\n\", d.debouncePeriod)\n\t\t}\n\n\t\t// configure edge detection\n\t\tif err == nil {\n\t\t\tif d.edge != 0 && d.pollInterval <= 0 {\n\t\t\t\terr = fmt.Errorf(\"edge detect option (%d) is not implemented for sysfs without discrete polling\", d.edge)\n\t\t\t}\n\t\t}\n\n\t\t// start discrete polling function and wait for first read is done\n\t\tif err == nil {\n\t\t\tif d.pollInterval > 0 {\n\t\t\t\terr = startEdgePolling(d.label, d.Read, d.pollInterval, d.edge, d.edgeEventHandler, d.pollQuitChan)\n\t\t\t}\n\t\t}\n\t} else if d.drive != digitalPinDrivePushPull && systemSysfsDebug {\n\t\t// configure drive (unsupported)\n\t\tlog.Printf(\"drive options (%d) are not supported by sysfs\\n\", d.drive)\n\t}\n\n\tif err != nil {\n\t\tif e := d.Unexport(); e != nil {\n\t\t\terr = fmt.Errorf(\"unexport error '%v' after '%v'\", e, err)\n\t\t}\n\t}\n\n\treturn err\n}\n\nfunc (d *digitalPinSysfs) writeDirectionWithInitialOutput() error {\n\tif d.dirFile == nil {\n\t\treturn errNotExported\n\t}\n\tif err := d.dirFile.write([]byte(d.direction)); err != nil || d.direction == IN {\n\t\treturn err\n\t}\n\n\tif d.valFile == nil {\n\t\treturn errNotExported\n\t}\n\n\treturn d.valFile.write([]byte(strconv.Itoa(d.outInitialState)))\n}\n"
  },
  {
    "path": "system/digitalpin_sysfs_test.go",
    "content": "package system\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar (\n\t_ gobot.DigitalPinner           = (*digitalPinSysfs)(nil)\n\t_ gobot.DigitalPinValuer        = (*digitalPinSysfs)(nil)\n\t_ gobot.DigitalPinOptioner      = (*digitalPinSysfs)(nil)\n\t_ gobot.DigitalPinOptionApplier = (*digitalPinSysfs)(nil)\n)\n\nfunc initTestDigitalPinSysfsWithMockedFilesystem(mockPaths []string) (*digitalPinSysfs, *MockFilesystem) {\n\tfs := newMockFilesystem(mockPaths)\n\tsfa := sysfsFileAccess{fs: fs, readBufLen: 2}\n\tpin := newDigitalPinSysfs(&sfa, \"10\")\n\treturn pin, fs\n}\n\nfunc Test_newDigitalPinSysfs(t *testing.T) {\n\t// arrange\n\tm := &MockFilesystem{}\n\tsfa := sysfsFileAccess{fs: m, readBufLen: 2}\n\tconst pinID = \"1\"\n\t// act\n\tpin := newDigitalPinSysfs(&sfa, pinID, WithPinOpenDrain())\n\t// assert\n\tassert.Equal(t, pinID, pin.pin)\n\tassert.Equal(t, &sfa, pin.sfa)\n\tassert.Equal(t, \"gpio\"+pinID, pin.label)\n\tassert.Equal(t, \"in\", pin.direction)\n\tassert.Equal(t, 1, pin.drive)\n}\n\nfunc TestApplyOptionsSysfs(t *testing.T) {\n\ttests := map[string]struct {\n\t\tchanged    []bool\n\t\tsimErr     bool\n\t\twantExport string\n\t\twantErr    string\n\t}{\n\t\t\"both_changed\": {\n\t\t\tchanged:    []bool{true, true},\n\t\t\twantExport: \"10\",\n\t\t},\n\t\t\"first_changed\": {\n\t\t\tchanged:    []bool{true, false},\n\t\t\twantExport: \"10\",\n\t\t},\n\t\t\"second_changed\": {\n\t\t\tchanged:    []bool{false, true},\n\t\t\twantExport: \"10\",\n\t\t},\n\t\t\"none_changed\": {\n\t\t\tchanged:    []bool{false, false},\n\t\t\twantExport: \"\",\n\t\t},\n\t\t\"error_on_change\": {\n\t\t\tchanged:    []bool{false, true},\n\t\t\tsimErr:     true,\n\t\t\twantExport: \"10\",\n\t\t\twantErr:    \"gpio10/direction: no such file\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tmockPaths := []string{\n\t\t\t\t\"/sys/class/gpio/export\",\n\t\t\t\t\"/sys/class/gpio/gpio10/value\",\n\t\t\t}\n\t\t\tif !tc.simErr {\n\t\t\t\tmockPaths = append(mockPaths, \"/sys/class/gpio/gpio10/direction\")\n\t\t\t}\n\t\t\tpin, fs := initTestDigitalPinSysfsWithMockedFilesystem(mockPaths)\n\n\t\t\toptionFunction1 := func(gobot.DigitalPinOptioner) bool {\n\t\t\t\tpin.direction = OUT\n\t\t\t\treturn tc.changed[0]\n\t\t\t}\n\t\t\toptionFunction2 := func(gobot.DigitalPinOptioner) bool {\n\t\t\t\tpin.drive = 15\n\t\t\t\treturn tc.changed[1]\n\t\t\t}\n\t\t\t// act\n\t\t\terr := pin.ApplyOptions(optionFunction1, optionFunction2)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tassert.Equal(t, OUT, pin.direction)\n\t\t\tassert.Equal(t, 15, pin.drive)\n\t\t\t// marker for call of reconfigure, correct reconfigure is tested independently\n\t\t\tassert.Equal(t, tc.wantExport, fs.Files[\"/sys/class/gpio/export\"].Contents)\n\t\t})\n\t}\n}\n\nfunc TestDirectionBehaviorSysfs(t *testing.T) {\n\t// arrange\n\tpin := newDigitalPinSysfs(nil, \"1\")\n\trequire.Equal(t, \"in\", pin.direction)\n\tpin.direction = \"test\"\n\t// act && assert\n\tassert.Equal(t, \"test\", pin.DirectionBehavior())\n}\n\nfunc TestDigitalPinExportSysfs(t *testing.T) {\n\t// this tests mainly the function reconfigure()\n\tconst (\n\t\texportPath   = \"/sys/class/gpio/export\"\n\t\tdirPath      = \"/sys/class/gpio/gpio10/direction\"\n\t\tvaluePath    = \"/sys/class/gpio/gpio10/value\"\n\t\tinversePath  = \"/sys/class/gpio/gpio10/active_low\"\n\t\tunexportPath = \"/sys/class/gpio/unexport\"\n\t)\n\tallMockPaths := []string{exportPath, dirPath, valuePath, inversePath, unexportPath}\n\ttests := map[string]struct {\n\t\tmockPaths             []string\n\t\tchangeDirection       string\n\t\tchangeOutInitialState int\n\t\tchangeActiveLow       bool\n\t\tchangeBias            int\n\t\tchangeDrive           int\n\t\tchangeDebouncePeriod  time.Duration\n\t\tchangeEdge            int\n\t\tchangePollInterval    time.Duration\n\t\tsimEbusyOnPath        string\n\t\twantWrites            int\n\t\twantExport            string\n\t\twantUnexport          string\n\t\twantDirection         string\n\t\twantValue             string\n\t\twantInverse           string\n\t\twantErr               string\n\t}{\n\t\t\"ok_without_option\": {\n\t\t\tmockPaths:     allMockPaths,\n\t\t\twantWrites:    2,\n\t\t\twantExport:    \"10\",\n\t\t\twantDirection: \"in\",\n\t\t},\n\t\t\"ok_input_bias_dropped\": {\n\t\t\tmockPaths:     allMockPaths,\n\t\t\tchangeBias:    3,\n\t\t\twantWrites:    2,\n\t\t\twantExport:    \"10\",\n\t\t\twantDirection: \"in\",\n\t\t},\n\t\t\"ok_input_drive_dropped\": {\n\t\t\tmockPaths:     allMockPaths,\n\t\t\tchangeDrive:   2,\n\t\t\twantWrites:    2,\n\t\t\twantExport:    \"10\",\n\t\t\twantDirection: \"in\",\n\t\t},\n\t\t\"ok_input_debounce_dropped\": {\n\t\t\tmockPaths:            allMockPaths,\n\t\t\tchangeDebouncePeriod: 2 * time.Second,\n\t\t\twantWrites:           2,\n\t\t\twantExport:           \"10\",\n\t\t\twantDirection:        \"in\",\n\t\t},\n\t\t\"ok_input_inverse\": {\n\t\t\tmockPaths:       allMockPaths,\n\t\t\tchangeActiveLow: true,\n\t\t\twantWrites:      3,\n\t\t\twantExport:      \"10\",\n\t\t\twantDirection:   \"in\",\n\t\t\twantInverse:     \"1\",\n\t\t},\n\t\t\"ok_output\": {\n\t\t\tmockPaths:             allMockPaths,\n\t\t\tchangeDirection:       \"out\",\n\t\t\tchangeOutInitialState: 4,\n\t\t\twantWrites:            3,\n\t\t\twantExport:            \"10\",\n\t\t\twantDirection:         \"out\",\n\t\t\twantValue:             \"4\",\n\t\t},\n\t\t\"ok_output_bias_dropped\": {\n\t\t\tmockPaths:       allMockPaths,\n\t\t\tchangeDirection: \"out\",\n\t\t\tchangeBias:      3,\n\t\t\twantWrites:      3,\n\t\t\twantExport:      \"10\",\n\t\t\twantDirection:   \"out\",\n\t\t\twantValue:       \"0\",\n\t\t},\n\t\t\"ok_output_drive_dropped\": {\n\t\t\tmockPaths:       allMockPaths,\n\t\t\tchangeDirection: \"out\",\n\t\t\tchangeDrive:     2,\n\t\t\twantWrites:      3,\n\t\t\twantExport:      \"10\",\n\t\t\twantDirection:   \"out\",\n\t\t\twantValue:       \"0\",\n\t\t},\n\t\t\"ok_output_debounce_dropped\": {\n\t\t\tmockPaths:            allMockPaths,\n\t\t\tchangeDirection:      \"out\",\n\t\t\tchangeDebouncePeriod: 2 * time.Second,\n\t\t\twantWrites:           3,\n\t\t\twantExport:           \"10\",\n\t\t\twantDirection:        \"out\",\n\t\t\twantValue:            \"0\",\n\t\t},\n\t\t\"ok_output_inverse\": {\n\t\t\tmockPaths:       allMockPaths,\n\t\t\tchangeDirection: \"out\",\n\t\t\tchangeActiveLow: true,\n\t\t\twantWrites:      4,\n\t\t\twantExport:      \"10\",\n\t\t\twantDirection:   \"out\",\n\t\t\twantInverse:     \"1\",\n\t\t\twantValue:       \"0\",\n\t\t},\n\t\t\"ok_already_exported\": {\n\t\t\tmockPaths:      allMockPaths,\n\t\t\twantWrites:     2,\n\t\t\twantExport:     \"10\",\n\t\t\twantDirection:  \"in\",\n\t\t\tsimEbusyOnPath: exportPath, // just means \"already exported\"\n\t\t},\n\t\t\"error_no_eventhandler_for_polling\": { // this only tests the call of function, all other is tested separately\n\t\t\tmockPaths:          allMockPaths,\n\t\t\tchangePollInterval: 3 * time.Second,\n\t\t\twantWrites:         3,\n\t\t\twantUnexport:       \"10\",\n\t\t\twantDirection:      \"in\",\n\t\t\twantErr:            \"event handler is mandatory\",\n\t\t},\n\t\t\"error_no_export_file\": {\n\t\t\tmockPaths: []string{unexportPath},\n\t\t\twantErr:   \"/export: no such file\",\n\t\t},\n\t\t\"error_no_direction_file\": {\n\t\t\tmockPaths:    []string{exportPath, unexportPath},\n\t\t\twantWrites:   2,\n\t\t\twantUnexport: \"10\",\n\t\t\twantErr:      \"gpio10/direction: no such file\",\n\t\t},\n\t\t\"error_write_direction_file\": {\n\t\t\tmockPaths:      allMockPaths,\n\t\t\twantWrites:     3,\n\t\t\twantUnexport:   \"10\",\n\t\t\tsimEbusyOnPath: dirPath,\n\t\t\twantErr:        \"device or resource busy\",\n\t\t},\n\t\t\"error_no_value_file\": {\n\t\t\tmockPaths:    []string{exportPath, dirPath, unexportPath},\n\t\t\twantWrites:   2,\n\t\t\twantUnexport: \"10\",\n\t\t\twantErr:      \"gpio10/value: no such file\",\n\t\t},\n\t\t\"error_no_inverse_file\": {\n\t\t\tmockPaths:       []string{exportPath, dirPath, valuePath, unexportPath},\n\t\t\tchangeActiveLow: true,\n\t\t\twantWrites:      3,\n\t\t\twantUnexport:    \"10\",\n\t\t\twantErr:         \"gpio10/active_low: no such file\",\n\t\t},\n\t\t\"error_input_edge_without_poll\": {\n\t\t\tmockPaths:    allMockPaths,\n\t\t\tchangeEdge:   2,\n\t\t\twantWrites:   3,\n\t\t\twantUnexport: \"10\",\n\t\t\twantErr:      \"not implemented for sysfs without discrete polling\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tfs := newMockFilesystem(tc.mockPaths)\n\t\t\tsfa := sysfsFileAccess{fs: fs, readBufLen: 2}\n\t\t\tpin := newDigitalPinSysfs(&sfa, \"10\")\n\t\t\tif tc.changeDirection != \"\" {\n\t\t\t\tpin.direction = tc.changeDirection\n\t\t\t}\n\t\t\tif tc.changeOutInitialState != 0 {\n\t\t\t\tpin.outInitialState = tc.changeOutInitialState\n\t\t\t}\n\t\t\tif tc.changeActiveLow {\n\t\t\t\tpin.activeLow = tc.changeActiveLow\n\t\t\t}\n\t\t\tif tc.changeBias != 0 {\n\t\t\t\tpin.bias = tc.changeBias\n\t\t\t}\n\t\t\tif tc.changeDrive != 0 {\n\t\t\t\tpin.drive = tc.changeDrive\n\t\t\t}\n\t\t\tif tc.changeDebouncePeriod != 0 {\n\t\t\t\tpin.debouncePeriod = tc.changeDebouncePeriod\n\t\t\t}\n\t\t\tif tc.changeEdge != 0 {\n\t\t\t\tpin.edge = tc.changeEdge\n\t\t\t}\n\t\t\tif tc.changePollInterval != 0 {\n\t\t\t\tpin.pollInterval = tc.changePollInterval\n\t\t\t}\n\t\t\t// arrange write function\n\t\t\tif tc.simEbusyOnPath != \"\" {\n\t\t\t\tfs.Files[tc.simEbusyOnPath].simulateWriteError = &os.PathError{Err: Syscall_EBUSY}\n\t\t\t}\n\t\t\t// act\n\t\t\terr := pin.Export()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.NotNil(t, pin.valFile)\n\t\t\t\tassert.NotNil(t, pin.dirFile)\n\t\t\t\tassert.Equal(t, tc.wantDirection, fs.Files[dirPath].Contents)\n\t\t\t\tassert.Equal(t, tc.wantExport, fs.Files[exportPath].Contents)\n\t\t\t\tassert.Equal(t, tc.wantValue, fs.Files[valuePath].Contents)\n\t\t\t\tassert.Equal(t, tc.wantInverse, fs.Files[inversePath].Contents)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantUnexport, fs.Files[unexportPath].Contents)\n\t\t\tassert.Equal(t, tc.wantWrites, fs.numCallsWrite)\n\t\t})\n\t}\n}\n\nfunc TestDigitalPinSysfs(t *testing.T) {\n\tmockPaths := []string{\n\t\t\"/sys/class/gpio/export\",\n\t\t\"/sys/class/gpio/unexport\",\n\t\t\"/sys/class/gpio/gpio10/value\",\n\t\t\"/sys/class/gpio/gpio10/direction\",\n\t}\n\tpin, fs := initTestDigitalPinSysfsWithMockedFilesystem(mockPaths)\n\n\tassert.Equal(t, \"10\", pin.pin)\n\tassert.Equal(t, \"gpio10\", pin.label)\n\tassert.Nil(t, pin.valFile)\n\n\terr := pin.Unexport()\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"10\", fs.Files[\"/sys/class/gpio/unexport\"].Contents)\n\n\trequire.NoError(t, pin.Export())\n\n\terr = pin.Write(1)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/gpio/gpio10/value\"].Contents)\n\n\terr = pin.ApplyOptions(WithPinDirectionInput())\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"in\", fs.Files[\"/sys/class/gpio/gpio10/direction\"].Contents)\n\n\tdata, _ := pin.Read()\n\tassert.Equal(t, 1, data)\n\n\tsfa := sysfsFileAccess{fs: fs, readBufLen: 2}\n\tpin2 := newDigitalPinSysfs(&sfa, \"30\")\n\terr = pin2.Write(1)\n\trequire.ErrorContains(t, err, \"pin has not been exported\")\n\n\tdata, err = pin2.Read()\n\trequire.ErrorContains(t, err, \"pin has not been exported\")\n\tassert.Equal(t, 0, data)\n\n\t// arrange: unexport general write error, the error is not suppressed\n\tfs.Files[\"/sys/class/gpio/unexport\"].simulateWriteError = &os.PathError{Err: errors.New(\"write error\")}\n\t// act: unexport\n\terr = pin.Unexport()\n\t// assert: the error is not suppressed\n\tvar pathError *os.PathError\n\trequire.ErrorAs(t, err, &pathError)\n\trequire.ErrorContains(t, err, \"write error\")\n}\n\nfunc TestDigitalPinUnexportErrorSysfs(t *testing.T) {\n\ttests := map[string]struct {\n\t\tsimulateError error\n\t\twantErr       string\n\t}{\n\t\t\"reserved_pin\": {\n\t\t\t// simulation of reserved pin, the internal error is suppressed\n\t\t\tsimulateError: &os.PathError{Err: Syscall_EINVAL},\n\t\t\twantErr:       \"\",\n\t\t},\n\t\t\"error_busy\": {\n\t\t\tsimulateError: &os.PathError{Err: Syscall_EBUSY},\n\t\t\twantErr:       \" : device or resource busy\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tmockPaths := []string{\n\t\t\t\t\"/sys/class/gpio/unexport\",\n\t\t\t}\n\t\t\tpin, fs := initTestDigitalPinSysfsWithMockedFilesystem(mockPaths)\n\t\t\tfs.Files[\"/sys/class/gpio/unexport\"].simulateWriteError = tc.simulateError\n\t\t\t// act\n\t\t\terr := pin.Unexport()\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "system/digitalpinaccess.go",
    "content": "package system\n\nimport (\n\t\"strconv\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// sysfsDitalPinHandler represents the sysfs implementation\ntype sysfsDigitalPinAccess struct {\n\tsfa *sysfsFileAccess\n}\n\n// cdevDigitalPinAccess represents the character device implementation\ntype cdevDigitalPinAccess struct {\n\tfs    filesystem\n\tchips []string\n}\n\nfunc (dpa *sysfsDigitalPinAccess) isType(accesserType digitalPinAccesserType) bool {\n\treturn accesserType == digitalPinAccesserTypeSysfs\n}\n\nfunc (dpa *sysfsDigitalPinAccess) isSupported() bool {\n\t// currently this is supported by all Kernels\n\treturn true\n}\n\nfunc (dpa *sysfsDigitalPinAccess) createPin(chip string, pin int,\n\to ...func(gobot.DigitalPinOptioner) bool,\n) gobot.DigitalPinner {\n\treturn newDigitalPinSysfs(dpa.sfa, strconv.Itoa(pin), o...)\n}\n\nfunc (dpa *sysfsDigitalPinAccess) setFs(fs filesystem) {\n\tdpa.sfa = &sysfsFileAccess{fs: fs, readBufLen: 2}\n}\n\nfunc (dpa *cdevDigitalPinAccess) isType(accesserType digitalPinAccesserType) bool {\n\treturn accesserType == digitalPinAccesserTypeCdev\n}\n\nfunc (dpa *cdevDigitalPinAccess) isSupported() bool {\n\tchips, err := dpa.fs.find(\"/dev\", \"gpiochip\")\n\tif err != nil || len(chips) == 0 {\n\t\treturn false\n\t}\n\tdpa.chips = chips\n\treturn true\n}\n\nfunc (dpa *cdevDigitalPinAccess) createPin(chip string, pin int,\n\to ...func(gobot.DigitalPinOptioner) bool,\n) gobot.DigitalPinner {\n\treturn newDigitalPinCdev(chip, pin, o...)\n}\n\nfunc (dpa *cdevDigitalPinAccess) setFs(fs filesystem) {\n\tdpa.fs = fs\n}\n"
  },
  {
    "path": "system/digitalpinaccess_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage system\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Test_isSupported_sysfs(t *testing.T) {\n\t// arrange\n\tdpa := sysfsDigitalPinAccess{}\n\t// act\n\tgot := dpa.isSupported()\n\t// assert\n\tassert.True(t, got)\n}\n\nfunc Test_isSupported_cdev(t *testing.T) {\n\ttests := map[string]struct {\n\t\tmockPaths []string\n\t\twant      bool\n\t}{\n\t\t\"supported\": {\n\t\t\tmockPaths: []string{\"/sys/class/gpio/\", \"/dev/gpiochip3\"},\n\t\t\twant:      true,\n\t\t},\n\t\t\"not_supported\": {\n\t\t\tmockPaths: []string{\"/sys/class/gpio/\"},\n\t\t\twant:      false,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tfs := newMockFilesystem(tc.mockPaths)\n\t\t\tdpa := cdevDigitalPinAccess{fs: fs}\n\t\t\t// act\n\t\t\tgot := dpa.isSupported()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n\nfunc Test_createAsSysfs(t *testing.T) {\n\t// arrange\n\tdpa := sysfsDigitalPinAccess{}\n\t// act\n\tdp := dpa.createPin(\"chip\", 8)\n\t// assert\n\tassert.NotNil(t, dp)\n\tdps := dp.(*digitalPinSysfs)\n\t// chip is dropped\n\tassert.Equal(t, \"gpio8\", dps.label)\n}\n\nfunc Test_createPin_cdev(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tpin   = 18\n\t\tlabel = \"gobotio18\"\n\t\tchip  = \"gpiochip1\"\n\t)\n\tdpa := cdevDigitalPinAccess{}\n\t// act\n\tdp := dpa.createPin(chip, 18)\n\t// assert\n\tassert.NotNil(t, dp)\n\tdpg := dp.(*digitalPinCdev)\n\tassert.Equal(t, label, dpg.label)\n\tassert.Equal(t, chip, dpg.chipName)\n}\n\nfunc Test_createPin_WithOptions_sysfs(t *testing.T) {\n\t// This is a general test, that options are applied by using \"create\" with the WithPinLabel() option.\n\t// All other configuration options will be tested in tests for \"digitalPinConfig\".\n\t//\n\t// arrange\n\tconst label = \"my sysfs label\"\n\tdpa := sysfsDigitalPinAccess{}\n\t// act\n\tdp := dpa.createPin(\"\", 9, WithPinLabel(label))\n\tdps := dp.(*digitalPinSysfs)\n\t// assert\n\tassert.Equal(t, label, dps.label)\n}\n\nfunc Test_createPin_WithOptions_cdev(t *testing.T) {\n\t// This is a general test, that options are applied by using \"create\" with the WithPinLabel() option.\n\t// All other configuration options will be tested in tests for \"digitalPinConfig\".\n\t//\n\t// arrange\n\tconst label = \"my cdev label\"\n\tdpa := cdevDigitalPinAccess{}\n\t// act\n\tdp := dpa.createPin(\"\", 19, WithPinLabel(label))\n\tdpg := dp.(*digitalPinCdev)\n\t// assert\n\tassert.Equal(t, label, dpg.label)\n\t// test fallback for empty chip\n\tassert.Equal(t, \"gpiochip0\", dpg.chipName)\n}\n"
  },
  {
    "path": "system/digitalpinoptions.go",
    "content": "package system\n\nimport (\n\t\"time\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst (\n\t// IN gpio direction\n\tIN = \"in\"\n\t// OUT gpio direction\n\tOUT = \"out\"\n\t// HIGH gpio level\n\tHIGH = 1\n\t// LOW gpio level\n\tLOW = 0\n)\n\nconst (\n\tdigitalPinBiasDefault  = 0 // GPIO uses the hardware default\n\tdigitalPinBiasDisable  = 1 // GPIO has pull disabled\n\tdigitalPinBiasPullDown = 2 // GPIO has pull up enabled\n\tdigitalPinBiasPullUp   = 3 // GPIO has pull down enabled\n\n\t// open drain and open source allows the connection of output ports with the same mode (OR logic)\n\t// * for open drain/collector pull up the ports with an external resistor/load\n\t// * for open source/emitter pull down the ports with an external resistor/load\n\tdigitalPinDrivePushPull   = 0 // the pin will be driven actively high and\tlow (default)\n\tdigitalPinDriveOpenDrain  = 1 // the pin will be driven active to low only\n\tdigitalPinDriveOpenSource = 2 // the pin will be driven active to high only\n\n\tdigitalPinEventNone          = 0 // no event will be triggered on any pin change (default)\n\tdigitalPinEventOnFallingEdge = 1 // an event will be triggered on changes from high to low state\n\tdigitalPinEventOnRisingEdge  = 2 // an event will be triggered on changes from low to high state\n\tdigitalPinEventOnBothEdges   = 3 // an event will be triggered on all changes\n)\n\nconst (\n\t// DigitalPinEventRisingEdge indicates an inactive to active event.\n\tDigitalPinEventRisingEdge = \"rising edge\"\n\t// DigitalPinEventFallingEdge indicates an active to inactive event.\n\tDigitalPinEventFallingEdge = \"falling edge\"\n)\n\ntype digitalPinConfig struct {\n\tlabel            string\n\tdirection        string\n\toutInitialState  int\n\tactiveLow        bool\n\tbias             int\n\tdrive            int\n\tdebouncePeriod   time.Duration\n\tedge             int\n\tedgeEventHandler func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32, lseqno uint32)\n\tpollInterval     time.Duration\n\tpollQuitChan     chan struct{}\n}\n\nfunc newDigitalPinConfig(label string, options ...func(gobot.DigitalPinOptioner) bool) *digitalPinConfig {\n\tcfg := &digitalPinConfig{\n\t\tlabel:     label,\n\t\tdirection: IN,\n\t}\n\tfor _, option := range options {\n\t\toption(cfg)\n\t}\n\treturn cfg\n}\n\n// WithPinLabel use a pin label, which will replace the default label \"gobotio#\".\nfunc WithPinLabel(label string) func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetLabel(label) }\n}\n\n// WithPinDirectionOutput initializes the pin as output instead of the default \"input\".\nfunc WithPinDirectionOutput(initial int) func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetDirectionOutput(initial) }\n}\n\n// WithPinDirectionInput initializes the pin as input.\nfunc WithPinDirectionInput() func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetDirectionInput() }\n}\n\n// WithPinActiveLow initializes the pin with inverse reaction (applies on input and output).\nfunc WithPinActiveLow() func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetActiveLow() }\n}\n\n// WithPinPullDown initializes the pin to be pulled down (high impedance to GND, applies on input and output).\n// This is working since Kernel 5.5.\nfunc WithPinPullDown() func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetBias(digitalPinBiasPullDown) }\n}\n\n// WithPinPullUp initializes the pin to be pulled up (high impedance to VDD, applies on input and output).\n// This is working since Kernel 5.5.\nfunc WithPinPullUp() func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetBias(digitalPinBiasPullUp) }\n}\n\n// WithPinOpenDrain initializes the output pin to be driven with open drain/collector.\nfunc WithPinOpenDrain() func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetDrive(digitalPinDriveOpenDrain) }\n}\n\n// WithPinOpenSource initializes the output pin to be driven with open source/emitter.\nfunc WithPinOpenSource() func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetDrive(digitalPinDriveOpenSource) }\n}\n\n// WithPinDebounce initializes the input pin to be debounced.\nfunc WithPinDebounce(period time.Duration) func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool { return d.SetDebounce(period) }\n}\n\n// WithPinEventOnFallingEdge initializes the input pin for edge detection and call the event handler on falling edges.\nfunc WithPinEventOnFallingEdge(handler func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32,\n\tlseqno uint32),\n) func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool {\n\t\treturn d.SetEventHandlerForEdge(handler, digitalPinEventOnFallingEdge)\n\t}\n}\n\n// WithPinEventOnRisingEdge initializes the input pin for edge detection and call the event handler on rising edges.\nfunc WithPinEventOnRisingEdge(handler func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32,\n\tlseqno uint32),\n) func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool {\n\t\treturn d.SetEventHandlerForEdge(handler, digitalPinEventOnRisingEdge)\n\t}\n}\n\n// WithPinEventOnBothEdges initializes the input pin for edge detection and call the event handler on all edges.\nfunc WithPinEventOnBothEdges(handler func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32,\n\tlseqno uint32),\n) func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool {\n\t\treturn d.SetEventHandlerForEdge(handler, digitalPinEventOnBothEdges)\n\t}\n}\n\n// WithPinPollForEdgeDetection initializes a discrete input pin polling function to use for edge detection.\nfunc WithPinPollForEdgeDetection(\n\tpollInterval time.Duration,\n\tpollQuitChan chan struct{},\n) func(gobot.DigitalPinOptioner) bool {\n\treturn func(d gobot.DigitalPinOptioner) bool {\n\t\treturn d.SetPollForEdgeDetection(pollInterval, pollQuitChan)\n\t}\n}\n\n// SetLabel sets the label to use for next reconfigure. The function is intended to use by WithPinLabel().\nfunc (d *digitalPinConfig) SetLabel(label string) bool {\n\tif d.label == label {\n\t\treturn false\n\t}\n\td.label = label\n\treturn true\n}\n\n// SetDirectionOutput sets the direction to output for next reconfigure. The function is intended to use\n// by WithPinDirectionOutput().\nfunc (d *digitalPinConfig) SetDirectionOutput(initial int) bool {\n\tif d.direction == OUT {\n\t\t// in this case also the initial value will not be written\n\t\treturn false\n\t}\n\td.direction = OUT\n\td.outInitialState = initial\n\treturn true\n}\n\n// SetDirectionInput sets the direction to input for next reconfigure. The function is intended to use\n// by WithPinDirectionInput().\nfunc (d *digitalPinConfig) SetDirectionInput() bool {\n\tif d.direction == IN {\n\t\treturn false\n\t}\n\td.direction = IN\n\treturn true\n}\n\n// SetActiveLow sets the pin with inverse reaction (applies on input and output) for next reconfigure. The function\n// is intended to use by WithPinActiveLow().\nfunc (d *digitalPinConfig) SetActiveLow() bool {\n\tif d.activeLow {\n\t\treturn false\n\t}\n\td.activeLow = true\n\treturn true\n}\n\n// SetBias sets the pin bias (applies on input and output) for next reconfigure. The function\n// is intended to use by WithPinPullUp() and WithPinPullDown().\nfunc (d *digitalPinConfig) SetBias(bias int) bool {\n\tif d.bias == bias {\n\t\treturn false\n\t}\n\td.bias = bias\n\treturn true\n}\n\n// SetDrive sets the pin drive mode (applies on output only) for next reconfigure. The function\n// is intended to use by WithPinOpenDrain(), WithPinOpenSource() and WithPinPushPull().\nfunc (d *digitalPinConfig) SetDrive(drive int) bool {\n\tif d.drive == drive {\n\t\treturn false\n\t}\n\td.drive = drive\n\treturn true\n}\n\n// SetDebounce sets the input pin with the given debounce period for next reconfigure. The function\n// is intended to use by WithPinDebounce().\nfunc (d *digitalPinConfig) SetDebounce(period time.Duration) bool {\n\tif d.debouncePeriod == period {\n\t\treturn false\n\t}\n\td.debouncePeriod = period\n\treturn true\n}\n\n// SetEventHandlerForEdge sets the input pin to edge detection to call the event handler on specified edge. The\n// function is intended to use by WithPinEventOnFallingEdge(), WithPinEventOnRisingEdge() and WithPinEventOnBothEdges().\nfunc (d *digitalPinConfig) SetEventHandlerForEdge(\n\thandler func(int, time.Duration, string, uint32, uint32),\n\tedge int,\n) bool {\n\tif d.edge == edge {\n\t\treturn false\n\t}\n\td.edge = edge\n\td.edgeEventHandler = handler\n\treturn true\n}\n\n// SetPollForEdgeDetection use a discrete input polling method to detect edges. A poll interval of zero or smaller\n// will deactivate this function. Please note: Using this feature is CPU consuming and less accurate than using cdev\n// event handler (go-gpiocdev package) and should be done only if the former is not implemented or not working for\n// the adaptor. E.g. sysfs driver in gobot has not implemented edge detection yet. The function is only useful\n// together with SetEventHandlerForEdge() and its corresponding With*() functions.\n// The function is intended to use by WithPinPollForEdgeDetection().\n//\n//nolint:nonamedreturns // useful here\nfunc (d *digitalPinConfig) SetPollForEdgeDetection(\n\tpollInterval time.Duration,\n\tpollQuitChan chan struct{},\n) (changed bool) {\n\tif d.pollInterval == pollInterval {\n\t\treturn false\n\t}\n\td.pollInterval = pollInterval\n\td.pollQuitChan = pollQuitChan\n\treturn true\n}\n"
  },
  {
    "path": "system/digitalpinoptions_test.go",
    "content": "package system\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.DigitalPinOptioner = (*digitalPinConfig)(nil)\n\nfunc Test_newDigitalPinConfig(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tlabel = \"gobotio17\"\n\t)\n\t// act\n\td := newDigitalPinConfig(label)\n\t// assert\n\tassert.NotNil(t, d)\n\tassert.Equal(t, label, d.label)\n\tassert.Equal(t, IN, d.direction)\n\tassert.Equal(t, 0, d.outInitialState)\n}\n\nfunc Test_newDigitalPinConfigWithOption(t *testing.T) {\n\t// arrange\n\tconst label = \"gobotio18\"\n\t// act\n\td := newDigitalPinConfig(\"not used\", WithPinLabel(label))\n\t// assert\n\tassert.NotNil(t, d)\n\tassert.Equal(t, label, d.label)\n}\n\nfunc TestWithPinLabel(t *testing.T) {\n\tconst (\n\t\toldLabel = \"old label\"\n\t\tnewLabel = \"my optional label\"\n\t)\n\ttests := map[string]struct {\n\t\tsetLabel string\n\t\twant     bool\n\t}{\n\t\t\"no_change\": {\n\t\t\tsetLabel: oldLabel,\n\t\t},\n\t\t\"change\": {\n\t\t\tsetLabel: newLabel,\n\t\t\twant:     true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{label: oldLabel}\n\t\t\t// act\n\t\t\tgot := WithPinLabel(tc.setLabel)(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, tc.setLabel, dpc.label)\n\t\t})\n\t}\n}\n\nfunc TestWithPinDirectionOutput(t *testing.T) {\n\tconst (\n\t\t// values other than 0, 1 are normally not useful, just to test\n\t\toldVal = 3\n\t\tnewVal = 5\n\t)\n\ttests := map[string]struct {\n\t\toldDir  string\n\t\twant    bool\n\t\twantVal int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldDir:  \"out\",\n\t\t\twantVal: oldVal,\n\t\t},\n\t\t\"change\": {\n\t\t\toldDir:  \"in\",\n\t\t\twant:    true,\n\t\t\twantVal: newVal,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{direction: tc.oldDir, outInitialState: oldVal}\n\t\t\t// act\n\t\t\tgot := WithPinDirectionOutput(newVal)(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, \"out\", dpc.direction)\n\t\t\tassert.Equal(t, tc.wantVal, dpc.outInitialState)\n\t\t})\n\t}\n}\n\nfunc TestWithPinDirectionInput(t *testing.T) {\n\ttests := map[string]struct {\n\t\toldDir string\n\t\twant   bool\n\t}{\n\t\t\"no_change\": {\n\t\t\toldDir: \"in\",\n\t\t},\n\t\t\"change\": {\n\t\t\toldDir: \"out\",\n\t\t\twant:   true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tconst initValOut = 2 // 2 is normally not useful, just to test that is not touched\n\t\t\tdpc := &digitalPinConfig{direction: tc.oldDir, outInitialState: initValOut}\n\t\t\t// act\n\t\t\tgot := WithPinDirectionInput()(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, \"in\", dpc.direction)\n\t\t\tassert.Equal(t, initValOut, dpc.outInitialState)\n\t\t})\n\t}\n}\n\nfunc TestWithPinActiveLow(t *testing.T) {\n\ttests := map[string]struct {\n\t\toldActiveLow bool\n\t\twant         bool\n\t}{\n\t\t\"no_change\": {\n\t\t\toldActiveLow: true,\n\t\t},\n\t\t\"change\": {\n\t\t\toldActiveLow: false,\n\t\t\twant:         true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{activeLow: tc.oldActiveLow}\n\t\t\t// act\n\t\t\tgot := WithPinActiveLow()(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.True(t, dpc.activeLow)\n\t\t})\n\t}\n}\n\nfunc TestWithPinPullDown(t *testing.T) {\n\ttests := map[string]struct {\n\t\toldBias int\n\t\twant    bool\n\t\twantVal int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldBias: digitalPinBiasPullDown,\n\t\t},\n\t\t\"change\": {\n\t\t\toldBias: digitalPinBiasPullUp,\n\t\t\twant:    true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{bias: tc.oldBias}\n\t\t\t// act\n\t\t\tgot := WithPinPullDown()(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, digitalPinBiasPullDown, dpc.bias)\n\t\t})\n\t}\n}\n\nfunc TestWithPinPullUp(t *testing.T) {\n\ttests := map[string]struct {\n\t\toldBias int\n\t\twant    bool\n\t\twantVal int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldBias: digitalPinBiasPullUp,\n\t\t},\n\t\t\"change\": {\n\t\t\toldBias: digitalPinBiasPullDown,\n\t\t\twant:    true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{bias: tc.oldBias}\n\t\t\t// act\n\t\t\tgot := WithPinPullUp()(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, digitalPinBiasPullUp, dpc.bias)\n\t\t})\n\t}\n}\n\nfunc TestWithPinOpenDrain(t *testing.T) {\n\ttests := map[string]struct {\n\t\toldDrive int\n\t\twant     bool\n\t\twantVal  int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldDrive: digitalPinDriveOpenDrain,\n\t\t},\n\t\t\"change_from_pushpull\": {\n\t\t\toldDrive: digitalPinDrivePushPull,\n\t\t\twant:     true,\n\t\t},\n\t\t\"change_from_opensource\": {\n\t\t\toldDrive: digitalPinDriveOpenSource,\n\t\t\twant:     true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{drive: tc.oldDrive}\n\t\t\t// act\n\t\t\tgot := WithPinOpenDrain()(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, digitalPinDriveOpenDrain, dpc.drive)\n\t\t})\n\t}\n}\n\nfunc TestWithPinOpenSource(t *testing.T) {\n\ttests := map[string]struct {\n\t\toldDrive int\n\t\twant     bool\n\t\twantVal  int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldDrive: digitalPinDriveOpenSource,\n\t\t},\n\t\t\"change_from_pushpull\": {\n\t\t\toldDrive: digitalPinDrivePushPull,\n\t\t\twant:     true,\n\t\t},\n\t\t\"change_from_opendrain\": {\n\t\t\toldDrive: digitalPinDriveOpenDrain,\n\t\t\twant:     true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{drive: tc.oldDrive}\n\t\t\t// act\n\t\t\tgot := WithPinOpenSource()(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, digitalPinDriveOpenSource, dpc.drive)\n\t\t})\n\t}\n}\n\nfunc TestWithPinDebounce(t *testing.T) {\n\tconst (\n\t\toldVal = time.Duration(10)\n\t\tnewVal = time.Duration(14)\n\t)\n\ttests := map[string]struct {\n\t\toldDebouncePeriod time.Duration\n\t\twant              bool\n\t\twantVal           time.Duration\n\t}{\n\t\t\"no_change\": {\n\t\t\toldDebouncePeriod: newVal,\n\t\t},\n\t\t\"change\": {\n\t\t\toldDebouncePeriod: oldVal,\n\t\t\twant:              true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{debouncePeriod: tc.oldDebouncePeriod}\n\t\t\t// act\n\t\t\tgot := WithPinDebounce(newVal)(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, newVal, dpc.debouncePeriod)\n\t\t})\n\t}\n}\n\nfunc TestWithPinEventOnFallingEdge(t *testing.T) {\n\tconst (\n\t\toldVal = digitalPinEventNone\n\t\tnewVal = digitalPinEventOnFallingEdge\n\t)\n\ttests := map[string]struct {\n\t\toldEdge int\n\t\twant    bool\n\t\twantVal int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldEdge: newVal,\n\t\t\twant:    false,\n\t\t},\n\t\t\"change\": {\n\t\t\toldEdge: oldVal,\n\t\t\twant:    true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{edge: tc.oldEdge}\n\t\t\thandler := func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32, lseqno uint32) {}\n\t\t\t// act\n\t\t\tgot := WithPinEventOnFallingEdge(handler)(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, newVal, dpc.edge)\n\t\t\tif tc.want {\n\t\t\t\tassert.NotNil(t, dpc.edgeEventHandler)\n\t\t\t} else {\n\t\t\t\tassert.Nil(t, dpc.edgeEventHandler)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWithPinEventOnRisingEdge(t *testing.T) {\n\tconst (\n\t\toldVal = digitalPinEventNone\n\t\tnewVal = digitalPinEventOnRisingEdge\n\t)\n\ttests := map[string]struct {\n\t\toldEdge int\n\t\twant    bool\n\t\twantVal int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldEdge: newVal,\n\t\t\twant:    false,\n\t\t},\n\t\t\"change\": {\n\t\t\toldEdge: oldVal,\n\t\t\twant:    true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{edge: tc.oldEdge}\n\t\t\thandler := func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32, lseqno uint32) {}\n\t\t\t// act\n\t\t\tgot := WithPinEventOnRisingEdge(handler)(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, newVal, dpc.edge)\n\t\t\tif tc.want {\n\t\t\t\tassert.NotNil(t, dpc.edgeEventHandler)\n\t\t\t} else {\n\t\t\t\tassert.Nil(t, dpc.edgeEventHandler)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWithPinEventOnBothEdges(t *testing.T) {\n\tconst (\n\t\toldVal = digitalPinEventNone\n\t\tnewVal = digitalPinEventOnBothEdges\n\t)\n\ttests := map[string]struct {\n\t\toldEdge int\n\t\twant    bool\n\t\twantVal int\n\t}{\n\t\t\"no_change\": {\n\t\t\toldEdge: newVal,\n\t\t\twant:    false,\n\t\t},\n\t\t\"change\": {\n\t\t\toldEdge: oldVal,\n\t\t\twant:    true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{edge: tc.oldEdge}\n\t\t\thandler := func(lineOffset int, timestamp time.Duration, detectedEdge string, seqno uint32, lseqno uint32) {}\n\t\t\t// act\n\t\t\tgot := WithPinEventOnBothEdges(handler)(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, newVal, dpc.edge)\n\t\t\tif tc.want {\n\t\t\t\tassert.NotNil(t, dpc.edgeEventHandler)\n\t\t\t} else {\n\t\t\t\tassert.Nil(t, dpc.edgeEventHandler)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWithPinPollForEdgeDetection(t *testing.T) {\n\tconst (\n\t\toldVal = time.Duration(1)\n\t\tnewVal = time.Duration(3)\n\t)\n\ttests := map[string]struct {\n\t\toldPollInterval time.Duration\n\t\twant            bool\n\t\twantVal         time.Duration\n\t}{\n\t\t\"no_change\": {\n\t\t\toldPollInterval: newVal,\n\t\t},\n\t\t\"change\": {\n\t\t\toldPollInterval: oldVal,\n\t\t\twant:            true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tdpc := &digitalPinConfig{pollInterval: tc.oldPollInterval}\n\t\t\tstopChan := make(chan struct{})\n\t\t\tdefer close(stopChan)\n\t\t\t// act\n\t\t\tgot := WithPinPollForEdgeDetection(newVal, stopChan)(dpc)\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t\tassert.Equal(t, newVal, dpc.pollInterval)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "system/doc.go",
    "content": "/*\nPackage system provides generic access to Linux gpio, i2c and filesystem.\n\nIt is intended to be used while implementing support for a single board Linux computer\n*/\npackage system // import \"gobot.io/x/gobot/v2/system\"\n"
  },
  {
    "path": "system/fs.go",
    "content": "package system\n\nimport (\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n)\n\n// nativeFilesystem represents the native file system implementation\ntype nativeFilesystem struct{}\n\n// openFile calls os.OpenFile().\nfunc (fs *nativeFilesystem) openFile(name string, flag int, perm os.FileMode) (File, error) {\n\treturn os.OpenFile(name, flag, perm)\n}\n\n// stat calls os.Stat()\nfunc (fs *nativeFilesystem) stat(name string) (os.FileInfo, error) {\n\treturn os.Stat(name)\n}\n\n// find returns all items (files or folders) below the given directory matching the given pattern.\nfunc (fs *nativeFilesystem) find(baseDir string, pattern string) ([]string, error) {\n\treg, err := regexp.Compile(pattern)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\titems, err := os.ReadDir(baseDir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar found []string\n\tfor _, item := range items {\n\t\tif reg.MatchString(item.Name()) {\n\t\t\tfound = append(found, path.Join(baseDir, item.Name()))\n\t\t}\n\t}\n\treturn found, nil\n}\n\n// readFile reads the named file and returns the contents. A successful call returns err == nil, not err == EOF.\n// Because ReadFile reads the whole file, it does not treat an EOF from Read as an error to be reported.\nfunc (fs *nativeFilesystem) readFile(name string) ([]byte, error) {\n\treturn os.ReadFile(name)\n}\n"
  },
  {
    "path": "system/fs_mock.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n)\n\nvar (\n\t_ File       = (*MockFile)(nil)\n\t_ filesystem = (*MockFilesystem)(nil)\n)\n\n// MockFilesystem represents a filesystem of mock files.\ntype MockFilesystem struct {\n\tSeq            int // Increases with each write or read.\n\tFiles          map[string]*MockFile\n\tWithReadError  bool\n\tWithWriteError bool\n\tWithCloseError bool\n\tnumCallsWrite  int\n\tnumCallsRead   int\n}\n\n// A MockFile represents a mock file that contains a single string.  Any write\n// overwrites, and any read returns from the start.\ntype MockFile struct {\n\tContents           string\n\tSeq                int // When this file was last written or read.\n\tOpened             bool\n\tClosed             bool\n\tfd                 uintptr\n\tsimulateWriteError error\n\tsimulateReadError  error\n\n\tfs *MockFilesystem\n}\n\nvar (\n\terrRead  = fmt.Errorf(\"read error\")\n\terrWrite = fmt.Errorf(\"write error\")\n\terrClose = fmt.Errorf(\"close error\")\n)\n\n// Write writes string(b) to f.Contents\nfunc (f *MockFile) Write(b []byte) (int, error) {\n\tif f.fs.WithWriteError {\n\t\treturn 0, errWrite\n\t}\n\n\treturn f.WriteString(string(b))\n}\n\n// Seek seeks to a specific offset in a file\nfunc (f *MockFile) Seek(offset int64, whence int) (int64, error) {\n\treturn offset, nil\n}\n\n// WriteString writes s to f.Contents\nfunc (f *MockFile) WriteString(s string) (int, error) {\n\tf.Contents = s\n\tf.Seq = f.fs.next()\n\tf.fs.numCallsWrite++\n\treturn len(s), f.simulateWriteError\n}\n\n// Sync implements the File interface Sync function\nfunc (f *MockFile) Sync() error {\n\treturn nil\n}\n\n// Read copies b bytes from f.Contents\nfunc (f *MockFile) Read(b []byte) (int, error) {\n\tif f.fs.WithReadError {\n\t\treturn 0, errRead\n\t}\n\n\tcount := len(b)\n\tif len(f.Contents) < count {\n\t\t// note: if length of content is smaller than given b than b will not completely overridden, e.g. if content\n\t\t// is empty, than b is not changed at all. This is fine for this MockFile, but in real world, on different\n\t\t// length, an error will be created.\n\t\tcount = len(f.Contents)\n\t}\n\tcopy(b, []byte(f.Contents)[:count])\n\tf.Seq = f.fs.next()\n\n\tf.fs.numCallsRead++\n\treturn count, f.simulateReadError\n}\n\n// ReadAt calls MockFile.Read\nfunc (f *MockFile) ReadAt(b []byte, off int64) (int, error) {\n\treturn f.Read(b)\n}\n\n// Fd returns a random uintprt based on the time of the MockFile creation\nfunc (f *MockFile) Fd() uintptr {\n\treturn f.fd\n}\n\n// Close implements the File interface Close function\nfunc (f *MockFile) Close() error {\n\tif f != nil {\n\t\tf.Opened = false\n\t\tf.Closed = true\n\t\tif f.fs != nil && f.fs.WithCloseError {\n\t\t\tf.Closed = false\n\t\t\treturn errClose\n\t\t}\n\t}\n\treturn nil\n}\n\n// newMockFilesystem returns a new MockFilesystem given a list of file and folder paths\nfunc newMockFilesystem(items []string) *MockFilesystem {\n\tm := &MockFilesystem{\n\t\tFiles: make(map[string]*MockFile),\n\t}\n\n\tfor _, item := range items {\n\t\tm.Add(item)\n\t}\n\n\treturn m\n}\n\n// OpenFile opens file name from fs.Files, if the file does not exist it returns an os.PathError\nfunc (fs *MockFilesystem) openFile(name string, _ int, _ os.FileMode) (File, error) {\n\tf, ok := fs.Files[name]\n\tif ok {\n\t\tf.Opened = true\n\t\tf.Closed = false\n\t\treturn f, nil\n\t}\n\n\treturn (*MockFile)(nil), &os.PathError{Err: fmt.Errorf(\"%s: no such file\", name)}\n}\n\n// Stat returns a generic FileInfo for all files in fs.Files.\n// If the file does not exist it returns an os.PathError\nfunc (fs *MockFilesystem) stat(name string) (os.FileInfo, error) {\n\t_, ok := fs.Files[name]\n\tif ok {\n\t\t// return file based mock FileInfo, CreateTemp don't like \"/\" in between\n\t\ttmpFile, err := os.CreateTemp(\"\", strings.ReplaceAll(name, \"/\", \"_\"))\n\t\tif err != nil {\n\t\t\tlog.Println(\"A\")\n\t\t\treturn nil, err\n\t\t}\n\t\tdefer func() {\n\t\t\ttmpFile.Close()\n\t\t\tos.Remove(tmpFile.Name())\n\t\t}()\n\n\t\treturn os.Stat(tmpFile.Name())\n\t}\n\n\tdirName := name + \"/\"\n\tfor path := range fs.Files {\n\t\tif strings.HasPrefix(path, dirName) {\n\t\t\t// return dir based mock FileInfo, TempDir don't like \"/\" in between\n\t\t\ttmpDir, err := os.MkdirTemp(\"\", strings.ReplaceAll(name, \"/\", \"_\"))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tdefer os.RemoveAll(tmpDir)\n\n\t\t\treturn os.Stat(tmpDir)\n\t\t}\n\t}\n\n\treturn nil, &os.PathError{Err: fmt.Errorf(\"%s: no such file\", name)}\n}\n\n// Find returns all items (files or folders) below the given directory matching the given pattern.\nfunc (fs *MockFilesystem) find(baseDir string, pattern string) ([]string, error) {\n\treg, err := regexp.Compile(pattern)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar found []string\n\tfor name := range fs.Files {\n\t\tif !strings.HasPrefix(name, baseDir) {\n\t\t\tcontinue\n\t\t}\n\t\titem := strings.TrimPrefix(name[len(baseDir):], \"/\")\n\n\t\tfirstItem := strings.Split(item, \"/\")[0]\n\t\tif reg.MatchString(firstItem) {\n\t\t\tfound = append(found, path.Join(baseDir, firstItem))\n\t\t}\n\t}\n\treturn found, nil\n}\n\n// readFile returns the contents of the given file. If the file does not exist it returns an os.PathError\nfunc (fs *MockFilesystem) readFile(name string) ([]byte, error) {\n\tif fs.WithReadError {\n\t\treturn nil, errRead\n\t}\n\n\tf, ok := fs.Files[name]\n\tif !ok {\n\t\treturn nil, &os.PathError{Err: fmt.Errorf(\"%s: no such file\", name)}\n\t}\n\n\tf.fs.numCallsRead++\n\treturn []byte(f.Contents), nil\n}\n\nfunc (fs *MockFilesystem) next() int {\n\tfs.Seq++\n\treturn fs.Seq\n}\n\n// Add adds a new file to fs.Files given a name, and returns the newly created file\nfunc (fs *MockFilesystem) Add(name string) *MockFile {\n\tf := &MockFile{\n\t\tSeq: -1,\n\t\tfd:  uintptr(time.Now().UnixNano() & 0xffff),\n\t\tfs:  fs,\n\t}\n\tfs.Files[name] = f\n\treturn f\n}\n"
  },
  {
    "path": "system/fs_mock_test.go",
    "content": "package system\n\nimport (\n\t\"sort\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestMockFilesystemOpen(t *testing.T) {\n\tfs := newMockFilesystem([]string{\"foo\"})\n\tf1 := fs.Files[\"foo\"]\n\n\tassert.False(t, f1.Opened)\n\tf2, err := fs.openFile(\"foo\", 0, 0o666)\n\tassert.Equal(t, f2, f1)\n\trequire.NoError(t, err)\n\n\terr = f2.Sync()\n\trequire.NoError(t, err)\n\n\t_, err = fs.openFile(\"bar\", 0, 0o666)\n\trequire.ErrorContains(t, err, \" : bar: no such file\")\n\n\tfs.Add(\"bar\")\n\tf4, _ := fs.openFile(\"bar\", 0, 0o666)\n\tassert.NotEqual(t, f1.Fd(), f4.Fd())\n}\n\nfunc TestMockFilesystemStat(t *testing.T) {\n\tfs := newMockFilesystem([]string{\"foo\", \"bar/baz\"})\n\n\tfileStat, err := fs.stat(\"foo\")\n\trequire.NoError(t, err)\n\tassert.False(t, fileStat.IsDir())\n\n\tdirStat, err := fs.stat(\"bar\")\n\trequire.NoError(t, err)\n\tassert.True(t, dirStat.IsDir())\n\n\t_, err = fs.stat(\"plonk\")\n\trequire.ErrorContains(t, err, \" : plonk: no such file\")\n}\n\nfunc TestMockFilesystemFind(t *testing.T) {\n\t// arrange\n\tfs := newMockFilesystem([]string{\"/foo\", \"/bar/foo\", \"/bar/foo/baz\", \"/bar/baz/foo\", \"/bar/foo/bak\"})\n\ttests := map[string]struct {\n\t\tbaseDir string\n\t\tpattern string\n\t\twant    []string\n\t}{\n\t\t\"flat\":                  {baseDir: \"/\", pattern: \"foo\", want: []string{\"/foo\"}},\n\t\t\"in directory no slash\": {baseDir: \"/bar\", pattern: \"foo\", want: []string{\"/bar/foo\", \"/bar/foo\", \"/bar/foo\"}},\n\t\t\"file\":                  {baseDir: \"/bar/baz/\", pattern: \"foo\", want: []string{\"/bar/baz/foo\"}},\n\t\t\"file pattern\":          {baseDir: \"/bar/foo/\", pattern: \"ba.?\", want: []string{\"/bar/foo/bak\", \"/bar/foo/baz\"}},\n\t\t\"empty\":                 {baseDir: \"/\", pattern: \"plonk\", want: nil},\n\t}\n\tfor name, tt := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// act\n\t\t\tdirs, err := fs.find(tt.baseDir, tt.pattern)\n\t\t\t// assert\n\t\t\trequire.NoError(t, err)\n\t\t\tsort.Strings(dirs)\n\t\t\tassert.Equal(t, tt.want, dirs)\n\t\t})\n\t}\n}\n\nfunc TestMockFilesystemWrite(t *testing.T) {\n\tfs := newMockFilesystem([]string{\"bar\"})\n\tf1 := fs.Files[\"bar\"]\n\n\tf2, err := fs.openFile(\"bar\", 0, 0o666)\n\trequire.NoError(t, err)\n\t// Never been read or written.\n\tassert.LessOrEqual(t, f1.Seq, 0)\n\n\t_, _ = f2.WriteString(\"testing\")\n\t// Was written.\n\tassert.Positive(t, f1.Seq)\n\tassert.Equal(t, \"testing\", f1.Contents)\n}\n\nfunc TestMockFilesystemRead(t *testing.T) {\n\tfs := newMockFilesystem([]string{\"bar\"})\n\tf1 := fs.Files[\"bar\"]\n\tf1.Contents = \"Yip\"\n\n\tf2, err := fs.openFile(\"bar\", 0, 0o666)\n\trequire.NoError(t, err)\n\t// Never been read or written.\n\tassert.LessOrEqual(t, f1.Seq, 0)\n\n\tbuffer := make([]byte, 20)\n\tn, _ := f2.Read(buffer)\n\n\t// Was read.\n\tassert.Positive(t, f1.Seq)\n\tassert.Equal(t, 3, n)\n\tassert.Equal(t, \"Yip\", string(buffer[:3]))\n\n\tn, _ = f2.ReadAt(buffer, 10)\n\tassert.Equal(t, 3, n)\n}\n"
  },
  {
    "path": "system/fs_test.go",
    "content": "package system\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestFilesystemOpen(t *testing.T) {\n\tfs := &nativeFilesystem{}\n\tfile, err := fs.openFile(os.DevNull, os.O_RDONLY, 0o666)\n\trequire.NoError(t, err)\n\t_ = file\n}\n\nfunc TestFilesystemStat(t *testing.T) {\n\tfs := &nativeFilesystem{}\n\tfileInfo, err := fs.stat(os.DevNull)\n\trequire.NoError(t, err)\n\tassert.NotNil(t, fileInfo)\n}\n"
  },
  {
    "path": "system/i2c_device.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"sync\"\n\t\"unsafe\"\n)\n\nconst (\n\ti2cDeviceDebug  = false\n\tforceSetAddress = false // normally address will be written only when changed, this behavior can be overridden\n)\n\nconst (\n\t// From  /usr/include/linux/i2c-dev.h:\n\t// ioctl signals\n\tI2C_TARGET = 0x0703\n\tI2C_FUNCS  = 0x0705\n\tI2C_SMBUS  = 0x0720\n\t// Read/write markers\n\tI2C_SMBUS_READ  = 1\n\tI2C_SMBUS_WRITE = 0\n\n\t// From  /usr/include/linux/i2c.h:\n\t// Adapter functionality\n\tI2C_FUNC_SMBUS_READ_BYTE        = 0x00020000\n\tI2C_FUNC_SMBUS_WRITE_BYTE       = 0x00040000\n\tI2C_FUNC_SMBUS_READ_BYTE_DATA   = 0x00080000\n\tI2C_FUNC_SMBUS_WRITE_BYTE_DATA  = 0x00100000\n\tI2C_FUNC_SMBUS_READ_WORD_DATA   = 0x00200000\n\tI2C_FUNC_SMBUS_WRITE_WORD_DATA  = 0x00400000\n\tI2C_FUNC_SMBUS_READ_BLOCK_DATA  = 0x01000000\n\tI2C_FUNC_SMBUS_WRITE_BLOCK_DATA = 0x02000000\n\tI2C_FUNC_SMBUS_READ_I2C_BLOCK   = 0x04000000 // I2C-like block transfer with 1-byte reg. addr.\n\tI2C_FUNC_SMBUS_WRITE_I2C_BLOCK  = 0x08000000 // I2C-like block transfer with 1-byte reg. addr.\n\t// Transaction types\n\tI2C_SMBUS_BYTE             = 1\n\tI2C_SMBUS_BYTE_DATA        = 2\n\tI2C_SMBUS_WORD_DATA        = 3\n\tI2C_SMBUS_PROC_CALL        = 4\n\tI2C_SMBUS_BLOCK_DATA       = 5\n\tI2C_SMBUS_I2C_BLOCK_BROKEN = 6\n\tI2C_SMBUS_BLOCK_PROC_CALL  = 7 /* SMBus 2.0 */\n\tI2C_SMBUS_I2C_BLOCK_DATA   = 8 /* SMBus 2.0 */\n)\n\ntype i2cSmbusIoctlData struct {\n\treadWrite byte\n\tcommand   byte\n\tprotocol  uint32\n\tdata      unsafe.Pointer\n}\n\ntype i2cDevice struct {\n\tlocation    string\n\tsys         systemCaller\n\tfs          filesystem\n\tfile        File\n\tfuncs       uint64 // adapter functionality mask\n\tlastAddress int\n\tmutex       sync.Mutex\n}\n\n// NewI2cDevice returns a Linux Kernel access by ioctrl to the given i2c bus location (character device).\n// Important note for \"os.ModeExclusive\": this is undefined without create the file for character devices, this means\n// a second open will not return an error e.g. due to a busy resource. If this is not wanted, e.g. to minimize count of\n// open fd's this needs to be prevented at caller side by implementing a caching mechanism. Furthermore this behavior\n// can lead to problems with multiple devices on the same bus because the cycle SetAddress()...Read()/Write() etc. can\n// be interrupted when using multiple instances for the same location.\nfunc (a *Accesser) NewI2cDevice(location string) (*i2cDevice, error) {\n\tif location == \"\" {\n\t\treturn nil, fmt.Errorf(\"the given character device location is empty\")\n\t}\n\n\td := &i2cDevice{\n\t\tlocation:    location,\n\t\tsys:         a.sys,\n\t\tfs:          a.fs,\n\t\tlastAddress: -1,\n\t}\n\treturn d, nil\n}\n\n// Close closes the character device file and resets the lazy variables.\nfunc (d *i2cDevice) Close() error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\td.funcs = 0\n\td.lastAddress = -1\n\tif d.file != nil {\n\t\treturn d.file.Close()\n\t}\n\treturn nil\n}\n\n// ReadByte reads a byte from the current register of an i2c device.\nfunc (d *i2cDevice) ReadByte(address int) (byte, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_READ_BYTE, \"read byte\"); err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar data uint8 = 0xFC // set value for debugging purposes\n\terr := d.smbusAccess(address, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, unsafe.Pointer(&data))\n\treturn data, err\n}\n\n// ReadByteData reads a byte from the given register of an i2c device.\nfunc (d *i2cDevice) ReadByteData(address int, reg uint8) (uint8, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_READ_BYTE_DATA, \"read byte data\"); err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar data uint8 = 0xFD // set value for debugging purposes\n\terr := d.smbusAccess(address, I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, unsafe.Pointer(&data))\n\treturn data, err\n}\n\n// ReadWordData reads a 16 bit value starting from the given register of an i2c device.\nfunc (d *i2cDevice) ReadWordData(address int, reg uint8) (uint16, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_READ_WORD_DATA, \"read word data\"); err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar data uint16 = 0xFFFE // set value for debugging purposes\n\terr := d.smbusAccess(address, I2C_SMBUS_READ, reg, I2C_SMBUS_WORD_DATA, unsafe.Pointer(&data))\n\treturn data, err\n}\n\n// ReadBlockData fills the given buffer with reads starting from the given register of an i2c device.\nfunc (d *i2cDevice) ReadBlockData(address int, reg uint8, data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tdataLen := len(data)\n\tif dataLen > 32 {\n\t\treturn fmt.Errorf(\"reading blocks larger than 32 bytes (%v) not supported\", len(data))\n\t}\n\n\tdata[0] = 0xFF // set value for debugging purposes\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_READ_I2C_BLOCK, \"read block data\"); err != nil {\n\t\tif i2cDeviceDebug {\n\t\t\tlog.Printf(\"%s, use fallback\\n\", err.Error())\n\t\t}\n\t\treturn d.readBlockDataFallback(address, reg, data)\n\t}\n\n\t// set the first element with the data size\n\tbuf := make([]byte, dataLen+1)\n\tbuf[0] = byte(dataLen)\n\tcopy(buf[1:], data)\n\tif err := d.smbusAccess(address, I2C_SMBUS_READ, reg, I2C_SMBUS_I2C_BLOCK_DATA,\n\t\tunsafe.Pointer(&buf[0])); err != nil {\n\t\treturn err\n\t}\n\t// get data from buffer without first size element\n\tcopy(data, buf[1:])\n\treturn nil\n}\n\n// WriteByte writes the given byte value to the current register of an i2c device.\nfunc (d *i2cDevice) WriteByte(address int, val byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_WRITE_BYTE, \"write byte\"); err != nil {\n\t\treturn err\n\t}\n\n\treturn d.smbusAccess(address, I2C_SMBUS_WRITE, val, I2C_SMBUS_BYTE, nil)\n}\n\n// WriteByteData writes the given byte value to the given register of an i2c device.\nfunc (d *i2cDevice) WriteByteData(address int, reg uint8, val uint8) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_WRITE_BYTE_DATA, \"write byte data\"); err != nil {\n\t\treturn err\n\t}\n\n\tdata := val\n\treturn d.smbusAccess(address, I2C_SMBUS_WRITE, reg, I2C_SMBUS_BYTE_DATA, unsafe.Pointer(&data))\n}\n\n// WriteWordData writes the given 16 bit value starting from the given register of an i2c device.\nfunc (d *i2cDevice) WriteWordData(address int, reg uint8, val uint16) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_WRITE_WORD_DATA, \"write word data\"); err != nil {\n\t\treturn err\n\t}\n\n\tdata := val\n\treturn d.smbusAccess(address, I2C_SMBUS_WRITE, reg, I2C_SMBUS_WORD_DATA, unsafe.Pointer(&data))\n}\n\n// WriteBlockData writes the given buffer starting from the given register of an i2c device.\nfunc (d *i2cDevice) WriteBlockData(address int, reg uint8, data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\tdataLen := len(data)\n\tif dataLen > 32 {\n\t\treturn fmt.Errorf(\"writing blocks larger than 32 bytes (%v) not supported\", len(data))\n\t}\n\n\tif err := d.queryFunctionality(I2C_FUNC_SMBUS_WRITE_I2C_BLOCK, \"write i2c block\"); err != nil {\n\t\tif i2cDeviceDebug {\n\t\t\tlog.Printf(\"%s, use fallback\\n\", err.Error())\n\t\t}\n\t\treturn d.writeBlockDataFallback(address, reg, data)\n\t}\n\n\t// set the first element with the data size\n\tbuf := make([]byte, dataLen+1)\n\tbuf[0] = byte(dataLen)\n\tcopy(buf[1:], data)\n\n\treturn d.smbusAccess(address, I2C_SMBUS_WRITE, reg, I2C_SMBUS_I2C_BLOCK_DATA, unsafe.Pointer(&buf[0]))\n}\n\n// WriteBytes writes the given buffer starting from the current register of an i2c device.\nfunc (d *i2cDevice) WriteBytes(address int, data []byte) error {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.writeBytes(address, data)\n}\n\n// Read implements direct I2C read operations.\nfunc (d *i2cDevice) Read(address int, b []byte) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.read(address, b)\n}\n\n// Write implements the io.ReadWriteCloser method by direct I2C write operations.\nfunc (d *i2cDevice) Write(address int, b []byte) (int, error) {\n\td.mutex.Lock()\n\tdefer d.mutex.Unlock()\n\n\treturn d.write(address, b)\n}\n\nfunc (d *i2cDevice) readBlockDataFallback(address int, reg uint8, data []byte) error {\n\tif err := d.writeBytes(address, []byte{reg}); err != nil {\n\t\treturn err\n\t}\n\tif err := d.readAndCheckCount(address, data); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (d *i2cDevice) writeBlockDataFallback(address int, reg uint8, data []byte) error {\n\tbuf := make([]byte, len(data)+1)\n\tcopy(buf[1:], data)\n\tbuf[0] = reg\n\n\tif err := d.writeBytes(address, buf); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (d *i2cDevice) writeBytes(address int, data []byte) error {\n\tn, err := d.write(address, data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif n != len(data) {\n\t\treturn fmt.Errorf(\"write %v bytes to device by sysfs, expected %v\", n, len(data))\n\t}\n\treturn nil\n}\n\nfunc (d *i2cDevice) write(address int, b []byte) (int, error) {\n\tif err := d.setAddress(address); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.openFileLazy(\"Write\"); err != nil {\n\t\treturn 0, err\n\t}\n\treturn d.file.Write(b)\n}\n\nfunc (d *i2cDevice) readAndCheckCount(address int, data []byte) error {\n\tn, err := d.read(address, data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif n != len(data) {\n\t\treturn fmt.Errorf(\"read %v bytes from device by sysfs, expected %v\", n, len(data))\n\t}\n\treturn nil\n}\n\nfunc (d *i2cDevice) read(address int, b []byte) (int, error) {\n\tif err := d.setAddress(address); err != nil {\n\t\treturn 0, err\n\t}\n\tif err := d.openFileLazy(\"Read\"); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn d.file.Read(b)\n}\n\nfunc (d *i2cDevice) queryFunctionality(requested uint64, sender string) error {\n\t// lazy initialization\n\tif d.funcs == 0 {\n\t\tif err := d.syscallIoctl(I2C_FUNCS, unsafe.Pointer(&d.funcs), 0, \"Querying functionality\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif d.funcs&requested == 0 {\n\t\treturn fmt.Errorf(\"SMBus %s not supported\", sender)\n\t}\n\n\treturn nil\n}\n\nfunc (d *i2cDevice) smbusAccess(\n\taddress int,\n\treadWrite byte,\n\tcommand byte,\n\tprotocol uint32,\n\tdataStart unsafe.Pointer,\n) error {\n\tif err := d.setAddress(address); err != nil {\n\t\treturn err\n\t}\n\n\tsmbus := i2cSmbusIoctlData{\n\t\treadWrite: readWrite,\n\t\tcommand:   command,\n\t\tprotocol:  protocol,\n\t\tdata:      dataStart, // the reflected value of unsafePointer equals uintptr(dataStart),\n\t}\n\n\tsender := fmt.Sprintf(\"SMBus access r/w: %d, command: %d, protocol: %d, address: %d\",\n\t\treadWrite, command, protocol, d.lastAddress)\n\tif err := d.syscallIoctl(I2C_SMBUS, unsafe.Pointer(&smbus), 0, sender); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// setAddress sets the address of the i2c device to use.\nfunc (d *i2cDevice) setAddress(address int) error {\n\tif d.lastAddress == address && !forceSetAddress {\n\t\tif i2cDeviceDebug {\n\t\t\tlog.Printf(\"I2C address %d was already sent - skip\", address)\n\t\t}\n\t\treturn nil\n\t}\n\n\tif err := d.syscallIoctl(I2C_TARGET, nil, address, \"Setting address\"); err != nil {\n\t\treturn err\n\t}\n\td.lastAddress = address\n\treturn nil\n}\n\nfunc (d *i2cDevice) syscallIoctl(signal uintptr, payload unsafe.Pointer, address int, sender string) error {\n\tif err := d.openFileLazy(sender); err != nil {\n\t\treturn err\n\t}\n\t//nolint:gosec // TODO: fix later\n\tif _, _, errno := d.sys.syscall(Syscall_SYS_IOCTL, d.file, signal, payload, uint16(address)); errno != 0 {\n\t\treturn fmt.Errorf(\"%s failed with syscall.Errno %v\", sender, errno)\n\t}\n\n\treturn nil\n}\n\nfunc (d *i2cDevice) openFileLazy(sender string) error { //nolint:unparam // useful for debugging\n\t// lazy initialization\n\t// note: \"os.ModeExclusive\" is undefined without create the file. This means for the existing character device,\n\t// a second open will not return an error e.g. due to a busy resource, so most likely \"os.ModeExclusive\" is not really\n\t// helpful and we drop it to the default \"0\" used by normal Open().\n\tif d.file == nil {\n\t\tvar err error\n\t\tif d.file, err = d.fs.openFile(d.location, os.O_RDWR, 0); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "system/i2c_device_test.go",
    "content": "//nolint:gosec // ok for test\npackage system\n\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"unsafe\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nconst dev = \"/dev/i2c-1\"\n\nfunc getSyscallFuncImpl(\n\terrorMask byte,\n) func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno) {\n\t// bit 0: error on function query\n\t// bit 1: error on set address\n\t// bit 2: error on command\n\t//nolint:nonamedreturns // useful here\n\treturn func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno) {\n\t\t// function query\n\t\tif (trap == Syscall_SYS_IOCTL) && (a2 == I2C_FUNCS) {\n\t\t\tif errorMask&0x01 == 0x01 {\n\t\t\t\treturn 0, 0, 1\n\t\t\t}\n\n\t\t\tfuncPtr := (*uint64)(a3)\n\t\t\t*funcPtr = I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_READ_BYTE_DATA |\n\t\t\t\tI2C_FUNC_SMBUS_READ_WORD_DATA |\n\t\t\t\tI2C_FUNC_SMBUS_WRITE_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA |\n\t\t\t\tI2C_FUNC_SMBUS_WRITE_WORD_DATA\n\t\t}\n\t\t// set address\n\t\tif (trap == Syscall_SYS_IOCTL) && (a2 == I2C_TARGET) {\n\t\t\tif errorMask&0x02 == 0x02 {\n\t\t\t\treturn 0, 0, 1\n\t\t\t}\n\t\t}\n\t\t// command\n\t\tif (trap == Syscall_SYS_IOCTL) && (a2 == I2C_SMBUS) {\n\t\t\tif errorMask&0x04 == 0x04 {\n\t\t\t\treturn 0, 0, 1\n\t\t\t}\n\t\t}\n\t\t// Let all operations succeed\n\t\treturn 0, 0, 0\n\t}\n}\n\nfunc initTestI2cDeviceWithMockedSys() (*i2cDevice, *mockSyscall) {\n\ta := NewAccesser()\n\tmsc := a.UseMockSyscall()\n\ta.UseMockFilesystem([]string{dev})\n\n\td, err := a.NewI2cDevice(dev)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn d, msc\n}\n\nfunc TestNewI2cDevice(t *testing.T) {\n\ttests := map[string]struct {\n\t\tdev     string\n\t\twantErr string\n\t}{\n\t\t\"ok\": {\n\t\t\tdev: dev,\n\t\t},\n\t\t\"empty\": {\n\t\t\tdev:     \"\",\n\t\t\twantErr: \"the given character device location is empty\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAccesser()\n\t\t\t// act\n\t\t\td, err := a.NewI2cDevice(tc.dev)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t\tassert.Equal(t, (*i2cDevice)(nil), d)\n\t\t\t} else {\n\t\t\t\tvar _ gobot.I2cSystemDevicer = d\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestClose(t *testing.T) {\n\t// arrange\n\td, _ := initTestI2cDeviceWithMockedSys()\n\t// act & assert\n\trequire.NoError(t, d.Close())\n}\n\nfunc TestWriteRead(t *testing.T) {\n\t// arrange\n\td, _ := initTestI2cDeviceWithMockedSys()\n\twbuf := []byte{0x01, 0x02, 0x03}\n\trbuf := make([]byte, 4)\n\t// act\n\twn, werr := d.Write(1, wbuf)\n\trn, rerr := d.Read(1, rbuf)\n\t// assert\n\trequire.NoError(t, werr)\n\trequire.NoError(t, rerr)\n\tassert.Len(t, wbuf, wn)\n\tassert.Len(t, wbuf, rn) // will read only the written values\n\tassert.Equal(t, rbuf[:len(wbuf)], wbuf)\n}\n\nfunc TestReadByte(t *testing.T) {\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"read_byte_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_READ_BYTE,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_READ_BYTE,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 1, command: 0, protocol: 1, address: 2 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t\t\"error_not_supported\": {\n\t\t\twantErr: \"SMBus read byte not supported\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tconst want = byte(5)\n\t\t\tmsc.dataSlice = []byte{want}\n\t\t\t// act\n\t\t\tgot, err := d.ReadByte(2)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, want, got)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_READ), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, byte(0), msc.smbus.command) // register is set to 0 in that case\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_BYTE), msc.smbus.protocol)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestReadByteData(t *testing.T) {\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"read_byte_data_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_READ_BYTE_DATA,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_READ_BYTE_DATA,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 1, command: 1, protocol: 2, address: 3 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t\t\"error_not_supported\": {\n\t\t\twantErr: \"SMBus read byte data not supported\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tconst (\n\t\t\t\treg  = byte(0x01)\n\t\t\t\twant = byte(0x02)\n\t\t\t)\n\t\t\tmsc.dataSlice = []byte{want}\n\t\t\t// act\n\t\t\tgot, err := d.ReadByteData(3, reg)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, want, got)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_READ), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, reg, msc.smbus.command)\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_BYTE_DATA), msc.smbus.protocol)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestReadWordData(t *testing.T) {\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"read_word_data_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_READ_WORD_DATA,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_READ_WORD_DATA,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 1, command: 2, protocol: 3, address: 4 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t\t\"error_not_supported\": {\n\t\t\twantErr: \"SMBus read word data not supported\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tconst (\n\t\t\t\treg    = byte(0x02)\n\t\t\t\tmsbyte = byte(0xD4)\n\t\t\t\tlsbyte = byte(0x31)\n\t\t\t\twant   = uint16(54321)\n\t\t\t)\n\t\t\t// all common drivers read LSByte first\n\t\t\tmsc.dataSlice = []byte{lsbyte, msbyte}\n\t\t\t// act\n\t\t\tgot, err := d.ReadWordData(4, reg)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, want, got)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_READ), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, reg, msc.smbus.command)\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_WORD_DATA), msc.smbus.protocol)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestReadBlockData(t *testing.T) {\n\t// arrange\n\tconst (\n\t\treg    = byte(0x03)\n\t\twantB0 = byte(11)\n\t\twantB1 = byte(22)\n\t\twantB2 = byte(33)\n\t\twantB3 = byte(44)\n\t\twantB4 = byte(55)\n\t\twantB5 = byte(66)\n\t\twantB6 = byte(77)\n\t\twantB7 = byte(88)\n\t\twantB8 = byte(99)\n\t\twantB9 = byte(111)\n\t)\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"read_block_data_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_READ_I2C_BLOCK,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_READ_I2C_BLOCK,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 1, command: 3, protocol: 8, address: 5 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t\t\"error_from_used_fallback_if_not_supported\": {\n\t\t\twantErr: \"read 1 bytes from device by sysfs, expected 10\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tmsc.dataSlice = []byte{wantB0, wantB1, wantB2, wantB3, wantB4, wantB5, wantB6, wantB7, wantB8, wantB9}\n\t\t\tbuf := []byte{12, 23, 34, 45, 56, 67, 78, 89, 98, 87}\n\t\t\t// act\n\t\t\terr := d.ReadBlockData(5, reg, buf)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, msc.dataSlice, buf)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, uint8(len(buf)+1), msc.sliceSize)\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_READ), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, reg, msc.smbus.command)\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_I2C_BLOCK_DATA), msc.smbus.protocol)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWriteByte(t *testing.T) {\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"write_byte_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_WRITE_BYTE,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_WRITE_BYTE,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 0, command: 68, protocol: 1, address: 6 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t\t\"error_not_supported\": {\n\t\t\twantErr: \"SMBus write byte not supported\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tconst val = byte(0x44)\n\t\t\t// act\n\t\t\terr := d.WriteByte(6, val)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_WRITE), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, val, msc.smbus.command) // in byte write, the register/command is used for the value\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_BYTE), msc.smbus.protocol)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWriteByteData(t *testing.T) {\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"write_byte_data_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_WRITE_BYTE_DATA,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_WRITE_BYTE_DATA,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 0, command: 4, protocol: 2, address: 7 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t\t\"error_not_supported\": {\n\t\t\twantErr: \"SMBus write byte data not supported\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tconst (\n\t\t\t\treg = byte(0x04)\n\t\t\t\tval = byte(0x55)\n\t\t\t)\n\t\t\t// act\n\t\t\terr := d.WriteByteData(7, reg, val)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_WRITE), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, reg, msc.smbus.command)\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_BYTE_DATA), msc.smbus.protocol)\n\t\t\t\tassert.Len(t, msc.dataSlice, 1)\n\t\t\t\tassert.Equal(t, val, msc.dataSlice[0])\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWriteWordData(t *testing.T) {\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"write_word_data_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_WRITE_WORD_DATA,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_WRITE_WORD_DATA,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 0, command: 5, protocol: 3, address: 8 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t\t\"error_not_supported\": {\n\t\t\twantErr: \"SMBus write word data not supported\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tconst (\n\t\t\t\treg        = byte(0x05)\n\t\t\t\tval        = uint16(54321)\n\t\t\t\twantLSByte = byte(0x31)\n\t\t\t\twantMSByte = byte(0xD4)\n\t\t\t)\n\t\t\t// act\n\t\t\terr := d.WriteWordData(8, reg, val)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_WRITE), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, reg, msc.smbus.command)\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_WORD_DATA), msc.smbus.protocol)\n\t\t\t\tassert.Len(t, msc.dataSlice, 2)\n\t\t\t\t// all common drivers write LSByte first\n\t\t\t\tassert.Equal(t, wantLSByte, msc.dataSlice[0])\n\t\t\t\tassert.Equal(t, wantMSByte, msc.dataSlice[1])\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWriteBlockData(t *testing.T) {\n\t// arrange\n\tconst (\n\t\treg = byte(0x06)\n\t\tb0  = byte(0x09)\n\t\tb1  = byte(0x11)\n\t\tb2  = byte(0x22)\n\t\tb3  = byte(0x33)\n\t\tb4  = byte(0x44)\n\t\tb5  = byte(0x55)\n\t\tb6  = byte(0x66)\n\t\tb7  = byte(0x77)\n\t\tb8  = byte(0x88)\n\t\tb9  = byte(0x99)\n\t)\n\ttests := map[string]struct {\n\t\tfuncs       uint64\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t}{\n\t\t\"write_block_data_ok\": {\n\t\t\tfuncs: I2C_FUNC_SMBUS_WRITE_I2C_BLOCK,\n\t\t},\n\t\t\"error_syscall\": {\n\t\t\tfuncs:       I2C_FUNC_SMBUS_WRITE_I2C_BLOCK,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x04),\n\t\t\twantErr: \"SMBus access r/w: 0, command: 6, protocol: 8, address: 9 \" +\n\t\t\t\t\"failed with syscall.Errno operation not permitted\",\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\td.funcs = tc.funcs\n\t\t\tdata := []byte{b0, b1, b2, b3, b4, b5, b6, b7, b8, b9}\n\t\t\t// act\n\t\t\terr := d.WriteBlockData(9, reg, data)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t\tassert.Equal(t, d.file, msc.lastFile)\n\t\t\t\tassert.Equal(t, uintptr(I2C_SMBUS), msc.lastSignal)\n\t\t\t\tassert.Equal(t, uint8(len(data)+1), msc.sliceSize) // including size element\n\t\t\t\tassert.Equal(t, byte(I2C_SMBUS_WRITE), msc.smbus.readWrite)\n\t\t\t\tassert.Equal(t, reg, msc.smbus.command)\n\t\t\t\tassert.Equal(t, uint32(I2C_SMBUS_I2C_BLOCK_DATA), msc.smbus.protocol)\n\t\t\t\tassert.Equal(t, uint8(len(data)), msc.dataSlice[0]) // data size\n\t\t\t\tassert.Equal(t, data, msc.dataSlice[1:])\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWriteBlockDataTooMuch(t *testing.T) {\n\t// arrange\n\td, _ := initTestI2cDeviceWithMockedSys()\n\t// act\n\terr := d.WriteBlockData(10, 0x01, make([]byte, 33))\n\t// assert\n\trequire.ErrorContains(t, err, \"writing blocks larger than 32 bytes (33) not supported\")\n}\n\nfunc Test_setAddress(t *testing.T) {\n\t// arrange\n\td, msc := initTestI2cDeviceWithMockedSys()\n\t// act\n\terr := d.setAddress(0xff)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, uintptr(0xff), msc.devAddress)\n}\n\nfunc Test_queryFunctionality(t *testing.T) {\n\ttests := map[string]struct {\n\t\trequested   uint64\n\t\tdev         string\n\t\tsyscallImpl func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n\t\twantErr     string\n\t\twantFile    bool\n\t\twantFuncs   uint64\n\t}{\n\t\t\"ok\": {\n\t\t\trequested:   I2C_FUNC_SMBUS_READ_BYTE,\n\t\t\tdev:         dev,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x00),\n\t\t\twantFile:    true,\n\t\t\twantFuncs:   0x7E0000,\n\t\t},\n\t\t\"dev_null_error\": {\n\t\t\tdev:         os.DevNull,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x00),\n\t\t\twantErr:     \" : /dev/null: no such file\",\n\t\t},\n\t\t\"query_funcs_error\": {\n\t\t\tdev:         dev,\n\t\t\tsyscallImpl: getSyscallFuncImpl(0x01),\n\t\t\twantErr:     \"Querying functionality failed with syscall.Errno operation not permitted\",\n\t\t\twantFile:    true,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\td, msc := initTestI2cDeviceWithMockedSys()\n\t\t\td.location = tc.dev\n\t\t\tmsc.Impl = tc.syscallImpl\n\t\t\t// act\n\t\t\terr := d.queryFunctionality(tc.requested, \"test\"+name)\n\t\t\t// assert\n\t\t\tif tc.wantErr != \"\" {\n\t\t\t\trequire.ErrorContains(t, err, tc.wantErr)\n\t\t\t} else {\n\t\t\t\trequire.NoError(t, err)\n\t\t\t}\n\t\t\tif tc.wantFile {\n\t\t\t\tassert.NotNil(t, d.file)\n\t\t\t} else {\n\t\t\t\tassert.Equal(t, (*MockFile)(nil), d.file)\n\t\t\t}\n\t\t\tassert.Equal(t, tc.wantFuncs, d.funcs)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "system/onewiredevice_sysfs.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"path\"\n)\n\ntype onewireDeviceSysfs struct {\n\tid        string\n\tsysfsPath string\n\tsfa       *sysfsFileAccess\n}\n\nfunc newOneWireDeviceSysfs(sfa *sysfsFileAccess, id string) *onewireDeviceSysfs {\n\tp := &onewireDeviceSysfs{\n\t\tid:        id,\n\t\tsysfsPath: path.Join(\"/sys/bus/w1/devices\", id),\n\t\tsfa:       sfa,\n\t}\n\treturn p\n}\n\n// ID returns the device id in the form \"family code\"-\"serial number\". Implements gobot.OneWireSystemDevicer.\nfunc (o *onewireDeviceSysfs) ID() string {\n\treturn o.id\n}\n\n// ReadData reads from the sysfs path specified by the command. Implements gobot.OneWireSystemDevicer.\nfunc (o *onewireDeviceSysfs) ReadData(command string, data []byte) error {\n\tp := path.Join(o.sysfsPath, command)\n\tbuf, err := o.sfa.read(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcopy(data, buf)\n\n\tif len(buf) < len(data) {\n\t\treturn fmt.Errorf(\"count of read bytes (%d) is smaller than expected (%d)\", len(buf), len(data))\n\t}\n\n\treturn nil\n}\n\n// WriteData writes to the path specified by the command. Implements gobot.OneWireSystemDevicer.\nfunc (o *onewireDeviceSysfs) WriteData(command string, data []byte) error {\n\tp := path.Join(o.sysfsPath, command)\n\treturn o.sfa.write(p, data)\n}\n\n// ReadInteger reads an integer value from the device. Implements gobot.OneWireSystemDevicer.\nfunc (o *onewireDeviceSysfs) ReadInteger(command string) (int, error) {\n\tp := path.Join(o.sysfsPath, command)\n\treturn o.sfa.readInteger(p)\n}\n\n// WriteInteger writes an integer value to the device. Implements gobot.OneWireSystemDevicer.\nfunc (o *onewireDeviceSysfs) WriteInteger(command string, val int) error {\n\tp := path.Join(o.sysfsPath, command)\n\treturn o.sfa.writeInteger(p, val)\n}\n\n// Close the 1-wire connection. Implements gobot.OneWireSystemDevicer.\nfunc (o *onewireDeviceSysfs) Close() error {\n\t// currently nothing to do here - the file descriptors will be closed immediately after read/write\n\treturn nil\n}\n"
  },
  {
    "path": "system/onewiredevice_sysfs_test.go",
    "content": "package system\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_newOneWireDeviceSysfs(t *testing.T) {\n\t// arrange\n\tm := &MockFilesystem{}\n\tsfa := sysfsFileAccess{fs: m, readBufLen: 2}\n\tconst id = \"0815\"\n\t// act\n\td := newOneWireDeviceSysfs(&sfa, id)\n\t// assert\n\tassert.Equal(t, \"/sys/bus/w1/devices/\"+id, d.sysfsPath)\n\tassert.Equal(t, &sfa, d.sfa)\n\tassert.Equal(t, id, d.ID())\n}\n\nfunc TestOneWireDeviceReadData(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tid             = \"0816\"\n\t\tcommand        = \"getValue\"\n\t\tpath           = \"/sys/bus/w1/devices/\" + id + \"/\" + command\n\t\tcontent        = \"234\"\n\t\tcountBytesRead = 3\n\t)\n\tfs := newMockFilesystem([]string{path})\n\tsfa := sysfsFileAccess{fs: fs, readBufLen: countBytesRead}\n\td := newOneWireDeviceSysfs(&sfa, id)\n\tfs.Files[path].Contents = content\n\tdata := []byte{1, 1, 1}\n\t// act\n\terr := d.ReadData(command, data)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, []byte(content), data)\n}\n\nfunc TestOneWireDeviceWriteData(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tid      = \"0817\"\n\t\tcommand = \"putValue\"\n\t\tpath    = \"/sys/bus/w1/devices/\" + id + \"/\" + command\n\t)\n\tfs := newMockFilesystem([]string{path})\n\tsfa := sysfsFileAccess{fs: fs}\n\td := newOneWireDeviceSysfs(&sfa, id)\n\tfs.Files[path].Contents = \"old content\"\n\tdata := []byte{1, 2, 3}\n\t// act\n\terr := d.WriteData(command, data)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, data, []byte(fs.Files[path].Contents))\n}\n\nfunc TestOneWireDeviceReadInteger(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tid             = \"0818\"\n\t\tcommand        = \"getIntegerValue\"\n\t\tpath           = \"/sys/bus/w1/devices/\" + id + \"/\" + command\n\t\tcontent        = \"23456\"\n\t\tcountBytesRead = 4\n\t\twant           = 2345 // limited by readBufLen\n\t)\n\tfs := newMockFilesystem([]string{path})\n\tsfa := sysfsFileAccess{fs: fs, readBufLen: countBytesRead}\n\td := newOneWireDeviceSysfs(&sfa, id)\n\tfs.Files[path].Contents = content\n\t// act\n\tgot, err := d.ReadInteger(command)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, want, got)\n}\n\nfunc TestOneWireDeviceWriteInteger(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tid      = \"0818\"\n\t\tcommand = \"getIntegerValue\"\n\t\tpath    = \"/sys/bus/w1/devices/\" + id + \"/\" + command\n\t\twrite   = 155\n\t)\n\tfs := newMockFilesystem([]string{path})\n\tsfa := sysfsFileAccess{fs: fs}\n\td := newOneWireDeviceSysfs(&sfa, id)\n\tfs.Files[path].Contents = \"old content\"\n\t// act\n\terr := d.WriteInteger(command, write)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, strconv.Itoa(write), fs.Files[path].Contents)\n}\n"
  },
  {
    "path": "system/pwmpin_sysfs.go",
    "content": "package system\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"strconv\"\n\t\"time\"\n)\n\nconst pwmDebug = false\n\nconst (\n\tpwmPinErrorPattern    = \"%s() failed for id %s with %v\"   //nolint:gosec // false positive\n\tpwmPinSetErrorPattern = \"%s(%v) failed for id %s with %v\" //nolint:gosec // false positive\n)\n\n// pwmPinSysFs represents a PWM pin\ntype pwmPinSysFs struct {\n\tpath                       string\n\tpin                        string\n\tpolarityNormalIdentifier   string\n\tpolarityInvertedIdentifier string\n\n\tsfa *sysfsFileAccess\n}\n\n// newPWMPinSysfs returns a new pwmPin, working with sysfs file access.\nfunc newPWMPinSysfs(sfa *sysfsFileAccess, path string, pin int, polNormIdent string, polInvIdent string) *pwmPinSysFs {\n\tp := &pwmPinSysFs{\n\t\tpath:                       path,\n\t\tpin:                        strconv.Itoa(pin),\n\t\tpolarityNormalIdentifier:   polNormIdent,\n\t\tpolarityInvertedIdentifier: polInvIdent,\n\n\t\tsfa: sfa,\n\t}\n\treturn p\n}\n\n// Export exports the pin for use by the operating system by writing the pin to the \"Export\" path\nfunc (p *pwmPinSysFs) Export() error {\n\tif err := p.sfa.write(p.pwmExportPath(), []byte(p.pin)); err != nil {\n\t\t// If EBUSY then the pin has already been exported, we suppress the error\n\t\tvar pathError *os.PathError\n\t\tif !errors.As(err, &pathError) || !errors.Is(err, Syscall_EBUSY) {\n\t\t\treturn fmt.Errorf(pwmPinErrorPattern, \"Export\", p.pin, err)\n\t\t}\n\t}\n\n\t// Pause to avoid race condition in case there is any udev rule\n\t// that changes file permissions on newly exported PWMPin. This\n\t// is a common circumstance when running as a non-root user.\n\ttime.Sleep(100 * time.Millisecond)\n\n\treturn nil\n}\n\n// Unexport releases the pin from the operating system by writing the pin to the \"Unexport\" path\nfunc (p *pwmPinSysFs) Unexport() error {\n\tif err := p.sfa.write(p.pwmUnexportPath(), []byte(p.pin)); err != nil {\n\t\treturn fmt.Errorf(pwmPinErrorPattern, \"Unexport\", p.pin, err)\n\t}\n\treturn nil\n}\n\n// Enabled reads and returns the enabled state of the pin\nfunc (p *pwmPinSysFs) Enabled() (bool, error) {\n\tval, err := p.sfa.readInteger(p.pwmEnablePath())\n\tif err != nil {\n\t\treturn false, fmt.Errorf(pwmPinErrorPattern, \"Enabled\", p.pin, err)\n\t}\n\n\treturn val > 0, nil\n}\n\n// SetEnabled writes enable(1) or disable(0) status. For most platforms this is only possible if period was\n// already set to > 0. Regardless of setting to enable or disable, a \"write error: Invalid argument\" will occur.\nfunc (p *pwmPinSysFs) SetEnabled(enable bool) error {\n\tenableVal := 0\n\tif enable {\n\t\tenableVal = 1\n\t}\n\tif err := p.sfa.writeInteger(p.pwmEnablePath(), enableVal); err != nil {\n\t\tif pwmDebug {\n\t\t\tp.printState()\n\t\t}\n\t\treturn fmt.Errorf(pwmPinSetErrorPattern, \"SetEnabled\", enable, p.pin, err)\n\t}\n\n\treturn nil\n}\n\n// Polarity reads and returns false if the polarity is inverted, otherwise true\nfunc (p *pwmPinSysFs) Polarity() (bool, error) {\n\tbuf, err := p.sfa.read(p.pwmPolarityPath())\n\tif err != nil {\n\t\treturn true, fmt.Errorf(pwmPinErrorPattern, \"Polarity\", p.pin, err)\n\t}\n\tif len(buf) == 0 {\n\t\treturn true, nil\n\t}\n\n\tps := string(bytes.TrimRight(buf, \"\\n\"))\n\tif ps == p.polarityNormalIdentifier {\n\t\treturn true, nil\n\t}\n\tif ps == p.polarityInvertedIdentifier {\n\t\treturn false, nil\n\t}\n\n\treturn true, fmt.Errorf(\"unknown value (%s) in Polarity\", ps)\n}\n\n// SetPolarity writes the polarity as normal if called with true and as inverted if called with false\nfunc (p *pwmPinSysFs) SetPolarity(normal bool) error {\n\tenabled, _ := p.Enabled()\n\tif enabled {\n\t\treturn fmt.Errorf(\"cannot set PWM polarity when enabled\")\n\t}\n\tvalue := p.polarityNormalIdentifier\n\tif !normal {\n\t\tvalue = p.polarityInvertedIdentifier\n\t}\n\tif err := p.sfa.write(p.pwmPolarityPath(), []byte(value)); err != nil {\n\t\tif pwmDebug {\n\t\t\tp.printState()\n\t\t}\n\t\treturn fmt.Errorf(pwmPinSetErrorPattern, \"SetPolarity\", value, p.pin, err)\n\t}\n\treturn nil\n}\n\n// Period returns the current period in nanoseconds\nfunc (p *pwmPinSysFs) Period() (uint32, error) {\n\tval, err := p.sfa.readInteger(p.pwmPeriodPath())\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(pwmPinErrorPattern, \"Period\", p.pin, err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\treturn uint32(val), nil\n}\n\n// SetPeriod writes the current period in nanoseconds\nfunc (p *pwmPinSysFs) SetPeriod(period uint32) error {\n\tif err := p.sfa.writeInteger(p.pwmPeriodPath(), int(period)); err != nil {\n\n\t\tif pwmDebug {\n\t\t\tp.printState()\n\t\t}\n\t\treturn fmt.Errorf(pwmPinSetErrorPattern, \"SetPeriod\", period, p.pin, err)\n\t}\n\treturn nil\n}\n\n// DutyCycle reads and returns the duty cycle in nanoseconds\nfunc (p *pwmPinSysFs) DutyCycle() (uint32, error) {\n\tval, err := p.sfa.readInteger(p.pwmDutyCyclePath())\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(pwmPinErrorPattern, \"DutyCycle\", p.pin, err)\n\t}\n\t//nolint:gosec // TODO: fix later\n\treturn uint32(val), err\n}\n\n// SetDutyCycle writes the duty cycle in nanoseconds\nfunc (p *pwmPinSysFs) SetDutyCycle(duty uint32) error {\n\tif err := p.sfa.writeInteger(p.pwmDutyCyclePath(), int(duty)); err != nil {\n\t\tif pwmDebug {\n\t\t\tp.printState()\n\t\t}\n\t\treturn fmt.Errorf(pwmPinSetErrorPattern, \"SetDutyCycle\", duty, p.pin, err)\n\t}\n\treturn nil\n}\n\n// pwmExportPath returns export path\nfunc (p *pwmPinSysFs) pwmExportPath() string {\n\treturn path.Join(p.path, \"export\")\n}\n\n// pwmUnexportPath returns unexport path\nfunc (p *pwmPinSysFs) pwmUnexportPath() string {\n\treturn path.Join(p.path, \"unexport\")\n}\n\n// pwmDutyCyclePath returns duty_cycle path for specified pin\nfunc (p *pwmPinSysFs) pwmDutyCyclePath() string {\n\treturn path.Join(p.path, \"pwm\"+p.pin, \"duty_cycle\")\n}\n\n// pwmPeriodPath returns period path for specified pin\nfunc (p *pwmPinSysFs) pwmPeriodPath() string {\n\treturn path.Join(p.path, \"pwm\"+p.pin, \"period\")\n}\n\n// pwmEnablePath returns enable path for specified pin\nfunc (p *pwmPinSysFs) pwmEnablePath() string {\n\treturn path.Join(p.path, \"pwm\"+p.pin, \"enable\")\n}\n\n// pwmPolarityPath returns polarity path for specified pin\nfunc (p *pwmPinSysFs) pwmPolarityPath() string {\n\treturn path.Join(p.path, \"pwm\"+p.pin, \"polarity\")\n}\n\nfunc (p *pwmPinSysFs) printState() {\n\tenabled, _ := p.Enabled()\n\tpolarity, _ := p.Polarity()\n\tperiod, _ := p.Period()\n\tduty, _ := p.DutyCycle()\n\n\tfmt.Println(\"Print state of all PWM variables...\")\n\tfmt.Printf(\"Enable: %v, \", enabled)\n\tfmt.Printf(\"Polarity: %v, \", polarity)\n\tfmt.Printf(\"Period: %v, \", period)\n\tfmt.Printf(\"DutyCycle: %v, \", duty)\n\tvar powerPercent float64\n\tif enabled {\n\t\tif polarity {\n\t\t\tpowerPercent = float64(duty) / float64(period) * 100\n\t\t} else {\n\t\t\tpowerPercent = float64(period) / float64(duty) * 100\n\t\t}\n\t}\n\tfmt.Printf(\"Power: %.1f\\n\", powerPercent)\n}\n"
  },
  {
    "path": "system/pwmpin_sysfs_test.go",
    "content": "package system\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\nvar _ gobot.PWMPinner = (*pwmPinSysFs)(nil)\n\nconst (\n\tnormal   = \"normal\"\n\tinverted = \"inversed\"\n)\n\nfunc initTestPWMPinSysFsWithMockedFilesystem(mockPaths []string) (*pwmPinSysFs, *MockFilesystem) {\n\tfs := newMockFilesystem(mockPaths)\n\tsfa := &sysfsFileAccess{fs: fs, readBufLen: 200}\n\tpin := newPWMPinSysfs(sfa, \"/sys/class/pwm/pwmchip0\", 10, normal, inverted)\n\treturn pin, fs\n}\n\nfunc TestPwmPin(t *testing.T) {\n\tmockedPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/enable\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/polarity\",\n\t}\n\tpin, fs := initTestPWMPinSysFsWithMockedFilesystem(mockedPaths)\n\n\tassert.Equal(t, \"10\", pin.pin)\n\n\terr := pin.Unexport()\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"10\", fs.Files[\"/sys/class/pwm/pwmchip0/unexport\"].Contents)\n\n\terr = pin.Export()\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"10\", fs.Files[\"/sys/class/pwm/pwmchip0/export\"].Contents)\n\n\trequire.NoError(t, pin.SetPolarity(false))\n\tassert.Equal(t, inverted, fs.Files[\"/sys/class/pwm/pwmchip0/pwm10/polarity\"].Contents)\n\tpol, _ := pin.Polarity()\n\tassert.False(t, pol)\n\trequire.NoError(t, pin.SetPolarity(true))\n\tassert.Equal(t, normal, fs.Files[\"/sys/class/pwm/pwmchip0/pwm10/polarity\"].Contents)\n\tpol, _ = pin.Polarity()\n\tassert.True(t, pol)\n\n\tassert.NotEqual(t, \"1\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm10/enable\"].Contents)\n\terr = pin.SetEnabled(true)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"1\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm10/enable\"].Contents)\n\terr = pin.SetPolarity(true)\n\trequire.ErrorContains(t, err, \"cannot set PWM polarity when enabled\")\n\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm10/period\"].Contents = \"6\"\n\tdata, _ := pin.Period()\n\tassert.Equal(t, uint32(6), data)\n\trequire.NoError(t, pin.SetPeriod(100000))\n\tdata, _ = pin.Period()\n\tassert.Equal(t, uint32(100000), data)\n\n\tassert.NotEqual(t, \"1\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\"].Contents)\n\terr = pin.SetDutyCycle(100)\n\trequire.NoError(t, err)\n\tassert.Equal(t, \"100\", fs.Files[\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\"].Contents)\n\tdata, _ = pin.DutyCycle()\n\tassert.Equal(t, uint32(100), data)\n}\n\nfunc TestPwmPinAlreadyExported(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/enable\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\",\n\t}\n\tpin, fs := initTestPWMPinSysFsWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/export\"].simulateWriteError = &os.PathError{Err: Syscall_EBUSY}\n\t// act & assert: no error indicates that the pin was already exported\n\trequire.NoError(t, pin.Export())\n}\n\nfunc TestPwmPinExportError(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/enable\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\",\n\t}\n\tpin, fs := initTestPWMPinSysFsWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/export\"].simulateWriteError = &os.PathError{Err: Syscall_EFAULT}\n\t// act\n\terr := pin.Export()\n\t// assert\n\trequire.ErrorContains(t, err, \"Export() failed for id 10 with  : bad address\")\n}\n\nfunc TestPwmPinUnxportError(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/enable\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\",\n\t}\n\tpin, fs := initTestPWMPinSysFsWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/unexport\"].simulateWriteError = &os.PathError{Err: Syscall_EBUSY}\n\t// act\n\terr := pin.Unexport()\n\t// assert\n\trequire.ErrorContains(t, err, \"Unexport() failed for id 10 with  : device or resource busy\")\n}\n\nfunc TestPwmPinPeriodError(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/enable\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\",\n\t}\n\tpin, fs := initTestPWMPinSysFsWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm10/period\"].simulateReadError = &os.PathError{Err: Syscall_EBUSY}\n\t// act\n\t_, err := pin.Period()\n\t// assert\n\trequire.ErrorContains(t, err, \"Period() failed for id 10 with  : device or resource busy\")\n}\n\nfunc TestPwmPinPolarityError(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/enable\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/polarity\",\n\t}\n\tpin, fs := initTestPWMPinSysFsWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm10/polarity\"].simulateReadError = &os.PathError{Err: Syscall_EBUSY}\n\t// act\n\t_, err := pin.Polarity()\n\t// assert\n\trequire.ErrorContains(t, err, \"Polarity() failed for id 10 with  : device or resource busy\")\n}\n\nfunc TestPwmPinDutyCycleError(t *testing.T) {\n\t// arrange\n\tmockedPaths := []string{\n\t\t\"/sys/class/pwm/pwmchip0/export\",\n\t\t\"/sys/class/pwm/pwmchip0/unexport\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/enable\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/period\",\n\t\t\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\",\n\t}\n\tpin, fs := initTestPWMPinSysFsWithMockedFilesystem(mockedPaths)\n\tfs.Files[\"/sys/class/pwm/pwmchip0/pwm10/duty_cycle\"].simulateReadError = &os.PathError{Err: Syscall_EBUSY}\n\t// act\n\t_, err := pin.DutyCycle()\n\t// assert\n\trequire.ErrorContains(t, err, \"DutyCycle() failed for id 10 with  : device or resource busy\")\n}\n"
  },
  {
    "path": "system/spi_gpio.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/hashicorp/go-multierror\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype spiGpioConfig struct {\n\tpinProvider gobot.DigitalPinnerProvider\n\tsclkPinID   string\n\tncsPinID    string\n\tsdoPinID    string\n\tsdiPinID    string\n\tdebug       bool\n}\n\n// spiGpio is the implementation of the SPI interface using GPIO's.\ntype spiGpio struct {\n\tcfg spiGpioConfig\n\t// time between clock edges (i.e. half the cycle time)\n\ttclk    time.Duration\n\tsclkPin gobot.DigitalPinner\n\tncsPin  gobot.DigitalPinner\n\tsdoPin  gobot.DigitalPinner\n\tsdiPin  gobot.DigitalPinner\n}\n\n// newSpiGpio creates and returns a new SPI connection based on given GPIO's.\nfunc newSpiGpio(cfg spiGpioConfig, maxSpeedHz int64) (*spiGpio, error) {\n\tspi := &spiGpio{cfg: cfg}\n\tspi.initializeTime(maxSpeedHz)\n\treturn spi, spi.initializeGpios()\n}\n\nfunc (s *spiGpio) initializeTime(maxSpeedHz int64) {\n\t// maxSpeedHz is given in Hz, tclk is half the cycle time, tclk=1/(2*f), tclk[ns]=1 000 000 000/(2*maxSpeed)\n\t// but with gpio's a speed of more than ~15kHz is most likely not possible, so we limit to 10kHz\n\tif maxSpeedHz > 10000 {\n\t\tif s.cfg.debug {\n\t\t\tfmt.Printf(\"reduce SPI speed for GPIO usage to 10Khz\")\n\t\t}\n\t\tmaxSpeedHz = 10000\n\t}\n\ts.tclk = time.Duration(1000000000/2/maxSpeedHz) * time.Nanosecond\n\tif s.cfg.debug {\n\t\tfmt.Println(\"clk\", s.tclk)\n\t}\n}\n\n// TxRx uses the SPI device to send/receive data. Implements gobot.SpiSystemDevicer.\nfunc (s *spiGpio) TxRx(tx []byte, rx []byte) error {\n\tvar doRx bool\n\tif rx != nil {\n\t\tdoRx = true\n\t\tif len(tx) != len(rx) {\n\t\t\treturn fmt.Errorf(\"length of tx (%d) must be the same as length of rx (%d)\", len(tx), len(rx))\n\t\t}\n\t}\n\n\tif err := s.ncsPin.Write(0); err != nil {\n\t\treturn err\n\t}\n\n\tfor idx, b := range tx {\n\t\tval, err := s.transferByte(b)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif doRx {\n\t\t\trx[idx] = val\n\t\t}\n\t}\n\n\treturn s.ncsPin.Write(1)\n}\n\n// Close the SPI connection. Implements gobot.SpiSystemDevicer.\nfunc (s *spiGpio) Close() error {\n\tvar err error\n\tif s.sclkPin != nil {\n\t\tif e := s.sclkPin.Unexport(); e != nil {\n\t\t\terr = multierror.Append(err, e)\n\t\t}\n\t}\n\tif s.sdoPin != nil {\n\t\tif e := s.sdoPin.Unexport(); e != nil {\n\t\t\terr = multierror.Append(err, e)\n\t\t}\n\t}\n\tif s.sdiPin != nil {\n\t\tif e := s.sdiPin.Unexport(); e != nil {\n\t\t\terr = multierror.Append(err, e)\n\t\t}\n\t}\n\tif s.ncsPin != nil {\n\t\tif e := s.ncsPin.Unexport(); e != nil {\n\t\t\terr = multierror.Append(err, e)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (cfg *spiGpioConfig) String() string {\n\treturn fmt.Sprintf(\"sclk: %s, ncs: %s, sdo: %s, sdi: %s\", cfg.sclkPinID, cfg.ncsPinID, cfg.sdoPinID, cfg.sdiPinID)\n}\n\n// transferByte simultaneously transmit and receive a byte\n// polarity and phase are assumed to be both 0 (CPOL=0, CPHA=0), so:\n// * input data is captured on rising edge of SCLK\n// * output data is propagated on falling edge of SCLK\nfunc (s *spiGpio) transferByte(txByte uint8) (uint8, error) {\n\trxByte := uint8(0)\n\tbitMask := uint8(0x80) // start at MSBit\n\n\tfor i := 0; i < 8; i++ {\n\t\tif err := s.sdoPin.Write(int(txByte & bitMask)); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\ttime.Sleep(s.tclk)\n\t\tif err := s.sclkPin.Write(1); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\tv, err := s.sdiPin.Read()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tif v != 0 {\n\t\t\trxByte |= bitMask\n\t\t}\n\n\t\ttime.Sleep(s.tclk)\n\t\tif err := s.sclkPin.Write(0); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\tbitMask = bitMask >> 1 // next lower bit\n\t}\n\n\treturn rxByte, nil\n}\n\nfunc (s *spiGpio) initializeGpios() error {\n\tvar err error\n\t// ncs is an output, negated (currently not implemented at pin level)\n\ts.ncsPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.ncsPinID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := s.ncsPin.ApplyOptions(WithPinDirectionOutput(1)); err != nil {\n\t\treturn err\n\t}\n\t// sclk is an output, CPOL = 0\n\ts.sclkPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.sclkPinID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := s.sclkPin.ApplyOptions(WithPinDirectionOutput(0)); err != nil {\n\t\treturn err\n\t}\n\t// sdi is an input\n\ts.sdiPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.sdiPinID)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// sdo is an output\n\ts.sdoPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.sdoPinID)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn s.sdoPin.ApplyOptions(WithPinDirectionOutput(0))\n}\n"
  },
  {
    "path": "system/spi_gpio_test.go",
    "content": "package system\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_newSpiGpio(t *testing.T) {\n\t// arrange\n\tdpa := newMockDigitalPinAccess(nil)\n\tcfg := spiGpioConfig{\n\t\tpinProvider: dpa,\n\t\tsclkPinID:   \"1\",\n\t\tncsPinID:    \"2\",\n\t\tsdoPinID:    \"3\",\n\t\tsdiPinID:    \"4\",\n\t}\n\t// act\n\td, err := newSpiGpio(cfg, 10001)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, cfg, d.cfg)\n\tassert.Equal(t, 50*time.Microsecond, d.tclk)\n\tassert.NotNil(t, d.sclkPin)\n\tassert.NotNil(t, d.ncsPin)\n\tassert.NotNil(t, d.sdoPin)\n\tassert.NotNil(t, d.sdiPin)\n\tassert.Equal(t, 1, dpa.AppliedOptions(\"\", cfg.sclkPinID))\n\tassert.Equal(t, 1, dpa.AppliedOptions(\"\", cfg.ncsPinID))\n\tassert.Equal(t, 1, dpa.AppliedOptions(\"\", cfg.sdoPinID))\n\tassert.Equal(t, 0, dpa.AppliedOptions(\"\", cfg.sdiPinID)) // already input, so no option applied\n}\n\nfunc TestSpiGpioTxRx(t *testing.T) {\n\t// arrange\n\tdpa := newMockDigitalPinAccess(nil)\n\tcfg := spiGpioConfig{\n\t\tpinProvider: dpa,\n\t\tsclkPinID:   \"1\",\n\t\tncsPinID:    \"2\",\n\t\tsdoPinID:    \"3\",\n\t\tsdiPinID:    \"4\",\n\t}\n\tdpa.UseValues(\"\", cfg.sdiPinID, []int{1, 0, 0, 1, 0, 1, 0, 1})\n\td, err := newSpiGpio(cfg, 10001)\n\trequire.NoError(t, err)\n\t// act\n\trx := []byte{0x87}\n\terr = d.TxRx([]byte{0xf1}, rx)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, []int{0, 1}, dpa.Written(\"\", cfg.ncsPinID))\n\tassert.Equal(t, []int{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0}, dpa.Written(\"\", cfg.sclkPinID))\n\tassert.Equal(t, []int{128, 64, 32, 16, 0, 0, 0, 1}, dpa.Written(\"\", cfg.sdoPinID)) // > 0 just means a 1 was send\n\tassert.Empty(t, dpa.Written(\"\", cfg.sdiPinID))\n\tassert.Equal(t, []byte{0x95}, rx)\n}\n\nfunc TestSpiGpioClose(t *testing.T) {\n\t// arrange\n\tdpa := newMockDigitalPinAccess(nil)\n\tcfg := spiGpioConfig{\n\t\tpinProvider: dpa,\n\t\tsclkPinID:   \"1\",\n\t\tncsPinID:    \"2\",\n\t\tsdoPinID:    \"3\",\n\t\tsdiPinID:    \"4\",\n\t}\n\tdpa.UseValues(\"\", cfg.sdiPinID, []int{1, 0, 0, 1, 0, 1, 0, 1})\n\td, err := newSpiGpio(cfg, 10001)\n\trequire.NoError(t, err)\n\t// act\n\terr = d.Close()\n\t// assert\n\trequire.NoError(t, err)\n\tassert.Equal(t, -1, dpa.Exported(\"\", cfg.sclkPinID))\n\tassert.Equal(t, -1, dpa.Exported(\"\", cfg.ncsPinID))\n\tassert.Equal(t, -1, dpa.Exported(\"\", cfg.sdoPinID))\n\tassert.Equal(t, -1, dpa.Exported(\"\", cfg.sdiPinID))\n}\n"
  },
  {
    "path": "system/spi_mock.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype MockSpiAccess struct {\n\tunderlyingSpiAccess spiAccesser\n\tCreateError         bool\n\tbusNum              int\n\tchipNum             int\n\tmode                int\n\tbits                int\n\tmaxSpeed            int64\n\tsysdev              *spiMock\n}\n\nfunc newMockSpiAccess(underlyingSpiAccess spiAccesser) *MockSpiAccess {\n\treturn &MockSpiAccess{underlyingSpiAccess: underlyingSpiAccess}\n}\n\nfunc (spi *MockSpiAccess) createDevice(\n\tbusNum, chipNum, mode, bits int,\n\tmaxSpeed int64,\n) (gobot.SpiSystemDevicer, error) {\n\tspi.busNum = busNum\n\tspi.chipNum = chipNum\n\tspi.mode = mode\n\tspi.bits = bits\n\tspi.maxSpeed = maxSpeed\n\tspi.sysdev = newSpiMock(busNum, chipNum, mode, bits, maxSpeed)\n\tvar err error\n\tif spi.CreateError {\n\t\terr = fmt.Errorf(\"error while create SPI connection in mock\")\n\t}\n\treturn spi.sysdev, err\n}\n\nfunc (spi *MockSpiAccess) isType(accesserType spiBusAccesserType) bool {\n\treturn spi.underlyingSpiAccess.isType(accesserType)\n}\n\nfunc (*MockSpiAccess) isSupported() bool {\n\treturn true\n}\n\n// SetReadError can be used to simulate a read error.\nfunc (spi *MockSpiAccess) SetReadError(val bool) {\n\tspi.sysdev.simReadErr = val\n}\n\n// SetWriteError can be used to simulate a write error.\nfunc (spi *MockSpiAccess) SetWriteError(val bool) {\n\tspi.sysdev.simWriteErr = val\n}\n\n// SetCloseError can be used to simulate a error on Close().\nfunc (spi *MockSpiAccess) SetCloseError(val bool) {\n\tspi.sysdev.simCloseErr = val\n}\n\n// SetSimRead is used to set the byte stream for next read.\nfunc (spi *MockSpiAccess) SetSimRead(data []byte) {\n\tspi.sysdev.simRead = make([]byte, len(data))\n\tcopy(spi.sysdev.simRead, data)\n}\n\n// Written returns the byte stream which was last written.\nfunc (spi *MockSpiAccess) Written() []byte {\n\treturn spi.sysdev.written\n}\n\n// Reset resets the last written values.\nfunc (spi *MockSpiAccess) Reset() {\n\tspi.sysdev.written = []byte{}\n}\n\n// spiMock is the a mock implementation, used in tests\ntype spiMock struct {\n\tid          string\n\tsimReadErr  bool\n\tsimWriteErr bool\n\tsimCloseErr bool\n\twritten     []byte\n\tsimRead     []byte\n}\n\n// newSpiMock creates and returns a new connection to a specific\n// spi device on a bus/chip using the periph.io interface.\nfunc newSpiMock(busNum, chipNum, mode, bits int, maxSpeed int64) *spiMock {\n\treturn &spiMock{id: fmt.Sprintf(\"bu:%d, c:%d, m:%d, bi:%d, s:%d\", busNum, chipNum, mode, bits, maxSpeed)}\n}\n\n// Close the SPI connection to the device. Implements gobot.SpiSystemDevicer.\nfunc (c *spiMock) Close() error {\n\tif c.simCloseErr {\n\t\treturn fmt.Errorf(\"error while SPI close in mock\")\n\t}\n\treturn nil\n}\n\n// TxRx uses the SPI device TX to send/receive data. gobot.SpiSystemDevicer.\nfunc (c *spiMock) TxRx(tx []byte, rx []byte) error {\n\tif c.simReadErr {\n\t\treturn fmt.Errorf(\"error while SPI read in mock\")\n\t}\n\tc.written = append(c.written, tx...)\n\t// the answer can be one cycle behind, this must be considered in test setup\n\tcopy(rx, c.simRead)\n\treturn nil\n}\n"
  },
  {
    "path": "system/spi_periphio.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\n\t\"periph.io/x/conn/v3/physic\"\n\txspi \"periph.io/x/conn/v3/spi\"\n\txsysfs \"periph.io/x/host/v3/sysfs\"\n)\n\n// spiPeriphIo is the implementation of the SPI interface using the periph.io sysfs implementation for Linux.\ntype spiPeriphIo struct {\n\tport xspi.PortCloser\n\tdev  xspi.Conn\n}\n\n// newSpiPeriphIo creates and returns a new connection to a specific SPI device on a bus/chip\n// using the periph.io interface.\nfunc newSpiPeriphIo(busNum, chipNum, mode, bits int, maxSpeed int64) (*spiPeriphIo, error) {\n\tp, err := xsysfs.NewSPI(busNum, chipNum)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc, err := p.Connect(physic.Frequency(maxSpeed)*physic.Hertz, xspi.Mode(mode), bits)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &spiPeriphIo{port: p, dev: c}, nil\n}\n\n// TxRx uses the SPI device TX to send/receive data. Implements gobot.SpiSystemDevicer.\nfunc (c *spiPeriphIo) TxRx(tx []byte, rx []byte) error {\n\tdataLen := len(rx)\n\tif err := c.dev.Tx(tx, rx); err != nil {\n\t\treturn err\n\t}\n\tif len(rx) != dataLen {\n\t\treturn fmt.Errorf(\"read length (%d) differ to expected (%d)\", len(rx), dataLen)\n\t}\n\treturn nil\n}\n\n// Close the SPI connection. Implements gobot.SpiSystemDevicer.\nfunc (c *spiPeriphIo) Close() error {\n\treturn c.port.Close()\n}\n"
  },
  {
    "path": "system/spiaccess.go",
    "content": "package system\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype periphioSpiAccess struct {\n\tfs filesystem\n}\n\ntype gpioSpiAccess struct {\n\tcfg spiGpioConfig\n}\n\nfunc (psa *periphioSpiAccess) isType(accesserType spiBusAccesserType) bool {\n\treturn accesserType == spiBusAccesserTypePeriphio\n}\n\nfunc (psa *periphioSpiAccess) isSupported() bool {\n\tdevices, err := psa.fs.find(\"/dev\", \"spidev\")\n\tif err != nil || len(devices) == 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (*periphioSpiAccess) createDevice(\n\tbusNum, chipNum, mode, bits int,\n\tmaxSpeed int64,\n) (gobot.SpiSystemDevicer, error) {\n\treturn newSpiPeriphIo(busNum, chipNum, mode, bits, maxSpeed)\n}\n\nfunc (gsa *gpioSpiAccess) isType(accesserType spiBusAccesserType) bool {\n\treturn accesserType == spiBusAccesserTypeGPIO\n}\n\nfunc (gsa *gpioSpiAccess) isSupported() bool {\n\treturn true\n}\n\nfunc (gsa *gpioSpiAccess) createDevice(\n\tbusNum, chipNum, mode, bits int,\n\tmaxSpeed int64,\n) (gobot.SpiSystemDevicer, error) {\n\treturn newSpiGpio(gsa.cfg, maxSpeed)\n}\n"
  },
  {
    "path": "system/spiaccess_test.go",
    "content": "package system\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestGpioSpi_isType(t *testing.T) {\n\t// arrange\n\tgsa := gpioSpiAccess{}\n\t// act & assert GPIO\n\tassert.True(t, gsa.isType(spiBusAccesserTypeGPIO))\n\t// act & assert Periphio\n\tassert.False(t, gsa.isType(spiBusAccesserTypePeriphio))\n}\n\nfunc TestPeriphioSpi_isType(t *testing.T) {\n\t// arrange\n\tpsa := periphioSpiAccess{}\n\t// act & assert Periphio\n\tassert.True(t, psa.isType(spiBusAccesserTypePeriphio))\n\t// act & assert GPIO\n\tassert.False(t, psa.isType(spiBusAccesserTypeGPIO))\n}\n\nfunc TestGpioSpi_isSupported(t *testing.T) {\n\t// arrange\n\tgsa := gpioSpiAccess{}\n\t// act\n\tgot := gsa.isSupported()\n\t// assert\n\tassert.True(t, got)\n}\n\nfunc TestPeriphioSpi_isSupported(t *testing.T) {\n\ttests := map[string]struct {\n\t\tmockPaths []string\n\t\twant      bool\n\t}{\n\t\t\"supported\": {\n\t\t\tmockPaths: []string{\"/dev/spidev0.0\", \"/dev/spidev1.0\"},\n\t\t\twant:      true,\n\t\t},\n\t\t\"not_supported\": {\n\t\t\tmockPaths: []string{\"/sys/class/gpio/\"},\n\t\t\twant:      false,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\tfs := newMockFilesystem(tc.mockPaths)\n\t\t\tpsa := periphioSpiAccess{fs: fs}\n\t\t\t// act\n\t\t\tgot := psa.isSupported()\n\t\t\t// assert\n\t\t\tassert.Equal(t, tc.want, got)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "system/syscall.go",
    "content": "package system\n\nimport (\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\n// SyscallErrno wraps the \"unix.Errno\"\ntype SyscallErrno unix.Errno\n\n// wrapping for used constants of unix package\nconst (\n\tSyscall_SYS_IOCTL = unix.SYS_IOCTL\n\tSyscall_EINVAL    = unix.EINVAL\n\tSyscall_EBUSY     = unix.EBUSY\n\tSyscall_EFAULT    = unix.EFAULT\n)\n\n// nativeSyscall represents the native Syscall\ntype nativeSyscall struct{}\n\n// Syscall calls the native unix.Syscall, implements the SystemCaller interface\n// Note: It would be possible to transfer the address as an unsafe.Pointer to e.g. a byte, uint16 or integer variable.\n// The unpack process here would be as follows:\n// * convert the payload back to the pointer: addrPtr := (*byte)(payload)\n// * call with the content converted to uintptr: r1, r2, errNo = unix.Syscall(trap, f.Fd(), signal, uintptr(*addrPtr))\n// This has the main disadvantage, that if someone change the type of the address at caller side, the compiler will not\n// detect this problem and this unpack procedure would cause unpredictable results.\n// So the decision was taken to give the address here as a separate parameter, although it is not used in every call.\n// Note also, that the size of the address variable at Kernel side is u16, therefore uint16 is used here.\n//\n//nolint:nonamedreturns // useful here\nfunc (sys *nativeSyscall) syscall(\n\ttrap uintptr,\n\tf File,\n\tsignal uintptr,\n\tpayload unsafe.Pointer,\n\taddress uint16,\n) (r1, r2 uintptr, err SyscallErrno) {\n\tvar errNo unix.Errno\n\tif signal == I2C_TARGET {\n\t\t// this is the setup for the address, it just needs to be converted to an uintptr,\n\t\t// the given payload is not used in this case, see the comment on the function\n\t\tr1, r2, errNo = unix.Syscall(trap, f.Fd(), signal, uintptr(address))\n\t} else {\n\t\tr1, r2, errNo = unix.Syscall(trap, f.Fd(), signal, uintptr(payload))\n\t}\n\n\treturn r1, r2, SyscallErrno(errNo)\n}\n\n// Error implements the error interface. It wraps the \"unix.Errno.Error()\".\nfunc (e SyscallErrno) Error() string {\n\treturn unix.Errno(e).Error()\n}\n"
  },
  {
    "path": "system/syscall_mock.go",
    "content": "package system\n\nimport (\n\t\"unsafe\"\n)\n\n// mockSyscall represents the mock Syscall used for unit tests\ntype mockSyscall struct {\n\tlastTrap   uintptr\n\tlastFile   File\n\tlastSignal uintptr\n\tdevAddress uintptr\n\tsmbus      *i2cSmbusIoctlData\n\tsliceSize  uint8\n\tdataSlice  []byte\n\tImpl       func(trap, a1, a2 uintptr, a3 unsafe.Pointer) (r1, r2 uintptr, err SyscallErrno)\n}\n\n// Syscall calls the user defined implementation, used for tests, implements the SystemCaller interface\n//\n//nolint:nonamedreturns // useful here\nfunc (sys *mockSyscall) syscall(\n\ttrap uintptr,\n\tf File,\n\tsignal uintptr,\n\tpayload unsafe.Pointer,\n\taddress uint16,\n) (r1, r2 uintptr, err SyscallErrno) {\n\tsys.lastTrap = trap     // points to the used syscall (e.g. \"SYS_IOCTL\")\n\tsys.lastFile = f        // a character device file (e.g. file to path \"/dev/i2c-1\")\n\tsys.lastSignal = signal // points to used function type (e.g. I2C_SMBUS, I2C_RDWR)\n\n\tif signal == I2C_TARGET {\n\t\t// this is the setup for the address, it needs to be converted to an uintptr,\n\t\t// the given payload is not used in this case, see the comment on the function used for production\n\t\tsys.devAddress = uintptr(address)\n\t}\n\n\tif signal == I2C_SMBUS {\n\t\t// set the I2C smbus data object reference to payload and fill with some data\n\t\tsys.smbus = (*i2cSmbusIoctlData)(payload)\n\t\tif sys.smbus.data != nil {\n\t\t\tsys.sliceSize = sys.retrieveSliceSize()\n\n\t\t\tif sys.smbus.readWrite == I2C_SMBUS_WRITE {\n\t\t\t\t// get the data object payload as byte slice\n\t\t\t\tsys.dataSlice = unsafe.Slice((*byte)(sys.smbus.data), sys.sliceSize)\n\t\t\t}\n\n\t\t\tif sys.smbus.readWrite == I2C_SMBUS_READ {\n\t\t\t\t// fill data object with data from given slice to simulate reading\n\t\t\t\tif sys.dataSlice != nil {\n\t\t\t\t\tslc := unsafe.Slice((*byte)(sys.smbus.data), sys.sliceSize)\n\t\t\t\t\tif sys.smbus.protocol == I2C_SMBUS_BLOCK_DATA || sys.smbus.protocol == I2C_SMBUS_I2C_BLOCK_DATA {\n\t\t\t\t\t\tcopy(slc[1:], sys.dataSlice)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcopy(slc, sys.dataSlice)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// call mock implementation\n\tif sys.Impl != nil {\n\t\treturn sys.Impl(trap, f.Fd(), signal, payload)\n\t}\n\treturn 0, 0, 0\n}\n\nfunc (sys *mockSyscall) retrieveSliceSize() uint8 {\n\tswitch sys.smbus.protocol {\n\tcase I2C_SMBUS_BYTE:\n\t\treturn 1\n\tcase I2C_SMBUS_BYTE_DATA:\n\t\treturn 1\n\tcase I2C_SMBUS_WORD_DATA:\n\t\treturn 2\n\tdefault:\n\t\t// for I2C_SMBUS_BLOCK_DATA, I2C_SMBUS_I2C_BLOCK_DATA\n\t\treturn *(*byte)(sys.smbus.data) + 1 // first data element contains data size\n\t}\n}\n"
  },
  {
    "path": "system/sysfsfileaccess.go",
    "content": "package system\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n)\n\ntype sysfsFileAccess struct {\n\tfs         filesystem\n\treadBufLen uint16\n}\n\n// Linux sysfs / GPIO specific sysfs docs.\n//\n//\thttps://www.kernel.org/doc/Documentation/filesystems/sysfs.txt\n//\thttps://www.kernel.org/doc/Documentation/gpio/sysfs.txt\n//\thttps://www.kernel.org/doc/Documentation/thermal/sysfs-api.txt\n//\tsee also PWM.md\ntype sysfsFile struct {\n\tsfa       sysfsFileAccess\n\tfile      File\n\tsysfsPath string\n}\n\nfunc (sfa sysfsFileAccess) readInteger(path string) (int, error) {\n\tsf, err := sfa.openRead(path)\n\tdefer func() { _ = sf.close() }()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn sf.readInteger()\n}\n\nfunc (sfa sysfsFileAccess) read(path string) ([]byte, error) {\n\tsf, err := sfa.openRead(path)\n\tdefer func() { _ = sf.close() }()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn sf.read()\n}\n\nfunc (sfa sysfsFileAccess) writeInteger(path string, val int) error {\n\tsf, err := sfa.openWrite(path)\n\tdefer func() { _ = sf.close() }()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn sf.writeInteger(val)\n}\n\nfunc (sfa sysfsFileAccess) write(path string, data []byte) error {\n\tsf, err := sfa.openWrite(path)\n\tdefer func() { _ = sf.close() }()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn sf.write(data)\n}\n\nfunc (sfa sysfsFileAccess) openRead(path string) (*sysfsFile, error) {\n\tf, err := sfa.fs.openFile(path, os.O_RDONLY, 0o644)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &sysfsFile{sfa: sfa, file: f, sysfsPath: path}, nil\n}\n\nfunc (sfa sysfsFileAccess) openWrite(path string) (*sysfsFile, error) {\n\tf, err := sfa.fs.openFile(path, os.O_WRONLY, 0o644)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &sysfsFile{sfa: sfa, file: f, sysfsPath: path}, nil\n}\n\nfunc (sfa sysfsFileAccess) openReadWrite(path string) (*sysfsFile, error) {\n\tf, err := sfa.fs.openFile(path, os.O_RDWR, 0o644)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &sysfsFile{sfa: sfa, file: f, sysfsPath: path}, nil\n}\n\nfunc (sf *sysfsFile) close() error {\n\tif sf == nil || sf.file == nil {\n\t\treturn nil\n\t}\n\treturn sf.file.Close()\n}\n\nfunc (sf *sysfsFile) readInteger() (int, error) {\n\tbuf, err := sf.read()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif len(buf) == 0 {\n\t\treturn 0, nil\n\t}\n\n\treturn strconv.Atoi(strings.Split(string(buf), \"\\n\")[0])\n}\n\nfunc (sf *sysfsFile) read() ([]byte, error) {\n\t// sysfs docs say:\n\t// > If userspace seeks back to zero or does a pread(2) with an offset of '0' the [..] method will\n\t// > be called again, rearmed, to fill the buffer.\n\t// > The buffer will always be PAGE_SIZE bytes in length. On i386, this is 4096.\n\n\t// TODO: Examine if seek is needed if full buffer is read from sysfs file.\n\n\tbuf := make([]byte, sf.sfa.readBufLen)\n\tif _, err := sf.file.Seek(0, io.SeekStart); err != nil {\n\t\treturn nil, err\n\t}\n\n\ti, err := sf.file.Read(buf)\n\tif i == 0 {\n\t\treturn []byte{}, err\n\t}\n\n\treturn buf[:i], err\n}\n\nfunc (sf *sysfsFile) writeInteger(val int) error {\n\treturn sf.write([]byte(strconv.Itoa(val)))\n}\n\nfunc (sf *sysfsFile) write(data []byte) error {\n\t// sysfs docs say:\n\t// > When writing sysfs files, userspace processes should first read the\n\t// > entire file, modify the values it wishes to change, then write the\n\t// > entire buffer back.\n\t// however, this seems outdated/inaccurate (docs are from back in the Kernel BitKeeper days).\n\n\t// Write() returns already a non-nil error when n != len(b).\n\t_, err := sf.file.Write(data)\n\treturn err\n}\n"
  },
  {
    "path": "system/system.go",
    "content": "package system\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"unsafe\"\n\n\t\"gobot.io/x/gobot/v2\"\n)\n\ntype digitalPinAccesserType int\n\nconst (\n\tdigitalPinAccesserTypeCdev digitalPinAccesserType = iota\n\tdigitalPinAccesserTypeSysfs\n)\n\ntype spiBusAccesserType int\n\nconst (\n\tspiBusAccesserTypePeriphio spiBusAccesserType = iota\n\tspiBusAccesserTypeGPIO\n)\n\n// A File represents basic IO interactions with the underlying file system\ntype File interface {\n\tWrite(b []byte) (n int, err error)\n\tWriteString(s string) (ret int, err error)\n\tSync() error\n\tRead(b []byte) (n int, err error)\n\tReadAt(b []byte, off int64) (n int, err error)\n\tSeek(offset int64, whence int) (ret int64, err error)\n\tFd() uintptr\n\tClose() error\n}\n\n// filesystem is a unexposed interface to allow the switch between the native file system or a mocked implementation\ntype filesystem interface {\n\topenFile(name string, flag int, perm os.FileMode) (file File, err error)\n\tstat(name string) (os.FileInfo, error)\n\tfind(baseDir string, pattern string) (dirs []string, err error)\n\treadFile(name string) (content []byte, err error)\n}\n\n// systemCaller represents unexposed Syscall interface to allow the switch between native and mocked implementation\n// Prevent unsafe call, since go 1.15, see \"Pattern 4\" in: https://go101.org/article/unsafe.html\n// For go vet false positives, see: https://github.com/golang/go/issues/41205\ntype systemCaller interface {\n\tsyscall(\n\t\ttrap uintptr,\n\t\tf File,\n\t\tsignal uintptr,\n\t\tpayload unsafe.Pointer,\n\t\taddress uint16,\n\t) (r1, r2 uintptr, err SyscallErrno)\n}\n\n// digitalPinAccesser represents unexposed interface to allow the switch between different implementations and\n// a mocked one\ntype digitalPinAccesser interface {\n\tisType(accesserType digitalPinAccesserType) bool\n\tisSupported() bool\n\tcreatePin(chip string, pin int, o ...func(gobot.DigitalPinOptioner) bool) gobot.DigitalPinner\n\tsetFs(fs filesystem)\n}\n\n// spiAccesser represents unexposed interface to allow the switch between different implementations and a mocked one\ntype spiAccesser interface {\n\tisType(accesserType spiBusAccesserType) bool\n\tisSupported() bool\n\tcreateDevice(busNum, chipNum, mode, bits int, maxSpeed int64) (gobot.SpiSystemDevicer, error)\n}\n\ntype accesserConfiguration struct {\n\tdebug           bool\n\tdebugSpi        bool\n\tdebugDigitalPin bool\n\tuseGpioSysfs    *bool\n\tspiGpioConfig   *spiGpioConfig\n}\n\n// Accesser provides access to system calls, filesystem, implementation for digital pin and SPI\ntype Accesser struct {\n\taccesserCfg      *accesserConfiguration\n\tsys              systemCaller\n\tfs               filesystem\n\tdigitalPinAccess digitalPinAccesser\n\tspiAccess        spiAccesser\n}\n\n// NewAccesser returns a accesser to native system call, native file system and the chosen digital pin access.\n// Digital pin accesser can be empty or \"sysfs\", otherwise it will be automatically chosen.\nfunc NewAccesser(options ...AccesserOptionApplier) *Accesser {\n\ta := &Accesser{\n\t\taccesserCfg: &accesserConfiguration{},\n\t}\n\n\tfor _, o := range options {\n\t\tif o == nil {\n\t\t\tcontinue\n\t\t}\n\t\to.apply(a.accesserCfg)\n\t}\n\treturn a\n}\n\n// AddAnalogSupport adds the support to access the analog features of the system, usually by sysfs.\nfunc (a *Accesser) AddAnalogSupport() {\n\tif a.fs == nil {\n\t\ta.fs = &nativeFilesystem{} // for sysfs access\n\t}\n}\n\n// AddPWMSupport adds the support to access the PWM features of the system, usually by sysfs.\nfunc (a *Accesser) AddPWMSupport() {\n\tif a.fs == nil {\n\t\ta.fs = &nativeFilesystem{} // for sysfs access\n\t}\n}\n\n// AddDigitalPinSupport adds the support to access the GPIO features of the system. Usually by character device or\n// sysfs Kernel API. Related options can be applied here.\nfunc (a *Accesser) AddDigitalPinSupport(options ...AccesserOptionApplier) {\n\tfor _, o := range options {\n\t\tif o == nil {\n\t\t\tcontinue\n\t\t}\n\t\to.apply(a.accesserCfg)\n\t}\n\n\tif a.fs == nil {\n\t\ta.fs = &nativeFilesystem{} // for sysfs access or check for /dev/gpiochip* in cdev\n\t}\n\n\tif a.accesserCfg.useGpioSysfs == nil || !*a.accesserCfg.useGpioSysfs {\n\t\tdpa := &cdevDigitalPinAccess{fs: a.fs}\n\n\t\tif dpa.isSupported() || a.accesserCfg.useGpioSysfs == nil {\n\t\t\ta.digitalPinAccess = dpa\n\n\t\t\tif a.accesserCfg.debug || a.accesserCfg.debugDigitalPin {\n\t\t\t\tfmt.Printf(\"use cdev driver for digital pins with this chips: %v\\n\", dpa.chips)\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tif a.accesserCfg.debug || a.accesserCfg.debugDigitalPin {\n\t\t\tfmt.Println(\"cdev driver not supported, fallback to sysfs driver\")\n\t\t}\n\t}\n\n\t// currently sysfs is supported by all Kernels\n\tdpa := &sysfsDigitalPinAccess{sfa: &sysfsFileAccess{fs: a.fs, readBufLen: 2}}\n\ta.digitalPinAccess = dpa\n\tif a.accesserCfg.debug || a.accesserCfg.debugDigitalPin {\n\t\tfmt.Println(\"use sysfs driver for digital pins\")\n\t}\n}\n\n// HasDigitalPinSysfsAccess returns whether the used digital pin accesser is a sysfs one.\n// If no digital pin accesser is defined, returns false.\nfunc (a *Accesser) HasDigitalPinSysfsAccess() bool {\n\treturn a.digitalPinAccess != nil && a.digitalPinAccess.isType(digitalPinAccesserTypeSysfs)\n}\n\n// HasDigitalPinCdevAccess returns whether the used digital pin accesser is a sysfs one.\n// If no digital pin accesser is defined, returns false.\nfunc (a *Accesser) HasDigitalPinCdevAccess() bool {\n\treturn a.digitalPinAccess != nil && a.digitalPinAccess.isType(digitalPinAccesserTypeCdev)\n}\n\n// AddI2CSupport adds the support to access the I2C features of the system, usually by syscall with character device.\nfunc (a *Accesser) AddI2CSupport() {\n\tif a.fs == nil {\n\t\ta.fs = &nativeFilesystem{} // for access to the i2c character device, e.g. /dev/i2c-2\n\t}\n\n\ta.sys = &nativeSyscall{}\n}\n\n// AddSPISupport adds the support to access the SPI features of the system, usually by character device or GPIOs.\n// Related options can be applied here.\nfunc (a *Accesser) AddSPISupport(options ...AccesserOptionApplier) {\n\tfor _, o := range options {\n\t\tif o == nil {\n\t\t\tcontinue\n\t\t}\n\t\to.apply(a.accesserCfg)\n\t}\n\n\tif a.fs == nil {\n\t\ta.fs = &nativeFilesystem{} // to check for \"/dev/spidev*\" or access by GPIO (see AddDigitalPinSupport())\n\t}\n\n\tif a.accesserCfg.spiGpioConfig != nil {\n\t\t// currently GPIO SPI access is always supported\n\t\ta.accesserCfg.spiGpioConfig.debug = a.accesserCfg.debugSpi\n\t\ta.spiAccess = &gpioSpiAccess{cfg: *a.accesserCfg.spiGpioConfig}\n\n\t\tif a.accesserCfg.debug || a.accesserCfg.debugSpi {\n\t\t\tfmt.Printf(\"use gpio driver for SPI with this config: %s\\n\", a.accesserCfg.spiGpioConfig.String())\n\t\t}\n\n\t\treturn\n\t}\n\n\tgsa := &periphioSpiAccess{fs: a.fs}\n\tif !gsa.isSupported() {\n\t\tif a.accesserCfg.debug || a.accesserCfg.debugSpi {\n\t\t\tfmt.Println(\"periphio driver not supported for SPI, please activate SPI or try to use GPIOs\")\n\t\t}\n\t\treturn\n\t}\n\n\ta.spiAccess = gsa\n\tif a.accesserCfg.debug || a.accesserCfg.debugSpi {\n\t\tfmt.Println(\"use periphio driver for SPI\")\n\t}\n}\n\n// HasSpiPeriphioAccess returns whether the used SPI accesser is periphio based.\n// If SPI accesser is defined, returns false.\nfunc (a *Accesser) HasSpiPeriphioAccess() bool {\n\treturn a.spiAccess != nil && a.spiAccess.isType(spiBusAccesserTypePeriphio)\n}\n\n// HasSpiGpioAccess returns whether the used SPI accesser is GPIO based.\n// If SPI accesser is defined, returns false.\nfunc (a *Accesser) HasSpiGpioAccess() bool {\n\treturn a.spiAccess != nil && a.spiAccess.isType(spiBusAccesserTypeGPIO)\n}\n\n// AddOneWireSupport adds the support to access the one wire features of the system, usually by sysfs.\nfunc (a *Accesser) AddOneWireSupport() {\n\tif a.fs == nil {\n\t\ta.fs = &nativeFilesystem{} // for sysfs access\n\t}\n}\n\n// UseMockDigitalPinAccess sets the digital pin handler accesser to the chosen one. Used only for tests.\nfunc (a *Accesser) UseMockDigitalPinAccess() *mockDigitalPinAccess {\n\tdpa := newMockDigitalPinAccess(a.digitalPinAccess)\n\ta.digitalPinAccess = dpa\n\treturn dpa\n}\n\n// UseMockSyscall sets the Syscall implementation of the accesser to the mocked one. Used only for tests.\nfunc (a *Accesser) UseMockSyscall() *mockSyscall {\n\tmsc := &mockSyscall{}\n\ta.sys = msc\n\treturn msc\n}\n\n// UseMockFilesystem sets the filesystem implementation of the accesser to the mocked one. Used only for tests.\nfunc (a *Accesser) UseMockFilesystem(files []string) *MockFilesystem {\n\tfs := newMockFilesystem(files)\n\ta.fs = fs\n\tif a.digitalPinAccess != nil {\n\t\ta.digitalPinAccess.setFs(fs)\n\t}\n\n\treturn fs\n}\n\n// UseMockSpi sets the SPI implementation of the accesser to the mocked one. Used only for tests.\nfunc (a *Accesser) UseMockSpi() *MockSpiAccess {\n\tmsc := newMockSpiAccess(a.spiAccess)\n\ta.spiAccess = msc\n\treturn msc\n}\n\n// NewDigitalPin returns a new system digital pin, according to the given pin number.\nfunc (a *Accesser) NewDigitalPin(chip string, pin int,\n\toptions ...func(gobot.DigitalPinOptioner) bool,\n) gobot.DigitalPinner {\n\treturn a.digitalPinAccess.createPin(chip, pin, options...)\n}\n\n// NewPWMPin returns a new system PWM pin, according to the given pin number.\nfunc (a *Accesser) NewPWMPin(path string, pin int, polNormIdent string, polInvIdent string) gobot.PWMPinner {\n\tsfa := &sysfsFileAccess{fs: a.fs, readBufLen: 200}\n\treturn newPWMPinSysfs(sfa, path, pin, polNormIdent, polInvIdent)\n}\n\nfunc (a *Accesser) NewAnalogPin(path string, w bool, readBufLen uint16) gobot.AnalogPinner {\n\tr := readBufLen > 0\n\tif readBufLen == 0 {\n\t\treadBufLen = 32 // max. count of characters for int value is 20\n\t}\n\n\treturn newAnalogPinSysfs(&sysfsFileAccess{fs: a.fs, readBufLen: readBufLen}, path, r, w)\n}\n\n// NewSpiDevice returns a new connection to SPI with the given parameters.\nfunc (a *Accesser) NewSpiDevice(busNum, chipNum, mode, bits int, maxSpeed int64) (gobot.SpiSystemDevicer, error) {\n\treturn a.spiAccess.createDevice(busNum, chipNum, mode, bits, maxSpeed)\n}\n\n// NewOneWireDevice returns a new 1-wire device with the given parameters.\n// note: this is a basic implementation without using the possibilities of bus controller\n// it depends on automatic device search, see https://www.kernel.org/doc/Documentation/w1/w1.generic\nfunc (a *Accesser) NewOneWireDevice(familyCode byte, serialNumber uint64) (gobot.OneWireSystemDevicer, error) {\n\tsfa := &sysfsFileAccess{fs: a.fs, readBufLen: 200}\n\tdeviceID := fmt.Sprintf(\"%02x-%012x\", familyCode, serialNumber)\n\treturn newOneWireDeviceSysfs(sfa, deviceID), nil\n}\n\n// OpenFile opens file of given name from native or the mocked file system\nfunc (a *Accesser) OpenFile(name string, flag int, perm os.FileMode) (File, error) {\n\treturn a.fs.openFile(name, flag, perm)\n}\n\n// Stat returns a generic FileInfo, if the file with given name exists. It uses the native or the mocked file system.\nfunc (a *Accesser) Stat(name string) (os.FileInfo, error) {\n\treturn a.fs.stat(name)\n}\n\n// Find finds file from native or the mocked file system\nfunc (a *Accesser) Find(baseDir string, pattern string) ([]string, error) {\n\treturn a.fs.find(baseDir, pattern)\n}\n\n// ReadFile reads the named file and returns the contents. A successful call returns err == nil, not err == EOF.\n// Because ReadFile reads the whole file, it does not treat an EOF from Read as an error to be reported.\nfunc (a *Accesser) ReadFile(name string) ([]byte, error) {\n\treturn a.fs.readFile(name)\n}\n"
  },
  {
    "path": "system/system_test.go",
    "content": "package system\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestNewAccesser(t *testing.T) {\n\t// arrange & act\n\ta := NewAccesser()\n\t// assert\n\tassert.NotNil(t, a)\n\tassert.NotNil(t, a.accesserCfg)\n\tassert.Nil(t, a.sys)\n\tassert.Nil(t, a.fs)\n\tassert.Nil(t, a.digitalPinAccess)\n\tassert.Nil(t, a.spiAccess)\n}\n\nfunc TestAccesserAddAnalogSupport(t *testing.T) {\n\t// arrange\n\ta := NewAccesser()\n\t// act\n\ta.AddAnalogSupport()\n\t// assert\n\tassert.Nil(t, a.sys)\n\tassert.Nil(t, a.digitalPinAccess)\n\tassert.Nil(t, a.spiAccess)\n\trequire.NotNil(t, a.fs)\n\tassert.IsType(t, &nativeFilesystem{}, a.fs)\n}\n\nfunc TestAccesserAddPWMSupport(t *testing.T) {\n\t// arrange\n\ta := NewAccesser()\n\t// act\n\ta.AddPWMSupport()\n\t// assert\n\tassert.Nil(t, a.sys)\n\tassert.Nil(t, a.digitalPinAccess)\n\tassert.Nil(t, a.spiAccess)\n\trequire.NotNil(t, a.fs)\n\tassert.IsType(t, &nativeFilesystem{}, a.fs)\n}\n\nfunc TestAccesserAddDigitalPinSupport(t *testing.T) {\n\t// arrange\n\ta := NewAccesser()\n\t// act\n\ta.AddDigitalPinSupport()\n\t// assert\n\tassert.Nil(t, a.sys)\n\tassert.Nil(t, a.spiAccess)\n\trequire.NotNil(t, a.fs)\n\tassert.IsType(t, &nativeFilesystem{}, a.fs)\n\trequire.NotNil(t, a.digitalPinAccess)\n\tassert.IsType(t, &cdevDigitalPinAccess{}, a.digitalPinAccess)\n}\n\nfunc TestAccesserAddI2CSupport(t *testing.T) {\n\t// assert\n\ta := NewAccesser()\n\t// act\n\ta.AddI2CSupport()\n\t// assert\n\tassert.Nil(t, a.digitalPinAccess)\n\tassert.Nil(t, a.spiAccess)\n\trequire.NotNil(t, a.fs)\n\tassert.IsType(t, &nativeFilesystem{}, a.fs)\n\trequire.NotNil(t, a.sys)\n\tassert.IsType(t, &nativeSyscall{}, a.sys)\n}\n\nfunc TestAccesserAddSPISupport(t *testing.T) {\n\t// arrange\n\ta := NewAccesser()\n\t// act\n\ta.AddSPISupport() // this writes a message, but we need this test case to assert a.fs\n\t// assert\n\tassert.Nil(t, a.sys)\n\tassert.Nil(t, a.digitalPinAccess)\n\trequire.NotNil(t, a.fs)\n\tassert.IsType(t, &nativeFilesystem{}, a.fs)\n\t// arrange for periphio needed\n\ta.UseMockFilesystem([]string{\"/dev/spidev\"})\n\t// act for apply periphio\n\ta.AddSPISupport()\n\t// assert\n\trequire.NotNil(t, a.spiAccess)\n\tassert.IsType(t, &periphioSpiAccess{}, a.spiAccess)\n}\n\nfunc TestAccesserAddOneWireSupport(t *testing.T) {\n\t// arrange\n\ta := NewAccesser()\n\t// act\n\ta.AddOneWireSupport()\n\t// assert\n\tassert.Nil(t, a.sys)\n\tassert.Nil(t, a.digitalPinAccess)\n\tassert.Nil(t, a.spiAccess)\n\trequire.NotNil(t, a.fs)\n\tassert.IsType(t, &nativeFilesystem{}, a.fs)\n}\n\nfunc TestAccesserNewDigitalPin(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tchip = \"14\"\n\t\tline = 13\n\t)\n\ta := NewAccesser()\n\tdpa := a.UseMockDigitalPinAccess()\n\t// act\n\tdp := a.NewDigitalPin(chip, line)\n\t// assert\n\tassert.Len(t, dpa.pins, 1)\n\tassert.IsType(t, &digitalPinMock{}, dp)\n\tmyPin := dpa.pins[\"14_13\"]\n\tassert.Same(t, myPin, dp)\n\tassert.Equal(t, chip, myPin.chip)\n\tassert.Equal(t, line, myPin.pin)\n}\n\n//nolint:forcetypeassert // ok for this test\nfunc TestAccesserNewPWMPin(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tpath         = \"path\"\n\t\tpin          = 12\n\t\tpolNormIdent = \"norm\"\n\t\tpolInvIdent  = \"inv\"\n\t)\n\ta := NewAccesser()\n\t// act\n\tpp := a.NewPWMPin(path, pin, polNormIdent, polInvIdent)\n\t// assert\n\tassert.IsType(t, &pwmPinSysFs{}, pp)\n\tassert.Equal(t, path, pp.(*pwmPinSysFs).path)\n\tassert.Equal(t, strconv.Itoa(pin), pp.(*pwmPinSysFs).pin)\n\tassert.Equal(t, polNormIdent, pp.(*pwmPinSysFs).polarityNormalIdentifier)\n\tassert.Equal(t, polInvIdent, pp.(*pwmPinSysFs).polarityInvertedIdentifier)\n}\n\n//nolint:forcetypeassert // ok for this test\nfunc TestAccesserNewAnalogPin(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tpath       = \"path\"\n\t\tw          = true\n\t\treadBufLen = 123\n\t)\n\ta := NewAccesser()\n\t// act\n\tap := a.NewAnalogPin(path, w, readBufLen)\n\t// assert\n\tassert.IsType(t, &analogPinSysFs{}, ap)\n\tassert.Equal(t, path, ap.(*analogPinSysFs).sysfsPath)\n\tassert.True(t, ap.(*analogPinSysFs).r)\n\tassert.True(t, ap.(*analogPinSysFs).w)\n\tassert.IsType(t, &sysfsFileAccess{}, ap.(*analogPinSysFs).sfa)\n}\n\nfunc TestAccesserNewSpiDevice(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tbusNum   = 15\n\t\tchipNum  = 14\n\t\tmode     = 13\n\t\tbits     = 12\n\t\tmaxSpeed = int64(11)\n\t)\n\ta := NewAccesser()\n\tspi := a.UseMockSpi()\n\t// act\n\tcon, err := a.NewSpiDevice(busNum, chipNum, mode, bits, maxSpeed)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.NotNil(t, con)\n\tassert.Equal(t, busNum, spi.busNum)\n\tassert.Equal(t, chipNum, spi.chipNum)\n\tassert.Equal(t, mode, spi.mode)\n\tassert.Equal(t, bits, spi.bits)\n\tassert.Equal(t, maxSpeed, spi.maxSpeed)\n}\n\n//nolint:forcetypeassert // ok for this test\nfunc TestAccesserNewOneWireDevice(t *testing.T) {\n\t// arrange\n\tconst (\n\t\tfamilyCode   = 255\n\t\tserialNumber = 12345678987654321\n\t\twantID       = \"ff-2bdc546291f4b1\"\n\t)\n\ta := NewAccesser()\n\t// act\n\tcon, err := a.NewOneWireDevice(familyCode, serialNumber)\n\t// assert\n\trequire.NoError(t, err)\n\tassert.IsType(t, &onewireDeviceSysfs{}, con)\n\tassert.Equal(t, wantID, con.(*onewireDeviceSysfs).id)\n\tassert.Equal(t, \"/sys/bus/w1/devices/\"+wantID, con.(*onewireDeviceSysfs).sysfsPath)\n\tassert.IsType(t, &sysfsFileAccess{}, con.(*onewireDeviceSysfs).sfa)\n}\n"
  },
  {
    "path": "system/systemoptions.go",
    "content": "package system\n\nimport (\n\t\"gobot.io/x/gobot/v2\"\n)\n\n// accesserOptionApplier is the interface for system options. This provides the possibility for change the systems\n// behavior by the caller/user when creating the system access, e.g. by \"NewAccesser().Add..\".\n// The interface needs to be implemented by each configurable option type.\ntype AccesserOptionApplier interface {\n\tapply(cfg *accesserConfiguration)\n}\n\ntype systemAccesserDebugOption bool\n\ntype systemDigitalPinDebugOption bool\n\ntype systemSpiDebugOption bool\n\ntype systemUseDigitalPinSysfsOption bool\n\ntype systemUseSpiGpioOption spiGpioConfig\n\n// WithSystemAccesserDebug can be used to switch on debug messages.\nfunc WithSystemAccesserDebug() systemAccesserDebugOption {\n\treturn systemAccesserDebugOption(true)\n}\n\n// WithDigitalPinDebug can be used to switch on debug messages for digital pins.\nfunc WithDigitalPinDebug() systemDigitalPinDebugOption {\n\treturn systemDigitalPinDebugOption(true)\n}\n\n// WithSpiDebug can be used to switch on debug messages for SPI.\nfunc WithSpiDebug() systemSpiDebugOption {\n\treturn systemSpiDebugOption(true)\n}\n\n// WithDigitalPinSysfsAccess can be used to change the default character device implementation for digital pins to the\n// legacy sysfs Kernel ABI.\nfunc WithDigitalPinSysfsAccess() systemUseDigitalPinSysfsOption {\n\treturn systemUseDigitalPinSysfsOption(true)\n}\n\n// WithDigitalPinCdevAccess can be used to change the default sysfs implementation for digital pins in old platforms to\n// test the character device Kernel ABI. The access is provided by the go-gpiocdev package.\nfunc WithDigitalPinCdevAccess() systemUseDigitalPinSysfsOption {\n\treturn systemUseDigitalPinSysfsOption(false)\n}\n\n// WithSpiGpioAccess can be used to switch the default SPI implementation to GPIO usage.\nfunc WithSpiGpioAccess(p gobot.DigitalPinnerProvider, sclkPin, ncsPin, sdoPin, sdiPin string) systemUseSpiGpioOption {\n\to := systemUseSpiGpioOption{\n\t\tpinProvider: p,\n\t\tsclkPinID:   sclkPin,\n\t\tncsPinID:    ncsPin,\n\t\tsdoPinID:    sdoPin,\n\t\tsdiPinID:    sdiPin,\n\t}\n\n\treturn o\n}\n\nfunc (o systemAccesserDebugOption) String() string {\n\treturn \"switch on system accesser debugging option\"\n}\n\nfunc (o systemDigitalPinDebugOption) String() string {\n\treturn \"switch on system digital pin debugging option\"\n}\n\nfunc (o systemSpiDebugOption) String() string {\n\treturn \"switch on system SPI debugging option\"\n}\n\nfunc (o systemUseDigitalPinSysfsOption) String() string {\n\treturn \"system accesser use sysfs vs. cdev for digital pins option\"\n}\n\nfunc (o systemUseSpiGpioOption) String() string {\n\treturn \"system accesser use discrete GPIOs for SPI option\"\n}\n\nfunc (o systemAccesserDebugOption) apply(cfg *accesserConfiguration) {\n\tcfg.debug = bool(o)\n}\n\nfunc (o systemDigitalPinDebugOption) apply(cfg *accesserConfiguration) {\n\tcfg.debugDigitalPin = bool(o)\n}\n\nfunc (o systemSpiDebugOption) apply(cfg *accesserConfiguration) {\n\tcfg.debugSpi = bool(o)\n}\n\nfunc (o systemUseDigitalPinSysfsOption) apply(cfg *accesserConfiguration) {\n\tc := bool(o)\n\tcfg.useGpioSysfs = &c\n}\n\nfunc (o systemUseSpiGpioOption) apply(cfg *accesserConfiguration) {\n\tc := spiGpioConfig(o)\n\tcfg.spiGpioConfig = &c\n}\n"
  },
  {
    "path": "system/systemoptions_test.go",
    "content": "//nolint:forcetypeassert // ok here\npackage system\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestWithDigitalPinOptionAccess_HasDigitalPinCdevAccess_HasDigitalPinSysfsAccess(t *testing.T) {\n\t// note: default accesser already tested on tests with AddDigitalPinSupport()\n\ttests := map[string]struct {\n\t\tinitialAccesser digitalPinAccesser\n\t\toption          AccesserOptionApplier\n\t\twantCdev        bool\n\t}{\n\t\t\"with_cdev\": {\n\t\t\tinitialAccesser: &sysfsDigitalPinAccess{},\n\t\t\toption:          WithDigitalPinCdevAccess(),\n\t\t\twantCdev:        true,\n\t\t},\n\t\t\"with_sysfs\": {\n\t\t\tinitialAccesser: &cdevDigitalPinAccess{},\n\t\t\toption:          WithDigitalPinSysfsAccess(),\n\t\t\twantCdev:        false,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAccesser()\n\t\t\ta.digitalPinAccess = tc.initialAccesser\n\t\t\ta.AddDigitalPinSupport(tc.option)\n\t\t\t// act\n\t\t\tgotCdev := a.HasDigitalPinCdevAccess()\n\t\t\tgotSysfs := a.HasDigitalPinSysfsAccess()\n\t\t\t// assert\n\t\t\tif tc.wantCdev {\n\t\t\t\tassert.True(t, gotCdev)\n\t\t\t\tassert.False(t, gotSysfs)\n\t\t\t\tassert.IsType(t, &cdevDigitalPinAccess{}, a.digitalPinAccess)\n\t\t\t\tassert.IsType(t, &nativeFilesystem{}, a.digitalPinAccess.(*cdevDigitalPinAccess).fs)\n\t\t\t} else {\n\t\t\t\tassert.False(t, gotCdev)\n\t\t\t\tassert.True(t, gotSysfs)\n\t\t\t\tassert.IsType(t, &sysfsDigitalPinAccess{}, a.digitalPinAccess)\n\t\t\t\tassert.IsType(t, &nativeFilesystem{}, a.digitalPinAccess.(*sysfsDigitalPinAccess).sfa.fs)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestWithSpiOptionAccess_HasSpiPeriphioAccess_HasSpiGpioAccess(t *testing.T) {\n\t// note: default accesser already tested on tests with AddSPISupport()\n\ttests := map[string]struct {\n\t\tinitialAccesser spiAccesser\n\t\toption          AccesserOptionApplier\n\t\twantPeriphio    bool\n\t}{\n\t\t\"with_periphio\": {\n\t\t\tinitialAccesser: &gpioSpiAccess{},\n\t\t\twantPeriphio:    true,\n\t\t},\n\t\t\"withr_sysfs\": {\n\t\t\tinitialAccesser: &periphioSpiAccess{},\n\t\t\toption:          WithSpiGpioAccess(nil, \"2\", \"3\", \"4\", \"5\"),\n\t\t\twantPeriphio:    false,\n\t\t},\n\t}\n\tfor name, tc := range tests {\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\t// arrange\n\t\t\ta := NewAccesser()\n\t\t\ta.spiAccess = tc.initialAccesser\n\t\t\t// arrange for periphio needed\n\t\t\ta.UseMockFilesystem([]string{\"/dev/spidev\"})\n\t\t\ta.AddDigitalPinSupport()\n\t\t\ta.AddSPISupport(tc.option)\n\t\t\t// act\n\t\t\tgotPeriphio := a.HasSpiPeriphioAccess()\n\t\t\tgotGpio := a.HasSpiGpioAccess()\n\t\t\t// assert\n\t\t\trequire.NotNil(t, a.spiAccess)\n\t\t\tif tc.wantPeriphio {\n\t\t\t\tassert.True(t, gotPeriphio)\n\t\t\t\tassert.False(t, gotGpio)\n\t\t\t\tassert.IsType(t, &periphioSpiAccess{}, a.spiAccess)\n\t\t\t} else {\n\t\t\t\tassert.False(t, gotPeriphio)\n\t\t\t\tassert.True(t, gotGpio)\n\t\t\t\tassert.IsType(t, &gpioSpiAccess{}, a.spiAccess)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "utils.go",
    "content": "package gobot\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"time\"\n)\n\n// Every triggers f every t time.Duration until the end of days, or when a Stop()\n// is called on the Ticker that is returned by the Every function.\n// It does not wait for the previous execution of f to finish before\n// it fires the next f.\nfunc Every(t time.Duration, f func()) *time.Ticker {\n\tticker := time.NewTicker(t)\n\n\tgo func() {\n\t\tfor {\n\t\t\t<-ticker.C\n\t\t\tf()\n\t\t}\n\t}()\n\n\treturn ticker\n}\n\n// After triggers f after t duration.\nfunc After(t time.Duration, f func()) {\n\ttime.AfterFunc(t, f)\n}\n\n// Rand returns a positive random int up to maximum\nfunc Rand(maximum int) int {\n\ti, _ := rand.Int(rand.Reader, big.NewInt(int64(maximum)))\n\treturn int(i.Int64())\n}\n\n// FromScale returns a converted input from minimum, maximum to 0.0...1.0.\nfunc FromScale(input, minimum, maximum float64) float64 {\n\treturn (input - math.Min(minimum, maximum)) / (math.Max(minimum, maximum) - math.Min(minimum, maximum))\n}\n\n// ToScale returns a converted input from 0...1 to minimum...maximum scale.\n// If input is less than minimum then ToScale returns minimum.\n// If input is greater than maximum then ToScale returns maximum\nfunc ToScale(input, minimum, maximum float64) float64 {\n\ti := input*(math.Max(minimum, maximum)-math.Min(minimum, maximum)) + math.Min(minimum, maximum)\n\tswitch {\n\tcase i < math.Min(minimum, maximum):\n\t\treturn math.Min(minimum, maximum)\n\tcase i > math.Max(minimum, maximum):\n\t\treturn math.Max(minimum, maximum)\n\tdefault:\n\t\treturn i\n\t}\n}\n\n// Rescale performs a direct linear rescaling of a number from one scale to another.\nfunc Rescale(input, fromMin, fromMax, toMin, toMax float64) float64 {\n\treturn (input-fromMin)*(toMax-toMin)/(fromMax-fromMin) + toMin\n}\n\n// DefaultName returns a sensible random default name\n// for a robot, adaptor or driver\nfunc DefaultName(name string) string {\n\treturn fmt.Sprintf(\"%s-%X\", name, Rand(int(^uint(0)>>1)))\n}\n"
  },
  {
    "path": "utils_test.go",
    "content": "package gobot\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestEvery(t *testing.T) {\n\ti := 0\n\tbegin := time.Now()\n\tsem := make(chan time.Time, 1)\n\tEvery(2*time.Millisecond, func() {\n\t\ti++\n\t\tif i == 2 {\n\t\t\tsem <- time.Now()\n\t\t}\n\t})\n\t<-sem\n\tif time.Since(begin) < 4*time.Millisecond {\n\t\tt.Error(\"Test should have taken at least 4 milliseconds\")\n\t}\n}\n\nfunc TestEveryWhenStopped(t *testing.T) {\n\tsem := make(chan bool)\n\n\tdone := Every(100*time.Millisecond, func() {\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\t\tdone.Stop()\n\tcase <-time.After(190 * time.Millisecond):\n\t\tdone.Stop()\n\t\trequire.Fail(t, \"Every was not called\")\n\t}\n\n\tselect {\n\tcase <-time.After(190 * time.Millisecond):\n\tcase <-sem:\n\t\tt.Error(\"Every should have stopped\")\n\t}\n}\n\nfunc TestAfter(t *testing.T) {\n\ti := 0\n\tsem := make(chan bool)\n\n\tAfter(100*time.Millisecond, func() {\n\t\ti++\n\t\tsem <- true\n\t})\n\n\tselect {\n\tcase <-sem:\n\tcase <-time.After(190 * time.Millisecond):\n\t\trequire.Fail(t, \"After was not called\")\n\t}\n\n\tassert.Equal(t, 1, i)\n}\n\nfunc TestFromScale(t *testing.T) {\n\tassert.InDelta(t, 0.5, FromScale(5, 0, 10), 0.0)\n}\n\nfunc TestToScale(t *testing.T) {\n\tassert.InDelta(t, 10.0, ToScale(500, 0, 10), 0.0)\n\tassert.InDelta(t, 0.0, ToScale(-1, 0, 10), 0.0)\n\tassert.InDelta(t, 5.0, ToScale(0.5, 0, 10), 0.0)\n}\n\nfunc TestRescale(t *testing.T) {\n\tassert.InDelta(t, 5.0, Rescale(500, 0, 1000, 0, 10), 0.0)\n\tassert.InDelta(t, 490.0, Rescale(-1.0, -1, 0, 490, 350), 0.0)\n}\n\nfunc TestRand(t *testing.T) {\n\ta := Rand(10000)\n\tb := Rand(10000)\n\tif a == b {\n\t\trequire.NotEqual(t, a, b)\n\t}\n}\n\nfunc TestDefaultName(t *testing.T) {\n\tname := DefaultName(\"tester\")\n\tassert.Contains(t, name, \"tester\")\n}\n"
  }
]