[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: jgraph\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n\n### Preflight Checklist\n<!-- Please ensure you've completed the following steps by replacing [ ] with [x]-->\n\n* [ ] I agree to follow the [Code of Conduct](https://github.com/jgraph/drawio-desktop/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.\n* [ ] I have searched the issue tracker for a feature request that matches the one I want to file, without success.\n\nYou must agree to search and the code of conduct. You must fill in this entire template. If you delete part/all or miss parts out your issue will be closed.\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**draw.io version (In the Help->About menu of the draw.io editor):**\n\n- draw.io version x.y.z\n\n**Desktop (please complete the following information):**\n - OS: Windows, MacOS, Linux...\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\n\n---\n\n* [ ] I agree to follow the [Code of Conduct](https://github.com/jgraph/drawio-desktop/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.\n* [ ] I have searched the issue tracker for a feature request that matches the one I want to file, without success.\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n\n### Preflight Checklist\n<!-- Please ensure you've completed the following steps by replacing [ ] with [x]-->\n\n* [ ] I agree to follow the [Code of Conduct](https://github.com/jgraph/drawio/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.\n* [ ] I have searched the issue tracker for a feature request that matches the one I want to file, without success.\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**draw.io version (In the Help->About menu of the draw.io editor):**\n\n- draw.io version [e.g. 12.6.7]\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\n\n---\n\n* [ ] I agree to follow the [Code of Conduct](https://github.com/jgraph/drawio/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.\n* [ ] I have searched the issue tracker for a feature request that matches the one I want to file, without success.\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/electron-builder-win.yml",
    "content": "name: Electron Builder CI (WIN)\n\non:\n  push:\n    tags:\n      - 'v*'\n\njobs:\n  build:\n    runs-on: windows-latest\n    env:\n      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      GH_REF: ${{ github.ref }}\n    steps:\n    - name: Checkout reposistory\n      uses: actions/checkout@v4\n      with:\n        submodules: true\n    - name: Checkout drawio-dev\n      uses: actions/checkout@v4\n      with:\n        repository: jgraph/drawio-dev\n        token: ${{ secrets.GH_TOKEN }}\n        ref: release\n        path: drawio-dev\n        submodules: false\n    - name: Get drawio Tag & Submodules\n      run: |\n        cd drawio-dev\n        # Get the current build tag from draw.io\n        $tmp=$Env:GH_REF -replace '/v','/diagramly-' -replace '[.]','_'\n        $ref=$tmp+':'+$tmp\n        git fetch origin $ref --no-tags\n        $tmp=$tmp -replace 'refs/',''\n        git checkout $tmp -b tmp-deploy\n        Copy-Item -Path \"src\\main\\webapp\\js\\*.min.js\"  -Destination \"..\\drawio\\src\\main\\webapp\\js\\\"\n        cd ..\n        Remove-Item 'drawio-dev' -Recurse -Force\n        cd drawio\n        Remove-Item 'docs','etc','src\\main\\java','src\\main\\webapp\\connect','src\\main\\webapp\\service-worker*','src\\main\\webapp\\workbox-*' -Recurse -Force\n        cd src\\main\\webapp\\js\n        Remove-Item 'atlas-viewer.min.js','atlas.min.js','cryptojs','deflate','dropbox','embed*','freehand','integrate.min.js','jquery','jszip','mermaid','onedrive','orgchart','reader.min.js','rough','sanitizer','simplepeer','spin','viewer-static.min.js','viewer.min.js'  -Recurse -Force\n    - name: Installing Node\n      uses: actions/setup-node@v4\n      with:\n        node-version: 24\n    - name: Prepare for Windows Build\n      shell: powershell\n      run: |\n        git config --global url.\"https://github.com/\".insteadOf \"git@github.com:\"\n        npm ci\n    - name: Build for Windows (x32 & arm64)\n      env:\n        CSC_LINK: ${{ secrets.WIN_CSC_LINK }}\n        CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}\n      shell: powershell\n      run: |\n        #Disable auto-update and build 32bit/arm64 first such that latest.yml is for 64bit only (64bit will overwrite 32bit one)\n        npm run sync -- disableUpdate\n        npm run release-win32\n        npm run release-win-arm64\n    - name: Build for Windows (x64)\n      env:\n        CSC_LINK: ${{ secrets.WIN_CSC_LINK }}\n        CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}\n      shell: powershell\n      run: |\n        #Enable auto-update again\n        npm run sync\n        npm run release-win\n    - name: Build unpacked Windows x64 (for zip portable)\n      shell: powershell\n      run: |\n        npm run sync -- disableUpdate\n        npx electron-builder --win --x64 --dir\n\n    - name: Zip unpacked x64 build\n      shell: powershell\n      run: |\n        $version = \"${{ github.ref }}\" -replace 'refs/tags/v', ''\n        cd dist\n        7z a \"draw.io-$version-windows.zip\" \".\\win-unpacked\\*\"\n\n    - name: Build for Windows (APPX)\n      shell: powershell\n      run: |\n        #Disable auto-update for appx also\n        npm run sync -- disableUpdate\n        npm run release-appx\n\n    - name: Install GitHub CLI\n      shell: powershell\n      run: |\n        Invoke-WebRequest -Uri https://github.com/cli/cli/releases/download/v2.73.0/gh_2.73.0_windows_amd64.msi -OutFile ghcli.msi\n        Start-Process msiexec.exe -ArgumentList '/i', 'ghcli.msi', '/quiet', '/norestart' -Wait\n\n    - name: Upload portable zip to GitHub Release\n      shell: powershell\n      env:\n        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n        $version = \"${{ github.ref }}\" -replace 'refs/tags/v', ''\n        gh release upload \"v$version\" \"dist/draw.io-$version-windows.zip\" --clobber"
  },
  {
    "path": ".github/workflows/electron-builder.yml",
    "content": "name: Electron Builder CI\n\non:\n  push:\n    tags:\n      - 'v*'\n\njobs:\n  build:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest]\n    env:\n      CC: clang\n      CXX: clang++ \n      npm_config_clang: 1\n      APPLEID: ${{ secrets.APPLEID }}\n      APPLEIDPASS: ${{ secrets.APPLEIDPASS }}\n      APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}\n      CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}\n      CSC_LINK: ${{ secrets.CSC_LINK }}\n      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_TOKEN }}\n      OS_NAME: ${{ matrix.os }}\n      GH_REF: ${{ github.ref }}\n    steps:\n    - name: Checkout reposistory\n      uses: actions/checkout@v4\n      with:\n        submodules: true\n    - name: Checkout drawio-dev\n      uses: actions/checkout@v4\n      with:\n        repository: jgraph/drawio-dev\n        token: ${{ secrets.GH_TOKEN }}\n        ref: release\n        path: drawio-dev\n        submodules: false\n    - name: Get drawio Tag & Submodules\n      run: |\n        cd drawio-dev\n        # Get the current build tag from draw.io\n        export tmp1=${GH_REF/refs\\//}\n        export tmp2=${tmp1/\\/v/\\/diagramly-}\n        export tmp3=${tmp2//\\./_}\n        git fetch origin refs/$tmp3:refs/$tmp3 --no-tags\n        git checkout $tmp3 -b tmp-deploy\n        cp src/main/webapp/js/*.min.js ../drawio/src/main/webapp/js/\n        cd ..\n        rm -rf drawio-dev\n        cd drawio\n        rm -rf docs etc src/main/java src/main/webapp/connect src/main/webapp/service-worker* src/main/webapp/workbox-*\n        cd src/main/webapp/js\n        # Save viewer-static.min.js for macOS Quick Look extension before cleanup\n        if [ \"$OS_NAME\" = \"macos-latest\" ]; then cp viewer-static.min.js ../../../../../build/viewer-static.min.js; fi\n        rm -rf atlas-viewer.min.js atlas.min.js cryptojs deflate dropbox embed* freehand integrate.min.js jquery jszip mermaid onedrive orgchart reader.min.js rough sanitizer simplepeer spin viewer-static.min.js viewer.min.js\n    - name: Installing Node\n      uses: actions/setup-node@v4\n      with:\n        node-version: 24\n    - name: Build for ${{ matrix.os}}\n      run: |\n        if [ \"$OS_NAME\" = \"ubuntu-latest\" ]; then sudo apt-get update && sudo apt-get install -y icnsutils graphicsmagick xz-utils rpm; fi\n        git config --global url.\"https://github.com/\".insteadOf \"git@github.com:\"\n        npm ci\n        if [ \"$OS_NAME\" = \"ubuntu-latest\" ]; then sed -ie 's/\"asar\": true,/\"asar\": true,\\n\"productName\": \"drawio\",/' electron-builder-linux-mac.json; fi \n        npm run sync\n        npm run release-linux\n    - name: Build for Snap\n      if: ${{ matrix.os == 'ubuntu-latest' }}\n      run: |\n        #To generate SNAP_TOKEN run `snapcraft export-login [FILE]` and login with your snapcraft credentials. It is used now without login\n        sudo snap install snapcraft --classic\n        npm run release-snap\n        # Cannot configure electron-builder to publish to stable channel, so do it explicitly\n        snapcraft push --release edge dist/draw.io-amd64-*.snap"
  },
  {
    "path": ".github/workflows/hash-gen.yml",
    "content": "name: Generate sha256 hashes for release files\n\non:\n  release:\n    types: [published]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Generate Hashes\n      uses: MCJack123/ghaction-generate-release-hashes@v1\n      with:\n        hash-type: sha256\n        file-name: hashes.txt\n    - name: Upload Hashes to release\n      uses: svenstaro/upload-release-action@v2\n      with:\n        repo_token: ${{ secrets.GITHUB_TOKEN }}\n        file: hashes.txt\n        overwrite: true\n        asset_name: Files-SHA256-Hashes.txt\n        tag: ${{ github.ref }}\n\n"
  },
  {
    "path": ".github/workflows/prepare-release.yml",
    "content": "name: Prepare Release\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'Release version (e.g., 29.0.4)'\n        required: true\n        type: string\n      previous_version:\n        description: 'Previous version for changelog (e.g., 29.0.3). Leave empty to auto-detect.'\n        required: false\n        type: string\n      drawio_ref:\n        description: 'draw.io ref to use (tag, branch, or commit). Leave empty to use v{version}'\n        required: false\n        type: string\n      dry_run:\n        description: 'Dry run - validate only, do not commit'\n        required: false\n        type: boolean\n        default: false\n\nenv:\n  NODE_VERSION: '24'\n\njobs:\n  prepare-release:\n    runs-on: ubuntu-latest\n    \n    permissions:\n      contents: write\n      pull-requests: write\n      \n    steps:\n      - name: Validate version format\n        run: |\n          if ! [[ \"${{ inputs.version }}\" =~ ^[0-9]+\\.[0-9]+\\.[0-9]+$ ]]; then\n            echo \"::error::Version must be in format X.Y.Z (e.g., 29.0.4)\"\n            exit 1\n          fi\n          echo \"VERSION=${{ inputs.version }}\" >> $GITHUB_ENV\n          \n      - name: Checkout repository\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n          fetch-depth: 0\n          token: ${{ secrets.GITHUB_TOKEN }}\n          \n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n          check-latest: true\n          \n      - name: Log versions\n        run: |\n          echo \"Node version: $(node --version)\"\n          echo \"npm version: $(npm --version)\"\n          \n      - name: Determine drawio ref\n        run: |\n          if [ -n \"${{ inputs.drawio_ref }}\" ]; then\n            echo \"DRAWIO_REF=${{ inputs.drawio_ref }}\" >> $GITHUB_ENV\n          else\n            echo \"DRAWIO_REF=v${{ inputs.version }}\" >> $GITHUB_ENV\n          fi\n          \n      - name: Update drawio submodule\n        run: |\n          cd drawio\n          git fetch origin --tags\n          \n          # Check if ref exists\n          if ! git rev-parse --verify \"${{ env.DRAWIO_REF }}\" >/dev/null 2>&1; then\n            echo \"::error::Ref '${{ env.DRAWIO_REF }}' not found in drawio repository\"\n            exit 1\n          fi\n          \n          git checkout \"${{ env.DRAWIO_REF }}\"\n          \n          # Update any nested submodules in drawio\n          git submodule update --init --recursive\n          \n          echo \"DRAWIO_COMMIT=$(git rev-parse HEAD)\" >> $GITHUB_ENV\n          echo \"Updated drawio to: $(git describe --tags --always)\"\n          cd ..\n          \n      - name: Update package.json version\n        run: |\n          # Update version in package.json\n          jq '.version = \"${{ env.VERSION }}\"' package.json > package.json.tmp\n          mv package.json.tmp package.json\n          \n          echo \"Updated package.json to version ${{ env.VERSION }}\"\n          grep '\"version\"' package.json\n          \n      - name: Install dependencies\n        run: |\n          # Clean install from scratch to ensure package-lock.json has all resolved URLs and integrity hashes.\n          # Without this, entries carried over from a previous node_modules lack these fields,\n          # which breaks offline/sandboxed builds like Flatpak (see #2301).\n          rm -rf node_modules package-lock.json\n          npm install\n\n      - name: Generate release notes\n        run: |\n          VERSION=\"${{ env.VERSION }}\"\n          PREV_VERSION=\"${{ inputs.previous_version }}\"\n          \n          # Auto-detect previous version if not provided\n          if [ -z \"$PREV_VERSION\" ]; then\n            PREV_VERSION=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//' || echo \"\")\n          fi\n          \n          # Get electron version from package-lock.json (actual installed version)\n          ELECTRON_VERSION=$(jq -r '.packages[\"node_modules/electron\"].version' package-lock.json)\n          echo \"ELECTRON_VERSION=$ELECTRON_VERSION\" >> $GITHUB_ENV\n          \n          # Generate release notes\n          cat > release-notes.md << 'RELEASE_EOF'\n          ## Release Notes for VERSION_PLACEHOLDER\n          \n          [Windows Installer](https://github.com/jgraph/drawio-desktop/releases/download/vVERSION_PLACEHOLDER/draw.io-VERSION_PLACEHOLDER-windows-installer.exe)\n          [Windows No Installer (zip)](https://github.com/jgraph/drawio-desktop/releases/download/vVERSION_PLACEHOLDER/draw.io-VERSION_PLACEHOLDER-windows.zip)\n          [macOS - Universal](https://github.com/jgraph/drawio-desktop/releases/download/vVERSION_PLACEHOLDER/draw.io-universal-VERSION_PLACEHOLDER.dmg)\n          Linux - [deb](https://github.com/jgraph/drawio-desktop/releases/download/vVERSION_PLACEHOLDER/drawio-amd64-VERSION_PLACEHOLDER.deb), [AppImage](https://github.com/jgraph/drawio-desktop/releases/download/vVERSION_PLACEHOLDER/drawio-x86_64-VERSION_PLACEHOLDER.AppImage) or [rpm](https://github.com/jgraph/drawio-desktop/releases/download/vVERSION_PLACEHOLDER/drawio-x86_64-VERSION_PLACEHOLDER.rpm)\n          Windows intel x32 releases are marked -ia32-\n          \n          **ChangeLog:**\n          - Uses electron ELECTRON_PLACEHOLDER.\n          - Updates to [draw.io core VERSION_PLACEHOLDER](https://github.com/jgraph/drawio/blob/vVERSION_PLACEHOLDER/ChangeLog).PREV_PLACEHOLDER\n          RELEASE_EOF\n          \n          # Replace placeholders\n          sed -i \"s/VERSION_PLACEHOLDER/${VERSION}/g\" release-notes.md\n          sed -i \"s/ELECTRON_PLACEHOLDER/${ELECTRON_VERSION}/g\" release-notes.md\n          if [ -n \"$PREV_VERSION\" ]; then\n            sed -i \"s/PREV_PLACEHOLDER/ All changes from ${PREV_VERSION} to ${VERSION} are added in this build./g\" release-notes.md\n          else\n            sed -i \"s/PREV_PLACEHOLDER//g\" release-notes.md\n          fi\n          \n          echo \"## Generated Release Notes\" >> $GITHUB_STEP_SUMMARY\n          echo \"\" >> $GITHUB_STEP_SUMMARY\n          cat release-notes.md >> $GITHUB_STEP_SUMMARY\n          \n          echo \"Release notes generated with Electron version: $ELECTRON_VERSION\"\n        \n      - name: Security audit\n        id: audit\n        continue-on-error: true\n        run: |\n          echo \"## npm audit results\" >> $GITHUB_STEP_SUMMARY\n          \n          # Run audit and capture output\n          npm audit --json > audit-results.json 2>&1 || true\n          \n          # Parse results\n          CRITICAL=$(jq '.metadata.vulnerabilities.critical // 0' audit-results.json)\n          HIGH=$(jq '.metadata.vulnerabilities.high // 0' audit-results.json)\n          MODERATE=$(jq '.metadata.vulnerabilities.moderate // 0' audit-results.json)\n          LOW=$(jq '.metadata.vulnerabilities.low // 0' audit-results.json)\n          \n          echo \"| Severity | Count |\" >> $GITHUB_STEP_SUMMARY\n          echo \"|----------|-------|\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Critical | $CRITICAL |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| High | $HIGH |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Moderate | $MODERATE |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Low | $LOW |\" >> $GITHUB_STEP_SUMMARY\n          \n          # Save for artifact\n          npm audit > audit-report.txt 2>&1 || true\n          \n          # Fail if critical or high vulnerabilities\n          if [ \"$CRITICAL\" -gt 0 ] || [ \"$HIGH\" -gt 0 ]; then\n            echo \"::error::Security vulnerabilities found: $CRITICAL critical, $HIGH high\"\n            echo \"AUDIT_FAILED=true\" >> $GITHUB_ENV\n          else\n            echo \"AUDIT_FAILED=false\" >> $GITHUB_ENV\n          fi\n          \n      - name: Check outdated dependencies\n        run: |\n          echo \"## Outdated dependencies\" >> $GITHUB_STEP_SUMMARY\n          echo '```' >> $GITHUB_STEP_SUMMARY\n          npm outdated >> $GITHUB_STEP_SUMMARY 2>&1 || true\n          echo '```' >> $GITHUB_STEP_SUMMARY\n          \n          npm outdated > outdated-report.txt 2>&1 || true\n          \n      - name: Upload audit artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: release-evidence-v${{ env.VERSION }}\n          path: |\n            audit-results.json\n            audit-report.txt\n            outdated-report.txt\n            release-notes.md\n          retention-days: 365\n          \n      - name: Fail if audit has issues\n        if: env.AUDIT_FAILED == 'true'\n        run: |\n          echo \"::error::Cannot proceed with release due to security vulnerabilities\"\n          echo \"Review audit-report.txt and fix vulnerabilities before releasing\"\n          exit 1\n          \n      - name: Generate release summary\n        run: |\n          echo \"## Release Preparation Summary\" >> $GITHUB_STEP_SUMMARY\n          echo \"\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Item | Value |\" >> $GITHUB_STEP_SUMMARY\n          echo \"|------|-------|\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Version | ${{ env.VERSION }} |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Electron | ${{ env.ELECTRON_VERSION }} |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| drawio ref | ${{ env.DRAWIO_REF }} |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| drawio commit | ${{ env.DRAWIO_COMMIT }} |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Node.js | $(node --version) |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| npm | $(npm --version) |\" >> $GITHUB_STEP_SUMMARY\n          echo \"| Dry run | ${{ inputs.dry_run }} |\" >> $GITHUB_STEP_SUMMARY\n          \n      - name: Commit changes\n        if: inputs.dry_run == false\n        run: |\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"github-actions[bot]@users.noreply.github.com\"\n          \n          # Save release notes content before cleanup\n          cp release-notes.md /tmp/release-notes.md\n          \n          # Create release branch\n          git checkout -b \"releases/v${{ env.VERSION }}\"\n          \n          # Remove generated files that shouldn't be committed\n          # (package-lock.json IS committed to lock electron version)\n          rm -f audit-results.json audit-report.txt outdated-report.txt release-notes.md\n          \n          git add -A\n          git commit -m \"Prepare release v${{ env.VERSION }}\n\n          - Updated drawio submodule to ${{ env.DRAWIO_REF }} (${{ env.DRAWIO_COMMIT }})\n          - Updated package.json version to ${{ env.VERSION }}\n          - Updated package-lock.json\n          - Electron version: ${{ env.ELECTRON_VERSION }}\n          \n          Automated by prepare-release workflow\"\n          \n          git push origin \"releases/v${{ env.VERSION }}\"\n          \n          # Restore release notes for PR creation\n          cp /tmp/release-notes.md release-notes.md\n          \n      - name: Create Pull Request\n        if: inputs.dry_run == false\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          # Get the release notes content\n          RELEASE_NOTES=$(cat release-notes.md)\n          \n          # Create PR\n          PR_URL=$(gh pr create \\\n            --base dev \\\n            --head \"releases/v${{ env.VERSION }}\" \\\n            --title \"Release v${{ env.VERSION }}\" \\\n            --body \"## Release Preparation\n\n          This PR prepares release v${{ env.VERSION }}.\n\n          ### Changes\n          - Updated drawio submodule to ${{ env.DRAWIO_REF }}\n          - Updated package.json version to ${{ env.VERSION }}\n          - Electron version: ${{ env.ELECTRON_VERSION }}\n\n          ### Audit Results\n          - npm audit: ✅ No critical/high vulnerabilities\n\n          ### After Merging\n          Create and push the tag to trigger builds:\n          \\`\\`\\`bash\n          git checkout dev\n          git pull\n          git tag -a v${{ env.VERSION }} -m \\\"Release v${{ env.VERSION }}\\\"\n          git push origin v${{ env.VERSION }}\n          \\`\\`\\`\n\n          ---\n\n          ${RELEASE_NOTES}\n          \")\n          \n          echo \"## Pull Request Created\" >> $GITHUB_STEP_SUMMARY\n          echo \"\" >> $GITHUB_STEP_SUMMARY\n          echo \"PR: ${PR_URL}\" >> $GITHUB_STEP_SUMMARY\n          echo \"\" >> $GITHUB_STEP_SUMMARY\n          echo \"### Next Steps\" >> $GITHUB_STEP_SUMMARY\n          echo \"1. Review and merge the PR\" >> $GITHUB_STEP_SUMMARY\n          echo \"2. Create the tag: \\`git tag -a v${{ env.VERSION }} -m \\\"Release v${{ env.VERSION }}\\\"\\`\" >> $GITHUB_STEP_SUMMARY\n          echo \"3. Push the tag: \\`git push origin v${{ env.VERSION }}\\`\" >> $GITHUB_STEP_SUMMARY\n          \n      - name: Summary\n        run: |\n          if [ \"${{ inputs.dry_run }}\" = \"true\" ]; then\n            echo \"::notice::Dry run complete. No changes committed.\"\n          else\n            echo \"::notice::Release PR created for v${{ env.VERSION }}. Review, merge, then create tag to trigger builds.\"\n          fi"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.\n#\n# You can adjust the behavior by modifying this file.\n# For more information, see:\n# https://github.com/actions/stale\nname: Mark stale issues and pull requests\n\non:\n  schedule:\n  - cron: '42 3 * * *'\n\njobs:\n  stale:\n\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n\n    steps:\n    - uses: actions/stale@v5\n      with:\n        repo-token: ${{ secrets.GITHUB_TOKEN }}\n        stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. See [the FAQ](https://github.com/jgraph/drawio/wiki/Stale-bot-FAQ) for more information.'\n        stale-pr-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. See [the FAQ](https://github.com/jgraph/drawio/wiki/Stale-bot-FAQ) for more information.'\n        stale-issue-label: 'wontfix'\n        stale-pr-label: 'wontfix'\n        close-issue-label: 'declined'\n        days-before-stale: 250\n        days-before-close: 14\n        exempt-issue-labels: notstale\n        exempt-pr-labels: notstale\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea\nnode_modules\n.project\n/dist/\n/.classpath\n/.settings\n.DS_Store\n.claude/settings.local.json\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"drawio\"]\n\tpath = drawio\n\turl = https://github.com/jgraph/drawio.git\n\tbranch = dev\n"
  },
  {
    "path": ".nvmrc",
    "content": "20\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md - AI Assistant Guide for draw.io Desktop\n\n## Project Overview\n\nDraw.io Desktop is an Electron-based desktop application that wraps the core draw.io diagramming editor (included as a git submodule). It enables creating flowcharts, UML diagrams, and more, with a security-first design that isolates diagram data from the internet.\n\n**Repository:** https://github.com/jgraph/drawio-desktop\n**License:** Apache 2.0\n**Current Version:** 29.6.1\n\n## Quick Reference\n\n```bash\n# Clone (MUST be recursive for submodule)\ngit clone --recursive https://github.com/jgraph/drawio-desktop.git\n\n# Install dependencies\nnpm install\n\n# Run application\nnpm start\n\n# Run with DevTools enabled\nDRAWIO_ENV=dev npm start\n\n# Sync version before building (required)\nnpm run sync\n\n# Build for specific platforms\nnpm run release-win       # Windows x64\nnpm run release-linux     # Linux (AppImage, deb, rpm)\nnpm run release-appx      # Windows Store\n```\n\n## Project Structure\n\n```\ndrawio-desktop/\n├── src/main/\n│   ├── electron.js           # Main Electron process (2,700+ lines)\n│   ├── electron-preload.js   # IPC bridge with contextBridge\n│   └── disableUpdate.js      # Generated by sync script\n├── drawio/                   # Git submodule - core draw.io editor\n│   └── src/main/webapp/      # Web application loaded in Electron\n├── build/                    # Build resources\n│   ├── notarize.mjs          # macOS Quick Look setup, signing + notarization\n│   ├── fuses.cjs             # Electron security fuses\n│   ├── quicklook-preview.html # Quick Look preview page (viewer-static.min.js)\n│   ├── quicklook-entitlements.plist # Sandbox entitlements for .appex\n│   └── entitlements.mac.plist\n├── doc/\n│   └── RELEASE_PROCESS.md    # Release workflow documentation\n├── electron-builder-*.json   # Platform-specific build configs\n├── sync.cjs                  # Version sync script\n└── package.json\n```\n\n## Tech Stack\n\n- **Runtime:** Node.js 20+\n- **Framework:** Electron 39.x\n- **Language:** JavaScript (ES6 modules)\n- **Build Tool:** electron-builder\n- **Package Manager:** npm\n\n## Key Files\n\n| File | Purpose |\n|------|---------|\n| `src/main/electron.js` | Main process: window management, IPC handlers, menus, auto-update |\n| `src/main/electron-preload.js` | Secure IPC bridge between renderer and main process |\n| `sync.cjs` | Pre-build script that syncs version from `drawio/VERSION` |\n| `electron-builder-*.json` | Platform-specific build configurations |\n\n## Code Style\n\n- **ES6 modules** with `import`/`export`\n- **Tab indentation**\n- **Allman brace style** (opening brace on new line)\n- **camelCase** for variables, **PascalCase** for classes\n- No ESLint/Prettier - manual style consistency\n- Sparse comments; code clarity preferred\n\n## Git Conventions\n\n### Branches\n- `dev` - Main development branch (PR target)\n- `release` - Production releases\n- `releases/v*.*.*` - Version-specific release branches\n\n### Commit Messages\n- Lowercase sentence style without period\n- Issue references: `[jgraph/drawio-desktop#XXXX]`\n- Examples:\n  - `Fixes paste error`\n  - `Adds buffer as dependency [jgraph/drawio-desktop#2301]`\n  - `Prepare release v29.3.0`\n\n### Version Tags\nFormat: `v{MAJOR}.{MINOR}.{PATCH}` (e.g., `v29.3.0`)\nTags trigger CI/CD build workflows.\n\n## Build Process\n\n1. **Sync version:** `npm run sync` reads `drawio/VERSION` and updates `package.json`\n2. **Install:** `npm ci` for clean install\n3. **Build:** `electron-builder` with platform-specific config\n4. **Post-build:** Security fuses applied, Quick Look extension assembled (macOS), notarization (macOS)\n\n### Platform Build Commands\n| Command | Target |\n|---------|--------|\n| `npm run release-win` | Windows x64 (NSIS + MSI) |\n| `npm run release-win32` | Windows 32-bit |\n| `npm run release-win-arm64` | Windows ARM64 |\n| `npm run release-linux` | Linux (AppImage, deb, rpm) |\n| `npm run release-appx` | Windows Store |\n| `npm run release-snap` | Snap package |\n\n## Architecture Notes\n\n### Security Model\n- **Content Security Policy** prevents remote script execution\n- **contextBridge** exposes only specific APIs to renderer\n- **validateSender()** ensures IPC calls originate from local draw.io\n- No external transmission of diagram data\n\n### IPC Pattern\nThe preload script uses a request/response pattern with unique IDs:\n```javascript\n// Renderer sends request\nelectron.request({action: 'save', data: ...}, callbackId);\n\n// Main process handles and responds via IPC\nipcMain.on('request', (e, data) => { ... });\n```\n\n### macOS Quick Look Preview\n- Pressing Space in Finder shows a rendered preview of `.drawio` files\n- Uses `quicklookjs` to embed a Quick Look App Extension (`.appex`) in the app bundle\n- The `.appex` loads `viewer-static.min.js` (with embedded shapes) in a WKWebView\n- **Build flow:** `afterPack` (fuses.cjs) applies security fuses, then `afterSign` (notarize.mjs) assembles the `.appex`, signs it with sandbox entitlements, re-signs the outer `.app`, and notarizes\n- The `.appex` is inserted in `afterSign` (not `afterPack`) so it is never present unsigned during electron-builder's signing verification\n- Quick Look extensions require `app-sandbox`, but Electron helpers must not be sandboxed — so the `.appex` gets different entitlements than `entitlementsInherit`\n- The UTI `com.jgraph.drawio` is declared via `extendInfo` in `electron-builder-linux-mac.json`\n- `viewer-static.min.js` is saved to `build/` during CI before the cleanup step removes it from the drawio submodule; for local dev, it's read from the submodule directly\n\n### Auto-Update\n- Checks GitHub releases on startup\n- Disable via `DRAWIO_DISABLE_UPDATE=true` or `--disable-update` flag\n- Flatpak detection disables updates automatically\n\n### Data Storage\n- **macOS:** `~/Library/Application Support/draw.io`\n- **Windows:** `%APPDATA%\\draw.io\\`\n- Uses `electron-store` for persistent settings\n\n## Testing\n\nNo automated tests. Manual testing documented in `doc/RELEASE_PROCESS.md`:\n- Launch, create diagram, add shapes, save, open\n- Export (PNG, PDF, SVG)\n- Undo/redo functionality\n- About dialog verification\n\n## CI/CD Workflows\n\n| Workflow | Trigger | Purpose |\n|----------|---------|---------|\n| `electron-builder.yml` | Version tag | macOS/Linux builds |\n| `electron-builder-win.yml` | Version tag | Windows builds |\n| `prepare-release.yml` | Manual | Automated release prep |\n| `hash-gen.yml` | Manual | Generate checksums |\n\n## Important Constraints\n\n1. **Recursive clone required** - drawio submodule must be initialized\n2. **Run `npm run sync` before building** - Updates version from submodule\n3. **Version source of truth** - `drawio/VERSION`, not package.json\n4. **Closed to contributions** - PRs not accepted; maintained by JGraph\n5. **Node 20+ required** - ES6 modules without transpilation\n\n## Development Tips\n\n- Set `DRAWIO_ENV=dev` to auto-open DevTools\n- Use `npm start --enable-logging` for verbose output\n- If using symlink instead of submodule, also symlink `node_modules`\n- Main process logs to console; check terminal for errors\n\n## Key Dependencies\n\n| Package | Purpose |\n|---------|---------|\n| `electron` | Desktop app framework |\n| `electron-builder` | Build/package tool |\n| `electron-updater` | Auto-update mechanism |\n| `electron-store` | Persistent storage |\n| `@cantoo/pdf-lib` | PDF export |\n| `commander` | CLI argument parsing |\n| `quicklookjs` | macOS Quick Look preview extension (dev) |\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 contributors and maintainers aim to making participation in our project and our community a harassment-free experience for everyone.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\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 advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment, including focusing on individual developers when a topic should be broadly addressed.\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n* Not respecting other people's time\n* Being impatient or rude\n* Pressing developers for priority fixes or ETAs\n* Guilting the developers into focusing on your issue(s)\n* Repeatedly showing an inappropriate level of entitlement, asking for issue status, or bumping issues.\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies to all JGraph projects and the draw.io google groups.\n\nProject maintainers are not subject to this code.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor-Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]\n\n[homepage]: https://contributor-covenant.org\n[version]: https://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "DEVELOPMENT.md",
    "content": "## Setup\n\nInstallers repo is: https://github.com/mediaslav/drawiodesktop\n\n\tbuild/ - resources for installer, don't change file names names there\n\telectron-builder.json - main build config\n\tsync.js - fetches version from ./draw.io/VERSION for build, and installs draw.io/war/package.json \"dependencies\"\n\t.travis.yml - CI config\n\tappveyor.yml - CI config \n\tdraw.io/ - draw.io repo as submodule\n\nCurrently CI build are activated from pushing to this repo, not from draw.io.\n\n## High level workflow\n\n1) You push to repo\n\n2) git hook activates CI, and CI performs build (builder will use version from ./draw.io/VERSION, ignoring version in draw.io/war/package.json)\n\n3) After successful build CI drafts new release in github and uploads installers, mac and linux from Travis and windows one from AppVeyor \n( you'll see new draft here: https://github.com/mediaslav/drawiodesktop/releases )\n\n4) You wait till all installers get into draft and press \"Publish release\"\n\nNeed to open corresponding draft in: https://github.com/mediaslav/drawiodesktop/releases   \nPress \"Edit\" near relevant draft, make sure you see all needed installers uploaded by CI, and press \"Publish release\" below\n   \nSo manual work is push commit, have lunch, coffee and press \"Publish\" button.\nTravis OSX builds can spend hour(s) in queue.\n\n## Configuring CI\n\nYou must provide certain environment variables for github publishing and code signing\n\n\tGH_TOKEN = github token, for publishing    \n\tCSC_LINK = Certificate converted to base64-encoded string, or url to cert (*.p12 or *.pfx file) \n\tCSC_KEY_PASSWORD = The password to decrypt the certificate given in CSC_LINK\n\n#### Travis CI - builds OSX and Linux installers\nDefine vars at: relevant repo page / \"More options\" / \"Settings\" \n\n#### AppVeyor CI - Windows NSIS installer\nDefine vars at: SETTINGS / Environment / Environment variables, Add variable\n\n## Code signing\n\n### Windows\n\nTo sign an app on Windows, there are two types of certificates: **EV Code Signing Certificate** and \n**Code Signing Certificate**. Both certificates work with auto-update. The regular (and often cheaper) \nCode Signing Certificate shows a warning during installation that goes away once enough users installed your application\nand you've built up trust. \n\nFor CI you can use only regular **Code Signing Certificate**, because EV Certificate is bound to a physical USB dongle.\n\nSSL certificate used for website is not suitable for signing apps.  \n\nSee [Get a code signing certificate](https://msdn.microsoft.com/windows/hardware/drivers/dashboard/get-a-code-signing-certificate) for Windows.\nAnd this may be useful: https://cheapsslsecurity.com/#ProtectYourCode\n\n### MacOS\n\nMac build requires Apple-issued Developer ID certificate, you must be member of https://developer.apple.com/programs/whats-included/\nto receive one. \n\n#### How to Export Certificate on macOS\n\n1. Open Keychain.\n2. Select `login` keychain, and `My Certificates` category.\n3. Select all required certificates (hint: use cmd-click to select several):\n\t* `Developer ID Application:` to sign app for macOS.\n\t* `3rd Party Mac Developer Application:` and `3rd Party Mac Developer Installer:` to sign app for MAS (Mac App Store).\n\t* `Developer ID Application:` and `Developer ID Installer` to sign app and installer for distribution outside of the Mac App Store.\n\t\n\tPlease note – you can select as many certificates, as need. No restrictions on electron-builder side.\n\tAll selected certificates will be imported into temporary keychain on CI server.\n4. Open context menu and `Export`.\n\nTo encode file to base64 (macOS/linux): `base64 -i yourFile.p12 -o envValue.txt`\n\n## WARNING\n\ndraw.io/war/package.json \"dependencies\" will get into installer, so please put irrelevant ones into \"devDependencies\", which is ignored by builder.\nCurrently it looks like:\n\n\t\"devDependencies\": {\n\t\t\"electron\": \"^1.6.3\" <- we obviously don't need to pack electron inside electron as dependency \n\t}\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\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"
  },
  {
    "path": "README.md",
    "content": "About\n----- \n\n**drawio-desktop** is a diagramming desktop app based on [Electron](https://electronjs.org/) that wraps the [core draw.io editor](https://github.com/jgraph/drawio).\n\nDownload built binaries from the [releases section](https://github.com/jgraph/drawio-desktop/releases).\n\n**Can I use this app for free?** Yes, under the apache 2.0 license. If you don't change the code and accept it is provided \"as-is\", you can use it for any purpose.\n\nSecurity\n--------\n\ndraw.io Desktop is designed to be completely isolated from the Internet, apart from the update process. This checks github.com at startup for a newer version and downloads it from an AWS S3 bucket owned by Github. All JavaScript files are self-contained, the Content Security Policy forbids running remotely loaded JavaScript.\n\nNo diagram data is ever sent externally, nor do we send any analytics about app usage externally. There is a Content Security Policy in place on the web part of the interface to ensure external transmission cannot happen, even by accident.\n\nSecurity and isolating the app are the primarily objectives of draw.io desktop. If you ask for anything that involves external connections enabled in the app by default, the answer will be no.\n\nSupport\n-------\n\nSupport is provided on a reasonable business constraints basis, but without anything contractually binding. All support is provided via this repo. There is no private ticketing support for non-paying users.\n\nPurchasing draw.io for Confluence or Jira does not entitle you to commercial support for draw.io desktop.\n\nDeveloping\n----------\n\n**draw.io** is a git submodule of **drawio-desktop**. To get both you need to clone recursively:\n\n`git clone --recursive https://github.com/jgraph/drawio-desktop.git`\n\nTo run this:\n1. `npm install` (in the root directory of this repo)\n2. [internal use only] export DRAWIO_ENV=dev if you want to develop/debug in dev mode.\n3. `npm start` _in the root directory of this repo_ runs the app. For debugging, use `npm start --enable-logging`.\n\nNote: If a symlink is used to refer to drawio repo (instead of the submodule), then symlink the `node_modules` directory inside `drawio/src/main/webapp` also.\n\nTo release:\n1. Update the draw.io sub-module and push the change. Add version tag before pushing to origin.\n2. Wait for the builds to complete (https://travis-ci.org/jgraph/drawio-desktop and https://ci.appveyor.com/project/davidjgraph/drawio-desktop)\n3. Go to https://github.com/jgraph/drawio-desktop/releases, edit the preview release.\n4. Download the windows exe and windows portable, sign them using `signtool sign /a /tr http://rfc3161timestamp.globalsign.com/advanced /td SHA256 c:/path/to/your/file.exe`\n5. Re-upload signed file as `draw.io-windows-installer-x.y.z.exe` and `draw.io-windows-no-installer-x.y.z.exe`\n6. Add release notes\n7. Publish release\n\n*Note*: In Windows release, when using both x64 and is32 as arch, the result is one big file with both archs. This is why we split them.\n\nLocal Storage and Session Storage is stored in the AppData folder:\n\n- macOS: `~/Library/Application Support/draw.io`\n- Windows: `C:\\Users\\<USER-NAME>\\AppData\\Roaming\\draw.io\\`\n\nNot open-contribution\n---------------------\n\ndraw.io is closed to contributions (unless a maintainer permits it, which is extremely rare).\n\nThe level of complexity of this project means that even simple changes \ncan break a _lot_ of other moving parts. The amount of testing required \nis far more than it first seems. If we were to receive a PR, we'd have \nto basically throw it away and write it how we want it to be implemented.\n\nWe are grateful for community involvement, bug reports, & feature requests. We do\nnot wish to come off as anything but welcoming, however, we've\nmade the decision to keep this project closed to contributions for \nthe long term viability of the project.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\n| Version  | Supported          |\n| -------- | ------------------ |\n| Latest   | :white_check_mark: |\n| Older    | :x:                |\n\n## Reporting a Vulnerability\n\nIf you discover a security vulnerability in axios please disclose it via our [huntr page](https://huntr.dev/repos/jgraph/drawio-desktop/). Bounty eligibility, CVE assignment, response times and past reports are all there.\n"
  },
  {
    "path": "build/create_macos_icon.sh",
    "content": "#!/bin/bash\n\nset -eo pipefail\n\n# Config\nSOURCE_FILE_PATH='./1024x1024.png' # has to be of size 1024x1024 px\nOUT_ICON_NAME='icon'\n\n\n# The \"design\" and magic numbers below are derived from Apple's macOS app icon\n# guidelines and design templates:\n# https://developer.apple.com/design/human-interface-guidelines/macos/icons-and-images/app-icon/\n# https://developer.apple.com/design/resources/#macos-apps\n#\n# Specifically, for an icon of 1024x:\n# - outer bounding box: 1024x1024 px\n# - border radius: ~22,85% (= 234 px)\n# - icon grid size: 824x824 px\n# - icon grid shadow size: x: 0px, y: 10px, blur: 10px, 30% black\n\n\n# Make sure ImageMagick's convert and iconutil are available.\nif ! hash convert 2>/dev/null || ! hash iconutil 2>/dev/null; then\n    echo \"ERROR: This script requires ImageMagick and iconutil.\"\n    exit 1\nfi\n\n\n# Prepare an iconset folder\nmkdir \"./${OUT_ICON_NAME}.iconset\"\n\n\n# Add rounded corners to the 1024px image.\n#\n# This works by:\n# 1. Generating a black square (1024 px) with rounded corners (radius 234 px)\n#    on transparent background, via `-size [...] xc:none -draw [...]`\n# 2. Applying the square as a mask to the the source image, via `-matte [...]`\nconvert \"${SOURCE_FILE_PATH}\" \\\n    -matte \\( \\\n        -size 1024x1024 xc:none -draw \"roundrectangle 0,0,1024,1024,234,234\" \\\n    \\) \\\n    -compose DstIn -composite \\\n    \"./${OUT_ICON_NAME}.iconset/temp_1024_rounded.png\"\n\n\n# Apply sizing and add shadow to the 1024px image.\n#\n# This works by:\n# 1. Resizing to 'icon grid size' (824px), via `-resize`\n# 2. Adding padding (100px) to get 'outer bounding box' size,\n#    via `-bordercolor none -border [...]`\n# 3. Adding shadow, via `+clone -background black -shadow [...]`\nconvert \"./${OUT_ICON_NAME}.iconset/temp_1024_rounded.png\" \\\n    -resize 824x824 \\\n    -bordercolor none -border 100x100 \\\n    \\( +clone -background black -shadow 30x10+0+10 -background none \\) \\\n    -compose DstOver -flatten \\\n    \"./${OUT_ICON_NAME}.iconset/icon_512x512@2x.png\"\n\n# Remove temporary file\nrm \"./${OUT_ICON_NAME}.iconset/temp_1024_rounded.png\"\n\n# Generate all sizes.\n# 16/32/128/256/512, each single & double resolution\ncd \"./${OUT_ICON_NAME}.iconset/\"\nconvert './icon_512x512@2x.png' \\\n    \\( +clone -resize  x16 -write './icon_16x16.png'      +delete \\) \\\n    \\( +clone -resize  x32 -write './icon_16x16@2x.png'   +delete \\) \\\n    \\( +clone -resize  x32 -write './icon_32x32.png'      +delete \\) \\\n    \\( +clone -resize  x64 -write './icon_32x32@2x.png'   +delete \\) \\\n    \\( +clone -resize x128 -write './icon_128x128.png'    +delete \\) \\\n    \\( +clone -resize x256 -write './icon_128x128@2x.png' +delete \\) \\\n    \\( +clone -resize x256 -write './icon_256x256.png'    +delete \\) \\\n    \\( +clone -resize x512 -write './icon_256x256@2x.png' +delete \\) \\\n              -resize x512        './icon_512x512.png'\ncd '..'\n\n# Convert to .icns format and remove iconset\niconutil -c icns \"./${OUT_ICON_NAME}.iconset\"\nrm -r \"./${OUT_ICON_NAME}.iconset\"\n"
  },
  {
    "path": "build/entitlements.mac.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n  <dict>\n    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>\n    <true/>\n    <key>com.apple.security.cs.allow-jit</key>\n    <true/>\n  </dict>\n</plist>"
  },
  {
    "path": "build/fuses.cjs",
    "content": "// https://github.com/electron-userland/electron-builder/issues/6365\nconst path = require('path');\nconst { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses');\nconst builder = require('electron-builder');\n\nasync function addElectronFuses(context) \n{\n    const { appOutDir, packager: { appInfo: { productFilename } }, electronPlatformName, arch } = context;\n\n    const ext = {\n        darwin: '.app',\n        win32: '.exe',\n        linux: [''],\n    }[electronPlatformName];\n\n    const IS_LINUX = electronPlatformName === 'linux';\n    const executableName = IS_LINUX\n        ? productFilename.replace('.', '') // Remove . from \"draw.io\"\n        : productFilename;\n\n    const electronBinaryPath = path.join(appOutDir, `${executableName}${ext}`);\n\n    // We build for x64 and arm64, but universal build for these two also but no fuses is needed at this temp stages\n    if (electronBinaryPath.includes('-temp/'))\n    {\n        return;\n    }\n\n    console.log('Flipping fuses for: ', electronBinaryPath);\n\n    await flipFuses(electronBinaryPath, \n    {\n        version: FuseVersion.V1,\n        [FuseV1Options.RunAsNode]: false, // Disables ELECTRON_RUN_AS_NODE\n        [FuseV1Options.EnableCookieEncryption]: true, // Enables cookie encryption\n        [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, // Disables the NODE_OPTIONS environment variable\n        [FuseV1Options.EnableNodeCliInspectArguments]: false, // Disables the --inspect and --inspect-brk family of CLI options\n        [FuseV1Options.OnlyLoadAppFromAsar]: true, // Enforces that Electron will only load your app from \"app.asar\" instead of its normal search paths\n        // https://github.com/electron-userland/electron-builder/issues/6930 (electron-builder uses its own asar packaging)\n        [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: false, // TODO Enables validation of the app.asar archive on macOS\n        // Some reports it crashes when enabled on arm64\n        [FuseV1Options.LoadBrowserProcessSpecificV8Snapshot]: false, // TODO Loads V8 Snapshot from `browser_v8_context_snapshot.bin` for the browser process\n        // Based on docs, this should be enabled for macOS on arm64\n        resetAdHocDarwinSignature: electronPlatformName === 'darwin' && (arch === builder.Arch.arm64 || arch === builder.Arch.universal),\n    });\n}\n\nmodule.exports = async (context) =>\n{\n    await addElectronFuses(context);\n};"
  },
  {
    "path": "build/icon.hqx",
    "content": "(This file must be converted with BinHex 4.0)\n:%'%e1@3j0$N`-Q3iB6)bB6B%9%9B9(4dH(3%!!!!!Y!!!@G8-Je)EhFJG'mJGA0\nP)(4SDA-JD@0[EMS+#P0dCA!J-6SJ3fp`H5\"dD'8JD@0[EL\"dEb\"dD'8JBfaTF'*\n[BA*N#Q%T)%0XD@0V)'pZ)(4SDA-JCQPXC5\"QFQpY)(4SC5\"'D@jNCA)+BLNJ3fK\n[Eh0P)#G(CA3J5@jQEbFJCR*[E5\"dD'8J*dCTE'8R)'ePER8Z#Q-T)%PZ)(4SC5\"\nTEQC[)(GTEQ4[Gb\"dD'&d)(\"[F(-JGA!X)'0XD@0V)'pZ)(4SC5\"TBfpZ#Q3T)%0\nSEfpcC5!R3fp`H5FJCR*[E5\"dD'8J*d9NDA3R)'ePER8Z#Q8T)%0XEh0P)(4SC5\"\nTEQC[)(GTEQ4[G`S+8h4PF#!b1L\"3BA0dC5\"dD'8JD@0[EL\"dEb\"dD'8JC'9cDA*\nPC#\"TG'9Y#Q%T)%G[)(4[)(4SC5\"TG'9Y)'PZ)(4SC5\"'D@jNCA)JG'KKG#\"jEh8\nJGf&ZG#\"K)'0eFh4[E5\"TBfpZ#Q)T)%0XD@0V)(4SC5\"TG'9Y)#KQD@aP,#\"QEfa\nNCA)X)'4TFfXX)'9dBbNJ#Q)T)%0SEfpcC5!R4f9d)%PZCQmR)'CbEfdJG'KP)#G\n'D@aP*b\"YC@je,JTM+5\"*EL\"dD'8JD@jQEb\"hD@jNEhFJG'KKG#\"`Eh\"c)(9`,#\"\nME'PMDb\"[EL\"dD'8JD@0[EJTN+5\"$D'p[Ff8J*e\"KFh4P*b\"QFQpY)(4SC5!R4@4\nTG#FJE@9ZG5i+C5NJ3fa[Ff8JG'KP)'PZCQmJGfPZC'ph#JT6G'9`)$-k)!T&EQT\n[H5\"jEh9b)'jPGfaj)'0eFh4[E@PkC@3JD@0[EL%+#NC[FL\"YEh*P)(4SEh*[G@G\nS)'4TFQ9MG'P[ER-X)(0PC5\"\"F(\"XC5Gc)(GPBR0TG'8JBA3k#QKdG(!k,bphGhF\nZBA\"`E'8ZBfpY,h0eF(\"[FR3[E@&M-6!a,f0eFh4[E@PkC5mf,`V6V!!!!3!!!@F\nL!!&Q)J!!!$)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!@BHD@0ZF`!\"CKjTFc-b!!!#f`$[J2!\"lr#$li$`!1q#m!I[mI,\nbmI$[li6`#Hrcrrlqrr$[m1q$m!V[pIrqr[rTj[([li,`#qrerrlqrqVFkI([li(\n`*qrbr[[mrH6GhZRalr$[m2$[mIVKi[MKhYrHk[([m1r[l[VXh0cYmpZ!hPEUm1r\n`m2AjhYrHh[MSiH$HhZr`r2lqrr$GhI$rrIlihpl[mIlrr[rehGherrlrr1(Hlr(\nqrrlrpGhGpIrqrrcKhZr`qI[lrHrGhHrpqrhfhpl[m1lLhq#\"hS$J#0lHhr$[m1h\nJhB(IJGi+hpl[m1ralZ$Hhpk#h`(Hh`Z'KiH'KSH$JS+$KiD!K`#'JSF(KC5APj1\n'KiD$K`U)J+IrrIhrRi')KS+(#iKrXrrmr2qGFSZ'KS'($)KrXrrmr2qHBAk*KSD\n!Kc1)JThkmI,hK@GVIBQ'KiD(L)55jRKkiRCTE@YqLBD(KB4lekYKB+l*A@PUE(f\n(KBb2VH4UJ'YEijKhFfPXKSRSr[Vr[@9Q[[rjrZ*ZDi52prrlrp0PCY6rqrreG@Q\n%MrIrr2r5C@E8rrcrpA9TKSMHp1rjYQ9PYrRZpYKYDiH'K(CaFfPVDfPbFR0VDQb\n'KiL#E@Q\"E!jUDQPVE'Z'KiD*K'jVE'Z#E!&VE!8%\"38%\"3@\"!!%&\")!&!!5\"\"3B\n%\"#!R*b!%K38*\"`\")rr[lrd3!\"i-&#3J!B2rlqrpJ!!H$\"3`)!'$rq[VrB!!,\"!8\n%J!9r\"`!dpHRUmcB%$JF%\"38%\"3J!(Y%K)p!I\"`i0\"`3%\"3)\"!+Pj!!\"lTJ!(#3`\n(\"3)6&e65$3X,$Y&8(KJ*$!-+d2hfrj)\"!T6rp[h2$`S!&Zrrq2qf!3+irrRrlKX\n(!\"E[rrVrYJ%#Z2rkrqiE\"`-([r$NpBB\"!BMej2#r$JX&!`L!&`m*#`X*&aFB$!N\n-\"!8%!JJ*J3`9#!N)#``,\"!3&\"3B-$!X,$!d-$3`,#h-iE@X!!!%)lIrqrrrrrrr\nrrrrrrrlrk[rrrrrrrrrrrrrrrrrqrrcqrrlrrrrrrrrrrrrrr[rlrrrrrrrrrrr\nrrrrrrrlrr2rrrrrrrrrrrrrrrrrqrrcrrrrrrrrrrrrrrrrrr[rmrrrrrrrrrrr\nrrrrrrrlrr2rrrrrrrrrrrrrrrrrqrrcrrrrrrrrrrrrrrrrrr[rmrrrrrrrrrrr\nrrrrrrrlrr2rrrrrrrrrrrrrrrrrqrrcrrrrrrrrrrrrrrrrrr[rmrrrrrrrrrrr\nrrrrrrrlrr2lqr[lqr[lqr[lqr[lqrr[rrrrrrrrrrrrrrrrrr[rmk[rlr2cmr2c\nmr2cmr2[rk'PX-c)!!!LX!Hr[QI#!lj!!m!$[Kr!!liI`!Hr`KHm\"m1q3!2!$lr$\n[mB2c!2'!lj!!m!E[pIrqr[rrJ2i$mqr`lir`!Zrkri2q\"2rcjr([Mr!#lrVrJri\n&rr6Fk[([M[!$lrVrrS(r\"rlrp0hHk[([MI!$lrVrrS(r#2lrp0hIhZ[alic`!Zr\nkri2q#[rdhGrHhZ[alr$[LI!8lrRrr[lrrrlqrr,FhprHhZ[alr$[L2!9lr(lrrc\niq2crpq,HhplIhYrXmHr`liE`&Hr`l[VrjYhGjrrch0rHhplIhYrXmHq'm\"I[m1r\ndrr2FhprFmrrShGrHhplIhYrYm1q'm!h[m2hpiYlIhplLr[RIhS$I\"GlIhYrYmB$\n`!1q#m!hZp[rYh0rHhYrFlIrYh)(I#GlIhZ$Ym2$[m2#!l`2ZmIrjKGm,qIlKh0l\nGhYrHhplJJ2!Flqram[,aqIrYhGlIhYlIhYhYrr2Lj16LhGlIhpk!m!,[prq$rJI\njiGlIhplLqB2q![r[hB$I*I$`lr$prrlrr[lrr[rVh0rIh1[rr[rqr[rqrr[JhYr\nIm2$[mIhrJri*rqcFhprFl2rqri(q$2rmi0lIhr$`lr$prrk\"r`Rqrq[FhprFl2r\nqJIm0r[rmi0lIhr$`lr$prrk\"r`Rqrq[FhprFl2rqJIm-r[rmi0lIhr$`lr(pri2\nq\"rrXh0rIh1crJri-rrcJhYrIm2$[m2hrrS$r#rlqrqVFhprFk[rqrS$r\"[lrqpr\nHhpq!m!,[p2U\"q`[kqr2IhYrIhZ$dqrU#q`(UhB$I!I$`J1m\"k0k#h`IGhYrHhYr\nHhB6I\"0hIhYrIJ2!%lr$ajpf\"hJIIhplIhplIhi6H!GrHJ0q\"m!6[lr(RhB(I!0k\n\"h`$HLYq#m!I[lr(RhGrIhT!!h`$[J[!%lqrajpk4h`,Hlqq#m!6[lr(QhSrI!Gl\nI!BD'QBH!KSQ(JiJ\"KiD(K`#'KiF#KSH$Ji%#JiH'N!#(\")D(JTDLJD!%ST@#KiD\n2K`H)J,(rr[lrri$q!kU\"L)D1K`5)J0[rr)(q\"Icrc(5,KSk(\")L\"hIrpJIi'r2r\n2BRq*KSf(\")L\"hIrpJIm*r2r3BfaqLBD(KSU(\")L\"hIrpJIm+r2r2BfeVIiL'KiD\n*Ka5)JGhrrIlprIlprp\"MEQYVJ)L'KiD)Ka@)J06rr2lrrrlmrm9LEQaVDi#)KSH\n'KSFAKSH%PZIrmZ2Mm[rGHfPXDfaVE)')KSH'KSF9KSKqf2q3!'9PN[r+B'jVE'Y\nXDfb\"L)D'KaH'L(qZrmKLE@eLbIq@BfjVE'YXDff#L)D'K`f&LI$kHfGYE@GmrHG\nXDi\"X\"@YXDff#L)#(!)D\"Ka'+IX(rVf&ZDfYZBE$rV@&[E@f!E!jUES+(KiD(Ki1\n#Jhk9rq@&E!ERqhKLCfCRJ'`SDff(KSH'Jj@DQT6ArkeQDQaVDfaTCUhrbAZ$Jhe\nRDfaXDiH(L),'rrf!rJ[prZCiD@aXD(VSrIf!rLcprlGPE@aXKiH&MIArr[rqr[r\nmrk0LEQjKTrrmrrlqrrlrm(*UE'b(Ki52p[q#rJRmrkGKEQjKU[rmJ[i-rr*eD@a\nXKiH%MrIrrS$r#rlmrkGKEQjKU[rmrS$r$Ilrmh4TE'b(Ki52p[rqJ2m,r[crTf&\nZEQ'UrrcqJ2m0r[rcG'PXE)H(K)rfrrf\"rJRlrkKKEQjKUrrlJIi0rIrbG@PXE)H\n(KB[brrk!r`[qrIqIBQjZBU,rr2k!r`cqrqe`DQaXKiH)JV2XJZd*mFa`DQaXDR(\n1mB2Y#k&PE@aXKiH'Ki*lES*`\"f9TE'YVE'PQJA!(Eh\"XC@aVE'b!K`@'L)KjD'Z\n!DJGYE'YXE'YXEB0U!QYYDi\"XJBF%KSD*HQU\"E!\"VJ@`!DiTXJSF(KSD)H@PXE'Z\n3!'`!KS+(\")D'L(PUN!\"X!fYXKSD#K`5'KSPhDT&X!33%Q3@!\")B&!J3&\"S-(!3B\n%K`8!\")F&!33'K!!#!3B%NJ8,!#Bq1MXl1MiN!!8%M`8(\"`\"Grrlqrrq!rJ06!!F\n%MJ8%\"`#frrU\"r3Ekrk`!\"`8%M38%\"`#irrZ\"rJIlrl%!#33&\")`&\"!F!ZIrlJIm\n)qrqa!!m'\"!8%L`8%\"`#irrZ\"r`Rlrl%!$``'\"!8%LJ86\"`#irrcpr2cpr2qa!!i\n-#`B%\"35*\"43)!+Irq[hrrrhkrjm!$`X-#`B%\"35(\"4B%\"J!Pc[rTdG(UrmJP\"`d\n-#``,\"J3&\")J&&3F!X[p)!!\",rkN!$`X-$!X-#`B%\"35&\"4B%#!\"Drk3!$Ji!Trp\n5!!m,$!`,$!X&\")F&$3)2hrNQ\"3i1\"5Mlf!d,J3`%#``,\"35!\"43%\"3B(\"JS!JIp\nm!\"!,#a!!I[pi!\"+!$3--#``,J!8+\"!8'!!!#!#Ipe3k$$(-1erJL!!8$\"3d-#``\n,\"33&\"!)M,#dJVIph!`N0#`X0#34irkBP-c)T\"3X-#``&\"3F!L[rmrIlqqrh@)!F\n0$3BMfIhlr[lpr2q)!3i-#`8'!42Urrhrr[hrqrpS!!m2!'hrqrrpr[rprqF@#3`\n-\"3B!&qhrrB(q#IVrE`!2$`\"crrU\"rJhprqSE#!d-\"3B!&qlrrB$r#rllrfi!$`m\n!FrrlrS$r$Ihrl\"S)$3`&\"J!@l[rpJ2m,r[[rEJ!2$`\"crr[qJ2m0rIrV'JJ0$!8\n'!\"IYrrb\"r3Rjrfm!$`m!G2rjJId0r2rU'`F0$!8&!JrNrrf!r`[qqrpK!!m2!'A\nrqrk!r`cprq)6#3`-\"38(!'6NJH),iHHX%`S-$!N8VqIKJZ),B`%1$!`&\"33&!!S\n6JK)(!`N-#`X-#!5#%JB6$!--#`X-J!84\"!F$\"3S*#3S*$J`,$!`,$!d*J3S$#3X\n1#i!-J!8!\")!&!3J0J3`!#i%-!!Z*$!!,K!8%\"!J-#`Z2$!),$!5\"\"3F%\"38%#!`\n,#id-\"!X-#`3%J38(\"!8&\"!J-#`Z,$!-,$!X,E$KYD`!!\"!LYrrhqrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrr[hrT[hrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rhrIlrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlqrrMqrrlrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrRrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrqIlrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rjrIlqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqrrMmrrlrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrpkEqq2RjqIRjqIRjqIRjqIRjqIRjqIRjqIRjqIR\njq2qKD@Jc-J!!$ZQ!lkI`JHqVm!$[V2!!lil`!1q*m!$[R[!\"lr#*l`(`ljc`!qr\n`lr'(p!2alr$[Q[!'lr$[pIlrrS2r\"2lrr[2[R2!$lr$priIq\"2rjk[([Q[!$lr(\nqriIq\"IrmiHValjR`\"1rar[rqKIm*r[rpiGlVmHr`ljE`\"1rar[rqKIm+r[rpiGl\nIkr([m1q9m!6[mIlrrSAr#rlrrH(HhYrXmHr`lj6`\"1rar[rqKIm-r[rpiGlIhYr\nXmHr`lj2`\"1rar[rqKIm0r[rpiGlIhplIlI$[m1q5m!6[mIlrrSAr$[lrrH(Hhpl\nIhYrYm1r`lj(`\"Hrar[rqri2q%2rqrrcJhYrIhYrHi1h`lr$[NI!#lrRrJ2k\"ri$\nq![rbhB(I#0lIhZ$Zm1r`lil`\"qr`lr$irrrpJIF(rIrrlprHhpk!h`MHhplJl[$\n[m1q1m\"([m1lfrrrZfplHh1rrrqRFhpk#h`MHhplJl[$[m1q1m!r[mIlrqYrHhpr\nHhrVrr1(HK0m)hYrHiHl`lr$[Lr!(lr$[qIrrkGb\"h`IFkIrrmGcIhS2I\"YlIhZ(\n[m1q,m!I[m1rcr[rehB2I\"phfrrlPhGrHJpm'hYrGiHr`lic`%HrlrrlNhGrHhpr\nHhphPr[rfhBEI\"0lIhH,[L[!*lr$ZpIrrm0cIhS(I#GlIh2(rrqRFhpk%h`6Hhph\nMli2`!1q$m!E[m2hrqq(HKGm'hZ(lrrVIhS2I\"YlIhplIhZ+#m!([m)2[\"qlirrr\nUh0rHJpm)hYrFk[rrlp[HJGd(hYrHhprHhpk\"m!2[m1r`J[))p2lrqZAJhGrHJGm\n*hYrGi1AkrrhRj)(P\"prGhplIhplIJ2!Hlr$[m[hrr[lrrrlqrrlqr1IGhplIhpl\nIhHMmr[lrrS$r\"rlqrrVNhGrHJ0q#m!,[qrq%rJErr[lrqYrHJGm'hZ$lrrlqri6\nq![rhhS,IJI!$lr$pri2q!IrrJIi\"ipf\"h`(Gj)(q!IrrJri$rr[JhS(IJI!%lr$\nprrk&r`6qrrlMhB(I\"0hNr[rqKIm%r[rmi0k\"hi(`\"1r`rIrqKIm%r[rqipf\"h`6\nGj2rrrSAr\"2lrr1$HJGq\"m!6[m2hrrSAr\"2lrrZ2GJGm%hH6rrrk&r`6qrrcJhS(\nIJI!%lr$prrk&r`6qrrlMhB(I\"0hNrrrqKIm%r[rmi0k\"hi(`\"1r`rIrqKIm%r[r\nqipf\"h`6Gj2lrrSAr\"2lrr1$HJGq\"m!6[mIhrrSAr\"2lrrZ2GJGm%hH6qrrk&r`6\nqrrcJhS(IJI!$lr$priRq!H2HJGm\"hH1*rJ2rqq$HJGq#m!2[qIrqKIm$r[rfhS2\nI!plhrrk&r`2qrr2GJYq#m!2[m2EjK[S,p1(HhplIhplIhZ,dKrS%mZ$Hhpk!hi(\n`\"Hr[m1hKhSAI!phHhpk\"h`2HhplGKpm$hGlIhS(IJr!&lr$ZiGhIJpi#hprHJpm\n#hYrIKpi#hprHJYq#m!E[m1r`lZ(HK0m!hSAI!0k3!0q$m!M[m1r`lZ(HhpkHhi6\n`#1r`lr$Zi0lIhThIKI!)lr$[m1lJhYrHR0m!liA`#1r`lr$Zi0lIhTVI!Gl[K[!\n)lr$[m1lJhYrHQ0m\"hYq!liA`\"Zr`lr$Yi0kBh`,HhYm\"KSDTKi#'!BH'UBF\"KSD\nUK`#'MiF\"KSH(L!'(KTk(!SD)JiGr!S5)KTb(\")D(JC@XKUX$Ni'(KTU(\"SD)J,$\nprrk$r`EqrrZTJBL'QSF%KBcarrb&r3ImrqCrL)D(KTL(!i1@qrq(rJIrpAGmLBD\n(KTH(\")1@r2rqKIm*r[rhH'L!L)D(KTD(\")1@r2rqKIm+r[rhH'KXJ)L'KiD9K`5\n$P[crrSAr#rlrphKTE'b\"L)D(KT5(\")1@r2rqKIm-r[rhH'KYDfb\"L)D(KT1(\")1\n@r2rqKIm0r[rhH'KXE'YYJSL'KiD5K`5$PrcrrS6r$rlqrrCiD'aVE'YYJSL'KiD\n4K`D%NrRqr[rqJId4r[rqrr0eD@aXDfaUEB1)KSH'NBF3JYIrrIlqrrlrrrlqrIr\n'C@f!E!KVE'TZK)L'KiD1K`H'Ki@*brrrpi(E\"rMrrlKYDQaVJ'`)DfaUES5)KSH\n'MSF4KSPmZ2rrY9jSD&kirrqIB'pVJQ`)DfaUEi5)KSH'M)F4KSH$PIMrk'pVE@e\nUF1VrmRGSK'`)DfaUEi@(KSH'LiF6KSKrdrrrR'*ZE'aZBTlrrm\"KEQZ$E!CVE'T\n`KBH'LiF)KSL!TIrre@CYJ@`)E@EArrb)C@eVJf`'DfaUF)D(KSb(%SAPrrb'C@e\nVE'aVE@@)r2rACQf&E!4VE'TaKSU(#BD*IVIrrljKEQZ\"E!PVEQ(!rrqHBQjVK'`\n%DfaUFSD$K`''Ki+)\"S@2mrr`GQQ&E!GTGr(rkR\"VES&Y\"faVE'aVE'TaJSF#KSL\n'JB%)Jh[,rrqJAh\"VJf`)Dh\"ISIrrYPaRJ@8(DQeVE'aVE'Z\"K`5'Ki++RS#I#Cb\nYqrrVLA0PE@Z\"E\"9VE@9dLZcrpTD'LSQ*L'pQE@YXE'YXJ)FHKSL#Rr(rr[lrrrl\nqrrcqpC4PE@YXE'YYCCIfr[crrS$r\"rlqrqf'CQeVJ'b#K`1&j[rpJri'rrlprqT\n`DS&X\"QTcl[rpr[q$rJ2prpYSJQb\"K`1%MrErJri\"rrq!rJMlJ'GYE'aYCS5\"rJ(\nrri2q!rraFfQ\"E)'(\")52prrqKIm0r[rpJ@GYE'aYCS6rrrk&r`6qrr*dDB&XJBF\n%K)rhrrk&r`hqrrf\"CfeXE'eQK2rrrSAr\"2lrmh4TJ@b\"K`5%MrIrrSAr$IlrrB&\nRE@aXE@D%rrrqKIm%r[rcG'Q\"E)'(\")52prrqKIm0r[rpJ@GYE'aYCS6rrrk&r`6\nqrr0dDB&XJBF%K)rhrrk&r`hqrrf\"CfeXE'eQK2rrrSAr\"2lrmR4TJ@b\"K`5%N!$\nhrrk&r`hqrrb\"CfeXE'eQK2rrrSAr\"2lrmR4TJ@b\"K`1&MI6rKrd+r[YqCfeXE'e\nRJIb(r36mrr\"bDS&XJBF&L)(@rrhqK2m$rIrDDB0X!f[Grrf%r`AqrIr*C@f\"E)#\n(\"SD(K)h0k1U%k3hUchPSE@YXE'YYCh[4kSAT\"HV&F@PXDi\"XJBF&KSH&IA&XK@d\n$C'KXDi&X!fYYD'5'E34XBfPXDi&XJSF&KSH*K@pTK'X#E@aVJf`#DfeYKfX#E@a\nVJQb#K`D'KiD)KA\"UK'`!Di9X!'Z*E!\"VJfb$K`L'KiD)K'pUE'ZHE)5(#)D(KSL\n%EfTXDjeXKBF)KSH'L)4[DQaVR'`\"KiD%K`L'KiD)K'jUE'ZDE!&VKSD(#)D(KSL\n%EfYXDjKX!@YXJ)D&K`D'KiD)JfeVQ'`#DfaX!33%U!@\"\"!%&\"+N&!33%[38\"\"!D\n(#!%'\"*i&!J3(!BF!!J%(\"*`&!`3'!#5'8J44)!!'\"*S&\"J3(!&lmrrk$r`EqrrG\n2!!F%QJ8%!4(NrrU&r!EkrpB)!`8%Q!8%\"J!Qq2q(rJErm#!\"\"38%P`8&\"J!PqIr\nqKIm)r[ra)!B(\"!8%PJ8&\"J!Pq[rqKIm*r[rb)!B0\"J3&\"*8&\"3B!*[VrrSAr#[l\nrmL!'$3X'\"!8%P!8&\"J!Qq[rqKIm,r[rb)!B0$!X'\"!8%N`8&\"J!Pq[rqKIm-r[r\nb)!B0#``,\"33&\"*)&\"JB!*[Rrr[k$r`lqr[ra)3B0$!X-#`8%\"354\"3F'!\"rdr[l\nrrS(m%2lrrIrV'`J0$!`,$!X&\"!8%N384\"J#ZrrcqrIrqrrrpr[crS3!1J3`'#``\n,\"33&\")m&#!3'!Jq6rrrc`i$%\"r6rriS1#3`,J3`'#``+\"33&\")m&%33*!(2rri8\n!\"JB!L[rrC!!3#i--\"JX-#J8%\"351\"4%'!#IbrpS5#Ji1#4AGrqNI\"`f%$!B,$!S\n&\"!8%M385\"`#QrrpF!!m-$\"!!BIrrQ!!2#i3-\"JX-#J8%\"35+\"3J%#!\"(rrqk!`f\n\"$!J0\",lrqM`\"$JZ%$!3,$!S%\")i&%FVrq6N\"$JX-$!X1!6ckrld%$BB-\"!X-#J3\n%L38*\"!J!EIrrP3!2#i%-#3X2!*Mrrf!!$`Z&$!-,$!N%J`8\"\"!@\"\"`J)!4VQrqF\nG\"`f$$!J0\"arSrp`8#`q\"$J%-#i!-!JX-#S)&!J3(!i%!#!)!P[rrC3!5#i--#!X\n5!'IrriJ!\")%\"!JS1#i!-!3X-J384\"!B!$cBh0cNa9[IrhcdC!Jd,J3`4#`d#'Ml\nJrr\"41$ip26X5\"!d,J!`!#i!&(J3(!$VMrrlqrrrqrIrlrZj1!!i,$!`,$J\"8m2l\nlrrf!r`Iqr[rK1!-1#i!-JJ8$!m[rr)(q#2hqrrlmrpd6#B%-#!JBj2rpr[rqrB(\nq!r[ra!D#$)!&\"3B!&qhrrB,q!IrrJ2i1qLi%$3`-$J)drIhqr[rrJ[i%rIrS'3L\n\"$)!&\"3B!&qlrrBAr$Ilrr#m$$3`-$J)drrrqKIm&rIrU'JJ0J!b!\"38'!\"I[rrf\n&r`hqrr`[!`d-$!i#02rrrSAr\"IhrkaN)$B!-J!8&\"J!AlrrpKIm0r[rm,`-0$!`\n1!M6rrrk&r`AprqXD#!f!$)!&\"3B!&qrrrBAr$Ilrr#m$$3`-$J)drrrqKIm&rIr\nV'JJ0J!b!\"38'!\"I[rrf&r`hqrr`[!`d-$!i#02rrrSAr\"IhrkaN)$B!-J!8&\"J!\nBl[rpKIm0r[rl,`-0$!`1!MArrrk&r`AprqSD#!f!$)!&\"3B\"%qVrqiAp$Icpq#X\n%$3`-$3-[qrcmKId%qrrQ&JQ\"$)%&\"3F!U[rlrS6r!rcr``L#$!3,#XMrr)6r\"Il\nlrkF!$S%-J!8'\"!B\"&D2Hfi2F$p[GVb-&$3X-$!X0\"5HdhGZ$h!EEhCm@#!d,J!b\n\"\"38%\"33!#`q%$J30!3F0#i%-!`X0\"`''$J3-!!N-#i%-JJ8'\"!B(\"!N,#S%,\"!S\n,$Jd,J``%#`d1#`U$#`3+#`m0#i)-J`8!\")!&!!Z&$!!,K3`!#iN-!!Z$$)3&\"J3\n&\"!8+$!ZI$)8&\"J3&\"!8+$!ZH$)B&\"J3&\"!8+$!ZG$)F&\"J3&\"!8,$!ZC$!-,$!X\n%K`8'\"!8%\"3S-#jS-!!Z!\")B&\"J3&\"!8,$!ZA$)!,D$KYD`!!#3KBm2rqr[rrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[lrl%rSrrlrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrprprpr[rqrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlqrrAqrrlrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrAqrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrErrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrEqrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrEqrrlrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrAprIlqr[lqr[l\nqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqrrAQrrlrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrprpe2jIMep[Efp[E\nfp[Efp[Efp[Efp[Efp[Efp[Efp[Efp[Efp[Efp[Efp[Efp[AjidKTG$-b!!!X0J!\n!!!#$l`(`lqh`!Hr`Kqm#m2$[lr!#lr$`Jqm$m2$[lr(`!qr[m2#\"l`(`lrA`!Hr\n`J1m\"m1rim)$[qr!!lrh`!1rlm!$[rr$rm2r`rr#Rm!$[Pr!!lpl`!1qGm!$[f[!\n%lr$`lqkAl`6Zlr$`lpM`\"Hr`lqrdq*El\"[Vimqr[m1r@m!I[m1rbqrrqrTArJ2i\n%q[$[m1r8m!A[m1rbr[qErJErr2$[lr$[dr!$lr$mrjhq\"[rflI$[m1r3m!A[m1l\nerrkEr`Iqr[rqk1h`lp2`\"1rkrrlqQrm(r[lrlGr[m1r4m!6[m2crrTcr#2lqrr6\nEiZr`lp$`\"1r`r2rqR2m*r[lrpYhHiZr`lmr`\"1r`r2rqR2m+r[lrpYhIhH2[m1r\n1m!6[m2crrTcr#rlqrrEGhprGiqr`lmh`\"1r`r2rqR2m-r[lrpYhIhYrGir$`lmc\n`\"1r`r2rqR2m0r[lrpYhIhplIhH6`m1r,m!6[m2crrTcr\"2lqrrEGJ0m'hYrGj2$\n`lmV`\"1r`r2rqR2m%r[lrpYf!h`IHhprGjI$[lmR`\"1r`r2rqR2m%r[lrpYf\"h`I\nHhprGjI$[lmM`\"1r`r2rqR2m%r[lrpYf#h`IHhprGjI$[lmI`\"1r`r2rqR2m%r[l\nrpYf$h`IHhprGj[$[lmE`\"1r`r2rqR2m%r[lrpYf%h`IHhprGj[$[lmA`\"1r`r2r\nqR2m%r[lrpYf&h`IHhprGjr$[lm6`\"1r`r2rqR2m%r[lrpYf'h`IHhprGjr([lm2\n`\"1r`r2rqR2m%r[lrpYf(h`IHhprGk2([lm,`\"1r`r2rqR2m%r[lrpYf)h`IHhpr\nGk2([lm(`\"1r`r2rqR2m%r[lrpYf*h`IHhprGkI([lm$`\"1r`r2rqR2m%r[lrpYf\n+h`IHhprGkI([llr`\"1r`r2rqR2m%r[lrpYf,h`IHhplGkI([lll`\"1r`r2rqR2m\n%r[lrpYf-h`EHhplHk[([[r!%lr[rr[kEr`6qr[rchBhI\"YlIhYlUmHqmm!E[m1l\nirrlqR2m&r[rXh0rHM0m'hYrHhZVallh`\"1rcrrlqQrm%r[rmiGk2h`EHhplHkr(\n[Zr!%lr$Zq2q!rS6rLIk%ri$q\"2rVh0rHMpm'hYrHhZc`llV`\"qr`lqrjrrlqK2q\n*rJ(rrS,r\"2lqrqlGNpm)hYrHhqc`lr$[Z2!&lr$[lrAmJ2i(rrrqrrlqrrk$ra$\nqrrlqrrlrrrlqrIMRh0rIhT,I#0lIhYrXm1r`llM`$Zr`m1r[qIrqr[rqr[r`kSA\nV$ZVbrrlrrrlqrqlFhGrIhT6I\"YlIhYrXm1qkm!c[m1rbr[rqrrlqrrMGKp`#h[R\nrJIi&rrVJhYrHPYm'hYrHhqh`ll[`\"1rkrrlrJ2i#rqEGKYm$i0hSri,q\"2r`h0r\nHPpm'hYrHi1h`llI`$Zr`l[6rr[lrrrlrmpcIhSII$0herrlrr[lrrZ6GhpkAh`M\nHhplJlI$[m1qem!2[m2crJIi&rrhLhYrHKGm&hYrGirlrJIi#rrAGQYm)hYrHi1l\n`lr$[X[!1lr$Zprrqr[rrr[rZh0rHKpm'hYrFlrrqri$q\"2rSh0rHQ0m)hYrGi1l\n`lr$[X2!&lr$[mIlrJIi$rrRIhS[I!plJqrq\"rJ2rqGrHQYm)hYrGiHl`lr$[Vr!\n%lr$ZqIq#rJ6rk0cIhSRI\"0lIh1VrJ2i'rrlrlGcIhTRI#0lIhH(Zm1r`lkh`$1r\n`lr2rr[lrr[lrpGf2h`,Gp[q\"rJArrH,HhpkCh`EHhphKlr$[X2!#lr[rJIi&rrl\nNhGrHLpm$hYrGjB(q\"[rqrr2FhpkDh`EHhphLlr$[V2!1lr$ZpIrqr[rrr[r`h0r\nHMGm'hYrFmIrqri$q\"2rQhGrHQYm'hYrGiZr`lkc`#qr`rIrqrrlqrr[JhT(I!pl\nKr2q\"rJ,rppkGh`EHhphMlr$[UI!1lr$Zq2rqrrrqr[rVh0rHMpm'hYrFl2rqri$\nq\"2rVh0rHQpm'hYrGiqr`lkI`!qr`lr+!rJArr[lrppk8h`2Hh[MrJIi$rr[JhTh\nI\"YlIhH2`m1qSm!6[q[rqri$q\"2rQhGrHNGm%hYrGjrq!rJErr[r`h0rHR0m'hYr\nGj2$`lk6`$Zr`l[6rr[lrrrlrmYcIhT2I\"YlIh22rr[q\"rJ2NhGrHR0m'hYrGj2$\n`lk6`!qr`r2q\"rJArr1,Hhpk6h`cHhphLrIrqr[rqrrEGRYm'hYlIhH6`lk,`\"Hr\n`l[IrrS$r\"IlrlGcIhTAI\"YlIh1lrr[q!rJ6rkGcIhTcI\"0lIhphPS[!&lr$[mIl\nrJIi$rrRHhTRI!plIqIq\"rJ2rqYrHRYm%hYrIhH5Km!E[m1rjrrlrJ2i%rqMFhpk\nAh`6HhpcSri$q\"[rqrqlFhpkGh`2HhprHS2!-lr$[mrrqr[rrr[rdhChI$0herrl\nrr[lrrH,GhpkGh`,Hhpq6m)V[\"2$[lrcrJIi&rrhMhGrHQGm2hYrGj2lrr[lrr[r\nchGrHhiRHNYm!hT!!m!$[MI!1l[Err[lrr[lrm0hJhprHPpm'hYrIi0h`ri,q!rr\nRhH#-h`$HN!$IM[!%lr$`lqq,lJ,`rIq\"rJRrqGhFh0hHhprHNpm*hYrIhYhFh0h\nkri(q![rihB[F\"0hHhprHMYq0m!A[m1rZmI5*pK2hp[Vrr[rrr[lrpZhZl1EIh0r\nIhT(I%YlIhpcIjqhZlIErr[lrrrlrmqf*lJEYk1(FhYrHMGq-m!I[m1r`q2hrrSV\nr!IlqJ[m,r[lrr[lrqZRGhprHMpm,hYrHhHVkrrlqrrlqJ2m$r[rqrSVr\"rlrr1r\nHhYrHM0q,m!A[m1r`r2q1rJ(rrS$r!IlrJri#rqrGNpm#hI(rJri\"rrk!r`(qril\nq\"IrhhplIhS[IMI!#lrVrMrk%ri6q\"2rUh0rHMGm%hYrFlIq%rS6rMri#rr2GMGq\n-m!6[pIrqrT[r\"2lrqq$HMpm%hZ,prrkDri$q![rRhBcIM2!%lrVrr[kEr`6qr[r\nThBhI\"YlIh1crr[kEr`6qr[rch)cILr!%lr$prrkFr`Eqr[r`h0rHMGm%hI2rr[k\nEr`6qr[rihScILr!%lr(prrkFr`6qr[rbh)rI\"0herrlqR2m%r[rli0k,hi[`\"1r\narIrqR2m%r[lrmpf2h`6Gp2rqrTcr\"2lrqq$HLpq,m!6[mIhrrTcr\"2lqrr2FMpm\n%hIArr[kFr`6qrr[JhS[ILr!%lr(prrkFr`6qr[rch)rI\"0herrlqR2m%r[rli0k\n,hi[`\"1rarIrqR2m%r[lrmpb2h`6GpIrqrTcr\"2lrqq$HLpq,m!6[mIhrrTcr\"2l\nqrr2FMpm%hIArr[kFr`6qrr[JhS[ILr!%lr(prrkFr`6qr[rch)rI\"0herrlqR2m\n%r[rli0k,hi[`\"1rarIrqR2m%r[lrmpb2h`6GpIrqrTcr\"2lrqq$HLpq,m!6[mIh\nrrTcr\"2lqrr2FMpm%hIArr[kFr`6qrr[JhS[ILr!%lr(prrkFr`6qr[rch)rI\"0h\nerrlqR2m%r[rli0k,hi[`\"1rarIrqR2m%r[lrmpb2h`6GpIrqrTcr\"2lrqq$HLpq\n,m!6[mIhrrTcr\"2lqrr2FMpm%hIArr[kFr`6qrr[JhS[ILr!%lr(prrkFr`6qr[r\nch)rI\"0herrlqR2m%r[rli0k,hi[`\"1rarIrqR2m%r[lrmpb2h`6GpIrqrTcr\"2l\nrqq$HLpq,m!6[mIhrrTcr\"2lqrr2FMpm%hIArr[kFr`6qrr[JhS[ILr!%lr(prrk\nFr`6qr[rch)rI\"0herrlqR2m%r[rli0k,hi[`\"1rarIrqR2m%r[lrmpb2h`6GpIr\nqrTcr\"2lrqq$HLpq,m!6[mIhrrTcr\"2lqrr2FMpm%hI6rr[kFr`6qrr[JhS[ILr!\n%lr(prrkFr`6qr[rbh)rI\"0herrlqR2m%r[rli0k,hi[`\"1r`rIrqR2m'r[lrmGc\nIhShI\"0hcrrlqQrm&r[lrqYrHLpq-m!6[qrrqrT[r\"[lqrq[Fhpk,h`EHhpcYrrl\nqQrm%r[lrpGf-hiV`\"Hr`l[ErrT[r\"IlqrrhLhSrI!GhMJIkCr`IqrrlrkYcIhSV\nIM2!$lr$mrjhq\"2r[h0rHMGm%hYrFmIqGrJ2rq0lHM0q,m!A[m1rbrIqErJ2rpGl\nHNGm$hYrfrj[q\"IrliphIhS[IM2!(lr$[mIMqrrk9r`Iqrrh[hYlIhSrI\"plIhYr\nbr[rqPIm(r[lrpH,Ghpk-hih`\"Zr`lq[Rm256p3MdpI2YipcHhpk4h`MHhplFj1l\ncpI56p3EdlqEGhGrHMGq1m!A[m2(Th0b9h3AFh0lIhpk6h`6HhprGh*IG\"0cGhpr\nHMYq3!2!$lr(VhTMI!0k@h`$HRGm!hSrINI!'lr(UhYlIhT,I!0kEh`$HPpm!hT,\nIN[!'lr(UhYlIhZ(INr!'lr(UhYlIhZ$INr!(lqrakYlHhplIhj6`\"qr[mHVHhYr\nHhYq9m!I[lr(UhYlIhYhIP[!(lqrakGhHhplFhjI`\"qr[mHRGhprHfpqBm!I[lr(\nThGrIhYVIQI!(lqrakGhIhplChjV`\"qr[mHMGhprHf0qEm!I[lr$ShGrIhYIIR2!\n(lqrak0hIhpl@hjh`\"qr[mHMGhprHeGm!ljh`\"qr[mHIGhprHdpm!hTr`\"qr[mHI\nGhprHdpm#lr$[RI!(lqr`jphIhpl3h`,HhZqJm!I[lr$RhGrIhXrI\"GlIlqr`ljl\n`\"qr[m1EGhprHc0m&hYrHhqr[SI!(lqr`jYhIhpl-h`,HhZ'#ljr`\"1r[m1EGbpq\n\"hJ(Ji)2[!I$[RI!'lqr`jGlIhXEI\"plIhYrIiH(IJSEaK`''KiD'pBH$KJ+(KiE\nfK`@'KBD'KiEeK`''Ki#'!BH'piF$KSH'K[U(!BD'rBF!K[q(riIrKrq(riHMK`#\n'QBF!KYf(!iD(L)LAK`1)L)H'fSF&KSL'Ihq$PB3&JRk!KiH'f)F'KSL#KDh5ijA\nP\"Z(-TB+%L)E@K`H'L)#EjrrqrTAr\"rlqrpb2JSL'e)F&KSL\"R[MrQrd'rqb1K)H\n(KY1(\"B@*k[rmrjVq\"rcrdAk*KSH'd)F(KSKqYrrmrrkCri$q\"[q2IiQ'KiE3K`@\n)JGhrrIkEr`Rqr2qdCSL(KSH'ciF&KSMXrrlqQrm+r[hrcf*cKSH'KiE1K`5&LZr\nrrTcr#rlprpKQDh+'KiD(KXf(\")D+lrrqR2m-r[href9YDA+'KiD(KXb(\")D+lrr\nqR2m0r[href9YE'PcKiH'KiE,K`5'LZrrrTcr$2lprpGPE@aXDA1(KiE-K`5'LZr\nrrTcr$IlprpGPE@aVE'PdKiH'biF%KSV[rrkFr`lqrIrAC@eXE'YXDA@(KSE+K`5\n'LZrrrTcr$rlprpGPE@aXDfaXDA@)KSE*K`5'LZrrrTcr\"IlprpGPEB\"X\"fYXE'P\nfL)D'b)F%KSV[rrkFr`AqrIrAC@f\"E!GVE'aTGiL'KXH(\")D+lrrqR2m&r[href9\nYJQ`(DfaXDAL)KSE'K`5'LZrrrTcr\"IlprpGPEB0X\"fYXE'PiL)D'aBF%KSV[rrk\nFr`AqrIrAC@f%E!GVE'aTHBL'KX5(\")D+lrrqR2m&r[href9YK@`(DfaXDAQ)KSE\n$K`5'LZrrrTcr\"IlprpGPEBCX\"fYXE'PkL)D'`SF%KSV[rrkFr`AqrIrAC@f(E!9\nVE'aUHiL!KX#(\")D+lrrqR2m&r[href9YL'`)DfaXDRb)KSH'[iF%KSV[rrkFr`A\nqrIrAC@f*E!KVE'aUI)L'KiDqK`5'LZrrrTcr\"IlprpGPEBTX#'YXDfTpL)D(KVf\n(\")D+lrrqR2m&r[href9YLf`'DfaVDRk)KVq(\")ARrrhqQrm&r[hrbf0YM'`)Dfa\nVDhk)KSH'ZiF%L(l1rrfEr`IqrrcrUQ&ZDiaX#'YXDfYrL)D(KVQ(#)D)JD(rrIl\nrrTIr\"[lrr[rdH@L2E!KVE'YVIiL'KiDkK`L)J-[rr2hqrrk#riRqJ[m*r[rqrIc\nrU@*ZDipX#'YXDfZ!L)D(KVL(\"BD(KS69ri$qJ2m%r[rrrIb&r36mrIrqrS$rJ2i\n$rl9NEC*X#'YXDfb\"L)D(KVL(\"SD(KB+hl[b!rJErr[rqr[rqJrm'r[rqr[rqri$\nq\"[VKPQ0XE'Z5E!KVE'YXJBL'KiDiK`H'KiH!JYMrrB$q\"2hr`+#QJk82TTr'rrh\nrr[lprlGIC@eXDj4X#'YXDfb#L)D(KVL(\"BD)Jj[lri$q\"2hri'CKK@)%B'VRrrf\n!rJ2rlA4VQ'`)DfaUEB1)KSH'Z)F%L)(Grrf!rJ6prj!!C(#&EJ4`BjMrrB$q\"Ih\nr['&ZDjGX#'YXDQk$L)D(KV@($SD)IkhrrIlqrrhrb@0YDiCX$@ePd[rprrlqrrZ\n%CQeVPf`)DfaUES1)KSH'YBF$KSRXri(q\"IrhI@GYDi9X$@YYCS2lrrlqrrhrdf9\nYQ@`)DfaUES5)KSH'XSF1KSPq`Irprrlrr2qbB@jVKf`1DfjKZ[rmrrlqrIqDBQj\nVQ'`)DfaUEi5(KSH'X)F&KSL$PIRrJ2i%rIrREQU,E!0TFZhrJ2i%rIrREQZDE!K\nVE'T[KBH'KiD[K`k'L(r8rrhrr[lprjTLEQZ*E!jVEQ'Krrhqr[rmrl&KEQZCE!K\nVE'T`KBH'KiDYK`5'L)#Pri$q\"Irprp4PEBjX!fIDrrf!rJArpheRE@ZCE!KVE'T\n`KBH'KiDZK`1&j[rpJ2i&rrb&C@eVLf`$DfeNLi(q\"[rprmPMEQZDE!KVE'TaKSH\n'KiDUK`k'LAkirrhqr[rmrleKEQZ0E!jVEQ,$rrcrr[lprj!!C'jVQQ`)DfaTFSD\n(KSH'USF$K)rdri(q!rr[G'Q4E!0SH22rJ2i$rIrIDCeX#'YXDA+'KiD(KUH($SD\n)IXcrrIrqr[hrT'&ZDipX$QYZBDVrr2rqr[hrTQ&ZDjYX\"QYXDA1(KiDRK`1'L)'\nHJ[i$rIrGD*4X\"'YViIrpJ2i$rr&eDCeX#'YXDA1(KiD(KUD(!i,Irrf\"rJ6rMQ4\nYDj&X$QYZBj2rrIlqrrcr[f&ZDjaX\"QYXDA5(KiDNK`k'L(q`rrhqr[rprmGLEQZ\n6E!CVE@2-rrhrJ2i%rBGPE@ZFE!CVE'PeKiD'T)F$KBVZri(q\"IreHfGYDj0X$@Y\nYChlirrlqrrhreQCYR@`'DfaXDA@)KU+($SD*IX6rrIrqrrcrVf&ZDj9X$QYZBE2\nrr2rqr[hrR@*ZDjaX\"@YXE'PfL+'(\"BD)JTIkri$q\"2hrj@eVQ@`%DQrSrrf!rJ2\nrkA\"URQ`%DfaXDR5KK`k'L)$Arrhrr[lprjKMEQZAE!jVEQ+Errhqr[rmrl9KEQZ\nGE!0VE'aUS)F0KSKrU2rpr[lrrIr4C'fEE!eYCG6rrIrqr[riIfGYDjeX!QYXE*+\n(LSB&KiH'KZMrJIi&rrU$CQeVQ@`2DfePKIcrr[lrrIr-BfeVE)PVNQ`!Dj!!K`1\n'KiL)L)N3L)YqZrrprrlqrIqmC(\"YE'ZAE!GVE'e`C,lrrB$q\"2hrNQ4`Lfi\"E'Z\n3!'b1K`5'KiL%IiPq\"(pkMrErJ2i+rIrRCepLC'YZE'Z6E\"&VE'jUBf*HD1RrrIl\nqrIrLCPq+B34LD'jXDijXMBF'KSL&IT+`[iM#%m1qh[rqrrlqrIrCVVDXN@eLE@a\nVN@`6DfaYBQq8VEDZf[rpr[lrr[r*X,@)Y!DaQhKKDQeVM@b-K`H'L)1+b[RrrSM\nr\"Ilrr[lrrS$r#rlqrrlqrqUIC'aXDipX#fYXDf@MlIrqr[rqrS$r\"Ilrr[lrrSI\nr#2lqrrDlE@KYDiaXLiF'KSH$N!$Urrk,r32mrIrqJ2m#r[rqJ2`&rIlrZ@4YNQ`\n%CX2rr[f!r!Mqrrlrrrlqrrf,r!IprIrHF@PXDiYXMBF$KH$rr)lqK2q#rJEpr2q\nMBQjVM@`'DfjLX2rlrB,qJrq2rJ6lrmePEBaXLSF(KSKrX[rmrrkBr`EqrrhrlR*\nUMf`'D([frrlrrTMr\"rlqr2q6C'eVLQb-K`5#h[rprTVr\"rlqrIqGBQjVLf`(Dfj\nKUrrmrrkDr`Aqr2r*Bff,E)Z(\"B@-m[rqrT[r\"[lmrlaKEQZ-E!9YBmRrrIkEr`A\nqrIrNDfZ,E)Z(\")54q2rqR2m&r[craf*ZM@`&E@66rrhqR2m%r[rZF@U,E)Z(\")5\n4q2rqR2m&r[crb'0YM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*\nZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m\n%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")5\n4q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*\nZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m\n%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")5\n4q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*\nZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m\n%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")5\n4q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*\nZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m\n%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")5\n4q2rqR2m&r[crb'*ZM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")54q2rqR2m&r[crb'0\nYM@`&E@66rrhqR2m%r[r[FQU,E)Z(\")@0mrrqR2m&r[cr`@*ZM@`&E@2+rrhqQrm\n&r[hrk@jVLfb-K`5$i[rprT[r\"[lmrkGKEQZ,E!CVEQ'arrcqQrm&r[hrdf9YLfb\n+K`H'L(kmrrcrrTRr\"IlqrrGmCijX!feQK2b!rTRr\"rlrr2qMBQjVLQb-K`5&LZc\nrr*Rq\"rrqqrqjBQjVMQ`'E@2#rr[qrjRq\"2cri@aVM'b,K`H'L)'Gq2rpr*Ep\"[c\nmrIr6DQZ2E!GVE'TYfrrpr*Ip\"rcprr'\"CQeVLfb-K`H'L)#BiIrqrTAr\"rlrqlY\nUD@eVMf`(DfeSEXEprrk9r`Iqr[rAI'9YDiaXMBF'KSL$IC@pd*A6\"XUZJ'*VE@Z\n4E!CVE@TMKE2-PG-'clQ2CQGYDieXMSF'KSH)Gf&MCC4N\"@0KCfjXDj0X\"@YXE@C\nKBj9N\"@0KC'aYDijXMiF%KSD+J@b@E3*ZE@Z@E!0VE'eZPfd$EQeXDipXNBF%KSK\nrDfZ8E!\"VQf`!DjGX!'Z5E*+(\"SD)IQYVE'[KE*1(\"SD)IQYVE'[JE*5(\"SD)IQY\nVE'[IE*1(#)D(KSKqDQYXDpjXP)F)KSH'L(eUDfaVh@b9K`L'KiD)I@TVE'[FE*D\n(#)D(KSKmDQYXDpYXPiF)KSH'L(aUE'aVfQbCK`H'KSKmDQaXDpPXQSF(KSD)HfT\nXE'[BE*Z(\"iD'L(YUE'aVefbFK`H'KSKlDQaXDpCXRBF(KSD)HQPXE'[9E*k(\"iD\n'L(TTE'aVe'bIK`H'KSKjD@aXDp0X!)DIK`H'KSKjD@aXDp\"X\"'YVKSH'RSF(KSD\n)H@PXE'[2E!9VE)D'KiDHK`H'KSKiD@aXDmaX\"@YXDfb&KU'(\"iD'L(KTE'aVc'`\n#Dfa[JSDIK`H'KSKiDQaXDmKXJ'X#E'jYJiB\"KiDGK`D'KSKeDQaVb'`&DfaXF'p\nYJJ6`\"3%%\"BF%p3@$\"!)&\"36b\"3)%\"!@#\"!%&\"28&!33&J!3\"\"36i\"B!%!38%q38\n!\"2d&!!6r\"Im&r`Ar\"Im&S`8!\"2S&\"!3&#!J'P38%\"JJ(\"36D\"3)%\"`5E!!)'\"J6\nB\"3B%\"`!(9k6'NmX)bX[#Q%8\"!`B%eJ8(\"!F!-XrrrIk9r`Iqr[qi'`!(\"03&\"`3\n(!$Varr[lPr`(qr[rf\"X!\"J68\"38#$GErq[qBrJMrr[RrU`!'\"364\"3F%#!\"XrrV\nrrTRr#2lqr2mp!!F&\"0%&\"3B!Z[rmrT[r#2llriJ!#!3&\"0!&\"3-+fIrprT[r#Il\nlrl!!$!3%\"362\"33#$0rrrCcr#[lmrlm\"$JN%\"!8%cJ8%!J[IrrfFr`[qr2qq!3i\n-#33%\"360\"33#$0rrrCcr$2lmrli\"$J`-#33%\"36-\"33#$0rrrCcr$Ilmrli\"$J`\n,$!N%\"!8%b`8%!JcIrrfFr`lqr2qq!3i-#`X-#33%\"36+\"33#$0rrrCcr$rlmrli\n\"$J`-#`X-#!3&\"36*\"33#$0rrrCcr\"Ilmrli\"$S!-\"`X,$!J%\"38%b!8%!JcIrrf\nFr`Aqr2qq!3k\"$!F,#``)\"!8&\"-F&\"!)-hrrpR2m&r[cr[J%1JJ`(#`X-#!3&\"36\n'\"33#$0rrrCcr\"Ilmrli\"$S--\"`X,$!F%\"38%a38%!JcIrrfFr`Aqr2qq!3k%$!F\n,#``(\"!8&\"-3&\"!)-hrrpR2m&r[cr[J%1K3`(#`X-\"`3&\"36$\"33#$0rrrCcr\"Il\nmrli\"$SB-\"`X,$!F%\"38%`J8%!JcIrrfFr`Aqr2qq!3k($!F,$!`(\"!8&\"-%&\"!)\n-hrrpR2m&r[cr[J%1L!`'#``-\"`3&\"-%&\"!)-hrrpR2m&r[cr[J%1L3`'#``-\"J3\n&\"-!&\"!)-hrrpR2m&r[cr[J%1LJ`'#``-\"J3&\",m&\"!),hrrpR2m&r[cr[J%1L``\n'#``,\"J3&\",i&\"3)-h[rprT[r\"Ilmrli\"$S`-\"JX-#`B%\"35q\"33$c[rmrT[r\"Il\nlrkN!$id-\"JX-#`B%\"35m\"3B)!*[rqrrqQIm(r[rlrh-!$`Z0$!B,$!X'\"!8%Z`8\n(\"`!rrrcqrrkAr`IqrrhrlL-'$Bm-\"JX-#`B%\"35l\"3J(!*IrqIcqrrk#riRqJ[m\n*r[rqr2VrF3!2#j!!$!B,$!X&\"!8%Z`8'\"!@UrrhqrS$r!rlrrrb(q`2mrrlqJIm\n&r[hrKJ!0N``'#``,\"33&\",N&\"J3'\"!*VhIU!rJErr[rpr[rqJrm'r[rqrIrqri$\nq\"[M18`!0$!Z6$!B,$!X&\"!8%Z38(\"!B'!!#`rrb!rJ6prjKMEB0V$feLSIrmrrl\nqqrq*!!31$!Z9$!B,$!X&\"!8%Z38&\"!F!-rMrJ2i$r2r-\"B8!$3%!$GIrrIlqrIr\nK'JX0Q!`'#``+\"33&\",N&\"!B!Z[rmJ2i%rIp+!\"1&$`36!&Irr)$q\"I[rN3!2#jJ\n-\"JX-#J8%\"35f\"3i%#!\"Drrcqr[rlrkF!$`Z'$!d1!EErr2rqr[rj03)1#jJ-\"JX\n-#J8%\"35f\"33#$pRrrB$q\"Irb+J30#i8-$3X1!M2irrlqrrcrZ!)1QJ`'#``+\"33\n&\",-&$J3)!),rqrrqrr[rJ3!3#iF-$JX2!)lrqrrqr[cr@3!2#jN-\"JX-#J8%\"35\nb\"33'!#Rcri$q\"2hrf\"%+LJ`-$3JBi[rpr[lprpF4#TX-\"JX-#J3%\"35a\"3d(!+M\nrqrrqr[cr@J!2#iN-$JX3!'Arqrlqrr[rJ!!3#jS-\"JX-#J3%\"35Z\"3d%#!\"*rrh\nqr[rmrlN#$Sd-\"!d'`rrmJ2i&rr%T\"!d,QJ`'#``+\"!3&\"+i&\"!3(c2rmJ2i&rrS\nf!Ji,L``$#`i!3)(q\"[rlrkB!$`ZE$!B,$!N%\"!8%U`81\"!J!F2rlr[lrqrq6!!m\n,M3`1#`m!R2rlrrlqrIp*!!m,QJ`(#`X-#33%\"35U\"3d'!\"cTrrhqr[hrj4X)$Bm\n-#`d')ZcrrIlqr2r,#Cd-\"`X,$!N%\"!8%U!81\"!J!Q2rlrrlqqrpU!\"!,M``1#a!\n!G2rlrrlqqrpZ!\"!,Q``(#`X-#33%\"35Q\"33%\"`!kr)(q!rcrb!L8$!`,#mrrr2l\nqrIrS(JF0R!`(#`X-#33&\"35Q\"33'!,lrr)$q\"Ihr4J!2#j%-$JX2!%lrrIlqrr[\nrPJ!2#j`-\"`X,$!N%\"!8%S`81\"!J!Arrmr[lrqrqM!!m,N``'#`i!Urrlri$q\"2X\nk!3i,R!`%#`X-#!5P\"38'!K,Grrf!rJArlbF&$3Z6$!d,$J3Xmrrqr[rmrl`%$Ci\n-\"!X,$!J%S`81\"!J!Krrlrrlrqrpm!\"!,P3`1#a!!Jrrlrrlqr2pH!!m,R3`%#`X\n-#!5K\"38%\"`!XpIq!rJ6prp82#TN-#`S5fIrpr[lprpX6#Cm-!`X,$!LL\"3d(!+l\nrqrrqr[cr9J!2#jF-$JX2!&[rr2lqrr[rK3!3#ji-!JX,$+!&$33)!%lrr2lqrrc\nrY!%1Q``0$J+jrrcrr[lrp#d%$JZH$!%,#j-&L33'\"38%#G$rr)$q\"Iri-`)1#jN\n-$`X1!MEkrrlqrr[rU`!1#`b*#j)-!!Z4\"3%'#)S*$`d!GIrlrrlqqrq3!!!6$J`\n,P``(#``1%`#9rrZ!rJAprdd!%`q*%!)2$3Z3!!b1\"3)%\"JL,!\")\"!\"rXrrhqr[h\nrf!i!!3!+$``,N``3#``2#3!\"!\"$Errhqr[crc`H-!!-'$``,MJb0\"3F%\"J3!(ee\nlJBH!%i*iZrrmrrlqrIr#HBGh5Jm!$J`,N3`6#``0!\"02HBGj`rrpr[lrrIqRIB@\n)K!Cq@b!!#Jd,M3b-\"3J%\"`!4NrArr[k(r`Aqrrlqrrk!r`[qr[rqr[rHB!!-$!Z\n2$!X,$!X$D1,rr[lrr[k!r`Aqrrhqrrk(r`Mqr[raM`m($JZ-$)X&#!3'!\"h8rrh\nmqiVk![crrS$r#rlrrIVlqrhprid\"$C)-%35Grrhmqr[krIrqrrrqr[rlqSVl\"rc\nprmJ@#!d,L`b-\"38%\"F(rqIf0rS6rJ[i'r2VrD!!2#id-\"JX2!(lrqIb#rS2rM[i\n&rIRrV3)0M!b+\"3J%#!\"KrrVrr[kAr`EqrrhriaJ)MJ`($38QmIrprrkAri$q\"I[\nr63!1#iS-L`8&\"J#mrrcqQ[m(r[llred!$`Z,$!F,$`\"frr[rrTVr\"IllrkB!$iX\n-L`8&!4,QrrhqQrm&r[[rN3!2M3`&$`#Rrr[qQrm&r[hrd`X,L`b+\"38'!\"[arrk\nFr`AqqrqN!!q0$!81!,Irr2kFr`6prq39#BX-LJ8&\"J!EmIrqR2m&r[[rT3!2M3`\n&$J#hrr[qR2m%rIrP&JQ,$)S&\"3B!'r(rrTcr\"Illrk8!$id-\"3i!YrrlrTcr\"2h\nrj4B*L`b+\"38'!\"[arrkFr`AqqrqP!!q0$!81!,IrqrkFr`6prq8@#BX-LJ8&\"J!\nEmIrqR2m&r[[rT3!2M3`&$J#hrr[qR2m%rIrP&JQ,$)S&\"3B!'r(rrTcr\"Illrk8\n!$id-\"3i!YrrlrTcr\"2hrj4B*L`b+\"38'!\"[arrkFr`AqqrqP!!q0$!81!,Irqrk\nFr`6prq8@#BX-LJ8&\"J!EmIrqR2m&r[[rT3!2M3`&$J#hrr[qR2m%rIrP&JQ,$)S\n&\"3B!'r(rrTcr\"Illrk8!$id-\"3i!YrrlrTcr\"2hrj4B*L`b+\"38'!\"[arrkFr`A\nqqrqP!!q0$!81!,IrqrkFr`6prq8@#BX-LJ8&\"J!EmIrqR2m&r[[rT3!2M3`&$J#\nhrr[qR2m%rIrP&JQ,$)S&\"3B!'r(rrTcr\"Illrk8!$id-\"3i!YrrlrTcr\"2hrj4B\n*L`b+\"38'!\"[arrkFr`AqqrqP!!q0$!81!,IrqrkFr`6prq8@#BX-LJ8&\"J!EmIr\nqR2m&r[[rT3!2M3`&$J#hrr[qR2m%rIrP&JQ,$)S&\"3B!'r(rrTcr\"Illrk8!$id\n-\"3i!YrrlrTcr\"2hrj4B*L`b+\"38'!\"[arrkFr`AqqrqP!!q0$!81!,IrqrkFr`6\nprq8@#BX-LJ8&\"J!EmIrqR2m&r[[rT3!2M3`&$J#hrr[qR2m%rIrP&JQ,$)S&\"3B\n!'r(rrTcr\"Illrk8!$id-\"3i!YrrlrTcr\"2hrj4B*L`b+\"38'!\"[arrkFr`Aqqrq\nP!!q0$!81!,IrqrkFr`6prq8@#BX-LJ8'\"J%6k2rprT[r\"IllrjS!$id-\"3m!UIr\nlrT[r\"IlprpX4#SX-M!8%!-6rr2kDr`Iqr[[rE`!2#i`-\"Jm!I[rlr[kDr`Aqr2q\nh!3k,$)X&\"JJ!G[rkrrkBri$q\"2rc+!80M3`$$J-dqi(qQ2m(r[rkrfF!$`Z+$)X\n&\"3B#%0RrqTRq\"rrqqIq0!!m,MJ`'$J#ErrRqrjRq\"2VrcJd+M!b,\"38%\"`!im2q\nAq`Imqr[mrlB,#im-\"3X-#4$%rjVl\"[crjc!$$JZ,$)`&\"`3(!$(0rrlqPIm(r[r\njN!!,#!d,M``(#`d(%D,mrrk9r`Iqr[qq+!%2#i`-M38)\"!F!\"Nq8XVHfNEF)YVH\nSHLi!#`d,N3`)#`d*!$D$V,HfNEF)YVH`M%F%\"3i,M3b1\"3)%\"`5D!!-%$``,N``\n$#`d1!jN!!`%0$JZ1$)m&!`3&\"`U@$J-2$`d,PJ`%#``1$`q@$J-2$J`,M`b3!!8\n%\"!8%\"JZ9$!!,c!b4\"3B%\"33'#``,iJb5\"3B%\"33'#``,i3b6\"3B%\"33'#``,i!b\n8\"3B%\"33'#``,h`b9\"3B%\"33'#``,hJb@\"3B%\"33'#``,h3bA\"3B%\"33'$!`,h!b\nB\"3B%\"33'$!`,f`bC\"3B%\"33'$!`,fJbC\"3F%\"!8%\"``-#pN-QJ8(\"!8&\"!F-$![\nB$*X&\"`3&\"33($!`,e`bF\"3F%\"38%\"``-#pB-R38(\"!8&\"!F-#`[8$!!,RJ8(\"!8\n&\"!F-#`[8$!!%RJ8(\"!8&\"!F-#`[4$!3,#`3&\"*d&\"`3&\"33($!X,cJ`(#``,#`3\n%\"35G\"3F%\"38%\"``,#m`-#3X,$!X,\"!3&\"35G\"3F%\"38%\"``-#md-!JX,#S%%R`8\n%\"!8&\"!H!#mN-J3X\"#3U$\"!%&\"*`&\"`3&\"33)$!X,aJ`\"#`b!#`)+#JYd1'eV!!\"\n!#!)!,kl`r[lqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlqrZUH)!!#!%lhrrlrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrqrIrU1J!`mIrlr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqr[rqqrr\nJ'UMrqrrqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrq[q+krrqr[rrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrlprp2prrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[l\nrjIlrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rNr[rrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrqArrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrjIlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rPr[rqrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrlqrq6pr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[l\nrjHMrr[lrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrIr3R[rkrrlqrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrqr[rkri%MjIrlrIlqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[l\nqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[l\nqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lqr[lpq[r\n@%J!kj[rpr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[hrfbS!!J!CLG2Pj1APjHAPjHA\nPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHA\nPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHAPjHA\nPjHAPjHAPjHAPjH6QeB36!!*TBc!i!!\"(9`!!!!aU8#!J$3U(#J!!!\"4QG(P`DR!\nb)!!!!!\"UF$)J!!!!6fT`-QJ!!!!@D@KNFJ!!!3!!!!%!!!3(\"`!!!!!!$f0[E()\n\"!!!!!!!3!!!!)Q0NC@B!\"!!!!!!!!3!$!!%!!!!\"!!!!!J!#!!!!!`!!!!\"UF$*\nMrdrr83!b!!!!!!%!!!!\"!!!!!!!!!!!!!!!\"!!!!!3!!!!!!!!!!!!!%\"`%\"\"`%\n\"\"`%\"\"`%\"rf3!)`!\"3h*PBA4[FMSJ5Q&c8'9b)&CPFR0TEfiJ-5ij-$!Z-Ip5!!`\n!!!!\"!!8%\"!!\"re`!%d\"!5%K35%K35%K35%K35%K3red!&!&!3%K)8%K)8%K)8%K\n)8%K)82pG!\"3#3%\")5&\")5&\")5&\")5&\")5&$rA3!8!d\"!5%K35%K35%K35%K35%K\n3rj!!!!S!!!!!4KB!!Iq6hi(J+,Rr8C9,jFer0'R4#2@b-5RKCM1p3pC5C2[m2Hr\nQ-Ep8r`m[IMCiFbmL$AI*Fhk,EcGF!4[J\"LM&Bmr(hi)!)iNXSG042IGi+YPUC*!\n!6CL'Q6Kb5[)5Ll-Bfd1D!1q!IXM)dcE0S%e+PF1p@PS$[Z%bp3FJq@5kA6#pj`6\n%XZIIJNJDkp!UD5%+ZM6fVeh1ckE(Y5kY01GEXJJ,RPG\"Il'),c*H!KTUmSS\"m&(\n!0[B55(5820HedQ'`'p6IFfcD+*eHIQUfc8cf3hVchi$3$q[4X1Q4kdcXUB0U\"KJ\niii)NrdYiV8Ph&N[\"mkH$jdm$je3T@IPk31Yq,Y-2-pbad%qd)aKBAq4eZ9E*IFA\n`Lh$AGKP#'!dqHI0)\"09q!P,d06p1j5ZeBepH@GK1VUGRJ4Dj338k2(+qNP#U+X2\nN'VmIEalCH,bR0#&+K[dN)$fj%Ip4TE8(V8'4Kp*$0[Zfe+B`#Z-`@K!LURr(fQm\nIDEaq\"`!G`I8NkmZ1\"ea+AX!+T*CeCPaR\"iq&r8$0%p3!bcH4R(h%C#dVpl`pMlb\n&fHTPeGQ-L&3m(1Q(*THb6PkQ\"p@rehq4Vp6B(,N%eGb`0Ih5Jm\"*ZAeqAP\"Nk8L\n3!,TG$J&hTp`a-*2drT43RT!!rb*l*,KYLfEBcZcAp\"aq6(2Z+Mp11H#\"6f4m[SC\nb2kMm\"He\"#k1a(SF+,UZVAcK,iIC'&8-9!ZibDJ[2`2*q\"h(i(B!G`I8QNGHkP5a\n,b9A120!r&@ITBMI-)k`Q&06JHK4IMB\"qe%j)a,K-X![FDQa6*llDD9F&mNaBQrP\nNZjmQZHUm`-fpR&d-2BDX,\"Df[SpbiPD%![q$59b3!2HBD1kZ&TTa5)1dUllbYUD\n`))#c9Zf!ed\"4NrL1[(mIEamFf'mE,Nqr4@L'!HG0fC3\"kKZ3!%T9E(@*er2h*+#\n5&[!lC3e$&arNlM%C4PCr)(5CJ+jBFqCcE'r(fK-ID%`qd)!8jm6RQq\"&NMm8k\"F\nGFaGY!bm5blI#LI6T2m(ceU$jkG!qHSK)ZcM)FK-US8rS1k`,h(e%+,@d(JZ2NV6\nNLCkXLZfp1H%@pT@@Ci\"XC$V63!ilV-S6LUVl`r-BH!)hQZ4V!&X0(hNhbh,Pch%\n4Ic($bDeKBDHT-`C!+GBm-4q$S6BT`RR)J`3H3D09SHQ5(r3+MZ!0'YiS@3MN,l#\n1H01Dm+R&'kX\"jc4r-G\"'U[2+8!c,BbMf+QMr5%3fp#T'[CH%TKSKCQ*0f\"DQel5\n\"kRQLpL(Cbadb$lUSSpp@pb\"54qH\"G$\"R$Gq#FaQ0ENl9XTa%K+M*$,cml49%TIG\nYrcm\"j&8&N!#`!V'ZL9(G@8iI6dY,4S(bahJY$Nm+SVQUapY!apVe$lAS5,H0bQi\n(cH%Q3@!R*3HA-eD2a3+!R1S5+S&#p(a1!JZ)E6r'kUS6M$T$$`QiLdk,l4clALd\nFl\"0rKc\"r'm[p3f(S2`bDBKcK+\"SMUr,XF6Fkk,#XbXD[&-)YiFe0q-`cN!!pm6e\nEaK+U`JVr05fRZ(9bGR%YGI%a8,p(U!I2SYq8ic5e)pI,liPPLD-5$P`T'%DNL\"X\nqrJT\"Jkk86k%dZ5eNe8SJpdRFEXKTbZNL)8+*MbNB[GNhTZiTCkJ1!\"fQ)KK`83d\nRH#X0lj`1%rZ@5JZ1AT5%4Dm6X1jaaq9TZ5dr0LCU+-GEB(9%El#*E#J5ei[LH&Q\nE6X,a51'jJHYBDHAr#ZC)5fMd2ZGX%2T0ANTk-h3*)QR*l2A`$C`&B4!hA9R!*d5\n*Fj8+'pKJje&NBQb6R,\"r)R&+,eVLiE9`Tf6j&h2#f05d3%l3eaHe42%@B(S!k2S\n(#TVD$AE*Y`%8-jD'\"HrNkcd,&%6klR3\"X!XNjq\"9rhr2`SkIK3dIK3\")Yih9NYq\nraGJ4H%mUPQ$dbS(*jMf)ZcLaB(P#j(H&@bL&5#dlFI[dN9C*lEH2!PebSGkd#Jp\n4G*E6lS%M&F!LXh4Jm)D4d+I!aQr[rcK'Sj(@%(*MB93@`NVQ8X`p0-HdeSjZB9#\nRrUX!J[15''H%[0krNLJNFP(pdaZ([f`NqRb'hEqUlmdm89[[A\"-[0,8Mem[[L@@\n+&K'B6&[XRJ49`,(dS-U4*!&c`REZ+fqe+$&fC'k#dejZq2(i!(2LN48'UfB`[LK\ncpAi(d#2mXLD48B5B3GF[\"&M9GIa(U\"2*rhJ+A'MZFaZM5[)\"Y8JDFq*-Im*FiBK\n-f+hd!FdQ9V&iG!2M3JNC$68pKKRPNf4rV-l'69q\"keKjlMI6Ll631%Mm6Z%CQKK\nLDbfJQCk%R22AjAG8VrI#c*TG,T!!-0$)LJLU9VCdFS\",Ijf6b'QYN8,2X'D6V*k\nUX88E3[`+jlTEQlMCK2Zk@J*AAIXl'kNN%1d(0RmXS2m8kr$(H`l%2DeJ(*2NBT!\n!91I3YEiihfXp3%AS5Vercm\"+IJ*3I8'!&1L%0U3(rL93e-q1mIY%91f2&1L&8I3\n&1HTHDB2++F4ecal-%VTGqXKdKH,ECp,2`I2V'$jp-`2Rdf#L($DiTP,8RrISGKN\nbqJGDBPNVI'EX)bSjPZI4)T+`kkPI8C8+(3Il%C9@2fm\"q4AdS[6$TS),FihU58T\n@\"3B$$RU436(J#Cj$Q9)S+q6VKMbbF4NVXekU500U`MJbEB0J3l'qLDq21)c38aP\nS+BR0p1MEi0R,VV6kC$5QE34@Ic2Z9q@Lr%'lS+B-9h)l5D$q6e'`ANHF)H*S`$&\nbahq&VrlM5!2S2bTj0M4CM'(%1,qqU`ff&h%dj6+IG[-dJ(E83VBX)r8bqJZfcZq\n4&*GHp3jUSV,Hq&KRjqqTK)jVapaH3'fA\"VRh(J91HhA@)0$BhU`Q6ckjD3LA)&0\nrCdmiTc\"3S!F%*NehSIR@K0f[c%4hD$3p9Ilr-f0XZ9@e&\"TINL\"[i5f)Fr1-#!9\nH'GZq32J%1j!!91SI3Q`4irK%'j!!U)4&f#q3!-H5dQ1P)NSKe2T@fhR)cLp*\"XN\nbE61G,*08SEIa)&GGiU6SIpbGLXMk-S\"pX61@Xa,XJ3RjC1Z#JAcjTDKHj2&K,De\nT![NbCV\"XE2fqK&hY*%ZGUI3`*DjNThlZr'P'MM6XhK(58NGVZUGDErR[1ILh)Z,\n'KH#Q2Y8,ZYha30N`Q88HNFJe'94-0Z!Nr15)T(VU*hM3AcM$-#Mkrd6djmIES6(\nfh[(iA)#Ad5!hUGI5%+hqAaVJc0EfjQLJN!$*#+hM)m!0$X0C&hd+f03m)GR1q$%\nR-ajr`c%*\"2#Y6-3Dqih`E!LBa)4\"H2Y)63-)##+cVV029LA6a'c\"J%GqX*M1alr\n[ef51(dUYQ#J9'LLmK*64[1,2BfCi0V2L3BBT*UJ\"&jPMdEaT5HmG13*mld6TQ6a\nfb)QF\"8BF4rI#Gb#$X%9X\"k)%&jXhVImR[R%e+[!C!f!IIkKMmT%ca&DcmBh6Y`*\n)IT9`XE@#V3UE'rY`\"i@\"0(m69jp(aRI\"IY\"I(+pbFG`PX)#@HdfBb,Q1D3Zi84F\nfi2bAcbaNmBN#fp+LC4R@JhI,QJ'2C3pSBAkce1!f[eJ(GLkU0R%Sh@-cBl%&)@J\n*541CSekX,\"KBP3H$$V8-@X`UY4lXZm'GJfmPV#ke,5G,hP%0+YliTHCH2VqL'rV\nj3L`4X8j))mLeAdQk2(&[FF@M`b+Z6(U#G@F*Hq[RFm5'$L8qa21P2p6&cGi@L@m\nqfDUr[Y%TdZ2J[SYIF,Xebd&G5R'LTTRV$Zc,!FlaU!*DI!6f+KFD4J!$Hq%@08B\n3Zf5i1elaY1CCqIAE&Z$APjV'@d2QkLHNB)PM#Q`l\",`RaX`3,`UMY-@(\"$9G#S&\n*$-jrpL8RD9aA!l&!'Y-XY#8H61ri!leCb36Pb#@KTcH2a[m@1$r4k,\"83LD(A*D\n5\"efb,R-f+9FK+qNY)aGfBl3)$D*EYC54@8HbV,++G`&fiC!!!9CAm08Q!I\"heiP\nBR\"3Emc1Nji&B+LkG4BZAKid'a%HkYBJSb0j6ref)ii9IEXZ#1E+ph)CfkNS\"\"&Q\nH$T[Yd`b3!1rXN!!KLeJI1rCc3aQplS6JljV[a[QEha$%)\"2V5MANL'V5&RcHTmC\nNM9iqYM4(p*DK@Z`K`(Pf9Qr!Y[[I-`[PJbYX)M#pj0m%+D5-SA!V6#0IM[,qXKq\n)e@Gd)@JD9+LMf4@&m02Ehb,piSPBdB6R$p,+($r2`dBRiAh(iAQ!Pp(S(r)2'Ur\nZkK8r[GU,BRINGR!&$N!ea9TaNhHEQHG#jR#ZYNR)$*RUQ%dDLGljcUe4(R*,%PH\n$IKBBBpPq(aCS'd!+q5X0-CJD1&\")qll&G2-@fQYD`5YjS9aBP)RS*2KarBK#GL@\nl+J@3!-4,(DAKK8(F(F\"6U1(Ge*QfBiP[&\"YG(V-IXdik*6)QH,+)&iq0\"6a0h)*\nPq8SfP,HpZGme4H(IqmZTUN%ViY#ES%U-G[XEX@p5\"%!jl!\"hq)m6NQRm[a%BlB$\nh#Ii1)ZQ%'+32,(-[\"b5MC)aAHk9q*Xjd-VkK'aZIBE!D!45HVr'jiRiHR*)%FI#\n#Bi+`@TY3qTT8G1bc@RY8F\"M2T-BPTDAeblfCN!#pA4II@!Gf,USfF5MGBc0MX38\nKNj`1kPiMJEH#i`h!4#5K9$`Sf%FP@MV*)A,G!hYaNHlM8EXIP[kkP,+i@#mJ5lB\nkMI+b`U#9[Gk1+*V@BpE0lBF2iVK2@hFGjSDbF-25'6e2TS1h'6NAUGfJ1E`d8VE\nGdAJ#$AaZ*$)jTqTlUr3hKGDY3(EJlPpFfD-%C5`-0-F$AC81!jYPCIaQ&VcVTR2\n3PHQCSeP[RmP[AYLEZ[\"MQ0R8M)P*pBiXcJBliULZmpCp3rm,cFLr*`(KKdTIVB[\nj`#*SfE`bkB+Rcdi&hD%E[c'YX311%jIiQY6p@ZqU+LA5i!BSXajicUrDQNHKSiF\n'SGdpSBHQ53`cdJI-ecT[NG2&eL`k9+r$e\"`6F4la5\"52'%FLL1)0SFKM[lLDK,8\nZbEFDUKEZT`@QJ1(*([C%j08cG8GX8$Q$%jQUj6iB(Yr%EU1V#5lR&2m1TT!!cq5\n-D@JIIKHEb0V+F*!!lDGX%e$6P\"!k`di,IN!P2S%i9QV8D+mP6AE!&aA&C5hFAZE\nVH\"(ALC!!Ci*\"ACP6)qG2(f6UR&5jlUfRfK5jkJFf5dc'%&ZNGJmSHSGeB\"CEiG-\nQkSM,SLX1'`M!Z2aqh&@C,fP0Tia`jq0X6!i\"(-fbAUcS,Vk\"&*GabjMjA5VQQer\n@Q(r2`(jq\"$(i#S#,5m('ZR5Qd(+klb3MNp*5b8!fl[6XmF1RDdGh@m'riB`a$fc\nN280D-!PHD)\"pNe34-RA8mr!$ST`%L80#q#mQ&B(QTcNT4rD+pfSSSRHM`fhhM!h\nV`I2eCJqIU(!qIT`!el*1[c@MM@a(AD![&ENV252-!F4FP15f0i,cRkf!hFZ[6VY\nJkclLc@ie+K4`Th!6qfBaX,IEhqq8bpT`#'\"cc8Y8$`di-a23pYi[m`[*6iFJlEA\nKfEaTZa+-G,-\"qj!!KZUbH5i8a,8fSMTh`-Mp3XT&dSVq!UF+-ZANH4VSr'dGded\nBf'cc!FT4HFN@Yf\"lGcZcj#FAl\"dLbke1Ak@YQ%hZ#J`%8VeHBK[4pe+0,N(i2B,\nMf@BVTXLdcfHdpQ6G1@%LbL2#e'cr94'%rJ3VV'33KT-%'%B6dH9CkQ(14E@e$CD\nDC5'LEADDR*!!+Mk[U)cA9$r2KBSFVT+M$hiYUUCb4HY29-eA6!PSRCFmbU)Bb3e\nKp1kGmX-AiQEm!kSF3H\"DGBL,T[La\"Jc+8P@k3-5LRqd5cbb&3*GI#U1`k%@1$em\nieDr`Rfa[V[mKVZ$'LQIPYR,kM$h$9M[U8+F*@!4,qSpdkU5jHibbe0eJ#l0hJQ,\nM3DUflhdmFfZ)m0DlAmr8cajEDHZZpDkCM&YQ5B,E[ZH#\"MJb0cK`$d#d,#(DaJ!\n-Q3M`B@*r3l43U0UQ-#*XprYaAkLhcrHVeYPmmk1bhKp)F8ERGF%p!aXrc+p!YpC\nD6J1r(ISf2%fGUEXaZj1Ea,@dC5j-HZ9FfJbI\"(JIrZEc15pc0+'Z#3h8E#'p%5d\nf#bh+0l*6ZER!3XLNdBl+m64'Jremr1HG*Hb(*f[QK$UR3G-3HF+*U'LjRe\"9P&)\n$eCIZd2PUMV6!F6G-Z6e0`%(c3#&'@lR8bC)a%6H[ar[4&Z`llXlQ2kX#II#bbB-\n(QeUPd$Sb8+cbF#`Ca(DY!'$i`\"RqMa1Y`![Dm$+CCM@(YlUYeN4lV#r!4D+jBA\"\nK-L,)L5(66RJBTpH0'`q[#Eh(+3!GC)EbN!\"65ZRbrbD!dh#L1f*cU0X#MXPH!B9\nj1kP0J6YH%eXSIiE\"X6\"SN8c($D\"04\"U#!A&r2Prd0pI*rK0,k%4FcM([XZNp1!E\nH(KpI)cS['dS8aUUX0ERPqq6F`Zq\"k`Apfl'$qYaq!l-,+Z*X@dV3c0p%84+8V&j\nLTHaq$6ceDRhr'@L9J($XS-6S-9NM\",&$j\"R$#4BSZ@6@mlp,(,E$V@e9)J0@*H'\nM39[[NZ6lZjNE6JJ\"GShQm98MS#QMFaEm5`V,0ch-!hUd(4`'JQ5a5GCFHLjpNBS\nF`jqXMkP[f6)+\"fVqE&h@K[pam!hrBTZ29iRq5p!1!3DQ1ENq'3#b%DHT)i59hYH\n$K6qHEI63%bIJV%@NeX'jbAR9hIPk!4E,&V%dPiHIBkZ9N!!CapZrmIE[Y$lGZpH\nb6VmX`JN1%E2VUXfH$J*L8j0@DeeiRq*GIFFILU-k8F2[U0jrrB+@UX2r*aI8Z*k\nIj!$T[1@'*j!!E6Er+iFTcH1fk5$MefMccdE8Kf3',U*JIDBlG#ZZ`%RN[hT'+b8\n(5#IlJRVj4,KZZ+k\"%*jI!dEF-'+&X!9Qa!\"P8[3&L'+c*Hla%FHQ'%k!!JSG+Al\ndVX8&,#&CBBjj)CMU9VNZJa\"T'CRG-fHjfLC3M2-+G3&`MGh$IGXbPI%ldiR58ZJ\n0P`PpR(d4AKa\"UAAq\")QB,#3VPEMU8K9Nk@PL4'TN8I[r(aTPda5)XHBlp6Z8lce\n!c&-0!ChI3a,m5`ZDr$-3N!!EMC*HLli@@H!$#M5Pp`K0cG634rmJpV51Cq8BGhB\n&PTiIMhqEl'STq\"K*+-p#5jSI(A#,%2GaHmd(k#51E*ZE2%Bi#D)PpBAF`p6dL-1\nZ$TPeE\"@BFGakMN2l,8[BqEb#a\"Q[$%E*B2T@'6Je[hjj(9XEI1)kYYKHN5r6-HF\n@p@`$[%'3!%XQQMpUY#Mpma&Ik`h`8PikLNkXTB@T4iQDpD,NPLK&Jq1USRZr\"\"B\n)f`Qj%DIjF,dNKpj`RTVA9ml@**-$)TQfCf[r5Va+2-M5P&qAZk#kD-))31TN8Q9\nkd)BJ55RYrbD[i@+IGm#QYBb*YhZBj0U[Q0h2SSY@B,6'$m!V'plb9kXZ[)iK4M%\n0qfHBQ)d3AILp'FA-a[K5BmRQUJ%)\"b*NdGqKiP`NIm'KRFKHiIk2NA@E!MYrNjf\nCNfF0VA0cr18(P#4Npd5Rm@-SR+ES\"lDQcT2'\"r4pJHedlZ9SFeSr8hY3Ym'BXJk\nMCQDb*F%%+0$TC9YjeVS@0*rqeB9iZcE2T&DIILhjfh%&3fMa!cK24QT`qC5A0AY\nG3E*BVD%#b2[%#SfN5N3VjM*G'SFZK+6-'eVp''!!`Ri%EL*C'k'qeC1'!Br@di`\nbT#lpG6bMCLSIi[mrVTBm*IQ2!$`N2!lMl6%l,riHIC8Xe+M5Gi9@5$+C0dCDP8Q\n0L1*C3UBpE1@JEQJEBJd+[YlPpjR\"+XlmLqXJZ`,&2AlP5eBaBR5IpXqrCqZS*GD\np8HDkaL!b@)UQmY[E(AVblEESq+#SM3F*!NAHl)iDhh\"FJdTBHe[\"cYEAZJTLqm+\n(!E36@HQ%iB*fh9Z)H-EiFFc9ke!Aj4Cb!b1jb[((0#HPZTK!`Zap8%,8XKlcDH$\nm$NM'f41\"&L86jED83G!J&VAVafYEl,-5Ub(%JXd2[Yh9QKZfCKN(@KA$ZZ\"5#%N\nGAY\"4iNd0+p*2-#HbN9L*U4h)\"iUFGV+RSlF+*eV4$rJ@AShr#GKf\"HlcTQ$VlDi\nQcjj'C%U[eeB5RHm9iT,KJ!G!M3bSkR%#rDjY[`YLeMGrLl[djX4L3VXBSM!1&Uk\nCR+mEh8%hBK#*e![V2cZiH&m(5Pej3r\"Bhj[*G4+PfEiIA3F\"QX0eQEKCpRkk)$q\n,Uk#6[B$`bLC3U1HJ+DJl*RS&mFL\"U&55jZj9mQFl@HME(5dLJIIZMa(fI8Ib5dr\n3FH8*ZCTfa!pqUc%%648a#Ke@hBRlaYH#m4%NERH5Y%1jCdjFmITCqPAa#&f@KUI\nI6JpmX[l&1ap@%h%qYHHS9RH)`#+3!'[hb,iX%J'BRr,kb*0k`0i'IK'[JP49iUi\nc#ID)Gf48pdGh0J'r#9qldD$3'NcRi3LQF&%[$J($'SrhS'V1()8fkqSXqhGf%m,\nVSYBPlB3Jkqraf&!iY#[45EpYdGep*SqNN!#qDJrf-BX'bYrhXpa$k[6IJFHcmP1\nAf$j&JlJF3ZGNmre*E(-Ul,8&DaBj$X+qPi-I2VaqLbBJR9qZJbEq6YkH\"jTb(+(\n#Z`S+0K,V&LfjEb8'f+fm82m&A#FSe41b2'09@jKI5-p4-[e1L%XUIKDiBhXTc6D\nT0Nq6R(#fAYGAUbNA*@l0qmFeImr$SBRiG$NIKZ@!ekL#ITXK!dfNiE*dCh[c$N(\nI[aZ%Heaia9*!YM&!$P&BNRlFCA@c6r!Hhdi+'R3KkTb!XS!I9*@D\"i1IL5%XK+L\nMSH8l!6I\")[\"Hma'bjQ,e&cM+&jIBNMJ@2CDdVrkmZLXqJ8&&lDTAmc'%UPmr'Z'\n,eXfm(!`aN!!R(NQkp%qMBFe'd92BP8`%\"$JR*\"ciIKNR`TQP*R1p\"N4phR(3-SS\nJ$#C*M0qVQU*!FjA(MbUZ2i-EG,je+[(FrETcmLH&H#l)l@JK#aMR-[)1%,m2i4\"\n)PPlT!563hCI2ql9hhPlY0)3V&)+%lY`Fic0p(Yq'XZ[X&j5['$R,rb2e@R#!P\"U\ni\"H5'!bY&NDIeh*9H4qhQ&Vhc$dKh@LYm'5XAFHlX(JR1[Y0EKG2Y$)5D1ZpdQK'\nM2NDp8$alTr%I5*U'`BcVj05(JT1`Y3e`,6#DC'NM6Ch'Uq&)%P1p0FI@+'SY5BN\n[f1SF*S*NX@Z%*JRDFJ[Mr'ETrV*0UM!f,YbaJNDBVIBVJ3*\"PUXp`i)Nc%C2bSR\n8ip+5Y\"QE)*r@Y,J'['4j5@jqS!f9hZk#KUYcm2KrIeeZkQD\"e)l6HAHf,&5\"m&$\n(h1fH#0MADP@QcdMF(83!+qf4,mD3!*fP)kU(h%KZrArMlMd6Ve(YTUJ92ES9P0b\n3!,9mqb3'\"D%rp*M,NmAQbcMSl+Sb0i1,U,F#-Z4Y\"`--QY[(P6P)*Kr'$m!V'qr\nhCB9Mh!Y+bf!ISJ[qHc2M$ZDb6cGp\"q(FUR268VQK(UR@E'RLi2B\"fL8%10\"ca$\"\nFK[#LXhE(-j`TN!\"3PjYG0cJeLPJHGXN-B'GCfkN8ClPk$rNb3P&NG+%mq0YSd@c\nkdTRCR'5Z!d&5bjeL+NA+N!!1\"ha(+EUXrK`J2+UP0QLTp@)&DhFUc3LqqP3&UY&\n2r,Qkebh$*1(fFB6+d--'fXDGlpE[1FH)2V(@@hh@c$00bV$Vqj9c8Tfk[NSXb'C\nZek1`V-pJCq&IZ-mm,,S-R3qaZK*LhE`DQq8GlFQaab0[p4Vq4&\"E1Y9SYGT5)Z8\njCm!1R1cKM#H1`5qGdUIBYRq##BTLH&E'aDE@I@!Qe5`hNSbTciBdBK%!UH!id'J\n!rTbZlQPSdiQE2K4VBR4H$N6E'hTMJ$@GGXCmrY,GLa-,eIVSXL@%$rLG'Da4Nee\naHC(M#9j!h-5VT4\"YIJj,l3C(8%-FILmTlF1JK1c@`!HpKciE2Z*J198M#KA'$9+\nHQidkXi'N#AR@rCZj-!NRAVqiQmCeKC-UTZe@ib*YIUSBFF@dTE+F#j!!@hVDPBS\n86h[cP1I\"(5)!2QNU`S82CT4XScq()C)2UlpDf3E@XPN!RV56D*SZSc,af3Ar*8U\n[KZ)PY'k(,Fp`#)mGAr,#QA6Z#CMK8#ZG4Hr0j`ADJDM6,GR#d'YfpJb2)28McVl\nNaR+jM)mAF'IA9K+H'03%$Kqh*0flHIcF-@1D`I(8ppKEP3\"P*)6j@1F'+rYFh@)\n+NY)08Fh+4K8#U$N`AH@Y8(e&bU12\"aLiG&6mmMe23T99BBbB4q3`ZB9U\"LZr-qK\n$Q)Xr*bQI#FBR!ZDU%QP39@lc$X!)TYaAHq2HpRdG3V2Q5Y'S)H'KU,eqLrKG5B6\njIdN)P,NCaGhB,C0F#6`AUqrXRdQm!lCS-26G8*qrNX!-B`SI)B)FQJ+kT\"h8$ML\nVFASeeX'TNI1FIH#,HhrZ5(`bm*e`#piMVGYE\"cIBbBr5HYeMUhJPk9@Af-V5*&e\nJCSS+E-EAd@NMF,`38f-f#DGh&Tj!YBBb5NQ15iL&TTZlG,8ST$r'0'A)r40Z+@j\nZ%@@86cR$CU9Ik6K)P1If'`er\"*@4bX![QbdM-RPF[XLIRP\"I%4#\"U5MDZC5$dIP\ndKf#JcVcFdDY)h96H0S,&UY98*$pem3G,Fk@HeIjlJdeG(QU9pr*)d4ATbG\"'aY'\nEdq*-`13(8[Skeh)jX&!r1q63VE&UTqEN`Rb!YIh@X`&2`(VeR\"(r#FlQXcJLf5q\n[RQ6d#9jh`d(MdXpF,iZmq*L9T*BR*L,E6C4BS,iCX2\"),!22`3Cq\"p(i%J#Y\"PQ\nR6Kk!Je3R*KMrGY)D8BSJ*QV3`(HDqZdMJ!lqMY#GKPa!GSp'MSrY2'r!cd1)Q1k\n'ra[pB,TS%e%K')'k[rK48kELmEkGZNrX+9RTK+2ei9*F,b&j2rp$Tme`bF4rAkJ\nm8IHEM[K&'(hUk86q)6bZ'V@2NTP-hh1SK(4I%Xk3!-!I3+[5`j'ifQ0(#-d[U5H\n#c4*&r&r+4X(fY-BpU%Q2Iq%q66YmqpjmQf[e@MK2NdP2Nk!6j0frUX$\"2Nd(2Nk\n06j0TrUUSpVlE5H4fDDGPH6&),E*+B6#@KQa(Y$%\"`l#E@2eSrh-rL5GCpq,G6\"k\n)M$iTEMDq\"KV6Rq3L+4\",VLm1fP)cS@+\"ILbUHKhd#VFAS&AS(QAA&+U4XeejDk)\n&,rR`afDP-D5*2E&*@2X,ffP4RIX\"9jfjVHd8\"64\"k55qL4IhB&h!&B\"eHj1*Q0b\nPC0b#``16'-\"\"@K,@%*GXZk(J&HM[MRPh*Em9CP`A-j!!'ZGFeFQMr'Ck!#AKTj!\n!5#'LQ+e4E3JLX(d-h6Af9j`#hk[$V@RVDbGr3-r#m&49HC2XQIV\"[S9BpG,6X+K\nPkI3@*X2YrRA3Jl,6FSHa&AV!aYBaJXcU&,9)+ir@!B0'36p2@@Y`mJ6Hik))j[4\n5\"R&#[UThqLE(I#XbVf6'dC&HZiNTF+`A&@+BR`elL)4qPcfJ4m*KER#Qih$pY+Q\ni)'K#Q[a104r4,,3BX-h6dR8PVJ6fJ$&1cY6@amQlI)M[5Pb8d)#dV\"rd8%NM&8*\n2[Z81M#9M%Vfb(`CjK8@4l6rbFd4DIFRI&(cb-j`\"%f#2DF5+dFbbmA(15#Y@k`H\nZ-'P$+1ZbBFEKMGJeKJSh!PV!394#2rA9F4eP5KkI6M%9U,8RKU6XLXjSFc$DB*T\niHXPkT,1@Zrh&i0k9i\"IMhm`CcDc`*TeGc3MAMHLE`qkNqRR\"AV4Dj+5jAAD`P'e\nR+$1YSZlICpHBkb+E[M-VNSHk2iiURT3$3*SFMpEp@9LRI%5eqPl)6`,98Md`1#F\nr9Ck)X4@V0kY0!58-9KRpC&ZQU%Eh[h(Ja`pieI!mG-mASG$`MCD8I98ke33eQ4X\nfHmCe63Grq*JdlaDS+KK32)lNc1Brl#E`E0hA`Dmq6hZGLUiSD$,H2rlpM8B3L4d\n+HqFV#-rHKQQA3'2CrPi5qEH8fc6qI&RD&qlYHNZA5-KflNAC)$N*`lpSXmZAYPl\na\"k$G+%9c',DS\"*T8LUZ,f&rE0r$!Uf-R4,2-4R81+A&B-KB'VNR4qDJ(qDqI05P\nSP5I#cd*4mr6ajQ0XMMdfqVMrIrM&1R2S-3B%FD@N'%hUQpIpPFjDJF6Cl`pKBGh\nEjKZ-e9aF0Y3dSebSPFT@Em#PYGJq\"VreV0UEckSC99!(I2F5IF+ePE*Fa9[`Ll9\nL,H+IJ*!!L51X!YrmL\"U$R!Gf`q&X6S%3*qkIT&hYU0I*1!-$%N[q5@%rG3XUCd2\n\"NBEYf[5i[c'C8idQR5Q(Ra5%cqqNk2R4@9U!j@$rA@!@fh[b(YH+rKMimEQSUKd\nIT+J+5RK@h1a#9BD!kmFB@ZSH!FkSr\"@%5DhdRkSLhV%3%[FfGjh8+S%0SG[L-Zk\nMhdeM#mX,J-H3!2HF0bh!LGr%m%8+%Z3,8F!9mFQdCl9`QV&XI+q6QL8SdhfAL)b\n[Nq2H5'kd@KCI%D'9mh&+[LTf8i`,A%f0DN!`HCE[i,)CXrJBE%KF@8l2i%#MmQI\nIf&R$cha&&H6a@*S$Umj)0#BcU#Q2(TNaiR3+LJZbD8Kh6JA6%M,NQjDM#CI&jT+\nf&S@ZUe)q2Df`$HAl-JBQqVCr\"mfe5GDCb)mc)+9[%[B4pB+BC%M(djkC&,TYRmI\nPfBHNj4qY50DTi'P$S@!-9E[cjBSlX!RN\"&A+cLihfMB$3KlcIB0HlG*P4mHY@Bd\nSbE'#9RI'i!XplXedKB[iGL&M@8AbcUf(P!\"G-U0$A8ZA)$@&2iEi4,PFMcLbDXl\nk#X'RF0BY3pbrhelXYZIHKaqj3D#mRm%U$hQ0aDVUbILrV$pDCYPhhcL[)$k%J8p\nbU**E21*X!@EC6!dh5p$dPd&GJ1#'Jr1(JP'aJRAX1jGSl-dk*\"cR`EPQN`e),0[\nYA@b`qaPKViTIc!,rIX[EqeqVfaV@hlpMDHaRkH#Ce,fKDB%qLYcK9N)pUDZN$\"-\n\"\"6*#pjPNDfDhm$$bDK[MACC-5AqD04EH@9``*14TBd9Df&`Le\"+I92LB(E,[JX,\nX'b\"T#eD[bGkld![l-jJ%EL*c@BK1VSU6GaV)6fDV9U'UVA8R4DZY0QCB)'a8ZJ-\n%`\"qQF'+6fYdLjFM2eQRPd'lh+Q)G`kDHMVCaX[`d\"2P%Bebq@XL9'5YdcN!'Eh0\nE2De,khed@beLV2@%2pjA1XPm\"3YD6`4GTNP[8d%3'aSEPCQ[c8&J[rj)6lN3i8E\n2'P(l-PF$j8a%'AT@U!S)SQX`3jIYGHEF@%EAKY$2bPJ[LJjLZH0H2r@S808e%Qb\n(5-'cDq#@k3Ir%(BK'S(brNaN,2D$J2m@*6mZQQeL4[Y8*6GUqSr)!h@e'26aE(-\nPPiU)lH'Z8$@\"$bmBh64P(3fVdGIR8&c[*#mfj#X(U!rd-a1E9@-1SJhM@dS1Gh&\n2i*rTV86KjSiN+5@!q@F9Bih0*H$c2SD80IVEUfBM2@9l!5`)VIkSMJ[0pacFE4Y\neQ,q-KPG(5Nd!#lLa29E5$)Vh@-3%,GGfG)6B'0!9b[FLmi!cpqh$65+Vd4lp88p\nUG+jb\"j*S%+*rliZfq8iNm0p%S(h0qhZ2f1,lUP`AaN'Ab&F*q5LX#hJG*f`$adK\nhAU`9BS!Cf1B3UeT!`BVh%S'-m*X%I6R1YiYNjfERblfrDaF#3bS,PVk\"p2QXlL)\n[*9D%D'Hej9j(p,r`H3b\"4(GQ,qaaNUcP9MRK*@Q$M'YJKrde),'#6'd(KHF&5P%\nNlK,q!bTB#5#NJZX'fF5Ll+`3Q8TA*bY&m9%Ec6J9*\"4Zar(M5Ypah68LSbiMATi\nV1#*JhL0eQCRZ+hP#Gq!J0l4NakPIajah0M'rLBj4I2`,ljd@0fCZKXq\"Aq%!D+c\ncpZUYK5GJM2f!FVlrAJ[F,CM6BFa5F)+iRBZN)#8R*TT+-#U&NI9pEmB`ZiLP#`A\nYGKSZ)dj3hYG(p%Y*%`6#IrdrSSpi[NM@IJ%RBhdSBI@1eceA0\"1%Sh#fA8NA-4A\nf#NphVmKmTb)kq$eY20+DPFMmdD'$&%,-@6CXX(Fd8fN@UZ512F3Cdm8JrN-X4-C\nDXaTE@e5E9rj2pebD@p%)d44`cC!!C1CT(bhAh4M3Mf2`VUIl\"1'irKriPh(GpRT\nPlG5J*Qf!5RlmCf'Drd&N1ldX'XF241NmT8r'!\"Y*&fd1Q+5k!iRa*mh6PZH'-r@\nf!#*ff(rYNR,YKiqKYefG!8R6iahlmXfSfZ8@mSAhHqTeYj2XDVG\"dN(h#TTL02p\nG%YP%e#%QJYYZASESI'm-VjpbB8Me3pbG0HXkG850,6U6RL5)X)Y)PYT2cK2Tdri\n!(cBaJJ'hlIGYGT)RCLiLGMD5[q,kVHrEU9I9TYqh56(lEI[UeBrEU2pES2KI9AG\np@Tpp@LAlEE$QMc\"11c590M[459U4ABD+MNH'i5C`XAT3ieP2D!U9GP+-&eeXjV!\n[H0T1K(m8$3&ZKAiQkP+rZeB-\"[2Ud9rXPZThF\"MGkZ1rEJ2KMFAfRM%,!)&KRfI\n32R6kk4X0NXG1Y!K0`90560kPUNNlS$rT\"dj,'TUi5VklZc!6&!a$U\"`410XPQ$E\nS4KX0Kqa8%5,C!k'3!!d(dHKN3R@HESAE`,$4J5hk@%4V9E4+KENd0Gbi(%3%%rL\np4`URqYJea$3Ak)CcPGFBdr\"Xji!YZKpZ3rX4@*R\"j*rbQ[-c%r4rk1q1HAFP[a9\nQZ09'VXqH'ZAa#0!e,(UAP@'Jje+lDPmQmK&P0K\"[IUUYrbSk!cLmSb-#VU5bB0d\nlF3GYlJGM-RVhmY$-#2X[6FhdHmL#eQa&5hEmA[RNC*DDI3k$pi6DEIRNk-9KI!m\nF*R-JP1EY8aE'9b\"3*E3GD`AqU08Q)$qS@-pAJ1Sp&ULb%($GR2ji[X[45cKbj@P\nb@b5+m+ASR4Kf%9J'%DTKPdjZleXGDR3U11cf'Qf$8GSeHTDbEcN&*Ec4VBLTiSL\n2Z$YdCP6X`6#0H+HX628b[mY'2Lf9!`a3B2M2c265KK&)UfZ+\"Zfp9$8LLY9NcT&\nkiX#SPEcCK$aYiUE+-`V1CeIGjGfJJf6#4+JlFQ@XUJr4XLJ`b[a443m&'P@-BX'\nGI4dPkNk'8PP12p6Lr9'%c!a[1q30Hm33N4kRPNYp2i9rNe('i!%9%,ZL9hIdRD\"\nF@1Sa)FB13!V[hhLe)jA+p+LQ[0l8a9QLQ'#9Xq+Y88\"rJf3BH`UBJ+QmMX0rZR'\nT@&FNSEG(ph[8h&5dXlJKHHADD\"PQH$P5dPVmY1La1l#)V,4SNJGR4'pYL(![cV#\nQZD1rE&L&FXIA*%6&4GqTF0NEhY1(1q1FkaCqCLjT3lTEN!$ph[FS9hQ[-3!e-fQ\nN`-b@IiCHURY@V'#@bf)kQj5`pE0V+#2Ea,SXfcDT8'jAk*djp(Ja0MJ9%%P[,P$\n@r6kpTcSP8CJ(Jp%5q1Q``(T&+fNp*6-,Z[`ae2jhrEr8@TT)jXK)QLA56KUq\",S\nh4N\"c#9G9-lEr$Pd!VK@&TCLRdk+@j-%rJVKqZ21DPj!!e21rrAmiH&[%lM'M2P4\nK+jdc3'rr8+Vcq*JdUFp)*42PJ5ifmKa2jk09V+4FeKbSL&pQbrpPcjj5-,CHpN,\nf-D#K$*,b5e8eclbH1cF&R!L!RKDr#r#r#CVa4068R\"*Vl#RZ'j56cJ)+5rU#8,(\n86NlX`IQEP\"ka*Q\"IKIJJcGAEil)62L4+cmZV1\"R2$4p\"fp3E\"+9-IJ+U\"bB$1Ff\nfPQ\"H`Q6R%,$P'YFCbR2'i*kR@\"f3!%[356i!crh[VfLiXN)6PYiUap(9&CLbS(I\nBPrh+@i5D)pj9IkEJkkC[D)RVJ[pC5Fm6V*(SaE8)q-03b#hIULA6\"DpX&&1ZEUe\n\"bMNUprpjD`[YPV\"'3CJ2fbElId`0cK`')E+RLZ-CGc(#ER,P4Pjfl1N\"!4iAH@$\nh*q&Sd5mE$Yjcfacl)UIeV1peADZUVEilF[S%KY1`R\"L$)k'TCVRkf8FV-'qiMkH\n!-%ja'B-C)9DTJAG4NP\"hVJGNdQTbd5Khq`1jKM49TM!@4)155EP5K1BR%Z[f3D)\n--HH6FNd)EHclUTRrACN,$&#cqMKGPlYmD*0V*$(M+pMjVZ\"HP4!rQX!Y[a+*r6c\n5PZH[0B%%%i&BQL1lr'L%!\"ULH3R#\"aamAM&F)AAZR*DTadU6-KFZBmkNX\")19P8\n+!AeA[A80E#+D21)am\"9&h4T&f,3#1P3-5F*AF5lCm@eJ)-`!)KhL@ChS4+)IhG9\na$c,9eKkkjSNGcS3pFpL2MhbH%'3+X60FH[)R18GJjb&)ciZGfK9$2)[96&B@bdh\nFmB-@#Zf)H$HD8P@C0PIZ@-fS9lr(AiK-(KqI9&qkU-8h@h(ec%'MkGU'`ULZ`R4\neK4mU''8Uak8NhAQUqm!1E%Xm[Q4\"1,FdRpcl*S5C#kj0,lrkIN8@\"SrV4TE%0!G\nr[r))ejl\"V+T-XfYE3a-3L)d9jl1%@Y*Zemm2Z)T8'kBj[jf5,Q#R+LiCZJPUj1i\nG20C!!-@q'XUJ6pC#GI2BZFbRN!\"HCQ1QIVLZjC(TrIHHNaZ$SH'cj9Z(irQhGiH\nDDHU%9fDc#A(JJim-EGhdM5kTI+J!Dm2a@VZYZIC+UYU!H%m(lmj-r'QbB01'Y3q\n*F)r)Bi#`bdVe4p&XYh4,R&)jI[c&%iBlLf(BpGBeh[)q\"&H%YXfVlB!R#ZNSIpD\nlP3U1Em#rakkZ)4Y9A'Gb0Cc)aXa4l2cl(bX)b6YpSYrH4i#DqNKG'%kK4P+I&h4\nb'@Q5R#9,*BlXE0[HhFHlrZD%lA&TfbEH\"AraMcaIYSQ)kPra%IIF*PI)0bjDI64\nM8YeHF-MeK504K-MqkCLDPN,`L,V%XKeIVF8#+f2hqPr*m@E$4p)BQFhZJ9k6'2f\nieTClJrRr+TQTd6VGSrGL9U@aXR)9,[+$HB'h#3hp1J2hXq6RdUN3(AIiYEEQB!f\nN+XVYkIF%BB9QTQKI(-#+i)B1iM39[i5V%HGDR`ir!M(J(0(cY+8)Gp'j1I'86Dp\n0N!#ZKra$$1KbLm!8d`hr(MVkV&,*dSbIZe6hdFX2QJ&E*ApVjAPZNN'b5,Bk`+6\nPDalc*KN0X+9UV`@i9T!!SDdILPKcdpr-LJM[cqaKXqbc`l3%cAj+lLYX[U3fPT[\nbR#kEeV)G\"2IDr!HaC34T%h&V\"jZ$(I*2rLJYrKQ!&6&&BD4\"1QfC3RS5#X2Q*U3\nE3H6e6Ek$cBU&2+-mKd-SJZIji3DRJ3AREmXRM4XL2*Y-[FjK\"-6QH9EMm4%#I*1\n9S29q4hS[lADa@NHK#6-H[&Fdhrd3PkjPq!NAkPV+L)ApCrVpA%ML$$+0lNTe!%H\nFQV1`,kPG-cQRE*I!kfNjkGVD&NN0G)fjGCH&DqaSV5(6\"KXpSY*VqcckrT6-4E3\n'h+-rkQLZTR%SK2-hE#`ApJep$lp3Ma)M6qR5+\"!\"MApA\"2e8@3HUMMhr24+,h4l\nJ)-6p8Sq&!ZY9NY0)`EQ`42)')+1J2r9a3IQBX9IE1VMQ9)kAkF80+S0iqJX$@b)\n$pq@'eYQ6MdHV'6cVr\"5X!X\"%8HN-Cj-r[br$!C[\"6DmYC[kGU1@ed2ViPFdD3JC\nhp6R0j0YT!Hd2!0JDXQ!!*lcTU`dCc$[,I!(AQ@r\"cKmV(6Lq5C3GNI@qSc6fDAL\ndeV%jUN4Rhq,E45%ST[(kpS,#mLS&4l0md6CSPrLr5ripkfEUkC2qk#2pB8YdNKU\nIQF,&)V6qc3!GSa$hF1U2ZkrNPm,%AC*5[JZ#U(89lCU[e2%-+3EMZ&F&[I\"T)bF\n-GkPKNF4kp4&H@64f8qN%'`)YFA#4S+m'8*l5KX5f2biPU,*()Vd`,Gl88'P1c#(\neY2&9(cCqTK-P69N@+RSpb6fcHp3LJEjS2dpY`5iZAJKQRe\"cFdi#+jRK8Pp+KXp\n9q2d*p&)FP)lY'`V4,HI)H(4&1`rCaqQf6D8,A54GEV5HENRb\"Vk228i+r,D94lB\nXEU4\",85$UpC5'LVV(dpUNK-c0kBAL%'QY2hN@IQ)d0X@\"0hlDHD48#XFH'6Z(CI\n9@+&#H-*j)Hp&bTr-Yd`(Tb&J%+eU*mIFQMMM[+&ZZ\"Zi&L&cqTd&8bTA2DiTRFI\nf)8r8Y1U'&D)9,L![%Tr)90%,@\"5r!3Xrf!XaCVq8JK19!Lk-ML0U\"U81ANQ0'bG\n@Brq(4-6j'r6Y4rKeTDLN2jYe[f1k(U[[23e)JAQNV*Q&\"Cjh2q5IDq,PTMd&NRY\nC6lU2+B#GP*1K)EBV18b$FAe'pCFB3M\"LCm(VZZ$bK$NZ%D+m9-T#)(5i!&+ThC+\nJUN'p%klXjSVS63a',3,LZ+`VRaI[`b,%qYJNf[VQ2Y9)%+HJeMHc04Y9dVLkE$,\ndhXqjRPp+5N5i%QR,E#U'PP1dFbH('PPU#p+b@`$TE6dFGS'E8'NTFrR#ZS!jh4L\nEaT)ammidHE3iRIZA-GTFpYD\"4!pK-LX4`QCqFA*%I!hr(K2[9X1)[j[%!(UGQLE\nfDKLbjBcGibN0F'8`UJ@,ql88kU9'RGbAppNZ`9djK+2JdYc4[2LmlR3`d\"84hVB\n`#&IiP`XMkYc%ka[%IZDG$lYHBXXN`SDEHR*N(Gd'1)r9rI4TGP,Y+pQ14B@dV8Y\nBC$dTK'SbpJr49Li$[m@eS8ZES**B6+$LmYDQZqF'Z`m%)HlcVKXmmb+2eM\"Qfk&\nNN!\"IXDN$e,f,4d0HQ5#P+C`bcMbY5r4ZZdH[2V84bkkbX\"'Br*HJq-j[N`)h0bi\nRdjHb$M$NTEV*CAPiN!#ApUZ%55FIeY[J'4db@-T3pmj)+TK`L#*UL$KPlB0Pfkq\nGPEL!U'b4LE0\"m3V1$G,i*9fIa@&VheNHC3K*bJQ`FH2fhVqh62mh6VpZR'2fhhq\nh8VpZTrlG(X2ffCqh6rmh3VpYe1D2-%il0*8f1p&*@T&GKSU14iEK*R#fY82Yd!9\nXq[X+1ek`L&4RVGY@plLSSZU#)N)Z@40iRrmeKhrC1PDh'&&GPf21H`K'(D1rLUC\n2T+UZZ0Q+jI,\"Bljf',mhIdI[2YqACdGJ'f`,6TiK@8(9J#c[$HdR@fN2A[fkY$0\n26%qR*E&j6h)#,-59'lN-dD\"i)I0J$h'p@E*36NZ!Zd`XA@kqEkT&$RmLXZCVX#,\nI`'92[0pV$52QQN,`aHBP5mhDGq6dE9YKREriRCR9dYQEapjP$0Fqc4i*`iU&GAY\n%X%PCQZ#Cpb,qac6$&MG8DYa$NLPP-bNIj,dAL4%KM`Pd3KCXqDUN9L,f@a34IbG\n*bqTiL[V@C8&l*Q5eGFa3ef6b-@\"+lf-GN!#lqmG)2RMVRiXLkr[IEI@q`0X[RBV\ncHDXpZ5Ai+i-A9BZS+!JKqbQmSLLBmmd@#H2RI5i&VB@bh&r'@rP6Y+Xc-@1f`c-\nMZ%Mb+dFjXkEETETTk%RlI4lbXL$p$jGG2RS\"'THJVk--,3j%2lCH#UX&p-ZaiLY\n`6XIhk(p9\"bTT0@VZ9PY8Jh(5cQ4!*eCBp$kL$4`(CL!CETbBNSD4$6+hYZ%QTcE\nP26(9hfaa[9U[ke`r0rP+85(9!8T59p!3pbqk!''f0\"%U@K&V5kCPG)k0dpmUHi6\n1$`3cfS'd*4m)ph-BIFh5\"jhkf+5NVTF-MIm6rDMVLG4Q),&&ePK+dj(qGlq68FH\n2[4YkGUDHm80$lj@+I#cX@(NhILjT5YUM'PSV1-p3G%+*I#+rrbd8QiH46c0DjLI\n[B9\"iGhQaA!Vf9jCh8fjQhSq06M@C&`YbfKG`VqrcXSDk\"&SF*G6Rd#0%mPq%NXN\n-iP'cM-V2*CpZ0+GqRYS*1`d2cqr%Jb`I2)$DXm!ciNZpa\"YSp8c*`(YjqG5%iF6\n39N+VFd6Zi#YZK@8e,D-B94@%Yc)PNU2q%6RTD%ed$pa-JGAF4RZkLY\"q6e!j[kR\ndU!KA*PVZZT)qcLF#krMCc`H#9&e+[mqZ[RfS+3fecNV4@cPeQSK`P6Z([FArIrX\n[%m&NYQ8@)SYbM34X@j-UCpS,[8+rLXj3e&*9I8K+TUjpH8Lalb,[i\"#Zc9m3DQ(\n19ajbZ20T5!TSAc$Xfc3Ef\"r8p1bajepGC2\"a+D9E-TQ[HQX0&&h4r8dPY$`#fbr\nr(6mh4+PleTq\"LL9-1XhQ$N)EQCVN\"J9$FT8@'jm0i4FmNL0+r@l)KXY#AaSa(EU\nHl)c![`5!k8S6d[Y43#eEQ$lEaDBq8BT3f8P1d2+3!-#(G$H0'mkrMJLEJrDhBDk\n@GXK8raBk$li[8kIU*80T4M!c,XC$-3[)-Aic9A&ljSA!8*,\"rd*4hd'E53%[AX#\nV1a@!ZMlMra`U-N&#%p5&YE5RVCbB'-B3bY&I-3*N8q[)&&,PH3-bc8mQHF2flAa\nC#KpGJkr3,[D@4kBM9-S',SZUNG4JQb!m3rH3!(ZA8i-DR[TGrNb`88mherm0K&D\n9qaLcZDYLiNk6*Qm1XE`RZ&-fa!`hj9iZ!p`()R#9YArf2\"lBpT2@Cfr3`fr$*,j\nriVN4HPc&S6`AFF2JK8BYS%GP24I5-R10PSIQi(UAJeDQ-4DJSP94+Xai[PSGKc3\nKA[%&%1'0fFc'9#BYJld#D0DBL!8k#JRhqR5l3Y%9P@M[B\"*R1cE+(&qUj8'3!'8\nX*1$,45F[Xf5M5bN\"2pp*RL+JY9KKP-Rq0CDHLLCI@&1%FKi9AB@cHd3Y)U6FRr*\nhX6[,cFc(qFcQ-mCFD`L!##1RbkB)!RQ9A96,m[UiIkMqIr9\"KkLMPqXVKM$14e4\nVYTNq-8Y!!N,BL6HY6SZ\"SA@bL2U9#qmAd9-8ZN,$JL!NJ*!!8J,-28A#0B9EB1#\n#-dNl&'d-3-@D'VXRhph9F3mbeGBHZZD*(Fk%2ABPHGNi\"q9r9ib#C(VN`G!`SAa\n3r+T2K@cAkdDqm8p56I6LK[E9LAq$p(1[hi@'Hh`mS`,m+NcjC1e@$rcqkL1Y6Hq\n'4k3F&5EJ+e$PpD30pJ44k!f4I*6CJ[kam6I3j0hB9a\"Q#jk`Sp04chNQTPi\"DT5\nRDmjfk@\"eCVE1[`f,&aC9ih6-(p,bb4&eBK&\"MaLV$\"9'X@D5#rS*RG-f#F)hS6'\nEeP&X9kG#8cXr-BR\"'Nc-XQ4[#kjjPUff4j54\"V8j\"(\"LFmGZ\"-MNTMpU#AAP*hX\n)c'9m[l!,,cF8+hB8c+35EMVf4Q1$jbL8I)k!R88)5SV)8UDcl!jTqqCafF#Z9c8\nL(-a\"R`p61G4KF!!)CBR&BL$34KcT!6d)iN5p#j[+A+mAKUm2N!\"c@mh@-i$r,TI\niUBUUU5YQ4*h!rHeGQVcL55ec2lrHl--K'F4Pje&1rYHUYdJF1fN+&BRBfB,kfbR\n,T1FqhBr,FNC8kB,L`H[krEffr&6h`'%kHbCJ@#FRr)paH@QXd6%pZN'Qa6U%'FQ\nIrY+ZS[JQCm*hEX9Kp%3)H&14pTVFD0J2id3f)lI-,,EN)!NHl,R#YGA6l8eH(Hh\n`hr5Y&`JaCQYb1aB$PQ$Fm[1SkI#h+aqZ5EkNAIBA\"`UmLDS1VCbRI1N&F`HJ'l1\nkAR[P4I@1Rbbj)&I2G9h&%L6d5FhhBrSUPLFG!eTYD!rX,(N*JL$kR)Q24BJfp-0\nS-SXM91dijAK(FUbr%Q)ZG,-2KJcAp80+Q)PIc-2rD\"UaPSipV@L-+46eQX4fU[d\n69E2cSpNDRrl*KAJ5d(\"'TJG4@1Z3!!'N&*!!f3B`4$51NFi8,2!N5f!a+HaI'r`\nTMcLcEhSlp(+c[BA-*'c#%30rKj!!HbXXCpCU4e%SF$mqjHIBR)[))GbMljfdRhC\njcmSJd!&jKbb$cM@F3dTpRiNK&,9Ep)BbcBICq\"6R@1V34QT*EjUbSY1eLa5EZB+\nL#GD!CG%rImdb,E$5$[AaMi*V18qElqXU%UY-&ipYNSB-dN3(3-2cqS5cbpDYTUZ\nB[5c1PceY)T`*D2V8'Nqe+XH-hEaF*p\"9A#*VhEV[\"hV,D\"L4[#4RMK$RBV,&Rr\"\n`$[,(DlDAP5%)TaTqR%e+i(BlUId8ljp-RN@KkhUBC$G8j!FC4E1C#eBf!@F0ifU\nKKFNIFdG\"0[lilaZh4GM+!DZi@fTcE3$qbp+F\"UbCLkX0HPUQN5j$UV5Q\"VrYXYU\n!*jZ46j+5BJ2LPPTRe$a1jL-)8!f0lJ'5jQY[)(mq&KPjNc%q6f*`H9-#L2d0)b1\nb5+q3!*)3Y60J%qVQcYPVplCr3BM4#'j\"QH[cjR%RX4T3eSL!Z9*[U5JkNKBdH95\ncG-Li(21PAqLp5bD%Sd5pQMh6m-&F`5*Ik9LF0#KdT0!`a!Grm*K91m!J`-0S!Sa\nSj!&&aGPJ&%G0FAk+*%c\"+eQBYYb5f$ZYcKGihL*0iVJDPHIUL[$[G-%\"Gd)m!cJ\nQ&S,UV)\"E62DKQTf+1%J*I3F`fSN-j*K,eeNGBUlF2VCRFKK##lYAU4cYeG\",qG3\n\"01Z0Vm`XJLLTCIfFTpmpS9Sbba!il9D5q!`$DHEiY[YB)Thb6Y5PfHmX8#jr@$B\n2(J[SKdJ5F1T9IYd+2U#CTi*hk$iaL\"A0i6C8Xhm-h,&Zpl-*HmN&-ITY2%1445(\n(VPMQ(afF8jDi,'i[I*U)ae'Ca-8&PYc'fhbJeY4ie3c8A4&2e!E0$'\"S%(#T[VB\nA4H['GqA5MpjC9[JaZI*MkK*Z\"+4Mmf*ld@-q$*YcBfq+j&mU'+l#Q3p3Nd[@[,\"\njh8U6)h8mlhFI&TeX*HihrS$CTCJ#&DI&X3V9,AS,3AA\"!$5+VQV[G\"2[ph!fbHV\nZ0NI0m&HEHl9qkeEe@)f2SQJ&[UfqrSq&c0l9rc5f4KpmQUP4dSeqAa-!jb4Q869\nEmfY!Im9[T4#aP$Lmj95Y`i-pRI)8pm9eF\"hH'YPm$8I)qr(1YlcG`L(3GpZC@k@\nl\"c*UCXP6qfP28P63),$3@b`F4HNX6IK#jPN416djQF4H5&Tb0pGA#Si3j,ZYNjK\ni$Z$eGVH2P%`6CF2S@k)S[%\"2((arBMU(,+[T2Sl6hAFd2R54$rC6AU*R1++)LIG\nVAYCmZm'4,`TC1UKja9-K%D3YLphF[@eC+!f!b0Ip-qX*UCA,VHH+(&lQi[#BdR,\ne1@#P46XG1cNjQdZ#'['LZRXpp,CkVrD[6R-USXQAbkBQA3B%UM`(q['cNGR,[m+\n60bM+AZEUP+6Yjf3$GL6qK62[Jhh+VZNBJ#kcb%ZcDpjVF0Mr\"!M'3Hp-Y%8JY!$\nFL'\"dLS0!9@!%AIp(-[DRXjLd(#04XMb)4R*(PYSYk8(4*cH3!2XcKKVUh0G$V0e\nUVT!!(R'H3e5'\"-8kIj8!L5+1Zm\"-pG*&'icBbqlL[&$@(XN6&ZNJP#eFY9k9*6m\n@B[DTA+Df'KJ%Df$LeU%Z%Sc(%2N[!NcdYTGf31N4fK`qPcc#Lq+qM#cS)f6S%(J\n**TK3K%,*dQd\"#IU[3Mjhf8[p@IQ5-2)ccqDh+','pHXkQmerm(JQGNVVA3A9NbX\n\"i9G&`dr[j(RP+6VE@[40rBmEM$9jLA&H,MIPpSar!k[Y%ri(fAfLppSTr\"!rJHi\nIY&IfM2l4LqSF\"EVJqSp[2lc!@,br2l(N6qi#flU8`B&rVCd!B`(TjiV#G0K8R'B\nJM%kNl(#-B\"BDRK)IeFP`N!#8VN5cR[!Q%K*j(0Gk%pep@3)4q2bkb-T*@)ri8\"T\ndSS-I&*q[+PI$K$hB6,Brq*LqcCB+QqEmld$Irhi6HC)`K@Ehh49\"UCl'-M62X*!\n!M'H539fch-dN)RNU\"QP!2$6qQ9U-!FE`X*0311UG(+%,!mC'+rM14-b%BM`1F3d\n1,c%KK8qU6)NX-#2a4#)PqGNBYkbB)RTj(rK6S8c@P4AliSYjN!!aVZ,cqBKIFlY\n64Id`NLpIID0-i44#6jUUDAJ!-*!!MMLlPQ6)bMXL2Hcf@qhrI2ePQP%d%[L9M05\n1lh%bf\"[T1Xp$m6fQh%GR)IP9,55(9,8fkD!5%F`jJ$*`#,!N)fZaGUN*[J5+Ilm\nJ&1VP)4leLMF@XC2P5Zm*j3266H+SeP9\"cp'*[eqV-%ZJfU$VJ03!EcR+2A!h3Qh\nRSFqeB&J(q%q5LE-)lmdGIrp+eZJ%4`I*\"e6+\"AAIq*@&L06+H9L--lE)EC6cKlJ\n#dkRUI,4N#rV@IrrCD@-`13!!LIN!!!!-DP!J)!d+K`S!!!!8CR4jF'T`-L!!!!!\n!DR!b)!!!!%pUF$*S!!!!&QPSC()!!!)!!!!#!!!%\"`F!!!!!!!pMEfab!3!!!!!\n!%!!!!#*MC'9Q!!3!!!!!!!%!!`!\"!!!!!3!!!!)!!J!!!!-!!!!!DR!bBrp2re%\n!-J!!!!!#!!!!!J!!!!!!!!!!!!!!!J!!!!)!!!!!!!!!!!!!\"!F\"!3F\"!3F\"!3F\n\"!IpN!#-!!80bC@&dEh)k)%TKFe\"PFL\"@CA*cD@pZ)$%Z16!`,M(r8J!-!!!!!3!\n&\"!3!!IpF!\"0!3%K)8%K)8%K)8%K)8%K)82pG!\"3\"3%\")5&\")5&\")5&\")5&\")5&$\nrA3!8!N\"!5%K35%K35%K35%K35%K3red!&!0!3%K)8%K)8%K)8%K)8%K)82q3!!!\n+!!!!!)Li!!(rNpq&PJrV6RLe4T(Q`R*JQ\",EI$ZYGbEM\"T!!3H12iG[)!X*#A'b\nTcTP#h!U5Q,e)HM-,ajfL!'-$DP4KmTYP%#&$iZrNP[J&5VLI!Dd$[QE3B,*G&b\"\nJ)jU2EprRBD#RVU&6ij`crBLrDUEq\"9Ar0c$RmVX-VUqA@kC9bU%k0,Z6U)F#Yp#\nB-`r0\"DS5Y9aUc[EfS5\"%aBCGJ)4`SM(#*4CU6[0ZNk5fYpN6H6Yq2\"+1@mBAjXF\n9mf2a&MmC$r2&G0UQYPp\"[26i[YF[QCPS2pq&M$0RF*B5d1)%bfVY2KH'iq8\"i*)\n4P8`Rj(@Ij*ecpkVC5J+NGqJFVj-$IEKLcd%Pj-q8hCj3$%mS+8YpGiF(USjUCPI\nRMmUeM%1$p`cdXTbZ*3P*I+e8pNh4+ld3T`aQCqcPqK*'GhN3QlfFikC[Tr15GDc\nk9+I*I,D$1pf*VDbLXr&*J2BmaK$2b,Vqc2j3%0bD)P-%3c\"3'PKTGUbck-cf%'D\n3!%NA#(F0T$l8XUr[ZTVhM+aD[q(*`$*lT210H`Md&McErhrIKF)Y#4&V#N`(#B8\nff%Xjrh-!`XBeE5k99@RGq)VM4D\"bNJVaJkF86\"IcZcHV$rC&%($`IFqIF1)VM[)\n1F022aAScF$!!!B4d'GQ2cCZNL#)Mf%(m)f\"N\"QdU1H),r,kcPaE!$)6*a&9VmQa\ndLCJ%)Q#*MTFaCGM`r%+BN!!%BT55BMH,I#%Bdj*b0%Q9$,XXcV9X8!@1r-ZGSf9\n1e0M[edV[h9UFD,-LI0Z[hjPidB`DEA!6a3CMDR&JElf!SJUCQ[\"ZB2IH3eL[cbN\n0dDbEamVX@+)*HMfB@KP8U1b4r+Hb\"rprhi&!$qdH@rahcNEB%I&#9\"V'3kT$X,#\naBbDT0aQ4VfRiKQZQ#J4lNre&RmID[apUc$l9N!!8k(2c)1e\")SDj[@`dNHL-kC1\nL41[fC$D1R3RJ1!Y2G@4F9lZPfCq,$T*,ar`IGkRaNePB(2D[&*l%0AK!'eFihRH\nCT(qVdp@3!'dh#2)q&aR*XJLBVbcYhTH[2RDpp\"F8k(N8*)J8f#l)Z3&[&e(JE')\n8JkA!QreXU`1Dl!%lD)cCVejik3`r0Pf#K5*i!Xl!&3PL+4I+HR5pL\"hJDBZ'3R'\nPQ!JGdP-0!%!#9h8lc6HTMi,bSUJ%0a,2T)FjVHU,4$SdEJ25cJMFeA*-pZ%Hh-@\nqKHkD9B'0BkQVSa(\"mLlMQ@SJ\"(TQJA+4`*8EA5Gb)dT$J$(p$G&8NX55l!jYK[M\n,(bpC+@NNDB`NT[-&KaikapY%4pVr\"pVi5,GeP'BS@BZaGJeMAkrUGXRL2Ke#UN4\n5Z8*Ra,p34Z4(Jp\"U20Bi8l(I'QmhMY&6L*dLCql0Mdk0NH\"Ya9fUl'eSDe&Ub[*\n+0c#3!2jR5AVmEQqhhDJ,HhG&**PH+#I'Kmi@ME0$P-DAZ[3YmJID\"f2[FAjd60Q\n(Ba&B8M%&PH'bCeA565kTYlmdY52Abqq*CBQM%+3bkP%8jNhr(,EMKImjD$!3\"aR\n4cE+8N!\"9i)hU-`jbM80'BN-AL%C0'T'T6Gd3`mGG4bX[9[D0aV(r8\"#qGJIQl#$\nQ$T[0lS6+3jM$,\"cV5-AM1qaKN!#\"eJ2KJm1h#$M'@DI4h3EhqZ#HS$ST\"R+2\"p(\nINRq\"kJBS@qMEEqe%`V&q@$A5kC(P#2hJGRF'M*-EfZU(aA50i[eSc3p\"p)#8()0\n60+aBIJ#R!RaIe-0h(IU@BJ4@rcpcdiIH@(mj!(2JLBAh'D)qNM`Z)3bhCdSS-LR\n%@#fX`d11YXAHb-UfUFB`d0S*E`9,Ad6*AV-HIG1[cm+5Ri82(i8%,`RE*kaj@,Y\nQB!3)-RE@l2(M8NlAlbX%0NIdd$PjdSrTGl2[mD-pRLY93mq\"4Rmp9Y`&54+Se2K\nTF$cF\"rVNdAkeia!YS9k5BEi2JD9iHeKKZ5EJM2jkAF$kU39maXeZ`3Crr8%\"B)e\nQrFL-VP8fbD[fZel[Z-f1J*cE)hjZ(3,X#e$1!3r'51kdPrUj,CeM3NSdY52Abqq\n*CBF-mVk$GEMHfiMb'5NBfY%B3\"JG--bB#h0E'-3@%8i&-Q%I6@+$Q@Kc0Im2jVM\nJ$M%p4$(2r[T!1MT6pKLT0lDK23aMiXEL$acCI+Qf6+)pURSIB#`r#f6i83I+(T-\nQbrpBq\"UR(F$PrbaPh+9DeJ9lkbK@MrmEjp9i*BrKcAf\"keKjlMI6Ll63-e,K(aR\niXrCN*@*B*1,S(H&IQ4Q2K)kpD$*%9ia)Njaf5Bfa*3%&&(3-12ml%6R%S19*blC\nk@YHd64Q5--#4L6GpL8f+*%r[@QQdJiBCPQIj*qQVD-N5SqE9*lb-(84Ej#E'3\"#\n\"P5Hq(8)p+VmmiZ&SQP9*`''hcm!qIJ)3qd2!&1K5)3MCCP[$r8a44h)c&1KXqeD\nDbU4N'd-!N!\"f(BpImf+QJiL9kqFbR5SYRar2`VfIK8X2YU-8k,TXEieK`UF*iZI\n%i12@08A`#[%`[kQSbqHmZE962JS2`('Q2h&0\"$D(BP0SNC!!T$pE@EDGIV#c&2l\ni'1*Pl60X4da1T-b`jqVUdd+pfACPbVijCerL)\"Vf,GeQXF'Re,SKJe8PcJR,(ar\nd6f`DAp-`K[RNk+'q()!+j,+P%HkN!\"HKXImTL9SYJ8r,d1&kIJqQ(%AVZR(@3[m\nL,U(adPN@VJ!9M[bp#XJlM$1!9P-B)(5%#mTFR@0UL`%G&1LmPYlM#0(Z)9DhQ-$\n(V@I!BRMNeUQph1YHHE9CkV&Q8*l[(Y1ViVfUUV+h4H'@!RUZ'p8rFbN6[$MTU%!\n'eV$V8PNbiRGK20H$p\"bGa)LXTVDr5hmP0H,G$pj+jQdI'UN)J*4&F5rcS#Tk2P1\nP$Y-RUDB[R)4+1(6+pYQTXp!(mPSQ!RPiHE#aFU02V3,G`Q`CXVf\"kjMUT1Qq)cX\n9lKJp&'q%%XPb*eSj,hd4aH#Ep@IG\"R%HR$9L`35HR5ZH-&qZ3c`[-0E')!+`dIi\n9dfkLm,\"pJZl!SPFT+KF2dlfZlVb)fPJdJ)%qJralMJD'%)@BGbULkC!!F[aiNkp\nEYbrPDRqh24KlGf`[Nc29UiQkG*0YcPb-Ij)6Fhj3YaX6XCiVP'lT+\"DHKPS(@p+\naD9Z+SPc$5+pAV0S,@j,382(@&h[N#ie'c%I(fk)apYm4q&f!&194J!GY#&-9pCc\nf5lXDGM8S1,4hMr9V,qpb*k+!A,9EF)eb+RFHdHqMpCQ+R3kP10GF$ZcTNGIqZaC\ncPa,ibef3!1F1NpNlL(FD3P\"i&4(Th`dkR&SF!Y&CFc-EeLel%pPB`['mZ'VD\"0)\nRc[jS2J61PTH8U\"aJM%Q5CGm`q-feSBCS6G4'+MZJ-6-Sq*r00CeS,b1m[XQN(hU\n\"%E(DqN`DCT!!@lpe#Y30Y@jKhJkme,hChSZar8dcd@Z(&(PIZILQUb5iehSMF&9\n*l63k$R2)f!1p#iHF-C!!)H!QDhI6p6C@aipkTIjBA0Nqp,U(YR@5,qibSUKeEQ@\n*&#G#L4%21$E@$\"prr,qV1Bh3k5(QQR+F&0ATDV\"'T68`IS8AbZ4ei&$,SE0ZbbC\n[U$R$k\"pP$(9$q2\"M)bQKr$NNkaQ&!2[$V%d%fKJQ%N3U`m&\"'6Z5a'6h\"XjCZ44\n\"-q#mBb%8YU4bKl@U[ZL3!2j+Fj!!@UZh@Jm0l[ip-#6QB&rkEkUrd4A)51RqD'Y\nAXqhB@eXLlB3Y[Nj%9e5hBHQA`aG80-fpUlZ9&jb9\"Q5U8V`Ne@-#TaPm@cYEDhi\n6aZfa16e(Fl-3Mi3KcC2kRcaCmeM#ZC!!Im6A3j*LfY3h&\"$@i8rB3ZDQ0TJTKA9\ne%'R(l+@S)()VbjYZMAqB2VkAShc2heB16H\"NlFD&Vd331,r4k!ZiM6[bTp5ElT8\nlL,)9F%(q\"`@!FX(&0HVh$'de*94SJKGYilLA*T`8(&JJ(cAdqj-1(MY*)'hbLA&\nR)l%4#J4)Vi9dFZclPHRP932V5k\"1`Z\"mm3X(kbq)RbK[@d`AphJ%2#YrUQ%Ze@j\nIJTY-X'*[V#2%Me-61*qT8ZHpeD(L*pS1YZ\"-`cL*LjFU3!*`J8pfipTHf%\"CX'0\nj6GL4K`!rH%#\"D1VS-L,B)b)F[QH4\"fAJZPX2*MUDA5Kp,rZfHmIUF+!P,NkDk%E\nXbeG0&('c8%*86)&T6[3J!kIU*e\"+9!*@Fi14F*PHUXr$55IKS9(iAH#Ad5!hUGA\nF*eI@GV+pH&CeDGqkU5JdN!$$D65P8rSqYF1Hde2G0jp*SH2'bcbL\"\"LH-JQHhlF\nDDX`30R2M2d,i2GVieKXK`i'+e$6N(pf(2hcDQL,1!pZ+cr&YV4MeDK8`PFSc9YS\n%j!1VBdZ4pDB!A\"q`*UaXJ+#!J+9kMR)EMmhlU!ZXI[dY,,X2k-M#j\"bRQr'lc#l\nUfrf6Ya+)RA\"l[jl4Zdb%bVX8elh0ED$p9CfBjIZU4f1$HRa'#\"XrBBphSEVe5Ki\n,,6CS&&UeGZ-+C'j!\"9FBmJkM9U(Z*1PaJ(G$LHbIqepEM39(J(ZlfaVSkCGhDJ9\nD`1E0mPVp3iXUN!#QU(&TIV5(cpF[ckZX&Tm#P0Mkb@-[V+bqd[HFI6Tm16e(eVp\nB\"hBZUMCa+0fYS4`k8b&S#8N6Qb)+%l,QjM#ASihE,S-HC@c&QkjS4RTLDcRU%rD\nEhd8Pfh6Hem[F,+-4'G8HQ+'kI$I8*G6IK!j!29%A39UJk*54i2-T4LFj-faU+d0\n2NKFj[)'[fBMkRm,G&UFKrN@(GCR&Ak8+qhPEaZE,03AC%Hp'b%QP5iAU0ZfR4rD\n#Cdrd)Xc$*bINlbpqq8fHTp0Iea\"\"`C1Dfdj#F-IjL`c6,d0CH\"8I,+aYTF!E98&\n@qDKYT9J-\"hm9i[Z5L)RcK8&lh-0%mRbaFUVKaL\"Rd*HbUZAr6eR*$S+-P@1[9TA\nF-Z\"R'Yf4eB4+3IVEM*46(\"#[C@jSS6ErIjJ-!EdbJG-5b(1bd\"*kBB!C,GZ,KTf\nfkMYk$+H61(*ph,\"I#FiHd$e+[V(+`*%M4[IP[9F1XF25'c5b1`aicRT#YBSjeFV\nN#-U13r,HCA60BdSBDce5h'SMiBKZX*RahIbp-RAm`q-E+6LC0l$QLbShVkcm9eZ\n'I\"3,'plHbAq)(MCPc6HBE@TIA[5H%j'aV\"Rc#A4mf1Gm)[)#ddI\"&faZqY\"p$6&\n#RXN5UKm`JkYhMK#*CSScHRKQF!,L3$fG5lPe3-*mH*3bcQ9`6-h%8R&f9e@SCBK\nhpeU)IAiAf+3epq-6-aq[abPre60X&2lRcm\"fIJ24q!Q!Ld[\"aSjNcm038)bUkc\"\naHSf(d+%XD,dkJT!!L8T2iB`a$`60)9(1-CXhHMl@rCeA0i(0'53$pH'*5Q'N&B(\n`IaAb83bU*!Z'GC@IX!'`4mr$@'IKUa2ce)#YA'U\"pcB#m!)FcdfcKM!eV*N`DmJ\nJ[qaI!'G*Up!$8+pPj,!6'p3)dqT$$6hrGj3kc$L1RP`faNiMG1,K3LLScm`*+,E\n0SZ4Grh0C'YAk'mFfG[-RqAm%UC&,%lDK&Y[((VZ!2*cL0lcF5(c!cZ0E!SLHAkK\n3S(XiiUY8UR6JFM[ph2SZSQeA(@Je&G,(jPDVmT+$+$PZAfA#U+2PY36U3fB81'!\nFQ(*DTeAc'MVK`)E,m9a(V'd8-cliMkhUaGQBbT)-)$%[6Zqm5[mDj`d+EJCFAkE\n6hm+&M4V`YffYNS9[FGGVRJS3m#K2(iM@SCK\"@P06-T[#FRj5L5#eJIa'jR[G55+\nG)2!iX)([1P-*Dh$DemYqZ!5\"Uih52UejQ0d,BRU\"hqVkEiEXe3Lm1$k[F[DYSH2\nL'a00[IdUKQ`hBM$16UhqE*R#R%YP14X(YeLJXeZ[p+k6,5*`Ufr59i\"XIrK3,@K\nVIJF4XqkrF%GA9cpi2NJ\"6Cpl*`FPkj')c3%KU!HNJDmkfPRbh8R-!I+jC!G+jQQ\n\"Q9\"*3C3U@c3`RdD'QTaCC5EIaD3$2REVUGecpFFm23Ehp((%4E\"J(E4GJq&Hr8J\n0&%h3,MZVlmlkE)%1r6RU%b5%iqY`FqRAIm%-5q+U`Ud*L-$*&Qb5T\"k!B*6lAXe\nR&I&bYZbH3![RR2YPlfK&M8MCZB-@aY3ZJDNAQjYKIA+h`5KRZ'(F&q5S#kqFPCT\ni@S!K*fNVQ('q&fDT9[mV2NZb,J+kpmJ&P*QdG#h1@Z+50'2+!p6k4GSfPFTKf3b\nAPkUd5YNZc'qlmk5rlF&IThiaCajUqYm9YY@R4!jG5%fmrffT9f2K#dCQL#(aU#@\nq[3A$$i-V3$%9c`V(5LcFiA0NS([J!mj+8r(e$jRr!#eB(99GCC!!Q!P\"(@R1$ki\n(aNPVda@\"rc%U-%Af8J,j8T!!$ZL8bq4aaC2*8HGTC3AeqUF`%!HRh8-VZi8S4Ze\n*+IdV4b`UeV%F$0j$c'2i4DFDcUEN%$$fC0lBDD6JRFX,HhUmUQ'!+l,GCrB1XJB\n3M1(P\"iHEPV!M0#6XNP#8&1e#AqHVcdDUAk++m%lBGC*kQ'rlI&U+jf,bA&X%Z0c\nS!8hACX+ri-2YNd#55B'Sr11eCqQd2)d-0$Q6d0%U'i$SJmCHMEi#,UhI`lZ!E5H\n0J)lJJBq0ZS9H!bYGfj[D(UiT&[8D#C!!51hFp%plp`&bXlp$j%X,G5%)3C80!SQ\n89&UeU3QR)N%F&5P$qhdA8+H%%GaG#N*YU!q0L13eAlbfmUD&fji*UTi&X@H$26(\nBEd\"ULpk2DTm)YB2@V*58l@#mHR&e&`XRHkLIL+e0AR1GrfiriPVjFdrjKUEd)Xr\n$S@RiG!XIKZ)!V9aXf(TJGAaFda\"3,#%CV8aYq8LlDhUHrQkLZM*CFd)e@cY(!J6\nj+M$0R9$Z--AiN!\"H5F0UACQ#95Yi'r$hpM98d'#d($lUhBGLiRLa8RNQ9SV!6q0\n)D8&6F3(c3db&'HLYD,0-P#PhLDRINHAq2%+LMjaa#Hi9K3T[abmA4-ReBJ'NS`Q\nPrFiBS@j@*&ZES6XKDfba6JcZ3H60frC'Ap!f\"9-U*[,VmCrfU8aF%Q1E0aRR)$,\n!UlAY!TT5k-rUTbCG$UT\"C*-L'Z8e3[)m@3SP6$e$`aT6J[(%H%RhFh!4ZK8#'&E\n,Ej8@T@-D(0e#YQ\"Uc$TN602C`D5@%IeLP1bFV`kKJ!0VZZQ`Bm8p3`Kcp\"I0[5%\nlQ)Ir(`hi(5MCJhMNAIY@8j6qU9k4Y,G%eH2d'6BT\"bc%+iEK`f)-qMNEa0*aIa[\n$jqrK)[(ZK0mQUEPJ%dRR-AGc)dE%IiDBTU9%i`V5\"HiI4lUR@H8riU+*#0V1hkQ\nk4Cel!e'qfca44iCmN4b+FiIj(IRdk9aREhEHha)rP-I\"163U2HXC[c)rI)V-Bdb\nb99hKX!2$4Gl5*$CFCGX@NNJ),c$K,dC2B(LNp*M+[VVEq4R9iU%Z8Fcaq6kBP*a\nQXblFKK4GhNlj9FH(I3Ce&Hfp%QJV-GBBF&pLr,j@FT)$5pU5*D0,(plPpkNPq`E\nm%\"rKbL9XA%VI%Nq(Sc4,[rK3,EkRkKQTcl%\"Vm4FLS@0-!J3XS-Q+mmmAS60Hda\njHS%&9J8mqQmlrbqqXfkhRrU0E*jN-CiV+N,XXN([pr)f1%hdhTe1r\"0&eF+`)+4\n2P2`fE*!!mJ1Z'B6iV#!$#Xbr%kK+NSNL*N\")2P4dHS3Bhj5QfDIX!aU+@&,,Kf`\nTI![efQ@Im+QH9GAmm#VqT8&[+mm!b5HTjA6N\"J*lfX3&$@%P\"hkQe-G#GYeYLY3\n+!SbSU\"[@V`(QlJ6AY1M%jZQj(M\"IhPdUI6f[YSUqrcm[+,H0kNJ&*ALCK,Z@`iY\njhRfl!mkcXQp&LEB$!i+T0kjVeVi*A3T-UI`db,$2pXE0$5&+KMq+95a0*bl`X00\n-)UKbqp9A[PCr1QG'l@'P5kCpM#GZBlSTmIQ#lDd+qUYrUd\"HKLS!8dhAc\"6\",`*\n'!fb@qLVI82KYG-(R'-&3-H$IHJfZHecd$\"Z*XBN5hSAP8%Q5B%1HqJ%(MJT+4$A\n99k'5-+hA5m4)YS#`K*P@PK%-ZlN0b+4+'Z-\"+BP*NP8UHmGIH(feYki4e`0GjTV\nY-[3hc84&DT+BMVS25N6IGr&kE$1I`TEd(j*d*4Uc+,TZQpbC05DM1!V!r&bX@Vh\nGfNFH-1UfiTG!fqHeL3FNBGU4$EI\"%ekGkH$X(bYVY+QF4R$M@(JE8ZEi1!lbq0T\nNY`8hIDkh&B(r%TB&6dfa*9rDA+2UH32S[6Ud%h4U*9eS%HNU5Y(YIVQd`*iqlm6\niKN+28H+R+p%*YeT*mql8d\"6k&J3Xr2Rk'&da6K-9dbX5r3J5bhQiTbIEG#E,Z&p\nDTb%D*G&$Y3`%28N)fLQ'DVGH,$l*2BbhV+f,&40*VXS-*h3+9&[djG-f(ibYI($\n`Qpp3*RpC&*T[I9N%+bdl'lC)G,DU6k#m&RB%EPD'0QHdA8@+FLYF&efFfbEGGA5\nF&cb!aGM,@,#-$A*!r)!i,U-TikY3U9j)U`6',C-'!%EG8++Pi)QY6KP6@liCX*V\nId+$Xqc\"&AL3T%h1V$TA@iN3iZRU\"r`VX&6i268(pJAb6HNSpKB!0[klV!UF1@%4\n,12KhXGcQ(CN3)GC#L4N88IZq+@5%fa4S9ki)r6-jP5FHHDbYe0K\"$8FTr0mj`m+\n`05iZb+4SjIQPr9LC23R)r#8B)aFM%4@G2$)62iKZ$i@FNA)p1bZ14&3m8FXQBbX\n2G'0X6&Y@cYZa!eKpqFH1ef60+Rd4\"k3pYCLm,0%I'lHNT+XMHlAB[I[qIeE9bD+\nAU#ir5ZmZJ+eA(DRi(KMSR-'`SK85&2De@922`k)jq(3P(iEN!0Hb6VmY3#,&j6B\n2lC+&Np+&QC!!pZ,)Dl)JRpp&(#ASVkblUhS[T9'GEad-5VKpGpRk+UU'(I'S0-@\nKrJT##'\"3%qEGk-JpVL\"VJH(ID'ca)+[VlXQ%$XbYBDm,VI(8KR4Zi(D)6q$+3@,\nVQS,RCc,L+*SX)(cm!cfXbQPpN6FkYAkl1G)8'PEjRm0T+N)Y,eTX9H%'KLq2\"MA\n$-b'5cQ8N%FXMY-qPadY&*M!kqdB\"\"XK(T9\"lDB05eDl$\"K3bJN!0jV!&PcIqX(l\nrADB2ND82))bQZ#NLAPqKGZR`C)\"VNTm)1M$`9ZI\"0JPk6%DMF+[-,Gd*,R369G,\n+IehjUkI&ShhUF,Y@i1S&E`DD4QAP8$$*REb!*G2MTdc[Nd,cc!j*8TAD9%jqJek\nlq)ia@EAIH0mHTE$R)C!!VA%D1%m4'h*`mbK3UZNI'ZjralS#$#5F%FNaXJM5\"Th\nK3)rA\"YHM(9j3CGDjrb$iNC8jjQa4C`4UfT[8J0h5TbM8AN+bCIPR`c1`e%SIL8L\n)5NMJUG1[cf%r6k)IhVjiB+!VNhUZZd,+DYZlZRMkFGjc$r\"UCT'bbh!cB+BK2D$\njh$kq'1Ar!GG5GNATe4Y+Dkc*[(VhK,U%l\"39bJT[4d#U2Y&8&Z6c\"I-%Gk4`5*C\n'CmL*@GHlZ18p0)NGRLeeQjX+IPUB0PGrd4'!bmk23h\"-hN)41)-aAP-,1H0Y!Aj\n(31cNA!N1b5fI[m*6B3&F@#Hk`-pcb#5UEP@B(UBeJ81VXr8FA$fS`6lbCBPpe4d\nE$KNZ`F'aN4[4j1+fejd@8&hR*14PiJje!%TEGM+Z,$4R\"!&M$m%@BM,XX&-`a&r\nQ3Z%Yi$BPEN#A[QhErPeHe26R#B\"e5#jXpYHeh@6qiJNV'58J)P5HYX'+kVGiai\"\nM2A8KEYNJYPl%Y([D(\",c8rpPS,BCFRfll!'%iMHl&EaBI(,rFCrjh56S#r\"6$@a\n4,,8a#L3)'**d)PmV0#(*h$CVYZJ3VM!3HZ0Ui\"Sh5IC)CVA1b5bBp&)rQ,UQ+2-\nfR9fI2Z1(UQBM`I'q30#VKcI%J`N4I,BABcFQfl6Pepq\"h`N[KL\"SG0XRbELV5[K\n'13h,qh`GI+A!$ZGId5%A@q@rjGhJ%8KJ'#S$a6pmN@NIJ(!b#JPCL3H\"2Tr%+[5\n(4dY$c&dlX3l`8D3D!XHdFJpdJa%r@[k9S)95*5*[%4,e[T5i8jpE-$fIR0q0a+$\nDBL8pHme@fi#Z+6b-Scqp0rXbSRGjmID+!6a5!\"kPNci16SFDiRSApYB5#Thpjra\nqJD@XY@m1`FkiGQ#jkB$I1YU[pK'EJk\"F1$IH`MrQ(d*d+S(TNU6-ckDEmZ0A,cD\n6Fl2\"!B!'QaqV8h3fEpNIhNm*Kqe!4LCE-Shk%mab6cH(c\"I,GXX-YP'2FU(G65e\nEe+b3!!X!84*`EJlYEpG@%ThM#SCq`UhiajDK#P*2(I(29#2&1qZ%LFS-(ahKl6`\n9K2h8jYFjl8hjL@#ClGAR1eBibjFeQH`4dd2SDbfEJXdfC%`I9rTPJFPi1caB5Gr\nUK*K[8rD(a`R1FF&C1@3+&F4\"i(d)JZC-2Nl*UJ!PGJ`aA&k80%-$MGDb`8*9*Dh\n+*eiN%Z%QE1M*e+1rZKhBR#Gl2hmH*JM93%QLkdM9IhSI6%bUQU9N&3KHN!$XKh'\np\"iP[H2J33EV)0Mp\"fUEr3keHq9kVBX#%6D3%q$!hYiATTJf5XaS#NH`*H(XrR,8\nCTVr@ZFlFh$DHf!lU[a+!,3ZZ&$KdL&3#QidAjAGireQaZ[8Y(#c+kqjTY`M-9[A\n4B3r2!*AlA[CGEPRR!--$lc-)dHUIESd,K&)8A\"Sljlq6&eeAl@'kIf[V4F4kGPL\n5q\"8ACi'VB2R,LNiP-k+@',@+mRd$#GIaBMQMdEQkEI\"h-D1'9qF-mb1ZM2prVjK\nZM#`!qLKLNeLq#&U\"`Ep4F+6HG2(*S(-bQcSjrPj6Ze9JFI18ibaVmJEc3Jf6G2%\n2pGd'e2Gh\"'Um3DdlEDABL*!!,'kIY)\"EZC!!5L3'eKc(4iJJZmk62mr!rRi(Xr-\nTV3C9+b,N0LiRr6-iE&l*qr&)Hi1A9jC0d&J&-)h!IT[2AfdVlkh2$ZfLlCZde5&\n&fM*\"iL%(!$R3ePiQ!#RAV'er8b3h(e'i,8b!@c--aC&(3$pSm&FUNDJ,[Z&Krhp\nhAh,RedA,`CLE`L5@kQHY#ha)bL%MZ!\"iRV$PZrLC**V@MLMhZ\"dmjd3%)P6dEKr\nJ#f[lhdfSJ(PN1q1@br$r&3mdbfqIj2UI2i@jIEAGpY1j2UFllE*rKB9pY2BrJeI\n`Y(q&5r`SB\"\"8-2DQC*H+Z93$m3B5mN[fe)\"CAhC-%+@b$@Hc'XBjr'FpPb*a-,h\nKf1MXMd$)r-!j(VV!XQ,NCbG49AH5(j@p(aef@hNM532r,VC'KT-'bV0+lKJ`LY0\nIfbe9M&mYBhfH(TZ%c*EjL$fakdX(CpYGFY8JbH\"',DcpYhqY\"QJH5IG+T+f064'\nlE\"C'[9@cYU8cCKdHTVeif,Y(F0!@LCKQPkNJQ(p5EpDr0bk0$f$1CM851UpFZcG\nmfX9I1E8NB&F1)P2(E38AfLTBJ6lZld#'5q-jNY#Q)1-h#!KQI'9ZehPBr9I@L`m\nMj%HpVcFMKbN@0\")8)982[BYJp[%NC&2eZ8`#jV2)$\"(d0Ra+E-i(BraKcbl1UF+\nYd'l5QVe!0a&D8*XqPF%A%,ZKThLfb5X@,#ZdIdA0kT!!cSGjrLSmlAHkp)cd&LC\n#*Aq@5!-ANJP+S3e4DpMX!IK38chY!b!(-U5XSj)Trd\"D@r`LTi`INJEVBHjiP18\nEmPFKX910*&0Q`H,45QNG+-U-d[eXB#b3!-XM\"-YJ\"-GVj4mKZA*'C&l3ARKSl0A\n*Df4Fkk2*f`\"*15eN+YNM[bZV\"QMr%NIJQhba2!%+@XHmAB@)TB@\"USKpQrIcQ(H\n3!+`#J5BbBIIdbQ\"fM+X*RAqfa@1#N!$96Ll&(X-&TPdNV'B+#Fb$\"8KP6%Z3!)(\n+P`alClb-'c[5N!!0RI@aLrLCF'kY\"Mh2K*!!cP1)ah%j8YmBQI2rI)eZk8jrb@3\nND0bcNP0KY,+JiCDeqPaSAX)XDa@GKeKq-QZ0+Zk[jmN9KC@C!MTEl0C'KIAe-GH\nkJ-RYk!N4i5QH)`0bT*K[6,XlBe5qrbR,ATLP00$)`+'bp[I-mBk2Q1[-rA#KV%6\nIqaR0pCjSGDUJ446pmCq+bhU9@(`RM-+iN!#`k6J`6a+i6#-\"`GD8&HfqDGKaIPh\nZ-,9Pbk'a4kB2P4'1(3*i-cba4S1JlUmbLcR44&eN16#RBacZ*Fr35!-RAApJ*Gr\n%'mqc82GVI,\"iVC)LYq&r(4@9AcrR6Z\"fmMlf42Cqj0j),IEIjDR2MZC[M[!DXL&\nUrhqXG[hf-eNcCrZ+p(#iEZABZMNLReP!R0'-faSc\"BV5B`M3kLi!lJq[Zhb&qLe\n8PLcB50FQR(95NX1aVPRK([lI$[QHDq$'FCpC(L'`4kFq&(qYkN1!`I!eT6iRH(F\nimf9L@hC0FVIR-dfdNp)S$%-jdK9BJa4(cQ)Q\"Bh)`88\"VaED`SHC8pHQRB2cH(V\nK6V8J+\"A8C0Zr-L#eLLIbN6+Ep3aTL$6)bBAGr'dj'E),S9&IHdEFJ105aY1DGL*\n*-6XN&(`T($$m+ali89@-clIr(m@@66,cc&G9pq\"+1NC+29XVYG-F-rmKNp[E**l\nkXJTR)Fb#mV,p[aV13H9NS*`*%#A-(mIiM[DaB-Y8ZlV*)@h3TebRpD&k8F-N1PE\nC8E`B\"XXc%@X[QTiTTrJiK,ISAU`%USNeUCkKUJUNa6d#,HlTAXjMME'+LALRbK`\n2*hYJ$PH29,ec#a-3,b!5DeC*LZI&V*6dcCSHlf!bP(*l9`riRi,YcAkh4(MJJG*\nrLLqIq6j`b3@kF[ar3[LAf13e`mhLN!\",fQ+DAL69d,,0b,@,%qj2QbrmB)APB%r\nbkhHNAKrLj8T5,!9Kh01dFaTdcXHEJPJ\"I`EFBiP&UShh4+IcRC%+jdLXq!jGSE9\nmGm4`CH)F'XU#jEPa1,J(rVBG0jP!&,,*#mY83&[CP)JK(Sbh1P)cXieUYa(2&Si\nX5AD0jMTqj+$cMU,C5b2fe9hXCc#mZK,'!H5mJa,30K+d%fYV-(KRjBK4CX5jEDD\nh2R0BFYb@ANqrrc'6mmcNXUCc0r1F$j6UeG&'VepTH[badP,2+TPVmPS\"maq!ImZ\nP@c'fDAf9M\"%JVREb6,C+SiLb+*(#JZLE1CE(ZVDXd+VXP4qKNMUYKf@M#!,AS1$\nPZc`XS+Y45ZEe2pTDfqh5bJB,R%I$C0FQ+b,L)Y5plrKYI#*5p+8%p`\"GD0M0FKG\nf'JS#q#)f8%3C#E#ELIlR3V,N6GLFj8$mScK9kb5qXL`9dJTV)qMb4X4T&EVaZJH\n9cN)`5Z9`A'&LE[*5$Pc9i#)9#*HpYKPS#@F84eP0'YaH@fm8`P#$D@&!-[!LHf`\n$T1YS5U(qR`[9i8B*YE5B6[HJMJ-dXQaUHB1X5c6Z!*3jQ*&V(dJ4+i@4$%PZNhD\nAB@,jhcBZirK33TcBp,8bPhbp5#C!K6),$4$hhb(24#\",l5Da+)[YZTHTR$k#6&h\nN'NF9%2)ZlM1ID`$jA)1U9k,RU3V+9!HqIj*Kj3e84J'p&+qI-hP[GV0XZi8'%ra\nj(UJ)j!)c+\"EjS30M&!haBb)4'Qhi`5rMM\"$FXJ#*AIp93$(5Al\"HEPE2fi#(12@\n\"T$1YEBp,,PKPA28p4GUfeMFeHRdbM[A,I5NDjILAjPECVp%el%V3FFD0jaP@jh'\n,J5!Jm-$a#dDLjq89c5q2bp*LVHiFHQQil*)b)Y1X`*%RPT!!B44DNKb*iPBc1&N\nrD@Up6i!J4RT&TVpm(GQ3!0'5C'5l'l-P5PheV8pM-2,QHbRdP6''fVG9AAe!4%P\nb8rdqLh$i'&Q9UY&964*i2ai66TrMpYKrYd`rESVqfpmIYXApZNIlG(rfhIKqfS[\nfk,rYZhpYGZUc%pM\"N@VkC5-#!M5\"kaUEf%(Ka2dXJHd[JN6LTj*'8ZSj2EMapIP\nj1qU3!2Z9E\"LP39l\"EcbjNp'H'I#VLr0'*$E4S#q3!#HPSU,(+qkeDjBPJicAR$`\nEK)Flpl8ARDF[pA9mca3HapXF*XFb0p4*YdFHf'0EJ[,E#Ypp3#EEq%+%!J$$lq4\n\"F636q40QBa([ejHF-RNqU!2`Q-Ccppa'XkN9iMl!+mhNMq3+8([iM@V1rD0Z!bc\npNHIYbIZ%hfm'5VSrV38U[YcZee#,0@Q`mC6C[fXINI)p4+#h\"CL)Yeh'l#!1C16\nmpIfqmZ+lU'DKMYjR9`&dI8VG4T-Uq54mJ,H3!&K%`,cb&FmE8BKjaG`!0D@$+Z5\n4QKTKaq5'RcIr1(e4HL4ZFM+J5S)hK9)f%)15+#AYfZK%1jh0aUKL9,d4*E$`Fl\"\nkR*RX@)Z'jrT*$(qe%25&QjkLh*d$SM!mR)%@cM1@Fb%#FhD@0Q&P605AC8B%ZQM\n2084+J&fri151Je4DPre68PX&H3'L#SE45mCbbND520,([8lNZDR1ShA2'CVBV0-\nl49Nej2'l&XJh)P'R)f`3aGlGYbhHF\"90GR6N!#`,2rZD0jchTEiB9bL\"0&l'SY0\nEIkc5!4Jprf333k`9FK,fJ+(EY'[B@VhHr1VV6Pq5mX2b$*-3Z'D$h)HSY9@bE90\nCL`a3X9*0FPb*LA4mj$JNlc(1mIZff#-!@PV4h2(GfErE$80()hZlJ6lC'iXFLQ)\n191)(rNdG$3FSVX%5NK`U#Dbde@cHF(YJ5)QdVCIK[GCQQZ(0\"TJk(bC-B0Z#la4\nfFVa1leXFV6(1Eiaj2H-9\"D(#YbDhSkP)*UPlj!ie@Xe#MQFZ'jKdH(\"q@0JA11@\nIlDD54`Srm2HldJrC4hFHa5`ka&1LQQ[ZMdS2C&3&)X`Z)-R,KD58%)%[m(c%F9`\n0RV0VhA9&R,$*k2Fa&l9Ar4S$cDm8@%H6j,A'YGI!FJ)pal%5fk2KQTMdE)(1aKj\naXHp0F2*GYj*F9\"*+P@i9*pfTAeeQcDa!2epZGRGXG5EA!GR3KSrrCU*B`hU)ccb\n,%Gm&dS)Ba3bX0eaIJR`SMPMlN!!*Ilf4J0X@MFdiD`mH-V$S5MIdR1qXP$e%UPE\nDE*d28(0lJl`CN!\"q+'D-*k%B-a2&I&JUCh&+T`ST2q8-`Nc#Ph4YZJj+AZ0RJ%p\n3UJcmeV1HPL*[-d*fT1aAEZa\"Td34`E@2mYPZ@V%CQ236d5BGSILbMU5mV3AfdqK\nqCqf0Y6`9*UD*bMp@%99b'fXq[5f5l0fNkUfI[\"JERIkCZHm[Y*(K\"(LAmPjm)iR\n*4*m*Xr9#YIdk+0PTG@dZVDA9YF&HjKTiUjcdiUDV,#ZZLJ9kAJ(Sf'\"l6qr''1b\n5frZcpMkYrhIap\"adaK[hP3*h&M@A6k$\"h6+k&,,'FjN\",LiFimJ,mHm\"e*AEZSi\n`P3@[cq@NeDD[1V8Lj`)SkL4[N!\"6CM%@+!XEQ!@9R$#%R#&dDq0(djaA#B0Fr\"V\n@2Pb5C)B[M&dSSJFCc56m&rlB#+#!CD'TQP52Z)Ap9cq&qiaPEKl2(Xq(mlAJ[&k\nSXk*YXJ(dkXQJjpq1\")#,GG\"NCPekLDBa9ZdM@hKi[#*ri&(#d)4J@IHNrdKXlEh\njKk+%pF,VLPlHQ5P&%qI#CkkSV\"SNb4$+Lq1-H(#pC2#c*09f&Nr-K(0cT!D)2'a\nh%2TLb4aGIk4NSZ0#hhBY6D\"dH[1Y0*4(P*f+YFV$[rh#VM)K9Uc+`Q@iMe,AdrL\nECV#ZY*Q4GYVr-c)X*92m\"#Mm6+bq2PZGl#lHKIfpM#`[kBqCk`afXqIUYDq,HG(\nr4LMr@ReEA4)YY#i2k&*8hJBCX(r-h(SF3Xd\"dl3C%NN(J)BL@lf8ZYk6U%!*U5D\nkF'Ah2V\"D[9Dar1J`k*R6ehB\"A0!DSR%J)rL)95#4,L&KqC!!k+GXr[9IAEk(hY'\nLTkIBFfaL`f`l8!eFhYEZ((R5jG\"6%i([!ic)H5GD%@4NNK#e!mLk\"h[B@)HZX#+\n0NYida&QPa*e+Sc3##9h80#D%@J6PJ-&*rQlH9S[r+2S)aU5UqGBd!j)eXma69dM\n9%`ZNd(2FY*4Y'Y1SmFLC+%$GV5qU(#V1qp9iRZL#DMVVYp@BqK2EB-U6kZAD@8i\nHP*T\"NdB[J&P[R5ZUKA[#ehLiZXjI5P,m0f1CfkV`5Dj[N4r$*&XGi%9ZF3KeC4R\nMqHP`m+mXK%TjdFFX4QMj)c6K-cib*aTpQ%&9J0k,aY`YGqd1UR22A09$#`4KmKJ\n+\"0S&m3$1$A4D9(k+NRaHYHhG%h0RP[8,ad2,U%p1,$N,bda*2J)i*i#-FhK'(C!\n!BfdqfJ3epf5KG``)j)-c+pbD2'9*S$j#FIkL033C,*LDRdaa0,kAb2P[ihU8Hbp\n5T#SVK)FK+D#G$ekQj@H%TQSrf('5mX8q%PY%Am6r$mQhHFe#$\"iLdc!,k)2J!'S\n1%ZB3G'NPaPCi`0Gb&R&'&q39YZ)b$'3-J`!SEmEV0`&$YV1'e+F5r[pb\"BC4#ha\n32iMR*kC*Z6A2!&-2BGjcYiM)bq'@2RG5mN,#XVpTKdiE\"Tqcej(a@)6EP4(PY,E\nk5X'&5e3mL)VjBK8X[!-#jq`EhFel`SM&#hi)6k8AL*UIF`I(K8cm-!eK@(Fme#k\nDPG$Dirml`PKTeTcX0f%`ZNA+q6f@eYZ%IU3NM8,AP4piYbB2%Y!Q0(*mIH'6aI%\n&LbY)LPl!aRQU4\"1q\"Q[P!!NTShaYliaH,4A-FcBIMZ#SKJ'GJT4lU(b%6'bI!#V\njaF#RMc@6RPEYFiTYaPcBraIZ&m%NrTZaZ8!qD9*mQ`hld![PXeZ)&61q$-j$dej\nj!*XZEbmS3j,2G#4ChX4@@Gkp9Pd9,3cii4U'5-a0j1ET+RZIHAlQGUVqj+-8qdl\nD##E\"&mjIVBBSp6C\"5'raY9KlQ[f64EYG$T4G'X`NMk(a1jaIlR-kFUfD5Z$q%A-\nBVTMjEIk\"!MQp1fYJ%R@GId-DaNqT'2#ihZRIrRHHDKZqe413!(KDI(I3K\"2DVRq\n-ja$Xr\"l@baIjSLY3QSMNc@8Mmc)4FNX$!(YdYa%fC3&IS(UHT'fX`6M+[N'\"&PV\np8%HkIE!Ar!qhpIGB4re(D-mVj'Z\",d@3!0fpi44lZa&5%qTR,--blF$[pr`$())\n*Q4X#5`9+TUiIr*IUI\"FUBk\"4'*`,RNAq%1UrF8MfimSZAeQZNQ1dH@TrHl0A'1j\nIhfrJKc'+q$4Bf(11i$Sh4QUhA6H[ZT1DQe3Za4)8lSP\"#bP3`!J1lVl3RrShpNH\n9\"4qk68j6[fdH-M0FjbdD6TCc$'*,QXRL%LJYFp05Z4(*m5*P-FcE6L\"RQY9Kh[@\n11dmF,G@4*K2acmh0qM5\"l5UrfmL2V2F3Ra-0BjCRpE*bSK,L48phc@[[1!XAKVD\nCfd24krNB)3YNIVD@kpVfeERFDN%-SY',,q5$-m0TbS+qq)[[0e(1RIS*Rrcd89P\n6qUFfCLC'1cX01aCEThI\"UGBP+j*C\"qKr\"D)G0V$FIQC-[\"F,5YFUIH($T\"B+SlY\n+mSN48a+[h!6UpJCpLr-K2p'hcL'U5Ep,HP34[Gda'0K9@S*SeDZVJN3`#,pVhS-\nlBTdR[2BTm$6ip,YpGL$,JdKR(5fGbmA(6k95b(Q!(FS5ekQHTdY(-6F[pm$X9SC\nq@)&QkNRkPFDrX4Z)h$)8YF&XJQi`+5Hf(#Q*'fkj'U\"k2[!4Dk8T$&M@c!(2d8L\nU((EbrJLL5hIiT896#j!!3pq`@Ad#NcR+E-8q[YGF'U143FJ+-@CXSj5Q\"!IiVC6\nP4GK-C0[9BqC@H23+QD#BY`&6*S&%&)14Jf$H[+A\"[%\"$5*jiF4d1JqI`YEq'MIm\n'Mhm0\"-rKErm'Lhm0(2iD%BrKA(m0\"riACr#c!1Uc%pM\"N@VkeqLAl#C@Th(8rTN\nHR#`NP@5p5!qSQ2-KbIIYGjd3HcSBQ#0E`2LF381dZ[[lYAGJqS9!PB@8EY-%raS\nY*G*r9G5eId59mZKCTAbqYki3kZ86d5Gr$fSm4m81%[e2b*04E*qAPh+eN3R&#Z3\nfQ)RkK,'FYhZj2dq'F0VfV(8K*83[c+j'%i&)PX[V9qr&p+cDTEI-lBE$9\"2Z9*M\n%'Ld%*&T\"%qL)044Yc!qDlFp@S-*eC,R,L-,IJTfTXHAQ!Xl40k%[%SNM46mC9Yd\nCDBIN[$3[P!2G$E+pjU'bNF@&UUD#DiBNG1Q`V3Fd*ZkZa(Y%ZF$CL1qSd1E*JTL\n'bR`1YEXb28Eb&r&bD*rM5Bd8PDZ)Fcj*&hN+6($Ya`1a9I`$0J@2Clpl,rp&IP$\n1!KciVPPqUr[#k(qXN!\"-ZRa3MpGP@!*`4L1q`'XP-*35rCH*V34J8!RRjR,h4e-\n))ErfEI`Q'YMfME)pGrIAX`HLCkaR9D,c1B&PX,L11\"dCaji[&k!B)[XfjP`[A`0\n%a%PbCSSZ@(%)-%'rq[[JXS21NMMLi*k#)DFehF*PUkp5FP+BeS5mqB3!b&JA`I0\n0F'cKI3aI$SPCk9GJ!Frk[cD*,B0IB5+&M-0)YbJ[(,T16N@l*)-NAI8$Yq$YVj,\nb`r+B1#L8Bb5kS1Dj#X&4Kk,XAfT\"[qmeb&2+(9SV2NRQIH!DejT,mcVFNQ39QXE\nB%,5Tfq&i@2mUJ+ZbJ2MKJm+kF&*kb-ImHYjm[A!)(EqN*rR!M,PDSCYV*L4@cLJ\nA)+9Gh6[a!dCeTNBBGGJZ3IA3*(-I*Ub@Kj)lf,f$!dFGFr##fGYMcqbp%X'EBMD\nCQT!!TRr4\"1+[EB4U#da+52$K,`&F&R1jR@MmbQerZaR0b'JTTSqNrc'JCH[00C'\n5JGRNm,PXDUd0aLS-$4hdS+4TaX&QE@Lki-%*,!Lr8Hq'XE9+Q[4%mjCLdPlLHek\nSS!VKc\"G-REQlI9Z#CYVTd23rrdJ!H#!MVMT2*IJD[)[3-0X8YIZEpS-ZT6GTAei\n-mcq&L@Jl6&6jShrlQM6i9qD-`G)GFFG2a`[V38U8%VAK-j3EfK@*)qF(*eNfR,,\n09c$)+Zh\"XQTTi-Mhi+*APRMUBFr((b8+[bT[RXQ\"kQ(8`43#XCc%r$)q*-6rIK-\nKE5IEFX5i%([\"1mp,@(l#m8BCmi*P$h9$Z`0QaZc`$B+c$93`E*IC'#2kEIE1Yp,\nh2@h6Y5bjdU5`0l9)hQpi+cjdYZ+3!2!5Uj8P(L!,CXa**pj)m!4i9TdlK1YpE5k\nYTN*MSVe\"Le#D5BQD@cffXS,h[[99bDS8\"FlErARqQImT-*dC6dlIP@DP(c)NcHI\nb)B4$VQMVP,bHL2T+4F13!\"3hdq+QUb`VVSS&HPi\"kPZ@PNhH(q$ZFi&Kkr3qPJ6\nMQ9M)RS1C1p5N8+ll)&#rCDe4hB(3*YS@mGT#8))dL,#FSVeFP(Q0Q4A*B1XQ46!\n9mb-r8Q'aArZYhMR8VD*3USi`r)KH49$Y`Sa-cYJKR`a)!0hf38i!Am,C$QAIV8G\nlc*[TaG'BkeMYPqGXZGdmG5Q`Z*3Bj-d0`*BS\"NJ%J@Er'6YB%\"r1RJGCYRp-Y-M\nTF(mY4pE(A*'1a0lAF-P`B9PhHeFk*UG64aqr9&ab!9-V`f)a3Kp8ej!!G+T+DIY\nKJlFRi&(#d)4#`chbQChllJ-K%Ib-H-0\"`,#6!NMNSE38R,(''l9GAE,Ki4XJdF8\nhG1CQ6Hj@)Z8TP4%(),Z&XR)['Gf`ZfS1$P-2MdriI62F5C[QaaYQmSIe\"LRjGMK\nkBJX!3SK5j#q\"i(j6(8j&r!YfSDQ[Je4-@UUiV\"31@AK,q9p3LpA8[e'fd)3G%61\nUl5clCPpL#'MS4qA5mGD#e\"F0,-bFbjM'-m6mK'@!84ZaI98BYRZX6h*1)hCH(YF\n\"kGfT-,$3-aQX)jq[V+`P@`iU6BL*Tp,XMpP`h00Z\"kC\"f&m&VkQ5V!CQhdN\"P$L\nl*\"30B&Kdji4IYjIF5&J#'iXH8DVr5m5T996QDY3fPPRCq0,q%Gl%6Rr)ZNI06,)\nebDA`(l*Pm-%JhMLSeHAbI$L@\"rpP#i-%[18q2EM(`-4M8faVdfC-5*d#EPHhr&E\n#5(MhUmhXm)Ajh2mFYA$U#Xbp66N`ap'%U'Y'#3lN39XNU3dfGF%elqLq$hhAJrh\n3E@LjkN\"qh-0b(@[SI0R`hP9P@V%1r*S)bjHI)Ya\"HRdR%kXM53j*\"H8#A%af-8b\nSc6(@%D$jie2j,LPkGKrITV3R!ffek6S'Mp\"cK,`iTmijp9X*f9bKQ)@Bp@`4aYF\nA(+hrG1ihF-qMPA`8$T+dTmMrMBBf-5YRI5N#KJaMI(jjY[5XFRY0CjjD[(@6#m'\nd5Y)9,i%2-Mrm)HKXNk[!R*@M(H[-XY+#Qele#ZNUR#F9id)IClkBbJ-(N`K0l$!\n!\"h&qK,mI5'rA,T['4J6pXH#b)UpPX&1T#cI`c&mjh5L'K`J0-er\"jQ`d&4rK0`b\ne3[HiS`BE*j'CD$KEe6d,#PD$m3Ec!`)U!qkGEd4FAD+4PFapjeV[b1!X'f[a93&\n#8,Y[NlL&NCc,[RTjEd2J'aVSK8mqFelX31T3erkC@9#FrPe''aGYK1HCLdqY\"rV\nhe4Q`&A@#V`5mPk\"hMJ)P(1Q6UFB@R'H[*p&JAcYiEj!!dm@1CSEe91rHHKRbT[M\n`U3+fC+A5)X21-lU[h%[Cdl![K`Q3!,G@+\"2+5J@GVD&C$HZ6lQ1-!Ikm!&ekZFj\niA\"Hr!,YX8V`8#XT$J\"!2jUSr,A@16r)Q-lbM'20\"hi$X,k&(bBl#PJEd\"3R3#SR\n&jdB4-plL[d1!m'\"ce+!KHj%ZQTR%k#56@-9QdS2!80%%!aPKE9Xcij,C0`@TBHB\n`p-cHf'U\"XA4QBRqD`Ba#mXA6r$mEm#f$@Ia5-Pk!lUJS,H#V-XNLpN[@M[fZV(#\ne9EA4[\"L),5M0I\"$)%6PjmACIYQZGrLKVE\"H`lNF#(0a6G5Y19G*eh[F0ql32r,6\nEl-16jDEY%H5BlbNR#p,cm+3ACZ&HFi`6))Gp\"+'SSJpiDL\",'jekR2)5ci$[&HA\nJ6!YT\"U8$r)A8L,KQ$(9HD()(8KX9S-ihCfIPRMqaPpR+D9YdBBi`6*N[AR+i3RG\nX50a!RijbVbq88KZIVL1IaV`'6,`VBJqYdf3h*4C4KjQ-PB(P6LRYbJ$`EJ&J(6f\n(\"[m)-hYpl840kZ$U+2#5XRr)M8QG6rikX5LhV(f(4a1Fj!plr&D1!$6cIi0N8!N\nFIGS5#,54Yh&GC2I)&h$3FFJ@$!4L*f(fKf\"B5AVJf%m4D,LqrKmp!jZm1MRLFX[\nYj4$ZH3F`L4MJAIV0JBlAa6#5Y%m9hccc\"!`%B*TrNh))hP8)Y8hXj8T)*6UP8DJ\n#6l2'dqSY8DHpNDBMC42++)a61[kGfAU5,$(1G&B5)!*HU*d`C5AfHdmCmPjl!TE\n$5Cfffpb-@4i6Z0fpJP+l'bh!E#G%%,(3(+&QR@PR@2Y+Gf2`rN0KhT20$EA\"Y0X\n5+JJXl3eBfKPFddRN+c610V3hM\"8N1YeUP8!Y\"P$LLMH)lq996dLJ28Z6IZ)YL-H\nSN8DlfN,Z#pZ(dYJGD@`a'G[jZ5$&%G6&C33K01&Y9%4QkkphBT*k\"cDI&9S$8F[\nM1Rb1JD\"#+C3@dCS,feF!V$5G,AeUHqiih(q#aTTQrNh1k[)d`pGETHM568r4)4[\n[pZ(Td-VmIAFrbb`P&jZCEb@-CV2BC[die'f!+MNR85!1TUb!h5#BJV3D+P51'(j\n6L[H*EU&p),Sc)kIcVd2-KKI#\"L,2hiZE#db8A\"-lRZ2J3,ch(pQQNrpCZiNE08V\n[`546cP\"Hh1NK1BlCPS3&06$MULVXX09[!JPhGCqPIRD!1lNZ4!j\"j%-jYbYa@'J\n!Zf#-TE2ZAj+A\"*jiDi11f0&0PG2&k\"%#9F4dBarjMdfFK1D%A\"rTpSar-d[`%lm\n$26l4Lr!8rQDhi&q2i#Rm\"Ip!ArJ-J!A9c2M&UQcj9C3XX0(*8T2(90dA93,CAkf\nG!L(cNmiFm@a!rcjdqii[Q9c\"N!#H*F)Yr@N3#@'#Y1I%EK%Q!Za$Bd(rIjR[XYQ\n\"BN*Iq&!DG+UVjc6AV3-1Ydpf0M%rV[LBXS9%!SC6P1Qb'5p$rhRe[AGJi5%Dr`U\n0PJm-!SjVNMBm)!''*VD`jbFVNj)FQerrIaB84if4hE`)9#pHT31EL0fIFb9dXk#\nCbDT-Ka%rZ[TH+p!@Ep$#LlKUi00rq&1RqBH[qRFGcCbR+TVVK[pDNr'4Eh1Vcq2\n6FAdT3#8*l$d1m51%#63,IP9ThS0caNJ-T#AiPBN@`XqFI6V9)XH&5$rrB)6+ZRK\nC2Z9)bjmEpZ@ZmJS%p-lA&ra2@3S*#,N32`FE&jrqV@'[k3dfN!#VSV`MZc\"[qk[\nVh-L&CpVl!`4-E3EcIYD%M@m&'r!rq&'TPcP8!Fip9YV6Z)X$!1S2*HdKlRriP[j\n9Y[EV&CL1XYL4&F$amL0I5fHI8ZjYmr`)i2KYH(bA$q\"+KmQaiI*YQ$iGNi2KY)I\n*T$KmQLBI*42i-X2NVF2N9r`@HIi%X(`h(\"m1hI`)8(`p23q6@N(`p#F(`f8I2Gq\n(bAf(b8hq&)3q64-2NS[m(6Mr!43I$4m2NX[m#9$j0A`q6C%2NdC`I$3`q5em2NZ\nF2NDr`HB2Kf+(b+Ii,`!(EPFe%B@TE1$6@KY(!eb`ZRS5PfSQb1pGXl@Qb[Dr,IL\na,r'iImB4#fKMV+AS(b-9XFk(q3Ip+25'SESj!Ul\"lJE`e4-#p@UEXhdf8)$HfUb\na255&%,BDm[5F)*F3$[NIreHJ+9S'!HLk+LBYeHPGpCZ3!1UID[e1HRbM*@Np@Uh\nhra(&**2*rEa)V,U)&9#P4mLPLSARG,l9C0Y`,p5Yq+%,b*R-[JXlcJaLI!@UiDQ\na01I0fr'(MXH%T0epGIR#AbFrE[Te`dZYR3\"qSX$DAEXh*cjV-Rr6PT)T-Zd'P1d\nGLbb#TZLl-%[6PKl&mK1c4fKXaZ[&)I0lKV4A($-2L2UPb4Di,E5Ma3#RE8jZj@4\n[QGDXfbFi*6[&RmBkY-9iH(G$'BQ$C8896$k0JJP+YdSk(E*T,I4[P&9ACfeZ*V+\n!!PPdVk'Um[41Gj,cq)-4M@'@[!lZm+J@e33Q&1R(-`2A$8GDNN@la#`0qZ(PY#'\n26kH!a5X%0$%GFrHaq916FBVfe$!lD81T6#H2U#ZFXH6'l\"@XBp@K\"D2Al0MSX6H\n+aSEHMhQJAP!!)0Gp,JMrD+jP3j'C-8Eb),A-(J368IGTN!$%bm-0+b%@+ep1$11\n15ZjH9i3a6rMT$A+rFD-b%rcPX2m%9NZL&fYLNk6Q%PS@GN6-d!#9f4@6@iiPk4*\n4!H3jL9S%A+4K-rK`AaZ59)ACI3(p'QcUG0J-GK&P(JM2d9SNj!`BHe\"dAp'@i@L\nr&DSM@[01+M,,f$lC*k\"eI[T%EBrmqH`[Z&eD'(3T!iZ1prb)H(CY,B0'p9Yircl\n)e6UaYr4kjb(+%&S4D)lU2YQd566lGH92jHKHBKK41UicVSUQHr&p5\"FrI[pr#%@\n6NDrCUG0cA$edKBEIT0Ti@-hAieJDa-r1)-d3Y5dPl4\"ape\"VaGRVUfQ82h5meFa\nme'hqcD5!!0`BA-HQZJ%Y6GPHfLY,kIT2$Z+AhJUHm2!F%cZ-J9DY-qqPL41i&+D\nG[qREVFh+SC2mbS2rDi5LH5hP0r%Cj6IR@i@B85i(0ZVlU)X'YC,(m[FrrLmZlS`\npqUV@qcpU%c\"H0PV@ZK@D-cH0pRk$0)M%9'3$jp3rrhrqjkSQP4Zkq(qI6KVflaS\nN(%+jd31G$bH02+bSkGji&$q-k[iME*iBN!#$l0NfV&HZZHN-S*!!1bFX'r2r@Yd\n6%RAq(GHDB$X*m4lJ\"d8Z#bC0f21S6Vqi@0SqdTj(1PqT4JCQ#erQKG+`R2c\"62#\nLfi)R-GPd(iSqJXDr8cUpRp(\"SY'ajlGr2MeTKI*Z(qU*Pb`i!la2dIZJ5rpSe%T\n#fB&L[SCH(RfKc4$$2-a1HTE%blf%,$LC$@(Qrd&I$mI2Q9alKN+1-PQ0$+J)TBA\n9\"MeZ(bikZJQfUK[9Dh\"E!r$2U4Ve,-#M5rBTN!#rrhm(dQ4%Hpf6D%l\"0jJJV-i\nK6Dfb-9cXCAdR\"+NfUcKIrh+'l(0#)GRSDKP+G++!CLm'JNbC-*J)\"$5MjJY(TI,\nB!jDfAd!fV&Z(2rkCc81Z90j!kpAKq&!C!ahHQ,A[4FAd4Ej@l!+6%1\"DGpLkp#e\n2(0`ZXq!p-,eF9%VV4S`1DQSYp@NKrL+A'+[GZ)\"eXi,Gh(&P6,p[2$D9SGHL[\"4\n,39Cp@,bGb)[\"(6aZEQR[JSaXU+p'F'NJNCqAL+Be3`4bbhhh6pp19p2ZRp1-4Bb\nKaQeCMEp`ZQPKjVeQS$(V8h!(Tpj)#-DURFk06JhcaNm(pHJ#p#b!FpjlVS('i[*\n4!#j5qA\"rrb\"U+Na*qh!GJd,)%leeH6TrIm)l8Hka@F8rRKVD'kR4Sr*r#cjZb,5\nLFQ+GT!9X&\"XIa%2kidTJYrL8p6a1fBRUL9Nr0EdBpqRQ425021\",#j'5Xi\"0rL#\ncdl-G(ZM0$ZkbI\"Q(M$#(H!h0YjD%b2+RA&--@(1*p4D)[Jih$!ac'LRPfk#@f9L\n-CI*!)bANmfPI()%PZEMJ84p59F@$`ZljkIVdfqS(X!+GZbHB!cq'&(#p8-(!I[#\nQ1XCfklfarcFDX*c-c2Tbmj)LpEhhMKG6Q5f,KP`*eN@-YqeF2Z8&pA#J'b$5RXf\nZBqH8b8+Im\"#U'h1b`$GrjciS@UjXlC8@5#6b53MP%-EBGm2h&Hi[rKrTZcX-DJS\ne(ZS+-4NI#1f0c9N-Tlr5$(`GE'PLdZ\"AKSKCPG9,#R2QDTP&Q5he3M)fI'V)ZZ`\nR)%ad$&\"K#kXB60$LlqQ-%p*X6'ZU6)FG8de2dA,$(#B44mXQVr&rIJ4!)BqZD2c\n3344$rhrZ\"E%M`Y1!klM*%1eXqK,+#3dGH`+PGFK&akq`[qfbdJC-ZKC44aSJbF&\n#%K*3XIka1HGfGhA`k3I'pX1Pq`Z$%#p1jV8JKk,#\"$UF!$K19eDD)`2[V1UEhYH\n,8B&`EdM4d)6I6*[%2D(9SHF2$CJ&Z!q+MYkM#mJ2LYRaEX!UXj@S6@1K,@Xjich\n(#(!pF@ZmpLVLj)ZlbRGj+BajRr#)`kEK$Yc96D2f`[QZ6LZZHBHj42p3NcUQ\"!`\npD)$Q&pXM1V*aaKAZA0CHP'dJ9DA[lS$,jM#+k&(%lRB\"U4Ffjcredb@!L[S(chZ\nCYP6@(hYeN!$IZm'UX1@EpSr$*m+%fT!!&\"VQB[UA\"PkF+`i8EqfYbdHLa2aIP'*\nLPrJJ(16NP8IFP*B9-bDFZRUb%3LAeGU8bmb3!,L+beIE!+pE52jaqYUp%6EHLF@\nPTq%`AaaBi6'TK`fMIq!Z0bL4h!bNGe68Fb19!B&kM)-ClaY*0NFrRVJ@bYh$D[2\nEIBY)Z4MGaChPqlIFZJqTAjR#0$5Xe&8F'QfBhi#9iGII6dfS`pLdd8D$p`MIYcZ\nY`pQjVmkbkFAGZ#8J\"J\"h)qTV[&ApbY%+6fFF3TQd3c%'1h\"bqY3D[M!'2hVrIq)\n4#bFb#15!hb%JJ)@ed6l'ZkQKbGGEcS$k2rR(h1M(k`cr\"(CV9iA5YmaFJFK-p95\n2i4Vfi%[Gdhlb$k$dTDX\"R513!+c%m2p\"3%q!%a-QCGJ((-8!d1!AYSi61r&6CT[\n)E8Q))!S6iki$6\"lI-QB4pEaFI+Tr[$lRjVqG8Jh@eZc*6*J+&AHkFmT,RVDqj1l\n`&4*ValX+`J'kqNYG2SrI13q1p5T2adici9SV*fq4eM8G*bX$%U['c&(`N!$\"3H2\nmJ1YS*5hMc8CLJ3RUUZM13SmcHMcTq3N&M`NIhUIkSia'bQMZDJ3&4C9Ddj'FC@H\n#62SQ\"lr*$*,MImK9,8M&2*2c3MaK%(Y(kddHG#QhRXb6Pm'B+m-(693cEhRKC3D\n5\"0ppKe0rhG9a*k5dbR6$elX$91ZeTS1+1h6`Q\"&8GhVm5*@D82[*VAib1r,0UA5\n5)&'ApMJ+Jp,qYT!!YT2bq*F+%,C\"A4p9I*ZhC8f3!*!!(Vq')Y$i8kGB-$*C4%3\ni$GSj@A,mDA$PrQ4HbiIajV369VlJ\"+*dS5QNB-hIiB9feMF4NaAFfTT5paY0'i`\n9Er@9meiFI$Q8J[YUbI)jAE-aHQMMajAiaH5mh6&Ja+bYNI&%L'ihYC&&Zr`hS,f\nfN!!BG3rT,YeSF4alpA,jC-bh3&)dc4b+&'Eir'K[f8Z\"UfDDd`PreYkh,`8FJVN\n9Ja1eZpVmp&1fHihITH*30Sr0JL2MD+#9a9Mk9Y2dMd%kCVUl1jhhJ+@cNi,p&ap\n`@j&ZA04[pF#'c4DSae!3B)J-!D3[181RA0AhU@V[U@VU,1UlldE2-h[iZ$AYY*K\n-9(r\"2[-EH1*EQH&b'@Kpi%-88-5NjZF#bIDIK8N%aLIK,cHipR9M,'[rIeB6\"NV\n`YV'mJ6QDK\"&(#M@JReRmM\"+HB'M$NBQF&B)4PrKe9VS#)Eq!J6m%rhCXVrI8+FL\nG5$`L6(riPBk)VfUUT8*bj\"6d2PQE1dRI+`qp1lFff9QFM2h@3[p!@a'laPFMiPM\nVh(MRq%\"\"U6Krl2(hkYS**qBZ0(cqXDa!r$'+-aGj4jT@SS!i90D%\"K(,U\"5#UkE\n[U0llHL$`TcdceB*QNm@llp1khL`Bl&lB14DaNTRJ!jF,Fhq'A`LHc5R*eC3QLcj\nY5Fc([+RPQYC+3hraXk&FYT!!@3b(ENraK3aQQN9p#H9+qccV`qrIcp\"QUf)Lrhr\nbqMM5bJ!VRGV+&6HUdVYVm`+GF*@k!Di')PmbP%#a2iX4RV\"ZQRf*4NLrl5YFJ'h\nCM&dQqCTDqHr9[EeSUL42N!$aCrRCKI'HN!#P@&F''6#!LI+hlN'aeH@&ZY)3+X1\npd$bF)H*BU`\",0MVPGlh(a184VE@Y#B2*J3D!D5V3'FJLCdLT`B5#I643L2$mm0@\n0Y45QV!kUS2U5jXJ2P$'GAmI\"H\"FKc%5%1,aHK$-#QHc*BaD`1D'RUq-'mJHFqke\nmh9+6)TSr&GSC%!YlD,QEqm+TEQXiieBe!hc&f''9pS18Lb,`)bVPrVjFCYeQM&0\nV!+A)VGMH`!pj)'f(lj6A@lkpTJ*)j5YCa5fI-IpVFJMjJI-MKQSaqfm(Z!YMTUi\nSE2AlPJi[Eh$RlqJEl,mK4!f4j[a!9jQdiq[Yp(#48#2&`fcXc4B@E+&[2*33!m0\n&DZpb6Z6QblIh69-dj46L20#Am!HhP+-mmRmNjA&Ti&b*+HrX&rKkir,UUkV#\"f*\n*iMLl3eG1N!\"#k2+E'V)VjKLr'!HH@8f0`kKpjXcFM6JCDUNN43\"2-!Drb+8G3&a\na@#Y(N!#r6ES&UDZq1Npr-&Umqq)maE6lAkAr(F93,Ej6!)&Y!+2B8ll$bdchUHJ\n,G'F0qGC'qH-V*baq%IJlb$Gb(`a3@N3(TP6@d4k(TTD*-J$Ep@6Sf1*Ae20k!Y`\nP'S0F-'$%STE1irp-58*6Je$6AYQS(iSG)Z,5k9q''`j'Kjb!*$3eC(0K5X415#k\nBhrl*V#%l6[#5B)dGMIT&pGY(#2fJ3r+@`aMUJ!L5E6QikESF3U3J3FF4B[a\"Mi6\nrApdaTY'j)\",`LmDm\"a!rhl9N&mVjcV&JPY(5*DT!ec,Pk\"ZeNajRY%#H,cSS$ZG\n`E6@&YpmVD$-q\"`!'$kp(hi1,Z\"0[hX\"iQYea\"[-+4`$NR@AlF%Q[XUTUTUrp2MA\ncjfe225)Ji(h#MdVR3If\"8#J\"&#-&lD1*GSjL'pD5,FXb0E5rY8kUEp0G)Nrik4U\n8FK#ZHq9qL[\"[01JZ$`IEN@J)FQKh\"YI#$[!FkiViRP`0S8AQ+IHBm9JVYmkM,rh\nak,F)Z@faD1cAPe$LlcD`G2p**1#`+6[YMH6KdhedhT5!+'I*8h+LZ$bm*iUUGI(\nNBjIT1L'#ecSj$PU2Ye0Rr@kLX!(9r1am5fNVcAX,)-q54#Z0E2dhQffMY%)(YQ2\nP1+0iUreLRk*i@'kE9mm%\"UkFZRr*C1(p0NEpi3bQ'\"HLC[STP2&,leNX9h2feYZ\nAa$PDerK3jFPiVjjN,L@,6q[mHNj-9m1(S3iNPld58J9jc1Ym#09)$32d#(DlRjC\n*CLd8T#i$N!\"2eq(i1FXYP(Vp&b*@Ae2HK\"L'Tkm2,C($\"\"!NF!ZQmPp\"JGeJml4\nf8jISC[Mi2@'Zi2p&J,dKLlK6J[UibEVf\"Uh`Jd3reT6CNCIB#UGB*$$APkA2S\"G\nrCR(i%,8jCkic`aV-fVpeE8,@Y[&!3NA%S\"SDd128F3N%LkLN0liPh9hi,NB(ZZ0\nMPAIJ`-m8`&dE@RDJ@VC15Np!14`@pNj''AHZME1$UFl5NUaTZ'$m%a2Jp4$`$0X\n!m3cVTU8-MQdeEpiaMC3PFk\"lEV\"DAB0*GrK2&@S`*JAULV9Za9AhS4$hKk)eSf'\nFZ-!MIGBD5\"T$qTqKc8EH3BVT&df9eDY$ZA`emRUGNC5P-A1mb261TTIN5P#STHd\n%6(Rl(!+f\"[V5fYLZD9*YF4YN$1-X6(rbrD1he+rIE5[m#9I9TV2UdjKmPiep5aI\n9Gq[UY@qTTrE3&p6cqe#rDim[fN&p5lVkUGrD3VkY%Ifk,4mQRqI8VAfe[[feeI8\nbI`VLI99hl@ApY(FAl4fqSkep9%IY*Pp@KYp@MmI*UAAe(0p94FqUTTp5CqfR,kU\n!Re([m(B(EPFXX`l!+P&99H`)k`ee@*!!\"'Ri4'lRPEYc@8cbcM1lXB8Pm%kpN6&\n,8GJS2Z+BEXf`N!#ifB(%9rHUPPp#P$N\"9\"a\"ApfmhcI1!1\"p5Kf@3PKe8P`E[K0\nKX0L!Lrj-r3E2PfeQ@iTEaGappJ@X1A@)4$LIm[KYY[F82i*r4!\"cS%6+p$@pm6J\nQ(3#mCJZVqN8-1iCLF)4,%a%Ce3@2!LIqc)'Am!8e0ANFUU5q3+!QH(Tr*hI0j3C\n,X`5`$e2Pf*V`M)96BhF)G4+2NmFTS3#5V4(eiRq&pkqj3NN+56BVf'G(G3rNiCD\nS)Mr[er5Uc3Ba[e+SX%DVem$#N`0ijCCRD%[YYF@$*XHYR3(c*D[,dG8VAm#$B3V\nr0EYCVkQPBDRPi#pA`H)@NR+RRjarK0-a33GA@Z#eTaZT-2$CCV\"Z+-&(ZE)eKX3\nh,HLTm3XHCF1Nm@e`#\"i2V#+b42C)JQ5MFr#)qQCPRrKBqX%)j*,52B1k#!5!&IU\n()``rCFY,10fPJD\"BfT`!,cX2`r$aBc\"JS-0lM6Em&\"i4#G-ZX$hr1qL4j&*kVr*\nk2M#d'*!!-,qqm9cMpeH4QB6p*-1j($[icp6%Nfb)IhcI0aQ9YPl0dX!MFBHPUlF\nr@+TQSfF61$eM3$\")q3$0hF$GSfPqF!0j*,80B++fkie3i@P5i!rJI9mq`bTSJK2\nc$0T9BEE-iN&24Eqf6J(4,RhA(-J3`'G\"3RSeVDM%L!Z(m(hLN`KFqJA!((9SFda\nIPJHEGepFY[#BDmJ98E98LXBqX5iJ%9P`Da6[$Q0D3YM4b`9\"4Y'8F#4cEj'C-8E\nb),A-(J368IGTN!$%bm*TGTp`[r+dY\"D\"d$4RaXqS1&XR0H!E4qV2I1%#'P\"2BA[\nj!3,fk+9'*i(3()QR@*LRlPS!Q-chK-e1R`Mf2HdiDL$f@p[-I+C1-,-9hMfm*K`\nVC1-A6T)cAf%M\"qm#5l@[%SR0Gcf92H!q4ejA3*p$cQdq!kHMe`GN)#49L,68Za(\n!J@[Uic,DCPp#Hf\"[JfdRJkA[VfE8DhFE0!Z90rLcY!,fk1'62aCka2`lEEfG@Hm\nU(Ba%je#QT0QhK)ak10h1@6%-X8hIkYiDEE@)UX,#[!fri*Lkj*Z(qMCij*C2UKJ\n%$1kRQP@cA04V[jh4)6SNq4%G5Rq[8!&lUAk6'$cL(+`,TpK+MbU[DR`C4f\"\"XFQ\nXpm6CQ5\"G4rhm@3h[SJ2j2dhIfIprmEVIaR,L@-VdF-YSe05mU*m8SX$%VEj+aL)\n*,N'0KUa&L6T6Nd#(Z%ar-laS9lj21kChT%rQq4#Aar+Aa\"\"Ve!!MhC@ePZ[jL+G\nMCQmM6dRL2q&c*B\"#[beTcXb9hSQ'pap`8QMjLU)IkM&L4Z#)!&!5H\"X-'Z`4kGZ\nadH1pr2UIraZe\"3h$kJ855$'PhE%K2B2CPTLKIM\"4Rk)LrJNZ+4`BJ1UB&!!q@Er\nrHS(A5J&I&Xc,1HX45%KBJV*mP`-6*X8J6eYrepX*aAY4fdpqEf\"GrfIm8Sq%kpj\nQl-8b#TljibKP$L-E4IXaa)Q!HH59+K-cRLXDMMec-1pJGXCkpAh,0iHq$)SVX9c\n#e()r0mhcI0mhcI0mj3FL-50Cf#[dIACKQ*'T$9mf@$#9i3PapF'Ka9GfKde8'66\n*a1&lQ1NpA-$#GbK,4J(qX8%)@KDHDKUX\"m$X99LEM2ef!0#P,44-LK)AFhP-16X\n`J*@V%bK(SP)%EXRLGMqTG&jHAPjHARU56TH1EVQ)UGhDI92P0UkZRJ4GhaXGC!C\n\"U#YMDRF)6m[`BlL0RqlKpc8G5hbj$8fI),I\"I)9!4`f6EH$lLMk#aVp61VfIdI1\nQSK'&l9i9$F'&AANGkdReX#)1lrprr-S'*8e&(E0Cp&TBY6)QK'\"kFd3J2N@Da+a\nGmEV$-XKq1`G%L-UiA+MVGlYQKKQ!bhBhl@*j@[8I!3Ec&i%!&kXZKa3-(6,Yl9L\nX6ch%RJkEj)ka3bCf5(8DeeSa4(BrreZbUGPII6ZBcXLl1J-J0#)qaFfL)pMBi&S\nEpQ+KV+X%G4fdb,&B86H8EC`2&%12dZJ@b10J6`Xr+@9A2)lr\"RX#-\")Gj`r5VCd\n%reMR`rQ%X5mMj@*k)3q8rdBD+k6JIrpP\"ipT!+BMk)M0UR6P3Nf69,`l)I3r*m%\nf-9UmcqFBhr`HTU0,i9Lri\"$G5XKMDM5UjmKl(rGk[%#\"`,4&J4&ZZ9($V6iF5I5\njF%0Bd(r\"Zh02rhAY2JTf32eqq&!Bql6!U[K+pl#mm8e,q0&%GmL[qd`9ahUH%m@\n3!#`,Gh\"8d\"GA3E[6c5bF%pcZM*l*C$C`1Y-H2++L8R,p+(2*h\"Qm6cr\"QjELZh*\nMYM+#he)H[+E1[I!(M[KBZ-!!M,T&dY#%JR,aAT0CRL'V,)pDH@$BS'Jff%lY&JS\nVK%Y(PaI!rahb+k9+AkiPq2Y)TeZ#am$JHiUf`SE4ME(DJSDrH0&8&2dqQd!8e&2\n,Mq1d@d!,*cX8hYqP!q4Y@$1[f-05'lZ6dfCd,kmMj`%P&`f,aaM\"V%HkYAr$b3U\n)!pjEaQJ,6*K\"jAFk'\"mjDPBUZL)A5P$GS2mJKF$CGbDRZ,fH9M1XIlVpPhrr89&\ne,bDaU$+T1BB,rcTX,N`@\"-'5GL53!\"LkCbLmMjG%9m%80*G#E9'J&\"Ac94X&b'r\niP28m%-8+3-LXebXIdbLZr6Jr(!c'jP$Li'j2(0h`3R@i-0C`1DFQNI@5BL%M1*S\nPhlH*!kBikLLI)Df(mh$\"p2Lme)%1B3`39b0VMf5)Be*j[CN4Nf3!$1,aik%D[Xa\n9[lVZ69j1[842hSbVqBL0Eab\"*6LDmQYKClRY5pQ%)ll65[lBd6L00L5Nk'NG4F+\nhm+BkaRlF+0!#Gq9bDdp4aN4[e%VE\"3\"$FA!&@BEj)F6IjEHp9l&F8GX6@5iT'-1\n@iVckXPK)Vla1EHScbdUS!!!\"Q`CdiIA'5p-1Ij!!f[p50idi53!!!!\"SCQ+Q(r!\n3UKYPb-qFXD8H))V8JeTc#@A0*Ai)@$cX%EF)-!-Sqef!m$fUTXBiISkI5M%+k+S\n*I-Xflp&kp%fjjjGNceYJ\"cQd!jd'Kl[\"CN(VAUp3!!!!\"C4IVQ9`!EK1fE*c%(r\nB8Y)dL-B*125H%,3M3ahP#GI8YDFEA1m2G2*i#T1SaFjaSUa&XEJJ!!!!%`0kX(i\nTeNF)YVAVTS(TF8qU6)F1%*e1&e)jT)lTM@JX'f+LE&-`L$*M43qQZP(%KjV`S0Y\nkQJGR8aB[+REVjC[,+pIQRC-4YA[R`6Z\"ZV3%TGYMHqUJ#%ak@UDp!CKEMd+\")BD\nk166dAEM[)C1bbTZ9@UpKpjV[jd&BMX&3jHD-QF4I&5i5EAZk,rAHFk@@48$(ZBS\nEQC!!qqQb8`*VKUme%Ar*A52GfZ+jJ(VdUH40I-d,(RTiHh))r,f+JV5MD9`rlSe\nikm*A2leYj3'b8P!AP\"`66ljeDq4)j1A4k1a5EbQ$38D$@J06U1Z\"db(%(p6'U\"(\nEKcANS!&PbB3NqLAmL5\"b'9EIl[1Bdpc[Mr8)al+UM(Ur1N%*BEIj@Z&\"'#ff#bQ\n$J3AY2f41XaQ[F&MfHZC+\"&)'-0j2I)hhV(*ffIprm)a%#\"8b$jLd)Neiq%mF5\"D\nmEi5@6q0J9p2\"N!\"ja9Cp$alGDVG,@F([&YY,EfiYhZqCQ0JF**Ac,6Z9cmQ-&Fl\n8EU[XIU(cmrKRFpD9(lDi,`FMJQK#lq-'ZZYejr%FKhcLqHXDQ(QK'D!f*&!P*E5\nc)Gjr\"6qMfJ8f2&m8\"XQdY($8DX$9RMaHkE[P%FeEpAPFe0ak11VM'bFDm(kC&Ic\n0QT!!B'Ih-409413GIYSVTpNdE$\"N\"M,r(()`PbE*D'hC-DUMJZRR(jHAj0Zb,Y4\n!`cA'\"[XTbHk\"p#4m`\"bD$$GqU3U6V$Kjc)LXhGZSKHqS%CM6'PVJqjiA6EZ*!ek\n,[@liXaX++r5E3&$'Vk*bNCcmH[5T\"r'rG834l*r2X\"9`QiD0MQ-bKG#kQX$50p9\np1dB2G*0VEU`NA,FI+i,%)MJ#V@MU##dJM2m%(9&@+\"U2-8Z3!2+lapX&C'q\"QaG\nbB'mZieXpG!rlh``9'j,0,'NcK&e#p%eP5[%&Uj6%aEDLjb%%J96i\"`Lc@GaLV18\n0dL(EAcYHVUFlLB!E(VlS#52,V2-bK$$*3'P)8FSq(-ZG#B'f'%ML%3XREj*er2\"\n(jbpLV2pr`JEKbjU&8#KV0q0'CPVBj3JX)A&Gd*ejC@$db(jTK*'!fpZrHaE6#-k\nK)GI#FBK1j'fq10*KfL$)\"@#\"KeYB+!!\"`,\"e`q%DpZ\",hK!a#lI3#FTBHC*1$6&\n8X@ajG0&YZ\"Q*98&JaNbAafR6JamE5#1e[`F[LKQ['FZXm&l5E9N6!4f--0-JJ%0\nZ5+I[#IA91UXRP[6+)`mi(EXAr(U4YN5,HSlRk&R`S*2SXIBLp88J2BD(KUbZX!%\n6'CA4,NXJ,2)l8e\"i#AL)chrRY1ALVG@k'bj`q3DY98c9&hB-J+CbY%Tdqj&!dZJ\nXGNZHE)j6bHN18GUKi*YRpUM#(q(c&H&A*p!P`I3*DDYU8H4PEb&iC'dC9J8['cR\nUDZQk*J&6,PShdFf(J&$KE1'D-JH*e-1F(1Eae)5$,pG6iFKc83\"12PXSZaVB$\"%\na#D'cT,h5Fj[%5%m(S(Y,1@fN)l,U4rjKNS1UL1YR#RSej4j#jD3hLVcal!3'ZP[\n,YN%2$j*'1[2U#jUHGr0+#TmG8UiID\"@DNAD*J[i,qBdX8j@)Dbf(U()X9DQDFIR\nr0M8BFCDrM*GkSC,9Jph9F5HNY-Td`bEV`rS)SPj5BD(6kH-ijI9&55NMX6U(Gla\ncGA3dc,1k[SScG8B1XD-3$[6qAIpR@UhT32HrM91ZbZ@Zb#VXZ[PHajH-m(F@3mm\nJ\"j%m56P-LM4D9GTMcIN!CFri8kISjMV+(JNkU!UbNASe\"KVEc)DUPqI9S1l30G@\nIkUqdeeFqB`+QT\"1REAFdTrpF-,-#3Jk`$19BTG#lfD'i-l\"qNE8E10HD4cBHCRE\nZ,M\"h*&Q1KAPAm&B-2dChpSM#bSVaT+C8Ah'p*pljj9*iZ8R!0324(aVkr9Zq4PJ\nPYjS4CZjLJ#Sh[LD!mUG'1h'jeD-m`c*-Uf`GdNKARE#8HV2%)b`LL4qDdBGeL(%\nPQ!*r0R1q%'i[eYkh,`8FJRKj,Kq,p)i9C5h\"X*d!JY`)Tm8CdjPk@,GN5-aX4%2\n5kMqFZ!bE8F&#Mh12Uq(G\"afH@@F[+f,SMY\"0)VKcCIC'#pRTGPqSSiLXP+Y$$rq\n)C2pUY#lda,k)d'BeqA4`93Y&aAT-X)D[iJ@'[ZZNkaT9LKHIr3@5HNDNTj&jErj\n&+hjF2b9V[DH#5BZNi[&#BpJ(mDj*44i*#!e8)ZkRpGH4c'&prPR%i9edp*,cTJ-\nqU,RrIMY&8(KB8I%kVZ4E)+a8jqC+Z@'i3YBmQ8h9kKb#kKT&RVi,&jZ,L[p++L1\nd8MkRVL#SR6em5)\"+4d3YPZFUf0CC+5A8F21%HS30E[P&!*UG!F3qaekllk[JqE6\nFD5!F+p46CdFNG-f5r,(EQcPKq%r,'Kma\"*@EB+6b&jJ(qedEhbMAMpHaQ$mC)K9\n0f,i*T&9DG2[EpKjA5L6jGU-eEMfS'1R00ZIH5'HS*q9EDpp!rEB@ZK&dPRq6J4%\n%M[MAL$b(a%*i-$BIJKppM%E1GQ(RKGl@Q%`RbGm+#YS[&%8LBA(89h8I\"iN8F8k\nGjeJ%K!(+,CHDkeX,2r2h#Pp,`L!k3p2aXk&G,[mJr'Q#3H#c4qVpqHCm32V0c'%\n@8pf'dpL5$\"hCD26)HEF(&FF6Z,&+0@2QMGV&iGDZM2KNmF!eG!*EpP6+!c*8H8-\nfl%l+#-'#@j83qe,3HbXJKDd%(LUqC*5Jl,bb8`TK@FH5HhE\"P8h0J)J85Fp9V\"U\n0E,eEJrd'p(Ja#,98TpQa[&ihSUS-A+K3T8&84lQ+SId[)T(P@mY2#h%j%G)1JjU\nMPpq%-p\"G@*cSN!$Ye-65IRl'\"Bprb4PTb&HU5a,P+(p&[Sd1+)D$d`#TjIZkChS\n0XkHiRhh\"2Ajr5paa(62EAqh!FMp9Yb#f(@VD#d#`TifN4ILJG9qQe&@U`GDpeV`\nZmUGGV5#*fh*)kq5LSV4!6JEE9LpIYVAbhUdqT@H*-fUH9(Faq425Zr%EqL\"-Zfl\n[h1L)c65GS9jkq#mq#qmc05$#++,I-,!6-qerG$`kF+Bm9P0XUr#3!1X$Ir!IJXp\n10P`+lq!rL&&ql9&U&+##\",E&!m,[dl\"pKfT-AXKHhF2F`9kSiDfAfJ`(28PpjN%\nr[Zr18aXc#$DAEHpRZf#&D3k[j`6)AcSN-+A9'H1FFB@M'-N#DP)p9YP\"-%i9ZC6\n*IkKGQIEh\"kVG#\"X5JmX64i1NN!!PN!#m9'hJ#j9R&6Ye1JK,Klf[XT(PI)HLpmG\nrlI4`N9!MaF0Xl&Fh&ZirIcrkIcXp)l&fc8#L&!F9!NB-EpYmK%691N-c$+IrB)J\n1rI0l1S3fZmEF!m5j%qHUYJC3L1rjppl&Y$RD5Uil)[$T,B1rlaf'0b*4Y$VCq2'\ncRA)MR%e`aFi*r'I$V$R[*SAK%TM5()i[[PHf$Z2f'!Bf-pelCp+r8TA#k0jm)Q!\n&86hiCG@!Fe5I6#eVqq91a5$V6j1j[fX`%lC1Cc\"dh2cr'8E,`Br32-r(+!846J!\nEXKCkV6&B2YrNeK)FP3EV)!EfBlQKR3CVc5*M@'1dlNcPY8FXBGk)M5C)+e$AITC\nEbI2ZlVeJkr`!Mjp%j3'0$Ima*#2$Pb'qUMAMqY@cNed3eUdc1PZe&cK#m9@M8,q\nc(rf1pBZMQ-UQh\"ak53C+)'YJ$3[#djRj2L@BhQKrV*eMpj&ST$Z5cQ3lS9b#``1\neiJ(MKVh-8krKQ*eQ4!fhj`Y`L'fM1@G8@c[VJ4Lh$9EG#cpNZRX'&Jm&XpAmR1a\nVXHbc2H)0FerN)5id2f2411G[cpMpYlM'652)&T9d#\"9YKbH\"AM1MS,3L3S2e6E!\nec)T\"5H6S`%THabfElmR2DEAmCCrPk\"Zi4(1UeY$ip(aIkC1Si#JkGBm+ci1EdbT\n%%VH6feCaFM1M,EP@G5a*$DKchh\"[Br@hr11dGa0Me2+C6+fp@[h8-FYR)8T9[Rj\n4'E3\")Ff1%[V8TdDN0$8+lD[JK2L+J9$e0N+EKqFpBLfAVF32R(FJc9-pM5c4)2c\nNE!rI,1aiF,GiT5R*!0*UXY9eSC!!)Sa2VcHQI-A(EZX&Be,Q-+,iiQ'Mj9TUP#P\nM5(+cVjAVThVZ%k,#qiG\"T3Mk5%,G@#jHfNN([hMI%Ib*22LeahBbS+10XbhZ315\n*L[LADZ64kc1B%qBR+MTDM$'c+PA',QIDUNH`i#6R'K-38kZ!F@2q(Mi\"I\"iDQ9P\nNXPlcakeP'rm1d`C8DCRd(NL4Qi!6pYT&B*Kr,`$+1R9[T[kU'c23k5F+L4E0pf3\n0\")-Ll)N`f)*r%UJdLTYPbe$I`fk3!!2jF#Y#+lD[k1[Mc8r48GRPa3)PjDHHdY%\nK!RX+kC!!5akr,\"a6Rq4[5)PDX#h88Dqqj6LMH+(QMCdr&QNN#h$,BZEXScqaE+2\n4HGqQB`aA#($@F%aC[E2Z5p$j3MSXBH'`hEi$bLY6G3XI,2`)Yf+$Di!EF'd1Le)\nPUYB1KrK3'0jG8(%-mc(6+32%\"A4NVT+JY5hM$ZL3!)$3AUqd'MQ&X0r-RAq2[8@\n,6kTTTC!!&+-BUX[a0N6VdTQ[a,hGTUD$\"%ZbeJUe0a0`$VmBcp\"YZ@@@SHf8,h!\nNH5cB`,VlakR'h-DI#8Kje%(QhZj$8\"ci4fJE+cVHP$$!U(H0#AqkCXqS1Sra4@-\n(Lh!M-SXb+dGSL'T(#*HG$)jIecfN))(8P&KU2KAfd%C6eKUFaRS-mI%lGrH0YIe\n0rI[m'\"`&VJpX)Y,e-U$P3mLIY&d%A&e4jHS#QXA)!$00Tc49)`'ePkPEqqG[6QE\n(6SE[)QaDD4@mc-ik(bJVXh[Qcqi2R8h-%+e0[#YZ+-1@c*jXZ$Ii&P,E,c+\"5pm\n\"e,l5NUaTZ'$Jj1\"EHHR@JKY#JKlGQ6b[3PJ6HrRe24%`$pTk,A!dI&2m5mi\"mMZ\nEe52&R1mfKRRr4N)b6N-cq!8AjX9A(SQPmAh+fU$1'SQGS%SiC32-q+qQ)DK($Ia\nB@E\"IQ*UQhGcRb4\"Gq9@PMZmHqe`hiDqlPm1$Yed,U)Y&$SBIeJ4V`m,ZR6IhXm(\n@QlE9GS$ib3%XcYJ&mFd#HM%$dJ\"TAAl'@J4%KPb`5hN&R[Gd'2+2N!#rl@cIYSL\nqSBIYeDrEUh\"h6YqedrEH(IEH9pVYqeqrDfhfTIm$GbMj$(l@lIYTD(`X[fkErYd\n[JlX(IDfI`Y6IYY$pVKIE@GpY6IYF[fdEa4mKRpU,[fZ8qG!rETAqh6Z$ZelpU&q\nfYHqfZll8rffJ,kR+qe%rJiJDG55XU2ZYBHheqp6P4BAc)49cl9+BFr,1-lZaK5A\n`6Vf45R6+YZ5'5!9T!@3%[acAE+LLee1R51`!a4bGjDC3VEVj[e-qM5%3,ZJBK5P\n'J*9I5%$A85KU3DVe3VM[VTHb-B(RX#()!9Yemir[UYEM8*-bJkaZ3h9GNbd\"pHN\ncL+)$62(+SY\"`)VHZEZ*refdplmd[+AYDa[h#$R++\"F#\"6'!(1J6'E&r#),5r-`I\nAl-NGc(&dk!E1T(MC1RK5+Ik5kr$SEkm2P-Z,`IBl@34cfP$bF1UK($P*L-(D3i#\n\"j2cVkSXKY-8i\"EX)-`-V%N-ck!,02Y39[$CC`28jC@4f#I@Ip(K$bFhQDjr-A@-\n`G'e61&[HKp6Y#F8XjSaI*[`c8h+%dc&\"\"eGDi,@R'kN`m0PQX,XJMYZ[qm2f'fC\n[12-0-bXFH,dc4khQhY'3!&qIKTqIqUp4Q4BR1RCPUk-I%9f4+(ZpqBRAD433d&*\nS8D-$V4m+Dj,0HafXRrp*G66X*8Mr1(6&QcKm1Tm(XA5dQ@,CG`d61-KMQP$&pbL\n\"X1qk'[M08LLUIHNKXaVASr\"Tef)f'`f-QHGXC'6S3ia*,Ac-'+R%(RrelQmIbm!\neY[m4+YJS+VeYfXM18M[P1CVRFGc(UlcD$Zp1M)lU-H&mDB!\"9PL,2YJ0Hld+'!D\n&IF,SHGF(lC0``c(KY0N%&#YZZ4Sek5!Q`0S&J32*N!#&IJI)C%XG6%ihA9Xi!+C\nT99#J5GAb+K-R,'@(MJ%j@(rp5CAH1$e$pX5RiFfqq3J%TeCk0Y\"C4D@T`d!)Tb)\n6@$8+eVY(1AVkJ3'-8FkcQTAX'JI3AREhdbKrJ[BP'\"q4Q6&'mL#ec\"i&Y(*NZEA\nHKpIp%&-F(UjFNGekf#+9'c-\"c%BXbE)%H2VpP160X&HjJBQb@D[`e0ql$R`9qN6\n1(lUUP&X5SZ(Rmd9'!\"$Vihl1jqZ[rGY2D6(J&)59Yb!#A#fTdNcap'b&\"`d*MQ`\nU!c041apE'Gb3!'&0$rplI'M*qpF1Ai9r6`p&-B6Hkpbcla&3pZmI@+#3!\"YPZYC\nhra82d8kNLX#NC**PY!SFPep0GSD$$(1`NdR8bY&!8a!IE$(0iE[fL``4fe*feJ#\n-3PTXr&LB,X60DdVSbEGG`,4&e5B!pmliSXEK*e1DVpMqkpZH4[(hSm\"5iC@D((Y\niU3m$5Y4A#UD0#mZ`C`(6PM+p18X!iPe-p'$ZjbhI)B9q-N4Vic5%fr8Kl6*(L91\nc5'S88CR#Zr5kMdfC8SI+,K21kk'peKPQIV)bNQ5KQIN,#MSceI8R-[&HPK3I\"C@\n,S`k#6Q9b*#q1)6Jp2R\"!a6ihNjZI@qPLpmLMqL$(5d+J+f&kZ2-5GVhSLD\"R'J+\n2rUB1!MR#cX2Gi$cf[EBfCL#295+)QS,6\"YTIkGZadH1pr2UIraZe\"3h$VB6kYrc\n16j&9-&qZiV12ZL'$p1Lc#c@SL#UCC+%%L@M'a6Pe1ri3fLL1%kkDJ*NS(bJHaI+\n6Yk3*+chApN50FrN6ljU**MaXUUUC8eqLDrp(cp\"&)k$ZK%ijJAiAiAiAiAiAi8p\nJAIpRr&+2K1[bc\"2bY\"hhlpL`S#Q8J2[UDI$aR%fYp(MTrhMB#M83SeU(PiQ4f1%\nS4-LD-i!bGf)Z3SGeecU*4la@pCI`(%`aS$kI+NeAJEMqZfX)#T-3+`-+-C5-r$f\nkbhdk8CllANNaJPGl#$I%lZ#%p[CI0CN$,Q9j*#j'U(i5AGDD1ZMFbFAC#U)*EM#\n'i)!V%S4+&F*TrH3MaSMkj)9TYIY2XaI)C&0(V(d4UJ)c2YV8iD(BFTVm&c0h,3T\nQJBR'6h&+R!iN8pZ6ai*P6`H'EImlq-rrASIM@q4T3ph9IYhCYfA9P@,V,NpDEqU\n+2S,'[e-lRiej4hEP%3ELqJq5GAp``j85`Tra%1RrIpBLqpql)+m9dDpmCC*#pNq\nT`8B-B\"h9l,Ip$-!(#Uar'\"3!HdLD6ieN[[ijdGBUp!J&b%C%L[JQRC0qN!$T3Ni\nNhh9+0M8Z9@3&e4E@aTRX`jNY$!Pb8Ie2pVQdQrM6bh3Di&Y,mc3h!88kXJKAFG,\nfT3$Kh1fkrFCZ*'T`a0NCPI@jfVX3@48j!\"02hl&#!XqkdrYBjRb,8iL[iZNACP5\ni\"eCr',ZHj[IA`5T6cfUF&h[5kZE3LcaCP$X(#DN+\"fU@bi%@d2e(*2&b2+elpZ'\nbCY2TVTalY@ecYFHeraZ22IM6Hb)ZBK#490\"lqJM)-eY@cikR$[F@#)`@9\"K)(P6\nP5\"HXUBcmkhQ*Pd!f)(dZN8cGGI$fjA0\"IIRrIkJ19CI(8LL[+a$K2V*a$IQpeXL\nEl%CAa&``habR1++r15j@2i8*r[5,ArprLcBDH3[)Fmr,-Bk@rc)r1Dqee2689E&\nmkf+EYQ3DbGE6Yp+-`HIK9c#)TX8FEf-$Z[@j@#UqCRKLEJ(l80B2dfLR&BlPb,S\nYfc[T'UF`+-(#CR,&JAIEjkcAkI2iCdZ5i!-d6U5mV`eIN5dXCV9&)hXUb!4,c2[\nYR0C5ibHiPd+42[Ii-M14lbMBfR8p+mpVHeCAS4(-@L%J4Im,Xc2Jl&c[kmkYd61\n)A*4RNZ8Z8pqi`3&T23iTUI@-RCc9ki8iH#1SZ3(I`ec'hR,XM64d8NXAa)I3)*M\nGK5P9lB59GhI6lG$%G(+H2#SFahNkIhr#1e(ZX9BZ,aPH0-J\"krZih`kNj(-N6p-\n-l,,'Z$f4RTF'dBSLL'dL,-\"[`4Yq($EG1UkpLf9+lS0X##8-Z#fmjBP-Pfr\"irL\n9)d5NbTVR@2d#'KVUl1@EJVIT`6j[B$\"[SGUSmA-GU%ai[&Q8`43NFX5bLDefi0f\n1V60@Pe\"3bM'KM0V'B&)6Y,d[QE(V8),qSa-+$8\"VfmKPS5#U3cQ#IBm`RkI8$D'\nNjICrZhJd%J+YZ61a(C5XMHpBA[2+DL%cBMjXM!bpBaD`KMGjm+BkaRlF+0!#Gq9\nbDdp4aN4[e%VAj,rGDCa0K'`qMVPjAFEV-1FiMQ9ULhF,b6#kMA8N9+p)+#Ge(*N\n)FV46*TfiTCf)EN@GbT&!!!!!hmP1RRkX6q'&T00`+!k(V&*ebb+l9L+J!!!\"Q9j\nB%dr`%+SECFM2R,'P(L#+e)0DF`PPc588hi1UcXCA1+\"i$H[+`$Sa*\"GL5QJ!#bJ\n$k6,0!k)f1`r1%9T)j5jdYKfh%pLK#9!!!!dHRVf+h-pE)%XE-H[f*q&*dX6,9YX\n`mMh#0-QQ&21#G4j3R1G8iab-!QSJ-Hib[FlV$pkL[$Qm%e#-#M,0H@NJ!!!!Z8H\nXcCj1&4-2`6qRraQL-I*S@c3Q[mjIefQ#+`I$`JrGb9%rm+$EHTS(CapkQ3`YQKN\np$,lRDpd4S1V(LiF6Qm0CJ+Gq)\"m#-C)*cl!*hbZL+P!TAeZq(f\"-Kd2TaBH[D4\"\nk%!0$%R$Y3G1U()ET%T!!K-D&ZDI(N!#l2YJVaD-TNa+MV,fBRkYYddF(mmXMJ3f\n8k3R+!r6L*62r!BV\"H'aFcd6ZEN8GRiBIkM-p)0U-K13H&mp2ZQU@d!RAEUdhl6'\n0(B,(%!U()[J@VBJB-MB%frp+dBHGQFUSDXpC,0,1L8Dj()3rN5Tq%32+,%$T44(\nGp'`JSTmLc,Di4A&3,d1T2Zd[Fd9alMTF!)C!E)*0e+rH0cC,rKfpVI-TM%$X3Ma\nbcTiN6*llTD[J`a-M\"@H(lR%J4hC$lB8S[PGZ#38'lKp&U1DpYJh@AeGH,d94XF-\n@-m29kCTiNaIrIr#)`kEK$Z@%E(0NqF$6d6jR[0HZLXE(l@jcEEk89rp*SCIFlrQ\n'`6+KN!!*'NlkRGiIP)2pk#\"BKDep9&VkDB(,f[$K,Zi#\"'5E@5C9Dk3ShV3['c6\n81\"D0%U)SbBHF+GY)2T6eS*-bbPiRJNhjSAYFH9rV-1VG\"B5eYcq6(%63m2,9FfZ\nP9!9XqRCD4)\"A@I$2h#XcG0NaXN%$BQm25ep`$Y+mdQkJGSI5bT*!j,,fa1i`10J\neYmMm*[pBJd9A4lm[Z+8hK-+d1CY$TfETBqX@Y9bl5(j2&0F)c5p)+`YSe[@-6fN\nZh'DF50YR3f96bD9MfLF`*!50Nj40#a4pD5@+-FL2q)el'$-rV)a2-bb5`IC(NVJ\n\"C#GSRXV\"Y-+a`!9h9#crDhdFa)1088Q%lhm*d128JH\"kBi$CSJ4CEILTMaU0,R(\nilER1CjT9USNab#65QHrj4M9RiRme(q\"UC&0#mr65!FXbI@e-PECUUNJ)2[JJ6,N\n#d9@jCD9`l@&Gjb+NPYQZK%HdZVp!$MLD8ZIL%3XREj*er2\"(jbqE@2L20@J)fF@\nj,S&e+k`AV!+KCfe!pGr'J\"AkT@3,\"jhlI(`%+h*e6mq0hD&'XMBVdLCXXC!!l3P\nfNbTJ!!#-q@QmP@+6E90%(0L2ZY'JbD'b65DL3PN(*Me9J4pd9Qp2i4Vfi%SNA0H\n*-8(I[[ICC*V@Vf[&)3UB4J56@CII4ijDPT`@'D(C6'C*a,f%[5+Rk*S%0QJ8djB\n*!EBdIL-HbSAEITb-0bP\",Nba+8dSJlV!5rMB$k0LV\"ehTAGEK+F+1TXXhB'had@\n'aL%,@#36,4Q@hQ\"#k6)%\"6Z[PD#*[MiIFEe61#Na,e85&ZM['i66khH,'21Ph6$\nXb!f#$31%QB60&5p+)@5X9f+d)SR5AIPD5mN%hRS6TL@STET*838qH@&pUI[&!rU\n5cA+QR4XVIJ+Eb)2K@LXREj(@04dR+`-3(T+#k$,de)2I\"Ke)DX2kaLd*ZqD%hK5\nS4HUP@S9fYZU(MJ5j-FK2D9-rp(1A,RLeA2+CV0LAC$,*,+0aB)A%*q6DQkV5060\nN6ELT4Y`k*qh(8K&1C'U1kLh&4iBh[*i-EPeC8RUA!JEB[apa,ERRLVd)!',R!+r\n'F@IHk9r11&#D)K1N[mZB@M'+#A5iD!(ZfP3Em!0m\"(dNj,1MTG0@cf8(1`cCN6h\nSXm\"U)c0'p'1Fp)i3QC18J8qkh8-kNj@B'[prhG9a*k5dbR6$f%6k+frMJCX2kbD\nM6)0k$XBE@L6(V&Rh!KJK-Q`YIQF(MArS,I+VC5`##P+8hm%NJL3RUeY8!\"V!Ie5\nh0A8f#81i2-(*Dj!!+hhJMRVjJKQ$4(!!ETjMc3BGlD8T`L*Ee,Fc(1JUK`[Kfp@\nUEMD[TL#Nm2bhFH*fAbN(pJPrDVcV*aV8DLa`Q2f9Ye+0bhGl`BXEUIKX\"BKGLfk\n5mPMMB@25h`pee!3!!!P+`pKX$`K1'#QaQ-[A*qY&DP['8XY8aXDi,r3`J$GTE!+\n%4LQd(E1V%)CiC,+GCQN+Y3NPp0$%jQGDZ(MX8D(jh,h)Zb%jMb@Ea#&Mhk0S+j!\n!!EcHEq0KR$6%B%[`!K3pCRddfj-4(N`!!\"5C&rRh%N[Gb1U%)+clGfK5H5I)3%N\nm6I8f9\"F$@F3J1-QK%,rq&`e)1pR`a8!R2,d6UZ8r2T+C%Lp9E)%!!!!!!!&PP6@\ne-`DGY*!!-d&Vf3%,a16IU!mImA9$G4DM59aE3TpcEcbZYjbBbA%4Je)AFfi+kZ'\n6pRjFL5Y!l+[r4p@H,%)JaM8$E(S,QqDZc)YB!Th80%*\"4@Bq!qI%SH!!!!!!!PH\nL8QkSRK&`1Z%[0lMhcbVUh2prdYT)dBbX16\"d[LY\"[b-T8U3@*L'%I@h96'2F+k+\nDb&&-rKV%Vq18*0KTQI5)R5d3)J!!!!!!\"&a1X!rJS,bR#l,A(pDRFr)PLkqKH8f\n6C0Zf6%lmrM[Lpkf[%EGereEN+3!!!!!!#Gh)kN\"(8UDjp58$ZG&IC-!CG1C(A\"F\nreB-M6UG6CE1rjG#Nie)bUh*DQM53!0CC&iG`G*)M-(9VISmE@QpVL8C&3XS$`b9\n!8Pr[e[4NVf$9YcL6Mk-Vk6dDJ%1UBU9j,C`B\"hV2J&4ab2aElHZMrP'[NA#J)am\nE\",LUbprI4(6N@amH!!\"-X[ITE2#,e9mC&[Y,+9YSaV$kA\"%Uiql`Vl6#+i`f#TM\n2mE1KA5m\"U)+RA488&BE)F8JdE)NUT,JU,Gdfr(B\"f&B0@pH)abElEI0!(G5D5pH\nEQpF9(X!1@jfiC+c[FfLpHPNQX%c,mF!eG!*HpAHUb*b&RG!rJ'UUb,#TKZ*,Y!S\nX[[,B4Q$)AJTq)eXK'aT@5bqJdMYY8ZZ#+2c3(#P`kFE-BLfb9V2eSNPa\"@c58PK\nIkare\"da[QG+dALE@6J(`ZYdEcQ1MRk&R8i%2%k8F+#EU,,6Gk!aVc'$j[F@[i!A\n3R$T4)b(80JA[-*h0f52CVEp(X1`L@r2Y`()r9D)B5b%8I`bbVH34h'43HpiZ1l[\nM2CrS$HdE9)-&chBB1bJ0QQlAlI@p#Mpei'kri*[4G2N(5,)@,20Q',f&CUYAk%m\nJ,h1(re[Ul043,h)+96'ed\"2-+j1Z$&4m9X$HX\"\"LId%43p8I)pYiFq(F0GTiHqm\n-c\"pE#K01'f$GXmG41eefX3mJ!EFKMY(bL[pVc\"-G#3F&M%Bl2h4kh,LJ)2ff0fL\n)b'V8RapTG[ZK6M,l!RV9-SfZTJT9&AM`6T8)0[+HFr40A&4&S3R3)fkFL)-6a4P\nRQR!FK!0Dd)`ffH\"la(R4HC!!`[UdVPq[E-J8S,CVqD)G+Xcr28N+R*pDRmb9Kf&\n@qpNLBdCiFT'lH`TjNTK2mbKhMq&YK\"e6&1cCNQhGKj&%e5rYp(#48#2&`fcXc45\n&j-A4G&AZ6[Gb\"kq3!&HRLFV&Pq%dX`%*BTHFl4EK4'Xb@+XBN`8K)`K[b3ZXkrB\n%)%hY'%kEbPp3GL!r%eApi+(Te5,)B$a+jGA+\"q\"a-$ikZi6pcN5mqbD%VII!rd!\npBH1*\"9G\"XJ9Da1J#q\"\"`+*NEpa*9[%q`rhbHJfYFS6D(a+@-rMiRA8)k4DGp\"rm\n901G@ES6`$Zj'#65-&q)qFPr4$8rQmq19*E'GXrp1%!K8*E!a('FfPEDqI#'&L3V\n`%`Z5S9'j-K`[8lL'K)cbVXaElHpV0)aA%Q,h3f@pPFPDF,$2MYb*(UF,Ce'Gp0j\n!LrF41V@R8M[3HA$DFF$bld\"i9$'f&+f-(%e+YH#U@2imH,P!08LHHH2BfB`9SZl\nG($I9&deh*,[e-413!%L5[a!hP)#)#kAm&(Z##HApca1$XH&LkVBG80,heREb0A1\nJSQK4hdEBkScQ*hb(c\"f+Rb#K3IeCI$NKadIEj$\"IFVCcQdrqi#fcCGlLDA5Vb-K\nH%Y1'+d@NS(8rD9iQEaf9,mBi8S%5cQ6DqKqhjHJEZ%4dU$V6#6hH9090mjKaA()\nTS5@Y$[HY6X-c)EUmjbY0'Nh)HFqJ*LZdp$e5T%!KJZ110C+`l\"T`pFblYICrBp8\n2LHii$+T-r496N!\"Nk6B'\"j0T3&C(cH5lLFE-%RTAR95cj,cI*RaJ\"kj2(VZkMq&\n$MXl&lSmb)EqUkZ(Kff!b2T03!9V(ep+p0YN%5fXP6Zj5Fkr!JeakkC`X!bd6Gfj\nANpRpmCGkfUp6VV&02!5%&9`2F*1DGDXM@h#Z[PGCcVJ![X,@&iiU%@jhYcAR4`r\n'6XrB'e'c%-$9+r4%%4LPPKl(%EE\"LdQ5i*fcRl!jh\"AhNbf+q4S4R1Tc$FGeeQ8\nDH1T\"R%-SN5**5%e!-Xl(VK&k`JidBeRlmeEATCfZYZe6#\"TIjf!8KTf(FB-AQ1c\n(#)Q(JeZ3!$ZU,1#195@NKd@h(1Je2)&YFa,@G!CrGYZY+!4Nljpr-&b+fY!PP4)\n#h8'-b4bCmVc[3UmZiUZ+$K!bEr-%`\"je1B,2pG,MY'#DiT8ZS8G#r0Nij`)VKc3\n!Ikjh39dfQmIIHJNf2dk1d4X4RKH9SF`l%$m&q@)&Rq9'cYmhJ%6'`JU)Y[JR-1$\n8T#pEcEc[c**#A4',!b6+5-hl9qb51HDMM!H$Ap'dph#$1,Y&Q`[+-[ANML$B!8[\n,h[+E6*@b%*1&G0i\"JNr9GYE`9TK,KmDj-KV%DJAfdkk#6,F)\"-aMPhH)\"#E@'lI\nVG)2fMk8KiK%SB@9SY%FiHQbGqX%!b!Cm%!4@l5rm@-@JJkXi&kdiBl%146Qr@V-\ne#G#r*NleqRR0H6I[5%pN(E0Um)a8(\"ImN!$\"be&UVBJ84LBaD+MR!',i%801'pI\n@P0[0G&pfS0V`C$ZIa80f!j6cBaM4U5mY0\"\"hihp*E*Yp+eaXT`cr'MCDNHETBS&\n6cLXZZARiQ+pldpM!Z`5h`$'i\"Y[T!*TZkAT15+40dI)alE3L)8P@M'c-54r@51H\nZ0lNhD#QTA+cElVpSCVB*qH25j`k(P)cG9fZMim+BqqAhMICAV\"Vfb!Z1cm9ZA#r\nPpSdlfr0K(TPQ@qY[c`kZ\"hNL6HiY)q(\"[jrcJk3CX23`3@P02rL8pSHUl#-`#)S\n3F$mqHM*`khjR!Derr4f&-L5d5d'2*je#bbG)$ArPhaXB(%eNiVDPZ8&MT5X1N!!\nXf%IISLkMQ++VlqFLX2meXFRCc$!%QZ%SkTj`TX5Gf3q6b-Y@#%+l13ekGE)&3ak\n3!&&kP@mj9(rbrD9Vr\"L&pTE,ID@hl5NrJam[fQ#[fP)5Ii-PpTC[Y,2i-A$qd[A\npTH%RpTLIfPkZcIhhemqmfep5\"B!6A(IM05jXp481$(CT1l`Q$Tm,dBc*$SX1ETj\n9PUZBhA$lScIiXk04*md,Bf,T%4ENXVcj&14XDP#$&E[!L[pkjjc2RB&Ml'2r5'+\nN4@#*T&Tcf+IIbQa*QUai&MTN*G0prfV\"*JU@6N\"0)%CJ\"T!!pMc##YZ[QqEj[Qq\nEj[QqEjarV8F\"2pIK+Trr)8b!!!!$#3Nq[33NkbiMTh$aKB$m+fkqEj[QqEj[QqE\nj[QqEV8F\"2pIK+Trr)8b!!!!$#3Nq[33NkbiMTh$aKB$m+fkqEj[QqEj[QqEj[Qq\nEpZJ+FCC53mhl6$!+QcTAM`1'M3%+)XM(+Ce3@RT)*1,MdQYfiAP&&(Ii\"@YC4q,\nQ%IprUfkM+)85IdceF[0X1Mql0mX2ALL2MRa$[cNB$6)Ic`HYmbL41ca#-1D3!1E\n!N!#%RP'KcD$LFhE%BV$rIGRXXV4G8N@ePbRR,k'`f'`f'`f'`f'`f'a%Rf0Pi56\nV52))MRIici+90r5#%0m1VGM'T2Lp'fa#*A9QSU9[,-(A8bRhT#9[N!$TCN(9S*1\nNr-qI)U1pAjG64`UJCd%Je\"K+p)6LC8ldZq[(A'8Q-L$NbHG0-P*,IrKCD32R#Rp\nM6l+`PrCqE&))2*rIBS'aPK46Y+,@kDH#afP,4\"RY(5dF0PR[pA6H!9aKS5$a8+h\nK4\"-[`Pc)#&Bm-fLN2I)X(h+4fDk&KDE*cK[DA%EZ'31!!!!!!!!!!!!!!#$i8#U\nU6Q(S#5e`5I)!!!!-*#6*`AKrPbI$bR8Ci'b--P3!!!!!!!!!!!!!$rK3+UT1BHJ\n*,A\"*mJ!!!!`N*-R\"H(qA*m2+G4RJE)`b9!!!!!!!!!!!!!!2q)kD#($%f5V!BT[\nrFV!aM%Jp\"[EFm&Q4U5dB5%182\"4c@#4&#J#(d%TKSd-25[,mPAmj[TP92iC)4Ub\nH'd20BQiTCjfRRH5ihCb3!#KSQST8Jhfl`b9!!!!!!!!!!!!\"U$U2*@GE2pA((G4\nHNV'[F`pKITEi[CXjRGm%SE2-V!@m3QjUf9Um!143M%flHq`rhqHTLiE8m*klTeq\nUT@Lri%$UmEA+M)0&b4SY+Z6lp53*`25j9K8M$`8J4JBb\"kf`'rJ)P\"*YG$TaN@9\nNGKbR\"URY[@I36-Uae%AJ8p*dSKl%`03jYSV[1kjpFVkp[J\")jGVi60X5#AB[p*V\nr,MlU2&pS[8BKSCbURf3V`NNDCh&jJDQTmLhFZq-ljLMd-lS%*IrC!!!\"!!!\"Cb)\n!!@BL!!!!-J!!!!!!!!!!!\"`!-J!!D@0ZF`!!!!UrZIrr!!!!!!!!!!$JK3!!:\n"
  },
  {
    "path": "build/notarize.mjs",
    "content": "import dotenv from 'dotenv';\ndotenv.config({ quiet: true });\nimport { notarize } from '@electron/notarize';\nimport { execSync } from 'child_process';\nimport path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst APPEX_BUNDLE_ID = 'com.jgraph.drawio.desktop.PreviewExtension';\nconst DRAWIO_UTI = 'com.jgraph.drawio';\n\n/**\n * Finds the codesign identity used to sign the app bundle.\n * Parses the output of `codesign -dvv` to extract the signing authority.\n * Returns '-' (ad-hoc) if no identity can be determined.\n */\nfunction getSigningIdentity(appPath)\n{\n  try\n  {\n    const output = execSync(`codesign -dvv \"${appPath}\" 2>&1`, { encoding: 'utf8' });\n    const match = output.match(/^Authority=(.+)$/m);\n\n    if (match && match[1] && match[1] !== '(unavailable)')\n    {\n      return match[1];\n    }\n  }\n  catch (e)\n  {\n    // codesign failed, fall back to ad-hoc\n  }\n\n  return '-';\n}\n\n/**\n * Sets up the macOS Quick Look preview extension for .drawio files.\n *\n * Copies the quicklookjs PreviewExtension.appex into the app bundle,\n * replaces the default preview.html with our draw.io viewer, bundles\n * viewer-static.min.js, and writes a custom Info.plist declaring the\n * com.jgraph.drawio UTI.\n *\n * This runs in afterSign (after electron-builder has signed the app)\n * so the .appex is never present in an unsigned state during the\n * build. Once assembled, it is immediately signed with sandbox\n * entitlements below.\n */\nfunction setupQuickLookExtension(appPath, appVersion)\n{\n  const plugInsDir = path.join(appPath, 'Contents', 'PlugIns');\n  const appexDest = path.join(plugInsDir, 'PreviewExtension.appex');\n  const appexResourcesDir = path.join(appexDest, 'Contents', 'Resources');\n\n  const projectDir = path.resolve(__dirname, '..');\n  const appexSrc = path.join(projectDir, 'node_modules', 'quicklookjs',\n    'dist', 'PreviewExtension.appex');\n\n  // Find viewer-static.min.js (CI copies to build/, local dev uses submodule)\n  const viewerCandidates = [\n    path.join(projectDir, 'build', 'viewer-static.min.js'),\n    path.join(projectDir, 'drawio', 'src', 'main', 'webapp', 'js', 'viewer-static.min.js'),\n  ];\n\n  let viewerSrc = null;\n\n  for (const p of viewerCandidates)\n  {\n    if (fs.existsSync(p))\n    {\n      viewerSrc = p;\n      break;\n    }\n  }\n\n  if (!viewerSrc)\n  {\n    console.warn('Quick Look: viewer-static.min.js not found, skipping Quick Look setup');\n    console.warn('Quick Look: expected at one of:', viewerCandidates.join(', '));\n    return;\n  }\n\n  if (!fs.existsSync(appexSrc))\n  {\n    console.warn('Quick Look: quicklookjs .appex not found at', appexSrc);\n    return;\n  }\n\n  console.log('Quick Look: setting up preview extension...');\n  console.log('Quick Look: using viewer from', viewerSrc);\n\n  // Copy .appex bundle\n  fs.mkdirSync(plugInsDir, { recursive: true });\n  fs.cpSync(appexSrc, appexDest, { recursive: true });\n\n  // Copy our preview.html\n  fs.copyFileSync(\n    path.join(__dirname, 'quicklook-preview.html'),\n    path.join(appexResourcesDir, 'preview.html')\n  );\n\n  // Copy viewer-static.min.js\n  fs.copyFileSync(viewerSrc, path.join(appexResourcesDir, 'viewer-static.min.js'));\n\n  // Write custom Info.plist\n  const infoPlist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>draw.io Quick Look</string>\n\t<key>CFBundleExecutable</key>\n\t<string>PreviewExtension</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>${APPEX_BUNDLE_ID}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>PreviewExtension</string>\n\t<key>CFBundlePackageType</key>\n\t<string>XPC!</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>${appVersion}</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>MacOSX</string>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>11.0</string>\n\t<key>NSExtension</key>\n\t<dict>\n\t\t<key>NSExtensionAttributes</key>\n\t\t<dict>\n\t\t\t<key>QLSupportedContentTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>${DRAWIO_UTI}</string>\n\t\t\t</array>\n\t\t\t<key>QLSupportsSearchableItems</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>NSExtensionPointIdentifier</key>\n\t\t<string>com.apple.quicklook.preview</string>\n\t\t<key>NSExtensionPrincipalClass</key>\n\t\t<string>PreviewExtension.PreviewViewController</string>\n\t</dict>\n\t<key>QLJS</key>\n\t<dict>\n\t\t<key>loadingStrategy</key>\n\t\t<string>waitForSignal</string>\n\t\t<key>pagePath</key>\n\t\t<string>preview.html</string>\n\t\t<key>preferredContentSize</key>\n\t\t<string>{800,600}</string>\n\t\t<key>transparentBackground</key>\n\t\t<false/>\n\t</dict>\n</dict>\n</plist>`;\n\n  fs.writeFileSync(path.join(appexDest, 'Contents', 'Info.plist'), infoPlist);\n\n  // Remove the old code signature from the source .appex (it's invalid\n  // after our modifications). We sign immediately below.\n  const codeSignDir = path.join(appexDest, 'Contents', '_CodeSignature');\n\n  if (fs.existsSync(codeSignDir))\n  {\n    fs.rmSync(codeSignDir, { recursive: true });\n  }\n\n  console.log('Quick Look: setup complete');\n}\n\n/**\n * Signs the Quick Look .appex with sandbox entitlements, then re-signs\n * the outer .app bundle so its seal includes the .appex.\n */\nfunction signQuickLookExtension(appPath)\n{\n  const appexPath = path.join(appPath, 'Contents', 'PlugIns', 'PreviewExtension.appex');\n\n  if (!fs.existsSync(appexPath))\n  {\n    return;\n  }\n\n  const identity = getSigningIdentity(appPath);\n\n  if (identity === '-')\n  {\n    console.log('Quick Look: no signing identity found, using ad-hoc signing');\n  }\n  else\n  {\n    console.log('Quick Look: signing with identity:', identity);\n  }\n\n  const entitlementsPath = path.join(__dirname, 'quicklook-entitlements.plist');\n  const mainEntitlementsPath = path.join(__dirname, 'entitlements.mac.plist');\n\n  // Sign the .appex with sandbox entitlements (required for Quick Look)\n  execSync(\n    `codesign -f -s \"${identity}\" --entitlements \"${entitlementsPath}\" --options runtime \"${appexPath}\"`,\n    { stdio: 'inherit' }\n  );\n\n  // Re-sign the outer .app to update its seal (the .appex was added/signed)\n  execSync(\n    `codesign -f -s \"${identity}\" --entitlements \"${mainEntitlementsPath}\" --options runtime \"${appPath}\"`,\n    { stdio: 'inherit' }\n  );\n\n  console.log('Quick Look: signing complete');\n}\n\nexport default async function notarizing(context) {\n  const { electronPlatformName, appOutDir } = context;\n  const appName = context.packager.appInfo.productFilename;\n  const appVersion = context.packager.appInfo.version;\n\n  if (electronPlatformName !== 'darwin') {\n    return;\n  }\n\n  const appPath = `${appOutDir}/${appName}.app`;\n\n  setupQuickLookExtension(appPath, appVersion);\n  signQuickLookExtension(appPath);\n\n  return await notarize({\n    tool: \"notarytool\",\n    appBundleId: 'com.jgraph.drawio.desktop',\n    appPath: appPath,\n    appleId: process.env.APPLEID,\n    appleIdPassword: process.env.APPLEIDPASS,\n    teamId: process.env.APPLE_TEAM_ID\n  });\n};\n"
  },
  {
    "path": "build/quicklook-entitlements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/quicklook-preview.html",
    "content": "<!DOCTYPE html>\n<!--\n  Quick Look preview for .drawio files.\n  Loaded by the PreviewExtension.appex via quicklookjs.\n  Uses viewer-static.min.js (with embedded shapes) to render diagrams\n  without network access.\n-->\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <style>\n      html, body {\n        margin: 0;\n        padding: 0;\n        width: 100%;\n        height: 100%;\n        overflow: hidden;\n        background: white;\n      }\n      .mxgraph {\n        width: 100%;\n        height: 100%;\n      }\n      #error {\n        display: none;\n        padding: 2em;\n        font-family: system-ui, -apple-system, sans-serif;\n        color: #666;\n        text-align: center;\n      }\n    </style>\n  </head>\n  <body>\n    <div id=\"diagram\" class=\"mxgraph\"></div>\n    <div id=\"error\"></div>\n    <script>\n      window.onDrawioViewerLoad = async function()\n      {\n        try\n        {\n          var result = await quicklook.getPreviewedFile();\n          var xml = await result.file.text();\n          var div = document.getElementById('diagram');\n\n          div.setAttribute('data-mxgraph', JSON.stringify({\n            xml: xml,\n            highlight: 'none',\n            toolbar: '',\n            lightbox: false,\n            nav: false,\n            'auto-fit': true,\n            resize: true,\n            center: true\n          }));\n\n          GraphViewer.processElements();\n        }\n        catch (e)\n        {\n          var errDiv = document.getElementById('error');\n          errDiv.style.display = 'block';\n          errDiv.innerText = 'Cannot preview diagram: ' + e.message;\n          document.getElementById('diagram').style.display = 'none';\n        }\n\n        await quicklook.finishedLoading();\n      };\n    </script>\n    <script src=\"viewer-static.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/.gitignore",
    "content": "_site\n.sass-cache\n.jekyll-metadata\n"
  },
  {
    "path": "doc/RELEASE_PROCESS.md",
    "content": "# draw.io Desktop Release Process\n\n**Document ID:** REL-PROC-DESKTOP-001  \n**Version:** 1.0  \n**Last Updated:** 2026-01-02\n**Owner:** Engineering Team\n\n---\n\n## 1. Purpose\n\nThis document defines the release process for draw.io Desktop. Automated controls via GitHub Actions handle repeatable tasks, while manual steps focus on verification and approval.\n\n**Repository:** https://github.com/jgraph/drawio-desktop  \n**Submodule:** drawio (core editor)  \n**CI/CD:** GitHub Actions\n\n---\n\n## 2. Controlled Tooling\n\nTooling versions are pinned in the GitHub Actions workflows to ensure reproducible builds.\n\n| Tool | Version | Controlled In |\n|------|---------|---------------|\n| Node.js | 24.x (LTS) | `.github/workflows/*.yml` |\n| npm | (bundled with Node) | — |\n\n> **Note:** npm is bundled with Node.js, ensuring consistent versions across environments.\n\nWhen updating tooling versions:\n1. Update the version in all workflow files\n2. Test locally with matching versions\n3. Document the change in the PR\n\n---\n\n## 3. Roles\n\n| Role | Responsibility |\n|------|----------------|\n| **Release Lead** | Triggers workflow, verifies output, approves release |\n| **Reviewer** | Reviews changes, provides approval before publish |\n\n> **Small Team Note:** Release Lead and Reviewer should be different people when possible. For solo releases, rely on automated checks and document the reason.\n\n---\n\n## 4. Release Procedure\n\n### 4.1 Automated Preparation (GitHub Actions)\n\nThe `prepare-release` workflow automates:\n- Updating drawio submodule to target ref (with recursive submodule init)\n- Updating version in package.json\n- Running `npm audit` and failing on critical/high vulnerabilities\n- Running `npm outdated` for review\n- Committing changes and creating version tag\n- Uploading audit evidence as artifacts\n\n**To trigger:**\n\n1. Go to Actions → \"Prepare Release\"\n2. Click \"Run workflow\"\n3. Enter:\n   - **version:** The release version (e.g., `29.0.4`)\n   - **drawio_ref:** (Optional) Specific tag/commit. Defaults to `v{version}`\n   - **dry_run:** Check to validate without committing\n\n**What happens:**\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│  Workflow: prepare-release                                       │\n├─────────────────────────────────────────────────────────────────┤\n│  1. Validate version format (X.Y.Z)                              │\n│  2. Checkout with submodules (recursive)                         │\n│  3. Setup Node.js 24.x                                          │\n│  4. Update drawio submodule → target ref                         │\n│     └── Update nested submodules (recursive)                     │\n│  5. Update package.json version                                  │\n│  6. npm ci                                                       │\n│  7. npm audit → FAIL if critical/high vulns                      │\n│  8. npm outdated → report only                                  │\n│  9. Upload evidence artifacts                                    │\n│ 10. Commit + push                                                │\n│ 11. Create + push tag v{version}                                 │\n│ 12. Build workflows trigger automatically                        │\n└─────────────────────────────────────────────────────────────────┘\n```\n\n**Evidence produced:**\n- Workflow run log (retained by GitHub)\n- `release-evidence-v{VERSION}` artifact containing:\n  - `audit-results.json`\n  - `audit-report.txt`\n  - `outdated-report.txt`\n- Job summary with version details and audit results\n\n### 4.2 Pre-Release Verification\n\nBefore triggering the workflow:\n\n| ✓ | Item |\n|---|------|\n| ☐ | Release scope documented (what's included) |\n| ☐ | All feature changes merged to dev branch |\n| ☐ | Target drawio ref exists and is tested |\n\n### 4.3 Monitor Build\n\nAfter the prepare-release workflow completes:\n\n1. Verify the build workflows triggered automatically\n2. Monitor build status in Actions tab\n3. All platform builds must succeed before proceeding\n\n**Evidence:** Link to successful build run: `_______________`\n\n### 4.4 Publish Release\n\nAfter all build workflows complete successfully:\n\n1. Go to GitHub Releases - a draft release will have been created with all artifacts\n2. Verify all platform builds are present (Windows builds are automatically signed via CI using `CSC_LINK` secret)\n3. Add release notes (Section 8)\n4. **Obtain Reviewer approval** (Section 5)\n5. Click \"Publish release\"\n\n---\n\n## 5. Approval\n\nBefore publishing, the Reviewer verifies:\n\n| ✓ | Check |\n|---|-------|\n| ☐ | Workflow completed successfully |\n| ☐ | npm audit shows no critical/high vulnerabilities |\n| ☐ | Build workflows passed for all platforms |\n| ☐ | Test cases passed (Section 6) |\n\n| | Name | Date |\n|---|------|------|\n| **Release Lead** | | |\n| **Reviewer** | | |\n\n> **Solo Release:** Document reason, ensure all automated checks pass, perform extended testing.\n\n---\n\n## 6. Test Cases\n\nRun against the built application before publishing.\n\n### Critical (Must Pass)\n\n| ID | Test | Expected | Pass |\n|----|------|----------|------|\n| T01 | Launch application | Main window displays | ☐ |\n| T02 | Create new diagram | Blank canvas opens | ☐ |\n| T03 | Add shapes | Shapes render, move, resize | ☐ |\n| T04 | Save file | Saves without error | ☐ |\n| T05 | Open file | Displays correctly | ☐ |\n| T06 | Help > About | Shows correct version | ☐ |\n\n### Standard\n\n| ID | Test | Expected | Pass |\n|----|------|----------|------|\n| T07 | Export PNG/PDF/SVG | Valid output | ☐ |\n| T08 | Undo/Redo | Actions reverse | ☐ |\n\n### Security\n\n| ID | Check | Method | Pass |\n|----|-------|--------|------|\n| S01 | No external scripts | DevTools Network tab | ☐ |\n| S02 | No data exfiltration | Monitor during save | ☐ |\n\n**Tested by:** _______________  **Date:** _______________\n\n---\n\n## 7. Rollback\n\n### When to Rollback\n\n- Critical functionality broken\n- Security vulnerability discovered\n- Data loss or corruption\n\n### Steps\n\n1. Convert GitHub release to draft\n2. Ensure previous version is \"Latest\"\n3. Notify team\n4. Document incident below\n\n### Incident Report\n\n**Version:** _______________  \n**Issue:** _______________________________________________  \n**Root Cause:** _______________________________________________  \n**Corrective Action:** _______________________________________________  \n**Completed by:** _______________  **Date:** _______________\n\n---\n\n## 8. Release Notes Template\n\n```markdown\n## v[VERSION] - [DATE]\n\n### Changes\n- [Change 1]\n- [Change 2]\n\n### Fixes\n- [Fix 1]\n\n### Security\n- Dependencies updated\n\n### Known Issues\n- [If any]\n```\n\n---\n\n## 9. Evidence Retention\n\nEvidence is automatically retained:\n\n| Evidence | Location | Retention |\n|----------|----------|-----------|\n| Workflow logs | GitHub Actions | 90 days (GitHub default) |\n| Audit artifacts | Actions → Artifacts | 365 days (configured) |\n| Release assets | GitHub Releases | Permanent |\n| Git tags/commits | Repository | Permanent |\n\nFor audits requiring longer retention, download artifacts to secure storage.\n\n---\n\n## 10. Handling Failures\n\n### npm audit fails (critical/high vulnerabilities)\n\n1. Review `audit-report.txt` in workflow artifacts\n2. Options:\n   - Run `npm audit fix` locally, commit, re-run workflow\n   - If unfixable, assess risk and document exception\n   - Delay release until fix available\n\n### Build fails\n\n1. Check workflow logs for error\n2. Fix issue in codebase\n3. Delete the tag: `git push --delete origin v{VERSION}`\n4. Re-run prepare-release workflow\n\n### Submodule ref not found\n\n1. Verify the drawio tag/ref exists in the drawio repository\n2. Use `drawio_ref` input to specify correct ref\n\n---\n\n## Revision History\n\n| Version | Date       | Author      | Changes |\n|---------|------------|-------------|---------|\n| 1.0     | 2026.01.02 | D Benson    | Initial release |\n"
  },
  {
    "path": "electron-builder-appx.json",
    "content": "{\n  \"appId\": \"com.jgraph.drawio.desktop\",\n  \"copyright\": \"Copyright 2017-2026 draw.io Ltd\",\n  \"asar\": true,\n  \"files\": [\n    \"**/*\",\n    \"!**/WEB-INF{,/**}\"\n  ],\n  \"artifactName\": \"${productName}-${arch}-${version}.${ext}\",\n  \"directories\": {\n    \"output\": \"./dist/\"\n  },\n  \"npmRebuild\": false,\n  \"publish\": {\n      \"provider\": \"github\"\n  },\n  \"win\": {\n    \"target\": [\n      {\n          \"target\": \"appx\",\n          \"arch\": [\n            \"x64\"\n          ]\n      }\n    ]\n  },\n  \"appx\": {\n    \"displayName\": \"draw.io Diagrams\",\n    \"publisherDisplayName\": \"draw.io Ltd\",\n    \"identityName\": \"draw.io.draw.ioDiagrams\",\n    \"publisher\": \"CN=9E628CCB-BE04-4557-A5A8-81EC34B09733\"\n  },\n  \"afterPack\": \"build/fuses.cjs\",\n  \"fileAssociations\": [\n\t  {\n\t  \t\"ext\": \"drawio\",\n\t  \t\"name\": \"draw.io Diagram\",\n\t  \t\"description\": \"draw.io Diagram\",\n\t  \t\"mimeType\": \"application/vnd.jgraph.mxfile\",\n\t  \t\"role\": \"Editor\"\n\t  },\n\t  {\n\t  \t\"ext\": \"vsdx\",\n\t  \t\"name\": \"VSDX Document\",\n\t  \t\"description\": \"VSDX Document\",\n\t  \t\"mimeType\": \"application/vnd.visio\",\n\t  \t\"role\": \"Editor\"\n\t  }\n  ]\n}\n"
  },
  {
    "path": "electron-builder-linux-mac.json",
    "content": "{\n  \"appId\": \"com.jgraph.drawio.desktop\",\n  \"copyright\": \"Copyright 2017-2026 draw.io Ltd\",\n  \"asar\": true,\n  \"files\": [\n    \"**/*\",\n    \"!**/WEB-INF{,/**}\"\n  ],\n  \"artifactName\": \"${productName}-${arch}-${version}.${ext}\",\n  \"directories\": {\n    \"output\": \"./dist/\"\n  },\n  \"npmRebuild\": false,\n  \"publish\": {\n      \"provider\": \"github\"\n  },\n  \"mac\": {\n  \t\"hardenedRuntime\": true,\n  \t\"gatekeeperAssess\": false,\n  \t\"entitlements\": \"build/entitlements.mac.plist\",\n  \t\"entitlementsInherit\": \"build/entitlements.mac.plist\",\n    \"category\": \"public.app-category.graphics-design\",\n    \"extendInfo\": {\n      \"UTExportedTypeDeclarations\": [\n        {\n          \"UTTypeIdentifier\": \"com.jgraph.drawio\",\n          \"UTTypeDescription\": \"draw.io Diagram\",\n          \"UTTypeConformsTo\": [\"public.xml\", \"public.data\"],\n          \"UTTypeTagSpecification\": {\n            \"public.filename-extension\": [\"drawio\"],\n            \"public.mime-type\": [\"application/vnd.jgraph.mxfile\"]\n          }\n        }\n      ],\n      \"CFBundleDocumentTypes\": [\n        {\n          \"CFBundleTypeExtensions\": [\"drawio\"],\n          \"CFBundleTypeName\": \"draw.io Diagram\",\n          \"CFBundleTypeRole\": \"Editor\",\n          \"CFBundleTypeIconFile\": \"icon.icns\",\n          \"LSItemContentTypes\": [\"com.jgraph.drawio\"],\n          \"LSHandlerRank\": \"Owner\"\n        },\n        {\n          \"CFBundleTypeExtensions\": [\"vsdx\"],\n          \"CFBundleTypeName\": \"VSDX Document\",\n          \"CFBundleTypeRole\": \"Editor\",\n          \"CFBundleTypeIconFile\": \"icon.icns\",\n          \"LSHandlerRank\": \"Default\"\n        }\n      ]\n    },\n    \"target\": [\n      { \"target\": \"zip\", \"arch\": [\n          \"x64\",\n          \"arm64\"\n        ]\n      },\n      { \"target\": \"dmg\", \"arch\": [\n          \"x64\",\n          \"arm64\",\n          \"universal\"\n        ]\n      }\n    ]\n  },\n  \"afterSign\": \"build/notarize.mjs\",\n  \"afterPack\": \"build/fuses.cjs\",\n  \"dmg\": {\n  },\n  \"linux\": {\n  \t\"executableName\": \"drawio\",\n    \"category\": \"Graphics\",\n    \"maintainer\": \"draw.io <desktop@draw.io>\",\n    \"icon\": \"./build\",\n    \"desktop\": {\n      \"entry\": {\n        \"StartupWMClass\": \"draw.io\"\n      }\n    },\n    \"target\": [\n      { \"target\": \"AppImage\", \"arch\": [\n          \"x64\",\n          \"arm64\"\n        ]\n      },\n      { \"target\": \"deb\", \"arch\": [\n          \"x64\",\n          \"arm64\"\n        ]\n      },\n      { \"target\": \"rpm\", \"arch\": [\n          \"x64\",\n          \"arm64\"\n        ]\n      }\n    ]\n  },\n  \"rpm\": {\n    \"fpm\": [\n      \"--rpm-rpmbuild-define=_build_id_links none\",\n      \"--rpm-digest=sha256\"\n    ]\n  },\n  \"fileAssociations\": [\n\t  {\n\t  \t\"ext\": \"drawio\",\n\t  \t\"name\": \"draw.io Diagram\",\n\t  \t\"description\": \"draw.io Diagram\",\n\t  \t\"mimeType\": \"application/vnd.jgraph.mxfile\",\n\t  \t\"role\": \"Editor\"\n\t  },\n\t  {\n\t  \t\"ext\": \"vsdx\",\n\t  \t\"name\": \"VSDX Document\",\n\t  \t\"description\": \"VSDX Document\",\n\t  \t\"mimeType\": \"application/vnd.visio\",\n\t  \t\"role\": \"Editor\"\n\t  }\n  ]\n}\n"
  },
  {
    "path": "electron-builder-snap.json",
    "content": "{\n  \"appId\": \"com.jgraph.drawio.desktop\",\n  \"copyright\": \"Copyright 2017-2026 draw.io Ltd\",\n  \"asar\": true,\n  \"files\": [\n    \"**/*\",\n    \"!**/WEB-INF{,/**}\"\n  ],\n  \"artifactName\": \"${productName}-${arch}-${version}.${ext}\",\n  \"directories\": {\n    \"output\": \"./dist/\"\n  },\n  \"npmRebuild\": false,\n  \"linux\": {\n  \t\"executableName\": \"drawio\",\n    \"category\": \"Graphics\",\n    \"maintainer\": \"draw.io <snap@draw.io>\",\n    \"icon\": \"./build\",\n    \"desktop\": {\n      \"entry\": {\n        \"StartupWMClass\": \"draw.io\"\n      }\n    },\n    \"target\": [\n      \"snap\"\n    ]\n  },\n  \"snap\": {\n    \"base\": \"core20\",\n    \"plugs\": [\n      \"default\",\n      \"removable-media\"\n    ]\n  },\n  \"afterPack\": \"build/fuses.cjs\",\n  \"fileAssociations\": [\n\t  {\n\t  \t\"ext\": \"drawio\",\n\t  \t\"name\": \"draw.io Diagram\",\n\t  \t\"description\": \"draw.io Diagram\",\n\t  \t\"mimeType\": \"application/vnd.jgraph.mxfile\",\n\t  \t\"role\": \"Editor\"\n\t  },\n\t  {\n\t  \t\"ext\": \"vsdx\",\n\t  \t\"name\": \"VSDX Document\",\n\t  \t\"description\": \"VSDX Document\",\n\t  \t\"mimeType\": \"application/vnd.visio\",\n\t  \t\"role\": \"Editor\"\n\t  }\n  ]\n}\n"
  },
  {
    "path": "electron-builder-win-arm64.json",
    "content": "{\n  \"appId\": \"com.jgraph.drawio.desktop\",\n  \"copyright\": \"Copyright 2017-2026 draw.io Ltd\",\n  \"asar\": true,\n  \"files\": [\n    \"**/*\",\n    \"!**/WEB-INF{,/**}\"\n  ],\n  \"directories\": {\n    \"output\": \"./dist/\"\n  },\n  \"npmRebuild\": false,\n  \"publish\": {\n      \"provider\": \"github\"\n  },\n  \"win\": {\n    \"target\": [\n      {\n          \"target\": \"nsis\",\n          \"arch\": [\n            \"arm64\"\n          ]\n      },\n      {\n          \"target\": \"portable\",\n          \"arch\": [\n            \"arm64\"\n          ]\n      }\n    ]\n  },\n  \"nsis\": {\n    \"artifactName\": \"${productName}-arm64-${version}-windows-arm64-installer.${ext}\",\n  \t\"oneClick\": false,\n    \"perMachine\": true,\n    \"allowToChangeInstallationDirectory\": true,\n    \"runAfterFinish\": false,\n    \"createDesktopShortcut\": false\n  },\n  \"portable\": {\n    \"artifactName\": \"${productName}-arm64-${version}-windows-arm64-no-installer.${ext}\"\n  },\n  \"afterPack\": \"build/fuses.cjs\",\n  \"fileAssociations\": [\n\t  {\n\t  \t\"ext\": \"drawio\",\n\t  \t\"name\": \"draw.io Diagram\",\n\t  \t\"description\": \"draw.io Diagram\",\n\t  \t\"mimeType\": \"application/vnd.jgraph.mxfile\",\n\t  \t\"role\": \"Editor\"\n\t  },\n\t  {\n\t  \t\"ext\": \"vsdx\",\n\t  \t\"name\": \"VSDX Document\",\n\t  \t\"description\": \"VSDX Document\",\n\t  \t\"mimeType\": \"application/vnd.visio\",\n\t  \t\"role\": \"Editor\"\n\t  }\n  ]\n}\n"
  },
  {
    "path": "electron-builder-win.json",
    "content": "{\n  \"appId\": \"com.jgraph.drawio.desktop\",\n  \"copyright\": \"Copyright 2017-2026 draw.io Ltd\",\n  \"asar\": true,\n  \"files\": [\n    \"**/*\",\n    \"!**/WEB-INF{,/**}\"\n  ],\n  \"directories\": {\n    \"output\": \"./dist/\"\n  },\n  \"npmRebuild\": false,\n  \"publish\": {\n      \"provider\": \"github\"\n  },\n  \"win\": {\n    \"target\": [\n      {\n          \"target\": \"nsis\",\n          \"arch\": [\n            \"x64\"\n          ]\n      },\n      {\n        \"target\": \"msi\",\n        \"arch\": [\n          \"x64\"\n        ]\n      }\n    ]\n  },\n  \"nsis\": {\n    \"artifactName\": \"${productName}-${version}-windows-installer.${ext}\",\n  \t\"oneClick\": false,\n    \"perMachine\": true,\n    \"allowToChangeInstallationDirectory\": true,\n    \"runAfterFinish\": false,\n    \"createDesktopShortcut\": false\n  },\n  \"msi\": {\n    \"artifactName\": \"${productName}-${version}.${ext}\",\n    \"runAfterFinish\": false,\n    \"createDesktopShortcut\": false\n  },\n  \"afterPack\": \"build/fuses.cjs\",\n  \"fileAssociations\": [\n\t  {\n\t  \t\"ext\": \"drawio\",\n\t  \t\"name\": \"draw.io Diagram\",\n\t  \t\"description\": \"draw.io Diagram\",\n\t  \t\"mimeType\": \"application/vnd.jgraph.mxfile\",\n\t  \t\"role\": \"Editor\"\n\t  },\n\t  {\n\t  \t\"ext\": \"vsdx\",\n\t  \t\"name\": \"VSDX Document\",\n\t  \t\"description\": \"VSDX Document\",\n\t  \t\"mimeType\": \"application/vnd.visio\",\n\t  \t\"role\": \"Editor\"\n\t  }\n  ]\n}\n"
  },
  {
    "path": "electron-builder-win32.json",
    "content": "{\n  \"appId\": \"com.jgraph.drawio.desktop\",\n  \"copyright\": \"Copyright 2017-2026 draw.io Ltd\",\n  \"asar\": true,\n  \"files\": [\n    \"**/*\",\n    \"!**/WEB-INF{,/**}\"\n  ],\n  \"directories\": {\n    \"output\": \"./dist/\"\n  },\n  \"npmRebuild\": false,\n  \"publish\": {\n      \"provider\": \"github\"\n  },\n  \"win\": {\n    \"target\": [\n      {\n          \"target\": \"nsis\",\n          \"arch\": [\n            \"ia32\"\n          ]\n      }\n    ]\n  },\n  \"nsis\": {\n    \"artifactName\": \"${productName}-ia32-${version}-windows-32bit-installer.${ext}\",\n  \t\"oneClick\": false,\n    \"perMachine\": true,\n    \"allowToChangeInstallationDirectory\": true,\n    \"runAfterFinish\": false,\n    \"createDesktopShortcut\": false\n  },\n  \"afterPack\": \"build/fuses.cjs\",\n  \"fileAssociations\": [\n\t  {\n\t  \t\"ext\": \"drawio\",\n\t  \t\"name\": \"draw.io Diagram\",\n\t  \t\"description\": \"draw.io Diagram\",\n\t  \t\"mimeType\": \"application/vnd.jgraph.mxfile\",\n\t  \t\"role\": \"Editor\"\n\t  },\n\t  {\n\t  \t\"ext\": \"vsdx\",\n\t  \t\"name\": \"VSDX Document\",\n\t  \t\"description\": \"VSDX Document\",\n\t  \t\"mimeType\": \"application/vnd.visio\",\n\t  \t\"role\": \"Editor\"\n\t  }\n  ]\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"draw.io\",\n  \"version\": \"29.6.1\",\n  \"description\": \"draw.io desktop\",\n  \"exports\": \"./src/main/electron.js\",\n  \"type\": \"module\",\n  \"main\": \"src/main/electron.js\",\n  \"engines\": {\n    \"node\": \">=20\"\n  },\n  \"scripts\": {\n    \"start\": \"electron .\",\n    \"sync\": \"node ./sync.cjs\",\n    \"release-win\": \"electron-builder --config electron-builder-win.json --publish always\",\n    \"release-win32\": \"electron-builder --config electron-builder-win32.json --publish always\",\n    \"release-win-arm64\": \"electron-builder --config electron-builder-win-arm64.json --publish always\",\n    \"release-appx\": \"electron-builder --config electron-builder-appx.json --publish always\",\n    \"release-linux\": \"electron-builder --config electron-builder-linux-mac.json --publish always\",\n    \"release-snap\": \"electron-builder --config electron-builder-snap.json --publish never\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.com:jgraph/drawio-desktop.git\"\n  },\n  \"keywords\": [\n    \"draw.io\",\n    \"diagram\",\n    \"flowchart\",\n    \"UML\"\n  ],\n  \"author\": \"JGraph <support@draw.io>\",\n  \"license\": \"Apache-2.0\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jgraph/drawio-desktop/issues\"\n  },\n  \"homepage\": \"https://github.com/jgraph/drawio\",\n  \"dependencies\": {\n    \"@cantoo/pdf-lib\": \"^2.6.1\",\n    \"buffer\": \"^6.0.3\",\n    \"commander\": \"^14.0.3\",\n    \"compression\": \"^1.8.1\",\n    \"crc\": \"^4.3.2\",\n    \"electron-context-menu\": \"^4.1.1\",\n    \"electron-log\": \"^5.4.3\",\n    \"electron-progressbar\": \"^2.2.1\",\n    \"electron-store\": \"^11.0.2\",\n    \"electron-updater\": \"^6.8.3\",\n    \"tslib\": \"^2.8.1\"\n  },\n  \"devDependencies\": {\n    \"@electron/fuses\": \"^1.8.0\",\n    \"@electron/notarize\": \"^3.1.1\",\n    \"dotenv\": \"^17.3.1\",\n    \"electron\": \"^39.6.1\",\n    \"electron-builder\": \"^26.8.1\",\n    \"quicklookjs\": \"^1.0.1\",\n    \"sumchecker\": \"^3.0.1\"\n  }\n}\n"
  },
  {
    "path": "preload.js",
    "content": "console.log('in preload', __dirname)\n\nPreApp = {\n\tlog: s => {console.log('PreApp:', s)},\n}\n\nwindow.addEventListener('load', e => {\n\tPreApp.log('in onLoad')\n})\n"
  },
  {
    "path": "src/main/disableUpdate.js",
    "content": "export function disableUpdate() { return false;}"
  },
  {
    "path": "src/main/electron-preload.js",
    "content": "const {\n    contextBridge,\n    ipcRenderer\n} = require(\"electron\");\n\nlet reqId = 1;\nlet reqInfo = {};\nlet fileChangedListeners = {};\n\nipcRenderer.on('mainResp', (event, resp) => \n{\n\tvar callbacks = reqInfo[resp.reqId];\n\t\n\tif (resp.error)\n\t{\n\t\tcallbacks.error(resp.msg, resp.e);\n\t}\n\telse\n\t{\n\t\tcallbacks.callback(resp.data);\n\t}\n\t\n\tdelete reqInfo[resp.reqId];\n});\n\nipcRenderer.on('fileChanged', (event, resp) => \n{\n\tvar listener = fileChangedListeners[resp.path];\n\t\n\tif (listener)\n\t{\n\t\tlistener(resp.curr, resp.prev);\n\t}\n});\n\ncontextBridge.exposeInMainWorld(\n    'electron', {\n        request: (msg, callback, error) => \n\t\t{\n\t\t\tmsg.reqId = reqId++;\n\t\t\treqInfo[msg.reqId] = {callback: callback, error: error};\n\n\t\t\t//TODO Maybe a special function for this better than this hack?\n\t\t\t//File watch special case where the callback is called multiple times\n\t\t\tif (msg.action == 'watchFile')\n\t\t\t{\n\t\t\t\tfileChangedListeners[msg.path] = msg.listener;\n\t\t\t\tdelete msg.listener;\n\t\t\t}\n\n\t\t\tipcRenderer.send('rendererReq', msg);\n        },\n\t\tregisterMsgListener: function(action, callback)\n\t\t{\n\t\t\tipcRenderer.on(action, function(event, args)\n\t\t\t{\n\t\t\t\tcallback(args);\n\t\t\t});\n\t\t},\n\t\tsendMessage: function(action, args)\n\t\t{\n\t\t\tipcRenderer.send(action, args);\n\t\t},\n\t\tlistenOnce: function(action, callback)\n\t\t{\n\t\t\tipcRenderer.once(action, function(event, args)\n\t\t\t{\n\t\t\t\tcallback(args);\n\t\t\t});\n\t\t}\n    }\n);\n\ncontextBridge.exposeInMainWorld(\n    'process', {\n\t\ttype: process.type,\n\t\tversions: process.versions\n\t}\n);\n"
  },
  {
    "path": "src/main/electron.js",
    "content": "import fs from 'fs';\nimport { promises as fsProm } from 'fs';\nimport path from 'path';\nimport url from 'url';\nimport {Menu as menu, shell, dialog, session, screen, \n\t\tclipboard, nativeImage, ipcMain, app, BrowserWindow} from 'electron';\nimport crc from 'crc';\nimport zlib from 'zlib';\nimport log from'electron-log';\nimport { program } from 'commander';\nimport elecUpPkg from 'electron-updater';\nconst {autoUpdater} = elecUpPkg;\nimport {PDFDocument} from '@cantoo/pdf-lib';\nimport Store from 'electron-store';\nimport ProgressBar from 'electron-progressbar';\nimport contextMenu from 'electron-context-menu';\nimport {spawn} from 'child_process';\nimport {disableUpdate as disUpPkg} from './disableUpdate.js';\n\nlet store;\n\ntry\n{\n\tstore = new Store();\n}\ncatch (e)\n{\n\tconsole.error('Failed to initialize electron-store:', e);\n\tstore = null;\n}\n\nconst disableUpdate = disUpPkg() || \n\t\t\t\t\t\tprocess.env.DRAWIO_DISABLE_UPDATE === 'true' ||\n\t\t\t\t\t\tprocess.argv.indexOf('--disable-update') !== -1 ||\n\t\t\t\t\t\tfs.existsSync('/.flatpak-info'); //This file indicates running in flatpak sandbox\nconst silentUpdate = !disableUpdate && (process.env.DRAWIO_SILENT_UPDATE === 'true' ||\n\t\t\t\t\t\t\t\t\t\tprocess.argv.indexOf('--silent-update') !== -1);\nautoUpdater.logger = log\nautoUpdater.logger.transports.file.level = 'error'\nautoUpdater.logger.transports.console.level = 'error'\nautoUpdater.autoDownload = silentUpdate\nautoUpdater.autoInstallOnAppQuit = silentUpdate\n\nconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\n//Command option to disable hardware acceleration\nif (process.argv.indexOf('--disable-acceleration') !== -1)\n{\n\tapp.disableHardwareAcceleration();\n}\n\n// Configure context menu for text fields\ncontextMenu({\n\tshowCopyImage: true,\n\tshowSaveImage: true,\n\tshowSaveImageAs: true,\n\tshowLookUpSelection: false,\n\tshowSearchWithGoogle: false,\n\tshowCopyLink: false,\n\tshowSelectAll: true,\n\tappend: (defaultActions, params, browserWindow) => [\n\t\t{\n\t\t\tlabel: 'Paste and Match Style',\n\t\t\t// Only show this item when there's a text in the clipboard\n\t\t\tvisible: clipboard.availableFormats().includes('text/plain'),\n\t\t\tclick: () => {\n\t\t\t\t// Execute the paste command in the focused window\n\t\t\t\tbrowserWindow.webContents.pasteAndMatchStyle();\n\t\t\t}\n\t\t}\n\t]\n});\n\nconst __DEV__ = process.env.DRAWIO_ENV === 'dev'\n\t\t\nlet windowsRegistry = []\nlet cmdQPressed = false\nlet firstWinLoaded = false\nlet firstWinFilePath = null\nconst isMac = process.platform === 'darwin'\nconst isWin = process.platform === 'win32'\nlet enableSpellCheck = store != null ? store.get('enableSpellCheck') : false;\nenableSpellCheck = enableSpellCheck != null ? enableSpellCheck : isMac;\nlet enableStoreBkp = store != null ? (store.get('enableStoreBkp') != null ? store.get('enableStoreBkp') : true) : false;\nlet dialogOpen = false;\nlet enablePlugins = false;\nconst codeDir = path.join(__dirname, '/../../drawio/src/main/webapp');\nconst codeUrl = url.pathToFileURL(codeDir).href.replace(/\\/.\\:\\//, str => str.toUpperCase()); // Fix for windows drive letter\n// Production app uses asar archive, so we need to go up two more level. It's extra cautious since asar is read-only anyway.\nconst appBaseDir = path.join(__dirname, __dirname.endsWith(path.join('resources', 'app.asar', 'src', 'main')) ? \n\t\t\t\t\t\t\t\t'/../../../../' : '/../../');\nlet appZoom = 1;\n// Disabled by default\nlet isGoogleFontsEnabled = store != null ? (store.get('isGoogleFontsEnabled') != null? store.get('isGoogleFontsEnabled') : false) : false;\n\n//Read config file\nvar queryObj = {\n\t'dev': __DEV__ ? 1 : 0,\n\t'test': __DEV__ ? 1 : 0,\n\t'gapi': 0,\n\t'db': 0,\n\t'od': 0,\n\t'gh': 0,\n\t'gl': 0,\n\t'tr': 0,\n\t'browser': 0,\n\t'picker': 0,\n\t'mode': 'device',\n\t'export': 'https://convert.diagrams.net/node/export',\n\t'disableUpdate': disableUpdate? 1 : 0,\n\t'enableSpellCheck': enableSpellCheck? 1 : 0,\n\t'enableStoreBkp': enableStoreBkp? 1 : 0,\n\t'isGoogleFontsEnabled': isGoogleFontsEnabled? 1 : 0\n};\n\ntry\n{\n\tif (fs.existsSync(process.cwd() + '/urlParams.json'))\n\t{\n\t\tlet urlParams = JSON.parse(fs.readFileSync(process.cwd() + '/urlParams.json'));\n\t\t\n\t\tfor (var param in urlParams)\n\t\t{\n\t\t\tqueryObj[param] = urlParams[param];\n\t\t}\n\t}\n}\ncatch(e)\n{\n\tconsole.log('Error in urlParams.json file: ' + e.message);\n}\n\n// Trying sandboxing the renderer for more protection\n//app.enableSandbox(); // This maybe the reason snap stopped working\n\n// Only allow request from the app code itself\nfunction validateSender (frame) \n{\n\treturn frame.url.replace(/\\/.\\:\\//, str => str.toUpperCase()).startsWith(codeUrl);\n}\n\nfunction isWithinDisplayBounds(pos) \n{\n\tconst displays = screen.getAllDisplays();\n\n\treturn displays.reduce((result, display) => \n\t{\n\t\tconst area = display.workArea\n\t\treturn (\n\t\t\tresult ||\n\t\t\t(pos.x >= area.x &&\n\t\t\tpos.y >= area.y &&\n\t\t\tpos.x < area.x + area.width &&\n\t\t\tpos.y < area.y + area.height)\n\t\t)\n\t}, false)\n}\n\nfunction createWindow (opt = {})\n{\n\tlet lastWinSizeStr = (store && store.get('lastWinSize')) || '1200,800,0,0,false,false';\n\tlet lastWinSize = lastWinSizeStr ? lastWinSizeStr.split(',') : [1200, 800];\n\n\t// TODO On some Mac OS, double click the titlebar set incorrect window size\n\tif (lastWinSize[0] < 500)\n\t{\n\t\tlastWinSize[0] = 500;\n\t}\n\n\tif (lastWinSize[1] < 500)\n\t{\n\t\tlastWinSize[1] = 500;\n\t}\n\n\tlet options = Object.assign(\n\t{\n\t\tbackgroundColor: '#FFF',\n\t\twidth: parseInt(lastWinSize[0]),\n\t\theight: parseInt(lastWinSize[1]),\n\t\ticon: `${codeDir}/images/drawlogo256.png`,\n\t\twebviewTag: false,\n\t\twebSecurity: true,\n\t\twebPreferences: {\n\t\t\tpreload: `${__dirname}/electron-preload.js`,\n\t\t\tspellcheck: enableSpellCheck,\n\t\t\tcontextIsolation: true,\n\t\t\tdisableBlinkFeatures: 'Auxclick' // Is this needed?\n\t\t}\n\t}, opt)\n\t\n\tif (lastWinSize[2] != null)\n\t{\n\t\toptions.x = parseInt(lastWinSize[2]);\n\t}\n\n\tif (lastWinSize[3] != null)\n\t{\n\t\toptions.y = parseInt(lastWinSize[3]);\n\t}\n\n\tif (!isWithinDisplayBounds(options))\n\t{\n\t\toptions.x = null;\n\t\toptions.y = null;\n\t}\n\n\tlet mainWindow = new BrowserWindow(options)\n\twindowsRegistry.push(mainWindow)\n\n\tif (lastWinSize[4] === 'true')\n\t{\n\t\tmainWindow.maximize()\n\t}\n\n\tif (lastWinSize[5] === 'true')\n\t{\n\t\tmainWindow.setFullScreen(true);\n\t}\n\n\tif (__DEV__) \n\t{\n\t\tconsole.log('createWindow', opt)\n\t}\n\n\t//Cannot be read before app is ready\n\tqueryObj['appLang'] = app.getLocale();\n\n\tlet ourl = url.format(\n\t{\n\t\tpathname: `${codeDir}/index.html`,\n\t\tprotocol: 'file:',\n\t\tquery: queryObj,\n\t\tslashes: true\n\t})\n\t\n\tmainWindow.loadURL(ourl)\n\n\t// Open the DevTools.\n\tif (__DEV__)\n\t{\n\t\tmainWindow.webContents.openDevTools()\n\t}\n\n\tipcMain.on('openDevTools', function(e)\n\t{\n\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\tmainWindow.webContents.openDevTools();\n\t});\n\n\tfunction rememberWinSize(win)\n\t{\n\t\tif (store != null)\n\t\t{\n\t\t\tconst size = win.getSize();\n\t\t\tconst pos = win.getPosition();\n\t\t\tstore.set('lastWinSize', size[0] + ',' + size[1] + ',' + pos[0] + ',' + pos[1] + ',' + win.isMaximized() + ',' + win.isFullScreen());\n\t\t}\n\t}\n\n\tmainWindow.on('maximize', function()\n\t{\n\t\tmainWindow.webContents.send('maximize')\n\t});\n\n\tmainWindow.on('unmaximize', function()\n\t{\n\t\tmainWindow.webContents.send('unmaximize')\n\t});\n\n\tmainWindow.on('resize', function()\n\t{\n\t\tmainWindow.webContents.send('resize')\n\t});\n\n\tlet uniqueIsModifiedId, modifiedModalOpen = false;\n\n\tipcMain.on('isModified-result', async (e, data) =>\n\t{\n\t\tif (!validateSender(e.senderFrame) || uniqueIsModifiedId != data.uniqueId || modifiedModalOpen) return null;\n\n\t\tif (data.isModified)\n\t\t{\n\t\t\tmodifiedModalOpen = true;\n\t\t\t// Can't use async function here because it crashes on Linux when win.destroy is called\n\t\t\tlet response = dialog.showMessageBoxSync(\n\t\t\t\tmainWindow,\n\t\t\t\t{\n\t\t\t\t\ttype: 'question',\n\t\t\t\t\tbuttons: ['Cancel', 'Discard Changes'],\n\t\t\t\t\ttitle: 'Confirm',\n\t\t\t\t\tmessage: 'The document has unsaved changes. Do you really want to quit without saving?' //mxResources.get('allChangesLost')\n\t\t\t\t});\n\n\t\t\tif (response === 1)\n\t\t\t{\n\t\t\t\t//If user chose not to save, remove the draft\n\t\t\t\tif (data.draftPath != null)\n\t\t\t\t{\n\t\t\t\t\tawait deleteFile(data.draftPath);\n\t\t\t\t\tmainWindow.destroy();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmainWindow.webContents.send('removeDraft');\n\n\t\t\t\t\tipcMain.once('draftRemoved', (e) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\t\t\t\t\tmainWindow.destroy();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcmdQPressed = false;\n\t\t\t\tmodifiedModalOpen = false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmainWindow.destroy();\n\t\t}\n\t});\n\t\n\tmainWindow.on('close', (event) =>\n\t{\n\t\tuniqueIsModifiedId = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n\n\t\tif (__DEV__)\n\t\t{\n\t\t\tconst index = windowsRegistry.indexOf(mainWindow)\n\t\t\tconsole.log('Window on close', index, uniqueIsModifiedId)\n\t\t}\n\t\t\n\t\tconst contents = mainWindow.webContents\n\n\t\tif (contents != null)\n\t\t{\n\t\t\tcontents.send('isModified', uniqueIsModifiedId);\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\trememberWinSize(mainWindow);\n\t})\n\n\t// Emitted when the window is closed.\n\tmainWindow.on('closed', () =>\n\t{\n\t\tconst index = windowsRegistry.indexOf(mainWindow)\n\t\t\n\t\tif (__DEV__) \n\t\t{\n\t\t\tconsole.log('Window closed idx:%d', index)\n\t\t}\n\t\t\n\t\twindowsRegistry.splice(index, 1)\n\t})\n\t\n\treturn mainWindow\n}\n\nfunction isPluginsEnabled()\n{\n\treturn enablePlugins;\n}\n// This method will be called when Electron has finished\n// initialization and is ready to create browser windows.\n// Some APIs can only be used after this event occurs.\napp.whenReady().then(() =>\n{\n\t// Enforce our CSP on all contents\n\tsession.defaultSession.webRequest.onHeadersReceived((details, callback) => \n\t{\n\t\tcallback({\n\t\t\tresponseHeaders: {\n\t\t\t\t...details.responseHeaders,\n\t\t\t\t// Replace the first sha with the one of the current version shown in the console log (the second one is for the second script block which is rarely changed)\n\t\t\t\t// 3rd sha is for electron-progressbar\n\t\t\t\t'Content-Security-Policy': ['default-src \\'self\\'; script-src \\'self\\' \\'sha256-f6cHSTUnCvbQqwa6rKcbWIpgN9dLl0ROfpEKTQUQPr8=\\' \\'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=\\' \\'sha256-ZQ86kVKhLmcnklYAnUksoyZaLkv7vvOG9cc/hBJAEuQ=\\'; connect-src \\'self\\'' +\n\t\t\t\t(isGoogleFontsEnabled? ' https://fonts.googleapis.com https://fonts.gstatic.com' : '') + '; img-src * data:; media-src *; font-src * data:; frame-src \\'none\\'; style-src \\'self\\' \\'unsafe-inline\\'' +\n\t\t\t\t(isGoogleFontsEnabled? ' https://fonts.googleapis.com' : '') + '; base-uri \\'none\\';child-src \\'self\\';object-src \\'none\\';']\n\t\t\t}\n\t\t})\n\t});\n\n\tconst pluginsCodeUrl = url.pathToFileURL(path.join(getAppDataFolder(), '/plugins/')).href.replace(/\\/.\\:\\//, str => str.toUpperCase());\n\n\t// Enforce loading file only from our app directory\n\tsession.defaultSession.webRequest.onBeforeRequest({urls: ['file://*']}, (details, callback) =>\n\t{\n\t\tconst url = details.url.replace(/\\/.\\:\\//, str => str.toUpperCase());\n\n\t\tif (!url.startsWith(codeUrl) && (!isPluginsEnabled() || (isPluginsEnabled() && !url.startsWith(pluginsCodeUrl))))\n\t\t{\n\t\t\tconsole.log('Blocked loading file from ' + details.url, url, codeUrl, pluginsCodeUrl);\n\t\t\tcallback({cancel: true});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcallback({});\n\t\t}\n\t});\n\n\tipcMain.on('newfile', (e, arg) =>\n\t{\n\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\tlet opts = {};\n\n\t\tif (arg)\n\t\t{\n\t\t\tif (arg.width)\n\t\t\t{\n\t\t\t\topts.width = arg.width;\n\t\t\t}\n\n\t\t\tif (arg.height)\n\t\t\t{\n\t\t\t\topts.height = arg.height;\n\t\t\t}\n\t\t}\n\n\t\tcreateWindow(opts);\n\t})\n\t\n    let argv = process.argv\n    \n    // https://github.com/electron/electron/issues/4690#issuecomment-217435222\n    if (process.defaultApp != true)\n    {\n        argv.unshift(null)\n    }\n\n\tvar validFormatRegExp = /^(pdf|svg|png|jpeg|jpg|xml)$/;\n\tvar themeRegExp = /^(dark|light)$/;\n\tvar linkTargetRegExp = /^(auto|new-win|same-win)$/;\n\t\n\tfunction argsRange(val)\n\t{\n\t\treturn val.split('..').map(n => parseInt(n, 10) - 1);\n\t}\n\t\n\ttry\n\t{\n\t\tprogram.allowExcessArguments();\n\t\tprogram\n\t        .version(app.getVersion())\n\t        .usage('[options] <input file/folder>')\n\t\t\t.argument('[input file/folder]', 'input drawio file or a folder with drawio files')\n\t        .allowUnknownOption() //-h and --help are considered unknown!!\n\t        .option('-c, --create', 'creates a new empty file if no file is passed')\n\t        .option('-k, --check', 'does not overwrite existing files')\n\t        .option('-x, --export', 'export the input file/folder based on the given options')\n\t        .option('-r, --recursive', 'for a folder input, recursively convert all files in sub-folders also')\n\t        .option('-o, --output <output file/folder>', 'specify the output file/folder. If omitted, the input file name is used for output with the specified format as extension')\n\t        .option('-f, --format <format>',\n\t\t\t    'if output file name extension is specified, this option is ignored (file type is determined from output extension, possible export formats are pdf, png, jpg, svg, and xml)',\n\t\t\t    validFormatRegExp, 'pdf')\n\t\t\t.option('-q, --quality <quality>',\n\t\t\t\t'output image quality for JPEG (default: 90)', parseInt)\n\t\t\t.option('-t, --transparent',\n\t\t\t\t'set transparent background for PNG')\n\t\t\t.option('-e, --embed-diagram',\n\t\t\t\t'includes a copy of the diagram (for PNG, SVG and PDF formats only)')\n\t\t\t.option('--embed-svg-images',\n\t\t\t\t'Embed Images in SVG file (for SVG format only)')\n\t\t\t.option('--embed-svg-fonts <true/false>',\n\t\t\t\t'Embed Fonts in SVG file (for SVG format only). Default is true', function(x){return x === 'true'}, true)\n\t\t\t.option('-b, --border <border>',\n\t\t\t\t'sets the border width around the diagram (default: 0)', parseInt)\n\t\t\t.option('-s, --scale <scale>',\n\t\t\t\t'scales the diagram size', parseFloat)\n\t\t\t.option('--width <width>',\n\t\t\t\t'fits the generated image/pdf into the specified width, preserves aspect ratio.', parseInt)\n\t\t\t.option('--height <height>',\n\t\t\t\t'fits the generated image/pdf into the specified height, preserves aspect ratio.', parseInt)\n\t\t\t.option('--crop',\n\t\t\t\t'crops PDF to diagram size')\n\t\t\t.option('-a, --all-pages',\n\t\t\t\t'export all pages (for PDF format only)')\n\t\t\t.option('-p, --page-index <pageIndex>',\n\t\t\t\t'selects a specific page (1-based); if not specified and the format is an image, the first page is selected', (i) => parseInt(i) - 1)\n\t\t\t.option('-l, --layers <comma separated layer indexes>',\n\t\t\t\t'selects which layers to export (applies to all pages), if not specified, all layers are selected')\n\t\t\t.option('-g, --page-range <from>..<to>',\n\t\t\t\t'selects a page range (1-based, for PDF format only)', argsRange)\n\t\t\t.option('-u, --uncompressed',\n\t\t\t\t'Uncompressed XML output (for XML format only)')\n\t\t\t.option('-z, --zoom <zoom>',\n\t\t\t\t'scales the application interface', parseFloat)\n\t\t\t.option('--svg-theme <theme>',\n\t\t\t\t'Theme of the exported SVG image (dark, light, auto [default])', themeRegExp, 'auto')\n\t\t\t.option('--svg-links-target <target>',\n\t\t\t\t'Target of links in the exported SVG image (auto [default], new-win, same-win)', linkTargetRegExp, 'auto')\n\t\t\t.option('--enable-plugins',\n\t\t\t\t'Enable Plugins')\n\t        .parse(argv)\n\t}\n\tcatch(e)\n\t{\n\t\t//On parse error, return [exit and commander will show the error message]\n\t\treturn;\n\t}\n\t\n\tvar options = program.opts();\n\tenablePlugins = options.enablePlugins;\n\n\tif (options.zoom != null)\n\t{\n\t\tappZoom = options.zoom;\n\t}\n\n    //Start export mode?\n    if (options.export)\n\t{\n    \tvar dummyWin = new BrowserWindow({\n\t\t\tshow : false,\n\t\t\twebPreferences: {\n\t\t\t\tpreload: `${__dirname}/electron-preload.js`,\n\t\t\t\tcontextIsolation: true,\n\t\t\t\tdisableBlinkFeatures: 'Auxclick' // Is this needed?\n\t\t\t}\n\t\t});\n    \t\n    \twindowsRegistry.push(dummyWin);\n    \t\n\t\t/*ipcMain.on('log', function(event, msg)\n\t\t{\n\t\t\tconsole.log(msg);\n\t\t});*/\n\t\n    \ttry\n    \t{\n\t    \t//Prepare arguments and confirm it's valid\n\t    \tvar format = null;\n\t    \tvar outType = null;\n\t    \t\n\t    \t//Format & Output\n\t    \tif (options.output)\n\t\t\t{\n\t    \t\ttry\n\t    \t\t{\n\t    \t\t\tvar outStat = fs.statSync(options.output);\n\t    \t\t\t\n\t    \t\t\tif (outStat.isDirectory())\n\t\t\t\t\t{\n\t    \t\t\t\toutType = {isDir: true};\n\t\t\t\t\t}\n\t    \t\t\telse //If we can get file stat, then it exists\n\t\t\t\t\t{\n\t    \t\t\t\tthrow 'Error: Output file already exists';\n\t\t\t\t\t}\n\t    \t\t}\n\t    \t\tcatch(e) //on error, file doesn't exist and it is not a dir\n\t    \t\t{\n\t    \t\t\toutType = {isFile: true};\n\t    \t\t\t\n\t    \t\t\tformat = path.extname(options.output).substr(1);\n\t\t\t\t\t\n\t\t\t\t\tif (!validFormatRegExp.test(format))\n\t\t\t\t\t{\n\t\t\t\t\t\tformat = null;\n\t\t\t\t\t}\n\t    \t\t}\n\t\t\t}\n\t    \t\n\t    \tif (format == null)\n\t\t\t{\n\t    \t\tformat = options.format;\n\t\t\t}\n\t    \t\n\t    \tlet from = null, to = null;\n\t    \t\n\t    \tif (options.pageIndex != null && options.pageIndex >= 0)\n\t\t\t{\n\t    \t\tfrom = options.pageIndex;\n\t\t\t\tto = options.pageIndex;\n\t\t\t\toptions.allPages = false;\n\t\t\t}\n\t    \telse if (options.pageRange && options.pageRange.length == 2)\n\t\t\t{\n\t\t\t\tconst [rangeFrom, rangeTo] = options.pageRange;\n\n\t\t\t\tif (rangeFrom >= 0 && rangeTo >= 0 && rangeFrom <= rangeTo)\n\t\t\t\t{\n\t\t\t\t\tfrom = rangeFrom;\n\t\t\t\t\tto = rangeTo;\n\t\t\t\t\toptions.allPages = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.error('Invalid page range: must be non-negative and from ≤ to');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar expArgs = {\n\t\t\t\tformat: format,\n\t\t\t\tw: options.width > 0 ? options.width : null,\n\t\t\t\th: options.height > 0 ? options.height : null,\n\t\t\t\tbg: options.transparent ? 'none' : '#ffffff',\n\t\t\t\tfrom: from,\n\t\t\t\tto: to,\n\t\t\t\tallPages: format == 'pdf' && options.allPages,\n\t\t\t\tscale: (options.scale || 1),\n\t\t\t\tembedXml: options.embedDiagram? '1' : '0',\n\t\t\t\tembedImages: options.embedSvgImages? '1' : '0',\n\t\t\t\tembedFonts: options.embedSvgFonts? '1' : '0',\n\t\t\t\tjpegQuality: options.quality,\n\t\t\t\tuncompressed: options.uncompressed,\n\t\t\t\ttheme: options.svgTheme,\n\t\t\t\tlinkTarget: options.svgLinksTarget,\n\t\t\t\tcrop: (options.crop && format == 'pdf') ? '1' : '0'\n\t\t\t};\n\n\t\t\toptions.border = options.border > 0 ? options.border : 0;\n\n\t\t\tif (format === 'pdf') \n\t\t\t{\n\t\t\t\texpArgs.pageMargin = options.border;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\texpArgs.border = options.border;\n\t\t\t}\n\n\t\t\tif (options.layers)\n\t\t\t{\n\t\t\t\texpArgs.extras = JSON.stringify({layers: options.layers.split(',')});\n\t\t\t}\n\n\t\t\tvar paths = program.args;\n\t\t\t\n\t\t\t// Remove --no-sandbox arg from the paths\n\t\t\tif (Array.isArray(paths))\n\t\t\t{\n\t\t\t\tpaths = paths.filter(function(path) { return path != null && path != '--no-sandbox'; });\n\t\t\t}\n\n\t\t\t// If a file is passed \n\t\t\tif (paths !== undefined && paths[0] != null)\n\t\t\t{\n\t\t\t\tvar inStat = null;\n\t\t\t\t\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tinStat = fs.statSync(paths[0]);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tthrow 'Error: input file/directory not found';\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar files = [];\n\t\t\t\t\n\t\t\t\tfunction addDirectoryFiles(dir, isRecursive)\n\t\t\t\t{\n\t\t\t\t\tfs.readdirSync(dir).forEach(function(file) \n\t\t\t\t\t{\n\t\t\t\t\t\tvar filePath = path.join(dir, file);\n\t\t\t\t\t\tvar stat = fs.statSync(filePath);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (stat.isFile() && path.basename(filePath).charAt(0) != '.')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfiles.push(filePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (stat.isDirectory() && isRecursive)\n\t\t\t\t\t    {\n\t\t\t\t\t\t\taddDirectoryFiles(filePath, isRecursive)\n\t\t\t\t\t    }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (inStat.isFile())\n\t\t\t\t{\n\t\t\t\t\tfiles.push(paths[0]);\n\t\t\t\t}\n\t\t\t\telse if (inStat.isDirectory())\n\t\t\t\t{\n\t\t\t\t\taddDirectoryFiles(paths[0], options.recursive);\n\t\t\t\t}\n\n\t\t\t\tif (files.length > 0)\n\t\t\t\t{\n\t\t\t\t\tvar fileIndex = 0;\n\t\t\t\t\t\n\t\t\t\t\tfunction processOneFile()\n\t\t\t\t\t{\n\t\t\t\t\t\tvar curFile = files[fileIndex];\n\t\t\t\t\t\t\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar ext = path.extname(curFile);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tlet fileContent = fs.readFileSync(curFile, ext === '.png' || ext === '.vsdx' ? null : 'utf-8');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (ext === '.vsdx')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdummyWin.loadURL(`file://${codeDir}/vsdxImporter.html`);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tconst contents = dummyWin.webContents;\n\n\t\t\t\t\t\t\t\tcontents.on('did-finish-load', function()\n\t\t\t\t\t\t\t    {\n\t\t\t\t\t\t\t\t\tcontents.send('import', fileContent);\n\n\t\t\t\t\t\t\t\t\tipcMain.once('import-success', function(e, xml)\n\t\t\t\t\t\t    \t    {\n\t\t\t\t\t\t\t\t\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\t\t\t\t\t\t\t\t\texpArgs.xml = xml;\n\t\t\t\t\t\t\t\t\t\tstartExport();\n\t\t\t\t\t\t    \t    });\n\t\t\t\t\t\t    \t    \n\t\t\t\t\t\t    \t    ipcMain.once('import-error', function(e)\n\t\t\t\t\t\t    \t    {\n\t\t\t\t\t\t\t\t\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\t\t\t\t\t    \t    \tconsole.error('Error: cannot import VSDX file: ' + curFile);\n\t\t\t\t\t\t    \t    \tnext();\n\t\t\t\t\t\t    \t    });\n\t\t\t\t\t\t\t    });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (ext === '.csv')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\texpArgs.csv = fileContent;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (ext === '.png')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\texpArgs.xmlEncoded = true;\n\t\t\t\t\t\t\t\t\texpArgs.xml = Buffer.from(fileContent).toString('base64');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\texpArgs.xml = fileContent;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tstartExport();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfunction next()\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfileIndex++;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (fileIndex < files.length)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tprocessOneFile();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcmdQPressed = true;\n\t\t\t\t\t\t\t\t\tdummyWin.destroy();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfunction startExport()\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar replied = false;\n\t\t\t\t\t\t\t\tvar mockEvent = {\n\t\t\t\t\t\t\t\t\treply: function(msg, data)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tif (replied) return;\n\t\t\t\t\t\t\t\t\t\treplied = true;\n\n\t\t\t\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tif (msg == 'export-success')\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tif (data == null || data.length == 0)\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.error('Error: Empty export data: ' + curFile);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar outFileName = null;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (outType != null)\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (outType.isDir)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toutFileName = path.join(options.output, path.basename(curFile,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpath.extname(curFile))) + '.' + format;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toutFileName = options.output;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse if (inStat.isFile())\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\toutFileName = path.join(path.dirname(paths[0]), path.basename(paths[0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpath.extname(paths[0]))) + '.' + format;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse //dir\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\toutFileName = path.join(path.dirname(curFile), path.basename(curFile,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpath.extname(curFile))) + '.' + format;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar counter = 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar realFileName = outFileName;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (program.rawArgs.indexOf('-k') > -1 || program.rawArgs.indexOf('--check') > -1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile (fs.existsSync(realFileName))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trealFileName = path.join(path.dirname(outFileName), path.basename(outFileName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpath.extname(outFileName))) + '-' + counter + path.extname(outFileName);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlet fh = fs.openSync(realFileName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfs.constants.O_SYNC | fs.constants.O_CREAT |\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfs.constants.O_WRONLY | fs.constants.O_TRUNC);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfs.writeFileSync(fh, data);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfs.fsyncSync(fh);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfinally\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfs.closeSync(fh);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.log(curFile + ' -> ' + realFileName);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tcatch(e)\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.error('Error writing to file: ' + outFileName);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tconsole.error('Error: ' + (data || 'Export failed') + ': ' + curFile);\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tnext();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tfinally\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tmockEvent.finalize();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t    \t}\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\texportDiagram(mockEvent, expArgs, true);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(e)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconsole.error('Error reading file: ' + curFile);\n\t\t\t\t\t\t\tnext();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tprocessOneFile();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthrow 'Error: input file/directory not found or directory is empty';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow 'Error: An input file must be specified';\n\t\t\t}\n    \t}\n    \tcatch(e)\n    \t{\n    \t\tconsole.error(e);\n    \t\t\n    \t\tcmdQPressed = true;\n\t\t\tdummyWin.destroy();\n    \t}\n    \t\n    \treturn;\n\t}\n    else if (program.rawArgs.indexOf('-h') > -1 || program.rawArgs.indexOf('--help') > -1 || program.rawArgs.indexOf('-V') > -1 || program.rawArgs.indexOf('--version') > -1) //To prevent execution when help/version arg is used\n\t{\n\t\tapp.quit();\n    \treturn;\n\t}\n    \n    //Prevent multiple instances of the application (casuses issues with configuration)\n    const gotTheLock = app.requestSingleInstanceLock()\n\n    if (!gotTheLock) \n    {\n\t\tapp.quit()\n    } \n    else \n    {\n    \tapp.on('second-instance', (event, commandLine, workingDirectory) => {\n\t\t\t// Creating a new window while a save/open dialog is open crashes the app\n\t\t\tif (dialogOpen) return;\n\n    \t\t//Create another window\n    \t\tlet win = createWindow()\n\n\t\t\tlet loadEvtCount = 0;\n\t\t\t\n\t\t\tfunction loadFinished(e)\n\t\t\t{\n\t\t\t\tif (e != null && !validateSender(e.senderFrame)) return null;\n\n\t\t\t\tloadEvtCount++;\n\t\t\t\t\n\t\t\t\tif (loadEvtCount == 2)\n\t\t\t\t{\n\t    \t    \t//Open the file if new app request is from opening a file\n\t    \t    \tvar potFile = commandLine.pop();\n\t    \t    \t\n\t    \t    \tif (fs.existsSync(potFile))\n\t    \t    \t{\n\t    \t    \t\twin.webContents.send('args-obj', {args: [potFile]});\n\t    \t    \t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//Order of these two events is not guaranteed, so wait for them async.\n\t\t\t//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly \n\t    \tipcMain.once('app-load-finished', loadFinished);\n    \t    \n    \t    win.webContents.on('did-finish-load', function()\n    \t    {    \t\t\t\n    \t        win.webContents.zoomFactor = appZoom;\n    \t        win.webContents.setVisualZoomLevelLimits(1, appZoom);\n\t\t\t\tloadFinished();\n    \t    });\n    \t})\n    }\n\n    let win = createWindow()\n    \n\tlet loadEvtCount = 0;\n\t\t\t\n\tfunction loadFinished(e)\n\t{\n\t\tif (e != null && !validateSender(e.senderFrame)) return null;\n\n\t\tloadEvtCount++;\n\t\t\n\t\tif (loadEvtCount == 2)\n\t\t{\n\t\t\t//Sending entire program is not allowed in Electron 9 as it is not native JS object\n\t\t\twin.webContents.send('args-obj', {args: program.args, create: options.create});\n\t\t}\n\t}\n\t\n\t//Order of these two events is not guaranteed, so wait for them async.\n\t//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly \n\tipcMain.once('app-load-finished', loadFinished);\n\n    win.webContents.on('did-finish-load', function()\n    {\n    \tif (firstWinFilePath != null)\n\t\t{\n    \t\tif (program.args != null)\n    \t\t{\n    \t\t\tprogram.args.push(firstWinFilePath);\n    \t\t}\n    \t\telse\n\t\t\t{\n    \t\t\tprogram.args = [firstWinFilePath];\n\t\t\t}\n\t\t}\n    \t\n    \tfirstWinLoaded = true;\n    \t\n        win.webContents.zoomFactor = appZoom;\n        win.webContents.setVisualZoomLevelLimits(1, appZoom);\n\t\tloadFinished();\n    });\n\t\n\tfunction toggleSpellCheck(e)\n\t{\n\t\tif (e != null && !validateSender(e.senderFrame)) return null;\n\n\t\tif (store != null)\n\t\t{\n\t\t\tenableSpellCheck = !enableSpellCheck;\n\t\t\tstore.set('enableSpellCheck', enableSpellCheck);\n\t\t}\n\t};\n\n\tipcMain.on('toggleSpellCheck', toggleSpellCheck);\n\n\tfunction toggleStoreBkp(e)\n\t{\n\t\tif (e != null && !validateSender(e.senderFrame)) return null;\n\n\t\tif (store != null)\n\t\t{\n\t\t\tenableStoreBkp = !enableStoreBkp;\n\t\t\tstore.set('enableStoreBkp', enableStoreBkp);\n\t\t}\n\t};\n\n\tipcMain.on('toggleStoreBkp', toggleStoreBkp);\n\n\tfunction toggleGoogleFonts(e)\n\t{\n\t\tif (e != null && !validateSender(e.senderFrame)) return null;\n\n\t\tif (store != null)\n\t\t{\n\t\t\tisGoogleFontsEnabled = !isGoogleFontsEnabled;\n\t\t\tstore.set('isGoogleFontsEnabled', isGoogleFontsEnabled);\n\t\t}\n\t}\n\n\tipcMain.on('toggleGoogleFonts', toggleGoogleFonts);\n\n\tfunction toggleFullscreen(e)\n\t{\n\t\tif (e != null && !validateSender(e.senderFrame)) return null;\n\n\t\tlet win = BrowserWindow.getFocusedWindow();\n\n\t\tif (win != null)\n\t\t{\n\t\t\twin.setFullScreen(!win.isFullScreen());\n\t\t}\n\t};\n\n\tipcMain.on('toggleFullscreen', toggleFullscreen);\n\n    let updateNoAvailAdded = false;\n    \n\tfunction checkForUpdatesFn(e) \n\t{ \n\t\tif (e != null && e.senderFrame != null && \n\t\t\t!validateSender(e.senderFrame)) return null;\n\n\t\tautoUpdater.checkForUpdates();\n\n\t\tif (store != null)\n\t\t{\n\t\t\tstore.set('dontCheckUpdates', false);\n\t\t}\n\t\t\n\t\tif (!updateNoAvailAdded) \n\t\t{\n\t\t\tupdateNoAvailAdded = true;\n\t\t\tautoUpdater.on('update-not-available', (info) => {\n\t\t\t\tdialog.showMessageBox(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\ttitle: 'No updates found',\n\t\t\t\t\t\tmessage: 'Your application is up-to-date',\n\t\t\t\t\t})\n\t\t\t})\n\t\t}\n\t};\n\n\tvar zoomSteps = [0.25, 0.33, 0.5, 0.67, 0.75, 0.8, 0.9, 1,\n\t\t1.1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4, 5];\n\n\t// Zooms to the next zoom step\n\tfunction zoomInFn()\n\t{\n\t\tvar zoomFactor = win.webContents.zoomFactor;\n\t\tvar newZoomFactor = zoomSteps[zoomSteps.length - 1];\n\n\t\tfor (var i = 0; i < zoomSteps.length; i++)\n\t\t{\n\t\t\tif (zoomSteps[i] - zoomFactor > 0.01)\n\t\t\t{\n\t\t\t\tnewZoomFactor = zoomSteps[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\twin.webContents.zoomFactor = newZoomFactor;\n\t};\n\n\t// Zooms to the previous zoom step\n\tfunction zoomOutFn()\n\t{\n\t\tvar zoomFactor = win.webContents.zoomFactor;\n\t\tvar newZoomFactor = zoomSteps[0];\n\n\t\tfor (var i = zoomSteps.length - 1; i >= 0; i--)\n\t\t{\n\t\t\tif (zoomSteps[i] - zoomFactor < -0.01)\n\t\t\t{\n\t\t\t\tnewZoomFactor = zoomSteps[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\twin.webContents.zoomFactor = newZoomFactor;\n\t};\n\n\t// Resets the zoom factor\n\tfunction resetZoomFn()\n\t{\n\t\twin.webContents.zoomFactor = 1;\n\t};\n\n\tlet checkForUpdates = {\n\t\tlabel: 'Check for updates',\n\t\tclick: checkForUpdatesFn\n\t}\n\n\tlet zoomIn = {\n\t\tlabel: 'Zoom In',\n\t\tclick: zoomInFn\n\t};\n\n\tlet zoomOut = {\n\t\tlabel: 'Zoom Out',\n\t\tclick: zoomOutFn\n\t};\n\n\tlet resetZoom = {\n\t\tlabel: 'Actual Size',\n\t\tclick: resetZoomFn\n\t};\n\n\tipcMain.on('checkForUpdates', checkForUpdatesFn);\n\tipcMain.on('zoomIn', zoomInFn);\n\tipcMain.on('zoomOut', zoomOutFn);\n\tipcMain.on('resetZoom', resetZoomFn);\n\n\tif (isMac)\n\t{\n\t    let template = [{\n\t      label: app.name,\n\t      submenu: [\n\t        {\n\t          label: 'About ' + app.name,\n\t          click() { shell.openExternal('https://www.drawio.com'); }\n\t        },\n\t        {\n\t          label: 'Support',\n\t          click() { shell.openExternal('https://github.com/jgraph/drawio-desktop/issues'); }\n\t\t\t},\n\t\t\tcheckForUpdates,\n\t        { type: 'separator' },\n\t\t\tresetZoom,\n\t\t\tzoomIn,\n\t\t\tzoomOut,\n\t\t\t{ type: 'separator' },\n\t        { role: 'hide' },\n\t        { role: 'hideothers' },\n\t        { role: 'unhide' },\n\t\t\t{ type: 'separator' },\n\t        { role: 'quit' }\n\t      ]\n\t    }, {\n\t      label: 'Edit',\n\t      submenu: [\n\t\t\t{ role: 'undo' },\n\t\t\t{ role: 'redo' },\n\t\t\t{ type: 'separator' },\n\t\t\t{ role: 'cut' },\n\t\t\t{ role: 'copy' },\n\t\t\t{ role: 'paste' },\n\t\t\t{ role: 'pasteAndMatchStyle' },\n\t\t\t{ role: 'selectAll' }\n\t      ]\n\t    }]\n\t    \n\t    if (disableUpdate)\n\t\t{\n\t\t\ttemplate[0].submenu.splice(2, 1);\n\t\t}\n\t\t\n\t\tconst menuBar = menu.buildFromTemplate(template)\n\t\tmenu.setApplicationMenu(menuBar)\n\t}\n\telse //hide  menubar in win/linux\n\t{\n\t\tmenu.setApplicationMenu(null)\n\t}\n\t\n\tautoUpdater.setFeedURL({\n\t\tprovider: 'github',\n\t\trepo: 'drawio-desktop',\n\t\towner: 'jgraph'\n\t})\n\t\n\tif (store == null || (!disableUpdate && !store.get('dontCheckUpdates')))\n\t{\n\t\tautoUpdater.checkForUpdates()\n\t}\n})\n\n//Quit from the dock context menu should quit the application directly\nif (isMac) \n{\n\tapp.on('before-quit', function() {\n\t\tcmdQPressed = true;\n\t});\t\n}\n\n// Quit when all windows are closed.\napp.on('window-all-closed', function ()\n{\n\tif (__DEV__) \n\t{\n\t\tconsole.log('window-all-closed', windowsRegistry.length)\n\t}\n\t\n\t// On OS X it is common for applications and their menu bar\n\t// to stay active until the user quits explicitly with Cmd + Q\n\tif (cmdQPressed || !isMac)\n\t{\n\t\tapp.quit()\n\t}\n})\n\napp.on('activate', function ()\n{\n\tif (__DEV__) \n\t{\n\t\tconsole.log('app on activate', windowsRegistry.length)\n\t}\n\t\n\t// On OS X it's common to re-create a window in the app when the\n\t// dock icon is clicked and there are no other windows open.\n\tif (windowsRegistry.length === 0)\n\t{\n\t\tcreateWindow()\n\t}\n})\n\napp.on('will-finish-launching', function()\n{\n\tapp.on(\"open-file\", function(event, filePath) \n\t{\n\t    event.preventDefault();\n\t\t// Creating a new window while a save/open dialog is open crashes the app\n\t\tif (dialogOpen) return;\n\n\t    if (firstWinLoaded)\n\t    {\n\t\t    let win = createWindow();\n\t\t    \n\t\t\tlet loadEvtCount = 0;\n\t\t\t\n\t\t\tfunction loadFinished(e)\n\t\t\t{\n\t\t\t\tif (e != null && !validateSender(e.senderFrame)) return null;\n\n\t\t\t\tloadEvtCount++;\n\t\t\t\t\n\t\t\t\tif (loadEvtCount == 2)\n\t\t\t\t{\n\t    \t    \twin.webContents.send('args-obj', {args: [filePath]});\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//Order of these two events is not guaranteed, so wait for them async.\n\t\t\t//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly \n\t    \tipcMain.once('app-load-finished', loadFinished);\n    \t    \n\t\t    win.webContents.on('did-finish-load', function()\n\t\t    {\n\t\t        win.webContents.zoomFactor = appZoom;\n\t\t        win.webContents.setVisualZoomLevelLimits(1, appZoom);\n\t\t\t\tloadFinished();\n\t\t    });\n\t    }\n\t    else\n\t\t{\n\t    \tfirstWinFilePath = filePath\n\t\t}\n\t});\n});\n \napp.on('web-contents-created', (event, contents) => {\n\t// Disable navigation\n\tcontents.on('will-navigate', (event, navigationUrl) => {\n\t\tevent.preventDefault()\n\t})\n\n\t// Limit creation of new windows (we also override window.open)\n\tcontents.setWindowOpenHandler(({ url }) => {\n\t\t// We allow external absolute URLs to be open externally (check openExternal for details) and also empty windows (url -> about:blank)\n\t\tif (url.startsWith('about:blank'))\n\t\t{\n\t\t\treturn {\n\t\t\t\taction: 'allow',\n\t\t\t\toverrideBrowserWindowOptions: {\n\t\t\t\t\tfullscreenable: false,\n\t\t\t\t\twebPreferences: {\n\t\t\t\t\t\tcontextIsolation: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} \n\t\telse if (!openExternal(url))\n\t\t{\n\t\t\treturn {action: 'deny'}\n\t\t}\n\t})\n\n\t// Disable all webviews\n\tcontents.on('will-attach-webview', (event, webPreferences, params) => {\n\t\tevent.preventDefault()\n\t})\n})\n\nautoUpdater.on('error', e => log.error('@error@\\n', e))\n\nautoUpdater.on('update-available', (a, b) =>\n{\n\tif (silentUpdate) return;\n\n\tdialog.showMessageBox(\n\t{\n\t\ttype: 'question',\n\t\tbuttons: ['Ok', 'Cancel', 'Don\\'t Ask Again'],\n\t\ttitle: 'Confirm draw.io Update',\n\t\tmessage: 'draw.io update available.\\n\\nWould you like to download and install new version?',\n\t\tdetail: 'Application will automatically restart to apply update after download',\n\t}).then( result =>\n\t{\n\t\tif (result.response === 0)\n\t\t{\n\t\t\tautoUpdater.downloadUpdate()\n\t\t\t\n\t\t\tvar progressBar = new ProgressBar({\n\t\t\t\ttitle: 'draw.io Update',\n\t\t\t    text: 'Downloading draw.io update...'\n\t\t\t});\n\t\t\t\n\t\t\tfunction reportUpdateError(e)\n\t\t\t{\n\t\t\t\tprogressBar.detail = 'Error occurred while fetching updates. ' + (e && e.message? e.message : e)\n\t\t\t\tprogressBar._window.setClosable(true);\n\t\t\t}\n\n\t\t\tautoUpdater.on('error', e => {\n\t\t\t\tif (progressBar._window != null)\n\t\t\t\t{\n\t\t\t\t\treportUpdateError(e);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tprogressBar.on('ready', function() {\n\t\t\t\t\t\treportUpdateError(e);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tvar firstTimeProg = true;\n\t\t\t\n\t\t\tautoUpdater.on('download-progress', (d) => {\n\t\t\t\t//On mac, download-progress event is not called, so the indeterminate progress will continue until download is finished\n\t\t\t\tvar percent = d.percent;\n\t\t\t\t\n\t\t\t\tif (percent)\n\t\t\t\t{\n\t\t\t\t\tpercent = Math.round(percent * 100)/100;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (firstTimeProg)\n\t\t\t\t{\n\t\t\t\t\tfirstTimeProg = false;\n\t\t\t\t\tprogressBar.close();\n\n\t\t\t\t\tprogressBar = new ProgressBar({\n\t\t\t\t\t\tindeterminate: false,\n\t\t\t\t\t\ttitle: 'draw.io Update',\n\t\t\t\t\t\ttext: 'Downloading draw.io update...',\n\t\t\t\t\t\tdetail: `${percent}% ...`,\n\t\t\t\t\t\tinitialValue: percent\n\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\tprogressBar\n\t\t\t\t\t\t\t.on('completed', function() {\n\t\t\t\t\t\t\t\tprogressBar.detail = 'Download completed.';\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.on('aborted', function(value) {\n\t\t\t\t\t\t\t\tif (__DEV__)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tlog.error(`progress aborted... ${value}`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.on('progress', function(value) {\n\t\t\t\t\t\t\t\tprogressBar.detail = `${value}% ...`;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.on('ready', function() {\n\t\t\t\t\t\t\t\t//InitialValue doesn't set the UI! so this is needed to render it correctly\n\t\t\t\t\t\t\t\tprogressBar.value = percent;\n\t\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tprogressBar.value = percent;\n\t\t\t\t}\n\t\t\t});\n\n\t\t    autoUpdater.on('update-downloaded', (info) => {\n\t\t\t\tif (!progressBar.isCompleted())\n\t\t\t\t{\n\t\t\t\t\tprogressBar.close()\n\t\t\t\t}\n\t\t\n\t\t\t\t// Ask user to update the app\n\t\t\t\tdialog.showMessageBox(\n\t\t\t\t{\n\t\t\t\t\ttype: 'question',\n\t\t\t\t\tbuttons: ['Install', 'Later'],\n\t\t\t\t\tdefaultId: 0,\n\t\t\t\t\tmessage: 'A new version of ' + app.name + ' has been downloaded',\n\t\t\t\t\tdetail: 'It will be installed the next time you restart the application',\n\t\t\t\t}).then(result =>\n\t\t\t\t{\n\t\t\t\t\tif (result.response === 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tsetTimeout(() => autoUpdater.quitAndInstall(), 1)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t    });\n\t\t}\n\t\telse if (result.response === 2 && store != null)\n\t\t{\n\t\t\t//save in settings don't check for updates\n\t\t\tstore.set('dontCheckUpdates', true)\n\t\t}\n\t})\n})\n\n//Pdf export\nconst MICRON_TO_PIXEL = 264.58 \t\t//264.58 micron = 1 pixel\nconst PIXELS_PER_INCH = 100.117\t\t// Usually it is 100 pixels per inch but this give better results\nconst PNG_CHUNK_IDAT = 1229209940;\nconst LARGE_IMAGE_AREA = 30000000;\n\n//NOTE: Key length must not be longer than 79 bytes (not checked)\nfunction writePngWithText(origBuff, key, text, compressed, base64encoded)\n{\n\tvar isDpi = key == 'dpi';\n\tvar inOffset = 0;\n\tvar outOffset = 0;\n\tvar data = text;\n\tvar dataLen = isDpi? 9 : key.length + data.length + 1; //we add 1 zeros with non-compressed data, for pHYs it's 2 of 4-byte-int + 1 byte\n\t\n\t//prepare compressed data to get its size\n\tif (compressed)\n\t{\n\t\tdata = zlib.deflateRawSync(encodeURIComponent(text));\n\t\tdataLen = key.length + data.length + 2; //we add 2 zeros with compressed data\n\t}\n\t\n\tvar outBuff = Buffer.allocUnsafe(origBuff.length + dataLen + 4); //4 is the header size \"zTXt\", \"tEXt\" or \"pHYs\"\n\t\n\ttry\n\t{\n\t\tvar magic1 = origBuff.readUInt32BE(inOffset);\n\t\tinOffset += 4;\n\t\tvar magic2 = origBuff.readUInt32BE(inOffset);\n\t\tinOffset += 4;\n\t\t\n\t\tif (magic1 != 0x89504e47 && magic2 != 0x0d0a1a0a)\n\t\t{\n\t\t\tthrow new Error(\"PNGImageDecoder0\");\n\t\t}\n\t\t\n\t\toutBuff.writeUInt32BE(magic1, outOffset);\n\t\toutOffset += 4;\n\t\toutBuff.writeUInt32BE(magic2, outOffset);\n\t\toutOffset += 4;\n\t}\n\tcatch (e)\n\t{\n\t\tlog.error(e.message, {stack: e.stack});\n\t\tthrow new Error(\"PNGImageDecoder1\");\n\t}\n\n\ttry\n\t{\n\t\twhile (inOffset < origBuff.length)\n\t\t{\n\t\t\tvar length = origBuff.readInt32BE(inOffset);\n\t\t\tinOffset += 4;\n\t\t\tvar type = origBuff.readInt32BE(inOffset)\n\t\t\tinOffset += 4;\n\n\t\t\tif (type == PNG_CHUNK_IDAT)\n\t\t\t{\n\t\t\t\t// Insert zTXt chunk before IDAT chunk\n\t\t\t\toutBuff.writeInt32BE(dataLen, outOffset);\n\t\t\t\toutOffset += 4;\n\t\t\t\t\n\t\t\t\tvar typeSignature = isDpi? 'pHYs' : (compressed ? \"zTXt\" : \"tEXt\");\n\t\t\t\toutBuff.write(typeSignature, outOffset);\n\t\t\t\t\n\t\t\t\toutOffset += 4;\n\n\t\t\t\tif (isDpi)\n\t\t\t\t{\n\t\t\t\t\tvar dpm = Math.round(parseInt(text) / 0.0254) || 3937; //One inch is equal to exactly 0.0254 meters. 3937 is 100dpi\n\n\t\t\t\t\toutBuff.writeInt32BE(dpm, outOffset);\n\t\t\t\t\toutBuff.writeInt32BE(dpm, outOffset + 4);\n\t\t\t\t\toutBuff.writeInt8(1, outOffset + 8);\n\t\t\t\t\toutOffset += 9;\n\n\t\t\t\t\tdata = Buffer.allocUnsafe(9);\n\t\t\t\t\tdata.writeInt32BE(dpm, 0);\n\t\t\t\t\tdata.writeInt32BE(dpm, 4);\n\t\t\t\t\tdata.writeInt8(1, 8);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toutBuff.write(key, outOffset);\n\t\t\t\t\toutOffset += key.length;\n\t\t\t\t\toutBuff.writeInt8(0, outOffset);\n\t\t\t\t\toutOffset ++;\n\n\t\t\t\t\tif (compressed)\n\t\t\t\t\t{\n\t\t\t\t\t\toutBuff.writeInt8(0, outOffset);\n\t\t\t\t\t\toutOffset ++;\n\t\t\t\t\t\tdata.copy(outBuff, outOffset);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\toutBuff.write(data, outOffset);\t\n\t\t\t\t\t}\n\n\t\t\t\t\toutOffset += data.length;\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tvar crcVal = 0xffffffff;\n\t\t\t\tcrcVal = crc.crcjam(typeSignature, crcVal);\n\t\t\t\tcrcVal = crc.crcjam(data, crcVal);\n\n\t\t\t\t// CRC\n\t\t\t\toutBuff.writeInt32BE(crcVal ^ 0xffffffff, outOffset);\n\t\t\t\toutOffset += 4;\n\n\t\t\t\t// Writes the IDAT chunk after the zTXt\n\t\t\t\toutBuff.writeInt32BE(length, outOffset);\n\t\t\t\toutOffset += 4;\n\t\t\t\toutBuff.writeInt32BE(type, outOffset);\n\t\t\t\toutOffset += 4;\n\n\t\t\t\torigBuff.copy(outBuff, outOffset, inOffset);\n\n\t\t\t\t// Encodes the buffer using base64 if requested\n\t\t\t\treturn base64encoded? outBuff.toString('base64') : outBuff;\n\t\t\t}\n\n\t\t\toutBuff.writeInt32BE(length, outOffset);\n\t\t\toutOffset += 4;\n\t\t\toutBuff.writeInt32BE(type, outOffset);\n\t\t\toutOffset += 4;\n\n\t\t\torigBuff.copy(outBuff, outOffset, inOffset, inOffset + length + 4);// +4 to move past the crc\n\t\t\t\n\t\t\tinOffset += length + 4;\n\t\t\toutOffset += length + 4;\n\t\t}\n\t}\n\tcatch (e)\n\t{\n\t\tlog.error(e.message, {stack: e.stack});\n\t\tthrow e;\n\t}\n}\n\nasync function mergePdfs(pdfFiles, xml)\n{\n\tif (pdfFiles.length == 1)\n\t{\n\t\t// Converts to PDF 1.7 with compression\n\t\tconst pdfDoc = await PDFDocument.load(pdfFiles[0]);\n\t\tpdfDoc.setCreator('diagrams.net');\n\n\t\t// KNOWN: Attachments produce smaller files but break\n\t\t// internal links in pdf-lib so using Subject for now\n\t\tif (xml != null)\n\t\t{\n\t\t\tpdfDoc.setSubject(encodeURIComponent(xml).\n\t\t\t\treplace(/\\(/g, \"\\\\(\").replace(/\\)/g, \"\\\\)\"));\n\t\t}\n\n\t\tconst pdfBytes = await pdfDoc.save();\n\t\t\n\t\treturn Buffer.from(pdfBytes);\n\t}\n\n\ttry \n\t{\n\t\tconst pdfDoc = await PDFDocument.create();\n\t\tpdfDoc.setCreator('diagrams.net');\n\n\t\tif (xml != null)\n\t\t{\t\n\t\t\t//Embed diagram XML as file attachment\n\t\t\tawait pdfDoc.attach(Buffer.from(xml).toString('base64'), 'diagram.xml', {\n\t\t\t\tmimeType: 'application/vnd.jgraph.mxfile',\n\t\t\t\tdescription: 'Diagram Content'\n\t\t\t  });\n\t\t}\n\n\t\tfor (var i = 0; i < pdfFiles.length; i++)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconst pdfFile = await PDFDocument.load(pdfFiles[i].buffer);\n\t\t\t\tconst pages = await pdfDoc.copyPages(pdfFile, pdfFile.getPageIndices());\n\t\t\t\tpages.forEach(p => pdfDoc.addPage(p));\n\t\t\t}\n\t\t\tcatch (innerError)\n\t\t\t{\n\t\t\t\tlog.error(`Failed to load PDF part ${i}:`, innerError);\n\t\t\t\tthrow new Error(`Failed to process page ${i+1}. The file may be corrupt.`);\n\t\t\t}\n\t\t}\n\n\t\tconst pdfBytes = await pdfDoc.save();\n        return Buffer.from(pdfBytes);\n    }\n\tcatch(e)\n\t{\n        throw new Error('Error during PDF combination: ' + e.message);\n    }\n}\n\n//TODO Use canvas to export images if math is not used to speedup export (no capturePage). Requires change to export3.html also\nfunction exportDiagram(event, args, directFinalize)\n{\n\tif (event != null && event.senderFrame != null &&\n\t\t!validateSender(event.senderFrame)) return null;\n\n\tvar browser = null;\n\t\n\ttry\n\t{\n\t\tbrowser = new BrowserWindow({\n\t\t\twebPreferences: {\n\t\t\t\tpreload: `${__dirname}/electron-preload.js`,\n\t\t\t\tbackgroundThrottling: false,\n\t\t\t\tcontextIsolation: true,\n\t\t\t\tdisableBlinkFeatures: 'Auxclick', // Is this needed?\n\t\t\t\toffscreen: true,\n\t\t\t},\n\t\t\tshow : false,\n\t\t\tframe: false,\n\t\t\tenableLargerThanScreen: true,\n\t\t\ttransparent: args.format == 'png' && (args.bg == null || args.bg == 'none'),\n\t\t\tparent: windowsRegistry[0] //set parent to first opened window. Not very accurate, but useful when all visible windows are closed\n\t\t});\n\n\t\tbrowser.loadURL(`file://${codeDir}/export3.html`);\n\n\t\tconst contents = browser.webContents;\n\t\tvar from = args.from;\n\t\tvar to = args.to;\n\t\tvar pdfs = [];\n\t\t\t\n\t\tcontents.on('did-finish-load', function()\n\t    {\n\t\t\t//Set finalize here since it is call in the reply below\n\t\t\tfunction finalize()\n\t\t\t{\n\t\t\t\tbrowser.destroy();\n\t\t\t};\n\t\t\t\n\t\t\tif (directFinalize === true)\n\t\t\t{\n\t\t\t\tevent.finalize = finalize;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Destroy the window after response being received by caller\n\t\t\t\tipcMain.once('export-finalize', finalize);\n\t\t\t}\n\n\t\t\tfunction renderingFinishHandler(e, renderInfo)\n\t\t\t{\n\t\t\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\t\t\tif (renderInfo == null)\n\t\t\t\t{\n\t\t\t\t\tevent.reply('export-error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar pageCount = renderInfo.pageCount, bounds = null;\n\t\t\t\t//For some reason, Electron 9 doesn't send this object as is without stringifying. Usually when variable is external to function own scope\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tbounds = JSON.parse(renderInfo.bounds);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tbounds = null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar pdfOptions = {};\n\t\t\t\tvar hasError = false;\n\t\t\t\t\n\t\t\t\tif (bounds == null || bounds.width < 5 || bounds.height < 5) //very small page size never return from printToPDF\n\t\t\t\t{\n\t\t\t\t\t//A workaround to detect errors in the input file or being empty file\n\t\t\t\t\thasError = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpdfOptions = {\n\t\t\t\t\t\tpreferCSSPageSize: true,\n\t\t\t\t\t\tprintBackground: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar base64encoded = args.base64 == '1';\n\t\t\t\t\n\t\t\t\tif (hasError)\n\t\t\t\t{\n\t\t\t\t\tevent.reply('export-error');\n\t\t\t\t}\n\t\t\t\telse if (args.format == 'png' || args.format == 'jpg' || args.format == 'jpeg')\n\t\t\t\t{\n\t\t\t\t\t//Adds an extra pixel to prevent scrollbars from showing\n\t\t\t\t\tvar newBounds = {width: Math.ceil(bounds.width + bounds.x) + 1, height: Math.ceil(bounds.height + bounds.y) + 1};\n\t\t\t\t\tbrowser.setBounds(newBounds);\n\t\t\t\t\t\n\t\t\t\t\t//TODO The browser takes sometime to show the graph (also after resize it takes some time to render)\n\t\t\t\t\t//\t \t1 sec is most probably enough (for small images, 5 for large ones) BUT not a stable solution\n\t\t\t\t\tsetTimeout(function()\n\t\t\t\t\t{\n\t\t\t\t\t\tbrowser.capturePage().then(function(img)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//Image is double the given bounds, so resize is needed!\n\t\t\t\t\t\t\tvar tScale = 1;\n\n\t\t\t\t\t\t\t//If user defined width and/or height, enforce it precisely here. Height override width\n\t\t\t\t\t\t\tif (args.h)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttScale = args.h / newBounds.height;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (args.w)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttScale = args.w / newBounds.width;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tnewBounds.width *= tScale;\n\t\t\t\t\t\t\tnewBounds.height *= tScale;\n\t\t\t\t\t\t\timg = img.resize(newBounds);\n\n\t\t\t\t\t\t\tvar data = args.format == 'png'? img.toPNG() : img.toJPEG(args.jpegQuality || 90);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (args.dpi != null && args.format == 'png')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdata = writePngWithText(data, 'dpi', args.dpi);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (args.embedXml == \"1\" && args.format == 'png')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdata = writePngWithText(data, \"mxGraphModel\", args.xml, true,\n\t\t\t\t\t\t\t\t\t\tbase64encoded);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (base64encoded)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdata = data.toString('base64');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tevent.reply('export-success', data);\n\t\t\t\t\t\t});\n\t\t\t\t\t}, bounds.width * bounds.height < LARGE_IMAGE_AREA? 1000 : 5000);\n\t\t\t\t}\n\t\t\t\telse if (args.format == 'pdf')\n\t\t\t\t{\n\t\t\t\t\tif (args.print)\n\t\t\t\t\t{\n\t\t\t\t\t\tpdfOptions = {\n\t\t\t\t\t\t\tscaleFactor: args.pageScale,\n\t\t\t\t\t\t\tprintBackground: true,\n\t\t\t\t\t\t\tpageSize : {\n\t\t\t\t\t\t\t\twidth: args.pageWidth * MICRON_TO_PIXEL,\n\t\t\t\t\t\t\t\t//This height adjustment fixes the output. TODO Test more cases\n\t\t\t\t\t\t\t\theight: (args.pageHeight * 1.025) * MICRON_TO_PIXEL\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmargins: {\n\t\t\t\t\t\t\t\tmarginType: 'none' // no margin\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tcontents.print(pdfOptions, (success, errorType) => \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//Consider all as success\n\t\t\t\t\t\t\tevent.reply('export-success', {});\n\t\t\t\t\t\t\t// Notify the user with an error if it fails\n\t\t\t\t\t\t\tif (!success && errorType != 'Print job canceled')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdialog.showMessageBox(null, {\n\t\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t\t\ttitle: 'Printing Error',\n\t\t\t\t\t\t\t\t\tmessage: 'There was an error printing. ' + errorType\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcontents.printToPDF(pdfOptions).then(async (data) => \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpdfs.push(data);\n\t\t\t\t\t\t\tto = to > pageCount? pageCount : to;\n\t\t\t\t\t\t\tfrom++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (from < to)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\targs.from = from;\n\t\t\t\t\t\t\t\targs.to = from;\n\t\t\t\t\t\t\t\tipcMain.once('render-finished', renderingFinishHandler);\n\t\t\t\t\t\t\t\tcontents.send('render', args);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// TODO extract the correct xml if the source was a pnd file\n\t\t\t\t\t\t\t\tdata = await mergePdfs(pdfs, args.embedXml == '1' ? args.xml : null);\n\t\t\t\t\t\t\t\tevent.reply('export-success', data);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tevent.reply('export-error', error);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (args.format == 'svg')\n\t\t\t\t{\n\t\t\t\t\tcontents.send('get-svg-data');\n\t\t\t\t\t\n\t\t\t\t\tipcMain.once('svg-data', (e, data) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\t\t\t\t\tevent.reply('export-success', data);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tevent.reply('export-error', 'Error: Unsupported format');\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\tipcMain.once('render-finished', renderingFinishHandler);\n\n\t\t\tif (args.format == 'xml')\n\t\t\t{\n\t\t\t\tipcMain.once('xml-data', (e, data) =>\n\t\t\t\t{\n\t\t\t\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\t\t\t\tevent.reply('export-success', data);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tipcMain.once('xml-data-error', (e) =>\n\t\t\t\t{\n\t\t\t\t\tif (!validateSender(e.senderFrame)) return null;\n\n\t\t\t\t\tevent.reply('export-error');\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\targs.border = args.border || 0;\n\t\t\targs.scale = args.scale || 1;\n\t\t\t\n\t\t\tif (args.filename != null && args.filename != '')\n\t\t\t{\n\t\t\t\tvar filename = decodeURIComponent(args.filename);\n\n\t\t\t\tif (filename.substring(filename.length - 4) == '.pdf')\n\t\t\t\t{\n\t\t\t\t\tfilename = filename.substring(0, filename.length - 4);\n\t\t\t\t}\n\n\t\t\t\tif (filename.substring(filename.length - 7) == '.drawio')\n\t\t\t\t{\n\t\t\t\t\tfilename = filename.substring(0, filename.length - 7);\n\t\t\t\t}\n\n\t\t\t\targs.fileTitle = filename;\n\t\t\t}\n\t\t\t\n\t\t\tcontents.send('render', args);\n\t    });\n\t}\n\tcatch (e)\n\t{\n\t\tif (browser != null)\n\t\t{\n\t\t\tbrowser.destroy();\n\t\t}\n\n\t\tevent.reply('export-error', e);\n\t\tconsole.log('export-error', e);\n\t}\n};\n\nipcMain.on('export', exportDiagram);\n\n//================================================================\n// Renderer Helper functions\n//================================================================\n\nconst { O_SYNC, O_CREAT, O_WRONLY, O_TRUNC, O_RDONLY } = fs.constants;\nconst DRAFT_PREFEX = '.$';\nconst OLD_DRAFT_PREFEX = '~$';\nconst DRAFT_EXT = '.dtmp';\nconst BKP_PREFEX = '.$';\nconst OLD_BKP_PREFEX = '~$';\nconst BKP_EXT = '.bkp';\n\n/**\n * Checks the file content type\n * Confirm content is xml, json, pdf, png, jpg, svg, vsdx ...\n */\nfunction checkFileContent(body, enc)\n{\n\tif (body != null)\n\t{\n\t\tlet head, headBinay;\n\t\t\n\t\tif (typeof body === 'string')\n\t\t{\n\t\t\tif (enc === 'base64')\n\t\t\t{\n\t\t\t\theadBinay = Buffer.from(body.substring(0, 22), 'base64');\n\t\t\t\thead = headBinay.toString();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thead = body.substring(0, 16);\n\t\t\t\theadBinay = Buffer.from(head);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\thead = new TextDecoder(\"utf-8\").decode(body.subarray(0, 16));\n\t\t\theadBinay = body;\n\t\t}\n\t\t\n\t\tlet c1 = head[0],\n\t\tc2 = head[1],\n\t\tc3 = head[2],\n\t\tc4 = head[3],\n\t\tc5 = head[4],\n\t\tc6 = head[5],\n\t\tc7 = head[6],\n\t\tc8 = head[7],\n\t\tc9 = head[8],\n\t\tc10 = head[9],\n\t\tc11 = head[10],\n\t\tc12 = head[11],\n\t\tc13 = head[12],\n\t\tc14 = head[13],\n\t\tc15 = head[14],\n\t\tc16 = head[15];\n\n\t\tlet cc1 = headBinay[0],\n\t\tcc2 = headBinay[1],\n\t\tcc3 = headBinay[2],\n\t\tcc4 = headBinay[3],\n\t\tcc5 = headBinay[4],\n\t\tcc6 = headBinay[5],\n\t\tcc7 = headBinay[6],\n\t\tcc8 = headBinay[7],\n\t\tcc9 = headBinay[8],\n\t\tcc10 = headBinay[9],\n\t\tcc11 = headBinay[10],\n\t\tcc12 = headBinay[11],\n\t\tcc13 = headBinay[12],\n\t\tcc14 = headBinay[13],\n\t\tcc15 = headBinay[14],\n\t\tcc16 = headBinay[15];\n\n\t\tif (c1 == '<')\n\t\t{\n\t\t\t// text/html\n\t\t\tif (c2 == '!'\n\t\t\t\t\t|| ((c2 == 'h'\n\t\t\t\t\t\t\t&& (c3 == 't' && c4 == 'm' && c5 == 'l'\n\t\t\t\t\t\t\t\t\t|| c3 == 'e' && c4 == 'a' && c5 == 'd')\n\t\t\t\t\t\t\t|| (c2 == 'b' && c3 == 'o' && c4 == 'd'\n\t\t\t\t\t\t\t\t\t&& c5 == 'y')))\n\t\t\t\t\t|| ((c2 == 'H'\n\t\t\t\t\t\t\t&& (c3 == 'T' && c4 == 'M' && c5 == 'L'\n\t\t\t\t\t\t\t\t\t|| c3 == 'E' && c4 == 'A' && c5 == 'D')\n\t\t\t\t\t\t\t|| (c2 == 'B' && c3 == 'O' && c4 == 'D'\n\t\t\t\t\t\t\t\t\t&& c5 == 'Y'))))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// application/xml\n\t\t\tif (c2 == '?' && c3 == 'x' && c4 == 'm' && c5 == 'l'\n\t\t\t\t\t&& c6 == ' ')\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\t// application/svg+xml\n\t\t\tif (c2 == 's' && c3 == 'v' && c4 == 'g' && c5 == ' ')\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Embed cases img and iframe\n\t\t\tif (c2 == 'i' && c3 == 'm' && c4 == 'g' && c5 == ' '\n\t\t\t\t\t|| (c2 == 'i' && c3 == 'f' && c4 == 'r' && c5 == 'a'\n\t\t\t\t\t\t\t&& c6 == 'm' && c7 == 'e' && c8 == ' '))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// big and little (identical) endian UTF-8 encodings, with BOM\n\t\t// application/xml\n\t\tif (cc1 == 0xef && cc2 == 0xbb && cc3 == 0xbf)\n\t\t{\n\t\t\tif (c4 == '<' && c5 == '?' && c6 == 'x')\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// big and little endian UTF-16 encodings, with byte order mark\n\t\t// application/xml\n\t\tif (cc1 == 0xfe && cc2 == 0xff)\n\t\t{\n\t\t\tif (cc3 == 0 && c4 == '<' && cc5 == 0 && c6 == '?' && cc7 == 0\n\t\t\t\t\t&& c8 == 'x')\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// application/xml\n\t\tif (cc1 == 0xff && cc2 == 0xfe)\n\t\t{\n\t\t\tif (c3 == '<' && cc4 == 0 && c5 == '?' && cc6 == 0 && c7 == 'x'\n\t\t\t\t\t&& cc8 == 0)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// big and little endian UTF-32 encodings, with BOM\n\t\t// application/xml\n\t\tif (cc1 == 0x00 && cc2 == 0x00 && cc3 == 0xfe && cc4 == 0xff)\n\t\t{\n\t\t\tif (cc5 == 0 && cc6 == 0 && cc7 == 0 && c8 == '<' && cc9 == 0\n\t\t\t\t\t&& cc10 == 0 && cc11 == 0 && c12 == '?' && cc13 == 0\n\t\t\t\t\t&& cc14 == 0 && cc15 == 0 && c16 == 'x')\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// application/xml\n\t\tif (cc1 == 0xff && cc2 == 0xfe && cc3 == 0x00 && cc4 == 0x00)\n\t\t{\n\t\t\tif (c5 == '<' && cc6 == 0 && cc7 == 0 && cc8 == 0 && c9 == '?'\n\t\t\t\t\t&& cc10 == 0 && cc11 == 0 && cc12 == 0 && c13 == 'x'\n\t\t\t\t\t&& cc14 == 0 && cc15 == 0 && cc16 == 0)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// application/pdf (%PDF-)\n\t\tif (cc1 == 37 && cc2 == 80 && cc3 == 68 && cc4 == 70 && cc5 == 45)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// image/png\n\t\tif ((cc1 == 137 && cc2 == 80 && cc3 == 78 && cc4 == 71 && cc5 == 13\n\t\t\t\t&& cc6 == 10 && cc7 == 26 && cc8 == 10) ||\n\t\t\t(cc1 == 194 && cc2 == 137 && cc3 == 80 && cc4 == 78 && cc5 == 71 && cc6 == 13 //Our embedded PNG+XML\n\t\t\t\t&& cc7 == 10 && cc8 == 26 && cc9 == 10))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// image/jpeg\n\t\tif (cc1 == 0xFF && cc2 == 0xD8 && cc3 == 0xFF)\n\t\t{\n\t\t\tif (cc4 == 0xE0 || cc4 == 0xEE)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * File format used by digital cameras to store images.\n\t\t\t * Exif Format can be read by any application supporting\n\t\t\t * JPEG. Exif Spec can be found at:\n\t\t\t * http://www.pima.net/standards/it10/PIMA15740/Exif_2-1.PDF\n\t\t\t */\n\t\t\tif ((cc4 == 0xE1) && (c7 == 'E' && c8 == 'x' && c9 == 'i'\n\t\t\t\t\t&& c10 == 'f' && cc11 == 0))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// image/webp\n\t\tif (cc1 == 0x52 && cc2 == 0x49 && cc3 == 0x46 && cc4 == 0x46)\t//RIFF\n\t\t{\n\t\t\tif (cc9 == 0x57 && cc10 == 0x45 && cc11 == 0x42 && cc12 == 0x50) //WEBP\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// vsdx, vssx (also zip, jar, odt, ods, odp, docx, xlsx, pptx, apk, aar)\n\t\tif (cc1 == 0x50 && cc2 == 0x4B && cc3 == 0x03 && cc4 == 0x04)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse if (cc1 == 0x50 && cc2 == 0x4B && cc3 == 0x03 && cc4 == 0x06)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// json\n\t\tif (c1 == '{' || c1 == '[')\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t// mxfile, mxlibrary, mxGraphModel\n\t\tif (c1 == '<' && c2 == 'm' && c3 == 'x')\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nfunction isConflict(origStat, stat)\n{\n\treturn stat != null && origStat != null && stat.mtimeMs != origStat.mtimeMs;\n};\n\nfunction getDraftFileName(fileObject)\n{\n\tlet filePath = fileObject.path;\n\tlet draftFileName = '', counter = 1, uniquePart = '';\n\n\tdo\n\t{\n\t\tdraftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);\n\t\tuniquePart = '_' + counter++;\n\t} while (fs.existsSync(draftFileName));\n\n\treturn draftFileName;\n};\n\nasync function getFileDrafts(fileObject)\n{\n\tlet filePath = fileObject.path;\n\tlet draftsPaths = [], drafts = [], draftFileName, counter = 1, uniquePart = '';\n\n\tdo\n\t{\n\t\tdraftsPaths.push(draftFileName);\n\t\tdraftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);\n\t\tuniquePart = '_' + counter++;\n\t} while (fs.existsSync(draftFileName)); //TODO this assume continuous drafts names\n\n\t//Port old draft files to new prefex\n\tcounter = 1;\n\tuniquePart = '';\n\tlet draftExists = false;\n\n\tdo\n\t{\n\t\tdraftFileName = path.join(path.dirname(filePath), OLD_DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);\n\t\tdraftExists = fs.existsSync(draftFileName);\n\t\t\n\t\tif (draftExists)\n\t\t{\n\t\t\tconst newDraftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);\n\t\t\tawait fsProm.rename(draftFileName, newDraftFileName);\n\t\t\tdraftsPaths.push(newDraftFileName);\n\t\t}\n\n\t\tuniquePart = '_' + counter++;\n\t} while (draftExists); //TODO this assume continuous drafts names\n\n\t//Skip the first null element\n\tfor (let i = 1; i < draftsPaths.length; i++)\n\t{\n\t\ttry\n\t\t{\n\t\t\tlet stat = await fsProm.lstat(draftsPaths[i]);\n\t\t\tdrafts.push({data: await fsProm.readFile(draftsPaths[i], 'utf8'), \n\t\t\t\t\t\tcreated: stat.ctimeMs,\n\t\t\t\t\t\tmodified: stat.mtimeMs,\n\t\t\t\t\t\tpath: draftsPaths[i]});\n\t\t}\n\t\tcatch (e){} // Ignore\n\t}\n\n\treturn drafts;\n};\n\nasync function saveDraft(fileObject, data)\n{\n\tvar draftFileName = fileObject.draftFileName || getDraftFileName(fileObject);\n\n\tif (!checkFileContent(data) || path.resolve(draftFileName).startsWith(appBaseDir))\n\t{\n\t\tthrow new Error('Invalid file data');\n\t}\n\telse\n\t{\n\t\tlet draftFh;\n\n\t\ttry\n\t\t{\n\t\t\tdraftFh = await fsProm.open(draftFileName, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);\n\t\t\tawait fsProm.writeFile(draftFh, data, 'utf8');\n\t\t\tawait draftFh.sync(); // Flush to disk\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tawait draftFh?.close();\n\t\t}\n\n\t\tif (isWin)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// Add Hidden attribute:\n\t\t\t\tvar child = spawn('attrib', ['+h', draftFileName]);\n    \t\t\tchild.on('error', function(err) \n\t\t\t\t{\n\t\t\t\t\tconsole.log('hiding draft file error: ' + err);\n    \t\t\t});\n\t\t\t} catch(e) {}\n\t\t}\n\n\t\treturn draftFileName;\n\t}\n}\n\nasync function saveFile(fileObject, data, origStat, overwrite, defEnc)\n{\n\tif (!checkFileContent(data) || path.resolve(fileObject.path).startsWith(appBaseDir))\n\t{\n\t\tthrow new Error('Invalid file data');\n\t}\n\n\tvar retryCount = 0;\n\tvar backupCreated = false;\n\tvar bkpPath = path.join(path.dirname(fileObject.path), BKP_PREFEX + path.basename(fileObject.path) + BKP_EXT);\n\tconst oldBkpPath = path.join(path.dirname(fileObject.path), OLD_BKP_PREFEX + path.basename(fileObject.path) + BKP_EXT);\n\tvar writeEnc = defEnc || fileObject.encoding;\n\n\tvar writeFile = async function()\n\t{\n\t\tlet fh;\n\n\t\ttry\n\t\t{\n\t\t\t// O_SYNC is for sync I/O and reduce risk of file corruption\n\t\t\tfh = await fsProm.open(fileObject.path, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);\n\t\t\tawait fsProm.writeFile(fh, data, writeEnc);\n\t\t\tawait fh.sync(); // Flush to disk\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tawait fh?.close();\n\t\t}\n\n\t\tlet stat2 = await fsProm.stat(fileObject.path);\n\t\t// Workaround for possible writing errors is to check the written\n\t\t// contents of the file and retry 3 times before showing an error\n\t\tlet writtenData = await fsProm.readFile(fileObject.path, writeEnc);\n\t\t\n\t\tif (data != writtenData)\n\t\t{\n\t\t\tretryCount++;\n\t\t\t\n\t\t\tif (retryCount < 3)\n\t\t\t{\n\t\t\t\treturn await writeFile();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new Error('all saving trials failed');\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//We'll keep the backup file in case the original file is corrupted. TODO When should we delete the backup file?\n\t\t\tif (backupCreated)\n\t\t\t{\n\t\t\t\t//fs.unlink(bkpPath, (err) => {}); //Ignore errors!\n\n\t\t\t\t//Delete old backup file with old prefix\n\t\t\t\tif (fs.existsSync(oldBkpPath))\n\t\t\t\t{\n\t\t\t\t\tfs.unlink(oldBkpPath, (err) => {}); //Ignore errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stat2;\n\t\t}\n\t};\n\t\n\tasync function doSaveFile(isNew)\n\t{\n\t\tif (enableStoreBkp && !isNew)\n\t\t{\n\t\t\t//Copy file to backup file (after conflict and stat is checked)\n\t\t\tlet bkpFh;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\t//Use file read then write to open the backup file direct sync write to reduce the chance of file corruption\n\t\t\t\tlet fileContent = await fsProm.readFile(fileObject.path, writeEnc);\n\t\t\t\tbkpFh = await fsProm.open(bkpPath, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);\n\t\t\t\tawait fsProm.writeFile(bkpFh, fileContent, writeEnc);\n\t\t\t\tawait bkpFh.sync(); // Flush to disk\n\t\t\t\tbackupCreated = true;\n\t\t\t}\n\t\t\tcatch (e) \n\t\t\t{\n\t\t\t\tif (__DEV__)\n\t\t\t\t{\n\t\t\t\t\tconsole.log('Backup file writing failed', e); //Ignore\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally \n\t\t\t{\n\t\t\t\tawait bkpFh?.close();\n\n\t\t\t\tif (isWin)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\t// Add Hidden attribute:\n\t\t\t\t\t\tvar child = spawn('attrib', ['+h', bkpPath]);\n\t\t\t\t\t\tchild.on('error', function(err) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconsole.log('hiding backup file error: ' + err);\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch(e) {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn await writeFile();\n\t};\n\t\n\tif (overwrite)\n\t{\n\t\treturn await doSaveFile(true);\n\t}\n\telse\n\t{\n\t\tlet stat = fs.existsSync(fileObject.path)?\n\t\t\t\t\tawait fsProm.stat(fileObject.path) : null;\n\n\t\tif (stat && isConflict(origStat, stat))\n\t\t{\n\t\t\tthrow new Error('conflict');\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn await doSaveFile(stat == null);\n\t\t}\n\t}\n};\n\nasync function writeFile(filePath, data, enc)\n{\n\tif (!checkFileContent(data, enc) || path.resolve(filePath).startsWith(appBaseDir))\n\t{\n\t\tthrow new Error('Invalid file data');\n\t}\n\telse\n\t{\n\t\tlet fh;\n\n\t\ttry\n\t\t{\n\t\t\t// O_SYNC is for sync I/O and reduce risk of file corruption\n\t\t\tfh = await fsProm.open(filePath, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);\n\t\t\tawait fsProm.writeFile(fh, data, enc);\n\t\t\tawait fh.sync(); // Flush to disk\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tawait fh?.close();\n\t\t}\n\t}\n};\n\nfunction getAppDataFolder()\n{\n\ttry\n\t{\n\t\tvar appDataDir = app.getPath('appData');\n\t\tvar drawioDir = appDataDir + '/draw.io';\n\t\t\n\t\tif (!fs.existsSync(drawioDir)) //Usually this dir already exists\n\t\t{\n\t\t\tfs.mkdirSync(drawioDir);\n\t\t}\n\t\t\n\t\treturn drawioDir;\n\t}\n\tcatch(e) {}\n\t\n\treturn '.';\n};\n\nfunction getDocumentsFolder()\n{\n\t//On windows, misconfigured Documents folder cause an exception\n\ttry\n\t{\n\t\treturn app.getPath('documents');\n\t}\n\tcatch(e) {}\n\t\n\treturn '.';\n};\n\nfunction checkFileExists(pathParts)\n{\n\tlet filePath = path.join(...pathParts);\n\treturn {exists: fs.existsSync(filePath), path: filePath};\n};\n\nasync function showOpenDialog(defaultPath, filters, properties)\n{\n\tlet win = BrowserWindow.getFocusedWindow();\n\n\treturn dialog.showOpenDialog(win, {\n\t\tdefaultPath: defaultPath,\n\t\tfilters: filters,\n\t\tproperties: properties\n\t});\n};\n\nasync function showSaveDialog(defaultPath, filters)\n{\n\tlet win = BrowserWindow.getFocusedWindow();\n\n\treturn dialog.showSaveDialog(win, {\n\t\tdefaultPath: defaultPath,\n\t\tfilters: filters\n\t});\n};\n\nasync function installPlugin(filePath)\n{\n\tif (!enablePlugins) return {};\n\n\tvar pluginsDir = path.join(getAppDataFolder(), '/plugins');\n\t\n\tif (!fs.existsSync(pluginsDir))\n\t{\n\t\tfs.mkdirSync(pluginsDir);\n\t}\n\t\n\tvar pluginName = path.basename(filePath);\n\tvar dstFile = path.join(pluginsDir, pluginName);\n\t\n\tif (fs.existsSync(dstFile))\n\t{\n\t\tthrow new Error('fileExists');\n\t}\n\telse\n\t{\n\t\tawait fsProm.copyFile(filePath, dstFile);\n\t}\n\n\treturn {pluginName: pluginName, selDir: path.dirname(filePath)};\n}\n\nfunction getPluginFile(plugin)\n{\n\tif (!enablePlugins) return null;\n\t\n\tconst prefix = path.join(getAppDataFolder(), '/plugins/');\n\tconst pluginFile = path.join(prefix, plugin);\n\t        \t\n\tif (pluginFile.startsWith(prefix) && fs.existsSync(pluginFile))\n\t{\n\t\treturn pluginFile;\n\t}\n\n\treturn null;\n}\n\nfunction uninstallPlugin(plugin)\n{\n\tconst pluginFile = getPluginFile(plugin);\n\t        \t\n\tif (pluginFile != null)\n\t{\n\t\tfs.unlinkSync(pluginFile);\n\t}\n}\n\nfunction dirname(path_p)\n{\n\treturn path.dirname(path_p);\n}\n\nasync function readFile(filename, encoding)\n{\n\tlet data = await fsProm.readFile(filename, encoding);\n\n\tif (checkFileContent(data, encoding) && !path.resolve(filename).startsWith(appBaseDir))\n\t{\n\t\treturn data;\n\t}\n\n\tthrow new Error('Invalid file data');\n}\n\nasync function fileStat(file)\n{\n\treturn await fsProm.stat(file);\n}\n\nasync function isFileWritable(file)\n{\n\ttry \n\t{\n\t\tawait fsProm.access(file, fs.constants.W_OK);\n\t\treturn true;\n\t}\n\tcatch (e)\n\t{\n\t\treturn false;\n\t}\n}\n\nfunction clipboardAction(method, data)\n{\n\tif (method == 'writeText')\n\t{\n\t\tclipboard.writeText(data);\n\t}\n\telse if (method == 'readText')\n\t{\n\t\treturn clipboard.readText();\n\t}\n\telse if (method == 'writeImage')\n\t{\n\t\tclipboard.write({image: \n\t\t\tnativeImage.createFromDataURL(data.dataUrl), html: '<img src=\"' +\n\t\t\tdata.dataUrl + '\" width=\"' + data.w + '\" height=\"' + data.h + '\">'});\n\t}\n}\n\nasync function deleteFile(file) \n{\n\t// Reading the header of the file to confirm it is a file we can delete\n\tlet fh = await fsProm.open(file, O_RDONLY);\n\tlet buffer = Buffer.allocUnsafe(16);\n\tawait fh.read(buffer, 0, 16);\n\tawait fh.close();\n\n\tif (checkFileContent(buffer) && !path.resolve(file).startsWith(appBaseDir))\n\t{\n\t\tawait fsProm.unlink(file);\n\t}\n}\n\nfunction windowAction(method)\n{\n\tlet win = BrowserWindow.getFocusedWindow();\n\n\tif (win)\n\t{\n\t\tif (method == 'minimize')\n\t\t{\n\t\t\twin.minimize();\n\t\t}\n\t\telse if (method == 'maximize')\n\t\t{\n\t\t\twin.maximize();\n\t\t}\n\t\telse if (method == 'unmaximize')\n\t\t{\n\t\t\twin.unmaximize();\n\t\t}\n\t\telse if (method == 'close')\n\t\t{\n\t\t\twin.close();\n\t\t}\n\t\telse if (method == 'isMaximized')\n\t\t{\n\t\t\treturn win.isMaximized();\n\t\t}\n\t\telse if (method == 'removeAllListeners')\n\t\t{\n\t\t\twin.removeAllListeners();\n\t\t}\n\t}\n}\n\nconst allowedUrls = /^(?:https?|mailto|tel|callto):/i;\n\nfunction openExternal(url)\n{\n\t//Only open http(s), mailto, tel, and callto links\n\tif (allowedUrls.test(url))\n\t{\n\t\tshell.openExternal(url);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction watchFile(filePath)\n{\n\tlet win = BrowserWindow.getFocusedWindow();\n\n\tif (win)\n\t{\n\t\tfs.watchFile(filePath, (curr, prev) => {\n\t\t\ttry\n\t\t\t{\n\t\t\t\twin.webContents.send('fileChanged', {\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tcurr: curr,\n\t\t\t\t\tprev: prev\n\t\t\t\t});\n\t\t\t}\n\t\t\tcatch (e) {} // Ignore\n\t\t});\n\t}\n}\n\nfunction unwatchFile(filePath)\n{\n\tfs.unwatchFile(filePath);\n}\n\nipcMain.on(\"rendererReq\", async (event, args) => \n{\n\tif (!validateSender(event.senderFrame)) return null;\n\n\ttry\n\t{\n\t\tlet ret = null;\n\n\t\tswitch(args.action)\n\t\t{\n\t\tcase 'saveFile':\n\t\t\tret = await saveFile(args.fileObject, args.data, args.origStat, args.overwrite, args.defEnc);\n\t\t\tbreak;\n\t\tcase 'writeFile':\n\t\t\tret = await writeFile(args.path, args.data, args.enc);\n\t\t\tbreak;\n\t\tcase 'saveDraft':\n\t\t\tret = await saveDraft(args.fileObject, args.data);\n\t\t\tbreak;\n\t\tcase 'getFileDrafts':\n\t\t\tret = await getFileDrafts(args.fileObject);\n\t\t\tbreak;\n\t\tcase 'getDocumentsFolder':\n\t\t\tret = await getDocumentsFolder();\n\t\t\tbreak;\n\t\tcase 'checkFileExists':\n\t\t\tret = await checkFileExists(args.pathParts);\n\t\t\tbreak;\n\t\tcase 'showOpenDialog':\n\t\t\tdialogOpen = true;\n\t\t\tret = await showOpenDialog(args.defaultPath, args.filters, args.properties);\n\t\t\tret = ret.filePaths;\n\t\t\tdialogOpen = false;\n\t\t\tbreak;\n\t\tcase 'showSaveDialog':\n\t\t\tdialogOpen = true;\n\t\t\tret = await showSaveDialog(args.defaultPath, args.filters);\n\t\t\tret = ret.canceled? null : ret.filePath;\n\t\t\tdialogOpen = false;\n\t\t\tbreak;\n\t\tcase 'installPlugin':\n\t\t\tret = await installPlugin(args.filePath);\n\t\t\tbreak;\n\t\tcase 'uninstallPlugin':\n\t\t\tret = await uninstallPlugin(args.plugin);\n\t\t\tbreak;\n\t\tcase 'getPluginFile':\n\t\t\tret = await getPluginFile(args.plugin);\n\t\t\tbreak;\n\t\tcase 'isPluginsEnabled':\n\t\t\tret = enablePlugins;\n\t\t\tbreak;\n\t\tcase 'dirname':\n\t\t\tret = await dirname(args.path);\n\t\t\tbreak;\n\t\tcase 'readFile':\n\t\t\tret = await readFile(args.filename, args.encoding);\n\t\t\tbreak;\n\t\tcase 'clipboardAction':\n\t\t\tret = await clipboardAction(args.method, args.data);\n\t\t\tbreak;\n\t\tcase 'deleteFile':\n\t\t\tret = await deleteFile(args.file);\n\t\t\tbreak;\n\t\tcase 'fileStat':\n\t\t\tret = await fileStat(args.file);\n\t\t\tbreak;\n\t\tcase 'isFileWritable':\n\t\t\tret = await isFileWritable(args.file);\n\t\t\tbreak;\n\t\tcase 'windowAction':\n\t\t\tret = await windowAction(args.method);\n\t\t\tbreak;\n\t\tcase 'openExternal':\n\t\t\tret = await openExternal(args.url);\n\t\t\tbreak;\n\t\tcase 'watchFile':\n\t\t\tret = await watchFile(args.path);\n\t\t\tbreak;\n\t\tcase 'unwatchFile':\t\n\t\t\tret = await unwatchFile(args.path);\n\t\t\tbreak;\n\t\tcase 'exit':\n\t\t\tapp.quit();\n\t\t\tbreak;\n\t\tcase 'isFullscreen':\n\t\t\tret = BrowserWindow.getFocusedWindow().isFullScreen();\n\t\t\tbreak;\n\t\t};\n\n\t\tevent.reply('mainResp', {success: true, data: ret, reqId: args.reqId});\n\t}\n\tcatch (e)\n\t{\n\t\tevent.reply('mainResp', {error: true, msg: e.message, e: e, reqId: args.reqId});\n\t}\n});"
  },
  {
    "path": "sync.cjs",
    "content": "const fs = require('fs')\nconst path = require('path')\n\nconst appjsonpath = path.join(__dirname, 'package.json')\nconst disableUpdatePath = path.join(__dirname, 'src/main', 'disableUpdate.js')\nconst versionPath = path.join(__dirname, 'drawio', 'VERSION')\n\nif (!fs.existsSync(versionPath))\n{\n\tconsole.error('Error: drawio/VERSION not found. Did you clone with --recursive or run git submodule update --init?')\n\tprocess.exit(1)\n}\n\nlet ver = fs.readFileSync(versionPath, 'utf8').trim()\n//let ver = '14.1.5' // just to test autoupdate\n\nif (!/^\\d+\\.\\d+\\.\\d+$/.test(ver))\n{\n\tconsole.error('Error: drawio/VERSION contains invalid version: \"' + ver + '\"')\n\tprocess.exit(1)\n}\n\nlet pj = require(appjsonpath)\n\npj.version = ver\n\nfs.writeFileSync(appjsonpath, JSON.stringify(pj, null, 2), 'utf8')\n//Enable/disable updates\nfs.writeFileSync(disableUpdatePath, 'export function disableUpdate() { return ' + (process.argv[2] == 'disableUpdate'? 'true' : 'false') + ';}', 'utf8');\n"
  }
]